ZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL0NPUFlJTkcgYi9leHBhdC0yLjAuMS9DT1BZSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYjQ1MDYKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9DT1BZSU5HCkBAIC0wLDAgKzEsMjIgQEAKK0NvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCBUaGFpIE9wZW4gU291cmNlIFNvZnR3YXJlIENlbnRlciBMdGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgQ2xhcmsgQ29vcGVyCitDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgRXhwYXQgbWFpbnRhaW5lcnMuCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCit3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCitkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KK3Blcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwordGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAoraW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKK1RPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCitTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL0NoYW5nZXMgYi9leHBhdC0yLjAuMS9DaGFuZ2VzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlODg1YWIKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9DaGFuZ2VzCkBAIC0wLDAgKzEsMTY5IEBACitSZWxlYXNlIDIuMC4xIFR1ZSBKdW5lIDUgMjAwNworICAgICAgICAtIEZpeGVkIGJ1Z3MgIzE1MTUyNjYsIDE1MTU2MDA6IFRoZSBjaGFyYWN0ZXIgZGF0YSBoYW5kbGVyJ3MgY2FsbGluZworICAgICAgICAgIG9mIFhNTF9TdG9wUGFyc2VyKCkgd2FzIG5vdCBoYW5kbGVkIHByb3Blcmx5OyBpZiB0aGUgcGFyc2VyIHdhcworICAgICAgICAgIHN0b3BwZWQgYW5kIHRoZSBoYW5kbGVyIHNldCB0byBOVUxMLCB0aGUgcGFyc2VyIHdvdWxkIHNlZ2ZhdWx0LgorICAgICAgICAtIEZpeGVkIGJ1ZyAjMTY5MDg4MzogRXhwYXQgZmFpbGVkIG9uIEVCQ0RJQyBzeXN0ZW1zIGFzIGl0IGFzc3VtZWQKKyAgICAgICAgICBzb21lIGNoYXJhY3RlciBjb25zdGFudHMgdG8gYmUgQVNDSUkgZW5jb2RlZC4KKyAgICAgICAgLSBNaW5vciBjbGVhbnVwcyBvZiB0aGUgdGVzdCBoYXJuZXNzLgorICAgICAgICAtIEZpeGVkIHhtbHdmIGJ1ZyAjMTUxMzU2NjogIm91dCBvZiBtZW1vcnkiIGVycm9yIG9uIGZpbGUgc2l6ZSB6ZXJvLgorICAgICAgICAtIEZpeGVkIG91dGxpbmUuYyBidWcgIzE1NDMyMzM6IG1pc3NpbmcgYSBmaW5hbCBYTUxfUGFyc2VyRnJlZSgpIGNhbGwuCisgICAgICAgIC0gRml4ZXMgYW5kIGltcHJvdmVtZW50cyBmb3IgV2luZG93cyBwbGF0Zm9ybToKKyAgICAgICAgICBidWdzICMxNDA5NDUxLCAjMTQ3NjE2MCwgMTU0ODE4MiwgMTYwMjc2OSwgMTcxNzMyMi4KKyAgICAgICAgLSBCdWlsZCBmaXhlcyBmb3IgdmFyaW91cyBwbGF0Zm9ybXM6CisgICAgICAgICAgSFAtVVgsIFRydTY0LCBTb2xhcmlzIDk6IHBhdGNoICMxNDM3ODQwLCBidWcgIzExOTYxODAuCisgICAgICAgICAgQWxsIFVuaXg6ICMxNTU0NjE4IChyZWZyZXNoZWQgY29uZmlnLnN1Yi9jb25maWcuZ3Vlc3MpLgorICAgICAgICAgICAgICAgICAgICAjMTQ5MDM3MSwgIzE2MTM0NTc6IHN1cHBvcnQgYm90aCwgREVTVERJUiBhbmQgSU5TVEFMTF9ST09ULAorICAgICAgICAgICAgICAgICAgICB3aXRob3V0IHJlbHlpbmcgb24gR05VLU1ha2Ugc3BlY2lmaWMgZmVhdHVyZXMuCisgICAgICAgICAgIzE2NDc4MDU6IFBhdGNoZWQgY29uZmlndXJlLmluIHRvIHdvcmsgYmV0dGVyIHdpdGggSW50ZWwgY29tcGlsZXIuCisgICAgICAgIC0gRml4ZXMgdG8gTWFrZWZpbGUuaW4gdG8gaGF2ZSBtYWtlIGNoZWNrIHdvcmsgY29ycmVjdGx5OgorICAgICAgICAgIGJ1Z3MgIzE0MDgxNDMsICMxNTM1NjAzLCAjMTUzNjY4NC4KKyAgICAgICAgLSBBZGRlZCBPcGVuIFdhdGNvbSBzdXBwb3J0OiBwYXRjaCAjMTUyMzI0Mi4KKworUmVsZWFzZSAyLjAuMCBXZWQgSmFuIDExIDIwMDYKKyAgICAgICAgLSBXZSBubyBsb25nZXIgdXNlIHRoZSAiY2hlY2siIGxpYnJhcnkgZm9yIEMgdW5pdCB0ZXN0aW5nOyB3ZQorICAgICAgICAgIGFsd2F5cyB1c2UgdGhlIChwYXJ0aWFsKSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQVBJLgorICAgICAgICAtIFJlcG9ydCBYTUxfTlMgc2V0dGluZyB2aWEgWE1MX0dldEZlYXR1cmVMaXN0KCkuCisgICAgICAgIC0gRml4ZWQgaGVhZGVycyBmb3IgdXNlIGZyb20gQysrLgorICAgICAgICAtIFhNTF9HZXRDdXJyZW50TGluZU51bWJlcigpIGFuZCAgWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIoKQorICAgICAgICAgIG5vdyByZXR1cm4gdW5zaWduZWQgaW50ZWdlcnMuCisgICAgICAgIC0gQWRkZWQgWE1MX0xBUkdFX1NJWkUgc3dpdGNoIHRvIGVuYWJsZSA2NC1iaXQgaW50ZWdlcnMgZm9yCisgICAgICAgICAgYnl0ZSBpbmRleGVzIGFuZCBsaW5lL2NvbHVtbiBudW1iZXJzLgorICAgICAgICAtIFVwZGF0ZWQgdG8gdXNlIGxpYnRvb2wgMS41LjIyICh0aGUgbW9zdCByZWNlbnQpLgorICAgICAgICAtIEFkZGVkIHN1cHBvcnQgZm9yIEFtaWdhT1MuCisgICAgICAgIC0gU29tZSBtb3N0bHkgbWlub3IgYnVnIGZpeGVzLiBTRiBpc3N1ZXMgaW5jbHVkZTogMTAwNjcwOCwKKyAgICAgICAgICAxMDIxNzc2LCAxMDIzNjQ2LCAxMTE0OTYwLCAxMTU2Mzk4LCAxMjIxMTYwLCAxMjcxNjQyLgorCitSZWxlYXNlIDEuOTUuOCBGcmkgSnVsIDIzIDIwMDQKKyAgICAgICAgLSBNYWpvciBuZXcgZmVhdHVyZTogc3VzcGVuZC9yZXN1bWUuICBIYW5kbGVycyBjYW4gbm93IHJlcXVlc3QKKyAgICAgICAgICB0aGF0IGEgcGFyc2UgYmUgc3VzcGVuZGVkIGZvciBsYXRlciByZXN1bXB0aW9uIG9yIGFib3J0ZWQKKyAgICAgICAgICBhbHRvZ2V0aGVyLiAgU2VlICJUZW1wb3JhcmlseSBTdG9wcGluZyBQYXJzaW5nIiBpbiB0aGUKKyAgICAgICAgICBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuCisgICAgICAgIC0gU29tZSBtb3N0bHkgbWlub3IgYnVnIGZpeGVzLCBidXQgY29tcGlsYXRpb24gc2hvdWxkIG5vCisgICAgICAgICAgbG9uZ2VyIGdlbmVyYXRlIHdhcm5pbmdzIG9uIG1vc3QgcGxhdGZvcm1zLiAgU0YgaXNzdWVzCisgICAgICAgICAgaW5jbHVkZTogODI3MzE5LCA4NDAxNzMsIDg0NjMwOSwgODg4MzI5LCA4OTYxODgsIDkyMzkxMywKKyAgICAgICAgICA5MjgxMTMsIDk2MTY5OCwgOTg1MTkyLgorCitSZWxlYXNlIDEuOTUuNyBNb24gT2N0IDIwIDIwMDMKKyAgICAgICAgLSBGaXhlZCBlbnVtIFhNTF9TdGF0dXMgaXNzdWUgKHJlcG9ydGVkIG9uIFNvdXJjZUZvcmdlIG1hbnkKKyAgICAgICAgICB0aW1lcyksIHNvIGNvbXBpbGVycyB0aGF0IGFyZSBwcm9wZXJseSBwaWNreSB3aWxsIGJlIGhhcHB5LgorICAgICAgICAtIEludHJvZHVjZWQgYW4gWE1MQ0FMTCBtYWNybyB0byBjb250cm9sIHRoZSBjYWxsaW5nCisgICAgICAgICAgY29udmVudGlvbiB1c2VkIGJ5IHRoZSBFeHBhdCBBUEk7IHRoaXMgbWFjcm8gc2hvdWxkIGJlIHVzZWQKKyAgICAgICAgICB0byBhbm5vdGF0ZSBwcm90b3R5cGVzIGFuZCBkZWZpbml0aW9ucyBvZiBjYWxsYmFjaworICAgICAgICAgIGltcGxlbWVudGF0aW9ucyBpbiBjb2RlIGNvbXBpbGVkIHdpdGggYSBjYWxsaW5nIGNvbnZlbnRpb24KKyAgICAgICAgICBvdGhlciB0aGFuIHRoZSBkZWZhdWx0IGNvbnZlbnRpb24gZm9yIHRoZSBob3N0IHBsYXRmb3JtLgorICAgICAgICAtIEltcHJvdmVkIGFiaWxpdHkgdG8gYnVpbGQgd2l0aG91dCB0aGUgY29uZmlndXJlLWdlbmVyYXRlZAorICAgICAgICAgIGV4cGF0X2NvbmZpZy5oIGhlYWRlci4gIFRoaXMgaXMgdXNlZnVsIGZvciBhcHBsaWNhdGlvbnMKKyAgICAgICAgICB3aGljaCBlbWJlZCBFeHBhdCByYXRoZXIgdGhhbiBsaW5raW5nIGluIHRoZSBsaWJyYXJ5LgorICAgICAgICAtIEZpeGVkIGEgdmFyaWV0eSBvZiBidWdzOiBzZWUgU0YgaXNzdWVzIDQ1ODkwNywgNjA5NjAzLAorICAgICAgICAgIDY3Njg0NCwgNjc5NzU0LCA2OTI4NzgsIDY5Mjk2NCwgNjk1NDAxLCA2OTkzMjMsIDY5OTQ4NywKKyAgICAgICAgICA4MjA5NDYuCisgICAgICAgIC0gSW1wcm92ZWQgaGFzaCB0YWJsZSBsb29rdXBzLgorICAgICAgICAtIEFkZGVkIG1vcmUgcmVncmVzc2lvbiB0ZXN0cyBhbmQgaW1wcm92ZWQgZG9jdW1lbnRhdGlvbi4KKworUmVsZWFzZSAxLjk1LjYgVHVlIEphbiAyOCAyMDAzCisgICAgICAgIC0gQWRkZWQgWE1MX0ZyZWVDb250ZW50TW9kZWwoKS4KKyAgICAgICAgLSBBZGRlZCBYTUxfTWVtTWFsbG9jKCksIFhNTF9NZW1SZWFsbG9jKCksIFhNTF9NZW1GcmVlKCkuCisgICAgICAgIC0gRml4ZWQgYSB2YXJpZXR5IG9mIGJ1Z3M6IHNlZSBTRiBpc3N1ZXMgNjE1NjA2LCA2MTY4NjMsCisgICAgICAgICAgNjE4MTk5LCA2NTMxODAsIDY3Mzc5MS4KKyAgICAgICAgLSBFbmhhbmNlZCB0aGUgcmVncmVzc2lvbiB0ZXN0IHN1aXRlLgorICAgICAgICAtIE1hbiBwYWdlIGltcHJvdmVtZW50czogaW5jbHVkZXMgU0YgaXNzdWUgNjMyMTQ2LgorCitSZWxlYXNlIDEuOTUuNSBGcmkgU2VwIDYgMjAwMgorICAgICAgICAtIEFkZGVkIFhNTF9Vc2VGb3JlaWduRFREKCkgZm9yIGltcHJvdmVkIFNBWDIgc3VwcG9ydC4KKyAgICAgICAgLSBBZGRlZCBYTUxfR2V0RmVhdHVyZUxpc3QoKS4KKyAgICAgICAgLSBEZWZpbmVkIFhNTF9Cb29sIHR5cGUgYW5kIHRoZSB2YWx1ZXMgWE1MX1RSVUUgYW5kIFhNTF9GQUxTRS4KKyAgICAgICAgLSBVc2UgYW4gaW5jb21wbGV0ZSBzdHJ1Y3QgaW5zdGVhZCBvZiBhIHZvaWQqIGZvciB0aGUgcGFyc2VyCisgICAgICAgICAgKG1heSBub3QgcmV0YWluKS4KKyAgICAgICAgLSBGaXhlZCBVVEYtOCBkZWNvZGluZyBidWcgdGhhdCBjYXVzZWQgbGVnYWwgVVRGLTggdG8gYmUgcmVqZWN0ZWQuCisgICAgICAgIC0gRmluYWxseSBmaXhlZCBidWcgd2hlcmUgZGVmYXVsdCBoYW5kbGVyIHdvdWxkIHJlcG9ydCBEVEQKKyAgICAgICAgICBldmVudHMgdGhhdCB3ZXJlIGFscmVhZHkgaGFuZGxlZCBieSBhbm90aGVyIGhhbmRsZXIuCisgICAgICAgICAgSW5pdGlhbCBwYXRjaCBjb250cmlidXRlZCBieSBEYXJyeWwgTWlsZXMuCisgICAgICAgIC0gUmVtb3ZlZCB1bm5lY2Vzc2FyeSBEbGxNYWluKCkgZnVuY3Rpb24gdGhhdCBjYXVzZWQgc3RhdGljCisgICAgICAgICAgbGlua2luZyBpbnRvIGEgRExMIHRvIGJlIGRpZmZpY3VsdC4KKyAgICAgICAgLSBBZGRlZCBWQysrIHByb2plY3RzIGZvciBidWlsZGluZyBzdGF0aWMgbGlicmFyaWVzLgorICAgICAgICAtIFJlZHVjZWQgbGluZS1sZW5ndGggZm9yIGFsbCBzb3VyY2UgY29kZSBhbmQgaGVhZGVycyB0byBiZQorICAgICAgICAgIG5vIGxvbmdlciB0aGFuIDgwIGNoYXJhY3RlcnMsIHRvIGhlbHAgd2l0aCBBUy80MDAgc3VwcG9ydC4KKyAgICAgICAgLSBSZWR1Y2VkIG1lbW9yeSBjb3B5aW5nIGR1cmluZyBwYXJzaW5nIChTRiBwYXRjaCAjNjAwOTY0KS4KKyAgICAgICAgLSBGaXhlZCBhIHZhcmlldHkgb2YgYnVnczogc2VlIFNGIGlzc3VlcyA1ODA3OTMsIDQzNDY2NCwKKyAgICAgICAgICA0ODM1MTQsIDU4MDUwMywgNTgxMDY5LCA1ODQwNDEsIDU4NDE4MywgNTg0ODMyLCA1ODU1MzcsCisgICAgICAgICAgNTk2NTU1LCA1OTY2NzgsIDU5ODM1MiwgNTk4OTQ0LCA1OTk3MTUsIDYwMDQ3OSwgNjAwOTcxLgorCitSZWxlYXNlIDEuOTUuNCBGcmkgSnVsIDEyIDIwMDIKKyAgICAgICAgLSBBZGRlZCBzdXBwb3J0IGZvciBWTVMsIGNvbnRyaWJ1dGVkIGJ5IENyYWlnIEJlcnJ5LiAgU2VlCisgICAgICAgICAgdm1zL1JFQURNRS52bXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICAgIC0gQWRkZWQgTWFjIE9TIChjbGFzc2ljKSBzdXBwb3J0LCB3aXRoIGEgbWFrZWZpbGUgZm9yIE1QVywKKyAgICAgICAgICBjb250cmlidXRlZCBieSBUaG9tYXMgV2VnbmVyIGFuZCBEYXJ5bGUgV2Fsa2VyLgorICAgICAgICAtIEFkZGVkIEJvcmxhbmQgQysrIEJ1aWxkZXIgNSAvIEJDQyA1LjUgc3VwcG9ydCwgY29udHJpYnV0ZWQKKyAgICAgICAgICBieSBQYXRyaWNrIE1jQ29ubmVsbCAoU0YgcGF0Y2ggIzUzODAzMikuCisgICAgICAgIC0gRml4ZWQgYSB2YXJpZXR5IG9mIGJ1Z3M6IHNlZSBTRiBpc3N1ZXMgNDQxNDQ5LCA1NjMxODQsCisgICAgICAgICAgNTY0MzQyLCA1NjYzMzQsIDU2NjkwMSwgNTY5NDYxLCA1NzAyNjMsIDU3NTE2OCwgNTc5MTk2LgorICAgICAgICAtIE1hZGUgc2tpcHBlZEVudGl0eUhhbmRsZXIgY29uZm9ybSB0byBTQVgyIChzZWUgc291cmNlIGNvbW1lbnQpCisgICAgICAgIC0gUmUtaW1wbGVtZW50ZWQgV0ZDOiBFbnRpdHkgRGVjbGFyZWQgZnJvbSBYTUwgMS4wIHNwZWMgYW5kCisgICAgICAgICAgYWRkZWQgYSBuZXcgZXJyb3IgImVudGl0eSBkZWNsYXJlZCBpbiBwYXJhbWV0ZXIgZW50aXR5IjoKKyAgICAgICAgICBzZWUgU0YgYnVnIHJlcG9ydCA1Njk0NjEgYW5kIFNGIHBhdGNoIDU3ODE2MQorICAgICAgICAtIFJlLWltcGxlbWVudGVkIHNlY3Rpb24gNS4xIGZyb20gWE1MIDEuMCBzcGVjOgorICAgICAgICAgIHNlZSBTRiBidWcgcmVwb3J0IDU3MDI2MyBhbmQgU0YgcGF0Y2ggNTc4MTYxCisKK1JlbGVhc2UgMS45NS4zIE1vbiBKdW4gMyAyMDAyCisgICAgICAgIC0gQWRkZWQgYSBwcm9qZWN0IHRvIHRoZSBNU1ZDIHdvcmtzcGFjZSB0byBjcmVhdGUgYSB3Y2hhcl90CisgICAgICAgICAgdmVyc2lvbiBvZiB0aGUgbGlicmFyeTsgdGhlIERMTHMgYXJlIG5hbWVkIGxpYmV4cGF0dy5kbGwuCisgICAgICAgIC0gQ2hhbmdlZCB0aGUgbmFtZSBvZiB0aGUgV2luZG93cyBETExzIGZyb20gZXhwYXQuZGxsIHRvCisgICAgICAgICAgbGliZXhwYXQuZGxsOyB0aGlzIGZpeGVzIFNGIGJ1ZyAjNDMyNDU2LgorICAgICAgICAtIEFkZGVkIHRoZSBYTUxfUGFyc2VyUmVzZXQoKSBBUEkgZnVuY3Rpb24uCisgICAgICAgIC0gRml4ZWQgWE1MX1NldFJldHVybk5TVHJpcGxldCgpIHRvIHdvcmsgZm9yIGVsZW1lbnQgbmFtZXMuCisgICAgICAgIC0gTWFkZSB0aGUgWE1MX1VOSUNPREUgYnVpbGRzIHVzYWJsZSAodGhhbmtzLCBLYXJsISkuCisgICAgICAgIC0gQWxsb3cgeG1sd2YgdG8gcmVhZCBmcm9tIHN0YW5kYXJkIGlucHV0LgorICAgICAgICAtIEluc3RhbGwgYSBtYW4gcGFnZSBmb3IgeG1sd2Ygb24gVW5peCBzeXN0ZW1zLgorICAgICAgICAtIEZpeGVkIG1hbnkgYnVnczsgc2VlIFNGIGJ1ZyByZXBvcnRzIDIzMTg2NCwgNDYxMzgwLCA0NjQ4MzcsCisgICAgICAgICAgNDY2ODg1LCA0NjkyMjYsIDQ3NzY2NywgNDg0NDE5LCA0ODc4NDAsIDQ5NDc0OSwgNDk2NTA1LAorICAgICAgICAgIDU0NzM1MC4gIE90aGVyIGJ1Z3Mgd2hpY2ggd2UgY2FuJ3QgdGVzdCBhcyBlYXNpbHkgbWF5IGFsc28KKyAgICAgICAgICBoYXZlIGJlZW4gZml4ZWQsIGVzcGVjaWFsbHkgaW4gdGhlIGFyZWEgb2YgYnVpbGQgc3VwcG9ydC4KKworUmVsZWFzZSAxLjk1LjIgRnJpIEp1bCAyNyAyMDAxCisgICAgICAgIC0gTW9yZSBjaGFuZ2VzIHRvIG1ha2UgTVNWQyBoYXBweSB3aXRoIHRoZSBidWlsZDsgYWRkIGEgc2luZ2xlCisgICAgICAgICAgd29ya3NwYWNlIHRvIHN1cHBvcnQgYm90aCB0aGUgbGlicmFyeSBhbmQgeG1sd2YgYXBwbGljYXRpb24uCisgICAgICAgIC0gQWRkZWQgYSBXaW5kb3dzIGluc3RhbGxlciBmb3IgV2luZG93cyB1c2VyczsgaW5jbHVkZXMKKyAgICAgICAgICB4bWx3Zi5leGUuCisgICAgICAgIC0gQWRkZWQgY29tcGlsZS10aW1lIGNvbnN0YW50cyB0aGF0IGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUKKyAgICAgICAgICBFeHBhdCB2ZXJzaW9uCisgICAgICAgIC0gUmVtb3ZlZCBhIGxvdCBvZiBHTlUtc3BlY2lmaWMgZGVwZW5kZW5jaWVzIHRvIGFpZGUgcG9ydGFiaWxpdHkKKyAgICAgICAgICBhbW9uZyB0aGUgdmFyaW91cyBVbml4IGZsYXZvcnMuCisgICAgICAgIC0gRml4IHRoZSBVVEYtOCBCT00gYnVnLgorICAgICAgICAtIENsZWFuZWQgdXAgd2FybmluZyBtZXNzYWdlcyBmb3Igc2V2ZXJhbCBjb21waWxlcnMuCisgICAgICAgIC0gQWRkZWQgdGhlIC1XYWxsLCAtV3N0cmljdC1wcm90b3R5cGVzIG9wdGlvbnMgZm9yIEdDQy4KKworUmVsZWFzZSAxLjk1LjEgU3VuIE9jdCAyMiAxNToxMTozNiBFRFQgMjAwMAorICAgICAgICAtIENoYW5nZXMgdG8gZ2V0IGV4cGF0IHRvIGJ1aWxkIHVuZGVyIE1pY3Jvc29mdCBjb21waWxlcgorICAgICAgICAtIFJlbW92ZWQgYWxsIGFib3J0cyBhbmQgaW5zdGVhZCByZXR1cm4gYW4gVU5FWFBFQ1RFRF9TVEFURSBlcnJvci4KKyAgICAgICAgLSBGaXhlZCBhIGJ1ZyB3aGVyZSBhIHN0cmF5ICclJyBpbiBhbiBlbnRpdHkgdmFsdWUgd291bGQgY2F1c2UgYW4KKyAgICAgICAgICBhYm9ydC4KKyAgICAgICAgLSBEZWZpbmVkIFhNTF9TZXRFbmROYW1lc3BhY2VEZWNsSGFuZGxlci4gVGhhbmtzIHRvIERhcnJ5bCBNaWxlcyBmb3IKKyAgICAgICAgICBmaW5kaW5nIHRoaXMgb3ZlcnNpZ2h0LgorICAgICAgICAtIENoYW5nZWQgZGVmYXVsdCBwYXR0ZXJucyBpbiBsaWIvTWFrZWZpbGUuaW4gdG8gZml0IG5vbi1HTlUgbWFrZXMKKyAgICAgICAgICBUaGFua3MgdG8gcm9iaW5AdW5yYXRlZC5uZXQgZm9yIHJlcG9ydGluZyBhbmQgcHJvdmlkaW5nIGFuCisgICAgICAgICAgYWNjb3VudCB0byB0ZXN0IG9uLgorICAgICAgICAtIFRoZSByZWZlcmVuY2UgaGFkIHRoZSB3cm9uZyBsYWJlbCBmb3IgWE1MX1NldFN0YXJ0TmFtZXNwYWNlRGVjbC4KKyAgICAgICAgICBSZXBvcnRlZCBieSBhbiBhbm9ueW1vdXMgdXNlci4KKworUmVsZWFzZSAxLjk1LjAgRnJpIFNlcCAyOSAyMDAwCisgICAgICAgIC0gWE1MX1BhcnNlckNyZWF0ZV9NTQorICAgICAgICAgICAgICAgIEFsbG93cyB5b3UgdG8gc2V0IGEgbWVtb3J5IG1hbmFnZW1lbnQgc3VpdGUgdG8gcmVwbGFjZSB0aGUKKyAgICAgICAgICAgICAgICBzdGFuZGFyZCBtYWxsb2MscmVhbGxvYywgYW5kIGZyZWUuCisgICAgICAgIC0gWE1MX1NldFJldHVybk5TVHJpcGxldAorICAgICAgICAgICAgICAgIElmIHlvdSB0dXJuIHRoaXMgZmVhdHVyZSBvbiB3aGVuIG5hbWVzcGFjZSBwcm9jZXNzaW5nIGlzIGluCisgICAgICAgICAgICAgICAgZWZmZWN0LCB0aGVuIHF1YWxpZmllZCwgcHJlZml4ZWQgZWxlbWVudCBhbmQgYXR0cmlidXRlIG5hbWVzCisgICAgICAgICAgICAgICAgYXJlIHJldHVybmVkIGFzICJ1cml8bmFtZXxwcmVmaXgiIHdoZXJlICd8JyBpcyB3aGF0ZXZlcgorICAgICAgICAgICAgICAgIHNlcGFyYXRvciBjaGFyYWN0ZXIgaXMgdXNlZCBpbiBuYW1lc3BhY2UgcHJvY2Vzc2luZy4KKyAgICAgICAgLSBNZXJnZWQgaW4gZmVhdHVyZXMgZnJvbSBwZXJsLWV4cGF0CisgICAgICAgICAgICAgICAgbyBYTUxfU2V0RWxlbWVudERlY2xIYW5kbGVyCisgICAgICAgICAgICAgICAgbyBYTUxfU2V0QXR0bGlzdERlY2xIYW5kbGVyCisgICAgICAgICAgICAgICAgbyBYTUxfU2V0WG1sRGVjbEhhbmRsZXIKKyAgICAgICAgICAgICAgICBvIFhNTF9TZXRFbnRpdHlEZWNsSGFuZGxlcgorICAgICAgICAgICAgICAgIG8gU3RhcnREb2N0eXBlRGVjbEhhbmRsZXIgdGFrZXMgMyBhZGRpdGlvbmFsIHBhcmFtZXRlcnM6CisgICAgICAgICAgICAgICAgICAgICAgICBzeXNpZCwgcHViaWQsIGhhc19pbnRlcm5hbF9zdWJzZXQKKyAgICAgICAgICAgICAgICBvIE1hbnkgcGFpcmVkIGhhbmRsZXIgc2V0dGVycyAobGlrZSBYTUxfU2V0RWxlbWVudEhhbmRsZXIpCisgICAgICAgICAgICAgICAgICBub3cgaGF2ZSBjb3JyZXNwb25kaW5nIGluZGl2aWR1YWwgaGFuZGxlciBzZXR0ZXJzCisgICAgICAgICAgICAgICAgbyBYTUxfR2V0SW5wdXRDb250ZXh0IGZvciBnZXR0aW5nIHRoZSBpbnB1dCBjb250ZXh0IG9mCisgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBwYXJzZSBwb3NpdGlvbi4KKyAgICAgICAgLSBBZGRlZCByZWZlcmVuY2UgbWF0ZXJpYWwKKyAgICAgICAgLSBQYWNrYWdlZCBpbnRvIGEgZGlzdHJpYnV0aW9uIHRoYXQgYnVpbGRzIGEgc2hhcmFibGUgbGlicmFyeQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvTUFOSUZFU1QgYi9leHBhdC0yLjAuMS9NQU5JRkVTVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTgzZDViCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvTUFOSUZFU1QKQEAgLTAsMCArMSwxMjggQEAKK2FtaWdhL3N0ZGxpYi5jCithbWlnYS9sYXVuY2guYworYW1pZ2EvZXhwYXRfdmVjdG9ycy5jCithbWlnYS9leHBhdF9saWIuYworYW1pZ2EvZXhwYXQueG1sCithbWlnYS9SRUFETUUudHh0CithbWlnYS9NYWtlZmlsZQorYW1pZ2EvaW5jbHVkZS9wcm90by9leHBhdC5oCithbWlnYS9pbmNsdWRlL2xpYnJhcmllcy9leHBhdC5oCithbWlnYS9pbmNsdWRlL2ludGVyZmFjZXMvZXhwYXQuaAorYW1pZ2EvaW5jbHVkZS9pbmxpbmU0L2V4cGF0LmgKK2JjYjUvUkVBRE1FLnR4dAorYmNiNS9hbGxfcHJvamVjdHMuYnBnCitiY2I1L2VsZW1lbnRzLmJwZgorYmNiNS9lbGVtZW50cy5icHIKK2JjYjUvZWxlbWVudHMubWFrCitiY2I1L2V4cGF0LmJwZgorYmNiNS9leHBhdC5icHIKK2JjYjUvZXhwYXQubWFrCitiY2I1L2V4cGF0X3N0YXRpYy5icGYKK2JjYjUvZXhwYXRfc3RhdGljLmJwcgorYmNiNS9leHBhdF9zdGF0aWMubWFrCitiY2I1L2V4cGF0dy5icGYKK2JjYjUvZXhwYXR3LmJwcgorYmNiNS9leHBhdHcubWFrCitiY2I1L2V4cGF0d19zdGF0aWMuYnBmCitiY2I1L2V4cGF0d19zdGF0aWMuYnByCitiY2I1L2V4cGF0d19zdGF0aWMubWFrCitiY2I1L2xpYmV4cGF0X210ZC5kZWYKK2JjYjUvbGliZXhwYXR3X210ZC5kZWYKK2JjYjUvbWFrZWZpbGUubWFrCitiY2I1L291dGxpbmUuYnBmCitiY2I1L291dGxpbmUuYnByCitiY2I1L291dGxpbmUubWFrCitiY2I1L3NldHVwLmJhdAorYmNiNS94bWx3Zi5icGYKK2JjYjUveG1sd2YuYnByCitiY2I1L3htbHdmLm1haworZG9jL2V4cGF0LnBuZworZG9jL3JlZmVyZW5jZS5odG1sCitkb2Mvc3R5bGUuY3NzCitkb2MvdmFsaWQteGh0bWwxMC5wbmcKK2RvYy94bWx3Zi4xCitkb2MveG1sd2Yuc2dtbAorQ09QWUlORworQ2hhbmdlcworTUFOSUZFU1QKK01ha2VmaWxlLmluCitSRUFETUUKK2NvbmZpZ3VyZQorY29uZmlndXJlLmluCitleHBhdF9jb25maWcuaC5pbgorZXhwYXQuZHN3Citjb25mdG9vbHMvUHJpbnRQYXRoCitjb25mdG9vbHMvYWNfY19iaWdlbmRpYW5fY3Jvc3MubTQKK2NvbmZ0b29scy9jb25maWcuZ3Vlc3MKK2NvbmZ0b29scy9jb25maWcuc3ViCitjb25mdG9vbHMvZXhwYXQubTQKK2NvbmZ0b29scy9nZXQtdmVyc2lvbi5zaAorY29uZnRvb2xzL2luc3RhbGwtc2gKK2NvbmZ0b29scy9saWJ0b29sLm00Citjb25mdG9vbHMvbHRtYWluLnNoCitjb25mdG9vbHMvbWtpbnN0YWxsZGlycworZXhhbXBsZXMvZWxlbWVudHMuYworZXhhbXBsZXMvZWxlbWVudHMuZHNwCitleGFtcGxlcy9vdXRsaW5lLmMKK2V4YW1wbGVzL291dGxpbmUuZHNwCitsaWIvTWFrZWZpbGUuTVBXCitsaWIvYW1pZ2Fjb25maWcuaAorbGliL2FzY2lpLmgKK2xpYi9hc2NpaXRhYi5oCitsaWIvZXhwYXQuZHNwCitsaWIvZXhwYXQuaAorbGliL2V4cGF0X2V4dGVybmFsLmgKK2xpYi9leHBhdF9zdGF0aWMuZHNwCitsaWIvZXhwYXR3LmRzcAorbGliL2V4cGF0d19zdGF0aWMuZHNwCitsaWIvaWFzY2lpdGFiLmgKK2xpYi9pbnRlcm5hbC5oCitsaWIvbGF0aW4xdGFiLmgKK2xpYi9saWJleHBhdC5kZWYKK2xpYi9saWJleHBhdHcuZGVmCitsaWIvbWFjY29uZmlnLmgKK2xpYi9uYW1ldGFiLmgKK2xpYi91dGY4dGFiLmgKK2xpYi93aW5jb25maWcuaAorbGliL3htbHBhcnNlLmMKK2xpYi94bWxyb2xlLmMKK2xpYi94bWxyb2xlLmgKK2xpYi94bWx0b2suYworbGliL3htbHRvay5oCitsaWIveG1sdG9rX2ltcGwuYworbGliL3htbHRva19pbXBsLmgKK2xpYi94bWx0b2tfbnMuYwordGVzdHMvYmVuY2htYXJrL1JFQURNRS50eHQKK3Rlc3RzL2JlbmNobWFyay9iZW5jaG1hcmsuYwordGVzdHMvYmVuY2htYXJrL2JlbmNobWFyay5kc3AKK3Rlc3RzL2JlbmNobWFyay9iZW5jaG1hcmsuZHN3Cit0ZXN0cy9SRUFETUUudHh0Cit0ZXN0cy9jaGFyZGF0YS5jCit0ZXN0cy9jaGFyZGF0YS5oCit0ZXN0cy9taW5pY2hlY2suYwordGVzdHMvbWluaWNoZWNrLmgKK3Rlc3RzL3J1bnRlc3RzLmMKK3Rlc3RzL3J1bnRlc3RzcHAuY3BwCit0ZXN0cy94bWx0ZXN0LnNoCit2bXMvUkVBRE1FLnZtcwordm1zL2Rlc2NyaXAubW1zCit2bXMvZXhwYXRfY29uZmlnLmgKK3dpbjMyL01BTklGRVNULnR4dAord2luMzIvUkVBRE1FLnR4dAord2luMzIvZXhwYXQuaXNzCit4bWx3Zi9jb2RlcGFnZS5jCit4bWx3Zi9jb2RlcGFnZS5oCit4bWx3Zi9jdC5jCit4bWx3Zi9maWxlbWFwLmgKK3htbHdmL3JlYWRmaWxlbWFwLmMKK3htbHdmL3VuaXhmaWxlbWFwLmMKK3htbHdmL3dpbjMyZmlsZW1hcC5jCit4bWx3Zi94bWxmaWxlLmMKK3htbHdmL3htbGZpbGUuaAoreG1sd2YveG1sbWltZS5jCit4bWx3Zi94bWxtaW1lLmgKK3htbHdmL3htbHRjaGFyLmgKK3htbHdmL3htbHVybC5oCit4bWx3Zi94bWx3Zi5jCit4bWx3Zi94bWx3Zi5kc3AKK3htbHdmL3htbHdpbjMydXJsLmN4eApkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvTWFrZWZpbGUuaW4gYi9leHBhdC0yLjAuMS9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTJjYzk1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwxODcgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCB0b3AtbGV2ZWwgY29uZmlndXJlIHNjcmlwdCB0byBwcm9kdWNlIE1ha2VmaWxlCisjCisjIENvcHlyaWdodCAyMDAwIENsYXJrIENvb3BlcgorIworIyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgRVhQQVQuCisjCisjICBFWFBBVCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIExpY2Vuc2UgKGJhc2VkIG9uIHRoZSBNSVQvWCBsaWNlbnNlKSBjb250YWluZWQKKyMgIGluIHRoZSBmaWxlIENPUFlJTkcgdGhhdCBjb21lcyB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uLgorIworIyBFWFBBVCBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorIyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyMgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorIyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorIyBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorIyBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIEVYUEFULgorIworCitTSEVMTCA9IEBTSEVMTEAKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK1ZQQVRIID0gQHNyY2RpckAKKworcHJlZml4ID0gQHByZWZpeEAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAorCitiaW5kaXIgPSBAYmluZGlyQAorbGliZGlyID0gQGxpYmRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK21hbjFkaXIgPSBAbWFuZGlyQC9tYW4xCisKK3RvcF9idWlsZGRpciA9IC4KKworCitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK21raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2NvbmZ0b29scy9ta2luc3RhbGxkaXJzCisKK01BTkZJTEUgPSAkKHNyY2RpcikvZG9jL3htbHdmLjEKK0FQSUhFQURFUiA9ICQoc3JjZGlyKS9saWIvZXhwYXQuaCAkKHNyY2RpcikvbGliL2V4cGF0X2V4dGVybmFsLmgKK0xJQlJBUlkgPSBsaWJleHBhdC5sYQorCitERVNURElSID0gJChJTlNUQUxMX1JPT1QpCisKK2RlZmF1bHQ6ICBidWlsZGxpYiB4bWx3Zi94bWx3ZgorCitidWlsZGxpYjogJChMSUJSQVJZKQorCithbGw6ICQoTElCUkFSWSkgeG1sd2YveG1sd2YgZXhhbXBsZXMvZWxlbWVudHMgZXhhbXBsZXMvb3V0bGluZQorCitjbGVhbjoKKwljZCBsaWIgJiYgcm0gLWYgJChMSUJSQVJZKSAqLm8gKi5sbyAmJiBybSAtcmYgLmxpYnMgX2xpYnMKKwljZCB4bWx3ZiAmJiBybSAtZiB4bWx3ZiAqLm8gKi5sbyAmJiBybSAtcmYgLmxpYnMgX2xpYnMKKwljZCBleGFtcGxlcyAmJiBybSAtZiBlbGVtZW50cyBvdXRsaW5lICoubyAqLmxvICYmIHJtIC1yZiAubGlicyBfbGlicworCWNkIHRlc3RzICYmIHJtIC1yZiAubGlicyBydW50ZXN0cyBydW50ZXN0cy5vIHJ1bnRlc3RzcHAgcnVudGVzdHNwcC5vCisJY2QgdGVzdHMgJiYgcm0gLWYgY2hhcmRhdGEubyBtaW5pY2hlY2subworCXJtIC1yZiAubGlicyBsaWJleHBhdC5sYQorCXJtIC1mIGV4YW1wbGVzL2NvcmUgdGVzdHMvY29yZSB4bWx3Zi9jb3JlCisKK2Nsb2JiZXI6IGNsZWFuCisKK2Rpc3RjbGVhbjogY2xlYW4KKwlybSAtZiBleHBhdF9jb25maWcuaCBjb25maWcuc3RhdHVzIGNvbmZpZy5sb2cgY29uZmlnLmNhY2hlIGxpYnRvb2wKKwlybSAtZiBNYWtlZmlsZQorCitleHRyYWNsZWFuOiBkaXN0Y2xlYW4KKwlybSAtZiBleHBhdF9jb25maWcuaC5pbiBjb25maWd1cmUKKwlybSAtZiBjb25mdG9vbHMvbHRjb25maWcgY29uZnRvb2xzL2x0bWFpbi5zaCBjb25mdG9vbHMvbGlidG9vbC5tNAorCitjaGVjazogdGVzdHMvcnVudGVzdHMgdGVzdHMvcnVudGVzdHNwcAorCXRlc3RzL3J1bnRlc3RzCisJdGVzdHMvcnVudGVzdHNwcAorCitpbnN0YWxsOiB4bWx3Zi94bWx3ZiBpbnN0YWxsbGliCisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChiaW5kaXIpICQoREVTVERJUikkKG1hbjFkaXIpCisJJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgeG1sd2YveG1sd2YgJChERVNURElSKSQoYmluZGlyKS94bWx3ZgorCSQoSU5TVEFMTF9EQVRBKSAkKE1BTkZJTEUpICQoREVTVERJUikkKG1hbjFkaXIpCisKK2luc3RhbGxsaWI6ICQoTElCUkFSWSkgJChBUElIRUFERVIpCisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpICQoREVTVERJUikkKGluY2x1ZGVkaXIpCisJJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTEwpICQoTElCUkFSWSkgJChERVNURElSKSQobGliZGlyKS8kKExJQlJBUlkpCisJZm9yIEZOIGluICQoQVBJSEVBREVSKSA7IGRvICQoSU5TVEFMTF9EQVRBKSAkJEZOICQoREVTVERJUikkKGluY2x1ZGVkaXIpIDsgZG9uZQorCit1bmluc3RhbGw6IHVuaW5zdGFsbGxpYgorCSQoTElCVE9PTCkgLS1tb2RlPXVuaW5zdGFsbCBybSAtZiAkKERFU1RESVIpJChiaW5kaXIpL3htbHdmCisJcm0gLWYgJChERVNURElSKSQobWFuMWRpcikveG1sd2YuMQorCit1bmluc3RhbGxsaWI6CisJJChMSUJUT09MKSAtLW1vZGU9dW5pbnN0YWxsIHJtIC1mICQoREVTVERJUikkKGxpYmRpcikvJChMSUJSQVJZKQorCXJtIC1mICQoREVTVERJUikkKGluY2x1ZGVkaXIpL2V4cGF0LmgKKwlybSAtZiAkKERFU1RESVIpJChpbmNsdWRlZGlyKS9leHBhdF9leHRlcm5hbC5oCisKKyMgZm9yIFZQQVRIIGJ1aWxkcyAoaW52b2tlZCBieSBjb25maWd1cmUpCitta2Rpci1pbml0OgorCUBmb3IgZCBpbiBsaWIgeG1sd2YgZXhhbXBsZXMgdGVzdHMgOyBkbyBcCisJCShta2RpciAkJGQgMj4gL2Rldi9udWxsIHx8IHRlc3QgMSkgOyBcCisJZG9uZQorCitDQyA9IEBDQ0AKK0NYWCA9IEBDWFhACitMSUJUT09MID0gQExJQlRPT0xACisKK0lOQ0xVREVTID0gLUkkKHNyY2RpcikvbGliIC1JLgorTERGTEFHUyA9IEBMREZMQUdTQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NAIC1ESEFWRV9FWFBBVF9DT05GSUdfSAorQ0ZMQUdTID0gQENGTEFHU0AKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorVlNORkxBRyA9IC12ZXJzaW9uLWluZm8gQExJQkNVUlJFTlRAOkBMSUJSRVZJU0lPTkA6QExJQkFHRUAKKworIyMjIGF1dG9jb25mIHRoaXM/CitMVEZMQUdTID0gLS1zaWxlbnQKKworQ09NUElMRSA9ICQoQ0MpICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkKERFRlMpICQoQ1BQRkxBR1MpCitDWFhDT01QSUxFID0gJChDWFgpICQoSU5DTFVERVMpICQoQ1hYRkxBR1MpICQoREVGUykgJChDUFBGTEFHUykKK0xUQ09NUElMRSA9ICQoTElCVE9PTCkgJChMVEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpCitMSU5LX0xJQiA9ICQoTElCVE9PTCkgJChMVEZMQUdTKSAtLW1vZGU9bGluayAkKENPTVBJTEUpIC1uby11bmRlZmluZWQgJChWU05GTEFHKSAtcnBhdGggJChsaWJkaXIpICQoTERGTEFHUykgLW8gJEAKK0xJTktfRVhFID0gJChMSUJUT09MKSAkKExURkxBR1MpIC0tbW9kZT1saW5rICQoQ09NUElMRSkgJChMREZMQUdTKSAtbyAkQAorTElOS19DWFhfRVhFID0gJChMSUJUT09MKSAkKExURkxBR1MpIC0tbW9kZT1saW5rICQoQ1hYQ09NUElMRSkgJChMREZMQUdTKSAtbyAkQAorCitMSUJfT0JKUyA9IGxpYi94bWxwYXJzZS5sbyBsaWIveG1sdG9rLmxvIGxpYi94bWxyb2xlLmxvCiskKExJQlJBUlkpOiAkKExJQl9PQkpTKQorCSQoTElOS19MSUIpICQoTElCX09CSlMpCisKK2xpYi94bWxwYXJzZS5sbzogbGliL3htbHBhcnNlLmMgbGliL2V4cGF0LmggbGliL3htbHJvbGUuaCBsaWIveG1sdG9rLmggXAorCSQodG9wX2J1aWxkZGlyKS9leHBhdF9jb25maWcuaCBsaWIvZXhwYXRfZXh0ZXJuYWwuaCBsaWIvaW50ZXJuYWwuaAorCitsaWIveG1scm9sZS5sbzogbGliL3htbHJvbGUuYyBsaWIvYXNjaWkuaCBsaWIveG1scm9sZS5oIFwKKwkkKHRvcF9idWlsZGRpcikvZXhwYXRfY29uZmlnLmggbGliL2V4cGF0X2V4dGVybmFsLmggbGliL2ludGVybmFsLmgKKworbGliL3htbHRvay5sbzogbGliL3htbHRvay5jIGxpYi94bWx0b2tfaW1wbC5jIGxpYi94bWx0b2tfbnMuYyBcCisJbGliL2FzY2lpLmggbGliL2FzY2lpdGFiLmggbGliL2lhc2NpaXRhYi5oIGxpYi9sYXRpbjF0YWIuaCBcCisJbGliL25hbWV0YWIuaCBsaWIvdXRmOHRhYi5oIGxpYi94bWx0b2suaCBsaWIveG1sdG9rX2ltcGwuaCBcCisJJCh0b3BfYnVpbGRkaXIpL2V4cGF0X2NvbmZpZy5oIGxpYi9leHBhdF9leHRlcm5hbC5oIGxpYi9pbnRlcm5hbC5oCisKKworWE1MV0ZfT0JKUyA9IHhtbHdmL3htbHdmLm8geG1sd2YveG1sZmlsZS5vIHhtbHdmL2NvZGVwYWdlLm8geG1sd2YvQEZJTEVNQVBALm8KK3htbHdmL3htbHdmLm86IHhtbHdmL3htbHdmLmMKK3htbHdmL3htbGZpbGUubzogeG1sd2YveG1sZmlsZS5jCit4bWx3Zi9jb2RlcGFnZS5vOiB4bWx3Zi9jb2RlcGFnZS5jCit4bWx3Zi9ARklMRU1BUEAubzogeG1sd2YvQEZJTEVNQVBALmMKK3htbHdmL3htbHdmOiAkKFhNTFdGX09CSlMpICQoTElCUkFSWSkKKwkkKExJTktfRVhFKSAkKFhNTFdGX09CSlMpICQoTElCUkFSWSkKKworZXhhbXBsZXMvZWxlbWVudHMubzogZXhhbXBsZXMvZWxlbWVudHMuYworZXhhbXBsZXMvZWxlbWVudHM6IGV4YW1wbGVzL2VsZW1lbnRzLm8gJChMSUJSQVJZKQorCSQoTElOS19FWEUpICQ8ICQoTElCUkFSWSkKKworZXhhbXBsZXMvb3V0bGluZS5vOiBleGFtcGxlcy9vdXRsaW5lLmMKK2V4YW1wbGVzL291dGxpbmU6IGV4YW1wbGVzL291dGxpbmUubyAkKExJQlJBUlkpCisJJChMSU5LX0VYRSkgJDwgJChMSUJSQVJZKQorCit0ZXN0cy9jaGFyZGF0YS5vOiB0ZXN0cy9jaGFyZGF0YS5jIHRlc3RzL2NoYXJkYXRhLmgKK3Rlc3RzL21pbmljaGVjay5vOiB0ZXN0cy9taW5pY2hlY2suYyB0ZXN0cy9taW5pY2hlY2suaAordGVzdHMvcnVudGVzdHMubzogdGVzdHMvcnVudGVzdHMuYyB0ZXN0cy9jaGFyZGF0YS5oCit0ZXN0cy9ydW50ZXN0czogdGVzdHMvcnVudGVzdHMubyB0ZXN0cy9jaGFyZGF0YS5vIHRlc3RzL21pbmljaGVjay5vICQoTElCUkFSWSkKKwkkKExJTktfRVhFKSB0ZXN0cy9ydW50ZXN0cy5vIHRlc3RzL2NoYXJkYXRhLm8gdGVzdHMvbWluaWNoZWNrLm8gJChMSUJSQVJZKQordGVzdHMvcnVudGVzdHNwcC5vOiB0ZXN0cy9ydW50ZXN0c3BwLmNwcCB0ZXN0cy9ydW50ZXN0cy5jIHRlc3RzL2NoYXJkYXRhLmgKK3Rlc3RzL3J1bnRlc3RzcHA6IHRlc3RzL3J1bnRlc3RzcHAubyB0ZXN0cy9jaGFyZGF0YS5vIHRlc3RzL21pbmljaGVjay5vICQoTElCUkFSWSkKKwkkKExJTktfQ1hYX0VYRSkgdGVzdHMvcnVudGVzdHNwcC5vIHRlc3RzL2NoYXJkYXRhLm8gdGVzdHMvbWluaWNoZWNrLm8gJChMSUJSQVJZKQorCit0ZXN0cy94bWx0cy56aXA6CisJd2dldCAtLW91dHB1dC1kb2N1bWVudD10ZXN0cy94bWx0cy56aXAgXAorCQlodHRwOi8vd3d3LnczLm9yZy9YTUwvVGVzdC94bWx0czIwMDIwNjA2LnppcAorCit0ZXN0cy9YTUwtVGVzdC1TdWl0ZTogdGVzdHMveG1sdHMuemlwCisJY2QgdGVzdHMgJiYgdW56aXAgLXEgeG1sdHMuemlwCisKK3J1bi14bWx0ZXN0OiB4bWx3Zi94bWx3ZiB0ZXN0cy9YTUwtVGVzdC1TdWl0ZQorCXRlc3RzL3htbHRlc3Quc2gKKworLlNVRkZJWEVTOiAuYyAuY3BwIC5sbyAubworCisuY3BwLm86CisJJChDWFhDT01QSUxFKSAtbyAkQCAtYyAkPAorLmMubzoKKwkkKENPTVBJTEUpIC1vICRAIC1jICQ8CisuYy5sbzoKKwkkKExUQ09NUElMRSkgLW8gJEAgLWMgJDwKKworLlBIT05ZOiBidWlsZGxpYiBhbGwgXAorCWNsZWFuIGRpc3RjbGVhbiBleHRyYWNsZWFuIG1haW50YWluZXItY2xlYW4gXAorCWRpc3QgZGlzdGRpciBcCisJaW5zdGFsbCB1bmluc3RhbGwKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL1JFQURNRSBiL2V4cGF0LTIuMC4xL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGEyODJhCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvUkVBRE1FCkBAIC0wLDAgKzEsMTM3IEBACisKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4cGF0LCBSZWxlYXNlIDIuMC4xCisKK1RoaXMgaXMgRXhwYXQsIGEgQyBsaWJyYXJ5IGZvciBwYXJzaW5nIFhNTCwgd3JpdHRlbiBieSBKYW1lcyBDbGFyay4KK0V4cGF0IGlzIGEgc3RyZWFtLW9yaWVudGVkIFhNTCBwYXJzZXIuICBUaGlzIG1lYW5zIHRoYXQgeW91IHJlZ2lzdGVyCitoYW5kbGVycyB3aXRoIHRoZSBwYXJzZXIgYmVmb3JlIHN0YXJ0aW5nIHRoZSBwYXJzZS4gIFRoZXNlIGhhbmRsZXJzCithcmUgY2FsbGVkIHdoZW4gdGhlIHBhcnNlciBkaXNjb3ZlcnMgdGhlIGFzc29jaWF0ZWQgc3RydWN0dXJlcyBpbiB0aGUKK2RvY3VtZW50IGJlaW5nIHBhcnNlZC4gIEEgc3RhcnQgdGFnIGlzIGFuIGV4YW1wbGUgb2YgdGhlIGtpbmQgb2YKK3N0cnVjdHVyZXMgZm9yIHdoaWNoIHlvdSBtYXkgcmVnaXN0ZXIgaGFuZGxlcnMuCisKK1dpbmRvd3MgdXNlcnMgc2hvdWxkIHVzZSB0aGUgZXhwYXRfd2luMzJiaW4gcGFja2FnZSwgd2hpY2ggaW5jbHVkZXMKK2JvdGggcHJlY29tcGlsZWQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcywgYW5kIHNvdXJjZSBjb2RlIGZvcgorZGV2ZWxvcGVycy4KKworRXhwYXQgaXMgZnJlZSBzb2Z0d2FyZS4gIFlvdSBtYXkgY29weSwgZGlzdHJpYnV0ZSwgYW5kIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBMaWNlbnNlIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSBDT1BZSU5HIGRpc3RyaWJ1dGVkCit3aXRoIHRoaXMgcGFja2FnZS4gIFRoaXMgbGljZW5zZSBpcyB0aGUgc2FtZSBhcyB0aGUgTUlUL1ggQ29uc29ydGl1bQorbGljZW5zZS4KKworVmVyc2lvbnMgb2YgRXhwYXQgdGhhdCBoYXZlIGFuIG9kZCBtaW5vciB2ZXJzaW9uICh0aGUgbWlkZGxlIG51bWJlciBpbgordGhlIHJlbGVhc2UgYWJvdmUpLCBhcmUgZGV2ZWxvcG1lbnQgcmVsZWFzZXMgYW5kIHNob3VsZCBiZSBjb25zaWRlcmVkCithcyBiZXRhIHNvZnR3YXJlLiAgUmVsZWFzZXMgd2l0aCBldmVuIG1pbm9yIHZlcnNpb24gbnVtYmVycyBhcmUKK2ludGVuZGVkIHRvIGJlIHByb2R1Y3Rpb24gZ3JhZGUgc29mdHdhcmUuCisKK0lmIHlvdSBhcmUgYnVpbGRpbmcgRXhwYXQgZnJvbSBhIGNoZWNrLW91dCBmcm9tIHRoZSBDVlMgcmVwb3NpdG9yeSwKK3lvdSBuZWVkIHRvIHJ1biBhIHNjcmlwdCB0aGF0IGdlbmVyYXRlcyB0aGUgY29uZmlndXJlIHNjcmlwdCB1c2luZyB0aGUKK0dOVSBhdXRvY29uZiBhbmQgbGlidG9vbCB0b29scy4gIFRvIGRvIHRoaXMsIHlvdSBuZWVkIHRvIGhhdmUKK2F1dG9jb25mIDIuNTIgb3IgbmV3ZXIgYW5kIGxpYnRvb2wgMS40IG9yIG5ld2VyICgxLjUgb3IgbmV3ZXIgcHJlZmVycmVkKS4KK1J1biB0aGUgc2NyaXB0IGxpa2UgdGhpczoKKworICAgICAgICAuL2J1aWxkY29uZi5zaAorCitPbmNlIHRoaXMgaGFzIGJlZW4gZG9uZSwgZm9sbG93IHRoZSBzYW1lIGluc3RydWN0aW9ucyBhcyBmb3IgYnVpbGRpbmcKK2Zyb20gYSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCitUbyBidWlsZCBFeHBhdCBmcm9tIGEgc291cmNlIGRpc3RyaWJ1dGlvbiwgeW91IGZpcnN0IHJ1biB0aGUKK2NvbmZpZ3VyYXRpb24gc2hlbGwgc2NyaXB0IGluIHRoZSB0b3AgbGV2ZWwgZGlzdHJpYnV0aW9uIGRpcmVjdG9yeToKKworICAgICAgICAuL2NvbmZpZ3VyZQorCitUaGVyZSBhcmUgbWFueSBvcHRpb25zIHdoaWNoIHlvdSBtYXkgcHJvdmlkZSB0byBjb25maWd1cmUgKHdoaWNoIHlvdQorY2FuIGRpc2NvdmVyIGJ5IHJ1bm5pbmcgY29uZmlndXJlIHdpdGggdGhlIC0taGVscCBvcHRpb24pLiAgQnV0IHRoZQorb25lIG9mIG1vc3QgaW50ZXJlc3QgaXMgdGhlIG9uZSB0aGF0IHNldHMgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuCitCeSBkZWZhdWx0LCB0aGUgY29uZmlndXJlIHNjcmlwdCB3aWxsIHNldCB0aGluZ3MgdXAgdG8gaW5zdGFsbAorbGliZXhwYXQgaW50byAvdXNyL2xvY2FsL2xpYiwgZXhwYXQuaCBpbnRvIC91c3IvbG9jYWwvaW5jbHVkZSwgYW5kCit4bWx3ZiBpbnRvIC91c3IvbG9jYWwvYmluLiAgSWYsIGZvciBleGFtcGxlLCB5b3UnZCBwcmVmZXIgdG8gaW5zdGFsbAoraW50byAvaG9tZS9tZS9teXN0dWZmL2xpYiwgL2hvbWUvbWUvbXlzdHVmZi9pbmNsdWRlLCBhbmQKKy9ob21lL21lL215c3R1ZmYvYmluLCB5b3UgY2FuIHRlbGwgY29uZmlndXJlIGFib3V0IHRoYXQgd2l0aDoKKworICAgICAgICAuL2NvbmZpZ3VyZSAtLXByZWZpeD0vaG9tZS9tZS9teXN0dWZmCisgICAgICAgIAorQW5vdGhlciBpbnRlcmVzdGluZyBvcHRpb24gaXMgdG8gZW5hYmxlIDY0LWJpdCBpbnRlZ2VyIHN1cHBvcnQgZm9yCitsaW5lIGFuZCBjb2x1bW4gbnVtYmVycyBhbmQgdGhlIG92ZXItYWxsIGJ5dGUgaW5kZXg6CisKKyAgICAgICAgLi9jb25maWd1cmUgQ1BQRkxBR1M9LURYTUxfTEFSR0VfU0laRQorICAgICAgICAKK0hvd2V2ZXIsIHN1Y2ggYSBtb2RpZmljYXRpb24gd291bGQgYmUgYSBicmVha2luZyBjaGFuZ2UgdG8gdGhlIEFCSQorYW5kIGlzIHRoZXJlZm9yZSBub3QgcmVjb21tZW5kZWQgZm9yIGdlbmVyYWwgdXNlIC0gZS5nLiBhcyBwYXJ0IG9mCithIExpbnV4IGRpc3RyaWJ1dGlvbiAtIGJ1dCByYXRoZXIgZm9yIGJ1aWxkcyB3aXRoIHNwZWNpYWwgcmVxdWlyZW1lbnRzLgorCitBZnRlciBydW5uaW5nIHRoZSBjb25maWd1cmUgc2NyaXB0LCB0aGUgIm1ha2UiIGNvbW1hbmQgd2lsbCBidWlsZAordGhpbmdzIGFuZCAibWFrZSBpbnN0YWxsIiB3aWxsIGluc3RhbGwgdGhpbmdzIGludG8gdGhlaXIgcHJvcGVyCitsb2NhdGlvbi4gIEhhdmUgYSBsb29rIGF0IHRoZSAiTWFrZWZpbGUiIHRvIGxlYXJuIGFib3V0IGFkZGl0aW9uYWwKKyJtYWtlIiBvcHRpb25zLiAgTm90ZSB0aGF0IHlvdSBuZWVkIHRvIGhhdmUgd3JpdGUgcGVybWlzc2lvbiBpbnRvCit0aGUgZGlyZWN0b3JpZXMgaW50byB3aGljaCB0aGluZ3Mgd2lsbCBiZSBpbnN0YWxsZWQuCisKK0lmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBidWlsZGluZyBFeHBhdCB0byBwcm92aWRlIGRvY3VtZW50CitpbmZvcm1hdGlvbiBpbiBVVEYtMTYgcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQgVVRGLTgsIGZvbGxvdyB0aGVzZQoraW5zdHJ1Y3Rpb25zIChhZnRlciBoYXZpbmcgcnVuICJtYWtlIGRpc3RjbGVhbiIpOgorCisgICAgICAgIDEuIEZvciBVVEYtMTYgb3V0cHV0IGFzIHVuc2lnbmVkIHNob3J0IChhbmQgdmVyc2lvbi9lcnJvcgorICAgICAgICAgICBzdHJpbmdzIGFzIGNoYXIpLCBydW46CisKKyAgICAgICAgICAgICAgIC4vY29uZmlndXJlIENQUEZMQUdTPS1EWE1MX1VOSUNPREUKKworICAgICAgICAgICBGb3IgVVRGLTE2IG91dHB1dCBhcyB3Y2hhcl90IChpbmNsLiB2ZXJzaW9uL2Vycm9yIHN0cmluZ3MpLAorICAgICAgICAgICBydW46CisKKyAgICAgICAgICAgICAgIC4vY29uZmlndXJlIENGTEFHUz0iLWcgLU8yIC1mc2hvcnQtd2NoYXIiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQUEZMQUdTPS1EWE1MX1VOSUNPREVfV0NIQVJfVAorCisgICAgICAgIDIuIEVkaXQgdGhlIE1ha2VGaWxlLCBjaGFuZ2luZzoKKworICAgICAgICAgICAgICAgTElCUkFSWSA9IGxpYmV4cGF0LmxhCisKKyAgICAgICAgICAgdG86CisKKyAgICAgICAgICAgICAgIExJQlJBUlkgPSBsaWJleHBhdHcubGEKKworICAgICAgICAgICAoTm90ZSB0aGUgYWRkaXRpb25hbCAidyIgaW4gdGhlIGxpYnJhcnkgbmFtZS4pCisKKyAgICAgICAgMy4gUnVuICJtYWtlIGJ1aWxkbGliIiAod2hpY2ggYnVpbGRzIHRoZSBsaWJyYXJ5IG9ubHkpLgorICAgICAgICAgICBPciwgdG8gc2F2ZSBzdGVwIDIsIHJ1biAibWFrZSBidWlsZGxpYiBMSUJSQVJZPWxpYmV4cGF0dy5sYSIuCisKKyAgICAgICAgNC4gUnVuICJtYWtlIGluc3RhbGxsaWIiICh3aGljaCBpbnN0YWxscyB0aGUgbGlicmFyeSBvbmx5KS4KKyAgICAgICAgICAgT3IsIGlmIHN0ZXAgMiB3YXMgb21pdHRlZCwgcnVuICJtYWtlIGluc3RhbGxsaWIgTElCUkFSWT1saWJleHBhdHcubGEiLgorICAgICAgICAgICAKK1VzaW5nIERFU1RESVIgb3IgSU5TVEFMTF9ST09UIGlzIGVuYWJsZWQsIHdpdGggSU5TVEFMTF9ST09UIGJlaW5nIHRoZSBkZWZhdWx0Cit2YWx1ZSBmb3IgREVTVERJUiwgYW5kIHRoZSByZXN0IG9mIHRoZSBtYWtlIGZpbGUgdXNpbmcgb25seSBERVNURElSLgorSXQgd29ya3MgYXMgZm9sbG93czoKKyAgICQgbWFrZSBpbnN0YWxsIERFU1RESVI9L3BhdGgvdG8vaW1hZ2UKK292ZXJyaWRlcyB0aGUgaW4tbWFrZWZpbGUgc2V0IERFU1RESVIsIHdoaWxlIGJvdGgKKyAgICQgSU5TVEFMTF9ST09UPS9wYXRoL3RvL2ltYWdlIG1ha2UgaW5zdGFsbAorICAgJCBtYWtlIGluc3RhbGwgSU5TVEFMTF9ST09UPS9wYXRoL3RvL2ltYWdlCit1c2UgREVTVERJUj0kKElOU1RBTExfUk9PVCksIGV2ZW4gaWYgREVTVERJUiBldmVudHVhbGx5IGlzIGRlZmluZWQgaW4gdGhlCitlbnZpcm9ubWVudCwgYmVjYXVzZSB2YXJpYWJsZS1zZXR0aW5nIHByaW9yaXR5IGlzCisxKSBjb21tYW5kbGluZQorMikgaW4tbWFrZWZpbGUKKzMpIGVudmlyb25tZW50ICAgICAgICAgICAKKworTm90ZSBmb3IgU29sYXJpcyB1c2VyczogIFRoZSAiYXIiIGNvbW1hbmQgaXMgdXN1YWxseSBsb2NhdGVkIGluCisiL3Vzci9jY3MvYmluIiwgd2hpY2ggaXMgbm90IGluIHRoZSBkZWZhdWx0IFBBVEguICBZb3Ugd2lsbCBuZWVkIHRvCithZGQgdGhpcyB0byB5b3VyIHBhdGggZm9yIHRoZSAibWFrZSIgY29tbWFuZCwgYW5kIHByb2JhYmx5IGFsc28gc3dpdGNoCit0byBHTlUgbWFrZSAodGhlICJtYWtlIiBmb3VuZCBpbiAvdXNyL2Njcy9iaW4gZG9lcyBub3Qgc2VlbSB0byB3b3JrCitwcm9wZXJseSAtLSBhcHBlYXJhbnRseSBpdCBkb2VzIG5vdCB1bmRlcnN0YW5kIC5QSE9OWSBkaXJlY3RpdmVzKS4gIElmCit5b3UncmUgdXNpbmcga3NoIG9yIGJhc2gsIHVzZSB0aGlzIGNvbW1hbmQgdG8gYnVpbGQ6CisKKyAgICAgICAgUEFUSD0vdXNyL2Njcy9iaW46JFBBVEggbWFrZQorCitXaGVuIHVzaW5nIEV4cGF0IHdpdGggYSBwcm9qZWN0IHVzaW5nIGF1dG9jb25mIGZvciBjb25maWd1cmF0aW9uLCB5b3UKK2NhbiB1c2UgdGhlIHByb2JpbmcgbWFjcm8gaW4gY29uZnRvb2xzL2V4cGF0Lm00IHRvIGRldGVybWluZSBob3cgdG8KK2luY2x1ZGUgRXhwYXQuICBTZWUgdGhlIGNvbW1lbnRzIGF0IHRoZSB0b3Agb2YgdGhhdCBmaWxlIGZvciBtb3JlCitpbmZvcm1hdGlvbi4KKworQSByZWZlcmVuY2UgbWFudWFsIGlzIGF2YWlsYWJsZSBpbiB0aGUgZmlsZSBkb2MvcmVmZXJlbmNlLmh0bWwgaW4gdGhpcworZGlzdHJpYnV0aW9uLgorCitUaGUgaG9tZXBhZ2UgZm9yIHRoaXMgcHJvamVjdCBpcyBodHRwOi8vd3d3LmxpYmV4cGF0Lm9yZy8uICBUaGVyZQorYXJlIGxpbmtzIHRoZXJlIHRvIGNvbm5lY3QgeW91IHRvIHRoZSBidWcgcmVwb3J0cyBwYWdlLiAgSWYgeW91IG5lZWQKK3RvIHJlcG9ydCBhIGJ1ZyB3aGVuIHlvdSBkb24ndCBoYXZlIGFjY2VzcyB0byBhIGJyb3dzZXIsIHlvdSBtYXkgYWxzbworc2VuZCBhIGJ1ZyByZXBvcnQgYnkgZW1haWwgdG8gZXhwYXQtYnVnc0BtYWlsLmxpYmV4cGF0Lm9yZy4KKworRGlzY3Vzc2lvbiByZWxhdGVkIHRvIHRoZSBkaXJlY3Rpb24gb2YgZnV0dXJlIGV4cGF0IGRldmVsb3BtZW50IHRha2VzCitwbGFjZSBvbiBleHBhdC1kaXNjdXNzQG1haWwubGliZXhwYXQub3JnLiAgQXJjaGl2ZXMgb2YgdGhpcyBsaXN0IGFuZAorb3RoZXIgRXhwYXQtcmVsYXRlZCBsaXN0cyBtYXkgYmUgZm91bmQgYXQ6CisKKyAgICAgICAgaHR0cDovL21haWwubGliZXhwYXQub3JnL21haWxtYW4vbGlzdGluZm8vCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9SRUFETUUuZ29vZ2xlIGIvZXhwYXQtMi4wLjEvUkVBRE1FLmdvb2dsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjcwMmI5Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvUkVBRE1FLmdvb2dsZQpAQCAtMCwwICsxLDE5IEBACitHb29nbGUtc3BlY2lmaWMgcGF0Y2hlcyBhcHBsaWVkIHRvIGdvb2dsZV92ZW5kb3Jfc3JjX2JyYW5jaC9leHBhdC9leHBhdC0yLjAuMToKKworUGxlYXNlIGluY2x1ZGUgYSBjaGFuZ2UgdG8gdGhpcyBmaWxlIHdpdGggZWFjaCBwYXRjaCwgKmFuZCogZWFjaAorc3Vic2VxdWVudCBtb2RpZmljYXRpb24gb2YgdGhlIHBhdGNoLiAgRG8gTk9UIGNvbWJpbmUgcGF0Y2gKK2NoZWNraW5zLCBrZWVwIHRoZW0gc2VwYXJhdGUuCisKK0FwcGVuZCBuZXcgZW50cmllcyB0byB0aGUgZW5kIG9mIHRoaXMgZmlsZS4gRWFjaCBlbnRyeSBzaGFsbCBpbmNsdWRlOgorICogVGhlIGxpc3Qgb2YgZmlsZXMgbW9kaWZpZWQgYnkgdGhlIHBhdGNoLAorICogVGhlIHN0YXR1cyBvZiB0aGUgcGF0Y2guIFNob3VsZCBiZSBvbmUgb2Y6CisgICAtIGFscmVhZHkgdXBzdHJlYW0gKGluZGljYXRlIHVwc3RyZWFtIHJldmlzaW9uKSwKKyAgIC0gbm90IHlldCB1cHN0cmVhbSwgb3IKKyAgIC0gZ29vZ2xlLWxvY2FsIChub3QgYXBwbGljYWJsZSB1cHN0cmVhbSkuCisgKiBUaGUgbG9jYWwgJ293bmVyJyByZXNwb25zaWJsZSBmb3IgdGhlIHBhdGNoLCBhbmQKKyAqIEEgZGVzY3JpcHRpb24gb2YgdGhlIHBhdGNoIChwcmVmZXJhYmx5IGluY2x1ZGluZyBidWcgbnVtYmVycykuCisKK1BsZWFzZSBpbmNsdWRlIGVudHJpZXMgZm9yIGJvdGggbG9jYWwgcGF0Y2hlcyBhbmQgZm9yIHBhdGNoZXMgd2hpY2gKK2hhdmUgYmVlbiBjaGVja2VkIGluIHRvIChvciBiYWNrLXBvcnRlZCBmcm9tKSB0aGUgdXBzdHJlYW0gc291cmNlcy4KK1doZW4gY2hlY2tpbmcgaW4gY2hhbmdlcyBtYWRlIHVwc3RyZWFtLCBhZGQgYW4gZW50cnkgdG8gdGhpcyBmaWxlIGJ1dAorRE8gTk9UIGFkZCBlbnRyaWVzIHRvIGFueSBsb2NhbCBDaGFuZ2VMb2cgZmlsZXMuCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9hbWlnYS9NYWtlZmlsZSBiL2V4cGF0LTIuMC4xL2FtaWdhL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NTBkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9hbWlnYS9NYWtlZmlsZQpAQCAtMCwwICsxLDE4NyBAQAorIworIyBNYWtlZmlsZSBmb3IgQW1pZ2FPUworIworCisuUEhPTlk6IGhlbHAgYWxsIHN0YXRpY2xpYiBzaGFyZWRsaWIgY2hlY2sgY2xlYW4gaW5zdGFsbAorCit2cGF0aCAlLmMgLi4vbGliIC4uL2V4YW1wbGVzIC4uL3htbHdmIC4uL3Rlc3RzCit2cGF0aCAlLmggLi4vbGliIC4uL3Rlc3RzCisKKworIworIyBTZXQgdGhlc2UgZm9yIFNESyBpbnN0YWxsYXRpb24uCisjCit0b29sZGlyID0gU0RLOkxvY2FsL0MKK3N0YXRpY2xpYmRpciA9IFNESzpMb2NhbC9jbGliMi9saWIKK3N0YXRpY2luY2x1ZGVkaXIgPSBTREs6TG9jYWwvY2xpYjIvaW5jbHVkZQorc2hhcmVkbGliZGlyID0gU0RLOkxvY2FsL0xpYnMKK3NoYXJlZGluY2x1ZGVkaXIgPSBTREs6TG9jYWwvY29tbW9uL2luY2x1ZGUKKworCitpZmVxICgkKE1BS0VDTURHT0FMUyksIHN0YXRpY2xpYikKKyBERVNURElSID0gbGliCitlbHNlCisgREVTVERJUiA9IGxpYnMKK2VuZGlmCisKK1NUQVRJQ0xJQiA9ICQoREVTVERJUikvbGliZXhwYXQuYQorU0hBUkVETElCID0gJChERVNURElSKS9leHBhdC5saWJyYXJ5CisKK1hNTFdGID0gJChERVNURElSKS94bWx3ZgorRUxFTUVOVFMgPSAkKERFU1RESVIpL2VsZW1lbnRzCitPVVRMSU5FID0gJChERVNURElSKS9vdXRsaW5lCitSVU5URVNUUyA9ICQoREVTVERJUikvcnVudGVzdHMKK0JFTkNITUFSSyA9ICQoREVTVERJUikvYmVuY2htYXJrCisKKworaGVscDoKKwlAZWNobyAiUmVxdWlyZXM6IgorCUBlY2hvICIgQW1pZ2FPUyA0LjAiCisJQGVjaG8gIiBTREsgNTEuMjIiCisJQGVjaG8gIiBjbGliMiAxLjIwMiIKKwlAZWNobyAiIgorCUBlY2hvICJUYXJnZXRzOiIKKwlAZWNobyAiIGFsbCAtIG1ha2UgZXhwYXQgbGlicmFyaWVzLCB4bWx3ZiwgZXhhbXBsZXMgYW5kIHJ1biB0ZXN0IHN1aXRlIgorCUBlY2hvICIgaW5zdGFsbCAtIGluc3RhbGwgZXhwYXQgbGlicmFyaWVzIGFuZCB0b29scyBpbnRvIFNESyIKKworYWxsOgorCS1tYWtlZGlyIGZvcmNlIGxpYiBsaWJzCisJJChNQUtFKSBzdGF0aWNsaWIKKwkkKE1BS0UpIHNoYXJlZGxpYgorCitzdGF0aWNsaWI6ICQoU1RBVElDTElCKSAkKFhNTFdGKSAkKEVMRU1FTlRTKSAkKE9VVExJTkUpICQoUlVOVEVTVFMpICQoQkVOQ0hNQVJLKSBjaGVjaworCUBlY2hvIGRvbmUKKworc2hhcmVkbGliOiAkKFNIQVJFRExJQikgJChYTUxXRikgJChFTEVNRU5UUykgJChPVVRMSU5FKSAkKFJVTlRFU1RTKSAkKEJFTkNITUFSSykgY2hlY2sKKwlAZWNobyBkb25lCisKK2NoZWNrOgorCSQoUlVOVEVTVFMpCisKK2NsZWFuOgorCS1kZWxldGUgbGliLyM/Lm8gcXVpZXQKKwktZGVsZXRlIGxpYnMvIz8ubyBxdWlldAorCitpbnN0YWxsOgorCWNvcHkgbGlicy94bWx3ZiAkKHRvb2xkaXIpIHF1aWV0CisJY29weSAvbGliL2V4cGF0LmggL2xpYi9leHBhdF9leHRlcm5hbC5oICQoc3RhdGljaW5jbHVkZWRpcikgcXVpZXQKKwljb3B5IGxpYi9saWJleHBhdC5hICQoc3RhdGljbGliZGlyKSBxdWlldAorCWNvcHkgbGlicy9leHBhdC5saWJyYXJ5ICQoc2hhcmVkbGliZGlyKSBxdWlldAorCWNvcHkgaW5jbHVkZSAkKHNoYXJlZGluY2x1ZGVkaXIpIHF1aWV0IGFsbAorCisKK0NDID0gZ2NjCitMSUJUT09MID0gYXIKK1NUUklQID0gc3RyaXAKKworTERGTEFHUyA9CitMSUJTID0KK0NGTEFHUyA9IC1ETkRFQlVHIC1PMgorTFRGTEFHUyA9IC1jcnMKK1NUUklQRkxBR1MgPSAtUi5jb21tZW50CitMQVVOQ0ggPQorCitpZmVxICgkKE1BS0VDTURHT0FMUyksIHN0YXRpY2xpYikKKyBDRkxBR1MgKz0gLW1jcnQ9Y2xpYjIKKyBMREZMQUdTICs9IC1tY3J0PWNsaWIyCisgTElCUyArPSAkKFNUQVRJQ0xJQikKKyBJTkNMVURFUyA9IC1JLi4vbGliCitlbmRpZgorCitpZmVxICgkKE1BS0VDTURHT0FMUyksIHNoYXJlZGxpYikKKyBDRkxBR1MgKz0gLW1jcnQ9bmV3bGliIC1EX19VU0VfSU5MSU5FX18KKyBMREZMQUdTICs9IC1tY3J0PW5ld2xpYgorIElOQ0xVREVTID0gLUkuIC1JaW5jbHVkZSAtSWluY2x1ZGUvbGlicmFyaWVzIC1JLi4vbGliCisgTEFVTkNIID0gJChERVNURElSKS9sYXVuY2gubworZW5kaWYKKworCitDT01QSUxFID0gJChDQykgJChDRkxBR1MpICQoSU5DTFVERVMpIC1jCisKK0xJTksgPSAkKENDKSAkKExERkxBR1MpIC1vICRACisKKworJChTVEFUSUNMSUIpOiAkKERFU1RESVIpL3htbHBhcnNlLm8gJChERVNURElSKS94bWx0b2subyAkKERFU1RESVIpL3htbHJvbGUubworCSQoTElCVE9PTCkgJChMVEZMQUdTKSAkQCAkXgorCiskKERFU1RESVIpL3htbHBhcnNlLm86IHhtbHBhcnNlLmMgZXhwYXQuaCB4bWxyb2xlLmggeG1sdG9rLmggXAorCWV4cGF0X2V4dGVybmFsLmggaW50ZXJuYWwuaCBhbWlnYWNvbmZpZy5oCisJJChDT01QSUxFKSAkPCAtbyAkQAorCiskKERFU1RESVIpL3htbHJvbGUubzogeG1scm9sZS5jIGFzY2lpLmggeG1scm9sZS5oIGV4cGF0X2V4dGVybmFsLmggXAorCWludGVybmFsLmggYW1pZ2Fjb25maWcuaAorCSQoQ09NUElMRSkgJDwgLW8gJEAKKworJChERVNURElSKS94bWx0b2subzogeG1sdG9rLmMgeG1sdG9rX2ltcGwuYyB4bWx0b2tfbnMuYyBhc2NpaS5oIGFzY2lpdGFiLmggXAorCWlhc2NpaXRhYi5oIGxhdGluMXRhYi5oIG5hbWV0YWIuaCB1dGY4dGFiLmggeG1sdG9rLmggeG1sdG9rX2ltcGwuaCBcCisJZXhwYXRfZXh0ZXJuYWwuaCBpbnRlcm5hbC5oIGFtaWdhY29uZmlnLmgKKwkkKENPTVBJTEUpICQ8IC1vICRACisKKworJChTSEFSRURMSUIpOiAkKERFU1RESVIpL2V4cGF0X2xpYi5vICQoREVTVERJUikvZXhwYXRfdmVjdG9ycy5vICQoREVTVERJUikvc3RkbGliLm8gbGliL2xpYmV4cGF0LmEKKwkkKExJTkspIC1ub3N0YXJ0ZmlsZXMgLW5vc3RkbGliIC1vICRAICReCisKKyQoREVTVERJUikvZXhwYXRfbGliLm86IGV4cGF0X2xpYi5jCisJJChDT01QSUxFKSAkPCAtbyAkQAorCiskKERFU1RESVIpL2V4cGF0X3ZlY3RvcnMubzogZXhwYXRfdmVjdG9ycy5jCisJJChDT01QSUxFKSAkPCAtbyAkQAorCiskKERFU1RESVIpL3N0ZGxpYi5vOiBzdGRsaWIuYworCSQoQ09NUElMRSkgJDwgLW8gJEAKKworJChMQVVOQ0gpOiBsYXVuY2guYworCSQoQ09NUElMRSkgJDwgLW8gJEAKKworCiskKFhNTFdGKTogJChERVNURElSKS94bWx3Zi5vICQoREVTVERJUikveG1sZmlsZS5vICQoREVTVERJUikvY29kZXBhZ2UubyAkKERFU1RESVIpL3JlYWRmaWxlbWFwLm8gJChMQVVOQ0gpCisJJChMSU5LKSAkXiAkKExJQlMpCisJJChTVFJJUCkgJChTVFJJUEZMQUdTKSAkQAorCiskKERFU1RESVIpL3htbHdmLm86IHhtbHdmLmMKKwkkKENPTVBJTEUpICQ8IC1vICRACisKKyQoREVTVERJUikveG1sZmlsZS5vOiB4bWxmaWxlLmMKKwkkKENPTVBJTEUpICQ8IC1vICRACisKKyQoREVTVERJUikvY29kZXBhZ2UubzogY29kZXBhZ2UuYworCSQoQ09NUElMRSkgJDwgLW8gJEAKKworJChERVNURElSKS9yZWFkZmlsZW1hcC5vOiByZWFkZmlsZW1hcC5jCisJJChDT01QSUxFKSAkPCAtbyAkQAorCisKKyQoRUxFTUVOVFMpOiAkKERFU1RESVIpL2VsZW1lbnRzLm8gJChMQVVOQ0gpCisJJChMSU5LKSAkXiAkKExJQlMpCisJJChTVFJJUCkgJChTVFJJUEZMQUdTKSAkQAorCiskKERFU1RESVIpL2VsZW1lbnRzLm86IGVsZW1lbnRzLmMKKwkkKENPTVBJTEUpICQ8IC1vICRACisKKworJChPVVRMSU5FKTogJChERVNURElSKS9vdXRsaW5lLm8gJChMQVVOQ0gpCisJJChMSU5LKSAkXiAkKExJQlMpCisJJChTVFJJUCkgJChTVFJJUEZMQUdTKSAkQAorCiskKERFU1RESVIpL291dGxpbmUubzogb3V0bGluZS5jCisJJChDT01QSUxFKSAkPCAtbyAkQAorCisKKyQoUlVOVEVTVFMpOiAkKERFU1RESVIpL3J1bnRlc3RzLm8gJChERVNURElSKS9jaGFyZGF0YS5vICQoREVTVERJUikvbWluaWNoZWNrLm8gJChMQVVOQ0gpCisJJChMSU5LKSAkXiAkKExJQlMpCisKKyQoREVTVERJUikvY2hhcmRhdGEubzogY2hhcmRhdGEuYyBjaGFyZGF0YS5oCisJJChDT01QSUxFKSAkPCAtbyAkQAorCiskKERFU1RESVIpL21pbmljaGVjay5vOiBtaW5pY2hlY2suYyBtaW5pY2hlY2suaAorCSQoQ09NUElMRSkgJDwgLW8gJEAKKworJChERVNURElSKS9ydW50ZXN0cy5vOiBydW50ZXN0cy5jIGNoYXJkYXRhLmgKKwkkKENPTVBJTEUpICQ8IC1vICRACisKKworJChCRU5DSE1BUkspOiAkKERFU1RESVIpL2JlbmNobWFyay5vICQoTEFVTkNIKQorCSQoTElOSykgJF4gJChMSUJTKSAtbG0KKworJChERVNURElSKS9iZW5jaG1hcmsubzogYmVuY2htYXJrL2JlbmNobWFyay5jCisJJChDT01QSUxFKSAkPCAtbyAkQApkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvYW1pZ2EvUkVBRE1FLnR4dCBiL2V4cGF0LTIuMC4xL2FtaWdhL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ5NTE4ZgotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2FtaWdhL1JFQURNRS50eHQKQEAgLTAsMCArMSw2NiBAQAorU1VNTUFSWQorPT09PT09PQorVGhpcyBpcyBhIHBvcnQgb2YgZXhwYXQgZm9yIEFtaWdhT1MgNC4wIHdoaWNoIGluY2x1ZGVzIHRoZQorU0RLLCBzb21lIFhNTCB0b29scyBhbmQgdGhlIGxpYnJhcmllcy4KKworQm90aCBzdGF0aWMgYW5kIHNoYXJlZCBsaWJyYXJ5IHZlcnNpb25zIGFyZSBzdXBwb3J0ZWQuCisKK1RoZSBzdGF0aWMgbGlicmFyeSB2ZXJzaW9uIGlzIGxpbWl0ZWQgdG8gY2xpYjIgYWx0aG91Z2ggaXQgc2hvdWxkCitiZSBwb3NzaWJsZSB0byB1c2UgbmV3bGliIHdpdGggdGhlIGFwcG9wcmlhdGUgY29tcGlsZSBvcHRpb25zLgorCitUaGUgc2hhcmVkIGxpYnJhcnkgdmVyc2lvbiBpcyBiYXNlZCBvbiB0aGUgd29yayBvZiBGcmVkcmlrIFdpa3N0cm9tCithbmQgaXMgY3VycmVudGx5IGxpbWl0ZWQgdG8gUFBDIG9ubHkuCisKKworSElTVE9SWQorPT09PT09PQorNC4yICAtIHVwZGF0ZWQgdG8gY29ycmVzcG9uZCB0byBFeHBhdCAyLjAuMSByZWxlYXNlCisgICAgIC0gYnVtcGVkIGNvcHlyaWdodCBiYW5uZXJzIGFuZCB2ZXJzaW9ucworICAgICAtIHNpbXBsaWZpZWQgYW1pZ2Fjb25maWcuaAorICAgICAtIHVwZGF0ZWQgaW5jbHVkZS9saWJyYXJpZXMvZXhwYXQuaCBmaWxlCisgICAgIC0gbW9kaWZpZWQgbGF1bmNoLmMgdG8gdXNlIGNvbnRydWN0b3IvZGVjb25zdHJ1Y3RvcgorICAgICAtIHJlbW92ZWQgbmVlZCBmb3IgYW1pZ2FfbWFpbigpIGZyb20gZXhwYXQgdXRpbGl0aWVzCisKKzQuMSAgLSBmaXhlZCBtZW1vcnkgZnJlZWluZyBidWcgaW4gc2hhcmVkIGxpYnJhcnkgdmVyc2lvbgorICAgICAtIG5vdyBhbGxvY2F0ZXMgc2hhcmVkIG1lbW9yeQorCis0LjAgIC0gdXBkYXRlZCBmb3IgY29ycmVzcG9uZGluZyBFeHBhdCAyLjAgcmVsZWFzZQorICAgICAtIHNvbWUgbWlub3IgQ1ZTIHJlbGF0ZWQgY2hhbmdlcworCiszLjEgIC0gcmVtb3ZlZCBvYnNvbGV0ZSBzZmQgZmlsZQorICAgICAtIGFkZGVkIGxpYnJhcnkgZGVzY3JpcHRpb24geG1sIGZpbGUKKyAgICAgLSByZWZhY3RvcmVkIE1ha2VmaWxlCisgICAgIC0gcmVtb3ZlZCBleHRyYW5lb3VzIFZBUkFSR1M2OEsga2V5d29yZHMKKyAgICAgLSByZXdvcmtlZCBkZWZhdWx0IG1lbW9yeSBoYW5kbGluZyBmdW5jdGlvbnMgaW4gc2hhcmVkIGxpYgorICAgICAtIHVwZGF0ZWQgYW1pZ2Fjb25maWcuaAorCiszLjAgIC0gaW5pdGlhbCByZWxlYXNlCisgICAgIC0gYmFzZWQgb24gZXhwYXQgMS45NS44CisKKworQlVJTERJTkcKKz09PT09PT09CitUbyBidWlsZCBleHBhdC5saWJyYXJ5LCB4bWx3ZiB0b29sLCBleGFtcGxlcyBhbmQgcnVuIHRoZSB0ZXN0IHN1aXRlLAorc2ltcGx5IHR5cGUgJ21ha2UgYWxsJyBpbiB0aGUgYW1pZ2Egc3ViZGlyZWN0b3J5LgorCitUaGUgdGVzdCBzdWl0ZSB3aWxsIGNvbXBpbGUgYW5kIHJ1biBmb3IgYm90aCB0aGUgc3RhdGljIGFuZCBzaGFyZWQKK2xpYnJhcnkgdmVyc2lvbnMuCisKKworSU5TVEFMTEFUSU9OCis9PT09PT09PT09PT0KK1RvIGluc3RhbGwgYm90aCBzdGF0aWMgYW5kIHNoYXJlZCB2ZXJzaW9ucyBvZiBleHBhdCBpbnRvIHRoZQorQW1pZ2FPUyBTREsgdHlwZSAnbWFrZSBpbnN0YWxsJyBpbiB0aGUgYW1pZ2Egc3ViZGlyZWN0b3J5LgorCisKK0NPTkZJR1VSQVRJT04KKz09PT09PT09PT09PT0KK1lvdSBtYXkgd2FudCB0byBlZGl0IHRoZSBsaWIvYW1pZ2Fjb25maWcuaCBmaWxlIHRvIHJlbW92ZQorRFREIGFuZC9vciBYTUwgbmFtZXNwYWNlIHN1cHBvcnQgaWYgdGhleSBhcmUgbm90IHJlcXVpcmVkIGJ5IHlvdXIKK3NwZWNpZmljIGFwcGxpY2F0aW9uIGZvciBhIHNtYWxsZXIgYW5kIGZhc3RlciBpbXBsZW1lbnRhdGlvbi4KKworCitUTyBETworPT09PT0KKy0gd2lkZSBjaGFyYWN0ZXIgc3VwcG9ydCAoVVRGLTE2KQorLSBwcm92aWRlIDY4ayBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvYW1pZ2EvZXhwYXQueG1sIGIvZXhwYXQtMi4wLjEvYW1pZ2EvZXhwYXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YWVhZTIKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9hbWlnYS9leHBhdC54bWwKQEAgLTAsMCArMSwyNjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KKzwhRE9DVFlQRSBsaWJyYXJ5IFNZU1RFTSAibGlicmFyeS5kdGQiPgorPCEtLSBhdXRvZ2VuZXJhdGVkIGJ5IGZkdHJhbnMgdjUxLjE2IC0tPgorPGxpYnJhcnkgbmFtZT0iZXhwYXQiIGJhc2VuYW1lPSJFeHBhdEJhc2UiIGJhc2V0eXBlPSJMaWJyYXJ5IiBvcGVubmFtZT0iZXhwYXQubGlicmFyeSI+CisJPGluY2x1ZGU+bGlicmFyaWVzL2V4cGF0Lmg8L2luY2x1ZGU+CisJPGludGVyZmFjZSBuYW1lPSJtYWluIiB2ZXJzaW9uPSIxLjAiIHN0cnVjdD0iRXhwYXRJRmFjZSIgcHJlZml4PSJfRXhwYXRfIiBhc21wcmVmaXg9IklFeHBhdCIgZ2xvYmFsPSJJRXhwYXQiPgorCQk8bWV0aG9kIG5hbWU9Ik9idGFpbiIgcmVzdWx0PSJ1aW50MzIiLz4KKwkJPG1ldGhvZCBuYW1lPSJSZWxlYXNlIiByZXN1bHQ9InVpbnQzMiIvPgorCQk8bWV0aG9kIG5hbWU9IkV4cHVuZ2UiIHJlc3VsdD0idm9pZCIgc3RhdHVzPSJ1bmltcGxlbWVudGVkIi8+CisJCTxtZXRob2QgbmFtZT0iQ2xvbmUiIHJlc3VsdD0ic3RydWN0IEludGVyZmFjZSAqIiBzdGF0dXM9InVuaW1wbGVtZW50ZWQiLz4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfUGFyc2VyQ3JlYXRlIiByZXN1bHQ9IlhNTF9QYXJzZXIiPgorCQkJPGFyZyBuYW1lPSJlbmNvZGluZ05hbWUiIHR5cGU9ImNvbnN0IFhNTF9DaGFyICoiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1BhcnNlckNyZWF0ZU5TIiByZXN1bHQ9IlhNTF9QYXJzZXIiPgorCQkJPGFyZyBuYW1lPSJlbmNvZGluZ05hbWUiIHR5cGU9ImNvbnN0IFhNTF9DaGFyICoiLz4KKwkJCTxhcmcgbmFtZT0ibnNTZXAiIHR5cGU9IlhNTF9DaGFyIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9QYXJzZXJDcmVhdGVfTU0iIHJlc3VsdD0iWE1MX1BhcnNlciI+CisJCQk8YXJnIG5hbWU9ImVuY29kaW5nIiB0eXBlPSJjb25zdCBYTUxfQ2hhciAqIi8+CisJCQk8YXJnIG5hbWU9Im1lbXN1aXRlIiB0eXBlPSJjb25zdCBYTUxfTWVtb3J5X0hhbmRsaW5nX1N1aXRlICoiLz4KKwkJCTxhcmcgbmFtZT0ibmFtZXNwYWNlU2VwYXJhdG9yIiB0eXBlPSJjb25zdCBYTUxfQ2hhciAqIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZSIgcmVzdWx0PSJYTUxfUGFyc2VyIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9ImNvbnRleHQiIHR5cGU9ImNvbnN0IFhNTF9DaGFyICoiLz4KKwkJCTxhcmcgbmFtZT0iZW5jb2RpbmciIHR5cGU9ImNvbnN0IFhNTF9DaGFyICoiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1BhcnNlckZyZWUiIHJlc3VsdD0idm9pZCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfUGFyc2UiIHJlc3VsdD0iZW51bSBYTUxfU3RhdHVzIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9InMiIHR5cGU9ImNvbnN0IGNoYXIgKiIvPgorCQkJPGFyZyBuYW1lPSJsZW4iIHR5cGU9ImludCIvPgorCQkJPGFyZyBuYW1lPSJpc0ZpbmFsIiB0eXBlPSJpbnQiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1BhcnNlQnVmZmVyIiByZXN1bHQ9ImVudW0gWE1MX1N0YXR1cyI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJsZW4iIHR5cGU9ImludCIvPgorCQkJPGFyZyBuYW1lPSJpc0ZpbmFsIiB0eXBlPSJpbnQiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX0dldEJ1ZmZlciIgcmVzdWx0PSJ2b2lkICoiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJCTxhcmcgbmFtZT0ibGVuIiB0eXBlPSJpbnQiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1NldFN0YXJ0RWxlbWVudEhhbmRsZXIiIHJlc3VsdD0idm9pZCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJzdGFydCIgdHlwZT0iWE1MX1N0YXJ0RWxlbWVudEhhbmRsZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1NldEVuZEVsZW1lbnRIYW5kbGVyIiByZXN1bHQ9InZvaWQiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJCTxhcmcgbmFtZT0iZW5kIiB0eXBlPSJYTUxfRW5kRWxlbWVudEhhbmRsZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1NldEVsZW1lbnRIYW5kbGVyIiByZXN1bHQ9InZvaWQiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJCTxhcmcgbmFtZT0ic3RhcnQiIHR5cGU9IlhNTF9TdGFydEVsZW1lbnRIYW5kbGVyIi8+CisJCQk8YXJnIG5hbWU9ImVuZCIgdHlwZT0iWE1MX0VuZEVsZW1lbnRIYW5kbGVyIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlciIgcmVzdWx0PSJ2b2lkIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9ImhhbmRsZXIiIHR5cGU9IlhNTF9DaGFyYWN0ZXJEYXRhSGFuZGxlciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfU2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlciIgcmVzdWx0PSJ2b2lkIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9ImhhbmRsZXIiIHR5cGU9IlhNTF9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9TZXRDb21tZW50SGFuZGxlciIgcmVzdWx0PSJ2b2lkIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9ImhhbmRsZXIiIHR5cGU9IlhNTF9Db21tZW50SGFuZGxlciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfU2V0U3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyIiByZXN1bHQ9InZvaWQiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJCTxhcmcgbmFtZT0ic3RhcnQiIHR5cGU9IlhNTF9TdGFydENkYXRhU2VjdGlvbkhhbmRsZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1NldEVuZENkYXRhU2VjdGlvbkhhbmRsZXIiIHJlc3VsdD0idm9pZCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJlbmQiIHR5cGU9IlhNTF9FbmRDZGF0YVNlY3Rpb25IYW5kbGVyIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9TZXRDZGF0YVNlY3Rpb25IYW5kbGVyIiByZXN1bHQ9InZvaWQiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJCTxhcmcgbmFtZT0ic3RhcnQiIHR5cGU9IlhNTF9TdGFydENkYXRhU2VjdGlvbkhhbmRsZXIiLz4KKwkJCTxhcmcgbmFtZT0iZW5kIiB0eXBlPSJYTUxfRW5kQ2RhdGFTZWN0aW9uSGFuZGxlciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfU2V0RGVmYXVsdEhhbmRsZXIiIHJlc3VsdD0idm9pZCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJoYW5kbGVyIiB0eXBlPSJYTUxfRGVmYXVsdEhhbmRsZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1NldERlZmF1bHRIYW5kbGVyRXhwYW5kIiByZXN1bHQ9InZvaWQiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJCTxhcmcgbmFtZT0iaGFuZGxlciIgdHlwZT0iWE1MX0RlZmF1bHRIYW5kbGVyIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIiIHJlc3VsdD0idm9pZCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJoYW5kbGVyIiB0eXBlPSJYTUxfRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmciIHJlc3VsdD0idm9pZCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJhcmciIHR5cGU9InZvaWQgKiIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfU2V0VW5rbm93bkVuY29kaW5nSGFuZGxlciIgcmVzdWx0PSJ2b2lkIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9ImhhbmRsZXIiIHR5cGU9IlhNTF9Vbmtub3duRW5jb2RpbmdIYW5kbGVyIi8+CisJCQk8YXJnIG5hbWU9ImRhdGEiIHR5cGU9InZvaWQgKiIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfU2V0U3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciIgcmVzdWx0PSJ2b2lkIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9InN0YXJ0IiB0eXBlPSJYTUxfU3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfU2V0RW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIiIHJlc3VsdD0idm9pZCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJlbmQiIHR5cGU9IlhNTF9FbmROYW1lc3BhY2VEZWNsSGFuZGxlciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfU2V0TmFtZXNwYWNlRGVjbEhhbmRsZXIiIHJlc3VsdD0idm9pZCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJzdGFydCIgdHlwZT0iWE1MX1N0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIiLz4KKwkJCTxhcmcgbmFtZT0iZW5kIiB0eXBlPSJYTUxfRW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1NldFhtbERlY2xIYW5kbGVyIiByZXN1bHQ9InZvaWQiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJCTxhcmcgbmFtZT0iaGFuZGxlciIgdHlwZT0iWE1MX1htbERlY2xIYW5kbGVyIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9TZXRTdGFydERvY3R5cGVEZWNsSGFuZGxlciIgcmVzdWx0PSJ2b2lkIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9InN0YXJ0IiB0eXBlPSJYTUxfU3RhcnREb2N0eXBlRGVjbEhhbmRsZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1NldEVuZERvY3R5cGVEZWNsSGFuZGxlciIgcmVzdWx0PSJ2b2lkIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9ImVuZCIgdHlwZT0iWE1MX0VuZERvY3R5cGVEZWNsSGFuZGxlciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfU2V0RG9jdHlwZURlY2xIYW5kbGVyIiByZXN1bHQ9InZvaWQiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJCTxhcmcgbmFtZT0ic3RhcnQiIHR5cGU9IlhNTF9TdGFydERvY3R5cGVEZWNsSGFuZGxlciIvPgorCQkJPGFyZyBuYW1lPSJlbmQiIHR5cGU9IlhNTF9FbmREb2N0eXBlRGVjbEhhbmRsZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1NldEVsZW1lbnREZWNsSGFuZGxlciIgcmVzdWx0PSJ2b2lkIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9ImVsZGVjbCIgdHlwZT0iWE1MX0VsZW1lbnREZWNsSGFuZGxlciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfU2V0QXR0bGlzdERlY2xIYW5kbGVyIiByZXN1bHQ9InZvaWQiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJCTxhcmcgbmFtZT0iYXR0ZGVjbCIgdHlwZT0iWE1MX0F0dGxpc3REZWNsSGFuZGxlciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfU2V0RW50aXR5RGVjbEhhbmRsZXIiIHJlc3VsdD0idm9pZCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJoYW5kbGVyIiB0eXBlPSJYTUxfRW50aXR5RGVjbEhhbmRsZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1NldFVucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIiIHJlc3VsdD0idm9pZCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJoYW5kbGVyIiB0eXBlPSJYTUxfVW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfU2V0Tm90YXRpb25EZWNsSGFuZGxlciIgcmVzdWx0PSJ2b2lkIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9ImhhbmRsZXIiIHR5cGU9IlhNTF9Ob3RhdGlvbkRlY2xIYW5kbGVyIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9TZXROb3RTdGFuZGFsb25lSGFuZGxlciIgcmVzdWx0PSJ2b2lkIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9ImhhbmRsZXIiIHR5cGU9IlhNTF9Ob3RTdGFuZGFsb25lSGFuZGxlciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfR2V0RXJyb3JDb2RlIiByZXN1bHQ9ImVudW0gWE1MX0Vycm9yIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9FcnJvclN0cmluZyIgcmVzdWx0PSJjb25zdCBYTUxfTENoYXIgKiI+CisJCQk8YXJnIG5hbWU9ImNvZGUiIHR5cGU9ImVudW0gWE1MX0Vycm9yIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9HZXRDdXJyZW50Qnl0ZUluZGV4IiByZXN1bHQ9ImxvbmciPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyIiByZXN1bHQ9ImludCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlciIgcmVzdWx0PSJpbnQiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX0dldEN1cnJlbnRCeXRlQ291bnQiIHJlc3VsdD0iaW50Ij4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9HZXRJbnB1dENvbnRleHQiIHJlc3VsdD0iY29uc3QgY2hhciAqIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50ICoiLz4KKwkJCTxhcmcgbmFtZT0ic2l6ZSIgdHlwZT0iaW50ICoiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1NldFVzZXJEYXRhIiByZXN1bHQ9InZvaWQiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJCTxhcmcgbmFtZT0idXNlckRhdGEiIHR5cGU9InZvaWQgKiIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfRGVmYXVsdEN1cnJlbnQiIHJlc3VsdD0idm9pZCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfVXNlUGFyc2VyQXNIYW5kbGVyQXJnIiByZXN1bHQ9InZvaWQiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1NldEJhc2UiIHJlc3VsdD0iZW51bSBYTUxfU3RhdHVzIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9ImJhc2UiIHR5cGU9ImNvbnN0IFhNTF9DaGFyICoiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX0dldEJhc2UiIHJlc3VsdD0iY29uc3QgWE1MX0NoYXIgKiI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfR2V0U3BlY2lmaWVkQXR0cmlidXRlQ291bnQiIHJlc3VsdD0iaW50Ij4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9HZXRJZEF0dHJpYnV0ZUluZGV4IiByZXN1bHQ9ImludCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfU2V0RW5jb2RpbmciIHJlc3VsdD0iZW51bSBYTUxfU3RhdHVzIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9ImVuY29kaW5nIiB0eXBlPSJjb25zdCBYTUxfQ2hhciAqIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9TZXRQYXJhbUVudGl0eVBhcnNpbmciIHJlc3VsdD0iaW50Ij4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9InBhcnNpbmciIHR5cGU9ImVudW0gWE1MX1BhcmFtRW50aXR5UGFyc2luZyIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfU2V0UmV0dXJuTlNUcmlwbGV0IiByZXN1bHQ9InZvaWQiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJCTxhcmcgbmFtZT0iZG9fbnN0IiB0eXBlPSJpbnQiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX0V4cGF0VmVyc2lvbiIgcmVzdWx0PSJjb25zdCBYTUxfTENoYXIgKiI+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9FeHBhdFZlcnNpb25JbmZvIiByZXN1bHQ9IlhNTF9FeHBhdF9WZXJzaW9uIj4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1BhcnNlclJlc2V0IiByZXN1bHQ9IlhNTF9Cb29sIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9ImVuY29kaW5nIiB0eXBlPSJjb25zdCBYTUxfQ2hhciAqIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9TZXRTa2lwcGVkRW50aXR5SGFuZGxlciIgcmVzdWx0PSJ2b2lkIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9ImhhbmRsZXIiIHR5cGU9IlhNTF9Ta2lwcGVkRW50aXR5SGFuZGxlciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfVXNlRm9yZWlnbkRURCIgcmVzdWx0PSJlbnVtIFhNTF9FcnJvciI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJ1c2VEVEQiIHR5cGU9IlhNTF9Cb29sIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9HZXRGZWF0dXJlTGlzdCIgcmVzdWx0PSJjb25zdCBYTUxfRmVhdHVyZSAqIj4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1N0b3BQYXJzZXIiIHJlc3VsdD0iZW51bSBYTUxfU3RhdHVzIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9InJlc3VtYWJsZSIgdHlwZT0iWE1MX0Jvb2wiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1Jlc3VtZVBhcnNlciIgcmVzdWx0PSJlbnVtIFhNTF9TdGF0dXMiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX0dldFBhcnNpbmdTdGF0dXMiIHJlc3VsdD0idm9pZCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJzdGF0dXMiIHR5cGU9IlhNTF9QYXJzaW5nU3RhdHVzICoiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX0ZyZWVDb250ZW50TW9kZWwiIHJlc3VsdD0idm9pZCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJtb2RlbCIgdHlwZT0iWE1MX0NvbnRlbnQgKiIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfTWVtTWFsbG9jIiByZXN1bHQ9InZvaWQgKiI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJzaXplIiB0eXBlPSJzaXplX3QiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX01lbVJlYWxsb2MiIHJlc3VsdD0idm9pZCAqIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9InB0ciIgdHlwZT0idm9pZCAqIi8+CisJCQk8YXJnIG5hbWU9InNpemUiIHR5cGU9InNpemVfdCIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfTWVtRnJlZSIgcmVzdWx0PSJ2b2lkIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9InB0ciIgdHlwZT0idm9pZCAqIi8+CisJCTwvbWV0aG9kPgorCTwvaW50ZXJmYWNlPgorPC9saWJyYXJ5PgpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvYW1pZ2EvZXhwYXRfbGliLmMgYi9leHBhdC0yLjAuMS9hbWlnYS9leHBhdF9saWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzljNDhkCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYW1pZ2EvZXhwYXRfbGliLmMKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisqKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNyBFeHBhdCBtYWludGFpbmVycy4KKyoqCisqKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyoqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorKiogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworKiogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorKiogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisqKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyoqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyoqIAorKiogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyoqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorKiogCisqKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyoqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorKiogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorKiogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyoqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisqKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorKiogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisqLworCisjaW5jbHVkZSA8ZG9zL2Rvcy5oPgorI2luY2x1ZGUgPHByb3RvL2V4ZWMuaD4KKworI2RlZmluZSBMSUJOQU1FCQkiZXhwYXQubGlicmFyeSIKKyNkZWZpbmUgTElCUFJJCQkwCisjZGVmaW5lIFZFUlNJT04JCTQKKyNkZWZpbmUgUkVWSVNJT04JMgorI2RlZmluZSBWU1RSSU5HCQkiZXhwYXQubGlicmFyeSA0LjIgKDIuNi4yMDA3KSIgIC8qIGRkLm1tLnl5eXkgKi8KKworCitzdGF0aWMgY29uc3QgY2hhciogX19hdHRyaWJ1dGVfXygodXNlZCkpIHZlcnN0YWcgPSAiXDAkVkVSOiAiIFZTVFJJTkc7CisKKworc3RydWN0IEV4cGF0QmFzZSB7CisJc3RydWN0IExpYnJhcnkgbGliTm9kZTsKKwl1aW50MTYgcGFkOworCUJQVFIgU2VnTGlzdDsKK307CisKKworc3RydWN0IEV4cGF0QmFzZSAqIGxpYkluaXQoc3RydWN0IEV4cGF0QmFzZSAqbGliQmFzZSwgQlBUUiBzZWdsaXN0LCBzdHJ1Y3QgRXhlY0lGYWNlICpJU3lzKTsKK3VpbnQzMiBsaWJPYnRhaW4gKHN0cnVjdCBMaWJyYXJ5TWFuYWdlckludGVyZmFjZSAqU2VsZik7Cit1aW50MzIgbGliUmVsZWFzZSAoc3RydWN0IExpYnJhcnlNYW5hZ2VySW50ZXJmYWNlICpTZWxmKTsKK3N0cnVjdCBFeHBhdEJhc2UgKmxpYk9wZW4gKHN0cnVjdCBMaWJyYXJ5TWFuYWdlckludGVyZmFjZSAqU2VsZiwgdWludDMyIHZlcnNpb24pOworQlBUUiBsaWJDbG9zZSAoc3RydWN0IExpYnJhcnlNYW5hZ2VySW50ZXJmYWNlICpTZWxmKTsKK0JQVFIgbGliRXhwdW5nZSAoc3RydWN0IExpYnJhcnlNYW5hZ2VySW50ZXJmYWNlICpTZWxmKTsKKworCitzdGF0aWMgQVBUUiBsaWJfbWFuYWdlcl92ZWN0b3JzW10gPSB7CisJbGliT2J0YWluLAorCWxpYlJlbGVhc2UsCisJTlVMTCwKKwlOVUxMLAorCWxpYk9wZW4sCisJbGliQ2xvc2UsCisJbGliRXhwdW5nZSwKKwlOVUxMLAorCShBUFRSKS0xLAorfTsKKworCitzdGF0aWMgc3RydWN0IFRhZ0l0ZW0gbGliX21hbmFnZXJUYWdzW10gPSB7CisJeyBNSVRfTmFtZSwgKHVpbnQzMikiX19saWJyYXJ5IiB9LAorCXsgTUlUX1ZlY3RvclRhYmxlLCAodWludDMyKWxpYl9tYW5hZ2VyX3ZlY3RvcnMgfSwKKwl7IE1JVF9WZXJzaW9uLCAxIH0sCisJeyBUQUdfRU5ELCAwIH0KK307CisKKworZXh0ZXJuIHZvaWQgKm1haW5fdmVjdG9yc1tdOworCitzdGF0aWMgc3RydWN0IFRhZ0l0ZW0gbGliX21haW5UYWdzW10gPSB7CisJeyBNSVRfTmFtZSwgKHVpbnQzMikibWFpbiIgfSwKKwl7IE1JVF9WZWN0b3JUYWJsZSwgKHVpbnQzMiltYWluX3ZlY3RvcnMgfSwKKwl7IE1JVF9WZXJzaW9uLCAxIH0sCisJeyBUQUdfRU5ELCAwIH0KK307CisKKworc3RhdGljIEFQVFIgbGliSW50ZXJmYWNlc1tdID0geworCWxpYl9tYW5hZ2VyVGFncywKKwlsaWJfbWFpblRhZ3MsCisJTlVMTAorfTsKKworCitzdGF0aWMgc3RydWN0IFRhZ0l0ZW0gbGliQ3JlYXRlVGFnc1tdID0geworCXsgQ0xUX0RhdGFTaXplLCBzaXplb2Yoc3RydWN0IEV4cGF0QmFzZSkgfSwKKwl7IENMVF9Jbml0RnVuYywgKHVpbnQzMilsaWJJbml0IH0sCisJeyBDTFRfSW50ZXJmYWNlcywgKHVpbnQzMilsaWJJbnRlcmZhY2VzIH0sCisJeyBUQUdfRU5ELCAwIH0KK307CisKKworc3RhdGljIHN0cnVjdCBSZXNpZGVudCBfX2F0dHJpYnV0ZV9fKCh1c2VkKSkgbGliX3JlcyA9IHsKKwlSVENfTUFUQ0hXT1JELAkvLyBydF9NYXRjaFdvcmQKKwkmbGliX3JlcywJCS8vIHJ0X01hdGNoVGFnCisJJmxpYl9yZXMrMSwJCS8vIHJ0X0VuZFNraXAKKwlSVEZfTkFUSVZFIHwgUlRGX0FVVE9JTklULAkvLyBydF9GbGFncworCVZFUlNJT04sCQkvLyBydF9WZXJzaW9uCisJTlRfTElCUkFSWSwJCS8vIHJ0X1R5cGUKKwlMSUJQUkksCQkJLy8gcnRfUHJpCisJTElCTkFNRSwJCS8vIHJ0X05hbWUKKwlWU1RSSU5HLAkJLy8gcnRfSWRTdHJpbmcKKwlsaWJDcmVhdGVUYWdzCS8vIHJ0X0luaXQKK307CisKKworc3RydWN0IExpYnJhcnkgKkRPU0xpYiA9IDA7CitzdHJ1Y3QgTGlicmFyeSAqVXRpbGl0eUJhc2UgPSAwOworCitzdHJ1Y3QgRXhlY0lGYWNlICpJRXhlYyA9IDA7CitzdHJ1Y3QgRE9TSUZhY2UgKklET1MgPSAwOworc3RydWN0IFV0aWxpdHlJRmFjZSAqSVV0aWxpdHkgPSAwOworCisKK3ZvaWQgX3N0YXJ0KCkKK3sKK30KKworCitzdHJ1Y3QgRXhwYXRCYXNlICpsaWJJbml0KHN0cnVjdCBFeHBhdEJhc2UgKmxpYkJhc2UsIEJQVFIgc2VnbGlzdCwgc3RydWN0IEV4ZWNJRmFjZSAqSVN5cykKK3sKKwlsaWJCYXNlLT5saWJOb2RlLmxpYl9Ob2RlLmxuX1R5cGUgPSBOVF9MSUJSQVJZOworCWxpYkJhc2UtPmxpYk5vZGUubGliX05vZGUubG5fUHJpID0gTElCUFJJOworCWxpYkJhc2UtPmxpYk5vZGUubGliX05vZGUubG5fTmFtZSA9IExJQk5BTUU7CisJbGliQmFzZS0+bGliTm9kZS5saWJfRmxhZ3MgPSBMSUJGX1NVTVVTRUR8TElCRl9DSEFOR0VEOworCWxpYkJhc2UtPmxpYk5vZGUubGliX1ZlcnNpb24gPSBWRVJTSU9OOworCWxpYkJhc2UtPmxpYk5vZGUubGliX1JldmlzaW9uID0gUkVWSVNJT047CisJbGliQmFzZS0+bGliTm9kZS5saWJfSWRTdHJpbmcgPSBWU1RSSU5HOworCWxpYkJhc2UtPlNlZ0xpc3QgPSBzZWdsaXN0OworCisJSUV4ZWMgPSBJU3lzOworCisJRE9TTGliID0gT3BlbkxpYnJhcnkoImRvcy5saWJyYXJ5IiwgNTEpOworCWlmICggRE9TTGliICE9IDAgKSAgeworCQlJRE9TID0gKHN0cnVjdCBET1NJRmFjZSAqKUdldEludGVyZmFjZShET1NMaWIsICJtYWluIiwgMSwgTlVMTCk7CisJCWlmICggSURPUyAhPSAwICkgIHsKKwkJCVV0aWxpdHlCYXNlID0gT3BlbkxpYnJhcnkoInV0aWxpdHkubGlicmFyeSIsIDUxKTsKKwkJCWlmICggVXRpbGl0eUJhc2UgIT0gMCApICB7CisJCQkJSVV0aWxpdHkgPSAoc3RydWN0IFV0aWxpdHlJRmFjZSopR2V0SW50ZXJmYWNlKFV0aWxpdHlCYXNlLCAibWFpbiIsIDEsIE5VTEwpOworCQkJCWlmICggSVV0aWxpdHkgIT0gMCApICB7CisJCQkJCXJldHVybiBsaWJCYXNlOworCQkJCX0KKworCQkJCUNsb3NlTGlicmFyeShVdGlsaXR5QmFzZSk7CisJCQl9CisKKwkJCURyb3BJbnRlcmZhY2UoKHN0cnVjdCBJbnRlcmZhY2UgKilJRE9TKTsKKwkJfQorCisJCUNsb3NlTGlicmFyeShET1NMaWIpOworCX0KKworCXJldHVybiBOVUxMOworfQorCisKK3VpbnQzMiBsaWJPYnRhaW4oIHN0cnVjdCBMaWJyYXJ5TWFuYWdlckludGVyZmFjZSAqU2VsZiApCit7CisJKytTZWxmLT5EYXRhLlJlZkNvdW50OworCXJldHVybiBTZWxmLT5EYXRhLlJlZkNvdW50OworfQorCisKK3VpbnQzMiBsaWJSZWxlYXNlKCBzdHJ1Y3QgTGlicmFyeU1hbmFnZXJJbnRlcmZhY2UgKlNlbGYgKQoreworCS0tU2VsZi0+RGF0YS5SZWZDb3VudDsKKwlyZXR1cm4gU2VsZi0+RGF0YS5SZWZDb3VudDsKK30KKworCitzdHJ1Y3QgRXhwYXRCYXNlICpsaWJPcGVuKCBzdHJ1Y3QgTGlicmFyeU1hbmFnZXJJbnRlcmZhY2UgKlNlbGYsIHVpbnQzMiB2ZXJzaW9uICkKK3sKKwlzdHJ1Y3QgRXhwYXRCYXNlICpsaWJCYXNlOworCisJbGliQmFzZSA9IChzdHJ1Y3QgRXhwYXRCYXNlICopU2VsZi0+RGF0YS5MaWJCYXNlOworCisJKytsaWJCYXNlLT5saWJOb2RlLmxpYl9PcGVuQ250OworCWxpYkJhc2UtPmxpYk5vZGUubGliX0ZsYWdzICY9IH5MSUJGX0RFTEVYUDsKKworCXJldHVybiBsaWJCYXNlOworfQorCisKK0JQVFIgbGliQ2xvc2UoIHN0cnVjdCBMaWJyYXJ5TWFuYWdlckludGVyZmFjZSAqU2VsZiApCit7CisJc3RydWN0IEV4cGF0QmFzZSAqbGliQmFzZTsKKworCWxpYkJhc2UgPSAoc3RydWN0IEV4cGF0QmFzZSAqKVNlbGYtPkRhdGEuTGliQmFzZTsKKworCS0tbGliQmFzZS0+bGliTm9kZS5saWJfT3BlbkNudDsKKwlpZiAoIGxpYkJhc2UtPmxpYk5vZGUubGliX09wZW5DbnQgKSB7CisJCXJldHVybiAwOworCX0KKworCWlmICggbGliQmFzZS0+bGliTm9kZS5saWJfRmxhZ3MgJiBMSUJGX0RFTEVYUCApIHsKKwkJcmV0dXJuIChCUFRSKVNlbGYtPkxpYkV4cHVuZ2UoKTsKKwl9CisJZWxzZSB7CisJCXJldHVybiAwOworCX0KK30KKworCitCUFRSIGxpYkV4cHVuZ2UoIHN0cnVjdCBMaWJyYXJ5TWFuYWdlckludGVyZmFjZSAqU2VsZiApCit7CisJc3RydWN0IEV4cGF0QmFzZSAqbGliQmFzZTsKKwlCUFRSIHJlc3VsdCA9IDA7CisKKwlsaWJCYXNlID0gKHN0cnVjdCBFeHBhdEJhc2UgKilTZWxmLT5EYXRhLkxpYkJhc2U7CisKKwlpZiAobGliQmFzZS0+bGliTm9kZS5saWJfT3BlbkNudCA9PSAwKSB7CisJCVJlbW92ZSgmbGliQmFzZS0+bGliTm9kZS5saWJfTm9kZSk7CisKKwkJcmVzdWx0ID0gbGliQmFzZS0+U2VnTGlzdDsKKworCQlEcm9wSW50ZXJmYWNlKChzdHJ1Y3QgSW50ZXJmYWNlICopSVV0aWxpdHkpOworCQlDbG9zZUxpYnJhcnkoVXRpbGl0eUJhc2UpOworCQlEcm9wSW50ZXJmYWNlKChzdHJ1Y3QgSW50ZXJmYWNlICopSURPUyk7CisJCUNsb3NlTGlicmFyeShET1NMaWIpOworCisJCURlbGV0ZUxpYnJhcnkoJmxpYkJhc2UtPmxpYk5vZGUpOworCX0KKwllbHNlIHsKKwkJbGliQmFzZS0+bGliTm9kZS5saWJfRmxhZ3MgfD0gTElCRl9ERUxFWFA7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2FtaWdhL2V4cGF0X3ZlY3RvcnMuYyBiL2V4cGF0LTIuMC4xL2FtaWdhL2V4cGF0X3ZlY3RvcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGZiM2JlCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYW1pZ2EvZXhwYXRfdmVjdG9ycy5jCkBAIC0wLDAgKzEsNTA1IEBACisvKgorKiogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDcgRXhwYXQgbWFpbnRhaW5lcnMuCisqKgorKiogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisqKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyoqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyoqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyoqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworKiogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisqKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisqKiAKKyoqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisqKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyoqIAorKiogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisqKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyoqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyoqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisqKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorKiogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyoqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorKi8KKworI2luY2x1ZGUgPGV4ZWMvdHlwZXMuaD4KKyNpbmNsdWRlIDxleGVjL2V4ZWMuaD4KKyNpbmNsdWRlIDxleGVjL2ludGVyZmFjZXMuaD4KKyNpbmNsdWRlIDxpbnRlcmZhY2VzL2V4cGF0Lmg+CisKK2V4dGVybiB1aW50MzIgICAgICAgICAgICAgICAgX0V4cGF0X09idGFpbihzdHJ1Y3QgRXhwYXRJRmFjZSAqKTsKK2V4dGVybiB1aW50MzIgICAgICAgICAgICAgICAgX0V4cGF0X1JlbGVhc2Uoc3RydWN0IEV4cGF0SUZhY2UgKik7CitleHRlcm4gWE1MX1BhcnNlciAgICAgICAgICAgIF9FeHBhdF9YTUxfUGFyc2VyQ3JlYXRlKHN0cnVjdCBFeHBhdElGYWNlICosIGNvbnN0IFhNTF9DaGFyICogZW5jb2RpbmdOYW1lKTsKK2V4dGVybiBYTUxfUGFyc2VyICAgICAgICAgICAgX0V4cGF0X1hNTF9QYXJzZXJDcmVhdGVOUyhzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBjb25zdCBYTUxfQ2hhciAqIGVuY29kaW5nTmFtZSwgWE1MX0NoYXIgbnNTZXApOworZXh0ZXJuIFhNTF9QYXJzZXIgICAgICAgICAgICBfRXhwYXRfWE1MX1BhcnNlckNyZWF0ZV9NTShzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBjb25zdCBYTUxfQ2hhciAqIGVuY29kaW5nLCBjb25zdCBYTUxfTWVtb3J5X0hhbmRsaW5nX1N1aXRlICogbWVtc3VpdGUsIGNvbnN0IFhNTF9DaGFyICogbmFtZXNwYWNlU2VwYXJhdG9yKTsKK2V4dGVybiBYTUxfUGFyc2VyICAgICAgICAgICAgX0V4cGF0X1hNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZShzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgWE1MX0NoYXIgKiBjb250ZXh0LCBjb25zdCBYTUxfQ2hhciAqIGVuY29kaW5nKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9QYXJzZXJGcmVlKHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyKTsKK2V4dGVybiBlbnVtIFhNTF9TdGF0dXMgICAgICAgX0V4cGF0X1hNTF9QYXJzZShzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgY2hhciAqIHMsIGludCBsZW4sIGludCBpc0ZpbmFsKTsKK2V4dGVybiBlbnVtIFhNTF9TdGF0dXMgICAgICAgX0V4cGF0X1hNTF9QYXJzZUJ1ZmZlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgaW50IGxlbiwgaW50IGlzRmluYWwpOworZXh0ZXJuIHZvaWQgKiAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX0dldEJ1ZmZlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgaW50IGxlbik7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgICAgIF9FeHBhdF9YTUxfU2V0U3RhcnRFbGVtZW50SGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1N0YXJ0RWxlbWVudEhhbmRsZXIgc3RhcnQpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX1NldEVuZEVsZW1lbnRIYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfRW5kRWxlbWVudEhhbmRsZXIgZW5kKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9TZXRFbGVtZW50SGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1N0YXJ0RWxlbWVudEhhbmRsZXIgc3RhcnQsIFhNTF9FbmRFbGVtZW50SGFuZGxlciBlbmQpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfQ2hhcmFjdGVyRGF0YUhhbmRsZXIgaGFuZGxlcik7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgICAgIF9FeHBhdF9YTUxfU2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1Byb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIgaGFuZGxlcik7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgICAgIF9FeHBhdF9YTUxfU2V0Q29tbWVudEhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Db21tZW50SGFuZGxlciBoYW5kbGVyKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9TZXRTdGFydENkYXRhU2VjdGlvbkhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9TdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgc3RhcnQpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX1NldEVuZENkYXRhU2VjdGlvbkhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9FbmRDZGF0YVNlY3Rpb25IYW5kbGVyIGVuZCk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgICAgIF9FeHBhdF9YTUxfU2V0Q2RhdGFTZWN0aW9uSGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1N0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlciBzdGFydCwgWE1MX0VuZENkYXRhU2VjdGlvbkhhbmRsZXIgZW5kKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9TZXREZWZhdWx0SGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0RlZmF1bHRIYW5kbGVyIGhhbmRsZXIpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX1NldERlZmF1bHRIYW5kbGVyRXhwYW5kKHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfRGVmYXVsdEhhbmRsZXIgaGFuZGxlcik7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgICAgIF9FeHBhdF9YTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIGhhbmRsZXIpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlckFyZyhzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgdm9pZCAqIGFyZyk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgICAgIF9FeHBhdF9YTUxfU2V0VW5rbm93bkVuY29kaW5nSGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1Vua25vd25FbmNvZGluZ0hhbmRsZXIgaGFuZGxlciwgdm9pZCAqIGRhdGEpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX1NldFN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9TdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyIHN0YXJ0KTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9TZXRFbmROYW1lc3BhY2VEZWNsSGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0VuZE5hbWVzcGFjZURlY2xIYW5kbGVyIGVuZCk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgICAgIF9FeHBhdF9YTUxfU2V0TmFtZXNwYWNlRGVjbEhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9TdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyIHN0YXJ0LCBYTUxfRW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIgZW5kKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9TZXRYbWxEZWNsSGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1htbERlY2xIYW5kbGVyIGhhbmRsZXIpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX1NldFN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfU3RhcnREb2N0eXBlRGVjbEhhbmRsZXIgc3RhcnQpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX1NldEVuZERvY3R5cGVEZWNsSGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0VuZERvY3R5cGVEZWNsSGFuZGxlciBlbmQpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX1NldERvY3R5cGVEZWNsSGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1N0YXJ0RG9jdHlwZURlY2xIYW5kbGVyIHN0YXJ0LCBYTUxfRW5kRG9jdHlwZURlY2xIYW5kbGVyIGVuZCk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgICAgIF9FeHBhdF9YTUxfU2V0RWxlbWVudERlY2xIYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfRWxlbWVudERlY2xIYW5kbGVyIGVsZGVjbCk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgICAgIF9FeHBhdF9YTUxfU2V0QXR0bGlzdERlY2xIYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfQXR0bGlzdERlY2xIYW5kbGVyIGF0dGRlY2wpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX1NldEVudGl0eURlY2xIYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfRW50aXR5RGVjbEhhbmRsZXIgaGFuZGxlcik7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgICAgIF9FeHBhdF9YTUxfU2V0VW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1VucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIgaGFuZGxlcik7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgICAgIF9FeHBhdF9YTUxfU2V0Tm90YXRpb25EZWNsSGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX05vdGF0aW9uRGVjbEhhbmRsZXIgaGFuZGxlcik7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgICAgIF9FeHBhdF9YTUxfU2V0Tm90U3RhbmRhbG9uZUhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Ob3RTdGFuZGFsb25lSGFuZGxlciBoYW5kbGVyKTsKK2V4dGVybiBlbnVtIFhNTF9FcnJvciAgICAgICAgX0V4cGF0X1hNTF9HZXRFcnJvckNvZGUoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIpOworZXh0ZXJuIGNvbnN0IFhNTF9MQ2hhciAqICAgICBfRXhwYXRfWE1MX0Vycm9yU3RyaW5nKHN0cnVjdCBFeHBhdElGYWNlICosIGVudW0gWE1MX0Vycm9yIGNvZGUpOworZXh0ZXJuIGxvbmcgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX0dldEN1cnJlbnRCeXRlSW5kZXgoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIpOworZXh0ZXJuIGludCAgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyKHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyKTsKK2V4dGVybiBpbnQgICAgICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyKHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyKTsKK2V4dGVybiBpbnQgICAgICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9HZXRDdXJyZW50Qnl0ZUNvdW50KHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyKTsKK2V4dGVybiBjb25zdCBjaGFyICogICAgICAgICAgX0V4cGF0X1hNTF9HZXRJbnB1dENvbnRleHQoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIGludCAqIG9mZnNldCwgaW50ICogc2l6ZSk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgICAgIF9FeHBhdF9YTUxfU2V0VXNlckRhdGEoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIHZvaWQgKiB1c2VyRGF0YSk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgICAgIF9FeHBhdF9YTUxfRGVmYXVsdEN1cnJlbnQoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX1VzZVBhcnNlckFzSGFuZGxlckFyZyhzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlcik7CitleHRlcm4gZW51bSBYTUxfU3RhdHVzICAgICAgIF9FeHBhdF9YTUxfU2V0QmFzZShzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgWE1MX0NoYXIgKiBiYXNlKTsKK2V4dGVybiBjb25zdCBYTUxfQ2hhciAqICAgICAgX0V4cGF0X1hNTF9HZXRCYXNlKHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyKTsKK2V4dGVybiBpbnQgICAgICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9HZXRTcGVjaWZpZWRBdHRyaWJ1dGVDb3VudChzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlcik7CitleHRlcm4gaW50ICAgICAgICAgICAgICAgICAgIF9FeHBhdF9YTUxfR2V0SWRBdHRyaWJ1dGVJbmRleChzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlcik7CitleHRlcm4gZW51bSBYTUxfU3RhdHVzICAgICAgIF9FeHBhdF9YTUxfU2V0RW5jb2Rpbmcoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICogZW5jb2RpbmcpOworZXh0ZXJuIGludCAgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX1NldFBhcmFtRW50aXR5UGFyc2luZyhzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgZW51bSBYTUxfUGFyYW1FbnRpdHlQYXJzaW5nIHBhcnNpbmcpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX1NldFJldHVybk5TVHJpcGxldChzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgaW50IGRvX25zdCk7CitleHRlcm4gY29uc3QgWE1MX0xDaGFyICogICAgIF9FeHBhdF9YTUxfRXhwYXRWZXJzaW9uKHN0cnVjdCBFeHBhdElGYWNlICopOworZXh0ZXJuIFhNTF9FeHBhdF9WZXJzaW9uICAgICBfRXhwYXRfWE1MX0V4cGF0VmVyc2lvbkluZm8oc3RydWN0IEV4cGF0SUZhY2UgKik7CitleHRlcm4gWE1MX0Jvb2wgICAgICAgICAgICAgIF9FeHBhdF9YTUxfUGFyc2VyUmVzZXQoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICogZW5jb2RpbmcpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX1NldFNraXBwZWRFbnRpdHlIYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfU2tpcHBlZEVudGl0eUhhbmRsZXIgaGFuZGxlcik7CitleHRlcm4gZW51bSBYTUxfRXJyb3IgICAgICAgIF9FeHBhdF9YTUxfVXNlRm9yZWlnbkRURChzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0Jvb2wgdXNlRFREKTsKK2V4dGVybiBjb25zdCBYTUxfRmVhdHVyZSAqICAgX0V4cGF0X1hNTF9HZXRGZWF0dXJlTGlzdChzdHJ1Y3QgRXhwYXRJRmFjZSAqKTsKK2V4dGVybiBlbnVtIFhNTF9TdGF0dXMgICAgICAgX0V4cGF0X1hNTF9TdG9wUGFyc2VyKHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfQm9vbCByZXN1bWFibGUpOworZXh0ZXJuIGVudW0gWE1MX1N0YXR1cyAgICAgICBfRXhwYXRfWE1MX1Jlc3VtZVBhcnNlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlcik7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgICAgIF9FeHBhdF9YTUxfR2V0UGFyc2luZ1N0YXR1cyhzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1BhcnNpbmdTdGF0dXMgKiBzdGF0dXMpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX0ZyZWVDb250ZW50TW9kZWwoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Db250ZW50ICogbW9kZWwpOworZXh0ZXJuIHZvaWQgKiAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX01lbU1hbGxvYyhzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgc2l6ZV90IHNpemUpOworZXh0ZXJuIHZvaWQgKiAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX01lbVJlYWxsb2Moc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIHZvaWQgKiBwdHIsIHNpemVfdCBzaXplKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9NZW1GcmVlKHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyLCB2b2lkICogcHRyKTsKKworCitDT05TVCBBUFRSIG1haW5fdmVjdG9yc1tdID0KK3sKKyAgICBfRXhwYXRfT2J0YWluLAorICAgIF9FeHBhdF9SZWxlYXNlLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBfRXhwYXRfWE1MX1BhcnNlckNyZWF0ZSwKKyAgICBfRXhwYXRfWE1MX1BhcnNlckNyZWF0ZU5TLAorICAgIF9FeHBhdF9YTUxfUGFyc2VyQ3JlYXRlX01NLAorICAgIF9FeHBhdF9YTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUsCisgICAgX0V4cGF0X1hNTF9QYXJzZXJGcmVlLAorICAgIF9FeHBhdF9YTUxfUGFyc2UsCisgICAgX0V4cGF0X1hNTF9QYXJzZUJ1ZmZlciwKKyAgICBfRXhwYXRfWE1MX0dldEJ1ZmZlciwKKyAgICBfRXhwYXRfWE1MX1NldFN0YXJ0RWxlbWVudEhhbmRsZXIsCisgICAgX0V4cGF0X1hNTF9TZXRFbmRFbGVtZW50SGFuZGxlciwKKyAgICBfRXhwYXRfWE1MX1NldEVsZW1lbnRIYW5kbGVyLAorICAgIF9FeHBhdF9YTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXIsCisgICAgX0V4cGF0X1hNTF9TZXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyLAorICAgIF9FeHBhdF9YTUxfU2V0Q29tbWVudEhhbmRsZXIsCisgICAgX0V4cGF0X1hNTF9TZXRTdGFydENkYXRhU2VjdGlvbkhhbmRsZXIsCisgICAgX0V4cGF0X1hNTF9TZXRFbmRDZGF0YVNlY3Rpb25IYW5kbGVyLAorICAgIF9FeHBhdF9YTUxfU2V0Q2RhdGFTZWN0aW9uSGFuZGxlciwKKyAgICBfRXhwYXRfWE1MX1NldERlZmF1bHRIYW5kbGVyLAorICAgIF9FeHBhdF9YTUxfU2V0RGVmYXVsdEhhbmRsZXJFeHBhbmQsCisgICAgX0V4cGF0X1hNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIsCisgICAgX0V4cGF0X1hNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcsCisgICAgX0V4cGF0X1hNTF9TZXRVbmtub3duRW5jb2RpbmdIYW5kbGVyLAorICAgIF9FeHBhdF9YTUxfU2V0U3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciwKKyAgICBfRXhwYXRfWE1MX1NldEVuZE5hbWVzcGFjZURlY2xIYW5kbGVyLAorICAgIF9FeHBhdF9YTUxfU2V0TmFtZXNwYWNlRGVjbEhhbmRsZXIsCisgICAgX0V4cGF0X1hNTF9TZXRYbWxEZWNsSGFuZGxlciwKKyAgICBfRXhwYXRfWE1MX1NldFN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyLAorICAgIF9FeHBhdF9YTUxfU2V0RW5kRG9jdHlwZURlY2xIYW5kbGVyLAorICAgIF9FeHBhdF9YTUxfU2V0RG9jdHlwZURlY2xIYW5kbGVyLAorICAgIF9FeHBhdF9YTUxfU2V0RWxlbWVudERlY2xIYW5kbGVyLAorICAgIF9FeHBhdF9YTUxfU2V0QXR0bGlzdERlY2xIYW5kbGVyLAorICAgIF9FeHBhdF9YTUxfU2V0RW50aXR5RGVjbEhhbmRsZXIsCisgICAgX0V4cGF0X1hNTF9TZXRVbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyLAorICAgIF9FeHBhdF9YTUxfU2V0Tm90YXRpb25EZWNsSGFuZGxlciwKKyAgICBfRXhwYXRfWE1MX1NldE5vdFN0YW5kYWxvbmVIYW5kbGVyLAorICAgIF9FeHBhdF9YTUxfR2V0RXJyb3JDb2RlLAorICAgIF9FeHBhdF9YTUxfRXJyb3JTdHJpbmcsCisgICAgX0V4cGF0X1hNTF9HZXRDdXJyZW50Qnl0ZUluZGV4LAorICAgIF9FeHBhdF9YTUxfR2V0Q3VycmVudExpbmVOdW1iZXIsCisgICAgX0V4cGF0X1hNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyLAorICAgIF9FeHBhdF9YTUxfR2V0Q3VycmVudEJ5dGVDb3VudCwKKyAgICBfRXhwYXRfWE1MX0dldElucHV0Q29udGV4dCwKKyAgICBfRXhwYXRfWE1MX1NldFVzZXJEYXRhLAorICAgIF9FeHBhdF9YTUxfRGVmYXVsdEN1cnJlbnQsCisgICAgX0V4cGF0X1hNTF9Vc2VQYXJzZXJBc0hhbmRsZXJBcmcsCisgICAgX0V4cGF0X1hNTF9TZXRCYXNlLAorICAgIF9FeHBhdF9YTUxfR2V0QmFzZSwKKyAgICBfRXhwYXRfWE1MX0dldFNwZWNpZmllZEF0dHJpYnV0ZUNvdW50LAorICAgIF9FeHBhdF9YTUxfR2V0SWRBdHRyaWJ1dGVJbmRleCwKKyAgICBfRXhwYXRfWE1MX1NldEVuY29kaW5nLAorICAgIF9FeHBhdF9YTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nLAorICAgIF9FeHBhdF9YTUxfU2V0UmV0dXJuTlNUcmlwbGV0LAorICAgIF9FeHBhdF9YTUxfRXhwYXRWZXJzaW9uLAorICAgIF9FeHBhdF9YTUxfRXhwYXRWZXJzaW9uSW5mbywKKyAgICBfRXhwYXRfWE1MX1BhcnNlclJlc2V0LAorICAgIF9FeHBhdF9YTUxfU2V0U2tpcHBlZEVudGl0eUhhbmRsZXIsCisgICAgX0V4cGF0X1hNTF9Vc2VGb3JlaWduRFRELAorICAgIF9FeHBhdF9YTUxfR2V0RmVhdHVyZUxpc3QsCisgICAgX0V4cGF0X1hNTF9TdG9wUGFyc2VyLAorICAgIF9FeHBhdF9YTUxfUmVzdW1lUGFyc2VyLAorICAgIF9FeHBhdF9YTUxfR2V0UGFyc2luZ1N0YXR1cywKKyAgICBfRXhwYXRfWE1MX0ZyZWVDb250ZW50TW9kZWwsCisgICAgX0V4cGF0X1hNTF9NZW1NYWxsb2MsCisgICAgX0V4cGF0X1hNTF9NZW1SZWFsbG9jLAorICAgIF9FeHBhdF9YTUxfTWVtRnJlZSwKKyAgICAoQVBUUiktMQorfTsKKwordWludDMyIF9FeHBhdF9PYnRhaW4oc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYpCit7CisJcmV0dXJuICsrU2VsZi0+RGF0YS5SZWZDb3VudDsKK30KKwordWludDMyIF9FeHBhdF9SZWxlYXNlKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmKQoreworCXJldHVybiAtLVNlbGYtPkRhdGEuUmVmQ291bnQ7Cit9CisKK1hNTF9QYXJzZXIgX0V4cGF0X1hNTF9QYXJzZXJDcmVhdGUoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmcpCit7CisJcmV0dXJuIFhNTF9QYXJzZXJDcmVhdGUoZW5jb2RpbmcpOworfQorCitYTUxfUGFyc2VyIF9FeHBhdF9YTUxfUGFyc2VyQ3JlYXRlTlMoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmcsIFhNTF9DaGFyIG5zU2VwKQoreworCXJldHVybiBYTUxfUGFyc2VyQ3JlYXRlTlMoZW5jb2RpbmcsIG5zU2VwKTsKK30KKworWE1MX1BhcnNlciBfRXhwYXRfWE1MX1BhcnNlckNyZWF0ZV9NTShzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIGNvbnN0IFhNTF9DaGFyICplbmNvZGluZywgY29uc3QgWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZSAqbWVtc3VpdGUsIGNvbnN0IFhNTF9DaGFyICpuYW1lc3BhY2VTZXBhcmF0b3IpCit7CisJcmV0dXJuIFhNTF9QYXJzZXJDcmVhdGVfTU0oZW5jb2RpbmcsIG1lbXN1aXRlLCBuYW1lc3BhY2VTZXBhcmF0b3IpOworfQorCitYTUxfUGFyc2VyIF9FeHBhdF9YTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgWE1MX0NoYXIgKmNvbnRleHQsIGNvbnN0IFhNTF9DaGFyICplbmNvZGluZykKK3sKKwlyZXR1cm4gWE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlKHBhcnNlciwgY29udGV4dCwgZW5jb2RpbmcpOworfQorCit2b2lkIF9FeHBhdF9YTUxfUGFyc2VyRnJlZShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIpCit7CisJWE1MX1BhcnNlckZyZWUocGFyc2VyKTsKK30KKworZW51bSBYTUxfU3RhdHVzIF9FeHBhdF9YTUxfUGFyc2Uoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgY2hhciAqIHMsIGludCBsZW4sIGludCBpc0ZpbmFsKQoreworCXJldHVybiBYTUxfUGFyc2UocGFyc2VyLCBzLCBsZW4sIGlzRmluYWwpOworfQorCitlbnVtIFhNTF9TdGF0dXMgX0V4cGF0X1hNTF9QYXJzZUJ1ZmZlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBpbnQgbGVuLCBpbnQgaXNGaW5hbCkKK3sKKwlyZXR1cm4gWE1MX1BhcnNlQnVmZmVyKHBhcnNlciwgbGVuLCBpc0ZpbmFsKTsKK30KKwordm9pZCAqIF9FeHBhdF9YTUxfR2V0QnVmZmVyKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIGludCBsZW4pCit7CisJcmV0dXJuIFhNTF9HZXRCdWZmZXIocGFyc2VyLCBsZW4pOworfQorCit2b2lkIF9FeHBhdF9YTUxfU2V0U3RhcnRFbGVtZW50SGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfU3RhcnRFbGVtZW50SGFuZGxlciBzdGFydCkKK3sKKwlYTUxfU2V0U3RhcnRFbGVtZW50SGFuZGxlcihwYXJzZXIsIHN0YXJ0KTsKK30KKwordm9pZCBfRXhwYXRfWE1MX1NldEVuZEVsZW1lbnRIYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9FbmRFbGVtZW50SGFuZGxlciBlbmQpCit7CisJWE1MX1NldEVuZEVsZW1lbnRIYW5kbGVyKHBhcnNlciwgZW5kKTsKK30KKwordm9pZCBfRXhwYXRfWE1MX1NldEVsZW1lbnRIYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9TdGFydEVsZW1lbnRIYW5kbGVyIHN0YXJ0LCBYTUxfRW5kRWxlbWVudEhhbmRsZXIgZW5kKQoreworCVhNTF9TZXRFbGVtZW50SGFuZGxlcihwYXJzZXIsIHN0YXJ0LCBlbmQpOworfQorCit2b2lkIF9FeHBhdF9YTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0NoYXJhY3RlckRhdGFIYW5kbGVyIGhhbmRsZXIpCit7CisJWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyKHBhcnNlciwgaGFuZGxlcik7Cit9CisKK3ZvaWQgX0V4cGF0X1hNTF9TZXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyIGhhbmRsZXIpCit7CisJWE1MX1NldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIocGFyc2VyLCBoYW5kbGVyKTsKK30KKwordm9pZCBfRXhwYXRfWE1MX1NldENvbW1lbnRIYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Db21tZW50SGFuZGxlciBoYW5kbGVyKQoreworCVhNTF9TZXRDb21tZW50SGFuZGxlcihwYXJzZXIsIGhhbmRsZXIpOworfQorCit2b2lkIF9FeHBhdF9YTUxfU2V0U3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9TdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgc3RhcnQpCit7CisJWE1MX1NldFN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlcihwYXJzZXIsIHN0YXJ0KTsKK30KKwordm9pZCBfRXhwYXRfWE1MX1NldEVuZENkYXRhU2VjdGlvbkhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0VuZENkYXRhU2VjdGlvbkhhbmRsZXIgZW5kKQoreworCVhNTF9TZXRFbmRDZGF0YVNlY3Rpb25IYW5kbGVyKHBhcnNlciwgZW5kKTsKK30KKwordm9pZCBfRXhwYXRfWE1MX1NldENkYXRhU2VjdGlvbkhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1N0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlciBzdGFydCwgWE1MX0VuZENkYXRhU2VjdGlvbkhhbmRsZXIgZW5kKQoreworCVhNTF9TZXRDZGF0YVNlY3Rpb25IYW5kbGVyKHBhcnNlciwgc3RhcnQsIGVuZCk7Cit9CisKK3ZvaWQgX0V4cGF0X1hNTF9TZXREZWZhdWx0SGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfRGVmYXVsdEhhbmRsZXIgaGFuZGxlcikKK3sKKwlYTUxfU2V0RGVmYXVsdEhhbmRsZXIocGFyc2VyLCBoYW5kbGVyKTsKK30KKwordm9pZCBfRXhwYXRfWE1MX1NldERlZmF1bHRIYW5kbGVyRXhwYW5kKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9EZWZhdWx0SGFuZGxlciBoYW5kbGVyKQoreworCVhNTF9TZXREZWZhdWx0SGFuZGxlckV4cGFuZChwYXJzZXIsIGhhbmRsZXIpOworfQorCit2b2lkIF9FeHBhdF9YTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9FeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIgaGFuZGxlcikKK3sKKwlYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyKHBhcnNlciwgaGFuZGxlcik7Cit9CisKK3ZvaWQgX0V4cGF0X1hNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgdm9pZCAqIGFyZykKK3sKKwlYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnKHBhcnNlciwgYXJnKTsKK30KKwordm9pZCBfRXhwYXRfWE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1Vua25vd25FbmNvZGluZ0hhbmRsZXIgaGFuZGxlciwgdm9pZCAqIGRhdGEpCit7CisJWE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXIocGFyc2VyLCBoYW5kbGVyLCBkYXRhKTsKK30KKwordm9pZCBfRXhwYXRfWE1MX1NldFN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1N0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIgc3RhcnQpCit7CisJWE1MX1NldFN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIocGFyc2VyLCBzdGFydCk7Cit9CisKK3ZvaWQgX0V4cGF0X1hNTF9TZXRFbmROYW1lc3BhY2VEZWNsSGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfRW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIgZW5kKQoreworCVhNTF9TZXRFbmROYW1lc3BhY2VEZWNsSGFuZGxlcihwYXJzZXIsIGVuZCk7Cit9CisKK3ZvaWQgX0V4cGF0X1hNTF9TZXROYW1lc3BhY2VEZWNsSGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfU3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciBzdGFydCwgWE1MX0VuZE5hbWVzcGFjZURlY2xIYW5kbGVyIGVuZCkKK3sKKwlYTUxfU2V0TmFtZXNwYWNlRGVjbEhhbmRsZXIocGFyc2VyLCBzdGFydCwgZW5kKTsKK30KKwordm9pZCBfRXhwYXRfWE1MX1NldFhtbERlY2xIYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9YbWxEZWNsSGFuZGxlciBoYW5kbGVyKQoreworCVhNTF9TZXRYbWxEZWNsSGFuZGxlcihwYXJzZXIsIGhhbmRsZXIpOworfQorCit2b2lkIF9FeHBhdF9YTUxfU2V0U3RhcnREb2N0eXBlRGVjbEhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1N0YXJ0RG9jdHlwZURlY2xIYW5kbGVyIHN0YXJ0KQoreworCVhNTF9TZXRTdGFydERvY3R5cGVEZWNsSGFuZGxlcihwYXJzZXIsIHN0YXJ0KTsKK30KKwordm9pZCBfRXhwYXRfWE1MX1NldEVuZERvY3R5cGVEZWNsSGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfRW5kRG9jdHlwZURlY2xIYW5kbGVyIGVuZCkKK3sKKwlYTUxfU2V0RW5kRG9jdHlwZURlY2xIYW5kbGVyKHBhcnNlciwgZW5kKTsKK30KKwordm9pZCBfRXhwYXRfWE1MX1NldERvY3R5cGVEZWNsSGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfU3RhcnREb2N0eXBlRGVjbEhhbmRsZXIgc3RhcnQsIFhNTF9FbmREb2N0eXBlRGVjbEhhbmRsZXIgZW5kKQoreworCVhNTF9TZXREb2N0eXBlRGVjbEhhbmRsZXIocGFyc2VyLCBzdGFydCwgZW5kKTsKK30KKwordm9pZCBfRXhwYXRfWE1MX1NldEVsZW1lbnREZWNsSGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfRWxlbWVudERlY2xIYW5kbGVyIGVsZGVjbCkKK3sKKwlYTUxfU2V0RWxlbWVudERlY2xIYW5kbGVyKHBhcnNlciwgZWxkZWNsKTsKK30KKwordm9pZCBfRXhwYXRfWE1MX1NldEF0dGxpc3REZWNsSGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfQXR0bGlzdERlY2xIYW5kbGVyIGF0dGRlY2wpCit7CisJWE1MX1NldEF0dGxpc3REZWNsSGFuZGxlcihwYXJzZXIsIGF0dGRlY2wpOworfQorCit2b2lkIF9FeHBhdF9YTUxfU2V0RW50aXR5RGVjbEhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0VudGl0eURlY2xIYW5kbGVyIGhhbmRsZXIpCit7CisJWE1MX1NldEVudGl0eURlY2xIYW5kbGVyKHBhcnNlciwgaGFuZGxlcik7Cit9CisKK3ZvaWQgX0V4cGF0X1hNTF9TZXRVbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9VbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyIGhhbmRsZXIpCit7CisJWE1MX1NldFVucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIocGFyc2VyLCBoYW5kbGVyKTsKK30KKwordm9pZCBfRXhwYXRfWE1MX1NldE5vdGF0aW9uRGVjbEhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX05vdGF0aW9uRGVjbEhhbmRsZXIgaGFuZGxlcikKK3sKKwlYTUxfU2V0Tm90YXRpb25EZWNsSGFuZGxlcihwYXJzZXIsIGhhbmRsZXIpOworfQorCit2b2lkIF9FeHBhdF9YTUxfU2V0Tm90U3RhbmRhbG9uZUhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX05vdFN0YW5kYWxvbmVIYW5kbGVyIGhhbmRsZXIpCit7CisJWE1MX1NldE5vdFN0YW5kYWxvbmVIYW5kbGVyKHBhcnNlciwgaGFuZGxlcik7Cit9CisKK2VudW0gWE1MX0Vycm9yIF9FeHBhdF9YTUxfR2V0RXJyb3JDb2RlKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIpCit7CisJcmV0dXJuIFhNTF9HZXRFcnJvckNvZGUocGFyc2VyKTsKK30KKworY29uc3QgWE1MX0xDaGFyICogX0V4cGF0X1hNTF9FcnJvclN0cmluZyhzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIGVudW0gWE1MX0Vycm9yIGNvZGUpCit7CisJcmV0dXJuIFhNTF9FcnJvclN0cmluZyhjb2RlKTsKK30KKworbG9uZyBfRXhwYXRfWE1MX0dldEN1cnJlbnRCeXRlSW5kZXgoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlcikKK3sKKwlyZXR1cm4gWE1MX0dldEN1cnJlbnRCeXRlSW5kZXgocGFyc2VyKTsKK30KKworaW50IF9FeHBhdF9YTUxfR2V0Q3VycmVudExpbmVOdW1iZXIoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlcikKK3sKKwlyZXR1cm4gWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyKHBhcnNlcik7Cit9CisKK2ludCBfRXhwYXRfWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlcikKK3sKKwlyZXR1cm4gWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIocGFyc2VyKTsKK30KKworaW50IF9FeHBhdF9YTUxfR2V0Q3VycmVudEJ5dGVDb3VudChzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyKQoreworCXJldHVybiBYTUxfR2V0Q3VycmVudEJ5dGVDb3VudChwYXJzZXIpOworfQorCitjb25zdCBjaGFyICogX0V4cGF0X1hNTF9HZXRJbnB1dENvbnRleHQoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgaW50ICogb2Zmc2V0LCBpbnQgKiBzaXplKQoreworCXJldHVybiBYTUxfR2V0SW5wdXRDb250ZXh0KHBhcnNlciwgb2Zmc2V0LCBzaXplKTsKK30KKwordm9pZCBfRXhwYXRfWE1MX1NldFVzZXJEYXRhKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIHZvaWQgKiB1c2VyRGF0YSkKK3sKKwlYTUxfU2V0VXNlckRhdGEocGFyc2VyLCB1c2VyRGF0YSk7Cit9CisKK3ZvaWQgX0V4cGF0X1hNTF9EZWZhdWx0Q3VycmVudChzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyKQoreworCVhNTF9EZWZhdWx0Q3VycmVudChwYXJzZXIpOworfQorCit2b2lkIF9FeHBhdF9YTUxfVXNlUGFyc2VyQXNIYW5kbGVyQXJnKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIpCit7CisJWE1MX1VzZVBhcnNlckFzSGFuZGxlckFyZyhwYXJzZXIpOworfQorCitlbnVtIFhNTF9TdGF0dXMgX0V4cGF0X1hNTF9TZXRCYXNlKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICpwKQoreworCXJldHVybiBYTUxfU2V0QmFzZShwYXJzZXIsIHApOworfQorCitjb25zdCBYTUxfQ2hhciAqIF9FeHBhdF9YTUxfR2V0QmFzZShzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyKQoreworCXJldHVybiBYTUxfR2V0QmFzZShwYXJzZXIpOworfQorCitpbnQgX0V4cGF0X1hNTF9HZXRTcGVjaWZpZWRBdHRyaWJ1dGVDb3VudChzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyKQoreworCXJldHVybiBYTUxfR2V0U3BlY2lmaWVkQXR0cmlidXRlQ291bnQocGFyc2VyKTsKK30KKworaW50IF9FeHBhdF9YTUxfR2V0SWRBdHRyaWJ1dGVJbmRleChzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyKQoreworCXJldHVybiBYTUxfR2V0SWRBdHRyaWJ1dGVJbmRleChwYXJzZXIpOworfQorCitlbnVtIFhNTF9TdGF0dXMgX0V4cGF0X1hNTF9TZXRFbmNvZGluZyhzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmcpCit7CisJcmV0dXJuIFhNTF9TZXRFbmNvZGluZyhwYXJzZXIsIGVuY29kaW5nKTsKK30KKworaW50IF9FeHBhdF9YTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIGVudW0gWE1MX1BhcmFtRW50aXR5UGFyc2luZyBwYXJzaW5nKQoreworCXJldHVybiBYTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nKHBhcnNlciwgcGFyc2luZyk7Cit9CisKK3ZvaWQgX0V4cGF0X1hNTF9TZXRSZXR1cm5OU1RyaXBsZXQoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgaW50IGRvX25zdCkKK3sKKwlYTUxfU2V0UmV0dXJuTlNUcmlwbGV0KHBhcnNlciwgZG9fbnN0KTsKK30KKworY29uc3QgWE1MX0xDaGFyICogX0V4cGF0X1hNTF9FeHBhdFZlcnNpb24oc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmKQoreworCXJldHVybiBYTUxfRXhwYXRWZXJzaW9uKCk7Cit9CisKK1hNTF9FeHBhdF9WZXJzaW9uIF9FeHBhdF9YTUxfRXhwYXRWZXJzaW9uSW5mbyhzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYpCit7CisJcmV0dXJuIFhNTF9FeHBhdFZlcnNpb25JbmZvKCk7Cit9CisKK1hNTF9Cb29sIF9FeHBhdF9YTUxfUGFyc2VyUmVzZXQoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgWE1MX0NoYXIgKmVuY29kaW5nKQoreworCXJldHVybiBYTUxfUGFyc2VyUmVzZXQocGFyc2VyLCBlbmNvZGluZyk7Cit9CisKK3ZvaWQgX0V4cGF0X1hNTF9TZXRTa2lwcGVkRW50aXR5SGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfU2tpcHBlZEVudGl0eUhhbmRsZXIgaGFuZGxlcikKK3sKKwlYTUxfU2V0U2tpcHBlZEVudGl0eUhhbmRsZXIocGFyc2VyLCBoYW5kbGVyKTsKK30KKworZW51bSBYTUxfRXJyb3IgX0V4cGF0X1hNTF9Vc2VGb3JlaWduRFREKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Cb29sIHVzZURURCkKK3sKKwlyZXR1cm4gWE1MX1VzZUZvcmVpZ25EVEQocGFyc2VyLCB1c2VEVEQpOworfQorCitjb25zdCBYTUxfRmVhdHVyZSAqIF9FeHBhdF9YTUxfR2V0RmVhdHVyZUxpc3Qoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmKQoreworCXJldHVybiBYTUxfR2V0RmVhdHVyZUxpc3QoKTsKK30KKworZW51bSBYTUxfU3RhdHVzIF9FeHBhdF9YTUxfU3RvcFBhcnNlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfQm9vbCByZXN1bWFibGUpCit7CisJcmV0dXJuIFhNTF9TdG9wUGFyc2VyKHBhcnNlciwgcmVzdW1hYmxlKTsKK30KKworZW51bSBYTUxfU3RhdHVzIF9FeHBhdF9YTUxfUmVzdW1lUGFyc2VyKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIpCit7CisJcmV0dXJuIFhNTF9SZXN1bWVQYXJzZXIocGFyc2VyKTsKK30KKwordm9pZCBfRXhwYXRfWE1MX0dldFBhcnNpbmdTdGF0dXMoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1BhcnNpbmdTdGF0dXMgKiBzdGF0dXMpCit7CisJWE1MX0dldFBhcnNpbmdTdGF0dXMocGFyc2VyLCBzdGF0dXMpOworfQorCit2b2lkIF9FeHBhdF9YTUxfRnJlZUNvbnRlbnRNb2RlbChzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfQ29udGVudCAqIG1vZGVsKQoreworCVhNTF9GcmVlQ29udGVudE1vZGVsKHBhcnNlciwgbW9kZWwpOworfQorCit2b2lkICogX0V4cGF0X1hNTF9NZW1NYWxsb2Moc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgc2l6ZV90IHNpemUpCit7CisJcmV0dXJuIFhNTF9NZW1NYWxsb2MocGFyc2VyLCBzaXplKTsKK30KKwordm9pZCAqIF9FeHBhdF9YTUxfTWVtUmVhbGxvYyhzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCB2b2lkICogcHRyLCBzaXplX3Qgc2l6ZSkKK3sKKwlYTUxfTWVtUmVhbGxvYyhwYXJzZXIsIHB0ciwgc2l6ZSk7Cit9CisKK3ZvaWQgX0V4cGF0X1hNTF9NZW1GcmVlKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIHZvaWQgKiBwdHIpCit7CisJWE1MX01lbUZyZWUocGFyc2VyLCBwdHIpOworfQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvYW1pZ2EvaW5jbHVkZS9pbmxpbmU0L2V4cGF0LmggYi9leHBhdC0yLjAuMS9hbWlnYS9pbmNsdWRlL2lubGluZTQvZXhwYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTMxMDVkCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYW1pZ2EvaW5jbHVkZS9pbmxpbmU0L2V4cGF0LmgKQEAgLTAsMCArMSw5NCBAQAorI2lmbmRlZiBJTkxJTkU0X0VYUEFUX0gKKyNkZWZpbmUgSU5MSU5FNF9FWFBBVF9ICisKKy8qCisqKiBUaGlzIGZpbGUgd2FzIGF1dG8gZ2VuZXJhdGVkIGJ5IGlkbHRvb2wgNTEuNi4KKyoqCisqKiBJdCBwcm92aWRlcyBjb21wYXRpYmlsaXR5IHRvIE9TMyBzdHlsZSBsaWJyYXJ5CisqKiBjYWxscyBieSBzdWJzdGl0dXRpbmcgZnVuY3Rpb25zLgorKioKKyoqIERvIG5vdCBlZGl0IG1hbnVhbGx5LgorKi8gCisKKyNpZm5kZWYgRVhFQ19UWVBFU19ICisjaW5jbHVkZSA8ZXhlYy90eXBlcy5oPgorI2VuZGlmCisjaWZuZGVmIEVYRUNfRVhFQ19ICisjaW5jbHVkZSA8ZXhlYy9leGVjLmg+CisjZW5kaWYKKyNpZm5kZWYgRVhFQ19JTlRFUkZBQ0VTX0gKKyNpbmNsdWRlIDxleGVjL2ludGVyZmFjZXMuaD4KKyNlbmRpZgorCisjaWZuZGVmIExJQlJBUklFU19FWFBBVF9ICisjaW5jbHVkZSA8bGlicmFyaWVzL2V4cGF0Lmg+CisjZW5kaWYKKworLyogSW5saW5lIG1hY3JvcyBmb3IgSW50ZXJmYWNlICJtYWluIiAqLworI2RlZmluZSBYTUxfUGFyc2VyQ3JlYXRlKGVuY29kaW5nTmFtZSkgSUV4cGF0LT5YTUxfUGFyc2VyQ3JlYXRlKGVuY29kaW5nTmFtZSkgCisjZGVmaW5lIFhNTF9QYXJzZXJDcmVhdGVOUyhlbmNvZGluZ05hbWUsIG5zU2VwKSBJRXhwYXQtPlhNTF9QYXJzZXJDcmVhdGVOUyhlbmNvZGluZ05hbWUsIG5zU2VwKSAKKyNkZWZpbmUgWE1MX1BhcnNlckNyZWF0ZV9NTShlbmNvZGluZywgbWVtc3VpdGUsIG5hbWVzcGFjZVNlcGFyYXRvcikgSUV4cGF0LT5YTUxfUGFyc2VyQ3JlYXRlX01NKGVuY29kaW5nLCBtZW1zdWl0ZSwgbmFtZXNwYWNlU2VwYXJhdG9yKSAKKyNkZWZpbmUgWE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlKHBhcnNlciwgY29udGV4dCwgZW5jb2RpbmcpIElFeHBhdC0+WE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlKHBhcnNlciwgY29udGV4dCwgZW5jb2RpbmcpIAorI2RlZmluZSBYTUxfUGFyc2VyRnJlZShwYXJzZXIpIElFeHBhdC0+WE1MX1BhcnNlckZyZWUocGFyc2VyKSAKKyNkZWZpbmUgWE1MX1BhcnNlKHBhcnNlciwgcywgbGVuLCBpc0ZpbmFsKSBJRXhwYXQtPlhNTF9QYXJzZShwYXJzZXIsIHMsIGxlbiwgaXNGaW5hbCkgCisjZGVmaW5lIFhNTF9QYXJzZUJ1ZmZlcihwYXJzZXIsIGxlbiwgaXNGaW5hbCkgSUV4cGF0LT5YTUxfUGFyc2VCdWZmZXIocGFyc2VyLCBsZW4sIGlzRmluYWwpIAorI2RlZmluZSBYTUxfR2V0QnVmZmVyKHBhcnNlciwgbGVuKSBJRXhwYXQtPlhNTF9HZXRCdWZmZXIocGFyc2VyLCBsZW4pIAorI2RlZmluZSBYTUxfU2V0U3RhcnRFbGVtZW50SGFuZGxlcihwYXJzZXIsIHN0YXJ0KSBJRXhwYXQtPlhNTF9TZXRTdGFydEVsZW1lbnRIYW5kbGVyKHBhcnNlciwgc3RhcnQpIAorI2RlZmluZSBYTUxfU2V0RW5kRWxlbWVudEhhbmRsZXIocGFyc2VyLCBlbmQpIElFeHBhdC0+WE1MX1NldEVuZEVsZW1lbnRIYW5kbGVyKHBhcnNlciwgZW5kKSAKKyNkZWZpbmUgWE1MX1NldEVsZW1lbnRIYW5kbGVyKHBhcnNlciwgc3RhcnQsIGVuZCkgSUV4cGF0LT5YTUxfU2V0RWxlbWVudEhhbmRsZXIocGFyc2VyLCBzdGFydCwgZW5kKSAKKyNkZWZpbmUgWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyKHBhcnNlciwgaGFuZGxlcikgSUV4cGF0LT5YTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXIocGFyc2VyLCBoYW5kbGVyKSAKKyNkZWZpbmUgWE1MX1NldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIocGFyc2VyLCBoYW5kbGVyKSBJRXhwYXQtPlhNTF9TZXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyKHBhcnNlciwgaGFuZGxlcikgCisjZGVmaW5lIFhNTF9TZXRDb21tZW50SGFuZGxlcihwYXJzZXIsIGhhbmRsZXIpIElFeHBhdC0+WE1MX1NldENvbW1lbnRIYW5kbGVyKHBhcnNlciwgaGFuZGxlcikgCisjZGVmaW5lIFhNTF9TZXRTdGFydENkYXRhU2VjdGlvbkhhbmRsZXIocGFyc2VyLCBzdGFydCkgSUV4cGF0LT5YTUxfU2V0U3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyKHBhcnNlciwgc3RhcnQpIAorI2RlZmluZSBYTUxfU2V0RW5kQ2RhdGFTZWN0aW9uSGFuZGxlcihwYXJzZXIsIGVuZCkgSUV4cGF0LT5YTUxfU2V0RW5kQ2RhdGFTZWN0aW9uSGFuZGxlcihwYXJzZXIsIGVuZCkgCisjZGVmaW5lIFhNTF9TZXRDZGF0YVNlY3Rpb25IYW5kbGVyKHBhcnNlciwgc3RhcnQsIGVuZCkgSUV4cGF0LT5YTUxfU2V0Q2RhdGFTZWN0aW9uSGFuZGxlcihwYXJzZXIsIHN0YXJ0LCBlbmQpIAorI2RlZmluZSBYTUxfU2V0RGVmYXVsdEhhbmRsZXIocGFyc2VyLCBoYW5kbGVyKSBJRXhwYXQtPlhNTF9TZXREZWZhdWx0SGFuZGxlcihwYXJzZXIsIGhhbmRsZXIpIAorI2RlZmluZSBYTUxfU2V0RGVmYXVsdEhhbmRsZXJFeHBhbmQocGFyc2VyLCBoYW5kbGVyKSBJRXhwYXQtPlhNTF9TZXREZWZhdWx0SGFuZGxlckV4cGFuZChwYXJzZXIsIGhhbmRsZXIpIAorI2RlZmluZSBYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyKHBhcnNlciwgaGFuZGxlcikgSUV4cGF0LT5YTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyKHBhcnNlciwgaGFuZGxlcikgCisjZGVmaW5lIFhNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcocGFyc2VyLCBhcmcpIElFeHBhdC0+WE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlckFyZyhwYXJzZXIsIGFyZykgCisjZGVmaW5lIFhNTF9TZXRVbmtub3duRW5jb2RpbmdIYW5kbGVyKHBhcnNlciwgaGFuZGxlciwgZGF0YSkgSUV4cGF0LT5YTUxfU2V0VW5rbm93bkVuY29kaW5nSGFuZGxlcihwYXJzZXIsIGhhbmRsZXIsIGRhdGEpIAorI2RlZmluZSBYTUxfU2V0U3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlcihwYXJzZXIsIHN0YXJ0KSBJRXhwYXQtPlhNTF9TZXRTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyKHBhcnNlciwgc3RhcnQpIAorI2RlZmluZSBYTUxfU2V0RW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIocGFyc2VyLCBlbmQpIElFeHBhdC0+WE1MX1NldEVuZE5hbWVzcGFjZURlY2xIYW5kbGVyKHBhcnNlciwgZW5kKSAKKyNkZWZpbmUgWE1MX1NldE5hbWVzcGFjZURlY2xIYW5kbGVyKHBhcnNlciwgc3RhcnQsIGVuZCkgSUV4cGF0LT5YTUxfU2V0TmFtZXNwYWNlRGVjbEhhbmRsZXIocGFyc2VyLCBzdGFydCwgZW5kKSAKKyNkZWZpbmUgWE1MX1NldFhtbERlY2xIYW5kbGVyKHBhcnNlciwgaGFuZGxlcikgSUV4cGF0LT5YTUxfU2V0WG1sRGVjbEhhbmRsZXIocGFyc2VyLCBoYW5kbGVyKSAKKyNkZWZpbmUgWE1MX1NldFN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyKHBhcnNlciwgc3RhcnQpIElFeHBhdC0+WE1MX1NldFN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyKHBhcnNlciwgc3RhcnQpIAorI2RlZmluZSBYTUxfU2V0RW5kRG9jdHlwZURlY2xIYW5kbGVyKHBhcnNlciwgZW5kKSBJRXhwYXQtPlhNTF9TZXRFbmREb2N0eXBlRGVjbEhhbmRsZXIocGFyc2VyLCBlbmQpIAorI2RlZmluZSBYTUxfU2V0RG9jdHlwZURlY2xIYW5kbGVyKHBhcnNlciwgc3RhcnQsIGVuZCkgSUV4cGF0LT5YTUxfU2V0RG9jdHlwZURlY2xIYW5kbGVyKHBhcnNlciwgc3RhcnQsIGVuZCkgCisjZGVmaW5lIFhNTF9TZXRFbGVtZW50RGVjbEhhbmRsZXIocGFyc2VyLCBlbGRlY2wpIElFeHBhdC0+WE1MX1NldEVsZW1lbnREZWNsSGFuZGxlcihwYXJzZXIsIGVsZGVjbCkgCisjZGVmaW5lIFhNTF9TZXRBdHRsaXN0RGVjbEhhbmRsZXIocGFyc2VyLCBhdHRkZWNsKSBJRXhwYXQtPlhNTF9TZXRBdHRsaXN0RGVjbEhhbmRsZXIocGFyc2VyLCBhdHRkZWNsKSAKKyNkZWZpbmUgWE1MX1NldEVudGl0eURlY2xIYW5kbGVyKHBhcnNlciwgaGFuZGxlcikgSUV4cGF0LT5YTUxfU2V0RW50aXR5RGVjbEhhbmRsZXIocGFyc2VyLCBoYW5kbGVyKSAKKyNkZWZpbmUgWE1MX1NldFVucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIocGFyc2VyLCBoYW5kbGVyKSBJRXhwYXQtPlhNTF9TZXRVbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyKHBhcnNlciwgaGFuZGxlcikgCisjZGVmaW5lIFhNTF9TZXROb3RhdGlvbkRlY2xIYW5kbGVyKHBhcnNlciwgaGFuZGxlcikgSUV4cGF0LT5YTUxfU2V0Tm90YXRpb25EZWNsSGFuZGxlcihwYXJzZXIsIGhhbmRsZXIpIAorI2RlZmluZSBYTUxfU2V0Tm90U3RhbmRhbG9uZUhhbmRsZXIocGFyc2VyLCBoYW5kbGVyKSBJRXhwYXQtPlhNTF9TZXROb3RTdGFuZGFsb25lSGFuZGxlcihwYXJzZXIsIGhhbmRsZXIpIAorI2RlZmluZSBYTUxfR2V0RXJyb3JDb2RlKHBhcnNlcikgSUV4cGF0LT5YTUxfR2V0RXJyb3JDb2RlKHBhcnNlcikgCisjZGVmaW5lIFhNTF9FcnJvclN0cmluZyhjb2RlKSBJRXhwYXQtPlhNTF9FcnJvclN0cmluZyhjb2RlKSAKKyNkZWZpbmUgWE1MX0dldEN1cnJlbnRCeXRlSW5kZXgocGFyc2VyKSBJRXhwYXQtPlhNTF9HZXRDdXJyZW50Qnl0ZUluZGV4KHBhcnNlcikgCisjZGVmaW5lIFhNTF9HZXRDdXJyZW50TGluZU51bWJlcihwYXJzZXIpIElFeHBhdC0+WE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyKHBhcnNlcikgCisjZGVmaW5lIFhNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyKHBhcnNlcikgSUV4cGF0LT5YTUxfR2V0Q3VycmVudENvbHVtbk51bWJlcihwYXJzZXIpIAorI2RlZmluZSBYTUxfR2V0Q3VycmVudEJ5dGVDb3VudChwYXJzZXIpIElFeHBhdC0+WE1MX0dldEN1cnJlbnRCeXRlQ291bnQocGFyc2VyKSAKKyNkZWZpbmUgWE1MX0dldElucHV0Q29udGV4dChwYXJzZXIsIG9mZnNldCwgc2l6ZSkgSUV4cGF0LT5YTUxfR2V0SW5wdXRDb250ZXh0KHBhcnNlciwgb2Zmc2V0LCBzaXplKSAKKyNkZWZpbmUgWE1MX1NldFVzZXJEYXRhKHBhcnNlciwgdXNlckRhdGEpIElFeHBhdC0+WE1MX1NldFVzZXJEYXRhKHBhcnNlciwgdXNlckRhdGEpIAorI2RlZmluZSBYTUxfRGVmYXVsdEN1cnJlbnQocGFyc2VyKSBJRXhwYXQtPlhNTF9EZWZhdWx0Q3VycmVudChwYXJzZXIpIAorI2RlZmluZSBYTUxfVXNlUGFyc2VyQXNIYW5kbGVyQXJnKHBhcnNlcikgSUV4cGF0LT5YTUxfVXNlUGFyc2VyQXNIYW5kbGVyQXJnKHBhcnNlcikgCisjZGVmaW5lIFhNTF9TZXRCYXNlKHBhcnNlciwgYmFzZSkgSUV4cGF0LT5YTUxfU2V0QmFzZShwYXJzZXIsIGJhc2UpIAorI2RlZmluZSBYTUxfR2V0QmFzZShwYXJzZXIpIElFeHBhdC0+WE1MX0dldEJhc2UocGFyc2VyKSAKKyNkZWZpbmUgWE1MX0dldFNwZWNpZmllZEF0dHJpYnV0ZUNvdW50KHBhcnNlcikgSUV4cGF0LT5YTUxfR2V0U3BlY2lmaWVkQXR0cmlidXRlQ291bnQocGFyc2VyKSAKKyNkZWZpbmUgWE1MX0dldElkQXR0cmlidXRlSW5kZXgocGFyc2VyKSBJRXhwYXQtPlhNTF9HZXRJZEF0dHJpYnV0ZUluZGV4KHBhcnNlcikgCisjZGVmaW5lIFhNTF9TZXRFbmNvZGluZyhwYXJzZXIsIGVuY29kaW5nKSBJRXhwYXQtPlhNTF9TZXRFbmNvZGluZyhwYXJzZXIsIGVuY29kaW5nKSAKKyNkZWZpbmUgWE1MX1NldFBhcmFtRW50aXR5UGFyc2luZyhwYXJzZXIsIHBhcnNpbmcpIElFeHBhdC0+WE1MX1NldFBhcmFtRW50aXR5UGFyc2luZyhwYXJzZXIsIHBhcnNpbmcpIAorI2RlZmluZSBYTUxfU2V0UmV0dXJuTlNUcmlwbGV0KHBhcnNlciwgZG9fbnN0KSBJRXhwYXQtPlhNTF9TZXRSZXR1cm5OU1RyaXBsZXQocGFyc2VyLCBkb19uc3QpIAorI2RlZmluZSBYTUxfRXhwYXRWZXJzaW9uKCkgSUV4cGF0LT5YTUxfRXhwYXRWZXJzaW9uKCkgCisjZGVmaW5lIFhNTF9FeHBhdFZlcnNpb25JbmZvKCkgSUV4cGF0LT5YTUxfRXhwYXRWZXJzaW9uSW5mbygpIAorI2RlZmluZSBYTUxfUGFyc2VyUmVzZXQocGFyc2VyLCBlbmNvZGluZykgSUV4cGF0LT5YTUxfUGFyc2VyUmVzZXQocGFyc2VyLCBlbmNvZGluZykgCisjZGVmaW5lIFhNTF9TZXRTa2lwcGVkRW50aXR5SGFuZGxlcihwYXJzZXIsIGhhbmRsZXIpIElFeHBhdC0+WE1MX1NldFNraXBwZWRFbnRpdHlIYW5kbGVyKHBhcnNlciwgaGFuZGxlcikgCisjZGVmaW5lIFhNTF9Vc2VGb3JlaWduRFREKHBhcnNlciwgdXNlRFREKSBJRXhwYXQtPlhNTF9Vc2VGb3JlaWduRFREKHBhcnNlciwgdXNlRFREKSAKKyNkZWZpbmUgWE1MX0dldEZlYXR1cmVMaXN0KCkgSUV4cGF0LT5YTUxfR2V0RmVhdHVyZUxpc3QoKSAKKyNkZWZpbmUgWE1MX1N0b3BQYXJzZXIocGFyc2VyLCByZXN1bWFibGUpIElFeHBhdC0+WE1MX1N0b3BQYXJzZXIocGFyc2VyLCByZXN1bWFibGUpIAorI2RlZmluZSBYTUxfUmVzdW1lUGFyc2VyKHBhcnNlcikgSUV4cGF0LT5YTUxfUmVzdW1lUGFyc2VyKHBhcnNlcikgCisjZGVmaW5lIFhNTF9HZXRQYXJzaW5nU3RhdHVzKHBhcnNlciwgc3RhdHVzKSBJRXhwYXQtPlhNTF9HZXRQYXJzaW5nU3RhdHVzKHBhcnNlciwgc3RhdHVzKSAKKyNkZWZpbmUgWE1MX0ZyZWVDb250ZW50TW9kZWwocGFyc2VyLCBtb2RlbCkgSUV4cGF0LT5YTUxfRnJlZUNvbnRlbnRNb2RlbChwYXJzZXIsIG1vZGVsKSAKKyNkZWZpbmUgWE1MX01lbU1hbGxvYyhwYXJzZXIsIHNpemUpIElFeHBhdC0+WE1MX01lbU1hbGxvYyhwYXJzZXIsIHNpemUpIAorI2RlZmluZSBYTUxfTWVtUmVhbGxvYyhwYXJzZXIsIHB0ciwgc2l6ZSkgSUV4cGF0LT5YTUxfTWVtUmVhbGxvYyhwYXJzZXIsIHB0ciwgc2l6ZSkgCisjZGVmaW5lIFhNTF9NZW1GcmVlKHBhcnNlciwgcHRyKSBJRXhwYXQtPlhNTF9NZW1GcmVlKHBhcnNlciwgcHRyKSAKKworI2VuZGlmIC8qIElOTElORTRfRVhQQVRfSCAqLwpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvYW1pZ2EvaW5jbHVkZS9pbnRlcmZhY2VzL2V4cGF0LmggYi9leHBhdC0yLjAuMS9hbWlnYS9pbmNsdWRlL2ludGVyZmFjZXMvZXhwYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWJkZjRhCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYW1pZ2EvaW5jbHVkZS9pbnRlcmZhY2VzL2V4cGF0LmgKQEAgLTAsMCArMSw5OCBAQAorI2lmbmRlZiBFWFBBVF9JTlRFUkZBQ0VfREVGX0gKKyNkZWZpbmUgRVhQQVRfSU5URVJGQUNFX0RFRl9ICisKKy8qCisqKiBUaGlzIGZpbGUgd2FzIG1hY2hpbmUgZ2VuZXJhdGVkIGJ5IGlkbHRvb2wgNTEuNi4KKyoqIERvIG5vdCBlZGl0CisqLyAKKworI2lmbmRlZiBFWEVDX1RZUEVTX0gKKyNpbmNsdWRlIDxleGVjL3R5cGVzLmg+CisjZW5kaWYKKyNpZm5kZWYgRVhFQ19FWEVDX0gKKyNpbmNsdWRlIDxleGVjL2V4ZWMuaD4KKyNlbmRpZgorI2lmbmRlZiBFWEVDX0lOVEVSRkFDRVNfSAorI2luY2x1ZGUgPGV4ZWMvaW50ZXJmYWNlcy5oPgorI2VuZGlmCisKKyNpZm5kZWYgTElCUkFSSUVTX0VYUEFUX0gKKyNpbmNsdWRlIDxsaWJyYXJpZXMvZXhwYXQuaD4KKyNlbmRpZgorCitzdHJ1Y3QgRXhwYXRJRmFjZQoreworCXN0cnVjdCBJbnRlcmZhY2VEYXRhIERhdGE7CisKKwl1aW50MzIgQVBJQ0FMTCAoKk9idGFpbikoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYpOworCXVpbnQzMiBBUElDQUxMICgqUmVsZWFzZSkoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYpOworCXZvaWQgQVBJQ0FMTCAoKkV4cHVuZ2UpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmKTsKKwlzdHJ1Y3QgSW50ZXJmYWNlICogQVBJQ0FMTCAoKkNsb25lKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZik7CisJWE1MX1BhcnNlciBBUElDQUxMICgqWE1MX1BhcnNlckNyZWF0ZSkoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIGNvbnN0IFhNTF9DaGFyICogZW5jb2RpbmdOYW1lKTsKKwlYTUxfUGFyc2VyIEFQSUNBTEwgKCpYTUxfUGFyc2VyQ3JlYXRlTlMpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBjb25zdCBYTUxfQ2hhciAqIGVuY29kaW5nTmFtZSwgWE1MX0NoYXIgbnNTZXApOworCVhNTF9QYXJzZXIgQVBJQ0FMTCAoKlhNTF9QYXJzZXJDcmVhdGVfTU0pKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBjb25zdCBYTUxfQ2hhciAqIGVuY29kaW5nLCBjb25zdCBYTUxfTWVtb3J5X0hhbmRsaW5nX1N1aXRlICogbWVtc3VpdGUsIGNvbnN0IFhNTF9DaGFyICogbmFtZXNwYWNlU2VwYXJhdG9yKTsKKwlYTUxfUGFyc2VyIEFQSUNBTEwgKCpYTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgWE1MX0NoYXIgKiBjb250ZXh0LCBjb25zdCBYTUxfQ2hhciAqIGVuY29kaW5nKTsKKwl2b2lkIEFQSUNBTEwgKCpYTUxfUGFyc2VyRnJlZSkoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyKTsKKwllbnVtIFhNTF9TdGF0dXMgQVBJQ0FMTCAoKlhNTF9QYXJzZSkoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBjaGFyICogcywgaW50IGxlbiwgaW50IGlzRmluYWwpOworCWVudW0gWE1MX1N0YXR1cyBBUElDQUxMICgqWE1MX1BhcnNlQnVmZmVyKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIGludCBsZW4sIGludCBpc0ZpbmFsKTsKKwl2b2lkICogQVBJQ0FMTCAoKlhNTF9HZXRCdWZmZXIpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgaW50IGxlbik7CisJdm9pZCBBUElDQUxMICgqWE1MX1NldFN0YXJ0RWxlbWVudEhhbmRsZXIpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1N0YXJ0RWxlbWVudEhhbmRsZXIgc3RhcnQpOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9TZXRFbmRFbGVtZW50SGFuZGxlcikoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfRW5kRWxlbWVudEhhbmRsZXIgZW5kKTsKKwl2b2lkIEFQSUNBTEwgKCpYTUxfU2V0RWxlbWVudEhhbmRsZXIpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1N0YXJ0RWxlbWVudEhhbmRsZXIgc3RhcnQsIFhNTF9FbmRFbGVtZW50SGFuZGxlciBlbmQpOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcikoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfQ2hhcmFjdGVyRGF0YUhhbmRsZXIgaGFuZGxlcik7CisJdm9pZCBBUElDQUxMICgqWE1MX1NldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1Byb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIgaGFuZGxlcik7CisJdm9pZCBBUElDQUxMICgqWE1MX1NldENvbW1lbnRIYW5kbGVyKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Db21tZW50SGFuZGxlciBoYW5kbGVyKTsKKwl2b2lkIEFQSUNBTEwgKCpYTUxfU2V0U3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9TdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgc3RhcnQpOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9TZXRFbmRDZGF0YVNlY3Rpb25IYW5kbGVyKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9FbmRDZGF0YVNlY3Rpb25IYW5kbGVyIGVuZCk7CisJdm9pZCBBUElDQUxMICgqWE1MX1NldENkYXRhU2VjdGlvbkhhbmRsZXIpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1N0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlciBzdGFydCwgWE1MX0VuZENkYXRhU2VjdGlvbkhhbmRsZXIgZW5kKTsKKwl2b2lkIEFQSUNBTEwgKCpYTUxfU2V0RGVmYXVsdEhhbmRsZXIpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0RlZmF1bHRIYW5kbGVyIGhhbmRsZXIpOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9TZXREZWZhdWx0SGFuZGxlckV4cGFuZCkoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfRGVmYXVsdEhhbmRsZXIgaGFuZGxlcik7CisJdm9pZCBBUElDQUxMICgqWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlcikoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIGhhbmRsZXIpOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgdm9pZCAqIGFyZyk7CisJdm9pZCBBUElDQUxMICgqWE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXIpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1Vua25vd25FbmNvZGluZ0hhbmRsZXIgaGFuZGxlciwgdm9pZCAqIGRhdGEpOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9TZXRTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9TdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyIHN0YXJ0KTsKKwl2b2lkIEFQSUNBTEwgKCpYTUxfU2V0RW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0VuZE5hbWVzcGFjZURlY2xIYW5kbGVyIGVuZCk7CisJdm9pZCBBUElDQUxMICgqWE1MX1NldE5hbWVzcGFjZURlY2xIYW5kbGVyKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9TdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyIHN0YXJ0LCBYTUxfRW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIgZW5kKTsKKwl2b2lkIEFQSUNBTEwgKCpYTUxfU2V0WG1sRGVjbEhhbmRsZXIpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1htbERlY2xIYW5kbGVyIGhhbmRsZXIpOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9TZXRTdGFydERvY3R5cGVEZWNsSGFuZGxlcikoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfU3RhcnREb2N0eXBlRGVjbEhhbmRsZXIgc3RhcnQpOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9TZXRFbmREb2N0eXBlRGVjbEhhbmRsZXIpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0VuZERvY3R5cGVEZWNsSGFuZGxlciBlbmQpOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9TZXREb2N0eXBlRGVjbEhhbmRsZXIpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1N0YXJ0RG9jdHlwZURlY2xIYW5kbGVyIHN0YXJ0LCBYTUxfRW5kRG9jdHlwZURlY2xIYW5kbGVyIGVuZCk7CisJdm9pZCBBUElDQUxMICgqWE1MX1NldEVsZW1lbnREZWNsSGFuZGxlcikoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfRWxlbWVudERlY2xIYW5kbGVyIGVsZGVjbCk7CisJdm9pZCBBUElDQUxMICgqWE1MX1NldEF0dGxpc3REZWNsSGFuZGxlcikoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfQXR0bGlzdERlY2xIYW5kbGVyIGF0dGRlY2wpOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9TZXRFbnRpdHlEZWNsSGFuZGxlcikoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfRW50aXR5RGVjbEhhbmRsZXIgaGFuZGxlcik7CisJdm9pZCBBUElDQUxMICgqWE1MX1NldFVucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1VucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIgaGFuZGxlcik7CisJdm9pZCBBUElDQUxMICgqWE1MX1NldE5vdGF0aW9uRGVjbEhhbmRsZXIpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX05vdGF0aW9uRGVjbEhhbmRsZXIgaGFuZGxlcik7CisJdm9pZCBBUElDQUxMICgqWE1MX1NldE5vdFN0YW5kYWxvbmVIYW5kbGVyKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Ob3RTdGFuZGFsb25lSGFuZGxlciBoYW5kbGVyKTsKKwllbnVtIFhNTF9FcnJvciBBUElDQUxMICgqWE1MX0dldEVycm9yQ29kZSkoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyKTsKKwljb25zdCBYTUxfTENoYXIgKiBBUElDQUxMICgqWE1MX0Vycm9yU3RyaW5nKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgZW51bSBYTUxfRXJyb3IgY29kZSk7CisJbG9uZyBBUElDQUxMICgqWE1MX0dldEN1cnJlbnRCeXRlSW5kZXgpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlcik7CisJaW50IEFQSUNBTEwgKCpYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlcik7CisJaW50IEFQSUNBTEwgKCpYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlcikoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyKTsKKwlpbnQgQVBJQ0FMTCAoKlhNTF9HZXRDdXJyZW50Qnl0ZUNvdW50KShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIpOworCWNvbnN0IGNoYXIgKiBBUElDQUxMICgqWE1MX0dldElucHV0Q29udGV4dCkoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBpbnQgKiBvZmZzZXQsIGludCAqIHNpemUpOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9TZXRVc2VyRGF0YSkoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCB2b2lkICogdXNlckRhdGEpOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9EZWZhdWx0Q3VycmVudCkoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyKTsKKwl2b2lkIEFQSUNBTEwgKCpYTUxfVXNlUGFyc2VyQXNIYW5kbGVyQXJnKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIpOworCWVudW0gWE1MX1N0YXR1cyBBUElDQUxMICgqWE1MX1NldEJhc2UpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgWE1MX0NoYXIgKiBiYXNlKTsKKwljb25zdCBYTUxfQ2hhciAqIEFQSUNBTEwgKCpYTUxfR2V0QmFzZSkoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyKTsKKwlpbnQgQVBJQ0FMTCAoKlhNTF9HZXRTcGVjaWZpZWRBdHRyaWJ1dGVDb3VudCkoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyKTsKKwlpbnQgQVBJQ0FMTCAoKlhNTF9HZXRJZEF0dHJpYnV0ZUluZGV4KShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIpOworCWVudW0gWE1MX1N0YXR1cyBBUElDQUxMICgqWE1MX1NldEVuY29kaW5nKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICogZW5jb2RpbmcpOworCWludCBBUElDQUxMICgqWE1MX1NldFBhcmFtRW50aXR5UGFyc2luZykoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBlbnVtIFhNTF9QYXJhbUVudGl0eVBhcnNpbmcgcGFyc2luZyk7CisJdm9pZCBBUElDQUxMICgqWE1MX1NldFJldHVybk5TVHJpcGxldCkoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBpbnQgZG9fbnN0KTsKKwljb25zdCBYTUxfTENoYXIgKiBBUElDQUxMICgqWE1MX0V4cGF0VmVyc2lvbikoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYpOworCVhNTF9FeHBhdF9WZXJzaW9uIEFQSUNBTEwgKCpYTUxfRXhwYXRWZXJzaW9uSW5mbykoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYpOworCVhNTF9Cb29sIEFQSUNBTEwgKCpYTUxfUGFyc2VyUmVzZXQpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgWE1MX0NoYXIgKiBlbmNvZGluZyk7CisJdm9pZCBBUElDQUxMICgqWE1MX1NldFNraXBwZWRFbnRpdHlIYW5kbGVyKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Ta2lwcGVkRW50aXR5SGFuZGxlciBoYW5kbGVyKTsKKwllbnVtIFhNTF9FcnJvciBBUElDQUxMICgqWE1MX1VzZUZvcmVpZ25EVEQpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0Jvb2wgdXNlRFREKTsKKwljb25zdCBYTUxfRmVhdHVyZSAqIEFQSUNBTEwgKCpYTUxfR2V0RmVhdHVyZUxpc3QpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmKTsKKwllbnVtIFhNTF9TdGF0dXMgQVBJQ0FMTCAoKlhNTF9TdG9wUGFyc2VyKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Cb29sIHJlc3VtYWJsZSk7CisJZW51bSBYTUxfU3RhdHVzIEFQSUNBTEwgKCpYTUxfUmVzdW1lUGFyc2VyKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIpOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9HZXRQYXJzaW5nU3RhdHVzKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9QYXJzaW5nU3RhdHVzICogc3RhdHVzKTsKKwl2b2lkIEFQSUNBTEwgKCpYTUxfRnJlZUNvbnRlbnRNb2RlbCkoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfQ29udGVudCAqIG1vZGVsKTsKKwl2b2lkICogQVBJQ0FMTCAoKlhNTF9NZW1NYWxsb2MpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgc2l6ZV90IHNpemUpOworCXZvaWQgKiBBUElDQUxMICgqWE1MX01lbVJlYWxsb2MpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgdm9pZCAqIHB0ciwgc2l6ZV90IHNpemUpOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9NZW1GcmVlKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIHZvaWQgKiBwdHIpOworfTsKKworI2VuZGlmIC8qIEVYUEFUX0lOVEVSRkFDRV9ERUZfSCAqLwpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvYW1pZ2EvaW5jbHVkZS9saWJyYXJpZXMvZXhwYXQuaCBiL2V4cGF0LTIuMC4xL2FtaWdhL2luY2x1ZGUvbGlicmFyaWVzL2V4cGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI1NzM4NwotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2FtaWdhL2luY2x1ZGUvbGlicmFyaWVzL2V4cGF0LmgKQEAgLTAsMCArMSw1NjYgQEAKKyNpZm5kZWYgTElCUkFSSUVTX0VYUEFUX0gKKyNkZWZpbmUgTElCUkFSSUVTX0VYUEFUX0gKKworLyoKKyoqIENvcHlyaWdodCAoYykgMjAwMS0yMDA3IEV4cGF0IG1haW50YWluZXJzLgorKioKKyoqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworKiogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisqKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisqKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisqKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyoqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworKiogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorKiogCisqKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorKiogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisqKiAKKyoqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorKiogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisqKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisqKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorKiogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyoqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisqKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmZGVmIF9fR05VQ19fCisgICAjaWZkZWYgX19QUENfXworICAgICNwcmFnbWEgcGFjaygyKQorICAgI2VuZGlmCisjZWxpZiBkZWZpbmVkKF9fVkJDQ19fKQorICAgI3ByYWdtYSBhbWlnYS1hbGlnbgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmbmRlZiBYTUxDQUxMCisjZGVmaW5lIFhNTENBTEwKKyNlbmRpZgorCit0eXBlZGVmIGNoYXIgWE1MX0NoYXI7Cit0eXBlZGVmIGNoYXIgWE1MX0xDaGFyOwordHlwZWRlZiBsb25nIFhNTF9JbmRleDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBYTUxfU2l6ZTsKKworc3RydWN0IFhNTF9QYXJzZXJTdHJ1Y3Q7Cit0eXBlZGVmIHN0cnVjdCBYTUxfUGFyc2VyU3RydWN0ICpYTUxfUGFyc2VyOworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgWE1MX0Jvb2w7CisjZGVmaW5lIFhNTF9UUlVFICAgKChYTUxfQm9vbCkgMSkKKyNkZWZpbmUgWE1MX0ZBTFNFICAoKFhNTF9Cb29sKSAwKQorCitlbnVtIFhNTF9TdGF0dXMgeworICBYTUxfU1RBVFVTX0VSUk9SID0gMCwKKyNkZWZpbmUgWE1MX1NUQVRVU19FUlJPUiBYTUxfU1RBVFVTX0VSUk9SCisgIFhNTF9TVEFUVVNfT0sgPSAxLAorI2RlZmluZSBYTUxfU1RBVFVTX09LIFhNTF9TVEFUVVNfT0sKKyAgWE1MX1NUQVRVU19TVVNQRU5ERUQgPSAyLAorI2RlZmluZSBYTUxfU1RBVFVTX1NVU1BFTkRFRCBYTUxfU1RBVFVTX1NVU1BFTkRFRAorfTsKKworZW51bSBYTUxfRXJyb3IgeworICBYTUxfRVJST1JfTk9ORSwKKyAgWE1MX0VSUk9SX05PX01FTU9SWSwKKyAgWE1MX0VSUk9SX1NZTlRBWCwKKyAgWE1MX0VSUk9SX05PX0VMRU1FTlRTLAorICBYTUxfRVJST1JfSU5WQUxJRF9UT0tFTiwKKyAgWE1MX0VSUk9SX1VOQ0xPU0VEX1RPS0VOLAorICBYTUxfRVJST1JfUEFSVElBTF9DSEFSLAorICBYTUxfRVJST1JfVEFHX01JU01BVENILAorICBYTUxfRVJST1JfRFVQTElDQVRFX0FUVFJJQlVURSwKKyAgWE1MX0VSUk9SX0pVTktfQUZURVJfRE9DX0VMRU1FTlQsCisgIFhNTF9FUlJPUl9QQVJBTV9FTlRJVFlfUkVGLAorICBYTUxfRVJST1JfVU5ERUZJTkVEX0VOVElUWSwKKyAgWE1MX0VSUk9SX1JFQ1VSU0lWRV9FTlRJVFlfUkVGLAorICBYTUxfRVJST1JfQVNZTkNfRU5USVRZLAorICBYTUxfRVJST1JfQkFEX0NIQVJfUkVGLAorICBYTUxfRVJST1JfQklOQVJZX0VOVElUWV9SRUYsCisgIFhNTF9FUlJPUl9BVFRSSUJVVEVfRVhURVJOQUxfRU5USVRZX1JFRiwKKyAgWE1MX0VSUk9SX01JU1BMQUNFRF9YTUxfUEksCisgIFhNTF9FUlJPUl9VTktOT1dOX0VOQ09ESU5HLAorICBYTUxfRVJST1JfSU5DT1JSRUNUX0VOQ09ESU5HLAorICBYTUxfRVJST1JfVU5DTE9TRURfQ0RBVEFfU0VDVElPTiwKKyAgWE1MX0VSUk9SX0VYVEVSTkFMX0VOVElUWV9IQU5ETElORywKKyAgWE1MX0VSUk9SX05PVF9TVEFOREFMT05FLAorICBYTUxfRVJST1JfVU5FWFBFQ1RFRF9TVEFURSwKKyAgWE1MX0VSUk9SX0VOVElUWV9ERUNMQVJFRF9JTl9QRSwKKyAgWE1MX0VSUk9SX0ZFQVRVUkVfUkVRVUlSRVNfWE1MX0RURCwKKyAgWE1MX0VSUk9SX0NBTlRfQ0hBTkdFX0ZFQVRVUkVfT05DRV9QQVJTSU5HLAorICBYTUxfRVJST1JfVU5CT1VORF9QUkVGSVgsCisgIFhNTF9FUlJPUl9VTkRFQ0xBUklOR19QUkVGSVgsCisgIFhNTF9FUlJPUl9JTkNPTVBMRVRFX1BFLAorICBYTUxfRVJST1JfWE1MX0RFQ0wsCisgIFhNTF9FUlJPUl9URVhUX0RFQ0wsCisgIFhNTF9FUlJPUl9QVUJMSUNJRCwKKyAgWE1MX0VSUk9SX1NVU1BFTkRFRCwKKyAgWE1MX0VSUk9SX05PVF9TVVNQRU5ERUQsCisgIFhNTF9FUlJPUl9BQk9SVEVELAorICBYTUxfRVJST1JfRklOSVNIRUQsCisgIFhNTF9FUlJPUl9TVVNQRU5EX1BFLAorICBYTUxfRVJST1JfUkVTRVJWRURfUFJFRklYX1hNTCwKKyAgWE1MX0VSUk9SX1JFU0VSVkVEX1BSRUZJWF9YTUxOUywKKyAgWE1MX0VSUk9SX1JFU0VSVkVEX05BTUVTUEFDRV9VUkkKK307CisKK2VudW0gWE1MX0NvbnRlbnRfVHlwZSB7CisgIFhNTF9DVFlQRV9FTVBUWSA9IDEsCisgIFhNTF9DVFlQRV9BTlksCisgIFhNTF9DVFlQRV9NSVhFRCwKKyAgWE1MX0NUWVBFX05BTUUsCisgIFhNTF9DVFlQRV9DSE9JQ0UsCisgIFhNTF9DVFlQRV9TRVEKK307CisKK2VudW0gWE1MX0NvbnRlbnRfUXVhbnQgeworICBYTUxfQ1FVQU5UX05PTkUsCisgIFhNTF9DUVVBTlRfT1BULAorICBYTUxfQ1FVQU5UX1JFUCwKKyAgWE1MX0NRVUFOVF9QTFVTCit9OworCit0eXBlZGVmIHN0cnVjdCBYTUxfY3AgWE1MX0NvbnRlbnQ7CisKK3N0cnVjdCBYTUxfY3AgeworICBlbnVtIFhNTF9Db250ZW50X1R5cGUgICAgICAgICB0eXBlOworICBlbnVtIFhNTF9Db250ZW50X1F1YW50ICAgICAgICBxdWFudDsKKyAgWE1MX0NoYXIgKiAgICAgICAgICAgICAgICAgICAgbmFtZTsKKyAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgbnVtY2hpbGRyZW47CisgIFhNTF9Db250ZW50ICogICAgICAgICAgICAgICAgIGNoaWxkcmVuOworfTsKKworCit0eXBlZGVmIHZvaWQgKCpYTUxfRWxlbWVudERlY2xIYW5kbGVyKSAodm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0NvbnRlbnQgKm1vZGVsKTsKKwordm9pZAorWE1MX1NldEVsZW1lbnREZWNsSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0VsZW1lbnREZWNsSGFuZGxlciBlbGRlY2wpOworCit0eXBlZGVmIHZvaWQgKCpYTUxfQXR0bGlzdERlY2xIYW5kbGVyKSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgICplbG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAgKmF0dG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAgKmF0dF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgICpkZmx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBpc3JlcXVpcmVkKTsKKwordm9pZAorWE1MX1NldEF0dGxpc3REZWNsSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0F0dGxpc3REZWNsSGFuZGxlciBhdHRkZWNsKTsKKwordHlwZWRlZiB2b2lkICgqWE1MX1htbERlY2xIYW5kbGVyKSAodm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICplbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzdGFuZGFsb25lKTsKKwordm9pZAorWE1MX1NldFhtbERlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgIFhNTF9YbWxEZWNsSGFuZGxlciB4bWxkZWNsKTsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgIHZvaWQgKigqbWFsbG9jX2Zjbikoc2l6ZV90IHNpemUpOworICB2b2lkICooKnJlYWxsb2NfZmNuKSh2b2lkICpwdHIsIHNpemVfdCBzaXplKTsKKyAgdm9pZCAoKmZyZWVfZmNuKSh2b2lkICpwdHIpOworfSBYTUxfTWVtb3J5X0hhbmRsaW5nX1N1aXRlOworCitYTUxfUGFyc2VyCitYTUxfUGFyc2VyQ3JlYXRlKGNvbnN0IFhNTF9DaGFyICplbmNvZGluZyk7CisKK1hNTF9QYXJzZXIKK1hNTF9QYXJzZXJDcmVhdGVOUyhjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmcsIFhNTF9DaGFyIG5hbWVzcGFjZVNlcGFyYXRvcik7CisKKworWE1MX1BhcnNlcgorWE1MX1BhcnNlckNyZWF0ZV9NTShjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9NZW1vcnlfSGFuZGxpbmdfU3VpdGUgKm1lbXN1aXRlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbmFtZXNwYWNlU2VwYXJhdG9yKTsKKworWE1MX0Jvb2wKK1hNTF9QYXJzZXJSZXNldChYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgWE1MX0NoYXIgKmVuY29kaW5nKTsKKwordHlwZWRlZiB2b2lkICgqWE1MX1N0YXJ0RWxlbWVudEhhbmRsZXIpICh2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICoqYXR0cyk7CisKK3R5cGVkZWYgdm9pZCAoKlhNTF9FbmRFbGVtZW50SGFuZGxlcikgKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5hbWUpOworCisKK3R5cGVkZWYgdm9pZCAoKlhNTF9DaGFyYWN0ZXJEYXRhSGFuZGxlcikgKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKTsKKwordHlwZWRlZiB2b2lkICgqWE1MX1Byb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIpICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpkYXRhKTsKKwordHlwZWRlZiB2b2lkICgqWE1MX0NvbW1lbnRIYW5kbGVyKSAodm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqZGF0YSk7CisKK3R5cGVkZWYgdm9pZCAoKlhNTF9TdGFydENkYXRhU2VjdGlvbkhhbmRsZXIpICh2b2lkICp1c2VyRGF0YSk7Cit0eXBlZGVmIHZvaWQgKCpYTUxfRW5kQ2RhdGFTZWN0aW9uSGFuZGxlcikgKHZvaWQgKnVzZXJEYXRhKTsKKwordHlwZWRlZiB2b2lkICgqWE1MX0RlZmF1bHRIYW5kbGVyKSAodm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pOworCit0eXBlZGVmIHZvaWQgKCpYTUxfU3RhcnREb2N0eXBlRGVjbEhhbmRsZXIpICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpkb2N0eXBlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHViaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYXNfaW50ZXJuYWxfc3Vic2V0KTsKKwordHlwZWRlZiB2b2lkICgqWE1MX0VuZERvY3R5cGVEZWNsSGFuZGxlcikodm9pZCAqdXNlckRhdGEpOworCit0eXBlZGVmIHZvaWQgKCpYTUxfRW50aXR5RGVjbEhhbmRsZXIpICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmVudGl0eU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfcGFyYW1ldGVyX2VudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzeXN0ZW1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJsaWNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpub3RhdGlvbk5hbWUpOworCit2b2lkCitYTUxfU2V0RW50aXR5RGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0VudGl0eURlY2xIYW5kbGVyIGhhbmRsZXIpOworCit0eXBlZGVmIHZvaWQgKCpYTUxfVW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlcikgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqZW50aXR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnB1YmxpY0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5vdGF0aW9uTmFtZSk7CisKK3R5cGVkZWYgdm9pZCAoKlhNTF9Ob3RhdGlvbkRlY2xIYW5kbGVyKSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpub3RhdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzeXN0ZW1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJsaWNJZCk7CisKK3R5cGVkZWYgdm9pZCAoKlhNTF9TdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyKSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqdXJpKTsKKwordHlwZWRlZiB2b2lkICgqWE1MX0VuZE5hbWVzcGFjZURlY2xIYW5kbGVyKSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwcmVmaXgpOworCit0eXBlZGVmIGludCAoKlhNTF9Ob3RTdGFuZGFsb25lSGFuZGxlcikgKHZvaWQgKnVzZXJEYXRhKTsKKwordHlwZWRlZiBpbnQgKCpYTUxfRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyKSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqc3lzdGVtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHVibGljSWQpOworCit0eXBlZGVmIHZvaWQgKCpYTUxfU2tpcHBlZEVudGl0eUhhbmRsZXIpICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmVudGl0eU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfcGFyYW1ldGVyX2VudGl0eSk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IG1hcFsyNTZdOworICB2b2lkICpkYXRhOworICBpbnQgKCpjb252ZXJ0KSh2b2lkICpkYXRhLCBjb25zdCBjaGFyICpzKTsKKyAgdm9pZCAoKnJlbGVhc2UpKHZvaWQgKmRhdGEpOworfSBYTUxfRW5jb2Rpbmc7CisKK3R5cGVkZWYgaW50ICgqWE1MX1Vua25vd25FbmNvZGluZ0hhbmRsZXIpICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmVuY29kaW5nSGFuZGxlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmNvZGluZyAqaW5mbyk7CisKK3ZvaWQKK1hNTF9TZXRFbGVtZW50SGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICBYTUxfU3RhcnRFbGVtZW50SGFuZGxlciBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICBYTUxfRW5kRWxlbWVudEhhbmRsZXIgZW5kKTsKKwordm9pZAorWE1MX1NldFN0YXJ0RWxlbWVudEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfU3RhcnRFbGVtZW50SGFuZGxlciBoYW5kbGVyKTsKKwordm9pZAorWE1MX1NldEVuZEVsZW1lbnRIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmRFbGVtZW50SGFuZGxlciBoYW5kbGVyKTsKKwordm9pZAorWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9DaGFyYWN0ZXJEYXRhSGFuZGxlciBoYW5kbGVyKTsKKwordm9pZAorWE1MX1NldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfUHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlciBoYW5kbGVyKTsKK3ZvaWQKK1hNTF9TZXRDb21tZW50SGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICBYTUxfQ29tbWVudEhhbmRsZXIgaGFuZGxlcik7CisKK3ZvaWQKK1hNTF9TZXRDZGF0YVNlY3Rpb25IYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1N0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlciBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmRDZGF0YVNlY3Rpb25IYW5kbGVyIGVuZCk7CisKK3ZvaWQKK1hNTF9TZXRTdGFydENkYXRhU2VjdGlvbkhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9TdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgc3RhcnQpOworCit2b2lkCitYTUxfU2V0RW5kQ2RhdGFTZWN0aW9uSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmRDZGF0YVNlY3Rpb25IYW5kbGVyIGVuZCk7CisKK3ZvaWQKK1hNTF9TZXREZWZhdWx0SGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICBYTUxfRGVmYXVsdEhhbmRsZXIgaGFuZGxlcik7CisKK3ZvaWQKK1hNTF9TZXREZWZhdWx0SGFuZGxlckV4cGFuZChYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfRGVmYXVsdEhhbmRsZXIgaGFuZGxlcik7CisKK3ZvaWQKK1hNTF9TZXREb2N0eXBlRGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9TdGFydERvY3R5cGVEZWNsSGFuZGxlciBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0VuZERvY3R5cGVEZWNsSGFuZGxlciBlbmQpOworCit2b2lkCitYTUxfU2V0U3RhcnREb2N0eXBlRGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1N0YXJ0RG9jdHlwZURlY2xIYW5kbGVyIHN0YXJ0KTsKKwordm9pZAorWE1MX1NldEVuZERvY3R5cGVEZWNsSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0VuZERvY3R5cGVEZWNsSGFuZGxlciBlbmQpOworCit2b2lkCitYTUxfU2V0VW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9VbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyIGhhbmRsZXIpOworCit2b2lkCitYTUxfU2V0Tm90YXRpb25EZWNsSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9Ob3RhdGlvbkRlY2xIYW5kbGVyIGhhbmRsZXIpOworCit2b2lkCitYTUxfU2V0TmFtZXNwYWNlRGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1N0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0VuZE5hbWVzcGFjZURlY2xIYW5kbGVyIGVuZCk7CisKK3ZvaWQKK1hNTF9TZXRTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1N0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIgc3RhcnQpOworCit2b2lkCitYTUxfU2V0RW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0VuZE5hbWVzcGFjZURlY2xIYW5kbGVyIGVuZCk7CisKK3ZvaWQKK1hNTF9TZXROb3RTdGFuZGFsb25lSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfTm90U3RhbmRhbG9uZUhhbmRsZXIgaGFuZGxlcik7CisKK3ZvaWQKK1hNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIgaGFuZGxlcik7CisKK3ZvaWQKK1hNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZyk7CisKK3ZvaWQKK1hNTF9TZXRTa2lwcGVkRW50aXR5SGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfU2tpcHBlZEVudGl0eUhhbmRsZXIgaGFuZGxlcik7CisKK3ZvaWQKK1hNTF9TZXRVbmtub3duRW5jb2RpbmdIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1Vua25vd25FbmNvZGluZ0hhbmRsZXIgaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmVuY29kaW5nSGFuZGxlckRhdGEpOworCit2b2lkCitYTUxfRGVmYXVsdEN1cnJlbnQoWE1MX1BhcnNlciBwYXJzZXIpOworCit2b2lkCitYTUxfU2V0UmV0dXJuTlNUcmlwbGV0KFhNTF9QYXJzZXIgcGFyc2VyLCBpbnQgZG9fbnN0KTsKKwordm9pZAorWE1MX1NldFVzZXJEYXRhKFhNTF9QYXJzZXIgcGFyc2VyLCB2b2lkICp1c2VyRGF0YSk7CisKKyNkZWZpbmUgWE1MX0dldFVzZXJEYXRhKHBhcnNlcikgKCoodm9pZCAqKikocGFyc2VyKSkKKworZW51bSBYTUxfU3RhdHVzCitYTUxfU2V0RW5jb2RpbmcoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICplbmNvZGluZyk7CisKK3ZvaWQKK1hNTF9Vc2VQYXJzZXJBc0hhbmRsZXJBcmcoWE1MX1BhcnNlciBwYXJzZXIpOworCitlbnVtIFhNTF9FcnJvcgorWE1MX1VzZUZvcmVpZ25EVEQoWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Cb29sIHVzZURURCk7CisKKworZW51bSBYTUxfU3RhdHVzCitYTUxfU2V0QmFzZShYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgWE1MX0NoYXIgKmJhc2UpOworCitjb25zdCBYTUxfQ2hhciAqCitYTUxfR2V0QmFzZShYTUxfUGFyc2VyIHBhcnNlcik7CisKK2ludAorWE1MX0dldFNwZWNpZmllZEF0dHJpYnV0ZUNvdW50KFhNTF9QYXJzZXIgcGFyc2VyKTsKKworaW50CitYTUxfR2V0SWRBdHRyaWJ1dGVJbmRleChYTUxfUGFyc2VyIHBhcnNlcik7CisKK2VudW0gWE1MX1N0YXR1cworWE1MX1BhcnNlKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBjaGFyICpzLCBpbnQgbGVuLCBpbnQgaXNGaW5hbCk7CisKK3ZvaWQgKgorWE1MX0dldEJ1ZmZlcihYTUxfUGFyc2VyIHBhcnNlciwgaW50IGxlbik7CisKK2VudW0gWE1MX1N0YXR1cworWE1MX1BhcnNlQnVmZmVyKFhNTF9QYXJzZXIgcGFyc2VyLCBpbnQgbGVuLCBpbnQgaXNGaW5hbCk7CisKK2VudW0gWE1MX1N0YXR1cworWE1MX1N0b3BQYXJzZXIoWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Cb29sIHJlc3VtYWJsZSk7CisKK2VudW0gWE1MX1N0YXR1cworWE1MX1Jlc3VtZVBhcnNlcihYTUxfUGFyc2VyIHBhcnNlcik7CisKK2VudW0gWE1MX1BhcnNpbmcgeworICBYTUxfSU5JVElBTElaRUQsCisgIFhNTF9QQVJTSU5HLAorICBYTUxfRklOSVNIRUQsCisgIFhNTF9TVVNQRU5ERUQKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZW51bSBYTUxfUGFyc2luZyBwYXJzaW5nOworICBYTUxfQm9vbCBmaW5hbEJ1ZmZlcjsKK30gWE1MX1BhcnNpbmdTdGF0dXM7CisKK3ZvaWQKK1hNTF9HZXRQYXJzaW5nU3RhdHVzKFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfUGFyc2luZ1N0YXR1cyAqc3RhdHVzKTsKKworWE1MX1BhcnNlcgorWE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICplbmNvZGluZyk7CisKK2VudW0gWE1MX1BhcmFtRW50aXR5UGFyc2luZyB7CisgIFhNTF9QQVJBTV9FTlRJVFlfUEFSU0lOR19ORVZFUiwKKyAgWE1MX1BBUkFNX0VOVElUWV9QQVJTSU5HX1VOTEVTU19TVEFOREFMT05FLAorICBYTUxfUEFSQU1fRU5USVRZX1BBUlNJTkdfQUxXQVlTCit9OworCitpbnQKK1hNTF9TZXRQYXJhbUVudGl0eVBhcnNpbmcoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gWE1MX1BhcmFtRW50aXR5UGFyc2luZyBwYXJzaW5nKTsKKworZW51bSBYTUxfRXJyb3IKK1hNTF9HZXRFcnJvckNvZGUoWE1MX1BhcnNlciBwYXJzZXIpOworCitpbnQgWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyKFhNTF9QYXJzZXIgcGFyc2VyKTsKK2ludCBYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlcihYTUxfUGFyc2VyIHBhcnNlcik7Citsb25nIFhNTF9HZXRDdXJyZW50Qnl0ZUluZGV4KFhNTF9QYXJzZXIgcGFyc2VyKTsKKworaW50CitYTUxfR2V0Q3VycmVudEJ5dGVDb3VudChYTUxfUGFyc2VyIHBhcnNlcik7CisKK2NvbnN0IGNoYXIgKgorWE1MX0dldElucHV0Q29udGV4dChYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgaW50ICpvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIGludCAqc2l6ZSk7CisKKyNkZWZpbmUgWE1MX0dldEVycm9yTGluZU51bWJlciAgIFhNTF9HZXRDdXJyZW50TGluZU51bWJlcgorI2RlZmluZSBYTUxfR2V0RXJyb3JDb2x1bW5OdW1iZXIgWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIKKyNkZWZpbmUgWE1MX0dldEVycm9yQnl0ZUluZGV4ICAgIFhNTF9HZXRDdXJyZW50Qnl0ZUluZGV4CisKK3ZvaWQKK1hNTF9GcmVlQ29udGVudE1vZGVsKFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfQ29udGVudCAqbW9kZWwpOworCit2b2lkICoKK1hNTF9NZW1NYWxsb2MoWE1MX1BhcnNlciBwYXJzZXIsIHNpemVfdCBzaXplKTsKKwordm9pZCAqCitYTUxfTWVtUmVhbGxvYyhYTUxfUGFyc2VyIHBhcnNlciwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSk7CisKK3ZvaWQKK1hNTF9NZW1GcmVlKFhNTF9QYXJzZXIgcGFyc2VyLCB2b2lkICpwdHIpOworCit2b2lkCitYTUxfUGFyc2VyRnJlZShYTUxfUGFyc2VyIHBhcnNlcik7CisKK2NvbnN0IFhNTF9MQ2hhciAqCitYTUxfRXJyb3JTdHJpbmcoZW51bSBYTUxfRXJyb3IgY29kZSk7CisKK2NvbnN0IFhNTF9MQ2hhciAqCitYTUxfRXhwYXRWZXJzaW9uKHZvaWQpOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBtYWpvcjsKKyAgaW50IG1pbm9yOworICBpbnQgbWljcm87Cit9IFhNTF9FeHBhdF9WZXJzaW9uOworCitYTUxfRXhwYXRfVmVyc2lvbiAKK1hNTF9FeHBhdFZlcnNpb25JbmZvKHZvaWQpOworCitlbnVtIFhNTF9GZWF0dXJlRW51bSB7CisgIFhNTF9GRUFUVVJFX0VORCA9IDAsCisgIFhNTF9GRUFUVVJFX1VOSUNPREUsCisgIFhNTF9GRUFUVVJFX1VOSUNPREVfV0NIQVJfVCwKKyAgWE1MX0ZFQVRVUkVfRFRELAorICBYTUxfRkVBVFVSRV9DT05URVhUX0JZVEVTLAorICBYTUxfRkVBVFVSRV9NSU5fU0laRSwKKyAgWE1MX0ZFQVRVUkVfU0laRU9GX1hNTF9DSEFSLAorICBYTUxfRkVBVFVSRV9TSVpFT0ZfWE1MX0xDSEFSLAorICBYTUxfRkVBVFVSRV9OUywKKyAgWE1MX0ZFQVRVUkVfTEFSR0VfU0laRQorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBlbnVtIFhNTF9GZWF0dXJlRW51bSAgZmVhdHVyZTsKKyAgY29uc3QgWE1MX0xDaGFyICAgICAgICpuYW1lOworICBsb25nIGludCAgICAgICAgICAgICAgdmFsdWU7Cit9IFhNTF9GZWF0dXJlOworCitjb25zdCBYTUxfRmVhdHVyZSAqCitYTUxfR2V0RmVhdHVyZUxpc3Qodm9pZCk7CisKKworI2RlZmluZSBYTUxfTUFKT1JfVkVSU0lPTiAyCisjZGVmaW5lIFhNTF9NSU5PUl9WRVJTSU9OIDAKKyNkZWZpbmUgWE1MX01JQ1JPX1ZFUlNJT04gMQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgX19HTlVDX18KKyAgICNpZmRlZiBfX1BQQ19fCisgICAgI3ByYWdtYSBwYWNrKCkKKyAgICNlbmRpZgorI2VsaWYgZGVmaW5lZChfX1ZCQ0NfXykKKyAgICNwcmFnbWEgZGVmYXVsdC1hbGlnbgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZW5kaWYgIC8qIEVYUEFUX0VYUEFUX0ggKi8KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2FtaWdhL2luY2x1ZGUvcHJvdG8vZXhwYXQuaCBiL2V4cGF0LTIuMC4xL2FtaWdhL2luY2x1ZGUvcHJvdG8vZXhwYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGJmNjJjCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYW1pZ2EvaW5jbHVkZS9wcm90by9leHBhdC5oCkBAIC0wLDAgKzEsNTIgQEAKKyNpZm5kZWYgUFJPVE9fRVhQQVRfSAorI2RlZmluZSBQUk9UT19FWFBBVF9ICisKKyNpZm5kZWYgTElCUkFSSUVTX0VYUEFUX0gKKyNpbmNsdWRlIDxsaWJyYXJpZXMvZXhwYXQuaD4KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX05PTElCQkFTRV9fCisgI2lmbmRlZiBfX1VTRV9CQVNFVFlQRV9fCisgIGV4dGVybiBzdHJ1Y3QgTGlicmFyeSAqIEV4cGF0QmFzZTsKKyAjZWxzZQorICBleHRlcm4gc3RydWN0IExpYnJhcnkgKiBFeHBhdEJhc2U7CisgI2VuZGlmIC8qIF9fVVNFX0JBU0VUWVBFX18gKi8KKyNlbmRpZiAvKiBfX05PTElCQkFTRV9fICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgX19hbWlnYW9zNF9fCisgI2luY2x1ZGUgPGludGVyZmFjZXMvZXhwYXQuaD4KKyAjaWZkZWYgX19VU0VfSU5MSU5FX18KKyAgI2luY2x1ZGUgPGlubGluZTQvZXhwYXQuaD4KKyAjZW5kaWYgLyogX19VU0VfSU5MSU5FX18gKi8KKyAjaWZuZGVmIENMSUJfRVhQQVRfUFJPVE9TX0gKKyAgI2RlZmluZSBDTElCX0VYUEFUX1BST1RPU19IIDEKKyAjZW5kaWYgLyogQ0xJQl9FWFBBVF9QUk9UT1NfSCAqLworICNpZm5kZWYgX19OT0dMT0JBTElGQUNFX18KKyAgZXh0ZXJuIHN0cnVjdCBFeHBhdElGYWNlICpJRXhwYXQ7CisgI2VuZGlmIC8qIF9fTk9HTE9CQUxJRkFDRV9fICovCisjZWxzZSAvKiBfX2FtaWdhb3M0X18gKi8KKyAjaWZuZGVmIENMSUJfRVhQQVRfUFJPVE9TX0gKKyAgI2luY2x1ZGUgPGNsaWIvZXhwYXRfcHJvdG9zLmg+CisgI2VuZGlmIC8qIENMSUJfRVhQQVRfUFJPVE9TX0ggKi8KKyAjaWYgZGVmaW5lZChfX0dOVUNfXykKKyAgI2lmbmRlZiBfX1BQQ19fCisgICAjaW5jbHVkZSA8aW5saW5lL2V4cGF0Lmg+CisgICNlbHNlCisgICAjaW5jbHVkZSA8cHBjaW5saW5lL2V4cGF0Lmg+CisgICNlbmRpZiAvKiBfX1BQQ19fICovCisgI2VsaWYgZGVmaW5lZChfX1ZCQ0NfXykKKyAgI2lmbmRlZiBfX1BQQ19fCisgICAjaW5jbHVkZSA8aW5saW5lL2V4cGF0X3Byb3Rvcy5oPgorICAjZW5kaWYgLyogX19QUENfXyAqLworICNlbHNlCisgICNpbmNsdWRlIDxwcmFnbWFzL2V4cGF0X3ByYWdtYXMuaD4KKyAjZW5kaWYgLyogX19HTlVDX18gKi8KKyNlbmRpZiAvKiBfX2FtaWdhb3M0X18gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNlbmRpZiAvKiBQUk9UT19FWFBBVF9IICovCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9hbWlnYS9sYXVuY2guYyBiL2V4cGF0LTIuMC4xL2FtaWdhL2xhdW5jaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZTUyNmUKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9hbWlnYS9sYXVuY2guYwpAQCAtMCwwICsxLDU2IEBACisvKgorKiogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDcgRXhwYXQgbWFpbnRhaW5lcnMuCisqKgorKiogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisqKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyoqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyoqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyoqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworKiogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisqKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisqKiAKKyoqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisqKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyoqIAorKiogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisqKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyoqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyoqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisqKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorKiogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyoqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHByb3RvL2V4ZWMuaD4KKworc3RydWN0IExpYnJhcnkqIEV4cGF0QmFzZSA9IDA7CitzdHJ1Y3QgRXhwYXRJRmFjZSogSUV4cGF0ID0gMDsKKworCit2b2lkIHNldHVwKCkgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKTsKK3ZvaWQgY2xlYW51cCgpIF9fYXR0cmlidXRlX18oKGRlc3RydWN0b3IpKTsKKworCit2b2lkIHNldHVwKCkKK3sKKwlFeHBhdEJhc2UgPSBPcGVuTGlicmFyeSgiZXhwYXQubGlicmFyeSIsIDQpOworCUlFeHBhdCA9IChzdHJ1Y3QgRXhwYXRJRmFjZSopR2V0SW50ZXJmYWNlKEV4cGF0QmFzZSwgIm1haW4iLCAxLCBOVUxMKTsKKwlpZiAoIElFeHBhdCA9PSAwICkgIHsKKwkJRGVidWdQcmludEYoIkNhbid0IG9wZW4gZXhwYXQubGlicmFyeVxuIik7CisJfQorfQorCisKK3ZvaWQgY2xlYW51cCgpCit7CisJaWYgKCBJRXhwYXQgIT0gMCApICB7CisJCURyb3BJbnRlcmZhY2UoKHN0cnVjdCBJbnRlcmZhY2UqKUlFeHBhdCk7CisJCUlFeHBhdCA9IDA7CisJfQorCisJaWYgKCBFeHBhdEJhc2UgIT0gMCApICB7CisJCUNsb3NlTGlicmFyeShFeHBhdEJhc2UpOworCQlFeHBhdEJhc2UgPSAwOworCX0KK30KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2FtaWdhL3N0ZGxpYi5jIGIvZXhwYXQtMi4wLjEvYW1pZ2Evc3RkbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMzMWYyMwotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2FtaWdhL3N0ZGxpYi5jCkBAIC0wLDAgKzEsMTA5IEBACisvKgorKiogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDcgRXhwYXQgbWFpbnRhaW5lcnMuCisqKgorKiogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisqKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyoqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyoqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyoqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworKiogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisqKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisqKiAKKyoqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisqKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyoqIAorKiogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisqKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyoqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyoqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisqKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorKiogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyoqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGV4ZWMvbWVtb3J5Lmg+CisjaW5jbHVkZSA8cHJvdG8vZXhlYy5oPgorI2luY2x1ZGUgPHByb3RvL3V0aWxpdHkuaD4KKwordm9pZCAqIG1hbGxvYyAoc2l6ZV90IGxlbikKK3sKKwl1aW50MzIgc2l6ZSA9IHNpemVvZih1aW50MzIpICsgbGVuOworCisJdWludDMyICptZW0gPSBBbGxvY01lbShzaXplLCBNRU1GX1NIQVJFRCk7CisJaWYgKCBtZW0gIT0gMCApICB7CisJCSptZW0gPSBzaXplOworCQkrK21lbTsKKwl9CisKKwlyZXR1cm4gbWVtOworfQorCisKK3ZvaWQgKiByZWFsbG9jICh2b2lkICogbWVtLCBzaXplX3QgbGVuMikKK3sKKwlpZiAoIG1lbSA9PSAwICkgIHsKKwkJcmV0dXJuIG1hbGxvYyhsZW4yKTsKKwl9CisKKwlpZiAoIGxlbjIgPT0gMCApICB7CisJCWZyZWUobWVtKTsKKwkJcmV0dXJuIDA7CisJfQorCisJdm9pZCAqIG5ld19tZW0gPSBtYWxsb2MobGVuMik7CisJaWYgKCBuZXdfbWVtID09IDAgKSAgeworCQlyZXR1cm4gMDsKKwl9CisKKwl1aW50MzIgbWVtX3NpemUgPSAqKCgodWludDMyKiltZW0pIC0gMSk7CisJQ29weU1lbShtZW0sIG5ld19tZW0sIG1lbV9zaXplKTsKKwlmcmVlKG1lbSk7CisKKwlyZXR1cm4gbmV3X21lbTsKK30KKworCit2b2lkIGZyZWUgKHZvaWQgKiBtZW0pCit7CisJaWYgKCBtZW0gIT0gMCApICB7CisJCXVpbnQzMiAqIHNpemVfcHRyID0gKCh1aW50MzIqKW1lbSkgLSAxOworCQlGcmVlTWVtKHNpemVfcHRyLCAqc2l6ZV9wdHIpOworCX0KK30KKworCitpbnQgbWVtY21wIChjb25zdCB2b2lkICogYSwgY29uc3Qgdm9pZCAqIGIsIHNpemVfdCBsZW4pCit7CisJc2l6ZV90IGk7CisJaW50IGRpZmY7CisKKwlmb3IgKCBpID0gMDsgaSA8IGxlbjsgKytpICkgIHsKKwkJZGlmZiA9ICooKHVpbnQ4ICopYSsrKSAtICooKHVpbnQ4ICopYisrKTsKKwkJaWYgKCBkaWZmICkgIHsKKwkJCXJldHVybiBkaWZmOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCAqIG1lbWNweSAodm9pZCAqIHQsIGNvbnN0IHZvaWQgKiBhLCBzaXplX3QgbGVuKQoreworCUNvcHlNZW0oKEFQVFIpYSwgdCwgbGVuKTsKKwlyZXR1cm4gdDsKK30KKworCit2b2lkICogbWVtbW92ZSAodm9pZCAqIHQxLCBjb25zdCB2b2lkICogdDIsIHNpemVfdCBsZW4pCit7CisJTW92ZU1lbSgoQVBUUil0MiwgdDEsIGxlbik7CisJcmV0dXJuIHQxOworfQorCisKK3ZvaWQgKiBtZW1zZXQgKHZvaWQgKiB0LCBpbnQgYywgc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gU2V0TWVtKHQsIGMsIGxlbik7Cit9CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9iY2I1L1JFQURNRS50eHQgYi9leHBhdC0yLjAuMS9iY2I1L1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg2ZjFjYQotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2JjYjUvUkVBRE1FLnR4dApAQCAtMCwwICsxLDg3IEBACisKKyAgICAgICAgICAgICAgICAgICBVc2luZyBhIEJvcmxhbmQgY29tcGlsZXIgcHJvZHVjdAorCitUaGUgZmlsZXMgaW4gdGhpcyBkaXJlY3Rvcnkgc3VwcG9ydCB1c2luZyBib3RoIHRoZSBmcmVlIEJvcmxhbmQgY29tbWFuZC1saW5lCitjb21waWxlciB0b29scyBhbmQgdGhlIEJvcmxhbmQgQysrIEJ1aWxkZXIgSURFLiAgVGhlIHByb2plY3QgZmlsZXMgaGF2ZSBiZWVuCit0ZXN0ZWQgd2l0aCBib3RoIHZlcnNpb25zIDUgYW5kIDYgb2YgdGhlIEMrKyBCdWlsZGVyIHByb2R1Y3QuCisKKyAgICAgICAgICAgICBVc2luZyB0aGUgZnJlZSBCQ0MzMiBjb21tYW5kIGxpbmUgY29tcGlsZXIKKworQWZ0ZXIgZG93bmxvYWRpbmcgYW5kIGluc3RhbGxpbmcgdGhlIGZyZWUgQysrIEJ1aWxkZXIgY29tbWFuZGxpbmUgdmVyc2lvbiwKK3BlcmZvcm0gdGhlIGZvbGxvd2luZyBzdGVwcyAoYXNzdW1pbmcgaXQgd2FzIGluc3RhbGxlZCB1bmRlciBDOlxCb3JsYW5kXEJDQzU1KToKKworMSkgQWRkICJDOlxCb3JsYW5kXEJDQzU1XEJJTiIgdG8geW91ciBwYXRoCisyKSBTZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEJDQiB0byAiQzpcQm9ybGFuZFxCQ0M1NSIuCiszKSBlZGl0IG1ha2VmaWxlLm1hazogZW5hYmxlIG9yIGNvbW1lbnQgb3V0IHRoZSBhcHByb3ByaWF0ZSBjb21tYW5kcyB1bmRlcgorICAgY2xlYW4gJiBkaXN0Y2xlYW4sIGRlcGVuZGluZyBvbiB3aGV0aGVyIHlvdXIgT1MgY2FuIHVzZSBkZWx0cmVlIC95IG9yCisgICBkZWwgL3MvZi9xLgorCitBZnRlciB0aGF0LCB5b3Ugc2hvdWxkIHNpbXBseSBjZCB0byB0aGUgYmNiNSBkaXJlY3RvcnkgaW4geW91ciBFeHBhdCBkaXJlY3RvcnkKK3RyZWUgKHNhbWUgc3RydWN0dXJlIGFzIENWUykgYW5kIHJ1biAibWFrZSBhbGwiIG9yIGp1c3QgIm1ha2UiLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtaW5nCisKK1RoZSBsaWJyYXJpZXMgaGF2ZSB0aGUgYmFzZSBuYW1lICJsaWJleHBhdCIgZm9sbG93ZWQgb3B0aW9uYWxseSBieSBhbiAicyIKKyhzdGF0aWMpIG9yIGEgInciICh1bmljb2RlIHZlcnNpb24pLCB0aGVuIGFuIHVuZGVyc2NvcmUgYW5kIG9wdGlvbmFsbHkKKyJtdCIgKG11bHRpLXRocmVhZGVkKSBhbmQgImQiIChkeW5hbWljIFJUTCkuCisKK1RvIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSBhIHByb2plY3QgZmlsZSBwcm9kdWNlcywgZWRpdCB0aGUgcHJvamVjdAorb3B0aW9uIHNvdXJjZSAoc2VlIHN0ZXAgMSB1bmRlciBVbmljb2RlIGJlbG93KSBhbmQgY2hhbmdlIHRoZSBuYW1lIGNvbnRhaW5lZCBpbgordGhlIFBST0pFQ1QgdGFnLiBJbiBhIG1ha2UgZmlsZSwgY2hhbmdlIHRoZSB2YWx1ZSBhc3NpZ25lZCB0byB0aGUgUFJPSkVDVAordmFyaWFibGUuIEFsc28sIHRoZSBMSUJSQVJZIGVudHJ5IGluIHRoZSAuZGVmIGZpbGUgaGFzIHRvIGJlIGNoYW5nZWQgdG8KK2NvcnJlc3BvbmQgdG8gdGhlIG5ldyBleGVjdXRhYmxlIG5hbWUuCisKKworICAgICAgICAgICAgICAgICAgICAgICBVbmljb2RlIENvbnNpZGVyYXRpb25zCisKK1RoZXJlIGFyZSBubyBmYWNpbGl0aWVzIGluIHRoZSBCQ0IgNSBHVUkgdG8gY3JlYXRlIGEgdW5pY29kZS1lbmFibGVkCithcHBsaWNhdGlvbi4gRm9ydHVuYXRlbHksIGl0IGlzIG5vdCBoYXJkIHRvIGRvIGJ5IGhhbmQuCisKKzEuIFRoZSBzdGFydHVwIC5vYmogc3lzdGVtIGZpbGUgbXVzdCBiZSBjaGFuZ2VkIHRvIHRoZSB1bmljb2RlIHZlcnNpb24uCisgICBHbyB0byBQcm9qZWN0fEVkaXQgT3B0aW9uIFNvdXJjZSwgYW5kIHNjcm9sbCBkb3duIHRvIHRoZSBBTExPQkogdGFnLiBDaGFuZ2UKKyAgIGMweDMyLm9iaiB0byBjMHgzMncub2JqLiBFZGl0aW5nIHRoaXMgZmlsZSBjYW4gYmUgcXVpcmt5LCBidXQgdXN1YWxseSB0aGUKKyAgIGZvbGxvd2luZyBrbHVkZ2Ugd2lsbCBtYWtlIHRoZSBjaGFuZ2Ugc3RpY2suIENsb3NlIGFuZCBzYXZlIHRoZSBmaWxlCisgICAoQ1RSTC1GNCkgdGhlbiBvcGVuIHRoZSBvcHRpb25zIGRpYWxvZyAoQ1RSTC1TaGlmdC1GMTEpLCB0aGVuIGNsaWNrIE9LIG9uCisgICB0aGUgZGlhbG9nIGltbWVkaWF0ZWx5IHdpdGhvdXQgY2hhbmdpbmcgYW55dGhpbmcgaW4gaXQuIElmIHRoaXMgZG9lc24ndCB3b3JrLAorICAgeW91IHdpbGwgaGF2ZSB0byBjbG9zZSB0aGUgcHJvamVjdCBjb21wbGV0ZWx5IGFuZCBlZGl0IHRoZSAuYnByIGZpbGUgYnkgaGFuZC4KKworICAgSWYgeW91IGFyZSB1c2luZyBhIG1ha2UgZmlsZSwganVzdCBjaGFuZ2UgdGhlIHN0YXJ0dXAgLm9iaiBmaWxlIGFzc2lnbmVkCisgICB0byB0aGUgQUxMT0JKIHZhcmlhYmxlLgorCisyLiBBZGQgdGhlIG1hY3JvIGRlZmluZSBYTUxfVU5JQ09ERV9XQ0hBUl9ULiBJbiB0aGUgR1VJIHRoYXQgZ29lcyBpbiB0aGUgb3B0aW9ucworICAgZGlhbG9nLCBEaXJlY3Rvcmllcy9Db25kaXRpb25hbHMgdGFiLCBpbiB0aGUgQ29uZGl0aW9uYWwgZGVmaW5lIGJveC4gSW4gYQorICAgbWFrZSBmaWxlLCBwdXQgaXQgaW4gdGhlIFVTRVJERUZJTkVTIHZhcmlhYmxlLgorCiszLiBPZiBjb3Vyc2UsIHlvdXIgY29kZSBoYXMgdG8gYmUgd3JpdHRlbiBmb3IgdW5pY29kZS4gQXMgYSBzdGFydCwgdGhlICJtYWluIgorICAgZnVuY3Rpb24gaXMgY2FsbGVkICJ3bWFpbiIuIFRoZSB0Y2hhciBtYWNyb3MgYXJlIGFuIGludGVyZXN0aW5nIHdheSB0bworICAgd3JpdGUgY29kZSB0aGF0IGNhbiBlYXNpbHkgc3dpdGNoIGJldHdlZW4gdW5pY29kZSBhbmQgdXRmLTguIElmIHRoZXNlIG1hY3JvcworICAgYXJlIHVzZWQsIHRoZW4gc2ltcGx5IGFkZGluZyB0aGUgY29uZGl0aW9uYWwgZGVmaW5lIF9VTklDT0RFIGFzIHdlbGwgYXMKKyAgIFhNTF9VTklDT0RFX1dDSEFSX1Qgd2lsbCBicmluZyBpbiB0aGUgdW5pY29kZSB2ZXJzaW9ucyBvZiB0aGUgdGNoYXIgbWFjcm9zLgorICAgT3RoZXJ3aXNlIHRoZSB1dGYtOCB2ZXJzaW9ucyBhcmUgdXNlZC4geG1sd2YgdXNlcyBpdHMgb3duIHZlcnNpb25zIG9mIHRoZQorICAgdGNoYXIgbWFjcm9zIHdoaWNoIGFyZSBzd2l0Y2hlZCBvbiBhbmQgb2ZmIGJ5IHRoZSBYTUxfVU5JQ09ERSBtYWNybywgd2hpY2gKKyAgIGl0c2VsZiBpcyBzZXQgYnkgdGhlIFhNTF9VTklDT0RFX1dDSEFSX1QgZGVmaW5lLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWRpbmcKKworVGhlIGxpYmV4cGF0IGxpYnJhcmllcyBhcmUgYWxsIGJ1aWx0IHRvIGxpbmsgd2l0aCB0aGUgbXVsdGktdGhyZWFkZWQgZHluYW1pYyBSVEwncy4KK1RoYXQgbWVhbnMgdGhleSByZXF1aXJlIENDMzJ4eE1ULkRMTCBwcmVzZW50IG9uIHRoZSBpbnN0YWxsYXRpb24gdGFyZ2V0LgorVG8gY3JlYXRlIHNpbmdsZS10aHJlYWRlZCBsaWJzLCBkbyB0aGUgZm9sbG93aW5nOgorCisxLiBUaGUgY29tcGlsZXIgb3B0aW9uIGZvciBtdWx0aS10aHJlYWRpbmcgbXVzdCBiZSB0dXJuZWQgb2ZmLiBGb2xsb3dpbmcgdGhlCisgICBpbnN0cnVjdGlvbnMgYWJvdmUgdG8gZWRpdCB0aGUgb3B0aW9uIHNvdXJjZSwgcmVtb3ZlIHRoZSAtdFdNIG9wdGlvbiBmcm9tCisgICB0aGUgQ0ZMQUcxIHRhZy4gSW4gYSBtYWtlIGZpbGUsIHJlbW92ZSBpdCBmcm9tIHRoZSBDRkxBRzEgdmFyaWFibGUuCisKKzIuIFRoZSBzaW5nbGUgdGhyZWFkZWQgUlRMIG11c3QgYmUgY2FsbGVkLiBjaGFuZ2UgdGhlIFJUTCBpbiB0aGUgQUxMTElCIHRhZyBvcgorICAgdmFyaWFibGUgKEdVSSBvciBtYWtlZmlsZSByZXBlY3RpdmVseSkgdG8gdGhlIHZlcnNpb24gd2l0aG91dCB0aGUgIm10IiBpbiB0aGUKKyAgIG5hbWUuIEZvciBleGFtcGxlLCBjaGFuZ2UgY3czMm10aS5saWIgdG8gY3czMmkubGliLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0aWMgUlRMJ3MKKworVG8gYnVpbGQgdGhlIGxpYnMgd2l0aCBzdGF0aWMgUlRMJ3MgZG8gdGhlIGZvbGxvd2luZywKKworMS4gRm9yIHRoZSBzdGF0aWMgZXhwYXRsaWJzLCBpbiB0aGUgVGxpYiB0YWIgb24gdGhlIG9wdGlvbnMgZGlhbG9nLCB1bmNoZWNrIHRoZQorICAgIlVzZSBkeW5hbWljIFJUTCIgYm94LiBGb3IgdGhlIGR5bmFtaWMgZXhwYXRsaWJzLCBpbiB0aGUgTGlua2VyIHRhYiBvbiB0aGUKKyAgIG9wdGlvbnMgZGlhbG9nLCB1bmNoZWNrICJVc2UgZHluYW1pYyBSVEwiLiBJZiB5b3UgYXJlIHVzaW5nIGEgbWFrZSBmaWxlLAorICAgcmVtb3ZlIHRoZSBfUlRMRExMIGFzc2lnbm1lbnQgdG8gdGhlIFNZU0RFRklORVMgdmFyaWFibGUsIGFuZCBjaGFuZ2UgdGhlIFJUTAorICAgdG8gdGhlIHZlcnNpb24gd2l0aG91dCBhbiAiaSIgaW4gdGhlIEFMTExJQiB2YXJpYWJsZS4gRm9yIGV4YW1wbGUsCisgICBjdzMybXRpLmxpYiB3b3VsZCBiZWNvbWUgY3czMm10LmxpYi4KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2JjYjUvYWxsX3Byb2plY3RzLmJwZyBiL2V4cGF0LTIuMC4xL2JjYjUvYWxsX3Byb2plY3RzLmJwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2M5YTFjCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYmNiNS9hbGxfcHJvamVjdHMuYnBnCkBAIC0wLDAgKzEsNDkgQEAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1ZFUlNJT04gPSBCV1MuMDEKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyFpZm5kZWYgUk9PVAorUk9PVCA9ICQoTUFLRURJUilcLi4KKyFlbmRpZgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTUFLRSA9ICQoUk9PVClcYmluXG1ha2UuZXhlIC0kKE1BS0VGTEFHUykgLWYkKioKK0RDQyA9ICQoUk9PVClcYmluXGRjYzMyLmV4ZSAkKioKK0JSQ0MgPSAkKFJPT1QpXGJpblxicmNjMzIuZXhlICQqKgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUFJPSkVDVFMgPSBzZXR1cCBsaWJleHBhdF9tdGQuZGxsIGxpYmV4cGF0c19tdGQubGliIGxpYmV4cGF0d19tdGQuZGxsIFwKKyAgbGliZXhwYXR3c19tdGQubGliIGVsZW1lbnRzLmV4ZSBvdXRsaW5lLmV4ZSB4bWx3Zi5leGUKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2RlZmF1bHQ6ICQoUFJPSkVDVFMpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2xpYmV4cGF0X210ZC5kbGw6IGV4cGF0LmJwcgorICAkKFJPT1QpXGJpblxicHIybWFrICQqKgorICAkKFJPT1QpXGJpblxtYWtlIC0kKE1BS0VGTEFHUykgLWYkKi5tYWsKKworbGliZXhwYXRzX210ZC5saWI6IGV4cGF0X3N0YXRpYy5icHIKKyAgJChST09UKVxiaW5cYnByMm1hayAtdCQoUk9PVClcYmluXGRlZmxpYi5ibWsgJCoqCisgICQoUk9PVClcYmluXG1ha2UgLSQoTUFLRUZMQUdTKSAtZiQqLm1haworCitsaWJleHBhdHdfbXRkLmRsbDogZXhwYXR3LmJwcgorICAkKFJPT1QpXGJpblxicHIybWFrICQqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAkKFJPT1QpXGJpblxtYWtlIC0kKE1BS0VGTEFHUykgLWYkKi5tYWsKKworbGliZXhwYXR3c19tdGQubGliOiBleHBhdHdfc3RhdGljLmJwcgorICAkKFJPT1QpXGJpblxicHIybWFrIC10JChST09UKVxiaW5cZGVmbGliLmJtayAkKioKKyAgJChST09UKVxiaW5cbWFrZSAtJChNQUtFRkxBR1MpIC1mJCoubWFrCisKK2VsZW1lbnRzLmV4ZTogZWxlbWVudHMuYnByCisgICQoUk9PVClcYmluXGJwcjJtYWsgJCoqCisgICQoUk9PVClcYmluXG1ha2UgLSQoTUFLRUZMQUdTKSAtZiQqLm1haworCitvdXRsaW5lLmV4ZTogb3V0bGluZS5icHIKKyAgJChST09UKVxiaW5cYnByMm1hayAkKioKKyAgJChST09UKVxiaW5cbWFrZSAtJChNQUtFRkxBR1MpIC1mJCoubWFrCisKK3htbHdmLmV4ZTogeG1sd2YuYnByCisgICQoUk9PVClcYmluXGJwcjJtYWsgJCoqCisgICQoUk9PVClcYmluXG1ha2UgLSQoTUFLRUZMQUdTKSAtZiQqLm1haworCitzZXR1cDogc2V0dXAuYmF0CisgIGNhbGwgJCoqCisKKwpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvYmNiNS9lbGVtZW50cy5icGYgYi9leHBhdC0yLjAuMS9iY2I1L2VsZW1lbnRzLmJwZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzFlODc4Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYmNiNS9lbGVtZW50cy5icGYKQEAgLTAsMCArMSw0IEBACitVU0VVTklUKCIuLlxleGFtcGxlc1xlbGVtZW50cy5jIik7CitVU0VMSUIoIlJlbGVhc2VcbGliZXhwYXRzX210ZC5saWIiKTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittYWluCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9iY2I1L2VsZW1lbnRzLmJwciBiL2V4cGF0LTIuMC4xL2JjYjUvZWxlbWVudHMuYnByCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMWMwZjUKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9iY2I1L2VsZW1lbnRzLmJwcgpAQCAtMCwwICsxLDE0OSBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnID8+Cis8IS0tIEMrK0J1aWxkZXIgWE1MIFByb2plY3QgLS0+Cis8UFJPSkVDVD4KKyAgPE1BQ1JPUz4KKyAgICA8VkVSU0lPTiB2YWx1ZT0iQkNCLjA1LjAzIi8+CisgICAgPFBST0pFQ1QgdmFsdWU9IlJlbGVhc2VcZWxlbWVudHMuZXhlIi8+CisgICAgPE9CSkZJTEVTIHZhbHVlPSJSZWxlYXNlXG9ialxleGFtcGxlc1xlbGVtZW50cy5vYmoiLz4KKyAgICA8UkVTRklMRVMgdmFsdWU9IiIvPgorICAgIDxJRExGSUxFUyB2YWx1ZT0iIi8+CisgICAgPElETEdFTkZJTEVTIHZhbHVlPSIiLz4KKyAgICA8REVGRklMRSB2YWx1ZT0iIi8+CisgICAgPFJFU0RFUEVOIHZhbHVlPSIkKFJFU0ZJTEVTKSIvPgorICAgIDxMSUJGSUxFUyB2YWx1ZT0iUmVsZWFzZVxsaWJleHBhdHNfbXRkLmxpYiIvPgorICAgIDxMSUJSQVJJRVMgdmFsdWU9IiIvPgorICAgIDxTUEFSRUxJQlMgdmFsdWU9IiIvPgorICAgIDxQQUNLQUdFUyB2YWx1ZT0iVkNMNTAuYnBpIFZDTFg1MC5icGkgYmNic21wNTAuYnBpIFFSUFQ1MC5icGkgVkNMREI1MC5icGkgVkNMQkRFNTAuYnBpIAorICAgICAgaWJzbXA1MC5icGkgVkNMREJYNTAuYnBpIFRFRVVJNTAuYnBpIFRFRURCNTAuYnBpIFRFRTUwLmJwaSBURUVRUjUwLmJwaSAKKyAgICAgIFZDTElCNTAuYnBpIGJjYmllNTAuYnBpIFZDTElFNTAuYnBpIElORVREQjUwLmJwaSBJTkVUNTAuYnBpIE5NRkFTVDUwLmJwaSAKKyAgICAgIGRjbG9jeDUwLmJwaSBiY2Iya2F4c2VydmVyNTAuYnBpIGRjbHVzcjUwLmJwaSIvPgorICAgIDxQQVRIQ1BQIHZhbHVlPSIuOy4uXGV4YW1wbGVzIi8+CisgICAgPFBBVEhQQVMgdmFsdWU9Ii47Ii8+CisgICAgPFBBVEhSQyB2YWx1ZT0iLjsiLz4KKyAgICA8UEFUSEFTTSB2YWx1ZT0iLjsiLz4KKyAgICA8REVCVUdMSUJQQVRIIHZhbHVlPSIkKEJDQilcbGliXGRlYnVnIi8+CisgICAgPFJFTEVBU0VMSUJQQVRIIHZhbHVlPSIkKEJDQilcbGliXHJlbGVhc2UiLz4KKyAgICA8TElOS0VSIHZhbHVlPSJpbGluazMyIi8+CisgICAgPFVTRVJERUZJTkVTIHZhbHVlPSJXSU4zMjtOREVCVUc7X0NPTlNPTEU7WE1MX1NUQVRJQyIvPgorICAgIDxTWVNERUZJTkVTIHZhbHVlPSJfTk9fVkNMO19BU1NFUlRFO05PX1NUUklDVDtfUlRMRExMIi8+CisgICAgPE1BSU5TT1VSQ0UgdmFsdWU9ImVsZW1lbnRzLmJwZiIvPgorICAgIDxJTkNMVURFUEFUSCB2YWx1ZT0iLi5cZXhhbXBsZXM7JChCQ0IpXGluY2x1ZGUiLz4KKyAgICA8TElCUEFUSCB2YWx1ZT0iLi5cZXhhbXBsZXM7JChCQ0IpXGxpYjskKFJFTEVBU0VMSUJQQVRIKSIvPgorICAgIDxXQVJOSU5HUyB2YWx1ZT0iLXctcGFyIC13LTgwMjcgLXctODAyNiIvPgorICA8L01BQ1JPUz4KKyAgPE9QVElPTlM+CisgICAgPElETENGTEFHUyB2YWx1ZT0iLUkkKEJDQilcaW5jbHVkZSIvPgorICAgIDxDRkxBRzEgdmFsdWU9Ii1PMiAtWC0gLWE4IC1iIC1rLSAtdmkgLXEgLXRXTSAtSS4uXGxpYiAtYyIvPgorICAgIDxQRkxBR1MgdmFsdWU9Ii1OMlJlbGVhc2Vcb2JqXGV4YW1wbGVzIC1OMFJlbGVhc2Vcb2JqXGV4YW1wbGVzIC0kWS0gLSRMLSAtJEQtIi8+CisgICAgPFJGTEFHUyB2YWx1ZT0iL2wgMHg0MDkgL2QgJnF1b3Q7TkRFQlVHJnF1b3Q7IC9pJChCQ0IpXGluY2x1ZGUiLz4KKyAgICA8QUZMQUdTIHZhbHVlPSIvbXggL3cyIC96biIvPgorICAgIDxMRkxBR1MgdmFsdWU9Ii1JUmVsZWFzZVxvYmpcZXhhbXBsZXMgLUQmcXVvdDsmcXVvdDsgLWFwIC1UcGUgLXggLUduIC1xIC1MLi5cTElCXFJFTEVBU0VfU1RBVElDIi8+CisgIDwvT1BUSU9OUz4KKyAgPExJTktFUj4KKyAgICA8QUxMT0JKIHZhbHVlPSJjMHgzMi5vYmogJChPQkpGSUxFUykiLz4KKyAgICA8QUxMUkVTIHZhbHVlPSIkKFJFU0ZJTEVTKSIvPgorICAgIDxBTExMSUIgdmFsdWU9IiQoTElCRklMRVMpICQoTElCUkFSSUVTKSBpbXBvcnQzMi5saWIgY3czMm10aS5saWIiLz4KKyAgPC9MSU5LRVI+CisgIDxJREVPUFRJT05TPgorW1ZlcnNpb24gSW5mb10KK0luY2x1ZGVWZXJJbmZvPTAKK0F1dG9JbmNCdWlsZD0wCitNYWpvclZlcj0xCitNaW5vclZlcj0wCitSZWxlYXNlPTAKK0J1aWxkPTAKK0RlYnVnPTAKK1ByZVJlbGVhc2U9MAorU3BlY2lhbD0wCitQcml2YXRlPTAKK0RMTD0wCitMb2NhbGU9MTAzMworQ29kZVBhZ2U9MTI1MgorCitbVmVyc2lvbiBJbmZvIEtleXNdCitDb21wYW55TmFtZT0KK0ZpbGVEZXNjcmlwdGlvbj0KK0ZpbGVWZXJzaW9uPTEuMC4wLjAKK0ludGVybmFsTmFtZT0KK0xlZ2FsQ29weXJpZ2h0PQorTGVnYWxUcmFkZW1hcmtzPQorT3JpZ2luYWxGaWxlbmFtZT0KK1Byb2R1Y3ROYW1lPQorUHJvZHVjdFZlcnNpb249MS4wLjAuMAorQ29tbWVudHM9CisKK1tIaXN0b3J5TGlzdHNcaGxJbmNsdWRlUGF0aF0KK0NvdW50PTQKK0l0ZW0wPS4uXGV4YW1wbGVzOyQoQkNCKVxpbmNsdWRlCitJdGVtMT0kKEJDQilcaW5jbHVkZQorSXRlbTI9JChCQ0IpXGluY2x1ZGU7JChCQ0IpXGluY2x1ZGVcbWZjOyQoQkNCKVxpbmNsdWRlXGF0bAorSXRlbTM9JChCQ0IpXGluY2x1ZGU7JChCQ0IpXGluY2x1ZGVcbWZjOyQoQkNCKVxpbmNsdWRlXGF0bDsKKworW0hpc3RvcnlMaXN0c1xobExpYnJhcnlQYXRoXQorQ291bnQ9OAorSXRlbTA9Li5cZXhhbXBsZXM7JChCQ0IpXGxpYjskKFJFTEVBU0VMSUJQQVRIKQorSXRlbTE9Li5cZXhhbXBsZXM7JChCQ0IpXGxpYjsuLlxleGFtcGxlc1wkKFJFTEVBU0VMSUJQQVRIKQorSXRlbTI9JChCQ0IpXGxpYjskKFJFTEVBU0VMSUJQQVRIKQorSXRlbTM9JChCQ0IpXGxpYjskKFJFTEVBU0VMSUJQQVRIKTsuLlxsaWJcUmVsZWFzZS13X3N0YXRpYworSXRlbTQ9JChCQ0IpXGxpYjskKFJFTEVBU0VMSUJQQVRIKTsuLlxsaWJcUmVsZWFzZV9zdGF0aWMKK0l0ZW01PSQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCk7Qzpcc3JjXGV4cGF0XGxpYlxSZWxlYXNlX3N0YXRpYworSXRlbTY9JChCQ0IpXGxpYjskKFJFTEVBU0VMSUJQQVRIKTskKEJDQilcbGliXHBzZGsKK0l0ZW03PSQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCk7OyQoQkNCKVxsaWJccHNkazsKKworW0hpc3RvcnlMaXN0c1xobERlYnVnU291cmNlUGF0aF0KK0NvdW50PTEKK0l0ZW0wPSQoQkNCKVxzb3VyY2VcdmNsCisKK1tIaXN0b3J5TGlzdHNcaGxDb25kaXRpb25hbHNdCitDb3VudD0xNworSXRlbTA9V0lOMzI7TkRFQlVHO19DT05TT0xFO1hNTF9TVEFUSUMKK0l0ZW0xPVdJTjMyO05ERUJVRztfQ09OU09MRTtfREVCVUc7WE1MX1NUQVRJQworSXRlbTI9V0lOMzI7TkRFQlVHO19DT05TT0xFO19ERUJVRztYTUxfVU5JQ09ERV9XQ0hBUl9UO19VTklDT0RFO1hNTF9TVEFUSUMKK0l0ZW0zPVdJTjMyO05ERUJVRztfQ09OU09MRTtfREVCVUc7WE1MX1VOSUNPREVfV0NIQVJfVDtfVU5JQ09ERQorSXRlbTQ9V0lOMzI7TkRFQlVHO19DT05TT0xFO19ERUJVRworSXRlbTU9V0lOMzI7TkRFQlVHO19DT05TT0xFO1hNTF9TVEFUSUM7X0RFQlVHCitJdGVtNj1XSU4zMjtOREVCVUc7X0NPTlNPTEU7WE1MX1NUQVRJQztfREVCVUc7X1VOSUNPREUKK0l0ZW03PVdJTjMyO05ERUJVRztfQ09OU09MRTtYTUxfU1RBVElDO19ERUJVRztYTUxfVU5JQ09ERV9XQ0hBUl9UCitJdGVtOD1XSU4zMjtOREVCVUc7X0NPTlNPTEU7X01CQ1M7WE1MX1NUQVRJQztfREVCVUc7WE1MX1VOSUNPREVfV0NIQVJfVAorSXRlbTk9V0lOMzI7TkRFQlVHO19DT05TT0xFO19VTklDT0RFO1hNTF9TVEFUSUM7X0RFQlVHO1hNTF9VTklDT0RFX1dDSEFSX1QKK0l0ZW0xMD1XSU4zMjtOREVCVUc7X0NPTlNPTEU7X1VOSUNPREU7WE1MX1NUQVRJQztfREVCVUc7WE1MX1VOSUNPREUKK0l0ZW0xMT1XSU4zMjtOREVCVUc7X0NPTlNPTEU7X01CQ1M7WE1MX1NUQVRJQztfREVCVUc7WE1MX1VOSUNPREVfV0NIQVJfVDtfX1dDSEFSX1QKK0l0ZW0xMj1XSU4zMjtOREVCVUc7X0NPTlNPTEU7X01CQ1M7WE1MX1NUQVRJQztfREVCVUc7WE1MX1VOSUNPREVfV0NIQVJfVDtfVU5JQ09ERQorSXRlbTEzPVdJTjMyO05ERUJVRztfQ09OU09MRTtfTUJDUztYTUxfU1RBVElDO19ERUJVRztYTUxfVU5JQ09ERTtfVU5JQ09ERQorSXRlbTE0PVdJTjMyO05ERUJVRztfQ09OU09MRTtfTUJDUztYTUxfU1RBVElDO19ERUJVRztYTUxfVU5JQ09ERQorSXRlbTE1PVdJTjMyO05ERUJVRztfQ09OU09MRTtfTUJDUztYTUxfU1RBVElDO19ERUJVRworSXRlbTE2PVdJTjMyO05ERUJVRztfQ09OU09MRTtfTUJDUztYTUxfU1RBVElDCisKK1tIaXN0b3J5TGlzdHNcaGxJbnRPdXRwdXREaXJdCitDb3VudD01CitJdGVtMD1SZWxlYXNlXG9ialxleGFtcGxlcworSXRlbTE9UmVsZWFzZVxvYmpcZWxlbWVudHMKK0l0ZW0yPVJlbGVhc2Vcb2JqXG10cworSXRlbTM9Li5cZXhhbXBsZXNcUmVsZWFzZQorSXRlbTQ9UmVsZWFzZQorCitbSGlzdG9yeUxpc3RzXGhsRmluYWxPdXRwdXREaXJdCitDb3VudD0xCitJdGVtMD1SZWxlYXNlXAorCitbRGVidWdnaW5nXQorRGVidWdTb3VyY2VEaXJzPQorCitbUGFyYW1ldGVyc10KK1J1blBhcmFtcz0KK0hvc3RBcHBsaWNhdGlvbj0KK1JlbW90ZUhvc3Q9CitSZW1vdGVQYXRoPQorUmVtb3RlRGVidWc9MAorCitbQ29tcGlsZXJdCitTaG93SW5mb01zZ3M9MAorTGlua0RlYnVnVmNsPTAKK0xpbmtDR0xJQj0wCisKK1tMYW5ndWFnZV0KK0FjdGl2ZUxhbmc9CitQcm9qZWN0TGFuZz0KK1Jvb3REaXI9CisgIDwvSURFT1BUSU9OUz4KKzwvUFJPSkVDVD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9iY2I1L2VsZW1lbnRzLm1hayBiL2V4cGF0LTIuMC4xL2JjYjUvZWxlbWVudHMubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NDI3ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9iY2I1L2VsZW1lbnRzLm1hawpAQCAtMCwwICsxLDE4NiBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyFpZiAhJGQoQkNCKQorQkNCID0gJChNQUtFRElSKVwuLgorIWVuZGlmCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIElERSBTRUNUSU9OCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgdGhlIHByb2plY3QgbWFrZWZpbGUgaXMgbWFuYWdlZCBieSB0aGUgQkNCIElERS4KKyMgSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBJREUgdG8gY2hhbmdlIGFueSBvZiB0aGUgdmFsdWVzIGluIHRoaXMKKyMgc2VjdGlvbi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1ZFUlNJT04gPSBCQ0IuMDUuMDMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQUk9KRUNUID0gUmVsZWFzZVxlbGVtZW50cy5leGUKK09CSkZJTEVTID0gUmVsZWFzZVxvYmpcZXhhbXBsZXNcZWxlbWVudHMub2JqCitSRVNGSUxFUyA9IAorTUFJTlNPVVJDRSA9IGVsZW1lbnRzLmJwZgorUkVTREVQRU4gPSAkKFJFU0ZJTEVTKQorTElCRklMRVMgPSBSZWxlYXNlXGxpYmV4cGF0c19tdGQubGliCitJRExGSUxFUyA9IAorSURMR0VORklMRVMgPSAKK0xJQlJBUklFUyA9IAorUEFDS0FHRVMgPSBWQ0w1MC5icGkgVkNMWDUwLmJwaSBiY2JzbXA1MC5icGkgUVJQVDUwLmJwaSBWQ0xEQjUwLmJwaSBWQ0xCREU1MC5icGkgXAorICAgIGlic21wNTAuYnBpIFZDTERCWDUwLmJwaSBURUVVSTUwLmJwaSBURUVEQjUwLmJwaSBURUU1MC5icGkgVEVFUVI1MC5icGkgXAorICAgIFZDTElCNTAuYnBpIGJjYmllNTAuYnBpIFZDTElFNTAuYnBpIElORVREQjUwLmJwaSBJTkVUNTAuYnBpIE5NRkFTVDUwLmJwaSBcCisgICAgZGNsb2N4NTAuYnBpIGJjYjJrYXhzZXJ2ZXI1MC5icGkgZGNsdXNyNTAuYnBpCitTUEFSRUxJQlMgPSAKK0RFRkZJTEUgPSAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQQVRIQ1BQID0gLjsuLlxleGFtcGxlcworUEFUSEFTTSA9IC47CitQQVRIUEFTID0gLjsKK1BBVEhSQyA9IC47CitERUJVR0xJQlBBVEggPSAkKEJDQilcbGliXGRlYnVnCitSRUxFQVNFTElCUEFUSCA9ICQoQkNCKVxsaWJccmVsZWFzZQorVVNFUkRFRklORVMgPSBXSU4zMjtOREVCVUc7X0NPTlNPTEU7WE1MX1NUQVRJQworU1lTREVGSU5FUyA9IF9OT19WQ0w7X0FTU0VSVEU7Tk9fU1RSSUNUO19SVExETEwKK0lOQ0xVREVQQVRIID0gLi5cZXhhbXBsZXM7JChCQ0IpXGluY2x1ZGUKK0xJQlBBVEggPSAuLlxleGFtcGxlczskKEJDQilcbGliOyQoUkVMRUFTRUxJQlBBVEgpCitXQVJOSU5HUz0gLXctcGFyIC13LTgwMjcgLXctODAyNgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NGTEFHMSA9IC1PMiAtWC0gLWE4IC1iIC1rLSAtdmkgLXEgLUkuLlxsaWIgLWMKK0lETENGTEFHUyA9IC1JJChCQ0IpXGluY2x1ZGUKK1BGTEFHUyA9IC1OMlJlbGVhc2Vcb2JqXGV4YW1wbGVzIC1OMFJlbGVhc2Vcb2JqXGV4YW1wbGVzIC0kWS0gLSRMLSAtJEQtCitSRkxBR1MgPSAvbCAweDQwOSAvZCAiTkRFQlVHIiAvaSQoQkNCKVxpbmNsdWRlCitBRkxBR1MgPSAvbXggL3cyIC96bgorTEZMQUdTID0gLUlSZWxlYXNlXG9ialxleGFtcGxlcyAtRCIiIC1hcCAtVHBlIC14IC1HbiAtcSAtTC4uXExJQlxSRUxFQVNFX1NUQVRJQworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FMTE9CSiA9IGMweDMyLm9iaiAkKE9CSkZJTEVTKQorQUxMUkVTID0gJChSRVNGSUxFUykKK0FMTExJQiA9ICQoTElCRklMRVMpICQoTElCUkFSSUVTKSBpbXBvcnQzMi5saWIgY3czMm10aS5saWIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCishaWZkZWYgSURFT1BUSU9OUworCitbVmVyc2lvbiBJbmZvXQorSW5jbHVkZVZlckluZm89MAorQXV0b0luY0J1aWxkPTAKK01ham9yVmVyPTEKK01pbm9yVmVyPTAKK1JlbGVhc2U9MAorQnVpbGQ9MAorRGVidWc9MAorUHJlUmVsZWFzZT0wCitTcGVjaWFsPTAKK1ByaXZhdGU9MAorRExMPTAKKworW1ZlcnNpb24gSW5mbyBLZXlzXQorQ29tcGFueU5hbWU9CitGaWxlRGVzY3JpcHRpb249CitGaWxlVmVyc2lvbj0xLjAuMC4wCitJbnRlcm5hbE5hbWU9CitMZWdhbENvcHlyaWdodD0KK0xlZ2FsVHJhZGVtYXJrcz0KK09yaWdpbmFsRmlsZW5hbWU9CitQcm9kdWN0TmFtZT0KK1Byb2R1Y3RWZXJzaW9uPTEuMC4wLjAKK0NvbW1lbnRzPQorCitbRGVidWdnaW5nXQorRGVidWdTb3VyY2VEaXJzPSQoQkNCKVxzb3VyY2VcdmNsCisKKyFlbmRpZgorCisKKworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE1BS0UgU0VDVElPTgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhpcyBzZWN0aW9uIG9mIHRoZSBwcm9qZWN0IGZpbGUgaXMgbm90IHVzZWQgYnkgdGhlIEJDQiBJREUuICBJdCBpcyBmb3IKKyMgdGhlIGJlbmVmaXQgb2YgYnVpbGRpbmcgZnJvbSB0aGUgY29tbWFuZC1saW5lIHVzaW5nIHRoZSBNQUtFIHV0aWxpdHkuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuYXV0b2RlcGVuZAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyFpZiAiJChVU0VSREVGSU5FUykiICE9ICIiCitBVVNFUkRFRklORVMgPSAtZCQoVVNFUkRFRklORVM6Oz0gLWQpCishZWxzZQorQVVTRVJERUZJTkVTID0KKyFlbmRpZgorCishaWYgISRkKEJDQzMyKQorQkNDMzIgPSBiY2MzMgorIWVuZGlmCisKKyFpZiAhJGQoQ1BQMzIpCitDUFAzMiA9IGNwcDMyCishZW5kaWYKKworIWlmICEkZChEQ0MzMikKK0RDQzMyID0gZGNjMzIKKyFlbmRpZgorCishaWYgISRkKFRBU00zMikKK1RBU00zMiA9IHRhc20zMgorIWVuZGlmCisKKyFpZiAhJGQoTElOS0VSKQorTElOS0VSID0gaWxpbmszMgorIWVuZGlmCisKKyFpZiAhJGQoQlJDQzMyKQorQlJDQzMyID0gYnJjYzMyCishZW5kaWYKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIWlmICRkKFBBVEhDUFApCisuUEFUSC5DUFAgPSAkKFBBVEhDUFApCisuUEFUSC5DICAgPSAkKFBBVEhDUFApCishZW5kaWYKKworIWlmICRkKFBBVEhQQVMpCisuUEFUSC5QQVMgPSAkKFBBVEhQQVMpCishZW5kaWYKKworIWlmICRkKFBBVEhBU00pCisuUEFUSC5BU00gPSAkKFBBVEhBU00pCishZW5kaWYKKworIWlmICRkKFBBVEhSQykKKy5QQVRILlJDICA9ICQoUEFUSFJDKQorIWVuZGlmCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJChQUk9KRUNUKTogJChJRExHRU5GSUxFUykgJChPQkpGSUxFUykgJChSRVNERVBFTikgJChERUZGSUxFKQorICAgICQoQkNCKVxCSU5cJChMSU5LRVIpIEAmJiEKKyAgICAkKExGTEFHUykgLUwkKExJQlBBVEgpICsKKyAgICAkKEFMTE9CSiksICsKKyAgICAkKFBST0pFQ1QpLCwgKworICAgICQoQUxMTElCKSwgKworICAgICQoREVGRklMRSksICsKKyAgICAkKEFMTFJFUykKKyEKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisucGFzLmhwcDoKKyAgICAkKEJDQilcQklOXCQoRENDMzIpICQoUEZMQUdTKSAtVSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtTyQoSU5DTFVERVBBVEgpIC0tQkNCIHskPCB9CisKKy5wYXMub2JqOgorICAgICQoQkNCKVxCSU5cJChEQ0MzMikgJChQRkxBR1MpIC1VJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1PJChJTkNMVURFUEFUSCkgLS1CQ0IgeyQ8IH0KKworLmNwcC5vYmo6CisgICAgJChCQ0IpXEJJTlwkKEJDQzMyKSAkKENGTEFHMSkgJChXQVJOSU5HUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLW4kKEBEKSB7JDwgfQorCisuYy5vYmo6CisgICAgJChCQ0IpXEJJTlwkKEJDQzMyKSAkKENGTEFHMSkgJChXQVJOSU5HUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLW4kKEBEKSB7JDwgfQorCisuYy5pOgorICAgICQoQkNCKVxCSU5cJChDUFAzMikgJChDRkxBRzEpICQoV0FSTklOR1MpIC1JJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1uLiB7JDwgfQorCisuY3BwLmk6CisgICAgJChCQ0IpXEJJTlwkKENQUDMyKSAkKENGTEFHMSkgJChXQVJOSU5HUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLW4uIHskPCB9CisKKy5hc20ub2JqOgorICAgICQoQkNCKVxCSU5cJChUQVNNMzIpICQoQUZMQUdTKSAtaSQoSU5DTFVERVBBVEg6Oz0gLWkpICQoQVVTRVJERUZJTkVTKSAtZCQoU1lTREVGSU5FUzo7PSAtZCkgJDwsICRACisKKy5yYy5yZXM6CisgICAgJChCQ0IpXEJJTlwkKEJSQ0MzMikgJChSRkxBR1MpIC1JJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1mbyRAICQ8CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKworCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9iY2I1L2V4cGF0LmJwZiBiL2V4cGF0LTIuMC4xL2JjYjUvZXhwYXQuYnBmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNDIzMjgKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9iY2I1L2V4cGF0LmJwZgpAQCAtMCwwICsxLDYgQEAKK1VTRVVOSVQoIi4uXGxpYlx4bWxwYXJzZS5jIik7CitVU0VVTklUKCIuLlxsaWJceG1scm9sZS5jIik7CitVU0VVTklUKCIuLlxsaWJceG1sdG9rLmMiKTsKK1VTRURFRigibGliZXhwYXRfbXRkLmRlZiIpOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRGxsRW50cnlQb2ludApkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvYmNiNS9leHBhdC5icHIgYi9leHBhdC0yLjAuMS9iY2I1L2V4cGF0LmJwcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTFiOGNhCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYmNiNS9leHBhdC5icHIKQEAgLTAsMCArMSwxNDAgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04JyA/PgorPCEtLSBDKytCdWlsZGVyIFhNTCBQcm9qZWN0IC0tPgorPFBST0pFQ1Q+CisgIDxNQUNST1M+CisgICAgPFZFUlNJT04gdmFsdWU9IkJDQi4wNS4wMyIvPgorICAgIDxQUk9KRUNUIHZhbHVlPSJSZWxlYXNlXGxpYmV4cGF0X210ZC5kbGwiLz4KKyAgICA8T0JKRklMRVMgdmFsdWU9IlJlbGVhc2Vcb2JqXGxpYmV4cGF0XHhtbHBhcnNlLm9iaiBSZWxlYXNlXG9ialxsaWJleHBhdFx4bWxyb2xlLm9iaiAKKyAgICAgIFJlbGVhc2Vcb2JqXGxpYmV4cGF0XHhtbHRvay5vYmoiLz4KKyAgICA8UkVTRklMRVMgdmFsdWU9IiIvPgorICAgIDxJRExGSUxFUyB2YWx1ZT0iIi8+CisgICAgPElETEdFTkZJTEVTIHZhbHVlPSIiLz4KKyAgICA8REVGRklMRSB2YWx1ZT0ibGliZXhwYXRfbXRkLmRlZiIvPgorICAgIDxSRVNERVBFTiB2YWx1ZT0iJChSRVNGSUxFUykiLz4KKyAgICA8TElCRklMRVMgdmFsdWU9IiIvPgorICAgIDxMSUJSQVJJRVMgdmFsdWU9IiIvPgorICAgIDxTUEFSRUxJQlMgdmFsdWU9IiIvPgorICAgIDxQQUNLQUdFUyB2YWx1ZT0iVkNMNTAuYnBpIFZDTFg1MC5icGkgYmNic21wNTAuYnBpIFFSUFQ1MC5icGkgVkNMREI1MC5icGkgVkNMQkRFNTAuYnBpIAorICAgICAgaWJzbXA1MC5icGkgVkNMREJYNTAuYnBpIFRFRVVJNTAuYnBpIFRFRURCNTAuYnBpIFRFRTUwLmJwaSBURUVRUjUwLmJwaSAKKyAgICAgIFZDTElCNTAuYnBpIGJjYmllNTAuYnBpIFZDTElFNTAuYnBpIElORVREQjUwLmJwaSBJTkVUNTAuYnBpIE5NRkFTVDUwLmJwaSAKKyAgICAgIGRjbG9jeDUwLmJwaSBiY2Iya2F4c2VydmVyNTAuYnBpIGRjbHVzcjUwLmJwaSIvPgorICAgIDxQQVRIQ1BQIHZhbHVlPSIuOy4uXGxpYiIvPgorICAgIDxQQVRIUEFTIHZhbHVlPSIuOyIvPgorICAgIDxQQVRIUkMgdmFsdWU9Ii47Ii8+CisgICAgPFBBVEhBU00gdmFsdWU9Ii47Ii8+CisgICAgPERFQlVHTElCUEFUSCB2YWx1ZT0iJChCQ0IpXGxpYlxkZWJ1ZyIvPgorICAgIDxSRUxFQVNFTElCUEFUSCB2YWx1ZT0iJChCQ0IpXGxpYlxyZWxlYXNlIi8+CisgICAgPExJTktFUiB2YWx1ZT0iaWxpbmszMiIvPgorICAgIDxVU0VSREVGSU5FUyB2YWx1ZT0iX1dJTkRPV1M7V0lOMzI7TkRFQlVHO19VU1JETEw7Q09NUElMRURfRlJPTV9EU1A7RVhQQVRfRVhQT1JUUyIvPgorICAgIDxTWVNERUZJTkVTIHZhbHVlPSJfTk9fVkNMO19BU1NFUlRFO05PX1NUUklDVDtfUlRMRExMIi8+CisgICAgPE1BSU5TT1VSQ0UgdmFsdWU9ImV4cGF0LmJwZiIvPgorICAgIDxJTkNMVURFUEFUSCB2YWx1ZT0iLi5cbGliOyQoQkNCKVxpbmNsdWRlIi8+CisgICAgPExJQlBBVEggdmFsdWU9Ii4uXGxpYjskKEJDQilcbGliOyQoUkVMRUFTRUxJQlBBVEgpIi8+CisgICAgPFdBUk5JTkdTIHZhbHVlPSItdy1yY2ggLXctcGFyIC13LTgwMjcgLXctODAyNiAtdy1jY2MiLz4KKyAgPC9NQUNST1M+CisgIDxPUFRJT05TPgorICAgIDxJRExDRkxBR1MgdmFsdWU9Ii1JJChCQ0IpXGluY2x1ZGUiLz4KKyAgICA8Q0ZMQUcxIHZhbHVlPSItV0QgLU8yIC1YLSAtYTggLWIgLWstIC12aSAtcSAtdFdNIC1jIC10V0QiLz4KKyAgICA8UEZMQUdTIHZhbHVlPSItTjJSZWxlYXNlXG9ialxsaWJleHBhdCAtTjBSZWxlYXNlXG9ialxsaWJleHBhdCAtJFktIC0kTC0gLSRELSIvPgorICAgIDxSRkxBR1MgdmFsdWU9Ii9sIDB4NDA5IC9kICZxdW90O05ERUJVRyZxdW90OyAvaSQoQkNCKVxpbmNsdWRlIi8+CisgICAgPEFGTEFHUyB2YWx1ZT0iL214IC93MiAvem4iLz4KKyAgICA8TEZMQUdTIHZhbHVlPSItSVJlbGVhc2Vcb2JqXGxpYmV4cGF0IC1EJnF1b3Q7JnF1b3Q7IC1hYSAtVHBkIC14IC1HbiAtR2kgLXEiLz4KKyAgPC9PUFRJT05TPgorICA8TElOS0VSPgorICAgIDxBTExPQkogdmFsdWU9ImMwZDMyLm9iaiAkKE9CSkZJTEVTKSIvPgorICAgIDxBTExSRVMgdmFsdWU9IiQoUkVTRklMRVMpIi8+CisgICAgPEFMTExJQiB2YWx1ZT0iJChMSUJGSUxFUykgJChMSUJSQVJJRVMpIGltcG9ydDMyLmxpYiBjdzMybXRpLmxpYiIvPgorICA8L0xJTktFUj4KKyAgPElERU9QVElPTlM+CitbVmVyc2lvbiBJbmZvXQorSW5jbHVkZVZlckluZm89MAorQXV0b0luY0J1aWxkPTAKK01ham9yVmVyPTEKK01pbm9yVmVyPTAKK1JlbGVhc2U9MAorQnVpbGQ9MAorRGVidWc9MAorUHJlUmVsZWFzZT0wCitTcGVjaWFsPTAKK1ByaXZhdGU9MAorRExMPTAKK0xvY2FsZT0xMDMzCitDb2RlUGFnZT0xMjUyCisKK1tWZXJzaW9uIEluZm8gS2V5c10KK0NvbXBhbnlOYW1lPQorRmlsZURlc2NyaXB0aW9uPQorRmlsZVZlcnNpb249MS4wLjAuMAorSW50ZXJuYWxOYW1lPQorTGVnYWxDb3B5cmlnaHQ9CitMZWdhbFRyYWRlbWFya3M9CitPcmlnaW5hbEZpbGVuYW1lPQorUHJvZHVjdE5hbWU9CitQcm9kdWN0VmVyc2lvbj0xLjAuMC4wCitDb21tZW50cz0KKworW0hpc3RvcnlMaXN0c1xobEluY2x1ZGVQYXRoXQorQ291bnQ9NAorSXRlbTA9Li5cbGliOyQoQkNCKVxpbmNsdWRlCitJdGVtMT0kKEJDQilcaW5jbHVkZQorSXRlbTI9JChCQ0IpXGluY2x1ZGU7JChCQ0IpXGluY2x1ZGVcbWZjOyQoQkNCKVxpbmNsdWRlXGF0bAorSXRlbTM9JChCQ0IpXGluY2x1ZGU7JChCQ0IpXGluY2x1ZGVcbWZjOyQoQkNCKVxpbmNsdWRlXGF0bDsKKworW0hpc3RvcnlMaXN0c1xobExpYnJhcnlQYXRoXQorQ291bnQ9NQorSXRlbTA9Li5cbGliOyQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCkKK0l0ZW0xPS4uXGxpYjskKEJDQilcbGliOy4uXGxpYlwkKFJFTEVBU0VMSUJQQVRIKQorSXRlbTI9JChCQ0IpXGxpYjskKFJFTEVBU0VMSUJQQVRIKQorSXRlbTM9JChCQ0IpXGxpYjskKFJFTEVBU0VMSUJQQVRIKTskKEJDQilcbGliXHBzZGsKK0l0ZW00PSQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCk7OyQoQkNCKVxsaWJccHNkazsKKworW0hpc3RvcnlMaXN0c1xobERlYnVnU291cmNlUGF0aF0KK0NvdW50PTEKK0l0ZW0wPSQoQkNCKVxzb3VyY2VcdmNsCisKK1tIaXN0b3J5TGlzdHNcaGxDb25kaXRpb25hbHNdCitDb3VudD04CitJdGVtMD1fV0lORE9XUztXSU4zMjtOREVCVUc7X1VTUkRMTDtDT01QSUxFRF9GUk9NX0RTUDtFWFBBVF9FWFBPUlRTCitJdGVtMT1fV0lORE9XUztXSU4zMjtOREVCVUc7X0RFQlVHO19VU1JETEw7Q09NUElMRURfRlJPTV9EU1A7RVhQQVRfRVhQT1JUUworSXRlbTI9V0lOMzI7X1dJTkRPV1M7TkRFQlVHO19ERUJVRztfVVNSRExMO0NPTVBJTEVEX0ZST01fRFNQO0VYUEFUX0VYUE9SVFMKK0l0ZW0zPVdJTjMyO19XSU5ET1dTO05ERUJVRztfREVCVUc7X1VTUkRMTDtFWFBBVF9FWFBPUlRTO0NPTVBJTEVEX0ZST01fRFNQCitJdGVtND1OREVCVUc7V0lOMzI7X1dJTkRPV1M7X1VTUkRMTDtfREVCVUc7RVhQQVRfRVhQT1JUUztDT01QSUxFRF9GUk9NX0RTUAorSXRlbTU9TkRFQlVHO1dJTjMyO19XSU5ET1dTO19VU1JETEw7RVhQQVRfRVhQT1JUUztDT01QSUxFRF9GUk9NX0RTUDtfREVCVUcKK0l0ZW02PU5ERUJVRztXSU4zMjtfV0lORE9XUztfTUJDUztfVVNSRExMO0VYUEFUX0VYUE9SVFM7Q09NUElMRURfRlJPTV9EU1A7X0RFQlVHCitJdGVtNz1OREVCVUc7V0lOMzI7X1dJTkRPV1M7X01CQ1M7X1VTUkRMTDtFWFBBVF9FWFBPUlRTO0NPTVBJTEVEX0ZST01fRFNQCisKK1tIaXN0b3J5TGlzdHNcaGxJbnRPdXRwdXREaXJdCitDb3VudD03CitJdGVtMD1SZWxlYXNlXG9ialxsaWJleHBhdAorSXRlbTE9UmVsZWFzZVxvYmpcbGliZXhwYXRfc3RhdGljCitJdGVtMj1SZWxlYXNlXG9ialxtdGQKK0l0ZW0zPVJlbGVhc2Vcb2JqXG10CitJdGVtND1SZWxlYXNlXG9iagorSXRlbTU9UmVsZWFzZQorSXRlbTY9Li5cbGliXFJlbGVhc2UKKworW0hpc3RvcnlMaXN0c1xobEZpbmFsT3V0cHV0RGlyXQorQ291bnQ9MQorSXRlbTA9UmVsZWFzZVwKKworW0RlYnVnZ2luZ10KK0RlYnVnU291cmNlRGlycz0KKworW1BhcmFtZXRlcnNdCitSdW5QYXJhbXM9CitIb3N0QXBwbGljYXRpb249CitSZW1vdGVIb3N0PQorUmVtb3RlUGF0aD0KK1JlbW90ZURlYnVnPTAKKworW0NvbXBpbGVyXQorU2hvd0luZm9Nc2dzPTAKK0xpbmtEZWJ1Z1ZjbD0wCitMaW5rQ0dMSUI9MAorCitbTGFuZ3VhZ2VdCitBY3RpdmVMYW5nPQorUHJvamVjdExhbmc9CitSb290RGlyPQorICA8L0lERU9QVElPTlM+Cis8L1BST0pFQ1Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvYmNiNS9leHBhdC5tYWsgYi9leHBhdC0yLjAuMS9iY2I1L2V4cGF0Lm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzljMjNmCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYmNiNS9leHBhdC5tYWsKQEAgLTAsMCArMSwxODcgQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCishaWYgISRkKEJDQikKK0JDQiA9ICQoTUFLRURJUilcLi4KKyFlbmRpZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJREUgU0VDVElPTgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIHRoZSBwcm9qZWN0IG1ha2VmaWxlIGlzIG1hbmFnZWQgYnkgdGhlIEJDQiBJREUuCisjIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgSURFIHRvIGNoYW5nZSBhbnkgb2YgdGhlIHZhbHVlcyBpbiB0aGlzCisjIHNlY3Rpb24uCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitWRVJTSU9OID0gQkNCLjA1LjAzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUFJPSkVDVCA9IFJlbGVhc2VcbGliZXhwYXRfbXRkLmRsbAorT0JKRklMRVMgPSBSZWxlYXNlXG9ialxsaWJleHBhdFx4bWxwYXJzZS5vYmogUmVsZWFzZVxvYmpcbGliZXhwYXRceG1scm9sZS5vYmogXAorICAgIFJlbGVhc2Vcb2JqXGxpYmV4cGF0XHhtbHRvay5vYmoKK1JFU0ZJTEVTID0gCitNQUlOU09VUkNFID0gZXhwYXQuYnBmCitSRVNERVBFTiA9ICQoUkVTRklMRVMpCitMSUJGSUxFUyA9IAorSURMRklMRVMgPSAKK0lETEdFTkZJTEVTID0gCitMSUJSQVJJRVMgPSAKK1BBQ0tBR0VTID0gVkNMNTAuYnBpIFZDTFg1MC5icGkgYmNic21wNTAuYnBpIFFSUFQ1MC5icGkgVkNMREI1MC5icGkgVkNMQkRFNTAuYnBpIFwKKyAgICBpYnNtcDUwLmJwaSBWQ0xEQlg1MC5icGkgVEVFVUk1MC5icGkgVEVFREI1MC5icGkgVEVFNTAuYnBpIFRFRVFSNTAuYnBpIFwKKyAgICBWQ0xJQjUwLmJwaSBiY2JpZTUwLmJwaSBWQ0xJRTUwLmJwaSBJTkVUREI1MC5icGkgSU5FVDUwLmJwaSBOTUZBU1Q1MC5icGkgXAorICAgIGRjbG9jeDUwLmJwaSBiY2Iya2F4c2VydmVyNTAuYnBpIGRjbHVzcjUwLmJwaQorU1BBUkVMSUJTID0gCitERUZGSUxFID0gbGliZXhwYXRfbXRkLmRlZgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BBVEhDUFAgPSAuOy4uXGxpYgorUEFUSEFTTSA9IC47CitQQVRIUEFTID0gLjsKK1BBVEhSQyA9IC47CitERUJVR0xJQlBBVEggPSAkKEJDQilcbGliXGRlYnVnCitSRUxFQVNFTElCUEFUSCA9ICQoQkNCKVxsaWJccmVsZWFzZQorVVNFUkRFRklORVMgPSBfV0lORE9XUztXSU4zMjtOREVCVUc7X1VTUkRMTDtDT01QSUxFRF9GUk9NX0RTUAorU1lTREVGSU5FUyA9IF9OT19WQ0w7X0FTU0VSVEU7Tk9fU1RSSUNUO19SVExETEwKK0lOQ0xVREVQQVRIID0gLi5cbGliOyQoQkNCKVxpbmNsdWRlCitMSUJQQVRIID0gLi5cbGliOyQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCkKK1dBUk5JTkdTPSAtdy1yY2ggLXctcGFyIC13LTgwMjcgLXctODAyNiAtdy1jY2MKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDRkxBRzEgPSAtV0QgLU8yIC1YLSAtYTggLWIgLWstIC12aSAtcSAtdFdNIC1jIC10V0QKK0lETENGTEFHUyA9IC1JJChCQ0IpXGluY2x1ZGUKK1BGTEFHUyA9IC1OMlJlbGVhc2Vcb2JqXGxpYmV4cGF0IC1OMFJlbGVhc2Vcb2JqXGxpYmV4cGF0IC0kWS0gLSRMLSAtJEQtCitSRkxBR1MgPSAvbCAweDQwOSAvZCAiTkRFQlVHIiAvaSQoQkNCKVxpbmNsdWRlCitBRkxBR1MgPSAvbXggL3cyIC96bgorTEZMQUdTID0gLUlSZWxlYXNlXG9ialxsaWJleHBhdCAtRCIiIC1hYSAtVHBkIC14IC1HbiAtR2kgLXEKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBTExPQkogPSBjMGQzMi5vYmogJChPQkpGSUxFUykKK0FMTFJFUyA9ICQoUkVTRklMRVMpCitBTExMSUIgPSAkKExJQkZJTEVTKSAkKExJQlJBUklFUykgaW1wb3J0MzIubGliIGN3MzJtdGkubGliCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIWlmZGVmIElERU9QVElPTlMKKworW1ZlcnNpb24gSW5mb10KK0luY2x1ZGVWZXJJbmZvPTAKK0F1dG9JbmNCdWlsZD0wCitNYWpvclZlcj0xCitNaW5vclZlcj0wCitSZWxlYXNlPTAKK0J1aWxkPTAKK0RlYnVnPTAKK1ByZVJlbGVhc2U9MAorU3BlY2lhbD0wCitQcml2YXRlPTAKK0RMTD0wCisKK1tWZXJzaW9uIEluZm8gS2V5c10KK0NvbXBhbnlOYW1lPQorRmlsZURlc2NyaXB0aW9uPQorRmlsZVZlcnNpb249MS4wLjAuMAorSW50ZXJuYWxOYW1lPQorTGVnYWxDb3B5cmlnaHQ9CitMZWdhbFRyYWRlbWFya3M9CitPcmlnaW5hbEZpbGVuYW1lPQorUHJvZHVjdE5hbWU9CitQcm9kdWN0VmVyc2lvbj0xLjAuMC4wCitDb21tZW50cz0KKworW0RlYnVnZ2luZ10KK0RlYnVnU291cmNlRGlycz0kKEJDQilcc291cmNlXHZjbAorCishZW5kaWYKKworCisKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNQUtFIFNFQ1RJT04KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoaXMgc2VjdGlvbiBvZiB0aGUgcHJvamVjdCBmaWxlIGlzIG5vdCB1c2VkIGJ5IHRoZSBCQ0IgSURFLiAgSXQgaXMgZm9yCisjIHRoZSBiZW5lZml0IG9mIGJ1aWxkaW5nIGZyb20gdGhlIGNvbW1hbmQtbGluZSB1c2luZyB0aGUgTUFLRSB1dGlsaXR5LgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLmF1dG9kZXBlbmQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCishaWYgIiQoVVNFUkRFRklORVMpIiAhPSAiIgorQVVTRVJERUZJTkVTID0gLWQkKFVTRVJERUZJTkVTOjs9IC1kKQorIWVsc2UKK0FVU0VSREVGSU5FUyA9CishZW5kaWYKKworIWlmICEkZChCQ0MzMikKK0JDQzMyID0gYmNjMzIKKyFlbmRpZgorCishaWYgISRkKENQUDMyKQorQ1BQMzIgPSBjcHAzMgorIWVuZGlmCisKKyFpZiAhJGQoRENDMzIpCitEQ0MzMiA9IGRjYzMyCishZW5kaWYKKworIWlmICEkZChUQVNNMzIpCitUQVNNMzIgPSB0YXNtMzIKKyFlbmRpZgorCishaWYgISRkKExJTktFUikKK0xJTktFUiA9IGlsaW5rMzIKKyFlbmRpZgorCishaWYgISRkKEJSQ0MzMikKK0JSQ0MzMiA9IGJyY2MzMgorIWVuZGlmCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyFpZiAkZChQQVRIQ1BQKQorLlBBVEguQ1BQID0gJChQQVRIQ1BQKQorLlBBVEguQyAgID0gJChQQVRIQ1BQKQorIWVuZGlmCisKKyFpZiAkZChQQVRIUEFTKQorLlBBVEguUEFTID0gJChQQVRIUEFTKQorIWVuZGlmCisKKyFpZiAkZChQQVRIQVNNKQorLlBBVEguQVNNID0gJChQQVRIQVNNKQorIWVuZGlmCisKKyFpZiAkZChQQVRIUkMpCisuUEFUSC5SQyAgPSAkKFBBVEhSQykKKyFlbmRpZgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQoUFJPSkVDVCk6ICQoSURMR0VORklMRVMpICQoT0JKRklMRVMpICQoUkVTREVQRU4pICQoREVGRklMRSkKKyAgICAkKEJDQilcQklOXCQoTElOS0VSKSBAJiYhCisgICAgJChMRkxBR1MpIC1MJChMSUJQQVRIKSArCisgICAgJChBTExPQkopLCArCisgICAgJChQUk9KRUNUKSwsICsKKyAgICAkKEFMTExJQiksICsKKyAgICAkKERFRkZJTEUpLCArCisgICAgJChBTExSRVMpCishCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLnBhcy5ocHA6CisgICAgJChCQ0IpXEJJTlwkKERDQzMyKSAkKFBGTEFHUykgLVUkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLU8kKElOQ0xVREVQQVRIKSAtLUJDQiB7JDwgfQorCisucGFzLm9iajoKKyAgICAkKEJDQilcQklOXCQoRENDMzIpICQoUEZMQUdTKSAtVSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtTyQoSU5DTFVERVBBVEgpIC0tQkNCIHskPCB9CisKKy5jcHAub2JqOgorICAgICQoQkNCKVxCSU5cJChCQ0MzMikgJChDRkxBRzEpICQoV0FSTklOR1MpIC1JJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1uJChARCkgeyQ8IH0KKworLmMub2JqOgorICAgICQoQkNCKVxCSU5cJChCQ0MzMikgJChDRkxBRzEpICQoV0FSTklOR1MpIC1JJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1uJChARCkgeyQ8IH0KKworLmMuaToKKyAgICAkKEJDQilcQklOXCQoQ1BQMzIpICQoQ0ZMQUcxKSAkKFdBUk5JTkdTKSAtSSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtbi4geyQ8IH0KKworLmNwcC5pOgorICAgICQoQkNCKVxCSU5cJChDUFAzMikgJChDRkxBRzEpICQoV0FSTklOR1MpIC1JJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1uLiB7JDwgfQorCisuYXNtLm9iajoKKyAgICAkKEJDQilcQklOXCQoVEFTTTMyKSAkKEFGTEFHUykgLWkkKElOQ0xVREVQQVRIOjs9IC1pKSAkKEFVU0VSREVGSU5FUykgLWQkKFNZU0RFRklORVM6Oz0gLWQpICQ8LCAkQAorCisucmMucmVzOgorICAgICQoQkNCKVxCSU5cJChCUkNDMzIpICQoUkZMQUdTKSAtSSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtZm8kQCAkPAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisKKwpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvYmNiNS9leHBhdF9zdGF0aWMuYnBmIGIvZXhwYXQtMi4wLjEvYmNiNS9leHBhdF9zdGF0aWMuYnBmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYTQ1OGUKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9iY2I1L2V4cGF0X3N0YXRpYy5icGYKQEAgLTAsMCArMSw1IEBACitVU0VVTklUKCIuLlxsaWJceG1scGFyc2UuYyIpOworVVNFVU5JVCgiLi5cbGliXHhtbHJvbGUuYyIpOworVVNFVU5JVCgiLi5cbGliXHhtbHRvay5jIik7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBMaWJyYXJ5CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9iY2I1L2V4cGF0X3N0YXRpYy5icHIgYi9leHBhdC0yLjAuMS9iY2I1L2V4cGF0X3N0YXRpYy5icHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY2ZWM0ZAotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2JjYjUvZXhwYXRfc3RhdGljLmJwcgpAQCAtMCwwICsxLDE0MyBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnID8+Cis8IS0tIEMrK0J1aWxkZXIgWE1MIFByb2plY3QgLS0+Cis8UFJPSkVDVD4KKyAgPE1BQ1JPUz4KKyAgICA8VkVSU0lPTiB2YWx1ZT0iQkNCLjA1LjAzIi8+CisgICAgPFBST0pFQ1QgdmFsdWU9IlJlbGVhc2VcbGliZXhwYXRzX210ZC5saWIiLz4KKyAgICA8T0JKRklMRVMgdmFsdWU9IlJlbGVhc2Vcb2JqXGxpYmV4cGF0X3N0YXRpY1x4bWxwYXJzZS5vYmogCisgICAgICBSZWxlYXNlXG9ialxsaWJleHBhdF9zdGF0aWNceG1scm9sZS5vYmogCisgICAgICBSZWxlYXNlXG9ialxsaWJleHBhdF9zdGF0aWNceG1sdG9rLm9iaiIvPgorICAgIDxSRVNGSUxFUyB2YWx1ZT0iIi8+CisgICAgPElETEZJTEVTIHZhbHVlPSIiLz4KKyAgICA8SURMR0VORklMRVMgdmFsdWU9IiIvPgorICAgIDxERUZGSUxFIHZhbHVlPSIiLz4KKyAgICA8UkVTREVQRU4gdmFsdWU9IiQoUkVTRklMRVMpIi8+CisgICAgPExJQkZJTEVTIHZhbHVlPSIiLz4KKyAgICA8TElCUkFSSUVTIHZhbHVlPSIiLz4KKyAgICA8U1BBUkVMSUJTIHZhbHVlPSIiLz4KKyAgICA8UEFDS0FHRVMgdmFsdWU9IiIvPgorICAgIDxQQVRIQ1BQIHZhbHVlPSIuOy4uXGxpYiIvPgorICAgIDxQQVRIUEFTIHZhbHVlPSIuOyIvPgorICAgIDxQQVRIUkMgdmFsdWU9Ii47Ii8+CisgICAgPFBBVEhBU00gdmFsdWU9Ii47Ii8+CisgICAgPERFQlVHTElCUEFUSCB2YWx1ZT0iJChCQ0IpXGxpYlxkZWJ1ZyIvPgorICAgIDxSRUxFQVNFTElCUEFUSCB2YWx1ZT0iJChCQ0IpXGxpYlxyZWxlYXNlIi8+CisgICAgPExJTktFUiB2YWx1ZT0iVExpYiIvPgorICAgIDxVU0VSREVGSU5FUyB2YWx1ZT0iX1dJTkRPV1M7V0lOMzI7TkRFQlVHO19MSUI7Q09NUElMRURfRlJPTV9EU1A7WE1MX1NUQVRJQyIvPgorICAgIDxTWVNERUZJTkVTIHZhbHVlPSJfTk9fVkNMO19BU1NFUlRFO05PX1NUUklDVDtfUlRMRExMIi8+CisgICAgPE1BSU5TT1VSQ0UgdmFsdWU9ImV4cGF0X3N0YXRpYy5icGYiLz4KKyAgICA8SU5DTFVERVBBVEggdmFsdWU9Ii4uXGxpYjskKEJDQilcaW5jbHVkZSIvPgorICAgIDxMSUJQQVRIIHZhbHVlPSIuLlxsaWI7JChCQ0IpXGxpYjskKFJFTEVBU0VMSUJQQVRIKSIvPgorICAgIDxXQVJOSU5HUyB2YWx1ZT0iLXctcmNoIC13LXBhciAtdy04MDI3IC13LTgwMjYgLXctY2NjIi8+CisgICAgPExJU1RGSUxFIHZhbHVlPSIiLz4KKyAgPC9NQUNST1M+CisgIDxPUFRJT05TPgorICAgIDxJRExDRkxBR1MgdmFsdWU9Ii1JJChCQ0IpXGluY2x1ZGUiLz4KKyAgICA8Q0ZMQUcxIHZhbHVlPSItTzIgLVgtIC1hOCAtYiAtay0gLXZpIC1xIC10V00gLWMiLz4KKyAgICA8UEZMQUdTIHZhbHVlPSItTjJSZWxlYXNlXG9ialxsaWJleHBhdF9zdGF0aWMgLU4wUmVsZWFzZVxvYmpcbGliZXhwYXRfc3RhdGljIC0kWS0gLSRMLSAtJEQtIi8+CisgICAgPFJGTEFHUyB2YWx1ZT0iL2wgMHg0MDkgL2QgJnF1b3Q7TkRFQlVHJnF1b3Q7IC9pJChCQ0IpXGluY2x1ZGUiLz4KKyAgICA8QUZMQUdTIHZhbHVlPSIvbXggL3cyIC96biIvPgorICAgIDxMRkxBR1MgdmFsdWU9IiIvPgorICA8L09QVElPTlM+CisgIDxMSU5LRVI+CisgICAgPEFMTE9CSiB2YWx1ZT0iJChPQkpGSUxFUykiLz4KKyAgICA8QUxMUkVTIHZhbHVlPSIkKFJFU0ZJTEVTKSIvPgorICAgIDxBTExMSUIgdmFsdWU9IiQoTElCRklMRVMpICQoTElCUkFSSUVTKSIvPgorICA8L0xJTktFUj4KKyAgPElERU9QVElPTlM+CitbVmVyc2lvbiBJbmZvXQorSW5jbHVkZVZlckluZm89MAorQXV0b0luY0J1aWxkPTAKK01ham9yVmVyPTEKK01pbm9yVmVyPTAKK1JlbGVhc2U9MAorQnVpbGQ9MAorRGVidWc9MAorUHJlUmVsZWFzZT0wCitTcGVjaWFsPTAKK1ByaXZhdGU9MAorRExMPTAKK0xvY2FsZT0xMDMzCitDb2RlUGFnZT0xMjUyCisKK1tWZXJzaW9uIEluZm8gS2V5c10KK0NvbXBhbnlOYW1lPQorRmlsZURlc2NyaXB0aW9uPQorRmlsZVZlcnNpb249MS4wLjAuMAorSW50ZXJuYWxOYW1lPQorTGVnYWxDb3B5cmlnaHQ9CitMZWdhbFRyYWRlbWFya3M9CitPcmlnaW5hbEZpbGVuYW1lPQorUHJvZHVjdE5hbWU9CitQcm9kdWN0VmVyc2lvbj0xLjAuMC4wCitDb21tZW50cz0KKworW0hpc3RvcnlMaXN0c1xobEluY2x1ZGVQYXRoXQorQ291bnQ9NAorSXRlbTA9Li5cbGliOyQoQkNCKVxpbmNsdWRlCitJdGVtMT0kKEJDQilcaW5jbHVkZQorSXRlbTI9JChCQ0IpXGluY2x1ZGU7JChCQ0IpXGluY2x1ZGVcbWZjOyQoQkNCKVxpbmNsdWRlXGF0bAorSXRlbTM9JChCQ0IpXGluY2x1ZGU7JChCQ0IpXGluY2x1ZGVcbWZjOyQoQkNCKVxpbmNsdWRlXGF0bDsKKworW0hpc3RvcnlMaXN0c1xobExpYnJhcnlQYXRoXQorQ291bnQ9NQorSXRlbTA9Li5cbGliOyQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCkKK0l0ZW0xPS4uXGxpYjskKEJDQilcbGliOy4uXGxpYlwkKFJFTEVBU0VMSUJQQVRIKQorSXRlbTI9JChCQ0IpXGxpYjskKFJFTEVBU0VMSUJQQVRIKQorSXRlbTM9JChCQ0IpXGxpYjskKFJFTEVBU0VMSUJQQVRIKTskKEJDQilcbGliXHBzZGsKK0l0ZW00PSQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCk7OyQoQkNCKVxsaWJccHNkazsKKworW0hpc3RvcnlMaXN0c1xobERlYnVnU291cmNlUGF0aF0KK0NvdW50PTEKK0l0ZW0wPSQoQkNCKVxzb3VyY2VcdmNsCisKK1tIaXN0b3J5TGlzdHNcaGxDb25kaXRpb25hbHNdCitDb3VudD03CitJdGVtMD1fV0lORE9XUztXSU4zMjtOREVCVUc7X0xJQjtDT01QSUxFRF9GUk9NX0RTUDtYTUxfU1RBVElDCitJdGVtMT1fV0lORE9XUztXSU4zMjtOREVCVUc7X0RFQlVHO19MSUI7Q09NUElMRURfRlJPTV9EU1A7WE1MX1NUQVRJQworSXRlbTI9V0lOMzI7X1dJTkRPV1M7TkRFQlVHO19ERUJVRztfTElCO0NPTVBJTEVEX0ZST01fRFNQO1hNTF9TVEFUSUMKK0l0ZW0zPVdJTjMyO19XSU5ET1dTO05ERUJVRztfTElCO0NPTVBJTEVEX0ZST01fRFNQO19ERUJVRworSXRlbTQ9V0lOMzI7X1dJTkRPV1M7TkRFQlVHO19MSUI7Q09NUElMRURfRlJPTV9EU1AKK0l0ZW01PVdJTjMyO19XSU5ET1dTO05ERUJVRztfTElCO0NPTVBJTEVEX0ZST01fRFNQO19NQkNTCitJdGVtNj1XSU4zMjtfV0lORE9XUztOREVCVUc7X01CQ1M7X0xJQjtDT01QSUxFRF9GUk9NX0RTUAorCitbSGlzdG9yeUxpc3RzXGhsSW50T3V0cHV0RGlyXQorQ291bnQ9NgorSXRlbTA9UmVsZWFzZVxvYmpcbGliZXhwYXRfc3RhdGljCitJdGVtMT1SZWxlYXNlXG9ialxtdHMKK0l0ZW0yPVJlbGVhc2Vcb2JqXG10CitJdGVtMz1SZWxlYXNlCitJdGVtND0uLlxsaWJcUmVsZWFzZV9zdGF0aWMKK0l0ZW01PVJlbGVhc2Vfc3RhdGljCisKK1tIaXN0b3J5TGlzdHNcaGxGaW5hbE91dHB1dERpcl0KK0NvdW50PTMKK0l0ZW0wPVJlbGVhc2VcCitJdGVtMT1SZWxlYXNlCitJdGVtMj1SZWxlYXNlX3N0YXRpY1wKKworW0hpc3RvcnlMaXN0c1xobFRsaWJQYWdlU2l6ZV0KK0NvdW50PTEKK0l0ZW0wPTB4MDAxMAorCitbRGVidWdnaW5nXQorRGVidWdTb3VyY2VEaXJzPQorCitbUGFyYW1ldGVyc10KK1J1blBhcmFtcz0KK0hvc3RBcHBsaWNhdGlvbj0KK1JlbW90ZUhvc3Q9CitSZW1vdGVQYXRoPQorUmVtb3RlRGVidWc9MAorCitbQ29tcGlsZXJdCitTaG93SW5mb01zZ3M9MAorTGlua0RlYnVnVmNsPTAKK0xpbmtDR0xJQj0wCisKK1tMYW5ndWFnZV0KK0FjdGl2ZUxhbmc9CitQcm9qZWN0TGFuZz0KK1Jvb3REaXI9CisgIDwvSURFT1BUSU9OUz4KKzwvUFJPSkVDVD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9iY2I1L2V4cGF0X3N0YXRpYy5tYWsgYi9leHBhdC0yLjAuMS9iY2I1L2V4cGF0X3N0YXRpYy5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEzN2QzYgotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2JjYjUvZXhwYXRfc3RhdGljLm1hawpAQCAtMCwwICsxLDE4OSBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyFpZiAhJGQoQkNCKQorQkNCID0gJChNQUtFRElSKVwuLgorIWVuZGlmCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIElERSBTRUNUSU9OCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgdGhlIHByb2plY3QgbWFrZWZpbGUgaXMgbWFuYWdlZCBieSB0aGUgQkNCIElERS4KKyMgSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBJREUgdG8gY2hhbmdlIGFueSBvZiB0aGUgdmFsdWVzIGluIHRoaXMKKyMgc2VjdGlvbi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1ZFUlNJT04gPSBCQ0IuMDUuMDMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQUk9KRUNUID0gUmVsZWFzZVxsaWJleHBhdHNfbXRkLmxpYgorT0JKRklMRVMgPSBSZWxlYXNlXG9ialxsaWJleHBhdF9zdGF0aWNceG1scGFyc2Uub2JqIFwKKyAgICBSZWxlYXNlXG9ialxsaWJleHBhdF9zdGF0aWNceG1scm9sZS5vYmogXAorICAgIFJlbGVhc2Vcb2JqXGxpYmV4cGF0X3N0YXRpY1x4bWx0b2sub2JqCitSRVNGSUxFUyA9IAorTUFJTlNPVVJDRSA9IGV4cGF0X3N0YXRpYy5icGYKK1JFU0RFUEVOID0gJChSRVNGSUxFUykKK0xJQkZJTEVTID0gCitJRExGSUxFUyA9IAorSURMR0VORklMRVMgPSAKK0xJQlJBUklFUyA9IAorUEFDS0FHRVMgPSAKK1NQQVJFTElCUyA9IAorREVGRklMRSA9IAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BBVEhDUFAgPSAuOy4uXGxpYgorUEFUSEFTTSA9IC47CitQQVRIUEFTID0gLjsKK1BBVEhSQyA9IC47CitMSU5LRVIgPSBUTGliCitERUJVR0xJQlBBVEggPSAkKEJDQilcbGliXGRlYnVnCitSRUxFQVNFTElCUEFUSCA9ICQoQkNCKVxsaWJccmVsZWFzZQorVVNFUkRFRklORVMgPSBfV0lORE9XUztXSU4zMjtOREVCVUc7X0xJQjtDT01QSUxFRF9GUk9NX0RTUDtYTUxfU1RBVElDCitTWVNERUZJTkVTID0gX05PX1ZDTDtfQVNTRVJURTtOT19TVFJJQ1Q7X1JUTERMTAorSU5DTFVERVBBVEggPSAuLlxsaWI7JChCQ0IpXGluY2x1ZGUKK0xJQlBBVEggPSAuLlxsaWI7JChCQ0IpXGxpYjskKFJFTEVBU0VMSUJQQVRIKQorV0FSTklOR1MgPSAtdy1yY2ggLXctcGFyIC13LTgwMjcgLXctODAyNiAtdy1jY2MKK0xJU1RGSUxFID0gCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ0ZMQUcxID0gLU8yIC1YLSAtYTggLWIgLWstIC12aSAtcSAtdFdNIC1jCitJRExDRkxBR1MgPSAtSSQoQkNCKVxpbmNsdWRlCitQRkxBR1MgPSAtTjJSZWxlYXNlXG9ialxsaWJleHBhdF9zdGF0aWMgLU4wUmVsZWFzZVxvYmpcbGliZXhwYXRfc3RhdGljIC0kWS0gLSRMLSAtJEQtCitSRkxBR1MgPSAvbCAweDQwOSAvZCAiTkRFQlVHIiAvaSQoQkNCKVxpbmNsdWRlCitBRkxBR1MgPSAvbXggL3cyIC96bgorTEZMQUdTID0gCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUxMT0JKID0gJChPQkpGSUxFUykKK0FMTFJFUyA9ICQoUkVTRklMRVMpCitBTExMSUIgPSAkKExJQkZJTEVTKSAkKExJQlJBUklFUykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCishaWZkZWYgSURFT1BUSU9OUworCitbVmVyc2lvbiBJbmZvXQorSW5jbHVkZVZlckluZm89MAorQXV0b0luY0J1aWxkPTAKK01ham9yVmVyPTEKK01pbm9yVmVyPTAKK1JlbGVhc2U9MAorQnVpbGQ9MAorRGVidWc9MAorUHJlUmVsZWFzZT0wCitTcGVjaWFsPTAKK1ByaXZhdGU9MAorRExMPTAKKworW1ZlcnNpb24gSW5mbyBLZXlzXQorQ29tcGFueU5hbWU9CitGaWxlRGVzY3JpcHRpb249CitGaWxlVmVyc2lvbj0xLjAuMC4wCitJbnRlcm5hbE5hbWU9CitMZWdhbENvcHlyaWdodD0KK0xlZ2FsVHJhZGVtYXJrcz0KK09yaWdpbmFsRmlsZW5hbWU9CitQcm9kdWN0TmFtZT0KK1Byb2R1Y3RWZXJzaW9uPTEuMC4wLjAKK0NvbW1lbnRzPQorCitbRGVidWdnaW5nXQorRGVidWdTb3VyY2VEaXJzPSQoQkNCKVxzb3VyY2VcdmNsCisKKyFlbmRpZgorCisKKworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE1BS0UgU0VDVElPTgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhpcyBzZWN0aW9uIG9mIHRoZSBwcm9qZWN0IGZpbGUgaXMgbm90IHVzZWQgYnkgdGhlIEJDQiBJREUuICBJdCBpcyBmb3IKKyMgdGhlIGJlbmVmaXQgb2YgYnVpbGRpbmcgZnJvbSB0aGUgY29tbWFuZC1saW5lIHVzaW5nIHRoZSBNQUtFIHV0aWxpdHkuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuYXV0b2RlcGVuZAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyFpZiAiJChVU0VSREVGSU5FUykiICE9ICIiCitBVVNFUkRFRklORVMgPSAtZCQoVVNFUkRFRklORVM6Oz0gLWQpCishZWxzZQorQVVTRVJERUZJTkVTID0KKyFlbmRpZgorCishaWYgISRkKEJDQzMyKQorQkNDMzIgPSBiY2MzMgorIWVuZGlmCisKKyFpZiAhJGQoQ1BQMzIpCitDUFAzMiA9IGNwcDMyCishZW5kaWYKKworIWlmICEkZChEQ0MzMikKK0RDQzMyID0gZGNjMzIKKyFlbmRpZgorCishaWYgISRkKFRBU00zMikKK1RBU00zMiA9IHRhc20zMgorIWVuZGlmCisKKyFpZiAhJGQoTElOS0VSKQorTElOS0VSID0gVExpYgorIWVuZGlmCisKKyFpZiAhJGQoQlJDQzMyKQorQlJDQzMyID0gYnJjYzMyCishZW5kaWYKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIWlmICRkKFBBVEhDUFApCisuUEFUSC5DUFAgPSAkKFBBVEhDUFApCisuUEFUSC5DICAgPSAkKFBBVEhDUFApCishZW5kaWYKKworIWlmICRkKFBBVEhQQVMpCisuUEFUSC5QQVMgPSAkKFBBVEhQQVMpCishZW5kaWYKKworIWlmICRkKFBBVEhBU00pCisuUEFUSC5BU00gPSAkKFBBVEhBU00pCishZW5kaWYKKworIWlmICRkKFBBVEhSQykKKy5QQVRILlJDICA9ICQoUEFUSFJDKQorIWVuZGlmCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIWlmICIkKExJU1RGSUxFKSIgPT0gICIiCitDT01NQSA9CishZWxzZQorQ09NTUEgPSAsCishZW5kaWYKKworJChQUk9KRUNUKTogJChJRExHRU5GSUxFUykgJChPQkpGSUxFUykgJChSRVNERVBFTikgJChERUZGSUxFKQorICAgICQoQkNCKVxCSU5cJChMSU5LRVIpIC91ICRAIEAmJiEKKyAgICAkKExGTEFHUykgJD8gJChDT01NQSkgJChMSVNURklMRSkKKworIQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy5wYXMuaHBwOgorICAgICQoQkNCKVxCSU5cJChEQ0MzMikgJChQRkxBR1MpIC1VJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1PJChJTkNMVURFUEFUSCkgLS1CQ0IgeyQ8IH0KKworLnBhcy5vYmo6CisgICAgJChCQ0IpXEJJTlwkKERDQzMyKSAkKFBGTEFHUykgLVUkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLU8kKElOQ0xVREVQQVRIKSAtLUJDQiB7JDwgfQorCisuY3BwLm9iajoKKyAgICAkKEJDQilcQklOXCQoQkNDMzIpICQoQ0ZMQUcxKSAkKFdBUk5JTkdTKSAtSSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtbiQoQEQpIHskPCB9CisKKy5jLm9iajoKKyAgICAkKEJDQilcQklOXCQoQkNDMzIpICQoQ0ZMQUcxKSAkKFdBUk5JTkdTKSAtSSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtbiQoQEQpIHskPCB9CisKKy5jLmk6CisgICAgJChCQ0IpXEJJTlwkKENQUDMyKSAkKENGTEFHMSkgJChXQVJOSU5HUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLW4uIHskPCB9CisKKy5jcHAuaToKKyAgICAkKEJDQilcQklOXCQoQ1BQMzIpICQoQ0ZMQUcxKSAkKFdBUk5JTkdTKSAtSSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtbi4geyQ8IH0KKworLmFzbS5vYmo6CisgICAgJChCQ0IpXEJJTlwkKFRBU00zMikgJChBRkxBR1MpIC1pJChJTkNMVURFUEFUSDo7PSAtaSkgJChBVVNFUkRFRklORVMpIC1kJChTWVNERUZJTkVTOjs9IC1kKSAkPCwgJEAKKworLnJjLnJlczoKKyAgICAkKEJDQilcQklOXCQoQlJDQzMyKSAkKFJGTEFHUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLWZvJEAgJDwKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworCisKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2JjYjUvZXhwYXR3LmJwZiBiL2V4cGF0LTIuMC4xL2JjYjUvZXhwYXR3LmJwZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODhhNmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYmNiNS9leHBhdHcuYnBmCkBAIC0wLDAgKzEsNiBAQAorVVNFVU5JVCgiLi5cbGliXHhtbHBhcnNlLmMiKTsKK1VTRVVOSVQoIi4uXGxpYlx4bWxyb2xlLmMiKTsKK1VTRVVOSVQoIi4uXGxpYlx4bWx0b2suYyIpOworVVNFREVGKCJsaWJleHBhdHdfbXRkLmRlZiIpOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRGxsRW50cnlQb2ludApkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvYmNiNS9leHBhdHcuYnByIGIvZXhwYXQtMi4wLjEvYmNiNS9leHBhdHcuYnByCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYzUwMDEKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9iY2I1L2V4cGF0dy5icHIKQEAgLTAsMCArMSwxNDYgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04JyA/PgorPCEtLSBDKytCdWlsZGVyIFhNTCBQcm9qZWN0IC0tPgorPFBST0pFQ1Q+CisgIDxNQUNST1M+CisgICAgPFZFUlNJT04gdmFsdWU9IkJDQi4wNS4wMyIvPgorICAgIDxQUk9KRUNUIHZhbHVlPSJSZWxlYXNlXGxpYmV4cGF0d19tdGQuZGxsIi8+CisgICAgPE9CSkZJTEVTIHZhbHVlPSJSZWxlYXNlXG9ialxsaWJleHBhdHdceG1scGFyc2Uub2JqIFJlbGVhc2Vcb2JqXGxpYmV4cGF0d1x4bWxyb2xlLm9iaiAKKyAgICAgIFJlbGVhc2Vcb2JqXGxpYmV4cGF0d1x4bWx0b2sub2JqIi8+CisgICAgPFJFU0ZJTEVTIHZhbHVlPSIiLz4KKyAgICA8SURMRklMRVMgdmFsdWU9IiIvPgorICAgIDxJRExHRU5GSUxFUyB2YWx1ZT0iIi8+CisgICAgPERFRkZJTEUgdmFsdWU9ImxpYmV4cGF0d19tdGQuZGVmIi8+CisgICAgPFJFU0RFUEVOIHZhbHVlPSIkKFJFU0ZJTEVTKSIvPgorICAgIDxMSUJGSUxFUyB2YWx1ZT0iIi8+CisgICAgPExJQlJBUklFUyB2YWx1ZT0iIi8+CisgICAgPFNQQVJFTElCUyB2YWx1ZT0iIi8+CisgICAgPFBBQ0tBR0VTIHZhbHVlPSJWQ0w1MC5icGkgVkNMWDUwLmJwaSBiY2JzbXA1MC5icGkgUVJQVDUwLmJwaSBWQ0xEQjUwLmJwaSBWQ0xCREU1MC5icGkgCisgICAgICBpYnNtcDUwLmJwaSBWQ0xEQlg1MC5icGkgVEVFVUk1MC5icGkgVEVFREI1MC5icGkgVEVFNTAuYnBpIFRFRVFSNTAuYnBpIAorICAgICAgVkNMSUI1MC5icGkgYmNiaWU1MC5icGkgVkNMSUU1MC5icGkgSU5FVERCNTAuYnBpIElORVQ1MC5icGkgTk1GQVNUNTAuYnBpIAorICAgICAgZGNsb2N4NTAuYnBpIGJjYjJrYXhzZXJ2ZXI1MC5icGkgZGNsdXNyNTAuYnBpIi8+CisgICAgPFBBVEhDUFAgdmFsdWU9Ii47Li5cbGliIi8+CisgICAgPFBBVEhQQVMgdmFsdWU9Ii47Ii8+CisgICAgPFBBVEhSQyB2YWx1ZT0iLjsiLz4KKyAgICA8UEFUSEFTTSB2YWx1ZT0iLjsiLz4KKyAgICA8REVCVUdMSUJQQVRIIHZhbHVlPSIkKEJDQilcbGliXGRlYnVnIi8+CisgICAgPFJFTEVBU0VMSUJQQVRIIHZhbHVlPSIkKEJDQilcbGliXHJlbGVhc2UiLz4KKyAgICA8TElOS0VSIHZhbHVlPSJpbGluazMyIi8+CisgICAgPFVTRVJERUZJTkVTIHZhbHVlPSJfV0lORE9XUztXSU4zMjtOREVCVUc7X1VTUkRMTDtDT01QSUxFRF9GUk9NX0RTUDtFWFBBVF9FWFBPUlRTO1hNTF9VTklDT0RFX1dDSEFSX1QiLz4KKyAgICA8U1lTREVGSU5FUyB2YWx1ZT0iX05PX1ZDTDtfQVNTRVJURTtOT19TVFJJQ1Q7X1JUTERMTCIvPgorICAgIDxNQUlOU09VUkNFIHZhbHVlPSJleHBhdHcuYnBmIi8+CisgICAgPElOQ0xVREVQQVRIIHZhbHVlPSIuLlxsaWI7JChCQ0IpXGluY2x1ZGUiLz4KKyAgICA8TElCUEFUSCB2YWx1ZT0iLi5cbGliOyQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCkiLz4KKyAgICA8V0FSTklOR1MgdmFsdWU9Ii13LXJjaCAtdy1wYXIgLXctODAyNyAtdy04MDI2IC13LWNjYyIvPgorICA8L01BQ1JPUz4KKyAgPE9QVElPTlM+CisgICAgPElETENGTEFHUyB2YWx1ZT0iLUkkKEJDQilcaW5jbHVkZSIvPgorICAgIDxDRkxBRzEgdmFsdWU9Ii1XRCAtTzIgLVgtIC1hOCAtYiAtay0gLXZpIC1xIC10V00gLWMgLXRXRCIvPgorICAgIDxQRkxBR1MgdmFsdWU9Ii1OMlJlbGVhc2Vcb2JqXGxpYmV4cGF0dyAtTjBSZWxlYXNlXG9ialxsaWJleHBhdHcgLSRZLSAtJEwtIC0kRC0iLz4KKyAgICA8UkZMQUdTIHZhbHVlPSIvbCAweDQwOSAvZCAmcXVvdDtOREVCVUcmcXVvdDsgL2kkKEJDQilcaW5jbHVkZSIvPgorICAgIDxBRkxBR1MgdmFsdWU9Ii9teCAvdzIgL3puIi8+CisgICAgPExGTEFHUyB2YWx1ZT0iLUlSZWxlYXNlXG9ialxsaWJleHBhdHcgLUQmcXVvdDsmcXVvdDsgLWFhIC1UcGQgLXggLUduIC1HaSAtdyAtcSIvPgorICA8L09QVElPTlM+CisgIDxMSU5LRVI+CisgICAgPEFMTE9CSiB2YWx1ZT0iYzBkMzJ3Lm9iaiAkKE9CSkZJTEVTKSIvPgorICAgIDxBTExSRVMgdmFsdWU9IiQoUkVTRklMRVMpIi8+CisgICAgPEFMTExJQiB2YWx1ZT0iJChMSUJGSUxFUykgJChMSUJSQVJJRVMpIGltcG9ydDMyLmxpYiBjdzMybXRpLmxpYiIvPgorICA8L0xJTktFUj4KKyAgPElERU9QVElPTlM+CitbVmVyc2lvbiBJbmZvXQorSW5jbHVkZVZlckluZm89MAorQXV0b0luY0J1aWxkPTAKK01ham9yVmVyPTEKK01pbm9yVmVyPTAKK1JlbGVhc2U9MAorQnVpbGQ9MAorRGVidWc9MAorUHJlUmVsZWFzZT0wCitTcGVjaWFsPTAKK1ByaXZhdGU9MAorRExMPTAKK0xvY2FsZT0xMDMzCitDb2RlUGFnZT0xMjUyCisKK1tWZXJzaW9uIEluZm8gS2V5c10KK0NvbXBhbnlOYW1lPQorRmlsZURlc2NyaXB0aW9uPQorRmlsZVZlcnNpb249MS4wLjAuMAorSW50ZXJuYWxOYW1lPQorTGVnYWxDb3B5cmlnaHQ9CitMZWdhbFRyYWRlbWFya3M9CitPcmlnaW5hbEZpbGVuYW1lPQorUHJvZHVjdE5hbWU9CitQcm9kdWN0VmVyc2lvbj0xLjAuMC4wCitDb21tZW50cz0KKworW0hpc3RvcnlMaXN0c1xobEluY2x1ZGVQYXRoXQorQ291bnQ9NAorSXRlbTA9Li5cbGliOyQoQkNCKVxpbmNsdWRlCitJdGVtMT0kKEJDQilcaW5jbHVkZQorSXRlbTI9JChCQ0IpXGluY2x1ZGU7JChCQ0IpXGluY2x1ZGVcbWZjOyQoQkNCKVxpbmNsdWRlXGF0bAorSXRlbTM9JChCQ0IpXGluY2x1ZGU7JChCQ0IpXGluY2x1ZGVcbWZjOyQoQkNCKVxpbmNsdWRlXGF0bDsKKworW0hpc3RvcnlMaXN0c1xobExpYnJhcnlQYXRoXQorQ291bnQ9NQorSXRlbTA9Li5cbGliOyQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCkKK0l0ZW0xPS4uXGxpYjskKEJDQilcbGliOy4uXGxpYlwkKFJFTEVBU0VMSUJQQVRIKQorSXRlbTI9JChCQ0IpXGxpYjskKFJFTEVBU0VMSUJQQVRIKQorSXRlbTM9JChCQ0IpXGxpYjskKFJFTEVBU0VMSUJQQVRIKTskKEJDQilcbGliXHBzZGsKK0l0ZW00PSQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCk7OyQoQkNCKVxsaWJccHNkazsKKworW0hpc3RvcnlMaXN0c1xobERlYnVnU291cmNlUGF0aF0KK0NvdW50PTEKK0l0ZW0wPSQoQkNCKVxzb3VyY2VcdmNsCisKK1tIaXN0b3J5TGlzdHNcaGxDb25kaXRpb25hbHNdCitDb3VudD05CitJdGVtMD1fV0lORE9XUztXSU4zMjtOREVCVUc7X1VTUkRMTDtDT01QSUxFRF9GUk9NX0RTUDtFWFBBVF9FWFBPUlRTO1hNTF9VTklDT0RFX1dDSEFSX1QKK0l0ZW0xPV9XSU5ET1dTO1dJTjMyO05ERUJVRztfREVCVUc7X1VTUkRMTDtDT01QSUxFRF9GUk9NX0RTUDtFWFBBVF9FWFBPUlRTO1hNTF9VTklDT0RFX1dDSEFSX1QKK0l0ZW0yPV9XSU5ET1dTO1dJTjMyO05ERUJVRztfREVCVUc7X1VTUkRMTDtFWFBBVF9FWFBPUlRTO0NPTVBJTEVEX0ZST01fRFNQO1hNTF9VTklDT0RFX1dDSEFSX1QKK0l0ZW0zPU5ERUJVRztDT01QSUxFRF9GUk9NX0RTUDtXSU4zMjtfV0lORE9XUztfVVNSRExMO0VYUEFUX0VYUE9SVFM7X0RFQlVHO1hNTF9VTklDT0RFX1dDSEFSX1QKK0l0ZW00PU5ERUJVRztDT01QSUxFRF9GUk9NX0RTUDtXSU4zMjtfV0lORE9XUztfVVNSRExMO0VYUEFUX0VYUE9SVFM7WE1MX1VOSUNPREVfV0NIQVJfVDtfREVCVUcKK0l0ZW01PU5ERUJVRztDT01QSUxFRF9GUk9NX0RTUDtXSU4zMjtfV0lORE9XUztfVU5JQ09ERTtfVVNSRExMO0VYUEFUX0VYUE9SVFM7WE1MX1VOSUNPREVfV0NIQVJfVDtfREVCVUcKK0l0ZW02PU5ERUJVRztDT01QSUxFRF9GUk9NX0RTUDtXSU4zMjtfV0lORE9XUztfVU5JQ09ERTtfVVNSRExMO0VYUEFUX0VYUE9SVFM7WE1MX1VOSUNPREVfV0NIQVJfVAorSXRlbTc9TkRFQlVHO0NPTVBJTEVEX0ZST01fRFNQO1dJTjMyO19XSU5ET1dTO19NQkNTO19VU1JETEw7RVhQQVRfRVhQT1JUUztYTUxfVU5JQ09ERV9XQ0hBUl9UO1hNTF9VTklDT0RFCitJdGVtOD1OREVCVUc7Q09NUElMRURfRlJPTV9EU1A7V0lOMzI7X1dJTkRPV1M7X01CQ1M7X1VTUkRMTDtFWFBBVF9FWFBPUlRTO1hNTF9VTklDT0RFX1dDSEFSX1QKKworW0hpc3RvcnlMaXN0c1xobEludE91dHB1dERpcl0KK0NvdW50PTgKK0l0ZW0wPVJlbGVhc2Vcb2JqXGxpYmV4cGF0dworSXRlbTE9UmVsZWFzZVxvYmpcbGliZXhwYXQKK0l0ZW0yPVJlbGVhc2Vcb2JqXG10ZAorSXRlbTM9UmVsZWFzZVxvYmpcbXQKK0l0ZW00PVJlbGVhc2Vfd1xvYmoKK0l0ZW01PVJlbGVhc2Utd1xvYmoKK0l0ZW02PVJlbGVhc2UtdworSXRlbTc9Li5cbGliXFJlbGVhc2UtdworCitbSGlzdG9yeUxpc3RzXGhsRmluYWxPdXRwdXREaXJdCitDb3VudD01CitJdGVtMD1SZWxlYXNlXAorSXRlbTE9UmVsZWFzZQorSXRlbTI9UmVsZWFzZV93XAorSXRlbTM9UmVsZWFzZS13XAorSXRlbTQ9UmVsZWFzZS13CisKK1tEZWJ1Z2dpbmddCitEZWJ1Z1NvdXJjZURpcnM9CisKK1tQYXJhbWV0ZXJzXQorUnVuUGFyYW1zPQorSG9zdEFwcGxpY2F0aW9uPQorUmVtb3RlSG9zdD0KK1JlbW90ZVBhdGg9CitSZW1vdGVEZWJ1Zz0wCisKK1tDb21waWxlcl0KK1Nob3dJbmZvTXNncz0wCitMaW5rRGVidWdWY2w9MAorTGlua0NHTElCPTAKKworW0xhbmd1YWdlXQorQWN0aXZlTGFuZz0KK1Byb2plY3RMYW5nPQorUm9vdERpcj0KKyAgPC9JREVPUFRJT05TPgorPC9QUk9KRUNUPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2JjYjUvZXhwYXR3Lm1hayBiL2V4cGF0LTIuMC4xL2JjYjUvZXhwYXR3Lm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGUxN2QwCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYmNiNS9leHBhdHcubWFrCkBAIC0wLDAgKzEsMTg3IEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIWlmICEkZChCQ0IpCitCQ0IgPSAkKE1BS0VESVIpXC4uCishZW5kaWYKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSURFIFNFQ1RJT04KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoZSBmb2xsb3dpbmcgc2VjdGlvbiBvZiB0aGUgcHJvamVjdCBtYWtlZmlsZSBpcyBtYW5hZ2VkIGJ5IHRoZSBCQ0IgSURFLgorIyBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhlIElERSB0byBjaGFuZ2UgYW55IG9mIHRoZSB2YWx1ZXMgaW4gdGhpcworIyBzZWN0aW9uLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVkVSU0lPTiA9IEJDQi4wNS4wMworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BST0pFQ1QgPSBSZWxlYXNlXGxpYmV4cGF0d19tdGQuZGxsCitPQkpGSUxFUyA9IFJlbGVhc2Vcb2JqXGxpYmV4cGF0d1x4bWxwYXJzZS5vYmogUmVsZWFzZVxvYmpcbGliZXhwYXR3XHhtbHJvbGUub2JqIFwKKyAgICBSZWxlYXNlXG9ialxsaWJleHBhdHdceG1sdG9rLm9iagorUkVTRklMRVMgPSAKK01BSU5TT1VSQ0UgPSBleHBhdHcuYnBmCitSRVNERVBFTiA9ICQoUkVTRklMRVMpCitMSUJGSUxFUyA9IAorSURMRklMRVMgPSAKK0lETEdFTkZJTEVTID0gCitMSUJSQVJJRVMgPSAKK1BBQ0tBR0VTID0gVkNMNTAuYnBpIFZDTFg1MC5icGkgYmNic21wNTAuYnBpIFFSUFQ1MC5icGkgVkNMREI1MC5icGkgVkNMQkRFNTAuYnBpIFwKKyAgICBpYnNtcDUwLmJwaSBWQ0xEQlg1MC5icGkgVEVFVUk1MC5icGkgVEVFREI1MC5icGkgVEVFNTAuYnBpIFRFRVFSNTAuYnBpIFwKKyAgICBWQ0xJQjUwLmJwaSBiY2JpZTUwLmJwaSBWQ0xJRTUwLmJwaSBJTkVUREI1MC5icGkgSU5FVDUwLmJwaSBOTUZBU1Q1MC5icGkgXAorICAgIGRjbG9jeDUwLmJwaSBiY2Iya2F4c2VydmVyNTAuYnBpIGRjbHVzcjUwLmJwaQorU1BBUkVMSUJTID0gCitERUZGSUxFID0gbGliZXhwYXR3X210ZC5kZWYKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQQVRIQ1BQID0gLjsuLlxsaWIKK1BBVEhBU00gPSAuOworUEFUSFBBUyA9IC47CitQQVRIUkMgPSAuOworREVCVUdMSUJQQVRIID0gJChCQ0IpXGxpYlxkZWJ1ZworUkVMRUFTRUxJQlBBVEggPSAkKEJDQilcbGliXHJlbGVhc2UKK1VTRVJERUZJTkVTID0gX1dJTkRPV1M7V0lOMzI7TkRFQlVHO19VU1JETEw7Q09NUElMRURfRlJPTV9EU1A7WE1MX1VOSUNPREVfV0NIQVJfVAorU1lTREVGSU5FUyA9IF9OT19WQ0w7X0FTU0VSVEU7Tk9fU1RSSUNUO19SVExETEwKK0lOQ0xVREVQQVRIID0gLi5cbGliOyQoQkNCKVxpbmNsdWRlCitMSUJQQVRIID0gLi5cbGliOyQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCkKK1dBUk5JTkdTPSAtdy1yY2ggLXctcGFyIC13LTgwMjcgLXctODAyNiAtdy1jY2MKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDRkxBRzEgPSAtV0QgLU8yIC1YLSAtYTggLWIgLWstIC12aSAtcSAtdFdNIC1jIC10V0QKK0lETENGTEFHUyA9IC1JJChCQ0IpXGluY2x1ZGUKK1BGTEFHUyA9IC1OMlJlbGVhc2Vcb2JqXGxpYmV4cGF0dyAtTjBSZWxlYXNlXG9ialxsaWJleHBhdHcgLSRZLSAtJEwtIC0kRC0KK1JGTEFHUyA9IC9sIDB4NDA5IC9kICJOREVCVUciIC9pJChCQ0IpXGluY2x1ZGUKK0FGTEFHUyA9IC9teCAvdzIgL3puCitMRkxBR1MgPSAtSVJlbGVhc2Vcb2JqXGxpYmV4cGF0dyAtRCIiIC1hYSAtVHBkIC14IC1HbiAtR2kgLXcgLXEKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBTExPQkogPSBjMGQzMncub2JqICQoT0JKRklMRVMpCitBTExSRVMgPSAkKFJFU0ZJTEVTKQorQUxMTElCID0gJChMSUJGSUxFUykgJChMSUJSQVJJRVMpIGltcG9ydDMyLmxpYiBjdzMybXRpLmxpYgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyFpZmRlZiBJREVPUFRJT05TCisKK1tWZXJzaW9uIEluZm9dCitJbmNsdWRlVmVySW5mbz0wCitBdXRvSW5jQnVpbGQ9MAorTWFqb3JWZXI9MQorTWlub3JWZXI9MAorUmVsZWFzZT0wCitCdWlsZD0wCitEZWJ1Zz0wCitQcmVSZWxlYXNlPTAKK1NwZWNpYWw9MAorUHJpdmF0ZT0wCitETEw9MAorCitbVmVyc2lvbiBJbmZvIEtleXNdCitDb21wYW55TmFtZT0KK0ZpbGVEZXNjcmlwdGlvbj0KK0ZpbGVWZXJzaW9uPTEuMC4wLjAKK0ludGVybmFsTmFtZT0KK0xlZ2FsQ29weXJpZ2h0PQorTGVnYWxUcmFkZW1hcmtzPQorT3JpZ2luYWxGaWxlbmFtZT0KK1Byb2R1Y3ROYW1lPQorUHJvZHVjdFZlcnNpb249MS4wLjAuMAorQ29tbWVudHM9CisKK1tEZWJ1Z2dpbmddCitEZWJ1Z1NvdXJjZURpcnM9JChCQ0IpXHNvdXJjZVx2Y2wKKworIWVuZGlmCisKKworCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTUFLRSBTRUNUSU9OCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGlzIHNlY3Rpb24gb2YgdGhlIHByb2plY3QgZmlsZSBpcyBub3QgdXNlZCBieSB0aGUgQkNCIElERS4gIEl0IGlzIGZvcgorIyB0aGUgYmVuZWZpdCBvZiBidWlsZGluZyBmcm9tIHRoZSBjb21tYW5kLWxpbmUgdXNpbmcgdGhlIE1BS0UgdXRpbGl0eS4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy5hdXRvZGVwZW5kCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIWlmICIkKFVTRVJERUZJTkVTKSIgIT0gIiIKK0FVU0VSREVGSU5FUyA9IC1kJChVU0VSREVGSU5FUzo7PSAtZCkKKyFlbHNlCitBVVNFUkRFRklORVMgPQorIWVuZGlmCisKKyFpZiAhJGQoQkNDMzIpCitCQ0MzMiA9IGJjYzMyCishZW5kaWYKKworIWlmICEkZChDUFAzMikKK0NQUDMyID0gY3BwMzIKKyFlbmRpZgorCishaWYgISRkKERDQzMyKQorRENDMzIgPSBkY2MzMgorIWVuZGlmCisKKyFpZiAhJGQoVEFTTTMyKQorVEFTTTMyID0gdGFzbTMyCishZW5kaWYKKworIWlmICEkZChMSU5LRVIpCitMSU5LRVIgPSBpbGluazMyCishZW5kaWYKKworIWlmICEkZChCUkNDMzIpCitCUkNDMzIgPSBicmNjMzIKKyFlbmRpZgorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCishaWYgJGQoUEFUSENQUCkKKy5QQVRILkNQUCA9ICQoUEFUSENQUCkKKy5QQVRILkMgICA9ICQoUEFUSENQUCkKKyFlbmRpZgorCishaWYgJGQoUEFUSFBBUykKKy5QQVRILlBBUyA9ICQoUEFUSFBBUykKKyFlbmRpZgorCishaWYgJGQoUEFUSEFTTSkKKy5QQVRILkFTTSA9ICQoUEFUSEFTTSkKKyFlbmRpZgorCishaWYgJGQoUEFUSFJDKQorLlBBVEguUkMgID0gJChQQVRIUkMpCishZW5kaWYKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskKFBST0pFQ1QpOiAkKElETEdFTkZJTEVTKSAkKE9CSkZJTEVTKSAkKFJFU0RFUEVOKSAkKERFRkZJTEUpCisgICAgJChCQ0IpXEJJTlwkKExJTktFUikgQCYmIQorICAgICQoTEZMQUdTKSAtTCQoTElCUEFUSCkgKworICAgICQoQUxMT0JKKSwgKworICAgICQoUFJPSkVDVCksLCArCisgICAgJChBTExMSUIpLCArCisgICAgJChERUZGSUxFKSwgKworICAgICQoQUxMUkVTKQorIQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy5wYXMuaHBwOgorICAgICQoQkNCKVxCSU5cJChEQ0MzMikgJChQRkxBR1MpIC1VJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1PJChJTkNMVURFUEFUSCkgLS1CQ0IgeyQ8IH0KKworLnBhcy5vYmo6CisgICAgJChCQ0IpXEJJTlwkKERDQzMyKSAkKFBGTEFHUykgLVUkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLU8kKElOQ0xVREVQQVRIKSAtLUJDQiB7JDwgfQorCisuY3BwLm9iajoKKyAgICAkKEJDQilcQklOXCQoQkNDMzIpICQoQ0ZMQUcxKSAkKFdBUk5JTkdTKSAtSSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtbiQoQEQpIHskPCB9CisKKy5jLm9iajoKKyAgICAkKEJDQilcQklOXCQoQkNDMzIpICQoQ0ZMQUcxKSAkKFdBUk5JTkdTKSAtSSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtbiQoQEQpIHskPCB9CisKKy5jLmk6CisgICAgJChCQ0IpXEJJTlwkKENQUDMyKSAkKENGTEFHMSkgJChXQVJOSU5HUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLW4uIHskPCB9CisKKy5jcHAuaToKKyAgICAkKEJDQilcQklOXCQoQ1BQMzIpICQoQ0ZMQUcxKSAkKFdBUk5JTkdTKSAtSSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtbi4geyQ8IH0KKworLmFzbS5vYmo6CisgICAgJChCQ0IpXEJJTlwkKFRBU00zMikgJChBRkxBR1MpIC1pJChJTkNMVURFUEFUSDo7PSAtaSkgJChBVVNFUkRFRklORVMpIC1kJChTWVNERUZJTkVTOjs9IC1kKSAkPCwgJEAKKworLnJjLnJlczoKKyAgICAkKEJDQilcQklOXCQoQlJDQzMyKSAkKFJGTEFHUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLWZvJEAgJDwKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworCisKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2JjYjUvZXhwYXR3X3N0YXRpYy5icGYgYi9leHBhdC0yLjAuMS9iY2I1L2V4cGF0d19zdGF0aWMuYnBmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYTQ1OGUKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9iY2I1L2V4cGF0d19zdGF0aWMuYnBmCkBAIC0wLDAgKzEsNSBAQAorVVNFVU5JVCgiLi5cbGliXHhtbHBhcnNlLmMiKTsKK1VTRVVOSVQoIi4uXGxpYlx4bWxyb2xlLmMiKTsKK1VTRVVOSVQoIi4uXGxpYlx4bWx0b2suYyIpOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgTGlicmFyeQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvYmNiNS9leHBhdHdfc3RhdGljLmJwciBiL2V4cGF0LTIuMC4xL2JjYjUvZXhwYXR3X3N0YXRpYy5icHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YxMjY0NAotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2JjYjUvZXhwYXR3X3N0YXRpYy5icHIKQEAgLTAsMCArMSwxNTIgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04JyA/PgorPCEtLSBDKytCdWlsZGVyIFhNTCBQcm9qZWN0IC0tPgorPFBST0pFQ1Q+CisgIDxNQUNST1M+CisgICAgPFZFUlNJT04gdmFsdWU9IkJDQi4wNS4wMyIvPgorICAgIDxQUk9KRUNUIHZhbHVlPSJSZWxlYXNlXGxpYmV4cGF0d3NfbXRkLmxpYiIvPgorICAgIDxPQkpGSUxFUyB2YWx1ZT0iUmVsZWFzZVxvYmpcbGliZXhwYXR3X3N0YXRpY1x4bWxwYXJzZS5vYmogCisgICAgICBSZWxlYXNlXG9ialxsaWJleHBhdHdfc3RhdGljXHhtbHJvbGUub2JqIAorICAgICAgUmVsZWFzZVxvYmpcbGliZXhwYXR3X3N0YXRpY1x4bWx0b2sub2JqIi8+CisgICAgPFJFU0ZJTEVTIHZhbHVlPSIiLz4KKyAgICA8SURMRklMRVMgdmFsdWU9IiIvPgorICAgIDxJRExHRU5GSUxFUyB2YWx1ZT0iIi8+CisgICAgPERFRkZJTEUgdmFsdWU9IiIvPgorICAgIDxSRVNERVBFTiB2YWx1ZT0iJChSRVNGSUxFUykiLz4KKyAgICA8TElCRklMRVMgdmFsdWU9IiIvPgorICAgIDxMSUJSQVJJRVMgdmFsdWU9IiIvPgorICAgIDxTUEFSRUxJQlMgdmFsdWU9IiIvPgorICAgIDxQQUNLQUdFUyB2YWx1ZT0iIi8+CisgICAgPFBBVEhDUFAgdmFsdWU9Ii47Li5cbGliIi8+CisgICAgPFBBVEhQQVMgdmFsdWU9Ii47Ii8+CisgICAgPFBBVEhSQyB2YWx1ZT0iLjsiLz4KKyAgICA8UEFUSEFTTSB2YWx1ZT0iLjsiLz4KKyAgICA8REVCVUdMSUJQQVRIIHZhbHVlPSIkKEJDQilcbGliXGRlYnVnIi8+CisgICAgPFJFTEVBU0VMSUJQQVRIIHZhbHVlPSIkKEJDQilcbGliXHJlbGVhc2UiLz4KKyAgICA8TElOS0VSIHZhbHVlPSJUTGliIi8+CisgICAgPFVTRVJERUZJTkVTIHZhbHVlPSJfV0lORE9XUztXSU4zMjtOREVCVUc7X0xJQjtDT01QSUxFRF9GUk9NX0RTUDtYTUxfU1RBVElDO1hNTF9VTklDT0RFX1dDSEFSX1QiLz4KKyAgICA8U1lTREVGSU5FUyB2YWx1ZT0iX05PX1ZDTDtfQVNTRVJURTtOT19TVFJJQ1Q7X1JUTERMTCIvPgorICAgIDxNQUlOU09VUkNFIHZhbHVlPSJleHBhdHdfc3RhdGljLmJwZiIvPgorICAgIDxJTkNMVURFUEFUSCB2YWx1ZT0iLi5cbGliOyQoQkNCKVxpbmNsdWRlIi8+CisgICAgPExJQlBBVEggdmFsdWU9Ii4uXGxpYjskKEJDQilcbGliOyQoUkVMRUFTRUxJQlBBVEgpIi8+CisgICAgPFdBUk5JTkdTIHZhbHVlPSItdy1yY2ggLXctcGFyIC13LTgwMjcgLXctODAyNiAtdy1jY2MiLz4KKyAgICA8TElTVEZJTEUgdmFsdWU9IiIvPgorICA8L01BQ1JPUz4KKyAgPE9QVElPTlM+CisgICAgPElETENGTEFHUyB2YWx1ZT0iLUkkKEJDQilcaW5jbHVkZSIvPgorICAgIDxDRkxBRzEgdmFsdWU9Ii1PMiAtWC0gLWE4IC1iIC1rLSAtdmkgLXEgLXRXTSAtYyIvPgorICAgIDxQRkxBR1MgdmFsdWU9Ii1OMlJlbGVhc2Vcb2JqXGxpYmV4cGF0d19zdGF0aWMgLU4wUmVsZWFzZVxvYmpcbGliZXhwYXR3X3N0YXRpYyAtJFktIC0kTC0gCisgICAgICAtJEQtIi8+CisgICAgPFJGTEFHUyB2YWx1ZT0iL2wgMHg0MDkgL2QgJnF1b3Q7TkRFQlVHJnF1b3Q7IC9pJChCQ0IpXGluY2x1ZGUiLz4KKyAgICA8QUZMQUdTIHZhbHVlPSIvbXggL3cyIC96biIvPgorICAgIDxMRkxBR1MgdmFsdWU9IiIvPgorICA8L09QVElPTlM+CisgIDxMSU5LRVI+CisgICAgPEFMTE9CSiB2YWx1ZT0iJChPQkpGSUxFUykiLz4KKyAgICA8QUxMUkVTIHZhbHVlPSIkKFJFU0ZJTEVTKSIvPgorICAgIDxBTExMSUIgdmFsdWU9IiQoTElCRklMRVMpICQoTElCUkFSSUVTKSIvPgorICA8L0xJTktFUj4KKyAgPElERU9QVElPTlM+CitbVmVyc2lvbiBJbmZvXQorSW5jbHVkZVZlckluZm89MAorQXV0b0luY0J1aWxkPTAKK01ham9yVmVyPTEKK01pbm9yVmVyPTAKK1JlbGVhc2U9MAorQnVpbGQ9MAorRGVidWc9MAorUHJlUmVsZWFzZT0wCitTcGVjaWFsPTAKK1ByaXZhdGU9MAorRExMPTAKK0xvY2FsZT0xMDMzCitDb2RlUGFnZT0xMjUyCisKK1tWZXJzaW9uIEluZm8gS2V5c10KK0NvbXBhbnlOYW1lPQorRmlsZURlc2NyaXB0aW9uPQorRmlsZVZlcnNpb249MS4wLjAuMAorSW50ZXJuYWxOYW1lPQorTGVnYWxDb3B5cmlnaHQ9CitMZWdhbFRyYWRlbWFya3M9CitPcmlnaW5hbEZpbGVuYW1lPQorUHJvZHVjdE5hbWU9CitQcm9kdWN0VmVyc2lvbj0xLjAuMC4wCitDb21tZW50cz0KKworW0hpc3RvcnlMaXN0c1xobEluY2x1ZGVQYXRoXQorQ291bnQ9NAorSXRlbTA9Li5cbGliOyQoQkNCKVxpbmNsdWRlCitJdGVtMT0kKEJDQilcaW5jbHVkZQorSXRlbTI9JChCQ0IpXGluY2x1ZGU7JChCQ0IpXGluY2x1ZGVcbWZjOyQoQkNCKVxpbmNsdWRlXGF0bAorSXRlbTM9JChCQ0IpXGluY2x1ZGU7JChCQ0IpXGluY2x1ZGVcbWZjOyQoQkNCKVxpbmNsdWRlXGF0bDsKKworW0hpc3RvcnlMaXN0c1xobExpYnJhcnlQYXRoXQorQ291bnQ9NQorSXRlbTA9Li5cbGliOyQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCkKK0l0ZW0xPS4uXGxpYjskKEJDQilcbGliOy4uXGxpYlwkKFJFTEVBU0VMSUJQQVRIKQorSXRlbTI9JChCQ0IpXGxpYjskKFJFTEVBU0VMSUJQQVRIKQorSXRlbTM9JChCQ0IpXGxpYjskKFJFTEVBU0VMSUJQQVRIKTskKEJDQilcbGliXHBzZGsKK0l0ZW00PSQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCk7OyQoQkNCKVxsaWJccHNkazsKKworW0hpc3RvcnlMaXN0c1xobERlYnVnU291cmNlUGF0aF0KK0NvdW50PTEKK0l0ZW0wPSQoQkNCKVxzb3VyY2VcdmNsCisKK1tIaXN0b3J5TGlzdHNcaGxDb25kaXRpb25hbHNdCitDb3VudD0xNQorSXRlbTA9X1dJTkRPV1M7V0lOMzI7TkRFQlVHO19MSUI7Q09NUElMRURfRlJPTV9EU1A7WE1MX1NUQVRJQztYTUxfVU5JQ09ERV9XQ0hBUl9UCitJdGVtMT1fV0lORE9XUztXSU4zMjtOREVCVUc7X0RFQlVHO19MSUI7Q09NUElMRURfRlJPTV9EU1A7WE1MX1NUQVRJQztYTUxfVU5JQ09ERV9XQ0hBUl9UCitJdGVtMj1XSU4zMjtfV0lORE9XUztOREVCVUc7X0RFQlVHO19MSUI7Q09NUElMRURfRlJPTV9EU1A7WE1MX1NUQVRJQztYTUxfVU5JQ09ERV9XQ0hBUl9UCitJdGVtMz1XSU4zMjtfV0lORE9XUztOREVCVUc7X0RFQlVHO19MSUI7WE1MX1NUQVRJQztDT01QSUxFRF9GUk9NX0RTUDtYTUxfVU5JQ09ERV9XQ0hBUl9UCitJdGVtND1XSU4zMjtfV0lORE9XUztOREVCVUc7X0xJQjtDT01QSUxFRF9GUk9NX0RTUDtfREVCVUc7WE1MX1VOSUNPREVfV0NIQVJfVAorSXRlbTU9V0lOMzI7X1dJTkRPV1M7TkRFQlVHO19VTklDT0RFO19MSUI7Q09NUElMRURfRlJPTV9EU1A7WE1MX1VOSUNPREVfV0NIQVJfVDtfREVCVUcKK0l0ZW02PVdJTjMyO19XSU5ET1dTO05ERUJVRztfVU5JQ09ERTtfTElCO0NPTVBJTEVEX0ZST01fRFNQO1hNTF9VTklDT0RFX1dDSEFSX1Q7X0RFQlVHO19fY3BsdXNwbHVzCitJdGVtNz1XSU4zMjtfV0lORE9XUztOREVCVUc7X1VOSUNPREU7X0xJQjtDT01QSUxFRF9GUk9NX0RTUDtYTUxfVU5JQ09ERTtfREVCVUcKK0l0ZW04PVdJTjMyO19XSU5ET1dTO05ERUJVRztfTUJDUztfTElCO0NPTVBJTEVEX0ZST01fRFNQO1hNTF9VTklDT0RFO19ERUJVRworSXRlbTk9V0lOMzI7X1dJTkRPV1M7TkRFQlVHO19NQkNTO19MSUI7Q09NUElMRURfRlJPTV9EU1A7WE1MX1VOSUNPREVfV0NIQVJfVDtfREVCVUc7X19XQ0hBUl9UCitJdGVtMTA9V0lOMzI7X1dJTkRPV1M7TkRFQlVHO19NQkNTO19MSUI7Q09NUElMRURfRlJPTV9EU1A7WE1MX1VOSUNPREVfV0NIQVJfVDtfREVCVUc7X1VOSUNPREUKK0l0ZW0xMT1XSU4zMjtfV0lORE9XUztOREVCVUc7X01CQ1M7X0xJQjtDT01QSUxFRF9GUk9NX0RTUDtYTUxfVU5JQ09ERTtfREVCVUc7X1VOSUNPREUKK0l0ZW0xMj1XSU4zMjtfV0lORE9XUztOREVCVUc7X01CQ1M7X0xJQjtDT01QSUxFRF9GUk9NX0RTUDtYTUxfVU5JQ09ERV9XQ0hBUl9UO19ERUJVRworSXRlbTEzPVdJTjMyO19XSU5ET1dTO05ERUJVRztfTUJDUztfTElCO0NPTVBJTEVEX0ZST01fRFNQO1hNTF9VTklDT0RFX1dDSEFSX1QKK0l0ZW0xND1XSU4zMjtfV0lORE9XUztOREVCVUc7X01CQ1M7X0xJQjtDT01QSUxFRF9GUk9NX0RTUDtYTUxfVU5JQ09ERV9XQ0hBUl9UO1hNTF9VTklDT0RFCisKK1tIaXN0b3J5TGlzdHNcaGxJbnRPdXRwdXREaXJdCitDb3VudD02CitJdGVtMD1SZWxlYXNlXG9ialxsaWJleHBhdHdfc3RhdGljCitJdGVtMT1SZWxlYXNlXG9ialxsaWJleHBhdF9zdGF0aWMKK0l0ZW0yPVJlbGVhc2Vcb2JqXG10cworSXRlbTM9UmVsZWFzZVxvYmpcbXQKK0l0ZW00PS4uXGxpYlxSZWxlYXNlLXdfc3RhdGljCitJdGVtNT1SZWxlYXNlLXdfc3RhdGljCisKK1tIaXN0b3J5TGlzdHNcaGxGaW5hbE91dHB1dERpcl0KK0NvdW50PTMKK0l0ZW0wPVJlbGVhc2VcCitJdGVtMT1SZWxlYXNlCitJdGVtMj1SZWxlYXNlLXdfc3RhdGljXAorCitbSGlzdG9yeUxpc3RzXGhsVGxpYlBhZ2VTaXplXQorQ291bnQ9MQorSXRlbTA9MHgwMDEwCisKK1tEZWJ1Z2dpbmddCitEZWJ1Z1NvdXJjZURpcnM9CisKK1tQYXJhbWV0ZXJzXQorUnVuUGFyYW1zPQorSG9zdEFwcGxpY2F0aW9uPQorUmVtb3RlSG9zdD0KK1JlbW90ZVBhdGg9CitSZW1vdGVEZWJ1Zz0wCisKK1tDb21waWxlcl0KK1Nob3dJbmZvTXNncz0wCitMaW5rRGVidWdWY2w9MAorTGlua0NHTElCPTAKKworW0xhbmd1YWdlXQorQWN0aXZlTGFuZz0KK1Byb2plY3RMYW5nPQorUm9vdERpcj0KKyAgPC9JREVPUFRJT05TPgorPC9QUk9KRUNUPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2JjYjUvZXhwYXR3X3N0YXRpYy5tYWsgYi9leHBhdC0yLjAuMS9iY2I1L2V4cGF0d19zdGF0aWMubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YjdlNWIKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9iY2I1L2V4cGF0d19zdGF0aWMubWFrCkBAIC0wLDAgKzEsMTkwIEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIWlmICEkZChCQ0IpCitCQ0IgPSAkKE1BS0VESVIpXC4uCishZW5kaWYKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSURFIFNFQ1RJT04KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoZSBmb2xsb3dpbmcgc2VjdGlvbiBvZiB0aGUgcHJvamVjdCBtYWtlZmlsZSBpcyBtYW5hZ2VkIGJ5IHRoZSBCQ0IgSURFLgorIyBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhlIElERSB0byBjaGFuZ2UgYW55IG9mIHRoZSB2YWx1ZXMgaW4gdGhpcworIyBzZWN0aW9uLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVkVSU0lPTiA9IEJDQi4wNS4wMworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BST0pFQ1QgPSBSZWxlYXNlXGxpYmV4cGF0d3NfbXRkLmxpYgorT0JKRklMRVMgPSBSZWxlYXNlXG9ialxsaWJleHBhdHdfc3RhdGljXHhtbHBhcnNlLm9iaiBcCisgICAgUmVsZWFzZVxvYmpcbGliZXhwYXR3X3N0YXRpY1x4bWxyb2xlLm9iaiBcCisgICAgUmVsZWFzZVxvYmpcbGliZXhwYXR3X3N0YXRpY1x4bWx0b2sub2JqCitSRVNGSUxFUyA9IAorTUFJTlNPVVJDRSA9IGV4cGF0d19zdGF0aWMuYnBmCitSRVNERVBFTiA9ICQoUkVTRklMRVMpCitMSUJGSUxFUyA9IAorSURMRklMRVMgPSAKK0lETEdFTkZJTEVTID0gCitMSUJSQVJJRVMgPSAKK1BBQ0tBR0VTID0gCitTUEFSRUxJQlMgPSAKK0RFRkZJTEUgPSAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQQVRIQ1BQID0gLjsuLlxsaWIKK1BBVEhBU00gPSAuOworUEFUSFBBUyA9IC47CitQQVRIUkMgPSAuOworTElOS0VSID0gVExpYgorREVCVUdMSUJQQVRIID0gJChCQ0IpXGxpYlxkZWJ1ZworUkVMRUFTRUxJQlBBVEggPSAkKEJDQilcbGliXHJlbGVhc2UKK1VTRVJERUZJTkVTID0gX1dJTkRPV1M7V0lOMzI7TkRFQlVHO19MSUI7Q09NUElMRURfRlJPTV9EU1A7WE1MX1NUQVRJQztYTUxfVU5JQ09ERV9XQ0hBUl9UCitTWVNERUZJTkVTID0gX05PX1ZDTDtfQVNTRVJURTtOT19TVFJJQ1Q7X1JUTERMTAorSU5DTFVERVBBVEggPSAuLlxsaWI7JChCQ0IpXGluY2x1ZGUKK0xJQlBBVEggPSAuLlxsaWI7JChCQ0IpXGxpYjskKFJFTEVBU0VMSUJQQVRIKQorV0FSTklOR1MgPSAtdy1yY2ggLXctcGFyIC13LTgwMjcgLXctODAyNiAtdy1jY2MKK0xJU1RGSUxFID0gCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ0ZMQUcxID0gLU8yIC1YLSAtYTggLWIgLWstIC12aSAtcSAtdFdNIC1jCitJRExDRkxBR1MgPSAtSSQoQkNCKVxpbmNsdWRlCitQRkxBR1MgPSAtTjJSZWxlYXNlXG9ialxsaWJleHBhdHdfc3RhdGljIC1OMFJlbGVhc2Vcb2JqXGxpYmV4cGF0d19zdGF0aWMgLSRZLSAtJEwtIFwKKyAgICAtJEQtCitSRkxBR1MgPSAvbCAweDQwOSAvZCAiTkRFQlVHIiAvaSQoQkNCKVxpbmNsdWRlCitBRkxBR1MgPSAvbXggL3cyIC96bgorTEZMQUdTID0gCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUxMT0JKID0gJChPQkpGSUxFUykKK0FMTFJFUyA9ICQoUkVTRklMRVMpCitBTExMSUIgPSAkKExJQkZJTEVTKSAkKExJQlJBUklFUykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCishaWZkZWYgSURFT1BUSU9OUworCitbVmVyc2lvbiBJbmZvXQorSW5jbHVkZVZlckluZm89MAorQXV0b0luY0J1aWxkPTAKK01ham9yVmVyPTEKK01pbm9yVmVyPTAKK1JlbGVhc2U9MAorQnVpbGQ9MAorRGVidWc9MAorUHJlUmVsZWFzZT0wCitTcGVjaWFsPTAKK1ByaXZhdGU9MAorRExMPTAKKworW1ZlcnNpb24gSW5mbyBLZXlzXQorQ29tcGFueU5hbWU9CitGaWxlRGVzY3JpcHRpb249CitGaWxlVmVyc2lvbj0xLjAuMC4wCitJbnRlcm5hbE5hbWU9CitMZWdhbENvcHlyaWdodD0KK0xlZ2FsVHJhZGVtYXJrcz0KK09yaWdpbmFsRmlsZW5hbWU9CitQcm9kdWN0TmFtZT0KK1Byb2R1Y3RWZXJzaW9uPTEuMC4wLjAKK0NvbW1lbnRzPQorCitbRGVidWdnaW5nXQorRGVidWdTb3VyY2VEaXJzPSQoQkNCKVxzb3VyY2VcdmNsCisKKyFlbmRpZgorCisKKworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE1BS0UgU0VDVElPTgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhpcyBzZWN0aW9uIG9mIHRoZSBwcm9qZWN0IGZpbGUgaXMgbm90IHVzZWQgYnkgdGhlIEJDQiBJREUuICBJdCBpcyBmb3IKKyMgdGhlIGJlbmVmaXQgb2YgYnVpbGRpbmcgZnJvbSB0aGUgY29tbWFuZC1saW5lIHVzaW5nIHRoZSBNQUtFIHV0aWxpdHkuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuYXV0b2RlcGVuZAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyFpZiAiJChVU0VSREVGSU5FUykiICE9ICIiCitBVVNFUkRFRklORVMgPSAtZCQoVVNFUkRFRklORVM6Oz0gLWQpCishZWxzZQorQVVTRVJERUZJTkVTID0KKyFlbmRpZgorCishaWYgISRkKEJDQzMyKQorQkNDMzIgPSBiY2MzMgorIWVuZGlmCisKKyFpZiAhJGQoQ1BQMzIpCitDUFAzMiA9IGNwcDMyCishZW5kaWYKKworIWlmICEkZChEQ0MzMikKK0RDQzMyID0gZGNjMzIKKyFlbmRpZgorCishaWYgISRkKFRBU00zMikKK1RBU00zMiA9IHRhc20zMgorIWVuZGlmCisKKyFpZiAhJGQoTElOS0VSKQorTElOS0VSID0gVExpYgorIWVuZGlmCisKKyFpZiAhJGQoQlJDQzMyKQorQlJDQzMyID0gYnJjYzMyCishZW5kaWYKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIWlmICRkKFBBVEhDUFApCisuUEFUSC5DUFAgPSAkKFBBVEhDUFApCisuUEFUSC5DICAgPSAkKFBBVEhDUFApCishZW5kaWYKKworIWlmICRkKFBBVEhQQVMpCisuUEFUSC5QQVMgPSAkKFBBVEhQQVMpCishZW5kaWYKKworIWlmICRkKFBBVEhBU00pCisuUEFUSC5BU00gPSAkKFBBVEhBU00pCishZW5kaWYKKworIWlmICRkKFBBVEhSQykKKy5QQVRILlJDICA9ICQoUEFUSFJDKQorIWVuZGlmCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIWlmICIkKExJU1RGSUxFKSIgPT0gICIiCitDT01NQSA9CishZWxzZQorQ09NTUEgPSAsCishZW5kaWYKKworJChQUk9KRUNUKTogJChJRExHRU5GSUxFUykgJChPQkpGSUxFUykgJChSRVNERVBFTikgJChERUZGSUxFKQorICAgICQoQkNCKVxCSU5cJChMSU5LRVIpIC91ICRAIEAmJiEKKyAgICAkKExGTEFHUykgJD8gJChDT01NQSkgJChMSVNURklMRSkKKworIQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy5wYXMuaHBwOgorICAgICQoQkNCKVxCSU5cJChEQ0MzMikgJChQRkxBR1MpIC1VJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1PJChJTkNMVURFUEFUSCkgLS1CQ0IgeyQ8IH0KKworLnBhcy5vYmo6CisgICAgJChCQ0IpXEJJTlwkKERDQzMyKSAkKFBGTEFHUykgLVUkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLU8kKElOQ0xVREVQQVRIKSAtLUJDQiB7JDwgfQorCisuY3BwLm9iajoKKyAgICAkKEJDQilcQklOXCQoQkNDMzIpICQoQ0ZMQUcxKSAkKFdBUk5JTkdTKSAtSSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtbiQoQEQpIHskPCB9CisKKy5jLm9iajoKKyAgICAkKEJDQilcQklOXCQoQkNDMzIpICQoQ0ZMQUcxKSAkKFdBUk5JTkdTKSAtSSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtbiQoQEQpIHskPCB9CisKKy5jLmk6CisgICAgJChCQ0IpXEJJTlwkKENQUDMyKSAkKENGTEFHMSkgJChXQVJOSU5HUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLW4uIHskPCB9CisKKy5jcHAuaToKKyAgICAkKEJDQilcQklOXCQoQ1BQMzIpICQoQ0ZMQUcxKSAkKFdBUk5JTkdTKSAtSSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtbi4geyQ8IH0KKworLmFzbS5vYmo6CisgICAgJChCQ0IpXEJJTlwkKFRBU00zMikgJChBRkxBR1MpIC1pJChJTkNMVURFUEFUSDo7PSAtaSkgJChBVVNFUkRFRklORVMpIC1kJChTWVNERUZJTkVTOjs9IC1kKSAkPCwgJEAKKworLnJjLnJlczoKKyAgICAkKEJDQilcQklOXCQoQlJDQzMyKSAkKFJGTEFHUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLWZvJEAgJDwKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworCisKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2JjYjUvbGliZXhwYXRfbXRkLmRlZiBiL2V4cGF0LTIuMC4xL2JjYjUvbGliZXhwYXRfbXRkLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzFjYjk1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYmNiNS9saWJleHBhdF9tdGQuZGVmCkBAIC0wLDAgKzEsMTQxIEBACis7IERFRiBmaWxlIGZvciBCQ0I1CitMSUJSQVJZICAgTElCRVhQQVRfTVRECitERVNDUklQVElPTiAiSW1wbGVtZW50cyBhbiBYTUwgcGFyc2VyLiIKK0VYUE9SVFMKKyAgX1hNTF9EZWZhdWx0Q3VycmVudCBAMQorICBfWE1MX0Vycm9yU3RyaW5nIEAyCisgIF9YTUxfRXhwYXRWZXJzaW9uIEAzCisgIF9YTUxfRXhwYXRWZXJzaW9uSW5mbyBANAorICBfWE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlIEA1CisgIF9YTUxfR2V0QmFzZSBANgorICBfWE1MX0dldEJ1ZmZlciBANworICBfWE1MX0dldEN1cnJlbnRCeXRlQ291bnQgQDgKKyAgX1hNTF9HZXRDdXJyZW50Qnl0ZUluZGV4IEA5CisgIF9YTUxfR2V0Q3VycmVudENvbHVtbk51bWJlciBAMTAKKyAgX1hNTF9HZXRDdXJyZW50TGluZU51bWJlciBAMTEKKyAgX1hNTF9HZXRFcnJvckNvZGUgQDEyCisgIF9YTUxfR2V0SWRBdHRyaWJ1dGVJbmRleCBAMTMKKyAgX1hNTF9HZXRJbnB1dENvbnRleHQgQDE0CisgIF9YTUxfR2V0U3BlY2lmaWVkQXR0cmlidXRlQ291bnQgQDE1CisgIF9YTUxfUGFyc2UgQDE2CisgIF9YTUxfUGFyc2VCdWZmZXIgQDE3CisgIF9YTUxfUGFyc2VyQ3JlYXRlIEAxOAorICBfWE1MX1BhcnNlckNyZWF0ZU5TIEAxOQorICBfWE1MX1BhcnNlckNyZWF0ZV9NTSBAMjAKKyAgX1hNTF9QYXJzZXJGcmVlIEAyMQorICBfWE1MX1NldEF0dGxpc3REZWNsSGFuZGxlciBAMjIKKyAgX1hNTF9TZXRCYXNlIEAyMworICBfWE1MX1NldENkYXRhU2VjdGlvbkhhbmRsZXIgQDI0CisgIF9YTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXIgQDI1CisgIF9YTUxfU2V0Q29tbWVudEhhbmRsZXIgQDI2CisgIF9YTUxfU2V0RGVmYXVsdEhhbmRsZXIgQDI3CisgIF9YTUxfU2V0RGVmYXVsdEhhbmRsZXJFeHBhbmQgQDI4CisgIF9YTUxfU2V0RG9jdHlwZURlY2xIYW5kbGVyIEAyOQorICBfWE1MX1NldEVsZW1lbnREZWNsSGFuZGxlciBAMzAKKyAgX1hNTF9TZXRFbGVtZW50SGFuZGxlciBAMzEKKyAgX1hNTF9TZXRFbmNvZGluZyBAMzIKKyAgX1hNTF9TZXRFbmRDZGF0YVNlY3Rpb25IYW5kbGVyIEAzMworICBfWE1MX1NldEVuZERvY3R5cGVEZWNsSGFuZGxlciBAMzQKKyAgX1hNTF9TZXRFbmRFbGVtZW50SGFuZGxlciBAMzUKKyAgX1hNTF9TZXRFbmROYW1lc3BhY2VEZWNsSGFuZGxlciBAMzYKKyAgX1hNTF9TZXRFbnRpdHlEZWNsSGFuZGxlciBAMzcKKyAgX1hNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIgQDM4CisgIF9YTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnIEAzOQorICBfWE1MX1NldE5hbWVzcGFjZURlY2xIYW5kbGVyIEA0MAorICBfWE1MX1NldE5vdFN0YW5kYWxvbmVIYW5kbGVyIEA0MQorICBfWE1MX1NldE5vdGF0aW9uRGVjbEhhbmRsZXIgQDQyCisgIF9YTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nIEA0MworICBfWE1MX1NldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIgQDQ0CisgIF9YTUxfU2V0UmV0dXJuTlNUcmlwbGV0IEA0NQorICBfWE1MX1NldFN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlciBANDYKKyAgX1hNTF9TZXRTdGFydERvY3R5cGVEZWNsSGFuZGxlciBANDcKKyAgX1hNTF9TZXRTdGFydEVsZW1lbnRIYW5kbGVyIEA0OAorICBfWE1MX1NldFN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIgQDQ5CisgIF9YTUxfU2V0VW5rbm93bkVuY29kaW5nSGFuZGxlciBANTAKKyAgX1hNTF9TZXRVbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyIEA1MQorICBfWE1MX1NldFVzZXJEYXRhIEA1MgorICBfWE1MX1NldFhtbERlY2xIYW5kbGVyIEA1MworICBfWE1MX1VzZVBhcnNlckFzSGFuZGxlckFyZyBANTQKKzsgYWRkZWQgd2l0aCB2ZXJzaW9uIDEuOTUuMworICBfWE1MX1BhcnNlclJlc2V0IEA1NQorICBfWE1MX1NldFNraXBwZWRFbnRpdHlIYW5kbGVyIEA1NgorOyBhZGRlZCB3aXRoIHZlcnNpb24gMS45NS41CisgIF9YTUxfR2V0RmVhdHVyZUxpc3QgQDU3CisgIF9YTUxfVXNlRm9yZWlnbkRURCBANTgKKzsgYWRkZWQgd2l0aCB2ZXJzaW9uIDEuOTUuNgorICBfWE1MX0ZyZWVDb250ZW50TW9kZWwgQDU5CisgIF9YTUxfTWVtTWFsbG9jIEA2MAorICBfWE1MX01lbVJlYWxsb2MgQDYxCisgIF9YTUxfTWVtRnJlZSBANjIKKzsgYWRkZWQgd2l0aCB2ZXJzaW9uIDEuOTUuOAorICBfWE1MX1N0b3BQYXJzZXIgQDYzCisgIF9YTUxfUmVzdW1lUGFyc2VyIEA2NAorICBfWE1MX0dldFBhcnNpbmdTdGF0dXMgQDY1CisKKzsgQWxpYXNlcyBmb3IgTVMgY29tcGF0aWJsZSBuYW1lcworICBYTUxfRGVmYXVsdEN1cnJlbnQgPSBfWE1MX0RlZmF1bHRDdXJyZW50CisgIFhNTF9FcnJvclN0cmluZyA9IF9YTUxfRXJyb3JTdHJpbmcKKyAgWE1MX0V4cGF0VmVyc2lvbiA9IF9YTUxfRXhwYXRWZXJzaW9uCisgIFhNTF9FeHBhdFZlcnNpb25JbmZvID0gX1hNTF9FeHBhdFZlcnNpb25JbmZvCisgIFhNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZSA9IF9YTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUKKyAgWE1MX0dldEJhc2UgPSBfWE1MX0dldEJhc2UKKyAgWE1MX0dldEJ1ZmZlciA9IF9YTUxfR2V0QnVmZmVyCisgIFhNTF9HZXRDdXJyZW50Qnl0ZUNvdW50ID0gX1hNTF9HZXRDdXJyZW50Qnl0ZUNvdW50CisgIFhNTF9HZXRDdXJyZW50Qnl0ZUluZGV4ID0gX1hNTF9HZXRDdXJyZW50Qnl0ZUluZGV4CisgIFhNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyID0gX1hNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyCisgIFhNTF9HZXRDdXJyZW50TGluZU51bWJlciA9IF9YTUxfR2V0Q3VycmVudExpbmVOdW1iZXIKKyAgWE1MX0dldEVycm9yQ29kZSA9IF9YTUxfR2V0RXJyb3JDb2RlCisgIFhNTF9HZXRJZEF0dHJpYnV0ZUluZGV4ID0gX1hNTF9HZXRJZEF0dHJpYnV0ZUluZGV4CisgIFhNTF9HZXRJbnB1dENvbnRleHQgPSBfWE1MX0dldElucHV0Q29udGV4dAorICBYTUxfR2V0U3BlY2lmaWVkQXR0cmlidXRlQ291bnQgPSBfWE1MX0dldFNwZWNpZmllZEF0dHJpYnV0ZUNvdW50CisgIFhNTF9QYXJzZSA9IF9YTUxfUGFyc2UKKyAgWE1MX1BhcnNlQnVmZmVyID0gX1hNTF9QYXJzZUJ1ZmZlcgorICBYTUxfUGFyc2VyQ3JlYXRlID0gX1hNTF9QYXJzZXJDcmVhdGUKKyAgWE1MX1BhcnNlckNyZWF0ZU5TID0gX1hNTF9QYXJzZXJDcmVhdGVOUworICBYTUxfUGFyc2VyQ3JlYXRlX01NID0gX1hNTF9QYXJzZXJDcmVhdGVfTU0KKyAgWE1MX1BhcnNlckZyZWUgPSBfWE1MX1BhcnNlckZyZWUKKyAgWE1MX1NldEF0dGxpc3REZWNsSGFuZGxlciA9IF9YTUxfU2V0QXR0bGlzdERlY2xIYW5kbGVyCisgIFhNTF9TZXRCYXNlID0gX1hNTF9TZXRCYXNlCisgIFhNTF9TZXRDZGF0YVNlY3Rpb25IYW5kbGVyID0gX1hNTF9TZXRDZGF0YVNlY3Rpb25IYW5kbGVyCisgIFhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlciA9IF9YTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXIKKyAgWE1MX1NldENvbW1lbnRIYW5kbGVyID0gX1hNTF9TZXRDb21tZW50SGFuZGxlcgorICBYTUxfU2V0RGVmYXVsdEhhbmRsZXIgPSBfWE1MX1NldERlZmF1bHRIYW5kbGVyCisgIFhNTF9TZXREZWZhdWx0SGFuZGxlckV4cGFuZCA9IF9YTUxfU2V0RGVmYXVsdEhhbmRsZXJFeHBhbmQKKyAgWE1MX1NldERvY3R5cGVEZWNsSGFuZGxlciA9IF9YTUxfU2V0RG9jdHlwZURlY2xIYW5kbGVyCisgIFhNTF9TZXRFbGVtZW50RGVjbEhhbmRsZXIgPSBfWE1MX1NldEVsZW1lbnREZWNsSGFuZGxlcgorICBYTUxfU2V0RWxlbWVudEhhbmRsZXIgPSBfWE1MX1NldEVsZW1lbnRIYW5kbGVyCisgIFhNTF9TZXRFbmNvZGluZyA9IF9YTUxfU2V0RW5jb2RpbmcKKyAgWE1MX1NldEVuZENkYXRhU2VjdGlvbkhhbmRsZXIgPSBfWE1MX1NldEVuZENkYXRhU2VjdGlvbkhhbmRsZXIKKyAgWE1MX1NldEVuZERvY3R5cGVEZWNsSGFuZGxlciA9IF9YTUxfU2V0RW5kRG9jdHlwZURlY2xIYW5kbGVyCisgIFhNTF9TZXRFbmRFbGVtZW50SGFuZGxlciA9IF9YTUxfU2V0RW5kRWxlbWVudEhhbmRsZXIKKyAgWE1MX1NldEVuZE5hbWVzcGFjZURlY2xIYW5kbGVyID0gX1hNTF9TZXRFbmROYW1lc3BhY2VEZWNsSGFuZGxlcgorICBYTUxfU2V0RW50aXR5RGVjbEhhbmRsZXIgPSBfWE1MX1NldEVudGl0eURlY2xIYW5kbGVyCisgIFhNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIgPSBfWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlcgorICBYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnID0gX1hNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcKKyAgWE1MX1NldE5hbWVzcGFjZURlY2xIYW5kbGVyID0gX1hNTF9TZXROYW1lc3BhY2VEZWNsSGFuZGxlcgorICBYTUxfU2V0Tm90U3RhbmRhbG9uZUhhbmRsZXIgPSBfWE1MX1NldE5vdFN0YW5kYWxvbmVIYW5kbGVyCisgIFhNTF9TZXROb3RhdGlvbkRlY2xIYW5kbGVyID0gX1hNTF9TZXROb3RhdGlvbkRlY2xIYW5kbGVyCisgIFhNTF9TZXRQYXJhbUVudGl0eVBhcnNpbmcgPSBfWE1MX1NldFBhcmFtRW50aXR5UGFyc2luZworICBYTUxfU2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlciA9IF9YTUxfU2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlcgorICBYTUxfU2V0UmV0dXJuTlNUcmlwbGV0ID0gX1hNTF9TZXRSZXR1cm5OU1RyaXBsZXQKKyAgWE1MX1NldFN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlciA9IF9YTUxfU2V0U3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyCisgIFhNTF9TZXRTdGFydERvY3R5cGVEZWNsSGFuZGxlciA9IF9YTUxfU2V0U3RhcnREb2N0eXBlRGVjbEhhbmRsZXIKKyAgWE1MX1NldFN0YXJ0RWxlbWVudEhhbmRsZXIgPSBfWE1MX1NldFN0YXJ0RWxlbWVudEhhbmRsZXIKKyAgWE1MX1NldFN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIgPSBfWE1MX1NldFN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIKKyAgWE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXIgPSBfWE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXIKKyAgWE1MX1NldFVucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIgPSBfWE1MX1NldFVucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIKKyAgWE1MX1NldFVzZXJEYXRhID0gX1hNTF9TZXRVc2VyRGF0YQorICBYTUxfU2V0WG1sRGVjbEhhbmRsZXIgPSBfWE1MX1NldFhtbERlY2xIYW5kbGVyCisgIFhNTF9Vc2VQYXJzZXJBc0hhbmRsZXJBcmcgPSBfWE1MX1VzZVBhcnNlckFzSGFuZGxlckFyZworICBYTUxfUGFyc2VyUmVzZXQgPSBfWE1MX1BhcnNlclJlc2V0CisgIFhNTF9TZXRTa2lwcGVkRW50aXR5SGFuZGxlciA9IF9YTUxfU2V0U2tpcHBlZEVudGl0eUhhbmRsZXIKKyAgWE1MX0dldEZlYXR1cmVMaXN0ID0gX1hNTF9HZXRGZWF0dXJlTGlzdAorICBYTUxfVXNlRm9yZWlnbkRURCA9IF9YTUxfVXNlRm9yZWlnbkRURAorICBYTUxfRnJlZUNvbnRlbnRNb2RlbCA9IF9YTUxfRnJlZUNvbnRlbnRNb2RlbAorICBYTUxfTWVtTWFsbG9jID0gX1hNTF9NZW1NYWxsb2MKKyAgWE1MX01lbVJlYWxsb2MgPSBfWE1MX01lbVJlYWxsb2MKKyAgWE1MX01lbUZyZWUgPSBfWE1MX01lbUZyZWUKKyAgWE1MX1N0b3BQYXJzZXIgPSBfWE1MX1N0b3BQYXJzZXIKKyAgWE1MX1Jlc3VtZVBhcnNlciA9IF9YTUxfUmVzdW1lUGFyc2VyCisgIFhNTF9HZXRQYXJzaW5nU3RhdHVzID0gX1hNTF9HZXRQYXJzaW5nU3RhdHVzCisKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2JjYjUvbGliZXhwYXR3X210ZC5kZWYgYi9leHBhdC0yLjAuMS9iY2I1L2xpYmV4cGF0d19tdGQuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxODQ2MmQKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9iY2I1L2xpYmV4cGF0d19tdGQuZGVmCkBAIC0wLDAgKzEsMTQwIEBACis7IERFRiBmaWxlIGZvciBCQ0I1CitMSUJSQVJZICAgTElCRVhQQVRXX01URAorREVTQ1JJUFRJT04gIkltcGxlbWVudHMgYW4gWE1MIHBhcnNlci4iCitFWFBPUlRTCisgIF9YTUxfRGVmYXVsdEN1cnJlbnQgQDEKKyAgX1hNTF9FcnJvclN0cmluZyBAMgorICBfWE1MX0V4cGF0VmVyc2lvbiBAMworICBfWE1MX0V4cGF0VmVyc2lvbkluZm8gQDQKKyAgX1hNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZSBANQorICBfWE1MX0dldEJhc2UgQDYKKyAgX1hNTF9HZXRCdWZmZXIgQDcKKyAgX1hNTF9HZXRDdXJyZW50Qnl0ZUNvdW50IEA4CisgIF9YTUxfR2V0Q3VycmVudEJ5dGVJbmRleCBAOQorICBfWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIgQDEwCisgIF9YTUxfR2V0Q3VycmVudExpbmVOdW1iZXIgQDExCisgIF9YTUxfR2V0RXJyb3JDb2RlIEAxMgorICBfWE1MX0dldElkQXR0cmlidXRlSW5kZXggQDEzCisgIF9YTUxfR2V0SW5wdXRDb250ZXh0IEAxNAorICBfWE1MX0dldFNwZWNpZmllZEF0dHJpYnV0ZUNvdW50IEAxNQorICBfWE1MX1BhcnNlIEAxNgorICBfWE1MX1BhcnNlQnVmZmVyIEAxNworICBfWE1MX1BhcnNlckNyZWF0ZSBAMTgKKyAgX1hNTF9QYXJzZXJDcmVhdGVOUyBAMTkKKyAgX1hNTF9QYXJzZXJDcmVhdGVfTU0gQDIwCisgIF9YTUxfUGFyc2VyRnJlZSBAMjEKKyAgX1hNTF9TZXRBdHRsaXN0RGVjbEhhbmRsZXIgQDIyCisgIF9YTUxfU2V0QmFzZSBAMjMKKyAgX1hNTF9TZXRDZGF0YVNlY3Rpb25IYW5kbGVyIEAyNAorICBfWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyIEAyNQorICBfWE1MX1NldENvbW1lbnRIYW5kbGVyIEAyNgorICBfWE1MX1NldERlZmF1bHRIYW5kbGVyIEAyNworICBfWE1MX1NldERlZmF1bHRIYW5kbGVyRXhwYW5kIEAyOAorICBfWE1MX1NldERvY3R5cGVEZWNsSGFuZGxlciBAMjkKKyAgX1hNTF9TZXRFbGVtZW50RGVjbEhhbmRsZXIgQDMwCisgIF9YTUxfU2V0RWxlbWVudEhhbmRsZXIgQDMxCisgIF9YTUxfU2V0RW5jb2RpbmcgQDMyCisgIF9YTUxfU2V0RW5kQ2RhdGFTZWN0aW9uSGFuZGxlciBAMzMKKyAgX1hNTF9TZXRFbmREb2N0eXBlRGVjbEhhbmRsZXIgQDM0CisgIF9YTUxfU2V0RW5kRWxlbWVudEhhbmRsZXIgQDM1CisgIF9YTUxfU2V0RW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIgQDM2CisgIF9YTUxfU2V0RW50aXR5RGVjbEhhbmRsZXIgQDM3CisgIF9YTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIEAzOAorICBfWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlckFyZyBAMzkKKyAgX1hNTF9TZXROYW1lc3BhY2VEZWNsSGFuZGxlciBANDAKKyAgX1hNTF9TZXROb3RTdGFuZGFsb25lSGFuZGxlciBANDEKKyAgX1hNTF9TZXROb3RhdGlvbkRlY2xIYW5kbGVyIEA0MgorICBfWE1MX1NldFBhcmFtRW50aXR5UGFyc2luZyBANDMKKyAgX1hNTF9TZXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyIEA0NAorICBfWE1MX1NldFJldHVybk5TVHJpcGxldCBANDUKKyAgX1hNTF9TZXRTdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgQDQ2CisgIF9YTUxfU2V0U3RhcnREb2N0eXBlRGVjbEhhbmRsZXIgQDQ3CisgIF9YTUxfU2V0U3RhcnRFbGVtZW50SGFuZGxlciBANDgKKyAgX1hNTF9TZXRTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyIEA0OQorICBfWE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXIgQDUwCisgIF9YTUxfU2V0VW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlciBANTEKKyAgX1hNTF9TZXRVc2VyRGF0YSBANTIKKyAgX1hNTF9TZXRYbWxEZWNsSGFuZGxlciBANTMKKyAgX1hNTF9Vc2VQYXJzZXJBc0hhbmRsZXJBcmcgQDU0Cis7IGFkZGVkIHdpdGggdmVyc2lvbiAxLjk1LjMKKyAgX1hNTF9QYXJzZXJSZXNldCBANTUKKyAgX1hNTF9TZXRTa2lwcGVkRW50aXR5SGFuZGxlciBANTYKKzsgYWRkZWQgd2l0aCB2ZXJzaW9uIDEuOTUuNQorICBfWE1MX0dldEZlYXR1cmVMaXN0IEA1NworICBfWE1MX1VzZUZvcmVpZ25EVEQgQDU4Cis7IGFkZGVkIHdpdGggdmVyc2lvbiAxLjk1LjYKKyAgX1hNTF9GcmVlQ29udGVudE1vZGVsIEA1OQorICBfWE1MX01lbU1hbGxvYyBANjAKKyAgX1hNTF9NZW1SZWFsbG9jIEA2MQorICBfWE1MX01lbUZyZWUgQDYyCis7IGFkZGVkIHdpdGggdmVyc2lvbiAxLjk1LjgKKyAgX1hNTF9TdG9wUGFyc2VyIEA2MworICBfWE1MX1Jlc3VtZVBhcnNlciBANjQKKyAgX1hNTF9HZXRQYXJzaW5nU3RhdHVzIEA2NQorCis7IEFsaWFzZXMgZm9yIE1TIGNvbXBhdGlibGUgbmFtZXMKKyAgWE1MX0RlZmF1bHRDdXJyZW50ID0gX1hNTF9EZWZhdWx0Q3VycmVudAorICBYTUxfRXJyb3JTdHJpbmcgPSBfWE1MX0Vycm9yU3RyaW5nCisgIFhNTF9FeHBhdFZlcnNpb24gPSBfWE1MX0V4cGF0VmVyc2lvbgorICBYTUxfRXhwYXRWZXJzaW9uSW5mbyA9IF9YTUxfRXhwYXRWZXJzaW9uSW5mbworICBYTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUgPSBfWE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlCisgIFhNTF9HZXRCYXNlID0gX1hNTF9HZXRCYXNlCisgIFhNTF9HZXRCdWZmZXIgPSBfWE1MX0dldEJ1ZmZlcgorICBYTUxfR2V0Q3VycmVudEJ5dGVDb3VudCA9IF9YTUxfR2V0Q3VycmVudEJ5dGVDb3VudAorICBYTUxfR2V0Q3VycmVudEJ5dGVJbmRleCA9IF9YTUxfR2V0Q3VycmVudEJ5dGVJbmRleAorICBYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlciA9IF9YTUxfR2V0Q3VycmVudENvbHVtbk51bWJlcgorICBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIgPSBfWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyCisgIFhNTF9HZXRFcnJvckNvZGUgPSBfWE1MX0dldEVycm9yQ29kZQorICBYTUxfR2V0SWRBdHRyaWJ1dGVJbmRleCA9IF9YTUxfR2V0SWRBdHRyaWJ1dGVJbmRleAorICBYTUxfR2V0SW5wdXRDb250ZXh0ID0gX1hNTF9HZXRJbnB1dENvbnRleHQKKyAgWE1MX0dldFNwZWNpZmllZEF0dHJpYnV0ZUNvdW50ID0gX1hNTF9HZXRTcGVjaWZpZWRBdHRyaWJ1dGVDb3VudAorICBYTUxfUGFyc2UgPSBfWE1MX1BhcnNlCisgIFhNTF9QYXJzZUJ1ZmZlciA9IF9YTUxfUGFyc2VCdWZmZXIKKyAgWE1MX1BhcnNlckNyZWF0ZSA9IF9YTUxfUGFyc2VyQ3JlYXRlCisgIFhNTF9QYXJzZXJDcmVhdGVOUyA9IF9YTUxfUGFyc2VyQ3JlYXRlTlMKKyAgWE1MX1BhcnNlckNyZWF0ZV9NTSA9IF9YTUxfUGFyc2VyQ3JlYXRlX01NCisgIFhNTF9QYXJzZXJGcmVlID0gX1hNTF9QYXJzZXJGcmVlCisgIFhNTF9TZXRBdHRsaXN0RGVjbEhhbmRsZXIgPSBfWE1MX1NldEF0dGxpc3REZWNsSGFuZGxlcgorICBYTUxfU2V0QmFzZSA9IF9YTUxfU2V0QmFzZQorICBYTUxfU2V0Q2RhdGFTZWN0aW9uSGFuZGxlciA9IF9YTUxfU2V0Q2RhdGFTZWN0aW9uSGFuZGxlcgorICBYTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXIgPSBfWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyCisgIFhNTF9TZXRDb21tZW50SGFuZGxlciA9IF9YTUxfU2V0Q29tbWVudEhhbmRsZXIKKyAgWE1MX1NldERlZmF1bHRIYW5kbGVyID0gX1hNTF9TZXREZWZhdWx0SGFuZGxlcgorICBYTUxfU2V0RGVmYXVsdEhhbmRsZXJFeHBhbmQgPSBfWE1MX1NldERlZmF1bHRIYW5kbGVyRXhwYW5kCisgIFhNTF9TZXREb2N0eXBlRGVjbEhhbmRsZXIgPSBfWE1MX1NldERvY3R5cGVEZWNsSGFuZGxlcgorICBYTUxfU2V0RWxlbWVudERlY2xIYW5kbGVyID0gX1hNTF9TZXRFbGVtZW50RGVjbEhhbmRsZXIKKyAgWE1MX1NldEVsZW1lbnRIYW5kbGVyID0gX1hNTF9TZXRFbGVtZW50SGFuZGxlcgorICBYTUxfU2V0RW5jb2RpbmcgPSBfWE1MX1NldEVuY29kaW5nCisgIFhNTF9TZXRFbmRDZGF0YVNlY3Rpb25IYW5kbGVyID0gX1hNTF9TZXRFbmRDZGF0YVNlY3Rpb25IYW5kbGVyCisgIFhNTF9TZXRFbmREb2N0eXBlRGVjbEhhbmRsZXIgPSBfWE1MX1NldEVuZERvY3R5cGVEZWNsSGFuZGxlcgorICBYTUxfU2V0RW5kRWxlbWVudEhhbmRsZXIgPSBfWE1MX1NldEVuZEVsZW1lbnRIYW5kbGVyCisgIFhNTF9TZXRFbmROYW1lc3BhY2VEZWNsSGFuZGxlciA9IF9YTUxfU2V0RW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIKKyAgWE1MX1NldEVudGl0eURlY2xIYW5kbGVyID0gX1hNTF9TZXRFbnRpdHlEZWNsSGFuZGxlcgorICBYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyID0gX1hNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIKKyAgWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlckFyZyA9IF9YTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnCisgIFhNTF9TZXROYW1lc3BhY2VEZWNsSGFuZGxlciA9IF9YTUxfU2V0TmFtZXNwYWNlRGVjbEhhbmRsZXIKKyAgWE1MX1NldE5vdFN0YW5kYWxvbmVIYW5kbGVyID0gX1hNTF9TZXROb3RTdGFuZGFsb25lSGFuZGxlcgorICBYTUxfU2V0Tm90YXRpb25EZWNsSGFuZGxlciA9IF9YTUxfU2V0Tm90YXRpb25EZWNsSGFuZGxlcgorICBYTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nID0gX1hNTF9TZXRQYXJhbUVudGl0eVBhcnNpbmcKKyAgWE1MX1NldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIgPSBfWE1MX1NldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIKKyAgWE1MX1NldFJldHVybk5TVHJpcGxldCA9IF9YTUxfU2V0UmV0dXJuTlNUcmlwbGV0CisgIFhNTF9TZXRTdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgPSBfWE1MX1NldFN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlcgorICBYTUxfU2V0U3RhcnREb2N0eXBlRGVjbEhhbmRsZXIgPSBfWE1MX1NldFN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyCisgIFhNTF9TZXRTdGFydEVsZW1lbnRIYW5kbGVyID0gX1hNTF9TZXRTdGFydEVsZW1lbnRIYW5kbGVyCisgIFhNTF9TZXRTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyID0gX1hNTF9TZXRTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyCisgIFhNTF9TZXRVbmtub3duRW5jb2RpbmdIYW5kbGVyID0gX1hNTF9TZXRVbmtub3duRW5jb2RpbmdIYW5kbGVyCisgIFhNTF9TZXRVbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyID0gX1hNTF9TZXRVbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyCisgIFhNTF9TZXRVc2VyRGF0YSA9IF9YTUxfU2V0VXNlckRhdGEKKyAgWE1MX1NldFhtbERlY2xIYW5kbGVyID0gX1hNTF9TZXRYbWxEZWNsSGFuZGxlcgorICBYTUxfVXNlUGFyc2VyQXNIYW5kbGVyQXJnID0gX1hNTF9Vc2VQYXJzZXJBc0hhbmRsZXJBcmcKKyAgWE1MX1BhcnNlclJlc2V0ID0gX1hNTF9QYXJzZXJSZXNldAorICBYTUxfU2V0U2tpcHBlZEVudGl0eUhhbmRsZXIgPSBfWE1MX1NldFNraXBwZWRFbnRpdHlIYW5kbGVyCisgIFhNTF9HZXRGZWF0dXJlTGlzdCA9IF9YTUxfR2V0RmVhdHVyZUxpc3QKKyAgWE1MX1VzZUZvcmVpZ25EVEQgPSBfWE1MX1VzZUZvcmVpZ25EVEQKKyAgWE1MX0ZyZWVDb250ZW50TW9kZWwgPSBfWE1MX0ZyZWVDb250ZW50TW9kZWwKKyAgWE1MX01lbU1hbGxvYyA9IF9YTUxfTWVtTWFsbG9jCisgIFhNTF9NZW1SZWFsbG9jID0gX1hNTF9NZW1SZWFsbG9jCisgIFhNTF9NZW1GcmVlID0gX1hNTF9NZW1GcmVlCisgIFhNTF9TdG9wUGFyc2VyID0gX1hNTF9TdG9wUGFyc2VyCisgIFhNTF9SZXN1bWVQYXJzZXIgPSBfWE1MX1Jlc3VtZVBhcnNlcgorICBYTUxfR2V0UGFyc2luZ1N0YXR1cyA9IF9YTUxfR2V0UGFyc2luZ1N0YXR1cwpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvYmNiNS9tYWtlZmlsZS5tYWsgYi9leHBhdC0yLjAuMS9iY2I1L21ha2VmaWxlLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDg4MTVlCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYmNiNS9tYWtlZmlsZS5tYWsKQEAgLTAsMCArMSwzNyBAQAorYWxsOiBzZXR1cCBleHBhdCBleHBhdHcgZXhwYXRfc3RhdGljIGV4cGF0d19zdGF0aWMgZWxlbWVudHMgb3V0bGluZSB4bWx3ZgorCitzZXR1cDoKKyBzZXR1cAorCitleHBhdDoKKyBtYWtlIC1sIC1mZXhwYXQubWFrCisKK2V4cGF0dzoKKyBtYWtlIC1sIC1mZXhwYXR3Lm1haworCitleHBhdF9zdGF0aWM6CisgbWFrZSAtbCAtZmV4cGF0X3N0YXRpYy5tYWsKKworZXhwYXR3X3N0YXRpYzoKKyBtYWtlIC1sIC1mZXhwYXR3X3N0YXRpYy5tYWsKKworZWxlbWVudHM6CisgbWFrZSAtbCAtZmVsZW1lbnRzLm1haworCitvdXRsaW5lOgorIG1ha2UgLWwgLWZvdXRsaW5lLm1haworCit4bWx3ZjoKKyBtYWtlIC1sIC1meG1sd2YubWFrCisKK2NsZWFuOgorIyB3b3JrcyBvbiBXaW45OC9NRQorIyBkZWx0cmVlIC95IHJlbGVhc2Vcb2JqCisjIHdvcmtzIG9uIFdpbk5ULzIwMDAKKyBkZWwgL3MvZi9xIHJlbGVhc2Vcb2JqCisKK2Rpc3RjbGVhbjoKKyMgd29ya3Mgb24gV2luOTgvTUUKKyMgZGVsdHJlZSAveSByZWxlYXNlXCouKgorIyB3b3JrcyBvbiBXaW5OVC8yMDAwCisgZGVsIC9zL2YvcSByZWxlYXNlXCoKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2JjYjUvb3V0bGluZS5icGYgYi9leHBhdC0yLjAuMS9iY2I1L291dGxpbmUuYnBmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZGNlODMKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9iY2I1L291dGxpbmUuYnBmCkBAIC0wLDAgKzEsNCBAQAorVVNFVU5JVCgiLi5cZXhhbXBsZXNcb3V0bGluZS5jIik7CitVU0VMSUIoIlJlbGVhc2VcbGliZXhwYXRfbXRkLmxpYiIpOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK21haW4KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2JjYjUvb3V0bGluZS5icHIgYi9leHBhdC0yLjAuMS9iY2I1L291dGxpbmUuYnByCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYWU1Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9iY2I1L291dGxpbmUuYnByCkBAIC0wLDAgKzEsMTMyIEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCcgPz4KKzwhLS0gQysrQnVpbGRlciBYTUwgUHJvamVjdCAtLT4KKzxQUk9KRUNUPgorICA8TUFDUk9TPgorICAgIDxWRVJTSU9OIHZhbHVlPSJCQ0IuMDUuMDMiLz4KKyAgICA8UFJPSkVDVCB2YWx1ZT0iUmVsZWFzZVxvdXRsaW5lLmV4ZSIvPgorICAgIDxPQkpGSUxFUyB2YWx1ZT0iUmVsZWFzZVxvYmpcZXhhbXBsZXNcb3V0bGluZS5vYmoiLz4KKyAgICA8UkVTRklMRVMgdmFsdWU9IiIvPgorICAgIDxJRExGSUxFUyB2YWx1ZT0iIi8+CisgICAgPElETEdFTkZJTEVTIHZhbHVlPSIiLz4KKyAgICA8REVGRklMRSB2YWx1ZT0iIi8+CisgICAgPFJFU0RFUEVOIHZhbHVlPSIkKFJFU0ZJTEVTKSIvPgorICAgIDxMSUJGSUxFUyB2YWx1ZT0iUmVsZWFzZVxsaWJleHBhdF9tdGQubGliIi8+CisgICAgPExJQlJBUklFUyB2YWx1ZT0iIi8+CisgICAgPFNQQVJFTElCUyB2YWx1ZT0iIi8+CisgICAgPFBBQ0tBR0VTIHZhbHVlPSJWQ0w1MC5icGkgVkNMWDUwLmJwaSBiY2JzbXA1MC5icGkgUVJQVDUwLmJwaSBWQ0xEQjUwLmJwaSBWQ0xCREU1MC5icGkgCisgICAgICBpYnNtcDUwLmJwaSBWQ0xEQlg1MC5icGkgVEVFVUk1MC5icGkgVEVFREI1MC5icGkgVEVFNTAuYnBpIFRFRVFSNTAuYnBpIAorICAgICAgVkNMSUI1MC5icGkgYmNiaWU1MC5icGkgVkNMSUU1MC5icGkgSU5FVERCNTAuYnBpIElORVQ1MC5icGkgTk1GQVNUNTAuYnBpIAorICAgICAgZGNsb2N4NTAuYnBpIGJjYjJrYXhzZXJ2ZXI1MC5icGkgZGNsdXNyNTAuYnBpIi8+CisgICAgPFBBVEhDUFAgdmFsdWU9Ii47Li5cZXhhbXBsZXMiLz4KKyAgICA8UEFUSFBBUyB2YWx1ZT0iLjsiLz4KKyAgICA8UEFUSFJDIHZhbHVlPSIuOyIvPgorICAgIDxQQVRIQVNNIHZhbHVlPSIuOyIvPgorICAgIDxERUJVR0xJQlBBVEggdmFsdWU9IiQoQkNCKVxsaWJcZGVidWciLz4KKyAgICA8UkVMRUFTRUxJQlBBVEggdmFsdWU9IiQoQkNCKVxsaWJccmVsZWFzZSIvPgorICAgIDxMSU5LRVIgdmFsdWU9ImlsaW5rMzIiLz4KKyAgICA8VVNFUkRFRklORVMgdmFsdWU9IldJTjMyO05ERUJVRztfQ09OU09MRSIvPgorICAgIDxTWVNERUZJTkVTIHZhbHVlPSJfTk9fVkNMO19BU1NFUlRFO05PX1NUUklDVDtfUlRMRExMIi8+CisgICAgPE1BSU5TT1VSQ0UgdmFsdWU9Im91dGxpbmUuYnBmIi8+CisgICAgPElOQ0xVREVQQVRIIHZhbHVlPSIuLlxleGFtcGxlczskKEJDQilcaW5jbHVkZSIvPgorICAgIDxMSUJQQVRIIHZhbHVlPSIuLlxleGFtcGxlczskKEJDQilcbGliOyQoUkVMRUFTRUxJQlBBVEgpIi8+CisgICAgPFdBUk5JTkdTIHZhbHVlPSItdy1wYXIgLXctODAyNyAtdy04MDI2Ii8+CisgIDwvTUFDUk9TPgorICA8T1BUSU9OUz4KKyAgICA8SURMQ0ZMQUdTIHZhbHVlPSItSSQoQkNCKVxpbmNsdWRlIi8+CisgICAgPENGTEFHMSB2YWx1ZT0iLU8yIC1YLSAtYTggLWIgLWstIC12aSAtcSAtdFdNIC1JLi5cbGliIC1jIi8+CisgICAgPFBGTEFHUyB2YWx1ZT0iLU4yUmVsZWFzZVxvYmpcZXhhbXBsZXMgLU4wUmVsZWFzZVxvYmpcZXhhbXBsZXMgLSRZLSAtJEwtIC0kRC0iLz4KKyAgICA8UkZMQUdTIHZhbHVlPSIvbCAweDQwOSAvZCAmcXVvdDtOREVCVUcmcXVvdDsgL2kkKEJDQilcaW5jbHVkZSIvPgorICAgIDxBRkxBR1MgdmFsdWU9Ii9teCAvdzIgL3puIi8+CisgICAgPExGTEFHUyB2YWx1ZT0iLUlSZWxlYXNlXG9ialxleGFtcGxlcyAtRCZxdW90OyZxdW90OyAtYXAgLVRwZSAteCAtR24gLXEiLz4KKyAgPC9PUFRJT05TPgorICA8TElOS0VSPgorICAgIDxBTExPQkogdmFsdWU9ImMweDMyLm9iaiAkKE9CSkZJTEVTKSIvPgorICAgIDxBTExSRVMgdmFsdWU9IiQoUkVTRklMRVMpIi8+CisgICAgPEFMTExJQiB2YWx1ZT0iJChMSUJGSUxFUykgJChMSUJSQVJJRVMpIGltcG9ydDMyLmxpYiBjdzMybXRpLmxpYiIvPgorICA8L0xJTktFUj4KKyAgPElERU9QVElPTlM+CitbVmVyc2lvbiBJbmZvXQorSW5jbHVkZVZlckluZm89MAorQXV0b0luY0J1aWxkPTAKK01ham9yVmVyPTEKK01pbm9yVmVyPTAKK1JlbGVhc2U9MAorQnVpbGQ9MAorRGVidWc9MAorUHJlUmVsZWFzZT0wCitTcGVjaWFsPTAKK1ByaXZhdGU9MAorRExMPTAKK0xvY2FsZT0xMDMzCitDb2RlUGFnZT0xMjUyCisKK1tWZXJzaW9uIEluZm8gS2V5c10KK0NvbXBhbnlOYW1lPQorRmlsZURlc2NyaXB0aW9uPQorRmlsZVZlcnNpb249MS4wLjAuMAorSW50ZXJuYWxOYW1lPQorTGVnYWxDb3B5cmlnaHQ9CitMZWdhbFRyYWRlbWFya3M9CitPcmlnaW5hbEZpbGVuYW1lPQorUHJvZHVjdE5hbWU9CitQcm9kdWN0VmVyc2lvbj0xLjAuMC4wCitDb21tZW50cz0KKworW0hpc3RvcnlMaXN0c1xobEluY2x1ZGVQYXRoXQorQ291bnQ9MworSXRlbTA9Li5cZXhhbXBsZXM7JChCQ0IpXGluY2x1ZGUKK0l0ZW0xPSQoQkNCKVxpbmNsdWRlCitJdGVtMj0kKEJDQilcaW5jbHVkZTskKEJDQilcaW5jbHVkZVxtZmM7JChCQ0IpXGluY2x1ZGVcYXRsOworCitbSGlzdG9yeUxpc3RzXGhsTGlicmFyeVBhdGhdCitDb3VudD00CitJdGVtMD0uLlxleGFtcGxlczskKEJDQilcbGliOyQoUkVMRUFTRUxJQlBBVEgpCitJdGVtMT0uLlxleGFtcGxlczskKEJDQilcbGliOy4uXGV4YW1wbGVzXCQoUkVMRUFTRUxJQlBBVEgpCitJdGVtMj0kKEJDQilcbGliOyQoUkVMRUFTRUxJQlBBVEgpCitJdGVtMz0kKEJDQilcbGliOyQoUkVMRUFTRUxJQlBBVEgpOzskKEJDQilcbGliXHBzZGs7CisKK1tIaXN0b3J5TGlzdHNcaGxEZWJ1Z1NvdXJjZVBhdGhdCitDb3VudD0xCitJdGVtMD0kKEJDQilcc291cmNlXHZjbAorCitbSGlzdG9yeUxpc3RzXGhsQ29uZGl0aW9uYWxzXQorQ291bnQ9NgorSXRlbTA9V0lOMzI7TkRFQlVHO19DT05TT0xFCitJdGVtMT1XSU4zMjtOREVCVUc7X0NPTlNPTEU7WE1MX1NUQVRJQworSXRlbTI9V0lOMzI7TkRFQlVHO19DT05TT0xFO19ERUJVRztYTUxfU1RBVElDCitJdGVtMz1XSU4zMjtOREVCVUc7X0NPTlNPTEU7X0RFQlVHO1hNTF9VTklDT0RFX1dDSEFSX1Q7X1VOSUNPREU7WE1MX1NUQVRJQworSXRlbTQ9V0lOMzI7TkRFQlVHO19DT05TT0xFO19ERUJVRztYTUxfVU5JQ09ERV9XQ0hBUl9UO19VTklDT0RFCitJdGVtNT1XSU4zMjtOREVCVUc7X0NPTlNPTEU7X0RFQlVHCisKK1tIaXN0b3J5TGlzdHNcaGxJbnRPdXRwdXREaXJdCitDb3VudD00CitJdGVtMD1SZWxlYXNlXG9ialxleGFtcGxlcworSXRlbTE9UmVsZWFzZVxvYmpcb3V0bGluZQorSXRlbTI9Li5cZXhhbXBsZXNcUmVsZWFzZQorSXRlbTM9UmVsZWFzZQorCitbSGlzdG9yeUxpc3RzXGhsRmluYWxPdXRwdXREaXJdCitDb3VudD0xCitJdGVtMD1SZWxlYXNlXAorCitbRGVidWdnaW5nXQorRGVidWdTb3VyY2VEaXJzPQorCitbUGFyYW1ldGVyc10KK1J1blBhcmFtcz0KK0hvc3RBcHBsaWNhdGlvbj0KK1JlbW90ZUhvc3Q9CitSZW1vdGVQYXRoPQorUmVtb3RlRGVidWc9MAorCitbQ29tcGlsZXJdCitTaG93SW5mb01zZ3M9MAorTGlua0RlYnVnVmNsPTAKK0xpbmtDR0xJQj0wCisKK1tMYW5ndWFnZV0KK0FjdGl2ZUxhbmc9CitQcm9qZWN0TGFuZz0KK1Jvb3REaXI9CisgIDwvSURFT1BUSU9OUz4KKzwvUFJPSkVDVD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9iY2I1L291dGxpbmUubWFrIGIvZXhwYXQtMi4wLjEvYmNiNS9vdXRsaW5lLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTBiNTQxCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYmNiNS9vdXRsaW5lLm1hawpAQCAtMCwwICsxLDE4NiBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyFpZiAhJGQoQkNCKQorQkNCID0gJChNQUtFRElSKVwuLgorIWVuZGlmCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIElERSBTRUNUSU9OCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgdGhlIHByb2plY3QgbWFrZWZpbGUgaXMgbWFuYWdlZCBieSB0aGUgQkNCIElERS4KKyMgSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBJREUgdG8gY2hhbmdlIGFueSBvZiB0aGUgdmFsdWVzIGluIHRoaXMKKyMgc2VjdGlvbi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1ZFUlNJT04gPSBCQ0IuMDUuMDMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQUk9KRUNUID0gUmVsZWFzZVxvdXRsaW5lLmV4ZQorT0JKRklMRVMgPSBSZWxlYXNlXG9ialxleGFtcGxlc1xvdXRsaW5lLm9iagorUkVTRklMRVMgPSAKK01BSU5TT1VSQ0UgPSBvdXRsaW5lLmJwZgorUkVTREVQRU4gPSAkKFJFU0ZJTEVTKQorTElCRklMRVMgPSBSZWxlYXNlXGxpYmV4cGF0X210ZC5saWIKK0lETEZJTEVTID0gCitJRExHRU5GSUxFUyA9IAorTElCUkFSSUVTID0gCitQQUNLQUdFUyA9IFZDTDUwLmJwaSBWQ0xYNTAuYnBpIGJjYnNtcDUwLmJwaSBRUlBUNTAuYnBpIFZDTERCNTAuYnBpIFZDTEJERTUwLmJwaSBcCisgICAgaWJzbXA1MC5icGkgVkNMREJYNTAuYnBpIFRFRVVJNTAuYnBpIFRFRURCNTAuYnBpIFRFRTUwLmJwaSBURUVRUjUwLmJwaSBcCisgICAgVkNMSUI1MC5icGkgYmNiaWU1MC5icGkgVkNMSUU1MC5icGkgSU5FVERCNTAuYnBpIElORVQ1MC5icGkgTk1GQVNUNTAuYnBpIFwKKyAgICBkY2xvY3g1MC5icGkgYmNiMmtheHNlcnZlcjUwLmJwaSBkY2x1c3I1MC5icGkKK1NQQVJFTElCUyA9IAorREVGRklMRSA9IAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BBVEhDUFAgPSAuOy4uXGV4YW1wbGVzCitQQVRIQVNNID0gLjsKK1BBVEhQQVMgPSAuOworUEFUSFJDID0gLjsKK0RFQlVHTElCUEFUSCA9ICQoQkNCKVxsaWJcZGVidWcKK1JFTEVBU0VMSUJQQVRIID0gJChCQ0IpXGxpYlxyZWxlYXNlCitVU0VSREVGSU5FUyA9IFdJTjMyO05ERUJVRztfQ09OU09MRQorU1lTREVGSU5FUyA9IF9OT19WQ0w7X0FTU0VSVEU7Tk9fU1RSSUNUO19SVExETEwKK0lOQ0xVREVQQVRIID0gLi5cZXhhbXBsZXM7JChCQ0IpXGluY2x1ZGUKK0xJQlBBVEggPSAuLlxleGFtcGxlczskKEJDQilcbGliOyQoUkVMRUFTRUxJQlBBVEgpCitXQVJOSU5HUz0gLXctcGFyIC13LTgwMjcgLXctODAyNgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NGTEFHMSA9IC1PMiAtWC0gLWE4IC1iIC1rLSAtdmkgLXEgLXRXTSAtSS4uXGxpYiAtYworSURMQ0ZMQUdTID0gLUkkKEJDQilcaW5jbHVkZQorUEZMQUdTID0gLU4yUmVsZWFzZVxvYmpcZXhhbXBsZXMgLU4wUmVsZWFzZVxvYmpcZXhhbXBsZXMgLSRZLSAtJEwtIC0kRC0KK1JGTEFHUyA9IC9sIDB4NDA5IC9kICJOREVCVUciIC9pJChCQ0IpXGluY2x1ZGUKK0FGTEFHUyA9IC9teCAvdzIgL3puCitMRkxBR1MgPSAtSVJlbGVhc2Vcb2JqXGV4YW1wbGVzIC1EIiIgLWFwIC1UcGUgLXggLUduIC1xCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUxMT0JKID0gYzB4MzIub2JqICQoT0JKRklMRVMpCitBTExSRVMgPSAkKFJFU0ZJTEVTKQorQUxMTElCID0gJChMSUJGSUxFUykgJChMSUJSQVJJRVMpIGltcG9ydDMyLmxpYiBjdzMybXRpLmxpYgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyFpZmRlZiBJREVPUFRJT05TCisKK1tWZXJzaW9uIEluZm9dCitJbmNsdWRlVmVySW5mbz0wCitBdXRvSW5jQnVpbGQ9MAorTWFqb3JWZXI9MQorTWlub3JWZXI9MAorUmVsZWFzZT0wCitCdWlsZD0wCitEZWJ1Zz0wCitQcmVSZWxlYXNlPTAKK1NwZWNpYWw9MAorUHJpdmF0ZT0wCitETEw9MAorCitbVmVyc2lvbiBJbmZvIEtleXNdCitDb21wYW55TmFtZT0KK0ZpbGVEZXNjcmlwdGlvbj0KK0ZpbGVWZXJzaW9uPTEuMC4wLjAKK0ludGVybmFsTmFtZT0KK0xlZ2FsQ29weXJpZ2h0PQorTGVnYWxUcmFkZW1hcmtzPQorT3JpZ2luYWxGaWxlbmFtZT0KK1Byb2R1Y3ROYW1lPQorUHJvZHVjdFZlcnNpb249MS4wLjAuMAorQ29tbWVudHM9CisKK1tEZWJ1Z2dpbmddCitEZWJ1Z1NvdXJjZURpcnM9JChCQ0IpXHNvdXJjZVx2Y2wKKworIWVuZGlmCisKKworCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTUFLRSBTRUNUSU9OCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGlzIHNlY3Rpb24gb2YgdGhlIHByb2plY3QgZmlsZSBpcyBub3QgdXNlZCBieSB0aGUgQkNCIElERS4gIEl0IGlzIGZvcgorIyB0aGUgYmVuZWZpdCBvZiBidWlsZGluZyBmcm9tIHRoZSBjb21tYW5kLWxpbmUgdXNpbmcgdGhlIE1BS0UgdXRpbGl0eS4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy5hdXRvZGVwZW5kCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIWlmICIkKFVTRVJERUZJTkVTKSIgIT0gIiIKK0FVU0VSREVGSU5FUyA9IC1kJChVU0VSREVGSU5FUzo7PSAtZCkKKyFlbHNlCitBVVNFUkRFRklORVMgPQorIWVuZGlmCisKKyFpZiAhJGQoQkNDMzIpCitCQ0MzMiA9IGJjYzMyCishZW5kaWYKKworIWlmICEkZChDUFAzMikKK0NQUDMyID0gY3BwMzIKKyFlbmRpZgorCishaWYgISRkKERDQzMyKQorRENDMzIgPSBkY2MzMgorIWVuZGlmCisKKyFpZiAhJGQoVEFTTTMyKQorVEFTTTMyID0gdGFzbTMyCishZW5kaWYKKworIWlmICEkZChMSU5LRVIpCitMSU5LRVIgPSBpbGluazMyCishZW5kaWYKKworIWlmICEkZChCUkNDMzIpCitCUkNDMzIgPSBicmNjMzIKKyFlbmRpZgorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCishaWYgJGQoUEFUSENQUCkKKy5QQVRILkNQUCA9ICQoUEFUSENQUCkKKy5QQVRILkMgICA9ICQoUEFUSENQUCkKKyFlbmRpZgorCishaWYgJGQoUEFUSFBBUykKKy5QQVRILlBBUyA9ICQoUEFUSFBBUykKKyFlbmRpZgorCishaWYgJGQoUEFUSEFTTSkKKy5QQVRILkFTTSA9ICQoUEFUSEFTTSkKKyFlbmRpZgorCishaWYgJGQoUEFUSFJDKQorLlBBVEguUkMgID0gJChQQVRIUkMpCishZW5kaWYKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskKFBST0pFQ1QpOiAkKElETEdFTkZJTEVTKSAkKE9CSkZJTEVTKSAkKFJFU0RFUEVOKSAkKERFRkZJTEUpCisgICAgJChCQ0IpXEJJTlwkKExJTktFUikgQCYmIQorICAgICQoTEZMQUdTKSAtTCQoTElCUEFUSCkgKworICAgICQoQUxMT0JKKSwgKworICAgICQoUFJPSkVDVCksLCArCisgICAgJChBTExMSUIpLCArCisgICAgJChERUZGSUxFKSwgKworICAgICQoQUxMUkVTKQorIQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy5wYXMuaHBwOgorICAgICQoQkNCKVxCSU5cJChEQ0MzMikgJChQRkxBR1MpIC1VJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1PJChJTkNMVURFUEFUSCkgLS1CQ0IgeyQ8IH0KKworLnBhcy5vYmo6CisgICAgJChCQ0IpXEJJTlwkKERDQzMyKSAkKFBGTEFHUykgLVUkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLU8kKElOQ0xVREVQQVRIKSAtLUJDQiB7JDwgfQorCisuY3BwLm9iajoKKyAgICAkKEJDQilcQklOXCQoQkNDMzIpICQoQ0ZMQUcxKSAkKFdBUk5JTkdTKSAtSSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtbiQoQEQpIHskPCB9CisKKy5jLm9iajoKKyAgICAkKEJDQilcQklOXCQoQkNDMzIpICQoQ0ZMQUcxKSAkKFdBUk5JTkdTKSAtSSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtbiQoQEQpIHskPCB9CisKKy5jLmk6CisgICAgJChCQ0IpXEJJTlwkKENQUDMyKSAkKENGTEFHMSkgJChXQVJOSU5HUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLW4uIHskPCB9CisKKy5jcHAuaToKKyAgICAkKEJDQilcQklOXCQoQ1BQMzIpICQoQ0ZMQUcxKSAkKFdBUk5JTkdTKSAtSSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtbi4geyQ8IH0KKworLmFzbS5vYmo6CisgICAgJChCQ0IpXEJJTlwkKFRBU00zMikgJChBRkxBR1MpIC1pJChJTkNMVURFUEFUSDo7PSAtaSkgJChBVVNFUkRFRklORVMpIC1kJChTWVNERUZJTkVTOjs9IC1kKSAkPCwgJEAKKworLnJjLnJlczoKKyAgICAkKEJDQilcQklOXCQoQlJDQzMyKSAkKFJGTEFHUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLWZvJEAgJDwKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworCisKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2JjYjUvc2V0dXAuYmF0IGIvZXhwYXQtMi4wLjEvYmNiNS9zZXR1cC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY0YjU3MwotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2JjYjUvc2V0dXAuYmF0CkBAIC0wLDAgKzEsOSBAQAorUkVNIENvbW1hbmRJbnRlcnByZXRlcjogJChDT01TUEVDKQoraWYgbm90IGV4aXN0IC5ccmVsZWFzZVxudWwgbWtkaXIgcmVsZWFzZQoraWYgbm90IGV4aXN0IC5ccmVsZWFzZVxvYmpcbnVsIG1rZGlyIHJlbGVhc2Vcb2JqCitpZiBub3QgZXhpc3QgLlxyZWxlYXNlXG9ialxsaWJleHBhdFxudWwgbWtkaXIgcmVsZWFzZVxvYmpcbGliZXhwYXQKK2lmIG5vdCBleGlzdCAuXHJlbGVhc2Vcb2JqXGxpYmV4cGF0d1xudWwgbWtkaXIgcmVsZWFzZVxvYmpcbGliZXhwYXR3CitpZiBub3QgZXhpc3QgLlxyZWxlYXNlXG9ialxsaWJleHBhdF9zdGF0aWNcbnVsIG1rZGlyIHJlbGVhc2Vcb2JqXGxpYmV4cGF0X3N0YXRpYworaWYgbm90IGV4aXN0IC5ccmVsZWFzZVxvYmpcbGliZXhwYXR3X3N0YXRpY1xudWwgbWtkaXIgcmVsZWFzZVxvYmpcbGliZXhwYXR3X3N0YXRpYworaWYgbm90IGV4aXN0IC5ccmVsZWFzZVxvYmpcZXhhbXBsZXNcbnVsIG1rZGlyIHJlbGVhc2Vcb2JqXGV4YW1wbGVzCitpZiBub3QgZXhpc3QgLlxyZWxlYXNlXG9ialx4bWx3ZlxudWwgbWtkaXIgcmVsZWFzZVxvYmpceG1sd2YKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2JjYjUveG1sd2YuYnBmIGIvZXhwYXQtMi4wLjEvYmNiNS94bWx3Zi5icGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2MjA4ZQotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2JjYjUveG1sd2YuYnBmCkBAIC0wLDAgKzEsNyBAQAorVVNFVU5JVCgiLi5ceG1sd2ZcY29kZXBhZ2UuYyIpOworVVNFVU5JVCgiLi5ceG1sd2Zcd2luMzJmaWxlbWFwLmMiKTsKK1VTRVVOSVQoIi4uXHhtbHdmXHhtbGZpbGUuYyIpOworVVNFVU5JVCgiLi5ceG1sd2ZceG1sd2YuYyIpOworVVNFTElCKCJSZWxlYXNlXGxpYmV4cGF0X210ZC5saWIiKTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittYWluCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9iY2I1L3htbHdmLmJwciBiL2V4cGF0LTIuMC4xL2JjYjUveG1sd2YuYnByCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzM2ExNTMKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9iY2I1L3htbHdmLmJwcgpAQCAtMCwwICsxLDEzNiBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnID8+Cis8IS0tIEMrK0J1aWxkZXIgWE1MIFByb2plY3QgLS0+Cis8UFJPSkVDVD4KKyAgPE1BQ1JPUz4KKyAgICA8VkVSU0lPTiB2YWx1ZT0iQkNCLjA1LjAzIi8+CisgICAgPFBST0pFQ1QgdmFsdWU9IlJlbGVhc2VceG1sd2YuZXhlIi8+CisgICAgPE9CSkZJTEVTIHZhbHVlPSJSZWxlYXNlXG9ialx4bWx3Zlxjb2RlcGFnZS5vYmogUmVsZWFzZVxvYmpceG1sd2Zcd2luMzJmaWxlbWFwLm9iaiAKKyAgICAgIFJlbGVhc2Vcb2JqXHhtbHdmXHhtbGZpbGUub2JqIFJlbGVhc2Vcb2JqXHhtbHdmXHhtbHdmLm9iaiIvPgorICAgIDxSRVNGSUxFUyB2YWx1ZT0iIi8+CisgICAgPElETEZJTEVTIHZhbHVlPSIiLz4KKyAgICA8SURMR0VORklMRVMgdmFsdWU9IiIvPgorICAgIDxERUZGSUxFIHZhbHVlPSIiLz4KKyAgICA8UkVTREVQRU4gdmFsdWU9IiQoUkVTRklMRVMpIi8+CisgICAgPExJQkZJTEVTIHZhbHVlPSJSZWxlYXNlXGxpYmV4cGF0X210ZC5saWIiLz4KKyAgICA8TElCUkFSSUVTIHZhbHVlPSIiLz4KKyAgICA8U1BBUkVMSUJTIHZhbHVlPSIiLz4KKyAgICA8UEFDS0FHRVMgdmFsdWU9IlZDTDUwLmJwaSBWQ0xYNTAuYnBpIGJjYnNtcDUwLmJwaSBRUlBUNTAuYnBpIFZDTERCNTAuYnBpIFZDTEJERTUwLmJwaSAKKyAgICAgIGlic21wNTAuYnBpIFZDTERCWDUwLmJwaSBURUVVSTUwLmJwaSBURUVEQjUwLmJwaSBURUU1MC5icGkgVEVFUVI1MC5icGkgCisgICAgICBWQ0xJQjUwLmJwaSBiY2JpZTUwLmJwaSBWQ0xJRTUwLmJwaSBJTkVUREI1MC5icGkgSU5FVDUwLmJwaSBOTUZBU1Q1MC5icGkgCisgICAgICBkY2xvY3g1MC5icGkgYmNiMmtheHNlcnZlcjUwLmJwaSBkY2x1c3I1MC5icGkiLz4KKyAgICA8UEFUSENQUCB2YWx1ZT0iLjsuLlx4bWx3ZiIvPgorICAgIDxQQVRIUEFTIHZhbHVlPSIuOyIvPgorICAgIDxQQVRIUkMgdmFsdWU9Ii47Ii8+CisgICAgPFBBVEhBU00gdmFsdWU9Ii47Ii8+CisgICAgPERFQlVHTElCUEFUSCB2YWx1ZT0iJChCQ0IpXGxpYlxkZWJ1ZyIvPgorICAgIDxSRUxFQVNFTElCUEFUSCB2YWx1ZT0iJChCQ0IpXGxpYlxyZWxlYXNlIi8+CisgICAgPExJTktFUiB2YWx1ZT0iaWxpbmszMiIvPgorICAgIDxVU0VSREVGSU5FUyB2YWx1ZT0iTkRFQlVHO1dJTjMyO19DT05TT0xFO0NPTVBJTEVEX0ZST01fRFNQIi8+CisgICAgPFNZU0RFRklORVMgdmFsdWU9Il9OT19WQ0w7X0FTU0VSVEU7Tk9fU1RSSUNUO19SVExETEwiLz4KKyAgICA8TUFJTlNPVVJDRSB2YWx1ZT0ieG1sd2YuYnBmIi8+CisgICAgPElOQ0xVREVQQVRIIHZhbHVlPSIuLlx4bWx3ZjskKEJDQilcaW5jbHVkZSIvPgorICAgIDxMSUJQQVRIIHZhbHVlPSIuLlx4bWx3ZjskKEJDQilcbGliOyQoUkVMRUFTRUxJQlBBVEgpIi8+CisgICAgPFdBUk5JTkdTIHZhbHVlPSItdy04MDY1IC13LXBhciAtdy04MDI3IC13LTgwMjYiLz4KKyAgPC9NQUNST1M+CisgIDxPUFRJT05TPgorICAgIDxJRExDRkxBR1MgdmFsdWU9Ii1JJChCQ0IpXGluY2x1ZGUiLz4KKyAgICA8Q0ZMQUcxIHZhbHVlPSItTzIgLVgtIC1hOCAtYiAtay0gLXZpIC1xIC10V00gLUkuLlxsaWIgLWMiLz4KKyAgICA8UEZMQUdTIHZhbHVlPSItTjJSZWxlYXNlXG9ialx4bWx3ZiAtTjBSZWxlYXNlXG9ialx4bWx3ZiAtJFktIC0kTC0gLSRELSIvPgorICAgIDxSRkxBR1MgdmFsdWU9Ii9sIDB4NDA5IC9kICZxdW90O05ERUJVRyZxdW90OyAvaSQoQkNCKVxpbmNsdWRlIi8+CisgICAgPEFGTEFHUyB2YWx1ZT0iL214IC93MiAvem4iLz4KKyAgICA8TEZMQUdTIHZhbHVlPSItSVJlbGVhc2Vcb2JqXHhtbHdmIC1EJnF1b3Q7JnF1b3Q7IC1hcCAtVHBlIC14IC1HbiAtcSIvPgorICA8L09QVElPTlM+CisgIDxMSU5LRVI+CisgICAgPEFMTE9CSiB2YWx1ZT0iYzB4MzIub2JqICQoT0JKRklMRVMpIi8+CisgICAgPEFMTFJFUyB2YWx1ZT0iJChSRVNGSUxFUykiLz4KKyAgICA8QUxMTElCIHZhbHVlPSIkKExJQkZJTEVTKSAkKExJQlJBUklFUykgaW1wb3J0MzIubGliIGN3MzJtdGkubGliIi8+CisgIDwvTElOS0VSPgorICA8SURFT1BUSU9OUz4KK1tWZXJzaW9uIEluZm9dCitJbmNsdWRlVmVySW5mbz0wCitBdXRvSW5jQnVpbGQ9MAorTWFqb3JWZXI9MQorTWlub3JWZXI9MAorUmVsZWFzZT0wCitCdWlsZD0wCitEZWJ1Zz0wCitQcmVSZWxlYXNlPTAKK1NwZWNpYWw9MAorUHJpdmF0ZT0wCitETEw9MAorTG9jYWxlPTEwMzMKK0NvZGVQYWdlPTEyNTIKKworW1ZlcnNpb24gSW5mbyBLZXlzXQorQ29tcGFueU5hbWU9CitGaWxlRGVzY3JpcHRpb249CitGaWxlVmVyc2lvbj0xLjAuMC4wCitJbnRlcm5hbE5hbWU9CitMZWdhbENvcHlyaWdodD0KK0xlZ2FsVHJhZGVtYXJrcz0KK09yaWdpbmFsRmlsZW5hbWU9CitQcm9kdWN0TmFtZT0KK1Byb2R1Y3RWZXJzaW9uPTEuMC4wLjAKK0NvbW1lbnRzPQorCitbSGlzdG9yeUxpc3RzXGhsSW5jbHVkZVBhdGhdCitDb3VudD00CitJdGVtMD0uLlx4bWx3ZjskKEJDQilcaW5jbHVkZQorSXRlbTE9JChCQ0IpXGluY2x1ZGUKK0l0ZW0yPSQoQkNCKVxpbmNsdWRlOyQoQkNCKVxpbmNsdWRlXG1mYzskKEJDQilcaW5jbHVkZVxhdGwKK0l0ZW0zPSQoQkNCKVxpbmNsdWRlOyQoQkNCKVxpbmNsdWRlXG1mYzskKEJDQilcaW5jbHVkZVxhdGw7CisKK1tIaXN0b3J5TGlzdHNcaGxMaWJyYXJ5UGF0aF0KK0NvdW50PTUKK0l0ZW0wPS4uXHhtbHdmOyQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCkKK0l0ZW0xPS4uXHhtbHdmOyQoQkNCKVxsaWI7Li5ceG1sd2ZcJChSRUxFQVNFTElCUEFUSCkKK0l0ZW0yPSQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCkKK0l0ZW0zPSQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCk7JChCQ0IpXGxpYlxwc2RrCitJdGVtND0kKEJDQilcbGliOyQoUkVMRUFTRUxJQlBBVEgpOzskKEJDQilcbGliXHBzZGs7CisKK1tIaXN0b3J5TGlzdHNcaGxEZWJ1Z1NvdXJjZVBhdGhdCitDb3VudD0xCitJdGVtMD0kKEJDQilcc291cmNlXHZjbAorCitbSGlzdG9yeUxpc3RzXGhsQ29uZGl0aW9uYWxzXQorQ291bnQ9NgorSXRlbTA9TkRFQlVHO1dJTjMyO19DT05TT0xFO0NPTVBJTEVEX0ZST01fRFNQCitJdGVtMT1OREVCVUc7V0lOMzI7X0NPTlNPTEU7Q09NUElMRURfRlJPTV9EU1A7X0RFQlVHO1hNTF9VTklDT0RFX1dDSEFSX1Q7X1VOSUNPREUKK0l0ZW0yPU5ERUJVRztXSU4zMjtfQ09OU09MRTtDT01QSUxFRF9GUk9NX0RTUDtfREVCVUc7WE1MX1VOSUNPREVfV0NIQVJfVAorSXRlbTM9TkRFQlVHO1dJTjMyO19DT05TT0xFO0NPTVBJTEVEX0ZST01fRFNQO19ERUJVRworSXRlbTQ9TkRFQlVHO1dJTjMyO19DT05TT0xFO0NPTVBJTEVEX0ZST01fRFNQO19ERUJVRztfVU5JQ09ERTtYTUxfVU5JQ09ERV9XQ0hBUl9UCitJdGVtNT1OREVCVUc7V0lOMzI7X0NPTlNPTEU7Q09NUElMRURfRlJPTV9EU1A7X0RFQlVHO19VTklDT0RFCisKK1tIaXN0b3J5TGlzdHNcaGxJbnRPdXRwdXREaXJdCitDb3VudD0zCitJdGVtMD1SZWxlYXNlXG9ialx4bWx3ZgorSXRlbTE9Li5ceG1sd2ZcUmVsZWFzZQorSXRlbTI9UmVsZWFzZQorCitbSGlzdG9yeUxpc3RzXGhsRmluYWxPdXRwdXREaXJdCitDb3VudD0zCitJdGVtMD1SZWxlYXNlXAorSXRlbTE9UmVsZWFzZQorSXRlbTI9LlxSZWxlYXNlXAorCitbRGVidWdnaW5nXQorRGVidWdTb3VyY2VEaXJzPQorCitbUGFyYW1ldGVyc10KK1J1blBhcmFtcz1zYW1wbGUueG1sCitIb3N0QXBwbGljYXRpb249CitSZW1vdGVIb3N0PQorUmVtb3RlUGF0aD0KK1JlbW90ZURlYnVnPTAKKworW0NvbXBpbGVyXQorU2hvd0luZm9Nc2dzPTAKK0xpbmtEZWJ1Z1ZjbD0wCitMaW5rQ0dMSUI9MAorCitbTGFuZ3VhZ2VdCitBY3RpdmVMYW5nPQorUHJvamVjdExhbmc9CitSb290RGlyPQorICA8L0lERU9QVElPTlM+Cis8L1BST0pFQ1Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvYmNiNS94bWx3Zi5tYWsgYi9leHBhdC0yLjAuMS9iY2I1L3htbHdmLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzQxMjZlCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYmNiNS94bWx3Zi5tYWsKQEAgLTAsMCArMSwxODcgQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCishaWYgISRkKEJDQikKK0JDQiA9ICQoTUFLRURJUilcLi4KKyFlbmRpZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJREUgU0VDVElPTgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIHRoZSBwcm9qZWN0IG1ha2VmaWxlIGlzIG1hbmFnZWQgYnkgdGhlIEJDQiBJREUuCisjIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgSURFIHRvIGNoYW5nZSBhbnkgb2YgdGhlIHZhbHVlcyBpbiB0aGlzCisjIHNlY3Rpb24uCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitWRVJTSU9OID0gQkNCLjA1LjAzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUFJPSkVDVCA9IFJlbGVhc2VceG1sd2YuZXhlCitPQkpGSUxFUyA9IFJlbGVhc2Vcb2JqXHhtbHdmXGNvZGVwYWdlLm9iaiBSZWxlYXNlXG9ialx4bWx3Zlx3aW4zMmZpbGVtYXAub2JqIFwKKyAgICBSZWxlYXNlXG9ialx4bWx3Zlx4bWxmaWxlLm9iaiBSZWxlYXNlXG9ialx4bWx3Zlx4bWx3Zi5vYmoKK1JFU0ZJTEVTID0gCitNQUlOU09VUkNFID0geG1sd2YuYnBmCitSRVNERVBFTiA9ICQoUkVTRklMRVMpCitMSUJGSUxFUyA9IFJlbGVhc2VcbGliZXhwYXRfbXRkLmxpYgorSURMRklMRVMgPSAKK0lETEdFTkZJTEVTID0gCitMSUJSQVJJRVMgPSAKK1BBQ0tBR0VTID0gVkNMNTAuYnBpIFZDTFg1MC5icGkgYmNic21wNTAuYnBpIFFSUFQ1MC5icGkgVkNMREI1MC5icGkgVkNMQkRFNTAuYnBpIFwKKyAgICBpYnNtcDUwLmJwaSBWQ0xEQlg1MC5icGkgVEVFVUk1MC5icGkgVEVFREI1MC5icGkgVEVFNTAuYnBpIFRFRVFSNTAuYnBpIFwKKyAgICBWQ0xJQjUwLmJwaSBiY2JpZTUwLmJwaSBWQ0xJRTUwLmJwaSBJTkVUREI1MC5icGkgSU5FVDUwLmJwaSBOTUZBU1Q1MC5icGkgXAorICAgIGRjbG9jeDUwLmJwaSBiY2Iya2F4c2VydmVyNTAuYnBpIGRjbHVzcjUwLmJwaQorU1BBUkVMSUJTID0gCitERUZGSUxFID0gCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUEFUSENQUCA9IC47Li5ceG1sd2YKK1BBVEhBU00gPSAuOworUEFUSFBBUyA9IC47CitQQVRIUkMgPSAuOworREVCVUdMSUJQQVRIID0gJChCQ0IpXGxpYlxkZWJ1ZworUkVMRUFTRUxJQlBBVEggPSAkKEJDQilcbGliXHJlbGVhc2UKK1VTRVJERUZJTkVTID0gTkRFQlVHO1dJTjMyO19DT05TT0xFO0NPTVBJTEVEX0ZST01fRFNQCitTWVNERUZJTkVTID0gX05PX1ZDTDtfQVNTRVJURTtOT19TVFJJQ1Q7X1JUTERMTAorSU5DTFVERVBBVEggPSAuLlx4bWx3ZjskKEJDQilcaW5jbHVkZQorTElCUEFUSCA9IC4uXHhtbHdmOyQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCkKK1dBUk5JTkdTPSAtdy04MDY1IC13LXBhciAtdy04MDI3IC13LTgwMjYKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDRkxBRzEgPSAtTzIgLVgtIC1hOCAtYiAtay0gLXZpIC1xIC10V00gLUkuLlxsaWIgLWMKK0lETENGTEFHUyA9IC1JJChCQ0IpXGluY2x1ZGUKK1BGTEFHUyA9IC1OMlJlbGVhc2Vcb2JqXHhtbHdmIC1OMFJlbGVhc2Vcb2JqXHhtbHdmIC0kWS0gLSRMLSAtJEQtCitSRkxBR1MgPSAvbCAweDQwOSAvZCAiTkRFQlVHIiAvaSQoQkNCKVxpbmNsdWRlCitBRkxBR1MgPSAvbXggL3cyIC96bgorTEZMQUdTID0gLUlSZWxlYXNlXG9ialx4bWx3ZiAtRCIiIC1hcCAtVHBlIC14IC1HbiAtcQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FMTE9CSiA9IGMweDMyLm9iaiAkKE9CSkZJTEVTKQorQUxMUkVTID0gJChSRVNGSUxFUykKK0FMTExJQiA9ICQoTElCRklMRVMpICQoTElCUkFSSUVTKSBpbXBvcnQzMi5saWIgY3czMm10aS5saWIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCishaWZkZWYgSURFT1BUSU9OUworCitbVmVyc2lvbiBJbmZvXQorSW5jbHVkZVZlckluZm89MAorQXV0b0luY0J1aWxkPTAKK01ham9yVmVyPTEKK01pbm9yVmVyPTAKK1JlbGVhc2U9MAorQnVpbGQ9MAorRGVidWc9MAorUHJlUmVsZWFzZT0wCitTcGVjaWFsPTAKK1ByaXZhdGU9MAorRExMPTAKKworW1ZlcnNpb24gSW5mbyBLZXlzXQorQ29tcGFueU5hbWU9CitGaWxlRGVzY3JpcHRpb249CitGaWxlVmVyc2lvbj0xLjAuMC4wCitJbnRlcm5hbE5hbWU9CitMZWdhbENvcHlyaWdodD0KK0xlZ2FsVHJhZGVtYXJrcz0KK09yaWdpbmFsRmlsZW5hbWU9CitQcm9kdWN0TmFtZT0KK1Byb2R1Y3RWZXJzaW9uPTEuMC4wLjAKK0NvbW1lbnRzPQorCitbRGVidWdnaW5nXQorRGVidWdTb3VyY2VEaXJzPSQoQkNCKVxzb3VyY2VcdmNsCisKKyFlbmRpZgorCisKKworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE1BS0UgU0VDVElPTgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhpcyBzZWN0aW9uIG9mIHRoZSBwcm9qZWN0IGZpbGUgaXMgbm90IHVzZWQgYnkgdGhlIEJDQiBJREUuICBJdCBpcyBmb3IKKyMgdGhlIGJlbmVmaXQgb2YgYnVpbGRpbmcgZnJvbSB0aGUgY29tbWFuZC1saW5lIHVzaW5nIHRoZSBNQUtFIHV0aWxpdHkuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuYXV0b2RlcGVuZAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyFpZiAiJChVU0VSREVGSU5FUykiICE9ICIiCitBVVNFUkRFRklORVMgPSAtZCQoVVNFUkRFRklORVM6Oz0gLWQpCishZWxzZQorQVVTRVJERUZJTkVTID0KKyFlbmRpZgorCishaWYgISRkKEJDQzMyKQorQkNDMzIgPSBiY2MzMgorIWVuZGlmCisKKyFpZiAhJGQoQ1BQMzIpCitDUFAzMiA9IGNwcDMyCishZW5kaWYKKworIWlmICEkZChEQ0MzMikKK0RDQzMyID0gZGNjMzIKKyFlbmRpZgorCishaWYgISRkKFRBU00zMikKK1RBU00zMiA9IHRhc20zMgorIWVuZGlmCisKKyFpZiAhJGQoTElOS0VSKQorTElOS0VSID0gaWxpbmszMgorIWVuZGlmCisKKyFpZiAhJGQoQlJDQzMyKQorQlJDQzMyID0gYnJjYzMyCishZW5kaWYKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIWlmICRkKFBBVEhDUFApCisuUEFUSC5DUFAgPSAkKFBBVEhDUFApCisuUEFUSC5DICAgPSAkKFBBVEhDUFApCishZW5kaWYKKworIWlmICRkKFBBVEhQQVMpCisuUEFUSC5QQVMgPSAkKFBBVEhQQVMpCishZW5kaWYKKworIWlmICRkKFBBVEhBU00pCisuUEFUSC5BU00gPSAkKFBBVEhBU00pCishZW5kaWYKKworIWlmICRkKFBBVEhSQykKKy5QQVRILlJDICA9ICQoUEFUSFJDKQorIWVuZGlmCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJChQUk9KRUNUKTogJChJRExHRU5GSUxFUykgJChPQkpGSUxFUykgJChSRVNERVBFTikgJChERUZGSUxFKQorICAgICQoQkNCKVxCSU5cJChMSU5LRVIpIEAmJiEKKyAgICAkKExGTEFHUykgLUwkKExJQlBBVEgpICsKKyAgICAkKEFMTE9CSiksICsKKyAgICAkKFBST0pFQ1QpLCwgKworICAgICQoQUxMTElCKSwgKworICAgICQoREVGRklMRSksICsKKyAgICAkKEFMTFJFUykKKyEKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisucGFzLmhwcDoKKyAgICAkKEJDQilcQklOXCQoRENDMzIpICQoUEZMQUdTKSAtVSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtTyQoSU5DTFVERVBBVEgpIC0tQkNCIHskPCB9CisKKy5wYXMub2JqOgorICAgICQoQkNCKVxCSU5cJChEQ0MzMikgJChQRkxBR1MpIC1VJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1PJChJTkNMVURFUEFUSCkgLS1CQ0IgeyQ8IH0KKworLmNwcC5vYmo6CisgICAgJChCQ0IpXEJJTlwkKEJDQzMyKSAkKENGTEFHMSkgJChXQVJOSU5HUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLW4kKEBEKSB7JDwgfQorCisuYy5vYmo6CisgICAgJChCQ0IpXEJJTlwkKEJDQzMyKSAkKENGTEFHMSkgJChXQVJOSU5HUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLW4kKEBEKSB7JDwgfQorCisuYy5pOgorICAgICQoQkNCKVxCSU5cJChDUFAzMikgJChDRkxBRzEpICQoV0FSTklOR1MpIC1JJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1uLiB7JDwgfQorCisuY3BwLmk6CisgICAgJChCQ0IpXEJJTlwkKENQUDMyKSAkKENGTEFHMSkgJChXQVJOSU5HUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLW4uIHskPCB9CisKKy5hc20ub2JqOgorICAgICQoQkNCKVxCSU5cJChUQVNNMzIpICQoQUZMQUdTKSAtaSQoSU5DTFVERVBBVEg6Oz0gLWkpICQoQVVTRVJERUZJTkVTKSAtZCQoU1lTREVGSU5FUzo7PSAtZCkgJDwsICRACisKKy5yYy5yZXM6CisgICAgJChCQ0IpXEJJTlwkKEJSQ0MzMikgJChSRkxBR1MpIC1JJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1mbyRAICQ8CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKworCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9jb25maWd1cmUgYi9leHBhdC0yLjAuMS9jb25maWd1cmUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDFiYTdhOQotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2NvbmZpZ3VyZQpAQCAtMCwwICsxLDIyMDE3IEBACisjISAvYmluL3NoCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi41OSBmb3IgZXhwYXQgMi4wLjEuCisjCisjIFJlcG9ydCBidWdzIHRvIDxleHBhdC1idWdzQGxpYmV4cGF0Lm9yZz4uCisjCisjIENvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNNHNoIEluaXRpYWxpemF0aW9uLiAgIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIEJlIEJvdXJuZSBjb21wYXRpYmxlCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKK2VsaWYgdGVzdCAtbiAiJHtCQVNIX1ZFUlNJT04rc2V0fSIgJiYgKHNldCAtbyBwb3NpeCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHNldCAtbyBwb3NpeAorZmkKK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKKworIyBTdXBwb3J0IHVuc2V0IHdoZW4gcG9zc2libGUuCitpZiAoIChNQUlMPTYwOyB1bnNldCBNQUlMKSB8fCBleGl0KSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfdW5zZXQ9dW5zZXQKK2Vsc2UKKyAgYXNfdW5zZXQ9ZmFsc2UKK2ZpCisKKworIyBXb3JrIGFyb3VuZCBidWdzIGluIHByZS0zLjAgVVdJTiBrc2guCiskYXNfdW5zZXQgRU5WIE1BSUwgTUFJTFBBVEgKK1BTMT0nJCAnCitQUzI9Jz4gJworUFM0PScrICcKKworIyBOTFMgbnVpc2FuY2VzLgorZm9yIGFzX3ZhciBpbiBcCisgIExBTkcgTEFOR1VBR0UgTENfQUREUkVTUyBMQ19BTEwgTENfQ09MTEFURSBMQ19DVFlQRSBMQ19JREVOVElGSUNBVElPTiBcCisgIExDX01FQVNVUkVNRU5UIExDX01FU1NBR0VTIExDX01PTkVUQVJZIExDX05BTUUgTENfTlVNRVJJQyBMQ19QQVBFUiBcCisgIExDX1RFTEVQSE9ORSBMQ19USU1FCitkbworICBpZiAoc2V0ICt4OyB0ZXN0IC16ICJgKGV2YWwgJGFzX3Zhcj1DOyBleHBvcnQgJGFzX3ZhcikgMj4mMWAiKTsgdGhlbgorICAgIGV2YWwgJGFzX3Zhcj1DOyBleHBvcnQgJGFzX3ZhcgorICBlbHNlCisgICAgJGFzX3Vuc2V0ICRhc192YXIKKyAgZmkKK2RvbmUKKworIyBSZXF1aXJlZCB0byB1c2UgYmFzZW5hbWUuCitpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc19leHByPWV4cHIKK2Vsc2UKKyAgYXNfZXhwcj1mYWxzZQorZmkKKworaWYgKGJhc2VuYW1lIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC8gMj4mMWAiID0gIlgvIjsgdGhlbgorICBhc19iYXNlbmFtZT1iYXNlbmFtZQorZWxzZQorICBhc19iYXNlbmFtZT1mYWxzZQorZmkKKworCisjIE5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuCithc19tZT1gJGFzX2Jhc2VuYW1lICIkMCIgfHwKKyRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCisJIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJDAiIDogJ1hcKC9cKSQnIFx8IFwKKwkgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8CitlY2hvIFgvIiQwIiB8CisgICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcL1woXC9cL1wpJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcL1woXC9cKS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIHMvLiovLi87IHEnYAorCisKKyMgUEFUSCBuZWVkcyBDUiwgYW5kIExJTkVOTyBuZWVkcyBDUiBhbmQgUEFUSC4KKyMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KK2FzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JworYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCithc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKK2FzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKK2FzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cworCisjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KK2lmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCisgIGVjaG8gIiMhIC9iaW4vc2giID5jb25mJCQuc2gKKyAgZWNobyAgImV4aXQgMCIgICA+PmNvbmYkJC5zaAorICBjaG1vZCAreCBjb25mJCQuc2gKKyAgaWYgKFBBVEg9Ii9ub25leGlzdGVudDsuIjsgY29uZiQkLnNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBQQVRIX1NFUEFSQVRPUj0nOycKKyAgZWxzZQorICAgIFBBVEhfU0VQQVJBVE9SPToKKyAgZmkKKyAgcm0gLWYgY29uZiQkLnNoCitmaQorCisKKyAgYXNfbGluZW5vXzE9JExJTkVOTworICBhc19saW5lbm9fMj0kTElORU5PCisgIGFzX2xpbmVub18zPWAoZXhwciAkYXNfbGluZW5vXzEgKyAxKSAyPi9kZXYvbnVsbGAKKyAgdGVzdCAieCRhc19saW5lbm9fMSIgIT0gIngkYXNfbGluZW5vXzIiICYmCisgIHRlc3QgIngkYXNfbGluZW5vXzMiICA9ICJ4JGFzX2xpbmVub18yIiAgfHwgeworICAjIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBwYXRoIGF0IGFsbAorICAjIHJlbGF0aXZlIG9yIG5vdC4KKyAgY2FzZSAkMCBpbgorICAgICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKKyAgICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCitkb25lCisKKyAgICAgICA7OworICBlc2FjCisgICMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKKyAgIyBpbiB3aGljaCBjYXNlIHdlIGFyZSBub3QgdG8gYmUgZm91bmQgaW4gdGhlIHBhdGguCisgIGlmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KKyAgICBhc19teXNlbGY9JDAKKyAgZmkKKyAgaWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIHBhdGgiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgIGZpCisgIGNhc2UgJENPTkZJR19TSEVMTCBpbgorICAnJykKKyAgICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluIC9iaW4kUEFUSF9TRVBBUkFUT1IvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhc19iYXNlIGluIHNoIGJhc2gga3NoIHNoNTsgZG8KKwkgY2FzZSAkYXNfZGlyIGluCisJIC8qKQorCSAgIGlmICgiJGFzX2Rpci8kYXNfYmFzZSIgLWMgJworICBhc19saW5lbm9fMT0kTElORU5PCisgIGFzX2xpbmVub18yPSRMSU5FTk8KKyAgYXNfbGluZW5vXzM9YChleHByICRhc19saW5lbm9fMSArIDEpIDI+L2Rldi9udWxsYAorICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKKyAgdGVzdCAieCRhc19saW5lbm9fMyIgID0gIngkYXNfbGluZW5vXzIiICcpIDI+L2Rldi9udWxsOyB0aGVuCisJICAgICAkYXNfdW5zZXQgQkFTSF9FTlYgfHwgdGVzdCAiJHtCQVNIX0VOVitzZXR9IiAhPSBzZXQgfHwgeyBCQVNIX0VOVj07IGV4cG9ydCBCQVNIX0VOVjsgfQorCSAgICAgJGFzX3Vuc2V0IEVOViB8fCB0ZXN0ICIke0VOVitzZXR9IiAhPSBzZXQgfHwgeyBFTlY9OyBleHBvcnQgRU5WOyB9CisJICAgICBDT05GSUdfU0hFTEw9JGFzX2Rpci8kYXNfYmFzZQorCSAgICAgZXhwb3J0IENPTkZJR19TSEVMTAorCSAgICAgZXhlYyAiJENPTkZJR19TSEVMTCIgIiQwIiAkezErIiRAIn0KKwkgICBmaTs7CisJIGVzYWMKKyAgICAgICBkb25lCitkb25lCis7OworICBlc2FjCisKKyAgIyBDcmVhdGUgJGFzX21lLmxpbmVubyBhcyBhIGNvcHkgb2YgJGFzX215c2VsZiwgYnV0IHdpdGggJExJTkVOTworICAjIHVuaWZvcm1seSByZXBsYWNlZCBieSB0aGUgbGluZSBudW1iZXIuICBUaGUgZmlyc3QgJ3NlZCcgaW5zZXJ0cyBhCisgICMgbGluZS1udW1iZXIgbGluZSBiZWZvcmUgZWFjaCBsaW5lOyB0aGUgc2Vjb25kICdzZWQnIGRvZXMgdGhlIHJlYWwKKyAgIyB3b3JrLiAgVGhlIHNlY29uZCBzY3JpcHQgdXNlcyAnTicgdG8gcGFpciBlYWNoIGxpbmUtbnVtYmVyIGxpbmUKKyAgIyB3aXRoIHRoZSBudW1iZXJlZCBsaW5lLCBhbmQgYXBwZW5kcyB0cmFpbGluZyAnLScgZHVyaW5nCisgICMgc3Vic3RpdHV0aW9uIHNvIHRoYXQgJExJTkVOTyBpcyBub3QgYSBzcGVjaWFsIGNhc2UgYXQgbGluZSBlbmQuCisgICMgKFJhamEgUiBIYXJpbmF0aCBzdWdnZXN0ZWQgc2VkICc9JywgYW5kIFBhdWwgRWdnZXJ0IHdyb3RlIHRoZQorICAjIHNlY29uZCAnc2VkJyBzY3JpcHQuICBCbGFtZSBMZWUgRS4gTWNNYWhvbiBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCisgIHNlZCAnPScgPCRhc19teXNlbGYgfAorICAgIHNlZCAnCisgICAgICBOCisgICAgICBzLCQsLSwKKyAgICAgIDogbG9vcAorICAgICAgcyxeXChbJyRhc19jcl9kaWdpdHMnXSpcKVwoLipcKVskXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dXCksXDFcMlwxXDMsCisgICAgICB0IGxvb3AKKyAgICAgIHMsLSQsLAorICAgICAgcyxeWyckYXNfY3JfZGlnaXRzJ10qXG4sLAorICAgICcgPiRhc19tZS5saW5lbm8gJiYKKyAgY2htb2QgK3ggJGFzX21lLmxpbmVubyB8fAorICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSAkYXNfbWUubGluZW5vOyByZXJ1biB3aXRoIGEgUE9TSVggc2hlbGwiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisKKyAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKKyAgIyAodGhlIGRpcm5hbWUgb2YgJFswXSBpcyBub3QgdGhlIHBsYWNlIHdoZXJlIHdlIG1pZ2h0IGZpbmQgdGhlCisgICMgb3JpZ2luYWwgYW5kIHNvIG9uLiAgQXV0b2NvbmYgaXMgZXNwZWNpYWxseSBzZW5zaWJsZSB0byB0aGlzKS4KKyAgLiAuLyRhc19tZS5saW5lbm8KKyAgIyBFeGl0IHN0YXR1cyBpcyB0aGF0IG9mIHRoZSBsYXN0IGNvbW1hbmQuCisgIGV4aXQKK30KKworCitjYXNlIGBlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzYCxgZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzYCBpbgorICAqYyosLW4qKSBFQ0hPX049IEVDSE9fQz0nCisnIEVDSE9fVD0nCScgOzsKKyAgKmMqLCogICkgRUNIT19OPS1uIEVDSE9fQz0gRUNIT19UPSA7OworICAqKSAgICAgICBFQ0hPX049IEVDSE9fQz0nXGMnIEVDSE9fVD0gOzsKK2VzYWMKKworaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfZXhwcj1leHByCitlbHNlCisgIGFzX2V4cHI9ZmFsc2UKK2ZpCisKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCitlY2hvID5jb25mJCQuZmlsZQoraWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICMgV2UgY291bGQganVzdCBjaGVjayBmb3IgREpHUFA7IGJ1dCB0aGlzIHRlc3QgYSkgd29ya3MgYikgaXMgbW9yZSBnZW5lcmljCisgICMgYW5kIGMpIHdpbGwgcmVtYWluIHZhbGlkIG9uY2UgREpHUFAgc3VwcG9ydHMgc3ltbGlua3MgKERKR1BQIDIuMDQpLgorICBpZiB0ZXN0IC1mIGNvbmYkJC5leGU7IHRoZW4KKyAgICAjIERvbid0IHVzZSBsbiBhdCBhbGw7IHdlIGRvbid0IGhhdmUgYW55IGxpbmtzCisgICAgYXNfbG5fcz0nY3AgLXAnCisgIGVsc2UKKyAgICBhc19sbl9zPSdsbiAtcycKKyAgZmkKK2VsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2xuX3M9bG4KK2Vsc2UKKyAgYXNfbG5fcz0nY3AgLXAnCitmaQorcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKKworaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19ta2Rpcl9wPToKK2Vsc2UKKyAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKKyAgYXNfbWtkaXJfcD1mYWxzZQorZmkKKworYXNfZXhlY3V0YWJsZV9wPSJ0ZXN0IC1mIgorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCithc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KK2FzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKworIyBJRlMKKyMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuCithc19ubD0nCisnCitJRlM9IiAJJGFzX25sIgorCisjIENEUEFUSC4KKyRhc191bnNldCBDRFBBVEgKKworCisKKyMgQ2hlY2sgdGhhdCB3ZSBhcmUgcnVubmluZyB1bmRlciB0aGUgY29ycmVjdCBzaGVsbC4KK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisKK2Nhc2UgWCRFQ0hPIGluCitYKi0tZmFsbGJhY2stZWNobykKKyAgIyBSZW1vdmUgb25lIGxldmVsIG9mIHF1b3RhdGlvbiAod2hpY2ggd2FzIHJlcXVpcmVkIGZvciBNYWtlKS4KKyAgRUNITz1gZWNobyAiJEVDSE8iIHwgc2VkICdzLFxcXFxcJFxcJDAsJyQwJywnYAorICA7OworZXNhYworCitlY2hvPSR7RUNITy1lY2hvfQoraWYgdGVzdCAiWCQxIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgorICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KKyAgc2hpZnQKK2VsaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KKyAgIyBBdm9pZCBpbmxpbmUgZG9jdW1lbnQgaGVyZSwgaXQgbWF5IGJlIGxlZnQgb3ZlcgorICA6CitlbGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyA7IHRoZW4KKyAgIyBZaXBwZWUsICRlY2hvIHdvcmtzIQorICA6CitlbHNlCisgICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbC4KKyAgZXhlYyAkU0hFTEwgIiQwIiAtLW5vLXJlZXhlYyAkezErIiRAIn0KK2ZpCisKK2lmIHRlc3QgIlgkMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCisgICMgdXNlZCBhcyBmYWxsYmFjayBlY2hvCisgIHNoaWZ0CisgIGNhdCA8PEVPRgorJCoKK0VPRgorICBleGl0IDAKK2ZpCisKKyMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0CisjIGlmIENEUEFUSCBpcyBzZXQuCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKK2lmIHRlc3QgLXogIiRFQ0hPIjsgdGhlbgoraWYgdGVzdCAiWCR7ZWNob190ZXN0X3N0cmluZytzZXR9IiAhPSBYc2V0OyB0aGVuCisjIGZpbmQgYSBzdHJpbmcgYXMgbGFyZ2UgYXMgcG9zc2libGUsIGFzIGxvbmcgYXMgdGhlIHNoZWxsIGNhbiBjb3BlIHdpdGggaXQKKyAgZm9yIGNtZCBpbiAnc2VkIDUwcSAiJDAiJyAnc2VkIDIwcSAiJDAiJyAnc2VkIDEwcSAiJDAiJyAnc2VkIDJxICIkMCInICdlY2hvIHRlc3QnOyBkbworICAgICMgZXhwZWN0ZWQgc2l6ZXM6IGxlc3MgdGhhbiAyS2IsIDFLYiwgNTEyIGJ5dGVzLCAxNiBieXRlcywgLi4uCisgICAgaWYgKGVjaG9fdGVzdF9zdHJpbmc9YGV2YWwgJGNtZGApIDI+L2Rldi9udWxsICYmCisgICAgICAgZWNob190ZXN0X3N0cmluZz1gZXZhbCAkY21kYCAmJgorICAgICAgICh0ZXN0ICJYJGVjaG9fdGVzdF9zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsCisgICAgdGhlbgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCitmaQorCitpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKKyAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKKyAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorICA6CitlbHNlCisgICMgVGhlIFNvbGFyaXMsIEFJWCwgYW5kIERpZ2l0YWwgVW5peCBkZWZhdWx0IGVjaG8gcHJvZ3JhbXMgdW5xdW90ZQorICAjIGJhY2tzbGFzaGVzLiAgVGhpcyBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHF1b3RlIGJhY2tzbGFzaGVzIHVzaW5nCisgICMgICBlY2hvICIkc29tZXRoaW5nIiB8IHNlZCAncy9cXC9cXFxcL2cnCisgICMKKyAgIyBTbywgZmlyc3Qgd2UgbG9vayBmb3IgYSB3b3JraW5nIGVjaG8gaW4gdGhlIHVzZXIncyBQQVRILgorCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBmb3IgZGlyIGluICRQQVRIIC91c3IvdWNiOyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgIGlmICh0ZXN0IC1mICRkaXIvZWNobyB8fCB0ZXN0IC1mICRkaXIvZWNobyRhY19leGVleHQpICYmCisgICAgICAgdGVzdCAiWGAoJGRpci9lY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgorICAgICAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkZGlyL2VjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisgICAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisgICAgICBlY2hvPSIkZGlyL2VjaG8iCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkbHRfc2F2ZV9pZnMiCisKKyAgaWYgdGVzdCAiWCRlY2hvIiA9IFhlY2hvOyB0aGVuCisgICAgIyBXZSBkaWRuJ3QgZmluZCBhIGJldHRlciBlY2hvLCBzbyBsb29rIGZvciBhbHRlcm5hdGl2ZXMuCisgICAgaWYgdGVzdCAiWGAocHJpbnQgLXIgJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCisgICAgICAgZWNob190ZXN0aW5nX3N0cmluZz1gKHByaW50IC1yICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgorICAgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorICAgICAgIyBUaGlzIHNoZWxsIGhhcyBhIGJ1aWx0aW4gcHJpbnQgLXIgdGhhdCBkb2VzIHRoZSB0cmljay4KKyAgICAgIGVjaG89J3ByaW50IC1yJworICAgIGVsaWYgKHRlc3QgLWYgL2Jpbi9rc2ggfHwgdGVzdCAtZiAvYmluL2tzaCRhY19leGVleHQpICYmCisJIHRlc3QgIlgkQ09ORklHX1NIRUxMIiAhPSBYL2Jpbi9rc2g7IHRoZW4KKyAgICAgICMgSWYgd2UgaGF2ZSBrc2gsIHRyeSBydW5uaW5nIGNvbmZpZ3VyZSBhZ2FpbiB3aXRoIGl0LgorICAgICAgT1JJR0lOQUxfQ09ORklHX1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisgICAgICBleHBvcnQgT1JJR0lOQUxfQ09ORklHX1NIRUxMCisgICAgICBDT05GSUdfU0hFTEw9L2Jpbi9rc2gKKyAgICAgIGV4cG9ydCBDT05GSUdfU0hFTEwKKyAgICAgIGV4ZWMgJENPTkZJR19TSEVMTCAiJDAiIC0tbm8tcmVleGVjICR7MSsiJEAifQorICAgIGVsc2UKKyAgICAgICMgVHJ5IHVzaW5nIHByaW50Zi4KKyAgICAgIGVjaG89J3ByaW50ZiAlc1xuJworICAgICAgaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCisJIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKKwkgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisJIyBDb29sLCBwcmludGYgd29ya3MKKwk6CisgICAgICBlbGlmIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkT1JJR0lOQUxfQ09ORklHX1NIRUxMICIkMCIgLS1mYWxsYmFjay1lY2hvICdcdCcpIDI+L2Rldi9udWxsYCAmJgorCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAnWFx0JyAmJgorCSAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkT1JJR0lOQUxfQ09ORklHX1NIRUxMICIkMCIgLS1mYWxsYmFjay1lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgorCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorCUNPTkZJR19TSEVMTD0kT1JJR0lOQUxfQ09ORklHX1NIRUxMCisJZXhwb3J0IENPTkZJR19TSEVMTAorCVNIRUxMPSIkQ09ORklHX1NIRUxMIgorCWV4cG9ydCBTSEVMTAorCWVjaG89IiRDT05GSUdfU0hFTEwgJDAgLS1mYWxsYmFjay1lY2hvIgorICAgICAgZWxpZiBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJENPTkZJR19TSEVMTCAiJDAiIC0tZmFsbGJhY2stZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAgJiYKKwkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gJ1hcdCcgJiYKKwkgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJENPTkZJR19TSEVMTCAiJDAiIC0tZmFsbGJhY2stZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKKwkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKwllY2hvPSIkQ09ORklHX1NIRUxMICQwIC0tZmFsbGJhY2stZWNobyIKKyAgICAgIGVsc2UKKwkjIG1heWJlIHdpdGggYSBzbWFsbGVyIHN0cmluZy4uLgorCXByZXY9OgorCisJZm9yIGNtZCBpbiAnZWNobyB0ZXN0JyAnc2VkIDJxICIkMCInICdzZWQgMTBxICIkMCInICdzZWQgMjBxICIkMCInICdzZWQgNTBxICIkMCInOyBkbworCSAgaWYgKHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWGBldmFsICRjbWRgIikgMj4vZGV2L251bGwKKwkgIHRoZW4KKwkgICAgYnJlYWsKKwkgIGZpCisJICBwcmV2PSIkY21kIgorCWRvbmUKKworCWlmIHRlc3QgIiRwcmV2IiAhPSAnc2VkIDUwcSAiJDAiJzsgdGhlbgorCSAgZWNob190ZXN0X3N0cmluZz1gZXZhbCAkcHJldmAKKwkgIGV4cG9ydCBlY2hvX3Rlc3Rfc3RyaW5nCisJICBleGVjICR7T1JJR0lOQUxfQ09ORklHX1NIRUxMLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9fSAiJDAiICR7MSsiJEAifQorCWVsc2UKKwkgICMgT29wcy4gIFdlIGxvc3QgY29tcGxldGVseSwgc28ganVzdCBzdGljayB3aXRoIGVjaG8uCisJICBlY2hvPWVjaG8KKwlmaQorICAgICAgZmkKKyAgICBmaQorICBmaQorZmkKK2ZpCisKKyMgQ29weSBlY2hvIGFuZCBxdW90ZSB0aGUgY29weSBzdWl0YWJseSBmb3IgcGFzc2luZyB0byBsaWJ0b29sIGZyb20KKyMgdGhlIE1ha2VmaWxlLCBpbnN0ZWFkIG9mIHF1b3RpbmcgdGhlIG9yaWdpbmFsLCB3aGljaCBpcyB1c2VkIGxhdGVyLgorRUNITz0kZWNobworaWYgdGVzdCAiWCRFQ0hPIiA9ICJYJENPTkZJR19TSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iOyB0aGVuCisgICBFQ0hPPSIkQ09ORklHX1NIRUxMIFxcXCRcJDAgLS1mYWxsYmFjay1lY2hvIgorZmkKKworCisKKwordGFnbmFtZXM9JHt0YWduYW1lcyske3RhZ25hbWVzfSx9Q1hYCisKK3RhZ25hbWVzPSR7dGFnbmFtZXMrJHt0YWduYW1lc30sfUY3NworCisjIE5hbWUgb2YgdGhlIGhvc3QuCisjIGhvc3RuYW1lIG9uIHNvbWUgc3lzdGVtcyAoU1ZSMy4yLCBMaW51eCkgcmV0dXJucyBhIGJvZ3VzIGV4aXQgc3RhdHVzLAorIyBzbyB1bmFtZSBnZXRzIHJ1biB0b28uCithY19ob3N0bmFtZT1gKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKKworZXhlYyA2PiYxCisKKyMKKyMgSW5pdGlhbGl6YXRpb25zLgorIworYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorYWNfY29uZmlnX2xpYm9ial9kaXI9LgorY3Jvc3NfY29tcGlsaW5nPW5vCitzdWJkaXJzPQorTUZMQUdTPQorTUFLRUZMQUdTPQorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKworIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgorIyBUaGlzIHZhcmlhYmxlIHNlZW1zIG9ic29sZXRlLiAgSXQgc2hvdWxkIHByb2JhYmx5IGJlIHJlbW92ZWQsIGFuZAorIyBvbmx5IGFjX21heF9zZWRfbGluZXMgc2hvdWxkIGJlIHVzZWQuCis6ICR7YWNfbWF4X2hlcmVfbGluZXM9Mzh9CisKKyMgSWRlbnRpdHkgb2YgdGhpcyBwYWNrYWdlLgorUEFDS0FHRV9OQU1FPSdleHBhdCcKK1BBQ0tBR0VfVEFSTkFNRT0nZXhwYXQnCitQQUNLQUdFX1ZFUlNJT049JzIuMC4xJworUEFDS0FHRV9TVFJJTkc9J2V4cGF0IDIuMC4xJworUEFDS0FHRV9CVUdSRVBPUlQ9J2V4cGF0LWJ1Z3NAbGliZXhwYXQub3JnJworCithY191bmlxdWVfZmlsZT0iTWFrZWZpbGUuaW4iCisjIEZhY3RvcmluZyBkZWZhdWx0IGhlYWRlcnMgZm9yIG1vc3QgdGVzdHMuCithY19pbmNsdWRlc19kZWZhdWx0PSJcCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZiBIQVZFX1NZU19UWVBFU19ICisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNfU1RBVF9ICisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpZiBTVERDX0hFQURFUlMKKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjIGluY2x1ZGUgPHN0ZGRlZi5oPgorI2Vsc2UKKyMgaWYgSEFWRV9TVERMSUJfSAorIyAgaW5jbHVkZSA8c3RkbGliLmg+CisjIGVuZGlmCisjZW5kaWYKKyNpZiBIQVZFX1NUUklOR19ICisjIGlmICFTVERDX0hFQURFUlMgJiYgSEFWRV9NRU1PUllfSAorIyAgaW5jbHVkZSA8bWVtb3J5Lmg+CisjIGVuZGlmCisjIGluY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisjaWYgSEFWRV9TVFJJTkdTX0gKKyMgaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjaWYgSEFWRV9JTlRUWVBFU19ICisjIGluY2x1ZGUgPGludHR5cGVzLmg+CisjZWxzZQorIyBpZiBIQVZFX1NURElOVF9ICisjICBpbmNsdWRlIDxzdGRpbnQuaD4KKyMgZW5kaWYKKyNlbmRpZgorI2lmIEhBVkVfVU5JU1REX0gKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYiCisKK2FjX3N1YnN0X3ZhcnM9J1NIRUxMIFBBVEhfU0VQQVJBVE9SIFBBQ0tBR0VfTkFNRSBQQUNLQUdFX1RBUk5BTUUgUEFDS0FHRV9WRVJTSU9OIFBBQ0tBR0VfU1RSSU5HIFBBQ0tBR0VfQlVHUkVQT1JUIGV4ZWNfcHJlZml4IHByZWZpeCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIGJpbmRpciBzYmluZGlyIGxpYmV4ZWNkaXIgZGF0YWRpciBzeXNjb25mZGlyIHNoYXJlZHN0YXRlZGlyIGxvY2Fsc3RhdGVkaXIgbGliZGlyIGluY2x1ZGVkaXIgb2xkaW5jbHVkZWRpciBpbmZvZGlyIG1hbmRpciBidWlsZF9hbGlhcyBob3N0X2FsaWFzIHRhcmdldF9hbGlhcyBERUZTIEVDSE9fQyBFQ0hPX04gRUNIT19UIExJQlMgYnVpbGQgYnVpbGRfY3B1IGJ1aWxkX3ZlbmRvciBidWlsZF9vcyBob3N0IGhvc3RfY3B1IGhvc3RfdmVuZG9yIGhvc3Rfb3MgQ0MgQ0ZMQUdTIExERkxBR1MgQ1BQRkxBR1MgYWNfY3RfQ0MgRVhFRVhUIE9CSkVYVCBFR1JFUCBMTl9TIEVDSE8gQVIgYWNfY3RfQVIgUkFOTElCIGFjX2N0X1JBTkxJQiBTVFJJUCBhY19jdF9TVFJJUCBETExUT09MIGFjX2N0X0RMTFRPT0wgQVMgYWNfY3RfQVMgT0JKRFVNUCBhY19jdF9PQkpEVU1QIENQUCBDWFggQ1hYRkxBR1MgYWNfY3RfQ1hYIENYWENQUCBGNzcgRkZMQUdTIGFjX2N0X0Y3NyBMSUJUT09MIExJQkNVUlJFTlQgTElCUkVWSVNJT04gTElCQUdFIElOU1RBTExfUFJPR1JBTSBJTlNUQUxMX1NDUklQVCBJTlNUQUxMX0RBVEEgRklMRU1BUCBMSUJPQkpTIExUTElCT0JKUycKK2FjX3N1YnN0X2ZpbGVzPScnCisKKyMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KK2FjX2luaXRfaGVscD0KK2FjX2luaXRfdmVyc2lvbj1mYWxzZQorIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKKyMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KK2NhY2hlX2ZpbGU9L2Rldi9udWxsCitleGVjX3ByZWZpeD1OT05FCitub19jcmVhdGU9Citub19yZWN1cnNpb249CitwcmVmaXg9Tk9ORQorcHJvZ3JhbV9wcmVmaXg9Tk9ORQorcHJvZ3JhbV9zdWZmaXg9Tk9ORQorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKK3NpbGVudD0KK3NpdGU9CitzcmNkaXI9Cit2ZXJib3NlPQoreF9pbmNsdWRlcz1OT05FCit4X2xpYnJhcmllcz1OT05FCisKKyMgSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvcHRpb25zLgorIyBUaGVzZSBhcmUgbGVmdCB1bmV4cGFuZGVkIHNvIHVzZXJzIGNhbiAibWFrZSBpbnN0YWxsIGV4ZWNfcHJlZml4PS9mb28iCisjIGFuZCBhbGwgdGhlIHZhcmlhYmxlcyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBiYXNlZCBvbiBleGVjX3ByZWZpeAorIyBieSBkZWZhdWx0IHdpbGwgYWN0dWFsbHkgY2hhbmdlLgorIyBVc2UgYnJhY2VzIGluc3RlYWQgb2YgcGFyZW5zIGJlY2F1c2Ugc2gsIHBlcmwsIGV0Yy4gYWxzbyBhY2NlcHQgdGhlbS4KK2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJworc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKK2xpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCitkYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCitzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJworc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCitsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2luZm9kaXI9JyR7cHJlZml4fS9pbmZvJworbWFuZGlyPScke3ByZWZpeH0vbWFuJworCithY19wcmV2PQorZm9yIGFjX29wdGlvbgorZG8KKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgorICAgIGFjX3ByZXY9CisgICAgY29udGludWUKKyAgZmkKKworICBhY19vcHRhcmc9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4W149XSo9XCguKlwpJ2AKKworICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgorCisgIGNhc2UgJGFjX29wdGlvbiBpbgorCisgIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCisgICAgYWNfcHJldj1iaW5kaXIgOzsKKyAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKKyAgICBiaW5kaXI9JGFjX29wdGFyZyA7OworCisgIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCisgICAgYWNfcHJldj1idWlsZF9hbGlhcyA7OworICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKKyAgICBidWlsZF9hbGlhcz0kYWNfb3B0YXJnIDs7CisKKyAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAorICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKKyAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCisgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCisgICAgY2FjaGVfZmlsZT0kYWNfb3B0YXJnIDs7CisKKyAgLS1jb25maWctY2FjaGUgfCAtQykKKyAgICBjYWNoZV9maWxlPWNvbmZpZy5jYWNoZSA7OworCisgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQorICAgIGFjX3ByZXY9ZGF0YWRpciA7OworICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKKyAgfCAtLWRhPSopCisgICAgZGF0YWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSpkaXNhYmxlLVwoLipcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfZmVhdHVyZSIgOiAiLipbXi1fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIGZlYXR1cmUgbmFtZTogJGFjX2ZlYXR1cmUiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZSB8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAiZW5hYmxlXyRhY19mZWF0dXJlPW5vIiA7OworCisgIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKmVuYWJsZS1cKFtePV0qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX2ZlYXR1cmUiIDogIi4qW14tXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY19mZWF0dXJlIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmUgfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgJGFjX29wdGlvbiBpbgorICAgICAgKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAiZW5hYmxlXyRhY19mZWF0dXJlPSckYWNfb3B0YXJnJyIgOzsKKworICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCisgIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKKyAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCisgICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OworICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKKyAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKKyAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCisgICAgZXhlY19wcmVmaXg9JGFjX29wdGFyZyA7OworCisgIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCisgICAgd2l0aF9nYXM9eWVzIDs7CisKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtaCkKKyAgICBhY19pbml0X2hlbHA9bG9uZyA7OworICAtaGVscD1yKiB8IC0taGVscD1yKiB8IC0taGVsPXIqIHwgLS1oZT1yKiB8IC1ociopCisgICAgYWNfaW5pdF9oZWxwPXJlY3Vyc2l2ZSA7OworICAtaGVscD1zKiB8IC0taGVscD1zKiB8IC0taGVsPXMqIHwgLS1oZT1zKiB8IC1ocyopCisgICAgYWNfaW5pdF9oZWxwPXNob3J0IDs7CisKKyAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCisgICAgYWNfcHJldj1ob3N0X2FsaWFzIDs7CisgIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCisgICAgaG9zdF9hbGlhcz0kYWNfb3B0YXJnIDs7CisKKyAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAorICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQorICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OworICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAorICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCisgICAgaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKKyAgICBhY19wcmV2PWluZm9kaXIgOzsKKyAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKKyAgICBpbmZvZGlyPSRhY19vcHRhcmcgOzsKKworICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQorICAgIGFjX3ByZXY9bGliZGlyIDs7CisgIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKKyAgICBsaWJkaXI9JGFjX29wdGFyZyA7OworCisgIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKKyAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCisgICAgYWNfcHJldj1saWJleGVjZGlyIDs7CisgIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCisgIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQorICAgIGxpYmV4ZWNkaXI9JGFjX29wdGFyZyA7OworCisgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAorICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKKyAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKKyAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCisgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAorICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCisgICAgbG9jYWxzdGF0ZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKKyAgICBhY19wcmV2PW1hbmRpciA7OworICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCisgICAgbWFuZGlyPSRhY19vcHRhcmcgOzsKKworICAtbmZwIHwgLS1uZnAgfCAtLW5mKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCisgICAgd2l0aF9mcD1ubyA7OworCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYyB8IC1uKQorICAgIG5vX2NyZWF0ZT15ZXMgOzsKKworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCisgICAgbm9fcmVjdXJzaW9uPXllcyA7OworCisgIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKKyAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCisgIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKKyAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKKyAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCisgIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKKyAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKKyAgICBvbGRpbmNsdWRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgIGFjX3ByZXY9cHJlZml4IDs7CisgIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKKyAgICBwcmVmaXg9JGFjX29wdGFyZyA7OworCisgIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCisgIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKKyAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCisgIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKKyAgICBwcm9ncmFtX3ByZWZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKKyAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCisgICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OworICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKKyAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQorICAgIHByb2dyYW1fc3VmZml4PSRhY19vcHRhcmcgOzsKKworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKKyAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCisgIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKKyAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAorICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCisgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0kYWNfb3B0YXJnIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9JGFjX29wdGFyZyA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9JGFjX29wdGFyZyA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSRhY19vcHRhcmcgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0X2FsaWFzIDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXRfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC1WKQorICAgIGFjX2luaXRfdmVyc2lvbj06IDs7CisKKyAgLXdpdGgtKiB8IC0td2l0aC0qKQorICAgIGFjX3BhY2thZ2U9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRoLVwoW149XSpcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfcGFja2FnZSIgOiAiLipbXi1fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHBhY2thZ2UgbmFtZTogJGFjX3BhY2thZ2UiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICRhY19vcHRpb24gaW4KKyAgICAgICo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0YXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgIndpdGhfJGFjX3BhY2thZ2U9JyRhY19vcHRhcmcnIiA7OworCisgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKKyAgICBhY19wYWNrYWdlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aG91dC1cKC4qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3BhY2thZ2UiIDogIi4qW14tXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY19wYWNrYWdlIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2UgfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgIndpdGhfJGFjX3BhY2thZ2U9bm8iIDs7CisKKyAgLS14KQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KKyAgICB3aXRoX3g9eWVzIDs7CisKKyAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAorICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQorICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OworICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAorICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCisgICAgeF9pbmNsdWRlcz0kYWNfb3B0YXJnIDs7CisKKyAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKKyAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OworICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCisgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorICAgIHhfbGlicmFyaWVzPSRhY19vcHRhcmcgOzsKKworICAtKikgeyBlY2hvICIkYXNfbWU6IGVycm9yOiB1bnJlY29nbml6ZWQgb3B0aW9uOiAkYWNfb3B0aW9uCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICA7OworCisgICo9KikKKyAgICBhY19lbnZ2YXI9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4XChbXj1dKlwpPSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfZW52dmFyIiA6ICIuKlteXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCB2YXJpYWJsZSBuYW1lOiAkYWNfZW52dmFyIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGFyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAKKyAgICBldmFsICIkYWNfZW52dmFyPSckYWNfb3B0YXJnJyIKKyAgICBleHBvcnQgJGFjX2VudnZhciA7OworCisgICopCisgICAgIyBGSVhNRTogc2hvdWxkIGJlIHJlbW92ZWQgaW4gYXV0b2NvbmYgMy4wLgorICAgIGVjaG8gIiRhc19tZTogV0FSTklORzogeW91IHNob3VsZCB1c2UgLS1idWlsZCwgLS1ob3N0LCAtLXRhcmdldCIgPiYyCisgICAgZXhwciAieCRhY19vcHRpb24iIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IGludmFsaWQgaG9zdCB0eXBlOiAkYWNfb3B0aW9uIiA+JjIKKyAgICA6ICR7YnVpbGRfYWxpYXM9JGFjX29wdGlvbn0gJHtob3N0X2FsaWFzPSRhY19vcHRpb259ICR7dGFyZ2V0X2FsaWFzPSRhY19vcHRpb259CisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICBhY19vcHRpb249LS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgCisgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAkYWNfb3B0aW9uIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworIyBCZSBzdXJlIHRvIGhhdmUgYWJzb2x1dGUgcGF0aHMuCitmb3IgYWNfdmFyIGluIGV4ZWNfcHJlZml4IHByZWZpeAorZG8KKyAgZXZhbCBhY192YWw9JGBlY2hvICRhY192YXJgCisgIGNhc2UgJGFjX3ZhbCBpbgorICAgIFtcXC8kXSogfCA/OltcXC9dKiB8IE5PTkUgfCAnJyApIDs7CisgICAgKikgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogZXhwZWN0ZWQgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgZm9yIC0tJGFjX3ZhcjogJGFjX3ZhbCIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworICBlc2FjCitkb25lCisKKyMgQmUgc3VyZSB0byBoYXZlIGFic29sdXRlIHBhdGhzLgorZm9yIGFjX3ZhciBpbiBiaW5kaXIgc2JpbmRpciBsaWJleGVjZGlyIGRhdGFkaXIgc3lzY29uZmRpciBzaGFyZWRzdGF0ZWRpciBcCisJICAgICAgbG9jYWxzdGF0ZWRpciBsaWJkaXIgaW5jbHVkZWRpciBvbGRpbmNsdWRlZGlyIGluZm9kaXIgbWFuZGlyCitkbworICBldmFsIGFjX3ZhbD0kYGVjaG8gJGFjX3ZhcmAKKyAgY2FzZSAkYWNfdmFsIGluCisgICAgW1xcLyRdKiB8ID86W1xcL10qICkgOzsKKyAgICAqKSAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBleHBlY3RlZCBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBmb3IgLS0kYWNfdmFyOiAkYWNfdmFsIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7CisgIGVzYWMKK2RvbmUKKworIyBUaGVyZSBtaWdodCBiZSBwZW9wbGUgd2hvIGRlcGVuZCBvbiB0aGUgb2xkIGJyb2tlbiBiZWhhdmlvcjogYCRob3N0JworIyB1c2VkIHRvIGhvbGQgdGhlIGFyZ3VtZW50IG9mIC0taG9zdCBldGMuCisjIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCitidWlsZD0kYnVpbGRfYWxpYXMKK2hvc3Q9JGhvc3RfYWxpYXMKK3RhcmdldD0kdGFyZ2V0X2FsaWFzCisKKyMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KK2lmIHRlc3QgIngkaG9zdF9hbGlhcyIgIT0geDsgdGhlbgorICBpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiA9IHg7IHRoZW4KKyAgICBjcm9zc19jb21waWxpbmc9bWF5YmUKKyAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IElmIHlvdSB3YW50ZWQgdG8gc2V0IHRoZSAtLWJ1aWxkIHR5cGUsIGRvbid0IHVzZSAtLWhvc3QuCisgICAgSWYgYSBjcm9zcyBjb21waWxlciBpcyBkZXRlY3RlZCB0aGVuIGNyb3NzIGNvbXBpbGUgbW9kZSB3aWxsIGJlIHVzZWQuIiA+JjIKKyAgZWxpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiAhPSAieCRob3N0X2FsaWFzIjsgdGhlbgorICAgIGNyb3NzX2NvbXBpbGluZz15ZXMKKyAgZmkKK2ZpCisKK2FjX3Rvb2xfcHJlZml4PQordGVzdCAtbiAiJGhvc3RfYWxpYXMiICYmIGFjX3Rvb2xfcHJlZml4PSRob3N0X2FsaWFzLQorCit0ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBleGVjIDY+L2Rldi9udWxsCisKKworIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgoraWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKKyAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCisgIGFjX2NvbmZkaXI9YChkaXJuYW1lICIkMCIpIDI+L2Rldi9udWxsIHx8CiskYXNfZXhwciBYIiQwIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvXCknIFx8IFwKKwkgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8CitlY2hvIFgiJDAiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXClbXi9dLioveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXCkkL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cKS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIHMvLiovLi87IHEnYAorICBzcmNkaXI9JGFjX2NvbmZkaXIKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCisgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBzb3VyY2VzICgkYWNfdW5pcXVlX2ZpbGUpIGluICRhY19jb25mZGlyIG9yIC4uIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICBlbHNlCisgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBzb3VyY2VzICgkYWNfdW5pcXVlX2ZpbGUpIGluICRzcmNkaXIiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgIGZpCitmaQorKGNkICRzcmNkaXIgJiYgdGVzdCAtciAuLyRhY191bmlxdWVfZmlsZSkgMj4vZGV2L251bGwgfHwKKyAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBzb3VyY2VzIGFyZSBpbiAkc3JjZGlyLCBidXQgXGBjZCAkc3JjZGlyJyBkb2VzIG5vdCB3b3JrIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorc3JjZGlyPWBlY2hvICIkc3JjZGlyIiB8IHNlZCAncyVcKFteXFwvXVwpW1xcL10qJCVcMSUnYAorYWNfZW52X2J1aWxkX2FsaWFzX3NldD0ke2J1aWxkX2FsaWFzK3NldH0KK2FjX2Vudl9idWlsZF9hbGlhc192YWx1ZT0kYnVpbGRfYWxpYXMKK2FjX2N2X2Vudl9idWlsZF9hbGlhc19zZXQ9JHtidWlsZF9hbGlhcytzZXR9CithY19jdl9lbnZfYnVpbGRfYWxpYXNfdmFsdWU9JGJ1aWxkX2FsaWFzCithY19lbnZfaG9zdF9hbGlhc19zZXQ9JHtob3N0X2FsaWFzK3NldH0KK2FjX2Vudl9ob3N0X2FsaWFzX3ZhbHVlPSRob3N0X2FsaWFzCithY19jdl9lbnZfaG9zdF9hbGlhc19zZXQ9JHtob3N0X2FsaWFzK3NldH0KK2FjX2N2X2Vudl9ob3N0X2FsaWFzX3ZhbHVlPSRob3N0X2FsaWFzCithY19lbnZfdGFyZ2V0X2FsaWFzX3NldD0ke3RhcmdldF9hbGlhcytzZXR9CithY19lbnZfdGFyZ2V0X2FsaWFzX3ZhbHVlPSR0YXJnZXRfYWxpYXMKK2FjX2N2X2Vudl90YXJnZXRfYWxpYXNfc2V0PSR7dGFyZ2V0X2FsaWFzK3NldH0KK2FjX2N2X2Vudl90YXJnZXRfYWxpYXNfdmFsdWU9JHRhcmdldF9hbGlhcworYWNfZW52X0NDX3NldD0ke0NDK3NldH0KK2FjX2Vudl9DQ192YWx1ZT0kQ0MKK2FjX2N2X2Vudl9DQ19zZXQ9JHtDQytzZXR9CithY19jdl9lbnZfQ0NfdmFsdWU9JENDCithY19lbnZfQ0ZMQUdTX3NldD0ke0NGTEFHUytzZXR9CithY19lbnZfQ0ZMQUdTX3ZhbHVlPSRDRkxBR1MKK2FjX2N2X2Vudl9DRkxBR1Nfc2V0PSR7Q0ZMQUdTK3NldH0KK2FjX2N2X2Vudl9DRkxBR1NfdmFsdWU9JENGTEFHUworYWNfZW52X0xERkxBR1Nfc2V0PSR7TERGTEFHUytzZXR9CithY19lbnZfTERGTEFHU192YWx1ZT0kTERGTEFHUworYWNfY3ZfZW52X0xERkxBR1Nfc2V0PSR7TERGTEFHUytzZXR9CithY19jdl9lbnZfTERGTEFHU192YWx1ZT0kTERGTEFHUworYWNfZW52X0NQUEZMQUdTX3NldD0ke0NQUEZMQUdTK3NldH0KK2FjX2Vudl9DUFBGTEFHU192YWx1ZT0kQ1BQRkxBR1MKK2FjX2N2X2Vudl9DUFBGTEFHU19zZXQ9JHtDUFBGTEFHUytzZXR9CithY19jdl9lbnZfQ1BQRkxBR1NfdmFsdWU9JENQUEZMQUdTCithY19lbnZfQ1BQX3NldD0ke0NQUCtzZXR9CithY19lbnZfQ1BQX3ZhbHVlPSRDUFAKK2FjX2N2X2Vudl9DUFBfc2V0PSR7Q1BQK3NldH0KK2FjX2N2X2Vudl9DUFBfdmFsdWU9JENQUAorYWNfZW52X0NYWF9zZXQ9JHtDWFgrc2V0fQorYWNfZW52X0NYWF92YWx1ZT0kQ1hYCithY19jdl9lbnZfQ1hYX3NldD0ke0NYWCtzZXR9CithY19jdl9lbnZfQ1hYX3ZhbHVlPSRDWFgKK2FjX2Vudl9DWFhGTEFHU19zZXQ9JHtDWFhGTEFHUytzZXR9CithY19lbnZfQ1hYRkxBR1NfdmFsdWU9JENYWEZMQUdTCithY19jdl9lbnZfQ1hYRkxBR1Nfc2V0PSR7Q1hYRkxBR1Mrc2V0fQorYWNfY3ZfZW52X0NYWEZMQUdTX3ZhbHVlPSRDWFhGTEFHUworYWNfZW52X0NYWENQUF9zZXQ9JHtDWFhDUFArc2V0fQorYWNfZW52X0NYWENQUF92YWx1ZT0kQ1hYQ1BQCithY19jdl9lbnZfQ1hYQ1BQX3NldD0ke0NYWENQUCtzZXR9CithY19jdl9lbnZfQ1hYQ1BQX3ZhbHVlPSRDWFhDUFAKK2FjX2Vudl9GNzdfc2V0PSR7Rjc3K3NldH0KK2FjX2Vudl9GNzdfdmFsdWU9JEY3NworYWNfY3ZfZW52X0Y3N19zZXQ9JHtGNzcrc2V0fQorYWNfY3ZfZW52X0Y3N192YWx1ZT0kRjc3CithY19lbnZfRkZMQUdTX3NldD0ke0ZGTEFHUytzZXR9CithY19lbnZfRkZMQUdTX3ZhbHVlPSRGRkxBR1MKK2FjX2N2X2Vudl9GRkxBR1Nfc2V0PSR7RkZMQUdTK3NldH0KK2FjX2N2X2Vudl9GRkxBR1NfdmFsdWU9JEZGTEFHUworCisjCisjIFJlcG9ydCB0aGUgLS1oZWxwIG1lc3NhZ2UuCisjCitpZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJsb25nIjsgdGhlbgorICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KKyAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorICBjYXQgPDxfQUNFT0YKK1xgY29uZmlndXJlJyBjb25maWd1cmVzIGV4cGF0IDIuMC4xIHRvIGFkYXB0IHRvIG1hbnkga2luZHMgb2Ygc3lzdGVtcy4KKworVXNhZ2U6ICQwIFtPUFRJT05dLi4uIFtWQVI9VkFMVUVdLi4uCisKK1RvIGFzc2lnbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGUuZy4sIENDLCBDRkxBR1MuLi4pLCBzcGVjaWZ5IHRoZW0gYXMKK1ZBUj1WQUxVRS4gIFNlZSBiZWxvdyBmb3IgZGVzY3JpcHRpb25zIG9mIHNvbWUgb2YgdGhlIHVzZWZ1bCB2YXJpYWJsZXMuCisKK0RlZmF1bHRzIGZvciB0aGUgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIGluIGJyYWNrZXRzLgorCitDb25maWd1cmF0aW9uOgorICAtaCwgLS1oZWxwICAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdAorICAgICAgLS1oZWxwPXNob3J0ICAgICAgICBkaXNwbGF5IG9wdGlvbnMgc3BlY2lmaWMgdG8gdGhpcyBwYWNrYWdlCisgICAgICAtLWhlbHA9cmVjdXJzaXZlICAgIGRpc3BsYXkgdGhlIHNob3J0IGhlbHAgb2YgYWxsIHRoZSBpbmNsdWRlZCBwYWNrYWdlcworICAtViwgLS12ZXJzaW9uICAgICAgICAgICBkaXNwbGF5IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKKyAgLXEsIC0tcXVpZXQsIC0tc2lsZW50ICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCisgICAgICAtLWNhY2hlLWZpbGU9RklMRSAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFIFtkaXNhYmxlZF0KKyAgLUMsIC0tY29uZmlnLWNhY2hlICAgICAgYWxpYXMgZm9yIFxgLS1jYWNoZS1maWxlPWNvbmZpZy5jYWNoZScKKyAgLW4sIC0tbm8tY3JlYXRlICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKKyAgICAgIC0tc3JjZGlyPURJUiAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgXGAuLiddCisKK19BQ0VPRgorCisgIGNhdCA8PF9BQ0VPRgorSW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgorICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKwkJCSAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKyAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKKwkJCSAgW1BSRUZJWF0KKworQnkgZGVmYXVsdCwgXGBtYWtlIGluc3RhbGwnIHdpbGwgaW5zdGFsbCBhbGwgdGhlIGZpbGVzIGluCitcYCRhY19kZWZhdWx0X3ByZWZpeC9iaW4nLCBcYCRhY19kZWZhdWx0X3ByZWZpeC9saWInIGV0Yy4gIFlvdSBjYW4gc3BlY2lmeQorYW4gaW5zdGFsbGF0aW9uIHByZWZpeCBvdGhlciB0aGFuIFxgJGFjX2RlZmF1bHRfcHJlZml4JyB1c2luZyBcYC0tcHJlZml4JywKK2ZvciBpbnN0YW5jZSBcYC0tcHJlZml4PVwkSE9NRScuCisKK0ZvciBiZXR0ZXIgY29udHJvbCwgdXNlIHRoZSBvcHRpb25zIGJlbG93LgorCitGaW5lIHR1bmluZyBvZiB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgorICAtLWJpbmRpcj1ESVIgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgW0VQUkVGSVgvYmluXQorICAtLXNiaW5kaXI9RElSICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBbRVBSRUZJWC9zYmluXQorICAtLWxpYmV4ZWNkaXI9RElSICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgW0VQUkVGSVgvbGliZXhlY10KKyAgLS1kYXRhZGlyPURJUiAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW1BSRUZJWC9zaGFyZV0KKyAgLS1zeXNjb25mZGlyPURJUiAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL2V0Y10KKyAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtQUkVGSVgvY29tXQorICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL3Zhcl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgW0VQUkVGSVgvbGliXQorICAtLWluY2x1ZGVkaXI9RElSICAgICAgIEMgaGVhZGVyIGZpbGVzIFtQUkVGSVgvaW5jbHVkZV0KKyAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBbL3Vzci9pbmNsdWRlXQorICAtLWluZm9kaXI9RElSICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBbUFJFRklYL2luZm9dCisgIC0tbWFuZGlyPURJUiAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gW1BSRUZJWC9tYW5dCitfQUNFT0YKKworICBjYXQgPDxcX0FDRU9GCisKK1N5c3RlbSB0eXBlczoKKyAgLS1idWlsZD1CVUlMRCAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbZ3Vlc3NlZF0KKyAgLS1ob3N0PUhPU1QgICAgICAgY3Jvc3MtY29tcGlsZSB0byBidWlsZCBwcm9ncmFtcyB0byBydW4gb24gSE9TVCBbQlVJTERdCitfQUNFT0YKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY19pbml0X2hlbHAiOyB0aGVuCisgIGNhc2UgJGFjX2luaXRfaGVscCBpbgorICAgICBzaG9ydCB8IHJlY3Vyc2l2ZSApIGVjaG8gIkNvbmZpZ3VyYXRpb24gb2YgZXhwYXQgMi4wLjE6Ijs7CisgICBlc2FjCisgIGNhdCA8PFxfQUNFT0YKKworT3B0aW9uYWwgRmVhdHVyZXM6CisgIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXQorICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXQorICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD15ZXNdCisgIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGF2b2lkIGxvY2tpbmcgKG1pZ2h0IGJyZWFrIHBhcmFsbGVsIGJ1aWxkcykKKworT3B0aW9uYWwgUGFja2FnZXM6CisgIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQorICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCisgIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub10KKyAgLS13aXRoLXBpYyAgICAgICAgICAgICAgdHJ5IHRvIHVzZSBvbmx5IFBJQy9ub24tUElDIG9iamVjdHMgW2RlZmF1bHQ9dXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdGhdCisgIC0td2l0aC10YWdzWz1UQUdTXQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbnMgW2F1dG9tYXRpY10KKworU29tZSBpbmZsdWVudGlhbCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6CisgIENDICAgICAgICAgIEMgY29tcGlsZXIgY29tbWFuZAorICBDRkxBR1MgICAgICBDIGNvbXBpbGVyIGZsYWdzCisgIExERkxBR1MgICAgIGxpbmtlciBmbGFncywgZS5nLiAtTDxsaWIgZGlyPiBpZiB5b3UgaGF2ZSBsaWJyYXJpZXMgaW4gYQorICAgICAgICAgICAgICBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGxpYiBkaXI+CisgIENQUEZMQUdTICAgIEMvQysrIHByZXByb2Nlc3NvciBmbGFncywgZS5nLiAtSTxpbmNsdWRlIGRpcj4gaWYgeW91IGhhdmUKKyAgICAgICAgICAgICAgaGVhZGVycyBpbiBhIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8aW5jbHVkZSBkaXI+CisgIENQUCAgICAgICAgIEMgcHJlcHJvY2Vzc29yCisgIENYWCAgICAgICAgIEMrKyBjb21waWxlciBjb21tYW5kCisgIENYWEZMQUdTICAgIEMrKyBjb21waWxlciBmbGFncworICBDWFhDUFAgICAgICBDKysgcHJlcHJvY2Vzc29yCisgIEY3NyAgICAgICAgIEZvcnRyYW4gNzcgY29tcGlsZXIgY29tbWFuZAorICBGRkxBR1MgICAgICBGb3J0cmFuIDc3IGNvbXBpbGVyIGZsYWdzCisKK1VzZSB0aGVzZSB2YXJpYWJsZXMgdG8gb3ZlcnJpZGUgdGhlIGNob2ljZXMgbWFkZSBieSBgY29uZmlndXJlJyBvciB0byBoZWxwCitpdCB0byBmaW5kIGxpYnJhcmllcyBhbmQgcHJvZ3JhbXMgd2l0aCBub25zdGFuZGFyZCBuYW1lcy9sb2NhdGlvbnMuCisKK1JlcG9ydCBidWdzIHRvIDxleHBhdC1idWdzQGxpYmV4cGF0Lm9yZz4uCitfQUNFT0YKK2ZpCisKK2lmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gInJlY3Vyc2l2ZSI7IHRoZW4KKyAgIyBJZiB0aGVyZSBhcmUgc3ViZGlycywgcmVwb3J0IHRoZWlyIHNwZWNpZmljIC0taGVscC4KKyAgYWNfcG9wZGlyPWBwd2RgCisgIGZvciBhY19kaXIgaW4gOiAkYWNfc3ViZGlyc19hbGw7IGRvIHRlc3QgIngkYWNfZGlyIiA9IHg6ICYmIGNvbnRpbnVlCisgICAgdGVzdCAtZCAkYWNfZGlyIHx8IGNvbnRpbnVlCisgICAgYWNfYnVpbGRkaXI9LgorCitpZiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgIGFjX2Rpcl9zdWZmaXg9L2BlY2hvICIkYWNfZGlyIiB8IHNlZCAncyxeXC5bXFwvXSwsJ2AKKyAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgYWNfdG9wX2J1aWxkZGlyPWBlY2hvICIkYWNfZGlyX3N1ZmZpeCIgfCBzZWQgJ3MsL1teXFwvXSosLi4vLGcnYAorZWxzZQorICBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXI9CitmaQorCitjYXNlICRzcmNkaXIgaW4KKyAgLikgICMgTm8gLS1zcmNkaXIgb3B0aW9uLiAgV2UgYXJlIGJ1aWxkaW5nIGluIHBsYWNlLgorICAgIGFjX3NyY2Rpcj0uCisgICAgaWYgdGVzdCAteiAiJGFjX3RvcF9idWlsZGRpciI7IHRoZW4KKyAgICAgICBhY190b3Bfc3JjZGlyPS4KKyAgICBlbHNlCisgICAgICAgYWNfdG9wX3NyY2Rpcj1gZWNobyAkYWNfdG9wX2J1aWxkZGlyIHwgc2VkICdzLC8kLCwnYAorICAgIGZpIDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgcGF0aC4KKyAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OworICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpciA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgYWNfc3JjZGlyPSRhY190b3BfYnVpbGRkaXIkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXIkc3JjZGlyIDs7Citlc2FjCisKKyMgRG8gbm90IHVzZSBgY2QgZm9vICYmIHB3ZGAgdG8gY29tcHV0ZSBhYnNvbHV0ZSBwYXRocywgYmVjYXVzZQorIyB0aGUgZGlyZWN0b3JpZXMgbWF5IG5vdCBleGlzdC4KK2Nhc2UgYHB3ZGAgaW4KKy4pIGFjX2Fic19idWlsZGRpcj0iJGFjX2RpciI7OworKikKKyAgY2FzZSAiJGFjX2RpciIgaW4KKyAgLikgYWNfYWJzX2J1aWxkZGlyPWBwd2RgOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSBhY19hYnNfYnVpbGRkaXI9IiRhY19kaXIiOzsKKyAgKikgYWNfYWJzX2J1aWxkZGlyPWBwd2RgLyIkYWNfZGlyIjs7CisgIGVzYWM7OworZXNhYworY2FzZSAkYWNfYWJzX2J1aWxkZGlyIGluCisuKSBhY19hYnNfdG9wX2J1aWxkZGlyPSR7YWNfdG9wX2J1aWxkZGlyfS47OworKikKKyAgY2FzZSAke2FjX3RvcF9idWlsZGRpcn0uIGluCisgIC4pIGFjX2Fic190b3BfYnVpbGRkaXI9JGFjX2Fic19idWlsZGRpcjs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX3RvcF9idWlsZGRpcj0ke2FjX3RvcF9idWlsZGRpcn0uOzsKKyAgKikgYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfYWJzX2J1aWxkZGlyLyR7YWNfdG9wX2J1aWxkZGlyfS47OworICBlc2FjOzsKK2VzYWMKK2Nhc2UgJGFjX2Fic19idWlsZGRpciBpbgorLikgYWNfYWJzX3NyY2Rpcj0kYWNfc3JjZGlyOzsKKyopCisgIGNhc2UgJGFjX3NyY2RpciBpbgorICAuKSBhY19hYnNfc3JjZGlyPSRhY19hYnNfYnVpbGRkaXI7OworICBbXFwvXSogfCA/OltcXC9dKiApIGFjX2Fic19zcmNkaXI9JGFjX3NyY2Rpcjs7CisgICopIGFjX2Fic19zcmNkaXI9JGFjX2Fic19idWlsZGRpci8kYWNfc3JjZGlyOzsKKyAgZXNhYzs7Citlc2FjCitjYXNlICRhY19hYnNfYnVpbGRkaXIgaW4KKy4pIGFjX2Fic190b3Bfc3JjZGlyPSRhY190b3Bfc3JjZGlyOzsKKyopCisgIGNhc2UgJGFjX3RvcF9zcmNkaXIgaW4KKyAgLikgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX2Fic19idWlsZGRpcjs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3RvcF9zcmNkaXI7OworICAqKSBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfYWJzX2J1aWxkZGlyLyRhY190b3Bfc3JjZGlyOzsKKyAgZXNhYzs7Citlc2FjCisKKyAgICBjZCAkYWNfZGlyCisgICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmU7IG90aGVyd2lzZSBnZXQgQ3lnbnVzIHN0eWxlIGNvbmZpZ3VyZS4KKyAgICBpZiB0ZXN0IC1mICRhY19zcmNkaXIvY29uZmlndXJlLmdudTsgdGhlbgorICAgICAgZWNobworICAgICAgJFNIRUxMICRhY19zcmNkaXIvY29uZmlndXJlLmdudSAgLS1oZWxwPXJlY3Vyc2l2ZQorICAgIGVsaWYgdGVzdCAtZiAkYWNfc3JjZGlyL2NvbmZpZ3VyZTsgdGhlbgorICAgICAgZWNobworICAgICAgJFNIRUxMICRhY19zcmNkaXIvY29uZmlndXJlICAtLWhlbHA9cmVjdXJzaXZlCisgICAgZWxpZiB0ZXN0IC1mICRhY19zcmNkaXIvY29uZmlndXJlLmFjIHx8CisJICAgdGVzdCAtZiAkYWNfc3JjZGlyL2NvbmZpZ3VyZS5pbjsgdGhlbgorICAgICAgZWNobworICAgICAgJGFjX2NvbmZpZ3VyZSAtLWhlbHAKKyAgICBlbHNlCisgICAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IG5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX2RpciIgPiYyCisgICAgZmkKKyAgICBjZCAkYWNfcG9wZGlyCisgIGRvbmUKK2ZpCisKK3Rlc3QgLW4gIiRhY19pbml0X2hlbHAiICYmIGV4aXQgMAoraWYgJGFjX2luaXRfdmVyc2lvbjsgdGhlbgorICBjYXQgPDxcX0FDRU9GCitleHBhdCBjb25maWd1cmUgMi4wLjEKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi41OQorCitDb3B5cmlnaHQgKEMpIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorX0FDRU9GCisgIGV4aXQgMAorZmkKK2V4ZWMgNT5jb25maWcubG9nCitjYXQgPiY1IDw8X0FDRU9GCitUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQorcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KKworSXQgd2FzIGNyZWF0ZWQgYnkgZXhwYXQgJGFzX21lIDIuMC4xLCB3aGljaCB3YXMKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi41OS4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcworCisgICQgJDAgJEAKKworX0FDRU9GCit7CitjYXQgPDxfQVNVTkFNRQorIyMgLS0tLS0tLS0tICMjCisjIyBQbGF0Zm9ybS4gIyMKKyMjIC0tLS0tLS0tLSAjIworCitob3N0bmFtZSA9IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAordW5hbWUgLW0gPSBgKHVuYW1lIC1tKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtciA9IGAodW5hbWUgLXIpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1zID0gYCh1bmFtZSAtcykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXYgPSBgKHVuYW1lIC12KSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCisKKy91c3IvYmluL3VuYW1lIC1wID0gYCgvdXNyL2Jpbi91bmFtZSAtcCkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsICAgICB8fCBlY2hvIHVua25vd25gCisKKy9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGwgICAgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK2hvc3RpbmZvICAgICAgICAgICAgICAgPSBgKGhvc3RpbmZvKSAyPi9kZXYvbnVsbCAgICAgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy9iaW4vbWFjaGluZSAgICAgICAgICAgPSBgKC9iaW4vbWFjaGluZSkgMj4vZGV2L251bGwgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy9iaW4vdW5pdmVyc2UgICAgICAgICAgPSBgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKworX0FTVU5BTUUKKworYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBlY2hvICJQQVRIOiAkYXNfZGlyIgorZG9uZQorCit9ID4mNQorCitjYXQgPiY1IDw8X0FDRU9GCisKKworIyMgLS0tLS0tLS0tLS0gIyMKKyMjIENvcmUgdGVzdHMuICMjCisjIyAtLS0tLS0tLS0tLSAjIworCitfQUNFT0YKKworCisjIEtlZXAgYSB0cmFjZSBvZiB0aGUgY29tbWFuZCBsaW5lLgorIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCisjIFN0cmlwIG91dCAtLXNpbGVudCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gcmVjb3JkIGl0IGZvciBmdXR1cmUgcnVucy4KKyMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGEtY2hhcmFjdGVycy4KKyMgTWFrZSB0d28gcGFzc2VzIHRvIGFsbG93IGZvciBwcm9wZXIgZHVwbGljYXRlLWFyZ3VtZW50IHN1cHByZXNzaW9uLgorYWNfY29uZmlndXJlX2FyZ3M9CithY19jb25maWd1cmVfYXJnczA9CithY19jb25maWd1cmVfYXJnczE9CithY19zZXA9CithY19tdXN0X2tlZXBfbmV4dD1mYWxzZQorZm9yIGFjX3Bhc3MgaW4gMSAyCitkbworICBmb3IgYWNfYXJnCisgIGRvCisgICAgY2FzZSAkYWNfYXJnIGluCisgICAgLW5vLWNyZWF0ZSB8IC0tbm8tYyogfCAtbiB8IC1uby1yZWN1cnNpb24gfCAtLW5vLXIqKSBjb250aW51ZSA7OworICAgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgICAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgICBjb250aW51ZSA7OworICAgICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XCJcJ10qKQorICAgICAgYWNfYXJnPWBlY2hvICIkYWNfYXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OworICAgIGVzYWMKKyAgICBjYXNlICRhY19wYXNzIGluCisgICAgMSkgYWNfY29uZmlndXJlX2FyZ3MwPSIkYWNfY29uZmlndXJlX2FyZ3MwICckYWNfYXJnJyIgOzsKKyAgICAyKQorICAgICAgYWNfY29uZmlndXJlX2FyZ3MxPSIkYWNfY29uZmlndXJlX2FyZ3MxICckYWNfYXJnJyIKKyAgICAgIGlmIHRlc3QgJGFjX211c3Rfa2VlcF9uZXh0ID0gdHJ1ZTsgdGhlbgorCWFjX211c3Rfa2VlcF9uZXh0PWZhbHNlICMgR290IHZhbHVlLCBiYWNrIHRvIG5vcm1hbC4KKyAgICAgIGVsc2UKKwljYXNlICRhY19hcmcgaW4KKwkgICo9KiB8IC0tY29uZmlnLWNhY2hlIHwgLUMgfCAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSogXAorCSAgfCAtZW5hYmxlLSogfCAtLWVuYWJsZS0qIHwgLWdhcyB8IC0tZyogfCAtbmZwIHwgLS1uZiogXAorCSAgfCAtcSB8IC1xdWlldCB8IC0tcSogfCAtc2lsZW50IHwgLS1zaWwqIHwgLXYgfCAtdmVyYiogXAorCSAgfCAtd2l0aC0qIHwgLS13aXRoLSogfCAtd2l0aG91dC0qIHwgLS13aXRob3V0LSogfCAtLXgpCisJICAgIGNhc2UgIiRhY19jb25maWd1cmVfYXJnczAgIiBpbgorCSAgICAgICIkYWNfY29uZmlndXJlX2FyZ3MxIioiICckYWNfYXJnJyAiKiApIGNvbnRpbnVlIDs7CisJICAgIGVzYWMKKwkgICAgOzsKKwkgIC0qICkgYWNfbXVzdF9rZWVwX25leHQ9dHJ1ZSA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzJGFjX3NlcCckYWNfYXJnJyIKKyAgICAgICMgR2V0IHJpZCBvZiB0aGUgbGVhZGluZyBzcGFjZS4KKyAgICAgIGFjX3NlcD0iICIKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCitkb25lCiskYXNfdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MwIHx8IHRlc3QgIiR7YWNfY29uZmlndXJlX2FyZ3MwK3NldH0iICE9IHNldCB8fCB7IGFjX2NvbmZpZ3VyZV9hcmdzMD07IGV4cG9ydCBhY19jb25maWd1cmVfYXJnczA7IH0KKyRhc191bnNldCBhY19jb25maWd1cmVfYXJnczEgfHwgdGVzdCAiJHthY19jb25maWd1cmVfYXJnczErc2V0fSIgIT0gc2V0IHx8IHsgYWNfY29uZmlndXJlX2FyZ3MxPTsgZXhwb3J0IGFjX2NvbmZpZ3VyZV9hcmdzMTsgfQorCisjIFdoZW4gaW50ZXJydXB0ZWQgb3IgZXhpdCdkLCBjbGVhbnVwIHRlbXBvcmFyeSBmaWxlcywgYW5kIGNvbXBsZXRlCisjIGNvbmZpZy5sb2cuICBXZSByZW1vdmUgY29tbWVudHMgYmVjYXVzZSBhbnl3YXkgdGhlIHF1b3RlcyBpbiB0aGVyZQorIyB3b3VsZCBjYXVzZSBwcm9ibGVtcyBvciBsb29rIHVnbHkuCisjIFdBUk5JTkc6IEJlIHN1cmUgbm90IHRvIHVzZSBzaW5nbGUgcXVvdGVzIGluIHRoZXJlLCBhcyBzb21lIHNoZWxscywKKyMgc3VjaCBhcyBvdXIgRFUgNS4wIGZyaWVuZCwgd2lsbCB0aGVuIGBjbG9zZScgdGhlIHRyYXAuCit0cmFwICdleGl0X3N0YXR1cz0kPworICAjIFNhdmUgaW50byBjb25maWcubG9nIHNvbWUgaW5mb3JtYXRpb24gdGhhdCBtaWdodCBoZWxwIGluIGRlYnVnZ2luZy4KKyAgeworICAgIGVjaG8KKworICAgIGNhdCA8PFxfQVNCT1gKKyMjIC0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIENhY2hlIHZhcmlhYmxlcy4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0gIyMKK19BU0JPWAorICAgIGVjaG8KKyAgICAjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAoreworICAoc2V0KSAyPiYxIHwKKyAgICBjYXNlIGAoYWNfc3BhY2U9JyInIicgJyInIic7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCisgICAgKmFjX3NwYWNlPVwgKikKKyAgICAgIHNlZCAtbiBcCisJInMvJyInIicvJyInIidcXFxcJyInIicnIiciJy9nOworCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nIiciJ1xcMiciJyInL3AiCisgICAgICA7OworICAgICopCisgICAgICBzZWQgLW4gXAorCSJzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPVxcMi9wIgorICAgICAgOzsKKyAgICBlc2FjOworfQorICAgIGVjaG8KKworICAgIGNhdCA8PFxfQVNCT1gKKyMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBPdXRwdXQgdmFyaWFibGVzLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKK19BU0JPWAorICAgIGVjaG8KKyAgICBmb3IgYWNfdmFyIGluICRhY19zdWJzdF92YXJzCisgICAgZG8KKyAgICAgIGV2YWwgYWNfdmFsPSRgZWNobyAkYWNfdmFyYAorICAgICAgZWNobyAiJGFjX3Zhcj0nIiciJyRhY192YWwnIiciJyIKKyAgICBkb25lIHwgc29ydAorICAgIGVjaG8KKworICAgIGlmIHRlc3QgLW4gIiRhY19zdWJzdF9maWxlcyI7IHRoZW4KKyAgICAgIGNhdCA8PFxfQVNCT1gKKyMjIC0tLS0tLS0tLS0tLS0gIyMKKyMjIE91dHB1dCBmaWxlcy4gIyMKKyMjIC0tLS0tLS0tLS0tLS0gIyMKK19BU0JPWAorICAgICAgZWNobworICAgICAgZm9yIGFjX3ZhciBpbiAkYWNfc3Vic3RfZmlsZXMKKyAgICAgIGRvCisJZXZhbCBhY192YWw9JGBlY2hvICRhY192YXJgCisJZWNobyAiJGFjX3Zhcj0nIiciJyRhY192YWwnIiciJyIKKyAgICAgIGRvbmUgfCBzb3J0CisgICAgICBlY2hvCisgICAgZmkKKworICAgIGlmIHRlc3QgLXMgY29uZmRlZnMuaDsgdGhlbgorICAgICAgY2F0IDw8XF9BU0JPWAorIyMgLS0tLS0tLS0tLS0gIyMKKyMjIGNvbmZkZWZzLmguICMjCisjIyAtLS0tLS0tLS0tLSAjIworX0FTQk9YCisgICAgICBlY2hvCisgICAgICBzZWQgIi9eJC9kIiBjb25mZGVmcy5oIHwgc29ydAorICAgICAgZWNobworICAgIGZpCisgICAgdGVzdCAiJGFjX3NpZ25hbCIgIT0gMCAmJgorICAgICAgZWNobyAiJGFzX21lOiBjYXVnaHQgc2lnbmFsICRhY19zaWduYWwiCisgICAgZWNobyAiJGFzX21lOiBleGl0ICRleGl0X3N0YXR1cyIKKyAgfSA+JjUKKyAgcm0gLWYgY29yZSAqLmNvcmUgJiYKKyAgcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29uZiQkKiAkYWNfY2xlYW5fZmlsZXMgJiYKKyAgICBleGl0ICRleGl0X3N0YXR1cworICAgICAnIDAKK2ZvciBhY19zaWduYWwgaW4gMSAyIDEzIDE1OyBkbworICB0cmFwICdhY19zaWduYWw9JyRhY19zaWduYWwnOyB7IChleGl0IDEpOyBleGl0IDE7IH0nICRhY19zaWduYWwKK2RvbmUKK2FjX3NpZ25hbD0wCisKKyMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCitybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKKyMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgorZWNobyA+Y29uZmRlZnMuaAorCisjIFByZWRlZmluZWQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcy4KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX05BTUUgIiRQQUNLQUdFX05BTUUiCitfQUNFT0YKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiJFBBQ0tBR0VfVEFSTkFNRSIKK19BQ0VPRgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIkUEFDS0FHRV9WRVJTSU9OIgorX0FDRU9GCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1NUUklORyAiJFBBQ0tBR0VfU1RSSU5HIgorX0FDRU9GCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiJFBBQ0tBR0VfQlVHUkVQT1JUIgorX0FDRU9GCisKKworIyBMZXQgdGhlIHNpdGUgZmlsZSBzZWxlY3QgYW4gYWx0ZXJuYXRlIGNhY2hlIGZpbGUgaWYgaXQgd2FudHMgdG8uCisjIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgoraWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgorICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZWxzZQorICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZmkKK2ZpCitmb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KKyAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNjt9CisgICAgc2VkICdzL14vfCAvJyAiJGFjX3NpdGVfZmlsZSIgPiY1CisgICAgLiAiJGFjX3NpdGVfZmlsZSIKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgICMgU29tZSB2ZXJzaW9ucyBvZiBiYXNoIHdpbGwgZmFpbCB0byBzb3VyY2UgL2Rldi9udWxsIChzcGVjaWFsCisgICMgZmlsZXMgYWN0dWFsbHkpLCBzbyB3ZSBhdm9pZCBkb2luZyB0aGF0LgorICBpZiB0ZXN0IC1mICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKK2VjaG8gIiRhc19tZTogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgICBjYXNlICRjYWNoZV9maWxlIGluCisgICAgICBbXFwvXSogfCA/OltcXC9dKiApIC4gJGNhY2hlX2ZpbGU7OworICAgICAgKikgICAgICAgICAgICAgICAgICAgICAgLiAuLyRjYWNoZV9maWxlOzsKKyAgICBlc2FjCisgIGZpCitlbHNlCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKK2VjaG8gIiRhc19tZTogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9CisgID4kY2FjaGVfZmlsZQorZmkKKworIyBDaGVjayB0aGF0IHRoZSBwcmVjaW91cyB2YXJpYWJsZXMgc2F2ZWQgaW4gdGhlIGNhY2hlIGhhdmUga2VwdCB0aGUgc2FtZQorIyB2YWx1ZS4KK2FjX2NhY2hlX2NvcnJ1cHRlZD1mYWxzZQorZm9yIGFjX3ZhciBpbiBgKHNldCkgMj4mMSB8CisJICAgICAgIHNlZCAtbiAncy9eYWNfZW52X1woW2EtekEtWl8wLTldKlwpX3NldD0uKi9cMS9wJ2A7IGRvCisgIGV2YWwgYWNfb2xkX3NldD1cJGFjX2N2X2Vudl8ke2FjX3Zhcn1fc2V0CisgIGV2YWwgYWNfbmV3X3NldD1cJGFjX2Vudl8ke2FjX3Zhcn1fc2V0CisgIGV2YWwgYWNfb2xkX3ZhbD0iXCRhY19jdl9lbnZfJHthY192YXJ9X3ZhbHVlIgorICBldmFsIGFjX25ld192YWw9IlwkYWNfZW52XyR7YWNfdmFyfV92YWx1ZSIKKyAgY2FzZSAkYWNfb2xkX3NldCwkYWNfbmV3X3NldCBpbgorICAgIHNldCwpCisgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgc2V0IHRvIFxgJGFjX29sZF92YWwnIGluIHRoZSBwcmV2aW91cyBydW4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgc2V0IHRvIFxgJGFjX29sZF92YWwnIGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9CisgICAgICBhY19jYWNoZV9jb3JydXB0ZWQ9OiA7OworICAgICxzZXQpCisgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgbm90IHNldCBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KKyAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7CisgICAgLCk7OworICAgICopCisgICAgICBpZiB0ZXN0ICJ4JGFjX29sZF92YWwiICE9ICJ4JGFjX25ld192YWwiOyB0aGVuCisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiYyO30KKwl7IGVjaG8gIiRhc19tZTokTElORU5POiAgIGZvcm1lciB2YWx1ZTogICRhY19vbGRfdmFsIiA+JjUKK2VjaG8gIiRhc19tZTogICBmb3JtZXIgdmFsdWU6ICAkYWNfb2xkX3ZhbCIgPiYyO30KKwl7IGVjaG8gIiRhc19tZTokTElORU5POiAgIGN1cnJlbnQgdmFsdWU6ICRhY19uZXdfdmFsIiA+JjUKK2VjaG8gIiRhc19tZTogICBjdXJyZW50IHZhbHVlOiAkYWNfbmV3X3ZhbCIgPiYyO30KKwlhY19jYWNoZV9jb3JydXB0ZWQ9OgorICAgICAgZmk7OworICBlc2FjCisgICMgUGFzcyBwcmVjaW91cyB2YXJpYWJsZXMgdG8gY29uZmlnLnN0YXR1cy4KKyAgaWYgdGVzdCAiJGFjX25ld19zZXQiID0gc2V0OyB0aGVuCisgICAgY2FzZSAkYWNfbmV3X3ZhbCBpbgorICAgICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XCJcJ10qKQorICAgICAgYWNfYXJnPSRhY192YXI9YGVjaG8gIiRhY19uZXdfdmFsIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OworICAgICopIGFjX2FyZz0kYWNfdmFyPSRhY19uZXdfdmFsIDs7CisgICAgZXNhYworICAgIGNhc2UgIiAkYWNfY29uZmlndXJlX2FyZ3MgIiBpbgorICAgICAgKiIgJyRhY19hcmcnICIqKSA7OyAjIEF2b2lkIGR1cHMuICBVc2Ugb2YgcXVvdGVzIGVuc3VyZXMgYWNjdXJhY3kuCisgICAgICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKKyAgICBlc2FjCisgIGZpCitkb25lCitpZiAkYWNfY2FjaGVfY29ycnVwdGVkOyB0aGVuCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2hhbmdlcyBpbiB0aGUgZW52aXJvbm1lbnQgY2FuIGNvbXByb21pc2UgdGhlIGJ1aWxkIiA+JjI7fQorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBydW4gXGBtYWtlIGRpc3RjbGVhbicgYW5kL29yIFxgcm0gJGNhY2hlX2ZpbGUnIGFuZCBzdGFydCBvdmVyIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IHJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK2FjX2F1eF9kaXI9Citmb3IgYWNfZGlyIGluIGNvbmZ0b29scyAkc3JjZGlyL2NvbmZ0b29sczsgZG8KKyAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAkYWNfZGlyL3NodG9vbDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL3NodG9vbCBpbnN0YWxsIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIGNvbmZ0b29scyAkc3JjZGlyL2NvbmZ0b29scyIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gY29uZnRvb2xzICRzcmNkaXIvY29uZnRvb2xzIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQorYWNfY29uZmlnX2d1ZXNzPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzIgorYWNfY29uZmlnX3N1Yj0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiCithY19jb25maWd1cmU9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWd1cmUiICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KKworCisKKworTElCQ1VSUkVOVD02CitMSUJSRVZJU0lPTj0yCitMSUJBR0U9NQorCisgICAgICAgICAgYWNfY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyBleHBhdF9jb25maWcuaCIKKworCisjIGxpYnRvb2wubTQgLSBDb25maWd1cmUgbGlidG9vbCBmb3IgdGhlIGhvc3Qgc3lzdGVtLiAtKi1BdXRvY29uZi0qLQorIyMgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUKKyMjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyMgT3JpZ2luYWxseSBieSBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKKyMjCisjIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcworIyMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0CisjIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNDggQUNfUFJPR19MSUJUT09MCisKKworIyBBQ19QUk9WSURFX0lGRUxTRShNQUNSTy1OQU1FLCBJRi1QUk9WSURFRCwgSUYtTk9ULVBST1ZJREVEKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJZiB0aGlzIG1hY3JvIGlzIG5vdCBkZWZpbmVkIGJ5IEF1dG9jb25mLCBkZWZpbmUgaXQgaGVyZS4KKworCisKKyMgQUNfUFJPR19MSUJUT09MCisjIC0tLS0tLS0tLS0tLS0tLQorIyBBQ19QUk9HX0xJQlRPT0wKKworCisjIF9BQ19QUk9HX0xJQlRPT0wKKyMgLS0tLS0tLS0tLS0tLS0tLQorIyBfQUNfUFJPR19MSUJUT09MCisKKworIyBBQ19MSUJUT09MX1NFVFVQCisjIC0tLS0tLS0tLS0tLS0tLS0KKyMgQUNfTElCVE9PTF9TRVRVUAorCisKKyMgX0xUX0FDX1NZU19DT01QSUxFUgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9MVF9BQ19TWVNfQ09NUElMRVIKKworCisjIF9MVF9DQ19CQVNFTkFNRShDQykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDYWxjdWxhdGUgY2NfYmFzZW5hbWUuICBTa2lwIGtub3duIGNvbXBpbGVyIHdyYXBwZXJzIGFuZCBjcm9zcy1wcmVmaXguCisKKworCisjIF9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgZm9yIGNvbXBpbGVyIGJvaWxlcnBsYXRlIG91dHB1dCBvciB3YXJuaW5ncyB3aXRoCisjIHRoZSBzaW1wbGUgY29tcGlsZXIgdGVzdCBjb2RlLgorIyBfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKKworCisjIF9MVF9MSU5LRVJfQk9JTEVSUExBVEUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayBmb3IgbGlua2VyIGJvaWxlcnBsYXRlIG91dHB1dCBvciB3YXJuaW5ncyB3aXRoCisjIHRoZSBzaW1wbGUgbGluayB0ZXN0IGNvZGUuCisjIF9MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworCisjIF9MVF9BQ19TWVNfTElCUEFUSF9BSVgKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMaW5rcyBhIG1pbmltYWwgcHJvZ3JhbSBhbmQgY2hlY2tzIHRoZSBleGVjdXRhYmxlCisjIGZvciB0aGUgc3lzdGVtIGRlZmF1bHQgaGFyZGNvZGVkIGxpYnJhcnkgcGF0aC4gSW4gbW9zdCBjYXNlcywKKyMgdGhpcyBpcyAvdXNyL2xpYjovbGliLCBidXQgd2hlbiB0aGUgTVBJIGNvbXBpbGVycyBhcmUgdXNlZAorIyB0aGUgbG9jYXRpb24gb2YgdGhlIGNvbW11bmljYXRpb24gYW5kIE1QSSBsaWJzIGFyZSBpbmNsdWRlZCB0b28uCisjIElmIHdlIGRvbid0IGZpbmQgYW55dGhpbmcsIHVzZSB0aGUgZGVmYXVsdCBsaWJyYXJ5IHBhdGggYWNjb3JkaW5nCisjIHRvIHRoZSBhaXggbGQgbWFudWFsLgorIyBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYCisKKworIyBfTFRfQUNfU0hFTExfSU5JVChBUkcpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX0xUX0FDX1NIRUxMX0lOSVQKKworCisjIF9MVF9BQ19QUk9HX0VDSE9fQkFDS1NMQVNICisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFkZCBzb21lIGNvZGUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBnZW5lcmF0ZWQgY29uZmlndXJlIHNjcmlwdCB3aGljaAorIyB3aWxsIGZpbmQgYW4gZWNobyBjb21tYW5kIHdoaWNoIGRvZXNuJ3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgorIyBfTFRfQUNfUFJPR19FQ0hPX0JBQ0tTTEFTSAorCisKKyMgX0xUX0FDX0xPQ0sKKyMgLS0tLS0tLS0tLS0KKyMgX0xUX0FDX0xPQ0sKKworCisjIEFDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OKE1FU1NBR0UsIFZBUklBQkxFLU5BTUUsIEZMQUdTLAorIwkJW09VVFBVVC1GSUxFXSwgW0FDVElPTi1TVUNDRVNTXSwgW0FDVElPTi1GQUlMVVJFXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBjb21waWxlciBvcHRpb24gd29ya3MKKyMgQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT04KKworCisjIEFDX0xJQlRPT0xfTElOS0VSX09QVElPTihNRVNTQUdFLCBWQVJJQUJMRS1OQU1FLCBGTEFHUywKKyMgICAgICAgICAgICAgICAgICAgICAgICAgIFtBQ1RJT04tU1VDQ0VTU10sIFtBQ1RJT04tRkFJTFVSRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBjb21waWxlciBvcHRpb24gd29ya3MKKyMgQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OCisKKworIyBBQ19MSUJUT09MX1NZU19NQVhfQ01EX0xFTgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBQ19MSUJUT09MX1NZU19NQVhfQ01EX0xFTgorCisKKyMgX0xUX0FDX0NIRUNLX0RMRkNOCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBfTFRfQUNfQ0hFQ0tfRExGQ04KKworCisjIF9MVF9BQ19UUllfRExPUEVOX1NFTEYgKEFDVElPTi1JRi1UUlVFLCBBQ1RJT04tSUYtVFJVRS1XLVVTQ09SRSwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ1RJT04tSUYtRkFMU0UsIEFDVElPTi1JRi1DUk9TUy1DT01QSUxJTkcpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfTFRfQUNfVFJZX0RMT1BFTl9TRUxGCisKKworIyBBQ19MSUJUT09MX0RMT1BFTl9TRUxGCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQUNfTElCVE9PTF9ETE9QRU5fU0VMRgorCisKKyMgQUNfTElCVE9PTF9QUk9HX0NDX0NfTyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB0byBzZWUgaWYgb3B0aW9ucyAtYyBhbmQgLW8gYXJlIHNpbXVsdGFuZW91c2x5IHN1cHBvcnRlZCBieSBjb21waWxlcgorIyBBQ19MSUJUT09MX1BST0dfQ0NfQ19PCisKKworIyBBQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1MoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB0byBzZWUgaWYgd2UgY2FuIGRvIGhhcmQgbGlua3MgdG8gbG9jayBzb21lIGZpbGVzIGlmIG5lZWRlZAorIyBBQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1MKKworCisjIEFDX0xJQlRPT0xfT0JKRElSCisjIC0tLS0tLS0tLS0tLS0tLS0tCisjIEFDX0xJQlRPT0xfT0JKRElSCisKKworIyBBQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSChbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgaGFyZGNvZGluZyBhdHRyaWJ1dGVzLgorIyBBQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSAorCisKKyMgQUNfTElCVE9PTF9TWVNfTElCX1NUUklQCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBQ19MSUJUT09MX1NZU19MSUJfU1RSSVAKKworCisjIEFDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBPUlRNRSBGaWxsIGluIHlvdXIgbGQuc28gY2hhcmFjdGVyaXN0aWNzCisjIEFDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSCisKKworIyBfTFRfQUNfVEFHQ09ORklHCisjIC0tLS0tLS0tLS0tLS0tLS0KKyMgX0xUX0FDX1RBR0NPTkZJRworCisKKyMgQUNfTElCVE9PTF9ETE9QRU4KKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgZW5hYmxlIGNoZWNrcyBmb3IgZGxvcGVuIHN1cHBvcnQKKyMgQUNfTElCVE9PTF9ETE9QRU4KKworCisjIEFDX0xJQlRPT0xfV0lOMzJfRExMCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGRlY2xhcmUgcGFja2FnZSBzdXBwb3J0IGZvciBidWlsZGluZyB3aW4zMiBETExzCisjIEFDX0xJQlRPT0xfV0lOMzJfRExMCisKKworIyBBQ19FTkFCTEVfU0hBUkVEKFtERUZBVUxUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc2hhcmVkIGZsYWcKKyMgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGB5ZXMnLgorIyBBQ19FTkFCTEVfU0hBUkVECisKKworIyBBQ19ESVNBQkxFX1NIQVJFRAorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBzZXQgdGhlIGRlZmF1bHQgc2hhcmVkIGZsYWcgdG8gLS1kaXNhYmxlLXNoYXJlZAorIyBBQ19ESVNBQkxFX1NIQVJFRAorCisKKyMgQUNfRU5BQkxFX1NUQVRJQyhbREVGQVVMVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXN0YXRpYyBmbGFnCisjIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBgeWVzJy4KKyMgQUNfRU5BQkxFX1NUQVRJQworCisKKyMgQUNfRElTQUJMRV9TVEFUSUMKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgc2V0IHRoZSBkZWZhdWx0IHN0YXRpYyBmbGFnIHRvIC0tZGlzYWJsZS1zdGF0aWMKKyMgQUNfRElTQUJMRV9TVEFUSUMKKworCisjIEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwoW0RFRkFVTFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1mYXN0LWluc3RhbGwgZmxhZworIyBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYHllcycuCisjIEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwKKworCisjIEFDX0RJU0FCTEVfRkFTVF9JTlNUQUxMCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHNldCB0aGUgZGVmYXVsdCB0byAtLWRpc2FibGUtZmFzdC1pbnN0YWxsCisjIEFDX0RJU0FCTEVfRkFTVF9JTlNUQUxMCisKKworIyBBQ19MSUJUT09MX1BJQ01PREUoW01PREVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBpbXBsZW1lbnQgdGhlIC0td2l0aC1waWMgZmxhZworIyBNT0RFIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYGJvdGgnLgorIyBBQ19MSUJUT09MX1BJQ01PREUKKworCisjIEFDX1BST0dfRUdSRVAKKyMgLS0tLS0tLS0tLS0tLQorIyBUaGlzIGlzIHByZWRlZmluZWQgc3RhcnRpbmcgd2l0aCBBdXRvY29uZiAyLjU0LCBzbyB0aGlzIGNvbmRpdGlvbmFsCisjIGRlZmluaXRpb24gY2FuIGJlIHJlbW92ZWQgb25jZSB3ZSByZXF1aXJlIEF1dG9jb25mIDIuNTQgb3IgbGF0ZXIuCisKKworCisjIEFDX1BBVEhfVE9PTF9QUkVGSVgKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBmaW5kIGEgZmlsZSBwcm9ncmFtIHdoaWNoIGNhbiByZWNvZ25pc2Ugc2hhcmVkIGxpYnJhcnkKKyMgQUNfUEFUSF9UT09MX1BSRUZJWAorCisKKyMgQUNfUEFUSF9NQUdJQworIyAtLS0tLS0tLS0tLS0tCisjIGZpbmQgYSBmaWxlIHByb2dyYW0gd2hpY2ggY2FuIHJlY29nbmlzZSBhIHNoYXJlZCBsaWJyYXJ5CisjIEFDX1BBVEhfTUFHSUMKKworCisjIEFDX1BST0dfTEQKKyMgLS0tLS0tLS0tLQorIyBmaW5kIHRoZSBwYXRobmFtZSB0byB0aGUgR05VIG9yIG5vbi1HTlUgbGlua2VyCisjIEFDX1BST0dfTEQKKworCisjIEFDX1BST0dfTERfR05VCisjIC0tLS0tLS0tLS0tLS0tCisjIEFDX1BST0dfTERfR05VCisKKworIyBBQ19QUk9HX0xEX1JFTE9BRF9GTEFHCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZmluZCByZWxvYWQgZmxhZyBmb3IgbGlua2VyCisjICAgLS0gUE9SVE1FIFNvbWUgbGlua2VycyBtYXkgbmVlZCBhIGRpZmZlcmVudCByZWxvYWQgZmxhZy4KKyMgQUNfUFJPR19MRF9SRUxPQURfRkxBRworCisKKyMgQUNfREVQTElCU19DSEVDS19NRVRIT0QKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaG93IHRvIGNoZWNrIGZvciBsaWJyYXJ5IGRlcGVuZGVuY2llcworIyAgLS0gUE9SVE1FIGZpbGwgaW4gd2l0aCB0aGUgZHluYW1pYyBsaWJyYXJ5IGNoYXJhY3RlcmlzdGljcworIyBBQ19ERVBMSUJTX0NIRUNLX01FVEhPRAorCisKKyMgQUNfUFJPR19OTQorIyAtLS0tLS0tLS0tCisjIGZpbmQgdGhlIHBhdGhuYW1lIHRvIGEgQlNELWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIKKyMgQUNfUFJPR19OTQorCisKKyMgQUNfQ0hFQ0tfTElCTQorIyAtLS0tLS0tLS0tLS0tCisjIGNoZWNrIGZvciBtYXRoIGxpYnJhcnkKKyMgQUNfQ0hFQ0tfTElCTQorCisKKyMgQUNfTElCTFRETF9DT05WRU5JRU5DRShbRElSRUNUT1JZXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvciB0aGUgbGlibHRkbCBjb252ZW5pZW5jZSBsaWJyYXJ5IGFuZAorIyBMVERMSU5DTCB0byB0aGUgaW5jbHVkZSBmbGFncyBmb3IgdGhlIGxpYmx0ZGwgaGVhZGVyIGFuZCBhZGRzCisjIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UgdG8gdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMuICBOb3RlIHRoYXQKKyMgQUNfQ09ORklHX1NVQkRJUlMgaXMgbm90IGNhbGxlZCBoZXJlLiAgSWYgRElSRUNUT1JZIGlzIG5vdCBwcm92aWRlZCwKKyMgaXQgaXMgYXNzdW1lZCB0byBiZSBgbGlibHRkbCcuICBMSUJMVERMIHdpbGwgYmUgcHJlZml4ZWQgd2l0aAorIyAnJHt0b3BfYnVpbGRkaXJ9LycgYW5kIExURExJTkNMIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCAnJHt0b3Bfc3JjZGlyfS8nCisjIChub3RlIHRoZSBzaW5nbGUgcXVvdGVzISkuICBJZiB5b3VyIHBhY2thZ2UgaXMgbm90IGZsYXQgYW5kIHlvdSdyZSBub3QKKyMgdXNpbmcgYXV0b21ha2UsIGRlZmluZSB0b3BfYnVpbGRkaXIgYW5kIHRvcF9zcmNkaXIgYXBwcm9wcmlhdGVseSBpbgorIyB0aGUgTWFrZWZpbGVzLgorIyBBQ19MSUJMVERMX0NPTlZFTklFTkNFCisKKworIyBBQ19MSUJMVERMX0lOU1RBTExBQkxFKFtESVJFQ1RPUlldKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBzZXRzIExJQkxUREwgdG8gdGhlIGxpbmsgZmxhZ3MgZm9yIHRoZSBsaWJsdGRsIGluc3RhbGxhYmxlIGxpYnJhcnkgYW5kCisjIExURExJTkNMIHRvIHRoZSBpbmNsdWRlIGZsYWdzIGZvciB0aGUgbGlibHRkbCBoZWFkZXIgYW5kIGFkZHMKKyMgLS1lbmFibGUtbHRkbC1pbnN0YWxsIHRvIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0CisjIEFDX0NPTkZJR19TVUJESVJTIGlzIG5vdCBjYWxsZWQgaGVyZS4gIElmIERJUkVDVE9SWSBpcyBub3QgcHJvdmlkZWQsCisjIGFuZCBhbiBpbnN0YWxsZWQgbGlibHRkbCBpcyBub3QgZm91bmQsIGl0IGlzIGFzc3VtZWQgdG8gYmUgYGxpYmx0ZGwnLgorIyBMSUJMVERMIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCAnJHt0b3BfYnVpbGRkaXJ9LycjIGFuZCBMVERMSU5DTCB3aXRoCisjICcke3RvcF9zcmNkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKS4gIElmIHlvdXIgcGFja2FnZSBpcyBub3QKKyMgZmxhdCBhbmQgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZGRpciBhbmQgdG9wX3NyY2RpcgorIyBhcHByb3ByaWF0ZWx5IGluIHRoZSBNYWtlZmlsZXMuCisjIEluIHRoZSBmdXR1cmUsIHRoaXMgbWFjcm8gbWF5IGhhdmUgdG8gYmUgY2FsbGVkIGFmdGVyIEFDX1BST0dfTElCVE9PTC4KKyMgQUNfTElCTFRETF9JTlNUQUxMQUJMRQorCisKKyMgQUNfTElCVE9PTF9DWFgKKyMgLS0tLS0tLS0tLS0tLS0KKyMgZW5hYmxlIHN1cHBvcnQgZm9yIEMrKyBsaWJyYXJpZXMKKyMgQUNfTElCVE9PTF9DWFgKKworCisjIF9MVF9BQ19MQU5HX0NYWAorIyAtLS0tLS0tLS0tLS0tLS0KKyMgX0xUX0FDX0xBTkdfQ1hYCisKKyMgX0xUX0FDX1BST0dfQ1hYQ1BQCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBfTFRfQUNfUFJPR19DWFhDUFAKKworIyBBQ19MSUJUT09MX0Y3NworIyAtLS0tLS0tLS0tLS0tLQorIyBlbmFibGUgc3VwcG9ydCBmb3IgRm9ydHJhbiA3NyBsaWJyYXJpZXMKKyMgQUNfTElCVE9PTF9GNzcKKworCisjIF9MVF9BQ19MQU5HX0Y3NworIyAtLS0tLS0tLS0tLS0tLS0KKyMgX0xUX0FDX0xBTkdfRjc3CisKKworIyBBQ19MSUJUT09MX0dDSgorIyAtLS0tLS0tLS0tLS0tLQorIyBlbmFibGUgc3VwcG9ydCBmb3IgR0NKIGxpYnJhcmllcworIyBBQ19MSUJUT09MX0dDSgorCisKKyMgX0xUX0FDX0xBTkdfR0NKCisjIC0tLS0tLS0tLS0tLS0tLQorIyBfTFRfQUNfTEFOR19HQ0oKKworCisjIEFDX0xJQlRPT0xfUkMKKyMgLS0tLS0tLS0tLS0tLQorIyBlbmFibGUgc3VwcG9ydCBmb3IgV2luZG93cyByZXNvdXJjZSBmaWxlcworIyBBQ19MSUJUT09MX1JDCisKKworIyBBQ19MSUJUT09MX0xBTkdfQ19DT05GSUcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcnMgZm9yIHRoZSBDIGNvbXBpbGVyIGFyZQorIyBzdWl0YWJseSBkZWZpbmVkLiAgVGhvc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieQorIyBBQ19MSUJUT09MX0NPTkZJRyB0byB3cml0ZSB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCisKKyMgQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHCisKKworIyBBQ19MSUJUT09MX0xBTkdfQ1hYX0NPTkZJRworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJzIGZvciB0aGUgQyBjb21waWxlciBhcmUKKyMgc3VpdGFibHkgZGVmaW5lZC4gIFRob3NlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkKKyMgQUNfTElCVE9PTF9DT05GSUcgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorCisjIEFDX0xJQlRPT0xfTEFOR19DWFhfQ09ORklHCisKKyMgQUNfTElCVE9PTF9QT1NUREVQX1BSRURFUChbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGaWd1cmUgb3V0ICJoaWRkZW4iIGxpYnJhcnkgZGVwZW5kZW5jaWVzIGZyb20gdmVyYm9zZQorIyBjb21waWxlciBvdXRwdXQgd2hlbiBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisjIFBhcnNlIHRoZSBjb21waWxlciBvdXRwdXQgYW5kIGV4dHJhY3QgdGhlIG5lY2Vzc2FyeQorIyBvYmplY3RzLCBsaWJyYXJpZXMgYW5kIGxpYnJhcnkgZmxhZ3MuCisjIEFDX0xJQlRPT0xfUE9TVERFUF9QUkVERVAKKworIyBBQ19MSUJUT09MX0xBTkdfRjc3X0NPTkZJRworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJzIGZvciB0aGUgQyBjb21waWxlciBhcmUKKyMgc3VpdGFibHkgZGVmaW5lZC4gIFRob3NlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkKKyMgQUNfTElCVE9PTF9DT05GSUcgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorCisjIEFDX0xJQlRPT0xfTEFOR19GNzdfQ09ORklHCisKKworIyBBQ19MSUJUT09MX0xBTkdfR0NKX0NPTkZJRworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJzIGZvciB0aGUgQyBjb21waWxlciBhcmUKKyMgc3VpdGFibHkgZGVmaW5lZC4gIFRob3NlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkKKyMgQUNfTElCVE9PTF9DT05GSUcgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorCisjIEFDX0xJQlRPT0xfTEFOR19HQ0pfQ09ORklHCisKKworIyBBQ19MSUJUT09MX0xBTkdfUkNfQ09ORklHCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFycyBmb3IgdGhlIFdpbmRvd3MgcmVzb3VyY2UgY29tcGlsZXIgYXJlCisjIHN1aXRhYmx5IGRlZmluZWQuICBUaG9zZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5CisjIEFDX0xJQlRPT0xfQ09ORklHIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KKworIyBBQ19MSUJUT09MX0xBTkdfUkNfQ09ORklHCisKKworIyBBQ19MSUJUT09MX0NPTkZJRyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSWYgVEFHTkFNRSBpcyBub3QgcGFzc2VkLCB0aGVuIGNyZWF0ZSBhbiBpbml0aWFsIGxpYnRvb2wgc2NyaXB0CisjIHdpdGggYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgdW50YWdnZWQgY29uZmlnIHZhcnMuICBPdGhlcndpc2UKKyMgYWRkIGNvZGUgdG8gY29uZmlnLnN0YXR1cyBmb3IgYXBwZW5kaW5nIHRoZSBjb25maWd1cmF0aW9uIG5hbWVkIGJ5CisjIFRBR05BTUUgZnJvbSB0aGUgbWF0Y2hpbmcgdGFnZ2VkIGNvbmZpZyB2YXJzLgorIyBBQ19MSUJUT09MX0NPTkZJRworCisKKyMgQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX05PX1JUVEkoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9OT19SVFRJCisKKworIyBBQ19MSUJUT09MX1NZU19HTE9CQUxfU1lNQk9MX1BJUEUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIyBBQ19MSUJUT09MX1NZU19HTE9CQUxfU1lNQk9MX1BJUEUKKworCisjIEFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisKKyMgQUNfTElCVE9PTF9QUk9HX0xEX1NITElCUyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZWUgaWYgdGhlIGxpbmtlciBzdXBwb3J0cyBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgorIyBBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTCisKKworIyBfTFRfQUNfRklMRV9MVERMTF9DCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQmUgY2FyZWZ1bCB0aGF0IHRoZSBzdGFydCBtYXJrZXIgYWx3YXlzIGZvbGxvd3MgYSBuZXdsaW5lLgorIyBfTFRfQUNfRklMRV9MVERMTF9DCisKKworIyBfTFRfQUNfVEFHVkFSKFZBUk5BTUUsIFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworCisjIG9sZCBuYW1lcworCisKKworCisKKworCisKKyMgVGhpcyBpcyBqdXN0IHRvIHNpbGVuY2UgYWNsb2NhbCBhYm91dCB0aGUgbWFjcm8gbm90IGJlaW5nIHVzZWQKKworCisKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOT1RFOiBUaGlzIG1hY3JvIGhhcyBiZWVuIHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGludG8gICAjCisjICBHTlUgQXV0b2NvbmYgYXMgQUNfUFJPR19TRUQuICBXaGVuIGl0IGlzIGF2YWlsYWJsZSBpbiAgICMKKyMgIGEgcmVsZWFzZWQgdmVyc2lvbiBvZiBBdXRvY29uZiB3ZSBzaG91bGQgcmVtb3ZlIHRoaXMgICAgIworIyAgbWFjcm8gYW5kIHVzZSBpdCBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTFRfQUNfUFJPR19TRUQKKyMgLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgZm9yIGEgZnVsbHktZnVuY3Rpb25hbCBzZWQgcHJvZ3JhbSwgdGhhdCB0cnVuY2F0ZXMKKyMgYXMgZmV3IGNoYXJhY3RlcnMgYXMgcG9zc2libGUuICBQcmVmZXIgR05VIHNlZCBpZiBmb3VuZC4KKworCisKKworCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCBvciAtLWRpc2FibGUtc2hhcmVkIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NoYXJlZCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2hhcmVkIgorICBwPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJGVuYWJsZXZhbCBpbgorICAgIHllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKKyAgICBubykgZW5hYmxlX3NoYXJlZD1ubyA7OworICAgICopCisgICAgICBlbmFibGVfc2hhcmVkPW5vCisgICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKKyAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKwlJRlM9IiRsdF9zYXZlX2lmcyIKKwlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorCSAgZW5hYmxlX3NoYXJlZD15ZXMKKwlmaQorICAgICAgZG9uZQorICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICA7OworICAgIGVzYWMKK2Vsc2UKKyAgZW5hYmxlX3NoYXJlZD15ZXMKK2ZpOworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc3RhdGljIG9yIC0tZGlzYWJsZS1zdGF0aWMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc3RhdGljK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zdGF0aWMiCisgIHA9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkZW5hYmxldmFsIGluCisgICAgeWVzKSBlbmFibGVfc3RhdGljPXllcyA7OworICAgIG5vKSBlbmFibGVfc3RhdGljPW5vIDs7CisgICAgKikKKyAgICAgZW5hYmxlX3N0YXRpYz1ubworICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKwkgIGVuYWJsZV9zdGF0aWM9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjCitlbHNlCisgIGVuYWJsZV9zdGF0aWM9eWVzCitmaTsKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBvciAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2Zhc3RfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfZmFzdF9pbnN0YWxsIgorICBwPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJGVuYWJsZXZhbCBpbgorICAgIHllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKKyAgICBubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OworICAgICopCisgICAgICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCisgICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKKyAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKwlJRlM9IiRsdF9zYXZlX2lmcyIKKwlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorCSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKKwlmaQorICAgICAgZG9uZQorICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICA7OworICAgIGVzYWMKK2Vsc2UKKyAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKK2ZpOworCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCiskYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMSB8fAorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuICRhY19jb25maWdfc3ViIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gJGFjX2NvbmZpZ19zdWIiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2J1aWxkK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2N2X2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcwordGVzdCAteiAiJGFjX2N2X2J1aWxkX2FsaWFzIiAmJgorICBhY19jdl9idWlsZF9hbGlhcz1gJGFjX2NvbmZpZ19ndWVzc2AKK3Rlc3QgLXogIiRhY19jdl9idWlsZF9hbGlhcyIgJiYKKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBndWVzcyBidWlsZCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorYWNfY3ZfYnVpbGQ9YCRhY19jb25maWdfc3ViICRhY19jdl9idWlsZF9hbGlhc2AgfHwKKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogJGFjX2NvbmZpZ19zdWIgJGFjX2N2X2J1aWxkX2FsaWFzIGZhaWxlZCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfYnVpbGRfYWxpYXMgZmFpbGVkIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfYnVpbGQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2J1aWxkIiA+JjYKK2J1aWxkPSRhY19jdl9idWlsZAorYnVpbGRfY3B1PWBlY2hvICRhY19jdl9idWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitidWlsZF92ZW5kb3I9YGVjaG8gJGFjX2N2X2J1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2J1aWxkX29zPWBlY2hvICRhY19jdl9idWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCisKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9ob3N0K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2N2X2hvc3RfYWxpYXM9JGhvc3RfYWxpYXMKK3Rlc3QgLXogIiRhY19jdl9ob3N0X2FsaWFzIiAmJgorICBhY19jdl9ob3N0X2FsaWFzPSRhY19jdl9idWlsZF9hbGlhcworYWNfY3ZfaG9zdD1gJGFjX2NvbmZpZ19zdWIgJGFjX2N2X2hvc3RfYWxpYXNgIHx8CisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6ICRhY19jb25maWdfc3ViICRhY19jdl9ob3N0X2FsaWFzIGZhaWxlZCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfaG9zdF9hbGlhcyBmYWlsZWQiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9ob3N0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9ob3N0IiA+JjYKK2hvc3Q9JGFjX2N2X2hvc3QKK2hvc3RfY3B1PWBlY2hvICRhY19jdl9ob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2hvc3RfdmVuZG9yPWBlY2hvICRhY19jdl9ob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2hvc3Rfb3M9YGVjaG8gJGFjX2N2X2hvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1nY2M7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWdjYyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1CitlY2hvICIke0VDSE9fVH0kQ0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQ0MiOyB0aGVuCisgIGFjX2N0X0NDPSRDQworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iZ2NjIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKK2ZpCitmaQorYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdF9DQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgQ0M9JGFjX2N0X0NDCitlbHNlCisgIENDPSIkYWNfY3ZfcHJvZ19DQyIKK2ZpCisKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Y2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Y2M7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWNjIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19DQyI7IHRoZW4KKyAgYWNfY3RfQ0M9JENDCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iY2MiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCithY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQworaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0NDIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworICBDQz0kYWNfY3RfQ0MKK2Vsc2UKKyAgQ0M9IiRhY19jdl9wcm9nX0NDIgorZmkKKworZmkKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBhY19wcm9nX3JlamVjdGVkPW5vCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGlmIHRlc3QgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgorICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCisgICAgICAgY29udGludWUKKyAgICAgZmkKKyAgICBhY19jdl9wcm9nX0NDPSJjYyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCisgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KKyAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCisgIHNoaWZ0CisgIGlmIHRlc3QgJCMgIT0gMDsgdGhlbgorICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgorICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KKyAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KKyAgICBzaGlmdAorICAgIGFjX2N2X3Byb2dfQ0M9IiRhc19kaXIvJGFjX3dvcmQkezErJyAnfSRAIgorICBmaQorZmkKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgZm9yIGFjX3Byb2cgaW4gY2wKKyAgZG8KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ0M9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgICB0ZXN0IC1uICIkQ0MiICYmIGJyZWFrCisgIGRvbmUKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgIGFjX2N0X0NDPSRDQworICBmb3IgYWNfcHJvZyBpbiBjbAorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfcHJvZyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK2FjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCitpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfQ0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIHRlc3QgLW4gIiRhY19jdF9DQyIgJiYgYnJlYWsKK2RvbmUKKworICBDQz0kYWNfY3RfQ0MKK2ZpCisKK2ZpCisKKwordGVzdCAteiAiJENDIiAmJiB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCisjIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCitlY2hvICIkYXNfbWU6JExJTkVOTzoiIFwKKyAgICAgImNoZWNraW5nIGZvciBDIGNvbXBpbGVyIHZlcnNpb24iID4mNQorYWNfY29tcGlsZXI9YHNldCBYICRhY19jb21waWxlOyBlY2hvICQyYAoreyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZXIgLS12ZXJzaW9uIDwvZGV2L251bGwgPiY1XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA8L2Rldi9udWxsID4mNSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfQoreyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZXIgLXYgPC9kZXYvbnVsbCA+JjVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZXIgLXYgPC9kZXYvbnVsbCA+JjUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KK3sgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVyIC1WIDwvZGV2L251bGwgPiY1XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGVyIC1WIDwvZGV2L251bGwgPiY1KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9CisKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCithY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcworYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyBhLm91dCBhLmV4ZSBiLm91dCIKKyMgVHJ5IHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIHdpdGhvdXQgLW8gZmlyc3QsIGRpc3JlZ2FyZCBhLm91dC4KKyMgSXQgd2lsbCBoZWxwIHVzIGRpYWdub3NlIGJyb2tlbiBjb21waWxlcnMsIGFuZCBmaW5kaW5nIG91dCBhbiBpbnR1aXRpb24KKyMgb2YgZXhlZXh0LgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZS4uLiAkRUNIT19DIiA+JjYKK2FjX2xpbmtfZGVmYXVsdD1gZWNobyAiJGFjX2xpbmsiIHwgc2VkICdzLyAtbyAqY29uZnRlc3RbXiBdKi8vJ2AKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtfZGVmYXVsdFwiIikgPiY1CisgIChldmFsICRhY19saW5rX2RlZmF1bHQpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KKyAgIyBGaW5kIHRoZSBvdXRwdXQsIHN0YXJ0aW5nIGZyb20gdGhlIG1vc3QgbGlrZWx5LiAgVGhpcyBzY2hlbWUgaXMKKyMgbm90IHJvYnVzdCB0byBqdW5rIGluIGAuJywgaGVuY2UgZ28gdG8gd2lsZGNhcmRzIChhLiopIG9ubHkgYXMgYSBsYXN0CisjIHJlc29ydC4KKworIyBCZSBjYXJlZnVsIHRvIGluaXRpYWxpemUgdGhpcyB2YXJpYWJsZSwgc2luY2UgaXQgdXNlZCB0byBiZSBjYWNoZWQuCisjIE90aGVyd2lzZSBhbiBvbGQgY2FjaGUgdmFsdWUgb2YgYG5vJyBsZWQgdG8gYEVYRUVYVCA9IG5vJyBpbiBhIE1ha2VmaWxlLgorYWNfY3ZfZXhlZXh0PQorIyBiLm91dCBpcyBjcmVhdGVkIGJ5IGk5NjAgY29tcGlsZXJzLgorZm9yIGFjX2ZpbGUgaW4gYV9vdXQuZXhlIGEuZXhlIGNvbmZ0ZXN0LmV4ZSBhLm91dCBjb25mdGVzdCBhLiogY29uZnRlc3QuKiBiLm91dAorZG8KKyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubyB8ICoub2JqICkKKwk7OworICAgIGNvbmZ0ZXN0LiRhY19leHQgKQorCSMgVGhpcyBpcyB0aGUgc291cmNlIGZpbGUuCisJOzsKKyAgICBbYWJdLm91dCApCisJIyBXZSBmb3VuZCB0aGUgZGVmYXVsdCBleGVjdXRhYmxlLCBidXQgZXhlZXh0PScnIGlzIG1vc3QKKwkjIGNlcnRhaW5seSByaWdodC4KKwlicmVhazs7CisgICAgKi4qICkKKwlhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKKwkjIEZJWE1FOiBJIGJlbGlldmUgd2UgZXhwb3J0IGFjX2N2X2V4ZWV4dCBmb3IgTGlidG9vbCwKKwkjIGJ1dCBpdCB3b3VsZCBiZSBjb29sIHRvIGZpbmQgb3V0IGlmIGl0J3MgdHJ1ZS4gIERvZXMgYW55Ym9keQorCSMgbWFpbnRhaW4gTGlidG9vbD8gLS1ha2ltLgorCWV4cG9ydCBhY19jdl9leGVleHQKKwlicmVhazs7CisgICAgKiApCisJYnJlYWs7OworICBlc2FjCitkb25lCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK3sgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9CitmaQorCithY19leGVleHQ9JGFjX2N2X2V4ZWV4dAorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2ZpbGUiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2ZpbGUiID4mNgorCisjIENoZWNrIHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKKyMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3Jrcy4uLiAkRUNIT19DIiA+JjYKKyMgRklYTUU6IFRoZXNlIGNyb3NzIGNvbXBpbGVyIGhhY2tzIHNob3VsZCBiZSByZW1vdmVkIGZvciBBdXRvY29uZiAzLjAKKyMgSWYgbm90IGNyb3NzIGNvbXBpbGluZywgY2hlY2sgdGhhdCB3ZSBjYW4gcnVuIGEgc2ltcGxlIHByb2dyYW0uCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSB5ZXM7IHRoZW4KKyAgaWYgeyBhY190cnk9Jy4vJGFjX2ZpbGUnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgICBjcm9zc19jb21waWxpbmc9bm8KKyAgZWxzZQorICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0gbWF5YmU7IHRoZW4KKwljcm9zc19jb21waWxpbmc9eWVzCisgICAgZWxzZQorCXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KK0lmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biBDIGNvbXBpbGVkIHByb2dyYW1zLgorSWYgeW91IG1lYW50IHRvIGNyb3NzIGNvbXBpbGUsIHVzZSBcYC0taG9zdCcuCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGZpCisgIGZpCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2CisKK3JtIC1mIGEub3V0IGEuZXhlIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCBiLm91dAorYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKKyMgQ2hlY2sgdGhlIGNvbXBpbGVyIHByb2R1Y2VzIGV4ZWN1dGFibGVzIHdlIGNhbiBydW4uICBJZiBub3QsIGVpdGhlcgorIyB0aGUgY29tcGlsZXIgaXMgYnJva2VuLCBvciB3ZSBjcm9zcyBjb21waWxlLgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZy4uLiAkRUNIT19DIiA+JjYKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRjcm9zc19jb21waWxpbmciID4mNQorZWNobyAiJHtFQ0hPX1R9JGNyb3NzX2NvbXBpbGluZyIgPiY2CisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcy4uLiAkRUNIT19DIiA+JjYKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgorICAjIElmIGJvdGggYGNvbmZ0ZXN0LmV4ZScgYW5kIGBjb25mdGVzdCcgYXJlIGBwcmVzZW50JyAod2VsbCwgb2JzZXJ2YWJsZSkKKyMgY2F0Y2ggYGNvbmZ0ZXN0LmV4ZScuICBGb3IgaW5zdGFuY2Ugd2l0aCBDeWd3aW4sIGBscyBjb25mdGVzdCcgd2lsbAorIyB3b3JrIHByb3Blcmx5IChpLmUuLCByZWZlciB0byBgY29uZnRlc3QuZXhlJyksIHdoaWxlIGl0IHdvbid0IHdpdGgKKyMgYHJtJy4KK2ZvciBhY19maWxlIGluIGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBjb25mdGVzdC4qOyBkbworICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5vIHwgKi5vYmogKSA7OworICAgICouKiApIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAorCSAgZXhwb3J0IGFjX2N2X2V4ZWV4dAorCSAgYnJlYWs7OworICAgICogKSBicmVhazs7CisgIGVzYWMKK2RvbmUKK2Vsc2UKKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKK3JtIC1mIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dAorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2V4ZWV4dCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfZXhlZXh0IiA+JjYKKworcm0gLWYgY29uZnRlc3QuJGFjX2V4dAorRVhFRVhUPSRhY19jdl9leGVleHQKK2FjX2V4ZWV4dD0kRVhFRVhUCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3Zfb2JqZXh0K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC5vIGNvbmZ0ZXN0Lm9iagoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCisgIGZvciBhY19maWxlIGluIGAobHMgY29uZnRlc3QubyBjb25mdGVzdC5vYmo7IGxzIGNvbmZ0ZXN0LiopIDI+L2Rldi9udWxsYDsgZG8KKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnICkgOzsKKyAgICAqKSBhY19jdl9vYmpleHQ9YGV4cHIgIiRhY19maWxlIiA6ICcuKlwuXCguKlwpJ2AKKyAgICAgICBicmVhazs7CisgIGVzYWMKK2RvbmUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIG9iamVjdCBmaWxlczogY2Fubm90IGNvbXBpbGUKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworcm0gLWYgY29uZnRlc3QuJGFjX2N2X29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X29iamV4dCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3Zfb2JqZXh0IiA+JjYKK09CSkVYVD0kYWNfY3Zfb2JqZXh0CithY19vYmpleHQ9JE9CSkVYVAorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlci4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfY19jb21waWxlcl9nbnUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworI2lmbmRlZiBfX0dOVUNfXworICAgICAgIGNob2tlIG1lCisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2NvbXBpbGVyX2dudT15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY29tcGlsZXJfZ251PW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorYWNfY3ZfY19jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQorCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY2CitHQ0M9YHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllcyAmJiBlY2hvIHllc2AKK2FjX3Rlc3RfQ0ZMQUdTPSR7Q0ZMQUdTK3NldH0KK2FjX3NhdmVfQ0ZMQUdTPSRDRkxBR1MKK0NGTEFHUz0iLWciCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWcuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfY2NfZytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9wcm9nX2NjX2c9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2N2X3Byb2dfY2NfZz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19nIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2NjX2ciID4mNgoraWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgorICBDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0KKyAgZmkKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IEFOU0kgQyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBBTlNJIEMuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfY2Nfc3RkYytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jdl9wcm9nX2NjX3N0ZGM9bm8KK2FjX3NhdmVfQ0M9JENDCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisvKiBNb3N0IG9mIHRoZSBmb2xsb3dpbmcgdGVzdHMgYXJlIHN0b2xlbiBmcm9tIFJDUyA1LjcncyBzcmMvY29uZi5zaC4gICovCitzdHJ1Y3QgYnVmIHsgaW50IHg7IH07CitGSUxFICogKCpyY3NvcGVuKSAoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpOworc3RhdGljIGNoYXIgKmUgKHAsIGkpCisgICAgIGNoYXIgKipwOworICAgICBpbnQgaTsKK3sKKyAgcmV0dXJuIHBbaV07Cit9CitzdGF0aWMgY2hhciAqZiAoY2hhciAqICgqZykgKGNoYXIgKiosIGludCksIGNoYXIgKipwLCAuLi4pCit7CisgIGNoYXIgKnM7CisgIHZhX2xpc3QgdjsKKyAgdmFfc3RhcnQgKHYscCk7CisgIHMgPSBnIChwLCB2YV9hcmcgKHYsaW50KSk7CisgIHZhX2VuZCAodik7CisgIHJldHVybiBzOworfQorCisvKiBPU0YgNC4wIENvbXBhcSBjYyBpcyBzb21lIHNvcnQgb2YgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdC4gIEl0IGhhcworICAgZnVuY3Rpb24gcHJvdG90eXBlcyBhbmQgc3R1ZmYsIGJ1dCBub3QgJ1x4SEgnIGhleCBjaGFyYWN0ZXIgY29uc3RhbnRzLgorICAgVGhlc2UgZG9uJ3QgcHJvdm9rZSBhbiBlcnJvciB1bmZvcnR1bmF0ZWx5LCBpbnN0ZWFkIGFyZSBzaWxlbnRseSB0cmVhdGVkCisgICBhcyAneCcuICBUaGUgZm9sbG93aW5nIGluZHVjZXMgYW4gZXJyb3IsIHVudGlsIC1zdGQxIGlzIGFkZGVkIHRvIGdldAorICAgcHJvcGVyIEFOU0kgbW9kZS4gIEN1cmlvdXNseSAnXHgwMCchPSd4JyBhbHdheXMgY29tZXMgb3V0IHRydWUsIGZvciBhbgorICAgYXJyYXkgc2l6ZSBhdCBsZWFzdC4gIEl0J3MgbmVjZXNzYXJ5IHRvIHdyaXRlICdceDAwJz09MCB0byBnZXQgc29tZXRoaW5nCisgICB0aGF0J3MgdHJ1ZSBvbmx5IHdpdGggLXN0ZDEuICAqLworaW50IG9zZjRfY2NfYXJyYXkgWydceDAwJyA9PSAwID8gMSA6IC0xXTsKKworaW50IHRlc3QgKGludCBpLCBkb3VibGUgeCk7CitzdHJ1Y3QgczEge2ludCAoKmYpIChpbnQgYSk7fTsKK3N0cnVjdCBzMiB7aW50ICgqZikgKGRvdWJsZSBhKTt9OworaW50IHBhaXJuYW1lcyAoaW50LCBjaGFyICoqLCBGSUxFICooKikoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpLCBpbnQsIGludCk7CitpbnQgYXJnYzsKK2NoYXIgKiphcmd2OworaW50CittYWluICgpCit7CityZXR1cm4gZiAoZSwgYXJndiwgMCkgIT0gYXJndlswXSAgfHwgIGYgKGUsIGFyZ3YsIDEpICE9IGFyZ3ZbMV07CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKKyMgRG9uJ3QgdHJ5IGdjYyAtYW5zaTsgdGhhdCB0dXJucyBvZmYgdXNlZnVsIGV4dGVuc2lvbnMgYW5kCisjIGJyZWFrcyBzb21lIHN5c3RlbXMnIGhlYWRlciBmaWxlcy4KKyMgQUlYCQkJLXFsYW5nbHZsPWFuc2kKKyMgVWx0cml4IGFuZCBPU0YvMQktc3RkMQorIyBIUC1VWCAxMC4yMCBhbmQgbGF0ZXIJLUFlCisjIEhQLVVYIG9sZGVyIHZlcnNpb25zCS1BYSAtRF9IUFVYX1NPVVJDRQorIyBTVlI0CQkJLVhjIC1EX19FWFRFTlNJT05TX18KK2ZvciBhY19hcmcgaW4gIiIgLXFsYW5nbHZsPWFuc2kgLXN0ZDEgLUFlICItQWEgLURfSFBVWF9TT1VSQ0UiICItWGMgLURfX0VYVEVOU0lPTlNfXyIKK2RvCisgIENDPSIkYWNfc2F2ZV9DQyAkYWNfYXJnIgorICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X3Byb2dfY2Nfc3RkYz0kYWNfYXJnCiticmVhaworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2RvbmUKK3JtIC1mIGNvbmZ0ZXN0LiRhY19leHQgY29uZnRlc3QuJGFjX29iamV4dAorQ0M9JGFjX3NhdmVfQ0MKKworZmkKKworY2FzZSAieCRhY19jdl9wcm9nX2NjX3N0ZGMiIGluCisgIHh8eG5vKQorICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vbmUgbmVlZGVkIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vbmUgbmVlZGVkIiA+JjYgOzsKKyAgKikKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19zdGRjIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2NjX3N0ZGMiID4mNgorICAgIENDPSIkQ0MgJGFjX2N2X3Byb2dfY2Nfc3RkYyIgOzsKK2VzYWMKKworIyBTb21lIHBlb3BsZSB1c2UgYSBDKysgY29tcGlsZXIgdG8gY29tcGlsZSBDLiAgU2luY2Ugd2UgdXNlIGBleGl0JywKKyMgaW4gQysrIHdlIG5lZWQgdG8gZGVjbGFyZSBpdC4gIEluIGNhc2Ugc29tZW9uZSB1c2VzIHRoZSBzYW1lIGNvbXBpbGVyCisjIGZvciBib3RoIGNvbXBpbGluZyBDIGFuZCBDKysgd2UgbmVlZCB0byBoYXZlIHRoZSBDKysgY29tcGlsZXIgZGVjaWRlCisjIHRoZSBkZWNsYXJhdGlvbiBvZiBleGl0LCBzaW5jZSBpdCdzIHRoZSBtb3N0IGRlbWFuZGluZyBlbnZpcm9ubWVudC4KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2lmbmRlZiBfX2NwbHVzcGx1cworICBjaG9rZSBtZQorI2VuZGlmCitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgZm9yIGFjX2RlY2xhcmF0aW9uIGluIFwKKyAgICcnIFwKKyAgICdleHRlcm4gIkMiIHZvaWQgc3RkOjpleGl0IChpbnQpIHRocm93ICgpOyB1c2luZyBzdGQ6OmV4aXQ7JyBcCisgICAnZXh0ZXJuICJDIiB2b2lkIHN0ZDo6ZXhpdCAoaW50KTsgdXNpbmcgc3RkOjpleGl0OycgXAorICAgJ2V4dGVybiAiQyIgdm9pZCBleGl0IChpbnQpIHRocm93ICgpOycgXAorICAgJ2V4dGVybiAiQyIgdm9pZCBleGl0IChpbnQpOycgXAorICAgJ3ZvaWQgZXhpdCAoaW50KTsnCitkbworICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19kZWNsYXJhdGlvbgorI2luY2x1ZGUgPHN0ZGxpYi5oPgoraW50CittYWluICgpCit7CitleGl0ICg0Mik7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitjb250aW51ZQorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfZGVjbGFyYXRpb24KK2ludAorbWFpbiAoKQoreworZXhpdCAoNDIpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGJyZWFrCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Citkb25lCitybSAtZiBjb25mdGVzdCoKK2lmIHRlc3QgLW4gIiRhY19kZWNsYXJhdGlvbiI7IHRoZW4KKyAgZWNobyAnI2lmZGVmIF9fY3BsdXNwbHVzJyA+PmNvbmZkZWZzLmgKKyAgZWNobyAkYWNfZGVjbGFyYXRpb24gICAgICA+PmNvbmZkZWZzLmgKKyAgZWNobyAnI2VuZGlmJyAgICAgICAgICAgICA+PmNvbmZkZWZzLmgKK2ZpCisKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBhIHNlZCB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBhIHNlZCB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfY3ZfcGF0aF9TRUQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBzZWQgYW5kIGdzZWQuCisjIFRoZW4gdXNlIHRoYXQgbGlzdCBvZiBzZWQncyBhcyBvbmVzIHRvIHRlc3QgZm9yIHRydW5jYXRpb24uCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBsdF9hY19wcm9nIGluIHNlZCBnc2VkOyBkbworICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICAgICAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kbHRfYWNfcHJvZyRhY19leGVjX2V4dCI7IHRoZW4KKyAgICAgICAgbHRfYWNfc2VkX2xpc3Q9IiRsdF9hY19zZWRfbGlzdCAkYXNfZGlyLyRsdF9hY19wcm9nJGFjX2V4ZWNfZXh0IgorICAgICAgZmkKKyAgICBkb25lCisgIGRvbmUKK2RvbmUKK2x0X2FjX21heD0wCitsdF9hY19jb3VudD0wCisjIEFkZCAvdXNyL3hwZzQvYmluL3NlZCBhcyBpdCBpcyB0eXBpY2FsbHkgZm91bmQgb24gU29sYXJpcworIyBhbG9uZyB3aXRoIC9iaW4vc2VkIHRoYXQgdHJ1bmNhdGVzIG91dHB1dC4KK2ZvciBsdF9hY19zZWQgaW4gJGx0X2FjX3NlZF9saXN0IC91c3IveHBnNC9iaW4vc2VkOyBkbworICB0ZXN0ICEgLWYgJGx0X2FjX3NlZCAmJiBjb250aW51ZQorICBjYXQgL2Rldi9udWxsID4gY29uZnRlc3QuaW4KKyAgbHRfYWNfY291bnQ9MAorICBlY2hvICRFQ0hPX04gIjAxMjM0NTY3ODkkRUNIT19DIiA+Y29uZnRlc3QuaW4KKyAgIyBDaGVjayBmb3IgR05VIHNlZCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICBpZiAiJGx0X2FjX3NlZCIgLS12ZXJzaW9uIDI+JjEgPCAvZGV2L251bGwgfCBncmVwICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCisgICAgbHRfY3ZfcGF0aF9TRUQ9JGx0X2FjX3NlZAorICAgIGJyZWFrCisgIGZpCisgIHdoaWxlIHRydWU7IGRvCisgICAgY2F0IGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LmluID5jb25mdGVzdC50bXAKKyAgICBtdiBjb25mdGVzdC50bXAgY29uZnRlc3QuaW4KKyAgICBjcCBjb25mdGVzdC5pbiBjb25mdGVzdC5ubAorICAgIGVjaG8gPj5jb25mdGVzdC5ubAorICAgICRsdF9hY19zZWQgLWUgJ3MvYSQvLycgPCBjb25mdGVzdC5ubCA+Y29uZnRlc3Qub3V0IHx8IGJyZWFrCisgICAgY21wIC1zIGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5ubCB8fCBicmVhaworICAgICMgMTAwMDAgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorICAgIHRlc3QgJGx0X2FjX2NvdW50IC1ndCAxMCAmJiBicmVhaworICAgIGx0X2FjX2NvdW50PWBleHByICRsdF9hY19jb3VudCArIDFgCisgICAgaWYgdGVzdCAkbHRfYWNfY291bnQgLWd0ICRsdF9hY19tYXg7IHRoZW4KKyAgICAgIGx0X2FjX21heD0kbHRfYWNfY291bnQKKyAgICAgIGx0X2N2X3BhdGhfU0VEPSRsdF9hY19zZWQKKyAgICBmaQorICBkb25lCitkb25lCisKK2ZpCisKK1NFRD0kbHRfY3ZfcGF0aF9TRUQKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRTRUQiID4mNQorZWNobyAiJHtFQ0hPX1R9JFNFRCIgPiY2CisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZWdyZXAiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZWdyZXAuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfZWdyZXArc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgZWNobyBhIHwgKGdyZXAgLUUgJyhhfGIpJykgPi9kZXYvbnVsbCAyPiYxCisgICAgdGhlbiBhY19jdl9wcm9nX2VncmVwPSdncmVwIC1FJworICAgIGVsc2UgYWNfY3ZfcHJvZ19lZ3JlcD0nZWdyZXAnCisgICAgZmkKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcHJvZ19lZ3JlcCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfcHJvZ19lZ3JlcCIgPiY2CisgRUdSRVA9JGFjX2N2X3Byb2dfZWdyZXAKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIG9yIC0td2l0aG91dC1nbnUtbGQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9nbnVfbGQiCisgIHRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcworZWxzZQorICB3aXRoX2dudV9sZD1ubworZmk7CithY19wcm9nPWxkCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsZCB1c2VkIGJ5ICRDQyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBsZCB1c2VkIGJ5ICRDQy4uLiAkRUNIT19DIiA+JjYKKyAgY2FzZSAkaG9zdCBpbgorICAqLSotbWluZ3cqKQorICAgICMgZ2NjIGxlYXZlcyBhIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybiB3aGljaCB1cHNldHMgbWluZ3cKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjUgfCB0ciAtZCAnXDAxNSdgIDs7CisgICopCisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YCA7OworICBlc2FjCisgIGNhc2UgJGFjX3Byb2cgaW4KKyAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KKyAgICBbXFwvXSogfCA/OltcXC9dKikKKyAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKKyAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRobmFtZSBvZiBsZAorICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgJFNFRCAncyVcXFxcJS8lZydgCisgICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KKwlhY19wcm9nPWBlY2hvICRhY19wcm9nfCAkU0VEICJzJSRyZV9kaXJlbHQlLyUiYAorICAgICAgZG9uZQorICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCisgICAgICA7OworICAiIikKKyAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KKyAgICBhY19wcm9nPWxkCisgICAgOzsKKyAgKikKKyAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCisgICAgd2l0aF9nbnVfbGQ9dW5rbm93bgorICAgIDs7CisgIGVzYWMKK2VsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBHTlUgbGQuLi4gJEVDSE9fQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBub24tR05VIGxkLi4uICRFQ0hPX0MiID4mNgorZmkKK2lmIHRlc3QgIiR7bHRfY3ZfcGF0aF9MRCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyIgfHwgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyRhY19leGVleHQiOyB0aGVuCisgICAgICBsdF9jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgorICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAorICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIHZhcmlhbnRzIG9mIEdOVSBsZCBvbmx5IGFjY2VwdCAtdi4KKyAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgorICAgICAgY2FzZSBgIiRsdF9jdl9wYXRoX0xEIiAtdiAyPiYxIDwvZGV2L251bGxgIGluCisgICAgICAqR05VKiB8ICond2l0aCBCRkQnKikKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCisJOzsKKyAgICAgICopCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKKwk7OworICAgICAgZXNhYworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkbHRfc2F2ZV9pZnMiCitlbHNlCisgIGx0X2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCitmaQorZmkKKworTEQ9IiRsdF9jdl9wYXRoX0xEIgoraWYgdGVzdCAtbiAiJExEIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkTEQiID4mNQorZWNobyAiJHtFQ0hPX1R9JExEIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKK3Rlc3QgLXogIiRMRCIgJiYgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtsdF9jdl9wcm9nX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICAjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZHMgb25seSBhY2NlcHQgLXYuCitjYXNlIGAkTEQgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgorKkdOVSogfCAqJ3dpdGggQkZEJyopCisgIGx0X2N2X3Byb2dfZ251X2xkPXllcworICA7OworKikKKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9bm8KKyAgOzsKK2VzYWMKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfY3ZfcHJvZ19nbnVfbGQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X3Byb2dfZ251X2xkIiA+JjYKK3dpdGhfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZAorCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJExEIG9wdGlvbiB0byByZWxvYWQgb2JqZWN0IGZpbGVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlcy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfY3ZfbGRfcmVsb2FkX2ZsYWcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfbGRfcmVsb2FkX2ZsYWc9Jy1yJworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsdF9jdl9sZF9yZWxvYWRfZmxhZyIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfY3ZfbGRfcmVsb2FkX2ZsYWciID4mNgorcmVsb2FkX2ZsYWc9JGx0X2N2X2xkX3JlbG9hZF9mbGFnCitjYXNlICRyZWxvYWRfZmxhZyBpbgorIiIgfCAiICIqKSA7OworKikgcmVsb2FkX2ZsYWc9IiAkcmVsb2FkX2ZsYWciIDs7Citlc2FjCityZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCitjYXNlICRob3N0X29zIGluCisgIGRhcndpbiopCisgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgIHJlbG9hZF9jbWRzPSckTFRDQyAkTFRDRkxBR1MgLW5vc3RkbGliICR7d2x9LXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKKyAgICBlbHNlCisgICAgICByZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisgICAgZmkKKyAgICA7OworZXNhYworCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtsdF9jdl9wYXRoX05NK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiROTSI7IHRoZW4KKyAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCisgIGx0X2N2X3BhdGhfTk09IiROTSIKK2Vsc2UKKyAgbHRfbm1fdG9fY2hlY2s9IiR7YWNfdG9vbF9wcmVmaXh9bm0iCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCIgJiYgdGVzdCAiJGJ1aWxkIiA9ICIkaG9zdCI7IHRoZW4KKyAgICBsdF9ubV90b19jaGVjaz0iJGx0X25tX3RvX2NoZWNrIG5tIgorICBmaQorICBmb3IgbHRfdG1wX25tIGluICRsdF9ubV90b19jaGVjazsgZG8KKyAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2Jpbi9lbGYgL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgICB0bXBfbm09IiRhY19kaXIvJGx0X3RtcF9ubSIKKyAgICAgIGlmIHRlc3QgLWYgIiR0bXBfbm0iIHx8IHRlc3QgLWYgIiR0bXBfbm0kYWNfZXhlZXh0IiA7IHRoZW4KKwkjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KKwkjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgorCSMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKKwkjIFRydTY0J3Mgbm0gY29tcGxhaW5zIHRoYXQgL2Rldi9udWxsIGlzIGFuIGludmFsaWQgb2JqZWN0IGZpbGUKKwljYXNlIGAiJHRtcF9ubSIgLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KKwkqL2Rldi9udWxsKiB8IConSW52YWxpZCBmaWxlIG9yIG9iamVjdCB0eXBlJyopCisJICBsdF9jdl9wYXRoX05NPSIkdG1wX25tIC1CIgorCSAgYnJlYWsKKwkgIDs7CisJKikKKwkgIGNhc2UgYCIkdG1wX25tIiAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgorCSAgKi9kZXYvbnVsbCopCisJICAgIGx0X2N2X3BhdGhfTk09IiR0bXBfbm0gLXAiCisJICAgIGJyZWFrCisJICAgIDs7CisJICAqKQorCSAgICBsdF9jdl9wYXRoX05NPSR7bHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAorCSAgICBjb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncworCSAgICA7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgIGRvbmUKKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgZG9uZQorICB0ZXN0IC16ICIkbHRfY3ZfcGF0aF9OTSIgJiYgbHRfY3ZfcGF0aF9OTT1ubQorZmkKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfY3ZfcGF0aF9OTSIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfY3ZfcGF0aF9OTSIgPiY2CitOTT0iJGx0X2N2X3BhdGhfTk0iCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3Jrcy4uLiAkRUNIT19DIiA+JjYKK0xOX1M9JGFzX2xuX3MKK2lmIHRlc3QgIiRMTl9TIiA9ICJsbiAtcyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vLCB1c2luZyAkTE5fUyIgPiY1CitlY2hvICIke0VDSE9fVH1ubywgdXNpbmcgJExOX1MiID4mNgorZmkKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGhvdyB0byByZWNvZ25pc2UgZGVwZW5kZW50IGxpYnJhcmllcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGhvdyB0byByZWNvZ25pc2UgZGVwZW5kZW50IGxpYnJhcmllcy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Qrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRNQUdJQ19DTUQnCitsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0KK2x0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSd1bmtub3duJworIyBOZWVkIHRvIHNldCB0aGUgcHJlY2VkaW5nIHZhcmlhYmxlIG9uIGFsbCBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0CisjIGludGVybGlicmFyeSBkZXBlbmRlbmNpZXMuCisjICdub25lJyAtLSBkZXBlbmRlbmNpZXMgbm90IHN1cHBvcnRlZC4KKyMgYHVua25vd24nIC0tIHNhbWUgYXMgbm9uZSwgYnV0IGRvY3VtZW50cyB0aGF0IHdlIHJlYWxseSBkb24ndCBrbm93LgorIyAncGFzc19hbGwnIC0tIGFsbCBkZXBlbmRlbmNpZXMgcGFzc2VkIHdpdGggbm8gY2hlY2tzLgorIyAndGVzdF9jb21waWxlJyAtLSBjaGVjayBieSBtYWtpbmcgdGVzdCBwcm9ncmFtLgorIyAnZmlsZV9tYWdpYyBbW3JlZ2V4XV0nIC0tIGNoZWNrIGJ5IGxvb2tpbmcgZm9yIGZpbGVzIGluIGxpYnJhcnkgcGF0aAorIyB3aGljaCByZXNwb25kcyB0byB0aGUgJGZpbGVfbWFnaWNfY21kIHdpdGggYSBnaXZlbiBleHRlbmRlZCByZWdleC4KKyMgSWYgeW91IGhhdmUgYGZpbGUnIG9yIGVxdWl2YWxlbnQgb24geW91ciBzeXN0ZW0gYW5kIHlvdSdyZSBub3Qgc3VyZQorIyB3aGV0aGVyIGBwYXNzX2FsbCcgd2lsbCAqYWx3YXlzKiB3b3JrLCB5b3UgcHJvYmFibHkgd2FudCB0aGlzIG9uZS4KKworY2FzZSAkaG9zdF9vcyBpbgorYWl4NCogfCBhaXg1KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworYmVvcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2JzZGlbNDVdKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTUxdU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpJworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL3Vzci9iaW4vZmlsZSAtTCcKKyAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3NobGliL2xpYmMuc28KKyAgOzsKKworY3lnd2luKikKKyAgIyBmdW5jX3dpbjMyX2xpYmlkIGlzIGEgc2hlbGwgZnVuY3Rpb24gZGVmaW5lZCBpbiBsdG1haW4uc2gKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgXng4NiBhcmNoaXZlIGltcG9ydHxeeDg2IERMTCcKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9J2Z1bmNfd2luMzJfbGliaWQnCisgIDs7CisKK21pbmd3KiB8IHB3MzIqKQorICAjIEJhc2UgTVNZUy9NaW5HVyBkbyBub3QgcHJvdmlkZSB0aGUgJ2ZpbGUnIGNvbW1hbmQgbmVlZGVkIGJ5CisgICMgZnVuY193aW4zMl9saWJpZCBzaGVsbCBmdW5jdGlvbiwgc28gdXNlIGEgd2Vha2VyIHRlc3QgYmFzZWQgb24gJ29iamR1bXAnLgorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBmaWxlIGZvcm1hdCBwZWkqLWkzODYoLiphcmNoaXRlY3R1cmU6IGkzODYpPycKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRPQkpEVU1QIC1mJworICA7OworCitkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitmcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUgfCBkcmFnb25mbHkqKQorICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgaSo4NiApCisgICAgICAjIE5vdCBzdXJlIHdoZXRoZXIgdGhlIHByZXNlbmNlIG9mIE9wZW5CU0QgaGVyZSB3YXMgYSBtaXN0YWtlLgorICAgICAgIyBMZXQncyBhY2NlcHQgYm90aCBvZiB0aGVtIHVudGlsIHRoaXMgaXMgY2xlYXJlZCB1cC4KKyAgICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChGcmVlQlNEfE9wZW5CU0R8RHJhZ29uRmx5KS9pWzMtOV04NiAoY29tcGFjdCApP2RlbWFuZCBwYWdlZCBzaGFyZWQgbGlicmFyeScKKyAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28uKmAKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgZmkKKyAgOzsKKworZ251KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworaHB1eDEwLjIwKiB8IGhwdXgxMSopCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgaWE2NCopCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbMC05XVswLTldWzAtOV18RUxGLVswLTldWzAtOV0pIHNoYXJlZCBvYmplY3QgZmlsZSAtIElBNjQnCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvaHB1eDMyL2xpYmMuc28KKyAgICA7OworICBocHBhKjY0KikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxFTEYtWzAtOV1bMC05XSkgc2hhcmVkIG9iamVjdCBmaWxlIC0gUEEtUklTQyBbMC05XS5bMC05XScKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9wYTIwXzY0L2xpYmMuc2wKKyAgICA7OworICAqKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzWzAtOV1bMC05XVswLTldfFBBLVJJU0NbMC05XS5bMC05XSkgc2hhcmVkIGxpYnJhcnknCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvbGliYy5zbAorICAgIDs7CisgIGVzYWMKKyAgOzsKKworaW50ZXJpeDMqKQorICAjIFBJQyBjb2RlIGlzIGJyb2tlbiBvbiBJbnRlcml4IDMueCwgdGhhdCdzIHdoeSB8XC5hIG5vdCB8X3BpY1wuYSBoZXJlCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvfFwuYSkkJworICA7OworCitpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICBjYXNlICRMRCBpbgorICAqLTMyfCoiLTMyICIpIGxpYm1hZ2ljPTMyLWJpdDs7CisgICotbjMyfCoiLW4zMiAiKSBsaWJtYWdpYz1OMzI7OworICAqLTY0fCoiLTY0ICIpIGxpYm1hZ2ljPTY0LWJpdDs7CisgICopIGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKKyAgZXNhYworICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCisjIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCitsaW51eCopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK25ldGJzZCopCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4gL2Rldi9udWxsOyB0aGVuCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYlteL10rKFwuc29cLlswLTldK1wuWzAtOV0rfF9waWNcLmEpJCcKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvfF9waWNcLmEpJCcKKyAgZmkKKyAgOzsKKworbmV3b3M2KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTUxdU0IgKGV4ZWN1dGFibGV8ZHluYW1pYyBsaWIpJworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYm5scy5zbworICA7OworCitudG8tcW54KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9dW5rbm93bgorICA7OworCitvcGVuYnNkKikKKyAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYlteL10rKFwuc29cLlswLTldK1wuWzAtOV0rfFwuc298X3BpY1wuYSkkJworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYlteL10rKFwuc29cLlswLTldK1wuWzAtOV0rfF9waWNcLmEpJCcKKyAgZmkKKyAgOzsKKworb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitzb2xhcmlzKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworc3lzdjQgfCBzeXN2NC4zKikKKyAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKyAgbW90b3JvbGEpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTUxdU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpIE1bMC05XVswLTldKiBWZXJzaW9uIFswLTldJworICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28qYAorICAgIDs7CisgIG5jcikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIHNlcXVlbnQpCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtMTV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiApJworICAgIDs7CisgIHNuaSkKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL2Jpbi9maWxlJworICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSJmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW0xNXVNCIGR5bmFtaWMgbGliIgorICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9saWIvbGliYy5zbworICAgIDs7CisgIHNpZW1lbnMpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgICA7OworICBwYykKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIGVzYWMKKyAgOzsKKworc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKiB8IHN5c3Y0KnV3MiopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7Citlc2FjCisKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kIiA+JjYKK2ZpbGVfbWFnaWNfY21kPSRsdF9jdl9maWxlX21hZ2ljX2NtZAorZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kCit0ZXN0IC16ICIkZGVwbGlic19jaGVja19tZXRob2QiICYmIGRlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KKworCisKKworIyBJZiBubyBDIGNvbXBpbGVyIHdhcyBzcGVjaWZpZWQsIHVzZSBDQy4KK0xUQ0M9JHtMVENDLSIkQ0MifQorCisjIElmIG5vIEMgY29tcGlsZXIgZmxhZ3Mgd2VyZSBzcGVjaWZpZWQsIHVzZSBDRkxBR1MuCitMVENGTEFHUz0ke0xUQ0ZMQUdTLSIkQ0ZMQUdTIn0KKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2NvbXBpbGVyPSRDQworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1saWJ0b29sLWxvY2sgb3IgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9saWJ0b29sX2xvY2src2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKKworZmk7Cit0ZXN0ICJ4JGVuYWJsZV9saWJ0b29sX2xvY2siICE9IHhubyAmJiBlbmFibGVfbGlidG9vbF9sb2NrPXllcworCisjIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKKyMgbGlidG9vbCBzdXBwb3J0LgorY2FzZSAkaG9zdCBpbgoraWE2NC0qLWhwdXgqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KKyAgICAqRUxGLTMyKikKKyAgICAgIEhQVVhfSUE2NF9NT0RFPSIzMiIKKyAgICAgIDs7CisgICAgKkVMRi02NCopCisgICAgICBIUFVYX0lBNjRfTU9ERT0iNjQiCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworKi0qLWlyaXg2KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICcjbGluZSAzNTY0ICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCisgICBpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorICAgICozMi1iaXQqKQorICAgICAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJic21pcCIKKyAgICAgIDs7CisgICAgKk4zMiopCisgICAgICBMRD0iJHtMRC1sZH0gLW1lbGYzMmJtaXBuMzIiCisgICAgICA7OworICAgICo2NC1iaXQqKQorICAgICAgTEQ9IiR7TEQtbGR9IC1tZWxmNjRibWlwIgorICAgICAgOzsKKyAgICBlc2FjCisgICBlbHNlCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorICAgICozMi1iaXQqKQorICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKKyAgICAgIDs7CisgICAgKk4zMiopCisgICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKKyAgICAgIDs7CisgICAgKjY0LWJpdCopCisgICAgICBMRD0iJHtMRC1sZH0gLTY0IgorICAgICAgOzsKKyAgICBlc2FjCisgICBmaQorICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisKK3g4Nl82NC0qbGludXgqfHBwYyotKmxpbnV4Knxwb3dlcnBjKi0qbGludXgqfHMzOTAqLSpsaW51eCp8c3BhcmMqLSpsaW51eCopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCBpbgorICAgICozMi1iaXQqKQorICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgICB4ODZfNjQtKmxpbnV4KikKKyAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX2kzODYiCisgICAgICAgICAgOzsKKyAgICAgICAgcHBjNjQtKmxpbnV4Knxwb3dlcnBjNjQtKmxpbnV4KikKKyAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmMzJwcGNsaW51eCIKKyAgICAgICAgICA7OworICAgICAgICBzMzkweC0qbGludXgqKQorICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGZfczM5MCIKKyAgICAgICAgICA7OworICAgICAgICBzcGFyYzY0LSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjMyX3NwYXJjIgorICAgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworICAgICo2NC1iaXQqKQorICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgICB4ODZfNjQtKmxpbnV4KikKKyAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3g4Nl82NCIKKyAgICAgICAgICA7OworICAgICAgICBwcGMqLSpsaW51eCp8cG93ZXJwYyotKmxpbnV4KikKKyAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRwcGMiCisgICAgICAgICAgOzsKKyAgICAgICAgczM5MCotKmxpbnV4KikKKyAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfczM5MCIKKyAgICAgICAgICA7OworICAgICAgICBzcGFyYyotKmxpbnV4KikKKyAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfc3BhcmMiCisgICAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisKKyotKi1zY28zLjJ2NSopCisgICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KKyAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCisgIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtsdF9jdl9jY19uZWVkc19iZWxmK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworICAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBsdF9jdl9jY19uZWVkc19iZWxmPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitsdF9jdl9jY19uZWVkc19iZWxmPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICAgYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGx0X2N2X2NjX25lZWRzX2JlbGYiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X2NjX25lZWRzX2JlbGYiID4mNgorICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgorICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgorICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgorICBmaQorICA7Oworc3BhcmMqLSpzb2xhcmlzKikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KKyAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIGluCisgICAgKjY0LWJpdCopCisgICAgICBjYXNlICRsdF9jdl9wcm9nX2dudV9sZCBpbgorICAgICAgeWVzKikgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIiA7OworICAgICAgKikgICAgTEQ9IiR7TEQtbGR9IC02NCIgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisKKyotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKikKKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1kbGx0b29sOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX0RMTFRPT0wrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCisgIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0RMTFRPT0w9IiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK0RMTFRPT0w9JGFjX2N2X3Byb2dfRExMVE9PTAoraWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRETExUT09MIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRETExUT09MIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiOyB0aGVuCisgIGFjX2N0X0RMTFRPT0w9JERMTFRPT0wKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJkbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBkbGx0b29sOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0RMTFRPT0wrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0RMTFRPT0wiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfRExMVE9PTD0iJGFjX2N0X0RMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0RMTFRPT0w9ImRsbHRvb2wiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19hY19jdF9ETExUT09MIiAmJiBhY19jdl9wcm9nX2FjX2N0X0RMTFRPT0w9ImZhbHNlIgorZmkKK2ZpCithY19jdF9ETExUT09MPSRhY19jdl9wcm9nX2FjX2N0X0RMTFRPT0wKK2lmIHRlc3QgLW4gIiRhY19jdF9ETExUT09MIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfRExMVE9PTCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfRExMVE9PTCIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgRExMVE9PTD0kYWNfY3RfRExMVE9PTAorZWxzZQorICBETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgorZmkKKworICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hczsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19BUytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCisgIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfQVM9IiR7YWNfdG9vbF9wcmVmaXh9YXMiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCitBUz0kYWNfY3ZfcHJvZ19BUworaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQVMiID4mNQorZWNobyAiJHtFQ0hPX1R9JEFTIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX0FTIjsgdGhlbgorICBhY19jdF9BUz0kQVMKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJhcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgYXM7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQVMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0FTIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0FTPSIkYWNfY3RfQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0FTPSJhcyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX2FjX2N0X0FTIiAmJiBhY19jdl9wcm9nX2FjX2N0X0FTPSJmYWxzZSIKK2ZpCitmaQorYWNfY3RfQVM9JGFjX2N2X3Byb2dfYWNfY3RfQVMKK2lmIHRlc3QgLW4gIiRhY19jdF9BUyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0FTIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdF9BUyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgQVM9JGFjX2N0X0FTCitlbHNlCisgIEFTPSIkYWNfY3ZfcHJvZ19BUyIKK2ZpCisKKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9b2JqZHVtcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1vYmpkdW1wOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX09CSkRVTVArc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJE9CSkRVTVAiOyB0aGVuCisgIGFjX2N2X3Byb2dfT0JKRFVNUD0iJE9CSkRVTVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX09CSkRVTVA9IiR7YWNfdG9vbF9wcmVmaXh9b2JqZHVtcCIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK09CSkRVTVA9JGFjX2N2X3Byb2dfT0JKRFVNUAoraWYgdGVzdCAtbiAiJE9CSkRVTVAiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRPQkpEVU1QIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRPQkpEVU1QIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX09CSkRVTVAiOyB0aGVuCisgIGFjX2N0X09CSkRVTVA9JE9CSkRVTVAKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJvYmpkdW1wIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBvYmpkdW1wOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X09CSkRVTVArc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X09CSkRVTVAiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfT0JKRFVNUD0iJGFjX2N0X09CSkRVTVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X09CSkRVTVA9Im9iamR1bXAiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QIiAmJiBhY19jdl9wcm9nX2FjX2N0X09CSkRVTVA9ImZhbHNlIgorZmkKK2ZpCithY19jdF9PQkpEVU1QPSRhY19jdl9wcm9nX2FjX2N0X09CSkRVTVAKK2lmIHRlc3QgLW4gIiRhY19jdF9PQkpEVU1QIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfT0JKRFVNUCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfT0JKRFVNUCIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgT0JKRFVNUD0kYWNfY3RfT0JKRFVNUAorZWxzZQorICBPQkpEVU1QPSIkYWNfY3ZfcHJvZ19PQkpEVU1QIgorZmkKKworICA7OworCitlc2FjCisKK25lZWRfbG9ja3M9IiRlbmFibGVfbGlidG9vbF9sb2NrIgorCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yLi4uICRFQ0hPX0MiID4mNgorIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KK2lmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCisgIENQUD0KK2ZpCitpZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgorICBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ1BQK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgICAgICAjIERvdWJsZSBxdW90ZXMgYmVjYXVzZSBDUFAgbmVlZHMgdG8gYmUgZXhwYW5kZWQKKyAgICBmb3IgQ1BQIGluICIkQ0MgLUUiICIkQ0MgLUUgLXRyYWRpdGlvbmFsLWNwcCIgIi9saWIvY3BwIgorICAgIGRvCisgICAgICBhY19wcmVwcm9jX29rPWZhbHNlCitmb3IgYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKK2RvCisgICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKKyAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCisgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKwkJICAgICBTeW50YXggZXJyb3IKK19BQ0VPRgoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQorICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgYWNfY3BwX2Vycj0kYWNfY19wcmVwcm9jX3dhcm5fZmxhZworICAgIGFjX2NwcF9lcnI9JGFjX2NwcF9lcnIkYWNfY193ZXJyb3JfZmxhZworICBlbHNlCisgICAgYWNfY3BwX2Vycj0KKyAgZmkKK2Vsc2UKKyAgYWNfY3BwX2Vycj15ZXMKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKworICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uLWV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK19BQ0VPRgoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQorICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgYWNfY3BwX2Vycj0kYWNfY19wcmVwcm9jX3dhcm5fZmxhZworICAgIGFjX2NwcF9lcnI9JGFjX2NwcF9lcnIkYWNfY193ZXJyb3JfZmxhZworICBlbHNlCisgICAgYWNfY3BwX2Vycj0KKyAgZmkKK2Vsc2UKKyAgYWNfY3BwX2Vycj15ZXMKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KKyAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorCitkb25lCisjIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitpZiAkYWNfcHJlcHJvY19vazsgdGhlbgorICBicmVhaworZmkKKworICAgIGRvbmUKKyAgICBhY19jdl9wcm9nX0NQUD0kQ1BQCisKK2ZpCisgIENQUD0kYWNfY3ZfcHJvZ19DUFAKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DUFA9JENQUAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDUFAiID4mNQorZWNobyAiJHtFQ0hPX1R9JENQUCIgPiY2CithY19wcmVwcm9jX29rPWZhbHNlCitmb3IgYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKK2RvCisgICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKKyAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCisgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKwkJICAgICBTeW50YXggZXJyb3IKK19BQ0VPRgoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQorICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgYWNfY3BwX2Vycj0kYWNfY19wcmVwcm9jX3dhcm5fZmxhZworICAgIGFjX2NwcF9lcnI9JGFjX2NwcF9lcnIkYWNfY193ZXJyb3JfZmxhZworICBlbHNlCisgICAgYWNfY3BwX2Vycj0KKyAgZmkKK2Vsc2UKKyAgYWNfY3BwX2Vycj15ZXMKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKworICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uLWV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK19BQ0VPRgoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQorICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgYWNfY3BwX2Vycj0kYWNfY19wcmVwcm9jX3dhcm5fZmxhZworICAgIGFjX2NwcF9lcnI9JGFjX2NwcF9lcnIkYWNfY193ZXJyb3JfZmxhZworICBlbHNlCisgICAgYWNfY3BwX2Vycj0KKyAgZmkKK2Vsc2UKKyAgYWNfY3BwX2Vycj15ZXMKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KKyAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorCitkb25lCisjIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitpZiAkYWNfcHJlcHJvY19vazsgdGhlbgorICA6CitlbHNlCisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IEMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNhbml0eSBjaGVjaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogQyBwcmVwcm9jZXNzb3IgXCIkQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9oZWFkZXJfc3RkYytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2hlYWRlcl9zdGRjPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIDoKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpZiAoKCcgJyAmIDB4MEZGKSA9PSAweDAyMCkKKyMgZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKKyMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKKyNlbHNlCisjIGRlZmluZSBJU0xPV0VSKGMpIFwKKwkJICAgKCgnYScgPD0gKGMpICYmIChjKSA8PSAnaScpIFwKKwkJICAgICB8fCAoJ2onIDw9IChjKSAmJiAoYykgPD0gJ3InKSBcCisJCSAgICAgfHwgKCdzJyA8PSAoYykgJiYgKGMpIDw9ICd6JykpCisjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gKChjKSB8IDB4NDApIDogKGMpKQorI2VuZGlmCisKKyNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCitpbnQKK21haW4gKCkKK3sKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICBpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpCisJfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpCisgICAgICBleGl0KDIpOworICBleGl0ICgwKTsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKK2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyggZXhpdCAkYWNfc3RhdHVzICkKK2FjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29yZSAqLmNvcmUgZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitmaQorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3RkYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgU1REQ19IRUFERVJTIDEKK19BQ0VPRgorCitmaQorCisjIE9uIElSSVggNS4zLCBzeXMvdHlwZXMgYW5kIGludHR5cGVzLmggYXJlIGNvbmZsaWN0aW5nLgorCisKKworCisKKworCisKKworZm9yIGFjX2hlYWRlciBpbiBzeXMvdHlwZXMuaCBzeXMvc3RhdC5oIHN0ZGxpYi5oIHN0cmluZy5oIG1lbW9yeS5oIHN0cmluZ3MuaCBcCisJCSAgaW50dHlwZXMuaCBzdGRpbnQuaCB1bmlzdGQuaAorZG8KK2FzX2FjX0hlYWRlcj1gZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2CitpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKworI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgZXZhbCAiJGFzX2FjX0hlYWRlcj15ZXMiCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2V2YWwgIiRhc19hY19IZWFkZXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjUKK2VjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjYKK2lmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworCitmb3IgYWNfaGVhZGVyIGluIGRsZmNuLmgKK2RvCithc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfSGVhZGVyK3NldH1cIiA9IHNldCI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2CitpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNQorZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNgorZWxzZQorICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19oZWFkZXJfY29tcGlsZXI9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfY29tcGlsZXIiID4mNgorCisjIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjYKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0KSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbDsgdGhlbgorICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGFjX2NwcF9lcnI9JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcKKyAgICBhY19jcHBfZXJyPSRhY19jcHBfZXJyJGFjX2Nfd2Vycm9yX2ZsYWcKKyAgZWxzZQorICAgIGFjX2NwcF9lcnI9CisgIGZpCitlbHNlCisgIGFjX2NwcF9lcnI9eWVzCitmaQoraWYgdGVzdCAteiAiJGFjX2NwcF9lcnIiOyB0aGVuCisgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgIGFjX2hlYWRlcl9wcmVwcm9jPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX3ByZXByb2MiID4mNgorCisjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KK2Nhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4KKyAgeWVzOm5vOiApCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9CisgICAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCisgICAgOzsKKyAgbm86eWVzOiogKQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mMjt9CisgICAgKAorICAgICAgY2F0IDw8XF9BU0JPWAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIFJlcG9ydCB0aGlzIHRvIGV4cGF0LWJ1Z3NAbGliZXhwYXQub3JnICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworX0FTQk9YCisgICAgKSB8CisgICAgICBzZWQgInMvXi8kYXNfbWU6IFdBUk5JTkc6ICAgICAvIiA+JjIKKyAgICA7OworZXNhYworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2CitpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGV2YWwgIiRhc19hY19IZWFkZXI9XCRhY19oZWFkZXJfcHJlcHJvYyIKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY1CitlY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY2CisKK2ZpCitpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCithY19leHQ9Y2MKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgIGZvciBhY19wcm9nIGluICRDQ0MgZysrIGMrKyBncHAgYUNDIENDIGN4eCBjYysrIGNsIEZDQyBLQ0MgUkNDIHhsQ19yIHhsQworICBkbworICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NYWCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ1hYIjsgdGhlbgorICBhY19jdl9wcm9nX0NYWD0iJENYWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ1hYPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK0NYWD0kYWNfY3ZfcHJvZ19DWFgKK2lmIHRlc3QgLW4gIiRDWFgiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDWFgiID4mNQorZWNobyAiJHtFQ0hPX1R9JENYWCIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgICB0ZXN0IC1uICIkQ1hYIiAmJiBicmVhaworICBkb25lCitmaQoraWYgdGVzdCAteiAiJENYWCI7IHRoZW4KKyAgYWNfY3RfQ1hYPSRDWFgKKyAgZm9yIGFjX3Byb2cgaW4gJENDQyBnKysgYysrIGdwcCBhQ0MgQ0MgY3h4IGNjKysgY2wgRkNDIEtDQyBSQ0MgeGxDX3IgeGxDCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DWFgrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NYWCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DWFg9IiRhY19jdF9DWFgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0NYWD0iJGFjX3Byb2ciCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCithY19jdF9DWFg9JGFjX2N2X3Byb2dfYWNfY3RfQ1hYCitpZiB0ZXN0IC1uICIkYWNfY3RfQ1hYIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfQ1hYIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdF9DWFgiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIHRlc3QgLW4gIiRhY19jdF9DWFgiICYmIGJyZWFrCitkb25lCit0ZXN0IC1uICIkYWNfY3RfQ1hYIiB8fCBhY19jdF9DWFg9ImcrKyIKKworICBDWFg9JGFjX2N0X0NYWAorZmkKKworCisjIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCitlY2hvICIkYXNfbWU6JExJTkVOTzoiIFwKKyAgICAgImNoZWNraW5nIGZvciBDKysgY29tcGlsZXIgdmVyc2lvbiIgPiY1CithY19jb21waWxlcj1gc2V0IFggJGFjX2NvbXBpbGU7IGVjaG8gJDJgCit7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlciAtLXZlcnNpb24gPC9kZXYvbnVsbCA+JjVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZXIgLS12ZXJzaW9uIDwvZGV2L251bGwgPiY1KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9Cit7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlciAtdiA8L2Rldi9udWxsID4mNVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlciAtdiA8L2Rldi9udWxsID4mNSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfQoreyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZXIgLVYgPC9kZXYvbnVsbCA+JjVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZXIgLVYgPC9kZXYvbnVsbCA+JjUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQysrIGNvbXBpbGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDKysgY29tcGlsZXIuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2N4eF9jb21waWxlcl9nbnUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworI2lmbmRlZiBfX0dOVUNfXworICAgICAgIGNob2tlIG1lCisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY29tcGlsZXJfZ251PXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jb21waWxlcl9nbnU9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CithY19jdl9jeHhfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jeHhfY29tcGlsZXJfZ251IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9jeHhfY29tcGlsZXJfZ251IiA+JjYKK0dYWD1gdGVzdCAkYWNfY29tcGlsZXJfZ251ID0geWVzICYmIGVjaG8geWVzYAorYWNfdGVzdF9DWFhGTEFHUz0ke0NYWEZMQUdTK3NldH0KK2FjX3NhdmVfQ1hYRkxBR1M9JENYWEZMQUdTCitDWFhGTEFHUz0iLWciCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAkQ1hYIGFjY2VwdHMgLWciID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICRDWFggYWNjZXB0cyAtZy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jeHhfZytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X3Byb2dfY3h4X2c9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2N2X3Byb2dfY3h4X2c9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY3h4X2ciID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3Byb2dfY3h4X2ciID4mNgoraWYgdGVzdCAiJGFjX3Rlc3RfQ1hYRkxBR1MiID0gc2V0OyB0aGVuCisgIENYWEZMQUdTPSRhY19zYXZlX0NYWEZMQUdTCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY3h4X2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICBDWFhGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ1hYRkxBR1M9Ii1nIgorICBmaQorZWxzZQorICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgIENYWEZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDWFhGTEFHUz0KKyAgZmkKK2ZpCitmb3IgYWNfZGVjbGFyYXRpb24gaW4gXAorICAgJycgXAorICAgJ2V4dGVybiAiQyIgdm9pZCBzdGQ6OmV4aXQgKGludCkgdGhyb3cgKCk7IHVzaW5nIHN0ZDo6ZXhpdDsnIFwKKyAgICdleHRlcm4gIkMiIHZvaWQgc3RkOjpleGl0IChpbnQpOyB1c2luZyBzdGQ6OmV4aXQ7JyBcCisgICAnZXh0ZXJuICJDIiB2b2lkIGV4aXQgKGludCkgdGhyb3cgKCk7JyBcCisgICAnZXh0ZXJuICJDIiB2b2lkIGV4aXQgKGludCk7JyBcCisgICAndm9pZCBleGl0IChpbnQpOycKK2RvCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2RlY2xhcmF0aW9uCisjaW5jbHVkZSA8c3RkbGliLmg+CitpbnQKK21haW4gKCkKK3sKK2V4aXQgKDQyKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2RlY2xhcmF0aW9uCitpbnQKK21haW4gKCkKK3sKK2V4aXQgKDQyKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGJyZWFrCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Citkb25lCitybSAtZiBjb25mdGVzdCoKK2lmIHRlc3QgLW4gIiRhY19kZWNsYXJhdGlvbiI7IHRoZW4KKyAgZWNobyAnI2lmZGVmIF9fY3BsdXNwbHVzJyA+PmNvbmZkZWZzLmgKKyAgZWNobyAkYWNfZGVjbGFyYXRpb24gICAgICA+PmNvbmZkZWZzLmgKKyAgZWNobyAnI2VuZGlmJyAgICAgICAgICAgICA+PmNvbmZkZWZzLmgKK2ZpCisKK2FjX2V4dD1jYworYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKKworCisKK2lmIHRlc3QgLW4gIiRDWFgiICYmICggdGVzdCAiWCRDWFgiICE9ICJYbm8iICYmCisgICAgKCAodGVzdCAiWCRDWFgiID0gIlhnKysiICYmIGBnKysgLXYgPi9kZXYvbnVsbCAyPiYxYCApIHx8CisgICAgKHRlc3QgIlgkQ1hYIiAhPSAiWGcrKyIpKSkgOyB0aGVuCisgIGFjX2V4dD1jYworYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDKysgcHJlcHJvY2Vzc29yIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQysrIHByZXByb2Nlc3Nvci4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgLXogIiRDWFhDUFAiOyB0aGVuCisgIGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DWFhDUFArc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENYWENQUCBuZWVkcyB0byBiZSBleHBhbmRlZAorICAgIGZvciBDWFhDUFAgaW4gIiRDWFggLUUiICIvbGliL2NwcCIKKyAgICBkbworICAgICAgYWNfcHJlcHJvY19vaz1mYWxzZQorZm9yIGFjX2N4eF9wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKK2RvCisgICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKKyAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCisgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKwkJICAgICBTeW50YXggZXJyb3IKK19BQ0VPRgoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQorICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgYWNfY3BwX2Vycj0kYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnCisgICAgYWNfY3BwX2Vycj0kYWNfY3BwX2VyciRhY19jeHhfd2Vycm9yX2ZsYWcKKyAgZWxzZQorICAgIGFjX2NwcF9lcnI9CisgIGZpCitlbHNlCisgIGFjX2NwcF9lcnI9eWVzCitmaQoraWYgdGVzdCAteiAiJGFjX2NwcF9lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCitjb250aW51ZQorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CisKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbi1leGlzdGVudCBoZWFkZXJzCisgICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+CitfQUNFT0YKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0KSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbDsgdGhlbgorICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGFjX2NwcF9lcnI9JGFjX2N4eF9wcmVwcm9jX3dhcm5fZmxhZworICAgIGFjX2NwcF9lcnI9JGFjX2NwcF9lcnIkYWNfY3h4X3dlcnJvcl9mbGFnCisgIGVsc2UKKyAgICBhY19jcHBfZXJyPQorICBmaQorZWxzZQorICBhY19jcHBfZXJyPXllcworZmkKK2lmIHRlc3QgLXogIiRhY19jcHBfZXJyIjsgdGhlbgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhaworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK2lmICRhY19wcmVwcm9jX29rOyB0aGVuCisgIGJyZWFrCitmaQorCisgICAgZG9uZQorICAgIGFjX2N2X3Byb2dfQ1hYQ1BQPSRDWFhDUFAKKworZmkKKyAgQ1hYQ1BQPSRhY19jdl9wcm9nX0NYWENQUAorZWxzZQorICBhY19jdl9wcm9nX0NYWENQUD0kQ1hYQ1BQCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENYWENQUCIgPiY1CitlY2hvICIke0VDSE9fVH0kQ1hYQ1BQIiA+JjYKK2FjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jeHhfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCitkbworICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisgICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgorICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisJCSAgICAgU3ludGF4IGVycm9yCitfQUNFT0YKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0KSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbDsgdGhlbgorICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGFjX2NwcF9lcnI9JGFjX2N4eF9wcmVwcm9jX3dhcm5fZmxhZworICAgIGFjX2NwcF9lcnI9JGFjX2NwcF9lcnIkYWNfY3h4X3dlcnJvcl9mbGFnCisgIGVsc2UKKyAgICBhY19jcHBfZXJyPQorICBmaQorZWxzZQorICBhY19jcHBfZXJyPXllcworZmkKK2lmIHRlc3QgLXogIiRhY19jcHBfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorCisgICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub24tZXhpc3RlbnQgaGVhZGVycworICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgorX0FDRU9GCitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1CisgIChldmFsICRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBhY19jcHBfZXJyPSRhY19jeHhfcHJlcHJvY193YXJuX2ZsYWcKKyAgICBhY19jcHBfZXJyPSRhY19jcHBfZXJyJGFjX2N4eF93ZXJyb3JfZmxhZworICBlbHNlCisgICAgYWNfY3BwX2Vycj0KKyAgZmkKK2Vsc2UKKyAgYWNfY3BwX2Vycj15ZXMKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KKyAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorCitkb25lCisjIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitpZiAkYWNfcHJlcHJvY19vazsgdGhlbgorICA6CitlbHNlCisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IEMrKyBwcmVwcm9jZXNzb3IgXCIkQ1hYQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBDKysgcHJlcHJvY2Vzc29yIFwiJENYWENQUFwiIGZhaWxzIHNhbml0eSBjaGVjaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKK2FjX2V4dD1jYworYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKKworZmkKKworCithY19leHQ9ZgorYWNfY29tcGlsZT0nJEY3NyAtYyAkRkZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJEY3NyAtbyBjb25mdGVzdCRhY19leGVleHQgJEZGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfZjc3X2NvbXBpbGVyX2dudQoraWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICBmb3IgYWNfcHJvZyBpbiBnNzcgZjc3IHhsZiBmcnQgcGdmNzcgZm9ydDc3IGZsMzIgYWY3NyBmOTAgeGxmOTAgcGdmOTAgZXBjZjkwIGY5NSBmb3J0IHhsZjk1IGlmYyBlZmMgcGdmOTUgbGY5NSBnZm9ydHJhbgorICBkbworICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX0Y3NytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkRjc3IjsgdGhlbgorICBhY19jdl9wcm9nX0Y3Nz0iJEY3NyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfRjc3PSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK0Y3Nz0kYWNfY3ZfcHJvZ19GNzcKK2lmIHRlc3QgLW4gIiRGNzciOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRGNzciID4mNQorZWNobyAiJHtFQ0hPX1R9JEY3NyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgICB0ZXN0IC1uICIkRjc3IiAmJiBicmVhaworICBkb25lCitmaQoraWYgdGVzdCAteiAiJEY3NyI7IHRoZW4KKyAgYWNfY3RfRjc3PSRGNzcKKyAgZm9yIGFjX3Byb2cgaW4gZzc3IGY3NyB4bGYgZnJ0IHBnZjc3IGZvcnQ3NyBmbDMyIGFmNzcgZjkwIHhsZjkwIHBnZjkwIGVwY2Y5MCBmOTUgZm9ydCB4bGY5NSBpZmMgZWZjIHBnZjk1IGxmOTUgZ2ZvcnRyYW4KK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0Y3NytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfRjc3IjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0Y3Nz0iJGFjX2N0X0Y3NyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfRjc3PSIkYWNfcHJvZyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK2FjX2N0X0Y3Nz0kYWNfY3ZfcHJvZ19hY19jdF9GNzcKK2lmIHRlc3QgLW4gIiRhY19jdF9GNzciOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9GNzciID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0Y3NyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgdGVzdCAtbiAiJGFjX2N0X0Y3NyIgJiYgYnJlYWsKK2RvbmUKKworICBGNzc9JGFjX2N0X0Y3NworZmkKKworCisjIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCitlY2hvICIkYXNfbWU6NTI5NjoiIFwKKyAgICAgImNoZWNraW5nIGZvciBGb3J0cmFuIDc3IGNvbXBpbGVyIHZlcnNpb24iID4mNQorYWNfY29tcGlsZXI9YHNldCBYICRhY19jb21waWxlOyBlY2hvICQyYAoreyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZXIgLS12ZXJzaW9uIDwvZGV2L251bGwgPiY1XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA8L2Rldi9udWxsID4mNSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfQoreyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZXIgLXYgPC9kZXYvbnVsbCA+JjVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZXIgLXYgPC9kZXYvbnVsbCA+JjUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KK3sgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVyIC1WIDwvZGV2L251bGwgPiY1XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGVyIC1WIDwvZGV2L251bGwgPiY1KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9CitybSAtZiBhLm91dAorCisjIElmIHdlIGRvbid0IHVzZSBgLkYnIGFzIGV4dGVuc2lvbiwgdGhlIHByZXByb2Nlc3NvciBpcyBub3QgcnVuIG9uIHRoZQorIyBpbnB1dCBmaWxlLiAgKE5vdGUgdGhhdCB0aGlzIG9ubHkgbmVlZHMgdG8gd29yayBmb3IgR05VIGNvbXBpbGVycy4pCithY19zYXZlX2V4dD0kYWNfZXh0CithY19leHQ9RgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgRm9ydHJhbiA3NyBjb21waWxlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgRm9ydHJhbiA3NyBjb21waWxlci4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfZjc3X2NvbXBpbGVyX2dudStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyAgICAgIHByb2dyYW0gbWFpbgorI2lmbmRlZiBfX0dOVUNfXworICAgICAgIGNob2tlIG1lCisjZW5kaWYKKworICAgICAgZW5kCitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfZjc3X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jb21waWxlcl9nbnU9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2NvbXBpbGVyX2dudT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2FjX2N2X2Y3N19jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQorCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Y3N19jb21waWxlcl9nbnUiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2Y3N19jb21waWxlcl9nbnUiID4mNgorYWNfZXh0PSRhY19zYXZlX2V4dAorYWNfdGVzdF9GRkxBR1M9JHtGRkxBR1Mrc2V0fQorYWNfc2F2ZV9GRkxBR1M9JEZGTEFHUworRkZMQUdTPQorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJEY3NyBhY2NlcHRzIC1nIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciAkRjc3IGFjY2VwdHMgLWcuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfZjc3X2crc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgRkZMQUdTPS1nCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyAgICAgIHByb2dyYW0gbWFpbgorCisgICAgICBlbmQKK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19mNzdfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X3Byb2dfZjc3X2c9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2N2X3Byb2dfZjc3X2c9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcHJvZ19mNzdfZyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfcHJvZ19mNzdfZyIgPiY2CitpZiB0ZXN0ICIkYWNfdGVzdF9GRkxBR1MiID0gc2V0OyB0aGVuCisgIEZGTEFHUz0kYWNfc2F2ZV9GRkxBR1MKK2VsaWYgdGVzdCAkYWNfY3ZfcHJvZ19mNzdfZyA9IHllczsgdGhlbgorICBpZiB0ZXN0ICJ4JGFjX2N2X2Y3N19jb21waWxlcl9nbnUiID0geHllczsgdGhlbgorICAgIEZGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgRkZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAieCRhY19jdl9mNzdfY29tcGlsZXJfZ251IiA9IHh5ZXM7IHRoZW4KKyAgICBGRkxBR1M9Ii1PMiIKKyAgZWxzZQorICAgIEZGTEFHUz0KKyAgZmkKK2ZpCisKK0c3Nz1gdGVzdCAkYWNfY29tcGlsZXJfZ251ID0geWVzICYmIGVjaG8geWVzYAorYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKKworIyBBdXRvY29uZiAyLjEzJ3MgQUNfT0JKRVhUIGFuZCBBQ19FWEVFWFQgbWFjcm9zIG9ubHkgd29ya3MgZm9yIEMgY29tcGlsZXJzIQorCisjIGZpbmQgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtsdF9jdl9zeXNfbWF4X2NtZF9sZW4rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgICBpPTAKKyAgdGVzdHN0cmluZz0iQUJDRCIKKworICBjYXNlICRidWlsZF9vcyBpbgorICBtc2Rvc2RqZ3BwKikKKyAgICAjIE9uIERKR1BQLCB0aGlzIHRlc3QgY2FuIGJsb3cgdXAgcHJldHR5IGJhZGx5IGR1ZSB0byBwcm9ibGVtcyBpbiBsaWJjCisgICAgIyAoYW55IHNpbmdsZSBhcmd1bWVudCBleGNlZWRpbmcgMjAwMCBieXRlcyBjYXVzZXMgYSBidWZmZXIgb3ZlcnJ1bgorICAgICMgZHVyaW5nIGdsb2IgZXhwYW5zaW9uKS4gIEV2ZW4gaWYgaXQgd2VyZSBmaXhlZCwgdGhlIHJlc3VsdCBvZiB0aGlzCisgICAgIyBjaGVjayB3b3VsZCBiZSBsYXJnZXIgdGhhbiBpdCBzaG91bGQgYmUuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTEyMjg4OyAgICAjIDEySyBpcyBhYm91dCByaWdodAorICAgIDs7CisKKyAgZ251KikKKyAgICAjIFVuZGVyIEdOVSBIdXJkLCB0aGlzIHRlc3QgaXMgbm90IHJlcXVpcmVkIGJlY2F1c2UgdGhlcmUgaXMKKyAgICAjIG5vIGxpbWl0IHRvIHRoZSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAgICAjIExpYnRvb2wgd2lsbCBpbnRlcnByZXQgLTEgYXMgbm8gbGltaXQgd2hhdHNvZXZlcgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0tMTsKKyAgICA7OworCisgIGN5Z3dpbiogfCBtaW5ndyopCisgICAgIyBPbiBXaW45eC9NRSwgdGhpcyB0ZXN0IGJsb3dzIHVwIC0tIGl0IHN1Y2NlZWRzLCBidXQgdGFrZXMKKyAgICAjIGFib3V0IDUgbWludXRlcyBhcyB0aGUgdGVzdHN0cmluZyBncm93cyBleHBvbmVudGlhbGx5LgorICAgICMgV29yc2UsIHNpbmNlIDl4L01FIGFyZSBub3QgcHJlLWVtcHRpdmVseSBtdWx0aXRhc2tpbmcsCisgICAgIyB5b3UgZW5kIHVwIHdpdGggYSAiZnJvemVuIiBjb21wdXRlciwgZXZlbiB0aG91Z2ggd2l0aCBwYXRpZW5jZQorICAgICMgdGhlIHRlc3QgZXZlbnR1YWxseSBzdWNjZWVkcyAod2l0aCBhIG1heCBsaW5lIGxlbmd0aCBvZiAyNTZrKS4KKyAgICAjIEluc3RlYWQsIGxldCdzIGp1c3QgcHVudDogdXNlIHRoZSBtaW5pbXVtIGxpbmVsZW5ndGggcmVwb3J0ZWQgYnkKKyAgICAjIGFsbCBvZiB0aGUgc3VwcG9ydGVkIHBsYXRmb3JtczogODE5MiAob24gTlQvMksvWFApLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOworICAgIDs7CisKKyAgYW1pZ2FvcyopCisgICAgIyBPbiBBbWlnYU9TIHdpdGggcGRrc2gsIHRoaXMgdGVzdCB0YWtlcyBob3VycywgbGl0ZXJhbGx5LgorICAgICMgU28gd2UganVzdCBwdW50IGFuZCB1c2UgYSBtaW5pbXVtIGxpbmUgbGVuZ3RoIG9mIDgxOTIuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTI7CisgICAgOzsKKworICBuZXRic2QqIHwgZnJlZWJzZCogfCBvcGVuYnNkKiB8IGRhcndpbiogfCBkcmFnb25mbHkqKQorICAgICMgVGhpcyBoYXMgYmVlbiBhcm91bmQgc2luY2UgMzg2QlNELCBhdCBsZWFzdC4gIExpa2VseSBmdXJ0aGVyLgorICAgIGlmIHRlc3QgLXggL3NiaW4vc3lzY3RsOyB0aGVuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YC9zYmluL3N5c2N0bCAtbiBrZXJuLmFyZ21heGAKKyAgICBlbGlmIHRlc3QgLXggL3Vzci9zYmluL3N5c2N0bDsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAvdXNyL3NiaW4vc3lzY3RsIC1uIGtlcm4uYXJnbWF4YAorICAgIGVsc2UKKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj02NTUzNgkjIHVzYWJsZSBkZWZhdWx0IGZvciBhbGwgQlNEcworICAgIGZpCisgICAgIyBBbmQgYWRkIGEgc2FmZXR5IHpvbmUKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyA0YAorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwqIDNgCisgICAgOzsKKworICBpbnRlcml4KikKKyAgICAjIFdlIGtub3cgdGhlIHZhbHVlIDI2MjE0NCBhbmQgaGFyZGNvZGUgaXQgd2l0aCBhIHNhZmV0eSB6b25lIChsaWtlIEJTRCkKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTk2NjA4CisgICAgOzsKKworICBvc2YqKQorICAgICMgRHIuIEhhbnMgRWtrZWhhcmQgUGxlc3NlciByZXBvcnRzIHNlZWluZyBhIGtlcm5lbCBwYW5pYyBydW5uaW5nIGNvbmZpZ3VyZQorICAgICMgZHVlIHRvIHRoaXMgdGVzdCB3aGVuIGV4ZWNfZGlzYWJsZV9hcmdfbGltaXQgaXMgMSBvbiBUcnU2NC4gSXQgaXMgbm90CisgICAgIyBuaWNlIHRvIGNhdXNlIGtlcm5lbCBwYW5pY3Mgc28gbGV0cyBhdm9pZCB0aGUgbG9vcCBiZWxvdy4KKyAgICAjIEZpcnN0IHNldCBhIHJlYXNvbmFibGUgZGVmYXVsdC4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTYzODQKKyAgICAjCisgICAgaWYgdGVzdCAteCAvc2Jpbi9zeXNjb25maWc7IHRoZW4KKyAgICAgIGNhc2UgYC9zYmluL3N5c2NvbmZpZyAtcSBwcm9jIGV4ZWNfZGlzYWJsZV9hcmdfbGltaXRgIGluCisgICAgICAgICoxKikgbHRfY3Zfc3lzX21heF9jbWRfbGVuPS0xIDs7CisgICAgICBlc2FjCisgICAgZmkKKyAgICA7OworICBzY28zLjJ2NSopCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTEwMjQwMAorICAgIDs7CisgIHN5c3Y1KiB8IHNjbzV2NiogfCBzeXN2NC4ydXcyKikKKyAgICBrYXJnbWF4PWBncmVwIEFSR19NQVggL2V0Yy9jb25mL2NmLmQvc3R1bmUgMj4vZGV2L251bGxgCisgICAgaWYgdGVzdCAtbiAiJGthcmdtYXgiOyB0aGVuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGVjaG8gJGthcmdtYXggfCBzZWQgJ3MvLipbIAldLy8nYAorICAgIGVsc2UKKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0zMjc2OAorICAgIGZpCisgICAgOzsKKyAgKikKKyAgICAjIElmIHRlc3QgaXMgbm90IGEgc2hlbGwgYnVpbHQtaW4sIHdlJ2xsIHByb2JhYmx5IGVuZCB1cCBjb21wdXRpbmcgYQorICAgICMgbWF4aW11bSBsZW5ndGggdGhhdCBpcyBvbmx5IGhhbGYgb2YgdGhlIGFjdHVhbCBtYXhpbXVtIGxlbmd0aCwgYnV0CisgICAgIyB3ZSBjYW4ndCB0ZWxsLgorICAgIFNIRUxMPSR7U0hFTEwtJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH19CisgICAgd2hpbGUgKHRlc3QgIlgiYCRTSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8gIlgkdGVzdHN0cmluZyIgMj4vZGV2L251bGxgIFwKKwkgICAgICAgPSAiWFgkdGVzdHN0cmluZyIpID4vZGV2L251bGwgMj4mMSAmJgorCSAgICBuZXdfcmVzdWx0PWBleHByICJYJHRlc3RzdHJpbmciIDogIi4qIiAyPiYxYCAmJgorCSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49JG5ld19yZXN1bHQgJiYKKwkgICAgdGVzdCAkaSAhPSAxNyAjIDEvMiBNQiBzaG91bGQgYmUgZW5vdWdoCisgICAgZG8KKyAgICAgIGk9YGV4cHIgJGkgKyAxYAorICAgICAgdGVzdHN0cmluZz0kdGVzdHN0cmluZyR0ZXN0c3RyaW5nCisgICAgZG9uZQorICAgIHRlc3RzdHJpbmc9CisgICAgIyBBZGQgYSBzaWduaWZpY2FudCBzYWZldHkgZmFjdG9yIGJlY2F1c2UgQysrIGNvbXBpbGVycyBjYW4gdGFjayBvbiBtYXNzaXZlCisgICAgIyBhbW91bnRzIG9mIGFkZGl0aW9uYWwgYXJndW1lbnRzIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlIGxpbmtlci4KKyAgICAjIEl0IGFwcGVhcnMgYXMgdGhvdWdoIDEvMiBpcyBhIHVzYWJsZSB2YWx1ZS4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyAyYAorICAgIDs7CisgIGVzYWMKKworZmkKKworaWYgdGVzdCAtbiAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIDsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9jdl9zeXNfbWF4X2NtZF9sZW4iID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBub25lIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vbmUiID4mNgorZmkKKworCisKKworIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQgZnJvbSAkY29tcGlsZXIgb2JqZWN0IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IGZyb20gJGNvbXBpbGVyIG9iamVjdC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorCisjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KKyMgW1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyldCisKKyMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KK3N5bWNvZGU9J1tCQ0RFR1JTVF0nCisKKyMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgorc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKKworIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgorbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBpbnQgXDE7L3AnIgorCisjIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBzeW1ib2wgbmFtZSBhbmQgc3ltYm9sIGFkZHJlc3MKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbXiBdKlwpICQvICB7XFxcIlwxXFxcIiwgKGx0X3B0cikgMH0sL3AnIC1lICdzL14kc3ltY29kZSBcKFteIF0qXCkgXChbXiBdKlwpJC8gIHtcIlwyXCIsIChsdF9wdHIpIFwmXDJ9LC9wJyIKKworIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeCopCisgIHN5bWNvZGU9J1tCQ0RUXScKKyAgOzsKK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgc3ltY29kZT0nW0FCQ0RHSVNUV10nCisgIDs7CitocHV4KikgIyBJdHMgbGlua2VyIGRpc3Rpbmd1aXNoZXMgZGF0YSBmcm9tIGNvZGUgc3ltYm9scworICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgIHN5bWNvZGU9J1tBQkNERUdSU1RdJworICBmaQorICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGludCBcMSgpOy9wJyAtZSAncy9eJHN5bWNvZGUqIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgorICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0ic2VkIC1uIC1lICdzL146IFwoW14gXSpcKSAkLyAge1xcXCJcMVxcXCIsIChsdF9wdHIpIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW14gXSpcKSBcKFteIF0qXCkkLyAge1wiXDJcIiwgKGx0X3B0cikgXCZcMn0sL3AnIgorICA7OworbGludXgqKQorICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgIHN5bWNvZGU9J1tBQkNER0lSU1RXXScKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGludCBcMSgpOy9wJyAtZSAncy9eJHN5bWNvZGUqIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbXiBdKlwpICQvICB7XFxcIlwxXFxcIiwgKGx0X3B0cikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbXiBdKlwpIFwoW14gXSpcKSQvICB7XCJcMlwiLCAobHRfcHRyKSBcJlwyfSwvcCciCisgIGZpCisgIDs7Citpcml4KiB8IG5vbnN0b3B1eCopCisgIHN5bWNvZGU9J1tCQ0RFR1JTVF0nCisgIDs7Citvc2YqKQorICBzeW1jb2RlPSdbQkNERUdRUlNUXScKKyAgOzsKK3NvbGFyaXMqKQorICBzeW1jb2RlPSdbQkRSVF0nCisgIDs7CitzY28zLjJ2NSopCisgIHN5bWNvZGU9J1tEVF0nCisgIDs7CitzeXN2NC4ydXcyKikKKyAgc3ltY29kZT0nW0RUXScKKyAgOzsKK3N5c3Y1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCopCisgIHN5bWNvZGU9J1tBQkRUXScKKyAgOzsKK3N5c3Y0KQorICBzeW1jb2RlPSdbREZOU1RVXScKKyAgOzsKK2VzYWMKKworIyBIYW5kbGUgQ1JMRiBpbiBtaW5ndyB0b29sIGNoYWluCitvcHRfY3I9CitjYXNlICRidWlsZF9vcyBpbgorbWluZ3cqKQorICBvcHRfY3I9YGVjaG8gJ3hcezAsMVx9JyB8IHRyIHggJ1wwMTUnYCAjIG9wdGlvbiBjciBpbiByZWdleHAKKyAgOzsKK2VzYWMKKworIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCitjYXNlIGAkTk0gLVYgMj4mMWAgaW4KKypHTlUqIHwgKid3aXRoIEJGRCcqKQorICBzeW1jb2RlPSdbQUJDREdJUlNUV10nIDs7Citlc2FjCisKKyMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCitmb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCisKKyAgIyBUcmFuc2Zvcm0gc3ltY29kZSwgc3ltcGF0LCBhbmQgc3ltcHJmeCBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KKyAgc3lteGZybT0iXFwxICRhY19zeW1wcmZ4XFwyIFxcMiIKKworICAjIFdyaXRlIHRoZSByYXcgYW5kIEMgaWRlbnRpZmllcnMuCisgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLipbIAldXCgkc3ltY29kZSRzeW1jb2RlKlwpWyAJXVsgCV0qJGFjX3N5bXByZngkc3ltcGF0JG9wdF9jciQvJHN5bXhmcm0vcCciCisKKyAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCisgIHBpcGVfd29ya3M9bm8KKworICBybSAtZiBjb25mdGVzdCoKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorY2hhciBubV90ZXN0X3ZhcjsKK3ZvaWQgbm1fdGVzdF9mdW5jKCl7fQorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKK2ludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYygpO3JldHVybigwKTt9CitFT0YKKworICBpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KKyAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KKyAgICBubGlzdD1jb25mdGVzdC5ubQorICAgIGlmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJG5saXN0XCIiKSA+JjUKKyAgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJG5saXN0KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHRlc3QgLXMgIiRubGlzdCI7IHRoZW4KKyAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCisgICAgICBpZiBzb3J0ICIkbmxpc3QiIHwgdW5pcSA+ICIkbmxpc3QiVDsgdGhlbgorCW12IC1mICIkbmxpc3QiVCAiJG5saXN0IgorICAgICAgZWxzZQorCXJtIC1mICIkbmxpc3QiVAorICAgICAgZmkKKworICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgorICAgICAgaWYgZ3JlcCAnIG5tX3Rlc3RfdmFyJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCWlmIGdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCisJICBjYXQgPDxFT0YgPiBjb25mdGVzdC4kYWNfZXh0CisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK0VPRgorCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgorCSAgZXZhbCAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IiB8IGdyZXAgLXYgbWFpbiA+PiBjb25mdGVzdC4kYWNfZXh0JworCisJICBjYXQgPDxFT0YgPj4gY29uZnRlc3QuJGFjX2V4dAorI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXworIyBkZWZpbmUgbHRfcHRyX3Qgdm9pZCAqCisjZWxzZQorIyBkZWZpbmUgbHRfcHRyX3QgY2hhciAqCisjIGRlZmluZSBjb25zdAorI2VuZGlmCisKKy8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLworY29uc3Qgc3RydWN0IHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgbHRfcHRyX3QgYWRkcmVzczsKK30KK2x0X3ByZWxvYWRlZF9zeW1ib2xzW10gPQoreworRU9GCisJICAkU0VEICJzL14kc3ltY29kZSRzeW1jb2RlKiBcKC4qXCkgXCguKlwpJC8gIHtcIlwyXCIsIChsdF9wdHJfdCkgXCZcMn0sLyIgPCAiJG5saXN0IiB8IGdyZXAgLXYgbWFpbiA+PiBjb25mdGVzdC4kYWNfZXh0CisJICBjYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LiRhY19leHQKKyAgezAsIChsdF9wdHJfdCkgMH0KK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitFT0YKKwkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCisJICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0c3RtLiRhY19vYmpleHQKKwkgIGx0X3NhdmVfTElCUz0iJExJQlMiCisJICBsdF9zYXZlX0NGTEFHUz0iJENGTEFHUyIKKwkgIExJQlM9ImNvbmZ0c3RtLiRhY19vYmpleHQiCisJICBDRkxBR1M9IiRDRkxBR1MkbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWciCisJICBpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorCSAgICBwaXBlX3dvcmtzPXllcworCSAgZmkKKwkgIExJQlM9IiRsdF9zYXZlX0xJQlMiCisJICBDRkxBR1M9IiRsdF9zYXZlX0NGTEFHUyIKKwllbHNlCisJICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJG5saXN0IiA+JjUKKwlmaQorICAgICAgZWxzZQorCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRubGlzdCIgPiY1CisgICAgICBmaQorICAgIGVsc2UKKyAgICAgIGVjaG8gImNhbm5vdCBydW4gJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mNQorICAgIGZpCisgIGVsc2UKKyAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBmaQorICBybSAtZiBjb25mdGVzdCogY29uZnRzdCoKKworICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCisgIGlmIHRlc3QgIiRwaXBlX3dvcmtzIiA9IHllczsgdGhlbgorICAgIGJyZWFrCisgIGVsc2UKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQorICBmaQorZG9uZQorCitmaQorCitpZiB0ZXN0IC16ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KKyAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9CitmaQoraWYgdGVzdCAteiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGZhaWxlZCIgPiY1CitlY2hvICIke0VDSE9fVH1mYWlsZWQiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBvayIgPiY1CitlY2hvICIke0VDSE9fVH1vayIgPiY2CitmaQorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIG9iamRpciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBvYmpkaXIuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X2N2X29iamRpcitzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBybSAtZiAubGlicyAyPi9kZXYvbnVsbAorbWtkaXIgLmxpYnMgMj4vZGV2L251bGwKK2lmIHRlc3QgLWQgLmxpYnM7IHRoZW4KKyAgbHRfY3Zfb2JqZGlyPS5saWJzCitlbHNlCisgICMgTVMtRE9TIGRvZXMgbm90IGFsbG93IGZpbGVuYW1lcyB0aGF0IGJlZ2luIHdpdGggYSBkb3QuCisgIGx0X2N2X29iamRpcj1fbGlicworZmkKK3JtZGlyIC5saWJzIDI+L2Rldi9udWxsCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGx0X2N2X29iamRpciIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfY3Zfb2JqZGlyIiA+JjYKK29iamRpcj0kbHRfY3Zfb2JqZGlyCisKKworCisKKworY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgICMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQorICAjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKKyAgIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgorICBpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KKyAgICBDT0xMRUNUX05BTUVTPQorICAgIGV4cG9ydCBDT0xMRUNUX05BTUVTCisgIGZpCisgIDs7Citlc2FjCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKKyMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitYc2VkPSdzZWQgLWUgMXMvXlgvLycKK3NlZF9xdW90ZV9zdWJzdD0ncy9cKFtcXCJcXGAkXFxcXF1cKS9cXFwxL2cnCisKKyMgU2FtZSBhcyBhYm92ZSwgYnV0IGRvIG5vdCBxdW90ZSB2YXJpYWJsZSByZWZlcmVuY2VzLgorZG91YmxlX3F1b3RlX3N1YnN0PSdzL1woW1xcIlxcYFxcXFxdXCkvXFxcMS9nJworCisjIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2hlbGwgdmFyaWFibGUgaW4gYQorIyBkb3VibGVfcXVvdGVfc3Vic3QnZWQgc3RyaW5nLgorZGVsYXlfdmFyaWFibGVfc3Vic3Q9J3MvXFxcXFxcXFxcXFwkL1xcXFxcXCQvZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGF2b2lkIGFjY2lkZW50YWwgZ2xvYmJpbmcgaW4gZXZhbGVkIGV4cHJlc3Npb25zCitub19nbG9iX3N1YnN0PSdzL1wqL1xcXCovZycKKworIyBDb25zdGFudHM6CitybT0icm0gLWYiCisKKyMgR2xvYmFsIHZhcmlhYmxlczoKK2RlZmF1bHRfb2ZpbGU9bGlidG9vbAorY2FuX2J1aWxkX3NoYXJlZD15ZXMKKworIyBBbGwga25vd24gbGlua2VycyByZXF1aXJlIGEgYC5hJyBhcmNoaXZlIGZvciBzdGF0aWMgbGlua2luZyAoZXhjZXB0IE1TVkMsCisjIHdoaWNoIG5lZWRzICcubGliJykuCitsaWJleHQ9YQorbHRtYWluPSIkYWNfYXV4X2Rpci9sdG1haW4uc2giCitvZmlsZT0iJGRlZmF1bHRfb2ZpbGUiCit3aXRoX2dudV9sZD0iJGx0X2N2X3Byb2dfZ251X2xkIgorCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hcjsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19BUitzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQVIiOyB0aGVuCisgIGFjX2N2X3Byb2dfQVI9IiRBUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfQVI9IiR7YWNfdG9vbF9wcmVmaXh9YXIiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCitBUj0kYWNfY3ZfcHJvZ19BUgoraWYgdGVzdCAtbiAiJEFSIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQVIiID4mNQorZWNobyAiJHtFQ0hPX1R9JEFSIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX0FSIjsgdGhlbgorICBhY19jdF9BUj0kQVIKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJhciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgYXI7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQVIrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0FSIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0FSPSIkYWNfY3RfQVIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0FSPSJhciIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX2FjX2N0X0FSIiAmJiBhY19jdl9wcm9nX2FjX2N0X0FSPSJmYWxzZSIKK2ZpCitmaQorYWNfY3RfQVI9JGFjX2N2X3Byb2dfYWNfY3RfQVIKK2lmIHRlc3QgLW4gIiRhY19jdF9BUiI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0FSIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdF9BUiIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgQVI9JGFjX2N0X0FSCitlbHNlCisgIEFSPSIkYWNfY3ZfcHJvZ19BUiIKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1yYW5saWI7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfUkFOTElCK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKK2ZpCitmaQorUkFOTElCPSRhY19jdl9wcm9nX1JBTkxJQgoraWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJFJBTkxJQiIgPiY1CitlY2hvICIke0VDSE9fVH0kUkFOTElCIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiI7IHRoZW4KKyAgYWNfY3RfUkFOTElCPSRSQU5MSUIKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9IiRhY19jdF9SQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0icmFubGliIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCIiAmJiBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0iOiIKK2ZpCitmaQorYWNfY3RfUkFOTElCPSRhY19jdl9wcm9nX2FjX2N0X1JBTkxJQgoraWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X1JBTkxJQiIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfUkFOTElCIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworICBSQU5MSUI9JGFjX2N0X1JBTkxJQgorZWxzZQorICBSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXN0cmlwOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX1NUUklQK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRTVFJJUCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19TVFJJUD0iJFNUUklQIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19TVFJJUD0iJHthY190b29sX3ByZWZpeH1zdHJpcCIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK1NUUklQPSRhY19jdl9wcm9nX1NUUklQCitpZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRTVFJJUCIgPiY1CitlY2hvICIke0VDSE9fVH0kU1RSSVAiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfU1RSSVAiOyB0aGVuCisgIGFjX2N0X1NUUklQPSRTVFJJUAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBzdHJpcDsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9TVFJJUCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9IiRhY19jdF9TVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9InN0cmlwIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfYWNfY3RfU1RSSVAiICYmIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9IjoiCitmaQorZmkKK2FjX2N0X1NUUklQPSRhY19jdl9wcm9nX2FjX2N0X1NUUklQCitpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9TVFJJUCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfU1RSSVAiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIFNUUklQPSRhY19jdF9TVFJJUAorZWxzZQorICBTVFJJUD0iJGFjX2N2X3Byb2dfU1RSSVAiCitmaQorCisKK29sZF9DQz0iJENDIgorb2xkX0NGTEFHUz0iJENGTEFHUyIKKworIyBTZXQgc2FuZSBkZWZhdWx0cyBmb3IgdmFyaW91cyB2YXJpYWJsZXMKK3Rlc3QgLXogIiRBUiIgJiYgQVI9YXIKK3Rlc3QgLXogIiRBUl9GTEFHUyIgJiYgQVJfRkxBR1M9Y3J1Cit0ZXN0IC16ICIkQVMiICYmIEFTPWFzCit0ZXN0IC16ICIkQ0MiICYmIENDPWNjCit0ZXN0IC16ICIkTFRDQyIgJiYgTFRDQz0kQ0MKK3Rlc3QgLXogIiRMVENGTEFHUyIgJiYgTFRDRkxBR1M9JENGTEFHUwordGVzdCAteiAiJERMTFRPT0wiICYmIERMTFRPT0w9ZGxsdG9vbAordGVzdCAteiAiJExEIiAmJiBMRD1sZAordGVzdCAteiAiJExOX1MiICYmIExOX1M9ImxuIC1zIgordGVzdCAteiAiJE1BR0lDX0NNRCIgJiYgTUFHSUNfQ01EPWZpbGUKK3Rlc3QgLXogIiROTSIgJiYgTk09bm0KK3Rlc3QgLXogIiRTRUQiICYmIFNFRD1zZWQKK3Rlc3QgLXogIiRPQkpEVU1QIiAmJiBPQkpEVU1QPW9iamR1bXAKK3Rlc3QgLXogIiRSQU5MSUIiICYmIFJBTkxJQj06Cit0ZXN0IC16ICIkU1RSSVAiICYmIFNUUklQPToKK3Rlc3QgLXogIiRhY19vYmpleHQiICYmIGFjX29iamV4dD1vCisKKyMgRGV0ZXJtaW5lIGNvbW1hbmRzIHRvIGNyZWF0ZSBvbGQtc3R5bGUgc3RhdGljIGFyY2hpdmVzLgorb2xkX2FyY2hpdmVfY21kcz0nJEFSICRBUl9GTEFHUyAkb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMnCitvbGRfcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNjQ0ICRvbGRsaWInCitvbGRfcG9zdHVuaW5zdGFsbF9jbWRzPQorCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBjYXNlICRob3N0X29zIGluCisgIG9wZW5ic2QqKQorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSIkb2xkX3Bvc3RpbnN0YWxsX2NtZHN+XCRSQU5MSUIgLXQgXCRvbGRsaWIiCisgICAgOzsKKyAgKikKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzflwkUkFOTElCIFwkb2xkbGliIgorICAgIDs7CisgIGVzYWMKKyAgb2xkX2FyY2hpdmVfY21kcz0iJG9sZF9hcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRvbGRsaWIiCitmaQorCitmb3IgY2NfdGVtcCBpbiAkY29tcGlsZXIiIjsgZG8KKyAgY2FzZSAkY2NfdGVtcCBpbgorICAgIGNvbXBpbGUgfCAqW1xcL11jb21waWxlIHwgY2NhY2hlIHwgKltcXC9dY2NhY2hlICkgOzsKKyAgICBkaXN0Y2MgfCAqW1xcL11kaXN0Y2MgfCBwdXJpZnkgfCAqW1xcL11wdXJpZnkgKSA7OworICAgIFwtKikgOzsKKyAgICAqKSBicmVhazs7CisgIGVzYWMKK2RvbmUKK2NjX2Jhc2VuYW1lPWAkZWNobyAiWCRjY190ZW1wIiB8ICRYc2VkIC1lICdzJS4qLyUlJyAtZSAicyVeJGhvc3RfYWxpYXMtJSUiYAorCisKKyMgT25seSBwZXJmb3JtIHRoZSBjaGVjayBmb3IgZmlsZSwgaWYgdGhlIGNoZWNrIG1ldGhvZCByZXF1aXJlcyBpdAorY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KK2ZpbGVfbWFnaWMqKQorICBpZiB0ZXN0ICIkZmlsZV9tYWdpY19jbWQiID0gJyRNQUdJQ19DTUQnOyB0aGVuCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAke2FjX3Rvb2xfcHJlZml4fWZpbGUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJHthY190b29sX3ByZWZpeH1maWxlLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtsdF9jdl9wYXRoX01BR0lDX0NNRCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXNlICRNQUdJQ19DTUQgaW4KK1tcXC8qXSB8ICA/OltcXC9dKikKKyAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworKikKKyAgbHRfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBhY19kdW1teT0iL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJHthY190b29sX3ByZWZpeH1maWxlOyB0aGVuCisgICAgICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJGFjX2Rpci8ke2FjX3Rvb2xfcHJlZml4fWZpbGUiCisgICAgICBpZiB0ZXN0IC1uICIkZmlsZV9tYWdpY190ZXN0X2ZpbGUiOyB0aGVuCisJY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KKwkiZmlsZV9tYWdpYyAiKikKKwkgIGZpbGVfbWFnaWNfcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiZmlsZV9tYWdpYyBcKC4qXCkiYAorCSAgTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCisJICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcJGZpbGVfbWFnaWNfdGVzdF9maWxlIDI+IC9kZXYvbnVsbCB8CisJICAgICRFR1JFUCAiJGZpbGVfbWFnaWNfcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCisJICAgIDoKKwkgIGVsc2UKKwkgICAgY2F0IDw8RU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKKyoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KKyoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcworKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0CisqKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKKyoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKKyoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KKyoqKiBidWctbGlidG9vbEBnbnUub3JnCisKK0VPRgorCSAgZmkgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorICBNQUdJQ19DTUQ9IiRsdF9zYXZlX01BR0lDX0NNRCIKKyAgOzsKK2VzYWMKK2ZpCisKK01BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgoraWYgdGVzdCAtbiAiJE1BR0lDX0NNRCI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJE1BR0lDX0NNRCIgPiY1CitlY2hvICIke0VDSE9fVH0kTUFHSUNfQ01EIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworaWYgdGVzdCAteiAiJGx0X2N2X3BhdGhfTUFHSUNfQ01EIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBmaWxlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGZpbGUuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X2N2X3BhdGhfTUFHSUNfQ01EK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhc2UgJE1BR0lDX0NNRCBpbgorW1xcLypdIHwgID86W1xcL10qKQorICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisqKQorICBsdF9zYXZlX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIKKyAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgIGFjX2R1bW15PSIvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9maWxlOyB0aGVuCisgICAgICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJGFjX2Rpci9maWxlIgorICAgICAgaWYgdGVzdCAtbiAiJGZpbGVfbWFnaWNfdGVzdF9maWxlIjsgdGhlbgorCWNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCisJImZpbGVfbWFnaWMgIiopCisJICBmaWxlX21hZ2ljX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogImZpbGVfbWFnaWMgXCguKlwpImAKKwkgIE1BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgorCSAgaWYgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCRmaWxlX21hZ2ljX3Rlc3RfZmlsZSAyPiAvZGV2L251bGwgfAorCSAgICAkRUdSRVAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICA6CisJICBlbHNlCisJICAgIGNhdCA8PEVPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiB0aGUgY29tbWFuZCBsaWJ0b29sIHVzZXMgdG8gZGV0ZWN0IHNoYXJlZCBsaWJyYXJpZXMsCisqKiogJGZpbGVfbWFnaWNfY21kLCBwcm9kdWNlcyBvdXRwdXQgdGhhdCBsaWJ0b29sIGNhbm5vdCByZWNvZ25pemUuCisqKiogVGhlIHJlc3VsdCBpcyB0aGF0IGxpYnRvb2wgbWF5IGZhaWwgdG8gcmVjb2duaXplIHNoYXJlZCBsaWJyYXJpZXMKKyoqKiBhcyBzdWNoLiAgVGhpcyB3aWxsIGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMgdGhhdAorKioqIGRlcGVuZCBvbiBzaGFyZWQgbGlicmFyaWVzLCBidXQgcHJvZ3JhbXMgbGlua2VkIHdpdGggc3VjaCBsaWJ0b29sCisqKiogbGlicmFyaWVzIHdpbGwgd29yayByZWdhcmRsZXNzIG9mIHRoaXMgcHJvYmxlbS4gIE5ldmVydGhlbGVzcywgeW91CisqKiogbWF5IHdhbnQgdG8gcmVwb3J0IHRoZSBwcm9ibGVtIHRvIHlvdXIgc3lzdGVtIG1hbmFnZXIgYW5kL29yIHRvCisqKiogYnVnLWxpYnRvb2xAZ251Lm9yZworCitFT0YKKwkgIGZpIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgTUFHSUNfQ01EPSIkbHRfc2F2ZV9NQUdJQ19DTUQiCisgIDs7Citlc2FjCitmaQorCitNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKK2lmIHRlc3QgLW4gIiRNQUdJQ19DTUQiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRNQUdJQ19DTUQiID4mNQorZWNobyAiJHtFQ0hPX1R9JE1BR0lDX0NNRCIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgZWxzZQorICAgIE1BR0lDX0NNRD06CisgIGZpCitmaQorCisgIGZpCisgIDs7Citlc2FjCisKK2VuYWJsZV9kbG9wZW49bm8KK2VuYWJsZV93aW4zMl9kbGw9eWVzCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1saWJ0b29sLWxvY2sgb3IgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9saWJ0b29sX2xvY2src2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKKworZmk7Cit0ZXN0ICJ4JGVuYWJsZV9saWJ0b29sX2xvY2siICE9IHhubyAmJiBlbmFibGVfbGlidG9vbF9sb2NrPXllcworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtcGljIG9yIC0td2l0aG91dC1waWMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3BpYytzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9waWMiCisgIHBpY19tb2RlPSIkd2l0aHZhbCIKK2Vsc2UKKyAgcGljX21vZGU9ZGVmYXVsdAorZmk7Cit0ZXN0IC16ICIkcGljX21vZGUiICYmIHBpY19tb2RlPWRlZmF1bHQKKworIyBVc2UgQyBmb3IgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpbiB0aGUgbGlidG9vbCBzY3JpcHQKK3RhZ25hbWU9CitsdF9zYXZlX0NDPSIkQ0MiCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEMgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWMKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEMgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK29iamV4dD0kb2JqZXh0CisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCitsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImludCBzb21lX3ZhcmlhYmxlID0gMDtcbiIKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0naW50IG1haW4oKXtyZXR1cm4oMCk7fVxuJworCisKKyMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCitMVENDPSR7TFRDQy0iJENDIn0KKworIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgorTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9CisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitjb21waWxlcj0kQ0MKKworCisjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CitwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0CitldmFsICIkYWNfY29tcGlsZSIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKK19sdF9jb21waWxlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKKyRybSBjb25mdGVzdCoKKworYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CitwcmludGYgIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0CitldmFsICIkYWNfbGluayIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKK19sdF9saW5rZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskcm0gY29uZnRlc3QqCisKKworIyMgQ0FWRUFUIEVNUFRPUjoKKyMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQorIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCisKK2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPQorCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZz0nIC1mbm8tYnVpbHRpbicKKworCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9bm8KKyAgYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CisgICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgbHRfY29tcGlsZXJfZmxhZz0iLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6NjM2MzogJGx0X2NvbXBpbGVcIiIgPiY1KQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgIGVjaG8gIiRhc19tZTo2MzY3OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgIiRhY19vdXRmaWxlIjsgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3Mgb3RoZXIgdGhhbiB0aGUgdXN1YWwgb3V0cHV0LgorICAgICAkZWNobyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9eWVzCisgICAgIGZpCisgICBmaQorICAgJHJtIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPiY2CisKK2lmIHRlc3QgeCIkbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID0geHllczsgdGhlbgorICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPSIkbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIKK2Vsc2UKKyAgICA6CitmaQorCitmaQorCitsdF9wcm9nX2NvbXBpbGVyX3dsPQorbHRfcHJvZ19jb21waWxlcl9waWM9CitsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0KKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMuLi4gJEVDSE9fQyIgPiY2CisKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctc3RhdGljJworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4KikKKyAgICAgICMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAorICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCisgICAgICAjIGxpa2UgYC1tNjgwNDAnLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKKyAgICAgIDs7CisKKyAgICBiZW9zKiB8IGN5Z3dpbiogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgICA7OworCisgICAgbWluZ3cqIHwgcHczMiogfCBvczIqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctRERMTF9FWFBPUlQnCisgICAgICA7OworCisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctZm5vLWNvbW1vbicKKyAgICAgIDs7CisKKyAgICBpbnRlcml4MyopCisgICAgICAjIEludGVyaXggMy54IGdjYyAtZnBpYy8tZlBJQyBvcHRpb25zIGdlbmVyYXRlIGJyb2tlbiBjb2RlLgorICAgICAgIyBJbnN0ZWFkLCB3ZSByZWxvY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCisgICAgICA7OworCisgICAgbXNkb3NkamdwcCopCisgICAgICAjIEp1c3QgYmVjYXVzZSB3ZSB1c2UgR0NDIGRvZXNuJ3QgbWVhbiB3ZSBzdWRkZW5seSBnZXQgc2hhcmVkIGxpYnJhcmllcworICAgICAgIyBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGVtLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICBlbmFibGVfc2hhcmVkPW5vCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCWx0X3Byb2dfY29tcGlsZXJfcGljPS1LY29uZm9ybV9waWMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgaHB1eCopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKKyAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBocHBhKjY0KnxpYTY0KikKKwkjICtaIHRoZSBkZWZhdWx0CisJOzsKKyAgICAgICopCisJbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mUElDJworCTs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctZlBJQycKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgIyBQT1JUTUUgQ2hlY2sgZm9yIGZsYWcgdG8gcGFzcyBsaW5rZXIgZmxhZ3MgdGhyb3VnaCB0aGUgc3lzdGVtIGNvbXBpbGVyLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICBlbHNlCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKKyAgICAgIGZpCisgICAgICA7OworICAgICAgZGFyd2luKikKKyAgICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCisgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgIHhsYyopCisgICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLXFub2NvbW1vbicKKyAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICAgICA7OworICAgICAgIGVzYWMKKyAgICAgICA7OworCisgICAgbWluZ3cqIHwgcHczMiogfCBvczIqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctRERMTF9FWFBPUlQnCisgICAgICA7OworCisgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwgYnV0CisgICAgICAjIG5vdCBmb3IgUEEgSFAtVVguCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCp8aWE2NCopCisJIyArWiB0aGUgZGVmYXVsdAorCTs7CisgICAgICAqKQorCWx0X3Byb2dfY29tcGlsZXJfcGljPScrWicKKwk7OworICAgICAgZXNhYworICAgICAgIyBJcyB0aGVyZSBhIGJldHRlciBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/CisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisgICAgICA7OworCisgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICAjIFBJQyAod2l0aCAtS1BJQykgaXMgdGhlIGRlZmF1bHQuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgbmV3c29zNikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBsaW51eCopCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgaWNjKiB8IGVjYyopCisJbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKwlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1zdGF0aWMnCisgICAgICAgIDs7CisgICAgICBwZ2NjKiB8IHBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KikKKyAgICAgICAgIyBQb3J0bGFuZCBHcm91cCBjb21waWxlcnMgKCpub3QqIHRoZSBQZW50aXVtIGdjYyBjb21waWxlciwKKwkjIHdoaWNoIGxvb2tzIHRvIGJlIGEgZGVhZCBwcm9qZWN0KQorCWx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisJbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mcGljJworCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgICAgOzsKKyAgICAgIGNjYyopCisgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICAgICMgQWxsIEFscGhhIGNvZGUgaXMgUElDLgorICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLW5vbl9zaGFyZWQnCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKyAgICAgICMgQWxsIE9TRi8xIGNvZGUgaXMgUElDLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1ub25fc2hhcmVkJworICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIGY3NyogfCBmOTAqIHwgZjk1KikKKwlsdF9wcm9nX2NvbXBpbGVyX3dsPSctUW9wdGlvbiBsZCAnOzsKKyAgICAgICopCisJbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCc7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctUW9wdGlvbiBsZCAnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLVBJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKwlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtjb25mb3JtX3BpYycKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y1KiB8IHVuaXh3YXJlKiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCBPcGVuVU5JWCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHVuaWNvcyopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICA7OworCisgICAgdXRzNCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLXBpYycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKworZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfcGljIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9wcm9nX2NvbXBpbGVyX3BpYyIgPiY2CisKKyMKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KKyMKK2lmIHRlc3QgLW4gIiRsdF9wcm9nX2NvbXBpbGVyX3BpYyI7IHRoZW4KKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkbHRfcHJvZ19jb21waWxlcl9waWMgd29ya3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljIHdvcmtzLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtsdF9wcm9nX2NvbXBpbGVyX3BpY193b3JrcytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrcz1ubworICBhY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBsdF9jb21waWxlcl9mbGFnPSIkbHRfcHJvZ19jb21waWxlcl9waWMgLURQSUMiCisgICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgorICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KKyAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKKyAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCisgICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOjY2MzE6ICRsdF9jb21waWxlXCIiID4mNSkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6NjYzNTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zICIkYWNfb3V0ZmlsZSI7IHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzIG90aGVyIHRoYW4gdGhlIHVzdWFsIG91dHB1dC4KKyAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyMiB8fCBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzPXllcworICAgICBmaQorICAgZmkKKyAgICRybSBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3JrcyIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3MiID4mNgorCitpZiB0ZXN0IHgiJGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzIiA9IHh5ZXM7IHRoZW4KKyAgICBjYXNlICRsdF9wcm9nX2NvbXBpbGVyX3BpYyBpbgorICAgICAiIiB8ICIgIiopIDs7CisgICAgICopIGx0X3Byb2dfY29tcGlsZXJfcGljPSIgJGx0X3Byb2dfY29tcGlsZXJfcGljIiA7OworICAgICBlc2FjCitlbHNlCisgICAgbHRfcHJvZ19jb21waWxlcl9waWM9CisgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZD1ubworZmkKKworZmkKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgIyBGb3IgcGxhdGZvcm1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IFBJQywgLURQSUMgaXMgbWVhbmluZ2xlc3M6CisgICpkamdwcCopCisgICAgbHRfcHJvZ19jb21waWxlcl9waWM9CisgICAgOzsKKyAgKikKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0iJGx0X3Byb2dfY29tcGlsZXJfcGljIC1EUElDIgorICAgIDs7Citlc2FjCisKKyMKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBzdGF0aWMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KKyMKK3dsPSRsdF9wcm9nX2NvbXBpbGVyX3dsIGV2YWwgbHRfdG1wX3N0YXRpY19mbGFnPVwiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljXCIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3JrcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3JrcytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrcz1ubworICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgIExERkxBR1M9IiRMREZMQUdTICRsdF90bXBfc3RhdGljX2ZsYWciCisgICBwcmludGYgIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgaWYgKGV2YWwgJGFjX2xpbmsgMj5jb25mdGVzdC5lcnIpICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgICAgICMgVGhlIGxpbmtlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgorICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQorICAgICAgICRlY2hvICJYJF9sdF9saW5rZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+IGNvbmZ0ZXN0LmV4cAorICAgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICAgIGlmIGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrcz15ZXMKKyAgICAgICBmaQorICAgICBlbHNlCisgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3M9eWVzCisgICAgIGZpCisgICBmaQorICAgJHJtIGNvbmZ0ZXN0KgorICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3JrcyIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MiID4mNgorCitpZiB0ZXN0IHgiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzIiA9IHh5ZXM7IHRoZW4KKyAgICA6CitlbHNlCisgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9CitmaQorCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfY3ZfcHJvZ19jb21waWxlcl9jX28rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX289bm8KKyAgICRybSAtciBjb25mdGVzdCAyPi9kZXYvbnVsbAorICAgbWtkaXIgY29uZnRlc3QKKyAgIGNkIGNvbmZ0ZXN0CisgICBta2RpciBvdXQKKyAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTo2NzM1OiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6NjczOTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAorICAgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBvdXQvY29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBvdXQvY29uZnRlc3QuZXJyID5vdXQvY29uZnRlc3QuZXIyCisgICAgIGlmIHRlc3QgISAtcyBvdXQvY29uZnRlc3QuZXIyIHx8IGRpZmYgb3V0L2NvbmZ0ZXN0LmV4cCBvdXQvY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbz15ZXMKKyAgICAgZmkKKyAgIGZpCisgICBjaG1vZCB1K3cgLiAyPiY1CisgICAkcm0gY29uZnRlc3QqCisgICAjIFNHSSBDKysgY29tcGlsZXIgd2lsbCBjcmVhdGUgZGlyZWN0b3J5IG91dC9paV9maWxlcy8gZm9yCisgICAjIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KKyAgIHRlc3QgLWQgb3V0L2lpX2ZpbGVzICYmICRybSBvdXQvaWlfZmlsZXMvKiAmJiBybWRpciBvdXQvaWlfZmlsZXMKKyAgICRybSBvdXQvKiAmJiBybWRpciBvdXQKKyAgIGNkIC4uCisgICBybWRpciBjb25mdGVzdAorICAgJHJtIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyIgPiY2CisKKworaGFyZF9saW5rcz0ibm90dGVzdGVkIgoraWYgdGVzdCAiJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vIiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgorICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcy4uLiAkRUNIT19DIiA+JjYKKyAgaGFyZF9saW5rcz15ZXMKKyAgJHJtIGNvbmZ0ZXN0KgorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICB0b3VjaCBjb25mdGVzdC5hCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGhhcmRfbGlua3MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGhhcmRfbGlua3MiID4mNgorICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjI7fQorICAgIG5lZWRfbG9ja3M9d2FybgorICBmaQorZWxzZQorICBuZWVkX2xvY2tzPW5vCitmaQorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICRFQ0hPX0MiID4mNgorCisgIHJ1bnBhdGhfdmFyPQorICBhbGxvd191bmRlZmluZWRfZmxhZz0KKyAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcz1ubworICBhcmNoaXZlX2NtZHM9CisgIGFyY2hpdmVfZXhwc3ltX2NtZHM9CisgIG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHM9CisgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPQorICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9CisgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQorICB0aHJlYWRfc2FmZV9mbGFnX3NwZWM9CisgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9CisgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQ9CisgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9CisgIGhhcmRjb2RlX2RpcmVjdD1ubworICBoYXJkY29kZV9taW51c19MPW5vCisgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9dW5zdXBwb3J0ZWQKKyAgbGlua19hbGxfZGVwbGlicz11bmtub3duCisgIGhhcmRjb2RlX2F1dG9tYXRpYz1ubworICBtb2R1bGVfY21kcz0KKyAgbW9kdWxlX2V4cHN5bV9jbWRzPQorICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9bm8KKyAgZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICAjIGluY2x1ZGVfZXhwc3ltcyBzaG91bGQgYmUgYSBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBzeW1ib2xzIHRvIGJlICphbHdheXMqCisgICMgaW5jbHVkZWQgaW4gdGhlIHN5bWJvbCBsaXN0CisgIGluY2x1ZGVfZXhwc3ltcz0KKyAgIyBleGNsdWRlX2V4cHN5bXMgY2FuIGJlIGFuIGV4dGVuZGVkIHJlZ2V4cCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUKKyAgIyBpdCB3aWxsIGJlIHdyYXBwZWQgYnkgYCAoJyBhbmQgYCkkJywgc28gb25lIG11c3Qgbm90IG1hdGNoIGJlZ2lubmluZyBvcgorICAjIGVuZCBvZiBsaW5lLiAgRXhhbXBsZTogYGF8YmN8LipkLionIHdpbGwgZXhjbHVkZSB0aGUgc3ltYm9scyBgYScgYW5kIGBiYycsCisgICMgYXMgd2VsbCBhcyBhbnkgc3ltYm9sIHRoYXQgY29udGFpbnMgYGQnLgorICBleGNsdWRlX2V4cHN5bXM9Il9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKKyAgIyBBbHRob3VnaCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gaXMgYSB2YWxpZCBzeW1ib2wgQyBuYW1lLCBtb3N0IGEub3V0CisgICMgcGxhdGZvcm1zIChhYil1c2UgaXQgaW4gUElDIGNvZGUsIGJ1dCB0aGVpciBsaW5rZXJzIGdldCBjb25mdXNlZCBpZgorICAjIHRoZSBzeW1ib2wgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkLiAgU2luY2UgcG9ydGFibGUgY29kZSBjYW5ub3QKKyAgIyByZWx5IG9uIHRoaXMgc3ltYm9sIG5hbWUsIGl0J3MgcHJvYmFibHkgZmluZSB0byBuZXZlciBpbmNsdWRlIGl0IGluCisgICMgcHJlbG9hZGVkIHN5bWJvbCB0YWJsZXMuCisgIGV4dHJhY3RfZXhwc3ltc19jbWRzPQorICAjIEp1c3QgYmVpbmcgcGFyYW5vaWQgYWJvdXQgZW5zdXJpbmcgdGhhdCBjY19iYXNlbmFtZSBpcyBzZXQuCisgIGZvciBjY190ZW1wIGluICRjb21waWxlciIiOyBkbworICBjYXNlICRjY190ZW1wIGluCisgICAgY29tcGlsZSB8ICpbXFwvXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1xcL11jY2FjaGUgKSA7OworICAgIGRpc3RjYyB8ICpbXFwvXWRpc3RjYyB8IHB1cmlmeSB8ICpbXFwvXXB1cmlmeSApIDs7CisgICAgXC0qKSA7OworICAgICopIGJyZWFrOzsKKyAgZXNhYworZG9uZQorY2NfYmFzZW5hbWU9YCRlY2hvICJYJGNjX3RlbXAiIHwgJFhzZWQgLWUgJ3MlLiovJSUnIC1lICJzJV4kaG9zdF9hbGlhcy0lJSJgCisKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgIyBGSVhNRTogdGhlIE1TVkMrKyBwb3J0IGhhc24ndCBiZWVuIHRlc3RlZCBpbiBhIGxvb29vbmcgdGltZQorICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KKyAgICBpZiB0ZXN0ICIkR0NDIiAhPSB5ZXM7IHRoZW4KKyAgICAgIHdpdGhfZ251X2xkPW5vCisgICAgZmkKKyAgICA7OworICBpbnRlcml4KikKKyAgICAjIHdlIGp1c3QgaG9wZS9hc3N1bWUgdGhpcyBpcyBnY2MgYW5kIG5vdCBjODkgKD0gTVNWQysrKQorICAgIHdpdGhfZ251X2xkPXllcworICAgIDs7CisgIG9wZW5ic2QqKQorICAgIHdpdGhfZ251X2xkPW5vCisgICAgOzsKKyAgZXNhYworCisgIGxkX3NobGlicz15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5CisgICAgd2xhcmM9JyR7d2x9JworCisgICAgIyBTZXQgc29tZSBkZWZhdWx0cyBmb3IgR05VIGxkIHdpdGggc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4gVGhlc2UKKyAgICAjIGFyZSByZXNldCBsYXRlciBpZiBzaGFyZWQgbGlicmFyaWVzIGFyZSBub3Qgc3VwcG9ydGVkLiBQdXR0aW5nIHRoZW0KKyAgICAjIGhlcmUgYWxsb3dzIHRoZW0gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWNlc3NhcnkuCisgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJworICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KKyAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgorCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJworICAgICAgZWxzZQorICAJd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9CisgICAgZmkKKyAgICBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9bm8KKyAgICBjYXNlIGAkTEQgLXYgMj4vZGV2L251bGxgIGluCisgICAgICAqXCBbMDFdLiogfCAqXCAyLlswLTldLiogfCAqXCAyLjEwLiopIDs7ICMgY2F0Y2ggdmVyc2lvbnMgPCAyLjExCisgICAgICAqXCAyLjExLjkzLjAuMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIFJINy4zIC4uLgorICAgICAgKlwgMi4xMS45Mi4wLjEyXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgTWFuZHJha2UgOC4yIC4uLgorICAgICAgKlwgMi4xMS4qKSA7OyAjIG90aGVyIDIuMTEgdmVyc2lvbnMKKyAgICAgICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsKKyAgICBlc2FjCisKKyAgICAjIFNlZSBpZiBHTlUgbGQgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4MyogfCBhaXg0KiB8IGFpeDUqKQorICAgICAgIyBPbiBBSVgvUFBDLCB0aGUgR05VIGxpbmtlciBpcyB2ZXJ5IGJyb2tlbgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0OyB0aGVuCisJbGRfc2hsaWJzPW5vCisJY2F0IDw8RU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBHTlUgbGlua2VyLCBhdCBsZWFzdCB1cCB0byByZWxlYXNlIDIuOS4xLCBpcyByZXBvcnRlZAorKioqIHRvIGJlIHVuYWJsZSB0byByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBBSVguCisqKiogVGhlcmVmb3JlLCBsaWJ0b29sIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBJZiB5b3UKKyoqKiByZWFsbHkgY2FyZSBmb3Igc2hhcmVkIGxpYnJhcmllcywgeW91IG1heSB3YW50IHRvIG1vZGlmeSB5b3VyIFBBVEgKKyoqKiBzbyB0aGF0IGEgbm9uLUdOVSBsaW5rZXIgaXMgZm91bmQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK0VPRgorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIGFyY2hpdmVfY21kcz0nJHJtICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisKKyAgICAgICMgU2FtdWVsIEEuIEZhbHZvIElJIDxrYzV0amFAZG9scGhpbi5vcGVucHJvamVjdHMubmV0PiByZXBvcnRzCisgICAgICAjIHRoYXQgdGhlIHNlbWFudGljcyBvZiBkeW5hbWljIGxpYnJhcmllcyBvbiBBbWlnYU9TLCBhdCBsZWFzdCB1cAorICAgICAgIyB0byB2ZXJzaW9uIDQsIGlzIHRvIHNoYXJlIGRhdGEgYW1vbmcgbXVsdGlwbGUgcHJvZ3JhbXMgbGlua2VkCisgICAgICAjIHdpdGggdGhlIHNhbWUgZHluYW1pYyBsaWJyYXJ5LiAgU2luY2UgdGhpcyBkb2Vzbid0IG1hdGNoIHRoZQorICAgICAgIyBiZWhhdmlvciBvZiBzaGFyZWQgbGlicmFyaWVzIG9uIG90aGVyIHBsYXRmb3Jtcywgd2UgY2FuJ3QgdXNlCisgICAgICAjIHRoZW0uCisgICAgICBsZF9zaGxpYnM9bm8KKyAgICAgIDs7CisKKyAgICBiZW9zKikKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCWFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCisJIyBKb3NlcGggQmVja2VuYmFjaCA8anJiM0BiZXN0LmNvbT4gc2F5cyBzb21lIHJlbGVhc2VzIG9mIGdjYworCSMgc3VwcG9ydCAtLXVuZGVmaW5lZC4gIFRoaXMgZGVzZXJ2ZXMgc29tZSBpbnZlc3RpZ2F0aW9uLiAgRklYTUUKKwlhcmNoaXZlX2NtZHM9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnM9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICAgICAgIyBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICkgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCisgICAgICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKyAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz1ubworICAgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcz15ZXMKKyAgICAgIGV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bQkNER1JTXSAvcy8uKiBcKFteIF0qXCkvXDEgREFUQS8nXCcnIHwgJFNFRCAtZSAnXCcnL15bQUlUV10gL3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworCSMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKKwkjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgorCWFyY2hpdmVfZXhwc3ltX2NtZHM9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICBjcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJZWxzZQorCSAgZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJICBjYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCWZpfgorCSRDQyAtc2hhcmVkICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworICAgICAgZWxzZQorCWxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBpbnRlcml4MyopCisgICAgICBoYXJkY29kZV9kaXJlY3Q9bm8KKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCisgICAgICAjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCisgICAgICAjIEluc3RlYWQsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGxvYWRlZCBhdCBhbiBpbWFnZSBiYXNlICgweDEwMDAwMDAwIGJ5CisgICAgICAjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5CisgICAgICAjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCisgICAgICAjIDI1NiBLaUItYWxpZ25lZCBpbWFnZSBiYXNlIGJldHdlZW4gMHg1MDAwMDAwMCBhbmQgMHg2RkZDMDAwMCBhdCBsaW5rCisgICAgICAjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KKyAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J3NlZCAicyxeLF8sIiAkZXhwb3J0X3N5bWJvbHMgPiRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1yZXRhaW4tc3ltYm9scy1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisgICAgICA7OworCisgICAgbGludXgqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJdG1wX2FkZGZsYWc9CisJY2FzZSAkY2NfYmFzZW5hbWUsJGhvc3RfY3B1IGluCisJcGdjYyopCQkJCSMgUG9ydGxhbmQgR3JvdXAgQyBjb21waWxlcgorCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnJworCSAgOzsKKwlwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSopCSMgUG9ydGxhbmQgR3JvdXAgZjc3IGFuZCBmOTAgY29tcGlsZXJzCisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcgLU1ub21haW4nIDs7CisJZWNjKixpYTY0KiB8IGljYyosaWE2NCopCQkjIEludGVsIEMgY29tcGlsZXIgb24gaWE2NAorCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljJyA7OworCWVmYyosaWE2NCogfCBpZm9ydCosaWE2NCopCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlciBvbiBpYTY0CisJICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMgLW5vZm9yX21haW4nIDs7CisJaWZjKiB8IGlmb3J0KikJCQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIKKwkgIHRtcF9hZGRmbGFnPScgLW5vZm9yX21haW4nIDs7CisJZXNhYworCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQnIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCisJaWYgdGVzdCAkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nID0geWVzOyB0aGVuCisJICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKyAgY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorICAkZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAkQ0MgLXNoYXJlZCciJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXZlcnNpb24tc2NyaXB0ICR7d2x9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCisJZmkKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnM9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgbmV0YnNkKikKKyAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1vICRsaWInCisJd2xhcmM9CisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBpZiAkTEQgLXYgMj4mMSB8IGdyZXAgJ0JGRCAyXC44JyA+IC9kZXYvbnVsbDsgdGhlbgorCWxkX3NobGlicz1ubworCWNhdCA8PEVPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiBUaGUgcmVsZWFzZXMgMi44Liogb2YgdGhlIEdOVSBsaW5rZXIgY2Fubm90IHJlbGlhYmx5CisqKiogY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU29sYXJpcyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCisqKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCisqKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjkuMSBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQorKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKKyoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgorCitFT0YKKyAgICAgIGVsaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnM9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKikKKyAgICAgIGNhc2UgYCRMRCAtdiAyPiYxYCBpbgorICAgICAgICAqXCBbMDFdLiogfCAqXCAyLlswLTldLiogfCAqXCAyLjFbMC01XS4qKQorCWxkX3NobGlicz1ubworCWNhdCA8PF9MVF9FT0YgMT4mMgorCisqKiogV2FybmluZzogUmVsZWFzZXMgb2YgdGhlIEdOVSBsaW5rZXIgcHJpb3IgdG8gMi4xNi45MS4wLjMgY2FuIG5vdAorKioqIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNDTyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCisqKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCisqKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjE2LjkxLjAuMyBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQorKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKKyoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgorCitfTFRfRU9GCisJOzsKKwkqKQorCSAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9J2B0ZXN0IC16ICIkU0NPQUJTUEFUSCIgJiYgZWNobyAke3dsfS1ycGF0aCwkbGliZGlyYCcKKwkgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWInCisJICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUsLXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJICBlbHNlCisJICAgIGxkX3NobGlicz1ubworCSAgZmkKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICB3bGFyYz0KKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnM9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgIiRsZF9zaGxpYnMiID0gbm87IHRoZW4KKyAgICAgIHJ1bnBhdGhfdmFyPQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0KKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0KKyAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQorICAgIGZpCisgIGVsc2UKKyAgICAjIFBPUlRNRSBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBsaW5rZXIgKG5vdCBHTlUgbGQpCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeDMqKQorICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKyAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz15ZXMKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRMRCAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLWJFOiRleHBvcnRfc3ltYm9scyAtVDUxMiAtSDUxMiAtYk06U1JFfiRBUiAkQVJfRkxBR1MgJGxpYiAkb3V0cHV0X29iamRpci8kc29uYW1lJworICAgICAgIyBOb3RlOiB0aGlzIGxpbmtlciBoYXJkY29kZXMgdGhlIGRpcmVjdG9yaWVzIGluIExJQlBBVEggaWYgdGhlcmUKKyAgICAgICMgYXJlIG5vIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSAtTC4KKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0IC16ICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWMiOyB0aGVuCisJIyBOZWl0aGVyIGRpcmVjdCBoYXJkY29kaW5nIG5vciBzdGF0aWMgbGlua2luZyBpcyBzdXBwb3J0ZWQgd2l0aCBhCisJIyBicm9rZW4gY29sbGVjdDIuCisJaGFyZGNvZGVfZGlyZWN0PXVuc3VwcG9ydGVkCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFpeDQqIHwgYWl4NSopCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKKwkjIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KKwlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisJZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKKwlub19lbnRyeV9mbGFnPSIiCisgICAgICBlbHNlCisJIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgIi1DIiBvcHRpb24uCisJIyAtQyBtZWFucyBkZW1hbmdsZSB0byBBSVggbm0sIGJ1dCBtZWFucyBkb24ndCBkZW1hbmdsZSB3aXRoIEdOVSBubQorCWlmICROTSAtViAyPiYxIHwgZ3JlcCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NIC1CcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkMiA9PSAiVCIpIHx8IChcJDIgPT0gIkQiKSB8fCAoXCQyID09ICJCIikpICYmIChzdWJzdHIoXCQzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisJZWxzZQorCSAgZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NIC1CQ3BnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJDIgPT0gIlQiKSB8fCAoXCQyID09ICJEIikgfHwgKFwkMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWZpCisJYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCisJIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCisJIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCisJIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KKwljYXNlICRob3N0X29zIGluIGFpeDQuWzIzXXxhaXg0LlsyM10uKnxhaXg1KikKKwkgIGZvciBsZF9mbGFnIGluICRMREZMQUdTOyBkbworICAJICBpZiAodGVzdCAkbGRfZmxhZyA9ICItYnJ0bCIgfHwgdGVzdCAkbGRfZmxhZyA9ICItV2wsLWJydGwiKTsgdGhlbgorICAJICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCisgIAkgICAgYnJlYWsKKyAgCSAgZmkKKwkgIGRvbmUKKwkgIDs7CisJZXNhYworCisJZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKKwlub19lbnRyeV9mbGFnPSctYm5vZW50cnknCisgICAgICBmaQorCisgICAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCisgICAgICAjIGhhdmUgcHJvYmxlbXMgY3JlYXRpbmcgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgSWYgbGlua2luZyBhIGxpYnJhcnkKKyAgICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCisgICAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAorICAgICAgIyBlbm91Z2ggdG8gZml4IHRoZSBwcm9ibGVtLCBhZGQgLVdsLC1iYmlndG9jIHRvIExERkxBR1MuCisKKyAgICAgIGFyY2hpdmVfY21kcz0nJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0nOicKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlswMTJdfGFpeDQuWzAxMl0uKikKKwkjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKKwkjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKKwkgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKwkgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmIFwKKyAgCSAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgZ3JlcCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKKwkgIHRoZW4KKyAgCSAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCisgIAkgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKwkgIGVsc2UKKyAgCSAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgorICAJICBoYXJkY29kZV9kaXJlY3Q9dW5zdXBwb3J0ZWQKKyAgCSAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAorICAJICAjIHBhdGggaXMgbm90IGxpc3RlZCBpbiB0aGUgbGlicGF0aC4gIFNldHRpbmcgaGFyZGNvZGVfbWludXNfTAorICAJICAjIHRvIHVuc3VwcG9ydGVkIGZvcmNlcyByZWxpbmtpbmcKKyAgCSAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAJICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPQorCSAgZmkKKwkgIDs7CisJZXNhYworCXNoYXJlZF9mbGFnPSctc2hhcmVkJworCWlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgc2hhcmVkX2ZsYWc9IiRzaGFyZWRfZmxhZyAiJyR7d2x9LUcnCisJZmkKKyAgICAgIGVsc2UKKwkjIG5vdCB1c2luZyBnY2MKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAJIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKKyAgCSMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6CisJICBzaGFyZWRfZmxhZz0nLUcnCisJZWxzZQorCSAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICAgIHNoYXJlZF9mbGFnPScke3dsfS1HJworCSAgZWxzZQorCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJworCSAgZmkKKwlmaQorICAgICAgZmkKKworICAgICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoCisgICAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwb3J0LgorICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcworICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCisJIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCWFsbG93X3VuZGVmaW5lZF9mbGFnPSctYmVyb2snCisgICAgICAgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCisgICAgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKworYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Cit9J2AKKyMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KK2lmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Cit9J2A7IGZpCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAoraWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD0iL3Vzci9saWI6L2xpYiI7IGZpCisKKyAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCWFyY2hpdmVfZXhwc3ltX2NtZHM9IlwkQ0MiJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGVjaG8gIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCisgICAgICAgZWxzZQorCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSIteiBub2RlZnMiCisJICBhcmNoaXZlX2V4cHN5bV9jbWRzPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyAke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIgorCWVsc2UKKwkgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCisJIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisKK2FpeF9saWJwYXRoPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQorfSdgCisjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQorfSdgOyBmaQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2lmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQorCisJIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisJICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAorCSAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCSAgbm9fdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1iZXJub3RvaycKKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tYmVyb2snCisJICAjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSckY29udmVuaWVuY2UnCisJICBhcmNoaXZlX2NtZHNfbmVlZF9sYz15ZXMKKwkgICMgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBBSVggdHJhZGl0aW9uYWxseSBidWlsZHMgaXRzIHNoYXJlZCBsaWJyYXJpZXMuCisJICBhcmNoaXZlX2V4cHN5bV9jbWRzPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisJZmkKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBhcmNoaXZlX2NtZHM9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBkaWZmZXJlbnQgc2VtYW50aWNzIG9uIHRoZSBHTlUgbGQgc2VjdGlvbgorICAgICAgbGRfc2hsaWJzPW5vCisgICAgICA7OworCisgICAgYnNkaVs0NV0qKQorICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPS1yZHluYW1pYworICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcworICAgICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyAnCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAorICAgICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5saWIgZmlsZXMsIG5vdCAuYSBmaWxlcy4KKyAgICAgIGxpYmV4dD1saWIKKyAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgorICAgICAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgICAgICAjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCisgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtbyAkbGliICRsaWJvYmpzICRjb21waWxlcl9mbGFncyBgZWNobyAiJGRlcGxpYnMiIHwgJFNFRCAtZSAnXCcncy8gLWxjJC8vJ1wnJ2AgLWxpbmsgLWRsbH5saW5rbmFtZXM9JworICAgICAgIyBUaGUgbGlua2VyIHdpbGwgYXV0b21hdGljYWxseSBidWlsZCBhIC5saWIgZmlsZSBpZiB3ZSBidWlsZCBhIERMTC4KKyAgICAgIG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHM9J3RydWUnCisgICAgICAjIEZJWE1FOiBTaG91bGQgbGV0IHRoZSB1c2VyIHNwZWNpZnkgdGhlIGxpYiBwcm9ncmFtLgorICAgICAgb2xkX2FyY2hpdmVfY21kcz0nbGliIC9PVVQ6JG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzJworICAgICAgZml4X3NyY2ZpbGVfcGF0aD0nYGN5Z3BhdGggLXcgIiRzcmNmaWxlImAnCisgICAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzPXllcworICAgICAgOzsKKworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuWzAxMl0pCisgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCisgICAgICAgICA7OworICAgICAgICopICMgRGFyd2luIDEuMyBvbgorICAgICAgICAgaWYgdGVzdCAteiAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gOyB0aGVuCisgICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgY2FzZSAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gaW4KKyAgICAgICAgICAgICAxMC5bMDEyXSkKKyAgICAgICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKKyAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgMTAuKikKKyAgICAgICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcKKyAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgIGVzYWMKKyAgICAgICAgIGZpCisgICAgICAgICA7OworICAgICAgZXNhYworICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9bm8KKyAgICAgIGhhcmRjb2RlX2RpcmVjdD1ubworICAgICAgaGFyZGNvZGVfYXV0b21hdGljPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj11bnN1cHBvcnRlZAorICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JycKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgOyB0aGVuCisgICAgCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJworICAgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJworICAgICAgbW9kdWxlX2NtZHM9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJworICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgbW9kdWxlX2V4cHN5bV9jbWRzPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFnc35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgZWxzZQorICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgeGxjKikKKyAgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJworICAgICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXFta3Nocm9iaiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9YGVjaG8gJHJwYXRoLyRzb25hbWVgICR2ZXJzdHJpbmcnCisgICAgICAgICBtb2R1bGVfY21kcz0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCisgICAgICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKKyAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1xbWtzaHJvYmogJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWluc3RhbGxfbmFtZSAke3dsfSRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgICAgIG1vZHVsZV9leHBzeW1fY21kcz0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgICAgIDs7CisgICAgICAgKikKKyAgICAgICAgIGxkX3NobGlicz1ubworICAgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgZmkKKyAgICAgIDs7CisKKyAgICBkZ3V4KikKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgIGZyZWVic2QxKikKKyAgICAgIGxkX3NobGlicz1ubworICAgICAgOzsKKworICAgICMgRnJlZUJTRCAyLjIuWzAxMl0gYWxsb3dzIHVzIHRvIGluY2x1ZGUgYysrcnQwLm8gdG8gZ2V0IEMrKyBjb25zdHJ1Y3RvcgorICAgICMgc3VwcG9ydC4gIEZ1dHVyZSB2ZXJzaW9ucyBkbyB0aGlzIGF1dG9tYXRpY2FsbHksIGJ1dCBhbiBleHBsaWNpdCBjKytydDAubworICAgICMgZG9lcyBub3QgYnJlYWsgYW55dGhpbmcsIGFuZCBoZWxwcyBzaWduaWZpY2FudGx5IChhdCB0aGUgY29zdCBvZiBhIGxpdHRsZQorICAgICMgZXh0cmEgc3BhY2UpLgorICAgIGZyZWVic2QyLjIqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC91c3IvbGliL2MrK3J0MC5vJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KKyAgICBmcmVlYnNkMiopCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgICMgRnJlZUJTRCAzIGFuZCBncmVhdGVyIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KKyAgICBmcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUgfCBkcmFnb25mbHkqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIDs7CisKKyAgICBocHV4OSopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFyY2hpdmVfY21kcz0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgLWZQSUMgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHM9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRMRCAtYiArYiAkaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisKKyAgICAgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCisgICAgICA7OworCisgICAgaHB1eDEwKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorCisJaGFyZGNvZGVfZGlyZWN0PXllcworCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKKworCSMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisJIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisJaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgaHB1eDExKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwljYXNlICRob3N0X2NwdSBpbgorCWhwcGEqNjQqKQorCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJaWE2NCopCisJICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwkqKQorCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwllc2FjCisgICAgICBlbHNlCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KikKKwkgIGFyY2hpdmVfY21kcz0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwlpYTY0KikKKwkgIGFyY2hpdmVfY21kcz0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwkqKQorCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KnxpYTY0KikKKwkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQ9JytiICRsaWJkaXInCisJICBoYXJkY29kZV9kaXJlY3Q9bm8KKwkgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKwkgIDs7CisJKikKKwkgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKwkgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKKworCSAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCSAgaGFyZGNvZGVfbWludXNfTD15ZXMKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0nLXJwYXRoICRsaWJkaXInCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgICBsaW5rX2FsbF9kZXBsaWJzPXllcworICAgICAgOzsKKworICAgIG5ldGJzZCopCisgICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgIyBhLm91dAorICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgICAgICMgRUxGCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgIG5ld3NvczYpCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgIG9wZW5ic2QqKQorICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzJworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJworICAgICAgZWxzZQorICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgb3BlbmJzZFswMV0uKiB8IG9wZW5ic2QyLlswLTddIHwgb3BlbmJzZDIuWzAtN10uKikKKwkgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworCSAgIDs7CisJICopCisJICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgICA7OworICAgICAgIGVzYWMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgb3MyKikKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAorICAgICAgYXJjaGl2ZV9jbWRzPSckZWNobyAiTElCUkFSWSAkbGlibmFtZSBJTklUSU5TVEFOQ0UiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBEQVRBID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBFWFBPUlRTID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lbXhleHAgJGxpYm9ianMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRDQyAtWmRsbCAtWmNydGRsbCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCisgICAgICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzPSdlbXhpbXAgLW8gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuYSAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCisgICAgICA7OworCisgICAgb3NmMyopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFsbG93X3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZWxzZQorCWFsbG93X3VuZGVmaW5lZF9mbGFnPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCWFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgICAgOzsKKworICAgIG9zZjQqIHwgb3NmNSopCSMgYXMgb3NmMyogd2l0aCB0aGUgYWRkaXRpb24gb2YgLW1zeW0gZmxhZworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhbGxvd191bmRlZmluZWRfZmxhZz0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGVsc2UKKwlhbGxvd191bmRlZmluZWRfZmxhZz0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKwlhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiJXMgJXNcXG4iIC1leHBvcnRlZF9zeW1ib2wgIlwkaSIgPj4gJGxpYi5leHA7IGRvbmU7IGVjaG8gIi1oaWRkZW4iPj4gJGxpYi5leHB+CisJJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaW5wdXQgJGxpYi5leHAgJGxpbmtlcl9mbGFncyAkbGlib2JqcyAkZGVwbGlicyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4kcm0gJGxpYi5leHAnCisKKwkjIEJvdGggYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5CisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLXJwYXRoICRsaWJkaXInCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBub191bmRlZmluZWRfZmxhZz0nIC16IHRleHQnCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCXdsYXJjPScke3dsfScKKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSAgJENDIC1zaGFyZWQgJHt3bH0tTSAke3dsfSRsaWIuZXhwICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKKyAgICAgIGVsc2UKKwl3bGFyYz0nJworCWFyY2hpdmVfY21kcz0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisgIAkkTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtTSAkbGliLmV4cCAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc34kcm0gJGxpYi5leHAnCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgc29sYXJpczIuWzAtNV0gfCBzb2xhcmlzMi5bMC01XS4qKSA7OworICAgICAgKikKKyAJIyBUaGUgY29tcGlsZXIgZHJpdmVyIHdpbGwgY29tYmluZSBsaW5rZXIgb3B0aW9ucyBzbyB3ZQorIAkjIGNhbm5vdCBqdXN0IHBhc3MgdGhlIGNvbnZpZW5jZSBsaWJyYXJ5IG5hbWVzIHRocm91Z2gKKyAJIyB3aXRob3V0ICR3bCwgaWZmIHdlIGRvIG5vdCBsaW5rIHdpdGggJExELgorIAkjIEx1Y2tpbHksIGdjYyBzdXBwb3J0cyB0aGUgc2FtZSBzeW50YXggd2UgbmVlZCBmb3IgU3VuIFN0dWRpby4KKyAJIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKKyAJY2FzZSAkd2xhcmMgaW4KKyAJJycpCisgCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Jy16IGFsbGV4dHJhY3QkY29udmVuaWVuY2UgLXogZGVmYXVsdGV4dHJhY3QnIDs7CisgCSopCisgCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyR7d2x9LXogJHt3bH1hbGxleHRyYWN0YGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LXogJHt3bH1kZWZhdWx0ZXh0cmFjdCcgOzsKKyAJZXNhYyA7OworICAgICAgZXNhYworICAgICAgbGlua19hbGxfZGVwbGlicz15ZXMKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgaWYgdGVzdCAieCRob3N0X3ZlbmRvciIgPSB4c2VxdWVudDsgdGhlbgorCSMgVXNlICRDQyB0byBsaW5rIHVuZGVyIHNlcXVlbnQsIGJlY2F1c2UgaXQgdGhyb3dzIGluIHNvbWUgZXh0cmEgLm8KKwkjIGZpbGVzIHRoYXQgbWFrZSAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgd29yay4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtRyAke3dsfS1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzdGF0aWMgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgc3lzdjQpCisgICAgICBjYXNlICRob3N0X3ZlbmRvciBpbgorCXNuaSkKKwkgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgaGFyZGNvZGVfZGlyZWN0PXllcyAjIGlzIHRoaXMgcmVhbGx5IHRydWU/Pz8KKwk7OworCXNpZW1lbnMpCisJICAjIyBMRCBpcyBsZCBpdCBtYWtlcyBhIFBMQU1MSUIKKwkgICMjIENDIGp1c3QgbWFrZXMgYSBHcm9zc01vZHVsZS4KKwkgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIHJlbG9hZF9jbWRzPSckQ0MgLXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKKwkgIGhhcmRjb2RlX2RpcmVjdD1ubworICAgICAgICA7OworCW1vdG9yb2xhKQorCSAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBoYXJkY29kZV9kaXJlY3Q9bm8gI01vdG9yb2xhIG1hbnVhbCBzYXlzIHllcywgYnV0IG15IHRlc3RzIHNheSB0aGV5IGxpZQorCTs7CisgICAgICBlc2FjCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgc3lzdjQuMyopCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nLUJleHBvcnQnCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCWFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCWhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKwlydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorCWhhcmRjb2RlX3J1bnBhdGhfdmFyPXllcworCWxkX3NobGlicz15ZXMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjQqdXcyKiB8IHN5c3Y1T3BlblVOSVgqIHwgc3lzdjVVbml4V2FyZTcuWzAxXS5bMTBdKiB8IHVuaXh3YXJlNyopCisgICAgICBub191bmRlZmluZWRfZmxhZz0nJHt3bH0teix0ZXh0JworICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9bm8KKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCisgICAgICAjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAorICAgICAgIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bworICAgICAgIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCisgICAgICAjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0CisgICAgICAjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKKyAgICAgICMgYXMgLXogZGVmcy4KKyAgICAgIG5vX3VuZGVmaW5lZF9mbGFnPScke3dsfS16LHRleHQnCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nJHt3bH0teixub2RlZnMnCisgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sYz1ubworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nYHRlc3QgLXogIiRTQ09BQlNQQVRIIiAmJiBlY2hvICR7d2x9LVIsJGxpYmRpcmAnCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSc6JworICAgICAgbGlua19hbGxfZGVwbGlicz15ZXMKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tQmV4cG9ydCcKKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHM9JyRDQyAtRyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICB1dHM0KikKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgICopCisgICAgICBsZF9zaGxpYnM9bm8KKyAgICAgIDs7CisgICAgZXNhYworICBmaQorCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbGRfc2hsaWJzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsZF9zaGxpYnMiID4mNgordGVzdCAiJGxkX3NobGlicyIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKKyMKKyMgRG8gd2UgbmVlZCB0byBleHBsaWNpdGx5IGxpbmsgbGliYz8KKyMKK2Nhc2UgIngkYXJjaGl2ZV9jbWRzX25lZWRfbGMiIGluCit4fHh5ZXMpCisgICMgQXNzdW1lIC1sYyBzaG91bGQgYmUgYWRkZWQKKyAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9eWVzCisKKyAgaWYgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgY2FzZSAkYXJjaGl2ZV9jbWRzIGluCisgICAgKid+JyopCisgICAgICAjIEZJWE1FOiB3ZSBtYXkgaGF2ZSB0byBkZWFsIHdpdGggbXVsdGktY29tbWFuZCBzZXF1ZW5jZXMuCisgICAgICA7OworICAgICckQ0MgJyopCisgICAgICAjIFRlc3Qgd2hldGhlciB0aGUgY29tcGlsZXIgaW1wbGljaXRseSBsaW5rcyB3aXRoIC1sYyBzaW5jZSBvbiBzb21lCisgICAgICAjIHN5c3RlbXMsIC1sZ2NjIGhhcyB0byBjb21lIGJlZm9yZSAtbGMuIElmIGdjYyBhbHJlYWR5IHBhc3NlcyAtbGMKKyAgICAgICMgdG8gbGQsIGRvbid0IGFkZCAtbGMgYmVmb3JlIC1sZ2NjLgorICAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbi4uLiAkRUNIT19DIiA+JjYKKyAgICAgICRybSBjb25mdGVzdCoKKyAgICAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgICAgIGlmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAyPmNvbmZ0ZXN0LmVycjsgdGhlbgorICAgICAgICBzb25hbWU9Y29uZnRlc3QKKyAgICAgICAgbGliPWNvbmZ0ZXN0CisgICAgICAgIGxpYm9ianM9Y29uZnRlc3QuJGFjX29iamV4dAorICAgICAgICBkZXBsaWJzPQorICAgICAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bAorCXBpY19mbGFnPSRsdF9wcm9nX2NvbXBpbGVyX3BpYworICAgICAgICBjb21waWxlcl9mbGFncz0tdgorICAgICAgICBsaW5rZXJfZmxhZ3M9LXYKKyAgICAgICAgdmVyc3RyaW5nPQorICAgICAgICBvdXRwdXRfb2JqZGlyPS4KKyAgICAgICAgbGlibmFtZT1jb25mdGVzdAorICAgICAgICBsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnPSRhbGxvd191bmRlZmluZWRfZmxhZworICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0KKyAgICAgICAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYXJjaGl2ZV9jbWRzIDJcPlwmMSBcfCBncmVwIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjFcIiIpID4mNQorICAoZXZhbCAkYXJjaGl2ZV9jbWRzIDJcPlwmMSBcfCBncmVwIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjEpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KKyAgICAgICAgdGhlbgorCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9bm8KKyAgICAgICAgZWxzZQorCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9eWVzCisgICAgICAgIGZpCisgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnCisgICAgICBlbHNlCisgICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQorICAgICAgZmkKKyAgICAgICRybSBjb25mdGVzdCoKKyAgICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhcmNoaXZlX2NtZHNfbmVlZF9sYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYXJjaGl2ZV9jbWRzX25lZWRfbGMiID4mNgorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIDs7Citlc2FjCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MuLi4gJEVDSE9fQyIgPiY2CitsaWJyYXJ5X25hbWVzX3NwZWM9CitsaWJuYW1lX3NwZWM9J2xpYiRuYW1lJworc29uYW1lX3NwZWM9CitzaHJleHRfY21kcz0iLnNvIgorcG9zdGluc3RhbGxfY21kcz0KK3Bvc3R1bmluc3RhbGxfY21kcz0KK2ZpbmlzaF9jbWRzPQorZmluaXNoX2V2YWw9CitzaGxpYnBhdGhfdmFyPQorc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KK3ZlcnNpb25fdHlwZT1ub25lCitkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGdyZXAgIl5saWJyYXJpZXM6IiB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnImAKKyAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7JyA+L2Rldi9udWxsIDsgdGhlbgorICAgICMgaWYgdGhlIHBhdGggY29udGFpbnMgIjsiIHRoZW4gd2UgYXNzdW1lIGl0IHRvIGJlIHRoZSBzZXBhcmF0b3IKKyAgICAjIG90aGVyd2lzZSBkZWZhdWx0IHRvIHRoZSBzdGFuZGFyZCBwYXRoIHNlcGFyYXRvciAoaS5lLiAiOiIpIC0gaXQgaXMKKyAgICAjIGFzc3VtZWQgdGhhdCBubyBwYXJ0IG9mIGEgbm9ybWFsIHBhdGhuYW1lIGNvbnRhaW5zICI7IiBidXQgdGhhdCBzaG91bGQKKyAgICAjIG9rYXkgaW4gdGhlIHJlYWwgd29ybGQgd2hlcmUgIjsiIGluIGRpcnBhdGhzIGlzIGl0c2VsZiBwcm9ibGVtYXRpYy4KKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgIGZpCitlbHNlCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKK2ZpCituZWVkX2xpYl9wcmVmaXg9dW5rbm93bgoraGFyZGNvZGVfaW50b19saWJzPW5vCisKKyMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgorIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCituZWVkX3ZlcnNpb249dW5rbm93bgorCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZS5hJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKworICAjIEFJWCAzIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIDs7CisKK2FpeDQqIHwgYWl4NSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICAjIEFJWCA1IHN1cHBvcnRzIElBNjQKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBlbHNlCisgICAgIyBXaXRoIEdDQyB1cCB0byAyLjk1LngsIGNvbGxlY3QyIHdvdWxkIGNyZWF0ZSBhbiBpbXBvcnQgZmlsZQorICAgICMgZm9yIGRlcGVuZGVuY2UgbGlicmFyaWVzLiAgVGhlIGltcG9ydCBmaWxlIHdvdWxkIHN0YXJ0IHdpdGgKKyAgICAjIHRoZSBsaW5lIGAjISAuJy4gIFRoaXMgd291bGQgY2F1c2UgdGhlIGdlbmVyYXRlZCBsaWJyYXJ5IHRvCisgICAgIyBkZXBlbmQgb24gYC4nLCBhbHdheXMgYW4gaW52YWxpZCBsaWJyYXJ5LiAgVGhpcyB3YXMgZml4ZWQgaW4KKyAgICAjIGRldmVsb3BtZW50IHNuYXBzaG90cyBvZiBHQ0MgcHJpb3IgdG8gMy4wLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDQgfCBhaXg0LlswMV0gfCBhaXg0LlswMV0uKikKKyAgICAgIGlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCisJICAgZWNobyAnIHllcyAnCisJICAgZWNobyAnI2VuZGlmJzsgfSB8ICR7Q0N9IC1FIC0gfCBncmVwIHllcyA+IC9kZXYvbnVsbDsgdGhlbgorCToKKyAgICAgIGVsc2UKKwljYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisgICAgIyBBSVggKG9uIFBvd2VyKikgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gY3VycmVudGx5IHdlIGNhbiBub3QgaGFyZGNvZGUgY29ycmVjdAorICAgICMgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuIGFkZCB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8KKyAgICAjIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbiBiZSB1c2VmdWwgaW4gZnV0dXJlLgorICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorICAgICAgIyBJZiB1c2luZyBydW4gdGltZSBsaW5raW5nIChvbiBBSVggNC4yIG9yIGxhdGVyKSB1c2UgbGliPG5hbWU+LnNvCisgICAgICAjIGluc3RlYWQgb2YgbGliPG5hbWU+LmEgdG8gbGV0IHBlb3BsZSBrbm93IHRoYXQgdGhlc2UgYXJlIG5vdAorICAgICAgIyB0eXBpY2FsIEFJWCBzaGFyZWQgbGlicmFyaWVzLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgZWxzZQorICAgICAgIyBXZSBwcmVzZXJ2ZSAuYSBhcyBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJpZXMgdGhyb3VnaCBBSVg0LjIKKyAgICAgICMgYW5kIGxhdGVyIHdoZW4gd2UgYXJlIG5vdCBkb2luZyBydW4gdGltZSBsaW5raW5nLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5hICRsaWJuYW1lLmEnCisgICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGZpCisgICAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIGZpCisgIDs7CisKK2FtaWdhb3MqKQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJworICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgorICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRybSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKKyAgOzsKKworYmVvcyopCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKKyAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKKyAgOzsKKworYnNkaVs0NV0qKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL1gxMS9saWIgL3Vzci9jb250cmliL2xpYiAvbGliIC91c3IvbG9jYWwvbGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgorICAjIHRoZSBkZWZhdWx0IGxkLnNvLmNvbmYgYWxzbyBjb250YWlucyAvdXNyL2NvbnRyaWIvbGliIGFuZAorICAjIC91c3IvWDExUjYvbGliICgvdXNyL1gxMSBpcyBhIGxpbmsgdG8gL3Vzci9YMTFSNiksIGJ1dCBsZXQgdXMgYWxsb3cKKyAgIyBsaWJ0b29sIHRvIGhhcmQtY29kZSB0aGVzZSBpbnRvIHByb2dyYW1zCisgIDs7CisKK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgdmVyc2lvbl90eXBlPXdpbmRvd3MKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfdmVyc2lvbj1ubworICBuZWVkX2xpYl9wcmVmaXg9bm8KKworICBjYXNlICRHQ0MsJGhvc3Rfb3MgaW4KKyAgeWVzLGN5Z3dpbiogfCB5ZXMsbWluZ3cqIHwgeWVzLHB3MzIqKQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsLmEnCisgICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcworICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgorICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7ZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgorICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+CisgICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWV+CisgICAgICBjaG1vZCBhK3ggXCRkbGRpci8kZGxuYW1lJworICAgIHBvc3R1bmluc3RhbGxfY21kcz0nZGxkbGw9YCRTSEVMTCAyPiYxIC1jICdcJycuICRmaWxlOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbHBhdGg9JGRpci9cJGRsZGxsfgorICAgICAgICRybSBcJGRscGF0aCcKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgY3lnd2luKikKKyAgICAgICMgQ3lnd2luIERMTHMgdXNlICdjeWcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJworICAgICAgc29uYW1lX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9jeWcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiAvbGliL3czMmFwaSAvbGliIC91c3IvbG9jYWwvbGliIgorICAgICAgOzsKKyAgICBtaW5ndyopCisgICAgICAjIE1pbkdXIERMTHMgdXNlIHRyYWRpdGlvbmFsICdsaWInIHByZWZpeAorICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAorICAgICAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7W2MtekMtWl06LycgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAjIEl0IGlzIG1vc3QgcHJvYmFibHkgYSBXaW5kb3dzIGZvcm1hdCBQQVRIIHByaW50ZWQgYnkKKyAgICAgICAgIyBtaW5ndyBnY2MsIGJ1dCB3ZSBhcmUgcnVubmluZyBvbiBDeWd3aW4uIEdjYyBwcmludHMgaXRzIHNlYXJjaAorICAgICAgICAjIHBhdGggd2l0aCA7IHNlcGFyYXRvcnMsIGFuZCB3aXRoIGRyaXZlIGxldHRlcnMuIFdlIGNhbiBoYW5kbGUgdGhlCisgICAgICAgICMgZHJpdmUgbGV0dGVycyAoY3lnd2luIGZpbGV1dGlscyB1bmRlcnN0YW5kcyB0aGVtKSwgc28gbGVhdmUgdGhlbSwKKyAgICAgICAgIyBlc3BlY2lhbGx5IGFzIHdlIG1pZ2h0IHBhc3MgZmlsZXMgZm91bmQgdGhlcmUgdG8gYSBtaW5ndyBvYmpkdW1wLAorICAgICAgICAjIHdoaWNoIHdvdWxkbid0IHVuZGVyc3RhbmQgYSBjeWd3aW5pZmllZCBwYXRoLiBBaGguCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKKyAgICAgIGVsc2UKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgICAgZmkKKyAgICAgIDs7CisgICAgcHczMiopCisgICAgICAjIHB3MzIgRExMcyB1c2UgJ3B3JyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL3B3LydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisKKyAgKikKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9ICRsaWJuYW1lLmxpYicKKyAgICA7OworICBlc2FjCisgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCisgICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgorICBzaGxpYnBhdGhfdmFyPVBBVEgKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCisgIHZlcnNpb25fdHlwZT1kYXJ3aW4KKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHt2ZXJzdWZmaXh9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0ICR7bGlibmFtZX0kc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCcKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBzaGxpYnBhdGhfdmFyPURZTERfTElCUkFSWV9QQVRICisgIHNocmV4dF9jbWRzPSdgdGVzdCAuJG1vZHVsZSA9IC55ZXMgJiYgZWNobyAuc28gfHwgZWNobyAuZHlsaWJgJworICAjIEFwcGxlJ3MgZ2NjIHByaW50cyAnZ2NjIC1wcmludC1zZWFyY2gtZGlycycgZG9lc24ndCBvcGVyYXRlIHRoZSBzYW1lLgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IHRyICJcbiIgIiRQQVRIX1NFUEFSQVRPUiIgfCBzZWQgLWUgJ3MvbGlicmFyaWVzOi9AbGlicmFyaWVzOi8nIHwgdHIgIkAiICJcbiIgfCBncmVwICJebGlicmFyaWVzOiIgfCBzZWQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnIiAtZSAicywkUEFUSF9TRVBBUkFUT1IsICxnIiAtZSAicywuKiwmIC9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIsZyJgCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWInCisgIGZpCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvbGliIC91c3IvbGliJworICA7OworCitkZ3V4KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitmcmVlYnNkMSopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKK2tmcmVlYnNkKi1nbnUpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCisgIDs7CisKK2ZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgIyBEcmFnb25GbHkgZG9lcyBub3QgaGF2ZSBhb3V0LiAgV2hlbi9pZiB0aGV5IGltcGxlbWVudCBhIG5ldworICAjIHZlcnNpb25pbmcgbWVjaGFuaXNtLCBhZGp1c3QgdGhpcy4KKyAgaWYgdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQ7IHRoZW4KKyAgICBvYmpmb3JtYXQ9YC91c3IvYmluL29iamZvcm1hdGAKKyAgZWxzZQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBmcmVlYnNkWzEyM10qKSBvYmpmb3JtYXQ9YW91dCA7OworICAgICopIG9iamZvcm1hdD1lbGYgOzsKKyAgICBlc2FjCisgIGZpCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKKyAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisgICAgZnJlZWJzZC1lbGYqKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBmcmVlYnNkLSopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICAgIG5lZWRfdmVyc2lvbj15ZXMKKyAgICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBmcmVlYnNkMiopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIDs7CisgIGZyZWVic2QzLlswMV0qIHwgZnJlZWJzZGVsZjMuWzAxXSopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBmcmVlYnNkMy5bMi05XSogfCBmcmVlYnNkZWxmMy5bMi05XSogfCBcCisgIGZyZWVic2Q0LlswLTVdIHwgZnJlZWJzZGVsZjQuWzAtNV0gfCBmcmVlYnNkNC4xLjEgfCBmcmVlYnNkZWxmNC4xLjEpCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgIGZyZWVic2QqKSAjIGZyb20gNC42IG9uCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBlc2FjCisgIDs7CisKK2dudSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0ke21ham9yfSAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKyAgIyBHaXZlIGEgc29uYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ham9yIHZlcnNpb24gc28gdGhhdCBkbGQuc2wgcmVmdXNlcyB0bworICAjIGxpbmsgYWdhaW5zdCBvdGhlciB2ZXJzaW9ucy4KKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgaWE2NCopCisgICAgc2hyZXh0X2NtZHM9Jy5zbycKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbyIKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGlmIHRlc3QgIlgkSFBVWF9JQTY0X01PREUiID0gWDMyOyB0aGVuCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIiCisgICAgZWxzZQorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4NjQgL3Vzci9sb2NhbC9saWIvaHB1eDY0IgorICAgIGZpCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYworICAgIDs7CisgICBocHBhKjY0KikKKyAgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSCAjIEhvdyBzaG91bGQgd2UgaGFuZGxlIFNITElCX1BBVEgKKyAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9wYTIwXzY0IC91c3IvY2NzL2xpYi9wYTIwXzY0IgorICAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisgICAgIDs7CisgICAqKQorICAgIHNocmV4dF9jbWRzPScuc2wnCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgICBzaGxpYnBhdGhfdmFyPVNITElCX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8gIyArcyBpcyByZXF1aXJlZCB0byBlbmFibGUgU0hMSUJfUEFUSAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgOzsKKyAgZXNhYworICAjIEhQLVVYIHJ1bnMgKnJlYWxseSogc2xvd2x5IHVubGVzcyBzaGFyZWQgbGlicmFyaWVzIGFyZSBtb2RlIDU1NS4KKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNTU1ICRsaWInCisgIDs7CisKK2ludGVyaXgzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZHluYW1pY19saW5rZXI9J0ludGVyaXggMy54IGxkLnNvLjEgKFBFLCBsaWtlIEVMRiknCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2lyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBub25zdG9wdXgqKSB2ZXJzaW9uX3R5cGU9bm9uc3RvcHV4IDs7CisgICAgKikKKwlpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCisJCXZlcnNpb25fdHlwZT1saW51eAorCWVsc2UKKwkJdmVyc2lvbl90eXBlPWlyaXgKKwlmaSA7OworICBlc2FjCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBjYXNlICRob3N0X29zIGluCisgIGlyaXg1KiB8IG5vbnN0b3B1eCopCisgICAgbGlic3VmZj0gc2hsaWJzdWZmPQorICAgIDs7CisgICopCisgICAgY2FzZSAkTEQgaW4gIyBsaWJ0b29sLm00IHdpbGwgYWRkIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcyB0byBMRAorICAgICotMzJ8KiItMzIgInwqLW1lbGYzMmJzbWlwfCoiLW1lbGYzMmJzbWlwICIpCisgICAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPTMyLWJpdDs7CisgICAgKi1uMzJ8KiItbjMyICJ8Ki1tZWxmMzJibWlwbjMyfCoiLW1lbGYzMmJtaXBuMzIgIikKKyAgICAgIGxpYnN1ZmY9MzIgc2hsaWJzdWZmPU4zMiBsaWJtYWdpYz1OMzI7OworICAgICotNjR8KiItNjQgInwqLW1lbGY2NGJtaXB8KiItbWVsZjY0Ym1pcCAiKQorICAgICAgbGlic3VmZj02NCBzaGxpYnN1ZmY9NjQgbGlibWFnaWM9NjQtYml0OzsKKyAgICAqKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKKyAgICBlc2FjCisgICAgOzsKKyAgZXNhYworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUlkke3NobGlic3VmZn1fUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0gL3Vzci9sb2NhbC9saWIke2xpYnN1ZmZ9IgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKKyMgTm8gc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBMaW51eCBvbGRsZCwgYW91dCwgb3IgY29mZi4KK2xpbnV4Km9sZGxkKiB8IGxpbnV4KmFvdXQqIHwgbGludXgqY29mZiopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKKyMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KK2xpbnV4KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAjIFRoaXMgaW1wbGllcyBubyBmYXN0X2luc3RhbGwsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZS4KKyAgIyBTb21lIHJld29yayB3aWxsIGJlIG5lZWRlZCB0byBhbGxvdyBmb3IgZmFzdF9pbnN0YWxsCisgICMgYmVmb3JlIHRoaXMgY2FuIGJlIGVuYWJsZWQuCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKworICAjIEFwcGVuZCBsZC5zby5jb25mIGNvbnRlbnRzIHRvIHRoZSBzZWFyY2ggcGF0aAorICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgorICAgIGx0X2xkX2V4dHJhPWBhd2sgJy9eaW5jbHVkZSAvIHsgc3lzdGVtKHNwcmludGYoImNkIC9ldGM7IGNhdCAlcyIsIFwkMikpOyBza2lwID0gMTsgfSB7IGlmICghc2tpcCkgcHJpbnQgXCQwOyBza2lwID0gMDsgfScgPCAvZXRjL2xkLnNvLmNvbmYgfCAkU0VEIC1lICdzLyMuKi8vO3MvWzosCV0vIC9nO3MvPVtePV0qJC8vO3MvPVtePSBdKiAvIC9nOy9eJC9kJyB8IHRyICdcbicgJyAnYAorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliICRsdF9sZF9leHRyYSIKKyAgZmkKKworICAjIFdlIHVzZWQgdG8gdGVzdCBmb3IgL2xpYi9sZC5zby4xIGFuZCBkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMgb24KKyAgIyBwb3dlcnBjLCBiZWNhdXNlIE1rTGludXggb25seSBzdXBwb3J0ZWQgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHRoZQorICAjIEdOVSBkeW5hbWljIGxpbmtlci4gIFNpbmNlIHRoaXMgd2FzIGJyb2tlbiB3aXRoIGNyb3NzIGNvbXBpbGVycywKKyAgIyBtb3N0IHBvd2VycGMtbGludXggYm94ZXMgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgdGhlc2UgZGF5cyBhbmQKKyAgIyBwZW9wbGUgY2FuIGFsd2F5cyAtLWRpc2FibGUtc2hhcmVkLCB0aGUgdGVzdCB3YXMgcmVtb3ZlZCwgYW5kIHdlCisgICMgYXNzdW1lIHRoZSBHTlUvTGludXggZHluYW1pYyBsaW5rZXIgaXMgaW4gdXNlLgorICBkeW5hbWljX2xpbmtlcj0nR05VL0xpbnV4IGxkLnNvJworICA7OworCitrbmV0YnNkKi1nbnUpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCisgIDs7CisKK25ldGJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJworICBlbHNlCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJworICBmaQorICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworbmV3c29zNikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIDs7CisKK250by1xbngqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICA7OworCitvcGVuYnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiIKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgICMgU29tZSBvbGRlciB2ZXJzaW9ucyBvZiBPcGVuQlNEICgzLjMgYXQgbGVhc3QpICpkbyogbmVlZCB2ZXJzaW9uZWQgbGlicy4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG9wZW5ic2QzLjMgfCBvcGVuYnNkMy4zLiopIG5lZWRfdmVyc2lvbj15ZXMgOzsKKyAgICAqKSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3ZlcnNpb249bm8gIDs7CisgIGVzYWMKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgb3BlbmJzZDIuWzg5XSB8IG9wZW5ic2QyLls4OV0uKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKwk7OworICAgICAgKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisJOzsKKyAgICAgIGVzYWMKKyAgZWxzZQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgZmkKKyAgOzsKKworb3MyKikKKyAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fSAkbGlibmFtZS5hJworICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorICA7OworCitvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCisgIDs7CisKK3NvbGFyaXMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICMgbGRkIGNvbXBsYWlucyB1bmxlc3MgbGlicmFyaWVzIGFyZSBleGVjdXRhYmxlCisgIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kICt4ICRsaWInCisgIDs7CisKK3N1bm9zNCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi91c3IvZXRjIiBsZGNvbmZpZyAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgZmkKKyAgbmVlZF92ZXJzaW9uPXllcworICA7OworCitzeXN2NCB8IHN5c3Y0LjMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisgICAgc25pKQorICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tQmxhcmdlZHluc3ltJworICAgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICAgIDs7CisgICAgc2llbWVucykKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBtb3Rvcm9sYSkKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2Njcy9saWInCisgICAgICA7OworICBlc2FjCisgIDs7CisKK3N5c3Y0Kk1QKikKKyAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgorICAgIHZlcnNpb25fdHlwZT1saW51eAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3InCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZmkKKyAgOzsKKworc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKiB8IHN5c3Y0KnV3MiopCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLWVsZgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC91c3IvZ251L2xpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIgL2xpYicKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgZWxzZQorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9jY3MvbGliIC91c3IvbGliJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBzY28zLjJ2NSopCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvbGliIgorCTs7CisgICAgZXNhYworICBmaQorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9saWInCisgIDs7CisKK3V0czQqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKKyopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7Citlc2FjCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZHluYW1pY19saW5rZXIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGR5bmFtaWNfbGlua2VyIiA+JjYKK3Rlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSJQQVRIICRzaGxpYnBhdGhfdmFyICRydW5wYXRoX3ZhciIKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsgR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgorZmkKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zLi4uICRFQ0hPX0MiID4mNgoraGFyZGNvZGVfYWN0aW9uPQoraWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiIHx8IFwKKyAgIHRlc3QgLW4gIiRydW5wYXRoX3ZhciIgfHwgXAorICAgdGVzdCAiWCRoYXJkY29kZV9hdXRvbWF0aWMiID0gIlh5ZXMiIDsgdGhlbgorCisgICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGFudCBkaXJlY3Rvcmllcy4KKyAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gbm8gJiYKKyAgICAgIyBJZiB0aGUgb25seSBtZWNoYW5pc20gdG8gYXZvaWQgaGFyZGNvZGluZyBpcyBzaGxpYnBhdGhfdmFyLCB3ZQorICAgICAjIGhhdmUgdG8gcmVsaW5rLCBvdGhlcndpc2Ugd2UgbWlnaHQgbGluayB3aXRoIGFuIGluc3RhbGxlZCBsaWJyYXJ5CisgICAgICMgd2hlbiB3ZSBzaG91bGQgYmUgbGlua2luZyB3aXRoIGEgeWV0LXRvLWJlLWluc3RhbGxlZCBvbmUKKyAgICAgIyMgdGVzdCAiJF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgKSIgIT0gbm8gJiYKKyAgICAgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiICE9IG5vOyB0aGVuCisgICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KKyAgICBoYXJkY29kZV9hY3Rpb249cmVsaW5rCisgIGVsc2UKKyAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgorICAgIGhhcmRjb2RlX2FjdGlvbj1pbW1lZGlhdGUKKyAgZmkKK2Vsc2UKKyAgIyBXZSBjYW5ub3QgaGFyZGNvZGUgYW55dGhpbmcsIG9yIGVsc2Ugd2UgY2FuIG9ubHkgaGFyZGNvZGUgZXhpc3RpbmcKKyAgIyBkaXJlY3Rvcmllcy4KKyAgaGFyZGNvZGVfYWN0aW9uPXVuc3VwcG9ydGVkCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGhhcmRjb2RlX2FjdGlvbiIgPiY1CitlY2hvICIke0VDSE9fVH0kaGFyZGNvZGVfYWN0aW9uIiA+JjYKKworaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbiIgPSByZWxpbms7IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KK2VsaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgfHwKKyAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm87IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3QgbmVjZXNzYXJ5CisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bmVlZGxlc3MKK2ZpCisKK3N0cmlwbGliPQorb2xkX3N0cmlwbGliPQorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgc3RyaXBwaW5nIGxpYnJhcmllcyBpcyBwb3NzaWJsZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgc3RyaXBwaW5nIGxpYnJhcmllcyBpcyBwb3NzaWJsZS4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgLW4gIiRTVFJJUCIgJiYgJFNUUklQIC1WIDI+JjEgfCBncmVwICJHTlUgc3RyaXAiID4vZGV2L251bGw7IHRoZW4KKyAgdGVzdCAteiAiJG9sZF9zdHJpcGxpYiIgJiYgb2xkX3N0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC1kZWJ1ZyIKKyAgdGVzdCAteiAiJHN0cmlwbGliIiAmJiBzdHJpcGxpYj0iJFNUUklQIC0tc3RyaXAtdW5uZWVkZWQiCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNgorZWxzZQorIyBGSVhNRSAtIGluc2VydCBzb21lIHJlYWwgdGVzdHMsIGhvc3Rfb3MgaXNuJ3QgcmVhbGx5IGdvb2QgZW5vdWdoCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgIGRhcndpbiopCisgICAgICAgaWYgdGVzdCAtbiAiJFNUUklQIiA7IHRoZW4KKyAgICAgICAgIHN0cmlwbGliPSIkU1RSSVAgLXgiCisgICAgICAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjYKKyAgICAgICBlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisgICAgICAgOzsKKyAgICopCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKKyAgICA7OworICBlc2FjCitmaQorCitpZiB0ZXN0ICJ4JGVuYWJsZV9kbG9wZW4iICE9IHh5ZXM7IHRoZW4KKyAgZW5hYmxlX2Rsb3Blbj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93bgorZWxzZQorICBsdF9jdl9kbG9wZW49bm8KKyAgbHRfY3ZfZGxvcGVuX2xpYnM9CisKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBiZW9zKikKKyAgICBsdF9jdl9kbG9wZW49ImxvYWRfYWRkX29uIgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcworICAgIDs7CisKKyAgbWluZ3cqIHwgcHczMiopCisgICAgbHRfY3ZfZGxvcGVuPSJMb2FkTGlicmFyeSIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgIDs7CisKKyAgY3lnd2luKikKKyAgICBsdF9jdl9kbG9wZW49ImRsb3BlbiIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgIDs7CisKKyAgZGFyd2luKikKKyAgIyBpZiBsaWJkbCBpcyBpbnN0YWxsZWQgd2UgbmVlZCB0byBsaW5rIGFnYWluc3QgaXQKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9saWJfZGxfZGxvcGVuK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGwgICRMSUJTIgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgZGxvcGVuICgpOworaW50CittYWluICgpCit7CitkbG9wZW4gKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfbGliX2RsX2Rsb3Blbj15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfbGliX2RsX2Rsb3Blbj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNgoraWYgdGVzdCAkYWNfY3ZfbGliX2RsX2Rsb3BlbiA9IHllczsgdGhlbgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCitlbHNlCisKKyAgICBsdF9jdl9kbG9wZW49ImR5bGQiCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCisKK2ZpCisKKyAgIDs7CisKKyAgKikKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHNobF9sb2FkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNobF9sb2FkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9mdW5jX3NobF9sb2FkK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworLyogRGVmaW5lIHNobF9sb2FkIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgc2hsX2xvYWQuCisgICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KKyNkZWZpbmUgc2hsX2xvYWQgaW5ub2N1b3VzX3NobF9sb2FkCisKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHNobF9sb2FkICgpOyBiZWxvdy4KKyAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KKworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKworI3VuZGVmIHNobF9sb2FkCisKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgc2hsX2xvYWQgKCk7CisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfc2hsX2xvYWQpIHx8IGRlZmluZWQgKF9fc3R1Yl9fX3NobF9sb2FkKQorY2hva2UgbWUKKyNlbHNlCitjaGFyICgqZikgKCkgPSBzaGxfbG9hZDsKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gZiAhPSBzaGxfbG9hZDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9mdW5jX3NobF9sb2FkPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jdl9mdW5jX3NobF9sb2FkPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY19zaGxfbG9hZCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfZnVuY19zaGxfbG9hZCIgPiY2CitpZiB0ZXN0ICRhY19jdl9mdW5jX3NobF9sb2FkID0geWVzOyB0aGVuCisgIGx0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiCitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc2hsX2xvYWQgaW4gLWxkbGQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc2hsX2xvYWQgaW4gLWxkbGQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2xpYl9kbGRfc2hsX2xvYWQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxkbGQgICRMSUJTIgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgc2hsX2xvYWQgKCk7CitpbnQKK21haW4gKCkKK3sKK3NobF9sb2FkICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQ9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2N2X2xpYl9kbGRfc2hsX2xvYWQ9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfZGxkX3NobF9sb2FkIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfZGxkX3NobF9sb2FkIiA+JjYKK2lmIHRlc3QgJGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQgPSB5ZXM7IHRoZW4KKyAgbHRfY3ZfZGxvcGVuPSJzaGxfbG9hZCIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1kbGQiCitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZGxvcGVuIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGRsb3Blbi4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfZnVuY19kbG9wZW4rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisvKiBEZWZpbmUgZGxvcGVuIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgZGxvcGVuLgorICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCisjZGVmaW5lIGRsb3BlbiBpbm5vY3VvdXNfZGxvcGVuCisKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIGRsb3BlbiAoKTsgYmVsb3cuCisgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisKKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisKKyN1bmRlZiBkbG9wZW4KKworLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBkbG9wZW4gKCk7CisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfZGxvcGVuKSB8fCBkZWZpbmVkIChfX3N0dWJfX19kbG9wZW4pCitjaG9rZSBtZQorI2Vsc2UKK2NoYXIgKCpmKSAoKSA9IGRsb3BlbjsKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gZiAhPSBkbG9wZW47CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfZnVuY19kbG9wZW49eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2N2X2Z1bmNfZGxvcGVuPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY19kbG9wZW4iID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2Z1bmNfZGxvcGVuIiA+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfZGxvcGVuID0geWVzOyB0aGVuCisgIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9saWJfZGxfZGxvcGVuK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGwgICRMSUJTIgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgZGxvcGVuICgpOworaW50CittYWluICgpCit7CitkbG9wZW4gKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfbGliX2RsX2Rsb3Blbj15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfbGliX2RsX2Rsb3Blbj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNgoraWYgdGVzdCAkYWNfY3ZfbGliX2RsX2Rsb3BlbiA9IHllczsgdGhlbgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sc3ZsZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxzdmxkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9saWJfc3ZsZF9kbG9wZW4rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxzdmxkICAkTElCUyIKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGRsb3BlbiAoKTsKK2ludAorbWFpbiAoKQoreworZGxvcGVuICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2xpYl9zdmxkX2Rsb3Blbj15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfbGliX3N2bGRfZGxvcGVuPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfc3ZsZF9kbG9wZW4iID4mNgoraWYgdGVzdCAkYWNfY3ZfbGliX3N2bGRfZGxvcGVuID0geWVzOyB0aGVuCisgIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxzdmxkIgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGRsZF9saW5rIGluIC1sZGxkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGRsZF9saW5rIGluIC1sZGxkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9saWJfZGxkX2RsZF9saW5rK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGxkICAkTElCUyIKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGRsZF9saW5rICgpOworaW50CittYWluICgpCit7CitkbGRfbGluayAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9saWJfZGxkX2RsZF9saW5rPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jdl9saWJfZGxkX2RsZF9saW5rPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX2RsZF9kbGRfbGluayIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX2RsZF9kbGRfbGluayIgPiY2CitpZiB0ZXN0ICRhY19jdl9saWJfZGxkX2RsZF9saW5rID0geWVzOyB0aGVuCisgIGx0X2N2X2Rsb3Blbj0iZGxkX2xpbmsiIGx0X2N2X2Rsb3Blbl9saWJzPSItZGxkIgorZmkKKworCitmaQorCisKK2ZpCisKKworZmkKKworCitmaQorCisKK2ZpCisKKyAgICA7OworICBlc2FjCisKKyAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW4iICE9IHhubzsgdGhlbgorICAgIGVuYWJsZV9kbG9wZW49eWVzCisgIGVsc2UKKyAgICBlbmFibGVfZGxvcGVuPW5vCisgIGZpCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuIGluCisgIGRsb3BlbikKKyAgICBzYXZlX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCisgICAgdGVzdCAieCRhY19jdl9oZWFkZXJfZGxmY25faCIgPSB4eWVzICYmIENQUEZMQUdTPSIkQ1BQRkxBR1MgLURIQVZFX0RMRkNOX0giCisKKyAgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsIGV2YWwgTERGTEFHUz1cIlwkTERGTEFHUyAkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKKworICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgTElCUz0iJGx0X2N2X2Rsb3Blbl9saWJzICRMSUJTIgorCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgYSBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBhIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X2N2X2Rsb3Blbl9zZWxmK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIAkgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuX3NlbGY9Y3Jvc3MKK2Vsc2UKKyAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgorICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA5MDgwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmIEhBVkVfRExGQ05fSAorI2luY2x1ZGUgPGRsZmNuLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBSVExEX0dMT0JBTAorIyAgZGVmaW5lIExUX0RMR0xPQkFMCQlSVExEX0dMT0JBTAorI2Vsc2UKKyMgIGlmZGVmIERMX0dMT0JBTAorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCURMX0dMT0JBTAorIyAgZWxzZQorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCTAKKyMgIGVuZGlmCisjZW5kaWYKKworLyogV2UgbWF5IGhhdmUgdG8gZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cgaW4gdGhlIGNvbW1hbmQgbGluZSBpZiB3ZQorICAgZmluZCBvdXQgaXQgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtLiAqLworI2lmbmRlZiBMVF9ETExBWllfT1JfTk9XCisjICBpZmRlZiBSVExEX0xBWlkKKyMgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCVJUTERfTEFaWQorIyAgZWxzZQorIyAgICBpZmRlZiBETF9MQVpZCisjICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCURMX0xBWlkKKyMgICAgZWxzZQorIyAgICAgIGlmZGVmIFJUTERfTk9XCisjICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlSVExEX05PVworIyAgICAgIGVsc2UKKyMgICAgICAgIGlmZGVmIERMX05PVworIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlETF9OT1cKKyMgICAgICAgIGVsc2UKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJMAorIyAgICAgICAgZW5kaWYKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgdm9pZCBleGl0IChpbnQpOworI2VuZGlmCisKK3ZvaWQgZm5vcmQoKSB7IGludCBpPTQyO30KK2ludCBtYWluICgpCit7CisgIHZvaWQgKnNlbGYgPSBkbG9wZW4gKDAsIExUX0RMR0xPQkFMfExUX0RMTEFaWV9PUl9OT1cpOworICBpbnQgc3RhdHVzID0gJGx0X2RsdW5rbm93bjsKKworICBpZiAoc2VsZikKKyAgICB7CisgICAgICBpZiAoZGxzeW0gKHNlbGYsImZub3JkIikpICAgICAgIHN0YXR1cyA9ICRsdF9kbG5vX3VzY29yZTsKKyAgICAgIGVsc2UgaWYgKGRsc3ltKCBzZWxmLCJfZm5vcmQiKSkgc3RhdHVzID0gJGx0X2RsbmVlZF91c2NvcmU7CisgICAgICAvKiBkbGNsb3NlIChzZWxmKTsgKi8KKyAgICB9CisgIGVsc2UKKyAgICBwdXRzIChkbGVycm9yICgpKTsKKworICAgIGV4aXQgKHN0YXR1cyk7Cit9CitFT0YKKyAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gMj4vZGV2L251bGw7IHRoZW4KKyAgICAoLi9jb25mdGVzdDsgZXhpdDsgKSA+JjUgMj4vZGV2L251bGwKKyAgICBsdF9zdGF0dXM9JD8KKyAgICBjYXNlIHgkbHRfc3RhdHVzIGluCisgICAgICB4JGx0X2Rsbm9fdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZj15ZXMgOzsKKyAgICAgIHgkbHRfZGxuZWVkX3VzY29yZSkgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzIDs7CisgICAgICB4JGx0X2RsdW5rbm93bnx4KikgbHRfY3ZfZGxvcGVuX3NlbGY9bm8gOzsKKyAgICBlc2FjCisgIGVsc2UgOgorICAgICMgY29tcGlsYXRpb24gZmFpbGVkCisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9bm8KKyAgZmkKK2ZpCitybSAtZnIgY29uZnRlc3QqCisKKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsdF9jdl9kbG9wZW5fc2VsZiIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfY3ZfZGxvcGVuX3NlbGYiID4mNgorCisgICAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW5fc2VsZiIgPSB4eWVzOyB0aGVuCisgICAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljXCIKKyAgICAgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIGEgc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgYSBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgCSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9Y3Jvc3MKK2Vsc2UKKyAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgorICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA5MTgwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmIEhBVkVfRExGQ05fSAorI2luY2x1ZGUgPGRsZmNuLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBSVExEX0dMT0JBTAorIyAgZGVmaW5lIExUX0RMR0xPQkFMCQlSVExEX0dMT0JBTAorI2Vsc2UKKyMgIGlmZGVmIERMX0dMT0JBTAorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCURMX0dMT0JBTAorIyAgZWxzZQorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCTAKKyMgIGVuZGlmCisjZW5kaWYKKworLyogV2UgbWF5IGhhdmUgdG8gZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cgaW4gdGhlIGNvbW1hbmQgbGluZSBpZiB3ZQorICAgZmluZCBvdXQgaXQgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtLiAqLworI2lmbmRlZiBMVF9ETExBWllfT1JfTk9XCisjICBpZmRlZiBSVExEX0xBWlkKKyMgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCVJUTERfTEFaWQorIyAgZWxzZQorIyAgICBpZmRlZiBETF9MQVpZCisjICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCURMX0xBWlkKKyMgICAgZWxzZQorIyAgICAgIGlmZGVmIFJUTERfTk9XCisjICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlSVExEX05PVworIyAgICAgIGVsc2UKKyMgICAgICAgIGlmZGVmIERMX05PVworIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlETF9OT1cKKyMgICAgICAgIGVsc2UKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJMAorIyAgICAgICAgZW5kaWYKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgdm9pZCBleGl0IChpbnQpOworI2VuZGlmCisKK3ZvaWQgZm5vcmQoKSB7IGludCBpPTQyO30KK2ludCBtYWluICgpCit7CisgIHZvaWQgKnNlbGYgPSBkbG9wZW4gKDAsIExUX0RMR0xPQkFMfExUX0RMTEFaWV9PUl9OT1cpOworICBpbnQgc3RhdHVzID0gJGx0X2RsdW5rbm93bjsKKworICBpZiAoc2VsZikKKyAgICB7CisgICAgICBpZiAoZGxzeW0gKHNlbGYsImZub3JkIikpICAgICAgIHN0YXR1cyA9ICRsdF9kbG5vX3VzY29yZTsKKyAgICAgIGVsc2UgaWYgKGRsc3ltKCBzZWxmLCJfZm5vcmQiKSkgc3RhdHVzID0gJGx0X2RsbmVlZF91c2NvcmU7CisgICAgICAvKiBkbGNsb3NlIChzZWxmKTsgKi8KKyAgICB9CisgIGVsc2UKKyAgICBwdXRzIChkbGVycm9yICgpKTsKKworICAgIGV4aXQgKHN0YXR1cyk7Cit9CitFT0YKKyAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gMj4vZGV2L251bGw7IHRoZW4KKyAgICAoLi9jb25mdGVzdDsgZXhpdDsgKSA+JjUgMj4vZGV2L251bGwKKyAgICBsdF9zdGF0dXM9JD8KKyAgICBjYXNlIHgkbHRfc3RhdHVzIGluCisgICAgICB4JGx0X2Rsbm9fdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzIDs7CisgICAgICB4JGx0X2RsbmVlZF91c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMgOzsKKyAgICAgIHgkbHRfZGx1bmtub3dufHgqKSBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9bm8gOzsKKyAgICBlc2FjCisgIGVsc2UgOgorICAgICMgY29tcGlsYXRpb24gZmFpbGVkCisgICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPW5vCisgIGZpCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorCisKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMiID4mNgorICAgIGZpCisKKyAgICBDUFBGTEFHUz0iJHNhdmVfQ1BQRkxBR1MiCisgICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKyAgICBMSUJTPSIkc2F2ZV9MSUJTIgorICAgIDs7CisgIGVzYWMKKworICBjYXNlICRsdF9jdl9kbG9wZW5fc2VsZiBpbgorICB5ZXN8bm8pIGVuYWJsZV9kbG9wZW5fc2VsZj0kbHRfY3ZfZGxvcGVuX3NlbGYgOzsKKyAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmPXVua25vd24gOzsKKyAgZXNhYworCisgIGNhc2UgJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyBpbgorICB5ZXN8bm8pIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9JGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyA7OworICAqKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPXVua25vd24gOzsKKyAgZXNhYworZmkKKworCisjIFJlcG9ydCB3aGljaCBsaWJyYXJ5IHR5cGVzIHdpbGwgYWN0dWFsbHkgYmUgYnVpbHQKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gJEVDSE9fQyIgPiY2CitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkY2FuX2J1aWxkX3NoYXJlZCIgPiY1CitlY2hvICIke0VDSE9fVH0kY2FuX2J1aWxkX3NoYXJlZCIgPiY2CisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuLi4gJEVDSE9fQyIgPiY2Cit0ZXN0ICIkY2FuX2J1aWxkX3NoYXJlZCIgPSAibm8iICYmIGVuYWJsZV9zaGFyZWQ9bm8KKworIyBPbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHN0YXRpYyBsaWJyYXJpZXMgdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSwgYW5kCisjIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCisgICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJworICBmaQorICA7OworCithaXg0KiB8IGFpeDUqKQorICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQgJiYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0gbm8gOyB0aGVuCisgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgZmkKKyAgICA7OworZXNhYworZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGVuYWJsZV9zaGFyZWQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGVuYWJsZV9zaGFyZWQiID4mNgorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLi4uICRFQ0hPX0MiID4mNgorIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCit0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRlbmFibGVfc3RhdGljIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRlbmFibGVfc3RhdGljIiA+JjYKKworIyBUaGUgZWxzZSBjbGF1c2Ugc2hvdWxkIG9ubHkgZmlyZSB3aGVuIGJvb3RzdHJhcHBpbmcgdGhlCisjIGxpYnRvb2wgZGlzdHJpYnV0aW9uLCBvdGhlcndpc2UgeW91IGZvcmdvdCB0byBzaGlwIGx0bWFpbi5zaAorIyB3aXRoIHlvdXIgcGFja2FnZSwgYW5kIHlvdSB3aWxsIGdldCBjb21wbGFpbnRzIHRoYXQgdGhlcmUgYXJlCisjIG5vIHJ1bGVzIHRvIGdlbmVyYXRlIGx0bWFpbi5zaC4KK2lmIHRlc3QgLWYgIiRsdG1haW4iOyB0aGVuCisgICMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIgY29tbWFuZHMgdGhyb3VnaAorICAjIHdpdGhvdXQgcmVtb3ZhbCBvZiBcIGVzY2FwZXMuCisgIGlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCisgICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKKyAgZmkKKyAgIyBOb3cgcXVvdGUgYWxsIHRoZSB0aGluZ3MgdGhhdCBtYXkgY29udGFpbiBtZXRhY2hhcmFjdGVycyB3aGlsZSBiZWluZworICAjIGNhcmVmdWwgbm90IHRvIG92ZXJxdW90ZSB0aGUgQUNfU1VCU1RlZCB2YWx1ZXMuICBXZSB0YWtlIGNvcGllcyBvZiB0aGUKKyAgIyB2YXJpYWJsZXMgYW5kIHF1b3RlIHRoZSBjb3BpZXMgZm9yIGdlbmVyYXRpb24gb2YgdGhlIGxpYnRvb2wgc2NyaXB0LgorICBmb3IgdmFyIGluIGVjaG8gb2xkX0NDIG9sZF9DRkxBR1MgQVIgQVJfRkxBR1MgRUdSRVAgUkFOTElCIExOX1MgTFRDQyBMVENGTEFHUyBOTSBcCisgICAgU0VEIFNIRUxMIFNUUklQIFwKKyAgICBsaWJuYW1lX3NwZWMgbGlicmFyeV9uYW1lc19zcGVjIHNvbmFtZV9zcGVjIGV4dHJhY3RfZXhwc3ltc19jbWRzIFwKKyAgICBvbGRfc3RyaXBsaWIgc3RyaXBsaWIgZmlsZV9tYWdpY19jbWQgZmluaXNoX2NtZHMgZmluaXNoX2V2YWwgXAorICAgIGRlcGxpYnNfY2hlY2tfbWV0aG9kIHJlbG9hZF9mbGFnIHJlbG9hZF9jbWRzIG5lZWRfbG9ja3MgXAorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wgXAorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIFwKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMgXAorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgXAorICAgIGNvbXBpbGVyIFwKKyAgICBDQyBcCisgICAgTEQgXAorICAgIGx0X3Byb2dfY29tcGlsZXJfd2wgXAorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljIFwKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyBcCisgICAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcgXAorICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyBcCisgICAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjIFwKKyAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyBcCisgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcyBcCisgICAgb2xkX2FyY2hpdmVfY21kcyBcCisgICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyBcCisgICAgcHJlZGVwX29iamVjdHMgXAorICAgIHBvc3RkZXBfb2JqZWN0cyBcCisgICAgcHJlZGVwcyBcCisgICAgcG9zdGRlcHMgXAorICAgIGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCBcCisgICAgYXJjaGl2ZV9jbWRzIFwKKyAgICBhcmNoaXZlX2V4cHN5bV9jbWRzIFwKKyAgICBwb3N0aW5zdGFsbF9jbWRzIFwKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHMgXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIFwKKyAgICBhbGxvd191bmRlZmluZWRfZmxhZyBcCisgICAgbm9fdW5kZWZpbmVkX2ZsYWcgXAorICAgIGV4cG9ydF9zeW1ib2xzX2NtZHMgXAorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgXAorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQgXAorICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IgXAorICAgIGhhcmRjb2RlX2F1dG9tYXRpYyBcCisgICAgbW9kdWxlX2NtZHMgXAorICAgIG1vZHVsZV9leHBzeW1fY21kcyBcCisgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX28gXAorICAgIGV4Y2x1ZGVfZXhwc3ltcyBcCisgICAgaW5jbHVkZV9leHBzeW1zOyBkbworCisgICAgY2FzZSAkdmFyIGluCisgICAgb2xkX2FyY2hpdmVfY21kcyB8IFwKKyAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIHwgXAorICAgIGFyY2hpdmVfY21kcyB8IFwKKyAgICBhcmNoaXZlX2V4cHN5bV9jbWRzIHwgXAorICAgIG1vZHVsZV9jbWRzIHwgXAorICAgIG1vZHVsZV9leHBzeW1fY21kcyB8IFwKKyAgICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyB8IFwKKyAgICBleHBvcnRfc3ltYm9sc19jbWRzIHwgXAorICAgIGV4dHJhY3RfZXhwc3ltc19jbWRzIHwgcmVsb2FkX2NtZHMgfCBmaW5pc2hfY21kcyB8IFwKKyAgICBwb3N0aW5zdGFsbF9jbWRzIHwgcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIHwgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyB8IFwKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgfCBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYykKKyAgICAgICMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KKyAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRkb3VibGVfcXVvdGVfc3Vic3RcIiAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCIgLWUgXCJcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XCJcYFxcXCIiCisgICAgICA7OworICAgICopCisgICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYFxcXCIiCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorCisgIGNhc2UgJGx0X2VjaG8gaW4KKyAgKidcJDAgLS1mYWxsYmFjay1lY2hvIicpCisgICAgbHRfZWNobz1gJGVjaG8gIlgkbHRfZWNobyIgfCAkWHNlZCAtZSAncy9cXFxcXFxcJDAgLS1mYWxsYmFjay1lY2hvIiQvJDAgLS1mYWxsYmFjay1lY2hvIi8nYAorICAgIDs7CisgIGVzYWMKKworY2ZnZmlsZT0iJHtvZmlsZX1UIgorICB0cmFwICIkcm0gXCIkY2ZnZmlsZVwiOyBleGl0IDEiIDEgMiAxNQorICAkcm0gLWYgIiRjZmdmaWxlIgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjcmVhdGluZyAkb2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiBjcmVhdGluZyAkb2ZpbGUiID4mNjt9CisKKyAgY2F0IDw8X19FT0ZfXyA+PiAiJGNmZ2ZpbGUiCisjISAkU0hFTEwKKworIyBgJGVjaG8gIiRjZmdmaWxlIiB8IHNlZCAncyVeLiovJSUnYCAtIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUCkKKyMgTk9URTogQ2hhbmdlcyBtYWRlIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3Q6IGxvb2sgYXQgbHRtYWluLnNoLgorIworIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBMaWJ0b29sOgorIyBPcmlnaW5hbGx5IGJ5IEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIEEgc2VkIHByb2dyYW0gdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXQuCitTRUQ9JGx0X1NFRAorCisjIFNlZCB0aGF0IGhlbHBzIHVzIGF2b2lkIGFjY2lkZW50YWxseSB0cmlnZ2VyaW5nIGVjaG8oMSkgb3B0aW9ucyBsaWtlIC1uLgorWHNlZD0iJFNFRCAtZSAxcy9eWC8vIgorCisjIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAorIyBpZiBDRFBBVEggaXMgc2V0LgorKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAorCisjIFRoZSBuYW1lcyBvZiB0aGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHN1cHBvcnRlZCBieSB0aGlzIHNjcmlwdC4KK2F2YWlsYWJsZV90YWdzPQorCisjICMjIyBCRUdJTiBMSUJUT09MIENPTkZJRworCisjIExpYnRvb2wgd2FzIGNvbmZpZ3VyZWQgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisKKyMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KK1NIRUxMPSRsdF9TSEVMTAorCisjIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuCitidWlsZF9saWJ0b29sX2xpYnM9JGVuYWJsZV9zaGFyZWQKKworIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLgorYnVpbGRfb2xkX2xpYnM9JGVuYWJsZV9zdGF0aWMKKworIyBXaGV0aGVyIG9yIG5vdCB0byBhZGQgLWxjIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgorYnVpbGRfbGlidG9vbF9uZWVkX2xjPSRhcmNoaXZlX2NtZHNfbmVlZF9sYworCisjIFdoZXRoZXIgb3Igbm90IHRvIGRpc2FsbG93IHNoYXJlZCBsaWJzIHdoZW4gcnVudGltZSBsaWJzIGFyZSBzdGF0aWMKK2FsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcz0kZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcworCisjIFdoZXRoZXIgb3Igbm90IHRvIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbi4KK2Zhc3RfaW5zdGFsbD0kZW5hYmxlX2Zhc3RfaW5zdGFsbAorCisjIFRoZSBob3N0IHN5c3RlbS4KK2hvc3RfYWxpYXM9JGhvc3RfYWxpYXMKK2hvc3Q9JGhvc3QKK2hvc3Rfb3M9JGhvc3Rfb3MKKworIyBUaGUgYnVpbGQgc3lzdGVtLgorYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCitidWlsZD0kYnVpbGQKK2J1aWxkX29zPSRidWlsZF9vcworCisjIEFuIGVjaG8gcHJvZ3JhbSB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2hlcy4KK2VjaG89JGx0X2VjaG8KKworIyBUaGUgYXJjaGl2ZXIuCitBUj0kbHRfQVIKK0FSX0ZMQUdTPSRsdF9BUl9GTEFHUworCisjIEEgQyBjb21waWxlci4KK0xUQ0M9JGx0X0xUQ0MKKworIyBMVENDIGNvbXBpbGVyIGZsYWdzLgorTFRDRkxBR1M9JGx0X0xUQ0ZMQUdTCisKKyMgQSBsYW5ndWFnZS1zcGVjaWZpYyBjb21waWxlci4KK0NDPSRsdF9jb21waWxlcgorCisjIElzIHRoZSBjb21waWxlciB0aGUgR05VIEMgY29tcGlsZXI/Cit3aXRoX2djYz0kR0NDCisKKyMgQW4gRVJFIG1hdGNoZXIuCitFR1JFUD0kbHRfRUdSRVAKKworIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgorTEQ9JGx0X0xECisKKyMgV2hldGhlciB3ZSBuZWVkIGhhcmQgb3Igc29mdCBsaW5rcy4KK0xOX1M9JGx0X0xOX1MKKworIyBBIEJTRC1jb21wYXRpYmxlIG5tIHByb2dyYW0uCitOTT0kbHRfTk0KKworIyBBIHN5bWJvbCBzdHJpcHBpbmcgcHJvZ3JhbQorU1RSSVA9JGx0X1NUUklQCisKKyMgVXNlZCB0byBleGFtaW5lIGxpYnJhcmllcyB3aGVuIGZpbGVfbWFnaWNfY21kIGJlZ2lucyAiZmlsZSIKK01BR0lDX0NNRD0kTUFHSUNfQ01ECisKKyMgVXNlZCBvbiBjeWd3aW46IERMTCBjcmVhdGlvbiBwcm9ncmFtLgorRExMVE9PTD0iJERMTFRPT0wiCisKKyMgVXNlZCBvbiBjeWd3aW46IG9iamVjdCBkdW1wZXIuCitPQkpEVU1QPSIkT0JKRFVNUCIKKworIyBVc2VkIG9uIGN5Z3dpbjogYXNzZW1ibGVyLgorQVM9IiRBUyIKKworIyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGVtcG9yYXJ5IGxpYnRvb2wgZmlsZXMuCitvYmpkaXI9JG9iamRpcgorCisjIEhvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuCityZWxvYWRfZmxhZz0kbHRfcmVsb2FkX2ZsYWcKK3JlbG9hZF9jbWRzPSRsdF9yZWxvYWRfY21kcworCisjIEhvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXIuCit3bD0kbHRfbHRfcHJvZ19jb21waWxlcl93bAorCisjIE9iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKS4KK29iamV4dD0iJGFjX29iamV4dCIKKworIyBPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIikuCitsaWJleHQ9IiRsaWJleHQiCisKKyMgU2hhcmVkIGxpYnJhcnkgc3VmZml4IChub3JtYWxseSAiLnNvIikuCitzaHJleHRfY21kcz0nJHNocmV4dF9jbWRzJworCisjIEV4ZWN1dGFibGUgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICIiKS4KK2V4ZWV4dD0iJGV4ZWV4dCIKKworIyBBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHMuCitwaWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9waWMKK3BpY19tb2RlPSRwaWNfbW9kZQorCisjIFdoYXQgaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgY29tbWFuZD8KK21heF9jbWRfbGVuPSRsdF9jdl9zeXNfbWF4X2NtZF9sZW4KKworIyBEb2VzIGNvbXBpbGVyIHNpbXVsdGFuZW91c2x5IHN1cHBvcnQgLWMgYW5kIC1vIG9wdGlvbnM/Citjb21waWxlcl9jX289JGx0X2x0X2N2X3Byb2dfY29tcGlsZXJfY19vCisKKyMgTXVzdCB3ZSBsb2NrIGZpbGVzIHdoZW4gZG9pbmcgY29tcGlsYXRpb24/CituZWVkX2xvY2tzPSRsdF9uZWVkX2xvY2tzCisKKyMgRG8gd2UgbmVlZCB0aGUgbGliIHByZWZpeCBmb3IgbW9kdWxlcz8KK25lZWRfbGliX3ByZWZpeD0kbmVlZF9saWJfcHJlZml4CisKKyMgRG8gd2UgbmVlZCBhIHZlcnNpb24gZm9yIGxpYnJhcmllcz8KK25lZWRfdmVyc2lvbj0kbmVlZF92ZXJzaW9uCisKKyMgV2hldGhlciBkbG9wZW4gaXMgc3VwcG9ydGVkLgorZGxvcGVuX3N1cHBvcnQ9JGVuYWJsZV9kbG9wZW4KKworIyBXaGV0aGVyIGRsb3BlbiBvZiBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc2VsZj0kZW5hYmxlX2Rsb3Blbl9zZWxmCisKKyMgV2hldGhlciBkbG9wZW4gb2Ygc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgorZGxvcGVuX3NlbGZfc3RhdGljPSRlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljCisKKyMgQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZy4KK2xpbmtfc3RhdGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfc3RhdGljCisKKyMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KK25vX2J1aWx0aW5fZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcKKworIyBDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zLgorZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSRsdF9leHBvcnRfZHluYW1pY19mbGFnX3NwZWMKKworIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHNoYXJlZCBvYmplY3RzIGRpcmVjdGx5IGZyb20gYXJjaGl2ZXMuCit3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0kbHRfd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMKKworIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHRocmVhZC1zYWZlIG9iamVjdHMuCit0aHJlYWRfc2FmZV9mbGFnX3NwZWM9JGx0X3RocmVhZF9zYWZlX2ZsYWdfc3BlYworCisjIExpYnJhcnkgdmVyc2lvbmluZyB0eXBlLgordmVyc2lvbl90eXBlPSR2ZXJzaW9uX3R5cGUKKworIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KK2xpYm5hbWVfc3BlYz0kbHRfbGlibmFtZV9zcGVjCisKKyMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KKyMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRS4KK2xpYnJhcnlfbmFtZXNfc3BlYz0kbHRfbGlicmFyeV9uYW1lc19zcGVjCisKKyMgVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWUuCitzb25hbWVfc3BlYz0kbHRfc29uYW1lX3NwZWMKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgorUkFOTElCPSRsdF9SQU5MSUIKK29sZF9hcmNoaXZlX2NtZHM9JGx0X29sZF9hcmNoaXZlX2NtZHMKK29sZF9wb3N0aW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdGluc3RhbGxfY21kcworb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3R1bmluc3RhbGxfY21kcworCisjIENyZWF0ZSBhbiBvbGQtc3R5bGUgYXJjaGl2ZSBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzCisKKyMgQ3JlYXRlIGEgdGVtcG9yYXJ5IG9sZC1zdHlsZSBhcmNoaXZlIHRvIGxpbmsgaW5zdGVhZCBvZiBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhIHNoYXJlZCBhcmNoaXZlLgorYXJjaGl2ZV9jbWRzPSRsdF9hcmNoaXZlX2NtZHMKK2FyY2hpdmVfZXhwc3ltX2NtZHM9JGx0X2FyY2hpdmVfZXhwc3ltX2NtZHMKK3Bvc3RpbnN0YWxsX2NtZHM9JGx0X3Bvc3RpbnN0YWxsX2NtZHMKK3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfcG9zdHVuaW5zdGFsbF9jbWRzCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSAoYXNzdW1lZCBzYW1lIGFzIGFib3ZlIGlmIGVtcHR5KQorbW9kdWxlX2NtZHM9JGx0X21vZHVsZV9jbWRzCittb2R1bGVfZXhwc3ltX2NtZHM9JGx0X21vZHVsZV9leHBzeW1fY21kcworCisjIENvbW1hbmRzIHRvIHN0cmlwIGxpYnJhcmllcy4KK29sZF9zdHJpcGxpYj0kbHRfb2xkX3N0cmlwbGliCitzdHJpcGxpYj0kbHRfc3RyaXBsaWIKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3ByZWRlcF9vYmplY3RzPSRsdF9wcmVkZXBfb2JqZWN0cworCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwb3N0ZGVwX29iamVjdHM9JGx0X3Bvc3RkZXBfb2JqZWN0cworCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcHJlZGVwcz0kbHRfcHJlZGVwcworCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwb3N0ZGVwcz0kbHRfcG9zdGRlcHMKKworIyBUaGUgbGlicmFyeSBzZWFyY2ggcGF0aCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBpbGVyIHdoZW4gbGlua2luZworIyBhIHNoYXJlZCBsaWJyYXJ5LgorY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoPSRsdF9jb21waWxlcl9saWJfc2VhcmNoX3BhdGgKKworIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KK2RlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9kZXBsaWJzX2NoZWNrX21ldGhvZAorCisjIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gZmlsZV9tYWdpYy4KK2ZpbGVfbWFnaWNfY21kPSRsdF9maWxlX21hZ2ljX2NtZAorCisjIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgorYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X2FsbG93X3VuZGVmaW5lZF9mbGFnCisKKyMgRmxhZyB0aGF0IGZvcmNlcyBubyB1bmRlZmluZWQgc3ltYm9scy4KK25vX3VuZGVmaW5lZF9mbGFnPSRsdF9ub191bmRlZmluZWRfZmxhZworCisjIENvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeS4KK2ZpbmlzaF9jbWRzPSRsdF9maW5pc2hfY21kcworCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dCBub3Qgc2hvd24uCitmaW5pc2hfZXZhbD0kbHRfZmluaXNoX2V2YWwKKworIyBUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzLgorZ2xvYmFsX3N5bWJvbF9waXBlPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlCisKKyMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgorZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIKK2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzCisKKyMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgorcnVucGF0aF92YXI9JHJ1bnBhdGhfdmFyCisKKyMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KK3NobGlicGF0aF92YXI9JHNobGlicGF0aF92YXIKKworIyBJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAorCisjIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgoraGFyZGNvZGVfYWN0aW9uPSRoYXJkY29kZV9hY3Rpb24KKworIyBXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzLgoraGFyZGNvZGVfaW50b19saWJzPSRoYXJkY29kZV9pbnRvX2xpYnMKKworIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCisjIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjCisKKyMgSWYgbGQgaXMgdXNlZCB3aGVuIGxpbmtpbmcsIGZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50bworIyBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4gVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzCisjIG5vdCBleGlzdC4KK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQ9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQKKworIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgLXJwYXRoIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGx0X2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisjIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9kaXJlY3Q9JGhhcmRjb2RlX2RpcmVjdAorCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQorIyByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfbWludXNfTD0kaGFyZGNvZGVfbWludXNfTAorCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvCisjIHRoZSByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kaGFyZGNvZGVfc2hsaWJwYXRoX3ZhcgorCisjIFNldCB0byB5ZXMgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIgaW50byB0aGUgbGlicmFyeQorIyBhbmQgYWxsIHN1YnNlcXVlbnQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyBsaW5rZWQgYWdhaW5zdCBpdC4KK2hhcmRjb2RlX2F1dG9tYXRpYz0kaGFyZGNvZGVfYXV0b21hdGljCisKKyMgVmFyaWFibGVzIHdob3NlIHZhbHVlcyBzaG91bGQgYmUgc2F2ZWQgaW4gbGlidG9vbCB3cmFwcGVyIHNjcmlwdHMgYW5kCisjIHJlc3RvcmVkIGF0IHJlbGluayB0aW1lLgordmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayIKKworIyBXaGV0aGVyIGxpYnRvb2wgbXVzdCBsaW5rIGEgcHJvZ3JhbSBhZ2FpbnN0IGFsbCBpdHMgZGVwZW5kZW5jeSBsaWJyYXJpZXMuCitsaW5rX2FsbF9kZXBsaWJzPSRsaW5rX2FsbF9kZXBsaWJzCisKKyMgQ29tcGlsZS10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCitzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYworCisjIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMKKworIyBGaXggdGhlIHNoZWxsIHZhcmlhYmxlIFwkc3JjZmlsZSBmb3IgdGhlIGNvbXBpbGVyLgorZml4X3NyY2ZpbGVfcGF0aD0iJGZpeF9zcmNmaWxlX3BhdGgiCisKKyMgU2V0IHRvIHllcyBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KK2Fsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzCisKKyMgVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9scy4KK2V4cG9ydF9zeW1ib2xzX2NtZHM9JGx0X2V4cG9ydF9zeW1ib2xzX2NtZHMKKworIyBUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorZXh0cmFjdF9leHBzeW1zX2NtZHM9JGx0X2V4dHJhY3RfZXhwc3ltc19jbWRzCisKKyMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scy4KK2V4Y2x1ZGVfZXhwc3ltcz0kbHRfZXhjbHVkZV9leHBzeW1zCisKKyMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkLgoraW5jbHVkZV9leHBzeW1zPSRsdF9pbmNsdWRlX2V4cHN5bXMKKworIyAjIyMgRU5EIExJQlRPT0wgQ09ORklHCisKK19fRU9GX18KKworCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgY2F0IDw8XEVPRiA+PiAiJGNmZ2ZpbGUiCisKKyMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQorIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCisjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCitpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KKyAgQ09MTEVDVF9OQU1FUz0KKyAgZXhwb3J0IENPTExFQ1RfTkFNRVMKK2ZpCitFT0YKKyAgICA7OworICBlc2FjCisKKyAgIyBXZSB1c2Ugc2VkIGluc3RlYWQgb2YgY2F0IGJlY2F1c2UgYmFzaCBvbiBESkdQUCBnZXRzIGNvbmZ1c2VkIGlmCisgICMgaWYgZmluZHMgbWl4ZWQgQ1IvTEYgYW5kIExGLW9ubHkgbGluZXMuICBTaW5jZSBzZWQgb3BlcmF0ZXMgaW4KKyAgIyB0ZXh0IG1vZGUsIGl0IHByb3Blcmx5IGNvbnZlcnRzIGxpbmVzIHRvIENSL0xGLiAgVGhpcyBiYXNoIHByb2JsZW0KKyAgIyBpcyByZXBvcnRlZGx5IGZpeGVkLCBidXQgd2h5IG5vdCBydW4gb24gb2xkIHZlcnNpb25zIHRvbz8KKyAgc2VkICckcScgIiRsdG1haW4iID4+ICIkY2ZnZmlsZSIgfHwgKHJtIC1mICIkY2ZnZmlsZSI7IGV4aXQgMSkKKworICBtdiAtZiAiJGNmZ2ZpbGUiICIkb2ZpbGUiIHx8IFwKKyAgICAocm0gLWYgIiRvZmlsZSIgJiYgY3AgIiRjZmdmaWxlIiAiJG9maWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUiKQorICBjaG1vZCAreCAiJG9maWxlIgorCitlbHNlCisgICMgSWYgdGhlcmUgaXMgbm8gTWFrZWZpbGUgeWV0LCB3ZSByZWx5IG9uIGEgbWFrZSBydWxlIHRvIGV4ZWN1dGUKKyAgIyBgY29uZmlnLnN0YXR1cyAtLXJlY2hlY2snIHRvIHJlcnVuIHRoZXNlIHRlc3RzIGFuZCBjcmVhdGUgdGhlCisgICMgbGlidG9vbCBzY3JpcHQgdGhlbi4KKyAgbHRtYWluX2luPWBlY2hvICRsdG1haW4gfCBzZWQgLWUgJ3MvXC5zaCQvLmluLydgCisgIGlmIHRlc3QgLWYgIiRsdG1haW5faW4iOyB0aGVuCisgICAgdGVzdCAtZiBNYWtlZmlsZSAmJiBtYWtlICIkbHRtYWluIgorICBmaQorZmkKKworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK0NDPSIkbHRfc2F2ZV9DQyIKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXRhZ3Mgb3IgLS13aXRob3V0LXRhZ3Mgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3RhZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgd2l0aHZhbD0iJHdpdGhfdGFncyIKKyAgdGFnbmFtZXM9IiR3aXRodmFsIgorZmk7CisKK2lmIHRlc3QgLWYgIiRsdG1haW4iICYmIHRlc3QgLW4gIiR0YWduYW1lcyI7IHRoZW4KKyAgaWYgdGVzdCAhIC1mICIke29maWxlfSI7IHRoZW4KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBvdXRwdXQgZmlsZSBcYCRvZmlsZScgZG9lcyBub3QgZXhpc3QiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiBvdXRwdXQgZmlsZSBcYCRvZmlsZScgZG9lcyBub3QgZXhpc3QiID4mMjt9CisgIGZpCisKKyAgaWYgdGVzdCAteiAiJExUQ0MiOyB0aGVuCisgICAgZXZhbCAiYCRTSEVMTCAke29maWxlfSAtLWNvbmZpZyB8IGdyZXAgJ15MVENDPSdgIgorICAgIGlmIHRlc3QgLXogIiRMVENDIjsgdGhlbgorICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogb3V0cHV0IGZpbGUgXGAkb2ZpbGUnIGRvZXMgbm90IGxvb2sgbGlrZSBhIGxpYnRvb2wgc2NyaXB0IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogb3V0cHV0IGZpbGUgXGAkb2ZpbGUnIGRvZXMgbm90IGxvb2sgbGlrZSBhIGxpYnRvb2wgc2NyaXB0IiA+JjI7fQorICAgIGVsc2UKKyAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IHVzaW5nIFxgTFRDQz0kTFRDQycsIGV4dHJhY3RlZCBmcm9tIFxgJG9maWxlJyIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIFxgTFRDQz0kTFRDQycsIGV4dHJhY3RlZCBmcm9tIFxgJG9maWxlJyIgPiYyO30KKyAgICBmaQorICBmaQorICBpZiB0ZXN0IC16ICIkTFRDRkxBR1MiOyB0aGVuCisgICAgZXZhbCAiYCRTSEVMTCAke29maWxlfSAtLWNvbmZpZyB8IGdyZXAgJ15MVENGTEFHUz0nYCIKKyAgZmkKKworICAjIEV4dHJhY3QgbGlzdCBvZiBhdmFpbGFibGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIGluICRvZmlsZS4KKyAgIyBOb3RlIHRoYXQgdGhpcyBhc3N1bWVzIHRoZSBlbnRpcmUgbGlzdCBpcyBvbiBvbmUgbGluZS4KKyAgYXZhaWxhYmxlX3RhZ3M9YGdyZXAgIl5hdmFpbGFibGVfdGFncz0iICIke29maWxlfSIgfCAkU0VEIC1lICdzL2F2YWlsYWJsZV90YWdzPVwoLiokXCkvXDEvJyAtZSAncy9cIi8vZydgCisKKyAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgIGZvciB0YWduYW1lIGluICR0YWduYW1lczsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAjIENoZWNrIHdoZXRoZXIgdGFnbmFtZSBjb250YWlucyBvbmx5IHZhbGlkIGNoYXJhY3RlcnMKKyAgICBjYXNlIGAkZWNobyAiWCR0YWduYW1lIiB8ICRYc2VkIC1lICdzOlstX0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY3ODkwLC9dOjpnJ2AgaW4KKyAgICAiIikgOzsKKyAgICAqKSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW52YWxpZCB0YWcgbmFtZTogJHRhZ25hbWUiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCB0YWcgbmFtZTogJHRhZ25hbWUiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKwk7OworICAgIGVzYWMKKworICAgIGlmIGdyZXAgIl4jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lJCIgPCAiJHtvZmlsZX0iID4gL2Rldi9udWxsCisgICAgdGhlbgorICAgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogdGFnIG5hbWUgXCIkdGFnbmFtZVwiIGFscmVhZHkgZXhpc3RzIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IHRhZyBuYW1lIFwiJHRhZ25hbWVcIiBhbHJlYWR5IGV4aXN0cyIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGZpCisKKyAgICAjIFVwZGF0ZSB0aGUgbGlzdCBvZiBhdmFpbGFibGUgdGFncy4KKyAgICBpZiB0ZXN0IC1uICIkdGFnbmFtZSI7IHRoZW4KKyAgICAgIGVjaG8gYXBwZW5kaW5nIGNvbmZpZ3VyYXRpb24gdGFnIFwiJHRhZ25hbWVcIiB0byAkb2ZpbGUKKworICAgICAgY2FzZSAkdGFnbmFtZSBpbgorICAgICAgQ1hYKQorCWlmIHRlc3QgLW4gIiRDWFgiICYmICggdGVzdCAiWCRDWFgiICE9ICJYbm8iICYmCisJICAgICggKHRlc3QgIlgkQ1hYIiA9ICJYZysrIiAmJiBgZysrIC12ID4vZGV2L251bGwgMj4mMWAgKSB8fAorCSAgICAodGVzdCAiWCRDWFgiICE9ICJYZysrIikpKSA7IHRoZW4KKwkgIGFjX2V4dD1jYworYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKKworCisKKworYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vCithbGxvd191bmRlZmluZWRfZmxhZ19DWFg9CithbHdheXNfZXhwb3J0X3N5bWJvbHNfQ1hYPW5vCithcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0KK2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9CitoYXJkY29kZV9kaXJlY3RfQ1hYPW5vCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0KK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfQ1hYPQoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9CitoYXJkY29kZV9taW51c19MX0NYWD1ubworaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9dW5zdXBwb3J0ZWQKK2hhcmRjb2RlX2F1dG9tYXRpY19DWFg9bm8KK21vZHVsZV9jbWRzX0NYWD0KK21vZHVsZV9leHBzeW1fY21kc19DWFg9CitsaW5rX2FsbF9kZXBsaWJzX0NYWD11bmtub3duCitvbGRfYXJjaGl2ZV9jbWRzX0NYWD0kb2xkX2FyY2hpdmVfY21kcworbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPQord2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPQorZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19DWFg9bm8KKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIGFuZCBhZnRlciB0aGUgb2JqZWN0IGJlaW5nIGxpbmtlZDoKK3ByZWRlcF9vYmplY3RzX0NYWD0KK3Bvc3RkZXBfb2JqZWN0c19DWFg9CitwcmVkZXBzX0NYWD0KK3Bvc3RkZXBzX0NYWD0KK2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9DWFg9CisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBDKysgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWNwcAorCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgQysrIHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitvYmpleHRfQ1hYPSRvYmpleHQKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKK2x0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iaW50IHNvbWVfdmFyaWFibGUgPSAwO1xuIgorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdpbnQgbWFpbihpbnQsIGNoYXIgKltdKSB7IHJldHVybigwKTsgfVxuJworCisjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCisKKyMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCitMVENDPSR7TFRDQy0iJENDIn0KKworIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgorTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9CisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitjb21waWxlcj0kQ0MKKworCisjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CitwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0CitldmFsICIkYWNfY29tcGlsZSIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKK19sdF9jb21waWxlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKKyRybSBjb25mdGVzdCoKKworYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CitwcmludGYgIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0CitldmFsICIkYWNfbGluayIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKK19sdF9saW5rZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskcm0gY29uZnRlc3QqCisKKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2x0X3NhdmVfQ0M9JENDCitsdF9zYXZlX0xEPSRMRAorbHRfc2F2ZV9HQ0M9JEdDQworR0NDPSRHWFgKK2x0X3NhdmVfd2l0aF9nbnVfbGQ9JHdpdGhfZ251X2xkCitsdF9zYXZlX3BhdGhfTEQ9JGx0X2N2X3BhdGhfTEQKK2lmIHRlc3QgLW4gIiR7bHRfY3ZfcHJvZ19nbnVfbGRjeHgrc2V0fSI7IHRoZW4KKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9JGx0X2N2X3Byb2dfZ251X2xkY3h4CitlbHNlCisgICRhc191bnNldCBsdF9jdl9wcm9nX2dudV9sZAorZmkKK2lmIHRlc3QgLW4gIiR7bHRfY3ZfcGF0aF9MRENYWCtzZXR9IjsgdGhlbgorICBsdF9jdl9wYXRoX0xEPSRsdF9jdl9wYXRoX0xEQ1hYCitlbHNlCisgICRhc191bnNldCBsdF9jdl9wYXRoX0xECitmaQordGVzdCAteiAiJHtMRENYWCtzZXR9IiB8fCBMRD0kTERDWFgKK0NDPSR7Q1hYLSJjKysifQorY29tcGlsZXI9JENDCitjb21waWxlcl9DWFg9JENDCitmb3IgY2NfdGVtcCBpbiAkY29tcGlsZXIiIjsgZG8KKyAgY2FzZSAkY2NfdGVtcCBpbgorICAgIGNvbXBpbGUgfCAqW1xcL11jb21waWxlIHwgY2NhY2hlIHwgKltcXC9dY2NhY2hlICkgOzsKKyAgICBkaXN0Y2MgfCAqW1xcL11kaXN0Y2MgfCBwdXJpZnkgfCAqW1xcL11wdXJpZnkgKSA7OworICAgIFwtKikgOzsKKyAgICAqKSBicmVhazs7CisgIGVzYWMKK2RvbmUKK2NjX2Jhc2VuYW1lPWAkZWNobyAiWCRjY190ZW1wIiB8ICRYc2VkIC1lICdzJS4qLyUlJyAtZSAicyVeJGhvc3RfYWxpYXMtJSUiYAorCisKKyMgV2UgZG9uJ3Qgd2FudCAtZm5vLWV4Y2VwdGlvbiB3ZW4gY29tcGlsaW5nIEMrKyBjb2RlLCBzbyBzZXQgdGhlCisjIG5vX2J1aWx0aW5fZmxhZyBzZXBhcmF0ZWx5CitpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19DWFg9JyAtZm5vLWJ1aWx0aW4nCitlbHNlCisgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0NYWD0KK2ZpCisKK2lmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICMgU2V0IHVwIGRlZmF1bHQgR05VIEMrKyBjb25maWd1cmF0aW9uCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1nbnUtbGQgb3IgLS13aXRob3V0LWdudS1sZCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfZ251X2xkK3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX2dudV9sZCIKKyAgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCitlbHNlCisgIHdpdGhfZ251X2xkPW5vCitmaTsKK2FjX3Byb2c9bGQKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgJENDIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgJENDLi4uICRFQ0hPX0MiID4mNgorICBjYXNlICRob3N0IGluCisgICotKi1taW5ndyopCisgICAgIyBnY2MgbGVhdmVzIGEgdHJhaWxpbmcgY2FycmlhZ2UgcmV0dXJuIHdoaWNoIHVwc2V0cyBtaW5ndworICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNSB8IHRyIC1kICdcMDE1J2AgOzsKKyAgKikKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgIDs7CisgIGVzYWMKKyAgY2FzZSAkYWNfcHJvZyBpbgorICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgorICAgIFtcXC9dKiB8ID86W1xcL10qKQorICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJworICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGhuYW1lIG9mIGxkCisgICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCAkU0VEICdzJVxcXFwlLyVnJ2AKKyAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbworCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8ICRTRUQgInMlJHJlX2RpcmVsdCUvJSJgCisgICAgICBkb25lCisgICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKKyAgICAgIDs7CisgICIiKQorICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgorICAgIGFjX3Byb2c9bGQKKyAgICA7OworICAqKQorICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KKyAgICB3aXRoX2dudV9sZD11bmtub3duCisgICAgOzsKKyAgZXNhYworZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgR05VIGxkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIEdOVSBsZC4uLiAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQuLi4gJEVDSE9fQyIgPiY2CitmaQoraWYgdGVzdCAiJHtsdF9jdl9wYXRoX0xEK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KKyAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIiB8fCB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nJGFjX2V4ZWV4dCI7IHRoZW4KKyAgICAgIGx0X2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCisgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCisgICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgdmFyaWFudHMgb2YgR05VIGxkIG9ubHkgYWNjZXB0IC12LgorICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCisgICAgICBjYXNlIGAiJGx0X2N2X3BhdGhfTEQiIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KKyAgICAgICpHTlUqIHwgKid3aXRoIEJGRCcqKQorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKKwk7OworICAgICAgKikKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhaworCTs7CisgICAgICBlc2FjCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKK2Vsc2UKKyAgbHRfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KK2ZpCitmaQorCitMRD0iJGx0X2N2X3BhdGhfTEQiCitpZiB0ZXN0IC1uICIkTEQiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRMRCIgPiY1CitlY2hvICIke0VDSE9fVH0kTEQiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQordGVzdCAteiAiJExEIiAmJiB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X2N2X3Byb2dfZ251X2xkK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkcyBvbmx5IGFjY2VwdCAtdi4KK2Nhc2UgYCRMRCAtdiAyPiYxIDwvZGV2L251bGxgIGluCisqR05VKiB8ICond2l0aCBCRkQnKikKKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9eWVzCisgIDs7CisqKQorICBsdF9jdl9wcm9nX2dudV9sZD1ubworICA7OworZXNhYworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsdF9jdl9wcm9nX2dudV9sZCIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfY3ZfcHJvZ19nbnVfbGQiID4mNgord2l0aF9nbnVfbGQ9JGx0X2N2X3Byb2dfZ251X2xkCisKKworCisgICMgQ2hlY2sgaWYgR05VIEMrKyB1c2VzIEdOVSBsZCBhcyB0aGUgdW5kZXJseWluZyBsaW5rZXIsIHNpbmNlIHRoZQorICAjIGFyY2hpdmluZyBjb21tYW5kcyBiZWxvdyBhc3N1bWUgdGhhdCBHTlUgbGQgaXMgYmVpbmcgdXNlZC4KKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCisgICAgIyBJZiBhcmNoaXZlX2NtZHMgcnVucyBMRCwgbm90IENDLCB3bGFyYyBzaG91bGQgYmUgZW1wdHkKKyAgICAjIFhYWCBJIHRoaW5rIHdsYXJjIGNhbiBiZSBlbGltaW5hdGVkIGluIGx0Y2YtY3h4LCBidXQgSSBuZWVkIHRvCisgICAgIyAgICAgaW52ZXN0aWdhdGUgaXQgYSBsaXR0bGUgYml0IG1vcmUuIChNTSkKKyAgICB3bGFyYz0nJHt3bH0nCisKKyAgICAjIGFuY2llbnQgR05VIGxkIGRpZG4ndCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCisgICAgaWYgZXZhbCAiYCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkYCAtLWhlbHAgMj4mMSIgfCBcCisJZ3JlcCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICBlbHNlCisgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9CisgICAgZmkKKyAgZWxzZQorICAgIHdpdGhfZ251X2xkPW5vCisgICAgd2xhcmM9CisKKyAgICAjIEEgZ2VuZXJpYyBhbmQgdmVyeSBzaW1wbGUgZGVmYXVsdCBzaGFyZWQgbGlicmFyeSBjcmVhdGlvbgorICAgICMgY29tbWFuZCBmb3IgR05VIEMrKyBmb3IgdGhlIGNhc2Ugd2hlcmUgaXQgdXNlcyB0aGUgbmF0aXZlCisgICAgIyBsaW5rZXIsIGluc3RlYWQgb2YgR05VIGxkLiAgSWYgcG9zc2libGUsIHRoaXMgc2V0dGluZyBzaG91bGQKKyAgICAjIG92ZXJyaWRkZW4gdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIG5hdGl2ZSBsaW5rZXIgZmVhdHVyZXMgb24KKyAgICAjIHRoZSBwbGF0Zm9ybSBpdCBpcyBiZWluZyB1c2VkIG9uLgorICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJGxpYicKKyAgZmkKKworICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKyAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAiXC1MIicKKworZWxzZQorICBHWFg9bm8KKyAgd2l0aF9nbnVfbGQ9bm8KKyAgd2xhcmM9CitmaQorCisjIFBPUlRNRTogZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgQysrIGxpbmsgY2hhcmFjdGVyaXN0aWNzCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICRFQ0hPX0MiID4mNgorbGRfc2hsaWJzX0NYWD15ZXMKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgbGRfc2hsaWJzX0NYWD1ubworICAgIDs7CisgIGFpeDQqIHwgYWl4NSopCisgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICAgICMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKKyAgICAgICMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgorICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworICAgICAgZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKKyAgICAgIG5vX2VudHJ5X2ZsYWc9IiIKKyAgICBlbHNlCisgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisKKyAgICAgICMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAorICAgICAgIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCisgICAgICAjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgorICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlsyM118YWl4NC5bMjNdLip8YWl4NSopCisJZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCisJICBjYXNlICRsZF9mbGFnIGluCisJICAqLWJydGwqKQorCSAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcworCSAgICBicmVhaworCSAgICA7OworCSAgZXNhYworCWRvbmUKKwk7OworICAgICAgZXNhYworCisgICAgICBleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JworICAgICAgbm9fZW50cnlfZmxhZz0nLWJub2VudHJ5JworICAgIGZpCisKKyAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCisgICAgIyBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIElmIGxpbmtpbmcgYSBsaWJyYXJ5CisgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KKyAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAorICAgICMgZW5vdWdoIHRvIGZpeCB0aGUgcHJvYmxlbSwgYWRkIC1XbCwtYmJpZ3RvYyB0byBMREZMQUdTLgorCisgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJworICAgIGhhcmRjb2RlX2RpcmVjdF9DWFg9eWVzCisgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9JzonCisgICAgbGlua19hbGxfZGVwbGlic19DWFg9eWVzCisKKyAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlswMTJdfGFpeDQuWzAxMl0uKikKKyAgICAgICMgV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb24gQUlYIDQuMiBhbmQgbG93ZXIsIHRoZSBjaGVjaworICAgICAgIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCisJY29sbGVjdDJuYW1lPWAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYAorCWlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmIFwKKwkgICBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8IGdyZXAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCisJdGhlbgorCSAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCisJICBoYXJkY29kZV9kaXJlY3RfQ1hYPXllcworCWVsc2UKKwkgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKKwkgIGhhcmRjb2RlX2RpcmVjdF9DWFg9dW5zdXBwb3J0ZWQKKwkgICMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKKwkgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCisJICAjIHRvIHVuc3VwcG9ydGVkIGZvcmNlcyByZWxpbmtpbmcKKwkgIGhhcmRjb2RlX21pbnVzX0xfQ1hYPXllcworCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1MJGxpYmRpcicKKwkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPQorCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIHNoYXJlZF9mbGFnPSctc2hhcmVkJworICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJc2hhcmVkX2ZsYWc9IiRzaGFyZWRfZmxhZyAiJyR7d2x9LUcnCisgICAgICBmaQorICAgIGVsc2UKKyAgICAgICMgbm90IHVzaW5nIGdjYworICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQorCSMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6CisJc2hhcmVkX2ZsYWc9Jy1HJworICAgICAgZWxzZQorCWlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgc2hhcmVkX2ZsYWc9JyR7d2x9LUcnCisJZWxzZQorCSAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKKwlmaQorICAgICAgZmkKKyAgICBmaQorCisgICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoCisgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydC4KKyAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHNfQ1hYPXllcworICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorICAgICAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCisgICAgICAjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9Jy1iZXJvaycKKyAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgorICAgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorCithaXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KK30nYAorIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgoraWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KK30nYDsgZmkKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKKworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSJcJENDIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzIGBpZiB0ZXN0ICJ4JHthbGxvd191bmRlZmluZWRfZmxhZ30iICE9ICJ4IjsgdGhlbiBlY2hvICIke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IjsgZWxzZSA6OyBmaWAgJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMgJHNoYXJlZF9mbGFnIgorICAgICBlbHNlCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKKwlhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9Ii16IG5vZGVmcyIKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKKyAgICAgIGVsc2UKKwkjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KKwljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisKK2FpeF9saWJwYXRoPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQorfSdgCisjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQorfSdgOyBmaQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2lmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQorCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisJIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKKwkjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisJbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPScgJHt3bH0tYmVybm90b2snCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScgJHt3bH0tYmVyb2snCisJIyBFeHBvcnRlZCBzeW1ib2xzIGNhbiBiZSBwdWxsZWQgaW50byBzaGFyZWQgb2JqZWN0cyBmcm9tIGFyY2hpdmVzCisJd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPSckY29udmVuaWVuY2UnCisJYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPXllcworCSMgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBBSVggdHJhZGl0aW9uYWxseSBidWlsZHMgaXRzIHNoYXJlZCBsaWJyYXJpZXMuCisJYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAke3dsfS1ibm9lbnRyeSAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzJHthbGxvd191bmRlZmluZWRfZmxhZ31+JEFSICRBUl9GTEFHUyAkb3V0cHV0X29iamRpci8kbGlibmFtZSRyZWxlYXNlLmEgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKyAgICAgIGZpCisgICAgZmkKKyAgICA7OworCisgIGJlb3MqKQorICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPXVuc3VwcG9ydGVkCisgICAgICAjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCisgICAgICAjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCisgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLW5vc3RhcnQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgZWxzZQorICAgICAgbGRfc2hsaWJzX0NYWD1ubworICAgIGZpCisgICAgOzsKKworICBjaG9ydXMqKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAqKQorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCWxkX3NobGlic19DWFg9bm8KKwk7OworICAgIGVzYWMKKyAgICA7OworCisgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAjIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgQ1hYKSBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywKKyAgICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPSctTCRsaWJkaXInCisgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPXVuc3VwcG9ydGVkCisgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0NYWD1ubworICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfQ1hYPXllcworCisgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisgICAgICAjIElmIHRoZSBleHBvcnQtc3ltYm9scyBmaWxlIGFscmVhZHkgaXMgYSAuZGVmIGZpbGUgKDFzdCBsaW5lCisgICAgICAjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgorICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworICAgICAgZWxzZQorCWVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCWNhdCAkZXhwb3J0X3N5bWJvbHMgPj4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisgICAgICBmaX4KKyAgICAgICRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKyAgICBlbHNlCisgICAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgZmkKKyAgOzsKKyAgICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgICAgcmhhcHNvZHkqIHwgZGFyd2luMS5bMDEyXSkKKyAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCisgICAgICAgICA7OworICAgICAgICopICMgRGFyd2luIDEuMyBvbgorICAgICAgICAgaWYgdGVzdCAteiAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gOyB0aGVuCisgICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCisgICAgICAgICBlbHNlCisgICAgICAgICAgIGNhc2UgJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IGluCisgICAgICAgICAgICAgMTAuWzAxMl0pCisgICAgICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJworICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAxMC4qKQorICAgICAgICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcKKyAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgIGVzYWMKKyAgICAgICAgIGZpCisgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8KKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9DWFg9bm8KKyAgICAgIGhhcmRjb2RlX2F1dG9tYXRpY19DWFg9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD11bnN1cHBvcnRlZAorICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPScnCisgICAgICBsaW5rX2FsbF9kZXBsaWJzX0NYWD15ZXMKKworICAgIGlmIHRlc3QgIiRHWFgiID0geWVzIDsgdGhlbgorICAgICAgbHRfaW50X2FwcGxlX2NjX3NpbmdsZV9tb2Q9bm8KKyAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJworICAgICAgaWYgJENDIC1kdW1wc3BlY3MgMj4mMSB8ICRFR1JFUCAnc2luZ2xlX21vZHVsZScgPi9kZXYvbnVsbCA7IHRoZW4KKyAgICAgICBsdF9pbnRfYXBwbGVfY2Nfc2luZ2xlX21vZD15ZXMKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICJYJGx0X2ludF9hcHBsZV9jY19zaW5nbGVfbW9kIiA9IFh5ZXMgOyB0aGVuCisgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1keW5hbWljbGliIC1zaW5nbGVfbW9kdWxlICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmcnCisgICAgICBlbHNlCisgICAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1yIC1rZWVwX3ByaXZhdGVfZXh0ZXJucyAtbm9zdGRsaWIgLW8gJHtsaWJ9LW1hc3Rlci5vICRsaWJvYmpzfiRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAke2xpYn0tbWFzdGVyLm8gJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZycKKyAgICAgICAgZmkKKyAgICAgICAgbW9kdWxlX2NtZHNfQ1hYPSckQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFncycKKyAgICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKKyAgICAgICAgICBpZiB0ZXN0ICJYJGx0X2ludF9hcHBsZV9jY19zaW5nbGVfbW9kIiA9IFh5ZXMgOyB0aGVuCisgICAgICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLWR5bmFtaWNsaWIgLXNpbmdsZV9tb2R1bGUgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1yIC1rZWVwX3ByaXZhdGVfZXh0ZXJucyAtbm9zdGRsaWIgLW8gJHtsaWJ9LW1hc3Rlci5vICRsaWJvYmpzfiRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAke2xpYn0tbWFzdGVyLm8gJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgICAgICAgZmkKKyAgICAgICAgICAgIG1vZHVsZV9leHBzeW1fY21kc19DWFg9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDICRhbGxvd191bmRlZmluZWRfZmxhZyAgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICAgIGVsc2UKKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgIHhsYyopCisgICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKKyAgICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXFta3Nocm9iaiAke3dsfS1zaW5nbGVfbW9kdWxlICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH1gZWNobyAkcnBhdGgvJHNvbmFtZWAgJHZlcnN0cmluZycKKyAgICAgICAgICBtb2R1bGVfY21kc19DWFg9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJworICAgICAgICAgICMgRG9uJ3QgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGxkIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgZmxhZywgaXQgZG9lc24ndCBleGlzdCBpbiBvbGRlciBkYXJ3aW4gbGRzCisgICAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1xbWtzaHJvYmogJHt3bH0tc2luZ2xlX21vZHVsZSAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9JHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgICAgICAgbW9kdWxlX2V4cHN5bV9jbWRzX0NYWD0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgICAgIDs7CisgICAgICAgKikKKyAgICAgICAgIGxkX3NobGlic19DWFg9bm8KKyAgICAgICAgICA7OworICAgICAgZXNhYworICAgICAgZmkKKyAgICAgICAgOzsKKworICBkZ3V4KikKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgZWMrKyopCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJbGRfc2hsaWJzX0NYWD1ubworCTs7CisgICAgICBnaGN4KikKKwkjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCWxkX3NobGlic19DWFg9bm8KKwk7OworICAgICAgKikKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlsZF9zaGxpYnNfQ1hYPW5vCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgZnJlZWJzZFsxMl0qKQorICAgICMgQysrIHNoYXJlZCBsaWJyYXJpZXMgcmVwb3J0ZWQgdG8gYmUgZmFpcmx5IGJyb2tlbiBiZWZvcmUgc3dpdGNoIHRvIEVMRgorICAgIGxkX3NobGlic19DWFg9bm8KKyAgICA7OworICBmcmVlYnNkLWVsZiopCisgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vCisgICAgOzsKKyAgZnJlZWJzZCogfCBrZnJlZWJzZCotZ251IHwgZHJhZ29uZmx5KikKKyAgICAjIEZyZWVCU0QgMyBhbmQgbGF0ZXIgdXNlIEdOVSBDKysgYW5kIEdOVSBsZCB3aXRoIHN0YW5kYXJkIEVMRgorICAgICMgY29udmVudGlvbnMKKyAgICBsZF9zaGxpYnNfQ1hYPXllcworICAgIDs7CisgIGdudSopCisgICAgOzsKKyAgaHB1eDkqKQorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06CisgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tRScKKyAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPXllcworICAgIGhhcmRjb2RlX21pbnVzX0xfQ1hYPXllcyAjIE5vdCBpbiB0aGUgc2VhcmNoIFBBVEgsCisJCQkJIyBidXQgYXMgdGhlIGRlZmF1bHQKKwkJCQkjIGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICBDQyopCisgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgIGxkX3NobGlic19DWFg9bm8KKyAgICAgIDs7CisgICAgYUNDKikKKyAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtYiAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKyAgICAgICMKKyAgICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKyAgICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisgICAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisgICAgICAjIGRlcGVuZGVuY2llcy4KKyAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gKCRDQyAtYiAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSkgfCBncmVwICJbLV1MImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JworICAgICAgOzsKKyAgICAqKQorICAgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBlbHNlCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgaHB1eDEwKnxocHV4MTEqKQorICAgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKworICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIGhwcGEqNjQqfGlhNjQqKQorCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfQ1hYPScrYiAkbGliZGlyJworICAgICAgICA7OworICAgICAgKikKKwlleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS1FJworICAgICAgICA7OworICAgICAgZXNhYworICAgIGZpCisgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICBocHBhKjY0KnxpYTY0KikKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9DWFg9bm8KKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCisgICAgICA7OworICAgICopCisgICAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPXllcworICAgICAgaGFyZGNvZGVfbWludXNfTF9DWFg9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkJCQkJICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQKKwkJCQkJICAgICAgIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgIDs7CisgICAgZXNhYworCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIENDKikKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlsZF9zaGxpYnNfQ1hYPW5vCisJOzsKKyAgICAgIGFDQyopCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KikKKwkgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJaWE2NCopCisJICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJZXNhYworCSMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkjCisJIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSMgZGVwZW5kZW5jaWVzLgorCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gKCRDQyAtYiAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSkgfCBncmVwICJcLUwiYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCisJOzsKKyAgICAgICopCisJaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKwkgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KKwkgICAgY2FzZSAkaG9zdF9jcHUgaW4KKwkgICAgaHBwYSo2NCopCisJICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgIDs7CisJICAgIGlhNjQqKQorCSAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICA7OworCSAgICAqKQorCSAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgIGZpCisJZWxzZQorCSAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICBsZF9zaGxpYnNfQ1hYPW5vCisJZmkKKwk7OworICAgIGVzYWMKKyAgICA7OworICBpbnRlcml4MyopCisgICAgaGFyZGNvZGVfZGlyZWN0X0NYWD1ubworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tRScKKyAgICAjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCisgICAgIyBJbnN0ZWFkLCBzaGFyZWQgbGlicmFyaWVzIGFyZSBsb2FkZWQgYXQgYW4gaW1hZ2UgYmFzZSAoMHgxMDAwMDAwMCBieQorICAgICMgZGVmYXVsdCkgYW5kIHJlbG9jYXRlZCBpZiB0aGV5IGNvbmZsaWN0LCB3aGljaCBpcyBhIHNsb3cgdmVyeSBtZW1vcnkKKyAgICAjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCisgICAgIyAyNTYgS2lCLWFsaWduZWQgaW1hZ2UgYmFzZSBiZXR3ZWVuIDB4NTAwMDAwMDAgYW5kIDB4NkZGQzAwMDAgYXQgbGluaworICAgICMgdGltZS4gIE1vdmluZyB1cCBmcm9tIDB4MTAwMDAwMDAgYWxzbyBhbGxvd3MgbW9yZSBzYnJrKDIpIHNwYWNlLgorICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J3NlZCAicyxeLF8sIiAkZXhwb3J0X3N5bWJvbHMgPiRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1yZXRhaW4tc3ltYm9scy1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisgICAgOzsKKyAgaXJpeDUqIHwgaXJpeDYqKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBDQyopCisJIyBTR0kgQysrCisJYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLWFsbCAtbXVsdGlnb3QgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCisJIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJIyAiQ0MgLWFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgSVJJWCBDKysgY29tcGlsZXIuICBUaGlzIGlzCisJIyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgYXJlIGluY2x1ZGVkCisJIyBpbiB0aGUgYXJjaGl2ZS4KKwlvbGRfYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1hciAtV1IsLXUgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwk7OworICAgICAgKikKKwlpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorCSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJICBlbHNlCisJICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgIC1vICRsaWInCisJICBmaQorCWZpCisJbGlua19hbGxfZGVwbGlic19DWFg9eWVzCisJOzsKKyAgICBlc2FjCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06CisgICAgOzsKKyAgbGludXgqKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBLQ0MqKQorCSMgS3VjayBhbmQgQXNzb2NpYXRlcywgSW5jLiAoS0FJKSBDKysgQ29tcGlsZXIKKworCSMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKKwkjIGVuZHMgd2l0aCAiLnNvIiAob3IgIi5zbCIgZm9yIEhQLVVYKSwgc28gcmVuYW1lIHRoZSBsaWJyYXJ5CisJIyB0byBpdHMgcHJvcGVyIG5hbWUgKHdpdGggdmVyc2lvbikgYWZ0ZXIgbGlua2luZy4KKwlhcmNoaXZlX2NtZHNfQ1hYPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFteKCkwLTlBLVphLXp7fV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICRsaWIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWI7IG12IFwkdGVtcGxpYiAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFteKCkwLTlBLVphLXp7fV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICRsaWIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWIgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHM7IG12IFwkdGVtcGxpYiAkbGliJworCSMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkjCisJIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSMgZGVwZW5kZW5jaWVzLgorCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAtbyBsaWJjb25mdGVzdCRzaGFyZWRfZXh0IDI+JjEgfCBncmVwICJsZCJgOyBybSAtZiBsaWJjb25mdGVzdCRzaGFyZWRfZXh0OyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKKworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS0tcnBhdGgsJGxpYmRpcicKKwlleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisKKwkjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkjICJDQyAtQnN0YXRpYyIsIHdoZXJlICJDQyIgaXMgdGhlIEtBSSBDKysgY29tcGlsZXIuCisJb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAtQnN0YXRpYyAtbyAkb2xkbGliICRvbGRvYmpzJworCTs7CisgICAgICBpY3BjKikKKwkjIEludGVsIEMrKworCXdpdGhfZ251X2xkPXllcworCSMgdmVyc2lvbiA4LjAgYW5kIGFib3ZlIG9mIGljcGMgY2hva2Ugb24gbXVsdGlwbHkgZGVmaW5lZCBzeW1ib2xzCisJIyBpZiB3ZSBhZGQgJHByZWRlcF9vYmplY3RzIGFuZCAkcG9zdGRlcF9vYmplY3RzLCBob3dldmVyIDcuMSBhbmQKKwkjIGVhcmxpZXIgZG8gbm90IGFkZCB0aGUgb2JqZWN0cyB0aGVtc2VsdmVzLgorCWNhc2UgYCRDQyAtViAyPiYxYCBpbgorCSoiVmVyc2lvbiA3LiIqKQorICAJICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgCSAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCSAgOzsKKwkqKSAgIyBWZXJzaW9uIDguMCBvciBuZXdlcgorCSAgdG1wX2lkeW49CisJICBjYXNlICRob3N0X2NwdSBpbgorCSAgICBpYTY0KikgdG1wX2lkeW49JyAtaV9keW5hbWljJzs7CisJICBlc2FjCisgIAkgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkJyIkdG1wX2lkeW4iJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwkgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCciJHRtcF9pZHluIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJICA7OworCWVzYWMKKwlhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8KKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwlleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisJd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPScke3dsfS0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwk7OworICAgICAgcGdDQyopCisgICAgICAgICMgUG9ydGxhbmQgR3JvdXAgQysrIGNvbXBpbGVyCisJYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIC1vICRsaWInCisgIAlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJworCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKwl3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICAgICAgOzsKKyAgICAgIGN4eCopCisJIyBDb21wYXEgQysrCisJYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAgLW8gJGxpYiAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scycKKworCXJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1ycGF0aCAkbGliZGlyJworCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKworCSMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkjCisJIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSMgZGVwZW5kZW5jaWVzLgorCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJsZCJgOyB0ZW1wbGlzdD1gZWNobyAkdGVtcGxpc3QgfCAkU0VEICJzL1woXi4qbGQuKlwpXCggLipsZCAuKiRcKS9cMS8iYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgbHlueG9zKikKKyAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgOzsKKyAgbTg4ayopCisgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgbGRfc2hsaWJzX0NYWD1ubworICAgIDs7CisgIG12cyopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIGN4eCopCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJbGRfc2hsaWJzX0NYWD1ubworCTs7CisgICAgICAqKQorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCWxkX3NobGlic19DWFg9bm8KKwk7OworICAgIGVzYWMKKyAgICA7OworICBuZXRic2QqKQorICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKyAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRMRCAtQnNoYXJlYWJsZSAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkbGlua2VyX2ZsYWdzJworICAgICAgd2xhcmM9CisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfZGlyZWN0X0NYWD15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCisgICAgZmkKKyAgICAjIFdvcmthcm91bmQgc29tZSBicm9rZW4gcHJlLTEuNSB0b29sY2hhaW5zCisgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCBjb25mdGVzdC4kb2JqZXh0IHwgJFNFRCAtZSAiczotbGdjYyAtbGMgLWxnY2M6OiInCisgICAgOzsKKyAgb3BlbmJzZDIqKQorICAgICMgQysrIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGZhaXJseSBicm9rZW4KKyAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgOzsKKyAgb3BlbmJzZCopCisgICAgaGFyZGNvZGVfZGlyZWN0X0NYWD15ZXMKKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubworICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJGxpYicKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKyAgICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS1FJworICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJworICAgIGZpCisgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCisgICAgOzsKKyAgb3NmMyopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIEtDQyopCisJIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgorCisJIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQorCSMgZW5kcyB3aXRoICIuc28iIChvciAiLnNsIiBmb3IgSFAtVVgpLCBzbyByZW5hbWUgdGhlIGxpYnJhcnkKKwkjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgorCWFyY2hpdmVfY21kc19DWFg9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW14oKTAtOUEtWmEtent9XVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCisKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06CisKKwkjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkjICJDQyAtQnN0YXRpYyIsIHdoZXJlICJDQyIgaXMgdGhlIEtBSSBDKysgY29tcGlsZXIuCisJb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAtQnN0YXRpYyAtbyAkb2xkbGliICRvbGRvYmpzJworCisJOzsKKyAgICAgIFJDQyopCisJIyBSYXRpb25hbCBDKysgMi40LjEKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlsZF9zaGxpYnNfQ1hYPW5vCisJOzsKKyAgICAgIGN4eCopCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKworCSMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkjCisJIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSMgZGVwZW5kZW5jaWVzLgorCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJsZCIgfCBncmVwIC12ICJsZDoiYDsgdGVtcGxpc3Q9YGVjaG8gJHRlbXBsaXN0IHwgJFNFRCAicy9cKF4uKmxkLipcKVwoIC4qbGQuKiRcKS9cMS8iYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCisJOzsKKyAgICAgICopCisJaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKworCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKworCSAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgIlwtTCInCisKKwllbHNlCisJICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgIGxkX3NobGlic19DWFg9bm8KKwlmaQorCTs7CisgICAgZXNhYworICAgIDs7CisgIG9zZjQqIHwgb3NmNSopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIEtDQyopCisJIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgorCisJIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQorCSMgZW5kcyB3aXRoICIuc28iIChvciAiLnNsIiBmb3IgSFAtVVgpLCBzbyByZW5hbWUgdGhlIGxpYnJhcnkKKwkjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgorCWFyY2hpdmVfY21kc19DWFg9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW14oKTAtOUEtWmEtent9XVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCisKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06CisKKwkjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkjIHRoZSBLQUkgQysrIGNvbXBpbGVyLgorCW9sZF9hcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwk7OworICAgICAgUkNDKikKKwkjIFJhdGlvbmFsIEMrKyAyLjQuMQorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCWxkX3NobGlic19DWFg9bm8KKwk7OworICAgICAgY3h4KikKKwlhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICIlcyAlc1xcbiIgLWV4cG9ydGVkX3N5bWJvbCAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZX4KKwkgIGVjaG8gIi1oaWRkZW4iPj4gJGxpYi5leHB+CisJICAkQ0MgLXNoYXJlZCRhbGxvd191bmRlZmluZWRfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIC1XbCwtaW5wdXQgLVdsLCRsaWIuZXhwICBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24JJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGlifgorCSAgJHJtICRsaWIuZXhwJworCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1ycGF0aCAkbGliZGlyJworCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKworCSMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkjCisJIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSMgZGVwZW5kZW5jaWVzLgorCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJsZCIgfCBncmVwIC12ICJsZDoiYDsgdGVtcGxpc3Q9YGVjaG8gJHRlbXBsaXN0IHwgJFNFRCAicy9cKF4uKmxkLipcKVwoIC4qbGQuKiRcKS9cMS8iYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCisJOzsKKyAgICAgICopCisJaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCSBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LW1zeW0gJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisKKwkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisJICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06CisKKwkgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJcLUwiJworCisJZWxzZQorCSAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICBsZF9zaGxpYnNfQ1hYPW5vCisJZmkKKwk7OworICAgIGVzYWMKKyAgICA7OworICBwc29zKikKKyAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgOzsKKyAgc3Vub3M0KikKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgQ0MqKQorCSMgU3VuIEMrKyA0LngKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlsZF9zaGxpYnNfQ1hYPW5vCisJOzsKKyAgICAgIGxjYyopCisJIyBMdWNpZAorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCWxkX3NobGlic19DWFg9bm8KKwk7OworICAgICAgKikKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlsZF9zaGxpYnNfQ1hYPW5vCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgc29sYXJpcyopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIENDKikKKwkjIFN1biBDKysgNC4yLCA1LnggYW5kIENlbnRlcmxpbmUgQysrCisgICAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD15ZXMKKwlub191bmRlZmluZWRfZmxhZ19DWFg9JyAtemRlZnMnCisJYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gIC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gICR7d2x9LU0gJHt3bH0kbGliLmV4cCAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JHJtICRsaWIuZXhwJworCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1SJGxpYmRpcicKKwloYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubworCWNhc2UgJGhvc3Rfb3MgaW4KKwkgIHNvbGFyaXMyLlswLTVdIHwgc29sYXJpczIuWzAtNV0uKikgOzsKKwkgICopCisJICAgICMgVGhlIEMrKyBjb21waWxlciBpcyB1c2VkIGFzIGxpbmtlciBzbyB3ZSBtdXN0IHVzZSAkd2wKKwkgICAgIyBmbGFnIHRvIHBhc3MgdGhlIGNvbW1hbmRzIHRvIHRoZSB1bmRlcmx5aW5nIHN5c3RlbQorCSAgICAjIGxpbmtlci4gV2UgbXVzdCBhbHNvIHBhc3MgZWFjaCBjb252aWVuY2UgbGlicmFyeSB0aHJvdWdoCisJICAgICMgdG8gdGhlIHN5c3RlbSBsaW5rZXIgYmV0d2VlbiBhbGxleHRyYWN0L2RlZmF1bHRleHRyYWN0LgorCSAgICAjIFRoZSBDKysgY29tcGlsZXIgd2lsbCBjb21iaW5lIGxpbmtlciBvcHRpb25zIHNvIHdlCisJICAgICMgY2Fubm90IGp1c3QgcGFzcyB0aGUgY29udmllbmNlIGxpYnJhcnkgbmFtZXMgdGhyb3VnaAorCSAgICAjIHdpdGhvdXQgJHdsLgorCSAgICAjIFN1cHBvcnRlZCBzaW5jZSBTb2xhcmlzIDIuNiAobWF5YmUgMi41LjE/KQorCSAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXogJHt3bH1hbGxleHRyYWN0YGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LXogJHt3bH1kZWZhdWx0ZXh0cmFjdCcKKwkgICAgOzsKKwllc2FjCisJbGlua19hbGxfZGVwbGlic19DWFg9eWVzCisKKwlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKKworCSMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSMgIkNDIC14YXIiLCB3aGVyZSAiQ0MiIGlzIHRoZSBTdW4gQysrIGNvbXBpbGVyLiAgVGhpcyBpcworCSMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSBpbnN0YW50aWF0ZWQgdGVtcGxhdGVzIGFyZSBpbmNsdWRlZAorCSMgaW4gdGhlIGFyY2hpdmUuCisJb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAteGFyIC1vICRvbGRsaWIgJG9sZG9ianMnCisJOzsKKyAgICAgIGdjeCopCisJIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCisKKwkjIFRoZSBDKysgY29tcGlsZXIgbXVzdCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgYXJjaGl2ZS4KKwlvbGRfYXJjaGl2ZV9jbWRzX0NYWD0nJENDICRMREZMQUdTIC1hcmNoaXZlIC1vICRvbGRsaWIgJG9sZG9ianMnCisJOzsKKyAgICAgICopCisJIyBHTlUgQysrIGNvbXBpbGVyIHdpdGggU29sYXJpcyBsaW5rZXIKKwlpZiB0ZXN0ICIkR1hYIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwkgIG5vX3VuZGVmaW5lZF9mbGFnX0NYWD0nICR7d2x9LXogJHt3bH1kZWZzJworCSAgaWYgJENDIC0tdmVyc2lvbiB8IGdyZXAgLXYgJ14yXC43JyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJExERkxBR1MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJworCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJCSRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAke3dsfS1NICR3bCRsaWIuZXhwIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKKworCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9IiRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCBcIlwtTFwiIgorCSAgZWxzZQorCSAgICAjIGcrKyAyLjcgYXBwZWFycyB0byByZXF1aXJlIGAtRycgTk9UIGAtc2hhcmVkJyBvbiB0aGlzCisJICAgICMgcGxhdGZvcm0uCisJICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtRyAtbm9zdGRsaWIgJExERkxBR1MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJworCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJCSRDQyAtRyAtbm9zdGRsaWIgJHt3bH0tTSAkd2wkbGliLmV4cCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc34kcm0gJGxpYi5leHAnCisKKwkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSIkQ0MgLUcgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwIFwiXC1MXCIiCisJICBmaQorCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tUiAkd2wkbGliZGlyJworCWZpCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgc3lzdjQqdXcyKiB8IHN5c3Y1T3BlblVOSVgqIHwgc3lzdjVVbml4V2FyZTcuWzAxXS5bMTBdKiB8IHVuaXh3YXJlNyogfCBzY28zLjJ2NS4wLlswMjRdKikKKyAgICBub191bmRlZmluZWRfZmxhZ19DWFg9JyR7d2x9LXosdGV4dCcKKyAgICBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8KKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubworICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBDQyopCisJYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwk7OworICAgICAgKikKKwlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwk7OworICAgIGVzYWMKKyAgICA7OworICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqKQorICAgICMgTm90ZTogV2UgY2FuIE5PVCB1c2UgLXogZGVmcyBhcyB3ZSBtaWdodCBkZXNpcmUsIGJlY2F1c2Ugd2UgZG8gbm90CisgICAgIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bworICAgICMgYWx3YXlzIGJlIHVucmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGp1c3QgYWJvdXQgbm8gbGlicmFyeSB3b3VsZAorICAgICMgZXZlciBsaW5rIGNvcnJlY3RseS4gIElmIHdlJ3JlIG5vdCB1c2luZyBHTlUgbGQgd2UgdXNlIC16IHRleHQKKyAgICAjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKKyAgICAjIGFzIC16IGRlZnMuCisgICAgIyBGb3Igc2VjdXJpdHkgcmVhc29ucywgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgeW91IGFsd2F5cworICAgICMgdXNlIGFic29sdXRlIHBhdGhzIGZvciBuYW1pbmcgc2hhcmVkIGxpYnJhcmllcywgYW5kIGV4Y2x1ZGUgdGhlCisgICAgIyBEVF9SVU5QQVRIIHRhZyBmcm9tIGV4ZWN1dGFibGVzIGFuZCBsaWJyYXJpZXMuICBCdXQgZG9pbmcgc28KKyAgICAjIHJlcXVpcmVzIHRoYXQgeW91IGNvbXBpbGUgZXZlcnl0aGluZyB0d2ljZSwgd2hpY2ggaXMgYSBwYWluLgorICAgICMgU28gdGhhdCBiZWhhdmlvdXIgaXMgb25seSBlbmFibGVkIGlmIFNDT0FCU1BBVEggaXMgc2V0IHRvIGEKKyAgICAjIG5vbi1lbXB0eSB2YWx1ZSBpbiB0aGUgZW52aXJvbm1lbnQuICBNb3N0IGxpa2VseSBvbmx5IHVzZWZ1bCBmb3IKKyAgICAjIGNyZWF0aW5nIG9mZmljaWFsIGRpc3RyaWJ1dGlvbnMgb2YgcGFja2FnZXMuCisgICAgIyBUaGlzIGlzIGEgaGFjayB1bnRpbCBsaWJ0b29sIG9mZmljaWFsbHkgc3VwcG9ydHMgYWJzb2x1dGUgcGF0aAorICAgICMgbmFtZXMgZm9yIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPScke3dsfS16LHRleHQnCisgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScke3dsfS16LG5vZGVmcycKKyAgICBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8KKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPSdgdGVzdCAteiAiJFNDT0FCU1BBVEgiICYmIGVjaG8gJHt3bH0tUiwkbGliZGlyYCcKKyAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD0nOicKKyAgICBsaW5rX2FsbF9kZXBsaWJzX0NYWD15ZXMKKyAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS1CZXhwb3J0JworICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBDQyopCisJYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1HICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCTs7CisgICAgICAqKQorCWFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgdGFuZGVtKikKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgTkNDKikKKwkjIE5vblN0b3AtVVggTkNDIDMuMjAKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlsZF9zaGxpYnNfQ1hYPW5vCisJOzsKKyAgICAgICopCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJbGRfc2hsaWJzX0NYWD1ubworCTs7CisgICAgZXNhYworICAgIDs7CisgIHZ4d29ya3MqKQorICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgIGxkX3NobGlic19DWFg9bm8KKyAgICA7OworICAqKQorICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgIGxkX3NobGlic19DWFg9bm8KKyAgICA7OworZXNhYworZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGxkX3NobGlic19DWFgiID4mNQorZWNobyAiJHtFQ0hPX1R9JGxkX3NobGlic19DWFgiID4mNgordGVzdCAiJGxkX3NobGlic19DWFgiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCitHQ0NfQ1hYPSIkR1hYIgorTERfQ1hYPSIkTEQiCisKKyMjIENBVkVBVCBFTVBUT1I6CisjIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQorIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKKyMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgorCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCitjbGFzcyBGb28KK3sKK3B1YmxpYzoKKyAgRm9vICh2b2lkKSB7IGEgPSAwOyB9Citwcml2YXRlOgorICBpbnQgYTsKK307CitFT0YKKworaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCisgICMgUGFyc2UgdGhlIGNvbXBpbGVyIG91dHB1dCBhbmQgZXh0cmFjdCB0aGUgbmVjZXNzYXJ5CisgICMgb2JqZWN0cywgbGlicmFyaWVzIGFuZCBsaWJyYXJ5IGZsYWdzLgorCisgICMgU2VudGluZWwgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgb3Igbm90IHdlIGFyZSBiZWZvcmUKKyAgIyB0aGUgY29uZnRlc3Qgb2JqZWN0IGZpbGUuCisgIHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmU9bm8KKworICAjIFRoZSBgKicgaW4gdGhlIGNhc2UgbWF0Y2hlcyBmb3IgYXJjaGl0ZWN0dXJlcyB0aGF0IHVzZSBgY2FzZScgaW4KKyAgIyAkb3V0cHV0X3ZlcmJvc2VfY21kIGNhbiB0cmlnZ2VyIGdsb2IgZXhwYW5zaW9uIGR1cmluZyB0aGUgbG9vcAorICAjIGV2YWwgd2l0aG91dCB0aGlzIHN1YnN0aXR1dGlvbi4KKyAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9YCRlY2hvICJYJG91dHB1dF92ZXJib3NlX2xpbmtfY21kIiB8ICRYc2VkIC1lICIkbm9fZ2xvYl9zdWJzdCJgCisKKyAgZm9yIHAgaW4gYGV2YWwgJG91dHB1dF92ZXJib3NlX2xpbmtfY21kYDsgZG8KKyAgICBjYXNlICRwIGluCisKKyAgICAtTCogfCAtUiogfCAtbCopCisgICAgICAgIyBTb21lIGNvbXBpbGVycyBwbGFjZSBzcGFjZSBiZXR3ZWVuICIte0wsUn0iIGFuZCB0aGUgcGF0aC4KKyAgICAgICAjIFJlbW92ZSB0aGUgc3BhY2UuCisgICAgICAgaWYgdGVzdCAkcCA9ICItTCIgXAorCSAgfHwgdGVzdCAkcCA9ICItUiI7IHRoZW4KKwkgcHJldj0kcAorCSBjb250aW51ZQorICAgICAgIGVsc2UKKwkgcHJldj0KKyAgICAgICBmaQorCisgICAgICAgaWYgdGVzdCAiJHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmUiID0gbm87IHRoZW4KKwkgY2FzZSAkcCBpbgorCSAtTCogfCAtUiopCisJICAgIyBJbnRlcm5hbCBjb21waWxlciBsaWJyYXJ5IHBhdGhzIHNob3VsZCBjb21lIGFmdGVyIHRob3NlCisJICAgIyBwcm92aWRlZCB0aGUgdXNlci4gIFRoZSBwb3N0ZGVwcyBhbHJlYWR5IGNvbWUgYWZ0ZXIgdGhlCisJICAgIyB1c2VyIHN1cHBsaWVkIGxpYnMgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBwcm9jZXNzIHRoZW0uCisJICAgaWYgdGVzdCAteiAiJGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9DWFgiOyB0aGVuCisJICAgICBjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYPSIke3ByZXZ9JHtwfSIKKwkgICBlbHNlCisJICAgICBjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYPSIke2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9DWFh9ICR7cHJldn0ke3B9IgorCSAgIGZpCisJICAgOzsKKwkgIyBUaGUgIi1sIiBjYXNlIHdvdWxkIG5ldmVyIGNvbWUgYmVmb3JlIHRoZSBvYmplY3QgYmVpbmcKKwkgIyBsaW5rZWQsIHNvIGRvbid0IGJvdGhlciBoYW5kbGluZyB0aGlzIGNhc2UuCisJIGVzYWMKKyAgICAgICBlbHNlCisJIGlmIHRlc3QgLXogIiRwb3N0ZGVwc19DWFgiOyB0aGVuCisJICAgcG9zdGRlcHNfQ1hYPSIke3ByZXZ9JHtwfSIKKwkgZWxzZQorCSAgIHBvc3RkZXBzX0NYWD0iJHtwb3N0ZGVwc19DWFh9ICR7cHJldn0ke3B9IgorCSBmaQorICAgICAgIGZpCisgICAgICAgOzsKKworICAgICouJG9iamV4dCkKKyAgICAgICAjIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSB0ZXN0IG9iamVjdCBmaWxlIG9ubHkgc2hvd3MgdXAKKyAgICAgICAjIG9uY2UgaW4gdGhlIGNvbXBpbGVyIG91dHB1dC4KKyAgICAgICBpZiB0ZXN0ICIkcCIgPSAiY29uZnRlc3QuJG9iamV4dCI7IHRoZW4KKwkgcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZT15ZXMKKwkgY29udGludWUKKyAgICAgICBmaQorCisgICAgICAgaWYgdGVzdCAiJHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmUiID0gbm87IHRoZW4KKwkgaWYgdGVzdCAteiAiJHByZWRlcF9vYmplY3RzX0NYWCI7IHRoZW4KKwkgICBwcmVkZXBfb2JqZWN0c19DWFg9IiRwIgorCSBlbHNlCisJICAgcHJlZGVwX29iamVjdHNfQ1hYPSIkcHJlZGVwX29iamVjdHNfQ1hYICRwIgorCSBmaQorICAgICAgIGVsc2UKKwkgaWYgdGVzdCAteiAiJHBvc3RkZXBfb2JqZWN0c19DWFgiOyB0aGVuCisJICAgcG9zdGRlcF9vYmplY3RzX0NYWD0iJHAiCisJIGVsc2UKKwkgICBwb3N0ZGVwX29iamVjdHNfQ1hYPSIkcG9zdGRlcF9vYmplY3RzX0NYWCAkcCIKKwkgZmkKKyAgICAgICBmaQorICAgICAgIDs7CisKKyAgICAqKSA7OyAjIElnbm9yZSB0aGUgcmVzdC4KKworICAgIGVzYWMKKyAgZG9uZQorCisgICMgQ2xlYW4gdXAuCisgIHJtIC1mIGEub3V0IGEuZXhlCitlbHNlCisgIGVjaG8gImxpYnRvb2wubTQ6IGVycm9yOiBwcm9ibGVtIGNvbXBpbGluZyBDWFggdGVzdCBwcm9ncmFtIgorZmkKKworJHJtIC1mIGNvbmZlc3QuJG9iamV4dAorCisjIFBPUlRNRTogb3ZlcnJpZGUgYWJvdmUgdGVzdCBvbiBzeXN0ZW1zIHdoZXJlIGl0IGlzIGJyb2tlbgorY2FzZSAkaG9zdF9vcyBpbgoraW50ZXJpeDMqKQorICAjIEludGVyaXggMy41IGluc3RhbGxzIGNvbXBsZXRlbHkgaG9zZWQgLmxhIGZpbGVzIGZvciBDKyssIHNvIHJhdGhlciB0aGFuCisgICMgaGFjayBhbGwgYXJvdW5kIGl0LCBsZXQncyBqdXN0IHRydXN0ICJnKysiIHRvIERUUlQuCisgIHByZWRlcF9vYmplY3RzX0NYWD0KKyAgcG9zdGRlcF9vYmplY3RzX0NYWD0KKyAgcG9zdGRlcHNfQ1hYPQorICA7OworCitzb2xhcmlzKikKKyAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgQ0MqKQorICAgICMgQWRkaW5nIHRoaXMgcmVxdWlyZXMgYSBrbm93bi1nb29kIHNldHVwIG9mIHNoYXJlZCBsaWJyYXJpZXMgZm9yCisgICAgIyBTdW4gY29tcGlsZXIgdmVyc2lvbnMgYmVmb3JlIDUuNiwgZWxzZSBQSUMgb2JqZWN0cyBmcm9tIGFuIG9sZAorICAgICMgYXJjaGl2ZSB3aWxsIGJlIGxpbmtlZCBpbnRvIHRoZSBvdXRwdXQsIGxlYWRpbmcgdG8gc3VidGxlIGJ1Z3MuCisgICAgcG9zdGRlcHNfQ1hYPSctbENzdGQgLWxDcnVuJworICAgIDs7CisgIGVzYWMKKyAgOzsKK2VzYWMKKworCitjYXNlICIgJHBvc3RkZXBzX0NYWCAiIGluCisqIiAtbGMgIiopIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubyA7OworZXNhYworCitsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0KK2x0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0KK2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0KKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMuLi4gJEVDSE9fQyIgPiY2CisKKyAgIyBDKysgc3BlY2lmaWMgY2FzZXMgZm9yIHBpYywgc3RhdGljLCB3bCwgZXRjLgorICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJworICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLXN0YXRpYycKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgqKQorICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKyAgICBhbWlnYW9zKikKKyAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAorICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JworICAgICAgOzsKKyAgICBiZW9zKiB8IGN5Z3dpbiogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgICA7OworICAgIG1pbmd3KiB8IG9zMiogfCBwdzMyKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1ERExMX0VYUE9SVCcKKyAgICAgIDs7CisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZuby1jb21tb24nCisgICAgICA7OworICAgICpkamdwcCopCisgICAgICAjIERKR1BQIGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcyBhdCBhbGwKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0KKyAgICAgIDs7CisgICAgaW50ZXJpeDMqKQorICAgICAgIyBJbnRlcml4IDMueCBnY2MgLWZwaWMvLWZQSUMgb3B0aW9ucyBnZW5lcmF0ZSBicm9rZW4gY29kZS4KKyAgICAgICMgSW5zdGVhZCwgd2UgcmVsb2NhdGUgc2hhcmVkIGxpYnJhcmllcyBhdCBydW50aW1lLgorICAgICAgOzsKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPS1LY29uZm9ybV9waWMKKyAgICAgIGZpCisgICAgICA7OworICAgIGhwdXgqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwgYnV0CisgICAgICAjIG5vdCBmb3IgUEEgSFAtVVguCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCp8aWE2NCopCisJOzsKKyAgICAgICopCisJbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctZlBJQycKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKyAgICAqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctZlBJQycKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4NCogfCBhaXg1KikKKwkjIEFsbCBBSVggY29kZSBpcyBQSUMuCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkgICMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1Cc3RhdGljJworCWVsc2UKKwkgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJworCWZpCisJOzsKKyAgICAgIGNob3J1cyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwljeGNoNjgqKQorCSAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICMgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgQ1hYKT0iLS1ub19hdXRvX2luc3RhbnRpYXRpb24gLXUgX19tYWluIC11IF9fcHJlbWFpbiAtdSBfYWJvcnQgLXIgJENPT0xfRElSL2xpYi9saWJPcmIuYSAkTVZNRV9ESVIvbGliL0NDL2xpYkMuYSAkTVZNRV9ESVIvbGliL2NsYXNzaXgvbGliY3gucy5hIgorCSAgOzsKKwllc2FjCisJOzsKKyAgICAgICBkYXJ3aW4qKQorICAgICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcworICAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICAgeGxjKikKKyAgICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctcW5vY29tbW9uJworICAgICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKKyAgICAgICAgICAgOzsKKyAgICAgICAgIGVzYWMKKyAgICAgICA7OworICAgICAgZGd1eCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIGVjKysqKQorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1LUElDJworCSAgICA7OworCSAgZ2hjeCopCisJICAgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLXBpYycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBmcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUgfCBkcmFnb25mbHkqKQorCSMgRnJlZUJTRCB1c2VzIEdOVSBDKysKKwk7OworICAgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisJICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgorCSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nK1onCisJICAgIGZpCisJICAgIDs7CisJICBhQ0MqKQorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPScke3dsfS1hICR7d2x9YXJjaGl2ZScKKwkgICAgY2FzZSAkaG9zdF9jcHUgaW4KKwkgICAgaHBwYSo2NCp8aWE2NCopCisJICAgICAgIyArWiB0aGUgZGVmYXVsdAorCSAgICAgIDs7CisJICAgICopCisJICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPScrWicKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgaW50ZXJpeCopCisJIyBUaGlzIGlzIGM4OSwgd2hpY2ggaXMgTVMgVmlzdWFsIEMrKyAobm8gc2hhcmVkIGxpYnMpCisJIyBBbnlvbmUgd2FudHMgdG8gZG8gYSBwb3J0PworCTs7CisgICAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1ub25fc2hhcmVkJworCSAgICAjIENDIHBpYyBmbGFnIC1LUElDIGlzIHRoZSBkZWZhdWx0LgorCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGxpbnV4KikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgS0NDKikKKwkgICAgIyBLQUkgQysrIENvbXBpbGVyCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctLWJhY2tlbmQgLVdsLCcKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctZlBJQycKKwkgICAgOzsKKwkgIGljcGMqIHwgZWNwYyopCisJICAgICMgSW50ZWwgQysrCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1LUElDJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1zdGF0aWMnCisJICAgIDs7CisJICBwZ0NDKikKKwkgICAgIyBQb3J0bGFuZCBHcm91cCBDKysgY29tcGlsZXIuCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1mcGljJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1Cc3RhdGljJworCSAgICA7OworCSAgY3h4KikKKwkgICAgIyBDb21wYXEgQysrCisJICAgICMgTWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBpcyBlbXB0eS4gIEl0IGFwcGVhcnMgdGhhdCBhbGwgQWxwaGEKKwkgICAgIyBMaW51eCBhbmQgQ29tcGFxIFRydTY0IFVuaXggb2JqZWN0cyBhcmUgUElDLgorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9CisJICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLW5vbl9zaGFyZWQnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgbHlueG9zKikKKwk7OworICAgICAgbTg4ayopCisJOzsKKyAgICAgIG12cyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIGN4eCopCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLVcgYyxleHBvcnRhbGwnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgbmV0YnNkKikKKwk7OworICAgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBLQ0MqKQorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLS1iYWNrZW5kIC1XbCwnCisJICAgIDs7CisJICBSQ0MqKQorCSAgICAjIFJhdGlvbmFsIEMrKyAyLjQuMQorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1waWMnCisJICAgIDs7CisJICBjeHgqKQorCSAgICAjIERpZ2l0YWwvQ29tcGFxIEMrKworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKKwkgICAgIyBNYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGlzIGVtcHR5LiAgSXQgYXBwZWFycyB0aGF0IGFsbCBBbHBoYQorCSAgICAjIExpbnV4IGFuZCBDb21wYXEgVHJ1NjQgVW5peCBvYmplY3RzIGFyZSBQSUMuCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0KKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctbm9uX3NoYXJlZCcKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBwc29zKikKKwk7OworICAgICAgc29sYXJpcyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgIyBTdW4gQysrIDQuMiwgNS54IGFuZCBDZW50ZXJsaW5lIEMrKworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1LUElDJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1Cc3RhdGljJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVFvcHRpb24gbGQgJworCSAgICA7OworCSAgZ2N4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctUElDJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHN1bm9zNCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgIyBTdW4gQysrIDQueAorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1waWMnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCisJICAgIDs7CisJICBsY2MqKQorCSAgICAjIEx1Y2lkCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLXBpYycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICB0YW5kZW0qKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBOQ0MqKQorCSAgICAjIE5vblN0b3AtVVggTkNDIDMuMjAKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctS1BJQycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1LUElDJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1Cc3RhdGljJworCSAgICA7OworCWVzYWMKKwk7OworICAgICAgdnh3b3JrcyopCisJOzsKKyAgICAgICopCisJbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0NYWD1ubworCTs7CisgICAgZXNhYworICBmaQorCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFgiID4mNgorCisjCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgYWN0dWFsbHkgd29ya3MuCisjCitpZiB0ZXN0IC1uICIkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIjsgdGhlbgorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFggd29ya3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCB3b3Jrcy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfQ1hYK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0NYWD1ubworICBhY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBsdF9jb21waWxlcl9mbGFnPSIkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIC1EUElDIgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgIyBUaGUgb3B0aW9uIGlzIHJlZmVyZW5jZWQgdmlhIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW5nIHNlZC4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZToxMTUyNDogJGx0X2NvbXBpbGVcIiIgPiY1KQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgIGVjaG8gIiRhc19tZToxMTUyODogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zICIkYWNfb3V0ZmlsZSI7IHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzIG90aGVyIHRoYW4gdGhlIHVzdWFsIG91dHB1dC4KKyAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyMiB8fCBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0NYWD15ZXMKKyAgICAgZmkKKyAgIGZpCisgICAkcm0gY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfQ1hYIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFgiID4mNgorCitpZiB0ZXN0IHgiJGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0NYWCIgPSB4eWVzOyB0aGVuCisgICAgY2FzZSAkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIGluCisgICAgICIiIHwgIiAiKikgOzsKKyAgICAgKikgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSIgJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCIgOzsKKyAgICAgZXNhYworZWxzZQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0KKyAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0NYWD1ubworZmkKKworZmkKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgIyBGb3IgcGxhdGZvcm1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IFBJQywgLURQSUMgaXMgbWVhbmluZ2xlc3M6CisgICpkamdwcCopCisgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPQorICAgIDs7CisgICopCisgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSIkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIC1EUElDIgorICAgIDs7Citlc2FjCisKKyMKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBzdGF0aWMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KKyMKK3dsPSRsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWCBldmFsIGx0X3RtcF9zdGF0aWNfZmxhZz1cIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFhcIgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3MuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0NYWCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19DWFg9bm8KKyAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCisgICBMREZMQUdTPSIkTERGTEFHUyAkbHRfdG1wX3N0YXRpY19mbGFnIgorICAgcHJpbnRmICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KKyAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKyAgICAgICAkZWNobyAiWCRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBjb25mdGVzdC5leHAKKyAgICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgICBpZiBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYPXllcworICAgICAgIGZpCisgICAgIGVsc2UKKyAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19DWFg9eWVzCisgICAgIGZpCisgICBmaQorICAgJHJtIGNvbmZ0ZXN0KgorICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19DWFgiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0NYWCIgPiY2CisKK2lmIHRlc3QgeCIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYIiA9IHh5ZXM7IHRoZW4KKyAgICA6CitlbHNlCisgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPQorZmkKKworCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFg9bm8KKyAgICRybSAtciBjb25mdGVzdCAyPi9kZXYvbnVsbAorICAgbWtkaXIgY29uZnRlc3QKKyAgIGNkIGNvbmZ0ZXN0CisgICBta2RpciBvdXQKKyAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZToxMTYyODogJGx0X2NvbXBpbGVcIiIgPiY1KQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPm91dC9jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBvdXQvY29uZnRlc3QuZXJyID4mNQorICAgZWNobyAiJGFzX21lOjExNjMyOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0CisgICB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICAkZWNobyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+IG91dC9jb25mdGVzdC5leHAKKyAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIG91dC9jb25mdGVzdC5lcnIgPm91dC9jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIG91dC9jb25mdGVzdC5lcjIgfHwgZGlmZiBvdXQvY29uZnRlc3QuZXhwIG91dC9jb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWD15ZXMKKyAgICAgZmkKKyAgIGZpCisgICBjaG1vZCB1K3cgLiAyPiY1CisgICAkcm0gY29uZnRlc3QqCisgICAjIFNHSSBDKysgY29tcGlsZXIgd2lsbCBjcmVhdGUgZGlyZWN0b3J5IG91dC9paV9maWxlcy8gZm9yCisgICAjIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KKyAgIHRlc3QgLWQgb3V0L2lpX2ZpbGVzICYmICRybSBvdXQvaWlfZmlsZXMvKiAmJiBybWRpciBvdXQvaWlfZmlsZXMKKyAgICRybSBvdXQvKiAmJiBybWRpciBvdXQKKyAgIGNkIC4uCisgICBybWRpciBjb25mdGVzdAorICAgJHJtIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYIiA+JjYKKworCitoYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCitpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYIiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgorICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcy4uLiAkRUNIT19DIiA+JjYKKyAgaGFyZF9saW5rcz15ZXMKKyAgJHJtIGNvbmZ0ZXN0KgorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICB0b3VjaCBjb25mdGVzdC5hCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGhhcmRfbGlua3MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGhhcmRfbGlua3MiID4mNgorICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjI7fQorICAgIG5lZWRfbG9ja3M9d2FybgorICBmaQorZWxzZQorICBuZWVkX2xvY2tzPW5vCitmaQorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICRFQ0hPX0MiID4mNgorCisgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4NCogfCBhaXg1KikKKyAgICAjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB3ZSBkb24ndCB3YW50IHRoZSAiLUMiIG9wdGlvbi4KKyAgICAjIC1DIG1lYW5zIGRlbWFuZ2xlIHRvIEFJWCBubSwgYnV0IG1lYW5zIGRvbid0IGRlbWFuZ2xlIHdpdGggR05VIG5tCisgICAgaWYgJE5NIC1WIDI+JjEgfCBncmVwICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0nJE5NIC1CcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkMiA9PSAiVCIpIHx8IChcJDIgPT0gIkQiKSB8fCAoXCQyID09ICJCIikpICYmIChzdWJzdHIoXCQzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisgICAgZWxzZQorICAgICAgZXhwb3J0X3N5bWJvbHNfY21kc19DWFg9JyROTSAtQkNwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQyID09ICJUIikgfHwgKFwkMiA9PSAiRCIpIHx8IChcJDIgPT0gIkIiKSkgJiYgKHN1YnN0cihcJDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKyAgICBmaQorICAgIDs7CisgIHB3MzIqKQorICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYPSIkbHRkbGxfY21kcyIKKyAgOzsKKyAgY3lnd2luKiB8IG1pbmd3KikKKyAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltCQ0RHUlNdIC9zLy4qIFwoW14gXSpcKS9cMSBEQVRBLzsvXi4qIF9fbm1fXy9zL14uKiBfX25tX19cKFteIF0qXCkgW14gXSovXDEgREFUQS87L15JIC9kOy9eW0FJVFddIC9zLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICA7OworICAqKQorICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgIDs7CisgIGVzYWMKKworZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGxkX3NobGlic19DWFgiID4mNQorZWNobyAiJHtFQ0hPX1R9JGxkX3NobGlic19DWFgiID4mNgordGVzdCAiJGxkX3NobGlic19DWFgiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCisjCisjIERvIHdlIG5lZWQgdG8gZXhwbGljaXRseSBsaW5rIGxpYmM/CisjCitjYXNlICJ4JGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWCIgaW4KK3h8eHllcykKKyAgIyBBc3N1bWUgLWxjIHNob3VsZCBiZSBhZGRlZAorICBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9eWVzCisKKyAgaWYgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgY2FzZSAkYXJjaGl2ZV9jbWRzX0NYWCBpbgorICAgIConficqKQorICAgICAgIyBGSVhNRTogd2UgbWF5IGhhdmUgdG8gZGVhbCB3aXRoIG11bHRpLWNvbW1hbmQgc2VxdWVuY2VzLgorICAgICAgOzsKKyAgICAnJENDICcqKQorICAgICAgIyBUZXN0IHdoZXRoZXIgdGhlIGNvbXBpbGVyIGltcGxpY2l0bHkgbGlua3Mgd2l0aCAtbGMgc2luY2Ugb24gc29tZQorICAgICAgIyBzeXN0ZW1zLCAtbGdjYyBoYXMgdG8gY29tZSBiZWZvcmUgLWxjLiBJZiBnY2MgYWxyZWFkeSBwYXNzZXMgLWxjCisgICAgICAjIHRvIGxkLCBkb24ndCBhZGQgLWxjIGJlZm9yZSAtbGdjYy4KKyAgICAgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4iID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4uLi4gJEVDSE9fQyIgPiY2CisgICAgICAkcm0gY29uZnRlc3QqCisgICAgICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorCisgICAgICBpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gMj5jb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICAgc29uYW1lPWNvbmZ0ZXN0CisgICAgICAgIGxpYj1jb25mdGVzdAorICAgICAgICBsaWJvYmpzPWNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgICAgICAgZGVwbGlicz0KKyAgICAgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYCisJcGljX2ZsYWc9JGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWAorICAgICAgICBjb21waWxlcl9mbGFncz0tdgorICAgICAgICBsaW5rZXJfZmxhZ3M9LXYKKyAgICAgICAgdmVyc3RyaW5nPQorICAgICAgICBvdXRwdXRfb2JqZGlyPS4KKyAgICAgICAgbGlibmFtZT1jb25mdGVzdAorICAgICAgICBsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnPSRhbGxvd191bmRlZmluZWRfZmxhZ19DWFgKKyAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPQorICAgICAgICBpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhcmNoaXZlX2NtZHNfQ1hYIDJcPlwmMSBcfCBncmVwIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjFcIiIpID4mNQorICAoZXZhbCAkYXJjaGl2ZV9jbWRzX0NYWCAyXD5cJjEgXHwgZ3JlcCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9CisgICAgICAgIHRoZW4KKwkgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubworICAgICAgICBlbHNlCisJICBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9eWVzCisgICAgICAgIGZpCisgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0kbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZworICAgICAgZWxzZQorICAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKyAgICAgIGZpCisgICAgICAkcm0gY29uZnRlc3QqCisgICAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFgiID4mNgorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIDs7Citlc2FjCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MuLi4gJEVDSE9fQyIgPiY2CitsaWJyYXJ5X25hbWVzX3NwZWM9CitsaWJuYW1lX3NwZWM9J2xpYiRuYW1lJworc29uYW1lX3NwZWM9CitzaHJleHRfY21kcz0iLnNvIgorcG9zdGluc3RhbGxfY21kcz0KK3Bvc3R1bmluc3RhbGxfY21kcz0KK2ZpbmlzaF9jbWRzPQorZmluaXNoX2V2YWw9CitzaGxpYnBhdGhfdmFyPQorc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KK3ZlcnNpb25fdHlwZT1ub25lCitkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGdyZXAgIl5saWJyYXJpZXM6IiB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnImAKKyAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7JyA+L2Rldi9udWxsIDsgdGhlbgorICAgICMgaWYgdGhlIHBhdGggY29udGFpbnMgIjsiIHRoZW4gd2UgYXNzdW1lIGl0IHRvIGJlIHRoZSBzZXBhcmF0b3IKKyAgICAjIG90aGVyd2lzZSBkZWZhdWx0IHRvIHRoZSBzdGFuZGFyZCBwYXRoIHNlcGFyYXRvciAoaS5lLiAiOiIpIC0gaXQgaXMKKyAgICAjIGFzc3VtZWQgdGhhdCBubyBwYXJ0IG9mIGEgbm9ybWFsIHBhdGhuYW1lIGNvbnRhaW5zICI7IiBidXQgdGhhdCBzaG91bGQKKyAgICAjIG9rYXkgaW4gdGhlIHJlYWwgd29ybGQgd2hlcmUgIjsiIGluIGRpcnBhdGhzIGlzIGl0c2VsZiBwcm9ibGVtYXRpYy4KKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgIGZpCitlbHNlCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKK2ZpCituZWVkX2xpYl9wcmVmaXg9dW5rbm93bgoraGFyZGNvZGVfaW50b19saWJzPW5vCisKKyMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgorIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCituZWVkX3ZlcnNpb249dW5rbm93bgorCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZS5hJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKworICAjIEFJWCAzIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIDs7CisKK2FpeDQqIHwgYWl4NSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICAjIEFJWCA1IHN1cHBvcnRzIElBNjQKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBlbHNlCisgICAgIyBXaXRoIEdDQyB1cCB0byAyLjk1LngsIGNvbGxlY3QyIHdvdWxkIGNyZWF0ZSBhbiBpbXBvcnQgZmlsZQorICAgICMgZm9yIGRlcGVuZGVuY2UgbGlicmFyaWVzLiAgVGhlIGltcG9ydCBmaWxlIHdvdWxkIHN0YXJ0IHdpdGgKKyAgICAjIHRoZSBsaW5lIGAjISAuJy4gIFRoaXMgd291bGQgY2F1c2UgdGhlIGdlbmVyYXRlZCBsaWJyYXJ5IHRvCisgICAgIyBkZXBlbmQgb24gYC4nLCBhbHdheXMgYW4gaW52YWxpZCBsaWJyYXJ5LiAgVGhpcyB3YXMgZml4ZWQgaW4KKyAgICAjIGRldmVsb3BtZW50IHNuYXBzaG90cyBvZiBHQ0MgcHJpb3IgdG8gMy4wLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDQgfCBhaXg0LlswMV0gfCBhaXg0LlswMV0uKikKKyAgICAgIGlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCisJICAgZWNobyAnIHllcyAnCisJICAgZWNobyAnI2VuZGlmJzsgfSB8ICR7Q0N9IC1FIC0gfCBncmVwIHllcyA+IC9kZXYvbnVsbDsgdGhlbgorCToKKyAgICAgIGVsc2UKKwljYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisgICAgIyBBSVggKG9uIFBvd2VyKikgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gY3VycmVudGx5IHdlIGNhbiBub3QgaGFyZGNvZGUgY29ycmVjdAorICAgICMgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuIGFkZCB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8KKyAgICAjIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbiBiZSB1c2VmdWwgaW4gZnV0dXJlLgorICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorICAgICAgIyBJZiB1c2luZyBydW4gdGltZSBsaW5raW5nIChvbiBBSVggNC4yIG9yIGxhdGVyKSB1c2UgbGliPG5hbWU+LnNvCisgICAgICAjIGluc3RlYWQgb2YgbGliPG5hbWU+LmEgdG8gbGV0IHBlb3BsZSBrbm93IHRoYXQgdGhlc2UgYXJlIG5vdAorICAgICAgIyB0eXBpY2FsIEFJWCBzaGFyZWQgbGlicmFyaWVzLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgZWxzZQorICAgICAgIyBXZSBwcmVzZXJ2ZSAuYSBhcyBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJpZXMgdGhyb3VnaCBBSVg0LjIKKyAgICAgICMgYW5kIGxhdGVyIHdoZW4gd2UgYXJlIG5vdCBkb2luZyBydW4gdGltZSBsaW5raW5nLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5hICRsaWJuYW1lLmEnCisgICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGZpCisgICAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIGZpCisgIDs7CisKK2FtaWdhb3MqKQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJworICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgorICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRybSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKKyAgOzsKKworYmVvcyopCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKKyAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKKyAgOzsKKworYnNkaVs0NV0qKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL1gxMS9saWIgL3Vzci9jb250cmliL2xpYiAvbGliIC91c3IvbG9jYWwvbGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgorICAjIHRoZSBkZWZhdWx0IGxkLnNvLmNvbmYgYWxzbyBjb250YWlucyAvdXNyL2NvbnRyaWIvbGliIGFuZAorICAjIC91c3IvWDExUjYvbGliICgvdXNyL1gxMSBpcyBhIGxpbmsgdG8gL3Vzci9YMTFSNiksIGJ1dCBsZXQgdXMgYWxsb3cKKyAgIyBsaWJ0b29sIHRvIGhhcmQtY29kZSB0aGVzZSBpbnRvIHByb2dyYW1zCisgIDs7CisKK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgdmVyc2lvbl90eXBlPXdpbmRvd3MKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfdmVyc2lvbj1ubworICBuZWVkX2xpYl9wcmVmaXg9bm8KKworICBjYXNlICRHQ0MsJGhvc3Rfb3MgaW4KKyAgeWVzLGN5Z3dpbiogfCB5ZXMsbWluZ3cqIHwgeWVzLHB3MzIqKQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsLmEnCisgICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcworICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgorICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7ZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgorICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+CisgICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWV+CisgICAgICBjaG1vZCBhK3ggXCRkbGRpci8kZGxuYW1lJworICAgIHBvc3R1bmluc3RhbGxfY21kcz0nZGxkbGw9YCRTSEVMTCAyPiYxIC1jICdcJycuICRmaWxlOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbHBhdGg9JGRpci9cJGRsZGxsfgorICAgICAgICRybSBcJGRscGF0aCcKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgY3lnd2luKikKKyAgICAgICMgQ3lnd2luIERMTHMgdXNlICdjeWcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJworICAgICAgc29uYW1lX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9jeWcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiAvbGliL3czMmFwaSAvbGliIC91c3IvbG9jYWwvbGliIgorICAgICAgOzsKKyAgICBtaW5ndyopCisgICAgICAjIE1pbkdXIERMTHMgdXNlIHRyYWRpdGlvbmFsICdsaWInIHByZWZpeAorICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAorICAgICAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7W2MtekMtWl06LycgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAjIEl0IGlzIG1vc3QgcHJvYmFibHkgYSBXaW5kb3dzIGZvcm1hdCBQQVRIIHByaW50ZWQgYnkKKyAgICAgICAgIyBtaW5ndyBnY2MsIGJ1dCB3ZSBhcmUgcnVubmluZyBvbiBDeWd3aW4uIEdjYyBwcmludHMgaXRzIHNlYXJjaAorICAgICAgICAjIHBhdGggd2l0aCA7IHNlcGFyYXRvcnMsIGFuZCB3aXRoIGRyaXZlIGxldHRlcnMuIFdlIGNhbiBoYW5kbGUgdGhlCisgICAgICAgICMgZHJpdmUgbGV0dGVycyAoY3lnd2luIGZpbGV1dGlscyB1bmRlcnN0YW5kcyB0aGVtKSwgc28gbGVhdmUgdGhlbSwKKyAgICAgICAgIyBlc3BlY2lhbGx5IGFzIHdlIG1pZ2h0IHBhc3MgZmlsZXMgZm91bmQgdGhlcmUgdG8gYSBtaW5ndyBvYmpkdW1wLAorICAgICAgICAjIHdoaWNoIHdvdWxkbid0IHVuZGVyc3RhbmQgYSBjeWd3aW5pZmllZCBwYXRoLiBBaGguCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKKyAgICAgIGVsc2UKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgICAgZmkKKyAgICAgIDs7CisgICAgcHczMiopCisgICAgICAjIHB3MzIgRExMcyB1c2UgJ3B3JyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL3B3LydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisKKyAgKikKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9ICRsaWJuYW1lLmxpYicKKyAgICA7OworICBlc2FjCisgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCisgICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgorICBzaGxpYnBhdGhfdmFyPVBBVEgKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCisgIHZlcnNpb25fdHlwZT1kYXJ3aW4KKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHt2ZXJzdWZmaXh9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0ICR7bGlibmFtZX0kc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCcKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBzaGxpYnBhdGhfdmFyPURZTERfTElCUkFSWV9QQVRICisgIHNocmV4dF9jbWRzPSdgdGVzdCAuJG1vZHVsZSA9IC55ZXMgJiYgZWNobyAuc28gfHwgZWNobyAuZHlsaWJgJworICAjIEFwcGxlJ3MgZ2NjIHByaW50cyAnZ2NjIC1wcmludC1zZWFyY2gtZGlycycgZG9lc24ndCBvcGVyYXRlIHRoZSBzYW1lLgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IHRyICJcbiIgIiRQQVRIX1NFUEFSQVRPUiIgfCBzZWQgLWUgJ3MvbGlicmFyaWVzOi9AbGlicmFyaWVzOi8nIHwgdHIgIkAiICJcbiIgfCBncmVwICJebGlicmFyaWVzOiIgfCBzZWQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnIiAtZSAicywkUEFUSF9TRVBBUkFUT1IsICxnIiAtZSAicywuKiwmIC9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIsZyJgCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWInCisgIGZpCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvbGliIC91c3IvbGliJworICA7OworCitkZ3V4KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitmcmVlYnNkMSopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKK2tmcmVlYnNkKi1nbnUpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCisgIDs7CisKK2ZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgIyBEcmFnb25GbHkgZG9lcyBub3QgaGF2ZSBhb3V0LiAgV2hlbi9pZiB0aGV5IGltcGxlbWVudCBhIG5ldworICAjIHZlcnNpb25pbmcgbWVjaGFuaXNtLCBhZGp1c3QgdGhpcy4KKyAgaWYgdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQ7IHRoZW4KKyAgICBvYmpmb3JtYXQ9YC91c3IvYmluL29iamZvcm1hdGAKKyAgZWxzZQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBmcmVlYnNkWzEyM10qKSBvYmpmb3JtYXQ9YW91dCA7OworICAgICopIG9iamZvcm1hdD1lbGYgOzsKKyAgICBlc2FjCisgIGZpCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKKyAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisgICAgZnJlZWJzZC1lbGYqKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBmcmVlYnNkLSopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICAgIG5lZWRfdmVyc2lvbj15ZXMKKyAgICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBmcmVlYnNkMiopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIDs7CisgIGZyZWVic2QzLlswMV0qIHwgZnJlZWJzZGVsZjMuWzAxXSopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBmcmVlYnNkMy5bMi05XSogfCBmcmVlYnNkZWxmMy5bMi05XSogfCBcCisgIGZyZWVic2Q0LlswLTVdIHwgZnJlZWJzZGVsZjQuWzAtNV0gfCBmcmVlYnNkNC4xLjEgfCBmcmVlYnNkZWxmNC4xLjEpCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgIGZyZWVic2QqKSAjIGZyb20gNC42IG9uCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBlc2FjCisgIDs7CisKK2dudSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0ke21ham9yfSAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKyAgIyBHaXZlIGEgc29uYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ham9yIHZlcnNpb24gc28gdGhhdCBkbGQuc2wgcmVmdXNlcyB0bworICAjIGxpbmsgYWdhaW5zdCBvdGhlciB2ZXJzaW9ucy4KKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgaWE2NCopCisgICAgc2hyZXh0X2NtZHM9Jy5zbycKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbyIKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGlmIHRlc3QgIlgkSFBVWF9JQTY0X01PREUiID0gWDMyOyB0aGVuCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIiCisgICAgZWxzZQorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4NjQgL3Vzci9sb2NhbC9saWIvaHB1eDY0IgorICAgIGZpCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYworICAgIDs7CisgICBocHBhKjY0KikKKyAgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSCAjIEhvdyBzaG91bGQgd2UgaGFuZGxlIFNITElCX1BBVEgKKyAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9wYTIwXzY0IC91c3IvY2NzL2xpYi9wYTIwXzY0IgorICAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisgICAgIDs7CisgICAqKQorICAgIHNocmV4dF9jbWRzPScuc2wnCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgICBzaGxpYnBhdGhfdmFyPVNITElCX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8gIyArcyBpcyByZXF1aXJlZCB0byBlbmFibGUgU0hMSUJfUEFUSAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgOzsKKyAgZXNhYworICAjIEhQLVVYIHJ1bnMgKnJlYWxseSogc2xvd2x5IHVubGVzcyBzaGFyZWQgbGlicmFyaWVzIGFyZSBtb2RlIDU1NS4KKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNTU1ICRsaWInCisgIDs7CisKK2ludGVyaXgzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZHluYW1pY19saW5rZXI9J0ludGVyaXggMy54IGxkLnNvLjEgKFBFLCBsaWtlIEVMRiknCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2lyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBub25zdG9wdXgqKSB2ZXJzaW9uX3R5cGU9bm9uc3RvcHV4IDs7CisgICAgKikKKwlpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCisJCXZlcnNpb25fdHlwZT1saW51eAorCWVsc2UKKwkJdmVyc2lvbl90eXBlPWlyaXgKKwlmaSA7OworICBlc2FjCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBjYXNlICRob3N0X29zIGluCisgIGlyaXg1KiB8IG5vbnN0b3B1eCopCisgICAgbGlic3VmZj0gc2hsaWJzdWZmPQorICAgIDs7CisgICopCisgICAgY2FzZSAkTEQgaW4gIyBsaWJ0b29sLm00IHdpbGwgYWRkIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcyB0byBMRAorICAgICotMzJ8KiItMzIgInwqLW1lbGYzMmJzbWlwfCoiLW1lbGYzMmJzbWlwICIpCisgICAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPTMyLWJpdDs7CisgICAgKi1uMzJ8KiItbjMyICJ8Ki1tZWxmMzJibWlwbjMyfCoiLW1lbGYzMmJtaXBuMzIgIikKKyAgICAgIGxpYnN1ZmY9MzIgc2hsaWJzdWZmPU4zMiBsaWJtYWdpYz1OMzI7OworICAgICotNjR8KiItNjQgInwqLW1lbGY2NGJtaXB8KiItbWVsZjY0Ym1pcCAiKQorICAgICAgbGlic3VmZj02NCBzaGxpYnN1ZmY9NjQgbGlibWFnaWM9NjQtYml0OzsKKyAgICAqKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKKyAgICBlc2FjCisgICAgOzsKKyAgZXNhYworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUlkke3NobGlic3VmZn1fUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0gL3Vzci9sb2NhbC9saWIke2xpYnN1ZmZ9IgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKKyMgTm8gc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBMaW51eCBvbGRsZCwgYW91dCwgb3IgY29mZi4KK2xpbnV4Km9sZGxkKiB8IGxpbnV4KmFvdXQqIHwgbGludXgqY29mZiopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKKyMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KK2xpbnV4KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAjIFRoaXMgaW1wbGllcyBubyBmYXN0X2luc3RhbGwsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZS4KKyAgIyBTb21lIHJld29yayB3aWxsIGJlIG5lZWRlZCB0byBhbGxvdyBmb3IgZmFzdF9pbnN0YWxsCisgICMgYmVmb3JlIHRoaXMgY2FuIGJlIGVuYWJsZWQuCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKworICAjIEFwcGVuZCBsZC5zby5jb25mIGNvbnRlbnRzIHRvIHRoZSBzZWFyY2ggcGF0aAorICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgorICAgIGx0X2xkX2V4dHJhPWBhd2sgJy9eaW5jbHVkZSAvIHsgc3lzdGVtKHNwcmludGYoImNkIC9ldGM7IGNhdCAlcyIsIFwkMikpOyBza2lwID0gMTsgfSB7IGlmICghc2tpcCkgcHJpbnQgXCQwOyBza2lwID0gMDsgfScgPCAvZXRjL2xkLnNvLmNvbmYgfCAkU0VEIC1lICdzLyMuKi8vO3MvWzosCV0vIC9nO3MvPVtePV0qJC8vO3MvPVtePSBdKiAvIC9nOy9eJC9kJyB8IHRyICdcbicgJyAnYAorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliICRsdF9sZF9leHRyYSIKKyAgZmkKKworICAjIFdlIHVzZWQgdG8gdGVzdCBmb3IgL2xpYi9sZC5zby4xIGFuZCBkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMgb24KKyAgIyBwb3dlcnBjLCBiZWNhdXNlIE1rTGludXggb25seSBzdXBwb3J0ZWQgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHRoZQorICAjIEdOVSBkeW5hbWljIGxpbmtlci4gIFNpbmNlIHRoaXMgd2FzIGJyb2tlbiB3aXRoIGNyb3NzIGNvbXBpbGVycywKKyAgIyBtb3N0IHBvd2VycGMtbGludXggYm94ZXMgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgdGhlc2UgZGF5cyBhbmQKKyAgIyBwZW9wbGUgY2FuIGFsd2F5cyAtLWRpc2FibGUtc2hhcmVkLCB0aGUgdGVzdCB3YXMgcmVtb3ZlZCwgYW5kIHdlCisgICMgYXNzdW1lIHRoZSBHTlUvTGludXggZHluYW1pYyBsaW5rZXIgaXMgaW4gdXNlLgorICBkeW5hbWljX2xpbmtlcj0nR05VL0xpbnV4IGxkLnNvJworICA7OworCitrbmV0YnNkKi1nbnUpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCisgIDs7CisKK25ldGJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJworICBlbHNlCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJworICBmaQorICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworbmV3c29zNikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIDs7CisKK250by1xbngqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICA7OworCitvcGVuYnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiIKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgICMgU29tZSBvbGRlciB2ZXJzaW9ucyBvZiBPcGVuQlNEICgzLjMgYXQgbGVhc3QpICpkbyogbmVlZCB2ZXJzaW9uZWQgbGlicy4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG9wZW5ic2QzLjMgfCBvcGVuYnNkMy4zLiopIG5lZWRfdmVyc2lvbj15ZXMgOzsKKyAgICAqKSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3ZlcnNpb249bm8gIDs7CisgIGVzYWMKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgb3BlbmJzZDIuWzg5XSB8IG9wZW5ic2QyLls4OV0uKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKwk7OworICAgICAgKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisJOzsKKyAgICAgIGVzYWMKKyAgZWxzZQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgZmkKKyAgOzsKKworb3MyKikKKyAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fSAkbGlibmFtZS5hJworICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorICA7OworCitvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCisgIDs7CisKK3NvbGFyaXMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICMgbGRkIGNvbXBsYWlucyB1bmxlc3MgbGlicmFyaWVzIGFyZSBleGVjdXRhYmxlCisgIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kICt4ICRsaWInCisgIDs7CisKK3N1bm9zNCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi91c3IvZXRjIiBsZGNvbmZpZyAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgZmkKKyAgbmVlZF92ZXJzaW9uPXllcworICA7OworCitzeXN2NCB8IHN5c3Y0LjMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisgICAgc25pKQorICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tQmxhcmdlZHluc3ltJworICAgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICAgIDs7CisgICAgc2llbWVucykKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBtb3Rvcm9sYSkKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2Njcy9saWInCisgICAgICA7OworICBlc2FjCisgIDs7CisKK3N5c3Y0Kk1QKikKKyAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgorICAgIHZlcnNpb25fdHlwZT1saW51eAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3InCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZmkKKyAgOzsKKworc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKiB8IHN5c3Y0KnV3MiopCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLWVsZgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC91c3IvZ251L2xpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIgL2xpYicKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgZWxzZQorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9jY3MvbGliIC91c3IvbGliJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBzY28zLjJ2NSopCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvbGliIgorCTs7CisgICAgZXNhYworICBmaQorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9saWInCisgIDs7CisKK3V0czQqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKKyopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7Citlc2FjCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZHluYW1pY19saW5rZXIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGR5bmFtaWNfbGlua2VyIiA+JjYKK3Rlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSJQQVRIICRzaGxpYnBhdGhfdmFyICRydW5wYXRoX3ZhciIKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsgR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgorZmkKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zLi4uICRFQ0hPX0MiID4mNgoraGFyZGNvZGVfYWN0aW9uX0NYWD0KK2lmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWCIgfHwgXAorICAgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyX0NYWCIgfHwgXAorICAgdGVzdCAiWCRoYXJkY29kZV9hdXRvbWF0aWNfQ1hYIiA9ICJYeWVzIiA7IHRoZW4KKworICAjIFdlIGNhbiBoYXJkY29kZSBub24tZXhpc3RhbnQgZGlyZWN0b3JpZXMuCisgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3RfQ1hYIiAhPSBubyAmJgorICAgICAjIElmIHRoZSBvbmx5IG1lY2hhbmlzbSB0byBhdm9pZCBoYXJkY29kaW5nIGlzIHNobGlicGF0aF92YXIsIHdlCisgICAgICMgaGF2ZSB0byByZWxpbmssIG90aGVyd2lzZSB3ZSBtaWdodCBsaW5rIHdpdGggYW4gaW5zdGFsbGVkIGxpYnJhcnkKKyAgICAgIyB3aGVuIHdlIHNob3VsZCBiZSBsaW5raW5nIHdpdGggYSB5ZXQtdG8tYmUtaW5zdGFsbGVkIG9uZQorICAgICAjIyB0ZXN0ICIkX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCBDWFgpIiAhPSBubyAmJgorICAgICB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTF9DWFgiICE9IG5vOyB0aGVuCisgICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KKyAgICBoYXJkY29kZV9hY3Rpb25fQ1hYPXJlbGluaworICBlbHNlCisgICAgIyBXZSBjYW4gbGluayB3aXRob3V0IGhhcmRjb2RpbmcsIGFuZCB3ZSBjYW4gaGFyZGNvZGUgbm9uZXhpc3RpbmcgZGlycy4KKyAgICBoYXJkY29kZV9hY3Rpb25fQ1hYPWltbWVkaWF0ZQorICBmaQorZWxzZQorICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZworICAjIGRpcmVjdG9yaWVzLgorICBoYXJkY29kZV9hY3Rpb25fQ1hYPXVuc3VwcG9ydGVkCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGhhcmRjb2RlX2FjdGlvbl9DWFgiID4mNQorZWNobyAiJHtFQ0hPX1R9JGhhcmRjb2RlX2FjdGlvbl9DWFgiID4mNgorCitpZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uX0NYWCIgPSByZWxpbms7IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KK2VsaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgfHwKKyAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm87IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3QgbmVjZXNzYXJ5CisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bmVlZGxlc3MKK2ZpCisKKworIyBUaGUgZWxzZSBjbGF1c2Ugc2hvdWxkIG9ubHkgZmlyZSB3aGVuIGJvb3RzdHJhcHBpbmcgdGhlCisjIGxpYnRvb2wgZGlzdHJpYnV0aW9uLCBvdGhlcndpc2UgeW91IGZvcmdvdCB0byBzaGlwIGx0bWFpbi5zaAorIyB3aXRoIHlvdXIgcGFja2FnZSwgYW5kIHlvdSB3aWxsIGdldCBjb21wbGFpbnRzIHRoYXQgdGhlcmUgYXJlCisjIG5vIHJ1bGVzIHRvIGdlbmVyYXRlIGx0bWFpbi5zaC4KK2lmIHRlc3QgLWYgIiRsdG1haW4iOyB0aGVuCisgICMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIgY29tbWFuZHMgdGhyb3VnaAorICAjIHdpdGhvdXQgcmVtb3ZhbCBvZiBcIGVzY2FwZXMuCisgIGlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCisgICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKKyAgZmkKKyAgIyBOb3cgcXVvdGUgYWxsIHRoZSB0aGluZ3MgdGhhdCBtYXkgY29udGFpbiBtZXRhY2hhcmFjdGVycyB3aGlsZSBiZWluZworICAjIGNhcmVmdWwgbm90IHRvIG92ZXJxdW90ZSB0aGUgQUNfU1VCU1RlZCB2YWx1ZXMuICBXZSB0YWtlIGNvcGllcyBvZiB0aGUKKyAgIyB2YXJpYWJsZXMgYW5kIHF1b3RlIHRoZSBjb3BpZXMgZm9yIGdlbmVyYXRpb24gb2YgdGhlIGxpYnRvb2wgc2NyaXB0LgorICBmb3IgdmFyIGluIGVjaG8gb2xkX0NDIG9sZF9DRkxBR1MgQVIgQVJfRkxBR1MgRUdSRVAgUkFOTElCIExOX1MgTFRDQyBMVENGTEFHUyBOTSBcCisgICAgU0VEIFNIRUxMIFNUUklQIFwKKyAgICBsaWJuYW1lX3NwZWMgbGlicmFyeV9uYW1lc19zcGVjIHNvbmFtZV9zcGVjIGV4dHJhY3RfZXhwc3ltc19jbWRzIFwKKyAgICBvbGRfc3RyaXBsaWIgc3RyaXBsaWIgZmlsZV9tYWdpY19jbWQgZmluaXNoX2NtZHMgZmluaXNoX2V2YWwgXAorICAgIGRlcGxpYnNfY2hlY2tfbWV0aG9kIHJlbG9hZF9mbGFnIHJlbG9hZF9jbWRzIG5lZWRfbG9ja3MgXAorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wgXAorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIFwKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMgXAorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgXAorICAgIGNvbXBpbGVyX0NYWCBcCisgICAgQ0NfQ1hYIFwKKyAgICBMRF9DWFggXAorICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYIFwKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFggXAorICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWCBcCisgICAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfQ1hYIFwKKyAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYIFwKKyAgICB0aHJlYWRfc2FmZV9mbGFnX3NwZWNfQ1hYIFwKKyAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFggXAorICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfQ1hYIFwKKyAgICBvbGRfYXJjaGl2ZV9jbWRzX0NYWCBcCisgICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19DWFggXAorICAgIHByZWRlcF9vYmplY3RzX0NYWCBcCisgICAgcG9zdGRlcF9vYmplY3RzX0NYWCBcCisgICAgcHJlZGVwc19DWFggXAorICAgIHBvc3RkZXBzX0NYWCBcCisgICAgY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWCBcCisgICAgYXJjaGl2ZV9jbWRzX0NYWCBcCisgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFggXAorICAgIHBvc3RpbnN0YWxsX2NtZHNfQ1hYIFwKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHNfQ1hYIFwKKyAgICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19DWFggXAorICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWCBcCisgICAgbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYIFwKKyAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWCBcCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFggXAorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfQ1hYIFwKKyAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWCBcCisgICAgaGFyZGNvZGVfYXV0b21hdGljX0NYWCBcCisgICAgbW9kdWxlX2NtZHNfQ1hYIFwKKyAgICBtb2R1bGVfZXhwc3ltX2NtZHNfQ1hYIFwKKyAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFggXAorICAgIGV4Y2x1ZGVfZXhwc3ltc19DWFggXAorICAgIGluY2x1ZGVfZXhwc3ltc19DWFg7IGRvCisKKyAgICBjYXNlICR2YXIgaW4KKyAgICBvbGRfYXJjaGl2ZV9jbWRzX0NYWCB8IFwKKyAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX0NYWCB8IFwKKyAgICBhcmNoaXZlX2NtZHNfQ1hYIHwgXAorICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYIHwgXAorICAgIG1vZHVsZV9jbWRzX0NYWCB8IFwKKyAgICBtb2R1bGVfZXhwc3ltX2NtZHNfQ1hYIHwgXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0NYWCB8IFwKKyAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWCB8IFwKKyAgICBleHRyYWN0X2V4cHN5bXNfY21kcyB8IHJlbG9hZF9jbWRzIHwgZmluaXNoX2NtZHMgfCBcCisgICAgcG9zdGluc3RhbGxfY21kcyB8IHBvc3R1bmluc3RhbGxfY21kcyB8IFwKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcyB8IG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgfCBcCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMpCisgICAgICAjIERvdWJsZS1xdW90ZSBkb3VibGUtZXZhbGVkIHN0cmluZ3MuCisgICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkZG91YmxlX3F1b3RlX3N1YnN0XCIgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiIC1lIFwiXCRkZWxheV92YXJpYWJsZV9zdWJzdFwiXGBcXFwiIgorICAgICAgOzsKKyAgICAqKQorICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiXGBcXFwiIgorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICBjYXNlICRsdF9lY2hvIGluCisgIConXCQwIC0tZmFsbGJhY2stZWNobyInKQorICAgIGx0X2VjaG89YCRlY2hvICJYJGx0X2VjaG8iIHwgJFhzZWQgLWUgJ3MvXFxcXFxcXCQwIC0tZmFsbGJhY2stZWNobyIkLyQwIC0tZmFsbGJhY2stZWNobyIvJ2AKKyAgICA7OworICBlc2FjCisKK2NmZ2ZpbGU9IiRvZmlsZSIKKworICBjYXQgPDxfX0VPRl9fID4+ICIkY2ZnZmlsZSIKKyMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUKKworIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorCisjIFNoZWxsIHRvIHVzZSB3aGVuIGludm9raW5nIHNoZWxsIHNjcmlwdHMuCitTSEVMTD0kbHRfU0hFTEwKKworIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLgorYnVpbGRfbGlidG9vbF9saWJzPSRlbmFibGVfc2hhcmVkCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4KK2J1aWxkX29sZF9saWJzPSRlbmFibGVfc3RhdGljCisKKyMgV2hldGhlciBvciBub3QgdG8gYWRkIC1sYyBmb3IgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KK2J1aWxkX2xpYnRvb2xfbmVlZF9sYz0kYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYCisKKyMgV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpYworYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzPSRlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0NYWAorCisjIFdoZXRoZXIgb3Igbm90IHRvIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbi4KK2Zhc3RfaW5zdGFsbD0kZW5hYmxlX2Zhc3RfaW5zdGFsbAorCisjIFRoZSBob3N0IHN5c3RlbS4KK2hvc3RfYWxpYXM9JGhvc3RfYWxpYXMKK2hvc3Q9JGhvc3QKK2hvc3Rfb3M9JGhvc3Rfb3MKKworIyBUaGUgYnVpbGQgc3lzdGVtLgorYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCitidWlsZD0kYnVpbGQKK2J1aWxkX29zPSRidWlsZF9vcworCisjIEFuIGVjaG8gcHJvZ3JhbSB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2hlcy4KK2VjaG89JGx0X2VjaG8KKworIyBUaGUgYXJjaGl2ZXIuCitBUj0kbHRfQVIKK0FSX0ZMQUdTPSRsdF9BUl9GTEFHUworCisjIEEgQyBjb21waWxlci4KK0xUQ0M9JGx0X0xUQ0MKKworIyBMVENDIGNvbXBpbGVyIGZsYWdzLgorTFRDRkxBR1M9JGx0X0xUQ0ZMQUdTCisKKyMgQSBsYW5ndWFnZS1zcGVjaWZpYyBjb21waWxlci4KK0NDPSRsdF9jb21waWxlcl9DWFgKKworIyBJcyB0aGUgY29tcGlsZXIgdGhlIEdOVSBDIGNvbXBpbGVyPword2l0aF9nY2M9JEdDQ19DWFgKKworIyBBbiBFUkUgbWF0Y2hlci4KK0VHUkVQPSRsdF9FR1JFUAorCisjIFRoZSBsaW5rZXIgdXNlZCB0byBidWlsZCBsaWJyYXJpZXMuCitMRD0kbHRfTERfQ1hYCisKKyMgV2hldGhlciB3ZSBuZWVkIGhhcmQgb3Igc29mdCBsaW5rcy4KK0xOX1M9JGx0X0xOX1MKKworIyBBIEJTRC1jb21wYXRpYmxlIG5tIHByb2dyYW0uCitOTT0kbHRfTk0KKworIyBBIHN5bWJvbCBzdHJpcHBpbmcgcHJvZ3JhbQorU1RSSVA9JGx0X1NUUklQCisKKyMgVXNlZCB0byBleGFtaW5lIGxpYnJhcmllcyB3aGVuIGZpbGVfbWFnaWNfY21kIGJlZ2lucyAiZmlsZSIKK01BR0lDX0NNRD0kTUFHSUNfQ01ECisKKyMgVXNlZCBvbiBjeWd3aW46IERMTCBjcmVhdGlvbiBwcm9ncmFtLgorRExMVE9PTD0iJERMTFRPT0wiCisKKyMgVXNlZCBvbiBjeWd3aW46IG9iamVjdCBkdW1wZXIuCitPQkpEVU1QPSIkT0JKRFVNUCIKKworIyBVc2VkIG9uIGN5Z3dpbjogYXNzZW1ibGVyLgorQVM9IiRBUyIKKworIyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGVtcG9yYXJ5IGxpYnRvb2wgZmlsZXMuCitvYmpkaXI9JG9iamRpcgorCisjIEhvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuCityZWxvYWRfZmxhZz0kbHRfcmVsb2FkX2ZsYWcKK3JlbG9hZF9jbWRzPSRsdF9yZWxvYWRfY21kcworCisjIEhvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXIuCit3bD0kbHRfbHRfcHJvZ19jb21waWxlcl93bF9DWFgKKworIyBPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIikuCitvYmpleHQ9IiRhY19vYmpleHQiCisKKyMgT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpLgorbGliZXh0PSIkbGliZXh0IgorCisjIFNoYXJlZCBsaWJyYXJ5IHN1ZmZpeCAobm9ybWFsbHkgIi5zbyIpLgorc2hyZXh0X2NtZHM9JyRzaHJleHRfY21kcycKKworIyBFeGVjdXRhYmxlIGZpbGUgc3VmZml4IChub3JtYWxseSAiIikuCitleGVleHQ9IiRleGVleHQiCisKKyMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgorcGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfcGljX0NYWAorcGljX21vZGU9JHBpY19tb2RlCisKKyMgV2hhdCBpcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBjb21tYW5kPworbWF4X2NtZF9sZW49JGx0X2N2X3N5c19tYXhfY21kX2xlbgorCisjIERvZXMgY29tcGlsZXIgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydCAtYyBhbmQgLW8gb3B0aW9ucz8KK2NvbXBpbGVyX2Nfbz0kbHRfbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYCisKKyMgTXVzdCB3ZSBsb2NrIGZpbGVzIHdoZW4gZG9pbmcgY29tcGlsYXRpb24/CituZWVkX2xvY2tzPSRsdF9uZWVkX2xvY2tzCisKKyMgRG8gd2UgbmVlZCB0aGUgbGliIHByZWZpeCBmb3IgbW9kdWxlcz8KK25lZWRfbGliX3ByZWZpeD0kbmVlZF9saWJfcHJlZml4CisKKyMgRG8gd2UgbmVlZCBhIHZlcnNpb24gZm9yIGxpYnJhcmllcz8KK25lZWRfdmVyc2lvbj0kbmVlZF92ZXJzaW9uCisKKyMgV2hldGhlciBkbG9wZW4gaXMgc3VwcG9ydGVkLgorZGxvcGVuX3N1cHBvcnQ9JGVuYWJsZV9kbG9wZW4KKworIyBXaGV0aGVyIGRsb3BlbiBvZiBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc2VsZj0kZW5hYmxlX2Rsb3Blbl9zZWxmCisKKyMgV2hldGhlciBkbG9wZW4gb2Ygc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgorZGxvcGVuX3NlbGZfc3RhdGljPSRlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljCisKKyMgQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZy4KK2xpbmtfc3RhdGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWAorCisjIENvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnMuCitub19idWlsdGluX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0NYWAorCisjIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JGx0X2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFgKKworIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHNoYXJlZCBvYmplY3RzIGRpcmVjdGx5IGZyb20gYXJjaGl2ZXMuCit3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0kbHRfd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYCisKKyMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSB0aHJlYWQtc2FmZSBvYmplY3RzLgordGhyZWFkX3NhZmVfZmxhZ19zcGVjPSRsdF90aHJlYWRfc2FmZV9mbGFnX3NwZWNfQ1hYCisKKyMgTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGUuCit2ZXJzaW9uX3R5cGU9JHZlcnNpb25fdHlwZQorCisjIEZvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4LgorbGlibmFtZV9zcGVjPSRsdF9saWJuYW1lX3NwZWMKKworIyBMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgorIyBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FLgorbGlicmFyeV9uYW1lc19zcGVjPSRsdF9saWJyYXJ5X25hbWVzX3NwZWMKKworIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KK3NvbmFtZV9zcGVjPSRsdF9zb25hbWVfc3BlYworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCitSQU5MSUI9JGx0X1JBTkxJQgorb2xkX2FyY2hpdmVfY21kcz0kbHRfb2xkX2FyY2hpdmVfY21kc19DWFgKK29sZF9wb3N0aW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdGluc3RhbGxfY21kcworb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3R1bmluc3RhbGxfY21kcworCisjIENyZWF0ZSBhbiBvbGQtc3R5bGUgYXJjaGl2ZSBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX0NYWAorCisjIENyZWF0ZSBhIHRlbXBvcmFyeSBvbGQtc3R5bGUgYXJjaGl2ZSB0byBsaW5rIGluc3RlYWQgb2YgYSBzaGFyZWQgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19DWFgKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGEgc2hhcmVkIGFyY2hpdmUuCithcmNoaXZlX2NtZHM9JGx0X2FyY2hpdmVfY21kc19DWFgKK2FyY2hpdmVfZXhwc3ltX2NtZHM9JGx0X2FyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYCitwb3N0aW5zdGFsbF9jbWRzPSRsdF9wb3N0aW5zdGFsbF9jbWRzCitwb3N0dW5pbnN0YWxsX2NtZHM9JGx0X3Bvc3R1bmluc3RhbGxfY21kcworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYSBsb2FkYWJsZSBtb2R1bGUgKGFzc3VtZWQgc2FtZSBhcyBhYm92ZSBpZiBlbXB0eSkKK21vZHVsZV9jbWRzPSRsdF9tb2R1bGVfY21kc19DWFgKK21vZHVsZV9leHBzeW1fY21kcz0kbHRfbW9kdWxlX2V4cHN5bV9jbWRzX0NYWAorCisjIENvbW1hbmRzIHRvIHN0cmlwIGxpYnJhcmllcy4KK29sZF9zdHJpcGxpYj0kbHRfb2xkX3N0cmlwbGliCitzdHJpcGxpYj0kbHRfc3RyaXBsaWIKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3ByZWRlcF9vYmplY3RzPSRsdF9wcmVkZXBfb2JqZWN0c19DWFgKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcG9zdGRlcF9vYmplY3RzPSRsdF9wb3N0ZGVwX29iamVjdHNfQ1hYCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwcmVkZXBzPSRsdF9wcmVkZXBzX0NYWAorCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwb3N0ZGVwcz0kbHRfcG9zdGRlcHNfQ1hYCisKKyMgVGhlIGxpYnJhcnkgc2VhcmNoIHBhdGggdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb21waWxlciB3aGVuIGxpbmtpbmcKKyMgYSBzaGFyZWQgbGlicmFyeS4KK2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aD0kbHRfY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWAorCisjIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIGRlcGVuZGVudCBsaWJyYXJpZXMgYXJlIHNoYXJlZCBvYmplY3RzLgorZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2RlcGxpYnNfY2hlY2tfbWV0aG9kCisKKyMgQ29tbWFuZCB0byB1c2Ugd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9PSBmaWxlX21hZ2ljLgorZmlsZV9tYWdpY19jbWQ9JGx0X2ZpbGVfbWFnaWNfY21kCisKKyMgRmxhZyB0aGF0IGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgYnVpbHQuCithbGxvd191bmRlZmluZWRfZmxhZz0kbHRfYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYCisKKyMgRmxhZyB0aGF0IGZvcmNlcyBubyB1bmRlZmluZWQgc3ltYm9scy4KK25vX3VuZGVmaW5lZF9mbGFnPSRsdF9ub191bmRlZmluZWRfZmxhZ19DWFgKKworIyBDb21tYW5kcyB1c2VkIHRvIGZpbmlzaCBhIGxpYnRvb2wgbGlicmFyeSBpbnN0YWxsYXRpb24gaW4gYSBkaXJlY3RvcnkuCitmaW5pc2hfY21kcz0kbHRfZmluaXNoX2NtZHMKKworIyBTYW1lIGFzIGFib3ZlLCBidXQgYSBzaW5nbGUgc2NyaXB0IGZyYWdtZW50IHRvIGJlIGV2YWxlZCBidXQgbm90IHNob3duLgorZmluaXNoX2V2YWw9JGx0X2ZpbmlzaF9ldmFsCisKKyMgVGFrZSB0aGUgb3V0cHV0IG9mIG5tIGFuZCBwcm9kdWNlIGEgbGlzdGluZyBvZiByYXcgc3ltYm9scyBhbmQgQyBuYW1lcy4KK2dsb2JhbF9zeW1ib2xfcGlwZT0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZQorCisjIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KK2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsCisKKyMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBDIG5hbWUgYWRkcmVzcyBwYWlyCitnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcworCisjIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHJ1bnRpbWUgcGF0aCB2YXJpYWJsZS4KK3J1bnBhdGhfdmFyPSRydW5wYXRoX3ZhcgorCisjIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGUuCitzaGxpYnBhdGhfdmFyPSRzaGxpYnBhdGhfdmFyCisKKyMgSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoPworc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKKworIyBIb3cgdG8gaGFyZGNvZGUgYSBzaGFyZWQgbGlicmFyeSBwYXRoIGludG8gYW4gZXhlY3V0YWJsZS4KK2hhcmRjb2RlX2FjdGlvbj0kaGFyZGNvZGVfYWN0aW9uX0NYWAorCisjIFdoZXRoZXIgd2Ugc2hvdWxkIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBsaWJyYXJpZXMuCitoYXJkY29kZV9pbnRvX2xpYnM9JGhhcmRjb2RlX2ludG9fbGlicworCisjIEZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50byBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4KKyMgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzIG5vdCBleGlzdC4KK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYCisKKyMgSWYgbGQgaXMgdXNlZCB3aGVuIGxpbmtpbmcsIGZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50bworIyBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4gVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzCisjIG5vdCBleGlzdC4KK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQ9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfQ1hYCisKKyMgV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlIC1ycGF0aCBmbGFnIHdpdGggYSBzZXBhcmF0ZWQgYXJndW1lbnQuCitoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSRsdF9oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWAorCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgRElSL2xpYk5BTUUke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKKyMgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX2RpcmVjdD0kaGFyZGNvZGVfZGlyZWN0X0NYWAorCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQorIyByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfbWludXNfTD0kaGFyZGNvZGVfbWludXNfTF9DWFgKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50bworIyB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX3NobGlicGF0aF92YXI9JGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYCisKKyMgU2V0IHRvIHllcyBpZiBidWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgaGFyZGNvZGVzIERJUiBpbnRvIHRoZSBsaWJyYXJ5CisjIGFuZCBhbGwgc3Vic2VxdWVudCBsaWJyYXJpZXMgYW5kIGV4ZWN1dGFibGVzIGxpbmtlZCBhZ2FpbnN0IGl0LgoraGFyZGNvZGVfYXV0b21hdGljPSRoYXJkY29kZV9hdXRvbWF0aWNfQ1hYCisKKyMgVmFyaWFibGVzIHdob3NlIHZhbHVlcyBzaG91bGQgYmUgc2F2ZWQgaW4gbGlidG9vbCB3cmFwcGVyIHNjcmlwdHMgYW5kCisjIHJlc3RvcmVkIGF0IHJlbGluayB0aW1lLgordmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayIKKworIyBXaGV0aGVyIGxpYnRvb2wgbXVzdCBsaW5rIGEgcHJvZ3JhbSBhZ2FpbnN0IGFsbCBpdHMgZGVwZW5kZW5jeSBsaWJyYXJpZXMuCitsaW5rX2FsbF9kZXBsaWJzPSRsaW5rX2FsbF9kZXBsaWJzX0NYWAorCisjIENvbXBpbGUtdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcworc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKworIyBSdW4tdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcworc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjCisKKyMgRml4IHRoZSBzaGVsbCB2YXJpYWJsZSBcJHNyY2ZpbGUgZm9yIHRoZSBjb21waWxlci4KK2ZpeF9zcmNmaWxlX3BhdGg9IiRmaXhfc3JjZmlsZV9wYXRoX0NYWCIKKworIyBTZXQgdG8geWVzIGlmIGV4cG9ydGVkIHN5bWJvbHMgYXJlIHJlcXVpcmVkLgorYWx3YXlzX2V4cG9ydF9zeW1ib2xzPSRhbHdheXNfZXhwb3J0X3N5bWJvbHNfQ1hYCisKKyMgVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9scy4KK2V4cG9ydF9zeW1ib2xzX2NtZHM9JGx0X2V4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYCisKKyMgVGhlIGNvbW1hbmRzIHRvIGV4dHJhY3QgdGhlIGV4cG9ydGVkIHN5bWJvbCBsaXN0IGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KK2V4dHJhY3RfZXhwc3ltc19jbWRzPSRsdF9leHRyYWN0X2V4cHN5bXNfY21kcworCisjIFN5bWJvbHMgdGhhdCBzaG91bGQgbm90IGJlIGxpc3RlZCBpbiB0aGUgcHJlbG9hZGVkIHN5bWJvbHMuCitleGNsdWRlX2V4cHN5bXM9JGx0X2V4Y2x1ZGVfZXhwc3ltc19DWFgKKworIyBTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWQuCitpbmNsdWRlX2V4cHN5bXM9JGx0X2luY2x1ZGVfZXhwc3ltc19DWFgKKworIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUKKworX19FT0ZfXworCisKK2Vsc2UKKyAgIyBJZiB0aGVyZSBpcyBubyBNYWtlZmlsZSB5ZXQsIHdlIHJlbHkgb24gYSBtYWtlIHJ1bGUgdG8gZXhlY3V0ZQorICAjIGBjb25maWcuc3RhdHVzIC0tcmVjaGVjaycgdG8gcmVydW4gdGhlc2UgdGVzdHMgYW5kIGNyZWF0ZSB0aGUKKyAgIyBsaWJ0b29sIHNjcmlwdCB0aGVuLgorICBsdG1haW5faW49YGVjaG8gJGx0bWFpbiB8IHNlZCAtZSAncy9cLnNoJC8uaW4vJ2AKKyAgaWYgdGVzdCAtZiAiJGx0bWFpbl9pbiI7IHRoZW4KKyAgICB0ZXN0IC1mIE1ha2VmaWxlICYmIG1ha2UgIiRsdG1haW4iCisgIGZpCitmaQorCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworQ0M9JGx0X3NhdmVfQ0MKK0xEQ1hYPSRMRAorTEQ9JGx0X3NhdmVfTEQKK0dDQz0kbHRfc2F2ZV9HQ0MKK3dpdGhfZ251X2xkY3h4PSR3aXRoX2dudV9sZAord2l0aF9nbnVfbGQ9JGx0X3NhdmVfd2l0aF9nbnVfbGQKK2x0X2N2X3BhdGhfTERDWFg9JGx0X2N2X3BhdGhfTEQKK2x0X2N2X3BhdGhfTEQ9JGx0X3NhdmVfcGF0aF9MRAorbHRfY3ZfcHJvZ19nbnVfbGRjeHg9JGx0X2N2X3Byb2dfZ251X2xkCitsdF9jdl9wcm9nX2dudV9sZD0kbHRfc2F2ZV93aXRoX2dudV9sZAorCisJZWxzZQorCSAgdGFnbmFtZT0iIgorCWZpCisJOzsKKworICAgICAgRjc3KQorCWlmIHRlc3QgLW4gIiRGNzciICYmIHRlc3QgIlgkRjc3IiAhPSAiWG5vIjsgdGhlbgorCithY19leHQ9ZgorYWNfY29tcGlsZT0nJEY3NyAtYyAkRkZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJEY3NyAtbyBjb25mdGVzdCRhY19leGVleHQgJEZGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfZjc3X2NvbXBpbGVyX2dudQorCisKK2FyY2hpdmVfY21kc19uZWVkX2xjX0Y3Nz1ubworYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PQorYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0Y3Nz1ubworYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9CitleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PQoraGFyZGNvZGVfZGlyZWN0X0Y3Nz1ubworaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9CitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0Y3Nz0KK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PQoraGFyZGNvZGVfbWludXNfTF9GNzc9bm8KK2hhcmRjb2RlX2F1dG9tYXRpY19GNzc9bm8KK21vZHVsZV9jbWRzX0Y3Nz0KK21vZHVsZV9leHBzeW1fY21kc19GNzc9CitsaW5rX2FsbF9kZXBsaWJzX0Y3Nz11bmtub3duCitvbGRfYXJjaGl2ZV9jbWRzX0Y3Nz0kb2xkX2FyY2hpdmVfY21kcworbm9fdW5kZWZpbmVkX2ZsYWdfRjc3PQord2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PQorZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19GNzc9bm8KKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIGY3NyB0ZXN0IHNvdXJjZXMuCithY19leHQ9ZgorCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgZjc3IHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitvYmpleHRfRjc3PSRvYmpleHQKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKK2x0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iICAgICAgc3Vicm91dGluZSB0XG4gICAgICByZXR1cm5cbiAgICAgIGVuZFxuIgorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSIgICAgICBwcm9ncmFtIHRcbiAgICAgIGVuZFxuIgorCisjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCisKKyMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCitMVENDPSR7TFRDQy0iJENDIn0KKworIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgorTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9CisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitjb21waWxlcj0kQ0MKKworCisjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CitwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0CitldmFsICIkYWNfY29tcGlsZSIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKK19sdF9jb21waWxlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKKyRybSBjb25mdGVzdCoKKworYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CitwcmludGYgIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0CitldmFsICIkYWNfbGluayIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKK19sdF9saW5rZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskcm0gY29uZnRlc3QqCisKKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2x0X3NhdmVfQ0M9IiRDQyIKK0NDPSR7Rjc3LSJmNzcifQorY29tcGlsZXI9JENDCitjb21waWxlcl9GNzc9JENDCitmb3IgY2NfdGVtcCBpbiAkY29tcGlsZXIiIjsgZG8KKyAgY2FzZSAkY2NfdGVtcCBpbgorICAgIGNvbXBpbGUgfCAqW1xcL11jb21waWxlIHwgY2NhY2hlIHwgKltcXC9dY2NhY2hlICkgOzsKKyAgICBkaXN0Y2MgfCAqW1xcL11kaXN0Y2MgfCBwdXJpZnkgfCAqW1xcL11wdXJpZnkgKSA7OworICAgIFwtKikgOzsKKyAgICAqKSBicmVhazs7CisgIGVzYWMKK2RvbmUKK2NjX2Jhc2VuYW1lPWAkZWNobyAiWCRjY190ZW1wIiB8ICRYc2VkIC1lICdzJS4qLyUlJyAtZSAicyVeJGhvc3RfYWxpYXMtJSUiYAorCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gJEVDSE9fQyIgPiY2CitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkY2FuX2J1aWxkX3NoYXJlZCIgPiY1CitlY2hvICIke0VDSE9fVH0kY2FuX2J1aWxkX3NoYXJlZCIgPiY2CisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuLi4gJEVDSE9fQyIgPiY2Cit0ZXN0ICIkY2FuX2J1aWxkX3NoYXJlZCIgPSAibm8iICYmIGVuYWJsZV9zaGFyZWQ9bm8KKworIyBPbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHN0YXRpYyBsaWJyYXJpZXMgdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSwgYW5kCisjIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCisgICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJworICBmaQorICA7OworYWl4NCogfCBhaXg1KikKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgorICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisgIGZpCisgIDs7Citlc2FjCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZW5hYmxlX3NoYXJlZCIgPiY1CitlY2hvICIke0VDSE9fVH0kZW5hYmxlX3NoYXJlZCIgPiY2CisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuLi4gJEVDSE9fQyIgPiY2CisjIE1ha2Ugc3VyZSBlaXRoZXIgZW5hYmxlX3NoYXJlZCBvciBlbmFibGVfc3RhdGljIGlzIHllcy4KK3Rlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyB8fCBlbmFibGVfc3RhdGljPXllcworZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGVuYWJsZV9zdGF0aWMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGVuYWJsZV9zdGF0aWMiID4mNgorCitHQ0NfRjc3PSIkRzc3IgorTERfRjc3PSIkTEQiCisKK2x0X3Byb2dfY29tcGlsZXJfd2xfRjc3PQorbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PQorbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PQorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQy4uLiAkRUNIT19DIiA+JjYKKworICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJworICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLXN0YXRpYycKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeCopCisgICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0CisgICAgICAjIGFkZGluZyB0aGUgYC1tNjgwMjAnIGZsYWcgdG8gR0NDIHByZXZlbnRzIGJ1aWxkaW5nIGFueXRoaW5nIGJldHRlciwKKyAgICAgICMgbGlrZSBgLW02ODA0MCcuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKKyAgICAgIDs7CisKKyAgICBiZW9zKiB8IGN5Z3dpbiogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgICA7OworCisgICAgbWluZ3cqIHwgcHczMiogfCBvczIqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLURETExfRVhQT1JUJworICAgICAgOzsKKworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCisgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1mbm8tY29tbW9uJworICAgICAgOzsKKworICAgIGludGVyaXgzKikKKyAgICAgICMgSW50ZXJpeCAzLnggZ2NjIC1mcGljLy1mUElDIG9wdGlvbnMgZ2VuZXJhdGUgYnJva2VuIGNvZGUuCisgICAgICAjIEluc3RlYWQsIHdlIHJlbG9jYXRlIHNoYXJlZCBsaWJyYXJpZXMgYXQgcnVudGltZS4KKyAgICAgIDs7CisKKyAgICBtc2Rvc2RqZ3BwKikKKyAgICAgICMgSnVzdCBiZWNhdXNlIHdlIHVzZSBHQ0MgZG9lc24ndCBtZWFuIHdlIHN1ZGRlbmx5IGdldCBzaGFyZWQgbGlicmFyaWVzCisgICAgICAjIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZW0uCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRfRjc3PW5vCisgICAgICBlbmFibGVfc2hhcmVkPW5vCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCWx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0tS2NvbmZvcm1fcGljCisgICAgICBmaQorICAgICAgOzsKKworICAgIGhwdXgqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwgYnV0CisgICAgICAjIG5vdCBmb3IgUEEgSFAtVVguCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCp8aWE2NCopCisJIyArWiB0aGUgZGVmYXVsdAorCTs7CisgICAgICAqKQorCWx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLWZQSUMnCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctZlBJQycKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgIyBQT1JUTUUgQ2hlY2sgZm9yIGZsYWcgdG8gcGFzcyBsaW5rZXIgZmxhZ3MgdGhyb3VnaCB0aGUgc3lzdGVtIGNvbXBpbGVyLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctQnN0YXRpYycKKyAgICAgIGVsc2UKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKKyAgICAgIGZpCisgICAgICA7OworICAgICAgZGFyd2luKikKKyAgICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCisgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgIHhsYyopCisgICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1xbm9jb21tb24nCisgICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKKyAgICAgICAgIDs7CisgICAgICAgZXNhYworICAgICAgIDs7CisKKyAgICBtaW5ndyogfCBwdzMyKiB8IG9zMiopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctRERMTF9FWFBPUlQnCisgICAgICA7OworCisgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAorICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIGhwcGEqNjQqfGlhNjQqKQorCSMgK1ogdGhlIGRlZmF1bHQKKwk7OworICAgICAgKikKKwlsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9JytaJworCTs7CisgICAgICBlc2FjCisgICAgICAjIElzIHRoZXJlIGEgYmV0dGVyIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisgICAgICA7OworCisgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJworICAgICAgIyBQSUMgKHdpdGggLUtQSUMpIGlzIHRoZSBkZWZhdWx0LgorICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBuZXdzb3M2KQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctS1BJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgbGludXgqKQorICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIGljYyogfCBlY2MqKQorCWx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJworCWx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLUtQSUMnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctc3RhdGljJworICAgICAgICA7OworICAgICAgcGdjYyogfCBwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSopCisgICAgICAgICMgUG9ydGxhbmQgR3JvdXAgY29tcGlsZXJzICgqbm90KiB0aGUgUGVudGl1bSBnY2MgY29tcGlsZXIsCisJIyB3aGljaCBsb29rcyB0byBiZSBhIGRlYWQgcHJvamVjdCkKKwlsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKKwlsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1mcGljJworCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCisgICAgICAgIDs7CisgICAgICBjY2MqKQorICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKKyAgICAgICAgIyBBbGwgQWxwaGEgY29kZSBpcyBQSUMuCisgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLW5vbl9zaGFyZWQnCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCisgICAgICAjIEFsbCBPU0YvMSBjb2RlIGlzIFBJQy4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1LUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctQnN0YXRpYycKKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBmNzcqIHwgZjkwKiB8IGY5NSopCisJbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1Rb3B0aW9uIGxkICc7OworICAgICAgKikKKwlsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCc7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVFvcHRpb24gbGQgJworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLUtQSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKwlsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1LY29uZm9ybV9waWMnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgdW5peHdhcmUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IE9wZW5VTklYKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctS1BJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgdW5pY29zKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJworICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0Y3Nz1ubworICAgICAgOzsKKworICAgIHV0czQqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctcGljJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0Y3Nz1ubworICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzciID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3NyIgPiY2CisKKyMKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KKyMKK2lmIHRlc3QgLW4gIiRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzciOyB0aGVuCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3NyB3b3JrcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkbHRfcHJvZ19jb21waWxlcl9waWNfRjc3IHdvcmtzLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19GNzcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfRjc3PW5vCisgIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9IiRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzciCisgICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgorICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KKyAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKKyAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCisgICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOjEzMTk4OiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgY29uZnRlc3QuZXJyID4mNQorICAgZWNobyAiJGFzX21lOjEzMjAyOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgIiRhY19vdXRmaWxlIjsgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3Mgb3RoZXIgdGhhbiB0aGUgdXN1YWwgb3V0cHV0LgorICAgICAkZWNobyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfRjc3PXllcworICAgICBmaQorICAgZmkKKyAgICRybSBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19GNzciID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0Y3NyIgPiY2CisKK2lmIHRlc3QgeCIkbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfRjc3IiA9IHh5ZXM7IHRoZW4KKyAgICBjYXNlICRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzcgaW4KKyAgICAgIiIgfCAiICIqKSA7OworICAgICAqKSBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9IiAkbHRfcHJvZ19jb21waWxlcl9waWNfRjc3IiA7OworICAgICBlc2FjCitlbHNlCisgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PQorICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRfRjc3PW5vCitmaQorCitmaQorY2FzZSAkaG9zdF9vcyBpbgorICAjIEZvciBwbGF0Zm9ybXMgd2hpY2ggZG8gbm90IHN1cHBvcnQgUElDLCAtRFBJQyBpcyBtZWFuaW5nbGVzczoKKyAgKmRqZ3BwKikKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9CisgICAgOzsKKyAgKikKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9IiRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzciCisgICAgOzsKK2VzYWMKKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHN0YXRpYyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIword2w9JGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3IGV2YWwgbHRfdG1wX3N0YXRpY19mbGFnPVwiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3N1wiCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3Jrcy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfRjc3K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0Y3Nz1ubworICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgIExERkxBR1M9IiRMREZMQUdTICRsdF90bXBfc3RhdGljX2ZsYWciCisgICBwcmludGYgIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgaWYgKGV2YWwgJGFjX2xpbmsgMj5jb25mdGVzdC5lcnIpICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgICAgICMgVGhlIGxpbmtlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgorICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQorICAgICAgICRlY2hvICJYJF9sdF9saW5rZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+IGNvbmZ0ZXN0LmV4cAorICAgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICAgIGlmIGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19GNzc9eWVzCisgICAgICAgZmkKKyAgICAgZWxzZQorICAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0Y3Nz15ZXMKKyAgICAgZmkKKyAgIGZpCisgICAkcm0gY29uZnRlc3QqCisgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0Y3NyIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfRjc3IiA+JjYKKworaWYgdGVzdCB4IiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19GNzciID0geHllczsgdGhlbgorICAgIDoKK2Vsc2UKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9CitmaQorCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfY3ZfcHJvZ19jb21waWxlcl9jX29fRjc3K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0Y3Nz1ubworICAgJHJtIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCisgICBta2RpciBjb25mdGVzdAorICAgY2QgY29uZnRlc3QKKyAgIG1rZGlyIG91dAorICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOjEzMzAyOiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6MTMzMDY6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQKKyAgIHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgICRlY2hvICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgb3V0L2NvbmZ0ZXN0LmVyciA+b3V0L2NvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVyMiB8fCBkaWZmIG91dC9jb25mdGVzdC5leHAgb3V0L2NvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fRjc3PXllcworICAgICBmaQorICAgZmkKKyAgIGNobW9kIHUrdyAuIDI+JjUKKyAgICRybSBjb25mdGVzdCoKKyAgICMgU0dJIEMrKyBjb21waWxlciB3aWxsIGNyZWF0ZSBkaXJlY3Rvcnkgb3V0L2lpX2ZpbGVzLyBmb3IKKyAgICMgdGVtcGxhdGUgaW5zdGFudGlhdGlvbgorICAgdGVzdCAtZCBvdXQvaWlfZmlsZXMgJiYgJHJtIG91dC9paV9maWxlcy8qICYmIHJtZGlyIG91dC9paV9maWxlcworICAgJHJtIG91dC8qICYmIHJtZGlyIG91dAorICAgY2QgLi4KKyAgIHJtZGlyIGNvbmZ0ZXN0CisgICAkcm0gY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fRjc3IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19GNzciID4mNgorCisKK2hhcmRfbGlua3M9Im5vdHRlc3RlZCIKK2lmIHRlc3QgIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19GNzciID0gbm8gJiYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCisgICMgZG8gbm90IG92ZXJ3cml0ZSB0aGUgdmFsdWUgb2YgbmVlZF9sb2NrcyBwcm92aWRlZCBieSB0aGUgdXNlcgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzLi4uICRFQ0hPX0MiID4mNgorICBoYXJkX2xpbmtzPXllcworICAkcm0gY29uZnRlc3QqCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCisgIHRvdWNoIGNvbmZ0ZXN0LmEKKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+JjUgfHwgaGFyZF9saW5rcz1ubworICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkaGFyZF9saW5rcyIgPiY1CitlY2hvICIke0VDSE9fVH0kaGFyZF9saW5rcyIgPiY2CisgIGlmIHRlc3QgIiRoYXJkX2xpbmtzIiA9IG5vOyB0aGVuCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mMjt9CisgICAgbmVlZF9sb2Nrcz13YXJuCisgIGZpCitlbHNlCisgIG5lZWRfbG9ja3M9bm8KK2ZpCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gJEVDSE9fQyIgPiY2CisKKyAgcnVucGF0aF92YXI9CisgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0KKyAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19GNzc9bm8KKyAgYXJjaGl2ZV9jbWRzX0Y3Nz0KKyAgYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9CisgIG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHNfRjc3PQorICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19GNzc9CisgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzc9CisgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3Nz0KKyAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjX0Y3Nz0KKyAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9CisgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfRjc3PQorICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3Nz0KKyAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz1ubworICBoYXJkY29kZV9taW51c19MX0Y3Nz1ubworICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz11bnN1cHBvcnRlZAorICBsaW5rX2FsbF9kZXBsaWJzX0Y3Nz11bmtub3duCisgIGhhcmRjb2RlX2F1dG9tYXRpY19GNzc9bm8KKyAgbW9kdWxlX2NtZHNfRjc3PQorICBtb2R1bGVfZXhwc3ltX2NtZHNfRjc3PQorICBhbHdheXNfZXhwb3J0X3N5bWJvbHNfRjc3PW5vCisgIGV4cG9ydF9zeW1ib2xzX2NtZHNfRjc3PSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgICMgaW5jbHVkZV9leHBzeW1zIHNob3VsZCBiZSBhIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIHN5bWJvbHMgdG8gYmUgKmFsd2F5cyoKKyAgIyBpbmNsdWRlZCBpbiB0aGUgc3ltYm9sIGxpc3QKKyAgaW5jbHVkZV9leHBzeW1zX0Y3Nz0KKyAgIyBleGNsdWRlX2V4cHN5bXMgY2FuIGJlIGFuIGV4dGVuZGVkIHJlZ2V4cCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUKKyAgIyBpdCB3aWxsIGJlIHdyYXBwZWQgYnkgYCAoJyBhbmQgYCkkJywgc28gb25lIG11c3Qgbm90IG1hdGNoIGJlZ2lubmluZyBvcgorICAjIGVuZCBvZiBsaW5lLiAgRXhhbXBsZTogYGF8YmN8LipkLionIHdpbGwgZXhjbHVkZSB0aGUgc3ltYm9scyBgYScgYW5kIGBiYycsCisgICMgYXMgd2VsbCBhcyBhbnkgc3ltYm9sIHRoYXQgY29udGFpbnMgYGQnLgorICBleGNsdWRlX2V4cHN5bXNfRjc3PSJfR0xPQkFMX09GRlNFVF9UQUJMRV8iCisgICMgQWx0aG91Z2ggX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGlzIGEgdmFsaWQgc3ltYm9sIEMgbmFtZSwgbW9zdCBhLm91dAorICAjIHBsYXRmb3JtcyAoYWIpdXNlIGl0IGluIFBJQyBjb2RlLCBidXQgdGhlaXIgbGlua2VycyBnZXQgY29uZnVzZWQgaWYKKyAgIyB0aGUgc3ltYm9sIGlzIGV4cGxpY2l0bHkgcmVmZXJlbmNlZC4gIFNpbmNlIHBvcnRhYmxlIGNvZGUgY2Fubm90CisgICMgcmVseSBvbiB0aGlzIHN5bWJvbCBuYW1lLCBpdCdzIHByb2JhYmx5IGZpbmUgdG8gbmV2ZXIgaW5jbHVkZSBpdCBpbgorICAjIHByZWxvYWRlZCBzeW1ib2wgdGFibGVzLgorICBleHRyYWN0X2V4cHN5bXNfY21kcz0KKyAgIyBKdXN0IGJlaW5nIHBhcmFub2lkIGFib3V0IGVuc3VyaW5nIHRoYXQgY2NfYmFzZW5hbWUgaXMgc2V0LgorICBmb3IgY2NfdGVtcCBpbiAkY29tcGlsZXIiIjsgZG8KKyAgY2FzZSAkY2NfdGVtcCBpbgorICAgIGNvbXBpbGUgfCAqW1xcL11jb21waWxlIHwgY2NhY2hlIHwgKltcXC9dY2NhY2hlICkgOzsKKyAgICBkaXN0Y2MgfCAqW1xcL11kaXN0Y2MgfCBwdXJpZnkgfCAqW1xcL11wdXJpZnkgKSA7OworICAgIFwtKikgOzsKKyAgICAqKSBicmVhazs7CisgIGVzYWMKK2RvbmUKK2NjX2Jhc2VuYW1lPWAkZWNobyAiWCRjY190ZW1wIiB8ICRYc2VkIC1lICdzJS4qLyUlJyAtZSAicyVeJGhvc3RfYWxpYXMtJSUiYAorCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICAgICMgRklYTUU6IHRoZSBNU1ZDKysgcG9ydCBoYXNuJ3QgYmVlbiB0ZXN0ZWQgaW4gYSBsb29vb25nIHRpbWUKKyAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZworICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCisgICAgaWYgdGVzdCAiJEdDQyIgIT0geWVzOyB0aGVuCisgICAgICB3aXRoX2dudV9sZD1ubworICAgIGZpCisgICAgOzsKKyAgaW50ZXJpeCopCisgICAgIyB3ZSBqdXN0IGhvcGUvYXNzdW1lIHRoaXMgaXMgZ2NjIGFuZCBub3QgYzg5ICg9IE1TVkMrKykKKyAgICB3aXRoX2dudV9sZD15ZXMKKyAgICA7OworICBvcGVuYnNkKikKKyAgICB3aXRoX2dudV9sZD1ubworICAgIDs7CisgIGVzYWMKKworICBsZF9zaGxpYnNfRjc3PXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgIyBJZiBhcmNoaXZlX2NtZHMgcnVucyBMRCwgbm90IENDLCB3bGFyYyBzaG91bGQgYmUgZW1wdHkKKyAgICB3bGFyYz0nJHt3bH0nCisKKyAgICAjIFNldCBzb21lIGRlZmF1bHRzIGZvciBHTlUgbGQgd2l0aCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LiBUaGVzZQorICAgICMgYXJlIHJlc2V0IGxhdGVyIGlmIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIFB1dHRpbmcgdGhlbQorICAgICMgaGVyZSBhbGxvd3MgdGhlbSB0byBiZSBvdmVycmlkZGVuIGlmIG5lY2Vzc2FyeS4KKyAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJworICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzc9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKyAgICAjIGFuY2llbnQgR05VIGxkIGRpZG4ndCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCisgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KKwl3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisgICAgICBlbHNlCisgIAl3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9CisgICAgZmkKKyAgICBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9bm8KKyAgICBjYXNlIGAkTEQgLXYgMj4vZGV2L251bGxgIGluCisgICAgICAqXCBbMDFdLiogfCAqXCAyLlswLTldLiogfCAqXCAyLjEwLiopIDs7ICMgY2F0Y2ggdmVyc2lvbnMgPCAyLjExCisgICAgICAqXCAyLjExLjkzLjAuMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIFJINy4zIC4uLgorICAgICAgKlwgMi4xMS45Mi4wLjEyXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgTWFuZHJha2UgOC4yIC4uLgorICAgICAgKlwgMi4xMS4qKSA7OyAjIG90aGVyIDIuMTEgdmVyc2lvbnMKKyAgICAgICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsKKyAgICBlc2FjCisKKyAgICAjIFNlZSBpZiBHTlUgbGQgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4MyogfCBhaXg0KiB8IGFpeDUqKQorICAgICAgIyBPbiBBSVgvUFBDLCB0aGUgR05VIGxpbmtlciBpcyB2ZXJ5IGJyb2tlbgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0OyB0aGVuCisJbGRfc2hsaWJzX0Y3Nz1ubworCWNhdCA8PEVPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiB0aGUgR05VIGxpbmtlciwgYXQgbGVhc3QgdXAgdG8gcmVsZWFzZSAyLjkuMSwgaXMgcmVwb3J0ZWQKKyoqKiB0byBiZSB1bmFibGUgdG8gcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gQUlYLgorKioqIFRoZXJlZm9yZSwgbGlidG9vbCBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgSWYgeW91CisqKiogcmVhbGx5IGNhcmUgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIHlvdSBtYXkgd2FudCB0byBtb2RpZnkgeW91ciBQQVRICisqKiogc28gdGhhdCBhIG5vbi1HTlUgbGlua2VyIGlzIGZvdW5kLCBhbmQgdGhlbiByZXN0YXJ0LgorCitFT0YKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBhcmNoaXZlX2NtZHNfRjc3PSckcm0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX21pbnVzX0xfRjc3PXllcworCisgICAgICAjIFNhbXVlbCBBLiBGYWx2byBJSSA8a2M1dGphQGRvbHBoaW4ub3BlbnByb2plY3RzLm5ldD4gcmVwb3J0cworICAgICAgIyB0aGF0IHRoZSBzZW1hbnRpY3Mgb2YgZHluYW1pYyBsaWJyYXJpZXMgb24gQW1pZ2FPUywgYXQgbGVhc3QgdXAKKyAgICAgICMgdG8gdmVyc2lvbiA0LCBpcyB0byBzaGFyZSBkYXRhIGFtb25nIG11bHRpcGxlIHByb2dyYW1zIGxpbmtlZAorICAgICAgIyB3aXRoIHRoZSBzYW1lIGR5bmFtaWMgbGlicmFyeS4gIFNpbmNlIHRoaXMgZG9lc24ndCBtYXRjaCB0aGUKKyAgICAgICMgYmVoYXZpb3Igb2Ygc2hhcmVkIGxpYnJhcmllcyBvbiBvdGhlciBwbGF0Zm9ybXMsIHdlIGNhbid0IHVzZQorICAgICAgIyB0aGVtLgorICAgICAgbGRfc2hsaWJzX0Y3Nz1ubworICAgICAgOzsKKworICAgIGJlb3MqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PXVuc3VwcG9ydGVkCisJIyBKb3NlcGggQmVja2VuYmFjaCA8anJiM0BiZXN0LmNvbT4gc2F5cyBzb21lIHJlbGVhc2VzIG9mIGdjYworCSMgc3VwcG9ydCAtLXVuZGVmaW5lZC4gIFRoaXMgZGVzZXJ2ZXMgc29tZSBpbnZlc3RpZ2F0aW9uLiAgRklYTUUKKwlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLW5vc3RhcnQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICBlbHNlCisJbGRfc2hsaWJzX0Y3Nz1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgICAjIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgRjc3KSBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywKKyAgICAgICMgYXMgdGhlcmUgaXMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLUwkbGliZGlyJworICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PXVuc3VwcG9ydGVkCisgICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHNfRjc3PW5vCisgICAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0Y3Nz15ZXMKKyAgICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfRjc3PSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW0JDREdSU10gL3MvLiogXChbXiBdKlwpL1wxIERBVEEvJ1wnJyB8ICRTRUQgLWUgJ1wnJy9eW0FJVFddIC9zLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisJIyBJZiB0aGUgZXhwb3J0LXN5bWJvbHMgZmlsZSBhbHJlYWR5IGlzIGEgLmRlZiBmaWxlICgxc3QgbGluZQorCSMgaXMgRVhQT1JUUyksIHVzZSBpdCBhcyBpczsgb3RoZXJ3aXNlLCBwcmVwZW5kLi4uCisJYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICBjcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJZWxzZQorCSAgZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJICBjYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCWZpfgorCSRDQyAtc2hhcmVkICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworICAgICAgZWxzZQorCWxkX3NobGlic19GNzc9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgaW50ZXJpeDMqKQorICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz1ubworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfS1ycGF0aCwkbGliZGlyJworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tRScKKyAgICAgICMgSGFjazogT24gSW50ZXJpeCAzLngsIHdlIGNhbm5vdCBjb21waWxlIFBJQyBiZWNhdXNlIG9mIGEgYnJva2VuIGdjYy4KKyAgICAgICMgSW5zdGVhZCwgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGF0IGFuIGltYWdlIGJhc2UgKDB4MTAwMDAwMDAgYnkKKyAgICAgICMgZGVmYXVsdCkgYW5kIHJlbG9jYXRlZCBpZiB0aGV5IGNvbmZsaWN0LCB3aGljaCBpcyBhIHNsb3cgdmVyeSBtZW1vcnkKKyAgICAgICMgY29uc3VtaW5nIGFuZCBmcmFnbWVudGluZyBwcm9jZXNzLiAgVG8gYXZvaWQgdGhpcywgd2UgcGljayBhIHJhbmRvbSwKKyAgICAgICMgMjU2IEtpQi1hbGlnbmVkIGltYWdlIGJhc2UgYmV0d2VlbiAweDUwMDAwMDAwIGFuZCAweDZGRkMwMDAwIGF0IGxpbmsKKyAgICAgICMgdGltZS4gIE1vdmluZyB1cCBmcm9tIDB4MTAwMDAwMDAgYWxzbyBhbGxvd3MgbW9yZSBzYnJrKDIpIHNwYWNlLgorICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworICAgICAgOzsKKworICAgIGxpbnV4KikKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCXRtcF9hZGRmbGFnPQorCWNhc2UgJGNjX2Jhc2VuYW1lLCRob3N0X2NwdSBpbgorCXBnY2MqKQkJCQkjIFBvcnRsYW5kIEdyb3VwIEMgY29tcGlsZXIKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcnCisJICA7OworCXBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KikJIyBQb3J0bGFuZCBHcm91cCBmNzcgYW5kIGY5MCBjb21waWxlcnMKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcgLU1ub21haW4nIDs7CisJZWNjKixpYTY0KiB8IGljYyosaWE2NCopCQkjIEludGVsIEMgY29tcGlsZXIgb24gaWE2NAorCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljJyA7OworCWVmYyosaWE2NCogfCBpZm9ydCosaWE2NCopCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlciBvbiBpYTY0CisJICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMgLW5vZm9yX21haW4nIDs7CisJaWZjKiB8IGlmb3J0KikJCQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIKKwkgIHRtcF9hZGRmbGFnPScgLW5vZm9yX21haW4nIDs7CisJZXNhYworCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkJyIkdG1wX2FkZGZsYWciJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKworCWlmIHRlc3QgJHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyA9IHllczsgdGhlbgorCSAgYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorICBjYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisgICRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICRDQyAtc2hhcmVkJyIkdG1wX2FkZGZsYWciJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tdmVyc2lvbi1zY3JpcHQgJHt3bH0kb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKKwlmaQorICAgICAgZWxzZQorCWxkX3NobGlic19GNzc9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgbmV0YnNkKikKKyAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUJzaGFyZWFibGUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbyAkbGliJworCXdsYXJjPQorICAgICAgZWxzZQorCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBpZiAkTEQgLXYgMj4mMSB8IGdyZXAgJ0JGRCAyXC44JyA+IC9kZXYvbnVsbDsgdGhlbgorCWxkX3NobGlic19GNzc9bm8KKwljYXQgPDxFT0YgMT4mMgorCisqKiogV2FybmluZzogVGhlIHJlbGVhc2VzIDIuOC4qIG9mIHRoZSBHTlUgbGlua2VyIGNhbm5vdCByZWxpYWJseQorKioqIGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNvbGFyaXMgc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAorKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQorKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi45LjEgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKKyoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCisqKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KKworRU9GCisgICAgICBlbGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnNfRjc3PW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCopCisgICAgICBjYXNlIGAkTEQgLXYgMj4mMWAgaW4KKyAgICAgICAgKlwgWzAxXS4qIHwgKlwgMi5bMC05XS4qIHwgKlwgMi4xWzAtNV0uKikKKwlsZF9zaGxpYnNfRjc3PW5vCisJY2F0IDw8X0xUX0VPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiBSZWxlYXNlcyBvZiB0aGUgR05VIGxpbmtlciBwcmlvciB0byAyLjE2LjkxLjAuMyBjYW4gbm90CisqKiogcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU0NPIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKKyoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKKyoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuMTYuOTEuMC4zIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5CisqKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcworKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK19MVF9FT0YKKwk7OworCSopCisJICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9J2B0ZXN0IC16ICIkU0NPQUJTUEFUSCIgJiYgZWNobyAke3dsfS1ycGF0aCwkbGliZGlyYCcKKwkgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliJworCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSwtcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgIGVsc2UKKwkgICAgbGRfc2hsaWJzX0Y3Nz1ubworCSAgZmkKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgd2xhcmM9CisgICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCWxkX3NobGlic19GNzc9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgIiRsZF9zaGxpYnNfRjc3IiA9IG5vOyB0aGVuCisgICAgICBydW5wYXRoX3Zhcj0KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PQorICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0KKyAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3Nz0KKyAgICBmaQorICBlbHNlCisgICAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgzKikKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz11bnN1cHBvcnRlZAorICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0Y3Nz15ZXMKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckTEQgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1iRTokZXhwb3J0X3N5bWJvbHMgLVQ1MTIgLUg1MTIgLWJNOlNSRX4kQVIgJEFSX0ZMQUdTICRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKyAgICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCisgICAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCisgICAgICBoYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgLXogIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyI7IHRoZW4KKwkjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKKwkjIGJyb2tlbiBjb2xsZWN0Mi4KKwloYXJkY29kZV9kaXJlY3RfRjc3PXVuc3VwcG9ydGVkCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFpeDQqIHwgYWl4NSopCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKKwkjIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KKwlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisJZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKKwlub19lbnRyeV9mbGFnPSIiCisgICAgICBlbHNlCisJIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgIi1DIiBvcHRpb24uCisJIyAtQyBtZWFucyBkZW1hbmdsZSB0byBBSVggbm0sIGJ1dCBtZWFucyBkb24ndCBkZW1hbmdsZSB3aXRoIEdOVSBubQorCWlmICROTSAtViAyPiYxIHwgZ3JlcCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgZXhwb3J0X3N5bWJvbHNfY21kc19GNzc9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJDIgPT0gIlQiKSB8fCAoXCQyID09ICJEIikgfHwgKFwkMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWVsc2UKKwkgIGV4cG9ydF9zeW1ib2xzX2NtZHNfRjc3PSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkMiA9PSAiVCIpIHx8IChcJDIgPT0gIkQiKSB8fCAoXCQyID09ICJCIikpICYmIChzdWJzdHIoXCQzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisJZmkKKwlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisKKwkjIFRlc3QgaWYgd2UgYXJlIHRyeWluZyB0byB1c2UgcnVuIHRpbWUgbGlua2luZyBvciBub3JtYWwKKwkjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKKwkjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgorCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMjNdfGFpeDQuWzIzXS4qfGFpeDUqKQorCSAgZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCisgIAkgIGlmICh0ZXN0ICRsZF9mbGFnID0gIi1icnRsIiB8fCB0ZXN0ICRsZF9mbGFnID0gIi1XbCwtYnJ0bCIpOyB0aGVuCisgIAkgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKKyAgCSAgICBicmVhaworICAJICBmaQorCSAgZG9uZQorCSAgOzsKKwllc2FjCisKKwlleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JworCW5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKKyAgICAgIGZpCisKKyAgICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KKyAgICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQorICAgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KKyAgICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90CisgICAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KKworICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJworICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PSc6JworICAgICAgbGlua19hbGxfZGVwbGlic19GNzc9eWVzCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlswMTJdfGFpeDQuWzAxMl0uKikKKwkjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKKwkjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKKwkgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKwkgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmIFwKKyAgCSAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgZ3JlcCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKKwkgIHRoZW4KKyAgCSAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCisgIAkgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCisJICBlbHNlCisgIAkgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKKyAgCSAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz11bnN1cHBvcnRlZAorICAJICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCisgIAkgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCisgIAkgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZworICAJICBoYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKKyAgCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1MJGxpYmRpcicKKyAgCSAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9CisJICBmaQorCSAgOzsKKwllc2FjCisJc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCisJaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKKwlmaQorICAgICAgZWxzZQorCSMgbm90IHVzaW5nIGdjYworCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgIAkjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQorICAJIyBjaG9rZXMgb24gLVdsLC1HLiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgY29ycmVjdDoKKwkgIHNoYXJlZF9mbGFnPSctRycKKwllbHNlCisJICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LUcnCisJICBlbHNlCisJICAgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCisJICBmaQorCWZpCisgICAgICBmaQorCisgICAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgZG9lcyBub3QgZXhwb3J0IHN5bWJvbHMgYmVnaW5uaW5nIHdpdGgKKyAgICAgICMgdW5kZXJzY29yZSAoXyksIHNvIGl0IGlzIGJldHRlciB0byBnZW5lcmF0ZSBhIGxpc3Qgb2Ygc3ltYm9scyB0byBleHBvcnQuCisgICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHNfRjc3PXllcworICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCisJIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCWFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0nLWJlcm9rJworICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgorICAgICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorICAgICAgcHJvZ3JhbSBtYWluCisKKyAgICAgIGVuZAorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19mNzdfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKworYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Cit9J2AKKyMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KK2lmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Cit9J2A7IGZpCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAoraWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD0iL3Vzci9saWI6L2xpYiI7IGZpCisKKyAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0iXCRDQyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZWNobyAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKKyAgICAgICBlbHNlCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0iLXogbm9kZWZzIgorCSAgYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzICR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiCisJZWxzZQorCSAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KKwkgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisgICAgICBwcm9ncmFtIG1haW4KKworICAgICAgZW5kCitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Y3N193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorCithaXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KK30nYAorIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgoraWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KK30nYDsgZmkKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKKworCSBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKwkgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1biB0aW1lIGxvYWRpbmcgZmxhZ3MsCisJICAjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisJICBub191bmRlZmluZWRfZmxhZ19GNzc9JyAke3dsfS1iZXJub3RvaycKKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0nICR7d2x9LWJlcm9rJworCSAgIyBFeHBvcnRlZCBzeW1ib2xzIGNhbiBiZSBwdWxsZWQgaW50byBzaGFyZWQgb2JqZWN0cyBmcm9tIGFyY2hpdmVzCisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9JyRjb252ZW5pZW5jZScKKwkgIGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3Nz15ZXMKKwkgICMgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBBSVggdHJhZGl0aW9uYWxseSBidWlsZHMgaXRzIHNoYXJlZCBsaWJyYXJpZXMuCisJICBhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICR7d2x9LWJub2VudHJ5ICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJworCWZpCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJHJtICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKKyAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgZGlmZmVyZW50IHNlbWFudGljcyBvbiB0aGUgR05VIGxkIHNlY3Rpb24KKyAgICAgIGxkX3NobGlic19GNzc9bm8KKyAgICAgIDs7CisKKyAgICBic2RpWzQ1XSopCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PS1yZHluYW1pYworICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcworICAgICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScgJworICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PXVuc3VwcG9ydGVkCisgICAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgorICAgICAgbGliZXh0PWxpYgorICAgICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5kbGwgZmlsZXMsIG5vdCAuc28gZmlsZXMuCisgICAgICBzaHJleHRfY21kcz0iLmRsbCIKKyAgICAgICMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KKyAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtbyAkbGliICRsaWJvYmpzICRjb21waWxlcl9mbGFncyBgZWNobyAiJGRlcGxpYnMiIHwgJFNFRCAtZSAnXCcncy8gLWxjJC8vJ1wnJ2AgLWxpbmsgLWRsbH5saW5rbmFtZXM9JworICAgICAgIyBUaGUgbGlua2VyIHdpbGwgYXV0b21hdGljYWxseSBidWlsZCBhIC5saWIgZmlsZSBpZiB3ZSBidWlsZCBhIERMTC4KKyAgICAgIG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHNfRjc3PSd0cnVlJworICAgICAgIyBGSVhNRTogU2hvdWxkIGxldCB0aGUgdXNlciBzcGVjaWZ5IHRoZSBsaWIgcHJvZ3JhbS4KKyAgICAgIG9sZF9hcmNoaXZlX2NtZHNfRjc3PSdsaWIgL09VVDokb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMnCisgICAgICBmaXhfc3JjZmlsZV9wYXRoX0Y3Nz0nYGN5Z3BhdGggLXcgIiRzcmNmaWxlImAnCisgICAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0Y3Nz15ZXMKKyAgICAgIDs7CisKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgICByaGFwc29keSogfCBkYXJ3aW4xLlswMTJdKQorICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PScke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKKyAgICAgICAgIDs7CisgICAgICAgKikgIyBEYXJ3aW4gMS4zIG9uCisgICAgICAgICBpZiB0ZXN0IC16ICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSA7IHRoZW4KKyAgICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgY2FzZSAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gaW4KKyAgICAgICAgICAgICAxMC5bMDEyXSkKKyAgICAgICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCisgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgIDEwLiopCisgICAgICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9JyR7d2x9LXVuZGVmaW5lZCAke3dsfWR5bmFtaWNfbG9va3VwJworICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgZXNhYworICAgICAgICAgZmkKKyAgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sY19GNzc9bm8KKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9bm8KKyAgICAgIGhhcmRjb2RlX2F1dG9tYXRpY19GNzc9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz11bnN1cHBvcnRlZAorICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PScnCisgICAgICBsaW5rX2FsbF9kZXBsaWJzX0Y3Nz15ZXMKKyAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyA7IHRoZW4KKyAgICAJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCisgICAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJworICAgICAgbW9kdWxlX2NtZHNfRjc3PSckQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFncycKKyAgICAgICMgRG9uJ3QgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGxkIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgZmxhZywgaXQgZG9lc24ndCBleGlzdCBpbiBvbGRlciBkYXJ3aW4gbGRzCisgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLWR5bmFtaWNsaWIgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgICBtb2R1bGVfZXhwc3ltX2NtZHNfRjc3PSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFnc35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgZWxzZQorICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgeGxjKikKKyAgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJworICAgICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1xbWtzaHJvYmogJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWluc3RhbGxfbmFtZSAke3dsfWBlY2hvICRycGF0aC8kc29uYW1lYCAkdmVyc3RyaW5nJworICAgICAgICAgbW9kdWxlX2NtZHNfRjc3PSckQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFncycKKyAgICAgICAgICAjIERvbid0IGZpeCB0aGlzIGJ5IHVzaW5nIHRoZSBsZCAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGZsYWcsIGl0IGRvZXNuJ3QgZXhpc3QgaW4gb2xkZXIgZGFyd2luIGxkcworICAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1xbWtzaHJvYmogJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWluc3RhbGxfbmFtZSAke3dsfSRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgICAgIG1vZHVsZV9leHBzeW1fY21kc19GNzc9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDICRhbGxvd191bmRlZmluZWRfZmxhZyAgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICAgICAgICA7OworICAgICAgICopCisgICAgICAgICBsZF9zaGxpYnNfRjc3PW5vCisgICAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICAgICAgOzsKKworICAgIGRndXgqKQorICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisgICAgICA7OworCisgICAgZnJlZWJzZDEqKQorICAgICAgbGRfc2hsaWJzX0Y3Nz1ubworICAgICAgOzsKKworICAgICMgRnJlZUJTRCAyLjIuWzAxMl0gYWxsb3dzIHVzIHRvIGluY2x1ZGUgYysrcnQwLm8gdG8gZ2V0IEMrKyBjb25zdHJ1Y3RvcgorICAgICMgc3VwcG9ydC4gIEZ1dHVyZSB2ZXJzaW9ucyBkbyB0aGlzIGF1dG9tYXRpY2FsbHksIGJ1dCBhbiBleHBsaWNpdCBjKytydDAubworICAgICMgZG9lcyBub3QgYnJlYWsgYW55dGhpbmcsIGFuZCBoZWxwcyBzaWduaWZpY2FudGx5IChhdCB0aGUgY29zdCBvZiBhIGxpdHRsZQorICAgICMgZXh0cmEgc3BhY2UpLgorICAgIGZyZWVic2QyLjIqKQorICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAvdXNyL2xpYi9jKytydDAubycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KKyAgICAgIDs7CisKKyAgICAjIFVuZm9ydHVuYXRlbHksIG9sZGVyIHZlcnNpb25zIG9mIEZyZWVCU0QgMiBkbyBub3QgaGF2ZSB0aGlzIGZlYXR1cmUuCisgICAgZnJlZWJzZDIqKQorICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCisgICAgICBoYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisgICAgICA7OworCisgICAgIyBGcmVlQlNEIDMgYW5kIGdyZWF0ZXIgdXNlcyBnY2MgLXNoYXJlZCB0byBkbyBzaGFyZWQgbGlicmFyaWVzLgorICAgIGZyZWVic2QqIHwga2ZyZWVic2QqLWdudSB8IGRyYWdvbmZseSopCisgICAgICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KKyAgICAgIDs7CisKKyAgICBocHV4OSopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFyY2hpdmVfY21kc19GNzc9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JExEIC1iICtiICRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9OgorICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKKworICAgICAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKyAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgaGFyZGNvZGVfbWludXNfTF9GNzc9eWVzCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PScke3dsfS1FJworICAgICAgOzsKKworICAgIGhwdXgxMCopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAtYSAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHNfRjc3PSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfStiICR7d2x9JGxpYmRpcicKKwloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3Nz06CisKKwloYXJkY29kZV9kaXJlY3RfRjc3PXllcworCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzc9JyR7d2x9LUUnCisKKwkjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorCSMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCWhhcmRjb2RlX21pbnVzX0xfRjc3PXllcworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBocHV4MTEqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgLWEgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCopCisJICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJaWE2NCopCisJICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJKikKKwkgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWVzYWMKKyAgICAgIGVsc2UKKwljYXNlICRob3N0X2NwdSBpbgorCWhwcGEqNjQqKQorCSAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwlpYTY0KikKKwkgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJKikKKwkgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PToKKworCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCp8aWE2NCopCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0Y3Nz0nK2IgJGxpYmRpcicKKwkgIGhhcmRjb2RlX2RpcmVjdF9GNzc9bm8KKwkgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisJICA7OworCSopCisJICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcworCSAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tRScKKworCSAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCSAgaGFyZGNvZGVfbWludXNfTF9GNzc9eWVzCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9GNzc9Jy1ycGF0aCAkbGliZGlyJworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3Nz06CisgICAgICBsaW5rX2FsbF9kZXBsaWJzX0Y3Nz15ZXMKKyAgICAgIDs7CisKKyAgICBuZXRic2QqKQorICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAjIGEub3V0CisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgICAgICMgRUxGCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1SJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubworICAgICAgOzsKKworICAgIG5ld3NvczYpCisgICAgICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PToKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisgICAgICA7OworCisgICAgb3BlbmJzZCopCisgICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KKyAgICAgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzJworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfS1ycGF0aCwkbGliZGlyJworCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzc9JyR7d2x9LUUnCisgICAgICBlbHNlCisgICAgICAgY2FzZSAkaG9zdF9vcyBpbgorCSBvcGVuYnNkWzAxXS4qIHwgb3BlbmJzZDIuWzAtN10gfCBvcGVuYnNkMi5bMC03XS4qKQorCSAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1SJGxpYmRpcicKKwkgICA7OworCSAqKQorCSAgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgICA7OworICAgICAgIGVzYWMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgb3MyKikKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz11bnN1cHBvcnRlZAorICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJGVjaG8gIkxJQlJBUlkgJGxpYm5hbWUgSU5JVElOU1RBTkNFIiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiREVTQ1JJUFRJT04gXCIkbGlibmFtZVwiIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gREFUQSA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gIiBTSU5HTEUgTk9OU0hBUkVEIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gRVhQT1JUUyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZW14ZXhwICRsaWJvYmpzID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kQ0MgLVpkbGwgLVpjcnRkbGwgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJworICAgICAgb2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kc19GNzc9J2VteGltcCAtbyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5hICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKKyAgICAgIDs7CisKKyAgICBvc2YzKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3Nz06CisgICAgICA7OworCisgICAgb3NmNCogfCBvc2Y1KikJIyBhcyBvc2YzKiB3aXRoIHRoZSBhZGRpdGlvbiBvZiAtbXN5bSBmbGFnCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgZWxzZQorCWFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKwlhcmNoaXZlX2NtZHNfRjc3PSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICIlcyAlc1xcbiIgLWV4cG9ydGVkX3N5bWJvbCAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZTsgZWNobyAiLWhpZGRlbiI+PiAkbGliLmV4cH4KKwkkTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1pbnB1dCAkbGliLmV4cCAkbGlua2VyX2ZsYWdzICRsaWJvYmpzICRkZXBsaWJzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGlifiRybSAkbGliLmV4cCcKKworCSMgQm90aCBjIGFuZCBjeHggY29tcGlsZXIgc3VwcG9ydCAtcnBhdGggZGlyZWN0bHkKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLXJwYXRoICRsaWJkaXInCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9OgorICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgbm9fdW5kZWZpbmVkX2ZsYWdfRjc3PScgLXogdGV4dCcKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJd2xhcmM9JyR7d2x9JworCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkgICRDQyAtc2hhcmVkICR7d2x9LU0gJHt3bH0kbGliLmV4cCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34kcm0gJGxpYi5leHAnCisgICAgICBlbHNlCisJd2xhcmM9JycKKwlhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisgIAkkTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtTSAkbGliLmV4cCAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc34kcm0gJGxpYi5leHAnCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1SJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICBzb2xhcmlzMi5bMC01XSB8IHNvbGFyaXMyLlswLTVdLiopIDs7CisgICAgICAqKQorIAkjIFRoZSBjb21waWxlciBkcml2ZXIgd2lsbCBjb21iaW5lIGxpbmtlciBvcHRpb25zIHNvIHdlCisgCSMgY2Fubm90IGp1c3QgcGFzcyB0aGUgY29udmllbmNlIGxpYnJhcnkgbmFtZXMgdGhyb3VnaAorIAkjIHdpdGhvdXQgJHdsLCBpZmYgd2UgZG8gbm90IGxpbmsgd2l0aCAkTEQuCisgCSMgTHVja2lseSwgZ2NjIHN1cHBvcnRzIHRoZSBzYW1lIHN5bnRheCB3ZSBuZWVkIGZvciBTdW4gU3R1ZGlvLgorIAkjIFN1cHBvcnRlZCBzaW5jZSBTb2xhcmlzIDIuNiAobWF5YmUgMi41LjE/KQorIAljYXNlICR3bGFyYyBpbgorIAknJykKKyAJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9Jy16IGFsbGV4dHJhY3QkY29udmVuaWVuY2UgLXogZGVmYXVsdGV4dHJhY3QnIDs7CisgCSopCisgCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PScke3dsfS16ICR7d2x9YWxsZXh0cmFjdGBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0IC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS16ICR7d2x9ZGVmYXVsdGV4dHJhY3QnIDs7CisgCWVzYWMgOzsKKyAgICAgIGVzYWMKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnNfRjc3PXllcworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBpZiB0ZXN0ICJ4JGhvc3RfdmVuZG9yIiA9IHhzZXF1ZW50OyB0aGVuCisJIyBVc2UgJENDIHRvIGxpbmsgdW5kZXIgc2VxdWVudCwgYmVjYXVzZSBpdCB0aHJvd3MgaW4gc29tZSBleHRyYSAubworCSMgZmlsZXMgdGhhdCBtYWtlIC5pbml0IGFuZCAuZmluaSBzZWN0aW9ucyB3b3JrLgorCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtRyAke3dsfS1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc3RhdGljIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKKyAgICAgIGhhcmRjb2RlX21pbnVzX0xfRjc3PXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KKyAgICAgIDs7CisKKyAgICBzeXN2NCkKKyAgICAgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisJc25pKQorCSAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMgIyBpcyB0aGlzIHJlYWxseSB0cnVlPz8/CisJOzsKKwlzaWVtZW5zKQorCSAgIyMgTEQgaXMgbGQgaXQgbWFrZXMgYSBQTEFNTElCCisJICAjIyBDQyBqdXN0IG1ha2VzIGEgR3Jvc3NNb2R1bGUuCisJICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgcmVsb2FkX2NtZHNfRjc3PSckQ0MgLXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKKwkgIGhhcmRjb2RlX2RpcmVjdF9GNzc9bm8KKyAgICAgICAgOzsKKwltb3Rvcm9sYSkKKwkgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIGhhcmRjb2RlX2RpcmVjdF9GNzc9bm8gI01vdG9yb2xhIG1hbnVhbCBzYXlzIHllcywgYnV0IG15IHRlc3RzIHNheSB0aGV5IGxpZQorCTs7CisgICAgICBlc2FjCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubworICAgICAgOzsKKworICAgIHN5c3Y0LjMqKQorICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzc9Jy1CZXhwb3J0JworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KKwlhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KKwlydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorCWhhcmRjb2RlX3J1bnBhdGhfdmFyPXllcworCWxkX3NobGlic19GNzc9eWVzCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y0KnV3MiogfCBzeXN2NU9wZW5VTklYKiB8IHN5c3Y1VW5peFdhcmU3LlswMV0uWzEwXSogfCB1bml4d2FyZTcqKQorICAgICAgbm9fdW5kZWZpbmVkX2ZsYWdfRjc3PScke3dsfS16LHRleHQnCisgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sY19GNzc9bm8KKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KikKKyAgICAgICMgTm90ZTogV2UgY2FuIE5PVCB1c2UgLXogZGVmcyBhcyB3ZSBtaWdodCBkZXNpcmUsIGJlY2F1c2Ugd2UgZG8gbm90CisgICAgICAjIGxpbmsgd2l0aCAtbGMsIGFuZCB0aGF0IHdvdWxkIGNhdXNlIGFueSBzeW1ib2xzIHVzZWQgZnJvbSBsaWJjIHRvCisgICAgICAjIGFsd2F5cyBiZSB1bnJlc29sdmVkLCB3aGljaCBtZWFucyBqdXN0IGFib3V0IG5vIGxpYnJhcnkgd291bGQKKyAgICAgICMgZXZlciBsaW5rIGNvcnJlY3RseS4gIElmIHdlJ3JlIG5vdCB1c2luZyBHTlUgbGQgd2UgdXNlIC16IHRleHQKKyAgICAgICMgdGhvdWdoLCB3aGljaCBkb2VzIGNhdGNoIHNvbWUgYmFkIHN5bWJvbHMgYnV0IGlzbid0IGFzIGhlYXZ5LWhhbmRlZAorICAgICAgIyBhcyAteiBkZWZzLgorICAgICAgbm9fdW5kZWZpbmVkX2ZsYWdfRjc3PScke3dsfS16LHRleHQnCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9JyR7d2x9LXosbm9kZWZzJworICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3PW5vCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9J2B0ZXN0IC16ICIkU0NPQUJTUEFUSCIgJiYgZWNobyAke3dsfS1SLCRsaWJkaXJgJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9JzonCisgICAgICBsaW5rX2FsbF9kZXBsaWJzX0Y3Nz15ZXMKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzc9JyR7d2x9LUJleHBvcnQnCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLUcgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHV0czQqKQorICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisgICAgICA7OworCisgICAgKikKKyAgICAgIGxkX3NobGlic19GNzc9bm8KKyAgICAgIDs7CisgICAgZXNhYworICBmaQorCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbGRfc2hsaWJzX0Y3NyIgPiY1CitlY2hvICIke0VDSE9fVH0kbGRfc2hsaWJzX0Y3NyIgPiY2Cit0ZXN0ICIkbGRfc2hsaWJzX0Y3NyIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKKyMKKyMgRG8gd2UgbmVlZCB0byBleHBsaWNpdGx5IGxpbmsgbGliYz8KKyMKK2Nhc2UgIngkYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3IiBpbgoreHx4eWVzKQorICAjIEFzc3VtZSAtbGMgc2hvdWxkIGJlIGFkZGVkCisgIGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3Nz15ZXMKKworICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBjYXNlICRhcmNoaXZlX2NtZHNfRjc3IGluCisgICAgKid+JyopCisgICAgICAjIEZJWE1FOiB3ZSBtYXkgaGF2ZSB0byBkZWFsIHdpdGggbXVsdGktY29tbWFuZCBzZXF1ZW5jZXMuCisgICAgICA7OworICAgICckQ0MgJyopCisgICAgICAjIFRlc3Qgd2hldGhlciB0aGUgY29tcGlsZXIgaW1wbGljaXRseSBsaW5rcyB3aXRoIC1sYyBzaW5jZSBvbiBzb21lCisgICAgICAjIHN5c3RlbXMsIC1sZ2NjIGhhcyB0byBjb21lIGJlZm9yZSAtbGMuIElmIGdjYyBhbHJlYWR5IHBhc3NlcyAtbGMKKyAgICAgICMgdG8gbGQsIGRvbid0IGFkZCAtbGMgYmVmb3JlIC1sZ2NjLgorICAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbi4uLiAkRUNIT19DIiA+JjYKKyAgICAgICRybSBjb25mdGVzdCoKKyAgICAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgICAgIGlmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAyPmNvbmZ0ZXN0LmVycjsgdGhlbgorICAgICAgICBzb25hbWU9Y29uZnRlc3QKKyAgICAgICAgbGliPWNvbmZ0ZXN0CisgICAgICAgIGxpYm9ianM9Y29uZnRlc3QuJGFjX29iamV4dAorICAgICAgICBkZXBsaWJzPQorICAgICAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bF9GNzcKKwlwaWNfZmxhZz0kbHRfcHJvZ19jb21waWxlcl9waWNfRjc3CisgICAgICAgIGNvbXBpbGVyX2ZsYWdzPS12CisgICAgICAgIGxpbmtlcl9mbGFncz0tdgorICAgICAgICB2ZXJzdHJpbmc9CisgICAgICAgIG91dHB1dF9vYmpkaXI9LgorICAgICAgICBsaWJuYW1lPWNvbmZ0ZXN0CisgICAgICAgIGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3NworICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9CisgICAgICAgIGlmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFyY2hpdmVfY21kc19GNzcgMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMVwiIikgPiY1CisgIChldmFsICRhcmNoaXZlX2NtZHNfRjc3IDJcPlwmMSBcfCBncmVwIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjEpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KKyAgICAgICAgdGhlbgorCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3PW5vCisgICAgICAgIGVsc2UKKwkgIGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3Nz15ZXMKKyAgICAgICAgZmkKKyAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PSRsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnCisgICAgICBlbHNlCisgICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQorICAgICAgZmkKKyAgICAgICRybSBjb25mdGVzdCoKKyAgICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhcmNoaXZlX2NtZHNfbmVlZF9sY19GNzciID4mNQorZWNobyAiJHtFQ0hPX1R9JGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3NyIgPiY2CisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgOzsKK2VzYWMKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcy4uLiAkRUNIT19DIiA+JjYKK2xpYnJhcnlfbmFtZXNfc3BlYz0KK2xpYm5hbWVfc3BlYz0nbGliJG5hbWUnCitzb25hbWVfc3BlYz0KK3NocmV4dF9jbWRzPSIuc28iCitwb3N0aW5zdGFsbF9jbWRzPQorcG9zdHVuaW5zdGFsbF9jbWRzPQorZmluaXNoX2NtZHM9CitmaW5pc2hfZXZhbD0KK3NobGlicGF0aF92YXI9CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9dW5rbm93bgordmVyc2lvbl90eXBlPW5vbmUKK2R5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgoraWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAorICBpZiBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IGdyZXAgJzsnID4vZGV2L251bGwgOyB0aGVuCisgICAgIyBpZiB0aGUgcGF0aCBjb250YWlucyAiOyIgdGhlbiB3ZSBhc3N1bWUgaXQgdG8gYmUgdGhlIHNlcGFyYXRvcgorICAgICMgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIHBhdGggc2VwYXJhdG9yIChpLmUuICI6IikgLSBpdCBpcworICAgICMgYXNzdW1lZCB0aGF0IG5vIHBhcnQgb2YgYSBub3JtYWwgcGF0aG5hbWUgY29udGFpbnMgIjsiIGJ1dCB0aGF0IHNob3VsZAorICAgICMgb2theSBpbiB0aGUgcmVhbCB3b3JsZCB3aGVyZSAiOyIgaW4gZGlycGF0aHMgaXMgaXRzZWxmIHByb2JsZW1hdGljLgorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKKyAgZWxzZQorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKKyAgZmkKK2Vsc2UKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgorZmkKK25lZWRfbGliX3ByZWZpeD11bmtub3duCitoYXJkY29kZV9pbnRvX2xpYnM9bm8KKworIyB3aGVuIHlvdSBzZXQgbmVlZF92ZXJzaW9uIHRvIG5vLCBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY2F1c2UgLXNldF92ZXJzaW9uCisjIGZsYWdzIHRvIGJlIGxlZnQgd2l0aG91dCBhcmd1bWVudHMKK25lZWRfdmVyc2lvbj11bmtub3duCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lLmEnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorCisgICMgQUlYIDMgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgOzsKKworYWl4NCogfCBhaXg1KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICMgQUlYIDUgc3VwcG9ydHMgSUE2NAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGVsc2UKKyAgICAjIFdpdGggR0NDIHVwIHRvIDIuOTUueCwgY29sbGVjdDIgd291bGQgY3JlYXRlIGFuIGltcG9ydCBmaWxlCisgICAgIyBmb3IgZGVwZW5kZW5jZSBsaWJyYXJpZXMuICBUaGUgaW1wb3J0IGZpbGUgd291bGQgc3RhcnQgd2l0aAorICAgICMgdGhlIGxpbmUgYCMhIC4nLiAgVGhpcyB3b3VsZCBjYXVzZSB0aGUgZ2VuZXJhdGVkIGxpYnJhcnkgdG8KKyAgICAjIGRlcGVuZCBvbiBgLicsIGFsd2F5cyBhbiBpbnZhbGlkIGxpYnJhcnkuICBUaGlzIHdhcyBmaXhlZCBpbgorICAgICMgZGV2ZWxvcG1lbnQgc25hcHNob3RzIG9mIEdDQyBwcmlvciB0byAzLjAuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4NCB8IGFpeDQuWzAxXSB8IGFpeDQuWzAxXS4qKQorICAgICAgaWYgeyBlY2hvICcjaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDk3KScKKwkgICBlY2hvICcgeWVzICcKKwkgICBlY2hvICcjZW5kaWYnOyB9IHwgJHtDQ30gLUUgLSB8IGdyZXAgeWVzID4gL2Rldi9udWxsOyB0aGVuCisJOgorICAgICAgZWxzZQorCWNhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKyAgICAjIEFJWCAob24gUG93ZXIqKSBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyBjdXJyZW50bHkgd2UgY2FuIG5vdCBoYXJkY29kZSBjb3JyZWN0CisgICAgIyBzb25hbWUgaW50byBleGVjdXRhYmxlLiBQcm9iYWJseSB3ZSBjYW4gYWRkIHZlcnNpb25pbmcgc3VwcG9ydCB0bworICAgICMgY29sbGVjdDIsIHNvIGFkZGl0aW9uYWwgbGlua3MgY2FuIGJlIHVzZWZ1bCBpbiBmdXR1cmUuCisgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisgICAgICAjIElmIHVzaW5nIHJ1biB0aW1lIGxpbmtpbmcgKG9uIEFJWCA0LjIgb3IgbGF0ZXIpIHVzZSBsaWI8bmFtZT4uc28KKyAgICAgICMgaW5zdGVhZCBvZiBsaWI8bmFtZT4uYSB0byBsZXQgcGVvcGxlIGtub3cgdGhhdCB0aGVzZSBhcmUgbm90CisgICAgICAjIHR5cGljYWwgQUlYIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBlbHNlCisgICAgICAjIFdlIHByZXNlcnZlIC5hIGFzIGV4dGVuc2lvbiBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aHJvdWdoIEFJWDQuMgorICAgICAgIyBhbmQgbGF0ZXIgd2hlbiB3ZSBhcmUgbm90IGRvaW5nIHJ1biB0aW1lIGxpbmtpbmcuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LmEgJGxpYm5hbWUuYScKKyAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgZmkKKyAgICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKyAgZmkKKyAgOzsKKworYW1pZ2FvcyopCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCisgICMgQ3JlYXRlICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgZW50cmllcyBpbiAvc3lzL2xpYnMuCisgIGZpbmlzaF9ldmFsPSdmb3IgbGliIGluIGBscyAkbGliZGlyLyouaXhsaWJyYXJ5IDI+L2Rldi9udWxsYDsgZG8gbGlibmFtZT1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdcJydzJV4uKi9cKFteL10qXClcLml4bGlicmFyeSQlXDElJ1wnJ2A7IHRlc3QgJHJtIC9zeXMvbGlicy8ke2xpYm5hbWV9X2l4bGlicmFyeS5hOyAkc2hvdyAiY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSI7IGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgfHwgZXhpdCAxOyBkb25lJworICA7OworCitiZW9zKikKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgorICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAorICA7OworCitic2RpWzQ1XSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvWDExL2xpYiAvdXNyL2NvbnRyaWIvbGliIC9saWIgL3Vzci9sb2NhbC9saWIiCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCisgICMgdGhlIGRlZmF1bHQgbGQuc28uY29uZiBhbHNvIGNvbnRhaW5zIC91c3IvY29udHJpYi9saWIgYW5kCisgICMgL3Vzci9YMTFSNi9saWIgKC91c3IvWDExIGlzIGEgbGluayB0byAvdXNyL1gxMVI2KSwgYnV0IGxldCB1cyBhbGxvdworICAjIGxpYnRvb2wgdG8gaGFyZC1jb2RlIHRoZXNlIGludG8gcHJvZ3JhbXMKKyAgOzsKKworY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICB2ZXJzaW9uX3R5cGU9d2luZG93cworICBzaHJleHRfY21kcz0iLmRsbCIKKyAgbmVlZF92ZXJzaW9uPW5vCisgIG5lZWRfbGliX3ByZWZpeD1ubworCisgIGNhc2UgJEdDQywkaG9zdF9vcyBpbgorICB5ZXMsY3lnd2luKiB8IHllcyxtaW5ndyogfCB5ZXMscHczMiopCisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwuYScKKyAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCisgICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+CisgICAgICBkbHBhdGg9YCRTSEVMTCAyPiYxIC1jICdcJycuICRkaXIvJ1wnJ1wke2Jhc2VfZmlsZX0nXCcnaTtlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbGRpcj0kZGVzdGRpci9gZGlybmFtZSBcJGRscGF0aGB+CisgICAgICB0ZXN0IC1kIFwkZGxkaXIgfHwgbWtkaXIgLXAgXCRkbGRpcn4KKyAgICAgICRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lIFwkZGxkaXIvJGRsbmFtZX4KKyAgICAgIGNobW9kIGEreCBcJGRsZGlyLyRkbG5hbWUnCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+CisgICAgICAgJHJtIFwkZGxwYXRoJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBjeWd3aW4qKQorICAgICAgIyBDeWd3aW4gRExMcyB1c2UgJ2N5ZycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICBzb25hbWVfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL2N5Zy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIC9saWIvdzMyYXBpIC9saWIgL3Vzci9sb2NhbC9saWIiCisgICAgICA7OworICAgIG1pbmd3KikKKyAgICAgICMgTWluR1cgRExMcyB1c2UgdHJhZGl0aW9uYWwgJ2xpYicgcHJlZml4CisgICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBncmVwICJebGlicmFyaWVzOiIgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCisgICAgICBpZiBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IGdyZXAgJztbYy16Qy1aXTovJyA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICMgSXQgaXMgbW9zdCBwcm9iYWJseSBhIFdpbmRvd3MgZm9ybWF0IFBBVEggcHJpbnRlZCBieQorICAgICAgICAjIG1pbmd3IGdjYywgYnV0IHdlIGFyZSBydW5uaW5nIG9uIEN5Z3dpbi4gR2NjIHByaW50cyBpdHMgc2VhcmNoCisgICAgICAgICMgcGF0aCB3aXRoIDsgc2VwYXJhdG9ycywgYW5kIHdpdGggZHJpdmUgbGV0dGVycy4gV2UgY2FuIGhhbmRsZSB0aGUKKyAgICAgICAgIyBkcml2ZSBsZXR0ZXJzIChjeWd3aW4gZmlsZXV0aWxzIHVuZGVyc3RhbmRzIHRoZW0pLCBzbyBsZWF2ZSB0aGVtLAorICAgICAgICAjIGVzcGVjaWFsbHkgYXMgd2UgbWlnaHQgcGFzcyBmaWxlcyBmb3VuZCB0aGVyZSB0byBhIG1pbmd3IG9iamR1bXAsCisgICAgICAgICMgd2hpY2ggd291bGRuJ3QgdW5kZXJzdGFuZCBhIGN5Z3dpbmlmaWVkIHBhdGguIEFoaC4KKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAorICAgICAgZWxzZQorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgICAgICBmaQorICAgICAgOzsKKyAgICBwdzMyKikKKyAgICAgICMgcHczMiBETExzIHVzZSAncHcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJworICAgICAgbGlicmFyeV9uYW1lc19zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvcHcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKKworICAqKQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUubGliJworICAgIDs7CisgIGVzYWMKKyAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKKyAgIyBGSVhNRTogZmlyc3Qgd2Ugc2hvdWxkIHNlYXJjaCAuIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGlzIGluCisgIHNobGlicGF0aF92YXI9UEFUSAorICA7OworCitkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZHlsZCIKKyAgdmVyc2lvbl90eXBlPWRhcndpbgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3ZlcnN1ZmZpeH0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0JworICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIHNobGlicGF0aF92YXI9RFlMRF9MSUJSQVJZX1BBVEgKKyAgc2hyZXh0X2NtZHM9J2B0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIC5zbyB8fCBlY2hvIC5keWxpYmAnCisgICMgQXBwbGUncyBnY2MgcHJpbnRzICdnY2MgLXByaW50LXNlYXJjaC1kaXJzJyBkb2Vzbid0IG9wZXJhdGUgdGhlIHNhbWUuCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgdHIgIlxuIiAiJFBBVEhfU0VQQVJBVE9SIiB8IHNlZCAtZSAncy9saWJyYXJpZXM6L0BsaWJyYXJpZXM6LycgfCB0ciAiQCIgIlxuIiB8IGdyZXAgIl5saWJyYXJpZXM6IiB8IHNlZCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciIC1lICJzLCRQQVRIX1NFUEFSQVRPUiwgLGciIC1lICJzLC4qLCYgL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYixnImAKKyAgZWxzZQorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYicKKyAgZmkKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC9saWIgL3Vzci9saWInCisgIDs7CisKK2RndXgqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHNoYXJlZF9leHQnCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKK2ZyZWVic2QxKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKKwora2ZyZWVic2QqLWdudSkKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKKyAgOzsKKworZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICAjIERyYWdvbkZseSBkb2VzIG5vdCBoYXZlIGFvdXQuICBXaGVuL2lmIHRoZXkgaW1wbGVtZW50IGEgbmV3CisgICMgdmVyc2lvbmluZyBtZWNoYW5pc20sIGFkanVzdCB0aGlzLgorICBpZiB0ZXN0IC14IC91c3IvYmluL29iamZvcm1hdDsgdGhlbgorICAgIG9iamZvcm1hdD1gL3Vzci9iaW4vb2JqZm9ybWF0YAorICBlbHNlCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGZyZWVic2RbMTIzXSopIG9iamZvcm1hdD1hb3V0IDs7CisgICAgKikgb2JqZm9ybWF0PWVsZiA7OworICAgIGVzYWMKKyAgZmkKKyAgdmVyc2lvbl90eXBlPWZyZWVic2QtJG9iamZvcm1hdAorICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KKyAgICBmcmVlYnNkLWVsZiopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICA7OworICAgIGZyZWVic2QtKikKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICAgICAgbmVlZF92ZXJzaW9uPXllcworICAgICAgOzsKKyAgZXNhYworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBjYXNlICRob3N0X29zIGluCisgIGZyZWVic2QyKikKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgOzsKKyAgZnJlZWJzZDMuWzAxXSogfCBmcmVlYnNkZWxmMy5bMDFdKikKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgIGZyZWVic2QzLlsyLTldKiB8IGZyZWVic2RlbGYzLlsyLTldKiB8IFwKKyAgZnJlZWJzZDQuWzAtNV0gfCBmcmVlYnNkZWxmNC5bMC01XSB8IGZyZWVic2Q0LjEuMSB8IGZyZWVic2RlbGY0LjEuMSkKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZnJlZWJzZCopICMgZnJvbSA0LjYgb24KKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgIGVzYWMKKyAgOzsKKworZ251KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2hwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCisgICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBjYXNlICRob3N0X2NwdSBpbgorICBpYTY0KikKKyAgICBzaHJleHRfY21kcz0nLnNvJworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNvIgorICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgaWYgdGVzdCAiWCRIUFVYX0lBNjRfTU9ERSIgPSBYMzI7IHRoZW4KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYiIKKyAgICBlbHNlCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXg2NCAvdXNyL2xvY2FsL2xpYi9ocHV4NjQiCisgICAgZmkKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisgICAgOzsKKyAgIGhwcGEqNjQqKQorICAgICBzaHJleHRfY21kcz0nLnNsJworICAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRIICMgSG93IHNob3VsZCB3ZSBoYW5kbGUgU0hMSUJfUEFUSAorICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL3BhMjBfNjQgL3Vzci9jY3MvbGliL3BhMjBfNjQiCisgICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICAgOzsKKyAgICopCisgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICAgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICA7OworICBlc2FjCisgICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKKyAgOzsKKworaW50ZXJpeDMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBkeW5hbWljX2xpbmtlcj0nSW50ZXJpeCAzLnggbGQuc28uMSAoUEUsIGxpa2UgRUxGKScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG5vbnN0b3B1eCopIHZlcnNpb25fdHlwZT1ub25zdG9wdXggOzsKKyAgICAqKQorCWlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KKwkJdmVyc2lvbl90eXBlPWxpbnV4CisJZWxzZQorCQl2ZXJzaW9uX3R5cGU9aXJpeAorCWZpIDs7CisgIGVzYWMKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgaXJpeDUqIHwgbm9uc3RvcHV4KikKKyAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9CisgICAgOzsKKyAgKikKKyAgICBjYXNlICRMRCBpbiAjIGxpYnRvb2wubTQgd2lsbCBhZGQgb25lIG9mIHRoZXNlIHN3aXRjaGVzIHRvIExECisgICAgKi0zMnwqIi0zMiAifCotbWVsZjMyYnNtaXB8KiItbWVsZjMyYnNtaXAgIikKKyAgICAgIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9MzItYml0OzsKKyAgICAqLW4zMnwqIi1uMzIgInwqLW1lbGYzMmJtaXBuMzJ8KiItbWVsZjMyYm1pcG4zMiAiKQorICAgICAgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIGxpYm1hZ2ljPU4zMjs7CisgICAgKi02NHwqIi02NCAifCotbWVsZjY0Ym1pcHwqIi1tZWxmNjRibWlwICIpCisgICAgICBsaWJzdWZmPTY0IHNobGlic3VmZj02NCBsaWJtYWdpYz02NC1iaXQ7OworICAgICopIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9bmV2ZXItbWF0Y2g7OworICAgIGVzYWMKKyAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWSR7c2hsaWJzdWZmfV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0iCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgorbGludXgqb2xkbGQqIHwgbGludXgqYW91dCogfCBsaW51eCpjb2ZmKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKKworIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgorbGludXgqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW4gJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICMgVGhpcyBpbXBsaWVzIG5vIGZhc3RfaW5zdGFsbCwgd2hpY2ggaXMgdW5hY2NlcHRhYmxlLgorICAjIFNvbWUgcmV3b3JrIHdpbGwgYmUgbmVlZGVkIHRvIGFsbG93IGZvciBmYXN0X2luc3RhbGwKKyAgIyBiZWZvcmUgdGhpcyBjYW4gYmUgZW5hYmxlZC4KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworCisgICMgQXBwZW5kIGxkLnNvLmNvbmYgY29udGVudHMgdG8gdGhlIHNlYXJjaCBwYXRoCisgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCisgICAgbHRfbGRfZXh0cmE9YGF3ayAnL15pbmNsdWRlIC8geyBzeXN0ZW0oc3ByaW50ZigiY2QgL2V0YzsgY2F0ICVzIiwgXCQyKSk7IHNraXAgPSAxOyB9IHsgaWYgKCFza2lwKSBwcmludCBcJDA7IHNraXAgPSAwOyB9JyA8IC9ldGMvbGQuc28uY29uZiB8ICRTRUQgLWUgJ3MvIy4qLy87cy9bOiwJXS8gL2c7cy89W149XSokLy87cy89W149IF0qIC8gL2c7L14kL2QnIHwgdHIgJ1xuJyAnICdgCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgJGx0X2xkX2V4dHJhIgorICBmaQorCisgICMgV2UgdXNlZCB0byB0ZXN0IGZvciAvbGliL2xkLnNvLjEgYW5kIGRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyBvbgorICAjIHBvd2VycGMsIGJlY2F1c2UgTWtMaW51eCBvbmx5IHN1cHBvcnRlZCBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhlCisgICMgR05VIGR5bmFtaWMgbGlua2VyLiAgU2luY2UgdGhpcyB3YXMgYnJva2VuIHdpdGggY3Jvc3MgY29tcGlsZXJzLAorICAjIG1vc3QgcG93ZXJwYy1saW51eCBib3hlcyBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyB0aGVzZSBkYXlzIGFuZAorICAjIHBlb3BsZSBjYW4gYWx3YXlzIC0tZGlzYWJsZS1zaGFyZWQsIHRoZSB0ZXN0IHdhcyByZW1vdmVkLCBhbmQgd2UKKyAgIyBhc3N1bWUgdGhlIEdOVS9MaW51eCBkeW5hbWljIGxpbmtlciBpcyBpbiB1c2UuCisgIGR5bmFtaWNfbGlua2VyPSdHTlUvTGludXggbGQuc28nCisgIDs7CisKK2tuZXRic2QqLWdudSkKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKKyAgOzsKKworbmV0YnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgICAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKKyAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIChhLm91dCkgbGQuc28nCisgIGVsc2UKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCisgIGZpCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCituZXdzb3M2KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgOzsKKworbnRvLXFueCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIDs7CisKK29wZW5ic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgIyBTb21lIG9sZGVyIHZlcnNpb25zIG9mIE9wZW5CU0QgKDMuMyBhdCBsZWFzdCkgKmRvKiBuZWVkIHZlcnNpb25lZCBsaWJzLgorICBjYXNlICRob3N0X29zIGluCisgICAgb3BlbmJzZDMuMyB8IG9wZW5ic2QzLjMuKikgbmVlZF92ZXJzaW9uPXllcyA7OworICAgICopICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRfdmVyc2lvbj1ubyAgOzsKKyAgZXNhYworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBvcGVuYnNkMi5bODldIHwgb3BlbmJzZDIuWzg5XS4qKQorCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworCTs7CisgICAgICAqKQorCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKwk7OworICAgICAgZXNhYworICBlbHNlCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBmaQorICA7OworCitvczIqKQorICBsaWJuYW1lX3NwZWM9JyRuYW1lJworICBzaHJleHRfY21kcz0iLmRsbCIKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9ICRsaWJuYW1lLmEnCisgIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIDs7CisKK29zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgdmVyc2lvbl90eXBlPW9zZgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3Ivc2hsaWIgL3Vzci9jY3MvbGliIC91c3IvbGliL2NtcGxycy9jYyAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvdmFyL3NobGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKKyAgOzsKKworc29sYXJpcyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgIyBsZGQgY29tcGxhaW5zIHVubGVzcyBsaWJyYXJpZXMgYXJlIGV4ZWN1dGFibGUKKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgK3ggJGxpYicKKyAgOzsKKworc3Vub3M0KikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIG5lZWRfbGliX3ByZWZpeD1ubworICBmaQorICBuZWVkX3ZlcnNpb249eWVzCisgIDs7CisKK3N5c3Y0IHwgc3lzdjQuMyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKyAgICBzbmkpCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1CbGFyZ2VkeW5zeW0nCisgICAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgICAgOzsKKyAgICBzaWVtZW5zKQorICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICA7OworICAgIG1vdG9yb2xhKQorICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvbGliIC91c3IvbGliIC91c3IvY2NzL2xpYicKKyAgICAgIDs7CisgIGVzYWMKKyAgOzsKKworc3lzdjQqTVAqKQorICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCisgICAgdmVyc2lvbl90eXBlPWxpbnV4CisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvcicKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBmaQorICA7OworCitzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKKyAgdmVyc2lvbl90eXBlPWZyZWVic2QtZWxmCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL3Vzci9nbnUvbGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYiAvbGliJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBlbHNlCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2Njcy9saWIgL3Vzci9saWInCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIHNjbzMuMnY1KikKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC9saWIiCisJOzsKKyAgICBlc2FjCisgIGZpCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xpYicKKyAgOzsKKwordXRzNCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKK2VzYWMKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRkeW5hbWljX2xpbmtlciIgPiY1CitlY2hvICIke0VDSE9fVH0kZHluYW1pY19saW5rZXIiID4mNgordGVzdCAiJGR5bmFtaWNfbGlua2VyIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKwordmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IlBBVEggJHNobGlicGF0aF92YXIgJHJ1bnBhdGhfdmFyIgoraWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayBHQ0NfRVhFQ19QUkVGSVggQ09NUElMRVJfUEFUSCBMSUJSQVJZX1BBVEgiCitmaQorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMuLi4gJEVDSE9fQyIgPiY2CitoYXJkY29kZV9hY3Rpb25fRjc3PQoraWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3IiB8fCBcCisgICB0ZXN0IC1uICIkcnVucGF0aF92YXJfRjc3IiB8fCBcCisgICB0ZXN0ICJYJGhhcmRjb2RlX2F1dG9tYXRpY19GNzciID0gIlh5ZXMiIDsgdGhlbgorCisgICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGFudCBkaXJlY3Rvcmllcy4KKyAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdF9GNzciICE9IG5vICYmCisgICAgICMgSWYgdGhlIG9ubHkgbWVjaGFuaXNtIHRvIGF2b2lkIGhhcmRjb2RpbmcgaXMgc2hsaWJwYXRoX3Zhciwgd2UKKyAgICAgIyBoYXZlIHRvIHJlbGluaywgb3RoZXJ3aXNlIHdlIG1pZ2h0IGxpbmsgd2l0aCBhbiBpbnN0YWxsZWQgbGlicmFyeQorICAgICAjIHdoZW4gd2Ugc2hvdWxkIGJlIGxpbmtpbmcgd2l0aCBhIHlldC10by1iZS1pbnN0YWxsZWQgb25lCisgICAgICMjIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsIEY3NykiICE9IG5vICYmCisgICAgIHRlc3QgIiRoYXJkY29kZV9taW51c19MX0Y3NyIgIT0gbm87IHRoZW4KKyAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgorICAgIGhhcmRjb2RlX2FjdGlvbl9GNzc9cmVsaW5rCisgIGVsc2UKKyAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgorICAgIGhhcmRjb2RlX2FjdGlvbl9GNzc9aW1tZWRpYXRlCisgIGZpCitlbHNlCisgICMgV2UgY2Fubm90IGhhcmRjb2RlIGFueXRoaW5nLCBvciBlbHNlIHdlIGNhbiBvbmx5IGhhcmRjb2RlIGV4aXN0aW5nCisgICMgZGlyZWN0b3JpZXMuCisgIGhhcmRjb2RlX2FjdGlvbl9GNzc9dW5zdXBwb3J0ZWQKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkaGFyZGNvZGVfYWN0aW9uX0Y3NyIgPiY1CitlY2hvICIke0VDSE9fVH0kaGFyZGNvZGVfYWN0aW9uX0Y3NyIgPiY2CisKK2lmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb25fRjc3IiA9IHJlbGluazsgdGhlbgorICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKKyAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubworZWxpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyB8fAorICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubzsgdGhlbgorICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBuZWNlc3NhcnkKKyAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1uZWVkbGVzcworZmkKKworCisjIFRoZSBlbHNlIGNsYXVzZSBzaG91bGQgb25seSBmaXJlIHdoZW4gYm9vdHN0cmFwcGluZyB0aGUKKyMgbGlidG9vbCBkaXN0cmlidXRpb24sIG90aGVyd2lzZSB5b3UgZm9yZ290IHRvIHNoaXAgbHRtYWluLnNoCisjIHdpdGggeW91ciBwYWNrYWdlLCBhbmQgeW91IHdpbGwgZ2V0IGNvbXBsYWludHMgdGhhdCB0aGVyZSBhcmUKKyMgbm8gcnVsZXMgdG8gZ2VuZXJhdGUgbHRtYWluLnNoLgoraWYgdGVzdCAtZiAiJGx0bWFpbiI7IHRoZW4KKyAgIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91ciBjb21tYW5kcyB0aHJvdWdoCisgICMgd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KKyAgaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorICBmaQorICAjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzIHdoaWxlIGJlaW5nCisgICMgY2FyZWZ1bCBub3QgdG8gb3ZlcnF1b3RlIHRoZSBBQ19TVUJTVGVkIHZhbHVlcy4gIFdlIHRha2UgY29waWVzIG9mIHRoZQorICAjIHZhcmlhYmxlcyBhbmQgcXVvdGUgdGhlIGNvcGllcyBmb3IgZ2VuZXJhdGlvbiBvZiB0aGUgbGlidG9vbCBzY3JpcHQuCisgIGZvciB2YXIgaW4gZWNobyBvbGRfQ0Mgb2xkX0NGTEFHUyBBUiBBUl9GTEFHUyBFR1JFUCBSQU5MSUIgTE5fUyBMVENDIExUQ0ZMQUdTIE5NIFwKKyAgICBTRUQgU0hFTEwgU1RSSVAgXAorICAgIGxpYm5hbWVfc3BlYyBsaWJyYXJ5X25hbWVzX3NwZWMgc29uYW1lX3NwZWMgZXh0cmFjdF9leHBzeW1zX2NtZHMgXAorICAgIG9sZF9zdHJpcGxpYiBzdHJpcGxpYiBmaWxlX21hZ2ljX2NtZCBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBcCisgICAgZGVwbGlic19jaGVja19tZXRob2QgcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgbmVlZF9sb2NrcyBcCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MgXAorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyBcCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBcCisgICAgY29tcGlsZXJfRjc3IFwKKyAgICBDQ19GNzcgXAorICAgIExEX0Y3NyBcCisgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzcgXAorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3NyBcCisgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3IFwKKyAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19GNzcgXAorICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzcgXAorICAgIHRocmVhZF9zYWZlX2ZsYWdfc3BlY19GNzcgXAorICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3NyBcCisgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19GNzcgXAorICAgIG9sZF9hcmNoaXZlX2NtZHNfRjc3IFwKKyAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX0Y3NyBcCisgICAgcHJlZGVwX29iamVjdHNfRjc3IFwKKyAgICBwb3N0ZGVwX29iamVjdHNfRjc3IFwKKyAgICBwcmVkZXBzX0Y3NyBcCisgICAgcG9zdGRlcHNfRjc3IFwKKyAgICBjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfRjc3IFwKKyAgICBhcmNoaXZlX2NtZHNfRjc3IFwKKyAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3NyBcCisgICAgcG9zdGluc3RhbGxfY21kc19GNzcgXAorICAgIHBvc3R1bmluc3RhbGxfY21kc19GNzcgXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0Y3NyBcCisgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3IFwKKyAgICBub191bmRlZmluZWRfZmxhZ19GNzcgXAorICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfRjc3IFwKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3NyBcCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9GNzcgXAorICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3IFwKKyAgICBoYXJkY29kZV9hdXRvbWF0aWNfRjc3IFwKKyAgICBtb2R1bGVfY21kc19GNzcgXAorICAgIG1vZHVsZV9leHBzeW1fY21kc19GNzcgXAorICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0Y3NyBcCisgICAgZXhjbHVkZV9leHBzeW1zX0Y3NyBcCisgICAgaW5jbHVkZV9leHBzeW1zX0Y3NzsgZG8KKworICAgIGNhc2UgJHZhciBpbgorICAgIG9sZF9hcmNoaXZlX2NtZHNfRjc3IHwgXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfRjc3IHwgXAorICAgIGFyY2hpdmVfY21kc19GNzcgfCBcCisgICAgYXJjaGl2ZV9leHBzeW1fY21kc19GNzcgfCBcCisgICAgbW9kdWxlX2NtZHNfRjc3IHwgXAorICAgIG1vZHVsZV9leHBzeW1fY21kc19GNzcgfCBcCisgICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfRjc3IHwgXAorICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfRjc3IHwgXAorICAgIGV4dHJhY3RfZXhwc3ltc19jbWRzIHwgcmVsb2FkX2NtZHMgfCBmaW5pc2hfY21kcyB8IFwKKyAgICBwb3N0aW5zdGFsbF9jbWRzIHwgcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIHwgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyB8IFwKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgfCBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYykKKyAgICAgICMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KKyAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRkb3VibGVfcXVvdGVfc3Vic3RcIiAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCIgLWUgXCJcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XCJcYFxcXCIiCisgICAgICA7OworICAgICopCisgICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYFxcXCIiCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorCisgIGNhc2UgJGx0X2VjaG8gaW4KKyAgKidcJDAgLS1mYWxsYmFjay1lY2hvIicpCisgICAgbHRfZWNobz1gJGVjaG8gIlgkbHRfZWNobyIgfCAkWHNlZCAtZSAncy9cXFxcXFxcJDAgLS1mYWxsYmFjay1lY2hvIiQvJDAgLS1mYWxsYmFjay1lY2hvIi8nYAorICAgIDs7CisgIGVzYWMKKworY2ZnZmlsZT0iJG9maWxlIgorCisgIGNhdCA8PF9fRU9GX18gPj4gIiRjZmdmaWxlIgorIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZQorCisjIExpYnRvb2wgd2FzIGNvbmZpZ3VyZWQgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisKKyMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KK1NIRUxMPSRsdF9TSEVMTAorCisjIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuCitidWlsZF9saWJ0b29sX2xpYnM9JGVuYWJsZV9zaGFyZWQKKworIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLgorYnVpbGRfb2xkX2xpYnM9JGVuYWJsZV9zdGF0aWMKKworIyBXaGV0aGVyIG9yIG5vdCB0byBhZGQgLWxjIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgorYnVpbGRfbGlidG9vbF9uZWVkX2xjPSRhcmNoaXZlX2NtZHNfbmVlZF9sY19GNzcKKworIyBXaGV0aGVyIG9yIG5vdCB0byBkaXNhbGxvdyBzaGFyZWQgbGlicyB3aGVuIHJ1bnRpbWUgbGlicyBhcmUgc3RhdGljCithbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXM9JGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfRjc3CisKKyMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgorZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCisKKyMgVGhlIGhvc3Qgc3lzdGVtLgoraG9zdF9hbGlhcz0kaG9zdF9hbGlhcworaG9zdD0kaG9zdAoraG9zdF9vcz0kaG9zdF9vcworCisjIFRoZSBidWlsZCBzeXN0ZW0uCitidWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKK2J1aWxkPSRidWlsZAorYnVpbGRfb3M9JGJ1aWxkX29zCisKKyMgQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgorZWNobz0kbHRfZWNobworCisjIFRoZSBhcmNoaXZlci4KK0FSPSRsdF9BUgorQVJfRkxBR1M9JGx0X0FSX0ZMQUdTCisKKyMgQSBDIGNvbXBpbGVyLgorTFRDQz0kbHRfTFRDQworCisjIExUQ0MgY29tcGlsZXIgZmxhZ3MuCitMVENGTEFHUz0kbHRfTFRDRkxBR1MKKworIyBBIGxhbmd1YWdlLXNwZWNpZmljIGNvbXBpbGVyLgorQ0M9JGx0X2NvbXBpbGVyX0Y3NworCisjIElzIHRoZSBjb21waWxlciB0aGUgR05VIEMgY29tcGlsZXI/Cit3aXRoX2djYz0kR0NDX0Y3NworCisjIEFuIEVSRSBtYXRjaGVyLgorRUdSRVA9JGx0X0VHUkVQCisKKyMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KK0xEPSRsdF9MRF9GNzcKKworIyBXaGV0aGVyIHdlIG5lZWQgaGFyZCBvciBzb2Z0IGxpbmtzLgorTE5fUz0kbHRfTE5fUworCisjIEEgQlNELWNvbXBhdGlibGUgbm0gcHJvZ3JhbS4KK05NPSRsdF9OTQorCisjIEEgc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtCitTVFJJUD0kbHRfU1RSSVAKKworIyBVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zICJmaWxlIgorTUFHSUNfQ01EPSRNQUdJQ19DTUQKKworIyBVc2VkIG9uIGN5Z3dpbjogRExMIGNyZWF0aW9uIHByb2dyYW0uCitETExUT09MPSIkRExMVE9PTCIKKworIyBVc2VkIG9uIGN5Z3dpbjogb2JqZWN0IGR1bXBlci4KK09CSkRVTVA9IiRPQkpEVU1QIgorCisjIFVzZWQgb24gY3lnd2luOiBhc3NlbWJsZXIuCitBUz0iJEFTIgorCisjIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KK29iamRpcj0kb2JqZGlyCisKKyMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KK3JlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZworcmVsb2FkX2NtZHM9JGx0X3JlbG9hZF9jbWRzCisKKyMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KK3dsPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3dsX0Y3NworCisjIE9iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKS4KK29iamV4dD0iJGFjX29iamV4dCIKKworIyBPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIikuCitsaWJleHQ9IiRsaWJleHQiCisKKyMgU2hhcmVkIGxpYnJhcnkgc3VmZml4IChub3JtYWxseSAiLnNvIikuCitzaHJleHRfY21kcz0nJHNocmV4dF9jbWRzJworCisjIEV4ZWN1dGFibGUgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICIiKS4KK2V4ZWV4dD0iJGV4ZWV4dCIKKworIyBBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHMuCitwaWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9waWNfRjc3CitwaWNfbW9kZT0kcGljX21vZGUKKworIyBXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/CittYXhfY21kX2xlbj0kbHRfY3Zfc3lzX21heF9jbWRfbGVuCisKKyMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPworY29tcGlsZXJfY19vPSRsdF9sdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19GNzcKKworIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbj8KK25lZWRfbG9ja3M9JGx0X25lZWRfbG9ja3MKKworIyBEbyB3ZSBuZWVkIHRoZSBsaWIgcHJlZml4IGZvciBtb2R1bGVzPworbmVlZF9saWJfcHJlZml4PSRuZWVkX2xpYl9wcmVmaXgKKworIyBEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzPworbmVlZF92ZXJzaW9uPSRuZWVkX3ZlcnNpb24KKworIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc3VwcG9ydD0kZW5hYmxlX2Rsb3BlbgorCisjIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKKworIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKKworIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgorbGlua19zdGF0aWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3CisKKyMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KK25vX2J1aWx0aW5fZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfRjc3CisKKyMgQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVucy4KK2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0kbHRfZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3NworCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF93aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzcKKworIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHRocmVhZC1zYWZlIG9iamVjdHMuCit0aHJlYWRfc2FmZV9mbGFnX3NwZWM9JGx0X3RocmVhZF9zYWZlX2ZsYWdfc3BlY19GNzcKKworIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KK3ZlcnNpb25fdHlwZT0kdmVyc2lvbl90eXBlCisKKyMgRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXguCitsaWJuYW1lX3NwZWM9JGx0X2xpYm5hbWVfc3BlYworCisjIExpc3Qgb2YgYXJjaGl2ZSBuYW1lcy4gIEZpcnN0IG5hbWUgaXMgdGhlIHJlYWwgb25lLCB0aGUgcmVzdCBhcmUgbGlua3MuCisjIFRoZSBsYXN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IHRoZSBsaW5rZXIgZmluZHMgd2l0aCAtbE5BTUUuCitsaWJyYXJ5X25hbWVzX3NwZWM9JGx0X2xpYnJhcnlfbmFtZXNfc3BlYworCisjIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgorc29uYW1lX3NwZWM9JGx0X3NvbmFtZV9zcGVjCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KK1JBTkxJQj0kbHRfUkFOTElCCitvbGRfYXJjaGl2ZV9jbWRzPSRsdF9vbGRfYXJjaGl2ZV9jbWRzX0Y3Nworb2xkX3Bvc3RpbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0aW5zdGFsbF9jbWRzCitvbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdHVuaW5zdGFsbF9jbWRzCisKKyMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfRjc3CisKKyMgQ3JlYXRlIGEgdGVtcG9yYXJ5IG9sZC1zdHlsZSBhcmNoaXZlIHRvIGxpbmsgaW5zdGVhZCBvZiBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0Y3NworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYSBzaGFyZWQgYXJjaGl2ZS4KK2FyY2hpdmVfY21kcz0kbHRfYXJjaGl2ZV9jbWRzX0Y3NworYXJjaGl2ZV9leHBzeW1fY21kcz0kbHRfYXJjaGl2ZV9leHBzeW1fY21kc19GNzcKK3Bvc3RpbnN0YWxsX2NtZHM9JGx0X3Bvc3RpbnN0YWxsX2NtZHMKK3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfcG9zdHVuaW5zdGFsbF9jbWRzCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSAoYXNzdW1lZCBzYW1lIGFzIGFib3ZlIGlmIGVtcHR5KQorbW9kdWxlX2NtZHM9JGx0X21vZHVsZV9jbWRzX0Y3NworbW9kdWxlX2V4cHN5bV9jbWRzPSRsdF9tb2R1bGVfZXhwc3ltX2NtZHNfRjc3CisKKyMgQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzLgorb2xkX3N0cmlwbGliPSRsdF9vbGRfc3RyaXBsaWIKK3N0cmlwbGliPSRsdF9zdHJpcGxpYgorCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcHJlZGVwX29iamVjdHM9JGx0X3ByZWRlcF9vYmplY3RzX0Y3NworCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwb3N0ZGVwX29iamVjdHM9JGx0X3Bvc3RkZXBfb2JqZWN0c19GNzcKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3ByZWRlcHM9JGx0X3ByZWRlcHNfRjc3CisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3Bvc3RkZXBzPSRsdF9wb3N0ZGVwc19GNzcKKworIyBUaGUgbGlicmFyeSBzZWFyY2ggcGF0aCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBpbGVyIHdoZW4gbGlua2luZworIyBhIHNoYXJlZCBsaWJyYXJ5LgorY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoPSRsdF9jb21waWxlcl9saWJfc2VhcmNoX3BhdGhfRjc3CisKKyMgTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgZGVwZW5kZW50IGxpYnJhcmllcyBhcmUgc2hhcmVkIG9iamVjdHMuCitkZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfZGVwbGlic19jaGVja19tZXRob2QKKworIyBDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID09IGZpbGVfbWFnaWMuCitmaWxlX21hZ2ljX2NtZD0kbHRfZmlsZV9tYWdpY19jbWQKKworIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KK2FsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9hbGxvd191bmRlZmluZWRfZmxhZ19GNzcKKworIyBGbGFnIHRoYXQgZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgorbm9fdW5kZWZpbmVkX2ZsYWc9JGx0X25vX3VuZGVmaW5lZF9mbGFnX0Y3NworCisjIENvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeS4KK2ZpbmlzaF9jbWRzPSRsdF9maW5pc2hfY21kcworCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dCBub3Qgc2hvd24uCitmaW5pc2hfZXZhbD0kbHRfZmluaXNoX2V2YWwKKworIyBUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzLgorZ2xvYmFsX3N5bWJvbF9waXBlPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlCisKKyMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgorZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIKK2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzCisKKyMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgorcnVucGF0aF92YXI9JHJ1bnBhdGhfdmFyCisKKyMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KK3NobGlicGF0aF92YXI9JHNobGlicGF0aF92YXIKKworIyBJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAorCisjIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgoraGFyZGNvZGVfYWN0aW9uPSRoYXJkY29kZV9hY3Rpb25fRjc3CisKKyMgV2hldGhlciB3ZSBzaG91bGQgaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIGxpYnJhcmllcy4KK2hhcmRjb2RlX2ludG9fbGlicz0kaGFyZGNvZGVfaW50b19saWJzCisKKyMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgorIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0LgoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzcKKworIyBJZiBsZCBpcyB1c2VkIHdoZW4gbGlua2luZywgZmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvCisjIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLiBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMKKyMgbm90IGV4aXN0LgoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9GNzcKKworIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgLXJwYXRoIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGx0X2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3CisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyBESVIvbGliTkFNRSR7c2hhcmVkX2V4dH0gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQorIyByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfZGlyZWN0PSRoYXJkY29kZV9kaXJlY3RfRjc3CisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisjIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MX0Y3NworCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvCisjIHRoZSByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzcKKworIyBTZXQgdG8geWVzIGlmIGJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkgYXV0b21hdGljYWxseSBoYXJkY29kZXMgRElSIGludG8gdGhlIGxpYnJhcnkKKyMgYW5kIGFsbCBzdWJzZXF1ZW50IGxpYnJhcmllcyBhbmQgZXhlY3V0YWJsZXMgbGlua2VkIGFnYWluc3QgaXQuCitoYXJkY29kZV9hdXRvbWF0aWM9JGhhcmRjb2RlX2F1dG9tYXRpY19GNzcKKworIyBWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKKyMgcmVzdG9yZWQgYXQgcmVsaW5rIHRpbWUuCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIgorCisjIFdoZXRoZXIgbGlidG9vbCBtdXN0IGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgYWxsIGl0cyBkZXBlbmRlbmN5IGxpYnJhcmllcy4KK2xpbmtfYWxsX2RlcGxpYnM9JGxpbmtfYWxsX2RlcGxpYnNfRjc3CisKKyMgQ29tcGlsZS10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCitzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYworCisjIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMKKworIyBGaXggdGhlIHNoZWxsIHZhcmlhYmxlIFwkc3JjZmlsZSBmb3IgdGhlIGNvbXBpbGVyLgorZml4X3NyY2ZpbGVfcGF0aD0iJGZpeF9zcmNmaWxlX3BhdGhfRjc3IgorCisjIFNldCB0byB5ZXMgaWYgZXhwb3J0ZWQgc3ltYm9scyBhcmUgcmVxdWlyZWQuCithbHdheXNfZXhwb3J0X3N5bWJvbHM9JGFsd2F5c19leHBvcnRfc3ltYm9sc19GNzcKKworIyBUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzLgorZXhwb3J0X3N5bWJvbHNfY21kcz0kbHRfZXhwb3J0X3N5bWJvbHNfY21kc19GNzcKKworIyBUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorZXh0cmFjdF9leHBzeW1zX2NtZHM9JGx0X2V4dHJhY3RfZXhwc3ltc19jbWRzCisKKyMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scy4KK2V4Y2x1ZGVfZXhwc3ltcz0kbHRfZXhjbHVkZV9leHBzeW1zX0Y3NworCisjIFN5bWJvbHMgdGhhdCBtdXN0IGFsd2F5cyBiZSBleHBvcnRlZC4KK2luY2x1ZGVfZXhwc3ltcz0kbHRfaW5jbHVkZV9leHBzeW1zX0Y3NworCisjICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZQorCitfX0VPRl9fCisKKworZWxzZQorICAjIElmIHRoZXJlIGlzIG5vIE1ha2VmaWxlIHlldCwgd2UgcmVseSBvbiBhIG1ha2UgcnVsZSB0byBleGVjdXRlCisgICMgYGNvbmZpZy5zdGF0dXMgLS1yZWNoZWNrJyB0byByZXJ1biB0aGVzZSB0ZXN0cyBhbmQgY3JlYXRlIHRoZQorICAjIGxpYnRvb2wgc2NyaXB0IHRoZW4uCisgIGx0bWFpbl9pbj1gZWNobyAkbHRtYWluIHwgc2VkIC1lICdzL1wuc2gkLy5pbi8nYAorICBpZiB0ZXN0IC1mICIkbHRtYWluX2luIjsgdGhlbgorICAgIHRlc3QgLWYgTWFrZWZpbGUgJiYgbWFrZSAiJGx0bWFpbiIKKyAgZmkKK2ZpCisKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCitDQz0iJGx0X3NhdmVfQ0MiCisKKwllbHNlCisJICB0YWduYW1lPSIiCisJZmkKKwk7OworCisgICAgICBHQ0opCisJaWYgdGVzdCAtbiAiJEdDSiIgJiYgdGVzdCAiWCRHQ0oiICE9ICJYbm8iOyB0aGVuCisKKworCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgSmF2YSB0ZXN0IHNvdXJjZXMuCithY19leHQ9amF2YQorCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgSmF2YSB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworb2JqZXh0X0dDSj0kb2JqZXh0CisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCitsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImNsYXNzIGZvbyB7fVxuIgorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdwdWJsaWMgY2xhc3MgY29uZnRlc3QgeyBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB7fTsgfVxuJworCisjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCisKKyMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCitMVENDPSR7TFRDQy0iJENDIn0KKworIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgorTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9CisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitjb21waWxlcj0kQ0MKKworCisjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CitwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0CitldmFsICIkYWNfY29tcGlsZSIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKK19sdF9jb21waWxlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKKyRybSBjb25mdGVzdCoKKworYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CitwcmludGYgIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0CitldmFsICIkYWNfbGluayIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKK19sdF9saW5rZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskcm0gY29uZnRlc3QqCisKKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2x0X3NhdmVfQ0M9IiRDQyIKK0NDPSR7R0NKLSJnY2oifQorY29tcGlsZXI9JENDCitjb21waWxlcl9HQ0o9JENDCitmb3IgY2NfdGVtcCBpbiAkY29tcGlsZXIiIjsgZG8KKyAgY2FzZSAkY2NfdGVtcCBpbgorICAgIGNvbXBpbGUgfCAqW1xcL11jb21waWxlIHwgY2NhY2hlIHwgKltcXC9dY2NhY2hlICkgOzsKKyAgICBkaXN0Y2MgfCAqW1xcL11kaXN0Y2MgfCBwdXJpZnkgfCAqW1xcL11wdXJpZnkgKSA7OworICAgIFwtKikgOzsKKyAgICAqKSBicmVhazs7CisgIGVzYWMKK2RvbmUKK2NjX2Jhc2VuYW1lPWAkZWNobyAiWCRjY190ZW1wIiB8ICRYc2VkIC1lICdzJS4qLyUlJyAtZSAicyVeJGhvc3RfYWxpYXMtJSUiYAorCisKKyMgR0NKIGRpZCBub3QgZXhpc3QgYXQgdGhlIHRpbWUgR0NDIGRpZG4ndCBpbXBsaWNpdGx5IGxpbmsgbGliYyBpbi4KK2FyY2hpdmVfY21kc19uZWVkX2xjX0dDSj1ubworCitvbGRfYXJjaGl2ZV9jbWRzX0dDSj0kb2xkX2FyY2hpdmVfY21kcworCisjIyBDQVZFQVQgRU1QVE9SOgorIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5CisjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KKworbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfR0NKPQorCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19HQ0o9JyAtZm5vLWJ1aWx0aW4nCisKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPW5vCisgIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMiCisgICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgorICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KKyAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKKyAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCisgICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOjE1NTA5OiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgY29uZnRlc3QuZXJyID4mNQorICAgZWNobyAiJGFzX21lOjE1NTEzOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgIiRhY19vdXRmaWxlIjsgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3Mgb3RoZXIgdGhhbiB0aGUgdXN1YWwgb3V0cHV0LgorICAgICAkZWNobyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9eWVzCisgICAgIGZpCisgICBmaQorICAgJHJtIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPiY2CisKK2lmIHRlc3QgeCIkbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID0geHllczsgdGhlbgorICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0dDSj0iJGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0dDSiAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIgorZWxzZQorICAgIDoKK2ZpCisKK2ZpCisKK2x0X3Byb2dfY29tcGlsZXJfd2xfR0NKPQorbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPQorbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPQorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQy4uLiAkRUNIT19DIiA+JjYKKworICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJworICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLXN0YXRpYycKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeCopCisgICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0CisgICAgICAjIGFkZGluZyB0aGUgYC1tNjgwMjAnIGZsYWcgdG8gR0NDIHByZXZlbnRzIGJ1aWxkaW5nIGFueXRoaW5nIGJldHRlciwKKyAgICAgICMgbGlrZSBgLW02ODA0MCcuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKKyAgICAgIDs7CisKKyAgICBiZW9zKiB8IGN5Z3dpbiogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgICA7OworCisgICAgbWluZ3cqIHwgcHczMiogfCBvczIqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLURETExfRVhQT1JUJworICAgICAgOzsKKworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCisgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1mbm8tY29tbW9uJworICAgICAgOzsKKworICAgIGludGVyaXgzKikKKyAgICAgICMgSW50ZXJpeCAzLnggZ2NjIC1mcGljLy1mUElDIG9wdGlvbnMgZ2VuZXJhdGUgYnJva2VuIGNvZGUuCisgICAgICAjIEluc3RlYWQsIHdlIHJlbG9jYXRlIHNoYXJlZCBsaWJyYXJpZXMgYXQgcnVudGltZS4KKyAgICAgIDs7CisKKyAgICBtc2Rvc2RqZ3BwKikKKyAgICAgICMgSnVzdCBiZWNhdXNlIHdlIHVzZSBHQ0MgZG9lc24ndCBtZWFuIHdlIHN1ZGRlbmx5IGdldCBzaGFyZWQgbGlicmFyaWVzCisgICAgICAjIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZW0uCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRfR0NKPW5vCisgICAgICBlbmFibGVfc2hhcmVkPW5vCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCWx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0tS2NvbmZvcm1fcGljCisgICAgICBmaQorICAgICAgOzsKKworICAgIGhwdXgqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwgYnV0CisgICAgICAjIG5vdCBmb3IgUEEgSFAtVVguCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCp8aWE2NCopCisJIyArWiB0aGUgZGVmYXVsdAorCTs7CisgICAgICAqKQorCWx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLWZQSUMnCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctZlBJQycKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgIyBQT1JUTUUgQ2hlY2sgZm9yIGZsYWcgdG8gcGFzcyBsaW5rZXIgZmxhZ3MgdGhyb3VnaCB0aGUgc3lzdGVtIGNvbXBpbGVyLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKKyAgICAgIGVsc2UKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKKyAgICAgIGZpCisgICAgICA7OworICAgICAgZGFyd2luKikKKyAgICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCisgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgIHhsYyopCisgICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1xbm9jb21tb24nCisgICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKKyAgICAgICAgIDs7CisgICAgICAgZXNhYworICAgICAgIDs7CisKKyAgICBtaW5ndyogfCBwdzMyKiB8IG9zMiopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctRERMTF9FWFBPUlQnCisgICAgICA7OworCisgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAorICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIGhwcGEqNjQqfGlhNjQqKQorCSMgK1ogdGhlIGRlZmF1bHQKKwk7OworICAgICAgKikKKwlsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9JytaJworCTs7CisgICAgICBlc2FjCisgICAgICAjIElzIHRoZXJlIGEgYmV0dGVyIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisgICAgICA7OworCisgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJworICAgICAgIyBQSUMgKHdpdGggLUtQSUMpIGlzIHRoZSBkZWZhdWx0LgorICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBuZXdzb3M2KQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctS1BJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgbGludXgqKQorICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIGljYyogfCBlY2MqKQorCWx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJworCWx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLUtQSUMnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctc3RhdGljJworICAgICAgICA7OworICAgICAgcGdjYyogfCBwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSopCisgICAgICAgICMgUG9ydGxhbmQgR3JvdXAgY29tcGlsZXJzICgqbm90KiB0aGUgUGVudGl1bSBnY2MgY29tcGlsZXIsCisJIyB3aGljaCBsb29rcyB0byBiZSBhIGRlYWQgcHJvamVjdCkKKwlsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKKwlsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1mcGljJworCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLUJzdGF0aWMnCisgICAgICAgIDs7CisgICAgICBjY2MqKQorICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKKyAgICAgICAgIyBBbGwgQWxwaGEgY29kZSBpcyBQSUMuCisgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLW5vbl9zaGFyZWQnCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCisgICAgICAjIEFsbCBPU0YvMSBjb2RlIGlzIFBJQy4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1LUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBmNzcqIHwgZjkwKiB8IGY5NSopCisJbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1Rb3B0aW9uIGxkICc7OworICAgICAgKikKKwlsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCc7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVFvcHRpb24gbGQgJworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLUtQSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKwlsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1LY29uZm9ybV9waWMnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgdW5peHdhcmUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IE9wZW5VTklYKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctS1BJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgdW5pY29zKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJworICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0dDSj1ubworICAgICAgOzsKKworICAgIHV0czQqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctcGljJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0dDSj1ubworICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0oiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSiIgPiY2CisKKyMKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KKyMKK2lmIHRlc3QgLW4gIiRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0oiOyB0aGVuCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSiB3b3JrcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIHdvcmtzLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19HQ0orc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfR0NKPW5vCisgIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9IiRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0oiCisgICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgorICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KKyAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKKyAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCisgICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOjE1Nzc3OiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgY29uZnRlc3QuZXJyID4mNQorICAgZWNobyAiJGFzX21lOjE1NzgxOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgIiRhY19vdXRmaWxlIjsgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3Mgb3RoZXIgdGhhbiB0aGUgdXN1YWwgb3V0cHV0LgorICAgICAkZWNobyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfR0NKPXllcworICAgICBmaQorICAgZmkKKyAgICRybSBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19HQ0oiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0dDSiIgPiY2CisKK2lmIHRlc3QgeCIkbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfR0NKIiA9IHh5ZXM7IHRoZW4KKyAgICBjYXNlICRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0ogaW4KKyAgICAgIiIgfCAiICIqKSA7OworICAgICAqKSBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9IiAkbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIiA7OworICAgICBlc2FjCitlbHNlCisgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPQorICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRfR0NKPW5vCitmaQorCitmaQorY2FzZSAkaG9zdF9vcyBpbgorICAjIEZvciBwbGF0Zm9ybXMgd2hpY2ggZG8gbm90IHN1cHBvcnQgUElDLCAtRFBJQyBpcyBtZWFuaW5nbGVzczoKKyAgKmRqZ3BwKikKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9CisgICAgOzsKKyAgKikKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9IiRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0oiCisgICAgOzsKK2VzYWMKKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHN0YXRpYyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIword2w9JGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKIGV2YWwgbHRfdG1wX3N0YXRpY19mbGFnPVwiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSlwiCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3Jrcy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfR0NKK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0dDSj1ubworICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgIExERkxBR1M9IiRMREZMQUdTICRsdF90bXBfc3RhdGljX2ZsYWciCisgICBwcmludGYgIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgaWYgKGV2YWwgJGFjX2xpbmsgMj5jb25mdGVzdC5lcnIpICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgICAgICMgVGhlIGxpbmtlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgorICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQorICAgICAgICRlY2hvICJYJF9sdF9saW5rZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+IGNvbmZ0ZXN0LmV4cAorICAgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICAgIGlmIGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19HQ0o9eWVzCisgICAgICAgZmkKKyAgICAgZWxzZQorICAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0dDSj15ZXMKKyAgICAgZmkKKyAgIGZpCisgICAkcm0gY29uZnRlc3QqCisgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0dDSiIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfR0NKIiA+JjYKKworaWYgdGVzdCB4IiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19HQ0oiID0geHllczsgdGhlbgorICAgIDoKK2Vsc2UKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9CitmaQorCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfY3ZfcHJvZ19jb21waWxlcl9jX29fR0NKK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0dDSj1ubworICAgJHJtIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCisgICBta2RpciBjb25mdGVzdAorICAgY2QgY29uZnRlc3QKKyAgIG1rZGlyIG91dAorICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOjE1ODgxOiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6MTU4ODU6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQKKyAgIHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgICRlY2hvICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgb3V0L2NvbmZ0ZXN0LmVyciA+b3V0L2NvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVyMiB8fCBkaWZmIG91dC9jb25mdGVzdC5leHAgb3V0L2NvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fR0NKPXllcworICAgICBmaQorICAgZmkKKyAgIGNobW9kIHUrdyAuIDI+JjUKKyAgICRybSBjb25mdGVzdCoKKyAgICMgU0dJIEMrKyBjb21waWxlciB3aWxsIGNyZWF0ZSBkaXJlY3Rvcnkgb3V0L2lpX2ZpbGVzLyBmb3IKKyAgICMgdGVtcGxhdGUgaW5zdGFudGlhdGlvbgorICAgdGVzdCAtZCBvdXQvaWlfZmlsZXMgJiYgJHJtIG91dC9paV9maWxlcy8qICYmIHJtZGlyIG91dC9paV9maWxlcworICAgJHJtIG91dC8qICYmIHJtZGlyIG91dAorICAgY2QgLi4KKyAgIHJtZGlyIGNvbmZ0ZXN0CisgICAkcm0gY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fR0NKIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19HQ0oiID4mNgorCisKK2hhcmRfbGlua3M9Im5vdHRlc3RlZCIKK2lmIHRlc3QgIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19HQ0oiID0gbm8gJiYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCisgICMgZG8gbm90IG92ZXJ3cml0ZSB0aGUgdmFsdWUgb2YgbmVlZF9sb2NrcyBwcm92aWRlZCBieSB0aGUgdXNlcgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzLi4uICRFQ0hPX0MiID4mNgorICBoYXJkX2xpbmtzPXllcworICAkcm0gY29uZnRlc3QqCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCisgIHRvdWNoIGNvbmZ0ZXN0LmEKKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+JjUgfHwgaGFyZF9saW5rcz1ubworICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkaGFyZF9saW5rcyIgPiY1CitlY2hvICIke0VDSE9fVH0kaGFyZF9saW5rcyIgPiY2CisgIGlmIHRlc3QgIiRoYXJkX2xpbmtzIiA9IG5vOyB0aGVuCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mMjt9CisgICAgbmVlZF9sb2Nrcz13YXJuCisgIGZpCitlbHNlCisgIG5lZWRfbG9ja3M9bm8KK2ZpCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gJEVDSE9fQyIgPiY2CisKKyAgcnVucGF0aF92YXI9CisgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0KKyAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19HQ0o9bm8KKyAgYXJjaGl2ZV9jbWRzX0dDSj0KKyAgYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9CisgIG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHNfR0NKPQorICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19HQ0o9CisgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0o9CisgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0KKyAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjX0dDSj0KKyAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9CisgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfR0NKPQorICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0dDSj0KKyAgaGFyZGNvZGVfZGlyZWN0X0dDSj1ubworICBoYXJkY29kZV9taW51c19MX0dDSj1ubworICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj11bnN1cHBvcnRlZAorICBsaW5rX2FsbF9kZXBsaWJzX0dDSj11bmtub3duCisgIGhhcmRjb2RlX2F1dG9tYXRpY19HQ0o9bm8KKyAgbW9kdWxlX2NtZHNfR0NKPQorICBtb2R1bGVfZXhwc3ltX2NtZHNfR0NKPQorICBhbHdheXNfZXhwb3J0X3N5bWJvbHNfR0NKPW5vCisgIGV4cG9ydF9zeW1ib2xzX2NtZHNfR0NKPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgICMgaW5jbHVkZV9leHBzeW1zIHNob3VsZCBiZSBhIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIHN5bWJvbHMgdG8gYmUgKmFsd2F5cyoKKyAgIyBpbmNsdWRlZCBpbiB0aGUgc3ltYm9sIGxpc3QKKyAgaW5jbHVkZV9leHBzeW1zX0dDSj0KKyAgIyBleGNsdWRlX2V4cHN5bXMgY2FuIGJlIGFuIGV4dGVuZGVkIHJlZ2V4cCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUKKyAgIyBpdCB3aWxsIGJlIHdyYXBwZWQgYnkgYCAoJyBhbmQgYCkkJywgc28gb25lIG11c3Qgbm90IG1hdGNoIGJlZ2lubmluZyBvcgorICAjIGVuZCBvZiBsaW5lLiAgRXhhbXBsZTogYGF8YmN8LipkLionIHdpbGwgZXhjbHVkZSB0aGUgc3ltYm9scyBgYScgYW5kIGBiYycsCisgICMgYXMgd2VsbCBhcyBhbnkgc3ltYm9sIHRoYXQgY29udGFpbnMgYGQnLgorICBleGNsdWRlX2V4cHN5bXNfR0NKPSJfR0xPQkFMX09GRlNFVF9UQUJMRV8iCisgICMgQWx0aG91Z2ggX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGlzIGEgdmFsaWQgc3ltYm9sIEMgbmFtZSwgbW9zdCBhLm91dAorICAjIHBsYXRmb3JtcyAoYWIpdXNlIGl0IGluIFBJQyBjb2RlLCBidXQgdGhlaXIgbGlua2VycyBnZXQgY29uZnVzZWQgaWYKKyAgIyB0aGUgc3ltYm9sIGlzIGV4cGxpY2l0bHkgcmVmZXJlbmNlZC4gIFNpbmNlIHBvcnRhYmxlIGNvZGUgY2Fubm90CisgICMgcmVseSBvbiB0aGlzIHN5bWJvbCBuYW1lLCBpdCdzIHByb2JhYmx5IGZpbmUgdG8gbmV2ZXIgaW5jbHVkZSBpdCBpbgorICAjIHByZWxvYWRlZCBzeW1ib2wgdGFibGVzLgorICBleHRyYWN0X2V4cHN5bXNfY21kcz0KKyAgIyBKdXN0IGJlaW5nIHBhcmFub2lkIGFib3V0IGVuc3VyaW5nIHRoYXQgY2NfYmFzZW5hbWUgaXMgc2V0LgorICBmb3IgY2NfdGVtcCBpbiAkY29tcGlsZXIiIjsgZG8KKyAgY2FzZSAkY2NfdGVtcCBpbgorICAgIGNvbXBpbGUgfCAqW1xcL11jb21waWxlIHwgY2NhY2hlIHwgKltcXC9dY2NhY2hlICkgOzsKKyAgICBkaXN0Y2MgfCAqW1xcL11kaXN0Y2MgfCBwdXJpZnkgfCAqW1xcL11wdXJpZnkgKSA7OworICAgIFwtKikgOzsKKyAgICAqKSBicmVhazs7CisgIGVzYWMKK2RvbmUKK2NjX2Jhc2VuYW1lPWAkZWNobyAiWCRjY190ZW1wIiB8ICRYc2VkIC1lICdzJS4qLyUlJyAtZSAicyVeJGhvc3RfYWxpYXMtJSUiYAorCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICAgICMgRklYTUU6IHRoZSBNU1ZDKysgcG9ydCBoYXNuJ3QgYmVlbiB0ZXN0ZWQgaW4gYSBsb29vb25nIHRpbWUKKyAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZworICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCisgICAgaWYgdGVzdCAiJEdDQyIgIT0geWVzOyB0aGVuCisgICAgICB3aXRoX2dudV9sZD1ubworICAgIGZpCisgICAgOzsKKyAgaW50ZXJpeCopCisgICAgIyB3ZSBqdXN0IGhvcGUvYXNzdW1lIHRoaXMgaXMgZ2NjIGFuZCBub3QgYzg5ICg9IE1TVkMrKykKKyAgICB3aXRoX2dudV9sZD15ZXMKKyAgICA7OworICBvcGVuYnNkKikKKyAgICB3aXRoX2dudV9sZD1ubworICAgIDs7CisgIGVzYWMKKworICBsZF9zaGxpYnNfR0NKPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgIyBJZiBhcmNoaXZlX2NtZHMgcnVucyBMRCwgbm90IENDLCB3bGFyYyBzaG91bGQgYmUgZW1wdHkKKyAgICB3bGFyYz0nJHt3bH0nCisKKyAgICAjIFNldCBzb21lIGRlZmF1bHRzIGZvciBHTlUgbGQgd2l0aCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LiBUaGVzZQorICAgICMgYXJlIHJlc2V0IGxhdGVyIGlmIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIFB1dHRpbmcgdGhlbQorICAgICMgaGVyZSBhbGxvd3MgdGhlbSB0byBiZSBvdmVycmlkZGVuIGlmIG5lY2Vzc2FyeS4KKyAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJworICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKyAgICAjIGFuY2llbnQgR05VIGxkIGRpZG4ndCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCisgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KKwl3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19HQ0o9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisgICAgICBlbHNlCisgIAl3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19HQ0o9CisgICAgZmkKKyAgICBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9bm8KKyAgICBjYXNlIGAkTEQgLXYgMj4vZGV2L251bGxgIGluCisgICAgICAqXCBbMDFdLiogfCAqXCAyLlswLTldLiogfCAqXCAyLjEwLiopIDs7ICMgY2F0Y2ggdmVyc2lvbnMgPCAyLjExCisgICAgICAqXCAyLjExLjkzLjAuMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIFJINy4zIC4uLgorICAgICAgKlwgMi4xMS45Mi4wLjEyXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgTWFuZHJha2UgOC4yIC4uLgorICAgICAgKlwgMi4xMS4qKSA7OyAjIG90aGVyIDIuMTEgdmVyc2lvbnMKKyAgICAgICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsKKyAgICBlc2FjCisKKyAgICAjIFNlZSBpZiBHTlUgbGQgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4MyogfCBhaXg0KiB8IGFpeDUqKQorICAgICAgIyBPbiBBSVgvUFBDLCB0aGUgR05VIGxpbmtlciBpcyB2ZXJ5IGJyb2tlbgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0OyB0aGVuCisJbGRfc2hsaWJzX0dDSj1ubworCWNhdCA8PEVPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiB0aGUgR05VIGxpbmtlciwgYXQgbGVhc3QgdXAgdG8gcmVsZWFzZSAyLjkuMSwgaXMgcmVwb3J0ZWQKKyoqKiB0byBiZSB1bmFibGUgdG8gcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gQUlYLgorKioqIFRoZXJlZm9yZSwgbGlidG9vbCBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgSWYgeW91CisqKiogcmVhbGx5IGNhcmUgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIHlvdSBtYXkgd2FudCB0byBtb2RpZnkgeW91ciBQQVRICisqKiogc28gdGhhdCBhIG5vbi1HTlUgbGlua2VyIGlzIGZvdW5kLCBhbmQgdGhlbiByZXN0YXJ0LgorCitFT0YKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckcm0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX21pbnVzX0xfR0NKPXllcworCisgICAgICAjIFNhbXVlbCBBLiBGYWx2byBJSSA8a2M1dGphQGRvbHBoaW4ub3BlbnByb2plY3RzLm5ldD4gcmVwb3J0cworICAgICAgIyB0aGF0IHRoZSBzZW1hbnRpY3Mgb2YgZHluYW1pYyBsaWJyYXJpZXMgb24gQW1pZ2FPUywgYXQgbGVhc3QgdXAKKyAgICAgICMgdG8gdmVyc2lvbiA0LCBpcyB0byBzaGFyZSBkYXRhIGFtb25nIG11bHRpcGxlIHByb2dyYW1zIGxpbmtlZAorICAgICAgIyB3aXRoIHRoZSBzYW1lIGR5bmFtaWMgbGlicmFyeS4gIFNpbmNlIHRoaXMgZG9lc24ndCBtYXRjaCB0aGUKKyAgICAgICMgYmVoYXZpb3Igb2Ygc2hhcmVkIGxpYnJhcmllcyBvbiBvdGhlciBwbGF0Zm9ybXMsIHdlIGNhbid0IHVzZQorICAgICAgIyB0aGVtLgorICAgICAgbGRfc2hsaWJzX0dDSj1ubworICAgICAgOzsKKworICAgIGJlb3MqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPXVuc3VwcG9ydGVkCisJIyBKb3NlcGggQmVja2VuYmFjaCA8anJiM0BiZXN0LmNvbT4gc2F5cyBzb21lIHJlbGVhc2VzIG9mIGdjYworCSMgc3VwcG9ydCAtLXVuZGVmaW5lZC4gIFRoaXMgZGVzZXJ2ZXMgc29tZSBpbnZlc3RpZ2F0aW9uLiAgRklYTUUKKwlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLW5vc3RhcnQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICBlbHNlCisJbGRfc2hsaWJzX0dDSj1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgICAjIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgR0NKKSBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywKKyAgICAgICMgYXMgdGhlcmUgaXMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLUwkbGliZGlyJworICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPXVuc3VwcG9ydGVkCisgICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHNfR0NKPW5vCisgICAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0dDSj15ZXMKKyAgICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfR0NKPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW0JDREdSU10gL3MvLiogXChbXiBdKlwpL1wxIERBVEEvJ1wnJyB8ICRTRUQgLWUgJ1wnJy9eW0FJVFddIC9zLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisJIyBJZiB0aGUgZXhwb3J0LXN5bWJvbHMgZmlsZSBhbHJlYWR5IGlzIGEgLmRlZiBmaWxlICgxc3QgbGluZQorCSMgaXMgRVhQT1JUUyksIHVzZSBpdCBhcyBpczsgb3RoZXJ3aXNlLCBwcmVwZW5kLi4uCisJYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICBjcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJZWxzZQorCSAgZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJICBjYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCWZpfgorCSRDQyAtc2hhcmVkICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworICAgICAgZWxzZQorCWxkX3NobGlic19HQ0o9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgaW50ZXJpeDMqKQorICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj1ubworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS1ycGF0aCwkbGliZGlyJworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0nJHt3bH0tRScKKyAgICAgICMgSGFjazogT24gSW50ZXJpeCAzLngsIHdlIGNhbm5vdCBjb21waWxlIFBJQyBiZWNhdXNlIG9mIGEgYnJva2VuIGdjYy4KKyAgICAgICMgSW5zdGVhZCwgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGF0IGFuIGltYWdlIGJhc2UgKDB4MTAwMDAwMDAgYnkKKyAgICAgICMgZGVmYXVsdCkgYW5kIHJlbG9jYXRlZCBpZiB0aGV5IGNvbmZsaWN0LCB3aGljaCBpcyBhIHNsb3cgdmVyeSBtZW1vcnkKKyAgICAgICMgY29uc3VtaW5nIGFuZCBmcmFnbWVudGluZyBwcm9jZXNzLiAgVG8gYXZvaWQgdGhpcywgd2UgcGljayBhIHJhbmRvbSwKKyAgICAgICMgMjU2IEtpQi1hbGlnbmVkIGltYWdlIGJhc2UgYmV0d2VlbiAweDUwMDAwMDAwIGFuZCAweDZGRkMwMDAwIGF0IGxpbmsKKyAgICAgICMgdGltZS4gIE1vdmluZyB1cCBmcm9tIDB4MTAwMDAwMDAgYWxzbyBhbGxvd3MgbW9yZSBzYnJrKDIpIHNwYWNlLgorICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworICAgICAgOzsKKworICAgIGxpbnV4KikKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCXRtcF9hZGRmbGFnPQorCWNhc2UgJGNjX2Jhc2VuYW1lLCRob3N0X2NwdSBpbgorCXBnY2MqKQkJCQkjIFBvcnRsYW5kIEdyb3VwIEMgY29tcGlsZXIKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcnCisJICA7OworCXBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KikJIyBQb3J0bGFuZCBHcm91cCBmNzcgYW5kIGY5MCBjb21waWxlcnMKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcgLU1ub21haW4nIDs7CisJZWNjKixpYTY0KiB8IGljYyosaWE2NCopCQkjIEludGVsIEMgY29tcGlsZXIgb24gaWE2NAorCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljJyA7OworCWVmYyosaWE2NCogfCBpZm9ydCosaWE2NCopCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlciBvbiBpYTY0CisJICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMgLW5vZm9yX21haW4nIDs7CisJaWZjKiB8IGlmb3J0KikJCQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIKKwkgIHRtcF9hZGRmbGFnPScgLW5vZm9yX21haW4nIDs7CisJZXNhYworCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkJyIkdG1wX2FkZGZsYWciJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKworCWlmIHRlc3QgJHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyA9IHllczsgdGhlbgorCSAgYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorICBjYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisgICRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICRDQyAtc2hhcmVkJyIkdG1wX2FkZGZsYWciJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tdmVyc2lvbi1zY3JpcHQgJHt3bH0kb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKKwlmaQorICAgICAgZWxzZQorCWxkX3NobGlic19HQ0o9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgbmV0YnNkKikKKyAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUJzaGFyZWFibGUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbyAkbGliJworCXdsYXJjPQorICAgICAgZWxzZQorCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBpZiAkTEQgLXYgMj4mMSB8IGdyZXAgJ0JGRCAyXC44JyA+IC9kZXYvbnVsbDsgdGhlbgorCWxkX3NobGlic19HQ0o9bm8KKwljYXQgPDxFT0YgMT4mMgorCisqKiogV2FybmluZzogVGhlIHJlbGVhc2VzIDIuOC4qIG9mIHRoZSBHTlUgbGlua2VyIGNhbm5vdCByZWxpYWJseQorKioqIGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNvbGFyaXMgc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAorKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQorKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi45LjEgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKKyoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCisqKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KKworRU9GCisgICAgICBlbGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnNfR0NKPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCopCisgICAgICBjYXNlIGAkTEQgLXYgMj4mMWAgaW4KKyAgICAgICAgKlwgWzAxXS4qIHwgKlwgMi5bMC05XS4qIHwgKlwgMi4xWzAtNV0uKikKKwlsZF9zaGxpYnNfR0NKPW5vCisJY2F0IDw8X0xUX0VPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiBSZWxlYXNlcyBvZiB0aGUgR05VIGxpbmtlciBwcmlvciB0byAyLjE2LjkxLjAuMyBjYW4gbm90CisqKiogcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU0NPIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKKyoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKKyoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuMTYuOTEuMC4zIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5CisqKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcworKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK19MVF9FT0YKKwk7OworCSopCisJICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9J2B0ZXN0IC16ICIkU0NPQUJTUEFUSCIgJiYgZWNobyAke3dsfS1ycGF0aCwkbGliZGlyYCcKKwkgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliJworCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSwtcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgIGVsc2UKKwkgICAgbGRfc2hsaWJzX0dDSj1ubworCSAgZmkKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgd2xhcmM9CisgICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCWxkX3NobGlic19HQ0o9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgIiRsZF9zaGxpYnNfR0NKIiA9IG5vOyB0aGVuCisgICAgICBydW5wYXRoX3Zhcj0KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPQorICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0KKyAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0KKyAgICBmaQorICBlbHNlCisgICAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgzKikKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj11bnN1cHBvcnRlZAorICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0dDSj15ZXMKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckTEQgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1iRTokZXhwb3J0X3N5bWJvbHMgLVQ1MTIgLUg1MTIgLWJNOlNSRX4kQVIgJEFSX0ZMQUdTICRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKyAgICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCisgICAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCisgICAgICBoYXJkY29kZV9taW51c19MX0dDSj15ZXMKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgLXogIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyI7IHRoZW4KKwkjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKKwkjIGJyb2tlbiBjb2xsZWN0Mi4KKwloYXJkY29kZV9kaXJlY3RfR0NKPXVuc3VwcG9ydGVkCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFpeDQqIHwgYWl4NSopCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKKwkjIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KKwlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisJZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKKwlub19lbnRyeV9mbGFnPSIiCisgICAgICBlbHNlCisJIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgIi1DIiBvcHRpb24uCisJIyAtQyBtZWFucyBkZW1hbmdsZSB0byBBSVggbm0sIGJ1dCBtZWFucyBkb24ndCBkZW1hbmdsZSB3aXRoIEdOVSBubQorCWlmICROTSAtViAyPiYxIHwgZ3JlcCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgZXhwb3J0X3N5bWJvbHNfY21kc19HQ0o9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJDIgPT0gIlQiKSB8fCAoXCQyID09ICJEIikgfHwgKFwkMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWVsc2UKKwkgIGV4cG9ydF9zeW1ib2xzX2NtZHNfR0NKPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkMiA9PSAiVCIpIHx8IChcJDIgPT0gIkQiKSB8fCAoXCQyID09ICJCIikpICYmIChzdWJzdHIoXCQzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisJZmkKKwlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisKKwkjIFRlc3QgaWYgd2UgYXJlIHRyeWluZyB0byB1c2UgcnVuIHRpbWUgbGlua2luZyBvciBub3JtYWwKKwkjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKKwkjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgorCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMjNdfGFpeDQuWzIzXS4qfGFpeDUqKQorCSAgZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCisgIAkgIGlmICh0ZXN0ICRsZF9mbGFnID0gIi1icnRsIiB8fCB0ZXN0ICRsZF9mbGFnID0gIi1XbCwtYnJ0bCIpOyB0aGVuCisgIAkgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKKyAgCSAgICBicmVhaworICAJICBmaQorCSAgZG9uZQorCSAgOzsKKwllc2FjCisKKwlleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JworCW5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKKyAgICAgIGZpCisKKyAgICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KKyAgICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQorICAgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KKyAgICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90CisgICAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KKworICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJworICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPSc6JworICAgICAgbGlua19hbGxfZGVwbGlic19HQ0o9eWVzCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlswMTJdfGFpeDQuWzAxMl0uKikKKwkjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKKwkjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKKwkgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKwkgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmIFwKKyAgCSAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgZ3JlcCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKKwkgIHRoZW4KKyAgCSAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCisgIAkgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCisJICBlbHNlCisgIAkgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKKyAgCSAgaGFyZGNvZGVfZGlyZWN0X0dDSj11bnN1cHBvcnRlZAorICAJICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCisgIAkgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCisgIAkgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZworICAJICBoYXJkY29kZV9taW51c19MX0dDSj15ZXMKKyAgCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1MJGxpYmRpcicKKyAgCSAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9CisJICBmaQorCSAgOzsKKwllc2FjCisJc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCisJaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKKwlmaQorICAgICAgZWxzZQorCSMgbm90IHVzaW5nIGdjYworCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgIAkjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQorICAJIyBjaG9rZXMgb24gLVdsLC1HLiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgY29ycmVjdDoKKwkgIHNoYXJlZF9mbGFnPSctRycKKwllbHNlCisJICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LUcnCisJICBlbHNlCisJICAgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCisJICBmaQorCWZpCisgICAgICBmaQorCisgICAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgZG9lcyBub3QgZXhwb3J0IHN5bWJvbHMgYmVnaW5uaW5nIHdpdGgKKyAgICAgICMgdW5kZXJzY29yZSAoXyksIHNvIGl0IGlzIGJldHRlciB0byBnZW5lcmF0ZSBhIGxpc3Qgb2Ygc3ltYm9scyB0byBleHBvcnQuCisgICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHNfR0NKPXllcworICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCisJIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCWFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0nLWJlcm9rJworICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgorICAgICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisKK2FpeF9saWJwYXRoPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQorfSdgCisjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQorfSdgOyBmaQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2lmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQorCisgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisJYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9IlwkQ0MiJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGVjaG8gIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCisgICAgICAgZWxzZQorCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCisJICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9Ii16IG5vZGVmcyIKKwkgIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyAke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIgorCWVsc2UKKwkgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCisJIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisKK2FpeF9saWJwYXRoPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQorfSdgCisjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQorfSdgOyBmaQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2lmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQorCisJIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCSAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKKwkgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwkgIG5vX3VuZGVmaW5lZF9mbGFnX0dDSj0nICR7d2x9LWJlcm5vdG9rJworCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPScgJHt3bH0tYmVyb2snCisJICAjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0nJGNvbnZlbmllbmNlJworCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKPXllcworCSAgIyBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcyBpdHMgc2hhcmVkIGxpYnJhcmllcy4KKwkgIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisJZmkKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckcm0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX21pbnVzX0xfR0NKPXllcworICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBkaWZmZXJlbnQgc2VtYW50aWNzIG9uIHRoZSBHTlUgbGQgc2VjdGlvbgorICAgICAgbGRfc2hsaWJzX0dDSj1ubworICAgICAgOzsKKworICAgIGJzZGlbNDVdKikKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0o9LXJkeW5hbWljCisgICAgICA7OworCisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICAgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCisgICAgICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCisgICAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyAnCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9dW5zdXBwb3J0ZWQKKyAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCisgICAgICBsaWJleHQ9bGliCisgICAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KKyAgICAgIHNocmV4dF9jbWRzPSIuZGxsIgorICAgICAgIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgorICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1vICRsaWIgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzIGBlY2hvICIkZGVwbGlicyIgfCAkU0VEIC1lICdcJydzLyAtbGMkLy8nXCcnYCAtbGluayAtZGxsfmxpbmtuYW1lcz0nCisgICAgICAjIFRoZSBsaW5rZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgLmxpYiBmaWxlIGlmIHdlIGJ1aWxkIGEgRExMLgorICAgICAgb2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kc19HQ0o9J3RydWUnCisgICAgICAjIEZJWE1FOiBTaG91bGQgbGV0IHRoZSB1c2VyIHNwZWNpZnkgdGhlIGxpYiBwcm9ncmFtLgorICAgICAgb2xkX2FyY2hpdmVfY21kc19HQ0o9J2xpYiAvT1VUOiRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicycKKyAgICAgIGZpeF9zcmNmaWxlX3BhdGhfR0NKPSdgY3lncGF0aCAtdyAiJHNyY2ZpbGUiYCcKKyAgICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfR0NKPXllcworICAgICAgOzsKKworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuWzAxMl0pCisgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JyR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJworICAgICAgICAgOzsKKyAgICAgICAqKSAjIERhcndpbiAxLjMgb24KKyAgICAgICAgIGlmIHRlc3QgLXogJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IDsgdGhlbgorICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJworICAgICAgICAgZWxzZQorICAgICAgICAgICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSBpbgorICAgICAgICAgICAgIDEwLlswMTJdKQorICAgICAgICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKKyAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgMTAuKikKKyAgICAgICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnCisgICAgICAgICAgICAgICA7OworICAgICAgICAgICBlc2FjCisgICAgICAgICBmaQorICAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSj1ubworICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj1ubworICAgICAgaGFyZGNvZGVfYXV0b21hdGljX0dDSj15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPXVuc3VwcG9ydGVkCisgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19HQ0o9JycKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnNfR0NKPXllcworICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIDsgdGhlbgorICAgIAlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKKyAgICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmcnCisgICAgICBtb2R1bGVfY21kc19HQ0o9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJworICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICAgIG1vZHVsZV9leHBzeW1fY21kc19HQ0o9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDICRhbGxvd191bmRlZmluZWRfZmxhZyAgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICBlbHNlCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICB4bGMqKQorICAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCisgICAgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXFta3Nocm9iaiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9YGVjaG8gJHJwYXRoLyRzb25hbWVgICR2ZXJzdHJpbmcnCisgICAgICAgICBtb2R1bGVfY21kc19HQ0o9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJworICAgICAgICAgICMgRG9uJ3QgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGxkIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgZmxhZywgaXQgZG9lc24ndCBleGlzdCBpbiBvbGRlciBkYXJ3aW4gbGRzCisgICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLXFta3Nocm9iaiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9JHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgICAgICAgbW9kdWxlX2V4cHN5bV9jbWRzX0dDSj0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgICAgIDs7CisgICAgICAgKikKKyAgICAgICAgIGxkX3NobGlic19HQ0o9bm8KKyAgICAgICAgICA7OworICAgICAgZXNhYworICAgIGZpCisgICAgICA7OworCisgICAgZGd1eCopCisgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KKyAgICAgIDs7CisKKyAgICBmcmVlYnNkMSopCisgICAgICBsZF9zaGxpYnNfR0NKPW5vCisgICAgICA7OworCisgICAgIyBGcmVlQlNEIDIuMi5bMDEyXSBhbGxvd3MgdXMgdG8gaW5jbHVkZSBjKytydDAubyB0byBnZXQgQysrIGNvbnN0cnVjdG9yCisgICAgIyBzdXBwb3J0LiAgRnV0dXJlIHZlcnNpb25zIGRvIHRoaXMgYXV0b21hdGljYWxseSwgYnV0IGFuIGV4cGxpY2l0IGMrK3J0MC5vCisgICAgIyBkb2VzIG5vdCBicmVhayBhbnl0aGluZywgYW5kIGhlbHBzIHNpZ25pZmljYW50bHkgKGF0IHRoZSBjb3N0IG9mIGEgbGl0dGxlCisgICAgIyBleHRyYSBzcGFjZSkuCisgICAgZnJlZWJzZDIuMiopCisgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC91c3IvbGliL2MrK3J0MC5vJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1SJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubworICAgICAgOzsKKworICAgICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KKyAgICBmcmVlYnNkMiopCisgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKKyAgICAgIGhhcmRjb2RlX21pbnVzX0xfR0NKPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KKyAgICAgIDs7CisKKyAgICAjIEZyZWVCU0QgMyBhbmQgZ3JlYXRlciB1c2VzIGdjYyAtc2hhcmVkIHRvIGRvIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgZnJlZWJzZCogfCBrZnJlZWJzZCotZ251IHwgZHJhZ29uZmx5KikKKyAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1SJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubworICAgICAgOzsKKworICAgIGhwdXg5KikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0dDSj0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgLWZQSUMgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHNfR0NKPSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kTEQgLWIgK2IgJGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0dDSj06CisgICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcworCisgICAgICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisgICAgICBoYXJkY29kZV9taW51c19MX0dDSj15ZXMKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LUUnCisgICAgICA7OworCisgICAgaHB1eDEwKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtYiAraCAkc29uYW1lICtiICRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPToKKworCWhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCisJZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0nJHt3bH0tRScKKworCSMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisJIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisJaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCisgICAgICBmaQorICAgICAgOzsKKworICAgIGhwdXgxMSopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAtYSAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KikKKwkgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwlpYTY0KikKKwkgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwkqKQorCSAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJZXNhYworICAgICAgZWxzZQorCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCopCisJICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWlhNjQqKQorCSAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwkqKQorCSAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9OgorCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KnxpYTY0KikKKwkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfR0NKPScrYiAkbGliZGlyJworCSAgaGFyZGNvZGVfZGlyZWN0X0dDSj1ubworCSAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KKwkgIDs7CisJKikKKwkgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCisJICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPScke3dsfS1FJworCisJICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorCSAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisJICBoYXJkY29kZV9taW51c19MX0dDSj15ZXMKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0dDSj0nLXJwYXRoICRsaWJkaXInCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPToKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnNfR0NKPXllcworICAgICAgOzsKKworICAgIG5ldGJzZCopCisgICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICMgYS5vdXQKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHNfR0NKPSckTEQgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAgICAgIyBFTEYKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisgICAgICA7OworCisgICAgbmV3c29zNikKKyAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9OgorICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KKyAgICAgIDs7CisKKyAgICBvcGVuYnNkKikKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubworICAgICAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMnCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0nJHt3bH0tRScKKyAgICAgIGVsc2UKKyAgICAgICBjYXNlICRob3N0X29zIGluCisJIG9wZW5ic2RbMDFdLiogfCBvcGVuYnNkMi5bMC03XSB8IG9wZW5ic2QyLlswLTddLiopCisJICAgYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLVIkbGliZGlyJworCSAgIDs7CisJICopCisJICAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgIDs7CisgICAgICAgZXNhYworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBvczIqKQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX21pbnVzX0xfR0NKPXllcworICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPXVuc3VwcG9ydGVkCisgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckZWNobyAiTElCUkFSWSAkbGlibmFtZSBJTklUSU5TVEFOQ0UiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBEQVRBID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBFWFBPUlRTID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lbXhleHAgJGxpYm9ianMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRDQyAtWmRsbCAtWmNydGRsbCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCisgICAgICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzX0dDSj0nZW14aW1wIC1vICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmEgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJworICAgICAgOzsKKworICAgIG9zZjMqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZWxzZQorCWFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKwlhcmNoaXZlX2NtZHNfR0NKPSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPToKKyAgICAgIDs7CisKKyAgICBvc2Y0KiB8IG9zZjUqKQkjIGFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIC1tc3ltIGZsYWcKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBlbHNlCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lOyBlY2hvICItaGlkZGVuIj4+ICRsaWIuZXhwfgorCSRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWlucHV0ICRsaWIuZXhwICRsaW5rZXJfZmxhZ3MgJGxpYm9ianMgJGRlcGxpYnMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+JHJtICRsaWIuZXhwJworCisJIyBCb3RoIGMgYW5kIGN4eCBjb21waWxlciBzdXBwb3J0IC1ycGF0aCBkaXJlY3RseQorCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctcnBhdGggJGxpYmRpcicKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0dDSj06CisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBub191bmRlZmluZWRfZmxhZ19HQ0o9JyAteiB0ZXh0JworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwl3bGFyYz0nJHt3bH0nCisJYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSAgJENDIC1zaGFyZWQgJHt3bH0tTSAke3dsfSRsaWIuZXhwICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKKyAgICAgIGVsc2UKKwl3bGFyYz0nJworCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKyAgCSRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfiRybSAkbGliLmV4cCcKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KKyAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIHNvbGFyaXMyLlswLTVdIHwgc29sYXJpczIuWzAtNV0uKikgOzsKKyAgICAgICopCisgCSMgVGhlIGNvbXBpbGVyIGRyaXZlciB3aWxsIGNvbWJpbmUgbGlua2VyIG9wdGlvbnMgc28gd2UKKyAJIyBjYW5ub3QganVzdCBwYXNzIHRoZSBjb252aWVuY2UgbGlicmFyeSBuYW1lcyB0aHJvdWdoCisgCSMgd2l0aG91dCAkd2wsIGlmZiB3ZSBkbyBub3QgbGluayB3aXRoICRMRC4KKyAJIyBMdWNraWx5LCBnY2Mgc3VwcG9ydHMgdGhlIHNhbWUgc3ludGF4IHdlIG5lZWQgZm9yIFN1biBTdHVkaW8uCisgCSMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCisgCWNhc2UgJHdsYXJjIGluCisgCScnKQorIAkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0nLXogYWxsZXh0cmFjdCRjb252ZW5pZW5jZSAteiBkZWZhdWx0ZXh0cmFjdCcgOzsKKyAJKikKKyAJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LXogJHt3bH1hbGxleHRyYWN0YGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LXogJHt3bH1kZWZhdWx0ZXh0cmFjdCcgOzsKKyAJZXNhYyA7OworICAgICAgZXNhYworICAgICAgbGlua19hbGxfZGVwbGlic19HQ0o9eWVzCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIGlmIHRlc3QgIngkaG9zdF92ZW5kb3IiID0geHNlcXVlbnQ7IHRoZW4KKwkjIFVzZSAkQ0MgdG8gbGluayB1bmRlciBzZXF1ZW50LCBiZWNhdXNlIGl0IHRocm93cyBpbiBzb21lIGV4dHJhIC5vCisJIyBmaWxlcyB0aGF0IG1ha2UgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zIHdvcmsuCisJYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1HICR7d2x9LWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHNfR0NKPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzdGF0aWMgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcworICAgICAgaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubworICAgICAgOzsKKworICAgIHN5c3Y0KQorICAgICAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKwlzbmkpCisJICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcyAjIGlzIHRoaXMgcmVhbGx5IHRydWU/Pz8KKwk7OworCXNpZW1lbnMpCisJICAjIyBMRCBpcyBsZCBpdCBtYWtlcyBhIFBMQU1MSUIKKwkgICMjIENDIGp1c3QgbWFrZXMgYSBHcm9zc01vZHVsZS4KKwkgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICByZWxvYWRfY21kc19HQ0o9JyRDQyAtciAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworCSAgaGFyZGNvZGVfZGlyZWN0X0dDSj1ubworICAgICAgICA7OworCW1vdG9yb2xhKQorCSAgYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgaGFyZGNvZGVfZGlyZWN0X0dDSj1ubyAjTW90b3JvbGEgbWFudWFsIHNheXMgeWVzLCBidXQgbXkgdGVzdHMgc2F5IHRoZXkgbGllCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisgICAgICA7OworCisgICAgc3lzdjQuMyopCisgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0nLUJleHBvcnQnCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwloYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubworCXJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisJaGFyZGNvZGVfcnVucGF0aF92YXI9eWVzCisJbGRfc2hsaWJzX0dDSj15ZXMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjQqdXcyKiB8IHN5c3Y1T3BlblVOSVgqIHwgc3lzdjVVbml4V2FyZTcuWzAxXS5bMTBdKiB8IHVuaXh3YXJlNyopCisgICAgICBub191bmRlZmluZWRfZmxhZ19HQ0o9JyR7d2x9LXosdGV4dCcKKyAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSj1ubworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqKQorICAgICAgIyBOb3RlOiBXZSBjYW4gTk9UIHVzZSAteiBkZWZzIGFzIHdlIG1pZ2h0IGRlc2lyZSwgYmVjYXVzZSB3ZSBkbyBub3QKKyAgICAgICMgbGluayB3aXRoIC1sYywgYW5kIHRoYXQgd291bGQgY2F1c2UgYW55IHN5bWJvbHMgdXNlZCBmcm9tIGxpYmMgdG8KKyAgICAgICMgYWx3YXlzIGJlIHVucmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGp1c3QgYWJvdXQgbm8gbGlicmFyeSB3b3VsZAorICAgICAgIyBldmVyIGxpbmsgY29ycmVjdGx5LiAgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCB3ZSB1c2UgLXogdGV4dAorICAgICAgIyB0aG91Z2gsIHdoaWNoIGRvZXMgY2F0Y2ggc29tZSBiYWQgc3ltYm9scyBidXQgaXNuJ3QgYXMgaGVhdnktaGFuZGVkCisgICAgICAjIGFzIC16IGRlZnMuCisgICAgICBub191bmRlZmluZWRfZmxhZ19HQ0o9JyR7d2x9LXosdGV4dCcKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0nJHt3bH0teixub2RlZnMnCisgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sY19HQ0o9bm8KKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nYHRlc3QgLXogIiRTQ09BQlNQQVRIIiAmJiBlY2hvICR7d2x9LVIsJGxpYmRpcmAnCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0dDSj0nOicKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnNfR0NKPXllcworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0nJHt3bH0tQmV4cG9ydCcKKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtRyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgdXRzNCopCisgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgbGRfc2hsaWJzX0dDSj1ubworICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsZF9zaGxpYnNfR0NKIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsZF9zaGxpYnNfR0NKIiA+JjYKK3Rlc3QgIiRsZF9zaGxpYnNfR0NKIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworIworIyBEbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgbGluayBsaWJjPworIworY2FzZSAieCRhcmNoaXZlX2NtZHNfbmVlZF9sY19HQ0oiIGluCit4fHh5ZXMpCisgICMgQXNzdW1lIC1sYyBzaG91bGQgYmUgYWRkZWQKKyAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKPXllcworCisgIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIGNhc2UgJGFyY2hpdmVfY21kc19HQ0ogaW4KKyAgICAqJ34nKikKKyAgICAgICMgRklYTUU6IHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBtdWx0aS1jb21tYW5kIHNlcXVlbmNlcy4KKyAgICAgIDs7CisgICAgJyRDQyAnKikKKyAgICAgICMgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBpbXBsaWNpdGx5IGxpbmtzIHdpdGggLWxjIHNpbmNlIG9uIHNvbWUKKyAgICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYworICAgICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCisgICAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluLi4uICRFQ0hPX0MiID4mNgorICAgICAgJHJtIGNvbmZ0ZXN0KgorICAgICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworICAgICAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9IDI+Y29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIHNvbmFtZT1jb25mdGVzdAorICAgICAgICBsaWI9Y29uZnRlc3QKKyAgICAgICAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0CisgICAgICAgIGRlcGxpYnM9CisgICAgICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSgorCXBpY19mbGFnPSRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0oKKyAgICAgICAgY29tcGlsZXJfZmxhZ3M9LXYKKyAgICAgICAgbGlua2VyX2ZsYWdzPS12CisgICAgICAgIHZlcnN0cmluZz0KKyAgICAgICAgb3V0cHV0X29iamRpcj0uCisgICAgICAgIGxpYm5hbWU9Y29uZnRlc3QKKyAgICAgICAgbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKCisgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0KKyAgICAgICAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYXJjaGl2ZV9jbWRzX0dDSiAyXD5cJjEgXHwgZ3JlcCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxXCIiKSA+JjUKKyAgKGV2YWwgJGFyY2hpdmVfY21kc19HQ0ogMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfQorICAgICAgICB0aGVuCisJICBhcmNoaXZlX2NtZHNfbmVlZF9sY19HQ0o9bm8KKyAgICAgICAgZWxzZQorCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKPXllcworICAgICAgICBmaQorICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKKyAgICAgIGVsc2UKKyAgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisgICAgICBmaQorICAgICAgJHJtIGNvbmZ0ZXN0KgorICAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSiIgPiY1CitlY2hvICIke0VDSE9fVH0kYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKIiA+JjYKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICA7OworZXNhYworCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzLi4uICRFQ0hPX0MiID4mNgorbGlicmFyeV9uYW1lc19zcGVjPQorbGlibmFtZV9zcGVjPSdsaWIkbmFtZScKK3NvbmFtZV9zcGVjPQorc2hyZXh0X2NtZHM9Ii5zbyIKK3Bvc3RpbnN0YWxsX2NtZHM9Citwb3N0dW5pbnN0YWxsX2NtZHM9CitmaW5pc2hfY21kcz0KK2ZpbmlzaF9ldmFsPQorc2hsaWJwYXRoX3Zhcj0KK3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD11bmtub3duCit2ZXJzaW9uX3R5cGU9bm9uZQorZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgorc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIiCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBncmVwICJebGlicmFyaWVzOiIgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCisgIGlmIGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgZ3JlcCAnOycgPi9kZXYvbnVsbCA7IHRoZW4KKyAgICAjIGlmIHRoZSBwYXRoIGNvbnRhaW5zICI7IiB0aGVuIHdlIGFzc3VtZSBpdCB0byBiZSB0aGUgc2VwYXJhdG9yCisgICAgIyBvdGhlcndpc2UgZGVmYXVsdCB0byB0aGUgc3RhbmRhcmQgcGF0aCBzZXBhcmF0b3IgKGkuZS4gIjoiKSAtIGl0IGlzCisgICAgIyBhc3N1bWVkIHRoYXQgbm8gcGFydCBvZiBhIG5vcm1hbCBwYXRobmFtZSBjb250YWlucyAiOyIgYnV0IHRoYXQgc2hvdWxkCisgICAgIyBva2F5IGluIHRoZSByZWFsIHdvcmxkIHdoZXJlICI7IiBpbiBkaXJwYXRocyBpcyBpdHNlbGYgcHJvYmxlbWF0aWMuCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAorICBlbHNlCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICBmaQorZWxzZQorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCitmaQorbmVlZF9saWJfcHJlZml4PXVua25vd24KK2hhcmRjb2RlX2ludG9fbGlicz1ubworCisjIHdoZW4geW91IHNldCBuZWVkX3ZlcnNpb24gdG8gbm8sIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBjYXVzZSAtc2V0X3ZlcnNpb24KKyMgZmxhZ3MgdG8gYmUgbGVmdCB3aXRob3V0IGFyZ3VtZW50cworbmVlZF92ZXJzaW9uPXVua25vd24KKworY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUuYScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisKKyAgIyBBSVggMyBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyB3ZSBhcHBlbmQgYSBtYWpvciB2ZXJzaW9uIHRvIHRoZSBuYW1lLgorICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICA7OworCithaXg0KiB8IGFpeDUqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgIyBBSVggNSBzdXBwb3J0cyBJQTY0CisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZWxzZQorICAgICMgV2l0aCBHQ0MgdXAgdG8gMi45NS54LCBjb2xsZWN0MiB3b3VsZCBjcmVhdGUgYW4gaW1wb3J0IGZpbGUKKyAgICAjIGZvciBkZXBlbmRlbmNlIGxpYnJhcmllcy4gIFRoZSBpbXBvcnQgZmlsZSB3b3VsZCBzdGFydCB3aXRoCisgICAgIyB0aGUgbGluZSBgIyEgLicuICBUaGlzIHdvdWxkIGNhdXNlIHRoZSBnZW5lcmF0ZWQgbGlicmFyeSB0bworICAgICMgZGVwZW5kIG9uIGAuJywgYWx3YXlzIGFuIGludmFsaWQgbGlicmFyeS4gIFRoaXMgd2FzIGZpeGVkIGluCisgICAgIyBkZXZlbG9wbWVudCBzbmFwc2hvdHMgb2YgR0NDIHByaW9yIHRvIDMuMC4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXg0IHwgYWl4NC5bMDFdIHwgYWl4NC5bMDFdLiopCisgICAgICBpZiB7IGVjaG8gJyNpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gOTcpJworCSAgIGVjaG8gJyB5ZXMgJworCSAgIGVjaG8gJyNlbmRpZic7IH0gfCAke0NDfSAtRSAtIHwgZ3JlcCB5ZXMgPiAvZGV2L251bGw7IHRoZW4KKwk6CisgICAgICBlbHNlCisJY2FuX2J1aWxkX3NoYXJlZD1ubworICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworICAgICMgQUlYIChvbiBQb3dlciopIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIGN1cnJlbnRseSB3ZSBjYW4gbm90IGhhcmRjb2RlIGNvcnJlY3QKKyAgICAjIHNvbmFtZSBpbnRvIGV4ZWN1dGFibGUuIFByb2JhYmx5IHdlIGNhbiBhZGQgdmVyc2lvbmluZyBzdXBwb3J0IHRvCisgICAgIyBjb2xsZWN0Miwgc28gYWRkaXRpb25hbCBsaW5rcyBjYW4gYmUgdXNlZnVsIGluIGZ1dHVyZS4KKyAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKyAgICAgICMgSWYgdXNpbmcgcnVuIHRpbWUgbGlua2luZyAob24gQUlYIDQuMiBvciBsYXRlcikgdXNlIGxpYjxuYW1lPi5zbworICAgICAgIyBpbnN0ZWFkIG9mIGxpYjxuYW1lPi5hIHRvIGxldCBwZW9wbGUga25vdyB0aGF0IHRoZXNlIGFyZSBub3QKKyAgICAgICMgdHlwaWNhbCBBSVggc2hhcmVkIGxpYnJhcmllcy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIGVsc2UKKyAgICAgICMgV2UgcHJlc2VydmUgLmEgYXMgZXh0ZW5zaW9uIGZvciBzaGFyZWQgbGlicmFyaWVzIHRocm91Z2ggQUlYNC4yCisgICAgICAjIGFuZCBsYXRlciB3aGVuIHdlIGFyZSBub3QgZG9pbmcgcnVuIHRpbWUgbGlua2luZy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uYSAkbGlibmFtZS5hJworICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBmaQorICAgIHNobGlicGF0aF92YXI9TElCUEFUSAorICBmaQorICA7OworCithbWlnYW9zKikKKyAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5peGxpYnJhcnkgJGxpYm5hbWUuYScKKyAgIyBDcmVhdGUgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSBlbnRyaWVzIGluIC9zeXMvbGlicy4KKyAgZmluaXNoX2V2YWw9J2ZvciBsaWIgaW4gYGxzICRsaWJkaXIvKi5peGxpYnJhcnkgMj4vZGV2L251bGxgOyBkbyBsaWJuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ1wnJ3MlXi4qL1woW14vXSpcKVwuaXhsaWJyYXJ5JCVcMSUnXCcnYDsgdGVzdCAkcm0gL3N5cy9saWJzLyR7bGlibmFtZX1faXhsaWJyYXJ5LmE7ICRzaG93ICJjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIjsgY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSB8fCBleGl0IDE7IGRvbmUnCisgIDs7CisKK2Jlb3MqKQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCisgIHNobGlicGF0aF92YXI9TElCUkFSWV9QQVRICisgIDs7CisKK2JzZGlbNDVdKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKKyAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93CisgICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcworICA7OworCitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgIHZlcnNpb25fdHlwZT13aW5kb3dzCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX3ZlcnNpb249bm8KKyAgbmVlZF9saWJfcHJlZml4PW5vCisKKyAgY2FzZSAkR0NDLCRob3N0X29zIGluCisgIHllcyxjeWd3aW4qIHwgeWVzLG1pbmd3KiB8IHllcyxwdzMyKikKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLmRsbC5hJworICAgICMgRExMIGlzIGluc3RhbGxlZCB0byAkKGxpYmRpcikvLi4vYmluIGJ5IHBvc3RpbnN0YWxsX2NtZHMKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSdiYXNlX2ZpbGU9YGJhc2VuYW1lIFwke2ZpbGV9YH4KKyAgICAgIGRscGF0aD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGRpci8nXCcnXCR7YmFzZV9maWxlfSdcJydpO2VjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KKyAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgorICAgICAgJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgXCRkbGRpci8kZGxuYW1lfgorICAgICAgY2htb2QgYSt4IFwkZGxkaXIvJGRsbmFtZScKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZmlsZTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxwYXRoPSRkaXIvXCRkbGRsbH4KKyAgICAgICAkcm0gXCRkbHBhdGgnCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGN5Z3dpbiopCisgICAgICAjIEN5Z3dpbiBETExzIHVzZSAnY3lnJyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIHNvbmFtZV9zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvY3lnLydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIgL2xpYi93MzJhcGkgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgICAgIDs7CisgICAgbWluZ3cqKQorICAgICAgIyBNaW5HVyBETExzIHVzZSB0cmFkaXRpb25hbCAnbGliJyBwcmVmaXgKKyAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGdyZXAgIl5saWJyYXJpZXM6IiB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnImAKKyAgICAgIGlmIGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgZ3JlcCAnO1tjLXpDLVpdOi8nID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgIyBJdCBpcyBtb3N0IHByb2JhYmx5IGEgV2luZG93cyBmb3JtYXQgUEFUSCBwcmludGVkIGJ5CisgICAgICAgICMgbWluZ3cgZ2NjLCBidXQgd2UgYXJlIHJ1bm5pbmcgb24gQ3lnd2luLiBHY2MgcHJpbnRzIGl0cyBzZWFyY2gKKyAgICAgICAgIyBwYXRoIHdpdGggOyBzZXBhcmF0b3JzLCBhbmQgd2l0aCBkcml2ZSBsZXR0ZXJzLiBXZSBjYW4gaGFuZGxlIHRoZQorICAgICAgICAjIGRyaXZlIGxldHRlcnMgKGN5Z3dpbiBmaWxldXRpbHMgdW5kZXJzdGFuZHMgdGhlbSksIHNvIGxlYXZlIHRoZW0sCisgICAgICAgICMgZXNwZWNpYWxseSBhcyB3ZSBtaWdodCBwYXNzIGZpbGVzIGZvdW5kIHRoZXJlIHRvIGEgbWluZ3cgb2JqZHVtcCwKKyAgICAgICAgIyB3aGljaCB3b3VsZG4ndCB1bmRlcnN0YW5kIGEgY3lnd2luaWZpZWQgcGF0aC4gQWhoLgorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCisgICAgICBlbHNlCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKKyAgICAgIGZpCisgICAgICA7OworICAgIHB3MzIqKQorICAgICAgIyBwdzMyIERMTHMgdXNlICdwdycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9wdy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICA7OworICAgIGVzYWMKKyAgICA7OworCisgICopCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fSAkbGlibmFtZS5saWInCisgICAgOzsKKyAgZXNhYworICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGQuZXhlJworICAjIEZJWE1FOiBmaXJzdCB3ZSBzaG91bGQgc2VhcmNoIC4gYW5kIHRoZSBkaXJlY3RvcnkgdGhlIGV4ZWN1dGFibGUgaXMgaW4KKyAgc2hsaWJwYXRoX3Zhcj1QQVRICisgIDs7CisKK2RhcndpbiogfCByaGFwc29keSopCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkeWxkIgorICB2ZXJzaW9uX3R5cGU9ZGFyd2luCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7dmVyc3VmZml4fSRzaGFyZWRfZXh0ICR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHNoYXJlZF9leHQnCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQnCisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgc2hsaWJwYXRoX3Zhcj1EWUxEX0xJQlJBUllfUEFUSAorICBzaHJleHRfY21kcz0nYHRlc3QgLiRtb2R1bGUgPSAueWVzICYmIGVjaG8gLnNvIHx8IGVjaG8gLmR5bGliYCcKKyAgIyBBcHBsZSdzIGdjYyBwcmludHMgJ2djYyAtcHJpbnQtc2VhcmNoLWRpcnMnIGRvZXNuJ3Qgb3BlcmF0ZSB0aGUgc2FtZS4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCB0ciAiXG4iICIkUEFUSF9TRVBBUkFUT1IiIHwgc2VkIC1lICdzL2xpYnJhcmllczovQGxpYnJhcmllczovJyB8IHRyICJAIiAiXG4iIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgc2VkIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyIgLWUgInMsJFBBVEhfU0VQQVJBVE9SLCAsZyIgLWUgInMsLiosJiAvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliLGciYAorICBlbHNlCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliJworICBmaQorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL2xpYiAvdXNyL2xpYicKKyAgOzsKKworZGd1eCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUkc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworZnJlZWJzZDEqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCitrZnJlZWJzZCotZ251KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBkeW5hbWljX2xpbmtlcj0nR05VIGxkLnNvJworICA7OworCitmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICMgRHJhZ29uRmx5IGRvZXMgbm90IGhhdmUgYW91dC4gIFdoZW4vaWYgdGhleSBpbXBsZW1lbnQgYSBuZXcKKyAgIyB2ZXJzaW9uaW5nIG1lY2hhbmlzbSwgYWRqdXN0IHRoaXMuCisgIGlmIHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0OyB0aGVuCisgICAgb2JqZm9ybWF0PWAvdXNyL2Jpbi9vYmpmb3JtYXRgCisgIGVsc2UKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgZnJlZWJzZFsxMjNdKikgb2JqZm9ybWF0PWFvdXQgOzsKKyAgICAqKSBvYmpmb3JtYXQ9ZWxmIDs7CisgICAgZXNhYworICBmaQorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC0kb2JqZm9ybWF0CisgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorICAgIGZyZWVic2QtZWxmKikKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgZnJlZWJzZC0qKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgICAgICBuZWVkX3ZlcnNpb249eWVzCisgICAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgZnJlZWJzZDIqKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICA7OworICBmcmVlYnNkMy5bMDFdKiB8IGZyZWVic2RlbGYzLlswMV0qKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZnJlZWJzZDMuWzItOV0qIHwgZnJlZWJzZGVsZjMuWzItOV0qIHwgXAorICBmcmVlYnNkNC5bMC01XSB8IGZyZWVic2RlbGY0LlswLTVdIHwgZnJlZWJzZDQuMS4xIHwgZnJlZWJzZGVsZjQuMS4xKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBmcmVlYnNkKikgIyBmcm9tIDQuNiBvbgorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZXNhYworICA7OworCitnbnUqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHttYWpvcn0gJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICMgR2l2ZSBhIHNvbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYWpvciB2ZXJzaW9uIHNvIHRoYXQgZGxkLnNsIHJlZnVzZXMgdG8KKyAgIyBsaW5rIGFnYWluc3Qgb3RoZXIgdmVyc2lvbnMuCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGNhc2UgJGhvc3RfY3B1IGluCisgIGlhNjQqKQorICAgIHNocmV4dF9jbWRzPScuc28nCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc28iCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBpZiB0ZXN0ICJYJEhQVVhfSUE2NF9NT0RFIiA9IFgzMjsgdGhlbgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliIgorICAgIGVsc2UKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDY0IC91c3IvbG9jYWwvbGliL2hwdXg2NCIKKyAgICBmaQorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICA7OworICAgaHBwYSo2NCopCisgICAgIHNocmV4dF9jbWRzPScuc2wnCisgICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEggIyBIb3cgc2hvdWxkIHdlIGhhbmRsZSBTSExJQl9QQVRICisgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KKyAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvcGEyMF82NCAvdXNyL2Njcy9saWIvcGEyMF82NCIKKyAgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYworICAgICA7OworICAgKikKKyAgICBzaHJleHRfY21kcz0nLnNsJworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgc2hsaWJwYXRoX3Zhcj1TSExJQl9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vICMgK3MgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIFNITElCX1BBVEgKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIDs7CisgIGVzYWMKKyAgIyBIUC1VWCBydW5zICpyZWFsbHkqIHNsb3dseSB1bmxlc3Mgc2hhcmVkIGxpYnJhcmllcyBhcmUgbW9kZSA1NTUuCisgIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDU1NSAkbGliJworICA7OworCitpbnRlcml4MyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGR5bmFtaWNfbGlua2VyPSdJbnRlcml4IDMueCBsZC5zby4xIChQRSwgbGlrZSBFTEYpJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICBjYXNlICRob3N0X29zIGluCisgICAgbm9uc3RvcHV4KikgdmVyc2lvbl90eXBlPW5vbnN0b3B1eCA7OworICAgICopCisJaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgorCQl2ZXJzaW9uX3R5cGU9bGludXgKKwllbHNlCisJCXZlcnNpb25fdHlwZT1pcml4CisJZmkgOzsKKyAgZXNhYworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBpcml4NSogfCBub25zdG9wdXgqKQorICAgIGxpYnN1ZmY9IHNobGlic3VmZj0KKyAgICA7OworICAqKQorICAgIGNhc2UgJExEIGluICMgbGlidG9vbC5tNCB3aWxsIGFkZCBvbmUgb2YgdGhlc2Ugc3dpdGNoZXMgdG8gTEQKKyAgICAqLTMyfCoiLTMyICJ8Ki1tZWxmMzJic21pcHwqIi1tZWxmMzJic21pcCAiKQorICAgICAgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz0zMi1iaXQ7OworICAgICotbjMyfCoiLW4zMiAifCotbWVsZjMyYm1pcG4zMnwqIi1tZWxmMzJibWlwbjMyICIpCisgICAgICBsaWJzdWZmPTMyIHNobGlic3VmZj1OMzIgbGlibWFnaWM9TjMyOzsKKyAgICAqLTY0fCoiLTY0ICJ8Ki1tZWxmNjRibWlwfCoiLW1lbGY2NGJtaXAgIikKKyAgICAgIGxpYnN1ZmY9NjQgc2hsaWJzdWZmPTY0IGxpYm1hZ2ljPTY0LWJpdDs7CisgICAgKikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZJHtzaGxpYnN1ZmZ9X1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSIKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCisjIE5vIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgTGludXggb2xkbGQsIGFvdXQsIG9yIGNvZmYuCitsaW51eCpvbGRsZCogfCBsaW51eCphb3V0KiB8IGxpbnV4KmNvZmYqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCisjIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCitsaW51eCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgIyBUaGlzIGltcGxpZXMgbm8gZmFzdF9pbnN0YWxsLCB3aGljaCBpcyB1bmFjY2VwdGFibGUuCisgICMgU29tZSByZXdvcmsgd2lsbCBiZSBuZWVkZWQgdG8gYWxsb3cgZm9yIGZhc3RfaW5zdGFsbAorICAjIGJlZm9yZSB0aGlzIGNhbiBiZSBlbmFibGVkLgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisKKyAgIyBBcHBlbmQgbGQuc28uY29uZiBjb250ZW50cyB0byB0aGUgc2VhcmNoIHBhdGgKKyAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KKyAgICBsdF9sZF9leHRyYT1gYXdrICcvXmluY2x1ZGUgLyB7IHN5c3RlbShzcHJpbnRmKCJjZCAvZXRjOyBjYXQgJXMiLCBcJDIpKTsgc2tpcCA9IDE7IH0geyBpZiAoIXNraXApIHByaW50IFwkMDsgc2tpcCA9IDA7IH0nIDwgL2V0Yy9sZC5zby5jb25mIHwgJFNFRCAtZSAncy8jLiovLztzL1s6LAldLyAvZztzLz1bXj1dKiQvLztzLz1bXj0gXSogLyAvZzsvXiQvZCcgfCB0ciAnXG4nICcgJ2AKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAkbHRfbGRfZXh0cmEiCisgIGZpCisKKyAgIyBXZSB1c2VkIHRvIHRlc3QgZm9yIC9saWIvbGQuc28uMSBhbmQgZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIG9uCisgICMgcG93ZXJwYywgYmVjYXVzZSBNa0xpbnV4IG9ubHkgc3VwcG9ydGVkIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB0aGUKKyAgIyBHTlUgZHluYW1pYyBsaW5rZXIuICBTaW5jZSB0aGlzIHdhcyBicm9rZW4gd2l0aCBjcm9zcyBjb21waWxlcnMsCisgICMgbW9zdCBwb3dlcnBjLWxpbnV4IGJveGVzIHN1cHBvcnQgZHluYW1pYyBsaW5raW5nIHRoZXNlIGRheXMgYW5kCisgICMgcGVvcGxlIGNhbiBhbHdheXMgLS1kaXNhYmxlLXNoYXJlZCwgdGhlIHRlc3Qgd2FzIHJlbW92ZWQsIGFuZCB3ZQorICAjIGFzc3VtZSB0aGUgR05VL0xpbnV4IGR5bmFtaWMgbGlua2VyIGlzIGluIHVzZS4KKyAgZHluYW1pY19saW5rZXI9J0dOVS9MaW51eCBsZC5zbycKKyAgOzsKKwora25ldGJzZCotZ251KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBkeW5hbWljX2xpbmtlcj0nR05VIGxkLnNvJworICA7OworCituZXRic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgKGEub3V0KSBsZC5zbycKKyAgZWxzZQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIGxkLmVsZl9zbycKKyAgZmkKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK25ld3NvczYpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICA7OworCitudG8tcW54KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgOzsKKworb3BlbmJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICAjIFNvbWUgb2xkZXIgdmVyc2lvbnMgb2YgT3BlbkJTRCAoMy4zIGF0IGxlYXN0KSAqZG8qIG5lZWQgdmVyc2lvbmVkIGxpYnMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBvcGVuYnNkMy4zIHwgb3BlbmJzZDMuMy4qKSBuZWVkX3ZlcnNpb249eWVzIDs7CisgICAgKikgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZF92ZXJzaW9uPW5vICA7OworICBlc2FjCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIG9wZW5ic2QyLls4OV0gfCBvcGVuYnNkMi5bODldLiopCisJc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisJOzsKKyAgICAgICopCisJc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworCTs7CisgICAgICBlc2FjCisgIGVsc2UKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGZpCisgIDs7CisKK29zMiopCisgIGxpYm5hbWVfc3BlYz0nJG5hbWUnCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUuYScKKyAgZHluYW1pY19saW5rZXI9J09TLzIgbGQuZXhlJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKyAgOzsKKworb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICB2ZXJzaW9uX3R5cGU9b3NmCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9zaGxpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIvY21wbHJzL2NjIC91c3IvbGliIC91c3IvbG9jYWwvbGliIC92YXIvc2hsaWIiCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgorICA7OworCitzb2xhcmlzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAjIGxkZCBjb21wbGFpbnMgdW5sZXNzIGxpYnJhcmllcyBhcmUgZXhlY3V0YWJsZQorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCAreCAkbGliJworICA7OworCitzdW5vczQqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovdXNyL2V0YyIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgbmVlZF9saWJfcHJlZml4PW5vCisgIGZpCisgIG5lZWRfdmVyc2lvbj15ZXMKKyAgOzsKKworc3lzdjQgfCBzeXN2NC4zKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBjYXNlICRob3N0X3ZlbmRvciBpbgorICAgIHNuaSkKKyAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUJsYXJnZWR5bnN5bScKKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICA7OworICAgIHNpZW1lbnMpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgbW90b3JvbGEpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJworICAgICAgOzsKKyAgZXNhYworICA7OworCitzeXN2NCpNUCopCisgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKyAgICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yJworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGZpCisgIDs7CisKK3N5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC1lbGYKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvdXNyL2dudS9saWIgL3Vzci9jY3MvbGliIC91c3IvbGliIC9saWInCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvY2NzL2xpYiAvdXNyL2xpYicKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgc2NvMy4ydjUqKQorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgL2xpYiIKKwk7OworICAgIGVzYWMKKyAgZmkKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbGliJworICA7OworCit1dHM0KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCisqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworZXNhYworZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGR5bmFtaWNfbGlua2VyIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRkeW5hbWljX2xpbmtlciIgPiY2Cit0ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCAkc2hsaWJwYXRoX3ZhciAkcnVucGF0aF92YXIiCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICB2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKK2ZpCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcy4uLiAkRUNIT19DIiA+JjYKK2hhcmRjb2RlX2FjdGlvbl9HQ0o9CitpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0oiIHx8IFwKKyAgIHRlc3QgLW4gIiRydW5wYXRoX3Zhcl9HQ0oiIHx8IFwKKyAgIHRlc3QgIlgkaGFyZGNvZGVfYXV0b21hdGljX0dDSiIgPSAiWHllcyIgOyB0aGVuCisKKyAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0YW50IGRpcmVjdG9yaWVzLgorICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0X0dDSiIgIT0gbm8gJiYKKyAgICAgIyBJZiB0aGUgb25seSBtZWNoYW5pc20gdG8gYXZvaWQgaGFyZGNvZGluZyBpcyBzaGxpYnBhdGhfdmFyLCB3ZQorICAgICAjIGhhdmUgdG8gcmVsaW5rLCBvdGhlcndpc2Ugd2UgbWlnaHQgbGluayB3aXRoIGFuIGluc3RhbGxlZCBsaWJyYXJ5CisgICAgICMgd2hlbiB3ZSBzaG91bGQgYmUgbGlua2luZyB3aXRoIGEgeWV0LXRvLWJlLWluc3RhbGxlZCBvbmUKKyAgICAgIyMgdGVzdCAiJF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgR0NKKSIgIT0gbm8gJiYKKyAgICAgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0xfR0NKIiAhPSBubzsgdGhlbgorICAgICMgTGlua2luZyBhbHdheXMgaGFyZGNvZGVzIHRoZSB0ZW1wb3JhcnkgbGlicmFyeSBkaXJlY3RvcnkuCisgICAgaGFyZGNvZGVfYWN0aW9uX0dDSj1yZWxpbmsKKyAgZWxzZQorICAgICMgV2UgY2FuIGxpbmsgd2l0aG91dCBoYXJkY29kaW5nLCBhbmQgd2UgY2FuIGhhcmRjb2RlIG5vbmV4aXN0aW5nIGRpcnMuCisgICAgaGFyZGNvZGVfYWN0aW9uX0dDSj1pbW1lZGlhdGUKKyAgZmkKK2Vsc2UKKyAgIyBXZSBjYW5ub3QgaGFyZGNvZGUgYW55dGhpbmcsIG9yIGVsc2Ugd2UgY2FuIG9ubHkgaGFyZGNvZGUgZXhpc3RpbmcKKyAgIyBkaXJlY3Rvcmllcy4KKyAgaGFyZGNvZGVfYWN0aW9uX0dDSj11bnN1cHBvcnRlZAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRoYXJkY29kZV9hY3Rpb25fR0NKIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRoYXJkY29kZV9hY3Rpb25fR0NKIiA+JjYKKworaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbl9HQ0oiID0gcmVsaW5rOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCitlbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8CisgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCitmaQorCisKKyMgVGhlIGVsc2UgY2xhdXNlIHNob3VsZCBvbmx5IGZpcmUgd2hlbiBib290c3RyYXBwaW5nIHRoZQorIyBsaWJ0b29sIGRpc3RyaWJ1dGlvbiwgb3RoZXJ3aXNlIHlvdSBmb3Jnb3QgdG8gc2hpcCBsdG1haW4uc2gKKyMgd2l0aCB5b3VyIHBhY2thZ2UsIGFuZCB5b3Ugd2lsbCBnZXQgY29tcGxhaW50cyB0aGF0IHRoZXJlIGFyZQorIyBubyBydWxlcyB0byBnZW5lcmF0ZSBsdG1haW4uc2guCitpZiB0ZXN0IC1mICIkbHRtYWluIjsgdGhlbgorICAjIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyIGNvbW1hbmRzIHRocm91Z2gKKyAgIyB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzLgorICBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgorICAgIHNldG9wdCBOT19HTE9CX1NVQlNUCisgIGZpCisgICMgTm93IHF1b3RlIGFsbCB0aGUgdGhpbmdzIHRoYXQgbWF5IGNvbnRhaW4gbWV0YWNoYXJhY3RlcnMgd2hpbGUgYmVpbmcKKyAgIyBjYXJlZnVsIG5vdCB0byBvdmVycXVvdGUgdGhlIEFDX1NVQlNUZWQgdmFsdWVzLiAgV2UgdGFrZSBjb3BpZXMgb2YgdGhlCisgICMgdmFyaWFibGVzIGFuZCBxdW90ZSB0aGUgY29waWVzIGZvciBnZW5lcmF0aW9uIG9mIHRoZSBsaWJ0b29sIHNjcmlwdC4KKyAgZm9yIHZhciBpbiBlY2hvIG9sZF9DQyBvbGRfQ0ZMQUdTIEFSIEFSX0ZMQUdTIEVHUkVQIFJBTkxJQiBMTl9TIExUQ0MgTFRDRkxBR1MgTk0gXAorICAgIFNFRCBTSEVMTCBTVFJJUCBcCisgICAgbGlibmFtZV9zcGVjIGxpYnJhcnlfbmFtZXNfc3BlYyBzb25hbWVfc3BlYyBleHRyYWN0X2V4cHN5bXNfY21kcyBcCisgICAgb2xkX3N0cmlwbGliIHN0cmlwbGliIGZpbGVfbWFnaWNfY21kIGZpbmlzaF9jbWRzIGZpbmlzaF9ldmFsIFwKKyAgICBkZXBsaWJzX2NoZWNrX21ldGhvZCByZWxvYWRfZmxhZyByZWxvYWRfY21kcyBuZWVkX2xvY2tzIFwKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIFwKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyBcCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIFwKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcyBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIFwKKyAgICBjb21waWxlcl9HQ0ogXAorICAgIENDX0dDSiBcCisgICAgTERfR0NKIFwKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSiBcCisgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIFwKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0ogXAorICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0dDSiBcCisgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSiBcCisgICAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjX0dDSiBcCisgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfR0NKIFwKKyAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0dDSiBcCisgICAgb2xkX2FyY2hpdmVfY21kc19HQ0ogXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfR0NKIFwKKyAgICBwcmVkZXBfb2JqZWN0c19HQ0ogXAorICAgIHBvc3RkZXBfb2JqZWN0c19HQ0ogXAorICAgIHByZWRlcHNfR0NKIFwKKyAgICBwb3N0ZGVwc19HQ0ogXAorICAgIGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9HQ0ogXAorICAgIGFyY2hpdmVfY21kc19HQ0ogXAorICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKIFwKKyAgICBwb3N0aW5zdGFsbF9jbWRzX0dDSiBcCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzX0dDSiBcCisgICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfR0NKIFwKKyAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0ogXAorICAgIG5vX3VuZGVmaW5lZF9mbGFnX0dDSiBcCisgICAgZXhwb3J0X3N5bWJvbHNfY21kc19HQ0ogXAorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKIFwKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0dDSiBcCisgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0ogXAorICAgIGhhcmRjb2RlX2F1dG9tYXRpY19HQ0ogXAorICAgIG1vZHVsZV9jbWRzX0dDSiBcCisgICAgbW9kdWxlX2V4cHN5bV9jbWRzX0dDSiBcCisgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fR0NKIFwKKyAgICBleGNsdWRlX2V4cHN5bXNfR0NKIFwKKyAgICBpbmNsdWRlX2V4cHN5bXNfR0NKOyBkbworCisgICAgY2FzZSAkdmFyIGluCisgICAgb2xkX2FyY2hpdmVfY21kc19HQ0ogfCBcCisgICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19HQ0ogfCBcCisgICAgYXJjaGl2ZV9jbWRzX0dDSiB8IFwKKyAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSiB8IFwKKyAgICBtb2R1bGVfY21kc19HQ0ogfCBcCisgICAgbW9kdWxlX2V4cHN5bV9jbWRzX0dDSiB8IFwKKyAgICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19HQ0ogfCBcCisgICAgZXhwb3J0X3N5bWJvbHNfY21kc19HQ0ogfCBcCisgICAgZXh0cmFjdF9leHBzeW1zX2NtZHMgfCByZWxvYWRfY21kcyB8IGZpbmlzaF9jbWRzIHwgXAorICAgIHBvc3RpbnN0YWxsX2NtZHMgfCBwb3N0dW5pbnN0YWxsX2NtZHMgfCBcCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgfCBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyB8IHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjKQorICAgICAgIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgorICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJGRvdWJsZV9xdW90ZV9zdWJzdFwiIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIiAtZSBcIlwkZGVsYXlfdmFyaWFibGVfc3Vic3RcIlxgXFxcIiIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIlxgXFxcIiIKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisKKyAgY2FzZSAkbHRfZWNobyBpbgorICAqJ1wkMCAtLWZhbGxiYWNrLWVjaG8iJykKKyAgICBsdF9lY2hvPWAkZWNobyAiWCRsdF9lY2hvIiB8ICRYc2VkIC1lICdzL1xcXFxcXFwkMCAtLWZhbGxiYWNrLWVjaG8iJC8kMCAtLWZhbGxiYWNrLWVjaG8iLydgCisgICAgOzsKKyAgZXNhYworCitjZmdmaWxlPSIkb2ZpbGUiCisKKyAgY2F0IDw8X19FT0ZfXyA+PiAiJGNmZ2ZpbGUiCisjICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lCisKKyMgTGlidG9vbCB3YXMgY29uZmlndXJlZCBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKworIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgorU0hFTEw9JGx0X1NIRUxMCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KK2J1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAorCisjIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuCitidWlsZF9vbGRfbGlicz0kZW5hYmxlX3N0YXRpYworCisjIFdoZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCitidWlsZF9saWJ0b29sX25lZWRfbGM9JGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSgorCisjIFdoZXRoZXIgb3Igbm90IHRvIGRpc2FsbG93IHNoYXJlZCBsaWJzIHdoZW4gcnVudGltZSBsaWJzIGFyZSBzdGF0aWMKK2FsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcz0kZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19HQ0oKKworIyBXaGV0aGVyIG9yIG5vdCB0byBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24uCitmYXN0X2luc3RhbGw9JGVuYWJsZV9mYXN0X2luc3RhbGwKKworIyBUaGUgaG9zdCBzeXN0ZW0uCitob3N0X2FsaWFzPSRob3N0X2FsaWFzCitob3N0PSRob3N0Citob3N0X29zPSRob3N0X29zCisKKyMgVGhlIGJ1aWxkIHN5c3RlbS4KK2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcworYnVpbGQ9JGJ1aWxkCitidWlsZF9vcz0kYnVpbGRfb3MKKworIyBBbiBlY2hvIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCitlY2hvPSRsdF9lY2hvCisKKyMgVGhlIGFyY2hpdmVyLgorQVI9JGx0X0FSCitBUl9GTEFHUz0kbHRfQVJfRkxBR1MKKworIyBBIEMgY29tcGlsZXIuCitMVENDPSRsdF9MVENDCisKKyMgTFRDQyBjb21waWxlciBmbGFncy4KK0xUQ0ZMQUdTPSRsdF9MVENGTEFHUworCisjIEEgbGFuZ3VhZ2Utc3BlY2lmaWMgY29tcGlsZXIuCitDQz0kbHRfY29tcGlsZXJfR0NKCisKKyMgSXMgdGhlIGNvbXBpbGVyIHRoZSBHTlUgQyBjb21waWxlcj8KK3dpdGhfZ2NjPSRHQ0NfR0NKCisKKyMgQW4gRVJFIG1hdGNoZXIuCitFR1JFUD0kbHRfRUdSRVAKKworIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgorTEQ9JGx0X0xEX0dDSgorCisjIFdoZXRoZXIgd2UgbmVlZCBoYXJkIG9yIHNvZnQgbGlua3MuCitMTl9TPSRsdF9MTl9TCisKKyMgQSBCU0QtY29tcGF0aWJsZSBubSBwcm9ncmFtLgorTk09JGx0X05NCisKKyMgQSBzeW1ib2wgc3RyaXBwaW5nIHByb2dyYW0KK1NUUklQPSRsdF9TVFJJUAorCisjIFVzZWQgdG8gZXhhbWluZSBsaWJyYXJpZXMgd2hlbiBmaWxlX21hZ2ljX2NtZCBiZWdpbnMgImZpbGUiCitNQUdJQ19DTUQ9JE1BR0lDX0NNRAorCisjIFVzZWQgb24gY3lnd2luOiBETEwgY3JlYXRpb24gcHJvZ3JhbS4KK0RMTFRPT0w9IiRETExUT09MIgorCisjIFVzZWQgb24gY3lnd2luOiBvYmplY3QgZHVtcGVyLgorT0JKRFVNUD0iJE9CSkRVTVAiCisKKyMgVXNlZCBvbiBjeWd3aW46IGFzc2VtYmxlci4KK0FTPSIkQVMiCisKKyMgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzLgorb2JqZGlyPSRvYmpkaXIKKworIyBIb3cgdG8gY3JlYXRlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzLgorcmVsb2FkX2ZsYWc9JGx0X3JlbG9hZF9mbGFnCityZWxvYWRfY21kcz0kbHRfcmVsb2FkX2NtZHMKKworIyBIb3cgdG8gcGFzcyBhIGxpbmtlciBmbGFnIHRocm91Z2ggdGhlIGNvbXBpbGVyLgord2w9JGx0X2x0X3Byb2dfY29tcGlsZXJfd2xfR0NKCisKKyMgT2JqZWN0IGZpbGUgc3VmZml4IChub3JtYWxseSAibyIpLgorb2JqZXh0PSIkYWNfb2JqZXh0IgorCisjIE9sZCBhcmNoaXZlIHN1ZmZpeCAobm9ybWFsbHkgImEiKS4KK2xpYmV4dD0iJGxpYmV4dCIKKworIyBTaGFyZWQgbGlicmFyeSBzdWZmaXggKG5vcm1hbGx5ICIuc28iKS4KK3NocmV4dF9jbWRzPSckc2hyZXh0X2NtZHMnCisKKyMgRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpLgorZXhlZXh0PSIkZXhlZXh0IgorCisjIEFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0cy4KK3BpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0oKK3BpY19tb2RlPSRwaWNfbW9kZQorCisjIFdoYXQgaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgY29tbWFuZD8KK21heF9jbWRfbGVuPSRsdF9jdl9zeXNfbWF4X2NtZF9sZW4KKworIyBEb2VzIGNvbXBpbGVyIHNpbXVsdGFuZW91c2x5IHN1cHBvcnQgLWMgYW5kIC1vIG9wdGlvbnM/Citjb21waWxlcl9jX289JGx0X2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0dDSgorCisjIE11c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uPworbmVlZF9sb2Nrcz0kbHRfbmVlZF9sb2NrcworCisjIERvIHdlIG5lZWQgdGhlIGxpYiBwcmVmaXggZm9yIG1vZHVsZXM/CituZWVkX2xpYl9wcmVmaXg9JG5lZWRfbGliX3ByZWZpeAorCisjIERvIHdlIG5lZWQgYSB2ZXJzaW9uIGZvciBsaWJyYXJpZXM/CituZWVkX3ZlcnNpb249JG5lZWRfdmVyc2lvbgorCisjIFdoZXRoZXIgZGxvcGVuIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zdXBwb3J0PSRlbmFibGVfZGxvcGVuCisKKyMgV2hldGhlciBkbG9wZW4gb2YgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgorZGxvcGVuX3NlbGY9JGVuYWJsZV9kbG9wZW5fc2VsZgorCisjIFdoZXRoZXIgZGxvcGVuIG9mIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zZWxmX3N0YXRpYz0kZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYworCisjIENvbXBpbGVyIGZsYWcgdG8gcHJldmVudCBkeW5hbWljIGxpbmtpbmcuCitsaW5rX3N0YXRpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0oKKworIyBDb21waWxlciBmbGFnIHRvIHR1cm4gb2ZmIGJ1aWx0aW4gZnVuY3Rpb25zLgorbm9fYnVpbHRpbl9mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19HQ0oKKworIyBDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zLgorZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSRsdF9leHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKCisKKyMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzLgord2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JGx0X3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSgorCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkLXNhZmUgb2JqZWN0cy4KK3RocmVhZF9zYWZlX2ZsYWdfc3BlYz0kbHRfdGhyZWFkX3NhZmVfZmxhZ19zcGVjX0dDSgorCisjIExpYnJhcnkgdmVyc2lvbmluZyB0eXBlLgordmVyc2lvbl90eXBlPSR2ZXJzaW9uX3R5cGUKKworIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KK2xpYm5hbWVfc3BlYz0kbHRfbGlibmFtZV9zcGVjCisKKyMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KKyMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRS4KK2xpYnJhcnlfbmFtZXNfc3BlYz0kbHRfbGlicmFyeV9uYW1lc19zcGVjCisKKyMgVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWUuCitzb25hbWVfc3BlYz0kbHRfc29uYW1lX3NwZWMKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgorUkFOTElCPSRsdF9SQU5MSUIKK29sZF9hcmNoaXZlX2NtZHM9JGx0X29sZF9hcmNoaXZlX2NtZHNfR0NKCitvbGRfcG9zdGluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3RpbnN0YWxsX2NtZHMKK29sZF9wb3N0dW5pbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0dW5pbnN0YWxsX2NtZHMKKworIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19HQ0oKKworIyBDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfR0NKCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhIHNoYXJlZCBhcmNoaXZlLgorYXJjaGl2ZV9jbWRzPSRsdF9hcmNoaXZlX2NtZHNfR0NKCithcmNoaXZlX2V4cHN5bV9jbWRzPSRsdF9hcmNoaXZlX2V4cHN5bV9jbWRzX0dDSgorcG9zdGluc3RhbGxfY21kcz0kbHRfcG9zdGluc3RhbGxfY21kcworcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9wb3N0dW5pbnN0YWxsX2NtZHMKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgbG9hZGFibGUgbW9kdWxlIChhc3N1bWVkIHNhbWUgYXMgYWJvdmUgaWYgZW1wdHkpCittb2R1bGVfY21kcz0kbHRfbW9kdWxlX2NtZHNfR0NKCittb2R1bGVfZXhwc3ltX2NtZHM9JGx0X21vZHVsZV9leHBzeW1fY21kc19HQ0oKKworIyBDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXMuCitvbGRfc3RyaXBsaWI9JGx0X29sZF9zdHJpcGxpYgorc3RyaXBsaWI9JGx0X3N0cmlwbGliCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwcmVkZXBfb2JqZWN0cz0kbHRfcHJlZGVwX29iamVjdHNfR0NKCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3Bvc3RkZXBfb2JqZWN0cz0kbHRfcG9zdGRlcF9vYmplY3RzX0dDSgorCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcHJlZGVwcz0kbHRfcHJlZGVwc19HQ0oKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcG9zdGRlcHM9JGx0X3Bvc3RkZXBzX0dDSgorCisjIFRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY29tcGlsZXIgd2hlbiBsaW5raW5nCisjIGEgc2hhcmVkIGxpYnJhcnkuCitjb21waWxlcl9saWJfc2VhcmNoX3BhdGg9JGx0X2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9HQ0oKKworIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KK2RlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9kZXBsaWJzX2NoZWNrX21ldGhvZAorCisjIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gZmlsZV9tYWdpYy4KK2ZpbGVfbWFnaWNfY21kPSRsdF9maWxlX21hZ2ljX2NtZAorCisjIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgorYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X2FsbG93X3VuZGVmaW5lZF9mbGFnX0dDSgorCisjIEZsYWcgdGhhdCBmb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCitub191bmRlZmluZWRfZmxhZz0kbHRfbm9fdW5kZWZpbmVkX2ZsYWdfR0NKCisKKyMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgorZmluaXNoX2NtZHM9JGx0X2ZpbmlzaF9jbWRzCisKKyMgU2FtZSBhcyBhYm92ZSwgYnV0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0IG5vdCBzaG93bi4KK2ZpbmlzaF9ldmFsPSRsdF9maW5pc2hfZXZhbAorCisjIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCitnbG9iYWxfc3ltYm9sX3BpcGU9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uCitnbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbAorCisjIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpcgorZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MKKworIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGUuCitydW5wYXRoX3Zhcj0kcnVucGF0aF92YXIKKworIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlLgorc2hsaWJwYXRoX3Zhcj0kc2hsaWJwYXRoX3ZhcgorCisjIElzIHNobGlicGF0aCBzZWFyY2hlZCBiZWZvcmUgdGhlIGhhcmQtY29kZWQgbGlicmFyeSBzZWFyY2ggcGF0aD8KK3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCisKKyMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCitoYXJkY29kZV9hY3Rpb249JGhhcmRjb2RlX2FjdGlvbl9HQ0oKKworIyBXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzLgoraGFyZGNvZGVfaW50b19saWJzPSRoYXJkY29kZV9pbnRvX2xpYnMKKworIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCisjIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSgorCisjIElmIGxkIGlzIHVzZWQgd2hlbiBsaW5raW5nLCBmbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8KKyMgYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcworIyBub3QgZXhpc3QuCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0dDSgorCisjIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0oKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisjIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9kaXJlY3Q9JGhhcmRjb2RlX2RpcmVjdF9HQ0oKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKKyMgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX21pbnVzX0w9JGhhcmRjb2RlX21pbnVzX0xfR0NKCisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8KKyMgdGhlIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9zaGxpYnBhdGhfdmFyPSRoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSgorCisjIFNldCB0byB5ZXMgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIgaW50byB0aGUgbGlicmFyeQorIyBhbmQgYWxsIHN1YnNlcXVlbnQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyBsaW5rZWQgYWdhaW5zdCBpdC4KK2hhcmRjb2RlX2F1dG9tYXRpYz0kaGFyZGNvZGVfYXV0b21hdGljX0dDSgorCisjIFZhcmlhYmxlcyB3aG9zZSB2YWx1ZXMgc2hvdWxkIGJlIHNhdmVkIGluIGxpYnRvb2wgd3JhcHBlciBzY3JpcHRzIGFuZAorIyByZXN0b3JlZCBhdCByZWxpbmsgdGltZS4KK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsiCisKKyMgV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzLgorbGlua19hbGxfZGVwbGlicz0kbGlua19hbGxfZGVwbGlic19HQ0oKKworIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKK3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisKKyMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYworCisjIEZpeCB0aGUgc2hlbGwgdmFyaWFibGUgXCRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXIuCitmaXhfc3JjZmlsZV9wYXRoPSIkZml4X3NyY2ZpbGVfcGF0aF9HQ0oiCisKKyMgU2V0IHRvIHllcyBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KK2Fsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0dDSgorCisjIFRoZSBjb21tYW5kcyB0byBsaXN0IGV4cG9ydGVkIHN5bWJvbHMuCitleHBvcnRfc3ltYm9sc19jbWRzPSRsdF9leHBvcnRfc3ltYm9sc19jbWRzX0dDSgorCisjIFRoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCitleHRyYWN0X2V4cHN5bXNfY21kcz0kbHRfZXh0cmFjdF9leHBzeW1zX2NtZHMKKworIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgorZXhjbHVkZV9leHBzeW1zPSRsdF9leGNsdWRlX2V4cHN5bXNfR0NKCisKKyMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkLgoraW5jbHVkZV9leHBzeW1zPSRsdF9pbmNsdWRlX2V4cHN5bXNfR0NKCisKKyMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lCisKK19fRU9GX18KKworCitlbHNlCisgICMgSWYgdGhlcmUgaXMgbm8gTWFrZWZpbGUgeWV0LCB3ZSByZWx5IG9uIGEgbWFrZSBydWxlIHRvIGV4ZWN1dGUKKyAgIyBgY29uZmlnLnN0YXR1cyAtLXJlY2hlY2snIHRvIHJlcnVuIHRoZXNlIHRlc3RzIGFuZCBjcmVhdGUgdGhlCisgICMgbGlidG9vbCBzY3JpcHQgdGhlbi4KKyAgbHRtYWluX2luPWBlY2hvICRsdG1haW4gfCBzZWQgLWUgJ3MvXC5zaCQvLmluLydgCisgIGlmIHRlc3QgLWYgIiRsdG1haW5faW4iOyB0aGVuCisgICAgdGVzdCAtZiBNYWtlZmlsZSAmJiBtYWtlICIkbHRtYWluIgorICBmaQorZmkKKworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK0NDPSIkbHRfc2F2ZV9DQyIKKworCWVsc2UKKwkgIHRhZ25hbWU9IiIKKwlmaQorCTs7CisKKyAgICAgIFJDKQorCisKKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIFJDIHRlc3Qgc291cmNlcy4KK2FjX2V4dD1yYworCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgUkMgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK29iamV4dF9SQz0kb2JqZXh0CisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCitsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9J3NhbXBsZSBNRU5VIHsgTUVOVUlURU0gIiZTb3VwIiwgMTAwLCBDSEVDS0VEIH1cbicKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0iJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIKKworIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorCisjIElmIG5vIEMgY29tcGlsZXIgd2FzIHNwZWNpZmllZCwgdXNlIENDLgorTFRDQz0ke0xUQ0MtIiRDQyJ9CisKKyMgSWYgbm8gQyBjb21waWxlciBmbGFncyB3ZXJlIHNwZWNpZmllZCwgdXNlIENGTEFHUy4KK0xUQ0ZMQUdTPSR7TFRDRkxBR1MtIiRDRkxBR1MifQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorY29tcGlsZXI9JENDCisKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAorZXZhbCAiJGFjX2NvbXBpbGUiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCitfbHRfY29tcGlsZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskcm0gY29uZnRlc3QqCisKK2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorcHJpbnRmICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAorZXZhbCAiJGFjX2xpbmsiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCitfbHRfbGlua2VyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAorJHJtIGNvbmZ0ZXN0KgorCisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitsdF9zYXZlX0NDPSIkQ0MiCitDQz0ke1JDLSJ3aW5kcmVzIn0KK2NvbXBpbGVyPSRDQworY29tcGlsZXJfUkM9JENDCitmb3IgY2NfdGVtcCBpbiAkY29tcGlsZXIiIjsgZG8KKyAgY2FzZSAkY2NfdGVtcCBpbgorICAgIGNvbXBpbGUgfCAqW1xcL11jb21waWxlIHwgY2NhY2hlIHwgKltcXC9dY2NhY2hlICkgOzsKKyAgICBkaXN0Y2MgfCAqW1xcL11kaXN0Y2MgfCBwdXJpZnkgfCAqW1xcL11wdXJpZnkgKSA7OworICAgIFwtKikgOzsKKyAgICAqKSBicmVhazs7CisgIGVzYWMKK2RvbmUKK2NjX2Jhc2VuYW1lPWAkZWNobyAiWCRjY190ZW1wIiB8ICRYc2VkIC1lICdzJS4qLyUlJyAtZSAicyVeJGhvc3RfYWxpYXMtJSUiYAorCitsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19SQz15ZXMKKworIyBUaGUgZWxzZSBjbGF1c2Ugc2hvdWxkIG9ubHkgZmlyZSB3aGVuIGJvb3RzdHJhcHBpbmcgdGhlCisjIGxpYnRvb2wgZGlzdHJpYnV0aW9uLCBvdGhlcndpc2UgeW91IGZvcmdvdCB0byBzaGlwIGx0bWFpbi5zaAorIyB3aXRoIHlvdXIgcGFja2FnZSwgYW5kIHlvdSB3aWxsIGdldCBjb21wbGFpbnRzIHRoYXQgdGhlcmUgYXJlCisjIG5vIHJ1bGVzIHRvIGdlbmVyYXRlIGx0bWFpbi5zaC4KK2lmIHRlc3QgLWYgIiRsdG1haW4iOyB0aGVuCisgICMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIgY29tbWFuZHMgdGhyb3VnaAorICAjIHdpdGhvdXQgcmVtb3ZhbCBvZiBcIGVzY2FwZXMuCisgIGlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCisgICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKKyAgZmkKKyAgIyBOb3cgcXVvdGUgYWxsIHRoZSB0aGluZ3MgdGhhdCBtYXkgY29udGFpbiBtZXRhY2hhcmFjdGVycyB3aGlsZSBiZWluZworICAjIGNhcmVmdWwgbm90IHRvIG92ZXJxdW90ZSB0aGUgQUNfU1VCU1RlZCB2YWx1ZXMuICBXZSB0YWtlIGNvcGllcyBvZiB0aGUKKyAgIyB2YXJpYWJsZXMgYW5kIHF1b3RlIHRoZSBjb3BpZXMgZm9yIGdlbmVyYXRpb24gb2YgdGhlIGxpYnRvb2wgc2NyaXB0LgorICBmb3IgdmFyIGluIGVjaG8gb2xkX0NDIG9sZF9DRkxBR1MgQVIgQVJfRkxBR1MgRUdSRVAgUkFOTElCIExOX1MgTFRDQyBMVENGTEFHUyBOTSBcCisgICAgU0VEIFNIRUxMIFNUUklQIFwKKyAgICBsaWJuYW1lX3NwZWMgbGlicmFyeV9uYW1lc19zcGVjIHNvbmFtZV9zcGVjIGV4dHJhY3RfZXhwc3ltc19jbWRzIFwKKyAgICBvbGRfc3RyaXBsaWIgc3RyaXBsaWIgZmlsZV9tYWdpY19jbWQgZmluaXNoX2NtZHMgZmluaXNoX2V2YWwgXAorICAgIGRlcGxpYnNfY2hlY2tfbWV0aG9kIHJlbG9hZF9mbGFnIHJlbG9hZF9jbWRzIG5lZWRfbG9ja3MgXAorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wgXAorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIFwKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMgXAorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgXAorICAgIGNvbXBpbGVyX1JDIFwKKyAgICBDQ19SQyBcCisgICAgTERfUkMgXAorICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfUkMgXAorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX1JDIFwKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19SQyBcCisgICAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfUkMgXAorICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19SQyBcCisgICAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjX1JDIFwKKyAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19SQyBcCisgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19SQyBcCisgICAgb2xkX2FyY2hpdmVfY21kc19SQyBcCisgICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19SQyBcCisgICAgcHJlZGVwX29iamVjdHNfUkMgXAorICAgIHBvc3RkZXBfb2JqZWN0c19SQyBcCisgICAgcHJlZGVwc19SQyBcCisgICAgcG9zdGRlcHNfUkMgXAorICAgIGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9SQyBcCisgICAgYXJjaGl2ZV9jbWRzX1JDIFwKKyAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX1JDIFwKKyAgICBwb3N0aW5zdGFsbF9jbWRzX1JDIFwKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHNfUkMgXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX1JDIFwKKyAgICBhbGxvd191bmRlZmluZWRfZmxhZ19SQyBcCisgICAgbm9fdW5kZWZpbmVkX2ZsYWdfUkMgXAorICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfUkMgXAorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfUkMgXAorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfUkMgXAorICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfUkMgXAorICAgIGhhcmRjb2RlX2F1dG9tYXRpY19SQyBcCisgICAgbW9kdWxlX2NtZHNfUkMgXAorICAgIG1vZHVsZV9leHBzeW1fY21kc19SQyBcCisgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fUkMgXAorICAgIGV4Y2x1ZGVfZXhwc3ltc19SQyBcCisgICAgaW5jbHVkZV9leHBzeW1zX1JDOyBkbworCisgICAgY2FzZSAkdmFyIGluCisgICAgb2xkX2FyY2hpdmVfY21kc19SQyB8IFwKKyAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX1JDIHwgXAorICAgIGFyY2hpdmVfY21kc19SQyB8IFwKKyAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX1JDIHwgXAorICAgIG1vZHVsZV9jbWRzX1JDIHwgXAorICAgIG1vZHVsZV9leHBzeW1fY21kc19SQyB8IFwKKyAgICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19SQyB8IFwKKyAgICBleHBvcnRfc3ltYm9sc19jbWRzX1JDIHwgXAorICAgIGV4dHJhY3RfZXhwc3ltc19jbWRzIHwgcmVsb2FkX2NtZHMgfCBmaW5pc2hfY21kcyB8IFwKKyAgICBwb3N0aW5zdGFsbF9jbWRzIHwgcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIHwgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyB8IFwKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgfCBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYykKKyAgICAgICMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KKyAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRkb3VibGVfcXVvdGVfc3Vic3RcIiAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCIgLWUgXCJcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XCJcYFxcXCIiCisgICAgICA7OworICAgICopCisgICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYFxcXCIiCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorCisgIGNhc2UgJGx0X2VjaG8gaW4KKyAgKidcJDAgLS1mYWxsYmFjay1lY2hvIicpCisgICAgbHRfZWNobz1gJGVjaG8gIlgkbHRfZWNobyIgfCAkWHNlZCAtZSAncy9cXFxcXFxcJDAgLS1mYWxsYmFjay1lY2hvIiQvJDAgLS1mYWxsYmFjay1lY2hvIi8nYAorICAgIDs7CisgIGVzYWMKKworY2ZnZmlsZT0iJG9maWxlIgorCisgIGNhdCA8PF9fRU9GX18gPj4gIiRjZmdmaWxlIgorIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZQorCisjIExpYnRvb2wgd2FzIGNvbmZpZ3VyZWQgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisKKyMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KK1NIRUxMPSRsdF9TSEVMTAorCisjIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuCitidWlsZF9saWJ0b29sX2xpYnM9JGVuYWJsZV9zaGFyZWQKKworIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLgorYnVpbGRfb2xkX2xpYnM9JGVuYWJsZV9zdGF0aWMKKworIyBXaGV0aGVyIG9yIG5vdCB0byBhZGQgLWxjIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgorYnVpbGRfbGlidG9vbF9uZWVkX2xjPSRhcmNoaXZlX2NtZHNfbmVlZF9sY19SQworCisjIFdoZXRoZXIgb3Igbm90IHRvIGRpc2FsbG93IHNoYXJlZCBsaWJzIHdoZW4gcnVudGltZSBsaWJzIGFyZSBzdGF0aWMKK2FsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcz0kZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19SQworCisjIFdoZXRoZXIgb3Igbm90IHRvIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbi4KK2Zhc3RfaW5zdGFsbD0kZW5hYmxlX2Zhc3RfaW5zdGFsbAorCisjIFRoZSBob3N0IHN5c3RlbS4KK2hvc3RfYWxpYXM9JGhvc3RfYWxpYXMKK2hvc3Q9JGhvc3QKK2hvc3Rfb3M9JGhvc3Rfb3MKKworIyBUaGUgYnVpbGQgc3lzdGVtLgorYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCitidWlsZD0kYnVpbGQKK2J1aWxkX29zPSRidWlsZF9vcworCisjIEFuIGVjaG8gcHJvZ3JhbSB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2hlcy4KK2VjaG89JGx0X2VjaG8KKworIyBUaGUgYXJjaGl2ZXIuCitBUj0kbHRfQVIKK0FSX0ZMQUdTPSRsdF9BUl9GTEFHUworCisjIEEgQyBjb21waWxlci4KK0xUQ0M9JGx0X0xUQ0MKKworIyBMVENDIGNvbXBpbGVyIGZsYWdzLgorTFRDRkxBR1M9JGx0X0xUQ0ZMQUdTCisKKyMgQSBsYW5ndWFnZS1zcGVjaWZpYyBjb21waWxlci4KK0NDPSRsdF9jb21waWxlcl9SQworCisjIElzIHRoZSBjb21waWxlciB0aGUgR05VIEMgY29tcGlsZXI/Cit3aXRoX2djYz0kR0NDX1JDCisKKyMgQW4gRVJFIG1hdGNoZXIuCitFR1JFUD0kbHRfRUdSRVAKKworIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgorTEQ9JGx0X0xEX1JDCisKKyMgV2hldGhlciB3ZSBuZWVkIGhhcmQgb3Igc29mdCBsaW5rcy4KK0xOX1M9JGx0X0xOX1MKKworIyBBIEJTRC1jb21wYXRpYmxlIG5tIHByb2dyYW0uCitOTT0kbHRfTk0KKworIyBBIHN5bWJvbCBzdHJpcHBpbmcgcHJvZ3JhbQorU1RSSVA9JGx0X1NUUklQCisKKyMgVXNlZCB0byBleGFtaW5lIGxpYnJhcmllcyB3aGVuIGZpbGVfbWFnaWNfY21kIGJlZ2lucyAiZmlsZSIKK01BR0lDX0NNRD0kTUFHSUNfQ01ECisKKyMgVXNlZCBvbiBjeWd3aW46IERMTCBjcmVhdGlvbiBwcm9ncmFtLgorRExMVE9PTD0iJERMTFRPT0wiCisKKyMgVXNlZCBvbiBjeWd3aW46IG9iamVjdCBkdW1wZXIuCitPQkpEVU1QPSIkT0JKRFVNUCIKKworIyBVc2VkIG9uIGN5Z3dpbjogYXNzZW1ibGVyLgorQVM9IiRBUyIKKworIyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGVtcG9yYXJ5IGxpYnRvb2wgZmlsZXMuCitvYmpkaXI9JG9iamRpcgorCisjIEhvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuCityZWxvYWRfZmxhZz0kbHRfcmVsb2FkX2ZsYWcKK3JlbG9hZF9jbWRzPSRsdF9yZWxvYWRfY21kcworCisjIEhvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXIuCit3bD0kbHRfbHRfcHJvZ19jb21waWxlcl93bF9SQworCisjIE9iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKS4KK29iamV4dD0iJGFjX29iamV4dCIKKworIyBPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIikuCitsaWJleHQ9IiRsaWJleHQiCisKKyMgU2hhcmVkIGxpYnJhcnkgc3VmZml4IChub3JtYWxseSAiLnNvIikuCitzaHJleHRfY21kcz0nJHNocmV4dF9jbWRzJworCisjIEV4ZWN1dGFibGUgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICIiKS4KK2V4ZWV4dD0iJGV4ZWV4dCIKKworIyBBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHMuCitwaWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9waWNfUkMKK3BpY19tb2RlPSRwaWNfbW9kZQorCisjIFdoYXQgaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgY29tbWFuZD8KK21heF9jbWRfbGVuPSRsdF9jdl9zeXNfbWF4X2NtZF9sZW4KKworIyBEb2VzIGNvbXBpbGVyIHNpbXVsdGFuZW91c2x5IHN1cHBvcnQgLWMgYW5kIC1vIG9wdGlvbnM/Citjb21waWxlcl9jX289JGx0X2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX1JDCisKKyMgTXVzdCB3ZSBsb2NrIGZpbGVzIHdoZW4gZG9pbmcgY29tcGlsYXRpb24/CituZWVkX2xvY2tzPSRsdF9uZWVkX2xvY2tzCisKKyMgRG8gd2UgbmVlZCB0aGUgbGliIHByZWZpeCBmb3IgbW9kdWxlcz8KK25lZWRfbGliX3ByZWZpeD0kbmVlZF9saWJfcHJlZml4CisKKyMgRG8gd2UgbmVlZCBhIHZlcnNpb24gZm9yIGxpYnJhcmllcz8KK25lZWRfdmVyc2lvbj0kbmVlZF92ZXJzaW9uCisKKyMgV2hldGhlciBkbG9wZW4gaXMgc3VwcG9ydGVkLgorZGxvcGVuX3N1cHBvcnQ9JGVuYWJsZV9kbG9wZW4KKworIyBXaGV0aGVyIGRsb3BlbiBvZiBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc2VsZj0kZW5hYmxlX2Rsb3Blbl9zZWxmCisKKyMgV2hldGhlciBkbG9wZW4gb2Ygc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgorZGxvcGVuX3NlbGZfc3RhdGljPSRlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljCisKKyMgQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZy4KK2xpbmtfc3RhdGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX1JDCisKKyMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KK25vX2J1aWx0aW5fZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfUkMKKworIyBDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zLgorZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSRsdF9leHBvcnRfZHluYW1pY19mbGFnX3NwZWNfUkMKKworIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHNoYXJlZCBvYmplY3RzIGRpcmVjdGx5IGZyb20gYXJjaGl2ZXMuCit3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0kbHRfd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfUkMKKworIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHRocmVhZC1zYWZlIG9iamVjdHMuCit0aHJlYWRfc2FmZV9mbGFnX3NwZWM9JGx0X3RocmVhZF9zYWZlX2ZsYWdfc3BlY19SQworCisjIExpYnJhcnkgdmVyc2lvbmluZyB0eXBlLgordmVyc2lvbl90eXBlPSR2ZXJzaW9uX3R5cGUKKworIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KK2xpYm5hbWVfc3BlYz0kbHRfbGlibmFtZV9zcGVjCisKKyMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KKyMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRS4KK2xpYnJhcnlfbmFtZXNfc3BlYz0kbHRfbGlicmFyeV9uYW1lc19zcGVjCisKKyMgVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWUuCitzb25hbWVfc3BlYz0kbHRfc29uYW1lX3NwZWMKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgorUkFOTElCPSRsdF9SQU5MSUIKK29sZF9hcmNoaXZlX2NtZHM9JGx0X29sZF9hcmNoaXZlX2NtZHNfUkMKK29sZF9wb3N0aW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdGluc3RhbGxfY21kcworb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3R1bmluc3RhbGxfY21kcworCisjIENyZWF0ZSBhbiBvbGQtc3R5bGUgYXJjaGl2ZSBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX1JDCisKKyMgQ3JlYXRlIGEgdGVtcG9yYXJ5IG9sZC1zdHlsZSBhcmNoaXZlIHRvIGxpbmsgaW5zdGVhZCBvZiBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX1JDCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhIHNoYXJlZCBhcmNoaXZlLgorYXJjaGl2ZV9jbWRzPSRsdF9hcmNoaXZlX2NtZHNfUkMKK2FyY2hpdmVfZXhwc3ltX2NtZHM9JGx0X2FyY2hpdmVfZXhwc3ltX2NtZHNfUkMKK3Bvc3RpbnN0YWxsX2NtZHM9JGx0X3Bvc3RpbnN0YWxsX2NtZHMKK3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfcG9zdHVuaW5zdGFsbF9jbWRzCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSAoYXNzdW1lZCBzYW1lIGFzIGFib3ZlIGlmIGVtcHR5KQorbW9kdWxlX2NtZHM9JGx0X21vZHVsZV9jbWRzX1JDCittb2R1bGVfZXhwc3ltX2NtZHM9JGx0X21vZHVsZV9leHBzeW1fY21kc19SQworCisjIENvbW1hbmRzIHRvIHN0cmlwIGxpYnJhcmllcy4KK29sZF9zdHJpcGxpYj0kbHRfb2xkX3N0cmlwbGliCitzdHJpcGxpYj0kbHRfc3RyaXBsaWIKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3ByZWRlcF9vYmplY3RzPSRsdF9wcmVkZXBfb2JqZWN0c19SQworCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwb3N0ZGVwX29iamVjdHM9JGx0X3Bvc3RkZXBfb2JqZWN0c19SQworCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcHJlZGVwcz0kbHRfcHJlZGVwc19SQworCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwb3N0ZGVwcz0kbHRfcG9zdGRlcHNfUkMKKworIyBUaGUgbGlicmFyeSBzZWFyY2ggcGF0aCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBpbGVyIHdoZW4gbGlua2luZworIyBhIHNoYXJlZCBsaWJyYXJ5LgorY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoPSRsdF9jb21waWxlcl9saWJfc2VhcmNoX3BhdGhfUkMKKworIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KK2RlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9kZXBsaWJzX2NoZWNrX21ldGhvZAorCisjIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gZmlsZV9tYWdpYy4KK2ZpbGVfbWFnaWNfY21kPSRsdF9maWxlX21hZ2ljX2NtZAorCisjIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgorYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X2FsbG93X3VuZGVmaW5lZF9mbGFnX1JDCisKKyMgRmxhZyB0aGF0IGZvcmNlcyBubyB1bmRlZmluZWQgc3ltYm9scy4KK25vX3VuZGVmaW5lZF9mbGFnPSRsdF9ub191bmRlZmluZWRfZmxhZ19SQworCisjIENvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeS4KK2ZpbmlzaF9jbWRzPSRsdF9maW5pc2hfY21kcworCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dCBub3Qgc2hvd24uCitmaW5pc2hfZXZhbD0kbHRfZmluaXNoX2V2YWwKKworIyBUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzLgorZ2xvYmFsX3N5bWJvbF9waXBlPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlCisKKyMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgorZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIKK2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzCisKKyMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgorcnVucGF0aF92YXI9JHJ1bnBhdGhfdmFyCisKKyMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KK3NobGlicGF0aF92YXI9JHNobGlicGF0aF92YXIKKworIyBJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAorCisjIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgoraGFyZGNvZGVfYWN0aW9uPSRoYXJkY29kZV9hY3Rpb25fUkMKKworIyBXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzLgoraGFyZGNvZGVfaW50b19saWJzPSRoYXJkY29kZV9pbnRvX2xpYnMKKworIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCisjIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX1JDCisKKyMgSWYgbGQgaXMgdXNlZCB3aGVuIGxpbmtpbmcsIGZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50bworIyBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4gVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzCisjIG5vdCBleGlzdC4KK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQ9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfUkMKKworIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgLXJwYXRoIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGx0X2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfUkMKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisjIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9kaXJlY3Q9JGhhcmRjb2RlX2RpcmVjdF9SQworCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQorIyByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfbWludXNfTD0kaGFyZGNvZGVfbWludXNfTF9SQworCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvCisjIHRoZSByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9SQworCisjIFNldCB0byB5ZXMgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIgaW50byB0aGUgbGlicmFyeQorIyBhbmQgYWxsIHN1YnNlcXVlbnQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyBsaW5rZWQgYWdhaW5zdCBpdC4KK2hhcmRjb2RlX2F1dG9tYXRpYz0kaGFyZGNvZGVfYXV0b21hdGljX1JDCisKKyMgVmFyaWFibGVzIHdob3NlIHZhbHVlcyBzaG91bGQgYmUgc2F2ZWQgaW4gbGlidG9vbCB3cmFwcGVyIHNjcmlwdHMgYW5kCisjIHJlc3RvcmVkIGF0IHJlbGluayB0aW1lLgordmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayIKKworIyBXaGV0aGVyIGxpYnRvb2wgbXVzdCBsaW5rIGEgcHJvZ3JhbSBhZ2FpbnN0IGFsbCBpdHMgZGVwZW5kZW5jeSBsaWJyYXJpZXMuCitsaW5rX2FsbF9kZXBsaWJzPSRsaW5rX2FsbF9kZXBsaWJzX1JDCisKKyMgQ29tcGlsZS10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCitzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYworCisjIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMKKworIyBGaXggdGhlIHNoZWxsIHZhcmlhYmxlIFwkc3JjZmlsZSBmb3IgdGhlIGNvbXBpbGVyLgorZml4X3NyY2ZpbGVfcGF0aD0iJGZpeF9zcmNmaWxlX3BhdGhfUkMiCisKKyMgU2V0IHRvIHllcyBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KK2Fsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzX1JDCisKKyMgVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9scy4KK2V4cG9ydF9zeW1ib2xzX2NtZHM9JGx0X2V4cG9ydF9zeW1ib2xzX2NtZHNfUkMKKworIyBUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorZXh0cmFjdF9leHBzeW1zX2NtZHM9JGx0X2V4dHJhY3RfZXhwc3ltc19jbWRzCisKKyMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scy4KK2V4Y2x1ZGVfZXhwc3ltcz0kbHRfZXhjbHVkZV9leHBzeW1zX1JDCisKKyMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkLgoraW5jbHVkZV9leHBzeW1zPSRsdF9pbmNsdWRlX2V4cHN5bXNfUkMKKworIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUKKworX19FT0ZfXworCisKK2Vsc2UKKyAgIyBJZiB0aGVyZSBpcyBubyBNYWtlZmlsZSB5ZXQsIHdlIHJlbHkgb24gYSBtYWtlIHJ1bGUgdG8gZXhlY3V0ZQorICAjIGBjb25maWcuc3RhdHVzIC0tcmVjaGVjaycgdG8gcmVydW4gdGhlc2UgdGVzdHMgYW5kIGNyZWF0ZSB0aGUKKyAgIyBsaWJ0b29sIHNjcmlwdCB0aGVuLgorICBsdG1haW5faW49YGVjaG8gJGx0bWFpbiB8IHNlZCAtZSAncy9cLnNoJC8uaW4vJ2AKKyAgaWYgdGVzdCAtZiAiJGx0bWFpbl9pbiI7IHRoZW4KKyAgICB0ZXN0IC1mIE1ha2VmaWxlICYmIG1ha2UgIiRsdG1haW4iCisgIGZpCitmaQorCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworQ0M9IiRsdF9zYXZlX0NDIgorCisJOzsKKworICAgICAgKikKKwl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBVbnN1cHBvcnRlZCB0YWcgbmFtZTogJHRhZ25hbWUiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogVW5zdXBwb3J0ZWQgdGFnIG5hbWU6ICR0YWduYW1lIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisJOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBBcHBlbmQgdGhlIG5ldyB0YWcgbmFtZSB0byB0aGUgbGlzdCBvZiBhdmFpbGFibGUgdGFncy4KKyAgICAgIGlmIHRlc3QgLW4gIiR0YWduYW1lIiA7IHRoZW4KKyAgICAgIGF2YWlsYWJsZV90YWdzPSIkYXZhaWxhYmxlX3RhZ3MgJHRhZ25hbWUiCisgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorCisgICMgTm93IHN1YnN0aXR1dGUgdGhlIHVwZGF0ZWQgbGlzdCBvZiBhdmFpbGFibGUgdGFncy4KKyAgaWYgZXZhbCAic2VkIC1lICdzL15hdmFpbGFibGVfdGFncz0uKlwkL2F2YWlsYWJsZV90YWdzPVwiJGF2YWlsYWJsZV90YWdzXCIvJyBcIiRvZmlsZVwiID4gXCIke29maWxlfVRcIiI7IHRoZW4KKyAgICBtdiAiJHtvZmlsZX1UIiAiJG9maWxlIgorICAgIGNobW9kICt4ICIkb2ZpbGUiCisgIGVsc2UKKyAgICBybSAtZiAiJHtvZmlsZX1UIgorICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHVuYWJsZSB0byB1cGRhdGUgbGlzdCBvZiBhdmFpbGFibGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiB1bmFibGUgdG8gdXBkYXRlIGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ2dlZCBjb25maWd1cmF0aW9ucy4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgZmkKK2ZpCisKKworCisjIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCitMSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0bWFpbi5zaCIKKworIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KK0xJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJworCisjIFByZXZlbnQgbXVsdGlwbGUgZXhwYW5zaW9uCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1nY2M7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWdjYyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1CitlY2hvICIke0VDSE9fVH0kQ0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQ0MiOyB0aGVuCisgIGFjX2N0X0NDPSRDQworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iZ2NjIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKK2ZpCitmaQorYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdF9DQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgQ0M9JGFjX2N0X0NDCitlbHNlCisgIENDPSIkYWNfY3ZfcHJvZ19DQyIKK2ZpCisKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Y2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Y2M7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWNjIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19DQyI7IHRoZW4KKyAgYWNfY3RfQ0M9JENDCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iY2MiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCithY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQworaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0NDIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworICBDQz0kYWNfY3RfQ0MKK2Vsc2UKKyAgQ0M9IiRhY19jdl9wcm9nX0NDIgorZmkKKworZmkKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBhY19wcm9nX3JlamVjdGVkPW5vCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGlmIHRlc3QgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgorICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCisgICAgICAgY29udGludWUKKyAgICAgZmkKKyAgICBhY19jdl9wcm9nX0NDPSJjYyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCisgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KKyAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCisgIHNoaWZ0CisgIGlmIHRlc3QgJCMgIT0gMDsgdGhlbgorICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgorICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KKyAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KKyAgICBzaGlmdAorICAgIGFjX2N2X3Byb2dfQ0M9IiRhc19kaXIvJGFjX3dvcmQkezErJyAnfSRAIgorICBmaQorZmkKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgZm9yIGFjX3Byb2cgaW4gY2wKKyAgZG8KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ0M9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgICB0ZXN0IC1uICIkQ0MiICYmIGJyZWFrCisgIGRvbmUKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgIGFjX2N0X0NDPSRDQworICBmb3IgYWNfcHJvZyBpbiBjbAorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfcHJvZyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK2FjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCitpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfQ0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIHRlc3QgLW4gIiRhY19jdF9DQyIgJiYgYnJlYWsKK2RvbmUKKworICBDQz0kYWNfY3RfQ0MKK2ZpCisKK2ZpCisKKwordGVzdCAteiAiJENDIiAmJiB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCisjIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCitlY2hvICIkYXNfbWU6JExJTkVOTzoiIFwKKyAgICAgImNoZWNraW5nIGZvciBDIGNvbXBpbGVyIHZlcnNpb24iID4mNQorYWNfY29tcGlsZXI9YHNldCBYICRhY19jb21waWxlOyBlY2hvICQyYAoreyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZXIgLS12ZXJzaW9uIDwvZGV2L251bGwgPiY1XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA8L2Rldi9udWxsID4mNSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfQoreyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZXIgLXYgPC9kZXYvbnVsbCA+JjVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZXIgLXYgPC9kZXYvbnVsbCA+JjUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KK3sgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVyIC1WIDwvZGV2L251bGwgPiY1XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGVyIC1WIDwvZGV2L251bGwgPiY1KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9CisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2NfY29tcGlsZXJfZ251K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKyNpZm5kZWYgX19HTlVDX18KKyAgICAgICBjaG9rZSBtZQorI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jb21waWxlcl9nbnU9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2NvbXBpbGVyX2dudT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2FjX2N2X2NfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNgorR0NDPWB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXMgJiYgZWNobyB5ZXNgCithY190ZXN0X0NGTEFHUz0ke0NGTEFHUytzZXR9CithY19zYXZlX0NGTEFHUz0kQ0ZMQUdTCitDRkxBR1M9Ii1nIgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWciID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX2crc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jdl9wcm9nX2NjX2c9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfZyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfcHJvZ19jY19nIiA+JjYKK2lmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ0ZMQUdTPSRhY19zYXZlX0NGTEFHUworZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9CisgIGZpCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBBTlNJIEMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgQU5TSSBDLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX3N0ZGMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19jY19zdGRjPW5vCithY19zYXZlX0NDPSRDQworY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZSBzdG9sZW4gZnJvbSBSQ1MgNS43J3Mgc3JjL2NvbmYuc2guICAqLworc3RydWN0IGJ1ZiB7IGludCB4OyB9OworRklMRSAqICgqcmNzb3BlbikgKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KTsKK3N0YXRpYyBjaGFyICplIChwLCBpKQorICAgICBjaGFyICoqcDsKKyAgICAgaW50IGk7Cit7CisgIHJldHVybiBwW2ldOworfQorc3RhdGljIGNoYXIgKmYgKGNoYXIgKiAoKmcpIChjaGFyICoqLCBpbnQpLCBjaGFyICoqcCwgLi4uKQoreworICBjaGFyICpzOworICB2YV9saXN0IHY7CisgIHZhX3N0YXJ0ICh2LHApOworICBzID0gZyAocCwgdmFfYXJnICh2LGludCkpOworICB2YV9lbmQgKHYpOworICByZXR1cm4gczsKK30KKworLyogT1NGIDQuMCBDb21wYXEgY2MgaXMgc29tZSBzb3J0IG9mIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQuICBJdCBoYXMKKyAgIGZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIHN0dWZmLCBidXQgbm90ICdceEhIJyBoZXggY2hhcmFjdGVyIGNvbnN0YW50cy4KKyAgIFRoZXNlIGRvbid0IHByb3Zva2UgYW4gZXJyb3IgdW5mb3J0dW5hdGVseSwgaW5zdGVhZCBhcmUgc2lsZW50bHkgdHJlYXRlZAorICAgYXMgJ3gnLiAgVGhlIGZvbGxvd2luZyBpbmR1Y2VzIGFuIGVycm9yLCB1bnRpbCAtc3RkMSBpcyBhZGRlZCB0byBnZXQKKyAgIHByb3BlciBBTlNJIG1vZGUuICBDdXJpb3VzbHkgJ1x4MDAnIT0neCcgYWx3YXlzIGNvbWVzIG91dCB0cnVlLCBmb3IgYW4KKyAgIGFycmF5IHNpemUgYXQgbGVhc3QuICBJdCdzIG5lY2Vzc2FyeSB0byB3cml0ZSAnXHgwMCc9PTAgdG8gZ2V0IHNvbWV0aGluZworICAgdGhhdCdzIHRydWUgb25seSB3aXRoIC1zdGQxLiAgKi8KK2ludCBvc2Y0X2NjX2FycmF5IFsnXHgwMCcgPT0gMCA/IDEgOiAtMV07CisKK2ludCB0ZXN0IChpbnQgaSwgZG91YmxlIHgpOworc3RydWN0IHMxIHtpbnQgKCpmKSAoaW50IGEpO307CitzdHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUgYSk7fTsKK2ludCBwYWlybmFtZXMgKGludCwgY2hhciAqKiwgRklMRSAqKCopKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KSwgaW50LCBpbnQpOworaW50IGFyZ2M7CitjaGFyICoqYXJndjsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGYgKGUsIGFyZ3YsIDApICE9IGFyZ3ZbMF0gIHx8ICBmIChlLCBhcmd2LCAxKSAhPSBhcmd2WzFdOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCisjIERvbid0IHRyeSBnY2MgLWFuc2k7IHRoYXQgdHVybnMgb2ZmIHVzZWZ1bCBleHRlbnNpb25zIGFuZAorIyBicmVha3Mgc29tZSBzeXN0ZW1zJyBoZWFkZXIgZmlsZXMuCisjIEFJWAkJCS1xbGFuZ2x2bD1hbnNpCisjIFVsdHJpeCBhbmQgT1NGLzEJLXN0ZDEKKyMgSFAtVVggMTAuMjAgYW5kIGxhdGVyCS1BZQorIyBIUC1VWCBvbGRlciB2ZXJzaW9ucwktQWEgLURfSFBVWF9TT1VSQ0UKKyMgU1ZSNAkJCS1YYyAtRF9fRVhURU5TSU9OU19fCitmb3IgYWNfYXJnIGluICIiIC1xbGFuZ2x2bD1hbnNpIC1zdGQxIC1BZSAiLUFhIC1EX0hQVVhfU09VUkNFIiAiLVhjIC1EX19FWFRFTlNJT05TX18iCitkbworICBDQz0iJGFjX3NhdmVfQ0MgJGFjX2FyZyIKKyAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9wcm9nX2NjX3N0ZGM9JGFjX2FyZworYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0Citkb25lCitybSAtZiBjb25mdGVzdC4kYWNfZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQKK0NDPSRhY19zYXZlX0NDCisKK2ZpCisKK2Nhc2UgIngkYWNfY3ZfcHJvZ19jY19zdGRjIiBpbgorICB4fHhubykKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBub25lIG5lZWRlZCIgPiY1CitlY2hvICIke0VDSE9fVH1ub25lIG5lZWRlZCIgPiY2IDs7CisgICopCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY2Nfc3RkYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfcHJvZ19jY19zdGRjIiA+JjYKKyAgICBDQz0iJENDICRhY19jdl9wcm9nX2NjX3N0ZGMiIDs7Citlc2FjCisKKyMgU29tZSBwZW9wbGUgdXNlIGEgQysrIGNvbXBpbGVyIHRvIGNvbXBpbGUgQy4gIFNpbmNlIHdlIHVzZSBgZXhpdCcsCisjIGluIEMrKyB3ZSBuZWVkIHRvIGRlY2xhcmUgaXQuICBJbiBjYXNlIHNvbWVvbmUgdXNlcyB0aGUgc2FtZSBjb21waWxlcgorIyBmb3IgYm90aCBjb21waWxpbmcgQyBhbmQgQysrIHdlIG5lZWQgdG8gaGF2ZSB0aGUgQysrIGNvbXBpbGVyIGRlY2lkZQorIyB0aGUgZGVjbGFyYXRpb24gb2YgZXhpdCwgc2luY2UgaXQncyB0aGUgbW9zdCBkZW1hbmRpbmcgZW52aXJvbm1lbnQuCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyNpZm5kZWYgX19jcGx1c3BsdXMKKyAgY2hva2UgbWUKKyNlbmRpZgorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGZvciBhY19kZWNsYXJhdGlvbiBpbiBcCisgICAnJyBcCisgICAnZXh0ZXJuICJDIiB2b2lkIHN0ZDo6ZXhpdCAoaW50KSB0aHJvdyAoKTsgdXNpbmcgc3RkOjpleGl0OycgXAorICAgJ2V4dGVybiAiQyIgdm9pZCBzdGQ6OmV4aXQgKGludCk7IHVzaW5nIHN0ZDo6ZXhpdDsnIFwKKyAgICdleHRlcm4gIkMiIHZvaWQgZXhpdCAoaW50KSB0aHJvdyAoKTsnIFwKKyAgICdleHRlcm4gIkMiIHZvaWQgZXhpdCAoaW50KTsnIFwKKyAgICd2b2lkIGV4aXQgKGludCk7JworZG8KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfZGVjbGFyYXRpb24KKyNpbmNsdWRlIDxzdGRsaWIuaD4KK2ludAorbWFpbiAoKQoreworZXhpdCAoNDIpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2RlY2xhcmF0aW9uCitpbnQKK21haW4gKCkKK3sKK2V4aXQgKDQyKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBicmVhaworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZG9uZQorcm0gLWYgY29uZnRlc3QqCitpZiB0ZXN0IC1uICIkYWNfZGVjbGFyYXRpb24iOyB0aGVuCisgIGVjaG8gJyNpZmRlZiBfX2NwbHVzcGx1cycgPj5jb25mZGVmcy5oCisgIGVjaG8gJGFjX2RlY2xhcmF0aW9uICAgICAgPj5jb25mZGVmcy5oCisgIGVjaG8gJyNlbmRpZicgICAgICAgICAgICAgPj5jb25mZGVmcy5oCitmaQorCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKyMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAorIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCisjIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKKyMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCisjIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKKyMgSVJJWCAvc2Jpbi9pbnN0YWxsCisjIEFJWCAvYmluL2luc3RhbGwKKyMgQW1pZ2FPUyAvQy9pbnN0YWxsLCB3aGljaCBpbnN0YWxscyBib290YmxvY2tzIG9uIGZsb3BweSBkaXNjcworIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKKyMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncworIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgorIyBPUy8yJ3Mgc3lzdGVtIGluc3RhbGwsIHdoaWNoIGhhcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNlbWFudGljCisjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgoraWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KK2Nhc2UgJGFzX2Rpci8gaW4KKyAgLi8gfCAuLy8gfCAvY0MvKiB8IFwKKyAgL2V0Yy8qIHwgL3Vzci9zYmluLyogfCAvdXNyL2V0Yy8qIHwgL3NiaW4vKiB8IC91c3IvYWZzd3MvYmluLyogfCBcCisgID86XFwvb3MyXFwvaW5zdGFsbFxcLyogfCA/OlxcL09TMlxcL0lOU1RBTExcXC8qIHwgXAorICAvdXNyL3VjYi8qICkgOzsKKyAgKikKKyAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAorICAgICMgYnkgZGVmYXVsdC4KKyAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKwlpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IjsgdGhlbgorCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKwkgICAgZ3JlcCBkc3Btc2cgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCisJICAgIDoKKwkgIGVsaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKwkgICAgZ3JlcCBwd3BsdXMgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICAjIHByb2dyYW0tc3BlY2lmaWMgaW5zdGFsbCBzY3JpcHQgdXNlZCBieSBIUCBwd3BsdXMtLWRvbid0IHVzZS4KKwkgICAgOgorCSAgZWxzZQorCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQgLWMiCisJICAgIGJyZWFrIDMKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICBkb25lCisgICAgOzsKK2VzYWMKK2RvbmUKKworCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9JGFjX2N2X3BhdGhfaW5zdGFsbAorICBlbHNlCisgICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQorICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCisgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KKyAgICBJTlNUQUxMPSRhY19pbnN0YWxsX3NoCisgIGZpCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJElOU1RBTEwiID4mNQorZWNobyAiJHtFQ0hPX1R9JElOU1RBTEwiID4mNgorCisjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCisjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgordGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JworCisKK2lmIHRlc3QgIiRHQ0MiID0geWVzIDsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgT0xEQ0ZMQUdTPSIkQ0ZMQUdTIC1XYWxsIC1XbWlzc2luZy1wcm90b3R5cGVzIC1Xc3RyaWN0LXByb3RvdHlwZXMiCisgICAgQ0ZMQUdTPSIkT0xEQ0ZMQUdTIC1mZXhjZXB0aW9ucyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZmV4Y2VwdGlvbnMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1mZXhjZXB0aW9ucy4uLiAkRUNIT19DIiA+JjYKKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgQ0ZMQUdTPSIkT0xEQ0ZMQUdTIgorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgQ1hYRkxBR1M9YGVjaG8gIiRDRkxBR1MiIHwgc2VkICdzLyAtV21pc3NpbmctcHJvdG90eXBlcyAtV3N0cmljdC1wcm90b3R5cGVzLy8nYAorZmkKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9zdGRjK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICA6CitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICA6CitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgOgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2lmICgoJyAnICYgMHgwRkYpID09IDB4MDIwKQorIyBkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQorIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQorI2Vsc2UKKyMgZGVmaW5lIElTTE9XRVIoYykgXAorCQkgICAoKCdhJyA8PSAoYykgJiYgKGMpIDw9ICdpJykgXAorCQkgICAgIHx8ICgnaicgPD0gKGMpICYmIChjKSA8PSAncicpIFwKKwkJICAgICB8fCAoJ3MnIDw9IChjKSAmJiAoYykgPD0gJ3onKSkKKyMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAoKGMpIHwgMHg0MCkgOiAoYykpCisjZW5kaWYKKworI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKK2ludAorbWFpbiAoKQoreworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgIGlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkKKwl8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkKKyAgICAgIGV4aXQoMik7CisgIGV4aXQgKDApOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQorZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworKCBleGl0ICRhY19zdGF0dXMgKQorYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb3JlICouY29yZSBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2ZpCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9oZWFkZXJfc3RkYyIgPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBTVERDX0hFQURFUlMgMQorX0FDRU9GCisKK2ZpCisKKworCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4uLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2NfYmlnZW5kaWFuK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2N2X2NfYmlnZW5kaWFuPXVua25vd24KKyMgU2VlIGlmIHN5cy9wYXJhbS5oIGRlZmluZXMgdGhlIEJZVEVfT1JERVIgbWFjcm8uCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KK2ludAorbWFpbiAoKQoreworCisjaWYgIUJZVEVfT1JERVIgfHwgIUJJR19FTkRJQU4gfHwgIUxJVFRMRV9FTkRJQU4KKyBib2d1cyBlbmRpYW4gbWFjcm9zCisjZW5kaWYKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICAjIEl0IGRvZXM7IG5vdyBzZWUgd2hldGhlciBpdCBkZWZpbmVkIHRvIEJJR19FTkRJQU4gb3Igbm90LgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CitpbnQKK21haW4gKCkKK3sKKworI2lmIEJZVEVfT1JERVIgIT0gQklHX0VORElBTgorIG5vdCBiaWcgZW5kaWFuCisjZW5kaWYKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfY19iaWdlbmRpYW49bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgICBlY2hvICRhY19uICJjcm9zcy1jb21waWxpbmcuLi4gIiAyPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworbWFpbiAoKSB7CisgIC8qIEFyZSB3ZSBsaXR0bGUgb3IgYmlnIGVuZGlhbj8gIEZyb20gSGFyYmlzb24mU3RlZWxlLiAgKi8KKyAgdW5pb24KKyAgeworICAgIGxvbmcgbDsKKyAgICBjaGFyIGNbc2l6ZW9mIChsb25nKV07CisgIH0gdTsKKyAgdS5sID0gMTsKKyAgZXhpdCAodS5jW3NpemVvZiAobG9uZykgLSAxXSA9PSAxKTsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2NfYmlnZW5kaWFuPW5vCitlbHNlCisgIGVjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1CitlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisoIGV4aXQgJGFjX3N0YXR1cyApCithY19jdl9jX2JpZ2VuZGlhbj15ZXMKK2ZpCitybSAtZiBjb3JlICouY29yZSBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2ZpCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2NfYmlnZW5kaWFuIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9jX2JpZ2VuZGlhbiIgPiY2CitpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB0byBwcm9iZSBmb3IgYnl0ZSBvcmRlcmluZyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHRvIHByb2JlIGZvciBieXRlIG9yZGVyaW5nLi4uICRFQ0hPX0MiID4mNgorCitjYXQgPmNvbmZ0ZXN0LmMgPDxFT0YKK3Nob3J0IGFzY2lpX21tW10gPSB7IDB4NDI0OSwgMHg0NzY1LCAweDZFNDQsIDB4Njk2MSwgMHg2RTUzLCAweDc5NTMsIDAgfTsKK3Nob3J0IGFzY2lpX2lpW10gPSB7IDB4Njk0QywgMHg1NDU0LCAweDY1NkMsIDB4NkU0NSwgMHg2OTQ0LCAweDZFNjEsIDAgfTsKK3ZvaWQgX2FzY2lpKCkgeyBjaGFyKiBzID0gKGNoYXIqKSBhc2NpaV9tbTsgcyA9IChjaGFyKikgYXNjaWlfaWk7IH0KK3Nob3J0IGViY2RpY19paVtdID0geyAweDg5RDMsIDB4RTNFMywgMHg4NTkzLCAweDk1QzUsIDB4ODlDNCwgMHg5NTgxLCAwIH07CitzaG9ydCBlYmNkaWNfbW1bXSA9IHsgMHhDMkM5LCAweEM3ODUsIDB4OTVDNCwgMHg4OTgxLCAweDk1RTIsIDB4QThFMiwgMCB9Owordm9pZCBfZWJjZGljKCkgeyBjaGFyKiBzID0gKGNoYXIqKSBlYmNkaWNfbW07IHMgPSAoY2hhciopIGViY2RpY19paTsgfQoraW50IG1haW4oKSB7IF9hc2NpaSAoKTsgX2ViY2RpYyAoKTsgcmV0dXJuIDA7IH0KK0VPRgorIGlmIHRlc3QgLWYgY29uZnRlc3QuYyA7IHRoZW4KKyAgICAgaWYgJHtDQy1jY30gLWMgY29uZnRlc3QuYyAtbyBjb25mdGVzdC5vICYmIHRlc3QgLWYgY29uZnRlc3QubyA7IHRoZW4KKyAgICAgICAgaWYgdGVzdCBgZ3JlcCAtbCBCSUdlbkRpYW5TeVMgY29uZnRlc3Qub2AgOyB0aGVuCisgICAgICAgICAgIGVjaG8gJGFjX24gJyBiaWcgZW5kaWFuIHByb2JlIE9LLCAnIDE+JjYKKyAgICAgICAgICAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCisgICAgICAgIGZpCisgICAgICAgIGlmIHRlc3QgYGdyZXAgLWwgTGlUVGxlRW5EaWFuIGNvbmZ0ZXN0Lm9gIDsgdGhlbgorICAgICAgICAgICBlY2hvICRhY19uICcgbGl0dGxlIGVuZGlhbiBwcm9iZSBPSywgJyAxPiY2CisgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0geWVzIDsgdGhlbgorICAgICAgICAgICAgYWNfY3ZfY19iaWdlbmRpYW49dW5rbm93bjsKKyAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYWNfY3ZfY19iaWdlbmRpYW49bm8KKyAgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICAgICAgZWNobyAkYWNfbiAnZ3Vlc3NpbmcgYmlnZW5kaWFuIC4uLiAgJyA+JjYKKyAgICAgZmkKKyAgZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jX2JpZ2VuZGlhbiIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfY19iaWdlbmRpYW4iID4mNgorZmkKK2lmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0geWVzOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCitfQUNFT0YKKworICBCWVRFT1JERVI9NDMyMQorZWxzZQorICBCWVRFT1JERVI9MTIzNAorZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBCWVRFT1JERVIgJEJZVEVPUkRFUgorX0FDRU9GCisKK2lmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0gdW5rbm93bjsgdGhlbgorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiB1bmtub3duIGVuZGlhbmVzcyAtIHNvcnJ5IiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IHVua25vd24gZW5kaWFuZXNzIC0gc29ycnkiID4mMjt9CisgICB7IChleGl0IHBsZWFzZSBwcmUtc2V0IGFjX2N2X2NfYmlnZW5kaWFuKTsgZXhpdCBwbGVhc2UgcHJlLXNldCBhY19jdl9jX2JpZ2VuZGlhbjsgfTsgfQorZmkKKworCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGFuIEFOU0kgQy1jb25mb3JtaW5nIGNvbnN0IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGFuIEFOU0kgQy1jb25mb3JtaW5nIGNvbnN0Li4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9jX2NvbnN0K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKy8qIEZJWE1FOiBJbmNsdWRlIHRoZSBjb21tZW50cyBzdWdnZXN0ZWQgYnkgUGF1bC4gKi8KKyNpZm5kZWYgX19jcGx1c3BsdXMKKyAgLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KKyAgdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsKKyAgY29uc3QgY2hhcnNldCB4OworICAvKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLworICBjaGFyIGNvbnN0ICpjb25zdCAqY2NwOworICBjaGFyICoqcDsKKyAgLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KKyAgc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9OworICBzdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKKyAgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgorICAgICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbgorICAgICBhbiBhcm0gb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50CisgICAgIGV4cHJlc3Npb24gKi8KKyAgY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOworICBjY3AgPSAmZyArIChnID8gZy1nIDogMCk7CisgIC8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCisgICsrY2NwOworICBwID0gKGNoYXIqKikgY2NwOworICBjY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKKyAgeyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KKyAgICBjaGFyICp0OworICAgIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7CisKKyAgICAqdCsrID0gMDsKKyAgfQorICB7IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLworICAgIGludCB4W10gPSB7MjUsIDE3fTsKKyAgICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOworICAgICsrZm9vOworICB9CisgIHsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLworICAgIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOworICAgIGlwdHIgcCA9IDA7CisgICAgKytwOworICB9CisgIHsgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZworICAgICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KKyAgICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OworICAgIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKKyAgfQorICB7IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLworICAgIGNvbnN0IGludCBmb28gPSAxMDsKKyAgfQorI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9jX2NvbnN0PXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jdl9jX2NvbnN0PW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jX2NvbnN0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9jX2NvbnN0IiA+JjYKK2lmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBjb25zdAorX0FDRU9GCisKK2ZpCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNpemVfdC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfdHlwZV9zaXplX3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAoraW50CittYWluICgpCit7CitpZiAoKHNpemVfdCAqKSAwKQorICByZXR1cm4gMDsKK2lmIChzaXplb2YgKHNpemVfdCkpCisgIHJldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X3R5cGVfc2l6ZV90PXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jdl90eXBlX3NpemVfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9zaXplX3QiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfc2l6ZV90IiA+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0geWVzOyB0aGVuCisgIDoKK2Vsc2UKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBzaXplX3QgdW5zaWduZWQKK19BQ0VPRgorCitmaQorCisKKworZm9yIGFjX2Z1bmMgaW4gbWVtbW92ZSBiY29weQorZG8KK2FzX2FjX3Zhcj1gZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNgoraWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY192YXIrc2V0fVwiID0gc2V0IjsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKy8qIERlZmluZSAkYWNfZnVuYyB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICRhY19mdW5jLgorICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCisjZGVmaW5lICRhY19mdW5jIGlubm9jdW91c18kYWNfZnVuYworCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYyAoKTsgYmVsb3cuCisgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisKKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisKKyN1bmRlZiAkYWNfZnVuYworCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jICgpOworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorY2hhciAoKmYpICgpID0gJGFjX2Z1bmM7CisjZW5kaWYKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGYgIT0gJGFjX2Z1bmM7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgZXZhbCAiJGFzX2FjX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2V2YWwgIiRhc19hY192YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCIgPiY1CitlY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCIgPiY2CitpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCitkb25lCisKKworCisKK2ZvciBhY19oZWFkZXIgaW4gZmNudGwuaCB1bmlzdGQuaAorZG8KK2FzX2FjX0hlYWRlcj1gZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAoraWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY19IZWFkZXIrc2V0fVwiID0gc2V0IjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjYKK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfSGVhZGVyK3NldH1cIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY1CitlY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY2CitlbHNlCisgICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkuLi4gJEVDSE9fQyIgPiY2CitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisjaW5jbHVkZSA8JGFjX2hlYWRlcj4KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2hlYWRlcl9jb21waWxlcj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2CisKKyMgSXMgdGhlIGhlYWRlciBwcmVzZW50PworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlLi4uICRFQ0hPX0MiID4mNgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8JGFjX2hlYWRlcj4KK19BQ0VPRgoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQorICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgYWNfY3BwX2Vycj0kYWNfY19wcmVwcm9jX3dhcm5fZmxhZworICAgIGFjX2NwcF9lcnI9JGFjX2NwcF9lcnIkYWNfY193ZXJyb3JfZmxhZworICBlbHNlCisgICAgYWNfY3BwX2Vycj0KKyAgZmkKK2Vsc2UKKyAgYWNfY3BwX2Vycj15ZXMKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KKyAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgYWNfaGVhZGVyX3ByZXByb2M9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2CisKKyMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPworY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbgorICB5ZXM6bm86ICkKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KKyAgICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKKyAgICA7OworICBubzp5ZXM6KiApCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiYyO30KKyAgICAoCisgICAgICBjYXQgPDxcX0FTQk9YCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgUmVwb3J0IHRoaXMgdG8gZXhwYXQtYnVnc0BsaWJleHBhdC5vcmcgIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCitfQVNCT1gKKyAgICApIHwKKyAgICAgIHNlZCAicy9eLyRhc19tZTogV0FSTklORzogICAgIC8iID4mMgorICAgIDs7Citlc2FjCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjYKK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfSGVhZGVyK3NldH1cIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgZXZhbCAiJGFzX2FjX0hlYWRlcj1cJGFjX2hlYWRlcl9wcmVwcm9jIgorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjUKK2VjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjYKKworZmkKK2lmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igb2ZmX3QuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3R5cGVfb2ZmX3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAoraW50CittYWluICgpCit7CitpZiAoKG9mZl90ICopIDApCisgIHJldHVybiAwOworaWYgKHNpemVvZiAob2ZmX3QpKQorICByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl90eXBlX29mZl90PXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jdl90eXBlX29mZl90PW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX29mZl90IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX29mZl90IiA+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSB5ZXM7IHRoZW4KKyAgOgorZWxzZQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIG9mZl90IGxvbmcKK19BQ0VPRgorCitmaQorCisKKworZm9yIGFjX2hlYWRlciBpbiBzdGRsaWIuaCB1bmlzdGQuaAorZG8KK2FzX2FjX0hlYWRlcj1gZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAoraWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY19IZWFkZXIrc2V0fVwiID0gc2V0IjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjYKK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfSGVhZGVyK3NldH1cIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY1CitlY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY2CitlbHNlCisgICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkuLi4gJEVDSE9fQyIgPiY2CitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisjaW5jbHVkZSA8JGFjX2hlYWRlcj4KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2hlYWRlcl9jb21waWxlcj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2CisKKyMgSXMgdGhlIGhlYWRlciBwcmVzZW50PworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlLi4uICRFQ0hPX0MiID4mNgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8JGFjX2hlYWRlcj4KK19BQ0VPRgoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQorICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgYWNfY3BwX2Vycj0kYWNfY19wcmVwcm9jX3dhcm5fZmxhZworICAgIGFjX2NwcF9lcnI9JGFjX2NwcF9lcnIkYWNfY193ZXJyb3JfZmxhZworICBlbHNlCisgICAgYWNfY3BwX2Vycj0KKyAgZmkKK2Vsc2UKKyAgYWNfY3BwX2Vycj15ZXMKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KKyAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgYWNfaGVhZGVyX3ByZXByb2M9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2CisKKyMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPworY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbgorICB5ZXM6bm86ICkKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KKyAgICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKKyAgICA7OworICBubzp5ZXM6KiApCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiYyO30KKyAgICAoCisgICAgICBjYXQgPDxcX0FTQk9YCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgUmVwb3J0IHRoaXMgdG8gZXhwYXQtYnVnc0BsaWJleHBhdC5vcmcgIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCitfQVNCT1gKKyAgICApIHwKKyAgICAgIHNlZCAicy9eLyRhc19tZTogV0FSTklORzogICAgIC8iID4mMgorICAgIDs7Citlc2FjCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjYKK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfSGVhZGVyK3NldH1cIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgZXZhbCAiJGFzX2FjX0hlYWRlcj1cJGFjX2hlYWRlcl9wcmVwcm9jIgorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjUKK2VjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjYKKworZmkKK2lmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKK2RvCithc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjYKK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfdmFyK3NldH1cIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisvKiBEZWZpbmUgJGFjX2Z1bmMgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyAkYWNfZnVuYy4KKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworI2RlZmluZSAkYWNfZnVuYyBpbm5vY3VvdXNfJGFjX2Z1bmMKKworLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMgKCk7IGJlbG93LgorICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLworCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCisjdW5kZWYgJGFjX2Z1bmMKKworLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYyAoKTsKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKK2NoYXIgKCpmKSAoKSA9ICRhY19mdW5jOworI2VuZGlmCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKK3JldHVybiBmICE9ICRhY19mdW5jOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGV2YWwgIiRhc19hY192YXI9eWVzIgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitldmFsICIkYXNfYWNfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNQorZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNgoraWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCA9IHllczsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorZG9uZQorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubworZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisvKiBtYWxsb2MgbWlnaHQgaGF2ZSBiZWVuIHJlbmFtZWQgYXMgcnBsX21hbGxvYy4gKi8KKyN1bmRlZiBtYWxsb2MKKworLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCisgICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKKwltbWFwIHByaXZhdGUgbm90IGZpeGVkCisJbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKKwltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCisJbW1hcCBzaGFyZWQgbm90IGZpeGVkCisJbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAorCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAorICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKKyAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKKyAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQorICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQorICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGUgc3lzdGVtIGJ1ZmZlciBjYWNoZQorICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKKyAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0CisgICBwcm9wYWdhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KKworICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgorICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKKyAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQorICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLworCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisjaWYgIVNURENfSEVBREVSUyAmJiAhSEFWRV9TVERMSUJfSAorY2hhciAqbWFsbG9jICgpOworI2VuZGlmCisKKy8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KKyNpZiAhSEFWRV9HRVRQQUdFU0laRQorLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KKyMgaWYgIUhBVkVfU1lTX1BBUkFNX0gKKyMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKKyMgZW5kaWYKKworIyBpZmRlZiBfU0NfUEFHRVNJWkUKKyMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQorIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLworIyAgaWYgSEFWRV9TWVNfUEFSQU1fSAorIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKKyMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQorIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLworIyAgICBpZmRlZiBOQlBHCisjICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCisjICAgICBpZm5kZWYgQ0xTSVpFCisjICAgICAgZGVmaW5lIENMU0laRSAxCisjICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KKyMgICAgZWxzZSAvKiBubyBOQlBHICovCisjICAgICBpZmRlZiBOQlBDCisjICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQworIyAgICAgZWxzZSAvKiBubyBOQlBDICovCisjICAgICAgaWZkZWYgUEFHRVNJWkUKKyMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKKyMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLworIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLworIyAgICBlbmRpZiAvKiBubyBOQlBHICovCisjICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLworIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCisjICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KKyMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KKyMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCisKKyNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCisKK2ludAorbWFpbiAoKQoreworICBjaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKKyAgaW50IGksIHBhZ2VzaXplOworICBpbnQgZmQ7CisKKyAgcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSAoKTsKKworICAvKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuICovCisgIGRhdGEgPSAoY2hhciAqKSBtYWxsb2MgKHBhZ2VzaXplKTsKKyAgaWYgKCFkYXRhKQorICAgIGV4aXQgKDEpOworICBmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKyAgICAqKGRhdGEgKyBpKSA9IHJhbmQgKCk7CisgIHVtYXNrICgwKTsKKyAgZmQgPSBjcmVhdCAoImNvbmZ0ZXN0Lm1tYXAiLCAwNjAwKTsKKyAgaWYgKGZkIDwgMCkKKyAgICBleGl0ICgxKTsKKyAgaWYgKHdyaXRlIChmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQorICAgIGV4aXQgKDEpOworICBjbG9zZSAoZmQpOworCisgIC8qIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaCBhbHJlYWR5IGhhcworICAgICBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sIGFsc28gbWFrZSBzdXJlIHRoYXQKKyAgICAgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuICAqLworICBmZCA9IG9wZW4gKCJjb25mdGVzdC5tbWFwIiwgT19SRFdSKTsKKyAgaWYgKGZkIDwgMCkKKyAgICBleGl0ICgxKTsKKyAgZGF0YTIgPSAoY2hhciAqKSBtYWxsb2MgKDIgKiBwYWdlc2l6ZSk7CisgIGlmICghZGF0YTIpCisgICAgZXhpdCAoMSk7CisgIGRhdGEyICs9IChwYWdlc2l6ZSAtICgobG9uZykgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7CisgIGlmIChkYXRhMiAhPSBtbWFwIChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJCSAgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCisgICAgZXhpdCAoMSk7CisgIGZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorICAgIGlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCisgICAgICBleGl0ICgxKTsKKworICAvKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYSBkbyBub3QKKyAgICAgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuICAoVGhpcyBpcyBhIGJ1ZyBvbgorICAgICBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikgICovCisgIGZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorICAgICooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7CisgIGRhdGEzID0gKGNoYXIgKikgbWFsbG9jIChwYWdlc2l6ZSk7CisgIGlmICghZGF0YTMpCisgICAgZXhpdCAoMSk7CisgIGlmIChyZWFkIChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKKyAgICBleGl0ICgxKTsKKyAgZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisgICAgaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKKyAgICAgIGV4aXQgKDEpOworICBjbG9zZSAoZmQpOworICBleGl0ICgwKTsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1CitlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisoIGV4aXQgJGFjX3N0YXR1cyApCithY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCitmaQorcm0gLWYgY29yZSAqLmNvcmUgZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiID4mNgoraWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBIQVZFX01NQVAgMQorX0FDRU9GCisKK2ZpCitybSAtZiBjb25mdGVzdC5tbWFwCisKKworaWYgdGVzdCAiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiID0gInllcyI7IHRoZW4KKyAgICBGSUxFTUFQPXVuaXhmaWxlbWFwCitlbHNlCisgICAgRklMRU1BUD1yZWFkZmlsZW1hcAorZmkKKworCisKKyMgQUNfQ1BQX0ZVTkMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tICMKKyMgQ2hlY2tzIHRvIHNlZSBpZiBBTlNJIEM5OSBDUFAgdmFyaWFibGUgX19mdW5jX18gd29ya3MuCisjIElmIG5vdCwgcGVyaGFwcyBfX0ZVTkNUSU9OX18gd29ya3MgaW5zdGVhZC4KKyMgSWYgbm90LCB3ZSdsbCBqdXN0IGRlZmluZSBfX2Z1bmNfXyB0byAiIi4KKyMgQUNfQ1BQX0ZVTkMKKworCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGFuIEFOU0kgQzk5LWNvbmZvcm1pbmcgX19mdW5jX18iID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgYW4gQU5TSSBDOTktY29uZm9ybWluZyBfX2Z1bmNfXy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfY3BwX2Z1bmMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworY2hhciAqZm9vID0gX19mdW5jX187CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfY3BwX2Z1bmM9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKK2NoYXIgKmZvbyA9IF9fRlVOQ1RJT05fXzsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9jcHBfZnVuYz1fX0ZVTkNUSU9OX18KK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfY3BwX2Z1bmM9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jcHBfZnVuYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfY3BwX2Z1bmMiID4mNgoraWYgdGVzdCAkYWNfY3ZfY3BwX2Z1bmMgPSBfX0ZVTkNUSU9OX187IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgX19mdW5jX18gX19GVU5DVElPTl9fCitfQUNFT0YKKworZWxpZiB0ZXN0ICRhY19jdl9jcHBfZnVuYyA9IG5vOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIF9fZnVuY19fICIiCitfQUNFT0YKKworZmkKKworCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgWE1MX05TIDEKK19BQ0VPRgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIFhNTF9EVEQgMQorX0FDRU9GCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgWE1MX0NPTlRFWFRfQllURVMgMTAyNAorX0FDRU9GCisKKworICAgICAgICAgIGFjX2NvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyBNYWtlZmlsZSIKKworY2F0ID5jb25mY2FjaGUgPDxcX0FDRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucywgc2VlIGNvbmZpZ3VyZSdzIG9wdGlvbiAtLWNvbmZpZy1jYWNoZS4KKyMgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLiAgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3QKKyMgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQKKyMgdGhlIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorIworIyBgYWNfY3ZfZW52X2ZvbycgdmFyaWFibGVzIChzZXQgb3IgdW5zZXQpIHdpbGwgYmUgb3ZlcnJpZGRlbiB3aGVuCisjIGxvYWRpbmcgdGhpcyBmaWxlLCBvdGhlciAqdW5zZXQqIGBhY19jdl9mb28nIHdpbGwgYmUgYXNzaWduZWQgdGhlCisjIGZvbGxvd2luZyB2YWx1ZXMuCisKK19BQ0VPRgorCisjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KKyMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KKyMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KK3sKKyAgKHNldCkgMj4mMSB8CisgICAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KKyAgICAqYWNfc3BhY2U9XCAqKQorICAgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZQorICAgICAgIyBzdWJzdGl0dXRpb24gdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCisgICAgICBzZWQgLW4gXAorCSJzLycvJ1xcXFwnJy9nOworCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXFwyJy9wIgorICAgICAgOzsKKyAgICAqKQorICAgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICAgIHNlZCAtbiBcCisJInMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9XFwyL3AiCisgICAgICA7OworICAgIGVzYWM7Cit9IHwKKyAgc2VkICcKKyAgICAgdCBjbGVhcgorICAgICA6IGNsZWFyCisgICAgIHMvXlwoW149XSpcKT1cKC4qW3t9XS4qXCkkL3Rlc3QgIiR7XDErc2V0fSIgPSBzZXQgfHwgJi8KKyAgICAgdCBlbmQKKyAgICAgL15hY19jdl9lbnYvIXMvXlwoW149XSpcKT1cKC4qXCkkL1wxPSR7XDE9XDJ9LworICAgICA6IGVuZCcgPj5jb25mY2FjaGUKK2lmIGRpZmYgJGNhY2hlX2ZpbGUgY29uZmNhY2hlID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCisgIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KKyAgICB0ZXN0ICJ4JGNhY2hlX2ZpbGUiICE9ICJ4L2Rldi9udWxsIiAmJiBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgICBjYXQgY29uZmNhY2hlID4kY2FjaGVfZmlsZQorICBlbHNlCisgICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIGZpCitmaQorcm0gLWYgY29uZmNhY2hlCisKK3Rlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKKyMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgordGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworCisjIFZQQVRIIG1heSBjYXVzZSB0cm91YmxlIHdpdGggc29tZSBtYWtlcywgc28gd2UgcmVtb3ZlICQoc3JjZGlyKSwKKyMgJHtzcmNkaXJ9IGFuZCBAc3JjZGlyQCBmcm9tIFZQQVRIIGlmIHNyY2RpciBpcyAiLiIsIHN0cmlwIGxlYWRpbmcgYW5kCisjIHRyYWlsaW5nIGNvbG9ucyBhbmQgdGhlbiByZW1vdmUgdGhlIHdob2xlIGxpbmUgaWYgVlBBVEggYmVjb21lcyBlbXB0eQorIyAoYWN0dWFsbHkgd2UgbGVhdmUgYW4gZW1wdHkgbGluZSB0byBwcmVzZXJ2ZSBsaW5lIG51bWJlcnMpLgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWwkgXSpWUEFUSFsJIF0qPS97CitzLzoqXCQoc3JjZGlyKToqLzovOworcy86Klwke3NyY2Rpcn06Ki86LzsKK3MvOipAc3JjZGlyQDoqLzovOworcy9eXChbXj1dKj1bCSBdKlwpOiovXDEvOworcy86KiQvLzsKK3MvXltePV0qPVsJIF0qJC8vOworfScKK2ZpCisKK0RFRlM9LURIQVZFX0NPTkZJR19ICisKK2FjX2xpYm9ianM9CithY19sdGxpYm9ianM9Citmb3IgYWNfaSBpbiA6ICRMSUJPQkpTOyBkbyB0ZXN0ICJ4JGFjX2kiID0geDogJiYgY29udGludWUKKyAgIyAxLiBSZW1vdmUgdGhlIGV4dGVuc2lvbiwgYW5kICRVIGlmIGFscmVhZHkgaW5zdGFsbGVkLgorICBhY19pPWBlY2hvICIkYWNfaSIgfAorCSBzZWQgJ3MvXCRVXC4vLi87cy9cLm8kLy87cy9cLm9iaiQvLydgCisgICMgMi4gQWRkIHRoZW0uCisgIGFjX2xpYm9ianM9IiRhY19saWJvYmpzICRhY19pXCRVLiRhY19vYmpleHQiCisgIGFjX2x0bGlib2Jqcz0iJGFjX2x0bGlib2JqcyAkYWNfaSInJFUubG8nCitkb25lCitMSUJPQkpTPSRhY19saWJvYmpzCisKK0xUTElCT0JKUz0kYWNfbHRsaWJvYmpzCisKKworCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CithY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcworYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyAkQ09ORklHX1NUQVRVUyIKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjUKK2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNjt9CitjYXQgPiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCisjISAkU0hFTEwKKyMgR2VuZXJhdGVkIGJ5ICRhc19tZS4KKyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIGNvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorCitkZWJ1Zz1mYWxzZQorYWNfY3NfcmVjaGVjaz1mYWxzZQorYWNfY3Nfc2lsZW50PWZhbHNlCitTSEVMTD1cJHtDT05GSUdfU0hFTEwtJFNIRUxMfQorX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNNHNoIEluaXRpYWxpemF0aW9uLiAgIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIEJlIEJvdXJuZSBjb21wYXRpYmxlCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKK2VsaWYgdGVzdCAtbiAiJHtCQVNIX1ZFUlNJT04rc2V0fSIgJiYgKHNldCAtbyBwb3NpeCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHNldCAtbyBwb3NpeAorZmkKK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKKworIyBTdXBwb3J0IHVuc2V0IHdoZW4gcG9zc2libGUuCitpZiAoIChNQUlMPTYwOyB1bnNldCBNQUlMKSB8fCBleGl0KSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfdW5zZXQ9dW5zZXQKK2Vsc2UKKyAgYXNfdW5zZXQ9ZmFsc2UKK2ZpCisKKworIyBXb3JrIGFyb3VuZCBidWdzIGluIHByZS0zLjAgVVdJTiBrc2guCiskYXNfdW5zZXQgRU5WIE1BSUwgTUFJTFBBVEgKK1BTMT0nJCAnCitQUzI9Jz4gJworUFM0PScrICcKKworIyBOTFMgbnVpc2FuY2VzLgorZm9yIGFzX3ZhciBpbiBcCisgIExBTkcgTEFOR1VBR0UgTENfQUREUkVTUyBMQ19BTEwgTENfQ09MTEFURSBMQ19DVFlQRSBMQ19JREVOVElGSUNBVElPTiBcCisgIExDX01FQVNVUkVNRU5UIExDX01FU1NBR0VTIExDX01PTkVUQVJZIExDX05BTUUgTENfTlVNRVJJQyBMQ19QQVBFUiBcCisgIExDX1RFTEVQSE9ORSBMQ19USU1FCitkbworICBpZiAoc2V0ICt4OyB0ZXN0IC16ICJgKGV2YWwgJGFzX3Zhcj1DOyBleHBvcnQgJGFzX3ZhcikgMj4mMWAiKTsgdGhlbgorICAgIGV2YWwgJGFzX3Zhcj1DOyBleHBvcnQgJGFzX3ZhcgorICBlbHNlCisgICAgJGFzX3Vuc2V0ICRhc192YXIKKyAgZmkKK2RvbmUKKworIyBSZXF1aXJlZCB0byB1c2UgYmFzZW5hbWUuCitpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc19leHByPWV4cHIKK2Vsc2UKKyAgYXNfZXhwcj1mYWxzZQorZmkKKworaWYgKGJhc2VuYW1lIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC8gMj4mMWAiID0gIlgvIjsgdGhlbgorICBhc19iYXNlbmFtZT1iYXNlbmFtZQorZWxzZQorICBhc19iYXNlbmFtZT1mYWxzZQorZmkKKworCisjIE5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuCithc19tZT1gJGFzX2Jhc2VuYW1lICIkMCIgfHwKKyRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCisJIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJDAiIDogJ1hcKC9cKSQnIFx8IFwKKwkgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8CitlY2hvIFgvIiQwIiB8CisgICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcL1woXC9cL1wpJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcL1woXC9cKS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIHMvLiovLi87IHEnYAorCisKKyMgUEFUSCBuZWVkcyBDUiwgYW5kIExJTkVOTyBuZWVkcyBDUiBhbmQgUEFUSC4KKyMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KK2FzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JworYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCithc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKK2FzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKK2FzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cworCisjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KK2lmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCisgIGVjaG8gIiMhIC9iaW4vc2giID5jb25mJCQuc2gKKyAgZWNobyAgImV4aXQgMCIgICA+PmNvbmYkJC5zaAorICBjaG1vZCAreCBjb25mJCQuc2gKKyAgaWYgKFBBVEg9Ii9ub25leGlzdGVudDsuIjsgY29uZiQkLnNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBQQVRIX1NFUEFSQVRPUj0nOycKKyAgZWxzZQorICAgIFBBVEhfU0VQQVJBVE9SPToKKyAgZmkKKyAgcm0gLWYgY29uZiQkLnNoCitmaQorCisKKyAgYXNfbGluZW5vXzE9JExJTkVOTworICBhc19saW5lbm9fMj0kTElORU5PCisgIGFzX2xpbmVub18zPWAoZXhwciAkYXNfbGluZW5vXzEgKyAxKSAyPi9kZXYvbnVsbGAKKyAgdGVzdCAieCRhc19saW5lbm9fMSIgIT0gIngkYXNfbGluZW5vXzIiICYmCisgIHRlc3QgIngkYXNfbGluZW5vXzMiICA9ICJ4JGFzX2xpbmVub18yIiAgfHwgeworICAjIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBwYXRoIGF0IGFsbAorICAjIHJlbGF0aXZlIG9yIG5vdC4KKyAgY2FzZSAkMCBpbgorICAgICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKKyAgICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCitkb25lCisKKyAgICAgICA7OworICBlc2FjCisgICMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKKyAgIyBpbiB3aGljaCBjYXNlIHdlIGFyZSBub3QgdG8gYmUgZm91bmQgaW4gdGhlIHBhdGguCisgIGlmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KKyAgICBhc19teXNlbGY9JDAKKyAgZmkKKyAgaWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgorICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBwYXRoIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBwYXRoIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgIGZpCisgIGNhc2UgJENPTkZJR19TSEVMTCBpbgorICAnJykKKyAgICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluIC9iaW4kUEFUSF9TRVBBUkFUT1IvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhc19iYXNlIGluIHNoIGJhc2gga3NoIHNoNTsgZG8KKwkgY2FzZSAkYXNfZGlyIGluCisJIC8qKQorCSAgIGlmICgiJGFzX2Rpci8kYXNfYmFzZSIgLWMgJworICBhc19saW5lbm9fMT0kTElORU5PCisgIGFzX2xpbmVub18yPSRMSU5FTk8KKyAgYXNfbGluZW5vXzM9YChleHByICRhc19saW5lbm9fMSArIDEpIDI+L2Rldi9udWxsYAorICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKKyAgdGVzdCAieCRhc19saW5lbm9fMyIgID0gIngkYXNfbGluZW5vXzIiICcpIDI+L2Rldi9udWxsOyB0aGVuCisJICAgICAkYXNfdW5zZXQgQkFTSF9FTlYgfHwgdGVzdCAiJHtCQVNIX0VOVitzZXR9IiAhPSBzZXQgfHwgeyBCQVNIX0VOVj07IGV4cG9ydCBCQVNIX0VOVjsgfQorCSAgICAgJGFzX3Vuc2V0IEVOViB8fCB0ZXN0ICIke0VOVitzZXR9IiAhPSBzZXQgfHwgeyBFTlY9OyBleHBvcnQgRU5WOyB9CisJICAgICBDT05GSUdfU0hFTEw9JGFzX2Rpci8kYXNfYmFzZQorCSAgICAgZXhwb3J0IENPTkZJR19TSEVMTAorCSAgICAgZXhlYyAiJENPTkZJR19TSEVMTCIgIiQwIiAkezErIiRAIn0KKwkgICBmaTs7CisJIGVzYWMKKyAgICAgICBkb25lCitkb25lCis7OworICBlc2FjCisKKyAgIyBDcmVhdGUgJGFzX21lLmxpbmVubyBhcyBhIGNvcHkgb2YgJGFzX215c2VsZiwgYnV0IHdpdGggJExJTkVOTworICAjIHVuaWZvcm1seSByZXBsYWNlZCBieSB0aGUgbGluZSBudW1iZXIuICBUaGUgZmlyc3QgJ3NlZCcgaW5zZXJ0cyBhCisgICMgbGluZS1udW1iZXIgbGluZSBiZWZvcmUgZWFjaCBsaW5lOyB0aGUgc2Vjb25kICdzZWQnIGRvZXMgdGhlIHJlYWwKKyAgIyB3b3JrLiAgVGhlIHNlY29uZCBzY3JpcHQgdXNlcyAnTicgdG8gcGFpciBlYWNoIGxpbmUtbnVtYmVyIGxpbmUKKyAgIyB3aXRoIHRoZSBudW1iZXJlZCBsaW5lLCBhbmQgYXBwZW5kcyB0cmFpbGluZyAnLScgZHVyaW5nCisgICMgc3Vic3RpdHV0aW9uIHNvIHRoYXQgJExJTkVOTyBpcyBub3QgYSBzcGVjaWFsIGNhc2UgYXQgbGluZSBlbmQuCisgICMgKFJhamEgUiBIYXJpbmF0aCBzdWdnZXN0ZWQgc2VkICc9JywgYW5kIFBhdWwgRWdnZXJ0IHdyb3RlIHRoZQorICAjIHNlY29uZCAnc2VkJyBzY3JpcHQuICBCbGFtZSBMZWUgRS4gTWNNYWhvbiBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCisgIHNlZCAnPScgPCRhc19teXNlbGYgfAorICAgIHNlZCAnCisgICAgICBOCisgICAgICBzLCQsLSwKKyAgICAgIDogbG9vcAorICAgICAgcyxeXChbJyRhc19jcl9kaWdpdHMnXSpcKVwoLipcKVskXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dXCksXDFcMlwxXDMsCisgICAgICB0IGxvb3AKKyAgICAgIHMsLSQsLAorICAgICAgcyxeWyckYXNfY3JfZGlnaXRzJ10qXG4sLAorICAgICcgPiRhc19tZS5saW5lbm8gJiYKKyAgY2htb2QgK3ggJGFzX21lLmxpbmVubyB8fAorICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisKKyAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKKyAgIyAodGhlIGRpcm5hbWUgb2YgJFswXSBpcyBub3QgdGhlIHBsYWNlIHdoZXJlIHdlIG1pZ2h0IGZpbmQgdGhlCisgICMgb3JpZ2luYWwgYW5kIHNvIG9uLiAgQXV0b2NvbmYgaXMgZXNwZWNpYWxseSBzZW5zaWJsZSB0byB0aGlzKS4KKyAgLiAuLyRhc19tZS5saW5lbm8KKyAgIyBFeGl0IHN0YXR1cyBpcyB0aGF0IG9mIHRoZSBsYXN0IGNvbW1hbmQuCisgIGV4aXQKK30KKworCitjYXNlIGBlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzYCxgZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzYCBpbgorICAqYyosLW4qKSBFQ0hPX049IEVDSE9fQz0nCisnIEVDSE9fVD0nCScgOzsKKyAgKmMqLCogICkgRUNIT19OPS1uIEVDSE9fQz0gRUNIT19UPSA7OworICAqKSAgICAgICBFQ0hPX049IEVDSE9fQz0nXGMnIEVDSE9fVD0gOzsKK2VzYWMKKworaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfZXhwcj1leHByCitlbHNlCisgIGFzX2V4cHI9ZmFsc2UKK2ZpCisKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCitlY2hvID5jb25mJCQuZmlsZQoraWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICMgV2UgY291bGQganVzdCBjaGVjayBmb3IgREpHUFA7IGJ1dCB0aGlzIHRlc3QgYSkgd29ya3MgYikgaXMgbW9yZSBnZW5lcmljCisgICMgYW5kIGMpIHdpbGwgcmVtYWluIHZhbGlkIG9uY2UgREpHUFAgc3VwcG9ydHMgc3ltbGlua3MgKERKR1BQIDIuMDQpLgorICBpZiB0ZXN0IC1mIGNvbmYkJC5leGU7IHRoZW4KKyAgICAjIERvbid0IHVzZSBsbiBhdCBhbGw7IHdlIGRvbid0IGhhdmUgYW55IGxpbmtzCisgICAgYXNfbG5fcz0nY3AgLXAnCisgIGVsc2UKKyAgICBhc19sbl9zPSdsbiAtcycKKyAgZmkKK2VsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2xuX3M9bG4KK2Vsc2UKKyAgYXNfbG5fcz0nY3AgLXAnCitmaQorcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKKworaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19ta2Rpcl9wPToKK2Vsc2UKKyAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKKyAgYXNfbWtkaXJfcD1mYWxzZQorZmkKKworYXNfZXhlY3V0YWJsZV9wPSJ0ZXN0IC1mIgorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCithc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KK2FzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKworIyBJRlMKKyMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuCithc19ubD0nCisnCitJRlM9IiAJJGFzX25sIgorCisjIENEUEFUSC4KKyRhc191bnNldCBDRFBBVEgKKworZXhlYyA2PiYxCisKKyMgT3BlbiB0aGUgbG9nIHJlYWwgc29vbiwgdG8ga2VlcCBcJFswXSBhbmQgc28gb24gbWVhbmluZ2Z1bCwgYW5kIHRvCisjIHJlcG9ydCBhY3R1YWwgaW5wdXQgdmFsdWVzIG9mIENPTkZJR19GSUxFUyBldGMuIGluc3RlYWQgb2YgdGhlaXIKKyMgdmFsdWVzIGFmdGVyIG9wdGlvbnMgaGFuZGxpbmcuICBMb2dnaW5nIC0tdmVyc2lvbiBldGMuIGlzIE9LLgorZXhlYyA1Pj5jb25maWcubG9nCit7CisgIGVjaG8KKyAgc2VkICdoO3MvLi8tL2c7cy9eLi4uLyMjIC87cy8uLi4kLyAjIy87cDt4O3A7eCcgPDxfQVNCT1gKKyMjIFJ1bm5pbmcgJGFzX21lLiAjIworX0FTQk9YCit9ID4mNQorY2F0ID4mNSA8PF9DU0VPRgorCitUaGlzIGZpbGUgd2FzIGV4dGVuZGVkIGJ5IGV4cGF0ICRhc19tZSAyLjAuMSwgd2hpY2ggd2FzCitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNTkuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKKworICBDT05GSUdfRklMRVMgICAgPSAkQ09ORklHX0ZJTEVTCisgIENPTkZJR19IRUFERVJTICA9ICRDT05GSUdfSEVBREVSUworICBDT05GSUdfTElOS1MgICAgPSAkQ09ORklHX0xJTktTCisgIENPTkZJR19DT01NQU5EUyA9ICRDT05GSUdfQ09NTUFORFMKKyAgJCAkMCAkQAorCitfQ1NFT0YKK2VjaG8gIm9uIGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYCIgPiY1CitlY2hvID4mNQorX0FDRU9GCisKKyMgRmlsZXMgdGhhdCBjb25maWcuc3RhdHVzIHdhcyBtYWRlIGZvci4KK2lmIHRlc3QgLW4gIiRhY19jb25maWdfZmlsZXMiOyB0aGVuCisgIGVjaG8gImNvbmZpZ19maWxlcz1cIiRhY19jb25maWdfZmlsZXNcIiIgPj4kQ09ORklHX1NUQVRVUworZmkKKworaWYgdGVzdCAtbiAiJGFjX2NvbmZpZ19oZWFkZXJzIjsgdGhlbgorICBlY2hvICJjb25maWdfaGVhZGVycz1cIiRhY19jb25maWdfaGVhZGVyc1wiIiA+PiRDT05GSUdfU1RBVFVTCitmaQorCitpZiB0ZXN0IC1uICIkYWNfY29uZmlnX2xpbmtzIjsgdGhlbgorICBlY2hvICJjb25maWdfbGlua3M9XCIkYWNfY29uZmlnX2xpbmtzXCIiID4+JENPTkZJR19TVEFUVVMKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY19jb25maWdfY29tbWFuZHMiOyB0aGVuCisgIGVjaG8gImNvbmZpZ19jb21tYW5kcz1cIiRhY19jb25maWdfY29tbWFuZHNcIiIgPj4kQ09ORklHX1NUQVRVUworZmkKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCisKK2FjX2NzX3VzYWdlPSJcCitcYCRhc19tZScgaW5zdGFudGlhdGVzIGZpbGVzIGZyb20gdGVtcGxhdGVzIGFjY29yZGluZyB0byB0aGUKK2N1cnJlbnQgY29uZmlndXJhdGlvbi4KKworVXNhZ2U6ICQwIFtPUFRJT05TXSBbRklMRV0uLi4KKworICAtaCwgLS1oZWxwICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC1WLCAtLXZlcnNpb24gICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAorICAtcSwgLS1xdWlldCAgICAgIGRvIG5vdCBwcmludCBwcm9ncmVzcyBtZXNzYWdlcworICAtZCwgLS1kZWJ1ZyAgICAgIGRvbid0IHJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMKKyAgICAgIC0tcmVjaGVjayAgICB1cGRhdGUgJGFzX21lIGJ5IHJlY29uZmlndXJpbmcgaW4gdGhlIHNhbWUgY29uZGl0aW9ucworICAtLWZpbGU9RklMRVs6VEVNUExBVEVdCisJCSAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgRklMRQorICAtLWhlYWRlcj1GSUxFWzpURU1QTEFURV0KKwkJICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gaGVhZGVyIEZJTEUKKworQ29uZmlndXJhdGlvbiBmaWxlczoKKyRjb25maWdfZmlsZXMKKworQ29uZmlndXJhdGlvbiBoZWFkZXJzOgorJGNvbmZpZ19oZWFkZXJzCisKK1JlcG9ydCBidWdzIHRvIDxidWctYXV0b2NvbmZAZ251Lm9yZz4uIgorX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCithY19jc192ZXJzaW9uPSJcXAorZXhwYXQgY29uZmlnLnN0YXR1cyAyLjAuMQorY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjU5LAorICB3aXRoIG9wdGlvbnMgXFwiYGVjaG8gIiRhY19jb25maWd1cmVfYXJncyIgfCBzZWQgJ3MvW1xcIiJcYFwkXS9cXFxcJi9nJ2BcXCIKKworQ29weXJpZ2h0IChDKSAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorVGhpcyBjb25maWcuc3RhdHVzIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgorc3JjZGlyPSRzcmNkaXIKK0lOU1RBTEw9IiRJTlNUQUxMIgorX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorIyBJZiBubyBmaWxlIGFyZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIsIHRoZW4gd2UgbmVlZCB0byBwcm92aWRlIGRlZmF1bHQKKyMgdmFsdWUuICBCeSB3ZSBuZWVkIHRvIGtub3cgaWYgZmlsZXMgd2VyZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCithY19uZWVkX2RlZmF1bHRzPToKK3doaWxlIHRlc3QgJCMgIT0gMAorZG8KKyAgY2FzZSAkMSBpbgorICAtLSo9KikKKyAgICBhY19vcHRpb249YGV4cHIgIngkMSIgOiAneFwoW149XSpcKT0nYAorICAgIGFjX29wdGFyZz1gZXhwciAieCQxIiA6ICd4W149XSo9XCguKlwpJ2AKKyAgICBhY19zaGlmdD06CisgICAgOzsKKyAgLSopCisgICAgYWNfb3B0aW9uPSQxCisgICAgYWNfb3B0YXJnPSQyCisgICAgYWNfc2hpZnQ9c2hpZnQKKyAgICA7OworICAqKSAjIFRoaXMgaXMgbm90IGFuIG9wdGlvbiwgc28gdGhlIHVzZXIgaGFzIHByb2JhYmx5IGdpdmVuIGV4cGxpY2l0CisgICAgICMgYXJndW1lbnRzLgorICAgICBhY19vcHRpb249JDEKKyAgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisgIGVzYWMKKworICBjYXNlICRhY19vcHRpb24gaW4KKyAgIyBIYW5kbGluZyBvZiB0aGUgb3B0aW9ucy4KK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCisgIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQorICAgIGFjX2NzX3JlY2hlY2s9OiA7OworICAtLXZlcnNpb24gfCAtLXZlcnMqIHwgLVYgKQorICAgIGVjaG8gIiRhY19jc192ZXJzaW9uIjsgZXhpdCAwIDs7CisgIC0taGUgfCAtLWgpCisgICAgIyBDb25mbGljdCBiZXR3ZWVuIC0taGVscCBhbmQgLS1oZWFkZXIKKyAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBhbWJpZ3VvdXMgb3B0aW9uOiAkMQorVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogYW1iaWd1b3VzIG9wdGlvbjogJDEKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKKyAgLS1oZWxwIHwgLS1oZWwgfCAtaCApCisgICAgZWNobyAiJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7CisgIC0tZGVidWcgfCAtLWQqIHwgLWQgKQorICAgIGRlYnVnPTogOzsKKyAgLS1maWxlIHwgLS1maWwgfCAtLWZpIHwgLS1mICkKKyAgICAkYWNfc2hpZnQKKyAgICBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgJGFjX29wdGFyZyIKKyAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKKyAgLS1oZWFkZXIgfCAtLWhlYWRlIHwgLS1oZWFkIHwgLS1oZWEgKQorICAgICRhY19zaGlmdAorICAgIENPTkZJR19IRUFERVJTPSIkQ09ORklHX0hFQURFUlMgJGFjX29wdGFyZyIKKyAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwgfCAtLXNpIHwgLS1zKQorICAgIGFjX2NzX3NpbGVudD06IDs7CisKKyAgIyBUaGlzIGlzIGFuIGVycm9yLgorICAtKikgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogdW5yZWNvZ25pemVkIG9wdGlvbjogJDEKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb246ICQxCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OworCisgICopIGFjX2NvbmZpZ190YXJnZXRzPSIkYWNfY29uZmlnX3RhcmdldHMgJDEiIDs7CisKKyAgZXNhYworICBzaGlmdAorZG9uZQorCithY19jb25maWd1cmVfZXh0cmFfYXJncz0KKworaWYgJGFjX2NzX3NpbGVudDsgdGhlbgorICBleGVjIDY+L2Rldi9udWxsCisgIGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPSIkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1zaWxlbnQiCitmaQorCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCitpZiBcJGFjX2NzX3JlY2hlY2s7IHRoZW4KKyAgZWNobyAicnVubmluZyAkU0hFTEwgJDAgIiAkYWNfY29uZmlndXJlX2FyZ3MgXCRhY19jb25maWd1cmVfZXh0cmFfYXJncyAiIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIiA+JjYKKyAgZXhlYyAkU0hFTEwgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24KK2ZpCisKK19BQ0VPRgorCisKKworCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorZm9yIGFjX2NvbmZpZ190YXJnZXQgaW4gJGFjX2NvbmZpZ190YXJnZXRzCitkbworICBjYXNlICIkYWNfY29uZmlnX3RhcmdldCIgaW4KKyAgIyBIYW5kbGluZyBvZiBhcmd1bWVudHMuCisgICJNYWtlZmlsZSIgKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgTWFrZWZpbGUiIDs7CisgICJleHBhdF9jb25maWcuaCIgKSBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTIGV4cGF0X2NvbmZpZy5oIiA7OworICAqKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50OiAkYWNfY29uZmlnX3RhcmdldCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50OiAkYWNfY29uZmlnX3RhcmdldCIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7CisgIGVzYWMKK2RvbmUKKworIyBJZiB0aGUgdXNlciBkaWQgbm90IHVzZSB0aGUgYXJndW1lbnRzIHRvIHNwZWNpZnkgdGhlIGl0ZW1zIHRvIGluc3RhbnRpYXRlLAorIyB0aGVuIHRoZSBlbnZ2YXIgaW50ZXJmYWNlIGlzIHVzZWQuICBTZXQgb25seSB0aG9zZSB0aGF0IGFyZSBub3QuCisjIFdlIHVzZSB0aGUgbG9uZyBmb3JtIGZvciB0aGUgZGVmYXVsdCBhc3NpZ25tZW50IGJlY2F1c2Ugb2YgYW4gZXh0cmVtZWx5CisjIGJpemFycmUgYnVnIG9uIFN1bk9TIDQuMS4zLgoraWYgJGFjX25lZWRfZGVmYXVsdHM7IHRoZW4KKyAgdGVzdCAiJHtDT05GSUdfRklMRVMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0ZJTEVTPSRjb25maWdfZmlsZXMKKyAgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiA9IHNldCB8fCBDT05GSUdfSEVBREVSUz0kY29uZmlnX2hlYWRlcnMKK2ZpCisKKyMgSGF2ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgZm9yIGNvbnZlbmllbmNlLiAgTWFrZSBpdCBpbiB0aGUgYnVpbGQgdHJlZQorIyBzaW1wbHkgYmVjYXVzZSB0aGVyZSBpcyBubyByZWFzb24gdG8gcHV0IGl0IGhlcmUsIGFuZCBpbiBhZGRpdGlvbiwKKyMgY3JlYXRpbmcgYW5kIG1vdmluZyBmaWxlcyBmcm9tIC90bXAgY2FuIHNvbWV0aW1lcyBjYXVzZSBwcm9ibGVtcy4KKyMgQ3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwgYW5kIGhvb2sgZm9yIGl0cyByZW1vdmFsIHVubGVzcyBkZWJ1Z2dpbmcuCiskZGVidWcgfHwKK3sKKyAgdHJhcCAnZXhpdF9zdGF0dXM9JD87IHJtIC1yZiAkdG1wICYmIGV4aXQgJGV4aXRfc3RhdHVzJyAwCisgIHRyYXAgJ3sgKGV4aXQgMSk7IGV4aXQgMTsgfScgMSAyIDEzIDE1Cit9CisKKyMgQ3JlYXRlIGEgKHNlY3VyZSkgdG1wIGRpcmVjdG9yeSBmb3IgdG1wIGZpbGVzLgorCit7CisgIHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgLXEgIi4vY29uZnN0YXRYWFhYWFgiKSAyPi9kZXYvbnVsbGAgJiYKKyAgdGVzdCAtbiAiJHRtcCIgJiYgdGVzdCAtZCAiJHRtcCIKK30gIHx8Cit7CisgIHRtcD0uL2NvbmZzdGF0JCQtJFJBTkRPTQorICAodW1hc2sgMDc3ICYmIG1rZGlyICR0bXApCit9IHx8Cit7CisgICBlY2hvICIkbWU6IGNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluIC4iID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Cit9CisKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgorCisjCisjIENPTkZJR19GSUxFUyBzZWN0aW9uLgorIworCisjIE5vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIHNjcmlwdHMgaWYgdGhlcmUgYXJlIG5vIENPTkZJR19GSUxFUy4KKyMgVGhpcyBoYXBwZW5zIGZvciBpbnN0YW5jZSB3aGVuIC4vY29uZmlnLnN0YXR1cyBjb25maWcuaAoraWYgdGVzdCAtbiAiXCRDT05GSUdfRklMRVMiOyB0aGVuCisgICMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCisgIHNlZCAncy8sQC9AQC87IHMvQCwvQEAvOyBzLyw7dCB0XCQvQDt0IHQvOyAvQDt0IHRcJC9zL1tcXFxcJixdL1xcXFwmL2c7CisgICBzL0BALyxALzsgcy9AQC9ALC87IHMvQDt0IHRcJC8sO3QgdC8nID5cJHRtcC9zdWJzLnNlZCA8PFxcQ0VPRgorcyxAU0hFTExALCRTSEVMTCw7dCB0CitzLEBQQVRIX1NFUEFSQVRPUkAsJFBBVEhfU0VQQVJBVE9SLDt0IHQKK3MsQFBBQ0tBR0VfTkFNRUAsJFBBQ0tBR0VfTkFNRSw7dCB0CitzLEBQQUNLQUdFX1RBUk5BTUVALCRQQUNLQUdFX1RBUk5BTUUsO3QgdAorcyxAUEFDS0FHRV9WRVJTSU9OQCwkUEFDS0FHRV9WRVJTSU9OLDt0IHQKK3MsQFBBQ0tBR0VfU1RSSU5HQCwkUEFDS0FHRV9TVFJJTkcsO3QgdAorcyxAUEFDS0FHRV9CVUdSRVBPUlRALCRQQUNLQUdFX0JVR1JFUE9SVCw7dCB0CitzLEBleGVjX3ByZWZpeEAsJGV4ZWNfcHJlZml4LDt0IHQKK3MsQHByZWZpeEAsJHByZWZpeCw7dCB0CitzLEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCwkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSw7dCB0CitzLEBiaW5kaXJALCRiaW5kaXIsO3QgdAorcyxAc2JpbmRpckAsJHNiaW5kaXIsO3QgdAorcyxAbGliZXhlY2RpckAsJGxpYmV4ZWNkaXIsO3QgdAorcyxAZGF0YWRpckAsJGRhdGFkaXIsO3QgdAorcyxAc3lzY29uZmRpckAsJHN5c2NvbmZkaXIsO3QgdAorcyxAc2hhcmVkc3RhdGVkaXJALCRzaGFyZWRzdGF0ZWRpciw7dCB0CitzLEBsb2NhbHN0YXRlZGlyQCwkbG9jYWxzdGF0ZWRpciw7dCB0CitzLEBsaWJkaXJALCRsaWJkaXIsO3QgdAorcyxAaW5jbHVkZWRpckAsJGluY2x1ZGVkaXIsO3QgdAorcyxAb2xkaW5jbHVkZWRpckAsJG9sZGluY2x1ZGVkaXIsO3QgdAorcyxAaW5mb2RpckAsJGluZm9kaXIsO3QgdAorcyxAbWFuZGlyQCwkbWFuZGlyLDt0IHQKK3MsQGJ1aWxkX2FsaWFzQCwkYnVpbGRfYWxpYXMsO3QgdAorcyxAaG9zdF9hbGlhc0AsJGhvc3RfYWxpYXMsO3QgdAorcyxAdGFyZ2V0X2FsaWFzQCwkdGFyZ2V0X2FsaWFzLDt0IHQKK3MsQERFRlNALCRERUZTLDt0IHQKK3MsQEVDSE9fQ0AsJEVDSE9fQyw7dCB0CitzLEBFQ0hPX05ALCRFQ0hPX04sO3QgdAorcyxARUNIT19UQCwkRUNIT19ULDt0IHQKK3MsQExJQlNALCRMSUJTLDt0IHQKK3MsQGJ1aWxkQCwkYnVpbGQsO3QgdAorcyxAYnVpbGRfY3B1QCwkYnVpbGRfY3B1LDt0IHQKK3MsQGJ1aWxkX3ZlbmRvckAsJGJ1aWxkX3ZlbmRvciw7dCB0CitzLEBidWlsZF9vc0AsJGJ1aWxkX29zLDt0IHQKK3MsQGhvc3RALCRob3N0LDt0IHQKK3MsQGhvc3RfY3B1QCwkaG9zdF9jcHUsO3QgdAorcyxAaG9zdF92ZW5kb3JALCRob3N0X3ZlbmRvciw7dCB0CitzLEBob3N0X29zQCwkaG9zdF9vcyw7dCB0CitzLEBDQ0AsJENDLDt0IHQKK3MsQENGTEFHU0AsJENGTEFHUyw7dCB0CitzLEBMREZMQUdTQCwkTERGTEFHUyw7dCB0CitzLEBDUFBGTEFHU0AsJENQUEZMQUdTLDt0IHQKK3MsQGFjX2N0X0NDQCwkYWNfY3RfQ0MsO3QgdAorcyxARVhFRVhUQCwkRVhFRVhULDt0IHQKK3MsQE9CSkVYVEAsJE9CSkVYVCw7dCB0CitzLEBFR1JFUEAsJEVHUkVQLDt0IHQKK3MsQExOX1NALCRMTl9TLDt0IHQKK3MsQEVDSE9ALCRFQ0hPLDt0IHQKK3MsQEFSQCwkQVIsO3QgdAorcyxAYWNfY3RfQVJALCRhY19jdF9BUiw7dCB0CitzLEBSQU5MSUJALCRSQU5MSUIsO3QgdAorcyxAYWNfY3RfUkFOTElCQCwkYWNfY3RfUkFOTElCLDt0IHQKK3MsQFNUUklQQCwkU1RSSVAsO3QgdAorcyxAYWNfY3RfU1RSSVBALCRhY19jdF9TVFJJUCw7dCB0CitzLEBETExUT09MQCwkRExMVE9PTCw7dCB0CitzLEBhY19jdF9ETExUT09MQCwkYWNfY3RfRExMVE9PTCw7dCB0CitzLEBBU0AsJEFTLDt0IHQKK3MsQGFjX2N0X0FTQCwkYWNfY3RfQVMsO3QgdAorcyxAT0JKRFVNUEAsJE9CSkRVTVAsO3QgdAorcyxAYWNfY3RfT0JKRFVNUEAsJGFjX2N0X09CSkRVTVAsO3QgdAorcyxAQ1BQQCwkQ1BQLDt0IHQKK3MsQENYWEAsJENYWCw7dCB0CitzLEBDWFhGTEFHU0AsJENYWEZMQUdTLDt0IHQKK3MsQGFjX2N0X0NYWEAsJGFjX2N0X0NYWCw7dCB0CitzLEBDWFhDUFBALCRDWFhDUFAsO3QgdAorcyxARjc3QCwkRjc3LDt0IHQKK3MsQEZGTEFHU0AsJEZGTEFHUyw7dCB0CitzLEBhY19jdF9GNzdALCRhY19jdF9GNzcsO3QgdAorcyxATElCVE9PTEAsJExJQlRPT0wsO3QgdAorcyxATElCQ1VSUkVOVEAsJExJQkNVUlJFTlQsO3QgdAorcyxATElCUkVWSVNJT05ALCRMSUJSRVZJU0lPTiw7dCB0CitzLEBMSUJBR0VALCRMSUJBR0UsO3QgdAorcyxASU5TVEFMTF9QUk9HUkFNQCwkSU5TVEFMTF9QUk9HUkFNLDt0IHQKK3MsQElOU1RBTExfU0NSSVBUQCwkSU5TVEFMTF9TQ1JJUFQsO3QgdAorcyxASU5TVEFMTF9EQVRBQCwkSU5TVEFMTF9EQVRBLDt0IHQKK3MsQEZJTEVNQVBALCRGSUxFTUFQLDt0IHQKK3MsQExJQk9CSlNALCRMSUJPQkpTLDt0IHQKK3MsQExUTElCT0JKU0AsJExUTElCT0JKUyw7dCB0CitDRU9GCisKK19BQ0VPRgorCisgIGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorICAjIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAorICAjIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KKyAgYWNfbWF4X3NlZF9saW5lcz00OAorICBhY19zZWRfZnJhZz0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KKyAgYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCisgIGFjX2VuZD0kYWNfbWF4X3NlZF9saW5lcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCisgIGFjX21vcmVfbGluZXM9OgorICBhY19zZWRfY21kcz0KKyAgd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCisgICAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCisgICAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgJHRtcC9zdWJzLnNlZCA+JHRtcC9zdWJzLmZyYWcKKyAgICBlbHNlCisgICAgICBzZWQgIiR7YWNfZW5kfXEiICR0bXAvc3Vicy5zZWQgPiR0bXAvc3Vicy5mcmFnCisgICAgZmkKKyAgICBpZiB0ZXN0ICEgLXMgJHRtcC9zdWJzLmZyYWc7IHRoZW4KKyAgICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKKyAgICBlbHNlCisgICAgICAjIFRoZSBwdXJwb3NlIG9mIHRoZSBsYWJlbCBhbmQgb2YgdGhlIGJyYW5jaGluZyBjb25kaXRpb24gaXMgdG8KKyAgICAgICMgc3BlZWQgdXAgdGhlIHNlZCBwcm9jZXNzaW5nIChpZiB0aGVyZSBhcmUgbm8gYEAnIGF0IGFsbCwgdGhlcmUKKyAgICAgICMgaXMgbm8gbmVlZCB0byBicm93c2UgYW55IG9mIHRoZSBzdWJzdGl0dXRpb25zKS4KKyAgICAgICMgVGhlc2UgYXJlIHRoZSB0d28gZXh0cmEgc2VkIGNvbW1hbmRzIG1lbnRpb25lZCBhYm92ZS4KKyAgICAgIChlY2hvICc6dAorICAvQFthLXpBLVpfXVthLXpBLVpfMC05XSpALyFiJyAmJiBjYXQgJHRtcC9zdWJzLmZyYWcpID4kdG1wL3N1YnMtJGFjX3NlZF9mcmFnLnNlZAorICAgICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorCWFjX3NlZF9jbWRzPSJzZWQgLWYgJHRtcC9zdWJzLSRhY19zZWRfZnJhZy5zZWQiCisgICAgICBlbHNlCisJYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiAkdG1wL3N1YnMtJGFjX3NlZF9mcmFnLnNlZCIKKyAgICAgIGZpCisgICAgICBhY19zZWRfZnJhZz1gZXhwciAkYWNfc2VkX2ZyYWcgKyAxYAorICAgICAgYWNfYmVnPSRhY19lbmQKKyAgICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfbGluZXNgCisgICAgZmkKKyAgZG9uZQorICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgICAgYWNfc2VkX2NtZHM9Y2F0CisgIGZpCitmaSAjIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiCisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCitmb3IgYWNfZmlsZSBpbiA6ICRDT05GSUdfRklMRVM7IGRvIHRlc3QgIngkYWNfZmlsZSIgPSB4OiAmJiBjb250aW51ZQorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgLSB8ICo6LSB8ICo6LToqICkgIyBpbnB1dCBmcm9tIHN0ZGluCisJY2F0ID4kdG1wL3N0ZGluCisJYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLFteOl0qOiwsJ2AKKwlhY19maWxlPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsOi4qLCwnYCA7OworICAqOiogKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsW146XSo6LCwnYAorCWFjX2ZpbGU9YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyw6LiosLCdgIDs7CisgICogKSAgIGFjX2ZpbGVfaW49JGFjX2ZpbGUuaW4gOzsKKyAgZXNhYworCisgICMgQ29tcHV0ZSBAc3JjZGlyQCwgQHRvcF9zcmNkaXJALCBhbmQgQElOU1RBTExAIGZvciBzdWJkaXJlY3Rvcmllcy4KKyAgYWNfZGlyPWAoZGlybmFtZSAiJGFjX2ZpbGUiKSAyPi9kZXYvbnVsbCB8fAorJGFzX2V4cHIgWCIkYWNfZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoL1wpJyBcfCBcCisJIC4gICAgIDogJ1woLlwpJyAyPi9kZXYvbnVsbCB8fAorZWNobyBYIiRhY19maWxlIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpW14vXS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXCkuKi97IHMvL1wxLzsgcTsgfQorICAJICBzLy4qLy4vOyBxJ2AKKyAgeyBpZiAkYXNfbWtkaXJfcDsgdGhlbgorICAgIG1rZGlyIC1wICIkYWNfZGlyIgorICBlbHNlCisgICAgYXNfZGlyPSIkYWNfZGlyIgorICAgIGFzX2RpcnM9CisgICAgd2hpbGUgdGVzdCAhIC1kICIkYXNfZGlyIjsgZG8KKyAgICAgIGFzX2RpcnM9IiRhc19kaXIgJGFzX2RpcnMiCisgICAgICBhc19kaXI9YChkaXJuYW1lICIkYXNfZGlyIikgMj4vZGV2L251bGwgfHwKKyRhc19leHByIFgiJGFzX2RpciIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoL1wpJyBcfCBcCisJIC4gICAgIDogJ1woLlwpJyAyPi9kZXYvbnVsbCB8fAorZWNobyBYIiRhc19kaXIiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXClbXi9dLioveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXCkkL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cKS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIHMvLiovLi87IHEnYAorICAgIGRvbmUKKyAgICB0ZXN0ICEgLW4gIiRhc19kaXJzIiB8fCBta2RpciAkYXNfZGlycworICBmaSB8fCB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSBcIiRhY19kaXJcIiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSBcIiRhY19kaXJcIiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTsgfQorCisgIGFjX2J1aWxkZGlyPS4KKworaWYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICBhY19kaXJfc3VmZml4PS9gZWNobyAiJGFjX2RpciIgfCBzZWQgJ3MsXlwuW1xcL10sLCdgCisgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgIGFjX3RvcF9idWlsZGRpcj1gZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzLC9bXlxcL10qLC4uLyxnJ2AKK2Vsc2UKKyAgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyPQorZmkKKworY2FzZSAkc3JjZGlyIGluCisgIC4pICAjIE5vIC0tc3JjZGlyIG9wdGlvbi4gIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KKyAgICBhY19zcmNkaXI9LgorICAgIGlmIHRlc3QgLXogIiRhY190b3BfYnVpbGRkaXIiOyB0aGVuCisgICAgICAgYWNfdG9wX3NyY2Rpcj0uCisgICAgZWxzZQorICAgICAgIGFjX3RvcF9zcmNkaXI9YGVjaG8gJGFjX3RvcF9idWlsZGRpciB8IHNlZCAncywvJCwsJ2AKKyAgICBmaSA7OworICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIHBhdGguCisgICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKKyAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKKyAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyJHNyY2RpciRhY19kaXJfc3VmZml4CisgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyJHNyY2RpciA7OworZXNhYworCisjIERvIG5vdCB1c2UgYGNkIGZvbyAmJiBwd2RgIHRvIGNvbXB1dGUgYWJzb2x1dGUgcGF0aHMsIGJlY2F1c2UKKyMgdGhlIGRpcmVjdG9yaWVzIG1heSBub3QgZXhpc3QuCitjYXNlIGBwd2RgIGluCisuKSBhY19hYnNfYnVpbGRkaXI9IiRhY19kaXIiOzsKKyopCisgIGNhc2UgIiRhY19kaXIiIGluCisgIC4pIGFjX2Fic19idWlsZGRpcj1gcHdkYDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX2J1aWxkZGlyPSIkYWNfZGlyIjs7CisgICopIGFjX2Fic19idWlsZGRpcj1gcHdkYC8iJGFjX2RpciI7OworICBlc2FjOzsKK2VzYWMKK2Nhc2UgJGFjX2Fic19idWlsZGRpciBpbgorLikgYWNfYWJzX3RvcF9idWlsZGRpcj0ke2FjX3RvcF9idWlsZGRpcn0uOzsKKyopCisgIGNhc2UgJHthY190b3BfYnVpbGRkaXJ9LiBpbgorICAuKSBhY19hYnNfdG9wX2J1aWxkZGlyPSRhY19hYnNfYnVpbGRkaXI7OworICBbXFwvXSogfCA/OltcXC9dKiApIGFjX2Fic190b3BfYnVpbGRkaXI9JHthY190b3BfYnVpbGRkaXJ9Ljs7CisgICopIGFjX2Fic190b3BfYnVpbGRkaXI9JGFjX2Fic19idWlsZGRpci8ke2FjX3RvcF9idWlsZGRpcn0uOzsKKyAgZXNhYzs7Citlc2FjCitjYXNlICRhY19hYnNfYnVpbGRkaXIgaW4KKy4pIGFjX2Fic19zcmNkaXI9JGFjX3NyY2Rpcjs7CisqKQorICBjYXNlICRhY19zcmNkaXIgaW4KKyAgLikgYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX2J1aWxkZGlyOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSBhY19hYnNfc3JjZGlyPSRhY19zcmNkaXI7OworICAqKSBhY19hYnNfc3JjZGlyPSRhY19hYnNfYnVpbGRkaXIvJGFjX3NyY2Rpcjs7CisgIGVzYWM7OworZXNhYworY2FzZSAkYWNfYWJzX2J1aWxkZGlyIGluCisuKSBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfdG9wX3NyY2Rpcjs7CisqKQorICBjYXNlICRhY190b3Bfc3JjZGlyIGluCisgIC4pIGFjX2Fic190b3Bfc3JjZGlyPSRhY19hYnNfYnVpbGRkaXI7OworICBbXFwvXSogfCA/OltcXC9dKiApIGFjX2Fic190b3Bfc3JjZGlyPSRhY190b3Bfc3JjZGlyOzsKKyAgKikgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX2Fic19idWlsZGRpci8kYWNfdG9wX3NyY2Rpcjs7CisgIGVzYWM7OworZXNhYworCisKKyAgY2FzZSAkSU5TVEFMTCBpbgorICBbXFwvJF0qIHwgPzpbXFwvXSogKSBhY19JTlNUQUxMPSRJTlNUQUxMIDs7CisgICopIGFjX0lOU1RBTEw9JGFjX3RvcF9idWlsZGRpciRJTlNUQUxMIDs7CisgIGVzYWMKKworICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfZmlsZSIgPiY2O30KKyAgICBybSAtZiAiJGFjX2ZpbGUiCisgIGZpCisgICMgTGV0J3Mgc3RpbGwgcHJldGVuZCBpdCBpcyBgY29uZmlndXJlJyB3aGljaCBpbnN0YW50aWF0ZXMgKGkuZS4sIGRvbid0CisgICMgdXNlICRhc19tZSksIHBlb3BsZSB3b3VsZCBiZSBzdXJwcmlzZWQgdG8gcmVhZDoKKyAgIyAgICAvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBjb25maWcuc3RhdHVzLiAgKi8KKyAgaWYgdGVzdCB4IiRhY19maWxlIiA9IHgtOyB0aGVuCisgICAgY29uZmlndXJlX2lucHV0PQorICBlbHNlCisgICAgY29uZmlndXJlX2lucHV0PSIkYWNfZmlsZS4gICIKKyAgZmkKKyAgY29uZmlndXJlX2lucHV0PSRjb25maWd1cmVfaW5wdXQiR2VuZXJhdGVkIGZyb20gYGVjaG8gJGFjX2ZpbGVfaW4gfAorCQkJCSAgICAgc2VkICdzLC4qLywsJ2AgYnkgY29uZmlndXJlLiIKKworICAjIEZpcnN0IGxvb2sgZm9yIHRoZSBpbnB1dCBmaWxlcyBpbiB0aGUgYnVpbGQgdHJlZSwgb3RoZXJ3aXNlIGluIHRoZQorICAjIHNyYyB0cmVlLgorICBhY19maWxlX2lucHV0cz1gSUZTPToKKyAgICBmb3IgZiBpbiAkYWNfZmlsZV9pbjsgZG8KKyAgICAgIGNhc2UgJGYgaW4KKyAgICAgIC0pIGVjaG8gJHRtcC9zdGRpbiA7OworICAgICAgW1xcLyRdKikKKwkgIyBBYnNvbHV0ZSAoY2FuJ3QgYmUgRE9TLXN0eWxlLCBhcyBJRlM9OikKKwkgdGVzdCAtZiAiJGYiIHx8IHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisJIGVjaG8gIiRmIjs7CisgICAgICAqKSAjIFJlbGF0aXZlCisJIGlmIHRlc3QgLWYgIiRmIjsgdGhlbgorCSAgICMgQnVpbGQgdHJlZQorCSAgIGVjaG8gIiRmIgorCSBlbGlmIHRlc3QgLWYgIiRzcmNkaXIvJGYiOyB0aGVuCisJICAgIyBTb3VyY2UgdHJlZQorCSAgIGVjaG8gIiRzcmNkaXIvJGYiCisJIGVsc2UKKwkgICAjIC9kZXYvbnVsbCB0cmVlCisJICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGYiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGYiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKwkgZmk7OworICAgICAgZXNhYworICAgIGRvbmVgIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgorICBzZWQgIiRhY192cHN1YgorJGV4dHJhc3ViCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorOnQKKy9AW2EtekEtWl9dW2EtekEtWl8wLTldKkAvIWIKK3MsQGNvbmZpZ3VyZV9pbnB1dEAsJGNvbmZpZ3VyZV9pbnB1dCw7dCB0CitzLEBzcmNkaXJALCRhY19zcmNkaXIsO3QgdAorcyxAYWJzX3NyY2RpckAsJGFjX2Fic19zcmNkaXIsO3QgdAorcyxAdG9wX3NyY2RpckAsJGFjX3RvcF9zcmNkaXIsO3QgdAorcyxAYWJzX3RvcF9zcmNkaXJALCRhY19hYnNfdG9wX3NyY2Rpciw7dCB0CitzLEBidWlsZGRpckAsJGFjX2J1aWxkZGlyLDt0IHQKK3MsQGFic19idWlsZGRpckAsJGFjX2Fic19idWlsZGRpciw7dCB0CitzLEB0b3BfYnVpbGRkaXJALCRhY190b3BfYnVpbGRkaXIsO3QgdAorcyxAYWJzX3RvcF9idWlsZGRpckAsJGFjX2Fic190b3BfYnVpbGRkaXIsO3QgdAorcyxASU5TVEFMTEAsJGFjX0lOU1RBTEwsO3QgdAorIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiR0bXAvb3V0CisgIHJtIC1mICR0bXAvc3RkaW4KKyAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgorICAgIG12ICR0bXAvb3V0ICRhY19maWxlCisgIGVsc2UKKyAgICBjYXQgJHRtcC9vdXQKKyAgICBybSAtZiAkdG1wL291dAorICBmaQorCitkb25lCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorCisjCisjIENPTkZJR19IRUFERVIgc2VjdGlvbi4KKyMKKworIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKKyMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KKyMKKyMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KK2FjX2RBPSdzLF5cKFsJIF0qXCkjXChbCSBdKmRlZmluZVsJIF1bCSBdKlwpJworYWNfZEI9J1sJIF0uKiQsXDEjXDInCithY19kQz0nICcKK2FjX2REPScsO3QnCisjIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfdUE9J3MsXlwoWwkgXSpcKSNcKFsJIF0qXCl1bmRlZlwoWwkgXVsJIF0qXCknCithY191Qj0nJCxcMSNcMmRlZmluZVwzJworYWNfdUM9JyAnCithY191RD0nLDt0JworCitmb3IgYWNfZmlsZSBpbiA6ICRDT05GSUdfSEVBREVSUzsgZG8gdGVzdCAieCRhY19maWxlIiA9IHg6ICYmIGNvbnRpbnVlCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAkYWNfZmlsZSBpbgorICAtIHwgKjotIHwgKjotOiogKSAjIGlucHV0IGZyb20gc3RkaW4KKwljYXQgPiR0bXAvc3RkaW4KKwlhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsW146XSo6LCwnYAorCWFjX2ZpbGU9YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyw6LiosLCdgIDs7CisgICo6KiApIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyxbXjpdKjosLCdgCisJYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLDouKiwsJ2AgOzsKKyAgKiApICAgYWNfZmlsZV9pbj0kYWNfZmlsZS5pbiA7OworICBlc2FjCisKKyAgdGVzdCB4IiRhY19maWxlIiAhPSB4LSAmJiB7IGVjaG8gIiRhc19tZTokTElORU5POiBjcmVhdGluZyAkYWNfZmlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQorCisgICMgRmlyc3QgbG9vayBmb3IgdGhlIGlucHV0IGZpbGVzIGluIHRoZSBidWlsZCB0cmVlLCBvdGhlcndpc2UgaW4gdGhlCisgICMgc3JjIHRyZWUuCisgIGFjX2ZpbGVfaW5wdXRzPWBJRlM9OgorICAgIGZvciBmIGluICRhY19maWxlX2luOyBkbworICAgICAgY2FzZSAkZiBpbgorICAgICAgLSkgZWNobyAkdG1wL3N0ZGluIDs7CisgICAgICBbXFwvJF0qKQorCSAjIEFic29sdXRlIChjYW4ndCBiZSBET1Mtc3R5bGUsIGFzIElGUz06KQorCSB0ZXN0IC1mICIkZiIgfHwgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGYiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGYiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKwkgIyBEbyBxdW90ZSAkZiwgdG8gcHJldmVudCBET1MgcGF0aHMgZnJvbSBiZWluZyBJRlMnZC4KKwkgZWNobyAiJGYiOzsKKyAgICAgICopICMgUmVsYXRpdmUKKwkgaWYgdGVzdCAtZiAiJGYiOyB0aGVuCisJICAgIyBCdWlsZCB0cmVlCisJICAgZWNobyAiJGYiCisJIGVsaWYgdGVzdCAtZiAiJHNyY2Rpci8kZiI7IHRoZW4KKwkgICAjIFNvdXJjZSB0cmVlCisJICAgZWNobyAiJHNyY2Rpci8kZiIKKwkgZWxzZQorCSAgICMgL2Rldi9udWxsIHRyZWUKKwkgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCSBmaTs7CisgICAgICBlc2FjCisgICAgZG9uZWAgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9CisgICMgUmVtb3ZlIHRoZSB0cmFpbGluZyBzcGFjZXMuCisgIHNlZCAncy9bCSBdKiQvLycgJGFjX2ZpbGVfaW5wdXRzID4kdG1wL2luCisKK19BQ0VPRgorCisjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gdHdvIHNlZCBzY3JpcHRzLCBgY29uZnRlc3QuZGVmaW5lcycgYW5kCisjIGBjb25mdGVzdC51bmRlZnMnLCB0aGF0IHN1YnN0aXR1dGVzIHRoZSBwcm9wZXIgdmFsdWVzIGludG8KKyMgY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIFRoZSBmaXJzdCBoYW5kbGVzIGAjZGVmaW5lJworIyB0ZW1wbGF0ZXMsIGFuZCB0aGUgc2Vjb25kIGAjdW5kZWYnIHRlbXBsYXRlcy4KKyMgQW5kIGZpcnN0OiBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4KKyMgY29uZmlnLnN0YXR1cy4gIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50CisjIGluIGNvbmZpZy5zdGF0dXMuCitybSAtZiBjb25mdGVzdC5kZWZpbmVzIGNvbmZ0ZXN0LnVuZGVmcworIyBVc2luZyBhIGhlcmUgZG9jdW1lbnQgaW5zdGVhZCBvZiBhIHN0cmluZyByZWR1Y2VzIHRoZSBxdW90aW5nIG5pZ2h0bWFyZS4KKyMgUHV0dGluZyBjb21tZW50cyBpbiBzZWQgc2NyaXB0cyBpcyBub3QgcG9ydGFibGUuCisjCisjIGBlbmQnIGlzIHVzZWQgdG8gYXZvaWQgdGhhdCB0aGUgc2Vjb25kIG1haW4gc2VkIGNvbW1hbmQgKG1lYW50IGZvcgorIyAwLWFyeSBDUFAgbWFjcm9zKSBhcHBsaWVzIHRvIG4tYXJ5IG1hY3JvIGRlZmluaXRpb25zLgorIyBTZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24gZm9yIGBjbGVhcicuCitjYXQgPmNvbmZkZWYyc2VkLnNlZCA8PFxfQUNFT0YKK3MvW1xcJixdL1xcJi9nCitzLFtcXCRgXSxcXCYsZwordCBjbGVhcgorOiBjbGVhcgorcyxeWwkgXSojWwkgXSpkZWZpbmVbCSBdWwkgXSpcKFteCSAoXVteCSAoXSpcKVwoKFteKV0qKVwpWwkgXSpcKC4qXCkkLCR7YWNfZEF9XDEke2FjX2RCfVwxXDIke2FjX2RDfVwzJHthY19kRH0sZ3AKK3QgZW5kCitzLF5bCSBdKiNbCSBdKmRlZmluZVsJIF1bCSBdKlwoW14JIF1bXgkgXSpcKVsJIF0qXCguKlwpJCwke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSxncAorOiBlbmQKK19BQ0VPRgorIyBJZiBzb21lIG1hY3JvcyB3ZXJlIGNhbGxlZCBzZXZlcmFsIHRpbWVzIHRoZXJlIG1pZ2h0IGJlIHNldmVyYWwgdGltZXMKKyMgdGhlIHNhbWUgI2RlZmluZXMsIHdoaWNoIGlzIHVzZWxlc3MuICBOZXZlcnRoZWxlc3MsIHdlIG1heSBub3Qgd2FudCB0bworIyBzb3J0IHRoZW0sIHNpbmNlIHdlIHdhbnQgdGhlICpsYXN0KiBBQy1ERUZJTkUgdG8gYmUgaG9ub3JlZC4KK3VuaXEgY29uZmRlZnMuaCB8IHNlZCAtbiAtZiBjb25mZGVmMnNlZC5zZWQgPmNvbmZ0ZXN0LmRlZmluZXMKK3NlZCAncy9hY19kL2FjX3UvZycgY29uZnRlc3QuZGVmaW5lcyA+Y29uZnRlc3QudW5kZWZzCitybSAtZiBjb25mZGVmMnNlZC5zZWQKKworIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgorIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAorIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCitjYXQgPj5jb25mdGVzdC51bmRlZnMgPDxcX0FDRU9GCitzLF5bCSBdKiNbCSBdKnVuZGVmWwkgXVsJIF0qW2EtekEtWl9dW2EtekEtWl8wLTldKiwvKiAmICovLAorX0FDRU9GCisKKyMgQnJlYWsgdXAgY29uZnRlc3QuZGVmaW5lcyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbiB0aGUgc2l6ZQorIyBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvbyAoMTAwIGNtZHMpLgorZWNobyAnICAjIEhhbmRsZSBhbGwgdGhlICNkZWZpbmUgdGVtcGxhdGVzIG9ubHkgaWYgbmVjZXNzYXJ5LicgPj4kQ09ORklHX1NUQVRVUworZWNobyAnICBpZiBncmVwICJeWwkgXSojWwkgXSpkZWZpbmUiICR0bXAvaW4gPi9kZXYvbnVsbDsgdGhlbicgPj4kQ09ORklHX1NUQVRVUworZWNobyAnICAjIElmIHRoZXJlIGFyZSBubyBkZWZpbmVzLCB3ZSBtYXkgaGF2ZSBhbiBlbXB0eSBpZi9maScgPj4kQ09ORklHX1NUQVRVUworZWNobyAnICA6JyA+PiRDT05GSUdfU1RBVFVTCitybSAtZiBjb25mdGVzdC50YWlsCit3aGlsZSBncmVwIC4gY29uZnRlc3QuZGVmaW5lcyA+L2Rldi9udWxsCitkbworICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gJHRtcC9kZWZpbmVzLnNlZC4KKyAgZWNobyAnICBjYXQgPiR0bXAvZGVmaW5lcy5zZWQgPDxDRU9GJyA+PiRDT05GSUdfU1RBVFVTCisgICMgU3BlZWQgdXA6IGRvbid0IGNvbnNpZGVyIHRoZSBub24gYCNkZWZpbmUnIGxpbmVzLgorICBlY2hvICcvXlsJIF0qI1sJIF0qZGVmaW5lLyFiJyA+PiRDT05GSUdfU1RBVFVTCisgICMgV29yayBhcm91bmQgdGhlIGZvcmdldC10by1yZXNldC10aGUtZmxhZyBidWcuCisgIGVjaG8gJ3QgY2xyJyA+PiRDT05GSUdfU1RBVFVTCisgIGVjaG8gJzogY2xyJyA+PiRDT05GSUdfU1RBVFVTCisgIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QuZGVmaW5lcyA+PiRDT05GSUdfU1RBVFVTCisgIGVjaG8gJ0NFT0YKKyAgc2VkIC1mICR0bXAvZGVmaW5lcy5zZWQgJHRtcC9pbiA+JHRtcC9vdXQKKyAgcm0gLWYgJHRtcC9pbgorICBtdiAkdG1wL291dCAkdG1wL2luCisnID4+JENPTkZJR19TVEFUVVMKKyAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LmRlZmluZXMgPmNvbmZ0ZXN0LnRhaWwKKyAgcm0gLWYgY29uZnRlc3QuZGVmaW5lcworICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LmRlZmluZXMKK2RvbmUKK3JtIC1mIGNvbmZ0ZXN0LmRlZmluZXMKK2VjaG8gJyAgZmkgIyBncmVwJyA+PiRDT05GSUdfU1RBVFVTCitlY2hvID4+JENPTkZJR19TVEFUVVMKKworIyBCcmVhayB1cCBjb25mdGVzdC51bmRlZnMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24gdGhlIHNpemUKKyMgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28gKDEwMCBjbWRzKS4KK2VjaG8gJyAgIyBIYW5kbGUgYWxsIHRoZSAjdW5kZWYgdGVtcGxhdGVzJyA+PiRDT05GSUdfU1RBVFVTCitybSAtZiBjb25mdGVzdC50YWlsCit3aGlsZSBncmVwIC4gY29uZnRlc3QudW5kZWZzID4vZGV2L251bGwKK2RvCisgICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byAkdG1wL3VuZGVmcy5zZWQuCisgIGVjaG8gJyAgY2F0ID4kdG1wL3VuZGVmcy5zZWQgPDxDRU9GJyA+PiRDT05GSUdfU1RBVFVTCisgICMgU3BlZWQgdXA6IGRvbid0IGNvbnNpZGVyIHRoZSBub24gYCN1bmRlZicKKyAgZWNobyAnL15bCSBdKiNbCSBdKnVuZGVmLyFiJyA+PiRDT05GSUdfU1RBVFVTCisgICMgV29yayBhcm91bmQgdGhlIGZvcmdldC10by1yZXNldC10aGUtZmxhZyBidWcuCisgIGVjaG8gJ3QgY2xyJyA+PiRDT05GSUdfU1RBVFVTCisgIGVjaG8gJzogY2xyJyA+PiRDT05GSUdfU1RBVFVTCisgIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudW5kZWZzID4+JENPTkZJR19TVEFUVVMKKyAgZWNobyAnQ0VPRgorICBzZWQgLWYgJHRtcC91bmRlZnMuc2VkICR0bXAvaW4gPiR0bXAvb3V0CisgIHJtIC1mICR0bXAvaW4KKyAgbXYgJHRtcC9vdXQgJHRtcC9pbgorJyA+PiRDT05GSUdfU1RBVFVTCisgIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC51bmRlZnMgPmNvbmZ0ZXN0LnRhaWwKKyAgcm0gLWYgY29uZnRlc3QudW5kZWZzCisgIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudW5kZWZzCitkb25lCitybSAtZiBjb25mdGVzdC51bmRlZnMKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCisgICMgTGV0J3Mgc3RpbGwgcHJldGVuZCBpdCBpcyBgY29uZmlndXJlJyB3aGljaCBpbnN0YW50aWF0ZXMgKGkuZS4sIGRvbid0CisgICMgdXNlICRhc19tZSksIHBlb3BsZSB3b3VsZCBiZSBzdXJwcmlzZWQgdG8gcmVhZDoKKyAgIyAgICAvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBjb25maWcuc3RhdHVzLiAgKi8KKyAgaWYgdGVzdCB4IiRhY19maWxlIiA9IHgtOyB0aGVuCisgICAgZWNobyAiLyogR2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZS4gICovIiA+JHRtcC9jb25maWcuaAorICBlbHNlCisgICAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYnkgY29uZmlndXJlLiAgKi8iID4kdG1wL2NvbmZpZy5oCisgIGZpCisgIGNhdCAkdG1wL2luID4+JHRtcC9jb25maWcuaAorICBybSAtZiAkdG1wL2luCisgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KKyAgICBpZiBkaWZmICRhY19maWxlICR0bXAvY29uZmlnLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiAkYWNfZmlsZSBpcyB1bmNoYW5nZWQiID4mNQorZWNobyAiJGFzX21lOiAkYWNfZmlsZSBpcyB1bmNoYW5nZWQiID4mNjt9CisgICAgZWxzZQorICAgICAgYWNfZGlyPWAoZGlybmFtZSAiJGFjX2ZpbGUiKSAyPi9kZXYvbnVsbCB8fAorJGFzX2V4cHIgWCIkYWNfZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoL1wpJyBcfCBcCisJIC4gICAgIDogJ1woLlwpJyAyPi9kZXYvbnVsbCB8fAorZWNobyBYIiRhY19maWxlIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpW14vXS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXCkuKi97IHMvL1wxLzsgcTsgfQorICAJICBzLy4qLy4vOyBxJ2AKKyAgICAgIHsgaWYgJGFzX21rZGlyX3A7IHRoZW4KKyAgICBta2RpciAtcCAiJGFjX2RpciIKKyAgZWxzZQorICAgIGFzX2Rpcj0iJGFjX2RpciIKKyAgICBhc19kaXJzPQorICAgIHdoaWxlIHRlc3QgISAtZCAiJGFzX2RpciI7IGRvCisgICAgICBhc19kaXJzPSIkYXNfZGlyICRhc19kaXJzIgorICAgICAgYXNfZGlyPWAoZGlybmFtZSAiJGFzX2RpciIpIDI+L2Rldi9udWxsIHx8CiskYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgXAorCSAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKK2VjaG8gWCIkYXNfZGlyIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpW14vXS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXCkuKi97IHMvL1wxLzsgcTsgfQorICAJICBzLy4qLy4vOyBxJ2AKKyAgICBkb25lCisgICAgdGVzdCAhIC1uICIkYXNfZGlycyIgfHwgbWtkaXIgJGFzX2RpcnMKKyAgZmkgfHwgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgXCIkYWNfZGlyXCIiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgXCIkYWNfZGlyXCIiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KKworICAgICAgcm0gLWYgJGFjX2ZpbGUKKyAgICAgIG12ICR0bXAvY29uZmlnLmggJGFjX2ZpbGUKKyAgICBmaQorICBlbHNlCisgICAgY2F0ICR0bXAvY29uZmlnLmgKKyAgICBybSAtZiAkdG1wL2NvbmZpZy5oCisgIGZpCitkb25lCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCisKK3sgKGV4aXQgMCk7IGV4aXQgMDsgfQorX0FDRU9GCitjaG1vZCAreCAkQ09ORklHX1NUQVRVUworYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKKworCisjIGNvbmZpZ3VyZSBpcyB3cml0aW5nIHRvIGNvbmZpZy5sb2csIGFuZCB0aGVuIGNhbGxzIGNvbmZpZy5zdGF0dXMuCisjIGNvbmZpZy5zdGF0dXMgZG9lcyBpdHMgb3duIHJlZGlyZWN0aW9uLCBhcHBlbmRpbmcgdG8gY29uZmlnLmxvZy4KKyMgVW5mb3J0dW5hdGVseSwgb24gRE9TIHRoaXMgZmFpbHMsIGFzIGNvbmZpZy5sb2cgaXMgc3RpbGwga2VwdCBvcGVuCisjIGJ5IGNvbmZpZ3VyZSwgc28gY29uZmlnLnN0YXR1cyB3b24ndCBiZSBhYmxlIHRvIHdyaXRlIHRvIGl0OyBpdHMKKyMgb3V0cHV0IGlzIHNpbXBseSBkaXNjYXJkZWQuICBTbyB3ZSBleGVjIHRoZSBGRCB0byAvZGV2L251bGwsCisjIGVmZmVjdGl2ZWx5IGNsb3NpbmcgY29uZmlnLmxvZywgc28gaXQgY2FuIGJlIHByb3Blcmx5IChyZSlvcGVuZWQgYW5kCisjIGFwcGVuZGVkIHRvIGJ5IGNvbmZpZy5zdGF0dXMuICBXaGVuIGNvbWluZyBiYWNrIHRvIGNvbmZpZ3VyZSwgd2UKKyMgbmVlZCB0byBtYWtlIHRoZSBGRCBhdmFpbGFibGUgYWdhaW4uCitpZiB0ZXN0ICIkbm9fY3JlYXRlIiAhPSB5ZXM7IHRoZW4KKyAgYWNfY3Nfc3VjY2Vzcz06CisgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0KKyAgdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYKKyAgICBhY19jb25maWdfc3RhdHVzX2FyZ3M9IiRhY19jb25maWdfc3RhdHVzX2FyZ3MgLS1xdWlldCIKKyAgZXhlYyA1Pi9kZXYvbnVsbAorICAkU0hFTEwgJENPTkZJR19TVEFUVVMgJGFjX2NvbmZpZ19zdGF0dXNfYXJncyB8fCBhY19jc19zdWNjZXNzPWZhbHNlCisgIGV4ZWMgNT4+Y29uZmlnLmxvZworICAjIFVzZSB8fCwgbm90ICYmLCB0byBhdm9pZCBleGl0aW5nIGZyb20gdGhlIGlmIHdpdGggJD8gPSAxLCB3aGljaAorICAjIHdvdWxkIG1ha2UgY29uZmlndXJlIGZhaWwgaWYgdGhpcyBpcyB0aGUgbGFzdCBpbnN0cnVjdGlvbi4KKyAgJGFjX2NzX3N1Y2Nlc3MgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9CitmaQorCisKK2Fic19zcmNkaXI9ImBjZCAkc3JjZGlyICYmIHB3ZGAiCithYnNfYnVpbGRkaXI9ImBwd2RgIgoraWYgdGVzdCAiJGFic19zcmNkaXIiICE9ICIkYWJzX2J1aWxkZGlyIjsgdGhlbgorICBtYWtlIG1rZGlyLWluaXQKK2ZpCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9jb25maWd1cmUuaW4gYi9leHBhdC0yLjAuMS9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRiY2I0MAotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2NvbmZpZ3VyZS5pbgpAQCAtMCwwICsxLDE1NCBAQAorZG5sICAgY29uZmlndXJhdGlvbiBzY3JpcHQgZm9yIGV4cGF0CitkbmwgICBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgorZG5sCitkbmwgICBDb3B5cmlnaHQgMjAwMCBDbGFyayBDb29wZXIKK2RubAorZG5sICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgRVhQQVQuCitkbmwKK2RubCAgIEVYUEFUIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKK2RubCAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTGljZW5zZSAoYmFzZWQgb24gdGhlIE1JVC9YIGxpY2Vuc2UpIGNvbnRhaW5lZAorZG5sICAgaW4gdGhlIGZpbGUgQ09QWUlORyB0aGF0IGNvbWVzIHdpdGggdGhpcyBkaXN0cmlidXRpb24uCitkbmwKKworZG5sIEVuc3VyZSB0aGF0IEV4cGF0IGlzIGNvbmZpZ3VyZWQgd2l0aCBhdXRvY29uZiAyLjUyIG9yIG5ld2VyCitBQ19QUkVSRVEoMi41MikKKworZG5sIEdldCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgRXhwYXQsIHVzaW5nIG00J3MgZXN5c2NtZCgpIGNvbW1hbmQgdG8gcnVuCitkbmwgdGhlIGNvbW1hbmQgYXQgbTQtZ2VuZXJhdGlvbiB0aW1lLiBUaGlzIGFsbG93cyB1cyB0byBjcmVhdGUgYW4gbTQKK2RubCBzeW1ib2wgaG9sZGluZyB0aGUgY29ycmVjdCB2ZXJzaW9uIG51bWJlci4gQUNfSU5JVCgpIHJlcXVpcmVzIHRoZQorZG5sIHZlcnNpb24gbnVtYmVyIGF0IG00LXRpbWUsIHJhdGhlciB0aGFuIHdoZW4gLi9jb25maWd1cmUgaXMgcnVuLCBzbworZG5sIGFsbCB0aGlzIG11c3QgaGFwcGVuIGFzIHBhcnQgb2YgbTQsIG5vdCBhcyBwYXJ0IG9mIHRoZSBzaGVsbCBjb2RlCitkbmwgY29udGFpbmVkIGluIC4vY29uZmlndXJlLgorZG5sCitkbmwgTk9URTogZXN5c2NtZCgpIGlzIGEgR05VIE00IGV4dGVuc2lvbi4gVGh1cywgd2Ugd3JhcCBpdCBpbiBhbiBhcHByb3ByaWF0ZQorZG5sIHRlc3QuIEkgYmVsaWV2ZSB0aGlzIHRlc3Qgd2lsbCB3b3JrLCBidXQgSSBkb24ndCBoYXZlIGEgcGxhY2Ugd2l0aCBub24tCitkbmwgR05VIE00IHRvIHRlc3QgaXQgcmlnaHQgbm93LgorZGVmaW5lKFtleHBhdF92ZXJzaW9uXSwgaWZkZWYoW19fZ251X19dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VzeXNjbWQoY29uZnRvb2xzL2dldC12ZXJzaW9uLnNoIGxpYi9leHBhdC5oKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMi4wLnhdKSkKK0FDX0lOSVQoZXhwYXQsIGV4cGF0X3ZlcnNpb24sIGV4cGF0LWJ1Z3NAbGliZXhwYXQub3JnKQordW5kZWZpbmUoW2V4cGF0X3ZlcnNpb25dKQorCitBQ19DT05GSUdfU1JDRElSKE1ha2VmaWxlLmluKQorQUNfQ09ORklHX0FVWF9ESVIoY29uZnRvb2xzKQorCisKK2RubAorZG5sIEluY3JlbWVudCBMSUJSRVZJU0lPTiBpZiBzb3VyY2UgY29kZSBoYXMgY2hhbmdlZCBhdCBhbGwKK2RubAorZG5sIElmIHRoZSBBUEkgaGFzIGNoYW5nZWQsIGluY3JlbWVudCBMSUJDVVJSRU5UIGFuZCBzZXQgTElCUkVWSVNJT04gdG8gMAorZG5sCitkbmwgSWYgdGhlIEFQSSBjaGFuZ2VzIGNvbXBhdGlibHkgKGkuZS4gc2ltcGx5IGFkZGluZyBhIG5ldyBmdW5jdGlvbgorZG5sIHdpdGhvdXQgY2hhbmdpbmcgb3IgcmVtb3ZpbmcgZWFybGllciBpbnRlcmZhY2VzKSwgdGhlbiBpbmNyZW1lbnQgTElCQUdFLgorZG5sIAorZG5sIElmIHRoZSBBUEkgY2hhbmdlcyBpbmNvbXBhdGlibHkgc2V0IExJQkFHRSBiYWNrIHRvIDAKK2RubAorCitMSUJDVVJSRU5UPTYKK0xJQlJFVklTSU9OPTIKK0xJQkFHRT01CisKK0FDX0NPTkZJR19IRUFERVIoZXhwYXRfY29uZmlnLmgpCisKK3NpbmNsdWRlKGNvbmZ0b29scy9saWJ0b29sLm00KQorc2luY2x1ZGUoY29uZnRvb2xzL2FjX2NfYmlnZW5kaWFuX2Nyb3NzLm00KQorCitBQ19MSUJUT09MX1dJTjMyX0RMTAorQUNfUFJPR19MSUJUT09MCisKK0FDX1NVQlNUKExJQkNVUlJFTlQpCitBQ19TVUJTVChMSUJSRVZJU0lPTikKK0FDX1NVQlNUKExJQkFHRSkKKworZG5sIENoZWNrcyBmb3IgcHJvZ3JhbXMuCitBQ19QUk9HX0NDCitBQ19QUk9HX0lOU1RBTEwKKworaWYgdGVzdCAiJEdDQyIgPSB5ZXMgOyB0aGVuCisgICAgZG5sCisgICAgZG5sIEJlIGNhcmVmdWwgYWJvdXQgYWRkaW5nIHRoZSAtZmV4Y2VwdGlvbnMgb3B0aW9uOyBzb21lIHZlcnNpb25zIG9mCisgICAgZG5sIEdDQyBkb24ndCBzdXBwb3J0IGl0IGFuZCBpdCBjYXVzZXMgZXh0cmEgd2FybmluZ3MgdGhhdCBhcmUgb25seQorICAgIGRubCBkaXN0cmFjdGluZzsgYXZvaWQuCisgICAgZG5sCisgICAgT0xEQ0ZMQUdTPSIkQ0ZMQUdTIC1XYWxsIC1XbWlzc2luZy1wcm90b3R5cGVzIC1Xc3RyaWN0LXByb3RvdHlwZXMiCisgICAgQ0ZMQUdTPSIkT0xEQ0ZMQUdTIC1mZXhjZXB0aW9ucyIKKyAgICBBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciAkQ0MgYWNjZXB0cyAtZmV4Y2VwdGlvbnMpCisgICAgQUNfVFJZX0xJTksoICwgLAorICAgICAgICAgICAgICAgICAgIEFDX01TR19SRVNVTFQoeWVzKSwKKyAgICAgICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKG5vKTsgQ0ZMQUdTPSIkT0xEQ0ZMQUdTIikKKyAgICBDWFhGTEFHUz1gZWNobyAiJENGTEFHUyIgfCBzZWQgJ3MvIC1XbWlzc2luZy1wcm90b3R5cGVzIC1Xc3RyaWN0LXByb3RvdHlwZXMvLydgCitmaQorCitkbmwgQ2hlY2tzIGZvciBoZWFkZXIgZmlsZXMuCitBQ19IRUFERVJfU1REQworCitkbmwgQ2hlY2tzIGZvciB0eXBlZGVmcywgc3RydWN0dXJlcywgYW5kIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcy4KKworZG5sIE5vdGU6IEF2b2lkIHVzaW5nIEFDX0NfQklHRU5ESUFOIGJlY2F1c2UgaXQgZG9lcyBub3QKK2RubCB3b3JrIGluIGEgY3Jvc3MgY29tcGlsZS4KK0FDX0NfQklHRU5ESUFOX0NST1NTCisKK0FDX0NfQ09OU1QKK0FDX1RZUEVfU0laRV9UCitBQ19DSEVDS19GVU5DUyhtZW1tb3ZlIGJjb3B5KQorCitkbmwgT25seSBuZWVkZWQgZm9yIHhtbHdmOgorQUNfQ0hFQ0tfSEVBREVSUyhmY250bC5oIHVuaXN0ZC5oKQorQUNfVFlQRV9PRkZfVAorQUNfRlVOQ19NTUFQCisKK2lmIHRlc3QgIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiA9ICJ5ZXMiOyB0aGVuCisgICAgRklMRU1BUD11bml4ZmlsZW1hcAorZWxzZQorICAgIEZJTEVNQVA9cmVhZGZpbGVtYXAKK2ZpCitBQ19TVUJTVChGSUxFTUFQKQorCitkbmwgTmVlZGVkIGZvciB0aGUgdGVzdCBzdXBwb3J0IGNvZGU7IHRoaXMgd2FzIGZvdW5kIGF0CitkbmwgaHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2J1Zy1hdXRvY29uZi8yMDAyLTA3L21zZzAwMDI4Lmh0bWwKKworIyBBQ19DUFBfRlVOQworIyAtLS0tLS0tLS0tLS0tLS0tLS0gIworIyBDaGVja3MgdG8gc2VlIGlmIEFOU0kgQzk5IENQUCB2YXJpYWJsZSBfX2Z1bmNfXyB3b3Jrcy4KKyMgSWYgbm90LCBwZXJoYXBzIF9fRlVOQ1RJT05fXyB3b3JrcyBpbnN0ZWFkLiAKKyMgSWYgbm90LCB3ZSdsbCBqdXN0IGRlZmluZSBfX2Z1bmNfXyB0byAiIi4gCitBQ19ERUZVTihbQUNfQ1BQX0ZVTkNdLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NfU1REQ10pZG5sCitBQ19DQUNIRV9DSEVDSyhbZm9yIGFuIEFOU0kgQzk5LWNvbmZvcm1pbmcgX19mdW5jX19dLCBhY19jdl9jcHBfZnVuYywKK1tBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtdLAorW1tjaGFyICpmb28gPSBfX2Z1bmNfXztdXSldLAorICBbYWNfY3ZfY3BwX2Z1bmM9eWVzXSwgCisgIFtBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtdLAorW1tjaGFyICpmb28gPSBfX0ZVTkNUSU9OX187XV0pXSwKKyAgW2FjX2N2X2NwcF9mdW5jPV9fRlVOQ1RJT05fX10sIAorICBbYWNfY3ZfY3BwX2Z1bmM9bm9dKV0pXSkKK2lmIHRlc3QgJGFjX2N2X2NwcF9mdW5jID0gX19GVU5DVElPTl9fOyB0aGVuCisgIEFDX0RFRklORShfX2Z1bmNfXyxfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICBbRGVmaW5lIHRvIF9fRlVOQ1RJT05fXyBvciAiIiBpZiBgX19mdW5jX18nIGRvZXMgbm90IGNvbmZvcm0gdG8gCitBTlNJIEMuXSkKK2VsaWYgdGVzdCAkYWNfY3ZfY3BwX2Z1bmMgPSBubzsgdGhlbgorICBBQ19ERUZJTkUoX19mdW5jX18sIiIsCisgICAgICAgICAgICBbRGVmaW5lIHRvIF9fRlVOQ1RJT05fXyBvciAiIiBpZiBgX19mdW5jX18nIGRvZXMgbm90IGNvbmZvcm0gdG8gCitBTlNJIEMuXSkKK2ZpCitdKSMgQUNfQ1BQX0ZVTkMKKworQUNfQ1BQX0ZVTkMKKworCitkbmwgU29tZSBiYXNpYyBjb25maWd1cmF0aW9uOgorQUNfREVGSU5FKFtYTUxfTlNdLCAxLAorICAgICAgICAgIFtEZWZpbmUgdG8gbWFrZSBYTUwgTmFtZXNwYWNlcyBmdW5jdGlvbmFsaXR5IGF2YWlsYWJsZS5dKQorQUNfREVGSU5FKFtYTUxfRFREXSwgMSwKKyAgICAgICAgICBbRGVmaW5lIHRvIG1ha2UgcGFyYW1ldGVyIGVudGl0eSBwYXJzaW5nIGZ1bmN0aW9uYWxpdHkgYXZhaWxhYmxlLl0pCitBQ19ERUZJTkUoW1hNTF9DT05URVhUX0JZVEVTXSwgMTAyNCwKKyAgICAgICAgICBbRGVmaW5lIHRvIHNwZWNpZnkgaG93IG11Y2ggY29udGV4dCB0byByZXRhaW4gYXJvdW5kIHRoZSBjdXJyZW50IHBhcnNlIHBvaW50Ll0pCisKK0FDX0NPTkZJR19GSUxFUyhNYWtlZmlsZSkKK0FDX09VVFBVVAorCithYnNfc3JjZGlyPSJgY2QgJHNyY2RpciAmJiBwd2RgIgorYWJzX2J1aWxkZGlyPSJgcHdkYCIKK2lmIHRlc3QgIiRhYnNfc3JjZGlyIiAhPSAiJGFic19idWlsZGRpciI7IHRoZW4KKyAgbWFrZSBta2Rpci1pbml0CitmaQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvY29uZnRvb2xzL1ByaW50UGF0aCBiL2V4cGF0LTIuMC4xL2NvbmZ0b29scy9QcmludFBhdGgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTg1NTlhMwotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2NvbmZ0b29scy9QcmludFBhdGgKQEAgLTAsMCArMSwxMTYgQEAKKyMhL2Jpbi9zaAorIyBMb29rIGZvciBwcm9ncmFtW3NdIHNvbWV3aGVyZSBpbiAkUEFUSC4KKyMKKyMgT3B0aW9uczoKKyMgIC1zCisjICAgIERvIG5vdCBwcmludCBvdXQgZnVsbCBwYXRobmFtZS4gKHNpbGVudCkKKyMgIC1wUEFUSE5BTUUKKyMgICAgTG9vayBpbiBQQVRITkFNRSBpbnN0ZWFkIG9mICRQQVRICisjCisjIFVzYWdlOgorIyAgUHJpbnRQYXRoIFstc10gWy1wUEFUSE5BTUVdIHByb2dyYW0gW3Byb2dyYW0gLi4uXQorIworIyBJbml0aWFsbHkgd3JpdHRlbiBieSBKaW0gSmFnaWVsc2tpIGZvciB0aGUgQXBhY2hlIGNvbmZpZ3VyYXRpb24gbWVjaGFuaXNtCisjICAod2l0aCBrdWRvcyB0byBLZXJuaWdoYW4vUGlrZSkKKyMKKyMgVGhpcyBzY3JpcHQgZmFsbHMgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLgorIyBTZWUgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UKKworIyMKKyMgU29tZSAiY29uc3RhbnRzIgorIyMKK3BhdGhuYW1lPSRQQVRICitlY2hvPSJ5ZXMiCisKKyMjCisjIEZpbmQgb3V0IHdoYXQgT1Mgd2UgYXJlIHJ1bm5pbmcgZm9yIGxhdGVyIG9uCisjIworb3M9YCh1bmFtZSkgMj4vZGV2L251bGxgCisKKyMjCisjIFBhcnNlIGNvbW1hbmQgbGluZQorIyMKK2ZvciBhcmdzIGluICQqCitkbworICAgIGNhc2UgJGFyZ3MgaW4KKwktcyAgKSBlY2hvPSJubyIgOzsKKwktcCogKSBwYXRobmFtZT0iYGVjaG8gJGFyZ3MgfCBzZWQgJ3MvXi4uLy8nYCIgOzsKKwkqICAgKSBwcm9ncmFtcz0iJHByb2dyYW1zICRhcmdzIiA7OworICAgIGVzYWMKK2RvbmUKKworIyMKKyMgTm93IHdlIG1ha2UgdGhlIGFkanVzdG1lbnRzIHJlcXVpcmVkIGZvciBPUy8yIGFuZCBldmVyeW9uZQorIyBlbHNlIDopCisjCisjIEZpcnN0IG9mIGFsbCwgYWxsIE9TLzIgcHJvZ3JhbXMgaGF2ZSB0aGUgJy5leGUnIGV4dGVuc2lvbi4KKyMgTmV4dCwgd2UgYWRqdXN0IFBBVEggKG9yIHdoYXQgd2FzIGdpdmVuIHRvIHVzIGFzIFBBVEgpIHRvCisjIGJlIHdoaXRlc3BhY2Ugc2VwYXJhdGVkIGRpcmVjdG9yaWVzLgorIyBGaW5hbGx5LCB3ZSB0cnkgdG8gZGV0ZXJtaW5lIHRoZSBiZXN0IGZsYWcgdG8gdXNlIGZvcgorIyB0ZXN0L1tdIHRvIGxvb2sgZm9yIGFuIGV4ZWN1dGFibGUgZmlsZS4gT1MvMiBqdXN0IGhhcyAnLXInCisjIGJ1dCB3aXRoIG90aGVyIE9Tcywgd2UgZG8gc29tZSBmdW5ueSBzdHVmZiB0byBjaGVjayB0byBzZWUKKyMgaWYgdGVzdC9bXSBrbm93cyBhYm91dCAteCwgd2hpY2ggaXMgdGhlIHByZWZlcnJlZCBmbGFnLgorIyMKKworaWYgWyAieCRvcyIgPSAieE9TLzIiIF0KK3RoZW4KKyAgICBleHQ9Ii5leGUiCisgICAgcGF0aG5hbWU9YGVjaG8gLUUgJHBhdGhuYW1lIHwKKyAgICAgc2VkICdzL147Ly47LworCSAgcy87Oy87LjsvZworCSAgcy87JC87Li8KKwkgIHMvOy8gL2cKKwkgIHMvXFxcXC9cXC8vZycgYAorICAgIHRlc3RfZXhlY19mbGFnPSItciIKK2Vsc2UKKyAgICBleHQ9IiIJIyBObyBkZWZhdWx0IGV4dGVuc2lvbnMKKyAgICBwYXRobmFtZT1gZWNobyAkcGF0aG5hbWUgfAorICAgICBzZWQgJ3MvXjovLjovCisJICBzLzo6LzouOi9nCisJICBzLzokLzouLworCSAgcy86LyAvZycgYAorICAgICMgSGVyZSBpcyBob3cgd2UgdGVzdCB0byBzZWUgaWYgdGVzdC9bXSBjYW4gaGFuZGxlIC14CisgICAgdGVzdGZpbGU9InBwLnQuJCQiCisKKyAgICBjYXQgPiAkdGVzdGZpbGUgPDxFTkRURVNUCisjIS9iaW4vc2gKK2lmIFsgLXggLyBdIHx8IFsgLXggL2JpbiBdIHx8IFsgLXggL2Jpbi9scyBdOyB0aGVuCisgICAgZXhpdCAwCitmaQorZXhpdCAxCitFTkRURVNUCisKKyAgICBpZiBgL2Jpbi9zaCAkdGVzdGZpbGUgMj4vZGV2L251bGxgOyB0aGVuCisJdGVzdF9leGVjX2ZsYWc9Ii14IgorICAgIGVsc2UKKwl0ZXN0X2V4ZWNfZmxhZz0iLXIiCisgICAgZmkKKyAgICBybSAtZiAkdGVzdGZpbGUKK2ZpCisKK2ZvciBwcm9ncmFtIGluICRwcm9ncmFtcworZG8KKyAgICBmb3IgcGF0aCBpbiAkcGF0aG5hbWUKKyAgICBkbworCWlmIFsgJHRlc3RfZXhlY19mbGFnICRwYXRoLyR7cHJvZ3JhbX0ke2V4dH0gXSAmJiBcCisJICAgWyAhIC1kICRwYXRoLyR7cHJvZ3JhbX0ke2V4dH0gXTsgdGhlbgorCSAgICBpZiBbICJ4JGVjaG8iID0gInh5ZXMiIF07IHRoZW4KKwkJZWNobyAkcGF0aC8ke3Byb2dyYW19JHtleHR9CisJICAgIGZpCisJICAgIGV4aXQgMAorCWZpCisKKyMgTmV4dCB0cnkgd2l0aG91dCBleHRlbnNpb24gKGlmIG9uZSB3YXMgdXNlZCBhYm92ZSkKKwlpZiBbICJ4JGV4dCIgIT0gIngiIF07IHRoZW4KKyAgICAgICAgICAgIGlmIFsgJHRlc3RfZXhlY19mbGFnICRwYXRoLyR7cHJvZ3JhbX0gXSAmJiBcCisgICAgICAgICAgICAgICBbICEgLWQgJHBhdGgvJHtwcm9ncmFtfSBdOyB0aGVuCisgICAgICAgICAgICAgICAgaWYgWyAieCRlY2hvIiA9ICJ4eWVzIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGVjaG8gJHBhdGgvJHtwcm9ncmFtfQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZXhpdCAwCisgICAgICAgICAgICBmaQorICAgICAgICBmaQorICAgIGRvbmUKK2RvbmUKK2V4aXQgMQorCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9jb25mdG9vbHMvYWNfY19iaWdlbmRpYW5fY3Jvc3MubTQgYi9leHBhdC0yLjAuMS9jb25mdG9vbHMvYWNfY19iaWdlbmRpYW5fY3Jvc3MubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkM2VkYgotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2NvbmZ0b29scy9hY19jX2JpZ2VuZGlhbl9jcm9zcy5tNApAQCAtMCwwICsxLDgxIEBACitkbmwgQHN5bm9wc2lzIEFDX0NfQklHRU5ESUFOX0NST1NTCitkbmwKK2RubCBDaGVjayBlbmRpYW5lc3MgZXZlbiB3aGVuIGNyb3NzY29tcGlsaW5nCitkbmwgKHBhcnRpYWxseSBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgQUNfQ19CSUdFTkRJQU4pLgorZG5sCitkbmwgVGhlIGltcGxlbWVudGF0aW9uIHdpbGwgY3JlYXRlIGEgYmluYXJ5LCBhbmQgaW5zdGVhZCBvZiBydW5uaW5nCitkbmwgdGhlIGJpbmFyeSBpdCB3aWxsIGJlIGdyZXAnZWQgZm9yIHNvbWUgc3ltYm9scyB0aGF0IHdpbGwgbG9vaworZG5sIGRpZmZlcmVudCBmb3IgZGlmZmVyZW50IGVuZGlhbmVzcyBvZiB0aGUgYmluYXJ5LgorZG5sCitkbmwgQHZlcnNpb24gJElkOiBhY19jX2JpZ2VuZGlhbl9jcm9zcy5tNCx2IDEuMiAyMDAxLzEwLzAxIDIwOjAzOjEzIGZkcmFrZSBFeHAgJAorZG5sIEBhdXRob3IgR3VpZG8gRHJhaGVpbSA8Z3VpZG9kQGdteC5kZT4KK2RubAorQUNfREVGVU4oW0FDX0NfQklHRU5ESUFOX0NST1NTXSwKK1tBQ19DQUNIRV9DSEVDSyh3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuLCBhY19jdl9jX2JpZ2VuZGlhbiwKK1thY19jdl9jX2JpZ2VuZGlhbj11bmtub3duCisjIFNlZSBpZiBzeXMvcGFyYW0uaCBkZWZpbmVzIHRoZSBCWVRFX09SREVSIG1hY3JvLgorQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD5dLCBbCisjaWYgIUJZVEVfT1JERVIgfHwgIUJJR19FTkRJQU4gfHwgIUxJVFRMRV9FTkRJQU4KKyBib2d1cyBlbmRpYW4gbWFjcm9zCisjZW5kaWZdLCBbIyBJdCBkb2VzOyBub3cgc2VlIHdoZXRoZXIgaXQgZGVmaW5lZCB0byBCSUdfRU5ESUFOIG9yIG5vdC4KK0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+XSwgWworI2lmIEJZVEVfT1JERVIgIT0gQklHX0VORElBTgorIG5vdCBiaWcgZW5kaWFuCisjZW5kaWZdLCBhY19jdl9jX2JpZ2VuZGlhbj15ZXMsIGFjX2N2X2NfYmlnZW5kaWFuPW5vKV0pCitpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KK0FDX1RSWV9SVU4oW21haW4gKCkgeworICAvKiBBcmUgd2UgbGl0dGxlIG9yIGJpZyBlbmRpYW4/ICBGcm9tIEhhcmJpc29uJlN0ZWVsZS4gICovCisgIHVuaW9uCisgIHsKKyAgICBsb25nIGw7CisgICAgY2hhciBjW3NpemVvZiAobG9uZyldOworICB9IHU7CisgIHUubCA9IDE7CisgIGV4aXQgKHUuY1tzaXplb2YgKGxvbmcpIC0gMV0gPT0gMSk7Cit9XSwgYWNfY3ZfY19iaWdlbmRpYW49bm8sIGFjX2N2X2NfYmlnZW5kaWFuPXllcywKK1sgZWNobyAkYWNfbiAiY3Jvc3MtY29tcGlsaW5nLi4uICIgMj4mQUNfRkRfTVNHIF0pCitmaV0pCitpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KK0FDX01TR19DSEVDS0lORyh0byBwcm9iZSBmb3IgYnl0ZSBvcmRlcmluZykKK1sKK2NhdCA+Y29uZnRlc3QuYyA8PEVPRgorc2hvcnQgYXNjaWlfbW1bXSA9IHsgMHg0MjQ5LCAweDQ3NjUsIDB4NkU0NCwgMHg2OTYxLCAweDZFNTMsIDB4Nzk1MywgMCB9Oworc2hvcnQgYXNjaWlfaWlbXSA9IHsgMHg2OTRDLCAweDU0NTQsIDB4NjU2QywgMHg2RTQ1LCAweDY5NDQsIDB4NkU2MSwgMCB9Owordm9pZCBfYXNjaWkoKSB7IGNoYXIqIHMgPSAoY2hhciopIGFzY2lpX21tOyBzID0gKGNoYXIqKSBhc2NpaV9paTsgfQorc2hvcnQgZWJjZGljX2lpW10gPSB7IDB4ODlEMywgMHhFM0UzLCAweDg1OTMsIDB4OTVDNSwgMHg4OUM0LCAweDk1ODEsIDAgfTsKK3Nob3J0IGViY2RpY19tbVtdID0geyAweEMyQzksIDB4Qzc4NSwgMHg5NUM0LCAweDg5ODEsIDB4OTVFMiwgMHhBOEUyLCAwIH07Cit2b2lkIF9lYmNkaWMoKSB7IGNoYXIqIHMgPSAoY2hhciopIGViY2RpY19tbTsgcyA9IChjaGFyKikgZWJjZGljX2lpOyB9CitpbnQgbWFpbigpIHsgX2FzY2lpICgpOyBfZWJjZGljICgpOyByZXR1cm4gMDsgfQorRU9GCitdIGlmIHRlc3QgLWYgY29uZnRlc3QuYyA7IHRoZW4KKyAgICAgaWYgJHtDQy1jY30gLWMgY29uZnRlc3QuYyAtbyBjb25mdGVzdC5vICYmIHRlc3QgLWYgY29uZnRlc3QubyA7IHRoZW4KKyAgICAgICAgaWYgdGVzdCBgZ3JlcCAtbCBCSUdlbkRpYW5TeVMgY29uZnRlc3Qub2AgOyB0aGVuCisgICAgICAgICAgIGVjaG8gJGFjX24gJyBiaWcgZW5kaWFuIHByb2JlIE9LLCAnIDE+JkFDX0ZEX01TRworICAgICAgICAgICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKKyAgICAgICAgZmkKKyAgICAgICAgaWYgdGVzdCBgZ3JlcCAtbCBMaVRUbGVFbkRpYW4gY29uZnRlc3Qub2AgOyB0aGVuCisgICAgICAgICAgIGVjaG8gJGFjX24gJyBsaXR0bGUgZW5kaWFuIHByb2JlIE9LLCAnIDE+JkFDX0ZEX01TRworICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHllcyA7IHRoZW4KKyAgICAgICAgICAgIGFjX2N2X2NfYmlnZW5kaWFuPXVua25vd247CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFjX2N2X2NfYmlnZW5kaWFuPW5vCisgICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgICAgIGVjaG8gJGFjX24gJ2d1ZXNzaW5nIGJpZ2VuZGlhbiAuLi4gICcgPiZBQ19GRF9NU0cKKyAgICAgZmkKKyAgZmkKK0FDX01TR19SRVNVTFQoJGFjX2N2X2NfYmlnZW5kaWFuKQorZmkKK2lmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0geWVzOyB0aGVuCisgIEFDX0RFRklORShXT1JEU19CSUdFTkRJQU4sIDEsIFt3aGV0aGVyIGJ5dGVvcmRlciBpcyBiaWdlbmRpYW5dKQorICBCWVRFT1JERVI9NDMyMQorZWxzZQorICBCWVRFT1JERVI9MTIzNAorZmkKK0FDX0RFRklORV9VTlFVT1RFRChCWVRFT1JERVIsICRCWVRFT1JERVIsIFsxMjM0ID0gTElMX0VORElBTiwgNDMyMSA9IEJJR0VORElBTl0pCitpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KKyAgQUNfTVNHX0VSUk9SKHVua25vd24gZW5kaWFuZXNzIC0gc29ycnksIHBsZWFzZSBwcmUtc2V0IGFjX2N2X2NfYmlnZW5kaWFuKQorZmkKK10pCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9jb25mdG9vbHMvY29uZmlnLmd1ZXNzIGIvZXhwYXQtMi4wLjEvY29uZnRvb2xzL2NvbmZpZy5ndWVzcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zOTY0ODJkCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvY29uZnRvb2xzL2NvbmZpZy5ndWVzcwpAQCAtMCwwICsxLDE1MDAgQEAKKyMhIC9iaW4vc2gKKyMgQXR0ZW1wdCB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZS4KKyMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCisjICAgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjICAgSW5jLgorCit0aW1lc3RhbXA9JzIwMDYtMDctMDInCisKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyMgMDIxMTAtMTMwMSwgVVNBLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKworIyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIgPHBlckBib3RobmVyLmNvbT4uCisjIFBsZWFzZSBzZW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiAgU3VibWl0IGEgY29udGV4dAorIyBkaWZmIGFuZCBhIHByb3Blcmx5IGZvcm1hdHRlZCBDaGFuZ2VMb2cgZW50cnkuCisjCisjIFRoaXMgc2NyaXB0IGF0dGVtcHRzIHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lIHNpbWlsYXIgdG8KKyMgY29uZmlnLnN1Yi4gIElmIGl0IHN1Y2NlZWRzLCBpdCBwcmludHMgdGhlIHN5c3RlbSBuYW1lIG9uIHN0ZG91dCwgYW5kCisjIGV4aXRzIHdpdGggMC4gIE90aGVyd2lzZSwgaXQgZXhpdHMgd2l0aCAxLgorIworIyBUaGUgcGxhbiBpcyB0aGF0IHRoaXMgY2FuIGJlIGNhbGxlZCBieSBjb25maWd1cmUgc2NyaXB0cyBpZiB5b3UKKyMgZG9uJ3Qgc3BlY2lmeSBhbiBleHBsaWNpdCBidWlsZCBzeXN0ZW0gdHlwZS4KKworbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCisKK3VzYWdlPSJcCitVc2FnZTogJDAgW09QVElPTl0KKworT3V0cHV0IHRoZSBjb25maWd1cmF0aW9uIG5hbWUgb2YgdGhlIHN5c3RlbSBcYCRtZScgaXMgcnVuIG9uLgorCitPcGVyYXRpb24gbW9kZXM6CisgIC1oLCAtLWhlbHAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtdCwgLS10aW1lLXN0YW1wICAgcHJpbnQgZGF0ZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgdGhlbiBleGl0CisgIC12LCAtLXZlcnNpb24gICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0CisKK1JlcG9ydCBidWdzIGFuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4iCisKK3ZlcnNpb249IlwKK0dOVSBjb25maWcuZ3Vlc3MgKCR0aW1lc3RhbXApCisKK09yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lci4KK0NvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCit3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCisKK2hlbHA9IgorVHJ5IFxgJG1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorCisjIFBhcnNlIGNvbW1hbmQgbGluZQord2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtLXRpbWUtc3RhbXAgfCAtLXRpbWUqIHwgLXQgKQorICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCA7OworICAgIC0tdmVyc2lvbiB8IC12ICkKKyAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDs7CisgICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCisgICAgICAgc2hpZnQ7IGJyZWFrIDs7CisgICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgorICAgICAgIGJyZWFrIDs7CisgICAgLSogKQorICAgICAgIGVjaG8gIiRtZTogaW52YWxpZCBvcHRpb24gJDEkaGVscCIgPiYyCisgICAgICAgZXhpdCAxIDs7CisgICAgKiApCisgICAgICAgYnJlYWsgOzsKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0ICQjICE9IDA7IHRoZW4KKyAgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCisgIGV4aXQgMQorZmkKKwordHJhcCAnZXhpdCAxJyAxIDIgMTUKKworIyBDQ19GT1JfQlVJTEQgLS0gY29tcGlsZXIgdXNlZCBieSB0aGlzIHNjcmlwdC4gTm90ZSB0aGF0IHRoZSB1c2Ugb2YgYQorIyBjb21waWxlciB0byBhaWQgaW4gc3lzdGVtIGRldGVjdGlvbiBpcyBkaXNjb3VyYWdlZCBhcyBpdCByZXF1aXJlcworIyB0ZW1wb3JhcnkgZmlsZXMgdG8gYmUgY3JlYXRlZCBhbmQsIGFzIHlvdSBjYW4gc2VlIGJlbG93LCBpdCBpcyBhCisjIGhlYWRhY2hlIHRvIGRlYWwgd2l0aCBpbiBhIHBvcnRhYmxlIGZhc2hpb24uCisKKyMgSGlzdG9yaWNhbGx5LCBgQ0NfRk9SX0JVSUxEJyB1c2VkIHRvIGJlIG5hbWVkIGBIT1NUX0NDJy4gV2Ugc3RpbGwKKyMgdXNlIGBIT1NUX0NDJyBpZiBkZWZpbmVkLCBidXQgaXQgaXMgZGVwcmVjYXRlZC4KKworIyBQb3J0YWJsZSB0bXAgZGlyZWN0b3J5IGNyZWF0aW9uIGluc3BpcmVkIGJ5IHRoZSBBdXRvY29uZiB0ZWFtLgorCitzZXRfY2NfZm9yX2J1aWxkPScKK3RyYXAgImV4aXRjb2RlPVwkPzsgKHJtIC1mIFwkdG1wZmlsZXMgMj4vZGV2L251bGw7IHJtZGlyIFwkdG1wIDI+L2Rldi9udWxsKSAmJiBleGl0IFwkZXhpdGNvZGUiIDAgOwordHJhcCAicm0gLWYgXCR0bXBmaWxlcyAyPi9kZXYvbnVsbDsgcm1kaXIgXCR0bXAgMj4vZGV2L251bGw7IGV4aXQgMSIgMSAyIDEzIDE1IDsKKzogJHtUTVBESVI9L3RtcH0gOworIHsgdG1wPWAodW1hc2sgMDc3ICYmIG1rdGVtcCAtZCAiJFRNUERJUi9jZ1hYWFhYWCIpIDI+L2Rldi9udWxsYCAmJiB0ZXN0IC1uICIkdG1wIiAmJiB0ZXN0IC1kICIkdG1wIiA7IH0gfHwKKyB7IHRlc3QgLW4gIiRSQU5ET00iICYmIHRtcD0kVE1QRElSL2NnJCQtJFJBTkRPTSAmJiAodW1hc2sgMDc3ICYmIG1rZGlyICR0bXApIDsgfSB8fAorIHsgdG1wPSRUTVBESVIvY2ctJCQgJiYgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKSAmJiBlY2hvICJXYXJuaW5nOiBjcmVhdGluZyBpbnNlY3VyZSB0ZW1wIGRpcmVjdG9yeSIgPiYyIDsgfSB8fAorIHsgZWNobyAiJG1lOiBjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAkVE1QRElSIiA+JjIgOyBleGl0IDEgOyB9IDsKK2R1bW15PSR0bXAvZHVtbXkgOwordG1wZmlsZXM9IiRkdW1teS5jICRkdW1teS5vICRkdW1teS5yZWwgJGR1bW15IiA7CitjYXNlICRDQ19GT1JfQlVJTEQsJEhPU1RfQ0MsJENDIGluCisgLCwpICAgIGVjaG8gImludCB4OyIgPiAkZHVtbXkuYyA7CisJZm9yIGMgaW4gY2MgZ2NjIGM4OSBjOTkgOyBkbworCSAgaWYgKCRjIC1jIC1vICRkdW1teS5vICRkdW1teS5jKSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJICAgICBDQ19GT1JfQlVJTEQ9IiRjIjsgYnJlYWsgOworCSAgZmkgOworCWRvbmUgOworCWlmIHRlc3QgeCIkQ0NfRk9SX0JVSUxEIiA9IHggOyB0aGVuCisJICBDQ19GT1JfQlVJTEQ9bm9fY29tcGlsZXJfZm91bmQgOworCWZpCisJOzsKKyAsLCopICAgQ0NfRk9SX0JVSUxEPSRDQyA7OworICwqLCopICBDQ19GT1JfQlVJTEQ9JEhPU1RfQ0MgOzsKK2VzYWMgOyBzZXRfY2NfZm9yX2J1aWxkPSA7JworCisjIFRoaXMgaXMgbmVlZGVkIHRvIGZpbmQgdW5hbWUgb24gYSBQeXJhbWlkIE9TeCB3aGVuIHJ1biBpbiB0aGUgQlNEIHVuaXZlcnNlLgorIyAoZ2hhemlAbm9jLnJ1dGdlcnMuZWR1IDE5OTQtMDgtMjQpCitpZiAodGVzdCAtZiAvLmF0dGJpbi91bmFtZSkgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCVBBVEg9JFBBVEg6Ly5hdHRiaW4gOyBleHBvcnQgUEFUSAorZmkKKworVU5BTUVfTUFDSElORT1gKHVuYW1lIC1tKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfTUFDSElORT11bmtub3duCitVTkFNRV9SRUxFQVNFPWAodW5hbWUgLXIpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9SRUxFQVNFPXVua25vd24KK1VOQU1FX1NZU1RFTT1gKHVuYW1lIC1zKSAyPi9kZXYvbnVsbGAgIHx8IFVOQU1FX1NZU1RFTT11bmtub3duCitVTkFNRV9WRVJTSU9OPWAodW5hbWUgLXYpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9WRVJTSU9OPXVua25vd24KKworIyBOb3RlOiBvcmRlciBpcyBzaWduaWZpY2FudCAtIHRoZSBjYXNlIGJyYW5jaGVzIGFyZSBub3QgZXhjbHVzaXZlLgorCitjYXNlICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIGluCisgICAgKjpOZXRCU0Q6KjoqKQorCSMgTmV0QlNEIChuYnNkKSB0YXJnZXRzIHNob3VsZCAod2hlcmUgYXBwbGljYWJsZSkgbWF0Y2ggb25lIG9yCisJIyBtb3JlIG9mIHRoZSB0dXBwbGVzOiAqLSotbmV0YnNkZWxmKiwgKi0qLW5ldGJzZGFvdXQqLAorCSMgKi0qLW5ldGJzZGVjb2ZmKiBhbmQgKi0qLW5ldGJzZCouICBGb3IgdGFyZ2V0cyB0aGF0IHJlY2VudGx5CisJIyBzd2l0Y2hlZCB0byBFTEYsICotKi1uZXRic2QqIHdvdWxkIHNlbGVjdCB0aGUgb2xkCisJIyBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGlzIHByb3ZpZGVzIGJvdGggZm9yd2FyZAorCSMgY29tcGF0aWJpbGl0eSBhbmQgYSBjb25zaXN0ZW50IG1lY2hhbmlzbSBmb3Igc2VsZWN0aW5nIHRoZQorCSMgb2JqZWN0IGZpbGUgZm9ybWF0LgorCSMKKwkjIE5vdGU6IE5ldEJTRCBkb2Vzbid0IHBhcnRpY3VsYXJseSBjYXJlIGFib3V0IHRoZSB2ZW5kb3IKKwkjIHBvcnRpb24gb2YgdGhlIG5hbWUuICBXZSBhbHdheXMgc2V0IGl0IHRvICJ1bmtub3duIi4KKwlzeXNjdGw9InN5c2N0bCAtbiBody5tYWNoaW5lX2FyY2giCisJVU5BTUVfTUFDSElORV9BUkNIPWAoL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBcCisJICAgIC91c3Ivc2Jpbi8kc3lzY3RsIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bilgCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgorCSAgICBhcm1lYikgbWFjaGluZT1hcm1lYi11bmtub3duIDs7CisJICAgIGFybSopIG1hY2hpbmU9YXJtLXVua25vd24gOzsKKwkgICAgc2gzZWwpIG1hY2hpbmU9c2hsLXVua25vd24gOzsKKwkgICAgc2gzZWIpIG1hY2hpbmU9c2gtdW5rbm93biA7OworCSAgICAqKSBtYWNoaW5lPSR7VU5BTUVfTUFDSElORV9BUkNIfS11bmtub3duIDs7CisJZXNhYworCSMgVGhlIE9wZXJhdGluZyBTeXN0ZW0gaW5jbHVkaW5nIG9iamVjdCBmb3JtYXQsIGlmIGl0IGhhcyBzd2l0Y2hlZAorCSMgdG8gRUxGIHJlY2VudGx5LCBvciB3aWxsIGluIHRoZSBmdXR1cmUuCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgorCSAgICBhcm0qfGkzODZ8bTY4a3xuczMya3xzaDMqfHNwYXJjfHZheCkKKwkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQlpZiBlY2hvIF9fRUxGX18gfCAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwgXAorCQkJfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbAorCQl0aGVuCisJCSAgICAjIE9uY2UgYWxsIHV0aWxpdGllcyBjYW4gYmUgRUNPRkYgKG5ldGJzZGVjb2ZmKSBvciBhLm91dCAobmV0YnNkYW91dCkuCisJCSAgICAjIFJldHVybiBuZXRic2QgZm9yIGVpdGhlci4gIEZJWD8KKwkJICAgIG9zPW5ldGJzZAorCQllbHNlCisJCSAgICBvcz1uZXRic2RlbGYKKwkJZmkKKwkJOzsKKwkgICAgKikKKwkgICAgICAgIG9zPW5ldGJzZAorCQk7OworCWVzYWMKKwkjIFRoZSBPUyByZWxlYXNlCisJIyBEZWJpYW4gR05VL05ldEJTRCBtYWNoaW5lcyBoYXZlIGEgZGlmZmVyZW50IHVzZXJsYW5kLCBhbmQKKwkjIHRodXMsIG5lZWQgYSBkaXN0aW5jdCB0cmlwbGV0LiBIb3dldmVyLCB0aGV5IGRvIG5vdCBuZWVkCisJIyBrZXJuZWwgdmVyc2lvbiBpbmZvcm1hdGlvbiwgc28gaXQgY2FuIGJlIHJlcGxhY2VkIHdpdGggYQorCSMgc3VpdGFibGUgdGFnLCBpbiB0aGUgc3R5bGUgb2YgbGludXgtZ251LgorCWNhc2UgIiR7VU5BTUVfVkVSU0lPTn0iIGluCisJICAgIERlYmlhbiopCisJCXJlbGVhc2U9Jy1nbnUnCisJCTs7CisJICAgICopCisJCXJlbGVhc2U9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCisJCTs7CisJZXNhYworCSMgU2luY2UgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNOgorCSMgY29udGFpbnMgcmVkdW5kYW50IGluZm9ybWF0aW9uLCB0aGUgc2hvcnRlciBmb3JtOgorCSMgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0gaXMgdXNlZC4KKwllY2hvICIke21hY2hpbmV9LSR7b3N9JHtyZWxlYXNlfSIKKwlleGl0IDs7CisgICAgKjpPcGVuQlNEOio6KikKKwlVTkFNRV9NQUNISU5FX0FSQ0g9YGFyY2ggfCBzZWQgJ3MvT3BlbkJTRC4vLydgCisJZWNobyAke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOmVra29CU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWVra29ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6U29saWRCU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXNvbGlkYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtYWNwcGM6TWlyQlNEOio6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1taXJic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6TWlyQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1taXJic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGFscGhhOk9TRjE6KjoqKQorCWNhc2UgJFVOQU1FX1JFTEVBU0UgaW4KKwkqNC4wKQorCQlVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkM30nYAorCQk7OworCSo1LiopCisJICAgICAgICBVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkNH0nYAorCQk7OworCWVzYWMKKwkjIEFjY29yZGluZyB0byBDb21wYXEsIC91c3Ivc2Jpbi9wc3JpbmZvIGhhcyBiZWVuIGF2YWlsYWJsZSBvbgorCSMgT1NGLzEgYW5kIFRydTY0IHN5c3RlbXMgcHJvZHVjZWQgc2luY2UgMTk5NS4gIEkgaG9wZSB0aGF0CisJIyBjb3ZlcnMgbW9zdCBzeXN0ZW1zIHJ1bm5pbmcgdG9kYXkuICBUaGlzIGNvZGUgcGlwZXMgdGhlIENQVQorCSMgdHlwZXMgdGhyb3VnaCBoZWFkIC1uIDEsIHNvIHdlIG9ubHkgZGV0ZWN0IHRoZSB0eXBlIG9mIENQVSAwLgorCUFMUEhBX0NQVV9UWVBFPWAvdXNyL3NiaW4vcHNyaW5mbyAtdiB8IHNlZCAtbiAtZSAncy9eICBUaGUgYWxwaGEgXCguKlwpIHByb2Nlc3Nvci4qJC9cMS9wJyB8IGhlYWQgLW4gMWAKKwljYXNlICIkQUxQSEFfQ1BVX1RZUEUiIGluCisJICAgICJFVjQgKDIxMDY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiRVY0LjUgKDIxMDY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiTENBNCAoMjEwNjYvMjEwNjgpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7CisJICAgICJFVjUgKDIxMTY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1IiA7OworCSAgICAiRVY1LjYgKDIxMTY0QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NTYiIDs7CisJICAgICJFVjUuNiAoMjExNjRQQykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU2IiA7OworCSAgICAiRVY1LjcgKDIxMTY0UEMpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NyIgOzsKKwkgICAgIkVWNiAoMjEyNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjYiIDs7CisJICAgICJFVjYuNyAoMjEyNjRBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2NyIgOzsKKwkgICAgIkVWNi44Q0IgKDIxMjY0QykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7CisJICAgICJFVjYuOEFMICgyMTI2NEIpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OworCSAgICAiRVY2LjhDWCAoMjEyNjREKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKKwkgICAgIkVWNi45QSAoMjEyNjQvRVY2OUEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY5IiA7OworCSAgICAiRVY3ICgyMTM2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NyIgOzsKKwkgICAgIkVWNy45ICgyMTM2NEEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjc5IiA7OworCWVzYWMKKwkjIEEgUG4ubiB2ZXJzaW9uIGlzIGEgcGF0Y2hlZCB2ZXJzaW9uLgorCSMgQSBWbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCB2ZXJzaW9uLgorCSMgQSBUbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCBmaWVsZCB0ZXN0IHZlcnNpb24uCisJIyBBIFhuLm4gdmVyc2lvbiBpcyBhbiB1bnJlbGVhc2VkIGV4cGVyaW1lbnRhbCBiYXNlbGV2ZWwuCisJIyAxLjIgdXNlcyAiMS4yIiBmb3IgdW5hbWUgLXIuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1vc2ZgZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL15bUFZUWF0vLycgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisJZXhpdCA7OworICAgIEFscGhhXCAqOldpbmRvd3NfTlQqOiopCisJIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgUE9TSVggc3Vic3lzdGVtPworCSMgU2hvdWxkIHdlIGNoYW5nZSBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZAorCSMgb2YgdGhlIHNwZWNpZmljIEFscGhhIG1vZGVsPworCWVjaG8gYWxwaGEtcGMtaW50ZXJpeAorCWV4aXQgOzsKKyAgICAyMTA2NDpXaW5kb3dzX05UOjUwOjMpCisJZWNobyBhbHBoYS1kZWMtd2lubnQzLjUKKwlleGl0IDs7CisgICAgQW1pZ2EqOlVOSVhfU3lzdGVtX1Y6NC4wOiopCisJZWNobyBtNjhrLXVua25vd24tc3lzdjQKKwlleGl0IDs7CisgICAgKjpbQWFdbWlnYVtPb11bU3NdOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hbWlnYW9zCisJZXhpdCA7OworICAgICo6W01tXW9ycGhbT29dW1NzXToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbW9ycGhvcworCWV4aXQgOzsKKyAgICAqOk9TLzM5MDoqOiopCisJZWNobyBpMzcwLWlibS1vcGVuZWRpdGlvbgorCWV4aXQgOzsKKyAgICAqOnovVk06KjoqKQorCWVjaG8gczM5MC1pYm0tenZtb2UKKwlleGl0IDs7CisgICAgKjpPUzQwMDoqOiopCisgICAgICAgIGVjaG8gcG93ZXJwYy1pYm0tb3M0MDAKKwlleGl0IDs7CisgICAgYXJtOlJJU0MqOjEuWzAxMl0qOip8YXJtOnJpc2NpeDoxLlswMTJdKjoqKQorCWVjaG8gYXJtLWFjb3JuLXJpc2NpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgYXJtOnJpc2NvczoqOip8YXJtOlJJU0NPUzoqOiopCisJZWNobyBhcm0tdW5rbm93bi1yaXNjb3MKKwlleGl0IDs7CisgICAgU1IyPzAxOkhJLVVYL01QUDoqOiogfCBTUjgwMDA6SEktVVgvTVBQOio6KikKKwllY2hvIGhwcGExLjEtaGl0YWNoaS1oaXV4bXBwCisJZXhpdCA7OworICAgIFB5cmFtaWQqOk9TeCo6KjoqIHwgTUlTKjpPU3gqOio6KiB8IE1JUyo6U01QX0RDLU9TeCo6KjoqKQorCSMgYWtlZUB3cGRpczAzLndwYWZiLmFmLm1pbCAoRWFybGUgRi4gQWtlKSBjb250cmlidXRlZCBNSVMgYW5kIE5JTEUuCisJaWYgdGVzdCAiYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAiID0gYXR0IDsgdGhlbgorCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zeXN2MworCWVsc2UKKwkJZWNobyBweXJhbWlkLXB5cmFtaWQtYnNkCisJZmkKKwlleGl0IDs7CisgICAgTklMRSo6KjoqOmRjb3N4KQorCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN2cjQKKwlleGl0IDs7CisgICAgRFJTPzYwMDA6dW5peDo0LjA6NiopCisJZWNobyBzcGFyYy1pY2wtbng2CisJZXhpdCA7OworICAgIERSUz82MDAwOlVOSVhfU1Y6NC4yKjo3KiB8IERSUz82MDAwOmlzaXM6NC4yKjo3KikKKwljYXNlIGAvdXNyL2Jpbi91bmFtZSAtcGAgaW4KKwkgICAgc3BhcmMpIGVjaG8gc3BhcmMtaWNsLW54NzsgZXhpdCA7OworCWVzYWMgOzsKKyAgICBzdW40SDpTdW5PUzo1Lio6KikKKwllY2hvIHNwYXJjLWhhbC1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40KjpTdW5PUzo1Lio6KiB8IHRhZHBvbGUqOlN1bk9TOjUuKjoqKQorCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIGk4NnBjOlN1bk9TOjUuKjoqKQorCWVjaG8gaTM4Ni1wYy1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40KjpTdW5PUzo2KjoqKQorCSMgQWNjb3JkaW5nIHRvIGNvbmZpZy5zdWIsIHRoaXMgaXMgdGhlIHByb3BlciB3YXkgdG8gY2Fub25pY2FsaXplCisJIyBTdW5PUzYuICBIYXJkIHRvIGd1ZXNzIGV4YWN0bHkgd2hhdCBTdW5PUzYgd2lsbCBiZSBsaWtlLCBidXQKKwkjIGl0J3MgbGlrZWx5IHRvIGJlIG1vcmUgbGlrZSBTb2xhcmlzIHRoYW4gU3VuT1M0LgorCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMzYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIHN1bjQqOlN1bk9TOio6KikKKwljYXNlICJgL3Vzci9iaW4vYXJjaCAta2AiIGluCisJICAgIFNlcmllcyp8UzQqKQorCQlVTkFNRV9SRUxFQVNFPWB1bmFtZSAtdmAKKwkJOzsKKwllc2FjCisJIyBKYXBhbmVzZSBMYW5ndWFnZSB2ZXJzaW9ucyBoYXZlIGEgdmVyc2lvbiBudW1iZXIgbGlrZSBgNC4xLjMtSkwnLgorCWVjaG8gc3BhcmMtc3VuLXN1bm9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fLydgCisJZXhpdCA7OworICAgIHN1bjMqOlN1bk9TOio6KikKKwllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBzdW4qOio6NC4yQlNEOiopCisJVU5BTUVfUkVMRUFTRT1gKHNlZCAxcSAvZXRjL21vdGQgfCBhd2sgJ3twcmludCBzdWJzdHIoJDUsMSwzKX0nKSAyPi9kZXYvbnVsbGAKKwl0ZXN0ICJ4JHtVTkFNRV9SRUxFQVNFfSIgPSAieCIgJiYgVU5BTUVfUkVMRUFTRT0zCisJY2FzZSAiYC9iaW4vYXJjaGAiIGluCisJICAgIHN1bjMpCisJCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJCTs7CisJICAgIHN1bjQpCisJCWVjaG8gc3BhcmMtc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCQk7OworCWVzYWMKKwlleGl0IDs7CisgICAgYXVzaHA6U3VuT1M6KjoqKQorCWVjaG8gc3BhcmMtYXVzcGV4LXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAjIFRoZSBzaXR1YXRpb24gZm9yIE1pTlQgaXMgYSBsaXR0bGUgY29uZnVzaW5nLiAgVGhlIG1hY2hpbmUgbmFtZQorICAgICMgY2FuIGJlIHZpcnR1YWxseSBldmVyeXRoaW5nIChldmVyeXRoaW5nIHdoaWNoIGlzIG5vdAorICAgICMgImF0YXJpc3QiIG9yICJhdGFyaXN0ZSIgYXQgbGVhc3Qgc2hvdWxkIGhhdmUgYSBwcm9jZXNzb3IKKyAgICAjID4gbTY4MDAwKS4gIFRoZSBzeXN0ZW0gbmFtZSByYW5nZXMgZnJvbSAiTWlOVCIgb3ZlciAiRnJlZU1pTlQiCisgICAgIyB0byB0aGUgbG93ZXJjYXNlIHZlcnNpb24gIm1pbnQiIChvciAiZnJlZW1pbnQiKS4gIEZpbmFsbHkKKyAgICAjIHRoZSBzeXN0ZW0gbmFtZSAiVE9TIiBkZW5vdGVzIGEgc3lzdGVtIHdoaWNoIGlzIGFjdHVhbGx5IG5vdAorICAgICMgTWlOVC4gIEJ1dCBNaU5UIGlzIGRvd253YXJkIGNvbXBhdGlibGUgdG8gVE9TLCBzbyB0aGlzIHNob3VsZAorICAgICMgYmUgbm8gcHJvYmxlbS4KKyAgICBhdGFyaXN0W2VdOipNaU5UOio6KiB8IGF0YXJpc3RbZV06Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGF0YXJpKjoqTWlOVDoqOiogfCBhdGFyaSo6Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKKwllY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCA7OworICAgICpmYWxjb24qOipNaU5UOio6KiB8ICpmYWxjb24qOiptaW50Oio6KiB8ICpmYWxjb24qOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWlsYW4qOipNaU5UOio6KiB8IG1pbGFuKjoqbWludDoqOiogfCAqbWlsYW4qOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstbWlsYW4tbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCA7OworICAgIGhhZGVzKjoqTWlOVDoqOiogfCBoYWRlcyo6Km1pbnQ6KjoqIHwgKmhhZGVzKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLWhhZGVzLW1pbnQke1VOQU1FX1JFTEVBU0V9CisgICAgICAgIGV4aXQgOzsKKyAgICAqOipNaU5UOio6KiB8ICo6Km1pbnQ6KjoqIHwgKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLXVua25vd24tbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCA7OworICAgIG02OGs6bWFjaHRlbjoqOiopCisJZWNobyBtNjhrLWFwcGxlLW1hY2h0ZW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIHBvd2VycGM6bWFjaHRlbjoqOiopCisJZWNobyBwb3dlcnBjLWFwcGxlLW1hY2h0ZW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFJJU0MqOk1hY2g6KjoqKQorCWVjaG8gbWlwcy1kZWMtbWFjaF9ic2Q0LjMKKwlleGl0IDs7CisgICAgUklTQyo6VUxUUklYOio6KikKKwllY2hvIG1pcHMtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgVkFYKjpVTFRSSVgqOio6KikKKwllY2hvIHZheC1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAyMDIwOkNMSVg6KjoqIHwgMjQzMDpDTElYOio6KikKKwllY2hvIGNsaXBwZXItaW50ZXJncmFwaC1jbGl4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtaXBzOio6KjpVTUlQUyB8IG1pcHM6KjoqOlJJU0NvcykKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKyNpZmRlZiBfX2NwbHVzcGx1cworI2luY2x1ZGUgPHN0ZGlvLmg+ICAvKiBmb3IgcHJpbnRmKCkgcHJvdG90eXBlICovCisJaW50IG1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKyNlbHNlCisJaW50IG1haW4gKGFyZ2MsIGFyZ3YpIGludCBhcmdjOyBjaGFyICphcmd2W107IHsKKyNlbmRpZgorCSNpZiBkZWZpbmVkIChob3N0X21pcHMpICYmIGRlZmluZWQgKE1JUFNFQikKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TWVNWKQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3lzdlxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NWUjQpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzdnI0XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfQlNENDMpIHx8IGRlZmluZWQoU1lTVFlQRV9CU0QpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNic2RcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjZW5kaWYKKwkgIGV4aXQgKC0xKTsKKwl9CitFT0YKKwkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJgorCSAgZHVtbXlhcmc9YGVjaG8gIiR7VU5BTUVfUkVMRUFTRX0iIHwgc2VkIC1uICdzL1woWzAtOV0qXCkuKi9cMS9wJ2AgJiYKKwkgIFNZU1RFTV9OQU1FPWAkZHVtbXkgJGR1bW15YXJnYCAmJgorCSAgICB7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KKwllY2hvIG1pcHMtbWlwcy1yaXNjb3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIE1vdG9yb2xhOlBvd2VyTUFYX09TOio6KikKKwllY2hvIHBvd2VycGMtbW90b3JvbGEtcG93ZXJtYXgKKwlleGl0IDs7CisgICAgTW90b3JvbGE6Kjo0LjM6UEw4LSopCisJZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcm1heAorCWV4aXQgOzsKKyAgICBOaWdodF9IYXdrOio6KjpQb3dlck1BWF9PUyB8IFN5bmVyZ3k6UG93ZXJNQVhfT1M6KjoqKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKKwlleGl0IDs7CisgICAgTmlnaHRfSGF3azpQb3dlcl9VTklYOio6KikKKwllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VydW5peAorCWV4aXQgOzsKKyAgICBtODhrOkNYL1VYOjcqOiopCisJZWNobyBtODhrLWhhcnJpcy1jeHV4NworCWV4aXQgOzsKKyAgICBtODhrOio6NCo6UjQqKQorCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2NAorCWV4aXQgOzsKKyAgICBtODhrOio6Myo6UjMqKQorCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MworCWV4aXQgOzsKKyAgICBBVmlpT046ZGd1eDoqOiopCisgICAgICAgICMgREcvVVggcmV0dXJucyBBVmlpT04gZm9yIGFsbCBhcmNoaXRlY3R1cmVzCisgICAgICAgIFVOQU1FX1BST0NFU1NPUj1gL3Vzci9iaW4vdW5hbWUgLXBgCisJaWYgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODEwMCBdIHx8IFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMTAgXQorCXRoZW4KKwkgICAgaWYgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSBtODhrZGd1eGVsZnggXSB8fCBcCisJICAgICAgIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0geCBdCisJICAgIHRoZW4KKwkJZWNobyBtODhrLWRnLWRndXgke1VOQU1FX1JFTEVBU0V9CisJICAgIGVsc2UKKwkJZWNobyBtODhrLWRnLWRndXhiY3Mke1VOQU1FX1JFTEVBU0V9CisJICAgIGZpCisJZWxzZQorCSAgICBlY2hvIGk1ODYtZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KKwlmaQorIAlleGl0IDs7CisgICAgTTg4KjpEb2xwaGluT1M6KjoqKQkjIERvbHBoaW5PUyAoU1ZSMykKKwllY2hvIG04OGstZG9scGhpbi1zeXN2MworCWV4aXQgOzsKKyAgICBNODgqOio6UjMqOiopCisJIyBEZWx0YSA4OGsgc3lzdGVtIHJ1bm5pbmcgU1ZSMworCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MworCWV4aXQgOzsKKyAgICBYRDg4KjoqOio6KikgIyBUZWt0cm9uaXggWEQ4OCBzeXN0ZW0gcnVubmluZyBVVGVrViAoU1ZSMykKKwllY2hvIG04OGstdGVrdHJvbml4LXN5c3YzCisJZXhpdCA7OworICAgIFRlazQzWzAtOV1bMC05XTpVVGVrOio6KikgIyBUZWt0cm9uaXggNDMwMCBzeXN0ZW0gcnVubmluZyBVVGVrIChCU0QpCisJZWNobyBtNjhrLXRla3Ryb25peC1ic2QKKwlleGl0IDs7CisgICAgKjpJUklYKjoqOiopCisJZWNobyBtaXBzLXNnaS1pcml4YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fL2cnYAorCWV4aXQgOzsKKyAgICA/Pz8/Pz8/PzpBSVg/OlsxMl0uMToyKSAgICMgQUlYIDIuMi4xIG9yIEFJWCAyLjEuMSBpcyBSVC9QQyBBSVguCisJZWNobyByb21wLWlibS1haXggICAgICMgdW5hbWUgLW0gZ2l2ZXMgYW4gOCBoZXgtY29kZSBDUFUgaWQKKwlleGl0IDs7ICAgICAgICAgICAgICAgIyBOb3RlIHRoYXQ6IGVjaG8gIidgdW5hbWUgLXNgJyIgZ2l2ZXMgJ0FJWCAnCisgICAgaSo4NjpBSVg6KjoqKQorCWVjaG8gaTM4Ni1pYm0tYWl4CisJZXhpdCA7OworICAgIGlhNjQ6QUlYOio6KikKKwlpZiBbIC14IC91c3IvYmluL29zbGV2ZWwgXSA7IHRoZW4KKwkJSUJNX1JFVj1gL3Vzci9iaW4vb3NsZXZlbGAKKwllbHNlCisJCUlCTV9SRVY9JHtVTkFNRV9WRVJTSU9OfS4ke1VOQU1FX1JFTEVBU0V9CisJZmkKKwllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWFpeCR7SUJNX1JFVn0KKwlleGl0IDs7CisgICAgKjpBSVg6MjozKQorCWlmIGdyZXAgYm9zMzI1IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJCXNlZCAncy9eCQkvLycgPDwgRU9GID4kZHVtbXkuYworCQkjaW5jbHVkZSA8c3lzL3N5c3RlbWNmZy5oPgorCisJCW1haW4oKQorCQkJeworCQkJaWYgKCFfX3Bvd2VyX3BjKCkpCisJCQkJZXhpdCgxKTsKKwkJCXB1dHMoInBvd2VycGMtaWJtLWFpeDMuMi41Iik7CisJCQlleGl0KDApOworCQkJfQorRU9GCisJCWlmICRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmIFNZU1RFTV9OQU1FPWAkZHVtbXlgCisJCXRoZW4KKwkJCWVjaG8gIiRTWVNURU1fTkFNRSIKKwkJZWxzZQorCQkJZWNobyByczYwMDAtaWJtLWFpeDMuMi41CisJCWZpCisJZWxpZiBncmVwIGJvczMyNCAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJZWNobyByczYwMDAtaWJtLWFpeDMuMi40CisJZWxzZQorCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yCisJZmkKKwlleGl0IDs7CisgICAgKjpBSVg6KjpbNDVdKQorCUlCTV9DUFVfSUQ9YC91c3Ivc2Jpbi9sc2RldiAtQyAtYyBwcm9jZXNzb3IgLVMgYXZhaWxhYmxlIHwgc2VkIDFxIHwgYXdrICd7IHByaW50ICQxIH0nYAorCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVsICR7SUJNX0NQVV9JRH0gfCBncmVwICcgUE9XRVInID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlJQk1fQVJDSD1yczYwMDAKKwllbHNlCisJCUlCTV9BUkNIPXBvd2VycGMKKwlmaQorCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgorCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAorCWVsc2UKKwkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorCWVjaG8gJHtJQk1fQVJDSH0taWJtLWFpeCR7SUJNX1JFVn0KKwlleGl0IDs7CisgICAgKjpBSVg6KjoqKQorCWVjaG8gcnM2MDAwLWlibS1haXgKKwlleGl0IDs7CisgICAgaWJtcnQ6NC40QlNEOip8cm9tcC1pYm06QlNEOiopCisJZWNobyByb21wLWlibS1ic2Q0LjQKKwlleGl0IDs7CisgICAgaWJtcnQ6KkJTRDoqfHJvbXAtaWJtOkJTRDoqKSAgICAgICAgICAgICMgY292ZXJzIFJUL1BDIEJTRCBhbmQKKwllY2hvIHJvbXAtaWJtLWJzZCR7VU5BTUVfUkVMRUFTRX0gICAjIDQuMyB3aXRoIHVuYW1lIGFkZGVkIHRvCisJZXhpdCA7OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBvcnQ6IHJvbXAtaWJtIEJTRCA0LjMKKyAgICAqOkJPU1g6KjoqKQorCWVjaG8gcnM2MDAwLWJ1bGwtYm9zeAorCWV4aXQgOzsKKyAgICBEUFgvMj8wMDpCLk8uUy46KjoqKQorCWVjaG8gbTY4ay1idWxsLXN5c3YzCisJZXhpdCA7OworICAgIDkwMDAvWzM0XT8/OjQuM2JzZDoxLio6KikKKwllY2hvIG02OGstaHAtYnNkCisJZXhpdCA7OworICAgIGhwMzAwOjQuNEJTRDoqOiogfCA5MDAwL1szNF0/Pzo0LjNic2Q6Mi4qOiopCisJZWNobyBtNjhrLWhwLWJzZDQuNAorCWV4aXQgOzsKKyAgICA5MDAwL1szNDY3OF0/PzpIUC1VWDoqOiopCisJSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KKwkgICAgOTAwMC8zMT8gKSAgICAgICAgICAgIEhQX0FSQ0g9bTY4MDAwIDs7CisJICAgIDkwMDAvWzM0XT8/ICkgICAgICAgICBIUF9BUkNIPW02OGsgOzsKKwkgICAgOTAwMC9bNjc4XVswLTldWzAtOV0pCisJCWlmIFsgLXggL3Vzci9iaW4vZ2V0Y29uZiBdOyB0aGVuCisJCSAgICBzY19jcHVfdmVyc2lvbj1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19DUFVfVkVSU0lPTiAyPi9kZXYvbnVsbGAKKyAgICAgICAgICAgICAgICAgICAgc2Nfa2VybmVsX2JpdHM9YC91c3IvYmluL2dldGNvbmYgU0NfS0VSTkVMX0JJVFMgMj4vZGV2L251bGxgCisgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7c2NfY3B1X3ZlcnNpb259IiBpbgorICAgICAgICAgICAgICAgICAgICAgIDUyMykgSFBfQVJDSD0iaHBwYTEuMCIgOzsgIyBDUFVfUEFfUklTQzFfMAorICAgICAgICAgICAgICAgICAgICAgIDUyOCkgSFBfQVJDSD0iaHBwYTEuMSIgOzsgIyBDUFVfUEFfUklTQzFfMQorICAgICAgICAgICAgICAgICAgICAgIDUzMikgICAgICAgICAgICAgICAgICAgICAgIyBDUFVfUEFfUklTQzJfMAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtzY19rZXJuZWxfYml0c30iIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgIDMyKSBIUF9BUkNIPSJocHBhMi4wbiIgOzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgNjQpIEhQX0FSQ0g9ImhwcGEyLjB3IiA7OworCQkJICAnJykgSFBfQVJDSD0iaHBwYTIuMCIgOzsgICAjIEhQLVVYIDEwLjIwCisgICAgICAgICAgICAgICAgICAgICAgICBlc2FjIDs7CisgICAgICAgICAgICAgICAgICAgIGVzYWMKKwkJZmkKKwkJaWYgWyAiJHtIUF9BUkNIfSIgPSAiIiBdOyB0aGVuCisJCSAgICBldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJCSAgICBzZWQgJ3MvXiAgICAgICAgICAgICAgLy8nIDw8IEVPRiA+JGR1bW15LmMKKworICAgICAgICAgICAgICAjZGVmaW5lIF9IUFVYX1NPVVJDRQorICAgICAgICAgICAgICAjaW5jbHVkZSA8c3RkbGliLmg+CisgICAgICAgICAgICAgICNpbmNsdWRlIDx1bmlzdGQuaD4KKworICAgICAgICAgICAgICBpbnQgbWFpbiAoKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKKyAgICAgICAgICAgICAgICAgIGxvbmcgYml0cyA9IHN5c2NvbmYoX1NDX0tFUk5FTF9CSVRTKTsKKyAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICBsb25nIGNwdSAgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOworCisgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNwdSkKKyAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOworICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEiKTsgYnJlYWs7CisgICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMl8wOgorICAgICAgICAgICAgICAjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCisgICAgICAgICAgICAgIAkgICAgc3dpdGNoIChiaXRzKQorICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgCQljYXNlIDY0OiBwdXRzICgiaHBwYTIuMHciKTsgYnJlYWs7CisgICAgICAgICAgICAgIAkJY2FzZSAzMjogcHV0cyAoImhwcGEyLjBuIik7IGJyZWFrOworICAgICAgICAgICAgICAJCWRlZmF1bHQ6IHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOworICAgICAgICAgICAgICAJCX0gYnJlYWs7CisgICAgICAgICAgICAgICNlbHNlICAvKiAhZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpICovCisgICAgICAgICAgICAgIAkgICAgcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7CisgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAJZGVmYXVsdDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7CisgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICBleGl0ICgwKTsKKyAgICAgICAgICAgICAgfQorRU9GCisJCSAgICAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAyPi9kZXYvbnVsbCkgJiYgSFBfQVJDSD1gJGR1bW15YAorCQkgICAgdGVzdCAteiAiJEhQX0FSQ0giICYmIEhQX0FSQ0g9aHBwYQorCQlmaSA7OworCWVzYWMKKwlpZiBbICR7SFBfQVJDSH0gPSAiaHBwYTIuMHciIF0KKwl0aGVuCisJICAgIGV2YWwgJHNldF9jY19mb3JfYnVpbGQKKworCSAgICAjIGhwcGEyLjB3LWhwLWhwdXgqIGhhcyBhIDY0LWJpdCBrZXJuZWwgYW5kIGEgY29tcGlsZXIgZ2VuZXJhdGluZworCSAgICAjIDMyLWJpdCBjb2RlLiAgaHBwYTY0LWhwLWhwdXgqIGhhcyB0aGUgc2FtZSBrZXJuZWwgYW5kIGEgY29tcGlsZXIKKwkgICAgIyBnZW5lcmF0aW5nIDY0LWJpdCBjb2RlLiAgR05VIGFuZCBIUCB1c2UgZGlmZmVyZW50IG5vbWVuY2xhdHVyZToKKwkgICAgIworCSAgICAjICQgQ0NfRk9SX0JVSUxEPWNjIC4vY29uZmlnLmd1ZXNzCisJICAgICMgPT4gaHBwYTIuMHctaHAtaHB1eDExLjIzCisJICAgICMgJCBDQ19GT1JfQlVJTEQ9ImNjICtEQTIuMHciIC4vY29uZmlnLmd1ZXNzCisJICAgICMgPT4gaHBwYTY0LWhwLWhwdXgxMS4yMworCisJICAgIGlmIGVjaG8gX19MUDY0X18gfCAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwpIHwKKwkJZ3JlcCBfX0xQNjRfXyA+L2Rldi9udWxsCisJICAgIHRoZW4KKwkJSFBfQVJDSD0iaHBwYTIuMHciCisJICAgIGVsc2UKKwkJSFBfQVJDSD0iaHBwYTY0IgorCSAgICBmaQorCWZpCisJZWNobyAke0hQX0FSQ0h9LWhwLWhwdXgke0hQVVhfUkVWfQorCWV4aXQgOzsKKyAgICBpYTY0OkhQLVVYOio6KikKKwlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKKwllY2hvIGlhNjQtaHAtaHB1eCR7SFBVWF9SRVZ9CisJZXhpdCA7OworICAgIDMwNTAqOkhJLVVYOio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkjaW5jbHVkZSA8dW5pc3RkLmg+CisJaW50CisJbWFpbiAoKQorCXsKKwkgIGxvbmcgY3B1ID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKKwkgIC8qIFRoZSBvcmRlciBtYXR0ZXJzLCBiZWNhdXNlIENQVV9JU19IUF9NQzY4SyBlcnJvbmVvdXNseSByZXR1cm5zCisJICAgICB0cnVlIGZvciBDUFVfUEFfUklTQzFfMC4gIENQVV9JU19QQV9SSVNDIHJldHVybnMgY29ycmVjdAorCSAgICAgcmVzdWx0cywgaG93ZXZlci4gICovCisJICBpZiAoQ1BVX0lTX1BBX1JJU0MgKGNwdSkpCisJICAgIHsKKwkgICAgICBzd2l0Y2ggKGNwdSkKKwkJeworCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBjYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgY2FzZSBDUFVfUEFfUklTQzJfMDogcHV0cyAoImhwcGEyLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGRlZmF1bHQ6IHB1dHMgKCJocHBhLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJfQorCSAgICB9CisJICBlbHNlIGlmIChDUFVfSVNfSFBfTUM2OEsgKGNwdSkpCisJICAgIHB1dHMgKCJtNjhrLWhpdGFjaGktaGl1eHdlMiIpOworCSAgZWxzZSBwdXRzICgidW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIiKTsKKwkgIGV4aXQgKDApOworCX0KK0VPRgorCSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmIFNZU1RFTV9OQU1FPWAkZHVtbXlgICYmCisJCXsgZWNobyAiJFNZU1RFTV9OQU1FIjsgZXhpdDsgfQorCWVjaG8gdW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIKKwlleGl0IDs7CisgICAgOTAwMC83Pz86NC4zYnNkOio6KiB8IDkwMDAvOD9bNzldOjQuM2JzZDoqOiogKQorCWVjaG8gaHBwYTEuMS1ocC1ic2QKKwlleGl0IDs7CisgICAgOTAwMC84Pz86NC4zYnNkOio6KikKKwllY2hvIGhwcGExLjAtaHAtYnNkCisJZXhpdCA7OworICAgICo5Pz8qOk1QRS9pWDoqOiogfCAqMzAwMCo6TVBFL2lYOio6KikKKwllY2hvIGhwcGExLjAtaHAtbXBlaXgKKwlleGl0IDs7CisgICAgaHA3Pz86T1NGMToqOiogfCBocDg/Wzc5XTpPU0YxOio6KiApCisJZWNobyBocHBhMS4xLWhwLW9zZgorCWV4aXQgOzsKKyAgICBocDg/PzpPU0YxOio6KikKKwllY2hvIGhwcGExLjAtaHAtb3NmCisJZXhpdCA7OworICAgIGkqODY6T1NGMToqOiopCisJaWYgWyAteCAvdXNyL3NiaW4vc3lzdmVyc2lvbiBdIDsgdGhlbgorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxbWsKKwllbHNlCisJICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjEKKwlmaQorCWV4aXQgOzsKKyAgICBwYXJpc2MqOkxpdGVzKjoqOiopCisJZWNobyBocHBhMS4xLWhwLWxpdGVzCisJZXhpdCA7OworICAgIEMxKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzEqOiopCisJZWNobyBjMS1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgOzsKKyAgICBDMio6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMyKjoqKQorCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYworCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAorCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCisJZmkKKyAgICAgICAgZXhpdCA7OworICAgIEMzNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzNCo6KikKKwllY2hvIGMzNC1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgOzsKKyAgICBDMzgqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzgqOiopCisJZWNobyBjMzgtY29udmV4LWJzZAorICAgICAgICBleGl0IDs7CisgICAgQzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDNCo6KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCA7OworICAgIENSQVkqWS1NUDoqOio6KikKKwllY2hvIHltcC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKltBLVpdOTA6KjoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSBcCisJfCBzZWQgLWUgJ3MvQ1JBWS4qXChbQS1aXTkwXCkvXDEvJyBcCisJICAgICAgLWUgeS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8gXAorCSAgICAgIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgQ1JBWSpUUzoqOio6KikKKwllY2hvIHQ5MC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKlQzRToqOio6KikKKwllY2hvIGFscGhhZXY1LWNyYXktdW5pY29zbWske1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgQ1JBWSpTVjE6KjoqOiopCisJZWNobyBzdjEtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgKjpVTklDT1MvbXA6KjoqKQorCWVjaG8gY3JheW52LWNyYXktdW5pY29zbXAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgRjMwWzAxXTpVTklYX1N5c3RlbV9WOio6KiB8IEY3MDA6VU5JWF9TeXN0ZW1fVjoqOiopCisJRlVKSVRTVV9QUk9DPWB1bmFtZSAtbSB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgICAgICAgRlVKSVRTVV9TWVM9YHVuYW1lIC1wIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzL1wvLy8nYAorICAgICAgICBGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzLyAvXy8nYAorICAgICAgICBlY2hvICIke0ZVSklUU1VfUFJPQ30tZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgorICAgICAgICBleGl0IDs7CisgICAgNTAwMDpVTklYX1N5c3RlbV9WOjQuKjoqKQorICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCisgICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvIC9fLydgCisgICAgICAgIGVjaG8gInNwYXJjLWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKKwlleGl0IDs7CisgICAgaSo4NjpCU0QvMzg2Oio6KiB8IGkqODY6QlNEL09TOio6KiB8ICo6QXNjZW5kXCBFbWJlZGRlZC9PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWJzZGkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIHNwYXJjKjpCU0QvT1M6KjoqKQorCWVjaG8gc3BhcmMtdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOkJTRC9PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpGcmVlQlNEOio6KikKKwljYXNlICR7VU5BTUVfTUFDSElORX0gaW4KKwkgICAgcGM5OCkKKwkJZWNobyBpMzg2LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKKwkgICAgYW1kNjQpCisJCWVjaG8geDg2XzY0LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKKwkgICAgKikKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKKwllc2FjCisJZXhpdCA7OworICAgIGkqOkNZR1dJTio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtY3lnd2luCisJZXhpdCA7OworICAgIGkqOk1JTkdXKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5ndzMyCisJZXhpdCA7OworICAgIGkqOndpbmRvd3MzMio6KikKKyAgICAJIyB1bmFtZSAtbSBpbmNsdWRlcyAiLXBjIiBvbiB0aGlzIHN5c3RlbS4KKyAgICAJZWNobyAke1VOQU1FX01BQ0hJTkV9LW1pbmd3MzIKKwlleGl0IDs7CisgICAgaSo6UFcqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXB3MzIKKwlleGl0IDs7CisgICAgeDg2OkludGVyaXgqOlszNDU2XSopCisJZWNobyBpNTg2LXBjLWludGVyaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIEVNNjRUOkludGVyaXgqOlszNDU2XSopCisJZWNobyB4ODZfNjQtdW5rbm93bi1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBbMzQ1XTg2OldpbmRvd3NfOTU6KiB8IFszNDVdODY6V2luZG93c185ODoqIHwgWzM0NV04NjpXaW5kb3dzX05UOiopCisJZWNobyBpJHtVTkFNRV9NQUNISU5FfS1wYy1ta3MKKwlleGl0IDs7CisgICAgaSo6V2luZG93c19OVCo6KiB8IFBlbnRpdW0qOldpbmRvd3NfTlQqOiopCisJIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgUE9TSVggc3Vic3lzdGVtPworCSMgSXQgYWxzbyBjb25mbGljdHMgd2l0aCBwcmUtMi4wIHZlcnNpb25zIG9mIEFUJlQgVVdJTi4gU2hvdWxkIHdlCisJIyBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZCBvZiBpMzg2PworCWVjaG8gaTU4Ni1wYy1pbnRlcml4CisJZXhpdCA7OworICAgIGkqOlVXSU4qOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXV3aW4KKwlleGl0IDs7CisgICAgYW1kNjQ6Q1lHV0lOKjoqOiogfCB4ODZfNjQ6Q1lHV0lOKjoqOiopCisJZWNobyB4ODZfNjQtdW5rbm93bi1jeWd3aW4KKwlleGl0IDs7CisgICAgcCo6Q1lHV0lOKjoqKQorCWVjaG8gcG93ZXJwY2xlLXVua25vd24tY3lnd2luCisJZXhpdCA7OworICAgIHByZXAqOlN1bk9TOjUuKjoqKQorCWVjaG8gcG93ZXJwY2xlLXVua25vd24tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgKjpHTlU6KjoqKQorCSMgdGhlIEdOVSBzeXN0ZW0KKwllY2hvIGBlY2hvICR7VU5BTUVfTUFDSElORX18c2VkIC1lICdzLFstL10uKiQsLCdgLXVua25vd24tZ251YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MsLy4qJCwsJ2AKKwlleGl0IDs7CisgICAgKjpHTlUvKjoqOiopCisJIyBvdGhlciBzeXN0ZW1zIHdpdGggR05VIGxpYmMgYW5kIHVzZXJsYW5kCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYGVjaG8gJHtVTkFNRV9TWVNURU19IHwgc2VkICdzLF5bXi9dKi8sLCcgfCB0ciAnW0EtWl0nICdbYS16XSdgYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYC1nbnUKKwlleGl0IDs7CisgICAgaSo4NjpNaW5peDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbml4CisJZXhpdCA7OworICAgIGFybSo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBhdnIzMio6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBjcmlzOkxpbnV4Oio6KikKKwllY2hvIGNyaXMtYXhpcy1saW51eC1nbnUKKwlleGl0IDs7CisgICAgY3Jpc3YzMjpMaW51eDoqOiopCisJZWNobyBjcmlzdjMyLWF4aXMtbGludXgtZ251CisJZXhpdCA7OworICAgIGZydjpMaW51eDoqOiopCisgICAgCWVjaG8gZnJ2LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIGlhNjQ6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBtMzJyKjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIG02OCo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBtaXBzOkxpbnV4Oio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkjdW5kZWYgQ1BVCisJI3VuZGVmIG1pcHMKKwkjdW5kZWYgbWlwc2VsCisJI2lmIGRlZmluZWQoX19NSVBTRUxfXykgfHwgZGVmaW5lZChfX01JUFNFTCkgfHwgZGVmaW5lZChfTUlQU0VMKSB8fCBkZWZpbmVkKE1JUFNFTCkKKwlDUFU9bWlwc2VsCisJI2Vsc2UKKwkjaWYgZGVmaW5lZChfX01JUFNFQl9fKSB8fCBkZWZpbmVkKF9fTUlQU0VCKSB8fCBkZWZpbmVkKF9NSVBTRUIpIHx8IGRlZmluZWQoTUlQU0VCKQorCUNQVT1taXBzCisJI2Vsc2UKKwlDUFU9CisJI2VuZGlmCisJI2VuZGlmCitFT0YKKwlldmFsICJgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IHNlZCAtbiAnCisJICAgIC9eQ1BVL3sKKwkJczogOjpnCisJCXAKKwkgICAgfSdgIgorCXRlc3QgeCIke0NQVX0iICE9IHggJiYgeyBlY2hvICIke0NQVX0tdW5rbm93bi1saW51eC1nbnUiOyBleGl0OyB9CisJOzsKKyAgICBtaXBzNjQ6TGludXg6KjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSN1bmRlZiBDUFUKKwkjdW5kZWYgbWlwczY0CisJI3VuZGVmIG1pcHM2NGVsCisJI2lmIGRlZmluZWQoX19NSVBTRUxfXykgfHwgZGVmaW5lZChfX01JUFNFTCkgfHwgZGVmaW5lZChfTUlQU0VMKSB8fCBkZWZpbmVkKE1JUFNFTCkKKwlDUFU9bWlwczY0ZWwKKwkjZWxzZQorCSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX19NSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChNSVBTRUIpCisJQ1BVPW1pcHM2NAorCSNlbHNlCisJQ1BVPQorCSNlbmRpZgorCSNlbmRpZgorRU9GCisJZXZhbCAiYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBzZWQgLW4gJworCSAgICAvXkNQVS97CisJCXM6IDo6ZworCQlwCisJICAgIH0nYCIKKwl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIHsgZWNobyAiJHtDUFV9LXVua25vd24tbGludXgtZ251IjsgZXhpdDsgfQorCTs7CisgICAgb3IzMjpMaW51eDoqOiopCisJZWNobyBvcjMyLXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHBwYzpMaW51eDoqOiopCisJZWNobyBwb3dlcnBjLXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHBwYzY0OkxpbnV4Oio6KikKKwllY2hvIHBvd2VycGM2NC11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBhbHBoYTpMaW51eDoqOiopCisJY2FzZSBgc2VkIC1uICcvXmNwdSBtb2RlbC9zL14uKjogXCguKlwpL1wxL3AnIDwgL3Byb2MvY3B1aW5mb2AgaW4KKwkgIEVWNSkgICBVTkFNRV9NQUNISU5FPWFscGhhZXY1IDs7CisJICBFVjU2KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NTYgOzsKKwkgIFBDQTU2KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKKwkgIFBDQTU3KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKKwkgIEVWNikgICBVTkFNRV9NQUNISU5FPWFscGhhZXY2IDs7CisJICBFVjY3KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NjcgOzsKKwkgIEVWNjgqKSBVTkFNRV9NQUNISU5FPWFscGhhZXY2OCA7OworICAgICAgICBlc2FjCisJb2JqZHVtcCAtLXByaXZhdGUtaGVhZGVycyAvYmluL3NoIHwgZ3JlcCBsZC5zby4xID4vZGV2L251bGwKKwlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbiBMSUJDPSJsaWJjMSIgOyBlbHNlIExJQkM9IiIgOyBmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudSR7TElCQ30KKwlleGl0IDs7CisgICAgcGFyaXNjOkxpbnV4Oio6KiB8IGhwcGE6TGludXg6KjoqKQorCSMgTG9vayBmb3IgQ1BVIGxldmVsCisJY2FzZSBgZ3JlcCAnXmNwdVteYS16XSo6JyAvcHJvYy9jcHVpbmZvIDI+L2Rldi9udWxsIHwgY3V0IC1kJyAnIC1mMmAgaW4KKwkgIFBBNyopIGVjaG8gaHBwYTEuMS11bmtub3duLWxpbnV4LWdudSA7OworCSAgUEE4KikgZWNobyBocHBhMi4wLXVua25vd24tbGludXgtZ251IDs7CisJICAqKSAgICBlY2hvIGhwcGEtdW5rbm93bi1saW51eC1nbnUgOzsKKwllc2FjCisJZXhpdCA7OworICAgIHBhcmlzYzY0OkxpbnV4Oio6KiB8IGhwcGE2NDpMaW51eDoqOiopCisJZWNobyBocHBhNjQtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgczM5MDpMaW51eDoqOiogfCBzMzkweDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1saW51eAorCWV4aXQgOzsKKyAgICBzaDY0KjpMaW51eDoqOiopCisgICAgCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBzaCo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBzcGFyYzpMaW51eDoqOiogfCBzcGFyYzY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgdmF4OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tZGVjLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICB4ODZfNjQ6TGludXg6KjoqKQorCWVjaG8geDg2XzY0LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIGkqODY6TGludXg6KjoqKQorCSMgVGhlIEJGRCBsaW5rZXIga25vd3Mgd2hhdCB0aGUgZGVmYXVsdCBvYmplY3QgZmlsZSBmb3JtYXQgaXMsIHNvCisJIyBmaXJzdCBzZWUgaWYgaXQgd2lsbCB0ZWxsIHVzLiBjZCB0byB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gcHJldmVudAorCSMgcHJvYmxlbXMgd2l0aCBvdGhlciBwcm9ncmFtcyBvciBkaXJlY3RvcmllcyBjYWxsZWQgYGxkJyBpbiB0aGUgcGF0aC4KKwkjIFNldCBMQ19BTEw9QyB0byBlbnN1cmUgbGQgb3V0cHV0cyBtZXNzYWdlcyBpbiBFbmdsaXNoLgorCWxkX3N1cHBvcnRlZF90YXJnZXRzPWBjZCAvOyBMQ19BTEw9QyBsZCAtLWhlbHAgMj4mMSBcCisJCQkgfCBzZWQgLW5lICcvc3VwcG9ydGVkIHRhcmdldHM6LyFkCisJCQkJICAgIHMvWyAJXVsgCV0qLyAvZworCQkJCSAgICBzLy4qc3VwcG9ydGVkIHRhcmdldHM6ICovLworCQkJCSAgICBzLyAuKi8vCisJCQkJICAgIHAnYAorICAgICAgICBjYXNlICIkbGRfc3VwcG9ydGVkX3RhcmdldHMiIGluCisJICBlbGYzMi1pMzg2KQorCQlURU5UQVRJVkU9IiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251IgorCQk7OworCSAgYS5vdXQtaTM4Ni1saW51eCkKKwkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVhb3V0IgorCQlleGl0IDs7CisJICBjb2ZmLWkzODYpCisJCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251Y29mZiIKKwkJZXhpdCA7OworCSAgIiIpCisJCSMgRWl0aGVyIGEgcHJlLUJGRCBhLm91dCBsaW5rZXIgKGxpbnV4LWdudW9sZGxkKSBvcgorCQkjIG9uZSB0aGF0IGRvZXMgbm90IGdpdmUgdXMgdXNlZnVsIC0taGVscC4KKwkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVvbGRsZCIKKwkJZXhpdCA7OworCWVzYWMKKwkjIERldGVybWluZSB3aGV0aGVyIHRoZSBkZWZhdWx0IGNvbXBpbGVyIGlzIGEub3V0IG9yIGVsZgorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCSNpZmRlZiBfX0VMRl9fCisJIyBpZmRlZiBfX0dMSUJDX18KKwkjICBpZiBfX0dMSUJDX18gPj0gMgorCUxJQkM9Z251CisJIyAgZWxzZQorCUxJQkM9Z251bGliYzEKKwkjICBlbmRpZgorCSMgZWxzZQorCUxJQkM9Z251bGliYzEKKwkjIGVuZGlmCisJI2Vsc2UKKwkjaWYgZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKSB8fCBkZWZpbmVkKF9fUEdJKSB8fCBkZWZpbmVkKF9fU1VOUFJPX0MpIHx8IGRlZmluZWQoX19TVU5QUk9fQ0MpCisJTElCQz1nbnUKKwkjZWxzZQorCUxJQkM9Z251YW91dAorCSNlbmRpZgorCSNlbmRpZgorCSNpZmRlZiBfX2RpZXRsaWJjX18KKwlMSUJDPWRpZXRsaWJjCisJI2VuZGlmCitFT0YKKwlldmFsICJgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IHNlZCAtbiAnCisJICAgIC9eTElCQy97CisJCXM6IDo6ZworCQlwCisJICAgIH0nYCIKKwl0ZXN0IHgiJHtMSUJDfSIgIT0geCAmJiB7CisJCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtJHtMSUJDfSIKKwkJZXhpdAorCX0KKwl0ZXN0IHgiJHtURU5UQVRJVkV9IiAhPSB4ICYmIHsgZWNobyAiJHtURU5UQVRJVkV9IjsgZXhpdDsgfQorCTs7CisgICAgaSo4NjpEWU5JWC9wdHg6NCo6KikKKwkjIHB0eCA0LjAgZG9lcyB1bmFtZSAtcyBjb3JyZWN0bHksIHdpdGggRFlOSVgvcHR4IGluIHRoZXJlLgorCSMgZWFybGllciB2ZXJzaW9ucyBhcmUgbWVzc2VkIHVwIGFuZCBwdXQgdGhlIG5vZGVuYW1lIGluIGJvdGgKKwkjIHN5c25hbWUgYW5kIG5vZGVuYW1lLgorCWVjaG8gaTM4Ni1zZXF1ZW50LXN5c3Y0CisJZXhpdCA7OworICAgIGkqODY6VU5JWF9TVjo0LjJNUDoyLiopCisgICAgICAgICMgVW5peHdhcmUgaXMgYW4gb2Zmc2hvb3Qgb2YgU1ZSNCwgYnV0IGl0IGhhcyBpdHMgb3duIHZlcnNpb24KKyAgICAgICAgIyBudW1iZXIgc2VyaWVzIHN0YXJ0aW5nIHdpdGggMi4uLgorICAgICAgICAjIEkgYW0gbm90IHBvc2l0aXZlIHRoYXQgb3RoZXIgU1ZSNCBzeXN0ZW1zIHdvbid0IG1hdGNoIHRoaXMsCisJIyBJIGp1c3QgaGF2ZSB0byBob3BlLiAgLS0gcm1zLgorICAgICAgICAjIFVzZSBzeXN2NC4ydXcuLi4gc28gdGhhdCBzeXN2NCogbWF0Y2hlcyBpdC4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjQuMnV3JHtVTkFNRV9WRVJTSU9OfQorCWV4aXQgOzsKKyAgICBpKjg2Ok9TLzI6KjoqKQorCSMgSWYgd2Ugd2VyZSBhYmxlIHRvIGZpbmQgYHVuYW1lJywgdGhlbiBFTVggVW5peCBjb21wYXRpYmlsaXR5CisJIyBpcyBwcm9iYWJseSBpbnN0YWxsZWQuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW9zMi1lbXgKKwlleGl0IDs7CisgICAgaSo4NjpYVFMtMzAwOio6U1RPUCkKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zdG9wCisJZXhpdCA7OworICAgIGkqODY6YXRoZW9zOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hdGhlb3MKKwlleGl0IDs7CisgICAgaSo4NjpzeWxsYWJsZToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5bGxhYmxlCisJZXhpdCA7OworICAgIGkqODY6THlueE9TOjIuKjoqIHwgaSo4NjpMeW54T1M6My5bMDFdKjoqIHwgaSo4NjpMeW54T1M6NC4wKjoqKQorCWVjaG8gaTM4Ni11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgaSo4NjoqRE9TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbXNkb3NkamdwcAorCWV4aXQgOzsKKyAgICBpKjg2Oio6NC4qOiogfCBpKjg2OlNZU1RFTV9WOjQuKjoqKQorCVVOQU1FX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkICdzL1wvTVAkLy8nYAorCWlmIGdyZXAgTm92ZWxsIC91c3IvaW5jbHVkZS9saW5rLmggPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgorCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5pdmVsLXN5c3Yke1VOQU1FX1JFTH0KKwllbHNlCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2JHtVTkFNRV9SRUx9CisJZmkKKwlleGl0IDs7CisgICAgaSo4NjoqOjU6WzY3OF0qKQorICAgIAkjIFVuaXhXYXJlIDcueCwgT3BlblVOSVggYW5kIE9wZW5TZXJ2ZXIgNi4KKwljYXNlIGAvYmluL3VuYW1lIC1YIHwgZ3JlcCAiXk1hY2hpbmUiYCBpbgorCSAgICAqNDg2KikJICAgICBVTkFNRV9NQUNISU5FPWk0ODYgOzsKKwkgICAgKlBlbnRpdW0pCSAgICAgVU5BTUVfTUFDSElORT1pNTg2IDs7CisJICAgICpQZW50KnwqQ2VsZXJvbikgVU5BTUVfTUFDSElORT1pNjg2IDs7CisJZXNhYworCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9JHtVTkFNRV9TWVNURU19JHtVTkFNRV9WRVJTSU9OfQorCWV4aXQgOzsKKyAgICBpKjg2Oio6My4yOiopCisJaWYgdGVzdCAtZiAvdXNyL29wdGlvbnMvY2IubmFtZTsgdGhlbgorCQlVTkFNRV9SRUw9YHNlZCAtbiAncy8uKlZlcnNpb24gLy9wJyA8L3Vzci9vcHRpb25zL2NiLm5hbWVgCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1pc2MkVU5BTUVfUkVMCisJZWxpZiAvYmluL3VuYW1lIC1YIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCisJCVVOQU1FX1JFTD1gKC9iaW4vdW5hbWUgLVh8Z3JlcCBSZWxlYXNlfHNlZCAtZSAncy8uKj0gLy8nKWAKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCBpODA0ODYgPi9kZXYvbnVsbCkgJiYgVU5BTUVfTUFDSElORT1pNDg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50aXVtJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk1ODYKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnQgKklJJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0gUHJvJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXNjbyRVTkFNRV9SRUwKKwllbHNlCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2MzIKKwlmaQorCWV4aXQgOzsKKyAgICBwYzoqOio6KikKKwkjIExlZnQgaGVyZSBmb3IgY29tcGF0aWJpbGl0eToKKyAgICAgICAgIyB1bmFtZSAtbSBwcmludHMgZm9yIERKR1BQIGFsd2F5cyAncGMnLCBidXQgaXQgcHJpbnRzIG5vdGhpbmcgYWJvdXQKKyAgICAgICAgIyB0aGUgcHJvY2Vzc29yLCBzbyB3ZSBwbGF5IHNhZmUgYnkgYXNzdW1pbmcgaTM4Ni4KKwllY2hvIGkzODYtcGMtbXNkb3NkamdwcAorICAgICAgICBleGl0IDs7CisgICAgSW50ZWw6TWFjaDozKjoqKQorCWVjaG8gaTM4Ni1wYy1tYWNoMworCWV4aXQgOzsKKyAgICBwYXJhZ29uOio6KjoqKQorCWVjaG8gaTg2MC1pbnRlbC1vc2YxCisJZXhpdCA7OworICAgIGk4NjA6Kjo0Lio6KikgIyBpODYwLVNWUjQKKwlpZiBncmVwIFN0YXJkZW50IC91c3IvaW5jbHVkZS9zeXMvdWFkbWluLmggPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCSAgZWNobyBpODYwLXN0YXJkZW50LXN5c3Yke1VOQU1FX1JFTEVBU0V9ICMgU3RhcmRlbnQgVmlzdHJhIGk4NjAtU1ZSNAorCWVsc2UgIyBBZGQgb3RoZXIgaTg2MC1TVlI0IHZlbmRvcnMgYmVsb3cgYXMgdGhleSBhcmUgZGlzY292ZXJlZC4KKwkgIGVjaG8gaTg2MC11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9ICAjIFVua25vd24gaTg2MC1TVlI0CisJZmkKKwlleGl0IDs7CisgICAgbWluaSo6Q1RJWDpTWVMqNToqKQorCSMgIm1pbmlmcmFtZSIKKwllY2hvIG02ODAxMC1jb252ZXJnZW50LXN5c3YKKwlleGl0IDs7CisgICAgbWM2OGs6VU5JWDpTWVNURU01OjMuNTFtKQorCWVjaG8gbTY4ay1jb252ZXJnZW50LXN5c3YKKwlleGl0IDs7CisgICAgTTY4MD8wOkQtTklYOjUuMzoqKQorCWVjaG8gbTY4ay1kaWFiLWRuaXgKKwlleGl0IDs7CisgICAgTTY4KjoqOlIzVls1Njc4XSo6KikKKwl0ZXN0IC1yIC9zeXNWNjggJiYgeyBlY2hvICdtNjhrLW1vdG9yb2xhLXN5c3YnOyBleGl0OyB9IDs7CisgICAgM1szNDVdPz86Kjo0LjA6My4wIHwgM1szNF0/P0E6Kjo0LjA6My4wIHwgM1szNF0/PywqOio6NC4wOjMuMCB8IDNbMzRdPz8vKjoqOjQuMDozLjAgfCA0NDAwOio6NC4wOjMuMCB8IDQ4NTA6Kjo0LjA6My4wIHwgU0tBNDA6Kjo0LjA6My4wIHwgU0RTMjoqOjQuMDozLjAgfCBTSEcyOio6NC4wOjMuMCB8IFM3NTAxKjoqOjQuMDozLjApCisJT1NfUkVMPScnCisJdGVzdCAtciAvZXRjLy5yZWxpZCBcCisJJiYgT1NfUkVMPS5gc2VkIC1uICdzL1teIF0qIFteIF0qIFwoWzAtOV1bMC05XVwpLiovXDEvcCcgPCAvZXRjLy5yZWxpZGAKKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKKwkgICYmIHsgZWNobyBpNDg2LW5jci1zeXN2NC4zJHtPU19SRUx9OyBleGl0OyB9CisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IC9iaW4vZ3JlcCBlbnRpdW0gPi9kZXYvbnVsbCBcCisJICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfSA7OworICAgIDNbMzRdPz86Kjo0LjA6KiB8IDNbMzRdPz8sKjoqOjQuMDoqKQorICAgICAgICAvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKKyAgICAgICAgICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQ7IGV4aXQ7IH0gOzsKKyAgICBtNjgqOkx5bnhPUzoyLio6KiB8IG02OCo6THlueE9TOjMuMCo6KikKKwllY2hvIG02OGstdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG1jNjgwMzA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKKwllY2hvIG02OGstYXRhcmktc3lzdjQKKwlleGl0IDs7CisgICAgVFNVTkFNSTpMeW54T1M6Mi4qOiopCisJZWNobyBzcGFyYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgcnM2MDAwOkx5bnhPUzoyLio6KikKKwllY2hvIHJzNjAwMC11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgUG93ZXJQQzpMeW54T1M6Mi4qOiogfCBQb3dlclBDOkx5bnhPUzozLlswMV0qOiogfCBQb3dlclBDOkx5bnhPUzo0LjAqOiopCisJZWNobyBwb3dlcnBjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTTVtCRV1TOlVOSVhfU1Y6KjoqKQorCWVjaG8gbWlwcy1kZGUtc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgUk0qOlJlbGlhbnRVTklYLSo6KjoqKQorCWVjaG8gbWlwcy1zbmktc3lzdjQKKwlleGl0IDs7CisgICAgUk0qOlNJTklYLSo6KjoqKQorCWVjaG8gbWlwcy1zbmktc3lzdjQKKwlleGl0IDs7CisgICAgKjpTSU5JWC0qOio6KikKKwlpZiB1bmFtZSAtcCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgorCQlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAorCQllY2hvICR7VU5BTUVfTUFDSElORX0tc25pLXN5c3Y0CisJZWxzZQorCQllY2hvIG5zMzJrLXNuaS1zeXN2CisJZmkKKwlleGl0IDs7CisgICAgUEVOVElVTToqOjQuMCo6KikgIyBVbmlzeXMgYENsZWFyUGF0aCBITVAgSVggNDAwMCcgU1ZSNC9NUCBlZmZvcnQKKyAgICAgICAgICAgICAgICAgICAgICAjIHNheXMgPFJpY2hhcmQuTS5CYXJ0ZWxAY2NNYWlsLkNlbnN1cy5HT1Y+CisgICAgICAgIGVjaG8gaTU4Ni11bmlzeXMtc3lzdjQKKyAgICAgICAgZXhpdCA7OworICAgICo6VU5JWF9TeXN0ZW1fVjo0KjpGVFgqKQorCSMgRnJvbSBHZXJhbGQgSGV3ZXMgPGhld2VzQG9wZW5tYXJrZXQuY29tPi4KKwkjIEhvdyBhYm91dCBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBzdHJhdHVzIGFyY2hpdGVjdHVyZXM/IC1kam0KKwllY2hvIGhwcGExLjEtc3RyYXR1cy1zeXN2NAorCWV4aXQgOzsKKyAgICAqOio6KjpGVFgqKQorCSMgRnJvbSBzZWFuZkBzd2RjLnN0cmF0dXMuY29tLgorCWVjaG8gaTg2MC1zdHJhdHVzLXN5c3Y0CisJZXhpdCA7OworICAgIGkqODY6Vk9TOio6KikKKwkjIEZyb20gUGF1bC5HcmVlbkBzdHJhdHVzLmNvbS4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tc3RyYXR1cy12b3MKKwlleGl0IDs7CisgICAgKjpWT1M6KjoqKQorCSMgRnJvbSBQYXVsLkdyZWVuQHN0cmF0dXMuY29tLgorCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXZvcworCWV4aXQgOzsKKyAgICBtYzY4KjpBL1VYOio6KikKKwllY2hvIG02OGstYXBwbGUtYXV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBuZXdzKjpORVdTLU9TOjYqOiopCisJZWNobyBtaXBzLXNvbnktbmV3c29zNgorCWV4aXQgOzsKKyAgICBSWzM0XTAwMDoqU3lzdGVtX1YqOio6KiB8IFI0MDAwOlVOSVhfU1lTVjoqOiogfCBSKjAwMDpVTklYX1NWOio6KikKKwlpZiBbIC1kIC91c3IvbmVjIF07IHRoZW4KKwkgICAgICAgIGVjaG8gbWlwcy1uZWMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwllbHNlCisJICAgICAgICBlY2hvIG1pcHMtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWZpCisgICAgICAgIGV4aXQgOzsKKyAgICBCZUJveDpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gaGFyZHdhcmUgbWFkZSBieSBCZSwgUFBDIG9ubHkuCisJZWNobyBwb3dlcnBjLWJlLWJlb3MKKwlleGl0IDs7CisgICAgQmVNYWM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIE1hYyBvciBNYWMgY2xvbmUsIFBQQyBvbmx5LgorCWVjaG8gcG93ZXJwYy1hcHBsZS1iZW9zCisJZXhpdCA7OworICAgIEJlUEM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCisJZWNobyBpNTg2LXBjLWJlb3MKKwlleGl0IDs7CisgICAgU1gtNDpTVVBFUi1VWDoqOiopCisJZWNobyBzeDQtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNYLTU6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g1LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC02OlNVUEVSLVVYOio6KikKKwllY2hvIHN4Ni1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgUG93ZXIqOlJoYXBzb2R5Oio6KikKKwllY2hvIHBvd2VycGMtYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6UmhhcHNvZHk6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpEYXJ3aW46KjoqKQorCVVOQU1FX1BST0NFU1NPUj1gdW5hbWUgLXBgIHx8IFVOQU1FX1BST0NFU1NPUj11bmtub3duCisJY2FzZSAkVU5BTUVfUFJPQ0VTU09SIGluCisJICAgIHVua25vd24pIFVOQU1FX1BST0NFU1NPUj1wb3dlcnBjIDs7CisJZXNhYworCWVjaG8gJHtVTkFNRV9QUk9DRVNTT1J9LWFwcGxlLWRhcndpbiR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpwcm9jbnRvKjoqOiogfCAqOlFOWDpbMDEyMzQ1Njc4OV0qOiopCisJVU5BTUVfUFJPQ0VTU09SPWB1bmFtZSAtcGAKKwlpZiB0ZXN0ICIkVU5BTUVfUFJPQ0VTU09SIiA9ICJ4ODYiOyB0aGVuCisJCVVOQU1FX1BST0NFU1NPUj1pMzg2CisJCVVOQU1FX01BQ0hJTkU9cGMKKwlmaQorCWVjaG8gJHtVTkFNRV9QUk9DRVNTT1J9LSR7VU5BTUVfTUFDSElORX0tbnRvLXFueCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpRTlg6Kjo0KikKKwllY2hvIGkzODYtcGMtcW54CisJZXhpdCA7OworICAgIE5TRS0/Ok5PTlNUT1BfS0VSTkVMOio6KikKKwllY2hvIG5zZS10YW5kZW0tbnNrJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBOU1ItPzpOT05TVE9QX0tFUk5FTDoqOiopCisJZWNobyBuc3ItdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpOb25TdG9wLVVYOio6KikKKwllY2hvIG1pcHMtY29tcGFxLW5vbnN0b3B1eAorCWV4aXQgOzsKKyAgICBCUzIwMDA6UE9TSVgqOio6KikKKwllY2hvIGJzMjAwMC1zaWVtZW5zLXN5c3YKKwlleGl0IDs7CisgICAgRFMvKjpVTklYX1N5c3RlbV9WOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tJHtVTkFNRV9TWVNURU19LSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpQbGFuOToqOiopCisJIyAidW5hbWUgLW0iIGlzIG5vdCBjb25zaXN0ZW50LCBzbyB1c2UgJGNwdXR5cGUgaW5zdGVhZC4gMzg2CisJIyBpcyBjb252ZXJ0ZWQgdG8gaTM4NiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciB4ODYKKwkjIG9wZXJhdGluZyBzeXN0ZW1zLgorCWlmIHRlc3QgIiRjcHV0eXBlIiA9ICIzODYiOyB0aGVuCisJICAgIFVOQU1FX01BQ0hJTkU9aTM4NgorCWVsc2UKKwkgICAgVU5BTUVfTUFDSElORT0iJGNwdXR5cGUiCisJZmkKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1wbGFuOQorCWV4aXQgOzsKKyAgICAqOlRPUFMtMTA6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi10b3BzMTAKKwlleGl0IDs7CisgICAgKjpURU5FWDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRlbmV4CisJZXhpdCA7OworICAgIEtTMTA6VE9QUy0yMDoqOiogfCBLTDEwOlRPUFMtMjA6KjoqIHwgVFlQRTQ6VE9QUy0yMDoqOiopCisJZWNobyBwZHAxMC1kZWMtdG9wczIwCisJZXhpdCA7OworICAgIFhLTC0xOlRPUFMtMjA6KjoqIHwgVFlQRTU6VE9QUy0yMDoqOiopCisJZWNobyBwZHAxMC14a2wtdG9wczIwCisJZXhpdCA7OworICAgICo6VE9QUy0yMDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRvcHMyMAorCWV4aXQgOzsKKyAgICAqOklUUzoqOiopCisJZWNobyBwZHAxMC11bmtub3duLWl0cworCWV4aXQgOzsKKyAgICBTRUk6KjoqOlNFSVVYKQorICAgICAgICBlY2hvIG1pcHMtc2VpLXNlaXV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOkRyYWdvbkZseToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZHJhZ29uZmx5YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYAorCWV4aXQgOzsKKyAgICAqOipWTVM6KjoqKQorICAgIAlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCisJICAgIEEqKSBlY2hvIGFscGhhLWRlYy12bXMgOyBleGl0IDs7CisJICAgIEkqKSBlY2hvIGlhNjQtZGVjLXZtcyA7IGV4aXQgOzsKKwkgICAgViopIGVjaG8gdmF4LWRlYy12bXMgOyBleGl0IDs7CisJZXNhYyA7OworICAgICo6WEVOSVg6KjpTeXNWKQorCWVjaG8gaTM4Ni1wYy14ZW5peAorCWV4aXQgOzsKKyAgICBpKjg2OnNreW9zOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc2t5b3NgZWNobyAke1VOQU1FX1JFTEVBU0V9YCB8IHNlZCAtZSAncy8gLiokLy8nCisJZXhpdCA7OworICAgIGkqODY6cmRvczoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXJkb3MKKwlleGl0IDs7Citlc2FjCisKKyNlY2hvICcoTm8gdW5hbWUgY29tbWFuZCBvciB1bmFtZSBvdXRwdXQgbm90IHJlY29nbml6ZWQuKScgMT4mMgorI2VjaG8gIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgMT4mMgorCitldmFsICRzZXRfY2NfZm9yX2J1aWxkCitjYXQgPiRkdW1teS5jIDw8RU9GCisjaWZkZWYgX1NFUVVFTlRfCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyBpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorI2VuZGlmCittYWluICgpCit7CisjaWYgZGVmaW5lZCAoc29ueSkKKyNpZiBkZWZpbmVkIChNSVBTRUIpCisgIC8qIEJGRCB3YW50cyAiYnNkIiBpbnN0ZWFkIG9mICJuZXdzb3MiLiAgUGVyaGFwcyBCRkQgc2hvdWxkIGJlIGNoYW5nZWQsCisgICAgIEkgZG9uJ3Qga25vdy4uLi4gICovCisgIHByaW50ZiAoIm1pcHMtc29ueS1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisgIHByaW50ZiAoIm02OGstc29ueS1uZXdzb3Mlc1xuIiwKKyNpZmRlZiBORVdTT1M0CisgICAgICAgICAgIjQiCisjZWxzZQorCSAgIiIKKyNlbmRpZgorICAgICAgICAgKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19hcm0pICYmIGRlZmluZWQgKF9fYWNvcm4pICYmIGRlZmluZWQgKF9fdW5peCkKKyAgcHJpbnRmICgiYXJtLWFjb3JuLXJpc2NpeFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChocDMwMCkgJiYgIWRlZmluZWQgKGhwdXgpCisgIHByaW50ZiAoIm02OGstaHAtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKE5lWFQpCisjaWYgIWRlZmluZWQgKF9fQVJDSElURUNUVVJFX18pCisjZGVmaW5lIF9fQVJDSElURUNUVVJFX18gIm02OGsiCisjZW5kaWYKKyAgaW50IHZlcnNpb247CisgIHZlcnNpb249YChob3N0aW5mbyB8IHNlZCAtbiAncy8uKk5lWFQgTWFjaCBcKFswLTldKlwpLiovXDEvcCcpIDI+L2Rldi9udWxsYDsKKyAgaWYgKHZlcnNpb24gPCA0KQorICAgIHByaW50ZiAoIiVzLW5leHQtbmV4dHN0ZXAlZFxuIiwgX19BUkNISVRFQ1RVUkVfXywgdmVyc2lvbik7CisgIGVsc2UKKyAgICBwcmludGYgKCIlcy1uZXh0LW9wZW5zdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOworICBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoTVVMVElNQVgpIHx8IGRlZmluZWQgKG4xNikKKyNpZiBkZWZpbmVkIChVTUFYVikKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLXN5c3ZcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisjaWYgZGVmaW5lZCAoQ01VKQorICBwcmludGYgKCJuczMyay1lbmNvcmUtbWFjaFxuIik7IGV4aXQgKDApOworI2Vsc2UKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX18zODZCU0RfXykKKyAgcHJpbnRmICgiaTM4Ni1wYy1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoc2VxdWVudCkKKyNpZiBkZWZpbmVkIChpMzg2KQorICBwcmludGYgKCJpMzg2LXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2lmIGRlZmluZWQgKG5zMzIwMDApCisgIHByaW50ZiAoIm5zMzJrLXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU0VRVUVOVF8pCisgICAgc3RydWN0IHV0c25hbWUgdW47CisKKyAgICB1bmFtZSgmdW4pOworCisgICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYyIiwgMikgPT0gMCkgeworCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgyXG4iKTsgZXhpdCAoMCk7CisgICAgfQorICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMSIsIDIpID09IDApIHsgLyogWFhYIGlzIFYxIGNvcnJlY3Q/ICovCisJcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDFcbiIpOyBleGl0ICgwKTsKKyAgICB9CisgICAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eFxuIik7IGV4aXQgKDApOworCisjZW5kaWYKKworI2lmIGRlZmluZWQgKHZheCkKKyMgaWYgIWRlZmluZWQgKHVsdHJpeCkKKyMgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorIyAgaWYgZGVmaW5lZCAoQlNEKQorIyAgIGlmIEJTRCA9PSA0MworICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2Q0LjNcbiIpOyBleGl0ICgwKTsKKyMgICBlbHNlCisjICAgIGlmIEJTRCA9PSAxOTkwMDYKKyAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zcmVub1xuIik7IGV4aXQgKDApOworIyAgICBlbHNlCisgICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOworIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbHNlCisgICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKKyMgIGVuZGlmCisjIGVsc2UKKyAgICBwcmludGYgKCJ2YXgtZGVjLXVsdHJpeFxuIik7IGV4aXQgKDApOworIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChhbGxpYW50KSAmJiBkZWZpbmVkIChpODYwKQorICBwcmludGYgKCJpODYwLWFsbGlhbnQtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworICBleGl0ICgxKTsKK30KK0VPRgorCiskQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAyPi9kZXYvbnVsbCAmJiBTWVNURU1fTkFNRT1gJGR1bW15YCAmJgorCXsgZWNobyAiJFNZU1RFTV9OQU1FIjsgZXhpdDsgfQorCisjIEFwb2xsb3MgcHV0IHRoZSBzeXN0ZW0gdHlwZSBpbiB0aGUgZW52aXJvbm1lbnQuCisKK3Rlc3QgLWQgL3Vzci9hcG9sbG8gJiYgeyBlY2hvICR7SVNQfS1hcG9sbG8tJHtTWVNUWVBFfTsgZXhpdDsgfQorCisjIENvbnZleCB2ZXJzaW9ucyB0aGF0IHByZWRhdGUgdW5hbWUgY2FuIHVzZSBnZXRzeXNpbmZvKDEpCisKK2lmIFsgLXggL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyBdCit0aGVuCisgICAgY2FzZSBgZ2V0c3lzaW5mbyAtZiBjcHVfdHlwZWAgaW4KKyAgICBjMSopCisJZWNobyBjMS1jb252ZXgtYnNkCisJZXhpdCA7OworICAgIGMyKikKKwlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKKwl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKKwllbHNlIGVjaG8gYzItY29udmV4LWJzZAorCWZpCisJZXhpdCA7OworICAgIGMzNCopCisJZWNobyBjMzQtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBjMzgqKQorCWVjaG8gYzM4LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgYzQqKQorCWVjaG8gYzQtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBlc2FjCitmaQorCitjYXQgPiYyIDw8RU9GCiskMDogdW5hYmxlIHRvIGd1ZXNzIHN5c3RlbSB0eXBlCisKK1RoaXMgc2NyaXB0LCBsYXN0IG1vZGlmaWVkICR0aW1lc3RhbXAsIGhhcyBmYWlsZWQgdG8gcmVjb2duaXplCit0aGUgb3BlcmF0aW5nIHN5c3RlbSB5b3UgYXJlIHVzaW5nLiBJdCBpcyBhZHZpc2VkIHRoYXQgeW91Citkb3dubG9hZCB0aGUgbW9zdCB1cCB0byBkYXRlIHZlcnNpb24gb2YgdGhlIGNvbmZpZyBzY3JpcHRzIGZyb20KKworICBodHRwOi8vc2F2YW5uYWguZ251Lm9yZy9jZ2ktYmluL3ZpZXdjdnMvKmNoZWNrb3V0Ki9jb25maWcvY29uZmlnL2NvbmZpZy5ndWVzcworYW5kCisgIGh0dHA6Ly9zYXZhbm5haC5nbnUub3JnL2NnaS1iaW4vdmlld2N2cy8qY2hlY2tvdXQqL2NvbmZpZy9jb25maWcvY29uZmlnLnN1YgorCitJZiB0aGUgdmVyc2lvbiB5b3UgcnVuICgkMCkgaXMgYWxyZWFkeSB1cCB0byBkYXRlLCBwbGVhc2UKK3NlbmQgdGhlIGZvbGxvd2luZyBkYXRhIGFuZCBhbnkgaW5mb3JtYXRpb24geW91IHRoaW5rIG1pZ2h0IGJlCitwZXJ0aW5lbnQgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+IGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIG5lZWRlZAoraW5mb3JtYXRpb24gdG8gaGFuZGxlIHlvdXIgc3lzdGVtLgorCitjb25maWcuZ3Vlc3MgdGltZXN0YW1wID0gJHRpbWVzdGFtcAorCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKy9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbGAKKworaG9zdGluZm8gICAgICAgICAgICAgICA9IGAoaG9zdGluZm8pIDI+L2Rldi9udWxsYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbGAKKy9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbGAKKy91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsYAorCitVTkFNRV9NQUNISU5FID0gJHtVTkFNRV9NQUNISU5FfQorVU5BTUVfUkVMRUFTRSA9ICR7VU5BTUVfUkVMRUFTRX0KK1VOQU1FX1NZU1RFTSAgPSAke1VOQU1FX1NZU1RFTX0KK1VOQU1FX1ZFUlNJT04gPSAke1VOQU1FX1ZFUlNJT059CitFT0YKKworZXhpdCAxCisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgorIyB0aW1lLXN0YW1wLWVuZDogIiciCisjIEVuZDoKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2NvbmZ0b29scy9jb25maWcuc3ViIGIvZXhwYXQtMi4wLjEvY29uZnRvb2xzL2NvbmZpZy5zdWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmFiMGFhMwotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2NvbmZ0b29scy9jb25maWcuc3ViCkBAIC0wLDAgKzEsMTYxNiBAQAorIyEgL2Jpbi9zaAorIyBDb25maWd1cmF0aW9uIHZhbGlkYXRpb24gc3Vicm91dGluZSBzY3JpcHQuCisjICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LAorIyAgIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyAgIEluYy4KKwordGltZXN0YW1wPScyMDA2LTA5LTIwJworCisjIFRoaXMgZmlsZSBpcyAoaW4gcHJpbmNpcGxlKSBjb21tb24gdG8gQUxMIEdOVSBzb2Z0d2FyZS4KKyMgVGhlIHByZXNlbmNlIG9mIGEgbWFjaGluZSBpbiB0aGlzIGZpbGUgc3VnZ2VzdHMgdGhhdCBTT01FIEdOVSBzb2Z0d2FyZQorIyBjYW4gaGFuZGxlIHRoYXQgbWFjaGluZS4gIEl0IGRvZXMgbm90IGltcGx5IEFMTCBHTlUgc29mdHdhcmUgY2FuLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorIyAwMjExMC0xMzAxLCBVU0EuCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworCisjIFBsZWFzZSBzZW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiAgU3VibWl0IGEgY29udGV4dAorIyBkaWZmIGFuZCBhIHByb3Blcmx5IGZvcm1hdHRlZCBDaGFuZ2VMb2cgZW50cnkuCisjCisjIENvbmZpZ3VyYXRpb24gc3Vicm91dGluZSB0byB2YWxpZGF0ZSBhbmQgY2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiB0eXBlLgorIyBTdXBwbHkgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIHR5cGUgYXMgYW4gYXJndW1lbnQuCisjIElmIGl0IGlzIGludmFsaWQsIHdlIHByaW50IGFuIGVycm9yIG1lc3NhZ2Ugb24gc3RkZXJyIGFuZCBleGl0IHdpdGggY29kZSAxLgorIyBPdGhlcndpc2UsIHdlIHByaW50IHRoZSBjYW5vbmljYWwgY29uZmlnIHR5cGUgb24gc3Rkb3V0IGFuZCBzdWNjZWVkLgorCisjIFRoaXMgZmlsZSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIEdOVSBwYWNrYWdlcworIyBhbmQgcmVjb2duaXplIGFsbCB0aGUgQ1BVIHR5cGVzLCBzeXN0ZW0gdHlwZXMgYW5kIGFsaWFzZXMKKyMgdGhhdCBhcmUgbWVhbmluZ2Z1bCB3aXRoICphbnkqIEdOVSBzb2Z0d2FyZS4KKyMgRWFjaCBwYWNrYWdlIGlzIHJlc3BvbnNpYmxlIGZvciByZXBvcnRpbmcgd2hpY2ggdmFsaWQgY29uZmlndXJhdGlvbnMKKyMgaXQgZG9lcyBub3Qgc3VwcG9ydC4gIFRoZSB1c2VyIHNob3VsZCBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoCisjIGEgZmFpbHVyZSB0byBzdXBwb3J0IGEgdmFsaWQgY29uZmlndXJhdGlvbiBmcm9tIGEgbWVhbmluZ2xlc3MKKyMgY29uZmlndXJhdGlvbi4KKworIyBUaGUgZ29hbCBvZiB0aGlzIGZpbGUgaXMgdG8gbWFwIGFsbCB0aGUgdmFyaW91cyB2YXJpYXRpb25zIG9mIGEgZ2l2ZW4KKyMgbWFjaGluZSBzcGVjaWZpY2F0aW9uIGludG8gYSBzaW5nbGUgc3BlY2lmaWNhdGlvbiBpbiB0aGUgZm9ybToKKyMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0KKyMgb3IgaW4gc29tZSBjYXNlcywgdGhlIG5ld2VyIGZvdXItcGFydCBmb3JtOgorIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU0KKyMgSXQgaXMgd3JvbmcgdG8gZWNobyBhbnkgb3RoZXIgdHlwZSBvZiBzcGVjaWZpY2F0aW9uLgorCittZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKKwordXNhZ2U9IlwKK1VzYWdlOiAkMCBbT1BUSU9OXSBDUFUtTUZSLU9QU1lTCisgICAgICAgJDAgW09QVElPTl0gQUxJQVMKKworQ2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiBuYW1lLgorCitPcGVyYXRpb24gbW9kZXM6CisgIC1oLCAtLWhlbHAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtdCwgLS10aW1lLXN0YW1wICAgcHJpbnQgZGF0ZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgdGhlbiBleGl0CisgIC12LCAtLXZlcnNpb24gICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0CisKK1JlcG9ydCBidWdzIGFuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4iCisKK3ZlcnNpb249IlwKK0dOVSBjb25maWcuc3ViICgkdGltZXN0YW1wKQorCitDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTword2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgorCitoZWxwPSIKK1RyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKworIyBQYXJzZSBjb21tYW5kIGxpbmUKK3doaWxlIHRlc3QgJCMgLWd0IDAgOyBkbworICBjYXNlICQxIGluCisgICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKKyAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgOzsKKyAgICAtLXZlcnNpb24gfCAtdiApCisgICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCA7OworICAgIC0taGVscCB8IC0taCogfCAtaCApCisgICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCA7OworICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZworICAgICAgIHNoaWZ0OyBicmVhayA7OworICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KKyAgICAgICBicmVhayA7OworICAgIC0qICkKKyAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiCisgICAgICAgZXhpdCAxIDs7CisKKyAgICAqbG9jYWwqKQorICAgICAgICMgRmlyc3QgcGFzcyB0aHJvdWdoIGFueSBsb2NhbCBtYWNoaW5lIHR5cGVzLgorICAgICAgIGVjaG8gJDEKKyAgICAgICBleGl0IDs7CisKKyAgICAqICkKKyAgICAgICBicmVhayA7OworICBlc2FjCitkb25lCisKK2Nhc2UgJCMgaW4KKyAwKSBlY2hvICIkbWU6IG1pc3NpbmcgYXJndW1lbnQkaGVscCIgPiYyCisgICAgZXhpdCAxOzsKKyAxKSA7OworICopIGVjaG8gIiRtZTogdG9vIG1hbnkgYXJndW1lbnRzJGhlbHAiID4mMgorICAgIGV4aXQgMTs7Citlc2FjCisKKyMgU2VwYXJhdGUgd2hhdCB0aGUgdXNlciBnYXZlIGludG8gQ1BVLUNPTVBBTlkgYW5kIE9TIG9yIEtFUk5FTC1PUyAoaWYgYW55KS4KKyMgSGVyZSB3ZSBtdXN0IHJlY29nbml6ZSBhbGwgdGhlIHZhbGlkIEtFUk5FTC1PUyBjb21iaW5hdGlvbnMuCittYXliZV9vcz1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDIvJ2AKK2Nhc2UgJG1heWJlX29zIGluCisgIG50by1xbngqIHwgbGludXgtZ251KiB8IGxpbnV4LWRpZXRsaWJjIHwgbGludXgtbmV3bGliKiB8IGxpbnV4LXVjbGliYyogfCBcCisgIHVjbGludXgtdWNsaWJjKiB8IHVjbGludXgtZ251KiB8IGtmcmVlYnNkKi1nbnUqIHwga25ldGJzZCotZ251KiB8IG5ldGJzZCotZ251KiB8IFwKKyAgc3Rvcm0tY2hhb3MqIHwgb3MyLWVteCogfCBydG1rLW5vdmEqKQorICAgIG9zPS0kbWF5YmVfb3MKKyAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMS8nYAorICAgIDs7CisgICopCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy8tW14tXSokLy8nYAorICAgIGlmIFsgJGJhc2ljX21hY2hpbmUgIT0gJDEgXQorICAgIHRoZW4gb3M9YGVjaG8gJDEgfCBzZWQgJ3MvLiotLy0vJ2AKKyAgICBlbHNlIG9zPTsgZmkKKyAgICA7OworZXNhYworCisjIyMgTGV0J3MgcmVjb2duaXplIGNvbW1vbiBtYWNoaW5lcyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMgc28KKyMjIyB0aGF0IHRoaW5ncyBsaWtlIGNvbmZpZy5zdWIgZGVjc3RhdGlvbi0zMTAwIHdvcmsuICBXZSBhbHNvCisjIyMgcmVjb2duaXplIHNvbWUgbWFudWZhY3R1cmVycyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMsIHNvIHdlCisjIyMgY2FuIHByb3ZpZGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyBiZWxvdy4KK2Nhc2UgJG9zIGluCisJLXN1bipvcyopCisJCSMgUHJldmVudCBmb2xsb3dpbmcgY2xhdXNlIGZyb20gaGFuZGxpbmcgdGhpcyBpbnZhbGlkIGlucHV0LgorCQk7OworCS1kZWMqIHwgLW1pcHMqIHwgLXNlcXVlbnQqIHwgLWVuY29yZSogfCAtcGM1MzIqIHwgLXNnaSogfCAtc29ueSogfCBcCisJLWF0dCogfCAtNzMwMCogfCAtMzMwMCogfCAtZGVsdGEqIHwgLW1vdG9yb2xhKiB8IC1zdW5bMjM0XSogfCBcCisJLXVuaWNvbSogfCAtaWJtKiB8IC1uZXh0IHwgLWhwIHwgLWlzaSogfCAtYXBvbGxvIHwgLWFsdG9zKiB8IFwKKwktY29udmVyZ2VudCogfCAtbmNyKiB8IC1uZXdzIHwgLTMyKiB8IC0zNjAwKiB8IC0zMTAwKiB8IC1oaXRhY2hpKiB8XAorCS1jWzEyM10qIHwgLWNvbnZleCogfCAtc3VuIHwgLWNyZHMgfCAtb21yb24qIHwgLWRnIHwgLXVsdHJhIHwgLXR0aSogfCBcCisJLWhhcnJpcyB8IC1kb2xwaGluIHwgLWhpZ2hsZXZlbCB8IC1nb3VsZCB8IC1jYm0gfCAtbnMgfCAtbWFzc2NvbXAgfCBcCisJLWFwcGxlIHwgLWF4aXMgfCAta251dGggfCAtY3JheSkKKwkJb3M9CisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktc2ltIHwgLWNpc2NvIHwgLW9raSB8IC13ZWMgfCAtd2luYm9uZCkKKwkJb3M9CisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktc2NvdXQpCisJCTs7CisJLXdycykKKwkJb3M9LXZ4d29ya3MKKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1jaG9ydXNvcyopCisJCW9zPS1jaG9ydXNvcworCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisgCS1jaG9ydXNyZGIpCisgCQlvcz0tY2hvcnVzcmRiCisJCWJhc2ljX21hY2hpbmU9JDEKKyAJCTs7CisJLWhpdXgqKQorCQlvcz0taGl1eHdlMgorCQk7OworCS1zY282KQorCQlvcz0tc2NvNXY2CisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvNSkKKwkJb3M9LXNjbzMuMnY1CisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvNCkKKwkJb3M9LXNjbzMuMnY0CisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvMy4yLls0LTldKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3NjbzMuMi4vc2NvMy4ydi8nYAorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzMuMnZbNC05XSopCisJCSMgRG9uJ3QgZm9yZ2V0IHZlcnNpb24gaWYgaXQgaXMgMy4ydjQgb3IgbmV3ZXIuCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvNXY2KikKKwkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28qKQorCQlvcz0tc2NvMy4ydjIKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS11ZGsqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWlzYykKKwkJb3M9LWlzYzIuMgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWNsaXgqKQorCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaW50ZXJncmFwaAorCQk7OworCS1pc2MqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWx5bngqKQorCQlvcz0tbHlueG9zCisJCTs7CisJLXB0eCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtc2VxdWVudC8nYAorCQk7OworCS13aW5kb3dzbnQqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvd2luZG93c250L3dpbm50LydgCisJCTs7CisJLXBzb3MqKQorCQlvcz0tcHNvcworCQk7OworCS1taW50IHwgLW1pbnRbMC05XSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQorCQlvcz0tbWludAorCQk7OworZXNhYworCisjIERlY29kZSBhbGlhc2VzIGZvciBjZXJ0YWluIENQVS1DT01QQU5ZIGNvbWJpbmF0aW9ucy4KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLgorCSMgU29tZSBhcmUgb21pdHRlZCBoZXJlIGJlY2F1c2UgdGhleSBoYXZlIHNwZWNpYWwgbWVhbmluZ3MgYmVsb3cuCisJMTc1MGEgfCA1ODAgXAorCXwgYTI5ayBcCisJfCBhbHBoYSB8IGFscGhhZXZbNC04XSB8IGFscGhhZXY1NiB8IGFscGhhZXY2Wzc4XSB8IGFscGhhcGNhNVs2N10gXAorCXwgYWxwaGE2NCB8IGFscGhhNjRldls0LThdIHwgYWxwaGE2NGV2NTYgfCBhbHBoYTY0ZXY2Wzc4XSB8IGFscGhhNjRwY2E1WzY3XSBcCisJfCBhbTMzXzIuMCBcCisJfCBhcmMgfCBhcm0gfCBhcm1bYmxdZSB8IGFybWVbbGJdIHwgYXJtdlsyMzQ1XSB8IGFybXZbMzQ1XVtsYl0gfCBhdnIgfCBhdnIzMiBcCisJfCBiZmluIFwKKwl8IGM0eCB8IGNsaXBwZXIgXAorCXwgZDEwdiB8IGQzMHYgfCBkbHggfCBkc3AxNnh4IFwKKwl8IGZyMzAgfCBmcnYgXAorCXwgaDgzMDAgfCBoODUwMCB8IGhwcGEgfCBocHBhMS5bMDFdIHwgaHBwYTIuMCB8IGhwcGEyLjBbbnddIHwgaHBwYTY0IFwKKwl8IGkzNzAgfCBpODYwIHwgaTk2MCB8IGlhNjQgXAorCXwgaXAyayB8IGlxMjAwMCBcCisJfCBtMzJjIHwgbTMyciB8IG0zMnJsZSB8IG02ODAwMCB8IG02OGsgfCBtODhrIFwKKwl8IG1heHEgfCBtYiB8IG1pY3JvYmxhemUgfCBtY29yZSBcCisJfCBtaXBzIHwgbWlwc2JlIHwgbWlwc2ViIHwgbWlwc2VsIHwgbWlwc2xlIFwKKwl8IG1pcHMxNiBcCisJfCBtaXBzNjQgfCBtaXBzNjRlbCBcCisJfCBtaXBzNjR2ciB8IG1pcHM2NHZyZWwgXAorCXwgbWlwczY0b3Jpb24gfCBtaXBzNjRvcmlvbmVsIFwKKwl8IG1pcHM2NHZyNDEwMCB8IG1pcHM2NHZyNDEwMGVsIFwKKwl8IG1pcHM2NHZyNDMwMCB8IG1pcHM2NHZyNDMwMGVsIFwKKwl8IG1pcHM2NHZyNTAwMCB8IG1pcHM2NHZyNTAwMGVsIFwKKwl8IG1pcHM2NHZyNTkwMCB8IG1pcHM2NHZyNTkwMGVsIFwKKwl8IG1pcHNpc2EzMiB8IG1pcHNpc2EzMmVsIFwKKwl8IG1pcHNpc2EzMnIyIHwgbWlwc2lzYTMycjJlbCBcCisJfCBtaXBzaXNhNjQgfCBtaXBzaXNhNjRlbCBcCisJfCBtaXBzaXNhNjRyMiB8IG1pcHNpc2E2NHIyZWwgXAorCXwgbWlwc2lzYTY0c2IxIHwgbWlwc2lzYTY0c2IxZWwgXAorCXwgbWlwc2lzYTY0c3I3MWsgfCBtaXBzaXNhNjRzcjcxa2VsIFwKKwl8IG1pcHN0eDM5IHwgbWlwc3R4MzllbCBcCisJfCBtbjEwMjAwIHwgbW4xMDMwMCBcCisJfCBtdCBcCisJfCBtc3A0MzAgXAorCXwgbmlvcyB8IG5pb3MyIFwKKwl8IG5zMTZrIHwgbnMzMmsgXAorCXwgb3IzMiBcCisJfCBwZHAxMCB8IHBkcDExIHwgcGogfCBwamwgXAorCXwgcG93ZXJwYyB8IHBvd2VycGM2NCB8IHBvd2VycGM2NGxlIHwgcG93ZXJwY2xlIHwgcHBjYmUgXAorCXwgcHlyYW1pZCBcCisJfCBzY29yZSBcCisJfCBzaCB8IHNoWzEyMzRdIHwgc2hbMjRdYSB8IHNoWzIzXWUgfCBzaFszNF1lYiB8IHNoZWIgfCBzaGJlIHwgc2hsZSB8IHNoWzEyMzRdbGUgfCBzaDNlbGUgXAorCXwgc2g2NCB8IHNoNjRsZSBcCisJfCBzcGFyYyB8IHNwYXJjNjQgfCBzcGFyYzY0YiB8IHNwYXJjNjR2IHwgc3BhcmM4NnggfCBzcGFyY2xldCB8IHNwYXJjbGl0ZSBcCisJfCBzcGFyY3Y4IHwgc3BhcmN2OSB8IHNwYXJjdjliIHwgc3BhcmN2OXYgXAorCXwgc3B1IHwgc3Ryb25nYXJtIFwKKwl8IHRhaG9lIHwgdGh1bWIgfCB0aWM0eCB8IHRpYzgwIHwgdHJvbiBcCisJfCB2ODUwIHwgdjg1MGUgXAorCXwgd2UzMmsgXAorCXwgeDg2IHwgeGMxNnggfCB4c2NhbGUgfCB4c2NhbGVlW2JsXSB8IHhzdG9ybXkxNiB8IHh0ZW5zYSBcCisJfCB6OGspCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQk7OworCW02ODExIHwgbTY4aGMxMSB8IG02ODEyIHwgbTY4aGMxMikKKwkJIyBNb3Rvcm9sYSA2OEhDMTEvMTIuCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQlvcz0tbm9uZQorCQk7OworCW04ODExMCB8IG02ODBbMTIzNDZdMCB8IG02ODM/MiB8IG02ODM2MCB8IG01MjAwIHwgdjcwIHwgdzY1IHwgejhrKQorCQk7OworCW1zMSkKKwkJYmFzaWNfbWFjaGluZT1tdC11bmtub3duCisJCTs7CisKKwkjIFdlIHVzZSBgcGMnIHJhdGhlciB0aGFuIGB1bmtub3duJworCSMgYmVjYXVzZSAoMSkgdGhhdCdzIHdoYXQgdGhleSBub3JtYWxseSBhcmUsIGFuZAorCSMgKDIpIHRoZSB3b3JkICJ1bmtub3duIiB0ZW5kcyB0byBjb25mdXNlIGJlZ2lubmluZyB1c2Vycy4KKwlpKjg2IHwgeDg2XzY0KQorCSAgYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS1wYworCSAgOzsKKwkjIE9iamVjdCBpZiBtb3JlIHRoYW4gb25lIGNvbXBhbnkgbmFtZSB3b3JkLgorCSotKi0qKQorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7CisJIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRoIGNvbXBhbnkgbmFtZS4KKwk1ODAtKiBcCisJfCBhMjlrLSogXAorCXwgYWxwaGEtKiB8IGFscGhhZXZbNC04XS0qIHwgYWxwaGFldjU2LSogfCBhbHBoYWV2Nls3OF0tKiBcCisJfCBhbHBoYTY0LSogfCBhbHBoYTY0ZXZbNC04XS0qIHwgYWxwaGE2NGV2NTYtKiB8IGFscGhhNjRldjZbNzhdLSogXAorCXwgYWxwaGFwY2E1WzY3XS0qIHwgYWxwaGE2NHBjYTVbNjddLSogfCBhcmMtKiBcCisJfCBhcm0tKiAgfCBhcm1iZS0qIHwgYXJtbGUtKiB8IGFybWViLSogfCBhcm12Ki0qIFwKKwl8IGF2ci0qIHwgYXZyMzItKiBcCisJfCBiZmluLSogfCBiczIwMDAtKiBcCisJfCBjWzEyM10qIHwgYzMwLSogfCBbY2p0XTkwLSogfCBjNHgtKiB8IGM1NHgtKiB8IGM1NXgtKiB8IGM2eC0qIFwKKwl8IGNsaXBwZXItKiB8IGNyYXludi0qIHwgY3lkcmEtKiBcCisJfCBkMTB2LSogfCBkMzB2LSogfCBkbHgtKiBcCisJfCBlbHhzaS0qIFwKKwl8IGYzMFswMV0tKiB8IGY3MDAtKiB8IGZyMzAtKiB8IGZydi0qIHwgZng4MC0qIFwKKwl8IGg4MzAwLSogfCBoODUwMC0qIFwKKwl8IGhwcGEtKiB8IGhwcGExLlswMV0tKiB8IGhwcGEyLjAtKiB8IGhwcGEyLjBbbnddLSogfCBocHBhNjQtKiBcCisJfCBpKjg2LSogfCBpODYwLSogfCBpOTYwLSogfCBpYTY0LSogXAorCXwgaXAyay0qIHwgaXEyMDAwLSogXAorCXwgbTMyYy0qIHwgbTMyci0qIHwgbTMycmxlLSogXAorCXwgbTY4MDAwLSogfCBtNjgwWzAxMjM0Nl0wLSogfCBtNjgzNjAtKiB8IG02ODM/Mi0qIHwgbTY4ay0qIFwKKwl8IG04ODExMC0qIHwgbTg4ay0qIHwgbWF4cS0qIHwgbWNvcmUtKiBcCisJfCBtaXBzLSogfCBtaXBzYmUtKiB8IG1pcHNlYi0qIHwgbWlwc2VsLSogfCBtaXBzbGUtKiBcCisJfCBtaXBzMTYtKiBcCisJfCBtaXBzNjQtKiB8IG1pcHM2NGVsLSogXAorCXwgbWlwczY0dnItKiB8IG1pcHM2NHZyZWwtKiBcCisJfCBtaXBzNjRvcmlvbi0qIHwgbWlwczY0b3Jpb25lbC0qIFwKKwl8IG1pcHM2NHZyNDEwMC0qIHwgbWlwczY0dnI0MTAwZWwtKiBcCisJfCBtaXBzNjR2cjQzMDAtKiB8IG1pcHM2NHZyNDMwMGVsLSogXAorCXwgbWlwczY0dnI1MDAwLSogfCBtaXBzNjR2cjUwMDBlbC0qIFwKKwl8IG1pcHM2NHZyNTkwMC0qIHwgbWlwczY0dnI1OTAwZWwtKiBcCisJfCBtaXBzaXNhMzItKiB8IG1pcHNpc2EzMmVsLSogXAorCXwgbWlwc2lzYTMycjItKiB8IG1pcHNpc2EzMnIyZWwtKiBcCisJfCBtaXBzaXNhNjQtKiB8IG1pcHNpc2E2NGVsLSogXAorCXwgbWlwc2lzYTY0cjItKiB8IG1pcHNpc2E2NHIyZWwtKiBcCisJfCBtaXBzaXNhNjRzYjEtKiB8IG1pcHNpc2E2NHNiMWVsLSogXAorCXwgbWlwc2lzYTY0c3I3MWstKiB8IG1pcHNpc2E2NHNyNzFrZWwtKiBcCisJfCBtaXBzdHgzOS0qIHwgbWlwc3R4MzllbC0qIFwKKwl8IG1taXgtKiBcCisJfCBtdC0qIFwKKwl8IG1zcDQzMC0qIFwKKwl8IG5pb3MtKiB8IG5pb3MyLSogXAorCXwgbm9uZS0qIHwgbnAxLSogfCBuczE2ay0qIHwgbnMzMmstKiBcCisJfCBvcmlvbi0qIFwKKwl8IHBkcDEwLSogfCBwZHAxMS0qIHwgcGotKiB8IHBqbC0qIHwgcG4tKiB8IHBvd2VyLSogXAorCXwgcG93ZXJwYy0qIHwgcG93ZXJwYzY0LSogfCBwb3dlcnBjNjRsZS0qIHwgcG93ZXJwY2xlLSogfCBwcGNiZS0qIFwKKwl8IHB5cmFtaWQtKiBcCisJfCByb21wLSogfCByczYwMDAtKiBcCisJfCBzaC0qIHwgc2hbMTIzNF0tKiB8IHNoWzI0XWEtKiB8IHNoWzIzXWUtKiB8IHNoWzM0XWViLSogfCBzaGViLSogfCBzaGJlLSogXAorCXwgc2hsZS0qIHwgc2hbMTIzNF1sZS0qIHwgc2gzZWxlLSogfCBzaDY0LSogfCBzaDY0bGUtKiBcCisJfCBzcGFyYy0qIHwgc3BhcmM2NC0qIHwgc3BhcmM2NGItKiB8IHNwYXJjNjR2LSogfCBzcGFyYzg2eC0qIHwgc3BhcmNsZXQtKiBcCisJfCBzcGFyY2xpdGUtKiBcCisJfCBzcGFyY3Y4LSogfCBzcGFyY3Y5LSogfCBzcGFyY3Y5Yi0qIHwgc3BhcmN2OXYtKiB8IHN0cm9uZ2FybS0qIHwgc3YxLSogfCBzeD8tKiBcCisJfCB0YWhvZS0qIHwgdGh1bWItKiBcCisJfCB0aWMzMC0qIHwgdGljNHgtKiB8IHRpYzU0eC0qIHwgdGljNTV4LSogfCB0aWM2eC0qIHwgdGljODAtKiBcCisJfCB0cm9uLSogXAorCXwgdjg1MC0qIHwgdjg1MGUtKiB8IHZheC0qIFwKKwl8IHdlMzJrLSogXAorCXwgeDg2LSogfCB4ODZfNjQtKiB8IHhjMTZ4LSogfCB4cHMxMDAtKiB8IHhzY2FsZS0qIHwgeHNjYWxlZVtibF0tKiBcCisJfCB4c3Rvcm15MTYtKiB8IHh0ZW5zYS0qIFwKKwl8IHltcC0qIFwKKwl8IHo4ay0qKQorCQk7OworCSMgUmVjb2duaXplIHRoZSB2YXJpb3VzIG1hY2hpbmUgbmFtZXMgYW5kIGFsaWFzZXMgd2hpY2ggc3RhbmQKKwkjIGZvciBhIENQVSB0eXBlIGFuZCBhIGNvbXBhbnkgYW5kIHNvbWV0aW1lcyBldmVuIGFuIE9TLgorCTM4NmJzZCkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KKwkJb3M9LWJzZAorCQk7OworCTNiMSB8IDczMDAgfCA3MzAwLWF0dCB8IGF0dC03MzAwIHwgcGM3MzAwIHwgc2FmYXJpIHwgdW5peHBjKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1hdHQKKwkJOzsKKwkzYiopCisJCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0CisJCTs7CisJYTI5a2hpZikKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tdWRpCisJCTs7CisgICAgCWFiYWN1cykKKwkJYmFzaWNfbWFjaGluZT1hYmFjdXMtdW5rbm93bgorCQk7OworCWFkb2JlNjhrKQorCQliYXNpY19tYWNoaW5lPW02ODAxMC1hZG9iZQorCQlvcz0tc2NvdXQKKwkJOzsKKwlhbGxpYW50IHwgZng4MCkKKwkJYmFzaWNfbWFjaGluZT1meDgwLWFsbGlhbnQKKwkJOzsKKwlhbHRvcyB8IGFsdG9zMzA2OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFsdG9zCisJCTs7CisJYW0yOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1ub25lCisJCW9zPS1ic2QKKwkJOzsKKwlhbWQ2NCkKKwkJYmFzaWNfbWFjaGluZT14ODZfNjQtcGMKKwkJOzsKKwlhbWQ2NC0qKQorCQliYXNpY19tYWNoaW5lPXg4Nl82NC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCWFtZGFobCkKKwkJYmFzaWNfbWFjaGluZT01ODAtYW1kYWhsCisJCW9zPS1zeXN2CisJCTs7CisJYW1pZ2EgfCBhbWlnYS0qKQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQk7OworCWFtaWdhb3MgfCBhbWlnYWRvcykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJb3M9LWFtaWdhb3MKKwkJOzsKKwlhbWlnYXVuaXggfCBhbWl4KQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQlvcz0tc3lzdjQKKwkJOzsKKwlhcG9sbG82OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbworCQlvcz0tc3lzdgorCQk7OworCWFwb2xsbzY4YnNkKQorCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCisJCW9zPS1ic2QKKwkJOzsKKwlhdXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQorCQlvcz0tYXV4CisJCTs7CisJYmFsYW5jZSkKKwkJYmFzaWNfbWFjaGluZT1uczMyay1zZXF1ZW50CisJCW9zPS1keW5peAorCQk7OworCWM5MCkKKwkJYmFzaWNfbWFjaGluZT1jOTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJY29udmV4LWMxKQorCQliYXNpY19tYWNoaW5lPWMxLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMyKQorCQliYXNpY19tYWNoaW5lPWMyLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzMikKKwkJYmFzaWNfbWFjaGluZT1jMzItY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzM0KQorCQliYXNpY19tYWNoaW5lPWMzNC1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzgpCisJCWJhc2ljX21hY2hpbmU9YzM4LWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY3JheSB8IGo5MCkKKwkJYmFzaWNfbWFjaGluZT1qOTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJY3JheW52KQorCQliYXNpY19tYWNoaW5lPWNyYXludi1jcmF5CisJCW9zPS11bmljb3NtcAorCQk7OworCWNyMTZjKQorCQliYXNpY19tYWNoaW5lPWNyMTZjLXVua25vd24KKwkJb3M9LWVsZgorCQk7OworCWNyZHMgfCB1bm9zKQorCQliYXNpY19tYWNoaW5lPW02OGstY3JkcworCQk7OworCWNyaXN2MzIgfCBjcmlzdjMyLSogfCBldHJheGZzKikKKwkJYmFzaWNfbWFjaGluZT1jcmlzdjMyLWF4aXMKKwkJOzsKKwljcmlzIHwgY3Jpcy0qIHwgZXRyYXgqKQorCQliYXNpY19tYWNoaW5lPWNyaXMtYXhpcworCQk7OworCWNyeCkKKwkJYmFzaWNfbWFjaGluZT1jcngtdW5rbm93bgorCQlvcz0tZWxmCisJCTs7CisJZGEzMCB8IGRhMzAtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWRhMzAKKwkJOzsKKwlkZWNzdGF0aW9uIHwgZGVjc3RhdGlvbi0zMTAwIHwgcG1heCB8IHBtYXgtKiB8IHBtaW4gfCBkZWMzMTAwIHwgZGVjc3RhdG4pCisJCWJhc2ljX21hY2hpbmU9bWlwcy1kZWMKKwkJOzsKKwlkZWNzeXN0ZW0xMCogfCBkZWMxMCopCisJCWJhc2ljX21hY2hpbmU9cGRwMTAtZGVjCisJCW9zPS10b3BzMTAKKwkJOzsKKwlkZWNzeXN0ZW0yMCogfCBkZWMyMCopCisJCWJhc2ljX21hY2hpbmU9cGRwMTAtZGVjCisJCW9zPS10b3BzMjAKKwkJOzsKKwlkZWx0YSB8IDMzMDAgfCBtb3Rvcm9sYS0zMzAwIHwgbW90b3JvbGEtZGVsdGEgXAorCSAgICAgIHwgMzMwMC1tb3Rvcm9sYSB8IGRlbHRhLW1vdG9yb2xhKQorCQliYXNpY19tYWNoaW5lPW02OGstbW90b3JvbGEKKwkJOzsKKwlkZWx0YTg4KQorCQliYXNpY19tYWNoaW5lPW04OGstbW90b3JvbGEKKwkJb3M9LXN5c3YzCisJCTs7CisJZGpncHApCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1wYworCQlvcz0tbXNkb3NkamdwcAorCQk7OworCWRweDIwIHwgZHB4MjAtKikKKwkJYmFzaWNfbWFjaGluZT1yczYwMDAtYnVsbAorCQlvcz0tYm9zeAorCQk7OworCWRweDIqIHwgZHB4MiotYnVsbCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKKwkJb3M9LXN5c3YzCisJCTs7CisJZWJtb24yOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LWVibW9uCisJCTs7CisJZWx4c2kpCisJCWJhc2ljX21hY2hpbmU9ZWx4c2ktZWx4c2kKKwkJb3M9LWJzZAorCQk7OworCWVuY29yZSB8IHVtYXggfCBtbWF4KQorCQliYXNpY19tYWNoaW5lPW5zMzJrLWVuY29yZQorCQk7OworCWVzMTgwMCB8IE9TRTY4ayB8IG9zZTY4ayB8IG9zZSB8IE9TRSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWVyaWNzc29uCisJCW9zPS1vc2UKKwkJOzsKKwlmeDI4MDApCisJCWJhc2ljX21hY2hpbmU9aTg2MC1hbGxpYW50CisJCTs7CisJZ2VuaXgpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstbnMKKwkJOzsKKwlnbWljcm8pCisJCWJhc2ljX21hY2hpbmU9dHJvbi1nbWljcm8KKwkJb3M9LXN5c3YKKwkJOzsKKwlnbzMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LWdvMzIKKwkJOzsKKwloMzA1MHIqIHwgaGl1eCopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCisJCW9zPS1oaXV4d2UyCisJCTs7CisJaDgzMDBobXMpCisJCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJaDgzMDB4cmF5KQorCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKKwkJb3M9LXhyYXkKKwkJOzsKKwloODUwMGhtcykKKwkJYmFzaWNfbWFjaGluZT1oODUwMC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwloYXJyaXMpCisJCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKKwkJb3M9LXN5c3YzCisJCTs7CisJaHAzMDAtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCTs7CisJaHAzMDBic2QpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQlvcz0tYnNkCisJCTs7CisJaHAzMDBocHV4KQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJb3M9LWhwdXgKKwkJOzsKKwlocDNrOVswLTldWzAtOV0gfCBocDlbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocDlrMlswLTldWzAtOV0gfCBocDlrMzFbMC05XSkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtaHAKKwkJOzsKKwlocDlrM1syLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQk7OworCWhwOWs2WzAtOV1bMC05XSB8IGhwNlswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwOWs3WzAtNzldWzAtOV0gfCBocDdbMC03OV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azc4WzAtOV0gfCBocDc4WzAtOV0pCisJCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzY3XTEgfCBocDhbNjddMSB8IGhwOWs4MFsyNF0gfCBocDgwWzI0XSB8IGhwOWs4Wzc4XTkgfCBocDhbNzhdOSB8IGhwOWs4OTMgfCBocDg5MykKKwkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbMC05XVsxMzY3OV0gfCBocDhbMC05XVsxMzY3OV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzAtOV1bMC05XSB8IGhwOFswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwcGEtbmV4dCkKKwkJb3M9LW5leHRzdGVwMworCQk7OworCWhwcGFvc2YpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQlvcz0tb3NmCisJCTs7CisJaHBwcm8pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQlvcz0tcHJvZWxmCisJCTs7CisJaTM3MC1pYm0qIHwgaWJtKikKKwkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQorCQk7OworIyBJJ20gbm90IHN1cmUgd2hhdCAiU3lzdjMyIiBtZWFucy4gIFNob3VsZCB0aGlzIGJlIHN5c3YzLjI/CisJaSo4NnYzMikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2MzIKKwkJOzsKKwlpKjg2djQqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3Y0CisJCTs7CisJaSo4NnYpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdgorCQk7OworCWkqODZzb2wyKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJaTM4Nm1hY2gpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1tYWNoCisJCW9zPS1tYWNoCisJCTs7CisJaTM4Ni12c3RhIHwgdnN0YSkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KKwkJb3M9LXZzdGEKKwkJOzsKKwlpcmlzIHwgaXJpczRkKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc2dpCisJCWNhc2UgJG9zIGluCisJCSAgICAtaXJpeCopCisJCQk7OworCQkgICAgKikKKwkJCW9zPS1pcml4NAorCQkJOzsKKwkJZXNhYworCQk7OworCWlzaTY4IHwgaXNpKQorCQliYXNpY19tYWNoaW5lPW02OGstaXNpCisJCW9zPS1zeXN2CisJCTs7CisJbTg4ay1vbXJvbiopCisJCWJhc2ljX21hY2hpbmU9bTg4ay1vbXJvbgorCQk7OworCW1hZ251bSB8IG0zMjMwKQorCQliYXNpY19tYWNoaW5lPW1pcHMtbWlwcworCQlvcz0tc3lzdgorCQk7OworCW1lcmxpbikKKwkJYmFzaWNfbWFjaGluZT1uczMyay11dGVrCisJCW9zPS1zeXN2CisJCTs7CisJbWluZ3czMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1taW5ndzMyCisJCTs7CisJbWluaWZyYW1lKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1jb252ZXJnZW50CisJCTs7CisJKm1pbnQgfCAtbWludFswLTldKiB8ICpNaU5UIHwgKk1pTlRbMC05XSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQorCQlvcz0tbWludAorCQk7OworCW1pcHMzKi0qKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYAorCQk7OworCW1pcHMzKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AtdW5rbm93bgorCQk7OworCW1vbml0b3IpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKKwkJb3M9LWNvZmYKKwkJOzsKKwltb3JwaG9zKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgorCQlvcz0tbW9ycGhvcworCQk7OworCW1zZG9zKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LW1zZG9zCisJCTs7CisJbXMxLSopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbXMxLS9tdC0vJ2AKKwkJOzsKKwltdnMpCisJCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KKwkJb3M9LW12cworCQk7OworCW5jcjMwMDApCisJCWJhc2ljX21hY2hpbmU9aTQ4Ni1uY3IKKwkJb3M9LXN5c3Y0CisJCTs7CisJbmV0YnNkMzg2KQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tbmV0YnNkCisJCTs7CisJbmV0d2luZGVyKQorCQliYXNpY19tYWNoaW5lPWFybXY0bC1yZWJlbAorCQlvcz0tbGludXgKKwkJOzsKKwluZXdzIHwgbmV3czcwMCB8IG5ld3M4MDAgfCBuZXdzOTAwKQorCQliYXNpY19tYWNoaW5lPW02OGstc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmV3czEwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4MDMwLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5ld3MtMzYwMCB8IHJpc2MtbmV3cykKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5lY3Y3MCkKKwkJYmFzaWNfbWFjaGluZT12NzAtbmVjCisJCW9zPS1zeXN2CisJCTs7CisJbmV4dCB8IG0qLW5leHQgKQorCQliYXNpY19tYWNoaW5lPW02OGstbmV4dAorCQljYXNlICRvcyBpbgorCQkgICAgLW5leHRzdGVwKiApCisJCQk7OworCQkgICAgLW5zMiopCisJCSAgICAgIG9zPS1uZXh0c3RlcDIKKwkJCTs7CisJCSAgICAqKQorCQkgICAgICBvcz0tbmV4dHN0ZXAzCisJCQk7OworCQllc2FjCisJCTs7CisJbmgzMDAwKQorCQliYXNpY19tYWNoaW5lPW02OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmhbNDVdMDAwKQorCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmluZHk5NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAorCQlvcz0tbmluZHkKKwkJOzsKKwltb245NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAorCQlvcz0tbW9uOTYwCisJCTs7CisJbm9uc3RvcHV4KQorCQliYXNpY19tYWNoaW5lPW1pcHMtY29tcGFxCisJCW9zPS1ub25zdG9wdXgKKwkJOzsKKwlucDEpCisJCWJhc2ljX21hY2hpbmU9bnAxLWdvdWxkCisJCTs7CisJbnNyLXRhbmRlbSkKKwkJYmFzaWNfbWFjaGluZT1uc3ItdGFuZGVtCisJCTs7CisJb3A1MG4tKiB8IG9wNjBjLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJb3M9LXByb2VsZgorCQk7OworCW9wZW5yaXNjIHwgb3BlbnJpc2MtKikKKwkJYmFzaWNfbWFjaGluZT1vcjMyLXVua25vd24KKwkJOzsKKwlvczQwMCkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWlibQorCQlvcz0tb3M0MDAKKwkJOzsKKwlPU0U2ODAwMCB8IG9zZTY4MDAwKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1lcmljc3NvbgorCQlvcz0tb3NlCisJCTs7CisJb3M2OGspCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ub25lCisJCW9zPS1vczY4aworCQk7OworCXBhLWhpdGFjaGkpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCisJCW9zPS1oaXV4d2UyCisJCTs7CisJcGFyYWdvbikKKwkJYmFzaWNfbWFjaGluZT1pODYwLWludGVsCisJCW9zPS1vc2YKKwkJOzsKKwlwYmQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtdHRpCisJCTs7CisJcGJiKQorCQliYXNpY19tYWNoaW5lPW02OGstdHRpCisJCTs7CisJcGM1MzIgfCBwYzUzMi0qKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXBjNTMyCisJCTs7CisJcGM5OCkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCTs7CisJcGM5OC0qKQorCQliYXNpY19tYWNoaW5lPWkzODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtIHwgcDUgfCBrNSB8IGs2IHwgbmV4Z2VuIHwgdmlhYzMpCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1wYworCQk7OworCXBlbnRpdW1wcm8gfCBwNiB8IDZ4ODYgfCBhdGhsb24gfCBhdGhsb25fKikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCTs7CisJcGVudGl1bWlpIHwgcGVudGl1bTIgfCBwZW50aXVtaWlpIHwgcGVudGl1bTMpCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQk7OworCXBlbnRpdW00KQorCQliYXNpY19tYWNoaW5lPWk3ODYtcGMKKwkJOzsKKwlwZW50aXVtLSogfCBwNS0qIHwgazUtKiB8IGs2LSogfCBuZXhnZW4tKiB8IHZpYWMzLSopCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW1wcm8tKiB8IHA2LSogfCA2eDg2LSogfCBhdGhsb24tKikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bWlpLSogfCBwZW50aXVtMi0qIHwgcGVudGl1bWlpaS0qIHwgcGVudGl1bTMtKikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bTQtKikKKwkJYmFzaWNfbWFjaGluZT1pNzg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcG4pCisJCWJhc2ljX21hY2hpbmU9cG4tZ291bGQKKwkJOzsKKwlwb3dlcikJYmFzaWNfbWFjaGluZT1wb3dlci1pYm0KKwkJOzsKKwlwcGMpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCisJCTs7CisJcHBjLSopCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBwY2xlIHwgcG93ZXJwY2xpdHRsZSB8IHBwYy1sZSB8IHBvd2VycGMtbGl0dGxlKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS11bmtub3duCisJCTs7CisJcHBjbGUtKiB8IHBvd2VycGNsaXR0bGUtKikKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGM2NCkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjQtdW5rbm93bgorCQk7OworCXBwYzY0LSopIGJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHBjNjRsZSB8IHBvd2VycGM2NGxpdHRsZSB8IHBwYzY0LWxlIHwgcG93ZXJwYzY0LWxpdHRsZSkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjRsZS11bmtub3duCisJCTs7CisJcHBjNjRsZS0qIHwgcG93ZXJwYzY0bGl0dGxlLSopCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwczIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1pYm0KKwkJOzsKKwlwdzMyKQorCQliYXNpY19tYWNoaW5lPWk1ODYtdW5rbm93bgorCQlvcz0tcHczMgorCQk7OworCXJkb3MpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tcmRvcworCQk7OworCXJvbTY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4aworCQlvcz0tY29mZgorCQk7OworCXJtWzQ2XTAwKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc2llbWVucworCQk7OworCXJ0cGMgfCBydHBjLSopCisJCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KKwkJOzsKKwlzMzkwIHwgczM5MC0qKQorCQliYXNpY19tYWNoaW5lPXMzOTAtaWJtCisJCTs7CisJczM5MHggfCBzMzkweC0qKQorCQliYXNpY19tYWNoaW5lPXMzOTB4LWlibQorCQk7OworCXNhMjkyMDApCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworCXNiMSkKKwkJYmFzaWNfbWFjaGluZT1taXBzaXNhNjRzYjEtdW5rbm93bgorCQk7OworCXNiMWVsKQorCQliYXNpY19tYWNoaW5lPW1pcHNpc2E2NHNiMWVsLXVua25vd24KKwkJOzsKKwlzZGUpCisJCWJhc2ljX21hY2hpbmU9bWlwc2lzYTMyLXNkZQorCQlvcz0tZWxmCisJCTs7CisJc2VpKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc2VpCisJCW9zPS1zZWl1eAorCQk7OworCXNlcXVlbnQpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50CisJCTs7CisJc2gpCisJCWJhc2ljX21hY2hpbmU9c2gtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJc2g2NCkKKwkJYmFzaWNfbWFjaGluZT1zaDY0LXVua25vd24KKwkJOzsKKwlzcGFyY2xpdGUtd3JzIHwgc2ltc28td3JzKQorCQliYXNpY19tYWNoaW5lPXNwYXJjbGl0ZS13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwlzcHM3KQorCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAorCQlvcz0tc3lzdjIKKwkJOzsKKwlzcHVyKQorCQliYXNpY19tYWNoaW5lPXNwdXItdW5rbm93bgorCQk7OworCXN0MjAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXRhbmRlbQorCQk7OworCXN0cmF0dXMpCisJCWJhc2ljX21hY2hpbmU9aTg2MC1zdHJhdHVzCisJCW9zPS1zeXN2NAorCQk7OworCXN1bjIpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgorCQk7OworCXN1bjJvczMpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgorCQlvcz0tc3Vub3MzCisJCTs7CisJc3VuMm9zNCkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCW9zPS1zdW5vczQKKwkJOzsKKwlzdW4zb3MzKQorCQliYXNpY19tYWNoaW5lPW02OGstc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW4zb3M0KQorCQliYXNpY19tYWNoaW5lPW02OGstc3VuCisJCW9zPS1zdW5vczQKKwkJOzsKKwlzdW40b3MzKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQlvcz0tc3Vub3MzCisJCTs7CisJc3VuNG9zNCkKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjRzb2wyKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQlvcz0tc29sYXJpczIKKwkJOzsKKwlzdW4zIHwgc3VuMy0qKQorCQliYXNpY19tYWNoaW5lPW02OGstc3VuCisJCTs7CisJc3VuNCkKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJOzsKKwlzdW4zODYgfCBzdW4zODZpIHwgcm9hZHJ1bm5lcikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXN1bgorCQk7OworCXN2MSkKKwkJYmFzaWNfbWFjaGluZT1zdjEtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJc3ltbWV0cnkpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50CisJCW9zPS1keW5peAorCQk7OworCXQzZSkKKwkJYmFzaWNfbWFjaGluZT1hbHBoYWV2NS1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwl0OTApCisJCWJhc2ljX21hY2hpbmU9dDkwLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXRpYzU0eCB8IGM1NHgqKQorCQliYXNpY19tYWNoaW5lPXRpYzU0eC11bmtub3duCisJCW9zPS1jb2ZmCisJCTs7CisJdGljNTV4IHwgYzU1eCopCisJCWJhc2ljX21hY2hpbmU9dGljNTV4LXVua25vd24KKwkJb3M9LWNvZmYKKwkJOzsKKwl0aWM2eCB8IGM2eCopCisJCWJhc2ljX21hY2hpbmU9dGljNngtdW5rbm93bgorCQlvcz0tY29mZgorCQk7OworCXR4MzkpCisJCWJhc2ljX21hY2hpbmU9bWlwc3R4MzktdW5rbm93bgorCQk7OworCXR4MzllbCkKKwkJYmFzaWNfbWFjaGluZT1taXBzdHgzOWVsLXVua25vd24KKwkJOzsKKwl0b2FkMSkKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC14a2wKKwkJb3M9LXRvcHMyMAorCQk7OworCXRvd2VyIHwgdG93ZXItMzIpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1uY3IKKwkJOzsKKwl0cGYpCisJCWJhc2ljX21hY2hpbmU9czM5MHgtaWJtCisJCW9zPS10cGYKKwkJOzsKKwl1ZGkyOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworCXVsdHJhMykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLW55dQorCQlvcz0tc3ltMQorCQk7OworCXY4MTAgfCBuZWN2ODEwKQorCQliYXNpY19tYWNoaW5lPXY4MTAtbmVjCisJCW9zPS1ub25lCisJCTs7CisJdmF4dikKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCW9zPS1zeXN2CisJCTs7CisJdm1zKQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJb3M9LXZtcworCQk7OworCXZwcCp8dnh8dngtKikKKwkJYmFzaWNfbWFjaGluZT1mMzAxLWZ1aml0c3UKKwkJOzsKKwl2eHdvcmtzOTYwKQorCQliYXNpY19tYWNoaW5lPWk5NjAtd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJdnh3b3JrczY4KQorCQliYXNpY19tYWNoaW5lPW02OGstd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJdnh3b3JrczI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXc2NSopCisJCWJhc2ljX21hY2hpbmU9dzY1LXdkYworCQlvcz0tbm9uZQorCQk7OworCXc4OWstKikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKKwkJb3M9LXByb2VsZgorCQk7OworCXhib3gpCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQlvcz0tbWluZ3czMgorCQk7OworCXhwcyB8IHhwczEwMCkKKwkJYmFzaWNfbWFjaGluZT14cHMxMDAtaG9uZXl3ZWxsCisJCTs7CisJeW1wKQorCQliYXNpY19tYWNoaW5lPXltcC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwl6OGstKi1jb2ZmKQorCQliYXNpY19tYWNoaW5lPXo4ay11bmtub3duCisJCW9zPS1zaW0KKwkJOzsKKwlub25lKQorCQliYXNpY19tYWNoaW5lPW5vbmUtbm9uZQorCQlvcz0tbm9uZQorCQk7OworCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG1hbnVmYWN0dXJlciBvZiBjZXJ0YWluIENQVSB0eXBlcy4gIEl0IGlzIGluCisjIHNvbWUgY2FzZXMgdGhlIG9ubHkgbWFudWZhY3R1cmVyLCBpbiBvdGhlcnMsIGl0IGlzIHRoZSBtb3N0IHBvcHVsYXIuCisJdzg5aykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKKwkJOzsKKwlvcDUwbikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQorCQk7OworCW9wNjBjKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCisJCTs7CisJcm9tcCkKKwkJYmFzaWNfbWFjaGluZT1yb21wLWlibQorCQk7OworCW1taXgpCisJCWJhc2ljX21hY2hpbmU9bW1peC1rbnV0aAorCQk7OworCXJzNjAwMCkKKwkJYmFzaWNfbWFjaGluZT1yczYwMDAtaWJtCisJCTs7CisJdmF4KQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJOzsKKwlwZHAxMCkKKwkJIyB0aGVyZSBhcmUgbWFueSBjbG9uZXMsIHNvIERFQyBpcyBub3QgYSBzYWZlIGJldAorCQliYXNpY19tYWNoaW5lPXBkcDEwLXVua25vd24KKwkJOzsKKwlwZHAxMSkKKwkJYmFzaWNfbWFjaGluZT1wZHAxMS1kZWMKKwkJOzsKKwl3ZTMyaykKKwkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKKwkJOzsKKwlzaFsxMjM0XSB8IHNoWzI0XWEgfCBzaFszNF1lYiB8IHNoWzEyMzRdbGUgfCBzaFsyM11lbGUpCisJCWJhc2ljX21hY2hpbmU9c2gtdW5rbm93bgorCQk7OworCXNwYXJjIHwgc3BhcmN2OCB8IHNwYXJjdjkgfCBzcGFyY3Y5YiB8IHNwYXJjdjl2KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQk7OworCWN5ZHJhKQorCQliYXNpY19tYWNoaW5lPWN5ZHJhLWN5ZHJvbWUKKwkJOzsKKwlvcmlvbikKKwkJYmFzaWNfbWFjaGluZT1vcmlvbi1oaWdobGV2ZWwKKwkJOzsKKwlvcmlvbjEwNSkKKwkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWhpZ2hsZXZlbAorCQk7OworCW1hYyB8IG1wdyB8IG1hYy1tcHcpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQorCQk7OworCXBtYWMgfCBwbWFjLW1wdykKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWFwcGxlCisJCTs7CisJKi11bmtub3duKQorCQkjIE1ha2Ugc3VyZSB0byBtYXRjaCBhbiBhbHJlYWR5LWNhbm9uaWNhbGl6ZWQgbWFjaGluZSBuYW1lLgorCQk7OworCSopCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKK2VzYWMKKworIyBIZXJlIHdlIGNhbm9uaWNhbGl6ZSBjZXJ0YWluIGFsaWFzZXMgZm9yIG1hbnVmYWN0dXJlcnMuCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJKi1kaWdpdGFsKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9kaWdpdGFsLiovZGVjLydgCisJCTs7CisJKi1jb21tb2RvcmUqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2NvbW1vZG9yZS4qL2NibS8nYAorCQk7OworCSopCisJCTs7Citlc2FjCisKKyMgRGVjb2RlIG1hbnVmYWN0dXJlci1zcGVjaWZpYyBhbGlhc2VzIGZvciBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgorCitpZiBbIHgiJG9zIiAhPSB4IiIgXQordGhlbgorY2FzZSAkb3MgaW4KKyAgICAgICAgIyBGaXJzdCBtYXRjaCBzb21lIHN5c3RlbSB0eXBlIGFsaWFzZXMKKyAgICAgICAgIyB0aGF0IG1pZ2h0IGdldCBjb25mdXNlZCB3aXRoIHZhbGlkIHN5c3RlbSB0eXBlcy4KKwkjIC1zb2xhcmlzKiBpcyBhIGJhc2ljIHN5c3RlbSB0eXBlLCB3aXRoIHRoaXMgb25lIGV4Y2VwdGlvbi4KKwktc29sYXJpczEgfCAtc29sYXJpczEuKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNvbGFyaXMxfHN1bm9zNHwnYAorCQk7OworCS1zb2xhcmlzKQorCQlvcz0tc29sYXJpczIKKwkJOzsKKwktc3ZyNCopCisJCW9zPS1zeXN2NAorCQk7OworCS11bml4d2FyZSopCisJCW9zPS1zeXN2NC4ydXcKKwkJOzsKKwktZ251L2xpbnV4KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGdudS9saW51eHxsaW51eC1nbnV8J2AKKwkJOzsKKwkjIEZpcnN0IGFjY2VwdCB0aGUgYmFzaWMgc3lzdGVtIHR5cGVzLgorCSMgVGhlIHBvcnRhYmxlIHN5c3RlbXMgY29tZXMgZmlyc3QuCisJIyBFYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOIEEgKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KKwkjIC1zeXN2KiBpcyBub3QgaGVyZSBiZWNhdXNlIGl0IGNvbWVzIGxhdGVyLCBhZnRlciBzeXN2cjQuCisJLWdudSogfCAtYnNkKiB8IC1tYWNoKiB8IC1taW5peCogfCAtZ2VuaXgqIHwgLXVsdHJpeCogfCAtaXJpeCogXAorCSAgICAgIHwgLSp2bXMqIHwgLXNjbyogfCAtZXNpeCogfCAtaXNjKiB8IC1haXgqIHwgLXN1bm9zIHwgLXN1bm9zWzM0XSpcCisJICAgICAgfCAtaHB1eCogfCAtdW5vcyogfCAtb3NmKiB8IC1sdW5hKiB8IC1kZ3V4KiB8IC1zb2xhcmlzKiB8IC1zeW0qIFwKKwkgICAgICB8IC1hbWlnYW9zKiB8IC1hbWlnYWRvcyogfCAtbXNkb3MqIHwgLW5ld3NvcyogfCAtdW5pY29zKiB8IC1hb2YqIFwKKwkgICAgICB8IC1hb3MqIFwKKwkgICAgICB8IC1uaW5keSogfCAtdnhzaW0qIHwgLXZ4d29ya3MqIHwgLWVibW9uKiB8IC1obXMqIHwgLW12cyogXAorCSAgICAgIHwgLWNsaXgqIHwgLXJpc2NvcyogfCAtdW5pcGx1cyogfCAtaXJpcyogfCAtcnR1KiB8IC14ZW5peCogXAorCSAgICAgIHwgLWhpdXgqIHwgLTM4NmJzZCogfCAta25ldGJzZCogfCAtbWlyYnNkKiB8IC1uZXRic2QqIFwKKwkgICAgICB8IC1vcGVuYnNkKiB8IC1zb2xpZGJzZCogXAorCSAgICAgIHwgLWVra29ic2QqIHwgLWtmcmVlYnNkKiB8IC1mcmVlYnNkKiB8IC1yaXNjaXgqIHwgLWx5bnhvcyogXAorCSAgICAgIHwgLWJvc3gqIHwgLW5leHRzdGVwKiB8IC1jeHV4KiB8IC1hb3V0KiB8IC1lbGYqIHwgLW9hYmkqIFwKKwkgICAgICB8IC1wdHgqIHwgLWNvZmYqIHwgLWVjb2ZmKiB8IC13aW5udCogfCAtZG9tYWluKiB8IC12c3RhKiBcCisJICAgICAgfCAtdWRpKiB8IC1lYWJpKiB8IC1saXRlcyogfCAtaWVlZSogfCAtZ28zMiogfCAtYXV4KiBcCisJICAgICAgfCAtY2hvcnVzb3MqIHwgLWNob3J1c3JkYiogXAorCSAgICAgIHwgLWN5Z3dpbiogfCAtcGUqIHwgLXBzb3MqIHwgLW1vc3MqIHwgLXByb2VsZiogfCAtcnRlbXMqIFwKKwkgICAgICB8IC1taW5ndzMyKiB8IC1saW51eC1nbnUqIHwgLWxpbnV4LW5ld2xpYiogfCAtbGludXgtdWNsaWJjKiBcCisJICAgICAgfCAtdXhwdiogfCAtYmVvcyogfCAtbXBlaXgqIHwgLXVkayogXAorCSAgICAgIHwgLWludGVyaXgqIHwgLXV3aW4qIHwgLW1rcyogfCAtcmhhcHNvZHkqIHwgLWRhcndpbiogfCAtb3BlbmVkKiBcCisJICAgICAgfCAtb3BlbnN0ZXAqIHwgLW9za2l0KiB8IC1jb25peCogfCAtcHczMiogfCAtbm9uc3RvcHV4KiBcCisJICAgICAgfCAtc3Rvcm0tY2hhb3MqIHwgLXRvcHMxMCogfCAtdGVuZXgqIHwgLXRvcHMyMCogfCAtaXRzKiBcCisJICAgICAgfCAtb3MyKiB8IC12b3MqIHwgLXBhbG1vcyogfCAtdWNsaW51eCogfCAtbnVjbGV1cyogXAorCSAgICAgIHwgLW1vcnBob3MqIHwgLXN1cGVydXgqIHwgLXJ0bWsqIHwgLXJ0bWstbm92YSogfCAtd2luZGlzcyogXAorCSAgICAgIHwgLXBvd2VybWF4KiB8IC1kbml4KiB8IC1ueDYgfCAtbng3IHwgLXNlaSogfCAtZHJhZ29uZmx5KiBcCisJICAgICAgfCAtc2t5b3MqIHwgLWhhaWt1KiB8IC1yZG9zKiB8IC10b3BwZXJzKikKKwkjIFJlbWVtYmVyLCBlYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCisJCTs7CisJLXFueCopCisJCWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkJICAgIHg4Ni0qIHwgaSo4Ni0qKQorCQkJOzsKKwkJICAgICopCisJCQlvcz0tbnRvJG9zCisJCQk7OworCQllc2FjCisJCTs7CisJLW50by1xbngqKQorCQk7OworCS1udG8qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bnRvfG50by1xbnh8J2AKKwkJOzsKKwktc2ltIHwgLWVzMTgwMCogfCAtaG1zKiB8IC14cmF5IHwgLW9zNjhrKiB8IC1ub25lKiB8IC12ODhyKiBcCisJICAgICAgfCAtd2luZG93cyogfCAtb3N4IHwgLWFidWcgfCAtbmV0d2FyZSogfCAtb3M5KiB8IC1iZW9zKiB8IC1oYWlrdSogXAorCSAgICAgIHwgLW1hY29zKiB8IC1tcHcqIHwgLW1hZ2ljKiB8IC1tbWl4d2FyZSogfCAtbW9uOTYwKiB8IC1sbmV3cyopCisJCTs7CisJLW1hYyopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xtYWN8bWFjb3N8J2AKKwkJOzsKKwktbGludXgtZGlldGxpYmMpCisJCW9zPS1saW51eC1kaWV0bGliYworCQk7OworCS1saW51eCopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xsaW51eHxsaW51eC1nbnV8J2AKKwkJOzsKKwktc3Vub3M1KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNXxzb2xhcmlzMnwnYAorCQk7OworCS1zdW5vczYqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M2fHNvbGFyaXMzfCdgCisJCTs7CisJLW9wZW5lZCopCisJCW9zPS1vcGVuZWRpdGlvbgorCQk7OworICAgICAgICAtb3M0MDAqKQorCQlvcz0tb3M0MDAKKwkJOzsKKwktd2luY2UqKQorCQlvcz0td2luY2UKKwkJOzsKKwktb3Nmcm9zZSopCisJCW9zPS1vc2Zyb3NlCisJCTs7CisJLW9zZiopCisJCW9zPS1vc2YKKwkJOzsKKwktdXRlayopCisJCW9zPS1ic2QKKwkJOzsKKwktZHluaXgqKQorCQlvcz0tYnNkCisJCTs7CisJLWFjaXMqKQorCQlvcz0tYW9zCisJCTs7CisJLWF0aGVvcyopCisJCW9zPS1hdGhlb3MKKwkJOzsKKwktc3lsbGFibGUqKQorCQlvcz0tc3lsbGFibGUKKwkJOzsKKwktMzg2YnNkKQorCQlvcz0tYnNkCisJCTs7CisJLWN0aXgqIHwgLXV0cyopCisJCW9zPS1zeXN2CisJCTs7CisJLW5vdmEqKQorCQlvcz0tcnRtay1ub3ZhCisJCTs7CisJLW5zMiApCisJCW9zPS1uZXh0c3RlcDIKKwkJOzsKKwktbnNrKikKKwkJb3M9LW5zaworCQk7OworCSMgUHJlc2VydmUgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHNpbml4NS4KKwktc2luaXg1LiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzaW5peHxzeXN2fCdgCisJCTs7CisJLXNpbml4KikKKwkJb3M9LXN5c3Y0CisJCTs7CisgICAgICAgIC10cGYqKQorCQlvcz0tdHBmCisJCTs7CisJLXRyaXRvbiopCisJCW9zPS1zeXN2MworCQk7OworCS1vc3MqKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktc3ZyNCkKKwkJb3M9LXN5c3Y0CisJCTs7CisJLXN2cjMpCisJCW9zPS1zeXN2MworCQk7OworCS1zeXN2cjQpCisJCW9zPS1zeXN2NAorCQk7OworCSMgVGhpcyBtdXN0IGNvbWUgYWZ0ZXIgLXN5c3ZyNC4KKwktc3lzdiopCisJCTs7CisJLW9zZSopCisJCW9zPS1vc2UKKwkJOzsKKwktZXMxODAwKikKKwkJb3M9LW9zZQorCQk7OworCS14ZW5peCkKKwkJb3M9LXhlbml4CisJCTs7CisJLSptaW50IHwgLW1pbnRbMC05XSogfCAtKk1pTlQgfCAtTWlOVFswLTldKikKKwkJb3M9LW1pbnQKKwkJOzsKKwktYXJvcyopCisJCW9zPS1hcm9zCisJCTs7CisJLWthb3MqKQorCQlvcz0ta2FvcworCQk7OworCS16dm1vZSkKKwkJb3M9LXp2bW9lCisJCTs7CisJLW5vbmUpCisJCTs7CisJKikKKwkJIyBHZXQgcmlkIG9mIHRoZSBgLScgYXQgdGhlIGJlZ2lubmluZyBvZiAkb3MuCisJCW9zPWBlY2hvICRvcyB8IHNlZCAncy9bXi1dKi0vLydgCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogc3lzdGVtIFxgJG9zXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKK2VzYWMKK2Vsc2UKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyB0aGF0IGNvbWUgd2l0aCB2YXJpb3VzIG1hY2hpbmVzLgorIyBUaGUgdmFsdWUgc2hvdWxkIGJlIHdoYXQgdGhlIHZlbmRvciBjdXJyZW50bHkgc2hpcHMgb3V0IHRoZSBkb29yIHdpdGggdGhlaXIKKyMgbWFjaGluZSBvciBwdXQgYW5vdGhlciB3YXksIHRoZSBtb3N0IHBvcHVsYXIgb3MgcHJvdmlkZWQgd2l0aCB0aGUgbWFjaGluZS4KKworIyBOb3RlIHRoYXQgaWYgeW91J3JlIGdvaW5nIHRvIHRyeSB0byBtYXRjaCAiLU1BTlVGQUNUVVJFUiIgaGVyZSAoc2F5LAorIyAiLXN1biIpLCB0aGVuIHlvdSBoYXZlIHRvIHRlbGwgdGhlIGNhc2Ugc3RhdGVtZW50IHVwIHRvd2FyZHMgdGhlIHRvcAorIyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcgc3lzdGVtLiAgT3RoZXJ3aXNlLCBjb2RlIGFib3ZlCisjIHdpbGwgc2lnbmFsIGFuIGVycm9yIHNheWluZyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcKKyMgc3lzdGVtLCBhbmQgd2UnbGwgbmV2ZXIgZ2V0IHRvIHRoaXMgcG9pbnQuCisKK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKyAgICAgICAgc2NvcmUtKikKKwkJb3M9LWVsZgorCQk7OworICAgICAgICBzcHUtKikKKwkJb3M9LWVsZgorCQk7OworCSotYWNvcm4pCisJCW9zPS1yaXNjaXgxLjIKKwkJOzsKKwlhcm0qLXJlYmVsKQorCQlvcz0tbGludXgKKwkJOzsKKwlhcm0qLXNlbWkpCisJCW9zPS1hb3V0CisJCTs7CisgICAgICAgIGM0eC0qIHwgdGljNHgtKikKKyAgICAgICAgCW9zPS1jb2ZmCisJCTs7CisJIyBUaGlzIG11c3QgY29tZSBiZWZvcmUgdGhlICotZGVjIGVudHJ5LgorCXBkcDEwLSopCisJCW9zPS10b3BzMjAKKwkJOzsKKwlwZHAxMS0qKQorCQlvcz0tbm9uZQorCQk7OworCSotZGVjIHwgdmF4LSopCisJCW9zPS11bHRyaXg0LjIKKwkJOzsKKwltNjgqLWFwb2xsbykKKwkJb3M9LWRvbWFpbgorCQk7OworCWkzODYtc3VuKQorCQlvcz0tc3Vub3M0LjAuMgorCQk7OworCW02ODAwMC1zdW4pCisJCW9zPS1zdW5vczMKKwkJIyBUaGlzIGFsc28gZXhpc3RzIGluIHRoZSBjb25maWd1cmUgcHJvZ3JhbSwgYnV0IHdhcyBub3QgdGhlCisJCSMgZGVmYXVsdC4KKwkJIyBvcz0tc3Vub3M0CisJCTs7CisJbTY4Ki1jaXNjbykKKwkJb3M9LWFvdXQKKwkJOzsKKwltaXBzKi1jaXNjbykKKwkJb3M9LWVsZgorCQk7OworCW1pcHMqLSopCisJCW9zPS1lbGYKKwkJOzsKKwlvcjMyLSopCisJCW9zPS1jb2ZmCisJCTs7CisJKi10dGkpCSMgbXVzdCBiZSBiZWZvcmUgc3BhcmMgZW50cnkgb3Igd2UgZ2V0IHRoZSB3cm9uZyBvcy4KKwkJb3M9LXN5c3YzCisJCTs7CisJc3BhcmMtKiB8ICotc3VuKQorCQlvcz0tc3Vub3M0LjEuMQorCQk7OworCSotYmUpCisJCW9zPS1iZW9zCisJCTs7CisJKi1oYWlrdSkKKwkJb3M9LWhhaWt1CisJCTs7CisJKi1pYm0pCisJCW9zPS1haXgKKwkJOzsKKyAgICAJKi1rbnV0aCkKKwkJb3M9LW1taXh3YXJlCisJCTs7CisJKi13ZWMpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwkqLXdpbmJvbmQpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwkqLW9raSkKKwkJb3M9LXByb2VsZgorCQk7OworCSotaHApCisJCW9zPS1ocHV4CisJCTs7CisJKi1oaXRhY2hpKQorCQlvcz0taGl1eAorCQk7OworCWk4NjAtKiB8ICotYXR0IHwgKi1uY3IgfCAqLWFsdG9zIHwgKi1tb3Rvcm9sYSB8ICotY29udmVyZ2VudCkKKwkJb3M9LXN5c3YKKwkJOzsKKwkqLWNibSkKKwkJb3M9LWFtaWdhb3MKKwkJOzsKKwkqLWRnKQorCQlvcz0tZGd1eAorCQk7OworCSotZG9scGhpbikKKwkJb3M9LXN5c3YzCisJCTs7CisJbTY4ay1jY3VyKQorCQlvcz0tcnR1CisJCTs7CisJbTg4ay1vbXJvbiopCisJCW9zPS1sdW5hCisJCTs7CisJKi1uZXh0ICkKKwkJb3M9LW5leHRzdGVwCisJCTs7CisJKi1zZXF1ZW50KQorCQlvcz0tcHR4CisJCTs7CisJKi1jcmRzKQorCQlvcz0tdW5vcworCQk7OworCSotbnMpCisJCW9zPS1nZW5peAorCQk7OworCWkzNzAtKikKKwkJb3M9LW12cworCQk7OworCSotbmV4dCkKKwkJb3M9LW5leHRzdGVwMworCQk7OworCSotZ291bGQpCisJCW9zPS1zeXN2CisJCTs7CisJKi1oaWdobGV2ZWwpCisJCW9zPS1ic2QKKwkJOzsKKwkqLWVuY29yZSkKKwkJb3M9LWJzZAorCQk7OworCSotc2dpKQorCQlvcz0taXJpeAorCQk7OworCSotc2llbWVucykKKwkJb3M9LXN5c3Y0CisJCTs7CisJKi1tYXNzY29tcCkKKwkJb3M9LXJ0dQorCQk7OworCWYzMFswMV0tZnVqaXRzdSB8IGY3MDAtZnVqaXRzdSkKKwkJb3M9LXV4cHYKKwkJOzsKKwkqLXJvbTY4aykKKwkJb3M9LWNvZmYKKwkJOzsKKwkqLSpidWcpCisJCW9zPS1jb2ZmCisJCTs7CisJKi1hcHBsZSkKKwkJb3M9LW1hY29zCisJCTs7CisJKi1hdGFyaSopCisJCW9zPS1taW50CisJCTs7CisJKikKKwkJb3M9LW5vbmUKKwkJOzsKK2VzYWMKK2ZpCisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2Uga25vdyB0aGUgb3MsIGFuZCB0aGUgQ1BVIHR5cGUsIGJ1dCBub3QgdGhlCisjIG1hbnVmYWN0dXJlci4gIFdlIHBpY2sgdGhlIGxvZ2ljYWwgbWFudWZhY3R1cmVyLgordmVuZG9yPXVua25vd24KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkqLXVua25vd24pCisJCWNhc2UgJG9zIGluCisJCQktcmlzY2l4KikKKwkJCQl2ZW5kb3I9YWNvcm4KKwkJCQk7OworCQkJLXN1bm9zKikKKwkJCQl2ZW5kb3I9c3VuCisJCQkJOzsKKwkJCS1haXgqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLWJlb3MqKQorCQkJCXZlbmRvcj1iZQorCQkJCTs7CisJCQktaHB1eCopCisJCQkJdmVuZG9yPWhwCisJCQkJOzsKKwkJCS1tcGVpeCopCisJCQkJdmVuZG9yPWhwCisJCQkJOzsKKwkJCS1oaXV4KikKKwkJCQl2ZW5kb3I9aGl0YWNoaQorCQkJCTs7CisJCQktdW5vcyopCisJCQkJdmVuZG9yPWNyZHMKKwkJCQk7OworCQkJLWRndXgqKQorCQkJCXZlbmRvcj1kZworCQkJCTs7CisJCQktbHVuYSopCisJCQkJdmVuZG9yPW9tcm9uCisJCQkJOzsKKwkJCS1nZW5peCopCisJCQkJdmVuZG9yPW5zCisJCQkJOzsKKwkJCS1tdnMqIHwgLW9wZW5lZCopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktb3M0MDAqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLXB0eCopCisJCQkJdmVuZG9yPXNlcXVlbnQKKwkJCQk7OworCQkJLXRwZiopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktdnhzaW0qIHwgLXZ4d29ya3MqIHwgLXdpbmRpc3MqKQorCQkJCXZlbmRvcj13cnMKKwkJCQk7OworCQkJLWF1eCopCisJCQkJdmVuZG9yPWFwcGxlCisJCQkJOzsKKwkJCS1obXMqKQorCQkJCXZlbmRvcj1oaXRhY2hpCisJCQkJOzsKKwkJCS1tcHcqIHwgLW1hY29zKikKKwkJCQl2ZW5kb3I9YXBwbGUKKwkJCQk7OworCQkJLSptaW50IHwgLW1pbnRbMC05XSogfCAtKk1pTlQgfCAtTWlOVFswLTldKikKKwkJCQl2ZW5kb3I9YXRhcmkKKwkJCQk7OworCQkJLXZvcyopCisJCQkJdmVuZG9yPXN0cmF0dXMKKwkJCQk7OworCQllc2FjCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgInMvdW5rbm93bi8kdmVuZG9yLyJgCisJCTs7Citlc2FjCisKK2VjaG8gJGJhc2ljX21hY2hpbmUkb3MKK2V4aXQKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCisjIHRpbWUtc3RhbXAtZW5kOiAiJyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvY29uZnRvb2xzL2V4cGF0Lm00IGIvZXhwYXQtMi4wLjEvY29uZnRvb2xzL2V4cGF0Lm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZDQ4NzEKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9jb25mdG9vbHMvZXhwYXQubTQKQEAgLTAsMCArMSw0MyBAQAorZG5sIENoZWNrIGlmIC0td2l0aC1leHBhdFs9UFJFRklYXSBpcyBzcGVjaWZpZWQgYW5kCitkbmwgRXhwYXQgPj0gMS45NS4wIGlzIGluc3RhbGxlZCBpbiB0aGUgc3lzdGVtLgorZG5sIElmIHllcywgc3Vic3RpdHV0ZSBFWFBBVF9DRkxBR1MsIEVYUEFUX0xJQlMgd2l0aCByZWdhcmQgdG8KK2RubCB0aGUgc3BlY2lmaWVkIFBSRUZJWCBhbmQgc2V0IHdpdGhfZXhwYXQgdG8gUFJFRklYLCBvciAneWVzJyBpZiBQUkVGSVgKK2RubCBoYXMgbm90IGJlZW4gc3BlY2lmaWVkLiBBbHNvIEhBVkVfTElCRVhQQVQsIEhBVkVfRVhQQVRfSCBhcmUgZGVmaW5lZC4KK2RubCBJZiAtLXdpdGgtZXhwYXQgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCwgc2V0IHdpdGhfZXhwYXQgdG8gJ25vJy4KK2RubCBJbiBhZGRpdGlvbiwgYW4gQXV0b21ha2UgY29uZGl0aW9uYWwgRVhQQVRfSU5TVEFMTEVEIGlzIHNldCBhY2NvcmRpbmdseS4KK2RubCBUaGlzIGlzIG5lY2Vzc2FyeSB0byBhZGFwdCBhIHdob2xlIGxvdCBvZiBwYWNrYWdlcyB0aGF0IGhhdmUgZXhwYXQKK2RubCBidW5kbGVkIGFzIGEgc3RhdGljIGxpYnJhcnkuCitBQ19ERUZVTihBTV9XSVRIX0VYUEFULAorWyBBQ19BUkdfV0lUSChleHBhdCwKKwkgICAgICBbICAtLXdpdGgtZXhwYXQ9UFJFRklYICAgICBVc2Ugc3lzdGVtIEV4cGF0IGxpYnJhcnldLAorCSAgICAgICwgd2l0aF9leHBhdD1ubykKKworICBBTV9DT05ESVRJT05BTChFWFBBVF9JTlNUQUxMRUQsIHRlc3QgJHdpdGhfZXhwYXQgIT0gbm8pCisKKyAgRVhQQVRfQ0ZMQUdTPQorICBFWFBBVF9MSUJTPQorICBpZiB0ZXN0ICR3aXRoX2V4cGF0ICE9IG5vOyB0aGVuCisJaWYgdGVzdCAkd2l0aF9leHBhdCAhPSB5ZXM7IHRoZW4KKwkJRVhQQVRfQ0ZMQUdTPSItSSR3aXRoX2V4cGF0L2luY2x1ZGUiCisJCUVYUEFUX0xJQlM9Ii1MJHdpdGhfZXhwYXQvbGliIgorCWZpCisJQUNfQ0hFQ0tfTElCKGV4cGF0LCBYTUxfUGFyc2VyQ3JlYXRlLAorCQkgICAgIFsgRVhQQVRfTElCUz0iJEVYUEFUX0xJQlMgLWxleHBhdCIKKwkJICAgICAgIGV4cGF0X2ZvdW5kPXllcyBdLAorCQkgICAgIFsgZXhwYXRfZm91bmQ9bm8gXSwKKwkJICAgICAiJEVYUEFUX0xJQlMiKQorCWlmIHRlc3QgJGV4cGF0X2ZvdW5kID0gbm87IHRoZW4KKwkJQUNfTVNHX0VSUk9SKFtDb3VsZCBub3QgZmluZCB0aGUgRXhwYXQgbGlicmFyeV0pCisJZmkKKwlleHBhdF9zYXZlX0NGTEFHUz0iJENGTEFHUyIKKwlDRkxBR1M9IiRDRkxBR1MgJEVYUEFUX0NGTEFHUyIKKwlBQ19DSEVDS19IRUFERVJTKGV4cGF0LmgsICwgZXhwYXRfZm91bmQ9bm8pCisJaWYgdGVzdCAkZXhwYXRfZm91bmQgPSBubzsgdGhlbgorCQlBQ19NU0dfRVJST1IoW0NvdWxkIG5vdCBmaW5kIGV4cGF0LmhdKQorCWZpCisJQ0ZMQUdTPSIkZXhwYXRfc2F2ZV9DRkxBR1MiCisgIGZpCisKKyAgQUNfU1VCU1QoRVhQQVRfQ0ZMQUdTKQorICBBQ19TVUJTVChFWFBBVF9MSUJTKQorXSkKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2NvbmZ0b29scy9nZXQtdmVyc2lvbi5zaCBiL2V4cGF0LTIuMC4xL2NvbmZ0b29scy9nZXQtdmVyc2lvbi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzBlMGZiCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvY29uZnRvb2xzL2dldC12ZXJzaW9uLnNoCkBAIC0wLDAgKzEsNDYgQEAKKyMhL2Jpbi9zaAorIworIyBVU0FHRTogZ2V0LXZlcnNpb24uc2ggcGF0aC90by9leHBhdC5oCisjCisjIFRoaXMgc2NyaXB0IHdpbGwgcHJpbnQgRXhwYXQncyB2ZXJzaW9uIG51bWJlciBvbiBzdGRvdXQuIEZvciBleGFtcGxlOgorIworIyAgICQgLi9jb25mdG9vbHMvZ2V0LXZlcnNpb24uc2ggLi9saWIvZXhwYXQuaAorIyAgIDEuOTUuMworIyAgICQKKyMKKworaWYgdGVzdCAkIyA9IDA7IHRoZW4KKyAgZWNobyAiRVJST1I6IHBhdGhuYW1lIGZvciBleHBhdC5oIHdhcyBub3QgcHJvdmlkZWQuIgorICBlY2hvICIiCisgIGVjaG8gIlVTQUdFOiAkMCBwYXRoL3RvL2V4cGF0LmgiCisgIGV4aXQgMQorZmkKK2lmIHRlc3QgJCMgIT0gMTsgdGhlbgorICBlY2hvICJFUlJPUjogdG9vIG1hbnkgYXJndW1lbnRzIHdlcmUgcHJvdmlkZWQuIgorICBlY2hvICIiCisgIGVjaG8gIlVTQUdFOiAkMCBwYXRoL3RvL2V4cGF0LmgiCisgIGV4aXQgMQorZmkKKworaGRyPSIkMSIKK2lmIHRlc3QgISAtciAiJGhkciI7IHRoZW4KKyAgZWNobyAiRVJST1I6ICckaGRyJyBkb2VzIG5vdCBleGlzdCwgb3IgaXMgbm90IHJlYWRhYmxlLiIKKyAgZXhpdCAxCitmaQorCitNQUpPUl9WRVJTSU9OPSJgc2VkIC1uIC1lICcvTUFKT1JfVkVSU0lPTi9zL1teMC05XSovL2dwJyAkaGRyYCIKK01JTk9SX1ZFUlNJT049ImBzZWQgLW4gLWUgJy9NSU5PUl9WRVJTSU9OL3MvW14wLTldKi8vZ3AnICRoZHJgIgorTUlDUk9fVkVSU0lPTj0iYHNlZCAtbiAtZSAnL01JQ1JPX1ZFUlNJT04vcy9bXjAtOV0qLy9ncCcgJGhkcmAiCisKKyMgRGV0ZXJtaW5lIGhvdyB0byB0ZWxsIGVjaG8gbm90IHRvIHByaW50IHRoZSB0cmFpbGluZyBcbi4gVGhpcyBpcworIyBzaW1pbGFyIHRvIEF1dG9jb25mJ3MgQEVDSE9fQ0AgYW5kIEBFQ0hPX05AOyBob3dldmVyLCB3ZSBkb24ndAorIyAgZ2VuZXJhdGUgdGhpcyBmaWxlIHZpYSBhdXRvY29uZiAoaW4gZmFjdCwgZ2V0LXZlcnNpb24uc2ggaXMgdXNlZAorIyB0byAqY3JlYXRlKiAuL2NvbmZpZ3VyZSksIHNvIHdlIGp1c3QgZG8gc29tZXRoaW5nIHNpbWlsYXIgaW5saW5lLgorY2FzZSBgZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsM2AsYGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsM2AgaW4KKyAgKmMqLC1uKikgRUNIT19OPSBFQ0hPX0M9JworJyA7OworICAqYyosKiAgKSBFQ0hPX049LW4gRUNIT19DPSA7OworICAqKSAgICAgIEVDSE9fTj0gRUNIT19DPSdcYycgOzsKK2VzYWMKKworZWNobyAkRUNIT19OICIkTUFKT1JfVkVSU0lPTi4kTUlOT1JfVkVSU0lPTi4kTUlDUk9fVkVSU0lPTiRFQ0hPX0MiCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9jb25mdG9vbHMvaW5zdGFsbC1zaCBiL2V4cGF0LTIuMC4xL2NvbmZ0b29scy9pbnN0YWxsLXNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU5ZGUyMzgKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9jb25mdG9vbHMvaW5zdGFsbC1zaApAQCAtMCwwICsxLDI1MSBAQAorIyEvYmluL3NoCisjCisjIGluc3RhbGwgLSBpbnN0YWxsIGEgcHJvZ3JhbSwgc2NyaXB0LCBvciBkYXRhZmlsZQorIyBUaGlzIGNvbWVzIGZyb20gWDExUjUgKG1pdC91dGlsL3NjcmlwdHMvaW5zdGFsbC5zaCkuCisjCisjIENvcHlyaWdodCAxOTkxIGJ5IHRoZSBNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5CisjCisjIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworIyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorIyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworIyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBNLkkuVC4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKKyMgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLAorIyB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBNLkkuVC4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZQorIyBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKKyMgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisjCisjIENhbGxpbmcgdGhpcyBzY3JpcHQgaW5zdGFsbC1zaCBpcyBwcmVmZXJyZWQgb3ZlciBpbnN0YWxsLnNoLCB0byBwcmV2ZW50CisjIGBtYWtlJyBpbXBsaWNpdCBydWxlcyBmcm9tIGNyZWF0aW5nIGEgZmlsZSBjYWxsZWQgaW5zdGFsbCBmcm9tIGl0CisjIHdoZW4gdGhlcmUgaXMgbm8gTWFrZWZpbGUuCisjCisjIFRoaXMgc2NyaXB0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgQlNEIGluc3RhbGwgc2NyaXB0LCBidXQgd2FzIHdyaXR0ZW4KKyMgZnJvbSBzY3JhdGNoLiAgSXQgY2FuIG9ubHkgaW5zdGFsbCBvbmUgZmlsZSBhdCBhIHRpbWUsIGEgcmVzdHJpY3Rpb24KKyMgc2hhcmVkIHdpdGggbWFueSBPUydzIGluc3RhbGwgcHJvZ3JhbXMuCisKKworIyBzZXQgRE9JVFBST0cgdG8gZWNobyB0byB0ZXN0IHRoaXMgc2NyaXB0CisKKyMgRG9uJ3QgdXNlIDotIHNpbmNlIDQuM0JTRCBhbmQgZWFybGllciBzaGVsbHMgZG9uJ3QgbGlrZSBpdC4KK2RvaXQ9IiR7RE9JVFBST0ctfSIKKworCisjIHB1dCBpbiBhYnNvbHV0ZSBwYXRocyBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGVtIGluIHlvdXIgcGF0aDsgb3IgdXNlIGVudi4gdmFycy4KKworbXZwcm9nPSIke01WUFJPRy1tdn0iCitjcHByb2c9IiR7Q1BQUk9HLWNwfSIKK2NobW9kcHJvZz0iJHtDSE1PRFBST0ctY2htb2R9IgorY2hvd25wcm9nPSIke0NIT1dOUFJPRy1jaG93bn0iCitjaGdycHByb2c9IiR7Q0hHUlBQUk9HLWNoZ3JwfSIKK3N0cmlwcHJvZz0iJHtTVFJJUFBST0ctc3RyaXB9Igorcm1wcm9nPSIke1JNUFJPRy1ybX0iCitta2RpcnByb2c9IiR7TUtESVJQUk9HLW1rZGlyfSIKKwordHJhbnNmb3JtYmFzZW5hbWU9IiIKK3RyYW5zZm9ybV9hcmc9IiIKK2luc3RjbWQ9IiRtdnByb2ciCitjaG1vZGNtZD0iJGNobW9kcHJvZyAwNzU1IgorY2hvd25jbWQ9IiIKK2NoZ3JwY21kPSIiCitzdHJpcGNtZD0iIgorcm1jbWQ9IiRybXByb2cgLWYiCittdmNtZD0iJG12cHJvZyIKK3NyYz0iIgorZHN0PSIiCitkaXJfYXJnPSIiCisKK3doaWxlIFsgeCIkMSIgIT0geCBdOyBkbworICAgIGNhc2UgJDEgaW4KKwktYykgaW5zdGNtZD0iJGNwcHJvZyIKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLWQpIGRpcl9hcmc9dHJ1ZQorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktbSkgY2htb2RjbWQ9IiRjaG1vZHByb2cgJDIiCisJICAgIHNoaWZ0CisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1vKSBjaG93bmNtZD0iJGNob3ducHJvZyAkMiIKKwkgICAgc2hpZnQKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLWcpIGNoZ3JwY21kPSIkY2hncnBwcm9nICQyIgorCSAgICBzaGlmdAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktcykgc3RyaXBjbWQ9IiRzdHJpcHByb2ciCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS10PSopIHRyYW5zZm9ybWFyZz1gZWNobyAkMSB8IHNlZCAncy8tdD0vLydgCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1iPSopIHRyYW5zZm9ybWJhc2VuYW1lPWBlY2hvICQxIHwgc2VkICdzLy1iPS8vJ2AKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJKikgIGlmIFsgeCIkc3JjIiA9IHggXQorCSAgICB0aGVuCisJCXNyYz0kMQorCSAgICBlbHNlCisJCSMgdGhpcyBjb2xvbiBpcyB0byB3b3JrIGFyb3VuZCBhIDM4NkJTRCAvYmluL3NoIGJ1ZworCQk6CisJCWRzdD0kMQorCSAgICBmaQorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisgICAgZXNhYworZG9uZQorCitpZiBbIHgiJHNyYyIgPSB4IF0KK3RoZW4KKwllY2hvICJpbnN0YWxsOglubyBpbnB1dCBmaWxlIHNwZWNpZmllZCIKKwlleGl0IDEKK2Vsc2UKKwl0cnVlCitmaQorCitpZiBbIHgiJGRpcl9hcmciICE9IHggXTsgdGhlbgorCWRzdD0kc3JjCisJc3JjPSIiCisJCisJaWYgWyAtZCAkZHN0IF07IHRoZW4KKwkJaW5zdGNtZD06CisJCWNobW9kY21kPSIiCisJZWxzZQorCQlpbnN0Y21kPW1rZGlyCisJZmkKK2Vsc2UKKworIyBXYWl0aW5nIGZvciB0aGlzIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSAiJGluc3RjbWQgJHNyYyAkZHN0dG1wIiBjb21tYW5kCisjIG1pZ2h0IGNhdXNlIGRpcmVjdG9yaWVzIHRvIGJlIGNyZWF0ZWQsIHdoaWNoIHdvdWxkIGJlIGVzcGVjaWFsbHkgYmFkIAorIyBpZiAkc3JjIChhbmQgdGh1cyAkZHN0dG1wKSBjb250YWlucyAnKicuCisKKwlpZiBbIC1mICRzcmMgLW8gLWQgJHNyYyBdCisJdGhlbgorCQl0cnVlCisJZWxzZQorCQllY2hvICJpbnN0YWxsOiAgJHNyYyBkb2VzIG5vdCBleGlzdCIKKwkJZXhpdCAxCisJZmkKKwkKKwlpZiBbIHgiJGRzdCIgPSB4IF0KKwl0aGVuCisJCWVjaG8gImluc3RhbGw6CW5vIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIKKwkJZXhpdCAxCisJZWxzZQorCQl0cnVlCisJZmkKKworIyBJZiBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeSwgYXBwZW5kIHRoZSBpbnB1dCBmaWxlbmFtZTsgaWYgeW91ciBzeXN0ZW0KKyMgZG9lcyBub3QgbGlrZSBkb3VibGUgc2xhc2hlcyBpbiBmaWxlbmFtZXMsIHlvdSBtYXkgbmVlZCB0byBhZGQgc29tZSBsb2dpYworCisJaWYgWyAtZCAkZHN0IF0KKwl0aGVuCisJCWRzdD0iJGRzdCIvYGJhc2VuYW1lICRzcmNgCisJZWxzZQorCQl0cnVlCisJZmkKK2ZpCisKKyMjIHRoaXMgc2VkIGNvbW1hbmQgZW11bGF0ZXMgdGhlIGRpcm5hbWUgY29tbWFuZAorZHN0ZGlyPWBlY2hvICRkc3QgfCBzZWQgLWUgJ3MsW14vXSokLCw7cywvJCwsO3MsXiQsLiwnYAorCisjIE1ha2Ugc3VyZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZXhpc3RzLgorIyAgdGhpcyBwYXJ0IGlzIHRha2VuIGZyb20gTm9haCBGcmllZG1hbidzIG1raW5zdGFsbGRpcnMgc2NyaXB0CisKKyMgU2tpcCBsb3RzIG9mIHN0YXQgY2FsbHMgaW4gdGhlIHVzdWFsIGNhc2UuCitpZiBbICEgLWQgIiRkc3RkaXIiIF07IHRoZW4KK2RlZmF1bHRJRlM9JwkKKycKK0lGUz0iJHtJRlMtJHtkZWZhdWx0SUZTfX0iCisKK29JRlM9IiR7SUZTfSIKKyMgU29tZSBzaCdzIGNhbid0IGhhbmRsZSBJRlM9LyBmb3Igc29tZSByZWFzb24uCitJRlM9JyUnCitzZXQgLSBgZWNobyAke2RzdGRpcn0gfCBzZWQgLWUgJ3NAL0AlQGcnIC1lICdzQF4lQC9AJ2AKK0lGUz0iJHtvSUZTfSIKKworcGF0aGNvbXA9JycKKword2hpbGUgWyAkIyAtbmUgMCBdIDsgZG8KKwlwYXRoY29tcD0iJHtwYXRoY29tcH0kezF9IgorCXNoaWZ0CisKKwlpZiBbICEgLWQgIiR7cGF0aGNvbXB9IiBdIDsKKyAgICAgICAgdGhlbgorCQkkbWtkaXJwcm9nICIke3BhdGhjb21wfSIKKwllbHNlCisJCXRydWUKKwlmaQorCisJcGF0aGNvbXA9IiR7cGF0aGNvbXB9LyIKK2RvbmUKK2ZpCisKK2lmIFsgeCIkZGlyX2FyZyIgIT0geCBdCit0aGVuCisJJGRvaXQgJGluc3RjbWQgJGRzdCAmJgorCisJaWYgWyB4IiRjaG93bmNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG93bmNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgorCWlmIFsgeCIkY2hncnBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hncnBjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKKwlpZiBbIHgiJHN0cmlwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJHN0cmlwY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCisJaWYgWyB4IiRjaG1vZGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG1vZGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaQorZWxzZQorCisjIElmIHdlJ3JlIGdvaW5nIHRvIHJlbmFtZSB0aGUgZmluYWwgZXhlY3V0YWJsZSwgZGV0ZXJtaW5lIHRoZSBuYW1lIG5vdy4KKworCWlmIFsgeCIkdHJhbnNmb3JtYXJnIiA9IHggXSAKKwl0aGVuCisJCWRzdGZpbGU9YGJhc2VuYW1lICRkc3RgCisJZWxzZQorCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0ICR0cmFuc2Zvcm1iYXNlbmFtZSB8IAorCQkJc2VkICR0cmFuc2Zvcm1hcmdgJHRyYW5zZm9ybWJhc2VuYW1lCisJZmkKKworIyBkb24ndCBhbGxvdyB0aGUgc2VkIGNvbW1hbmQgdG8gY29tcGxldGVseSBlbGltaW5hdGUgdGhlIGZpbGVuYW1lCisKKwlpZiBbIHgiJGRzdGZpbGUiID0geCBdIAorCXRoZW4KKwkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdGAKKwllbHNlCisJCXRydWUKKwlmaQorCisjIE1ha2UgYSB0ZW1wIGZpbGUgbmFtZSBpbiB0aGUgcHJvcGVyIGRpcmVjdG9yeS4KKworCWRzdHRtcD0kZHN0ZGlyLyNpbnN0LiQkIworCisjIE1vdmUgb3IgY29weSB0aGUgZmlsZSBuYW1lIHRvIHRoZSB0ZW1wIG5hbWUKKworCSRkb2l0ICRpbnN0Y21kICRzcmMgJGRzdHRtcCAmJgorCisJdHJhcCAicm0gLWYgJHtkc3R0bXB9IiAwICYmCisKKyMgYW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cworCisjIElmIGFueSBvZiB0aGVzZSBmYWlsLCB3ZSBhYm9ydCB0aGUgd2hvbGUgdGhpbmcuICBJZiB3ZSB3YW50IHRvCisjIGlnbm9yZSBlcnJvcnMgZnJvbSBhbnkgb2YgdGhlc2UsIGp1c3QgbWFrZSBzdXJlIG5vdCB0byBpZ25vcmUKKyMgZXJyb3JzIGZyb20gdGhlIGFib3ZlICIkZG9pdCAkaW5zdGNtZCAkc3JjICRkc3R0bXAiIGNvbW1hbmQuCisKKwlpZiBbIHgiJGNob3duY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNob3duY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgorCWlmIFsgeCIkY2hncnBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hncnBjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCisJaWYgWyB4IiRzdHJpcGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRzdHJpcGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKKwlpZiBbIHgiJGNobW9kY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNobW9kY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgorCisjIE5vdyByZW5hbWUgdGhlIGZpbGUgdG8gdGhlIHJlYWwgZGVzdGluYXRpb24uCisKKwkkZG9pdCAkcm1jbWQgLWYgJGRzdGRpci8kZHN0ZmlsZSAmJgorCSRkb2l0ICRtdmNtZCAkZHN0dG1wICRkc3RkaXIvJGRzdGZpbGUgCisKK2ZpICYmCisKKworZXhpdCAwCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9jb25mdG9vbHMvbGlidG9vbC5tNCBiL2V4cGF0LTIuMC4xL2NvbmZ0b29scy9saWJ0b29sLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNTNjYjUKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9jb25mdG9vbHMvbGlidG9vbC5tNApAQCAtMCwwICsxLDYzOTcgQEAKKyMgbGlidG9vbC5tNCAtIENvbmZpZ3VyZSBsaWJ0b29sIGZvciB0aGUgaG9zdCBzeXN0ZW0uIC0qLUF1dG9jb25mLSotCisjIyBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNQorIyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIyBPcmlnaW5hbGx5IGJ5IEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgorIyMKKyMjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCisjIyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKKyMjIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA0OCBBQ19QUk9HX0xJQlRPT0wKKworCisjIEFDX1BST1ZJREVfSUZFTFNFKE1BQ1JPLU5BTUUsIElGLVBST1ZJREVELCBJRi1OT1QtUFJPVklERUQpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIElmIHRoaXMgbWFjcm8gaXMgbm90IGRlZmluZWQgYnkgQXV0b2NvbmYsIGRlZmluZSBpdCBoZXJlLgorbTRfaWZkZWYoW0FDX1BST1ZJREVfSUZFTFNFXSwKKyAgICAgICAgIFtdLAorICAgICAgICAgW200X2RlZmluZShbQUNfUFJPVklERV9JRkVMU0VdLAorCSAgICAgICAgIFttNF9pZmRlZihbQUNfUFJPVklERV8kMV0sCisJCSAgICAgICAgICAgWyQyXSwgWyQzXSldKV0pCisKKworIyBBQ19QUk9HX0xJQlRPT0wKKyMgLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbQUNfUFJPR19MSUJUT09MXSwKK1tBQ19SRVFVSVJFKFtfQUNfUFJPR19MSUJUT09MXSlkbmwKK2RubCBJZiBBQ19QUk9HX0NYWCBoYXMgYWxyZWFkeSBiZWVuIGV4cGFuZGVkLCBydW4gQUNfTElCVE9PTF9DWFgKK2RubCBpbW1lZGlhdGVseSwgb3RoZXJ3aXNlLCBob29rIGl0IGluIGF0IHRoZSBlbmQgb2YgQUNfUFJPR19DWFguCisgIEFDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0NYWF0sCisgICAgW0FDX0xJQlRPT0xfQ1hYXSwKKyAgICBbZGVmaW5lKFtBQ19QUk9HX0NYWF0sIGRlZm4oW0FDX1BST0dfQ1hYXSlbQUNfTElCVE9PTF9DWFgKKyAgXSldKQorZG5sIEFuZCBhIHNpbWlsYXIgc2V0dXAgZm9yIEZvcnRyYW4gNzcgc3VwcG9ydAorICBBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19GNzddLAorICAgIFtBQ19MSUJUT09MX0Y3N10sCisgICAgW2RlZmluZShbQUNfUFJPR19GNzddLCBkZWZuKFtBQ19QUk9HX0Y3N10pW0FDX0xJQlRPT0xfRjc3CitdKV0pCisKK2RubCBRdW90ZSBBXVtNX1BST0dfR0NKIHNvIHRoYXQgYWNsb2NhbCBkb2Vzbid0IGJyaW5nIGl0IGluIG5lZWRsZXNzbHkuCitkbmwgSWYgZWl0aGVyIEFDX1BST0dfR0NKIG9yIEFdW01fUFJPR19HQ0ogaGF2ZSBhbHJlYWR5IGJlZW4gZXhwYW5kZWQsIHJ1bgorZG5sIEFDX0xJQlRPT0xfR0NKIGltbWVkaWF0ZWx5LCBvdGhlcndpc2UsIGhvb2sgaXQgaW4gYXQgdGhlIGVuZCBvZiBib3RoLgorICBBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19HQ0pdLAorICAgIFtBQ19MSUJUT09MX0dDSl0sCisgICAgW0FDX1BST1ZJREVfSUZFTFNFKFtBXVtNX1BST0dfR0NKXSwKKyAgICAgIFtBQ19MSUJUT09MX0dDSl0sCisgICAgICBbQUNfUFJPVklERV9JRkVMU0UoW0xUX0FDX1BST0dfR0NKXSwKKwlbQUNfTElCVE9PTF9HQ0pdLAorICAgICAgW2lmZGVmKFtBQ19QUk9HX0dDSl0sCisJICAgICBbZGVmaW5lKFtBQ19QUk9HX0dDSl0sIGRlZm4oW0FDX1BST0dfR0NKXSlbQUNfTElCVE9PTF9HQ0pdKV0pCisgICAgICAgaWZkZWYoW0FdW01fUFJPR19HQ0pdLAorCSAgICAgW2RlZmluZShbQV1bTV9QUk9HX0dDSl0sIGRlZm4oW0FdW01fUFJPR19HQ0pdKVtBQ19MSUJUT09MX0dDSl0pXSkKKyAgICAgICBpZmRlZihbTFRfQUNfUFJPR19HQ0pdLAorCSAgICAgW2RlZmluZShbTFRfQUNfUFJPR19HQ0pdLAorCQlkZWZuKFtMVF9BQ19QUk9HX0dDSl0pW0FDX0xJQlRPT0xfR0NKXSldKV0pXSkKK10pXSkjIEFDX1BST0dfTElCVE9PTAorCisKKyMgX0FDX1BST0dfTElCVE9PTAorIyAtLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0FDX1BST0dfTElCVE9PTF0sCitbQUNfUkVRVUlSRShbQUNfTElCVE9PTF9TRVRVUF0pZG5sCitBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9DWFhdKWRubAorQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfRjc3XSlkbmwKK0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX0dDSl0pZG5sCisKKyMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKK0xJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRtYWluLnNoIgorCisjIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgorTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCitBQ19TVUJTVChMSUJUT09MKWRubAorCisjIFByZXZlbnQgbXVsdGlwbGUgZXhwYW5zaW9uCitkZWZpbmUoW0FDX1BST0dfTElCVE9PTF0sIFtdKQorXSkjIF9BQ19QUk9HX0xJQlRPT0wKKworCisjIEFDX0xJQlRPT0xfU0VUVVAKKyMgLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0FDX0xJQlRPT0xfU0VUVVBdLAorW0FDX1BSRVJFUSgyLjUwKWRubAorQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NIQVJFRF0pZG5sCitBQ19SRVFVSVJFKFtBQ19FTkFCTEVfU1RBVElDXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19MRF0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0xEX1JFTE9BRF9GTEFHXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAorCitBQ19SRVFVSVJFKFtBQ19QUk9HX0xOX1NdKWRubAorQUNfUkVRVUlSRShbQUNfREVQTElCU19DSEVDS19NRVRIT0RdKWRubAorIyBBdXRvY29uZiAyLjEzJ3MgQUNfT0JKRVhUIGFuZCBBQ19FWEVFWFQgbWFjcm9zIG9ubHkgd29ya3MgZm9yIEMgY29tcGlsZXJzIQorQUNfUkVRVUlSRShbQUNfT0JKRVhUXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0VYRUVYVF0pZG5sCitkbmwKKworQUNfTElCVE9PTF9TWVNfTUFYX0NNRF9MRU4KK0FDX0xJQlRPT0xfU1lTX0dMT0JBTF9TWU1CT0xfUElQRQorQUNfTElCVE9PTF9PQkpESVIKKworQUNfUkVRVUlSRShbX0xUX0FDX1NZU19DT01QSUxFUl0pZG5sCitfTFRfQUNfUFJPR19FQ0hPX0JBQ0tTTEFTSAorCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCisgICMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcworICAjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCisgIGlmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgorICAgIENPTExFQ1RfTkFNRVM9CisgICAgZXhwb3J0IENPTExFQ1RfTkFNRVMKKyAgZmkKKyAgOzsKK2VzYWMKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcworIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KK1hzZWQ9J3NlZCAtZSAxcy9eWC8vJworW3NlZF9xdW90ZV9zdWJzdD0ncy9cKFtcXCJcXGAkXFxcXF1cKS9cXFwxL2cnXQorCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KK1tkb3VibGVfcXVvdGVfc3Vic3Q9J3MvXChbXFwiXFxgXFxcXF1cKS9cXFwxL2cnXQorCisjIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2hlbGwgdmFyaWFibGUgaW4gYQorIyBkb3VibGVfcXVvdGVfc3Vic3QnZWQgc3RyaW5nLgorZGVsYXlfdmFyaWFibGVfc3Vic3Q9J3MvXFxcXFxcXFxcXFwkL1xcXFxcXCQvZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGF2b2lkIGFjY2lkZW50YWwgZ2xvYmJpbmcgaW4gZXZhbGVkIGV4cHJlc3Npb25zCitub19nbG9iX3N1YnN0PSdzL1wqL1xcXCovZycKKworIyBDb25zdGFudHM6CitybT0icm0gLWYiCisKKyMgR2xvYmFsIHZhcmlhYmxlczoKK2RlZmF1bHRfb2ZpbGU9bGlidG9vbAorY2FuX2J1aWxkX3NoYXJlZD15ZXMKKworIyBBbGwga25vd24gbGlua2VycyByZXF1aXJlIGEgYC5hJyBhcmNoaXZlIGZvciBzdGF0aWMgbGlua2luZyAoZXhjZXB0IE1TVkMsCisjIHdoaWNoIG5lZWRzICcubGliJykuCitsaWJleHQ9YQorbHRtYWluPSIkYWNfYXV4X2Rpci9sdG1haW4uc2giCitvZmlsZT0iJGRlZmF1bHRfb2ZpbGUiCit3aXRoX2dudV9sZD0iJGx0X2N2X3Byb2dfZ251X2xkIgorCitBQ19DSEVDS19UT09MKEFSLCBhciwgZmFsc2UpCitBQ19DSEVDS19UT09MKFJBTkxJQiwgcmFubGliLCA6KQorQUNfQ0hFQ0tfVE9PTChTVFJJUCwgc3RyaXAsIDopCisKK29sZF9DQz0iJENDIgorb2xkX0NGTEFHUz0iJENGTEFHUyIKKworIyBTZXQgc2FuZSBkZWZhdWx0cyBmb3IgdmFyaW91cyB2YXJpYWJsZXMKK3Rlc3QgLXogIiRBUiIgJiYgQVI9YXIKK3Rlc3QgLXogIiRBUl9GTEFHUyIgJiYgQVJfRkxBR1M9Y3J1Cit0ZXN0IC16ICIkQVMiICYmIEFTPWFzCit0ZXN0IC16ICIkQ0MiICYmIENDPWNjCit0ZXN0IC16ICIkTFRDQyIgJiYgTFRDQz0kQ0MKK3Rlc3QgLXogIiRMVENGTEFHUyIgJiYgTFRDRkxBR1M9JENGTEFHUwordGVzdCAteiAiJERMTFRPT0wiICYmIERMTFRPT0w9ZGxsdG9vbAordGVzdCAteiAiJExEIiAmJiBMRD1sZAordGVzdCAteiAiJExOX1MiICYmIExOX1M9ImxuIC1zIgordGVzdCAteiAiJE1BR0lDX0NNRCIgJiYgTUFHSUNfQ01EPWZpbGUKK3Rlc3QgLXogIiROTSIgJiYgTk09bm0KK3Rlc3QgLXogIiRTRUQiICYmIFNFRD1zZWQKK3Rlc3QgLXogIiRPQkpEVU1QIiAmJiBPQkpEVU1QPW9iamR1bXAKK3Rlc3QgLXogIiRSQU5MSUIiICYmIFJBTkxJQj06Cit0ZXN0IC16ICIkU1RSSVAiICYmIFNUUklQPToKK3Rlc3QgLXogIiRhY19vYmpleHQiICYmIGFjX29iamV4dD1vCisKKyMgRGV0ZXJtaW5lIGNvbW1hbmRzIHRvIGNyZWF0ZSBvbGQtc3R5bGUgc3RhdGljIGFyY2hpdmVzLgorb2xkX2FyY2hpdmVfY21kcz0nJEFSICRBUl9GTEFHUyAkb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMnCitvbGRfcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNjQ0ICRvbGRsaWInCitvbGRfcG9zdHVuaW5zdGFsbF9jbWRzPQorCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBjYXNlICRob3N0X29zIGluCisgIG9wZW5ic2QqKQorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSIkb2xkX3Bvc3RpbnN0YWxsX2NtZHN+XCRSQU5MSUIgLXQgXCRvbGRsaWIiCisgICAgOzsKKyAgKikKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzflwkUkFOTElCIFwkb2xkbGliIgorICAgIDs7CisgIGVzYWMKKyAgb2xkX2FyY2hpdmVfY21kcz0iJG9sZF9hcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRvbGRsaWIiCitmaQorCitfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCisKKyMgT25seSBwZXJmb3JtIHRoZSBjaGVjayBmb3IgZmlsZSwgaWYgdGhlIGNoZWNrIG1ldGhvZCByZXF1aXJlcyBpdAorY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KK2ZpbGVfbWFnaWMqKQorICBpZiB0ZXN0ICIkZmlsZV9tYWdpY19jbWQiID0gJyRNQUdJQ19DTUQnOyB0aGVuCisgICAgQUNfUEFUSF9NQUdJQworICBmaQorICA7OworZXNhYworCitBQ19QUk9WSURFX0lGRUxTRShbQUNfTElCVE9PTF9ETE9QRU5dLCBlbmFibGVfZGxvcGVuPXllcywgZW5hYmxlX2Rsb3Blbj1ubykKK0FDX1BST1ZJREVfSUZFTFNFKFtBQ19MSUJUT09MX1dJTjMyX0RMTF0sCitlbmFibGVfd2luMzJfZGxsPXllcywgZW5hYmxlX3dpbjMyX2RsbD1ubykKKworQUNfQVJHX0VOQUJMRShbbGlidG9vbC1sb2NrXSwKKyAgICBbQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1saWJ0b29sLWxvY2tdLAorCVthdm9pZCBsb2NraW5nIChtaWdodCBicmVhayBwYXJhbGxlbCBidWlsZHMpXSldKQordGVzdCAieCRlbmFibGVfbGlidG9vbF9sb2NrIiAhPSB4bm8gJiYgZW5hYmxlX2xpYnRvb2xfbG9jaz15ZXMKKworQUNfQVJHX1dJVEgoW3BpY10sCisgICAgW0FDX0hFTFBfU1RSSU5HKFstLXdpdGgtcGljXSwKKwlbdHJ5IHRvIHVzZSBvbmx5IFBJQy9ub24tUElDIG9iamVjdHMgQDw6QGRlZmF1bHQ9dXNlIGJvdGhAOj5AXSldLAorICAgIFtwaWNfbW9kZT0iJHdpdGh2YWwiXSwKKyAgICBbcGljX21vZGU9ZGVmYXVsdF0pCit0ZXN0IC16ICIkcGljX21vZGUiICYmIHBpY19tb2RlPWRlZmF1bHQKKworIyBVc2UgQyBmb3IgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpbiB0aGUgbGlidG9vbCBzY3JpcHQKK3RhZ25hbWU9CitBQ19MSUJUT09MX0xBTkdfQ19DT05GSUcKK19MVF9BQ19UQUdDT05GSUcKK10pIyBBQ19MSUJUT09MX1NFVFVQCisKKworIyBfTFRfQUNfU1lTX0NPTVBJTEVSCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfTFRfQUNfU1lTX0NPTVBJTEVSXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKKworIyBJZiBubyBDIGNvbXBpbGVyIHdhcyBzcGVjaWZpZWQsIHVzZSBDQy4KK0xUQ0M9JHtMVENDLSIkQ0MifQorCisjIElmIG5vIEMgY29tcGlsZXIgZmxhZ3Mgd2VyZSBzcGVjaWZpZWQsIHVzZSBDRkxBR1MuCitMVENGTEFHUz0ke0xUQ0ZMQUdTLSIkQ0ZMQUdTIn0KKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2NvbXBpbGVyPSRDQworXSkjIF9MVF9BQ19TWVNfQ09NUElMRVIKKworCisjIF9MVF9DQ19CQVNFTkFNRShDQykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDYWxjdWxhdGUgY2NfYmFzZW5hbWUuICBTa2lwIGtub3duIGNvbXBpbGVyIHdyYXBwZXJzIGFuZCBjcm9zcy1wcmVmaXguCitBQ19ERUZVTihbX0xUX0NDX0JBU0VOQU1FXSwKK1tmb3IgY2NfdGVtcCBpbiAkMSIiOyBkbworICBjYXNlICRjY190ZW1wIGluCisgICAgY29tcGlsZSB8ICpbW1xcL11dY29tcGlsZSB8IGNjYWNoZSB8ICpbW1xcL11dY2NhY2hlICkgOzsKKyAgICBkaXN0Y2MgfCAqW1tcXC9dXWRpc3RjYyB8IHB1cmlmeSB8ICpbW1xcL11dcHVyaWZ5ICkgOzsKKyAgICBcLSopIDs7CisgICAgKikgYnJlYWs7OworICBlc2FjCitkb25lCitjY19iYXNlbmFtZT1gJGVjaG8gIlgkY2NfdGVtcCIgfCAkWHNlZCAtZSAncyUuKi8lJScgLWUgInMlXiRob3N0X2FsaWFzLSUlImAKK10pCisKKworIyBfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIGZvciBjb21waWxlciBib2lsZXJwbGF0ZSBvdXRwdXQgb3Igd2FybmluZ3Mgd2l0aAorIyB0aGUgc2ltcGxlIGNvbXBpbGVyIHRlc3QgY29kZS4KK0FDX0RFRlVOKFtfTFRfQ09NUElMRVJfQk9JTEVSUExBVEVdLAorW2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAorZXZhbCAiJGFjX2NvbXBpbGUiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCitfbHRfY29tcGlsZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskcm0gY29uZnRlc3QqCitdKSMgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCisKKworIyBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgZm9yIGxpbmtlciBib2lsZXJwbGF0ZSBvdXRwdXQgb3Igd2FybmluZ3Mgd2l0aAorIyB0aGUgc2ltcGxlIGxpbmsgdGVzdCBjb2RlLgorQUNfREVGVU4oW19MVF9MSU5LRVJfQk9JTEVSUExBVEVdLAorW2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorcHJpbnRmICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAorZXZhbCAiJGFjX2xpbmsiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCitfbHRfbGlua2VyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAorJHJtIGNvbmZ0ZXN0KgorXSkjIF9MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworCisjIF9MVF9BQ19TWVNfTElCUEFUSF9BSVgKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMaW5rcyBhIG1pbmltYWwgcHJvZ3JhbSBhbmQgY2hlY2tzIHRoZSBleGVjdXRhYmxlCisjIGZvciB0aGUgc3lzdGVtIGRlZmF1bHQgaGFyZGNvZGVkIGxpYnJhcnkgcGF0aC4gSW4gbW9zdCBjYXNlcywKKyMgdGhpcyBpcyAvdXNyL2xpYjovbGliLCBidXQgd2hlbiB0aGUgTVBJIGNvbXBpbGVycyBhcmUgdXNlZAorIyB0aGUgbG9jYXRpb24gb2YgdGhlIGNvbW11bmljYXRpb24gYW5kIE1QSSBsaWJzIGFyZSBpbmNsdWRlZCB0b28uCisjIElmIHdlIGRvbid0IGZpbmQgYW55dGhpbmcsIHVzZSB0aGUgZGVmYXVsdCBsaWJyYXJ5IHBhdGggYWNjb3JkaW5nCisjIHRvIHRoZSBhaXggbGQgbWFudWFsLgorQUNfREVGVU4oW19MVF9BQ19TWVNfTElCUEFUSF9BSVhdLAorW0FDX0xJTktfSUZFTFNFKEFDX0xBTkdfUFJPR1JBTSxbCithaXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KK30nYAorIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgoraWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KK30nYDsgZmldLFtdKQoraWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD0iL3Vzci9saWI6L2xpYiI7IGZpCitdKSMgX0xUX0FDX1NZU19MSUJQQVRIX0FJWAorCisKKyMgX0xUX0FDX1NIRUxMX0lOSVQoQVJHKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0xUX0FDX1NIRUxMX0lOSVRdLAorW2lmZGVmKFtBQ19ESVZFUlNJT05fTk9USUNFXSwKKwkgICAgIFtBQ19ESVZFUlRfUFVTSChBQ19ESVZFUlNJT05fTk9USUNFKV0sCisJIFtBQ19ESVZFUlRfUFVTSChOT1RJQ0UpXSkKKyQxCitBQ19ESVZFUlRfUE9QCitdKSMgX0xUX0FDX1NIRUxMX0lOSVQKKworCisjIF9MVF9BQ19QUk9HX0VDSE9fQkFDS1NMQVNICisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFkZCBzb21lIGNvZGUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBnZW5lcmF0ZWQgY29uZmlndXJlIHNjcmlwdCB3aGljaAorIyB3aWxsIGZpbmQgYW4gZWNobyBjb21tYW5kIHdoaWNoIGRvZXNuJ3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgorQUNfREVGVU4oW19MVF9BQ19QUk9HX0VDSE9fQkFDS1NMQVNIXSwKK1tfTFRfQUNfU0hFTExfSU5JVChbCisjIENoZWNrIHRoYXQgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwuCitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorCitjYXNlIFgkRUNITyBpbgorWCotLWZhbGxiYWNrLWVjaG8pCisgICMgUmVtb3ZlIG9uZSBsZXZlbCBvZiBxdW90YXRpb24gKHdoaWNoIHdhcyByZXF1aXJlZCBmb3IgTWFrZSkuCisgIEVDSE89YGVjaG8gIiRFQ0hPIiB8IHNlZCAncyxcXFxcXFskXVxcWyRdMCwnWyRdMCcsJ2AKKyAgOzsKK2VzYWMKKworZWNobz0ke0VDSE8tZWNob30KK2lmIHRlc3QgIlhbJF0xIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgorICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KKyAgc2hpZnQKK2VsaWYgdGVzdCAiWFskXTEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgorICAjIEF2b2lkIGlubGluZSBkb2N1bWVudCBoZXJlLCBpdCBtYXkgYmUgbGVmdCBvdmVyCisgIDoKK2VsaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnIDsgdGhlbgorICAjIFlpcHBlZSwgJGVjaG8gd29ya3MhCisgIDoKK2Vsc2UKKyAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLgorICBleGVjICRTSEVMTCAiWyRdMCIgLS1uby1yZWV4ZWMgJHsxKyJbJF1AIn0KK2ZpCisKK2lmIHRlc3QgIlhbJF0xIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KKyAgIyB1c2VkIGFzIGZhbGxiYWNrIGVjaG8KKyAgc2hpZnQKKyAgY2F0IDw8RU9GCitbJF0qCitFT0YKKyAgZXhpdCAwCitmaQorCisjIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAorIyBpZiBDRFBBVEggaXMgc2V0LgorKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAorCitpZiB0ZXN0IC16ICIkRUNITyI7IHRoZW4KK2lmIHRlc3QgIlgke2VjaG9fdGVzdF9zdHJpbmcrc2V0fSIgIT0gWHNldDsgdGhlbgorIyBmaW5kIGEgc3RyaW5nIGFzIGxhcmdlIGFzIHBvc3NpYmxlLCBhcyBsb25nIGFzIHRoZSBzaGVsbCBjYW4gY29wZSB3aXRoIGl0CisgIGZvciBjbWQgaW4gJ3NlZCA1MHEgIlskXTAiJyAnc2VkIDIwcSAiWyRdMCInICdzZWQgMTBxICJbJF0wIicgJ3NlZCAycSAiWyRdMCInICdlY2hvIHRlc3QnOyBkbworICAgICMgZXhwZWN0ZWQgc2l6ZXM6IGxlc3MgdGhhbiAyS2IsIDFLYiwgNTEyIGJ5dGVzLCAxNiBieXRlcywgLi4uCisgICAgaWYgKGVjaG9fdGVzdF9zdHJpbmc9YGV2YWwgJGNtZGApIDI+L2Rldi9udWxsICYmCisgICAgICAgZWNob190ZXN0X3N0cmluZz1gZXZhbCAkY21kYCAmJgorICAgICAgICh0ZXN0ICJYJGVjaG9fdGVzdF9zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsCisgICAgdGhlbgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCitmaQorCitpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKKyAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKKyAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorICA6CitlbHNlCisgICMgVGhlIFNvbGFyaXMsIEFJWCwgYW5kIERpZ2l0YWwgVW5peCBkZWZhdWx0IGVjaG8gcHJvZ3JhbXMgdW5xdW90ZQorICAjIGJhY2tzbGFzaGVzLiAgVGhpcyBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHF1b3RlIGJhY2tzbGFzaGVzIHVzaW5nCisgICMgICBlY2hvICIkc29tZXRoaW5nIiB8IHNlZCAncy9cXC9cXFxcL2cnCisgICMKKyAgIyBTbywgZmlyc3Qgd2UgbG9vayBmb3IgYSB3b3JraW5nIGVjaG8gaW4gdGhlIHVzZXIncyBQQVRILgorCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBmb3IgZGlyIGluICRQQVRIIC91c3IvdWNiOyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgIGlmICh0ZXN0IC1mICRkaXIvZWNobyB8fCB0ZXN0IC1mICRkaXIvZWNobyRhY19leGVleHQpICYmCisgICAgICAgdGVzdCAiWGAoJGRpci9lY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgorICAgICAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkZGlyL2VjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisgICAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisgICAgICBlY2hvPSIkZGlyL2VjaG8iCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkbHRfc2F2ZV9pZnMiCisKKyAgaWYgdGVzdCAiWCRlY2hvIiA9IFhlY2hvOyB0aGVuCisgICAgIyBXZSBkaWRuJ3QgZmluZCBhIGJldHRlciBlY2hvLCBzbyBsb29rIGZvciBhbHRlcm5hdGl2ZXMuCisgICAgaWYgdGVzdCAiWGAocHJpbnQgLXIgJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCisgICAgICAgZWNob190ZXN0aW5nX3N0cmluZz1gKHByaW50IC1yICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgorICAgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorICAgICAgIyBUaGlzIHNoZWxsIGhhcyBhIGJ1aWx0aW4gcHJpbnQgLXIgdGhhdCBkb2VzIHRoZSB0cmljay4KKyAgICAgIGVjaG89J3ByaW50IC1yJworICAgIGVsaWYgKHRlc3QgLWYgL2Jpbi9rc2ggfHwgdGVzdCAtZiAvYmluL2tzaCRhY19leGVleHQpICYmCisJIHRlc3QgIlgkQ09ORklHX1NIRUxMIiAhPSBYL2Jpbi9rc2g7IHRoZW4KKyAgICAgICMgSWYgd2UgaGF2ZSBrc2gsIHRyeSBydW5uaW5nIGNvbmZpZ3VyZSBhZ2FpbiB3aXRoIGl0LgorICAgICAgT1JJR0lOQUxfQ09ORklHX1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisgICAgICBleHBvcnQgT1JJR0lOQUxfQ09ORklHX1NIRUxMCisgICAgICBDT05GSUdfU0hFTEw9L2Jpbi9rc2gKKyAgICAgIGV4cG9ydCBDT05GSUdfU0hFTEwKKyAgICAgIGV4ZWMgJENPTkZJR19TSEVMTCAiWyRdMCIgLS1uby1yZWV4ZWMgJHsxKyJbJF1AIn0KKyAgICBlbHNlCisgICAgICAjIFRyeSB1c2luZyBwcmludGYuCisgICAgICBlY2hvPSdwcmludGYgJXNcbicKKyAgICAgIGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgorCSBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJGVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisJIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorCSMgQ29vbCwgcHJpbnRmIHdvcmtzCisJOgorICAgICAgZWxpZiBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJE9SSUdJTkFMX0NPTkZJR19TSEVMTCAiWyRdMCIgLS1mYWxsYmFjay1lY2hvICdcdCcpIDI+L2Rldi9udWxsYCAmJgorCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAnWFx0JyAmJgorCSAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkT1JJR0lOQUxfQ09ORklHX1NIRUxMICJbJF0wIiAtLWZhbGxiYWNrLWVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisJICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisJQ09ORklHX1NIRUxMPSRPUklHSU5BTF9DT05GSUdfU0hFTEwKKwlleHBvcnQgQ09ORklHX1NIRUxMCisJU0hFTEw9IiRDT05GSUdfU0hFTEwiCisJZXhwb3J0IFNIRUxMCisJZWNobz0iJENPTkZJR19TSEVMTCBbJF0wIC0tZmFsbGJhY2stZWNobyIKKyAgICAgIGVsaWYgZWNob190ZXN0aW5nX3N0cmluZz1gKCRDT05GSUdfU0hFTEwgIlskXTAiIC0tZmFsbGJhY2stZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAgJiYKKwkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gJ1hcdCcgJiYKKwkgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJENPTkZJR19TSEVMTCAiWyRdMCIgLS1mYWxsYmFjay1lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgorCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorCWVjaG89IiRDT05GSUdfU0hFTEwgWyRdMCAtLWZhbGxiYWNrLWVjaG8iCisgICAgICBlbHNlCisJIyBtYXliZSB3aXRoIGEgc21hbGxlciBzdHJpbmcuLi4KKwlwcmV2PToKKworCWZvciBjbWQgaW4gJ2VjaG8gdGVzdCcgJ3NlZCAycSAiWyRdMCInICdzZWQgMTBxICJbJF0wIicgJ3NlZCAyMHEgIlskXTAiJyAnc2VkIDUwcSAiWyRdMCInOyBkbworCSAgaWYgKHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWGBldmFsICRjbWRgIikgMj4vZGV2L251bGwKKwkgIHRoZW4KKwkgICAgYnJlYWsKKwkgIGZpCisJICBwcmV2PSIkY21kIgorCWRvbmUKKworCWlmIHRlc3QgIiRwcmV2IiAhPSAnc2VkIDUwcSAiWyRdMCInOyB0aGVuCisJICBlY2hvX3Rlc3Rfc3RyaW5nPWBldmFsICRwcmV2YAorCSAgZXhwb3J0IGVjaG9fdGVzdF9zdHJpbmcKKwkgIGV4ZWMgJHtPUklHSU5BTF9DT05GSUdfU0hFTEwtJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH19ICJbJF0wIiAkezErIlskXUAifQorCWVsc2UKKwkgICMgT29wcy4gIFdlIGxvc3QgY29tcGxldGVseSwgc28ganVzdCBzdGljayB3aXRoIGVjaG8uCisJICBlY2hvPWVjaG8KKwlmaQorICAgICAgZmkKKyAgICBmaQorICBmaQorZmkKK2ZpCisKKyMgQ29weSBlY2hvIGFuZCBxdW90ZSB0aGUgY29weSBzdWl0YWJseSBmb3IgcGFzc2luZyB0byBsaWJ0b29sIGZyb20KKyMgdGhlIE1ha2VmaWxlLCBpbnN0ZWFkIG9mIHF1b3RpbmcgdGhlIG9yaWdpbmFsLCB3aGljaCBpcyB1c2VkIGxhdGVyLgorRUNITz0kZWNobworaWYgdGVzdCAiWCRFQ0hPIiA9ICJYJENPTkZJR19TSEVMTCBbJF0wIC0tZmFsbGJhY2stZWNobyI7IHRoZW4KKyAgIEVDSE89IiRDT05GSUdfU0hFTEwgXFxcJFxbJF0wIC0tZmFsbGJhY2stZWNobyIKK2ZpCisKK0FDX1NVQlNUKEVDSE8pCitdKV0pIyBfTFRfQUNfUFJPR19FQ0hPX0JBQ0tTTEFTSAorCisKKyMgX0xUX0FDX0xPQ0sKKyMgLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfTFRfQUNfTE9DS10sCitbQUNfQVJHX0VOQUJMRShbbGlidG9vbC1sb2NrXSwKKyAgICBbQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1saWJ0b29sLWxvY2tdLAorCVthdm9pZCBsb2NraW5nIChtaWdodCBicmVhayBwYXJhbGxlbCBidWlsZHMpXSldKQordGVzdCAieCRlbmFibGVfbGlidG9vbF9sb2NrIiAhPSB4bm8gJiYgZW5hYmxlX2xpYnRvb2xfbG9jaz15ZXMKKworIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCisjIGxpYnRvb2wgc3VwcG9ydC4KK2Nhc2UgJGhvc3QgaW4KK2lhNjQtKi1ocHV4KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KKyAgICAqRUxGLTMyKikKKyAgICAgIEhQVVhfSUE2NF9NT0RFPSIzMiIKKyAgICAgIDs7CisgICAgKkVMRi02NCopCisgICAgICBIUFVYX0lBNjRfTU9ERT0iNjQiCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworKi0qLWlyaXg2KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdbI11saW5lIF9fb2xpbmVfXyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICBpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorICAgICozMi1iaXQqKQorICAgICAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJic21pcCIKKyAgICAgIDs7CisgICAgKk4zMiopCisgICAgICBMRD0iJHtMRC1sZH0gLW1lbGYzMmJtaXBuMzIiCisgICAgICA7OworICAgICo2NC1iaXQqKQorICAgICAgTEQ9IiR7TEQtbGR9IC1tZWxmNjRibWlwIgorICAgICAgOzsKKyAgICBlc2FjCisgICBlbHNlCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorICAgICozMi1iaXQqKQorICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKKyAgICAgIDs7CisgICAgKk4zMiopCisgICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKKyAgICAgIDs7CisgICAgKjY0LWJpdCopCisgICAgICBMRD0iJHtMRC1sZH0gLTY0IgorICAgICAgOzsKKyAgICBlc2FjCisgICBmaQorICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisKK3g4Nl82NC0qbGludXgqfHBwYyotKmxpbnV4Knxwb3dlcnBjKi0qbGludXgqfHMzOTAqLSpsaW51eCp8c3BhcmMqLSpsaW51eCopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIGluCisgICAgKjMyLWJpdCopCisgICAgICBjYXNlICRob3N0IGluCisgICAgICAgIHg4Nl82NC0qbGludXgqKQorICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGZfaTM4NiIKKyAgICAgICAgICA7OworICAgICAgICBwcGM2NC0qbGludXgqfHBvd2VycGM2NC0qbGludXgqKQorICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGYzMnBwY2xpbnV4IgorICAgICAgICAgIDs7CisgICAgICAgIHMzOTB4LSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9zMzkwIgorICAgICAgICAgIDs7CisgICAgICAgIHNwYXJjNjQtKmxpbnV4KikKKyAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmMzJfc3BhcmMiCisgICAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisgICAgKjY0LWJpdCopCisgICAgICBjYXNlICRob3N0IGluCisgICAgICAgIHg4Nl82NC0qbGludXgqKQorICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGZfeDg2XzY0IgorICAgICAgICAgIDs7CisgICAgICAgIHBwYyotKmxpbnV4Knxwb3dlcnBjKi0qbGludXgqKQorICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGY2NHBwYyIKKyAgICAgICAgICA7OworICAgICAgICBzMzkwKi0qbGludXgqKQorICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGY2NF9zMzkwIgorICAgICAgICAgIDs7CisgICAgICAgIHNwYXJjKi0qbGludXgqKQorICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGY2NF9zcGFyYyIKKyAgICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKKworKi0qLXNjbzMuMnY1KikKKyAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgorICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKKyAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgorICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZl0sIGx0X2N2X2NjX25lZWRzX2JlbGYsCisgICAgW0FDX0xBTkdfUFVTSChDKQorICAgICBBQ19UUllfTElOSyhbXSxbXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXNdLFtsdF9jdl9jY19uZWVkc19iZWxmPW5vXSkKKyAgICAgQUNfTEFOR19QT1BdKQorICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgorICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgorICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgorICBmaQorICA7Oworc3BhcmMqLSpzb2xhcmlzKikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AgaW4KKyAgICAqNjQtYml0KikKKyAgICAgIGNhc2UgJGx0X2N2X3Byb2dfZ251X2xkIGluCisgICAgICB5ZXMqKSBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfc3BhcmMiIDs7CisgICAgICAqKSAgICBMRD0iJHtMRC1sZH0gLTY0IiA7OworICAgICAgZXNhYworICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKKworQUNfUFJPVklERV9JRkVMU0UoW0FDX0xJQlRPT0xfV0lOMzJfRExMXSwKK1sqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiopCisgIEFDX0NIRUNLX1RPT0woRExMVE9PTCwgZGxsdG9vbCwgZmFsc2UpCisgIEFDX0NIRUNLX1RPT0woQVMsIGFzLCBmYWxzZSkKKyAgQUNfQ0hFQ0tfVE9PTChPQkpEVU1QLCBvYmpkdW1wLCBmYWxzZSkKKyAgOzsKKyAgXSkKK2VzYWMKKworbmVlZF9sb2Nrcz0iJGVuYWJsZV9saWJ0b29sX2xvY2siCisKK10pIyBfTFRfQUNfTE9DSworCisKKyMgQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT04oTUVTU0FHRSwgVkFSSUFCTEUtTkFNRSwgRkxBR1MsCisjCQlbT1VUUFVULUZJTEVdLCBbQUNUSU9OLVNVQ0NFU1NdLCBbQUNUSU9OLUZBSUxVUkVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGNvbXBpbGVyIG9wdGlvbiB3b3JrcworQUNfREVGVU4oW0FDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OXSwKK1tBQ19SRVFVSVJFKFtMVF9BQ19QUk9HX1NFRF0pCitBQ19DQUNIRV9DSEVDSyhbJDFdLCBbJDJdLAorICBbJDI9bm8KKyAgaWZlbHNlKFskNF0sICwgW2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dF0sIFthY19vdXRmaWxlPSQ0XSkKKyAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBsdF9jb21waWxlcl9mbGFnPSIkMyIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbW14gXV0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTpfX29saW5lX186ICRsdF9jb21waWxlXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgIGVjaG8gIiRhc19tZTpfX29saW5lX186IFwkPyA9ICRhY19zdGF0dXMiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgIiRhY19vdXRmaWxlIjsgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3Mgb3RoZXIgdGhhbiB0aGUgdXN1YWwgb3V0cHV0LgorICAgICAkZWNobyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgJDI9eWVzCisgICAgIGZpCisgICBmaQorICAgJHJtIGNvbmZ0ZXN0KgorXSkKKworaWYgdGVzdCB4IlskXSQyIiA9IHh5ZXM7IHRoZW4KKyAgICBpZmVsc2UoWyQ1XSwgLCA6LCBbJDVdKQorZWxzZQorICAgIGlmZWxzZShbJDZdLCAsIDosIFskNl0pCitmaQorXSkjIEFDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OCisKKworIyBBQ19MSUJUT09MX0xJTktFUl9PUFRJT04oTUVTU0FHRSwgVkFSSUFCTEUtTkFNRSwgRkxBR1MsCisjICAgICAgICAgICAgICAgICAgICAgICAgICBbQUNUSU9OLVNVQ0NFU1NdLCBbQUNUSU9OLUZBSUxVUkVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gY29tcGlsZXIgb3B0aW9uIHdvcmtzCitBQ19ERUZVTihbQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OXSwKK1tBQ19DQUNIRV9DSEVDSyhbJDFdLCBbJDJdLAorICBbJDI9bm8KKyAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCisgICBMREZMQUdTPSIkTERGTEFHUyAkMyIKKyAgIHByaW50ZiAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBpZiAoZXZhbCAkYWNfbGluayAyPmNvbmZ0ZXN0LmVycikgJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgICAgIyBUaGUgbGlua2VyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCisgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgICRlY2hvICJYJF9sdF9saW5rZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+IGNvbmZ0ZXN0LmV4cAorICAgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICAgIGlmIGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICAkMj15ZXMKKyAgICAgICBmaQorICAgICBlbHNlCisgICAgICAgJDI9eWVzCisgICAgIGZpCisgICBmaQorICAgJHJtIGNvbmZ0ZXN0KgorICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKK10pCisKK2lmIHRlc3QgeCJbJF0kMiIgPSB4eWVzOyB0aGVuCisgICAgaWZlbHNlKFskNF0sICwgOiwgWyQ0XSkKK2Vsc2UKKyAgICBpZmVsc2UoWyQ1XSwgLCA6LCBbJDVdKQorZmkKK10pIyBBQ19MSUJUT09MX0xJTktFUl9PUFRJT04KKworCisjIEFDX0xJQlRPT0xfU1lTX01BWF9DTURfTEVOCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfTUFYX0NNRF9MRU5dLAorWyMgZmluZCB0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworQUNfTVNHX0NIRUNLSU5HKFt0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50c10pCitBQ19DQUNIRV9WQUwoW2x0X2N2X3N5c19tYXhfY21kX2xlbl0sIFtkbmwKKyAgaT0wCisgIHRlc3RzdHJpbmc9IkFCQ0QiCisKKyAgY2FzZSAkYnVpbGRfb3MgaW4KKyAgbXNkb3NkamdwcCopCisgICAgIyBPbiBESkdQUCwgdGhpcyB0ZXN0IGNhbiBibG93IHVwIHByZXR0eSBiYWRseSBkdWUgdG8gcHJvYmxlbXMgaW4gbGliYworICAgICMgKGFueSBzaW5nbGUgYXJndW1lbnQgZXhjZWVkaW5nIDIwMDAgYnl0ZXMgY2F1c2VzIGEgYnVmZmVyIG92ZXJydW4KKyAgICAjIGR1cmluZyBnbG9iIGV4cGFuc2lvbikuICBFdmVuIGlmIGl0IHdlcmUgZml4ZWQsIHRoZSByZXN1bHQgb2YgdGhpcworICAgICMgY2hlY2sgd291bGQgYmUgbGFyZ2VyIHRoYW4gaXQgc2hvdWxkIGJlLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xMjI4ODsgICAgIyAxMksgaXMgYWJvdXQgcmlnaHQKKyAgICA7OworCisgIGdudSopCisgICAgIyBVbmRlciBHTlUgSHVyZCwgdGhpcyB0ZXN0IGlzIG5vdCByZXF1aXJlZCBiZWNhdXNlIHRoZXJlIGlzCisgICAgIyBubyBsaW1pdCB0byB0aGUgbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgICAgIyBMaWJ0b29sIHdpbGwgaW50ZXJwcmV0IC0xIGFzIG5vIGxpbWl0IHdoYXRzb2V2ZXIKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49LTE7CisgICAgOzsKKworICBjeWd3aW4qIHwgbWluZ3cqKQorICAgICMgT24gV2luOXgvTUUsIHRoaXMgdGVzdCBibG93cyB1cCAtLSBpdCBzdWNjZWVkcywgYnV0IHRha2VzCisgICAgIyBhYm91dCA1IG1pbnV0ZXMgYXMgdGhlIHRlc3RzdHJpbmcgZ3Jvd3MgZXhwb25lbnRpYWxseS4KKyAgICAjIFdvcnNlLCBzaW5jZSA5eC9NRSBhcmUgbm90IHByZS1lbXB0aXZlbHkgbXVsdGl0YXNraW5nLAorICAgICMgeW91IGVuZCB1cCB3aXRoIGEgImZyb3plbiIgY29tcHV0ZXIsIGV2ZW4gdGhvdWdoIHdpdGggcGF0aWVuY2UKKyAgICAjIHRoZSB0ZXN0IGV2ZW50dWFsbHkgc3VjY2VlZHMgKHdpdGggYSBtYXggbGluZSBsZW5ndGggb2YgMjU2aykuCisgICAgIyBJbnN0ZWFkLCBsZXQncyBqdXN0IHB1bnQ6IHVzZSB0aGUgbWluaW11bSBsaW5lbGVuZ3RoIHJlcG9ydGVkIGJ5CisgICAgIyBhbGwgb2YgdGhlIHN1cHBvcnRlZCBwbGF0Zm9ybXM6IDgxOTIgKG9uIE5ULzJLL1hQKS4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKKyAgICA7OworCisgIGFtaWdhb3MqKQorICAgICMgT24gQW1pZ2FPUyB3aXRoIHBka3NoLCB0aGlzIHRlc3QgdGFrZXMgaG91cnMsIGxpdGVyYWxseS4KKyAgICAjIFNvIHdlIGp1c3QgcHVudCBhbmQgdXNlIGEgbWluaW11bSBsaW5lIGxlbmd0aCBvZiA4MTkyLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOworICAgIDs7CisKKyAgbmV0YnNkKiB8IGZyZWVic2QqIHwgb3BlbmJzZCogfCBkYXJ3aW4qIHwgZHJhZ29uZmx5KikKKyAgICAjIFRoaXMgaGFzIGJlZW4gYXJvdW5kIHNpbmNlIDM4NkJTRCwgYXQgbGVhc3QuICBMaWtlbHkgZnVydGhlci4KKyAgICBpZiB0ZXN0IC14IC9zYmluL3N5c2N0bDsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAvc2Jpbi9zeXNjdGwgLW4ga2Vybi5hcmdtYXhgCisgICAgZWxpZiB0ZXN0IC14IC91c3Ivc2Jpbi9zeXNjdGw7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gL3Vzci9zYmluL3N5c2N0bCAtbiBrZXJuLmFyZ21heGAKKyAgICBlbHNlCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49NjU1MzYJIyB1c2FibGUgZGVmYXVsdCBmb3IgYWxsIEJTRHMKKyAgICBmaQorICAgICMgQW5kIGFkZCBhIHNhZmV0eSB6b25lCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gNGAKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcKiAzYAorICAgIDs7CisKKyAgaW50ZXJpeCopCisgICAgIyBXZSBrbm93IHRoZSB2YWx1ZSAyNjIxNDQgYW5kIGhhcmRjb2RlIGl0IHdpdGggYSBzYWZldHkgem9uZSAobGlrZSBCU0QpCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTE5NjYwOAorICAgIDs7CisKKyAgb3NmKikKKyAgICAjIERyLiBIYW5zIEVra2VoYXJkIFBsZXNzZXIgcmVwb3J0cyBzZWVpbmcgYSBrZXJuZWwgcGFuaWMgcnVubmluZyBjb25maWd1cmUKKyAgICAjIGR1ZSB0byB0aGlzIHRlc3Qgd2hlbiBleGVjX2Rpc2FibGVfYXJnX2xpbWl0IGlzIDEgb24gVHJ1NjQuIEl0IGlzIG5vdAorICAgICMgbmljZSB0byBjYXVzZSBrZXJuZWwgcGFuaWNzIHNvIGxldHMgYXZvaWQgdGhlIGxvb3AgYmVsb3cuCisgICAgIyBGaXJzdCBzZXQgYSByZWFzb25hYmxlIGRlZmF1bHQuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTE2Mzg0CisgICAgIworICAgIGlmIHRlc3QgLXggL3NiaW4vc3lzY29uZmlnOyB0aGVuCisgICAgICBjYXNlIGAvc2Jpbi9zeXNjb25maWcgLXEgcHJvYyBleGVjX2Rpc2FibGVfYXJnX2xpbWl0YCBpbgorICAgICAgICAqMSopIGx0X2N2X3N5c19tYXhfY21kX2xlbj0tMSA7OworICAgICAgZXNhYworICAgIGZpCisgICAgOzsKKyAgc2NvMy4ydjUqKQorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xMDI0MDAKKyAgICA7OworICBzeXN2NSogfCBzY281djYqIHwgc3lzdjQuMnV3MiopCisgICAga2FyZ21heD1gZ3JlcCBBUkdfTUFYIC9ldGMvY29uZi9jZi5kL3N0dW5lIDI+L2Rldi9udWxsYAorICAgIGlmIHRlc3QgLW4gIiRrYXJnbWF4IjsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBlY2hvICRrYXJnbWF4IHwgc2VkICdzLy4qW1sgCV1dLy8nYAorICAgIGVsc2UKKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0zMjc2OAorICAgIGZpCisgICAgOzsKKyAgKikKKyAgICAjIElmIHRlc3QgaXMgbm90IGEgc2hlbGwgYnVpbHQtaW4sIHdlJ2xsIHByb2JhYmx5IGVuZCB1cCBjb21wdXRpbmcgYQorICAgICMgbWF4aW11bSBsZW5ndGggdGhhdCBpcyBvbmx5IGhhbGYgb2YgdGhlIGFjdHVhbCBtYXhpbXVtIGxlbmd0aCwgYnV0CisgICAgIyB3ZSBjYW4ndCB0ZWxsLgorICAgIFNIRUxMPSR7U0hFTEwtJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH19CisgICAgd2hpbGUgKHRlc3QgIlgiYCRTSEVMTCBbJF0wIC0tZmFsbGJhY2stZWNobyAiWCR0ZXN0c3RyaW5nIiAyPi9kZXYvbnVsbGAgXAorCSAgICAgICA9ICJYWCR0ZXN0c3RyaW5nIikgPi9kZXYvbnVsbCAyPiYxICYmCisJICAgIG5ld19yZXN1bHQ9YGV4cHIgIlgkdGVzdHN0cmluZyIgOiAiLioiIDI+JjFgICYmCisJICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0kbmV3X3Jlc3VsdCAmJgorCSAgICB0ZXN0ICRpICE9IDE3ICMgMS8yIE1CIHNob3VsZCBiZSBlbm91Z2gKKyAgICBkbworICAgICAgaT1gZXhwciAkaSArIDFgCisgICAgICB0ZXN0c3RyaW5nPSR0ZXN0c3RyaW5nJHRlc3RzdHJpbmcKKyAgICBkb25lCisgICAgdGVzdHN0cmluZz0KKyAgICAjIEFkZCBhIHNpZ25pZmljYW50IHNhZmV0eSBmYWN0b3IgYmVjYXVzZSBDKysgY29tcGlsZXJzIGNhbiB0YWNrIG9uIG1hc3NpdmUKKyAgICAjIGFtb3VudHMgb2YgYWRkaXRpb25hbCBhcmd1bWVudHMgYmVmb3JlIHBhc3NpbmcgdGhlbSB0byB0aGUgbGlua2VyLgorICAgICMgSXQgYXBwZWFycyBhcyB0aG91Z2ggMS8yIGlzIGEgdXNhYmxlIHZhbHVlLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDJgCisgICAgOzsKKyAgZXNhYworXSkKK2lmIHRlc3QgLW4gJGx0X2N2X3N5c19tYXhfY21kX2xlbiA7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVCgkbHRfY3Zfc3lzX21heF9jbWRfbGVuKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vbmUpCitmaQorXSkjIEFDX0xJQlRPT0xfU1lTX01BWF9DTURfTEVOCisKKworIyBfTFRfQUNfQ0hFQ0tfRExGQ04KKyMgLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0xUX0FDX0NIRUNLX0RMRkNOXSwKK1tBQ19DSEVDS19IRUFERVJTKGRsZmNuLmgpZG5sCitdKSMgX0xUX0FDX0NIRUNLX0RMRkNOCisKKworIyBfTFRfQUNfVFJZX0RMT1BFTl9TRUxGIChBQ1RJT04tSUYtVFJVRSwgQUNUSU9OLUlGLVRSVUUtVy1VU0NPUkUsCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNUSU9OLUlGLUZBTFNFLCBBQ1RJT04tSUYtQ1JPU1MtQ09NUElMSU5HKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfTFRfQUNfVFJZX0RMT1BFTl9TRUxGXSwKK1tBQ19SRVFVSVJFKFtfTFRfQUNfQ0hFQ0tfRExGQ05dKWRubAoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICBbJDRdCitlbHNlCisgIGx0X2RsdW5rbm93bj0wOyBsdF9kbG5vX3VzY29yZT0xOyBsdF9kbG5lZWRfdXNjb3JlPTIKKyAgbHRfc3RhdHVzPSRsdF9kbHVua25vd24KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorWyNsaW5lIF9fb2xpbmVfXyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZiBIQVZFX0RMRkNOX0gKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgUlRMRF9HTE9CQUwKKyMgIGRlZmluZSBMVF9ETEdMT0JBTAkJUlRMRF9HTE9CQUwKKyNlbHNlCisjICBpZmRlZiBETF9HTE9CQUwKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQlETF9HTE9CQUwKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQkwCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVF9ETExBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKKyAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KKyNpZm5kZWYgTFRfRExMQVpZX09SX05PVworIyAgaWZkZWYgUlRMRF9MQVpZCisjICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlSVExEX0xBWlkKKyMgIGVsc2UKKyMgICAgaWZkZWYgRExfTEFaWQorIyAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlETF9MQVpZCisjICAgIGVsc2UKKyMgICAgICBpZmRlZiBSVExEX05PVworIyAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJUlRMRF9OT1cKKyMgICAgICBlbHNlCisjICAgICAgICBpZmRlZiBETF9OT1cKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJRExfTk9XCisjICAgICAgICBlbHNlCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCTAKKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHZvaWQgZXhpdCAoaW50KTsKKyNlbmRpZgorCit2b2lkIGZub3JkKCkgeyBpbnQgaT00Mjt9CitpbnQgbWFpbiAoKQoreworICB2b2lkICpzZWxmID0gZGxvcGVuICgwLCBMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XKTsKKyAgaW50IHN0YXR1cyA9ICRsdF9kbHVua25vd247CisKKyAgaWYgKHNlbGYpCisgICAgeworICAgICAgaWYgKGRsc3ltIChzZWxmLCJmbm9yZCIpKSAgICAgICBzdGF0dXMgPSAkbHRfZGxub191c2NvcmU7CisgICAgICBlbHNlIGlmIChkbHN5bSggc2VsZiwiX2Zub3JkIikpIHN0YXR1cyA9ICRsdF9kbG5lZWRfdXNjb3JlOworICAgICAgLyogZGxjbG9zZSAoc2VsZik7ICovCisgICAgfQorICBlbHNlCisgICAgcHV0cyAoZGxlcnJvciAoKSk7CisKKyAgICBleGl0IChzdGF0dXMpOworfV0KK0VPRgorICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9IDI+L2Rldi9udWxsOyB0aGVuCisgICAgKC4vY29uZnRlc3Q7IGV4aXQ7ICkgPiZBU19NRVNTQUdFX0xPR19GRCAyPi9kZXYvbnVsbAorICAgIGx0X3N0YXR1cz0kPworICAgIGNhc2UgeCRsdF9zdGF0dXMgaW4KKyAgICAgIHgkbHRfZGxub191c2NvcmUpICQxIDs7CisgICAgICB4JGx0X2RsbmVlZF91c2NvcmUpICQyIDs7CisgICAgICB4JGx0X2RsdW5rbm93bnx4KikgJDMgOzsKKyAgICBlc2FjCisgIGVsc2UgOgorICAgICMgY29tcGlsYXRpb24gZmFpbGVkCisgICAgJDMKKyAgZmkKK2ZpCitybSAtZnIgY29uZnRlc3QqCitdKSMgX0xUX0FDX1RSWV9ETE9QRU5fU0VMRgorCisKKyMgQUNfTElCVE9PTF9ETE9QRU5fU0VMRgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbQUNfTElCVE9PTF9ETE9QRU5fU0VMRl0sCitbQUNfUkVRVUlSRShbX0xUX0FDX0NIRUNLX0RMRkNOXSlkbmwKK2lmIHRlc3QgIngkZW5hYmxlX2Rsb3BlbiIgIT0geHllczsgdGhlbgorICBlbmFibGVfZGxvcGVuPXVua25vd24KKyAgZW5hYmxlX2Rsb3Blbl9zZWxmPXVua25vd24KKyAgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duCitlbHNlCisgIGx0X2N2X2Rsb3Blbj1ubworICBsdF9jdl9kbG9wZW5fbGlicz0KKworICBjYXNlICRob3N0X29zIGluCisgIGJlb3MqKQorICAgIGx0X2N2X2Rsb3Blbj0ibG9hZF9hZGRfb24iCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCisgICAgOzsKKworICBtaW5ndyogfCBwdzMyKikKKyAgICBsdF9jdl9kbG9wZW49IkxvYWRMaWJyYXJ5IgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgOzsKKworICBjeWd3aW4qKQorICAgIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgOzsKKworICBkYXJ3aW4qKQorICAjIGlmIGxpYmRsIGlzIGluc3RhbGxlZCB3ZSBuZWVkIHRvIGxpbmsgYWdhaW5zdCBpdAorICAgIEFDX0NIRUNLX0xJQihbZGxdLCBbZGxvcGVuXSwKKwkJW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbCJdLFsKKyAgICBsdF9jdl9kbG9wZW49ImR5bGQiCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCisgICAgXSkKKyAgIDs7CisKKyAgKikKKyAgICBBQ19DSEVDS19GVU5DKFtzaGxfbG9hZF0sCisJICBbbHRfY3ZfZGxvcGVuPSJzaGxfbG9hZCJdLAorICAgICAgW0FDX0NIRUNLX0xJQihbZGxkXSwgW3NobF9sb2FkXSwKKwkgICAgW2x0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiIGx0X2N2X2Rsb3Blbl9saWJzPSItZGxkIl0sCisJW0FDX0NIRUNLX0ZVTkMoW2Rsb3Blbl0sCisJICAgICAgW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIl0sCisJICBbQUNfQ0hFQ0tfTElCKFtkbF0sIFtkbG9wZW5dLAorCQlbbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsIl0sCisJICAgIFtBQ19DSEVDS19MSUIoW3N2bGRdLCBbZGxvcGVuXSwKKwkJICBbbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbHN2bGQiXSwKKwkgICAgICBbQUNfQ0hFQ0tfTElCKFtkbGRdLCBbZGxkX2xpbmtdLAorCQkgICAgW2x0X2N2X2Rsb3Blbj0iZGxkX2xpbmsiIGx0X2N2X2Rsb3Blbl9saWJzPSItZGxkIl0pCisJICAgICAgXSkKKwkgICAgXSkKKwkgIF0pCisJXSkKKyAgICAgIF0pCisgICAgOzsKKyAgZXNhYworCisgIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuIiAhPSB4bm87IHRoZW4KKyAgICBlbmFibGVfZGxvcGVuPXllcworICBlbHNlCisgICAgZW5hYmxlX2Rsb3Blbj1ubworICBmaQorCisgIGNhc2UgJGx0X2N2X2Rsb3BlbiBpbgorICBkbG9wZW4pCisgICAgc2F2ZV9DUFBGTEFHUz0iJENQUEZMQUdTIgorICAgIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2RsZmNuX2giID0geHllcyAmJiBDUFBGTEFHUz0iJENQUEZMQUdTIC1ESEFWRV9ETEZDTl9IIgorCisgICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCisKKyAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgIExJQlM9IiRsdF9jdl9kbG9wZW5fbGlicyAkTElCUyIKKworICAgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZl0sCisJICBsdF9jdl9kbG9wZW5fc2VsZiwgW2RubAorCSAgX0xUX0FDX1RSWV9ETE9QRU5fU0VMRigKKwkgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzLCBsdF9jdl9kbG9wZW5fc2VsZj15ZXMsCisJICAgIGx0X2N2X2Rsb3Blbl9zZWxmPW5vLCBsdF9jdl9kbG9wZW5fc2VsZj1jcm9zcykKKyAgICBdKQorCisgICAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW5fc2VsZiIgPSB4eWVzOyB0aGVuCisgICAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljXCIKKyAgICAgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGEgc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZl0sCisgICAgCSAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljLCBbZG5sCisJICBfTFRfQUNfVFJZX0RMT1BFTl9TRUxGKAorCSAgICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzLCBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzLAorCSAgICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9bm8sICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9Y3Jvc3MpCisgICAgICBdKQorICAgIGZpCisKKyAgICBDUFBGTEFHUz0iJHNhdmVfQ1BQRkxBR1MiCisgICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKyAgICBMSUJTPSIkc2F2ZV9MSUJTIgorICAgIDs7CisgIGVzYWMKKworICBjYXNlICRsdF9jdl9kbG9wZW5fc2VsZiBpbgorICB5ZXN8bm8pIGVuYWJsZV9kbG9wZW5fc2VsZj0kbHRfY3ZfZGxvcGVuX3NlbGYgOzsKKyAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmPXVua25vd24gOzsKKyAgZXNhYworCisgIGNhc2UgJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyBpbgorICB5ZXN8bm8pIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9JGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyA7OworICAqKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPXVua25vd24gOzsKKyAgZXNhYworZmkKK10pIyBBQ19MSUJUT09MX0RMT1BFTl9TRUxGCisKKworIyBBQ19MSUJUT09MX1BST0dfQ0NfQ19PKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHRvIHNlZSBpZiBvcHRpb25zIC1jIGFuZCAtbyBhcmUgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydGVkIGJ5IGNvbXBpbGVyCitBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0NDX0NfT10sCitbQUNfUkVRVUlSRShbX0xUX0FDX1NZU19DT01QSUxFUl0pZG5sCitBQ19DQUNIRV9DSEVDSyhbaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dF0sCisgIFtfTFRfQUNfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSldLAorICBbX0xUX0FDX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpPW5vCisgICAkcm0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKKyAgIG1rZGlyIGNvbmZ0ZXN0CisgICBjZCBjb25mdGVzdAorICAgbWtkaXIgb3V0CisgICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorCisgICBsdF9jb21waWxlcl9mbGFnPSItbyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQiCisgICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgorICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KKyAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKKyAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbW14gXV0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTpfX29saW5lX186ICRsdF9jb21waWxlXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgZWNobyAiJGFzX21lOl9fb2xpbmVfXzogXCQ/ID0gJGFjX3N0YXR1cyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQKKyAgIHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgICRlY2hvICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgb3V0L2NvbmZ0ZXN0LmVyciA+b3V0L2NvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVyMiB8fCBkaWZmIG91dC9jb25mdGVzdC5leHAgb3V0L2NvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgX0xUX0FDX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpPXllcworICAgICBmaQorICAgZmkKKyAgIGNobW9kIHUrdyAuIDI+JkFTX01FU1NBR0VfTE9HX0ZECisgICAkcm0gY29uZnRlc3QqCisgICAjIFNHSSBDKysgY29tcGlsZXIgd2lsbCBjcmVhdGUgZGlyZWN0b3J5IG91dC9paV9maWxlcy8gZm9yCisgICAjIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KKyAgIHRlc3QgLWQgb3V0L2lpX2ZpbGVzICYmICRybSBvdXQvaWlfZmlsZXMvKiAmJiBybWRpciBvdXQvaWlfZmlsZXMKKyAgICRybSBvdXQvKiAmJiBybWRpciBvdXQKKyAgIGNkIC4uCisgICBybWRpciBjb25mdGVzdAorICAgJHJtIGNvbmZ0ZXN0KgorXSkKK10pIyBBQ19MSUJUT09MX1BST0dfQ0NfQ19PCisKKworIyBBQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1MoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB0byBzZWUgaWYgd2UgY2FuIGRvIGhhcmQgbGlua3MgdG8gbG9jayBzb21lIGZpbGVzIGlmIG5lZWRlZAorQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX0hBUkRfTElOS19MT0NLU10sCitbQUNfUkVRVUlSRShbX0xUX0FDX0xPQ0tdKWRubAorCitoYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCitpZiB0ZXN0ICIkX0xUX0FDX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpIiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgorICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKKyAgQUNfTVNHX0NIRUNLSU5HKFtpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3NdKQorICBoYXJkX2xpbmtzPXllcworICAkcm0gY29uZnRlc3QqCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCisgIHRvdWNoIGNvbmZ0ZXN0LmEKKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+JjUgfHwgaGFyZF9saW5rcz1ubworICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICBBQ19NU0dfUkVTVUxUKFskaGFyZF9saW5rc10pCisgIGlmIHRlc3QgIiRoYXJkX2xpbmtzIiA9IG5vOyB0aGVuCisgICAgQUNfTVNHX1dBUk4oW2AkQ0MnIGRvZXMgbm90IHN1cHBvcnQgYC1jIC1vJywgc28gYG1ha2UgLWonIG1heSBiZSB1bnNhZmVdKQorICAgIG5lZWRfbG9ja3M9d2FybgorICBmaQorZWxzZQorICBuZWVkX2xvY2tzPW5vCitmaQorXSkjIEFDX0xJQlRPT0xfU1lTX0hBUkRfTElOS19MT0NLUworCisKKyMgQUNfTElCVE9PTF9PQkpESVIKKyMgLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBQ19MSUJUT09MX09CSkRJUl0sCitbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBvYmpkaXJdLCBbbHRfY3Zfb2JqZGlyXSwKK1tybSAtZiAubGlicyAyPi9kZXYvbnVsbAorbWtkaXIgLmxpYnMgMj4vZGV2L251bGwKK2lmIHRlc3QgLWQgLmxpYnM7IHRoZW4KKyAgbHRfY3Zfb2JqZGlyPS5saWJzCitlbHNlCisgICMgTVMtRE9TIGRvZXMgbm90IGFsbG93IGZpbGVuYW1lcyB0aGF0IGJlZ2luIHdpdGggYSBkb3QuCisgIGx0X2N2X29iamRpcj1fbGlicworZmkKK3JtZGlyIC5saWJzIDI+L2Rldi9udWxsXSkKK29iamRpcj0kbHRfY3Zfb2JqZGlyCitdKSMgQUNfTElCVE9PTF9PQkpESVIKKworCisjIEFDX0xJQlRPT0xfUFJPR19MRF9IQVJEQ09ERV9MSUJQQVRIKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayBoYXJkY29kaW5nIGF0dHJpYnV0ZXMuCitBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEhdLAorW0FDX01TR19DSEVDS0lORyhbaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtc10pCitfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPQoraWYgdGVzdCAtbiAiJF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpIiB8fCBcCisgICB0ZXN0IC1uICIkX0xUX0FDX1RBR1ZBUihydW5wYXRoX3ZhciwgJDEpIiB8fCBcCisgICB0ZXN0ICJYJF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSkiID0gIlh5ZXMiIDsgdGhlbgorCisgICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGFudCBkaXJlY3Rvcmllcy4KKyAgaWYgdGVzdCAiJF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSkiICE9IG5vICYmCisgICAgICMgSWYgdGhlIG9ubHkgbWVjaGFuaXNtIHRvIGF2b2lkIGhhcmRjb2RpbmcgaXMgc2hsaWJwYXRoX3Zhciwgd2UKKyAgICAgIyBoYXZlIHRvIHJlbGluaywgb3RoZXJ3aXNlIHdlIG1pZ2h0IGxpbmsgd2l0aCBhbiBpbnN0YWxsZWQgbGlicmFyeQorICAgICAjIHdoZW4gd2Ugc2hvdWxkIGJlIGxpbmtpbmcgd2l0aCBhIHlldC10by1iZS1pbnN0YWxsZWQgb25lCisgICAgICMjIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKSIgIT0gbm8gJiYKKyAgICAgdGVzdCAiJF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpIiAhPSBubzsgdGhlbgorICAgICMgTGlua2luZyBhbHdheXMgaGFyZGNvZGVzIHRoZSB0ZW1wb3JhcnkgbGlicmFyeSBkaXJlY3RvcnkuCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKT1yZWxpbmsKKyAgZWxzZQorICAgICMgV2UgY2FuIGxpbmsgd2l0aG91dCBoYXJkY29kaW5nLCBhbmQgd2UgY2FuIGhhcmRjb2RlIG5vbmV4aXN0aW5nIGRpcnMuCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKT1pbW1lZGlhdGUKKyAgZmkKK2Vsc2UKKyAgIyBXZSBjYW5ub3QgaGFyZGNvZGUgYW55dGhpbmcsIG9yIGVsc2Ugd2UgY2FuIG9ubHkgaGFyZGNvZGUgZXhpc3RpbmcKKyAgIyBkaXJlY3Rvcmllcy4KKyAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKT11bnN1cHBvcnRlZAorZmkKK0FDX01TR19SRVNVTFQoWyRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpXSkKKworaWYgdGVzdCAiJF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSkiID0gcmVsaW5rOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCitlbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8CisgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCitmaQorXSkjIEFDX0xJQlRPT0xfUFJPR19MRF9IQVJEQ09ERV9MSUJQQVRICisKKworIyBBQ19MSUJUT09MX1NZU19MSUJfU1RSSVAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfTElCX1NUUklQXSwKK1tzdHJpcGxpYj0KK29sZF9zdHJpcGxpYj0KK0FDX01TR19DSEVDS0lORyhbd2hldGhlciBzdHJpcHBpbmcgbGlicmFyaWVzIGlzIHBvc3NpYmxlXSkKK2lmIHRlc3QgLW4gIiRTVFJJUCIgJiYgJFNUUklQIC1WIDI+JjEgfCBncmVwICJHTlUgc3RyaXAiID4vZGV2L251bGw7IHRoZW4KKyAgdGVzdCAteiAiJG9sZF9zdHJpcGxpYiIgJiYgb2xkX3N0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC1kZWJ1ZyIKKyAgdGVzdCAteiAiJHN0cmlwbGliIiAmJiBzdHJpcGxpYj0iJFNUUklQIC0tc3RyaXAtdW5uZWVkZWQiCisgIEFDX01TR19SRVNVTFQoW3llc10pCitlbHNlCisjIEZJWE1FIC0gaW5zZXJ0IHNvbWUgcmVhbCB0ZXN0cywgaG9zdF9vcyBpc24ndCByZWFsbHkgZ29vZCBlbm91Z2gKKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgZGFyd2luKikKKyAgICAgICBpZiB0ZXN0IC1uICIkU1RSSVAiIDsgdGhlbgorICAgICAgICAgc3RyaXBsaWI9IiRTVFJJUCAteCIKKyAgICAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCisgICAgICAgZWxzZQorICBBQ19NU0dfUkVTVUxUKFtub10pCitmaQorICAgICAgIDs7CisgICAqKQorICBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgOzsKKyAgZXNhYworZmkKK10pIyBBQ19MSUJUT09MX1NZU19MSUJfU1RSSVAKKworCisjIEFDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBPUlRNRSBGaWxsIGluIHlvdXIgbGQuc28gY2hhcmFjdGVyaXN0aWNzCitBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfRFlOQU1JQ19MSU5LRVJdLAorW0FDX01TR19DSEVDS0lORyhbZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzXSkKK2xpYnJhcnlfbmFtZXNfc3BlYz0KK2xpYm5hbWVfc3BlYz0nbGliJG5hbWUnCitzb25hbWVfc3BlYz0KK3NocmV4dF9jbWRzPSIuc28iCitwb3N0aW5zdGFsbF9jbWRzPQorcG9zdHVuaW5zdGFsbF9jbWRzPQorZmluaXNoX2NtZHM9CitmaW5pc2hfZXZhbD0KK3NobGlicGF0aF92YXI9CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9dW5rbm93bgordmVyc2lvbl90eXBlPW5vbmUKK2R5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgoraWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAorICBpZiBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IGdyZXAgJzsnID4vZGV2L251bGwgOyB0aGVuCisgICAgIyBpZiB0aGUgcGF0aCBjb250YWlucyAiOyIgdGhlbiB3ZSBhc3N1bWUgaXQgdG8gYmUgdGhlIHNlcGFyYXRvcgorICAgICMgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIHBhdGggc2VwYXJhdG9yIChpLmUuICI6IikgLSBpdCBpcworICAgICMgYXNzdW1lZCB0aGF0IG5vIHBhcnQgb2YgYSBub3JtYWwgcGF0aG5hbWUgY29udGFpbnMgIjsiIGJ1dCB0aGF0IHNob3VsZAorICAgICMgb2theSBpbiB0aGUgcmVhbCB3b3JsZCB3aGVyZSAiOyIgaW4gZGlycGF0aHMgaXMgaXRzZWxmIHByb2JsZW1hdGljLgorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKKyAgZWxzZQorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKKyAgZmkKK2Vsc2UKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgorZmkKK25lZWRfbGliX3ByZWZpeD11bmtub3duCitoYXJkY29kZV9pbnRvX2xpYnM9bm8KKworIyB3aGVuIHlvdSBzZXQgbmVlZF92ZXJzaW9uIHRvIG5vLCBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY2F1c2UgLXNldF92ZXJzaW9uCisjIGZsYWdzIHRvIGJlIGxlZnQgd2l0aG91dCBhcmd1bWVudHMKK25lZWRfdmVyc2lvbj11bmtub3duCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lLmEnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorCisgICMgQUlYIDMgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgOzsKKworYWl4NCogfCBhaXg1KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICMgQUlYIDUgc3VwcG9ydHMgSUE2NAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGVsc2UKKyAgICAjIFdpdGggR0NDIHVwIHRvIDIuOTUueCwgY29sbGVjdDIgd291bGQgY3JlYXRlIGFuIGltcG9ydCBmaWxlCisgICAgIyBmb3IgZGVwZW5kZW5jZSBsaWJyYXJpZXMuICBUaGUgaW1wb3J0IGZpbGUgd291bGQgc3RhcnQgd2l0aAorICAgICMgdGhlIGxpbmUgYCMhIC4nLiAgVGhpcyB3b3VsZCBjYXVzZSB0aGUgZ2VuZXJhdGVkIGxpYnJhcnkgdG8KKyAgICAjIGRlcGVuZCBvbiBgLicsIGFsd2F5cyBhbiBpbnZhbGlkIGxpYnJhcnkuICBUaGlzIHdhcyBmaXhlZCBpbgorICAgICMgZGV2ZWxvcG1lbnQgc25hcHNob3RzIG9mIEdDQyBwcmlvciB0byAzLjAuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4NCB8IGFpeDQuW1swMV1dIHwgYWl4NC5bWzAxXV0uKikKKyAgICAgIGlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCisJICAgZWNobyAnIHllcyAnCisJICAgZWNobyAnI2VuZGlmJzsgfSB8ICR7Q0N9IC1FIC0gfCBncmVwIHllcyA+IC9kZXYvbnVsbDsgdGhlbgorCToKKyAgICAgIGVsc2UKKwljYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisgICAgIyBBSVggKG9uIFBvd2VyKikgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gY3VycmVudGx5IHdlIGNhbiBub3QgaGFyZGNvZGUgY29ycmVjdAorICAgICMgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuIGFkZCB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8KKyAgICAjIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbiBiZSB1c2VmdWwgaW4gZnV0dXJlLgorICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorICAgICAgIyBJZiB1c2luZyBydW4gdGltZSBsaW5raW5nIChvbiBBSVggNC4yIG9yIGxhdGVyKSB1c2UgbGliPG5hbWU+LnNvCisgICAgICAjIGluc3RlYWQgb2YgbGliPG5hbWU+LmEgdG8gbGV0IHBlb3BsZSBrbm93IHRoYXQgdGhlc2UgYXJlIG5vdAorICAgICAgIyB0eXBpY2FsIEFJWCBzaGFyZWQgbGlicmFyaWVzLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgZWxzZQorICAgICAgIyBXZSBwcmVzZXJ2ZSAuYSBhcyBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJpZXMgdGhyb3VnaCBBSVg0LjIKKyAgICAgICMgYW5kIGxhdGVyIHdoZW4gd2UgYXJlIG5vdCBkb2luZyBydW4gdGltZSBsaW5raW5nLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5hICRsaWJuYW1lLmEnCisgICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGZpCisgICAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIGZpCisgIDs7CisKK2FtaWdhb3MqKQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJworICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgorICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbW14vXV0qXClcLml4bGlicmFyeSQlXDElJ1wnJ2A7IHRlc3QgJHJtIC9zeXMvbGlicy8ke2xpYm5hbWV9X2l4bGlicmFyeS5hOyAkc2hvdyAiY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSI7IGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgfHwgZXhpdCAxOyBkb25lJworICA7OworCitiZW9zKikKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgorICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAorICA7OworCitic2RpW1s0NV1dKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKKyAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93CisgICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcworICA7OworCitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgIHZlcnNpb25fdHlwZT13aW5kb3dzCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX3ZlcnNpb249bm8KKyAgbmVlZF9saWJfcHJlZml4PW5vCisKKyAgY2FzZSAkR0NDLCRob3N0X29zIGluCisgIHllcyxjeWd3aW4qIHwgeWVzLG1pbmd3KiB8IHllcyxwdzMyKikKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLmRsbC5hJworICAgICMgRExMIGlzIGluc3RhbGxlZCB0byAkKGxpYmRpcikvLi4vYmluIGJ5IHBvc3RpbnN0YWxsX2NtZHMKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSdiYXNlX2ZpbGU9YGJhc2VuYW1lIFwke2ZpbGV9YH4KKyAgICAgIGRscGF0aD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGRpci8nXCcnXCR7YmFzZV9maWxlfSdcJydpO2VjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KKyAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgorICAgICAgJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgXCRkbGRpci8kZGxuYW1lfgorICAgICAgY2htb2QgYSt4IFwkZGxkaXIvJGRsbmFtZScKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZmlsZTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxwYXRoPSRkaXIvXCRkbGRsbH4KKyAgICAgICAkcm0gXCRkbHBhdGgnCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGN5Z3dpbiopCisgICAgICAjIEN5Z3dpbiBETExzIHVzZSAnY3lnJyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIHNvbmFtZV9zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvY3lnLydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvW1suXV0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiAvbGliL3czMmFwaSAvbGliIC91c3IvbG9jYWwvbGliIgorICAgICAgOzsKKyAgICBtaW5ndyopCisgICAgICAjIE1pbkdXIERMTHMgdXNlIHRyYWRpdGlvbmFsICdsaWInIHByZWZpeAorICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBncmVwICJebGlicmFyaWVzOiIgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCisgICAgICBpZiBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IFtncmVwICc7W2MtekMtWl06LycgPi9kZXYvbnVsbF07IHRoZW4KKyAgICAgICAgIyBJdCBpcyBtb3N0IHByb2JhYmx5IGEgV2luZG93cyBmb3JtYXQgUEFUSCBwcmludGVkIGJ5CisgICAgICAgICMgbWluZ3cgZ2NjLCBidXQgd2UgYXJlIHJ1bm5pbmcgb24gQ3lnd2luLiBHY2MgcHJpbnRzIGl0cyBzZWFyY2gKKyAgICAgICAgIyBwYXRoIHdpdGggOyBzZXBhcmF0b3JzLCBhbmQgd2l0aCBkcml2ZSBsZXR0ZXJzLiBXZSBjYW4gaGFuZGxlIHRoZQorICAgICAgICAjIGRyaXZlIGxldHRlcnMgKGN5Z3dpbiBmaWxldXRpbHMgdW5kZXJzdGFuZHMgdGhlbSksIHNvIGxlYXZlIHRoZW0sCisgICAgICAgICMgZXNwZWNpYWxseSBhcyB3ZSBtaWdodCBwYXNzIGZpbGVzIGZvdW5kIHRoZXJlIHRvIGEgbWluZ3cgb2JqZHVtcCwKKyAgICAgICAgIyB3aGljaCB3b3VsZG4ndCB1bmRlcnN0YW5kIGEgY3lnd2luaWZpZWQgcGF0aC4gQWhoLgorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCisgICAgICBlbHNlCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKKyAgICAgIGZpCisgICAgICA7OworICAgIHB3MzIqKQorICAgICAgIyBwdzMyIERMTHMgdXNlICdwdycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9wdy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisKKyAgKikKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUubGliJworICAgIDs7CisgIGVzYWMKKyAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKKyAgIyBGSVhNRTogZmlyc3Qgd2Ugc2hvdWxkIHNlYXJjaCAuIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGlzIGluCisgIHNobGlicGF0aF92YXI9UEFUSAorICA7OworCitkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZHlsZCIKKyAgdmVyc2lvbl90eXBlPWRhcndpbgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3ZlcnN1ZmZpeH0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0JworICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIHNobGlicGF0aF92YXI9RFlMRF9MSUJSQVJZX1BBVEgKKyAgc2hyZXh0X2NtZHM9J2B0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIC5zbyB8fCBlY2hvIC5keWxpYmAnCisgICMgQXBwbGUncyBnY2MgcHJpbnRzICdnY2MgLXByaW50LXNlYXJjaC1kaXJzJyBkb2Vzbid0IG9wZXJhdGUgdGhlIHNhbWUuCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgdHIgIlxuIiAiJFBBVEhfU0VQQVJBVE9SIiB8IHNlZCAtZSAncy9saWJyYXJpZXM6L0BsaWJyYXJpZXM6LycgfCB0ciAiQCIgIlxuIiB8IGdyZXAgIl5saWJyYXJpZXM6IiB8IHNlZCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciIC1lICJzLCRQQVRIX1NFUEFSQVRPUiwgLGciIC1lICJzLC4qLCYgL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYixnImAKKyAgZWxzZQorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYicKKyAgZmkKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC9saWIgL3Vzci9saWInCisgIDs7CisKK2RndXgqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHNoYXJlZF9leHQnCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKK2ZyZWVic2QxKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKKwora2ZyZWVic2QqLWdudSkKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKKyAgOzsKKworZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICAjIERyYWdvbkZseSBkb2VzIG5vdCBoYXZlIGFvdXQuICBXaGVuL2lmIHRoZXkgaW1wbGVtZW50IGEgbmV3CisgICMgdmVyc2lvbmluZyBtZWNoYW5pc20sIGFkanVzdCB0aGlzLgorICBpZiB0ZXN0IC14IC91c3IvYmluL29iamZvcm1hdDsgdGhlbgorICAgIG9iamZvcm1hdD1gL3Vzci9iaW4vb2JqZm9ybWF0YAorICBlbHNlCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGZyZWVic2RbWzEyM11dKikgb2JqZm9ybWF0PWFvdXQgOzsKKyAgICAqKSBvYmpmb3JtYXQ9ZWxmIDs7CisgICAgZXNhYworICBmaQorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC0kb2JqZm9ybWF0CisgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorICAgIGZyZWVic2QtZWxmKikKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgZnJlZWJzZC0qKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgICAgICBuZWVkX3ZlcnNpb249eWVzCisgICAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgZnJlZWJzZDIqKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICA7OworICBmcmVlYnNkMy5bWzAxXV0qIHwgZnJlZWJzZGVsZjMuW1swMV1dKikKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgIGZyZWVic2QzLltbMi05XV0qIHwgZnJlZWJzZGVsZjMuW1syLTldXSogfCBcCisgIGZyZWVic2Q0LltbMC01XV0gfCBmcmVlYnNkZWxmNC5bWzAtNV1dIHwgZnJlZWJzZDQuMS4xIHwgZnJlZWJzZGVsZjQuMS4xKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBmcmVlYnNkKikgIyBmcm9tIDQuNiBvbgorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZXNhYworICA7OworCitnbnUqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHttYWpvcn0gJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICMgR2l2ZSBhIHNvbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYWpvciB2ZXJzaW9uIHNvIHRoYXQgZGxkLnNsIHJlZnVzZXMgdG8KKyAgIyBsaW5rIGFnYWluc3Qgb3RoZXIgdmVyc2lvbnMuCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGNhc2UgJGhvc3RfY3B1IGluCisgIGlhNjQqKQorICAgIHNocmV4dF9jbWRzPScuc28nCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc28iCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBpZiB0ZXN0ICJYJEhQVVhfSUE2NF9NT0RFIiA9IFgzMjsgdGhlbgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliIgorICAgIGVsc2UKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDY0IC91c3IvbG9jYWwvbGliL2hwdXg2NCIKKyAgICBmaQorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICA7OworICAgaHBwYSo2NCopCisgICAgIHNocmV4dF9jbWRzPScuc2wnCisgICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEggIyBIb3cgc2hvdWxkIHdlIGhhbmRsZSBTSExJQl9QQVRICisgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KKyAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvcGEyMF82NCAvdXNyL2Njcy9saWIvcGEyMF82NCIKKyAgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYworICAgICA7OworICAgKikKKyAgICBzaHJleHRfY21kcz0nLnNsJworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgc2hsaWJwYXRoX3Zhcj1TSExJQl9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vICMgK3MgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIFNITElCX1BBVEgKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIDs7CisgIGVzYWMKKyAgIyBIUC1VWCBydW5zICpyZWFsbHkqIHNsb3dseSB1bmxlc3Mgc2hhcmVkIGxpYnJhcmllcyBhcmUgbW9kZSA1NTUuCisgIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDU1NSAkbGliJworICA7OworCitpbnRlcml4MyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGR5bmFtaWNfbGlua2VyPSdJbnRlcml4IDMueCBsZC5zby4xIChQRSwgbGlrZSBFTEYpJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICBjYXNlICRob3N0X29zIGluCisgICAgbm9uc3RvcHV4KikgdmVyc2lvbl90eXBlPW5vbnN0b3B1eCA7OworICAgICopCisJaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgorCQl2ZXJzaW9uX3R5cGU9bGludXgKKwllbHNlCisJCXZlcnNpb25fdHlwZT1pcml4CisJZmkgOzsKKyAgZXNhYworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBpcml4NSogfCBub25zdG9wdXgqKQorICAgIGxpYnN1ZmY9IHNobGlic3VmZj0KKyAgICA7OworICAqKQorICAgIGNhc2UgJExEIGluICMgbGlidG9vbC5tNCB3aWxsIGFkZCBvbmUgb2YgdGhlc2Ugc3dpdGNoZXMgdG8gTEQKKyAgICAqLTMyfCoiLTMyICJ8Ki1tZWxmMzJic21pcHwqIi1tZWxmMzJic21pcCAiKQorICAgICAgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz0zMi1iaXQ7OworICAgICotbjMyfCoiLW4zMiAifCotbWVsZjMyYm1pcG4zMnwqIi1tZWxmMzJibWlwbjMyICIpCisgICAgICBsaWJzdWZmPTMyIHNobGlic3VmZj1OMzIgbGlibWFnaWM9TjMyOzsKKyAgICAqLTY0fCoiLTY0ICJ8Ki1tZWxmNjRibWlwfCoiLW1lbGY2NGJtaXAgIikKKyAgICAgIGxpYnN1ZmY9NjQgc2hsaWJzdWZmPTY0IGxpYm1hZ2ljPTY0LWJpdDs7CisgICAgKikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZJHtzaGxpYnN1ZmZ9X1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSIKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCisjIE5vIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgTGludXggb2xkbGQsIGFvdXQsIG9yIGNvZmYuCitsaW51eCpvbGRsZCogfCBsaW51eCphb3V0KiB8IGxpbnV4KmNvZmYqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCisjIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCitsaW51eCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgIyBUaGlzIGltcGxpZXMgbm8gZmFzdF9pbnN0YWxsLCB3aGljaCBpcyB1bmFjY2VwdGFibGUuCisgICMgU29tZSByZXdvcmsgd2lsbCBiZSBuZWVkZWQgdG8gYWxsb3cgZm9yIGZhc3RfaW5zdGFsbAorICAjIGJlZm9yZSB0aGlzIGNhbiBiZSBlbmFibGVkLgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisKKyAgIyBBcHBlbmQgbGQuc28uY29uZiBjb250ZW50cyB0byB0aGUgc2VhcmNoIHBhdGgKKyAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KKyAgICBsdF9sZF9leHRyYT1gYXdrICcvXmluY2x1ZGUgLyB7IHN5c3RlbShzcHJpbnRmKCJjZCAvZXRjOyBjYXQgJXMiLCBcWyRdMikpOyBza2lwID0gMTsgfSB7IGlmICghc2tpcCkgcHJpbnQgXFskXTA7IHNraXAgPSAwOyB9JyA8IC9ldGMvbGQuc28uY29uZiB8ICRTRUQgLWUgJ3MvIy4qLy87cy9bOiwJXS8gL2c7cy89W149XSokLy87cy89W149IF0qIC8gL2c7L14kL2QnIHwgdHIgJ1xuJyAnICdgCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgJGx0X2xkX2V4dHJhIgorICBmaQorCisgICMgV2UgdXNlZCB0byB0ZXN0IGZvciAvbGliL2xkLnNvLjEgYW5kIGRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyBvbgorICAjIHBvd2VycGMsIGJlY2F1c2UgTWtMaW51eCBvbmx5IHN1cHBvcnRlZCBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhlCisgICMgR05VIGR5bmFtaWMgbGlua2VyLiAgU2luY2UgdGhpcyB3YXMgYnJva2VuIHdpdGggY3Jvc3MgY29tcGlsZXJzLAorICAjIG1vc3QgcG93ZXJwYy1saW51eCBib3hlcyBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyB0aGVzZSBkYXlzIGFuZAorICAjIHBlb3BsZSBjYW4gYWx3YXlzIC0tZGlzYWJsZS1zaGFyZWQsIHRoZSB0ZXN0IHdhcyByZW1vdmVkLCBhbmQgd2UKKyAgIyBhc3N1bWUgdGhlIEdOVS9MaW51eCBkeW5hbWljIGxpbmtlciBpcyBpbiB1c2UuCisgIGR5bmFtaWNfbGlua2VyPSdHTlUvTGludXggbGQuc28nCisgIDs7CisKK2tuZXRic2QqLWdudSkKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKKyAgOzsKKworbmV0YnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgICAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKKyAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIChhLm91dCkgbGQuc28nCisgIGVsc2UKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCisgIGZpCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCituZXdzb3M2KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgOzsKKworbnRvLXFueCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIDs7CisKK29wZW5ic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgIyBTb21lIG9sZGVyIHZlcnNpb25zIG9mIE9wZW5CU0QgKDMuMyBhdCBsZWFzdCkgKmRvKiBuZWVkIHZlcnNpb25lZCBsaWJzLgorICBjYXNlICRob3N0X29zIGluCisgICAgb3BlbmJzZDMuMyB8IG9wZW5ic2QzLjMuKikgbmVlZF92ZXJzaW9uPXllcyA7OworICAgICopICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRfdmVyc2lvbj1ubyAgOzsKKyAgZXNhYworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBvcGVuYnNkMi5bWzg5XV0gfCBvcGVuYnNkMi5bWzg5XV0uKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKwk7OworICAgICAgKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisJOzsKKyAgICAgIGVzYWMKKyAgZWxzZQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgZmkKKyAgOzsKKworb3MyKikKKyAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fSAkbGlibmFtZS5hJworICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorICA7OworCitvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCisgIDs7CisKK3NvbGFyaXMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICMgbGRkIGNvbXBsYWlucyB1bmxlc3MgbGlicmFyaWVzIGFyZSBleGVjdXRhYmxlCisgIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kICt4ICRsaWInCisgIDs7CisKK3N1bm9zNCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi91c3IvZXRjIiBsZGNvbmZpZyAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgZmkKKyAgbmVlZF92ZXJzaW9uPXllcworICA7OworCitzeXN2NCB8IHN5c3Y0LjMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisgICAgc25pKQorICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tQmxhcmdlZHluc3ltJworICAgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICAgIDs7CisgICAgc2llbWVucykKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBtb3Rvcm9sYSkKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2Njcy9saWInCisgICAgICA7OworICBlc2FjCisgIDs7CisKK3N5c3Y0Kk1QKikKKyAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgorICAgIHZlcnNpb25fdHlwZT1saW51eAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3InCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZmkKKyAgOzsKKworc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKiB8IHN5c3Y0KnV3MiopCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLWVsZgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC91c3IvZ251L2xpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIgL2xpYicKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgZWxzZQorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9jY3MvbGliIC91c3IvbGliJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBzY28zLjJ2NSopCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvbGliIgorCTs7CisgICAgZXNhYworICBmaQorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9saWInCisgIDs7CisKK3V0czQqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKKyopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7Citlc2FjCitBQ19NU0dfUkVTVUxUKFskZHluYW1pY19saW5rZXJdKQordGVzdCAiJGR5bmFtaWNfbGlua2VyIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKwordmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IlBBVEggJHNobGlicGF0aF92YXIgJHJ1bnBhdGhfdmFyIgoraWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayBHQ0NfRVhFQ19QUkVGSVggQ09NUElMRVJfUEFUSCBMSUJSQVJZX1BBVEgiCitmaQorXSkjIEFDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSCisKKworIyBfTFRfQUNfVEFHQ09ORklHCisjIC0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfTFRfQUNfVEFHQ09ORklHXSwKK1tBQ19BUkdfV0lUSChbdGFnc10sCisgICAgW0FDX0hFTFBfU1RSSU5HKFstLXdpdGgtdGFnc0A8OkA9VEFHU0A6PkBdLAorICAgICAgICBbaW5jbHVkZSBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb25zIEA8OkBhdXRvbWF0aWNAOj5AXSldLAorICAgIFt0YWduYW1lcz0iJHdpdGh2YWwiXSkKKworaWYgdGVzdCAtZiAiJGx0bWFpbiIgJiYgdGVzdCAtbiAiJHRhZ25hbWVzIjsgdGhlbgorICBpZiB0ZXN0ICEgLWYgIiR7b2ZpbGV9IjsgdGhlbgorICAgIEFDX01TR19XQVJOKFtvdXRwdXQgZmlsZSBgJG9maWxlJyBkb2VzIG5vdCBleGlzdF0pCisgIGZpCisKKyAgaWYgdGVzdCAteiAiJExUQ0MiOyB0aGVuCisgICAgZXZhbCAiYCRTSEVMTCAke29maWxlfSAtLWNvbmZpZyB8IGdyZXAgJ15MVENDPSdgIgorICAgIGlmIHRlc3QgLXogIiRMVENDIjsgdGhlbgorICAgICAgQUNfTVNHX1dBUk4oW291dHB1dCBmaWxlIGAkb2ZpbGUnIGRvZXMgbm90IGxvb2sgbGlrZSBhIGxpYnRvb2wgc2NyaXB0XSkKKyAgICBlbHNlCisgICAgICBBQ19NU0dfV0FSTihbdXNpbmcgYExUQ0M9JExUQ0MnLCBleHRyYWN0ZWQgZnJvbSBgJG9maWxlJ10pCisgICAgZmkKKyAgZmkKKyAgaWYgdGVzdCAteiAiJExUQ0ZMQUdTIjsgdGhlbgorICAgIGV2YWwgImAkU0hFTEwgJHtvZmlsZX0gLS1jb25maWcgfCBncmVwICdeTFRDRkxBR1M9J2AiCisgIGZpCisKKyAgIyBFeHRyYWN0IGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBpbiAkb2ZpbGUuCisgICMgTm90ZSB0aGF0IHRoaXMgYXNzdW1lcyB0aGUgZW50aXJlIGxpc3QgaXMgb24gb25lIGxpbmUuCisgIGF2YWlsYWJsZV90YWdzPWBncmVwICJeYXZhaWxhYmxlX3RhZ3M9IiAiJHtvZmlsZX0iIHwgJFNFRCAtZSAncy9hdmFpbGFibGVfdGFncz1cKC4qJFwpL1wxLycgLWUgJ3MvXCIvL2cnYAorCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICBmb3IgdGFnbmFtZSBpbiAkdGFnbmFtZXM7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgIyBDaGVjayB3aGV0aGVyIHRhZ25hbWUgY29udGFpbnMgb25seSB2YWxpZCBjaGFyYWN0ZXJzCisgICAgY2FzZSBgJGVjaG8gIlgkdGFnbmFtZSIgfCAkWHNlZCAtZSAnczpbWy1fQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejEyMzQ1Njc4OTAsL11dOjpnJ2AgaW4KKyAgICAiIikgOzsKKyAgICAqKSAgQUNfTVNHX0VSUk9SKFtpbnZhbGlkIHRhZyBuYW1lOiAkdGFnbmFtZV0pCisJOzsKKyAgICBlc2FjCisKKyAgICBpZiBncmVwICJeIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZSQiIDwgIiR7b2ZpbGV9IiA+IC9kZXYvbnVsbAorICAgIHRoZW4KKyAgICAgIEFDX01TR19FUlJPUihbdGFnIG5hbWUgXCIkdGFnbmFtZVwiIGFscmVhZHkgZXhpc3RzXSkKKyAgICBmaQorCisgICAgIyBVcGRhdGUgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ3MuCisgICAgaWYgdGVzdCAtbiAiJHRhZ25hbWUiOyB0aGVuCisgICAgICBlY2hvIGFwcGVuZGluZyBjb25maWd1cmF0aW9uIHRhZyBcIiR0YWduYW1lXCIgdG8gJG9maWxlCisKKyAgICAgIGNhc2UgJHRhZ25hbWUgaW4KKyAgICAgIENYWCkKKwlpZiB0ZXN0IC1uICIkQ1hYIiAmJiAoIHRlc3QgIlgkQ1hYIiAhPSAiWG5vIiAmJgorCSAgICAoICh0ZXN0ICJYJENYWCIgPSAiWGcrKyIgJiYgYGcrKyAtdiA+L2Rldi9udWxsIDI+JjFgICkgfHwKKwkgICAgKHRlc3QgIlgkQ1hYIiAhPSAiWGcrKyIpKSkgOyB0aGVuCisJICBBQ19MSUJUT09MX0xBTkdfQ1hYX0NPTkZJRworCWVsc2UKKwkgIHRhZ25hbWU9IiIKKwlmaQorCTs7CisKKyAgICAgIEY3NykKKwlpZiB0ZXN0IC1uICIkRjc3IiAmJiB0ZXN0ICJYJEY3NyIgIT0gIlhubyI7IHRoZW4KKwkgIEFDX0xJQlRPT0xfTEFOR19GNzdfQ09ORklHCisJZWxzZQorCSAgdGFnbmFtZT0iIgorCWZpCisJOzsKKworICAgICAgR0NKKQorCWlmIHRlc3QgLW4gIiRHQ0oiICYmIHRlc3QgIlgkR0NKIiAhPSAiWG5vIjsgdGhlbgorCSAgQUNfTElCVE9PTF9MQU5HX0dDSl9DT05GSUcKKwllbHNlCisJICB0YWduYW1lPSIiCisJZmkKKwk7OworCisgICAgICBSQykKKwlBQ19MSUJUT09MX0xBTkdfUkNfQ09ORklHCisJOzsKKworICAgICAgKikKKwlBQ19NU0dfRVJST1IoW1Vuc3VwcG9ydGVkIHRhZyBuYW1lOiAkdGFnbmFtZV0pCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBBcHBlbmQgdGhlIG5ldyB0YWcgbmFtZSB0byB0aGUgbGlzdCBvZiBhdmFpbGFibGUgdGFncy4KKyAgICAgIGlmIHRlc3QgLW4gIiR0YWduYW1lIiA7IHRoZW4KKyAgICAgIGF2YWlsYWJsZV90YWdzPSIkYXZhaWxhYmxlX3RhZ3MgJHRhZ25hbWUiCisgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorCisgICMgTm93IHN1YnN0aXR1dGUgdGhlIHVwZGF0ZWQgbGlzdCBvZiBhdmFpbGFibGUgdGFncy4KKyAgaWYgZXZhbCAic2VkIC1lICdzL15hdmFpbGFibGVfdGFncz0uKlwkL2F2YWlsYWJsZV90YWdzPVwiJGF2YWlsYWJsZV90YWdzXCIvJyBcIiRvZmlsZVwiID4gXCIke29maWxlfVRcIiI7IHRoZW4KKyAgICBtdiAiJHtvZmlsZX1UIiAiJG9maWxlIgorICAgIGNobW9kICt4ICIkb2ZpbGUiCisgIGVsc2UKKyAgICBybSAtZiAiJHtvZmlsZX1UIgorICAgIEFDX01TR19FUlJPUihbdW5hYmxlIHRvIHVwZGF0ZSBsaXN0IG9mIGF2YWlsYWJsZSB0YWdnZWQgY29uZmlndXJhdGlvbnMuXSkKKyAgZmkKK2ZpCitdKSMgX0xUX0FDX1RBR0NPTkZJRworCisKKyMgQUNfTElCVE9PTF9ETE9QRU4KKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgZW5hYmxlIGNoZWNrcyBmb3IgZGxvcGVuIHN1cHBvcnQKK0FDX0RFRlVOKFtBQ19MSUJUT09MX0RMT1BFTl0sCisgW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSkKK10pIyBBQ19MSUJUT09MX0RMT1BFTgorCisKKyMgQUNfTElCVE9PTF9XSU4zMl9ETEwKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZGVjbGFyZSBwYWNrYWdlIHN1cHBvcnQgZm9yIGJ1aWxkaW5nIHdpbjMyIERMTHMKK0FDX0RFRlVOKFtBQ19MSUJUT09MX1dJTjMyX0RMTF0sCitbQUNfQkVGT1JFKFskMF0sIFtBQ19MSUJUT09MX1NFVFVQXSkKK10pIyBBQ19MSUJUT09MX1dJTjMyX0RMTAorCisKKyMgQUNfRU5BQkxFX1NIQVJFRChbREVGQVVMVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXNoYXJlZCBmbGFnCisjIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBgeWVzJy4KK0FDX0RFRlVOKFtBQ19FTkFCTEVfU0hBUkVEXSwKK1tkZWZpbmUoW0FDX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAorQUNfQVJHX0VOQUJMRShbc2hhcmVkXSwKKyAgICBbQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXNoYXJlZEA8OkA9UEtHU0A6PkBdLAorCVtidWlsZCBzaGFyZWQgbGlicmFyaWVzIEA8OkBkZWZhdWx0PV1BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRbQDo+QF0pXSwKKyAgICBbcD0ke1BBQ0tBR0UtZGVmYXVsdH0KKyAgICBjYXNlICRlbmFibGV2YWwgaW4KKyAgICB5ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7CisgICAgbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKKyAgICAqKQorICAgICAgZW5hYmxlX3NoYXJlZD1ubworICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKwkgIGVuYWJsZV9zaGFyZWQ9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjXSwKKyAgICBbZW5hYmxlX3NoYXJlZD1dQUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUKQorXSkjIEFDX0VOQUJMRV9TSEFSRUQKKworCisjIEFDX0RJU0FCTEVfU0hBUkVECisjIC0tLS0tLS0tLS0tLS0tLS0tCisjIHNldCB0aGUgZGVmYXVsdCBzaGFyZWQgZmxhZyB0byAtLWRpc2FibGUtc2hhcmVkCitBQ19ERUZVTihbQUNfRElTQUJMRV9TSEFSRURdLAorW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKK0FDX0VOQUJMRV9TSEFSRUQobm8pCitdKSMgQUNfRElTQUJMRV9TSEFSRUQKKworCisjIEFDX0VOQUJMRV9TVEFUSUMoW0RFRkFVTFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zdGF0aWMgZmxhZworIyBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYHllcycuCitBQ19ERUZVTihbQUNfRU5BQkxFX1NUQVRJQ10sCitbZGVmaW5lKFtBQ19FTkFCTEVfU1RBVElDX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKK0FDX0FSR19FTkFCTEUoW3N0YXRpY10sCisgICAgW0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1zdGF0aWNAPDpAPVBLR1NAOj5AXSwKKwlbYnVpbGQgc3RhdGljIGxpYnJhcmllcyBAPDpAZGVmYXVsdD1dQUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUW0A6PkBdKV0sCisgICAgW3A9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkZW5hYmxldmFsIGluCisgICAgeWVzKSBlbmFibGVfc3RhdGljPXllcyA7OworICAgIG5vKSBlbmFibGVfc3RhdGljPW5vIDs7CisgICAgKikKKyAgICAgZW5hYmxlX3N0YXRpYz1ubworICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKwkgIGVuYWJsZV9zdGF0aWM9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjXSwKKyAgICBbZW5hYmxlX3N0YXRpYz1dQUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUKQorXSkjIEFDX0VOQUJMRV9TVEFUSUMKKworCisjIEFDX0RJU0FCTEVfU1RBVElDCisjIC0tLS0tLS0tLS0tLS0tLS0tCisjIHNldCB0aGUgZGVmYXVsdCBzdGF0aWMgZmxhZyB0byAtLWRpc2FibGUtc3RhdGljCitBQ19ERUZVTihbQUNfRElTQUJMRV9TVEFUSUNdLAorW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKK0FDX0VOQUJMRV9TVEFUSUMobm8pCitdKSMgQUNfRElTQUJMRV9TVEFUSUMKKworCisjIEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwoW0RFRkFVTFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1mYXN0LWluc3RhbGwgZmxhZworIyBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYHllcycuCitBQ19ERUZVTihbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF0sCitbZGVmaW5lKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKK0FDX0FSR19FTkFCTEUoW2Zhc3QtaW5zdGFsbF0sCisgICAgW0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1mYXN0LWluc3RhbGxAPDpAPVBLR1NAOj5AXSwKKyAgICBbb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIEA8OkBkZWZhdWx0PV1BQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRbQDo+QF0pXSwKKyAgICBbcD0ke1BBQ0tBR0UtZGVmYXVsdH0KKyAgICBjYXNlICRlbmFibGV2YWwgaW4KKyAgICB5ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7CisgICAgbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKKyAgICAqKQorICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubworICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKwkgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjXSwKKyAgICBbZW5hYmxlX2Zhc3RfaW5zdGFsbD1dQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUKQorXSkjIEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwKKworCisjIEFDX0RJU0FCTEVfRkFTVF9JTlNUQUxMCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHNldCB0aGUgZGVmYXVsdCB0byAtLWRpc2FibGUtZmFzdC1pbnN0YWxsCitBQ19ERUZVTihbQUNfRElTQUJMRV9GQVNUX0lOU1RBTExdLAorW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKK0FDX0VOQUJMRV9GQVNUX0lOU1RBTEwobm8pCitdKSMgQUNfRElTQUJMRV9GQVNUX0lOU1RBTEwKKworCisjIEFDX0xJQlRPT0xfUElDTU9ERShbTU9ERV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGltcGxlbWVudCB0aGUgLS13aXRoLXBpYyBmbGFnCisjIE1PREUgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBgYm90aCcuCitBQ19ERUZVTihbQUNfTElCVE9PTF9QSUNNT0RFXSwKK1tBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCitwaWNfbW9kZT1pZmVsc2UoJCMsMSwkMSxkZWZhdWx0KQorXSkjIEFDX0xJQlRPT0xfUElDTU9ERQorCisKKyMgQUNfUFJPR19FR1JFUAorIyAtLS0tLS0tLS0tLS0tCisjIFRoaXMgaXMgcHJlZGVmaW5lZCBzdGFydGluZyB3aXRoIEF1dG9jb25mIDIuNTQsIHNvIHRoaXMgY29uZGl0aW9uYWwKKyMgZGVmaW5pdGlvbiBjYW4gYmUgcmVtb3ZlZCBvbmNlIHdlIHJlcXVpcmUgQXV0b2NvbmYgMi41NCBvciBsYXRlci4KK200X2lmbmRlZihbQUNfUFJPR19FR1JFUF0sIFtBQ19ERUZVTihbQUNfUFJPR19FR1JFUF0sCitbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBlZ3JlcF0sIFthY19jdl9wcm9nX2VncmVwXSwKKyAgIFtpZiBlY2hvIGEgfCAoZ3JlcCAtRSAnKGF8YiknKSA+L2Rldi9udWxsIDI+JjEKKyAgICB0aGVuIGFjX2N2X3Byb2dfZWdyZXA9J2dyZXAgLUUnCisgICAgZWxzZSBhY19jdl9wcm9nX2VncmVwPSdlZ3JlcCcKKyAgICBmaV0pCisgRUdSRVA9JGFjX2N2X3Byb2dfZWdyZXAKKyBBQ19TVUJTVChbRUdSRVBdKQorXSldKQorCisKKyMgQUNfUEFUSF9UT09MX1BSRUZJWAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tCisjIGZpbmQgYSBmaWxlIHByb2dyYW0gd2hpY2ggY2FuIHJlY29nbmlzZSBzaGFyZWQgbGlicmFyeQorQUNfREVGVU4oW0FDX1BBVEhfVE9PTF9QUkVGSVhdLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfRUdSRVBdKWRubAorQUNfTVNHX0NIRUNLSU5HKFtmb3IgJDFdKQorQUNfQ0FDSEVfVkFMKGx0X2N2X3BhdGhfTUFHSUNfQ01ELAorW2Nhc2UgJE1BR0lDX0NNRCBpbgorW1tcXC8qXSB8ICA/OltcXC9dKl0pCisgIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkTUFHSUNfQ01EIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyopCisgIGx0X3NhdmVfTUFHSUNfQ01EPSIkTUFHSUNfQ01EIgorICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2RubCAkYWNfZHVtbXkgZm9yY2VzIHNwbGl0dGluZyBvbiBjb25zdGFudCB1c2VyLXN1cHBsaWVkIHBhdGhzLgorZG5sIFBPU0lYLjIgd29yZCBzcGxpdHRpbmcgaXMgZG9uZSBvbmx5IG9uIHRoZSBvdXRwdXQgb2Ygd29yZCBleHBhbnNpb25zLAorZG5sIG5vdCBldmVyeSB3b3JkLiAgVGhpcyBjbG9zZXMgYSBsb25nc3RhbmRpbmcgc2ggc2VjdXJpdHkgaG9sZS4KKyAgYWNfZHVtbXk9ImlmZWxzZShbJDJdLCAsICRQQVRILCBbJDJdKSIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJDE7IHRoZW4KKyAgICAgIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkYWNfZGlyLyQxIgorICAgICAgaWYgdGVzdCAtbiAiJGZpbGVfbWFnaWNfdGVzdF9maWxlIjsgdGhlbgorCWNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCisJImZpbGVfbWFnaWMgIiopCisJICBmaWxlX21hZ2ljX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogImZpbGVfbWFnaWMgXCguKlwpImAKKwkgIE1BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgorCSAgaWYgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCRmaWxlX21hZ2ljX3Rlc3RfZmlsZSAyPiAvZGV2L251bGwgfAorCSAgICAkRUdSRVAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICA6CisJICBlbHNlCisJICAgIGNhdCA8PEVPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiB0aGUgY29tbWFuZCBsaWJ0b29sIHVzZXMgdG8gZGV0ZWN0IHNoYXJlZCBsaWJyYXJpZXMsCisqKiogJGZpbGVfbWFnaWNfY21kLCBwcm9kdWNlcyBvdXRwdXQgdGhhdCBsaWJ0b29sIGNhbm5vdCByZWNvZ25pemUuCisqKiogVGhlIHJlc3VsdCBpcyB0aGF0IGxpYnRvb2wgbWF5IGZhaWwgdG8gcmVjb2duaXplIHNoYXJlZCBsaWJyYXJpZXMKKyoqKiBhcyBzdWNoLiAgVGhpcyB3aWxsIGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMgdGhhdAorKioqIGRlcGVuZCBvbiBzaGFyZWQgbGlicmFyaWVzLCBidXQgcHJvZ3JhbXMgbGlua2VkIHdpdGggc3VjaCBsaWJ0b29sCisqKiogbGlicmFyaWVzIHdpbGwgd29yayByZWdhcmRsZXNzIG9mIHRoaXMgcHJvYmxlbS4gIE5ldmVydGhlbGVzcywgeW91CisqKiogbWF5IHdhbnQgdG8gcmVwb3J0IHRoZSBwcm9ibGVtIHRvIHlvdXIgc3lzdGVtIG1hbmFnZXIgYW5kL29yIHRvCisqKiogYnVnLWxpYnRvb2xAZ251Lm9yZworCitFT0YKKwkgIGZpIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgTUFHSUNfQ01EPSIkbHRfc2F2ZV9NQUdJQ19DTUQiCisgIDs7Citlc2FjXSkKK01BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgoraWYgdGVzdCAtbiAiJE1BR0lDX0NNRCI7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVCgkTUFHSUNfQ01EKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vKQorZmkKK10pIyBBQ19QQVRIX1RPT0xfUFJFRklYCisKKworIyBBQ19QQVRIX01BR0lDCisjIC0tLS0tLS0tLS0tLS0KKyMgZmluZCBhIGZpbGUgcHJvZ3JhbSB3aGljaCBjYW4gcmVjb2duaXNlIGEgc2hhcmVkIGxpYnJhcnkKK0FDX0RFRlVOKFtBQ19QQVRIX01BR0lDXSwKK1tBQ19QQVRIX1RPT0xfUFJFRklYKCR7YWNfdG9vbF9wcmVmaXh9ZmlsZSwgL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSCkKK2lmIHRlc3QgLXogIiRsdF9jdl9wYXRoX01BR0lDX0NNRCI7IHRoZW4KKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAgIEFDX1BBVEhfVE9PTF9QUkVGSVgoZmlsZSwgL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSCkKKyAgZWxzZQorICAgIE1BR0lDX0NNRD06CisgIGZpCitmaQorXSkjIEFDX1BBVEhfTUFHSUMKKworCisjIEFDX1BST0dfTEQKKyMgLS0tLS0tLS0tLQorIyBmaW5kIHRoZSBwYXRobmFtZSB0byB0aGUgR05VIG9yIG5vbi1HTlUgbGlua2VyCitBQ19ERUZVTihbQUNfUFJPR19MRF0sCitbQUNfQVJHX1dJVEgoW2dudS1sZF0sCisgICAgW0FDX0hFTFBfU1RSSU5HKFstLXdpdGgtZ251LWxkXSwKKwlbYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIEA8OkBkZWZhdWx0PW5vQDo+QF0pXSwKKyAgICBbdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzXSwKKyAgICBbd2l0aF9nbnVfbGQ9bm9dKQorQUNfUkVRVUlSRShbTFRfQUNfUFJPR19TRURdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAorYWNfcHJvZz1sZAoraWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCisgIEFDX01TR19DSEVDS0lORyhbZm9yIGxkIHVzZWQgYnkgJENDXSkKKyAgY2FzZSAkaG9zdCBpbgorICAqLSotbWluZ3cqKQorICAgICMgZ2NjIGxlYXZlcyBhIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybiB3aGljaCB1cHNldHMgbWluZ3cKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjUgfCB0ciAtZCAnXDAxNSdgIDs7CisgICopCisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YCA7OworICBlc2FjCisgIGNhc2UgJGFjX3Byb2cgaW4KKyAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KKyAgICBbW1xcL11dKiB8ID86W1tcXC9dXSopCisgICAgICByZV9kaXJlbHQ9Jy9bW14vXV1bW14vXV0qL1wuXC4vJworICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGhuYW1lIG9mIGxkCisgICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCAkU0VEICdzJVxcXFwlLyVnJ2AKKyAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbworCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8ICRTRUQgInMlJHJlX2RpcmVsdCUvJSJgCisgICAgICBkb25lCisgICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKKyAgICAgIDs7CisgICIiKQorICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgorICAgIGFjX3Byb2c9bGQKKyAgICA7OworICAqKQorICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KKyAgICB3aXRoX2dudV9sZD11bmtub3duCisgICAgOzsKKyAgZXNhYworZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgIEFDX01TR19DSEVDS0lORyhbZm9yIEdOVSBsZF0pCitlbHNlCisgIEFDX01TR19DSEVDS0lORyhbZm9yIG5vbi1HTlUgbGRdKQorZmkKK0FDX0NBQ0hFX1ZBTChsdF9jdl9wYXRoX0xELAorW2lmIHRlc3QgLXogIiRMRCI7IHRoZW4KKyAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIiB8fCB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nJGFjX2V4ZWV4dCI7IHRoZW4KKyAgICAgIGx0X2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCisgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCisgICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgdmFyaWFudHMgb2YgR05VIGxkIG9ubHkgYWNjZXB0IC12LgorICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCisgICAgICBjYXNlIGAiJGx0X2N2X3BhdGhfTEQiIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KKyAgICAgICpHTlUqIHwgKid3aXRoIEJGRCcqKQorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKKwk7OworICAgICAgKikKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhaworCTs7CisgICAgICBlc2FjCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKK2Vsc2UKKyAgbHRfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KK2ZpXSkKK0xEPSIkbHRfY3ZfcGF0aF9MRCIKK2lmIHRlc3QgLW4gIiRMRCI7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVCgkTEQpCitlbHNlCisgIEFDX01TR19SRVNVTFQobm8pCitmaQordGVzdCAteiAiJExEIiAmJiBBQ19NU0dfRVJST1IoW25vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIXSkKK0FDX1BST0dfTERfR05VCitdKSMgQUNfUFJPR19MRAorCisKKyMgQUNfUFJPR19MRF9HTlUKKyMgLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBQ19QUk9HX0xEX0dOVV0sCitbQUNfUkVRVUlSRShbQUNfUFJPR19FR1JFUF0pZG5sCitBQ19DQUNIRV9DSEVDSyhbaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGRdLCBsdF9jdl9wcm9nX2dudV9sZCwKK1sjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZHMgb25seSBhY2NlcHQgLXYuCitjYXNlIGAkTEQgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgorKkdOVSogfCAqJ3dpdGggQkZEJyopCisgIGx0X2N2X3Byb2dfZ251X2xkPXllcworICA7OworKikKKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9bm8KKyAgOzsKK2VzYWNdKQord2l0aF9nbnVfbGQ9JGx0X2N2X3Byb2dfZ251X2xkCitdKSMgQUNfUFJPR19MRF9HTlUKKworCisjIEFDX1BST0dfTERfUkVMT0FEX0ZMQUcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBmaW5kIHJlbG9hZCBmbGFnIGZvciBsaW5rZXIKKyMgICAtLSBQT1JUTUUgU29tZSBsaW5rZXJzIG1heSBuZWVkIGEgZGlmZmVyZW50IHJlbG9hZCBmbGFnLgorQUNfREVGVU4oW0FDX1BST0dfTERfUkVMT0FEX0ZMQUddLAorW0FDX0NBQ0hFX0NIRUNLKFtmb3IgJExEIG9wdGlvbiB0byByZWxvYWQgb2JqZWN0IGZpbGVzXSwKKyAgbHRfY3ZfbGRfcmVsb2FkX2ZsYWcsCisgIFtsdF9jdl9sZF9yZWxvYWRfZmxhZz0nLXInXSkKK3JlbG9hZF9mbGFnPSRsdF9jdl9sZF9yZWxvYWRfZmxhZworY2FzZSAkcmVsb2FkX2ZsYWcgaW4KKyIiIHwgIiAiKikgOzsKKyopIHJlbG9hZF9mbGFnPSIgJHJlbG9hZF9mbGFnIiA7OworZXNhYworcmVsb2FkX2NtZHM9JyRMRCRyZWxvYWRfZmxhZyAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworY2FzZSAkaG9zdF9vcyBpbgorICBkYXJ3aW4qKQorICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgICByZWxvYWRfY21kcz0nJExUQ0MgJExUQ0ZMQUdTIC1ub3N0ZGxpYiAke3dsfS1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisgICAgZWxzZQorICAgICAgcmVsb2FkX2NtZHM9JyRMRCRyZWxvYWRfZmxhZyAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworICAgIGZpCisgICAgOzsKK2VzYWMKK10pIyBBQ19QUk9HX0xEX1JFTE9BRF9GTEFHCisKKworIyBBQ19ERVBMSUJTX0NIRUNLX01FVEhPRAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBob3cgdG8gY2hlY2sgZm9yIGxpYnJhcnkgZGVwZW5kZW5jaWVzCisjICAtLSBQT1JUTUUgZmlsbCBpbiB3aXRoIHRoZSBkeW5hbWljIGxpYnJhcnkgY2hhcmFjdGVyaXN0aWNzCitBQ19ERUZVTihbQUNfREVQTElCU19DSEVDS19NRVRIT0RdLAorW0FDX0NBQ0hFX0NIRUNLKFtob3cgdG8gcmVjb2duaXNlIGRlcGVuZGVudCBsaWJyYXJpZXNdLAorbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QsCitbbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRNQUdJQ19DTUQnCitsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0KK2x0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSd1bmtub3duJworIyBOZWVkIHRvIHNldCB0aGUgcHJlY2VkaW5nIHZhcmlhYmxlIG9uIGFsbCBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0CisjIGludGVybGlicmFyeSBkZXBlbmRlbmNpZXMuCisjICdub25lJyAtLSBkZXBlbmRlbmNpZXMgbm90IHN1cHBvcnRlZC4KKyMgYHVua25vd24nIC0tIHNhbWUgYXMgbm9uZSwgYnV0IGRvY3VtZW50cyB0aGF0IHdlIHJlYWxseSBkb24ndCBrbm93LgorIyAncGFzc19hbGwnIC0tIGFsbCBkZXBlbmRlbmNpZXMgcGFzc2VkIHdpdGggbm8gY2hlY2tzLgorIyAndGVzdF9jb21waWxlJyAtLSBjaGVjayBieSBtYWtpbmcgdGVzdCBwcm9ncmFtLgorIyAnZmlsZV9tYWdpYyBbW3JlZ2V4XV0nIC0tIGNoZWNrIGJ5IGxvb2tpbmcgZm9yIGZpbGVzIGluIGxpYnJhcnkgcGF0aAorIyB3aGljaCByZXNwb25kcyB0byB0aGUgJGZpbGVfbWFnaWNfY21kIHdpdGggYSBnaXZlbiBleHRlbmRlZCByZWdleC4KKyMgSWYgeW91IGhhdmUgYGZpbGUnIG9yIGVxdWl2YWxlbnQgb24geW91ciBzeXN0ZW0gYW5kIHlvdSdyZSBub3Qgc3VyZQorIyB3aGV0aGVyIGBwYXNzX2FsbCcgd2lsbCAqYWx3YXlzKiB3b3JrLCB5b3UgcHJvYmFibHkgd2FudCB0aGlzIG9uZS4KKworY2FzZSAkaG9zdF9vcyBpbgorYWl4NCogfCBhaXg1KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworYmVvcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2JzZGlbWzQ1XV0qKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW01MXV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiknCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvdXNyL2Jpbi9maWxlIC1MJworICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vc2hsaWIvbGliYy5zbworICA7OworCitjeWd3aW4qKQorICAjIGZ1bmNfd2luMzJfbGliaWQgaXMgYSBzaGVsbCBmdW5jdGlvbiBkZWZpbmVkIGluIGx0bWFpbi5zaAorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBeeDg2IGFyY2hpdmUgaW1wb3J0fF54ODYgRExMJworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nZnVuY193aW4zMl9saWJpZCcKKyAgOzsKKworbWluZ3cqIHwgcHczMiopCisgICMgQmFzZSBNU1lTL01pbkdXIGRvIG5vdCBwcm92aWRlIHRoZSAnZmlsZScgY29tbWFuZCBuZWVkZWQgYnkKKyAgIyBmdW5jX3dpbjMyX2xpYmlkIHNoZWxsIGZ1bmN0aW9uLCBzbyB1c2UgYSB3ZWFrZXIgdGVzdCBiYXNlZCBvbiAnb2JqZHVtcCcuCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IHBlaSotaTM4NiguKmFyY2hpdGVjdHVyZTogaTM4Nik/JworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE9CSkRVTVAgLWYnCisgIDs7CisKK2RhcndpbiogfCByaGFwc29keSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2ZyZWVic2QqIHwga2ZyZWVic2QqLWdudSB8IGRyYWdvbmZseSopCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4gL2Rldi9udWxsOyB0aGVuCisgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICBpKjg2ICkKKyAgICAgICMgTm90IHN1cmUgd2hldGhlciB0aGUgcHJlc2VuY2Ugb2YgT3BlbkJTRCBoZXJlIHdhcyBhIG1pc3Rha2UuCisgICAgICAjIExldCdzIGFjY2VwdCBib3RoIG9mIHRoZW0gdW50aWwgdGhpcyBpcyBjbGVhcmVkIHVwLgorICAgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKEZyZWVCU0R8T3BlbkJTRHxEcmFnb25GbHkpL2lbWzMtOV1dODYgKGNvbXBhY3QgKT9kZW1hbmQgcGFnZWQgc2hhcmVkIGxpYnJhcnknCisgICAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgICAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvLipgCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIGZpCisgIDs7CisKK2dudSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2hwdXgxMC4yMCogfCBocHV4MTEqKQorICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgIGNhc2UgJGhvc3RfY3B1IGluCisgIGlhNjQqKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzW1swLTldXVtbMC05XV1bWzAtOV1dfEVMRi1bWzAtOV1dW1swLTldXSkgc2hhcmVkIG9iamVjdCBmaWxlIC0gSUE2NCcKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9ocHV4MzIvbGliYy5zbworICAgIDs7CisgIGhwcGEqNjQqKQorICAgIFtsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxFTEYtWzAtOV1bMC05XSkgc2hhcmVkIG9iamVjdCBmaWxlIC0gUEEtUklTQyBbMC05XS5bMC05XSddCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvcGEyMF82NC9saWJjLnNsCisgICAgOzsKKyAgKikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1tbMC05XV1bWzAtOV1dW1swLTldXXxQQS1SSVNDW1swLTldXS5bWzAtOV1dKSBzaGFyZWQgbGlicmFyeScKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJjLnNsCisgICAgOzsKKyAgZXNhYworICA7OworCitpbnRlcml4MyopCisgICMgUElDIGNvZGUgaXMgYnJva2VuIG9uIEludGVyaXggMy54LCB0aGF0J3Mgd2h5IHxcLmEgbm90IHxfcGljXC5hIGhlcmUKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb3xcLmEpJCcKKyAgOzsKKworaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgY2FzZSAkTEQgaW4KKyAgKi0zMnwqIi0zMiAiKSBsaWJtYWdpYz0zMi1iaXQ7OworICAqLW4zMnwqIi1uMzIgIikgbGlibWFnaWM9TjMyOzsKKyAgKi02NHwqIi02NCAiKSBsaWJtYWdpYz02NC1iaXQ7OworICAqKSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgIGVzYWMKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgorbGludXgqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCituZXRic2QqKQorICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc29cLltbMC05XV0rXC5bWzAtOV1dK3xfcGljXC5hKSQnCisgIGVsc2UKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvfF9waWNcLmEpJCcKKyAgZmkKKyAgOzsKKworbmV3b3M2KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tNTF1dU0IgKGV4ZWN1dGFibGV8ZHluYW1pYyBsaWIpJworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYm5scy5zbworICA7OworCitudG8tcW54KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9dW5rbm93bgorICA7OworCitvcGVuYnNkKikKKyAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb1wuW1swLTldXStcLltbMC05XV0rfFwuc298X3BpY1wuYSkkJworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb1wuW1swLTldXStcLltbMC05XV0rfF9waWNcLmEpJCcKKyAgZmkKKyAgOzsKKworb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitzb2xhcmlzKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworc3lzdjQgfCBzeXN2NC4zKikKKyAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKyAgbW90b3JvbGEpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tNTF1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpIE1bWzAtOV1dW1swLTldXSogVmVyc2lvbiBbWzAtOV1dJworICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28qYAorICAgIDs7CisgIG5jcikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIHNlcXVlbnQpCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW0xNXV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiApJworICAgIDs7CisgIHNuaSkKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL2Jpbi9maWxlJworICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSJmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTE1dXVNCIGR5bmFtaWMgbGliIgorICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9saWIvbGliYy5zbworICAgIDs7CisgIHNpZW1lbnMpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgICA7OworICBwYykKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIGVzYWMKKyAgOzsKKworc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKiB8IHN5c3Y0KnV3MiopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7Citlc2FjCitdKQorZmlsZV9tYWdpY19jbWQ9JGx0X2N2X2ZpbGVfbWFnaWNfY21kCitkZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QKK3Rlc3QgLXogIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgJiYgZGVwbGlic19jaGVja19tZXRob2Q9dW5rbm93bgorXSkjIEFDX0RFUExJQlNfQ0hFQ0tfTUVUSE9ECisKKworIyBBQ19QUk9HX05NCisjIC0tLS0tLS0tLS0KKyMgZmluZCB0aGUgcGF0aG5hbWUgdG8gYSBCU0QtY29tcGF0aWJsZSBuYW1lIGxpc3RlcgorQUNfREVGVU4oW0FDX1BST0dfTk1dLAorW0FDX0NBQ0hFX0NIRUNLKFtmb3IgQlNELWNvbXBhdGlibGUgbm1dLCBsdF9jdl9wYXRoX05NLAorW2lmIHRlc3QgLW4gIiROTSI7IHRoZW4KKyAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCisgIGx0X2N2X3BhdGhfTk09IiROTSIKK2Vsc2UKKyAgbHRfbm1fdG9fY2hlY2s9IiR7YWNfdG9vbF9wcmVmaXh9bm0iCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCIgJiYgdGVzdCAiJGJ1aWxkIiA9ICIkaG9zdCI7IHRoZW4gCisgICAgbHRfbm1fdG9fY2hlY2s9IiRsdF9ubV90b19jaGVjayBubSIKKyAgZmkKKyAgZm9yIGx0X3RtcF9ubSBpbiAkbHRfbm1fdG9fY2hlY2s7IGRvCisgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgICAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4vZWxmIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbworICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgICAgdG1wX25tPSIkYWNfZGlyLyRsdF90bXBfbm0iCisgICAgICBpZiB0ZXN0IC1mICIkdG1wX25tIiB8fCB0ZXN0IC1mICIkdG1wX25tJGFjX2V4ZWV4dCIgOyB0aGVuCisJIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCisJIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKKwkjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCisJIyBUcnU2NCdzIG5tIGNvbXBsYWlucyB0aGF0IC9kZXYvbnVsbCBpcyBhbiBpbnZhbGlkIG9iamVjdCBmaWxlCisJY2FzZSBgIiR0bXBfbm0iIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSdgIGluCisJKi9kZXYvbnVsbCogfCAqJ0ludmFsaWQgZmlsZSBvciBvYmplY3QgdHlwZScqKQorCSAgbHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSAtQiIKKwkgIGJyZWFrCisJICA7OworCSopCisJICBjYXNlIGAiJHRtcF9ubSIgLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KKwkgICovZGV2L251bGwqKQorCSAgICBsdF9jdl9wYXRoX05NPSIkdG1wX25tIC1wIgorCSAgICBicmVhaworCSAgICA7OworCSAgKikKKwkgICAgbHRfY3ZfcGF0aF9OTT0ke2x0X2N2X3BhdGhfTk09IiR0bXBfbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKKwkgICAgY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKKwkgICAgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICBkb25lCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgIGRvbmUKKyAgdGVzdCAteiAiJGx0X2N2X3BhdGhfTk0iICYmIGx0X2N2X3BhdGhfTk09bm0KK2ZpXSkKK05NPSIkbHRfY3ZfcGF0aF9OTSIKK10pIyBBQ19QUk9HX05NCisKKworIyBBQ19DSEVDS19MSUJNCisjIC0tLS0tLS0tLS0tLS0KKyMgY2hlY2sgZm9yIG1hdGggbGlicmFyeQorQUNfREVGVU4oW0FDX0NIRUNLX0xJQk1dLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0xJQk09CitjYXNlICRob3N0IGluCisqLSotYmVvcyogfCAqLSotY3lnd2luKiB8ICotKi1wdzMyKiB8ICotKi1kYXJ3aW4qKQorICAjIFRoZXNlIHN5c3RlbSBkb24ndCBoYXZlIGxpYm0sIG9yIGRvbid0IG5lZWQgaXQKKyAgOzsKKyotbmNyLXN5c3Y0LjMqKQorICBBQ19DSEVDS19MSUIobXcsIF9td3ZhbGlkY2hlY2tsLCBMSUJNPSItbG13IikKKyAgQUNfQ0hFQ0tfTElCKG0sIGNvcywgTElCTT0iJExJQk0gLWxtIikKKyAgOzsKKyopCisgIEFDX0NIRUNLX0xJQihtLCBjb3MsIExJQk09Ii1sbSIpCisgIDs7Citlc2FjCitdKSMgQUNfQ0hFQ0tfTElCTQorCisKKyMgQUNfTElCTFRETF9DT05WRU5JRU5DRShbRElSRUNUT1JZXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvciB0aGUgbGlibHRkbCBjb252ZW5pZW5jZSBsaWJyYXJ5IGFuZAorIyBMVERMSU5DTCB0byB0aGUgaW5jbHVkZSBmbGFncyBmb3IgdGhlIGxpYmx0ZGwgaGVhZGVyIGFuZCBhZGRzCisjIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UgdG8gdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMuICBOb3RlIHRoYXQKKyMgQUNfQ09ORklHX1NVQkRJUlMgaXMgbm90IGNhbGxlZCBoZXJlLiAgSWYgRElSRUNUT1JZIGlzIG5vdCBwcm92aWRlZCwKKyMgaXQgaXMgYXNzdW1lZCB0byBiZSBgbGlibHRkbCcuICBMSUJMVERMIHdpbGwgYmUgcHJlZml4ZWQgd2l0aAorIyAnJHt0b3BfYnVpbGRkaXJ9LycgYW5kIExURExJTkNMIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCAnJHt0b3Bfc3JjZGlyfS8nCisjIChub3RlIHRoZSBzaW5nbGUgcXVvdGVzISkuICBJZiB5b3VyIHBhY2thZ2UgaXMgbm90IGZsYXQgYW5kIHlvdSdyZSBub3QKKyMgdXNpbmcgYXV0b21ha2UsIGRlZmluZSB0b3BfYnVpbGRkaXIgYW5kIHRvcF9zcmNkaXIgYXBwcm9wcmlhdGVseSBpbgorIyB0aGUgTWFrZWZpbGVzLgorQUNfREVGVU4oW0FDX0xJQkxURExfQ09OVkVOSUVOQ0VdLAorW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKKyAgY2FzZSAkZW5hYmxlX2x0ZGxfY29udmVuaWVuY2UgaW4KKyAgbm8pIEFDX01TR19FUlJPUihbdGhpcyBwYWNrYWdlIG5lZWRzIGEgY29udmVuaWVuY2UgbGlibHRkbF0pIDs7CisgICIiKSBlbmFibGVfbHRkbF9jb252ZW5pZW5jZT15ZXMKKyAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1jb252ZW5pZW5jZSIgOzsKKyAgZXNhYworICBMSUJMVERMPScke3RvcF9idWlsZGRpcn0vJ2lmZWxzZSgkIywxLFskMV0sWydsaWJsdGRsJ10pL2xpYmx0ZGxjLmxhCisgIExURExJTkNMPSctSSR7dG9wX3NyY2Rpcn0vJ2lmZWxzZSgkIywxLFskMV0sWydsaWJsdGRsJ10pCisgICMgRm9yIGJhY2t3YXJkcyBub24tZ2V0dGV4dCBjb25zaXN0ZW50IGNvbXBhdGliaWxpdHkuLi4KKyAgSU5DTFRETD0iJExURExJTkNMIgorXSkjIEFDX0xJQkxURExfQ09OVkVOSUVOQ0UKKworCisjIEFDX0xJQkxURExfSU5TVEFMTEFCTEUoW0RJUkVDVE9SWV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IgdGhlIGxpYmx0ZGwgaW5zdGFsbGFibGUgbGlicmFyeSBhbmQKKyMgTFRETElOQ0wgdG8gdGhlIGluY2x1ZGUgZmxhZ3MgZm9yIHRoZSBsaWJsdGRsIGhlYWRlciBhbmQgYWRkcworIyAtLWVuYWJsZS1sdGRsLWluc3RhbGwgdG8gdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMuICBOb3RlIHRoYXQKKyMgQUNfQ09ORklHX1NVQkRJUlMgaXMgbm90IGNhbGxlZCBoZXJlLiAgSWYgRElSRUNUT1JZIGlzIG5vdCBwcm92aWRlZCwKKyMgYW5kIGFuIGluc3RhbGxlZCBsaWJsdGRsIGlzIG5vdCBmb3VuZCwgaXQgaXMgYXNzdW1lZCB0byBiZSBgbGlibHRkbCcuCisjIExJQkxUREwgd2lsbCBiZSBwcmVmaXhlZCB3aXRoICcke3RvcF9idWlsZGRpcn0vJyMgYW5kIExURExJTkNMIHdpdGgKKyMgJyR7dG9wX3NyY2Rpcn0vJyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpLiAgSWYgeW91ciBwYWNrYWdlIGlzIG5vdAorIyBmbGF0IGFuZCB5b3UncmUgbm90IHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFuZCB0b3Bfc3JjZGlyCisjIGFwcHJvcHJpYXRlbHkgaW4gdGhlIE1ha2VmaWxlcy4KKyMgSW4gdGhlIGZ1dHVyZSwgdGhpcyBtYWNybyBtYXkgaGF2ZSB0byBiZSBjYWxsZWQgYWZ0ZXIgQUNfUFJPR19MSUJUT09MLgorQUNfREVGVU4oW0FDX0xJQkxURExfSU5TVEFMTEFCTEVdLAorW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKKyAgQUNfQ0hFQ0tfTElCKGx0ZGwsIGx0X2RsaW5pdCwKKyAgW3Rlc3QgeCIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgIT0geHllcyAmJiBlbmFibGVfbHRkbF9pbnN0YWxsPW5vXSwKKyAgW2lmIHRlc3QgeCIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgPSB4bm87IHRoZW4KKyAgICAgQUNfTVNHX1dBUk4oW2xpYmx0ZGwgbm90IGluc3RhbGxlZCwgYnV0IGluc3RhbGxhdGlvbiBkaXNhYmxlZF0pCisgICBlbHNlCisgICAgIGVuYWJsZV9sdGRsX2luc3RhbGw9eWVzCisgICBmaQorICBdKQorICBpZiB0ZXN0IHgiJGVuYWJsZV9sdGRsX2luc3RhbGwiID0geCJ5ZXMiOyB0aGVuCisgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWluc3RhbGwiCisgICAgTElCTFRETD0nJHt0b3BfYnVpbGRkaXJ9LydpZmVsc2UoJCMsMSxbJDFdLFsnbGlibHRkbCddKS9saWJsdGRsLmxhCisgICAgTFRETElOQ0w9Jy1JJHt0b3Bfc3JjZGlyfS8naWZlbHNlKCQjLDEsWyQxXSxbJ2xpYmx0ZGwnXSkKKyAgZWxzZQorICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1pbnN0YWxsPW5vIgorICAgIExJQkxUREw9Ii1sbHRkbCIKKyAgICBMVERMSU5DTD0KKyAgZmkKKyAgIyBGb3IgYmFja3dhcmRzIG5vbi1nZXR0ZXh0IGNvbnNpc3RlbnQgY29tcGF0aWJpbGl0eS4uLgorICBJTkNMVERMPSIkTFRETElOQ0wiCitdKSMgQUNfTElCTFRETF9JTlNUQUxMQUJMRQorCisKKyMgQUNfTElCVE9PTF9DWFgKKyMgLS0tLS0tLS0tLS0tLS0KKyMgZW5hYmxlIHN1cHBvcnQgZm9yIEMrKyBsaWJyYXJpZXMKK0FDX0RFRlVOKFtBQ19MSUJUT09MX0NYWF0sCitbQUNfUkVRVUlSRShbX0xUX0FDX0xBTkdfQ1hYXSkKK10pIyBBQ19MSUJUT09MX0NYWAorCisKKyMgX0xUX0FDX0xBTkdfQ1hYCisjIC0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW19MVF9BQ19MQU5HX0NYWF0sCitbQUNfUkVRVUlSRShbQUNfUFJPR19DWFhdKQorQUNfUkVRVUlSRShbX0xUX0FDX1BST0dfQ1hYQ1BQXSkKK19MVF9BQ19TSEVMTF9JTklUKFt0YWduYW1lcz0ke3RhZ25hbWVzKyR7dGFnbmFtZXN9LH1DWFhdKQorXSkjIF9MVF9BQ19MQU5HX0NYWAorCisjIF9MVF9BQ19QUk9HX0NYWENQUAorIyAtLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfTFRfQUNfUFJPR19DWFhDUFBdLAorWworQUNfUkVRVUlSRShbQUNfUFJPR19DWFhdKQoraWYgdGVzdCAtbiAiJENYWCIgJiYgKCB0ZXN0ICJYJENYWCIgIT0gIlhubyIgJiYKKyAgICAoICh0ZXN0ICJYJENYWCIgPSAiWGcrKyIgJiYgYGcrKyAtdiA+L2Rldi9udWxsIDI+JjFgICkgfHwKKyAgICAodGVzdCAiWCRDWFgiICE9ICJYZysrIikpKSA7IHRoZW4KKyAgQUNfUFJPR19DWFhDUFAKK2ZpCitdKSMgX0xUX0FDX1BST0dfQ1hYQ1BQCisKKyMgQUNfTElCVE9PTF9GNzcKKyMgLS0tLS0tLS0tLS0tLS0KKyMgZW5hYmxlIHN1cHBvcnQgZm9yIEZvcnRyYW4gNzcgbGlicmFyaWVzCitBQ19ERUZVTihbQUNfTElCVE9PTF9GNzddLAorW0FDX1JFUVVJUkUoW19MVF9BQ19MQU5HX0Y3N10pCitdKSMgQUNfTElCVE9PTF9GNzcKKworCisjIF9MVF9BQ19MQU5HX0Y3NworIyAtLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfTFRfQUNfTEFOR19GNzddLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfRjc3XSkKK19MVF9BQ19TSEVMTF9JTklUKFt0YWduYW1lcz0ke3RhZ25hbWVzKyR7dGFnbmFtZXN9LH1GNzddKQorXSkjIF9MVF9BQ19MQU5HX0Y3NworCisKKyMgQUNfTElCVE9PTF9HQ0oKKyMgLS0tLS0tLS0tLS0tLS0KKyMgZW5hYmxlIHN1cHBvcnQgZm9yIEdDSiBsaWJyYXJpZXMKK0FDX0RFRlVOKFtBQ19MSUJUT09MX0dDSl0sCitbQUNfUkVRVUlSRShbX0xUX0FDX0xBTkdfR0NKXSkKK10pIyBBQ19MSUJUT09MX0dDSgorCisKKyMgX0xUX0FDX0xBTkdfR0NKCisjIC0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW19MVF9BQ19MQU5HX0dDSl0sCitbQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfR0NKXSxbXSwKKyAgW0FDX1BST1ZJREVfSUZFTFNFKFtBXVtNX1BST0dfR0NKXSxbXSwKKyAgICBbQUNfUFJPVklERV9JRkVMU0UoW0xUX0FDX1BST0dfR0NKXSxbXSwKKyAgICAgIFtpZmRlZihbQUNfUFJPR19HQ0pdLFtBQ19SRVFVSVJFKFtBQ19QUk9HX0dDSl0pXSwKKwkgW2lmZGVmKFtBXVtNX1BST0dfR0NKXSxbQUNfUkVRVUlSRShbQV1bTV9QUk9HX0dDSl0pXSwKKwkgICBbQUNfUkVRVUlSRShbQV1bQ19QUk9HX0dDSl9PUl9BXVtNX1BST0dfR0NKXSldKV0pXSldKV0pCitfTFRfQUNfU0hFTExfSU5JVChbdGFnbmFtZXM9JHt0YWduYW1lcyske3RhZ25hbWVzfSx9R0NKXSkKK10pIyBfTFRfQUNfTEFOR19HQ0oKKworCisjIEFDX0xJQlRPT0xfUkMKKyMgLS0tLS0tLS0tLS0tLQorIyBlbmFibGUgc3VwcG9ydCBmb3IgV2luZG93cyByZXNvdXJjZSBmaWxlcworQUNfREVGVU4oW0FDX0xJQlRPT0xfUkNdLAorW0FDX1JFUVVJUkUoW0xUX0FDX1BST0dfUkNdKQorX0xUX0FDX1NIRUxMX0lOSVQoW3RhZ25hbWVzPSR7dGFnbmFtZXMrJHt0YWduYW1lc30sfVJDXSkKK10pIyBBQ19MSUJUT09MX1JDCisKKworIyBBQ19MSUJUT09MX0xBTkdfQ19DT05GSUcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcnMgZm9yIHRoZSBDIGNvbXBpbGVyIGFyZQorIyBzdWl0YWJseSBkZWZpbmVkLiAgVGhvc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieQorIyBBQ19MSUJUT09MX0NPTkZJRyB0byB3cml0ZSB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCitBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHXSwgW19MVF9BQ19MQU5HX0NfQ09ORklHXSkKK0FDX0RFRlVOKFtfTFRfQUNfTEFOR19DX0NPTkZJR10sCitbbHRfc2F2ZV9DQz0iJENDIgorQUNfTEFOR19QVVNIKEMpCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBDIHRlc3Qgc291cmNlcy4KK2FjX2V4dD1jCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBDIHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitfTFRfQUNfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKK2x0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iaW50IHNvbWVfdmFyaWFibGUgPSAwO1xuIgorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdpbnQgbWFpbigpe3JldHVybigwKTt9XG4nCisKK19MVF9BQ19TWVNfQ09NUElMRVIKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK19MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisjIyBDQVZFQVQgRU1QVE9SOgorIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5CisjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KK0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9OT19SVFRJKCQxKQorQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQygkMSkKK0FDX0xJQlRPT0xfUFJPR19DQ19DX08oJDEpCitBQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1MoJDEpCitBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTKCQxKQorQUNfTElCVE9PTF9TWVNfRFlOQU1JQ19MSU5LRVIoJDEpCitBQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSCgkMSkKK0FDX0xJQlRPT0xfU1lTX0xJQl9TVFJJUAorQUNfTElCVE9PTF9ETE9QRU5fU0VMRgorCisjIFJlcG9ydCB3aGljaCBsaWJyYXJ5IHR5cGVzIHdpbGwgYWN0dWFsbHkgYmUgYnVpbHQKK0FDX01TR19DSEVDS0lORyhbaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKK0FDX01TR19SRVNVTFQoWyRjYW5fYnVpbGRfc2hhcmVkXSkKKworQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXNdKQordGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCisKKyMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAorIyBhcmUgYWxsIGJ1aWx0IGZyb20gUElDLgorY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgorICAgIHBvc3RpbnN0YWxsX2NtZHM9JyRSQU5MSUIgJGxpYicKKyAgZmkKKyAgOzsKKworYWl4NCogfCBhaXg1KikKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgorICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisgIGZpCisgICAgOzsKK2VzYWMKK0FDX01TR19SRVNVTFQoWyRlbmFibGVfc2hhcmVkXSkKKworQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXNdKQorIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCit0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKK0FDX01TR19SRVNVTFQoWyRlbmFibGVfc3RhdGljXSkKKworQUNfTElCVE9PTF9DT05GSUcoJDEpCisKK0FDX0xBTkdfUE9QCitDQz0iJGx0X3NhdmVfQ0MiCitdKSMgQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHCisKKworIyBBQ19MSUJUT09MX0xBTkdfQ1hYX0NPTkZJRworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJzIGZvciB0aGUgQyBjb21waWxlciBhcmUKKyMgc3VpdGFibHkgZGVmaW5lZC4gIFRob3NlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkKKyMgQUNfTElCVE9PTF9DT05GSUcgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19DWFhfQ09ORklHXSwgW19MVF9BQ19MQU5HX0NYWF9DT05GSUcoQ1hYKV0pCitBQ19ERUZVTihbX0xUX0FDX0xBTkdfQ1hYX0NPTkZJR10sCitbQUNfTEFOR19QVVNIKEMrKykKK0FDX1JFUVVJUkUoW0FDX1BST0dfQ1hYXSkKK0FDX1JFUVVJUkUoW19MVF9BQ19QUk9HX0NYWENQUF0pCisKK19MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQorX0xUX0FDX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9CitfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQorX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9CitfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0KK19MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQorX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9bm8KK19MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPXVuc3VwcG9ydGVkCitfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPW5vCitfTFRfQUNfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9CitfTFRfQUNfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPQorX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9dW5rbm93bgorX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JG9sZF9hcmNoaXZlX2NtZHMKK19MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KK19MVF9BQ19UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPW5vCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIG9iamVjdCBiZWluZyBsaW5rZWQ6CitfTFRfQUNfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSk9CitfTFRfQUNfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpPQorX0xUX0FDX1RBR1ZBUihwcmVkZXBzLCAkMSk9CitfTFRfQUNfVEFHVkFSKHBvc3RkZXBzLCAkMSk9CitfTFRfQUNfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpPQorCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgQysrIHRlc3Qgc291cmNlcy4KK2FjX2V4dD1jcHAKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEMrKyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX0FDX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCitsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImludCBzb21lX3ZhcmlhYmxlID0gMDtcbiIKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0naW50IG1haW4oaW50LCBjaGFyICpbW11dKSB7IHJldHVybigwKTsgfVxuJworCisjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCitfTFRfQUNfU1lTX0NPTVBJTEVSCisKKyMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCitfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKK19MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2x0X3NhdmVfQ0M9JENDCitsdF9zYXZlX0xEPSRMRAorbHRfc2F2ZV9HQ0M9JEdDQworR0NDPSRHWFgKK2x0X3NhdmVfd2l0aF9nbnVfbGQ9JHdpdGhfZ251X2xkCitsdF9zYXZlX3BhdGhfTEQ9JGx0X2N2X3BhdGhfTEQKK2lmIHRlc3QgLW4gIiR7bHRfY3ZfcHJvZ19nbnVfbGRjeHgrc2V0fSI7IHRoZW4KKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9JGx0X2N2X3Byb2dfZ251X2xkY3h4CitlbHNlCisgICRhc191bnNldCBsdF9jdl9wcm9nX2dudV9sZAorZmkKK2lmIHRlc3QgLW4gIiR7bHRfY3ZfcGF0aF9MRENYWCtzZXR9IjsgdGhlbgorICBsdF9jdl9wYXRoX0xEPSRsdF9jdl9wYXRoX0xEQ1hYCitlbHNlCisgICRhc191bnNldCBsdF9jdl9wYXRoX0xECitmaQordGVzdCAteiAiJHtMRENYWCtzZXR9IiB8fCBMRD0kTERDWFgKK0NDPSR7Q1hYLSJjKysifQorY29tcGlsZXI9JENDCitfTFRfQUNfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCitfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCisKKyMgV2UgZG9uJ3Qgd2FudCAtZm5vLWV4Y2VwdGlvbiB3ZW4gY29tcGlsaW5nIEMrKyBjb2RlLCBzbyBzZXQgdGhlCisjIG5vX2J1aWx0aW5fZmxhZyBzZXBhcmF0ZWx5CitpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9JyAtZm5vLWJ1aWx0aW4nCitlbHNlCisgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0KK2ZpCisKK2lmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICMgU2V0IHVwIGRlZmF1bHQgR05VIEMrKyBjb25maWd1cmF0aW9uCisKKyAgQUNfUFJPR19MRAorCisgICMgQ2hlY2sgaWYgR05VIEMrKyB1c2VzIEdOVSBsZCBhcyB0aGUgdW5kZXJseWluZyBsaW5rZXIsIHNpbmNlIHRoZQorICAjIGFyY2hpdmluZyBjb21tYW5kcyBiZWxvdyBhc3N1bWUgdGhhdCBHTlUgbGQgaXMgYmVpbmcgdXNlZC4KKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCisgICAgIyBJZiBhcmNoaXZlX2NtZHMgcnVucyBMRCwgbm90IENDLCB3bGFyYyBzaG91bGQgYmUgZW1wdHkKKyAgICAjIFhYWCBJIHRoaW5rIHdsYXJjIGNhbiBiZSBlbGltaW5hdGVkIGluIGx0Y2YtY3h4LCBidXQgSSBuZWVkIHRvCisgICAgIyAgICAgaW52ZXN0aWdhdGUgaXQgYSBsaXR0bGUgYml0IG1vcmUuIChNTSkKKyAgICB3bGFyYz0nJHt3bH0nCisKKyAgICAjIGFuY2llbnQgR05VIGxkIGRpZG4ndCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCisgICAgaWYgZXZhbCAiYCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkYCAtLWhlbHAgMj4mMSIgfCBcCisJZ3JlcCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICBlbHNlCisgICAgICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CisgICAgZmkKKyAgZWxzZQorICAgIHdpdGhfZ251X2xkPW5vCisgICAgd2xhcmM9CisKKyAgICAjIEEgZ2VuZXJpYyBhbmQgdmVyeSBzaW1wbGUgZGVmYXVsdCBzaGFyZWQgbGlicmFyeSBjcmVhdGlvbgorICAgICMgY29tbWFuZCBmb3IgR05VIEMrKyBmb3IgdGhlIGNhc2Ugd2hlcmUgaXQgdXNlcyB0aGUgbmF0aXZlCisgICAgIyBsaW5rZXIsIGluc3RlYWQgb2YgR05VIGxkLiAgSWYgcG9zc2libGUsIHRoaXMgc2V0dGluZyBzaG91bGQKKyAgICAjIG92ZXJyaWRkZW4gdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIG5hdGl2ZSBsaW5rZXIgZmVhdHVyZXMgb24KKyAgICAjIHRoZSBwbGF0Zm9ybSBpdCBpcyBiZWluZyB1c2VkIG9uLgorICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJGxpYicKKyAgZmkKKworICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKyAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAiXC1MIicKKworZWxzZQorICBHWFg9bm8KKyAgd2l0aF9nbnVfbGQ9bm8KKyAgd2xhcmM9CitmaQorCisjIFBPUlRNRTogZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgQysrIGxpbmsgY2hhcmFjdGVyaXN0aWNzCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCitfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcworY2FzZSAkaG9zdF9vcyBpbgorICBhaXgzKikKKyAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgOzsKKyAgYWl4NCogfCBhaXg1KikKKyAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICAgIyBPbiBJQTY0LCB0aGUgbGlua2VyIGRvZXMgcnVuIHRpbWUgbGlua2luZyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndAorICAgICAgIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisgICAgICBleHBfc3ltX2ZsYWc9Jy1CZXhwb3J0JworICAgICAgbm9fZW50cnlfZmxhZz0iIgorICAgIGVsc2UKKyAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKworICAgICAgIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCisgICAgICAjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKKyAgICAgICMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCisgICAgICBjYXNlICRob3N0X29zIGluIGFpeDQuW1syM11dfGFpeDQuW1syM11dLip8YWl4NSopCisJZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCisJICBjYXNlICRsZF9mbGFnIGluCisJICAqLWJydGwqKQorCSAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcworCSAgICBicmVhaworCSAgICA7OworCSAgZXNhYworCWRvbmUKKwk7OworICAgICAgZXNhYworCisgICAgICBleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JworICAgICAgbm9fZW50cnlfZmxhZz0nLWJub2VudHJ5JworICAgIGZpCisKKyAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCisgICAgIyBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIElmIGxpbmtpbmcgYSBsaWJyYXJ5CisgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KKyAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAorICAgICMgZW5vdWdoIHRvIGZpeCB0aGUgcHJvYmxlbSwgYWRkIC1XbCwtYmJpZ3RvYyB0byBMREZMQUdTLgorCisgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJworICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9JzonCisgICAgX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisKKyAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LltbMDEyXV18YWl4NC5bWzAxMl1dLiopCisgICAgICAjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKKyAgICAgICMgYmVsb3cgZm9yIGJyb2tlbiBjb2xsZWN0MiBkb2Vzbid0IHdvcmsgdW5kZXIgNC4zKworCWNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKwlpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJiBcCisJICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCBncmVwIHJlc29sdmVfbGliX25hbWUgPi9kZXYvbnVsbAorCXRoZW4KKwkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKwllbHNlCisJICAjIFdlIGhhdmUgb2xkIGNvbGxlY3QyCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXVuc3VwcG9ydGVkCisJICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCisJICAjIHBhdGggaXMgbm90IGxpc3RlZCBpbiB0aGUgbGlicGF0aC4gIFNldHRpbmcgaGFyZGNvZGVfbWludXNfTAorCSAgIyB0byB1bnN1cHBvcnRlZCBmb3JjZXMgcmVsaW5raW5nCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKwkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgICBzaGFyZWRfZmxhZz0nLXNoYXJlZCcKKyAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCXNoYXJlZF9mbGFnPSIkc2hhcmVkX2ZsYWcgIicke3dsfS1HJworICAgICAgZmkKKyAgICBlbHNlCisgICAgICAjIG5vdCB1c2luZyBnY2MKKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKKwkjIGNob2tlcyBvbiAtV2wsLUcuIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBjb3JyZWN0OgorCXNoYXJlZF9mbGFnPSctRycKKyAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgIHNoYXJlZF9mbGFnPScke3dsfS1HJworCWVsc2UKKwkgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCisJZmkKKyAgICAgIGZpCisgICAgZmkKKworICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAorICAgICMgdW5kZXJzY29yZSAoXyksIHNvIGl0IGlzIGJldHRlciB0byBnZW5lcmF0ZSBhIGxpc3Qgb2Ygc3ltYm9scyB0byBleHBvcnQuCisgICAgX0xUX0FDX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT15ZXMKKyAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKyAgICAgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAorICAgICAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSctYmVyb2snCisgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KKyAgICAgIF9MVF9BQ19TWVNfTElCUEFUSF9BSVgKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZWNobyAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKKyAgICAgZWxzZQorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCisJX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSIteiBub2RlZnMiCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzICR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiCisgICAgICBlbHNlCisJIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCisJX0xUX0FDX1NZU19MSUJQQVRIX0FJWAorCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCSMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1biB0aW1lIGxvYWRpbmcgZmxhZ3MsCisJIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCV9MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWJlcm5vdG9rJworCV9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWJlcm9rJworCSMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcworCV9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJGNvbnZlbmllbmNlJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT15ZXMKKwkjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQgbGlicmFyaWVzLgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisgICAgICBmaQorICAgIGZpCisgICAgOzsKKworICBiZW9zKikKKyAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorICAgICAgIyBKb3NlcGggQmVja2VuYmFjaCA8anJiM0BiZXN0LmNvbT4gc2F5cyBzb21lIHJlbGVhc2VzIG9mIGdjYworICAgICAgIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQorICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgIGVsc2UKKyAgICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICBmaQorICAgIDs7CisKKyAgY2hvcnVzKikKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgKikKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKyAgICBlc2FjCisgICAgOzsKKworICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgIyBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKSBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywKKyAgICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisgICAgX0xUX0FDX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworICAgIF9MVF9BQ19UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPXllcworCisgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisgICAgICAjIElmIHRoZSBleHBvcnQtc3ltYm9scyBmaWxlIGFscmVhZHkgaXMgYSAuZGVmIGZpbGUgKDFzdCBsaW5lCisgICAgICAjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgorICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworICAgICAgZWxzZQorCWVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCWNhdCAkZXhwb3J0X3N5bWJvbHMgPj4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisgICAgICBmaX4KKyAgICAgICRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKyAgICBlbHNlCisgICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgZmkKKyAgOzsKKyAgICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgICAgcmhhcHNvZHkqIHwgZGFyd2luMS5bWzAxMl1dKQorICAgICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKKyAgICAgICAgIDs7CisgICAgICAgKikgIyBEYXJ3aW4gMS4zIG9uCisgICAgICAgICBpZiB0ZXN0IC16ICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSA7IHRoZW4KKyAgICAgICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgY2FzZSAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gaW4KKyAgICAgICAgICAgICAxMC5bWzAxMl1dKQorICAgICAgICAgICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKKyAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgMTAuKikKKyAgICAgICAgICAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnCisgICAgICAgICAgICAgICA7OworICAgICAgICAgICBlc2FjCisgICAgICAgICBmaQorICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9dW5zdXBwb3J0ZWQKKyAgICAgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJworICAgICAgX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisKKyAgICBpZiB0ZXN0ICIkR1hYIiA9IHllcyA7IHRoZW4KKyAgICAgIGx0X2ludF9hcHBsZV9jY19zaW5nbGVfbW9kPW5vCisgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKKyAgICAgIGlmICRDQyAtZHVtcHNwZWNzIDI+JjEgfCAkRUdSRVAgJ3NpbmdsZV9tb2R1bGUnID4vZGV2L251bGwgOyB0aGVuCisgICAgICAgbHRfaW50X2FwcGxlX2NjX3NpbmdsZV9tb2Q9eWVzCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiWCRsdF9pbnRfYXBwbGVfY2Nfc2luZ2xlX21vZCIgPSBYeWVzIDsgdGhlbgorICAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtZHluYW1pY2xpYiAtc2luZ2xlX21vZHVsZSAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJworICAgICAgZWxzZQorICAgICAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtciAta2VlcF9wcml2YXRlX2V4dGVybnMgLW5vc3RkbGliIC1vICR7bGlifS1tYXN0ZXIubyAkbGlib2Jqc34kQ0MgLWR5bmFtaWNsaWIgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJHtsaWJ9LW1hc3Rlci5vICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmcnCisgICAgICAgIGZpCisgICAgICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCisgICAgICAgICMgRG9uJ3QgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGxkIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgZmxhZywgaXQgZG9lc24ndCBleGlzdCBpbiBvbGRlciBkYXJ3aW4gbGRzCisgICAgICAgICAgaWYgdGVzdCAiWCRsdF9pbnRfYXBwbGVfY2Nfc2luZ2xlX21vZCIgPSBYeWVzIDsgdGhlbgorICAgICAgICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1keW5hbWljbGliIC1zaW5nbGVfbW9kdWxlICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtciAta2VlcF9wcml2YXRlX2V4dGVybnMgLW5vc3RkbGliIC1vICR7bGlifS1tYXN0ZXIubyAkbGlib2Jqc34kQ0MgLWR5bmFtaWNsaWIgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJHtsaWJ9LW1hc3Rlci5vICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgICAgIGZpCisgICAgICAgICAgICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFnc35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgICBlbHNlCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICB4bGMqKQorICAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCisgICAgICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1xbWtzaHJvYmogJHt3bH0tc2luZ2xlX21vZHVsZSAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9YGVjaG8gJHJwYXRoLyRzb25hbWVgICR2ZXJzdHJpbmcnCisgICAgICAgICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPSckQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFncycKKyAgICAgICAgICAjIERvbid0IGZpeCB0aGlzIGJ5IHVzaW5nIHRoZSBsZCAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGZsYWcsIGl0IGRvZXNuJ3QgZXhpc3QgaW4gb2xkZXIgZGFyd2luIGxkcworICAgICAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtcW1rc2hyb2JqICR7d2x9LXNpbmdsZV9tb2R1bGUgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWluc3RhbGxfbmFtZSAke3dsfSRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDICRhbGxvd191bmRlZmluZWRfZmxhZyAgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICAgICAgICA7OworICAgICAgICopCisgICAgICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIGZpCisgICAgICAgIDs7CisKKyAgZGd1eCopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIGVjKysqKQorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwk7OworICAgICAgZ2hjeCopCisJIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKyAgICAgICopCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisgICAgZXNhYworICAgIDs7CisgIGZyZWVic2RbWzEyXV0qKQorICAgICMgQysrIHNoYXJlZCBsaWJyYXJpZXMgcmVwb3J0ZWQgdG8gYmUgZmFpcmx5IGJyb2tlbiBiZWZvcmUgc3dpdGNoIHRvIEVMRgorICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICA7OworICBmcmVlYnNkLWVsZiopCisgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisgICAgOzsKKyAgZnJlZWJzZCogfCBrZnJlZWJzZCotZ251IHwgZHJhZ29uZmx5KikKKyAgICAjIEZyZWVCU0QgMyBhbmQgbGF0ZXIgdXNlIEdOVSBDKysgYW5kIEdOVSBsZCB3aXRoIHN0YW5kYXJkIEVMRgorICAgICMgY29udmVudGlvbnMKKyAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcworICAgIDs7CisgIGdudSopCisgICAgOzsKKyAgaHB1eDkqKQorICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcyAjIE5vdCBpbiB0aGUgc2VhcmNoIFBBVEgsCisJCQkJIyBidXQgYXMgdGhlIGRlZmF1bHQKKwkJCQkjIGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICBDQyopCisgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIDs7CisgICAgYUNDKikKKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtYiAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKyAgICAgICMKKyAgICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKyAgICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisgICAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisgICAgICAjIGRlcGVuZGVuY2llcy4KKyAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gKCRDQyAtYiAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSkgfCBncmVwICJbWy1dXUwiYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCisgICAgICA7OworICAgICopCisgICAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICAgIGVsc2UKKyAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKyAgICA7OworICBocHV4MTAqfGhwdXgxMSopCisgICAgaWYgdGVzdCAkd2l0aF9nbnVfbGQgPSBubzsgdGhlbgorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCp8aWE2NCopCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9JytiICRsaWJkaXInCisgICAgICAgIDs7CisgICAgICAqKQorCV9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgZmkKKyAgICBjYXNlICRob3N0X2NwdSBpbgorICAgIGhwcGEqNjQqfGlhNjQqKQorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisgICAgKikKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMgIyBOb3QgaW4gdGhlIHNlYXJjaCBQQVRILAorCQkJCQkgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdAorCQkJCQkgICAgICAjIGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgQ0MqKQorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwk7OworICAgICAgYUNDKikKKwljYXNlICRob3N0X2NwdSBpbgorCWhwcGEqNjQqKQorCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwlpYTY0KikKKwkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJKikKKwkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwllc2FjCisJIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSMKKwkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJIyBkZXBlbmRlbmNpZXMuCisJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAoJENDIC1iICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxKSB8IGdyZXAgIlwtTCJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKKwk7OworICAgICAgKikKKwlpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorCSAgaWYgdGVzdCAkd2l0aF9nbnVfbGQgPSBubzsgdGhlbgorCSAgICBjYXNlICRob3N0X2NwdSBpbgorCSAgICBocHBhKjY0KikKKwkgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgOzsKKwkgICAgaWE2NCopCisJICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgIDs7CisJICAgICopCisJICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZmkKKwllbHNlCisJICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwlmaQorCTs7CisgICAgZXNhYworICAgIDs7CisgIGludGVyaXgzKikKKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKyAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworICAgICMgSGFjazogT24gSW50ZXJpeCAzLngsIHdlIGNhbm5vdCBjb21waWxlIFBJQyBiZWNhdXNlIG9mIGEgYnJva2VuIGdjYy4KKyAgICAjIEluc3RlYWQsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGxvYWRlZCBhdCBhbiBpbWFnZSBiYXNlICgweDEwMDAwMDAwIGJ5CisgICAgIyBkZWZhdWx0KSBhbmQgcmVsb2NhdGVkIGlmIHRoZXkgY29uZmxpY3QsIHdoaWNoIGlzIGEgc2xvdyB2ZXJ5IG1lbW9yeQorICAgICMgY29uc3VtaW5nIGFuZCBmcmFnbWVudGluZyBwcm9jZXNzLiAgVG8gYXZvaWQgdGhpcywgd2UgcGljayBhIHJhbmRvbSwKKyAgICAjIDI1NiBLaUItYWxpZ25lZCBpbWFnZSBiYXNlIGJldHdlZW4gMHg1MDAwMDAwMCBhbmQgMHg2RkZDMDAwMCBhdCBsaW5rCisgICAgIyB0aW1lLiAgTW92aW5nIHVwIGZyb20gMHgxMDAwMDAwMCBhbHNvIGFsbG93cyBtb3JlIHNicmsoMikgc3BhY2UuCisgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKKyAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nc2VkICJzLF4sXywiICRleHBvcnRfc3ltYm9scyA+JG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW1+JENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLXJldGFpbi1zeW1ib2xzLWZpbGUsJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW0gJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKKyAgICA7OworICBpcml4NSogfCBpcml4NiopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIENDKikKKwkjIFNHSSBDKysKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtYWxsIC1tdWx0aWdvdCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisKKwkjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkjICJDQyAtYXIiLCB3aGVyZSAiQ0MiIGlzIHRoZSBJUklYIEMrKyBjb21waWxlci4gIFRoaXMgaXMKKwkjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKKwkjIGluIHRoZSBhcmNoaXZlLgorCV9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLWFyIC1XUiwtdSAtbyAkb2xkbGliICRvbGRvYmpzJworCTs7CisgICAgICAqKQorCWlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisJICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwkgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkgIGVsc2UKKwkgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgLW8gJGxpYicKKwkgIGZpCisJZmkKKwlfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKwk7OworICAgIGVzYWMKKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICA7OworICBsaW51eCopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIEtDQyopCisJIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgorCisJIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQorCSMgZW5kcyB3aXRoICIuc28iIChvciAiLnNsIiBmb3IgSFAtVVgpLCBzbyByZW5hbWUgdGhlIGxpYnJhcnkKKwkjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW1teKCkwLTlBLVphLXp7fV1dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliOyBtdiBcJHRlbXBsaWIgJGxpYicKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbW14oKTAtOUEtWmEtent9XV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICRsaWIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWIgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHM7IG12IFwkdGVtcGxpYiAkbGliJworCSMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkjCisJIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSMgZGVwZW5kZW5jaWVzLgorCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAtbyBsaWJjb25mdGVzdCRzaGFyZWRfZXh0IDI+JjEgfCBncmVwICJsZCJgOyBybSAtZiBsaWJjb25mdGVzdCRzaGFyZWRfZXh0OyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKKworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tcnBhdGgsJGxpYmRpcicKKwlfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisKKwkjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkjICJDQyAtQnN0YXRpYyIsIHdoZXJlICJDQyIgaXMgdGhlIEtBSSBDKysgY29tcGlsZXIuCisJX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtQnN0YXRpYyAtbyAkb2xkbGliICRvbGRvYmpzJworCTs7CisgICAgICBpY3BjKikKKwkjIEludGVsIEMrKworCXdpdGhfZ251X2xkPXllcworCSMgdmVyc2lvbiA4LjAgYW5kIGFib3ZlIG9mIGljcGMgY2hva2Ugb24gbXVsdGlwbHkgZGVmaW5lZCBzeW1ib2xzCisJIyBpZiB3ZSBhZGQgJHByZWRlcF9vYmplY3RzIGFuZCAkcG9zdGRlcF9vYmplY3RzLCBob3dldmVyIDcuMSBhbmQKKwkjIGVhcmxpZXIgZG8gbm90IGFkZCB0aGUgb2JqZWN0cyB0aGVtc2VsdmVzLgorCWNhc2UgYCRDQyAtViAyPiYxYCBpbgorCSoiVmVyc2lvbiA3LiIqKQorICAJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCSAgOzsKKwkqKSAgIyBWZXJzaW9uIDguMCBvciBuZXdlcgorCSAgdG1wX2lkeW49CisJICBjYXNlICRob3N0X2NwdSBpbgorCSAgICBpYTY0KikgdG1wX2lkeW49JyAtaV9keW5hbWljJzs7CisJICBlc2FjCisgIAkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJyIkdG1wX2lkeW4iJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCciJHRtcF9pZHluIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJICA7OworCWVzYWMKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwlfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisJX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwk7OworICAgICAgcGdDQyopCisgICAgICAgICMgUG9ydGxhbmQgR3JvdXAgQysrIGNvbXBpbGVyCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIC1vICRsaWInCisgIAlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJworCV9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKwlfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICAgICAgOzsKKyAgICAgIGN4eCopCisJIyBDb21wYXEgQysrCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAgLW8gJGxpYiAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scycKKworCXJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1ycGF0aCAkbGliZGlyJworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCSMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkjCisJIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSMgZGVwZW5kZW5jaWVzLgorCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJsZCJgOyB0ZW1wbGlzdD1gZWNobyAkdGVtcGxpc3QgfCAkU0VEICJzL1woXi4qbGQuKlwpXCggLipsZCAuKiRcKS9cMS8iYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgbHlueG9zKikKKyAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgOzsKKyAgbTg4ayopCisgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgIDs7CisgIG12cyopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIGN4eCopCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisgICAgICAqKQorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwk7OworICAgIGVzYWMKKyAgICA7OworICBuZXRic2QqKQorICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkbGlua2VyX2ZsYWdzJworICAgICAgd2xhcmM9CisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgZmkKKyAgICAjIFdvcmthcm91bmQgc29tZSBicm9rZW4gcHJlLTEuNSB0b29sY2hhaW5zCisgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCBjb25mdGVzdC4kb2JqZXh0IHwgJFNFRCAtZSAiczotbGdjYyAtbGMgLWxnY2M6OiInCisgICAgOzsKKyAgb3BlbmJzZDIqKQorICAgICMgQysrIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGZhaXJseSBicm9rZW4KKyAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgOzsKKyAgb3BlbmJzZCopCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJGxpYicKKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKyAgICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworICAgICAgX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJworICAgIGZpCisgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCisgICAgOzsKKyAgb3NmMyopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIEtDQyopCisJIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgorCisJIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQorCSMgZW5kcyB3aXRoICIuc28iIChvciAiLnNsIiBmb3IgSFAtVVgpLCBzbyByZW5hbWUgdGhlIGxpYnJhcnkKKwkjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW1teKCkwLTlBLVphLXp7fV1dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliOyBtdiBcJHRlbXBsaWIgJGxpYicKKworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCSMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSMgIkNDIC1Cc3RhdGljIiwgd2hlcmUgIkNDIiBpcyB0aGUgS0FJIEMrKyBjb21waWxlci4KKwlfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1Cc3RhdGljIC1vICRvbGRsaWIgJG9sZG9ianMnCisKKwk7OworICAgICAgUkNDKikKKwkjIFJhdGlvbmFsIEMrKyAyLjQuMQorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwk7OworICAgICAgY3h4KikKKwlfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSMKKwkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJIyBkZXBlbmRlbmNpZXMuCisJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgImxkIiB8IGdyZXAgLXYgImxkOiJgOyB0ZW1wbGlzdD1gZWNobyAkdGVtcGxpc3QgfCAkU0VEICJzL1woXi4qbGQuKlwpXCggLipsZC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKKwk7OworICAgICAgKikKKwlpZiB0ZXN0ICIkR1hYIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwkgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAiXC1MIicKKworCWVsc2UKKwkgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCWZpCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgb3NmNCogfCBvc2Y1KikKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgS0NDKikKKwkjIEt1Y2sgYW5kIEFzc29jaWF0ZXMsIEluYy4gKEtBSSkgQysrIENvbXBpbGVyCisKKwkjIEtDQyB3aWxsIG9ubHkgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgaWYgdGhlIG91dHB1dCBmaWxlCisJIyBlbmRzIHdpdGggIi5zbyIgKG9yICIuc2wiIGZvciBIUC1VWCksIHNvIHJlbmFtZSB0aGUgbGlicmFyeQorCSMgdG8gaXRzIHByb3BlciBuYW1lICh3aXRoIHZlcnNpb24pIGFmdGVyIGxpbmtpbmcuCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbW14oKTAtOUEtWmEtent9XV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICRsaWIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWI7IG12IFwkdGVtcGxpYiAkbGliJworCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJIyB0aGUgS0FJIEMrKyBjb21waWxlci4KKwlfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1vICRvbGRsaWIgJG9sZG9ianMnCisJOzsKKyAgICAgIFJDQyopCisJIyBSYXRpb25hbCBDKysgMi40LjEKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKyAgICAgIGN4eCopCisJX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiJXMgJXNcXG4iIC1leHBvcnRlZF9zeW1ib2wgIlwkaSIgPj4gJGxpYi5leHA7IGRvbmV+CisJICBlY2hvICItaGlkZGVuIj4+ICRsaWIuZXhwfgorCSAgJENDIC1zaGFyZWQkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSAtV2wsLWlucHV0IC1XbCwkbGliLmV4cCAgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uCSR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4KKwkgICRybSAkbGliLmV4cCcKKworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctcnBhdGggJGxpYmRpcicKKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKwkjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJIworCSMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkjIGRlcGVuZGVuY2llcy4KKwlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAibGQiIHwgZ3JlcCAtdiAibGQ6ImA7IHRlbXBsaXN0PWBlY2hvICR0ZW1wbGlzdCB8ICRTRUQgInMvXCheLipsZC4qXClcKCAuKmxkLiokXCkvXDEvImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JworCTs7CisgICAgICAqKQorCWlmIHRlc3QgIiRHWFgiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCSAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwkgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAiXC1MIicKKworCWVsc2UKKwkgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCWZpCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgcHNvcyopCisgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgIDs7CisgIHN1bm9zNCopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIENDKikKKwkjIFN1biBDKysgNC54CisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisgICAgICBsY2MqKQorCSMgTHVjaWQKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKyAgICAgICopCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisgICAgZXNhYworICAgIDs7CisgIHNvbGFyaXMqKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBDQyopCisJIyBTdW4gQysrIDQuMiwgNS54IGFuZCBDZW50ZXJsaW5lIEMrKworICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCQxKT15ZXMKKwlfTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtemRlZnMnCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gIC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gICR7d2x9LU0gJHt3bH0kbGliLmV4cCAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JHJtICRsaWIuZXhwJworCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCWNhc2UgJGhvc3Rfb3MgaW4KKwkgIHNvbGFyaXMyLltbMC01XV0gfCBzb2xhcmlzMi5bWzAtNV1dLiopIDs7CisJICAqKQorCSAgICAjIFRoZSBDKysgY29tcGlsZXIgaXMgdXNlZCBhcyBsaW5rZXIgc28gd2UgbXVzdCB1c2UgJHdsCisJICAgICMgZmxhZyB0byBwYXNzIHRoZSBjb21tYW5kcyB0byB0aGUgdW5kZXJseWluZyBzeXN0ZW0KKwkgICAgIyBsaW5rZXIuIFdlIG11c3QgYWxzbyBwYXNzIGVhY2ggY29udmllbmNlIGxpYnJhcnkgdGhyb3VnaAorCSAgICAjIHRvIHRoZSBzeXN0ZW0gbGlua2VyIGJldHdlZW4gYWxsZXh0cmFjdC9kZWZhdWx0ZXh0cmFjdC4KKwkgICAgIyBUaGUgQysrIGNvbXBpbGVyIHdpbGwgY29tYmluZSBsaW5rZXIgb3B0aW9ucyBzbyB3ZQorCSAgICAjIGNhbm5vdCBqdXN0IHBhc3MgdGhlIGNvbnZpZW5jZSBsaWJyYXJ5IG5hbWVzIHRocm91Z2gKKwkgICAgIyB3aXRob3V0ICR3bC4KKwkgICAgIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKKwkgICAgX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS16ICR7d2x9YWxsZXh0cmFjdGBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0IC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS16ICR7d2x9ZGVmYXVsdGV4dHJhY3QnCisJICAgIDs7CisJZXNhYworCV9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworCisJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCisKKwkjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkjICJDQyAteGFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgU3VuIEMrKyBjb21waWxlci4gIFRoaXMgaXMKKwkjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKKwkjIGluIHRoZSBhcmNoaXZlLgorCV9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLXhhciAtbyAkb2xkbGliICRvbGRvYmpzJworCTs7CisgICAgICBnY3gqKQorCSMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJworCisJIyBUaGUgQysrIGNvbXBpbGVyIG11c3QgYmUgdXNlZCB0byBjcmVhdGUgdGhlIGFyY2hpdmUuCisJX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAkTERGTEFHUyAtYXJjaGl2ZSAtbyAkb2xkbGliICRvbGRvYmpzJworCTs7CisgICAgICAqKQorCSMgR05VIEMrKyBjb21waWxlciB3aXRoIFNvbGFyaXMgbGlua2VyCisJaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJICBfTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS16ICR7d2x9ZGVmcycKKwkgIGlmICRDQyAtLXZlcnNpb24gfCBncmVwIC12ICdeMlwuNycgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRMREZMQUdTICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCQkkQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHt3bH0tTSAkd2wkbGliLmV4cCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc34kcm0gJGxpYi5leHAnCisKKwkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSIkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgXCJcLUxcIiIKKwkgIGVsc2UKKwkgICAgIyBnKysgMi43IGFwcGVhcnMgdG8gcmVxdWlyZSBgLUcnIE5PVCBgLXNoYXJlZCcgb24gdGhpcworCSAgICAjIHBsYXRmb3JtLgorCSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgLW5vc3RkbGliICRMREZMQUdTICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCQkkQ0MgLUcgLW5vc3RkbGliICR7d2x9LU0gJHdsJGxpYi5leHAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JHJtICRsaWIuZXhwJworCisJICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0iJENDIC1HICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCBcIlwtTFwiIgorCSAgZmkKKworCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIgJHdsJGxpYmRpcicKKwlmaQorCTs7CisgICAgZXNhYworICAgIDs7CisgIHN5c3Y0KnV3MiogfCBzeXN2NU9wZW5VTklYKiB8IHN5c3Y1VW5peFdhcmU3LltbMDFdXS5bWzEwXV0qIHwgdW5peHdhcmU3KiB8IHNjbzMuMnY1LjAuW1swMjRdXSopCisgICAgX0xUX0FDX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LHRleHQnCisgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgQ0MqKQorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJOzsKKyAgICAgICopCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KikKKyAgICAjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAorICAgICMgbGluayB3aXRoIC1sYywgYW5kIHRoYXQgd291bGQgY2F1c2UgYW55IHN5bWJvbHMgdXNlZCBmcm9tIGxpYmMgdG8KKyAgICAjIGFsd2F5cyBiZSB1bnJlc29sdmVkLCB3aGljaCBtZWFucyBqdXN0IGFib3V0IG5vIGxpYnJhcnkgd291bGQKKyAgICAjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0CisgICAgIyB0aG91Z2gsIHdoaWNoIGRvZXMgY2F0Y2ggc29tZSBiYWQgc3ltYm9scyBidXQgaXNuJ3QgYXMgaGVhdnktaGFuZGVkCisgICAgIyBhcyAteiBkZWZzLgorICAgICMgRm9yIHNlY3VyaXR5IHJlYXNvbnMsIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBhbHdheXMKKyAgICAjIHVzZSBhYnNvbHV0ZSBwYXRocyBmb3IgbmFtaW5nIHNoYXJlZCBsaWJyYXJpZXMsIGFuZCBleGNsdWRlIHRoZQorICAgICMgRFRfUlVOUEFUSCB0YWcgZnJvbSBleGVjdXRhYmxlcyBhbmQgbGlicmFyaWVzLiAgQnV0IGRvaW5nIHNvCisgICAgIyByZXF1aXJlcyB0aGF0IHlvdSBjb21waWxlIGV2ZXJ5dGhpbmcgdHdpY2UsIHdoaWNoIGlzIGEgcGFpbi4KKyAgICAjIFNvIHRoYXQgYmVoYXZpb3VyIGlzIG9ubHkgZW5hYmxlZCBpZiBTQ09BQlNQQVRIIGlzIHNldCB0byBhCisgICAgIyBub24tZW1wdHkgdmFsdWUgaW4gdGhlIGVudmlyb25tZW50LiAgTW9zdCBsaWtlbHkgb25seSB1c2VmdWwgZm9yCisgICAgIyBjcmVhdGluZyBvZmZpY2lhbCBkaXN0cmlidXRpb25zIG9mIHBhY2thZ2VzLgorICAgICMgVGhpcyBpcyBhIGhhY2sgdW50aWwgbGlidG9vbCBvZmZpY2lhbGx5IHN1cHBvcnRzIGFic29sdXRlIHBhdGgKKyAgICAjIG5hbWVzIGZvciBzaGFyZWQgbGlicmFyaWVzLgorICAgIF9MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teix0ZXh0JworICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teixub2RlZnMnCisgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nYHRlc3QgLXogIiRTQ09BQlNQQVRIIiAmJiBlY2hvICR7d2x9LVIsJGxpYmRpcmAnCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9JzonCisgICAgX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tQmV4cG9ydCcKKyAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgQ0MqKQorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwk7OworICAgICAgKikKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCTs7CisgICAgZXNhYworICAgIDs7CisgIHRhbmRlbSopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIE5DQyopCisJIyBOb25TdG9wLVVYIE5DQyAzLjIwCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisgICAgICAqKQorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwk7OworICAgIGVzYWMKKyAgICA7OworICB2eHdvcmtzKikKKyAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgOzsKKyAgKikKKyAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgOzsKK2VzYWMKK0FDX01TR19SRVNVTFQoWyRfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpXSkKK3Rlc3QgIiRfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworX0xUX0FDX1RBR1ZBUihHQ0MsICQxKT0iJEdYWCIKK19MVF9BQ19UQUdWQVIoTEQsICQxKT0iJExEIgorCisjIyBDQVZFQVQgRU1QVE9SOgorIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5CisjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KK0FDX0xJQlRPT0xfUE9TVERFUF9QUkVERVAoJDEpCitBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDKCQxKQorQUNfTElCVE9PTF9QUk9HX0NDX0NfTygkMSkKK0FDX0xJQlRPT0xfU1lTX0hBUkRfTElOS19MT0NLUygkMSkKK0FDX0xJQlRPT0xfUFJPR19MRF9TSExJQlMoJDEpCitBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUigkMSkKK0FDX0xJQlRPT0xfUFJPR19MRF9IQVJEQ09ERV9MSUJQQVRIKCQxKQorCitBQ19MSUJUT09MX0NPTkZJRygkMSkKKworQUNfTEFOR19QT1AKK0NDPSRsdF9zYXZlX0NDCitMRENYWD0kTEQKK0xEPSRsdF9zYXZlX0xECitHQ0M9JGx0X3NhdmVfR0NDCit3aXRoX2dudV9sZGN4eD0kd2l0aF9nbnVfbGQKK3dpdGhfZ251X2xkPSRsdF9zYXZlX3dpdGhfZ251X2xkCitsdF9jdl9wYXRoX0xEQ1hYPSRsdF9jdl9wYXRoX0xECitsdF9jdl9wYXRoX0xEPSRsdF9zYXZlX3BhdGhfTEQKK2x0X2N2X3Byb2dfZ251X2xkY3h4PSRsdF9jdl9wcm9nX2dudV9sZAorbHRfY3ZfcHJvZ19nbnVfbGQ9JGx0X3NhdmVfd2l0aF9nbnVfbGQKK10pIyBBQ19MSUJUT09MX0xBTkdfQ1hYX0NPTkZJRworCisjIEFDX0xJQlRPT0xfUE9TVERFUF9QUkVERVAoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRmlndXJlIG91dCAiaGlkZGVuIiBsaWJyYXJ5IGRlcGVuZGVuY2llcyBmcm9tIHZlcmJvc2UKKyMgY29tcGlsZXIgb3V0cHV0IHdoZW4gbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorIyBQYXJzZSB0aGUgY29tcGlsZXIgb3V0cHV0IGFuZCBleHRyYWN0IHRoZSBuZWNlc3NhcnkKKyMgb2JqZWN0cywgbGlicmFyaWVzIGFuZCBsaWJyYXJ5IGZsYWdzLgorQUNfREVGVU4oW0FDX0xJQlRPT0xfUE9TVERFUF9QUkVERVBdLFsKK2RubCB3ZSBjYW4ndCB1c2UgdGhlIGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSBoZXJlLAorZG5sIGJlY2F1c2UgaXQgY29udGFpbnMgY29kZSBpbnRlbmRlZCBmb3IgYW4gZXhlY3V0YWJsZSwKK2RubCBub3QgYSBsaWJyYXJ5LiAgSXQncyBwb3NzaWJsZSB3ZSBzaG91bGQgbGV0IGVhY2gKK2RubCB0YWcgZGVmaW5lIGEgbmV3IGx0Xz8/Pz9fbGlua190ZXN0X2NvZGUgdmFyaWFibGUsCitkbmwgYnV0IGl0J3Mgb25seSB1c2VkIGhlcmUuLi4KK2lmZWxzZShbJDFdLFtdLFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCitpbnQgYTsKK3ZvaWQgZm9vICh2b2lkKSB7IGEgPSAwOyB9CitFT0YKK10sWyQxXSxbQ1hYXSxbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorY2xhc3MgRm9vCit7CitwdWJsaWM6CisgIEZvbyAodm9pZCkgeyBhID0gMDsgfQorcHJpdmF0ZToKKyAgaW50IGE7Cit9OworRU9GCitdLFskMV0sW0Y3N10sW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyAgICAgIHN1YnJvdXRpbmUgZm9vCisgICAgICBpbXBsaWNpdCBub25lCisgICAgICBpbnRlZ2VyKjQgYQorICAgICAgYT0wCisgICAgICByZXR1cm4KKyAgICAgIGVuZAorRU9GCitdLFskMV0sW0dDSl0sW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKK3B1YmxpYyBjbGFzcyBmb28geworICBwcml2YXRlIGludCBhOworICBwdWJsaWMgdm9pZCBiYXIgKHZvaWQpIHsKKyAgICBhID0gMDsKKyAgfQorfTsKK0VPRgorXSkKK2RubCBQYXJzZSB0aGUgY29tcGlsZXIgb3V0cHV0IGFuZCBleHRyYWN0IHRoZSBuZWNlc3NhcnkKK2RubCBvYmplY3RzLCBsaWJyYXJpZXMgYW5kIGxpYnJhcnkgZmxhZ3MuCitpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAjIFBhcnNlIHRoZSBjb21waWxlciBvdXRwdXQgYW5kIGV4dHJhY3QgdGhlIG5lY2Vzc2FyeQorICAjIG9iamVjdHMsIGxpYnJhcmllcyBhbmQgbGlicmFyeSBmbGFncy4KKworICAjIFNlbnRpbmVsIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgYmVmb3JlCisgICMgdGhlIGNvbmZ0ZXN0IG9iamVjdCBmaWxlLgorICBwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lPW5vCisKKyAgIyBUaGUgYConIGluIHRoZSBjYXNlIG1hdGNoZXMgZm9yIGFyY2hpdGVjdHVyZXMgdGhhdCB1c2UgYGNhc2UnIGluCisgICMgJG91dHB1dF92ZXJib3NlX2NtZCBjYW4gdHJpZ2dlciBnbG9iIGV4cGFuc2lvbiBkdXJpbmcgdGhlIGxvb3AKKyAgIyBldmFsIHdpdGhvdXQgdGhpcyBzdWJzdGl0dXRpb24uCisgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPWAkZWNobyAiWCRvdXRwdXRfdmVyYm9zZV9saW5rX2NtZCIgfCAkWHNlZCAtZSAiJG5vX2dsb2Jfc3Vic3QiYAorCisgIGZvciBwIGluIGBldmFsICRvdXRwdXRfdmVyYm9zZV9saW5rX2NtZGA7IGRvCisgICAgY2FzZSAkcCBpbgorCisgICAgLUwqIHwgLVIqIHwgLWwqKQorICAgICAgICMgU29tZSBjb21waWxlcnMgcGxhY2Ugc3BhY2UgYmV0d2VlbiAiLXtMLFJ9IiBhbmQgdGhlIHBhdGguCisgICAgICAgIyBSZW1vdmUgdGhlIHNwYWNlLgorICAgICAgIGlmIHRlc3QgJHAgPSAiLUwiIFwKKwkgIHx8IHRlc3QgJHAgPSAiLVIiOyB0aGVuCisJIHByZXY9JHAKKwkgY29udGludWUKKyAgICAgICBlbHNlCisJIHByZXY9CisgICAgICAgZmkKKworICAgICAgIGlmIHRlc3QgIiRwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lIiA9IG5vOyB0aGVuCisJIGNhc2UgJHAgaW4KKwkgLUwqIHwgLVIqKQorCSAgICMgSW50ZXJuYWwgY29tcGlsZXIgbGlicmFyeSBwYXRocyBzaG91bGQgY29tZSBhZnRlciB0aG9zZQorCSAgICMgcHJvdmlkZWQgdGhlIHVzZXIuICBUaGUgcG9zdGRlcHMgYWxyZWFkeSBjb21lIGFmdGVyIHRoZQorCSAgICMgdXNlciBzdXBwbGllZCBsaWJzIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gcHJvY2VzcyB0aGVtLgorCSAgIGlmIHRlc3QgLXogIiRfTFRfQUNfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpIjsgdGhlbgorCSAgICAgX0xUX0FDX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKT0iJHtwcmV2fSR7cH0iCisJICAgZWxzZQorCSAgICAgX0xUX0FDX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKT0iJHtfTFRfQUNfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpfSAke3ByZXZ9JHtwfSIKKwkgICBmaQorCSAgIDs7CisJICMgVGhlICItbCIgY2FzZSB3b3VsZCBuZXZlciBjb21lIGJlZm9yZSB0aGUgb2JqZWN0IGJlaW5nCisJICMgbGlua2VkLCBzbyBkb24ndCBib3RoZXIgaGFuZGxpbmcgdGhpcyBjYXNlLgorCSBlc2FjCisgICAgICAgZWxzZQorCSBpZiB0ZXN0IC16ICIkX0xUX0FDX1RBR1ZBUihwb3N0ZGVwcywgJDEpIjsgdGhlbgorCSAgIF9MVF9BQ19UQUdWQVIocG9zdGRlcHMsICQxKT0iJHtwcmV2fSR7cH0iCisJIGVsc2UKKwkgICBfTFRfQUNfVEFHVkFSKHBvc3RkZXBzLCAkMSk9IiR7X0xUX0FDX1RBR1ZBUihwb3N0ZGVwcywgJDEpfSAke3ByZXZ9JHtwfSIKKwkgZmkKKyAgICAgICBmaQorICAgICAgIDs7CisKKyAgICAqLiRvYmpleHQpCisgICAgICAgIyBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgdGVzdCBvYmplY3QgZmlsZSBvbmx5IHNob3dzIHVwCisgICAgICAgIyBvbmNlIGluIHRoZSBjb21waWxlciBvdXRwdXQuCisgICAgICAgaWYgdGVzdCAiJHAiID0gImNvbmZ0ZXN0LiRvYmpleHQiOyB0aGVuCisJIHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmU9eWVzCisJIGNvbnRpbnVlCisgICAgICAgZmkKKworICAgICAgIGlmIHRlc3QgIiRwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lIiA9IG5vOyB0aGVuCisJIGlmIHRlc3QgLXogIiRfTFRfQUNfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSkiOyB0aGVuCisJICAgX0xUX0FDX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpPSIkcCIKKwkgZWxzZQorCSAgIF9MVF9BQ19UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKT0iJF9MVF9BQ19UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKSAkcCIKKwkgZmkKKyAgICAgICBlbHNlCisJIGlmIHRlc3QgLXogIiRfTFRfQUNfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpIjsgdGhlbgorCSAgIF9MVF9BQ19UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSk9IiRwIgorCSBlbHNlCisJICAgX0xUX0FDX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKT0iJF9MVF9BQ19UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSkgJHAiCisJIGZpCisgICAgICAgZmkKKyAgICAgICA7OworCisgICAgKikgOzsgIyBJZ25vcmUgdGhlIHJlc3QuCisKKyAgICBlc2FjCisgIGRvbmUKKworICAjIENsZWFuIHVwLgorICBybSAtZiBhLm91dCBhLmV4ZQorZWxzZQorICBlY2hvICJsaWJ0b29sLm00OiBlcnJvcjogcHJvYmxlbSBjb21waWxpbmcgJDEgdGVzdCBwcm9ncmFtIgorZmkKKworJHJtIC1mIGNvbmZlc3QuJG9iamV4dAorCisjIFBPUlRNRTogb3ZlcnJpZGUgYWJvdmUgdGVzdCBvbiBzeXN0ZW1zIHdoZXJlIGl0IGlzIGJyb2tlbgoraWZlbHNlKFskMV0sW0NYWF0sCitbY2FzZSAkaG9zdF9vcyBpbgoraW50ZXJpeDMqKQorICAjIEludGVyaXggMy41IGluc3RhbGxzIGNvbXBsZXRlbHkgaG9zZWQgLmxhIGZpbGVzIGZvciBDKyssIHNvIHJhdGhlciB0aGFuCisgICMgaGFjayBhbGwgYXJvdW5kIGl0LCBsZXQncyBqdXN0IHRydXN0ICJnKysiIHRvIERUUlQuCisgIF9MVF9BQ19UQUdWQVIocHJlZGVwX29iamVjdHMsJDEpPQorICBfTFRfQUNfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywkMSk9CisgIF9MVF9BQ19UQUdWQVIocG9zdGRlcHMsJDEpPQorICA7OworCitzb2xhcmlzKikKKyAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgQ0MqKQorICAgICMgQWRkaW5nIHRoaXMgcmVxdWlyZXMgYSBrbm93bi1nb29kIHNldHVwIG9mIHNoYXJlZCBsaWJyYXJpZXMgZm9yCisgICAgIyBTdW4gY29tcGlsZXIgdmVyc2lvbnMgYmVmb3JlIDUuNiwgZWxzZSBQSUMgb2JqZWN0cyBmcm9tIGFuIG9sZAorICAgICMgYXJjaGl2ZSB3aWxsIGJlIGxpbmtlZCBpbnRvIHRoZSBvdXRwdXQsIGxlYWRpbmcgdG8gc3VidGxlIGJ1Z3MuCisgICAgX0xUX0FDX1RBR1ZBUihwb3N0ZGVwcywkMSk9Jy1sQ3N0ZCAtbENydW4nCisgICAgOzsKKyAgZXNhYworICA7OworZXNhYworXSkKKworY2FzZSAiICRfTFRfQUNfVEFHVkFSKHBvc3RkZXBzLCAkMSkgIiBpbgorKiIgLWxjICIqKSBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8gOzsKK2VzYWMKK10pIyBBQ19MSUJUT09MX1BPU1RERVBfUFJFREVQCisKKyMgQUNfTElCVE9PTF9MQU5HX0Y3N19DT05GSUcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFycyBmb3IgdGhlIEMgY29tcGlsZXIgYXJlCisjIHN1aXRhYmx5IGRlZmluZWQuICBUaG9zZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5CisjIEFDX0xJQlRPT0xfQ09ORklHIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfRjc3X0NPTkZJR10sIFtfTFRfQUNfTEFOR19GNzdfQ09ORklHKEY3NyldKQorQUNfREVGVU4oW19MVF9BQ19MQU5HX0Y3N19DT05GSUddLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfRjc3XSkKK0FDX0xBTkdfUFVTSChGb3J0cmFuIDc3KQorCitfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KK19MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9BQ19UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KK19MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQorX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KK19MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KK19MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9CitfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KK19MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCitfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPW5vCitfTFRfQUNfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9CitfTFRfQUNfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPQorX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9dW5rbm93bgorX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JG9sZF9hcmNoaXZlX2NtZHMKK19MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KK19MVF9BQ19UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPW5vCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBmNzcgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWYKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIGY3NyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX0FDX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCitsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9IiAgICAgIHN1YnJvdXRpbmUgdFxuICAgICAgcmV0dXJuXG4gICAgICBlbmRcbiIKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0iICAgICAgcHJvZ3JhbSB0XG4gICAgICBlbmRcbiIKKworIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorX0xUX0FDX1NZU19DT01QSUxFUgorCisjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCitfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitsdF9zYXZlX0NDPSIkQ0MiCitDQz0ke0Y3Ny0iZjc3In0KK2NvbXBpbGVyPSRDQworX0xUX0FDX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQworX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorCitBQ19NU0dfQ0hFQ0tJTkcoW2lmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCitBQ19NU0dfUkVTVUxUKFskY2FuX2J1aWxkX3NoYXJlZF0pCisKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzXSkKK3Rlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubworCisjIE9uIEFJWCwgc2hhcmVkIGxpYnJhcmllcyBhbmQgc3RhdGljIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgbmFtZXNwYWNlLCBhbmQKKyMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDMqKQorICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICAgIGFyY2hpdmVfY21kcz0iJGFyY2hpdmVfY21kc35cJFJBTkxJQiBcJGxpYiIKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCisgIGZpCisgIDs7CithaXg0KiB8IGFpeDUqKQorICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQgJiYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0gbm8gOyB0aGVuCisgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgZmkKKyAgOzsKK2VzYWMKK0FDX01TR19SRVNVTFQoWyRlbmFibGVfc2hhcmVkXSkKKworQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXNdKQorIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCit0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKK0FDX01TR19SRVNVTFQoWyRlbmFibGVfc3RhdGljXSkKKworX0xUX0FDX1RBR1ZBUihHQ0MsICQxKT0iJEc3NyIKK19MVF9BQ19UQUdWQVIoTEQsICQxKT0iJExEIgorCitBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDKCQxKQorQUNfTElCVE9PTF9QUk9HX0NDX0NfTygkMSkKK0FDX0xJQlRPT0xfU1lTX0hBUkRfTElOS19MT0NLUygkMSkKK0FDX0xJQlRPT0xfUFJPR19MRF9TSExJQlMoJDEpCitBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUigkMSkKK0FDX0xJQlRPT0xfUFJPR19MRF9IQVJEQ09ERV9MSUJQQVRIKCQxKQorCitBQ19MSUJUT09MX0NPTkZJRygkMSkKKworQUNfTEFOR19QT1AKK0NDPSIkbHRfc2F2ZV9DQyIKK10pIyBBQ19MSUJUT09MX0xBTkdfRjc3X0NPTkZJRworCisKKyMgQUNfTElCVE9PTF9MQU5HX0dDSl9DT05GSUcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFycyBmb3IgdGhlIEMgY29tcGlsZXIgYXJlCisjIHN1aXRhYmx5IGRlZmluZWQuICBUaG9zZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5CisjIEFDX0xJQlRPT0xfQ09ORklHIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfR0NKX0NPTkZJR10sIFtfTFRfQUNfTEFOR19HQ0pfQ09ORklHKEdDSildKQorQUNfREVGVU4oW19MVF9BQ19MQU5HX0dDSl9DT05GSUddLAorW0FDX0xBTkdfU0FWRQorCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgSmF2YSB0ZXN0IHNvdXJjZXMuCithY19leHQ9amF2YQorCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgSmF2YSB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX0FDX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCitsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImNsYXNzIGZvbyB7fVxuIgorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdwdWJsaWMgY2xhc3MgY29uZnRlc3QgeyBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbW11dIGFyZ3YpIHt9OyB9XG4nCisKKyMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KK19MVF9BQ19TWVNfQ09NUElMRVIKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK19MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorbHRfc2F2ZV9DQz0iJENDIgorQ0M9JHtHQ0otImdjaiJ9Citjb21waWxlcj0kQ0MKK19MVF9BQ19UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKK19MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKKworIyBHQ0ogZGlkIG5vdCBleGlzdCBhdCB0aGUgdGltZSBHQ0MgZGlkbid0IGltcGxpY2l0bHkgbGluayBsaWJjIGluLgorX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisKK19MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCisKKyMjIENBVkVBVCBFTVBUT1I6CisjIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQorIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKKyMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgorQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX05PX1JUVEkoJDEpCitBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDKCQxKQorQUNfTElCVE9PTF9QUk9HX0NDX0NfTygkMSkKK0FDX0xJQlRPT0xfU1lTX0hBUkRfTElOS19MT0NLUygkMSkKK0FDX0xJQlRPT0xfUFJPR19MRF9TSExJQlMoJDEpCitBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUigkMSkKK0FDX0xJQlRPT0xfUFJPR19MRF9IQVJEQ09ERV9MSUJQQVRIKCQxKQorCitBQ19MSUJUT09MX0NPTkZJRygkMSkKKworQUNfTEFOR19SRVNUT1JFCitDQz0iJGx0X3NhdmVfQ0MiCitdKSMgQUNfTElCVE9PTF9MQU5HX0dDSl9DT05GSUcKKworCisjIEFDX0xJQlRPT0xfTEFOR19SQ19DT05GSUcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJzIGZvciB0aGUgV2luZG93cyByZXNvdXJjZSBjb21waWxlciBhcmUKKyMgc3VpdGFibHkgZGVmaW5lZC4gIFRob3NlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkKKyMgQUNfTElCVE9PTF9DT05GSUcgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19SQ19DT05GSUddLCBbX0xUX0FDX0xBTkdfUkNfQ09ORklHKFJDKV0pCitBQ19ERUZVTihbX0xUX0FDX0xBTkdfUkNfQ09ORklHXSwKK1tBQ19MQU5HX1NBVkUKKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIFJDIHRlc3Qgc291cmNlcy4KK2FjX2V4dD1yYworCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgUkMgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9BQ19UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSdzYW1wbGUgTUVOVSB7IE1FTlVJVEVNICImU291cCIsIDEwMCwgQ0hFQ0tFRCB9XG4nCisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCitsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9IiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiCisKKyMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KK19MVF9BQ19TWVNfQ09NUElMRVIKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK19MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorbHRfc2F2ZV9DQz0iJENDIgorQ0M9JHtSQy0id2luZHJlcyJ9Citjb21waWxlcj0kQ0MKK19MVF9BQ19UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKK19MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKK19MVF9BQ19UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKT15ZXMKKworQUNfTElCVE9PTF9DT05GSUcoJDEpCisKK0FDX0xBTkdfUkVTVE9SRQorQ0M9IiRsdF9zYXZlX0NDIgorXSkjIEFDX0xJQlRPT0xfTEFOR19SQ19DT05GSUcKKworCisjIEFDX0xJQlRPT0xfQ09ORklHKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJZiBUQUdOQU1FIGlzIG5vdCBwYXNzZWQsIHRoZW4gY3JlYXRlIGFuIGluaXRpYWwgbGlidG9vbCBzY3JpcHQKKyMgd2l0aCBhIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmcm9tIHRoZSB1bnRhZ2dlZCBjb25maWcgdmFycy4gIE90aGVyd2lzZQorIyBhZGQgY29kZSB0byBjb25maWcuc3RhdHVzIGZvciBhcHBlbmRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZWQgYnkKKyMgVEFHTkFNRSBmcm9tIHRoZSBtYXRjaGluZyB0YWdnZWQgY29uZmlnIHZhcnMuCitBQ19ERUZVTihbQUNfTElCVE9PTF9DT05GSUddLAorWyMgVGhlIGVsc2UgY2xhdXNlIHNob3VsZCBvbmx5IGZpcmUgd2hlbiBib290c3RyYXBwaW5nIHRoZQorIyBsaWJ0b29sIGRpc3RyaWJ1dGlvbiwgb3RoZXJ3aXNlIHlvdSBmb3Jnb3QgdG8gc2hpcCBsdG1haW4uc2gKKyMgd2l0aCB5b3VyIHBhY2thZ2UsIGFuZCB5b3Ugd2lsbCBnZXQgY29tcGxhaW50cyB0aGF0IHRoZXJlIGFyZQorIyBubyBydWxlcyB0byBnZW5lcmF0ZSBsdG1haW4uc2guCitpZiB0ZXN0IC1mICIkbHRtYWluIjsgdGhlbgorICAjIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyIGNvbW1hbmRzIHRocm91Z2gKKyAgIyB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzLgorICBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgorICAgIHNldG9wdCBOT19HTE9CX1NVQlNUCisgIGZpCisgICMgTm93IHF1b3RlIGFsbCB0aGUgdGhpbmdzIHRoYXQgbWF5IGNvbnRhaW4gbWV0YWNoYXJhY3RlcnMgd2hpbGUgYmVpbmcKKyAgIyBjYXJlZnVsIG5vdCB0byBvdmVycXVvdGUgdGhlIEFDX1NVQlNUZWQgdmFsdWVzLiAgV2UgdGFrZSBjb3BpZXMgb2YgdGhlCisgICMgdmFyaWFibGVzIGFuZCBxdW90ZSB0aGUgY29waWVzIGZvciBnZW5lcmF0aW9uIG9mIHRoZSBsaWJ0b29sIHNjcmlwdC4KKyAgZm9yIHZhciBpbiBlY2hvIG9sZF9DQyBvbGRfQ0ZMQUdTIEFSIEFSX0ZMQUdTIEVHUkVQIFJBTkxJQiBMTl9TIExUQ0MgTFRDRkxBR1MgTk0gXAorICAgIFNFRCBTSEVMTCBTVFJJUCBcCisgICAgbGlibmFtZV9zcGVjIGxpYnJhcnlfbmFtZXNfc3BlYyBzb25hbWVfc3BlYyBleHRyYWN0X2V4cHN5bXNfY21kcyBcCisgICAgb2xkX3N0cmlwbGliIHN0cmlwbGliIGZpbGVfbWFnaWNfY21kIGZpbmlzaF9jbWRzIGZpbmlzaF9ldmFsIFwKKyAgICBkZXBsaWJzX2NoZWNrX21ldGhvZCByZWxvYWRfZmxhZyByZWxvYWRfY21kcyBuZWVkX2xvY2tzIFwKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIFwKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyBcCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIFwKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcyBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIFwKKyAgICBfTFRfQUNfVEFHVkFSKGNvbXBpbGVyLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIoQ0MsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihMRCwgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUih0aHJlYWRfc2FmZV9mbGFnX3NwZWMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIocHJlZGVwcywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKHBvc3RkZXBzLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKHBvc3RpbnN0YWxsX2NtZHMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihwb3N0dW5pbnN0YWxsX2NtZHMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2NtZHMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKGluY2x1ZGVfZXhwc3ltcywgJDEpOyBkbworCisgICAgY2FzZSAkdmFyIGluCisgICAgX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSkgfCBcCisgICAgX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzLCAkMSkgfCBcCisgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKSB8IFwKKyAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKSB8IFwKKyAgICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSkgfCBcCisgICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKSB8IFwKKyAgICBfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzLCAkMSkgfCBcCisgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSkgfCBcCisgICAgZXh0cmFjdF9leHBzeW1zX2NtZHMgfCByZWxvYWRfY21kcyB8IGZpbmlzaF9jbWRzIHwgXAorICAgIHBvc3RpbnN0YWxsX2NtZHMgfCBwb3N0dW5pbnN0YWxsX2NtZHMgfCBcCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgfCBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyB8IHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjKQorICAgICAgIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgorICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJGRvdWJsZV9xdW90ZV9zdWJzdFwiIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIiAtZSBcIlwkZGVsYXlfdmFyaWFibGVfc3Vic3RcIlxgXFxcIiIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIlxgXFxcIiIKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisKKyAgY2FzZSAkbHRfZWNobyBpbgorICAqJ1xbJF0wIC0tZmFsbGJhY2stZWNobyInKQorICAgIGx0X2VjaG89YCRlY2hvICJYJGx0X2VjaG8iIHwgJFhzZWQgLWUgJ3MvXFxcXFxcXFskXTAgLS1mYWxsYmFjay1lY2hvIlskXS9bJF0wIC0tZmFsbGJhY2stZWNobyIvJ2AKKyAgICA7OworICBlc2FjCisKK2lmZWxzZShbJDFdLCBbXSwKKyAgW2NmZ2ZpbGU9IiR7b2ZpbGV9VCIKKyAgdHJhcCAiJHJtIFwiJGNmZ2ZpbGVcIjsgZXhpdCAxIiAxIDIgMTUKKyAgJHJtIC1mICIkY2ZnZmlsZSIKKyAgQUNfTVNHX05PVElDRShbY3JlYXRpbmcgJG9maWxlXSldLAorICBbY2ZnZmlsZT0iJG9maWxlIl0pCisKKyAgY2F0IDw8X19FT0ZfXyA+PiAiJGNmZ2ZpbGUiCitpZmVsc2UoWyQxXSwgW10sCitbIyEgJFNIRUxMCisKKyMgYCRlY2hvICIkY2ZnZmlsZSIgfCBzZWQgJ3MlXi4qLyUlJ2AgLSBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVApCisjIE5PVEU6IENoYW5nZXMgbWFkZSB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0OiBsb29rIGF0IGx0bWFpbi5zaC4KKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgTGlidG9vbDoKKyMgT3JpZ2luYWxseSBieSBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBBIHNlZCBwcm9ncmFtIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0LgorU0VEPSRsdF9TRUQKKworIyBTZWQgdGhhdCBoZWxwcyB1cyBhdm9pZCBhY2NpZGVudGFsbHkgdHJpZ2dlcmluZyBlY2hvKDEpIG9wdGlvbnMgbGlrZSAtbi4KK1hzZWQ9IiRTRUQgLWUgMXMvXlgvLyIKKworIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKKyMgaWYgQ0RQQVRIIGlzIHNldC4KKyh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKKworIyBUaGUgbmFtZXMgb2YgdGhlIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzdXBwb3J0ZWQgYnkgdGhpcyBzY3JpcHQuCithdmFpbGFibGVfdGFncz0KKworIyAjIyMgQkVHSU4gTElCVE9PTCBDT05GSUddLAorWyMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWVdKQorCisjIExpYnRvb2wgd2FzIGNvbmZpZ3VyZWQgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisKKyMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KK1NIRUxMPSRsdF9TSEVMTAorCisjIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuCitidWlsZF9saWJ0b29sX2xpYnM9JGVuYWJsZV9zaGFyZWQKKworIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLgorYnVpbGRfb2xkX2xpYnM9JGVuYWJsZV9zdGF0aWMKKworIyBXaGV0aGVyIG9yIG5vdCB0byBhZGQgLWxjIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgorYnVpbGRfbGlidG9vbF9uZWVkX2xjPSRfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSkKKworIyBXaGV0aGVyIG9yIG5vdCB0byBkaXNhbGxvdyBzaGFyZWQgbGlicyB3aGVuIHJ1bnRpbWUgbGlicyBhcmUgc3RhdGljCithbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXM9JF9MVF9BQ19UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpCisKKyMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgorZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCisKKyMgVGhlIGhvc3Qgc3lzdGVtLgoraG9zdF9hbGlhcz0kaG9zdF9hbGlhcworaG9zdD0kaG9zdAoraG9zdF9vcz0kaG9zdF9vcworCisjIFRoZSBidWlsZCBzeXN0ZW0uCitidWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKK2J1aWxkPSRidWlsZAorYnVpbGRfb3M9JGJ1aWxkX29zCisKKyMgQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgorZWNobz0kbHRfZWNobworCisjIFRoZSBhcmNoaXZlci4KK0FSPSRsdF9BUgorQVJfRkxBR1M9JGx0X0FSX0ZMQUdTCisKKyMgQSBDIGNvbXBpbGVyLgorTFRDQz0kbHRfTFRDQworCisjIExUQ0MgY29tcGlsZXIgZmxhZ3MuCitMVENGTEFHUz0kbHRfTFRDRkxBR1MKKworIyBBIGxhbmd1YWdlLXNwZWNpZmljIGNvbXBpbGVyLgorQ0M9JGx0X1tdX0xUX0FDX1RBR1ZBUihjb21waWxlciwgJDEpCisKKyMgSXMgdGhlIGNvbXBpbGVyIHRoZSBHTlUgQyBjb21waWxlcj8KK3dpdGhfZ2NjPSRfTFRfQUNfVEFHVkFSKEdDQywgJDEpCisKKyMgQW4gRVJFIG1hdGNoZXIuCitFR1JFUD0kbHRfRUdSRVAKKworIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgorTEQ9JGx0X1tdX0xUX0FDX1RBR1ZBUihMRCwgJDEpCisKKyMgV2hldGhlciB3ZSBuZWVkIGhhcmQgb3Igc29mdCBsaW5rcy4KK0xOX1M9JGx0X0xOX1MKKworIyBBIEJTRC1jb21wYXRpYmxlIG5tIHByb2dyYW0uCitOTT0kbHRfTk0KKworIyBBIHN5bWJvbCBzdHJpcHBpbmcgcHJvZ3JhbQorU1RSSVA9JGx0X1NUUklQCisKKyMgVXNlZCB0byBleGFtaW5lIGxpYnJhcmllcyB3aGVuIGZpbGVfbWFnaWNfY21kIGJlZ2lucyAiZmlsZSIKK01BR0lDX0NNRD0kTUFHSUNfQ01ECisKKyMgVXNlZCBvbiBjeWd3aW46IERMTCBjcmVhdGlvbiBwcm9ncmFtLgorRExMVE9PTD0iJERMTFRPT0wiCisKKyMgVXNlZCBvbiBjeWd3aW46IG9iamVjdCBkdW1wZXIuCitPQkpEVU1QPSIkT0JKRFVNUCIKKworIyBVc2VkIG9uIGN5Z3dpbjogYXNzZW1ibGVyLgorQVM9IiRBUyIKKworIyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGVtcG9yYXJ5IGxpYnRvb2wgZmlsZXMuCitvYmpkaXI9JG9iamRpcgorCisjIEhvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuCityZWxvYWRfZmxhZz0kbHRfcmVsb2FkX2ZsYWcKK3JlbG9hZF9jbWRzPSRsdF9yZWxvYWRfY21kcworCisjIEhvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXIuCit3bD0kbHRfW11fTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKQorCisjIE9iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKS4KK29iamV4dD0iJGFjX29iamV4dCIKKworIyBPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIikuCitsaWJleHQ9IiRsaWJleHQiCisKKyMgU2hhcmVkIGxpYnJhcnkgc3VmZml4IChub3JtYWxseSAiLnNvIikuCitzaHJleHRfY21kcz0nJHNocmV4dF9jbWRzJworCisjIEV4ZWN1dGFibGUgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICIiKS4KK2V4ZWV4dD0iJGV4ZWV4dCIKKworIyBBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHMuCitwaWNfZmxhZz0kbHRfW11fTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkKK3BpY19tb2RlPSRwaWNfbW9kZQorCisjIFdoYXQgaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgY29tbWFuZD8KK21heF9jbWRfbGVuPSRsdF9jdl9zeXNfbWF4X2NtZF9sZW4KKworIyBEb2VzIGNvbXBpbGVyIHNpbXVsdGFuZW91c2x5IHN1cHBvcnQgLWMgYW5kIC1vIG9wdGlvbnM/Citjb21waWxlcl9jX289JGx0X1tdX0xUX0FDX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpCisKKyMgTXVzdCB3ZSBsb2NrIGZpbGVzIHdoZW4gZG9pbmcgY29tcGlsYXRpb24/CituZWVkX2xvY2tzPSRsdF9uZWVkX2xvY2tzCisKKyMgRG8gd2UgbmVlZCB0aGUgbGliIHByZWZpeCBmb3IgbW9kdWxlcz8KK25lZWRfbGliX3ByZWZpeD0kbmVlZF9saWJfcHJlZml4CisKKyMgRG8gd2UgbmVlZCBhIHZlcnNpb24gZm9yIGxpYnJhcmllcz8KK25lZWRfdmVyc2lvbj0kbmVlZF92ZXJzaW9uCisKKyMgV2hldGhlciBkbG9wZW4gaXMgc3VwcG9ydGVkLgorZGxvcGVuX3N1cHBvcnQ9JGVuYWJsZV9kbG9wZW4KKworIyBXaGV0aGVyIGRsb3BlbiBvZiBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc2VsZj0kZW5hYmxlX2Rsb3Blbl9zZWxmCisKKyMgV2hldGhlciBkbG9wZW4gb2Ygc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgorZGxvcGVuX3NlbGZfc3RhdGljPSRlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljCisKKyMgQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZy4KK2xpbmtfc3RhdGljX2ZsYWc9JGx0X1tdX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpCisKKyMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KK25vX2J1aWx0aW5fZmxhZz0kbHRfW11fTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSkKKworIyBDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zLgorZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSRsdF9bXV9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSkKKworIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHNoYXJlZCBvYmplY3RzIGRpcmVjdGx5IGZyb20gYXJjaGl2ZXMuCit3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0kbHRfW11fTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSkKKworIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHRocmVhZC1zYWZlIG9iamVjdHMuCit0aHJlYWRfc2FmZV9mbGFnX3NwZWM9JGx0X1tdX0xUX0FDX1RBR1ZBUih0aHJlYWRfc2FmZV9mbGFnX3NwZWMsICQxKQorCisjIExpYnJhcnkgdmVyc2lvbmluZyB0eXBlLgordmVyc2lvbl90eXBlPSR2ZXJzaW9uX3R5cGUKKworIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KK2xpYm5hbWVfc3BlYz0kbHRfbGlibmFtZV9zcGVjCisKKyMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KKyMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRS4KK2xpYnJhcnlfbmFtZXNfc3BlYz0kbHRfbGlicmFyeV9uYW1lc19zcGVjCisKKyMgVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWUuCitzb25hbWVfc3BlYz0kbHRfc29uYW1lX3NwZWMKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgorUkFOTElCPSRsdF9SQU5MSUIKK29sZF9hcmNoaXZlX2NtZHM9JGx0X1tdX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSkKK29sZF9wb3N0aW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdGluc3RhbGxfY21kcworb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3R1bmluc3RhbGxfY21kcworCisjIENyZWF0ZSBhbiBvbGQtc3R5bGUgYXJjaGl2ZSBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSRsdF9bXV9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgJDEpCisKKyMgQ3JlYXRlIGEgdGVtcG9yYXJ5IG9sZC1zdHlsZSBhcmNoaXZlIHRvIGxpbmsgaW5zdGVhZCBvZiBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9JGx0X1tdX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcywgJDEpCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhIHNoYXJlZCBhcmNoaXZlLgorYXJjaGl2ZV9jbWRzPSRsdF9bXV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSkKK2FyY2hpdmVfZXhwc3ltX2NtZHM9JGx0X1tdX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSkKK3Bvc3RpbnN0YWxsX2NtZHM9JGx0X3Bvc3RpbnN0YWxsX2NtZHMKK3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfcG9zdHVuaW5zdGFsbF9jbWRzCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSAoYXNzdW1lZCBzYW1lIGFzIGFib3ZlIGlmIGVtcHR5KQorbW9kdWxlX2NtZHM9JGx0X1tdX0xUX0FDX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpCittb2R1bGVfZXhwc3ltX2NtZHM9JGx0X1tdX0xUX0FDX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKQorCisjIENvbW1hbmRzIHRvIHN0cmlwIGxpYnJhcmllcy4KK29sZF9zdHJpcGxpYj0kbHRfb2xkX3N0cmlwbGliCitzdHJpcGxpYj0kbHRfc3RyaXBsaWIKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3ByZWRlcF9vYmplY3RzPSRsdF9bXV9MVF9BQ19UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKQorCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwb3N0ZGVwX29iamVjdHM9JGx0X1tdX0xUX0FDX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKQorCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcHJlZGVwcz0kbHRfW11fTFRfQUNfVEFHVkFSKHByZWRlcHMsICQxKQorCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwb3N0ZGVwcz0kbHRfW11fTFRfQUNfVEFHVkFSKHBvc3RkZXBzLCAkMSkKKworIyBUaGUgbGlicmFyeSBzZWFyY2ggcGF0aCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBpbGVyIHdoZW4gbGlua2luZworIyBhIHNoYXJlZCBsaWJyYXJ5LgorY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoPSRsdF9bXV9MVF9BQ19UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSkKKworIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KK2RlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9kZXBsaWJzX2NoZWNrX21ldGhvZAorCisjIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gZmlsZV9tYWdpYy4KK2ZpbGVfbWFnaWNfY21kPSRsdF9maWxlX21hZ2ljX2NtZAorCisjIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgorYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X1tdX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpCisKKyMgRmxhZyB0aGF0IGZvcmNlcyBubyB1bmRlZmluZWQgc3ltYm9scy4KK25vX3VuZGVmaW5lZF9mbGFnPSRsdF9bXV9MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKQorCisjIENvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeS4KK2ZpbmlzaF9jbWRzPSRsdF9maW5pc2hfY21kcworCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dCBub3Qgc2hvd24uCitmaW5pc2hfZXZhbD0kbHRfZmluaXNoX2V2YWwKKworIyBUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzLgorZ2xvYmFsX3N5bWJvbF9waXBlPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlCisKKyMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgorZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIKK2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzCisKKyMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgorcnVucGF0aF92YXI9JHJ1bnBhdGhfdmFyCisKKyMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KK3NobGlicGF0aF92YXI9JHNobGlicGF0aF92YXIKKworIyBJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAorCisjIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgoraGFyZGNvZGVfYWN0aW9uPSRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpCisKKyMgV2hldGhlciB3ZSBzaG91bGQgaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIGxpYnJhcmllcy4KK2hhcmRjb2RlX2ludG9fbGlicz0kaGFyZGNvZGVfaW50b19saWJzCisKKyMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgorIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0LgoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0kbHRfW11fTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKQorCisjIElmIGxkIGlzIHVzZWQgd2hlbiBsaW5raW5nLCBmbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8KKyMgYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcworIyBub3QgZXhpc3QuCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPSRsdF9bXV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpCisKKyMgV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlIC1ycGF0aCBmbGFnIHdpdGggYSBzZXBhcmF0ZWQgYXJndW1lbnQuCitoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSRsdF9bXV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpCisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyBESVIvbGliTkFNRSR7c2hhcmVkX2V4dH0gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQorIyByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfZGlyZWN0PSRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpCisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisjIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9taW51c19MPSRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKQorCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvCisjIHRoZSByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSkKKworIyBTZXQgdG8geWVzIGlmIGJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkgYXV0b21hdGljYWxseSBoYXJkY29kZXMgRElSIGludG8gdGhlIGxpYnJhcnkKKyMgYW5kIGFsbCBzdWJzZXF1ZW50IGxpYnJhcmllcyBhbmQgZXhlY3V0YWJsZXMgbGlua2VkIGFnYWluc3QgaXQuCitoYXJkY29kZV9hdXRvbWF0aWM9JF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSkKKworIyBWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKKyMgcmVzdG9yZWQgYXQgcmVsaW5rIHRpbWUuCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIgorCisjIFdoZXRoZXIgbGlidG9vbCBtdXN0IGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgYWxsIGl0cyBkZXBlbmRlbmN5IGxpYnJhcmllcy4KK2xpbmtfYWxsX2RlcGxpYnM9JF9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpCisKKyMgQ29tcGlsZS10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCitzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYworCisjIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMKKworIyBGaXggdGhlIHNoZWxsIHZhcmlhYmxlIFwkc3JjZmlsZSBmb3IgdGhlIGNvbXBpbGVyLgorZml4X3NyY2ZpbGVfcGF0aD0iJF9MVF9BQ19UQUdWQVIoZml4X3NyY2ZpbGVfcGF0aCwgJDEpIgorCisjIFNldCB0byB5ZXMgaWYgZXhwb3J0ZWQgc3ltYm9scyBhcmUgcmVxdWlyZWQuCithbHdheXNfZXhwb3J0X3N5bWJvbHM9JF9MVF9BQ19UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSkKKworIyBUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzLgorZXhwb3J0X3N5bWJvbHNfY21kcz0kbHRfW11fTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKQorCisjIFRoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCitleHRyYWN0X2V4cHN5bXNfY21kcz0kbHRfZXh0cmFjdF9leHBzeW1zX2NtZHMKKworIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgorZXhjbHVkZV9leHBzeW1zPSRsdF9bXV9MVF9BQ19UQUdWQVIoZXhjbHVkZV9leHBzeW1zLCAkMSkKKworIyBTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWQuCitpbmNsdWRlX2V4cHN5bXM9JGx0X1tdX0xUX0FDX1RBR1ZBUihpbmNsdWRlX2V4cHN5bXMsICQxKQorCitpZmVsc2UoWyQxXSxbXSwKK1sjICMjIyBFTkQgTElCVE9PTCBDT05GSUddLAorWyMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lXSkKKworX19FT0ZfXworCitpZmVsc2UoWyQxXSxbXSwgWworICBjYXNlICRob3N0X29zIGluCisgIGFpeDMqKQorICAgIGNhdCA8PFxFT0YgPj4gIiRjZmdmaWxlIgorCisjIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKKyMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcworIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgoraWYgdGVzdCAiWCR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBYc2V0OyB0aGVuCisgIENPTExFQ1RfTkFNRVM9CisgIGV4cG9ydCBDT0xMRUNUX05BTUVTCitmaQorRU9GCisgICAgOzsKKyAgZXNhYworCisgICMgV2UgdXNlIHNlZCBpbnN0ZWFkIG9mIGNhdCBiZWNhdXNlIGJhc2ggb24gREpHUFAgZ2V0cyBjb25mdXNlZCBpZgorICAjIGlmIGZpbmRzIG1peGVkIENSL0xGIGFuZCBMRi1vbmx5IGxpbmVzLiAgU2luY2Ugc2VkIG9wZXJhdGVzIGluCisgICMgdGV4dCBtb2RlLCBpdCBwcm9wZXJseSBjb252ZXJ0cyBsaW5lcyB0byBDUi9MRi4gIFRoaXMgYmFzaCBwcm9ibGVtCisgICMgaXMgcmVwb3J0ZWRseSBmaXhlZCwgYnV0IHdoeSBub3QgcnVuIG9uIG9sZCB2ZXJzaW9ucyB0b28/CisgIHNlZCAnJHEnICIkbHRtYWluIiA+PiAiJGNmZ2ZpbGUiIHx8IChybSAtZiAiJGNmZ2ZpbGUiOyBleGl0IDEpCisKKyAgbXYgLWYgIiRjZmdmaWxlIiAiJG9maWxlIiB8fCBcCisgICAgKHJtIC1mICIkb2ZpbGUiICYmIGNwICIkY2ZnZmlsZSIgIiRvZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlIikKKyAgY2htb2QgK3ggIiRvZmlsZSIKK10pCitlbHNlCisgICMgSWYgdGhlcmUgaXMgbm8gTWFrZWZpbGUgeWV0LCB3ZSByZWx5IG9uIGEgbWFrZSBydWxlIHRvIGV4ZWN1dGUKKyAgIyBgY29uZmlnLnN0YXR1cyAtLXJlY2hlY2snIHRvIHJlcnVuIHRoZXNlIHRlc3RzIGFuZCBjcmVhdGUgdGhlCisgICMgbGlidG9vbCBzY3JpcHQgdGhlbi4KKyAgbHRtYWluX2luPWBlY2hvICRsdG1haW4gfCBzZWQgLWUgJ3MvXC5zaCQvLmluLydgCisgIGlmIHRlc3QgLWYgIiRsdG1haW5faW4iOyB0aGVuCisgICAgdGVzdCAtZiBNYWtlZmlsZSAmJiBtYWtlICIkbHRtYWluIgorICBmaQorZmkKK10pIyBBQ19MSUJUT09MX0NPTkZJRworCisKKyMgQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX05PX1JUVEkoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX05PX1JUVEldLAorW0FDX1JFUVVJUkUoW19MVF9BQ19TWVNfQ09NUElMRVJdKWRubAorCitfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9CisKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0nIC1mbm8tYnVpbHRpbicKKworICBBQ19MSUJUT09MX0NPTVBJTEVSX09QVElPTihbaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnNdLAorICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zLAorICAgIFstZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zXSwgW10sCisgICAgW19MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0iJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKSAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIl0pCitmaQorXSkjIEFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9OT19SVFRJCisKKworIyBBQ19MSUJUT09MX1NZU19HTE9CQUxfU1lNQk9MX1BJUEUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfR0xPQkFMX1NZTUJPTF9QSVBFXSwKK1tBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pCitBQ19SRVFVSVJFKFtBQ19QUk9HX05NXSkKK0FDX1JFUVVJUkUoW0FDX09CSkVYVF0pCisjIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgorQUNfTVNHX0NIRUNLSU5HKFtjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQgZnJvbSAkY29tcGlsZXIgb2JqZWN0XSkKK0FDX0NBQ0hFX1ZBTChbbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZV0sCitbCisjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KKyMgW1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyldCisKKyMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KK3N5bWNvZGU9J1tbQkNERUdSU1RdXScKKworIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCitzeW1wYXQ9J1woW1tfQS1aYS16XV1bW19BLVphLXowLTldXSpcKScKKworIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgorbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBpbnQgXDE7L3AnIgorCisjIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBzeW1ib2wgbmFtZSBhbmQgc3ltYm9sIGFkZHJlc3MKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbW14gXV0qXCkgJC8gIHtcXFwiXDFcXFwiLCAobHRfcHRyKSAwfSwvcCcgLWUgJ3MvXiRzeW1jb2RlIFwoW1teIF1dKlwpIFwoW1teIF1dKlwpJC8gIHtcIlwyXCIsIChsdF9wdHIpIFwmXDJ9LC9wJyIKKworIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeCopCisgIHN5bWNvZGU9J1tbQkNEVF1dJworICA7OworY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICBzeW1jb2RlPSdbW0FCQ0RHSVNUV11dJworICA7OworaHB1eCopICMgSXRzIGxpbmtlciBkaXN0aW5ndWlzaGVzIGRhdGEgZnJvbSBjb2RlIHN5bWJvbHMKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICBzeW1jb2RlPSdbW0FCQ0RFR1JTVF1dJworICBmaQorICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGludCBcMSgpOy9wJyAtZSAncy9eJHN5bWNvZGUqIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgorICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0ic2VkIC1uIC1lICdzL146IFwoW1teIF1dKlwpICQvICB7XFxcIlwxXFxcIiwgKGx0X3B0cikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbW14gXV0qXCkgXChbW14gXV0qXCkkLyAge1wiXDJcIiwgKGx0X3B0cikgXCZcMn0sL3AnIgorICA7OworbGludXgqKQorICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgIHN5bWNvZGU9J1tbQUJDREdJUlNUV11dJworICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gaW50IFwxKCk7L3AnIC1lICdzL14kc3ltY29kZSogLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9InNlZCAtbiAtZSAncy9eOiBcKFtbXiBdXSpcKSAkLyAge1xcXCJcMVxcXCIsIChsdF9wdHIpIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW1teIF1dKlwpIFwoW1teIF1dKlwpJC8gIHtcIlwyXCIsIChsdF9wdHIpIFwmXDJ9LC9wJyIKKyAgZmkKKyAgOzsKK2lyaXgqIHwgbm9uc3RvcHV4KikKKyAgc3ltY29kZT0nW1tCQ0RFR1JTVF1dJworICA7Oworb3NmKikKKyAgc3ltY29kZT0nW1tCQ0RFR1FSU1RdXScKKyAgOzsKK3NvbGFyaXMqKQorICBzeW1jb2RlPSdbW0JEUlRdXScKKyAgOzsKK3NjbzMuMnY1KikKKyAgc3ltY29kZT0nW1tEVF1dJworICA7Oworc3lzdjQuMnV3MiopCisgIHN5bWNvZGU9J1tbRFRdXScKKyAgOzsKK3N5c3Y1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCopCisgIHN5bWNvZGU9J1tbQUJEVF1dJworICA7Oworc3lzdjQpCisgIHN5bWNvZGU9J1tbREZOU1RVXV0nCisgIDs7Citlc2FjCisKKyMgSGFuZGxlIENSTEYgaW4gbWluZ3cgdG9vbCBjaGFpbgorb3B0X2NyPQorY2FzZSAkYnVpbGRfb3MgaW4KK21pbmd3KikKKyAgb3B0X2NyPWBlY2hvICd4XHswLDFcfScgfCB0ciB4ICdcMDE1J2AgIyBvcHRpb24gY3IgaW4gcmVnZXhwCisgIDs7Citlc2FjCisKKyMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgorY2FzZSBgJE5NIC1WIDI+JjFgIGluCisqR05VKiB8ICond2l0aCBCRkQnKikKKyAgc3ltY29kZT0nW1tBQkNER0lSU1RXXV0nIDs7Citlc2FjCisKKyMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCitmb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCisKKyAgIyBUcmFuc2Zvcm0gc3ltY29kZSwgc3ltcGF0LCBhbmQgc3ltcHJmeCBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KKyAgc3lteGZybT0iXFwxICRhY19zeW1wcmZ4XFwyIFxcMiIKKworICAjIFdyaXRlIHRoZSByYXcgYW5kIEMgaWRlbnRpZmllcnMuCisgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLipbWyAJXV1cKCRzeW1jb2RlJHN5bWNvZGUqXClbWyAJXV1bWyAJXV0qJGFjX3N5bXByZngkc3ltcGF0JG9wdF9jciQvJHN5bXhmcm0vcCciCisKKyAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCisgIHBpcGVfd29ya3M9bm8KKworICBybSAtZiBjb25mdGVzdCoKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorY2hhciBubV90ZXN0X3ZhcjsKK3ZvaWQgbm1fdGVzdF9mdW5jKCl7fQorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKK2ludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYygpO3JldHVybigwKTt9CitFT0YKKworICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgorICAgIG5saXN0PWNvbmZ0ZXN0Lm5tCisgICAgaWYgQUNfVFJZX0VWQUwoTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkbmxpc3QpICYmIHRlc3QgLXMgIiRubGlzdCI7IHRoZW4KKyAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCisgICAgICBpZiBzb3J0ICIkbmxpc3QiIHwgdW5pcSA+ICIkbmxpc3QiVDsgdGhlbgorCW12IC1mICIkbmxpc3QiVCAiJG5saXN0IgorICAgICAgZWxzZQorCXJtIC1mICIkbmxpc3QiVAorICAgICAgZmkKKworICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgorICAgICAgaWYgZ3JlcCAnIG5tX3Rlc3RfdmFyJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCWlmIGdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCisJICBjYXQgPDxFT0YgPiBjb25mdGVzdC4kYWNfZXh0CisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK0VPRgorCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgorCSAgZXZhbCAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IiB8IGdyZXAgLXYgbWFpbiA+PiBjb25mdGVzdC4kYWNfZXh0JworCisJICBjYXQgPDxFT0YgPj4gY29uZnRlc3QuJGFjX2V4dAorI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXworIyBkZWZpbmUgbHRfcHRyX3Qgdm9pZCAqCisjZWxzZQorIyBkZWZpbmUgbHRfcHRyX3QgY2hhciAqCisjIGRlZmluZSBjb25zdAorI2VuZGlmCisKKy8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLworY29uc3Qgc3RydWN0IHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgbHRfcHRyX3QgYWRkcmVzczsKK30KK2x0X3ByZWxvYWRlZF9zeW1ib2xzW1tdXSA9Cit7CitFT0YKKwkgICRTRUQgInMvXiRzeW1jb2RlJHN5bWNvZGUqIFwoLipcKSBcKC4qXCkkLyAge1wiXDJcIiwgKGx0X3B0cl90KSBcJlwyfSwvIiA8ICIkbmxpc3QiIHwgZ3JlcCAtdiBtYWluID4+IGNvbmZ0ZXN0LiRhY19leHQKKwkgIGNhdCA8PFxFT0YgPj4gY29uZnRlc3QuJGFjX2V4dAorICB7MCwgKGx0X3B0cl90KSAwfQorfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKK0VPRgorCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KKwkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRzdG0uJGFjX29iamV4dAorCSAgbHRfc2F2ZV9MSUJTPSIkTElCUyIKKwkgIGx0X3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorCSAgTElCUz0iY29uZnRzdG0uJGFjX29iamV4dCIKKwkgIENGTEFHUz0iJENGTEFHUyRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSkiCisJICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisJICAgIHBpcGVfd29ya3M9eWVzCisJICBmaQorCSAgTElCUz0iJGx0X3NhdmVfTElCUyIKKwkgIENGTEFHUz0iJGx0X3NhdmVfQ0ZMQUdTIgorCWVsc2UKKwkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkbmxpc3QiID4mQVNfTUVTU0FHRV9MT0dfRkQKKwlmaQorICAgICAgZWxzZQorCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRubGlzdCIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgZmkKKyAgICBlbHNlCisgICAgICBlY2hvICJjYW5ub3QgcnVuICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgZmkKKyAgZWxzZQorICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBmaQorICBybSAtZiBjb25mdGVzdCogY29uZnRzdCoKKworICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCisgIGlmIHRlc3QgIiRwaXBlX3dvcmtzIiA9IHllczsgdGhlbgorICAgIGJyZWFrCisgIGVsc2UKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQorICBmaQorZG9uZQorXSkKK2lmIHRlc3QgLXogIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0KK2ZpCitpZiB0ZXN0IC16ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCI7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVChmYWlsZWQpCitlbHNlCisgIEFDX01TR19SRVNVTFQob2spCitmaQorXSkgIyBBQ19MSUJUT09MX1NZU19HTE9CQUxfU1lNQk9MX1BJUEUKKworCisjIEFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDXSwKK1tfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0KK19MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KK19MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0KKworQUNfTVNHX0NIRUNLSU5HKFtmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQ10pCisgaWZlbHNlKFskMV0sW0NYWF0sWworICAjIEMrKyBzcGVjaWZpYyBjYXNlcyBmb3IgcGljLCBzdGF0aWMsIHdsLCBldGMuCisgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeCopCisgICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworICAgIGFtaWdhb3MqKQorICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAorICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCisgICAgICAjIGxpa2UgYC1tNjgwNDAnLgorICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCisgICAgICA7OworICAgIGJlb3MqIHwgY3lnd2luKiB8IGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCogfCBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KKyAgICAgIDs7CisgICAgbWluZ3cqIHwgb3MyKiB8IHB3MzIqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLURETExfRVhQT1JUJworICAgICAgOzsKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcworICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZm5vLWNvbW1vbicKKyAgICAgIDs7CisgICAgKmRqZ3BwKikKKyAgICAgICMgREpHUFAgZG9lcyBub3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzIGF0IGFsbAorICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQorICAgICAgOzsKKyAgICBpbnRlcml4MyopCisgICAgICAjIEludGVyaXggMy54IGdjYyAtZnBpYy8tZlBJQyBvcHRpb25zIGdlbmVyYXRlIGJyb2tlbiBjb2RlLgorICAgICAgIyBJbnN0ZWFkLCB3ZSByZWxvY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCisgICAgICA7OworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9LUtjb25mb3JtX3BpYworICAgICAgZmkKKyAgICAgIDs7CisgICAgaHB1eCopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKKyAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBocHBhKjY0KnxpYTY0KikKKwk7OworICAgICAgKikKKwlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworCTs7CisgICAgICBlc2FjCisgICAgICA7OworICAgICopCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworICAgICAgOzsKKyAgICBlc2FjCisgIGVsc2UKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXg0KiB8IGFpeDUqKQorCSMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKKwkgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJZWxzZQorCSAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCisJZmkKKwk7OworICAgICAgY2hvcnVzKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCWN4Y2g2OCopCisJICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgIyBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Ii0tbm9fYXV0b19pbnN0YW50aWF0aW9uIC11IF9fbWFpbiAtdSBfX3ByZW1haW4gLXUgX2Fib3J0IC1yICRDT09MX0RJUi9saWIvbGliT3JiLmEgJE1WTUVfRElSL2xpYi9DQy9saWJDLmEgJE1WTUVfRElSL2xpYi9jbGFzc2l4L2xpYmN4LnMuYSIKKwkgIDs7CisJZXNhYworCTs7CisgICAgICAgZGFyd2luKikKKyAgICAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgIHhsYyopCisgICAgICAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXFub2NvbW1vbicKKyAgICAgICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICAgICAgIDs7CisgICAgICAgICBlc2FjCisgICAgICAgOzsKKyAgICAgIGRndXgqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBlYysrKikKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgICAgOzsKKwkgIGdoY3gqKQorCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgZnJlZWJzZCogfCBrZnJlZWJzZCotZ251IHwgZHJhZ29uZmx5KikKKwkjIEZyZWVCU0QgdXNlcyBHTlUgQysrCisJOzsKKyAgICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJworCSAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KKwkgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9JytaJworCSAgICBmaQorCSAgICA7OworCSAgYUNDKikKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisJICAgIGNhc2UgJGhvc3RfY3B1IGluCisJICAgIGhwcGEqNjQqfGlhNjQqKQorCSAgICAgICMgK1ogdGhlIGRlZmF1bHQKKwkgICAgICA7OworCSAgICAqKQorCSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nK1onCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGludGVyaXgqKQorCSMgVGhpcyBpcyBjODksIHdoaWNoIGlzIE1TIFZpc3VhbCBDKysgKG5vIHNoYXJlZCBsaWJzKQorCSMgQW55b25lIHdhbnRzIHRvIGRvIGEgcG9ydD8KKwk7OworICAgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MqKQorCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKwkgICAgIyBDQyBwaWMgZmxhZyAtS1BJQyBpcyB0aGUgZGVmYXVsdC4KKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBsaW51eCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIEtDQyopCisJICAgICMgS0FJIEMrKyBDb21waWxlcgorCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLS1iYWNrZW5kIC1XbCwnCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisJICAgIDs7CisJICBpY3BjKiB8IGVjcGMqKQorCSAgICAjIEludGVsIEMrKworCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworCSAgICA7OworCSAgcGdDQyopCisJICAgICMgUG9ydGxhbmQgR3JvdXAgQysrIGNvbXBpbGVyLgorCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZnBpYycKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwkgICAgOzsKKwkgIGN4eCopCisJICAgICMgQ29tcGFxIEMrKworCSAgICAjIE1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgaXMgZW1wdHkuICBJdCBhcHBlYXJzIHRoYXQgYWxsIEFscGhhCisJICAgICMgTGludXggYW5kIENvbXBhcSBUcnU2NCBVbml4IG9iamVjdHMgYXJlIFBJQy4KKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQorCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGx5bnhvcyopCisJOzsKKyAgICAgIG04OGsqKQorCTs7CisgICAgICBtdnMqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBjeHgqKQorCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1XIGMsZXhwb3J0YWxsJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIG5ldGJzZCopCisJOzsKKyAgICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgS0NDKikKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy0tYmFja2VuZCAtV2wsJworCSAgICA7OworCSAgUkNDKikKKwkgICAgIyBSYXRpb25hbCBDKysgMi40LjEKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJworCSAgICA7OworCSAgY3h4KikKKwkgICAgIyBEaWdpdGFsL0NvbXBhcSBDKysKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgICMgTWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBpcyBlbXB0eS4gIEl0IGFwcGVhcnMgdGhhdCBhbGwgQWxwaGEKKwkgICAgIyBMaW51eCBhbmQgQ29tcGFxIFRydTY0IFVuaXggb2JqZWN0cyBhcmUgUElDLgorCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgcHNvcyopCisJOzsKKyAgICAgIHNvbGFyaXMqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgICMgU3VuIEMrKyA0LjIsIDUueCBhbmQgQ2VudGVybGluZSBDKysKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1Rb3B0aW9uIGxkICcKKwkgICAgOzsKKwkgIGdjeCopCisJICAgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLVBJQycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBzdW5vczQqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgICMgU3VuIEMrKyA0LngKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJworCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgICA7OworCSAgbGNjKikKKwkgICAgIyBMdWNpZAorCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgdGFuZGVtKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgTkNDKikKKwkgICAgIyBOb25TdG9wLVVYIE5DQyAzLjIwCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgc3lzdjUqIHwgdW5peHdhcmUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IE9wZW5VTklYKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MqKQorCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHZ4d29ya3MqKQorCTs7CisgICAgICAqKQorCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkLCAkMSk9bm8KKwk7OworICAgIGVzYWMKKyAgZmkKK10sCitbCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4KikKKyAgICAgICMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKKwlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAorICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JworICAgICAgOzsKKworICAgIGJlb3MqIHwgY3lnd2luKiB8IGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCogfCBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KKyAgICAgIDs7CisKKyAgICBtaW5ndyogfCBwdzMyKiB8IG9zMiopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctRERMTF9FWFBPUlQnCisgICAgICA7OworCisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZuby1jb21tb24nCisgICAgICA7OworCisgICAgaW50ZXJpeDMqKQorICAgICAgIyBJbnRlcml4IDMueCBnY2MgLWZwaWMvLWZQSUMgb3B0aW9ucyBnZW5lcmF0ZSBicm9rZW4gY29kZS4KKyAgICAgICMgSW5zdGVhZCwgd2UgcmVsb2NhdGUgc2hhcmVkIGxpYnJhcmllcyBhdCBydW50aW1lLgorICAgICAgOzsKKworICAgIG1zZG9zZGpncHAqKQorICAgICAgIyBKdXN0IGJlY2F1c2Ugd2UgdXNlIEdDQyBkb2Vzbid0IG1lYW4gd2Ugc3VkZGVubHkgZ2V0IHNoYXJlZCBsaWJyYXJpZXMKKyAgICAgICMgb24gc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgdGhlbS4KKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkLCAkMSk9bm8KKyAgICAgIGVuYWJsZV9zaGFyZWQ9bm8KKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPS1LY29uZm9ybV9waWMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgaHB1eCopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKKyAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBocHBhKjY0KnxpYTY0KikKKwkjICtaIHRoZSBkZWZhdWx0CisJOzsKKyAgICAgICopCisJX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgICopCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworICAgICAgOzsKKyAgICBlc2FjCisgIGVsc2UKKyAgICAjIFBPUlRNRSBDaGVjayBmb3IgZmxhZyB0byBwYXNzIGxpbmtlciBmbGFncyB0aHJvdWdoIHRoZSBzeXN0ZW0gY29tcGlsZXIuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeCopCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKKwlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgZWxzZQorCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJworICAgICAgZmkKKyAgICAgIDs7CisgICAgICBkYXJ3aW4qKQorICAgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCisgICAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgeGxjKikKKyAgICAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXFub2NvbW1vbicKKyAgICAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgICAgOzsKKyAgICAgICBlc2FjCisgICAgICAgOzsKKworICAgIG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1ERExMX0VYUE9SVCcKKyAgICAgIDs7CisKKyAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwgYnV0CisgICAgICAjIG5vdCBmb3IgUEEgSFAtVVguCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCp8aWE2NCopCisJIyArWiB0aGUgZGVmYXVsdAorCTs7CisgICAgICAqKQorCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nK1onCisJOzsKKyAgICAgIGVzYWMKKyAgICAgICMgSXMgdGhlcmUgYSBiZXR0ZXIgbHRfcHJvZ19jb21waWxlcl9zdGF0aWMgdGhhdCB3b3JrcyB3aXRoIHRoZSBidW5kbGVkIENDPworICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPScke3dsfS1hICR7d2x9YXJjaGl2ZScKKyAgICAgIDs7CisKKyAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICAjIFBJQyAod2l0aCAtS1BJQykgaXMgdGhlIGRlZmF1bHQuCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJworICAgICAgOzsKKworICAgIG5ld3NvczYpCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBsaW51eCopCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgaWNjKiB8IGVjYyopCisJX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCisgICAgICAgIDs7CisgICAgICBwZ2NjKiB8IHBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KikKKyAgICAgICAgIyBQb3J0bGFuZCBHcm91cCBjb21waWxlcnMgKCpub3QqIHRoZSBQZW50aXVtIGdjYyBjb21waWxlciwKKwkjIHdoaWNoIGxvb2tzIHRvIGJlIGEgZGVhZCBwcm9qZWN0KQorCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZwaWMnCisJX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgICAgOzsKKyAgICAgIGNjYyopCisgICAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgICAjIEFsbCBBbHBoYSBjb2RlIGlzIFBJQy4KKyAgICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgICMgQWxsIE9TRi8xIGNvZGUgaXMgUElDLgorICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIGY3NyogfCBmOTAqIHwgZjk1KikKKwlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJzs7CisgICAgICAqKQorCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJzs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctUW9wdGlvbiBsZCAnCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1QSUMnCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKikKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgorCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtjb25mb3JtX3BpYycKKwlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQorICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICB1bmljb3MqKQorICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCisgICAgICA7OworCisgICAgdXRzNCopCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgICopCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKK10pCitBQ19NU0dfUkVTVUxUKFskX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpXSkKKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIworaWYgdGVzdCAtbiAiJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSI7IHRoZW4KKyAgQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT04oW2lmICRjb21waWxlciBQSUMgZmxhZyAkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIHdvcmtzXSwKKyAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzLCAkMSksCisgICAgWyRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSlpZmVsc2UoWyQxXSxbXSxbIC1EUElDXSxbaWZlbHNlKFskMV0sW0NYWF0sWyAtRFBJQ10sW10pXSldLCBbXSwKKyAgICBbY2FzZSAkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIGluCisgICAgICIiIHwgIiAiKikgOzsKKyAgICAgKikgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSIgJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSIgOzsKKyAgICAgZXNhY10sCisgICAgW19MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKyAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ub10pCitmaQorY2FzZSAkaG9zdF9vcyBpbgorICAjIEZvciBwbGF0Zm9ybXMgd2hpY2ggZG8gbm90IHN1cHBvcnQgUElDLCAtRFBJQyBpcyBtZWFuaW5nbGVzczoKKyAgKmRqZ3BwKikKKyAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CisgICAgOzsKKyAgKikKKyAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9IiRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSlpZmVsc2UoWyQxXSxbXSxbIC1EUElDXSxbaWZlbHNlKFskMV0sW0NYWF0sWyAtRFBJQ10sW10pXSkiCisgICAgOzsKK2VzYWMKKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHN0YXRpYyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIword2w9JF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpIGV2YWwgbHRfdG1wX3N0YXRpY19mbGFnPVwiJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKVwiCitBQ19MSUJUT09MX0xJTktFUl9PUFRJT04oW2lmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzXSwKKyAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3JrcywgJDEpLAorICAkbHRfdG1wX3N0YXRpY19mbGFnLAorICBbXSwKKyAgW19MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT1dKQorXSkKKworCisjIEFDX0xJQlRPT0xfUFJPR19MRF9TSExJQlMoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2VlIGlmIHRoZSBsaW5rZXIgc3VwcG9ydHMgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KK0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTXSwKK1tBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCitpZmVsc2UoWyQxXSxbQ1hYXSxbCisgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4NCogfCBhaXg1KikKKyAgICAjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB3ZSBkb24ndCB3YW50IHRoZSAiLUMiIG9wdGlvbi4KKyAgICAjIC1DIG1lYW5zIGRlbWFuZ2xlIHRvIEFJWCBubSwgYnV0IG1lYW5zIGRvbid0IGRlbWFuZ2xlIHdpdGggR05VIG5tCisgICAgaWYgJE5NIC1WIDI+JjEgfCBncmVwICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NIC1CcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFxbJF0yID09ICJUIikgfHwgKFxbJF0yID09ICJEIikgfHwgKFxbJF0yID09ICJCIikpICYmIChbc3Vic3RyXShcWyRdMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXFskXTMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisgICAgZWxzZQorICAgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQkNwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXFskXTIgPT0gIlQiKSB8fCAoXFskXTIgPT0gIkQiKSB8fCAoXFskXTIgPT0gIkIiKSkgJiYgKFtzdWJzdHJdKFxbJF0zLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcWyRdMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKyAgICBmaQorICAgIDs7CisgIHB3MzIqKQorICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSIkbHRkbGxfY21kcyIKKyAgOzsKKyAgY3lnd2luKiB8IG1pbmd3KikKKyAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltbQkNER1JTXV0gL3MvLiogXChbW14gXV0qXCkvXDEgREFUQS87L14uKiBfX25tX18vcy9eLiogX19ubV9fXChbW14gXV0qXCkgW1teIF1dKi9cMSBEQVRBLzsvXkkgL2Q7L15bW0FJVFddXSAvcy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgOzsKKyAgKikKKyAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICA7OworICBlc2FjCitdLFsKKyAgcnVucGF0aF92YXI9CisgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KKyAgX0xUX0FDX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9bm8KKyAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0KKyAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9CisgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kcywgJDEpPQorICBfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzLCAkMSk9CisgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9CisgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KKyAgX0xUX0FDX1RBR1ZBUih0aHJlYWRfc2FmZV9mbGFnX3NwZWMsICQxKT0KKyAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9CisgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPQorICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KKyAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT1ubworICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT11bnN1cHBvcnRlZAorICBfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT11bmtub3duCisgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9bm8KKyAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQorICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPQorICBfTFRfQUNfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCisgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgICMgaW5jbHVkZV9leHBzeW1zIHNob3VsZCBiZSBhIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIHN5bWJvbHMgdG8gYmUgKmFsd2F5cyoKKyAgIyBpbmNsdWRlZCBpbiB0aGUgc3ltYm9sIGxpc3QKKyAgX0xUX0FDX1RBR1ZBUihpbmNsdWRlX2V4cHN5bXMsICQxKT0KKyAgIyBleGNsdWRlX2V4cHN5bXMgY2FuIGJlIGFuIGV4dGVuZGVkIHJlZ2V4cCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUKKyAgIyBpdCB3aWxsIGJlIHdyYXBwZWQgYnkgYCAoJyBhbmQgYCkkJywgc28gb25lIG11c3Qgbm90IG1hdGNoIGJlZ2lubmluZyBvcgorICAjIGVuZCBvZiBsaW5lLiAgRXhhbXBsZTogYGF8YmN8LipkLionIHdpbGwgZXhjbHVkZSB0aGUgc3ltYm9scyBgYScgYW5kIGBiYycsCisgICMgYXMgd2VsbCBhcyBhbnkgc3ltYm9sIHRoYXQgY29udGFpbnMgYGQnLgorICBfTFRfQUNfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpPSJfR0xPQkFMX09GRlNFVF9UQUJMRV8iCisgICMgQWx0aG91Z2ggX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGlzIGEgdmFsaWQgc3ltYm9sIEMgbmFtZSwgbW9zdCBhLm91dAorICAjIHBsYXRmb3JtcyAoYWIpdXNlIGl0IGluIFBJQyBjb2RlLCBidXQgdGhlaXIgbGlua2VycyBnZXQgY29uZnVzZWQgaWYKKyAgIyB0aGUgc3ltYm9sIGlzIGV4cGxpY2l0bHkgcmVmZXJlbmNlZC4gIFNpbmNlIHBvcnRhYmxlIGNvZGUgY2Fubm90CisgICMgcmVseSBvbiB0aGlzIHN5bWJvbCBuYW1lLCBpdCdzIHByb2JhYmx5IGZpbmUgdG8gbmV2ZXIgaW5jbHVkZSBpdCBpbgorICAjIHByZWxvYWRlZCBzeW1ib2wgdGFibGVzLgorICBleHRyYWN0X2V4cHN5bXNfY21kcz0KKyAgIyBKdXN0IGJlaW5nIHBhcmFub2lkIGFib3V0IGVuc3VyaW5nIHRoYXQgY2NfYmFzZW5hbWUgaXMgc2V0LgorICBfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICAgICMgRklYTUU6IHRoZSBNU1ZDKysgcG9ydCBoYXNuJ3QgYmVlbiB0ZXN0ZWQgaW4gYSBsb29vb25nIHRpbWUKKyAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZworICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCisgICAgaWYgdGVzdCAiJEdDQyIgIT0geWVzOyB0aGVuCisgICAgICB3aXRoX2dudV9sZD1ubworICAgIGZpCisgICAgOzsKKyAgaW50ZXJpeCopCisgICAgIyB3ZSBqdXN0IGhvcGUvYXNzdW1lIHRoaXMgaXMgZ2NjIGFuZCBub3QgYzg5ICg9IE1TVkMrKykKKyAgICB3aXRoX2dudV9sZD15ZXMKKyAgICA7OworICBvcGVuYnNkKikKKyAgICB3aXRoX2dudV9sZD1ubworICAgIDs7CisgIGVzYWMKKworICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgIyBJZiBhcmNoaXZlX2NtZHMgcnVucyBMRCwgbm90IENDLCB3bGFyYyBzaG91bGQgYmUgZW1wdHkKKyAgICB3bGFyYz0nJHt3bH0nCisKKyAgICAjIFNldCBzb21lIGRlZmF1bHRzIGZvciBHTlUgbGQgd2l0aCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LiBUaGVzZQorICAgICMgYXJlIHJlc2V0IGxhdGVyIGlmIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIFB1dHRpbmcgdGhlbQorICAgICMgaGVyZSBhbGxvd3MgdGhlbSB0byBiZSBvdmVycmlkZGVuIGlmIG5lY2Vzc2FyeS4KKyAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJworICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKyAgICAjIGFuY2llbnQgR05VIGxkIGRpZG4ndCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCisgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KKwlfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisgICAgICBlbHNlCisgIAlfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CisgICAgZmkKKyAgICBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9bm8KKyAgICBjYXNlIGAkTEQgLXYgMj4vZGV2L251bGxgIGluCisgICAgICAqXCBbWzAxXV0uKiB8ICpcIDIuW1swLTldXS4qIHwgKlwgMi4xMC4qKSA7OyAjIGNhdGNoIHZlcnNpb25zIDwgMi4xMQorICAgICAgKlwgMi4xMS45My4wLjJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBSSDcuMyAuLi4KKyAgICAgICpcIDIuMTEuOTIuMC4xMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIE1hbmRyYWtlIDguMiAuLi4KKyAgICAgICpcIDIuMTEuKikgOzsgIyBvdGhlciAyLjExIHZlcnNpb25zCisgICAgICAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7CisgICAgZXNhYworCisgICAgIyBTZWUgaWYgR05VIGxkIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeDMqIHwgYWl4NCogfCBhaXg1KikKKyAgICAgICMgT24gQUlYL1BQQywgdGhlIEdOVSBsaW5rZXIgaXMgdmVyeSBicm9rZW4KKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgorCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwljYXQgPDxFT0YgMT4mMgorCisqKiogV2FybmluZzogdGhlIEdOVSBsaW5rZXIsIGF0IGxlYXN0IHVwIHRvIHJlbGVhc2UgMi45LjEsIGlzIHJlcG9ydGVkCisqKiogdG8gYmUgdW5hYmxlIHRvIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIEFJWC4KKyoqKiBUaGVyZWZvcmUsIGxpYnRvb2wgaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIElmIHlvdQorKioqIHJlYWxseSBjYXJlIGZvciBzaGFyZWQgbGlicmFyaWVzLCB5b3UgbWF5IHdhbnQgdG8gbW9kaWZ5IHlvdXIgUEFUSAorKioqIHNvIHRoYXQgYSBub24tR05VIGxpbmtlciBpcyBmb3VuZCwgYW5kIHRoZW4gcmVzdGFydC4KKworRU9GCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJHJtICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKworICAgICAgIyBTYW11ZWwgQS4gRmFsdm8gSUkgPGtjNXRqYUBkb2xwaGluLm9wZW5wcm9qZWN0cy5uZXQ+IHJlcG9ydHMKKyAgICAgICMgdGhhdCB0aGUgc2VtYW50aWNzIG9mIGR5bmFtaWMgbGlicmFyaWVzIG9uIEFtaWdhT1MsIGF0IGxlYXN0IHVwCisgICAgICAjIHRvIHZlcnNpb24gNCwgaXMgdG8gc2hhcmUgZGF0YSBhbW9uZyBtdWx0aXBsZSBwcm9ncmFtcyBsaW5rZWQKKyAgICAgICMgd2l0aCB0aGUgc2FtZSBkeW5hbWljIGxpYnJhcnkuICBTaW5jZSB0aGlzIGRvZXNuJ3QgbWF0Y2ggdGhlCisgICAgICAjIGJlaGF2aW9yIG9mIHNoYXJlZCBsaWJyYXJpZXMgb24gb3RoZXIgcGxhdGZvcm1zLCB3ZSBjYW4ndCB1c2UKKyAgICAgICMgdGhlbS4KKyAgICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICBiZW9zKikKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorCSMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKKwkjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICAgICAgIyBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKSBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywKKyAgICAgICMgYXMgdGhlcmUgaXMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisgICAgICBfTFRfQUNfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCisgICAgICBfTFRfQUNfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW1tCQ0RHUlNdXSAvcy8uKiBcKFtbXiBdXSpcKS9cMSBEQVRBLydcJycgfCAkU0VEIC1lICdcJycvXltbQUlUV11dIC9zLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisJIyBJZiB0aGUgZXhwb3J0LXN5bWJvbHMgZmlsZSBhbHJlYWR5IGlzIGEgLmRlZiBmaWxlICgxc3QgbGluZQorCSMgaXMgRVhQT1JUUyksIHVzZSBpdCBhcyBpczsgb3RoZXJ3aXNlLCBwcmVwZW5kLi4uCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICBjcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJZWxzZQorCSAgZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJICBjYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCWZpfgorCSRDQyAtc2hhcmVkICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworICAgICAgZWxzZQorCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgaW50ZXJpeDMqKQorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworICAgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKyAgICAgICMgSGFjazogT24gSW50ZXJpeCAzLngsIHdlIGNhbm5vdCBjb21waWxlIFBJQyBiZWNhdXNlIG9mIGEgYnJva2VuIGdjYy4KKyAgICAgICMgSW5zdGVhZCwgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGF0IGFuIGltYWdlIGJhc2UgKDB4MTAwMDAwMDAgYnkKKyAgICAgICMgZGVmYXVsdCkgYW5kIHJlbG9jYXRlZCBpZiB0aGV5IGNvbmZsaWN0LCB3aGljaCBpcyBhIHNsb3cgdmVyeSBtZW1vcnkKKyAgICAgICMgY29uc3VtaW5nIGFuZCBmcmFnbWVudGluZyBwcm9jZXNzLiAgVG8gYXZvaWQgdGhpcywgd2UgcGljayBhIHJhbmRvbSwKKyAgICAgICMgMjU2IEtpQi1hbGlnbmVkIGltYWdlIGJhc2UgYmV0d2VlbiAweDUwMDAwMDAwIGFuZCAweDZGRkMwMDAwIGF0IGxpbmsKKyAgICAgICMgdGltZS4gIE1vdmluZyB1cCBmcm9tIDB4MTAwMDAwMDAgYWxzbyBhbGxvd3MgbW9yZSBzYnJrKDIpIHNwYWNlLgorICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworICAgICAgOzsKKworICAgIGxpbnV4KikKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCXRtcF9hZGRmbGFnPQorCWNhc2UgJGNjX2Jhc2VuYW1lLCRob3N0X2NwdSBpbgorCXBnY2MqKQkJCQkjIFBvcnRsYW5kIEdyb3VwIEMgY29tcGlsZXIKKwkgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcnCisJICA7OworCXBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KikJIyBQb3J0bGFuZCBHcm91cCBmNzcgYW5kIGY5MCBjb21waWxlcnMKKwkgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcgLU1ub21haW4nIDs7CisJZWNjKixpYTY0KiB8IGljYyosaWE2NCopCQkjIEludGVsIEMgY29tcGlsZXIgb24gaWE2NAorCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljJyA7OworCWVmYyosaWE2NCogfCBpZm9ydCosaWE2NCopCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlciBvbiBpYTY0CisJICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMgLW5vZm9yX21haW4nIDs7CisJaWZjKiB8IGlmb3J0KikJCQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIKKwkgIHRtcF9hZGRmbGFnPScgLW5vZm9yX21haW4nIDs7CisJZXNhYworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJyIkdG1wX2FkZGZsYWciJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKworCWlmIHRlc3QgJHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyA9IHllczsgdGhlbgorCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorICBjYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisgICRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICRDQyAtc2hhcmVkJyIkdG1wX2FkZGZsYWciJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tdmVyc2lvbi1zY3JpcHQgJHt3bH0kb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKKwlmaQorICAgICAgZWxzZQorCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgbmV0YnNkKikKKyAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbyAkbGliJworCXdsYXJjPQorICAgICAgZWxzZQorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBpZiAkTEQgLXYgMj4mMSB8IGdyZXAgJ0JGRCAyXC44JyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwljYXQgPDxFT0YgMT4mMgorCisqKiogV2FybmluZzogVGhlIHJlbGVhc2VzIDIuOC4qIG9mIHRoZSBHTlUgbGlua2VyIGNhbm5vdCByZWxpYWJseQorKioqIGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNvbGFyaXMgc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAorKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQorKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi45LjEgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKKyoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCisqKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KKworRU9GCisgICAgICBlbGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCopCisgICAgICBjYXNlIGAkTEQgLXYgMj4mMWAgaW4KKyAgICAgICAgKlwgW1swMV1dLiogfCAqXCAyLltbMC05XV0uKiB8ICpcIDIuMVtbMC01XV0uKikgCisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCWNhdCA8PF9MVF9FT0YgMT4mMgorCisqKiogV2FybmluZzogUmVsZWFzZXMgb2YgdGhlIEdOVSBsaW5rZXIgcHJpb3IgdG8gMi4xNi45MS4wLjMgY2FuIG5vdAorKioqIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNDTyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCisqKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCisqKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjE2LjkxLjAuMyBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQorKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKKyoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgorCitfTFRfRU9GCisJOzsKKwkqKQorCSAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSdgdGVzdCAteiAiJFNDT0FCU1BBVEgiICYmIGVjaG8gJHt3bH0tcnBhdGgsJGxpYmRpcmAnCisJICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYicKKwkgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUsLXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJICBlbHNlCisJICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgIGZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIHdsYXJjPQorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgKikKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0ICIkX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKSIgPSBubzsgdGhlbgorICAgICAgcnVucGF0aF92YXI9CisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KKyAgICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9CisgICAgICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CisgICAgZmkKKyAgZWxzZQorICAgICMgUE9SVE1FIGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIGxpbmtlciAobm90IEdOVSBsZCkKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4MyopCisgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKyAgICAgIF9MVF9BQ19UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJExEIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtYkU6JGV4cG9ydF9zeW1ib2xzIC1UNTEyIC1INTEyIC1iTTpTUkV+JEFSICRBUl9GTEFHUyAkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisgICAgICAjIE5vdGU6IHRoaXMgbGlua2VyIGhhcmRjb2RlcyB0aGUgZGlyZWN0b3JpZXMgaW4gTElCUEFUSCBpZiB0aGVyZQorICAgICAgIyBhcmUgbm8gZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IC1MLgorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0IC16ICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWMiOyB0aGVuCisJIyBOZWl0aGVyIGRpcmVjdCBoYXJkY29kaW5nIG5vciBzdGF0aWMgbGlua2luZyBpcyBzdXBwb3J0ZWQgd2l0aCBhCisJIyBicm9rZW4gY29sbGVjdDIuCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT11bnN1cHBvcnRlZAorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhaXg0KiB8IGFpeDUqKQorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0CisJIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisJYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCWV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCisJbm9fZW50cnlfZmxhZz0iIgorICAgICAgZWxzZQorCSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgorCSMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KKwlpZiAkTk0gLVYgMj4mMSB8IGdyZXAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KKwkgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXFskXTIgPT0gIlQiKSB8fCAoXFskXTIgPT0gIkQiKSB8fCAoXFskXTIgPT0gIkIiKSkgJiYgKFtzdWJzdHJdKFxbJF0zLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcWyRdMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKwllbHNlCisJICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NIC1CQ3BnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcWyRdMiA9PSAiVCIpIHx8IChcWyRdMiA9PSAiRCIpIHx8IChcWyRdMiA9PSAiQiIpKSAmJiAoW3N1YnN0cl0oXFskXTMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFxbJF0zIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWZpCisJYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCisJIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCisJIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCisJIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KKwljYXNlICRob3N0X29zIGluIGFpeDQuW1syM11dfGFpeDQuW1syM11dLip8YWl4NSopCisJICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KKyAgCSAgaWYgKHRlc3QgJGxkX2ZsYWcgPSAiLWJydGwiIHx8IHRlc3QgJGxkX2ZsYWcgPSAiLVdsLC1icnRsIik7IHRoZW4KKyAgCSAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcworICAJICAgIGJyZWFrCisgIAkgIGZpCisJICBkb25lCisJICA7OworCWVzYWMKKworCWV4cF9zeW1fZmxhZz0nLWJleHBvcnQnCisJbm9fZW50cnlfZmxhZz0nLWJub2VudHJ5JworICAgICAgZmkKKworICAgICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgorICAgICAgIyBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIElmIGxpbmtpbmcgYSBsaWJyYXJ5CisgICAgICAjIG9yIHByb2dyYW0gcmVzdWx0cyBpbiAiZXJyb3IgVE9DIG92ZXJmbG93IiBhZGQgLW1taW5pbWFsLXRvYyB0bworICAgICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKKyAgICAgICMgZW5vdWdoIHRvIGZpeCB0aGUgcHJvYmxlbSwgYWRkIC1XbCwtYmJpZ3RvYyB0byBMREZMQUdTLgorCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPScnCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9JzonCisgICAgICBfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwljYXNlICRob3N0X29zIGluIGFpeDQuW1swMTJdXXxhaXg0LltbMDEyXV0uKikKKwkjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKKwkjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKKwkgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKwkgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmIFwKKyAgCSAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgZ3JlcCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKKwkgIHRoZW4KKyAgCSAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCisgIAkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisJICBlbHNlCisgIAkgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKKyAgCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT11bnN1cHBvcnRlZAorICAJICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCisgIAkgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCisgIAkgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZworICAJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CisJICBmaQorCSAgOzsKKwllc2FjCisJc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCisJaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKKwlmaQorICAgICAgZWxzZQorCSMgbm90IHVzaW5nIGdjYworCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgIAkjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQorICAJIyBjaG9rZXMgb24gLVdsLC1HLiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgY29ycmVjdDoKKwkgIHNoYXJlZF9mbGFnPSctRycKKwllbHNlCisJICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LUcnCisJICBlbHNlCisJICAgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCisJICBmaQorCWZpCisgICAgICBmaQorCisgICAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgZG9lcyBub3QgZXhwb3J0IHN5bWJvbHMgYmVnaW5uaW5nIHdpdGgKKyAgICAgICMgdW5kZXJzY29yZSAoXyksIHNvIGl0IGlzIGJldHRlciB0byBnZW5lcmF0ZSBhIGxpc3Qgb2Ygc3ltYm9scyB0byBleHBvcnQuCisgICAgICBfTFRfQUNfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPXllcworICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCisJIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCV9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nLWJlcm9rJworICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgorICAgICAgIF9MVF9BQ19TWVNfTElCUEFUSF9BSVgKKyAgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZWNobyAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKKyAgICAgICBlbHNlCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKKwkgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0iLXogbm9kZWZzIgorCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzICR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiCisJZWxzZQorCSAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KKwkgX0xUX0FDX1NZU19MSUJQQVRIX0FJWAorCSBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKwkgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1biB0aW1lIGxvYWRpbmcgZmxhZ3MsCisJICAjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisJICBfTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1iZXJub3RvaycKKwkgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWJlcm9rJworCSAgIyBFeHBvcnRlZCBzeW1ib2xzIGNhbiBiZSBwdWxsZWQgaW50byBzaGFyZWQgb2JqZWN0cyBmcm9tIGFyY2hpdmVzCisJICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyRjb252ZW5pZW5jZScKKwkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT15ZXMKKwkgICMgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBBSVggdHJhZGl0aW9uYWxseSBidWlsZHMgaXRzIHNoYXJlZCBsaWJyYXJpZXMuCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICR7d2x9LWJub2VudHJ5ICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJworCWZpCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJHJtICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgZGlmZmVyZW50IHNlbWFudGljcyBvbiB0aGUgR05VIGxkIHNlY3Rpb24KKyAgICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICBic2RpW1s0NV1dKikKKyAgICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9LXJkeW5hbWljCisgICAgICA7OworCisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICAgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCisgICAgICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCisgICAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyAnCisgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKyAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCisgICAgICBsaWJleHQ9bGliCisgICAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KKyAgICAgIHNocmV4dF9jbWRzPSIuZGxsIgorICAgICAgIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgorICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1vICRsaWIgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzIGBlY2hvICIkZGVwbGlicyIgfCAkU0VEIC1lICdcJydzLyAtbGMkLy8nXCcnYCAtbGluayAtZGxsfmxpbmtuYW1lcz0nCisgICAgICAjIFRoZSBsaW5rZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgLmxpYiBmaWxlIGlmIHdlIGJ1aWxkIGEgRExMLgorICAgICAgX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzLCAkMSk9J3RydWUnCisgICAgICAjIEZJWE1FOiBTaG91bGQgbGV0IHRoZSB1c2VyIHNwZWNpZnkgdGhlIGxpYiBwcm9ncmFtLgorICAgICAgX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9J2xpYiAvT1VUOiRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicycKKyAgICAgIF9MVF9BQ19UQUdWQVIoZml4X3NyY2ZpbGVfcGF0aCwgJDEpPSdgY3lncGF0aCAtdyAiJHNyY2ZpbGUiYCcKKyAgICAgIF9MVF9BQ19UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPXllcworICAgICAgOzsKKworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuW1swMTJdXSkKKyAgICAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCisgICAgICAgICA7OworICAgICAgICopICMgRGFyd2luIDEuMyBvbgorICAgICAgICAgaWYgdGVzdCAteiAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gOyB0aGVuCisgICAgICAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCisgICAgICAgICBlbHNlCisgICAgICAgICAgIGNhc2UgJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IGluCisgICAgICAgICAgICAgMTAuW1swMTJdXSkKKyAgICAgICAgICAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCisgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgIDEwLiopCisgICAgICAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXVuZGVmaW5lZCAke3dsfWR5bmFtaWNfbG9va3VwJworICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgZXNhYworICAgICAgICAgZmkKKyAgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9eWVzCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT11bnN1cHBvcnRlZAorICAgICAgX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScnCisgICAgICBfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyA7IHRoZW4KKyAgICAJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCisgICAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJworICAgICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPSckQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFncycKKyAgICAgICMgRG9uJ3QgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGxkIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgZmxhZywgaXQgZG9lc24ndCBleGlzdCBpbiBvbGRlciBkYXJ3aW4gbGRzCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLWR5bmFtaWNsaWIgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFnc35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgZWxzZQorICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgeGxjKikKKyAgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJworICAgICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1xbWtzaHJvYmogJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWluc3RhbGxfbmFtZSAke3dsfWBlY2hvICRycGF0aC8kc29uYW1lYCAkdmVyc3RyaW5nJworICAgICAgICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPSckQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFncycKKyAgICAgICAgICAjIERvbid0IGZpeCB0aGlzIGJ5IHVzaW5nIHRoZSBsZCAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGZsYWcsIGl0IGRvZXNuJ3QgZXhpc3QgaW4gb2xkZXIgZGFyd2luIGxkcworICAgICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1xbWtzaHJvYmogJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWluc3RhbGxfbmFtZSAke3dsfSRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDICRhbGxvd191bmRlZmluZWRfZmxhZyAgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICAgICAgICA7OworICAgICAgICopCisgICAgICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICAgICAgOzsKKworICAgIGRndXgqKQorICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgZnJlZWJzZDEqKQorICAgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgOzsKKworICAgICMgRnJlZUJTRCAyLjIuWzAxMl0gYWxsb3dzIHVzIHRvIGluY2x1ZGUgYysrcnQwLm8gdG8gZ2V0IEMrKyBjb25zdHJ1Y3RvcgorICAgICMgc3VwcG9ydC4gIEZ1dHVyZSB2ZXJzaW9ucyBkbyB0aGlzIGF1dG9tYXRpY2FsbHksIGJ1dCBhbiBleHBsaWNpdCBjKytydDAubworICAgICMgZG9lcyBub3QgYnJlYWsgYW55dGhpbmcsIGFuZCBoZWxwcyBzaWduaWZpY2FudGx5IChhdCB0aGUgY29zdCBvZiBhIGxpdHRsZQorICAgICMgZXh0cmEgc3BhY2UpLgorICAgIGZyZWVic2QyLjIqKQorICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAvdXNyL2xpYi9jKytydDAubycKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAjIFVuZm9ydHVuYXRlbHksIG9sZGVyIHZlcnNpb25zIG9mIEZyZWVCU0QgMiBkbyBub3QgaGF2ZSB0aGlzIGZlYXR1cmUuCisgICAgZnJlZWJzZDIqKQorICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgIyBGcmVlQlNEIDMgYW5kIGdyZWF0ZXIgdXNlcyBnY2MgLXNoYXJlZCB0byBkbyBzaGFyZWQgbGlicmFyaWVzLgorICAgIGZyZWVic2QqIHwga2ZyZWVic2QqLWdudSB8IGRyYWdvbmZseSopCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICBocHV4OSopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBlbHNlCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JExEIC1iICtiICRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBmaQorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKworICAgICAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKyAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworICAgICAgOzsKKworICAgIGhwdXgxMCopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAtYSAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCV9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisKKwkjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorCSMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBocHV4MTEqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgLWEgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCopCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJaWE2NCopCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJKikKKwkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWVzYWMKKyAgICAgIGVsc2UKKwljYXNlICRob3N0X2NwdSBpbgorCWhwcGEqNjQqKQorCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwlpYTY0KikKKwkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJKikKKwkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCp8aWE2NCopCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0nK2IgJGxpYmRpcicKKwkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKwkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJICA7OworCSopCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCSAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKworCSAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9Jy1ycGF0aCAkbGliZGlyJworICAgICAgZmkKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICBfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgICAgIDs7CisKKyAgICBuZXRic2QqKQorICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAjIGEub3V0CisgICAgICBlbHNlCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgICAgICMgRUxGCisgICAgICBmaQorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgIG5ld3NvczYpCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgb3BlbmJzZCopCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzJworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCV9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisgICAgICBlbHNlCisgICAgICAgY2FzZSAkaG9zdF9vcyBpbgorCSBvcGVuYnNkW1swMV1dLiogfCBvcGVuYnNkMi5bWzAtN11dIHwgb3BlbmJzZDIuW1swLTddXS4qKQorCSAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKwkgICA7OworCSAqKQorCSAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgICA7OworICAgICAgIGVzYWMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgb3MyKikKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJGVjaG8gIkxJQlJBUlkgJGxpYm5hbWUgSU5JVElOU1RBTkNFIiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiREVTQ1JJUFRJT04gXCIkbGlibmFtZVwiIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gREFUQSA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gIiBTSU5HTEUgTk9OU0hBUkVEIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gRVhQT1JUUyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZW14ZXhwICRsaWJvYmpzID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kQ0MgLVpkbGwgLVpjcnRkbGwgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJworICAgICAgX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzLCAkMSk9J2VteGltcCAtbyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5hICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKKyAgICAgIDs7CisKKyAgICBvc2YzKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZmkKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICA7OworCisgICAgb3NmNCogfCBvc2Y1KikJIyBhcyBvc2YzKiB3aXRoIHRoZSBhZGRpdGlvbiBvZiAtbXN5bSBmbGFnCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgZWxzZQorCV9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICIlcyAlc1xcbiIgLWV4cG9ydGVkX3N5bWJvbCAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZTsgZWNobyAiLWhpZGRlbiI+PiAkbGliLmV4cH4KKwkkTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1pbnB1dCAkbGliLmV4cCAkbGlua2VyX2ZsYWdzICRsaWJvYmpzICRkZXBsaWJzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGlifiRybSAkbGliLmV4cCcKKworCSMgQm90aCBjIGFuZCBjeHggY29tcGlsZXIgc3VwcG9ydCAtcnBhdGggZGlyZWN0bHkKKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLXJwYXRoICRsaWJkaXInCisgICAgICBmaQorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgX0xUX0FDX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgLXogdGV4dCcKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJd2xhcmM9JyR7d2x9JworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkgICRDQyAtc2hhcmVkICR7d2x9LU0gJHt3bH0kbGliLmV4cCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34kcm0gJGxpYi5leHAnCisgICAgICBlbHNlCisJd2xhcmM9JycKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisgIAkkTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtTSAkbGliLmV4cCAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc34kcm0gJGxpYi5leHAnCisgICAgICBmaQorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICBzb2xhcmlzMi5bWzAtNV1dIHwgc29sYXJpczIuW1swLTVdXS4qKSA7OworICAgICAgKikKKyAJIyBUaGUgY29tcGlsZXIgZHJpdmVyIHdpbGwgY29tYmluZSBsaW5rZXIgb3B0aW9ucyBzbyB3ZQorIAkjIGNhbm5vdCBqdXN0IHBhc3MgdGhlIGNvbnZpZW5jZSBsaWJyYXJ5IG5hbWVzIHRocm91Z2gKKyAJIyB3aXRob3V0ICR3bCwgaWZmIHdlIGRvIG5vdCBsaW5rIHdpdGggJExELgorIAkjIEx1Y2tpbHksIGdjYyBzdXBwb3J0cyB0aGUgc2FtZSBzeW50YXggd2UgbmVlZCBmb3IgU3VuIFN0dWRpby4KKyAJIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKKyAJY2FzZSAkd2xhcmMgaW4KKyAJJycpCisgCSAgX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JyA7OworIAkqKQorIAkgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3RgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JyA7OworIAllc2FjIDs7CisgICAgICBlc2FjCisgICAgICBfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgaWYgdGVzdCAieCRob3N0X3ZlbmRvciIgPSB4c2VxdWVudDsgdGhlbgorCSMgVXNlICRDQyB0byBsaW5rIHVuZGVyIHNlcXVlbnQsIGJlY2F1c2UgaXQgdGhyb3dzIGluIHNvbWUgZXh0cmEgLm8KKwkjIGZpbGVzIHRoYXQgbWFrZSAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgd29yay4KKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnN0YXRpYyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgc3lzdjQpCisgICAgICBjYXNlICRob3N0X3ZlbmRvciBpbgorCXNuaSkKKwkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzICMgaXMgdGhpcyByZWFsbHkgdHJ1ZT8/PworCTs7CisJc2llbWVucykKKwkgICMjIExEIGlzIGxkIGl0IG1ha2VzIGEgUExBTUxJQgorCSAgIyMgQ0MganVzdCBtYWtlcyBhIEdyb3NzTW9kdWxlLgorCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIF9MVF9BQ19UQUdWQVIocmVsb2FkX2NtZHMsICQxKT0nJENDIC1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisgICAgICAgIDs7CisJbW90b3JvbGEpCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUKKwk7OworICAgICAgZXNhYworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICBzeXN2NC4zKikKKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPSctQmV4cG9ydCcKKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKwloYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NCp1dzIqIHwgc3lzdjVPcGVuVU5JWCogfCBzeXN2NVVuaXhXYXJlNy5bWzAxXV0uW1sxMF1dKiB8IHVuaXh3YXJlNyopCisgICAgICBfTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosdGV4dCcKKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqKQorICAgICAgIyBOb3RlOiBXZSBjYW4gTk9UIHVzZSAteiBkZWZzIGFzIHdlIG1pZ2h0IGRlc2lyZSwgYmVjYXVzZSB3ZSBkbyBub3QKKyAgICAgICMgbGluayB3aXRoIC1sYywgYW5kIHRoYXQgd291bGQgY2F1c2UgYW55IHN5bWJvbHMgdXNlZCBmcm9tIGxpYmMgdG8KKyAgICAgICMgYWx3YXlzIGJlIHVucmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGp1c3QgYWJvdXQgbm8gbGlicmFyeSB3b3VsZAorICAgICAgIyBldmVyIGxpbmsgY29ycmVjdGx5LiAgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCB3ZSB1c2UgLXogdGV4dAorICAgICAgIyB0aG91Z2gsIHdoaWNoIGRvZXMgY2F0Y2ggc29tZSBiYWQgc3ltYm9scyBidXQgaXNuJ3QgYXMgaGVhdnktaGFuZGVkCisgICAgICAjIGFzIC16IGRlZnMuCisgICAgICBfTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosdGV4dCcKKyAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teixub2RlZnMnCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nYHRlc3QgLXogIiRTQ09BQlNQQVRIIiAmJiBlY2hvICR7d2x9LVIsJGxpYmRpcmAnCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0nOicKKyAgICAgIF9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tQmV4cG9ydCcKKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgdXRzNCopCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgOzsKKyAgICBlc2FjCisgIGZpCitdKQorQUNfTVNHX1JFU1VMVChbJF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSldKQordGVzdCAiJF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSkiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCisjCisjIERvIHdlIG5lZWQgdG8gZXhwbGljaXRseSBsaW5rIGxpYmM/CisjCitjYXNlICJ4JF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKSIgaW4KK3h8eHllcykKKyAgIyBBc3N1bWUgLWxjIHNob3VsZCBiZSBhZGRlZAorICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCisKKyAgaWYgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgY2FzZSAkX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKSBpbgorICAgIConficqKQorICAgICAgIyBGSVhNRTogd2UgbWF5IGhhdmUgdG8gZGVhbCB3aXRoIG11bHRpLWNvbW1hbmQgc2VxdWVuY2VzLgorICAgICAgOzsKKyAgICAnJENDICcqKQorICAgICAgIyBUZXN0IHdoZXRoZXIgdGhlIGNvbXBpbGVyIGltcGxpY2l0bHkgbGlua3Mgd2l0aCAtbGMgc2luY2Ugb24gc29tZQorICAgICAgIyBzeXN0ZW1zLCAtbGdjYyBoYXMgdG8gY29tZSBiZWZvcmUgLWxjLiBJZiBnY2MgYWxyZWFkeSBwYXNzZXMgLWxjCisgICAgICAjIHRvIGxkLCBkb24ndCBhZGQgLWxjIGJlZm9yZSAtbGdjYy4KKyAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluXSkKKyAgICAgICRybSBjb25mdGVzdCoKKyAgICAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgICAgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIHNvbmFtZT1jb25mdGVzdAorICAgICAgICBsaWI9Y29uZnRlc3QKKyAgICAgICAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0CisgICAgICAgIGRlcGxpYnM9CisgICAgICAgIHdsPSRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKQorCXBpY19mbGFnPSRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkKKyAgICAgICAgY29tcGlsZXJfZmxhZ3M9LXYKKyAgICAgICAgbGlua2VyX2ZsYWdzPS12CisgICAgICAgIHZlcnN0cmluZz0KKyAgICAgICAgb3V0cHV0X29iamRpcj0uCisgICAgICAgIGxpYm5hbWU9Y29uZnRlc3QKKyAgICAgICAgbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpCisgICAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KKyAgICAgICAgaWYgQUNfVFJZX0VWQUwoX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKSAyXD5cJjEgXHwgZ3JlcCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxKQorICAgICAgICB0aGVuCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKyAgICAgICAgZWxzZQorCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcworICAgICAgICBmaQorICAgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKKyAgICAgIGVsc2UKKyAgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisgICAgICBmaQorICAgICAgJHJtIGNvbmZ0ZXN0KgorICAgICAgQUNfTVNHX1JFU1VMVChbJF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKV0pCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgOzsKK2VzYWMKK10pIyBBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTCisKKworIyBfTFRfQUNfRklMRV9MVERMTF9DCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQmUgY2FyZWZ1bCB0aGF0IHRoZSBzdGFydCBtYXJrZXIgYWx3YXlzIGZvbGxvd3MgYSBuZXdsaW5lLgorQUNfREVGVU4oW19MVF9BQ19GSUxFX0xURExMX0NdLCBbCisjIC8qIGx0ZGxsLmMgc3RhcnRzIGhlcmUgKi8KKyMgI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjICNpbmNsdWRlIDx3aW5kb3dzLmg+CisjICN1bmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCisjICNpbmNsdWRlIDxzdGRpby5oPgorIworIyAjaWZuZGVmIF9fQ1lHV0lOX18KKyMgIyAgaWZkZWYgX19DWUdXSU4zMl9fCisjICMgICAgZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCisjICMgIGVuZGlmCisjICNlbmRpZgorIworIyAjaWZkZWYgX19jcGx1c3BsdXMKKyMgZXh0ZXJuICJDIiB7CisjICNlbmRpZgorIyBCT09MIEFQSUVOVFJZIERsbE1haW4gKEhJTlNUQU5DRSBoSW5zdCwgRFdPUkQgcmVhc29uLCBMUFZPSUQgcmVzZXJ2ZWQpOworIyAjaWZkZWYgX19jcGx1c3BsdXMKKyMgfQorIyAjZW5kaWYKKyMKKyMgI2lmZGVmIF9fQ1lHV0lOX18KKyMgI2luY2x1ZGUgPGN5Z3dpbi9jeWd3aW5fZGxsLmg+CisjIERFQ0xBUkVfQ1lHV0lOX0RMTCggRGxsTWFpbiApOworIyAjZW5kaWYKKyMgSElOU1RBTkNFIF9faERsbEluc3RhbmNlX2Jhc2U7CisjCisjIEJPT0wgQVBJRU5UUlkKKyMgRGxsTWFpbiAoSElOU1RBTkNFIGhJbnN0LCBEV09SRCByZWFzb24sIExQVk9JRCByZXNlcnZlZCkKKyMgeworIyAgIF9faERsbEluc3RhbmNlX2Jhc2UgPSBoSW5zdDsKKyMgICByZXR1cm4gVFJVRTsKKyMgfQorIyAvKiBsdGRsbC5jIGVuZHMgaGVyZSAqLworXSkjIF9MVF9BQ19GSUxFX0xURExMX0MKKworCisjIF9MVF9BQ19UQUdWQVIoVkFSTkFNRSwgW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfTFRfQUNfVEFHVkFSXSwgW2lmZWxzZShbJDJdLCBbXSwgWyQxXSwgWyQxXyQyXSldKQorCisKKyMgb2xkIG5hbWVzCitBQ19ERUZVTihbQU1fUFJPR19MSUJUT09MXSwgICBbQUNfUFJPR19MSUJUT09MXSkKK0FDX0RFRlVOKFtBTV9FTkFCTEVfU0hBUkVEXSwgIFtBQ19FTkFCTEVfU0hBUkVEKCRAKV0pCitBQ19ERUZVTihbQU1fRU5BQkxFX1NUQVRJQ10sICBbQUNfRU5BQkxFX1NUQVRJQygkQCldKQorQUNfREVGVU4oW0FNX0RJU0FCTEVfU0hBUkVEXSwgW0FDX0RJU0FCTEVfU0hBUkVEKCRAKV0pCitBQ19ERUZVTihbQU1fRElTQUJMRV9TVEFUSUNdLCBbQUNfRElTQUJMRV9TVEFUSUMoJEApXSkKK0FDX0RFRlVOKFtBTV9QUk9HX0xEXSwgICAgICAgIFtBQ19QUk9HX0xEXSkKK0FDX0RFRlVOKFtBTV9QUk9HX05NXSwgICAgICAgIFtBQ19QUk9HX05NXSkKKworIyBUaGlzIGlzIGp1c3QgdG8gc2lsZW5jZSBhY2xvY2FsIGFib3V0IHRoZSBtYWNybyBub3QgYmVpbmcgdXNlZAoraWZlbHNlKFtBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTF0pCisKK0FDX0RFRlVOKFtMVF9BQ19QUk9HX0dDSl0sCitbQUNfQ0hFQ0tfVE9PTChHQ0osIGdjaiwgbm8pCisgIHRlc3QgIngke0dDSkZMQUdTK3NldH0iID0geHNldCB8fCBHQ0pGTEFHUz0iLWcgLU8yIgorICBBQ19TVUJTVChHQ0pGTEFHUykKK10pCisKK0FDX0RFRlVOKFtMVF9BQ19QUk9HX1JDXSwKK1tBQ19DSEVDS19UT09MKFJDLCB3aW5kcmVzLCBubykKK10pCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOT1RFOiBUaGlzIG1hY3JvIGhhcyBiZWVuIHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGludG8gICAjCisjICBHTlUgQXV0b2NvbmYgYXMgQUNfUFJPR19TRUQuICBXaGVuIGl0IGlzIGF2YWlsYWJsZSBpbiAgICMKKyMgIGEgcmVsZWFzZWQgdmVyc2lvbiBvZiBBdXRvY29uZiB3ZSBzaG91bGQgcmVtb3ZlIHRoaXMgICAgIworIyAgbWFjcm8gYW5kIHVzZSBpdCBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTFRfQUNfUFJPR19TRUQKKyMgLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgZm9yIGEgZnVsbHktZnVuY3Rpb25hbCBzZWQgcHJvZ3JhbSwgdGhhdCB0cnVuY2F0ZXMKKyMgYXMgZmV3IGNoYXJhY3RlcnMgYXMgcG9zc2libGUuICBQcmVmZXIgR05VIHNlZCBpZiBmb3VuZC4KK0FDX0RFRlVOKFtMVF9BQ19QUk9HX1NFRF0sCitbQUNfTVNHX0NIRUNLSU5HKFtmb3IgYSBzZWQgdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXRdKQorQUNfQ0FDSEVfVkFMKGx0X2N2X3BhdGhfU0VELAorWyMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3Igc2VkIGFuZCBnc2VkLgorIyBUaGVuIHVzZSB0aGF0IGxpc3Qgb2Ygc2VkJ3MgYXMgb25lcyB0byB0ZXN0IGZvciB0cnVuY2F0aW9uLgorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgbHRfYWNfcHJvZyBpbiBzZWQgZ3NlZDsgZG8KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGx0X2FjX3Byb2ckYWNfZXhlY19leHQiOyB0aGVuCisgICAgICAgIGx0X2FjX3NlZF9saXN0PSIkbHRfYWNfc2VkX2xpc3QgJGFzX2Rpci8kbHRfYWNfcHJvZyRhY19leGVjX2V4dCIKKyAgICAgIGZpCisgICAgZG9uZQorICBkb25lCitkb25lCitsdF9hY19tYXg9MAorbHRfYWNfY291bnQ9MAorIyBBZGQgL3Vzci94cGc0L2Jpbi9zZWQgYXMgaXQgaXMgdHlwaWNhbGx5IGZvdW5kIG9uIFNvbGFyaXMKKyMgYWxvbmcgd2l0aCAvYmluL3NlZCB0aGF0IHRydW5jYXRlcyBvdXRwdXQuCitmb3IgbHRfYWNfc2VkIGluICRsdF9hY19zZWRfbGlzdCAvdXNyL3hwZzQvYmluL3NlZDsgZG8KKyAgdGVzdCAhIC1mICRsdF9hY19zZWQgJiYgY29udGludWUKKyAgY2F0IC9kZXYvbnVsbCA+IGNvbmZ0ZXN0LmluCisgIGx0X2FjX2NvdW50PTAKKyAgZWNobyAkRUNIT19OICIwMTIzNDU2Nzg5JEVDSE9fQyIgPmNvbmZ0ZXN0LmluCisgICMgQ2hlY2sgZm9yIEdOVSBzZWQgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KKyAgaWYgIiRsdF9hY19zZWQiIC0tdmVyc2lvbiAyPiYxIDwgL2Rldi9udWxsIHwgZ3JlcCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGx0X2N2X3BhdGhfU0VEPSRsdF9hY19zZWQKKyAgICBicmVhaworICBmaQorICB3aGlsZSB0cnVlOyBkbworICAgIGNhdCBjb25mdGVzdC5pbiBjb25mdGVzdC5pbiA+Y29uZnRlc3QudG1wCisgICAgbXYgY29uZnRlc3QudG1wIGNvbmZ0ZXN0LmluCisgICAgY3AgY29uZnRlc3QuaW4gY29uZnRlc3QubmwKKyAgICBlY2hvID4+Y29uZnRlc3QubmwKKyAgICAkbHRfYWNfc2VkIC1lICdzL2EkLy8nIDwgY29uZnRlc3QubmwgPmNvbmZ0ZXN0Lm91dCB8fCBicmVhaworICAgIGNtcCAtcyBjb25mdGVzdC5vdXQgY29uZnRlc3QubmwgfHwgYnJlYWsKKyAgICAjIDEwMDAwIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKKyAgICB0ZXN0ICRsdF9hY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKKyAgICBsdF9hY19jb3VudD1gZXhwciAkbHRfYWNfY291bnQgKyAxYAorICAgIGlmIHRlc3QgJGx0X2FjX2NvdW50IC1ndCAkbHRfYWNfbWF4OyB0aGVuCisgICAgICBsdF9hY19tYXg9JGx0X2FjX2NvdW50CisgICAgICBsdF9jdl9wYXRoX1NFRD0kbHRfYWNfc2VkCisgICAgZmkKKyAgZG9uZQorZG9uZQorXSkKK1NFRD0kbHRfY3ZfcGF0aF9TRUQKK0FDX01TR19SRVNVTFQoWyRTRURdKQorXSkKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2NvbmZ0b29scy9sdG1haW4uc2ggYi9leHBhdC0yLjAuMS9jb25mdG9vbHMvbHRtYWluLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ODIzZTAKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9jb25mdG9vbHMvbHRtYWluLnNoCkBAIC0wLDAgKzEsNjg2MyBAQAorIyBsdG1haW4uc2ggLSBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KKyMgTk9URTogQ2hhbmdpbmcgdGhpcyBmaWxlIHdpbGwgbm90IGFmZmVjdCBhbnl0aGluZyB1bnRpbCB5b3UgcmVydW4gY29uZmlndXJlLgorIworIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIE9yaWdpbmFsbHkgYnkgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2Jhc2VuYW1lPSJzLF4uKi8sLGciCisKKyMgV29yayBhcm91bmQgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpc3N1ZSBvbiBJUklYIDYuNS4gT24gSVJJWCA2LjQrLCBzaAorIyBpcyBrc2ggYnV0IHdoZW4gdGhlIHNoZWxsIGlzIGludm9rZWQgYXMgInNoIiBhbmQgdGhlIGN1cnJlbnQgdmFsdWUgb2YKKyMgdGhlIF9YUEcgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGVxdWFsIHRvIDEgKG9uZSksIHRoZSBzcGVjaWFsCisjIHBvc2l0aW9uYWwgcGFyYW1ldGVyICQwLCB3aXRoaW4gYSBmdW5jdGlvbiBjYWxsLCBpcyB0aGUgbmFtZSBvZiB0aGUKKyMgZnVuY3Rpb24uCitwcm9ncGF0aD0iJDAiCisKKyMgVGhlIG5hbWUgb2YgdGhpcyBwcm9ncmFtOgorcHJvZ25hbWU9YGVjaG8gIiRwcm9ncGF0aCIgfCAkU0VEICRiYXNlbmFtZWAKK21vZGVuYW1lPSIkcHJvZ25hbWUiCisKKyMgR2xvYmFsIHZhcmlhYmxlczoKK0VYSVRfU1VDQ0VTUz0wCitFWElUX0ZBSUxVUkU9MQorCitQUk9HUkFNPWx0bWFpbi5zaAorUEFDS0FHRT1saWJ0b29sCitWRVJTSU9OPTEuNS4yMgorVElNRVNUQU1QPSIgKDEuMTIyMC4yLjM2NSAyMDA1LzEyLzE4IDIyOjE0OjA2KSIKKworIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91cgorIyBjb21tYW5kcyB0aHJvdWdoIHdpdGhvdXQgcmVtb3ZhbCBvZiBcIGVzY2FwZXMuCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgorICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZmkKKworIyBDaGVjayB0aGF0IHdlIGhhdmUgYSB3b3JraW5nICRlY2hvLgoraWYgdGVzdCAiWCQxIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgorICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KKyAgc2hpZnQKK2VsaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KKyAgIyBBdm9pZCBpbmxpbmUgZG9jdW1lbnQgaGVyZSwgaXQgbWF5IGJlIGxlZnQgb3ZlcgorICA6CitlbGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbgorICAjIFlpcHBlZSwgJGVjaG8gd29ya3MhCisgIDoKK2Vsc2UKKyAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLCBhbmQgdGhlbiBtYXliZSAkZWNobyB3aWxsIHdvcmsuCisgIGV4ZWMgJFNIRUxMICIkcHJvZ3BhdGgiIC0tbm8tcmVleGVjICR7MSsiJEAifQorZmkKKworaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KKyAgIyB1c2VkIGFzIGZhbGxiYWNrIGVjaG8KKyAgc2hpZnQKKyAgY2F0IDw8RU9GCiskKgorRU9GCisgIGV4aXQgJEVYSVRfU1VDQ0VTUworZmkKKworZGVmYXVsdF9tb2RlPQoraGVscD0iVHJ5IFxgJHByb2duYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorbWFnaWM9IiUlJU1BR0lDIHZhcmlhYmxlJSUlIgorbWtkaXI9Im1rZGlyIgorbXY9Im12IC1mIgorcm09InJtIC1mIgorCisjIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCisjIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgorWHNlZD0iJHtTRUR9IicgLWUgMXMvXlgvLycKK3NlZF9xdW90ZV9zdWJzdD0ncy9cKFtcXGBcXCIkXFxcXF1cKS9cXFwxL2cnCisjIHRlc3QgRUJDRElDIG9yIEFTQ0lJCitjYXNlIGBlY2hvIFh8dHIgWCAnXDEwMSdgIGluCisgQSkgIyBBU0NJSSBiYXNlZCBzeXN0ZW0KKyAgICAjIFxuIGlzIG5vdCBpbnRlcnByZXRlZCBjb3JyZWN0bHkgYnkgU29sYXJpcyA4IC91c3IvdWNiL3RyCisgIFNQMk5MPSd0ciBcMDQwIFwwMTInCisgIE5MMlNQPSd0ciBcMDE1XDAxMiBcMDQwXDA0MCcKKyAgOzsKKyAqKSAjIEVCQ0RJQyBiYXNlZCBzeXN0ZW0KKyAgU1AyTkw9J3RyIFwxMDAgXG4nCisgIE5MMlNQPSd0ciBcclxuIFwxMDBcMTAwJworICA7OworZXNhYworCisjIE5MUyBudWlzYW5jZXMuCisjIE9ubHkgc2V0IExBTkcgYW5kIExDX0FMTCB0byBDIGlmIGFscmVhZHkgc2V0LgorIyBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5IGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQKKyMgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KKyMgV2Ugc2F2ZSB0aGUgb2xkIHZhbHVlcyB0byByZXN0b3JlIGR1cmluZyBleGVjdXRlIG1vZGUuCitpZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbgorICBzYXZlX0xDX0FMTD0iJExDX0FMTCI7IExDX0FMTD1DOyBleHBvcnQgTENfQUxMCitmaQoraWYgdGVzdCAiJHtMQU5HK3NldH0iID0gc2V0OyB0aGVuCisgIHNhdmVfTEFORz0iJExBTkciOyBMQU5HPUM7IGV4cG9ydCBMQU5HCitmaQorCisjIE1ha2Ugc3VyZSBJRlMgaGFzIGEgc2Vuc2libGUgZGVmYXVsdAorbHRfbmw9JworJworSUZTPSIgCSRsdF9ubCIKKworaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgIT0geWVzOyB0aGVuCisgICRlY2hvICIkbW9kZW5hbWU6IG5vdCBjb25maWd1cmVkIHRvIGJ1aWxkIGFueSBraW5kIG9mIGxpYnJhcnkiIDE+JjIKKyAgJGVjaG8gIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuICBTZWUgdGhlICRQQUNLQUdFIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCisgIGV4aXQgJEVYSVRfRkFJTFVSRQorZmkKKworIyBHbG9iYWwgdmFyaWFibGVzLgorbW9kZT0kZGVmYXVsdF9tb2RlCitub25vcHQ9CitwcmV2PQorcHJldm9wdD0KK3J1bj0KK3Nob3c9IiRlY2hvIgorc2hvd19oZWxwPQorZXhlY3V0ZV9kbGZpbGVzPQorZHVwbGljYXRlX2RlcHM9bm8KK3ByZXNlcnZlX2FyZ3M9CitsbzJvPSJzL1xcLmxvXCQvLiR7b2JqZXh0fS8iCitvMmxvPSJzL1xcLiR7b2JqZXh0fVwkLy5sby8iCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgU2hlbGwgZnVuY3Rpb24gZGVmaW5pdGlvbnM6CisjIFRoaXMgc2VlbXMgdG8gYmUgdGhlIGJlc3QgcGxhY2UgZm9yIHRoZW0KKworIyBmdW5jX21rdGVtcGRpciBbc3RyaW5nXQorIyBNYWtlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0aGF0IHdvbid0IGNsYXNoIHdpdGggb3RoZXIgcnVubmluZworIyBsaWJ0b29sIHByb2Nlc3NlcywgYW5kIGF2b2lkcyByYWNlIGNvbmRpdGlvbnMgaWYgcG9zc2libGUuICBJZgorIyBnaXZlbiwgU1RSSU5HIGlzIHRoZSBiYXNlbmFtZSBmb3IgdGhhdCBkaXJlY3RvcnkuCitmdW5jX21rdGVtcGRpciAoKQoreworICAgIG15X3RlbXBsYXRlPSIke1RNUERJUi0vdG1wfS8kezEtJHByb2duYW1lfSIKKworICAgIGlmIHRlc3QgIiRydW4iID0gIjoiOyB0aGVuCisgICAgICAjIFJldHVybiBhIGRpcmVjdG9yeSBuYW1lLCBidXQgZG9uJ3QgY3JlYXRlIGl0IGluIGRyeS1ydW4gbW9kZQorICAgICAgbXlfdG1wZGlyPSIke215X3RlbXBsYXRlfS0kJCIKKyAgICBlbHNlCisKKyAgICAgICMgSWYgbWt0ZW1wIHdvcmtzLCB1c2UgdGhhdCBmaXJzdCBhbmQgZm9yZW1vc3QKKyAgICAgIG15X3RtcGRpcj1gbWt0ZW1wIC1kICIke215X3RlbXBsYXRlfS1YWFhYWFhYWCIgMj4vZGV2L251bGxgCisKKyAgICAgIGlmIHRlc3QgISAtZCAiJG15X3RtcGRpciI7IHRoZW4KKwkjIEZhaWxpbmcgdGhhdCwgYXQgbGVhc3QgdHJ5IGFuZCB1c2UgJFJBTkRPTSB0byBhdm9pZCBhIHJhY2UKKwlteV90bXBkaXI9IiR7bXlfdGVtcGxhdGV9LSR7UkFORE9NLTB9JCQiCisKKwlzYXZlX21rdGVtcGRpcl91bWFzaz1gdW1hc2tgCisJdW1hc2sgMDA3NworCSRta2RpciAiJG15X3RtcGRpciIKKwl1bWFzayAkc2F2ZV9ta3RlbXBkaXJfdW1hc2sKKyAgICAgIGZpCisKKyAgICAgICMgSWYgd2UncmUgbm90IGluIGRyeS1ydW4gbW9kZSwgYm9tYiBvdXQgb24gZmFpbHVyZQorICAgICAgdGVzdCAtZCAiJG15X3RtcGRpciIgfHwgeworICAgICAgICAkZWNobyAiY2Fubm90IGNyZWF0ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IFxgJG15X3RtcGRpciciIDE+JjIKKwlleGl0ICRFWElUX0ZBSUxVUkUKKyAgICAgIH0KKyAgICBmaQorCisgICAgJGVjaG8gIlgkbXlfdG1wZGlyIiB8ICRYc2VkCit9CisKKworIyBmdW5jX3dpbjMyX2xpYmlkIGFyZworIyByZXR1cm4gdGhlIGxpYnJhcnkgdHlwZSBvZiBmaWxlICdhcmcnCisjCisjIE5lZWQgYSBsb3Qgb2YgZ29vIHRvIGhhbmRsZSAqYm90aCogRExMcyBhbmQgaW1wb3J0IGxpYnMKKyMgSGFzIHRvIGJlIGEgc2hlbGwgZnVuY3Rpb24gaW4gb3JkZXIgdG8gJ2VhdCcgdGhlIGFyZ3VtZW50CisjIHRoYXQgaXMgc3VwcGxpZWQgd2hlbiAkZmlsZV9tYWdpY19jb21tYW5kIGlzIGNhbGxlZC4KK2Z1bmNfd2luMzJfbGliaWQgKCkKK3sKKyAgd2luMzJfbGliaWRfdHlwZT0idW5rbm93biIKKyAgd2luMzJfZmlsZXJlcz1gZmlsZSAtTCAkMSAyPi9kZXYvbnVsbGAKKyAgY2FzZSAkd2luMzJfZmlsZXJlcyBpbgorICAqYXJcIGFyY2hpdmVcIGltcG9ydFwgbGlicmFyeSopICMgZGVmaW5pdGVseSBpbXBvcnQKKyAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgYXJjaGl2ZSBpbXBvcnQiCisgICAgOzsKKyAgKmFyXCBhcmNoaXZlKikgIyBjb3VsZCBiZSBhbiBpbXBvcnQsIG9yIHN0YXRpYworICAgIGlmIGV2YWwgJE9CSkRVTVAgLWYgJDEgfCAkU0VEIC1lICcxMHEnIDI+L2Rldi9udWxsIHwgXAorICAgICAgJEVHUkVQIC1lICdmaWxlIGZvcm1hdCBwZS1pMzg2KC4qYXJjaGl0ZWN0dXJlOiBpMzg2KT8nID4vZGV2L251bGwgOyB0aGVuCisgICAgICB3aW4zMl9ubXJlcz1gZXZhbCAkTk0gLWYgcG9zaXggLUEgJDEgfCBcCisJJFNFRCAtbiAtZSAnMSwxMDB7LyBJIC97cywuKixpbXBvcnQsO3A7cTt9O30nYAorICAgICAgY2FzZSAkd2luMzJfbm1yZXMgaW4KKyAgICAgIGltcG9ydCopICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgYXJjaGl2ZSBpbXBvcnQiOzsKKyAgICAgICopICAgICAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgYXJjaGl2ZSBzdGF0aWMiOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICAgIDs7CisgICpETEwqKQorICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBETEwiCisgICAgOzsKKyAgKmV4ZWN1dGFibGUqKSAjIGJ1dCBzaGVsbCBzY3JpcHRzIGFyZSAiZXhlY3V0YWJsZSIgdG9vLi4uCisgICAgY2FzZSAkd2luMzJfZmlsZXJlcyBpbgorICAgICpNU1wgV2luZG93c1wgUEVcIEludGVsKikKKyAgICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBETEwiCisgICAgICA7OworICAgIGVzYWMKKyAgICA7OworICBlc2FjCisgICRlY2hvICR3aW4zMl9saWJpZF90eXBlCit9CisKKworIyBmdW5jX2luZmVyX3RhZyBhcmcKKyMgSW5mZXIgdGFnZ2VkIGNvbmZpZ3VyYXRpb24gdG8gdXNlIGlmIGFueSBhcmUgYXZhaWxhYmxlIGFuZAorIyBpZiBvbmUgd2Fzbid0IGNob3NlbiB2aWEgdGhlICItLXRhZyIgY29tbWFuZCBsaW5lIG9wdGlvbi4KKyMgT25seSBhdHRlbXB0IHRoaXMgaWYgdGhlIGNvbXBpbGVyIGluIHRoZSBiYXNlIGNvbXBpbGUKKyMgY29tbWFuZCBkb2Vzbid0IG1hdGNoIHRoZSBkZWZhdWx0IGNvbXBpbGVyLgorIyBhcmcgaXMgdXN1YWxseSBvZiB0aGUgZm9ybSAnZ2NjIC4uLicKK2Z1bmNfaW5mZXJfdGFnICgpCit7CisgICAgaWYgdGVzdCAtbiAiJGF2YWlsYWJsZV90YWdzIiAmJiB0ZXN0IC16ICIkdGFnbmFtZSI7IHRoZW4KKyAgICAgIENDX3F1b3RlZD0KKyAgICAgIGZvciBhcmcgaW4gJENDOyBkbworCWNhc2UgJGFyZyBpbgorCSAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisJICBhcmc9IlwiJGFyZ1wiIgorCSAgOzsKKwllc2FjCisJQ0NfcXVvdGVkPSIkQ0NfcXVvdGVkICRhcmciCisgICAgICBkb25lCisgICAgICBjYXNlICRAIGluCisgICAgICAjIEJsYW5rcyBpbiB0aGUgY29tbWFuZCBtYXkgaGF2ZSBiZWVuIHN0cmlwcGVkIGJ5IHRoZSBjYWxsaW5nIHNoZWxsLAorICAgICAgIyBidXQgbm90IGZyb20gdGhlIENDIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gY29uZmlndXJlIHdhcyBydW4uCisgICAgICAiICRDQyAiKiB8ICIkQ0MgIiogfCAiIGAkZWNobyAkQ0NgICIqIHwgImAkZWNobyAkQ0NgICIqIHwgIiAkQ0NfcXVvdGVkIiogfCAiJENDX3F1b3RlZCAiKiB8ICIgYCRlY2hvICRDQ19xdW90ZWRgICIqIHwgImAkZWNobyAkQ0NfcXVvdGVkYCAiKikgOzsKKyAgICAgICMgQmxhbmtzIGF0IHRoZSBzdGFydCBvZiAkYmFzZV9jb21waWxlIHdpbGwgY2F1c2UgdGhpcyB0byBmYWlsCisgICAgICAjIGlmIHdlIGRvbid0IGNoZWNrIGZvciB0aGVtIGFzIHdlbGwuCisgICAgICAqKQorCWZvciB6IGluICRhdmFpbGFibGVfdGFnczsgZG8KKwkgIGlmIGdyZXAgIl4jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR6JCIgPCAiJHByb2dwYXRoIiA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICAjIEV2YWx1YXRlIHRoZSBjb25maWd1cmF0aW9uLgorCSAgICBldmFsICJgJHtTRUR9IC1uIC1lICcvXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJyR6JyQvLC9eIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJyR6JyQvcCcgPCAkcHJvZ3BhdGhgIgorCSAgICBDQ19xdW90ZWQ9CisJICAgIGZvciBhcmcgaW4gJENDOyBkbworCSAgICAjIERvdWJsZS1xdW90ZSBhcmdzIGNvbnRhaW5pbmcgb3RoZXIgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCisJICAgIGNhc2UgJGFyZyBpbgorCSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorCSAgICAgIGFyZz0iXCIkYXJnXCIiCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICBDQ19xdW90ZWQ9IiRDQ19xdW90ZWQgJGFyZyIKKwkgIGRvbmUKKwkgICAgY2FzZSAiJEAgIiBpbgorCSAgICAgICIgJENDICIqIHwgIiRDQyAiKiB8ICIgYCRlY2hvICRDQ2AgIiogfCAiYCRlY2hvICRDQ2AgIiogfCAiICRDQ19xdW90ZWQiKiB8ICIkQ0NfcXVvdGVkICIqIHwgIiBgJGVjaG8gJENDX3F1b3RlZGAgIiogfCAiYCRlY2hvICRDQ19xdW90ZWRgICIqKQorCSAgICAgICMgVGhlIGNvbXBpbGVyIGluIHRoZSBiYXNlIGNvbXBpbGUgY29tbWFuZCBtYXRjaGVzCisJICAgICAgIyB0aGUgb25lIGluIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbi4KKwkgICAgICAjIEFzc3VtZSB0aGlzIGlzIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbiB3ZSB3YW50LgorCSAgICAgIHRhZ25hbWU9JHoKKwkgICAgICBicmVhaworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgIGZpCisJZG9uZQorCSMgSWYgJHRhZ25hbWUgc3RpbGwgaXNuJ3Qgc2V0LCB0aGVuIG5vIHRhZ2dlZCBjb25maWd1cmF0aW9uCisJIyB3YXMgZm91bmQgYW5kIGxldCB0aGUgdXNlciBrbm93IHRoYXQgdGhlICItLXRhZyIgY29tbWFuZAorCSMgbGluZSBvcHRpb24gbXVzdCBiZSB1c2VkLgorCWlmIHRlc3QgLXogIiR0YWduYW1lIjsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogdW5hYmxlIHRvIGluZmVyIHRhZ2dlZCBjb25maWd1cmF0aW9uIgorCSAgJGVjaG8gIiRtb2RlbmFtZTogc3BlY2lmeSBhIHRhZyB3aXRoIFxgLS10YWcnIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKyMgICAgICAgIGVsc2UKKyMgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogdXNpbmcgJHRhZ25hbWUgdGFnZ2VkIGNvbmZpZ3VyYXRpb24iCisJZmkKKwk7OworICAgICAgZXNhYworICAgIGZpCit9CisKKworIyBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSBkaXIgb2xkbGliCitmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAoKQoreworICAgIGZfZXhfYW5fYXJfZGlyPSIkMSI7IHNoaWZ0CisgICAgZl9leF9hbl9hcl9vbGRsaWI9IiQxIgorCisgICAgJHNob3cgIihjZCAkZl9leF9hbl9hcl9kaXIgJiYgJEFSIHggJGZfZXhfYW5fYXJfb2xkbGliKSIKKyAgICAkcnVuIGV2YWwgIihjZCBcJGZfZXhfYW5fYXJfZGlyICYmICRBUiB4IFwkZl9leF9hbl9hcl9vbGRsaWIpIiB8fCBleGl0ICQ/CisgICAgaWYgKCRBUiB0ICIkZl9leF9hbl9hcl9vbGRsaWIiIHwgc29ydCB8IHNvcnQgLXVjID4vZGV2L251bGwgMj4mMSk7IHRoZW4KKyAgICAgOgorICAgIGVsc2UKKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IEVSUk9SOiBvYmplY3QgbmFtZSBjb25mbGljdHM6ICRmX2V4X2FuX2FyX2Rpci8kZl9leF9hbl9hcl9vbGRsaWIiIDE+JjIKKyAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorICAgIGZpCit9CisKKyMgZnVuY19leHRyYWN0X2FyY2hpdmVzIGdlbnRvcCBvbGRsaWIgLi4uCitmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgKCkKK3sKKyAgICBteV9nZW50b3A9IiQxIjsgc2hpZnQKKyAgICBteV9vbGRsaWJzPSR7MSsiJEAifQorICAgIG15X29sZG9ianM9IiIKKyAgICBteV94bGliPSIiCisgICAgbXlfeGFicz0iIgorICAgIG15X3hkaXI9IiIKKyAgICBteV9zdGF0dXM9IiIKKworICAgICRzaG93ICIke3JtfXIgJG15X2dlbnRvcCIKKyAgICAkcnVuICR7cm19ciAiJG15X2dlbnRvcCIKKyAgICAkc2hvdyAiJG1rZGlyICRteV9nZW50b3AiCisgICAgJHJ1biAkbWtkaXIgIiRteV9nZW50b3AiCisgICAgbXlfc3RhdHVzPSQ/CisgICAgaWYgdGVzdCAiJG15X3N0YXR1cyIgLW5lIDAgJiYgdGVzdCAhIC1kICIkbXlfZ2VudG9wIjsgdGhlbgorICAgICAgZXhpdCAkbXlfc3RhdHVzCisgICAgZmkKKworICAgIGZvciBteV94bGliIGluICRteV9vbGRsaWJzOyBkbworICAgICAgIyBFeHRyYWN0IHRoZSBvYmplY3RzLgorICAgICAgY2FzZSAkbXlfeGxpYiBpbgorCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgbXlfeGFicz0iJG15X3hsaWIiIDs7CisJKikgbXlfeGFicz1gcHdkYCIvJG15X3hsaWIiIDs7CisgICAgICBlc2FjCisgICAgICBteV94bGliPWAkZWNobyAiWCRteV94bGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisgICAgICBteV94ZGlyPSIkbXlfZ2VudG9wLyRteV94bGliIgorCisgICAgICAkc2hvdyAiJHtybX1yICRteV94ZGlyIgorICAgICAgJHJ1biAke3JtfXIgIiRteV94ZGlyIgorICAgICAgJHNob3cgIiRta2RpciAkbXlfeGRpciIKKyAgICAgICRydW4gJG1rZGlyICIkbXlfeGRpciIKKyAgICAgIGV4aXRfc3RhdHVzPSQ/CisgICAgICBpZiB0ZXN0ICIkZXhpdF9zdGF0dXMiIC1uZSAwICYmIHRlc3QgISAtZCAiJG15X3hkaXIiOyB0aGVuCisJZXhpdCAkZXhpdF9zdGF0dXMKKyAgICAgIGZpCisgICAgICBjYXNlICRob3N0IGluCisgICAgICAqLWRhcndpbiopCisJJHNob3cgIkV4dHJhY3RpbmcgJG15X3hhYnMiCisJIyBEbyBub3QgYm90aGVyIGRvaW5nIGFueXRoaW5nIGlmIGp1c3QgYSBkcnkgcnVuCisJaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KKwkgIGRhcndpbl9vcmlnX2Rpcj1gcHdkYAorCSAgY2QgJG15X3hkaXIgfHwgZXhpdCAkPworCSAgZGFyd2luX2FyY2hpdmU9JG15X3hhYnMKKwkgIGRhcndpbl9jdXJkaXI9YHB3ZGAKKwkgIGRhcndpbl9iYXNlX2FyY2hpdmU9YCRlY2hvICJYJGRhcndpbl9hcmNoaXZlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisJICBkYXJ3aW5fYXJjaGVzPWBsaXBvIC1pbmZvICIkZGFyd2luX2FyY2hpdmUiIDI+L2Rldi9udWxsIHwgJEVHUkVQIEFyY2hpdGVjdHVyZXMgMj4vZGV2L251bGxgCisJICBpZiB0ZXN0IC1uICIkZGFyd2luX2FyY2hlcyI7IHRoZW4gCisJICAgIGRhcndpbl9hcmNoZXM9YGVjaG8gIiRkYXJ3aW5fYXJjaGVzIiB8ICRTRUQgLWUgJ3MvLiphcmU6Ly8nYAorCSAgICBkYXJ3aW5fYXJjaD0KKwkgICAgJHNob3cgIiRkYXJ3aW5fYmFzZV9hcmNoaXZlIGhhcyBtdWx0aXBsZSBhcmNoaXRlY3R1cmVzICRkYXJ3aW5fYXJjaGVzIgorCSAgICBmb3IgZGFyd2luX2FyY2ggaW4gICRkYXJ3aW5fYXJjaGVzIDsgZG8KKwkgICAgICBta2RpciAtcCAidW5mYXQtJCQvJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfS0ke2Rhcndpbl9hcmNofSIKKwkgICAgICBsaXBvIC10aGluICRkYXJ3aW5fYXJjaCAtb3V0cHV0ICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9LyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0iICIke2Rhcndpbl9hcmNoaXZlfSIKKwkgICAgICBjZCAidW5mYXQtJCQvJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfS0ke2Rhcndpbl9hcmNofSIKKwkgICAgICBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAiYHB3ZGAiICIke2Rhcndpbl9iYXNlX2FyY2hpdmV9IgorCSAgICAgIGNkICIkZGFyd2luX2N1cmRpciIKKwkgICAgICAkcm0gInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0vJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfSIKKwkgICAgZG9uZSAjICRkYXJ3aW5fYXJjaGVzCisgICAgICAjIyBPa2F5IG5vdyB3ZSBoYXZlIGEgYnVuY2ggb2YgdGhpbiBvYmplY3RzLCBnb3R0YSBmYXR0ZW4gdGhlbSB1cCA6KQorCSAgICBkYXJ3aW5fZmlsZWxpc3Q9YGZpbmQgdW5mYXQtJCQgLXR5cGUgZiAtbmFtZSBcKi5vIC1wcmludCAtbyAtbmFtZSBcKi5sbyAtcHJpbnR8IHhhcmdzIGJhc2VuYW1lIHwgc29ydCAtdSB8ICROTDJTUGAKKwkgICAgZGFyd2luX2ZpbGU9CisJICAgIGRhcndpbl9maWxlcz0KKwkgICAgZm9yIGRhcndpbl9maWxlIGluICRkYXJ3aW5fZmlsZWxpc3Q7IGRvCisJICAgICAgZGFyd2luX2ZpbGVzPWBmaW5kIHVuZmF0LSQkIC1uYW1lICRkYXJ3aW5fZmlsZSAtcHJpbnQgfCAkTkwyU1BgCisJICAgICAgbGlwbyAtY3JlYXRlIC1vdXRwdXQgIiRkYXJ3aW5fZmlsZSIgJGRhcndpbl9maWxlcworCSAgICBkb25lICMgJGRhcndpbl9maWxlbGlzdAorCSAgICAke3JtfXIgdW5mYXQtJCQKKwkgICAgY2QgIiRkYXJ3aW5fb3JpZ19kaXIiCisJICBlbHNlCisJICAgIGNkICIkZGFyd2luX29yaWdfZGlyIgorIAkgICAgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgIiRteV94ZGlyIiAiJG15X3hhYnMiCisJICBmaSAjICRkYXJ3aW5fYXJjaGVzCisJZmkgIyAkcnVuCisJOzsKKyAgICAgICopCisgICAgICAgIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICIkbXlfeGRpciIgIiRteV94YWJzIgorICAgICAgICA7OworICAgICAgZXNhYworICAgICAgbXlfb2xkb2Jqcz0iJG15X29sZG9ianMgImBmaW5kICRteV94ZGlyIC1uYW1lIFwqLiRvYmpleHQgLXByaW50IC1vIC1uYW1lIFwqLmxvIC1wcmludCB8ICROTDJTUGAKKyAgICBkb25lCisgICAgZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdD0iJG15X29sZG9ianMiCit9CisjIEVuZCBvZiBTaGVsbCBmdW5jdGlvbiBkZWZpbml0aW9ucworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIERhcndpbiBzdWNrcworZXZhbCBzdGRfc2hyZXh0PVwiJHNocmV4dF9jbWRzXCIKKworZGlzYWJsZV9saWJzPW5vCisKKyMgUGFyc2Ugb3VyIGNvbW1hbmQgbGluZSBvcHRpb25zIG9uY2UsIHRob3JvdWdobHkuCit3aGlsZSB0ZXN0ICIkIyIgLWd0IDAKK2RvCisgIGFyZz0iJDEiCisgIHNoaWZ0CisKKyAgY2FzZSAkYXJnIGluCisgIC0qPSopIG9wdGFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKKyAgKikgb3B0YXJnPSA7OworICBlc2FjCisKKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgorICAgIGNhc2UgJHByZXYgaW4KKyAgICBleGVjdXRlX2RsZmlsZXMpCisgICAgICBleGVjdXRlX2RsZmlsZXM9IiRleGVjdXRlX2RsZmlsZXMgJGFyZyIKKyAgICAgIDs7CisgICAgdGFnKQorICAgICAgdGFnbmFtZT0iJGFyZyIKKyAgICAgIHByZXNlcnZlX2FyZ3M9IiR7cHJlc2VydmVfYXJnc309JGFyZyIKKworICAgICAgIyBDaGVjayB3aGV0aGVyIHRhZ25hbWUgY29udGFpbnMgb25seSB2YWxpZCBjaGFyYWN0ZXJzCisgICAgICBjYXNlICR0YWduYW1lIGluCisgICAgICAqWyEtX0EtWmEtejAtOSwvXSopCisJJGVjaG8gIiRwcm9nbmFtZTogaW52YWxpZCB0YWcgbmFtZTogJHRhZ25hbWUiIDE+JjIKKwlleGl0ICRFWElUX0ZBSUxVUkUKKwk7OworICAgICAgZXNhYworCisgICAgICBjYXNlICR0YWduYW1lIGluCisgICAgICBDQykKKwkjIERvbid0IHRlc3QgZm9yIHRoZSAiZGVmYXVsdCIgQyB0YWcsIGFzIHdlIGtub3csIGl0J3MgdGhlcmUsIGJ1dAorCSMgbm90IHNwZWNpYWxseSBtYXJrZWQuCisJOzsKKyAgICAgICopCisJaWYgZ3JlcCAiXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUkIiA8ICIkcHJvZ3BhdGgiID4gL2Rldi9udWxsOyB0aGVuCisJICB0YWdsaXN0PSIkdGFnbGlzdCAkdGFnbmFtZSIKKwkgICMgRXZhbHVhdGUgdGhlIGNvbmZpZ3VyYXRpb24uCisJICBldmFsICJgJHtTRUR9IC1uIC1lICcvXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJyR0YWduYW1lJyQvLC9eIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJyR0YWduYW1lJyQvcCcgPCAkcHJvZ3BhdGhgIgorCWVsc2UKKwkgICRlY2hvICIkcHJvZ25hbWU6IGlnbm9yaW5nIHVua25vd24gdGFnICR0YWduYW1lIiAxPiYyCisJZmkKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKyAgICAqKQorICAgICAgZXZhbCAiJHByZXY9XCRhcmciCisgICAgICA7OworICAgIGVzYWMKKworICAgIHByZXY9CisgICAgcHJldm9wdD0KKyAgICBjb250aW51ZQorICBmaQorCisgICMgSGF2ZSB3ZSBzZWVuIGEgbm9uLW9wdGlvbmFsIGFyZ3VtZW50IHlldD8KKyAgY2FzZSAkYXJnIGluCisgIC0taGVscCkKKyAgICBzaG93X2hlbHA9eWVzCisgICAgOzsKKworICAtLXZlcnNpb24pCisgICAgJGVjaG8gIiRQUk9HUkFNIChHTlUgJFBBQ0tBR0UpICRWRVJTSU9OJFRJTUVTVEFNUCIKKyAgICAkZWNobworICAgICRlY2hvICJDb3B5cmlnaHQgKEMpIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiIKKyAgICAkZWNobyAiVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8iCisgICAgJGVjaG8gIndhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKKyAgICBleGl0ICQ/CisgICAgOzsKKworICAtLWNvbmZpZykKKyAgICAke1NFRH0gLWUgJzEsL14jICMjIyBCRUdJTiBMSUJUT09MIENPTkZJRy9kJyAtZSAnL14jICMjIyBFTkQgTElCVE9PTCBDT05GSUcvLCRkJyAkcHJvZ3BhdGgKKyAgICAjIE5vdyBwcmludCB0aGUgY29uZmlndXJhdGlvbnMgZm9yIHRoZSB0YWdzLgorICAgIGZvciB0YWduYW1lIGluICR0YWdsaXN0OyBkbworICAgICAgJHtTRUR9IC1uIC1lICIvXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUkLywvXiMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lJC9wIiA8ICIkcHJvZ3BhdGgiCisgICAgZG9uZQorICAgIGV4aXQgJD8KKyAgICA7OworCisgIC0tZGVidWcpCisgICAgJGVjaG8gIiRwcm9nbmFtZTogZW5hYmxpbmcgc2hlbGwgdHJhY2UgbW9kZSIKKyAgICBzZXQgLXgKKyAgICBwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAkYXJnIgorICAgIDs7CisKKyAgLS1kcnktcnVuIHwgLW4pCisgICAgcnVuPToKKyAgICA7OworCisgIC0tZmVhdHVyZXMpCisgICAgJGVjaG8gImhvc3Q6ICRob3N0IgorICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisgICAgICAkZWNobyAiZW5hYmxlIHNoYXJlZCBsaWJyYXJpZXMiCisgICAgZWxzZQorICAgICAgJGVjaG8gImRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyIKKyAgICBmaQorICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgICRlY2hvICJlbmFibGUgc3RhdGljIGxpYnJhcmllcyIKKyAgICBlbHNlCisgICAgICAkZWNobyAiZGlzYWJsZSBzdGF0aWMgbGlicmFyaWVzIgorICAgIGZpCisgICAgZXhpdCAkPworICAgIDs7CisKKyAgLS1maW5pc2gpIG1vZGU9ImZpbmlzaCIgOzsKKworICAtLW1vZGUpIHByZXZvcHQ9Ii0tbW9kZSIgcHJldj1tb2RlIDs7CisgIC0tbW9kZT0qKSBtb2RlPSIkb3B0YXJnIiA7OworCisgIC0tcHJlc2VydmUtZHVwLWRlcHMpIGR1cGxpY2F0ZV9kZXBzPSJ5ZXMiIDs7CisKKyAgLS1xdWlldCB8IC0tc2lsZW50KQorICAgIHNob3c9OgorICAgIHByZXNlcnZlX2FyZ3M9IiRwcmVzZXJ2ZV9hcmdzICRhcmciCisgICAgOzsKKworICAtLXRhZykKKyAgICBwcmV2b3B0PSItLXRhZyIKKyAgICBwcmV2PXRhZworICAgIHByZXNlcnZlX2FyZ3M9IiRwcmVzZXJ2ZV9hcmdzIC0tdGFnIgorICAgIDs7CisgIC0tdGFnPSopCisgICAgc2V0IHRhZyAiJG9wdGFyZyIgJHsxKyIkQCJ9CisgICAgc2hpZnQKKyAgICBwcmV2PXRhZworICAgIHByZXNlcnZlX2FyZ3M9IiRwcmVzZXJ2ZV9hcmdzIC0tdGFnIgorICAgIDs7CisKKyAgLWRsb3BlbikKKyAgICBwcmV2b3B0PSItZGxvcGVuIgorICAgIHByZXY9ZXhlY3V0ZV9kbGZpbGVzCisgICAgOzsKKworICAtKikKKyAgICAkZWNobyAiJG1vZGVuYW1lOiB1bnJlY29nbml6ZWQgb3B0aW9uIFxgJGFyZyciIDE+JjIKKyAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgICA7OworCisgICopCisgICAgbm9ub3B0PSIkYXJnIgorICAgIGJyZWFrCisgICAgOzsKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkcHJldm9wdCI7IHRoZW4KKyAgJGVjaG8gIiRtb2RlbmFtZTogb3B0aW9uIFxgJHByZXZvcHQnIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCisgICRlY2hvICIkaGVscCIgMT4mMgorICBleGl0ICRFWElUX0ZBSUxVUkUKK2ZpCisKK2Nhc2UgJGRpc2FibGVfbGlicyBpbgorbm8pIAorICA7Oworc2hhcmVkKQorICBidWlsZF9saWJ0b29sX2xpYnM9bm8KKyAgYnVpbGRfb2xkX2xpYnM9eWVzCisgIDs7CitzdGF0aWMpCisgIGJ1aWxkX29sZF9saWJzPWBjYXNlICRidWlsZF9saWJ0b29sX2xpYnMgaW4geWVzKSBlY2hvIG5vOzsgKikgZWNobyB5ZXM7OyBlc2FjYAorICA7OworZXNhYworCisjIElmIHRoaXMgdmFyaWFibGUgaXMgc2V0IGluIGFueSBvZiB0aGUgYWN0aW9ucywgdGhlIGNvbW1hbmQgaW4gaXQKKyMgd2lsbCBiZSBleGVjZWQgYXQgdGhlIGVuZC4gIFRoaXMgcHJldmVudHMgaGVyZS1kb2N1bWVudHMgZnJvbSBiZWluZworIyBsZWZ0IG92ZXIgYnkgc2hlbGxzLgorZXhlY19jbWQ9CisKK2lmIHRlc3QgLXogIiRzaG93X2hlbHAiOyB0aGVuCisKKyAgIyBJbmZlciB0aGUgb3BlcmF0aW9uIG1vZGUuCisgIGlmIHRlc3QgLXogIiRtb2RlIjsgdGhlbgorICAgICRlY2hvICIqKiogV2FybmluZzogaW5mZXJyaW5nIHRoZSBtb2RlIG9mIG9wZXJhdGlvbiBpcyBkZXByZWNhdGVkLiIgMT4mMgorICAgICRlY2hvICIqKiogRnV0dXJlIHZlcnNpb25zIG9mIExpYnRvb2wgd2lsbCByZXF1aXJlIC0tbW9kZT1NT0RFIGJlIHNwZWNpZmllZC4iIDE+JjIKKyAgICBjYXNlICRub25vcHQgaW4KKyAgICAqY2MgfCBjYyogfCAqKysgfCBnY2MqIHwgKi1nY2MqIHwgZysrKiB8IHhsYyopCisgICAgICBtb2RlPWxpbmsKKyAgICAgIGZvciBhcmcKKyAgICAgIGRvCisJY2FzZSAkYXJnIGluCisJLWMpCisJICAgbW9kZT1jb21waWxlCisJICAgYnJlYWsKKwkgICA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgKmRiIHwgKmRieCB8ICpzdHJhY2UgfCAqdHJ1c3MpCisgICAgICBtb2RlPWV4ZWN1dGUKKyAgICAgIDs7CisgICAgKmluc3RhbGwqfGNwfG12KQorICAgICAgbW9kZT1pbnN0YWxsCisgICAgICA7OworICAgICpybSkKKyAgICAgIG1vZGU9dW5pbnN0YWxsCisgICAgICA7OworICAgICopCisgICAgICAjIElmIHdlIGhhdmUgbm8gbW9kZSwgYnV0IGRsZmlsZXMgd2VyZSBzcGVjaWZpZWQsIHRoZW4gZG8gZXhlY3V0ZSBtb2RlLgorICAgICAgdGVzdCAtbiAiJGV4ZWN1dGVfZGxmaWxlcyIgJiYgbW9kZT1leGVjdXRlCisKKyAgICAgICMgSnVzdCB1c2UgdGhlIGRlZmF1bHQgb3BlcmF0aW9uIG1vZGUuCisgICAgICBpZiB0ZXN0IC16ICIkbW9kZSI7IHRoZW4KKwlpZiB0ZXN0IC1uICIkbm9ub3B0IjsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IGluZmVyIG9wZXJhdGlvbiBtb2RlIGZyb20gXGAkbm9ub3B0JyIgMT4mMgorCWVsc2UKKwkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCBpbmZlciBvcGVyYXRpb24gbW9kZSB3aXRob3V0IE1PREUtQVJHUyIgMT4mMgorCWZpCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisKKyAgIyBPbmx5IGV4ZWN1dGUgbW9kZSBpcyBhbGxvd2VkIHRvIGhhdmUgLWRsb3BlbiBmbGFncy4KKyAgaWYgdGVzdCAtbiAiJGV4ZWN1dGVfZGxmaWxlcyIgJiYgdGVzdCAiJG1vZGUiICE9IGV4ZWN1dGU7IHRoZW4KKyAgICAkZWNobyAiJG1vZGVuYW1lOiB1bnJlY29nbml6ZWQgb3B0aW9uIFxgLWRsb3BlbiciIDE+JjIKKyAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgZmkKKworICAjIENoYW5nZSB0aGUgaGVscCBtZXNzYWdlIHRvIGEgbW9kZS1zcGVjaWZpYyBvbmUuCisgIGdlbmVyaWNfaGVscD0iJGhlbHAiCisgIGhlbHA9IlRyeSBcYCRtb2RlbmFtZSAtLWhlbHAgLS1tb2RlPSRtb2RlJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCisKKyAgIyBUaGVzZSBtb2RlcyBhcmUgaW4gb3JkZXIgb2YgZXhlY3V0aW9uIGZyZXF1ZW5jeSBzbyB0aGF0IHRoZXkgcnVuIHF1aWNrbHkuCisgIGNhc2UgJG1vZGUgaW4KKyAgIyBsaWJ0b29sIGNvbXBpbGUgbW9kZQorICBjb21waWxlKQorICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGNvbXBpbGUiCisgICAgIyBHZXQgdGhlIGNvbXBpbGF0aW9uIGNvbW1hbmQgYW5kIHRoZSBzb3VyY2UgZmlsZS4KKyAgICBiYXNlX2NvbXBpbGU9CisgICAgc3JjZmlsZT0iJG5vbm9wdCIgICMgIGFsd2F5cyBrZWVwIGEgbm9uLWVtcHR5IHZhbHVlIGluICJzcmNmaWxlIgorICAgIHN1cHByZXNzX29wdD15ZXMKKyAgICBzdXBwcmVzc19vdXRwdXQ9CisgICAgYXJnX21vZGU9bm9ybWFsCisgICAgbGlib2JqPQorICAgIGxhdGVyPQorCisgICAgZm9yIGFyZworICAgIGRvCisgICAgICBjYXNlICRhcmdfbW9kZSBpbgorICAgICAgYXJnICApCisJIyBkbyBub3QgImNvbnRpbnVlIi4gIEluc3RlYWQsIGFkZCB0aGlzIHRvIGJhc2VfY29tcGlsZQorCWxhc3Rhcmc9IiRhcmciCisJYXJnX21vZGU9bm9ybWFsCisJOzsKKworICAgICAgdGFyZ2V0ICkKKwlsaWJvYmo9IiRhcmciCisJYXJnX21vZGU9bm9ybWFsCisJY29udGludWUKKwk7OworCisgICAgICBub3JtYWwgKQorCSMgQWNjZXB0IGFueSBjb21tYW5kLWxpbmUgb3B0aW9ucy4KKwljYXNlICRhcmcgaW4KKwktbykKKwkgIGlmIHRlc3QgLW4gIiRsaWJvYmoiIDsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgY2Fubm90IHNwZWNpZnkgXGAtbycgbW9yZSB0aGFuIG9uY2UiIDE+JjIKKwkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICBmaQorCSAgYXJnX21vZGU9dGFyZ2V0CisJICBjb250aW51ZQorCSAgOzsKKworCS1zdGF0aWMgfCAtcHJlZmVyLXBpYyB8IC1wcmVmZXItbm9uLXBpYykKKwkgIGxhdGVyPSIkbGF0ZXIgJGFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCisJLW5vLXN1cHByZXNzKQorCSAgc3VwcHJlc3Nfb3B0PW5vCisJICBjb250aW51ZQorCSAgOzsKKworCS1YY29tcGlsZXIpCisJICBhcmdfbW9kZT1hcmcgICMgIHRoZSBuZXh0IG9uZSBnb2VzIGludG8gdGhlICJiYXNlX2NvbXBpbGUiIGFyZyBsaXN0CisJICBjb250aW51ZSAgICAgICMgIFRoZSBjdXJyZW50ICJzcmNmaWxlIiB3aWxsIGVpdGhlciBiZSByZXRhaW5lZCBvcgorCSAgOzsgICAgICAgICAgICAjICByZXBsYWNlZCBsYXRlci4gIEkgd291bGQgZ3Vlc3MgdGhhdCB3b3VsZCBiZSBhIGJ1Zy4KKworCS1XYywqKQorCSAgYXJncz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICJzL14tV2MsLy8iYAorCSAgbGFzdGFyZz0KKwkgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJworIAkgIGZvciBhcmcgaW4gJGFyZ3M7IGRvCisJICAgIElGUz0iJHNhdmVfaWZzIgorCisJICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBvdGhlciBzaGVsbCBtZXRhY2hhcmFjdGVycy4KKwkgICAgIyBNYW55IEJvdXJuZSBzaGVsbHMgY2Fubm90IGhhbmRsZSBjbG9zZSBicmFja2V0cyBjb3JyZWN0bHkKKwkgICAgIyBpbiBzY2FuIHNldHMsIHNvIHdlIHNwZWNpZnkgaXQgc2VwYXJhdGVseS4KKwkgICAgY2FzZSAkYXJnIGluCisJICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisJICAgICAgYXJnPSJcIiRhcmdcIiIKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIGxhc3Rhcmc9IiRsYXN0YXJnICRhcmciCisJICBkb25lCisJICBJRlM9IiRzYXZlX2lmcyIKKwkgIGxhc3Rhcmc9YCRlY2hvICJYJGxhc3RhcmciIHwgJFhzZWQgLWUgInMvXiAvLyJgCisKKwkgICMgQWRkIHRoZSBhcmd1bWVudHMgdG8gYmFzZV9jb21waWxlLgorCSAgYmFzZV9jb21waWxlPSIkYmFzZV9jb21waWxlICRsYXN0YXJnIgorCSAgY29udGludWUKKwkgIDs7CisKKwkqICkKKwkgICMgQWNjZXB0IHRoZSBjdXJyZW50IGFyZ3VtZW50IGFzIHRoZSBzb3VyY2UgZmlsZS4KKwkgICMgVGhlIHByZXZpb3VzICJzcmNmaWxlIiBiZWNvbWVzIHRoZSBjdXJyZW50IGFyZ3VtZW50LgorCSAgIworCSAgbGFzdGFyZz0iJHNyY2ZpbGUiCisJICBzcmNmaWxlPSIkYXJnIgorCSAgOzsKKwllc2FjICAjICBjYXNlICRhcmcKKwk7OworICAgICAgZXNhYyAgICAjICBjYXNlICRhcmdfbW9kZQorCisgICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgdGhlIHByZXZpb3VzIGFyZ3VtZW50LgorICAgICAgbGFzdGFyZz1gJGVjaG8gIlgkbGFzdGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisKKyAgICAgIGNhc2UgJGxhc3RhcmcgaW4KKyAgICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBvdGhlciBzaGVsbCBtZXRhY2hhcmFjdGVycy4KKyAgICAgICMgTWFueSBCb3VybmUgc2hlbGxzIGNhbm5vdCBoYW5kbGUgY2xvc2UgYnJhY2tldHMgY29ycmVjdGx5CisgICAgICAjIGluIHNjYW4gc2V0cywgYW5kIHNvbWUgU3VuT1Mga3NoIG1pc3RyZWF0IGJhY2tzbGFzaC1lc2NhcGluZworICAgICAgIyBpbiBzY2FuIHNldHMgKHdvcmtlZCBhcm91bmQgd2l0aCB2YXJpYWJsZSBleHBhbnNpb24pLAorICAgICAgIyBhbmQgZnVydGhlcm1vcmUgY2Fubm90IGhhbmRsZSAnfCcgJyYnICcoJyAnKScgaW4gc2NhbiBzZXRzIAorICAgICAgIyBhdCBhbGwsIHNvIHdlIHNwZWNpZnkgdGhlbSBzZXBhcmF0ZWx5LgorICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisJbGFzdGFyZz0iXCIkbGFzdGFyZ1wiIgorCTs7CisgICAgICBlc2FjCisKKyAgICAgIGJhc2VfY29tcGlsZT0iJGJhc2VfY29tcGlsZSAkbGFzdGFyZyIKKyAgICBkb25lICMgZm9yIGFyZworCisgICAgY2FzZSAkYXJnX21vZGUgaW4KKyAgICBhcmcpCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIGFyZ3VtZW50IGZvciAtWGNvbXBpbGUiCisgICAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgICAgIDs7CisgICAgdGFyZ2V0KQorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIHRhcmdldCB3aXRoIFxgLW8nIiAxPiYyCisgICAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgICAgIDs7CisgICAgKikKKyAgICAgICMgR2V0IHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IG9iamVjdC4KKyAgICAgIFsgLXogIiRsaWJvYmoiIF0gJiYgbGlib2JqPWAkZWNobyAiWCRzcmNmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgUmVjb2duaXplIHNldmVyYWwgZGlmZmVyZW50IGZpbGUgc3VmZml4ZXMuCisgICAgIyBJZiB0aGUgdXNlciBzcGVjaWZpZXMgLW8gZmlsZS5vLCBpdCBpcyByZXBsYWNlZCB3aXRoIGZpbGUubG8KKyAgICB4Zm9ybT0nW2NDRlNpZm1zb10nCisgICAgY2FzZSAkbGlib2JqIGluCisgICAgKi5hZGEpIHhmb3JtPWFkYSA7OworICAgICouYWRiKSB4Zm9ybT1hZGIgOzsKKyAgICAqLmFkcykgeGZvcm09YWRzIDs7CisgICAgKi5hc20pIHhmb3JtPWFzbSA7OworICAgICouYysrKSB4Zm9ybT1jKysgOzsKKyAgICAqLmNjKSB4Zm9ybT1jYyA7OworICAgICouaWkpIHhmb3JtPWlpIDs7CisgICAgKi5jbGFzcykgeGZvcm09Y2xhc3MgOzsKKyAgICAqLmNwcCkgeGZvcm09Y3BwIDs7CisgICAgKi5jeHgpIHhmb3JtPWN4eCA7OworICAgICouZjkwKSB4Zm9ybT1mOTAgOzsKKyAgICAqLmZvcikgeGZvcm09Zm9yIDs7CisgICAgKi5qYXZhKSB4Zm9ybT1qYXZhIDs7CisgICAgZXNhYworCisgICAgbGlib2JqPWAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgInMvXC4keGZvcm0kLy5sby8iYAorCisgICAgY2FzZSAkbGlib2JqIGluCisgICAgKi5sbykgb2JqPWAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgIiRsbzJvImAgOzsKKyAgICAqKQorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGRldGVybWluZSBuYW1lIG9mIGxpYnJhcnkgb2JqZWN0IGZyb20gXGAkbGlib2JqJyIgMT4mMgorICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgICA7OworICAgIGVzYWMKKworICAgIGZ1bmNfaW5mZXJfdGFnICRiYXNlX2NvbXBpbGUKKworICAgIGZvciBhcmcgaW4gJGxhdGVyOyBkbworICAgICAgY2FzZSAkYXJnIGluCisgICAgICAtc3RhdGljKQorCWJ1aWxkX29sZF9saWJzPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXByZWZlci1waWMpCisJcGljX21vZGU9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtcHJlZmVyLW5vbi1waWMpCisJcGljX21vZGU9bm8KKwljb250aW51ZQorCTs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgcWxpYm9iaj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICBjYXNlICRxbGlib2JqIGluCisgICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKwlxbGlib2JqPSJcIiRxbGlib2JqXCIiIDs7CisgICAgZXNhYworICAgIHRlc3QgIlgkbGlib2JqIiAhPSAiWCRxbGlib2JqIiBcCisJJiYgJGVjaG8gIlgkbGlib2JqIiB8IGdyZXAgJ1tdfiNeKnt9Ozw+PyInIiciJyAJJigpfGAkW10nIFwKKwkmJiAkZWNobyAiJG1vZGVuYW1lOiBsaWJvYmogbmFtZSBcYCRsaWJvYmonIG1heSBub3QgY29udGFpbiBzaGVsbCBzcGVjaWFsIGNoYXJhY3RlcnMuIgorICAgIG9iam5hbWU9YCRlY2hvICJYJG9iaiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorICAgIHhkaXI9YCRlY2hvICJYJG9iaiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorICAgIGlmIHRlc3QgIlgkeGRpciIgPSAiWCRvYmoiOyB0aGVuCisgICAgICB4ZGlyPQorICAgIGVsc2UKKyAgICAgIHhkaXI9JHhkaXIvCisgICAgZmkKKyAgICBsb2JqPSR7eGRpcn0kb2JqZGlyLyRvYmpuYW1lCisKKyAgICBpZiB0ZXN0IC16ICIkYmFzZV9jb21waWxlIjsgdGhlbgorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIGNvbXBpbGF0aW9uIGNvbW1hbmQiIDE+JjIKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgZmkKKworICAgICMgRGVsZXRlIGFueSBsZWZ0b3ZlciBsaWJyYXJ5IG9iamVjdHMuCisgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorICAgICAgcmVtb3ZlbGlzdD0iJG9iaiAkbG9iaiAkbGlib2JqICR7bGlib2JqfVQiCisgICAgZWxzZQorICAgICAgcmVtb3ZlbGlzdD0iJGxvYmogJGxpYm9iaiAke2xpYm9ian1UIgorICAgIGZpCisKKyAgICAkcnVuICRybSAkcmVtb3ZlbGlzdAorICAgIHRyYXAgIiRydW4gJHJtICRyZW1vdmVsaXN0OyBleGl0ICRFWElUX0ZBSUxVUkUiIDEgMiAxNQorCisgICAgIyBPbiBDeWd3aW4gdGhlcmUncyBubyAicmVhbCIgUElDIGZsYWcgc28gd2UgbXVzdCBidWlsZCBib3RoIG9iamVjdCB0eXBlcworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBvczIqKQorICAgICAgcGljX21vZGU9ZGVmYXVsdAorICAgICAgOzsKKyAgICBlc2FjCisgICAgaWYgdGVzdCAiJHBpY19tb2RlIiA9IG5vICYmIHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgIT0gcGFzc19hbGw7IHRoZW4KKyAgICAgICMgbm9uLVBJQyBjb2RlIGluIHNoYXJlZCBsaWJyYXJpZXMgaXMgbm90IHN1cHBvcnRlZAorICAgICAgcGljX21vZGU9ZGVmYXVsdAorICAgIGZpCisKKyAgICAjIENhbGN1bGF0ZSB0aGUgZmlsZW5hbWUgb2YgdGhlIG91dHB1dCBvYmplY3QgaWYgY29tcGlsZXIgZG9lcworICAgICMgbm90IHN1cHBvcnQgLW8gd2l0aCAtYworICAgIGlmIHRlc3QgIiRjb21waWxlcl9jX28iID0gbm87IHRoZW4KKyAgICAgIG91dHB1dF9vYmo9YCRlY2hvICJYJHNyY2ZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJyAtZSAncyVcLlteLl0qJCUlJ2AuJHtvYmpleHR9CisgICAgICBsb2NrZmlsZT0iJG91dHB1dF9vYmoubG9jayIKKyAgICAgIHJlbW92ZWxpc3Q9IiRyZW1vdmVsaXN0ICRvdXRwdXRfb2JqICRsb2NrZmlsZSIKKyAgICAgIHRyYXAgIiRydW4gJHJtICRyZW1vdmVsaXN0OyBleGl0ICRFWElUX0ZBSUxVUkUiIDEgMiAxNQorICAgIGVsc2UKKyAgICAgIG91dHB1dF9vYmo9CisgICAgICBuZWVkX2xvY2tzPW5vCisgICAgICBsb2NrZmlsZT0KKyAgICBmaQorCisgICAgIyBMb2NrIHRoaXMgY3JpdGljYWwgc2VjdGlvbiBpZiBpdCBpcyBuZWVkZWQKKyAgICAjIFdlIHVzZSB0aGlzIHNjcmlwdCBmaWxlIHRvIG1ha2UgdGhlIGxpbmssIGl0IGF2b2lkcyBjcmVhdGluZyBhIG5ldyBmaWxlCisgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0geWVzOyB0aGVuCisgICAgICB1bnRpbCAkcnVuIGxuICIkcHJvZ3BhdGgiICIkbG9ja2ZpbGUiIDI+L2Rldi9udWxsOyBkbworCSRzaG93ICJXYWl0aW5nIGZvciAkbG9ja2ZpbGUgdG8gYmUgcmVtb3ZlZCIKKwlzbGVlcCAyCisgICAgICBkb25lCisgICAgZWxpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB3YXJuOyB0aGVuCisgICAgICBpZiB0ZXN0IC1mICIkbG9ja2ZpbGUiOyB0aGVuCisJJGVjaG8gIlwKKyoqKiBFUlJPUiwgJGxvY2tmaWxlIGV4aXN0cyBhbmQgY29udGFpbnM6CitgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKKworVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQordGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoreW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQorcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgorYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKK2NvbXBpbGVyLiIKKworCSRydW4gJHJtICRyZW1vdmVsaXN0CisJZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgICBmaQorICAgICAgJGVjaG8gIiRzcmNmaWxlIiA+ICIkbG9ja2ZpbGUiCisgICAgZmkKKworICAgIGlmIHRlc3QgLW4gIiRmaXhfc3JjZmlsZV9wYXRoIjsgdGhlbgorICAgICAgZXZhbCBzcmNmaWxlPVwiJGZpeF9zcmNmaWxlX3BhdGhcIgorICAgIGZpCisgICAgcXNyY2ZpbGU9YCRlY2hvICJYJHNyY2ZpbGUiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgIGNhc2UgJHFzcmNmaWxlIGluCisgICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKyAgICAgIHFzcmNmaWxlPSJcIiRxc3JjZmlsZVwiIiA7OworICAgIGVzYWMKKworICAgICRydW4gJHJtICIkbGlib2JqIiAiJHtsaWJvYmp9VCIKKworICAgICMgQ3JlYXRlIGEgbGlidG9vbCBvYmplY3QgZmlsZSAoYW5hbG9nb3VzIHRvIGEgIi5sYSIgZmlsZSksCisgICAgIyBidXQgZG9uJ3QgY3JlYXRlIGl0IGlmIHdlJ3JlIGRvaW5nIGEgZHJ5IHJ1bi4KKyAgICB0ZXN0IC16ICIkcnVuIiAmJiBjYXQgPiAke2xpYm9ian1UIDw8RU9GCisjICRsaWJvYmogLSBhIGxpYnRvb2wgb2JqZWN0IGZpbGUKKyMgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIC0gR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUAorIworIyBQbGVhc2UgRE8gTk9UIGRlbGV0ZSB0aGlzIGZpbGUhCisjIEl0IGlzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyB0aGUgbGlicmFyeS4KKworIyBOYW1lIG9mIHRoZSBQSUMgb2JqZWN0LgorRU9GCisKKyAgICAjIE9ubHkgYnVpbGQgYSBQSUMgb2JqZWN0IGlmIHdlIGFyZSBidWlsZGluZyBsaWJ0b29sIGxpYnJhcmllcy4KKyAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorICAgICAgIyBXaXRob3V0IHRoaXMgYXNzaWdubWVudCwgYmFzZV9jb21waWxlIGdldHMgZW1wdGllZC4KKyAgICAgIGZic2RfaGlkZW91c19zaF9idWc9JGJhc2VfY29tcGlsZQorCisgICAgICBpZiB0ZXN0ICIkcGljX21vZGUiICE9IG5vOyB0aGVuCisJY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUgJHBpY19mbGFnIgorICAgICAgZWxzZQorCSMgRG9uJ3QgYnVpbGQgUElDIGNvZGUKKwljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgISAtZCAiJHt4ZGlyfSRvYmpkaXIiOyB0aGVuCisJJHNob3cgIiRta2RpciAke3hkaXJ9JG9iamRpciIKKwkkcnVuICRta2RpciAke3hkaXJ9JG9iamRpcgorCWV4aXRfc3RhdHVzPSQ/CisJaWYgdGVzdCAiJGV4aXRfc3RhdHVzIiAtbmUgMCAmJiB0ZXN0ICEgLWQgIiR7eGRpcn0kb2JqZGlyIjsgdGhlbgorCSAgZXhpdCAkZXhpdF9zdGF0dXMKKwlmaQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAteiAiJG91dHB1dF9vYmoiOyB0aGVuCisJIyBQbGFjZSBQSUMgb2JqZWN0cyBpbiAkb2JqZGlyCisJY29tbWFuZD0iJGNvbW1hbmQgLW8gJGxvYmoiCisgICAgICBmaQorCisgICAgICAkcnVuICRybSAiJGxvYmoiICIkb3V0cHV0X29iaiIKKworICAgICAgJHNob3cgIiRjb21tYW5kIgorICAgICAgaWYgJHJ1biBldmFsICIkY29tbWFuZCI7IHRoZW4gOgorICAgICAgZWxzZQorCXRlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiAkcnVuICRybSAkcmVtb3ZlbGlzdAorCWV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybiAmJgorCSB0ZXN0ICJYYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgIiAhPSAiWCRzcmNmaWxlIjsgdGhlbgorCSRlY2hvICJcCisqKiogRVJST1IsICRsb2NrZmlsZSBjb250YWluczoKK2BjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAorCitidXQgaXQgc2hvdWxkIGNvbnRhaW46Ciskc3JjZmlsZQorCitUaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCit0ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCit5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91CityZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCithdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgorY29tcGlsZXIuIgorCisJJHJ1biAkcm0gJHJlbW92ZWxpc3QKKwlleGl0ICRFWElUX0ZBSUxVUkUKKyAgICAgIGZpCisKKyAgICAgICMgSnVzdCBtb3ZlIHRoZSBvYmplY3QgaWYgbmVlZGVkLCB0aGVuIGdvIG9uIHRvIGNvbXBpbGUgdGhlIG5leHQgb25lCisgICAgICBpZiB0ZXN0IC1uICIkb3V0cHV0X29iaiIgJiYgdGVzdCAiWCRvdXRwdXRfb2JqIiAhPSAiWCRsb2JqIjsgdGhlbgorCSRzaG93ICIkbXYgJG91dHB1dF9vYmogJGxvYmoiCisJaWYgJHJ1biAkbXYgJG91dHB1dF9vYmogJGxvYmo7IHRoZW4gOgorCWVsc2UKKwkgIGVycm9yPSQ/CisJICAkcnVuICRybSAkcmVtb3ZlbGlzdAorCSAgZXhpdCAkZXJyb3IKKwlmaQorICAgICAgZmkKKworICAgICAgIyBBcHBlbmQgdGhlIG5hbWUgb2YgdGhlIFBJQyBvYmplY3QgdG8gdGhlIGxpYnRvb2wgb2JqZWN0IGZpbGUuCisgICAgICB0ZXN0IC16ICIkcnVuIiAmJiBjYXQgPj4gJHtsaWJvYmp9VCA8PEVPRgorcGljX29iamVjdD0nJG9iamRpci8kb2JqbmFtZScKKworRU9GCisKKyAgICAgICMgQWxsb3cgZXJyb3IgbWVzc2FnZXMgb25seSBmcm9tIHRoZSBmaXJzdCBjb21waWxhdGlvbi4KKyAgICAgIGlmIHRlc3QgIiRzdXBwcmVzc19vcHQiID0geWVzOyB0aGVuCisgICAgICAgIHN1cHByZXNzX291dHB1dD0nID4vZGV2L251bGwgMj4mMScKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgIyBObyBQSUMgb2JqZWN0IHNvIGluZGljYXRlIGl0IGRvZXNuJ3QgZXhpc3QgaW4gdGhlIGxpYnRvb2wKKyAgICAgICMgb2JqZWN0IGZpbGUuCisgICAgICB0ZXN0IC16ICIkcnVuIiAmJiBjYXQgPj4gJHtsaWJvYmp9VCA8PEVPRgorcGljX29iamVjdD1ub25lCisKK0VPRgorICAgIGZpCisKKyAgICAjIE9ubHkgYnVpbGQgYSBwb3NpdGlvbi1kZXBlbmRlbnQgb2JqZWN0IGlmIHdlIGJ1aWxkIG9sZCBsaWJyYXJpZXMuCisgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorICAgICAgaWYgdGVzdCAiJHBpY19tb2RlIiAhPSB5ZXM7IHRoZW4KKwkjIERvbid0IGJ1aWxkIFBJQyBjb2RlCisJY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUiCisgICAgICBlbHNlCisJY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUgJHBpY19mbGFnIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiRjb21waWxlcl9jX28iID0geWVzOyB0aGVuCisJY29tbWFuZD0iJGNvbW1hbmQgLW8gJG9iaiIKKyAgICAgIGZpCisKKyAgICAgICMgU3VwcHJlc3MgY29tcGlsZXIgb3V0cHV0IGlmIHdlIGFscmVhZHkgZGlkIGEgUElDIGNvbXBpbGF0aW9uLgorICAgICAgY29tbWFuZD0iJGNvbW1hbmQkc3VwcHJlc3Nfb3V0cHV0IgorICAgICAgJHJ1biAkcm0gIiRvYmoiICIkb3V0cHV0X29iaiIKKyAgICAgICRzaG93ICIkY29tbWFuZCIKKyAgICAgIGlmICRydW4gZXZhbCAiJGNvbW1hbmQiOyB0aGVuIDoKKyAgICAgIGVsc2UKKwkkcnVuICRybSAkcmVtb3ZlbGlzdAorCWV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybiAmJgorCSB0ZXN0ICJYYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgIiAhPSAiWCRzcmNmaWxlIjsgdGhlbgorCSRlY2hvICJcCisqKiogRVJST1IsICRsb2NrZmlsZSBjb250YWluczoKK2BjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAorCitidXQgaXQgc2hvdWxkIGNvbnRhaW46Ciskc3JjZmlsZQorCitUaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCit0ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCit5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91CityZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCithdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgorY29tcGlsZXIuIgorCisJJHJ1biAkcm0gJHJlbW92ZWxpc3QKKwlleGl0ICRFWElUX0ZBSUxVUkUKKyAgICAgIGZpCisKKyAgICAgICMgSnVzdCBtb3ZlIHRoZSBvYmplY3QgaWYgbmVlZGVkCisgICAgICBpZiB0ZXN0IC1uICIkb3V0cHV0X29iaiIgJiYgdGVzdCAiWCRvdXRwdXRfb2JqIiAhPSAiWCRvYmoiOyB0aGVuCisJJHNob3cgIiRtdiAkb3V0cHV0X29iaiAkb2JqIgorCWlmICRydW4gJG12ICRvdXRwdXRfb2JqICRvYmo7IHRoZW4gOgorCWVsc2UKKwkgIGVycm9yPSQ/CisJICAkcnVuICRybSAkcmVtb3ZlbGlzdAorCSAgZXhpdCAkZXJyb3IKKwlmaQorICAgICAgZmkKKworICAgICAgIyBBcHBlbmQgdGhlIG5hbWUgb2YgdGhlIG5vbi1QSUMgb2JqZWN0IHRoZSBsaWJ0b29sIG9iamVjdCBmaWxlLgorICAgICAgIyBPbmx5IGFwcGVuZCBpZiB0aGUgbGlidG9vbCBvYmplY3QgZmlsZSBleGlzdHMuCisgICAgICB0ZXN0IC16ICIkcnVuIiAmJiBjYXQgPj4gJHtsaWJvYmp9VCA8PEVPRgorIyBOYW1lIG9mIHRoZSBub24tUElDIG9iamVjdC4KK25vbl9waWNfb2JqZWN0PSckb2JqbmFtZScKKworRU9GCisgICAgZWxzZQorICAgICAgIyBBcHBlbmQgdGhlIG5hbWUgb2YgdGhlIG5vbi1QSUMgb2JqZWN0IHRoZSBsaWJ0b29sIG9iamVjdCBmaWxlLgorICAgICAgIyBPbmx5IGFwcGVuZCBpZiB0aGUgbGlidG9vbCBvYmplY3QgZmlsZSBleGlzdHMuCisgICAgICB0ZXN0IC16ICIkcnVuIiAmJiBjYXQgPj4gJHtsaWJvYmp9VCA8PEVPRgorIyBOYW1lIG9mIHRoZSBub24tUElDIG9iamVjdC4KK25vbl9waWNfb2JqZWN0PW5vbmUKKworRU9GCisgICAgZmkKKworICAgICRydW4gJG12ICIke2xpYm9ian1UIiAiJHtsaWJvYmp9IgorCisgICAgIyBVbmxvY2sgdGhlIGNyaXRpY2FsIHNlY3Rpb24gaWYgaXQgd2FzIGxvY2tlZAorICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgorICAgICAgJHJ1biAkcm0gIiRsb2NrZmlsZSIKKyAgICBmaQorCisgICAgZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgOzsKKworICAjIGxpYnRvb2wgbGluayBtb2RlCisgIGxpbmsgfCByZWxpbmspCisgICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogbGluayIKKyAgICBjYXNlICRob3N0IGluCisgICAgKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiopCisgICAgICAjIEl0IGlzIGltcG9zc2libGUgdG8gbGluayBhIGRsbCB3aXRob3V0IHRoaXMgc2V0dGluZywgYW5kCisgICAgICAjIHdlIHNob3VsZG4ndCBmb3JjZSB0aGUgbWFrZWZpbGUgbWFpbnRhaW5lciB0byBmaWd1cmUgb3V0CisgICAgICAjIHdoaWNoIHN5c3RlbSB3ZSBhcmUgY29tcGlsaW5nIGZvciBpbiBvcmRlciB0byBwYXNzIGFuIGV4dHJhCisgICAgICAjIGZsYWcgZm9yIGV2ZXJ5IGxpYnRvb2wgaW52b2NhdGlvbi4KKyAgICAgICMgYWxsb3dfdW5kZWZpbmVkPW5vCisKKyAgICAgICMgRklYTUU6IFVuZm9ydHVuYXRlbHksIHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIHRoZSBhYm92ZSB3aGVuIHRyeWluZworICAgICAgIyB0byBtYWtlIGEgZGxsIHdoaWNoIGhhcyB1bmRlZmluZWQgc3ltYm9scywgaW4gd2hpY2ggY2FzZSBub3QKKyAgICAgICMgZXZlbiBhIHN0YXRpYyBsaWJyYXJ5IGlzIGJ1aWx0LiAgRm9yIG5vdywgd2UgbmVlZCB0byBzcGVjaWZ5CisgICAgICAjIC1uby11bmRlZmluZWQgb24gdGhlIGxpYnRvb2wgbGluayBsaW5lIHdoZW4gd2UgY2FuIGJlIGNlcnRhaW4KKyAgICAgICMgdGhhdCBhbGwgc3ltYm9scyBhcmUgc2F0aXNmaWVkLCBvdGhlcndpc2Ugd2UgZ2V0IGEgc3RhdGljIGxpYnJhcnkuCisgICAgICBhbGxvd191bmRlZmluZWQ9eWVzCisgICAgICA7OworICAgICopCisgICAgICBhbGxvd191bmRlZmluZWQ9eWVzCisgICAgICA7OworICAgIGVzYWMKKyAgICBsaWJ0b29sX2FyZ3M9IiRub25vcHQiCisgICAgYmFzZV9jb21waWxlPSIkbm9ub3B0ICRAIgorICAgIGNvbXBpbGVfY29tbWFuZD0iJG5vbm9wdCIKKyAgICBmaW5hbGl6ZV9jb21tYW5kPSIkbm9ub3B0IgorCisgICAgY29tcGlsZV9ycGF0aD0KKyAgICBmaW5hbGl6ZV9ycGF0aD0KKyAgICBjb21waWxlX3NobGlicGF0aD0KKyAgICBmaW5hbGl6ZV9zaGxpYnBhdGg9CisgICAgY29udmVuaWVuY2U9CisgICAgb2xkX2NvbnZlbmllbmNlPQorICAgIGRlcGxpYnM9CisgICAgb2xkX2RlcGxpYnM9CisgICAgY29tcGlsZXJfZmxhZ3M9CisgICAgbGlua2VyX2ZsYWdzPQorICAgIGRsbHNlYXJjaHBhdGg9CisgICAgbGliX3NlYXJjaF9wYXRoPWBwd2RgCisgICAgaW5zdF9wcmVmaXhfZGlyPQorCisgICAgYXZvaWRfdmVyc2lvbj1ubworICAgIGRsZmlsZXM9CisgICAgZGxwcmVmaWxlcz0KKyAgICBkbHNlbGY9bm8KKyAgICBleHBvcnRfZHluYW1pYz1ubworICAgIGV4cG9ydF9zeW1ib2xzPQorICAgIGV4cG9ydF9zeW1ib2xzX3JlZ2V4PQorICAgIGdlbmVyYXRlZD0KKyAgICBsaWJvYmpzPQorICAgIGx0bGlicz0KKyAgICBtb2R1bGU9bm8KKyAgICBub19pbnN0YWxsPW5vCisgICAgb2Jqcz0KKyAgICBub25fcGljX29iamVjdHM9CisgICAgbm90aW5zdF9wYXRoPSAjIHBhdGhzIHRoYXQgY29udGFpbiBub3QtaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCisgICAgcHJlY2lvdXNfZmlsZXNfcmVnZXg9CisgICAgcHJlZmVyX3N0YXRpY19saWJzPW5vCisgICAgcHJlbG9hZD1ubworICAgIHByZXY9CisgICAgcHJldmFyZz0KKyAgICByZWxlYXNlPQorICAgIHJwYXRoPQorICAgIHhycGF0aD0KKyAgICBwZXJtX3JwYXRoPQorICAgIHRlbXBfcnBhdGg9CisgICAgdGhyZWFkX3NhZmU9bm8KKyAgICB2aW5mbz0KKyAgICB2aW5mb19udW1iZXI9bm8KKworICAgIGZ1bmNfaW5mZXJfdGFnICRiYXNlX2NvbXBpbGUKKworICAgICMgV2UgbmVlZCB0byBrbm93IC1zdGF0aWMsIHRvIGdldCB0aGUgcmlnaHQgb3V0cHV0IGZpbGVuYW1lcy4KKyAgICBmb3IgYXJnCisgICAgZG8KKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgLWFsbC1zdGF0aWMgfCAtc3RhdGljKQorCWlmIHRlc3QgIlgkYXJnIiA9ICJYLWFsbC1zdGF0aWMiOyB0aGVuCisJICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0IC16ICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY29tcGxldGUgc3RhdGljIGxpbmtpbmcgaXMgaW1wb3NzaWJsZSBpbiB0aGlzIGNvbmZpZ3VyYXRpb24iIDE+JjIKKwkgIGZpCisJICBpZiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKwkgICAgZGxvcGVuX3NlbGY9JGRsb3Blbl9zZWxmX3N0YXRpYworCSAgZmkKKwkgIHByZWZlcl9zdGF0aWNfbGlicz15ZXMKKwllbHNlCisJICBpZiB0ZXN0IC16ICIkcGljX2ZsYWciICYmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorCSAgICBkbG9wZW5fc2VsZj0kZGxvcGVuX3NlbGZfc3RhdGljCisJICBmaQorCSAgcHJlZmVyX3N0YXRpY19saWJzPWJ1aWx0CisJZmkKKwlidWlsZF9saWJ0b29sX2xpYnM9bm8KKwlidWlsZF9vbGRfbGlicz15ZXMKKwlicmVhaworCTs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgIyBTZWUgaWYgb3VyIHNoYXJlZCBhcmNoaXZlcyBkZXBlbmQgb24gc3RhdGljIGFyY2hpdmVzLgorICAgIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiBidWlsZF9vbGRfbGlicz15ZXMKKworICAgICMgR28gdGhyb3VnaCB0aGUgYXJndW1lbnRzLCB0cmFuc2Zvcm1pbmcgdGhlbSBvbiB0aGUgd2F5LgorICAgIHdoaWxlIHRlc3QgIiQjIiAtZ3QgMDsgZG8KKyAgICAgIGFyZz0iJDEiCisgICAgICBzaGlmdAorICAgICAgY2FzZSAkYXJnIGluCisgICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKwlxYXJnPVwiYCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgXCIgIyMjIHRlc3RzdWl0ZTogc2tpcCBuZXN0ZWQgcXVvdGluZyB0ZXN0CisJOzsKKyAgICAgICopIHFhcmc9JGFyZyA7OworICAgICAgZXNhYworICAgICAgbGlidG9vbF9hcmdzPSIkbGlidG9vbF9hcmdzICRxYXJnIgorCisgICAgICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgorCWNhc2UgJHByZXYgaW4KKwlvdXRwdXQpCisJICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgQE9VVFBVVEAiCisJICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCBAT1VUUFVUQCIKKwkgIDs7CisJZXNhYworCisJY2FzZSAkcHJldiBpbgorCWRsZmlsZXN8ZGxwcmVmaWxlcykKKwkgIGlmIHRlc3QgIiRwcmVsb2FkIiA9IG5vOyB0aGVuCisJICAgICMgQWRkIHRoZSBzeW1ib2wgb2JqZWN0IGludG8gdGhlIGxpbmtpbmcgY29tbWFuZHMuCisJICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCBAU1lNRklMRUAiCisJICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIEBTWU1GSUxFQCIKKwkgICAgcHJlbG9hZD15ZXMKKwkgIGZpCisJICBjYXNlICRhcmcgaW4KKwkgICoubGEgfCAqLmxvKSA7OyAgIyBXZSBoYW5kbGUgdGhlc2UgY2FzZXMgYmVsb3cuCisJICBmb3JjZSkKKwkgICAgaWYgdGVzdCAiJGRsc2VsZiIgPSBubzsgdGhlbgorCSAgICAgIGRsc2VsZj1uZWVkbGVzcworCSAgICAgIGV4cG9ydF9keW5hbWljPXllcworCSAgICBmaQorCSAgICBwcmV2PQorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgc2VsZikKKwkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgorCSAgICAgIGRsc2VsZj15ZXMKKwkgICAgZWxpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzICYmIHRlc3QgIiRkbG9wZW5fc2VsZiIgIT0geWVzOyB0aGVuCisJICAgICAgZGxzZWxmPXllcworCSAgICBlbHNlCisJICAgICAgZGxzZWxmPW5lZWRsZXNzCisJICAgICAgZXhwb3J0X2R5bmFtaWM9eWVzCisJICAgIGZpCisJICAgIHByZXY9CisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICAqKQorCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJICAgICAgZGxmaWxlcz0iJGRsZmlsZXMgJGFyZyIKKwkgICAgZWxzZQorCSAgICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRhcmciCisJICAgIGZpCisJICAgIHByZXY9CisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICBlc2FjCisJICA7OworCWV4cHN5bXMpCisJICBleHBvcnRfc3ltYm9scz0iJGFyZyIKKwkgIGlmIHRlc3QgISAtZiAiJGFyZyI7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogc3ltYm9sIGZpbGUgXGAkYXJnJyBkb2VzIG5vdCBleGlzdCIKKwkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICBmaQorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCWV4cHN5bXNfcmVnZXgpCisJICBleHBvcnRfc3ltYm9sc19yZWdleD0iJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlpbnN0X3ByZWZpeCkKKwkgIGluc3RfcHJlZml4X2Rpcj0iJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlwcmVjaW91c19yZWdleCkKKwkgIHByZWNpb3VzX2ZpbGVzX3JlZ2V4PSIkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCXJlbGVhc2UpCisJICByZWxlYXNlPSItJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlvYmplY3RsaXN0KQorCSAgaWYgdGVzdCAtZiAiJGFyZyI7IHRoZW4KKwkgICAgc2F2ZV9hcmc9JGFyZworCSAgICBtb3JlYXJncz0KKwkgICAgZm9yIGZpbCBpbiBgY2F0ICRzYXZlX2FyZ2AKKwkgICAgZG8KKyMJICAgICAgbW9yZWFyZ3M9IiRtb3JlYXJncyAkZmlsIgorCSAgICAgIGFyZz0kZmlsCisJICAgICAgIyBBIGxpYnRvb2wtY29udHJvbGxlZCBvYmplY3QuCisKKwkgICAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBvYmplY3QuCisJICAgICAgaWYgKCR7U0VEfSAtZSAnMnEnICRhcmcgfCBncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlwaWNfb2JqZWN0PQorCQlub25fcGljX29iamVjdD0KKworCQkjIFJlYWQgdGhlIC5sbyBmaWxlCisJCSMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgorCQljYXNlICRhcmcgaW4KKwkJKi8qIHwgKlxcKikgLiAkYXJnIDs7CisJCSopIC4gLi8kYXJnIDs7CisJCWVzYWMKKworCQlpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwgXAorCQkgICB0ZXN0IC16ICIkbm9uX3BpY19vYmplY3QiIHx8CisJCSAgIHRlc3QgIiRwaWNfb2JqZWN0IiA9IG5vbmUgJiYgXAorCQkgICB0ZXN0ICIkbm9uX3BpY19vYmplY3QiID0gbm9uZTsgdGhlbgorCQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIG5hbWUgb2Ygb2JqZWN0IGZvciBcYCRhcmcnIiAxPiYyCisJCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisJCWZpCisKKwkJIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KKwkJeGRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisJCWlmIHRlc3QgIlgkeGRpciIgPSAiWCRhcmciOyB0aGVuCisJCSAgeGRpcj0KKwkJZWxzZQorCQkgIHhkaXI9IiR4ZGlyLyIKKwkJZmkKKworCQlpZiB0ZXN0ICIkcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgorCQkgICMgUHJlcGVuZCB0aGUgc3ViZGlyZWN0b3J5IHRoZSBvYmplY3QgaXMgZm91bmQgaW4uCisJCSAgcGljX29iamVjdD0iJHhkaXIkcGljX29iamVjdCIKKworCQkgIGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KKwkJICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgPSB5ZXM7IHRoZW4KKwkJICAgICAgZGxmaWxlcz0iJGRsZmlsZXMgJHBpY19vYmplY3QiCisJCSAgICAgIHByZXY9CisJCSAgICAgIGNvbnRpbnVlCisJCSAgICBlbHNlCisJCSAgICAgICMgSWYgbGlidG9vbCBvYmplY3RzIGFyZSB1bnN1cHBvcnRlZCwgdGhlbiB3ZSBuZWVkIHRvIHByZWxvYWQuCisJCSAgICAgIHByZXY9ZGxwcmVmaWxlcworCQkgICAgZmkKKwkJICBmaQorCisJCSAgIyBDSEVDSyBNRTogIEkgdGhpbmsgSSBidXN0ZWQgdGhpcy4gIC1Pc3NhbWEKKwkJICBpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCisJCSAgICAjIFByZWxvYWQgdGhlIG9sZC1zdHlsZSBvYmplY3QuCisJCSAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkcGljX29iamVjdCIKKwkJICAgIHByZXY9CisJCSAgZmkKKworCQkgICMgQSBQSUMgb2JqZWN0LgorCQkgIGxpYm9ianM9IiRsaWJvYmpzICRwaWNfb2JqZWN0IgorCQkgIGFyZz0iJHBpY19vYmplY3QiCisJCWZpCisKKwkJIyBOb24tUElDIG9iamVjdC4KKwkJaWYgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCisJCSAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KKwkJICBub25fcGljX29iamVjdD0iJHhkaXIkbm9uX3BpY19vYmplY3QiCisKKwkJICAjIEEgc3RhbmRhcmQgbm9uLVBJQyBvYmplY3QKKwkJICBub25fcGljX29iamVjdHM9IiRub25fcGljX29iamVjdHMgJG5vbl9waWNfb2JqZWN0IgorCQkgIGlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fCB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lIDsgdGhlbgorCQkgICAgYXJnPSIkbm9uX3BpY19vYmplY3QiCisJCSAgZmkKKwkJZWxzZQorCQkgICMgSWYgdGhlIFBJQyBvYmplY3QgZXhpc3RzLCB1c2UgaXQgaW5zdGVhZC4KKwkJICAjICR4ZGlyIHdhcyBwcmVwZW5kZWQgdG8gJHBpY19vYmplY3QgYWJvdmUuCisJCSAgbm9uX3BpY19vYmplY3Q9IiRwaWNfb2JqZWN0IgorCQkgIG5vbl9waWNfb2JqZWN0cz0iJG5vbl9waWNfb2JqZWN0cyAkbm9uX3BpY19vYmplY3QiCisJCWZpCisJICAgICAgZWxzZQorCQkjIE9ubHkgYW4gZXJyb3IgaWYgbm90IGRvaW5nIGEgZHJ5LXJ1bi4KKwkJaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KKwkJICAkZWNobyAiJG1vZGVuYW1lOiBcYCRhcmcnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgb2JqZWN0IiAxPiYyCisJCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisJCWVsc2UKKwkJICAjIERyeS1ydW4gY2FzZS4KKworCQkgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCisJCSAgeGRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisJCSAgaWYgdGVzdCAiWCR4ZGlyIiA9ICJYJGFyZyI7IHRoZW4KKwkJICAgIHhkaXI9CisJCSAgZWxzZQorCQkgICAgeGRpcj0iJHhkaXIvIgorCQkgIGZpCisKKwkJICBwaWNfb2JqZWN0PWAkZWNobyAiWCR7eGRpcn0ke29iamRpcn0vJHthcmd9IiB8ICRYc2VkIC1lICIkbG8ybyJgCisJCSAgbm9uX3BpY19vYmplY3Q9YCRlY2hvICJYJHt4ZGlyfSR7YXJnfSIgfCAkWHNlZCAtZSAiJGxvMm8iYAorCQkgIGxpYm9ianM9IiRsaWJvYmpzICRwaWNfb2JqZWN0IgorCQkgIG5vbl9waWNfb2JqZWN0cz0iJG5vbl9waWNfb2JqZWN0cyAkbm9uX3BpY19vYmplY3QiCisJCWZpCisJICAgICAgZmkKKwkgICAgZG9uZQorCSAgZWxzZQorCSAgICAkZWNobyAiJG1vZGVuYW1lOiBsaW5rIGlucHV0IGZpbGUgXGAkc2F2ZV9hcmcnIGRvZXMgbm90IGV4aXN0IgorCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgIGZpCisJICBhcmc9JHNhdmVfYXJnCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJcnBhdGggfCB4cnBhdGgpCisJICAjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KKwkgIGNhc2UgJGFyZyBpbgorCSAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OworCSAgKikKKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogb25seSBhYnNvbHV0ZSBydW4tcGF0aHMgYXJlIGFsbG93ZWQiIDE+JjIKKwkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICAgIDs7CisJICBlc2FjCisJICBpZiB0ZXN0ICIkcHJldiIgPSBycGF0aDsgdGhlbgorCSAgICBjYXNlICIkcnBhdGggIiBpbgorCSAgICAqIiAkYXJnICIqKSA7OworCSAgICAqKSBycGF0aD0iJHJwYXRoICRhcmciIDs7CisJICAgIGVzYWMKKwkgIGVsc2UKKwkgICAgY2FzZSAiJHhycGF0aCAiIGluCisJICAgICoiICRhcmcgIiopIDs7CisJICAgICopIHhycGF0aD0iJHhycGF0aCAkYXJnIiA7OworCSAgICBlc2FjCisJICBmaQorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCXhjb21waWxlcikKKwkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHFhcmciCisJICBwcmV2PQorCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRxYXJnIgorCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJHFhcmciCisJICBjb250aW51ZQorCSAgOzsKKwl4bGlua2VyKQorCSAgbGlua2VyX2ZsYWdzPSIkbGlua2VyX2ZsYWdzICRxYXJnIgorCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkd2wkcWFyZyIKKwkgIHByZXY9CisJICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJHdsJHFhcmciCisJICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkd2wkcWFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCXhjY2xpbmtlcikKKwkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkcWFyZyIKKwkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHFhcmciCisJICBwcmV2PQorCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRxYXJnIgorCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJHFhcmciCisJICBjb250aW51ZQorCSAgOzsKKwlzaHJleHQpCisgIAkgIHNocmV4dF9jbWRzPSIkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCWRhcndpbl9mcmFtZXdvcmt8ZGFyd2luX2ZyYW1ld29ya19za2lwKQorCSAgdGVzdCAiJHByZXYiID0gImRhcndpbl9mcmFtZXdvcmsiICYmIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGFyZyIKKwkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgorCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwkqKQorCSAgZXZhbCAiJHByZXY9XCJcJGFyZ1wiIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCWVzYWMKKyAgICAgIGZpICMgdGVzdCAtbiAiJHByZXYiCisKKyAgICAgIHByZXZhcmc9IiRhcmciCisKKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgLWFsbC1zdGF0aWMpCisJaWYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCisJICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkbGlua19zdGF0aWNfZmxhZyIKKwlmaQorCWNvbnRpbnVlCisJOzsKKworICAgICAgLWFsbG93LXVuZGVmaW5lZCkKKwkjIEZJWE1FOiByZW1vdmUgdGhpcyBmbGFnIHNvbWV0aW1lIGluIHRoZSBmdXR1cmUuCisJJGVjaG8gIiRtb2RlbmFtZTogXGAtYWxsb3ctdW5kZWZpbmVkJyBpcyBkZXByZWNhdGVkIGJlY2F1c2UgaXQgaXMgdGhlIGRlZmF1bHQiIDE+JjIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1hdm9pZC12ZXJzaW9uKQorCWF2b2lkX3ZlcnNpb249eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtZGxvcGVuKQorCXByZXY9ZGxmaWxlcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWRscHJlb3BlbikKKwlwcmV2PWRscHJlZmlsZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1leHBvcnQtZHluYW1pYykKKwlleHBvcnRfZHluYW1pYz15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1leHBvcnQtc3ltYm9scyB8IC1leHBvcnQtc3ltYm9scy1yZWdleCkKKwlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IG1vcmUgdGhhbiBvbmUgLWV4cG9ydGVkLXN5bWJvbHMgYXJndW1lbnQgaXMgbm90IGFsbG93ZWQiCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwlmaQorCWlmIHRlc3QgIlgkYXJnIiA9ICJYLWV4cG9ydC1zeW1ib2xzIjsgdGhlbgorCSAgcHJldj1leHBzeW1zCisJZWxzZQorCSAgcHJldj1leHBzeW1zX3JlZ2V4CisJZmkKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1mcmFtZXdvcmt8LWFyY2h8LWlzeXNyb290KQorCWNhc2UgIiAkQ0MgIiBpbgorCSAgKiIgJHthcmd9ICR7MX0gIiogfCAqIiAke2FyZ30JJHsxfSAiKikgCisJCXByZXY9ZGFyd2luX2ZyYW1ld29ya19za2lwIDs7CisJICAqKSBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRhcmciCisJICAgICBwcmV2PWRhcndpbl9mcmFtZXdvcmsgOzsKKwllc2FjCisJY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCisJZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1pbnN0LXByZWZpeC1kaXIpCisJcHJldj1pbnN0X3ByZWZpeAorCWNvbnRpbnVlCisJOzsKKworICAgICAgIyBUaGUgbmF0aXZlIElSSVggbGlua2VyIHVuZGVyc3RhbmRzIC1MQU5HOiosIC1MSVNUOiogYW5kIC1MTk86KgorICAgICAgIyBzbywgaWYgd2Ugc2VlIHRoZXNlIGZsYWdzIGJlIGNhcmVmdWwgbm90IHRvIHRyZWF0IHRoZW0gbGlrZSAtTAorICAgICAgLUxbQS1aXVtBLVpdKjoqKQorCWNhc2UgJHdpdGhfZ2NjLyRob3N0IGluCisJbm8vKi0qLWlyaXgqIHwgLyotKi1pcml4KikKKwkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgorCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKKwkgIDs7CisJZXNhYworCWNvbnRpbnVlCisJOzsKKworICAgICAgLUwqKQorCWRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzL14tTC8vJ2AKKwkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KKwljYXNlICRkaXIgaW4KKwlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7CisJKikKKwkgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKKwkgIGlmIHRlc3QgLXogIiRhYnNkaXIiOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkZGlyJyIgMT4mMgorCSAgICBhYnNkaXI9IiRkaXIiCisJICAgIG5vdGluc3RfcGF0aD0iJG5vdGluc3RfcGF0aCAkZGlyIgorCSAgZmkKKwkgIGRpcj0iJGFic2RpciIKKwkgIDs7CisJZXNhYworCWNhc2UgIiRkZXBsaWJzICIgaW4KKwkqIiAtTCRkaXIgIiopIDs7CisJKikKKwkgIGRlcGxpYnM9IiRkZXBsaWJzIC1MJGRpciIKKwkgIGxpYl9zZWFyY2hfcGF0aD0iJGxpYl9zZWFyY2hfcGF0aCAkZGlyIgorCSAgOzsKKwllc2FjCisJY2FzZSAkaG9zdCBpbgorCSotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqKQorCSAgdGVzdGJpbmRpcj1gJGVjaG8gIlgkZGlyIiB8ICRYc2VkIC1lICdzKi9saWIkKi9iaW4qJ2AKKwkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgorCSAgKiI6JGRpcjoiKikgOzsKKwkgICopIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hwYXRoOiRkaXIiOzsKKwkgIGVzYWMKKwkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgorCSAgKiI6JHRlc3RiaW5kaXI6IiopIDs7CisJICAqKSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNocGF0aDokdGVzdGJpbmRpciI7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisJY29udGludWUKKwk7OworCisgICAgICAtbCopCisJaWYgdGVzdCAiWCRhcmciID0gIlgtbGMiIHx8IHRlc3QgIlgkYXJnIiA9ICJYLWxtIjsgdGhlbgorCSAgY2FzZSAkaG9zdCBpbgorCSAgKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLWJlb3MqKQorCSAgICAjIFRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIEMgb3IgbWF0aCBsaWJyYXJ5IChhcyBzdWNoKQorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgKi0qLW9zMiopCisJICAgICMgVGhlc2Ugc3lzdGVtcyBkb24ndCBhY3R1YWxseSBoYXZlIGEgQyBsaWJyYXJ5IChhcyBzdWNoKQorCSAgICB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgJiYgY29udGludWUKKwkgICAgOzsKKwkgICotKi1vcGVuYnNkKiB8ICotKi1mcmVlYnNkKiB8ICotKi1kcmFnb25mbHkqKQorCSAgICAjIERvIG5vdCBpbmNsdWRlIGxpYmMgZHVlIHRvIHVzIGhhdmluZyBsaWJjL2xpYmNfci4KKwkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCisJICAgIDs7CisJICAqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCisJICAgICMgUmhhcHNvZHkgQyBhbmQgbWF0aCBsaWJyYXJpZXMgYXJlIGluIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCisJICAgIGRlcGxpYnM9IiRkZXBsaWJzIC1mcmFtZXdvcmsgU3lzdGVtIgorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgKi0qLXNjbzMuMnY1KiB8ICotKi1zY281djYqKQorCSAgICAjIENhdXNlcyBwcm9ibGVtcyB3aXRoIF9fY3R5cGUKKwkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCisJICAgIDs7CisJICAqLSotc3lzdjQuMnV3MiogfCAqLSotc3lzdjUqIHwgKi0qLXVuaXh3YXJlKiB8ICotKi1PcGVuVU5JWCopCisJICAgICMgQ29tcGlsZXIgaW5zZXJ0cyBsaWJjIGluIHRoZSBjb3JyZWN0IHBsYWNlIGZvciB0aHJlYWRzIHRvIHdvcmsKKwkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCisJICAgIDs7CisJICBlc2FjCisJZWxpZiB0ZXN0ICJYJGFyZyIgPSAiWC1sY19yIjsgdGhlbgorCSBjYXNlICRob3N0IGluCisJICotKi1vcGVuYnNkKiB8ICotKi1mcmVlYnNkKiB8ICotKi1kcmFnb25mbHkqKQorCSAgICMgRG8gbm90IGluY2x1ZGUgbGliY19yIGRpcmVjdGx5LCB1c2UgLXB0aHJlYWQgZmxhZy4KKwkgICBjb250aW51ZQorCSAgIDs7CisJIGVzYWMKKwlmaQorCWRlcGxpYnM9IiRkZXBsaWJzICRhcmciCisJY29udGludWUKKwk7OworCisgICAgICAjIFRydTY0IFVOSVggdXNlcyAtbW9kZWwgW2FyZ10gdG8gZGV0ZXJtaW5lIHRoZSBsYXlvdXQgb2YgQysrCisgICAgICAjIGNsYXNzZXMsIG5hbWUgbWFuZ2xpbmcsIGFuZCBleGNlcHRpb24gaGFuZGxpbmcuCisgICAgICAtbW9kZWwpCisJY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCisJY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkYXJnIgorCWZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCisJcHJldj14Y29tcGlsZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgLW10fC1tdGhyZWFkc3wta3RocmVhZHwtS3RocmVhZHwtcHRocmVhZHwtcHRocmVhZHN8LS10aHJlYWQtc2FmZSkKKwljb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRhcmciCisJY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCisJZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1tb2R1bGUpCisJbW9kdWxlPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgIyAtNjQsIC1taXBzWzAtOV0gZW5hYmxlIDY0LWJpdCBtb2RlIG9uIHRoZSBTR0kgY29tcGlsZXIKKyAgICAgICMgLXJbMC05XVswLTldKiBzcGVjaWZpZXMgdGhlIHByb2Nlc3NvciBvbiB0aGUgU0dJIGNvbXBpbGVyCisgICAgICAjIC14YXJjaD0qLCAteHRhcmdldD0qIGVuYWJsZSA2NC1iaXQgbW9kZSBvbiB0aGUgU3VuIGNvbXBpbGVyCisgICAgICAjICtEQSosICtERCogZW5hYmxlIDY0LWJpdCBtb2RlIG9uIHRoZSBIUCBjb21waWxlcgorICAgICAgIyAtcSogcGFzcyB0aHJvdWdoIGNvbXBpbGVyIGFyZ3MgZm9yIHRoZSBJQk0gY29tcGlsZXIKKyAgICAgICMgLW0qIHBhc3MgdGhyb3VnaCBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgY29tcGlsZXIgYXJncyBmb3IgR0NDCisgICAgICAjIC1tKiwgLXRbNDVdKiwgLXR4c2NhbGUqIHBhc3MgdGhyb3VnaCBhcmNoaXRlY3R1cmUtc3BlY2lmaWMKKyAgICAgICMgY29tcGlsZXIgYXJncyBmb3IgR0NDCisgICAgICAjIC1wZyBwYXNzIHRocm91Z2ggcHJvZmlsaW5nIGZsYWcgZm9yIEdDQworICAgICAgIyBAZmlsZSBHQ0MgcmVzcG9uc2UgZmlsZXMKKyAgICAgIC02NHwtbWlwc1swLTldfC1yWzAtOV1bMC05XSp8LXhhcmNoPSp8LXh0YXJnZXQ9KnwrREEqfCtERCp8LXEqfC1tKnwtcGd8IFwKKyAgICAgIC10WzQ1XSp8LXR4c2NhbGUqfEAqKQorCisJIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCisJIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KKwlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisJY2FzZSAkYXJnIGluCisJKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisJICBhcmc9IlwiJGFyZ1wiIgorCSAgOzsKKwllc2FjCisgICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgorICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgorICAgICAgICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRhcmciCisgICAgICAgIGNvbnRpbnVlCisgICAgICAgIDs7CisKKyAgICAgIC1zaHJleHQpCisJcHJldj1zaHJleHQKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1uby1mYXN0LWluc3RhbGwpCisJZmFzdF9pbnN0YWxsPW5vCisJY29udGludWUKKwk7OworCisgICAgICAtbm8taW5zdGFsbCkKKwljYXNlICRob3N0IGluCisJKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiopCisJICAjIFRoZSBQQVRIIGhhY2tlcnkgaW4gd3JhcHBlciBzY3JpcHRzIGlzIHJlcXVpcmVkIG9uIFdpbmRvd3MKKwkgICMgaW4gb3JkZXIgZm9yIHRoZSBsb2FkZXIgdG8gZmluZCBhbnkgZGxscyBpdCBuZWVkcy4KKwkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLW5vLWluc3RhbGwnIGlzIGlnbm9yZWQgZm9yICRob3N0IiAxPiYyCisJICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBhc3N1bWluZyBcYC1uby1mYXN0LWluc3RhbGwnIGluc3RlYWQiIDE+JjIKKwkgIGZhc3RfaW5zdGFsbD1ubworCSAgOzsKKwkqKSBub19pbnN0YWxsPXllcyA7OworCWVzYWMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1uby11bmRlZmluZWQpCisJYWxsb3dfdW5kZWZpbmVkPW5vCisJY29udGludWUKKwk7OworCisgICAgICAtb2JqZWN0bGlzdCkKKwlwcmV2PW9iamVjdGxpc3QKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1vKSBwcmV2PW91dHB1dCA7OworCisgICAgICAtcHJlY2lvdXMtZmlsZXMtcmVnZXgpCisJcHJldj1wcmVjaW91c19yZWdleAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLXJlbGVhc2UpCisJcHJldj1yZWxlYXNlCisJY29udGludWUKKwk7OworCisgICAgICAtcnBhdGgpCisJcHJldj1ycGF0aAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLVIpCisJcHJldj14cnBhdGgKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1SKikKKwlkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncy9eLVIvLydgCisJIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCisJY2FzZSAkZGlyIGluCisJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OworCSopCisJICAkZWNobyAiJG1vZGVuYW1lOiBvbmx5IGFic29sdXRlIHJ1bi1wYXRocyBhcmUgYWxsb3dlZCIgMT4mMgorCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICA7OworCWVzYWMKKwljYXNlICIkeHJwYXRoICIgaW4KKwkqIiAkZGlyICIqKSA7OworCSopIHhycGF0aD0iJHhycGF0aCAkZGlyIiA7OworCWVzYWMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1zdGF0aWMpCisJIyBUaGUgZWZmZWN0cyBvZiAtc3RhdGljIGFyZSBkZWZpbmVkIGluIGEgcHJldmlvdXMgbG9vcC4KKwkjIFdlIHVzZWQgdG8gZG8gdGhlIHNhbWUgYXMgLWFsbC1zdGF0aWMgb24gcGxhdGZvcm1zIHRoYXQKKwkjIGRpZG4ndCBoYXZlIGEgUElDIGZsYWcsIGJ1dCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBlZmZlY3RzCisJIyB3b3VsZCBiZSBlcXVpdmFsZW50IHdhcyB3cm9uZy4gIEl0IHdvdWxkIGJyZWFrIG9uIGF0IGxlYXN0CisJIyBEaWdpdGFsIFVuaXggYW5kIEFJWC4KKwljb250aW51ZQorCTs7CisKKyAgICAgIC10aHJlYWQtc2FmZSkKKwl0aHJlYWRfc2FmZT15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC12ZXJzaW9uLWluZm8pCisJcHJldj12aW5mbworCWNvbnRpbnVlCisJOzsKKyAgICAgIC12ZXJzaW9uLW51bWJlcikKKwlwcmV2PXZpbmZvCisJdmluZm9fbnVtYmVyPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLVdjLCopCisJYXJncz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0IiAtZSAncy9eLVdjLC8vJ2AKKwlhcmc9CisJc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JywnCisJZm9yIGZsYWcgaW4gJGFyZ3M7IGRvCisJICBJRlM9IiRzYXZlX2lmcyIKKwkgIGNhc2UgJGZsYWcgaW4KKwkgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisJICAgIGZsYWc9IlwiJGZsYWdcIiIKKwkgICAgOzsKKwkgIGVzYWMKKwkgIGFyZz0iJGFyZyAkd2wkZmxhZyIKKwkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGZsYWciCisJZG9uZQorCUlGUz0iJHNhdmVfaWZzIgorCWFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICJzL14gLy8iYAorCTs7CisKKyAgICAgIC1XbCwqKQorCWFyZ3M9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCIgLWUgJ3MvXi1XbCwvLydgCisJYXJnPQorCXNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJworCWZvciBmbGFnIGluICRhcmdzOyBkbworCSAgSUZTPSIkc2F2ZV9pZnMiCisJICBjYXNlICRmbGFnIGluCisJICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorCSAgICBmbGFnPSJcIiRmbGFnXCIiCisJICAgIDs7CisJICBlc2FjCisJICBhcmc9IiRhcmcgJHdsJGZsYWciCisJICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICR3bCRmbGFnIgorCSAgbGlua2VyX2ZsYWdzPSIkbGlua2VyX2ZsYWdzICRmbGFnIgorCWRvbmUKKwlJRlM9IiRzYXZlX2lmcyIKKwlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAicy9eIC8vImAKKwk7OworCisgICAgICAtWGNvbXBpbGVyKQorCXByZXY9eGNvbXBpbGVyCisJY29udGludWUKKwk7OworCisgICAgICAtWGxpbmtlcikKKwlwcmV2PXhsaW5rZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1YQ0NsaW5rZXIpCisJcHJldj14Y2NsaW5rZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBmbGFnLgorICAgICAgLSogfCArKikKKwkjIFVua25vd24gYXJndW1lbnRzIGluIGJvdGggZmluYWxpemVfY29tbWFuZCBhbmQgY29tcGlsZV9jb21tYW5kIG5lZWQKKwkjIHRvIGJlIGFlc3RoZXRpY2FsbHkgcXVvdGVkIGJlY2F1c2UgdGhleSBhcmUgZXZhbGVkIGxhdGVyLgorCWFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKwljYXNlICRhcmcgaW4KKwkqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKwkgIGFyZz0iXCIkYXJnXCIiCisJICA7OworCWVzYWMKKwk7OworCisgICAgICAqLiRvYmpleHQpCisJIyBBIHN0YW5kYXJkIG9iamVjdC4KKwlvYmpzPSIkb2JqcyAkYXJnIgorCTs7CisKKyAgICAgICoubG8pCisJIyBBIGxpYnRvb2wtY29udHJvbGxlZCBvYmplY3QuCisKKwkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBvYmplY3QuCisJaWYgKCR7U0VEfSAtZSAnMnEnICRhcmcgfCBncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgcGljX29iamVjdD0KKwkgIG5vbl9waWNfb2JqZWN0PQorCisJICAjIFJlYWQgdGhlIC5sbyBmaWxlCisJICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KKwkgIGNhc2UgJGFyZyBpbgorCSAgKi8qIHwgKlxcKikgLiAkYXJnIDs7CisJICAqKSAuIC4vJGFyZyA7OworCSAgZXNhYworCisJICBpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwgXAorCSAgICAgdGVzdCAteiAiJG5vbl9waWNfb2JqZWN0IiB8fAorCSAgICAgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSAmJiBcCisJICAgICB0ZXN0ICIkbm9uX3BpY19vYmplY3QiID0gbm9uZTsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBuYW1lIG9mIG9iamVjdCBmb3IgXGAkYXJnJyIgMT4mMgorCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgIGZpCisKKwkgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCisJICB4ZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKKwkgIGlmIHRlc3QgIlgkeGRpciIgPSAiWCRhcmciOyB0aGVuCisJICAgIHhkaXI9CisgCSAgZWxzZQorCSAgICB4ZGlyPSIkeGRpci8iCisJICBmaQorCisJICBpZiB0ZXN0ICIkcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgorCSAgICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgorCSAgICBwaWNfb2JqZWN0PSIkeGRpciRwaWNfb2JqZWN0IgorCisJICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0geWVzOyB0aGVuCisJCWRsZmlsZXM9IiRkbGZpbGVzICRwaWNfb2JqZWN0IgorCQlwcmV2PQorCQljb250aW51ZQorCSAgICAgIGVsc2UKKwkJIyBJZiBsaWJ0b29sIG9iamVjdHMgYXJlIHVuc3VwcG9ydGVkLCB0aGVuIHdlIG5lZWQgdG8gcHJlbG9hZC4KKwkJcHJldj1kbHByZWZpbGVzCisJICAgICAgZmkKKwkgICAgZmkKKworCSAgICAjIENIRUNLIE1FOiAgSSB0aGluayBJIGJ1c3RlZCB0aGlzLiAgLU9zc2FtYQorCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCisJICAgICAgIyBQcmVsb2FkIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgorCSAgICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRwaWNfb2JqZWN0IgorCSAgICAgIHByZXY9CisJICAgIGZpCisKKwkgICAgIyBBIFBJQyBvYmplY3QuCisJICAgIGxpYm9ianM9IiRsaWJvYmpzICRwaWNfb2JqZWN0IgorCSAgICBhcmc9IiRwaWNfb2JqZWN0IgorCSAgZmkKKworCSAgIyBOb24tUElDIG9iamVjdC4KKwkgIGlmIHRlc3QgIiRub25fcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgorCSAgICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgorCSAgICBub25fcGljX29iamVjdD0iJHhkaXIkbm9uX3BpY19vYmplY3QiCisKKwkgICAgIyBBIHN0YW5kYXJkIG5vbi1QSUMgb2JqZWN0CisJICAgIG5vbl9waWNfb2JqZWN0cz0iJG5vbl9waWNfb2JqZWN0cyAkbm9uX3BpY19vYmplY3QiCisJICAgIGlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fCB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lIDsgdGhlbgorCSAgICAgIGFyZz0iJG5vbl9waWNfb2JqZWN0IgorCSAgICBmaQorCSAgZWxzZQorCSAgICAjIElmIHRoZSBQSUMgb2JqZWN0IGV4aXN0cywgdXNlIGl0IGluc3RlYWQuCisJICAgICMgJHhkaXIgd2FzIHByZXBlbmRlZCB0byAkcGljX29iamVjdCBhYm92ZS4KKwkgICAgbm9uX3BpY19vYmplY3Q9IiRwaWNfb2JqZWN0IgorCSAgICBub25fcGljX29iamVjdHM9IiRub25fcGljX29iamVjdHMgJG5vbl9waWNfb2JqZWN0IgorCSAgZmkKKwllbHNlCisJICAjIE9ubHkgYW4gZXJyb3IgaWYgbm90IGRvaW5nIGEgZHJ5LXJ1bi4KKwkgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJGFyZycgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBvYmplY3QiIDE+JjIKKwkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICBlbHNlCisJICAgICMgRHJ5LXJ1biBjYXNlLgorCisJICAgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCisJICAgIHhkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorCSAgICBpZiB0ZXN0ICJYJHhkaXIiID0gIlgkYXJnIjsgdGhlbgorCSAgICAgIHhkaXI9CisJICAgIGVsc2UKKwkgICAgICB4ZGlyPSIkeGRpci8iCisJICAgIGZpCisKKwkgICAgcGljX29iamVjdD1gJGVjaG8gIlgke3hkaXJ9JHtvYmpkaXJ9LyR7YXJnfSIgfCAkWHNlZCAtZSAiJGxvMm8iYAorCSAgICBub25fcGljX29iamVjdD1gJGVjaG8gIlgke3hkaXJ9JHthcmd9IiB8ICRYc2VkIC1lICIkbG8ybyJgCisJICAgIGxpYm9ianM9IiRsaWJvYmpzICRwaWNfb2JqZWN0IgorCSAgICBub25fcGljX29iamVjdHM9IiRub25fcGljX29iamVjdHMgJG5vbl9waWNfb2JqZWN0IgorCSAgZmkKKwlmaQorCTs7CisKKyAgICAgICouJGxpYmV4dCkKKwkjIEFuIGFyY2hpdmUuCisJZGVwbGlicz0iJGRlcGxpYnMgJGFyZyIKKwlvbGRfZGVwbGlicz0iJG9sZF9kZXBsaWJzICRhcmciCisJY29udGludWUKKwk7OworCisgICAgICAqLmxhKQorCSMgQSBsaWJ0b29sLWNvbnRyb2xsZWQgbGlicmFyeS4KKworCWlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KKwkgICMgVGhpcyBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxvcGVuLgorCSAgZGxmaWxlcz0iJGRsZmlsZXMgJGFyZyIKKwkgIHByZXY9CisJZWxpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCisJICAjIFRoZSBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxwcmVvcGVuLgorCSAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGFyZyIKKwkgIHByZXY9CisJZWxzZQorCSAgZGVwbGlicz0iJGRlcGxpYnMgJGFyZyIKKwlmaQorCWNvbnRpbnVlCisJOzsKKworICAgICAgIyBTb21lIG90aGVyIGNvbXBpbGVyIGFyZ3VtZW50LgorICAgICAgKikKKwkjIFVua25vd24gYXJndW1lbnRzIGluIGJvdGggZmluYWxpemVfY29tbWFuZCBhbmQgY29tcGlsZV9jb21tYW5kIG5lZWQKKwkjIHRvIGJlIGFlc3RoZXRpY2FsbHkgcXVvdGVkIGJlY2F1c2UgdGhleSBhcmUgZXZhbGVkIGxhdGVyLgorCWFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKwljYXNlICRhcmcgaW4KKwkqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKwkgIGFyZz0iXCIkYXJnXCIiCisJICA7OworCWVzYWMKKwk7OworICAgICAgZXNhYyAjIGFyZworCisgICAgICAjIE5vdyBhY3R1YWxseSBzdWJzdGl0dXRlIHRoZSBhcmd1bWVudCBpbnRvIHRoZSBjb21tYW5kcy4KKyAgICAgIGlmIHRlc3QgLW4gIiRhcmciOyB0aGVuCisJY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCisJZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKKyAgICAgIGZpCisgICAgZG9uZSAjIGFyZ3VtZW50IHBhcnNpbmcgbG9vcAorCisgICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB0aGUgXGAkcHJldmFyZycgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCisgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorICAgIGZpCisKKyAgICBpZiB0ZXN0ICIkZXhwb3J0X2R5bmFtaWMiID0geWVzICYmIHRlc3QgLW4gIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWMiOyB0aGVuCisgICAgICBldmFsIGFyZz1cIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNcIgorICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCisgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgorICAgIGZpCisKKyAgICBvbGRsaWJzPQorICAgICMgY2FsY3VsYXRlIHRoZSBuYW1lIG9mIHRoZSBmaWxlLCB3aXRob3V0IGl0cyBkaXJlY3RvcnkKKyAgICBvdXRwdXRuYW1lPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKyAgICBsaWJvYmpzX3NhdmU9IiRsaWJvYmpzIgorCisgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisgICAgICAjIGdldCB0aGUgZGlyZWN0b3JpZXMgbGlzdGVkIGluICRzaGxpYnBhdGhfdmFyCisgICAgICBldmFsIHNobGliX3NlYXJjaF9wYXRoPVxgXCRlY2hvIFwiWFwkeyRzaGxpYnBhdGhfdmFyfVwiIFx8IFwkWHNlZCAtZSBcJ3MvOi8gL2dcJ1xgCisgICAgZWxzZQorICAgICAgc2hsaWJfc2VhcmNoX3BhdGg9CisgICAgZmkKKyAgICBldmFsIHN5c19saWJfc2VhcmNoX3BhdGg9XCIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjXCIKKyAgICBldmFsIHN5c19saWJfZGxzZWFyY2hfcGF0aD1cIiRzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlY1wiCisKKyAgICBvdXRwdXRfb2JqZGlyPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKKyAgICBpZiB0ZXN0ICJYJG91dHB1dF9vYmpkaXIiID0gIlgkb3V0cHV0IjsgdGhlbgorICAgICAgb3V0cHV0X29iamRpcj0iJG9iamRpciIKKyAgICBlbHNlCisgICAgICBvdXRwdXRfb2JqZGlyPSIkb3V0cHV0X29iamRpci8kb2JqZGlyIgorICAgIGZpCisgICAgIyBDcmVhdGUgdGhlIG9iamVjdCBkaXJlY3RvcnkuCisgICAgaWYgdGVzdCAhIC1kICIkb3V0cHV0X29iamRpciI7IHRoZW4KKyAgICAgICRzaG93ICIkbWtkaXIgJG91dHB1dF9vYmpkaXIiCisgICAgICAkcnVuICRta2RpciAkb3V0cHV0X29iamRpcgorICAgICAgZXhpdF9zdGF0dXM9JD8KKyAgICAgIGlmIHRlc3QgIiRleGl0X3N0YXR1cyIgLW5lIDAgJiYgdGVzdCAhIC1kICIkb3V0cHV0X29iamRpciI7IHRoZW4KKwlleGl0ICRleGl0X3N0YXR1cworICAgICAgZmkKKyAgICBmaQorCisgICAgIyBEZXRlcm1pbmUgdGhlIHR5cGUgb2Ygb3V0cHV0CisgICAgY2FzZSAkb3V0cHV0IGluCisgICAgIiIpCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIG91dHB1dCBmaWxlIiAxPiYyCisgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgOzsKKyAgICAqLiRsaWJleHQpIGxpbmttb2RlPW9sZGxpYiA7OworICAgICoubG8gfCAqLiRvYmpleHQpIGxpbmttb2RlPW9iaiA7OworICAgICoubGEpIGxpbmttb2RlPWxpYiA7OworICAgICopIGxpbmttb2RlPXByb2cgOzsgIyBBbnl0aGluZyBlbHNlIHNob3VsZCBiZSBhIHByb2dyYW0uCisgICAgZXNhYworCisgICAgY2FzZSAkaG9zdCBpbgorICAgICpjeWd3aW4qIHwgKm1pbmd3KiB8ICpwdzMyKikKKyAgICAgICMgZG9uJ3QgZWxpbWluYXRlIGR1cGxpY2F0aW9ucyBpbiAkcG9zdGRlcHMgYW5kICRwcmVkZXBzCisgICAgICBkdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHM9eWVzCisgICAgICA7OworICAgICopCisgICAgICBkdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHM9JGR1cGxpY2F0ZV9kZXBzCisgICAgICA7OworICAgIGVzYWMKKyAgICBzcGVjaWFsZGVwbGlicz0KKworICAgIGxpYnM9CisgICAgIyBGaW5kIGFsbCBpbnRlcmRlcGVuZGVudCBkZXBsaWJzIGJ5IHNlYXJjaGluZyBmb3IgbGlicmFyaWVzCisgICAgIyB0aGF0IGFyZSBsaW5rZWQgbW9yZSB0aGFuIG9uY2UgKGUuZy4gLWxhIC1sYiAtbGEpCisgICAgZm9yIGRlcGxpYiBpbiAkZGVwbGliczsgZG8KKyAgICAgIGlmIHRlc3QgIlgkZHVwbGljYXRlX2RlcHMiID0gIlh5ZXMiIDsgdGhlbgorCWNhc2UgIiRsaWJzICIgaW4KKwkqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGxpYnM9IiRsaWJzICRkZXBsaWIiCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYjsgdGhlbgorICAgICAgbGlicz0iJHByZWRlcHMgJGxpYnMgJGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCAkcG9zdGRlcHMiCisKKyAgICAgICMgQ29tcHV0ZSBsaWJyYXJpZXMgdGhhdCBhcmUgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGluICRwcmVkZXBzCisgICAgICAjICRwb3N0ZGVwcyBhbmQgbWFyayB0aGVtIGFzIHNwZWNpYWwgKGkuZS4sIHdob3NlIGR1cGxpY2F0ZXMgYXJlCisgICAgICAjIG5vdCB0byBiZSBlbGltaW5hdGVkKS4KKyAgICAgIHByZV9wb3N0X2RlcHM9CisgICAgICBpZiB0ZXN0ICJYJGR1cGxpY2F0ZV9jb21waWxlcl9nZW5lcmF0ZWRfZGVwcyIgPSAiWHllcyIgOyB0aGVuCisJZm9yIHByZV9wb3N0X2RlcCBpbiAkcHJlZGVwcyAkcG9zdGRlcHM7IGRvCisJICBjYXNlICIkcHJlX3Bvc3RfZGVwcyAiIGluCisJICAqIiAkcHJlX3Bvc3RfZGVwICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRwcmVfcG9zdF9kZXBzIiA7OworCSAgZXNhYworCSAgcHJlX3Bvc3RfZGVwcz0iJHByZV9wb3N0X2RlcHMgJHByZV9wb3N0X2RlcCIKKwlkb25lCisgICAgICBmaQorICAgICAgcHJlX3Bvc3RfZGVwcz0KKyAgICBmaQorCisgICAgZGVwbGlicz0KKyAgICBuZXdkZXBlbmRlbmN5X2xpYnM9CisgICAgbmV3bGliX3NlYXJjaF9wYXRoPQorICAgIG5lZWRfcmVsaW5rPW5vICMgd2hldGhlciB3ZSdyZSBsaW5raW5nIGFueSB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcworICAgIG5vdGluc3RfZGVwbGlicz0gIyBub3QtaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCisgICAgY2FzZSAkbGlua21vZGUgaW4KKyAgICBsaWIpCisJcGFzc2VzPSJjb252IGxpbmsiCisJZm9yIGZpbGUgaW4gJGRsZmlsZXMgJGRscHJlZmlsZXM7IGRvCisJICBjYXNlICRmaWxlIGluCisJICAqLmxhKSA7OworCSAgKikKKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogbGlicmFyaWVzIGNhbiBcYC1kbG9wZW4nIG9ubHkgbGlidG9vbCBsaWJyYXJpZXM6ICRmaWxlIiAxPiYyCisJICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgICA7OworCSAgZXNhYworCWRvbmUKKwk7OworICAgIHByb2cpCisJY29tcGlsZV9kZXBsaWJzPQorCWZpbmFsaXplX2RlcGxpYnM9CisJYWxsZGVwbGlicz1ubworCW5ld2RsZmlsZXM9CisJbmV3ZGxwcmVmaWxlcz0KKwlwYXNzZXM9ImNvbnYgc2NhbiBkbG9wZW4gZGxwcmVvcGVuIGxpbmsiCisJOzsKKyAgICAqKSAgcGFzc2VzPSJjb252IgorCTs7CisgICAgZXNhYworICAgIGZvciBwYXNzIGluICRwYXNzZXM7IGRvCisgICAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixsaW5rIiB8fAorCSB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csc2NhbiI7IHRoZW4KKwlsaWJzPSIkZGVwbGlicyIKKwlkZXBsaWJzPQorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJY2FzZSAkcGFzcyBpbgorCWRsb3BlbikgbGlicz0iJGRsZmlsZXMiIDs7CisJZGxwcmVvcGVuKSBsaWJzPSIkZGxwcmVmaWxlcyIgOzsKKwlsaW5rKSBsaWJzPSIkZGVwbGlicyAlREVQTElCUyUgJGRlcGVuZGVuY3lfbGlicyIgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHBhc3MiID0gZGxvcGVuOyB0aGVuCisJIyBDb2xsZWN0IGRscHJlb3BlbmVkIGxpYnJhcmllcworCXNhdmVfZGVwbGlicz0iJGRlcGxpYnMiCisJZGVwbGlicz0KKyAgICAgIGZpCisgICAgICBmb3IgZGVwbGliIGluICRsaWJzOyBkbworCWxpYj0KKwlmb3VuZD1ubworCWNhc2UgJGRlcGxpYiBpbgorCS1tdHwtbXRocmVhZHN8LWt0aHJlYWR8LUt0aHJlYWR8LXB0aHJlYWR8LXB0aHJlYWRzfC0tdGhyZWFkLXNhZmUpCisJICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCisJICBlbHNlCisJICAgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGRlcGxpYiIKKwkgIGZpCisJICBjb250aW51ZQorCSAgOzsKKwktbCopCisJICBpZiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYiAmJiB0ZXN0ICIkbGlua21vZGUiICE9IHByb2c7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtbCcgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMvb2JqZWN0cyIgMT4mMgorCSAgICBjb250aW51ZQorCSAgZmkKKwkgIG5hbWU9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLWwvLydgCisJICBmb3Igc2VhcmNoZGlyIGluICRuZXdsaWJfc2VhcmNoX3BhdGggJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGg7IGRvCisJICAgIGZvciBzZWFyY2hfZXh0IGluIC5sYSAkc3RkX3NocmV4dCAuc28gLmE7IGRvCisJICAgICAgIyBTZWFyY2ggdGhlIGxpYnRvb2wgbGlicmFyeQorCSAgICAgIGxpYj0iJHNlYXJjaGRpci9saWIke25hbWV9JHtzZWFyY2hfZXh0fSIKKwkgICAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgorCQlpZiB0ZXN0ICIkc2VhcmNoX2V4dCIgPSAiLmxhIjsgdGhlbgorCQkgIGZvdW5kPXllcworCQllbHNlCisJCSAgZm91bmQ9bm8KKwkJZmkKKwkJYnJlYWsgMgorCSAgICAgIGZpCisJICAgIGRvbmUKKwkgIGRvbmUKKwkgIGlmIHRlc3QgIiRmb3VuZCIgIT0geWVzOyB0aGVuCisJICAgICMgZGVwbGliIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGxpYnRvb2wgbGlicmFyeQorCSAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgICB0ZXN0ICIkbGlua21vZGUiID0gbGliICYmIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgICBmaQorCSAgICBjb250aW51ZQorCSAgZWxzZSAjIGRlcGxpYiBpcyBhIGxpYnRvb2wgbGlicmFyeQorCSAgICAjIElmICRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMgJiYgJGRlcGxpYiBpcyBhIHN0ZGxpYiwKKwkgICAgIyBXZSBuZWVkIHRvIGRvIHNvbWUgc3BlY2lhbCB0aGluZ3MgaGVyZSwgYW5kIG5vdCBsYXRlci4KKwkgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCSAgICAgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgorCSAgICAgICoiICRkZXBsaWIgIiopCisJCWlmICgke1NFRH0gLWUgJzJxJyAkbGliIHwKKyAgICAgICAgICAgICAgICAgICAgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJICBsaWJyYXJ5X25hbWVzPQorCQkgIG9sZF9saWJyYXJ5PQorCQkgIGNhc2UgJGxpYiBpbgorCQkgICovKiB8ICpcXCopIC4gJGxpYiA7OworCQkgICopIC4gLi8kbGliIDs7CisJCSAgZXNhYworCQkgIGZvciBsIGluICRvbGRfbGlicmFyeSAkbGlicmFyeV9uYW1lczsgZG8KKwkJICAgIGxsPSIkbCIKKwkJICBkb25lCisJCSAgaWYgdGVzdCAiWCRsbCIgPSAiWCRvbGRfbGlicmFyeSIgOyB0aGVuICMgb25seSBzdGF0aWMgdmVyc2lvbiBhdmFpbGFibGUKKwkJICAgIGZvdW5kPW5vCisJCSAgICBsYWRpcj1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisJCSAgICB0ZXN0ICJYJGxhZGlyIiA9ICJYJGxpYiIgJiYgbGFkaXI9Ii4iCisJCSAgICBsaWI9JGxhZGlyLyRvbGRfbGlicmFyeQorCQkgICAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCisJCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgorCQkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCQkgICAgZWxzZQorCQkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCQkgICAgICB0ZXN0ICIkbGlua21vZGUiID0gbGliICYmIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCQkgICAgZmkKKwkJICAgIGNvbnRpbnVlCisJCSAgZmkKKwkJZmkKKwkgICAgICAgIDs7CisJICAgICAgKikgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBmaQorCSAgOzsgIyAtbAorCS1MKikKKwkgIGNhc2UgJGxpbmttb2RlIGluCisJICBsaWIpCisJICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIHRlc3QgIiRwYXNzIiA9IGNvbnYgJiYgY29udGludWUKKwkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCisJICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAiYCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLUwvLydgCisJICAgIDs7CisJICBwcm9nKQorCSAgICBpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgICBjb250aW51ZQorCSAgICBmaQorCSAgICBpZiB0ZXN0ICIkcGFzcyIgPSBzY2FuOyB0aGVuCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCisJICAgIGZpCisJICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAiYCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLUwvLydgCisJICAgIDs7CisJICAqKQorCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1MJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcy9vYmplY3RzIiAxPiYyCisJICAgIDs7CisJICBlc2FjICMgbGlua21vZGUKKwkgIGNvbnRpbnVlCisJICA7OyAjIC1MCisJLVIqKQorCSAgaWYgdGVzdCAiJHBhc3MiID0gbGluazsgdGhlbgorCSAgICBkaXI9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLVIvLydgCisJICAgICMgTWFrZSBzdXJlIHRoZSB4cnBhdGggY29udGFpbnMgb25seSB1bmlxdWUgZGlyZWN0b3JpZXMuCisJICAgIGNhc2UgIiR4cnBhdGggIiBpbgorCSAgICAqIiAkZGlyICIqKSA7OworCSAgICAqKSB4cnBhdGg9IiR4cnBhdGggJGRpciIgOzsKKwkgICAgZXNhYworCSAgZmkKKwkgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICBjb250aW51ZQorCSAgOzsKKwkqLmxhKSBsaWI9IiRkZXBsaWIiIDs7CisJKi4kbGliZXh0KQorCSAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgorCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICBjb250aW51ZQorCSAgZmkKKwkgIGNhc2UgJGxpbmttb2RlIGluCisJICBsaWIpCisJICAgIHZhbGlkX2FfbGliPW5vCisJICAgIGNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCisJICAgICAgbWF0Y2hfcGF0dGVybiopCisJCXNldCBkdW1teSAkZGVwbGlic19jaGVja19tZXRob2QKKwkgICAgICAgIG1hdGNoX3BhdHRlcm5fcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiJDIgXCguKlwpImAKKwkJaWYgZXZhbCAkZWNobyBcIiRkZXBsaWJcIiAyPi9kZXYvbnVsbCBcCisJCSAgICB8ICRTRUQgMTBxIFwKKwkJICAgIHwgJEVHUkVQICIkbWF0Y2hfcGF0dGVybl9yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkJICB2YWxpZF9hX2xpYj15ZXMKKwkJZmkKKwkJOzsKKwkgICAgICBwYXNzX2FsbCkKKwkJdmFsaWRfYV9saWI9eWVzCisJCTs7CisgICAgICAgICAgICBlc2FjCisJICAgIGlmIHRlc3QgIiR2YWxpZF9hX2xpYiIgIT0geWVzOyB0aGVuCisJICAgICAgJGVjaG8KKwkgICAgICAkZWNobyAiKioqIFdhcm5pbmc6IFRyeWluZyB0byBsaW5rIHdpdGggc3RhdGljIGxpYiBhcmNoaXZlICRkZXBsaWIuIgorCSAgICAgICRlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCSAgICAgICRlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgorCSAgICAgICRlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCisJICAgICAgJGVjaG8gIioqKiBiZWNhdXNlIHRoZSBmaWxlIGV4dGVuc2lvbnMgLiRsaWJleHQgb2YgdGhpcyBhcmd1bWVudCBtYWtlcyBtZSBiZWxpZXZlIgorCSAgICAgICRlY2hvICIqKiogdGhhdCBpdCBpcyBqdXN0IGEgc3RhdGljIGFyY2hpdmUgdGhhdCBJIHNob3VsZCBub3QgdXNlZCBoZXJlLiIKKwkgICAgZWxzZQorCSAgICAgICRlY2hvCisJICAgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIgorCSAgICAgICRlY2hvICIqKiogc3RhdGljIGxpYnJhcnkgJGRlcGxpYiBpcyBub3QgcG9ydGFibGUhIgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGZpCisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICBwcm9nKQorCSAgICBpZiB0ZXN0ICIkcGFzcyIgIT0gbGluazsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBmaQorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgZXNhYyAjIGxpbmttb2RlCisJICA7OyAjICouJGxpYmV4dAorCSoubG8gfCAqLiRvYmpleHQpCisJICBpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCisJICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICBlbGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJICAgIGlmIHRlc3QgIiRwYXNzIiA9IGRscHJlb3BlbiB8fCB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiICE9IHllcyB8fCB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG5vOyB0aGVuCisJICAgICAgIyBJZiB0aGVyZSBpcyBubyBkbG9wZW4gc3VwcG9ydCBvciB3ZSdyZSBsaW5raW5nIHN0YXRpY2FsbHksCisJICAgICAgIyB3ZSBuZWVkIHRvIHByZWxvYWQuCisJICAgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRlcGxpYiIKKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgbmV3ZGxmaWxlcz0iJG5ld2RsZmlsZXMgJGRlcGxpYiIKKwkgICAgZmkKKwkgIGZpCisJICBjb250aW51ZQorCSAgOzsKKwklREVQTElCUyUpCisJICBhbGxkZXBsaWJzPXllcworCSAgY29udGludWUKKwkgIDs7CisJZXNhYyAjIGNhc2UgJGRlcGxpYgorCWlmIHRlc3QgIiRmb3VuZCIgPSB5ZXMgfHwgdGVzdCAtZiAiJGxpYiI7IHRoZW4gOgorCWVsc2UKKwkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIHRoZSBsaWJyYXJ5IFxgJGxpYicgb3IgdW5oYW5kbGVkIGFyZ3VtZW50IFxgJGRlcGxpYiciIDE+JjIKKwkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCWZpCisKKwkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgorCWlmICgke1NFRH0gLWUgJzJxJyAkbGliIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorCWVsc2UKKwkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwlmaQorCisJbGFkaXI9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorCXRlc3QgIlgkbGFkaXIiID0gIlgkbGliIiAmJiBsYWRpcj0iLiIKKworCWRsbmFtZT0KKwlkbG9wZW49CisJZGxwcmVvcGVuPQorCWxpYmRpcj0KKwlsaWJyYXJ5X25hbWVzPQorCW9sZF9saWJyYXJ5PQorCSMgSWYgdGhlIGxpYnJhcnkgd2FzIGluc3RhbGxlZCB3aXRoIGFuIG9sZCByZWxlYXNlIG9mIGxpYnRvb2wsCisJIyBpdCB3aWxsIG5vdCByZWRlZmluZSB2YXJpYWJsZXMgaW5zdGFsbGVkLCBvciBzaG91bGRub3RsaW5rCisJaW5zdGFsbGVkPXllcworCXNob3VsZG5vdGxpbms9bm8KKwlhdm9pZHRlbXBycGF0aD0KKworCisJIyBSZWFkIHRoZSAubGEgZmlsZQorCWNhc2UgJGxpYiBpbgorCSovKiB8ICpcXCopIC4gJGxpYiA7OworCSopIC4gLi8kbGliIDs7CisJZXNhYworCisJaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJsaWIsbGluayIgfHwKKwkgICB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csc2NhbiIgfHwKKwkgICB7IHRlc3QgIiRsaW5rbW9kZSIgIT0gcHJvZyAmJiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYjsgfTsgdGhlbgorCSAgdGVzdCAtbiAiJGRsb3BlbiIgJiYgZGxmaWxlcz0iJGRsZmlsZXMgJGRsb3BlbiIKKwkgIHRlc3QgLW4gIiRkbHByZW9wZW4iICYmIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRkbHByZW9wZW4iCisJZmkKKworCWlmIHRlc3QgIiRwYXNzIiA9IGNvbnY7IHRoZW4KKwkgICMgT25seSBjaGVjayBmb3IgY29udmVuaWVuY2UgbGlicmFyaWVzCisJICBkZXBsaWJzPSIkbGliICRkZXBsaWJzIgorCSAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgdGhlbgorCSAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIG5hbWUgb2YgbGluayBsaWJyYXJ5IGZvciBcYCRsaWInIiAxPiYyCisJICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICAgIGZpCisJICAgICMgSXQgaXMgYSBsaWJ0b29sIGNvbnZlbmllbmNlIGxpYnJhcnksIHNvIGFkZCBpbiBpdHMgb2JqZWN0cy4KKwkgICAgY29udmVuaWVuY2U9IiRjb252ZW5pZW5jZSAkbGFkaXIvJG9iamRpci8kb2xkX2xpYnJhcnkiCisJICAgIG9sZF9jb252ZW5pZW5jZT0iJG9sZF9jb252ZW5pZW5jZSAkbGFkaXIvJG9iamRpci8kb2xkX2xpYnJhcnkiCisJICAgIHRtcF9saWJzPQorCSAgICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKyAgICAgICAgICAgICAgaWYgdGVzdCAiWCRkdXBsaWNhdGVfZGVwcyIgPSAiWHllcyIgOyB0aGVuCisJICAgICAgICBjYXNlICIkdG1wX2xpYnMgIiBpbgorCSAgICAgICAgKiIgJGRlcGxpYiAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkZGVwbGliIiA7OworCSAgICAgICAgZXNhYworICAgICAgICAgICAgICBmaQorCSAgICAgIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIKKwkgICAgZG9uZQorCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUiICE9IHByb2cgJiYgdGVzdCAiJGxpbmttb2RlIiAhPSBsaWI7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkbGliJyBpcyBub3QgYSBjb252ZW5pZW5jZSBsaWJyYXJ5IiAxPiYyCisJICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgZmkKKwkgIGNvbnRpbnVlCisJZmkgIyAkcGFzcyA9IGNvbnYKKworCisJIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgd2UgbGluayBhZ2FpbnN0LgorCWxpbmtsaWI9CisJZm9yIGwgaW4gJG9sZF9saWJyYXJ5ICRsaWJyYXJ5X25hbWVzOyBkbworCSAgbGlua2xpYj0iJGwiCisJZG9uZQorCWlmIHRlc3QgLXogIiRsaW5rbGliIjsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGZpbmQgbmFtZSBvZiBsaW5rIGxpYnJhcnkgZm9yIFxgJGxpYiciIDE+JjIKKwkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCWZpCisKKwkjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KKwlpZiB0ZXN0ICIkcGFzcyIgPSBkbG9wZW47IHRoZW4KKwkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCAtZGxvcGVuIGEgY29udmVuaWVuY2UgbGlicmFyeTogXGAkbGliJyIgMT4mMgorCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgIGZpCisJICBpZiB0ZXN0IC16ICIkZGxuYW1lIiB8fAorCSAgICAgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiAhPSB5ZXMgfHwKKwkgICAgIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbm87IHRoZW4KKwkgICAgIyBJZiB0aGVyZSBpcyBubyBkbG5hbWUsIG5vIGRsb3BlbiBzdXBwb3J0IG9yIHdlJ3JlIGxpbmtpbmcKKwkgICAgIyBzdGF0aWNhbGx5LCB3ZSBuZWVkIHRvIHByZWxvYWQuICBXZSBhbHNvIG5lZWQgdG8gcHJlbG9hZCBhbnkKKwkgICAgIyBkZXBlbmRlbnQgbGlicmFyaWVzIHNvIGxpYmx0ZGwncyBkZXBsaWIgcHJlbG9hZGVyIGRvZXNuJ3QKKwkgICAgIyBib21iIG91dCBpbiB0aGUgbG9hZCBkZXBsaWJzIHBoYXNlLgorCSAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkbGliICRkZXBlbmRlbmN5X2xpYnMiCisJICBlbHNlCisJICAgIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRsaWIiCisJICBmaQorCSAgY29udGludWUKKwlmaSAjICRwYXNzID0gZGxvcGVuCisKKwkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KKwljYXNlICRsYWRpciBpbgorCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgYWJzX2xhZGlyPSIkbGFkaXIiIDs7CisJKikKKwkgIGFic19sYWRpcj1gY2QgIiRsYWRpciIgJiYgcHdkYAorCSAgaWYgdGVzdCAteiAiJGFic19sYWRpciI7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRsYWRpciciIDE+JjIKKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogcGFzc2luZyBpdCBsaXRlcmFsbHkgdG8gdGhlIGxpbmtlciwgYWx0aG91Z2ggaXQgbWlnaHQgZmFpbCIgMT4mMgorCSAgICBhYnNfbGFkaXI9IiRsYWRpciIKKwkgIGZpCisJICA7OworCWVzYWMKKwlsYW5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCisJIyBGaW5kIHRoZSByZWxldmFudCBvYmplY3QgZGlyZWN0b3J5IGFuZCBsaWJyYXJ5IG5hbWUuCisJaWYgdGVzdCAiWCRpbnN0YWxsZWQiID0gWHllczsgdGhlbgorCSAgaWYgdGVzdCAhIC1mICIkbGliZGlyLyRsaW5rbGliIiAmJiB0ZXN0IC1mICIkYWJzX2xhZGlyLyRsaW5rbGliIjsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBsaWJyYXJ5IFxgJGxpYicgd2FzIG1vdmVkLiIgMT4mMgorCSAgICBkaXI9IiRsYWRpciIKKwkgICAgYWJzZGlyPSIkYWJzX2xhZGlyIgorCSAgICBsaWJkaXI9IiRhYnNfbGFkaXIiCisJICBlbHNlCisJICAgIGRpcj0iJGxpYmRpciIKKwkgICAgYWJzZGlyPSIkbGliZGlyIgorCSAgZmkKKwkgIHRlc3QgIlgkaGFyZGNvZGVfYXV0b21hdGljIiA9IFh5ZXMgJiYgYXZvaWR0ZW1wcnBhdGg9eWVzCisJZWxzZQorCSAgaWYgdGVzdCAhIC1mICIkbGFkaXIvJG9iamRpci8kbGlua2xpYiIgJiYgdGVzdCAtZiAiJGFic19sYWRpci8kbGlua2xpYiI7IHRoZW4KKwkgICAgZGlyPSIkbGFkaXIiCisJICAgIGFic2Rpcj0iJGFic19sYWRpciIKKwkgICAgIyBSZW1vdmUgdGhpcyBzZWFyY2ggcGF0aCBsYXRlcgorCSAgICBub3RpbnN0X3BhdGg9IiRub3RpbnN0X3BhdGggJGFic19sYWRpciIKKwkgIGVsc2UKKwkgICAgZGlyPSIkbGFkaXIvJG9iamRpciIKKwkgICAgYWJzZGlyPSIkYWJzX2xhZGlyLyRvYmpkaXIiCisJICAgICMgUmVtb3ZlIHRoaXMgc2VhcmNoIHBhdGggbGF0ZXIKKwkgICAgbm90aW5zdF9wYXRoPSIkbm90aW5zdF9wYXRoICRhYnNfbGFkaXIiCisJICBmaQorCWZpICMgJGluc3RhbGxlZCA9IHllcworCW5hbWU9YCRlY2hvICJYJGxhbmFtZSIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJyAtZSAncy9ebGliLy8nYAorCisJIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbHByZW9wZW4uCisJaWYgdGVzdCAiJHBhc3MiID0gZGxwcmVvcGVuOyB0aGVuCisJICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgLWRscHJlb3BlbiBhIGNvbnZlbmllbmNlIGxpYnJhcnk6IFxgJGxpYiciIDE+JjIKKwkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICBmaQorCSAgIyBQcmVmZXIgdXNpbmcgYSBzdGF0aWMgbGlicmFyeSAoc28gdGhhdCBubyBzaWxseSBfRFlOQU1JQyBzeW1ib2xzCisJICAjIGFyZSByZXF1aXJlZCB0byBsaW5rKS4KKwkgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KKwkgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRpci8kb2xkX2xpYnJhcnkiCisJICAjIE90aGVyd2lzZSwgdXNlIHRoZSBkbG5hbWUsIHNvIHRoYXQgbHRfZGxvcGVuIGZpbmRzIGl0LgorCSAgZWxpZiB0ZXN0IC1uICIkZGxuYW1lIjsgdGhlbgorCSAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkZGlyLyRkbG5hbWUiCisJICBlbHNlCisJICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRkaXIvJGxpbmtsaWIiCisJICBmaQorCWZpICMgJHBhc3MgPSBkbHByZW9wZW4KKworCWlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJICAjIExpbmsgdGhlIGNvbnZlbmllbmNlIGxpYnJhcnkKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KKwkgICAgZGVwbGlicz0iJGRpci8kb2xkX2xpYnJhcnkgJGRlcGxpYnMiCisJICBlbGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgorCSAgICBjb21waWxlX2RlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRjb21waWxlX2RlcGxpYnMiCisJICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZWxzZQorCSAgICBkZXBsaWJzPSIkbGliICRkZXBsaWJzIiAjIHVzZWQgZm9yIHByb2csc2NhbiBwYXNzCisJICBmaQorCSAgY29udGludWUKKwlmaQorCisKKwlpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZyAmJiB0ZXN0ICIkcGFzcyIgIT0gbGluazsgdGhlbgorCSAgbmV3bGliX3NlYXJjaF9wYXRoPSIkbmV3bGliX3NlYXJjaF9wYXRoICRsYWRpciIKKwkgIGRlcGxpYnM9IiRsaWIgJGRlcGxpYnMiCisKKwkgIGxpbmthbGxkZXBsaWJzPW5vCisJICBpZiB0ZXN0ICIkbGlua19hbGxfZGVwbGlicyIgIT0gbm8gfHwgdGVzdCAteiAiJGxpYnJhcnlfbmFtZXMiIHx8CisJICAgICB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG5vOyB0aGVuCisJICAgIGxpbmthbGxkZXBsaWJzPXllcworCSAgZmkKKworCSAgdG1wX2xpYnM9CisJICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgIGNhc2UgJGRlcGxpYiBpbgorCSAgICAtTCopIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAiYCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLUwvLydgOzsgIyMjIHRlc3RzdWl0ZTogc2tpcCBuZXN0ZWQgcXVvdGluZyB0ZXN0CisJICAgIGVzYWMKKwkgICAgIyBOZWVkIHRvIGxpbmsgYWdhaW5zdCBhbGwgZGVwZW5kZW5jeV9saWJzPworCSAgICBpZiB0ZXN0ICIkbGlua2FsbGRlcGxpYnMiID0geWVzOyB0aGVuCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgICMgTmVlZCB0byBoYXJkY29kZSBzaGFyZWQgbGlicmFyeSBwYXRocworCSAgICAgICMgb3IvYW5kIGxpbmsgYWdhaW5zdCBzdGF0aWMgbGlicmFyaWVzCisJICAgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCisJICAgIGZpCisJICAgIGlmIHRlc3QgIlgkZHVwbGljYXRlX2RlcHMiID0gIlh5ZXMiIDsgdGhlbgorCSAgICAgIGNhc2UgIiR0bXBfbGlicyAiIGluCisJICAgICAgKiIgJGRlcGxpYiAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkZGVwbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgICAgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIgorCSAgZG9uZSAjIGZvciBkZXBsaWIKKwkgIGNvbnRpbnVlCisJZmkgIyAkbGlua21vZGUgPSBwcm9nLi4uCisKKwlpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIiAmJgorCSAgICAgeyB0ZXN0ICIkcHJlZmVyX3N0YXRpY19saWJzIiA9IG5vIHx8IHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IH07IHRoZW4KKwkgICAgIyBXZSBuZWVkIHRvIGhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGgKKwkgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLXogIiRhdm9pZHRlbXBycGF0aCIgOyB0aGVuCisJICAgICAgIyBNYWtlIHN1cmUgdGhlIHJwYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgorCSAgICAgIGNhc2UgIiR0ZW1wX3JwYXRoICIgaW4KKwkgICAgICAqIiAkZGlyICIqKSA7OworCSAgICAgICoiICRhYnNkaXIgIiopIDs7CisJICAgICAgKikgdGVtcF9ycGF0aD0iJHRlbXBfcnBhdGggJGFic2RpciIgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisKKwkgICAgIyBIYXJkY29kZSB0aGUgbGlicmFyeSBwYXRoLgorCSAgICAjIFNraXAgZGlyZWN0b3JpZXMgdGhhdCBhcmUgaW4gdGhlIHN5c3RlbSBkZWZhdWx0IHJ1bi10aW1lCisJICAgICMgc2VhcmNoIHBhdGguCisJICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGFic2RpciAiKikgOzsKKwkgICAgKikKKwkgICAgICBjYXNlICIkY29tcGlsZV9ycGF0aCAiIGluCisJICAgICAgKiIgJGFic2RpciAiKikgOzsKKwkgICAgICAqKSBjb21waWxlX3JwYXRoPSIkY29tcGlsZV9ycGF0aCAkYWJzZGlyIgorCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGxpYmRpciAiKikgOzsKKwkgICAgKikKKwkgICAgICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgICAgICoiICRsaWJkaXIgIiopIDs7CisJICAgICAgKikgZmluYWxpemVfcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCAkbGliZGlyIgorCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICBmaSAjICRsaW5rbW9kZSwkcGFzcyA9IHByb2csbGluay4uLgorCisJICBpZiB0ZXN0ICIkYWxsZGVwbGlicyIgPSB5ZXMgJiYKKwkgICAgIHsgdGVzdCAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA9IHBhc3NfYWxsIHx8CisJICAgICAgIHsgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYKKwkJIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgfTsgfTsgdGhlbgorCSAgICAjIFdlIG9ubHkgbmVlZCB0byBzZWFyY2ggZm9yIHN0YXRpYyBsaWJyYXJpZXMKKwkgICAgY29udGludWUKKwkgIGZpCisJZmkKKworCWxpbmtfc3RhdGljPW5vICMgV2hldGhlciB0aGUgZGVwbGliIHdpbGwgYmUgbGlua2VkIHN0YXRpY2FsbHkKKwl1c2Vfc3RhdGljX2xpYnM9JHByZWZlcl9zdGF0aWNfbGlicworCWlmIHRlc3QgIiR1c2Vfc3RhdGljX2xpYnMiID0gYnVpbHQgJiYgdGVzdCAiJGluc3RhbGxlZCIgPSB5ZXMgOyB0aGVuCisJICB1c2Vfc3RhdGljX2xpYnM9bm8KKwlmaQorCWlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIiAmJgorCSAgIHsgdGVzdCAiJHVzZV9zdGF0aWNfbGlicyIgPSBubyB8fCB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB9OyB0aGVuCisJICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IG5vOyB0aGVuCisJICAgIG5vdGluc3RfZGVwbGlicz0iJG5vdGluc3RfZGVwbGlicyAkbGliIgorCSAgICBuZWVkX3JlbGluaz15ZXMKKwkgIGZpCisJICAjIFRoaXMgaXMgYSBzaGFyZWQgbGlicmFyeQorCisJICAjIFdhcm4gYWJvdXQgcG9ydGFiaWxpdHksIGNhbid0IGxpbmsgYWdhaW5zdCAtbW9kdWxlJ3Mgb24KKwkgICMgc29tZSBzeXN0ZW1zIChkYXJ3aW4pCisJICBpZiB0ZXN0ICIkc2hvdWxkbm90bGluayIgPSB5ZXMgJiYgdGVzdCAiJHBhc3MiID0gbGluayA7IHRoZW4KKwkgICAgJGVjaG8KKwkgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKwkgICAgICAkZWNobyAiKioqIFdhcm5pbmc6IExpbmtpbmcgdGhlIGV4ZWN1dGFibGUgJG91dHB1dCBhZ2FpbnN0IHRoZSBsb2FkYWJsZSBtb2R1bGUiCisJICAgIGVsc2UKKwkgICAgICAkZWNobyAiKioqIFdhcm5pbmc6IExpbmtpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5ICRvdXRwdXQgYWdhaW5zdCB0aGUgbG9hZGFibGUgbW9kdWxlIgorCSAgICBmaQorCSAgICAkZWNobyAiKioqICRsaW5rbGliIGlzIG5vdCBwb3J0YWJsZSEiCisJICBmaQorCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYiAmJgorCSAgICAgdGVzdCAiJGhhcmRjb2RlX2ludG9fbGlicyIgPSB5ZXM7IHRoZW4KKwkgICAgIyBIYXJkY29kZSB0aGUgbGlicmFyeSBwYXRoLgorCSAgICAjIFNraXAgZGlyZWN0b3JpZXMgdGhhdCBhcmUgaW4gdGhlIHN5c3RlbSBkZWZhdWx0IHJ1bi10aW1lCisJICAgICMgc2VhcmNoIHBhdGguCisJICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGFic2RpciAiKikgOzsKKwkgICAgKikKKwkgICAgICBjYXNlICIkY29tcGlsZV9ycGF0aCAiIGluCisJICAgICAgKiIgJGFic2RpciAiKikgOzsKKwkgICAgICAqKSBjb21waWxlX3JwYXRoPSIkY29tcGlsZV9ycGF0aCAkYWJzZGlyIgorCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGxpYmRpciAiKikgOzsKKwkgICAgKikKKwkgICAgICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgICAgICoiICRsaWJkaXIgIiopIDs7CisJICAgICAgKikgZmluYWxpemVfcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCAkbGliZGlyIgorCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICBmaQorCisJICBpZiB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMiOyB0aGVuCisJICAgICMgZmlndXJlIG91dCB0aGUgc29uYW1lCisJICAgIHNldCBkdW1teSAkbGlicmFyeV9uYW1lcworCSAgICByZWFsbmFtZT0iJDIiCisJICAgIHNoaWZ0OyBzaGlmdAorCSAgICBsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCisJICAgICMgdXNlIGRsbmFtZSBpZiB3ZSBnb3QgaXQuIGl0J3MgcGVyZmVjdGx5IGdvb2QsIG5vPworCSAgICBpZiB0ZXN0IC1uICIkZGxuYW1lIjsgdGhlbgorCSAgICAgIHNvbmFtZT0iJGRsbmFtZSIKKwkgICAgZWxpZiB0ZXN0IC1uICIkc29uYW1lX3NwZWMiOyB0aGVuCisJICAgICAgIyBibGVoIHdpbmRvd3MKKwkgICAgICBjYXNlICRob3N0IGluCisJICAgICAgKmN5Z3dpbiogfCBtaW5ndyopCisJCW1ham9yPWBleHByICRjdXJyZW50IC0gJGFnZWAKKwkJdmVyc3VmZml4PSItJG1ham9yIgorCQk7OworCSAgICAgIGVzYWMKKwkgICAgICBldmFsIHNvbmFtZT1cIiRzb25hbWVfc3BlY1wiCisJICAgIGVsc2UKKwkgICAgICBzb25hbWU9IiRyZWFsbmFtZSIKKwkgICAgZmkKKworCSAgICAjIE1ha2UgYSBuZXcgbmFtZSBmb3IgdGhlIGV4dHJhY3RfZXhwc3ltc19jbWRzIHRvIHVzZQorCSAgICBzb3Jvb3Q9IiRzb25hbWUiCisJICAgIHNvbmFtZT1gJGVjaG8gJHNvcm9vdCB8ICR7U0VEfSAtZSAncy9eLipcLy8vJ2AKKwkgICAgbmV3bGliPSJsaWJpbXAtYCRlY2hvICRzb25hbWUgfCAke1NFRH0gJ3MvXmxpYi8vO3MvXC5kbGwkLy8nYC5hIgorCisJICAgICMgSWYgdGhlIGxpYnJhcnkgaGFzIG5vIGV4cG9ydCBsaXN0LCB0aGVuIGNyZWF0ZSBvbmUgbm93CisJICAgIGlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZGVmIjsgdGhlbiA6CisJICAgIGVsc2UKKwkgICAgICAkc2hvdyAiZXh0cmFjdGluZyBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIFxgJHNvbmFtZSciCisJICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICAgICAgY21kcz0kZXh0cmFjdF9leHBzeW1zX2NtZHMKKwkgICAgICBmb3IgY21kIGluICRjbWRzOyBkbworCQlJRlM9IiRzYXZlX2lmcyIKKwkJZXZhbCBjbWQ9XCIkY21kXCIKKwkJJHNob3cgIiRjbWQiCisJCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworCSAgICAgIGRvbmUKKwkgICAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgZmkKKworCSAgICAjIENyZWF0ZSAkbmV3bGliCisJICAgIGlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyRuZXdsaWIiOyB0aGVuIDo7IGVsc2UKKwkgICAgICAkc2hvdyAiZ2VuZXJhdGluZyBpbXBvcnQgbGlicmFyeSBmb3IgXGAkc29uYW1lJyIKKwkgICAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwkgICAgICBjbWRzPSRvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcworCSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisJCUlGUz0iJHNhdmVfaWZzIgorCQlldmFsIGNtZD1cIiRjbWRcIgorCQkkc2hvdyAiJGNtZCIKKwkJJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/CisJICAgICAgZG9uZQorCSAgICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICBmaQorCSAgICAjIG1ha2Ugc3VyZSB0aGUgbGlicmFyeSB2YXJpYWJsZXMgYXJlIHBvaW50aW5nIHRvIHRoZSBuZXcgbGlicmFyeQorCSAgICBkaXI9JG91dHB1dF9vYmpkaXIKKwkgICAgbGlua2xpYj0kbmV3bGliCisJICBmaSAjIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyIKKworCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2cgfHwgdGVzdCAiJG1vZGUiICE9IHJlbGluazsgdGhlbgorCSAgICBhZGRfc2hsaWJwYXRoPQorCSAgICBhZGRfZGlyPQorCSAgICBhZGQ9CisJICAgIGxpYl9saW5rZWQ9eWVzCisJICAgIGNhc2UgJGhhcmRjb2RlX2FjdGlvbiBpbgorCSAgICBpbW1lZGlhdGUgfCB1bnN1cHBvcnRlZCkKKwkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IG5vOyB0aGVuCisJCWFkZD0iJGRpci8kbGlua2xpYiIKKwkJY2FzZSAkaG9zdCBpbgorCQkgICotKi1zY28zLjJ2NS4wLlswMjRdKikgYWRkX2Rpcj0iLUwkZGlyIiA7OworCQkgICotKi1zeXN2NCp1dzIqKSBhZGRfZGlyPSItTCRkaXIiIDs7CisJCSAgKi0qLXN5c3Y1T3BlblVOSVgqIHwgKi0qLXN5c3Y1VW5peFdhcmU3LlswMV0uWzEwXSogfCBcCisJCSAgICAqLSotdW5peHdhcmU3KikgYWRkX2Rpcj0iLUwkZGlyIiA7OworCQkgICotKi1kYXJ3aW4qICkKKwkJICAgICMgaWYgdGhlIGxpYiBpcyBhIG1vZHVsZSB0aGVuIHdlIGNhbiBub3QgbGluayBhZ2FpbnN0CisJCSAgICAjIGl0LCBzb21lb25lIGlzIGlnbm9yaW5nIHRoZSBuZXcgd2FybmluZ3MgSSBhZGRlZAorCQkgICAgaWYgL3Vzci9iaW4vZmlsZSAtTCAkYWRkIDI+IC9kZXYvbnVsbCB8CisgICAgICAgICAgICAgICAgICAgICAgJEVHUkVQICI6IFteOl0qIGJ1bmRsZSIgPi9kZXYvbnVsbCA7IHRoZW4KKwkJICAgICAgJGVjaG8gIioqIFdhcm5pbmcsIGxpYiAkbGlua2xpYiBpcyBhIG1vZHVsZSwgbm90IGEgc2hhcmVkIGxpYnJhcnkiCisJCSAgICAgIGlmIHRlc3QgLXogIiRvbGRfbGlicmFyeSIgOyB0aGVuCisJCSAgICAgICAgJGVjaG8KKwkJICAgICAgICAkZWNobyAiKiogQW5kIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIHN0YXRpYyBhcmNoaXZlIGF2YWlsYWJsZSIKKwkJICAgICAgICAkZWNobyAiKiogVGhlIGxpbmsgd2lsbCBwcm9iYWJseSBmYWlsLCBzb3JyeSIKKwkJICAgICAgZWxzZQorCQkgICAgICAgIGFkZD0iJGRpci8kb2xkX2xpYnJhcnkiCisJCSAgICAgIGZpCisJCSAgICBmaQorCQllc2FjCisJICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSBubzsgdGhlbgorCQljYXNlICRob3N0IGluCisJCSotKi1zdW5vcyopIGFkZF9zaGxpYnBhdGg9IiRkaXIiIDs7CisJCWVzYWMKKwkJYWRkX2Rpcj0iLUwkZGlyIgorCQlhZGQ9Ii1sJG5hbWUiCisJICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSBubzsgdGhlbgorCQlhZGRfc2hsaWJwYXRoPSIkZGlyIgorCQlhZGQ9Ii1sJG5hbWUiCisJICAgICAgZWxzZQorCQlsaWJfbGlua2VkPW5vCisJICAgICAgZmkKKwkgICAgICA7OworCSAgICByZWxpbmspCisJICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSB5ZXM7IHRoZW4KKwkJYWRkPSIkZGlyLyRsaW5rbGliIgorCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0geWVzOyB0aGVuCisJCWFkZF9kaXI9Ii1MJGRpciIKKwkJIyBUcnkgbG9va2luZyBmaXJzdCBpbiB0aGUgbG9jYXRpb24gd2UncmUgYmVpbmcgaW5zdGFsbGVkIHRvLgorCQlpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIjsgdGhlbgorCQkgIGNhc2UgJGxpYmRpciBpbgorCQkgICAgW1xcL10qKQorCQkgICAgICBhZGRfZGlyPSIkYWRkX2RpciAtTCRpbnN0X3ByZWZpeF9kaXIkbGliZGlyIgorCQkgICAgICA7OworCQkgIGVzYWMKKwkJZmkKKwkJYWRkPSItbCRuYW1lIgorCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCisJCWFkZF9zaGxpYnBhdGg9IiRkaXIiCisJCWFkZD0iLWwkbmFtZSIKKwkgICAgICBlbHNlCisJCWxpYl9saW5rZWQ9bm8KKwkgICAgICBmaQorCSAgICAgIDs7CisJICAgICopIGxpYl9saW5rZWQ9bm8gOzsKKwkgICAgZXNhYworCisJICAgIGlmIHRlc3QgIiRsaWJfbGlua2VkIiAhPSB5ZXM7IHRoZW4KKwkgICAgICAkZWNobyAiJG1vZGVuYW1lOiBjb25maWd1cmF0aW9uIGVycm9yOiB1bnN1cHBvcnRlZCBoYXJkY29kZSBwcm9wZXJ0aWVzIgorCSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgICBmaQorCisJICAgIGlmIHRlc3QgLW4gIiRhZGRfc2hsaWJwYXRoIjsgdGhlbgorCSAgICAgIGNhc2UgOiRjb21waWxlX3NobGlicGF0aDogaW4KKwkgICAgICAqIjokYWRkX3NobGlicGF0aDoiKikgOzsKKwkgICAgICAqKSBjb21waWxlX3NobGlicGF0aD0iJGNvbXBpbGVfc2hsaWJwYXRoJGFkZF9zaGxpYnBhdGg6IiA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKwkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgY29tcGlsZV9kZXBsaWJzPSIkYWRkX2RpciAkY29tcGlsZV9kZXBsaWJzIgorCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGNvbXBpbGVfZGVwbGlicz0iJGFkZCAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGRlcGxpYnM9IiRhZGRfZGlyICRkZXBsaWJzIgorCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGRlcGxpYnM9IiRhZGQgJGRlcGxpYnMiCisJICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0geWVzICYmIFwKKwkJIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiAhPSB5ZXMgJiYgXAorCQkgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCisJCWNhc2UgOiRmaW5hbGl6ZV9zaGxpYnBhdGg6IGluCisJCSoiOiRsaWJkaXI6IiopIDs7CisJCSopIGZpbmFsaXplX3NobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCRsaWJkaXI6IiA7OworCQllc2FjCisJICAgICAgZmkKKwkgICAgZmkKKwkgIGZpCisKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nIHx8IHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgorCSAgICBhZGRfc2hsaWJwYXRoPQorCSAgICBhZGRfZGlyPQorCSAgICBhZGQ9CisJICAgICMgRmluYWxpemUgY29tbWFuZCBmb3IgYm90aCBpcyBzaW1wbGU6IGp1c3QgaGFyZGNvZGUgaXQuCisJICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCisJICAgICAgYWRkPSIkbGliZGlyLyRsaW5rbGliIgorCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgorCSAgICAgIGFkZF9kaXI9Ii1MJGxpYmRpciIKKwkgICAgICBhZGQ9Ii1sJG5hbWUiCisJICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCisJICAgICAgY2FzZSA6JGZpbmFsaXplX3NobGlicGF0aDogaW4KKwkgICAgICAqIjokbGliZGlyOiIqKSA7OworCSAgICAgICopIGZpbmFsaXplX3NobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCRsaWJkaXI6IiA7OworCSAgICAgIGVzYWMKKwkgICAgICBhZGQ9Ii1sJG5hbWUiCisJICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSB5ZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIiAmJgorCQkgdGVzdCAtZiAiJGluc3RfcHJlZml4X2RpciRsaWJkaXIvJGxpbmtsaWIiIDsgdGhlbgorCSAgICAgICAgYWRkPSIkaW5zdF9wcmVmaXhfZGlyJGxpYmRpci8kbGlua2xpYiIKKwkgICAgICBlbHNlCisJICAgICAgICBhZGQ9IiRsaWJkaXIvJGxpbmtsaWIiCisJICAgICAgZmkKKwkgICAgZWxzZQorCSAgICAgICMgV2UgY2Fubm90IHNlZW0gdG8gaGFyZGNvZGUgaXQsIGd1ZXNzIHdlJ2xsIGZha2UgaXQuCisJICAgICAgYWRkX2Rpcj0iLUwkbGliZGlyIgorCSAgICAgICMgVHJ5IGxvb2tpbmcgZmlyc3QgaW4gdGhlIGxvY2F0aW9uIHdlJ3JlIGJlaW5nIGluc3RhbGxlZCB0by4KKwkgICAgICBpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIjsgdGhlbgorCQljYXNlICRsaWJkaXIgaW4KKwkJICBbXFwvXSopCisJCSAgICBhZGRfZGlyPSIkYWRkX2RpciAtTCRpbnN0X3ByZWZpeF9kaXIkbGliZGlyIgorCQkgICAgOzsKKwkJZXNhYworCSAgICAgIGZpCisJICAgICAgYWRkPSItbCRuYW1lIgorCSAgICBmaQorCisJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGZpbmFsaXplX2RlcGxpYnM9IiRhZGRfZGlyICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGZpbmFsaXplX2RlcGxpYnM9IiRhZGQgJGZpbmFsaXplX2RlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgZGVwbGlicz0iJGFkZF9kaXIgJGRlcGxpYnMiCisJICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgZGVwbGlicz0iJGFkZCAkZGVwbGlicyIKKwkgICAgZmkKKwkgIGZpCisJZWxpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgIyBIZXJlIHdlIGFzc3VtZSB0aGF0IG9uZSBvZiBoYXJkY29kZV9kaXJlY3Qgb3IgaGFyZGNvZGVfbWludXNfTAorCSAgIyBpcyBub3QgdW5zdXBwb3J0ZWQuICBUaGlzIGlzIHZhbGlkIG9uIGFsbCBrbm93biBzdGF0aWMgYW5kCisJICAjIHNoYXJlZCBwbGF0Zm9ybXMuCisJICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSB1bnN1cHBvcnRlZDsgdGhlbgorCSAgICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIGxpbmtsaWI9IiRvbGRfbGlicmFyeSIKKwkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGlyLyRsaW5rbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkaXIvJGxpbmtsaWIgJGZpbmFsaXplX2RlcGxpYnMiCisJICBlbHNlCisJICAgIGNvbXBpbGVfZGVwbGlicz0iLWwkbmFtZSAtTCRkaXIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgZmluYWxpemVfZGVwbGlicz0iLWwkbmFtZSAtTCRkaXIgJGZpbmFsaXplX2RlcGxpYnMiCisJICBmaQorCWVsaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKwkgICMgTm90IGEgc2hhcmVkIGxpYnJhcnkKKwkgIGlmIHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgIT0gcGFzc19hbGw7IHRoZW4KKwkgICAgIyBXZSdyZSB0cnlpbmcgbGluayBhIHNoYXJlZCBsaWJyYXJ5IGFnYWluc3QgYSBzdGF0aWMgb25lCisJICAgICMgYnV0IHRoZSBzeXN0ZW0gZG9lc24ndCBzdXBwb3J0IGl0LgorCisJICAgICMgSnVzdCBwcmludCBhIHdhcm5pbmcgYW5kIGFkZCB0aGUgbGlicmFyeSB0byBkZXBlbmRlbmN5X2xpYnMgc28KKwkgICAgIyB0aGF0IHRoZSBwcm9ncmFtIGNhbiBiZSBsaW5rZWQgYWdhaW5zdCB0aGUgc3RhdGljIGxpYnJhcnkuCisJICAgICRlY2hvCisJICAgICRlY2hvICIqKiogV2FybmluZzogVGhpcyBzeXN0ZW0gY2FuIG5vdCBsaW5rIHRvIHN0YXRpYyBsaWIgYXJjaGl2ZSAkbGliLiIKKwkgICAgJGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJICAgICRlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgorCSAgICAkZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlLiIKKwkgICAgaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXM7IHRoZW4KKwkgICAgICAkZWNobyAiKioqIEJ1dCBhcyB5b3UgdHJ5IHRvIGJ1aWxkIGEgbW9kdWxlIGxpYnJhcnksIGxpYnRvb2wgd2lsbCBzdGlsbCBjcmVhdGUgIgorCSAgICAgICRlY2hvICIqKiogYSBzdGF0aWMgbW9kdWxlLCB0aGF0IHNob3VsZCB3b3JrIGFzIGxvbmcgYXMgdGhlIGRsb3BlbmluZyBhcHBsaWNhdGlvbiIKKwkgICAgICAkZWNobyAiKioqIGlzIGxpbmtlZCB3aXRoIHRoZSAtZGxvcGVuIGZsYWcgdG8gcmVzb2x2ZSBzeW1ib2xzIGF0IHJ1bnRpbWUuIgorCSAgICAgIGlmIHRlc3QgLXogIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisJCSRlY2hvCisJCSRlY2hvICIqKiogSG93ZXZlciwgdGhpcyB3b3VsZCBvbmx5IHdvcmsgaWYgbGlidG9vbCB3YXMgYWJsZSB0byBleHRyYWN0IHN5bWJvbCIKKwkJJGVjaG8gIioqKiBsaXN0cyBmcm9tIGEgcHJvZ3JhbSwgdXNpbmcgXGBubScgb3IgZXF1aXZhbGVudCwgYnV0IGxpYnRvb2wgY291bGQiCisJCSRlY2hvICIqKiogbm90IGZpbmQgc3VjaCBhIHByb2dyYW0uICBTbywgdGhpcyBtb2R1bGUgaXMgcHJvYmFibHkgdXNlbGVzcy4iCisJCSRlY2hvICIqKiogXGBubScgZnJvbSBHTlUgYmludXRpbHMgYW5kIGEgZnVsbCByZWJ1aWxkIG1heSBoZWxwLiIKKwkgICAgICBmaQorCSAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSBubzsgdGhlbgorCQlidWlsZF9saWJ0b29sX2xpYnM9bW9kdWxlCisJCWJ1aWxkX29sZF9saWJzPXllcworCSAgICAgIGVsc2UKKwkJYnVpbGRfbGlidG9vbF9saWJzPW5vCisJICAgICAgZmkKKwkgICAgZmkKKwkgIGVsc2UKKwkgICAgZGVwbGlicz0iJGRpci8kb2xkX2xpYnJhcnkgJGRlcGxpYnMiCisJICAgIGxpbmtfc3RhdGljPXllcworCSAgZmkKKwlmaSAjIGxpbmsgc2hhcmVkL3N0YXRpYyBsaWJyYXJ5PworCisJaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYjsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJGRlcGVuZGVuY3lfbGlicyIgJiYKKwkgICAgIHsgdGVzdCAiJGhhcmRjb2RlX2ludG9fbGlicyIgIT0geWVzIHx8CisJICAgICAgIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgfHwKKwkgICAgICAgdGVzdCAiJGxpbmtfc3RhdGljIiA9IHllczsgfTsgdGhlbgorCSAgICAjIEV4dHJhY3QgLVIgZnJvbSBkZXBlbmRlbmN5X2xpYnMKKwkgICAgdGVtcF9kZXBsaWJzPQorCSAgICBmb3IgbGliZGlyIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgICAgY2FzZSAkbGliZGlyIGluCisJICAgICAgLVIqKSB0ZW1wX3hycGF0aD1gJGVjaG8gIlgkbGliZGlyIiB8ICRYc2VkIC1lICdzL14tUi8vJ2AKKwkJICAgY2FzZSAiICR4cnBhdGggIiBpbgorCQkgICAqIiAkdGVtcF94cnBhdGggIiopIDs7CisJCSAgICopIHhycGF0aD0iJHhycGF0aCAkdGVtcF94cnBhdGgiOzsKKwkJICAgZXNhYzs7CisJICAgICAgKikgdGVtcF9kZXBsaWJzPSIkdGVtcF9kZXBsaWJzICRsaWJkaXIiOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgICAgZGVwZW5kZW5jeV9saWJzPSIkdGVtcF9kZXBsaWJzIgorCSAgZmkKKworCSAgbmV3bGliX3NlYXJjaF9wYXRoPSIkbmV3bGliX3NlYXJjaF9wYXRoICRhYnNkaXIiCisJICAjIExpbmsgYWdhaW5zdCB0aGlzIGxpYnJhcnkKKwkgIHRlc3QgIiRsaW5rX3N0YXRpYyIgPSBubyAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRhYnNfbGFkaXIvJGxhbmFtZSAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgIyAuLi4gYW5kIGl0cyBkZXBlbmRlbmN5X2xpYnMKKwkgIHRtcF9saWJzPQorCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICAgaWYgdGVzdCAiWCRkdXBsaWNhdGVfZGVwcyIgPSAiWHllcyIgOyB0aGVuCisJICAgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KKwkgICAgICAqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgICB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiCisJICBkb25lCisKKwkgIGlmIHRlc3QgIiRsaW5rX2FsbF9kZXBsaWJzIiAhPSBubzsgdGhlbgorCSAgICAjIEFkZCB0aGUgc2VhcmNoIHBhdGhzIG9mIGFsbCBkZXBlbmRlbmN5IGxpYnJhcmllcworCSAgICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgICAgY2FzZSAkZGVwbGliIGluCisJICAgICAgLUwqKSBwYXRoPSIkZGVwbGliIiA7OworCSAgICAgICoubGEpCisJCWRpcj1gJGVjaG8gIlgkZGVwbGliIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisJCXRlc3QgIlgkZGlyIiA9ICJYJGRlcGxpYiIgJiYgZGlyPSIuIgorCQkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KKwkJY2FzZSAkZGlyIGluCisJCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgYWJzZGlyPSIkZGlyIiA7OworCQkqKQorCQkgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKKwkJICBpZiB0ZXN0IC16ICIkYWJzZGlyIjsgdGhlbgorCQkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRkaXInIiAxPiYyCisJCSAgICBhYnNkaXI9IiRkaXIiCisJCSAgZmkKKwkJICA7OworCQllc2FjCisJCWlmIGdyZXAgIl5pbnN0YWxsZWQ9bm8iICRkZXBsaWIgPiAvZGV2L251bGw7IHRoZW4KKwkJICBwYXRoPSIkYWJzZGlyLyRvYmpkaXIiCisJCWVsc2UKKwkJICBldmFsIGxpYmRpcj1gJHtTRUR9IC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkZGVwbGliYAorCQkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJCSAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXBsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgorCQkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisJCSAgZmkKKwkJICBpZiB0ZXN0ICIkYWJzZGlyIiAhPSAiJGxpYmRpciI7IHRoZW4KKwkJICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgJGRlcGxpYicgc2VlbXMgdG8gYmUgbW92ZWQiIDE+JjIKKwkJICBmaQorCQkgIHBhdGg9IiRhYnNkaXIiCisJCWZpCisJCWRlcGRlcGw9CisJCWNhc2UgJGhvc3QgaW4KKwkJKi0qLWRhcndpbiopCisJCSAgIyB3ZSBkbyBub3Qgd2FudCB0byBsaW5rIGFnYWluc3Qgc3RhdGljIGxpYnMsCisJCSAgIyBidXQgbmVlZCB0byBsaW5rIGFnYWluc3Qgc2hhcmVkCisJCSAgZXZhbCBkZXBsaWJyYXJ5X25hbWVzPWAke1NFRH0gLW4gLWUgJ3MvXmxpYnJhcnlfbmFtZXM9XCguKlwpJC9cMS9wJyAkZGVwbGliYAorCQkgIGlmIHRlc3QgLW4gIiRkZXBsaWJyYXJ5X25hbWVzIiA7IHRoZW4KKwkJICAgIGZvciB0bXAgaW4gJGRlcGxpYnJhcnlfbmFtZXMgOyBkbworCQkgICAgICBkZXBkZXBsPSR0bXAKKwkJICAgIGRvbmUKKwkJICAgIGlmIHRlc3QgLWYgIiRwYXRoLyRkZXBkZXBsIiA7IHRoZW4KKwkJICAgICAgZGVwZGVwbD0iJHBhdGgvJGRlcGRlcGwiCisJCSAgICBmaQorCQkgICAgIyBkbyBub3QgYWRkIHBhdGhzIHdoaWNoIGFyZSBhbHJlYWR5IHRoZXJlCisJCSAgICBjYXNlICIgJG5ld2xpYl9zZWFyY2hfcGF0aCAiIGluCisJCSAgICAqIiAkcGF0aCAiKikgOzsKKwkJICAgICopIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkcGF0aCI7OworCQkgICAgZXNhYworCQkgIGZpCisJCSAgcGF0aD0iIgorCQkgIDs7CisJCSopCisJCSAgcGF0aD0iLUwkcGF0aCIKKwkJICA7OworCQllc2FjCisJCTs7CisJICAgICAgLWwqKQorCQljYXNlICRob3N0IGluCisJCSotKi1kYXJ3aW4qKQorCQkgICMgQWdhaW4sIHdlIG9ubHkgd2FudCB0byBsaW5rIGFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcworCQkgIGV2YWwgdG1wX2xpYnM9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAicyxeXC1sLCwiYAorCQkgIGZvciB0bXAgaW4gJG5ld2xpYl9zZWFyY2hfcGF0aCA7IGRvCisJCSAgICBpZiB0ZXN0IC1mICIkdG1wL2xpYiR0bXBfbGlicy5keWxpYiIgOyB0aGVuCisJCSAgICAgIGV2YWwgZGVwZGVwbD0iJHRtcC9saWIkdG1wX2xpYnMuZHlsaWIiCisJCSAgICAgIGJyZWFrCisJCSAgICBmaQorCQkgIGRvbmUKKwkJICBwYXRoPSIiCisJCSAgOzsKKwkJKikgY29udGludWUgOzsKKwkJZXNhYworCQk7OworCSAgICAgICopIGNvbnRpbnVlIDs7CisJICAgICAgZXNhYworCSAgICAgIGNhc2UgIiAkZGVwbGlicyAiIGluCisJICAgICAgKiIgJHBhdGggIiopIDs7CisJICAgICAgKikgZGVwbGlicz0iJHBhdGggJGRlcGxpYnMiIDs7CisJICAgICAgZXNhYworCSAgICAgIGNhc2UgIiAkZGVwbGlicyAiIGluCisJICAgICAgKiIgJGRlcGRlcGwgIiopIDs7CisJICAgICAgKikgZGVwbGlicz0iJGRlcGRlcGwgJGRlcGxpYnMiIDs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICBmaSAjIGxpbmtfYWxsX2RlcGxpYnMgIT0gbm8KKwlmaSAjIGxpbmttb2RlID0gbGliCisgICAgICBkb25lICMgZm9yIGRlcGxpYiBpbiAkbGlicworICAgICAgZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzIgorICAgICAgaWYgdGVzdCAiJHBhc3MiID0gZGxwcmVvcGVuOyB0aGVuCisJIyBMaW5rIHRoZSBkbHByZW9wZW5lZCBsaWJyYXJpZXMgYmVmb3JlIG90aGVyIGxpYnJhcmllcworCWZvciBkZXBsaWIgaW4gJHNhdmVfZGVwbGliczsgZG8KKwkgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJZG9uZQorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiRwYXNzIiAhPSBkbG9wZW47IHRoZW4KKwlpZiB0ZXN0ICIkcGFzcyIgIT0gY29udjsgdGhlbgorCSAgIyBNYWtlIHN1cmUgbGliX3NlYXJjaF9wYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgorCSAgbGliX3NlYXJjaF9wYXRoPQorCSAgZm9yIGRpciBpbiAkbmV3bGliX3NlYXJjaF9wYXRoOyBkbworCSAgICBjYXNlICIkbGliX3NlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGRpciAiKikgOzsKKwkgICAgKikgbGliX3NlYXJjaF9wYXRoPSIkbGliX3NlYXJjaF9wYXRoICRkaXIiIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwkgIG5ld2xpYl9zZWFyY2hfcGF0aD0KKwlmaQorCisJaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiAhPSAicHJvZyxsaW5rIjsgdGhlbgorCSAgdmFycz0iZGVwbGlicyIKKwllbHNlCisJICB2YXJzPSJjb21waWxlX2RlcGxpYnMgZmluYWxpemVfZGVwbGlicyIKKwlmaQorCWZvciB2YXIgaW4gJHZhcnMgZGVwZW5kZW5jeV9saWJzOyBkbworCSAgIyBBZGQgbGlicmFyaWVzIHRvICR2YXIgaW4gcmV2ZXJzZSBvcmRlcgorCSAgZXZhbCB0bXBfbGlicz1cIlwkJHZhclwiCisJICBuZXdfbGlicz0KKwkgIGZvciBkZXBsaWIgaW4gJHRtcF9saWJzOyBkbworCSAgICAjIEZJWE1FOiBQZWRhbnRpY2FsbHksIHRoaXMgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLCBzbworCSAgICAjICAgICAgICB0aGF0IHNvbWUgbmFzdHkgZGVwZW5kZW5jeSBsb29wIGlzbid0IGFjY2lkZW50YWxseQorCSAgICAjICAgICAgICBicm9rZW46CisJICAgICNuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiCisJICAgICMgUHJhZ21hdGljYWxseSwgdGhpcyBzZWVtcyB0byBjYXVzZSB2ZXJ5IGZldyBwcm9ibGVtcyBpbgorCSAgICAjIHByYWN0aWNlOgorCSAgICBjYXNlICRkZXBsaWIgaW4KKwkgICAgLUwqKSBuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiIDs7CisJICAgIC1SKikgOzsKKwkgICAgKikKKwkgICAgICAjIEFuZCBoZXJlIGlzIHRoZSByZWFzb246IHdoZW4gYSBsaWJyYXJ5IGFwcGVhcnMgbW9yZQorCSAgICAgICMgdGhhbiBvbmNlIGFzIGFuIGV4cGxpY2l0IGRlcGVuZGVuY2Ugb2YgYSBsaWJyYXJ5LCBvcgorCSAgICAgICMgaXMgaW1wbGljaXRseSBsaW5rZWQgaW4gbW9yZSB0aGFuIG9uY2UgYnkgdGhlCisJICAgICAgIyBjb21waWxlciwgaXQgaXMgY29uc2lkZXJlZCBzcGVjaWFsLCBhbmQgbXVsdGlwbGUKKwkgICAgICAjIG9jY3VycmVuY2VzIHRoZXJlb2YgYXJlIG5vdCByZW1vdmVkLiAgQ29tcGFyZSB0aGlzCisJICAgICAgIyB3aXRoIGhhdmluZyB0aGUgc2FtZSBsaWJyYXJ5IGJlaW5nIGxpc3RlZCBhcyBhCisJICAgICAgIyBkZXBlbmRlbmN5IG9mIG11bHRpcGxlIG90aGVyIGxpYnJhcmllczogaW4gdGhpcyBjYXNlLAorCSAgICAgICMgd2Uga25vdyAocGVkYW50aWNhbGx5LCB3ZSBhc3N1bWUpIHRoZSBsaWJyYXJ5IGRvZXMgbm90CisJICAgICAgIyBuZWVkIHRvIGJlIGxpc3RlZCBtb3JlIHRoYW4gb25jZSwgc28gd2Uga2VlcCBvbmx5IHRoZQorCSAgICAgICMgbGFzdCBjb3B5LiAgVGhpcyBpcyBub3QgYWx3YXlzIHJpZ2h0LCBidXQgaXQgaXMgcmFyZQorCSAgICAgICMgZW5vdWdoIHRoYXQgd2UgcmVxdWlyZSB1c2VycyB0aGF0IHJlYWxseSBtZWFuIHRvIHBsYXkKKwkgICAgICAjIHN1Y2ggdW5wb3J0YWJsZSBsaW5raW5nIHRyaWNrcyB0byBsaW5rIHRoZSBsaWJyYXJ5CisJICAgICAgIyB1c2luZyAtV2wsLWxuYW1lLCBzbyB0aGF0IGxpYnRvb2wgZG9lcyBub3QgY29uc2lkZXIgaXQKKwkgICAgICAjIGZvciBkdXBsaWNhdGUgcmVtb3ZhbC4KKwkgICAgICBjYXNlICIgJHNwZWNpYWxkZXBsaWJzICIgaW4KKwkgICAgICAqIiAkZGVwbGliICIqKSBuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiIDs7CisJICAgICAgKikKKwkJY2FzZSAiICRuZXdfbGlicyAiIGluCisJCSoiICRkZXBsaWIgIiopIDs7CisJCSopIG5ld19saWJzPSIkZGVwbGliICRuZXdfbGlicyIgOzsKKwkJZXNhYworCQk7OworCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICBkb25lCisJICB0bXBfbGlicz0KKwkgIGZvciBkZXBsaWIgaW4gJG5ld19saWJzOyBkbworCSAgICBjYXNlICRkZXBsaWIgaW4KKwkgICAgLUwqKQorCSAgICAgIGNhc2UgIiAkdG1wX2xpYnMgIiBpbgorCSAgICAgICoiICRkZXBsaWIgIiopIDs7CisJICAgICAgKikgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICAqKSB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwkgIGV2YWwgJHZhcj1cIiR0bXBfbGlic1wiCisJZG9uZSAjIGZvciB2YXIKKyAgICAgIGZpCisgICAgICAjIExhc3Qgc3RlcDogcmVtb3ZlIHJ1bnRpbWUgbGlicyBmcm9tIGRlcGVuZGVuY3lfbGlicworICAgICAgIyAodGhleSBzdGF5IGluIGRlcGxpYnMpCisgICAgICB0bXBfbGlicz0KKyAgICAgIGZvciBpIGluICRkZXBlbmRlbmN5X2xpYnMgOyBkbworCWNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgJGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCAiIGluCisJKiIgJGkgIiopCisJICBpPSIiCisJICA7OworCWVzYWMKKwlpZiB0ZXN0IC1uICIkaSIgOyB0aGVuCisJICB0bXBfbGlicz0iJHRtcF9saWJzICRpIgorCWZpCisgICAgICBkb25lCisgICAgICBkZXBlbmRlbmN5X2xpYnM9JHRtcF9saWJzCisgICAgZG9uZSAjIGZvciBwYXNzCisgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKyAgICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgorICAgICAgZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMiCisgICAgZmkKKworICAgIGNhc2UgJGxpbmttb2RlIGluCisgICAgb2xkbGliKQorICAgICAgaWYgdGVzdCAtbiAiJGRlcGxpYnMiOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtbCcgYW5kIFxgLUwnIGFyZSBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcnBhdGgnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkeHJwYXRoIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLVInIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvLy12ZXJzaW9uLW51bWJlcicgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1leHBvcnQtc3ltYm9scycgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgICMgTm93IHNldCB0aGUgdmFyaWFibGVzIGZvciBidWlsZGluZyBvbGQgbGlicmFyaWVzLgorICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisgICAgICBvbGRsaWJzPSIkb3V0cHV0IgorICAgICAgb2Jqcz0iJG9ianMkb2xkX2RlcGxpYnMiCisgICAgICA7OworCisgICAgbGliKQorICAgICAgIyBNYWtlIHN1cmUgd2Ugb25seSBnZW5lcmF0ZSBsaWJyYXJpZXMgb2YgdGhlIGZvcm0gYGxpYk5BTUUubGEnLgorICAgICAgY2FzZSAkb3V0cHV0bmFtZSBpbgorICAgICAgbGliKikKKwluYW1lPWAkZWNobyAiWCRvdXRwdXRuYW1lIiB8ICRYc2VkIC1lICdzL1wubGEkLy8nIC1lICdzL15saWIvLydgCisJZXZhbCBzaGFyZWRfZXh0PVwiJHNocmV4dF9jbWRzXCIKKwlldmFsIGxpYm5hbWU9XCIkbGlibmFtZV9zcGVjXCIKKwk7OworICAgICAgKikKKwlpZiB0ZXN0ICIkbW9kdWxlIiA9IG5vOyB0aGVuCisJICAkZWNobyAiJG1vZGVuYW1lOiBsaWJ0b29sIGxpYnJhcnkgXGAkb3V0cHV0JyBtdXN0IGJlZ2luIHdpdGggXGBsaWInIiAxPiYyCisJICAkZWNobyAiJGhlbHAiIDE+JjIKKwkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCWZpCisJaWYgdGVzdCAiJG5lZWRfbGliX3ByZWZpeCIgIT0gbm87IHRoZW4KKwkgICMgQWRkIHRoZSAibGliIiBwcmVmaXggZm9yIG1vZHVsZXMgaWYgcmVxdWlyZWQKKwkgIG5hbWU9YCRlY2hvICJYJG91dHB1dG5hbWUiIHwgJFhzZWQgLWUgJ3MvXC5sYSQvLydgCisJICBldmFsIHNoYXJlZF9leHQ9XCIkc2hyZXh0X2NtZHNcIgorCSAgZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCisJZWxzZQorCSAgbGlibmFtZT1gJGVjaG8gIlgkb3V0cHV0bmFtZSIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJ2AKKwlmaQorCTs7CisgICAgICBlc2FjCisKKyAgICAgIGlmIHRlc3QgLW4gIiRvYmpzIjsgdGhlbgorCWlmIHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgIT0gcGFzc19hbGw7IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBidWlsZCBsaWJ0b29sIGxpYnJhcnkgXGAkb3V0cHV0JyBmcm9tIG5vbi1saWJ0b29sIG9iamVjdHMgb24gdGhpcyBob3N0OiRvYmpzIiAyPiYxCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwllbHNlCisJICAkZWNobworCSAgJGVjaG8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIG5vbi1saWJ0b29sIgorCSAgJGVjaG8gIioqKiBvYmplY3RzICRvYmpzIGlzIG5vdCBwb3J0YWJsZSEiCisJICBsaWJvYmpzPSIkbGlib2JqcyAkb2JqcyIKKwlmaQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4gc2VsZicgaXMgaWdub3JlZCBmb3IgbGlidG9vbCBsaWJyYXJpZXMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIHNldCBkdW1teSAkcnBhdGgKKyAgICAgIGlmIHRlc3QgIiQjIiAtZ3QgMjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGlnbm9yaW5nIG11bHRpcGxlIFxgLXJwYXRoJ3MgZm9yIGEgbGlidG9vbCBsaWJyYXJ5IiAxPiYyCisgICAgICBmaQorICAgICAgaW5zdGFsbF9saWJkaXI9IiQyIgorCisgICAgICBvbGRsaWJzPQorICAgICAgaWYgdGVzdCAteiAiJHJwYXRoIjsgdGhlbgorCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisJICAjIEJ1aWxkaW5nIGEgbGlidG9vbCBjb252ZW5pZW5jZSBsaWJyYXJ5LgorCSAgIyBTb21lIGNvbXBpbGVycyBoYXZlIHByb2JsZW1zIHdpdGggYSBgLmFsJyBleHRlbnNpb24gc28KKwkgICMgY29udmVuaWVuY2UgbGlicmFyaWVzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGV4dGVuc2lvbiBhbgorCSAgIyBhcmNoaXZlIG5vcm1hbGx5IHdvdWxkLgorCSAgb2xkbGlicz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCAkb2xkbGlicyIKKwkgIGJ1aWxkX2xpYnRvb2xfbGlicz1jb252ZW5pZW5jZQorCSAgYnVpbGRfb2xkX2xpYnM9eWVzCisJZmkKKworCWlmIHRlc3QgLW4gIiR2aW5mbyI7IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mby8tdmVyc2lvbi1udW1iZXInIGlzIGlnbm9yZWQgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcyIgMT4mMgorCWZpCisKKwlpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcyIgMT4mMgorCWZpCisgICAgICBlbHNlCisKKwkjIFBhcnNlIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFyZ3VtZW50LgorCXNhdmVfaWZzPSIkSUZTIjsgSUZTPSc6JworCXNldCBkdW1teSAkdmluZm8gMCAwIDAKKwlJRlM9IiRzYXZlX2lmcyIKKworCWlmIHRlc3QgLW4gIiQ4IjsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogdG9vIG1hbnkgcGFyYW1ldGVycyB0byBcYC12ZXJzaW9uLWluZm8nIiAxPiYyCisJICAkZWNobyAiJGhlbHAiIDE+JjIKKwkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCWZpCisKKwkjIGNvbnZlcnQgYWJzb2x1dGUgdmVyc2lvbiBudW1iZXJzIHRvIGxpYnRvb2wgYWdlcworCSMgdGhpcyByZXRhaW5zIGNvbXBhdGliaWxpdHkgd2l0aCAubGEgZmlsZXMgYW5kIGF0dGVtcHRzCisJIyB0byBtYWtlIHRoZSBjb2RlIGJlbG93IGEgYml0IG1vcmUgY29tcHJlaGVuc2libGUKKworCWNhc2UgJHZpbmZvX251bWJlciBpbgorCXllcykKKwkgIG51bWJlcl9tYWpvcj0iJDIiCisJICBudW1iZXJfbWlub3I9IiQzIgorCSAgbnVtYmVyX3JldmlzaW9uPSIkNCIKKwkgICMKKwkgICMgVGhlcmUgYXJlIHJlYWxseSBvbmx5IHR3byBraW5kcyAtLSB0aG9zZSB0aGF0CisJICAjIHVzZSB0aGUgY3VycmVudCByZXZpc2lvbiBhcyB0aGUgbWFqb3IgdmVyc2lvbgorCSAgIyBhbmQgdGhvc2UgdGhhdCBzdWJ0cmFjdCBhZ2UgYW5kIHVzZSBhZ2UgYXMKKwkgICMgYSBtaW5vciB2ZXJzaW9uLiAgQnV0LCB0aGVuIHRoZXJlIGlzIGlyaXgKKwkgICMgd2hpY2ggaGFzIGFuIGV4dHJhIDEgYWRkZWQganVzdCBmb3IgZnVuCisJICAjCisJICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KKwkgIGRhcndpbnxsaW51eHxvc2Z8d2luZG93cykKKwkgICAgY3VycmVudD1gZXhwciAkbnVtYmVyX21ham9yICsgJG51bWJlcl9taW5vcmAKKwkgICAgYWdlPSIkbnVtYmVyX21pbm9yIgorCSAgICByZXZpc2lvbj0iJG51bWJlcl9yZXZpc2lvbiIKKwkgICAgOzsKKwkgIGZyZWVic2QtYW91dHxmcmVlYnNkLWVsZnxzdW5vcykKKwkgICAgY3VycmVudD0iJG51bWJlcl9tYWpvciIKKwkgICAgcmV2aXNpb249IiRudW1iZXJfbWlub3IiCisJICAgIGFnZT0iMCIKKwkgICAgOzsKKwkgIGlyaXh8bm9uc3RvcHV4KQorCSAgICBjdXJyZW50PWBleHByICRudW1iZXJfbWFqb3IgKyAkbnVtYmVyX21pbm9yIC0gMWAKKwkgICAgYWdlPSIkbnVtYmVyX21pbm9yIgorCSAgICByZXZpc2lvbj0iJG51bWJlcl9taW5vciIKKwkgICAgOzsKKwkgIGVzYWMKKwkgIDs7CisJbm8pCisJICBjdXJyZW50PSIkMiIKKwkgIHJldmlzaW9uPSIkMyIKKwkgIGFnZT0iJDQiCisJICA7OworCWVzYWMKKworCSMgQ2hlY2sgdGhhdCBlYWNoIG9mIHRoZSB0aGluZ3MgYXJlIHZhbGlkIG51bWJlcnMuCisJY2FzZSAkY3VycmVudCBpbgorCTB8WzEtOV18WzEtOV1bMC05XXxbMS05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV1bMC05XSkgOzsKKwkqKQorCSAgJGVjaG8gIiRtb2RlbmFtZTogQ1VSUkVOVCBcYCRjdXJyZW50JyBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgorCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgIDs7CisJZXNhYworCisJY2FzZSAkcmV2aXNpb24gaW4KKwkwfFsxLTldfFsxLTldWzAtOV18WzEtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldWzAtOV0pIDs7CisJKikKKwkgICRlY2hvICIkbW9kZW5hbWU6IFJFVklTSU9OIFxgJHJldmlzaW9uJyBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgorCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgIDs7CisJZXNhYworCisJY2FzZSAkYWdlIGluCisJMHxbMS05XXxbMS05XVswLTldfFsxLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XVswLTldKSA7OworCSopCisJICAkZWNobyAiJG1vZGVuYW1lOiBBR0UgXGAkYWdlJyBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgorCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgIDs7CisJZXNhYworCisJaWYgdGVzdCAiJGFnZSIgLWd0ICIkY3VycmVudCI7IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IEFHRSBcYCRhZ2UnIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBpbnRlcmZhY2UgbnVtYmVyIFxgJGN1cnJlbnQnIiAxPiYyCisJICAkZWNobyAiJG1vZGVuYW1lOiBcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iIDE+JjIKKwkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCWZpCisKKwkjIENhbGN1bGF0ZSB0aGUgdmVyc2lvbiB2YXJpYWJsZXMuCisJbWFqb3I9CisJdmVyc3VmZml4PQorCXZlcnN0cmluZz0KKwljYXNlICR2ZXJzaW9uX3R5cGUgaW4KKwlub25lKSA7OworCisJZGFyd2luKQorCSAgIyBMaWtlIExpbnV4LCBidXQgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIGF2YWlsYWJsZSBpbgorCSAgIyB2ZXJzdHJpbmcgZm9yIGNvZGluZyBpdCBpbnRvIHRoZSBsaWJyYXJ5IGhlYWRlcgorCSAgbWFqb3I9LmBleHByICRjdXJyZW50IC0gJGFnZWAKKwkgIHZlcnN1ZmZpeD0iJG1ham9yLiRhZ2UuJHJldmlzaW9uIgorCSAgIyBEYXJ3aW4gbGQgZG9lc24ndCBsaWtlIDAgZm9yIHRoZXNlIG9wdGlvbnMuLi4KKwkgIG1pbm9yX2N1cnJlbnQ9YGV4cHIgJGN1cnJlbnQgKyAxYAorCSAgdmVyc3RyaW5nPSIke3dsfS1jb21wYXRpYmlsaXR5X3ZlcnNpb24gJHt3bH0kbWlub3JfY3VycmVudCAke3dsfS1jdXJyZW50X3ZlcnNpb24gJHt3bH0kbWlub3JfY3VycmVudC4kcmV2aXNpb24iCisJICA7OworCisJZnJlZWJzZC1hb3V0KQorCSAgbWFqb3I9Ii4kY3VycmVudCIKKwkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRyZXZpc2lvbiI7CisJICA7OworCisJZnJlZWJzZC1lbGYpCisJICBtYWpvcj0iLiRjdXJyZW50IgorCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQiOworCSAgOzsKKworCWlyaXggfCBub25zdG9wdXgpCisJICBtYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2UgKyAxYAorCisJICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KKwkgICAgbm9uc3RvcHV4KSB2ZXJzdHJpbmdfcHJlZml4PW5vbnN0b3B1eCA7OworCSAgICAqKSAgICAgICAgIHZlcnN0cmluZ19wcmVmaXg9c2dpIDs7CisJICBlc2FjCisJICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmdfcHJlZml4JG1ham9yLiRyZXZpc2lvbiIKKworCSAgIyBBZGQgaW4gYWxsIHRoZSBpbnRlcmZhY2VzIHRoYXQgd2UgYXJlIGNvbXBhdGlibGUgd2l0aC4KKwkgIGxvb3A9JHJldmlzaW9uCisJICB3aGlsZSB0ZXN0ICIkbG9vcCIgLW5lIDA7IGRvCisJICAgIGlmYWNlPWBleHByICRyZXZpc2lvbiAtICRsb29wYAorCSAgICBsb29wPWBleHByICRsb29wIC0gMWAKKwkgICAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nX3ByZWZpeCRtYWpvci4kaWZhY2U6JHZlcnN0cmluZyIKKwkgIGRvbmUKKworCSAgIyBCZWZvcmUgdGhpcyBwb2ludCwgJG1ham9yIG11c3Qgbm90IGNvbnRhaW4gYC4nLgorCSAgbWFqb3I9LiRtYWpvcgorCSAgdmVyc3VmZml4PSIkbWFqb3IuJHJldmlzaW9uIgorCSAgOzsKKworCWxpbnV4KQorCSAgbWFqb3I9LmBleHByICRjdXJyZW50IC0gJGFnZWAKKwkgIHZlcnN1ZmZpeD0iJG1ham9yLiRhZ2UuJHJldmlzaW9uIgorCSAgOzsKKworCW9zZikKKwkgIG1ham9yPS5gZXhwciAkY3VycmVudCAtICRhZ2VgCisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kYWdlLiRyZXZpc2lvbiIKKwkgIHZlcnN0cmluZz0iJGN1cnJlbnQuJGFnZS4kcmV2aXNpb24iCisKKwkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCisJICBsb29wPSRhZ2UKKwkgIHdoaWxlIHRlc3QgIiRsb29wIiAtbmUgMDsgZG8KKwkgICAgaWZhY2U9YGV4cHIgJGN1cnJlbnQgLSAkbG9vcGAKKwkgICAgbG9vcD1gZXhwciAkbG9vcCAtIDFgCisJICAgIHZlcnN0cmluZz0iJHZlcnN0cmluZzoke2lmYWNlfS4wIgorCSAgZG9uZQorCisJICAjIE1ha2UgZXhlY3V0YWJsZXMgZGVwZW5kIG9uIG91ciBjdXJyZW50IHZlcnNpb24uCisJICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtjdXJyZW50fS4wIgorCSAgOzsKKworCXN1bm9zKQorCSAgbWFqb3I9Ii4kY3VycmVudCIKKwkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRyZXZpc2lvbiIKKwkgIDs7CisKKwl3aW5kb3dzKQorCSAgIyBVc2UgJy0nIHJhdGhlciB0aGFuICcuJywgc2luY2Ugd2Ugb25seSB3YW50IG9uZQorCSAgIyBleHRlbnNpb24gb24gRE9TIDguMyBmaWxlc3lzdGVtcy4KKwkgIG1ham9yPWBleHByICRjdXJyZW50IC0gJGFnZWAKKwkgIHZlcnN1ZmZpeD0iLSRtYWpvciIKKwkgIDs7CisKKwkqKQorCSAgJGVjaG8gIiRtb2RlbmFtZTogdW5rbm93biBsaWJyYXJ5IHZlcnNpb24gdHlwZSBcYCR2ZXJzaW9uX3R5cGUnIiAxPiYyCisJICAkZWNobyAiRmF0YWwgY29uZmlndXJhdGlvbiBlcnJvci4gIFNlZSB0aGUgJFBBQ0tBR0UgZG9jcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKKwkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgOzsKKwllc2FjCisKKwkjIENsZWFyIHRoZSB2ZXJzaW9uIGluZm8gaWYgd2UgZGVmYXVsdGVkLCBhbmQgdGhleSBzcGVjaWZpZWQgYSByZWxlYXNlLgorCWlmIHRlc3QgLXogIiR2aW5mbyIgJiYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCisJICBtYWpvcj0KKwkgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorCSAgZGFyd2luKQorCSAgICAjIHdlIGNhbid0IGNoZWNrIGZvciAiMC4wIiBpbiBhcmNoaXZlX2NtZHMgZHVlIHRvIHF1b3RpbmcKKwkgICAgIyBwcm9ibGVtcywgc28gd2UgcmVzZXQgaXQgY29tcGxldGVseQorCSAgICB2ZXJzdHJpbmc9CisJICAgIDs7CisJICAqKQorCSAgICB2ZXJzdHJpbmc9IjAuMCIKKwkgICAgOzsKKwkgIGVzYWMKKwkgIGlmIHRlc3QgIiRuZWVkX3ZlcnNpb24iID0gbm87IHRoZW4KKwkgICAgdmVyc3VmZml4PQorCSAgZWxzZQorCSAgICB2ZXJzdWZmaXg9Ii4wLjAiCisJICBmaQorCWZpCisKKwkjIFJlbW92ZSB2ZXJzaW9uIGluZm8gZnJvbSBuYW1lIGlmIHZlcnNpb25pbmcgc2hvdWxkIGJlIGF2b2lkZWQKKwlpZiB0ZXN0ICIkYXZvaWRfdmVyc2lvbiIgPSB5ZXMgJiYgdGVzdCAiJG5lZWRfdmVyc2lvbiIgPSBubzsgdGhlbgorCSAgbWFqb3I9CisJICB2ZXJzdWZmaXg9CisJICB2ZXJzdHJpbmc9IiIKKwlmaQorCisJIyBDaGVjayB0byBzZWUgaWYgdGhlIGFyY2hpdmUgd2lsbCBoYXZlIHVuZGVmaW5lZCBzeW1ib2xzLgorCWlmIHRlc3QgIiRhbGxvd191bmRlZmluZWQiID0geWVzOyB0aGVuCisJICBpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkX2ZsYWciID0gdW5zdXBwb3J0ZWQ7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogdW5kZWZpbmVkIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gJGhvc3Qgc2hhcmVkIGxpYnJhcmllcyIgMT4mMgorCSAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KKwkgICAgYnVpbGRfb2xkX2xpYnM9eWVzCisJICBmaQorCWVsc2UKKwkgICMgRG9uJ3QgYWxsb3cgdW5kZWZpbmVkIHN5bWJvbHMuCisJICBhbGxvd191bmRlZmluZWRfZmxhZz0iJG5vX3VuZGVmaW5lZF9mbGFnIgorCWZpCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbW9kZSIgIT0gcmVsaW5rOyB0aGVuCisJIyBSZW1vdmUgb3VyIG91dHB1dHMsIGJ1dCBkb24ndCByZW1vdmUgb2JqZWN0IGZpbGVzIHNpbmNlIHRoZXkKKwkjIG1heSBoYXZlIGJlZW4gY3JlYXRlZCB3aGVuIGNvbXBpbGluZyBQSUMgb2JqZWN0cy4KKwlyZW1vdmVsaXN0PQorCXRlbXByZW1vdmVsaXN0PWAkZWNobyAiJG91dHB1dF9vYmpkaXIvKiJgCisJZm9yIHAgaW4gJHRlbXByZW1vdmVsaXN0OyBkbworCSAgY2FzZSAkcCBpbgorCSAgICAqLiRvYmpleHQpCisJICAgICAgIDs7CisJICAgICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lIHwgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuKiB8ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0ke3JlbGVhc2V9LiopCisJICAgICAgIGlmIHRlc3QgIlgkcHJlY2lvdXNfZmlsZXNfcmVnZXgiICE9ICJYIjsgdGhlbgorCSAgICAgICAgIGlmIGVjaG8gJHAgfCAkRUdSRVAgLWUgIiRwcmVjaW91c19maWxlc19yZWdleCIgPi9kZXYvbnVsbCAyPiYxCisJICAgICAgICAgdGhlbgorCQkgICBjb250aW51ZQorCQkgZmkKKwkgICAgICAgZmkKKwkgICAgICAgcmVtb3ZlbGlzdD0iJHJlbW92ZWxpc3QgJHAiCisJICAgICAgIDs7CisJICAgICopIDs7CisJICBlc2FjCisJZG9uZQorCWlmIHRlc3QgLW4gIiRyZW1vdmVsaXN0IjsgdGhlbgorCSAgJHNob3cgIiR7cm19ciAkcmVtb3ZlbGlzdCIKKwkgICRydW4gJHtybX1yICRyZW1vdmVsaXN0CisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgTm93IHNldCB0aGUgdmFyaWFibGVzIGZvciBidWlsZGluZyBvbGQgbGlicmFyaWVzLgorICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSBjb252ZW5pZW5jZSA7IHRoZW4KKwlvbGRsaWJzPSIkb2xkbGlicyAkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgorCisJIyBUcmFuc2Zvcm0gLmxvIGZpbGVzIHRvIC5vIGZpbGVzLgorCW9sZG9ianM9IiRvYmpzICJgJGVjaG8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAnL1wuJyR7bGliZXh0fSckL2QnIC1lICIkbG8ybyIgfCAkTkwyU1BgCisgICAgICBmaQorCisgICAgICAjIEVsaW1pbmF0ZSBhbGwgdGVtcG9yYXJ5IGRpcmVjdG9yaWVzLgorICAgICAgZm9yIHBhdGggaW4gJG5vdGluc3RfcGF0aDsgZG8KKwlsaWJfc2VhcmNoX3BhdGg9YCRlY2hvICIkbGliX3NlYXJjaF9wYXRoICIgfCAke1NFRH0gLWUgInMlICRwYXRoICUgJWciYAorCWRlcGxpYnM9YCRlY2hvICIkZGVwbGlicyAiIHwgJHtTRUR9IC1lICJzJSAtTCRwYXRoICUgJWciYAorCWRlcGVuZGVuY3lfbGlicz1gJGVjaG8gIiRkZXBlbmRlbmN5X2xpYnMgIiB8ICR7U0VEfSAtZSAicyUgLUwkcGF0aCAlICVnImAKKyAgICAgIGRvbmUKKworICAgICAgaWYgdGVzdCAtbiAiJHhycGF0aCI7IHRoZW4KKwkjIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhbnkgcnBhdGggZmxhZ3MsIHRoZW4gYWRkIHRoZW0uCisJdGVtcF94cnBhdGg9CisJZm9yIGxpYmRpciBpbiAkeHJwYXRoOyBkbworCSAgdGVtcF94cnBhdGg9IiR0ZW1wX3hycGF0aCAtUiRsaWJkaXIiCisJICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlkb25lCisJaWYgdGVzdCAiJGhhcmRjb2RlX2ludG9fbGlicyIgIT0geWVzIHx8IHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKwkgIGRlcGVuZGVuY3lfbGlicz0iJHRlbXBfeHJwYXRoICRkZXBlbmRlbmN5X2xpYnMiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgTWFrZSBzdXJlIGRsZmlsZXMgY29udGFpbnMgb25seSB1bmlxdWUgZmlsZXMgdGhhdCB3b24ndCBiZSBkbHByZW9wZW5lZAorICAgICAgb2xkX2RsZmlsZXM9IiRkbGZpbGVzIgorICAgICAgZGxmaWxlcz0KKyAgICAgIGZvciBsaWIgaW4gJG9sZF9kbGZpbGVzOyBkbworCWNhc2UgIiAkZGxwcmVmaWxlcyAkZGxmaWxlcyAiIGluCisJKiIgJGxpYiAiKikgOzsKKwkqKSBkbGZpbGVzPSIkZGxmaWxlcyAkbGliIiA7OworCWVzYWMKKyAgICAgIGRvbmUKKworICAgICAgIyBNYWtlIHN1cmUgZGxwcmVmaWxlcyBjb250YWlucyBvbmx5IHVuaXF1ZSBmaWxlcworICAgICAgb2xkX2RscHJlZmlsZXM9IiRkbHByZWZpbGVzIgorICAgICAgZGxwcmVmaWxlcz0KKyAgICAgIGZvciBsaWIgaW4gJG9sZF9kbHByZWZpbGVzOyBkbworCWNhc2UgIiRkbHByZWZpbGVzICIgaW4KKwkqIiAkbGliICIqKSA7OworCSopIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRsaWIiIDs7CisJZXNhYworICAgICAgZG9uZQorCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCWlmIHRlc3QgLW4gIiRycGF0aCI7IHRoZW4KKwkgIGNhc2UgJGhvc3QgaW4KKwkgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqIHwgKi0qLWJlb3MqKQorCSAgICAjIHRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIGMgbGlicmFyeSAoYXMgc3VjaCkhCisJICAgIDs7CisJICAqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCisJICAgICMgUmhhcHNvZHkgQyBsaWJyYXJ5IGlzIGluIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCisJICAgIGRlcGxpYnM9IiRkZXBsaWJzIC1mcmFtZXdvcmsgU3lzdGVtIgorCSAgICA7OworCSAgKi0qLW5ldGJzZCopCisJICAgICMgRG9uJ3QgbGluayB3aXRoIGxpYmMgdW50aWwgdGhlIGEub3V0IGxkLnNvIGlzIGZpeGVkLgorCSAgICA7OworCSAgKi0qLW9wZW5ic2QqIHwgKi0qLWZyZWVic2QqIHwgKi0qLWRyYWdvbmZseSopCisJICAgICMgRG8gbm90IGluY2x1ZGUgbGliYyBkdWUgdG8gdXMgaGF2aW5nIGxpYmMvbGliY19yLgorCSAgICA7OworCSAgKi0qLXNjbzMuMnY1KiB8ICotKi1zY281djYqKQorCSAgICAjIENhdXNlcyBwcm9ibGVtcyB3aXRoIF9fY3R5cGUKKwkgICAgOzsKKwkgICotKi1zeXN2NC4ydXcyKiB8ICotKi1zeXN2NSogfCAqLSotdW5peHdhcmUqIHwgKi0qLU9wZW5VTklYKikKKwkgICAgIyBDb21waWxlciBpbnNlcnRzIGxpYmMgaW4gdGhlIGNvcnJlY3QgcGxhY2UgZm9yIHRocmVhZHMgdG8gd29yaworCSAgICA7OworIAkgICopCisJICAgICMgQWRkIGxpYmMgdG8gZGVwbGlicyBvbiBhbGwgb3RoZXIgc3lzdGVtcyBpZiBuZWNlc3NhcnkuCisJICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX25lZWRfbGMiID0gInllcyI7IHRoZW4KKwkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAtbGMiCisJICAgIGZpCisJICAgIDs7CisJICBlc2FjCisJZmkKKworCSMgVHJhbnNmb3JtIGRlcGxpYnMgaW50byBvbmx5IGRlcGxpYnMgdGhhdCBjYW4gYmUgbGlua2VkIGluIHNoYXJlZC4KKwluYW1lX3NhdmU9JG5hbWUKKwlsaWJuYW1lX3NhdmU9JGxpYm5hbWUKKwlyZWxlYXNlX3NhdmU9JHJlbGVhc2UKKwl2ZXJzdWZmaXhfc2F2ZT0kdmVyc3VmZml4CisJbWFqb3Jfc2F2ZT0kbWFqb3IKKwkjIEknbSBub3Qgc3VyZSBpZiBJJ20gdHJlYXRpbmcgdGhlIHJlbGVhc2UgY29ycmVjdGx5LiAgSSB0aGluaworCSMgcmVsZWFzZSBzaG91bGQgc2hvdyB1cCBpbiB0aGUgLWwgKGllIC1sZ21wNSkgc28gd2UgZG9uJ3Qgd2FudCB0bworCSMgYWRkIGl0IGluIHR3aWNlLiAgSXMgdGhhdCBjb3JyZWN0PworCXJlbGVhc2U9IiIKKwl2ZXJzdWZmaXg9IiIKKwltYWpvcj0iIgorCW5ld2RlcGxpYnM9CisJZHJvcHBlZGRlcHM9bm8KKwljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCXBhc3NfYWxsKQorCSAgIyBEb24ndCBjaGVjayBmb3Igc2hhcmVkL3N0YXRpYy4gIEV2ZXJ5dGhpbmcgd29ya3MuCisJICAjIFRoaXMgbWlnaHQgYmUgYSBsaXR0bGUgbmFpdmUuICBXZSBtaWdodCB3YW50IHRvIGNoZWNrCisJICAjIHdoZXRoZXIgdGhlIGxpYnJhcnkgZXhpc3RzIG9yIG5vdC4gIEJ1dCB0aGlzIGlzIG9uCisJICAjIG9zZjMgJiBvc2Y0IGFuZCBJJ20gbm90IHJlYWxseSBzdXJlLi4uIEp1c3QKKwkgICMgaW1wbGVtZW50aW5nIHdoYXQgd2FzIGFscmVhZHkgdGhlIGJlaGF2aW9yLgorCSAgbmV3ZGVwbGlicz0kZGVwbGlicworCSAgOzsKKwl0ZXN0X2NvbXBpbGUpCisJICAjIFRoaXMgY29kZSBzdHJlc3NlcyB0aGUgImxpYnJhcmllcyBhcmUgcHJvZ3JhbXMiIHBhcmFkaWdtIHRvIGl0cworCSAgIyBsaW1pdHMuIE1heWJlIGV2ZW4gYnJlYWtzIGl0LiAgV2UgY29tcGlsZSBhIHByb2dyYW0sIGxpbmtpbmcgaXQKKwkgICMgYWdhaW5zdCB0aGUgZGVwbGlicyBhcyBhIHByb3h5IGZvciB0aGUgbGlicmFyeS4gIFRoZW4gd2UgY2FuIGNoZWNrCisJICAjIHdoZXRoZXIgdGhleSBsaW5rZWQgaW4gc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIGxkZC4KKwkgICRybSBjb25mdGVzdC5jCisJICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCisJICBpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KK0VPRgorCSAgJHJtIGNvbmZ0ZXN0CisJICAkTFRDQyAkTFRDRkxBR1MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAkZGVwbGlicworCSAgaWYgdGVzdCAiJD8iIC1lcSAwIDsgdGhlbgorCSAgICBsZGRfb3V0cHV0PWBsZGQgY29uZnRlc3RgCisJICAgIGZvciBpIGluICRkZXBsaWJzOyBkbworCSAgICAgIG5hbWU9YGV4cHIgJGkgOiAnLWxcKC4qXCknYAorCSAgICAgICMgSWYgJG5hbWUgaXMgZW1wdHkgd2UgYXJlIG9wZXJhdGluZyBvbiBhIC1MIGFyZ3VtZW50LgorICAgICAgICAgICAgICBpZiB0ZXN0ICIkbmFtZSIgIT0gIiIgJiYgdGVzdCAiJG5hbWUiIC1uZSAiMCI7IHRoZW4KKwkJaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCQkgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgorCQkgICoiICRpICIqKQorCQkgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCisJCSAgICBpPSIiCisJCSAgICA7OworCQkgIGVzYWMKKwkgICAgICAgIGZpCisJCWlmIHRlc3QgLW4gIiRpIiA7IHRoZW4KKwkJICBsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCisJCSAgZGVwbGliX21hdGNoZXM9YGV2YWwgXFwkZWNobyBcIiRsaWJyYXJ5X25hbWVzX3NwZWNcImAKKwkJICBzZXQgZHVtbXkgJGRlcGxpYl9tYXRjaGVzCisJCSAgZGVwbGliX21hdGNoPSQyCisJCSAgaWYgdGVzdCBgZXhwciAiJGxkZF9vdXRwdXQiIDogIi4qJGRlcGxpYl9tYXRjaCJgIC1uZSAwIDsgdGhlbgorCQkgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCisJCSAgZWxzZQorCQkgICAgZHJvcHBlZGRlcHM9eWVzCisJCSAgICAkZWNobworCQkgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBkeW5hbWljIGxpbmtlciBkb2VzIG5vdCBhY2NlcHQgbmVlZGVkIGxpYnJhcnkgJGkuIgorCQkgICAgJGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJCSAgICAkZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJICAgICRlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIEkgYmVsaWV2ZSB5b3UgZG8gbm90IGhhdmUiCisJCSAgICAkZWNobyAiKioqIGJlY2F1c2UgYSB0ZXN0X2NvbXBpbGUgZGlkIHJldmVhbCB0aGF0IHRoZSBsaW5rZXIgZGlkIG5vdCB1c2UgaXQgZm9yIgorCQkgICAgJGVjaG8gIioqKiBpdHMgZHluYW1pYyBkZXBlbmRlbmN5IGxpc3QgdGhhdCBwcm9ncmFtcyBnZXQgcmVzb2x2ZWQgd2l0aCBhdCBydW50aW1lLiIKKwkJICBmaQorCQlmaQorCSAgICAgIGVsc2UKKwkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCisJICAgICAgZmkKKwkgICAgZG9uZQorCSAgZWxzZQorCSAgICAjIEVycm9yIG9jY3VycmVkIGluIHRoZSBmaXJzdCBjb21waWxlLiAgTGV0J3MgdHJ5IHRvIHNhbHZhZ2UKKwkgICAgIyB0aGUgc2l0dWF0aW9uOiBDb21waWxlIGEgc2VwYXJhdGUgcHJvZ3JhbSBmb3IgZWFjaCBsaWJyYXJ5LgorCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KKwkgICAgICBuYW1lPWBleHByICRpIDogJy1sXCguKlwpJ2AKKwkgICAgICAjIElmICRuYW1lIGlzIGVtcHR5IHdlIGFyZSBvcGVyYXRpbmcgb24gYSAtTCBhcmd1bWVudC4KKyAgICAgICAgICAgICAgaWYgdGVzdCAiJG5hbWUiICE9ICIiICYmIHRlc3QgIiRuYW1lIiAhPSAiMCI7IHRoZW4KKwkJJHJtIGNvbmZ0ZXN0CisJCSRMVENDICRMVENGTEFHUyAtbyBjb25mdGVzdCBjb25mdGVzdC5jICRpCisJCSMgRGlkIGl0IHdvcms/CisJCWlmIHRlc3QgIiQ/IiAtZXEgMCA7IHRoZW4KKwkJICBsZGRfb3V0cHV0PWBsZGQgY29uZnRlc3RgCisJCSAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCQkgICAgY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCisJCSAgICAqIiAkaSAiKikKKwkJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCisJCSAgICAgIGk9IiIKKwkJICAgICAgOzsKKwkJICAgIGVzYWMKKwkJICBmaQorCQkgIGlmIHRlc3QgLW4gIiRpIiA7IHRoZW4KKwkJICAgIGxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKKwkJICAgIGRlcGxpYl9tYXRjaGVzPWBldmFsIFxcJGVjaG8gXCIkbGlicmFyeV9uYW1lc19zcGVjXCJgCisJCSAgICBzZXQgZHVtbXkgJGRlcGxpYl9tYXRjaGVzCisJCSAgICBkZXBsaWJfbWF0Y2g9JDIKKwkJICAgIGlmIHRlc3QgYGV4cHIgIiRsZGRfb3V0cHV0IiA6ICIuKiRkZXBsaWJfbWF0Y2giYCAtbmUgMCA7IHRoZW4KKwkJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCisJCSAgICBlbHNlCisJCSAgICAgIGRyb3BwZWRkZXBzPXllcworCQkgICAgICAkZWNobworCQkgICAgICAkZWNobyAiKioqIFdhcm5pbmc6IGR5bmFtaWMgbGlua2VyIGRvZXMgbm90IGFjY2VwdCBuZWVkZWQgbGlicmFyeSAkaS4iCisJCSAgICAgICRlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCQkgICAgICAkZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJICAgICAgJGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKKwkJICAgICAgJGVjaG8gIioqKiBiZWNhdXNlIGEgdGVzdF9jb21waWxlIGRpZCByZXZlYWwgdGhhdCB0aGUgbGlua2VyIGRpZCBub3QgdXNlIHRoaXMgb25lIgorCQkgICAgICAkZWNobyAiKioqIGFzIGEgZHluYW1pYyBkZXBlbmRlbmN5IHRoYXQgcHJvZ3JhbXMgY2FuIGdldCByZXNvbHZlZCB3aXRoIGF0IHJ1bnRpbWUuIgorCQkgICAgZmkKKwkJICBmaQorCQllbHNlCisJCSAgZHJvcHBlZGRlcHM9eWVzCisJCSAgJGVjaG8KKwkJICAkZWNobyAiKioqIFdhcm5pbmchICBMaWJyYXJ5ICRpIGlzIG5lZWRlZCBieSB0aGlzIGxpYnJhcnkgYnV0IEkgd2FzIG5vdCBhYmxlIHRvIgorCQkgICRlY2hvICIqKiogIG1ha2UgaXQgbGluayBpbiEgIFlvdSB3aWxsIHByb2JhYmx5IG5lZWQgdG8gaW5zdGFsbCBpdCBvciBzb21lIgorCQkgICRlY2hvICIqKiogbGlicmFyeSB0aGF0IGl0IGRlcGVuZHMgb24gYmVmb3JlIHRoaXMgbGlicmFyeSB3aWxsIGJlIGZ1bGx5IgorCQkgICRlY2hvICIqKiogZnVuY3Rpb25hbC4gIEluc3RhbGxpbmcgaXQgYmVmb3JlIGNvbnRpbnVpbmcgd291bGQgYmUgZXZlbiBiZXR0ZXIuIgorCQlmaQorCSAgICAgIGVsc2UKKwkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCisJICAgICAgZmkKKwkgICAgZG9uZQorCSAgZmkKKwkgIDs7CisJZmlsZV9tYWdpYyopCisJICBzZXQgZHVtbXkgJGRlcGxpYnNfY2hlY2tfbWV0aG9kCisJICBmaWxlX21hZ2ljX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogIiQyIFwoLipcKSJgCisJICBmb3IgYV9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisJICAgIG5hbWU9YGV4cHIgJGFfZGVwbGliIDogJy1sXCguKlwpJ2AKKwkgICAgIyBJZiAkbmFtZSBpcyBlbXB0eSB3ZSBhcmUgb3BlcmF0aW5nIG9uIGEgLUwgYXJndW1lbnQuCisgICAgICAgICAgICBpZiB0ZXN0ICIkbmFtZSIgIT0gIiIgJiYgdGVzdCAgIiRuYW1lIiAhPSAiMCI7IHRoZW4KKwkgICAgICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCisJCWNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgorCQkqIiAkYV9kZXBsaWIgIiopCisJCSAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgorCQkgIGFfZGVwbGliPSIiCisJCSAgOzsKKwkJZXNhYworCSAgICAgIGZpCisJICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KKwkJbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAorCQlmb3IgaSBpbiAkbGliX3NlYXJjaF9wYXRoICRzeXNfbGliX3NlYXJjaF9wYXRoICRzaGxpYl9zZWFyY2hfcGF0aDsgZG8KKwkJICBwb3RlbnRpYWxfbGlicz1gbHMgJGkvJGxpYm5hbWVbLi1dKiAyPi9kZXYvbnVsbGAKKwkJICBmb3IgcG90ZW50X2xpYiBpbiAkcG90ZW50aWFsX2xpYnM7IGRvCisJCSAgICAgICMgRm9sbG93IHNvZnQgbGlua3MuCisJCSAgICAgIGlmIGxzIC1sTGQgIiRwb3RlbnRfbGliIiAyPi9kZXYvbnVsbCBcCisJCQkgfCBncmVwICIgLT4gIiA+L2Rldi9udWxsOyB0aGVuCisJCQljb250aW51ZQorCQkgICAgICBmaQorCQkgICAgICAjIFRoZSBzdGF0ZW1lbnQgYWJvdmUgdHJpZXMgdG8gYXZvaWQgZW50ZXJpbmcgYW4KKwkJICAgICAgIyBlbmRsZXNzIGxvb3AgYmVsb3csIGluIGNhc2Ugb2YgY3ljbGljIGxpbmtzLgorCQkgICAgICAjIFdlIG1pZ2h0IHN0aWxsIGVudGVyIGFuIGVuZGxlc3MgbG9vcCwgc2luY2UgYSBsaW5rCisJCSAgICAgICMgbG9vcCBjYW4gYmUgY2xvc2VkIHdoaWxlIHdlIGZvbGxvdyBsaW5rcywKKwkJICAgICAgIyBidXQgc28gd2hhdD8KKwkJICAgICAgcG90bGliPSIkcG90ZW50X2xpYiIKKwkJICAgICAgd2hpbGUgdGVzdCAtaCAiJHBvdGxpYiIgMj4vZGV2L251bGw7IGRvCisJCQlwb3RsaWJsaW5rPWBscyAtbGQgJHBvdGxpYiB8ICR7U0VEfSAncy8uKiAtPiAvLydgCisJCQljYXNlICRwb3RsaWJsaW5rIGluCisJCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIHBvdGxpYj0iJHBvdGxpYmxpbmsiOzsKKwkJCSopIHBvdGxpYj1gJGVjaG8gIlgkcG90bGliIiB8ICRYc2VkIC1lICdzLFteL10qJCwsJ2AiJHBvdGxpYmxpbmsiOzsKKwkJCWVzYWMKKwkJICAgICAgZG9uZQorCQkgICAgICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcIlwkcG90bGliXCIgMj4vZGV2L251bGwgXAorCQkJIHwgJHtTRUR9IDEwcSBcCisJCQkgfCAkRUdSRVAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgorCQkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgorCQkJYV9kZXBsaWI9IiIKKwkJCWJyZWFrIDIKKwkJICAgICAgZmkKKwkJICBkb25lCisJCWRvbmUKKwkgICAgICBmaQorCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCisJCWRyb3BwZWRkZXBzPXllcworCQkkZWNobworCQkkZWNobyAiKioqIFdhcm5pbmc6IGxpbmtlciBwYXRoIGRvZXMgbm90IGhhdmUgcmVhbCBmaWxlIGZvciBsaWJyYXJ5ICRhX2RlcGxpYi4iCisJCSRlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCQkkZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJJGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKKwkJJGVjaG8gIioqKiBiZWNhdXNlIEkgZGlkIGNoZWNrIHRoZSBsaW5rZXIgcGF0aCBsb29raW5nIGZvciBhIGZpbGUgc3RhcnRpbmciCisJCWlmIHRlc3QgLXogIiRwb3RsaWIiIDsgdGhlbgorCQkgICRlY2hvICIqKiogd2l0aCAkbGlibmFtZSBidXQgbm8gY2FuZGlkYXRlcyB3ZXJlIGZvdW5kLiAoLi4uZm9yIGZpbGUgbWFnaWMgdGVzdCkiCisJCWVsc2UKKwkJICAkZWNobyAiKioqIHdpdGggJGxpYm5hbWUgYW5kIG5vbmUgb2YgdGhlIGNhbmRpZGF0ZXMgcGFzc2VkIGEgZmlsZSBmb3JtYXQgdGVzdCIKKwkJICAkZWNobyAiKioqIHVzaW5nIGEgZmlsZSBtYWdpYy4gTGFzdCBmaWxlIGNoZWNrZWQ6ICRwb3RsaWIiCisJCWZpCisJICAgICAgZmkKKwkgICAgZWxzZQorCSAgICAgICMgQWRkIGEgLUwgYXJndW1lbnQuCisJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgorCSAgICBmaQorCSAgZG9uZSAjIEdvbmUgdGhyb3VnaCBhbGwgZGVwbGlicy4KKwkgIDs7CisJbWF0Y2hfcGF0dGVybiopCisJICBzZXQgZHVtbXkgJGRlcGxpYnNfY2hlY2tfbWV0aG9kCisJICBtYXRjaF9wYXR0ZXJuX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogIiQyIFwoLipcKSJgCisJICBmb3IgYV9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisJICAgIG5hbWU9YGV4cHIgJGFfZGVwbGliIDogJy1sXCguKlwpJ2AKKwkgICAgIyBJZiAkbmFtZSBpcyBlbXB0eSB3ZSBhcmUgb3BlcmF0aW5nIG9uIGEgLUwgYXJndW1lbnQuCisJICAgIGlmIHRlc3QgLW4gIiRuYW1lIiAmJiB0ZXN0ICIkbmFtZSIgIT0gIjAiOyB0aGVuCisJICAgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCQljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KKwkJKiIgJGFfZGVwbGliICIqKQorCQkgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKKwkJICBhX2RlcGxpYj0iIgorCQkgIDs7CisJCWVzYWMKKwkgICAgICBmaQorCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCisJCWxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKKwkJZm9yIGkgaW4gJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGg7IGRvCisJCSAgcG90ZW50aWFsX2xpYnM9YGxzICRpLyRsaWJuYW1lWy4tXSogMj4vZGV2L251bGxgCisJCSAgZm9yIHBvdGVudF9saWIgaW4gJHBvdGVudGlhbF9saWJzOyBkbworCQkgICAgcG90bGliPSIkcG90ZW50X2xpYiIgIyBzZWUgc3ltbGluay1jaGVjayBhYm92ZSBpbiBmaWxlX21hZ2ljIHRlc3QKKwkJICAgIGlmIGV2YWwgJGVjaG8gXCIkcG90ZW50X2xpYlwiIDI+L2Rldi9udWxsIFwKKwkJICAgICAgICB8ICR7U0VEfSAxMHEgXAorCQkgICAgICAgIHwgJEVHUkVQICIkbWF0Y2hfcGF0dGVybl9yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgorCQkgICAgICBhX2RlcGxpYj0iIgorCQkgICAgICBicmVhayAyCisJCSAgICBmaQorCQkgIGRvbmUKKwkJZG9uZQorCSAgICAgIGZpCisJICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KKwkJZHJvcHBlZGRlcHM9eWVzCisJCSRlY2hvCisJCSRlY2hvICIqKiogV2FybmluZzogbGlua2VyIHBhdGggZG9lcyBub3QgaGF2ZSByZWFsIGZpbGUgZm9yIGxpYnJhcnkgJGFfZGVwbGliLiIKKwkJJGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJCSRlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgorCQkkZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgorCQkkZWNobyAiKioqIGJlY2F1c2UgSSBkaWQgY2hlY2sgdGhlIGxpbmtlciBwYXRoIGxvb2tpbmcgZm9yIGEgZmlsZSBzdGFydGluZyIKKwkJaWYgdGVzdCAteiAiJHBvdGxpYiIgOyB0aGVuCisJCSAgJGVjaG8gIioqKiB3aXRoICRsaWJuYW1lIGJ1dCBubyBjYW5kaWRhdGVzIHdlcmUgZm91bmQuICguLi5mb3IgcmVnZXggcGF0dGVybiB0ZXN0KSIKKwkJZWxzZQorCQkgICRlY2hvICIqKiogd2l0aCAkbGlibmFtZSBhbmQgbm9uZSBvZiB0aGUgY2FuZGlkYXRlcyBwYXNzZWQgYSBmaWxlIGZvcm1hdCB0ZXN0IgorCQkgICRlY2hvICIqKiogdXNpbmcgYSByZWdleCBwYXR0ZXJuLiBMYXN0IGZpbGUgY2hlY2tlZDogJHBvdGxpYiIKKwkJZmkKKwkgICAgICBmaQorCSAgICBlbHNlCisJICAgICAgIyBBZGQgYSAtTCBhcmd1bWVudC4KKwkgICAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCisJICAgIGZpCisJICBkb25lICMgR29uZSB0aHJvdWdoIGFsbCBkZXBsaWJzLgorCSAgOzsKKwlub25lIHwgdW5rbm93biB8ICopCisJICBuZXdkZXBsaWJzPSIiCisJICB0bXBfZGVwbGlicz1gJGVjaG8gIlggJGRlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvIC1sYyQvLycgXAorCSAgICAtZSAncy8gLVtMUl1bXiBdKi8vZydgCisJICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCisJICAgIGZvciBpIGluICRwcmVkZXBzICRwb3N0ZGVwcyA7IGRvCisJICAgICAgIyBjYW4ndCB1c2UgWHNlZCBiZWxvdywgYmVjYXVzZSAkaSBtaWdodCBjb250YWluICcvJworCSAgICAgIHRtcF9kZXBsaWJzPWAkZWNobyAiWCAkdG1wX2RlcGxpYnMiIHwgJHtTRUR9IC1lICIxcyxeWCwsIiAtZSAicywkaSwsImAKKwkgICAgZG9uZQorCSAgZmkKKwkgIGlmICRlY2hvICJYICR0bXBfZGVwbGlicyIgfCAkWHNlZCAtZSAncy9bIAldLy9nJyBcCisJICAgIHwgZ3JlcCAuID4vZGV2L251bGw7IHRoZW4KKwkgICAgJGVjaG8KKwkgICAgaWYgdGVzdCAiWCRkZXBsaWJzX2NoZWNrX21ldGhvZCIgPSAiWG5vbmUiOyB0aGVuCisJICAgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHBsYXRmb3JtLiIKKwkgICAgZWxzZQorCSAgICAgICRlY2hvICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBrbm93biB0byBiZSBzdXBwb3J0ZWQuIgorCSAgICBmaQorCSAgICAkZWNobyAiKioqIEFsbCBkZWNsYXJlZCBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgYmVpbmcgZHJvcHBlZC4iCisJICAgIGRyb3BwZWRkZXBzPXllcworCSAgZmkKKwkgIDs7CisJZXNhYworCXZlcnN1ZmZpeD0kdmVyc3VmZml4X3NhdmUKKwltYWpvcj0kbWFqb3Jfc2F2ZQorCXJlbGVhc2U9JHJlbGVhc2Vfc2F2ZQorCWxpYm5hbWU9JGxpYm5hbWVfc2F2ZQorCW5hbWU9JG5hbWVfc2F2ZQorCisJY2FzZSAkaG9zdCBpbgorCSotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKKwkgICMgT24gUmhhcHNvZHkgcmVwbGFjZSB0aGUgQyBsaWJyYXJ5IGlzIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCisJICBuZXdkZXBsaWJzPWAkZWNobyAiWCAkbmV3ZGVwbGlicyIgfCAkWHNlZCAtZSAncy8gLWxjIC8gLWZyYW1ld29yayBTeXN0ZW0gLydgCisJICA7OworCWVzYWMKKworCWlmIHRlc3QgIiRkcm9wcGVkZGVwcyIgPSB5ZXM7IHRoZW4KKwkgIGlmIHRlc3QgIiRtb2R1bGUiID0geWVzOyB0aGVuCisJICAgICRlY2hvCisJICAgICRlY2hvICIqKiogV2FybmluZzogbGlidG9vbCBjb3VsZCBub3Qgc2F0aXNmeSBhbGwgZGVjbGFyZWQgaW50ZXItbGlicmFyeSIKKwkgICAgJGVjaG8gIioqKiBkZXBlbmRlbmNpZXMgb2YgbW9kdWxlICRsaWJuYW1lLiAgVGhlcmVmb3JlLCBsaWJ0b29sIHdpbGwgY3JlYXRlIgorCSAgICAkZWNobyAiKioqIGEgc3RhdGljIG1vZHVsZSwgdGhhdCBzaG91bGQgd29yayBhcyBsb25nIGFzIHRoZSBkbG9wZW5pbmciCisJICAgICRlY2hvICIqKiogYXBwbGljYXRpb24gaXMgbGlua2VkIHdpdGggdGhlIC1kbG9wZW4gZmxhZy4iCisJICAgIGlmIHRlc3QgLXogIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisJICAgICAgJGVjaG8KKwkgICAgICAkZWNobyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCisJICAgICAgJGVjaG8gIioqKiBsaXN0cyBmcm9tIGEgcHJvZ3JhbSwgdXNpbmcgXGBubScgb3IgZXF1aXZhbGVudCwgYnV0IGxpYnRvb2wgY291bGQiCisJICAgICAgJGVjaG8gIioqKiBub3QgZmluZCBzdWNoIGEgcHJvZ3JhbS4gIFNvLCB0aGlzIG1vZHVsZSBpcyBwcm9iYWJseSB1c2VsZXNzLiIKKwkgICAgICAkZWNobyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCisJICAgIGZpCisJICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSBubzsgdGhlbgorCSAgICAgIG9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCisJICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQorCSAgICAgIGJ1aWxkX29sZF9saWJzPXllcworCSAgICBlbHNlCisJICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisJICAgIGZpCisJICBlbHNlCisJICAgICRlY2hvICIqKiogVGhlIGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIHRoYXQgaGF2ZSBiZWVuIGRyb3BwZWQgaGVyZSB3aWxsIGJlIgorCSAgICAkZWNobyAiKioqIGF1dG9tYXRpY2FsbHkgYWRkZWQgd2hlbmV2ZXIgYSBwcm9ncmFtIGlzIGxpbmtlZCB3aXRoIHRoaXMgbGlicmFyeSIKKwkgICAgJGVjaG8gIioqKiBvciBpcyBkZWNsYXJlZCB0byAtZGxvcGVuIGl0LiIKKworCSAgICBpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkIiA9IG5vOyB0aGVuCisJICAgICAgJGVjaG8KKwkgICAgICAkZWNobyAiKioqIFNpbmNlIHRoaXMgbGlicmFyeSBtdXN0IG5vdCBjb250YWluIHVuZGVmaW5lZCBzeW1ib2xzLCIKKwkgICAgICAkZWNobyAiKioqIGJlY2F1c2UgZWl0aGVyIHRoZSBwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IHRoZW0gb3IiCisJICAgICAgJGVjaG8gIioqKiBpdCB3YXMgZXhwbGljaXRseSByZXF1ZXN0ZWQgd2l0aCAtbm8tdW5kZWZpbmVkLCIKKwkgICAgICAkZWNobyAiKioqIGxpYnRvb2wgd2lsbCBvbmx5IGNyZWF0ZSBhIHN0YXRpYyB2ZXJzaW9uIG9mIGl0LiIKKwkgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KKwkJb2xkbGlicz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKKwkJYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQorCQlidWlsZF9vbGRfbGlicz15ZXMKKwkgICAgICBlbHNlCisJCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICAgIGZpCisJICAgIGZpCisJICBmaQorCWZpCisJIyBEb25lIGNoZWNraW5nIGRlcGxpYnMhCisJZGVwbGlicz0kbmV3ZGVwbGlicworICAgICAgZmkKKworCisgICAgICAjIG1vdmUgbGlicmFyeSBzZWFyY2ggcGF0aHMgdGhhdCBjb2luY2lkZSB3aXRoIHBhdGhzIHRvIG5vdCB5ZXQKKyAgICAgICMgaW5zdGFsbGVkIGxpYnJhcmllcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaWJyYXJ5IHNlYXJjaCBsaXN0CisgICAgICBuZXdfbGlicz0KKyAgICAgIGZvciBwYXRoIGluICRub3RpbnN0X3BhdGg7IGRvCisJY2FzZSAiICRuZXdfbGlicyAiIGluCisJKiIgLUwkcGF0aC8kb2JqZGlyICIqKSA7OworCSopCisJICBjYXNlICIgJGRlcGxpYnMgIiBpbgorCSAgKiIgLUwkcGF0aC8kb2JqZGlyICIqKQorCSAgICBuZXdfbGlicz0iJG5ld19saWJzIC1MJHBhdGgvJG9iamRpciIgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgZm9yIGRlcGxpYiBpbiAkZGVwbGliczsgZG8KKwljYXNlICRkZXBsaWIgaW4KKwktTCopCisJICBjYXNlICIgJG5ld19saWJzICIgaW4KKwkgICoiICRkZXBsaWIgIiopIDs7CisJICAqKSBuZXdfbGlicz0iJG5ld19saWJzICRkZXBsaWIiIDs7CisJICBlc2FjCisJICA7OworCSopIG5ld19saWJzPSIkbmV3X2xpYnMgJGRlcGxpYiIgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICBkZXBsaWJzPSIkbmV3X2xpYnMiCisKKworICAgICAgIyBBbGwgdGhlIGxpYnJhcnktc3BlY2lmaWMgdmFyaWFibGVzIChpbnN0YWxsX2xpYmRpciBpcyBzZXQgYWJvdmUpLgorICAgICAgbGlicmFyeV9uYW1lcz0KKyAgICAgIG9sZF9saWJyYXJ5PQorICAgICAgZGxuYW1lPQorCisgICAgICAjIFRlc3QgYWdhaW4sIHdlIG1heSBoYXZlIGRlY2lkZWQgbm90IHRvIGJ1aWxkIGl0IGFueSBtb3JlCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCWlmIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiID0geWVzOyB0aGVuCisJICAjIEhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGhzCisJICBoYXJkY29kZV9saWJkaXJzPQorCSAgZGVwX3JwYXRoPQorCSAgcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCIKKwkgIHRlc3QgIiRtb2RlIiAhPSByZWxpbmsgJiYgcnBhdGg9IiRjb21waWxlX3JwYXRoJHJwYXRoIgorCSAgZm9yIGxpYmRpciBpbiAkcnBhdGg7IGRvCisJICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgorCSAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorCQlpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwkJICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgorCQllbHNlCisJCSAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgorCQkgIGNhc2UgJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIGluCisJCSAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQorCQkgICAgOzsKKwkJICAqKQorCQkgICAgaGFyZGNvZGVfbGliZGlycz0iJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCisJCSAgICA7OworCQkgIGVzYWMKKwkJZmkKKwkgICAgICBlbHNlCisJCWV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkJZGVwX3JwYXRoPSIkZGVwX3JwYXRoICRmbGFnIgorCSAgICAgIGZpCisJICAgIGVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgorCSAgICAgIGNhc2UgIiRwZXJtX3JwYXRoICIgaW4KKwkgICAgICAqIiAkbGliZGlyICIqKSA7OworCSAgICAgICopIHBlcm1fcnBhdGg9IiRwZXJtX3JwYXRoICRsaWJkaXIiIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgZG9uZQorCSAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KKwkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgorCSAgICAgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJICAgIGxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCisJICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkIjsgdGhlbgorCSAgICAgIGV2YWwgZGVwX3JwYXRoPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRcIgorCSAgICBlbHNlCisJICAgICAgZXZhbCBkZXBfcnBhdGg9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisJICAgIGZpCisJICBmaQorCSAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIiAmJiB0ZXN0IC1uICIkcGVybV9ycGF0aCI7IHRoZW4KKwkgICAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KKwkgICAgcnBhdGg9CisJICAgIGZvciBkaXIgaW4gJHBlcm1fcnBhdGg7IGRvCisJICAgICAgcnBhdGg9IiRycGF0aCRkaXI6IgorCSAgICBkb25lCisJICAgIGV2YWwgIiRydW5wYXRoX3Zhcj0nJHJwYXRoXCQkcnVucGF0aF92YXInOyBleHBvcnQgJHJ1bnBhdGhfdmFyIgorCSAgZmkKKwkgIHRlc3QgLW4gIiRkZXBfcnBhdGgiICYmIGRlcGxpYnM9IiRkZXBfcnBhdGggJGRlcGxpYnMiCisJZmkKKworCXNobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCIKKwl0ZXN0ICIkbW9kZSIgIT0gcmVsaW5rICYmIHNobGlicGF0aD0iJGNvbXBpbGVfc2hsaWJwYXRoJHNobGlicGF0aCIKKwlpZiB0ZXN0IC1uICIkc2hsaWJwYXRoIjsgdGhlbgorCSAgZXZhbCAiJHNobGlicGF0aF92YXI9JyRzaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyJzsgZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgorCWZpCisKKwkjIEdldCB0aGUgcmVhbCBhbmQgbGluayBuYW1lcyBvZiB0aGUgbGlicmFyeS4KKwlldmFsIHNoYXJlZF9leHQ9XCIkc2hyZXh0X2NtZHNcIgorCWV2YWwgbGlicmFyeV9uYW1lcz1cIiRsaWJyYXJ5X25hbWVzX3NwZWNcIgorCXNldCBkdW1teSAkbGlicmFyeV9uYW1lcworCXJlYWxuYW1lPSIkMiIKKwlzaGlmdDsgc2hpZnQKKworCWlmIHRlc3QgLW4gIiRzb25hbWVfc3BlYyI7IHRoZW4KKwkgIGV2YWwgc29uYW1lPVwiJHNvbmFtZV9zcGVjXCIKKwllbHNlCisJICBzb25hbWU9IiRyZWFsbmFtZSIKKwlmaQorCWlmIHRlc3QgLXogIiRkbG5hbWUiOyB0aGVuCisJICBkbG5hbWU9JHNvbmFtZQorCWZpCisKKwlsaWI9IiRvdXRwdXRfb2JqZGlyLyRyZWFsbmFtZSIKKwlsaW5rbmFtZXM9CisJZm9yIGxpbmsKKwlkbworCSAgbGlua25hbWVzPSIkbGlua25hbWVzICRsaW5rIgorCWRvbmUKKworCSMgVXNlIHN0YW5kYXJkIG9iamVjdHMgaWYgdGhleSBhcmUgcGljCisJdGVzdCAteiAiJHBpY19mbGFnIiAmJiBsaWJvYmpzPWAkZWNobyAiWCRsaWJvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCisKKwkjIFByZXBhcmUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scworCWlmIHRlc3QgLXogIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KKwkgIGlmIHRlc3QgIiRhbHdheXNfZXhwb3J0X3N5bWJvbHMiID0geWVzIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KKwkgICAgJHNob3cgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIgorCSAgICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZXhwIgorCSAgICAkcnVuICRybSAkZXhwb3J0X3N5bWJvbHMKKwkgICAgY21kcz0kZXhwb3J0X3N5bWJvbHNfY21kcworCSAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwkgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKwkgICAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgICBldmFsIGNtZD1cIiRjbWRcIgorCSAgICAgIGlmIGxlbj1gZXhwciAiWCRjbWQiIDogIi4qImAgJiYKKwkgICAgICAgdGVzdCAiJGxlbiIgLWxlICIkbWF4X2NtZF9sZW4iIHx8IHRlc3QgIiRtYXhfY21kX2xlbiIgLWxlIC0xOyB0aGVuCisJICAgICAgICAkc2hvdyAiJGNtZCIKKwkgICAgICAgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworCSAgICAgICAgc2tpcHBlZF9leHBvcnQ9ZmFsc2UKKwkgICAgICBlbHNlCisJICAgICAgICAjIFRoZSBjb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgdG8gZXhlY3V0ZSBpbiBvbmUgc3RlcC4KKwkgICAgICAgICRzaG93ICJ1c2luZyByZWxvYWRhYmxlIG9iamVjdCBmaWxlIGZvciBleHBvcnQgbGlzdC4uLiIKKwkgICAgICAgIHNraXBwZWRfZXhwb3J0PToKKwkJIyBCcmVhayBvdXQgZWFybHksIG90aGVyd2lzZSBza2lwcGVkX2V4cG9ydCBtYXkgYmUKKwkJIyBzZXQgdG8gZmFsc2UgYnkgYSBsYXRlciBidXQgc2hvcnRlciBjbWQuCisJCWJyZWFrCisJICAgICAgZmkKKwkgICAgZG9uZQorCSAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgorCSAgICAgICRzaG93ICIkRUdSRVAgLWUgXCIkZXhwb3J0X3N5bWJvbHNfcmVnZXhcIiBcIiRleHBvcnRfc3ltYm9sc1wiID4gXCIke2V4cG9ydF9zeW1ib2xzfVRcIiIKKwkgICAgICAkcnVuIGV2YWwgJyRFR1JFUCAtZSAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IiAiJGV4cG9ydF9zeW1ib2xzIiA+ICIke2V4cG9ydF9zeW1ib2xzfVQiJworCSAgICAgICRzaG93ICIkbXYgXCIke2V4cG9ydF9zeW1ib2xzfVRcIiBcIiRleHBvcnRfc3ltYm9sc1wiIgorCSAgICAgICRydW4gZXZhbCAnJG12ICIke2V4cG9ydF9zeW1ib2xzfVQiICIkZXhwb3J0X3N5bWJvbHMiJworCSAgICBmaQorCSAgZmkKKwlmaQorCisJaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkaW5jbHVkZV9leHBzeW1zIjsgdGhlbgorCSAgJHJ1biBldmFsICckZWNobyAiWCRpbmNsdWRlX2V4cHN5bXMiIHwgJFNQMk5MID4+ICIkZXhwb3J0X3N5bWJvbHMiJworCWZpCisKKwl0bXBfZGVwbGlicz0KKwlmb3IgdGVzdF9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisJCWNhc2UgIiAkY29udmVuaWVuY2UgIiBpbgorCQkqIiAkdGVzdF9kZXBsaWIgIiopIDs7CisJCSopCisJCQl0bXBfZGVwbGlicz0iJHRtcF9kZXBsaWJzICR0ZXN0X2RlcGxpYiIKKwkJCTs7CisJCWVzYWMKKwlkb25lCisJZGVwbGlicz0iJHRtcF9kZXBsaWJzIgorCisJaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgICBzYXZlX2xpYm9ianM9JGxpYm9ianMKKwkgICAgZXZhbCBsaWJvYmpzPVwiXCRsaWJvYmpzICR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY1wiCisJICBlbHNlCisJICAgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCisJICAgIGdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgorCisJICAgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRjb252ZW5pZW5jZQorCSAgICBsaWJvYmpzPSIkbGlib2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKKwkgIGZpCisJZmkKKwkKKwlpZiB0ZXN0ICIkdGhyZWFkX3NhZmUiID0geWVzICYmIHRlc3QgLW4gIiR0aHJlYWRfc2FmZV9mbGFnX3NwZWMiOyB0aGVuCisJICBldmFsIGZsYWc9XCIkdGhyZWFkX3NhZmVfZmxhZ19zcGVjXCIKKwkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkZmxhZyIKKwlmaQorCisJIyBNYWtlIGEgYmFja3VwIG9mIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IHdoZW4gcmVsaW5raW5nCisJaWYgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB0aGVuCisJICAkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJHtyZWFsbmFtZX1VICYmICRtdiAkcmVhbG5hbWUgJHtyZWFsbmFtZX1VKScgfHwgZXhpdCAkPworCWZpCisKKwkjIERvIGVhY2ggb2YgdGhlIGFyY2hpdmUgY29tbWFuZHMuCisJaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXMgJiYgdGVzdCAtbiAiJG1vZHVsZV9jbWRzIiA7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJG1vZHVsZV9leHBzeW1fY21kcyI7IHRoZW4KKwkgICAgZXZhbCB0ZXN0X2NtZHM9XCIkbW9kdWxlX2V4cHN5bV9jbWRzXCIKKwkgICAgY21kcz0kbW9kdWxlX2V4cHN5bV9jbWRzCisJICBlbHNlCisJICAgIGV2YWwgdGVzdF9jbWRzPVwiJG1vZHVsZV9jbWRzXCIKKwkgICAgY21kcz0kbW9kdWxlX2NtZHMKKwkgIGZpCisJZWxzZQorCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGFyY2hpdmVfZXhwc3ltX2NtZHMiOyB0aGVuCisJICBldmFsIHRlc3RfY21kcz1cIiRhcmNoaXZlX2V4cHN5bV9jbWRzXCIKKwkgIGNtZHM9JGFyY2hpdmVfZXhwc3ltX2NtZHMKKwllbHNlCisJICBldmFsIHRlc3RfY21kcz1cIiRhcmNoaXZlX2NtZHNcIgorCSAgY21kcz0kYXJjaGl2ZV9jbWRzCisJICBmaQorCWZpCisKKwlpZiB0ZXN0ICJYJHNraXBwZWRfZXhwb3J0IiAhPSAiWDoiICYmCisJICAgbGVuPWBleHByICJYJHRlc3RfY21kcyIgOiAiLioiIDI+L2Rldi9udWxsYCAmJgorCSAgIHRlc3QgIiRsZW4iIC1sZSAiJG1heF9jbWRfbGVuIiB8fCB0ZXN0ICIkbWF4X2NtZF9sZW4iIC1sZSAtMTsgdGhlbgorCSAgOgorCWVsc2UKKwkgICMgVGhlIGNvbW1hbmQgbGluZSBpcyB0b28gbG9uZyB0byBsaW5rIGluIG9uZSBzdGVwLCBsaW5rIHBpZWNld2lzZS4KKwkgICRlY2hvICJjcmVhdGluZyByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4uLiIKKworCSAgIyBTYXZlIHRoZSB2YWx1ZSBvZiAkb3V0cHV0IGFuZCAkbGlib2JqcyBiZWNhdXNlIHdlIHdhbnQgdG8KKwkgICMgdXNlIHRoZW0gbGF0ZXIuICBJZiB3ZSBoYXZlIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCB3ZQorCSAgIyB3YW50IHRvIHVzZSBzYXZlX2xpYm9ianMgYXMgaXQgd2FzIGJlZm9yZQorCSAgIyB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyB3YXMgZXhwYW5kZWQsIGJlY2F1c2Ugd2UgY2FuJ3QKKwkgICMgYXNzdW1lIHRoZSBsaW5rZXIgdW5kZXJzdGFuZHMgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMuCisJICAjIFRoaXMgbWF5IGhhdmUgdG8gYmUgcmV2aXNpdGVkLCBpbiBjYXNlIHRvbyBtYW55CisJICAjIGNvbnZlbmllbmNlIGxpYnJhcmllcyBnZXQgbGlua2VkIGluIGFuZCBlbmQgdXAgZXhjZWVkaW5nCisJICAjIHRoZSBzcGVjLgorCSAgaWYgdGVzdCAteiAiJGNvbnZlbmllbmNlIiB8fCB0ZXN0IC16ICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCisJICAgIHNhdmVfbGlib2Jqcz0kbGlib2JqcworCSAgZmkKKwkgIHNhdmVfb3V0cHV0PSRvdXRwdXQKKwkgIG91dHB1dF9sYT1gJGVjaG8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICIkYmFzZW5hbWUiYAorCisJICAjIENsZWFyIHRoZSByZWxvYWRhYmxlIG9iamVjdCBjcmVhdGlvbiBjb21tYW5kIHF1ZXVlIGFuZAorCSAgIyBpbml0aWFsaXplIGsgdG8gb25lLgorCSAgdGVzdF9jbWRzPQorCSAgY29uY2F0X2NtZHM9CisJICBvYmpsaXN0PQorCSAgZGVsZmlsZXM9CisJICBsYXN0X3JvYmo9CisJICBrPTEKKwkgIG91dHB1dD0kb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7a30uJG9iamV4dAorCSAgIyBMb29wIG92ZXIgdGhlIGxpc3Qgb2Ygb2JqZWN0cyB0byBiZSBsaW5rZWQuCisJICBmb3Igb2JqIGluICRzYXZlX2xpYm9ianMKKwkgIGRvCisJICAgIGV2YWwgdGVzdF9jbWRzPVwiJHJlbG9hZF9jbWRzICRvYmpsaXN0ICRsYXN0X3JvYmpcIgorCSAgICBpZiB0ZXN0ICJYJG9iamxpc3QiID0gWCB8fAorCSAgICAgICB7IGxlbj1gZXhwciAiWCR0ZXN0X2NtZHMiIDogIi4qIiAyPi9kZXYvbnVsbGAgJiYKKwkJIHRlc3QgIiRsZW4iIC1sZSAiJG1heF9jbWRfbGVuIjsgfTsgdGhlbgorCSAgICAgIG9iamxpc3Q9IiRvYmpsaXN0ICRvYmoiCisJICAgIGVsc2UKKwkgICAgICAjIFRoZSBjb21tYW5kICR0ZXN0X2NtZHMgaXMgYWxtb3N0IHRvbyBsb25nLCBhZGQgYQorCSAgICAgICMgY29tbWFuZCB0byB0aGUgcXVldWUuCisJICAgICAgaWYgdGVzdCAiJGsiIC1lcSAxIDsgdGhlbgorCQkjIFRoZSBmaXJzdCBmaWxlIGRvZXNuJ3QgaGF2ZSBhIHByZXZpb3VzIGNvbW1hbmQgdG8gYWRkLgorCQlldmFsIGNvbmNhdF9jbWRzPVwiJHJlbG9hZF9jbWRzICRvYmpsaXN0ICRsYXN0X3JvYmpcIgorCSAgICAgIGVsc2UKKwkJIyBBbGwgc3Vic2VxdWVudCByZWxvYWRhYmxlIG9iamVjdCBmaWxlcyB3aWxsIGxpbmsgaW4KKwkJIyB0aGUgbGFzdCBvbmUgY3JlYXRlZC4KKwkJZXZhbCBjb25jYXRfY21kcz1cIlwkY29uY2F0X2NtZHN+JHJlbG9hZF9jbWRzICRvYmpsaXN0ICRsYXN0X3JvYmpcIgorCSAgICAgIGZpCisJICAgICAgbGFzdF9yb2JqPSRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtrfS4kb2JqZXh0CisJICAgICAgaz1gZXhwciAkayArIDFgCisJICAgICAgb3V0cHV0PSRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtrfS4kb2JqZXh0CisJICAgICAgb2JqbGlzdD0kb2JqCisJICAgICAgbGVuPTEKKwkgICAgZmkKKwkgIGRvbmUKKwkgICMgSGFuZGxlIHRoZSByZW1haW5pbmcgb2JqZWN0cyBieSBjcmVhdGluZyBvbmUgbGFzdAorCSAgIyByZWxvYWRhYmxlIG9iamVjdCBmaWxlLiAgQWxsIHN1YnNlcXVlbnQgcmVsb2FkYWJsZSBvYmplY3QKKwkgICMgZmlsZXMgd2lsbCBsaW5rIGluIHRoZSBsYXN0IG9uZSBjcmVhdGVkLgorCSAgdGVzdCAteiAiJGNvbmNhdF9jbWRzIiB8fCBjb25jYXRfY21kcz0kY29uY2F0X2NtZHN+CisJICBldmFsIGNvbmNhdF9jbWRzPVwiXCR7Y29uY2F0X2NtZHN9JHJlbG9hZF9jbWRzICRvYmpsaXN0ICRsYXN0X3JvYmpcIgorCisJICBpZiAke3NraXBwZWRfZXhwb3J0LWZhbHNlfTsgdGhlbgorCSAgICAkc2hvdyAiZ2VuZXJhdGluZyBzeW1ib2wgbGlzdCBmb3IgXGAkbGlibmFtZS5sYSciCisJICAgIGV4cG9ydF9zeW1ib2xzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS5leHAiCisJICAgICRydW4gJHJtICRleHBvcnRfc3ltYm9scworCSAgICBsaWJvYmpzPSRvdXRwdXQKKwkgICAgIyBBcHBlbmQgdGhlIGNvbW1hbmQgdG8gY3JlYXRlIHRoZSBleHBvcnQgZmlsZS4KKwkgICAgZXZhbCBjb25jYXRfY21kcz1cIlwkY29uY2F0X2NtZHN+JGV4cG9ydF9zeW1ib2xzX2NtZHNcIgorICAgICAgICAgIGZpCisKKwkgICMgU2V0IHVwIGEgY29tbWFuZCB0byByZW1vdmUgdGhlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzCisJICAjIGFmdGVyIHRoZXkgYXJlIHVzZWQuCisJICBpPTAKKwkgIHdoaWxlIHRlc3QgIiRpIiAtbHQgIiRrIgorCSAgZG8KKwkgICAgaT1gZXhwciAkaSArIDFgCisJICAgIGRlbGZpbGVzPSIkZGVsZmlsZXMgJG91dHB1dF9vYmpkaXIvJG91dHB1dF9sYS0ke2l9LiRvYmpleHQiCisJICBkb25lCisKKwkgICRlY2hvICJjcmVhdGluZyBhIHRlbXBvcmFyeSByZWxvYWRhYmxlIG9iamVjdCBmaWxlOiAkb3V0cHV0IgorCisJICAjIExvb3AgdGhyb3VnaCB0aGUgY29tbWFuZHMgZ2VuZXJhdGVkIGFib3ZlIGFuZCBleGVjdXRlIHRoZW0uCisJICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwkgIGZvciBjbWQgaW4gJGNvbmNhdF9jbWRzOyBkbworCSAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgJHNob3cgIiRjbWQiCisJICAgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworCSAgZG9uZQorCSAgSUZTPSIkc2F2ZV9pZnMiCisKKwkgIGxpYm9ianM9JG91dHB1dAorCSAgIyBSZXN0b3JlIHRoZSB2YWx1ZSBvZiBvdXRwdXQuCisJICBvdXRwdXQ9JHNhdmVfb3V0cHV0CisKKwkgIGlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSIgJiYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgICBldmFsIGxpYm9ianM9XCJcJGxpYm9ianMgJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjXCIKKwkgIGZpCisJICAjIEV4cGFuZCB0aGUgbGlicmFyeSBsaW5raW5nIGNvbW1hbmRzIGFnYWluIHRvIHJlc2V0IHRoZQorCSAgIyB2YWx1ZSBvZiAkbGlib2JqcyBmb3IgcGllY2V3aXNlIGxpbmtpbmcuCisKKwkgICMgRG8gZWFjaCBvZiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KKwkgIGlmIHRlc3QgIiRtb2R1bGUiID0geWVzICYmIHRlc3QgLW4gIiRtb2R1bGVfY21kcyIgOyB0aGVuCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJG1vZHVsZV9leHBzeW1fY21kcyI7IHRoZW4KKwkgICAgICBjbWRzPSRtb2R1bGVfZXhwc3ltX2NtZHMKKwkgICAgZWxzZQorCSAgICAgIGNtZHM9JG1vZHVsZV9jbWRzCisJICAgIGZpCisJICBlbHNlCisJICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRhcmNoaXZlX2V4cHN5bV9jbWRzIjsgdGhlbgorCSAgICBjbWRzPSRhcmNoaXZlX2V4cHN5bV9jbWRzCisJICBlbHNlCisJICAgIGNtZHM9JGFyY2hpdmVfY21kcworCSAgICBmaQorCSAgZmkKKworCSAgIyBBcHBlbmQgdGhlIGNvbW1hbmQgdG8gcmVtb3ZlIHRoZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcworCSAgIyB0byB0aGUganVzdC1yZXNldCAkY21kcy4KKwkgIGV2YWwgY21kcz1cIlwkY21kc35cJHJtICRkZWxmaWxlc1wiCisJZmkKKwlzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwlmb3IgY21kIGluICRjbWRzOyBkbworCSAgSUZTPSIkc2F2ZV9pZnMiCisJICBldmFsIGNtZD1cIiRjbWRcIgorCSAgJHNob3cgIiRjbWQiCisJICAkcnVuIGV2YWwgIiRjbWQiIHx8IHsKKwkgICAgbHRfZXhpdD0kPworCisJICAgICMgUmVzdG9yZSB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSBhbmQgZXhpdAorCSAgICBpZiB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgICAgICAkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJHtyZWFsbmFtZX1UICYmICRtdiAke3JlYWxuYW1lfVUgJHJlYWxuYW1lKScKKwkgICAgZmkKKworCSAgICBleGl0ICRsdF9leGl0CisJICB9CisJZG9uZQorCUlGUz0iJHNhdmVfaWZzIgorCisJIyBSZXN0b3JlIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IGFuZCBleGl0CisJaWYgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB0aGVuCisJICAkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJHtyZWFsbmFtZX1UICYmICRtdiAkcmVhbG5hbWUgJHtyZWFsbmFtZX1UICYmICRtdiAiJHJlYWxuYW1lIlUgJHJlYWxuYW1lKScgfHwgZXhpdCAkPworCisJICBpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiOyB0aGVuCisJICAgIGlmIHRlc3QgLXogIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgICAgICAkc2hvdyAiJHtybX1yICRnZW50b3AiCisJICAgICAgJHJ1biAke3JtfXIgIiRnZW50b3AiCisJICAgIGZpCisJICBmaQorCisJICBleGl0ICRFWElUX1NVQ0NFU1MKKwlmaQorCisJIyBDcmVhdGUgbGlua3MgdG8gdGhlIHJlYWwgbGlicmFyeS4KKwlmb3IgbGlua25hbWUgaW4gJGxpbmtuYW1lczsgZG8KKwkgIGlmIHRlc3QgIiRyZWFsbmFtZSIgIT0gIiRsaW5rbmFtZSI7IHRoZW4KKwkgICAgJHNob3cgIihjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpIgorCSAgICAkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpJyB8fCBleGl0ICQ/CisJICBmaQorCWRvbmUKKworCSMgSWYgLW1vZHVsZSBvciAtZXhwb3J0LWR5bmFtaWMgd2FzIHNwZWNpZmllZCwgc2V0IHRoZSBkbG5hbWUuCisJaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXMgfHwgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllczsgdGhlbgorCSAgIyBPbiBhbGwga25vd24gb3BlcmF0aW5nIHN5c3RlbXMsIHRoZXNlIGFyZSBpZGVudGljYWwuCisJICBkbG5hbWU9IiRzb25hbWUiCisJZmkKKyAgICAgIGZpCisgICAgICA7OworCisgICAgb2JqKQorICAgICAgaWYgdGVzdCAtbiAiJGRlcGxpYnMiOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtbCcgYW5kIFxgLUwnIGFyZSBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHJwYXRoIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJwYXRoJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkeHJwYXRoIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLVInIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiR2aW5mbyI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGNhc2UgJG91dHB1dCBpbgorICAgICAgKi5sbykKKwlpZiB0ZXN0IC1uICIkb2JqcyRvbGRfZGVwbGlicyI7IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBidWlsZCBsaWJyYXJ5IG9iamVjdCBcYCRvdXRwdXQnIGZyb20gbm9uLWxpYnRvb2wgb2JqZWN0cyIgMT4mMgorCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisJZmkKKwlsaWJvYmo9IiRvdXRwdXQiCisJb2JqPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgIiRsbzJvImAKKwk7OworICAgICAgKikKKwlsaWJvYmo9CisJb2JqPSIkb3V0cHV0IgorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgRGVsZXRlIHRoZSBvbGQgb2JqZWN0cy4KKyAgICAgICRydW4gJHJtICRvYmogJGxpYm9iagorCisgICAgICAjIE9iamVjdHMgZnJvbSBjb252ZW5pZW5jZSBsaWJyYXJpZXMuICBUaGlzIGFzc3VtZXMKKyAgICAgICMgc2luZ2xlLXZlcnNpb24gY29udmVuaWVuY2UgbGlicmFyaWVzLiAgV2hlbmV2ZXIgd2UgY3JlYXRlCisgICAgICAjIGRpZmZlcmVudCBvbmVzIGZvciBQSUMvbm9uLVBJQywgdGhpcyB3ZSdsbCBoYXZlIHRvIGR1cGxpY2F0ZQorICAgICAgIyB0aGUgZXh0cmFjdGlvbi4KKyAgICAgIHJlbG9hZF9jb252X29ianM9CisgICAgICBnZW50b3A9CisgICAgICAjIHJlbG9hZF9jbWRzIHJ1bnMgJExEIGRpcmVjdGx5LCBzbyBsZXQgdXMgZ2V0IHJpZCBvZgorICAgICAgIyAtV2wgZnJvbSB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYworICAgICAgd2w9CisKKyAgICAgIGlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSI7IHRoZW4KKwlpZiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCisJICBldmFsIHJlbG9hZF9jb252X29ianM9XCJcJHJlbG9hZF9vYmpzICR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY1wiCisJZWxzZQorCSAgZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke29ian14IgorCSAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCisKKwkgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRjb252ZW5pZW5jZQorCSAgcmVsb2FkX2NvbnZfb2Jqcz0iJHJlbG9hZF9vYmpzICRmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0IgorCWZpCisgICAgICBmaQorCisgICAgICAjIENyZWF0ZSB0aGUgb2xkLXN0eWxlIG9iamVjdC4KKyAgICAgIHJlbG9hZF9vYmpzPSIkb2JqcyRvbGRfZGVwbGlicyAiYCRlY2hvICJYJGxpYm9ianMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgJy9cLicke2xpYmV4dH0kJy9kJyAtZSAnL1wubGliJC9kJyAtZSAiJGxvMm8iIHwgJE5MMlNQYCIgJHJlbG9hZF9jb252X29ianMiICMjIyB0ZXN0c3VpdGU6IHNraXAgbmVzdGVkIHF1b3RpbmcgdGVzdAorCisgICAgICBvdXRwdXQ9IiRvYmoiCisgICAgICBjbWRzPSRyZWxvYWRfY21kcworICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisgICAgICBmb3IgY21kIGluICRjbWRzOyBkbworCUlGUz0iJHNhdmVfaWZzIgorCWV2YWwgY21kPVwiJGNtZFwiCisJJHNob3cgIiRjbWQiCisJJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/CisgICAgICBkb25lCisgICAgICBJRlM9IiRzYXZlX2lmcyIKKworICAgICAgIyBFeGl0IGlmIHdlIGFyZW4ndCBkb2luZyBhIGxpYnJhcnkgb2JqZWN0IGZpbGUuCisgICAgICBpZiB0ZXN0IC16ICIkbGlib2JqIjsgdGhlbgorCWlmIHRlc3QgLW4gIiRnZW50b3AiOyB0aGVuCisJICAkc2hvdyAiJHtybX1yICRnZW50b3AiCisJICAkcnVuICR7cm19ciAkZ2VudG9wCisJZmkKKworCWV4aXQgJEVYSVRfU1VDQ0VTUworICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCisJaWYgdGVzdCAtbiAiJGdlbnRvcCI7IHRoZW4KKwkgICRzaG93ICIke3JtfXIgJGdlbnRvcCIKKwkgICRydW4gJHtybX1yICRnZW50b3AKKwlmaQorCisJIyBDcmVhdGUgYW4gaW52YWxpZCBsaWJ0b29sIG9iamVjdCBpZiBubyBQSUMsIHNvIHRoYXQgd2UgZG9uJ3QKKwkjIGFjY2lkZW50YWxseSBsaW5rIGl0IGludG8gYSBwcm9ncmFtLgorCSMgJHNob3cgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIKKwkjICRydW4gZXZhbCAiZWNobyB0aW1lc3RhbXAgPiAkbGlib2JqIiB8fCBleGl0ICQ/CisJZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkcGljX2ZsYWciIHx8IHRlc3QgIiRwaWNfbW9kZSIgIT0gZGVmYXVsdDsgdGhlbgorCSMgT25seSBkbyBjb21tYW5kcyBpZiB3ZSByZWFsbHkgaGF2ZSBkaWZmZXJlbnQgUElDIG9iamVjdHMuCisJcmVsb2FkX29ianM9IiRsaWJvYmpzICRyZWxvYWRfY29udl9vYmpzIgorCW91dHB1dD0iJGxpYm9iaiIKKwljbWRzPSRyZWxvYWRfY21kcworCXNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworCWZvciBjbWQgaW4gJGNtZHM7IGRvCisJICBJRlM9IiRzYXZlX2lmcyIKKwkgIGV2YWwgY21kPVwiJGNtZFwiCisJICAkc2hvdyAiJGNtZCIKKwkgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworCWRvbmUKKwlJRlM9IiRzYXZlX2lmcyIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRnZW50b3AiOyB0aGVuCisJJHNob3cgIiR7cm19ciAkZ2VudG9wIgorCSRydW4gJHtybX1yICRnZW50b3AKKyAgICAgIGZpCisKKyAgICAgIGV4aXQgJEVYSVRfU1VDQ0VTUworICAgICAgOzsKKworICAgIHByb2cpCisgICAgICBjYXNlICRob3N0IGluCisJKmN5Z3dpbiopIG91dHB1dD1gJGVjaG8gJG91dHB1dCB8ICR7U0VEfSAtZSAncywuZXhlJCwsO3MsJCwuZXhlLCdgIDs7CisgICAgICBlc2FjCisgICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBwcm9ncmFtcyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3IgcHJvZ3JhbXMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRwcmVsb2FkIiA9IHllczsgdGhlbgorCWlmIHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgPSB1bmtub3duICYmIHRlc3QgIiRkbG9wZW5fc2VsZiIgPSB1bmtub3duICYmCisJICAgdGVzdCAiJGRsb3Blbl9zZWxmX3N0YXRpYyIgPSB1bmtub3duOyB0aGVuCisJICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYEFDX0xJQlRPT0xfRExPUEVOJyBub3QgdXNlZC4gQXNzdW1pbmcgbm8gZGxvcGVuIHN1cHBvcnQuIgorCWZpCisgICAgICBmaQorCisgICAgICBjYXNlICRob3N0IGluCisgICAgICAqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCisJIyBPbiBSaGFwc29keSByZXBsYWNlIHRoZSBDIGxpYnJhcnkgaXMgdGhlIFN5c3RlbSBmcmFtZXdvcmsKKwljb21waWxlX2RlcGxpYnM9YCRlY2hvICJYICRjb21waWxlX2RlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvIC1sYyAvIC1mcmFtZXdvcmsgU3lzdGVtIC8nYAorCWZpbmFsaXplX2RlcGxpYnM9YCRlY2hvICJYICRmaW5hbGl6ZV9kZXBsaWJzIiB8ICRYc2VkIC1lICdzLyAtbGMgLyAtZnJhbWV3b3JrIFN5c3RlbSAvJ2AKKwk7OworICAgICAgZXNhYworCisgICAgICBjYXNlICRob3N0IGluCisgICAgICAqZGFyd2luKikKKyAgICAgICAgIyBEb24ndCBhbGxvdyBsYXp5IGxpbmtpbmcsIGl0IGJyZWFrcyBDKysgZ2xvYmFsIGNvbnN0cnVjdG9ycworICAgICAgICBpZiB0ZXN0ICIkdGFnbmFtZSIgPSBDWFggOyB0aGVuCisgICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAke3dsfS1iaW5kX2F0X2xvYWQiCisgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICR7d2x9LWJpbmRfYXRfbG9hZCIKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKworCisgICAgICAjIG1vdmUgbGlicmFyeSBzZWFyY2ggcGF0aHMgdGhhdCBjb2luY2lkZSB3aXRoIHBhdGhzIHRvIG5vdCB5ZXQKKyAgICAgICMgaW5zdGFsbGVkIGxpYnJhcmllcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaWJyYXJ5IHNlYXJjaCBsaXN0CisgICAgICBuZXdfbGlicz0KKyAgICAgIGZvciBwYXRoIGluICRub3RpbnN0X3BhdGg7IGRvCisJY2FzZSAiICRuZXdfbGlicyAiIGluCisJKiIgLUwkcGF0aC8kb2JqZGlyICIqKSA7OworCSopCisJICBjYXNlICIgJGNvbXBpbGVfZGVwbGlicyAiIGluCisJICAqIiAtTCRwYXRoLyRvYmpkaXIgIiopCisJICAgIG5ld19saWJzPSIkbmV3X2xpYnMgLUwkcGF0aC8kb2JqZGlyIiA7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICBmb3IgZGVwbGliIGluICRjb21waWxlX2RlcGxpYnM7IGRvCisJY2FzZSAkZGVwbGliIGluCisJLUwqKQorCSAgY2FzZSAiICRuZXdfbGlicyAiIGluCisJICAqIiAkZGVwbGliICIqKSA7OworCSAgKikgbmV3X2xpYnM9IiRuZXdfbGlicyAkZGVwbGliIiA7OworCSAgZXNhYworCSAgOzsKKwkqKSBuZXdfbGlicz0iJG5ld19saWJzICRkZXBsaWIiIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgY29tcGlsZV9kZXBsaWJzPSIkbmV3X2xpYnMiCisKKworICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRjb21waWxlX2RlcGxpYnMiCisgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkZmluYWxpemVfZGVwbGlicyIKKworICAgICAgaWYgdGVzdCAtbiAiJHJwYXRoJHhycGF0aCI7IHRoZW4KKwkjIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhbnkgcnBhdGggZmxhZ3MsIHRoZW4gYWRkIHRoZW0uCisJZm9yIGxpYmRpciBpbiAkcnBhdGggJHhycGF0aDsgZG8KKwkgICMgVGhpcyBpcyB0aGUgbWFnaWMgdG8gdXNlIC1ycGF0aC4KKwkgIGNhc2UgIiRmaW5hbGl6ZV9ycGF0aCAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgZmluYWxpemVfcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCAkbGliZGlyIiA7OworCSAgZXNhYworCWRvbmUKKyAgICAgIGZpCisKKyAgICAgICMgTm93IGhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGhzCisgICAgICBycGF0aD0KKyAgICAgIGhhcmRjb2RlX2xpYmRpcnM9CisgICAgICBmb3IgbGliZGlyIGluICRjb21waWxlX3JwYXRoICRmaW5hbGl6ZV9ycGF0aDsgZG8KKwlpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorCSAgICBpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwkgICAgICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgorCSAgICBlbHNlCisJICAgICAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgorCSAgICAgIGNhc2UgJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIGluCisJICAgICAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQorCQk7OworCSAgICAgICopCisJCWhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgorCQk7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgIGVsc2UKKwkgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorCSAgICBycGF0aD0iJHJwYXRoICRmbGFnIgorCSAgZmkKKwllbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKwkgIGNhc2UgIiRwZXJtX3JwYXRoICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBwZXJtX3JwYXRoPSIkcGVybV9ycGF0aCAkbGliZGlyIiA7OworCSAgZXNhYworCWZpCisJY2FzZSAkaG9zdCBpbgorCSotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqKQorCSAgdGVzdGJpbmRpcj1gJGVjaG8gIlgkbGliZGlyIiB8ICRYc2VkIC1lICdzKi9saWIkKi9iaW4qJ2AKKwkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgorCSAgKiI6JGxpYmRpcjoiKikgOzsKKwkgICopIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hwYXRoOiRsaWJkaXIiOzsKKwkgIGVzYWMKKwkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgorCSAgKiI6JHRlc3RiaW5kaXI6IiopIDs7CisJICAqKSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNocGF0aDokdGVzdGJpbmRpciI7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIHJwYXRoLgorICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiICYmCisJIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorCWxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCisJZXZhbCBycGF0aD1cIiAkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisgICAgICBmaQorICAgICAgY29tcGlsZV9ycGF0aD0iJHJwYXRoIgorCisgICAgICBycGF0aD0KKyAgICAgIGhhcmRjb2RlX2xpYmRpcnM9CisgICAgICBmb3IgbGliZGlyIGluICRmaW5hbGl6ZV9ycGF0aDsgZG8KKwlpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorCSAgICBpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwkgICAgICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgorCSAgICBlbHNlCisJICAgICAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgorCSAgICAgIGNhc2UgJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIGluCisJICAgICAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQorCQk7OworCSAgICAgICopCisJCWhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgorCQk7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgIGVsc2UKKwkgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorCSAgICBycGF0aD0iJHJwYXRoICRmbGFnIgorCSAgZmkKKwllbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKwkgIGNhc2UgIiRmaW5hbGl6ZV9wZXJtX3JwYXRoICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmaW5hbGl6ZV9wZXJtX3JwYXRoPSIkZmluYWxpemVfcGVybV9ycGF0aCAkbGliZGlyIiA7OworCSAgZXNhYworCWZpCisgICAgICBkb25lCisgICAgICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIHJwYXRoLgorICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiICYmCisJIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorCWxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCisJZXZhbCBycGF0aD1cIiAkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisgICAgICBmaQorICAgICAgZmluYWxpemVfcnBhdGg9IiRycGF0aCIKKworICAgICAgaWYgdGVzdCAtbiAiJGxpYm9ianMiICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKwkjIFRyYW5zZm9ybSBhbGwgdGhlIGxpYnJhcnkgb2JqZWN0cyBpbnRvIHN0YW5kYXJkIG9iamVjdHMuCisJY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKKwlmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCisgICAgICBmaQorCisgICAgICBkbHN5bXM9CisgICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgorCWlmIHRlc3QgLW4gIiROTSIgJiYgdGVzdCAtbiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KKwkgIGRsc3ltcz0iJHtvdXRwdXRuYW1lfVMuYyIKKwllbHNlCisJICAkZWNobyAiJG1vZGVuYW1lOiBub3QgY29uZmlndXJlZCB0byBleHRyYWN0IGdsb2JhbCBzeW1ib2xzIGZyb20gZGxwcmVvcGVuZWQgZmlsZXMiIDE+JjIKKwlmaQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGRsc3ltcyI7IHRoZW4KKwljYXNlICRkbHN5bXMgaW4KKwkiIikgOzsKKwkqLmMpCisJICAjIERpc2NvdmVyIHRoZSBubGlzdCBvZiBlYWNoIG9mIHRoZSBkbGZpbGVzLgorCSAgbmxpc3Q9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX0ubm0iCisKKwkgICRzaG93ICIkcm0gJG5saXN0ICR7bmxpc3R9UyAke25saXN0fVQiCisJICAkcnVuICRybSAiJG5saXN0IiAiJHtubGlzdH1TIiAiJHtubGlzdH1UIgorCisJICAjIFBhcnNlIHRoZSBuYW1lIGxpc3QgaW50byBhIHNvdXJjZSBmaWxlLgorCSAgJHNob3cgImNyZWF0aW5nICRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiCisKKwkgIHRlc3QgLXogIiRydW4iICYmICRlY2hvID4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCisvKiAkZGxzeW1zIC0gc3ltYm9sIHJlc29sdXRpb24gdGFibGUgZm9yIFxgJG91dHB1dG5hbWUnIGRsc3ltIGVtdWxhdGlvbi4gKi8KKy8qIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gXCJDXCIgeworI2VuZGlmCisKKy8qIFByZXZlbnQgdGhlIG9ubHkga2luZCBvZiBkZWNsYXJhdGlvbiBjb25mbGljdHMgd2UgY2FuIG1ha2UuICovCisjZGVmaW5lIGx0X3ByZWxvYWRlZF9zeW1ib2xzIHNvbWVfb3RoZXJfc3ltYm9sCisKKy8qIEV4dGVybmFsIHN5bWJvbCBkZWNsYXJhdGlvbnMgZm9yIHRoZSBjb21waWxlci4gKi9cCisiCisKKwkgIGlmIHRlc3QgIiRkbHNlbGYiID0geWVzOyB0aGVuCisJICAgICRzaG93ICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRvdXRwdXQnIgorCisJICAgIHRlc3QgLXogIiRydW4iICYmICRlY2hvICc6IEBQUk9HUkFNQCAnID4gIiRubGlzdCIKKworCSAgICAjIEFkZCBvdXIgb3duIHByb2dyYW0gb2JqZWN0cyB0byB0aGUgc3ltYm9sIGxpc3QuCisJICAgIHByb2dmaWxlcz1gJGVjaG8gIlgkb2JqcyRvbGRfZGVwbGlicyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAorCSAgICBmb3IgYXJnIGluICRwcm9nZmlsZXM7IGRvCisJICAgICAgJHNob3cgImV4dHJhY3RpbmcgZ2xvYmFsIEMgc3ltYm9scyBmcm9tIFxgJGFyZyciCisJICAgICAgJHJ1biBldmFsICIkTk0gJGFyZyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCisJICAgIGRvbmUKKworCSAgICBpZiB0ZXN0IC1uICIkZXhjbHVkZV9leHBzeW1zIjsgdGhlbgorCSAgICAgICRydW4gZXZhbCAnJEVHUkVQIC12ICIgKCRleGNsdWRlX2V4cHN5bXMpJCIgIiRubGlzdCIgPiAiJG5saXN0IlQnCisJICAgICAgJHJ1biBldmFsICckbXYgIiRubGlzdCJUICIkbmxpc3QiJworCSAgICBmaQorCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KKwkgICAgICAkcnVuIGV2YWwgJyRFR1JFUCAtZSAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IiAiJG5saXN0IiA+ICIkbmxpc3QiVCcKKwkgICAgICAkcnVuIGV2YWwgJyRtdiAiJG5saXN0IlQgIiRubGlzdCInCisJICAgIGZpCisKKwkgICAgIyBQcmVwYXJlIHRoZSBsaXN0IG9mIGV4cG9ydGVkIHN5bWJvbHMKKwkgICAgaWYgdGVzdCAteiAiJGV4cG9ydF9zeW1ib2xzIjsgdGhlbgorCSAgICAgIGV4cG9ydF9zeW1ib2xzPSIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5leHAiCisJICAgICAgJHJ1biAkcm0gJGV4cG9ydF9zeW1ib2xzCisJICAgICAgJHJ1biBldmFsICIke1NFRH0gLW4gLWUgJy9eOiBAUFJPR1JBTUAgJC9kJyAtZSAncy9eLiogXCguKlwpJC9cMS9wJyAiJzwgIiRubGlzdCIgPiAiJGV4cG9ydF9zeW1ib2xzIicKKyAgICAgICAgICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgICAgICAgICAqY3lnd2luKiB8ICptaW5ndyogKQorCSAgICAgICAgJHJ1biBldmFsICJlY2hvIEVYUE9SVFMgIic+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5kZWYiJworCQkkcnVuIGV2YWwgJ2NhdCAiJGV4cG9ydF9zeW1ib2xzIiA+PiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZGVmIicKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICBlc2FjCisJICAgIGVsc2UKKwkgICAgICAkcnVuIGV2YWwgIiR7U0VEfSAtZSAncy9cKFtdLlsqXiRdXCkvXFxcXFwxL2cnIC1lICdzL14vIC8nIC1lICdzLyQvJC8nIicgPCAiJGV4cG9ydF9zeW1ib2xzIiA+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5leHAiJworCSAgICAgICRydW4gZXZhbCAnZ3JlcCAtZiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZXhwIiA8ICIkbmxpc3QiID4gIiRubGlzdCJUJworCSAgICAgICRydW4gZXZhbCAnbXYgIiRubGlzdCJUICIkbmxpc3QiJworICAgICAgICAgICAgICBjYXNlICRob3N0IGluCisgICAgICAgICAgICAgICpjeWd3aW4qIHwgKm1pbmd3KiApCisJICAgICAgICAkcnVuIGV2YWwgImVjaG8gRVhQT1JUUyAiJz4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmRlZiInCisJCSRydW4gZXZhbCAnY2F0ICIkbmxpc3QiID4+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5kZWYiJworICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgIGVzYWMKKwkgICAgZmkKKwkgIGZpCisKKwkgIGZvciBhcmcgaW4gJGRscHJlZmlsZXM7IGRvCisJICAgICRzaG93ICJleHRyYWN0aW5nIGdsb2JhbCBDIHN5bWJvbHMgZnJvbSBcYCRhcmcnIgorCSAgICBuYW1lPWAkZWNobyAiJGFyZyIgfCAke1NFRH0gLWUgJ3MlXi4qLyUlJ2AKKwkgICAgJHJ1biBldmFsICckZWNobyAiOiAkbmFtZSAiID4+ICIkbmxpc3QiJworCSAgICAkcnVuIGV2YWwgIiROTSAkYXJnIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+PiAnJG5saXN0JyIKKwkgIGRvbmUKKworCSAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KKwkgICAgIyBNYWtlIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBhbiBlbXB0eSBmaWxlLgorCSAgICB0ZXN0IC1mICIkbmxpc3QiIHx8IDogPiAiJG5saXN0IgorCisJICAgIGlmIHRlc3QgLW4gIiRleGNsdWRlX2V4cHN5bXMiOyB0aGVuCisJICAgICAgJEVHUkVQIC12ICIgKCRleGNsdWRlX2V4cHN5bXMpJCIgIiRubGlzdCIgPiAiJG5saXN0IlQKKwkgICAgICAkbXYgIiRubGlzdCJUICIkbmxpc3QiCisJICAgIGZpCisKKwkgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KKwkgICAgaWYgZ3JlcCAtdiAiXjogIiA8ICIkbmxpc3QiIHwKKwkJaWYgc29ydCAtayAzIDwvZGV2L251bGwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCSAgc29ydCAtayAzCisJCWVsc2UKKwkJICBzb3J0ICsyCisJCWZpIHwKKwkJdW5pcSA+ICIkbmxpc3QiUzsgdGhlbgorCSAgICAgIDoKKwkgICAgZWxzZQorCSAgICAgIGdyZXAgLXYgIl46ICIgPCAiJG5saXN0IiA+ICIkbmxpc3QiUworCSAgICBmaQorCisJICAgIGlmIHRlc3QgLWYgIiRubGlzdCJTOyB0aGVuCisJICAgICAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiUyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyInCisJICAgIGVsc2UKKwkgICAgICAkZWNobyAnLyogTk9ORSAqLycgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiCisJICAgIGZpCisKKwkgICAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCisKKyN1bmRlZiBsdF9wcmVsb2FkZWRfc3ltYm9scworCisjaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCisjIGRlZmluZSBsdF9wdHIgdm9pZCAqCisjZWxzZQorIyBkZWZpbmUgbHRfcHRyIGNoYXIgKgorIyBkZWZpbmUgY29uc3QKKyNlbmRpZgorCisvKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KKyIKKworCSAgICBjYXNlICRob3N0IGluCisJICAgICpjeWd3aW4qIHwgKm1pbmd3KiApCisJICAkZWNobyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIgIlwKKy8qIERBVEEgaW1wb3J0cyBmcm9tIERMTHMgb24gV0lOMzIgY2FuJ3QgYmUgY29uc3QsIGJlY2F1c2UKKyAgIHJ1bnRpbWUgcmVsb2NhdGlvbnMgYXJlIHBlcmZvcm1lZCAtLSBzZWUgbGQncyBkb2N1bWVudGF0aW9uCisgICBvbiBwc2V1ZG8tcmVsb2NzICovCitzdHJ1Y3QgeworIgorCSAgICAgIDs7CisJICAgICogKQorCSAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCitjb25zdCBzdHJ1Y3QgeworIgorCSAgICAgIDs7CisJICAgIGVzYWMKKworCisJICAkZWNobyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIgIlwKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgbHRfcHRyIGFkZHJlc3M7Cit9CitsdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KK3tcCisiCisKKwkgICAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MiIDwgIiRubGlzdCIgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiCisKKwkgICAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCisgIHswLCAobHRfcHRyKSAwfQorfTsKKworLyogVGhpcyB3b3JrcyBhcm91bmQgYSBwcm9ibGVtIGluIEZyZWVCU0QgbGlua2VyICovCisjaWZkZWYgRlJFRUJTRF9XT1JLQVJPVU5ECitzdGF0aWMgY29uc3Qgdm9pZCAqbHRfcHJlbG9hZGVkX3NldHVwKCkgeworICByZXR1cm4gbHRfcHJlbG9hZGVkX3N5bWJvbHM7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWZcCisiCisJICBmaQorCisJICBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9CisJICBjYXNlICRob3N0IGluCisJICAjIGNvbXBpbGluZyB0aGUgc3ltYm9sIHRhYmxlIGZpbGUgd2l0aCBwaWNfZmxhZyB3b3JrcyBhcm91bmQKKwkgICMgYSBGcmVlQlNEIGJ1ZyB0aGF0IGNhdXNlcyBwcm9ncmFtcyB0byBjcmFzaCB3aGVuIC1sbSBpcworCSAgIyBsaW5rZWQgYmVmb3JlIGFueSBvdGhlciBQSUMgb2JqZWN0LiAgQnV0IHdlIG11c3Qgbm90IHVzZQorCSAgIyBwaWNfZmxhZyB3aGVuIGxpbmtpbmcgd2l0aCAtc3RhdGljLiAgVGhlIHByb2JsZW0gZXhpc3RzIGluCisJICAjIEZyZWVCU0QgMi4yLjYgYW5kIGlzIGZpeGVkIGluIEZyZWVCU0QgMy4xLgorCSAgKi0qLWZyZWVic2QyKnwqLSotZnJlZWJzZDMuMCp8Ki0qLWZyZWVic2RlbGYzLjAqKQorCSAgICBjYXNlICIkY29tcGlsZV9jb21tYW5kICIgaW4KKwkgICAgKiIgLXN0YXRpYyAiKikgOzsKKwkgICAgKikgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPSIgJHBpY19mbGFnIC1ERlJFRUJTRF9XT1JLQVJPVU5EIjs7CisJICAgIGVzYWM7OworCSAgKi0qLWhwdXgqKQorCSAgICBjYXNlICIkY29tcGlsZV9jb21tYW5kICIgaW4KKwkgICAgKiIgLXN0YXRpYyAiKikgOzsKKwkgICAgKikgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPSIgJHBpY19mbGFnIjs7CisJICAgIGVzYWMKKwkgIGVzYWMKKworCSAgIyBOb3cgY29tcGlsZSB0aGUgZHluYW1pYyBzeW1ib2wgZmlsZS4KKwkgICRzaG93ICIoY2QgJG91dHB1dF9vYmpkaXIgJiYgJExUQ0MgICRMVENGTEFHUyAtYyRub19idWlsdGluX2ZsYWckcGljX2ZsYWdfZm9yX3N5bXRhYmxlIFwiJGRsc3ltc1wiKSIKKwkgICRydW4gZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRMVENDICAkTFRDRkxBR1MgLWMkbm9fYnVpbHRpbl9mbGFnJHBpY19mbGFnX2Zvcl9zeW10YWJsZSAiJGRsc3ltcyIpJyB8fCBleGl0ICQ/CisKKwkgICMgQ2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBmaWxlcy4KKwkgICRzaG93ICIkcm0gJG91dHB1dF9vYmpkaXIvJGRsc3ltcyAkbmxpc3QgJHtubGlzdH1TICR7bmxpc3R9VCIKKwkgICRydW4gJHJtICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiJG5saXN0IiAiJHtubGlzdH1TIiAiJHtubGlzdH1UIgorCisJICAjIFRyYW5zZm9ybSB0aGUgc3ltYm9sIGZpbGUgaW50byB0aGUgY29ycmVjdCBuYW1lLgorICAgICAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICAgICAqY3lnd2luKiB8ICptaW5ndyogKQorICAgICAgICAgICAgaWYgdGVzdCAtZiAiJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfS5kZWYiIDsgdGhlbgorICAgICAgICAgICAgICBjb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfS5kZWYgJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9JSJgCisgICAgICAgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX0uZGVmICRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSUiYAorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBjb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9JSJgCisgICAgICAgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSUiYAorICAgICAgICAgICAgIGZpCisgICAgICAgICAgICA7OworICAgICAgICAgICogKQorICAgICAgICAgICAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSUiYAorICAgICAgICAgICAgZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9JSJgCisgICAgICAgICAgICA7OworICAgICAgICAgIGVzYWMKKwkgIDs7CisJKikKKwkgICRlY2hvICIkbW9kZW5hbWU6IHVua25vd24gc3VmZml4IGZvciBcYCRkbHN5bXMnIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgIDs7CisJZXNhYworICAgICAgZWxzZQorCSMgV2Uga2VlcCBnb2luZyBqdXN0IGluIGNhc2UgdGhlIHVzZXIgZGlkbid0IHJlZmVyIHRvCisJIyBsdF9wcmVsb2FkZWRfc3ltYm9scy4gIFRoZSBsaW5rZXIgd2lsbCBmYWlsIGlmIGdsb2JhbF9zeW1ib2xfcGlwZQorCSMgcmVhbGx5IHdhcyByZXF1aXJlZC4KKworCSMgTnVsbGlmeSB0aGUgc3ltYm9sIGZpbGUuCisJY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlImAKKwlmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJSBAU1lNRklMRUAlJSJgCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbmVlZF9yZWxpbmsiID0gbm8gfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCisJIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgorCWNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dCInJWcnYAorCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgorCisJIyBXZSBoYXZlIG5vIHVuaW5zdGFsbGVkIGxpYnJhcnkgZGVwZW5kZW5jaWVzLCBzbyBmaW5hbGl6ZSByaWdodCBub3cuCisJJHNob3cgIiRsaW5rX2NvbW1hbmQiCisJJHJ1biBldmFsICIkbGlua19jb21tYW5kIgorCWV4aXRfc3RhdHVzPSQ/CisKKwkjIERlbGV0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzLgorCWlmIHRlc3QgLW4gIiRkbHN5bXMiOyB0aGVuCisJICAkc2hvdyAiJHJtICRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSIKKwkgICRydW4gJHJtICIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0iCisJZmkKKworCWV4aXQgJGV4aXRfc3RhdHVzCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKwkjIFdlIHNob3VsZCBzZXQgdGhlIHNobGlicGF0aF92YXIKKwlycGF0aD0KKwlmb3IgZGlyIGluICR0ZW1wX3JwYXRoOyBkbworCSAgY2FzZSAkZGlyIGluCisJICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopCisJICAgICMgQWJzb2x1dGUgcGF0aC4KKwkgICAgcnBhdGg9IiRycGF0aCRkaXI6IgorCSAgICA7OworCSAgKikKKwkgICAgIyBSZWxhdGl2ZSBwYXRoOiBhZGQgYSB0aGlzZGlyIGVudHJ5LgorCSAgICBycGF0aD0iJHJwYXRoXCR0aGlzZGlyLyRkaXI6IgorCSAgICA7OworCSAgZXNhYworCWRvbmUKKwl0ZW1wX3JwYXRoPSIkcnBhdGgiCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkY29tcGlsZV9zaGxpYnBhdGgkZmluYWxpemVfc2hsaWJwYXRoIjsgdGhlbgorCWNvbXBpbGVfY29tbWFuZD0iJHNobGlicGF0aF92YXI9XCIkY29tcGlsZV9zaGxpYnBhdGgkZmluYWxpemVfc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3ZhclwiICRjb21waWxlX2NvbW1hbmQiCisgICAgICBmaQorICAgICAgaWYgdGVzdCAtbiAiJGZpbmFsaXplX3NobGlicGF0aCI7IHRoZW4KKwlmaW5hbGl6ZV9jb21tYW5kPSIkc2hsaWJwYXRoX3Zhcj1cIiRmaW5hbGl6ZV9zaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIgJGZpbmFsaXplX2NvbW1hbmQiCisgICAgICBmaQorCisgICAgICBjb21waWxlX3Zhcj0KKyAgICAgIGZpbmFsaXplX3Zhcj0KKyAgICAgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKwlpZiB0ZXN0IC1uICIkcGVybV9ycGF0aCI7IHRoZW4KKwkgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCisJICBycGF0aD0KKwkgIGZvciBkaXIgaW4gJHBlcm1fcnBhdGg7IGRvCisJICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKKwkgIGRvbmUKKwkgIGNvbXBpbGVfdmFyPSIkcnVucGF0aF92YXI9XCIkcnBhdGhcJCRydW5wYXRoX3ZhclwiICIKKwlmaQorCWlmIHRlc3QgLW4gIiRmaW5hbGl6ZV9wZXJtX3JwYXRoIjsgdGhlbgorCSAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KKwkgIHJwYXRoPQorCSAgZm9yIGRpciBpbiAkZmluYWxpemVfcGVybV9ycGF0aDsgZG8KKwkgICAgcnBhdGg9IiRycGF0aCRkaXI6IgorCSAgZG9uZQorCSAgZmluYWxpemVfdmFyPSIkcnVucGF0aF92YXI9XCIkcnBhdGhcJCRydW5wYXRoX3ZhclwiICIKKwlmaQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJG5vX2luc3RhbGwiID0geWVzOyB0aGVuCisJIyBXZSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBhIHdyYXBwZXIgc2NyaXB0LgorCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgorCSMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKwlsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJGxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJ2AKKwkjIERlbGV0ZSB0aGUgb2xkIG91dHB1dCBmaWxlLgorCSRydW4gJHJtICRvdXRwdXQKKwkjIExpbmsgdGhlIGV4ZWN1dGFibGUgYW5kIGV4aXQKKwkkc2hvdyAiJGxpbmtfY29tbWFuZCIKKwkkcnVuIGV2YWwgIiRsaW5rX2NvbW1hbmQiIHx8IGV4aXQgJD8KKwlleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb24iID0gcmVsaW5rOyB0aGVuCisJIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCisJbGlua19jb21tYW5kPSIkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCisJcmVsaW5rX2NvbW1hbmQ9IiRmaW5hbGl6ZV92YXIkZmluYWxpemVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKKworCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHRoaXMgcGxhdGZvcm0gZG9lcyBub3QgbGlrZSB1bmluc3RhbGxlZCBzaGFyZWQgbGlicmFyaWVzIiAxPiYyCisJJGVjaG8gIiRtb2RlbmFtZTogXGAkb3V0cHV0JyB3aWxsIGJlIHJlbGlua2VkIGR1cmluZyBpbnN0YWxsYXRpb24iIDE+JjIKKyAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiAhPSBubzsgdGhlbgorCSAgbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGNvbXBpbGVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKKwkgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCisJICAgIHJlbGlua19jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCVcJHByb2dkaXIvXCRmaWxlJWcnYAorCSAgZWxzZQorCSAgICAjIGZhc3RfaW5zdGFsbCBpcyBzZXQgdG8gbmVlZGxlc3MKKwkgICAgcmVsaW5rX2NvbW1hbmQ9CisJICBmaQorCWVsc2UKKwkgIGxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgorCSAgcmVsaW5rX2NvbW1hbmQ9IiRmaW5hbGl6ZV92YXIkZmluYWxpemVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKKwlmaQorICAgICAgZmkKKworICAgICAgIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgorICAgICAgbGlua19jb21tYW5kPWAkZWNobyAiWCRsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSInJWcnYAorCisgICAgICAjIERlbGV0ZSB0aGUgb2xkIG91dHB1dCBmaWxlcy4KKyAgICAgICRydW4gJHJtICRvdXRwdXQgJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUgJG91dHB1dF9vYmpkaXIvbHQtJG91dHB1dG5hbWUKKworICAgICAgJHNob3cgIiRsaW5rX2NvbW1hbmQiCisgICAgICAkcnVuIGV2YWwgIiRsaW5rX2NvbW1hbmQiIHx8IGV4aXQgJD8KKworICAgICAgIyBOb3cgY3JlYXRlIHRoZSB3cmFwcGVyIHNjcmlwdC4KKyAgICAgICRzaG93ICJjcmVhdGluZyAkb3V0cHV0IgorCisgICAgICAjIFF1b3RlIHRoZSByZWxpbmsgY29tbWFuZCBmb3Igc2hpcHBpbmcuCisgICAgICBpZiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCisJIyBQcmVzZXJ2ZSBhbnkgdmFyaWFibGVzIHRoYXQgbWF5IGFmZmVjdCBjb21waWxlciBiZWhhdmlvcgorCWZvciB2YXIgaW4gJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rOyBkbworCSAgaWYgZXZhbCB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCI7IHRoZW4KKwkgICAgcmVsaW5rX2NvbW1hbmQ9InsgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiIHx8IHVuc2V0ICR2YXIgfHwgeyAkdmFyPTsgZXhwb3J0ICR2YXI7IH07IH07ICRyZWxpbmtfY29tbWFuZCIKKwkgIGVsaWYgZXZhbCB2YXJfdmFsdWU9XCQkdmFyOyB0ZXN0IC16ICIkdmFyX3ZhbHVlIjsgdGhlbgorCSAgICByZWxpbmtfY29tbWFuZD0iJHZhcj07IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCisJICBlbHNlCisJICAgIHZhcl92YWx1ZT1gJGVjaG8gIlgkdmFyX3ZhbHVlIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKwkgICAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9XCIkdmFyX3ZhbHVlXCI7IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCisJICBmaQorCWRvbmUKKwlyZWxpbmtfY29tbWFuZD0iKGNkIGBwd2RgOyAkcmVsaW5rX2NvbW1hbmQpIgorCXJlbGlua19jb21tYW5kPWAkZWNobyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBmaQorCisgICAgICAjIFF1b3RlICRlY2hvIGZvciBzaGlwcGluZy4KKyAgICAgIGlmIHRlc3QgIlgkZWNobyIgPSAiWCRTSEVMTCAkcHJvZ3BhdGggLS1mYWxsYmFjay1lY2hvIjsgdGhlbgorCWNhc2UgJHByb2dwYXRoIGluCisJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBxZWNobz0iJFNIRUxMICRwcm9ncGF0aCAtLWZhbGxiYWNrLWVjaG8iOzsKKwkqKSBxZWNobz0iJFNIRUxMIGBwd2RgLyRwcm9ncGF0aCAtLWZhbGxiYWNrLWVjaG8iOzsKKwllc2FjCisJcWVjaG89YCRlY2hvICJYJHFlY2hvIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAgIGVsc2UKKwlxZWNobz1gJGVjaG8gIlgkZWNobyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBmaQorCisgICAgICAjIE9ubHkgYWN0dWFsbHkgZG8gdGhpbmdzIGlmIG91ciBydW4gY29tbWFuZCBpcyBub24tbnVsbC4KKyAgICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCisJIyB3aW4zMiB3aWxsIHRoaW5rIHRoZSBzY3JpcHQgaXMgYSBiaW5hcnkgaWYgaXQgaGFzCisJIyBhIC5leGUgc3VmZml4LCBzbyB3ZSBzdHJpcCBpdCBvZmYgaGVyZS4KKwljYXNlICRvdXRwdXQgaW4KKwkgICouZXhlKSBvdXRwdXQ9YCRlY2hvICRvdXRwdXR8JHtTRUR9ICdzLC5leGUkLCwnYCA7OworCWVzYWMKKwkjIHRlc3QgZm9yIGN5Z3dpbiBiZWNhdXNlIG12IGZhaWxzIHcvbyAuZXhlIGV4dGVuc2lvbnMKKwljYXNlICRob3N0IGluCisJICAqY3lnd2luKikKKwkgICAgZXhlZXh0PS5leGUKKwkgICAgb3V0cHV0bmFtZT1gJGVjaG8gJG91dHB1dG5hbWV8JHtTRUR9ICdzLC5leGUkLCwnYCA7OworCSAgKikgZXhlZXh0PSA7OworCWVzYWMKKwljYXNlICRob3N0IGluCisJICAqY3lnd2luKiB8ICptaW5ndyogKQorICAgICAgICAgICAgb3V0cHV0X25hbWU9YGJhc2VuYW1lICRvdXRwdXRgCisgICAgICAgICAgICBvdXRwdXRfcGF0aD1gZGlybmFtZSAkb3V0cHV0YAorICAgICAgICAgICAgY3dyYXBwZXJzb3VyY2U9IiRvdXRwdXRfcGF0aC8kb2JqZGlyL2x0LSRvdXRwdXRfbmFtZS5jIgorICAgICAgICAgICAgY3dyYXBwZXI9IiRvdXRwdXRfcGF0aC8kb3V0cHV0X25hbWUuZXhlIgorICAgICAgICAgICAgJHJtICRjd3JhcHBlcnNvdXJjZSAkY3dyYXBwZXIKKyAgICAgICAgICAgIHRyYXAgIiRybSAkY3dyYXBwZXJzb3VyY2UgJGN3cmFwcGVyOyBleGl0ICRFWElUX0ZBSUxVUkUiIDEgMiAxNQorCisJICAgIGNhdCA+ICRjd3JhcHBlcnNvdXJjZSA8PEVPRgorCisvKiAkY3dyYXBwZXJzb3VyY2UgLSB0ZW1wb3Jhcnkgd3JhcHBlciBleGVjdXRhYmxlIGZvciAkb2JqZGlyLyRvdXRwdXRuYW1lCisgICBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QCisKKyAgIFRoZSAkb3V0cHV0IHByb2dyYW0gY2Fubm90IGJlIGRpcmVjdGx5IGV4ZWN1dGVkIHVudGlsIGFsbCB0aGUgbGlidG9vbAorICAgbGlicmFyaWVzIHRoYXQgaXQgZGVwZW5kcyBvbiBhcmUgaW5zdGFsbGVkLgorCisgICBUaGlzIHdyYXBwZXIgZXhlY3V0YWJsZSBzaG91bGQgbmV2ZXIgYmUgbW92ZWQgb3V0IG9mIHRoZSBidWlsZCBkaXJlY3RvcnkuCisgICBJZiBpdCBpcywgaXQgd2lsbCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHkuCisKKyAgIEN1cnJlbnRseSwgaXQgc2ltcGx5IGV4ZWNzIHRoZSB3cmFwcGVyICpzY3JpcHQqICIvYmluL3NoICRvdXRwdXQiLAorICAgYnV0IGNvdWxkIGV2ZW50dWFsbHkgYWJzb3JiIGFsbCBvZiB0aGUgc2NyaXB0cyBmdW5jdGlvbmFsaXR5IGFuZAorICAgZXhlYyAkb2JqZGlyLyRvdXRwdXRuYW1lIGRpcmVjdGx5LgorKi8KK0VPRgorCSAgICBjYXQgPj4gJGN3cmFwcGVyc291cmNlPDwiRU9GIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaWYgZGVmaW5lZChQQVRIX01BWCkKKyMgZGVmaW5lIExUX1BBVEhNQVggUEFUSF9NQVgKKyNlbGlmIGRlZmluZWQoTUFYUEFUSExFTikKKyMgZGVmaW5lIExUX1BBVEhNQVggTUFYUEFUSExFTgorI2Vsc2UKKyMgZGVmaW5lIExUX1BBVEhNQVggMTAyNAorI2VuZGlmCisKKyNpZm5kZWYgRElSX1NFUEFSQVRPUgorIyBkZWZpbmUgRElSX1NFUEFSQVRPUiAnLycKKyMgZGVmaW5lIFBBVEhfU0VQQVJBVE9SICc6JworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfV0lOMzIpIHx8IGRlZmluZWQgKF9fTVNET1NfXykgfHwgZGVmaW5lZCAoX19ESkdQUF9fKSB8fCBcCisgIGRlZmluZWQgKF9fT1MyX18pCisjIGRlZmluZSBIQVZFX0RPU19CQVNFRF9GSUxFX1NZU1RFTQorIyBpZm5kZWYgRElSX1NFUEFSQVRPUl8yCisjICBkZWZpbmUgRElSX1NFUEFSQVRPUl8yICdcXCcKKyMgZW5kaWYKKyMgaWZuZGVmIFBBVEhfU0VQQVJBVE9SXzIKKyMgIGRlZmluZSBQQVRIX1NFUEFSQVRPUl8yICc7JworIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRElSX1NFUEFSQVRPUl8yCisjIGRlZmluZSBJU19ESVJfU0VQQVJBVE9SKGNoKSAoKGNoKSA9PSBESVJfU0VQQVJBVE9SKQorI2Vsc2UgLyogRElSX1NFUEFSQVRPUl8yICovCisjIGRlZmluZSBJU19ESVJfU0VQQVJBVE9SKGNoKSBcCisgICAgICAgICgoKGNoKSA9PSBESVJfU0VQQVJBVE9SKSB8fCAoKGNoKSA9PSBESVJfU0VQQVJBVE9SXzIpKQorI2VuZGlmIC8qIERJUl9TRVBBUkFUT1JfMiAqLworCisjaWZuZGVmIFBBVEhfU0VQQVJBVE9SXzIKKyMgZGVmaW5lIElTX1BBVEhfU0VQQVJBVE9SKGNoKSAoKGNoKSA9PSBQQVRIX1NFUEFSQVRPUikKKyNlbHNlIC8qIFBBVEhfU0VQQVJBVE9SXzIgKi8KKyMgZGVmaW5lIElTX1BBVEhfU0VQQVJBVE9SKGNoKSAoKGNoKSA9PSBQQVRIX1NFUEFSQVRPUl8yKQorI2VuZGlmIC8qIFBBVEhfU0VQQVJBVE9SXzIgKi8KKworI2RlZmluZSBYTUFMTE9DKHR5cGUsIG51bSkgICAgICAoKHR5cGUgKikgeG1hbGxvYyAoKG51bSkgKiBzaXplb2YodHlwZSkpKQorI2RlZmluZSBYRlJFRShzdGFsZSkgZG8geyBcCisgIGlmIChzdGFsZSkgeyBmcmVlICgodm9pZCAqKSBzdGFsZSk7IHN0YWxlID0gMDsgfSBcCit9IHdoaWxlICgwKQorCisvKiAtRERFQlVHIGlzIGZhaXJseSBjb21tb24gaW4gQ0ZMQUdTLiAgKi8KKyN1bmRlZiBERUJVRworI2lmIGRlZmluZWQgREVCVUdXUkFQUEVSCisjIGRlZmluZSBERUJVRyhmb3JtYXQsIC4uLikgZnByaW50ZihzdGRlcnIsIGZvcm1hdCwgX19WQV9BUkdTX18pCisjZWxzZQorIyBkZWZpbmUgREVCVUcoZm9ybWF0LCAuLi4pCisjZW5kaWYKKworY29uc3QgY2hhciAqcHJvZ3JhbV9uYW1lID0gTlVMTDsKKwordm9pZCAqIHhtYWxsb2MgKHNpemVfdCBudW0pOworY2hhciAqIHhzdHJkdXAgKGNvbnN0IGNoYXIgKnN0cmluZyk7Citjb25zdCBjaGFyICogYmFzZV9uYW1lIChjb25zdCBjaGFyICpuYW1lKTsKK2NoYXIgKiBmaW5kX2V4ZWN1dGFibGUoY29uc3QgY2hhciAqd3JhcHBlcik7CitpbnQgICAgY2hlY2tfZXhlY3V0YWJsZShjb25zdCBjaGFyICpwYXRoKTsKK2NoYXIgKiBzdHJlbmR6YXAoY2hhciAqc3RyLCBjb25zdCBjaGFyICpwYXQpOwordm9pZCBsdF9mYXRhbCAoY29uc3QgY2hhciAqbWVzc2FnZSwgLi4uKTsKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBjaGFyICoqbmV3YXJnejsKKyAgaW50IGk7CisKKyAgcHJvZ3JhbV9uYW1lID0gKGNoYXIgKikgeHN0cmR1cCAoYmFzZV9uYW1lIChhcmd2WzBdKSk7CisgIERFQlVHKCIobWFpbikgYXJndlswXSAgICAgIDogJXNcbiIsYXJndlswXSk7CisgIERFQlVHKCIobWFpbikgcHJvZ3JhbV9uYW1lIDogJXNcbiIscHJvZ3JhbV9uYW1lKTsKKyAgbmV3YXJneiA9IFhNQUxMT0MoY2hhciAqLCBhcmdjKzIpOworRU9GCisKKyAgICAgICAgICAgIGNhdCA+PiAkY3dyYXBwZXJzb3VyY2UgPDxFT0YKKyAgbmV3YXJnelswXSA9IChjaGFyICopIHhzdHJkdXAoIiRTSEVMTCIpOworRU9GCisKKyAgICAgICAgICAgIGNhdCA+PiAkY3dyYXBwZXJzb3VyY2UgPDwiRU9GIgorICBuZXdhcmd6WzFdID0gZmluZF9leGVjdXRhYmxlKGFyZ3ZbMF0pOworICBpZiAobmV3YXJnelsxXSA9PSBOVUxMKQorICAgIGx0X2ZhdGFsKCJDb3VsZG4ndCBmaW5kICVzIiwgYXJndlswXSk7CisgIERFQlVHKCIobWFpbikgZm91bmQgZXhlIGF0IDogJXNcbiIsbmV3YXJnelsxXSk7CisgIC8qIHdlIGtub3cgdGhlIHNjcmlwdCBoYXMgdGhlIHNhbWUgbmFtZSwgd2l0aG91dCB0aGUgLmV4ZSAqLworICAvKiBzbyBtYWtlIHN1cmUgbmV3YXJnelsxXSBkb2Vzbid0IGVuZCBpbiAuZXhlICovCisgIHN0cmVuZHphcChuZXdhcmd6WzFdLCIuZXhlIik7CisgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCisgICAgbmV3YXJneltpKzFdID0geHN0cmR1cChhcmd2W2ldKTsKKyAgbmV3YXJnelthcmdjKzFdID0gTlVMTDsKKworICBmb3IgKGk9MDsgaTxhcmdjKzE7IGkrKykKKyAgeworICAgIERFQlVHKCIobWFpbikgbmV3YXJnelslZF0gICA6ICVzXG4iLGksbmV3YXJneltpXSk7CisgICAgOworICB9CisKK0VPRgorCisgICAgICAgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICAgICAgICAgIG1pbmd3KikKKyAgICAgICAgICAgICAgICBjYXQgPj4gJGN3cmFwcGVyc291cmNlIDw8RU9GCisgIGV4ZWN2KCIkU0hFTEwiLChjaGFyIGNvbnN0ICoqKW5ld2FyZ3opOworRU9GCisgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgY2F0ID4+ICRjd3JhcHBlcnNvdXJjZSA8PEVPRgorICBleGVjdigiJFNIRUxMIixuZXdhcmd6KTsKK0VPRgorICAgICAgICAgICAgICA7OworICAgICAgICAgICAgZXNhYworCisgICAgICAgICAgICBjYXQgPj4gJGN3cmFwcGVyc291cmNlIDw8IkVPRiIKKyAgcmV0dXJuIDEyNzsKK30KKwordm9pZCAqCit4bWFsbG9jIChzaXplX3QgbnVtKQoreworICB2b2lkICogcCA9ICh2b2lkICopIG1hbGxvYyAobnVtKTsKKyAgaWYgKCFwKQorICAgIGx0X2ZhdGFsICgiTWVtb3J5IGV4aGF1c3RlZCIpOworCisgIHJldHVybiBwOworfQorCitjaGFyICoKK3hzdHJkdXAgKGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKyAgcmV0dXJuIHN0cmluZyA/IHN0cmNweSAoKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzdHJpbmcpICsgMSksIHN0cmluZykgOiBOVUxMCis7Cit9CisKK2NvbnN0IGNoYXIgKgorYmFzZV9uYW1lIChjb25zdCBjaGFyICpuYW1lKQoreworICBjb25zdCBjaGFyICpiYXNlOworCisjaWYgZGVmaW5lZCAoSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0pCisgIC8qIFNraXAgb3ZlciB0aGUgZGlzayBuYW1lIGluIE1TRE9TIHBhdGhuYW1lcy4gKi8KKyAgaWYgKGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKW5hbWVbMF0pICYmIG5hbWVbMV0gPT0gJzonKQorICAgIG5hbWUgKz0gMjsKKyNlbmRpZgorCisgIGZvciAoYmFzZSA9IG5hbWU7ICpuYW1lOyBuYW1lKyspCisgICAgaWYgKElTX0RJUl9TRVBBUkFUT1IgKCpuYW1lKSkKKyAgICAgIGJhc2UgPSBuYW1lICsgMTsKKyAgcmV0dXJuIGJhc2U7Cit9CisKK2ludAorY2hlY2tfZXhlY3V0YWJsZShjb25zdCBjaGFyICogcGF0aCkKK3sKKyAgc3RydWN0IHN0YXQgc3Q7CisKKyAgREVCVUcoIihjaGVja19leGVjdXRhYmxlKSAgOiAlc1xuIiwgcGF0aCA/ICgqcGF0aCA/IHBhdGggOiAiRU1QVFkhIikgOiAiTlVMTCEiKTsKKyAgaWYgKCghcGF0aCkgfHwgKCEqcGF0aCkpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKChzdGF0IChwYXRoLCAmc3QpID49IDApICYmCisgICAgICAoCisgICAgICAgIC8qIE1pbkdXICYgbmF0aXZlIFdJTjMyIGRvIG5vdCBzdXBwb3J0IFNfSVhPVEggb3IgU19JWEdSUCAqLworI2lmIGRlZmluZWQgKFNfSVhPVEgpCisgICAgICAgKChzdC5zdF9tb2RlICYgU19JWE9USCkgPT0gU19JWE9USCkgfHwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNfSVhHUlApCisgICAgICAgKChzdC5zdF9tb2RlICYgU19JWEdSUCkgPT0gU19JWEdSUCkgfHwKKyNlbmRpZgorICAgICAgICgoc3Quc3RfbW9kZSAmIFNfSVhVU1IpID09IFNfSVhVU1IpKQorICAgICAgKQorICAgIHJldHVybiAxOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFNlYXJjaGVzIGZvciB0aGUgZnVsbCBwYXRoIG9mIHRoZSB3cmFwcGVyLiAgUmV0dXJucworICAgbmV3bHkgYWxsb2NhdGVkIGZ1bGwgcGF0aCBuYW1lIGlmIGZvdW5kLCBOVUxMIG90aGVyd2lzZSAqLworY2hhciAqCitmaW5kX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIqIHdyYXBwZXIpCit7CisgIGludCBoYXNfc2xhc2ggPSAwOworICBjb25zdCBjaGFyKiBwOworICBjb25zdCBjaGFyKiBwX25leHQ7CisgIC8qIHN0YXRpYyBidWZmZXIgZm9yIGdldGN3ZCAqLworICBjaGFyIHRtcFtMVF9QQVRITUFYICsgMV07CisgIGludCB0bXBfbGVuOworICBjaGFyKiBjb25jYXRfbmFtZTsKKworICBERUJVRygiKGZpbmRfZXhlY3V0YWJsZSkgIDogJXNcbiIsIHdyYXBwZXIgPyAoKndyYXBwZXIgPyB3cmFwcGVyIDogIkVNUFRZISIpIDogIk5VTEwhIik7CisKKyAgaWYgKCh3cmFwcGVyID09IE5VTEwpIHx8ICgqd3JhcHBlciA9PSAnXDAnKSkKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBBYnNvbHV0ZSBwYXRoPyAqLworI2lmIGRlZmluZWQgKEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNKQorICBpZiAoaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpd3JhcHBlclswXSkgJiYgd3JhcHBlclsxXSA9PSAnOicpCisgIHsKKyAgICBjb25jYXRfbmFtZSA9IHhzdHJkdXAgKHdyYXBwZXIpOworICAgIGlmIChjaGVja19leGVjdXRhYmxlKGNvbmNhdF9uYW1lKSkKKyAgICAgIHJldHVybiBjb25jYXRfbmFtZTsKKyAgICBYRlJFRShjb25jYXRfbmFtZSk7CisgIH0KKyAgZWxzZQorICB7CisjZW5kaWYKKyAgICBpZiAoSVNfRElSX1NFUEFSQVRPUiAod3JhcHBlclswXSkpCisgICAgeworICAgICAgY29uY2F0X25hbWUgPSB4c3RyZHVwICh3cmFwcGVyKTsKKyAgICAgIGlmIChjaGVja19leGVjdXRhYmxlKGNvbmNhdF9uYW1lKSkKKyAgICAgICAgcmV0dXJuIGNvbmNhdF9uYW1lOworICAgICAgWEZSRUUoY29uY2F0X25hbWUpOworICAgIH0KKyNpZiBkZWZpbmVkIChIQVZFX0RPU19CQVNFRF9GSUxFX1NZU1RFTSkKKyAgfQorI2VuZGlmCisKKyAgZm9yIChwID0gd3JhcHBlcjsgKnA7IHArKykKKyAgICBpZiAoKnAgPT0gJy8nKQorICAgIHsKKyAgICAgIGhhc19zbGFzaCA9IDE7CisgICAgICBicmVhazsKKyAgICB9CisgIGlmICghaGFzX3NsYXNoKQorICB7CisgICAgLyogbm8gc2xhc2hlczsgc2VhcmNoIFBBVEggKi8KKyAgICBjb25zdCBjaGFyKiBwYXRoID0gZ2V0ZW52ICgiUEFUSCIpOworICAgIGlmIChwYXRoICE9IE5VTEwpCisgICAgeworICAgICAgZm9yIChwID0gcGF0aDsgKnA7IHAgPSBwX25leHQpCisgICAgICB7CisgICAgICAgIGNvbnN0IGNoYXIqIHE7CisgICAgICAgIHNpemVfdCBwX2xlbjsKKyAgICAgICAgZm9yIChxID0gcDsgKnE7IHErKykKKyAgICAgICAgICBpZiAoSVNfUEFUSF9TRVBBUkFUT1IoKnEpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHBfbGVuID0gcSAtIHA7CisgICAgICAgIHBfbmV4dCA9ICgqcSA9PSAnXDAnID8gcSA6IHEgKyAxKTsKKyAgICAgICAgaWYgKHBfbGVuID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBlbXB0eSBwYXRoOiBjdXJyZW50IGRpcmVjdG9yeSAqLworICAgICAgICAgIGlmIChnZXRjd2QgKHRtcCwgTFRfUEFUSE1BWCkgPT0gTlVMTCkKKyAgICAgICAgICAgIGx0X2ZhdGFsICgiZ2V0Y3dkIGZhaWxlZCIpOworICAgICAgICAgIHRtcF9sZW4gPSBzdHJsZW4odG1wKTsKKyAgICAgICAgICBjb25jYXRfbmFtZSA9IFhNQUxMT0MoY2hhciwgdG1wX2xlbiArIDEgKyBzdHJsZW4od3JhcHBlcikgKyAxKTsKKyAgICAgICAgICBtZW1jcHkgKGNvbmNhdF9uYW1lLCB0bXAsIHRtcF9sZW4pOworICAgICAgICAgIGNvbmNhdF9uYW1lW3RtcF9sZW5dID0gJy8nOworICAgICAgICAgIHN0cmNweSAoY29uY2F0X25hbWUgKyB0bXBfbGVuICsgMSwgd3JhcHBlcik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgY29uY2F0X25hbWUgPSBYTUFMTE9DKGNoYXIsIHBfbGVuICsgMSArIHN0cmxlbih3cmFwcGVyKSArIDEpOworICAgICAgICAgIG1lbWNweSAoY29uY2F0X25hbWUsIHAsIHBfbGVuKTsKKyAgICAgICAgICBjb25jYXRfbmFtZVtwX2xlbl0gPSAnLyc7CisgICAgICAgICAgc3RyY3B5IChjb25jYXRfbmFtZSArIHBfbGVuICsgMSwgd3JhcHBlcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoZWNrX2V4ZWN1dGFibGUoY29uY2F0X25hbWUpKQorICAgICAgICAgIHJldHVybiBjb25jYXRfbmFtZTsKKyAgICAgICAgWEZSRUUoY29uY2F0X25hbWUpOworICAgICAgfQorICAgIH0KKyAgICAvKiBub3QgZm91bmQgaW4gUEFUSDsgYXNzdW1lIGN1cmRpciAqLworICB9CisgIC8qIFJlbGF0aXZlIHBhdGggfCBub3QgZm91bmQgaW4gcGF0aDogcHJlcGVuZCBjd2QgKi8KKyAgaWYgKGdldGN3ZCAodG1wLCBMVF9QQVRITUFYKSA9PSBOVUxMKQorICAgIGx0X2ZhdGFsICgiZ2V0Y3dkIGZhaWxlZCIpOworICB0bXBfbGVuID0gc3RybGVuKHRtcCk7CisgIGNvbmNhdF9uYW1lID0gWE1BTExPQyhjaGFyLCB0bXBfbGVuICsgMSArIHN0cmxlbih3cmFwcGVyKSArIDEpOworICBtZW1jcHkgKGNvbmNhdF9uYW1lLCB0bXAsIHRtcF9sZW4pOworICBjb25jYXRfbmFtZVt0bXBfbGVuXSA9ICcvJzsKKyAgc3RyY3B5IChjb25jYXRfbmFtZSArIHRtcF9sZW4gKyAxLCB3cmFwcGVyKTsKKworICBpZiAoY2hlY2tfZXhlY3V0YWJsZShjb25jYXRfbmFtZSkpCisgICAgcmV0dXJuIGNvbmNhdF9uYW1lOworICBYRlJFRShjb25jYXRfbmFtZSk7CisgIHJldHVybiBOVUxMOworfQorCitjaGFyICoKK3N0cmVuZHphcChjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnBhdCkKK3sKKyAgc2l6ZV90IGxlbiwgcGF0bGVuOworCisgIGFzc2VydChzdHIgIT0gTlVMTCk7CisgIGFzc2VydChwYXQgIT0gTlVMTCk7CisKKyAgbGVuID0gc3RybGVuKHN0cik7CisgIHBhdGxlbiA9IHN0cmxlbihwYXQpOworCisgIGlmIChwYXRsZW4gPD0gbGVuKQorICB7CisgICAgc3RyICs9IGxlbiAtIHBhdGxlbjsKKyAgICBpZiAoc3RyY21wKHN0ciwgcGF0KSA9PSAwKQorICAgICAgKnN0ciA9ICdcMCc7CisgIH0KKyAgcmV0dXJuIHN0cjsKK30KKworc3RhdGljIHZvaWQKK2x0X2Vycm9yX2NvcmUgKGludCBleGl0X3N0YXR1cywgY29uc3QgY2hhciAqIG1vZGUsCisgICAgICAgICAgY29uc3QgY2hhciAqIG1lc3NhZ2UsIHZhX2xpc3QgYXApCit7CisgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlczogIiwgcHJvZ3JhbV9uYW1lLCBtb2RlKTsKKyAgdmZwcmludGYgKHN0ZGVyciwgbWVzc2FnZSwgYXApOworICBmcHJpbnRmIChzdGRlcnIsICIuXG4iKTsKKworICBpZiAoZXhpdF9zdGF0dXMgPj0gMCkKKyAgICBleGl0IChleGl0X3N0YXR1cyk7Cit9CisKK3ZvaWQKK2x0X2ZhdGFsIChjb25zdCBjaGFyICptZXNzYWdlLCAuLi4pCit7CisgIHZhX2xpc3QgYXA7CisgIHZhX3N0YXJ0IChhcCwgbWVzc2FnZSk7CisgIGx0X2Vycm9yX2NvcmUgKEVYSVRfRkFJTFVSRSwgIkZBVEFMIiwgbWVzc2FnZSwgYXApOworICB2YV9lbmQgKGFwKTsKK30KK0VPRgorICAgICAgICAgICMgd2Ugc2hvdWxkIHJlYWxseSB1c2UgYSBidWlsZC1wbGF0Zm9ybSBzcGVjaWZpYyBjb21waWxlcgorICAgICAgICAgICMgaGVyZSwgYnV0IE9UT0gsIHRoZSB3cmFwcGVycyAoc2hlbGwgc2NyaXB0IGFuZCB0aGlzIEMgb25lKQorICAgICAgICAgICMgYXJlIG9ubHkgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGV4ZWN1dGUgdGhlICJyZWFsIiBiaW5hcnkuCisgICAgICAgICAgIyBTaW5jZSB0aGUgInJlYWwiIGJpbmFyeSBpcyBidWlsdCBmb3IgJGhvc3QsIHRoZW4gdGhpcworICAgICAgICAgICMgd3JhcHBlciBtaWdodCBhcyB3ZWxsIGJlIGJ1aWx0IGZvciAkaG9zdCwgdG9vLgorICAgICAgICAgICRydW4gJExUQ0MgJExUQ0ZMQUdTIC1zIC1vICRjd3JhcHBlciAkY3dyYXBwZXJzb3VyY2UKKyAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICAgICRybSAkb3V0cHV0CisgICAgICAgIHRyYXAgIiRybSAkb3V0cHV0OyBleGl0ICRFWElUX0ZBSUxVUkUiIDEgMiAxNQorCisJJGVjaG8gPiAkb3V0cHV0ICJcCisjISAkU0hFTEwKKworIyAkb3V0cHV0IC0gdGVtcG9yYXJ5IHdyYXBwZXIgc2NyaXB0IGZvciAkb2JqZGlyLyRvdXRwdXRuYW1lCisjIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVAKKyMKKyMgVGhlICRvdXRwdXQgcHJvZ3JhbSBjYW5ub3QgYmUgZGlyZWN0bHkgZXhlY3V0ZWQgdW50aWwgYWxsIHRoZSBsaWJ0b29sCisjIGxpYnJhcmllcyB0aGF0IGl0IGRlcGVuZHMgb24gYXJlIGluc3RhbGxlZC4KKyMKKyMgVGhpcyB3cmFwcGVyIHNjcmlwdCBzaG91bGQgbmV2ZXIgYmUgbW92ZWQgb3V0IG9mIHRoZSBidWlsZCBkaXJlY3RvcnkuCisjIElmIGl0IGlzLCBpdCB3aWxsIG5vdCBvcGVyYXRlIGNvcnJlY3RseS4KKworIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcworIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KK1hzZWQ9JyR7U0VEfSAtZSAxcy9eWC8vJworc2VkX3F1b3RlX3N1YnN0PSckc2VkX3F1b3RlX3N1YnN0JworCisjIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAorIyBpZiBDRFBBVEggaXMgc2V0LgorKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAorCityZWxpbmtfY29tbWFuZD1cIiRyZWxpbmtfY29tbWFuZFwiCisKKyMgVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBkZXRlcm1pbmVzIG91ciBvcGVyYXRpb24gbW9kZS4KK2lmIHRlc3QgXCJcJGxpYnRvb2xfaW5zdGFsbF9tYWdpY1wiID0gXCIkbWFnaWNcIjsgdGhlbgorICAjIGluc3RhbGwgbW9kZSBuZWVkcyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlOgorICBub3RpbnN0X2RlcGxpYnM9JyRub3RpbnN0X2RlcGxpYnMnCitlbHNlCisgICMgV2hlbiB3ZSBhcmUgc291cmNlZCBpbiBleGVjdXRlIG1vZGUsIFwkZmlsZSBhbmQgXCRlY2hvIGFyZSBhbHJlYWR5IHNldC4KKyAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgIT0gXCIkbWFnaWNcIjsgdGhlbgorICAgIGVjaG89XCIkcWVjaG9cIgorICAgIGZpbGU9XCJcJDBcIgorICAgICMgTWFrZSBzdXJlIGVjaG8gd29ya3MuCisgICAgaWYgdGVzdCBcIlhcJDFcIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgorICAgICAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCisgICAgICBzaGlmdAorICAgIGVsaWYgdGVzdCBcIlhcYChcJGVjaG8gJ1x0JykgMj4vZGV2L251bGxcYFwiID0gJ1hcdCc7IHRoZW4KKyAgICAgICMgWWlwcGVlLCBcJGVjaG8gd29ya3MhCisgICAgICA6CisgICAgZWxzZQorICAgICAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLCBhbmQgdGhlbiBtYXliZSBcJGVjaG8gd2lsbCB3b3JrLgorICAgICAgZXhlYyAkU0hFTEwgXCJcJDBcIiAtLW5vLXJlZXhlYyBcJHsxK1wiXCRAXCJ9CisgICAgZmkKKyAgZmlcCisiCisJJGVjaG8gPj4gJG91dHB1dCAiXAorCisgICMgRmluZCB0aGUgZGlyZWN0b3J5IHRoYXQgdGhpcyBzY3JpcHQgbGl2ZXMgaW4uCisgIHRoaXNkaXI9XGBcJGVjaG8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlL1teL10qJCUlJ1xgCisgIHRlc3QgXCJ4XCR0aGlzZGlyXCIgPSBcInhcJGZpbGVcIiAmJiB0aGlzZGlyPS4KKworICAjIEZvbGxvdyBzeW1ib2xpYyBsaW5rcyB1bnRpbCB3ZSBnZXQgdG8gdGhlIHJlYWwgdGhpc2Rpci4KKyAgZmlsZT1cYGxzIC1sZCBcIlwkZmlsZVwiIHwgJHtTRUR9IC1uICdzLy4qLT4gLy9wJ1xgCisgIHdoaWxlIHRlc3QgLW4gXCJcJGZpbGVcIjsgZG8KKyAgICBkZXN0ZGlyPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJS9bXi9dKlwkJSUnXGAKKworICAgICMgSWYgdGhlcmUgd2FzIGEgZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBjaGFuZ2UgdGhpc2Rpci4KKyAgICBpZiB0ZXN0IFwieFwkZGVzdGRpclwiICE9IFwieFwkZmlsZVwiOyB0aGVuCisgICAgICBjYXNlIFwiXCRkZXN0ZGlyXCIgaW4KKyAgICAgIFtcXFxcL10qIHwgW0EtWmEtel06W1xcXFwvXSopIHRoaXNkaXI9XCJcJGRlc3RkaXJcIiA7OworICAgICAgKikgdGhpc2Rpcj1cIlwkdGhpc2Rpci9cJGRlc3RkaXJcIiA7OworICAgICAgZXNhYworICAgIGZpCisKKyAgICBmaWxlPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJV4uKi8lJSdcYAorICAgIGZpbGU9XGBscyAtbGQgXCJcJHRoaXNkaXIvXCRmaWxlXCIgfCAke1NFRH0gLW4gJ3MvLiotPiAvL3AnXGAKKyAgZG9uZQorCisgICMgVHJ5IHRvIGdldCB0aGUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUuCisgIGFic2Rpcj1cYGNkIFwiXCR0aGlzZGlyXCIgJiYgcHdkXGAKKyAgdGVzdCAtbiBcIlwkYWJzZGlyXCIgJiYgdGhpc2Rpcj1cIlwkYWJzZGlyXCIKKyIKKworCWlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCisJICAkZWNobyA+PiAkb3V0cHV0ICJcCisgIHByb2dyYW09bHQtJyRvdXRwdXRuYW1lJyRleGVleHQKKyAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKKworICBpZiB0ZXN0ICEgLWYgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgfHwgXFwKKyAgICAgeyBmaWxlPVxgbHMgLTFkdCBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiBcIlwkcHJvZ2Rpci8uLi9cJHByb2dyYW1cIiAyPi9kZXYvbnVsbCB8ICR7U0VEfSAxcVxgOyBcXAorICAgICAgIHRlc3QgXCJYXCRmaWxlXCIgIT0gXCJYXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB9OyB0aGVuCisKKyAgICBmaWxlPVwiXCRcJC1cJHByb2dyYW1cIgorCisgICAgaWYgdGVzdCAhIC1kIFwiXCRwcm9nZGlyXCI7IHRoZW4KKyAgICAgICRta2RpciBcIlwkcHJvZ2RpclwiCisgICAgZWxzZQorICAgICAgJHJtIFwiXCRwcm9nZGlyL1wkZmlsZVwiCisgICAgZmkiCisKKwkgICRlY2hvID4+ICRvdXRwdXQgIlwKKworICAgICMgcmVsaW5rIGV4ZWN1dGFibGUgaWYgbmVjZXNzYXJ5CisgICAgaWYgdGVzdCAtbiBcIlwkcmVsaW5rX2NvbW1hbmRcIjsgdGhlbgorICAgICAgaWYgcmVsaW5rX2NvbW1hbmRfb3V0cHV0PVxgZXZhbCBcJHJlbGlua19jb21tYW5kIDI+JjFcYDsgdGhlbiA6CisgICAgICBlbHNlCisJJGVjaG8gXCJcJHJlbGlua19jb21tYW5kX291dHB1dFwiID4mMgorCSRybSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgorCWV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgZmkKKyAgICBmaQorCisgICAgJG12IFwiXCRwcm9nZGlyL1wkZmlsZVwiIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIDI+L2Rldi9udWxsIHx8CisgICAgeyAkcm0gXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7CisgICAgICAkbXYgXCJcJHByb2dkaXIvXCRmaWxlXCIgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7IH0KKyAgICAkcm0gXCJcJHByb2dkaXIvXCRmaWxlXCIKKyAgZmkiCisJZWxzZQorCSAgJGVjaG8gPj4gJG91dHB1dCAiXAorICBwcm9ncmFtPSckb3V0cHV0bmFtZScKKyAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKKyIKKwlmaQorCisJJGVjaG8gPj4gJG91dHB1dCAiXAorCisgIGlmIHRlc3QgLWYgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7IHRoZW4iCisKKwkjIEV4cG9ydCBvdXIgc2hsaWJwYXRoX3ZhciBpZiB3ZSBoYXZlIG9uZS4KKwlpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyAmJiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciIgJiYgdGVzdCAtbiAiJHRlbXBfcnBhdGgiOyB0aGVuCisJICAkZWNobyA+PiAkb3V0cHV0ICJcCisgICAgIyBBZGQgb3VyIG93biBsaWJyYXJ5IHBhdGggdG8gJHNobGlicGF0aF92YXIKKyAgICAkc2hsaWJwYXRoX3Zhcj1cIiR0ZW1wX3JwYXRoXCQkc2hsaWJwYXRoX3ZhclwiCisKKyAgICAjIFNvbWUgc3lzdGVtcyBjYW5ub3QgY29wZSB3aXRoIGNvbG9uLXRlcm1pbmF0ZWQgJHNobGlicGF0aF92YXIKKyAgICAjIFRoZSBzZWNvbmQgY29sb24gaXMgYSB3b3JrYXJvdW5kIGZvciBhIGJ1ZyBpbiBCZU9TIFI0IHNlZAorICAgICRzaGxpYnBhdGhfdmFyPVxgXCRlY2hvIFwiWFwkJHNobGlicGF0aF92YXJcIiB8IFwkWHNlZCAtZSAncy86OipcJC8vJ1xgCisKKyAgICBleHBvcnQgJHNobGlicGF0aF92YXIKKyIKKwlmaQorCisJIyBmaXh1cCB0aGUgZGxsIHNlYXJjaHBhdGggaWYgd2UgbmVlZCB0by4KKwlpZiB0ZXN0IC1uICIkZGxsc2VhcmNocGF0aCI7IHRoZW4KKwkgICRlY2hvID4+ICRvdXRwdXQgIlwKKyAgICAjIEFkZCB0aGUgZGxsIHNlYXJjaCBwYXRoIGNvbXBvbmVudHMgdG8gdGhlIGV4ZWN1dGFibGUgUEFUSAorICAgIFBBVEg9JGRsbHNlYXJjaHBhdGg6XCRQQVRICisiCisJZmkKKworCSRlY2hvID4+ICRvdXRwdXQgIlwKKyAgICBpZiB0ZXN0IFwiXCRsaWJ0b29sX2V4ZWN1dGVfbWFnaWNcIiAhPSBcIiRtYWdpY1wiOyB0aGVuCisgICAgICAjIFJ1biB0aGUgYWN0dWFsIHByb2dyYW0gd2l0aCBvdXIgYXJndW1lbnRzLgorIgorCWNhc2UgJGhvc3QgaW4KKwkjIEJhY2tzbGFzaGVzIHNlcGFyYXRlIGRpcmVjdG9yaWVzIG9uIHBsYWluIHdpbmRvd3MKKwkqLSotbWluZ3cgfCAqLSotb3MyKikKKwkgICRlY2hvID4+ICRvdXRwdXQgIlwKKyAgICAgIGV4ZWMgXCJcJHByb2dkaXJcXFxcXCRwcm9ncmFtXCIgXCR7MStcIlwkQFwifQorIgorCSAgOzsKKworCSopCisJICAkZWNobyA+PiAkb3V0cHV0ICJcCisgICAgICBleGVjIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIFwkezErXCJcJEBcIn0KKyIKKwkgIDs7CisJZXNhYworCSRlY2hvID4+ICRvdXRwdXQgIlwKKyAgICAgIFwkZWNobyBcIlwkMDogY2Fubm90IGV4ZWMgXCRwcm9ncmFtIFwkezErXCJcJEBcIn1cIgorICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgZmkKKyAgZWxzZQorICAgICMgVGhlIHByb2dyYW0gZG9lc24ndCBleGlzdC4KKyAgICBcJGVjaG8gXCJcJDA6IGVycm9yOiBcXFxgXCRwcm9nZGlyL1wkcHJvZ3JhbScgZG9lcyBub3QgZXhpc3RcIiAxPiYyCisgICAgXCRlY2hvIFwiVGhpcyBzY3JpcHQgaXMganVzdCBhIHdyYXBwZXIgZm9yIFwkcHJvZ3JhbS5cIiAxPiYyCisgICAgJGVjaG8gXCJTZWUgdGhlICRQQUNLQUdFIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIgMT4mMgorICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorICBmaQorZmlcCisiCisJY2htb2QgK3ggJG91dHB1dAorICAgICAgZmkKKyAgICAgIGV4aXQgJEVYSVRfU1VDQ0VTUworICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIFNlZSBpZiB3ZSBuZWVkIHRvIGJ1aWxkIGFuIG9sZC1mYXNoaW9uZWQgYXJjaGl2ZS4KKyAgICBmb3Igb2xkbGliIGluICRvbGRsaWJzOyBkbworCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IGNvbnZlbmllbmNlOyB0aGVuCisJb2xkb2Jqcz0iJGxpYm9ianNfc2F2ZSIKKwlhZGRsaWJzPSIkY29udmVuaWVuY2UiCisJYnVpbGRfbGlidG9vbF9saWJzPW5vCisgICAgICBlbHNlCisJaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBtb2R1bGU7IHRoZW4KKwkgIG9sZG9ianM9IiRsaWJvYmpzX3NhdmUiCisJICBidWlsZF9saWJ0b29sX2xpYnM9bm8KKwllbHNlCisJICBvbGRvYmpzPSIkb2xkX2RlcGxpYnMgJG5vbl9waWNfb2JqZWN0cyIKKwlmaQorCWFkZGxpYnM9IiRvbGRfY29udmVuaWVuY2UiCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkYWRkbGlicyI7IHRoZW4KKwlnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCWdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgorCisJZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGFkZGxpYnMKKwlvbGRvYmpzPSIkb2xkb2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKKyAgICAgIGZpCisKKyAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgorICAgICAgaWYgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiICYmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisgICAgICAgY21kcz0kb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcworICAgICAgZWxzZQorCSMgUE9TSVggZGVtYW5kcyBubyBwYXRocyB0byBiZSBlbmNvZGVkIGluIGFyY2hpdmVzLiAgV2UgaGF2ZQorCSMgdG8gYXZvaWQgY3JlYXRpbmcgYXJjaGl2ZXMgd2l0aCBkdXBsaWNhdGUgYmFzZW5hbWVzIGlmIHdlCisJIyBtaWdodCBoYXZlIHRvIGV4dHJhY3QgdGhlbSBhZnRlcndhcmRzLCBlLmcuLCB3aGVuIGNyZWF0aW5nIGEKKwkjIHN0YXRpYyBhcmNoaXZlIG91dCBvZiBhIGNvbnZlbmllbmNlIGxpYnJhcnksIG9yIHdoZW4gbGlua2luZworCSMgdGhlIGVudGlyZXR5IG9mIGEgbGlidG9vbCBhcmNoaXZlIGludG8gYW5vdGhlciAoY3VycmVudGx5CisJIyBub3Qgc3VwcG9ydGVkIGJ5IGxpYnRvb2wpLgorCWlmIChmb3Igb2JqIGluICRvbGRvYmpzCisJICAgIGRvCisJICAgICAgJGVjaG8gIlgkb2JqIiB8ICRYc2VkIC1lICdzJV4uKi8lJScKKwkgICAgZG9uZSB8IHNvcnQgfCBzb3J0IC11YyA+L2Rldi9udWxsIDI+JjEpOyB0aGVuCisJICA6CisJZWxzZQorCSAgJGVjaG8gImNvcHlpbmcgc2VsZWN0ZWQgb2JqZWN0IGZpbGVzIHRvIGF2b2lkIGJhc2VuYW1lIGNvbmZsaWN0cy4uLiIKKworCSAgaWYgdGVzdCAteiAiJGdlbnRvcCI7IHRoZW4KKwkgICAgZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKKwkgICAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCisKKwkgICAgJHNob3cgIiR7cm19ciAkZ2VudG9wIgorCSAgICAkcnVuICR7cm19ciAiJGdlbnRvcCIKKwkgICAgJHNob3cgIiRta2RpciAkZ2VudG9wIgorCSAgICAkcnVuICRta2RpciAiJGdlbnRvcCIKKwkgICAgZXhpdF9zdGF0dXM9JD8KKwkgICAgaWYgdGVzdCAiJGV4aXRfc3RhdHVzIiAtbmUgMCAmJiB0ZXN0ICEgLWQgIiRnZW50b3AiOyB0aGVuCisJICAgICAgZXhpdCAkZXhpdF9zdGF0dXMKKwkgICAgZmkKKwkgIGZpCisKKwkgIHNhdmVfb2xkb2Jqcz0kb2xkb2JqcworCSAgb2xkb2Jqcz0KKwkgIGNvdW50ZXI9MQorCSAgZm9yIG9iaiBpbiAkc2F2ZV9vbGRvYmpzCisJICBkbworCSAgICBvYmpiYXNlPWAkZWNobyAiWCRvYmoiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKwkgICAgY2FzZSAiICRvbGRvYmpzICIgaW4KKwkgICAgIiAiKSBvbGRvYmpzPSRvYmogOzsKKwkgICAgKltcIC9dIiRvYmpiYXNlICIqKQorCSAgICAgIHdoaWxlIDo7IGRvCisJCSMgTWFrZSBzdXJlIHdlIGRvbid0IHBpY2sgYW4gYWx0ZXJuYXRlIG5hbWUgdGhhdCBhbHNvCisJCSMgb3ZlcmxhcHMuCisJCW5ld29iaj1sdCRjb3VudGVyLSRvYmpiYXNlCisJCWNvdW50ZXI9YGV4cHIgJGNvdW50ZXIgKyAxYAorCQljYXNlICIgJG9sZG9ianMgIiBpbgorCQkqW1wgL10iJG5ld29iaiAiKikgOzsKKwkJKikgaWYgdGVzdCAhIC1mICIkZ2VudG9wLyRuZXdvYmoiOyB0aGVuIGJyZWFrOyBmaSA7OworCQllc2FjCisJICAgICAgZG9uZQorCSAgICAgICRzaG93ICJsbiAkb2JqICRnZW50b3AvJG5ld29iaiB8fCBjcCAkb2JqICRnZW50b3AvJG5ld29iaiIKKwkgICAgICAkcnVuIGxuICIkb2JqIiAiJGdlbnRvcC8kbmV3b2JqIiB8fAorCSAgICAgICRydW4gY3AgIiRvYmoiICIkZ2VudG9wLyRuZXdvYmoiCisJICAgICAgb2xkb2Jqcz0iJG9sZG9ianMgJGdlbnRvcC8kbmV3b2JqIgorCSAgICAgIDs7CisJICAgICopIG9sZG9ianM9IiRvbGRvYmpzICRvYmoiIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwlmaQorCisJZXZhbCBjbWRzPVwiJG9sZF9hcmNoaXZlX2NtZHNcIgorCisJaWYgbGVuPWBleHByICJYJGNtZHMiIDogIi4qImAgJiYKKwkgICAgIHRlc3QgIiRsZW4iIC1sZSAiJG1heF9jbWRfbGVuIiB8fCB0ZXN0ICIkbWF4X2NtZF9sZW4iIC1sZSAtMTsgdGhlbgorCSAgY21kcz0kb2xkX2FyY2hpdmVfY21kcworCWVsc2UKKwkgICMgdGhlIGNvbW1hbmQgbGluZSBpcyB0b28gbG9uZyB0byBsaW5rIGluIG9uZSBzdGVwLCBsaW5rIGluIHBhcnRzCisJICAkZWNobyAidXNpbmcgcGllY2V3aXNlIGFyY2hpdmUgbGlua2luZy4uLiIKKwkgIHNhdmVfUkFOTElCPSRSQU5MSUIKKwkgIFJBTkxJQj06CisJICBvYmpsaXN0PQorCSAgY29uY2F0X2NtZHM9CisJICBzYXZlX29sZG9ianM9JG9sZG9ianMKKworCSAgIyBJcyB0aGVyZSBhIGJldHRlciB3YXkgb2YgZmluZGluZyB0aGUgbGFzdCBvYmplY3QgaW4gdGhlIGxpc3Q/CisJICBmb3Igb2JqIGluICRzYXZlX29sZG9ianMKKwkgIGRvCisJICAgIGxhc3Rfb2xkb2JqPSRvYmoKKwkgIGRvbmUKKwkgIGZvciBvYmogaW4gJHNhdmVfb2xkb2JqcworCSAgZG8KKwkgICAgb2xkb2Jqcz0iJG9iamxpc3QgJG9iaiIKKwkgICAgb2JqbGlzdD0iJG9iamxpc3QgJG9iaiIKKwkgICAgZXZhbCB0ZXN0X2NtZHM9XCIkb2xkX2FyY2hpdmVfY21kc1wiCisJICAgIGlmIGxlbj1gZXhwciAiWCR0ZXN0X2NtZHMiIDogIi4qIiAyPi9kZXYvbnVsbGAgJiYKKwkgICAgICAgdGVzdCAiJGxlbiIgLWxlICIkbWF4X2NtZF9sZW4iOyB0aGVuCisJICAgICAgOgorCSAgICBlbHNlCisJICAgICAgIyB0aGUgYWJvdmUgY29tbWFuZCBzaG91bGQgYmUgdXNlZCBiZWZvcmUgaXQgZ2V0cyB0b28gbG9uZworCSAgICAgIG9sZG9ianM9JG9iamxpc3QKKwkgICAgICBpZiB0ZXN0ICIkb2JqIiA9ICIkbGFzdF9vbGRvYmoiIDsgdGhlbgorCSAgICAgICAgUkFOTElCPSRzYXZlX1JBTkxJQgorCSAgICAgIGZpCisJICAgICAgdGVzdCAteiAiJGNvbmNhdF9jbWRzIiB8fCBjb25jYXRfY21kcz0kY29uY2F0X2NtZHN+CisJICAgICAgZXZhbCBjb25jYXRfY21kcz1cIlwke2NvbmNhdF9jbWRzfSRvbGRfYXJjaGl2ZV9jbWRzXCIKKwkgICAgICBvYmpsaXN0PQorCSAgICBmaQorCSAgZG9uZQorCSAgUkFOTElCPSRzYXZlX1JBTkxJQgorCSAgb2xkb2Jqcz0kb2JqbGlzdAorCSAgaWYgdGVzdCAiWCRvbGRvYmpzIiA9ICJYIiA7IHRoZW4KKwkgICAgZXZhbCBjbWRzPVwiXCRjb25jYXRfY21kc1wiCisJICBlbHNlCisJICAgIGV2YWwgY21kcz1cIlwkY29uY2F0X2NtZHN+XCRvbGRfYXJjaGl2ZV9jbWRzXCIKKwkgIGZpCisJZmkKKyAgICAgIGZpCisgICAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKyAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisgICAgICAgIGV2YWwgY21kPVwiJGNtZFwiCisJSUZTPSIkc2F2ZV9pZnMiCisJJHNob3cgIiRjbWQiCisJJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/CisgICAgICBkb25lCisgICAgICBJRlM9IiRzYXZlX2lmcyIKKyAgICBkb25lCisKKyAgICBpZiB0ZXN0IC1uICIkZ2VuZXJhdGVkIjsgdGhlbgorICAgICAgJHNob3cgIiR7cm19ciRnZW5lcmF0ZWQiCisgICAgICAkcnVuICR7cm19ciRnZW5lcmF0ZWQKKyAgICBmaQorCisgICAgIyBOb3cgY3JlYXRlIHRoZSBsaWJ0b29sIGFyY2hpdmUuCisgICAgY2FzZSAkb3V0cHV0IGluCisgICAgKi5sYSkKKyAgICAgIG9sZF9saWJyYXJ5PQorICAgICAgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyAmJiBvbGRfbGlicmFyeT0iJGxpYm5hbWUuJGxpYmV4dCIKKyAgICAgICRzaG93ICJjcmVhdGluZyAkb3V0cHV0IgorCisgICAgICAjIFByZXNlcnZlIGFueSB2YXJpYWJsZXMgdGhhdCBtYXkgYWZmZWN0IGNvbXBpbGVyIGJlaGF2aW9yCisgICAgICBmb3IgdmFyIGluICR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluazsgZG8KKwlpZiBldmFsIHRlc3QgLXogXCJcJHskdmFyK3NldH1cIjsgdGhlbgorCSAgcmVsaW5rX2NvbW1hbmQ9InsgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiIHx8IHVuc2V0ICR2YXIgfHwgeyAkdmFyPTsgZXhwb3J0ICR2YXI7IH07IH07ICRyZWxpbmtfY29tbWFuZCIKKwllbGlmIGV2YWwgdmFyX3ZhbHVlPVwkJHZhcjsgdGVzdCAteiAiJHZhcl92YWx1ZSI7IHRoZW4KKwkgIHJlbGlua19jb21tYW5kPSIkdmFyPTsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKKwllbHNlCisJICB2YXJfdmFsdWU9YCRlY2hvICJYJHZhcl92YWx1ZSIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisJICByZWxpbmtfY29tbWFuZD0iJHZhcj1cIiR2YXJfdmFsdWVcIjsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKKwlmaQorICAgICAgZG9uZQorICAgICAgIyBRdW90ZSB0aGUgbGluayBjb21tYW5kIGZvciBzaGlwcGluZy4KKyAgICAgIHJlbGlua19jb21tYW5kPSIoY2QgYHB3ZGA7ICRTSEVMTCAkcHJvZ3BhdGggJHByZXNlcnZlX2FyZ3MgLS1tb2RlPXJlbGluayAkbGlidG9vbF9hcmdzIEBpbnN0X3ByZWZpeF9kaXJAKSIKKyAgICAgIHJlbGlua19jb21tYW5kPWAkZWNobyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfYXV0b21hdGljIiA9IHllcyA7IHRoZW4KKwlyZWxpbmtfY29tbWFuZD0KKyAgICAgIGZpCisKKworICAgICAgIyBPbmx5IGNyZWF0ZSB0aGUgb3V0cHV0IGlmIG5vdCBhIGRyeSBydW4uCisgICAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgorCWZvciBpbnN0YWxsZWQgaW4gbm8geWVzOyBkbworCSAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSB5ZXM7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJGluc3RhbGxfbGliZGlyIjsgdGhlbgorCSAgICAgIGJyZWFrCisJICAgIGZpCisJICAgIG91dHB1dD0iJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiaQorCSAgICAjIFJlcGxhY2UgYWxsIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzIHdpdGggdGhlIGluc3RhbGxlZCBvbmVzCisJICAgIG5ld2RlcGVuZGVuY3lfbGlicz0KKwkgICAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICAgIGNhc2UgJGRlcGxpYiBpbgorCSAgICAgICoubGEpCisJCW5hbWU9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCQlldmFsIGxpYmRpcj1gJHtTRUR9IC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkZGVwbGliYAorCQlpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgorCQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGRlcGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCisJCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisJCWZpCisJCW5ld2RlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyAkbGliZGlyLyRuYW1lIgorCQk7OworCSAgICAgICopIG5ld2RlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyAkZGVwbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgZG9uZQorCSAgICBkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMiCisJICAgIG5ld2RsZmlsZXM9CisJICAgIGZvciBsaWIgaW4gJGRsZmlsZXM7IGRvCisJICAgICAgbmFtZT1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisJICAgICAgZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGxpYmAKKwkgICAgICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgorCQkkZWNobyAiJG1vZGVuYW1lOiBcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgorCQlleGl0ICRFWElUX0ZBSUxVUkUKKwkgICAgICBmaQorCSAgICAgIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRsaWJkaXIvJG5hbWUiCisJICAgIGRvbmUKKwkgICAgZGxmaWxlcz0iJG5ld2RsZmlsZXMiCisJICAgIG5ld2RscHJlZmlsZXM9CisJICAgIGZvciBsaWIgaW4gJGRscHJlZmlsZXM7IGRvCisJICAgICAgbmFtZT1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisJICAgICAgZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGxpYmAKKwkgICAgICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgorCQkkZWNobyAiJG1vZGVuYW1lOiBcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgorCQlleGl0ICRFWElUX0ZBSUxVUkUKKwkgICAgICBmaQorCSAgICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRsaWJkaXIvJG5hbWUiCisJICAgIGRvbmUKKwkgICAgZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMiCisJICBlbHNlCisJICAgIG5ld2RsZmlsZXM9CisJICAgIGZvciBsaWIgaW4gJGRsZmlsZXM7IGRvCisJICAgICAgY2FzZSAkbGliIGluCisJCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgYWJzPSIkbGliIiA7OworCQkqKSBhYnM9YHB3ZGAiLyRsaWIiIDs7CisJICAgICAgZXNhYworCSAgICAgIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRhYnMiCisJICAgIGRvbmUKKwkgICAgZGxmaWxlcz0iJG5ld2RsZmlsZXMiCisJICAgIG5ld2RscHJlZmlsZXM9CisJICAgIGZvciBsaWIgaW4gJGRscHJlZmlsZXM7IGRvCisJICAgICAgY2FzZSAkbGliIGluCisJCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgYWJzPSIkbGliIiA7OworCQkqKSBhYnM9YHB3ZGAiLyRsaWIiIDs7CisJICAgICAgZXNhYworCSAgICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRhYnMiCisJICAgIGRvbmUKKwkgICAgZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMiCisJICBmaQorCSAgJHJtICRvdXRwdXQKKwkgICMgcGxhY2UgZGxuYW1lIGluIGNvcnJlY3QgcG9zaXRpb24gZm9yIGN5Z3dpbgorCSAgdGRsbmFtZT0kZGxuYW1lCisJICBjYXNlICRob3N0LCRvdXRwdXQsJGluc3RhbGxlZCwkbW9kdWxlLCRkbG5hbWUgaW4KKwkgICAgKmN5Z3dpbiosKmxhaSx5ZXMsbm8sKi5kbGwgfCAqbWluZ3cqLCpsYWkseWVzLG5vLCouZGxsKSB0ZGxuYW1lPS4uL2Jpbi8kZGxuYW1lIDs7CisJICBlc2FjCisJICAkZWNobyA+ICRvdXRwdXQgIlwKKyMgJG91dHB1dG5hbWUgLSBhIGxpYnRvb2wgbGlicmFyeSBmaWxlCisjIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVAKKyMKKyMgUGxlYXNlIERPIE5PVCBkZWxldGUgdGhpcyBmaWxlIQorIyBJdCBpcyBuZWNlc3NhcnkgZm9yIGxpbmtpbmcgdGhlIGxpYnJhcnkuCisKKyMgVGhlIG5hbWUgdGhhdCB3ZSBjYW4gZGxvcGVuKDMpLgorZGxuYW1lPSckdGRsbmFtZScKKworIyBOYW1lcyBvZiB0aGlzIGxpYnJhcnkuCitsaWJyYXJ5X25hbWVzPSckbGlicmFyeV9uYW1lcycKKworIyBUaGUgbmFtZSBvZiB0aGUgc3RhdGljIGFyY2hpdmUuCitvbGRfbGlicmFyeT0nJG9sZF9saWJyYXJ5JworCisjIExpYnJhcmllcyB0aGF0IHRoaXMgb25lIGRlcGVuZHMgdXBvbi4KK2RlcGVuZGVuY3lfbGlicz0nJGRlcGVuZGVuY3lfbGlicycKKworIyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciAkbGlibmFtZS4KK2N1cnJlbnQ9JGN1cnJlbnQKK2FnZT0kYWdlCityZXZpc2lvbj0kcmV2aXNpb24KKworIyBJcyB0aGlzIGFuIGFscmVhZHkgaW5zdGFsbGVkIGxpYnJhcnk/CitpbnN0YWxsZWQ9JGluc3RhbGxlZAorCisjIFNob3VsZCB3ZSB3YXJuIGFib3V0IHBvcnRhYmlsaXR5IHdoZW4gbGlua2luZyBhZ2FpbnN0IC1tb2R1bGVzPworc2hvdWxkbm90bGluaz0kbW9kdWxlCisKKyMgRmlsZXMgdG8gZGxvcGVuL2RscHJlb3BlbgorZGxvcGVuPSckZGxmaWxlcycKK2RscHJlb3Blbj0nJGRscHJlZmlsZXMnCisKKyMgRGlyZWN0b3J5IHRoYXQgdGhpcyBsaWJyYXJ5IG5lZWRzIHRvIGJlIGluc3RhbGxlZCBpbjoKK2xpYmRpcj0nJGluc3RhbGxfbGliZGlyJyIKKwkgIGlmIHRlc3QgIiRpbnN0YWxsZWQiID0gbm8gJiYgdGVzdCAiJG5lZWRfcmVsaW5rIiA9IHllczsgdGhlbgorCSAgICAkZWNobyA+PiAkb3V0cHV0ICJcCityZWxpbmtfY29tbWFuZD1cIiRyZWxpbmtfY29tbWFuZFwiIgorCSAgZmkKKwlkb25lCisgICAgICBmaQorCisgICAgICAjIERvIGEgc3ltYm9saWMgbGluayBzbyB0aGF0IHRoZSBsaWJ0b29sIGFyY2hpdmUgY2FuIGJlIGZvdW5kIGluCisgICAgICAjIExEX0xJQlJBUllfUEFUSCBiZWZvcmUgdGhlIHByb2dyYW0gaXMgaW5zdGFsbGVkLgorICAgICAgJHNob3cgIihjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJG91dHB1dG5hbWUgJiYgJExOX1MgLi4vJG91dHB1dG5hbWUgJG91dHB1dG5hbWUpIgorICAgICAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRvdXRwdXRuYW1lICYmICRMTl9TIC4uLyRvdXRwdXRuYW1lICRvdXRwdXRuYW1lKScgfHwgZXhpdCAkPworICAgICAgOzsKKyAgICBlc2FjCisgICAgZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgOzsKKworICAjIGxpYnRvb2wgaW5zdGFsbCBtb2RlCisgIGluc3RhbGwpCisgICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogaW5zdGFsbCIKKworICAgICMgVGhlcmUgbWF5IGJlIGFuIG9wdGlvbmFsIHNoKDEpIGFyZ3VtZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKKyAgICAjIGluc3RhbGxfcHJvZyAoZXNwZWNpYWxseSBvbiBXaW5kb3dzIE5UKS4KKyAgICBpZiB0ZXN0ICIkbm9ub3B0IiA9ICIkU0hFTEwiIHx8IHRlc3QgIiRub25vcHQiID0gL2Jpbi9zaCB8fAorICAgICAgICMgQWxsb3cgdGhlIHVzZSBvZiBHTlUgc2h0b29sJ3MgaW5zdGFsbCBjb21tYW5kLgorICAgICAgICRlY2hvICJYJG5vbm9wdCIgfCBncmVwIHNodG9vbCA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIGl0LgorICAgICAgYXJnPWAkZWNobyAiWCRub25vcHQiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgICAgY2FzZSAkYXJnIGluCisgICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKwlhcmc9IlwiJGFyZ1wiIgorCTs7CisgICAgICBlc2FjCisgICAgICBpbnN0YWxsX3Byb2c9IiRhcmcgIgorICAgICAgYXJnPSIkMSIKKyAgICAgIHNoaWZ0CisgICAgZWxzZQorICAgICAgaW5zdGFsbF9wcm9nPQorICAgICAgYXJnPSRub25vcHQKKyAgICBmaQorCisgICAgIyBUaGUgcmVhbCBmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIGluc3RhbGxhdGlvbiBwcm9ncmFtLgorICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KKyAgICBhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgY2FzZSAkYXJnIGluCisgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisgICAgICBhcmc9IlwiJGFyZ1wiIgorICAgICAgOzsKKyAgICBlc2FjCisgICAgaW5zdGFsbF9wcm9nPSIkaW5zdGFsbF9wcm9nJGFyZyIKKworICAgICMgV2UgbmVlZCB0byBhY2NlcHQgYXQgbGVhc3QgYWxsIHRoZSBCU0QgaW5zdGFsbCBmbGFncy4KKyAgICBkZXN0PQorICAgIGZpbGVzPQorICAgIG9wdHM9CisgICAgcHJldj0KKyAgICBpbnN0YWxsX3R5cGU9CisgICAgaXNkaXI9bm8KKyAgICBzdHJpcG1lPQorICAgIGZvciBhcmcKKyAgICBkbworICAgICAgaWYgdGVzdCAtbiAiJGRlc3QiOyB0aGVuCisJZmlsZXM9IiRmaWxlcyAkZGVzdCIKKwlkZXN0PSRhcmcKKwljb250aW51ZQorICAgICAgZmkKKworICAgICAgY2FzZSAkYXJnIGluCisgICAgICAtZCkgaXNkaXI9eWVzIDs7CisgICAgICAtZikgCisgICAgICAJY2FzZSAiICRpbnN0YWxsX3Byb2cgIiBpbgorCSpbXFxcIC9dY3BcICopIDs7CisJKikgcHJldj0kYXJnIDs7CisJZXNhYworCTs7CisgICAgICAtZyB8IC1tIHwgLW8pIHByZXY9JGFyZyA7OworICAgICAgLXMpCisJc3RyaXBtZT0iIC1zIgorCWNvbnRpbnVlCisJOzsKKyAgICAgIC0qKQorCTs7CisgICAgICAqKQorCSMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkZWQgYW4gYXJndW1lbnQsIHRoZW4gc2tpcCBpdC4KKwlpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KKwkgIHByZXY9CisJZWxzZQorCSAgZGVzdD0kYXJnCisJICBjb250aW51ZQorCWZpCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIHRoZSBhcmd1bWVudC4KKyAgICAgIGFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisJYXJnPSJcIiRhcmdcIiIKKwk7OworICAgICAgZXNhYworICAgICAgaW5zdGFsbF9wcm9nPSIkaW5zdGFsbF9wcm9nICRhcmciCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAteiAiJGluc3RhbGxfcHJvZyI7IHRoZW4KKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gaW5zdGFsbCBwcm9ncmFtIiAxPiYyCisgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHRoZSBcYCRwcmV2JyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiIDE+JjIKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgZmkKKworICAgIGlmIHRlc3QgLXogIiRmaWxlcyI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogIiRkZXN0IjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IG5vIGZpbGUgb3IgZGVzdGluYXRpb24gc3BlY2lmaWVkIiAxPiYyCisgICAgICBlbHNlCisJJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIGRlc3RpbmF0aW9uIiAxPiYyCisgICAgICBmaQorICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgICBmaQorCisgICAgIyBTdHJpcCBhbnkgdHJhaWxpbmcgc2xhc2ggZnJvbSB0aGUgZGVzdGluYXRpb24uCisgICAgZGVzdD1gJGVjaG8gIlgkZGVzdCIgfCAkWHNlZCAtZSAncyUvJCUlJ2AKKworICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LgorICAgIHRlc3QgLWQgIiRkZXN0IiAmJiBpc2Rpcj15ZXMKKyAgICBpZiB0ZXN0ICIkaXNkaXIiID0geWVzOyB0aGVuCisgICAgICBkZXN0ZGlyPSIkZGVzdCIKKyAgICAgIGRlc3RuYW1lPQorICAgIGVsc2UKKyAgICAgIGRlc3RkaXI9YCRlY2hvICJYJGRlc3QiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKKyAgICAgIHRlc3QgIlgkZGVzdGRpciIgPSAiWCRkZXN0IiAmJiBkZXN0ZGlyPS4KKyAgICAgIGRlc3RuYW1lPWAkZWNobyAiWCRkZXN0IiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisKKyAgICAgICMgTm90IGEgZGlyZWN0b3J5LCBzbyBjaGVjayB0byBzZWUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBmaWxlIHNwZWNpZmllZC4KKyAgICAgIHNldCBkdW1teSAkZmlsZXMKKyAgICAgIGlmIHRlc3QgIiQjIiAtZ3QgMjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IFxgJGRlc3QnIGlzIG5vdCBhIGRpcmVjdG9yeSIgMT4mMgorCSRlY2hvICIkaGVscCIgMT4mMgorCWV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgZmkKKyAgICBmaQorICAgIGNhc2UgJGRlc3RkaXIgaW4KKyAgICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7CisgICAgKikKKyAgICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KKwljYXNlICRmaWxlIGluCisJKi5sbykgOzsKKwkqKQorCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkZGVzdGRpcicgbXVzdCBiZSBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSIgMT4mMgorCSAgJGVjaG8gIiRoZWxwIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHZhcmlhYmxlcyByYXRoZXIKKyAgICAjIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KKyAgICBsaWJ0b29sX2luc3RhbGxfbWFnaWM9IiRtYWdpYyIKKworICAgIHN0YXRpY2xpYnM9CisgICAgZnV0dXJlX2xpYmRpcnM9CisgICAgY3VycmVudF9saWJkaXJzPQorICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KKworICAgICAgIyBEbyBlYWNoIGluc3RhbGxhdGlvbi4KKyAgICAgIGNhc2UgJGZpbGUgaW4KKyAgICAgICouJGxpYmV4dCkKKwkjIERvIHRoZSBzdGF0aWMgbGlicmFyaWVzIGxhdGVyLgorCXN0YXRpY2xpYnM9IiRzdGF0aWNsaWJzICRmaWxlIgorCTs7CisKKyAgICAgICoubGEpCisJIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KKwlpZiAoJHtTRUR9IC1lICcycScgJGZpbGUgfCBncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisJZWxzZQorCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkZmlsZScgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCisJICAkZWNobyAiJGhlbHAiIDE+JjIKKwkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCWZpCisKKwlsaWJyYXJ5X25hbWVzPQorCW9sZF9saWJyYXJ5PQorCXJlbGlua19jb21tYW5kPQorCSMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgorCWNhc2UgJGZpbGUgaW4KKwkqLyogfCAqXFwqKSAuICRmaWxlIDs7CisJKikgLiAuLyRmaWxlIDs7CisJZXNhYworCisJIyBBZGQgdGhlIGxpYmRpciB0byBjdXJyZW50X2xpYmRpcnMgaWYgaXQgaXMgdGhlIGRlc3RpbmF0aW9uLgorCWlmIHRlc3QgIlgkZGVzdGRpciIgPSAiWCRsaWJkaXIiOyB0aGVuCisJICBjYXNlICIkY3VycmVudF9saWJkaXJzICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBjdXJyZW50X2xpYmRpcnM9IiRjdXJyZW50X2xpYmRpcnMgJGxpYmRpciIgOzsKKwkgIGVzYWMKKwllbHNlCisJICAjIE5vdGUgdGhlIGxpYmRpciBhcyBhIGZ1dHVyZSBsaWJkaXIuCisJICBjYXNlICIkZnV0dXJlX2xpYmRpcnMgIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGZ1dHVyZV9saWJkaXJzPSIkZnV0dXJlX2xpYmRpcnMgJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlmaQorCisJZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgLworCXRlc3QgIlgkZGlyIiA9ICJYJGZpbGUvIiAmJiBkaXI9CisJZGlyPSIkZGlyJG9iamRpciIKKworCWlmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KKwkgICMgRGV0ZXJtaW5lIHRoZSBwcmVmaXggdGhlIHVzZXIgaGFzIGFwcGxpZWQgdG8gb3VyIGZ1dHVyZSBkaXIuCisJICBpbnN0X3ByZWZpeF9kaXI9YCRlY2hvICIkZGVzdGRpciIgfCAkU0VEICJzJSRsaWJkaXJcJCUlImAKKworCSAgIyBEb24ndCBhbGxvdyB0aGUgdXNlciB0byBwbGFjZSB1cyBvdXRzaWRlIG9mIG91ciBleHBlY3RlZAorCSAgIyBsb2NhdGlvbiBiL2MgdGhpcyBwcmV2ZW50cyBmaW5kaW5nIGRlcGVuZGVudCBsaWJyYXJpZXMgdGhhdAorCSAgIyBhcmUgaW5zdGFsbGVkIHRvIHRoZSBzYW1lIHByZWZpeC4KKwkgICMgQXQgcHJlc2VudCwgdGhpcyBjaGVjayBkb2Vzbid0IGFmZmVjdCB3aW5kb3dzIC5kbGwncyB0aGF0CisJICAjIGFyZSBpbnN0YWxsZWQgaW50byAkbGliZGlyLy4uL2JpbiAoY3VycmVudGx5LCB0aGF0IHdvcmtzIGZpbmUpCisJICAjIGJ1dCBpdCdzIHNvbWV0aGluZyB0byBrZWVwIGFuIGV5ZSBvbi4KKwkgIGlmIHRlc3QgIiRpbnN0X3ByZWZpeF9kaXIiID0gIiRkZXN0ZGlyIjsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiBlcnJvcjogY2Fubm90IGluc3RhbGwgXGAkZmlsZScgdG8gYSBkaXJlY3Rvcnkgbm90IGVuZGluZyBpbiAkbGliZGlyIiAxPiYyCisJICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgZmkKKworCSAgaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciI7IHRoZW4KKwkgICAgIyBTdGljayB0aGUgaW5zdF9wcmVmaXhfZGlyIGRhdGEgaW50byB0aGUgbGluayBjb21tYW5kLgorCSAgICByZWxpbmtfY29tbWFuZD1gJGVjaG8gIiRyZWxpbmtfY29tbWFuZCIgfCAkU0VEICJzJUBpbnN0X3ByZWZpeF9kaXJAJS1pbnN0LXByZWZpeC1kaXIgJGluc3RfcHJlZml4X2RpciUiYAorCSAgZWxzZQorCSAgICByZWxpbmtfY29tbWFuZD1gJGVjaG8gIiRyZWxpbmtfY29tbWFuZCIgfCAkU0VEICJzJUBpbnN0X3ByZWZpeF9kaXJAJSUiYAorCSAgZmkKKworCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogcmVsaW5raW5nIFxgJGZpbGUnIiAxPiYyCisJICAkc2hvdyAiJHJlbGlua19jb21tYW5kIgorCSAgaWYgJHJ1biBldmFsICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuIDoKKwkgIGVsc2UKKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogZXJyb3I6IHJlbGluayBcYCRmaWxlJyB3aXRoIHRoZSBhYm92ZSBjb21tYW5kIGJlZm9yZSBpbnN0YWxsaW5nIGl0IiAxPiYyCisJICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgZmkKKwlmaQorCisJIyBTZWUgdGhlIG5hbWVzIG9mIHRoZSBzaGFyZWQgbGlicmFyeS4KKwlzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKKwlpZiB0ZXN0IC1uICIkMiI7IHRoZW4KKwkgIHJlYWxuYW1lPSIkMiIKKwkgIHNoaWZ0CisJICBzaGlmdAorCisJICBzcmNuYW1lPSIkcmVhbG5hbWUiCisJICB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiICYmIHNyY25hbWU9IiRyZWFsbmFtZSJUCisKKwkgICMgSW5zdGFsbCB0aGUgc2hhcmVkIGxpYnJhcnkgYW5kIGJ1aWxkIHRoZSBzeW1saW5rcy4KKwkgICRzaG93ICIkaW5zdGFsbF9wcm9nICRkaXIvJHNyY25hbWUgJGRlc3RkaXIvJHJlYWxuYW1lIgorCSAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRkaXIvJHNyY25hbWUgJGRlc3RkaXIvJHJlYWxuYW1lIiB8fCBleGl0ICQ/CisJICBpZiB0ZXN0IC1uICIkc3RyaXBtZSIgJiYgdGVzdCAtbiAiJHN0cmlwbGliIjsgdGhlbgorCSAgICAkc2hvdyAiJHN0cmlwbGliICRkZXN0ZGlyLyRyZWFsbmFtZSIKKwkgICAgJHJ1biBldmFsICIkc3RyaXBsaWIgJGRlc3RkaXIvJHJlYWxuYW1lIiB8fCBleGl0ICQ/CisJICBmaQorCisJICBpZiB0ZXN0ICIkIyIgLWd0IDA7IHRoZW4KKwkgICAgIyBEZWxldGUgdGhlIG9sZCBzeW1saW5rcywgYW5kIGNyZWF0ZSBuZXcgb25lcy4KKwkgICAgIyBUcnkgYGxuIC1zZicgZmlyc3QsIGJlY2F1c2UgdGhlIGBsbicgYmluYXJ5IG1pZ2h0IGRlcGVuZCBvbgorCSAgICAjIHRoZSBzeW1saW5rIHdlIHJlcGxhY2UhICBTb2xhcmlzIC9iaW4vbG4gZG9lcyBub3QgdW5kZXJzdGFuZCAtZiwKKwkgICAgIyBzbyB3ZSBhbHNvIG5lZWQgdG8gdHJ5IHJtICYmIGxuIC1zLgorCSAgICBmb3IgbGlua25hbWUKKwkgICAgZG8KKwkgICAgICBpZiB0ZXN0ICIkbGlua25hbWUiICE9ICIkcmVhbG5hbWUiOyB0aGVuCisgICAgICAgICAgICAgICAgJHNob3cgIihjZCAkZGVzdGRpciAmJiB7ICRMTl9TIC1mICRyZWFsbmFtZSAkbGlua25hbWUgfHwgeyAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWU7IH07IH0pIgorICAgICAgICAgICAgICAgICRydW4gZXZhbCAiKGNkICRkZXN0ZGlyICYmIHsgJExOX1MgLWYgJHJlYWxuYW1lICRsaW5rbmFtZSB8fCB7ICRybSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZTsgfTsgfSkiCisJICAgICAgZmkKKwkgICAgZG9uZQorCSAgZmkKKworCSAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3RpbnN0YWxsIGNvbW1hbmRzLgorCSAgbGliPSIkZGVzdGRpci8kcmVhbG5hbWUiCisJICBjbWRzPSRwb3N0aW5zdGFsbF9jbWRzCisJICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwkgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisJICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICBldmFsIGNtZD1cIiRjbWRcIgorCSAgICAkc2hvdyAiJGNtZCIKKwkgICAgJHJ1biBldmFsICIkY21kIiB8fCB7CisJICAgICAgbHRfZXhpdD0kPworCisJICAgICAgIyBSZXN0b3JlIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IGFuZCBleGl0CisJICAgICAgaWYgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB0aGVuCisJCSRydW4gZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAke3JlYWxuYW1lfVQgJiYgJG12ICR7cmVhbG5hbWV9VSAkcmVhbG5hbWUpJworCSAgICAgIGZpCisKKwkgICAgICBleGl0ICRsdF9leGl0CisJICAgIH0KKwkgIGRvbmUKKwkgIElGUz0iJHNhdmVfaWZzIgorCWZpCisKKwkjIEluc3RhbGwgdGhlIHBzZXVkby1saWJyYXJ5IGZvciBpbmZvcm1hdGlvbiBwdXJwb3Nlcy4KKwluYW1lPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisJaW5zdG5hbWU9IiRkaXIvJG5hbWUiaQorCSRzaG93ICIkaW5zdGFsbF9wcm9nICRpbnN0bmFtZSAkZGVzdGRpci8kbmFtZSIKKwkkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGluc3RuYW1lICRkZXN0ZGlyLyRuYW1lIiB8fCBleGl0ICQ/CisKKwkjIE1heWJlIGluc3RhbGwgdGhlIHN0YXRpYyBsaWJyYXJ5LCB0b28uCisJdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBzdGF0aWNsaWJzPSIkc3RhdGljbGlicyAkZGlyLyRvbGRfbGlicmFyeSIKKwk7OworCisgICAgICAqLmxvKQorCSMgSW5zdGFsbCAoaS5lLiBjb3B5KSBhIGxpYnRvb2wgb2JqZWN0LgorCisJIyBGaWd1cmUgb3V0IGRlc3RpbmF0aW9uIGZpbGUgbmFtZSwgaWYgaXQgd2Fzbid0IGFscmVhZHkgc3BlY2lmaWVkLgorCWlmIHRlc3QgLW4gIiRkZXN0bmFtZSI7IHRoZW4KKwkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdG5hbWUiCisJZWxzZQorCSAgZGVzdGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKwkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdGZpbGUiCisJZmkKKworCSMgRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBkZXN0aW5hdGlvbiBvbGQtc3R5bGUgb2JqZWN0IGZpbGUuCisJY2FzZSAkZGVzdGZpbGUgaW4KKwkqLmxvKQorCSAgc3RhdGljZGVzdD1gJGVjaG8gIlgkZGVzdGZpbGUiIHwgJFhzZWQgLWUgIiRsbzJvImAKKwkgIDs7CisJKi4kb2JqZXh0KQorCSAgc3RhdGljZGVzdD0iJGRlc3RmaWxlIgorCSAgZGVzdGZpbGU9CisJICA7OworCSopCisJICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgY29weSBhIGxpYnRvb2wgb2JqZWN0IHRvIFxgJGRlc3RmaWxlJyIgMT4mMgorCSAgJGVjaG8gIiRoZWxwIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgIDs7CisJZXNhYworCisJIyBJbnN0YWxsIHRoZSBsaWJ0b29sIG9iamVjdCBpZiByZXF1ZXN0ZWQuCisJaWYgdGVzdCAtbiAiJGRlc3RmaWxlIjsgdGhlbgorCSAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJGRlc3RmaWxlIgorCSAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRmaWxlICRkZXN0ZmlsZSIgfHwgZXhpdCAkPworCWZpCisKKwkjIEluc3RhbGwgdGhlIG9sZCBvYmplY3QgaWYgZW5hYmxlZC4KKwlpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisJICAjIERlZHVjZSB0aGUgbmFtZSBvZiB0aGUgb2xkLXN0eWxlIG9iamVjdCBmaWxlLgorCSAgc3RhdGljb2JqPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICIkbG8ybyJgCisKKwkgICRzaG93ICIkaW5zdGFsbF9wcm9nICRzdGF0aWNvYmogJHN0YXRpY2Rlc3QiCisJICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgXCRzdGF0aWNvYmogXCRzdGF0aWNkZXN0IiB8fCBleGl0ICQ/CisJZmkKKwlleGl0ICRFWElUX1NVQ0NFU1MKKwk7OworCisgICAgICAqKQorCSMgRmlndXJlIG91dCBkZXN0aW5hdGlvbiBmaWxlIG5hbWUsIGlmIGl0IHdhc24ndCBhbHJlYWR5IHNwZWNpZmllZC4KKwlpZiB0ZXN0IC1uICIkZGVzdG5hbWUiOyB0aGVuCisJICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RuYW1lIgorCWVsc2UKKwkgIGRlc3RmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisJICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RmaWxlIgorCWZpCisKKwkjIElmIHRoZSBmaWxlIGlzIG1pc3NpbmcsIGFuZCB0aGVyZSBpcyBhIC5leGUgb24gdGhlIGVuZCwgc3RyaXAgaXQKKwkjIGJlY2F1c2UgaXQgaXMgbW9zdCBsaWtlbHkgYSBsaWJ0b29sIHNjcmlwdCB3ZSBhY3R1YWxseSB3YW50IHRvCisJIyBpbnN0YWxsCisJc3RyaXBwZWRfZXh0PSIiCisJY2FzZSAkZmlsZSBpbgorCSAgKi5leGUpCisJICAgIGlmIHRlc3QgISAtZiAiJGZpbGUiOyB0aGVuCisJICAgICAgZmlsZT1gJGVjaG8gJGZpbGV8JHtTRUR9ICdzLC5leGUkLCwnYAorCSAgICAgIHN0cmlwcGVkX2V4dD0iLmV4ZSIKKwkgICAgZmkKKwkgICAgOzsKKwllc2FjCisKKwkjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyByZWFsbHkgYSBsaWJ0b29sIHByb2dyYW0uCisJY2FzZSAkaG9zdCBpbgorCSpjeWd3aW4qfCptaW5ndyopCisJICAgIHdyYXBwZXI9YCRlY2hvICRmaWxlIHwgJHtTRUR9IC1lICdzLC5leGUkLCwnYAorCSAgICA7OworCSopCisJICAgIHdyYXBwZXI9JGZpbGUKKwkgICAgOzsKKwllc2FjCisJaWYgKCR7U0VEfSAtZSAnNHEnICR3cmFwcGVyIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKT4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgbm90aW5zdF9kZXBsaWJzPQorCSAgcmVsaW5rX2NvbW1hbmQ9CisKKwkgICMgTm90ZSB0aGF0IGl0IGlzIG5vdCBuZWNlc3Nhcnkgb24gY3lnd2luL21pbmd3IHRvIGFwcGVuZCBhIGRvdCB0bworCSAgIyBmb28gZXZlbiBpZiBib3RoIGZvbyBhbmQgRklMRS5leGUgZXhpc3Q6IGF1dG9tYXRpYy1hcHBlbmQtLmV4ZQorCSAgIyBiZWhhdmlvciBoYXBwZW5zIG9ubHkgZm9yIGV4ZWMoMyksIG5vdCBmb3Igb3BlbigyKSEgIEFsc28sIHNvdXJjaW5nCisJICAjIGBGSUxFLicgZG9lcyBub3Qgd29yayBvbiBjeWd3aW4gbWFuYWdlZCBtb3VudHMuCisJICAjCisJICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KKwkgIGNhc2UgJHdyYXBwZXIgaW4KKwkgICovKiB8ICpcXCopIC4gJHt3cmFwcGVyfSA7OworCSAgKikgLiAuLyR7d3JhcHBlcn0gOzsKKwkgIGVzYWMKKworCSAgIyBDaGVjayB0aGUgdmFyaWFibGVzIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBzZXQuCisJICBpZiB0ZXN0IC16ICIkbm90aW5zdF9kZXBsaWJzIjsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiBpbnZhbGlkIGxpYnRvb2wgd3JhcHBlciBzY3JpcHQgXGAkd3JhcHBlciciIDE+JjIKKwkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICBmaQorCisJICBmaW5hbGl6ZT15ZXMKKwkgIGZvciBsaWIgaW4gJG5vdGluc3RfZGVwbGliczsgZG8KKwkgICAgIyBDaGVjayB0byBzZWUgdGhhdCBlYWNoIGxpYnJhcnkgaXMgaW5zdGFsbGVkLgorCSAgICBsaWJkaXI9CisJICAgIGlmIHRlc3QgLWYgIiRsaWIiOyB0aGVuCisJICAgICAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCisJICAgICAgY2FzZSAkbGliIGluCisJICAgICAgKi8qIHwgKlxcKikgLiAkbGliIDs7CisJICAgICAgKikgLiAuLyRsaWIgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICAgIGxpYmZpbGU9IiRsaWJkaXIvImAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlZydgICMjIyB0ZXN0c3VpdGU6IHNraXAgbmVzdGVkIHF1b3RpbmcgdGVzdAorCSAgICBpZiB0ZXN0IC1uICIkbGliZGlyIiAmJiB0ZXN0ICEgLWYgIiRsaWJmaWxlIjsgdGhlbgorCSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgJGxpYicgaGFzIG5vdCBiZWVuIGluc3RhbGxlZCBpbiBcYCRsaWJkaXInIiAxPiYyCisJICAgICAgZmluYWxpemU9bm8KKwkgICAgZmkKKwkgIGRvbmUKKworCSAgcmVsaW5rX2NvbW1hbmQ9CisJICAjIE5vdGUgdGhhdCBpdCBpcyBub3QgbmVjZXNzYXJ5IG9uIGN5Z3dpbi9taW5ndyB0byBhcHBlbmQgYSBkb3QgdG8KKwkgICMgZm9vIGV2ZW4gaWYgYm90aCBmb28gYW5kIEZJTEUuZXhlIGV4aXN0OiBhdXRvbWF0aWMtYXBwZW5kLS5leGUKKwkgICMgYmVoYXZpb3IgaGFwcGVucyBvbmx5IGZvciBleGVjKDMpLCBub3QgZm9yIG9wZW4oMikhICBBbHNvLCBzb3VyY2luZworCSAgIyBgRklMRS4nIGRvZXMgbm90IHdvcmsgb24gY3lnd2luIG1hbmFnZWQgbW91bnRzLgorCSAgIworCSAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCisJICBjYXNlICR3cmFwcGVyIGluCisJICAqLyogfCAqXFwqKSAuICR7d3JhcHBlcn0gOzsKKwkgICopIC4gLi8ke3dyYXBwZXJ9IDs7CisJICBlc2FjCisKKwkgIG91dHB1dG5hbWU9CisJICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IG5vICYmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KKwkgICAgaWYgdGVzdCAiJGZpbmFsaXplIiA9IHllcyAmJiB0ZXN0IC16ICIkcnVuIjsgdGhlbgorCSAgICAgIHRtcGRpcj1gZnVuY19ta3RlbXBkaXJgCisJICAgICAgZmlsZT1gJGVjaG8gIlgkZmlsZSRzdHJpcHBlZF9leHQiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKwkgICAgICBvdXRwdXRuYW1lPSIkdG1wZGlyLyRmaWxlIgorCSAgICAgICMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKwkgICAgICByZWxpbmtfY29tbWFuZD1gJGVjaG8gIlgkcmVsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0bmFtZSInJWcnYAorCisJICAgICAgJHNob3cgIiRyZWxpbmtfY29tbWFuZCIKKwkgICAgICBpZiAkcnVuIGV2YWwgIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4gOgorCSAgICAgIGVsc2UKKwkJJGVjaG8gIiRtb2RlbmFtZTogZXJyb3I6IHJlbGluayBcYCRmaWxlJyB3aXRoIHRoZSBhYm92ZSBjb21tYW5kIGJlZm9yZSBpbnN0YWxsaW5nIGl0IiAxPiYyCisJCSR7cm19ciAiJHRtcGRpciIKKwkJY29udGludWUKKwkgICAgICBmaQorCSAgICAgIGZpbGU9IiRvdXRwdXRuYW1lIgorCSAgICBlbHNlCisJICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IHJlbGluayBcYCRmaWxlJyIgMT4mMgorCSAgICBmaQorCSAgZWxzZQorCSAgICAjIEluc3RhbGwgdGhlIGJpbmFyeSB0aGF0IHdlIGNvbXBpbGVkIGVhcmxpZXIuCisJICAgIGZpbGU9YCRlY2hvICJYJGZpbGUkc3RyaXBwZWRfZXh0IiB8ICRYc2VkIC1lICJzJVwoW14vXSpcKSQlJG9iamRpci9cMSUiYAorCSAgZmkKKwlmaQorCisJIyByZW1vdmUgLmV4ZSBzaW5jZSBjeWd3aW4gL3Vzci9iaW4vaW5zdGFsbCB3aWxsIGFwcGVuZCBhbm90aGVyCisJIyBvbmUgYW55d2F5IAorCWNhc2UgJGluc3RhbGxfcHJvZywkaG9zdCBpbgorCSovdXNyL2Jpbi9pbnN0YWxsKiwqY3lnd2luKikKKwkgIGNhc2UgJGZpbGU6JGRlc3RmaWxlIGluCisJICAqLmV4ZToqLmV4ZSkKKwkgICAgIyB0aGlzIGlzIG9rCisJICAgIDs7CisJICAqLmV4ZToqKQorCSAgICBkZXN0ZmlsZT0kZGVzdGZpbGUuZXhlCisJICAgIDs7CisJICAqOiouZXhlKQorCSAgICBkZXN0ZmlsZT1gJGVjaG8gJGRlc3RmaWxlIHwgJHtTRUR9IC1lICdzLC5leGUkLCwnYAorCSAgICA7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisJJHNob3cgIiRpbnN0YWxsX3Byb2ckc3RyaXBtZSAkZmlsZSAkZGVzdGZpbGUiCisJJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nXCRzdHJpcG1lIFwkZmlsZSBcJGRlc3RmaWxlIiB8fCBleGl0ICQ/CisJdGVzdCAtbiAiJG91dHB1dG5hbWUiICYmICR7cm19ciAiJHRtcGRpciIKKwk7OworICAgICAgZXNhYworICAgIGRvbmUKKworICAgIGZvciBmaWxlIGluICRzdGF0aWNsaWJzOyBkbworICAgICAgbmFtZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCisgICAgICAjIFNldCB1cCB0aGUgcmFubGliIHBhcmFtZXRlcnMuCisgICAgICBvbGRsaWI9IiRkZXN0ZGlyLyRuYW1lIgorCisgICAgICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZmlsZSAkb2xkbGliIgorICAgICAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nIFwkZmlsZSBcJG9sZGxpYiIgfHwgZXhpdCAkPworCisgICAgICBpZiB0ZXN0IC1uICIkc3RyaXBtZSIgJiYgdGVzdCAtbiAiJG9sZF9zdHJpcGxpYiI7IHRoZW4KKwkkc2hvdyAiJG9sZF9zdHJpcGxpYiAkb2xkbGliIgorCSRydW4gZXZhbCAiJG9sZF9zdHJpcGxpYiAkb2xkbGliIiB8fCBleGl0ICQ/CisgICAgICBmaQorCisgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdGluc3RhbGwgY29tbWFuZHMuCisgICAgICBjbWRzPSRvbGRfcG9zdGluc3RhbGxfY21kcworICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisgICAgICBmb3IgY21kIGluICRjbWRzOyBkbworCUlGUz0iJHNhdmVfaWZzIgorCWV2YWwgY21kPVwiJGNtZFwiCisJJHNob3cgIiRjbWQiCisJJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/CisgICAgICBkb25lCisgICAgICBJRlM9IiRzYXZlX2lmcyIKKyAgICBkb25lCisKKyAgICBpZiB0ZXN0IC1uICIkZnV0dXJlX2xpYmRpcnMiOyB0aGVuCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiByZW1lbWJlciB0byBydW4gXGAkcHJvZ25hbWUgLS1maW5pc2gkZnV0dXJlX2xpYmRpcnMnIiAxPiYyCisgICAgZmkKKworICAgIGlmIHRlc3QgLW4gIiRjdXJyZW50X2xpYmRpcnMiOyB0aGVuCisgICAgICAjIE1heWJlIGp1c3QgZG8gYSBkcnkgcnVuLgorICAgICAgdGVzdCAtbiAiJHJ1biIgJiYgY3VycmVudF9saWJkaXJzPSIgLW4kY3VycmVudF9saWJkaXJzIgorICAgICAgZXhlY19jbWQ9JyRTSEVMTCAkcHJvZ3BhdGggJHByZXNlcnZlX2FyZ3MgLS1maW5pc2gkY3VycmVudF9saWJkaXJzJworICAgIGVsc2UKKyAgICAgIGV4aXQgJEVYSVRfU1VDQ0VTUworICAgIGZpCisgICAgOzsKKworICAjIGxpYnRvb2wgZmluaXNoIG1vZGUKKyAgZmluaXNoKQorICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGZpbmlzaCIKKyAgICBsaWJkaXJzPSIkbm9ub3B0IgorICAgIGFkbWluY21kcz0KKworICAgIGlmIHRlc3QgLW4gIiRmaW5pc2hfY21kcyRmaW5pc2hfZXZhbCIgJiYgdGVzdCAtbiAiJGxpYmRpcnMiOyB0aGVuCisgICAgICBmb3IgZGlyCisgICAgICBkbworCWxpYmRpcnM9IiRsaWJkaXJzICRkaXIiCisgICAgICBkb25lCisKKyAgICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCisJaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzIjsgdGhlbgorCSAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIGZpbmlzaCBjb21tYW5kcy4KKwkgIGNtZHM9JGZpbmlzaF9jbWRzCisJICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwkgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisJICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICBldmFsIGNtZD1cIiRjbWRcIgorCSAgICAkc2hvdyAiJGNtZCIKKwkgICAgJHJ1biBldmFsICIkY21kIiB8fCBhZG1pbmNtZHM9IiRhZG1pbmNtZHMKKyAgICAgICAkY21kIgorCSAgZG9uZQorCSAgSUZTPSIkc2F2ZV9pZnMiCisJZmkKKwlpZiB0ZXN0IC1uICIkZmluaXNoX2V2YWwiOyB0aGVuCisJICAjIERvIHRoZSBzaW5nbGUgZmluaXNoX2V2YWwuCisJICBldmFsIGNtZHM9XCIkZmluaXNoX2V2YWxcIgorCSAgJHJ1biBldmFsICIkY21kcyIgfHwgYWRtaW5jbWRzPSIkYWRtaW5jbWRzCisgICAgICAgJGNtZHMiCisJZmkKKyAgICAgIGRvbmUKKyAgICBmaQorCisgICAgIyBFeGl0IGhlcmUgaWYgdGhleSB3YW50ZWQgc2lsZW50IG1vZGUuCisgICAgdGVzdCAiJHNob3ciID0gOiAmJiBleGl0ICRFWElUX1NVQ0NFU1MKKworICAgICRlY2hvICJYLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgfCAkWHNlZAorICAgICRlY2hvICJMaWJyYXJpZXMgaGF2ZSBiZWVuIGluc3RhbGxlZCBpbjoiCisgICAgZm9yIGxpYmRpciBpbiAkbGliZGlyczsgZG8KKyAgICAgICRlY2hvICIgICAkbGliZGlyIgorICAgIGRvbmUKKyAgICAkZWNobworICAgICRlY2hvICJJZiB5b3UgZXZlciBoYXBwZW4gdG8gd2FudCB0byBsaW5rIGFnYWluc3QgaW5zdGFsbGVkIGxpYnJhcmllcyIKKyAgICAkZWNobyAiaW4gYSBnaXZlbiBkaXJlY3RvcnksIExJQkRJUiwgeW91IG11c3QgZWl0aGVyIHVzZSBsaWJ0b29sLCBhbmQiCisgICAgJGVjaG8gInNwZWNpZnkgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGxpYnJhcnksIG9yIHVzZSB0aGUgXGAtTExJQkRJUiciCisgICAgJGVjaG8gImZsYWcgZHVyaW5nIGxpbmtpbmcgYW5kIGRvIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nOiIKKyAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKyAgICAgICRlY2hvICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHNobGlicGF0aF92YXInIGVudmlyb25tZW50IHZhcmlhYmxlIgorICAgICAgJGVjaG8gIiAgICAgZHVyaW5nIGV4ZWN1dGlvbiIKKyAgICBmaQorICAgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKyAgICAgICRlY2hvICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHJ1bnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKKyAgICAgICRlY2hvICIgICAgIGR1cmluZyBsaW5raW5nIgorICAgIGZpCisgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCisgICAgICBsaWJkaXI9TElCRElSCisgICAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisKKyAgICAgICRlY2hvICIgICAtIHVzZSB0aGUgXGAkZmxhZycgbGlua2VyIGZsYWciCisgICAgZmkKKyAgICBpZiB0ZXN0IC1uICIkYWRtaW5jbWRzIjsgdGhlbgorICAgICAgJGVjaG8gIiAgIC0gaGF2ZSB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIHJ1biB0aGVzZSBjb21tYW5kczokYWRtaW5jbWRzIgorICAgIGZpCisgICAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KKyAgICAgICRlY2hvICIgICAtIGhhdmUgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciBhZGQgTElCRElSIHRvIFxgL2V0Yy9sZC5zby5jb25mJyIKKyAgICBmaQorICAgICRlY2hvCisgICAgJGVjaG8gIlNlZSBhbnkgb3BlcmF0aW5nIHN5c3RlbSBkb2N1bWVudGF0aW9uIGFib3V0IHNoYXJlZCBsaWJyYXJpZXMgZm9yIgorICAgICRlY2hvICJtb3JlIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSBsZCgxKSBhbmQgbGQuc28oOCkgbWFudWFsIHBhZ2VzLiIKKyAgICAkZWNobyAiWC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIHwgJFhzZWQKKyAgICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgICA7OworCisgICMgbGlidG9vbCBleGVjdXRlIG1vZGUKKyAgZXhlY3V0ZSkKKyAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBleGVjdXRlIgorCisgICAgIyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIGNvbW1hbmQgbmFtZS4KKyAgICBjbWQ9IiRub25vcHQiCisgICAgaWYgdGVzdCAteiAiJGNtZCI7IHRoZW4KKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBDT01NQU5EIiAxPiYyCisgICAgICAkZWNobyAiJGhlbHAiCisgICAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgICBmaQorCisgICAgIyBIYW5kbGUgLWRsb3BlbiBmbGFncyBpbW1lZGlhdGVseS4KKyAgICBmb3IgZmlsZSBpbiAkZXhlY3V0ZV9kbGZpbGVzOyBkbworICAgICAgaWYgdGVzdCAhIC1mICIkZmlsZSI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiBcYCRmaWxlJyBpcyBub3QgYSBmaWxlIiAxPiYyCisJJGVjaG8gIiRoZWxwIiAxPiYyCisJZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgICBmaQorCisgICAgICBkaXI9CisgICAgICBjYXNlICRmaWxlIGluCisgICAgICAqLmxhKQorCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCisJaWYgKCR7U0VEfSAtZSAnMnEnICRmaWxlIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorCWVsc2UKKwkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCisJICAkZWNobyAiJGhlbHAiIDE+JjIKKwkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCWZpCisKKwkjIFJlYWQgdGhlIGxpYnRvb2wgbGlicmFyeS4KKwlkbG5hbWU9CisJbGlicmFyeV9uYW1lcz0KKworCSMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgorCWNhc2UgJGZpbGUgaW4KKwkqLyogfCAqXFwqKSAuICRmaWxlIDs7CisJKikgLiAuLyRmaWxlIDs7CisJZXNhYworCisJIyBTa2lwIHRoaXMgbGlicmFyeSBpZiBpdCBjYW5ub3QgYmUgZGxvcGVuZWQuCisJaWYgdGVzdCAteiAiJGRsbmFtZSI7IHRoZW4KKwkgICMgV2FybiBpZiBpdCB3YXMgYSBzaGFyZWQgbGlicmFyeS4KKwkgIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIiAmJiAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYCRmaWxlJyB3YXMgbm90IGxpbmtlZCB3aXRoIFxgLWV4cG9ydC1keW5hbWljJyIKKwkgIGNvbnRpbnVlCisJZmkKKworCWRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorCXRlc3QgIlgkZGlyIiA9ICJYJGZpbGUiICYmIGRpcj0uCisKKwlpZiB0ZXN0IC1mICIkZGlyLyRvYmpkaXIvJGRsbmFtZSI7IHRoZW4KKwkgIGRpcj0iJGRpci8kb2JqZGlyIgorCWVsc2UKKwkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIFxgJGRsbmFtZScgaW4gXGAkZGlyJyBvciBcYCRkaXIvJG9iamRpciciIDE+JjIKKwkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCWZpCisJOzsKKworICAgICAgKi5sbykKKwkjIEp1c3QgYWRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgLmxvIGZpbGUuCisJZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisJdGVzdCAiWCRkaXIiID0gIlgkZmlsZSIgJiYgZGlyPS4KKwk7OworCisgICAgICAqKQorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmcgXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBub24tbGlidG9vbCBsaWJyYXJpZXMgYW5kIG9iamVjdHMiIDE+JjIKKwljb250aW51ZQorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgR2V0IHRoZSBhYnNvbHV0ZSBwYXRobmFtZS4KKyAgICAgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKKyAgICAgIHRlc3QgLW4gIiRhYnNkaXIiICYmIGRpcj0iJGFic2RpciIKKworICAgICAgIyBOb3cgYWRkIHRoZSBkaXJlY3RvcnkgdG8gc2hsaWJwYXRoX3Zhci4KKyAgICAgIGlmIGV2YWwgInRlc3QgLXogXCJcJCRzaGxpYnBhdGhfdmFyXCIiOyB0aGVuCisJZXZhbCAiJHNobGlicGF0aF92YXI9XCJcJGRpclwiIgorICAgICAgZWxzZQorCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXI6XCQkc2hsaWJwYXRoX3ZhclwiIgorICAgICAgZmkKKyAgICBkb25lCisKKyAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHNobGlicGF0aF92YXIKKyAgICAjIHJhdGhlciB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCisgICAgbGlidG9vbF9leGVjdXRlX21hZ2ljPSIkbWFnaWMiCisKKyAgICAjIENoZWNrIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIGEgd3JhcHBlciBzY3JpcHQuCisgICAgYXJncz0KKyAgICBmb3IgZmlsZQorICAgIGRvCisgICAgICBjYXNlICRmaWxlIGluCisgICAgICAtKikgOzsKKyAgICAgICopCisJIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgorCWlmICgke1NFRH0gLWUgJzRxJyAkZmlsZSB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KKwkgIGNhc2UgJGZpbGUgaW4KKwkgICovKiB8ICpcXCopIC4gJGZpbGUgOzsKKwkgICopIC4gLi8kZmlsZSA7OworCSAgZXNhYworCisJICAjIFRyYW5zZm9ybSBhcmcgdG8gd3JhcHBlZCBuYW1lLgorCSAgZmlsZT0iJHByb2dkaXIvJHByb2dyYW0iCisJZmkKKwk7OworICAgICAgZXNhYworICAgICAgIyBRdW90ZSBhcmd1bWVudHMgKHRvIHByZXNlcnZlIHNoZWxsIG1ldGFjaGFyYWN0ZXJzKS4KKyAgICAgIGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgICAgYXJncz0iJGFyZ3MgXCIkZmlsZVwiIgorICAgIGRvbmUKKworICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCisgICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKwkjIEV4cG9ydCB0aGUgc2hsaWJwYXRoX3Zhci4KKwlldmFsICJleHBvcnQgJHNobGlicGF0aF92YXIiCisgICAgICBmaQorCisgICAgICAjIFJlc3RvcmUgc2F2ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgICAgICBpZiB0ZXN0ICIke3NhdmVfTENfQUxMK3NldH0iID0gc2V0OyB0aGVuCisJTENfQUxMPSIkc2F2ZV9MQ19BTEwiOyBleHBvcnQgTENfQUxMCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHtzYXZlX0xBTkcrc2V0fSIgPSBzZXQ7IHRoZW4KKwlMQU5HPSIkc2F2ZV9MQU5HIjsgZXhwb3J0IExBTkcKKyAgICAgIGZpCisKKyAgICAgICMgTm93IHByZXBhcmUgdG8gYWN0dWFsbHkgZXhlYyB0aGUgY29tbWFuZC4KKyAgICAgIGV4ZWNfY21kPSJcJGNtZCRhcmdzIgorICAgIGVsc2UKKyAgICAgICMgRGlzcGxheSB3aGF0IHdvdWxkIGJlIGRvbmUuCisgICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKwlldmFsICJcJGVjaG8gXCJcJHNobGlicGF0aF92YXI9XCQkc2hsaWJwYXRoX3ZhclwiIgorCSRlY2hvICJleHBvcnQgJHNobGlicGF0aF92YXIiCisgICAgICBmaQorICAgICAgJGVjaG8gIiRjbWQkYXJncyIKKyAgICAgIGV4aXQgJEVYSVRfU1VDQ0VTUworICAgIGZpCisgICAgOzsKKworICAjIGxpYnRvb2wgY2xlYW4gYW5kIHVuaW5zdGFsbCBtb2RlCisgIGNsZWFuIHwgdW5pbnN0YWxsKQorICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6ICRtb2RlIgorICAgIHJtPSIkbm9ub3B0IgorICAgIGZpbGVzPQorICAgIHJtZm9yY2U9CisgICAgZXhpdF9zdGF0dXM9MAorCisgICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCB2YXJpYWJsZXMgcmF0aGVyCisgICAgIyB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCisgICAgbGlidG9vbF9pbnN0YWxsX21hZ2ljPSIkbWFnaWMiCisKKyAgICBmb3IgYXJnCisgICAgZG8KKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgLWYpIHJtPSIkcm0gJGFyZyI7IHJtZm9yY2U9eWVzIDs7CisgICAgICAtKikgcm09IiRybSAkYXJnIiA7OworICAgICAgKikgZmlsZXM9IiRmaWxlcyAkYXJnIiA7OworICAgICAgZXNhYworICAgIGRvbmUKKworICAgIGlmIHRlc3QgLXogIiRybSI7IHRoZW4KKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gUk0gcHJvZ3JhbSIgMT4mMgorICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgICBmaQorCisgICAgcm1kaXJzPQorCisgICAgb3JpZ29iamRpcj0iJG9iamRpciIKKyAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCisgICAgICBkaXI9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKKyAgICAgIGlmIHRlc3QgIlgkZGlyIiA9ICJYJGZpbGUiOyB0aGVuCisJZGlyPS4KKwlvYmpkaXI9IiRvcmlnb2JqZGlyIgorICAgICAgZWxzZQorCW9iamRpcj0iJGRpci8kb3JpZ29iamRpciIKKyAgICAgIGZpCisgICAgICBuYW1lPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisgICAgICB0ZXN0ICIkbW9kZSIgPSB1bmluc3RhbGwgJiYgb2JqZGlyPSIkZGlyIgorCisgICAgICAjIFJlbWVtYmVyIG9iamRpciBmb3IgcmVtb3ZhbCBsYXRlciwgYmVpbmcgY2FyZWZ1bCB0byBhdm9pZCBkdXBsaWNhdGVzCisgICAgICBpZiB0ZXN0ICIkbW9kZSIgPSBjbGVhbjsgdGhlbgorCWNhc2UgIiAkcm1kaXJzICIgaW4KKwkgICoiICRvYmpkaXIgIiopIDs7CisJICAqKSBybWRpcnM9IiRybWRpcnMgJG9iamRpciIgOzsKKwllc2FjCisgICAgICBmaQorCisgICAgICAjIERvbid0IGVycm9yIGlmIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QgYW5kIHJtIC1mIHdhcyB1c2VkLgorICAgICAgaWYgKHRlc3QgLUwgIiRmaWxlIikgPi9kZXYvbnVsbCAyPiYxIFwKKwl8fCAodGVzdCAtaCAiJGZpbGUiKSA+L2Rldi9udWxsIDI+JjEgXAorCXx8IHRlc3QgLWYgIiRmaWxlIjsgdGhlbgorCToKKyAgICAgIGVsaWYgdGVzdCAtZCAiJGZpbGUiOyB0aGVuCisJZXhpdF9zdGF0dXM9MQorCWNvbnRpbnVlCisgICAgICBlbGlmIHRlc3QgIiRybWZvcmNlIiA9IHllczsgdGhlbgorCWNvbnRpbnVlCisgICAgICBmaQorCisgICAgICBybWZpbGVzPSIkZmlsZSIKKworICAgICAgY2FzZSAkbmFtZSBpbgorICAgICAgKi5sYSkKKwkjIFBvc3NpYmx5IGEgbGlidG9vbCBhcmNoaXZlLCBzbyB2ZXJpZnkgaXQuCisJaWYgKCR7U0VEfSAtZSAnMnEnICRmaWxlIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgIC4gJGRpci8kbmFtZQorCisJICAjIERlbGV0ZSB0aGUgbGlidG9vbCBsaWJyYXJpZXMgYW5kIHN5bWxpbmtzLgorCSAgZm9yIG4gaW4gJGxpYnJhcnlfbmFtZXM7IGRvCisJICAgIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG4iCisJICBkb25lCisJICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG9sZF9saWJyYXJ5IgorCisJICBjYXNlICIkbW9kZSIgaW4KKwkgIGNsZWFuKQorCSAgICBjYXNlICIgICRsaWJyYXJ5X25hbWVzICIgaW4KKwkgICAgIyAiICAiIGluIHRoZSBiZWdpbm5pbmcgY2F0Y2hlcyBlbXB0eSAkZGxuYW1lCisJICAgICoiICRkbG5hbWUgIiopIDs7CisJICAgICopIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJGRsbmFtZSIgOzsKKwkgICAgZXNhYworCSAgICAgdGVzdCAtbiAiJGxpYmRpciIgJiYgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci8kbmFtZSAkb2JqZGlyLyR7bmFtZX1pIgorCSAgICA7OworCSAgdW5pbnN0YWxsKQorCSAgICBpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IHRoZW4KKwkgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdHVuaW5zdGFsbCBjb21tYW5kcy4KKwkgICAgICBjbWRzPSRwb3N0dW5pbnN0YWxsX2NtZHMKKwkgICAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwkgICAgICBmb3IgY21kIGluICRjbWRzOyBkbworCQlJRlM9IiRzYXZlX2lmcyIKKwkJZXZhbCBjbWQ9XCIkY21kXCIKKwkJJHNob3cgIiRjbWQiCisJCSRydW4gZXZhbCAiJGNtZCIKKwkJaWYgdGVzdCAiJD8iIC1uZSAwICYmIHRlc3QgIiRybWZvcmNlIiAhPSB5ZXM7IHRoZW4KKwkJICBleGl0X3N0YXR1cz0xCisJCWZpCisJICAgICAgZG9uZQorCSAgICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICBmaQorCisJICAgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KKwkgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgb2xkX3Bvc3R1bmluc3RhbGwgY29tbWFuZHMuCisJICAgICAgY21kcz0kb2xkX3Bvc3R1bmluc3RhbGxfY21kcworCSAgICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworCSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisJCUlGUz0iJHNhdmVfaWZzIgorCQlldmFsIGNtZD1cIiRjbWRcIgorCQkkc2hvdyAiJGNtZCIKKwkJJHJ1biBldmFsICIkY21kIgorCQlpZiB0ZXN0ICIkPyIgLW5lIDAgJiYgdGVzdCAiJHJtZm9yY2UiICE9IHllczsgdGhlbgorCQkgIGV4aXRfc3RhdHVzPTEKKwkJZmkKKwkgICAgICBkb25lCisJICAgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgIGZpCisJICAgICMgRklYTUU6IHNob3VsZCByZWluc3RhbGwgdGhlIGJlc3QgcmVtYWluaW5nIHNoYXJlZCBsaWJyYXJ5LgorCSAgICA7OworCSAgZXNhYworCWZpCisJOzsKKworICAgICAgKi5sbykKKwkjIFBvc3NpYmx5IGEgbGlidG9vbCBvYmplY3QsIHNvIHZlcmlmeSBpdC4KKwlpZiAoJHtTRUR9IC1lICcycScgJGZpbGUgfCBncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgorCisJICAjIFJlYWQgdGhlIC5sbyBmaWxlCisJICAuICRkaXIvJG5hbWUKKworCSAgIyBBZGQgUElDIG9iamVjdCB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byByZW1vdmUuCisJICBpZiB0ZXN0IC1uICIkcGljX29iamVjdCIgXAorCSAgICAgJiYgdGVzdCAiJHBpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkgICAgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kcGljX29iamVjdCIKKwkgIGZpCisKKwkgICMgQWRkIG5vbi1QSUMgb2JqZWN0IHRvIHRoZSBsaXN0IG9mIGZpbGVzIHRvIHJlbW92ZS4KKwkgIGlmIHRlc3QgLW4gIiRub25fcGljX29iamVjdCIgXAorCSAgICAgJiYgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCisJICAgIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJG5vbl9waWNfb2JqZWN0IgorCSAgZmkKKwlmaQorCTs7CisKKyAgICAgICopCisJaWYgdGVzdCAiJG1vZGUiID0gY2xlYW4gOyB0aGVuCisJICBub2V4ZW5hbWU9JG5hbWUKKwkgIGNhc2UgJGZpbGUgaW4KKwkgICouZXhlKQorCSAgICBmaWxlPWAkZWNobyAkZmlsZXwke1NFRH0gJ3MsLmV4ZSQsLCdgCisJICAgIG5vZXhlbmFtZT1gJGVjaG8gJG5hbWV8JHtTRUR9ICdzLC5leGUkLCwnYAorCSAgICAjICRmaWxlIHdpdGggLmV4ZSBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHJtZmlsZXMsCisJICAgICMgYWRkICRmaWxlIHdpdGhvdXQgLmV4ZQorCSAgICBybWZpbGVzPSIkcm1maWxlcyAkZmlsZSIKKwkgICAgOzsKKwkgIGVzYWMKKwkgICMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIGEgbGlidG9vbCBwcm9ncmFtLgorCSAgaWYgKCR7U0VEfSAtZSAnNHEnICRmaWxlIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgcmVsaW5rX2NvbW1hbmQ9CisJICAgIC4gJGRpci8kbm9leGVuYW1lCisKKwkgICAgIyBub3RlICRuYW1lIHN0aWxsIGNvbnRhaW5zIC5leGUgaWYgaXQgd2FzIGluICRmaWxlIG9yaWdpbmFsbHkKKwkgICAgIyBhcyBkb2VzIHRoZSB2ZXJzaW9uIG9mICRmaWxlIHRoYXQgd2FzIGFkZGVkIGludG8gJHJtZmlsZXMKKwkgICAgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci8kbmFtZSAkb2JqZGlyLyR7bmFtZX1TLiR7b2JqZXh0fSIKKwkgICAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSB5ZXMgJiYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgorCSAgICAgIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvbHQtJG5hbWUiCisJICAgIGZpCisJICAgIGlmIHRlc3QgIlgkbm9leGVuYW1lIiAhPSAiWCRuYW1lIiA7IHRoZW4KKwkgICAgICBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyL2x0LSR7bm9leGVuYW1lfS5jIgorCSAgICBmaQorCSAgZmkKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgICAkc2hvdyAiJHJtICRybWZpbGVzIgorICAgICAgJHJ1biAkcm0gJHJtZmlsZXMgfHwgZXhpdF9zdGF0dXM9MQorICAgIGRvbmUKKyAgICBvYmpkaXI9IiRvcmlnb2JqZGlyIgorCisgICAgIyBUcnkgdG8gcmVtb3ZlIHRoZSAke29iamRpcn1zIGluIHRoZSBkaXJlY3RvcmllcyB3aGVyZSB3ZSBkZWxldGVkIGZpbGVzCisgICAgZm9yIGRpciBpbiAkcm1kaXJzOyBkbworICAgICAgaWYgdGVzdCAtZCAiJGRpciI7IHRoZW4KKwkkc2hvdyAicm1kaXIgJGRpciIKKwkkcnVuIHJtZGlyICRkaXIgPi9kZXYvbnVsbCAyPiYxCisgICAgICBmaQorICAgIGRvbmUKKworICAgIGV4aXQgJGV4aXRfc3RhdHVzCisgICAgOzsKKworICAiIikKKyAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgTU9ERSIgMT4mMgorICAgICRlY2hvICIkZ2VuZXJpY19oZWxwIiAxPiYyCisgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgOzsKKyAgZXNhYworCisgIGlmIHRlc3QgLXogIiRleGVjX2NtZCI7IHRoZW4KKyAgICAkZWNobyAiJG1vZGVuYW1lOiBpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG1vZGUnIiAxPiYyCisgICAgJGVjaG8gIiRnZW5lcmljX2hlbHAiIDE+JjIKKyAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgZmkKK2ZpICMgdGVzdCAteiAiJHNob3dfaGVscCIKKworaWYgdGVzdCAtbiAiJGV4ZWNfY21kIjsgdGhlbgorICBldmFsIGV4ZWMgJGV4ZWNfY21kCisgIGV4aXQgJEVYSVRfRkFJTFVSRQorZmkKKworIyBXZSBuZWVkIHRvIGRpc3BsYXkgaGVscCBmb3IgZWFjaCBvZiB0aGUgbW9kZXMuCitjYXNlICRtb2RlIGluCisiIikgJGVjaG8gXAorIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gW01PREUtQVJHXS4uLgorCitQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KKworICAgIC0tY29uZmlnICAgICAgICAgIHNob3cgYWxsIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzCisgICAgLS1kZWJ1ZyAgICAgICAgICAgZW5hYmxlIHZlcmJvc2Ugc2hlbGwgdHJhY2luZworLW4sIC0tZHJ5LXJ1biAgICAgICAgIGRpc3BsYXkgY29tbWFuZHMgd2l0aG91dCBtb2RpZnlpbmcgYW55IGZpbGVzCisgICAgLS1mZWF0dXJlcyAgICAgICAgZGlzcGxheSBiYXNpYyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisgICAgLS1maW5pc2ggICAgICAgICAgc2FtZSBhcyBcYC0tbW9kZT1maW5pc2gnCisgICAgLS1oZWxwICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgIC0tbW9kZT1NT0RFICAgICAgIHVzZSBvcGVyYXRpb24gbW9kZSBNT0RFIFtkZWZhdWx0PWluZmVycmVkIGZyb20gTU9ERS1BUkdTXQorICAgIC0tcXVpZXQgICAgICAgICAgIHNhbWUgYXMgXGAtLXNpbGVudCcKKyAgICAtLXNpbGVudCAgICAgICAgICBkb24ndCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzCisgICAgLS10YWc9VEFHICAgICAgICAgdXNlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZyb20gdGFnIFRBRworICAgIC0tdmVyc2lvbiAgICAgICAgIHByaW50IHZlcnNpb24gaW5mb3JtYXRpb24KKworTU9ERSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAgICBjbGVhbiAgICAgICAgICAgcmVtb3ZlIGZpbGVzIGZyb20gdGhlIGJ1aWxkIGRpcmVjdG9yeQorICAgICAgY29tcGlsZSAgICAgICAgIGNvbXBpbGUgYSBzb3VyY2UgZmlsZSBpbnRvIGEgbGlidG9vbCBvYmplY3QKKyAgICAgIGV4ZWN1dGUgICAgICAgICBhdXRvbWF0aWNhbGx5IHNldCBsaWJyYXJ5IHBhdGgsIHRoZW4gcnVuIGEgcHJvZ3JhbQorICAgICAgZmluaXNoICAgICAgICAgIGNvbXBsZXRlIHRoZSBpbnN0YWxsYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMKKyAgICAgIGluc3RhbGwgICAgICAgICBpbnN0YWxsIGxpYnJhcmllcyBvciBleGVjdXRhYmxlcworICAgICAgbGluayAgICAgICAgICAgIGNyZWF0ZSBhIGxpYnJhcnkgb3IgYW4gZXhlY3V0YWJsZQorICAgICAgdW5pbnN0YWxsICAgICAgIHJlbW92ZSBsaWJyYXJpZXMgZnJvbSBhbiBpbnN0YWxsZWQgZGlyZWN0b3J5CisKK01PREUtQVJHUyB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgTU9ERS4gIFRyeSBcYCRtb2RlbmFtZSAtLWhlbHAgLS1tb2RlPU1PREUnIGZvcgorYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIE1PREUuCisKK1JlcG9ydCBidWdzIHRvIDxidWctbGlidG9vbEBnbnUub3JnPi4iCisgIGV4aXQgJEVYSVRfU1VDQ0VTUworICA7OworCitjbGVhbikKKyAgJGVjaG8gXAorIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWNsZWFuIFJNIFtSTS1PUFRJT05dLi4uIEZJTEUuLi4KKworUmVtb3ZlIGZpbGVzIGZyb20gdGhlIGJ1aWxkIGRpcmVjdG9yeS4KKworUk0gaXMgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gdG8gdXNlIHRvIGRlbGV0ZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBGSUxFCisodHlwaWNhbGx5IFxgL2Jpbi9ybScpLiAgUk0tT1BUSU9OUyBhcmUgb3B0aW9ucyAoc3VjaCBhcyBcYC1mJykgdG8gYmUgcGFzc2VkCit0byBSTS4KKworSWYgRklMRSBpcyBhIGxpYnRvb2wgbGlicmFyeSwgb2JqZWN0IG9yIHByb2dyYW0sIGFsbCB0aGUgZmlsZXMgYXNzb2NpYXRlZAord2l0aCBpdCBhcmUgZGVsZXRlZC4gT3RoZXJ3aXNlLCBvbmx5IEZJTEUgaXRzZWxmIGlzIGRlbGV0ZWQgdXNpbmcgUk0uIgorICA7OworCitjb21waWxlKQorICAkZWNobyBcCisiVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9Y29tcGlsZSBDT01QSUxFLUNPTU1BTkQuLi4gU09VUkNFRklMRQorCitDb21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgbGlicmFyeSBvYmplY3QuCisKK1RoaXMgbW9kZSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zOgorCisgIC1vIE9VVFBVVC1GSUxFICAgIHNldCB0aGUgb3V0cHV0IGZpbGUgbmFtZSB0byBPVVRQVVQtRklMRQorICAtcHJlZmVyLXBpYyAgICAgICB0cnkgdG8gYnVpbGRpbmcgUElDIG9iamVjdHMgb25seQorICAtcHJlZmVyLW5vbi1waWMgICB0cnkgdG8gYnVpbGRpbmcgbm9uLVBJQyBvYmplY3RzIG9ubHkKKyAgLXN0YXRpYyAgICAgICAgICAgYWx3YXlzIGJ1aWxkIGEgXGAubycgZmlsZSBzdWl0YWJsZSBmb3Igc3RhdGljIGxpbmtpbmcKKworQ09NUElMRS1DT01NQU5EIGlzIGEgY29tbWFuZCB0byBiZSB1c2VkIGluIGNyZWF0aW5nIGEgXGBzdGFuZGFyZCcgb2JqZWN0IGZpbGUKK2Zyb20gdGhlIGdpdmVuIFNPVVJDRUZJTEUuCisKK1RoZSBvdXRwdXQgZmlsZSBuYW1lIGlzIGRldGVybWluZWQgYnkgcmVtb3ZpbmcgdGhlIGRpcmVjdG9yeSBjb21wb25lbnQgZnJvbQorU09VUkNFRklMRSwgdGhlbiBzdWJzdGl0dXRpbmcgdGhlIEMgc291cmNlIGNvZGUgc3VmZml4IFxgLmMnIHdpdGggdGhlCitsaWJyYXJ5IG9iamVjdCBzdWZmaXgsIFxgLmxvJy4iCisgIDs7CisKK2V4ZWN1dGUpCisgICRlY2hvIFwKKyJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1leGVjdXRlIENPTU1BTkQgW0FSR1NdLi4uCisKK0F1dG9tYXRpY2FsbHkgc2V0IGxpYnJhcnkgcGF0aCwgdGhlbiBydW4gYSBwcm9ncmFtLgorCitUaGlzIG1vZGUgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKKworICAtZGxvcGVuIEZJTEUgICAgICBhZGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIEZJTEUgdG8gdGhlIGxpYnJhcnkgcGF0aAorCitUaGlzIG1vZGUgc2V0cyB0aGUgbGlicmFyeSBwYXRoIGVudmlyb25tZW50IHZhcmlhYmxlIGFjY29yZGluZyB0byBcYC1kbG9wZW4nCitmbGFncy4KKworSWYgYW55IG9mIHRoZSBBUkdTIGFyZSBsaWJ0b29sIGV4ZWN1dGFibGUgd3JhcHBlcnMsIHRoZW4gdGhleSBhcmUgdHJhbnNsYXRlZAoraW50byB0aGVpciBjb3JyZXNwb25kaW5nIHVuaW5zdGFsbGVkIGJpbmFyeSwgYW5kIGFueSBvZiB0aGVpciByZXF1aXJlZCBsaWJyYXJ5CitkaXJlY3RvcmllcyBhcmUgYWRkZWQgdG8gdGhlIGxpYnJhcnkgcGF0aC4KKworVGhlbiwgQ09NTUFORCBpcyBleGVjdXRlZCwgd2l0aCBBUkdTIGFzIGFyZ3VtZW50cy4iCisgIDs7CisKK2ZpbmlzaCkKKyAgJGVjaG8gXAorIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWZpbmlzaCBbTElCRElSXS4uLgorCitDb21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzLgorCitFYWNoIExJQkRJUiBpcyBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGxpYnRvb2wgbGlicmFyaWVzLgorCitUaGUgY29tbWFuZHMgdGhhdCB0aGlzIG1vZGUgZXhlY3V0ZXMgbWF5IHJlcXVpcmUgc3VwZXJ1c2VyIHByaXZpbGVnZXMuICBVc2UKK3RoZSBcYC0tZHJ5LXJ1bicgb3B0aW9uIGlmIHlvdSBqdXN0IHdhbnQgdG8gc2VlIHdoYXQgd291bGQgYmUgZXhlY3V0ZWQuIgorICA7OworCitpbnN0YWxsKQorICAkZWNobyBcCisiVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9aW5zdGFsbCBJTlNUQUxMLUNPTU1BTkQuLi4KKworSW5zdGFsbCBleGVjdXRhYmxlcyBvciBsaWJyYXJpZXMuCisKK0lOU1RBTEwtQ09NTUFORCBpcyB0aGUgaW5zdGFsbGF0aW9uIGNvbW1hbmQuICBUaGUgZmlyc3QgY29tcG9uZW50IHNob3VsZCBiZQorZWl0aGVyIHRoZSBcYGluc3RhbGwnIG9yIFxgY3AnIHByb2dyYW0uCisKK1RoZSByZXN0IG9mIHRoZSBjb21wb25lbnRzIGFyZSBpbnRlcnByZXRlZCBhcyBhcmd1bWVudHMgdG8gdGhhdCBjb21tYW5kIChvbmx5CitCU0QtY29tcGF0aWJsZSBpbnN0YWxsIG9wdGlvbnMgYXJlIHJlY29nbml6ZWQpLiIKKyAgOzsKKworbGluaykKKyAgJGVjaG8gXAorIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWxpbmsgTElOSy1DT01NQU5ELi4uCisKK0xpbmsgb2JqZWN0IGZpbGVzIG9yIGxpYnJhcmllcyB0b2dldGhlciB0byBmb3JtIGFub3RoZXIgbGlicmFyeSwgb3IgdG8KK2NyZWF0ZSBhbiBleGVjdXRhYmxlIHByb2dyYW0uCisKK0xJTkstQ09NTUFORCBpcyBhIGNvbW1hbmQgdXNpbmcgdGhlIEMgY29tcGlsZXIgdGhhdCB5b3Ugd291bGQgdXNlIHRvIGNyZWF0ZQorYSBwcm9ncmFtIGZyb20gc2V2ZXJhbCBvYmplY3QgZmlsZXMuCisKK1RoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBvZiBMSU5LLUNPTU1BTkQgYXJlIHRyZWF0ZWQgc3BlY2lhbGx5OgorCisgIC1hbGwtc3RhdGljICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIGF0IGFsbAorICAtYXZvaWQtdmVyc2lvbiAgICBkbyBub3QgYWRkIGEgdmVyc2lvbiBzdWZmaXggaWYgcG9zc2libGUKKyAgLWRsb3BlbiBGSUxFICAgICAgXGAtZGxwcmVvcGVuJyBGSUxFIGlmIGl0IGNhbm5vdCBiZSBkbG9wZW5lZCBhdCBydW50aW1lCisgIC1kbHByZW9wZW4gRklMRSAgIGxpbmsgaW4gRklMRSBhbmQgYWRkIGl0cyBzeW1ib2xzIHRvIGx0X3ByZWxvYWRlZF9zeW1ib2xzCisgIC1leHBvcnQtZHluYW1pYyAgIGFsbG93IHN5bWJvbHMgZnJvbSBPVVRQVVQtRklMRSB0byBiZSByZXNvbHZlZCB3aXRoIGRsc3ltKDMpCisgIC1leHBvcnQtc3ltYm9scyBTWU1GSUxFCisJCSAgICB0cnkgdG8gZXhwb3J0IG9ubHkgdGhlIHN5bWJvbHMgbGlzdGVkIGluIFNZTUZJTEUKKyAgLWV4cG9ydC1zeW1ib2xzLXJlZ2V4IFJFR0VYCisJCSAgICB0cnkgdG8gZXhwb3J0IG9ubHkgdGhlIHN5bWJvbHMgbWF0Y2hpbmcgUkVHRVgKKyAgLUxMSUJESVIgICAgICAgICAgc2VhcmNoIExJQkRJUiBmb3IgcmVxdWlyZWQgaW5zdGFsbGVkIGxpYnJhcmllcworICAtbE5BTUUgICAgICAgICAgICBPVVRQVVQtRklMRSByZXF1aXJlcyB0aGUgaW5zdGFsbGVkIGxpYnJhcnkgbGliTkFNRQorICAtbW9kdWxlICAgICAgICAgICBidWlsZCBhIGxpYnJhcnkgdGhhdCBjYW4gZGxvcGVuZWQKKyAgLW5vLWZhc3QtaW5zdGFsbCAgZGlzYWJsZSB0aGUgZmFzdC1pbnN0YWxsIG1vZGUKKyAgLW5vLWluc3RhbGwgICAgICAgbGluayBhIG5vdC1pbnN0YWxsYWJsZSBleGVjdXRhYmxlCisgIC1uby11bmRlZmluZWQgICAgIGRlY2xhcmUgdGhhdCBhIGxpYnJhcnkgZG9lcyBub3QgcmVmZXIgdG8gZXh0ZXJuYWwgc3ltYm9scworICAtbyBPVVRQVVQtRklMRSAgICBjcmVhdGUgT1VUUFVULUZJTEUgZnJvbSB0aGUgc3BlY2lmaWVkIG9iamVjdHMKKyAgLW9iamVjdGxpc3QgRklMRSAgVXNlIGEgbGlzdCBvZiBvYmplY3QgZmlsZXMgZm91bmQgaW4gRklMRSB0byBzcGVjaWZ5IG9iamVjdHMKKyAgLXByZWNpb3VzLWZpbGVzLXJlZ2V4IFJFR0VYCisgICAgICAgICAgICAgICAgICAgIGRvbid0IHJlbW92ZSBvdXRwdXQgZmlsZXMgbWF0Y2hpbmcgUkVHRVgKKyAgLXJlbGVhc2UgUkVMRUFTRSAgc3BlY2lmeSBwYWNrYWdlIHJlbGVhc2UgaW5mb3JtYXRpb24KKyAgLXJwYXRoIExJQkRJUiAgICAgdGhlIGNyZWF0ZWQgbGlicmFyeSB3aWxsIGV2ZW50dWFsbHkgYmUgaW5zdGFsbGVkIGluIExJQkRJUgorICAtUlsgXUxJQkRJUiAgICAgICBhZGQgTElCRElSIHRvIHRoZSBydW50aW1lIHBhdGggb2YgcHJvZ3JhbXMgYW5kIGxpYnJhcmllcworICAtc3RhdGljICAgICAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBvZiBsaWJ0b29sIGxpYnJhcmllcworICAtdmVyc2lvbi1pbmZvIENVUlJFTlRbOlJFVklTSU9OWzpBR0VdXQorCQkgICAgc3BlY2lmeSBsaWJyYXJ5IHZlcnNpb24gaW5mbyBbZWFjaCB2YXJpYWJsZSBkZWZhdWx0cyB0byAwXQorCitBbGwgb3RoZXIgb3B0aW9ucyAoYXJndW1lbnRzIGJlZ2lubmluZyB3aXRoIFxgLScpIGFyZSBpZ25vcmVkLgorCitFdmVyeSBvdGhlciBhcmd1bWVudCBpcyB0cmVhdGVkIGFzIGEgZmlsZW5hbWUuICBGaWxlcyBlbmRpbmcgaW4gXGAubGEnIGFyZQordHJlYXRlZCBhcyB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcywgb3RoZXIgZmlsZXMgYXJlIHN0YW5kYXJkIG9yIGxpYnJhcnkKK29iamVjdCBmaWxlcy4KKworSWYgdGhlIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAubGEnLCB0aGVuIGEgbGlidG9vbCBsaWJyYXJ5IGlzIGNyZWF0ZWQsCitvbmx5IGxpYnJhcnkgb2JqZWN0cyAoXGAubG8nIGZpbGVzKSBtYXkgYmUgc3BlY2lmaWVkLCBhbmQgXGAtcnBhdGgnIGlzCityZXF1aXJlZCwgZXhjZXB0IHdoZW4gY3JlYXRpbmcgYSBjb252ZW5pZW5jZSBsaWJyYXJ5LgorCitJZiBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmEnIG9yIFxgLmxpYicsIHRoZW4gYSBzdGFuZGFyZCBsaWJyYXJ5IGlzIGNyZWF0ZWQKK3VzaW5nIFxgYXInIGFuZCBcYHJhbmxpYicsIG9yIG9uIFdpbmRvd3MgdXNpbmcgXGBsaWInLgorCitJZiBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmxvJyBvciBcYC4ke29iamV4dH0nLCB0aGVuIGEgcmVsb2FkYWJsZSBvYmplY3QgZmlsZQoraXMgY3JlYXRlZCwgb3RoZXJ3aXNlIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbSBpcyBjcmVhdGVkLiIKKyAgOzsKKwordW5pbnN0YWxsKQorICAkZWNobyBcCisiVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9dW5pbnN0YWxsIFJNIFtSTS1PUFRJT05dLi4uIEZJTEUuLi4KKworUmVtb3ZlIGxpYnJhcmllcyBmcm9tIGFuIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuCisKK1JNIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHVzZSB0byBkZWxldGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggRklMRQorKHR5cGljYWxseSBcYC9iaW4vcm0nKS4gIFJNLU9QVElPTlMgYXJlIG9wdGlvbnMgKHN1Y2ggYXMgXGAtZicpIHRvIGJlIHBhc3NlZAordG8gUk0uCisKK0lmIEZJTEUgaXMgYSBsaWJ0b29sIGxpYnJhcnksIGFsbCB0aGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGl0IGFyZSBkZWxldGVkLgorT3RoZXJ3aXNlLCBvbmx5IEZJTEUgaXRzZWxmIGlzIGRlbGV0ZWQgdXNpbmcgUk0uIgorICA7OworCisqKQorICAkZWNobyAiJG1vZGVuYW1lOiBpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG1vZGUnIiAxPiYyCisgICRlY2hvICIkaGVscCIgMT4mMgorICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgOzsKK2VzYWMKKworJGVjaG8KKyRlY2hvICJUcnkgXGAkbW9kZW5hbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBvdGhlciBtb2Rlcy4iCisKK2V4aXQgJD8KKworIyBUaGUgVEFHcyBiZWxvdyBhcmUgZGVmaW5lZCBzdWNoIHRoYXQgd2UgbmV2ZXIgZ2V0IGludG8gYSBzaXR1YXRpb24KKyMgaW4gd2hpY2ggd2UgZGlzYWJsZSBib3RoIGtpbmRzIG9mIGxpYnJhcmllcy4gIEdpdmVuIGNvbmZsaWN0aW5nCisjIGNob2ljZXMsIHdlIGdvIGZvciBhIHN0YXRpYyBsaWJyYXJ5LCB0aGF0IGlzIHRoZSBtb3N0IHBvcnRhYmxlLAorIyBzaW5jZSB3ZSBjYW4ndCB0ZWxsIHdoZXRoZXIgc2hhcmVkIGxpYnJhcmllcyB3ZXJlIGRpc2FibGVkIGJlY2F1c2UKKyMgdGhlIHVzZXIgYXNrZWQgZm9yIHRoYXQgb3IgYmVjYXVzZSB0aGUgcGxhdGZvcm0gZG9lc24ndCBzdXBwb3J0CisjIHRoZW0uICBUaGlzIGlzIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgb24gQUlYLCBiZWNhdXNlIHdlIGRvbid0CisjIHN1cHBvcnQgaGF2aW5nIGJvdGggc3RhdGljIGFuZCBzaGFyZWQgbGlicmFyaWVzIGVuYWJsZWQgYXQgdGhlIHNhbWUKKyMgdGltZSBvbiB0aGF0IHBsYXRmb3JtLCBzbyB3ZSBkZWZhdWx0IHRvIGEgc2hhcmVkLW9ubHkgY29uZmlndXJhdGlvbi4KKyMgSWYgYSBkaXNhYmxlLXNoYXJlZCB0YWcgaXMgZ2l2ZW4sIHdlJ2xsIGZhbGxiYWNrIHRvIGEgc3RhdGljLW9ubHkKKyMgY29uZmlndXJhdGlvbi4gIEJ1dCB3ZSdsbCBuZXZlciBnbyBmcm9tIHN0YXRpYy1vbmx5IHRvIHNoYXJlZC1vbmx5LgorCisjICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6IGRpc2FibGUtc2hhcmVkCitkaXNhYmxlX2xpYnM9c2hhcmVkCisjICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXNoYXJlZAorCisjICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6IGRpc2FibGUtc3RhdGljCitkaXNhYmxlX2xpYnM9c3RhdGljCisjICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXN0YXRpYworCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTpzaGVsbC1zY3JpcHQKKyMgc2gtaW5kZW50YXRpb246MgorIyBFbmQ6CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9jb25mdG9vbHMvbWtpbnN0YWxsZGlycyBiL2V4cGF0LTIuMC4xL2NvbmZ0b29scy9ta2luc3RhbGxkaXJzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM1MjkxZGIKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9jb25mdG9vbHMvbWtpbnN0YWxsZGlycwpAQCAtMCwwICsxLDQwIEBACisjISAvYmluL3NoCisjIG1raW5zdGFsbGRpcnMgLS0tIG1ha2UgZGlyZWN0b3J5IGhpZXJhcmNoeQorIyBBdXRob3I6IE5vYWggRnJpZWRtYW4gPGZyaWVkbWFuQHByZXAuYWkubWl0LmVkdT4KKyMgQ3JlYXRlZDogMTk5My0wNS0xNgorIyBQdWJsaWMgZG9tYWluCisKKyMgJElkOiBta2luc3RhbGxkaXJzLHYgMS4xIDIwMDAvMDkvMTggMTY6MjY6MjEgY29vcGVyY2MgRXhwICQKKworZXJyc3RhdHVzPTAKKworZm9yIGZpbGUKK2RvCisgICBzZXQgZm5vcmQgYGVjaG8gIjokZmlsZSIgfCBzZWQgLW5lICdzL146XC8vIy87cy9eOi8vO3MvXC8vIC9nO3MvXiMvXC8vO3AnYAorICAgc2hpZnQKKworICAgcGF0aGNvbXA9CisgICBmb3IgZAorICAgZG8KKyAgICAgcGF0aGNvbXA9IiRwYXRoY29tcCRkIgorICAgICBjYXNlICIkcGF0aGNvbXAiIGluCisgICAgICAgLSogKSBwYXRoY29tcD0uLyRwYXRoY29tcCA7OworICAgICBlc2FjCisKKyAgICAgaWYgdGVzdCAhIC1kICIkcGF0aGNvbXAiOyB0aGVuCisgICAgICAgIGVjaG8gIm1rZGlyICRwYXRoY29tcCIKKworICAgICAgICBta2RpciAiJHBhdGhjb21wIiB8fCBsYXN0ZXJyPSQ/CisKKyAgICAgICAgaWYgdGVzdCAhIC1kICIkcGF0aGNvbXAiOyB0aGVuCisgIAkgIGVycnN0YXR1cz0kbGFzdGVycgorICAgICAgICBmaQorICAgICBmaQorCisgICAgIHBhdGhjb21wPSIkcGF0aGNvbXAvIgorICAgZG9uZQorZG9uZQorCitleGl0ICRlcnJzdGF0dXMKKworIyBta2luc3RhbGxkaXJzIGVuZHMgaGVyZQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvZG9jL2V4cGF0LnBuZyBiL2V4cGF0LTIuMC4xL2RvYy9leHBhdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJjMDcyNgotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2RvYy9leHBhdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvZG9jL3JlZmVyZW5jZS5odG1sIGIvZXhwYXQtMi4wLjEvZG9jL3JlZmVyZW5jZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMTU4NzAKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9kb2MvcmVmZXJlbmNlLmh0bWwKQEAgLTAsMCArMSwyMzQxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgorICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzxodG1sPgorPGhlYWQ+Cis8IS0tIENvcHlyaWdodCAxOTk5LDIwMDAgQ2xhcmsgQ29vcGVyIDxjb29wZXJjY0BuZXRoZWF2ZW4uY29tPgorICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUuIFlvdSBtYXkgZGlzdHJpYnV0ZSBvciBtb2RpZnkgYWNjb3JkaW5nIHRvCisgICAgIHRoZSB0ZXJtcyBvZiB0aGUgTUlUL1ggTGljZW5zZSAtLT4KKyAgPHRpdGxlPkV4cGF0IFhNTCBQYXJzZXI8L3RpdGxlPgorICA8bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9IkNsYXJrIENvb3BlciwgY29vcGVyY2NAbmV0aGVhdmVuLmNvbSIgLz4KKyAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KKyAgPGxpbmsgaHJlZj0ic3R5bGUuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiAvPgorPC9oZWFkPgorPGJvZHk+CisgIDx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+CisgICAgICA8dGQgY2xhc3M9ImNvcm5lciI+PGltZyBzcmM9ImV4cGF0LnBuZyIgYWx0PSIoRXhwYXQgbG9nbykiIC8+PC90ZD4KKyAgICAgIDx0ZCBjbGFzcz0iYmFubmVyIj48aDE+VGhlIEV4cGF0IFhNTCBQYXJzZXI8L2gxPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgY2xhc3M9InJlbGVhc2VubyI+UmVsZWFzZSAyLjAuMTwvdGQ+CisgICAgICA8dGQ+PC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorPGRpdiBjbGFzcz0iY29udGVudCI+CisKKzxwPkV4cGF0IGlzIGEgbGlicmFyeSwgd3JpdHRlbiBpbiBDLCBmb3IgcGFyc2luZyBYTUwgZG9jdW1lbnRzLiBJdCdzCit0aGUgdW5kZXJseWluZyBYTUwgcGFyc2VyIGZvciB0aGUgb3BlbiBzb3VyY2UgTW96aWxsYSBwcm9qZWN0LCBQZXJsJ3MKKzxjb2RlPlhNTDo6UGFyc2VyPC9jb2RlPiwgUHl0aG9uJ3MgPGNvZGU+eG1sLnBhcnNlcnMuZXhwYXQ8L2NvZGU+LCBhbmQKK290aGVyIG9wZW4tc291cmNlIFhNTCBwYXJzZXJzLjwvcD4KKworPHA+VGhpcyBsaWJyYXJ5IGlzIHRoZSBjcmVhdGlvbiBvZiBKYW1lcyBDbGFyaywgd2hvJ3MgYWxzbyBnaXZlbiB1cworZ3JvZmYgKGFuIG5yb2ZmIGxvb2stYWxpa2UpLCBKYWRlIChhbiBpbXBsZW1lbnRpb24gb2YgSVNPJ3MgRFNTU0wKK3N0eWxlc2hlZXQgbGFuZ3VhZ2UgZm9yIFNHTUwpLCBYUCAoYSBKYXZhIFhNTCBwYXJzZXIgcGFja2FnZSksIFhUIChhCitKYXZhIFhTTCBlbmdpbmUpLiAgSmFtZXMgd2FzIGFsc28gdGhlIHRlY2huaWNhbCBsZWFkIG9uIHRoZSBYTUwKK1dvcmtpbmcgR3JvdXAgYXQgVzNDIHRoYXQgcHJvZHVjZWQgdGhlIFhNTCBzcGVjaWZpY2F0aW9uLjwvcD4KKworPHA+VGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBsaWNlbnNlZCB1bmRlciB0aGUgPGEKK2hyZWY9Ii4uL0NPUFlJTkciPk1JVC9YIENvbnNvcnRpdW0gbGljZW5zZTwvYT4uIFlvdSBtYXkgZG93bmxvYWQgaXQKK2Zyb20gPGEgaHJlZj0iaHR0cDovL3d3dy5saWJleHBhdC5vcmcvIj50aGUgRXhwYXQgaG9tZSBwYWdlPC9hPi4KKzwvcD4KKworPHA+VGhlIGJ1bGsgb2YgdGhpcyBkb2N1bWVudCB3YXMgb3JpZ2luYWxseSBjb21taXNzaW9uZWQgYXMgYW4gYXJ0aWNsZQorYnkgPGEgaHJlZj0iaHR0cDovL3d3dy54bWwuY29tLyI+WE1MLmNvbTwvYT4uIFRoZXkgZ3JhY2lvdXNseSBhbGxvd2VkCitDbGFyayBDb29wZXIgdG8gcmV0YWluIGNvcHlyaWdodCBhbmQgdG8gZGlzdHJpYnV0ZSBpdCB3aXRoIEV4cGF0LgorVGhpcyB2ZXJzaW9uIGhhcyBiZWVuIHN1YnN0YW50aWFsbHkgZXh0ZW5kZWQgdG8gaW5jbHVkZSBkb2N1bWVudGF0aW9uCitvbiBmZWF0dXJlcyB3aGljaCBoYXZlIGJlZW4gYWRkZWQgc2luY2UgdGhlIG9yaWdpbmFsIGFydGljbGUgd2FzCitwdWJsaXNoZWQsIGFuZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIHVzaW5nIHRoZSBvcmlnaW5hbAoraW50ZXJmYWNlLjwvcD4KKworPGhyIC8+Cis8aDI+VGFibGUgb2YgQ29udGVudHM8L2gyPgorPHVsPgorICA8bGk+PGEgaHJlZj0iI292ZXJ2aWV3Ij5PdmVydmlldzwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI2J1aWxkaW5nIj5CdWlsZGluZyBhbmQgSW5zdGFsbGluZzwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI3VzaW5nIj5Vc2luZyBFeHBhdDwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI3JlZmVyZW5jZSI+UmVmZXJlbmNlPC9hPgorICA8dWw+CisgICAgPGxpPjxhIGhyZWY9IiNjcmVhdGlvbiI+UGFyc2VyIENyZWF0aW9uIEZ1bmN0aW9uczwvYT4KKyAgICA8dWw+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9QYXJzZXJDcmVhdGUiPlhNTF9QYXJzZXJDcmVhdGU8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1BhcnNlckNyZWF0ZU5TIj5YTUxfUGFyc2VyQ3JlYXRlTlM8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1BhcnNlckNyZWF0ZV9NTSI+WE1MX1BhcnNlckNyZWF0ZV9NTTwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUiPlhNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZTwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfUGFyc2VyRnJlZSI+WE1MX1BhcnNlckZyZWU8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1BhcnNlclJlc2V0Ij5YTUxfUGFyc2VyUmVzZXQ8L2E+PC9saT4KKyAgICA8L3VsPgorICAgIDwvbGk+CisgICAgPGxpPjxhIGhyZWY9IiNwYXJzaW5nIj5QYXJzaW5nIEZ1bmN0aW9uczwvYT4KKyAgICA8dWw+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9QYXJzZSI+WE1MX1BhcnNlPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9QYXJzZUJ1ZmZlciI+WE1MX1BhcnNlQnVmZmVyPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9HZXRCdWZmZXIiPlhNTF9HZXRCdWZmZXI8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1N0b3BQYXJzZXIiPlhNTF9TdG9wUGFyc2VyPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9SZXN1bWVQYXJzZXIiPlhNTF9SZXN1bWVQYXJzZXI8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX0dldFBhcnNpbmdTdGF0dXMiPlhNTF9HZXRQYXJzaW5nU3RhdHVzPC9hPjwvbGk+CisgICAgPC91bD4KKyAgICA8L2xpPgorICAgIDxsaT48YSBocmVmPSIjc2V0dGluZyI+SGFuZGxlciBTZXR0aW5nIEZ1bmN0aW9uczwvYT4KKyAgICA8dWw+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9TZXRTdGFydEVsZW1lbnRIYW5kbGVyIj5YTUxfU2V0U3RhcnRFbGVtZW50SGFuZGxlcjwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfU2V0RW5kRWxlbWVudEhhbmRsZXIiPlhNTF9TZXRFbmRFbGVtZW50SGFuZGxlcjwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfU2V0RWxlbWVudEhhbmRsZXIiPlhNTF9TZXRFbGVtZW50SGFuZGxlcjwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXIiPlhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcjwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfU2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlciI+WE1MX1NldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXI8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1NldENvbW1lbnRIYW5kbGVyIj5YTUxfU2V0Q29tbWVudEhhbmRsZXI8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1NldFN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlciI+WE1MX1NldFN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlcjwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfU2V0RW5kQ2RhdGFTZWN0aW9uSGFuZGxlciI+WE1MX1NldEVuZENkYXRhU2VjdGlvbkhhbmRsZXI8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1NldENkYXRhU2VjdGlvbkhhbmRsZXIiPlhNTF9TZXRDZGF0YVNlY3Rpb25IYW5kbGVyPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9TZXREZWZhdWx0SGFuZGxlciI+WE1MX1NldERlZmF1bHRIYW5kbGVyPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9TZXREZWZhdWx0SGFuZGxlckV4cGFuZCI+WE1MX1NldERlZmF1bHRIYW5kbGVyRXhwYW5kPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIiPlhNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXI8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlckFyZyI+WE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlckFyZzwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfU2V0U2tpcHBlZEVudGl0eUhhbmRsZXIiPlhNTF9TZXRTa2lwcGVkRW50aXR5SGFuZGxlcjwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfU2V0VW5rbm93bkVuY29kaW5nSGFuZGxlciI+WE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXI8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1NldFN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIiPlhNTF9TZXRTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9TZXRFbmROYW1lc3BhY2VEZWNsSGFuZGxlciI+WE1MX1NldEVuZE5hbWVzcGFjZURlY2xIYW5kbGVyPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9TZXROYW1lc3BhY2VEZWNsSGFuZGxlciI+WE1MX1NldE5hbWVzcGFjZURlY2xIYW5kbGVyPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9TZXRYbWxEZWNsSGFuZGxlciI+WE1MX1NldFhtbERlY2xIYW5kbGVyPC9hPjwvbGk+CQkgIAorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfU2V0U3RhcnREb2N0eXBlRGVjbEhhbmRsZXIiPlhNTF9TZXRTdGFydERvY3R5cGVEZWNsSGFuZGxlcjwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfU2V0RW5kRG9jdHlwZURlY2xIYW5kbGVyIj5YTUxfU2V0RW5kRG9jdHlwZURlY2xIYW5kbGVyPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9TZXREb2N0eXBlRGVjbEhhbmRsZXIiPlhNTF9TZXREb2N0eXBlRGVjbEhhbmRsZXI8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1NldEVsZW1lbnREZWNsSGFuZGxlciI+WE1MX1NldEVsZW1lbnREZWNsSGFuZGxlcjwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfU2V0QXR0bGlzdERlY2xIYW5kbGVyIj5YTUxfU2V0QXR0bGlzdERlY2xIYW5kbGVyPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9TZXRFbnRpdHlEZWNsSGFuZGxlciI+WE1MX1NldEVudGl0eURlY2xIYW5kbGVyPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9TZXRVbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyIj5YTUxfU2V0VW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlcjwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfU2V0Tm90YXRpb25EZWNsSGFuZGxlciI+WE1MX1NldE5vdGF0aW9uRGVjbEhhbmRsZXI8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1NldE5vdFN0YW5kYWxvbmVIYW5kbGVyIj5YTUxfU2V0Tm90U3RhbmRhbG9uZUhhbmRsZXI8L2E+PC9saT4KKyAgICA8L3VsPgorICAgIDwvbGk+CisgICAgPGxpPjxhIGhyZWY9IiNwb3NpdGlvbiI+UGFyc2UgUG9zaXRpb24gYW5kIEVycm9yIFJlcG9ydGluZyBGdW5jdGlvbnM8L2E+CisgICAgPHVsPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfR2V0RXJyb3JDb2RlIj5YTUxfR2V0RXJyb3JDb2RlPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9FcnJvclN0cmluZyI+WE1MX0Vycm9yU3RyaW5nPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9HZXRDdXJyZW50Qnl0ZUluZGV4Ij5YTUxfR2V0Q3VycmVudEJ5dGVJbmRleDwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIiPlhNTF9HZXRDdXJyZW50TGluZU51bWJlcjwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlciI+WE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXI8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX0dldEN1cnJlbnRCeXRlQ291bnQiPlhNTF9HZXRDdXJyZW50Qnl0ZUNvdW50PC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9HZXRJbnB1dENvbnRleHQiPlhNTF9HZXRJbnB1dENvbnRleHQ8L2E+PC9saT4KKyAgICA8L3VsPgorICAgIDwvbGk+CisgICAgPGxpPjxhIGhyZWY9IiNtaXNjZWxsYW5lb3VzIj5NaXNjZWxsYW5lb3VzIEZ1bmN0aW9uczwvYT4KKyAgICA8dWw+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9TZXRVc2VyRGF0YSI+WE1MX1NldFVzZXJEYXRhPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9HZXRVc2VyRGF0YSI+WE1MX0dldFVzZXJEYXRhPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9Vc2VQYXJzZXJBc0hhbmRsZXJBcmciPlhNTF9Vc2VQYXJzZXJBc0hhbmRsZXJBcmc8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1NldEJhc2UiPlhNTF9TZXRCYXNlPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9HZXRCYXNlIj5YTUxfR2V0QmFzZTwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfR2V0U3BlY2lmaWVkQXR0cmlidXRlQ291bnQiPlhNTF9HZXRTcGVjaWZpZWRBdHRyaWJ1dGVDb3VudDwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfR2V0SWRBdHRyaWJ1dGVJbmRleCI+WE1MX0dldElkQXR0cmlidXRlSW5kZXg8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1NldEVuY29kaW5nIj5YTUxfU2V0RW5jb2Rpbmc8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1NldFBhcmFtRW50aXR5UGFyc2luZyI+WE1MX1NldFBhcmFtRW50aXR5UGFyc2luZzwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfVXNlRm9yZWlnbkRURCI+WE1MX1VzZUZvcmVpZ25EVEQ8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1NldFJldHVybk5TVHJpcGxldCI+WE1MX1NldFJldHVybk5TVHJpcGxldDwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfRGVmYXVsdEN1cnJlbnQiPlhNTF9EZWZhdWx0Q3VycmVudDwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfRXhwYXRWZXJzaW9uIj5YTUxfRXhwYXRWZXJzaW9uPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9FeHBhdFZlcnNpb25JbmZvIj5YTUxfRXhwYXRWZXJzaW9uSW5mbzwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfR2V0RmVhdHVyZUxpc3QiPlhNTF9HZXRGZWF0dXJlTGlzdDwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfRnJlZUNvbnRlbnRNb2RlbCI+WE1MX0ZyZWVDb250ZW50TW9kZWw8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX01lbU1hbGxvYyI+WE1MX01lbU1hbGxvYzwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfTWVtUmVhbGxvYyI+WE1MX01lbVJlYWxsb2M8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX01lbUZyZWUiPlhNTF9NZW1GcmVlPC9hPjwvbGk+CisgICAgPC91bD4KKyAgICA8L2xpPgorICA8L3VsPiAgCisgIDwvbGk+Cis8L3VsPgorCis8aHIgLz4KKzxoMj48YSBuYW1lPSJvdmVydmlldyI+T3ZlcnZpZXc8L2E+PC9oMj4KKworPHA+RXhwYXQgaXMgYSBzdHJlYW0tb3JpZW50ZWQgcGFyc2VyLiBZb3UgcmVnaXN0ZXIgY2FsbGJhY2sgKG9yCitoYW5kbGVyKSBmdW5jdGlvbnMgd2l0aCB0aGUgcGFyc2VyIGFuZCB0aGVuIHN0YXJ0IGZlZWRpbmcgaXQgdGhlCitkb2N1bWVudC4gIEFzIHRoZSBwYXJzZXIgcmVjb2duaXplcyBwYXJ0cyBvZiB0aGUgZG9jdW1lbnQsIGl0IHdpbGwKK2NhbGwgdGhlIGFwcHJvcHJpYXRlIGhhbmRsZXIgZm9yIHRoYXQgcGFydCAoaWYgeW91J3ZlIHJlZ2lzdGVyZWQgb25lLikgCitUaGUgZG9jdW1lbnQgaXMgZmVkIHRvIHRoZSBwYXJzZXIgaW4gcGllY2VzLCBzbyB5b3UgY2FuIHN0YXJ0IHBhcnNpbmcKK2JlZm9yZSB5b3UgaGF2ZSBhbGwgdGhlIGRvY3VtZW50LiBUaGlzIGFsc28gYWxsb3dzIHlvdSB0byBwYXJzZSByZWFsbHkKK2h1Z2UgZG9jdW1lbnRzIHRoYXQgd29uJ3QgZml0IGludG8gbWVtb3J5LjwvcD4KKworPHA+RXhwYXQgY2FuIGJlIGludGltaWRhdGluZyBkdWUgdG8gdGhlIG1hbnkga2luZHMgb2YgaGFuZGxlcnMgYW5kCitvcHRpb25zIHlvdSBjYW4gc2V0LiBCdXQgeW91IG9ubHkgbmVlZCB0byBsZWFybiBmb3VyIGZ1bmN0aW9ucyBpbgorb3JkZXIgdG8gZG8gOTAlIG9mIHdoYXQgeW91J2xsIHdhbnQgdG8gZG8gd2l0aCBpdDo8L3A+CisKKzxkbD4KKworPGR0Pjxjb2RlPjxhIGhyZWY9ICIjWE1MX1BhcnNlckNyZWF0ZSIKKyAgICAgICAgICAgICA+WE1MX1BhcnNlckNyZWF0ZTwvYT48L2NvZGU+PC9kdD4KKyAgPGRkPkNyZWF0ZSBhIG5ldyBwYXJzZXIgb2JqZWN0LjwvZGQ+CisKKzxkdD48Y29kZT48YSBocmVmPSAiI1hNTF9TZXRFbGVtZW50SGFuZGxlciIKKyAgICAgICAgICAgICA+WE1MX1NldEVsZW1lbnRIYW5kbGVyPC9hPjwvY29kZT48L2R0PgorICA8ZGQ+U2V0IGhhbmRsZXJzIGZvciBzdGFydCBhbmQgZW5kIHRhZ3MuPC9kZD4KKworPGR0Pjxjb2RlPjxhIGhyZWY9ICIjWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyIgorICAgICAgICAgICAgID5YTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXI8L2E+PC9jb2RlPjwvZHQ+CisgIDxkZD5TZXQgaGFuZGxlciBmb3IgdGV4dC48L2RkPgorCis8ZHQ+PGNvZGU+PGEgaHJlZj0gIiNYTUxfUGFyc2UiCisgICAgICAgICAgICAgPlhNTF9QYXJzZTwvYT48L2NvZGU+PC9kdD4KKyAgPGRkPlBhc3MgYSBidWZmZXIgZnVsbCBvZiBkb2N1bWVudCB0byB0aGUgcGFyc2VyPC9kZD4KKzwvZGw+CisKKzxwPlRoZXNlIGZ1bmN0aW9ucyBhbmQgb3RoZXJzIGFyZSBkZXNjcmliZWQgaW4gdGhlIDxhCitocmVmPSIjcmVmZXJlbmNlIj5yZWZlcmVuY2U8L2E+IHBhcnQgb2YgdGhpcyBkb2N1bWVudC4gVGhlIHJlZmVyZW5jZQorc2VjdGlvbiBhbHNvIGRlc2NyaWJlcyBpbiBkZXRhaWwgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIHRoZQorZGlmZmVyZW50IHR5cGVzIG9mIGhhbmRsZXJzLjwvcD4KKworPHA+TGV0J3MgbG9vayBhdCBhIHZlcnkgc2ltcGxlIGV4YW1wbGUgcHJvZ3JhbSB0aGF0IG9ubHkgdXNlcyAzIG9mIHRoZQorYWJvdmUgZnVuY3Rpb25zIChpdCBkb2Vzbid0IG5lZWQgdG8gc2V0IGEgY2hhcmFjdGVyIGhhbmRsZXIuKSBUaGUKK3Byb2dyYW0gPGEgaHJlZj0iLi4vZXhhbXBsZXMvb3V0bGluZS5jIj5vdXRsaW5lLmM8L2E+IHByaW50cyBhbgorZWxlbWVudCBvdXRsaW5lLCBpbmRlbnRpbmcgY2hpbGQgZWxlbWVudHMgdG8gZGlzdGluZ3Vpc2ggdGhlbSBmcm9tIHRoZQorcGFyZW50IGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGVtLiBUaGUgc3RhcnQgaGFuZGxlciBkb2VzIGFsbCB0aGUKK3dvcmsuICBJdCBwcmludHMgdHdvIGluZGVudGluZyBzcGFjZXMgZm9yIGV2ZXJ5IGxldmVsIG9mIGFuY2VzdG9yCitlbGVtZW50cywgdGhlbiBpdCBwcmludHMgdGhlIGVsZW1lbnQgYW5kIGF0dHJpYnV0ZQoraW5mb3JtYXRpb24uIEZpbmFsbHkgaXQgaW5jcmVtZW50cyB0aGUgZ2xvYmFsIDxjb2RlPkRlcHRoPC9jb2RlPgordmFyaWFibGUuPC9wPgorCis8cHJlIGNsYXNzPSJlZyI+CitpbnQgRGVwdGg7CisKK3ZvaWQgWE1MQ0FMTAorc3RhcnQodm9pZCAqZGF0YSwgY29uc3QgY2hhciAqZWwsIGNvbnN0IGNoYXIgKiphdHRyKSB7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgJmx0OyBEZXB0aDsgaSsrKQorICAgIHByaW50ZigiICAiKTsKKworICBwcmludGYoIiVzIiwgZWwpOworCisgIGZvciAoaSA9IDA7IGF0dHJbaV07IGkgKz0gMikgeworICAgIHByaW50ZigiICVzPSclcyciLCBhdHRyW2ldLCBhdHRyW2kgKyAxXSk7CisgIH0KKworICBwcmludGYoIlxuIik7CisgIERlcHRoKys7Cit9ICAvKiBFbmQgb2Ygc3RhcnQgaGFuZGxlciAqLworPC9wcmU+CisKKzxwPlRoZSBlbmQgdGFnIHNpbXBseSBkb2VzIHRoZSBib29ra2VlcGluZyB3b3JrIG9mIGRlY3JlbWVudGluZworPGNvZGU+RGVwdGg8L2NvZGU+LjwvcD4KKzxwcmUgY2xhc3M9ImVnIj4KK3ZvaWQgWE1MQ0FMTAorZW5kKHZvaWQgKmRhdGEsIGNvbnN0IGNoYXIgKmVsKSB7CisgIERlcHRoLS07Cit9ICAvKiBFbmQgb2YgZW5kIGhhbmRsZXIgKi8KKzwvcHJlPgorCis8cD5Ob3RlIHRoZSA8Y29kZT5YTUxDQUxMPC9jb2RlPiBhbm5vdGF0aW9uIHVzZWQgZm9yIHRoZSBjYWxsYmFja3MuCitUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgdGhlIEV4cGF0IGFuZCB0aGUgY2FsbGJhY2tzIGFyZSB1c2luZyB0aGUKK3NhbWUgY2FsbGluZyBjb252ZW50aW9uIGluIGNhc2UgdGhlIGNvbXBpbGVyIG9wdGlvbnMgdXNlZCBmb3IgRXhwYXQKK2l0c2VsZiBhbmQgdGhlIGNsaWVudCBjb2RlIGFyZSBkaWZmZXJlbnQuICBFeHBhdCB0cmllcyBub3QgdG8gY2FyZQord2hhdCB0aGUgZGVmYXVsdCBjYWxsaW5nIGNvbnZlbnRpb24gaXMsIHRob3VnaCBpdCBtYXkgcmVxdWlyZSB0aGF0IGl0CitiZSBjb21waWxlZCB3aXRoIGEgZGVmYXVsdCBjb252ZW50aW9uIG9mICJjZGVjbCIgb24gc29tZSBwbGF0Zm9ybXMuCitGb3IgY29kZSB3aGljaCB1c2VzIEV4cGF0LCBob3dldmVyLCB0aGUgY2FsbGluZyBjb252ZW50aW9uIGlzCitzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPlhNTENBTEw8L2NvZGU+IGFubm90YXRpb24gb24gbW9zdCBwbGF0Zm9ybXM7CitjYWxsYmFja3Mgc2hvdWxkIGJlIGRlZmluZWQgdXNpbmcgdGhpcyBhbm5vdGF0aW9uLjwvcD4KKworPHA+VGhlIDxjb2RlPlhNTENBTEw8L2NvZGU+IGFubm90YXRpb24gd2FzIGFkZGVkIGluIEV4cGF0IDEuOTUuNywgYnV0CitleGlzdGluZyB3b3JraW5nIEV4cGF0IGFwcGxpY2F0aW9ucyBkb24ndCBuZWVkIHRvIGFkZCBpdCAoc2luY2UgdGhleQorYXJlIGFscmVhZHkgdXNpbmcgdGhlICJjZGVjbCIgY2FsbGluZyBjb252ZW50aW9uLCBvciB0aGV5IHdvdWxkbid0IGJlCit3b3JraW5nKS4gIFRoZSBhbm5vdGF0aW9uIGlzIG9ubHkgbmVlZGVkIGlmIHRoZSBkZWZhdWx0IGNhbGxpbmcKK2NvbnZlbnRpb24gbWF5IGJlIHNvbWV0aGluZyBvdGhlciB0aGFuICJjZGVjbCIuICBUbyB1c2UgdGhlIGFubm90YXRpb24KK3NhZmVseSB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIEV4cGF0LCB5b3UgY2FuIGNvbmRpdGlvbmFsbHkgZGVmaW5lIGl0Cis8ZW0+YWZ0ZXI8L2VtPiBpbmNsdWRpbmcgRXhwYXQncyBoZWFkZXIgZmlsZTo8L3A+CisKKzxwcmUgY2xhc3M9ImVnIj4KKyNpbmNsdWRlICZsdDtleHBhdC5oJmd0OworCisjaWZuZGVmIFhNTENBTEwKKyNpZiBkZWZpbmVkKF9NU0NfRVhURU5TSU9OUykgJmFtcDsmYW1wOyAhZGVmaW5lZChfX0JFT1NfXykgJmFtcDsmYW1wOyAhZGVmaW5lZChfX0NZR1dJTl9fKQorI2RlZmluZSBYTUxDQUxMIF9fY2RlY2wKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pCisjZGVmaW5lIFhNTENBTEwgX19hdHRyaWJ1dGVfXygoY2RlY2wpKQorI2Vsc2UKKyNkZWZpbmUgWE1MQ0FMTAorI2VuZGlmCisjZW5kaWYKKzwvcHJlPgorCis8cD5BZnRlciBjcmVhdGluZyB0aGUgcGFyc2VyLCB0aGUgbWFpbiBwcm9ncmFtIGp1c3QgaGFzIHRoZSBqb2Igb2YKK3Nob3ZlbGluZyB0aGUgZG9jdW1lbnQgdG8gdGhlIHBhcnNlciBzbyB0aGF0IGl0IGNhbiBkbyBpdHMgd29yay48L3A+CisKKzxociAvPgorPGgyPjxhIG5hbWU9ImJ1aWxkaW5nIj5CdWlsZGluZyBhbmQgSW5zdGFsbGluZyBFeHBhdDwvYT48L2gyPgorCis8cD5UaGUgRXhwYXQgZGlzdHJpYnV0aW9uIGNvbWVzIGFzIGEgY29tcHJlc3NlZCAod2l0aCBHTlUgZ3ppcCkgdGFyCitmaWxlLiAgWW91IG1heSBkb3dubG9hZCB0aGUgbGF0ZXN0IHZlcnNpb24gZnJvbSA8YSBocmVmPQorImh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZXhwYXQvIiA+U291cmNlIEZvcmdlPC9hPi4gIEFmdGVyCit1bnBhY2tpbmcgdGhpcywgY2QgaW50byB0aGUgZGlyZWN0b3J5LiBUaGVuIGZvbGxvdyBlaXRoZXIgdGhlIFdpbjMyCitkaXJlY3Rpb25zIG9yIFVuaXggZGlyZWN0aW9ucyBiZWxvdy48L3A+CisKKzxoMz5CdWlsZGluZyB1bmRlciBXaW4zMjwvaDM+CisKKzxwPklmIHlvdSdyZSB1c2luZyB0aGUgR05VIGNvbXBpbGVyIHVuZGVyIGN5Z3dpbiwgZm9sbG93IHRoZSBVbml4CitkaXJlY3Rpb25zIGluIHRoZSBuZXh0IHNlY3Rpb24uIE90aGVyd2lzZSBpZiB5b3UgaGF2ZSBNaWNyb3NvZnQncworRGV2ZWxvcGVyIFN0dWRpbyBpbnN0YWxsZWQsIHRoZW4gZnJvbSBXaW5kb3dzIEV4cGxvcmVyIGRvdWJsZS1jbGljayBvbgorImV4cGF0LmRzcCIgaW4gdGhlIGxpYiBkaXJlY3RvcnkgYW5kIGJ1aWxkIGFuZCBpbnN0YWxsIGluIHRoZSB1c3VhbAorbWFubmVyLjwvcD4KKworPHA+QWx0ZXJuYXRpdmVseSwgeW91IG1heSBkb3dubG9hZCB0aGUgV2luMzIgYmluYXJ5IHBhY2thZ2UgdGhhdAorY29udGFpbnMgdGhlICJleHBhdC5oIiBpbmNsdWRlIGZpbGUgYW5kIGEgcHJlLWJ1aWx0IERMTC48L3A+CisKKzxoMz5CdWlsZGluZyB1bmRlciBVbml4IChvciBHTlUpPC9oMz4KKworPHA+Rmlyc3QgeW91J2xsIG5lZWQgdG8gcnVuIHRoZSBjb25maWd1cmUgc2hlbGwgc2NyaXB0IGluIG9yZGVyIHRvCitjb25maWd1cmUgdGhlIE1ha2VmaWxlcyBhbmQgaGVhZGVycyBmb3IgeW91ciBzeXN0ZW0uPC9wPgorCis8cD5JZiB5b3UncmUgaGFwcHkgd2l0aCBhbGwgdGhlIGRlZmF1bHRzIHRoYXQgY29uZmlndXJlIHBpY2tzIGZvciB5b3UsCithbmQgeW91IGhhdmUgcGVybWlzc2lvbiBvbiB5b3VyIHN5c3RlbSB0byBpbnN0YWxsIGludG8gL3Vzci9sb2NhbCwgeW91CitjYW4gaW5zdGFsbCBFeHBhdCB3aXRoIHRoaXMgc2VxdWVuY2Ugb2YgY29tbWFuZHM6PC9wPgorCis8cHJlIGNsYXNzPSJlZyI+CisuL2NvbmZpZ3VyZQorbWFrZQorbWFrZSBpbnN0YWxsCis8L3ByZT4KKworPHA+VGhlcmUgYXJlIHNvbWUgb3B0aW9ucyB0aGF0IHlvdSBjYW4gcHJvdmlkZSB0byB0aGlzIHNjcmlwdCwgYnV0IHRoZQorb25seSBvbmUgd2UnbGwgbWVudGlvbiBoZXJlIGlzIHRoZSA8Y29kZT4tLXByZWZpeDwvY29kZT4gb3B0aW9uLiBZb3UKK2NhbiBmaW5kIG91dCBhbGwgdGhlIG9wdGlvbnMgYXZhaWxhYmxlIGJ5IHJ1bm5pbmcgY29uZmlndXJlIHdpdGgganVzdAordGhlIDxjb2RlPi0taGVscDwvY29kZT4gb3B0aW9uLjwvcD4KKworPHA+QnkgZGVmYXVsdCwgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgc2V0cyB0aGluZ3MgdXAgc28gdGhhdCB0aGUgbGlicmFyeQorZ2V0cyBpbnN0YWxsZWQgaW4gPGNvZGU+L3Vzci9sb2NhbC9saWI8L2NvZGU+IGFuZCB0aGUgYXNzb2NpYXRlZAoraGVhZGVyIGZpbGUgaW4gPGNvZGU+L3Vzci9sb2NhbC9pbmNsdWRlPC9jb2RlPi4gIEJ1dCBpZiB5b3Ugd2VyZSB0bworZ2l2ZSB0aGUgb3B0aW9uLCA8Y29kZT4tLXByZWZpeD0vaG9tZS9tZS9teXN0dWZmPC9jb2RlPiwgdGhlbiB0aGUKK2xpYnJhcnkgYW5kIGhlYWRlciB3b3VsZCBnZXQgaW5zdGFsbGVkIGluCis8Y29kZT4vaG9tZS9tZS9teXN0dWZmL2xpYjwvY29kZT4gYW5kCis8Y29kZT4vaG9tZS9tZS9teXN0dWZmL2luY2x1ZGU8L2NvZGU+IHJlc3BlY3RpdmVseS48L3A+CisKKzxoMz5Db25maWd1cmluZyBFeHBhdCBVc2luZyB0aGUgUHJlLVByb2Nlc3NvcjwvaDM+CisKKzxwPkV4cGF0J3MgZmVhdHVyZSBzZXQgY2FuIGJlIGNvbmZpZ3VyZWQgdXNpbmcgYSBzbWFsbCBudW1iZXIgb2YKK3ByZS1wcm9jZXNzb3IgZGVmaW5pdGlvbnMuICBUaGUgZGVmaW5pdGlvbiBvZiB0aGlzIHN5bWJvbHMgZG9lcyBub3QKK2FmZmVjdCB0aGUgc2V0IG9mIGVudHJ5IHBvaW50cyBmb3IgRXhwYXQsIG9ubHkgdGhlIGJlaGF2aW9yIG9mIHRoZSBBUEkKK2FuZCB0aGUgZGVmaW5pdGlvbiBvZiBjaGFyYWN0ZXIgdHlwZXMgaW4gdGhlIGNhc2Ugb2YKKzxjb2RlPlhNTF9VTklDT0RFX1dDSEFSX1Q8L2NvZGU+LiAgVGhlIHN5bWJvbHMgYXJlOjwvcD4KKworPGRsIGNsYXNzPSJjcHAtc3ltYm9scyI+Cis8ZHQ+WE1MX0RURDwvZHQ+Cis8ZGQ+SW5jbHVkZSBzdXBwb3J0IGZvciB1c2luZyBhbmQgcmVwb3J0aW5nIERURC1iYXNlZCBjb250ZW50LiAgSWYKK3RoaXMgaXMgZGVmaW5lZCwgZGVmYXVsdCBhdHRyaWJ1dGUgdmFsdWVzIGZyb20gYW4gZXh0ZXJuYWwgRFREIHN1YnNldAorYXJlIHJlcG9ydGVkIGFuZCBhdHRyaWJ1dGUgdmFsdWUgbm9ybWFsaXphdGlvbiBvY2N1cnMgYmFzZWQgb24gdGhlCit0eXBlIG9mIGF0dHJpYnV0ZXMgZGVmaW5lZCBpbiB0aGUgZXh0ZXJuYWwgc3Vic2V0LiAgV2l0aG91dAordGhpcywgRXhwYXQgaGFzIGEgc21hbGxlciBtZW1vcnkgZm9vdHByaW50IGFuZCBjYW4gYmUgZmFzdGVyLCBidXQgd2lsbAorbm90IGxvYWQgZXh0ZXJuYWwgZW50aXRpZXMgb3IgcHJvY2VzcyBjb25kaXRpb25hbCBzZWN0aW9ucy4gIFRoaXMgZG9lcworbm90IGFmZmVjdCB0aGUgc2V0IG9mIGZ1bmN0aW9ucyBhdmFpbGFibGUgaW4gdGhlIEFQSS48L2RkPgorCis8ZHQ+WE1MX05TPC9kdD4KKzxkZD5XaGVuIGRlZmluZWQsIHN1cHBvcnQgZm9yIHRoZSA8Y2l0ZT48YSBocmVmPQorImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwtbmFtZXMvIiA+TmFtZXNwYWNlcyBpbiBYTUw8L2E+PC9jaXRlPgorc3BlY2lmaWNhdGlvbiBpcyBpbmNsdWRlZC48L2RkPgorCis8ZHQ+WE1MX1VOSUNPREU8L2R0PgorPGRkPldoZW4gZGVmaW5lZCwgY2hhcmFjdGVyIGRhdGEgcmVwb3J0ZWQgdG8gdGhlIGFwcGxpY2F0aW9uIGlzCitlbmNvZGVkIGluIFVURi0xNiB1c2luZyB3aWRlIGNoYXJhY3RlcnMgb2YgdGhlIHR5cGUKKzxjb2RlPlhNTF9DaGFyPC9jb2RlPi4gIFRoaXMgaXMgaW1wbGllZCBpZgorPGNvZGU+WE1MX1VOSUNPREVfV0NIQVJfVDwvY29kZT4gaXMgZGVmaW5lZC48L2RkPgorCis8ZHQ+WE1MX1VOSUNPREVfV0NIQVJfVDwvZHQ+Cis8ZGQ+SWYgZGVmaW5lZCwgY2F1c2VzIHRoZSA8Y29kZT5YTUxfQ2hhcjwvY29kZT4gY2hhcmFjdGVyIHR5cGUgdG8gYmUKK2RlZmluZWQgdXNpbmcgdGhlIDxjb2RlPndjaGFyX3Q8L2NvZGU+IHR5cGU7IG90aGVyd2lzZSwgPGNvZGU+dW5zaWduZWQKK3Nob3J0PC9jb2RlPiBpcyB1c2VkLiAgRGVmaW5pbmcgdGhpcyBpbXBsaWVzCis8Y29kZT5YTUxfVU5JQ09ERTwvY29kZT4uPC9kZD4KKworPGR0PlhNTF9MQVJHRV9TSVpFPC9kdD4KKzxkZD5JZiBkZWZpbmVkLCBjYXVzZXMgdGhlIDxjb2RlPlhNTF9TaXplPC9jb2RlPiBhbmQgPGNvZGU+WE1MX0luZGV4PC9jb2RlPgoraW50ZWdlciB0eXBlcyB0byBiZSBhdCBsZWFzdCA2NCBiaXRzIGluIHNpemUuIFRoaXMgaXMgaW50ZW5kZWQgdG8gc3VwcG9ydAorcHJvY2Vzc2luZyBvZiB2ZXJ5IGxhcmdlIGlucHV0IHN0cmVhbXMsIHdoZXJlIHRoZSByZXR1cm4gdmFsdWVzIG9mCis8Y29kZT48YSBocmVmPSIjWE1MX0dldEN1cnJlbnRCeXRlSW5kZXgiID5YTUxfR2V0Q3VycmVudEJ5dGVJbmRleDwvYT48L2NvZGU+LAorPGNvZGU+PGEgaHJlZj0iI1hNTF9HZXRDdXJyZW50TGluZU51bWJlciIgPlhNTF9HZXRDdXJyZW50TGluZU51bWJlcjwvYT48L2NvZGU+IGFuZAorPGNvZGU+PGEgaHJlZj0iI1hNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyIiA+WE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXI8L2E+PC9jb2RlPgorY291bGQgb3ZlcmZsb3cuIEl0IG1heSBub3QgYmUgc3VwcG9ydGVkIGJ5IGFsbCBjb21waWxlcnMsIGFuZCBpcyB0dXJuZWQKK29mZiBieSBkZWZhdWx0LjwvZGQ+CisKKzxkdD5YTUxfQ09OVEVYVF9CWVRFUzwvZHQ+Cis8ZGQ+VGhlIG51bWJlciBvZiBpbnB1dCBieXRlcyBvZiBtYXJrdXAgY29udGV4dCB3aGljaCB0aGUgcGFyc2VyIHdpbGwKK2Vuc3VyZSBhcmUgYXZhaWxhYmxlIGZvciByZXBvcnRpbmcgdmlhIDxjb2RlPjxhIGhyZWY9CisiI1hNTF9HZXRJbnB1dENvbnRleHQiID5YTUxfR2V0SW5wdXRDb250ZXh0PC9hPjwvY29kZT4uICBUaGlzIGlzCitub3JtYWxseSBzZXQgdG8gMTAyNCwgYW5kIG11c3QgYmUgc2V0IHRvIGEgcG9zaXRpdmUgaW50ZXJnZXIuICBJZiB0aGlzCitpcyBub3QgZGVmaW5lZCwgdGhlIGlucHV0IGNvbnRleHQgd2lsbCBub3QgYmUgYXZhaWxhYmxlIGFuZCA8Y29kZT48YQoraHJlZj0gIiNYTUxfR2V0SW5wdXRDb250ZXh0IiA+WE1MX0dldElucHV0Q29udGV4dDwvYT48L2NvZGU+IHdpbGwKK2Fsd2F5cyByZXBvcnQgTlVMTC4gIFdpdGhvdXQgdGhpcywgRXhwYXQgaGFzIGEgc21hbGxlciBtZW1vcnkKK2Zvb3RwcmludCBhbmQgY2FuIGJlIGZhc3Rlci48L2RkPgorCis8ZHQ+WE1MX1NUQVRJQzwvZHQ+Cis8ZGQ+T24gV2luZG93cywgdGhpcyBzaG91bGQgYmUgc2V0IGlmIEV4cGF0IGlzIGdvaW5nIHRvIGJlIGxpbmtlZAorc3RhdGljYWxseSB3aXRoIHRoZSBjb2RlIHRoYXQgY2FsbHMgaXQ7IHRoaXMgaXMgcmVxdWlyZWQgdG8gZ2V0IGFsbAordGhlIHJpZ2h0IE1TVkMgbWFnaWMgYW5ub3RhdGlvbnMgY29ycmVjdC4gIFRoaXMgaXMgaWdub3JlZCBvbiBvdGhlcgorcGxhdGZvcm1zLjwvZGQ+Cis8L2RsPgorCis8aHIgLz4KKzxoMj48YSBuYW1lPSJ1c2luZyI+VXNpbmcgRXhwYXQ8L2E+PC9oMj4KKworPGgzPkNvbXBpbGluZyBhbmQgTGlua2luZyBBZ2FpbnN0IEV4cGF0PC9oMz4KKworPHA+VW5sZXNzIHlvdSBpbnN0YWxsZWQgRXhwYXQgaW4gYSBsb2NhdGlvbiBub3QgZXhwZWN0ZWQgYnkgeW91cgorY29tcGlsZXIgYW5kIGxpbmtlciwgYWxsIHlvdSBoYXZlIHRvIGRvIHRvIHVzZSBFeHBhdCBpbiB5b3VyIHByb2dyYW1zCitpcyB0byBpbmNsdWRlIHRoZSBFeHBhdCBoZWFkZXIgKDxjb2RlPiNpbmNsdWRlICZsdDtleHBhdC5oJmd0OzwvY29kZT4pCitpbiB5b3VyIGZpbGVzIHRoYXQgbWFrZSBjYWxscyB0byBpdCBhbmQgdG8gdGVsbCB0aGUgbGlua2VyIHRoYXQgaXQKK25lZWRzIHRvIGxpbmsgYWdhaW5zdCB0aGUgRXhwYXQgbGlicmFyeS4gIE9uIFVuaXggc3lzdGVtcywgdGhpcyB3b3VsZAordXN1YWxseSBiZSBkb25lIHdpdGggdGhlIDxjb2RlPi1sZXhwYXQ8L2NvZGU+IGFyZ3VtZW50LiAgT3RoZXJ3aXNlLAoreW91J2xsIG5lZWQgdG8gdGVsbCB0aGUgY29tcGlsZXIgd2hlcmUgdG8gbG9vayBmb3IgdGhlIEV4cGF0IGhlYWRlcgorYW5kIHRoZSBsaW5rZXIgd2hlcmUgdG8gZmluZCB0aGUgRXhwYXQgbGlicmFyeS4gIFlvdSBtYXkgYWxzbyBuZWVkIHRvCit0YWtlIHN0ZXBzIHRvIHRlbGwgdGhlIG9wZXJhdGluZyBzeXN0ZW0gd2hlcmUgdG8gZmluZCB0aGlzIGxpYnJhcnkgYXQKK3J1biB0aW1lLjwvcD4KKworPHA+T24gYSBVbml4LWJhc2VkIHN5c3RlbSwgaGVyZSdzIHdoYXQgYSBNYWtlZmlsZSBtaWdodCBsb29rIGxpa2Ugd2hlbgorRXhwYXQgaXMgaW5zdGFsbGVkIGluIGEgc3RhbmRhcmQgbG9jYXRpb246PC9wPgorCis8cHJlIGNsYXNzPSJlZyI+CitDQz1jYworTERGTEFHUz0KK0xJQlM9IC1sZXhwYXQKK3htbGFwcDogeG1sYXBwLm8KKyAgICAgICAgJChDQykgJChMREZMQUdTKSAtbyB4bWxhcHAgeG1sYXBwLm8gJChMSUJTKQorPC9wcmU+CisKKzxwPklmIHlvdSBpbnN0YWxsZWQgRXhwYXQgaW4sIHNheSwgPGNvZGU+L2hvbWUvbWUvbXlzdHVmZjwvY29kZT4sIHRoZW4KK3RoZSBNYWtlZmlsZSB3b3VsZCBsb29rIGxpa2UgdGhpczo8L3A+CisKKzxwcmUgY2xhc3M9ImVnIj4KK0NDPWNjCitDRkxBR1M9IC1JL2hvbWUvbWUvbXlzdHVmZi9pbmNsdWRlCitMREZMQUdTPQorTElCUz0gLUwvaG9tZS9tZS9teXN0dWZmL2xpYiAtbGV4cGF0Cit4bWxhcHA6IHhtbGFwcC5vCisgICAgICAgICQoQ0MpICQoTERGTEFHUykgLW8geG1sYXBwIHhtbGFwcC5vICQoTElCUykKKzwvcHJlPgorCis8cD5Zb3UnZCBhbHNvIGhhdmUgdG8gc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorPGNvZGU+TERfTElCUkFSWV9QQVRIPC9jb2RlPiB0byA8Y29kZT4vaG9tZS9tZS9teXN0dWZmL2xpYjwvY29kZT4gKG9yCit0byA8Y29kZT4ke0xEX0xJQlJBUllfUEFUSH06L2hvbWUvbWUvbXlzdHVmZi9saWI8L2NvZGU+IGlmCitMRF9MSUJSQVJZX1BBVEggYWxyZWFkeSBoYXMgc29tZSBkaXJlY3RvcmllcyBpbiBpdCkgaW4gb3JkZXIgdG8gcnVuCit5b3VyIGFwcGxpY2F0aW9uLjwvcD4KKworPGgzPkV4cGF0IEJhc2ljczwvaDM+CisKKzxwPkFzIHdlIHNhdyBpbiB0aGUgZXhhbXBsZSBpbiB0aGUgb3ZlcnZpZXcsIHRoZSBmaXJzdCBzdGVwIGluIHBhcnNpbmcKK2FuIFhNTCBkb2N1bWVudCB3aXRoIEV4cGF0IGlzIHRvIGNyZWF0ZSBhIHBhcnNlciBvYmplY3QuIFRoZXJlIGFyZSA8YQoraHJlZj0iI2NyZWF0aW9uIj50aHJlZSBmdW5jdGlvbnM8L2E+IGluIHRoZSBFeHBhdCBBUEkgZm9yIGNyZWF0aW5nIGEKK3BhcnNlciBvYmplY3QuICBIb3dldmVyLCBvbmx5IHR3byBvZiB0aGVzZSAoPGNvZGU+PGEgaHJlZj0KKyIjWE1MX1BhcnNlckNyZWF0ZSIgPlhNTF9QYXJzZXJDcmVhdGU8L2E+PC9jb2RlPiBhbmQgPGNvZGU+PGEgaHJlZj0KKyIjWE1MX1BhcnNlckNyZWF0ZU5TIiA+WE1MX1BhcnNlckNyZWF0ZU5TPC9hPjwvY29kZT4pIGNhbiBiZSB1c2VkIGZvcgorY29uc3RydWN0aW5nIGEgcGFyc2VyIGZvciBhIHRvcC1sZXZlbCBkb2N1bWVudC4gIFRoZSBvYmplY3QgcmV0dXJuZWQKK2J5IHRoZXNlIGZ1bmN0aW9ucyBpcyBhbiBvcGFxdWUgcG9pbnRlciAoaS5lLiAiZXhwYXQuaCIgZGVjbGFyZXMgaXQgYXMKK3ZvaWQgKikgdG8gZGF0YSB3aXRoIGZ1cnRoZXIgaW50ZXJuYWwgc3RydWN0dXJlLiBJbiBvcmRlciB0byBmcmVlIHRoZQorbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdCB5b3UgbXVzdCBjYWxsIDxjb2RlPjxhIGhyZWY9CisiI1hNTF9QYXJzZXJGcmVlIiA+WE1MX1BhcnNlckZyZWU8L2E+PC9jb2RlPi4gTm90ZSB0aGF0IGlmIHlvdSBoYXZlCitwcm92aWRlZCBhbnkgPGEgaHJlZj0iI3VzZXJkYXRhIj51c2VyIGRhdGE8L2E+IHRoYXQgZ2V0cyBzdG9yZWQgaW4gdGhlCitwYXJzZXIsIHRoZW4geW91ciBhcHBsaWNhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyBpdCBwcmlvciB0bworY2FsbGluZyA8Y29kZT5YTUxfUGFyc2VyRnJlZTwvY29kZT4uPC9wPgorCis8cD5UaGUgb2JqZWN0cyByZXR1cm5lZCBieSB0aGUgcGFyc2VyIGNyZWF0aW9uIGZ1bmN0aW9ucyBhcmUgZ29vZCBmb3IKK3BhcnNpbmcgb25seSBvbmUgWE1MIGRvY3VtZW50IG9yIGV4dGVybmFsIHBhcnNlZCBlbnRpdHkuIElmIHlvdXIKK2FwcGxpY2F0aW9uIG5lZWRzIHRvIHBhcnNlIG1hbnkgWE1MIGRvY3VtZW50cywgdGhlbiBpdCBuZWVkcyB0byBjcmVhdGUKK2EgcGFyc2VyIG9iamVjdCBmb3IgZWFjaCBvbmUuIFRoZSBiZXN0IHdheSB0byBkZWFsIHdpdGggdGhpcyBpcyB0bworY3JlYXRlIGEgaGlnaGVyIGxldmVsIG9iamVjdCB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgZGVmYXVsdAoraW5pdGlhbGl6YXRpb24geW91IHdhbnQgZm9yIHlvdXIgcGFyc2VyIG9iamVjdHMuPC9wPgorCis8cD5XYWxraW5nIHRocm91Z2ggYSBkb2N1bWVudCBoaWVyYXJjaHkgd2l0aCBhIHN0cmVhbSBvcmllbnRlZCBwYXJzZXIKK3dpbGwgcmVxdWlyZSBhIGdvb2Qgc3RhY2sgbWVjaGFuaXNtIGluIG9yZGVyIHRvIGtlZXAgdHJhY2sgb2YgY3VycmVudAorY29udGV4dC4gIEZvciBpbnN0YW5jZSwgdG8gYW5zd2VyIHRoZSBzaW1wbGUgcXVlc3Rpb24sICJXaGF0IGVsZW1lbnQKK2RvZXMgdGhpcyB0ZXh0IGJlbG9uZyB0bz8iIHJlcXVpcmVzIGEgc3RhY2ssIHNpbmNlIHRoZSBwYXJzZXIgbWF5IGhhdmUKK2Rlc2NlbmRlZCBpbnRvIG90aGVyIGVsZW1lbnRzIHRoYXQgYXJlIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IG9uZSBhbmQKK2hhcyBlbmNvdW50ZXJlZCB0aGlzIHRleHQgb24gdGhlIHdheSBvdXQuPC9wPgorCis8cD5UaGUgdGhpbmdzIHlvdSdyZSBsaWtlbHkgdG8gd2FudCB0byBrZWVwIG9uIGEgc3RhY2sgYXJlIHRoZQorY3VycmVudGx5IG9wZW5lZCBlbGVtZW50IGFuZCBpdCdzIGF0dHJpYnV0ZXMuIFlvdSBwdXNoIHRoaXMKK2luZm9ybWF0aW9uIG9udG8gdGhlIHN0YWNrIGluIHRoZSBzdGFydCBoYW5kbGVyIGFuZCB5b3UgcG9wIGl0IG9mZiBpbgordGhlIGVuZCBoYW5kbGVyLjwvcD4KKworPHA+Rm9yIHNvbWUgdGFza3MsIGl0IGlzIHN1ZmZpY2llbnQgdG8ganVzdCBrZWVwIGluZm9ybWF0aW9uIG9uIHdoYXQKK3RoZSBkZXB0aCBvZiB0aGUgc3RhY2sgaXMgKG9yIHdvdWxkIGJlIGlmIHlvdSBoYWQgb25lLikgVGhlIG91dGxpbmUKK3Byb2dyYW0gc2hvd24gYWJvdmUgcHJlc2VudHMgb25lIGV4YW1wbGUuIEFub3RoZXIgc3VjaCB0YXNrIHdvdWxkIGJlCitza2lwcGluZyBvdmVyIGEgY29tcGxldGUgZWxlbWVudC4gV2hlbiB5b3Ugc2VlIHRoZSBzdGFydCB0YWcgZm9yIHRoZQorZWxlbWVudCB5b3Ugd2FudCB0byBza2lwLCB5b3Ugc2V0IGEgc2tpcCBmbGFnIGFuZCByZWNvcmQgdGhlIGRlcHRoIGF0Cit3aGljaCB0aGUgZWxlbWVudCBzdGFydGVkLiAgV2hlbiB0aGUgZW5kIHRhZyBoYW5kbGVyIGVuY291bnRlcnMgdGhlCitzYW1lIGRlcHRoLCB0aGUgc2tpcHBlZCBlbGVtZW50IGhhcyBlbmRlZCBhbmQgdGhlIGZsYWcgbWF5IGJlCitjbGVhcmVkLiBJZiB5b3UgZm9sbG93IHRoZSBjb252ZW50aW9uIHRoYXQgdGhlIHJvb3QgZWxlbWVudCBzdGFydHMgYXQKKzEsIHRoZW4geW91IGNhbiB1c2UgdGhlIHNhbWUgdmFyaWFibGUgZm9yIHNraXAgZmxhZyBhbmQgc2tpcAorZGVwdGguPC9wPgorCis8cHJlIGNsYXNzPSJlZyI+Cit2b2lkCitpbml0X2luZm8oUGFyc2VpbmZvICppbmZvKSB7CisgIGluZm8tPnNraXAgPSAwOworICBpbmZvLT5kZXB0aCA9IDE7CisgIC8qIE90aGVyIGluaXRpYWxpemF0aW9ucyBoZXJlICovCit9ICAvKiBFbmQgb2YgaW5pdF9pbmZvICovCisKK3ZvaWQgWE1MQ0FMTAorcmF3c3RhcnQodm9pZCAqZGF0YSwgY29uc3QgY2hhciAqZWwsIGNvbnN0IGNoYXIgKiphdHRyKSB7CisgIFBhcnNlaW5mbyAqaW5mID0gKFBhcnNlaW5mbyAqKSBkYXRhOworCisgIGlmICghIGluZi0+c2tpcCkgeworICAgIGlmIChzaG91bGRfc2tpcChpbmYsIGVsLCBhdHRyKSkgeworICAgICAgaW5mLT5za2lwID0gaW5mLT5kZXB0aDsKKyAgICB9CisgICAgZWxzZQorICAgICAgc3RhcnQoaW5mLCBlbCwgYXR0cik7ICAgICAvKiBUaGlzIGRvZXMgcmVzdCBvZiBzdGFydCBoYW5kbGluZyAqLworICB9CisKKyAgaW5mLT5kZXB0aCsrOworfSAgLyogRW5kIG9mIHJhd3N0YXJ0ICovCisKK3ZvaWQgWE1MQ0FMTAorcmF3ZW5kKHZvaWQgKmRhdGEsIGNvbnN0IGNoYXIgKmVsKSB7CisgIFBhcnNlaW5mbyAqaW5mID0gKFBhcnNlaW5mbyAqKSBkYXRhOworCisgIGluZi0+ZGVwdGgtLTsKKworICBpZiAoISBpbmYtPnNraXApCisgICAgZW5kKGluZiwgZWwpOyAgICAgICAgICAgICAgLyogVGhpcyBkb2VzIHJlc3Qgb2YgZW5kIGhhbmRsaW5nICovCisKKyAgaWYgKGluZi0+c2tpcCA9PSBpbmYtPmRlcHRoKQorICAgIGluZi0+c2tpcCA9IDA7Cit9ICAvKiBFbmQgcmF3ZW5kICovCis8L3ByZT4KKworPHA+Tm90aWNlIGluIHRoZSBhYm92ZSBleGFtcGxlIHRoZSBkaWZmZXJlbmNlIGluIGhvdyBkZXB0aCBpcworbWFuaXB1bGF0ZWQgaW4gdGhlIHN0YXJ0IGFuZCBlbmQgaGFuZGxlcnMuIFRoZSBlbmQgdGFnIGhhbmRsZXIgc2hvdWxkCitiZSB0aGUgbWlycm9yIGltYWdlIG9mIHRoZSBzdGFydCB0YWcgaGFuZGxlci4gVGhpcyBpcyBuZWNlc3NhcnkgdG8KK3Byb3Blcmx5IG1vZGVsIGNvbnRhaW5tZW50LiBTaW5jZSwgaW4gdGhlIHN0YXJ0IHRhZyBoYW5kbGVyLCB3ZQoraW5jcmVtZW50ZWQgZGVwdGggPGVtPmFmdGVyPC9lbT4gdGhlIG1haW4gYm9keSBvZiBzdGFydCB0YWcgY29kZSwgdGhlbgoraW4gdGhlIGVuZCBoYW5kbGVyLCB3ZSBuZWVkIHRvIG1hbmlwdWxhdGUgaXQgPGVtPmJlZm9yZTwvZW0+IHRoZSBtYWluCitib2R5LiAgSWYgd2UnZCBkZWNpZGVkIHRvIGluY3JlbWVudCBpdCBmaXJzdCB0aGluZyBpbiB0aGUgc3RhcnQKK2hhbmRsZXIsIHRoZW4gd2UnZCBoYXZlIGhhZCB0byBkZWNyZW1lbnQgaXQgbGFzdCB0aGluZyBpbiB0aGUgZW5kCitoYW5kbGVyLjwvcD4KKworPGgzIGlkPSJ1c2VyZGF0YSI+Q29tbXVuaWNhdGluZyBiZXR3ZWVuIGhhbmRsZXJzPC9oMz4KKworPHA+SW4gb3JkZXIgdG8gYmUgYWJsZSB0byBwYXNzIGluZm9ybWF0aW9uIGJldHdlZW4gZGlmZmVyZW50IGhhbmRsZXJzCit3aXRob3V0IHVzaW5nIGdsb2JhbHMsIHlvdSdsbCBuZWVkIHRvIGRlZmluZSBhIGRhdGEgc3RydWN0dXJlIHRvIGhvbGQKK3RoZSBzaGFyZWQgdmFyaWFibGVzLiBZb3UgY2FuIHRoZW4gdGVsbCBFeHBhdCAod2l0aCB0aGUgPGNvZGU+PGEgaHJlZj0KKyIjWE1MX1NldFVzZXJEYXRhIiA+WE1MX1NldFVzZXJEYXRhPC9hPjwvY29kZT4gZnVuY3Rpb24pIHRvIHBhc3MgYQorcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSB0byB0aGUgaGFuZGxlcnMuICBUaGlzIGlzIHRoZSBmaXJzdAorYXJndW1lbnQgcmVjZWl2ZWQgYnkgbW9zdCBoYW5kbGVycy4gIEluIHRoZSA8YSBocmVmPSIjcmVmZXJlbmNlIgorPnJlZmVyZW5jZSBzZWN0aW9uPC9hPiwgYW4gYXJndW1lbnQgdG8gYSBjYWxsYmFjayBmdW5jdGlvbiBpcyBuYW1lZAorPGNvZGU+dXNlckRhdGE8L2NvZGU+IGFuZCBoYXZlIHR5cGUgPGNvZGU+dm9pZCAqPC9jb2RlPiBpZiB0aGUgdXNlcgorZGF0YSBpcyBwYXNzZWQ7IGl0IHdpbGwgaGF2ZSB0aGUgdHlwZSA8Y29kZT5YTUxfUGFyc2VyPC9jb2RlPiBpZiB0aGUKK3BhcnNlciBpdHNlbGYgaXMgcGFzc2VkLiAgV2hlbiB0aGUgcGFyc2VyIGlzIHBhc3NlZCwgdGhlIHVzZXIgZGF0YSBtYXkKK2JlIHJldHJpZXZlZCB1c2luZyA8Y29kZT48YSBocmVmPSIjWE1MX0dldFVzZXJEYXRhIgorPlhNTF9HZXRVc2VyRGF0YTwvYT48L2NvZGU+LjwvcD4KKworPHA+T25lIGNvbW1vbiBjYXNlIHdoZXJlIG11bHRpcGxlIGNhbGxzIHRvIGEgc2luZ2xlIGhhbmRsZXIgbWF5IG5lZWQKK3RvIGNvbW11bmljYXRlIHVzaW5nIGFuIGFwcGxpY2F0aW9uIGRhdGEgc3RydWN0dXJlIGlzIHRoZSBjYXNlIHdoZW4KK2NvbnRlbnQgcGFzc2VkIHRvIHRoZSBjaGFyYWN0ZXIgZGF0YSBoYW5kbGVyIChzZXQgYnkgPGNvZGU+PGEgaHJlZj0KKyIjWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyIgorPlhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcjwvYT48L2NvZGU+KSBuZWVkcyB0byBiZSBhY2N1bXVsYXRlZC4gIEEKK2NvbW1vbiBmaXJzdC10aW1lIG1pc3Rha2Ugd2l0aCBhbnkgb2YgdGhlIGV2ZW50LW9yaWVudGVkIGludGVyZmFjZXMgdG8KK2FuIFhNTCBwYXJzZXIgaXMgdG8gZXhwZWN0IGFsbCB0aGUgdGV4dCBjb250YWluZWQgaW4gYW4gZWxlbWVudCB0byBiZQorcmVwb3J0ZWQgYnkgYSBzaW5nbGUgY2FsbCB0byB0aGUgY2hhcmFjdGVyIGRhdGEgaGFuZGxlci4gIEV4cGF0LCBsaWtlCittYW55IG90aGVyIFhNTCBwYXJzZXJzLCByZXBvcnRzIHN1Y2ggZGF0YSBhcyBhIHNlcXVlbmNlIG9mIGNhbGxzOwordGhlcmUncyBubyB3YXkgdG8ga25vdyB3aGVuIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlIGlzIHJlYWNoZWQgdW50aWwgYQorZGlmZmVyZW50IGNhbGxiYWNrIGlzIG1hZGUuICBBIGJ1ZmZlciByZWZlcmVuY2VkIGJ5IHRoZSB1c2VyIGRhdGEKK3N0cnVjdHVyZSBwcm92ZXMgYm90aCBhbiBlZmZlY3RpdmUgYW5kIGNvbnZlbmllbnQgcGxhY2UgdG8gYWNjdW11bGF0ZQorY2hhcmFjdGVyIGRhdGEuPC9wPgorCis8IS0tIFhYWCBleGFtcGxlIG5lZWRlZCBoZXJlIC0tPgorCisKKzxoMz5YTUwgVmVyc2lvbjwvaDM+CisKKzxwPkV4cGF0IGlzIGFuIFhNTCAxLjAgcGFyc2VyLCBhbmQgYXMgc3VjaCBuZXZlciBjb21wbGFpbnMgYmFzZWQgb24KK3RoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+dmVyc2lvbjwvY29kZT4gcHNldWRvLWF0dHJpYnV0ZSBpbiB0aGUgWE1MCitkZWNsYXJhdGlvbiwgaWYgcHJlc2VudC48L3A+CisKKzxwPklmIGFuIGFwcGxpY2F0aW9uIG5lZWRzIHRvIGNoZWNrIHRoZSB2ZXJzaW9uIG51bWJlciAodG8gc3VwcG9ydAorYWx0ZXJuYXRlIHByb2Nlc3NpbmcpLCBpdCBzaG91bGQgdXNlIHRoZSA8Y29kZT48YSBocmVmPQorIiNYTUxfU2V0WG1sRGVjbEhhbmRsZXIiID5YTUxfU2V0WG1sRGVjbEhhbmRsZXI8L2E+PC9jb2RlPiBmdW5jdGlvbiB0bworc2V0IGEgaGFuZGxlciB0aGF0IHVzZXMgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBYTUwgZGVjbGFyYXRpb24gdG8KK2RldGVybWluZSB3aGF0IHRvIGRvLiAgVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byBjaGVjayB0aGF0IG9ubHkgYQordmVyc2lvbiBudW1iZXIgb2YgPGNvZGU+IjEuMCI8L2NvZGU+IGlzIGFjY2VwdGVkOjwvcD4KKworPHByZSBjbGFzcz0iZWciPgorc3RhdGljIGludCB3cm9uZ192ZXJzaW9uOworc3RhdGljIFhNTF9QYXJzZXIgcGFyc2VyOworCitzdGF0aWMgdm9pZCBYTUxDQUxMCit4bWxkZWNsX2hhbmRsZXIodm9pZCAgICAgICAgICAgICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAgKnZlcnNpb24sCisgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgICplbmNvZGluZywKKyAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIHN0YW5kYWxvbmUpCit7CisgIHN0YXRpYyBjb25zdCBYTUxfQ2hhciBWZXJzaW9uXzFfMFtdID0geycxJywgJy4nLCAnMCcsIDB9OworCisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgJmx0OyAoc2l6ZW9mKFZlcnNpb25fMV8wKSAvIHNpemVvZihWZXJzaW9uXzFfMFswXSkpOyArK2kpIHsKKyAgICBpZiAodmVyc2lvbltpXSAhPSBWZXJzaW9uXzFfMFtpXSkgeworICAgICAgd3JvbmdfdmVyc2lvbiA9IDE7CisgICAgICAvKiBhbHNvIGNsZWFyIGFsbCBvdGhlciBoYW5kbGVyczogKi8KKyAgICAgIFhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcihwYXJzZXIsIE5VTEwpOworICAgICAgLi4uCisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIC4uLgorfQorPC9wcmU+CisKKzxoMz5OYW1lc3BhY2UgUHJvY2Vzc2luZzwvaDM+CisKKzxwPldoZW4gdGhlIHBhcnNlciBpcyBjcmVhdGVkIHVzaW5nIHRoZSA8Y29kZT48YSBocmVmPQorIiNYTUxfUGFyc2VyQ3JlYXRlTlMiID5YTUxfUGFyc2VyQ3JlYXRlTlM8L2E+PC9jb2RlPiwgZnVuY3Rpb24sIEV4cGF0CitwZXJmb3JtcyBuYW1lc3BhY2UgcHJvY2Vzc2luZy4gVW5kZXIgbmFtZXNwYWNlIHByb2Nlc3NpbmcsIEV4cGF0Citjb25zdW1lcyA8Y29kZT54bWxuczwvY29kZT4gYW5kIDxjb2RlPnhtbG5zOi4uLjwvY29kZT4gYXR0cmlidXRlcywKK3doaWNoIGRlY2xhcmUgbmFtZXNwYWNlcyBmb3IgdGhlIHNjb3BlIG9mIHRoZSBlbGVtZW50IGluIHdoaWNoIHRoZXkKK29jY3VyLiBUaGlzIG1lYW5zIHRoYXQgeW91ciBzdGFydCBoYW5kbGVyIHdpbGwgbm90IHNlZSB0aGVzZQorYXR0cmlidXRlcy4gIFlvdXIgYXBwbGljYXRpb24gY2FuIHN0aWxsIGJlIGluZm9ybWVkIG9mIHRoZXNlCitkZWNsYXJhdGlvbnMgYnkgc2V0dGluZyBuYW1lc3BhY2UgZGVjbGFyYXRpb24gaGFuZGxlcnMgd2l0aCA8YSBocmVmPQorIiNYTUxfU2V0TmFtZXNwYWNlRGVjbEhhbmRsZXIiCis+PGNvZGU+WE1MX1NldE5hbWVzcGFjZURlY2xIYW5kbGVyPC9jb2RlPjwvYT4uPC9wPgorCis8cD5FbGVtZW50IHR5cGUgYW5kIGF0dHJpYnV0ZSBuYW1lcyB0aGF0IGJlbG9uZyB0byBhIGdpdmVuIG5hbWVzcGFjZQorYXJlIHBhc3NlZCB0byB0aGUgYXBwcm9wcmlhdGUgaGFuZGxlciBpbiBleHBhbmRlZCBmb3JtLiBCeSBkZWZhdWx0Cit0aGlzIGV4cGFuZGVkIGZvcm0gaXMgYSBjb25jYXRlbmF0aW9uIG9mIHRoZSBuYW1lc3BhY2UgVVJJLCB0aGUKK3NlcGFyYXRvciBjaGFyYWN0ZXIgKHdoaWNoIGlzIHRoZSAybmQgYXJndW1lbnQgdG8gPGNvZGU+PGEgaHJlZj0KKyIjWE1MX1BhcnNlckNyZWF0ZU5TIiA+WE1MX1BhcnNlckNyZWF0ZU5TPC9hPjwvY29kZT4pLCBhbmQgdGhlIGxvY2FsCituYW1lIChpLmUuIHRoZSBwYXJ0IGFmdGVyIHRoZSBjb2xvbikuIE5hbWVzIHdpdGggdW5kZWNsYXJlZCBwcmVmaXhlcworYXJlIG5vdCB3ZWxsLWZvcm1lZCB3aGVuIG5hbWVzcGFjZSBwcm9jZXNzaW5nIGlzIGVuYWJsZWQsIGFuZCB3aWxsCit0cmlnZ2VyIGFuIGVycm9yLiBVbnByZWZpeGVkIGF0dHJpYnV0ZSBuYW1lcyBhcmUgbmV2ZXIgZXhwYW5kZWQsCithbmQgdW5wcmVmaXhlZCBlbGVtZW50IG5hbWVzIGFyZSBvbmx5IGV4cGFuZGVkIHdoZW4gdGhleSBhcmUgaW4gdGhlCitzY29wZSBvZiBhIGRlZmF1bHQgbmFtZXNwYWNlLjwvcD4KKworPHA+SG93ZXZlciBpZiA8Y29kZT48YSBocmVmPSAiI1hNTF9TZXRSZXR1cm5OU1RyaXBsZXQiCis+WE1MX1NldFJldHVybk5TVHJpcGxldDwvYT48L2NvZGU+IGhhcyBiZWVuIGNhbGxlZCB3aXRoIGEgbm9uLXplcm8KKzxjb2RlPmRvX25zdDwvY29kZT4gcGFyYW1ldGVyLCB0aGVuIHRoZSBleHBhbmRlZCBmb3JtIGZvciBuYW1lcyB3aXRoCithbiBleHBsaWNpdCBwcmVmaXggaXMgYSBjb25jYXRlbmF0aW9uIG9mOiBVUkksIHNlcGFyYXRvciwgbG9jYWwgbmFtZSwKK3NlcGFyYXRvciwgcHJlZml4LjwvcD4KKworPHA+WW91IGNhbiBzZXQgaGFuZGxlcnMgZm9yIHRoZSBzdGFydCBvZiBhIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBhbmQKK2ZvciB0aGUgZW5kIG9mIGEgc2NvcGUgb2YgYSBkZWNsYXJhdGlvbiB3aXRoIHRoZSA8Y29kZT48YSBocmVmPQorIiNYTUxfU2V0TmFtZXNwYWNlRGVjbEhhbmRsZXIiID5YTUxfU2V0TmFtZXNwYWNlRGVjbEhhbmRsZXI8L2E+PC9jb2RlPgorZnVuY3Rpb24uICBUaGUgU3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciBpcyBjYWxsZWQgcHJpb3IgdG8gdGhlIHN0YXJ0Cit0YWcgaGFuZGxlciBhbmQgdGhlIEVuZE5hbWVzcGFjZURlY2xIYW5kbGVyIGlzIGNhbGxlZCBhZnRlciB0aGUKK2NvcnJlc3BvbmRpbmcgZW5kIHRhZyB0aGF0IGVuZHMgdGhlIG5hbWVzcGFjZSdzIHNjb3BlLiAgVGhlIG5hbWVzcGFjZQorc3RhcnQgaGFuZGxlciBnZXRzIHBhc3NlZCB0aGUgcHJlZml4IGFuZCBVUkkgZm9yIHRoZSBuYW1lc3BhY2UuICBGb3IgYQorZGVmYXVsdCBuYW1lc3BhY2UgZGVjbGFyYXRpb24gKHhtbG5zPScuLi4nKSwgdGhlIHByZWZpeCB3aWxsIGJlIG51bGwuCitUaGUgVVJJIHdpbGwgYmUgbnVsbCBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIGlzIGJlaW5nCit1bnNldC4gIFRoZSBuYW1lc3BhY2UgZW5kIGhhbmRsZXIganVzdCBnZXRzIHRoZSBwcmVmaXggZm9yIHRoZSBjbG9zaW5nCitzY29wZS48L3A+CisKKzxwPlRoZXNlIGhhbmRsZXJzIGFyZSBjYWxsZWQgZm9yIGVhY2ggZGVjbGFyYXRpb24uIFNvIGlmLCBmb3IKK2luc3RhbmNlLCBhIHN0YXJ0IHRhZyBoYWQgdGhyZWUgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucywgdGhlbiB0aGUKK1N0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIgd291bGQgYmUgY2FsbGVkIHRocmVlIHRpbWVzIGJlZm9yZSB0aGUgc3RhcnQKK3RhZyBoYW5kbGVyIGlzIGNhbGxlZCwgb25jZSBmb3IgZWFjaCBkZWNsYXJhdGlvbi48L3A+CisKKzxoMz5DaGFyYWN0ZXIgRW5jb2RpbmdzPC9oMz4KKworPHA+V2hpbGUgWE1MIGlzIGJhc2VkIG9uIFVuaWNvZGUsIGFuZCBldmVyeSBYTUwgcHJvY2Vzc29yIGlzIHJlcXVpcmVkCit0byByZWNvZ25pemVkIFVURi04IGFuZCBVVEYtMTYgKDEgYW5kIDIgYnl0ZSBlbmNvZGluZ3Mgb2YgVW5pY29kZSksCitvdGhlciBlbmNvZGluZ3MgbWF5IGJlIGRlY2xhcmVkIGluIFhNTCBkb2N1bWVudHMgb3IgZW50aXRpZXMuIEZvciB0aGUKK21haW4gZG9jdW1lbnQsIGFuIFhNTCBkZWNsYXJhdGlvbiBtYXkgY29udGFpbiBhbiBlbmNvZGluZworZGVjbGFyYXRpb246PC9wPgorPHByZT4KKyZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTIiPyZndDsKKzwvcHJlPgorCis8cD5FeHRlcm5hbCBwYXJzZWQgZW50aXRpZXMgbWF5IGJlZ2luIHdpdGggYSB0ZXh0IGRlY2xhcmF0aW9uLCB3aGljaAorbG9va3MgbGlrZSBhbiBYTUwgZGVjbGFyYXRpb24gd2l0aCBqdXN0IGFuIGVuY29kaW5nIGRlY2xhcmF0aW9uOjwvcD4KKzxwcmU+CismbHQ7P3htbCBlbmNvZGluZz0iQmlnNSI/Jmd0OworPC9wcmU+CisKKzxwPldpdGggRXhwYXQsIHlvdSBtYXkgYWxzbyBzcGVjaWZ5IGFuIGVuY29kaW5nIGF0IHRoZSB0aW1lIG9mCitjcmVhdGluZyBhIHBhcnNlci4gVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgZW5jb2RpbmcgaW5mb3JtYXRpb24gbWF5Citjb21lIGZyb20gYSBzb3VyY2Ugb3V0c2lkZSB0aGUgZG9jdW1lbnQgaXRzZWxmIChsaWtlIGEgaGlnaGVyIGxldmVsCitwcm90b2NvbC4pPC9wPgorCis8cD48YSBuYW1lPSJidWlsdGluX2VuY29kaW5ncyI+PC9hPlRoZXJlIGFyZSBmb3VyIGJ1aWx0LWluIGVuY29kaW5ncworaW4gRXhwYXQ6PC9wPgorPHVsPgorPGxpPlVURi04PC9saT4KKzxsaT5VVEYtMTY8L2xpPgorPGxpPklTTy04ODU5LTE8L2xpPgorPGxpPlVTLUFTQ0lJPC9saT4KKzwvdWw+CisKKzxwPkFueXRoaW5nIGVsc2UgZGlzY292ZXJlZCBpbiBhbiBlbmNvZGluZyBkZWNsYXJhdGlvbiBvciBpbiB0aGUKK3Byb3RvY29sIGVuY29kaW5nIHNwZWNpZmllZCBpbiB0aGUgcGFyc2VyIGNvbnN0cnVjdG9yLCB0cmlnZ2VycyBhIGNhbGwKK3RvIHRoZSA8Y29kZT5Vbmtub3duRW5jb2RpbmdIYW5kbGVyPC9jb2RlPi4gVGhpcyBoYW5kbGVyIGdldHMgcGFzc2VkCit0aGUgZW5jb2RpbmcgbmFtZSBhbmQgYSBwb2ludGVyIHRvIGFuIDxjb2RlPlhNTF9FbmNvZGluZzwvY29kZT4gZGF0YQorc3RydWN0dXJlLiBZb3VyIGhhbmRsZXIgbXVzdCBmaWxsIGluIHRoaXMgc3RydWN0dXJlIGFuZCByZXR1cm4KKzxjb2RlPlhNTF9TVEFUVVNfT0s8L2NvZGU+IGlmIGl0IGtub3dzIGhvdyB0byBkZWFsIHdpdGggdGhlCitlbmNvZGluZy4gT3RoZXJ3aXNlIHRoZSBoYW5kbGVyIHNob3VsZCByZXR1cm4KKzxjb2RlPlhNTF9TVEFUVVNfRVJST1I8L2NvZGU+LiAgVGhlIGhhbmRsZXIgYWxzbyBnZXRzIHBhc3NlZCBhIHBvaW50ZXIKK3RvIGFuIG9wdGlvbmFsIGFwcGxpY2F0aW9uIGRhdGEgc3RydWN0dXJlIHRoYXQgeW91IG1heSBpbmRpY2F0ZSB3aGVuCit5b3Ugc2V0IHRoZSBoYW5kbGVyLjwvcD4KKworPHA+RXhwYXQgcGxhY2VzIHJlc3RyaWN0aW9ucyBvbiBjaGFyYWN0ZXIgZW5jb2RpbmdzIHRoYXQgaXQgY2FuCitzdXBwb3J0IGJ5IGZpbGxpbmcgaW4gdGhlIDxjb2RlPlhNTF9FbmNvZGluZzwvY29kZT4gc3RydWN0dXJlLgoraW5jbHVkZSBmaWxlOjwvcD4KKzxvbD4KKzxsaT5FdmVyeSBBU0NJSSBjaGFyYWN0ZXIgdGhhdCBjYW4gYXBwZWFyIGluIGEgd2VsbC1mb3JtZWQgWE1MIGRvY3VtZW50CittdXN0IGJlIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIGJ5dGUsIGFuZCB0aGF0IGJ5dGUgbXVzdCBjb3JyZXNwb25kIHRvCitpdCdzIEFTQ0lJIGVuY29kaW5nIChleGNlcHQgZm9yIHRoZSBjaGFyYWN0ZXJzICRAXF4ne31+KTwvbGk+Cis8bGk+Q2hhcmFjdGVycyBtdXN0IGJlIGVuY29kZWQgaW4gNCBieXRlcyBvciBsZXNzLjwvbGk+Cis8bGk+QWxsIGNoYXJhY3RlcnMgZW5jb2RlZCBtdXN0IGhhdmUgVW5pY29kZSBzY2FsYXIgdmFsdWVzIGxlc3MgdGhhbiBvcgorZXF1YWwgdG8gNjU1MzUgKDB4RkZGRik8ZW0+VGhpcyBkb2VzIG5vdCBhcHBseSB0byB0aGUgYnVpbHQtaW4gc3VwcG9ydAorZm9yIFVURi0xNiBhbmQgVVRGLTg8L2VtPjwvbGk+Cis8bGk+Tm8gY2hhcmFjdGVyIG1heSBiZSBlbmNvZGVkIGJ5IG1vcmUgdGhhdCBvbmUgZGlzdGluY3Qgc2VxdWVuY2Ugb2YKK2J5dGVzPC9saT4KKzwvb2w+CisKKzxwPjxjb2RlPlhNTF9FbmNvZGluZzwvY29kZT4gY29udGFpbnMgYW4gYXJyYXkgb2YgaW50ZWdlcnMgdGhhdAorY29ycmVzcG9uZCB0byB0aGUgMXN0IGJ5dGUgb2YgYW4gZW5jb2Rpbmcgc2VxdWVuY2UuIElmIHRoZSB2YWx1ZSBpbgordGhlIGFycmF5IGZvciBhIGJ5dGUgaXMgemVybyBvciBwb3NpdGl2ZSwgdGhlbiB0aGUgYnl0ZSBpcyBhIHNpbmdsZQorYnl0ZSBlbmNvZGluZyB0aGF0IGVuY29kZXMgdGhlIFVuaWNvZGUgc2NhbGFyIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUKK2FycmF5LiBBIC0xIGluIHRoaXMgYXJyYXkgaW5kaWNhdGVzIGEgbWFsZm9ybWVkIGJ5dGUuIElmIHRoZSB2YWx1ZSBpcworLTIsIC0zLCBvciAtNCwgdGhlbiB0aGUgYnl0ZSBpcyB0aGUgYmVnaW5uaW5nIG9mIGEgMiwgMywgb3IgNCBieXRlCitzZXF1ZW5jZSByZXNwZWN0aXZlbHkuIE11bHRpLWJ5dGUgc2VxdWVuY2VzIGFyZSBzZW50IHRvIHRoZSBjb252ZXJ0CitmdW5jdGlvbiBwb2ludGVkIGF0IGluIHRoZSA8Y29kZT5YTUxfRW5jb2Rpbmc8L2NvZGU+IHN0cnVjdHVyZS4gVGhpcworZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgVW5pY29kZSBzY2FsYXIgdmFsdWUgZm9yIHRoZSBzZXF1ZW5jZSBvciAtMQoraWYgdGhlIHNlcXVlbmNlIGlzIG1hbGZvcm1lZC48L3A+CisKKzxwPk9uZSBwaXRmYWxsIHRoYXQgbm92aWNlIEV4cGF0IHVzZXJzIGFyZSBsaWtlbHkgdG8gZmFsbCBpbnRvIGlzIHRoYXQKK2FsdGhvdWdoIEV4cGF0IG1heSBhY2NlcHQgaW5wdXQgaW4gdmFyaW91cyBlbmNvZGluZ3MsIHRoZSBzdHJpbmdzIHRoYXQKK2l0IHBhc3NlcyB0byB0aGUgaGFuZGxlcnMgYXJlIGFsd2F5cyBlbmNvZGVkIGluIFVURi04IG9yIFVURi0xNgorKGRlcGVuZGluZyBvbiBob3cgRXhwYXQgd2FzIGNvbXBpbGVkKS4gWW91ciBhcHBsaWNhdGlvbiBpcyByZXNwb25zaWJsZQorZm9yIGFueSB0cmFuc2xhdGlvbiBvZiB0aGVzZSBzdHJpbmdzIGludG8gb3RoZXIgZW5jb2RpbmdzLjwvcD4KKworPGgzPkhhbmRsaW5nIEV4dGVybmFsIEVudGl0eSBSZWZlcmVuY2VzPC9oMz4KKworPHA+RXhwYXQgZG9lcyBub3QgcmVhZCBvciBwYXJzZSBleHRlcm5hbCBlbnRpdGllcyBkaXJlY3RseS4gTm90ZSB0aGF0CithbnkgZXh0ZXJuYWwgRFREIGlzIGEgc3BlY2lhbCBjYXNlIG9mIGFuIGV4dGVybmFsIGVudGl0eS4gIElmIHlvdSd2ZQorc2V0IG5vIDxjb2RlPkV4dGVybmFsRW50aXR5UmVmSGFuZGxlcjwvY29kZT4sIHRoZW4gZXh0ZXJuYWwgZW50aXR5CityZWZlcmVuY2VzIGFyZSBzaWxlbnRseSBpZ25vcmVkLiBPdGhlcndpc2UsIGl0IGNhbGxzIHlvdXIgaGFuZGxlciB3aXRoCit0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIHJlYWQgYW5kIHBhcnNlIHRoZSBleHRlcm5hbCBlbnRpdHkuPC9wPgorCis8cD5Zb3VyIGhhbmRsZXIgaXNuJ3QgYWN0dWFsbHkgcmVzcG9uc2libGUgZm9yIHBhcnNpbmcgdGhlIGVudGl0eSwgYnV0CitpdCBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgYSBzdWJzaWRpYXJ5IHBhcnNlciB3aXRoIDxjb2RlPjxhIGhyZWY9CisiI1hNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZSIKKz5YTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGU8L2E+PC9jb2RlPiB0aGF0IHdpbGwgZG8gdGhlIGpvYi4gVGhpcworcmV0dXJucyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5YTUxfUGFyc2VyPC9jb2RlPiB0aGF0IGhhcyBoYW5kbGVycyBhbmQKK290aGVyIGRhdGEgc3RydWN0dXJlcyBpbml0aWFsaXplZCBmcm9tIHRoZSBwYXJlbnQgcGFyc2VyLiBZb3UgbWF5IHRoZW4KK3VzZSA8Y29kZT48YSBocmVmPSAiI1hNTF9QYXJzZSIgPlhNTF9QYXJzZTwvYT48L2NvZGU+IG9yIDxjb2RlPjxhCitocmVmPSAiI1hNTF9QYXJzZUJ1ZmZlciI+WE1MX1BhcnNlQnVmZmVyPC9hPjwvY29kZT4gY2FsbHMgYWdhaW5zdCB0aGlzCitwYXJzZXIuICBTaW5jZSBleHRlcm5hbCBlbnRpdGllcyBteSByZWZlciB0byBvdGhlciBleHRlcm5hbCBlbnRpdGllcywKK3lvdXIgaGFuZGxlciBzaG91bGQgYmUgcHJlcGFyZWQgdG8gYmUgY2FsbGVkIHJlY3Vyc2l2ZWx5LjwvcD4KKworPGgzPlBhcnNpbmcgRFREczwvaDM+CisKKzxwPkluIG9yZGVyIHRvIHBhcnNlIHBhcmFtZXRlciBlbnRpdGllcywgYmVmb3JlIHN0YXJ0aW5nIHRoZSBwYXJzZSwKK3lvdSBtdXN0IGNhbGwgPGNvZGU+PGEgaHJlZj0gIiNYTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nIgorPlhNTF9TZXRQYXJhbUVudGl0eVBhcnNpbmc8L2E+PC9jb2RlPiB3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nCithcmd1bWVudHM6PC9wPgorPGRsPgorPGR0Pjxjb2RlPlhNTF9QQVJBTV9FTlRJVFlfUEFSU0lOR19ORVZFUjwvY29kZT48L2R0PgorPGRkPkRvbid0IHBhcnNlIHBhcmFtZXRlciBlbnRpdGllcyBvciB0aGUgZXh0ZXJuYWwgc3Vic2V0PC9kZD4KKzxkdD48Y29kZT5YTUxfUEFSQU1fRU5USVRZX1BBUlNJTkdfVU5MRVNTX1NUQU5EQUxPTkU8L2NvZGU+PC9kdD4KKzxkZD5QYXJzZSBwYXJhbWV0ZXIgZW50aXRlcyBhbmQgdGhlIGV4dGVybmFsIHN1YnNldCB1bmxlc3MKKzxjb2RlPnN0YW5kYWxvbmU8L2NvZGU+IHdhcyBzZXQgdG8gInllcyIgaW4gdGhlIFhNTCBkZWNsYXJhdGlvbi48L2RkPgorPGR0Pjxjb2RlPlhNTF9QQVJBTV9FTlRJVFlfUEFSU0lOR19BTFdBWVM8L2NvZGU+PC9kdD4KKzxkZD5BbHdheXMgcGFyc2UgcGFyYW1ldGVyIGVudGl0aWVzIGFuZCB0aGUgZXh0ZXJuYWwgc3Vic2V0PC9kZD4KKzwvZGw+CisKKzxwPkluIG9yZGVyIHRvIHJlYWQgYW4gZXh0ZXJuYWwgRFRELCB5b3UgYWxzbyBoYXZlIHRvIHNldCBhbiBleHRlcm5hbAorZW50aXR5IHJlZmVyZW5jZSBoYW5kbGVyIGFzIGRlc2NyaWJlZCBhYm92ZS48L3A+CisKKzxoMyBpZD0ic3RvcC1yZXN1bWUiPlRlbXBvcmFyaWx5IFN0b3BwaW5nIFBhcnNpbmc8L2gzPgorCis8cD5FeHBhdCAxLjk1LjggaW50cm9kdWNlcyBhIG5ldyBmZWF0dXJlOiBpdHMgbm93IHBvc3NpYmxlIHRvIHN0b3AKK3BhcnNpbmcgdGVtcG9yYXJpbHkgZnJvbSB3aXRoaW4gYSBoYW5kbGVyIGZ1bmN0aW9uLCBldmVuIGlmIG1vcmUgZGF0YQoraGFzIGFscmVhZHkgYmVlbiBwYXNzZWQgaW50byB0aGUgcGFyc2VyLiAgQXBwbGljYXRpb25zIGZvciB0aGlzCitpbmNsdWRlPC9wPgorCis8dWw+CisgIDxsaT5TdXBwb3J0aW5nIHRoZSA8YSBocmVmPSAiaHR0cDovL3d3dy53My5vcmcvVFIveGluY2x1ZGUvIgorICA+WEluY2x1ZGU8L2E+IHNwZWNpZmljYXRpb24uPC9saT4KKworICA8bGk+RGVsYXlpbmcgZnVydGhlciBwcm9jZXNzaW5nIHVudGlsIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaXMKKyAgYXZhaWxhYmxlIGZyb20gc29tZSBvdGhlciBzb3VyY2UuPC9saT4KKworICA8bGk+QWRqdXN0aW5nIHByb2Nlc3NvciBsb2FkIGFzIHRhc2sgcHJpb3JpdGllcyBzaGlmdCB3aXRoaW4gYW4KKyAgYXBwbGljYXRpb24uPC9saT4KKworICA8bGk+U3RvcHBpbmcgcGFyc2luZyBjb21wbGV0ZWx5IChzaW1wbHkgZnJlZSBvciByZXNldCB0aGUgcGFyc2VyCisgIGluc3RlYWQgb2YgcmVzdW1pbmcgaW4gdGhlIG91dGVyIHBhcnNpbmcgbG9vcCkuICBUaGlzIGNhbiBiZSB1c2VmdWwKKyAgaWYgYSBhcHBsaWNhdGlvbi1kb21haW4gZXJyb3IgaXMgZm91bmQgaW4gdGhlIFhNTCBiZWluZyBwYXJzZWQgb3IgaWYKKyAgdGhlIHJlc3VsdCBvZiB0aGUgcGFyc2UgaXMgZGV0ZXJtaW5lZCBub3QgdG8gYmUgdXNlZnVsIGFmdGVyCisgIGFsbC48L2xpPgorPC91bD4KKworPHA+VG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcyBmZWF0dXJlLCB0aGUgbWFpbiBwYXJzaW5nIGxvb3Agb2YgYW4KK2FwcGxpY2F0aW9uIG5lZWRzIHRvIHN1cHBvcnQgdGhpcyBzcGVjaWZpY2FsbHkuICBJdCBjYW5ub3QgYmUKK3N1cHBvcnRlZCB3aXRoIGEgcGFyc2luZyBsb29wIGNvbXBhdGlibGUgd2l0aCBFeHBhdCAxLjk1Ljcgb3IKK2VhcmxpZXIgKHRob3VnaCBleGlzdGluZyBsb29wcyB3aWxsIGNvbnRpbnVlIHRvIHdvcmsgd2l0aG91dAorc3VwcG9ydGluZyB0aGUgc3RvcC9yZXN1bWUgZmVhdHVyZSkuPC9wPgorCis8cD5BbiBhcHBsaWNhdGlvbiB0aGF0IHVzZXMgdGhpcyBmZWF0dXJlIGZvciBhIHNpbmdsZSBwYXJzZXIgd2lsbCBoYXZlCit0aGUgcm91Z2ggc3RydWN0dXJlIChpbiBwc2V1ZG8tY29kZSk6PC9wPgorCis8cHJlIGNsYXNzPSJwc2V1ZG9jb2RlIj4KK2ZkID0gb3Blbl9pbnB1dCgpCitwID0gY3JlYXRlX3BhcnNlcigpCisKK2lmIHBhcnNlX3htbChwLCBmZCkgeworICAvKiBzdXNwZW5kZWQgKi8KKworICBpbnQgc3VzcGVuZGVkID0gMTsKKworICB3aGlsZSAoc3VzcGVuZGVkKSB7CisgICAgZG9fc29tZXRoaW5nX2Vsc2UoKQorICAgIGlmIHJlYWR5X3RvX3Jlc3VtZSgpIHsKKyAgICAgIHN1c3BlbmRlZCA9IGNvbnRpbnVlX3BhcnNpbmcocCwgZmQpOworICAgIH0KKyAgfQorfQorPC9wcmU+CisKKzxwPkFuIGFwcGxpY2F0aW9uIHRoYXQgbWF5IHJlc3VtZSBhbnkgb2Ygc2V2ZXJhbCBwYXJzZXJzIGJhc2VkIG9uCitpbnB1dCAoZWl0aGVyIGZyb20gdGhlIFhNTCBiZWluZyBwYXJzZWQgb3Igc29tZSBvdGhlciBzb3VyY2UpIHdpbGwKK2NlcnRhaW5seSBoYXZlIG1vcmUgaW50ZXJlc3RpbmcgY29udHJvbCBzdHJ1Y3R1cmVzLjwvcD4KKworPHA+VGhpcyBDIGZ1bmN0aW9uIGNvdWxkIGJlIHVzZWQgZm9yIHRoZSA8Y29kZT5wYXJzZV94bWw8L2NvZGU+CitmdW5jdGlvbiBtZW50aW9uZWQgaW4gdGhlIHBzZXVkby1jb2RlIGFib3ZlOjwvcD4KKworPHByZSBjbGFzcz0iZWciPgorI2RlZmluZSBCVUZGX1NJWkUgMTAyNDAKKworLyogUGFyc2UgYSBkb2N1bWVudCBmcm9tIHRoZSBvcGVuIGZpbGUgZGVzY3JpcHRvciAnZmQnIHVudGlsIHRoZSBwYXJzZQorICAgaXMgY29tcGxldGUgKHRoZSBkb2N1bWVudCBoYXMgYmVlbiBjb21wbGV0ZWx5IHBhcnNlZCwgb3IgdGhlcmUncworICAgYmVlbiBhbiBlcnJvciksIG9yIHRoZSBwYXJzZSBpcyBzdG9wcGVkLiAgUmV0dXJuIG5vbi16ZXJvIHdoZW4KKyAgIHRoZSBwYXJzZSBpcyBtZXJlbHkgc3VzcGVuZGVkLgorKi8KK2ludAorcGFyc2VfeG1sKFhNTF9QYXJzZXIgcCwgaW50IGZkKQoreworICBmb3IgKDs7KSB7CisgICAgaW50IGxhc3RfY2h1bms7CisgICAgaW50IGJ5dGVzX3JlYWQ7CisgICAgZW51bSBYTUxfU3RhdHVzIHN0YXR1czsKKworICAgIHZvaWQgKmJ1ZmYgPSBYTUxfR2V0QnVmZmVyKHAsIEJVRkZfU0laRSk7CisgICAgaWYgKGJ1ZmYgPT0gTlVMTCkgeworICAgICAgLyogaGFuZGxlIGVycm9yLi4uICovCisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYnl0ZXNfcmVhZCA9IHJlYWQoZmQsIGJ1ZmYsIEJVRkZfU0laRSk7CisgICAgaWYgKGJ5dGVzX3JlYWQgJmx0OyAwKSB7CisgICAgICAvKiBoYW5kbGUgZXJyb3IuLi4gKi8KKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzdGF0dXMgPSBYTUxfUGFyc2VCdWZmZXIocCwgYnl0ZXNfcmVhZCwgYnl0ZXNfcmVhZCA9PSAwKTsKKyAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgICAgY2FzZSBYTUxfU1RBVFVTX0VSUk9SOgorICAgICAgICAvKiBoYW5kbGUgZXJyb3IuLi4gKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBjYXNlIFhNTF9TVEFUVVNfU1VTUEVOREVEOgorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKGJ5dGVzX3JlYWQgPT0gMCkKKyAgICAgIHJldHVybiAwOworICB9Cit9Cis8L3ByZT4KKworPHA+VGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+Y29udGludWVfcGFyc2luZzwvY29kZT4gZnVuY3Rpb24gaXMKK3NvbWV3aGF0IHNpbXBsZXIsIHNpbmNlIGl0IG9ubHkgbmVlZCBkZWFsIHdpdGggdGhlIHJldHVybiBjb2RlIGZyb20KKzxjb2RlPjxhIGhyZWY9ICIjWE1MX1Jlc3VtZVBhcnNlciI+WE1MX1Jlc3VtZVBhcnNlcjwvYT48L2NvZGU+OyBpdCBjYW4KK2RlbGVnYXRlIHRoZSBpbnB1dCBoYW5kbGluZyB0byB0aGUgPGNvZGU+cGFyc2VfeG1sPC9jb2RlPgorZnVuY3Rpb246PC9wPgorCis8cHJlIGNsYXNzPSJlZyI+CisvKiBDb250aW51ZSBwYXJzaW5nIGEgZG9jdW1lbnQgd2hpY2ggaGFkIGJlZW4gc3VzcGVuZGVkLiAgVGhlICdwJyBhbmQKKyAgICdmZCcgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBwYXNzZWQgdG8gcGFyc2VfeG1sKCkuICBSZXR1cm4KKyAgIG5vbi16ZXJvIHdoZW4gdGhlIHBhcnNlIGlzIHN1c3BlbmRlZC4KKyovCitpbnQKK2NvbnRpbnVlX3BhcnNpbmcoWE1MX1BhcnNlciBwLCBpbnQgZmQpCit7CisgIGVudW0gWE1MX1N0YXR1cyBzdGF0dXMgPSBYTUxfUmVzdW1lUGFyc2VyKHApOworICBzd2l0Y2ggKHN0YXR1cykgeworICAgIGNhc2UgWE1MX1NUQVRVU19FUlJPUjoKKyAgICAgIC8qIGhhbmRsZSBlcnJvci4uLiAqLworICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBYTUxfRVJST1JfTk9UX1NVU1BFTkRFRDoKKyAgICAgIC8qIGhhbmRsZSBlcnJvci4uLiAqLworICAgICAgcmV0dXJuIDA7LgorICAgIGNhc2UgWE1MX1NUQVRVU19TVVNQRU5ERUQ6CisgICAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gcGFyc2VfeG1sKHAsIGZkKTsKK30KKzwvcHJlPgorCis8cD5Ob3cgdGhhdCB3ZSd2ZSBzZWVuIHdoYXQgYSBtZXNzIHRoZSB0b3AtbGV2ZWwgcGFyc2luZyBsb29wIGNhbgorYmVjb21lLCB3aGF0IGhhdmUgd2UgZ2FpbmVkPyAgVmVyeSBzaW1wbHksIHdlIGNhbiBub3cgdXNlIHRoZSA8Y29kZT48YQoraHJlZj0gIiNYTUxfU3RvcFBhcnNlciIgPlhNTF9TdG9wUGFyc2VyPC9hPjwvY29kZT4gZnVuY3Rpb24gdG8gc3RvcAorcGFyc2luZywgd2l0aG91dCBoYXZpbmcgdG8gZ28gdG8gZ3JlYXQgbGVuZ3RocyB0byBhdm9pZCBhZGRpdGlvbmFsCitwcm9jZXNzaW5nIHRoYXQgd2UncmUgZXhwZWN0aW5nIHRvIGlnbm9yZS4gIEFzIGEgYm9udXMsIHdlIGdldCB0byBzdG9wCitwYXJzaW5nIDxlbT50ZW1wb3JhcmlseTwvZW0+LCBhbmQgY29tZSBiYWNrIHRvIGl0IHdoZW4gd2UncmUKK3JlYWR5LjwvcD4KKworPHA+VG8gc3RvcCBwYXJzaW5nIGZyb20gYSBoYW5kbGVyIGZ1bmN0aW9uLCB1c2UgdGhlIDxjb2RlPjxhIGhyZWY9CisiI1hNTF9TdG9wUGFyc2VyIiA+WE1MX1N0b3BQYXJzZXI8L2E+PC9jb2RlPiBmdW5jdGlvbi4gIFRoaXMgZnVuY3Rpb24KK3Rha2VzIHR3byBhcmd1bWVudHM7IHRoZSBwYXJzZXIgYmVpbmcgc3RvcHBlZCBhbmQgYSBmbGFnIGluZGljYXRpbmcKK3doZXRoZXIgdGhlIHBhcnNlIGNhbiBiZSByZXN1bWVkIGluIHRoZSBmdXR1cmUuPC9wPgorCis8IS0tIFhYWCByZWFsbHkgbmVlZCBtb3JlIGhlcmUgLS0+CisKKworPGhyIC8+Cis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKzxoMj48YSBuYW1lPSJyZWZlcmVuY2UiPkV4cGF0IFJlZmVyZW5jZTwvYT48L2gyPgorCis8aDM+PGEgbmFtZT0iY3JlYXRpb24iPlBhcnNlciBDcmVhdGlvbjwvYT48L2gzPgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfUGFyc2VyQ3JlYXRlIj4KK1hNTF9QYXJzZXIgWE1MQ0FMTAorWE1MX1BhcnNlckNyZWF0ZShjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmcpOworPC9wcmU+Cis8ZGl2IGNsYXNzPSJmY25kZWYiPgorQ29uc3RydWN0IGEgbmV3IHBhcnNlci4gSWYgZW5jb2RpbmcgaXMgbm9uLW51bGwsIGl0IHNwZWNpZmllcyBhCitjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gdXNlIGZvciB0aGUgZG9jdW1lbnQuIFRoaXMgb3ZlcnJpZGVzIHRoZSBkb2N1bWVudAorZW5jb2RpbmcgZGVjbGFyYXRpb24uIFRoZXJlIGFyZSBmb3VyIGJ1aWx0LWluIGVuY29kaW5nczoKKzx1bD4KKzxsaT5VUy1BU0NJSTwvbGk+Cis8bGk+VVRGLTg8L2xpPgorPGxpPlVURi0xNjwvbGk+Cis8bGk+SVNPLTg4NTktMTwvbGk+Cis8L3VsPgorQW55IG90aGVyIHZhbHVlIHdpbGwgaW52b2tlIGEgY2FsbCB0byB0aGUgVW5rbm93bkVuY29kaW5nSGFuZGxlci4KKzwvZGl2PgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfUGFyc2VyQ3JlYXRlTlMiPgorWE1MX1BhcnNlciBYTUxDQUxMCitYTUxfUGFyc2VyQ3JlYXRlTlMoY29uc3QgWE1MX0NoYXIgKmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgIFhNTF9DaGFyIHNlcCk7Cis8L3ByZT4KKzxkaXYgY2xhc3M9ImZjbmRlZiI+CitDb25zdHJ1Y3RzIGEgbmV3IHBhcnNlciB0aGF0IGhhcyBuYW1lc3BhY2UgcHJvY2Vzc2luZyBpbiBlZmZlY3QuIE5hbWVzcGFjZQorZXhwYW5kZWQgZWxlbWVudCBuYW1lcyBhbmQgYXR0cmlidXRlIG5hbWVzIGFyZSByZXR1cm5lZCBhcyBhIGNvbmNhdGVuYXRpb24KK29mIHRoZSBuYW1lc3BhY2UgVVJJLCA8ZW0+c2VwPC9lbT4sIGFuZCB0aGUgbG9jYWwgcGFydCBvZiB0aGUgbmFtZS4gVGhpcworbWVhbnMgdGhhdCB5b3Ugc2hvdWxkIHBpY2sgYSBjaGFyYWN0ZXIgZm9yIDxlbT5zZXA8L2VtPiB0aGF0IGNhbid0IGJlCitwYXJ0IG9mIGEgbGVnYWwgVVJJLiBUaGVyZSBpcyBhIHNwZWNpYWwgY2FzZSB3aGVuIDxlbT5zZXA8L2VtPiBpcyB0aGUgbnVsbAorY2hhcmFjdGVyIDxjb2RlPidcMCc8L2NvZGU+OiB0aGUgbmFtZXNwYWNlIFVSSSBhbmQgdGhlIGxvY2FsIHBhcnQgd2lsbCBiZQorY29uY2F0ZW5hdGVkIHdpdGhvdXQgYW55IHNlcGFyYXRvciAtIHRoaXMgaXMgaW50ZW5kZWQgdG8gc3VwcG9ydCBSREYgcHJvY2Vzc29ycy4KK0l0IGlzIGEgcHJvZ3JhbW1pbmcgZXJyb3IgdG8gdXNlIHRoZSBudWxsIHNlcGFyYXRvciB3aXRoIAorPGEgaHJlZj0gIiNYTUxfU2V0UmV0dXJuTlNUcmlwbGV0Ij5uYW1lc3BhY2UgdHJpcGxldHM8L2E+LjwvZGl2PgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfUGFyc2VyQ3JlYXRlX01NIj4KK1hNTF9QYXJzZXIgWE1MQ0FMTAorWE1MX1BhcnNlckNyZWF0ZV9NTShjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9NZW1vcnlfSGFuZGxpbmdfU3VpdGUgKm1zLAorCQkgICAgY29uc3QgWE1MX0NoYXIgKnNlcCk7Cis8L3ByZT4KKzxwcmUgY2xhc3M9InNpZ25hdHVyZSI+Cit0eXBlZGVmIHN0cnVjdCB7CisgIHZvaWQgKihYTUxDQUxMICptYWxsb2NfZmNuKShzaXplX3Qgc2l6ZSk7CisgIHZvaWQgKihYTUxDQUxMICpyZWFsbG9jX2Zjbikodm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSk7CisgIHZvaWQgKFhNTENBTEwgKmZyZWVfZmNuKSh2b2lkICpwdHIpOworfSBYTUxfTWVtb3J5X0hhbmRsaW5nX1N1aXRlOworPC9wcmU+Cis8ZGl2IGNsYXNzPSJmY25kZWYiPgorPHA+Q29uc3RydWN0IGEgbmV3IHBhcnNlciB1c2luZyB0aGUgc3VpdGUgb2YgbWVtb3J5IGhhbmRsaW5nIGZ1bmN0aW9ucworc3BlY2lmaWVkIGluIDxjb2RlPm1zPC9jb2RlPi4gSWYgPGNvZGU+bXM8L2NvZGU+IGlzIE5VTEwsIHRoZW4gdXNlIHRoZQorc3RhbmRhcmQgc2V0IG9mIG1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9ucy4gSWYgPGNvZGU+c2VwPC9jb2RlPiBpcworbm9uIE5VTEwsIHRoZW4gbmFtZXNwYWNlIHByb2Nlc3NpbmcgaXMgZW5hYmxlZCBpbiB0aGUgY3JlYXRlZCBwYXJzZXIKK2FuZCB0aGUgY2hhcmFjdGVyIHBvaW50ZWQgYXQgYnkgc2VwIGlzIHVzZWQgYXMgdGhlIHNlcGFyYXRvciBiZXR3ZWVuCit0aGUgbmFtZXNwYWNlIFVSSSBhbmQgdGhlIGxvY2FsIHBhcnQgb2YgdGhlIG5hbWUuPC9wPgorPC9kaXY+CisKKzxwcmUgY2xhc3M9ImZjbmRlYyIgaWQ9IlhNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZSI+CitYTUxfUGFyc2VyIFhNTENBTEwKK1hNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZShYTUxfUGFyc2VyIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmVuY29kaW5nKTsKKzwvcHJlPgorPGRpdiBjbGFzcz0iZmNuZGVmIj4KK0NvbnN0cnVjdCBhIG5ldyA8Y29kZT5YTUxfUGFyc2VyPC9jb2RlPiBvYmplY3QgZm9yIHBhcnNpbmcgYW4gZXh0ZXJuYWwKK2dlbmVyYWwgZW50aXR5LiBDb250ZXh0IGlzIHRoZSBjb250ZXh0IGFyZ3VtZW50IHBhc3NlZCBpbiBhIGNhbGwgdG8gYQorRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyLiBPdGhlciBzdGF0ZSBpbmZvcm1hdGlvbiBzdWNoIGFzIGhhbmRsZXJzLAordXNlciBkYXRhLCBuYW1lc3BhY2UgcHJvY2Vzc2luZyBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgcGFyc2VyIHBhc3NlZCBhcwordGhlIDFzdCBhcmd1bWVudC4gU28geW91IHNob3VsZG4ndCBuZWVkIHRvIGNhbGwgYW55IG9mIHRoZSBiZWhhdmlvcgorY2hhbmdpbmcgZnVuY3Rpb25zIG9uIHRoaXMgcGFyc2VyICh1bmxlc3MgeW91IHdhbnQgaXQgdG8gYWN0CitkaWZmZXJlbnRseSB0aGFuIHRoZSBwYXJlbnQgcGFyc2VyKS4KKzwvZGl2PgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfUGFyc2VyRnJlZSI+Cit2b2lkIFhNTENBTEwKK1hNTF9QYXJzZXJGcmVlKFhNTF9QYXJzZXIgcCk7Cis8L3ByZT4KKzxkaXYgY2xhc3M9ImZjbmRlZiI+CitGcmVlIG1lbW9yeSB1c2VkIGJ5IHRoZSBwYXJzZXIuIFlvdXIgYXBwbGljYXRpb24gaXMgcmVzcG9uc2libGUgZm9yCitmcmVlaW5nIGFueSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIDxhIGhyZWY9IiN1c2VyZGF0YSI+dXNlciBkYXRhPC9hPi4KKzwvZGl2PgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfUGFyc2VyUmVzZXQiPgorWE1MX0Jvb2wgWE1MQ0FMTAorWE1MX1BhcnNlclJlc2V0KFhNTF9QYXJzZXIgcCwKKyAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmcpOworPC9wcmU+Cis8ZGl2IGNsYXNzPSJmY25kZWYiPgorQ2xlYW4gdXAgdGhlIG1lbW9yeSBzdHJ1Y3R1cmVzIG1haW50YWluZWQgYnkgdGhlIHBhcnNlciBzbyB0aGF0IGl0IG1heQorYmUgdXNlZCBhZ2Fpbi4gIEFmdGVyIHRoaXMgaGFzIGJlZW4gY2FsbGVkLCA8Y29kZT5wYXJzZXI8L2NvZGU+IGlzCityZWFkeSB0byBzdGFydCBwYXJzaW5nIGEgbmV3IGRvY3VtZW50LiAgQWxsIGhhbmRsZXJzIGFyZSBjbGVhcmVkIGZyb20KK3RoZSBwYXJzZXIsIGV4Y2VwdCBmb3IgdGhlIHVua25vd25FbmNvZGluZ0hhbmRsZXIuICBUaGUgcGFyc2VyJ3MgZXh0ZXJuYWwKK3N0YXRlIGlzIHJlLWluaXRpYWxpemVkIGV4Y2VwdCBmb3IgdGhlIHZhbHVlcyBvZiBucyBhbmQgbnNfdHJpcGxldHMuCitUaGlzIGZ1bmN0aW9uIG1heSBub3QgYmUgdXNlZCBvbiBhIHBhcnNlciBjcmVhdGVkIHVzaW5nIDxjb2RlPjxhIGhyZWY9CisiI1hNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZSIgPlhNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZTwvYQorPjwvY29kZT47IGl0IHdpbGwgcmV0dXJuIDxjb2RlPlhNTF9GQUxTRTwvY29kZT4gaW4gdGhhdCBjYXNlLiAgUmV0dXJucworPGNvZGU+WE1MX1RSVUU8L2NvZGU+IG9uIHN1Y2Nlc3MuICBZb3VyIGFwcGxpY2F0aW9uIGlzIHJlc3BvbnNpYmxlIGZvcgorZGVhbGluZyB3aXRoIGFueSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIDxhIGhyZWY9IiN1c2VyZGF0YSI+dXNlciBkYXRhPC9hPi4KKzwvZGl2PgorCis8aDM+PGEgbmFtZT0icGFyc2luZyI+UGFyc2luZzwvYT48L2gzPgorCis8cD5UbyBzdGF0ZSB0aGUgb2J2aW91czogdGhlIHRocmVlIHBhcnNpbmcgZnVuY3Rpb25zIDxjb2RlPjxhIGhyZWY9CisiI1hNTF9QYXJzZSIgPlhNTF9QYXJzZTwvYT48L2NvZGU+LCA8Y29kZT48YSBocmVmPSAiI1hNTF9QYXJzZUJ1ZmZlciI+CitYTUxfUGFyc2VCdWZmZXI8L2E+PC9jb2RlPiBhbmQgPGNvZGU+PGEgaHJlZj0gIiNYTUxfR2V0QnVmZmVyIj4KK1hNTF9HZXRCdWZmZXI8L2E+PC9jb2RlPiBtdXN0IG5vdCBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gYSBoYW5kbGVyCit1bmxlc3MgdGhleSBvcGVyYXRlIG9uIGEgc2VwYXJhdGUgcGFyc2VyIGluc3RhbmNlLCB0aGF0IGlzLCBvbmUgdGhhdAorZGlkIG5vdCBjYWxsIHRoZSBoYW5kbGVyLiBGb3IgZXhhbXBsZSwgaXQgaXMgT0sgdG8gY2FsbCB0aGUgcGFyc2luZworZnVuY3Rpb25zIGZyb20gd2l0aGluIGFuIDxjb2RlPlhNTF9FeHRlcm5hbEVudGl0eVJlZkhhbmRsZXI8L2NvZGU+LAoraWYgdGhleSBhcHBseSB0byB0aGUgcGFyc2VyIGNyZWF0ZWQgYnkKKzxjb2RlPjxhIGhyZWY9ICIjWE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlIgorPlhNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZTwvYT48L2NvZGU+LjwvcD4KKworPHA+Tm90ZTogdGhlIDxjb2RlPmxlbjwvY29kZT4gYXJndW1lbnQgcGFzc2VkIHRvIHRoZXNlIGZ1bmN0aW9ucworc2hvdWxkIGJlIGNvbnNpZGVyYWJseSBsZXNzIHRoYW4gdGhlIG1heGltdW0gdmFsdWUgZm9yIGFuIGludGVnZXIsCithcyBpdCBjb3VsZCBjcmVhdGUgYW4gaW50ZWdlciBvdmVyZmxvdyBzaXR1YXRpb24gaWYgdGhlIGFkZGVkCitsZW5ndGhzIG9mIGEgYnVmZmVyIGFuZCB0aGUgdW5wcm9jZXNzZWQgcG9ydGlvbiBvZiB0aGUgcHJldmlvdXMgYnVmZmVyCitleGNlZWQgdGhlIG1heGltdW0gaW50ZWdlciB2YWx1ZS4gSW5wdXQgZGF0YSBhdCB0aGUgZW5kIG9mIGEgYnVmZmVyCit3aWxsIHJlbWFpbiB1bnByb2Nlc3NlZCBpZiBpdCBpcyBwYXJ0IG9mIGFuIFhNTCB0b2tlbiBmb3Igd2hpY2ggdGhlCitlbmQgaXMgbm90IHBhcnQgb2YgdGhhdCBidWZmZXIuPC9wPgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfUGFyc2UiPgorZW51bSBYTUxfU3RhdHVzIFhNTENBTEwKK1hNTF9QYXJzZShYTUxfUGFyc2VyIHAsCisgICAgICAgICAgY29uc3QgY2hhciAqcywKKyAgICAgICAgICBpbnQgbGVuLAorICAgICAgICAgIGludCBpc0ZpbmFsKTsKKzwvcHJlPgorPHByZSBjbGFzcz0ic2lnbmF0dXJlIj4KK2VudW0gWE1MX1N0YXR1cyB7CisgIFhNTF9TVEFUVVNfRVJST1IgPSAwLAorICBYTUxfU1RBVFVTX09LID0gMQorfTsKKzwvcHJlPgorPGRpdiBjbGFzcz0iZmNuZGVmIj4KK1BhcnNlIHNvbWUgbW9yZSBvZiB0aGUgZG9jdW1lbnQuIFRoZSBzdHJpbmcgPGNvZGU+czwvY29kZT4gaXMgYSBidWZmZXIKK2NvbnRhaW5pbmcgcGFydCAob3IgcGVyaGFwcyBhbGwpIG9mIHRoZSBkb2N1bWVudC4gVGhlIG51bWJlciBvZiBieXRlcyBvZiBzCit0aGF0IGFyZSBwYXJ0IG9mIHRoZSBkb2N1bWVudCBpcyBpbmRpY2F0ZWQgYnkgPGNvZGU+bGVuPC9jb2RlPi4gVGhpcyBtZWFucwordGhhdCA8Y29kZT5zPC9jb2RlPiBkb2Vzbid0IGhhdmUgdG8gYmUgbnVsbCB0ZXJtaW5hdGVkLiBJdCBhbHNvIG1lYW5zIHRoYXQKK2lmIDxjb2RlPmxlbjwvY29kZT4gaXMgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYmxvY2sgb2YKK21lbW9yeSB0aGF0IDxjb2RlPnM8L2NvZGU+IHBvaW50cyBhdCwgdGhlbiBhIG1lbW9yeSBmYXVsdCBpcyBsaWtlbHkuIFRoZQorPGNvZGU+aXNGaW5hbDwvY29kZT4gcGFyYW1ldGVyIGluZm9ybXMgdGhlIHBhcnNlciB0aGF0IHRoaXMgaXMgdGhlIGxhc3QKK3BpZWNlIG9mIHRoZSBkb2N1bWVudC4gRnJlcXVlbnRseSwgdGhlIGxhc3QgcGllY2UgaXMgZW1wdHkgKGkuZS4KKzxjb2RlPmxlbjwvY29kZT4gaXMgemVyby4pCitJZiBhIHBhcnNlIGVycm9yIG9jY3VycmVkLCBpdCByZXR1cm5zIDxjb2RlPlhNTF9TVEFUVVNfRVJST1I8L2NvZGU+LgorT3RoZXJ3aXNlIGl0IHJldHVybnMgPGNvZGU+WE1MX1NUQVRVU19PSzwvY29kZT4gdmFsdWUuCis8L2Rpdj4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX1BhcnNlQnVmZmVyIj4KK2VudW0gWE1MX1N0YXR1cyBYTUxDQUxMCitYTUxfUGFyc2VCdWZmZXIoWE1MX1BhcnNlciBwLAorICAgICAgICAgICAgICAgIGludCBsZW4sCisgICAgICAgICAgICAgICAgaW50IGlzRmluYWwpOworPC9wcmU+Cis8ZGl2IGNsYXNzPSJmY25kZWYiPgorVGhpcyBpcyBqdXN0IGxpa2UgPGNvZGU+PGEgaHJlZj0gIiNYTUxfUGFyc2UiID5YTUxfUGFyc2U8L2E+PC9jb2RlPiwKK2V4Y2VwdCBpbiB0aGlzIGNhc2UgRXhwYXQgcHJvdmlkZXMgdGhlIGJ1ZmZlci4gIEJ5IG9idGFpbmluZyB0aGUKK2J1ZmZlciBmcm9tIEV4cGF0IHdpdGggdGhlIDxjb2RlPjxhIGhyZWY9ICIjWE1MX0dldEJ1ZmZlciIKKz5YTUxfR2V0QnVmZmVyPC9hPjwvY29kZT4gZnVuY3Rpb24sIHRoZSBhcHBsaWNhdGlvbiBjYW4gYXZvaWQgZG91YmxlCitjb3B5aW5nIG9mIHRoZSBpbnB1dC4KKzwvZGl2PgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfR2V0QnVmZmVyIj4KK3ZvaWQgKiBYTUxDQUxMCitYTUxfR2V0QnVmZmVyKFhNTF9QYXJzZXIgcCwKKyAgICAgICAgICAgICAgaW50IGxlbik7Cis8L3ByZT4KKzxkaXYgY2xhc3M9ImZjbmRlZiI+CitPYnRhaW4gYSBidWZmZXIgb2Ygc2l6ZSA8Y29kZT5sZW48L2NvZGU+IHRvIHJlYWQgYSBwaWVjZSBvZiB0aGUgZG9jdW1lbnQKK2ludG8uIEEgTlVMTCB2YWx1ZSBpcyByZXR1cm5lZCBpZiBFeHBhdCBjYW4ndCBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5IGZvcgordGhpcyBidWZmZXIuIFRoaXMgaGFzIHRvIGJlIGNhbGxlZCBwcmlvciB0byBldmVyeSBjYWxsIHRvCis8Y29kZT48YSBocmVmPSAiI1hNTF9QYXJzZUJ1ZmZlciIgPlhNTF9QYXJzZUJ1ZmZlcjwvYT48L2NvZGU+LiBBCit0eXBpY2FsIHVzZSB3b3VsZCBsb29rIGxpa2UgdGhpczoKKworPHByZSBjbGFzcz0iZWciPgorZm9yICg7OykgeworICBpbnQgYnl0ZXNfcmVhZDsKKyAgdm9pZCAqYnVmZiA9IFhNTF9HZXRCdWZmZXIocCwgQlVGRl9TSVpFKTsKKyAgaWYgKGJ1ZmYgPT0gTlVMTCkgeworICAgIC8qIGhhbmRsZSBlcnJvciAqLworICB9CisKKyAgYnl0ZXNfcmVhZCA9IHJlYWQoZG9jZmQsIGJ1ZmYsIEJVRkZfU0laRSk7CisgIGlmIChieXRlc19yZWFkICZsdDsgMCkgeworICAgIC8qIGhhbmRsZSBlcnJvciAqLworICB9CisKKyAgaWYgKCEgWE1MX1BhcnNlQnVmZmVyKHAsIGJ5dGVzX3JlYWQsIGJ5dGVzX3JlYWQgPT0gMCkpIHsKKyAgICAvKiBoYW5kbGUgcGFyc2UgZXJyb3IgKi8KKyAgfQorCisgIGlmIChieXRlc19yZWFkID09IDApCisgICAgYnJlYWs7Cit9Cis8L3ByZT4KKzwvZGl2PgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfU3RvcFBhcnNlciI+CitlbnVtIFhNTF9TdGF0dXMgWE1MQ0FMTAorWE1MX1N0b3BQYXJzZXIoWE1MX1BhcnNlciBwLAorICAgICAgICAgICAgICAgWE1MX0Jvb2wgcmVzdW1hYmxlKTsKKzwvcHJlPgorPGRpdiBjbGFzcz0iZmNuZGVmIj4KKworPHA+U3RvcHMgcGFyc2luZywgY2F1c2luZyA8Y29kZT48YSBocmVmPSAiI1hNTF9QYXJzZSIKKz5YTUxfUGFyc2U8L2E+PC9jb2RlPiBvciA8Y29kZT48YSBocmVmPSAiI1hNTF9QYXJzZUJ1ZmZlciIKKz5YTUxfUGFyc2VCdWZmZXI8L2E+PC9jb2RlPiB0byByZXR1cm4uICBNdXN0IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhCitjYWxsLWJhY2sgaGFuZGxlciwgZXhjZXB0IHdoZW4gYWJvcnRpbmcgKHdoZW4gPGNvZGU+cmVzdW1hYmxlPC9jb2RlPgoraXMgPGNvZGU+WE1MX0ZBTFNFPC9jb2RlPikgYW4gYWxyZWFkeSBzdXNwZW5kZWQgcGFyc2VyLiAgU29tZQorY2FsbC1iYWNrcyBtYXkgc3RpbGwgZm9sbG93IGJlY2F1c2UgdGhleSB3b3VsZCBvdGhlcndpc2UgZ2V0Citsb3N0LCBpbmNsdWRpbmcKKzx1bD4KKyAgPGxpPiB0aGUgZW5kIGVsZW1lbnQgaGFuZGxlciBmb3IgZW1wdHkgZWxlbWVudHMgd2hlbiBzdG9wcGVkIGluIHRoZQorICAgICAgIHN0YXJ0IGVsZW1lbnQgaGFuZGxlciw8L2xpPgorICA8bGk+IHRoZSBlbmQgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGhhbmRsZXIgd2hlbiBzdG9wcGVkIGluIHRoZSBlbmQKKyAgICAgICBlbGVtZW50IGhhbmRsZXIsPC9saT4KKyAgPGxpPiB0aGUgY2hhcmFjdGVyIGRhdGEgaGFuZGxlciB3aGVuIHN0b3BwZWQgaW4gdGhlIGNoYXJhY3RlciBkYXRhIGhhbmRsZXIKKyAgICAgICB3aGlsZSBtYWtpbmcgbXVsdGlwbGUgY2FsbC1iYWNrcyBvbiBhIGNvbnRpZ3VvdXMgY2h1bmsgb2YgY2hhcmFjdGVycyw8L2xpPgorPC91bD4KK2FuZCBwb3NzaWJseSBvdGhlcnMuPC9wPgorCis8cD5UaGlzIGNhbiBiZSBjYWxsZWQgZnJvbSBtb3N0IGhhbmRsZXJzLCBpbmNsdWRpbmcgRFREIHJlbGF0ZWQKK2NhbGwtYmFja3MsIGV4Y2VwdCB3aGVuIHBhcnNpbmcgYW4gZXh0ZXJuYWwgcGFyYW1ldGVyIGVudGl0eSBhbmQKKzxjb2RlPnJlc3VtYWJsZTwvY29kZT4gaXMgPGNvZGU+WE1MX1RSVUU8L2NvZGU+LiAgUmV0dXJucworPGNvZGU+WE1MX1NUQVRVU19PSzwvY29kZT4gd2hlbiBzdWNjZXNzZnVsLAorPGNvZGU+WE1MX1NUQVRVU19FUlJPUjwvY29kZT4gb3RoZXJ3aXNlLiAgVGhlIHBvc3NpYmxlIGVycm9yIGNvZGVzCithcmU6PC9wPgorPGRsPgorICA8ZHQ+PGNvZGU+WE1MX0VSUk9SX1NVU1BFTkRFRDwvY29kZT48L2R0PgorICA8ZGQ+d2hlbiBzdXNwZW5kaW5nIGFuIGFscmVhZHkgc3VzcGVuZGVkIHBhcnNlci48L2RkPgorICA8ZHQ+PGNvZGU+WE1MX0VSUk9SX0ZJTklTSEVEPC9jb2RlPjwvZHQ+CisgIDxkZD53aGVuIHRoZSBwYXJzZXIgaGFzIGFscmVhZHkgZmluaXNoZWQuPC9kZD4KKyAgPGR0Pjxjb2RlPlhNTF9FUlJPUl9TVVNQRU5EX1BFPC9jb2RlPjwvZHQ+CisgIDxkZD53aGVuIHN1c3BlbmRpbmcgd2hpbGUgcGFyc2luZyBhbiBleHRlcm5hbCBQRS48L2RkPgorPC9kbD4KKworPHA+U2luY2UgdGhlIHN0b3AvcmVzdW1lIGZlYXR1cmUgcmVxdWlyZXMgYXBwbGljYXRpb24gc3VwcG9ydCBpbiB0aGUKK291dGVyIHBhcnNpbmcgbG9vcCwgaXQgaXMgYW4gZXJyb3IgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGZvciBhIHBhcnNlcgorbm90IGJlaW5nIGhhbmRsZWQgYXBwcm9wcmlhdGVseTsgc2VlIDxhIGhyZWY9ICIjc3RvcC1yZXN1bWUiCis+VGVtcG9yYXJpbHkgU3RvcHBpbmcgUGFyc2luZzwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgorCis8cD5XaGVuIDxjb2RlPnJlc3VtYWJsZTwvY29kZT4gaXMgPGNvZGU+WE1MX1RSVUU8L2NvZGU+IHRoZW4gcGFyc2luZworaXMgPGVtPnN1c3BlbmRlZDwvZW0+LCB0aGF0IGlzLCA8Y29kZT48YSBocmVmPSAiI1hNTF9QYXJzZSIKKz5YTUxfUGFyc2U8L2E+PC9jb2RlPiBhbmQgPGNvZGU+PGEgaHJlZj0gIiNYTUxfUGFyc2VCdWZmZXIiCis+WE1MX1BhcnNlQnVmZmVyPC9hPjwvY29kZT4gcmV0dXJuIDxjb2RlPlhNTF9TVEFUVVNfU1VTUEVOREVEPC9jb2RlPi4KK090aGVyd2lzZSwgcGFyc2luZyBpcyA8ZW0+YWJvcnRlZDwvZW0+LCB0aGF0IGlzLCA8Y29kZT48YSBocmVmPQorIiNYTUxfUGFyc2UiID5YTUxfUGFyc2U8L2E+PC9jb2RlPiBhbmQgPGNvZGU+PGEgaHJlZj0KKyIjWE1MX1BhcnNlQnVmZmVyIiA+WE1MX1BhcnNlQnVmZmVyPC9hPjwvY29kZT4gcmV0dXJuCis8Y29kZT5YTUxfU1RBVFVTX0VSUk9SPC9jb2RlPiB3aXRoIGVycm9yIGNvZGUKKzxjb2RlPlhNTF9FUlJPUl9BQk9SVEVEPC9jb2RlPi48L3A+CisKKzxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4KK1RoaXMgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBjdXJyZW50IHBhcnNlciBpbnN0YW5jZSBvbmx5LCB0aGF0IGlzLCBpZgordGhlcmUgaXMgYSBwYXJlbnQgcGFyc2VyIHRoZW4gaXQgd2lsbCBjb250aW51ZSBwYXJzaW5nIHdoZW4gdGhlCitleHRlcm5hbCBlbnRpdHkgcmVmZXJlbmNlIGhhbmRsZXIgcmV0dXJucy4gIEl0IGlzIHVwIHRvIHRoZQoraW1wbGVtZW50YXRpb24gb2YgdGhhdCBoYW5kbGVyIHRvIGNhbGwgPGNvZGU+PGEgaHJlZj0KKyIjWE1MX1N0b3BQYXJzZXIiID5YTUxfU3RvcFBhcnNlcjwvYT48L2NvZGU+IG9uIHRoZSBwYXJlbnQgcGFyc2VyCisocmVjdXJzaXZlbHkpLCBpZiBvbmUgd2FudHMgdG8gc3RvcCBwYXJzaW5nIGFsdG9nZXRoZXIuPC9wPgorCis8cD5XaGVuIHN1c3BlbmRlZCwgcGFyc2luZyBjYW4gYmUgcmVzdW1lZCBieSBjYWxsaW5nIDxjb2RlPjxhIGhyZWY9CisiI1hNTF9SZXN1bWVQYXJzZXIiID5YTUxfUmVzdW1lUGFyc2VyPC9hPjwvY29kZT4uPC9wPgorCis8cD5OZXcgaW4gRXhwYXQgMS45NS44LjwvcD4KKzwvZGl2PgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfUmVzdW1lUGFyc2VyIj4KK2VudW0gWE1MX1N0YXR1cyBYTUxDQUxMCitYTUxfUmVzdW1lUGFyc2VyKFhNTF9QYXJzZXIgcCk7Cis8L3ByZT4KKzxkaXYgY2xhc3M9ImZjbmRlZiI+Cis8cD5SZXN1bWVzIHBhcnNpbmcgYWZ0ZXIgaXQgaGFzIGJlZW4gc3VzcGVuZGVkIHdpdGggPGNvZGU+PGEgaHJlZj0KKyIjWE1MX1N0b3BQYXJzZXIiID5YTUxfU3RvcFBhcnNlcjwvYT48L2NvZGU+LiAgTXVzdCBub3QgYmUgY2FsbGVkIGZyb20KK3dpdGhpbiBhIGhhbmRsZXIgY2FsbC1iYWNrLiAgUmV0dXJucyBzYW1lIHN0YXR1cyBjb2RlcyBhcyA8Y29kZT48YQoraHJlZj0gIiNYTUxfUGFyc2UiPlhNTF9QYXJzZTwvYT48L2NvZGU+IG9yIDxjb2RlPjxhIGhyZWY9CisiI1hNTF9QYXJzZUJ1ZmZlciIgPlhNTF9QYXJzZUJ1ZmZlcjwvYT48L2NvZGU+LiAgQW4gYWRkaXRpb25hbCBlcnJvcgorY29kZSwgPGNvZGU+WE1MX0VSUk9SX05PVF9TVVNQRU5ERUQ8L2NvZGU+LCB3aWxsIGJlIHJldHVybmVkIGlmIHRoZQorcGFyc2VyIHdhcyBub3QgY3VycmVudGx5IHN1c3BlbmRlZC48L3A+CisKKzxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4KK1RoaXMgbXVzdCBiZSBjYWxsZWQgb24gdGhlIG1vc3QgZGVlcGx5IG5lc3RlZCBjaGlsZCBwYXJzZXIgaW5zdGFuY2UKK2ZpcnN0LCBhbmQgb24gaXRzIHBhcmVudCBwYXJzZXIgb25seSBhZnRlciB0aGUgY2hpbGQgcGFyc2VyIGhhcworZmluaXNoZWQsIHRvIGJlIGFwcGxpZWQgcmVjdXJzaXZlbHkgdW50aWwgdGhlIGRvY3VtZW50IGVudGl0eSdzIHBhcnNlcgoraXMgcmVzdGFydGVkLiAgVGhhdCBpcywgdGhlIHBhcmVudCBwYXJzZXIgd2lsbCBub3QgcmVzdW1lIGJ5IGl0c2VsZgorYW5kIGl0IGlzIHVwIHRvIHRoZSBhcHBsaWNhdGlvbiB0byBjYWxsIDxjb2RlPjxhIGhyZWY9CisiI1hNTF9SZXN1bWVQYXJzZXIiID5YTUxfUmVzdW1lUGFyc2VyPC9hPjwvY29kZT4gb24gaXQgYXQgdGhlCithcHByb3ByaWF0ZSBtb21lbnQuPC9wPgorCis8cD5OZXcgaW4gRXhwYXQgMS45NS44LjwvcD4KKzwvZGl2PgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfR2V0UGFyc2luZ1N0YXR1cyI+Cit2b2lkIFhNTENBTEwKK1hNTF9HZXRQYXJzaW5nU3RhdHVzKFhNTF9QYXJzZXIgcCwKKyAgICAgICAgICAgICAgICAgICAgIFhNTF9QYXJzaW5nU3RhdHVzICpzdGF0dXMpOworPC9wcmU+Cis8cHJlIGNsYXNzPSJzaWduYXR1cmUiPgorZW51bSBYTUxfUGFyc2luZyB7CisgIFhNTF9JTklUSUFMSVpFRCwKKyAgWE1MX1BBUlNJTkcsCisgIFhNTF9GSU5JU0hFRCwKKyAgWE1MX1NVU1BFTkRFRAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBlbnVtIFhNTF9QYXJzaW5nIHBhcnNpbmc7CisgIFhNTF9Cb29sIGZpbmFsQnVmZmVyOworfSBYTUxfUGFyc2luZ1N0YXR1czsKKzwvcHJlPgorPGRpdiBjbGFzcz0iZmNuZGVmIj4KKzxwPlJldHVybnMgc3RhdHVzIG9mIHBhcnNlciB3aXRoIHJlc3BlY3QgdG8gYmVpbmcgaW5pdGlhbGl6ZWQsCitwYXJzaW5nLCBmaW5pc2hlZCwgb3Igc3VzcGVuZGVkLCBhbmQgd2hldGhlciB0aGUgZmluYWwgYnVmZmVyIGlzIGJlaW5nCitwcm9jZXNzZWQuICBUaGUgPGNvZGU+c3RhdHVzPC9jb2RlPiBwYXJhbWV0ZXIgPGVtPm11c3Qgbm90PC9lbT4gYmUKK05VTEwuPC9wPgorCis8cD5OZXcgaW4gRXhwYXQgMS45NS44LjwvcD4KKzwvZGl2PgorCisKKzxoMz48YSBuYW1lPSJzZXR0aW5nIj5IYW5kbGVyIFNldHRpbmc8L2E+PC9oMz4KKworPHA+QWx0aG91Z2ggaGFuZGxlcnMgYXJlIHR5cGljYWxseSBzZXQgcHJpb3IgdG8gcGFyc2luZyBhbmQgbGVmdCBhbG9uZSwgYW4KK2FwcGxpY2F0aW9uIG1heSBjaG9vc2UgdG8gc2V0IG9yIGNoYW5nZSB0aGUgaGFuZGxlciBmb3IgYSBwYXJzaW5nIGV2ZW50Cit3aGlsZSB0aGUgcGFyc2UgaXMgaW4gcHJvZ3Jlc3MuIEZvciBpbnN0YW5jZSwgeW91ciBhcHBsaWNhdGlvbiBtYXkgY2hvb3NlCit0byBpZ25vcmUgYWxsIHRleHQgbm90IGRlc2NlbmRlZCBmcm9tIGEgPGNvZGU+cGFyYTwvY29kZT4gZWxlbWVudC4gT25lCit3YXkgaXQgY291bGQgZG8gdGhpcyBpcyB0byBzZXQgdGhlIGNoYXJhY3RlciBoYW5kbGVyIHdoZW4gYSBwYXJhIHN0YXJ0IHRhZworaXMgc2VlbiwgYW5kIHVuc2V0IGl0IGZvciB0aGUgY29ycmVzcG9uZGluZyBlbmQgdGFnLjwvcD4KKworPHA+QSBoYW5kbGVyIG1heSBiZSA8ZW0+dW5zZXQ8L2VtPiBieSBwcm92aWRpbmcgYSBOVUxMIHBvaW50ZXIgdG8gdGhlCithcHByb3ByaWF0ZSBoYW5kbGVyIHNldHRlci4gTm9uZSBvZiB0aGUgaGFuZGxlciBzZXR0aW5nIGZ1bmN0aW9ucyBoYXZlCithIHJldHVybiB2YWx1ZS48L3A+CisKKzxwPllvdXIgaGFuZGxlcnMgd2lsbCBiZSByZWNlaXZpbmcgc3RyaW5ncyBpbiBhcnJheXMgb2YgdHlwZQorPGNvZGU+WE1MX0NoYXI8L2NvZGU+LiBUaGlzIHR5cGUgaXMgY29uZGl0aW9uYWxseSBkZWZpbmVkIGluIGV4cGF0LmggYXMKK2VpdGhlciA8Y29kZT5jaGFyPC9jb2RlPiwgPGNvZGU+d2NoYXJfdDwvY29kZT4gb3IgPGNvZGU+dW5zaWduZWQgc2hvcnQ8L2NvZGU+LgorVGhlIGZvcm1lciBpbXBsaWVzIFVURi04IGVuY29kaW5nLCB0aGUgbGF0dGVyIHR3byBpbXBseSBVVEYtMTYgZW5jb2RpbmcuCitOb3RlIHRoYXQgeW91J2xsIHJlY2VpdmUgdGhlbSBpbiB0aGlzIGZvcm0gaW5kZXBlbmRlbnQgb2YgdGhlIG9yaWdpbmFsCitlbmNvZGluZyBvZiB0aGUgZG9jdW1lbnQuPC9wPgorCis8ZGl2IGNsYXNzPSJoYW5kbGVyIj4KKzxwcmUgY2xhc3M9InNldHRlciIgaWQ9IlhNTF9TZXRTdGFydEVsZW1lbnRIYW5kbGVyIj4KK3ZvaWQgWE1MQ0FMTAorWE1MX1NldFN0YXJ0RWxlbWVudEhhbmRsZXIoWE1MX1BhcnNlciBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1N0YXJ0RWxlbWVudEhhbmRsZXIgc3RhcnQpOworPC9wcmU+Cis8cHJlIGNsYXNzPSJzaWduYXR1cmUiPgordHlwZWRlZiB2b2lkCisoWE1MQ0FMTCAqWE1MX1N0YXJ0RWxlbWVudEhhbmRsZXIpKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKiphdHRzKTsKKzwvcHJlPgorPHA+U2V0IGhhbmRsZXIgZm9yIHN0YXJ0IChhbmQgZW1wdHkpIHRhZ3MuIEF0dHJpYnV0ZXMgYXJlIHBhc3NlZCB0byB0aGUgc3RhcnQKK2hhbmRsZXIgYXMgYSBwb2ludGVyIHRvIGEgdmVjdG9yIG9mIGNoYXIgcG9pbnRlcnMuIEVhY2ggYXR0cmlidXRlIHNlZW4gaW4KK2Egc3RhcnQgKG9yIGVtcHR5KSB0YWcgb2NjdXBpZXMgMiBjb25zZWN1dGl2ZSBwbGFjZXMgaW4gdGhpcyB2ZWN0b3I6IHRoZQorYXR0cmlidXRlIG5hbWUgZm9sbG93ZWQgYnkgdGhlIGF0dHJpYnV0ZSB2YWx1ZS4gVGhlc2UgcGFpcnMgYXJlIHRlcm1pbmF0ZWQKK2J5IGEgbnVsbCBwb2ludGVyLjwvcD4KKzxwPk5vdGUgdGhhdCBhbiBlbXB0eSB0YWcgZ2VuZXJhdGVzIGEgY2FsbCB0byBib3RoIHN0YXJ0IGFuZCBlbmQgaGFuZGxlcnMKKyhpbiB0aGF0IG9yZGVyKS48L3A+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0iaGFuZGxlciI+Cis8cHJlIGNsYXNzPSJzZXR0ZXIiIGlkPSJYTUxfU2V0RW5kRWxlbWVudEhhbmRsZXIiPgordm9pZCBYTUxDQUxMCitYTUxfU2V0RW5kRWxlbWVudEhhbmRsZXIoWE1MX1BhcnNlciBwLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmRFbGVtZW50SGFuZGxlcik7Cis8L3ByZT4KKzxwcmUgY2xhc3M9InNpZ25hdHVyZSI+Cit0eXBlZGVmIHZvaWQKKyhYTUxDQUxMICpYTUxfRW5kRWxlbWVudEhhbmRsZXIpKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5hbWUpOworPC9wcmU+Cis8cD5TZXQgaGFuZGxlciBmb3IgZW5kIChhbmQgZW1wdHkpIHRhZ3MuIEFzIG5vdGVkIGFib3ZlLCBhbiBlbXB0eSB0YWcKK2dlbmVyYXRlcyBhIGNhbGwgdG8gYm90aCBzdGFydCBhbmQgZW5kIGhhbmRsZXJzLjwvcD4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJoYW5kbGVyIj4KKzxwcmUgY2xhc3M9InNldHRlciIgaWQ9IlhNTF9TZXRFbGVtZW50SGFuZGxlciI+Cit2b2lkIFhNTENBTEwKK1hNTF9TZXRFbGVtZW50SGFuZGxlcihYTUxfUGFyc2VyIHAsCisgICAgICAgICAgICAgICAgICAgICAgWE1MX1N0YXJ0RWxlbWVudEhhbmRsZXIgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgWE1MX0VuZEVsZW1lbnRIYW5kbGVyIGVuZCk7Cis8L3ByZT4KKzxwPlNldCBoYW5kbGVycyBmb3Igc3RhcnQgYW5kIGVuZCB0YWdzIHdpdGggb25lIGNhbGwuPC9wPgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImhhbmRsZXIiPgorPHByZSBjbGFzcz0ic2V0dGVyIiBpZD0iWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyIj4KK3ZvaWQgWE1MQ0FMTAorWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyKFhNTF9QYXJzZXIgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfQ2hhcmFjdGVyRGF0YUhhbmRsZXIgY2hhcmhuZGwpCis8L3ByZT4KKzxwcmUgY2xhc3M9InNpZ25hdHVyZSI+Cit0eXBlZGVmIHZvaWQKKyhYTUxDQUxMICpYTUxfQ2hhcmFjdGVyRGF0YUhhbmRsZXIpKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKTsKKzwvcHJlPgorPHA+U2V0IGEgdGV4dCBoYW5kbGVyLiBUaGUgc3RyaW5nIHlvdXIgaGFuZGxlciByZWNlaXZlcworaXMgPGVtPk5PVCBudWwtdGVybWluYXRlZDwvZW0+LiBZb3UgaGF2ZSB0byB1c2UgdGhlIGxlbmd0aCBhcmd1bWVudAordG8gZGVhbCB3aXRoIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4gQSBzaW5nbGUgYmxvY2sgb2YgY29udGlndW91cyB0ZXh0CitmcmVlIG9mIG1hcmt1cCBtYXkgc3RpbGwgcmVzdWx0IGluIGEgc2VxdWVuY2Ugb2YgY2FsbHMgdG8gdGhpcyBoYW5kbGVyLgorSW4gb3RoZXIgd29yZHMsIGlmIHlvdSdyZSBzZWFyY2hpbmcgZm9yIGEgcGF0dGVybiBpbiB0aGUgdGV4dCwgaXQgbWF5CitiZSBzcGxpdCBhY3Jvc3MgY2FsbHMgdG8gdGhpcyBoYW5kbGVyLiBOb3RlOiBTZXR0aW5nIHRoaXMgaGFuZGxlciB0byBOVUxMCittYXkgPGVtPk5PVCBpbW1lZGlhdGVseTwvZW0+IHRlcm1pbmF0ZSBjYWxsLWJhY2tzIGlmIHRoZSBwYXJzZXIgaXMgY3VycmVudGx5Citwcm9jZXNzaW5nIHN1Y2ggYSBzaW5nbGUgYmxvY2sgb2YgY29udGlndW91cyBtYXJrdXAtZnJlZSB0ZXh0LCBhcyB0aGUgcGFyc2VyCit3aWxsIGNvbnRpbnVlIGNhbGxpbmcgYmFjayB1bnRpbCB0aGUgZW5kIG9mIHRoZSBibG9jayBpcyByZWFjaGVkLjwvcD4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJoYW5kbGVyIj4KKzxwcmUgY2xhc3M9InNldHRlciIgaWQ9IlhNTF9TZXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyIj4KK3ZvaWQgWE1MQ0FMTAorWE1MX1NldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIoWE1MX1BhcnNlciBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1Byb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIgcHJvYykKKzwvcHJlPgorPHByZSBjbGFzcz0ic2lnbmF0dXJlIj4KK3R5cGVkZWYgdm9pZAorKFhNTENBTEwgKlhNTF9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyKSh2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmRhdGEpOworCis8L3ByZT4KKzxwPlNldCBhIGhhbmRsZXIgZm9yIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLiBUaGUgdGFyZ2V0IGlzIHRoZSBmaXJzdCB3b3JkCitpbiB0aGUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4gVGhlIGRhdGEgaXMgdGhlIHJlc3Qgb2YgdGhlIGNoYXJhY3RlcnMgaW4KK2l0IGFmdGVyIHNraXBwaW5nIGFsbCB3aGl0ZXNwYWNlIGFmdGVyIHRoZSBpbml0aWFsIHdvcmQuPC9wPgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImhhbmRsZXIiPgorPHByZSBjbGFzcz0ic2V0dGVyIiBpZD0iWE1MX1NldENvbW1lbnRIYW5kbGVyIj4KK3ZvaWQgWE1MQ0FMTAorWE1MX1NldENvbW1lbnRIYW5kbGVyKFhNTF9QYXJzZXIgcCwKKyAgICAgICAgICAgICAgICAgICAgICBYTUxfQ29tbWVudEhhbmRsZXIgY21udCkKKzwvcHJlPgorPHByZSBjbGFzcz0ic2lnbmF0dXJlIj4KK3R5cGVkZWYgdm9pZAorKFhNTENBTEwgKlhNTF9Db21tZW50SGFuZGxlcikodm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqZGF0YSk7Cis8L3ByZT4KKzxwPlNldCBhIGhhbmRsZXIgZm9yIGNvbW1lbnRzLiBUaGUgZGF0YSBpcyBhbGwgdGV4dCBpbnNpZGUgdGhlIGNvbW1lbnQKK2RlbGltaXRlcnMuPC9wPgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImhhbmRsZXIiPgorPHByZSBjbGFzcz0ic2V0dGVyIiBpZD0iWE1MX1NldFN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlciI+Cit2b2lkIFhNTENBTEwKK1hNTF9TZXRTdGFydENkYXRhU2VjdGlvbkhhbmRsZXIoWE1MX1BhcnNlciBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfU3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyIHN0YXJ0KTsKKzwvcHJlPgorPHByZSBjbGFzcz0ic2lnbmF0dXJlIj4KK3R5cGVkZWYgdm9pZAorKFhNTENBTEwgKlhNTF9TdGFydENkYXRhU2VjdGlvbkhhbmRsZXIpKHZvaWQgKnVzZXJEYXRhKTsKKzwvcHJlPgorPHA+U2V0IGEgaGFuZGxlciB0aGF0IGdldHMgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBDREFUQSBzZWN0aW9uLjwvcD4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJoYW5kbGVyIj4KKzxwcmUgY2xhc3M9InNldHRlciIgaWQ9IlhNTF9TZXRFbmRDZGF0YVNlY3Rpb25IYW5kbGVyIj4KK3ZvaWQgWE1MQ0FMTAorWE1MX1NldEVuZENkYXRhU2VjdGlvbkhhbmRsZXIoWE1MX1BhcnNlciBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0VuZENkYXRhU2VjdGlvbkhhbmRsZXIgZW5kKTsKKzwvcHJlPgorPHByZSBjbGFzcz0ic2lnbmF0dXJlIj4KK3R5cGVkZWYgdm9pZAorKFhNTENBTEwgKlhNTF9FbmRDZGF0YVNlY3Rpb25IYW5kbGVyKSh2b2lkICp1c2VyRGF0YSk7Cis8L3ByZT4KKzxwPlNldCBhIGhhbmRsZXIgdGhhdCBnZXRzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIGEgQ0RBVEEgc2VjdGlvbi48L3A+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0iaGFuZGxlciI+Cis8cHJlIGNsYXNzPSJzZXR0ZXIiIGlkPSJYTUxfU2V0Q2RhdGFTZWN0aW9uSGFuZGxlciI+Cit2b2lkIFhNTENBTEwKK1hNTF9TZXRDZGF0YVNlY3Rpb25IYW5kbGVyKFhNTF9QYXJzZXIgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9TdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfRW5kQ2RhdGFTZWN0aW9uSGFuZGxlciBlbmQpCis8L3ByZT4KKzxwPlNldHMgYm90aCBDREFUQSBzZWN0aW9uIGhhbmRsZXJzIHdpdGggb25lIGNhbGwuPC9wPgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImhhbmRsZXIiPgorPHByZSBjbGFzcz0ic2V0dGVyIiBpZD0iWE1MX1NldERlZmF1bHRIYW5kbGVyIj4KK3ZvaWQgWE1MQ0FMTAorWE1MX1NldERlZmF1bHRIYW5kbGVyKFhNTF9QYXJzZXIgcCwKKyAgICAgICAgICAgICAgICAgICAgICBYTUxfRGVmYXVsdEhhbmRsZXIgaG5kbCkKKzwvcHJlPgorPHByZSBjbGFzcz0ic2lnbmF0dXJlIj4KK3R5cGVkZWYgdm9pZAorKFhNTENBTEwgKlhNTF9EZWZhdWx0SGFuZGxlcikodm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pOworPC9wcmU+CisKKzxwPlNldHMgYSBoYW5kbGVyIGZvciBhbnkgY2hhcmFjdGVycyBpbiB0aGUgZG9jdW1lbnQgd2hpY2ggd291bGRuJ3QKK290aGVyd2lzZSBiZSBoYW5kbGVkLiBUaGlzIGluY2x1ZGVzIGJvdGggZGF0YSBmb3Igd2hpY2ggbm8gaGFuZGxlcnMKK2NhbiBiZSBzZXQgKGxpa2Ugc29tZSBraW5kcyBvZiBEVEQgZGVjbGFyYXRpb25zKSBhbmQgZGF0YSB3aGljaCBjb3VsZAorYmUgcmVwb3J0ZWQgYnV0IHdoaWNoIGN1cnJlbnRseSBoYXMgbm8gaGFuZGxlciBzZXQuICBUaGUgY2hhcmFjdGVycworYXJlIHBhc3NlZCBleGFjdGx5IGFzIHRoZXkgd2VyZSBwcmVzZW50IGluIHRoZSBYTUwgZG9jdW1lbnQgZXhjZXB0Cit0aGF0IHRoZXkgd2lsbCBiZSBlbmNvZGVkIGluIFVURi04IG9yIFVURi0xNi4gTGluZSBib3VuZGFyaWVzIGFyZSBub3QKK25vcm1hbGl6ZWQuIE5vdGUgdGhhdCBhIGJ5dGUgb3JkZXIgbWFyayBjaGFyYWN0ZXIgaXMgbm90IHBhc3NlZCB0byB0aGUKK2RlZmF1bHQgaGFuZGxlci4gVGhlcmUgYXJlIG5vIGd1YXJhbnRlZXMgYWJvdXQgaG93IGNoYXJhY3RlcnMgYXJlCitkaXZpZGVkIGJldHdlZW4gY2FsbHMgdG8gdGhlIGRlZmF1bHQgaGFuZGxlcjogZm9yIGV4YW1wbGUsIGEgY29tbWVudAorbWlnaHQgYmUgc3BsaXQgYmV0d2VlbiBtdWx0aXBsZSBjYWxscy4gIFNldHRpbmcgdGhlIGhhbmRsZXIgd2l0aAordGhpcyBjYWxsIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgdHVybmluZyBvZmYgZXhwYW5zaW9uIG9mIHJlZmVyZW5jZXMKK3RvIGludGVybmFsbHkgZGVmaW5lZCBnZW5lcmFsIGVudGl0aWVzLiBJbnN0ZWFkIHRoZXNlIHJlZmVyZW5jZXMgYXJlCitwYXNzZWQgdG8gdGhlIGRlZmF1bHQgaGFuZGxlci48L3A+CisKKzxwPlNlZSBhbHNvIDxjb2RlPjxhCitocmVmPSIjWE1MX0RlZmF1bHRDdXJyZW50Ij5YTUxfRGVmYXVsdEN1cnJlbnQ8L2E+PC9jb2RlPi48L3A+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0iaGFuZGxlciI+Cis8cHJlIGNsYXNzPSJzZXR0ZXIiIGlkPSJYTUxfU2V0RGVmYXVsdEhhbmRsZXJFeHBhbmQiPgordm9pZCBYTUxDQUxMCitYTUxfU2V0RGVmYXVsdEhhbmRsZXJFeHBhbmQoWE1MX1BhcnNlciBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9EZWZhdWx0SGFuZGxlciBobmRsKQorPC9wcmU+Cis8cHJlIGNsYXNzPSJzaWduYXR1cmUiPgordHlwZWRlZiB2b2lkCisoWE1MQ0FMTCAqWE1MX0RlZmF1bHRIYW5kbGVyKSh2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbik7Cis8L3ByZT4KKzxwPlRoaXMgc2V0cyBhIGRlZmF1bHQgaGFuZGxlciwgYnV0IGRvZXNuJ3QgaW5oaWJpdCB0aGUgZXhwYW5zaW9uIG9mCitpbnRlcm5hbCBlbnRpdHkgcmVmZXJlbmNlcy4gIFRoZSBlbnRpdHkgcmVmZXJlbmNlIHdpbGwgbm90IGJlIHBhc3NlZAordG8gdGhlIGRlZmF1bHQgaGFuZGxlci48L3A+CisKKzxwPlNlZSBhbHNvIDxjb2RlPjxhCitocmVmPSIjWE1MX0RlZmF1bHRDdXJyZW50Ij5YTUxfRGVmYXVsdEN1cnJlbnQ8L2E+PC9jb2RlPi48L3A+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0iaGFuZGxlciI+Cis8cHJlIGNsYXNzPSJzZXR0ZXIiIGlkPSJYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIj4KK3ZvaWQgWE1MQ0FMTAorWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlcihYTUxfUGFyc2VyIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIgaG5kbCkKKzwvcHJlPgorPHByZSBjbGFzcz0ic2lnbmF0dXJlIj4KK3R5cGVkZWYgaW50CisoWE1MQ0FMTCAqWE1MX0V4dGVybmFsRW50aXR5UmVmSGFuZGxlcikoWE1MX1BhcnNlciBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzeXN0ZW1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHVibGljSWQpOworPC9wcmU+Cis8cD5TZXQgYW4gZXh0ZXJuYWwgZW50aXR5IHJlZmVyZW5jZSBoYW5kbGVyLiBUaGlzIGhhbmRsZXIgaXMgYWxzbworY2FsbGVkIGZvciBwcm9jZXNzaW5nIGFuIGV4dGVybmFsIERURCBzdWJzZXQgaWYgcGFyYW1ldGVyIGVudGl0eSBwYXJzaW5nCitpcyBpbiBlZmZlY3QuIChTZWUgPGEgaHJlZj0iI1hNTF9TZXRQYXJhbUVudGl0eVBhcnNpbmciPgorPGNvZGU+WE1MX1NldFBhcmFtRW50aXR5UGFyc2luZzwvY29kZT48L2E+Lik8L3A+CisKKzxwPlRoZSA8Y29kZT5jb250ZXh0PC9jb2RlPiBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBwYXJzaW5nIGNvbnRleHQgaW4KK3RoZSBmb3JtYXQgZXhwZWN0ZWQgYnkgdGhlIDxjb2RlPmNvbnRleHQ8L2NvZGU+IGFyZ3VtZW50IHRvIDxjb2RlPjxhCitocmVmPSIjWE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlIgorPlhNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZTwvYT48L2NvZGU+LiAgPGNvZGU+Y29kZTwvY29kZT4gaXMKK3ZhbGlkIG9ubHkgdW50aWwgdGhlIGhhbmRsZXIgcmV0dXJucywgc28gaWYgdGhlIHJlZmVyZW5jZWQgZW50aXR5IGlzCit0byBiZSBwYXJzZWQgbGF0ZXIsIGl0IG11c3QgYmUgY29waWVkLiAgPGNvZGU+Y29udGV4dDwvY29kZT4gaXMgTlVMTAorb25seSB3aGVuIHRoZSBlbnRpdHkgaXMgYSBwYXJhbWV0ZXIgZW50aXR5LCB3aGljaCBpcyBob3cgb25lIGNhbgorZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGdlbmVyYWwgYW5kIHBhcmFtZXRlciBlbnRpdGllcy48L3A+CisKKzxwPlRoZSA8Y29kZT5iYXNlPC9jb2RlPiBwYXJhbWV0ZXIgaXMgdGhlIGJhc2UgdG8gdXNlIGZvciByZWxhdGl2ZQorc3lzdGVtIGlkZW50aWZpZXJzLiAgSXQgaXMgc2V0IGJ5IDxjb2RlPjxhCitocmVmPSIjWE1MX1NldEJhc2UiPlhNTF9TZXRCYXNlPC9hPjwvY29kZT4gYW5kIG1heSBiZSBOVUxMLiBUaGUKKzxjb2RlPnB1YmxpY0lkPC9jb2RlPiBwYXJhbWV0ZXIgaXMgdGhlIHB1YmxpYyBpZCBnaXZlbiBpbiB0aGUgZW50aXR5CitkZWNsYXJhdGlvbiBhbmQgbWF5IGJlIE5VTEwuICA8Y29kZT5zeXN0ZW1JZDwvY29kZT4gaXMgdGhlIHN5c3RlbQoraWRlbnRpZmllciBzcGVjaWZpZWQgaW4gdGhlIGVudGl0eSBkZWNsYXJhdGlvbiBhbmQgaXMgbmV2ZXIgTlVMTC48L3A+CisKKzxwPlRoZXJlIGFyZSBhIGNvdXBsZSBvZiB3YXlzIGluIHdoaWNoIHRoaXMgaGFuZGxlciBkaWZmZXJzIGZyb20KK290aGVycy4gIEZpcnN0LCB0aGlzIGhhbmRsZXIgcmV0dXJucyBhIHN0YXR1cyBpbmRpY2F0b3IgKGFuCitpbnRlZ2VyKS4gPGNvZGU+WE1MX1NUQVRVU19PSzwvY29kZT4gc2hvdWxkIGJlIHJldHVybmVkIGZvciBzdWNjZXNzZnVsCitoYW5kbGluZyBvZiB0aGUgZXh0ZXJuYWwgZW50aXR5IHJlZmVyZW5jZS4gIFJldHVybmluZworPGNvZGU+WE1MX1NUQVRVU19FUlJPUjwvY29kZT4gaW5kaWNhdGVzIGZhaWx1cmUsIGFuZCBjYXVzZXMgdGhlCitjYWxsaW5nIHBhcnNlciB0byByZXR1cm4gYW4KKzxjb2RlPlhNTF9FUlJPUl9FWFRFUk5BTF9FTlRJVFlfSEFORExJTkc8L2NvZGU+IGVycm9yLjwvcD4KKworPHA+U2Vjb25kLCBpbnN0ZWFkIG9mIGhhdmluZyB0aGUgdXNlciBkYXRhIGFzIGl0cyBmaXJzdCBhcmd1bWVudCwgaXQKK3JlY2VpdmVzIHRoZSBwYXJzZXIgdGhhdCBlbmNvdW50ZXJlZCB0aGUgZW50aXR5IHJlZmVyZW5jZS4gVGhpcywgYWxvbmcKK3dpdGggdGhlIGNvbnRleHQgcGFyYW1ldGVyLCBtYXkgYmUgdXNlZCBhcyBhcmd1bWVudHMgdG8gYSBjYWxsIHRvCis8Y29kZT48YSBocmVmPSAiI1hNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZSIKKz5YTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGU8L2E+PC9jb2RlPi4gIFVzaW5nIHRoZSByZXR1cm5lZAorcGFyc2VyLCB0aGUgYm9keSBvZiB0aGUgZXh0ZXJuYWwgZW50aXR5IGNhbiBiZSByZWN1cnNpdmVseSBwYXJzZWQuPC9wPgorCis8cD5TaW5jZSB0aGlzIGhhbmRsZXIgbWF5IGJlIGNhbGxlZCByZWN1cnNpdmVseSwgaXQgc2hvdWxkIG5vdCBiZSBzYXZpbmcKK2luZm9ybWF0aW9uIGludG8gZ2xvYmFsIG9yIHN0YXRpYyB2YXJpYWJsZXMuPC9wPgorPC9kaXY+CisKKzxwcmUgY2xhc3M9ImZjbmRlYyIgaWQ9IlhNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmciPgordm9pZCBYTUxDQUxMCitYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnKFhNTF9QYXJzZXIgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnKQorPC9wcmU+Cis8ZGl2IGNsYXNzPSJmY25kZWYiPgorPHA+U2V0IHRoZSBhcmd1bWVudCBwYXNzZWQgdG8gdGhlIEV4dGVybmFsRW50aXR5UmVmSGFuZGxlci4gIElmCis8Y29kZT5hcmc8L2NvZGU+IGlzIG5vdCBOVUxMLCBpdCBpcyB0aGUgbmV3IHZhbHVlIHBhc3NlZCB0byB0aGUKK2hhbmRsZXIgc2V0IHVzaW5nIDxjb2RlPjxhIGhyZWY9IiNYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIgorPlhNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXI8L2E+PC9jb2RlPjsgaWYgPGNvZGU+YXJnPC9jb2RlPiBpcworTlVMTCwgdGhlIGFyZ3VtZW50IHBhc3NlZCB0byB0aGUgaGFuZGxlciBmdW5jdGlvbiB3aWxsIGJlIHRoZSBwYXJzZXIKK29iamVjdCBpdHNlbGYuPC9wPgorCis8cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+CitUaGUgdHlwZSBvZiA8Y29kZT5hcmc8L2NvZGU+IGFuZCB0aGUgdHlwZSBvZiB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlCitFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIgZG8gbm90IG1hdGNoLiAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhCis8Y29kZT52b2lkICo8L2NvZGU+IHRvIGJlIHBhc3NlZCB0byB0aGUgaGFuZGxlciwgd2hpbGUgdGhlIGhhbmRsZXIKK2FjY2VwdHMgYW4gPGNvZGU+WE1MX1BhcnNlcjwvY29kZT4uICBUaGlzIGlzIGEgaGlzdG9yaWNhbCBhY2NpZGVudCwKK2J1dCB3aWxsIG5vdCBiZSBjb3JyZWN0ZWQgYmVmb3JlIEV4cGF0IDIuMCAoYXQgdGhlIGVhcmxpZXN0KSB0byBhdm9pZAorY2F1c2luZyBjb21waWxlciB3YXJuaW5ncyBmb3IgY29kZSB0aGF0J3Mga25vd24gdG8gd29yayB3aXRoIHRoaXMKK0FQSS4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgYXBwbGljYXRpb24gY29kZSB0byBrbm93IHRoZQorYWN0dWFsIHR5cGUgb2YgdGhlIGFyZ3VtZW50IHBhc3NlZCB0byB0aGUgaGFuZGxlciBhbmQgdG8gbWFuYWdlIGl0Citwcm9wZXJseS48L3A+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0iaGFuZGxlciI+Cis8cHJlIGNsYXNzPSJzZXR0ZXIiIGlkPSJYTUxfU2V0U2tpcHBlZEVudGl0eUhhbmRsZXIiPgordm9pZCBYTUxDQUxMCitYTUxfU2V0U2tpcHBlZEVudGl0eUhhbmRsZXIoWE1MX1BhcnNlciBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9Ta2lwcGVkRW50aXR5SGFuZGxlciBoYW5kbGVyKQorPC9wcmU+Cis8cHJlIGNsYXNzPSJzaWduYXR1cmUiPgordHlwZWRlZiB2b2lkCisoWE1MQ0FMTCAqWE1MX1NraXBwZWRFbnRpdHlIYW5kbGVyKSh2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICplbnRpdHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX3BhcmFtZXRlcl9lbnRpdHkpOworPC9wcmU+Cis8cD5TZXQgYSBza2lwcGVkIGVudGl0eSBoYW5kbGVyLiBUaGlzIGlzIGNhbGxlZCBpbiB0d28gc2l0dWF0aW9uczo8L3A+Cis8b2w+CisgICA8bGk+QW4gZW50aXR5IHJlZmVyZW5jZSBpcyBlbmNvdW50ZXJlZCBmb3Igd2hpY2ggbm8gZGVjbGFyYXRpb24KKyAgICAgICBoYXMgYmVlbiByZWFkIDxlbT5hbmQ8L2VtPiB0aGlzIGlzIG5vdCBhbiBlcnJvci48L2xpPgorICAgPGxpPkFuIGludGVybmFsIGVudGl0eSByZWZlcmVuY2UgaXMgcmVhZCwgYnV0IG5vdCBleHBhbmRlZCwgYmVjYXVzZQorICAgICAgIDxhIGhyZWY9IiNYTUxfU2V0RGVmYXVsdEhhbmRsZXIiPjxjb2RlPlhNTF9TZXREZWZhdWx0SGFuZGxlcjwvY29kZT48L2E+CisJICAgaGFzIGJlZW4gY2FsbGVkLjwvbGk+Cis8L29sPgorPHA+VGhlIDxjb2RlPmlzX3BhcmFtZXRlcl9lbnRpdHk8L2NvZGU+IGFyZ3VtZW50IHdpbGwgYmUgbm9uLXplcm8gZm9yCithIHBhcmFtZXRlciBlbnRpdHkgYW5kIHplcm8gZm9yIGEgZ2VuZXJhbCBlbnRpdHkuPC9wPiA8cD5Ob3RlOiBza2lwcGVkCitwYXJhbWV0ZXIgZW50aXRpZXMgaW4gZGVjbGFyYXRpb25zIGFuZCBza2lwcGVkIGdlbmVyYWwgZW50aXRpZXMgaW4KK2F0dHJpYnV0ZSB2YWx1ZXMgY2Fubm90IGJlIHJlcG9ydGVkLCBiZWNhdXNlIHRoZSBldmVudCB3b3VsZCBiZSBvdXQgb2YKK3N5bmMgd2l0aCB0aGUgcmVwb3J0aW5nIG9mIHRoZSBkZWNsYXJhdGlvbnMgb3IgYXR0cmlidXRlIHZhbHVlczwvcD4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJoYW5kbGVyIj4KKzxwcmUgY2xhc3M9InNldHRlciIgaWQ9IlhNTF9TZXRVbmtub3duRW5jb2RpbmdIYW5kbGVyIj4KK3ZvaWQgWE1MQ0FMTAorWE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXIoWE1MX1BhcnNlciBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1Vua25vd25FbmNvZGluZ0hhbmRsZXIgZW5jaGFuZGxlciwKKwkJCSAgICAgIHZvaWQgKmVuY29kaW5nSGFuZGxlckRhdGEpCis8L3ByZT4KKzxwcmUgY2xhc3M9InNpZ25hdHVyZSI+Cit0eXBlZGVmIGludAorKFhNTENBTEwgKlhNTF9Vbmtub3duRW5jb2RpbmdIYW5kbGVyKSh2b2lkICplbmNvZGluZ0hhbmRsZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0VuY29kaW5nICppbmZvKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgbWFwWzI1Nl07CisgIHZvaWQgKmRhdGE7CisgIGludCAoWE1MQ0FMTCAqY29udmVydCkodm9pZCAqZGF0YSwgY29uc3QgY2hhciAqcyk7CisgIHZvaWQgKFhNTENBTEwgKnJlbGVhc2UpKHZvaWQgKmRhdGEpOworfSBYTUxfRW5jb2Rpbmc7Cis8L3ByZT4KKzxwPlNldCBhIGhhbmRsZXIgdG8gZGVhbCB3aXRoIGVuY29kaW5ncyBvdGhlciB0aGFuIHRoZSA8YQoraHJlZj0iI2J1aWx0aW5fZW5jb2RpbmdzIj5idWlsdCBpbiBzZXQ8L2E+LiBUaGlzIHNob3VsZCBiZSBkb25lIGJlZm9yZQorPGNvZGU+PGEgaHJlZj0gIiNYTUxfUGFyc2UiID5YTUxfUGFyc2U8L2E+PC9jb2RlPiBvciA8Y29kZT48YSBocmVmPQorIiNYTUxfUGFyc2VCdWZmZXIiID5YTUxfUGFyc2VCdWZmZXI8L2E+PC9jb2RlPiBoYXZlIGJlZW4gY2FsbGVkIG9uIHRoZQorZ2l2ZW4gcGFyc2VyLjwvcD4gPHA+SWYgdGhlIGhhbmRsZXIga25vd3MgaG93IHRvIGRlYWwgd2l0aCBhbiBlbmNvZGluZword2l0aCB0aGUgZ2l2ZW4gbmFtZSwgaXQgc2hvdWxkIGZpbGwgaW4gdGhlIDxjb2RlPmluZm88L2NvZGU+IGRhdGEKK3N0cnVjdHVyZSBhbmQgcmV0dXJuIDxjb2RlPlhNTF9TVEFUVVNfT0s8L2NvZGU+LiBPdGhlcndpc2UgaXQKK3Nob3VsZCByZXR1cm4gPGNvZGU+WE1MX1NUQVRVU19FUlJPUjwvY29kZT4uIFRoZSBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkCithdCBtb3N0IG9uY2UgcGVyIHBhcnNlZCAoZXh0ZXJuYWwpIGVudGl0eS4gVGhlIG9wdGlvbmFsIGFwcGxpY2F0aW9uCitkYXRhIHBvaW50ZXIgPGNvZGU+ZW5jb2RpbmdIYW5kbGVyRGF0YTwvY29kZT4gd2lsbCBiZSBwYXNzZWQgYmFjayB0bwordGhlIGhhbmRsZXIuPC9wPgorCis8cD5UaGUgbWFwIGFycmF5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBldmVyeSBwb3NzaWJsZSBwb3NzaWJsZSBsZWFkaW5nCitieXRlIGluIGEgYnl0ZSBzZXF1ZW5jZS4gSWYgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaXMgJmd0Oz0gMCwgdGhlbiBpdCdzCithIHNpbmdsZSBieXRlIHNlcXVlbmNlIGFuZCB0aGUgYnl0ZSBlbmNvZGVzIHRoYXQgVW5pY29kZSB2YWx1ZS4gSWYgdGhlCit2YWx1ZSBpcyAtMSwgdGhlbiB0aGF0IGJ5dGUgaXMgaW52YWxpZCBhcyB0aGUgaW5pdGlhbCBieXRlIGluIGEgc2VxdWVuY2UuCitJZiB0aGUgdmFsdWUgaXMgLW4sIHdoZXJlIG4gaXMgYW4gaW50ZWdlciAmZ3Q7IDEsIHRoZW4gbiBpcyB0aGUgbnVtYmVyIG9mCitieXRlcyBpbiB0aGUgc2VxdWVuY2UgYW5kIHRoZSBhY3R1YWwgY29udmVyc2lvbiBpcyBhY2NvbXBsaXNoZWQgYnkgYQorY2FsbCB0byB0aGUgZnVuY3Rpb24gcG9pbnRlZCBhdCBieSBjb252ZXJ0LiBUaGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gLTEKK2lmIHRoZSBzZXF1ZW5jZSBpdHNlbGYgaXMgaW52YWxpZC4gVGhlIGNvbnZlcnQgcG9pbnRlciBtYXkgYmUgbnVsbCBpZgordGhlcmUgYXJlIG9ubHkgc2luZ2xlIGJ5dGUgY29kZXMuIFRoZSBkYXRhIHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIGNvbnZlcnQKK2Z1bmN0aW9uIGlzIHRoZSBkYXRhIHBvaW50ZXIgZnJvbSA8Y29kZT5YTUxfRW5jb2Rpbmc8L2NvZGU+LiBUaGUKK3N0cmluZyBzIGlzIDxlbT5OT1Q8L2VtPiBudWwtdGVybWluYXRlZCBhbmQgcG9pbnRzIGF0IHRoZSBzZXF1ZW5jZSBvZgorYnl0ZXMgdG8gYmUgY29udmVydGVkLjwvcD4KKworPHA+VGhlIGZ1bmN0aW9uIHBvaW50ZWQgYXQgYnkgPGNvZGU+cmVsZWFzZTwvY29kZT4gaXMgY2FsbGVkIGJ5IHRoZQorcGFyc2VyIHdoZW4gaXQgaXMgZmluaXNoZWQgd2l0aCB0aGUgZW5jb2RpbmcuIEl0IG1heSBiZSBOVUxMLjwvcD4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJoYW5kbGVyIj4KKzxwcmUgY2xhc3M9InNldHRlciIgaWQ9IlhNTF9TZXRTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyIj4KK3ZvaWQgWE1MQ0FMTAorWE1MX1NldFN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwLAorCQkJICAgICAgICAgWE1MX1N0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIgc3RhcnQpOworPC9wcmU+Cis8cHJlIGNsYXNzPSJzaWduYXR1cmUiPgordHlwZWRlZiB2b2lkCisoWE1MQ0FMTCAqWE1MX1N0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIpKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqdXJpKTsKKzwvcHJlPgorPHA+U2V0IGEgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiBhIG5hbWVzcGFjZSBpcyBkZWNsYXJlZC4gTmFtZXNwYWNlCitkZWNsYXJhdGlvbnMgb2NjdXIgaW5zaWRlIHN0YXJ0IHRhZ3MuIEJ1dCB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIHN0YXJ0CitoYW5kbGVyIGlzIGNhbGxlZCBiZWZvcmUgdGhlIHN0YXJ0IHRhZyBoYW5kbGVyIGZvciBlYWNoIG5hbWVzcGFjZSBkZWNsYXJlZAoraW4gdGhhdCBzdGFydCB0YWcuPC9wPgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImhhbmRsZXIiPgorPHByZSBjbGFzcz0ic2V0dGVyIiBpZD0iWE1MX1NldEVuZE5hbWVzcGFjZURlY2xIYW5kbGVyIj4KK3ZvaWQgWE1MQ0FMTAorWE1MX1NldEVuZE5hbWVzcGFjZURlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcCwKKwkJCSAgICAgICBYTUxfRW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIgZW5kKTsKKzwvcHJlPgorPHByZSBjbGFzcz0ic2lnbmF0dXJlIj4KK3R5cGVkZWYgdm9pZAorKFhNTENBTEwgKlhNTF9FbmROYW1lc3BhY2VEZWNsSGFuZGxlcikodm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHJlZml4KTsKKzwvcHJlPgorPHA+U2V0IGEgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiBsZWF2aW5nIHRoZSBzY29wZSBvZiBhIG5hbWVzcGFjZQorZGVjbGFyYXRpb24uIFRoaXMgd2lsbCBiZSBjYWxsZWQsIGZvciBlYWNoIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiwKK2FmdGVyIHRoZSBoYW5kbGVyIGZvciB0aGUgZW5kIHRhZyBvZiB0aGUgZWxlbWVudCBpbiB3aGljaCB0aGUKK25hbWVzcGFjZSB3YXMgZGVjbGFyZWQuPC9wPgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImhhbmRsZXIiPgorPHByZSBjbGFzcz0ic2V0dGVyIiBpZD0iWE1MX1NldE5hbWVzcGFjZURlY2xIYW5kbGVyIj4KK3ZvaWQgWE1MQ0FMTAorWE1MX1NldE5hbWVzcGFjZURlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfU3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfRW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIgZW5kKQorPC9wcmU+Cis8cD5TZXRzIGJvdGggbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGhhbmRsZXJzIHdpdGggYSBzaW5nbGUgY2FsbC48L3A+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0iaGFuZGxlciI+Cis8cHJlIGNsYXNzPSJzZXR0ZXIiIGlkPSJYTUxfU2V0WG1sRGVjbEhhbmRsZXIiPgordm9pZCBYTUxDQUxMCitYTUxfU2V0WG1sRGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwLAorCQkgICAgICBYTUxfWG1sRGVjbEhhbmRsZXIgeG1sZGVjbCk7Cis8L3ByZT4KKzxwcmUgY2xhc3M9InNpZ25hdHVyZSI+Cit0eXBlZGVmIHZvaWQKKyhYTUxDQUxMICpYTUxfWG1sRGVjbEhhbmRsZXIpKHZvaWQgICAgICAgICAgICAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAgKnZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAgKmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHN0YW5kYWxvbmUpOworPC9wcmU+Cis8cD5TZXRzIGEgaGFuZGxlciB0aGF0IGlzIGNhbGxlZCBmb3IgWE1MIGRlY2xhcmF0aW9ucyBhbmQgYWxzbyBmb3IKK3RleHQgZGVjbGFyYXRpb25zIGRpc2NvdmVyZWQgaW4gZXh0ZXJuYWwgZW50aXRpZXMuIFRoZSB3YXkgdG8KK2Rpc3Rpbmd1aXNoIGlzIHRoYXQgdGhlIDxjb2RlPnZlcnNpb248L2NvZGU+IHBhcmFtZXRlciB3aWxsIGJlIE5VTEwKK2ZvciB0ZXh0IGRlY2xhcmF0aW9ucy4gVGhlIDxjb2RlPmVuY29kaW5nPC9jb2RlPiBwYXJhbWV0ZXIgbWF5IGJlIE5VTEwKK2ZvciBhbiBYTUwgZGVjbGFyYXRpb24uIFRoZSA8Y29kZT5zdGFuZGFsb25lPC9jb2RlPiBhcmd1bWVudCB3aWxsCitjb250YWluIC0xLCAwLCBvciAxIGluZGljYXRpbmcgcmVzcGVjdGl2ZWx5IHRoYXQgdGhlcmUgd2FzIG5vCitzdGFuZGFsb25lIHBhcmFtZXRlciBpbiB0aGUgZGVjbGFyYXRpb24sIHRoYXQgaXQgd2FzIGdpdmVuIGFzIG5vLCBvcgordGhhdCBpdCB3YXMgZ2l2ZW4gYXMgeWVzLjwvcD4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJoYW5kbGVyIj4KKzxwcmUgY2xhc3M9InNldHRlciIgaWQ9IlhNTF9TZXRTdGFydERvY3R5cGVEZWNsSGFuZGxlciI+Cit2b2lkIFhNTENBTEwKK1hNTF9TZXRTdGFydERvY3R5cGVEZWNsSGFuZGxlcihYTUxfUGFyc2VyIHAsCisJCQkgICAgICAgWE1MX1N0YXJ0RG9jdHlwZURlY2xIYW5kbGVyIHN0YXJ0KTsKKzwvcHJlPgorPHByZSBjbGFzcz0ic2lnbmF0dXJlIj4KK3R5cGVkZWYgdm9pZAorKFhNTENBTEwgKlhNTF9TdGFydERvY3R5cGVEZWNsSGFuZGxlcikodm9pZCAgICAgICAgICAgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmRvY3R5cGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnB1YmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgaGFzX2ludGVybmFsX3N1YnNldCk7Cis8L3ByZT4KKzxwPlNldCBhIGhhbmRsZXIgdGhhdCBpcyBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIGEgRE9DVFlQRSBkZWNsYXJhdGlvbiwKK2JlZm9yZSBhbnkgZXh0ZXJuYWwgb3IgaW50ZXJuYWwgc3Vic2V0IGlzIHBhcnNlZC4gQm90aCA8Y29kZT5zeXNpZDwvY29kZT4KK2FuZCA8Y29kZT5wdWJpZDwvY29kZT4gbWF5IGJlIE5VTEwuIFRoZSA8Y29kZT5oYXNfaW50ZXJuYWxfc3Vic2V0PC9jb2RlPgord2lsbCBiZSBub24temVybyBpZiB0aGUgRE9DVFlQRSBkZWNsYXJhdGlvbiBoYXMgYW4gaW50ZXJuYWwgc3Vic2V0LjwvcD4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJoYW5kbGVyIj4KKzxwcmUgY2xhc3M9InNldHRlciIgaWQ9IlhNTF9TZXRFbmREb2N0eXBlRGVjbEhhbmRsZXIiPgordm9pZCBYTUxDQUxMCitYTUxfU2V0RW5kRG9jdHlwZURlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcCwKKwkJCSAgICAgWE1MX0VuZERvY3R5cGVEZWNsSGFuZGxlciBlbmQpOworPC9wcmU+Cis8cHJlIGNsYXNzPSJzaWduYXR1cmUiPgordHlwZWRlZiB2b2lkCisoWE1MQ0FMTCAqWE1MX0VuZERvY3R5cGVEZWNsSGFuZGxlcikodm9pZCAqdXNlckRhdGEpOworPC9wcmU+Cis8cD5TZXQgYSBoYW5kbGVyIHRoYXQgaXMgY2FsbGVkIGF0IHRoZSBlbmQgb2YgYSBET0NUWVBFIGRlY2xhcmF0aW9uLAorYWZ0ZXIgcGFyc2luZyBhbnkgZXh0ZXJuYWwgc3Vic2V0LjwvcD4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJoYW5kbGVyIj4KKzxwcmUgY2xhc3M9InNldHRlciIgaWQ9IlhNTF9TZXREb2N0eXBlRGVjbEhhbmRsZXIiPgordm9pZCBYTUxDQUxMCitYTUxfU2V0RG9jdHlwZURlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcCwKKwkJCSAgWE1MX1N0YXJ0RG9jdHlwZURlY2xIYW5kbGVyIHN0YXJ0LAorCQkJICBYTUxfRW5kRG9jdHlwZURlY2xIYW5kbGVyIGVuZCk7Cis8L3ByZT4KKzxwPlNldCBib3RoIGRvY3R5cGUgaGFuZGxlcnMgd2l0aCBvbmUgY2FsbC48L3A+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0iaGFuZGxlciI+Cis8cHJlIGNsYXNzPSJzZXR0ZXIiIGlkPSJYTUxfU2V0RWxlbWVudERlY2xIYW5kbGVyIj4KK3ZvaWQgWE1MQ0FMTAorWE1MX1NldEVsZW1lbnREZWNsSGFuZGxlcihYTUxfUGFyc2VyIHAsCisJCQkgIFhNTF9FbGVtZW50RGVjbEhhbmRsZXIgZWxkZWNsKTsKKzwvcHJlPgorPHByZSBjbGFzcz0ic2lnbmF0dXJlIj4KK3R5cGVkZWYgdm9pZAorKFhNTENBTEwgKlhNTF9FbGVtZW50RGVjbEhhbmRsZXIpKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9Db250ZW50ICptb2RlbCk7Cis8L3ByZT4KKzxwcmUgY2xhc3M9InNpZ25hdHVyZSI+CitlbnVtIFhNTF9Db250ZW50X1R5cGUgeworICBYTUxfQ1RZUEVfRU1QVFkgPSAxLAorICBYTUxfQ1RZUEVfQU5ZLAorICBYTUxfQ1RZUEVfTUlYRUQsCisgIFhNTF9DVFlQRV9OQU1FLAorICBYTUxfQ1RZUEVfQ0hPSUNFLAorICBYTUxfQ1RZUEVfU0VRCit9OworCitlbnVtIFhNTF9Db250ZW50X1F1YW50IHsKKyAgWE1MX0NRVUFOVF9OT05FLAorICBYTUxfQ1FVQU5UX09QVCwKKyAgWE1MX0NRVUFOVF9SRVAsCisgIFhNTF9DUVVBTlRfUExVUworfTsKKwordHlwZWRlZiBzdHJ1Y3QgWE1MX2NwIFhNTF9Db250ZW50OworCitzdHJ1Y3QgWE1MX2NwIHsKKyAgZW51bSBYTUxfQ29udGVudF9UeXBlCQl0eXBlOworICBlbnVtIFhNTF9Db250ZW50X1F1YW50CXF1YW50OworICBjb25zdCBYTUxfQ2hhciAqCQluYW1lOworICB1bnNpZ25lZCBpbnQJCQludW1jaGlsZHJlbjsKKyAgWE1MX0NvbnRlbnQgKgkJCWNoaWxkcmVuOworfTsKKzwvcHJlPgorPHA+U2V0cyBhIGhhbmRsZXIgZm9yIGVsZW1lbnQgZGVjbGFyYXRpb25zIGluIGEgRFRELiBUaGUgaGFuZGxlciBnZXRzCitjYWxsZWQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCBpbiB0aGUgZGVjbGFyYXRpb24gYW5kIGEgcG9pbnRlcgordG8gYSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudCBtb2RlbC4gSXQgaXMgdGhlCithcHBsaWNhdGlvbidzIHJlc3BvbnNpYmlsaXR5IHRvIGZyZWUgdGhpcyBkYXRhIHN0cnVjdHVyZSB1c2luZworPGNvZGU+PGEgaHJlZj0iI1hNTF9GcmVlQ29udGVudE1vZGVsIgorPlhNTF9GcmVlQ29udGVudE1vZGVsPC9hPjwvY29kZT4uPC9wPgorCis8cD5UaGUgPGNvZGU+bW9kZWw8L2NvZGU+IGFyZ3VtZW50IGlzIHRoZSByb290IG9mIGEgdHJlZSBvZgorPGNvZGU+WE1MX0NvbnRlbnQ8L2NvZGU+IG5vZGVzLiBJZiA8Y29kZT50eXBlPC9jb2RlPiBlcXVhbHMKKzxjb2RlPlhNTF9DVFlQRV9FTVBUWTwvY29kZT4gb3IgPGNvZGU+WE1MX0NUWVBFX0FOWTwvY29kZT4sIHRoZW4KKzxjb2RlPnF1YW50PC9jb2RlPiB3aWxsIGJlIDxjb2RlPlhNTF9DUVVBTlRfTk9ORTwvY29kZT4sIGFuZCB0aGUgb3RoZXIKK2ZpZWxkcyB3aWxsIGJlIHplcm8gb3IgTlVMTC4gIElmIDxjb2RlPnR5cGU8L2NvZGU+IGlzCis8Y29kZT5YTUxfQ1RZUEVfTUlYRUQ8L2NvZGU+LCB0aGVuIDxjb2RlPnF1YW50PC9jb2RlPiB3aWxsIGJlCis8Y29kZT5YTUxfQ1FVQU5UX05PTkU8L2NvZGU+IG9yIDxjb2RlPlhNTF9DUVVBTlRfUkVQPC9jb2RlPiBhbmQKKzxjb2RlPm51bWNoaWxkcmVuPC9jb2RlPiB3aWxsIGNvbnRhaW4gdGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IGFyZQorYWxsb3dlZCB0byBiZSBtaXhlZCBpbiBhbmQgPGNvZGU+Y2hpbGRyZW48L2NvZGU+IHBvaW50cyB0byBhbiBhcnJheSBvZgorPGNvZGU+WE1MX0NvbnRlbnQ8L2NvZGU+IHN0cnVjdHVyZXMgdGhhdCB3aWxsIGFsbCBoYXZlIHR5cGUKK1hNTF9DVFlQRV9OQU1FIHdpdGggbm8gcXVhbnRpZmljYXRpb24uICBPbmx5IHRoZSByb290IG5vZGUgY2FuIGJlIHR5cGUKKzxjb2RlPlhNTF9DVFlQRV9FTVBUWTwvY29kZT4sIDxjb2RlPlhNTF9DVFlQRV9BTlk8L2NvZGU+LCBvcgorPGNvZGU+WE1MX0NUWVBFX01JWEVEPC9jb2RlPi48L3A+CisKKzxwPkZvciB0eXBlIDxjb2RlPlhNTF9DVFlQRV9OQU1FPC9jb2RlPiwgdGhlIDxjb2RlPm5hbWU8L2NvZGU+IGZpZWxkCitwb2ludHMgdG8gdGhlIG5hbWUgYW5kIHRoZSA8Y29kZT5udW1jaGlsZHJlbjwvY29kZT4gYW5kCis8Y29kZT5jaGlsZHJlbjwvY29kZT4gZmllbGRzIHdpbGwgYmUgemVybyBhbmQgTlVMTC4gVGhlCis8Y29kZT5xdWFudDwvY29kZT4gZmllbGQgd2lsbCBpbmRpY2F0ZSBhbnkgcXVhbnRpZmllcnMgcGxhY2VkIG9uIHRoZQorbmFtZS48L3A+CisKKzxwPlR5cGVzIDxjb2RlPlhNTF9DVFlQRV9DSE9JQ0U8L2NvZGU+IGFuZCA8Y29kZT5YTUxfQ1RZUEVfU0VRPC9jb2RlPgoraW5kaWNhdGUgYSBjaG9pY2Ugb3Igc2VxdWVuY2UgcmVzcGVjdGl2ZWx5LiBUaGUKKzxjb2RlPm51bWNoaWxkcmVuPC9jb2RlPiBmaWVsZCBpbmRpY2F0ZXMgaG93IG1hbnkgbm9kZXMgaW4gdGhlIGNob2ljZQorb3Igc2VxdWVuY2UgYW5kIDxjb2RlPmNoaWxkcmVuPC9jb2RlPiBwb2ludHMgdG8gdGhlIG5vZGVzLjwvcD4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJoYW5kbGVyIj4KKzxwcmUgY2xhc3M9InNldHRlciIgaWQ9IlhNTF9TZXRBdHRsaXN0RGVjbEhhbmRsZXIiPgordm9pZCBYTUxDQUxMCitYTUxfU2V0QXR0bGlzdERlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0F0dGxpc3REZWNsSGFuZGxlciBhdHRkZWNsKTsKKzwvcHJlPgorPHByZSBjbGFzcz0ic2lnbmF0dXJlIj4KK3R5cGVkZWYgdm9pZAorKFhNTENBTEwgKlhNTF9BdHRsaXN0RGVjbEhhbmRsZXIpKHZvaWQgICAgICAgICAgICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqZWxuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICphdHRuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICphdHRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqZGZsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBpc3JlcXVpcmVkKTsKKzwvcHJlPgorPHA+U2V0IGEgaGFuZGxlciBmb3IgYXR0bGlzdCBkZWNsYXJhdGlvbnMgaW4gdGhlIERURC4gVGhpcyBoYW5kbGVyIGlzCitjYWxsZWQgZm9yIDxlbT5lYWNoPC9lbT4gYXR0cmlidXRlLiBTbyBhIHNpbmdsZSBhdHRsaXN0IGRlY2xhcmF0aW9uCit3aXRoIG11bHRpcGxlIGF0dHJpYnV0ZXMgZGVjbGFyZWQgd2lsbCBnZW5lcmF0ZSBtdWx0aXBsZSBjYWxscyB0byB0aGlzCitoYW5kbGVyLiBUaGUgPGNvZGU+ZWxuYW1lPC9jb2RlPiBwYXJhbWV0ZXIgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUKK2VsZW1lbnQgZm9yIHdoaWNoIHRoZSBhdHRyaWJ1dGUgaXMgYmVpbmcgZGVjbGFyZWQuIFRoZSBhdHRyaWJ1dGUgbmFtZQoraXMgaW4gdGhlIDxjb2RlPmF0dG5hbWU8L2NvZGU+IHBhcmFtZXRlci4gVGhlIGF0dHJpYnV0ZSB0eXBlIGlzIGluIHRoZQorPGNvZGU+YXR0X3R5cGU8L2NvZGU+IHBhcmFtZXRlci4gIEl0IGlzIHRoZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZQordHlwZSBpbiB0aGUgZGVjbGFyYXRpb24gd2l0aCB3aGl0ZXNwYWNlIHJlbW92ZWQuPC9wPgorCis8cD5UaGUgPGNvZGU+ZGZsdDwvY29kZT4gcGFyYW1ldGVyIGhvbGRzIHRoZSBkZWZhdWx0IHZhbHVlLiBJdCB3aWxsIGJlCitOVUxMIGluIHRoZSBjYXNlIG9mICIjSU1QTElFRCIgb3IgIiNSRVFVSVJFRCIgYXR0cmlidXRlcy4gWW91IGNhbgorZGlzdGluZ3Vpc2ggdGhlc2UgdHdvIGNhc2VzIGJ5IGNoZWNraW5nIHRoZSA8Y29kZT5pc3JlcXVpcmVkPC9jb2RlPgorcGFyYW1ldGVyLCB3aGljaCB3aWxsIGJlIHRydWUgaW4gdGhlIGNhc2Ugb2YgIiNSRVFVSVJFRCIgYXR0cmlidXRlcy4KK0F0dHJpYnV0ZXMgd2hpY2ggYXJlICIjRklYRUQiIHdpbGwgaGF2ZSBhbHNvIGhhdmUgYSB0cnVlCis8Y29kZT5pc3JlcXVpcmVkPC9jb2RlPiwgYnV0IHRoZXkgd2lsbCBoYXZlIHRoZSBub24tTlVMTCBmaXhlZCB2YWx1ZQoraW4gdGhlIDxjb2RlPmRmbHQ8L2NvZGU+IHBhcmFtZXRlci48L3A+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0iaGFuZGxlciI+Cis8cHJlIGNsYXNzPSJzZXR0ZXIiIGlkPSJYTUxfU2V0RW50aXR5RGVjbEhhbmRsZXIiPgordm9pZCBYTUxDQUxMCitYTUxfU2V0RW50aXR5RGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwLAorCQkJIFhNTF9FbnRpdHlEZWNsSGFuZGxlciBoYW5kbGVyKTsKKzwvcHJlPgorPHByZSBjbGFzcz0ic2lnbmF0dXJlIj4KK3R5cGVkZWYgdm9pZAorKFhNTENBTEwgKlhNTF9FbnRpdHlEZWNsSGFuZGxlcikodm9pZCAgICAgICAgICAgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmVudGl0eU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBpc19wYXJhbWV0ZXJfZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgdmFsdWVfbGVuZ3RoLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnB1YmxpY0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5vdGF0aW9uTmFtZSk7Cis8L3ByZT4KKzxwPlNldHMgYSBoYW5kbGVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgZm9yIGFsbCBlbnRpdHkgZGVjbGFyYXRpb25zLgorVGhlIDxjb2RlPmlzX3BhcmFtZXRlcl9lbnRpdHk8L2NvZGU+IGFyZ3VtZW50IHdpbGwgYmUgbm9uLXplcm8gaW4gdGhlCitjYXNlIG9mIHBhcmFtZXRlciBlbnRpdGllcyBhbmQgemVybyBvdGhlcndpc2UuPC9wPgorCis8cD5Gb3IgaW50ZXJuYWwgZW50aXRpZXMgKDxjb2RlPiZsdDshRU5USVRZIGZvbyAiYmFyIiZndDs8L2NvZGU+KSwKKzxjb2RlPnZhbHVlPC9jb2RlPiB3aWxsIGJlIG5vbi1OVUxMIGFuZCA8Y29kZT5zeXN0ZW1JZDwvY29kZT4sCis8Y29kZT5wdWJsaWNJZDwvY29kZT4sIGFuZCA8Y29kZT5ub3RhdGlvbk5hbWU8L2NvZGU+IHdpbGwgYWxsIGJlIE5VTEwuCitUaGUgdmFsdWUgc3RyaW5nIGlzIDxlbT5ub3Q8L2VtPiBOVUxMIHRlcm1pbmF0ZWQ7IHRoZSBsZW5ndGggaXMKK3Byb3ZpZGVkIGluIHRoZSA8Y29kZT52YWx1ZV9sZW5ndGg8L2NvZGU+IHBhcmFtZXRlci4gRG8gbm90IHVzZQorPGNvZGU+dmFsdWVfbGVuZ3RoPC9jb2RlPiB0byB0ZXN0IGZvciBpbnRlcm5hbCBlbnRpdGllcywgc2luY2UgaXQgaXMKK2xlZ2FsIHRvIGhhdmUgemVyby1sZW5ndGggdmFsdWVzLiBJbnN0ZWFkIGNoZWNrIGZvciB3aGV0aGVyIG9yIG5vdAorPGNvZGU+dmFsdWU8L2NvZGU+IGlzIE5VTEwuPC9wPiA8cD5UaGUgPGNvZGU+bm90YXRpb25OYW1lPC9jb2RlPgorYXJndW1lbnQgd2lsbCBoYXZlIGEgbm9uLU5VTEwgdmFsdWUgb25seSBmb3IgdW5wYXJzZWQgZW50aXR5CitkZWNsYXJhdGlvbnMuPC9wPgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImhhbmRsZXIiPgorPHByZSBjbGFzcz0ic2V0dGVyIiBpZD0iWE1MX1NldFVucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIiPgordm9pZCBYTUxDQUxMCitYTUxfU2V0VW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlcihYTUxfUGFyc2VyIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfVW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlciBoKQorPC9wcmU+Cis8cHJlIGNsYXNzPSJzaWduYXR1cmUiPgordHlwZWRlZiB2b2lkCisoWE1MQ0FMTCAqWE1MX1VucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIpKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqZW50aXR5TmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqc3lzdGVtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJsaWNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5vdGF0aW9uTmFtZSk7Cis8L3ByZT4KKzxwPlNldCBhIGhhbmRsZXIgdGhhdCByZWNlaXZlcyBkZWNsYXJhdGlvbnMgb2YgdW5wYXJzZWQgZW50aXRpZXMuIFRoZXNlCithcmUgZW50aXR5IGRlY2xhcmF0aW9ucyB0aGF0IGhhdmUgYSBub3RhdGlvbiAoTkRBVEEpIGZpZWxkOjwvcD4KKworPGRpdiBpZD0iZWciPjxwcmU+CismbHQ7IUVOVElUWSBsb2dvIFNZU1RFTSAiaW1hZ2VzL2xvZ28uZ2lmIiBOREFUQSBnaWYmZ3Q7Cis8L3ByZT48L2Rpdj4KKzxwPlRoaXMgaGFuZGxlciBpcyBvYnNvbGV0ZSBhbmQgaXMgcHJvdmlkZWQgZm9yIGJhY2t3YXJkcworY29tcGF0aWJpbGl0eS4gIFVzZSBpbnN0ZWFkIDxhIGhyZWY9ICIjWE1MX1NldEVudGl0eURlY2xIYW5kbGVyIgorPlhNTF9TZXRFbnRpdHlEZWNsSGFuZGxlcjwvYT4uPC9wPgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImhhbmRsZXIiPgorPHByZSBjbGFzcz0ic2V0dGVyIiBpZD0iWE1MX1NldE5vdGF0aW9uRGVjbEhhbmRsZXIiPgordm9pZCBYTUxDQUxMCitYTUxfU2V0Tm90YXRpb25EZWNsSGFuZGxlcihYTUxfUGFyc2VyIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfTm90YXRpb25EZWNsSGFuZGxlciBoKQorPC9wcmU+Cis8cHJlIGNsYXNzPSJzaWduYXR1cmUiPgordHlwZWRlZiB2b2lkCisoWE1MQ0FMTCAqWE1MX05vdGF0aW9uRGVjbEhhbmRsZXIpKHZvaWQgKnVzZXJEYXRhLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5vdGF0aW9uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzeXN0ZW1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnB1YmxpY0lkKTsKKzwvcHJlPgorPHA+U2V0IGEgaGFuZGxlciB0aGF0IHJlY2VpdmVzIG5vdGF0aW9uIGRlY2xhcmF0aW9ucy48L3A+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0iaGFuZGxlciI+Cis8cHJlIGNsYXNzPSJzZXR0ZXIiIGlkPSJYTUxfU2V0Tm90U3RhbmRhbG9uZUhhbmRsZXIiPgordm9pZCBYTUxDQUxMCitYTUxfU2V0Tm90U3RhbmRhbG9uZUhhbmRsZXIoWE1MX1BhcnNlciBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9Ob3RTdGFuZGFsb25lSGFuZGxlciBoKQorPC9wcmU+Cis8cHJlIGNsYXNzPSJzaWduYXR1cmUiPgordHlwZWRlZiBpbnQgCisoWE1MQ0FMTCAqWE1MX05vdFN0YW5kYWxvbmVIYW5kbGVyKSh2b2lkICp1c2VyRGF0YSk7Cis8L3ByZT4KKzxwPlNldCBhIGhhbmRsZXIgdGhhdCBpcyBjYWxsZWQgaWYgdGhlIGRvY3VtZW50IGlzIG5vdCAic3RhbmRhbG9uZSIuCitUaGlzIGhhcHBlbnMgd2hlbiB0aGVyZSBpcyBhbiBleHRlcm5hbCBzdWJzZXQgb3IgYSByZWZlcmVuY2UgdG8gYQorcGFyYW1ldGVyIGVudGl0eSwgYnV0IGRvZXMgbm90IGhhdmUgc3RhbmRhbG9uZSBzZXQgdG8gInllcyIgaW4gYW4gWE1MCitkZWNsYXJhdGlvbi4gIElmIHRoaXMgaGFuZGxlciByZXR1cm5zIDxjb2RlPlhNTF9TVEFUVVNfRVJST1I8L2NvZGU+LAordGhlbiB0aGUgcGFyc2VyIHdpbGwgdGhyb3cgYW4gPGNvZGU+WE1MX0VSUk9SX05PVF9TVEFOREFMT05FPC9jb2RlPgorZXJyb3IuPC9wPgorPC9kaXY+CisKKzxoMz48YSBuYW1lPSJwb3NpdGlvbiI+UGFyc2UgcG9zaXRpb24gYW5kIGVycm9yIHJlcG9ydGluZyBmdW5jdGlvbnM8L2E+PC9oMz4KKworPHA+VGhlc2UgYXJlIHRoZSBmdW5jdGlvbnMgeW91J2xsIHdhbnQgdG8gY2FsbCB3aGVuIHRoZSBwYXJzZQorZnVuY3Rpb25zIHJldHVybiA8Y29kZT5YTUxfU1RBVFVTX0VSUk9SPC9jb2RlPiAoYSBwYXJzZSBlcnJvciBoYXMKK29jY3VycmVkKSwgYWx0aG91Z2ggdGhlIHBvc2l0aW9uIHJlcG9ydGluZyBmdW5jdGlvbnMgYXJlIHVzZWZ1bCBvdXRzaWRlCitvZiBlcnJvcnMuIFRoZSBwb3NpdGlvbiByZXBvcnRlZCBpcyB0aGUgYnl0ZSBwb3NpdGlvbiAoaW4gdGhlIG9yaWdpbmFsCitkb2N1bWVudCBvciBlbnRpdHkgZW5jb2RpbmcpIG9mIHRoZSBmaXJzdCBvZiB0aGUgc2VxdWVuY2Ugb2YKK2NoYXJhY3RlcnMgdGhhdCBnZW5lcmF0ZWQgdGhlIGN1cnJlbnQgZXZlbnQgKG9yIHRoZSBlcnJvciB0aGF0IGNhdXNlZAordGhlIHBhcnNlIGZ1bmN0aW9ucyB0byByZXR1cm4gPGNvZGU+WE1MX1NUQVRVU19FUlJPUjwvY29kZT4uKSAgVGhlCitleGNlcHRpb25zIGFyZSBjYWxsYmFja3MgdHJpZ2dlZCBieSBkZWNsYXJhdGlvbnMgaW4gdGhlIGRvY3VtZW50Citwcm9sb2d1ZSwgaW4gd2hpY2ggY2FzZSB0aGV5IGV4YWN0IHBvc2l0aW9uIHJlcG9ydGVkIGlzIHNvbWV3aGVyZSBpbiB0aGUKK3JlbGV2YW50IG1hcmt1cCwgYnV0IG5vdCBuZWNlc3NhcmlseSBhcyBtZWFuaW5nZnVsIGFzIGZvciBvdGhlcgorZXZlbnRzLjwvcD4KKworPHA+VGhlIHBvc2l0aW9uIHJlcG9ydGluZyBmdW5jdGlvbnMgYXJlIGFjY3VyYXRlIG9ubHkgb3V0c2lkZSBvZiB0aGUKK0RURC4gIEluIG90aGVyIHdvcmRzLCB0aGV5IHVzdWFsbHkgcmV0dXJuIGJvZ3VzIGluZm9ybWF0aW9uIHdoZW4KK2NhbGxlZCBmcm9tIHdpdGhpbiBhIERURCBkZWNsYXJhdGlvbiBoYW5kbGVyLjwvcD4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX0dldEVycm9yQ29kZSI+CitlbnVtIFhNTF9FcnJvciBYTUxDQUxMCitYTUxfR2V0RXJyb3JDb2RlKFhNTF9QYXJzZXIgcCk7Cis8L3ByZT4KKzxkaXYgY2xhc3M9ImZjbmRlZiI+CitSZXR1cm4gd2hhdCB0eXBlIG9mIGVycm9yIGhhcyBvY2N1cnJlZC4KKzwvZGl2PgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfRXJyb3JTdHJpbmciPgorY29uc3QgWE1MX0xDaGFyICogWE1MQ0FMTAorWE1MX0Vycm9yU3RyaW5nKGVudW0gWE1MX0Vycm9yIGNvZGUpOworPC9wcmU+Cis8ZGl2IGNsYXNzPSJmY25kZWYiPgorUmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGVycm9yIGNvcnJlc3BvbmRpbmcgdG8gY29kZS4KK1RoZSBjb2RlIHNob3VsZCBiZSBvbmUgb2YgdGhlIGVudW1zIHRoYXQgY2FuIGJlIHJldHVybmVkIGZyb20KKzxjb2RlPjxhIGhyZWY9ICIjWE1MX0dldEVycm9yQ29kZSIgPlhNTF9HZXRFcnJvckNvZGU8L2E+PC9jb2RlPi4KKzwvZGl2PgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfR2V0Q3VycmVudEJ5dGVJbmRleCI+CitYTUxfSW5kZXggWE1MQ0FMTAorWE1MX0dldEN1cnJlbnRCeXRlSW5kZXgoWE1MX1BhcnNlciBwKTsKKzwvcHJlPgorPGRpdiBjbGFzcz0iZmNuZGVmIj4KK1JldHVybiB0aGUgYnl0ZSBvZmZzZXQgb2YgdGhlIHBvc2l0aW9uLiAgVGhpcyBhbHdheXMgY29ycmVzcG9uZHMgdG8KK3RoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgPGNvZGU+PGEgaHJlZj0gIiNYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIiCis+WE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyPC9hPjwvY29kZT4gYW5kIDxjb2RlPjxhIGhyZWY9CisiI1hNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyIiA+WE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXI8L2E+PC9jb2RlPi4KKzwvZGl2PgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIiPgorWE1MX1NpemUgWE1MQ0FMTAorWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyKFhNTF9QYXJzZXIgcCk7Cis8L3ByZT4KKzxkaXYgY2xhc3M9ImZjbmRlZiI+CitSZXR1cm4gdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBwb3NpdGlvbi4gIFRoZSBmaXJzdCBsaW5lIGlzIHJlcG9ydGVkIGFzCis8Y29kZT4xPC9jb2RlPi4KKzwvZGl2PgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlciI+CitYTUxfU2l6ZSBYTUxDQUxMCitYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlcihYTUxfUGFyc2VyIHApOworPC9wcmU+Cis8ZGl2IGNsYXNzPSJmY25kZWYiPgorUmV0dXJuIHRoZSBvZmZzZXQsIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBsaW5lLCBvZgordGhlIHBvc2l0aW9uLgorPC9kaXY+CisKKzxwcmUgY2xhc3M9ImZjbmRlYyIgaWQ9IlhNTF9HZXRDdXJyZW50Qnl0ZUNvdW50Ij4KK2ludCBYTUxDQUxMCitYTUxfR2V0Q3VycmVudEJ5dGVDb3VudChYTUxfUGFyc2VyIHApOworPC9wcmU+Cis8ZGl2IGNsYXNzPSJmY25kZWYiPgorUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGN1cnJlbnQgZXZlbnQuIFJldHVybnMKKzxjb2RlPjA8L2NvZGU+IGlmIHRoZSBldmVudCBpcyBpbnNpZGUgYSByZWZlcmVuY2UgdG8gYW4gaW50ZXJuYWwKK2VudGl0eSBhbmQgZm9yIHRoZSBlbmQtdGFnIGV2ZW50IGZvciBlbXB0eSBlbGVtZW50IHRhZ3MgKHRoZSBsYXRlciBjYW4KK2JlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggZW1wdHktZWxlbWVudCB0YWdzIGZyb20gZW1wdHkgZWxlbWVudHMgdXNpbmcKK3NlcGFyYXRlIHN0YXJ0IGFuZCBlbmQgdGFncykuCis8L2Rpdj4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX0dldElucHV0Q29udGV4dCI+Citjb25zdCBjaGFyICogWE1MQ0FMTAorWE1MX0dldElucHV0Q29udGV4dChYTUxfUGFyc2VyIHAsCisgICAgICAgICAgICAgICAgICAgIGludCAqb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBpbnQgKnNpemUpOworPC9wcmU+Cis8ZGl2IGNsYXNzPSJmY25kZWYiPgorCis8cD5SZXR1cm5zIHRoZSBwYXJzZXIncyBpbnB1dCBidWZmZXIsIHNldHMgdGhlIGludGVnZXIgcG9pbnRlZCBhdCBieQorPGNvZGU+b2Zmc2V0PC9jb2RlPiB0byB0aGUgb2Zmc2V0IHdpdGhpbiB0aGlzIGJ1ZmZlciBvZiB0aGUgY3VycmVudAorcGFyc2UgcG9zaXRpb24sIGFuZCBzZXQgdGhlIGludGVnZXIgcG9pbnRlZCBhdCBieSA8Y29kZT5zaXplPC9jb2RlPiB0bwordGhlIHNpemUgb2YgdGhlIHJldHVybmVkIGJ1ZmZlci48L3A+CisKKzxwPlRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gd2l0aGluIGEgaGFuZGxlciBkdXJpbmcgYW4gYWN0aXZlCitwYXJzZSBhbmQgdGhlIHJldHVybmVkIGJ1ZmZlciBzaG91bGQgb25seSBiZSByZWZlcnJlZCB0byBmcm9tIHdpdGhpbgordGhlIGhhbmRsZXIgdGhhdCBtYWRlIHRoZSBjYWxsLiBUaGlzIGlucHV0IGJ1ZmZlciBjb250YWlucyB0aGUKK3VudHJhbnNsYXRlZCBieXRlcyBvZiB0aGUgaW5wdXQuPC9wPgorCis8cD5Pbmx5IGEgbGltaXRlZCBhbW91bnQgb2YgY29udGV4dCBpcyBrZXB0LCBzbyBpZiB0aGUgZXZlbnQKK3RyaWdnZXJpbmcgYSBjYWxsIHNwYW5zIG92ZXIgYSB2ZXJ5IGxhcmdlIGFtb3VudCBvZiBpbnB1dCwgdGhlIGFjdHVhbAorcGFyc2UgcG9zaXRpb24gbWF5IGJlIGJlZm9yZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIuPC9wPgorCis8cD5JZiA8Y29kZT5YTUxfQ09OVEVYVF9CWVRFUzwvY29kZT4gaXMgbm90IGRlZmluZWQsIHRoaXMgd2lsbCBhbHdheXMKK3JldHVybiBOVUxMLjwvcD4KKzwvZGl2PgorCis8aDM+PGEgbmFtZT0ibWlzY2VsbGFuZW91cyI+TWlzY2VsbGFuZW91cyBmdW5jdGlvbnM8L2E+PC9oMz4KKworPHA+VGhlIGZ1bmN0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZWl0aGVyIG9idGFpbiBzdGF0ZSBpbmZvcm1hdGlvbiBmcm9tCit0aGUgcGFyc2VyIG9yIGNhbiBiZSB1c2VkIHRvIGR5bmFtaWNseSBzZXQgcGFyc2VyIG9wdGlvbnMuPC9wPgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfU2V0VXNlckRhdGEiPgordm9pZCBYTUxDQUxMCitYTUxfU2V0VXNlckRhdGEoWE1MX1BhcnNlciBwLAorICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhKTsKKzwvcHJlPgorPGRpdiBjbGFzcz0iZmNuZGVmIj4KK1RoaXMgc2V0cyB0aGUgdXNlciBkYXRhIHBvaW50ZXIgdGhhdCBnZXRzIHBhc3NlZCB0byBoYW5kbGVycy4gIEl0CitvdmVyd3JpdGVzIGFueSBwcmV2aW91cyB2YWx1ZSBmb3IgdGhpcyBwb2ludGVyLiBOb3RlIHRoYXQgdGhlCithcHBsaWNhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aAorPGNvZGU+dXNlckRhdGE8L2NvZGU+IHdoZW4gaXQgaXMgZmluaXNoZWQgd2l0aCB0aGUgcGFyc2VyLiBTbyBpZiB5b3UKK2NhbGwgdGhpcyB3aGVuIHRoZXJlJ3MgYWxyZWFkeSBhIHBvaW50ZXIgdGhlcmUsIGFuZCB5b3UgaGF2ZW4ndCBmcmVlZAordGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggaXQsIHRoZW4geW91J3ZlIHByb2JhYmx5IGp1c3QgbGVha2VkCittZW1vcnkuCis8L2Rpdj4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX0dldFVzZXJEYXRhIj4KK3ZvaWQgKiBYTUxDQUxMCitYTUxfR2V0VXNlckRhdGEoWE1MX1BhcnNlciBwKTsKKzwvcHJlPgorPGRpdiBjbGFzcz0iZmNuZGVmIj4KK1RoaXMgcmV0dXJucyB0aGUgdXNlciBkYXRhIHBvaW50ZXIgdGhhdCBnZXRzIHBhc3NlZCB0byBoYW5kbGVycy4KK0l0IGlzIGFjdHVhbGx5IGltcGxlbWVudGVkIGFzIGEgbWFjcm8uCis8L2Rpdj4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX1VzZVBhcnNlckFzSGFuZGxlckFyZyI+Cit2b2lkIFhNTENBTEwKK1hNTF9Vc2VQYXJzZXJBc0hhbmRsZXJBcmcoWE1MX1BhcnNlciBwKTsKKzwvcHJlPgorPGRpdiBjbGFzcz0iZmNuZGVmIj4KK0FmdGVyIHRoaXMgaXMgY2FsbGVkLCBoYW5kbGVycyByZWNlaXZlIHRoZSBwYXJzZXIgaW4gdGhlaXIKKzxjb2RlPnVzZXJEYXRhPC9jb2RlPiBhcmd1bWVudHMuICBUaGUgdXNlciBkYXRhIGNhbiBzdGlsbCBiZSBvYnRhaW5lZAordXNpbmcgdGhlIDxjb2RlPjxhIGhyZWY9ICIjWE1MX0dldFVzZXJEYXRhIgorPlhNTF9HZXRVc2VyRGF0YTwvYT48L2NvZGU+IGZ1bmN0aW9uLgorPC9kaXY+CisKKzxwcmUgY2xhc3M9ImZjbmRlYyIgaWQ9IlhNTF9TZXRCYXNlIj4KK2VudW0gWE1MX1N0YXR1cyBYTUxDQUxMCitYTUxfU2V0QmFzZShYTUxfUGFyc2VyIHAsCisgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqYmFzZSk7Cis8L3ByZT4KKzxkaXYgY2xhc3M9ImZjbmRlZiI+CitTZXQgdGhlIGJhc2UgdG8gYmUgdXNlZCBmb3IgcmVzb2x2aW5nIHJlbGF0aXZlIFVSSXMgaW4gc3lzdGVtCitpZGVudGlmaWVycy4gIFRoZSByZXR1cm4gdmFsdWUgaXMgPGNvZGU+WE1MX1NUQVRVU19FUlJPUjwvY29kZT4gaWYKK3RoZXJlJ3Mgbm8gbWVtb3J5IHRvIHN0b3JlIGJhc2UsIG90aGVyd2lzZSBpdCdzCis8Y29kZT5YTUxfU1RBVFVTX09LPC9jb2RlPi4KKzwvZGl2PgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfR2V0QmFzZSI+Citjb25zdCBYTUxfQ2hhciAqIFhNTENBTEwKK1hNTF9HZXRCYXNlKFhNTF9QYXJzZXIgcCk7Cis8L3ByZT4KKzxkaXYgY2xhc3M9ImZjbmRlZiI+CitSZXR1cm4gdGhlIGJhc2UgZm9yIHJlc29sdmluZyByZWxhdGl2ZSBVUklzLgorPC9kaXY+CisKKzxwcmUgY2xhc3M9ImZjbmRlYyIgaWQ9IlhNTF9HZXRTcGVjaWZpZWRBdHRyaWJ1dGVDb3VudCI+CitpbnQgWE1MQ0FMTAorWE1MX0dldFNwZWNpZmllZEF0dHJpYnV0ZUNvdW50KFhNTF9QYXJzZXIgcCk7Cis8L3ByZT4KKzxkaXYgY2xhc3M9ImZjbmRlZiI+CitXaGVuIGF0dHJpYnV0ZXMgYXJlIHJlcG9ydGVkIHRvIHRoZSBzdGFydCBoYW5kbGVyIGluIHRoZSBhdHRzIHZlY3RvciwKK2F0dHJpYnV0ZXMgdGhhdCB3ZXJlIGV4cGxpY2l0bHkgc2V0IGluIHRoZSBlbGVtZW50IG9jY3VyIGJlZm9yZSBhbnkKK2F0dHJpYnV0ZXMgdGhhdCByZWNlaXZlIHRoZWlyIHZhbHVlIGZyb20gZGVmYXVsdCBpbmZvcm1hdGlvbiBpbiBhbgorQVRUTElTVCBkZWNsYXJhdGlvbi4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcwordGhhdCB3ZXJlIGV4cGxpY2l0bHkgc2V0IHRpbWVzIHR3bywgdGh1cyBnaXZpbmcgdGhlIG9mZnNldCBpbiB0aGUKKzxjb2RlPmF0dHM8L2NvZGU+IGFycmF5IHBhc3NlZCB0byB0aGUgc3RhcnQgdGFnIGhhbmRsZXIgb2YgdGhlIGZpcnN0CithdHRyaWJ1dGUgc2V0IGR1ZSB0byBkZWZhdWx0cy4gSXQgc3VwcGxpZXMgaW5mb3JtYXRpb24gZm9yIHRoZSBsYXN0CitjYWxsIHRvIGEgc3RhcnQgaGFuZGxlci4gSWYgY2FsbGVkIGluc2lkZSBhIHN0YXJ0IGhhbmRsZXIsIHRoZW4gdGhhdAorbWVhbnMgdGhlIGN1cnJlbnQgY2FsbC4KKzwvZGl2PgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfR2V0SWRBdHRyaWJ1dGVJbmRleCI+CitpbnQgWE1MQ0FMTAorWE1MX0dldElkQXR0cmlidXRlSW5kZXgoWE1MX1BhcnNlciBwKTsKKzwvcHJlPgorPGRpdiBjbGFzcz0iZmNuZGVmIj4KK1JldHVybnMgdGhlIGluZGV4IG9mIHRoZSBJRCBhdHRyaWJ1dGUgcGFzc2VkIGluIHRoZSBhdHRzIGFycmF5IGluIHRoZQorbGFzdCBjYWxsIHRvIDxjb2RlPjxhIGhyZWY9ICIjWE1MX1N0YXJ0RWxlbWVudEhhbmRsZXIiCis+WE1MX1N0YXJ0RWxlbWVudEhhbmRsZXI8L2E+PC9jb2RlPiwgb3IgLTEgaWYgdGhlcmUgaXMgbm8gSUQKK2F0dHJpYnV0ZS4gSWYgY2FsbGVkIGluc2lkZSBhIHN0YXJ0IGhhbmRsZXIsIHRoZW4gdGhhdCBtZWFucyB0aGUKK2N1cnJlbnQgY2FsbC4KKzwvZGl2PgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfU2V0RW5jb2RpbmciPgorZW51bSBYTUxfU3RhdHVzIFhNTENBTEwKK1hNTF9TZXRFbmNvZGluZyhYTUxfUGFyc2VyIHAsCisgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmVuY29kaW5nKTsKKzwvcHJlPgorPGRpdiBjbGFzcz0iZmNuZGVmIj4KK1NldCB0aGUgZW5jb2RpbmcgdG8gYmUgdXNlZCBieSB0aGUgcGFyc2VyLiBJdCBpcyBlcXVpdmFsZW50IHRvCitwYXNzaW5nIGEgbm9uLW51bGwgZW5jb2RpbmcgYXJndW1lbnQgdG8gdGhlIHBhcnNlciBjcmVhdGlvbiBmdW5jdGlvbnMuCitJdCBtdXN0IG5vdCBiZSBjYWxsZWQgYWZ0ZXIgPGNvZGU+PGEgaHJlZj0gIiNYTUxfUGFyc2UiCis+WE1MX1BhcnNlPC9hPjwvY29kZT4gb3IgPGNvZGU+PGEgaHJlZj0gIiNYTUxfUGFyc2VCdWZmZXIiCis+WE1MX1BhcnNlQnVmZmVyPC9hPjwvY29kZT4gaGF2ZSBiZWVuIGNhbGxlZCBvbiB0aGUgZ2l2ZW4gcGFyc2VyLgorUmV0dXJucyA8Y29kZT5YTUxfU1RBVFVTX09LPC9jb2RlPiBvbiBzdWNjZXNzIG9yCis8Y29kZT5YTUxfU1RBVFVTX0VSUk9SPC9jb2RlPiBvbiBlcnJvci4KKzwvZGl2PgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nIj4KK2ludCBYTUxDQUxMCitYTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nKFhNTF9QYXJzZXIgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBYTUxfUGFyYW1FbnRpdHlQYXJzaW5nIGNvZGUpOworPC9wcmU+Cis8ZGl2IGNsYXNzPSJmY25kZWYiPgorVGhpcyBlbmFibGVzIHBhcnNpbmcgb2YgcGFyYW1ldGVyIGVudGl0aWVzLCBpbmNsdWRpbmcgdGhlIGV4dGVybmFsCitwYXJhbWV0ZXIgZW50aXR5IHRoYXQgaXMgdGhlIGV4dGVybmFsIERURCBzdWJzZXQsIGFjY29yZGluZyB0bworPGNvZGU+Y29kZTwvY29kZT4uCitUaGUgY2hvaWNlcyBmb3IgPGNvZGU+Y29kZTwvY29kZT4gYXJlOgorPHVsPgorPGxpPjxjb2RlPlhNTF9QQVJBTV9FTlRJVFlfUEFSU0lOR19ORVZFUjwvY29kZT48L2xpPgorPGxpPjxjb2RlPlhNTF9QQVJBTV9FTlRJVFlfUEFSU0lOR19VTkxFU1NfU1RBTkRBTE9ORTwvY29kZT48L2xpPgorPGxpPjxjb2RlPlhNTF9QQVJBTV9FTlRJVFlfUEFSU0lOR19BTFdBWVM8L2NvZGU+PC9saT4KKzwvdWw+Cis8L2Rpdj4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX1VzZUZvcmVpZ25EVEQiPgorZW51bSBYTUxfRXJyb3IgWE1MQ0FMTAorWE1MX1VzZUZvcmVpZ25EVEQoWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Cb29sIHVzZURURCk7Cis8L3ByZT4KKzxkaXYgY2xhc3M9ImZjbmRlZiI+Cis8cD5UaGlzIGZ1bmN0aW9uIGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBwcm92aWRlIGFuIGV4dGVybmFsIHN1YnNldAorZm9yIHRoZSBkb2N1bWVudCB0eXBlIGRlY2xhcmF0aW9uIGZvciBkb2N1bWVudHMgd2hpY2ggZG8gbm90IHNwZWNpZnkKK2FuIGV4dGVybmFsIHN1YnNldCBvZiB0aGVpciBvd24uICBGb3IgZG9jdW1lbnRzIHdoaWNoIHNwZWNpZnkgYW4KK2V4dGVybmFsIHN1YnNldCBpbiB0aGVpciBET0NUWVBFIGRlY2xhcmF0aW9uLCB0aGUgYXBwbGljYXRpb24tcHJvdmlkZWQKK3N1YnNldCB3aWxsIGJlIGlnbm9yZWQuICBJZiB0aGUgZG9jdW1lbnQgZG9lcyBub3QgY29udGFpbiBhIERPQ1RZUEUKK2RlY2xhcmF0aW9uIGF0IGFsbCBhbmQgPGNvZGU+dXNlRFREPC9jb2RlPiBpcyB0cnVlLCB0aGUKK2FwcGxpY2F0aW9uLXByb3ZpZGVkIHN1YnNldCB3aWxsIGJlIHBhcnNlZCwgYnV0IHRoZQorPGNvZGU+c3RhcnREb2N0eXBlRGVjbEhhbmRsZXI8L2NvZGU+IGFuZAorPGNvZGU+ZW5kRG9jdHlwZURlY2xIYW5kbGVyPC9jb2RlPiBmdW5jdGlvbnMsIGlmIHNldCwgd2lsbCBub3QgYmUKK2NhbGxlZC4gIFRoZSBzZXR0aW5nIG9mIHBhcmFtZXRlciBlbnRpdHkgcGFyc2luZywgY29udHJvbGxlZCB1c2luZworPGNvZGU+PGEgaHJlZj0gIiNYTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nIgorPlhNTF9TZXRQYXJhbUVudGl0eVBhcnNpbmc8L2E+PC9jb2RlPiwgd2lsbCBiZSBob25vcmVkLjwvcD4KKworPHA+VGhlIGFwcGxpY2F0aW9uLXByb3ZpZGVkIGV4dGVybmFsIHN1YnNldCBpcyByZWFkIGJ5IGNhbGxpbmcgdGhlCitleHRlcm5hbCBlbnRpdHkgcmVmZXJlbmNlIGhhbmRsZXIgc2V0IHZpYSA8Y29kZT48YSBocmVmPQorIiNYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIgorPlhNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXI8L2E+PC9jb2RlPiB3aXRoIGJvdGgKKzxjb2RlPnB1YmxpY0lkPC9jb2RlPiBhbmQgPGNvZGU+c3lzdGVtSWQ8L2NvZGU+IHNldCB0byBOVUxMLjwvcD4KKworPHA+SWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgcGFyc2luZyBoYXMgYmVndW4sIGl0IHJldHVybnMKKzxjb2RlPlhNTF9FUlJPUl9DQU5UX0NIQU5HRV9GRUFUVVJFX09OQ0VfUEFSU0lORzwvY29kZT4gYW5kIGlnbm9yZXMKKzxjb2RlPnVzZURURDwvY29kZT4uICBJZiBjYWxsZWQgd2hlbiBFeHBhdCBoYXMgYmVlbiBjb21waWxlZCB3aXRob3V0CitEVEQgc3VwcG9ydCwgaXQgcmV0dXJucworPGNvZGU+WE1MX0VSUk9SX0ZFQVRVUkVfUkVRVUlSRVNfWE1MX0RURDwvY29kZT4uICBPdGhlcndpc2UsIGl0CityZXR1cm5zIDxjb2RlPlhNTF9FUlJPUl9OT05FPC9jb2RlPi48L3A+CisKKzxwPjxiPk5vdGU6PC9iPiBGb3IgdGhlIHB1cnBvc2Ugb2YgY2hlY2tpbmcgV0ZDOiBFbnRpdHkgRGVjbGFyZWQsIHBhc3NpbmcKKzxjb2RlPnVzZURURCA9PSBYTUxfVFJVRTwvY29kZT4gd2lsbCBtYWtlIHRoZSBwYXJzZXIgYmVoYXZlIGFzIGlmCit0aGUgZG9jdW1lbnQgaGFkIGEgRFREIHdpdGggYW4gZXh0ZXJuYWwgc3Vic2V0LiBUaGlzIGhvbGRzIHRydWUgZXZlbiBpZgordGhlIGV4dGVybmFsIGVudGl0eSByZWZlcmVuY2UgaGFuZGxlciByZXR1cm5zIHdpdGhvdXQgYWN0aW9uLjwvcD4KKzwvZGl2PgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfU2V0UmV0dXJuTlNUcmlwbGV0Ij4KK3ZvaWQgWE1MQ0FMTAorWE1MX1NldFJldHVybk5TVHJpcGxldChYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBkb19uc3QpOworPC9wcmU+Cis8ZGl2IGNsYXNzPSJmY25kZWYiPgorPHA+CitUaGlzIGZ1bmN0aW9uIG9ubHkgaGFzIGFuIGVmZmVjdCB3aGVuIHVzaW5nIGEgcGFyc2VyIGNyZWF0ZWQgd2l0aAorPGNvZGU+PGEgaHJlZj0gIiNYTUxfUGFyc2VyQ3JlYXRlTlMiID5YTUxfUGFyc2VyQ3JlYXRlTlM8L2E+PC9jb2RlPiwKK2kuZS4gd2hlbiBuYW1lc3BhY2UgcHJvY2Vzc2luZyBpcyBpbiBlZmZlY3QuIFRoZSA8Y29kZT5kb19uc3Q8L2NvZGU+CitzZXRzIHdoZXRoZXIgb3Igbm90IHByZWZpeGVzIGFyZSByZXR1cm5lZCB3aXRoIG5hbWVzIHF1YWxpZmllZCB3aXRoIGEKK25hbWVzcGFjZSBwcmVmaXguIElmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggPGNvZGU+ZG9fbnN0PC9jb2RlPgorbm9uLXplcm8sIHRoZW4gYWZ0ZXJ3YXJkcyBuYW1lc3BhY2UgcXVhbGlmaWVkIG5hbWVzICh0aGF0IGlzIHF1YWxpZmllZAord2l0aCBhIHByZWZpeCBhcyBvcHBvc2VkIHRvIGJlbG9uZ2luZyB0byBhIGRlZmF1bHQgbmFtZXNwYWNlKSBhcmUKK3JldHVybmVkIGFzIGEgdHJpcGxldCB3aXRoIHRoZSB0aHJlZSBwYXJ0cyBzZXBhcmF0ZWQgYnkgdGhlIG5hbWVzcGFjZQorc2VwYXJhdG9yIHNwZWNpZmllZCB3aGVuIHRoZSBwYXJzZXIgd2FzIGNyZWF0ZWQuICBUaGUgb3JkZXIgb2YKK3JldHVybmVkIHBhcnRzIGlzIFVSSSwgbG9jYWwgbmFtZSwgYW5kIHByZWZpeC48L3A+IDxwPklmCis8Y29kZT5kb19uc3Q8L2NvZGU+IGlzIHplcm8sIHRoZW4gbmFtZXNwYWNlcyBhcmUgcmVwb3J0ZWQgaW4gdGhlCitkZWZhdWx0IG1hbm5lciwgVVJJIHRoZW4gbG9jYWxfbmFtZSBzZXBhcmF0ZWQgYnkgdGhlIG5hbWVzcGFjZQorc2VwYXJhdG9yLjwvcD4KKzwvZGl2PgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfRGVmYXVsdEN1cnJlbnQiPgordm9pZCBYTUxDQUxMCitYTUxfRGVmYXVsdEN1cnJlbnQoWE1MX1BhcnNlciBwYXJzZXIpOworPC9wcmU+Cis8ZGl2IGNsYXNzPSJmY25kZWYiPgorVGhpcyBjYW4gYmUgY2FsbGVkIHdpdGhpbiBhIGhhbmRsZXIgZm9yIGEgc3RhcnQgZWxlbWVudCwgZW5kIGVsZW1lbnQsCitwcm9jZXNzaW5nIGluc3RydWN0aW9uIG9yIGNoYXJhY3RlciBkYXRhLiAgSXQgY2F1c2VzIHRoZSBjb3JyZXNwb25kaW5nCittYXJrdXAgdG8gYmUgcGFzc2VkIHRvIHRoZSBkZWZhdWx0IGhhbmRsZXIgc2V0IGJ5IDxjb2RlPjxhCitocmVmPSIjWE1MX1NldERlZmF1bHRIYW5kbGVyIiA+WE1MX1NldERlZmF1bHRIYW5kbGVyPC9hPjwvY29kZT4gb3IKKzxjb2RlPjxhIGhyZWY9IiNYTUxfU2V0RGVmYXVsdEhhbmRsZXJFeHBhbmQiCis+WE1MX1NldERlZmF1bHRIYW5kbGVyRXhwYW5kPC9hPjwvY29kZT4uICBJdCBkb2VzIG5vdGhpbmcgaWYgdGhlcmUgaXMKK25vdCBhIGRlZmF1bHQgaGFuZGxlci4KKzwvZGl2PgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfRXhwYXRWZXJzaW9uIj4KK1hNTF9MQ2hhciAqIFhNTENBTEwKK1hNTF9FeHBhdFZlcnNpb24oKTsKKzwvcHJlPgorPGRpdiBjbGFzcz0iZmNuZGVmIj4KK1JldHVybiB0aGUgbGlicmFyeSB2ZXJzaW9uIGFzIGEgc3RyaW5nIChlLmcuIDxjb2RlPiJleHBhdF8xLjk1LjEiPC9jb2RlPikuCis8L2Rpdj4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX0V4cGF0VmVyc2lvbkluZm8iPgorc3RydWN0IFhNTF9FeHBhdF9WZXJzaW9uIFhNTENBTEwKK1hNTF9FeHBhdFZlcnNpb25JbmZvKCk7Cis8L3ByZT4KKzxwcmUgY2xhc3M9InNpZ25hdHVyZSI+Cit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBtYWpvcjsKKyAgaW50IG1pbm9yOworICBpbnQgbWljcm87Cit9IFhNTF9FeHBhdF9WZXJzaW9uOworPC9wcmU+Cis8ZGl2IGNsYXNzPSJmY25kZWYiPgorUmV0dXJuIHRoZSBsaWJyYXJ5IHZlcnNpb24gaW5mb3JtYXRpb24gYXMgYSBzdHJ1Y3R1cmUuCitTb21lIG1hY3JvcyBhcmUgYWxzbyBkZWZpbmVkIHRoYXQgc3VwcG9ydCBjb21waWxlLXRpbWUgdGVzdHMgb2YgdGhlCitsaWJyYXJ5IHZlcnNpb246Cis8dWw+Cis8bGk+PGNvZGU+WE1MX01BSk9SX1ZFUlNJT048L2NvZGU+PC9saT4KKzxsaT48Y29kZT5YTUxfTUlOT1JfVkVSU0lPTjwvY29kZT48L2xpPgorPGxpPjxjb2RlPlhNTF9NSUNST19WRVJTSU9OPC9jb2RlPjwvbGk+Cis8L3VsPgorVGVzdGluZyB0aGVzZSBjb25zdGFudHMgaXMgY3VycmVudGx5IHRoZSBiZXN0IHdheSB0byBkZXRlcm1pbmUgaWYKK3BhcnRpY3VsYXIgcGFydHMgb2YgdGhlIEV4cGF0IEFQSSBhcmUgYXZhaWxhYmxlLgorPC9kaXY+CisKKzxwcmUgY2xhc3M9ImZjbmRlYyIgaWQ9IlhNTF9HZXRGZWF0dXJlTGlzdCI+Citjb25zdCBYTUxfRmVhdHVyZSAqIFhNTENBTEwKK1hNTF9HZXRGZWF0dXJlTGlzdCgpOworPC9wcmU+Cis8cHJlIGNsYXNzPSJzaWduYXR1cmUiPgorZW51bSBYTUxfRmVhdHVyZUVudW0geworICBYTUxfRkVBVFVSRV9FTkQgPSAwLAorICBYTUxfRkVBVFVSRV9VTklDT0RFLAorICBYTUxfRkVBVFVSRV9VTklDT0RFX1dDSEFSX1QsCisgIFhNTF9GRUFUVVJFX0RURCwKKyAgWE1MX0ZFQVRVUkVfQ09OVEVYVF9CWVRFUywKKyAgWE1MX0ZFQVRVUkVfTUlOX1NJWkUsCisgIFhNTF9GRUFUVVJFX1NJWkVPRl9YTUxfQ0hBUiwKKyAgWE1MX0ZFQVRVUkVfU0laRU9GX1hNTF9MQ0hBUiwKKyAgWE1MX0ZFQVRVUkVfTlMsCisgIFhNTF9GRUFUVVJFX0xBUkdFX1NJWkUKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZW51bSBYTUxfRmVhdHVyZUVudW0gIGZlYXR1cmU7CisgIFhNTF9MQ2hhciAgICAgICAgICAgICpuYW1lOworICBsb25nIGludCAgICAgICAgICAgICAgdmFsdWU7Cit9IFhNTF9GZWF0dXJlOworPC9wcmU+Cis8ZGl2IGNsYXNzPSJmY25kZWYiPgorPHA+UmV0dXJucyBhIGxpc3Qgb2YgImZlYXR1cmUiIHJlY29yZHMsIHByb3ZpZGluZyBkZXRhaWxzIG9uIGhvdworRXhwYXQgd2FzIGNvbmZpZ3VyZWQgYXQgY29tcGlsZSB0aW1lLiAgTW9zdCBhcHBsaWNhdGlvbnMgc2hvdWxkIG5vdAorbmVlZCB0byB3b3JyeSBhYm91dCB0aGlzLCBidXQgdGhpcyBpbmZvcm1hdGlvbiBpcyBvdGhlcndpc2Ugbm90CithdmFpbGFibGUgZnJvbSBFeHBhdC4gIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGNvZGUgdGhhdCBkb2VzIG5lZWQgdG8KK2NoZWNrIHRoZXNlIGZlYXR1cmVzIHRvIGRvIHNvIGF0IHJ1bnRpbWUuPC9wPgorCis8cD5UaGUgcmV0dXJuIHZhbHVlIGlzIGFuIGFycmF5IG9mIDxjb2RlPlhNTF9GZWF0dXJlPC9jb2RlPiwKK3Rlcm1pbmF0ZWQgYnkgYSByZWNvcmQgd2l0aCBhIDxjb2RlPmZlYXR1cmU8L2NvZGU+IG9mCis8Y29kZT5YTUxfRkVBVFVSRV9FTkQ8L2NvZGU+IGFuZCA8Y29kZT5uYW1lPC9jb2RlPiBvZiBOVUxMLAoraWRlbnRpZnlpbmcgdGhlIGZlYXR1cmUtdGVzdCBtYWNyb3MgRXhwYXQgd2FzIGNvbXBpbGVkIHdpdGguICBTaW5jZSBhbgorYXBwbGljYXRpb24gdGhhdCByZXF1aXJlcyB0aGlzIGtpbmQgb2YgaW5mb3JtYXRpb24gbmVlZHMgdG8gZGV0ZXJtaW5lCit0aGUgdHlwZSBvZiBjaGFyYWN0ZXIgdGhlIDxjb2RlPm5hbWU8L2NvZGU+IHBvaW50cyB0bywgcmVjb3JkcyBmb3IgdGhlCis8Y29kZT5YTUxfRkVBVFVSRV9TSVpFT0ZfWE1MX0NIQVI8L2NvZGU+IGFuZAorPGNvZGU+WE1MX0ZFQVRVUkVfU0laRU9GX1hNTF9MQ0hBUjwvY29kZT4gd2lsbCBiZSBsb2NhdGVkIGF0IHRoZQorYmVnaW5uaW5nIG9mIHRoZSBsaXN0LCBmb2xsb3dlZCBieSA8Y29kZT5YTUxfRkVBVFVSRV9VTklDT0RFPC9jb2RlPgorYW5kIDxjb2RlPlhNTF9GRUFUVVJFX1VOSUNPREVfV0NIQVJfVDwvY29kZT4sIGlmIHRoZXkgYXJlIHByZXNlbnQgYXQKK2FsbC48L3A+CisKKzxwPlNvbWUgZmVhdHVyZXMgaGF2ZSBhbiBhc3NvY2lhdGVkIHZhbHVlLiAgSWYgdGhlcmUgaXNuJ3QgYW4KK2Fzc29jaWF0ZWQgdmFsdWUsIHRoZSA8Y29kZT52YWx1ZTwvY29kZT4gZmllbGQgaXMgc2V0IHRvIDAuICBBdCB0aGlzCit0aW1lLCB0aGUgZm9sbG93aW5nIGZlYXR1cmVzIGhhdmUgYmVlbiBkZWZpbmVkIHRvIGhhdmUgdmFsdWVzOjwvcD4KKworPGRsPgorICA8ZHQ+PGNvZGU+WE1MX0ZFQVRVUkVfU0laRU9GX1hNTF9DSEFSPC9jb2RlPjwvZHQ+CisgIDxkZD5UaGUgbnVtYmVyIG9mIGJ5dGVzIG9jY3VwaWVkIGJ5IG9uZSA8Y29kZT5YTUxfQ2hhcjwvY29kZT4KKyAgY2hhcmFjdGVyLjwvZGQ+CisgIDxkdD48Y29kZT5YTUxfRkVBVFVSRV9TSVpFT0ZfWE1MX0xDSEFSPC9jb2RlPjwvZHQ+CisgIDxkZD5UaGUgbnVtYmVyIG9mIGJ5dGVzIG9jY3VwaWVkIGJ5IG9uZSA8Y29kZT5YTUxfTENoYXI8L2NvZGU+CisgIGNoYXJhY3Rlci48L2RkPgorICA8ZHQ+PGNvZGU+WE1MX0ZFQVRVUkVfQ09OVEVYVF9CWVRFUzwvY29kZT48L2R0PgorICA8ZGQ+VGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgb2YgY29udGV4dCB3aGljaCBjYW4gYmUKKyAgcmVwb3J0ZWQgYnkgPGNvZGU+PGEgaHJlZj0gIiNYTUxfR2V0SW5wdXRDb250ZXh0IgorICA+WE1MX0dldElucHV0Q29udGV4dDwvYT48L2NvZGU+LjwvZGQ+Cis8L2RsPgorPC9kaXY+CisKKzxwcmUgY2xhc3M9ImZjbmRlYyIgaWQ9IlhNTF9GcmVlQ29udGVudE1vZGVsIj4KK3ZvaWQgWE1MQ0FMTAorWE1MX0ZyZWVDb250ZW50TW9kZWwoWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Db250ZW50ICptb2RlbCk7Cis8L3ByZT4KKzxkaXYgY2xhc3M9ImZjbmRlZiI+CitGdW5jdGlvbiB0byBkZWFsbG9jYXRlIHRoZSA8Y29kZT5tb2RlbDwvY29kZT4gYXJndW1lbnQgcGFzc2VkIHRvIHRoZQorPGNvZGU+WE1MX0VsZW1lbnREZWNsSGFuZGxlcjwvY29kZT4gY2FsbGJhY2sgc2V0IHVzaW5nIDxjb2RlPjxhCitocmVmPSIjWE1MX1NldEVsZW1lbnREZWNsSGFuZGxlciIgPlhNTF9FbGVtZW50RGVjbEhhbmRsZXI8L2E+PC9jb2RlPi4KK1RoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBhbnkgb3RoZXIgcHVycG9zZS4KKzwvZGl2PgorCis8cD5UaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhbGxvdyBleHRlcm5hbCBjb2RlIHRvIHNoYXJlIHRoZSBtZW1vcnkKK2FsbG9jYXRvciBhbiA8Y29kZT5YTUxfUGFyc2VyPC9jb2RlPiBoYXMgYmVlbiBjb25maWd1cmVkIHRvIHVzZS4gIFRoaXMKK2lzIGVzcGVjaWFsbHkgdXNlZnVsIGZvciB0aGlyZC1wYXJ0eSBsaWJyYXJpZXMgdGhhdCBpbnRlcmFjdCB3aXRoIGEKK3BhcnNlciBvYmplY3QgY3JlYXRlZCBieSBhcHBsaWNhdGlvbiBjb2RlLCBvciBoZWF2aWx5IGxheWVyZWQKK2FwcGxpY2F0aW9ucy4gIFRoaXMgY2FuIGJlIGVzc2VudGlhbCB3aGVuIHVzaW5nIGR5bmFtaWNhbGx5IGxvYWRlZAorbGlicmFyaWVzIHdoaWNoIHVzZSBkaWZmZXJlbnQgQyBzdGFuZGFyZCBsaWJyYXJpZXMgKHRoaXMgY2FuIGhhcHBlbiBvbgorV2luZG93cywgYXQgbGVhc3QpLjwvcD4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX01lbU1hbGxvYyI+Cit2b2lkICogWE1MQ0FMTAorWE1MX01lbU1hbGxvYyhYTUxfUGFyc2VyIHBhcnNlciwgc2l6ZV90IHNpemUpOworPC9wcmU+Cis8ZGl2IGNsYXNzPSJmY25kZWYiPgorQWxsb2NhdGUgPGNvZGU+c2l6ZTwvY29kZT4gYnl0ZXMgb2YgbWVtb3J5IHVzaW5nIHRoZSBhbGxvY2F0b3IgdGhlCis8Y29kZT5wYXJzZXI8L2NvZGU+IG9iamVjdCBoYXMgYmVlbiBjb25maWd1cmVkIHRvIHVzZS4gIFJldHVybnMgYQorcG9pbnRlciB0byB0aGUgbWVtb3J5IG9yIE5VTEwgb24gZmFpbHVyZS4gIE1lbW9yeSBhbGxvY2F0ZWQgaW4gdGhpcword2F5IG11c3QgYmUgZnJlZWQgdXNpbmcgPGNvZGU+PGEgaHJlZj0iI1hNTF9NZW1GcmVlIgorPlhNTF9NZW1GcmVlPC9hPjwvY29kZT4uCis8L2Rpdj4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX01lbVJlYWxsb2MiPgordm9pZCAqIFhNTENBTEwKK1hNTF9NZW1SZWFsbG9jKFhNTF9QYXJzZXIgcGFyc2VyLCB2b2lkICpwdHIsIHNpemVfdCBzaXplKTsKKzwvcHJlPgorPGRpdiBjbGFzcz0iZmNuZGVmIj4KK0FsbG9jYXRlIDxjb2RlPnNpemU8L2NvZGU+IGJ5dGVzIG9mIG1lbW9yeSB1c2luZyB0aGUgYWxsb2NhdG9yIHRoZQorPGNvZGU+cGFyc2VyPC9jb2RlPiBvYmplY3QgaGFzIGJlZW4gY29uZmlndXJlZCB0byB1c2UuCis8Y29kZT5wdHI8L2NvZGU+IG11c3QgcG9pbnQgdG8gYSBibG9jayBvZiBtZW1vcnkgYWxsb2NhdGVkIGJ5IDxjb2RlPjxhCitocmVmPSIjWE1MX01lbU1hbGxvYyIgPlhNTF9NZW1NYWxsb2M8L2E+PC9jb2RlPiBvcgorPGNvZGU+WE1MX01lbVJlYWxsb2M8L2NvZGU+LCBvciBiZSBOVUxMLiAgVGhpcyBmdW5jdGlvbiB0cmllcyB0bworZXhwYW5kIHRoZSBibG9jayBwb2ludGVkIHRvIGJ5IDxjb2RlPnB0cjwvY29kZT4gaWYgcG9zc2libGUuICBSZXR1cm5zCithIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBvciBOVUxMIG9uIGZhaWx1cmUuICBPbiBzdWNjZXNzLCB0aGUgb3JpZ2luYWwKK2Jsb2NrIGhhcyBlaXRoZXIgYmVlbiBleHBhbmRlZCBvciBmcmVlZC4gIE9uIGZhaWx1cmUsIHRoZSBvcmlnaW5hbAorYmxvY2sgaGFzIG5vdCBiZWVuIGZyZWVkOyB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIHRoZQorb3JpZ2luYWwgYmxvY2suICBNZW1vcnkgYWxsb2NhdGVkIGluIHRoaXMgd2F5IG11c3QgYmUgZnJlZWQgdXNpbmcKKzxjb2RlPjxhIGhyZWY9IiNYTUxfTWVtRnJlZSIKKz5YTUxfTWVtRnJlZTwvYT48L2NvZGU+LgorPC9kaXY+CisKKzxwcmUgY2xhc3M9ImZjbmRlYyIgaWQ9IlhNTF9NZW1GcmVlIj4KK3ZvaWQgWE1MQ0FMTAorWE1MX01lbUZyZWUoWE1MX1BhcnNlciBwYXJzZXIsIHZvaWQgKnB0cik7Cis8L3ByZT4KKzxkaXYgY2xhc3M9ImZjbmRlZiI+CitGcmVlIGEgYmxvY2sgb2YgbWVtb3J5IHBvaW50ZWQgdG8gYnkgPGNvZGU+cHRyPC9jb2RlPi4gIFRoZSBibG9jayBtdXN0CitoYXZlIGJlZW4gYWxsb2NhdGVkIGJ5IDxjb2RlPjxhIGhyZWY9IiNYTUxfTWVtTWFsbG9jIgorPlhNTF9NZW1NYWxsb2M8L2E+PC9jb2RlPiBvciA8Y29kZT5YTUxfTWVtUmVhbGxvYzwvY29kZT4sIG9yIGJlIE5VTEwuCis8L2Rpdj4KKworPGhyIC8+Cis8cD48YSBocmVmPSJodHRwOi8vdmFsaWRhdG9yLnczLm9yZy9jaGVjay9yZWZlcmVyIj48aW1nCisgICAgICAgIHNyYz0idmFsaWQteGh0bWwxMC5wbmciIGFsdD0iVmFsaWQgWEhUTUwgMS4wISIKKyAgICAgICAgaGVpZ2h0PSIzMSIgd2lkdGg9Ijg4IiBjbGFzcz0ibm9ib3JkZXIiIC8+PC9hPjwvcD4KKzwvZGl2PgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvZG9jL3N0eWxlLmNzcyBiL2V4cGF0LTIuMC4xL2RvYy9zdHlsZS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlkZjMwYgotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2RvYy9zdHlsZS5jc3MKQEAgLTAsMCArMSwxMDEgQEAKK2JvZHkgeworICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKKyAgYm9yZGVyOiAwcHg7CisgIG1hcmdpbjogMHB4OworICBwYWRkaW5nOiAwcHg7Cit9CisKKy5jb3JuZXIgeworICB3aWR0aDogMjAwcHg7CisgIGhlaWdodDogODBweDsKKyAgdGV4dC1hbGlnbjogY2VudGVyOworfQorCisuYmFubmVyIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDExMCwxMzksNjEpOworICBjb2xvcjogcmdiKDI1NSwyMzYsMTc2KTsKKyAgcGFkZGluZy1sZWZ0OiAyZW07Cit9CisKKy5iYW5uZXIgaDEgeworICBmb250LXNpemU6IDIwMCU7Cit9CisKKy5jb250ZW50IHsKKyAgcGFkZGluZzogMGVtIDJlbSAxZW0gMmVtOworfQorCisucmVsZWFzZW5vIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDExMCwxMzksNjEpOworICBjb2xvcjogcmdiKDI1NSwyMzYsMTc2KTsKKyAgcGFkZGluZy1ib3R0b206IDAuM2VtOworICBwYWRkaW5nLXRvcDogMC41ZW07CisgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKKy5ub2JvcmRlciB7CisgIGJvcmRlci13aWR0aDogMHB4OworfQorCisuZWcgeworICBwYWRkaW5nLWxlZnQ6IDFlbTsKKyAgcGFkZGluZy10b3A6IC41ZW07CisgIHBhZGRpbmctYm90dG9tOiAuNWVtOworICBib3JkZXI6IHNvbGlkIHRoaW47CisgIG1hcmdpbjogMWVtIDA7CisgIGJhY2tncm91bmQtY29sb3I6IHRhbjsKKyAgbWFyZ2luLWxlZnQ6IDJlbTsKKyAgbWFyZ2luLXJpZ2h0OiAxMCU7Cit9CisKKy5wc2V1ZG9jb2RlIHsKKyAgcGFkZGluZy1sZWZ0OiAxZW07CisgIHBhZGRpbmctdG9wOiAuNWVtOworICBwYWRkaW5nLWJvdHRvbTogLjVlbTsKKyAgYm9yZGVyOiBzb2xpZCB0aGluOworICBtYXJnaW46IDFlbSAwOworICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjUwLDIyMCwxODApOworICBtYXJnaW4tbGVmdDogMmVtOworICBtYXJnaW4tcmlnaHQ6IDEwJTsKK30KKworLmhhbmRsZXIgeworICB3aWR0aDogMTAwJTsKKyAgYm9yZGVyLXRvcC13aWR0aDogdGhpbjsgIAorICBtYXJnaW4tYm90dG9tOiAxZW07Cit9CisKKy5oYW5kbGVyIHAgeworICBtYXJnaW4tbGVmdDogMmVtOworfQorCisuc2V0dGVyIHsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKKy5zaWduYXR1cmUgeworICBjb2xvcjogbmF2eTsKK30KKworLmZjbmRlYyB7CisgIHdpZHRoOiAxMDAlOworICBib3JkZXItdG9wLXdpZHRoOiB0aGluOworICBmb250LXdlaWdodDogYm9sZDsKK30KKworLmZjbmRlZiB7CisgIG1hcmdpbi1sZWZ0OiAyZW07CisgIG1hcmdpbi1ib3R0b206IDJlbTsKK30KKworZGQgeworICBtYXJnaW4tYm90dG9tOiAyZW07Cit9CisKKy5jcHAtc3ltYm9scyBkdCB7CisgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Cit9CisuY3BwLXN5bWJvbHMgZGQgeworICBtYXJnaW4tYm90dG9tOiAxZW07Cit9CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9kb2MvdmFsaWQteGh0bWwxMC5wbmcgYi9leHBhdC0yLjAuMS9kb2MvdmFsaWQteGh0bWwxMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMyM2Y0OAotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2RvYy92YWxpZC14aHRtbDEwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9kb2MveG1sd2YuMSBiL2V4cGF0LTIuMC4xL2RvYy94bWx3Zi4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NDcxOWEKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9kb2MveG1sd2YuMQpAQCAtMCwwICsxLDI1MSBAQAorLlwiIFRoaXMgbWFucGFnZSBoYXMgYmVlbiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBkb2Nib29rMm1hbiAKKy5cIiBmcm9tIGEgRG9jQm9vayBkb2N1bWVudC4gIFRoaXMgdG9vbCBjYW4gYmUgZm91bmQgYXQ6CisuXCIgPGh0dHA6Ly9zaGVsbC5pcG9saW5lLmNvbS9+ZWxtZXJ0L2NvbXAvZG9jYm9vazJYLz4gCisuXCIgUGxlYXNlIHNlbmQgYW55IGJ1ZyByZXBvcnRzLCBpbXByb3ZlbWVudHMsIGNvbW1lbnRzLCBwYXRjaGVzLCAKKy5cIiBldGMuIHRvIFN0ZXZlIENoZW5nIDxzdGV2ZUBnZ2ktcHJvamVjdC5vcmc+LgorLlRIICJYTUxXRiIgIjEiICIyNCBKYW51YXJ5IDIwMDMiICIiICIiCisuU0ggTkFNRQoreG1sd2YgXC0gRGV0ZXJtaW5lcyBpZiBhbiBYTUwgZG9jdW1lbnQgaXMgd2VsbC1mb3JtZWQKKy5TSCBTWU5PUFNJUworCitcZkJ4bWx3ZlxmUiBbIFxmQi1zXGZSXSAgWyBcZkItblxmUl0gIFsgXGZCLXBcZlJdICBbIFxmQi14XGZSXSAgWyBcZkItZSBcZkllbmNvZGluZ1xmQlxmUl0gIFsgXGZCLXdcZlJdICBbIFxmQi1kIFxmSW91dHB1dC1kaXJcZkJcZlJdICBbIFxmQi1jXGZSXSAgWyBcZkItbVxmUl0gIFsgXGZCLXJcZlJdICBbIFxmQi10XGZSXSAgWyBcZkItdlxmUl0gIFsgXGZCZmlsZSAuLi5cZlJdIAorCisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitcZkJ4bWx3ZlxmUiB1c2VzIHRoZSBFeHBhdCBsaWJyYXJ5IHRvCitkZXRlcm1pbmUgaWYgYW4gWE1MIGRvY3VtZW50IGlzIHdlbGwtZm9ybWVkLiAgSXQgaXMKK25vbi12YWxpZGF0aW5nLgorLlBQCitJZiB5b3UgZG8gbm90IHNwZWNpZnkgYW55IGZpbGVzIG9uIHRoZSBjb21tYW5kLWxpbmUsIGFuZCB5b3UKK2hhdmUgYSByZWNlbnQgdmVyc2lvbiBvZiBcZkJ4bWx3ZlxmUiwgdGhlCitpbnB1dCBmaWxlIHdpbGwgYmUgcmVhZCBmcm9tIHN0YW5kYXJkIGlucHV0LgorLlNIICJXRUxMLUZPUk1FRCBET0NVTUVOVFMiCisuUFAKK0Egd2VsbC1mb3JtZWQgZG9jdW1lbnQgbXVzdCBhZGhlcmUgdG8gdGhlCitmb2xsb3dpbmcgcnVsZXM6CisuVFAgMC4yaQorXChidQorVGhlIGZpbGUgYmVnaW5zIHdpdGggYW4gWE1MIGRlY2xhcmF0aW9uLiAgRm9yIGluc3RhbmNlLAorPD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJ5ZXMiPz4uCitcZkJOT1RFOlxmUgorXGZCeG1sd2ZcZlIgZG9lcyBub3QgY3VycmVudGx5CitjaGVjayBmb3IgYSB2YWxpZCBYTUwgZGVjbGFyYXRpb24uCisuVFAgMC4yaQorXChidQorRXZlcnkgc3RhcnQgdGFnIGlzIGVpdGhlciBlbXB0eSAoPHRhZy8+KQorb3IgaGFzIGEgY29ycmVzcG9uZGluZyBlbmQgdGFnLgorLlRQIDAuMmkKK1woYnUKK1RoZXJlIGlzIGV4YWN0bHkgb25lIHJvb3QgZWxlbWVudC4gIFRoaXMgZWxlbWVudCBtdXN0IGNvbnRhaW4KK2FsbCBvdGhlciBlbGVtZW50cyBpbiB0aGUgZG9jdW1lbnQuICBPbmx5IGNvbW1lbnRzLCB3aGl0ZQorc3BhY2UsIGFuZCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBtYXkgY29tZSBhZnRlciB0aGUgY2xvc2UKK29mIHRoZSByb290IGVsZW1lbnQuCisuVFAgMC4yaQorXChidQorQWxsIGVsZW1lbnRzIG5lc3QgcHJvcGVybHkuCisuVFAgMC4yaQorXChidQorQWxsIGF0dHJpYnV0ZSB2YWx1ZXMgYXJlIGVuY2xvc2VkIGluIHF1b3RlcyAoZWl0aGVyIHNpbmdsZQorb3IgZG91YmxlKS4KKy5QUAorSWYgdGhlIGRvY3VtZW50IGhhcyBhIERURCwgYW5kIGl0IHN0cmljdGx5IGNvbXBsaWVzIHdpdGggdGhhdAorRFRELCB0aGVuIHRoZSBkb2N1bWVudCBpcyBhbHNvIGNvbnNpZGVyZWQgXGZCdmFsaWRcZlIuCitcZkJ4bWx3ZlxmUiBpcyBhIG5vbi12YWxpZGF0aW5nIHBhcnNlciAtLQoraXQgZG9lcyBub3QgY2hlY2sgdGhlIERURC4gIEhvd2V2ZXIsIGl0IGRvZXMgc3VwcG9ydAorZXh0ZXJuYWwgZW50aXRpZXMgKHNlZSB0aGUgXGZCLXhcZlIgb3B0aW9uKS4KKy5TSCAiT1BUSU9OUyIKKy5QUAorV2hlbiBhbiBvcHRpb24gaW5jbHVkZXMgYW4gYXJndW1lbnQsIHlvdSBtYXkgc3BlY2lmeSB0aGUgYXJndW1lbnQgZWl0aGVyCitzZXBhcmF0ZWx5ICgiXGZCLWRcZlIgb3V0cHV0Iikgb3IgY29uY2F0ZW5hdGVkIHdpdGggdGhlCitvcHRpb24gKCJcZkItZFxmUm91dHB1dCIpLiAgXGZCeG1sd2ZcZlIKK3N1cHBvcnRzIGJvdGguCisuVFAKK1xmQi1jXGZSCitJZiB0aGUgaW5wdXQgZmlsZSBpcyB3ZWxsLWZvcm1lZCBhbmQgXGZCeG1sd2ZcZlIKK2RvZXNuJ3QgZW5jb3VudGVyIGFueSBlcnJvcnMsIHRoZSBpbnB1dCBmaWxlIGlzIHNpbXBseSBjb3BpZWQgdG8KK3RoZSBvdXRwdXQgZGlyZWN0b3J5IHVuY2hhbmdlZC4KK1RoaXMgaW1wbGllcyBubyBuYW1lc3BhY2VzICh0dXJucyBvZmYgXGZCLW5cZlIpIGFuZAorcmVxdWlyZXMgXGZCLWRcZlIgdG8gc3BlY2lmeSBhbiBvdXRwdXQgZmlsZS4KKy5UUAorXGZCLWQgb3V0cHV0LWRpclxmUgorU3BlY2lmaWVzIGEgZGlyZWN0b3J5IHRvIGNvbnRhaW4gdHJhbnNmb3JtZWQKK3JlcHJlc2VudGF0aW9ucyBvZiB0aGUgaW5wdXQgZmlsZXMuCitCeSBkZWZhdWx0LCBcZkItZFxmUiBvdXRwdXRzIGEgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uCisoZGVzY3JpYmVkIGJlbG93KS4KK1lvdSBjYW4gc2VsZWN0IGRpZmZlcmVudCBvdXRwdXQgZm9ybWF0cyB1c2luZyBcZkItY1xmUgorYW5kIFxmQi1tXGZSLgorCitUaGUgb3V0cHV0IGZpbGVuYW1lcyB3aWxsCitiZSBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSBpbnB1dCBmaWxlbmFtZXMgb3IgIlNURElOIiBpZiB0aGUgaW5wdXQgaXMKK2NvbWluZyBmcm9tIHN0YW5kYXJkIGlucHV0LiAgVGhlcmVmb3JlLCB5b3UgbXVzdCBiZSBjYXJlZnVsIHRoYXQgdGhlCitvdXRwdXQgZmlsZSBkb2VzIG5vdCBnbyBpbnRvIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgaW5wdXQKK2ZpbGUuICBPdGhlcndpc2UsIFxmQnhtbHdmXGZSIHdpbGwgZGVsZXRlIHRoZQoraW5wdXQgZmlsZSBiZWZvcmUgaXQgZ2VuZXJhdGVzIHRoZSBvdXRwdXQgZmlsZSAoanVzdCBsaWtlIHJ1bm5pbmcKK2NhdCA8IGZpbGUgPiBmaWxlIGluIG1vc3Qgc2hlbGxzKS4KKworVHdvIHN0cnVjdHVyYWxseSBlcXVpdmFsZW50IFhNTCBkb2N1bWVudHMgaGF2ZSBhIGJ5dGUtZm9yLWJ5dGUKK2lkZW50aWNhbCBjYW5vbmljYWwgWE1MIHJlcHJlc2VudGF0aW9uLgorTm90ZSB0aGF0IGlnbm9yYWJsZSB3aGl0ZSBzcGFjZSBpcyBjb25zaWRlcmVkIHNpZ25pZmljYW50IGFuZAoraXMgdHJlYXRlZCBlcXVpdmFsZW50bHkgdG8gZGF0YS4KK01vcmUgb24gY2Fub25pY2FsIFhNTCBjYW4gYmUgZm91bmQgYXQKK2h0dHA6Ly93d3cuamNsYXJrLmNvbS94bWwvY2Fub254bWwuaHRtbCAuCisuVFAKK1xmQi1lIGVuY29kaW5nXGZSCitTcGVjaWZpZXMgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBmb3IgdGhlIGRvY3VtZW50LCBvdmVycmlkaW5nCithbnkgZG9jdW1lbnQgZW5jb2RpbmcgZGVjbGFyYXRpb24uICBcZkJ4bWx3ZlxmUgorc3VwcG9ydHMgZm91ciBidWlsdC1pbiBlbmNvZGluZ3M6CitVUy1BU0NJSSwKK1VURi04LAorVVRGLTE2LCBhbmQKK0lTTy04ODU5LTEuCitBbHNvIHNlZSB0aGUgXGZCLXdcZlIgb3B0aW9uLgorLlRQCitcZkItbVxmUgorT3V0cHV0cyBzb21lIHN0cmFuZ2Ugc29ydCBvZiBYTUwgZmlsZSB0aGF0IGNvbXBsZXRlbHkKK2Rlc2NyaWJlcyB0aGUgaW5wdXQgZmlsZSwgaW5jbHVkaW5nIGNoYXJhY3RlciBwb3NpdGlvbnMuCitSZXF1aXJlcyBcZkItZFxmUiB0byBzcGVjaWZ5IGFuIG91dHB1dCBmaWxlLgorLlRQCitcZkItblxmUgorVHVybnMgb24gbmFtZXNwYWNlIHByb2Nlc3NpbmcuICAoZGVzY3JpYmUgbmFtZXNwYWNlcykKK1xmQi1jXGZSIGRpc2FibGVzIG5hbWVzcGFjZXMuCisuVFAKK1xmQi1wXGZSCitUZWxscyB4bWx3ZiB0byBwcm9jZXNzIGV4dGVybmFsIERURHMgYW5kIHBhcmFtZXRlcgorZW50aXRpZXMuCisKK05vcm1hbGx5IFxmQnhtbHdmXGZSIG5ldmVyIHBhcnNlcyBwYXJhbWV0ZXIKK2VudGl0aWVzLiAgXGZCLXBcZlIgdGVsbHMgaXQgdG8gYWx3YXlzIHBhcnNlIHRoZW0uCitcZkItcFxmUiBpbXBsaWVzIFxmQi14XGZSLgorLlRQCitcZkItclxmUgorTm9ybWFsbHkgXGZCeG1sd2ZcZlIgbWVtb3J5LW1hcHMgdGhlIFhNTCBmaWxlCitiZWZvcmUgcGFyc2luZzsgdGhpcyBjYW4gcmVzdWx0IGluIGZhc3RlciBwYXJzaW5nIG9uIG1hbnkKK3BsYXRmb3Jtcy4KK1xmQi1yXGZSIHR1cm5zIG9mZiBtZW1vcnktbWFwcGluZyBhbmQgdXNlcyBub3JtYWwgZmlsZQorSU8gY2FsbHMgaW5zdGVhZC4KK09mIGNvdXJzZSwgbWVtb3J5LW1hcHBpbmcgaXMgYXV0b21hdGljYWxseSB0dXJuZWQgb2ZmCit3aGVuIHJlYWRpbmcgZnJvbSBzdGFuZGFyZCBpbnB1dC4KKworVXNlIG9mIG1lbW9yeS1tYXBwaW5nIGNhbiBjYXVzZSBzb21lIHBsYXRmb3JtcyB0byByZXBvcnQKK3N1YnN0YW50aWFsbHkgaGlnaGVyIG1lbW9yeSB1c2FnZSBmb3IKK1xmQnhtbHdmXGZSLCBidXQgdGhpcyBhcHBlYXJzIHRvIGJlIGEgbWF0dGVyIG9mCit0aGUgb3BlcmF0aW5nIHN5c3RlbSByZXBvcnRpbmcgbWVtb3J5IGluIGEgc3RyYW5nZSB3YXk7IHRoZXJlIGlzCitub3QgYSBsZWFrIGluIFxmQnhtbHdmXGZSLgorLlRQCitcZkItc1xmUgorUHJpbnRzIGFuIGVycm9yIGlmIHRoZSBkb2N1bWVudCBpcyBub3Qgc3RhbmRhbG9uZS4gCitBIGRvY3VtZW50IGlzIHN0YW5kYWxvbmUgaWYgaXQgaGFzIG5vIGV4dGVybmFsIHN1YnNldCBhbmQgbm8KK3JlZmVyZW5jZXMgdG8gcGFyYW1ldGVyIGVudGl0aWVzLgorLlRQCitcZkItdFxmUgorVHVybnMgb24gdGltaW5ncy4gIFRoaXMgdGVsbHMgRXhwYXQgdG8gcGFyc2UgdGhlIGVudGlyZSBmaWxlLAorYnV0IG5vdCBwZXJmb3JtIGFueSBwcm9jZXNzaW5nLgorVGhpcyBnaXZlcyBhIGZhaXJseSBhY2N1cmF0ZSBpZGVhIG9mIHRoZSByYXcgc3BlZWQgb2YgRXhwYXQgaXRzZWxmCit3aXRob3V0IGNsaWVudCBvdmVyaGVhZC4KK1xmQi10XGZSIHR1cm5zIG9mZiBtb3N0IG9mIHRoZSBvdXRwdXQgb3B0aW9ucworKFxmQi1kXGZSLCBcZkItbVxmUiwgXGZCLWNcZlIsCitcJi4uLikuCisuVFAKK1xmQi12XGZSCitQcmludHMgdGhlIHZlcnNpb24gb2YgdGhlIEV4cGF0IGxpYnJhcnkgYmVpbmcgdXNlZCwgaW5jbHVkaW5nIHNvbWUKK2luZm9ybWF0aW9uIG9uIHRoZSBjb21waWxlLXRpbWUgY29uZmlndXJhdGlvbiBvZiB0aGUgbGlicmFyeSwgYW5kCit0aGVuIGV4aXRzLgorLlRQCitcZkItd1xmUgorRW5hYmxlcyBzdXBwb3J0IGZvciBXaW5kb3dzIGNvZGUgcGFnZXMuCitOb3JtYWxseSwgXGZCeG1sd2ZcZlIgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiBpdAorcnVucyBhY3Jvc3MgYW4gZW5jb2RpbmcgdGhhdCBpdCBpcyBub3QgZXF1aXBwZWQgdG8gaGFuZGxlIGl0c2VsZi4gIFdpdGgKK1xmQi13XGZSLCB4bWx3ZiB3aWxsIHRyeSB0byB1c2UgYSBXaW5kb3dzIGNvZGUKK3BhZ2UuICBTZWUgYWxzbyBcZkItZVxmUi4KKy5UUAorXGZCLXhcZlIKK1R1cm5zIG9uIHBhcnNpbmcgZXh0ZXJuYWwgZW50aXRpZXMuCisKK05vbi12YWxpZGF0aW5nIHBhcnNlcnMgYXJlIG5vdCByZXF1aXJlZCB0byByZXNvbHZlIGV4dGVybmFsCitlbnRpdGllcywgb3IgZXZlbiBleHBhbmQgZW50aXRpZXMgYXQgYWxsLgorRXhwYXQgYWx3YXlzIGV4cGFuZHMgaW50ZXJuYWwgZW50aXRpZXMgKD8pLAorYnV0IGV4dGVybmFsIGVudGl0eSBwYXJzaW5nIG11c3QgYmUgZW5hYmxlZCBleHBsaWNpdGx5LgorCitFeHRlcm5hbCBlbnRpdGllcyBhcmUgc2ltcGx5IGVudGl0aWVzIHRoYXQgb2J0YWluIHRoZWlyCitkYXRhIGZyb20gb3V0c2lkZSB0aGUgWE1MIGZpbGUgY3VycmVudGx5IGJlaW5nIHBhcnNlZC4KKworVGhpcyBpcyBhbiBleGFtcGxlIG9mIGFuIGludGVybmFsIGVudGl0eToKKworLm5mCis8IUVOVElUWSB2ZXJzICcxLjAuMic+CisuZmkKKworQW5kIGhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgZXh0ZXJuYWwgZW50aXRpZXM6CisKKy5uZgorPCFFTlRJVFkgaGVhZGVyIFNZU1RFTSAiaGVhZGVyLSZ2ZXJzOy54bWwiPiAgKHBhcnNlZCkKKzwhRU5USVRZIGxvZ28gU1lTVEVNICJsb2dvLnBuZyIgUE5HPiAgICAgICAgICh1bnBhcnNlZCkKKy5maQorLlRQCitcZkItLVxmUgorKFR3byBoeXBoZW5zLikKK1Rlcm1pbmF0ZXMgdGhlIGxpc3Qgb2Ygb3B0aW9ucy4gIFRoaXMgaXMgb25seSBuZWVkZWQgaWYgYSBmaWxlbmFtZQorc3RhcnRzIHdpdGggYSBoeXBoZW4uICBGb3IgZXhhbXBsZToKKworLm5mCit4bWx3ZiAtLSAtbXlmaWxlLnhtbAorLmZpCisKK3dpbGwgcnVuIFxmQnhtbHdmXGZSIG9uIHRoZSBmaWxlCitcZkktbXlmaWxlLnhtbFxmUi4KKy5QUAorT2xkZXIgdmVyc2lvbnMgb2YgXGZCeG1sd2ZcZlIgZG8gbm90IHN1cHBvcnQKK3JlYWRpbmcgZnJvbSBzdGFuZGFyZCBpbnB1dC4KKy5TSCAiT1VUUFVUIgorLlBQCitJZiBhbiBpbnB1dCBmaWxlIGlzIG5vdCB3ZWxsLWZvcm1lZCwKK1xmQnhtbHdmXGZSIHByaW50cyBhIHNpbmdsZSBsaW5lIGRlc2NyaWJpbmcKK3RoZSBwcm9ibGVtIHRvIHN0YW5kYXJkIG91dHB1dC4gIElmIGEgZmlsZSBpcyB3ZWxsIGZvcm1lZCwKK1xmQnhtbHdmXGZSIG91dHB1dHMgbm90aGluZy4KK05vdGUgdGhhdCB0aGUgcmVzdWx0IGNvZGUgaXMgXGZCbm90XGZSIHNldC4KKy5TSCAiQlVHUyIKKy5QUAorQWNjb3JkaW5nIHRvIHRoZSBXM0Mgc3RhbmRhcmQsIGFuIFhNTCBmaWxlIHdpdGhvdXQgYQorZGVjbGFyYXRpb24gYXQgdGhlIGJlZ2lubmluZyBpcyBub3QgY29uc2lkZXJlZCB3ZWxsLWZvcm1lZC4KK0hvd2V2ZXIsIFxmQnhtbHdmXGZSIGFsbG93cyB0aGlzIHRvIHBhc3MuCisuUFAKK1xmQnhtbHdmXGZSIHJldHVybnMgYSAwIC0gbm9lcnIgcmVzdWx0LAorZXZlbiBpZiB0aGUgZmlsZSBpcyBub3Qgd2VsbC1mb3JtZWQuICBUaGVyZSBpcyBubyBnb29kIHdheSBmb3IKK2EgcHJvZ3JhbSB0byB1c2UgXGZCeG1sd2ZcZlIgdG8gcXVpY2tseQorY2hlY2sgYSBmaWxlIC0tIGl0IG11c3QgcGFyc2UgXGZCeG1sd2ZcZlIncworc3RhbmRhcmQgb3V0cHV0LgorLlBQCitUaGUgZXJyb3JzIHNob3VsZCBnbyB0byBzdGFuZGFyZCBlcnJvciwgbm90IHN0YW5kYXJkIG91dHB1dC4KKy5QUAorVGhlcmUgc2hvdWxkIGJlIGEgd2F5IHRvIGdldCBcZkItZFxmUiB0byBzZW5kIGl0cworb3V0cHV0IHRvIHN0YW5kYXJkIG91dHB1dCByYXRoZXIgdGhhbiBmb3JjaW5nIHRoZSB1c2VyIHRvIHNlbmQKK2l0IHRvIGEgZmlsZS4KKy5QUAorSSBoYXZlIG5vIGlkZWEgd2h5IGFueW9uZSB3b3VsZCB3YW50IHRvIHVzZSB0aGUKK1xmQi1kXGZSLCBcZkItY1xmUiwgYW5kCitcZkItbVxmUiBvcHRpb25zLiAgSWYgc29tZW9uZSBjb3VsZCBleHBsYWluIGl0IHRvCittZSwgSSdkIGxpa2UgdG8gYWRkIHRoaXMgaW5mb3JtYXRpb24gdG8gdGhpcyBtYW5wYWdlLgorLlNIICJBTFRFUk5BVElWRVMiCisuUFAKK0hlcmUgYXJlIHNvbWUgWE1MIHZhbGlkYXRvcnMgb24gdGhlIHdlYjoKKworLm5mCitodHRwOi8vd3d3LmhjcmMuZWQuYWMudWsvfnJpY2hhcmQveG1sLWNoZWNrLmh0bWwKK2h0dHA6Ly93d3cuc3RnLmJyb3duLmVkdS9zZXJ2aWNlL3htbHZhbGlkLworaHR0cDovL3d3dy5zY3JpcHRpbmcuY29tL2Zyb250aWVyNS94bWwvY29kZS94bWxWYWxpZGF0b3IuaHRtbAoraHR0cDovL3d3dy54bWwuY29tL3B1Yi9hL3Rvb2xzL3J1d2YvY2hlY2suaHRtbAorLmZpCisuU0ggIlNFRSBBTFNPIgorLlBQCisKKy5uZgorVGhlIEV4cGF0IGhvbWUgcGFnZTogICAgICAgIGh0dHA6Ly93d3cubGliZXhwYXQub3JnLworVGhlIFczIFhNTCBzcGVjaWZpY2F0aW9uOiAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwKKy5maQorLlNIICJBVVRIT1IiCisuUFAKK1RoaXMgbWFudWFsIHBhZ2Ugd2FzIHdyaXR0ZW4gYnkgU2NvdHQgQnJvbnNvbiA8YnJvbnNvbkByaW5zcGluLmNvbT4gZm9yCit0aGUgRGViaWFuIEdOVS9MaW51eCBzeXN0ZW0gKGJ1dCBtYXkgYmUgdXNlZCBieSBvdGhlcnMpLiAgUGVybWlzc2lvbiBpcworZ3JhbnRlZCB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhpcyBkb2N1bWVudCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgRnJlZSBEb2N1bWVudGF0aW9uCitMaWNlbnNlLCBWZXJzaW9uIDEuMS4KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2RvYy94bWx3Zi5zZ21sIGIvZXhwYXQtMi4wLjEvZG9jL3htbHdmLnNnbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM5Yzk1ZQotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2RvYy94bWx3Zi5zZ21sCkBAIC0wLDAgKzEsNDczIEBACis8IWRvY3R5cGUgcmVmZW50cnkgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgVjQuMS8vRU4iIFsKKworPCEtLSBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGRvY2Jvb2stdG8tbWFuIHRvIGdlbmVyYXRlIGFuIG5yb2ZmIG1hbnVhbAorICAgICBwYWdlOiBgZG9jYm9vay10by1tYW4gbWFucGFnZS5zZ21sID4gbWFucGFnZS4xJy4gIFlvdSBtYXkgdmlldworICAgICB0aGUgbWFudWFsIHBhZ2Ugd2l0aDogYGRvY2Jvb2stdG8tbWFuIG1hbnBhZ2Uuc2dtbCB8IG5yb2ZmIC1tYW4gfAorICAgICBsZXNzJy4gIEEgdHlwaWNhbCBlbnRyeSBpbiBhIE1ha2VmaWxlIG9yIE1ha2VmaWxlLmFtIGlzOgorCittYW5wYWdlLjE6IG1hbnBhZ2Uuc2dtbAorCWRvY2Jvb2stdG8tbWFuICQ8ID4gJEAKKyAgLS0+CisKKyAgPCEtLSBGaWxsIGluIHlvdXIgbmFtZSBmb3IgRklSU1ROQU1FIGFuZCBTVVJOQU1FLiAtLT4KKyAgPCFFTlRJVFkgZGhmaXJzdG5hbWUgIjxmaXJzdG5hbWU+U2NvdHQ8L2ZpcnN0bmFtZT4iPgorICA8IUVOVElUWSBkaHN1cm5hbWUgICAiPHN1cm5hbWU+QnJvbnNvbjwvc3VybmFtZT4iPgorICA8IS0tIFBsZWFzZSBhZGp1c3QgdGhlIGRhdGUgd2hlbmV2ZXIgcmV2aXNpbmcgdGhlIG1hbnBhZ2UuIC0tPgorICA8IUVOVElUWSBkaGRhdGUgICAgICAiPGRhdGU+RGVjZW1iZXIgIDUsIDIwMDE8L2RhdGU+Ij4KKyAgPCEtLSBTRUNUSU9OIHNob3VsZCBiZSAxLTgsIG1heWJlIHcvIHN1YnNlY3Rpb24gb3RoZXIgcGFyYW1ldGVycyBhcmUKKyAgICAgICBhbGxvd2VkOiBzZWUgbWFuKDcpLCBtYW4oMSkuIC0tPgorICA8IUVOVElUWSBkaHNlY3Rpb24gICAiPG1hbnZvbG51bT4xPC9tYW52b2xudW0+Ij4KKyAgPCFFTlRJVFkgZGhlbWFpbCAgICAgIjxlbWFpbD5icm9uc29uQHJpbnNwaW4uY29tPC9lbWFpbD4iPgorICA8IUVOVElUWSBkaHVzZXJuYW1lICAiU2NvdHQgQnJvbnNvbiI+CisgIDwhRU5USVRZIGRodWNwYWNrYWdlICI8cmVmZW50cnl0aXRsZT5YTUxXRjwvcmVmZW50cnl0aXRsZT4iPgorICA8IUVOVElUWSBkaHBhY2thZ2UgICAieG1sd2YiPgorCisgIDwhRU5USVRZIGRlYmlhbiAgICAgICI8cHJvZHVjdG5hbWU+RGViaWFuIEdOVS9MaW51eDwvcHJvZHVjdG5hbWU+Ij4KKyAgPCFFTlRJVFkgZ251ICAgICAgICAgIjxhY3JvbnltPkdOVTwvYWNyb255bT4iPgorXT4KKworPHJlZmVudHJ5PgorICA8cmVmZW50cnlpbmZvPgorICAgIDxhZGRyZXNzPgorICAgICAgJmRoZW1haWw7CisgICAgPC9hZGRyZXNzPgorICAgIDxhdXRob3I+CisgICAgICAmZGhmaXJzdG5hbWU7CisgICAgICAmZGhzdXJuYW1lOworICAgIDwvYXV0aG9yPgorICAgIDxjb3B5cmlnaHQ+CisgICAgICA8eWVhcj4yMDAxPC95ZWFyPgorICAgICAgPGhvbGRlcj4mZGh1c2VybmFtZTs8L2hvbGRlcj4KKyAgICA8L2NvcHlyaWdodD4KKyAgICAmZGhkYXRlOworICA8L3JlZmVudHJ5aW5mbz4KKyAgPHJlZm1ldGE+CisgICAgJmRodWNwYWNrYWdlOworCisgICAgJmRoc2VjdGlvbjsKKyAgPC9yZWZtZXRhPgorICA8cmVmbmFtZWRpdj4KKyAgICA8cmVmbmFtZT4mZGhwYWNrYWdlOzwvcmVmbmFtZT4KKworICAgIDxyZWZwdXJwb3NlPkRldGVybWluZXMgaWYgYW4gWE1MIGRvY3VtZW50IGlzIHdlbGwtZm9ybWVkPC9yZWZwdXJwb3NlPgorICA8L3JlZm5hbWVkaXY+CisgIDxyZWZzeW5vcHNpc2Rpdj4KKyAgICA8Y21kc3lub3BzaXM+CisgICAgICA8Y29tbWFuZD4mZGhwYWNrYWdlOzwvY29tbWFuZD4KKwkgIDxhcmc+PG9wdGlvbj4tczwvb3B0aW9uPjwvYXJnPgorCSAgPGFyZz48b3B0aW9uPi1uPC9vcHRpb24+PC9hcmc+CisJICA8YXJnPjxvcHRpb24+LXA8L29wdGlvbj48L2FyZz4KKwkgIDxhcmc+PG9wdGlvbj4teDwvb3B0aW9uPjwvYXJnPgorCisJICA8YXJnPjxvcHRpb24+LWUgPHJlcGxhY2VhYmxlPmVuY29kaW5nPC9yZXBsYWNlYWJsZT48L29wdGlvbj48L2FyZz4KKwkgIDxhcmc+PG9wdGlvbj4tdzwvb3B0aW9uPjwvYXJnPgorCisJICA8YXJnPjxvcHRpb24+LWQgPHJlcGxhY2VhYmxlPm91dHB1dC1kaXI8L3JlcGxhY2VhYmxlPjwvb3B0aW9uPjwvYXJnPgorCSAgPGFyZz48b3B0aW9uPi1jPC9vcHRpb24+PC9hcmc+CisJICA8YXJnPjxvcHRpb24+LW08L29wdGlvbj48L2FyZz4KKworCSAgPGFyZz48b3B0aW9uPi1yPC9vcHRpb24+PC9hcmc+CisJICA8YXJnPjxvcHRpb24+LXQ8L29wdGlvbj48L2FyZz4KKworCSAgPGFyZz48b3B0aW9uPi12PC9vcHRpb24+PC9hcmc+CisKKwkgIDxhcmc+ZmlsZSAuLi48L2FyZz4KKyAgICA8L2NtZHN5bm9wc2lzPgorICA8L3JlZnN5bm9wc2lzZGl2PgorIAorICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPkRFU0NSSVBUSU9OPC90aXRsZT4KKworICAgIDxwYXJhPgorCTxjb21tYW5kPiZkaHBhY2thZ2U7PC9jb21tYW5kPiB1c2VzIHRoZSBFeHBhdCBsaWJyYXJ5IHRvCisJZGV0ZXJtaW5lIGlmIGFuIFhNTCBkb2N1bWVudCBpcyB3ZWxsLWZvcm1lZC4gIEl0IGlzCisJbm9uLXZhbGlkYXRpbmcuCisJPC9wYXJhPgorCisJPHBhcmE+CisJSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFueSBmaWxlcyBvbiB0aGUgY29tbWFuZC1saW5lLCBhbmQgeW91CisJaGF2ZSBhIHJlY2VudCB2ZXJzaW9uIG9mIDxjb21tYW5kPiZkaHBhY2thZ2U7PC9jb21tYW5kPiwgdGhlCisJaW5wdXQgZmlsZSB3aWxsIGJlIHJlYWQgZnJvbSBzdGFuZGFyZCBpbnB1dC4KKwk8L3BhcmE+CisKKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPldFTEwtRk9STUVEIERPQ1VNRU5UUzwvdGl0bGU+CisKKwk8cGFyYT4KKwkgIEEgd2VsbC1mb3JtZWQgZG9jdW1lbnQgbXVzdCBhZGhlcmUgdG8gdGhlCisJICBmb2xsb3dpbmcgcnVsZXM6CisJPC9wYXJhPgorCisJPGl0ZW1pemVkbGlzdD4KKyAgICAgIDxsaXN0aXRlbT48cGFyYT4KKwkgICAgVGhlIGZpbGUgYmVnaW5zIHdpdGggYW4gWE1MIGRlY2xhcmF0aW9uLiAgRm9yIGluc3RhbmNlLAorCQk8bGl0ZXJhbD4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9InllcyI/Jmd0OzwvbGl0ZXJhbD4uCisJCTxlbXBoYXNpcz5OT1RFOjwvZW1waGFzaXM+CisJCTxjb21tYW5kPiZkaHBhY2thZ2U7PC9jb21tYW5kPiBkb2VzIG5vdCBjdXJyZW50bHkKKwkJY2hlY2sgZm9yIGEgdmFsaWQgWE1MIGRlY2xhcmF0aW9uLgorICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisJCUV2ZXJ5IHN0YXJ0IHRhZyBpcyBlaXRoZXIgZW1wdHkgKCZsdDt0YWcvJmd0OykKKwkJb3IgaGFzIGEgY29ycmVzcG9uZGluZyBlbmQgdGFnLgorICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisJICAgIFRoZXJlIGlzIGV4YWN0bHkgb25lIHJvb3QgZWxlbWVudC4gIFRoaXMgZWxlbWVudCBtdXN0IGNvbnRhaW4KKwkJYWxsIG90aGVyIGVsZW1lbnRzIGluIHRoZSBkb2N1bWVudC4gIE9ubHkgY29tbWVudHMsIHdoaXRlCisJCXNwYWNlLCBhbmQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgbWF5IGNvbWUgYWZ0ZXIgdGhlIGNsb3NlCisJCW9mIHRoZSByb290IGVsZW1lbnQuCisgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgIDxsaXN0aXRlbT48cGFyYT4KKwkJQWxsIGVsZW1lbnRzIG5lc3QgcHJvcGVybHkuCisgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgIDxsaXN0aXRlbT48cGFyYT4KKwkJQWxsIGF0dHJpYnV0ZSB2YWx1ZXMgYXJlIGVuY2xvc2VkIGluIHF1b3RlcyAoZWl0aGVyIHNpbmdsZQorCQlvciBkb3VibGUpLgorICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgPC9pdGVtaXplZGxpc3Q+CisKKwk8cGFyYT4KKwkgIElmIHRoZSBkb2N1bWVudCBoYXMgYSBEVEQsIGFuZCBpdCBzdHJpY3RseSBjb21wbGllcyB3aXRoIHRoYXQKKwkgIERURCwgdGhlbiB0aGUgZG9jdW1lbnQgaXMgYWxzbyBjb25zaWRlcmVkIDxlbXBoYXNpcz52YWxpZDwvZW1waGFzaXM+LgorCSAgPGNvbW1hbmQ+JmRocGFja2FnZTs8L2NvbW1hbmQ+IGlzIGEgbm9uLXZhbGlkYXRpbmcgcGFyc2VyIC0tCisJICBpdCBkb2VzIG5vdCBjaGVjayB0aGUgRFRELiAgSG93ZXZlciwgaXQgZG9lcyBzdXBwb3J0CisJICBleHRlcm5hbCBlbnRpdGllcyAoc2VlIHRoZSA8b3B0aW9uPi14PC9vcHRpb24+IG9wdGlvbikuCisJPC9wYXJhPgorICA8L3JlZnNlY3QxPgorCisgIDxyZWZzZWN0MT4KKyAgICA8dGl0bGU+T1BUSU9OUzwvdGl0bGU+CisKKzxwYXJhPgorV2hlbiBhbiBvcHRpb24gaW5jbHVkZXMgYW4gYXJndW1lbnQsIHlvdSBtYXkgc3BlY2lmeSB0aGUgYXJndW1lbnQgZWl0aGVyCitzZXBhcmF0ZWx5ICgiPG9wdGlvbj4tZDwvb3B0aW9uPiBvdXRwdXQiKSBvciBjb25jYXRlbmF0ZWQgd2l0aCB0aGUKK29wdGlvbiAoIjxvcHRpb24+LWQ8L29wdGlvbj5vdXRwdXQiKS4gIDxjb21tYW5kPiZkaHBhY2thZ2U7PC9jb21tYW5kPgorc3VwcG9ydHMgYm90aC4KKzwvcGFyYT4KKworICAgIDx2YXJpYWJsZWxpc3Q+CisKKyAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgIDx0ZXJtPjxvcHRpb24+LWM8L29wdGlvbj48L3Rlcm0+CisgICAgICAgIDxsaXN0aXRlbT4KKwkJPHBhcmE+CisgIElmIHRoZSBpbnB1dCBmaWxlIGlzIHdlbGwtZm9ybWVkIGFuZCA8Y29tbWFuZD4mZGhwYWNrYWdlOzwvY29tbWFuZD4KKyAgZG9lc24ndCBlbmNvdW50ZXIgYW55IGVycm9ycywgdGhlIGlucHV0IGZpbGUgaXMgc2ltcGx5IGNvcGllZCB0bworICB0aGUgb3V0cHV0IGRpcmVjdG9yeSB1bmNoYW5nZWQuCisgIFRoaXMgaW1wbGllcyBubyBuYW1lc3BhY2VzICh0dXJucyBvZmYgPG9wdGlvbj4tbjwvb3B0aW9uPikgYW5kCisgIHJlcXVpcmVzIDxvcHRpb24+LWQ8L29wdGlvbj4gdG8gc3BlY2lmeSBhbiBvdXRwdXQgZmlsZS4KKyAgCQk8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgPHRlcm0+PG9wdGlvbj4tZCBvdXRwdXQtZGlyPC9vcHRpb24+PC90ZXJtPgorICAgICAgICA8bGlzdGl0ZW0+CisJCTxwYXJhPgorICBTcGVjaWZpZXMgYSBkaXJlY3RvcnkgdG8gY29udGFpbiB0cmFuc2Zvcm1lZAorICByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGlucHV0IGZpbGVzLgorICBCeSBkZWZhdWx0LCA8b3B0aW9uPi1kPC9vcHRpb24+IG91dHB1dHMgYSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24KKyAgKGRlc2NyaWJlZCBiZWxvdykuCisgIFlvdSBjYW4gc2VsZWN0IGRpZmZlcmVudCBvdXRwdXQgZm9ybWF0cyB1c2luZyA8b3B0aW9uPi1jPC9vcHRpb24+CisgIGFuZCA8b3B0aW9uPi1tPC9vcHRpb24+LgorCSAgPC9wYXJhPgorCSAgPHBhcmE+CisgIFRoZSBvdXRwdXQgZmlsZW5hbWVzIHdpbGwKKyAgYmUgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgaW5wdXQgZmlsZW5hbWVzIG9yICJTVERJTiIgaWYgdGhlIGlucHV0IGlzCisgIGNvbWluZyBmcm9tIHN0YW5kYXJkIGlucHV0LiAgVGhlcmVmb3JlLCB5b3UgbXVzdCBiZSBjYXJlZnVsIHRoYXQgdGhlCisgIG91dHB1dCBmaWxlIGRvZXMgbm90IGdvIGludG8gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBpbnB1dAorICBmaWxlLiAgT3RoZXJ3aXNlLCA8Y29tbWFuZD4mZGhwYWNrYWdlOzwvY29tbWFuZD4gd2lsbCBkZWxldGUgdGhlCisgIGlucHV0IGZpbGUgYmVmb3JlIGl0IGdlbmVyYXRlcyB0aGUgb3V0cHV0IGZpbGUgKGp1c3QgbGlrZSBydW5uaW5nCisgIDxsaXRlcmFsPmNhdCAmbHQ7IGZpbGUgJmd0OyBmaWxlPC9saXRlcmFsPiBpbiBtb3N0IHNoZWxscykuCisJICA8L3BhcmE+CisJICA8cGFyYT4gCisgIFR3byBzdHJ1Y3R1cmFsbHkgZXF1aXZhbGVudCBYTUwgZG9jdW1lbnRzIGhhdmUgYSBieXRlLWZvci1ieXRlCisgIGlkZW50aWNhbCBjYW5vbmljYWwgWE1MIHJlcHJlc2VudGF0aW9uLgorICBOb3RlIHRoYXQgaWdub3JhYmxlIHdoaXRlIHNwYWNlIGlzIGNvbnNpZGVyZWQgc2lnbmlmaWNhbnQgYW5kCisgIGlzIHRyZWF0ZWQgZXF1aXZhbGVudGx5IHRvIGRhdGEuCisgIE1vcmUgb24gY2Fub25pY2FsIFhNTCBjYW4gYmUgZm91bmQgYXQKKyAgaHR0cDovL3d3dy5qY2xhcmsuY29tL3htbC9jYW5vbnhtbC5odG1sIC4KKwkgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICA8dGVybT48b3B0aW9uPi1lIGVuY29kaW5nPC9vcHRpb24+PC90ZXJtPgorICAgICAgICA8bGlzdGl0ZW0+CisJCTxwYXJhPgorICAgU3BlY2lmaWVzIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgZm9yIHRoZSBkb2N1bWVudCwgb3ZlcnJpZGluZworICAgYW55IGRvY3VtZW50IGVuY29kaW5nIGRlY2xhcmF0aW9uLiAgPGNvbW1hbmQ+JmRocGFja2FnZTs8L2NvbW1hbmQ+CisgICBzdXBwb3J0cyBmb3VyIGJ1aWx0LWluIGVuY29kaW5nczoKKyAgIAk8bGl0ZXJhbD5VUy1BU0NJSTwvbGl0ZXJhbD4sCisJPGxpdGVyYWw+VVRGLTg8L2xpdGVyYWw+LAorCTxsaXRlcmFsPlVURi0xNjwvbGl0ZXJhbD4sIGFuZAorCTxsaXRlcmFsPklTTy04ODU5LTE8L2xpdGVyYWw+LgorICAgQWxzbyBzZWUgdGhlIDxvcHRpb24+LXc8L29wdGlvbj4gb3B0aW9uLgorCSAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICA8dGVybT48b3B0aW9uPi1tPC9vcHRpb24+PC90ZXJtPgorICAgICAgICA8bGlzdGl0ZW0+CisJCTxwYXJhPgorICBPdXRwdXRzIHNvbWUgc3RyYW5nZSBzb3J0IG9mIFhNTCBmaWxlIHRoYXQgY29tcGxldGVseQorICBkZXNjcmliZXMgdGhlIHRoZSBpbnB1dCBmaWxlLCBpbmNsdWRpbmcgY2hhcmFjdGVyIHBvc3RpdGlvbnMuCisgIFJlcXVpcmVzIDxvcHRpb24+LWQ8L29wdGlvbj4gdG8gc3BlY2lmeSBhbiBvdXRwdXQgZmlsZS4KKwkgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgPHRlcm0+PG9wdGlvbj4tbjwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgPGxpc3RpdGVtPgorCQk8cGFyYT4KKyAgVHVybnMgb24gbmFtZXNwYWNlIHByb2Nlc3NpbmcuICAoZGVzY3JpYmUgbmFtZXNwYWNlcykKKyAgPG9wdGlvbj4tYzwvb3B0aW9uPiBkaXNhYmxlcyBuYW1lc3BhY2VzLgorCSAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICA8dGVybT48b3B0aW9uPi1wPC9vcHRpb24+PC90ZXJtPgorICAgICAgICA8bGlzdGl0ZW0+CisJCTxwYXJhPgorICAgIFRlbGxzIHhtbHdmIHRvIHByb2Nlc3MgZXh0ZXJuYWwgRFREcyBhbmQgcGFyYW1ldGVyCisgICAgZW50aXRpZXMuCisJIDwvcGFyYT4KKwkgPHBhcmE+CisgICBOb3JtYWxseSA8Y29tbWFuZD4mZGhwYWNrYWdlOzwvY29tbWFuZD4gbmV2ZXIgcGFyc2VzIHBhcmFtZXRlcgorICAgZW50aXRpZXMuICA8b3B0aW9uPi1wPC9vcHRpb24+IHRlbGxzIGl0IHRvIGFsd2F5cyBwYXJzZSB0aGVtLgorICAgPG9wdGlvbj4tcDwvb3B0aW9uPiBpbXBsaWVzIDxvcHRpb24+LXg8L29wdGlvbj4uCisJICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgIDx0ZXJtPjxvcHRpb24+LXI8L29wdGlvbj48L3Rlcm0+CisgICAgICAgIDxsaXN0aXRlbT4KKwkJPHBhcmE+CisgICBOb3JtYWxseSA8Y29tbWFuZD4mZGhwYWNrYWdlOzwvY29tbWFuZD4gbWVtb3J5LW1hcHMgdGhlIFhNTCBmaWxlCisgICBiZWZvcmUgcGFyc2luZzsgdGhpcyBjYW4gcmVzdWx0IGluIGZhc3RlciBwYXJzaW5nIG9uIG1hbnkKKyAgIHBsYXRmb3Jtcy4KKyAgIDxvcHRpb24+LXI8L29wdGlvbj4gdHVybnMgb2ZmIG1lbW9yeS1tYXBwaW5nIGFuZCB1c2VzIG5vcm1hbCBmaWxlCisgICBJTyBjYWxscyBpbnN0ZWFkLgorICAgT2YgY291cnNlLCBtZW1vcnktbWFwcGluZyBpcyBhdXRvbWF0aWNhbGx5IHR1cm5lZCBvZmYKKyAgIHdoZW4gcmVhZGluZyBmcm9tIHN0YW5kYXJkIGlucHV0LgorCSAgIDwvcGFyYT4KKwkJPHBhcmE+CisgICBVc2Ugb2YgbWVtb3J5LW1hcHBpbmcgY2FuIGNhdXNlIHNvbWUgcGxhdGZvcm1zIHRvIHJlcG9ydAorICAgc3Vic3RhbnRpYWxseSBoaWdoZXIgbWVtb3J5IHVzYWdlIGZvcgorICAgPGNvbW1hbmQ+JmRocGFja2FnZTs8L2NvbW1hbmQ+LCBidXQgdGhpcyBhcHBlYXJzIHRvIGJlIGEgbWF0dGVyIG9mCisgICB0aGUgb3BlcmF0aW5nIHN5c3RlbSByZXBvcnRpbmcgbWVtb3J5IGluIGEgc3RyYW5nZSB3YXk7IHRoZXJlIGlzCisgICBub3QgYSBsZWFrIGluIDxjb21tYW5kPiZkaHBhY2thZ2U7PC9jb21tYW5kPi4KKyAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgIDx0ZXJtPjxvcHRpb24+LXM8L29wdGlvbj48L3Rlcm0+CisgICAgICAgIDxsaXN0aXRlbT4KKwkJPHBhcmE+CisgIFByaW50cyBhbiBlcnJvciBpZiB0aGUgZG9jdW1lbnQgaXMgbm90IHN0YW5kYWxvbmUuIAorICBBIGRvY3VtZW50IGlzIHN0YW5kYWxvbmUgaWYgaXQgaGFzIG5vIGV4dGVybmFsIHN1YnNldCBhbmQgbm8KKyAgcmVmZXJlbmNlcyB0byBwYXJhbWV0ZXIgZW50aXRpZXMuCisJICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgIDx0ZXJtPjxvcHRpb24+LXQ8L29wdGlvbj48L3Rlcm0+CisgICAgICAgIDxsaXN0aXRlbT4KKwkJPHBhcmE+CisgIFR1cm5zIG9uIHRpbWluZ3MuICBUaGlzIHRlbGxzIEV4cGF0IHRvIHBhcnNlIHRoZSBlbnRpcmUgZmlsZSwKKyAgYnV0IG5vdCBwZXJmb3JtIGFueSBwcm9jZXNzaW5nLgorICBUaGlzIGdpdmVzIGEgZmFpcmx5IGFjY3VyYXRlIGlkZWEgb2YgdGhlIHJhdyBzcGVlZCBvZiBFeHBhdCBpdHNlbGYKKyAgd2l0aG91dCBjbGllbnQgb3ZlcmhlYWQuCisgIDxvcHRpb24+LXQ8L29wdGlvbj4gdHVybnMgb2ZmIG1vc3Qgb2YgdGhlIG91dHB1dCBvcHRpb25zCisgICg8b3B0aW9uPi1kPC9vcHRpb24+LCA8b3B0aW9uPi1tPC9vcHRpb24+LCA8b3B0aW9uPi1jPC9vcHRpb24+LAorICAuLi4pLgorCSAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICA8dGVybT48b3B0aW9uPi12PC9vcHRpb24+PC90ZXJtPgorICAgICAgICA8bGlzdGl0ZW0+CisJCTxwYXJhPgorICBQcmludHMgdGhlIHZlcnNpb24gb2YgdGhlIEV4cGF0IGxpYnJhcnkgYmVpbmcgdXNlZCwgaW5jbHVkaW5nIHNvbWUKKyAgaW5mb3JtYXRpb24gb24gdGhlIGNvbXBpbGUtdGltZSBjb25maWd1cmF0aW9uIG9mIHRoZSBsaWJyYXJ5LCBhbmQKKyAgdGhlbiBleGl0cy4KKwkgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgPHRlcm0+PG9wdGlvbj4tdzwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgPGxpc3RpdGVtPgorCQk8cGFyYT4KKyAgRW5hYmxlcyBzdXBwb3J0IGZvciBXaW5kb3dzIGNvZGUgcGFnZXMuCisgIE5vcm1hbGx5LCA8Y29tbWFuZD4mZGhwYWNrYWdlOzwvY29tbWFuZD4gd2lsbCB0aHJvdyBhbiBlcnJvciBpZiBpdAorICBydW5zIGFjcm9zcyBhbiBlbmNvZGluZyB0aGF0IGl0IGlzIG5vdCBlcXVpcHBlZCB0byBoYW5kbGUgaXRzZWxmLiAgV2l0aAorICA8b3B0aW9uPi13PC9vcHRpb24+LCAmZGhwYWNrYWdlOyB3aWxsIHRyeSB0byB1c2UgYSBXaW5kb3dzIGNvZGUKKyAgcGFnZS4gIFNlZSBhbHNvIDxvcHRpb24+LWU8L29wdGlvbj4uCisJICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgIDx0ZXJtPjxvcHRpb24+LXg8L29wdGlvbj48L3Rlcm0+CisgICAgICAgIDxsaXN0aXRlbT4KKwkJPHBhcmE+CisgIFR1cm5zIG9uIHBhcnNpbmcgZXh0ZXJuYWwgZW50aXRpZXMuCisgIDwvcGFyYT4KKzxwYXJhPgorICBOb24tdmFsaWRhdGluZyBwYXJzZXJzIGFyZSBub3QgcmVxdWlyZWQgdG8gcmVzb2x2ZSBleHRlcm5hbAorICBlbnRpdGllcywgb3IgZXZlbiBleHBhbmQgZW50aXRpZXMgYXQgYWxsLgorICBFeHBhdCBhbHdheXMgZXhwYW5kcyBpbnRlcm5hbCBlbnRpdGllcyAoPyksCisgIGJ1dCBleHRlcm5hbCBlbnRpdHkgcGFyc2luZyBtdXN0IGJlIGVuYWJsZWQgZXhwbGljaXRseS4KKyAgPC9wYXJhPgorICA8cGFyYT4KKyAgRXh0ZXJuYWwgZW50aXRpZXMgYXJlIHNpbXBseSBlbnRpdGllcyB0aGF0IG9idGFpbiB0aGVpcgorICBkYXRhIGZyb20gb3V0c2lkZSB0aGUgWE1MIGZpbGUgY3VycmVudGx5IGJlaW5nIHBhcnNlZC4KKyAgPC9wYXJhPgorICA8cGFyYT4KKyAgVGhpcyBpcyBhbiBleGFtcGxlIG9mIGFuIGludGVybmFsIGVudGl0eToKKzxsaXRlcmFsbGF5b3V0PgorJmx0OyFFTlRJVFkgdmVycyAnMS4wLjInJmd0OworPC9saXRlcmFsbGF5b3V0PgorICA8L3BhcmE+CisgIDxwYXJhPgorICBBbmQgaGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiBleHRlcm5hbCBlbnRpdGllczoKKworPGxpdGVyYWxsYXlvdXQ+CismbHQ7IUVOVElUWSBoZWFkZXIgU1lTVEVNICJoZWFkZXItJmFtcDt2ZXJzOy54bWwiJmd0OyAgKHBhcnNlZCkKKyZsdDshRU5USVRZIGxvZ28gU1lTVEVNICJsb2dvLnBuZyIgUE5HJmd0OyAgICAgICAgICh1bnBhcnNlZCkKKzwvbGl0ZXJhbGxheW91dD4KKworCSAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICA8dGVybT48b3B0aW9uPi0tPC9vcHRpb24+PC90ZXJtPgorICAgICAgICA8bGlzdGl0ZW0+CisJCTxwYXJhPgorICAgIChUd28gaHlwaGVucy4pCisgICAgVGVybWluYXRlcyB0aGUgbGlzdCBvZiBvcHRpb25zLiAgVGhpcyBpcyBvbmx5IG5lZWRlZCBpZiBhIGZpbGVuYW1lCisgICAgc3RhcnRzIHdpdGggYSBoeXBoZW4uICBGb3IgZXhhbXBsZToKKwkgICA8L3BhcmE+Cis8bGl0ZXJhbGxheW91dD4KKyZkaHBhY2thZ2U7IC0tIC1teWZpbGUueG1sCis8L2xpdGVyYWxsYXlvdXQ+CisJCTxwYXJhPgorICAgIHdpbGwgcnVuIDxjb21tYW5kPiZkaHBhY2thZ2U7PC9jb21tYW5kPiBvbiB0aGUgZmlsZQorICAgIDxmaWxlbmFtZT4tbXlmaWxlLnhtbDwvZmlsZW5hbWU+LgorCSAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgIDwvdmFyaWFibGVsaXN0PgorCisJPHBhcmE+CisgICAgT2xkZXIgdmVyc2lvbnMgb2YgPGNvbW1hbmQ+JmRocGFja2FnZTs8L2NvbW1hbmQ+IGRvIG5vdCBzdXBwb3J0CisgICAgcmVhZGluZyBmcm9tIHN0YW5kYXJkIGlucHV0LgorCTwvcGFyYT4KKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDE+CisgIDx0aXRsZT5PVVRQVVQ8L3RpdGxlPgorICAgIDxwYXJhPgorCUlmIGFuIGlucHV0IGZpbGUgaXMgbm90IHdlbGwtZm9ybWVkLAorCTxjb21tYW5kPiZkaHBhY2thZ2U7PC9jb21tYW5kPiBwcmludHMgYSBzaW5nbGUgbGluZSBkZXNjcmliaW5nCisJdGhlIHByb2JsZW0gdG8gc3RhbmRhcmQgb3V0cHV0LiAgSWYgYSBmaWxlIGlzIHdlbGwgZm9ybWVkLAorCTxjb21tYW5kPiZkaHBhY2thZ2U7PC9jb21tYW5kPiBvdXRwdXRzIG5vdGhpbmcuCisJTm90ZSB0aGF0IHRoZSByZXN1bHQgY29kZSBpcyA8ZW1waGFzaXM+bm90PC9lbXBoYXNpcz4gc2V0LgorCTwvcGFyYT4KKyAgPC9yZWZzZWN0MT4KKyAgCisgIDxyZWZzZWN0MT4KKyAgICA8dGl0bGU+QlVHUzwvdGl0bGU+CisJPHBhcmE+CisJQWNjb3JkaW5nIHRvIHRoZSBXM0Mgc3RhbmRhcmQsIGFuIFhNTCBmaWxlIHdpdGhvdXQgYQorCWRlY2xhcmF0aW9uIGF0IHRoZSBiZWdpbm5pbmcgaXMgbm90IGNvbnNpZGVyZWQgd2VsbC1mb3JtZWQuCisJSG93ZXZlciwgPGNvbW1hbmQ+JmRocGFja2FnZTs8L2NvbW1hbmQ+IGFsbG93cyB0aGlzIHRvIHBhc3MuCisJPC9wYXJhPgorCTxwYXJhPgorCTxjb21tYW5kPiZkaHBhY2thZ2U7PC9jb21tYW5kPiByZXR1cm5zIGEgMCAtIG5vZXJyIHJlc3VsdCwKKwlldmVuIGlmIHRoZSBmaWxlIGlzIG5vdCB3ZWxsLWZvcm1lZC4gIFRoZXJlIGlzIG5vIGdvb2Qgd2F5IGZvcgorCWEgcHJvZ3JhbSB0byB1c2UgPGNvbW1hbmQ+JmRocGFja2FnZTs8L2NvbW1hbmQ+IHRvIHF1aWNrbHkKKwljaGVjayBhIGZpbGUgLS0gaXQgbXVzdCBwYXJzZSA8Y29tbWFuZD4mZGhwYWNrYWdlOzwvY29tbWFuZD4ncworCXN0YW5kYXJkIG91dHB1dC4KKwk8L3BhcmE+CisJPHBhcmE+CisJVGhlIGVycm9ycyBzaG91bGQgZ28gdG8gc3RhbmRhcmQgZXJyb3IsIG5vdCBzdGFuZGFyZCBvdXRwdXQuCisJPC9wYXJhPgorCTxwYXJhPgorCVRoZXJlIHNob3VsZCBiZSBhIHdheSB0byBnZXQgPG9wdGlvbj4tZDwvb3B0aW9uPiB0byBzZW5kIGl0cworCW91dHB1dCB0byBzdGFuZGFyZCBvdXRwdXQgcmF0aGVyIHRoYW4gZm9yY2luZyB0aGUgdXNlciB0byBzZW5kCisJaXQgdG8gYSBmaWxlLgorCTwvcGFyYT4KKwk8cGFyYT4KKwlJIGhhdmUgbm8gaWRlYSB3aHkgYW55b25lIHdvdWxkIHdhbnQgdG8gdXNlIHRoZQorCTxvcHRpb24+LWQ8L29wdGlvbj4sIDxvcHRpb24+LWM8L29wdGlvbj4sIGFuZAorCTxvcHRpb24+LW08L29wdGlvbj4gb3B0aW9ucy4gIElmIHNvbWVvbmUgY291bGQgZXhwbGFpbiBpdCB0bworCW1lLCBJJ2QgbGlrZSB0byBhZGQgdGhpcyBpbmZvcm1hdGlvbiB0byB0aGlzIG1hbnBhZ2UuCisJPC9wYXJhPgorICA8L3JlZnNlY3QxPgorCisgIDxyZWZzZWN0MT4KKyAgICA8dGl0bGU+QUxURVJOQVRJVkVTPC90aXRsZT4KKwk8cGFyYT4KKwkgIEhlcmUgYXJlIHNvbWUgWE1MIHZhbGlkYXRvcnMgb24gdGhlIHdlYjoKKworPGxpdGVyYWxsYXlvdXQ+CitodHRwOi8vd3d3LmhjcmMuZWQuYWMudWsvfnJpY2hhcmQveG1sLWNoZWNrLmh0bWwKK2h0dHA6Ly93d3cuc3RnLmJyb3duLmVkdS9zZXJ2aWNlL3htbHZhbGlkLworaHR0cDovL3d3dy5zY3JpcHRpbmcuY29tL2Zyb250aWVyNS94bWwvY29kZS94bWxWYWxpZGF0b3IuaHRtbAoraHR0cDovL3d3dy54bWwuY29tL3B1Yi9hL3Rvb2xzL3J1d2YvY2hlY2suaHRtbAorPC9saXRlcmFsbGF5b3V0PgorCisJCSA8L3BhcmE+CisgIDwvcmVmc2VjdDE+CisKKyAgPHJlZnNlY3QxPgorICAgIDx0aXRsZT5TRUUgQUxTTzwvdGl0bGU+CisJPHBhcmE+CisKKzxsaXRlcmFsbGF5b3V0PgorVGhlIEV4cGF0IGhvbWUgcGFnZTogICAgICAgIGh0dHA6Ly93d3cubGliZXhwYXQub3JnLworVGhlIFczIFhNTCBzcGVjaWZpY2F0aW9uOiAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwKKzwvbGl0ZXJhbGxheW91dD4KKworCTwvcGFyYT4KKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPkFVVEhPUjwvdGl0bGU+CisgICAgPHBhcmE+CisJICBUaGlzIG1hbnVhbCBwYWdlIHdhcyB3cml0dGVuIGJ5ICZkaHVzZXJuYW1lOyAmZGhlbWFpbDsgZm9yCisgICAgICB0aGUgJmRlYmlhbjsgc3lzdGVtIChidXQgbWF5IGJlIHVzZWQgYnkgb3RoZXJzKS4gIFBlcm1pc3Npb24gaXMKKyAgICAgIGdyYW50ZWQgdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoaXMgZG9jdW1lbnQgdW5kZXIKKyAgICAgIHRoZSB0ZXJtcyBvZiB0aGUgPGFjcm9ueW0+R05VPC9hY3JvbnltPiBGcmVlIERvY3VtZW50YXRpb24KKyAgICAgIExpY2Vuc2UsIFZlcnNpb24gMS4xLgorCTwvcGFyYT4KKyAgPC9yZWZzZWN0MT4KKzwvcmVmZW50cnk+CisKKzwhLS0gS2VlcCB0aGlzIGNvbW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZQorTG9jYWwgdmFyaWFibGVzOgorbW9kZTogc2dtbAorc2dtbC1vbWl0dGFnOnQKK3NnbWwtc2hvcnR0YWc6dAorc2dtbC1taW5pbWl6ZS1hdHRyaWJ1dGVzOm5pbAorc2dtbC1hbHdheXMtcXVvdGUtYXR0cmlidXRlczp0CitzZ21sLWluZGVudC1zdGVwOjIKK3NnbWwtaW5kZW50LWRhdGE6dAorc2dtbC1wYXJlbnQtZG9jdW1lbnQ6bmlsCitzZ21sLWRlZmF1bHQtZHRkLWZpbGU6bmlsCitzZ21sLWV4cG9zZWQtdGFnczpuaWwKK3NnbWwtbG9jYWwtY2F0YWxvZ3M6bmlsCitzZ21sLWxvY2FsLWVjYXQtZmlsZXM6bmlsCitFbmQ6CistLT4KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2V4YW1wbGVzL2VsZW1lbnRzLmMgYi9leHBhdC0yLjAuMS9leGFtcGxlcy9lbGVtZW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOGY4NTUKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9leGFtcGxlcy9lbGVtZW50cy5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qIFRoaXMgaXMgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgaG93IHRvIHVzZSBleHBhdC4gVGhpcyBwcm9ncmFtCisgICByZWFkcyBhbiBYTUwgZG9jdW1lbnQgZnJvbSBzdGFuZGFyZCBpbnB1dCBhbmQgd3JpdGVzIGEgbGluZSB3aXRoCisgICB0aGUgbmFtZSBvZiBlYWNoIGVsZW1lbnQgdG8gc3RhbmRhcmQgb3V0cHV0IGluZGVudGluZyBjaGlsZAorICAgZWxlbWVudHMgYnkgb25lIHRhYiBzdG9wIG1vcmUgdGhhbiB0aGVpciBwYXJlbnQgZWxlbWVudC4KKyAgIEl0IG11c3QgYmUgdXNlZCB3aXRoIEV4cGF0IGNvbXBpbGVkIGZvciBVVEYtOCBvdXRwdXQuCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJleHBhdC5oIgorCisjaWYgZGVmaW5lZChfX2FtaWdhb3NfXykgJiYgZGVmaW5lZChfX1VTRV9JTkxJTkVfXykKKyNpbmNsdWRlIDxwcm90by9leHBhdC5oPgorI2VuZGlmCisKKyNpZmRlZiBYTUxfTEFSR0VfU0laRQorI2lmIGRlZmluZWQoWE1MX1VTRV9NU0NfRVhURU5TSU9OUykgJiYgX01TQ19WRVIgPCAxNDAwCisjZGVmaW5lIFhNTF9GTVRfSU5UX01PRCAiSTY0IgorI2Vsc2UKKyNkZWZpbmUgWE1MX0ZNVF9JTlRfTU9EICJsbCIKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgWE1MX0ZNVF9JTlRfTU9EICJsIgorI2VuZGlmCisKK3N0YXRpYyB2b2lkIFhNTENBTEwKK3N0YXJ0RWxlbWVudCh2b2lkICp1c2VyRGF0YSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHMpCit7CisgIGludCBpOworICBpbnQgKmRlcHRoUHRyID0gKGludCAqKXVzZXJEYXRhOworICBmb3IgKGkgPSAwOyBpIDwgKmRlcHRoUHRyOyBpKyspCisgICAgcHV0Y2hhcignXHQnKTsKKyAgcHV0cyhuYW1lKTsKKyAgKmRlcHRoUHRyICs9IDE7Cit9CisKK3N0YXRpYyB2b2lkIFhNTENBTEwKK2VuZEVsZW1lbnQodm9pZCAqdXNlckRhdGEsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIGludCAqZGVwdGhQdHIgPSAoaW50ICopdXNlckRhdGE7CisgICpkZXB0aFB0ciAtPSAxOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgY2hhciBidWZbQlVGU0laXTsKKyAgWE1MX1BhcnNlciBwYXJzZXIgPSBYTUxfUGFyc2VyQ3JlYXRlKE5VTEwpOworICBpbnQgZG9uZTsKKyAgaW50IGRlcHRoID0gMDsKKyAgWE1MX1NldFVzZXJEYXRhKHBhcnNlciwgJmRlcHRoKTsKKyAgWE1MX1NldEVsZW1lbnRIYW5kbGVyKHBhcnNlciwgc3RhcnRFbGVtZW50LCBlbmRFbGVtZW50KTsKKyAgZG8geworICAgIGludCBsZW4gPSAoaW50KWZyZWFkKGJ1ZiwgMSwgc2l6ZW9mKGJ1ZiksIHN0ZGluKTsKKyAgICBkb25lID0gbGVuIDwgc2l6ZW9mKGJ1Zik7CisgICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIGJ1ZiwgbGVuLCBkb25lKSA9PSBYTUxfU1RBVFVTX0VSUk9SKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgIiVzIGF0IGxpbmUgJSIgWE1MX0ZNVF9JTlRfTU9EICJ1XG4iLAorICAgICAgICAgICAgICBYTUxfRXJyb3JTdHJpbmcoWE1MX0dldEVycm9yQ29kZShwYXJzZXIpKSwKKyAgICAgICAgICAgICAgWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyKHBhcnNlcikpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9IHdoaWxlICghZG9uZSk7CisgIFhNTF9QYXJzZXJGcmVlKHBhcnNlcik7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvZXhhbXBsZXMvZWxlbWVudHMuZHNwIGIvZXhwYXQtMi4wLjEvZXhhbXBsZXMvZWxlbWVudHMuZHNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNmJjMTMKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9leGFtcGxlcy9lbGVtZW50cy5kc3AKQEAgLTAsMCArMSwxMDMgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iZWxlbWVudHMiIC0gUGFja2FnZSBPd25lcj08ND4KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDAKKyMgKiogRE8gTk9UIEVESVQgKioKKworIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgMHgwMTAzCisKK0NGRz1lbGVtZW50cyAtIFdpbjMyIERlYnVnCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgImVsZW1lbnRzLm1hayIuCishTUVTU0FHRSAKKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAiZWxlbWVudHMubWFrIiBDRkc9ImVsZW1lbnRzIC0gV2luMzIgRGVidWciCishTUVTU0FHRSAKKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgorIU1FU1NBR0UgCishTUVTU0FHRSAiZWxlbWVudHMgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgImVsZW1lbnRzIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAKKworIyBCZWdpbiBQcm9qZWN0CisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKK0NQUD1jbC5leGUKK1JTQz1yYy5leGUKKworIUlGICAiJChDRkcpIiA9PSAiZWxlbWVudHMgLSBXaW4zMiBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiLi5cd2luMzJcYmluXFJlbGVhc2UiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cd2luMzJcdG1wXFJlbGVhc2UtZWxlbWVudHMiCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAorIyBQUk9QIFRhcmdldF9EaXIgIiIKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYworIyBBREQgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9JICIuLlxsaWIiIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9EICJYTUxfU1RBVElDIiAvRkQgL2MKKyMgU1VCVFJBQ1QgQ1BQIC9YIC9ZWAorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2CisjIEFERCBMSU5LMzIgb2RiY2NwMzIubGliIGxpYmV4cGF0TVQubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL3BkYjpub25lIC9tYWNoaW5lOkkzODYgL2xpYnBhdGg6Ii4uXHdpbjMyXGJpblxSZWxlYXNlIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiZWxlbWVudHMgLSBXaW4zMiBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgT3V0cHV0X0RpciAiLi5cd2luMzJcYmluXERlYnVnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXHdpbjMyXHRtcFxEZWJ1Zy1lbGVtZW50cyIKKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCisjIFBST1AgVGFyZ2V0X0RpciAiIgorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL0daIC9jCisjIEFERCBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR1ggL1pJIC9PZCAvSSAiLi5cbGliIiAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvRCAiWE1MX1NUQVRJQyIgL0ZSIC9GRCAvR1ogL2MKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAorIyBBREQgTElOSzMyIG9kYmNjcDMyLmxpYiBsaWJleHBhdE1ULmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9wZGI6bm9uZSAvZGVidWcgL21hY2hpbmU6STM4NiAvbGlicGF0aDoiLi5cd2luMzJcYmluXERlYnVnIgorCishRU5ESUYgCisKKyMgQmVnaW4gVGFyZ2V0CisKKyMgTmFtZSAiZWxlbWVudHMgLSBXaW4zMiBSZWxlYXNlIgorIyBOYW1lICJlbGVtZW50cyAtIFdpbjMyIERlYnVnIgorIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgorCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGVsZW1lbnRzLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEVuZCBHcm91cAorIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIgorCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiCisjIEVuZCBHcm91cAorIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiCisKKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIgorIyBFbmQgR3JvdXAKKyMgRW5kIFRhcmdldAorIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvZXhhbXBsZXMvb3V0bGluZS5jIGIvZXhwYXQtMi4wLjEvZXhhbXBsZXMvb3V0bGluZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhM2M4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9leGFtcGxlcy9vdXRsaW5lLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogb3V0bGluZS5jCisgKgorICogQ29weXJpZ2h0IDE5OTksIENsYXJrIENvb3BlcgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBsaWNlbnNlIGNvbnRhaW5lZCBpbiB0aGUKKyAqIENPUFlJTkcgZmlsZSB0aGF0IGNvbWVzIHdpdGggdGhlIGV4cGF0IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogUmVhZCBhbiBYTUwgZG9jdW1lbnQgZnJvbSBzdGFuZGFyZCBpbnB1dCBhbmQgcHJpbnQgYW4gZWxlbWVudAorICogb3V0bGluZSBvbiBzdGFuZGFyZCBvdXRwdXQuCisgKiBNdXN0IGJlIHVzZWQgd2l0aCBFeHBhdCBjb21waWxlZCBmb3IgVVRGLTggb3V0cHV0LgorICovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXhwYXQuaD4KKworI2lmIGRlZmluZWQoX19hbWlnYW9zX18pICYmIGRlZmluZWQoX19VU0VfSU5MSU5FX18pCisjaW5jbHVkZSA8cHJvdG8vZXhwYXQuaD4KKyNlbmRpZgorCisjaWZkZWYgWE1MX0xBUkdFX1NJWkUKKyNpZiBkZWZpbmVkKFhNTF9VU0VfTVNDX0VYVEVOU0lPTlMpICYmIF9NU0NfVkVSIDwgMTQwMAorI2RlZmluZSBYTUxfRk1UX0lOVF9NT0QgIkk2NCIKKyNlbHNlCisjZGVmaW5lIFhNTF9GTVRfSU5UX01PRCAibGwiCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIFhNTF9GTVRfSU5UX01PRCAibCIKKyNlbmRpZgorCisjZGVmaW5lIEJVRkZTSVpFICAgICAgICA4MTkyCisKK2NoYXIgQnVmZltCVUZGU0laRV07CisKK2ludCBEZXB0aDsKKworc3RhdGljIHZvaWQgWE1MQ0FMTAorc3RhcnQodm9pZCAqZGF0YSwgY29uc3QgY2hhciAqZWwsIGNvbnN0IGNoYXIgKiphdHRyKQoreworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgRGVwdGg7IGkrKykKKyAgICBwcmludGYoIiAgIik7CisKKyAgcHJpbnRmKCIlcyIsIGVsKTsKKworICBmb3IgKGkgPSAwOyBhdHRyW2ldOyBpICs9IDIpIHsKKyAgICBwcmludGYoIiAlcz0nJXMnIiwgYXR0cltpXSwgYXR0cltpICsgMV0pOworICB9CisKKyAgcHJpbnRmKCJcbiIpOworICBEZXB0aCsrOworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCitlbmQodm9pZCAqZGF0YSwgY29uc3QgY2hhciAqZWwpCit7CisgIERlcHRoLS07Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBYTUxfUGFyc2VyIHAgPSBYTUxfUGFyc2VyQ3JlYXRlKE5VTEwpOworICBpZiAoISBwKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBhcnNlclxuIik7CisgICAgZXhpdCgtMSk7CisgIH0KKworICBYTUxfU2V0RWxlbWVudEhhbmRsZXIocCwgc3RhcnQsIGVuZCk7CisKKyAgZm9yICg7OykgeworICAgIGludCBkb25lOworICAgIGludCBsZW47CisKKyAgICBsZW4gPSAoaW50KWZyZWFkKEJ1ZmYsIDEsIEJVRkZTSVpFLCBzdGRpbik7CisgICAgaWYgKGZlcnJvcihzdGRpbikpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiUmVhZCBlcnJvclxuIik7CisgICAgICBleGl0KC0xKTsKKyAgICB9CisgICAgZG9uZSA9IGZlb2Yoc3RkaW4pOworCisgICAgaWYgKFhNTF9QYXJzZShwLCBCdWZmLCBsZW4sIGRvbmUpID09IFhNTF9TVEFUVVNfRVJST1IpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiUGFyc2UgZXJyb3IgYXQgbGluZSAlIiBYTUxfRk1UX0lOVF9NT0QgInU6XG4lc1xuIiwKKyAgICAgICAgICAgICAgWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyKHApLAorICAgICAgICAgICAgICBYTUxfRXJyb3JTdHJpbmcoWE1MX0dldEVycm9yQ29kZShwKSkpOworICAgICAgZXhpdCgtMSk7CisgICAgfQorCisgICAgaWYgKGRvbmUpCisgICAgICBicmVhazsKKyAgfQorICBYTUxfUGFyc2VyRnJlZShwKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9leGFtcGxlcy9vdXRsaW5lLmRzcCBiL2V4cGF0LTIuMC4xL2V4YW1wbGVzL291dGxpbmUuZHNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNTZjZTkKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9leGFtcGxlcy9vdXRsaW5lLmRzcApAQCAtMCwwICsxLDEwMyBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJvdXRsaW5lIiAtIFBhY2thZ2UgT3duZXI9PDQ+CisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwCisjICoqIERPIE5PVCBFRElUICoqCisKKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMworCitDRkc9b3V0bGluZSAtIFdpbjMyIERlYnVnCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgIm91dGxpbmUubWFrIi4KKyFNRVNTQUdFIAorIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6CishTUVTU0FHRSAKKyFNRVNTQUdFIE5NQUtFIC9mICJvdXRsaW5lLm1hayIgQ0ZHPSJvdXRsaW5lIC0gV2luMzIgRGVidWciCishTUVTU0FHRSAKKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgorIU1FU1NBR0UgCishTUVTU0FHRSAib3V0bGluZSAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAib3V0bGluZSAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgCisKKyMgQmVnaW4gUHJvamVjdAorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDAKKyMgUFJPUCBTY2NfUHJvak5hbWUgIiIKKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCitDUFA9Y2wuZXhlCitSU0M9cmMuZXhlCisKKyFJRiAgIiQoQ0ZHKSIgPT0gIm91dGxpbmUgLSBXaW4zMiBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiLi5cd2luMzJcYmluXFJlbGVhc2UiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cd2luMzJcdG1wXFJlbGVhc2Utb3V0bGluZSIKKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCisjIFBST1AgVGFyZ2V0X0RpciAiIgorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jCisjIEFERCBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzIgL0kgIi4uXGxpYiIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL0ZEIC9jCisjIFNVQlRSQUNUIENQUCAvWCAvWVgKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9wZGI6bm9uZSAvbWFjaGluZTpJMzg2CisKKyFFTFNFSUYgICIkKENGRykiID09ICJvdXRsaW5lIC0gV2luMzIgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXHdpbjMyXGJpblxEZWJ1ZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlx3aW4zMlx0bXBcRGVidWctb3V0bGluZSIKKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCisjIFBST1AgVGFyZ2V0X0RpciAiIgorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL0daIC9jCisjIEFERCBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR20gL0dYIC9aSSAvT2QgL0kgIi4uXGxpYiIgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL0ZEIC9HWiAvYworIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0CisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL3BkYjpub25lIC9kZWJ1ZyAvbWFjaGluZTpJMzg2CisKKyFFTkRJRiAKKworIyBCZWdpbiBUYXJnZXQKKworIyBOYW1lICJvdXRsaW5lIC0gV2luMzIgUmVsZWFzZSIKKyMgTmFtZSAib3V0bGluZSAtIFdpbjMyIERlYnVnIgorIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgorCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXG91dGxpbmUuYworIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIEdyb3VwCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiCisKKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubCIKKyMgRW5kIEdyb3VwCisjIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyIKKworIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiCisjIEVuZCBHcm91cAorIyBFbmQgVGFyZ2V0CisjIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9leHBhdC5kc3cgYi9leHBhdC0yLjAuMS9leHBhdC5kc3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ2MmVlYwotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2V4cGF0LmRzdwpAQCAtMCwwICsxLDExMCBAQAorTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gV29ya3NwYWNlIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDAKKyMgV0FSTklORzogRE8gTk9UIEVESVQgT1IgREVMRVRFIFRISVMgV09SS1NQQUNFIEZJTEUhCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworUHJvamVjdDogImVsZW1lbnRzIj0uXGV4YW1wbGVzXGVsZW1lbnRzLmRzcCAtIFBhY2thZ2UgT3duZXI9PDQ+CisKK1BhY2thZ2U9PDU+Cit7e3sKK319fQorCitQYWNrYWdlPTw0Pgore3t7CisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5CisgICAgUHJvamVjdF9EZXBfTmFtZSBleHBhdF9zdGF0aWMKKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5Cit9fX0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitQcm9qZWN0OiAiZXhwYXQiPS5cbGliXGV4cGF0LmRzcCAtIFBhY2thZ2UgT3duZXI9PDQ+CisKK1BhY2thZ2U9PDU+Cit7e3sKK319fQorCitQYWNrYWdlPTw0Pgore3t7Cit9fX0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitQcm9qZWN0OiAiZXhwYXRfc3RhdGljIj0uXGxpYlxleHBhdF9zdGF0aWMuZHNwIC0gUGFja2FnZSBPd25lcj08ND4KKworUGFja2FnZT08NT4KK3t7eworfX19CisKK1BhY2thZ2U9PDQ+Cit7e3sKK319fQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK1Byb2plY3Q6ICJleHBhdHciPS5cbGliXGV4cGF0dy5kc3AgLSBQYWNrYWdlIE93bmVyPTw0PgorCitQYWNrYWdlPTw1Pgore3t7Cit9fX0KKworUGFja2FnZT08ND4KK3t7eworfX19CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworUHJvamVjdDogImV4cGF0d19zdGF0aWMiPS5cbGliXGV4cGF0d19zdGF0aWMuZHNwIC0gUGFja2FnZSBPd25lcj08ND4KKworUGFja2FnZT08NT4KK3t7eworfX19CisKK1BhY2thZ2U9PDQ+Cit7e3sKK319fQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK1Byb2plY3Q6ICJvdXRsaW5lIj0uXGV4YW1wbGVzXG91dGxpbmUuZHNwIC0gUGFja2FnZSBPd25lcj08ND4KKworUGFja2FnZT08NT4KK3t7eworfX19CisKK1BhY2thZ2U9PDQ+Cit7e3sKKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kKKyAgICBQcm9qZWN0X0RlcF9OYW1lIGV4cGF0CisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQorfX19CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworUHJvamVjdDogInhtbHdmIj0uXHhtbHdmXHhtbHdmLmRzcCAtIFBhY2thZ2UgT3duZXI9PDQ+CisKK1BhY2thZ2U9PDU+Cit7e3sKK319fQorCitQYWNrYWdlPTw0Pgore3t7CisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5CisgICAgUHJvamVjdF9EZXBfTmFtZSBleHBhdAorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kKK319fQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0dsb2JhbDoKKworUGFja2FnZT08NT4KK3t7eworfX19CisKK1BhY2thZ2U9PDM+Cit7e3sKK319fQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2V4cGF0X2NvbmZpZy5oLmluIGIvZXhwYXQtMi4wLjEvZXhwYXRfY29uZmlnLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMzNjk4YQotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2V4cGF0X2NvbmZpZy5oLmluCkBAIC0wLDAgKzEsOTIgQEAKKy8qIGV4cGF0X2NvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLworCisvKiAxMjM0ID0gTElMX0VORElBTiwgNDMyMSA9IEJJR0VORElBTiAqLworI3VuZGVmIEJZVEVPUkRFUgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGJjb3B5JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0JDT1BZCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZGxmY24uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9ETEZDTl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9GQ05UTF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cGFnZXNpemUnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0lOVFRZUEVTX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtZW1tb3ZlJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX01FTU1PVkUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9NRU1PUllfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAqLworI3VuZGVmIEhBVkVfTU1BUAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NURElOVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RETElCX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RSSU5HU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RSSU5HX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19TVEFUX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfVFlQRVNfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1VOSVNURF9ICisKKy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLworI3VuZGVmIFBBQ0tBR0VfQlVHUkVQT1JUCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX05BTUUKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfU1RSSU5HCisKKy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX1RBUk5BTUUKKworLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX1ZFUlNJT04KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCisjdW5kZWYgU1REQ19IRUFERVJTCisKKy8qIHdoZXRoZXIgYnl0ZW9yZGVyIGlzIGJpZ2VuZGlhbiAqLworI3VuZGVmIFdPUkRTX0JJR0VORElBTgorCisvKiBEZWZpbmUgdG8gc3BlY2lmeSBob3cgbXVjaCBjb250ZXh0IHRvIHJldGFpbiBhcm91bmQgdGhlIGN1cnJlbnQgcGFyc2UKKyAgIHBvaW50LiAqLworI3VuZGVmIFhNTF9DT05URVhUX0JZVEVTCisKKy8qIERlZmluZSB0byBtYWtlIHBhcmFtZXRlciBlbnRpdHkgcGFyc2luZyBmdW5jdGlvbmFsaXR5IGF2YWlsYWJsZS4gKi8KKyN1bmRlZiBYTUxfRFRECisKKy8qIERlZmluZSB0byBtYWtlIFhNTCBOYW1lc3BhY2VzIGZ1bmN0aW9uYWxpdHkgYXZhaWxhYmxlLiAqLworI3VuZGVmIFhNTF9OUworCisvKiBEZWZpbmUgdG8gX19GVU5DVElPTl9fIG9yICIiIGlmIGBfX2Z1bmNfXycgZG9lcyBub3QgY29uZm9ybSB0byBBTlNJIEMuICovCisjdW5kZWYgX19mdW5jX18KKworLyogRGVmaW5lIHRvIGVtcHR5IGlmIGBjb25zdCcgZG9lcyBub3QgY29uZm9ybSB0byBBTlNJIEMuICovCisjdW5kZWYgY29uc3QKKworLyogRGVmaW5lIHRvIGBsb25nJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8KKyN1bmRlZiBvZmZfdAorCisvKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8KKyN1bmRlZiBzaXplX3QKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2xpYi9NYWtlZmlsZS5NUFcgYi9leHBhdC0yLjAuMS9saWIvTWFrZWZpbGUuTVBXCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NmFmMDAKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9saWIvTWFrZWZpbGUuTVBXCkBAIC0wLDAgKzEsMjA2IEBACisjICAgRmlsZTogICAgICAgTWFrZWZpbGUuTVBXCisjICAgVGFyZ2V0czogICAgQWxsLCBEeW5hbWljLCBTdGF0aWMgKGFuZCBDbGVhbiwgQ2xlYW4tQWxsKQorIyAgIENyZWF0ZWQ6ICAgIFR1ZXNkYXksIEp1bHkgMDIsIDIwMDIKKyMKKyMgICBNUFcgTWFrZWZpbGUgZm9yIGJ1aWxkaW5nIGV4cGF0IHVuZGVyIHRoZSAiY2xhc3NpYyIgKGkuZS4gcHJlLVgpIE1hYyBPUworIyAgIENvcHlyaWdodCCpIDIwMDIgRGFyeWxlIFdhbGtlcgorIyAgIFBvcnRpb25zIENvcHlyaWdodCCpIDIwMDIgVGhvbWFzIFdlZ25lcgorIyAgIFNlZSB0aGUgQ09QWUlORyBmaWxlIGZvciBkaXN0cmlidXRpb24gaW5mb3JtYXRpb24KKyMKKyMgICBEZXNjcmlwdGlvbjogCisjICAgVGhpcyBNYWtlZmlsZSBsZXRzIHlvdSBidWlsZCBzdGF0aWMsIGR5bmFtaWMgKGkuZS4gc2hhcmVkKSBhbmQgc3R1YiAKKyMgICB2ZXJzaW9ucyBvZiB0aGUgZXhwYXQgbGlicmFyeSBhcyB3ZWxsIGFzIHRoZSBlbGVtZW50cy5jIGFuZCBvdXRsaW5lLmMgCisjICAgZXhhbXBsZXMgKGJ1aWx0IGFzIHRvb2xzIGZvciBNUFcpLiBUaGlzIGlzIGZvciBQUEMgb25seTsgaXQgc2hvdWxkIGJlIAorIyAgIG5vIHByb2JsZW0gdG8gYnVpbGQgYSA2OEsgdmVyc2lvbiBvZiB0aGUgZXhwYXQgbGlicmFyeSwgdGhvdWdoLgorIworIyAJVXNhZ2U6IAorIwkJCSAgICAgICBCdWlsZHByb2dyYW0gQWxsCisjCQkJIG9yICAgIEJ1aWxkcHJvZ3JhbSBEeW5hbWljCisjCQkJIG9yICAgIEJ1aWxkcHJvZ3JhbSBTdGF0aWMKKyMKKyMgICBOb3RlOiBZb3UgZmlyc3QgaGF2ZSB0byByZW5hbWUgdGhpcyBmaWxlIHRvICJNYWtlZmlsZSIsIG9yIHRoZSBCdWlsZHByb2dyYW0gCisjICAgICAgICAgY29tbWFuZG8gd2lsbCBub3QgcmVjb2duaXplIGl0LgorIworCitNQUtFRklMRSAgICAgICAgPSBNYWtlZmlsZQorpU1vbmRvQnVpbGSlICAgID0ge01BS0VGSUxFfSAgIyBNYWtlIGJsYW5rIHRvIGF2b2lkIHJlYnVpbGRzIHdoZW4gbWFrZWZpbGUgaXMgbW9kaWZpZWQKKworT2JqRGlyICAgICAgICAgID0gOgorU3JjRGlyICAgICAgICAgID0gOgorSGRyRGlyICAgICAgICAgID0gOgorCitUb29sRGlyICAgICAgICAgPSA6OmV4YW1wbGVzOgorCitJbmNsdWRlcyAgICAgICAgPSAtaSB7SGRyRGlyfQorCitTeW0tUFBDICAgICAgICAgPSAtc3ltIG9mZgorCitEZWZpbmVzICAgICAgICAgPSAtZCBNQUNPU19DTEFTU0lDCisKK1BQQ0NPcHRpb25zICAgICA9IHtJbmNsdWRlc30ge1N5bS1QUEN9IC13IDM1IHtEZWZpbmVzfQorCitGcmFnTmFtZSAgICAgICAgPSBsaWJleHBhdAorCisKKyMjIyBTb3VyY2UgRmlsZXMgIyMjCisKK1NyY0ZpbGVzICAgICAgICA9ICC2CisJCQkJICAie1NyY0Rpcn14bWxwYXJzZS5jIiC2CisJCQkJICAie1NyY0Rpcn14bWxyb2xlLmMiILYKKwkJCQkgICJ7U3JjRGlyfXhtbHRvay5jIgorCitUb29sU3JjRmlsZXMgICAgPSAgtgorCQkJCSAgIntUb29sRGlyfWVsZW1lbnRzLmMiILYKKwkJCQkgICJ7VG9vbERpcn1vdXRsaW5lLmMiCisKKworIyMjIE9iamVjdCBGaWxlcyAjIyMKKworT2JqRmlsZXMtUFBDICAgID0gILYKKwkJCQkgICJ7T2JqRGlyfXhtbHBhcnNlLmMubyIgtgorCQkJCSAgIntPYmpEaXJ9eG1scm9sZS5jLm8iILYKKwkJCQkgICJ7T2JqRGlyfXhtbHRvay5jLm8iCisKK0VsZW1lbnRUb29sT2JqRmlsZSAgID0gICJ7T2JqRGlyfWVsZW1lbnRzLmMubyIKKworT3V0bGluZVRvb2xPYmpGaWxlICAgPSAgIntPYmpEaXJ9b3V0bGluZS5jLm8iCisKKworIyMjIExpYnJhcmllcyAjIyMKKworU3RMaWJGaWxlcy1QUEMgICAgPSAgtgorCQkJCSAgIntQUENMaWJyYXJpZXN9U3RkQ1J1bnRpbWUubyIgtgorCQkJCSAgIntQUENMaWJyYXJpZXN9UFBDQ1J1bnRpbWUubyIgtgorCQkJCSAgIntQUENMaWJyYXJpZXN9UFBDVG9vbExpYnMubyIKKworU2hMaWJGaWxlcy1QUEMgICAgPSAgtgorCQkJCSAgIntTaGFyZWRMaWJyYXJpZXN9SW50ZXJmYWNlTGliIiC2CisJCQkJICAie1NoYXJlZExpYnJhcmllc31TdGRDTGliIiC2CisJCQkJICAie1NoYXJlZExpYnJhcmllc31NYXRoTGliIgorCitMaWJGaWxlcy1QUEMgICAgPSAgtgorCQkJCSAge1N0TGliRmlsZXMtUFBDfSC2CisJCQkJICB7U2hMaWJGaWxlcy1QUEN9CisKKworIyMjIFNwZWNpYWwgRmlsZXMgIyMjCisKK0V4cG9ydEZpbGUgICAgICA9ICJ7T2JqRGlyfXtGcmFnTmFtZX0uZXhwIgorCitTdExpYkZpbGUgICAgICAgPSAie09iakRpcn17RnJhZ05hbWV9Lk1yQy5vIgorCitTaExpYkZpbGUgICAgICAgPSAie09iakRpcn17RnJhZ05hbWV9IgorCitTdHViRmlsZSAgICAgICAgPSAie09iakRpcn17RnJhZ05hbWV9LnN0dWIiCisKK0VsZW1lbnRzVG9vbCAgICA9ICJ7VG9vbERpcn1lbGVtZW50cyIKKworT3V0bGluZVRvb2wgICAgID0gIntUb29sRGlyfW91dGxpbmUiCisKKworIyMjIERlZmF1bHQgUnVsZXMgIyMjCisKKy5jLm8gIMQgIC5jICB7pU1vbmRvQnVpbGSlfQorCXtQUENDfSB7ZGVwRGlyfXtkZWZhdWx0fS5jIC1vIHt0YXJnRGlyfXtkZWZhdWx0fS5jLm8ge1BQQ0NPcHRpb25zfQorCisKKyMjIyBCdWlsZCBSdWxlcyAjIyMKKworQWxsICDEICBEeW5hbWljIHtFbGVtZW50c1Rvb2x9IHtPdXRsaW5lVG9vbH0KKworU3RhdGljICDEICB7U3RMaWJGaWxlfQorCitEeW5hbWljICDEICBTdGF0aWMge1NoTGliRmlsZX0ge1N0dWJGaWxlfQorCit7U3RMaWJGaWxlfSAgxMQgIHtPYmpGaWxlcy1QUEN9IHtTdExpYkZpbGVzLVBQQ30ge6VNb25kb0J1aWxkpX0KKwlQUENMaW5rILYKKwkJLW8ge1Rhcmd9ILYKKwkJe09iakZpbGVzLVBQQ30gtgorCQl7U3RMaWJGaWxlcy1QUEN9ILYKKwkJe1N5bS1QUEN9ILYKKwkJLW1mIC1kILYKKwkJLXQgJ1hDT0YnILYKKwkJLWMgJ01QUyAnILYKKwkJLXhtIGwKKwore1NoTGliRmlsZX0gIMTEICB7U3RMaWJGaWxlfSB7U2hMaWJGaWxlcy1QUEN9IHtFeHBvcnRGaWxlfSB7pU1vbmRvQnVpbGSlfQorCVBQQ0xpbmsgtgorCQktbyB7VGFyZ30gtgorCQl7U3RMaWJGaWxlfSC2CisJCXtTaExpYkZpbGVzLVBQQ30gtgorCQl7U3ltLVBQQ30gtgorCQktQGV4cG9ydCB7RXhwb3J0RmlsZX0gtgorCQktZnJhZ25hbWUge0ZyYWdOYW1lfSC2CisJCS1tZiAtZCC2CisJCS10ICdzaGxiJyC2CisJCS1jICc/Pz8/JyC2CisJCS14bSBzCisKK3tTdHViRmlsZX0gIMTEICB7U2hMaWJGaWxlfSB7pU1vbmRvQnVpbGSlfQorCXNobGIyc3R1YiAtbyB7VGFyZ30ge1NoTGliRmlsZX0KKwore0VsZW1lbnRzVG9vbH0gIMTEICB7RWxlbWVudFRvb2xPYmpGaWxlfSB7U3R1YkZpbGV9IHtMaWJGaWxlcy1QUEN9IHulTW9uZG9CdWlsZKV9CisJUFBDTGluayC2CisJCS1vIHtUYXJnfSC2CisJCXtFbGVtZW50VG9vbE9iakZpbGV9ILYKKwkJe1N0TGliRmlsZX0gtgorCQl7TGliRmlsZXMtUFBDfSC2CisJCXtTeW0tUFBDfSC2CisJCS1tZiAtZCC2CisJCS10ICdNUFNUJyC2CisJCS1jICdNUFMgJworCit7T3V0bGluZVRvb2x9ICDExCAge091dGxpbmVUb29sT2JqRmlsZX0ge1N0dWJGaWxlfSB7TGliRmlsZXMtUFBDfSB7pU1vbmRvQnVpbGSlfQorCVBQQ0xpbmsgtgorCQktbyB7VGFyZ30gtgorCQl7T3V0bGluZVRvb2xPYmpGaWxlfSC2CisJCXtTdExpYkZpbGV9ILYKKwkJe0xpYkZpbGVzLVBQQ30gtgorCQl7U3ltLVBQQ30gtgorCQktbWYgLWQgtgorCQktdCAnTVBTVCcgtgorCQktYyAnTVBTICcKKworCisjIyMgU3BlY2lhbCBSdWxlcyAjIyMKKwore0V4cG9ydEZpbGV9ICDExCAgIntIZHJEaXJ9ZXhwYXQuaCIge6VNb25kb0J1aWxkpX0KKwlTdHJlYW1FZGl0IC1kILYKKwkJLWUgIi+lKCdYTUxQQVJTRUFQSSgnxScpICcpxzAsMcgnWE1MXycoW0EtWmEtejAtOV9dKymoMScoJy8gUHJpbnQgJ1hNTF8nIKgxIiC2CisJCSJ7SGRyRGlyfWV4cGF0LmgiID4ge1Rhcmd9CisKKworIyMjIFJlcXVpcmVkIERlcGVuZGVuY2llcyAjIyMKKworIntPYmpEaXJ9eG1scGFyc2UuYy5vIiAgxCAgIntTcmNEaXJ9eG1scGFyc2UuYyIKKyJ7T2JqRGlyfXhtbHJvbGUuYy5vIiAgxCAgIntTcmNEaXJ9eG1scm9sZS5jIgorIntPYmpEaXJ9eG1sdG9rLmMubyIgIMQgICJ7U3JjRGlyfXhtbHRvay5jIgorCisie09iakRpcn1lbGVtZW50cy5jLm8iICDEICJ7VG9vbERpcn1lbGVtZW50cy5jIgorIntPYmpEaXJ9b3V0bGluZS5jLm8iICDEICJ7VG9vbERpcn1vdXRsaW5lLmMiCisKKworIyMjIE9wdGlvbmFsIERlcGVuZGVuY2llcyAjIyMKKyMjIyBCdWlsZCB0aGlzIHRhcmdldCB0byBjbGVhbiBvdXQgZ2VuZXJhdGVkIGludGVybWVkaWF0ZSBmaWxlcy4gIyMjCisKK0NsZWFuICDECisJRGVsZXRlIHtPYmpGaWxlcy1QUEN9IHtFeHBvcnRGaWxlfSB7RWxlbWVudFRvb2xPYmpGaWxlfSB7T3V0bGluZVRvb2xPYmpGaWxlfQorCisjIyMgQnVpbGQgdGhpcyB0YXJnZXQgdG8gY2xlYW4gb3V0IGFsbCBnZW5lcmF0ZWQgZmlsZXMuICMjIworCitDbGVhbi1BbGwgIMQgIENsZWFuCisJRGVsZXRlIHtTdExpYkZpbGV9IHtTaExpYkZpbGV9IHtTdHViRmlsZX0ge0VsZW1lbnRzVG9vbH0ge091dGxpbmVUb29sfQorCisjIyMgQnVpbGQgdGhpcyB0YXJnZXQgdG8gZ2VuZXJhdGUgImluY2x1ZGUgZmlsZSIgZGVwZW5kZW5jaWVzLiAjIyMKKworRGVwZW5kZW5jaWVzICDEICAkT3V0T2ZEYXRlCisJTWFrZURlcGVuZCC2CisJCS1hcHBlbmQge01BS0VGSUxFfSC2CisJCS1pZ25vcmUgIntDSW5jbHVkZXN9IiC2CisJCS1vYmpkaXIgIntPYmpEaXJ9IiC2CisJCS1vYmpleHQgLm8gtgorCQl7RGVmaW5lc30gtgorCQl7SW5jbHVkZXN9ILYKKwkJe1NyY0ZpbGVzfQorCisKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2xpYi9hbWlnYWNvbmZpZy5oIGIvZXhwYXQtMi4wLjEvbGliL2FtaWdhY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZjNjExNQotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2xpYi9hbWlnYWNvbmZpZy5oCkBAIC0wLDAgKzEsMzIgQEAKKyNpZm5kZWYgQU1JR0FDT05GSUdfSAorI2RlZmluZSBBTUlHQUNPTkZJR19ICisKKy8qIDEyMzQgPSBMSUxfRU5ESUFOLCA0MzIxID0gQklHRU5ESUFOICovCisjZGVmaW5lIEJZVEVPUkRFUiA0MzIxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYmNvcHknIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0JDT1BZIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxjaGVjay5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0NIRUNLX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtZW1tb3ZlJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9NRU1NT1ZFIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfVU5JU1REX0ggMQorCisvKiB3aGV0aGVyIGJ5dGVvcmRlciBpcyBiaWdlbmRpYW4gKi8KKyNkZWZpbmUgV09SRFNfQklHRU5ESUFOCisKKy8qIERlZmluZSB0byBzcGVjaWZ5IGhvdyBtdWNoIGNvbnRleHQgdG8gcmV0YWluIGFyb3VuZCB0aGUgY3VycmVudCBwYXJzZQorICAgcG9pbnQuICovCisjZGVmaW5lIFhNTF9DT05URVhUX0JZVEVTIDEwMjQKKworLyogRGVmaW5lIHRvIG1ha2UgcGFyYW1ldGVyIGVudGl0eSBwYXJzaW5nIGZ1bmN0aW9uYWxpdHkgYXZhaWxhYmxlLiAqLworI2RlZmluZSBYTUxfRFRECisKKy8qIERlZmluZSB0byBtYWtlIFhNTCBOYW1lc3BhY2VzIGZ1bmN0aW9uYWxpdHkgYXZhaWxhYmxlLiAqLworI2RlZmluZSBYTUxfTlMKKworI2VuZGlmICAvKiBBTUlHQUNPTkZJR19IICovCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9saWIvYXNjaWkuaCBiL2V4cGF0LTIuMC4xL2xpYi9hc2NpaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMDUzMGIKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9saWIvYXNjaWkuaApAQCAtMCwwICsxLDkyIEBACisvKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgVGhhaSBPcGVuIFNvdXJjZSBTb2Z0d2FyZSBDZW50ZXIgTHRkCisgICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgY29weWluZyBwZXJtaXNzaW9uLgorKi8KKworI2RlZmluZSBBU0NJSV9BIDB4NDEKKyNkZWZpbmUgQVNDSUlfQiAweDQyCisjZGVmaW5lIEFTQ0lJX0MgMHg0MworI2RlZmluZSBBU0NJSV9EIDB4NDQKKyNkZWZpbmUgQVNDSUlfRSAweDQ1CisjZGVmaW5lIEFTQ0lJX0YgMHg0NgorI2RlZmluZSBBU0NJSV9HIDB4NDcKKyNkZWZpbmUgQVNDSUlfSCAweDQ4CisjZGVmaW5lIEFTQ0lJX0kgMHg0OQorI2RlZmluZSBBU0NJSV9KIDB4NEEKKyNkZWZpbmUgQVNDSUlfSyAweDRCCisjZGVmaW5lIEFTQ0lJX0wgMHg0QworI2RlZmluZSBBU0NJSV9NIDB4NEQKKyNkZWZpbmUgQVNDSUlfTiAweDRFCisjZGVmaW5lIEFTQ0lJX08gMHg0RgorI2RlZmluZSBBU0NJSV9QIDB4NTAKKyNkZWZpbmUgQVNDSUlfUSAweDUxCisjZGVmaW5lIEFTQ0lJX1IgMHg1MgorI2RlZmluZSBBU0NJSV9TIDB4NTMKKyNkZWZpbmUgQVNDSUlfVCAweDU0CisjZGVmaW5lIEFTQ0lJX1UgMHg1NQorI2RlZmluZSBBU0NJSV9WIDB4NTYKKyNkZWZpbmUgQVNDSUlfVyAweDU3CisjZGVmaW5lIEFTQ0lJX1ggMHg1OAorI2RlZmluZSBBU0NJSV9ZIDB4NTkKKyNkZWZpbmUgQVNDSUlfWiAweDVBCisKKyNkZWZpbmUgQVNDSUlfYSAweDYxCisjZGVmaW5lIEFTQ0lJX2IgMHg2MgorI2RlZmluZSBBU0NJSV9jIDB4NjMKKyNkZWZpbmUgQVNDSUlfZCAweDY0CisjZGVmaW5lIEFTQ0lJX2UgMHg2NQorI2RlZmluZSBBU0NJSV9mIDB4NjYKKyNkZWZpbmUgQVNDSUlfZyAweDY3CisjZGVmaW5lIEFTQ0lJX2ggMHg2OAorI2RlZmluZSBBU0NJSV9pIDB4NjkKKyNkZWZpbmUgQVNDSUlfaiAweDZBCisjZGVmaW5lIEFTQ0lJX2sgMHg2QgorI2RlZmluZSBBU0NJSV9sIDB4NkMKKyNkZWZpbmUgQVNDSUlfbSAweDZECisjZGVmaW5lIEFTQ0lJX24gMHg2RQorI2RlZmluZSBBU0NJSV9vIDB4NkYKKyNkZWZpbmUgQVNDSUlfcCAweDcwCisjZGVmaW5lIEFTQ0lJX3EgMHg3MQorI2RlZmluZSBBU0NJSV9yIDB4NzIKKyNkZWZpbmUgQVNDSUlfcyAweDczCisjZGVmaW5lIEFTQ0lJX3QgMHg3NAorI2RlZmluZSBBU0NJSV91IDB4NzUKKyNkZWZpbmUgQVNDSUlfdiAweDc2CisjZGVmaW5lIEFTQ0lJX3cgMHg3NworI2RlZmluZSBBU0NJSV94IDB4NzgKKyNkZWZpbmUgQVNDSUlfeSAweDc5CisjZGVmaW5lIEFTQ0lJX3ogMHg3QQorCisjZGVmaW5lIEFTQ0lJXzAgMHgzMAorI2RlZmluZSBBU0NJSV8xIDB4MzEKKyNkZWZpbmUgQVNDSUlfMiAweDMyCisjZGVmaW5lIEFTQ0lJXzMgMHgzMworI2RlZmluZSBBU0NJSV80IDB4MzQKKyNkZWZpbmUgQVNDSUlfNSAweDM1CisjZGVmaW5lIEFTQ0lJXzYgMHgzNgorI2RlZmluZSBBU0NJSV83IDB4MzcKKyNkZWZpbmUgQVNDSUlfOCAweDM4CisjZGVmaW5lIEFTQ0lJXzkgMHgzOQorCisjZGVmaW5lIEFTQ0lJX1RBQiAweDA5CisjZGVmaW5lIEFTQ0lJX1NQQUNFIDB4MjAKKyNkZWZpbmUgQVNDSUlfRVhDTCAweDIxCisjZGVmaW5lIEFTQ0lJX1FVT1QgMHgyMgorI2RlZmluZSBBU0NJSV9BTVAgMHgyNgorI2RlZmluZSBBU0NJSV9BUE9TIDB4MjcKKyNkZWZpbmUgQVNDSUlfTUlOVVMgMHgyRAorI2RlZmluZSBBU0NJSV9QRVJJT0QgMHgyRQorI2RlZmluZSBBU0NJSV9DT0xPTiAweDNBCisjZGVmaW5lIEFTQ0lJX1NFTUkgMHgzQgorI2RlZmluZSBBU0NJSV9MVCAweDNDCisjZGVmaW5lIEFTQ0lJX0VRVUFMUyAweDNECisjZGVmaW5lIEFTQ0lJX0dUIDB4M0UKKyNkZWZpbmUgQVNDSUlfTFNRQiAweDVCCisjZGVmaW5lIEFTQ0lJX1JTUUIgMHg1RAorI2RlZmluZSBBU0NJSV9VTkRFUlNDT1JFIDB4NUYKKyNkZWZpbmUgQVNDSUlfTFBBUkVOIDB4MjgKKyNkZWZpbmUgQVNDSUlfUlBBUkVOIDB4MjkKKyNkZWZpbmUgQVNDSUlfRkYgMHgwQworI2RlZmluZSBBU0NJSV9TTEFTSCAweDJGCisjZGVmaW5lIEFTQ0lJX0hBU0ggMHgyMworI2RlZmluZSBBU0NJSV9QSVBFIDB4N0MKKyNkZWZpbmUgQVNDSUlfQ09NTUEgMHgyQwpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvbGliL2FzY2lpdGFiLmggYi9leHBhdC0yLjAuMS9saWIvYXNjaWl0YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWExNWMyCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvbGliL2FzY2lpdGFiLmgKQEAgLTAsMCArMSwzNiBAQAorLyogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5IFRoYWkgT3BlbiBTb3VyY2UgU29mdHdhcmUgQ2VudGVyIEx0ZAorICAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIGNvcHlpbmcgcGVybWlzc2lvbi4KKyovCisKKy8qIDB4MDAgKi8gQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwgQlRfTk9OWE1MLAorLyogMHgwNCAqLyBCVF9OT05YTUwsIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsCisvKiAweDA4ICovIEJUX05PTlhNTCwgQlRfUywgQlRfTEYsIEJUX05PTlhNTCwKKy8qIDB4MEMgKi8gQlRfTk9OWE1MLCBCVF9DUiwgQlRfTk9OWE1MLCBCVF9OT05YTUwsCisvKiAweDEwICovIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwKKy8qIDB4MTQgKi8gQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwgQlRfTk9OWE1MLAorLyogMHgxOCAqLyBCVF9OT05YTUwsIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsCisvKiAweDFDICovIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwKKy8qIDB4MjAgKi8gQlRfUywgQlRfRVhDTCwgQlRfUVVPVCwgQlRfTlVNLAorLyogMHgyNCAqLyBCVF9PVEhFUiwgQlRfUEVSQ05ULCBCVF9BTVAsIEJUX0FQT1MsCisvKiAweDI4ICovIEJUX0xQQVIsIEJUX1JQQVIsIEJUX0FTVCwgQlRfUExVUywKKy8qIDB4MkMgKi8gQlRfQ09NTUEsIEJUX01JTlVTLCBCVF9OQU1FLCBCVF9TT0wsCisvKiAweDMwICovIEJUX0RJR0lULCBCVF9ESUdJVCwgQlRfRElHSVQsIEJUX0RJR0lULAorLyogMHgzNCAqLyBCVF9ESUdJVCwgQlRfRElHSVQsIEJUX0RJR0lULCBCVF9ESUdJVCwKKy8qIDB4MzggKi8gQlRfRElHSVQsIEJUX0RJR0lULCBCVF9DT0xPTiwgQlRfU0VNSSwKKy8qIDB4M0MgKi8gQlRfTFQsIEJUX0VRVUFMUywgQlRfR1QsIEJUX1FVRVNULAorLyogMHg0MCAqLyBCVF9PVEhFUiwgQlRfSEVYLCBCVF9IRVgsIEJUX0hFWCwKKy8qIDB4NDQgKi8gQlRfSEVYLCBCVF9IRVgsIEJUX0hFWCwgQlRfTk1TVFJULAorLyogMHg0OCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCisvKiAweDRDICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKKy8qIDB4NTAgKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULAorLyogMHg1NCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCisvKiAweDU4ICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX0xTUUIsCisvKiAweDVDICovIEJUX09USEVSLCBCVF9SU1FCLCBCVF9PVEhFUiwgQlRfTk1TVFJULAorLyogMHg2MCAqLyBCVF9PVEhFUiwgQlRfSEVYLCBCVF9IRVgsIEJUX0hFWCwKKy8qIDB4NjQgKi8gQlRfSEVYLCBCVF9IRVgsIEJUX0hFWCwgQlRfTk1TVFJULAorLyogMHg2OCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCisvKiAweDZDICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKKy8qIDB4NzAgKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULAorLyogMHg3NCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCisvKiAweDc4ICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX09USEVSLAorLyogMHg3QyAqLyBCVF9WRVJCQVIsIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9saWIvZXhwYXQuZHNwIGIvZXhwYXQtMi4wLjEvbGliL2V4cGF0LmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmMxN2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvbGliL2V4cGF0LmRzcApAQCAtMCwwICsxLDE4NSBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJleHBhdCIgLSBQYWNrYWdlIE93bmVyPTw0PgorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAorIyAqKiBETyBOT1QgRURJVCAqKgorCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHgwMTAyCisKK0NGRz1leHBhdCAtIFdpbjMyIERlYnVnCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgImV4cGF0Lm1hayIuCishTUVTU0FHRSAKKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAiZXhwYXQubWFrIiBDRkc9ImV4cGF0IC0gV2luMzIgRGVidWciCishTUVTU0FHRSAKKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgorIU1FU1NBR0UgCishTUVTU0FHRSAiZXhwYXQgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKKyFNRVNTQUdFICJleHBhdCAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKKyFNRVNTQUdFIAorCisjIEJlZ2luIFByb2plY3QKKyMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwCisjIFBST1AgU2NjX1Byb2pOYW1lICIiCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIgorQ1BQPWNsLmV4ZQorTVRMPW1pZGwuZXhlCitSU0M9cmMuZXhlCisKKyFJRiAgIiQoQ0ZHKSIgPT0gImV4cGF0IC0gV2luMzIgUmVsZWFzZSIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIi4uXHdpbjMyXGJpblxSZWxlYXNlIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXHdpbjMyXHRtcFxSZWxlYXNlIgorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKKyMgUFJPUCBUYXJnZXRfRGlyICIiCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL0QgIl9NQkNTIiAvRCAiX1VTUkRMTCIgL0QgIkVYUEFUX0VYUE9SVFMiIC9ZdSJzdGRhZnguaCIgL0ZEIC9jCisjIEFERCBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJfTUJDUyIgL0QgIl9VU1JETEwiIC9EICJDT01QSUxFRF9GUk9NX0RTUCIgL0ZEIC9jCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL2RsbCAvbWFjaGluZTpJMzg2CisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvZGxsIC9wZGI6bm9uZSAvbWFjaGluZTpJMzg2IC9vdXQ6Ii4uXHdpbjMyXGJpblxSZWxlYXNlL2xpYmV4cGF0LmRsbCIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImV4cGF0IC0gV2luMzIgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXHdpbjMyXGJpblxEZWJ1ZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlx3aW4zMlx0bXBcRGVidWciCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAorIyBQUk9QIFRhcmdldF9EaXIgIiIKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dtIC9HWCAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRCAiX01CQ1MiIC9EICJfVVNSRExMIiAvRCAiRVhQQVRfRVhQT1JUUyIgL1l1InN0ZGFmeC5oIiAvRkQgL0daIC9jCisjIEFERCBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR1ggL1pJIC9PZCAvRCAiX0RFQlVHIiAvRCAiQ09NUElMRURfRlJPTV9EU1AiIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiX01CQ1MiIC9EICJfVVNSRExMIiAvRlIgL0ZEIC9HWiAvYworIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0CisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvZGxsIC9wZGI6bm9uZSAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiIuLlx3aW4zMlxiaW5cRGVidWcvbGliZXhwYXQuZGxsIgorCishRU5ESUYgCisKKyMgQmVnaW4gVGFyZ2V0CisKKyMgTmFtZSAiZXhwYXQgLSBXaW4zMiBSZWxlYXNlIgorIyBOYW1lICJleHBhdCAtIFdpbjMyIERlYnVnIgorIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgorCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGxpYmV4cGF0LmRlZgorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5ceG1scGFyc2UuYworCishSUYgICIkKENGRykiID09ICJleHBhdCAtIFdpbjMyIFJlbGVhc2UiCisKKyFFTFNFSUYgICIkKENGRykiID09ICJleHBhdCAtIFdpbjMyIERlYnVnIgorCisjIEFERCBDUFAgL0dYLSAvT2QKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx4bWxyb2xlLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXHhtbHRvay5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx4bWx0b2tfaW1wbC5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx4bWx0b2tfbnMuYworIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIEdyb3VwCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiCisKKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubCIKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cYXNjaWkuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cYXNjaWl0YWIuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cZXhwYXQuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cZXhwYXRfZXh0ZXJuYWwuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5caWFzY2lpdGFiLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGludGVybmFsLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGxhdGluMXRhYi5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxuYW1ldGFiLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXHV0Zjh0YWIuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5ceG1scm9sZS5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx4bWx0b2suaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5ceG1sdG9rX2ltcGwuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIEdyb3VwCisjIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyIKKworIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiCisjIEVuZCBHcm91cAorIyBFbmQgVGFyZ2V0CisjIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9saWIvZXhwYXQuaCBiL2V4cGF0LTIuMC4xL2xpYi9leHBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYTgyNzgKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9saWIvZXhwYXQuaApAQCAtMCwwICsxLDEwMTQgQEAKKy8qIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCBUaGFpIE9wZW4gU291cmNlIFNvZnR3YXJlIENlbnRlciBMdGQKKyAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBjb3B5aW5nIHBlcm1pc3Npb24uCisqLworCisjaWZuZGVmIEV4cGF0X0lOQ0xVREVECisjZGVmaW5lIEV4cGF0X0lOQ0xVREVEIDEKKworI2lmZGVmIF9fVk1TCisvKiAgICAgIDAgICAgICAgIDEgICAgICAgICAyICAgICAgICAgMyAgICAgIDAgICAgICAgIDEgICAgICAgICAyICAgICAgICAgMworICAgICAgICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxICAgICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxICovCisjZGVmaW5lIFhNTF9TZXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyIFhNTF9TZXRQcm9jZXNzaW5nSW5zdHJIYW5kbGVyCisjZGVmaW5lIFhNTF9TZXRVbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyICAgIFhNTF9TZXRVbnBhcnNlZEVudERlY2xIYW5kbGVyCisjZGVmaW5lIFhNTF9TZXRTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyICAgIFhNTF9TZXRTdGFydE5hbWVzcGNEZWNsSGFuZGxlcgorI2RlZmluZSBYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnICBYTUxfU2V0RXh0ZXJuYWxFbnRSZWZIYW5kbGVyQXJnCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImV4cGF0X2V4dGVybmFsLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IFhNTF9QYXJzZXJTdHJ1Y3Q7Cit0eXBlZGVmIHN0cnVjdCBYTUxfUGFyc2VyU3RydWN0ICpYTUxfUGFyc2VyOworCisvKiBTaG91bGQgdGhpcyBiZSBkZWZpbmVkIHVzaW5nIHN0ZGJvb2wuaCB3aGVuIEM5OSBpcyBhdmFpbGFibGU/ICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgWE1MX0Jvb2w7CisjZGVmaW5lIFhNTF9UUlVFICAgKChYTUxfQm9vbCkgMSkKKyNkZWZpbmUgWE1MX0ZBTFNFICAoKFhNTF9Cb29sKSAwKQorCisvKiBUaGUgWE1MX1N0YXR1cyBlbnVtIGdpdmVzIHRoZSBwb3NzaWJsZSByZXR1cm4gdmFsdWVzIGZvciBzZXZlcmFsCisgICBBUEkgZnVuY3Rpb25zLiAgVGhlIHByZXByb2Nlc3NvciAjZGVmaW5lcyBhcmUgaW5jbHVkZWQgc28gdGhpcworICAgc3RhbnphIGNhbiBiZSBhZGRlZCB0byBjb2RlIHRoYXQgc3RpbGwgbmVlZHMgdG8gc3VwcG9ydCBvbGRlcgorICAgdmVyc2lvbnMgb2YgRXhwYXQgMS45NS54OgorCisgICAjaWZuZGVmIFhNTF9TVEFUVVNfT0sKKyAgICNkZWZpbmUgWE1MX1NUQVRVU19PSyAgICAxCisgICAjZGVmaW5lIFhNTF9TVEFUVVNfRVJST1IgMAorICAgI2VuZGlmCisKKyAgIE90aGVyd2lzZSwgdGhlICNkZWZpbmUgaGFja2VyeSBpcyBxdWl0ZSB1Z2x5IGFuZCB3b3VsZCBoYXZlIGJlZW4KKyAgIGRyb3BwZWQuCisqLworZW51bSBYTUxfU3RhdHVzIHsKKyAgWE1MX1NUQVRVU19FUlJPUiA9IDAsCisjZGVmaW5lIFhNTF9TVEFUVVNfRVJST1IgWE1MX1NUQVRVU19FUlJPUgorICBYTUxfU1RBVFVTX09LID0gMSwKKyNkZWZpbmUgWE1MX1NUQVRVU19PSyBYTUxfU1RBVFVTX09LCisgIFhNTF9TVEFUVVNfU1VTUEVOREVEID0gMgorI2RlZmluZSBYTUxfU1RBVFVTX1NVU1BFTkRFRCBYTUxfU1RBVFVTX1NVU1BFTkRFRAorfTsKKworZW51bSBYTUxfRXJyb3IgeworICBYTUxfRVJST1JfTk9ORSwKKyAgWE1MX0VSUk9SX05PX01FTU9SWSwKKyAgWE1MX0VSUk9SX1NZTlRBWCwKKyAgWE1MX0VSUk9SX05PX0VMRU1FTlRTLAorICBYTUxfRVJST1JfSU5WQUxJRF9UT0tFTiwKKyAgWE1MX0VSUk9SX1VOQ0xPU0VEX1RPS0VOLAorICBYTUxfRVJST1JfUEFSVElBTF9DSEFSLAorICBYTUxfRVJST1JfVEFHX01JU01BVENILAorICBYTUxfRVJST1JfRFVQTElDQVRFX0FUVFJJQlVURSwKKyAgWE1MX0VSUk9SX0pVTktfQUZURVJfRE9DX0VMRU1FTlQsCisgIFhNTF9FUlJPUl9QQVJBTV9FTlRJVFlfUkVGLAorICBYTUxfRVJST1JfVU5ERUZJTkVEX0VOVElUWSwKKyAgWE1MX0VSUk9SX1JFQ1VSU0lWRV9FTlRJVFlfUkVGLAorICBYTUxfRVJST1JfQVNZTkNfRU5USVRZLAorICBYTUxfRVJST1JfQkFEX0NIQVJfUkVGLAorICBYTUxfRVJST1JfQklOQVJZX0VOVElUWV9SRUYsCisgIFhNTF9FUlJPUl9BVFRSSUJVVEVfRVhURVJOQUxfRU5USVRZX1JFRiwKKyAgWE1MX0VSUk9SX01JU1BMQUNFRF9YTUxfUEksCisgIFhNTF9FUlJPUl9VTktOT1dOX0VOQ09ESU5HLAorICBYTUxfRVJST1JfSU5DT1JSRUNUX0VOQ09ESU5HLAorICBYTUxfRVJST1JfVU5DTE9TRURfQ0RBVEFfU0VDVElPTiwKKyAgWE1MX0VSUk9SX0VYVEVSTkFMX0VOVElUWV9IQU5ETElORywKKyAgWE1MX0VSUk9SX05PVF9TVEFOREFMT05FLAorICBYTUxfRVJST1JfVU5FWFBFQ1RFRF9TVEFURSwKKyAgWE1MX0VSUk9SX0VOVElUWV9ERUNMQVJFRF9JTl9QRSwKKyAgWE1MX0VSUk9SX0ZFQVRVUkVfUkVRVUlSRVNfWE1MX0RURCwKKyAgWE1MX0VSUk9SX0NBTlRfQ0hBTkdFX0ZFQVRVUkVfT05DRV9QQVJTSU5HLAorICAvKiBBZGRlZCBpbiAxLjk1LjcuICovCisgIFhNTF9FUlJPUl9VTkJPVU5EX1BSRUZJWCwKKyAgLyogQWRkZWQgaW4gMS45NS44LiAqLworICBYTUxfRVJST1JfVU5ERUNMQVJJTkdfUFJFRklYLAorICBYTUxfRVJST1JfSU5DT01QTEVURV9QRSwKKyAgWE1MX0VSUk9SX1hNTF9ERUNMLAorICBYTUxfRVJST1JfVEVYVF9ERUNMLAorICBYTUxfRVJST1JfUFVCTElDSUQsCisgIFhNTF9FUlJPUl9TVVNQRU5ERUQsCisgIFhNTF9FUlJPUl9OT1RfU1VTUEVOREVELAorICBYTUxfRVJST1JfQUJPUlRFRCwKKyAgWE1MX0VSUk9SX0ZJTklTSEVELAorICBYTUxfRVJST1JfU1VTUEVORF9QRSwKKyAgLyogQWRkZWQgaW4gMi4wLiAqLworICBYTUxfRVJST1JfUkVTRVJWRURfUFJFRklYX1hNTCwKKyAgWE1MX0VSUk9SX1JFU0VSVkVEX1BSRUZJWF9YTUxOUywKKyAgWE1MX0VSUk9SX1JFU0VSVkVEX05BTUVTUEFDRV9VUkkKK307CisKK2VudW0gWE1MX0NvbnRlbnRfVHlwZSB7CisgIFhNTF9DVFlQRV9FTVBUWSA9IDEsCisgIFhNTF9DVFlQRV9BTlksCisgIFhNTF9DVFlQRV9NSVhFRCwKKyAgWE1MX0NUWVBFX05BTUUsCisgIFhNTF9DVFlQRV9DSE9JQ0UsCisgIFhNTF9DVFlQRV9TRVEKK307CisKK2VudW0gWE1MX0NvbnRlbnRfUXVhbnQgeworICBYTUxfQ1FVQU5UX05PTkUsCisgIFhNTF9DUVVBTlRfT1BULAorICBYTUxfQ1FVQU5UX1JFUCwKKyAgWE1MX0NRVUFOVF9QTFVTCit9OworCisvKiBJZiB0eXBlID09IFhNTF9DVFlQRV9FTVBUWSBvciBYTUxfQ1RZUEVfQU5ZLCB0aGVuIHF1YW50IHdpbGwgYmUKKyAgIFhNTF9DUVVBTlRfTk9ORSwgYW5kIHRoZSBvdGhlciBmaWVsZHMgd2lsbCBiZSB6ZXJvIG9yIE5VTEwuCisgICBJZiB0eXBlID09IFhNTF9DVFlQRV9NSVhFRCwgdGhlbiBxdWFudCB3aWxsIGJlIE5PTkUgb3IgUkVQIGFuZAorICAgbnVtY2hpbGRyZW4gd2lsbCBjb250YWluIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IG1heSBiZSBtaXhlZCBpbgorICAgYW5kIGNoaWxkcmVuIHBvaW50IHRvIGFuIGFycmF5IG9mIFhNTF9Db250ZW50IGNlbGxzIHRoYXQgd2lsbCBiZQorICAgYWxsIG9mIFhNTF9DVFlQRV9OQU1FIHR5cGUgd2l0aCBubyBxdWFudGlmaWNhdGlvbi4KKworICAgSWYgdHlwZSA9PSBYTUxfQ1RZUEVfTkFNRSwgdGhlbiB0aGUgbmFtZSBwb2ludHMgdG8gdGhlIG5hbWUsIGFuZAorICAgdGhlIG51bWNoaWxkcmVuIGZpZWxkIHdpbGwgYmUgemVybyBhbmQgY2hpbGRyZW4gd2lsbCBiZSBOVUxMLiBUaGUKKyAgIHF1YW50IGZpZWxkcyBpbmRpY2F0ZXMgYW55IHF1YW50aWZpZXJzIHBsYWNlZCBvbiB0aGUgbmFtZS4KKworICAgQ0hPSUNFIGFuZCBTRVEgd2lsbCBoYXZlIG5hbWUgTlVMTCwgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBpbgorICAgbnVtY2hpbGRyZW4gYW5kIGNoaWxkcmVuIHdpbGwgcG9pbnQsIHJlY3Vyc2l2ZWx5LCB0byBhbiBhcnJheQorICAgb2YgWE1MX0NvbnRlbnQgY2VsbHMuCisKKyAgIFRoZSBFTVBUWSwgQU5ZLCBhbmQgTUlYRUQgdHlwZXMgd2lsbCBvbmx5IG9jY3VyIGF0IHRvcCBsZXZlbC4KKyovCisKK3R5cGVkZWYgc3RydWN0IFhNTF9jcCBYTUxfQ29udGVudDsKKworc3RydWN0IFhNTF9jcCB7CisgIGVudW0gWE1MX0NvbnRlbnRfVHlwZSAgICAgICAgIHR5cGU7CisgIGVudW0gWE1MX0NvbnRlbnRfUXVhbnQgICAgICAgIHF1YW50OworICBYTUxfQ2hhciAqICAgICAgICAgICAgICAgICAgICBuYW1lOworICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICBudW1jaGlsZHJlbjsKKyAgWE1MX0NvbnRlbnQgKiAgICAgICAgICAgICAgICAgY2hpbGRyZW47Cit9OworCisKKy8qIFRoaXMgaXMgY2FsbGVkIGZvciBhbiBlbGVtZW50IGRlY2xhcmF0aW9uLiBTZWUgYWJvdmUgZm9yCisgICBkZXNjcmlwdGlvbiBvZiB0aGUgbW9kZWwgYXJndW1lbnQuIEl0J3MgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5CisgICB0byBmcmVlIG1vZGVsIHdoZW4gZmluaXNoZWQgd2l0aCBpdC4KKyovCit0eXBlZGVmIHZvaWQgKFhNTENBTEwgKlhNTF9FbGVtZW50RGVjbEhhbmRsZXIpICh2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0NvbnRlbnQgKm1vZGVsKTsKKworWE1MUEFSU0VBUEkodm9pZCkKK1hNTF9TZXRFbGVtZW50RGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbGVtZW50RGVjbEhhbmRsZXIgZWxkZWNsKTsKKworLyogVGhlIEF0dGxpc3QgZGVjbGFyYXRpb24gaGFuZGxlciBpcyBjYWxsZWQgZm9yICplYWNoKiBhdHRyaWJ1dGUuIFNvCisgICBhIHNpbmdsZSBBdHRsaXN0IGRlY2xhcmF0aW9uIHdpdGggbXVsdGlwbGUgYXR0cmlidXRlcyBkZWNsYXJlZCB3aWxsCisgICBnZW5lcmF0ZSBtdWx0aXBsZSBjYWxscyB0byB0aGlzIGhhbmRsZXIuIFRoZSAiZGVmYXVsdCIgcGFyYW1ldGVyCisgICBtYXkgYmUgTlVMTCBpbiB0aGUgY2FzZSBvZiB0aGUgIiNJTVBMSUVEIiBvciAiI1JFUVVJUkVEIgorICAga2V5d29yZC4gVGhlICJpc3JlcXVpcmVkIiBwYXJhbWV0ZXIgd2lsbCBiZSB0cnVlIGFuZCB0aGUgZGVmYXVsdAorICAgdmFsdWUgd2lsbCBiZSBOVUxMIGluIHRoZSBjYXNlIG9mICIjUkVRVUlSRUQiLiBJZiAiaXNyZXF1aXJlZCIgaXMKKyAgIHRydWUgYW5kIGRlZmF1bHQgaXMgbm9uLU5VTEwsIHRoZW4gdGhpcyBpcyBhICIjRklYRUQiIGRlZmF1bHQuCisqLwordHlwZWRlZiB2b2lkIChYTUxDQUxMICpYTUxfQXR0bGlzdERlY2xIYW5kbGVyKSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgICplbG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAgKmF0dG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAgKmF0dF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgICpkZmx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBpc3JlcXVpcmVkKTsKKworWE1MUEFSU0VBUEkodm9pZCkKK1hNTF9TZXRBdHRsaXN0RGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9BdHRsaXN0RGVjbEhhbmRsZXIgYXR0ZGVjbCk7CisKKy8qIFRoZSBYTUwgZGVjbGFyYXRpb24gaGFuZGxlciBpcyBjYWxsZWQgZm9yICpib3RoKiBYTUwgZGVjbGFyYXRpb25zCisgICBhbmQgdGV4dCBkZWNsYXJhdGlvbnMuIFRoZSB3YXkgdG8gZGlzdGluZ3Vpc2ggaXMgdGhhdCB0aGUgdmVyc2lvbgorICAgcGFyYW1ldGVyIHdpbGwgYmUgTlVMTCBmb3IgdGV4dCBkZWNsYXJhdGlvbnMuIFRoZSBlbmNvZGluZworICAgcGFyYW1ldGVyIG1heSBiZSBOVUxMIGZvciBYTUwgZGVjbGFyYXRpb25zLiBUaGUgc3RhbmRhbG9uZQorICAgcGFyYW1ldGVyIHdpbGwgYmUgLTEsIDAsIG9yIDEgaW5kaWNhdGluZyByZXNwZWN0aXZlbHkgdGhhdCB0aGVyZQorICAgd2FzIG5vIHN0YW5kYWxvbmUgcGFyYW1ldGVyIGluIHRoZSBkZWNsYXJhdGlvbiwgdGhhdCBpdCB3YXMgZ2l2ZW4KKyAgIGFzIG5vLCBvciB0aGF0IGl0IHdhcyBnaXZlbiBhcyB5ZXMuCisqLwordHlwZWRlZiB2b2lkIChYTUxDQUxMICpYTUxfWG1sRGVjbEhhbmRsZXIpICh2b2lkICAgICAgICAgICAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICp2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzdGFuZGFsb25lKTsKKworWE1MUEFSU0VBUEkodm9pZCkKK1hNTF9TZXRYbWxEZWNsSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICBYTUxfWG1sRGVjbEhhbmRsZXIgeG1sZGVjbCk7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICB2b2lkICooKm1hbGxvY19mY24pKHNpemVfdCBzaXplKTsKKyAgdm9pZCAqKCpyZWFsbG9jX2Zjbikodm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSk7CisgIHZvaWQgKCpmcmVlX2Zjbikodm9pZCAqcHRyKTsKK30gWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZTsKKworLyogQ29uc3RydWN0cyBhIG5ldyBwYXJzZXI7IGVuY29kaW5nIGlzIHRoZSBlbmNvZGluZyBzcGVjaWZpZWQgYnkgdGhlCisgICBleHRlcm5hbCBwcm90b2NvbCBvciBOVUxMIGlmIHRoZXJlIGlzIG5vbmUgc3BlY2lmaWVkLgorKi8KK1hNTFBBUlNFQVBJKFhNTF9QYXJzZXIpCitYTUxfUGFyc2VyQ3JlYXRlKGNvbnN0IFhNTF9DaGFyICplbmNvZGluZyk7CisKKy8qIENvbnN0cnVjdHMgYSBuZXcgcGFyc2VyIGFuZCBuYW1lc3BhY2UgcHJvY2Vzc29yLiAgRWxlbWVudCB0eXBlCisgICBuYW1lcyBhbmQgYXR0cmlidXRlIG5hbWVzIHRoYXQgYmVsb25nIHRvIGEgbmFtZXNwYWNlIHdpbGwgYmUKKyAgIGV4cGFuZGVkOyB1bnByZWZpeGVkIGF0dHJpYnV0ZSBuYW1lcyBhcmUgbmV2ZXIgZXhwYW5kZWQ7IHVucHJlZml4ZWQKKyAgIGVsZW1lbnQgdHlwZSBuYW1lcyBhcmUgZXhwYW5kZWQgb25seSBpZiB0aGVyZSBpcyBhIGRlZmF1bHQKKyAgIG5hbWVzcGFjZS4gVGhlIGV4cGFuZGVkIG5hbWUgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIG5hbWVzcGFjZQorICAgVVJJLCB0aGUgbmFtZXNwYWNlIHNlcGFyYXRvciBjaGFyYWN0ZXIsIGFuZCB0aGUgbG9jYWwgcGFydCBvZiB0aGUKKyAgIG5hbWUuICBJZiB0aGUgbmFtZXNwYWNlIHNlcGFyYXRvciBpcyAnXDAnIHRoZW4gdGhlIG5hbWVzcGFjZSBVUkkKKyAgIGFuZCB0aGUgbG9jYWwgcGFydCB3aWxsIGJlIGNvbmNhdGVuYXRlZCB3aXRob3V0IGFueSBzZXBhcmF0b3IuCisgICBJdCBpcyBhIHByb2dyYW1taW5nIGVycm9yIHRvIHVzZSB0aGUgc2VwYXJhdG9yICdcMCcgd2l0aCBuYW1lc3BhY2UKKyAgIHRyaXBsZXRzIChzZWUgWE1MX1NldFJldHVybk5TVHJpcGxldCkuCisqLworWE1MUEFSU0VBUEkoWE1MX1BhcnNlcikKK1hNTF9QYXJzZXJDcmVhdGVOUyhjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmcsIFhNTF9DaGFyIG5hbWVzcGFjZVNlcGFyYXRvcik7CisKKworLyogQ29uc3RydWN0cyBhIG5ldyBwYXJzZXIgdXNpbmcgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1aXRlIHJlZmVycmVkIHRvCisgICBieSBtZW1zdWl0ZS4gSWYgbWVtc3VpdGUgaXMgTlVMTCwgdGhlbiB1c2UgdGhlIHN0YW5kYXJkIGxpYnJhcnkgbWVtb3J5CisgICBzdWl0ZS4gSWYgbmFtZXNwYWNlU2VwYXJhdG9yIGlzIG5vbi1OVUxMIGl0IGNyZWF0ZXMgYSBwYXJzZXIgd2l0aAorICAgbmFtZXNwYWNlIHByb2Nlc3NpbmcgYXMgZGVzY3JpYmVkIGFib3ZlLiBUaGUgY2hhcmFjdGVyIHBvaW50ZWQgYXQKKyAgIHdpbGwgc2VydmUgYXMgdGhlIG5hbWVzcGFjZSBzZXBhcmF0b3IuCisKKyAgIEFsbCBmdXJ0aGVyIG1lbW9yeSBvcGVyYXRpb25zIHVzZWQgZm9yIHRoZSBjcmVhdGVkIHBhcnNlciB3aWxsIGNvbWUgZnJvbQorICAgdGhlIGdpdmVuIHN1aXRlLgorKi8KK1hNTFBBUlNFQVBJKFhNTF9QYXJzZXIpCitYTUxfUGFyc2VyQ3JlYXRlX01NKGNvbnN0IFhNTF9DaGFyICplbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZSAqbWVtc3VpdGUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lc3BhY2VTZXBhcmF0b3IpOworCisvKiBQcmVwYXJlIGEgcGFyc2VyIG9iamVjdCB0byBiZSByZS11c2VkLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkKKyAgIHZhbHVhYmxlIHdoZW4gbWVtb3J5IGFsbG9jYXRpb24gb3ZlcmhlYWQgaXMgZGlzcHJvcG9ydGlvbmF0bHkgaGlnaCwKKyAgIHN1Y2ggYXMgd2hlbiBhIGxhcmdlIG51bWJlciBvZiBzbWFsbCBkb2N1bW5lbnRzIG5lZWQgdG8gYmUgcGFyc2VkLgorICAgQWxsIGhhbmRsZXJzIGFyZSBjbGVhcmVkIGZyb20gdGhlIHBhcnNlciwgZXhjZXB0IGZvciB0aGUKKyAgIHVua25vd25FbmNvZGluZ0hhbmRsZXIuIFRoZSBwYXJzZXIncyBleHRlcm5hbCBzdGF0ZSBpcyByZS1pbml0aWFsaXplZAorICAgZXhjZXB0IGZvciB0aGUgdmFsdWVzIG9mIG5zIGFuZCBuc190cmlwbGV0cy4KKworICAgQWRkZWQgaW4gRXhwYXQgMS45NS4zLgorKi8KK1hNTFBBUlNFQVBJKFhNTF9Cb29sKQorWE1MX1BhcnNlclJlc2V0KFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmcpOworCisvKiBhdHRzIGlzIGFycmF5IG9mIG5hbWUvdmFsdWUgcGFpcnMsIHRlcm1pbmF0ZWQgYnkgMDsKKyAgIG5hbWVzIGFuZCB2YWx1ZXMgYXJlIDAgdGVybWluYXRlZC4KKyovCit0eXBlZGVmIHZvaWQgKFhNTENBTEwgKlhNTF9TdGFydEVsZW1lbnRIYW5kbGVyKSAodm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKiphdHRzKTsKKwordHlwZWRlZiB2b2lkIChYTUxDQUxMICpYTUxfRW5kRWxlbWVudEhhbmRsZXIpICh2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5hbWUpOworCisKKy8qIHMgaXMgbm90IDAgdGVybWluYXRlZC4gKi8KK3R5cGVkZWYgdm9pZCAoWE1MQ0FMTCAqWE1MX0NoYXJhY3RlckRhdGFIYW5kbGVyKSAodm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKTsKKworLyogdGFyZ2V0IGFuZCBkYXRhIGFyZSAwIHRlcm1pbmF0ZWQgKi8KK3R5cGVkZWYgdm9pZCAoWE1MQ0FMTCAqWE1MX1Byb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIpICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpkYXRhKTsKKworLyogZGF0YSBpcyAwIHRlcm1pbmF0ZWQgKi8KK3R5cGVkZWYgdm9pZCAoWE1MQ0FMTCAqWE1MX0NvbW1lbnRIYW5kbGVyKSAodm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpkYXRhKTsKKwordHlwZWRlZiB2b2lkIChYTUxDQUxMICpYTUxfU3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyKSAodm9pZCAqdXNlckRhdGEpOwordHlwZWRlZiB2b2lkIChYTUxDQUxMICpYTUxfRW5kQ2RhdGFTZWN0aW9uSGFuZGxlcikgKHZvaWQgKnVzZXJEYXRhKTsKKworLyogVGhpcyBpcyBjYWxsZWQgZm9yIGFueSBjaGFyYWN0ZXJzIGluIHRoZSBYTUwgZG9jdW1lbnQgZm9yIHdoaWNoCisgICB0aGVyZSBpcyBubyBhcHBsaWNhYmxlIGhhbmRsZXIuICBUaGlzIGluY2x1ZGVzIGJvdGggY2hhcmFjdGVycyB0aGF0CisgICBhcmUgcGFydCBvZiBtYXJrdXAgd2hpY2ggaXMgb2YgYSBraW5kIHRoYXQgaXMgbm90IHJlcG9ydGVkCisgICAoY29tbWVudHMsIG1hcmt1cCBkZWNsYXJhdGlvbnMpLCBvciBjaGFyYWN0ZXJzIHRoYXQgYXJlIHBhcnQgb2YgYQorICAgY29uc3RydWN0IHdoaWNoIGNvdWxkIGJlIHJlcG9ydGVkIGJ1dCBmb3Igd2hpY2ggbm8gaGFuZGxlciBoYXMgYmVlbgorICAgc3VwcGxpZWQuIFRoZSBjaGFyYWN0ZXJzIGFyZSBwYXNzZWQgZXhhY3RseSBhcyB0aGV5IHdlcmUgaW4gdGhlIFhNTAorICAgZG9jdW1lbnQgZXhjZXB0IHRoYXQgdGhleSB3aWxsIGJlIGVuY29kZWQgaW4gVVRGLTggb3IgVVRGLTE2LgorICAgTGluZSBib3VuZGFyaWVzIGFyZSBub3Qgbm9ybWFsaXplZC4gTm90ZSB0aGF0IGEgYnl0ZSBvcmRlciBtYXJrCisgICBjaGFyYWN0ZXIgaXMgbm90IHBhc3NlZCB0byB0aGUgZGVmYXVsdCBoYW5kbGVyLiBUaGVyZSBhcmUgbm8KKyAgIGd1YXJhbnRlZXMgYWJvdXQgaG93IGNoYXJhY3RlcnMgYXJlIGRpdmlkZWQgYmV0d2VlbiBjYWxscyB0byB0aGUKKyAgIGRlZmF1bHQgaGFuZGxlcjogZm9yIGV4YW1wbGUsIGEgY29tbWVudCBtaWdodCBiZSBzcGxpdCBiZXR3ZWVuCisgICBtdWx0aXBsZSBjYWxscy4KKyovCit0eXBlZGVmIHZvaWQgKFhNTENBTEwgKlhNTF9EZWZhdWx0SGFuZGxlcikgKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbik7CisKKy8qIFRoaXMgaXMgY2FsbGVkIGZvciB0aGUgc3RhcnQgb2YgdGhlIERPQ1RZUEUgZGVjbGFyYXRpb24sIGJlZm9yZQorICAgYW55IERURCBvciBpbnRlcm5hbCBzdWJzZXQgaXMgcGFyc2VkLgorKi8KK3R5cGVkZWYgdm9pZCAoWE1MQ0FMTCAqWE1MX1N0YXJ0RG9jdHlwZURlY2xIYW5kbGVyKSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqZG9jdHlwZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzeXNpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnB1YmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFzX2ludGVybmFsX3N1YnNldCk7CisKKy8qIFRoaXMgaXMgY2FsbGVkIGZvciB0aGUgc3RhcnQgb2YgdGhlIERPQ1RZUEUgZGVjbGFyYXRpb24gd2hlbiB0aGUKKyAgIGNsb3NpbmcgPiBpcyBlbmNvdW50ZXJlZCwgYnV0IGFmdGVyIHByb2Nlc3NpbmcgYW55IGV4dGVybmFsCisgICBzdWJzZXQuCisqLwordHlwZWRlZiB2b2lkIChYTUxDQUxMICpYTUxfRW5kRG9jdHlwZURlY2xIYW5kbGVyKSh2b2lkICp1c2VyRGF0YSk7CisKKy8qIFRoaXMgaXMgY2FsbGVkIGZvciBlbnRpdHkgZGVjbGFyYXRpb25zLiBUaGUgaXNfcGFyYW1ldGVyX2VudGl0eQorICAgYXJndW1lbnQgd2lsbCBiZSBub24temVybyBpZiB0aGUgZW50aXR5IGlzIGEgcGFyYW1ldGVyIGVudGl0eSwgemVybworICAgb3RoZXJ3aXNlLgorCisgICBGb3IgaW50ZXJuYWwgZW50aXRpZXMgKDwhRU5USVRZIGZvbyAiYmFyIj4pLCB2YWx1ZSB3aWxsCisgICBiZSBub24tTlVMTCBhbmQgc3lzdGVtSWQsIHB1YmxpY0lELCBhbmQgbm90YXRpb25OYW1lIHdpbGwgYmUgTlVMTC4KKyAgIFRoZSB2YWx1ZSBzdHJpbmcgaXMgTk9UIG51bC10ZXJtaW5hdGVkOyB0aGUgbGVuZ3RoIGlzIHByb3ZpZGVkIGluCisgICB0aGUgdmFsdWVfbGVuZ3RoIGFyZ3VtZW50LiBTaW5jZSBpdCBpcyBsZWdhbCB0byBoYXZlIHplcm8tbGVuZ3RoCisgICB2YWx1ZXMsIGRvIG5vdCB1c2UgdGhpcyBhcmd1bWVudCB0byB0ZXN0IGZvciBpbnRlcm5hbCBlbnRpdGllcy4KKworICAgRm9yIGV4dGVybmFsIGVudGl0aWVzLCB2YWx1ZSB3aWxsIGJlIE5VTEwgYW5kIHN5c3RlbUlkIHdpbGwgYmUKKyAgIG5vbi1OVUxMLiBUaGUgcHVibGljSWQgYXJndW1lbnQgd2lsbCBiZSBOVUxMIHVubGVzcyBhIHB1YmxpYworICAgaWRlbnRpZmllciB3YXMgcHJvdmlkZWQuIFRoZSBub3RhdGlvbk5hbWUgYXJndW1lbnQgd2lsbCBoYXZlIGEKKyAgIG5vbi1OVUxMIHZhbHVlIG9ubHkgZm9yIHVucGFyc2VkIGVudGl0eSBkZWNsYXJhdGlvbnMuCisKKyAgIE5vdGUgdGhhdCBpc19wYXJhbWV0ZXJfZW50aXR5IGNhbid0IGJlIGNoYW5nZWQgdG8gWE1MX0Jvb2wsIHNpbmNlCisgICB0aGF0IHdvdWxkIGJyZWFrIGJpbmFyeSBjb21wYXRpYmlsaXR5LgorKi8KK3R5cGVkZWYgdm9pZCAoWE1MQ0FMTCAqWE1MX0VudGl0eURlY2xIYW5kbGVyKSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICplbnRpdHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX3BhcmFtZXRlcl9lbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWVfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqc3lzdGVtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHVibGljSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbm90YXRpb25OYW1lKTsKKworWE1MUEFSU0VBUEkodm9pZCkKK1hNTF9TZXRFbnRpdHlEZWNsSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfRW50aXR5RGVjbEhhbmRsZXIgaGFuZGxlcik7CisKKy8qIE9CU09MRVRFIC0tIE9CU09MRVRFIC0tIE9CU09MRVRFCisgICBUaGlzIGhhbmRsZXIgaGFzIGJlZW4gc3VwZXJjZWRlZCBieSB0aGUgRW50aXR5RGVjbEhhbmRsZXIgYWJvdmUuCisgICBJdCBpcyBwcm92aWRlZCBoZXJlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorCisgICBUaGlzIGlzIGNhbGxlZCBmb3IgYSBkZWNsYXJhdGlvbiBvZiBhbiB1bnBhcnNlZCAoTkRBVEEpIGVudGl0eS4KKyAgIFRoZSBiYXNlIGFyZ3VtZW50IGlzIHdoYXRldmVyIHdhcyBzZXQgYnkgWE1MX1NldEJhc2UuIFRoZQorICAgZW50aXR5TmFtZSwgc3lzdGVtSWQgYW5kIG5vdGF0aW9uTmFtZSBhcmd1bWVudHMgd2lsbCBuZXZlciBiZQorICAgTlVMTC4gVGhlIG90aGVyIGFyZ3VtZW50cyBtYXkgYmUuCisqLwordHlwZWRlZiB2b2lkIChYTUxDQUxMICpYTUxfVW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlcikgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqZW50aXR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnB1YmxpY0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5vdGF0aW9uTmFtZSk7CisKKy8qIFRoaXMgaXMgY2FsbGVkIGZvciBhIGRlY2xhcmF0aW9uIG9mIG5vdGF0aW9uLiAgVGhlIGJhc2UgYXJndW1lbnQgaXMKKyAgIHdoYXRldmVyIHdhcyBzZXQgYnkgWE1MX1NldEJhc2UuIFRoZSBub3RhdGlvbk5hbWUgd2lsbCBuZXZlciBiZQorICAgTlVMTC4gIFRoZSBvdGhlciBhcmd1bWVudHMgY2FuIGJlLgorKi8KK3R5cGVkZWYgdm9pZCAoWE1MQ0FMTCAqWE1MX05vdGF0aW9uRGVjbEhhbmRsZXIpICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5vdGF0aW9uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnB1YmxpY0lkKTsKKworLyogV2hlbiBuYW1lc3BhY2UgcHJvY2Vzc2luZyBpcyBlbmFibGVkLCB0aGVzZSBhcmUgY2FsbGVkIG9uY2UgZm9yCisgICBlYWNoIG5hbWVzcGFjZSBkZWNsYXJhdGlvbi4gVGhlIGNhbGwgdG8gdGhlIHN0YXJ0IGFuZCBlbmQgZWxlbWVudAorICAgaGFuZGxlcnMgb2NjdXIgYmV0d2VlbiB0aGUgY2FsbHMgdG8gdGhlIHN0YXJ0IGFuZCBlbmQgbmFtZXNwYWNlCisgICBkZWNsYXJhdGlvbiBoYW5kbGVycy4gRm9yIGFuIHhtbG5zIGF0dHJpYnV0ZSwgcHJlZml4IHdpbGwgYmUKKyAgIE5VTEwuICBGb3IgYW4geG1sbnM9IiIgYXR0cmlidXRlLCB1cmkgd2lsbCBiZSBOVUxMLgorKi8KK3R5cGVkZWYgdm9pZCAoWE1MQ0FMTCAqWE1MX1N0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIpICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICp1cmkpOworCit0eXBlZGVmIHZvaWQgKFhNTENBTEwgKlhNTF9FbmROYW1lc3BhY2VEZWNsSGFuZGxlcikgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHJlZml4KTsKKworLyogVGhpcyBpcyBjYWxsZWQgaWYgdGhlIGRvY3VtZW50IGlzIG5vdCBzdGFuZGFsb25lLCB0aGF0IGlzLCBpdCBoYXMgYW4KKyAgIGV4dGVybmFsIHN1YnNldCBvciBhIHJlZmVyZW5jZSB0byBhIHBhcmFtZXRlciBlbnRpdHksIGJ1dCBkb2VzIG5vdAorICAgaGF2ZSBzdGFuZGFsb25lPSJ5ZXMiLiBJZiB0aGlzIGhhbmRsZXIgcmV0dXJucyBYTUxfU1RBVFVTX0VSUk9SLAorICAgdGhlbiBwcm9jZXNzaW5nIHdpbGwgbm90IGNvbnRpbnVlLCBhbmQgdGhlIHBhcnNlciB3aWxsIHJldHVybiBhCisgICBYTUxfRVJST1JfTk9UX1NUQU5EQUxPTkUgZXJyb3IuCisgICBJZiBwYXJhbWV0ZXIgZW50aXR5IHBhcnNpbmcgaXMgZW5hYmxlZCwgdGhlbiBpbiBhZGRpdGlvbiB0byB0aGUKKyAgIGNvbmRpdGlvbnMgYWJvdmUgdGhpcyBoYW5kbGVyIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgdGhlIHJlZmVyZW5jZWQKKyAgIGVudGl0eSB3YXMgYWN0dWFsbHkgcmVhZC4KKyovCit0eXBlZGVmIGludCAoWE1MQ0FMTCAqWE1MX05vdFN0YW5kYWxvbmVIYW5kbGVyKSAodm9pZCAqdXNlckRhdGEpOworCisvKiBUaGlzIGlzIGNhbGxlZCBmb3IgYSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgcGFyc2VkIGdlbmVyYWwKKyAgIGVudGl0eS4gIFRoZSByZWZlcmVuY2VkIGVudGl0eSBpcyBub3QgYXV0b21hdGljYWxseSBwYXJzZWQuICBUaGUKKyAgIGFwcGxpY2F0aW9uIGNhbiBwYXJzZSBpdCBpbW1lZGlhdGVseSBvciBsYXRlciB1c2luZworICAgWE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlLgorCisgICBUaGUgcGFyc2VyIGFyZ3VtZW50IGlzIHRoZSBwYXJzZXIgcGFyc2luZyB0aGUgZW50aXR5IGNvbnRhaW5pbmcgdGhlCisgICByZWZlcmVuY2U7IGl0IGNhbiBiZSBwYXNzZWQgYXMgdGhlIHBhcnNlciBhcmd1bWVudCB0bworICAgWE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlLiAgVGhlIHN5c3RlbUlkIGFyZ3VtZW50IGlzIHRoZQorICAgc3lzdGVtIGlkZW50aWZpZXIgYXMgc3BlY2lmaWVkIGluIHRoZSBlbnRpdHkgZGVjbGFyYXRpb247IGl0IHdpbGwKKyAgIG5vdCBiZSBOVUxMLgorCisgICBUaGUgYmFzZSBhcmd1bWVudCBpcyB0aGUgc3lzdGVtIGlkZW50aWZpZXIgdGhhdCBzaG91bGQgYmUgdXNlZCBhcworICAgdGhlIGJhc2UgZm9yIHJlc29sdmluZyBzeXN0ZW1JZCBpZiBzeXN0ZW1JZCB3YXMgcmVsYXRpdmU7IHRoaXMgaXMKKyAgIHNldCBieSBYTUxfU2V0QmFzZTsgaXQgbWF5IGJlIE5VTEwuCisKKyAgIFRoZSBwdWJsaWNJZCBhcmd1bWVudCBpcyB0aGUgcHVibGljIGlkZW50aWZpZXIgYXMgc3BlY2lmaWVkIGluIHRoZQorICAgZW50aXR5IGRlY2xhcmF0aW9uLCBvciBOVUxMIGlmIG5vbmUgd2FzIHNwZWNpZmllZDsgdGhlIHdoaXRlc3BhY2UKKyAgIGluIHRoZSBwdWJsaWMgaWRlbnRpZmllciB3aWxsIGhhdmUgYmVlbiBub3JtYWxpemVkIGFzIHJlcXVpcmVkIGJ5CisgICB0aGUgWE1MIHNwZWMuCisKKyAgIFRoZSBjb250ZXh0IGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgcGFyc2luZyBjb250ZXh0IGluIHRoZSBmb3JtYXQKKyAgIGV4cGVjdGVkIGJ5IHRoZSBjb250ZXh0IGFyZ3VtZW50IHRvIFhNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZTsKKyAgIGNvbnRleHQgaXMgdmFsaWQgb25seSB1bnRpbCB0aGUgaGFuZGxlciByZXR1cm5zLCBzbyBpZiB0aGUKKyAgIHJlZmVyZW5jZWQgZW50aXR5IGlzIHRvIGJlIHBhcnNlZCBsYXRlciwgaXQgbXVzdCBiZSBjb3BpZWQuCisgICBjb250ZXh0IGlzIE5VTEwgb25seSB3aGVuIHRoZSBlbnRpdHkgaXMgYSBwYXJhbWV0ZXIgZW50aXR5LgorCisgICBUaGUgaGFuZGxlciBzaG91bGQgcmV0dXJuIFhNTF9TVEFUVVNfRVJST1IgaWYgcHJvY2Vzc2luZyBzaG91bGQgbm90CisgICBjb250aW51ZSBiZWNhdXNlIG9mIGEgZmF0YWwgZXJyb3IgaW4gdGhlIGhhbmRsaW5nIG9mIHRoZSBleHRlcm5hbAorICAgZW50aXR5LiAgSW4gdGhpcyBjYXNlIHRoZSBjYWxsaW5nIHBhcnNlciB3aWxsIHJldHVybiBhbgorICAgWE1MX0VSUk9SX0VYVEVSTkFMX0VOVElUWV9IQU5ETElORyBlcnJvci4KKworICAgTm90ZSB0aGF0IHVubGlrZSBvdGhlciBoYW5kbGVycyB0aGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIHBhcnNlciwKKyAgIG5vdCB1c2VyRGF0YS4KKyovCit0eXBlZGVmIGludCAoWE1MQ0FMTCAqWE1MX0V4dGVybmFsRW50aXR5UmVmSGFuZGxlcikgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnB1YmxpY0lkKTsKKworLyogVGhpcyBpcyBjYWxsZWQgaW4gdHdvIHNpdHVhdGlvbnM6CisgICAxKSBBbiBlbnRpdHkgcmVmZXJlbmNlIGlzIGVuY291bnRlcmVkIGZvciB3aGljaCBubyBkZWNsYXJhdGlvbgorICAgICAgaGFzIGJlZW4gcmVhZCAqYW5kKiB0aGlzIGlzIG5vdCBhbiBlcnJvci4KKyAgIDIpIEFuIGludGVybmFsIGVudGl0eSByZWZlcmVuY2UgaXMgcmVhZCwgYnV0IG5vdCBleHBhbmRlZCwgYmVjYXVzZQorICAgICAgWE1MX1NldERlZmF1bHRIYW5kbGVyIGhhcyBiZWVuIGNhbGxlZC4KKyAgIE5vdGU6IHNraXBwZWQgcGFyYW1ldGVyIGVudGl0aWVzIGluIGRlY2xhcmF0aW9ucyBhbmQgc2tpcHBlZCBnZW5lcmFsCisgICAgICAgICBlbnRpdGllcyBpbiBhdHRyaWJ1dGUgdmFsdWVzIGNhbm5vdCBiZSByZXBvcnRlZCwgYmVjYXVzZQorICAgICAgICAgdGhlIGV2ZW50IHdvdWxkIGJlIG91dCBvZiBzeW5jIHdpdGggdGhlIHJlcG9ydGluZyBvZiB0aGUKKyAgICAgICAgIGRlY2xhcmF0aW9ucyBvciBhdHRyaWJ1dGUgdmFsdWVzCisqLwordHlwZWRlZiB2b2lkIChYTUxDQUxMICpYTUxfU2tpcHBlZEVudGl0eUhhbmRsZXIpICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmVudGl0eU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfcGFyYW1ldGVyX2VudGl0eSk7CisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIGZpbGxlZCBpbiBieSB0aGUgWE1MX1Vua25vd25FbmNvZGluZ0hhbmRsZXIgdG8KKyAgIHByb3ZpZGUgaW5mb3JtYXRpb24gdG8gdGhlIHBhcnNlciBhYm91dCBlbmNvZGluZ3MgdGhhdCBhcmUgdW5rbm93bgorICAgdG8gdGhlIHBhcnNlci4KKworICAgVGhlIG1hcFtiXSBtZW1iZXIgZ2l2ZXMgaW5mb3JtYXRpb24gYWJvdXQgYnl0ZSBzZXF1ZW5jZXMgd2hvc2UKKyAgIGZpcnN0IGJ5dGUgaXMgYi4KKworICAgSWYgbWFwW2JdIGlzIGMgd2hlcmUgYyBpcyA+PSAwLCB0aGVuIGIgYnkgaXRzZWxmIGVuY29kZXMgdGhlCisgICBVbmljb2RlIHNjYWxhciB2YWx1ZSBjLgorCisgICBJZiBtYXBbYl0gaXMgLTEsIHRoZW4gdGhlIGJ5dGUgc2VxdWVuY2UgaXMgbWFsZm9ybWVkLgorCisgICBJZiBtYXBbYl0gaXMgLW4sIHdoZXJlIG4gPj0gMiwgdGhlbiBiIGlzIHRoZSBmaXJzdCBieXRlIG9mIGFuCisgICBuLWJ5dGUgc2VxdWVuY2UgdGhhdCBlbmNvZGVzIGEgc2luZ2xlIFVuaWNvZGUgc2NhbGFyIHZhbHVlLgorCisgICBUaGUgZGF0YSBtZW1iZXIgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBjb252ZXJ0CisgICBmdW5jdGlvbi4KKworICAgVGhlIGNvbnZlcnQgZnVuY3Rpb24gaXMgdXNlZCB0byBjb252ZXJ0IG11bHRpYnl0ZSBzZXF1ZW5jZXM7IHMgd2lsbAorICAgcG9pbnQgdG8gYSBuLWJ5dGUgc2VxdWVuY2Ugd2hlcmUgbWFwWyh1bnNpZ25lZCBjaGFyKSpzXSA9PSAtbi4gIFRoZQorICAgY29udmVydCBmdW5jdGlvbiBtdXN0IHJldHVybiB0aGUgVW5pY29kZSBzY2FsYXIgdmFsdWUgcmVwcmVzZW50ZWQKKyAgIGJ5IHRoaXMgYnl0ZSBzZXF1ZW5jZSBvciAtMSBpZiB0aGUgYnl0ZSBzZXF1ZW5jZSBpcyBtYWxmb3JtZWQuCisKKyAgIFRoZSBjb252ZXJ0IGZ1bmN0aW9uIG1heSBiZSBOVUxMIGlmIHRoZSBlbmNvZGluZyBpcyBhIHNpbmdsZS1ieXRlCisgICBlbmNvZGluZywgdGhhdCBpcyBpZiBtYXBbYl0gPj0gLTEgZm9yIGFsbCBieXRlcyBiLgorCisgICBXaGVuIHRoZSBwYXJzZXIgaXMgZmluaXNoZWQgd2l0aCB0aGUgZW5jb2RpbmcsIHRoZW4gaWYgcmVsZWFzZSBpcworICAgbm90IE5VTEwsIGl0IHdpbGwgY2FsbCByZWxlYXNlIHBhc3NpbmcgaXQgdGhlIGRhdGEgbWVtYmVyOyBvbmNlCisgICByZWxlYXNlIGhhcyBiZWVuIGNhbGxlZCwgdGhlIGNvbnZlcnQgZnVuY3Rpb24gd2lsbCBub3QgYmUgY2FsbGVkCisgICBhZ2Fpbi4KKworICAgRXhwYXQgcGxhY2VzIGNlcnRhaW4gcmVzdHJpY3Rpb25zIG9uIHRoZSBlbmNvZGluZ3MgdGhhdCBhcmUgc3VwcG9ydGVkCisgICB1c2luZyB0aGlzIG1lY2hhbmlzbS4KKworICAgMS4gRXZlcnkgQVNDSUkgY2hhcmFjdGVyIHRoYXQgY2FuIGFwcGVhciBpbiBhIHdlbGwtZm9ybWVkIFhNTCBkb2N1bWVudCwKKyAgICAgIG90aGVyIHRoYW4gdGhlIGNoYXJhY3RlcnMKKworICAgICAgJEBcXmB7fX4KKworICAgICAgbXVzdCBiZSByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBieXRlLCBhbmQgdGhhdCBieXRlIG11c3QgYmUgdGhlCisgICAgICBzYW1lIGJ5dGUgdGhhdCByZXByZXNlbnRzIHRoYXQgY2hhcmFjdGVyIGluIEFTQ0lJLgorCisgICAyLiBObyBjaGFyYWN0ZXIgbWF5IHJlcXVpcmUgbW9yZSB0aGFuIDQgYnl0ZXMgdG8gZW5jb2RlLgorCisgICAzLiBBbGwgY2hhcmFjdGVycyBlbmNvZGVkIG11c3QgaGF2ZSBVbmljb2RlIHNjYWxhciB2YWx1ZXMgPD0KKyAgICAgIDB4RkZGRiwgKGkuZS4sIGNoYXJhY3RlcnMgdGhhdCB3b3VsZCBiZSBlbmNvZGVkIGJ5IHN1cnJvZ2F0ZXMgaW4KKyAgICAgIFVURi0xNiBhcmUgIG5vdCBhbGxvd2VkKS4gIE5vdGUgdGhhdCB0aGlzIHJlc3RyaWN0aW9uIGRvZXNuJ3QKKyAgICAgIGFwcGx5IHRvIHRoZSBidWlsdC1pbiBzdXBwb3J0IGZvciBVVEYtOCBhbmQgVVRGLTE2LgorCisgICA0LiBObyBVbmljb2RlIGNoYXJhY3RlciBtYXkgYmUgZW5jb2RlZCBieSBtb3JlIHRoYW4gb25lIGRpc3RpbmN0CisgICAgICBzZXF1ZW5jZSBvZiBieXRlcy4KKyovCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBtYXBbMjU2XTsKKyAgdm9pZCAqZGF0YTsKKyAgaW50IChYTUxDQUxMICpjb252ZXJ0KSh2b2lkICpkYXRhLCBjb25zdCBjaGFyICpzKTsKKyAgdm9pZCAoWE1MQ0FMTCAqcmVsZWFzZSkodm9pZCAqZGF0YSk7Cit9IFhNTF9FbmNvZGluZzsKKworLyogVGhpcyBpcyBjYWxsZWQgZm9yIGFuIGVuY29kaW5nIHRoYXQgaXMgdW5rbm93biB0byB0aGUgcGFyc2VyLgorCisgICBUaGUgZW5jb2RpbmdIYW5kbGVyRGF0YSBhcmd1bWVudCBpcyB0aGF0IHdoaWNoIHdhcyBwYXNzZWQgYXMgdGhlCisgICBzZWNvbmQgYXJndW1lbnQgdG8gWE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXIuCisKKyAgIFRoZSBuYW1lIGFyZ3VtZW50IGdpdmVzIHRoZSBuYW1lIG9mIHRoZSBlbmNvZGluZyBhcyBzcGVjaWZpZWQgaW4KKyAgIHRoZSBlbmNvZGluZyBkZWNsYXJhdGlvbi4KKworICAgSWYgdGhlIGNhbGxiYWNrIGNhbiBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlbmNvZGluZywgaXQgbXVzdAorICAgZmlsbCBpbiB0aGUgWE1MX0VuY29kaW5nIHN0cnVjdHVyZSwgYW5kIHJldHVybiBYTUxfU1RBVFVTX09LLgorICAgT3RoZXJ3aXNlIGl0IG11c3QgcmV0dXJuIFhNTF9TVEFUVVNfRVJST1IuCisKKyAgIElmIGluZm8gZG9lcyBub3QgZGVzY3JpYmUgYSBzdWl0YWJsZSBlbmNvZGluZywgdGhlbiB0aGUgcGFyc2VyIHdpbGwKKyAgIHJldHVybiBhbiBYTUxfVU5LTk9XTl9FTkNPRElORyBlcnJvci4KKyovCit0eXBlZGVmIGludCAoWE1MQ0FMTCAqWE1MX1Vua25vd25FbmNvZGluZ0hhbmRsZXIpICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmVuY29kaW5nSGFuZGxlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmNvZGluZyAqaW5mbyk7CisKK1hNTFBBUlNFQVBJKHZvaWQpCitYTUxfU2V0RWxlbWVudEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgWE1MX1N0YXJ0RWxlbWVudEhhbmRsZXIgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgWE1MX0VuZEVsZW1lbnRIYW5kbGVyIGVuZCk7CisKK1hNTFBBUlNFQVBJKHZvaWQpCitYTUxfU2V0U3RhcnRFbGVtZW50SGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9TdGFydEVsZW1lbnRIYW5kbGVyIGhhbmRsZXIpOworCitYTUxQQVJTRUFQSSh2b2lkKQorWE1MX1NldEVuZEVsZW1lbnRIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmRFbGVtZW50SGFuZGxlciBoYW5kbGVyKTsKKworWE1MUEFSU0VBUEkodm9pZCkKK1hNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfQ2hhcmFjdGVyRGF0YUhhbmRsZXIgaGFuZGxlcik7CisKK1hNTFBBUlNFQVBJKHZvaWQpCitYTUxfU2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyIGhhbmRsZXIpOworWE1MUEFSU0VBUEkodm9pZCkKK1hNTF9TZXRDb21tZW50SGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICBYTUxfQ29tbWVudEhhbmRsZXIgaGFuZGxlcik7CisKK1hNTFBBUlNFQVBJKHZvaWQpCitYTUxfU2V0Q2RhdGFTZWN0aW9uSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9TdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfRW5kQ2RhdGFTZWN0aW9uSGFuZGxlciBlbmQpOworCitYTUxQQVJTRUFQSSh2b2lkKQorWE1MX1NldFN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1N0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlciBzdGFydCk7CisKK1hNTFBBUlNFQVBJKHZvaWQpCitYTUxfU2V0RW5kQ2RhdGFTZWN0aW9uSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmRDZGF0YVNlY3Rpb25IYW5kbGVyIGVuZCk7CisKKy8qIFRoaXMgc2V0cyB0aGUgZGVmYXVsdCBoYW5kbGVyIGFuZCBhbHNvIGluaGliaXRzIGV4cGFuc2lvbiBvZgorICAgaW50ZXJuYWwgZW50aXRpZXMuIFRoZXNlIGVudGl0eSByZWZlcmVuY2VzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZQorICAgZGVmYXVsdCBoYW5kbGVyLCBvciB0byB0aGUgc2tpcHBlZCBlbnRpdHkgaGFuZGxlciwgaWYgb25lIGlzIHNldC4KKyovCitYTUxQQVJTRUFQSSh2b2lkKQorWE1MX1NldERlZmF1bHRIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgIFhNTF9EZWZhdWx0SGFuZGxlciBoYW5kbGVyKTsKKworLyogVGhpcyBzZXRzIHRoZSBkZWZhdWx0IGhhbmRsZXIgYnV0IGRvZXMgbm90IGluaGliaXQgZXhwYW5zaW9uIG9mCisgICBpbnRlcm5hbCBlbnRpdGllcy4gIFRoZSBlbnRpdHkgcmVmZXJlbmNlIHdpbGwgbm90IGJlIHBhc3NlZCB0byB0aGUKKyAgIGRlZmF1bHQgaGFuZGxlci4KKyovCitYTUxQQVJTRUFQSSh2b2lkKQorWE1MX1NldERlZmF1bHRIYW5kbGVyRXhwYW5kKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9EZWZhdWx0SGFuZGxlciBoYW5kbGVyKTsKKworWE1MUEFSU0VBUEkodm9pZCkKK1hNTF9TZXREb2N0eXBlRGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9TdGFydERvY3R5cGVEZWNsSGFuZGxlciBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0VuZERvY3R5cGVEZWNsSGFuZGxlciBlbmQpOworCitYTUxQQVJTRUFQSSh2b2lkKQorWE1MX1NldFN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9TdGFydERvY3R5cGVEZWNsSGFuZGxlciBzdGFydCk7CisKK1hNTFBBUlNFQVBJKHZvaWQpCitYTUxfU2V0RW5kRG9jdHlwZURlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfRW5kRG9jdHlwZURlY2xIYW5kbGVyIGVuZCk7CisKK1hNTFBBUlNFQVBJKHZvaWQpCitYTUxfU2V0VW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9VbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyIGhhbmRsZXIpOworCitYTUxQQVJTRUFQSSh2b2lkKQorWE1MX1NldE5vdGF0aW9uRGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfTm90YXRpb25EZWNsSGFuZGxlciBoYW5kbGVyKTsKKworWE1MUEFSU0VBUEkodm9pZCkKK1hNTF9TZXROYW1lc3BhY2VEZWNsSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfU3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfRW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIgZW5kKTsKKworWE1MUEFSU0VBUEkodm9pZCkKK1hNTF9TZXRTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1N0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIgc3RhcnQpOworCitYTUxQQVJTRUFQSSh2b2lkKQorWE1MX1NldEVuZE5hbWVzcGFjZURlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmROYW1lc3BhY2VEZWNsSGFuZGxlciBlbmQpOworCitYTUxQQVJTRUFQSSh2b2lkKQorWE1MX1NldE5vdFN0YW5kYWxvbmVIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9Ob3RTdGFuZGFsb25lSGFuZGxlciBoYW5kbGVyKTsKKworWE1MUEFSU0VBUEkodm9pZCkKK1hNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIgaGFuZGxlcik7CisKKy8qIElmIGEgbm9uLU5VTEwgdmFsdWUgZm9yIGFyZyBpcyBzcGVjaWZpZWQgaGVyZSwgdGhlbiBpdCB3aWxsIGJlCisgICBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBleHRlcm5hbCBlbnRpdHkgcmVmIGhhbmRsZXIKKyAgIGluc3RlYWQgb2YgdGhlIHBhcnNlciBvYmplY3QuCisqLworWE1MUEFSU0VBUEkodm9pZCkKK1hNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZyk7CisKK1hNTFBBUlNFQVBJKHZvaWQpCitYTUxfU2V0U2tpcHBlZEVudGl0eUhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1NraXBwZWRFbnRpdHlIYW5kbGVyIGhhbmRsZXIpOworCitYTUxQQVJTRUFQSSh2b2lkKQorWE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfVW5rbm93bkVuY29kaW5nSGFuZGxlciBoYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZW5jb2RpbmdIYW5kbGVyRGF0YSk7CisKKy8qIFRoaXMgY2FuIGJlIGNhbGxlZCB3aXRoaW4gYSBoYW5kbGVyIGZvciBhIHN0YXJ0IGVsZW1lbnQsIGVuZAorICAgZWxlbWVudCwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBvciBjaGFyYWN0ZXIgZGF0YS4gIEl0IGNhdXNlcyB0aGUKKyAgIGNvcnJlc3BvbmRpbmcgbWFya3VwIHRvIGJlIHBhc3NlZCB0byB0aGUgZGVmYXVsdCBoYW5kbGVyLgorKi8KK1hNTFBBUlNFQVBJKHZvaWQpCitYTUxfRGVmYXVsdEN1cnJlbnQoWE1MX1BhcnNlciBwYXJzZXIpOworCisvKiBJZiBkb19uc3QgaXMgbm9uLXplcm8sIGFuZCBuYW1lc3BhY2UgcHJvY2Vzc2luZyBpcyBpbiBlZmZlY3QsIGFuZAorICAgYSBuYW1lIGhhcyBhIHByZWZpeCAoaS5lLiBhbiBleHBsaWNpdCBuYW1lc3BhY2UgcXVhbGlmaWVyKSB0aGVuCisgICB0aGF0IG5hbWUgaXMgcmV0dXJuZWQgYXMgYSB0cmlwbGV0IGluIGEgc2luZ2xlIHN0cmluZyBzZXBhcmF0ZWQgYnkKKyAgIHRoZSBzZXBhcmF0b3IgY2hhcmFjdGVyIHNwZWNpZmllZCB3aGVuIHRoZSBwYXJzZXIgd2FzIGNyZWF0ZWQ6IFVSSQorICAgKyBzZXAgKyBsb2NhbF9uYW1lICsgc2VwICsgcHJlZml4LgorCisgICBJZiBkb19uc3QgaXMgemVybywgdGhlbiBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlCisgICBkZWZhdWx0IG1hbm5lciAoVVJJICsgc2VwICsgbG9jYWxfbmFtZSkgd2hldGhlciBvciBub3QgdGhlIG5hbWUKKyAgIGhhcyBhIHByZWZpeC4KKworICAgTm90ZTogQ2FsbGluZyBYTUxfU2V0UmV0dXJuTlNUcmlwbGV0IGFmdGVyIFhNTF9QYXJzZSBvcgorICAgICBYTUxfUGFyc2VCdWZmZXIgaGFzIG5vIGVmZmVjdC4KKyovCisKK1hNTFBBUlNFQVBJKHZvaWQpCitYTUxfU2V0UmV0dXJuTlNUcmlwbGV0KFhNTF9QYXJzZXIgcGFyc2VyLCBpbnQgZG9fbnN0KTsKKworLyogVGhpcyB2YWx1ZSBpcyBwYXNzZWQgYXMgdGhlIHVzZXJEYXRhIGFyZ3VtZW50IHRvIGNhbGxiYWNrcy4gKi8KK1hNTFBBUlNFQVBJKHZvaWQpCitYTUxfU2V0VXNlckRhdGEoWE1MX1BhcnNlciBwYXJzZXIsIHZvaWQgKnVzZXJEYXRhKTsKKworLyogUmV0dXJucyB0aGUgbGFzdCB2YWx1ZSBzZXQgYnkgWE1MX1NldFVzZXJEYXRhIG9yIE5VTEwuICovCisjZGVmaW5lIFhNTF9HZXRVc2VyRGF0YShwYXJzZXIpICgqKHZvaWQgKiopKHBhcnNlcikpCisKKy8qIFRoaXMgaXMgZXF1aXZhbGVudCB0byBzdXBwbHlpbmcgYW4gZW5jb2RpbmcgYXJndW1lbnQgdG8KKyAgIFhNTF9QYXJzZXJDcmVhdGUuIE9uIHN1Y2Nlc3MgWE1MX1NldEVuY29kaW5nIHJldHVybnMgbm9uLXplcm8sCisgICB6ZXJvIG90aGVyd2lzZS4KKyAgIE5vdGU6IENhbGxpbmcgWE1MX1NldEVuY29kaW5nIGFmdGVyIFhNTF9QYXJzZSBvciBYTUxfUGFyc2VCdWZmZXIKKyAgICAgaGFzIG5vIGVmZmVjdCBhbmQgcmV0dXJucyBYTUxfU1RBVFVTX0VSUk9SLgorKi8KK1hNTFBBUlNFQVBJKGVudW0gWE1MX1N0YXR1cykKK1hNTF9TZXRFbmNvZGluZyhYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgWE1MX0NoYXIgKmVuY29kaW5nKTsKKworLyogSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoZW4gdGhlIHBhcnNlciB3aWxsIGJlIHBhc3NlZCBhcyB0aGUKKyAgIGZpcnN0IGFyZ3VtZW50IHRvIGNhbGxiYWNrcyBpbnN0ZWFkIG9mIHVzZXJEYXRhLiAgVGhlIHVzZXJEYXRhIHdpbGwKKyAgIHN0aWxsIGJlIGFjY2Vzc2libGUgdXNpbmcgWE1MX0dldFVzZXJEYXRhLgorKi8KK1hNTFBBUlNFQVBJKHZvaWQpCitYTUxfVXNlUGFyc2VyQXNIYW5kbGVyQXJnKFhNTF9QYXJzZXIgcGFyc2VyKTsKKworLyogSWYgdXNlRFREID09IFhNTF9UUlVFIGlzIHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uLCB0aGVuIHRoZSBwYXJzZXIKKyAgIHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgaXMgYW4gZXh0ZXJuYWwgc3Vic2V0LCBldmVuIGlmIG5vbmUgaXMKKyAgIHNwZWNpZmllZCBpbiB0aGUgZG9jdW1lbnQuIEluIHN1Y2ggYSBjYXNlIHRoZSBwYXJzZXIgd2lsbCBjYWxsIHRoZQorICAgZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIHdpdGggYSB2YWx1ZSBvZiBOVUxMIGZvciB0aGUgc3lzdGVtSWQKKyAgIGFyZ3VtZW50ICh0aGUgcHVibGljSWQgYW5kIGNvbnRleHQgYXJndW1lbnRzIHdpbGwgYmUgTlVMTCBhcyB3ZWxsKS4KKyAgIE5vdGU6IEZvciB0aGUgcHVycG9zZSBvZiBjaGVja2luZyBXRkM6IEVudGl0eSBEZWNsYXJlZCwgcGFzc2luZworICAgICB1c2VEVEQgPT0gWE1MX1RSVUUgd2lsbCBtYWtlIHRoZSBwYXJzZXIgYmVoYXZlIGFzIGlmIHRoZSBkb2N1bWVudAorICAgICBoYWQgYSBEVEQgd2l0aCBhbiBleHRlcm5hbCBzdWJzZXQuCisgICBOb3RlOiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlbiB0aGlzIG11c3QgYmUgZG9uZSBiZWZvcmUKKyAgICAgdGhlIGZpcnN0IGNhbGwgdG8gWE1MX1BhcnNlIG9yIFhNTF9QYXJzZUJ1ZmZlciwgc2luY2UgaXQgd2lsbAorICAgICBoYXZlIG5vIGVmZmVjdCBhZnRlciB0aGF0LiAgUmV0dXJucworICAgICBYTUxfRVJST1JfQ0FOVF9DSEFOR0VfRkVBVFVSRV9PTkNFX1BBUlNJTkcuCisgICBOb3RlOiBJZiB0aGUgZG9jdW1lbnQgZG9lcyBub3QgaGF2ZSBhIERPQ1RZUEUgZGVjbGFyYXRpb24gYXQgYWxsLAorICAgICB0aGVuIHN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyIGFuZCBlbmREb2N0eXBlRGVjbEhhbmRsZXIgd2lsbCBub3QKKyAgICAgYmUgY2FsbGVkLCBkZXNwaXRlIGFuIGV4dGVybmFsIHN1YnNldCBiZWluZyBwYXJzZWQuCisgICBOb3RlOiBJZiBYTUxfRFREIGlzIG5vdCBkZWZpbmVkIHdoZW4gRXhwYXQgaXMgY29tcGlsZWQsIHJldHVybnMKKyAgICAgWE1MX0VSUk9SX0ZFQVRVUkVfUkVRVUlSRVNfWE1MX0RURC4KKyovCitYTUxQQVJTRUFQSShlbnVtIFhNTF9FcnJvcikKK1hNTF9Vc2VGb3JlaWduRFREKFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfQm9vbCB1c2VEVEQpOworCisKKy8qIFNldHMgdGhlIGJhc2UgdG8gYmUgdXNlZCBmb3IgcmVzb2x2aW5nIHJlbGF0aXZlIFVSSXMgaW4gc3lzdGVtCisgICBpZGVudGlmaWVycyBpbiBkZWNsYXJhdGlvbnMuICBSZXNvbHZpbmcgcmVsYXRpdmUgaWRlbnRpZmllcnMgaXMKKyAgIGxlZnQgdG8gdGhlIGFwcGxpY2F0aW9uOiB0aGlzIHZhbHVlIHdpbGwgYmUgcGFzc2VkIHRocm91Z2ggYXMgdGhlCisgICBiYXNlIGFyZ3VtZW50IHRvIHRoZSBYTUxfRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyLAorICAgWE1MX05vdGF0aW9uRGVjbEhhbmRsZXIgYW5kIFhNTF9VbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyLiBUaGUgYmFzZQorICAgYXJndW1lbnQgd2lsbCBiZSBjb3BpZWQuICBSZXR1cm5zIFhNTF9TVEFUVVNfRVJST1IgaWYgb3V0IG9mIG1lbW9yeSwKKyAgIFhNTF9TVEFUVVNfT0sgb3RoZXJ3aXNlLgorKi8KK1hNTFBBUlNFQVBJKGVudW0gWE1MX1N0YXR1cykKK1hNTF9TZXRCYXNlKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBYTUxfQ2hhciAqYmFzZSk7CisKK1hNTFBBUlNFQVBJKGNvbnN0IFhNTF9DaGFyICopCitYTUxfR2V0QmFzZShYTUxfUGFyc2VyIHBhcnNlcik7CisKKy8qIFJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgYXR0cmlidXRlL3ZhbHVlIHBhaXJzIHBhc3NlZCBpbiBsYXN0IGNhbGwKKyAgIHRvIHRoZSBYTUxfU3RhcnRFbGVtZW50SGFuZGxlciB0aGF0IHdlcmUgc3BlY2lmaWVkIGluIHRoZSBzdGFydC10YWcKKyAgIHJhdGhlciB0aGFuIGRlZmF1bHRlZC4gRWFjaCBhdHRyaWJ1dGUvdmFsdWUgcGFpciBjb3VudHMgYXMgMjsgdGh1cworICAgdGhpcyBjb3JyZXNwb25kZHMgdG8gYW4gaW5kZXggaW50byB0aGUgYXR0cyBhcnJheSBwYXNzZWQgdG8gdGhlCisgICBYTUxfU3RhcnRFbGVtZW50SGFuZGxlci4KKyovCitYTUxQQVJTRUFQSShpbnQpCitYTUxfR2V0U3BlY2lmaWVkQXR0cmlidXRlQ291bnQoWE1MX1BhcnNlciBwYXJzZXIpOworCisvKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgSUQgYXR0cmlidXRlIHBhc3NlZCBpbiB0aGUgbGFzdCBjYWxsIHRvCisgICBYTUxfU3RhcnRFbGVtZW50SGFuZGxlciwgb3IgLTEgaWYgdGhlcmUgaXMgbm8gSUQgYXR0cmlidXRlLiAgRWFjaAorICAgYXR0cmlidXRlL3ZhbHVlIHBhaXIgY291bnRzIGFzIDI7IHRodXMgdGhpcyBjb3JyZXNwb25kZHMgdG8gYW4KKyAgIGluZGV4IGludG8gdGhlIGF0dHMgYXJyYXkgcGFzc2VkIHRvIHRoZSBYTUxfU3RhcnRFbGVtZW50SGFuZGxlci4KKyovCitYTUxQQVJTRUFQSShpbnQpCitYTUxfR2V0SWRBdHRyaWJ1dGVJbmRleChYTUxfUGFyc2VyIHBhcnNlcik7CisKKy8qIFBhcnNlcyBzb21lIGlucHV0LiBSZXR1cm5zIFhNTF9TVEFUVVNfRVJST1IgaWYgYSBmYXRhbCBlcnJvciBpcworICAgZGV0ZWN0ZWQuICBUaGUgbGFzdCBjYWxsIHRvIFhNTF9QYXJzZSBtdXN0IGhhdmUgaXNGaW5hbCB0cnVlOyBsZW4KKyAgIG1heSBiZSB6ZXJvIGZvciB0aGlzIGNhbGwgKG9yIGFueSBvdGhlcikuCisKKyAgIFRob3VnaCB0aGUgcmV0dXJuIHZhbHVlcyBmb3IgdGhlc2UgZnVuY3Rpb25zIGhhcyBhbHdheXMgYmVlbgorICAgZGVzY3JpYmVkIGFzIGEgQm9vbGVhbiB2YWx1ZSwgdGhlIGltcGxlbWVudGF0aW9uLCBhdCBsZWFzdCBmb3IgdGhlCisgICAxLjk1Lnggc2VyaWVzLCBoYXMgYWx3YXlzIHJldHVybmVkIGV4YWN0bHkgb25lIG9mIHRoZSBYTUxfU3RhdHVzCisgICB2YWx1ZXMuCisqLworWE1MUEFSU0VBUEkoZW51bSBYTUxfU3RhdHVzKQorWE1MX1BhcnNlKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBjaGFyICpzLCBpbnQgbGVuLCBpbnQgaXNGaW5hbCk7CisKK1hNTFBBUlNFQVBJKHZvaWQgKikKK1hNTF9HZXRCdWZmZXIoWE1MX1BhcnNlciBwYXJzZXIsIGludCBsZW4pOworCitYTUxQQVJTRUFQSShlbnVtIFhNTF9TdGF0dXMpCitYTUxfUGFyc2VCdWZmZXIoWE1MX1BhcnNlciBwYXJzZXIsIGludCBsZW4sIGludCBpc0ZpbmFsKTsKKworLyogU3RvcHMgcGFyc2luZywgY2F1c2luZyBYTUxfUGFyc2UoKSBvciBYTUxfUGFyc2VCdWZmZXIoKSB0byByZXR1cm4uCisgICBNdXN0IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhIGNhbGwtYmFjayBoYW5kbGVyLCBleGNlcHQgd2hlbiBhYm9ydGluZworICAgKHJlc3VtYWJsZSA9IDApIGFuIGFscmVhZHkgc3VzcGVuZGVkIHBhcnNlci4gU29tZSBjYWxsLWJhY2tzIG1heQorICAgc3RpbGwgZm9sbG93IGJlY2F1c2UgdGhleSB3b3VsZCBvdGhlcndpc2UgZ2V0IGxvc3QuIEV4YW1wbGVzOgorICAgLSBlbmRFbGVtZW50SGFuZGxlcigpIGZvciBlbXB0eSBlbGVtZW50cyB3aGVuIHN0b3BwZWQgaW4KKyAgICAgc3RhcnRFbGVtZW50SGFuZGxlcigpLCAKKyAgIC0gZW5kTmFtZVNwYWNlRGVjbEhhbmRsZXIoKSB3aGVuIHN0b3BwZWQgaW4gZW5kRWxlbWVudEhhbmRsZXIoKSwgCisgICBhbmQgcG9zc2libHkgb3RoZXJzLgorCisgICBDYW4gYmUgY2FsbGVkIGZyb20gbW9zdCBoYW5kbGVycywgaW5jbHVkaW5nIERURCByZWxhdGVkIGNhbGwtYmFja3MsCisgICBleGNlcHQgd2hlbiBwYXJzaW5nIGFuIGV4dGVybmFsIHBhcmFtZXRlciBlbnRpdHkgYW5kIHJlc3VtYWJsZSAhPSAwLgorICAgUmV0dXJucyBYTUxfU1RBVFVTX09LIHdoZW4gc3VjY2Vzc2Z1bCwgWE1MX1NUQVRVU19FUlJPUiBvdGhlcndpc2UuCisgICBQb3NzaWJsZSBlcnJvciBjb2RlczogCisgICAtIFhNTF9FUlJPUl9TVVNQRU5ERUQ6IHdoZW4gc3VzcGVuZGluZyBhbiBhbHJlYWR5IHN1c3BlbmRlZCBwYXJzZXIuCisgICAtIFhNTF9FUlJPUl9GSU5JU0hFRDogd2hlbiB0aGUgcGFyc2VyIGhhcyBhbHJlYWR5IGZpbmlzaGVkLgorICAgLSBYTUxfRVJST1JfU1VTUEVORF9QRTogd2hlbiBzdXNwZW5kaW5nIHdoaWxlIHBhcnNpbmcgYW4gZXh0ZXJuYWwgUEUuCisKKyAgIFdoZW4gcmVzdW1hYmxlICE9IDAgKHRydWUpIHRoZW4gcGFyc2luZyBpcyBzdXNwZW5kZWQsIHRoYXQgaXMsIAorICAgWE1MX1BhcnNlKCkgYW5kIFhNTF9QYXJzZUJ1ZmZlcigpIHJldHVybiBYTUxfU1RBVFVTX1NVU1BFTkRFRC4gCisgICBPdGhlcndpc2UsIHBhcnNpbmcgaXMgYWJvcnRlZCwgdGhhdCBpcywgWE1MX1BhcnNlKCkgYW5kIFhNTF9QYXJzZUJ1ZmZlcigpCisgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUiB3aXRoIGVycm9yIGNvZGUgWE1MX0VSUk9SX0FCT1JURUQuCisKKyAgICpOb3RlKjoKKyAgIFRoaXMgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBjdXJyZW50IHBhcnNlciBpbnN0YW5jZSBvbmx5LCB0aGF0IGlzLCBpZgorICAgdGhlcmUgaXMgYSBwYXJlbnQgcGFyc2VyIHRoZW4gaXQgd2lsbCBjb250aW51ZSBwYXJzaW5nIHdoZW4gdGhlCisgICBleHRlcm5hbEVudGl0eVJlZkhhbmRsZXIoKSByZXR1cm5zLiBJdCBpcyB1cCB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YKKyAgIHRoZSBleHRlcm5hbEVudGl0eVJlZkhhbmRsZXIoKSB0byBjYWxsIFhNTF9TdG9wUGFyc2VyKCkgb24gdGhlIHBhcmVudAorICAgcGFyc2VyIChyZWN1cnNpdmVseSksIGlmIG9uZSB3YW50cyB0byBzdG9wIHBhcnNpbmcgYWx0b2dldGhlci4KKworICAgV2hlbiBzdXNwZW5kZWQsIHBhcnNpbmcgY2FuIGJlIHJlc3VtZWQgYnkgY2FsbGluZyBYTUxfUmVzdW1lUGFyc2VyKCkuIAorKi8KK1hNTFBBUlNFQVBJKGVudW0gWE1MX1N0YXR1cykKK1hNTF9TdG9wUGFyc2VyKFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfQm9vbCByZXN1bWFibGUpOworCisvKiBSZXN1bWVzIHBhcnNpbmcgYWZ0ZXIgaXQgaGFzIGJlZW4gc3VzcGVuZGVkIHdpdGggWE1MX1N0b3BQYXJzZXIoKS4KKyAgIE11c3Qgbm90IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhIGhhbmRsZXIgY2FsbC1iYWNrLiBSZXR1cm5zIHNhbWUKKyAgIHN0YXR1cyBjb2RlcyBhcyBYTUxfUGFyc2UoKSBvciBYTUxfUGFyc2VCdWZmZXIoKS4KKyAgIEFkZGl0aW9uYWwgZXJyb3IgY29kZSBYTUxfRVJST1JfTk9UX1NVU1BFTkRFRCBwb3NzaWJsZS4gICAKKworICAgKk5vdGUqOgorICAgVGhpcyBtdXN0IGJlIGNhbGxlZCBvbiB0aGUgbW9zdCBkZWVwbHkgbmVzdGVkIGNoaWxkIHBhcnNlciBpbnN0YW5jZQorICAgZmlyc3QsIGFuZCBvbiBpdHMgcGFyZW50IHBhcnNlciBvbmx5IGFmdGVyIHRoZSBjaGlsZCBwYXJzZXIgaGFzIGZpbmlzaGVkLAorICAgdG8gYmUgYXBwbGllZCByZWN1cnNpdmVseSB1bnRpbCB0aGUgZG9jdW1lbnQgZW50aXR5J3MgcGFyc2VyIGlzIHJlc3RhcnRlZC4KKyAgIFRoYXQgaXMsIHRoZSBwYXJlbnQgcGFyc2VyIHdpbGwgbm90IHJlc3VtZSBieSBpdHNlbGYgYW5kIGl0IGlzIHVwIHRvIHRoZQorICAgYXBwbGljYXRpb24gdG8gY2FsbCBYTUxfUmVzdW1lUGFyc2VyKCkgb24gaXQgYXQgdGhlIGFwcHJvcHJpYXRlIG1vbWVudC4KKyovCitYTUxQQVJTRUFQSShlbnVtIFhNTF9TdGF0dXMpCitYTUxfUmVzdW1lUGFyc2VyKFhNTF9QYXJzZXIgcGFyc2VyKTsKKworZW51bSBYTUxfUGFyc2luZyB7CisgIFhNTF9JTklUSUFMSVpFRCwKKyAgWE1MX1BBUlNJTkcsCisgIFhNTF9GSU5JU0hFRCwKKyAgWE1MX1NVU1BFTkRFRAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBlbnVtIFhNTF9QYXJzaW5nIHBhcnNpbmc7CisgIFhNTF9Cb29sIGZpbmFsQnVmZmVyOworfSBYTUxfUGFyc2luZ1N0YXR1czsKKworLyogUmV0dXJucyBzdGF0dXMgb2YgcGFyc2VyIHdpdGggcmVzcGVjdCB0byBiZWluZyBpbml0aWFsaXplZCwgcGFyc2luZywKKyAgIGZpbmlzaGVkLCBvciBzdXNwZW5kZWQgYW5kIHByb2Nlc3NpbmcgdGhlIGZpbmFsIGJ1ZmZlci4KKyAgIFhYWCBYTUxfUGFyc2UoKSBhbmQgWE1MX1BhcnNlQnVmZmVyKCkgc2hvdWxkIHJldHVybiBYTUxfUGFyc2luZ1N0YXR1cywKKyAgIFhYWCB3aXRoIFhNTF9GSU5JU0hFRF9PSyBvciBYTUxfRklOSVNIRURfRVJST1IgcmVwbGFjaW5nIFhNTF9GSU5JU0hFRAorKi8KK1hNTFBBUlNFQVBJKHZvaWQpCitYTUxfR2V0UGFyc2luZ1N0YXR1cyhYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1BhcnNpbmdTdGF0dXMgKnN0YXR1cyk7CisKKy8qIENyZWF0ZXMgYW4gWE1MX1BhcnNlciBvYmplY3QgdGhhdCBjYW4gcGFyc2UgYW4gZXh0ZXJuYWwgZ2VuZXJhbAorICAgZW50aXR5OyBjb250ZXh0IGlzIGEgJ1wwJy10ZXJtaW5hdGVkIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBwYXJzZQorICAgY29udGV4dDsgZW5jb2RpbmcgaXMgYSAnXDAnLXRlcm1pbmF0ZWQgc3RyaW5nIGdpdmluZyB0aGUgbmFtZSBvZgorICAgdGhlIGV4dGVybmFsbHkgc3BlY2lmaWVkIGVuY29kaW5nLCBvciBOVUxMIGlmIHRoZXJlIGlzIG5vCisgICBleHRlcm5hbGx5IHNwZWNpZmllZCBlbmNvZGluZy4gIFRoZSBjb250ZXh0IHN0cmluZyBjb25zaXN0cyBvZiBhCisgICBzZXF1ZW5jZSBvZiB0b2tlbnMgc2VwYXJhdGVkIGJ5IGZvcm1mZWVkcyAoXGYpOyBhIHRva2VuIGNvbnNpc3RpbmcKKyAgIG9mIGEgbmFtZSBzcGVjaWZpZXMgdGhhdCB0aGUgZ2VuZXJhbCBlbnRpdHkgb2YgdGhlIG5hbWUgaXMgb3BlbjsgYQorICAgdG9rZW4gb2YgdGhlIGZvcm0gcHJlZml4PXVyaSBzcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSBmb3IgYQorICAgcGFydGljdWxhciBwcmVmaXg7IGEgdG9rZW4gb2YgdGhlIGZvcm0gPXVyaSBzcGVjaWZpZXMgdGhlIGRlZmF1bHQKKyAgIG5hbWVzcGFjZS4gIFRoaXMgY2FuIGJlIGNhbGxlZCBhdCBhbnkgcG9pbnQgYWZ0ZXIgdGhlIGZpcnN0IGNhbGwgdG8KKyAgIGFuIEV4dGVybmFsRW50aXR5UmVmSGFuZGxlciBzbyBsb25nZXIgYXMgdGhlIHBhcnNlciBoYXMgbm90IHlldAorICAgYmVlbiBmcmVlZC4gIFRoZSBuZXcgcGFyc2VyIGlzIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQgYW5kIG1heQorICAgc2FmZWx5IGJlIHVzZWQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuICBUaGUgaGFuZGxlcnMgYW5kIHVzZXJEYXRhIGFyZQorICAgaW5pdGlhbGl6ZWQgZnJvbSB0aGUgcGFyc2VyIGFyZ3VtZW50LiAgUmV0dXJucyBOVUxMIGlmIG91dCBvZiBtZW1vcnkuCisgICBPdGhlcndpc2UgcmV0dXJucyBhIG5ldyBYTUxfUGFyc2VyIG9iamVjdC4KKyovCitYTUxQQVJTRUFQSShYTUxfUGFyc2VyKQorWE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICplbmNvZGluZyk7CisKK2VudW0gWE1MX1BhcmFtRW50aXR5UGFyc2luZyB7CisgIFhNTF9QQVJBTV9FTlRJVFlfUEFSU0lOR19ORVZFUiwKKyAgWE1MX1BBUkFNX0VOVElUWV9QQVJTSU5HX1VOTEVTU19TVEFOREFMT05FLAorICBYTUxfUEFSQU1fRU5USVRZX1BBUlNJTkdfQUxXQVlTCit9OworCisvKiBDb250cm9scyBwYXJzaW5nIG9mIHBhcmFtZXRlciBlbnRpdGllcyAoaW5jbHVkaW5nIHRoZSBleHRlcm5hbCBEVEQKKyAgIHN1YnNldCkuIElmIHBhcnNpbmcgb2YgcGFyYW1ldGVyIGVudGl0aWVzIGlzIGVuYWJsZWQsIHRoZW4KKyAgIHJlZmVyZW5jZXMgdG8gZXh0ZXJuYWwgcGFyYW1ldGVyIGVudGl0aWVzIChpbmNsdWRpbmcgdGhlIGV4dGVybmFsCisgICBEVEQgc3Vic2V0KSB3aWxsIGJlIHBhc3NlZCB0byB0aGUgaGFuZGxlciBzZXQgd2l0aAorICAgWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlci4gIFRoZSBjb250ZXh0IHBhc3NlZCB3aWxsIGJlIDAuCisKKyAgIFVubGlrZSBleHRlcm5hbCBnZW5lcmFsIGVudGl0aWVzLCBleHRlcm5hbCBwYXJhbWV0ZXIgZW50aXRpZXMgY2FuCisgICBvbmx5IGJlIHBhcnNlZCBzeW5jaHJvbm91c2x5LiAgSWYgdGhlIGV4dGVybmFsIHBhcmFtZXRlciBlbnRpdHkgaXMKKyAgIHRvIGJlIHBhcnNlZCwgaXQgbXVzdCBiZSBwYXJzZWQgZHVyaW5nIHRoZSBjYWxsIHRvIHRoZSBleHRlcm5hbAorICAgZW50aXR5IHJlZiBoYW5kbGVyOiB0aGUgY29tcGxldGUgc2VxdWVuY2Ugb2YKKyAgIFhNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZSwgWE1MX1BhcnNlL1hNTF9QYXJzZUJ1ZmZlciBhbmQKKyAgIFhNTF9QYXJzZXJGcmVlIGNhbGxzIG11c3QgYmUgbWFkZSBkdXJpbmcgdGhpcyBjYWxsLiAgQWZ0ZXIKKyAgIFhNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZSBoYXMgYmVlbiBjYWxsZWQgdG8gY3JlYXRlIHRoZSBwYXJzZXIKKyAgIGZvciB0aGUgZXh0ZXJuYWwgcGFyYW1ldGVyIGVudGl0eSAoY29udGV4dCBtdXN0IGJlIDAgZm9yIHRoaXMKKyAgIGNhbGwpLCBpdCBpcyBpbGxlZ2FsIHRvIG1ha2UgYW55IGNhbGxzIG9uIHRoZSBvbGQgcGFyc2VyIHVudGlsCisgICBYTUxfUGFyc2VyRnJlZSBoYXMgYmVlbiBjYWxsZWQgb24gdGhlIG5ld2x5IGNyZWF0ZWQgcGFyc2VyLgorICAgSWYgdGhlIGxpYnJhcnkgaGFzIGJlZW4gY29tcGlsZWQgd2l0aG91dCBzdXBwb3J0IGZvciBwYXJhbWV0ZXIKKyAgIGVudGl0eSBwYXJzaW5nIChpZSB3aXRob3V0IFhNTF9EVEQgYmVpbmcgZGVmaW5lZCksIHRoZW4KKyAgIFhNTF9TZXRQYXJhbUVudGl0eVBhcnNpbmcgd2lsbCByZXR1cm4gMCBpZiBwYXJzaW5nIG9mIHBhcmFtZXRlcgorICAgZW50aXRpZXMgaXMgcmVxdWVzdGVkOyBvdGhlcndpc2UgaXQgd2lsbCByZXR1cm4gbm9uLXplcm8uCisgICBOb3RlOiBJZiBYTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nIGlzIGNhbGxlZCBhZnRlciBYTUxfUGFyc2Ugb3IKKyAgICAgIFhNTF9QYXJzZUJ1ZmZlciwgdGhlbiBpdCBoYXMgbm8gZWZmZWN0IGFuZCB3aWxsIGFsd2F5cyByZXR1cm4gMC4KKyovCitYTUxQQVJTRUFQSShpbnQpCitYTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIFhNTF9QYXJhbUVudGl0eVBhcnNpbmcgcGFyc2luZyk7CisKKy8qIElmIFhNTF9QYXJzZSBvciBYTUxfUGFyc2VCdWZmZXIgaGF2ZSByZXR1cm5lZCBYTUxfU1RBVFVTX0VSUk9SLCB0aGVuCisgICBYTUxfR2V0RXJyb3JDb2RlIHJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yLgorKi8KK1hNTFBBUlNFQVBJKGVudW0gWE1MX0Vycm9yKQorWE1MX0dldEVycm9yQ29kZShYTUxfUGFyc2VyIHBhcnNlcik7CisKKy8qIFRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgcGFyc2UKKyAgIGxvY2F0aW9uLiAgVGhleSBtYXkgYmUgY2FsbGVkIGZyb20gYW55IGNhbGxiYWNrIGNhbGxlZCB0byByZXBvcnQKKyAgIHNvbWUgcGFyc2UgZXZlbnQ7IGluIHRoaXMgY2FzZSB0aGUgbG9jYXRpb24gaXMgdGhlIGxvY2F0aW9uIG9mIHRoZQorICAgZmlyc3Qgb2YgdGhlIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgdGhhdCBnZW5lcmF0ZWQgdGhlIGV2ZW50LiAgV2hlbgorICAgY2FsbGVkIGZyb20gY2FsbGJhY2tzIGdlbmVyYXRlZCBieSBkZWNsYXJhdGlvbnMgaW4gdGhlIGRvY3VtZW50CisgICBwcm9sb2d1ZSwgdGhlIGxvY2F0aW9uIGlkZW50aWZpZWQgaXNuJ3QgYXMgbmVhdGx5IGRlZmluZWQsIGJ1dCB3aWxsCisgICBiZSB3aXRoaW4gdGhlIHJlbGV2YW50IG1hcmt1cC4gIFdoZW4gY2FsbGVkIG91dHNpZGUgb2YgdGhlIGNhbGxiYWNrCisgICBmdW5jdGlvbnMsIHRoZSBwb3NpdGlvbiBpbmRpY2F0ZWQgd2lsbCBiZSBqdXN0IHBhc3QgdGhlIGxhc3QgcGFyc2UKKyAgIGV2ZW50IChyZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlcmUgd2FzIGFuIGFzc29jaWF0ZWQgY2FsbGJhY2spLgorICAgCisgICBUaGV5IG1heSBhbHNvIGJlIGNhbGxlZCBhZnRlciByZXR1cm5pbmcgZnJvbSBhIGNhbGwgdG8gWE1MX1BhcnNlCisgICBvciBYTUxfUGFyc2VCdWZmZXIuICBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIFhNTF9TVEFUVVNfRVJST1IgdGhlbgorICAgdGhlIGxvY2F0aW9uIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgY2hhcmFjdGVyIGF0IHdoaWNoIHRoZSBlcnJvcgorICAgd2FzIGRldGVjdGVkOyBvdGhlcndpc2UgdGhlIGxvY2F0aW9uIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgbGFzdAorICAgcGFyc2UgZXZlbnQsIGFzIGRlc2NyaWJlZCBhYm92ZS4KKyovCitYTUxQQVJTRUFQSShYTUxfU2l6ZSkgWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyKFhNTF9QYXJzZXIgcGFyc2VyKTsKK1hNTFBBUlNFQVBJKFhNTF9TaXplKSBYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlcihYTUxfUGFyc2VyIHBhcnNlcik7CitYTUxQQVJTRUFQSShYTUxfSW5kZXgpIFhNTF9HZXRDdXJyZW50Qnl0ZUluZGV4KFhNTF9QYXJzZXIgcGFyc2VyKTsKKworLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGN1cnJlbnQgZXZlbnQuCisgICBSZXR1cm5zIDAgaWYgdGhlIGV2ZW50IGlzIGluIGFuIGludGVybmFsIGVudGl0eS4KKyovCitYTUxQQVJTRUFQSShpbnQpCitYTUxfR2V0Q3VycmVudEJ5dGVDb3VudChYTUxfUGFyc2VyIHBhcnNlcik7CisKKy8qIElmIFhNTF9DT05URVhUX0JZVEVTIGlzIGRlZmluZWQsIHJldHVybnMgdGhlIGlucHV0IGJ1ZmZlciwgc2V0cworICAgdGhlIGludGVnZXIgcG9pbnRlZCB0byBieSBvZmZzZXQgdG8gdGhlIG9mZnNldCB3aXRoaW4gdGhpcyBidWZmZXIKKyAgIG9mIHRoZSBjdXJyZW50IHBhcnNlIHBvc2l0aW9uLCBhbmQgc2V0cyB0aGUgaW50ZWdlciBwb2ludGVkIHRvIGJ5IHNpemUKKyAgIHRvIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyICh0aGUgbnVtYmVyIG9mIGlucHV0IGJ5dGVzKS4gT3RoZXJ3aXNlCisgICByZXR1cm5zIGEgTlVMTCBwb2ludGVyLiBBbHNvIHJldHVybnMgYSBOVUxMIHBvaW50ZXIgaWYgYSBwYXJzZSBpc24ndAorICAgYWN0aXZlLgorCisgICBOT1RFOiBUaGUgY2hhcmFjdGVyIHBvaW50ZXIgcmV0dXJuZWQgc2hvdWxkIG5vdCBiZSB1c2VkIG91dHNpZGUKKyAgIHRoZSBoYW5kbGVyIHRoYXQgbWFrZXMgdGhlIGNhbGwuCisqLworWE1MUEFSU0VBUEkoY29uc3QgY2hhciAqKQorWE1MX0dldElucHV0Q29udGV4dChYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgaW50ICpvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIGludCAqc2l6ZSk7CisKKy8qIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIHByZXZpb3VzIHZlcnNpb25zLiAqLworI2RlZmluZSBYTUxfR2V0RXJyb3JMaW5lTnVtYmVyICAgWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyCisjZGVmaW5lIFhNTF9HZXRFcnJvckNvbHVtbk51bWJlciBYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlcgorI2RlZmluZSBYTUxfR2V0RXJyb3JCeXRlSW5kZXggICAgWE1MX0dldEN1cnJlbnRCeXRlSW5kZXgKKworLyogRnJlZXMgdGhlIGNvbnRlbnQgbW9kZWwgcGFzc2VkIHRvIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGhhbmRsZXIgKi8KK1hNTFBBUlNFQVBJKHZvaWQpCitYTUxfRnJlZUNvbnRlbnRNb2RlbChYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0NvbnRlbnQgKm1vZGVsKTsKKworLyogRXhwb3NpbmcgdGhlIG1lbW9yeSBoYW5kbGluZyBmdW5jdGlvbnMgdXNlZCBpbiBFeHBhdCAqLworWE1MUEFSU0VBUEkodm9pZCAqKQorWE1MX01lbU1hbGxvYyhYTUxfUGFyc2VyIHBhcnNlciwgc2l6ZV90IHNpemUpOworCitYTUxQQVJTRUFQSSh2b2lkICopCitYTUxfTWVtUmVhbGxvYyhYTUxfUGFyc2VyIHBhcnNlciwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSk7CisKK1hNTFBBUlNFQVBJKHZvaWQpCitYTUxfTWVtRnJlZShYTUxfUGFyc2VyIHBhcnNlciwgdm9pZCAqcHRyKTsKKworLyogRnJlZXMgbWVtb3J5IHVzZWQgYnkgdGhlIHBhcnNlci4gKi8KK1hNTFBBUlNFQVBJKHZvaWQpCitYTUxfUGFyc2VyRnJlZShYTUxfUGFyc2VyIHBhcnNlcik7CisKKy8qIFJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IuICovCitYTUxQQVJTRUFQSShjb25zdCBYTUxfTENoYXIgKikKK1hNTF9FcnJvclN0cmluZyhlbnVtIFhNTF9FcnJvciBjb2RlKTsKKworLyogUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgZXhwYXQgKi8KK1hNTFBBUlNFQVBJKGNvbnN0IFhNTF9MQ2hhciAqKQorWE1MX0V4cGF0VmVyc2lvbih2b2lkKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgbWFqb3I7CisgIGludCBtaW5vcjsKKyAgaW50IG1pY3JvOworfSBYTUxfRXhwYXRfVmVyc2lvbjsKKworLyogUmV0dXJuIGFuIFhNTF9FeHBhdF9WZXJzaW9uIHN0cnVjdHVyZSBjb250YWluaW5nIG51bWVyaWMgdmVyc2lvbgorICAgbnVtYmVyIGluZm9ybWF0aW9uIGZvciB0aGlzIHZlcnNpb24gb2YgZXhwYXQuCisqLworWE1MUEFSU0VBUEkoWE1MX0V4cGF0X1ZlcnNpb24pCitYTUxfRXhwYXRWZXJzaW9uSW5mbyh2b2lkKTsKKworLyogQWRkZWQgaW4gRXhwYXQgMS45NS41LiAqLworZW51bSBYTUxfRmVhdHVyZUVudW0geworICBYTUxfRkVBVFVSRV9FTkQgPSAwLAorICBYTUxfRkVBVFVSRV9VTklDT0RFLAorICBYTUxfRkVBVFVSRV9VTklDT0RFX1dDSEFSX1QsCisgIFhNTF9GRUFUVVJFX0RURCwKKyAgWE1MX0ZFQVRVUkVfQ09OVEVYVF9CWVRFUywKKyAgWE1MX0ZFQVRVUkVfTUlOX1NJWkUsCisgIFhNTF9GRUFUVVJFX1NJWkVPRl9YTUxfQ0hBUiwKKyAgWE1MX0ZFQVRVUkVfU0laRU9GX1hNTF9MQ0hBUiwKKyAgWE1MX0ZFQVRVUkVfTlMsCisgIFhNTF9GRUFUVVJFX0xBUkdFX1NJWkUKKyAgLyogQWRkaXRpb25hbCBmZWF0dXJlcyBtdXN0IGJlIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhpcyBlbnVtLiAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBlbnVtIFhNTF9GZWF0dXJlRW51bSAgZmVhdHVyZTsKKyAgY29uc3QgWE1MX0xDaGFyICAgICAgICpuYW1lOworICBsb25nIGludCAgICAgICAgICAgICAgdmFsdWU7Cit9IFhNTF9GZWF0dXJlOworCitYTUxQQVJTRUFQSShjb25zdCBYTUxfRmVhdHVyZSAqKQorWE1MX0dldEZlYXR1cmVMaXN0KHZvaWQpOworCisKKy8qIEV4cGF0IGZvbGxvd3MgdGhlIEdOVS9MaW51eCBjb252ZW50aW9uIG9mIG9kZCBudW1iZXIgbWlub3IgdmVyc2lvbiBmb3IKKyAgIGJldGEvZGV2ZWxvcG1lbnQgcmVsZWFzZXMgYW5kIGV2ZW4gbnVtYmVyIG1pbm9yIHZlcnNpb24gZm9yIHN0YWJsZQorICAgcmVsZWFzZXMuIE1pY3JvIGlzIGJ1bXBlZCB3aXRoIGVhY2ggcmVsZWFzZSwgYW5kIHNldCB0byAwIHdpdGggZWFjaAorICAgY2hhbmdlIHRvIG1ham9yIG9yIG1pbm9yIHZlcnNpb24uCisqLworI2RlZmluZSBYTUxfTUFKT1JfVkVSU0lPTiAyCisjZGVmaW5lIFhNTF9NSU5PUl9WRVJTSU9OIDAKKyNkZWZpbmUgWE1MX01JQ1JPX1ZFUlNJT04gMQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogbm90IEV4cGF0X0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9saWIvZXhwYXRfZXh0ZXJuYWwuaCBiL2V4cGF0LTIuMC4xL2xpYi9leHBhdF9leHRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMDMyODQKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9saWIvZXhwYXRfZXh0ZXJuYWwuaApAQCAtMCwwICsxLDExNSBAQAorLyogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwIFRoYWkgT3BlbiBTb3VyY2UgU29mdHdhcmUgQ2VudGVyIEx0ZAorICAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIGNvcHlpbmcgcGVybWlzc2lvbi4KKyovCisKKyNpZm5kZWYgRXhwYXRfRXh0ZXJuYWxfSU5DTFVERUQKKyNkZWZpbmUgRXhwYXRfRXh0ZXJuYWxfSU5DTFVERUQgMQorCisvKiBFeHRlcm5hbCBBUEkgZGVmaW5pdGlvbnMgKi8KKworI2lmIGRlZmluZWQoX01TQ19FWFRFTlNJT05TKSAmJiAhZGVmaW5lZChfX0JFT1NfXykgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKKyNkZWZpbmUgWE1MX1VTRV9NU0NfRVhURU5TSU9OUyAxCisjZW5kaWYKKworLyogRXhwYXQgdHJpZXMgdmVyeSBoYXJkIHRvIG1ha2UgdGhlIEFQSSBib3VuZGFyeSB2ZXJ5IHNwZWNpZmljYWxseQorICAgZGVmaW5lZC4gIFRoZXJlIGFyZSB0d28gbWFjcm9zIGRlZmluZWQgdG8gY29udHJvbCB0aGlzIGJvdW5kYXJ5OworICAgZWFjaCBvZiB0aGVzZSBjYW4gYmUgZGVmaW5lZCBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgaGVhZGVyIHRvCisgICBhY2hpZXZlIHNvbWUgZGlmZmVyZW50IGJlaGF2aW9yLCBidXQgZG9pbmcgc28gaXQgbm90IHJlY29tbWVuZGVkIG9yCisgICB0ZXN0ZWQgZnJlcXVlbnRseS4KKworICAgWE1MQ0FMTCAgICAtIFRoZSBjYWxsaW5nIGNvbnZlbnRpb24gdG8gdXNlIGZvciBhbGwgY2FsbHMgYWNyb3NzIHRoZQorICAgICAgICAgICAgICAgICJsaWJyYXJ5IGJvdW5kYXJ5LiIgIFRoaXMgd2lsbCBkZWZhdWx0IHRvIGNkZWNsLCBhbmQKKyAgICAgICAgICAgICAgICB0cnkgcmVhbGx5IGhhcmQgdG8gdGVsbCB0aGUgY29tcGlsZXIgdGhhdCdzIHdoYXQgd2UKKyAgICAgICAgICAgICAgICB3YW50LgorCisgICBYTUxJTVBPUlQgIC0gV2hhdGV2ZXIgbWFnaWMgaXMgbmVlZGVkIHRvIG5vdGUgdGhhdCBhIGZ1bmN0aW9uIGlzCisgICAgICAgICAgICAgICAgdG8gYmUgaW1wb3J0ZWQgZnJvbSBhIGR5bmFtaWNhbGx5IGxvYWRlZCBsaWJyYXJ5CisgICAgICAgICAgICAgICAgKC5kbGwsIC5zbywgb3IgLnNsLCBkZXBlbmRpbmcgb24geW91ciBwbGF0Zm9ybSkuCisKKyAgIFRoZSBYTUxDQUxMIG1hY3JvIHdhcyBhZGRlZCBpbiBFeHBhdCAxLjk1LjcuICBUaGUgb25seSBvbmUgd2hpY2ggaXMKKyAgIGV4cGVjdGVkIHRvIGJlIGRpcmVjdGx5IHVzZWZ1bCBpbiBjbGllbnQgY29kZSBpcyBYTUxDQUxMLgorCisgICBOb3RlIHRoYXQgb24gYXQgbGVhc3Qgc29tZSBVbml4IHZlcnNpb25zLCB0aGUgRXhwYXQgbGlicmFyeSBtdXN0IGJlCisgICBjb21waWxlZCB3aXRoIHRoZSBjZGVjbCBjYWxsaW5nIGNvbnZlbnRpb24gYXMgdGhlIGRlZmF1bHQgc2luY2UKKyAgIHN5c3RlbSBoZWFkZXJzIG1heSBhc3N1bWUgdGhlIGNkZWNsIGNvbnZlbnRpb24uCisqLworI2lmbmRlZiBYTUxDQUxMCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgWE1MQ0FMTCBfX2NkZWNsCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9faTM4NikgJiYgIWRlZmluZWQoX19JTlRFTF9DT01QSUxFUikKKyNkZWZpbmUgWE1MQ0FMTCBfX2F0dHJpYnV0ZV9fKChjZGVjbCkpCisjZWxzZQorLyogRm9yIGFueSBwbGF0Zm9ybSB3aGljaCB1c2VzIHRoaXMgZGVmaW5pdGlvbiBhbmQgc3VwcG9ydHMgbW9yZSB0aGFuCisgICBvbmUgY2FsbGluZyBjb252ZW50aW9uLCB3ZSBuZWVkIHRvIGV4dGVuZCB0aGlzIGRlZmluaXRpb24gdG8KKyAgIGRlY2xhcmUgdGhlIGNvbnZlbnRpb24gdXNlZCBvbiB0aGF0IHBsYXRmb3JtLCBpZiBpdCdzIHBvc3NpYmxlIHRvCisgICBkbyBzby4KKworICAgSWYgdGhpcyBpcyB0aGUgY2FzZSBmb3IgeW91ciBwbGF0Zm9ybSwgcGxlYXNlIGZpbGUgYSBidWcgcmVwb3J0CisgICB3aXRoIGluZm9ybWF0aW9uIG9uIGhvdyB0byBpZGVudGlmeSB5b3VyIHBsYXRmb3JtIHZpYSB0aGUgQworICAgcHJlLXByb2Nlc3NvciBhbmQgaG93IHRvIHNwZWNpZnkgdGhlIHNhbWUgY2FsbGluZyBjb252ZW50aW9uIGFzIHRoZQorICAgcGxhdGZvcm0ncyBtYWxsb2MoKSBpbXBsZW1lbnRhdGlvbi4KKyovCisjZGVmaW5lIFhNTENBTEwKKyNlbmRpZgorI2VuZGlmICAvKiBub3QgZGVmaW5lZCBYTUxDQUxMICovCisKKworI2lmICFkZWZpbmVkKFhNTF9TVEFUSUMpICYmICFkZWZpbmVkKFhNTElNUE9SVCkKKyNpZm5kZWYgWE1MX0JVSUxESU5HX0VYUEFUCisvKiB1c2luZyBFeHBhdCBmcm9tIGFuIGFwcGxpY2F0aW9uICovCisKKyNpZmRlZiBYTUxfVVNFX01TQ19FWFRFTlNJT05TCisjZGVmaW5lIFhNTElNUE9SVCBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyNlbmRpZgorCisjZW5kaWYKKyNlbmRpZiAgLyogbm90IGRlZmluZWQgWE1MX1NUQVRJQyAqLworCisKKy8qIElmIHdlIGRpZG4ndCBkZWZpbmUgaXQgYWJvdmUsIGRlZmluZSBpdCBhd2F5OiAqLworI2lmbmRlZiBYTUxJTVBPUlQKKyNkZWZpbmUgWE1MSU1QT1JUCisjZW5kaWYKKworCisjZGVmaW5lIFhNTFBBUlNFQVBJKHR5cGUpIFhNTElNUE9SVCB0eXBlIFhNTENBTEwKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZkZWYgWE1MX1VOSUNPREVfV0NIQVJfVAorI2RlZmluZSBYTUxfVU5JQ09ERQorI2VuZGlmCisKKyNpZmRlZiBYTUxfVU5JQ09ERSAgICAgLyogSW5mb3JtYXRpb24gaXMgVVRGLTE2IGVuY29kZWQuICovCisjaWZkZWYgWE1MX1VOSUNPREVfV0NIQVJfVAordHlwZWRlZiB3Y2hhcl90IFhNTF9DaGFyOwordHlwZWRlZiB3Y2hhcl90IFhNTF9MQ2hhcjsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFhNTF9DaGFyOwordHlwZWRlZiBjaGFyIFhNTF9MQ2hhcjsKKyNlbmRpZiAvKiBYTUxfVU5JQ09ERV9XQ0hBUl9UICovCisjZWxzZSAgICAgICAgICAgICAgICAgIC8qIEluZm9ybWF0aW9uIGlzIFVURi04IGVuY29kZWQuICovCit0eXBlZGVmIGNoYXIgWE1MX0NoYXI7Cit0eXBlZGVmIGNoYXIgWE1MX0xDaGFyOworI2VuZGlmIC8qIFhNTF9VTklDT0RFICovCisKKyNpZmRlZiBYTUxfTEFSR0VfU0laRSAgLyogVXNlIGxhcmdlIGludGVnZXJzIGZvciBmaWxlL3N0cmVhbSBwb3NpdGlvbnMuICovCisjaWYgZGVmaW5lZChYTUxfVVNFX01TQ19FWFRFTlNJT05TKSAmJiBfTVNDX1ZFUiA8IDE0MDAKK3R5cGVkZWYgX19pbnQ2NCBYTUxfSW5kZXg7IAordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IFhNTF9TaXplOworI2Vsc2UKK3R5cGVkZWYgbG9uZyBsb25nIFhNTF9JbmRleDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIFhNTF9TaXplOworI2VuZGlmCisjZWxzZQordHlwZWRlZiBsb25nIFhNTF9JbmRleDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBYTUxfU2l6ZTsKKyNlbmRpZiAvKiBYTUxfTEFSR0VfU0laRSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogbm90IEV4cGF0X0V4dGVybmFsX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9saWIvZXhwYXRfc3RhdGljLmRzcCBiL2V4cGF0LTIuMC4xL2xpYi9leHBhdF9zdGF0aWMuZHNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2Nzg5N2IKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9saWIvZXhwYXRfc3RhdGljLmRzcApAQCAtMCwwICsxLDE2MiBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJleHBhdF9zdGF0aWMiIC0gUGFja2FnZSBPd25lcj08ND4KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDAKKyMgKiogRE8gTk9UIEVESVQgKioKKworIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiIDB4MDEwNAorCitDRkc9ZXhwYXRfc3RhdGljIC0gV2luMzIgRGVidWcKKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAiZXhwYXRfc3RhdGljLm1hayIuCishTUVTU0FHRSAKKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAiZXhwYXRfc3RhdGljLm1hayIgQ0ZHPSJleHBhdF9zdGF0aWMgLSBXaW4zMiBEZWJ1ZyIKKyFNRVNTQUdFIAorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6CishTUVTU0FHRSAKKyFNRVNTQUdFICJleHBhdF9zdGF0aWMgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikKKyFNRVNTQUdFICJleHBhdF9zdGF0aWMgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpCishTUVTU0FHRSAKKworIyBCZWdpbiBQcm9qZWN0CisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKK0NQUD1jbC5leGUKK1JTQz1yYy5leGUKKworIUlGICAiJChDRkcpIiA9PSAiZXhwYXRfc3RhdGljIC0gV2luMzIgUmVsZWFzZSIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImV4cGF0X3N0YXRpY19fX1dpbjMyX1JlbGVhc2UiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJleHBhdF9zdGF0aWNfX19XaW4zMl9SZWxlYXNlIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIi4uXHdpbjMyXGJpblxSZWxlYXNlIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXHdpbjMyXHRtcFxSZWxlYXNlX3N0YXRpYyIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9NQkNTIiAvRCAiX0xJQiIgL1lYIC9GRCAvYworIyBBREQgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiTkRFQlVHIiAvRCAiX01CQ1MiIC9EICJfTElCIiAvRCAiQ09NUElMRURfRlJPTV9EU1AiIC9GRCAvYworIyBTVUJUUkFDVCBDUFAgL1lYCisjIEFERCBCQVNFIFJTQyAvbCAweDEwMDkgL2QgIk5ERUJVRyIKKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElCMzI9bGluay5leGUgLWxpYgorIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvCisjIEFERCBMSUIzMiAvbm9sb2dvIC9vdXQ6Ii4uXHdpbjMyXGJpblxSZWxlYXNlL2xpYmV4cGF0TVQubGliIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiZXhwYXRfc3RhdGljIC0gV2luMzIgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJleHBhdF9zdGF0aWNfX19XaW4zMl9EZWJ1ZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImV4cGF0X3N0YXRpY19fX1dpbjMyX0RlYnVnIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXHdpbjMyXGJpblxEZWJ1ZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlx3aW4zMlx0bXBcRGVidWdfc3RhdGljIgorIyBQUk9QIFRhcmdldF9EaXIgIiIKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9ZWCAvRkQgL0daIC9jCisjIEFERCBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL0QgIkNPTVBJTEVEX0ZST01fRFNQIiAvRCAiX01CQ1MiIC9EICJfTElCIiAvRlIgL0ZEIC9HWiAvYworIyBTVUJUUkFDVCBDUFAgL1lYCisjIEFERCBCQVNFIFJTQyAvbCAweDEwMDkgL2QgIl9ERUJVRyIKKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElCMzI9bGluay5leGUgLWxpYgorIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvCisjIEFERCBMSUIzMiAvbm9sb2dvIC9vdXQ6Ii4uXHdpbjMyXGJpblxEZWJ1Z1xsaWJleHBhdE1ULmxpYiIKKworIUVORElGIAorCisjIEJlZ2luIFRhcmdldAorCisjIE5hbWUgImV4cGF0X3N0YXRpYyAtIFdpbjMyIFJlbGVhc2UiCisjIE5hbWUgImV4cGF0X3N0YXRpYyAtIFdpbjMyIERlYnVnIgorIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgorCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXHhtbHBhcnNlLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXHhtbHJvbGUuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5ceG1sdG9rLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXHhtbHRva19pbXBsLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXHhtbHRva19ucy5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBFbmQgR3JvdXAKKyMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyIKKworIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIgorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llxhc2NpaS5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llxhc2NpaXRhYi5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxleHBhdC5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxleHBhdF9leHRlcm5hbC5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxpYXNjaWl0YWIuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5caW50ZXJuYWwuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cbGF0aW4xdGFiLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXG5hbWV0YWIuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cdXRmOHRhYi5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx4bWxyb2xlLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXHhtbHRvay5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx4bWx0b2tfaW1wbC5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBFbmQgR3JvdXAKKyMgRW5kIFRhcmdldAorIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvbGliL2V4cGF0dy5kc3AgYi9leHBhdC0yLjAuMS9saWIvZXhwYXR3LmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmRiN2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvbGliL2V4cGF0dy5kc3AKQEAgLTAsMCArMSwxODUgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iZXhwYXR3IiAtIFBhY2thZ2UgT3duZXI9PDQ+CisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwCisjICoqIERPIE5PVCBFRElUICoqCisKKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDAxMDIKKworQ0ZHPWV4cGF0dyAtIFdpbjMyIERlYnVnCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgImV4cGF0dy5tYWsiLgorIU1FU1NBR0UgCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgImV4cGF0dy5tYWsiIENGRz0iZXhwYXR3IC0gV2luMzIgRGVidWciCishTUVTU0FHRSAKKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgorIU1FU1NBR0UgCishTUVTU0FHRSAiZXhwYXR3IC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCishTUVTU0FHRSAiZXhwYXR3IC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQorIU1FU1NBR0UgCisKKyMgQmVnaW4gUHJvamVjdAorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDAKKyMgUFJPUCBTY2NfUHJvak5hbWUgIiIKKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCitDUFA9Y2wuZXhlCitNVEw9bWlkbC5leGUKK1JTQz1yYy5leGUKKworIUlGICAiJChDRkcpIiA9PSAiZXhwYXR3IC0gV2luMzIgUmVsZWFzZSIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIi4uXHdpbjMyXGJpblxSZWxlYXNlIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXHdpbjMyXHRtcFxSZWxlYXNlLXciCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAorIyBQUk9QIFRhcmdldF9EaXIgIiIKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRCAiX01CQ1MiIC9EICJfVVNSRExMIiAvRCAiRVhQQVRfRVhQT1JUUyIgL1l1InN0ZGFmeC5oIiAvRkQgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9NVCAvVzMgL0dYIC9PMiAvRCAiTkRFQlVHIiAvRCAiQ09NUElMRURfRlJPTV9EU1AiIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiX01CQ1MiIC9EICJfVVNSRExMIiAvRCAiWE1MX1VOSUNPREVfV0NIQVJfVCIgL0ZEIC9jCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL2RsbCAvbWFjaGluZTpJMzg2CisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvZGxsIC9wZGI6bm9uZSAvbWFjaGluZTpJMzg2IC9vdXQ6Ii4uXHdpbjMyXGJpblxSZWxlYXNlL2xpYmV4cGF0dy5kbGwiCisKKyFFTFNFSUYgICIkKENGRykiID09ICJleHBhdHcgLSBXaW4zMiBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgT3V0cHV0X0RpciAiLi5cd2luMzJcYmluXERlYnVnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXHdpbjMyXHRtcFxEZWJ1Zy13IgorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKKyMgUFJPUCBUYXJnZXRfRGlyICIiCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL0QgIl9NQkNTIiAvRCAiX1VTUkRMTCIgL0QgIkVYUEFUX0VYUE9SVFMiIC9ZdSJzdGRhZnguaCIgL0ZEIC9HWiAvYworIyBBREQgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dYIC9aSSAvT2QgL0QgIl9ERUJVRyIgL0QgIkNPTVBJTEVEX0ZST01fRFNQIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIl9NQkNTIiAvRCAiX1VTUkRMTCIgL0QgIlhNTF9VTklDT0RFX1dDSEFSX1QiIC9GUiAvRkQgL0daIC9jCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9kbGwgL3BkYjpub25lIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6Ii4uXHdpbjMyXGJpblxEZWJ1Zy9saWJleHBhdHcuZGxsIgorCishRU5ESUYgCisKKyMgQmVnaW4gVGFyZ2V0CisKKyMgTmFtZSAiZXhwYXR3IC0gV2luMzIgUmVsZWFzZSIKKyMgTmFtZSAiZXhwYXR3IC0gV2luMzIgRGVidWciCisjIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiCisKKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCIKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cbGliZXhwYXR3LmRlZgorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5ceG1scGFyc2UuYworCishSUYgICIkKENGRykiID09ICJleHBhdHcgLSBXaW4zMiBSZWxlYXNlIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiZXhwYXR3IC0gV2luMzIgRGVidWciCisKKyMgQUREIENQUCAvR1gtIC9PZAorCishRU5ESUYgCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXHhtbHJvbGUuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5ceG1sdG9rLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXHhtbHRva19pbXBsLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXHhtbHRva19ucy5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBFbmQgR3JvdXAKKyMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyIKKworIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIgorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llxhc2NpaS5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llxhc2NpaXRhYi5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxleHBhdC5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxleHBhdF9leHRlcm5hbC5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxpYXNjaWl0YWIuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5caW50ZXJuYWwuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cbGF0aW4xdGFiLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXG5hbWV0YWIuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cdXRmOHRhYi5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx4bWxyb2xlLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXHhtbHRvay5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx4bWx0b2tfaW1wbC5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBFbmQgR3JvdXAKKyMgQmVnaW4gR3JvdXAgIlJlc291cmNlIEZpbGVzIgorCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSIKKyMgRW5kIEdyb3VwCisjIEVuZCBUYXJnZXQKKyMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2xpYi9leHBhdHdfc3RhdGljLmRzcCBiL2V4cGF0LTIuMC4xL2xpYi9leHBhdHdfc3RhdGljLmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjg2MzJjCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvbGliL2V4cGF0d19zdGF0aWMuZHNwCkBAIC0wLDAgKzEsMTYyIEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9ImV4cGF0d19zdGF0aWMiIC0gUGFja2FnZSBPd25lcj08ND4KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDAKKyMgKiogRE8gTk9UIEVESVQgKioKKworIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiIDB4MDEwNAorCitDRkc9ZXhwYXR3X3N0YXRpYyAtIFdpbjMyIERlYnVnCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgImV4cGF0d19zdGF0aWMubWFrIi4KKyFNRVNTQUdFIAorIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6CishTUVTU0FHRSAKKyFNRVNTQUdFIE5NQUtFIC9mICJleHBhdHdfc3RhdGljLm1hayIgQ0ZHPSJleHBhdHdfc3RhdGljIC0gV2luMzIgRGVidWciCishTUVTU0FHRSAKKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgorIU1FU1NBR0UgCishTUVTU0FHRSAiZXhwYXR3X3N0YXRpYyAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQorIU1FU1NBR0UgImV4cGF0d19zdGF0aWMgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpCishTUVTU0FHRSAKKworIyBCZWdpbiBQcm9qZWN0CisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKK0NQUD1jbC5leGUKK1JTQz1yYy5leGUKKworIUlGICAiJChDRkcpIiA9PSAiZXhwYXR3X3N0YXRpYyAtIFdpbjMyIFJlbGVhc2UiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJleHBhdHdfc3RhdGljX19fV2luMzJfUmVsZWFzZSIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImV4cGF0d19zdGF0aWNfX19XaW4zMl9SZWxlYXNlIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIi4uXHdpbjMyXGJpblxSZWxlYXNlIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXHdpbjMyXHRtcFxSZWxlYXNlLXdfc3RhdGljIgorIyBQUk9QIFRhcmdldF9EaXIgIiIKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX01CQ1MiIC9EICJfTElCIiAvWVggL0ZEIC9jCisjIEFERCBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJOREVCVUciIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9EICJDT01QSUxFRF9GUk9NX0RTUCIgL0QgIlhNTF9VTklDT0RFX1dDSEFSX1QiIC9GRCAvYworIyBTVUJUUkFDVCBDUFAgL1lYCisjIEFERCBCQVNFIFJTQyAvbCAweDEwMDkgL2QgIk5ERUJVRyIKKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElCMzI9bGluay5leGUgLWxpYgorIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvCisjIEFERCBMSUIzMiAvbm9sb2dvIC9vdXQ6Ii4uXHdpbjMyXGJpblxSZWxlYXNlXGxpYmV4cGF0d01ULmxpYiIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImV4cGF0d19zdGF0aWMgLSBXaW4zMiBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImV4cGF0d19zdGF0aWNfX19XaW4zMl9EZWJ1ZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImV4cGF0d19zdGF0aWNfX19XaW4zMl9EZWJ1ZyIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBPdXRwdXRfRGlyICIuLlx3aW4zMlxiaW5cRGVidWciCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cd2luMzJcdG1wXERlYnVnLXdfc3RhdGljIgorIyBQUk9QIFRhcmdldF9EaXIgIiIKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9ZWCAvRkQgL0daIC9jCisjIEFERCBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL0QgIl9NQkNTIiAvRCAiX0xJQiIgL0QgIkNPTVBJTEVEX0ZST01fRFNQIiAvRCAiWE1MX1VOSUNPREVfV0NIQVJfVCIgL0ZSIC9GRCAvR1ogL2MKKyMgU1VCVFJBQ1QgQ1BQIC9ZWAorIyBBREQgQkFTRSBSU0MgL2wgMHgxMDA5IC9kICJfREVCVUciCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJQjMyPWxpbmsuZXhlIC1saWIKKyMgQUREIEJBU0UgTElCMzIgL25vbG9nbworIyBBREQgTElCMzIgL25vbG9nbyAvb3V0OiIuLlx3aW4zMlxiaW5cRGVidWdcbGliZXhwYXR3TVQubGliIgorCishRU5ESUYgCisKKyMgQmVnaW4gVGFyZ2V0CisKKyMgTmFtZSAiZXhwYXR3X3N0YXRpYyAtIFdpbjMyIFJlbGVhc2UiCisjIE5hbWUgImV4cGF0d19zdGF0aWMgLSBXaW4zMiBEZWJ1ZyIKKyMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyIKKworIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0IgorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx4bWxwYXJzZS5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx4bWxyb2xlLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXHhtbHRvay5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx4bWx0b2tfaW1wbC5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx4bWx0b2tfbnMuYworIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIEdyb3VwCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiCisKKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubCIKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cYXNjaWkuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cYXNjaWl0YWIuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cZXhwYXQuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cZXhwYXRfZXh0ZXJuYWwuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5caWFzY2lpdGFiLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGludGVybmFsLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGxhdGluMXRhYi5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxuYW1ldGFiLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXHV0Zjh0YWIuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5ceG1scm9sZS5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx4bWx0b2suaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5ceG1sdG9rX2ltcGwuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIEdyb3VwCisjIEVuZCBUYXJnZXQKKyMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2xpYi9pYXNjaWl0YWIuaCBiL2V4cGF0LTIuMC4xL2xpYi9pYXNjaWl0YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGExZDVjCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvbGliL2lhc2NpaXRhYi5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSBUaGFpIE9wZW4gU291cmNlIFNvZnR3YXJlIENlbnRlciBMdGQKKyAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBjb3B5aW5nIHBlcm1pc3Npb24uCisqLworCisvKiBMaWtlIGFzY2lpdGFiLmgsIGV4Y2VwdCB0aGF0IDB4RCBoYXMgY29kZSBCVF9TIHJhdGhlciB0aGFuIEJUX0NSICovCisvKiAweDAwICovIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwKKy8qIDB4MDQgKi8gQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwgQlRfTk9OWE1MLAorLyogMHgwOCAqLyBCVF9OT05YTUwsIEJUX1MsIEJUX0xGLCBCVF9OT05YTUwsCisvKiAweDBDICovIEJUX05PTlhNTCwgQlRfUywgQlRfTk9OWE1MLCBCVF9OT05YTUwsCisvKiAweDEwICovIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwKKy8qIDB4MTQgKi8gQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwgQlRfTk9OWE1MLAorLyogMHgxOCAqLyBCVF9OT05YTUwsIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsCisvKiAweDFDICovIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwKKy8qIDB4MjAgKi8gQlRfUywgQlRfRVhDTCwgQlRfUVVPVCwgQlRfTlVNLAorLyogMHgyNCAqLyBCVF9PVEhFUiwgQlRfUEVSQ05ULCBCVF9BTVAsIEJUX0FQT1MsCisvKiAweDI4ICovIEJUX0xQQVIsIEJUX1JQQVIsIEJUX0FTVCwgQlRfUExVUywKKy8qIDB4MkMgKi8gQlRfQ09NTUEsIEJUX01JTlVTLCBCVF9OQU1FLCBCVF9TT0wsCisvKiAweDMwICovIEJUX0RJR0lULCBCVF9ESUdJVCwgQlRfRElHSVQsIEJUX0RJR0lULAorLyogMHgzNCAqLyBCVF9ESUdJVCwgQlRfRElHSVQsIEJUX0RJR0lULCBCVF9ESUdJVCwKKy8qIDB4MzggKi8gQlRfRElHSVQsIEJUX0RJR0lULCBCVF9DT0xPTiwgQlRfU0VNSSwKKy8qIDB4M0MgKi8gQlRfTFQsIEJUX0VRVUFMUywgQlRfR1QsIEJUX1FVRVNULAorLyogMHg0MCAqLyBCVF9PVEhFUiwgQlRfSEVYLCBCVF9IRVgsIEJUX0hFWCwKKy8qIDB4NDQgKi8gQlRfSEVYLCBCVF9IRVgsIEJUX0hFWCwgQlRfTk1TVFJULAorLyogMHg0OCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCisvKiAweDRDICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKKy8qIDB4NTAgKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULAorLyogMHg1NCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCisvKiAweDU4ICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX0xTUUIsCisvKiAweDVDICovIEJUX09USEVSLCBCVF9SU1FCLCBCVF9PVEhFUiwgQlRfTk1TVFJULAorLyogMHg2MCAqLyBCVF9PVEhFUiwgQlRfSEVYLCBCVF9IRVgsIEJUX0hFWCwKKy8qIDB4NjQgKi8gQlRfSEVYLCBCVF9IRVgsIEJUX0hFWCwgQlRfTk1TVFJULAorLyogMHg2OCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCisvKiAweDZDICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKKy8qIDB4NzAgKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULAorLyogMHg3NCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCisvKiAweDc4ICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX09USEVSLAorLyogMHg3QyAqLyBCVF9WRVJCQVIsIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9saWIvaW50ZXJuYWwuaCBiL2V4cGF0LTIuMC4xL2xpYi9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNTQ1NDgKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9saWIvaW50ZXJuYWwuaApAQCAtMCwwICsxLDczIEBACisvKiBpbnRlcm5hbC5oCisKKyAgIEludGVybmFsIGRlZmluaXRpb25zIHVzZWQgYnkgRXhwYXQuICBUaGlzIGlzIG5vdCBuZWVkZWQgdG8gY29tcGlsZQorICAgY2xpZW50IGNvZGUuCisKKyAgIFRoZSBmb2xsb3dpbmcgY2FsbGluZyBjb252ZW50aW9uIG1hY3JvcyBhcmUgZGVmaW5lZCBmb3IgZnJlcXVlbnRseQorICAgY2FsbGVkIGZ1bmN0aW9uczoKKworICAgRkFTVENBTEwgICAgLSBVc2VkIGZvciB0aG9zZSBpbnRlcm5hbCBmdW5jdGlvbnMgdGhhdCBoYXZlIGEgc2ltcGxlCisgICAgICAgICAgICAgICAgIGJvZHkgYW5kIGEgbG93IG51bWJlciBvZiBhcmd1bWVudHMgYW5kIGxvY2FsIHZhcmlhYmxlcy4KKworICAgUFRSQ0FMTCAgICAgLSBVc2VkIGZvciBmdW5jdGlvbnMgY2FsbGVkIHRob3VnaCBmdW5jdGlvbiBwb2ludGVycy4KKworICAgUFRSRkFTVENBTEwgLSBMaWtlIFBUUkNBTEwsIGJ1dCBmb3IgbG93IG51bWJlciBvZiBhcmd1bWVudHMuCisKKyAgIGlubGluZSAgICAgIC0gVXNlZCBmb3Igc2VsZWN0ZWQgaW50ZXJuYWwgZnVuY3Rpb25zIGZvciB3aGljaCBpbmxpbmluZworICAgICAgICAgICAgICAgICBtYXkgaW1wcm92ZSBwZXJmb3JtYW5jZSBvbiBzb21lIHBsYXRmb3Jtcy4KKworICAgTm90ZTogVXNlIG9mIHRoZXNlIG1hY3JvcyBpcyBiYXNlZCBvbiBqdWRnZW1lbnQsIG5vdCBoYXJkIHJ1bGVzLAorICAgICAgICAgYW5kIHRoZXJlZm9yZSBzdWJqZWN0IHRvIGNoYW5nZS4KKyovCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9faTM4Nl9fKSAmJiAhZGVmaW5lZChfX01JTkdXMzJfXykKKy8qIFdlJ2xsIHVzZSB0aGlzIHZlcnNpb24gYnkgZGVmYXVsdCBvbmx5IHdoZXJlIHdlIGtub3cgaXQgaGVscHMuCisKKyAgIHJlZ3Bhcm0oKSBnZW5lcmF0ZXMgd2FybmluZ3Mgb24gU29sYXJpcyBib3hlcy4gICBTZWUgU0YgYnVnICM2OTI4NzguCisKKyAgIEluc3RhYmlsaXR5IHJlcG9ydGVkIHdpdGggZWdjcyBvbiBhIFJlZEhhdCBMaW51eCA3LjMuCisgICBMZXQncyBjb21tZW50IG91dDoKKyAgICNkZWZpbmUgRkFTVENBTEwgX19hdHRyaWJ1dGVfXygoc3RkY2FsbCwgcmVncGFybSgzKSkpCisgICBhbmQgbGV0J3MgdHJ5IHRoaXM6CisqLworI2RlZmluZSBGQVNUQ0FMTCBfX2F0dHJpYnV0ZV9fKChyZWdwYXJtKDMpKSkKKyNkZWZpbmUgUFRSRkFTVENBTEwgX19hdHRyaWJ1dGVfXygocmVncGFybSgzKSkpCisjZW5kaWYKKworLyogVXNpbmcgX19mYXN0Y2FsbCBzZWVtcyB0byBoYXZlIGFuIHVuZXhwZWN0ZWQgbmVnYXRpdmUgZWZmZWN0IHVuZGVyCisgICBNUyBWQysrLCBlc3BlY2lhbGx5IGZvciBmdW5jdGlvbiBwb2ludGVycywgc28gd2Ugd29uJ3QgdXNlIGl0IGZvcgorICAgbm93IG9uIHRoYXQgcGxhdGZvcm0uIEl0IG1heSBiZSByZWNvbnNpZGVyZWQgZm9yIGEgZnV0dXJlIHJlbGVhc2UKKyAgIGlmIGl0IGNhbiBiZSBtYWRlIG1vcmUgZWZmZWN0aXZlLgorICAgTGlrZWx5IHJlYXNvbjogX19mYXN0Y2FsbCBvbiBXaW5kb3dzIGlzIGxpa2Ugc3RkY2FsbCwgdGhlcmVmb3JlCisgICB0aGUgY29tcGlsZXIgY2Fubm90IHBlcmZvcm0gc3RhY2sgb3B0aW1pemF0aW9ucyBmb3IgY2FsbCBjbHVzdGVycy4KKyovCisKKy8qIE1ha2Ugc3VyZSBhbGwgb2YgdGhlc2UgYXJlIGRlZmluZWQgaWYgdGhleSBhcmVuJ3QgYWxyZWFkeS4gKi8KKworI2lmbmRlZiBGQVNUQ0FMTAorI2RlZmluZSBGQVNUQ0FMTAorI2VuZGlmCisKKyNpZm5kZWYgUFRSQ0FMTAorI2RlZmluZSBQVFJDQUxMCisjZW5kaWYKKworI2lmbmRlZiBQVFJGQVNUQ0FMTAorI2RlZmluZSBQVFJGQVNUQ0FMTAorI2VuZGlmCisKKyNpZm5kZWYgWE1MX01JTl9TSVpFCisjaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkKGlubGluZSkKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBpbmxpbmUgX19pbmxpbmUKKyNlbmRpZiAvKiBfX0dOVUNfXyAqLworI2VuZGlmCisjZW5kaWYgLyogWE1MX01JTl9TSVpFICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBpbmxpbmUgaW5saW5lCisjZWxzZQorI2lmbmRlZiBpbmxpbmUKKyNkZWZpbmUgaW5saW5lCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvbGliL2xhdGluMXRhYi5oIGIvZXhwYXQtMi4wLjEvbGliL2xhdGluMXRhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYzI1ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9saWIvbGF0aW4xdGFiLmgKQEAgLTAsMCArMSwzNiBAQAorLyogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5IFRoYWkgT3BlbiBTb3VyY2UgU29mdHdhcmUgQ2VudGVyIEx0ZAorICAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIGNvcHlpbmcgcGVybWlzc2lvbi4KKyovCisKKy8qIDB4ODAgKi8gQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsCisvKiAweDg0ICovIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsIEJUX09USEVSLAorLyogMHg4OCAqLyBCVF9PVEhFUiwgQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwKKy8qIDB4OEMgKi8gQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsCisvKiAweDkwICovIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsIEJUX09USEVSLAorLyogMHg5NCAqLyBCVF9PVEhFUiwgQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwKKy8qIDB4OTggKi8gQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsCisvKiAweDlDICovIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsIEJUX09USEVSLAorLyogMHhBMCAqLyBCVF9PVEhFUiwgQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwKKy8qIDB4QTQgKi8gQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsCisvKiAweEE4ICovIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfTk1TVFJULCBCVF9PVEhFUiwKKy8qIDB4QUMgKi8gQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsCisvKiAweEIwICovIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsIEJUX09USEVSLAorLyogMHhCNCAqLyBCVF9PVEhFUiwgQlRfTk1TVFJULCBCVF9PVEhFUiwgQlRfTkFNRSwKKy8qIDB4QjggKi8gQlRfT1RIRVIsIEJUX09USEVSLCBCVF9OTVNUUlQsIEJUX09USEVSLAorLyogMHhCQyAqLyBCVF9PVEhFUiwgQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwKKy8qIDB4QzAgKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULAorLyogMHhDNCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCisvKiAweEM4ICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKKy8qIDB4Q0MgKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULAorLyogMHhEMCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCisvKiAweEQ0ICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX09USEVSLAorLyogMHhEOCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCisvKiAweERDICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKKy8qIDB4RTAgKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULAorLyogMHhFNCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCisvKiAweEU4ICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKKy8qIDB4RUMgKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULAorLyogMHhGMCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCisvKiAweEY0ICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX09USEVSLAorLyogMHhGOCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCisvKiAweEZDICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2xpYi9saWJleHBhdC5kZWYgYi9leHBhdC0yLjAuMS9saWIvbGliZXhwYXQuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjBiYmMKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9saWIvbGliZXhwYXQuZGVmCkBAIC0wLDAgKzEsNzMgQEAKKzsgREVGIGZpbGUgZm9yIE1TIFZDKysKKworTElCUkFSWQorRVhQT1JUUworICBYTUxfRGVmYXVsdEN1cnJlbnQgQDEKKyAgWE1MX0Vycm9yU3RyaW5nIEAyCisgIFhNTF9FeHBhdFZlcnNpb24gQDMKKyAgWE1MX0V4cGF0VmVyc2lvbkluZm8gQDQKKyAgWE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlIEA1CisgIFhNTF9HZXRCYXNlIEA2CisgIFhNTF9HZXRCdWZmZXIgQDcKKyAgWE1MX0dldEN1cnJlbnRCeXRlQ291bnQgQDgKKyAgWE1MX0dldEN1cnJlbnRCeXRlSW5kZXggQDkKKyAgWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIgQDEwCisgIFhNTF9HZXRDdXJyZW50TGluZU51bWJlciBAMTEKKyAgWE1MX0dldEVycm9yQ29kZSBAMTIKKyAgWE1MX0dldElkQXR0cmlidXRlSW5kZXggQDEzCisgIFhNTF9HZXRJbnB1dENvbnRleHQgQDE0CisgIFhNTF9HZXRTcGVjaWZpZWRBdHRyaWJ1dGVDb3VudCBAMTUKKyAgWE1MX1BhcnNlIEAxNgorICBYTUxfUGFyc2VCdWZmZXIgQDE3CisgIFhNTF9QYXJzZXJDcmVhdGUgQDE4CisgIFhNTF9QYXJzZXJDcmVhdGVOUyBAMTkKKyAgWE1MX1BhcnNlckNyZWF0ZV9NTSBAMjAKKyAgWE1MX1BhcnNlckZyZWUgQDIxCisgIFhNTF9TZXRBdHRsaXN0RGVjbEhhbmRsZXIgQDIyCisgIFhNTF9TZXRCYXNlIEAyMworICBYTUxfU2V0Q2RhdGFTZWN0aW9uSGFuZGxlciBAMjQKKyAgWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyIEAyNQorICBYTUxfU2V0Q29tbWVudEhhbmRsZXIgQDI2CisgIFhNTF9TZXREZWZhdWx0SGFuZGxlciBAMjcKKyAgWE1MX1NldERlZmF1bHRIYW5kbGVyRXhwYW5kIEAyOAorICBYTUxfU2V0RG9jdHlwZURlY2xIYW5kbGVyIEAyOQorICBYTUxfU2V0RWxlbWVudERlY2xIYW5kbGVyIEAzMAorICBYTUxfU2V0RWxlbWVudEhhbmRsZXIgQDMxCisgIFhNTF9TZXRFbmNvZGluZyBAMzIKKyAgWE1MX1NldEVuZENkYXRhU2VjdGlvbkhhbmRsZXIgQDMzCisgIFhNTF9TZXRFbmREb2N0eXBlRGVjbEhhbmRsZXIgQDM0CisgIFhNTF9TZXRFbmRFbGVtZW50SGFuZGxlciBAMzUKKyAgWE1MX1NldEVuZE5hbWVzcGFjZURlY2xIYW5kbGVyIEAzNgorICBYTUxfU2V0RW50aXR5RGVjbEhhbmRsZXIgQDM3CisgIFhNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIgQDM4CisgIFhNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcgQDM5CisgIFhNTF9TZXROYW1lc3BhY2VEZWNsSGFuZGxlciBANDAKKyAgWE1MX1NldE5vdFN0YW5kYWxvbmVIYW5kbGVyIEA0MQorICBYTUxfU2V0Tm90YXRpb25EZWNsSGFuZGxlciBANDIKKyAgWE1MX1NldFBhcmFtRW50aXR5UGFyc2luZyBANDMKKyAgWE1MX1NldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIgQDQ0CisgIFhNTF9TZXRSZXR1cm5OU1RyaXBsZXQgQDQ1CisgIFhNTF9TZXRTdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgQDQ2CisgIFhNTF9TZXRTdGFydERvY3R5cGVEZWNsSGFuZGxlciBANDcKKyAgWE1MX1NldFN0YXJ0RWxlbWVudEhhbmRsZXIgQDQ4CisgIFhNTF9TZXRTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyIEA0OQorICBYTUxfU2V0VW5rbm93bkVuY29kaW5nSGFuZGxlciBANTAKKyAgWE1MX1NldFVucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIgQDUxCisgIFhNTF9TZXRVc2VyRGF0YSBANTIKKyAgWE1MX1NldFhtbERlY2xIYW5kbGVyIEA1MworICBYTUxfVXNlUGFyc2VyQXNIYW5kbGVyQXJnIEA1NAorOyBhZGRlZCB3aXRoIHZlcnNpb24gMS45NS4zCisgIFhNTF9QYXJzZXJSZXNldCBANTUKKyAgWE1MX1NldFNraXBwZWRFbnRpdHlIYW5kbGVyIEA1NgorOyBhZGRlZCB3aXRoIHZlcnNpb24gMS45NS41CisgIFhNTF9HZXRGZWF0dXJlTGlzdCBANTcKKyAgWE1MX1VzZUZvcmVpZ25EVEQgQDU4Cis7IGFkZGVkIHdpdGggdmVyc2lvbiAxLjk1LjYKKyAgWE1MX0ZyZWVDb250ZW50TW9kZWwgQDU5CisgIFhNTF9NZW1NYWxsb2MgQDYwCisgIFhNTF9NZW1SZWFsbG9jIEA2MQorICBYTUxfTWVtRnJlZSBANjIKKzsgYWRkZWQgd2l0aCB2ZXJzaW9uIDEuOTUuOAorICBYTUxfU3RvcFBhcnNlciBANjMKKyAgWE1MX1Jlc3VtZVBhcnNlciBANjQKKyAgWE1MX0dldFBhcnNpbmdTdGF0dXMgQDY1CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9saWIvbGliZXhwYXR3LmRlZiBiL2V4cGF0LTIuMC4xL2xpYi9saWJleHBhdHcuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjBiYmMKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9saWIvbGliZXhwYXR3LmRlZgpAQCAtMCwwICsxLDczIEBACis7IERFRiBmaWxlIGZvciBNUyBWQysrCisKK0xJQlJBUlkKK0VYUE9SVFMKKyAgWE1MX0RlZmF1bHRDdXJyZW50IEAxCisgIFhNTF9FcnJvclN0cmluZyBAMgorICBYTUxfRXhwYXRWZXJzaW9uIEAzCisgIFhNTF9FeHBhdFZlcnNpb25JbmZvIEA0CisgIFhNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZSBANQorICBYTUxfR2V0QmFzZSBANgorICBYTUxfR2V0QnVmZmVyIEA3CisgIFhNTF9HZXRDdXJyZW50Qnl0ZUNvdW50IEA4CisgIFhNTF9HZXRDdXJyZW50Qnl0ZUluZGV4IEA5CisgIFhNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyIEAxMAorICBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIgQDExCisgIFhNTF9HZXRFcnJvckNvZGUgQDEyCisgIFhNTF9HZXRJZEF0dHJpYnV0ZUluZGV4IEAxMworICBYTUxfR2V0SW5wdXRDb250ZXh0IEAxNAorICBYTUxfR2V0U3BlY2lmaWVkQXR0cmlidXRlQ291bnQgQDE1CisgIFhNTF9QYXJzZSBAMTYKKyAgWE1MX1BhcnNlQnVmZmVyIEAxNworICBYTUxfUGFyc2VyQ3JlYXRlIEAxOAorICBYTUxfUGFyc2VyQ3JlYXRlTlMgQDE5CisgIFhNTF9QYXJzZXJDcmVhdGVfTU0gQDIwCisgIFhNTF9QYXJzZXJGcmVlIEAyMQorICBYTUxfU2V0QXR0bGlzdERlY2xIYW5kbGVyIEAyMgorICBYTUxfU2V0QmFzZSBAMjMKKyAgWE1MX1NldENkYXRhU2VjdGlvbkhhbmRsZXIgQDI0CisgIFhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlciBAMjUKKyAgWE1MX1NldENvbW1lbnRIYW5kbGVyIEAyNgorICBYTUxfU2V0RGVmYXVsdEhhbmRsZXIgQDI3CisgIFhNTF9TZXREZWZhdWx0SGFuZGxlckV4cGFuZCBAMjgKKyAgWE1MX1NldERvY3R5cGVEZWNsSGFuZGxlciBAMjkKKyAgWE1MX1NldEVsZW1lbnREZWNsSGFuZGxlciBAMzAKKyAgWE1MX1NldEVsZW1lbnRIYW5kbGVyIEAzMQorICBYTUxfU2V0RW5jb2RpbmcgQDMyCisgIFhNTF9TZXRFbmRDZGF0YVNlY3Rpb25IYW5kbGVyIEAzMworICBYTUxfU2V0RW5kRG9jdHlwZURlY2xIYW5kbGVyIEAzNAorICBYTUxfU2V0RW5kRWxlbWVudEhhbmRsZXIgQDM1CisgIFhNTF9TZXRFbmROYW1lc3BhY2VEZWNsSGFuZGxlciBAMzYKKyAgWE1MX1NldEVudGl0eURlY2xIYW5kbGVyIEAzNworICBYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIEAzOAorICBYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnIEAzOQorICBYTUxfU2V0TmFtZXNwYWNlRGVjbEhhbmRsZXIgQDQwCisgIFhNTF9TZXROb3RTdGFuZGFsb25lSGFuZGxlciBANDEKKyAgWE1MX1NldE5vdGF0aW9uRGVjbEhhbmRsZXIgQDQyCisgIFhNTF9TZXRQYXJhbUVudGl0eVBhcnNpbmcgQDQzCisgIFhNTF9TZXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyIEA0NAorICBYTUxfU2V0UmV0dXJuTlNUcmlwbGV0IEA0NQorICBYTUxfU2V0U3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyIEA0NgorICBYTUxfU2V0U3RhcnREb2N0eXBlRGVjbEhhbmRsZXIgQDQ3CisgIFhNTF9TZXRTdGFydEVsZW1lbnRIYW5kbGVyIEA0OAorICBYTUxfU2V0U3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciBANDkKKyAgWE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXIgQDUwCisgIFhNTF9TZXRVbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyIEA1MQorICBYTUxfU2V0VXNlckRhdGEgQDUyCisgIFhNTF9TZXRYbWxEZWNsSGFuZGxlciBANTMKKyAgWE1MX1VzZVBhcnNlckFzSGFuZGxlckFyZyBANTQKKzsgYWRkZWQgd2l0aCB2ZXJzaW9uIDEuOTUuMworICBYTUxfUGFyc2VyUmVzZXQgQDU1CisgIFhNTF9TZXRTa2lwcGVkRW50aXR5SGFuZGxlciBANTYKKzsgYWRkZWQgd2l0aCB2ZXJzaW9uIDEuOTUuNQorICBYTUxfR2V0RmVhdHVyZUxpc3QgQDU3CisgIFhNTF9Vc2VGb3JlaWduRFREIEA1OAorOyBhZGRlZCB3aXRoIHZlcnNpb24gMS45NS42CisgIFhNTF9GcmVlQ29udGVudE1vZGVsIEA1OQorICBYTUxfTWVtTWFsbG9jIEA2MAorICBYTUxfTWVtUmVhbGxvYyBANjEKKyAgWE1MX01lbUZyZWUgQDYyCis7IGFkZGVkIHdpdGggdmVyc2lvbiAxLjk1LjgKKyAgWE1MX1N0b3BQYXJzZXIgQDYzCisgIFhNTF9SZXN1bWVQYXJzZXIgQDY0CisgIFhNTF9HZXRQYXJzaW5nU3RhdHVzIEA2NQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvbGliL21hY2NvbmZpZy5oIGIvZXhwYXQtMi4wLjEvbGliL21hY2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MjVjYWEKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9saWIvbWFjY29uZmlnLmgKQEAgLTAsMCArMSw1MyBAQAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBDb3B5cmlnaHQgMjAwMCwgQ2xhcmsgQ29vcGVyCisqKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKioKKyoqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZS4gWW91IGFyZSBwZXJtaXR0ZWQgdG8gY29weSwgZGlzdHJpYnV0ZSwgb3IgbW9kaWZ5CisqKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1JVC9YIGxpY2Vuc2UgKGNvbnRhaW5lZCBpbiB0aGUgQ09QWUlORyBmaWxlCisqKiB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uLikKKyoqCisqLworCisjaWZuZGVmIE1BQ0NPTkZJR19ICisjZGVmaW5lIE1BQ0NPTkZJR19ICisKKworLyogMTIzNCA9IExJTF9FTkRJQU4sIDQzMjEgPSBCSUdFTkRJQU4gKi8KKyNkZWZpbmUgQllURU9SREVSICA0MzIxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYmNvcHknIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfQkNPUFkKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtZW1tb3ZlJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9NRU1NT1ZFCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICovCisjdW5kZWYgSEFWRV9NTUFQCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfVU5JU1REX0gKKworLyogd2hldGhlciBieXRlb3JkZXIgaXMgYmlnZW5kaWFuICovCisjZGVmaW5lIFdPUkRTX0JJR0VORElBTgorCisvKiBEZWZpbmUgdG8gc3BlY2lmeSBob3cgbXVjaCBjb250ZXh0IHRvIHJldGFpbiBhcm91bmQgdGhlIGN1cnJlbnQgcGFyc2UKKyAgIHBvaW50LiAqLworI3VuZGVmIFhNTF9DT05URVhUX0JZVEVTCisKKy8qIERlZmluZSB0byBtYWtlIHBhcmFtZXRlciBlbnRpdHkgcGFyc2luZyBmdW5jdGlvbmFsaXR5IGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgWE1MX0RURAorCisvKiBEZWZpbmUgdG8gbWFrZSBYTUwgTmFtZXNwYWNlcyBmdW5jdGlvbmFsaXR5IGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgWE1MX05TCisKKy8qIERlZmluZSB0byBlbXB0eSBpZiBgY29uc3QnIGRvZXMgbm90IGNvbmZvcm0gdG8gQU5TSSBDLiAqLworI3VuZGVmIGNvbnN0CisKKy8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2VzIG5vdCBkZWZpbmUuICovCisjZGVmaW5lIG9mZl90ICBsb25nCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLworI3VuZGVmIHNpemVfdAorCisKKyNlbmRpZiAvKiBpZm5kZWYgTUFDQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2xpYi9uYW1ldGFiLmggYi9leHBhdC0yLjAuMS9saWIvbmFtZXRhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNWU2MmMKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9saWIvbmFtZXRhYi5oCkBAIC0wLDAgKzEsMTUwIEBACitzdGF0aWMgY29uc3QgdW5zaWduZWQgbmFtaW5nQml0bWFwW10gPSB7CisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsCisweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLAorMHgwMDAwMDAwMCwgMHgwNDAwMDAwMCwgMHg4N0ZGRkZGRSwgMHgwN0ZGRkZGRSwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4RkY3RkZGRkYsIDB4RkY3RkZGRkYsCisweEZGRkZGRkZGLCAweDdGRjNGRkZGLCAweEZGRkZGREZFLCAweDdGRkZGRkZGLAorMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHhGRkZGRTAwRiwgMHhGQzMxRkZGRiwKKzB4MDBGRkZGRkYsIDB4MDAwMDAwMDAsIDB4RkZGRjAwMDAsIDB4RkZGRkZGRkYsCisweEZGRkZGRkZGLCAweEY4MDAwMUZGLCAweDAwMDAwMDAzLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4RkZGRkQ3NDAsIDB4RkZGRkZGRkIsIDB4NTQ3RjdGRkYsIDB4MDAwRkZGRkQsCisweEZGRkZERkZFLCAweEZGRkZGRkZGLCAweERGRkVGRkZGLCAweEZGRkZGRkZGLAorMHhGRkZGMDAwMywgMHhGRkZGRkZGRiwgMHhGRkZGMTk5RiwgMHgwMzNGQ0ZGRiwKKzB4MDAwMDAwMDAsIDB4RkZGRTAwMDAsIDB4MDI3RkZGRkYsIDB4RkZGRkZGRkUsCisweDAwMDAwMDdGLCAweDAwMDAwMDAwLCAweEZGRkYwMDAwLCAweDAwMDcwN0ZGLAorMHgwMDAwMDAwMCwgMHgwN0ZGRkZGRSwgMHgwMDAwMDdGRSwgMHhGRkZFMDAwMCwKKzB4RkZGRkZGRkYsIDB4N0NGRkZGRkYsIDB4MDAyRjdGRkYsIDB4MDAwMDAwNjAsCisweEZGRkZGRkUwLCAweDIzRkZGRkZGLCAweEZGMDAwMDAwLCAweDAwMDAwMDAzLAorMHhGRkY5OUZFMCwgMHgwM0M1RkRGRiwgMHhCMDAwMDAwMCwgMHgwMDAzMDAwMywKKzB4RkZGOTg3RTAsIDB4MDM2REZERkYsIDB4NUUwMDAwMDAsIDB4MDAxQzAwMDAsCisweEZGRkJBRkUwLCAweDIzRURGREZGLCAweDAwMDAwMDAwLCAweDAwMDAwMDAxLAorMHhGRkY5OUZFMCwgMHgyM0NERkRGRiwgMHhCMDAwMDAwMCwgMHgwMDAwMDAwMywKKzB4RDYzREM3RTAsIDB4MDNCRkM3MTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweEZGRkRERkUwLCAweDAzRUZGREZGLCAweDAwMDAwMDAwLCAweDAwMDAwMDAzLAorMHhGRkZEREZFMCwgMHgwM0VGRkRGRiwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMywKKzB4RkZGRERGRTAsIDB4MDNGRkZERkYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDMsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHhGRkZGRkZGRSwgMHgwMDBEN0ZGRiwgMHgwMDAwMDAzRiwgMHgwMDAwMDAwMCwKKzB4RkVGMDI1OTYsIDB4MjAwRDZDQUUsIDB4MDAwMDAwMUYsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweEZGRkZGRUZGLCAweDAwMDAwM0ZGLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweEZGRkZGRkZGLCAweEZGRkYwMDNGLCAweDAwN0ZGRkZGLAorMHgwMDA3REFFRCwgMHg1MDAwMDAwMCwgMHg4MjMxNTAwMSwgMHgwMDJDNjJBQiwKKzB4NDAwMDAwMDAsIDB4RjU4MEM5MDAsIDB4MDAwMDAwMDcsIDB4MDIwMTA4MDAsCisweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLAorMHgwRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHgwM0ZGRkZGRiwKKzB4M0YzRkZGRkYsIDB4RkZGRkZGRkYsIDB4QUFGRjNGM0YsIDB4M0ZGRkZGRkYsCisweEZGRkZGRkZGLCAweDVGREZGRkZGLCAweDBGQ0YxRkRDLCAweDFGREMxRkZGLAorMHgwMDAwMDAwMCwgMHgwMDAwNEM0MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDcsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDgwLCAweDAwMDAwM0ZFLCAweEZGRkZGRkZFLCAweEZGRkZGRkZGLAorMHgwMDFGRkZGRiwgMHhGRkZGRkZGRSwgMHhGRkZGRkZGRiwgMHgwN0ZGRkZGRiwKKzB4RkZGRkZGRTAsIDB4MDAwMDFGRkYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwKKzB4RkZGRkZGRkYsIDB4MDAwMDAwM0YsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLAorMHhGRkZGRkZGRiwgMHgwMDAwMDAwRiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDdGRjYwMDAsIDB4ODdGRkZGRkUsIDB4MDdGRkZGRkUsCisweDAwMDAwMDAwLCAweDAwODAwMDAwLCAweEZGN0ZGRkZGLCAweEZGN0ZGRkZGLAorMHgwMEZGRkZGRiwgMHgwMDAwMDAwMCwgMHhGRkZGMDAwMCwgMHhGRkZGRkZGRiwKKzB4RkZGRkZGRkYsIDB4RjgwMDAxRkYsIDB4MDAwMzAwMDMsIDB4MDAwMDAwMDAsCisweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweDAwMDAwMDNGLCAweDAwMDAwMDAzLAorMHhGRkZGRDdDMCwgMHhGRkZGRkZGQiwgMHg1NDdGN0ZGRiwgMHgwMDBGRkZGRCwKKzB4RkZGRkRGRkUsIDB4RkZGRkZGRkYsIDB4REZGRUZGRkYsIDB4RkZGRkZGRkYsCisweEZGRkYwMDdCLCAweEZGRkZGRkZGLCAweEZGRkYxOTlGLCAweDAzM0ZDRkZGLAorMHgwMDAwMDAwMCwgMHhGRkZFMDAwMCwgMHgwMjdGRkZGRiwgMHhGRkZGRkZGRSwKKzB4RkZGRTAwN0YsIDB4QkJGRkZGRkIsIDB4RkZGRjAwMTYsIDB4MDAwNzA3RkYsCisweDAwMDAwMDAwLCAweDA3RkZGRkZFLCAweDAwMDdGRkZGLCAweEZGRkYwM0ZGLAorMHhGRkZGRkZGRiwgMHg3Q0ZGRkZGRiwgMHhGRkVGN0ZGRiwgMHgwM0ZGM0RGRiwKKzB4RkZGRkZGRUUsIDB4RjNGRkZGRkYsIDB4RkYxRTNGRkYsIDB4MDAwMEZGQ0YsCisweEZGRjk5RkVFLCAweEQzQzVGREZGLCAweEIwODAzOTlGLCAweDAwMDNGRkNGLAorMHhGRkY5ODdFNCwgMHhEMzZERkRGRiwgMHg1RTAwMzk4NywgMHgwMDFGRkZDMCwKKzB4RkZGQkFGRUUsIDB4RjNFREZERkYsIDB4MDAwMDNCQkYsIDB4MDAwMEZGQzEsCisweEZGRjk5RkVFLCAweEYzQ0RGREZGLCAweEIwQzAzOThGLCAweDAwMDBGRkMzLAorMHhENjNEQzdFQywgMHhDM0JGQzcxOCwgMHgwMDgwM0RDNywgMHgwMDAwRkY4MCwKKzB4RkZGRERGRUUsIDB4QzNFRkZERkYsIDB4MDA2MDNEREYsIDB4MDAwMEZGQzMsCisweEZGRkRERkVDLCAweEMzRUZGREZGLCAweDQwNjAzRERGLCAweDAwMDBGRkMzLAorMHhGRkZEREZFQywgMHhDM0ZGRkRGRiwgMHgwMDgwM0RDRiwgMHgwMDAwRkZDMywKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweEZGRkZGRkZFLCAweDA3RkY3RkZGLCAweDAzRkY3RkZGLCAweDAwMDAwMDAwLAorMHhGRUYwMjU5NiwgMHgzQkZGNkNBRSwgMHgwM0ZGM0Y1RiwgMHgwMDAwMDAwMCwKKzB4MDMwMDAwMDAsIDB4QzJBMDAzRkYsIDB4RkZGRkZFRkYsIDB4RkZGRTAzRkYsCisweEZFQkYwRkRGLCAweDAyRkUzRkZGLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MUZGRjAwMDAsIDB4MDAwMDAwMDIsCisweDAwMDAwMEEwLCAweDAwM0VGRkZFLCAweEZGRkZGRkZFLCAweEZGRkZGRkZGLAorMHg2NjFGRkZGRiwgMHhGRkZGRkZGRSwgMHhGRkZGRkZGRiwgMHg3N0ZGRkZGRiwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBubXN0cnRQYWdlc1tdID0geworMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwMCwKKzB4MDAsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsCisweDEwLCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMiwgMHgxMywKKzB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgxNSwgMHgxNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwKKzB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKzB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKzB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKzB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MTcsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKzB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKzB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDE4LAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbmFtZVBhZ2VzW10gPSB7CisweDE5LCAweDAzLCAweDFBLCAweDFCLCAweDFDLCAweDFELCAweDFFLCAweDAwLAorMHgwMCwgMHgxRiwgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwKKzB4MTAsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEyLCAweDEzLAorMHgyNiwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDI3LCAweDE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLAorMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKzB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKzB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKzB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgxNywKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKzB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKzB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MTgsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKK307CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9saWIvdXRmOHRhYi5oIGIvZXhwYXQtMi4wLjEvbGliL3V0Zjh0YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmIzZTc3Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvbGliL3V0Zjh0YWIuaApAQCAtMCwwICsxLDM3IEBACisvKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgVGhhaSBPcGVuIFNvdXJjZSBTb2Z0d2FyZSBDZW50ZXIgTHRkCisgICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgY29weWluZyBwZXJtaXNzaW9uLgorKi8KKworCisvKiAweDgwICovIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLAorLyogMHg4NCAqLyBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwKKy8qIDB4ODggKi8gQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsCisvKiAweDhDICovIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLAorLyogMHg5MCAqLyBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwKKy8qIDB4OTQgKi8gQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsCisvKiAweDk4ICovIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLAorLyogMHg5QyAqLyBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwKKy8qIDB4QTAgKi8gQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsCisvKiAweEE0ICovIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLAorLyogMHhBOCAqLyBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwKKy8qIDB4QUMgKi8gQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsCisvKiAweEIwICovIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLAorLyogMHhCNCAqLyBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwKKy8qIDB4QjggKi8gQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsCisvKiAweEJDICovIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLAorLyogMHhDMCAqLyBCVF9MRUFEMiwgQlRfTEVBRDIsIEJUX0xFQUQyLCBCVF9MRUFEMiwKKy8qIDB4QzQgKi8gQlRfTEVBRDIsIEJUX0xFQUQyLCBCVF9MRUFEMiwgQlRfTEVBRDIsCisvKiAweEM4ICovIEJUX0xFQUQyLCBCVF9MRUFEMiwgQlRfTEVBRDIsIEJUX0xFQUQyLAorLyogMHhDQyAqLyBCVF9MRUFEMiwgQlRfTEVBRDIsIEJUX0xFQUQyLCBCVF9MRUFEMiwKKy8qIDB4RDAgKi8gQlRfTEVBRDIsIEJUX0xFQUQyLCBCVF9MRUFEMiwgQlRfTEVBRDIsCisvKiAweEQ0ICovIEJUX0xFQUQyLCBCVF9MRUFEMiwgQlRfTEVBRDIsIEJUX0xFQUQyLAorLyogMHhEOCAqLyBCVF9MRUFEMiwgQlRfTEVBRDIsIEJUX0xFQUQyLCBCVF9MRUFEMiwKKy8qIDB4REMgKi8gQlRfTEVBRDIsIEJUX0xFQUQyLCBCVF9MRUFEMiwgQlRfTEVBRDIsCisvKiAweEUwICovIEJUX0xFQUQzLCBCVF9MRUFEMywgQlRfTEVBRDMsIEJUX0xFQUQzLAorLyogMHhFNCAqLyBCVF9MRUFEMywgQlRfTEVBRDMsIEJUX0xFQUQzLCBCVF9MRUFEMywKKy8qIDB4RTggKi8gQlRfTEVBRDMsIEJUX0xFQUQzLCBCVF9MRUFEMywgQlRfTEVBRDMsCisvKiAweEVDICovIEJUX0xFQUQzLCBCVF9MRUFEMywgQlRfTEVBRDMsIEJUX0xFQUQzLAorLyogMHhGMCAqLyBCVF9MRUFENCwgQlRfTEVBRDQsIEJUX0xFQUQ0LCBCVF9MRUFENCwKKy8qIDB4RjQgKi8gQlRfTEVBRDQsIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsCisvKiAweEY4ICovIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwKKy8qIDB4RkMgKi8gQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX01BTEZPUk0sIEJUX01BTEZPUk0sCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9saWIvd2luY29uZmlnLmggYi9leHBhdC0yLjAuMS9saWIvd2luY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFiNzkxZAotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2xpYi93aW5jb25maWcuaApAQCAtMCwwICsxLDMwIEBACisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqIENvcHlyaWdodCAyMDAwLCBDbGFyayBDb29wZXIKKyoqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqKgorKiogVGhpcyBpcyBmcmVlIHNvZnR3YXJlLiBZb3UgYXJlIHBlcm1pdHRlZCB0byBjb3B5LCBkaXN0cmlidXRlLCBvciBtb2RpZnkKKyoqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTUlUL1ggbGljZW5zZSAoY29udGFpbmVkIGluIHRoZSBDT1BZSU5HIGZpbGUKKyoqIHdpdGggdGhpcyBkaXN0cmlidXRpb24uKQorKi8KKworI2lmbmRlZiBXSU5DT05GSUdfSAorI2RlZmluZSBXSU5DT05GSUdfSAorCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjdW5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgorCisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgWE1MX05TIDEKKyNkZWZpbmUgWE1MX0RURCAxCisjZGVmaW5lIFhNTF9DT05URVhUX0JZVEVTIDEwMjQKKworLyogd2Ugd2lsbCBhc3N1bWUgYWxsIFdpbmRvd3MgcGxhdGZvcm1zIGFyZSBsaXR0bGUgZW5kaWFuICovCisjZGVmaW5lIEJZVEVPUkRFUiAxMjM0CisKKy8qIFdpbmRvd3MgaGFzIG1lbW1vdmUoKSBhdmFpbGFibGUuICovCisjZGVmaW5lIEhBVkVfTUVNTU9WRQorCisjZW5kaWYgLyogbmRlZiBXSU5DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvbGliL3htbHBhcnNlLmMgYi9leHBhdC0yLjAuMS9saWIveG1scGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGUzMWRlCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvbGliL3htbHBhcnNlLmMKQEAgLTAsMCArMSw2Mjg3IEBACisvKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgVGhhaSBPcGVuIFNvdXJjZSBTb2Z0d2FyZSBDZW50ZXIgTHRkCisgICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgY29weWluZyBwZXJtaXNzaW9uLgorKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPiAgICAgICAgICAgICAgICAgICAgIC8qIG1lbXNldCgpLCBtZW1jcHkoKSAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjZGVmaW5lIFhNTF9CVUlMRElOR19FWFBBVCAxCisKKyNpZmRlZiBDT01QSUxFRF9GUk9NX0RTUAorI2luY2x1ZGUgIndpbmNvbmZpZy5oIgorI2VsaWYgZGVmaW5lZChNQUNPU19DTEFTU0lDKQorI2luY2x1ZGUgIm1hY2NvbmZpZy5oIgorI2VsaWYgZGVmaW5lZChfX2FtaWdhb3M0X18pCisjaW5jbHVkZSAiYW1pZ2Fjb25maWcuaCIKKyNlbGlmIGRlZmluZWQoX19XQVRDT01DX18pCisjaW5jbHVkZSAid2F0Y29tY29uZmlnLmgiCisjZWxpZiBkZWZpbmVkKEhBVkVfRVhQQVRfQ09ORklHX0gpCisjaW5jbHVkZSA8ZXhwYXRfY29uZmlnLmg+CisjZW5kaWYgLyogbmRlZiBDT01QSUxFRF9GUk9NX0RTUCAqLworCisjaW5jbHVkZSAiYXNjaWkuaCIKKyNpbmNsdWRlICJleHBhdC5oIgorCisjaWZkZWYgWE1MX1VOSUNPREUKKyNkZWZpbmUgWE1MX0VOQ09ERV9NQVggWE1MX1VURjE2X0VOQ09ERV9NQVgKKyNkZWZpbmUgWG1sQ29udmVydCBYbWxVdGYxNkNvbnZlcnQKKyNkZWZpbmUgWG1sR2V0SW50ZXJuYWxFbmNvZGluZyBYbWxHZXRVdGYxNkludGVybmFsRW5jb2RpbmcKKyNkZWZpbmUgWG1sR2V0SW50ZXJuYWxFbmNvZGluZ05TIFhtbEdldFV0ZjE2SW50ZXJuYWxFbmNvZGluZ05TCisjZGVmaW5lIFhtbEVuY29kZSBYbWxVdGYxNkVuY29kZQorLyogVXNpbmcgcG9pbnRlciBzdWJ0cmFjdGlvbiB0byBjb252ZXJ0IHRvIGludGVnZXIgdHlwZS4gKi8KKyNkZWZpbmUgTVVTVF9DT05WRVJUKGVuYywgcykgKCEoZW5jKS0+aXNVdGYxNiB8fCAoKChjaGFyICopKHMpIC0gKGNoYXIgKilOVUxMKSAmIDEpKQordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBJQ0hBUjsKKyNlbHNlCisjZGVmaW5lIFhNTF9FTkNPREVfTUFYIFhNTF9VVEY4X0VOQ09ERV9NQVgKKyNkZWZpbmUgWG1sQ29udmVydCBYbWxVdGY4Q29udmVydAorI2RlZmluZSBYbWxHZXRJbnRlcm5hbEVuY29kaW5nIFhtbEdldFV0ZjhJbnRlcm5hbEVuY29kaW5nCisjZGVmaW5lIFhtbEdldEludGVybmFsRW5jb2RpbmdOUyBYbWxHZXRVdGY4SW50ZXJuYWxFbmNvZGluZ05TCisjZGVmaW5lIFhtbEVuY29kZSBYbWxVdGY4RW5jb2RlCisjZGVmaW5lIE1VU1RfQ09OVkVSVChlbmMsIHMpICghKGVuYyktPmlzVXRmOCkKK3R5cGVkZWYgY2hhciBJQ0hBUjsKKyNlbmRpZgorCisKKyNpZm5kZWYgWE1MX05TCisKKyNkZWZpbmUgWG1sSW5pdEVuY29kaW5nTlMgWG1sSW5pdEVuY29kaW5nCisjZGVmaW5lIFhtbEluaXRVbmtub3duRW5jb2RpbmdOUyBYbWxJbml0VW5rbm93bkVuY29kaW5nCisjdW5kZWYgWG1sR2V0SW50ZXJuYWxFbmNvZGluZ05TCisjZGVmaW5lIFhtbEdldEludGVybmFsRW5jb2RpbmdOUyBYbWxHZXRJbnRlcm5hbEVuY29kaW5nCisjZGVmaW5lIFhtbFBhcnNlWG1sRGVjbE5TIFhtbFBhcnNlWG1sRGVjbAorCisjZW5kaWYKKworI2lmZGVmIFhNTF9VTklDT0RFCisKKyNpZmRlZiBYTUxfVU5JQ09ERV9XQ0hBUl9UCisjZGVmaW5lIFhNTF9UKHgpIChjb25zdCB3Y2hhcl90KXgKKyNkZWZpbmUgWE1MX0woeCkgTCAjIyB4CisjZWxzZQorI2RlZmluZSBYTUxfVCh4KSAoY29uc3QgdW5zaWduZWQgc2hvcnQpeAorI2RlZmluZSBYTUxfTCh4KSB4CisjZW5kaWYKKworI2Vsc2UKKworI2RlZmluZSBYTUxfVCh4KSB4CisjZGVmaW5lIFhNTF9MKHgpIHgKKworI2VuZGlmCisKKy8qIFJvdW5kIHVwIG4gdG8gYmUgYSBtdWx0aXBsZSBvZiBzeiwgd2hlcmUgc3ogaXMgYSBwb3dlciBvZiAyLiAqLworI2RlZmluZSBST1VORF9VUChuLCBzeikgKCgobikgKyAoKHN6KSAtIDEpKSAmIH4oKHN6KSAtIDEpKQorCisvKiBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgbWVtbW92ZSgpIGRvZXNuJ3QgZXhpc3QuICovCisjaWZuZGVmIEhBVkVfTUVNTU9WRQorI2lmZGVmIEhBVkVfQkNPUFkKKyNkZWZpbmUgbWVtbW92ZShkLHMsbCkgYmNvcHkoKHMpLChkKSwobCkpCisjZWxzZQorI2Vycm9yIG1lbW1vdmUgZG9lcyBub3QgZXhpc3Qgb24gdGhpcyBwbGF0Zm9ybSwgbm9yIGlzIGEgc3Vic3RpdHV0ZSBhdmFpbGFibGUKKyNlbmRpZiAvKiBIQVZFX0JDT1BZICovCisjZW5kaWYgLyogSEFWRV9NRU1NT1ZFICovCisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInhtbHRvay5oIgorI2luY2x1ZGUgInhtbHJvbGUuaCIKKwordHlwZWRlZiBjb25zdCBYTUxfQ2hhciAqS0VZOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEtFWSBuYW1lOworfSBOQU1FRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBOQU1FRCAqKnY7CisgIHVuc2lnbmVkIGNoYXIgcG93ZXI7CisgIHNpemVfdCBzaXplOworICBzaXplX3QgdXNlZDsKKyAgY29uc3QgWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZSAqbWVtOworfSBIQVNIX1RBQkxFOworCisvKiBCYXNpYyBjaGFyYWN0ZXIgaGFzaCBhbGdvcml0aG0sIHRha2VuIGZyb20gUHl0aG9uJ3Mgc3RyaW5nIGhhc2g6CisgICBoID0gaCAqIDEwMDAwMDMgXiBjaGFyYWN0ZXIsIHRoZSBjb25zdGFudCBiZWluZyBhIHByaW1lIG51bWJlci4KKworKi8KKyNpZmRlZiBYTUxfVU5JQ09ERQorI2RlZmluZSBDSEFSX0hBU0goaCwgYykgXAorICAoKChoKSAqIDB4RjQyNDMpIF4gKHVuc2lnbmVkIHNob3J0KShjKSkKKyNlbHNlCisjZGVmaW5lIENIQVJfSEFTSChoLCBjKSBcCisgICgoKGgpICogMHhGNDI0MykgXiAodW5zaWduZWQgY2hhcikoYykpCisjZW5kaWYKKworLyogRm9yIHByb2JpbmcgKGFmdGVyIGEgY29sbGlzaW9uKSB3ZSBuZWVkIGEgc3RlcCBzaXplIHJlbGF0aXZlIHByaW1lCisgICB0byB0aGUgaGFzaCB0YWJsZSBzaXplLCB3aGljaCBpcyBhIHBvd2VyIG9mIDIuIFdlIHVzZSBkb3VibGUtaGFzaGluZywKKyAgIHNpbmNlIHdlIGNhbiBjYWxjdWxhdGUgYSBzZWNvbmQgaGFzaCB2YWx1ZSBjaGVhcGx5IGJ5IHRha2luZyB0aG9zZSBiaXRzCisgICBvZiB0aGUgZmlyc3QgaGFzaCB2YWx1ZSB0aGF0IHdlcmUgZGlzY2FyZGVkIChtYXNrZWQgb3V0KSB3aGVuIHRoZSB0YWJsZQorICAgaW5kZXggd2FzIGNhbGN1bGF0ZWQ6IGluZGV4ID0gaGFzaCAmIG1hc2ssIHdoZXJlIG1hc2sgPSB0YWJsZS0+c2l6ZSAtIDEuCisgICBXZSBsaW1pdCB0aGUgbWF4aW11bSBzdGVwIHNpemUgdG8gdGFibGUtPnNpemUgLyA0IChtYXNrID4+IDIpIGFuZCBtYWtlCisgICBpdCBvZGQsIHNpbmNlIG9kZCBudW1iZXJzIGFyZSBhbHdheXMgcmVsYXRpdmUgcHJpbWUgdG8gYSBwb3dlciBvZiAyLgorKi8KKyNkZWZpbmUgU0VDT05EX0hBU0goaGFzaCwgbWFzaywgcG93ZXIpIFwKKyAgKCgoKGhhc2gpICYgfihtYXNrKSkgPj4gKChwb3dlcikgLSAxKSkgJiAoKG1hc2spID4+IDIpKQorI2RlZmluZSBQUk9CRV9TVEVQKGhhc2gsIG1hc2ssIHBvd2VyKSBcCisgICgodW5zaWduZWQgY2hhcikoKFNFQ09ORF9IQVNIKGhhc2gsIG1hc2ssIHBvd2VyKSkgfCAxKSkKKwordHlwZWRlZiBzdHJ1Y3QgeworICBOQU1FRCAqKnA7CisgIE5BTUVEICoqZW5kOworfSBIQVNIX1RBQkxFX0lURVI7CisKKyNkZWZpbmUgSU5JVF9UQUdfQlVGX1NJWkUgMzIgIC8qIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBzaXplb2YoWE1MX0NoYXIpICovCisjZGVmaW5lIElOSVRfREFUQV9CVUZfU0laRSAxMDI0CisjZGVmaW5lIElOSVRfQVRUU19TSVpFIDE2CisjZGVmaW5lIElOSVRfQVRUU19WRVJTSU9OIDB4RkZGRkZGRkYKKyNkZWZpbmUgSU5JVF9CTE9DS19TSVpFIDEwMjQKKyNkZWZpbmUgSU5JVF9CVUZGRVJfU0laRSAxMDI0CisKKyNkZWZpbmUgRVhQQU5EX1NQQVJFIDI0CisKK3R5cGVkZWYgc3RydWN0IGJpbmRpbmcgeworICBzdHJ1Y3QgcHJlZml4ICpwcmVmaXg7CisgIHN0cnVjdCBiaW5kaW5nICpuZXh0VGFnQmluZGluZzsKKyAgc3RydWN0IGJpbmRpbmcgKnByZXZQcmVmaXhCaW5kaW5nOworICBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2lkICphdHRJZDsKKyAgWE1MX0NoYXIgKnVyaTsKKyAgaW50IHVyaUxlbjsKKyAgaW50IHVyaUFsbG9jOworfSBCSU5ESU5HOworCit0eXBlZGVmIHN0cnVjdCBwcmVmaXggeworICBjb25zdCBYTUxfQ2hhciAqbmFtZTsKKyAgQklORElORyAqYmluZGluZzsKK30gUFJFRklYOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IFhNTF9DaGFyICpzdHI7CisgIGNvbnN0IFhNTF9DaGFyICpsb2NhbFBhcnQ7CisgIGNvbnN0IFhNTF9DaGFyICpwcmVmaXg7CisgIGludCBzdHJMZW47CisgIGludCB1cmlMZW47CisgIGludCBwcmVmaXhMZW47Cit9IFRBR19OQU1FOworCisvKiBUQUcgcmVwcmVzZW50cyBhbiBvcGVuIGVsZW1lbnQuCisgICBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCBpcyBzdG9yZWQgaW4gYm90aCB0aGUgZG9jdW1lbnQgYW5kIEFQSQorICAgZW5jb2RpbmdzLiAgVGhlIG1lbW9yeSBidWZmZXIgJ2J1ZicgaXMgYSBzZXBhcmF0ZWx5LWFsbG9jYXRlZAorICAgbWVtb3J5IGFyZWEgd2hpY2ggc3RvcmVzIHRoZSBuYW1lLiAgRHVyaW5nIHRoZSBYTUxfUGFyc2UoKS8KKyAgIFhNTFBhcnNlQnVmZmVyKCkgd2hlbiB0aGUgZWxlbWVudCBpcyBvcGVuLCB0aGUgbWVtb3J5IGZvciB0aGUgJ3JhdycKKyAgIHZlcnNpb24gb2YgdGhlIG5hbWUgKGluIHRoZSBkb2N1bWVudCBlbmNvZGluZykgaXMgc2hhcmVkIHdpdGggdGhlCisgICBkb2N1bWVudCBidWZmZXIuICBJZiB0aGUgZWxlbWVudCBpcyBvcGVuIGFjcm9zcyBjYWxscyB0bworICAgWE1MX1BhcnNlKCkvWE1MX1BhcnNlQnVmZmVyKCksIHRoZSBidWZmZXIgaXMgcmUtYWxsb2NhdGVkIHRvCisgICBjb250YWluIHRoZSAncmF3JyBuYW1lIGFzIHdlbGwuCisKKyAgIEEgcGFyc2VyIHJlLXVzZXMgdGhlc2Ugc3RydWN0dXJlcywgbWFpbnRhaW5pbmcgYSBsaXN0IG9mIGFsbG9jYXRlZAorICAgVEFHIG9iamVjdHMgaW4gYSBmcmVlIGxpc3QuCisqLwordHlwZWRlZiBzdHJ1Y3QgdGFnIHsKKyAgc3RydWN0IHRhZyAqcGFyZW50OyAgICAgICAgICAgLyogcGFyZW50IG9mIHRoaXMgZWxlbWVudCAqLworICBjb25zdCBjaGFyICpyYXdOYW1lOyAgICAgICAgICAvKiB0YWdOYW1lIGluIHRoZSBvcmlnaW5hbCBlbmNvZGluZyAqLworICBpbnQgcmF3TmFtZUxlbmd0aDsKKyAgVEFHX05BTUUgbmFtZTsgICAgICAgICAgICAgICAgLyogdGFnTmFtZSBpbiB0aGUgQVBJIGVuY29kaW5nICovCisgIGNoYXIgKmJ1ZjsgICAgICAgICAgICAgICAgICAgIC8qIGJ1ZmZlciBmb3IgbmFtZSBjb21wb25lbnRzICovCisgIGNoYXIgKmJ1ZkVuZDsgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiB0aGUgYnVmZmVyICovCisgIEJJTkRJTkcgKmJpbmRpbmdzOworfSBUQUc7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgWE1MX0NoYXIgKm5hbWU7CisgIGNvbnN0IFhNTF9DaGFyICp0ZXh0UHRyOworICBpbnQgdGV4dExlbjsgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggaW4gWE1MX0NoYXJzICovCisgIGludCBwcm9jZXNzZWQ7ICAgICAgICAgICAgICAgIC8qICMgb2YgcHJvY2Vzc2VkIGJ5dGVzIC0gd2hlbiBzdXNwZW5kZWQgKi8KKyAgY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkOworICBjb25zdCBYTUxfQ2hhciAqYmFzZTsKKyAgY29uc3QgWE1MX0NoYXIgKnB1YmxpY0lkOworICBjb25zdCBYTUxfQ2hhciAqbm90YXRpb247CisgIFhNTF9Cb29sIG9wZW47CisgIFhNTF9Cb29sIGlzX3BhcmFtOworICBYTUxfQm9vbCBpc19pbnRlcm5hbDsgLyogdHJ1ZSBpZiBkZWNsYXJlZCBpbiBpbnRlcm5hbCBzdWJzZXQgb3V0c2lkZSBQRSAqLworfSBFTlRJVFk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZW51bSBYTUxfQ29udGVudF9UeXBlICAgICAgICAgdHlwZTsKKyAgZW51bSBYTUxfQ29udGVudF9RdWFudCAgICAgICAgcXVhbnQ7CisgIGNvbnN0IFhNTF9DaGFyICogICAgICAgICAgICAgIG5hbWU7CisgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Y2hpbGQ7CisgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RjaGlsZDsKKyAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRjbnQ7CisgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRzaWI7Cit9IENPTlRFTlRfU0NBRkZPTEQ7CisKKyNkZWZpbmUgSU5JVF9TQ0FGRk9MRF9FTEVNRU5UUyAzMgorCit0eXBlZGVmIHN0cnVjdCBibG9jayB7CisgIHN0cnVjdCBibG9jayAqbmV4dDsKKyAgaW50IHNpemU7CisgIFhNTF9DaGFyIHNbMV07Cit9IEJMT0NLOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEJMT0NLICpibG9ja3M7CisgIEJMT0NLICpmcmVlQmxvY2tzOworICBjb25zdCBYTUxfQ2hhciAqZW5kOworICBYTUxfQ2hhciAqcHRyOworICBYTUxfQ2hhciAqc3RhcnQ7CisgIGNvbnN0IFhNTF9NZW1vcnlfSGFuZGxpbmdfU3VpdGUgKm1lbTsKK30gU1RSSU5HX1BPT0w7CisKKy8qIFRoZSBYTUxfQ2hhciBiZWZvcmUgdGhlIG5hbWUgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlcgorICAgYW4gYXR0cmlidXRlIGhhcyBiZWVuIHNwZWNpZmllZC4gKi8KK3R5cGVkZWYgc3RydWN0IGF0dHJpYnV0ZV9pZCB7CisgIFhNTF9DaGFyICpuYW1lOworICBQUkVGSVggKnByZWZpeDsKKyAgWE1MX0Jvb2wgbWF5YmVUb2tlbml6ZWQ7CisgIFhNTF9Cb29sIHhtbG5zOworfSBBVFRSSUJVVEVfSUQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgQVRUUklCVVRFX0lEICppZDsKKyAgWE1MX0Jvb2wgaXNDZGF0YTsKKyAgY29uc3QgWE1MX0NoYXIgKnZhbHVlOworfSBERUZBVUxUX0FUVFJJQlVURTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBsb25nIHZlcnNpb247CisgIHVuc2lnbmVkIGxvbmcgaGFzaDsKKyAgY29uc3QgWE1MX0NoYXIgKnVyaU5hbWU7Cit9IE5TX0FUVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBYTUxfQ2hhciAqbmFtZTsKKyAgUFJFRklYICpwcmVmaXg7CisgIGNvbnN0IEFUVFJJQlVURV9JRCAqaWRBdHQ7CisgIGludCBuRGVmYXVsdEF0dHM7CisgIGludCBhbGxvY0RlZmF1bHRBdHRzOworICBERUZBVUxUX0FUVFJJQlVURSAqZGVmYXVsdEF0dHM7Cit9IEVMRU1FTlRfVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBIQVNIX1RBQkxFIGdlbmVyYWxFbnRpdGllczsKKyAgSEFTSF9UQUJMRSBlbGVtZW50VHlwZXM7CisgIEhBU0hfVEFCTEUgYXR0cmlidXRlSWRzOworICBIQVNIX1RBQkxFIHByZWZpeGVzOworICBTVFJJTkdfUE9PTCBwb29sOworICBTVFJJTkdfUE9PTCBlbnRpdHlWYWx1ZVBvb2w7CisgIC8qIGZhbHNlIG9uY2UgYSBwYXJhbWV0ZXIgZW50aXR5IHJlZmVyZW5jZSBoYXMgYmVlbiBza2lwcGVkICovCisgIFhNTF9Cb29sIGtlZXBQcm9jZXNzaW5nOworICAvKiB0cnVlIG9uY2UgYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgUEUgcmVmZXJlbmNlIGhhcyBiZWVuIGVuY291bnRlcmVkOworICAgICB0aGlzIGluY2x1ZGVzIHRoZSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgc3Vic2V0ICovCisgIFhNTF9Cb29sIGhhc1BhcmFtRW50aXR5UmVmczsKKyAgWE1MX0Jvb2wgc3RhbmRhbG9uZTsKKyNpZmRlZiBYTUxfRFRECisgIC8qIGluZGljYXRlcyBpZiBleHRlcm5hbCBQRSBoYXMgYmVlbiByZWFkICovCisgIFhNTF9Cb29sIHBhcmFtRW50aXR5UmVhZDsKKyAgSEFTSF9UQUJMRSBwYXJhbUVudGl0aWVzOworI2VuZGlmIC8qIFhNTF9EVEQgKi8KKyAgUFJFRklYIGRlZmF1bHRQcmVmaXg7CisgIC8qID09PSBzY2FmZm9sZGluZyBmb3IgYnVpbGRpbmcgY29udGVudCBtb2RlbCA9PT0gKi8KKyAgWE1MX0Jvb2wgaW5fZWxkZWNsOworICBDT05URU5UX1NDQUZGT0xEICpzY2FmZm9sZDsKKyAgdW5zaWduZWQgY29udGVudFN0cmluZ0xlbjsKKyAgdW5zaWduZWQgc2NhZmZTaXplOworICB1bnNpZ25lZCBzY2FmZkNvdW50OworICBpbnQgc2NhZmZMZXZlbDsKKyAgaW50ICpzY2FmZkluZGV4OworfSBEVEQ7CisKK3R5cGVkZWYgc3RydWN0IG9wZW5faW50ZXJuYWxfZW50aXR5IHsKKyAgY29uc3QgY2hhciAqaW50ZXJuYWxFdmVudFB0cjsKKyAgY29uc3QgY2hhciAqaW50ZXJuYWxFdmVudEVuZFB0cjsKKyAgc3RydWN0IG9wZW5faW50ZXJuYWxfZW50aXR5ICpuZXh0OworICBFTlRJVFkgKmVudGl0eTsKKyAgaW50IHN0YXJ0VGFnTGV2ZWw7CisgIFhNTF9Cb29sIGJldHdlZW5EZWNsOyAvKiBXRkM6IFBFIEJldHdlZW4gRGVjbGFyYXRpb25zICovCit9IE9QRU5fSU5URVJOQUxfRU5USVRZOworCit0eXBlZGVmIGVudW0gWE1MX0Vycm9yIFBUUkNBTEwgUHJvY2Vzc29yKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqZW5kUHRyKTsKKworc3RhdGljIFByb2Nlc3NvciBwcm9sb2dQcm9jZXNzb3I7CitzdGF0aWMgUHJvY2Vzc29yIHByb2xvZ0luaXRQcm9jZXNzb3I7CitzdGF0aWMgUHJvY2Vzc29yIGNvbnRlbnRQcm9jZXNzb3I7CitzdGF0aWMgUHJvY2Vzc29yIGNkYXRhU2VjdGlvblByb2Nlc3NvcjsKKyNpZmRlZiBYTUxfRFRECitzdGF0aWMgUHJvY2Vzc29yIGlnbm9yZVNlY3Rpb25Qcm9jZXNzb3I7CitzdGF0aWMgUHJvY2Vzc29yIGV4dGVybmFsUGFyRW50UHJvY2Vzc29yOworc3RhdGljIFByb2Nlc3NvciBleHRlcm5hbFBhckVudEluaXRQcm9jZXNzb3I7CitzdGF0aWMgUHJvY2Vzc29yIGVudGl0eVZhbHVlUHJvY2Vzc29yOworc3RhdGljIFByb2Nlc3NvciBlbnRpdHlWYWx1ZUluaXRQcm9jZXNzb3I7CisjZW5kaWYgLyogWE1MX0RURCAqLworc3RhdGljIFByb2Nlc3NvciBlcGlsb2dQcm9jZXNzb3I7CitzdGF0aWMgUHJvY2Vzc29yIGVycm9yUHJvY2Vzc29yOworc3RhdGljIFByb2Nlc3NvciBleHRlcm5hbEVudGl0eUluaXRQcm9jZXNzb3I7CitzdGF0aWMgUHJvY2Vzc29yIGV4dGVybmFsRW50aXR5SW5pdFByb2Nlc3NvcjI7CitzdGF0aWMgUHJvY2Vzc29yIGV4dGVybmFsRW50aXR5SW5pdFByb2Nlc3NvcjM7CitzdGF0aWMgUHJvY2Vzc29yIGV4dGVybmFsRW50aXR5Q29udGVudFByb2Nlc3NvcjsKK3N0YXRpYyBQcm9jZXNzb3IgaW50ZXJuYWxFbnRpdHlQcm9jZXNzb3I7CisKK3N0YXRpYyBlbnVtIFhNTF9FcnJvcgoraGFuZGxlVW5rbm93bkVuY29kaW5nKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmdOYW1lKTsKK3N0YXRpYyBlbnVtIFhNTF9FcnJvcgorcHJvY2Vzc1htbERlY2woWE1MX1BhcnNlciBwYXJzZXIsIGludCBpc0dlbmVyYWxUZXh0RW50aXR5LAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqbmV4dCk7CitzdGF0aWMgZW51bSBYTUxfRXJyb3IKK2luaXRpYWxpemVFbmNvZGluZyhYTUxfUGFyc2VyIHBhcnNlcik7CitzdGF0aWMgZW51bSBYTUxfRXJyb3IKK2RvUHJvbG9nKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpzLCAKKyAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwgaW50IHRvaywgY29uc3QgY2hhciAqbmV4dCwgY29uc3QgY2hhciAqKm5leHRQdHIsIAorICAgICAgICAgWE1MX0Jvb2wgaGF2ZU1vcmUpOworc3RhdGljIGVudW0gWE1MX0Vycm9yCitwcm9jZXNzSW50ZXJuYWxFbnRpdHkoWE1MX1BhcnNlciBwYXJzZXIsIEVOVElUWSAqZW50aXR5LCAKKyAgICAgICAgICAgICAgICAgICAgICBYTUxfQm9vbCBiZXR3ZWVuRGVjbCk7CitzdGF0aWMgZW51bSBYTUxfRXJyb3IKK2RvQ29udGVudChYTUxfUGFyc2VyIHBhcnNlciwgaW50IHN0YXJ0VGFnTGV2ZWwsIGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgY29uc3QgY2hhciAqc3RhcnQsIGNvbnN0IGNoYXIgKmVuZCwgY29uc3QgY2hhciAqKmVuZFB0ciwgCisgICAgICAgICAgWE1MX0Jvb2wgaGF2ZU1vcmUpOworc3RhdGljIGVudW0gWE1MX0Vycm9yCitkb0NkYXRhU2VjdGlvbihYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKnN0YXJ0UHRyLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLCBjb25zdCBjaGFyICoqbmV4dFB0ciwgWE1MX0Jvb2wgaGF2ZU1vcmUpOworI2lmZGVmIFhNTF9EVEQKK3N0YXRpYyBlbnVtIFhNTF9FcnJvcgorZG9JZ25vcmVTZWN0aW9uKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBFTkNPRElORyAqLCBjb25zdCBjaGFyICoqc3RhcnRQdHIsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLCBjb25zdCBjaGFyICoqbmV4dFB0ciwgWE1MX0Jvb2wgaGF2ZU1vcmUpOworI2VuZGlmIC8qIFhNTF9EVEQgKi8KKworc3RhdGljIGVudW0gWE1MX0Vycm9yCitzdG9yZUF0dHMoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IEVOQ09ESU5HICosIGNvbnN0IGNoYXIgKnMsCisgICAgICAgICAgVEFHX05BTUUgKnRhZ05hbWVQdHIsIEJJTkRJTkcgKipiaW5kaW5nc1B0cik7CitzdGF0aWMgZW51bSBYTUxfRXJyb3IKK2FkZEJpbmRpbmcoWE1MX1BhcnNlciBwYXJzZXIsIFBSRUZJWCAqcHJlZml4LCBjb25zdCBBVFRSSUJVVEVfSUQgKmF0dElkLAorICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqdXJpLCBCSU5ESU5HICoqYmluZGluZ3NQdHIpOworc3RhdGljIGludAorZGVmaW5lQXR0cmlidXRlKEVMRU1FTlRfVFlQRSAqdHlwZSwgQVRUUklCVVRFX0lEICosIFhNTF9Cb29sIGlzQ2RhdGEsIAorICAgICAgICAgICAgICAgIFhNTF9Cb29sIGlzSWQsIGNvbnN0IFhNTF9DaGFyICpkZmx0VmFsdWUsIFhNTF9QYXJzZXIgcGFyc2VyKTsKK3N0YXRpYyBlbnVtIFhNTF9FcnJvcgorc3RvcmVBdHRyaWJ1dGVWYWx1ZShYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgRU5DT0RJTkcgKiwgWE1MX0Jvb2wgaXNDZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIFNUUklOR19QT09MICopOworc3RhdGljIGVudW0gWE1MX0Vycm9yCithcHBlbmRBdHRyaWJ1dGVWYWx1ZShYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgRU5DT0RJTkcgKiwgWE1MX0Jvb2wgaXNDZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBTVFJJTkdfUE9PTCAqKTsKK3N0YXRpYyBBVFRSSUJVVEVfSUQgKgorZ2V0QXR0cmlidXRlSWQoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnN0YXJ0LAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kKTsKK3N0YXRpYyBpbnQKK3NldEVsZW1lbnRUeXBlUHJlZml4KFhNTF9QYXJzZXIgcGFyc2VyLCBFTEVNRU5UX1RZUEUgKik7CitzdGF0aWMgZW51bSBYTUxfRXJyb3IKK3N0b3JlRW50aXR5VmFsdWUoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnN0YXJ0LAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQpOworc3RhdGljIGludAorcmVwb3J0UHJvY2Vzc2luZ0luc3RydWN0aW9uKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBFTkNPRElORyAqZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0YXJ0LCBjb25zdCBjaGFyICplbmQpOworc3RhdGljIGludAorcmVwb3J0Q29tbWVudChYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqc3RhcnQsCisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCk7CitzdGF0aWMgdm9pZAorcmVwb3J0RGVmYXVsdChYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqc3RhcnQsCisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCk7CisKK3N0YXRpYyBjb25zdCBYTUxfQ2hhciAqIGdldENvbnRleHQoWE1MX1BhcnNlciBwYXJzZXIpOworc3RhdGljIFhNTF9Cb29sCitzZXRDb250ZXh0KFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBYTUxfQ2hhciAqY29udGV4dCk7CisKK3N0YXRpYyB2b2lkIEZBU1RDQUxMIG5vcm1hbGl6ZVB1YmxpY0lkKFhNTF9DaGFyICpzKTsKKworc3RhdGljIERURCAqIGR0ZENyZWF0ZShjb25zdCBYTUxfTWVtb3J5X0hhbmRsaW5nX1N1aXRlICptcyk7CisvKiBkbyBub3QgY2FsbCBpZiBwYXJlbnRQYXJzZXIgIT0gTlVMTCAqLworc3RhdGljIHZvaWQgZHRkUmVzZXQoRFREICpwLCBjb25zdCBYTUxfTWVtb3J5X0hhbmRsaW5nX1N1aXRlICptcyk7CitzdGF0aWMgdm9pZAorZHRkRGVzdHJveShEVEQgKnAsIFhNTF9Cb29sIGlzRG9jRW50aXR5LCBjb25zdCBYTUxfTWVtb3J5X0hhbmRsaW5nX1N1aXRlICptcyk7CitzdGF0aWMgaW50CitkdGRDb3B5KERURCAqbmV3RHRkLCBjb25zdCBEVEQgKm9sZER0ZCwgY29uc3QgWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZSAqbXMpOworc3RhdGljIGludAorY29weUVudGl0eVRhYmxlKEhBU0hfVEFCTEUgKiwgU1RSSU5HX1BPT0wgKiwgY29uc3QgSEFTSF9UQUJMRSAqKTsKKworc3RhdGljIE5BTUVEICoKK2xvb2t1cChIQVNIX1RBQkxFICp0YWJsZSwgS0VZIG5hbWUsIHNpemVfdCBjcmVhdGVTaXplKTsKK3N0YXRpYyB2b2lkIEZBU1RDQUxMCitoYXNoVGFibGVJbml0KEhBU0hfVEFCTEUgKiwgY29uc3QgWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZSAqbXMpOworc3RhdGljIHZvaWQgRkFTVENBTEwgaGFzaFRhYmxlQ2xlYXIoSEFTSF9UQUJMRSAqKTsKK3N0YXRpYyB2b2lkIEZBU1RDQUxMIGhhc2hUYWJsZURlc3Ryb3koSEFTSF9UQUJMRSAqKTsKK3N0YXRpYyB2b2lkIEZBU1RDQUxMCitoYXNoVGFibGVJdGVySW5pdChIQVNIX1RBQkxFX0lURVIgKiwgY29uc3QgSEFTSF9UQUJMRSAqKTsKK3N0YXRpYyBOQU1FRCAqIEZBU1RDQUxMIGhhc2hUYWJsZUl0ZXJOZXh0KEhBU0hfVEFCTEVfSVRFUiAqKTsKKworc3RhdGljIHZvaWQgRkFTVENBTEwKK3Bvb2xJbml0KFNUUklOR19QT09MICosIGNvbnN0IFhNTF9NZW1vcnlfSGFuZGxpbmdfU3VpdGUgKm1zKTsKK3N0YXRpYyB2b2lkIEZBU1RDQUxMIHBvb2xDbGVhcihTVFJJTkdfUE9PTCAqKTsKK3N0YXRpYyB2b2lkIEZBU1RDQUxMIHBvb2xEZXN0cm95KFNUUklOR19QT09MICopOworc3RhdGljIFhNTF9DaGFyICoKK3Bvb2xBcHBlbmQoU1RSSU5HX1BPT0wgKnBvb2wsIGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kKTsKK3N0YXRpYyBYTUxfQ2hhciAqCitwb29sU3RvcmVTdHJpbmcoU1RSSU5HX1BPT0wgKnBvb2wsIGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQpOworc3RhdGljIFhNTF9Cb29sIEZBU1RDQUxMIHBvb2xHcm93KFNUUklOR19QT09MICpwb29sKTsKK3N0YXRpYyBjb25zdCBYTUxfQ2hhciAqIEZBU1RDQUxMCitwb29sQ29weVN0cmluZyhTVFJJTkdfUE9PTCAqcG9vbCwgY29uc3QgWE1MX0NoYXIgKnMpOworc3RhdGljIGNvbnN0IFhNTF9DaGFyICoKK3Bvb2xDb3B5U3RyaW5nTihTVFJJTkdfUE9PTCAqcG9vbCwgY29uc3QgWE1MX0NoYXIgKnMsIGludCBuKTsKK3N0YXRpYyBjb25zdCBYTUxfQ2hhciAqIEZBU1RDQUxMCitwb29sQXBwZW5kU3RyaW5nKFNUUklOR19QT09MICpwb29sLCBjb25zdCBYTUxfQ2hhciAqcyk7CisKK3N0YXRpYyBpbnQgRkFTVENBTEwgbmV4dFNjYWZmb2xkUGFydChYTUxfUGFyc2VyIHBhcnNlcik7CitzdGF0aWMgWE1MX0NvbnRlbnQgKiBidWlsZF9tb2RlbChYTUxfUGFyc2VyIHBhcnNlcik7CitzdGF0aWMgRUxFTUVOVF9UWVBFICoKK2dldEVsZW1lbnRUeXBlKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBFTkNPRElORyAqZW5jLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQpOworCitzdGF0aWMgWE1MX1BhcnNlcgorcGFyc2VyQ3JlYXRlKGNvbnN0IFhNTF9DaGFyICplbmNvZGluZ05hbWUsCisgICAgICAgICAgICAgY29uc3QgWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZSAqbWVtc3VpdGUsCisgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5hbWVTZXAsCisgICAgICAgICAgICAgRFREICpkdGQpOworc3RhdGljIHZvaWQKK3BhcnNlckluaXQoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICplbmNvZGluZ05hbWUpOworCisjZGVmaW5lIHBvb2xTdGFydChwb29sKSAoKHBvb2wpLT5zdGFydCkKKyNkZWZpbmUgcG9vbEVuZChwb29sKSAoKHBvb2wpLT5wdHIpCisjZGVmaW5lIHBvb2xMZW5ndGgocG9vbCkgKChwb29sKS0+cHRyIC0gKHBvb2wpLT5zdGFydCkKKyNkZWZpbmUgcG9vbENob3AocG9vbCkgKCh2b2lkKS0tKHBvb2wtPnB0cikpCisjZGVmaW5lIHBvb2xMYXN0Q2hhcihwb29sKSAoKChwb29sKS0+cHRyKVstMV0pCisjZGVmaW5lIHBvb2xEaXNjYXJkKHBvb2wpICgocG9vbCktPnB0ciA9IChwb29sKS0+c3RhcnQpCisjZGVmaW5lIHBvb2xGaW5pc2gocG9vbCkgKChwb29sKS0+c3RhcnQgPSAocG9vbCktPnB0cikKKyNkZWZpbmUgcG9vbEFwcGVuZENoYXIocG9vbCwgYykgXAorICAoKChwb29sKS0+cHRyID09IChwb29sKS0+ZW5kICYmICFwb29sR3Jvdyhwb29sKSkgXAorICAgPyAwIFwKKyAgIDogKCgqKChwb29sKS0+cHRyKSsrID0gYyksIDEpKQorCitzdHJ1Y3QgWE1MX1BhcnNlclN0cnVjdCB7CisgIC8qIFRoZSBmaXJzdCBtZW1iZXIgbXVzdCBiZSB1c2VyRGF0YSBzbyB0aGF0IHRoZSBYTUxfR2V0VXNlckRhdGEKKyAgICAgbWFjcm8gd29ya3MuICovCisgIHZvaWQgKm1fdXNlckRhdGE7CisgIHZvaWQgKm1faGFuZGxlckFyZzsKKyAgY2hhciAqbV9idWZmZXI7CisgIGNvbnN0IFhNTF9NZW1vcnlfSGFuZGxpbmdfU3VpdGUgbV9tZW07CisgIC8qIGZpcnN0IGNoYXJhY3RlciB0byBiZSBwYXJzZWQgKi8KKyAgY29uc3QgY2hhciAqbV9idWZmZXJQdHI7CisgIC8qIHBhc3QgbGFzdCBjaGFyYWN0ZXIgdG8gYmUgcGFyc2VkICovCisgIGNoYXIgKm1fYnVmZmVyRW5kOworICAvKiBhbGxvY2F0ZWQgZW5kIG9mIGJ1ZmZlciAqLworICBjb25zdCBjaGFyICptX2J1ZmZlckxpbTsKKyAgWE1MX0luZGV4IG1fcGFyc2VFbmRCeXRlSW5kZXg7CisgIGNvbnN0IGNoYXIgKm1fcGFyc2VFbmRQdHI7CisgIFhNTF9DaGFyICptX2RhdGFCdWY7CisgIFhNTF9DaGFyICptX2RhdGFCdWZFbmQ7CisgIFhNTF9TdGFydEVsZW1lbnRIYW5kbGVyIG1fc3RhcnRFbGVtZW50SGFuZGxlcjsKKyAgWE1MX0VuZEVsZW1lbnRIYW5kbGVyIG1fZW5kRWxlbWVudEhhbmRsZXI7CisgIFhNTF9DaGFyYWN0ZXJEYXRhSGFuZGxlciBtX2NoYXJhY3RlckRhdGFIYW5kbGVyOworICBYTUxfUHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlciBtX3Byb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXI7CisgIFhNTF9Db21tZW50SGFuZGxlciBtX2NvbW1lbnRIYW5kbGVyOworICBYTUxfU3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyIG1fc3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyOworICBYTUxfRW5kQ2RhdGFTZWN0aW9uSGFuZGxlciBtX2VuZENkYXRhU2VjdGlvbkhhbmRsZXI7CisgIFhNTF9EZWZhdWx0SGFuZGxlciBtX2RlZmF1bHRIYW5kbGVyOworICBYTUxfU3RhcnREb2N0eXBlRGVjbEhhbmRsZXIgbV9zdGFydERvY3R5cGVEZWNsSGFuZGxlcjsKKyAgWE1MX0VuZERvY3R5cGVEZWNsSGFuZGxlciBtX2VuZERvY3R5cGVEZWNsSGFuZGxlcjsKKyAgWE1MX1VucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIgbV91bnBhcnNlZEVudGl0eURlY2xIYW5kbGVyOworICBYTUxfTm90YXRpb25EZWNsSGFuZGxlciBtX25vdGF0aW9uRGVjbEhhbmRsZXI7CisgIFhNTF9TdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyIG1fc3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlcjsKKyAgWE1MX0VuZE5hbWVzcGFjZURlY2xIYW5kbGVyIG1fZW5kTmFtZXNwYWNlRGVjbEhhbmRsZXI7CisgIFhNTF9Ob3RTdGFuZGFsb25lSGFuZGxlciBtX25vdFN0YW5kYWxvbmVIYW5kbGVyOworICBYTUxfRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIG1fZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyOworICBYTUxfUGFyc2VyIG1fZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnOworICBYTUxfU2tpcHBlZEVudGl0eUhhbmRsZXIgbV9za2lwcGVkRW50aXR5SGFuZGxlcjsKKyAgWE1MX1Vua25vd25FbmNvZGluZ0hhbmRsZXIgbV91bmtub3duRW5jb2RpbmdIYW5kbGVyOworICBYTUxfRWxlbWVudERlY2xIYW5kbGVyIG1fZWxlbWVudERlY2xIYW5kbGVyOworICBYTUxfQXR0bGlzdERlY2xIYW5kbGVyIG1fYXR0bGlzdERlY2xIYW5kbGVyOworICBYTUxfRW50aXR5RGVjbEhhbmRsZXIgbV9lbnRpdHlEZWNsSGFuZGxlcjsKKyAgWE1MX1htbERlY2xIYW5kbGVyIG1feG1sRGVjbEhhbmRsZXI7CisgIGNvbnN0IEVOQ09ESU5HICptX2VuY29kaW5nOworICBJTklUX0VOQ09ESU5HIG1faW5pdEVuY29kaW5nOworICBjb25zdCBFTkNPRElORyAqbV9pbnRlcm5hbEVuY29kaW5nOworICBjb25zdCBYTUxfQ2hhciAqbV9wcm90b2NvbEVuY29kaW5nTmFtZTsKKyAgWE1MX0Jvb2wgbV9uczsKKyAgWE1MX0Jvb2wgbV9uc190cmlwbGV0czsKKyAgdm9pZCAqbV91bmtub3duRW5jb2RpbmdNZW07CisgIHZvaWQgKm1fdW5rbm93bkVuY29kaW5nRGF0YTsKKyAgdm9pZCAqbV91bmtub3duRW5jb2RpbmdIYW5kbGVyRGF0YTsKKyAgdm9pZCAoWE1MQ0FMTCAqbV91bmtub3duRW5jb2RpbmdSZWxlYXNlKSh2b2lkICopOworICBQUk9MT0dfU1RBVEUgbV9wcm9sb2dTdGF0ZTsKKyAgUHJvY2Vzc29yICptX3Byb2Nlc3NvcjsKKyAgZW51bSBYTUxfRXJyb3IgbV9lcnJvckNvZGU7CisgIGNvbnN0IGNoYXIgKm1fZXZlbnRQdHI7CisgIGNvbnN0IGNoYXIgKm1fZXZlbnRFbmRQdHI7CisgIGNvbnN0IGNoYXIgKm1fcG9zaXRpb25QdHI7CisgIE9QRU5fSU5URVJOQUxfRU5USVRZICptX29wZW5JbnRlcm5hbEVudGl0aWVzOworICBPUEVOX0lOVEVSTkFMX0VOVElUWSAqbV9mcmVlSW50ZXJuYWxFbnRpdGllczsKKyAgWE1MX0Jvb2wgbV9kZWZhdWx0RXhwYW5kSW50ZXJuYWxFbnRpdGllczsKKyAgaW50IG1fdGFnTGV2ZWw7CisgIEVOVElUWSAqbV9kZWNsRW50aXR5OworICBjb25zdCBYTUxfQ2hhciAqbV9kb2N0eXBlTmFtZTsKKyAgY29uc3QgWE1MX0NoYXIgKm1fZG9jdHlwZVN5c2lkOworICBjb25zdCBYTUxfQ2hhciAqbV9kb2N0eXBlUHViaWQ7CisgIGNvbnN0IFhNTF9DaGFyICptX2RlY2xBdHRyaWJ1dGVUeXBlOworICBjb25zdCBYTUxfQ2hhciAqbV9kZWNsTm90YXRpb25OYW1lOworICBjb25zdCBYTUxfQ2hhciAqbV9kZWNsTm90YXRpb25QdWJsaWNJZDsKKyAgRUxFTUVOVF9UWVBFICptX2RlY2xFbGVtZW50VHlwZTsKKyAgQVRUUklCVVRFX0lEICptX2RlY2xBdHRyaWJ1dGVJZDsKKyAgWE1MX0Jvb2wgbV9kZWNsQXR0cmlidXRlSXNDZGF0YTsKKyAgWE1MX0Jvb2wgbV9kZWNsQXR0cmlidXRlSXNJZDsKKyAgRFREICptX2R0ZDsKKyAgY29uc3QgWE1MX0NoYXIgKm1fY3VyQmFzZTsKKyAgVEFHICptX3RhZ1N0YWNrOworICBUQUcgKm1fZnJlZVRhZ0xpc3Q7CisgIEJJTkRJTkcgKm1faW5oZXJpdGVkQmluZGluZ3M7CisgIEJJTkRJTkcgKm1fZnJlZUJpbmRpbmdMaXN0OworICBpbnQgbV9hdHRzU2l6ZTsKKyAgaW50IG1fblNwZWNpZmllZEF0dHM7CisgIGludCBtX2lkQXR0SW5kZXg7CisgIEFUVFJJQlVURSAqbV9hdHRzOworICBOU19BVFQgKm1fbnNBdHRzOworICB1bnNpZ25lZCBsb25nIG1fbnNBdHRzVmVyc2lvbjsKKyAgdW5zaWduZWQgY2hhciBtX25zQXR0c1Bvd2VyOworICBQT1NJVElPTiBtX3Bvc2l0aW9uOworICBTVFJJTkdfUE9PTCBtX3RlbXBQb29sOworICBTVFJJTkdfUE9PTCBtX3RlbXAyUG9vbDsKKyAgY2hhciAqbV9ncm91cENvbm5lY3RvcjsKKyAgdW5zaWduZWQgaW50IG1fZ3JvdXBTaXplOworICBYTUxfQ2hhciBtX25hbWVzcGFjZVNlcGFyYXRvcjsKKyAgWE1MX1BhcnNlciBtX3BhcmVudFBhcnNlcjsKKyAgWE1MX1BhcnNpbmdTdGF0dXMgbV9wYXJzaW5nU3RhdHVzOworI2lmZGVmIFhNTF9EVEQKKyAgWE1MX0Jvb2wgbV9pc1BhcmFtRW50aXR5OworICBYTUxfQm9vbCBtX3VzZUZvcmVpZ25EVEQ7CisgIGVudW0gWE1MX1BhcmFtRW50aXR5UGFyc2luZyBtX3BhcmFtRW50aXR5UGFyc2luZzsKKyNlbmRpZgorfTsKKworI2RlZmluZSBNQUxMT0MocykgKHBhcnNlci0+bV9tZW0ubWFsbG9jX2ZjbigocykpKQorI2RlZmluZSBSRUFMTE9DKHAscykgKHBhcnNlci0+bV9tZW0ucmVhbGxvY19mY24oKHApLChzKSkpCisjZGVmaW5lIEZSRUUocCkgKHBhcnNlci0+bV9tZW0uZnJlZV9mY24oKHApKSkKKworI2RlZmluZSB1c2VyRGF0YSAocGFyc2VyLT5tX3VzZXJEYXRhKQorI2RlZmluZSBoYW5kbGVyQXJnIChwYXJzZXItPm1faGFuZGxlckFyZykKKyNkZWZpbmUgc3RhcnRFbGVtZW50SGFuZGxlciAocGFyc2VyLT5tX3N0YXJ0RWxlbWVudEhhbmRsZXIpCisjZGVmaW5lIGVuZEVsZW1lbnRIYW5kbGVyIChwYXJzZXItPm1fZW5kRWxlbWVudEhhbmRsZXIpCisjZGVmaW5lIGNoYXJhY3RlckRhdGFIYW5kbGVyIChwYXJzZXItPm1fY2hhcmFjdGVyRGF0YUhhbmRsZXIpCisjZGVmaW5lIHByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIgXAorICAgICAgICAocGFyc2VyLT5tX3Byb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIpCisjZGVmaW5lIGNvbW1lbnRIYW5kbGVyIChwYXJzZXItPm1fY29tbWVudEhhbmRsZXIpCisjZGVmaW5lIHN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlciBcCisgICAgICAgIChwYXJzZXItPm1fc3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyKQorI2RlZmluZSBlbmRDZGF0YVNlY3Rpb25IYW5kbGVyIChwYXJzZXItPm1fZW5kQ2RhdGFTZWN0aW9uSGFuZGxlcikKKyNkZWZpbmUgZGVmYXVsdEhhbmRsZXIgKHBhcnNlci0+bV9kZWZhdWx0SGFuZGxlcikKKyNkZWZpbmUgc3RhcnREb2N0eXBlRGVjbEhhbmRsZXIgKHBhcnNlci0+bV9zdGFydERvY3R5cGVEZWNsSGFuZGxlcikKKyNkZWZpbmUgZW5kRG9jdHlwZURlY2xIYW5kbGVyIChwYXJzZXItPm1fZW5kRG9jdHlwZURlY2xIYW5kbGVyKQorI2RlZmluZSB1bnBhcnNlZEVudGl0eURlY2xIYW5kbGVyIFwKKyAgICAgICAgKHBhcnNlci0+bV91bnBhcnNlZEVudGl0eURlY2xIYW5kbGVyKQorI2RlZmluZSBub3RhdGlvbkRlY2xIYW5kbGVyIChwYXJzZXItPm1fbm90YXRpb25EZWNsSGFuZGxlcikKKyNkZWZpbmUgc3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciBcCisgICAgICAgIChwYXJzZXItPm1fc3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlcikKKyNkZWZpbmUgZW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIgKHBhcnNlci0+bV9lbmROYW1lc3BhY2VEZWNsSGFuZGxlcikKKyNkZWZpbmUgbm90U3RhbmRhbG9uZUhhbmRsZXIgKHBhcnNlci0+bV9ub3RTdGFuZGFsb25lSGFuZGxlcikKKyNkZWZpbmUgZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIFwKKyAgICAgICAgKHBhcnNlci0+bV9leHRlcm5hbEVudGl0eVJlZkhhbmRsZXIpCisjZGVmaW5lIGV4dGVybmFsRW50aXR5UmVmSGFuZGxlckFyZyBcCisgICAgICAgIChwYXJzZXItPm1fZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnKQorI2RlZmluZSBpbnRlcm5hbEVudGl0eVJlZkhhbmRsZXIgXAorICAgICAgICAocGFyc2VyLT5tX2ludGVybmFsRW50aXR5UmVmSGFuZGxlcikKKyNkZWZpbmUgc2tpcHBlZEVudGl0eUhhbmRsZXIgKHBhcnNlci0+bV9za2lwcGVkRW50aXR5SGFuZGxlcikKKyNkZWZpbmUgdW5rbm93bkVuY29kaW5nSGFuZGxlciAocGFyc2VyLT5tX3Vua25vd25FbmNvZGluZ0hhbmRsZXIpCisjZGVmaW5lIGVsZW1lbnREZWNsSGFuZGxlciAocGFyc2VyLT5tX2VsZW1lbnREZWNsSGFuZGxlcikKKyNkZWZpbmUgYXR0bGlzdERlY2xIYW5kbGVyIChwYXJzZXItPm1fYXR0bGlzdERlY2xIYW5kbGVyKQorI2RlZmluZSBlbnRpdHlEZWNsSGFuZGxlciAocGFyc2VyLT5tX2VudGl0eURlY2xIYW5kbGVyKQorI2RlZmluZSB4bWxEZWNsSGFuZGxlciAocGFyc2VyLT5tX3htbERlY2xIYW5kbGVyKQorI2RlZmluZSBlbmNvZGluZyAocGFyc2VyLT5tX2VuY29kaW5nKQorI2RlZmluZSBpbml0RW5jb2RpbmcgKHBhcnNlci0+bV9pbml0RW5jb2RpbmcpCisjZGVmaW5lIGludGVybmFsRW5jb2RpbmcgKHBhcnNlci0+bV9pbnRlcm5hbEVuY29kaW5nKQorI2RlZmluZSB1bmtub3duRW5jb2RpbmdNZW0gKHBhcnNlci0+bV91bmtub3duRW5jb2RpbmdNZW0pCisjZGVmaW5lIHVua25vd25FbmNvZGluZ0RhdGEgKHBhcnNlci0+bV91bmtub3duRW5jb2RpbmdEYXRhKQorI2RlZmluZSB1bmtub3duRW5jb2RpbmdIYW5kbGVyRGF0YSBcCisgIChwYXJzZXItPm1fdW5rbm93bkVuY29kaW5nSGFuZGxlckRhdGEpCisjZGVmaW5lIHVua25vd25FbmNvZGluZ1JlbGVhc2UgKHBhcnNlci0+bV91bmtub3duRW5jb2RpbmdSZWxlYXNlKQorI2RlZmluZSBwcm90b2NvbEVuY29kaW5nTmFtZSAocGFyc2VyLT5tX3Byb3RvY29sRW5jb2RpbmdOYW1lKQorI2RlZmluZSBucyAocGFyc2VyLT5tX25zKQorI2RlZmluZSBuc190cmlwbGV0cyAocGFyc2VyLT5tX25zX3RyaXBsZXRzKQorI2RlZmluZSBwcm9sb2dTdGF0ZSAocGFyc2VyLT5tX3Byb2xvZ1N0YXRlKQorI2RlZmluZSBwcm9jZXNzb3IgKHBhcnNlci0+bV9wcm9jZXNzb3IpCisjZGVmaW5lIGVycm9yQ29kZSAocGFyc2VyLT5tX2Vycm9yQ29kZSkKKyNkZWZpbmUgZXZlbnRQdHIgKHBhcnNlci0+bV9ldmVudFB0cikKKyNkZWZpbmUgZXZlbnRFbmRQdHIgKHBhcnNlci0+bV9ldmVudEVuZFB0cikKKyNkZWZpbmUgcG9zaXRpb25QdHIgKHBhcnNlci0+bV9wb3NpdGlvblB0cikKKyNkZWZpbmUgcG9zaXRpb24gKHBhcnNlci0+bV9wb3NpdGlvbikKKyNkZWZpbmUgb3BlbkludGVybmFsRW50aXRpZXMgKHBhcnNlci0+bV9vcGVuSW50ZXJuYWxFbnRpdGllcykKKyNkZWZpbmUgZnJlZUludGVybmFsRW50aXRpZXMgKHBhcnNlci0+bV9mcmVlSW50ZXJuYWxFbnRpdGllcykKKyNkZWZpbmUgZGVmYXVsdEV4cGFuZEludGVybmFsRW50aXRpZXMgXAorICAgICAgICAocGFyc2VyLT5tX2RlZmF1bHRFeHBhbmRJbnRlcm5hbEVudGl0aWVzKQorI2RlZmluZSB0YWdMZXZlbCAocGFyc2VyLT5tX3RhZ0xldmVsKQorI2RlZmluZSBidWZmZXIgKHBhcnNlci0+bV9idWZmZXIpCisjZGVmaW5lIGJ1ZmZlclB0ciAocGFyc2VyLT5tX2J1ZmZlclB0cikKKyNkZWZpbmUgYnVmZmVyRW5kIChwYXJzZXItPm1fYnVmZmVyRW5kKQorI2RlZmluZSBwYXJzZUVuZEJ5dGVJbmRleCAocGFyc2VyLT5tX3BhcnNlRW5kQnl0ZUluZGV4KQorI2RlZmluZSBwYXJzZUVuZFB0ciAocGFyc2VyLT5tX3BhcnNlRW5kUHRyKQorI2RlZmluZSBidWZmZXJMaW0gKHBhcnNlci0+bV9idWZmZXJMaW0pCisjZGVmaW5lIGRhdGFCdWYgKHBhcnNlci0+bV9kYXRhQnVmKQorI2RlZmluZSBkYXRhQnVmRW5kIChwYXJzZXItPm1fZGF0YUJ1ZkVuZCkKKyNkZWZpbmUgX2R0ZCAocGFyc2VyLT5tX2R0ZCkKKyNkZWZpbmUgY3VyQmFzZSAocGFyc2VyLT5tX2N1ckJhc2UpCisjZGVmaW5lIGRlY2xFbnRpdHkgKHBhcnNlci0+bV9kZWNsRW50aXR5KQorI2RlZmluZSBkb2N0eXBlTmFtZSAocGFyc2VyLT5tX2RvY3R5cGVOYW1lKQorI2RlZmluZSBkb2N0eXBlU3lzaWQgKHBhcnNlci0+bV9kb2N0eXBlU3lzaWQpCisjZGVmaW5lIGRvY3R5cGVQdWJpZCAocGFyc2VyLT5tX2RvY3R5cGVQdWJpZCkKKyNkZWZpbmUgZGVjbEF0dHJpYnV0ZVR5cGUgKHBhcnNlci0+bV9kZWNsQXR0cmlidXRlVHlwZSkKKyNkZWZpbmUgZGVjbE5vdGF0aW9uTmFtZSAocGFyc2VyLT5tX2RlY2xOb3RhdGlvbk5hbWUpCisjZGVmaW5lIGRlY2xOb3RhdGlvblB1YmxpY0lkIChwYXJzZXItPm1fZGVjbE5vdGF0aW9uUHVibGljSWQpCisjZGVmaW5lIGRlY2xFbGVtZW50VHlwZSAocGFyc2VyLT5tX2RlY2xFbGVtZW50VHlwZSkKKyNkZWZpbmUgZGVjbEF0dHJpYnV0ZUlkIChwYXJzZXItPm1fZGVjbEF0dHJpYnV0ZUlkKQorI2RlZmluZSBkZWNsQXR0cmlidXRlSXNDZGF0YSAocGFyc2VyLT5tX2RlY2xBdHRyaWJ1dGVJc0NkYXRhKQorI2RlZmluZSBkZWNsQXR0cmlidXRlSXNJZCAocGFyc2VyLT5tX2RlY2xBdHRyaWJ1dGVJc0lkKQorI2RlZmluZSBmcmVlVGFnTGlzdCAocGFyc2VyLT5tX2ZyZWVUYWdMaXN0KQorI2RlZmluZSBmcmVlQmluZGluZ0xpc3QgKHBhcnNlci0+bV9mcmVlQmluZGluZ0xpc3QpCisjZGVmaW5lIGluaGVyaXRlZEJpbmRpbmdzIChwYXJzZXItPm1faW5oZXJpdGVkQmluZGluZ3MpCisjZGVmaW5lIHRhZ1N0YWNrIChwYXJzZXItPm1fdGFnU3RhY2spCisjZGVmaW5lIGF0dHMgKHBhcnNlci0+bV9hdHRzKQorI2RlZmluZSBhdHRzU2l6ZSAocGFyc2VyLT5tX2F0dHNTaXplKQorI2RlZmluZSBuU3BlY2lmaWVkQXR0cyAocGFyc2VyLT5tX25TcGVjaWZpZWRBdHRzKQorI2RlZmluZSBpZEF0dEluZGV4IChwYXJzZXItPm1faWRBdHRJbmRleCkKKyNkZWZpbmUgbnNBdHRzIChwYXJzZXItPm1fbnNBdHRzKQorI2RlZmluZSBuc0F0dHNWZXJzaW9uIChwYXJzZXItPm1fbnNBdHRzVmVyc2lvbikKKyNkZWZpbmUgbnNBdHRzUG93ZXIgKHBhcnNlci0+bV9uc0F0dHNQb3dlcikKKyNkZWZpbmUgdGVtcFBvb2wgKHBhcnNlci0+bV90ZW1wUG9vbCkKKyNkZWZpbmUgdGVtcDJQb29sIChwYXJzZXItPm1fdGVtcDJQb29sKQorI2RlZmluZSBncm91cENvbm5lY3RvciAocGFyc2VyLT5tX2dyb3VwQ29ubmVjdG9yKQorI2RlZmluZSBncm91cFNpemUgKHBhcnNlci0+bV9ncm91cFNpemUpCisjZGVmaW5lIG5hbWVzcGFjZVNlcGFyYXRvciAocGFyc2VyLT5tX25hbWVzcGFjZVNlcGFyYXRvcikKKyNkZWZpbmUgcGFyZW50UGFyc2VyIChwYXJzZXItPm1fcGFyZW50UGFyc2VyKQorI2RlZmluZSBwc19wYXJzaW5nIChwYXJzZXItPm1fcGFyc2luZ1N0YXR1cy5wYXJzaW5nKQorI2RlZmluZSBwc19maW5hbEJ1ZmZlciAocGFyc2VyLT5tX3BhcnNpbmdTdGF0dXMuZmluYWxCdWZmZXIpCisjaWZkZWYgWE1MX0RURAorI2RlZmluZSBpc1BhcmFtRW50aXR5IChwYXJzZXItPm1faXNQYXJhbUVudGl0eSkKKyNkZWZpbmUgdXNlRm9yZWlnbkRURCAocGFyc2VyLT5tX3VzZUZvcmVpZ25EVEQpCisjZGVmaW5lIHBhcmFtRW50aXR5UGFyc2luZyAocGFyc2VyLT5tX3BhcmFtRW50aXR5UGFyc2luZykKKyNlbmRpZiAvKiBYTUxfRFREICovCisKK1hNTF9QYXJzZXIgWE1MQ0FMTAorWE1MX1BhcnNlckNyZWF0ZShjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmdOYW1lKQoreworICByZXR1cm4gWE1MX1BhcnNlckNyZWF0ZV9NTShlbmNvZGluZ05hbWUsIE5VTEwsIE5VTEwpOworfQorCitYTUxfUGFyc2VyIFhNTENBTEwKK1hNTF9QYXJzZXJDcmVhdGVOUyhjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmdOYW1lLCBYTUxfQ2hhciBuc1NlcCkKK3sKKyAgWE1MX0NoYXIgdG1wWzJdOworICAqdG1wID0gbnNTZXA7CisgIHJldHVybiBYTUxfUGFyc2VyQ3JlYXRlX01NKGVuY29kaW5nTmFtZSwgTlVMTCwgdG1wKTsKK30KKworc3RhdGljIGNvbnN0IFhNTF9DaGFyIGltcGxpY2l0Q29udGV4dFtdID0geworICBBU0NJSV94LCBBU0NJSV9tLCBBU0NJSV9sLCBBU0NJSV9FUVVBTFMsIEFTQ0lJX2gsIEFTQ0lJX3QsIEFTQ0lJX3QsIEFTQ0lJX3AsCisgIEFTQ0lJX0NPTE9OLCBBU0NJSV9TTEFTSCwgQVNDSUlfU0xBU0gsIEFTQ0lJX3csIEFTQ0lJX3csIEFTQ0lJX3csIAorICBBU0NJSV9QRVJJT0QsIEFTQ0lJX3csIEFTQ0lJXzMsIEFTQ0lJX1BFUklPRCwgQVNDSUlfbywgQVNDSUlfciwgQVNDSUlfZywKKyAgQVNDSUlfU0xBU0gsIEFTQ0lJX1gsIEFTQ0lJX00sIEFTQ0lJX0wsIEFTQ0lJX1NMQVNILCBBU0NJSV8xLCBBU0NJSV85LAorICBBU0NJSV85LCBBU0NJSV84LCBBU0NJSV9TTEFTSCwgQVNDSUlfbiwgQVNDSUlfYSwgQVNDSUlfbSwgQVNDSUlfZSwKKyAgQVNDSUlfcywgQVNDSUlfcCwgQVNDSUlfYSwgQVNDSUlfYywgQVNDSUlfZSwgJ1wwJworfTsKKworWE1MX1BhcnNlciBYTUxDQUxMCitYTUxfUGFyc2VyQ3JlYXRlX01NKGNvbnN0IFhNTF9DaGFyICplbmNvZGluZ05hbWUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9NZW1vcnlfSGFuZGxpbmdfU3VpdGUgKm1lbXN1aXRlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbmFtZVNlcCkKK3sKKyAgWE1MX1BhcnNlciBwYXJzZXIgPSBwYXJzZXJDcmVhdGUoZW5jb2RpbmdOYW1lLCBtZW1zdWl0ZSwgbmFtZVNlcCwgTlVMTCk7CisgIGlmIChwYXJzZXIgIT0gTlVMTCAmJiBucykgeworICAgIC8qIGltcGxpY2l0IGNvbnRleHQgb25seSBzZXQgZm9yIHJvb3QgcGFyc2VyLCBzaW5jZSBjaGlsZAorICAgICAgIHBhcnNlcnMgKGkuZS4gZXh0ZXJuYWwgZW50aXR5IHBhcnNlcnMpIHdpbGwgaW5oZXJpdCBpdAorICAgICovCisgICAgaWYgKCFzZXRDb250ZXh0KHBhcnNlciwgaW1wbGljaXRDb250ZXh0KSkgeworICAgICAgWE1MX1BhcnNlckZyZWUocGFyc2VyKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorICByZXR1cm4gcGFyc2VyOworfQorCitzdGF0aWMgWE1MX1BhcnNlcgorcGFyc2VyQ3JlYXRlKGNvbnN0IFhNTF9DaGFyICplbmNvZGluZ05hbWUsCisgICAgICAgICAgICAgY29uc3QgWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZSAqbWVtc3VpdGUsCisgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5hbWVTZXAsCisgICAgICAgICAgICAgRFREICpkdGQpCit7CisgIFhNTF9QYXJzZXIgcGFyc2VyOworCisgIGlmIChtZW1zdWl0ZSkgeworICAgIFhNTF9NZW1vcnlfSGFuZGxpbmdfU3VpdGUgKm10ZW1wOworICAgIHBhcnNlciA9IChYTUxfUGFyc2VyKQorICAgICAgbWVtc3VpdGUtPm1hbGxvY19mY24oc2l6ZW9mKHN0cnVjdCBYTUxfUGFyc2VyU3RydWN0KSk7CisgICAgaWYgKHBhcnNlciAhPSBOVUxMKSB7CisgICAgICBtdGVtcCA9IChYTUxfTWVtb3J5X0hhbmRsaW5nX1N1aXRlICopJihwYXJzZXItPm1fbWVtKTsKKyAgICAgIG10ZW1wLT5tYWxsb2NfZmNuID0gbWVtc3VpdGUtPm1hbGxvY19mY247CisgICAgICBtdGVtcC0+cmVhbGxvY19mY24gPSBtZW1zdWl0ZS0+cmVhbGxvY19mY247CisgICAgICBtdGVtcC0+ZnJlZV9mY24gPSBtZW1zdWl0ZS0+ZnJlZV9mY247CisgICAgfQorICB9CisgIGVsc2UgeworICAgIFhNTF9NZW1vcnlfSGFuZGxpbmdfU3VpdGUgKm10ZW1wOworICAgIHBhcnNlciA9IChYTUxfUGFyc2VyKW1hbGxvYyhzaXplb2Yoc3RydWN0IFhNTF9QYXJzZXJTdHJ1Y3QpKTsKKyAgICBpZiAocGFyc2VyICE9IE5VTEwpIHsKKyAgICAgIG10ZW1wID0gKFhNTF9NZW1vcnlfSGFuZGxpbmdfU3VpdGUgKikmKHBhcnNlci0+bV9tZW0pOworICAgICAgbXRlbXAtPm1hbGxvY19mY24gPSBtYWxsb2M7CisgICAgICBtdGVtcC0+cmVhbGxvY19mY24gPSByZWFsbG9jOworICAgICAgbXRlbXAtPmZyZWVfZmNuID0gZnJlZTsKKyAgICB9CisgIH0KKworICBpZiAoIXBhcnNlcikKKyAgICByZXR1cm4gcGFyc2VyOworCisgIGJ1ZmZlciA9IE5VTEw7CisgIGJ1ZmZlckxpbSA9IE5VTEw7CisKKyAgYXR0c1NpemUgPSBJTklUX0FUVFNfU0laRTsKKyAgYXR0cyA9IChBVFRSSUJVVEUgKilNQUxMT0MoYXR0c1NpemUgKiBzaXplb2YoQVRUUklCVVRFKSk7CisgIGlmIChhdHRzID09IE5VTEwpIHsKKyAgICBGUkVFKHBhcnNlcik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZGF0YUJ1ZiA9IChYTUxfQ2hhciAqKU1BTExPQyhJTklUX0RBVEFfQlVGX1NJWkUgKiBzaXplb2YoWE1MX0NoYXIpKTsKKyAgaWYgKGRhdGFCdWYgPT0gTlVMTCkgeworICAgIEZSRUUoYXR0cyk7CisgICAgRlJFRShwYXJzZXIpOworICAgIHJldHVybiBOVUxMOworICB9CisgIGRhdGFCdWZFbmQgPSBkYXRhQnVmICsgSU5JVF9EQVRBX0JVRl9TSVpFOworCisgIGlmIChkdGQpCisgICAgX2R0ZCA9IGR0ZDsKKyAgZWxzZSB7CisgICAgX2R0ZCA9IGR0ZENyZWF0ZSgmcGFyc2VyLT5tX21lbSk7CisgICAgaWYgKF9kdGQgPT0gTlVMTCkgeworICAgICAgRlJFRShkYXRhQnVmKTsKKyAgICAgIEZSRUUoYXR0cyk7CisgICAgICBGUkVFKHBhcnNlcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KKworICBmcmVlQmluZGluZ0xpc3QgPSBOVUxMOworICBmcmVlVGFnTGlzdCA9IE5VTEw7CisgIGZyZWVJbnRlcm5hbEVudGl0aWVzID0gTlVMTDsKKworICBncm91cFNpemUgPSAwOworICBncm91cENvbm5lY3RvciA9IE5VTEw7CisKKyAgdW5rbm93bkVuY29kaW5nSGFuZGxlciA9IE5VTEw7CisgIHVua25vd25FbmNvZGluZ0hhbmRsZXJEYXRhID0gTlVMTDsKKworICBuYW1lc3BhY2VTZXBhcmF0b3IgPSBBU0NJSV9FWENMOworICBucyA9IFhNTF9GQUxTRTsKKyAgbnNfdHJpcGxldHMgPSBYTUxfRkFMU0U7CisKKyAgbnNBdHRzID0gTlVMTDsKKyAgbnNBdHRzVmVyc2lvbiA9IDA7CisgIG5zQXR0c1Bvd2VyID0gMDsKKworICBwb29sSW5pdCgmdGVtcFBvb2wsICYocGFyc2VyLT5tX21lbSkpOworICBwb29sSW5pdCgmdGVtcDJQb29sLCAmKHBhcnNlci0+bV9tZW0pKTsKKyAgcGFyc2VySW5pdChwYXJzZXIsIGVuY29kaW5nTmFtZSk7CisKKyAgaWYgKGVuY29kaW5nTmFtZSAmJiAhcHJvdG9jb2xFbmNvZGluZ05hbWUpIHsKKyAgICBYTUxfUGFyc2VyRnJlZShwYXJzZXIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKG5hbWVTZXApIHsKKyAgICBucyA9IFhNTF9UUlVFOworICAgIGludGVybmFsRW5jb2RpbmcgPSBYbWxHZXRJbnRlcm5hbEVuY29kaW5nTlMoKTsKKyAgICBuYW1lc3BhY2VTZXBhcmF0b3IgPSAqbmFtZVNlcDsKKyAgfQorICBlbHNlIHsKKyAgICBpbnRlcm5hbEVuY29kaW5nID0gWG1sR2V0SW50ZXJuYWxFbmNvZGluZygpOworICB9CisKKyAgcmV0dXJuIHBhcnNlcjsKK30KKworc3RhdGljIHZvaWQKK3BhcnNlckluaXQoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICplbmNvZGluZ05hbWUpCit7CisgIHByb2Nlc3NvciA9IHByb2xvZ0luaXRQcm9jZXNzb3I7CisgIFhtbFByb2xvZ1N0YXRlSW5pdCgmcHJvbG9nU3RhdGUpOworICBwcm90b2NvbEVuY29kaW5nTmFtZSA9IChlbmNvZGluZ05hbWUgIT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICA/IHBvb2xDb3B5U3RyaW5nKCZ0ZW1wUG9vbCwgZW5jb2RpbmdOYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEwpOworICBjdXJCYXNlID0gTlVMTDsKKyAgWG1sSW5pdEVuY29kaW5nKCZpbml0RW5jb2RpbmcsICZlbmNvZGluZywgMCk7CisgIHVzZXJEYXRhID0gTlVMTDsKKyAgaGFuZGxlckFyZyA9IE5VTEw7CisgIHN0YXJ0RWxlbWVudEhhbmRsZXIgPSBOVUxMOworICBlbmRFbGVtZW50SGFuZGxlciA9IE5VTEw7CisgIGNoYXJhY3RlckRhdGFIYW5kbGVyID0gTlVMTDsKKyAgcHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlciA9IE5VTEw7CisgIGNvbW1lbnRIYW5kbGVyID0gTlVMTDsKKyAgc3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyID0gTlVMTDsKKyAgZW5kQ2RhdGFTZWN0aW9uSGFuZGxlciA9IE5VTEw7CisgIGRlZmF1bHRIYW5kbGVyID0gTlVMTDsKKyAgc3RhcnREb2N0eXBlRGVjbEhhbmRsZXIgPSBOVUxMOworICBlbmREb2N0eXBlRGVjbEhhbmRsZXIgPSBOVUxMOworICB1bnBhcnNlZEVudGl0eURlY2xIYW5kbGVyID0gTlVMTDsKKyAgbm90YXRpb25EZWNsSGFuZGxlciA9IE5VTEw7CisgIHN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIgPSBOVUxMOworICBlbmROYW1lc3BhY2VEZWNsSGFuZGxlciA9IE5VTEw7CisgIG5vdFN0YW5kYWxvbmVIYW5kbGVyID0gTlVMTDsKKyAgZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyID0gTlVMTDsKKyAgZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnID0gcGFyc2VyOworICBza2lwcGVkRW50aXR5SGFuZGxlciA9IE5VTEw7CisgIGVsZW1lbnREZWNsSGFuZGxlciA9IE5VTEw7CisgIGF0dGxpc3REZWNsSGFuZGxlciA9IE5VTEw7CisgIGVudGl0eURlY2xIYW5kbGVyID0gTlVMTDsKKyAgeG1sRGVjbEhhbmRsZXIgPSBOVUxMOworICBidWZmZXJQdHIgPSBidWZmZXI7CisgIGJ1ZmZlckVuZCA9IGJ1ZmZlcjsKKyAgcGFyc2VFbmRCeXRlSW5kZXggPSAwOworICBwYXJzZUVuZFB0ciA9IE5VTEw7CisgIGRlY2xFbGVtZW50VHlwZSA9IE5VTEw7CisgIGRlY2xBdHRyaWJ1dGVJZCA9IE5VTEw7CisgIGRlY2xFbnRpdHkgPSBOVUxMOworICBkb2N0eXBlTmFtZSA9IE5VTEw7CisgIGRvY3R5cGVTeXNpZCA9IE5VTEw7CisgIGRvY3R5cGVQdWJpZCA9IE5VTEw7CisgIGRlY2xBdHRyaWJ1dGVUeXBlID0gTlVMTDsKKyAgZGVjbE5vdGF0aW9uTmFtZSA9IE5VTEw7CisgIGRlY2xOb3RhdGlvblB1YmxpY0lkID0gTlVMTDsKKyAgZGVjbEF0dHJpYnV0ZUlzQ2RhdGEgPSBYTUxfRkFMU0U7CisgIGRlY2xBdHRyaWJ1dGVJc0lkID0gWE1MX0ZBTFNFOworICBtZW1zZXQoJnBvc2l0aW9uLCAwLCBzaXplb2YoUE9TSVRJT04pKTsKKyAgZXJyb3JDb2RlID0gWE1MX0VSUk9SX05PTkU7CisgIGV2ZW50UHRyID0gTlVMTDsKKyAgZXZlbnRFbmRQdHIgPSBOVUxMOworICBwb3NpdGlvblB0ciA9IE5VTEw7CisgIG9wZW5JbnRlcm5hbEVudGl0aWVzID0gTlVMTDsKKyAgZGVmYXVsdEV4cGFuZEludGVybmFsRW50aXRpZXMgPSBYTUxfVFJVRTsKKyAgdGFnTGV2ZWwgPSAwOworICB0YWdTdGFjayA9IE5VTEw7CisgIGluaGVyaXRlZEJpbmRpbmdzID0gTlVMTDsKKyAgblNwZWNpZmllZEF0dHMgPSAwOworICB1bmtub3duRW5jb2RpbmdNZW0gPSBOVUxMOworICB1bmtub3duRW5jb2RpbmdSZWxlYXNlID0gTlVMTDsKKyAgdW5rbm93bkVuY29kaW5nRGF0YSA9IE5VTEw7CisgIHBhcmVudFBhcnNlciA9IE5VTEw7CisgIHBzX3BhcnNpbmcgPSBYTUxfSU5JVElBTElaRUQ7CisjaWZkZWYgWE1MX0RURAorICBpc1BhcmFtRW50aXR5ID0gWE1MX0ZBTFNFOworICB1c2VGb3JlaWduRFREID0gWE1MX0ZBTFNFOworICBwYXJhbUVudGl0eVBhcnNpbmcgPSBYTUxfUEFSQU1fRU5USVRZX1BBUlNJTkdfTkVWRVI7CisjZW5kaWYKK30KKworLyogbW92ZXMgbGlzdCBvZiBiaW5kaW5ncyB0byBmcmVlQmluZGluZ0xpc3QgKi8KK3N0YXRpYyB2b2lkIEZBU1RDQUxMCittb3ZlVG9GcmVlQmluZGluZ0xpc3QoWE1MX1BhcnNlciBwYXJzZXIsIEJJTkRJTkcgKmJpbmRpbmdzKQoreworICB3aGlsZSAoYmluZGluZ3MpIHsKKyAgICBCSU5ESU5HICpiID0gYmluZGluZ3M7CisgICAgYmluZGluZ3MgPSBiaW5kaW5ncy0+bmV4dFRhZ0JpbmRpbmc7CisgICAgYi0+bmV4dFRhZ0JpbmRpbmcgPSBmcmVlQmluZGluZ0xpc3Q7CisgICAgZnJlZUJpbmRpbmdMaXN0ID0gYjsKKyAgfQorfQorCitYTUxfQm9vbCBYTUxDQUxMCitYTUxfUGFyc2VyUmVzZXQoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICplbmNvZGluZ05hbWUpCit7CisgIFRBRyAqdFN0azsKKyAgT1BFTl9JTlRFUk5BTF9FTlRJVFkgKm9wZW5FbnRpdHlMaXN0OworICBpZiAocGFyZW50UGFyc2VyKQorICAgIHJldHVybiBYTUxfRkFMU0U7CisgIC8qIG1vdmUgdGFnU3RhY2sgdG8gZnJlZVRhZ0xpc3QgKi8KKyAgdFN0ayA9IHRhZ1N0YWNrOworICB3aGlsZSAodFN0aykgeworICAgIFRBRyAqdGFnID0gdFN0azsKKyAgICB0U3RrID0gdFN0ay0+cGFyZW50OworICAgIHRhZy0+cGFyZW50ID0gZnJlZVRhZ0xpc3Q7CisgICAgbW92ZVRvRnJlZUJpbmRpbmdMaXN0KHBhcnNlciwgdGFnLT5iaW5kaW5ncyk7CisgICAgdGFnLT5iaW5kaW5ncyA9IE5VTEw7CisgICAgZnJlZVRhZ0xpc3QgPSB0YWc7CisgIH0KKyAgLyogbW92ZSBvcGVuSW50ZXJuYWxFbnRpdGllcyB0byBmcmVlSW50ZXJuYWxFbnRpdGllcyAqLworICBvcGVuRW50aXR5TGlzdCA9IG9wZW5JbnRlcm5hbEVudGl0aWVzOworICB3aGlsZSAob3BlbkVudGl0eUxpc3QpIHsKKyAgICBPUEVOX0lOVEVSTkFMX0VOVElUWSAqb3BlbkVudGl0eSA9IG9wZW5FbnRpdHlMaXN0OworICAgIG9wZW5FbnRpdHlMaXN0ID0gb3BlbkVudGl0eS0+bmV4dDsKKyAgICBvcGVuRW50aXR5LT5uZXh0ID0gZnJlZUludGVybmFsRW50aXRpZXM7CisgICAgZnJlZUludGVybmFsRW50aXRpZXMgPSBvcGVuRW50aXR5OworICB9CisgIG1vdmVUb0ZyZWVCaW5kaW5nTGlzdChwYXJzZXIsIGluaGVyaXRlZEJpbmRpbmdzKTsKKyAgRlJFRSh1bmtub3duRW5jb2RpbmdNZW0pOworICBpZiAodW5rbm93bkVuY29kaW5nUmVsZWFzZSkKKyAgICB1bmtub3duRW5jb2RpbmdSZWxlYXNlKHVua25vd25FbmNvZGluZ0RhdGEpOworICBwb29sQ2xlYXIoJnRlbXBQb29sKTsKKyAgcG9vbENsZWFyKCZ0ZW1wMlBvb2wpOworICBwYXJzZXJJbml0KHBhcnNlciwgZW5jb2RpbmdOYW1lKTsKKyAgZHRkUmVzZXQoX2R0ZCwgJnBhcnNlci0+bV9tZW0pOworICByZXR1cm4gc2V0Q29udGV4dChwYXJzZXIsIGltcGxpY2l0Q29udGV4dCk7Cit9CisKK2VudW0gWE1MX1N0YXR1cyBYTUxDQUxMCitYTUxfU2V0RW5jb2RpbmcoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICplbmNvZGluZ05hbWUpCit7CisgIC8qIEJsb2NrIGFmdGVyIFhNTF9QYXJzZSgpL1hNTF9QYXJzZUJ1ZmZlcigpIGhhcyBiZWVuIGNhbGxlZC4KKyAgICAgWFhYIFRoZXJlJ3Mgbm8gd2F5IGZvciB0aGUgY2FsbGVyIHRvIGRldGVybWluZSB3aGljaCBvZiB0aGUKKyAgICAgWFhYIHBvc3NpYmxlIGVycm9yIGNhc2VzIGNhdXNlZCB0aGUgWE1MX1NUQVRVU19FUlJPUiByZXR1cm4uCisgICovCisgIGlmIChwc19wYXJzaW5nID09IFhNTF9QQVJTSU5HIHx8IHBzX3BhcnNpbmcgPT0gWE1MX1NVU1BFTkRFRCkKKyAgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUjsKKyAgaWYgKGVuY29kaW5nTmFtZSA9PSBOVUxMKQorICAgIHByb3RvY29sRW5jb2RpbmdOYW1lID0gTlVMTDsKKyAgZWxzZSB7CisgICAgcHJvdG9jb2xFbmNvZGluZ05hbWUgPSBwb29sQ29weVN0cmluZygmdGVtcFBvb2wsIGVuY29kaW5nTmFtZSk7CisgICAgaWYgKCFwcm90b2NvbEVuY29kaW5nTmFtZSkKKyAgICAgIHJldHVybiBYTUxfU1RBVFVTX0VSUk9SOworICB9CisgIHJldHVybiBYTUxfU1RBVFVTX09LOworfQorCitYTUxfUGFyc2VyIFhNTENBTEwKK1hNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZShYTUxfUGFyc2VyIG9sZFBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmdOYW1lKQoreworICBYTUxfUGFyc2VyIHBhcnNlciA9IG9sZFBhcnNlcjsKKyAgRFREICpuZXdEdGQgPSBOVUxMOworICBEVEQgKm9sZER0ZCA9IF9kdGQ7CisgIFhNTF9TdGFydEVsZW1lbnRIYW5kbGVyIG9sZFN0YXJ0RWxlbWVudEhhbmRsZXIgPSBzdGFydEVsZW1lbnRIYW5kbGVyOworICBYTUxfRW5kRWxlbWVudEhhbmRsZXIgb2xkRW5kRWxlbWVudEhhbmRsZXIgPSBlbmRFbGVtZW50SGFuZGxlcjsKKyAgWE1MX0NoYXJhY3RlckRhdGFIYW5kbGVyIG9sZENoYXJhY3RlckRhdGFIYW5kbGVyID0gY2hhcmFjdGVyRGF0YUhhbmRsZXI7CisgIFhNTF9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyIG9sZFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIKKyAgICAgID0gcHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlcjsKKyAgWE1MX0NvbW1lbnRIYW5kbGVyIG9sZENvbW1lbnRIYW5kbGVyID0gY29tbWVudEhhbmRsZXI7CisgIFhNTF9TdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgb2xkU3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyCisgICAgICA9IHN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlcjsKKyAgWE1MX0VuZENkYXRhU2VjdGlvbkhhbmRsZXIgb2xkRW5kQ2RhdGFTZWN0aW9uSGFuZGxlcgorICAgICAgPSBlbmRDZGF0YVNlY3Rpb25IYW5kbGVyOworICBYTUxfRGVmYXVsdEhhbmRsZXIgb2xkRGVmYXVsdEhhbmRsZXIgPSBkZWZhdWx0SGFuZGxlcjsKKyAgWE1MX1VucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIgb2xkVW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlcgorICAgICAgPSB1bnBhcnNlZEVudGl0eURlY2xIYW5kbGVyOworICBYTUxfTm90YXRpb25EZWNsSGFuZGxlciBvbGROb3RhdGlvbkRlY2xIYW5kbGVyID0gbm90YXRpb25EZWNsSGFuZGxlcjsKKyAgWE1MX1N0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIgb2xkU3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlcgorICAgICAgPSBzdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyOworICBYTUxfRW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIgb2xkRW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIKKyAgICAgID0gZW5kTmFtZXNwYWNlRGVjbEhhbmRsZXI7CisgIFhNTF9Ob3RTdGFuZGFsb25lSGFuZGxlciBvbGROb3RTdGFuZGFsb25lSGFuZGxlciA9IG5vdFN0YW5kYWxvbmVIYW5kbGVyOworICBYTUxfRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIG9sZEV4dGVybmFsRW50aXR5UmVmSGFuZGxlcgorICAgICAgPSBleHRlcm5hbEVudGl0eVJlZkhhbmRsZXI7CisgIFhNTF9Ta2lwcGVkRW50aXR5SGFuZGxlciBvbGRTa2lwcGVkRW50aXR5SGFuZGxlciA9IHNraXBwZWRFbnRpdHlIYW5kbGVyOworICBYTUxfVW5rbm93bkVuY29kaW5nSGFuZGxlciBvbGRVbmtub3duRW5jb2RpbmdIYW5kbGVyCisgICAgICA9IHVua25vd25FbmNvZGluZ0hhbmRsZXI7CisgIFhNTF9FbGVtZW50RGVjbEhhbmRsZXIgb2xkRWxlbWVudERlY2xIYW5kbGVyID0gZWxlbWVudERlY2xIYW5kbGVyOworICBYTUxfQXR0bGlzdERlY2xIYW5kbGVyIG9sZEF0dGxpc3REZWNsSGFuZGxlciA9IGF0dGxpc3REZWNsSGFuZGxlcjsKKyAgWE1MX0VudGl0eURlY2xIYW5kbGVyIG9sZEVudGl0eURlY2xIYW5kbGVyID0gZW50aXR5RGVjbEhhbmRsZXI7CisgIFhNTF9YbWxEZWNsSGFuZGxlciBvbGRYbWxEZWNsSGFuZGxlciA9IHhtbERlY2xIYW5kbGVyOworICBFTEVNRU5UX1RZUEUgKiBvbGREZWNsRWxlbWVudFR5cGUgPSBkZWNsRWxlbWVudFR5cGU7CisKKyAgdm9pZCAqb2xkVXNlckRhdGEgPSB1c2VyRGF0YTsKKyAgdm9pZCAqb2xkSGFuZGxlckFyZyA9IGhhbmRsZXJBcmc7CisgIFhNTF9Cb29sIG9sZERlZmF1bHRFeHBhbmRJbnRlcm5hbEVudGl0aWVzID0gZGVmYXVsdEV4cGFuZEludGVybmFsRW50aXRpZXM7CisgIFhNTF9QYXJzZXIgb2xkRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnID0gZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnOworI2lmZGVmIFhNTF9EVEQKKyAgZW51bSBYTUxfUGFyYW1FbnRpdHlQYXJzaW5nIG9sZFBhcmFtRW50aXR5UGFyc2luZyA9IHBhcmFtRW50aXR5UGFyc2luZzsKKyAgaW50IG9sZEluRW50aXR5VmFsdWUgPSBwcm9sb2dTdGF0ZS5pbkVudGl0eVZhbHVlOworI2VuZGlmCisgIFhNTF9Cb29sIG9sZG5zX3RyaXBsZXRzID0gbnNfdHJpcGxldHM7CisKKyNpZmRlZiBYTUxfRFRECisgIGlmICghY29udGV4dCkKKyAgICBuZXdEdGQgPSBvbGREdGQ7CisjZW5kaWYgLyogWE1MX0RURCAqLworCisgIC8qIE5vdGUgdGhhdCB0aGUgbWFnaWNhbCB1c2VzIG9mIHRoZSBwcmUtcHJvY2Vzc29yIHRvIG1ha2UgZmllbGQKKyAgICAgYWNjZXNzIGxvb2sgbW9yZSBsaWtlIEMrKyByZXF1aXJlIHRoYXQgYHBhcnNlcicgYmUgb3ZlcndyaXR0ZW4KKyAgICAgaGVyZS4gIFRoaXMgbWFrZXMgdGhpcyBmdW5jdGlvbiBtb3JlIHBhaW5mdWwgdG8gZm9sbG93IHRoYW4gaXQKKyAgICAgd291bGQgYmUgb3RoZXJ3aXNlLgorICAqLworICBpZiAobnMpIHsKKyAgICBYTUxfQ2hhciB0bXBbMl07CisgICAgKnRtcCA9IG5hbWVzcGFjZVNlcGFyYXRvcjsKKyAgICBwYXJzZXIgPSBwYXJzZXJDcmVhdGUoZW5jb2RpbmdOYW1lLCAmcGFyc2VyLT5tX21lbSwgdG1wLCBuZXdEdGQpOworICB9CisgIGVsc2UgeworICAgIHBhcnNlciA9IHBhcnNlckNyZWF0ZShlbmNvZGluZ05hbWUsICZwYXJzZXItPm1fbWVtLCBOVUxMLCBuZXdEdGQpOworICB9CisKKyAgaWYgKCFwYXJzZXIpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgc3RhcnRFbGVtZW50SGFuZGxlciA9IG9sZFN0YXJ0RWxlbWVudEhhbmRsZXI7CisgIGVuZEVsZW1lbnRIYW5kbGVyID0gb2xkRW5kRWxlbWVudEhhbmRsZXI7CisgIGNoYXJhY3RlckRhdGFIYW5kbGVyID0gb2xkQ2hhcmFjdGVyRGF0YUhhbmRsZXI7CisgIHByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIgPSBvbGRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyOworICBjb21tZW50SGFuZGxlciA9IG9sZENvbW1lbnRIYW5kbGVyOworICBzdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgPSBvbGRTdGFydENkYXRhU2VjdGlvbkhhbmRsZXI7CisgIGVuZENkYXRhU2VjdGlvbkhhbmRsZXIgPSBvbGRFbmRDZGF0YVNlY3Rpb25IYW5kbGVyOworICBkZWZhdWx0SGFuZGxlciA9IG9sZERlZmF1bHRIYW5kbGVyOworICB1bnBhcnNlZEVudGl0eURlY2xIYW5kbGVyID0gb2xkVW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlcjsKKyAgbm90YXRpb25EZWNsSGFuZGxlciA9IG9sZE5vdGF0aW9uRGVjbEhhbmRsZXI7CisgIHN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIgPSBvbGRTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyOworICBlbmROYW1lc3BhY2VEZWNsSGFuZGxlciA9IG9sZEVuZE5hbWVzcGFjZURlY2xIYW5kbGVyOworICBub3RTdGFuZGFsb25lSGFuZGxlciA9IG9sZE5vdFN0YW5kYWxvbmVIYW5kbGVyOworICBleHRlcm5hbEVudGl0eVJlZkhhbmRsZXIgPSBvbGRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXI7CisgIHNraXBwZWRFbnRpdHlIYW5kbGVyID0gb2xkU2tpcHBlZEVudGl0eUhhbmRsZXI7CisgIHVua25vd25FbmNvZGluZ0hhbmRsZXIgPSBvbGRVbmtub3duRW5jb2RpbmdIYW5kbGVyOworICBlbGVtZW50RGVjbEhhbmRsZXIgPSBvbGRFbGVtZW50RGVjbEhhbmRsZXI7CisgIGF0dGxpc3REZWNsSGFuZGxlciA9IG9sZEF0dGxpc3REZWNsSGFuZGxlcjsKKyAgZW50aXR5RGVjbEhhbmRsZXIgPSBvbGRFbnRpdHlEZWNsSGFuZGxlcjsKKyAgeG1sRGVjbEhhbmRsZXIgPSBvbGRYbWxEZWNsSGFuZGxlcjsKKyAgZGVjbEVsZW1lbnRUeXBlID0gb2xkRGVjbEVsZW1lbnRUeXBlOworICB1c2VyRGF0YSA9IG9sZFVzZXJEYXRhOworICBpZiAob2xkVXNlckRhdGEgPT0gb2xkSGFuZGxlckFyZykKKyAgICBoYW5kbGVyQXJnID0gdXNlckRhdGE7CisgIGVsc2UKKyAgICBoYW5kbGVyQXJnID0gcGFyc2VyOworICBpZiAob2xkRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnICE9IG9sZFBhcnNlcikKKyAgICBleHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcgPSBvbGRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmc7CisgIGRlZmF1bHRFeHBhbmRJbnRlcm5hbEVudGl0aWVzID0gb2xkRGVmYXVsdEV4cGFuZEludGVybmFsRW50aXRpZXM7CisgIG5zX3RyaXBsZXRzID0gb2xkbnNfdHJpcGxldHM7CisgIHBhcmVudFBhcnNlciA9IG9sZFBhcnNlcjsKKyNpZmRlZiBYTUxfRFRECisgIHBhcmFtRW50aXR5UGFyc2luZyA9IG9sZFBhcmFtRW50aXR5UGFyc2luZzsKKyAgcHJvbG9nU3RhdGUuaW5FbnRpdHlWYWx1ZSA9IG9sZEluRW50aXR5VmFsdWU7CisgIGlmIChjb250ZXh0KSB7CisjZW5kaWYgLyogWE1MX0RURCAqLworICAgIGlmICghZHRkQ29weShfZHRkLCBvbGREdGQsICZwYXJzZXItPm1fbWVtKQorICAgICAgfHwgIXNldENvbnRleHQocGFyc2VyLCBjb250ZXh0KSkgeworICAgICAgWE1MX1BhcnNlckZyZWUocGFyc2VyKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBwcm9jZXNzb3IgPSBleHRlcm5hbEVudGl0eUluaXRQcm9jZXNzb3I7CisjaWZkZWYgWE1MX0RURAorICB9CisgIGVsc2UgeworICAgIC8qIFRoZSBEVEQgaW5zdGFuY2UgcmVmZXJlbmNlZCBieSBfZHRkIGlzIHNoYXJlZCBiZXR3ZWVuIHRoZSBkb2N1bWVudCdzCisgICAgICAgcm9vdCBwYXJzZXIgYW5kIGV4dGVybmFsIFBFIHBhcnNlcnMsIHRoZXJlZm9yZSBvbmUgZG9lcyBub3QgbmVlZCB0bworICAgICAgIGNhbGwgc2V0Q29udGV4dC4gSW4gYWRkaXRpb24sIG9uZSBhbHNvICptdXN0KiBub3QgY2FsbCBzZXRDb250ZXh0LAorICAgICAgIGJlY2F1c2UgdGhpcyB3b3VsZCBvdmVyd3JpdGUgZXhpc3RpbmcgcHJlZml4LT5iaW5kaW5nIHBvaW50ZXJzIGluCisgICAgICAgX2R0ZCB3aXRoIG9uZXMgdGhhdCBnZXQgZGVzdHJveWVkIHdpdGggdGhlIGV4dGVybmFsIFBFIHBhcnNlci4KKyAgICAgICBUaGlzIHdvdWxkIGxlYXZlIHRob3NlIHByZWZpeGVzIHdpdGggZGFuZ2xpbmcgcG9pbnRlcnMuCisgICAgKi8KKyAgICBpc1BhcmFtRW50aXR5ID0gWE1MX1RSVUU7CisgICAgWG1sUHJvbG9nU3RhdGVJbml0RXh0ZXJuYWxFbnRpdHkoJnByb2xvZ1N0YXRlKTsKKyAgICBwcm9jZXNzb3IgPSBleHRlcm5hbFBhckVudEluaXRQcm9jZXNzb3I7CisgIH0KKyNlbmRpZiAvKiBYTUxfRFREICovCisgIHJldHVybiBwYXJzZXI7Cit9CisKK3N0YXRpYyB2b2lkIEZBU1RDQUxMCitkZXN0cm95QmluZGluZ3MoQklORElORyAqYmluZGluZ3MsIFhNTF9QYXJzZXIgcGFyc2VyKQoreworICBmb3IgKDs7KSB7CisgICAgQklORElORyAqYiA9IGJpbmRpbmdzOworICAgIGlmICghYikKKyAgICAgIGJyZWFrOworICAgIGJpbmRpbmdzID0gYi0+bmV4dFRhZ0JpbmRpbmc7CisgICAgRlJFRShiLT51cmkpOworICAgIEZSRUUoYik7CisgIH0KK30KKwordm9pZCBYTUxDQUxMCitYTUxfUGFyc2VyRnJlZShYTUxfUGFyc2VyIHBhcnNlcikKK3sKKyAgVEFHICp0YWdMaXN0OworICBPUEVOX0lOVEVSTkFMX0VOVElUWSAqZW50aXR5TGlzdDsKKyAgaWYgKHBhcnNlciA9PSBOVUxMKQorICAgIHJldHVybjsKKyAgLyogZnJlZSB0YWdTdGFjayBhbmQgZnJlZVRhZ0xpc3QgKi8KKyAgdGFnTGlzdCA9IHRhZ1N0YWNrOworICBmb3IgKDs7KSB7CisgICAgVEFHICpwOworICAgIGlmICh0YWdMaXN0ID09IE5VTEwpIHsKKyAgICAgIGlmIChmcmVlVGFnTGlzdCA9PSBOVUxMKQorICAgICAgICBicmVhazsKKyAgICAgIHRhZ0xpc3QgPSBmcmVlVGFnTGlzdDsKKyAgICAgIGZyZWVUYWdMaXN0ID0gTlVMTDsKKyAgICB9CisgICAgcCA9IHRhZ0xpc3Q7CisgICAgdGFnTGlzdCA9IHRhZ0xpc3QtPnBhcmVudDsKKyAgICBGUkVFKHAtPmJ1Zik7CisgICAgZGVzdHJveUJpbmRpbmdzKHAtPmJpbmRpbmdzLCBwYXJzZXIpOworICAgIEZSRUUocCk7CisgIH0KKyAgLyogZnJlZSBvcGVuSW50ZXJuYWxFbnRpdGllcyBhbmQgZnJlZUludGVybmFsRW50aXRpZXMgKi8KKyAgZW50aXR5TGlzdCA9IG9wZW5JbnRlcm5hbEVudGl0aWVzOworICBmb3IgKDs7KSB7CisgICAgT1BFTl9JTlRFUk5BTF9FTlRJVFkgKm9wZW5FbnRpdHk7CisgICAgaWYgKGVudGl0eUxpc3QgPT0gTlVMTCkgeworICAgICAgaWYgKGZyZWVJbnRlcm5hbEVudGl0aWVzID09IE5VTEwpCisgICAgICAgIGJyZWFrOworICAgICAgZW50aXR5TGlzdCA9IGZyZWVJbnRlcm5hbEVudGl0aWVzOworICAgICAgZnJlZUludGVybmFsRW50aXRpZXMgPSBOVUxMOworICAgIH0KKyAgICBvcGVuRW50aXR5ID0gZW50aXR5TGlzdDsKKyAgICBlbnRpdHlMaXN0ID0gZW50aXR5TGlzdC0+bmV4dDsKKyAgICBGUkVFKG9wZW5FbnRpdHkpOworICB9CisKKyAgZGVzdHJveUJpbmRpbmdzKGZyZWVCaW5kaW5nTGlzdCwgcGFyc2VyKTsKKyAgZGVzdHJveUJpbmRpbmdzKGluaGVyaXRlZEJpbmRpbmdzLCBwYXJzZXIpOworICBwb29sRGVzdHJveSgmdGVtcFBvb2wpOworICBwb29sRGVzdHJveSgmdGVtcDJQb29sKTsKKyNpZmRlZiBYTUxfRFRECisgIC8qIGV4dGVybmFsIHBhcmFtZXRlciBlbnRpdHkgcGFyc2VycyBzaGFyZSB0aGUgRFREIHN0cnVjdHVyZQorICAgICBwYXJzZXItPm1fZHRkIHdpdGggdGhlIHJvb3QgcGFyc2VyLCBzbyB3ZSBtdXN0IG5vdCBkZXN0cm95IGl0CisgICovCisgIGlmICghaXNQYXJhbUVudGl0eSAmJiBfZHRkKQorI2Vsc2UKKyAgaWYgKF9kdGQpCisjZW5kaWYgLyogWE1MX0RURCAqLworICAgIGR0ZERlc3Ryb3koX2R0ZCwgKFhNTF9Cb29sKSFwYXJlbnRQYXJzZXIsICZwYXJzZXItPm1fbWVtKTsKKyAgRlJFRSgodm9pZCAqKWF0dHMpOworICBGUkVFKGdyb3VwQ29ubmVjdG9yKTsKKyAgRlJFRShidWZmZXIpOworICBGUkVFKGRhdGFCdWYpOworICBGUkVFKG5zQXR0cyk7CisgIEZSRUUodW5rbm93bkVuY29kaW5nTWVtKTsKKyAgaWYgKHVua25vd25FbmNvZGluZ1JlbGVhc2UpCisgICAgdW5rbm93bkVuY29kaW5nUmVsZWFzZSh1bmtub3duRW5jb2RpbmdEYXRhKTsKKyAgRlJFRShwYXJzZXIpOworfQorCit2b2lkIFhNTENBTEwKK1hNTF9Vc2VQYXJzZXJBc0hhbmRsZXJBcmcoWE1MX1BhcnNlciBwYXJzZXIpCit7CisgIGhhbmRsZXJBcmcgPSBwYXJzZXI7Cit9CisKK2VudW0gWE1MX0Vycm9yIFhNTENBTEwKK1hNTF9Vc2VGb3JlaWduRFREKFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfQm9vbCB1c2VEVEQpCit7CisjaWZkZWYgWE1MX0RURAorICAvKiBibG9jayBhZnRlciBYTUxfUGFyc2UoKS9YTUxfUGFyc2VCdWZmZXIoKSBoYXMgYmVlbiBjYWxsZWQgKi8KKyAgaWYgKHBzX3BhcnNpbmcgPT0gWE1MX1BBUlNJTkcgfHwgcHNfcGFyc2luZyA9PSBYTUxfU1VTUEVOREVEKQorICAgIHJldHVybiBYTUxfRVJST1JfQ0FOVF9DSEFOR0VfRkVBVFVSRV9PTkNFX1BBUlNJTkc7CisgIHVzZUZvcmVpZ25EVEQgPSB1c2VEVEQ7CisgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyNlbHNlCisgIHJldHVybiBYTUxfRVJST1JfRkVBVFVSRV9SRVFVSVJFU19YTUxfRFREOworI2VuZGlmCit9CisKK3ZvaWQgWE1MQ0FMTAorWE1MX1NldFJldHVybk5TVHJpcGxldChYTUxfUGFyc2VyIHBhcnNlciwgaW50IGRvX25zdCkKK3sKKyAgLyogYmxvY2sgYWZ0ZXIgWE1MX1BhcnNlKCkvWE1MX1BhcnNlQnVmZmVyKCkgaGFzIGJlZW4gY2FsbGVkICovCisgIGlmIChwc19wYXJzaW5nID09IFhNTF9QQVJTSU5HIHx8IHBzX3BhcnNpbmcgPT0gWE1MX1NVU1BFTkRFRCkKKyAgICByZXR1cm47CisgIG5zX3RyaXBsZXRzID0gZG9fbnN0ID8gWE1MX1RSVUUgOiBYTUxfRkFMU0U7Cit9CisKK3ZvaWQgWE1MQ0FMTAorWE1MX1NldFVzZXJEYXRhKFhNTF9QYXJzZXIgcGFyc2VyLCB2b2lkICpwKQoreworICBpZiAoaGFuZGxlckFyZyA9PSB1c2VyRGF0YSkKKyAgICBoYW5kbGVyQXJnID0gdXNlckRhdGEgPSBwOworICBlbHNlCisgICAgdXNlckRhdGEgPSBwOworfQorCitlbnVtIFhNTF9TdGF0dXMgWE1MQ0FMTAorWE1MX1NldEJhc2UoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICpwKQoreworICBpZiAocCkgeworICAgIHAgPSBwb29sQ29weVN0cmluZygmX2R0ZC0+cG9vbCwgcCk7CisgICAgaWYgKCFwKQorICAgICAgcmV0dXJuIFhNTF9TVEFUVVNfRVJST1I7CisgICAgY3VyQmFzZSA9IHA7CisgIH0KKyAgZWxzZQorICAgIGN1ckJhc2UgPSBOVUxMOworICByZXR1cm4gWE1MX1NUQVRVU19PSzsKK30KKworY29uc3QgWE1MX0NoYXIgKiBYTUxDQUxMCitYTUxfR2V0QmFzZShYTUxfUGFyc2VyIHBhcnNlcikKK3sKKyAgcmV0dXJuIGN1ckJhc2U7Cit9CisKK2ludCBYTUxDQUxMCitYTUxfR2V0U3BlY2lmaWVkQXR0cmlidXRlQ291bnQoWE1MX1BhcnNlciBwYXJzZXIpCit7CisgIHJldHVybiBuU3BlY2lmaWVkQXR0czsKK30KKworaW50IFhNTENBTEwKK1hNTF9HZXRJZEF0dHJpYnV0ZUluZGV4KFhNTF9QYXJzZXIgcGFyc2VyKQoreworICByZXR1cm4gaWRBdHRJbmRleDsKK30KKwordm9pZCBYTUxDQUxMCitYTUxfU2V0RWxlbWVudEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgWE1MX1N0YXJ0RWxlbWVudEhhbmRsZXIgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgWE1MX0VuZEVsZW1lbnRIYW5kbGVyIGVuZCkKK3sKKyAgc3RhcnRFbGVtZW50SGFuZGxlciA9IHN0YXJ0OworICBlbmRFbGVtZW50SGFuZGxlciA9IGVuZDsKK30KKwordm9pZCBYTUxDQUxMCitYTUxfU2V0U3RhcnRFbGVtZW50SGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9TdGFydEVsZW1lbnRIYW5kbGVyIHN0YXJ0KSB7CisgIHN0YXJ0RWxlbWVudEhhbmRsZXIgPSBzdGFydDsKK30KKwordm9pZCBYTUxDQUxMCitYTUxfU2V0RW5kRWxlbWVudEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0VuZEVsZW1lbnRIYW5kbGVyIGVuZCkgeworICBlbmRFbGVtZW50SGFuZGxlciA9IGVuZDsKK30KKwordm9pZCBYTUxDQUxMCitYTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0NoYXJhY3RlckRhdGFIYW5kbGVyIGhhbmRsZXIpCit7CisgIGNoYXJhY3RlckRhdGFIYW5kbGVyID0gaGFuZGxlcjsKK30KKwordm9pZCBYTUxDQUxMCitYTUxfU2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyIGhhbmRsZXIpCit7CisgIHByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIgPSBoYW5kbGVyOworfQorCit2b2lkIFhNTENBTEwKK1hNTF9TZXRDb21tZW50SGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICBYTUxfQ29tbWVudEhhbmRsZXIgaGFuZGxlcikKK3sKKyAgY29tbWVudEhhbmRsZXIgPSBoYW5kbGVyOworfQorCit2b2lkIFhNTENBTEwKK1hNTF9TZXRDZGF0YVNlY3Rpb25IYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1N0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlciBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmRDZGF0YVNlY3Rpb25IYW5kbGVyIGVuZCkKK3sKKyAgc3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyID0gc3RhcnQ7CisgIGVuZENkYXRhU2VjdGlvbkhhbmRsZXIgPSBlbmQ7Cit9CisKK3ZvaWQgWE1MQ0FMTAorWE1MX1NldFN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1N0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlciBzdGFydCkgeworICBzdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgPSBzdGFydDsKK30KKwordm9pZCBYTUxDQUxMCitYTUxfU2V0RW5kQ2RhdGFTZWN0aW9uSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmRDZGF0YVNlY3Rpb25IYW5kbGVyIGVuZCkgeworICBlbmRDZGF0YVNlY3Rpb25IYW5kbGVyID0gZW5kOworfQorCit2b2lkIFhNTENBTEwKK1hNTF9TZXREZWZhdWx0SGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICBYTUxfRGVmYXVsdEhhbmRsZXIgaGFuZGxlcikKK3sKKyAgZGVmYXVsdEhhbmRsZXIgPSBoYW5kbGVyOworICBkZWZhdWx0RXhwYW5kSW50ZXJuYWxFbnRpdGllcyA9IFhNTF9GQUxTRTsKK30KKwordm9pZCBYTUxDQUxMCitYTUxfU2V0RGVmYXVsdEhhbmRsZXJFeHBhbmQoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0RlZmF1bHRIYW5kbGVyIGhhbmRsZXIpCit7CisgIGRlZmF1bHRIYW5kbGVyID0gaGFuZGxlcjsKKyAgZGVmYXVsdEV4cGFuZEludGVybmFsRW50aXRpZXMgPSBYTUxfVFJVRTsKK30KKwordm9pZCBYTUxDQUxMCitYTUxfU2V0RG9jdHlwZURlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfU3RhcnREb2N0eXBlRGVjbEhhbmRsZXIgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmREb2N0eXBlRGVjbEhhbmRsZXIgZW5kKQoreworICBzdGFydERvY3R5cGVEZWNsSGFuZGxlciA9IHN0YXJ0OworICBlbmREb2N0eXBlRGVjbEhhbmRsZXIgPSBlbmQ7Cit9CisKK3ZvaWQgWE1MQ0FMTAorWE1MX1NldFN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9TdGFydERvY3R5cGVEZWNsSGFuZGxlciBzdGFydCkgeworICBzdGFydERvY3R5cGVEZWNsSGFuZGxlciA9IHN0YXJ0OworfQorCit2b2lkIFhNTENBTEwKK1hNTF9TZXRFbmREb2N0eXBlRGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmREb2N0eXBlRGVjbEhhbmRsZXIgZW5kKSB7CisgIGVuZERvY3R5cGVEZWNsSGFuZGxlciA9IGVuZDsKK30KKwordm9pZCBYTUxDQUxMCitYTUxfU2V0VW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9VbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyIGhhbmRsZXIpCit7CisgIHVucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIgPSBoYW5kbGVyOworfQorCit2b2lkIFhNTENBTEwKK1hNTF9TZXROb3RhdGlvbkRlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX05vdGF0aW9uRGVjbEhhbmRsZXIgaGFuZGxlcikKK3sKKyAgbm90YXRpb25EZWNsSGFuZGxlciA9IGhhbmRsZXI7Cit9CisKK3ZvaWQgWE1MQ0FMTAorWE1MX1NldE5hbWVzcGFjZURlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9TdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmROYW1lc3BhY2VEZWNsSGFuZGxlciBlbmQpCit7CisgIHN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIgPSBzdGFydDsKKyAgZW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIgPSBlbmQ7Cit9CisKK3ZvaWQgWE1MQ0FMTAorWE1MX1NldFN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfU3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciBzdGFydCkgeworICBzdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyID0gc3RhcnQ7Cit9CisKK3ZvaWQgWE1MQ0FMTAorWE1MX1NldEVuZE5hbWVzcGFjZURlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmROYW1lc3BhY2VEZWNsSGFuZGxlciBlbmQpIHsKKyAgZW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIgPSBlbmQ7Cit9CisKK3ZvaWQgWE1MQ0FMTAorWE1MX1NldE5vdFN0YW5kYWxvbmVIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9Ob3RTdGFuZGFsb25lSGFuZGxlciBoYW5kbGVyKQoreworICBub3RTdGFuZGFsb25lSGFuZGxlciA9IGhhbmRsZXI7Cit9CisKK3ZvaWQgWE1MQ0FMTAorWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0V4dGVybmFsRW50aXR5UmVmSGFuZGxlciBoYW5kbGVyKQoreworICBleHRlcm5hbEVudGl0eVJlZkhhbmRsZXIgPSBoYW5kbGVyOworfQorCit2b2lkIFhNTENBTEwKK1hNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcoWE1MX1BhcnNlciBwYXJzZXIsIHZvaWQgKmFyZykKK3sKKyAgaWYgKGFyZykKKyAgICBleHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcgPSAoWE1MX1BhcnNlcilhcmc7CisgIGVsc2UKKyAgICBleHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcgPSBwYXJzZXI7Cit9CisKK3ZvaWQgWE1MQ0FMTAorWE1MX1NldFNraXBwZWRFbnRpdHlIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9Ta2lwcGVkRW50aXR5SGFuZGxlciBoYW5kbGVyKQoreworICBza2lwcGVkRW50aXR5SGFuZGxlciA9IGhhbmRsZXI7Cit9CisKK3ZvaWQgWE1MQ0FMTAorWE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfVW5rbm93bkVuY29kaW5nSGFuZGxlciBoYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkKK3sKKyAgdW5rbm93bkVuY29kaW5nSGFuZGxlciA9IGhhbmRsZXI7CisgIHVua25vd25FbmNvZGluZ0hhbmRsZXJEYXRhID0gZGF0YTsKK30KKwordm9pZCBYTUxDQUxMCitYTUxfU2V0RWxlbWVudERlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfRWxlbWVudERlY2xIYW5kbGVyIGVsZGVjbCkKK3sKKyAgZWxlbWVudERlY2xIYW5kbGVyID0gZWxkZWNsOworfQorCit2b2lkIFhNTENBTEwKK1hNTF9TZXRBdHRsaXN0RGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9BdHRsaXN0RGVjbEhhbmRsZXIgYXR0ZGVjbCkKK3sKKyAgYXR0bGlzdERlY2xIYW5kbGVyID0gYXR0ZGVjbDsKK30KKwordm9pZCBYTUxDQUxMCitYTUxfU2V0RW50aXR5RGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0VudGl0eURlY2xIYW5kbGVyIGhhbmRsZXIpCit7CisgIGVudGl0eURlY2xIYW5kbGVyID0gaGFuZGxlcjsKK30KKwordm9pZCBYTUxDQUxMCitYTUxfU2V0WG1sRGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgWE1MX1htbERlY2xIYW5kbGVyIGhhbmRsZXIpIHsKKyAgeG1sRGVjbEhhbmRsZXIgPSBoYW5kbGVyOworfQorCitpbnQgWE1MQ0FMTAorWE1MX1NldFBhcmFtRW50aXR5UGFyc2luZyhYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBYTUxfUGFyYW1FbnRpdHlQYXJzaW5nIHBlUGFyc2luZykKK3sKKyAgLyogYmxvY2sgYWZ0ZXIgWE1MX1BhcnNlKCkvWE1MX1BhcnNlQnVmZmVyKCkgaGFzIGJlZW4gY2FsbGVkICovCisgIGlmIChwc19wYXJzaW5nID09IFhNTF9QQVJTSU5HIHx8IHBzX3BhcnNpbmcgPT0gWE1MX1NVU1BFTkRFRCkKKyAgICByZXR1cm4gMDsKKyNpZmRlZiBYTUxfRFRECisgIHBhcmFtRW50aXR5UGFyc2luZyA9IHBlUGFyc2luZzsKKyAgcmV0dXJuIDE7CisjZWxzZQorICByZXR1cm4gcGVQYXJzaW5nID09IFhNTF9QQVJBTV9FTlRJVFlfUEFSU0lOR19ORVZFUjsKKyNlbmRpZgorfQorCitlbnVtIFhNTF9TdGF0dXMgWE1MQ0FMTAorWE1MX1BhcnNlKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBjaGFyICpzLCBpbnQgbGVuLCBpbnQgaXNGaW5hbCkKK3sKKyAgc3dpdGNoIChwc19wYXJzaW5nKSB7CisgIGNhc2UgWE1MX1NVU1BFTkRFRDoKKyAgICBlcnJvckNvZGUgPSBYTUxfRVJST1JfU1VTUEVOREVEOworICAgIHJldHVybiBYTUxfU1RBVFVTX0VSUk9SOworICBjYXNlIFhNTF9GSU5JU0hFRDoKKyAgICBlcnJvckNvZGUgPSBYTUxfRVJST1JfRklOSVNIRUQ7CisgICAgcmV0dXJuIFhNTF9TVEFUVVNfRVJST1I7CisgIGRlZmF1bHQ6CisgICAgcHNfcGFyc2luZyA9IFhNTF9QQVJTSU5HOworICB9CisKKyAgaWYgKGxlbiA9PSAwKSB7CisgICAgcHNfZmluYWxCdWZmZXIgPSAoWE1MX0Jvb2wpaXNGaW5hbDsKKyAgICBpZiAoIWlzRmluYWwpCisgICAgICByZXR1cm4gWE1MX1NUQVRVU19PSzsKKyAgICBwb3NpdGlvblB0ciA9IGJ1ZmZlclB0cjsKKyAgICBwYXJzZUVuZFB0ciA9IGJ1ZmZlckVuZDsKKworICAgIC8qIElmIGRhdGEgYXJlIGxlZnQgb3ZlciBmcm9tIGxhc3QgYnVmZmVyLCBhbmQgd2Ugbm93IGtub3cgdGhhdCB0aGVzZQorICAgICAgIGRhdGEgYXJlIHRoZSBmaW5hbCBjaHVuayBvZiBpbnB1dCwgdGhlbiB3ZSBoYXZlIHRvIGNoZWNrIHRoZW0gYWdhaW4KKyAgICAgICB0byBkZXRlY3QgZXJyb3JzIGJhc2VkIG9uIHRoYXQgZmFjdC4KKyAgICAqLworICAgIGVycm9yQ29kZSA9IHByb2Nlc3NvcihwYXJzZXIsIGJ1ZmZlclB0ciwgcGFyc2VFbmRQdHIsICZidWZmZXJQdHIpOworCisgICAgaWYgKGVycm9yQ29kZSA9PSBYTUxfRVJST1JfTk9ORSkgeworICAgICAgc3dpdGNoIChwc19wYXJzaW5nKSB7CisgICAgICBjYXNlIFhNTF9TVVNQRU5ERUQ6CisgICAgICAgIFhtbFVwZGF0ZVBvc2l0aW9uKGVuY29kaW5nLCBwb3NpdGlvblB0ciwgYnVmZmVyUHRyLCAmcG9zaXRpb24pOworICAgICAgICBwb3NpdGlvblB0ciA9IGJ1ZmZlclB0cjsKKyAgICAgICAgcmV0dXJuIFhNTF9TVEFUVVNfU1VTUEVOREVEOworICAgICAgY2FzZSBYTUxfSU5JVElBTElaRUQ6IAorICAgICAgY2FzZSBYTUxfUEFSU0lORzoKKyAgICAgICAgcHNfcGFyc2luZyA9IFhNTF9GSU5JU0hFRDsKKyAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gWE1MX1NUQVRVU19PSzsKKyAgICAgIH0KKyAgICB9CisgICAgZXZlbnRFbmRQdHIgPSBldmVudFB0cjsKKyAgICBwcm9jZXNzb3IgPSBlcnJvclByb2Nlc3NvcjsKKyAgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUjsKKyAgfQorI2lmbmRlZiBYTUxfQ09OVEVYVF9CWVRFUworICBlbHNlIGlmIChidWZmZXJQdHIgPT0gYnVmZmVyRW5kKSB7CisgICAgY29uc3QgY2hhciAqZW5kOworICAgIGludCBuTGVmdE92ZXI7CisgICAgZW51bSBYTUxfRXJyb3IgcmVzdWx0OworICAgIHBhcnNlRW5kQnl0ZUluZGV4ICs9IGxlbjsKKyAgICBwb3NpdGlvblB0ciA9IHM7CisgICAgcHNfZmluYWxCdWZmZXIgPSAoWE1MX0Jvb2wpaXNGaW5hbDsKKworICAgIGVycm9yQ29kZSA9IHByb2Nlc3NvcihwYXJzZXIsIHMsIHBhcnNlRW5kUHRyID0gcyArIGxlbiwgJmVuZCk7CisKKyAgICBpZiAoZXJyb3JDb2RlICE9IFhNTF9FUlJPUl9OT05FKSB7CisgICAgICBldmVudEVuZFB0ciA9IGV2ZW50UHRyOworICAgICAgcHJvY2Vzc29yID0gZXJyb3JQcm9jZXNzb3I7CisgICAgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBzd2l0Y2ggKHBzX3BhcnNpbmcpIHsKKyAgICAgIGNhc2UgWE1MX1NVU1BFTkRFRDoKKyAgICAgICAgcmVzdWx0ID0gWE1MX1NUQVRVU19TVVNQRU5ERUQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBYTUxfSU5JVElBTElaRUQ6CisgICAgICBjYXNlIFhNTF9QQVJTSU5HOgorICAgICAgICByZXN1bHQgPSBYTUxfU1RBVFVTX09LOworICAgICAgICBpZiAoaXNGaW5hbCkgeworICAgICAgICAgIHBzX3BhcnNpbmcgPSBYTUxfRklOSVNIRUQ7CisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIFhtbFVwZGF0ZVBvc2l0aW9uKGVuY29kaW5nLCBwb3NpdGlvblB0ciwgZW5kLCAmcG9zaXRpb24pOworICAgIG5MZWZ0T3ZlciA9IHMgKyBsZW4gLSBlbmQ7CisgICAgaWYgKG5MZWZ0T3ZlcikgeworICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMIHx8IG5MZWZ0T3ZlciA+IGJ1ZmZlckxpbSAtIGJ1ZmZlcikgeworICAgICAgICAvKiBGSVhNRSBhdm9pZCBpbnRlZ2VyIG92ZXJmbG93ICovCisgICAgICAgIGNoYXIgKnRlbXA7CisgICAgICAgIHRlbXAgPSAoYnVmZmVyID09IE5VTEwKKyAgICAgICAgICAgICAgICA/IChjaGFyICopTUFMTE9DKGxlbiAqIDIpCisgICAgICAgICAgICAgICAgOiAoY2hhciAqKVJFQUxMT0MoYnVmZmVyLCBsZW4gKiAyKSk7CisgICAgICAgIGlmICh0ZW1wID09IE5VTEwpIHsKKyAgICAgICAgICBlcnJvckNvZGUgPSBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICAgIHJldHVybiBYTUxfU1RBVFVTX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlciA9IHRlbXA7CisgICAgICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgICAgZXJyb3JDb2RlID0gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgICBldmVudFB0ciA9IGV2ZW50RW5kUHRyID0gTlVMTDsKKyAgICAgICAgICBwcm9jZXNzb3IgPSBlcnJvclByb2Nlc3NvcjsKKyAgICAgICAgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBidWZmZXJMaW0gPSBidWZmZXIgKyBsZW4gKiAyOworICAgICAgfQorICAgICAgbWVtY3B5KGJ1ZmZlciwgZW5kLCBuTGVmdE92ZXIpOworICAgIH0KKyAgICBidWZmZXJQdHIgPSBidWZmZXI7CisgICAgYnVmZmVyRW5kID0gYnVmZmVyICsgbkxlZnRPdmVyOworICAgIHBvc2l0aW9uUHRyID0gYnVmZmVyUHRyOworICAgIHBhcnNlRW5kUHRyID0gYnVmZmVyRW5kOworICAgIGV2ZW50UHRyID0gYnVmZmVyUHRyOworICAgIGV2ZW50RW5kUHRyID0gYnVmZmVyUHRyOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyNlbmRpZiAgLyogbm90IGRlZmluZWQgWE1MX0NPTlRFWFRfQllURVMgKi8KKyAgZWxzZSB7CisgICAgdm9pZCAqYnVmZiA9IFhNTF9HZXRCdWZmZXIocGFyc2VyLCBsZW4pOworICAgIGlmIChidWZmID09IE5VTEwpCisgICAgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUjsKKyAgICBlbHNlIHsKKyAgICAgIG1lbWNweShidWZmLCBzLCBsZW4pOworICAgICAgcmV0dXJuIFhNTF9QYXJzZUJ1ZmZlcihwYXJzZXIsIGxlbiwgaXNGaW5hbCk7CisgICAgfQorICB9Cit9CisKK2VudW0gWE1MX1N0YXR1cyBYTUxDQUxMCitYTUxfUGFyc2VCdWZmZXIoWE1MX1BhcnNlciBwYXJzZXIsIGludCBsZW4sIGludCBpc0ZpbmFsKQoreworICBjb25zdCBjaGFyICpzdGFydDsKKyAgZW51bSBYTUxfU3RhdHVzIHJlc3VsdCA9IFhNTF9TVEFUVVNfT0s7CisKKyAgc3dpdGNoIChwc19wYXJzaW5nKSB7CisgIGNhc2UgWE1MX1NVU1BFTkRFRDoKKyAgICBlcnJvckNvZGUgPSBYTUxfRVJST1JfU1VTUEVOREVEOworICAgIHJldHVybiBYTUxfU1RBVFVTX0VSUk9SOworICBjYXNlIFhNTF9GSU5JU0hFRDoKKyAgICBlcnJvckNvZGUgPSBYTUxfRVJST1JfRklOSVNIRUQ7CisgICAgcmV0dXJuIFhNTF9TVEFUVVNfRVJST1I7CisgIGRlZmF1bHQ6CisgICAgcHNfcGFyc2luZyA9IFhNTF9QQVJTSU5HOworICB9CisKKyAgc3RhcnQgPSBidWZmZXJQdHI7CisgIHBvc2l0aW9uUHRyID0gc3RhcnQ7CisgIGJ1ZmZlckVuZCArPSBsZW47CisgIHBhcnNlRW5kUHRyID0gYnVmZmVyRW5kOworICBwYXJzZUVuZEJ5dGVJbmRleCArPSBsZW47CisgIHBzX2ZpbmFsQnVmZmVyID0gKFhNTF9Cb29sKWlzRmluYWw7CisKKyAgZXJyb3JDb2RlID0gcHJvY2Vzc29yKHBhcnNlciwgc3RhcnQsIHBhcnNlRW5kUHRyLCAmYnVmZmVyUHRyKTsKKworICBpZiAoZXJyb3JDb2RlICE9IFhNTF9FUlJPUl9OT05FKSB7CisgICAgZXZlbnRFbmRQdHIgPSBldmVudFB0cjsKKyAgICBwcm9jZXNzb3IgPSBlcnJvclByb2Nlc3NvcjsKKyAgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUjsKKyAgfQorICBlbHNlIHsKKyAgICBzd2l0Y2ggKHBzX3BhcnNpbmcpIHsKKyAgICBjYXNlIFhNTF9TVVNQRU5ERUQ6CisgICAgICByZXN1bHQgPSBYTUxfU1RBVFVTX1NVU1BFTkRFRDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX0lOSVRJQUxJWkVEOiAKKyAgICBjYXNlIFhNTF9QQVJTSU5HOgorICAgICAgaWYgKGlzRmluYWwpIHsKKyAgICAgICAgcHNfcGFyc2luZyA9IFhNTF9GSU5JU0hFRDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICBkZWZhdWx0OiA7ICAvKiBzaG91bGQgbm90IGhhcHBlbiAqLworICAgIH0KKyAgfQorCisgIFhtbFVwZGF0ZVBvc2l0aW9uKGVuY29kaW5nLCBwb3NpdGlvblB0ciwgYnVmZmVyUHRyLCAmcG9zaXRpb24pOworICBwb3NpdGlvblB0ciA9IGJ1ZmZlclB0cjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCAqIFhNTENBTEwKK1hNTF9HZXRCdWZmZXIoWE1MX1BhcnNlciBwYXJzZXIsIGludCBsZW4pCit7CisgIHN3aXRjaCAocHNfcGFyc2luZykgeworICBjYXNlIFhNTF9TVVNQRU5ERUQ6CisgICAgZXJyb3JDb2RlID0gWE1MX0VSUk9SX1NVU1BFTkRFRDsKKyAgICByZXR1cm4gTlVMTDsKKyAgY2FzZSBYTUxfRklOSVNIRUQ6CisgICAgZXJyb3JDb2RlID0gWE1MX0VSUk9SX0ZJTklTSEVEOworICAgIHJldHVybiBOVUxMOworICBkZWZhdWx0OiA7CisgIH0KKworICBpZiAobGVuID4gYnVmZmVyTGltIC0gYnVmZmVyRW5kKSB7CisgICAgLyogRklYTUUgYXZvaWQgaW50ZWdlciBvdmVyZmxvdyAqLworICAgIGludCBuZWVkZWRTaXplID0gbGVuICsgKGludCkoYnVmZmVyRW5kIC0gYnVmZmVyUHRyKTsKKyNpZmRlZiBYTUxfQ09OVEVYVF9CWVRFUworICAgIGludCBrZWVwID0gKGludCkoYnVmZmVyUHRyIC0gYnVmZmVyKTsKKworICAgIGlmIChrZWVwID4gWE1MX0NPTlRFWFRfQllURVMpCisgICAgICBrZWVwID0gWE1MX0NPTlRFWFRfQllURVM7CisgICAgbmVlZGVkU2l6ZSArPSBrZWVwOworI2VuZGlmICAvKiBkZWZpbmVkIFhNTF9DT05URVhUX0JZVEVTICovCisgICAgaWYgKG5lZWRlZFNpemUgIDw9IGJ1ZmZlckxpbSAtIGJ1ZmZlcikgeworI2lmZGVmIFhNTF9DT05URVhUX0JZVEVTCisgICAgICBpZiAoa2VlcCA8IGJ1ZmZlclB0ciAtIGJ1ZmZlcikgeworICAgICAgICBpbnQgb2Zmc2V0ID0gKGludCkoYnVmZmVyUHRyIC0gYnVmZmVyKSAtIGtlZXA7CisgICAgICAgIG1lbW1vdmUoYnVmZmVyLCAmYnVmZmVyW29mZnNldF0sIGJ1ZmZlckVuZCAtIGJ1ZmZlclB0ciArIGtlZXApOworICAgICAgICBidWZmZXJFbmQgLT0gb2Zmc2V0OworICAgICAgICBidWZmZXJQdHIgLT0gb2Zmc2V0OworICAgICAgfQorI2Vsc2UKKyAgICAgIG1lbW1vdmUoYnVmZmVyLCBidWZmZXJQdHIsIGJ1ZmZlckVuZCAtIGJ1ZmZlclB0cik7CisgICAgICBidWZmZXJFbmQgPSBidWZmZXIgKyAoYnVmZmVyRW5kIC0gYnVmZmVyUHRyKTsKKyAgICAgIGJ1ZmZlclB0ciA9IGJ1ZmZlcjsKKyNlbmRpZiAgLyogbm90IGRlZmluZWQgWE1MX0NPTlRFWFRfQllURVMgKi8KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBjaGFyICpuZXdCdWY7CisgICAgICBpbnQgYnVmZmVyU2l6ZSA9IChpbnQpKGJ1ZmZlckxpbSAtIGJ1ZmZlclB0cik7CisgICAgICBpZiAoYnVmZmVyU2l6ZSA9PSAwKQorICAgICAgICBidWZmZXJTaXplID0gSU5JVF9CVUZGRVJfU0laRTsKKyAgICAgIGRvIHsKKyAgICAgICAgYnVmZmVyU2l6ZSAqPSAyOworICAgICAgfSB3aGlsZSAoYnVmZmVyU2l6ZSA8IG5lZWRlZFNpemUpOworICAgICAgbmV3QnVmID0gKGNoYXIgKilNQUxMT0MoYnVmZmVyU2l6ZSk7CisgICAgICBpZiAobmV3QnVmID09IDApIHsKKyAgICAgICAgZXJyb3JDb2RlID0gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBidWZmZXJMaW0gPSBuZXdCdWYgKyBidWZmZXJTaXplOworI2lmZGVmIFhNTF9DT05URVhUX0JZVEVTCisgICAgICBpZiAoYnVmZmVyUHRyKSB7CisgICAgICAgIGludCBrZWVwID0gKGludCkoYnVmZmVyUHRyIC0gYnVmZmVyKTsKKyAgICAgICAgaWYgKGtlZXAgPiBYTUxfQ09OVEVYVF9CWVRFUykKKyAgICAgICAgICBrZWVwID0gWE1MX0NPTlRFWFRfQllURVM7CisgICAgICAgIG1lbWNweShuZXdCdWYsICZidWZmZXJQdHJbLWtlZXBdLCBidWZmZXJFbmQgLSBidWZmZXJQdHIgKyBrZWVwKTsKKyAgICAgICAgRlJFRShidWZmZXIpOworICAgICAgICBidWZmZXIgPSBuZXdCdWY7CisgICAgICAgIGJ1ZmZlckVuZCA9IGJ1ZmZlciArIChidWZmZXJFbmQgLSBidWZmZXJQdHIpICsga2VlcDsKKyAgICAgICAgYnVmZmVyUHRyID0gYnVmZmVyICsga2VlcDsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBidWZmZXJFbmQgPSBuZXdCdWYgKyAoYnVmZmVyRW5kIC0gYnVmZmVyUHRyKTsKKyAgICAgICAgYnVmZmVyUHRyID0gYnVmZmVyID0gbmV3QnVmOworICAgICAgfQorI2Vsc2UKKyAgICAgIGlmIChidWZmZXJQdHIpIHsKKyAgICAgICAgbWVtY3B5KG5ld0J1ZiwgYnVmZmVyUHRyLCBidWZmZXJFbmQgLSBidWZmZXJQdHIpOworICAgICAgICBGUkVFKGJ1ZmZlcik7CisgICAgICB9CisgICAgICBidWZmZXJFbmQgPSBuZXdCdWYgKyAoYnVmZmVyRW5kIC0gYnVmZmVyUHRyKTsKKyAgICAgIGJ1ZmZlclB0ciA9IGJ1ZmZlciA9IG5ld0J1ZjsKKyNlbmRpZiAgLyogbm90IGRlZmluZWQgWE1MX0NPTlRFWFRfQllURVMgKi8KKyAgICB9CisgIH0KKyAgcmV0dXJuIGJ1ZmZlckVuZDsKK30KKworZW51bSBYTUxfU3RhdHVzIFhNTENBTEwKK1hNTF9TdG9wUGFyc2VyKFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfQm9vbCByZXN1bWFibGUpCit7CisgIHN3aXRjaCAocHNfcGFyc2luZykgeworICBjYXNlIFhNTF9TVVNQRU5ERUQ6CisgICAgaWYgKHJlc3VtYWJsZSkgeworICAgICAgZXJyb3JDb2RlID0gWE1MX0VSUk9SX1NVU1BFTkRFRDsKKyAgICAgIHJldHVybiBYTUxfU1RBVFVTX0VSUk9SOworICAgIH0KKyAgICBwc19wYXJzaW5nID0gWE1MX0ZJTklTSEVEOworICAgIGJyZWFrOworICBjYXNlIFhNTF9GSU5JU0hFRDoKKyAgICBlcnJvckNvZGUgPSBYTUxfRVJST1JfRklOSVNIRUQ7CisgICAgcmV0dXJuIFhNTF9TVEFUVVNfRVJST1I7CisgIGRlZmF1bHQ6CisgICAgaWYgKHJlc3VtYWJsZSkgeworI2lmZGVmIFhNTF9EVEQKKyAgICAgIGlmIChpc1BhcmFtRW50aXR5KSB7CisgICAgICAgIGVycm9yQ29kZSA9IFhNTF9FUlJPUl9TVVNQRU5EX1BFOworICAgICAgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUjsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgcHNfcGFyc2luZyA9IFhNTF9TVVNQRU5ERUQ7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHBzX3BhcnNpbmcgPSBYTUxfRklOSVNIRUQ7CisgIH0KKyAgcmV0dXJuIFhNTF9TVEFUVVNfT0s7Cit9CisKK2VudW0gWE1MX1N0YXR1cyBYTUxDQUxMCitYTUxfUmVzdW1lUGFyc2VyKFhNTF9QYXJzZXIgcGFyc2VyKQoreworICBlbnVtIFhNTF9TdGF0dXMgcmVzdWx0ID0gWE1MX1NUQVRVU19PSzsKKworICBpZiAocHNfcGFyc2luZyAhPSBYTUxfU1VTUEVOREVEKSB7CisgICAgZXJyb3JDb2RlID0gWE1MX0VSUk9SX05PVF9TVVNQRU5ERUQ7CisgICAgcmV0dXJuIFhNTF9TVEFUVVNfRVJST1I7CisgIH0KKyAgcHNfcGFyc2luZyA9IFhNTF9QQVJTSU5HOworCisgIGVycm9yQ29kZSA9IHByb2Nlc3NvcihwYXJzZXIsIGJ1ZmZlclB0ciwgcGFyc2VFbmRQdHIsICZidWZmZXJQdHIpOworCisgIGlmIChlcnJvckNvZGUgIT0gWE1MX0VSUk9SX05PTkUpIHsKKyAgICBldmVudEVuZFB0ciA9IGV2ZW50UHRyOworICAgIHByb2Nlc3NvciA9IGVycm9yUHJvY2Vzc29yOworICAgIHJldHVybiBYTUxfU1RBVFVTX0VSUk9SOworICB9CisgIGVsc2UgeworICAgIHN3aXRjaCAocHNfcGFyc2luZykgeworICAgIGNhc2UgWE1MX1NVU1BFTkRFRDoKKyAgICAgIHJlc3VsdCA9IFhNTF9TVEFUVVNfU1VTUEVOREVEOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYTUxfSU5JVElBTElaRUQ6IAorICAgIGNhc2UgWE1MX1BBUlNJTkc6CisgICAgICBpZiAocHNfZmluYWxCdWZmZXIpIHsKKyAgICAgICAgcHNfcGFyc2luZyA9IFhNTF9GSU5JU0hFRDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICBkZWZhdWx0OiA7CisgICAgfQorICB9CisKKyAgWG1sVXBkYXRlUG9zaXRpb24oZW5jb2RpbmcsIHBvc2l0aW9uUHRyLCBidWZmZXJQdHIsICZwb3NpdGlvbik7CisgIHBvc2l0aW9uUHRyID0gYnVmZmVyUHRyOworICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFhNTENBTEwKK1hNTF9HZXRQYXJzaW5nU3RhdHVzKFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfUGFyc2luZ1N0YXR1cyAqc3RhdHVzKQoreworICBhc3NlcnQoc3RhdHVzICE9IE5VTEwpOworICAqc3RhdHVzID0gcGFyc2VyLT5tX3BhcnNpbmdTdGF0dXM7Cit9CisKK2VudW0gWE1MX0Vycm9yIFhNTENBTEwKK1hNTF9HZXRFcnJvckNvZGUoWE1MX1BhcnNlciBwYXJzZXIpCit7CisgIHJldHVybiBlcnJvckNvZGU7Cit9CisKK1hNTF9JbmRleCBYTUxDQUxMCitYTUxfR2V0Q3VycmVudEJ5dGVJbmRleChYTUxfUGFyc2VyIHBhcnNlcikKK3sKKyAgaWYgKGV2ZW50UHRyKQorICAgIHJldHVybiBwYXJzZUVuZEJ5dGVJbmRleCAtIChwYXJzZUVuZFB0ciAtIGV2ZW50UHRyKTsKKyAgcmV0dXJuIC0xOworfQorCitpbnQgWE1MQ0FMTAorWE1MX0dldEN1cnJlbnRCeXRlQ291bnQoWE1MX1BhcnNlciBwYXJzZXIpCit7CisgIGlmIChldmVudEVuZFB0ciAmJiBldmVudFB0cikKKyAgICByZXR1cm4gKGludCkoZXZlbnRFbmRQdHIgLSBldmVudFB0cik7CisgIHJldHVybiAwOworfQorCitjb25zdCBjaGFyICogWE1MQ0FMTAorWE1MX0dldElucHV0Q29udGV4dChYTUxfUGFyc2VyIHBhcnNlciwgaW50ICpvZmZzZXQsIGludCAqc2l6ZSkKK3sKKyNpZmRlZiBYTUxfQ09OVEVYVF9CWVRFUworICBpZiAoZXZlbnRQdHIgJiYgYnVmZmVyKSB7CisgICAgKm9mZnNldCA9IChpbnQpKGV2ZW50UHRyIC0gYnVmZmVyKTsKKyAgICAqc2l6ZSAgID0gKGludCkoYnVmZmVyRW5kIC0gYnVmZmVyKTsKKyAgICByZXR1cm4gYnVmZmVyOworICB9CisjZW5kaWYgLyogZGVmaW5lZCBYTUxfQ09OVEVYVF9CWVRFUyAqLworICByZXR1cm4gKGNoYXIgKikgMDsKK30KKworWE1MX1NpemUgWE1MQ0FMTAorWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyKFhNTF9QYXJzZXIgcGFyc2VyKQoreworICBpZiAoZXZlbnRQdHIgJiYgZXZlbnRQdHIgPj0gcG9zaXRpb25QdHIpIHsKKyAgICBYbWxVcGRhdGVQb3NpdGlvbihlbmNvZGluZywgcG9zaXRpb25QdHIsIGV2ZW50UHRyLCAmcG9zaXRpb24pOworICAgIHBvc2l0aW9uUHRyID0gZXZlbnRQdHI7CisgIH0KKyAgcmV0dXJuIHBvc2l0aW9uLmxpbmVOdW1iZXIgKyAxOworfQorCitYTUxfU2l6ZSBYTUxDQUxMCitYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlcihYTUxfUGFyc2VyIHBhcnNlcikKK3sKKyAgaWYgKGV2ZW50UHRyICYmIGV2ZW50UHRyID49IHBvc2l0aW9uUHRyKSB7CisgICAgWG1sVXBkYXRlUG9zaXRpb24oZW5jb2RpbmcsIHBvc2l0aW9uUHRyLCBldmVudFB0ciwgJnBvc2l0aW9uKTsKKyAgICBwb3NpdGlvblB0ciA9IGV2ZW50UHRyOworICB9CisgIHJldHVybiBwb3NpdGlvbi5jb2x1bW5OdW1iZXI7Cit9CisKK3ZvaWQgWE1MQ0FMTAorWE1MX0ZyZWVDb250ZW50TW9kZWwoWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Db250ZW50ICptb2RlbCkKK3sKKyAgRlJFRShtb2RlbCk7Cit9CisKK3ZvaWQgKiBYTUxDQUxMCitYTUxfTWVtTWFsbG9jKFhNTF9QYXJzZXIgcGFyc2VyLCBzaXplX3Qgc2l6ZSkKK3sKKyAgcmV0dXJuIE1BTExPQyhzaXplKTsKK30KKwordm9pZCAqIFhNTENBTEwKK1hNTF9NZW1SZWFsbG9jKFhNTF9QYXJzZXIgcGFyc2VyLCB2b2lkICpwdHIsIHNpemVfdCBzaXplKQoreworICByZXR1cm4gUkVBTExPQyhwdHIsIHNpemUpOworfQorCit2b2lkIFhNTENBTEwKK1hNTF9NZW1GcmVlKFhNTF9QYXJzZXIgcGFyc2VyLCB2b2lkICpwdHIpCit7CisgIEZSRUUocHRyKTsKK30KKwordm9pZCBYTUxDQUxMCitYTUxfRGVmYXVsdEN1cnJlbnQoWE1MX1BhcnNlciBwYXJzZXIpCit7CisgIGlmIChkZWZhdWx0SGFuZGxlcikgeworICAgIGlmIChvcGVuSW50ZXJuYWxFbnRpdGllcykKKyAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLAorICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbEVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICBvcGVuSW50ZXJuYWxFbnRpdGllcy0+aW50ZXJuYWxFdmVudFB0ciwKKyAgICAgICAgICAgICAgICAgICAgb3BlbkludGVybmFsRW50aXRpZXMtPmludGVybmFsRXZlbnRFbmRQdHIpOworICAgIGVsc2UKKyAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmNvZGluZywgZXZlbnRQdHIsIGV2ZW50RW5kUHRyKTsKKyAgfQorfQorCitjb25zdCBYTUxfTENoYXIgKiBYTUxDQUxMCitYTUxfRXJyb3JTdHJpbmcoZW51bSBYTUxfRXJyb3IgY29kZSkKK3sKKyAgc3RhdGljIGNvbnN0IFhNTF9MQ2hhciogY29uc3QgbWVzc2FnZVtdID0geworICAgIDAsCisgICAgWE1MX0woIm91dCBvZiBtZW1vcnkiKSwKKyAgICBYTUxfTCgic3ludGF4IGVycm9yIiksCisgICAgWE1MX0woIm5vIGVsZW1lbnQgZm91bmQiKSwKKyAgICBYTUxfTCgibm90IHdlbGwtZm9ybWVkIChpbnZhbGlkIHRva2VuKSIpLAorICAgIFhNTF9MKCJ1bmNsb3NlZCB0b2tlbiIpLAorICAgIFhNTF9MKCJwYXJ0aWFsIGNoYXJhY3RlciIpLAorICAgIFhNTF9MKCJtaXNtYXRjaGVkIHRhZyIpLAorICAgIFhNTF9MKCJkdXBsaWNhdGUgYXR0cmlidXRlIiksCisgICAgWE1MX0woImp1bmsgYWZ0ZXIgZG9jdW1lbnQgZWxlbWVudCIpLAorICAgIFhNTF9MKCJpbGxlZ2FsIHBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlIiksCisgICAgWE1MX0woInVuZGVmaW5lZCBlbnRpdHkiKSwKKyAgICBYTUxfTCgicmVjdXJzaXZlIGVudGl0eSByZWZlcmVuY2UiKSwKKyAgICBYTUxfTCgiYXN5bmNocm9ub3VzIGVudGl0eSIpLAorICAgIFhNTF9MKCJyZWZlcmVuY2UgdG8gaW52YWxpZCBjaGFyYWN0ZXIgbnVtYmVyIiksCisgICAgWE1MX0woInJlZmVyZW5jZSB0byBiaW5hcnkgZW50aXR5IiksCisgICAgWE1MX0woInJlZmVyZW5jZSB0byBleHRlcm5hbCBlbnRpdHkgaW4gYXR0cmlidXRlIiksCisgICAgWE1MX0woIlhNTCBvciB0ZXh0IGRlY2xhcmF0aW9uIG5vdCBhdCBzdGFydCBvZiBlbnRpdHkiKSwKKyAgICBYTUxfTCgidW5rbm93biBlbmNvZGluZyIpLAorICAgIFhNTF9MKCJlbmNvZGluZyBzcGVjaWZpZWQgaW4gWE1MIGRlY2xhcmF0aW9uIGlzIGluY29ycmVjdCIpLAorICAgIFhNTF9MKCJ1bmNsb3NlZCBDREFUQSBzZWN0aW9uIiksCisgICAgWE1MX0woImVycm9yIGluIHByb2Nlc3NpbmcgZXh0ZXJuYWwgZW50aXR5IHJlZmVyZW5jZSIpLAorICAgIFhNTF9MKCJkb2N1bWVudCBpcyBub3Qgc3RhbmRhbG9uZSIpLAorICAgIFhNTF9MKCJ1bmV4cGVjdGVkIHBhcnNlciBzdGF0ZSAtIHBsZWFzZSBzZW5kIGEgYnVnIHJlcG9ydCIpLAorICAgIFhNTF9MKCJlbnRpdHkgZGVjbGFyZWQgaW4gcGFyYW1ldGVyIGVudGl0eSIpLAorICAgIFhNTF9MKCJyZXF1ZXN0ZWQgZmVhdHVyZSByZXF1aXJlcyBYTUxfRFREIHN1cHBvcnQgaW4gRXhwYXQiKSwKKyAgICBYTUxfTCgiY2Fubm90IGNoYW5nZSBzZXR0aW5nIG9uY2UgcGFyc2luZyBoYXMgYmVndW4iKSwKKyAgICBYTUxfTCgidW5ib3VuZCBwcmVmaXgiKSwKKyAgICBYTUxfTCgibXVzdCBub3QgdW5kZWNsYXJlIHByZWZpeCIpLAorICAgIFhNTF9MKCJpbmNvbXBsZXRlIG1hcmt1cCBpbiBwYXJhbWV0ZXIgZW50aXR5IiksCisgICAgWE1MX0woIlhNTCBkZWNsYXJhdGlvbiBub3Qgd2VsbC1mb3JtZWQiKSwKKyAgICBYTUxfTCgidGV4dCBkZWNsYXJhdGlvbiBub3Qgd2VsbC1mb3JtZWQiKSwKKyAgICBYTUxfTCgiaWxsZWdhbCBjaGFyYWN0ZXIocykgaW4gcHVibGljIGlkIiksCisgICAgWE1MX0woInBhcnNlciBzdXNwZW5kZWQiKSwKKyAgICBYTUxfTCgicGFyc2VyIG5vdCBzdXNwZW5kZWQiKSwKKyAgICBYTUxfTCgicGFyc2luZyBhYm9ydGVkIiksCisgICAgWE1MX0woInBhcnNpbmcgZmluaXNoZWQiKSwKKyAgICBYTUxfTCgiY2Fubm90IHN1c3BlbmQgaW4gZXh0ZXJuYWwgcGFyYW1ldGVyIGVudGl0eSIpLAorICAgIFhNTF9MKCJyZXNlcnZlZCBwcmVmaXggKHhtbCkgbXVzdCBub3QgYmUgdW5kZWNsYXJlZCBvciBib3VuZCB0byBhbm90aGVyIG5hbWVzcGFjZSBuYW1lIiksCisgICAgWE1MX0woInJlc2VydmVkIHByZWZpeCAoeG1sbnMpIG11c3Qgbm90IGJlIGRlY2xhcmVkIG9yIHVuZGVjbGFyZWQiKSwKKyAgICBYTUxfTCgicHJlZml4IG11c3Qgbm90IGJlIGJvdW5kIHRvIG9uZSBvZiB0aGUgcmVzZXJ2ZWQgbmFtZXNwYWNlIG5hbWVzIikKKyAgfTsKKyAgaWYgKGNvZGUgPiAwICYmIGNvZGUgPCBzaXplb2YobWVzc2FnZSkvc2l6ZW9mKG1lc3NhZ2VbMF0pKQorICAgIHJldHVybiBtZXNzYWdlW2NvZGVdOworICByZXR1cm4gTlVMTDsKK30KKworY29uc3QgWE1MX0xDaGFyICogWE1MQ0FMTAorWE1MX0V4cGF0VmVyc2lvbih2b2lkKSB7CisKKyAgLyogVjEgaXMgdXNlZCB0byBzdHJpbmctaXplIHRoZSB2ZXJzaW9uIG51bWJlci4gSG93ZXZlciwgaXQgd291bGQKKyAgICAgc3RyaW5nLWl6ZSB0aGUgYWN0dWFsIHZlcnNpb24gbWFjcm8gKm5hbWVzKiB1bmxlc3Mgd2UgZ2V0IHRoZW0KKyAgICAgc3Vic3RpdHV0ZWQgYmVmb3JlIGJlaW5nIHBhc3NlZCB0byBWMS4gQ1BQIGlzIGRlZmluZWQgdG8gZXhwYW5kCisgICAgIGEgbWFjcm8sIHRoZW4gcmVzY2FuIGZvciBtb3JlIGV4cGFuc2lvbnMuIFRodXMsIHdlIHVzZSBWMiB0byBleHBhbmQKKyAgICAgdGhlIHZlcnNpb24gbWFjcm9zLCB0aGVuIENQUCB3aWxsIGV4cGFuZCB0aGUgcmVzdWx0aW5nIFYxKCkgbWFjcm8KKyAgICAgd2l0aCB0aGUgY29ycmVjdCBudW1lcmFscy4gKi8KKyAgLyogIyMjIEknbSBhc3N1bWluZyBjcHAgaXMgcG9ydGFibGUgaW4gdGhpcyByZXNwZWN0Li4uICovCisKKyNkZWZpbmUgVjEoYSxiLGMpIFhNTF9MKCNhKVhNTF9MKCIuIilYTUxfTCgjYilYTUxfTCgiLiIpWE1MX0woI2MpCisjZGVmaW5lIFYyKGEsYixjKSBYTUxfTCgiZXhwYXRfIilWMShhLGIsYykKKworICByZXR1cm4gVjIoWE1MX01BSk9SX1ZFUlNJT04sIFhNTF9NSU5PUl9WRVJTSU9OLCBYTUxfTUlDUk9fVkVSU0lPTik7CisKKyN1bmRlZiBWMQorI3VuZGVmIFYyCit9CisKK1hNTF9FeHBhdF9WZXJzaW9uIFhNTENBTEwKK1hNTF9FeHBhdFZlcnNpb25JbmZvKHZvaWQpCit7CisgIFhNTF9FeHBhdF9WZXJzaW9uIHZlcnNpb247CisKKyAgdmVyc2lvbi5tYWpvciA9IFhNTF9NQUpPUl9WRVJTSU9OOworICB2ZXJzaW9uLm1pbm9yID0gWE1MX01JTk9SX1ZFUlNJT047CisgIHZlcnNpb24ubWljcm8gPSBYTUxfTUlDUk9fVkVSU0lPTjsKKworICByZXR1cm4gdmVyc2lvbjsKK30KKworY29uc3QgWE1MX0ZlYXR1cmUgKiBYTUxDQUxMCitYTUxfR2V0RmVhdHVyZUxpc3Qodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IFhNTF9GZWF0dXJlIGZlYXR1cmVzW10gPSB7CisgICAge1hNTF9GRUFUVVJFX1NJWkVPRl9YTUxfQ0hBUiwgIFhNTF9MKCJzaXplb2YoWE1MX0NoYXIpIiksCisgICAgIHNpemVvZihYTUxfQ2hhcil9LAorICAgIHtYTUxfRkVBVFVSRV9TSVpFT0ZfWE1MX0xDSEFSLCBYTUxfTCgic2l6ZW9mKFhNTF9MQ2hhcikiKSwKKyAgICAgc2l6ZW9mKFhNTF9MQ2hhcil9LAorI2lmZGVmIFhNTF9VTklDT0RFCisgICAge1hNTF9GRUFUVVJFX1VOSUNPREUsICAgICAgICAgIFhNTF9MKCJYTUxfVU5JQ09ERSIpLCAwfSwKKyNlbmRpZgorI2lmZGVmIFhNTF9VTklDT0RFX1dDSEFSX1QKKyAgICB7WE1MX0ZFQVRVUkVfVU5JQ09ERV9XQ0hBUl9ULCAgWE1MX0woIlhNTF9VTklDT0RFX1dDSEFSX1QiKSwgMH0sCisjZW5kaWYKKyNpZmRlZiBYTUxfRFRECisgICAge1hNTF9GRUFUVVJFX0RURCwgICAgICAgICAgICAgIFhNTF9MKCJYTUxfRFREIiksIDB9LAorI2VuZGlmCisjaWZkZWYgWE1MX0NPTlRFWFRfQllURVMKKyAgICB7WE1MX0ZFQVRVUkVfQ09OVEVYVF9CWVRFUywgICAgWE1MX0woIlhNTF9DT05URVhUX0JZVEVTIiksCisgICAgIFhNTF9DT05URVhUX0JZVEVTfSwKKyNlbmRpZgorI2lmZGVmIFhNTF9NSU5fU0laRQorICAgIHtYTUxfRkVBVFVSRV9NSU5fU0laRSwgICAgICAgICBYTUxfTCgiWE1MX01JTl9TSVpFIiksIDB9LAorI2VuZGlmCisjaWZkZWYgWE1MX05TCisgICAge1hNTF9GRUFUVVJFX05TLCAgICAgICAgICAgICAgIFhNTF9MKCJYTUxfTlMiKSwgMH0sCisjZW5kaWYKKyNpZmRlZiBYTUxfTEFSR0VfU0laRQorICAgIHtYTUxfRkVBVFVSRV9MQVJHRV9TSVpFLCAgICAgICBYTUxfTCgiWE1MX0xBUkdFX1NJWkUiKSwgMH0sCisjZW5kaWYgICAgCisgICAge1hNTF9GRUFUVVJFX0VORCwgICAgICAgICAgICAgIE5VTEwsIDB9CisgIH07CisKKyAgcmV0dXJuIGZlYXR1cmVzOworfQorCisvKiBJbml0aWFsbHkgdGFnLT5yYXdOYW1lIGFsd2F5cyBwb2ludHMgaW50byB0aGUgcGFyc2UgYnVmZmVyOworICAgZm9yIHRob3NlIFRBRyBpbnN0YW5jZXMgb3BlbmVkIHdoaWxlIHRoZSBjdXJyZW50IHBhcnNlIGJ1ZmZlciB3YXMKKyAgIHByb2Nlc3NlZCwgYW5kIG5vdCB5ZXQgY2xvc2VkLCB3ZSBuZWVkIHRvIHN0b3JlIHRhZy0+cmF3TmFtZSBpbiBhIG1vcmUKKyAgIHBlcm1hbmVudCBsb2NhdGlvbiwgc2luY2UgdGhlIHBhcnNlIGJ1ZmZlciBpcyBhYm91dCB0byBiZSBkaXNjYXJkZWQuCisqLworc3RhdGljIFhNTF9Cb29sCitzdG9yZVJhd05hbWVzKFhNTF9QYXJzZXIgcGFyc2VyKQoreworICBUQUcgKnRhZyA9IHRhZ1N0YWNrOworICB3aGlsZSAodGFnKSB7CisgICAgaW50IGJ1ZlNpemU7CisgICAgaW50IG5hbWVMZW4gPSBzaXplb2YoWE1MX0NoYXIpICogKHRhZy0+bmFtZS5zdHJMZW4gKyAxKTsKKyAgICBjaGFyICpyYXdOYW1lQnVmID0gdGFnLT5idWYgKyBuYW1lTGVuOworICAgIC8qIFN0b3AgaWYgYWxyZWFkeSBzdG9yZWQuICBTaW5jZSB0YWdTdGFjayBpcyBhIHN0YWNrLCB3ZSBjYW4gc3RvcAorICAgICAgIGF0IHRoZSBmaXJzdCBlbnRyeSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY29waWVkOyBldmVyeXRoaW5nCisgICAgICAgYmVsb3cgaXQgaW4gdGhlIHN0YWNrIGlzIGFscmVhZHkgYmVlbiBhY2NvdW50ZWQgZm9yIGluIGEKKyAgICAgICBwcmV2aW91cyBjYWxsIHRvIHRoaXMgZnVuY3Rpb24uCisgICAgKi8KKyAgICBpZiAodGFnLT5yYXdOYW1lID09IHJhd05hbWVCdWYpCisgICAgICBicmVhazsKKyAgICAvKiBGb3IgcmUtdXNlIHB1cnBvc2VzIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlCisgICAgICAgc2l6ZSBvZiB0YWctPmJ1ZiBpcyBhIG11bHRpcGxlIG9mIHNpemVvZihYTUxfQ2hhcikuCisgICAgKi8KKyAgICBidWZTaXplID0gbmFtZUxlbiArIFJPVU5EX1VQKHRhZy0+cmF3TmFtZUxlbmd0aCwgc2l6ZW9mKFhNTF9DaGFyKSk7CisgICAgaWYgKGJ1ZlNpemUgPiB0YWctPmJ1ZkVuZCAtIHRhZy0+YnVmKSB7CisgICAgICBjaGFyICp0ZW1wID0gKGNoYXIgKilSRUFMTE9DKHRhZy0+YnVmLCBidWZTaXplKTsKKyAgICAgIGlmICh0ZW1wID09IE5VTEwpCisgICAgICAgIHJldHVybiBYTUxfRkFMU0U7CisgICAgICAvKiBpZiB0YWctPm5hbWUuc3RyIHBvaW50cyB0byB0YWctPmJ1ZiAob25seSB3aGVuIG5hbWVzcGFjZQorICAgICAgICAgcHJvY2Vzc2luZyBpcyBvZmYpIHRoZW4gd2UgaGF2ZSB0byB1cGRhdGUgaXQKKyAgICAgICovCisgICAgICBpZiAodGFnLT5uYW1lLnN0ciA9PSAoWE1MX0NoYXIgKil0YWctPmJ1ZikKKyAgICAgICAgdGFnLT5uYW1lLnN0ciA9IChYTUxfQ2hhciAqKXRlbXA7CisgICAgICAvKiBpZiB0YWctPm5hbWUubG9jYWxQYXJ0IGlzIHNldCAod2hlbiBuYW1lc3BhY2UgcHJvY2Vzc2luZyBpcyBvbikKKyAgICAgICAgIHRoZW4gdXBkYXRlIGl0IGFzIHdlbGwsIHNpbmNlIGl0IHdpbGwgYWx3YXlzIHBvaW50IGludG8gdGFnLT5idWYKKyAgICAgICovCisgICAgICBpZiAodGFnLT5uYW1lLmxvY2FsUGFydCkKKyAgICAgICAgdGFnLT5uYW1lLmxvY2FsUGFydCA9IChYTUxfQ2hhciAqKXRlbXAgKyAodGFnLT5uYW1lLmxvY2FsUGFydCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChYTUxfQ2hhciAqKXRhZy0+YnVmKTsKKyAgICAgIHRhZy0+YnVmID0gdGVtcDsKKyAgICAgIHRhZy0+YnVmRW5kID0gdGVtcCArIGJ1ZlNpemU7CisgICAgICByYXdOYW1lQnVmID0gdGVtcCArIG5hbWVMZW47CisgICAgfQorICAgIG1lbWNweShyYXdOYW1lQnVmLCB0YWctPnJhd05hbWUsIHRhZy0+cmF3TmFtZUxlbmd0aCk7CisgICAgdGFnLT5yYXdOYW1lID0gcmF3TmFtZUJ1ZjsKKyAgICB0YWcgPSB0YWctPnBhcmVudDsKKyAgfQorICByZXR1cm4gWE1MX1RSVUU7Cit9CisKK3N0YXRpYyBlbnVtIFhNTF9FcnJvciBQVFJDQUxMCitjb250ZW50UHJvY2Vzc29yKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdGFydCwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqZW5kUHRyKQoreworICBlbnVtIFhNTF9FcnJvciByZXN1bHQgPSBkb0NvbnRlbnQocGFyc2VyLCAwLCBlbmNvZGluZywgc3RhcnQsIGVuZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRQdHIsIChYTUxfQm9vbCkhcHNfZmluYWxCdWZmZXIpOworICBpZiAocmVzdWx0ID09IFhNTF9FUlJPUl9OT05FKSB7CisgICAgaWYgKCFzdG9yZVJhd05hbWVzKHBhcnNlcikpCisgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgZW51bSBYTUxfRXJyb3IgUFRSQ0FMTAorZXh0ZXJuYWxFbnRpdHlJbml0UHJvY2Vzc29yKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqZW5kUHRyKQoreworICBlbnVtIFhNTF9FcnJvciByZXN1bHQgPSBpbml0aWFsaXplRW5jb2RpbmcocGFyc2VyKTsKKyAgaWYgKHJlc3VsdCAhPSBYTUxfRVJST1JfTk9ORSkKKyAgICByZXR1cm4gcmVzdWx0OworICBwcm9jZXNzb3IgPSBleHRlcm5hbEVudGl0eUluaXRQcm9jZXNzb3IyOworICByZXR1cm4gZXh0ZXJuYWxFbnRpdHlJbml0UHJvY2Vzc29yMihwYXJzZXIsIHN0YXJ0LCBlbmQsIGVuZFB0cik7Cit9CisKK3N0YXRpYyBlbnVtIFhNTF9FcnJvciBQVFJDQUxMCitleHRlcm5hbEVudGl0eUluaXRQcm9jZXNzb3IyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqZW5kUHRyKQoreworICBjb25zdCBjaGFyICpuZXh0ID0gc3RhcnQ7IC8qIFhtbENvbnRlbnRUb2sgZG9lc24ndCBhbHdheXMgc2V0IHRoZSBsYXN0IGFyZyAqLworICBpbnQgdG9rID0gWG1sQ29udGVudFRvayhlbmNvZGluZywgc3RhcnQsIGVuZCwgJm5leHQpOworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfQk9NOgorICAgIC8qIElmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIsIHRoaXMgd291bGQgY2F1c2UgdGhlIG5leHQgc3RhZ2UsCisgICAgICAgaS5lLiBleHRlcm5hbEVudGl0eUluaXRQcm9jZXNzb3IzLCB0byBwYXNzIGNvbnRyb2wgZGlyZWN0bHkgdG8KKyAgICAgICBkb0NvbnRlbnQgKGJ5IGRldGVjdGluZyBYTUxfVE9LX05PTkUpIHdpdGhvdXQgcHJvY2Vzc2luZyBhbnkgeG1sIHRleHQKKyAgICAgICBkZWNsYXJhdGlvbiAtIGNhdXNpbmcgdGhlIGVycm9yIFhNTF9FUlJPUl9NSVNQTEFDRURfWE1MX1BJIGluIGRvQ29udGVudC4KKyAgICAqLworICAgIGlmIChuZXh0ID09IGVuZCAmJiAhcHNfZmluYWxCdWZmZXIpIHsKKyAgICAgICplbmRQdHIgPSBuZXh0OworICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgIH0KKyAgICBzdGFydCA9IG5leHQ7CisgICAgYnJlYWs7CisgIGNhc2UgWE1MX1RPS19QQVJUSUFMOgorICAgIGlmICghcHNfZmluYWxCdWZmZXIpIHsKKyAgICAgICplbmRQdHIgPSBzdGFydDsKKyAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICB9CisgICAgZXZlbnRQdHIgPSBzdGFydDsKKyAgICByZXR1cm4gWE1MX0VSUk9SX1VOQ0xPU0VEX1RPS0VOOworICBjYXNlIFhNTF9UT0tfUEFSVElBTF9DSEFSOgorICAgIGlmICghcHNfZmluYWxCdWZmZXIpIHsKKyAgICAgICplbmRQdHIgPSBzdGFydDsKKyAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICB9CisgICAgZXZlbnRQdHIgPSBzdGFydDsKKyAgICByZXR1cm4gWE1MX0VSUk9SX1BBUlRJQUxfQ0hBUjsKKyAgfQorICBwcm9jZXNzb3IgPSBleHRlcm5hbEVudGl0eUluaXRQcm9jZXNzb3IzOworICByZXR1cm4gZXh0ZXJuYWxFbnRpdHlJbml0UHJvY2Vzc29yMyhwYXJzZXIsIHN0YXJ0LCBlbmQsIGVuZFB0cik7Cit9CisKK3N0YXRpYyBlbnVtIFhNTF9FcnJvciBQVFJDQUxMCitleHRlcm5hbEVudGl0eUluaXRQcm9jZXNzb3IzKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqZW5kUHRyKQoreworICBpbnQgdG9rOworICBjb25zdCBjaGFyICpuZXh0ID0gc3RhcnQ7IC8qIFhtbENvbnRlbnRUb2sgZG9lc24ndCBhbHdheXMgc2V0IHRoZSBsYXN0IGFyZyAqLworICBldmVudFB0ciA9IHN0YXJ0OworICB0b2sgPSBYbWxDb250ZW50VG9rKGVuY29kaW5nLCBzdGFydCwgZW5kLCAmbmV4dCk7CisgIGV2ZW50RW5kUHRyID0gbmV4dDsKKworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfWE1MX0RFQ0w6CisgICAgeworICAgICAgZW51bSBYTUxfRXJyb3IgcmVzdWx0OworICAgICAgcmVzdWx0ID0gcHJvY2Vzc1htbERlY2wocGFyc2VyLCAxLCBzdGFydCwgbmV4dCk7CisgICAgICBpZiAocmVzdWx0ICE9IFhNTF9FUlJPUl9OT05FKQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgc3dpdGNoIChwc19wYXJzaW5nKSB7CisgICAgICBjYXNlIFhNTF9TVVNQRU5ERUQ6IAorICAgICAgICAqZW5kUHRyID0gbmV4dDsKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgICAgY2FzZSBYTUxfRklOSVNIRUQ6CisgICAgICAgIHJldHVybiBYTUxfRVJST1JfQUJPUlRFRDsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHN0YXJ0ID0gbmV4dDsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgWE1MX1RPS19QQVJUSUFMOgorICAgIGlmICghcHNfZmluYWxCdWZmZXIpIHsKKyAgICAgICplbmRQdHIgPSBzdGFydDsKKyAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICB9CisgICAgcmV0dXJuIFhNTF9FUlJPUl9VTkNMT1NFRF9UT0tFTjsKKyAgY2FzZSBYTUxfVE9LX1BBUlRJQUxfQ0hBUjoKKyAgICBpZiAoIXBzX2ZpbmFsQnVmZmVyKSB7CisgICAgICAqZW5kUHRyID0gc3RhcnQ7CisgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CisgICAgfQorICAgIHJldHVybiBYTUxfRVJST1JfUEFSVElBTF9DSEFSOworICB9CisgIHByb2Nlc3NvciA9IGV4dGVybmFsRW50aXR5Q29udGVudFByb2Nlc3NvcjsKKyAgdGFnTGV2ZWwgPSAxOworICByZXR1cm4gZXh0ZXJuYWxFbnRpdHlDb250ZW50UHJvY2Vzc29yKHBhcnNlciwgc3RhcnQsIGVuZCwgZW5kUHRyKTsKK30KKworc3RhdGljIGVudW0gWE1MX0Vycm9yIFBUUkNBTEwKK2V4dGVybmFsRW50aXR5Q29udGVudFByb2Nlc3NvcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmVuZFB0cikKK3sKKyAgZW51bSBYTUxfRXJyb3IgcmVzdWx0ID0gZG9Db250ZW50KHBhcnNlciwgMSwgZW5jb2RpbmcsIHN0YXJ0LCBlbmQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kUHRyLCAoWE1MX0Jvb2wpIXBzX2ZpbmFsQnVmZmVyKTsKKyAgaWYgKHJlc3VsdCA9PSBYTUxfRVJST1JfTk9ORSkgeworICAgIGlmICghc3RvcmVSYXdOYW1lcyhwYXJzZXIpKQorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGVudW0gWE1MX0Vycm9yCitkb0NvbnRlbnQoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgaW50IHN0YXJ0VGFnTGV2ZWwsCisgICAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYywKKyAgICAgICAgICBjb25zdCBjaGFyICpzLAorICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICBjb25zdCBjaGFyICoqbmV4dFB0ciwKKyAgICAgICAgICBYTUxfQm9vbCBoYXZlTW9yZSkKK3sKKyAgLyogc2F2ZSBvbmUgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gKi8KKyAgRFREICogY29uc3QgZHRkID0gX2R0ZDsgIAorCisgIGNvbnN0IGNoYXIgKipldmVudFBQOworICBjb25zdCBjaGFyICoqZXZlbnRFbmRQUDsKKyAgaWYgKGVuYyA9PSBlbmNvZGluZykgeworICAgIGV2ZW50UFAgPSAmZXZlbnRQdHI7CisgICAgZXZlbnRFbmRQUCA9ICZldmVudEVuZFB0cjsKKyAgfQorICBlbHNlIHsKKyAgICBldmVudFBQID0gJihvcGVuSW50ZXJuYWxFbnRpdGllcy0+aW50ZXJuYWxFdmVudFB0cik7CisgICAgZXZlbnRFbmRQUCA9ICYob3BlbkludGVybmFsRW50aXRpZXMtPmludGVybmFsRXZlbnRFbmRQdHIpOworICB9CisgICpldmVudFBQID0gczsKKworICBmb3IgKDs7KSB7CisgICAgY29uc3QgY2hhciAqbmV4dCA9IHM7IC8qIFhtbENvbnRlbnRUb2sgZG9lc24ndCBhbHdheXMgc2V0IHRoZSBsYXN0IGFyZyAqLworICAgIGludCB0b2sgPSBYbWxDb250ZW50VG9rKGVuYywgcywgZW5kLCAmbmV4dCk7CisgICAgKmV2ZW50RW5kUFAgPSBuZXh0OworICAgIHN3aXRjaCAodG9rKSB7CisgICAgY2FzZSBYTUxfVE9LX1RSQUlMSU5HX0NSOgorICAgICAgaWYgKGhhdmVNb3JlKSB7CisgICAgICAgICpuZXh0UHRyID0gczsKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgICAgfQorICAgICAgKmV2ZW50RW5kUFAgPSBlbmQ7CisgICAgICBpZiAoY2hhcmFjdGVyRGF0YUhhbmRsZXIpIHsKKyAgICAgICAgWE1MX0NoYXIgYyA9IDB4QTsKKyAgICAgICAgY2hhcmFjdGVyRGF0YUhhbmRsZXIoaGFuZGxlckFyZywgJmMsIDEpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoZGVmYXVsdEhhbmRsZXIpCisgICAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHMsIGVuZCk7CisgICAgICAvKiBXZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgZmluYWwgYnVmZmVyLCBzaG91bGQgd2UgY2hlY2sgZm9yIAorICAgICAgICAgWE1MX1NVU1BFTkRFRCwgWE1MX0ZJTklTSEVEPyAKKyAgICAgICovCisgICAgICBpZiAoc3RhcnRUYWdMZXZlbCA9PSAwKQorICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX0VMRU1FTlRTOworICAgICAgaWYgKHRhZ0xldmVsICE9IHN0YXJ0VGFnTGV2ZWwpCisgICAgICAgIHJldHVybiBYTUxfRVJST1JfQVNZTkNfRU5USVRZOworICAgICAgKm5leHRQdHIgPSBlbmQ7CisgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CisgICAgY2FzZSBYTUxfVE9LX05PTkU6CisgICAgICBpZiAoaGF2ZU1vcmUpIHsKKyAgICAgICAgKm5leHRQdHIgPSBzOworICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CisgICAgICB9CisgICAgICBpZiAoc3RhcnRUYWdMZXZlbCA+IDApIHsKKyAgICAgICAgaWYgKHRhZ0xldmVsICE9IHN0YXJ0VGFnTGV2ZWwpCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9BU1lOQ19FTlRJVFk7CisgICAgICAgICpuZXh0UHRyID0gczsKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgICAgfQorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19FTEVNRU5UUzsKKyAgICBjYXNlIFhNTF9UT0tfSU5WQUxJRDoKKyAgICAgICpldmVudFBQID0gbmV4dDsKKyAgICAgIHJldHVybiBYTUxfRVJST1JfSU5WQUxJRF9UT0tFTjsKKyAgICBjYXNlIFhNTF9UT0tfUEFSVElBTDoKKyAgICAgIGlmIChoYXZlTW9yZSkgeworICAgICAgICAqbmV4dFB0ciA9IHM7CisgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBYTUxfRVJST1JfVU5DTE9TRURfVE9LRU47CisgICAgY2FzZSBYTUxfVE9LX1BBUlRJQUxfQ0hBUjoKKyAgICAgIGlmIChoYXZlTW9yZSkgeworICAgICAgICAqbmV4dFB0ciA9IHM7CisgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBYTUxfRVJST1JfUEFSVElBTF9DSEFSOworICAgIGNhc2UgWE1MX1RPS19FTlRJVFlfUkVGOgorICAgICAgeworICAgICAgICBjb25zdCBYTUxfQ2hhciAqbmFtZTsKKyAgICAgICAgRU5USVRZICplbnRpdHk7CisgICAgICAgIFhNTF9DaGFyIGNoID0gKFhNTF9DaGFyKSBYbWxQcmVkZWZpbmVkRW50aXR5TmFtZShlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyArIGVuYy0+bWluQnl0ZXNQZXJDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgLSBlbmMtPm1pbkJ5dGVzUGVyQ2hhcik7CisgICAgICAgIGlmIChjaCkgeworICAgICAgICAgIGlmIChjaGFyYWN0ZXJEYXRhSGFuZGxlcikKKyAgICAgICAgICAgIGNoYXJhY3RlckRhdGFIYW5kbGVyKGhhbmRsZXJBcmcsICZjaCwgMSk7CisgICAgICAgICAgZWxzZSBpZiAoZGVmYXVsdEhhbmRsZXIpCisgICAgICAgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBuYW1lID0gcG9vbFN0b3JlU3RyaW5nKCZkdGQtPnBvb2wsIGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyArIGVuYy0+bWluQnl0ZXNQZXJDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IC0gZW5jLT5taW5CeXRlc1BlckNoYXIpOworICAgICAgICBpZiAoIW5hbWUpCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgIGVudGl0eSA9IChFTlRJVFkgKilsb29rdXAoJmR0ZC0+Z2VuZXJhbEVudGl0aWVzLCBuYW1lLCAwKTsKKyAgICAgICAgcG9vbERpc2NhcmQoJmR0ZC0+cG9vbCk7CisgICAgICAgIC8qIEZpcnN0LCBkZXRlcm1pbmUgaWYgYSBjaGVjayBmb3IgYW4gZXhpc3RpbmcgZGVjbGFyYXRpb24gaXMgbmVlZGVkOworICAgICAgICAgICBpZiB5ZXMsIGNoZWNrIHRoYXQgdGhlIGVudGl0eSBleGlzdHMsIGFuZCB0aGF0IGl0IGlzIGludGVybmFsLAorICAgICAgICAgICBvdGhlcndpc2UgY2FsbCB0aGUgc2tpcHBlZCBlbnRpdHkgb3IgZGVmYXVsdCBoYW5kbGVyLgorICAgICAgICAqLworICAgICAgICBpZiAoIWR0ZC0+aGFzUGFyYW1FbnRpdHlSZWZzIHx8IGR0ZC0+c3RhbmRhbG9uZSkgeworICAgICAgICAgIGlmICghZW50aXR5KQorICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9VTkRFRklORURfRU5USVRZOworICAgICAgICAgIGVsc2UgaWYgKCFlbnRpdHktPmlzX2ludGVybmFsKQorICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9FTlRJVFlfREVDTEFSRURfSU5fUEU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIWVudGl0eSkgeworICAgICAgICAgIGlmIChza2lwcGVkRW50aXR5SGFuZGxlcikKKyAgICAgICAgICAgIHNraXBwZWRFbnRpdHlIYW5kbGVyKGhhbmRsZXJBcmcsIG5hbWUsIDApOworICAgICAgICAgIGVsc2UgaWYgKGRlZmF1bHRIYW5kbGVyKQorICAgICAgICAgICAgcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuYywgcywgbmV4dCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVudGl0eS0+b3BlbikKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX1JFQ1VSU0lWRV9FTlRJVFlfUkVGOworICAgICAgICBpZiAoZW50aXR5LT5ub3RhdGlvbikKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0JJTkFSWV9FTlRJVFlfUkVGOworICAgICAgICBpZiAoZW50aXR5LT50ZXh0UHRyKSB7CisgICAgICAgICAgZW51bSBYTUxfRXJyb3IgcmVzdWx0OworICAgICAgICAgIGlmICghZGVmYXVsdEV4cGFuZEludGVybmFsRW50aXRpZXMpIHsKKyAgICAgICAgICAgIGlmIChza2lwcGVkRW50aXR5SGFuZGxlcikKKyAgICAgICAgICAgICAgc2tpcHBlZEVudGl0eUhhbmRsZXIoaGFuZGxlckFyZywgZW50aXR5LT5uYW1lLCAwKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGRlZmF1bHRIYW5kbGVyKQorICAgICAgICAgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICByZXN1bHQgPSBwcm9jZXNzSW50ZXJuYWxFbnRpdHkocGFyc2VyLCBlbnRpdHksIFhNTF9GQUxTRSk7CisgICAgICAgICAgaWYgKHJlc3VsdCAhPSBYTUxfRVJST1JfTk9ORSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyKSB7CisgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmNvbnRleHQ7CisgICAgICAgICAgZW50aXR5LT5vcGVuID0gWE1MX1RSVUU7CisgICAgICAgICAgY29udGV4dCA9IGdldENvbnRleHQocGFyc2VyKTsKKyAgICAgICAgICBlbnRpdHktPm9wZW4gPSBYTUxfRkFMU0U7CisgICAgICAgICAgaWYgKCFjb250ZXh0KQorICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgICAgaWYgKCFleHRlcm5hbEVudGl0eVJlZkhhbmRsZXIoZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5LT5iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eS0+c3lzdGVtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5LT5wdWJsaWNJZCkpCisgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0VYVEVSTkFMX0VOVElUWV9IQU5ETElORzsKKyAgICAgICAgICBwb29sRGlzY2FyZCgmdGVtcFBvb2wpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGRlZmF1bHRIYW5kbGVyKQorICAgICAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHMsIG5leHQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIFhNTF9UT0tfU1RBUlRfVEFHX05PX0FUVFM6CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlIFhNTF9UT0tfU1RBUlRfVEFHX1dJVEhfQVRUUzoKKyAgICAgIHsKKyAgICAgICAgVEFHICp0YWc7CisgICAgICAgIGVudW0gWE1MX0Vycm9yIHJlc3VsdDsKKyAgICAgICAgWE1MX0NoYXIgKnRvUHRyOworICAgICAgICBpZiAoZnJlZVRhZ0xpc3QpIHsKKyAgICAgICAgICB0YWcgPSBmcmVlVGFnTGlzdDsKKyAgICAgICAgICBmcmVlVGFnTGlzdCA9IGZyZWVUYWdMaXN0LT5wYXJlbnQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgdGFnID0gKFRBRyAqKU1BTExPQyhzaXplb2YoVEFHKSk7CisgICAgICAgICAgaWYgKCF0YWcpCisgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgICB0YWctPmJ1ZiA9IChjaGFyICopTUFMTE9DKElOSVRfVEFHX0JVRl9TSVpFKTsKKyAgICAgICAgICBpZiAoIXRhZy0+YnVmKSB7CisgICAgICAgICAgICBGUkVFKHRhZyk7CisgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgICB9CisgICAgICAgICAgdGFnLT5idWZFbmQgPSB0YWctPmJ1ZiArIElOSVRfVEFHX0JVRl9TSVpFOworICAgICAgICB9CisgICAgICAgIHRhZy0+YmluZGluZ3MgPSBOVUxMOworICAgICAgICB0YWctPnBhcmVudCA9IHRhZ1N0YWNrOworICAgICAgICB0YWdTdGFjayA9IHRhZzsKKyAgICAgICAgdGFnLT5uYW1lLmxvY2FsUGFydCA9IE5VTEw7CisgICAgICAgIHRhZy0+bmFtZS5wcmVmaXggPSBOVUxMOworICAgICAgICB0YWctPnJhd05hbWUgPSBzICsgZW5jLT5taW5CeXRlc1BlckNoYXI7CisgICAgICAgIHRhZy0+cmF3TmFtZUxlbmd0aCA9IFhtbE5hbWVMZW5ndGgoZW5jLCB0YWctPnJhd05hbWUpOworICAgICAgICArK3RhZ0xldmVsOworICAgICAgICB7CisgICAgICAgICAgY29uc3QgY2hhciAqcmF3TmFtZUVuZCA9IHRhZy0+cmF3TmFtZSArIHRhZy0+cmF3TmFtZUxlbmd0aDsKKyAgICAgICAgICBjb25zdCBjaGFyICpmcm9tUHRyID0gdGFnLT5yYXdOYW1lOworICAgICAgICAgIHRvUHRyID0gKFhNTF9DaGFyICopdGFnLT5idWY7CisgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgaW50IGJ1ZlNpemU7CisgICAgICAgICAgICBpbnQgY29udkxlbjsKKyAgICAgICAgICAgIFhtbENvbnZlcnQoZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAmZnJvbVB0ciwgcmF3TmFtZUVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgKElDSEFSICoqKSZ0b1B0ciwgKElDSEFSICopdGFnLT5idWZFbmQgLSAxKTsKKyAgICAgICAgICAgIGNvbnZMZW4gPSAoaW50KSh0b1B0ciAtIChYTUxfQ2hhciAqKXRhZy0+YnVmKTsKKyAgICAgICAgICAgIGlmIChmcm9tUHRyID09IHJhd05hbWVFbmQpIHsKKyAgICAgICAgICAgICAgdGFnLT5uYW1lLnN0ckxlbiA9IGNvbnZMZW47CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmU2l6ZSA9IChpbnQpKHRhZy0+YnVmRW5kIC0gdGFnLT5idWYpIDw8IDE7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNoYXIgKnRlbXAgPSAoY2hhciAqKVJFQUxMT0ModGFnLT5idWYsIGJ1ZlNpemUpOworICAgICAgICAgICAgICBpZiAodGVtcCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICAgICAgICB0YWctPmJ1ZiA9IHRlbXA7CisgICAgICAgICAgICAgIHRhZy0+YnVmRW5kID0gdGVtcCArIGJ1ZlNpemU7CisgICAgICAgICAgICAgIHRvUHRyID0gKFhNTF9DaGFyICopdGVtcCArIGNvbnZMZW47CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRhZy0+bmFtZS5zdHIgPSAoWE1MX0NoYXIgKil0YWctPmJ1ZjsKKyAgICAgICAgKnRvUHRyID0gWE1MX1QoJ1wwJyk7CisgICAgICAgIHJlc3VsdCA9IHN0b3JlQXR0cyhwYXJzZXIsIGVuYywgcywgJih0YWctPm5hbWUpLCAmKHRhZy0+YmluZGluZ3MpKTsKKyAgICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICBpZiAoc3RhcnRFbGVtZW50SGFuZGxlcikKKyAgICAgICAgICBzdGFydEVsZW1lbnRIYW5kbGVyKGhhbmRsZXJBcmcsIHRhZy0+bmFtZS5zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgWE1MX0NoYXIgKiopYXR0cyk7CisgICAgICAgIGVsc2UgaWYgKGRlZmF1bHRIYW5kbGVyKQorICAgICAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHMsIG5leHQpOworICAgICAgICBwb29sQ2xlYXIoJnRlbXBQb29sKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBYTUxfVE9LX0VNUFRZX0VMRU1FTlRfTk9fQVRUUzoKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgWE1MX1RPS19FTVBUWV9FTEVNRU5UX1dJVEhfQVRUUzoKKyAgICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqcmF3TmFtZSA9IHMgKyBlbmMtPm1pbkJ5dGVzUGVyQ2hhcjsKKyAgICAgICAgZW51bSBYTUxfRXJyb3IgcmVzdWx0OworICAgICAgICBCSU5ESU5HICpiaW5kaW5ncyA9IE5VTEw7CisgICAgICAgIFhNTF9Cb29sIG5vRWxtSGFuZGxlcnMgPSBYTUxfVFJVRTsKKyAgICAgICAgVEFHX05BTUUgbmFtZTsKKyAgICAgICAgbmFtZS5zdHIgPSBwb29sU3RvcmVTdHJpbmcoJnRlbXBQb29sLCBlbmMsIHJhd05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd05hbWUgKyBYbWxOYW1lTGVuZ3RoKGVuYywgcmF3TmFtZSkpOworICAgICAgICBpZiAoIW5hbWUuc3RyKQorICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICBwb29sRmluaXNoKCZ0ZW1wUG9vbCk7CisgICAgICAgIHJlc3VsdCA9IHN0b3JlQXR0cyhwYXJzZXIsIGVuYywgcywgJm5hbWUsICZiaW5kaW5ncyk7CisgICAgICAgIGlmIChyZXN1bHQpCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcG9vbEZpbmlzaCgmdGVtcFBvb2wpOworICAgICAgICBpZiAoc3RhcnRFbGVtZW50SGFuZGxlcikgeworICAgICAgICAgIHN0YXJ0RWxlbWVudEhhbmRsZXIoaGFuZGxlckFyZywgbmFtZS5zdHIsIChjb25zdCBYTUxfQ2hhciAqKilhdHRzKTsKKyAgICAgICAgICBub0VsbUhhbmRsZXJzID0gWE1MX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGlmIChlbmRFbGVtZW50SGFuZGxlcikgeworICAgICAgICAgIGlmIChzdGFydEVsZW1lbnRIYW5kbGVyKQorICAgICAgICAgICAgKmV2ZW50UFAgPSAqZXZlbnRFbmRQUDsKKyAgICAgICAgICBlbmRFbGVtZW50SGFuZGxlcihoYW5kbGVyQXJnLCBuYW1lLnN0cik7CisgICAgICAgICAgbm9FbG1IYW5kbGVycyA9IFhNTF9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBpZiAobm9FbG1IYW5kbGVycyAmJiBkZWZhdWx0SGFuZGxlcikKKyAgICAgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKKyAgICAgICAgcG9vbENsZWFyKCZ0ZW1wUG9vbCk7CisgICAgICAgIHdoaWxlIChiaW5kaW5ncykgeworICAgICAgICAgIEJJTkRJTkcgKmIgPSBiaW5kaW5nczsKKyAgICAgICAgICBpZiAoZW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIpCisgICAgICAgICAgICBlbmROYW1lc3BhY2VEZWNsSGFuZGxlcihoYW5kbGVyQXJnLCBiLT5wcmVmaXgtPm5hbWUpOworICAgICAgICAgIGJpbmRpbmdzID0gYmluZGluZ3MtPm5leHRUYWdCaW5kaW5nOworICAgICAgICAgIGItPm5leHRUYWdCaW5kaW5nID0gZnJlZUJpbmRpbmdMaXN0OworICAgICAgICAgIGZyZWVCaW5kaW5nTGlzdCA9IGI7CisgICAgICAgICAgYi0+cHJlZml4LT5iaW5kaW5nID0gYi0+cHJldlByZWZpeEJpbmRpbmc7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICh0YWdMZXZlbCA9PSAwKQorICAgICAgICByZXR1cm4gZXBpbG9nUHJvY2Vzc29yKHBhcnNlciwgbmV4dCwgZW5kLCBuZXh0UHRyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1RPS19FTkRfVEFHOgorICAgICAgaWYgKHRhZ0xldmVsID09IHN0YXJ0VGFnTGV2ZWwpCisgICAgICAgIHJldHVybiBYTUxfRVJST1JfQVNZTkNfRU5USVRZOworICAgICAgZWxzZSB7CisgICAgICAgIGludCBsZW47CisgICAgICAgIGNvbnN0IGNoYXIgKnJhd05hbWU7CisgICAgICAgIFRBRyAqdGFnID0gdGFnU3RhY2s7CisgICAgICAgIHRhZ1N0YWNrID0gdGFnLT5wYXJlbnQ7CisgICAgICAgIHRhZy0+cGFyZW50ID0gZnJlZVRhZ0xpc3Q7CisgICAgICAgIGZyZWVUYWdMaXN0ID0gdGFnOworICAgICAgICByYXdOYW1lID0gcyArIGVuYy0+bWluQnl0ZXNQZXJDaGFyKjI7CisgICAgICAgIGxlbiA9IFhtbE5hbWVMZW5ndGgoZW5jLCByYXdOYW1lKTsKKyAgICAgICAgaWYgKGxlbiAhPSB0YWctPnJhd05hbWVMZW5ndGgKKyAgICAgICAgICAgIHx8IG1lbWNtcCh0YWctPnJhd05hbWUsIHJhd05hbWUsIGxlbikgIT0gMCkgeworICAgICAgICAgICpldmVudFBQID0gcmF3TmFtZTsKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX1RBR19NSVNNQVRDSDsKKyAgICAgICAgfQorICAgICAgICAtLXRhZ0xldmVsOworICAgICAgICBpZiAoZW5kRWxlbWVudEhhbmRsZXIpIHsKKyAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbG9jYWxQYXJ0OworICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwcmVmaXg7CisgICAgICAgICAgWE1MX0NoYXIgKnVyaTsKKyAgICAgICAgICBsb2NhbFBhcnQgPSB0YWctPm5hbWUubG9jYWxQYXJ0OworICAgICAgICAgIGlmIChucyAmJiBsb2NhbFBhcnQpIHsKKyAgICAgICAgICAgIC8qIGxvY2FsUGFydCBhbmQgcHJlZml4IG1heSBoYXZlIGJlZW4gb3ZlcndyaXR0ZW4gaW4KKyAgICAgICAgICAgICAgIHRhZy0+bmFtZS5zdHIsIHNpbmNlIHRoaXMgcG9pbnRzIHRvIHRoZSBiaW5kaW5nLT51cmkKKyAgICAgICAgICAgICAgIGJ1ZmZlciB3aGljaCBnZXRzIHJlLXVzZWQ7IHNvIHdlIGhhdmUgdG8gYWRkIHRoZW0gYWdhaW4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICB1cmkgPSAoWE1MX0NoYXIgKil0YWctPm5hbWUuc3RyICsgdGFnLT5uYW1lLnVyaUxlbjsKKyAgICAgICAgICAgIC8qIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIHNwYWNlIC0gYWxyZWFkeSBkb25lIGluIHN0b3JlQXR0cygpICovCisgICAgICAgICAgICB3aGlsZSAoKmxvY2FsUGFydCkgKnVyaSsrID0gKmxvY2FsUGFydCsrOworICAgICAgICAgICAgcHJlZml4ID0gKFhNTF9DaGFyICopdGFnLT5uYW1lLnByZWZpeDsKKyAgICAgICAgICAgIGlmIChuc190cmlwbGV0cyAmJiBwcmVmaXgpIHsKKyAgICAgICAgICAgICAgKnVyaSsrID0gbmFtZXNwYWNlU2VwYXJhdG9yOworICAgICAgICAgICAgICB3aGlsZSAoKnByZWZpeCkgKnVyaSsrID0gKnByZWZpeCsrOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICp1cmkgPSBYTUxfVCgnXDAnKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZW5kRWxlbWVudEhhbmRsZXIoaGFuZGxlckFyZywgdGFnLT5uYW1lLnN0cik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZGVmYXVsdEhhbmRsZXIpCisgICAgICAgICAgcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuYywgcywgbmV4dCk7CisgICAgICAgIHdoaWxlICh0YWctPmJpbmRpbmdzKSB7CisgICAgICAgICAgQklORElORyAqYiA9IHRhZy0+YmluZGluZ3M7CisgICAgICAgICAgaWYgKGVuZE5hbWVzcGFjZURlY2xIYW5kbGVyKQorICAgICAgICAgICAgZW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIoaGFuZGxlckFyZywgYi0+cHJlZml4LT5uYW1lKTsKKyAgICAgICAgICB0YWctPmJpbmRpbmdzID0gdGFnLT5iaW5kaW5ncy0+bmV4dFRhZ0JpbmRpbmc7CisgICAgICAgICAgYi0+bmV4dFRhZ0JpbmRpbmcgPSBmcmVlQmluZGluZ0xpc3Q7CisgICAgICAgICAgZnJlZUJpbmRpbmdMaXN0ID0gYjsKKyAgICAgICAgICBiLT5wcmVmaXgtPmJpbmRpbmcgPSBiLT5wcmV2UHJlZml4QmluZGluZzsKKyAgICAgICAgfQorICAgICAgICBpZiAodGFnTGV2ZWwgPT0gMCkKKyAgICAgICAgICByZXR1cm4gZXBpbG9nUHJvY2Vzc29yKHBhcnNlciwgbmV4dCwgZW5kLCBuZXh0UHRyKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1RPS19DSEFSX1JFRjoKKyAgICAgIHsKKyAgICAgICAgaW50IG4gPSBYbWxDaGFyUmVmTnVtYmVyKGVuYywgcyk7CisgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0JBRF9DSEFSX1JFRjsKKyAgICAgICAgaWYgKGNoYXJhY3RlckRhdGFIYW5kbGVyKSB7CisgICAgICAgICAgWE1MX0NoYXIgYnVmW1hNTF9FTkNPREVfTUFYXTsKKyAgICAgICAgICBjaGFyYWN0ZXJEYXRhSGFuZGxlcihoYW5kbGVyQXJnLCBidWYsIFhtbEVuY29kZShuLCAoSUNIQVIgKilidWYpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChkZWZhdWx0SGFuZGxlcikKKyAgICAgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1RPS19YTUxfREVDTDoKKyAgICAgIHJldHVybiBYTUxfRVJST1JfTUlTUExBQ0VEX1hNTF9QSTsKKyAgICBjYXNlIFhNTF9UT0tfREFUQV9ORVdMSU5FOgorICAgICAgaWYgKGNoYXJhY3RlckRhdGFIYW5kbGVyKSB7CisgICAgICAgIFhNTF9DaGFyIGMgPSAweEE7CisgICAgICAgIGNoYXJhY3RlckRhdGFIYW5kbGVyKGhhbmRsZXJBcmcsICZjLCAxKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGRlZmF1bHRIYW5kbGVyKQorICAgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1RPS19DREFUQV9TRUNUX09QRU46CisgICAgICB7CisgICAgICAgIGVudW0gWE1MX0Vycm9yIHJlc3VsdDsKKyAgICAgICAgaWYgKHN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlcikKKyAgICAgICAgICBzdGFydENkYXRhU2VjdGlvbkhhbmRsZXIoaGFuZGxlckFyZyk7CisjaWYgMAorICAgICAgICAvKiBTdXBwb3NlIHlvdSBkb2luZyBhIHRyYW5zZm9ybWF0aW9uIG9uIGEgZG9jdW1lbnQgdGhhdCBpbnZvbHZlcworICAgICAgICAgICBjaGFuZ2luZyBvbmx5IHRoZSBjaGFyYWN0ZXIgZGF0YS4gIFlvdSBzZXQgdXAgYSBkZWZhdWx0SGFuZGxlcgorICAgICAgICAgICBhbmQgYSBjaGFyYWN0ZXJEYXRhSGFuZGxlci4gIFRoZSBkZWZhdWx0SGFuZGxlciBzaW1wbHkgY29waWVzCisgICAgICAgICAgIGNoYXJhY3RlcnMgdGhyb3VnaC4gIFRoZSBjaGFyYWN0ZXJEYXRhSGFuZGxlciBkb2VzIHRoZQorICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbiBhbmQgd3JpdGVzIHRoZSBjaGFyYWN0ZXJzIG91dCBlc2NhcGluZyB0aGVtIGFzCisgICAgICAgICAgIG5lY2Vzc2FyeS4gIFRoaXMgY2FzZSB3aWxsIGZhaWwgdG8gd29yayBpZiB3ZSBsZWF2ZSBvdXQgdGhlCisgICAgICAgICAgIGZvbGxvd2luZyB0d28gbGluZXMgKGJlY2F1c2UgJiBhbmQgPCBpbnNpZGUgQ0RBVEEgc2VjdGlvbnMgd2lsbAorICAgICAgICAgICBiZSBpbmNvcnJlY3RseSBlc2NhcGVkKS4KKworICAgICAgICAgICBIb3dldmVyLCBub3cgd2UgaGF2ZSBhIHN0YXJ0L2VuZENkYXRhU2VjdGlvbkhhbmRsZXIsIHNvIGl0IHNlZW1zCisgICAgICAgICAgIGVhc2llciB0byBsZXQgdGhlIHVzZXIgZGVhbCB3aXRoIHRoaXMuCisgICAgICAgICovCisgICAgICAgIGVsc2UgaWYgKGNoYXJhY3RlckRhdGFIYW5kbGVyKQorICAgICAgICAgIGNoYXJhY3RlckRhdGFIYW5kbGVyKGhhbmRsZXJBcmcsIGRhdGFCdWYsIDApOworI2VuZGlmCisgICAgICAgIGVsc2UgaWYgKGRlZmF1bHRIYW5kbGVyKQorICAgICAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHMsIG5leHQpOworICAgICAgICByZXN1bHQgPSBkb0NkYXRhU2VjdGlvbihwYXJzZXIsIGVuYywgJm5leHQsIGVuZCwgbmV4dFB0ciwgaGF2ZU1vcmUpOworICAgICAgICBpZiAocmVzdWx0ICE9IFhNTF9FUlJPUl9OT05FKQorICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIGVsc2UgaWYgKCFuZXh0KSB7CisgICAgICAgICAgcHJvY2Vzc29yID0gY2RhdGFTZWN0aW9uUHJvY2Vzc29yOworICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1RPS19UUkFJTElOR19SU1FCOgorICAgICAgaWYgKGhhdmVNb3JlKSB7CisgICAgICAgICpuZXh0UHRyID0gczsKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgICAgfQorICAgICAgaWYgKGNoYXJhY3RlckRhdGFIYW5kbGVyKSB7CisgICAgICAgIGlmIChNVVNUX0NPTlZFUlQoZW5jLCBzKSkgeworICAgICAgICAgIElDSEFSICpkYXRhUHRyID0gKElDSEFSICopZGF0YUJ1ZjsKKyAgICAgICAgICBYbWxDb252ZXJ0KGVuYywgJnMsIGVuZCwgJmRhdGFQdHIsIChJQ0hBUiAqKWRhdGFCdWZFbmQpOworICAgICAgICAgIGNoYXJhY3RlckRhdGFIYW5kbGVyKGhhbmRsZXJBcmcsIGRhdGFCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoZGF0YVB0ciAtIChJQ0hBUiAqKWRhdGFCdWYpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgY2hhcmFjdGVyRGF0YUhhbmRsZXIoaGFuZGxlckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWE1MX0NoYXIgKilzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKChYTUxfQ2hhciAqKWVuZCAtIChYTUxfQ2hhciAqKXMpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGRlZmF1bHRIYW5kbGVyKQorICAgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBlbmQpOworICAgICAgLyogV2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbmFsIGJ1ZmZlciwgc2hvdWxkIHdlIGNoZWNrIGZvciAKKyAgICAgICAgIFhNTF9TVVNQRU5ERUQsIFhNTF9GSU5JU0hFRD8gCisgICAgICAqLworICAgICAgaWYgKHN0YXJ0VGFnTGV2ZWwgPT0gMCkgeworICAgICAgICAqZXZlbnRQUCA9IGVuZDsKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19FTEVNRU5UUzsKKyAgICAgIH0KKyAgICAgIGlmICh0YWdMZXZlbCAhPSBzdGFydFRhZ0xldmVsKSB7CisgICAgICAgICpldmVudFBQID0gZW5kOworICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0FTWU5DX0VOVElUWTsKKyAgICAgIH0KKyAgICAgICpuZXh0UHRyID0gZW5kOworICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgIGNhc2UgWE1MX1RPS19EQVRBX0NIQVJTOiAKKyAgICAgIHsKKyAgICAgICAgWE1MX0NoYXJhY3RlckRhdGFIYW5kbGVyIGNoYXJEYXRhSGFuZGxlciA9IGNoYXJhY3RlckRhdGFIYW5kbGVyOworICAgICAgICBpZiAoY2hhckRhdGFIYW5kbGVyKSB7CisgICAgICAgICAgaWYgKE1VU1RfQ09OVkVSVChlbmMsIHMpKSB7CisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgIElDSEFSICpkYXRhUHRyID0gKElDSEFSICopZGF0YUJ1ZjsKKyAgICAgICAgICAgICAgWG1sQ29udmVydChlbmMsICZzLCBuZXh0LCAmZGF0YVB0ciwgKElDSEFSICopZGF0YUJ1ZkVuZCk7CisgICAgICAgICAgICAgICpldmVudEVuZFBQID0gczsKKyAgICAgICAgICAgICAgY2hhckRhdGFIYW5kbGVyKGhhbmRsZXJBcmcsIGRhdGFCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShkYXRhUHRyIC0gKElDSEFSICopZGF0YUJ1ZikpOworICAgICAgICAgICAgICBpZiAocyA9PSBuZXh0KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAqZXZlbnRQUCA9IHM7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNoYXJEYXRhSGFuZGxlcihoYW5kbGVyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChYTUxfQ2hhciAqKXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKFhNTF9DaGFyICopbmV4dCAtIChYTUxfQ2hhciAqKXMpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChkZWZhdWx0SGFuZGxlcikKKyAgICAgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1RPS19QSToKKyAgICAgIGlmICghcmVwb3J0UHJvY2Vzc2luZ0luc3RydWN0aW9uKHBhcnNlciwgZW5jLCBzLCBuZXh0KSkKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhNTF9UT0tfQ09NTUVOVDoKKyAgICAgIGlmICghcmVwb3J0Q29tbWVudChwYXJzZXIsIGVuYywgcywgbmV4dCkpCisgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChkZWZhdWx0SGFuZGxlcikKKyAgICAgICAgcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuYywgcywgbmV4dCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgKmV2ZW50UFAgPSBzID0gbmV4dDsKKyAgICBzd2l0Y2ggKHBzX3BhcnNpbmcpIHsKKyAgICBjYXNlIFhNTF9TVVNQRU5ERUQ6IAorICAgICAgKm5leHRQdHIgPSBuZXh0OworICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgIGNhc2UgWE1MX0ZJTklTSEVEOgorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9BQk9SVEVEOworICAgIGRlZmF1bHQ6IDsKKyAgICB9CisgIH0KKyAgLyogbm90IHJlYWNoZWQgKi8KK30KKworLyogUHJlY29uZGl0aW9uOiBhbGwgYXJndW1lbnRzIG11c3QgYmUgbm9uLU5VTEw7CisgICBQdXJwb3NlOgorICAgLSBub3JtYWxpemUgYXR0cmlidXRlcworICAgLSBjaGVjayBhdHRyaWJ1dGVzIGZvciB3ZWxsLWZvcm1lZG5lc3MKKyAgIC0gZ2VuZXJhdGUgbmFtZXNwYWNlIGF3YXJlIGF0dHJpYnV0ZSBuYW1lcyAoVVJJLCBwcmVmaXgpCisgICAtIGJ1aWxkIGxpc3Qgb2YgYXR0cmlidXRlcyBmb3Igc3RhcnRFbGVtZW50SGFuZGxlcgorICAgLSBkZWZhdWx0IGF0dHJpYnV0ZXMKKyAgIC0gcHJvY2VzcyBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIChjaGVjayBhbmQgcmVwb3J0IHRoZW0pCisgICAtIGdlbmVyYXRlIG5hbWVzcGFjZSBhd2FyZSBlbGVtZW50IG5hbWUgKFVSSSwgcHJlZml4KQorKi8KK3N0YXRpYyBlbnVtIFhNTF9FcnJvcgorc3RvcmVBdHRzKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBFTkNPRElORyAqZW5jLAorICAgICAgICAgIGNvbnN0IGNoYXIgKmF0dFN0ciwgVEFHX05BTUUgKnRhZ05hbWVQdHIsCisgICAgICAgICAgQklORElORyAqKmJpbmRpbmdzUHRyKQoreworICBEVEQgKiBjb25zdCBkdGQgPSBfZHRkOyAgLyogc2F2ZSBvbmUgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gKi8KKyAgRUxFTUVOVF9UWVBFICplbGVtZW50VHlwZTsKKyAgaW50IG5EZWZhdWx0QXR0czsKKyAgY29uc3QgWE1MX0NoYXIgKiphcHBBdHRzOyAgIC8qIHRoZSBhdHRyaWJ1dGUgbGlzdCBmb3IgdGhlIGFwcGxpY2F0aW9uICovCisgIGludCBhdHRJbmRleCA9IDA7CisgIGludCBwcmVmaXhMZW47CisgIGludCBpOworICBpbnQgbjsKKyAgWE1MX0NoYXIgKnVyaTsKKyAgaW50IG5QcmVmaXhlcyA9IDA7CisgIEJJTkRJTkcgKmJpbmRpbmc7CisgIGNvbnN0IFhNTF9DaGFyICpsb2NhbFBhcnQ7CisKKyAgLyogbG9va3VwIHRoZSBlbGVtZW50IHR5cGUgbmFtZSAqLworICBlbGVtZW50VHlwZSA9IChFTEVNRU5UX1RZUEUgKilsb29rdXAoJmR0ZC0+ZWxlbWVudFR5cGVzLCB0YWdOYW1lUHRyLT5zdHIsMCk7CisgIGlmICghZWxlbWVudFR5cGUpIHsKKyAgICBjb25zdCBYTUxfQ2hhciAqbmFtZSA9IHBvb2xDb3B5U3RyaW5nKCZkdGQtPnBvb2wsIHRhZ05hbWVQdHItPnN0cik7CisgICAgaWYgKCFuYW1lKQorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgZWxlbWVudFR5cGUgPSAoRUxFTUVOVF9UWVBFICopbG9va3VwKCZkdGQtPmVsZW1lbnRUeXBlcywgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEVMRU1FTlRfVFlQRSkpOworICAgIGlmICghZWxlbWVudFR5cGUpCisgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICBpZiAobnMgJiYgIXNldEVsZW1lbnRUeXBlUHJlZml4KHBhcnNlciwgZWxlbWVudFR5cGUpKQorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgIH0KKyAgbkRlZmF1bHRBdHRzID0gZWxlbWVudFR5cGUtPm5EZWZhdWx0QXR0czsKKworICAvKiBnZXQgdGhlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgdG9rZW5pemVyICovCisgIG4gPSBYbWxHZXRBdHRyaWJ1dGVzKGVuYywgYXR0U3RyLCBhdHRzU2l6ZSwgYXR0cyk7CisgIGlmIChuICsgbkRlZmF1bHRBdHRzID4gYXR0c1NpemUpIHsKKyAgICBpbnQgb2xkQXR0c1NpemUgPSBhdHRzU2l6ZTsKKyAgICBBVFRSSUJVVEUgKnRlbXA7CisgICAgYXR0c1NpemUgPSBuICsgbkRlZmF1bHRBdHRzICsgSU5JVF9BVFRTX1NJWkU7CisgICAgdGVtcCA9IChBVFRSSUJVVEUgKilSRUFMTE9DKCh2b2lkICopYXR0cywgYXR0c1NpemUgKiBzaXplb2YoQVRUUklCVVRFKSk7CisgICAgaWYgKHRlbXAgPT0gTlVMTCkKKyAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgIGF0dHMgPSB0ZW1wOworICAgIGlmIChuID4gb2xkQXR0c1NpemUpCisgICAgICBYbWxHZXRBdHRyaWJ1dGVzKGVuYywgYXR0U3RyLCBuLCBhdHRzKTsKKyAgfQorCisgIGFwcEF0dHMgPSAoY29uc3QgWE1MX0NoYXIgKiopYXR0czsKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIGFkZCB0aGUgbmFtZSBhbmQgdmFsdWUgdG8gdGhlIGF0dHJpYnV0ZSBsaXN0ICovCisgICAgQVRUUklCVVRFX0lEICphdHRJZCA9IGdldEF0dHJpYnV0ZUlkKHBhcnNlciwgZW5jLCBhdHRzW2ldLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHNbaV0ubmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFhtbE5hbWVMZW5ndGgoZW5jLCBhdHRzW2ldLm5hbWUpKTsKKyAgICBpZiAoIWF0dElkKQorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgLyogRGV0ZWN0IGR1cGxpY2F0ZSBhdHRyaWJ1dGVzIGJ5IHRoZWlyIFFOYW1lcy4gVGhpcyBkb2VzIG5vdCB3b3JrIHdoZW4KKyAgICAgICBuYW1lc3BhY2UgcHJvY2Vzc2luZyBpcyB0dXJuZWQgb24gYW5kIGRpZmZlcmVudCBwcmVmaXhlcyBmb3IgdGhlIHNhbWUKKyAgICAgICBuYW1lc3BhY2UgYXJlIHVzZWQuIEZvciB0aGlzIGNhc2Ugd2UgaGF2ZSBhIGNoZWNrIGZ1cnRoZXIgZG93bi4KKyAgICAqLworICAgIGlmICgoYXR0SWQtPm5hbWUpWy0xXSkgeworICAgICAgaWYgKGVuYyA9PSBlbmNvZGluZykKKyAgICAgICAgZXZlbnRQdHIgPSBhdHRzW2ldLm5hbWU7CisgICAgICByZXR1cm4gWE1MX0VSUk9SX0RVUExJQ0FURV9BVFRSSUJVVEU7CisgICAgfQorICAgIChhdHRJZC0+bmFtZSlbLTFdID0gMTsKKyAgICBhcHBBdHRzW2F0dEluZGV4KytdID0gYXR0SWQtPm5hbWU7CisgICAgaWYgKCFhdHRzW2ldLm5vcm1hbGl6ZWQpIHsKKyAgICAgIGVudW0gWE1MX0Vycm9yIHJlc3VsdDsKKyAgICAgIFhNTF9Cb29sIGlzQ2RhdGEgPSBYTUxfVFJVRTsKKworICAgICAgLyogZmlndXJlIG91dCB3aGV0aGVyIGRlY2xhcmVkIGFzIG90aGVyIHRoYW4gQ0RBVEEgKi8KKyAgICAgIGlmIChhdHRJZC0+bWF5YmVUb2tlbml6ZWQpIHsKKyAgICAgICAgaW50IGo7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBuRGVmYXVsdEF0dHM7IGorKykgeworICAgICAgICAgIGlmIChhdHRJZCA9PSBlbGVtZW50VHlwZS0+ZGVmYXVsdEF0dHNbal0uaWQpIHsKKyAgICAgICAgICAgIGlzQ2RhdGEgPSBlbGVtZW50VHlwZS0+ZGVmYXVsdEF0dHNbal0uaXNDZGF0YTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBub3JtYWxpemUgdGhlIGF0dHJpYnV0ZSB2YWx1ZSAqLworICAgICAgcmVzdWx0ID0gc3RvcmVBdHRyaWJ1dGVWYWx1ZShwYXJzZXIsIGVuYywgaXNDZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0c1tpXS52YWx1ZVB0ciwgYXR0c1tpXS52YWx1ZUVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBQb29sKTsKKyAgICAgIGlmIChyZXN1bHQpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICBhcHBBdHRzW2F0dEluZGV4XSA9IHBvb2xTdGFydCgmdGVtcFBvb2wpOworICAgICAgcG9vbEZpbmlzaCgmdGVtcFBvb2wpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8qIHRoZSB2YWx1ZSBkaWQgbm90IG5lZWQgbm9ybWFsaXppbmcgKi8KKyAgICAgIGFwcEF0dHNbYXR0SW5kZXhdID0gcG9vbFN0b3JlU3RyaW5nKCZ0ZW1wUG9vbCwgZW5jLCBhdHRzW2ldLnZhbHVlUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0c1tpXS52YWx1ZUVuZCk7CisgICAgICBpZiAoYXBwQXR0c1thdHRJbmRleF0gPT0gMCkKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICBwb29sRmluaXNoKCZ0ZW1wUG9vbCk7CisgICAgfQorICAgIC8qIGhhbmRsZSBwcmVmaXhlZCBhdHRyaWJ1dGUgbmFtZXMgKi8KKyAgICBpZiAoYXR0SWQtPnByZWZpeCkgeworICAgICAgaWYgKGF0dElkLT54bWxucykgeworICAgICAgICAvKiBkZWFsIHdpdGggbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBoZXJlICovCisgICAgICAgIGVudW0gWE1MX0Vycm9yIHJlc3VsdCA9IGFkZEJpbmRpbmcocGFyc2VyLCBhdHRJZC0+cHJlZml4LCBhdHRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBBdHRzW2F0dEluZGV4XSwgYmluZGluZ3NQdHIpOworICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIC0tYXR0SW5kZXg7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgLyogZGVhbCB3aXRoIG90aGVyIHByZWZpeGVkIG5hbWVzIGxhdGVyICovCisgICAgICAgIGF0dEluZGV4Kys7CisgICAgICAgIG5QcmVmaXhlcysrOworICAgICAgICAoYXR0SWQtPm5hbWUpWy0xXSA9IDI7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgIGF0dEluZGV4Kys7CisgIH0KKworICAvKiBzZXQtdXAgZm9yIFhNTF9HZXRTcGVjaWZpZWRBdHRyaWJ1dGVDb3VudCBhbmQgWE1MX0dldElkQXR0cmlidXRlSW5kZXggKi8KKyAgblNwZWNpZmllZEF0dHMgPSBhdHRJbmRleDsKKyAgaWYgKGVsZW1lbnRUeXBlLT5pZEF0dCAmJiAoZWxlbWVudFR5cGUtPmlkQXR0LT5uYW1lKVstMV0pIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXR0SW5kZXg7IGkgKz0gMikKKyAgICAgIGlmIChhcHBBdHRzW2ldID09IGVsZW1lbnRUeXBlLT5pZEF0dC0+bmFtZSkgeworICAgICAgICBpZEF0dEluZGV4ID0gaTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgIH0KKyAgZWxzZQorICAgIGlkQXR0SW5kZXggPSAtMTsKKworICAvKiBkbyBhdHRyaWJ1dGUgZGVmYXVsdGluZyAqLworICBmb3IgKGkgPSAwOyBpIDwgbkRlZmF1bHRBdHRzOyBpKyspIHsKKyAgICBjb25zdCBERUZBVUxUX0FUVFJJQlVURSAqZGEgPSBlbGVtZW50VHlwZS0+ZGVmYXVsdEF0dHMgKyBpOworICAgIGlmICghKGRhLT5pZC0+bmFtZSlbLTFdICYmIGRhLT52YWx1ZSkgeworICAgICAgaWYgKGRhLT5pZC0+cHJlZml4KSB7CisgICAgICAgIGlmIChkYS0+aWQtPnhtbG5zKSB7CisgICAgICAgICAgZW51bSBYTUxfRXJyb3IgcmVzdWx0ID0gYWRkQmluZGluZyhwYXJzZXIsIGRhLT5pZC0+cHJlZml4LCBkYS0+aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYS0+dmFsdWUsIGJpbmRpbmdzUHRyKTsKKyAgICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAoZGEtPmlkLT5uYW1lKVstMV0gPSAyOworICAgICAgICAgIG5QcmVmaXhlcysrOworICAgICAgICAgIGFwcEF0dHNbYXR0SW5kZXgrK10gPSBkYS0+aWQtPm5hbWU7CisgICAgICAgICAgYXBwQXR0c1thdHRJbmRleCsrXSA9IGRhLT52YWx1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIChkYS0+aWQtPm5hbWUpWy0xXSA9IDE7CisgICAgICAgIGFwcEF0dHNbYXR0SW5kZXgrK10gPSBkYS0+aWQtPm5hbWU7CisgICAgICAgIGFwcEF0dHNbYXR0SW5kZXgrK10gPSBkYS0+dmFsdWU7CisgICAgICB9CisgICAgfQorICB9CisgIGFwcEF0dHNbYXR0SW5kZXhdID0gMDsKKworICAvKiBleHBhbmQgcHJlZml4ZWQgYXR0cmlidXRlIG5hbWVzLCBjaGVjayBmb3IgZHVwbGljYXRlcywKKyAgICAgYW5kIGNsZWFyIGZsYWdzIHRoYXQgc2F5IHdoZXRoZXIgYXR0cmlidXRlcyB3ZXJlIHNwZWNpZmllZCAqLworICBpID0gMDsKKyAgaWYgKG5QcmVmaXhlcykgeworICAgIGludCBqOyAgLyogaGFzaCB0YWJsZSBpbmRleCAqLworICAgIHVuc2lnbmVkIGxvbmcgdmVyc2lvbiA9IG5zQXR0c1ZlcnNpb247CisgICAgaW50IG5zQXR0c1NpemUgPSAoaW50KTEgPDwgbnNBdHRzUG93ZXI7CisgICAgLyogc2l6ZSBvZiBoYXNoIHRhYmxlIG11c3QgYmUgYXQgbGVhc3QgMiAqICgjIG9mIHByZWZpeGVkIGF0dHJpYnV0ZXMpICovCisgICAgaWYgKChuUHJlZml4ZXMgPDwgMSkgPj4gbnNBdHRzUG93ZXIpIHsgIC8qIHRydWUgZm9yIG5zQXR0c1Bvd2VyID0gMCAqLworICAgICAgTlNfQVRUICp0ZW1wOworICAgICAgLyogaGFzaCB0YWJsZSBzaXplIG11c3QgYWxzbyBiZSBhIHBvd2VyIG9mIDIgYW5kID49IDggKi8KKyAgICAgIHdoaWxlIChuUHJlZml4ZXMgPj4gbnNBdHRzUG93ZXIrKyk7CisgICAgICBpZiAobnNBdHRzUG93ZXIgPCAzKQorICAgICAgICBuc0F0dHNQb3dlciA9IDM7CisgICAgICBuc0F0dHNTaXplID0gKGludCkxIDw8IG5zQXR0c1Bvd2VyOworICAgICAgdGVtcCA9IChOU19BVFQgKilSRUFMTE9DKG5zQXR0cywgbnNBdHRzU2l6ZSAqIHNpemVvZihOU19BVFQpKTsKKyAgICAgIGlmICghdGVtcCkKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICBuc0F0dHMgPSB0ZW1wOworICAgICAgdmVyc2lvbiA9IDA7ICAvKiBmb3JjZSByZS1pbml0aWFsaXphdGlvbiBvZiBuc0F0dHMgaGFzaCB0YWJsZSAqLworICAgIH0KKyAgICAvKiB1c2luZyBhIHZlcnNpb24gZmxhZyBzYXZlcyB1cyBmcm9tIGluaXRpYWxpemluZyBuc0F0dHMgZXZlcnkgdGltZSAqLworICAgIGlmICghdmVyc2lvbikgeyAgLyogaW5pdGlhbGl6ZSB2ZXJzaW9uIGZsYWdzIHdoZW4gdmVyc2lvbiB3cmFwcyBhcm91bmQgKi8KKyAgICAgIHZlcnNpb24gPSBJTklUX0FUVFNfVkVSU0lPTjsKKyAgICAgIGZvciAoaiA9IG5zQXR0c1NpemU7IGogIT0gMDsgKQorICAgICAgICBuc0F0dHNbLS1qXS52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICB9CisgICAgbnNBdHRzVmVyc2lvbiA9IC0tdmVyc2lvbjsKKworICAgIC8qIGV4cGFuZCBwcmVmaXhlZCBuYW1lcyBhbmQgY2hlY2sgZm9yIGR1cGxpY2F0ZXMgKi8KKyAgICBmb3IgKDsgaSA8IGF0dEluZGV4OyBpICs9IDIpIHsKKyAgICAgIGNvbnN0IFhNTF9DaGFyICpzID0gYXBwQXR0c1tpXTsKKyAgICAgIGlmIChzWy0xXSA9PSAyKSB7ICAvKiBwcmVmaXhlZCAqLworICAgICAgICBBVFRSSUJVVEVfSUQgKmlkOworICAgICAgICBjb25zdCBCSU5ESU5HICpiOworICAgICAgICB1bnNpZ25lZCBsb25nIHVyaUhhc2ggPSAwOworICAgICAgICAoKFhNTF9DaGFyICopcylbLTFdID0gMDsgIC8qIGNsZWFyIGZsYWcgKi8KKyAgICAgICAgaWQgPSAoQVRUUklCVVRFX0lEICopbG9va3VwKCZkdGQtPmF0dHJpYnV0ZUlkcywgcywgMCk7CisgICAgICAgIGIgPSBpZC0+cHJlZml4LT5iaW5kaW5nOworICAgICAgICBpZiAoIWIpCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9VTkJPVU5EX1BSRUZJWDsKKworICAgICAgICAvKiBhcyB3ZSBleHBhbmQgdGhlIG5hbWUgd2UgYWxzbyBjYWxjdWxhdGUgaXRzIGhhc2ggdmFsdWUgKi8KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGItPnVyaUxlbjsgaisrKSB7CisgICAgICAgICAgY29uc3QgWE1MX0NoYXIgYyA9IGItPnVyaVtqXTsKKyAgICAgICAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKCZ0ZW1wUG9vbCwgYykpCisgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgICB1cmlIYXNoID0gQ0hBUl9IQVNIKHVyaUhhc2gsIGMpOworICAgICAgICB9CisgICAgICAgIHdoaWxlICgqcysrICE9IFhNTF9UKEFTQ0lJX0NPTE9OKSkKKyAgICAgICAgICA7CisgICAgICAgIGRvIHsgIC8qIGNvcGllcyBudWxsIHRlcm1pbmF0b3IgKi8KKyAgICAgICAgICBjb25zdCBYTUxfQ2hhciBjID0gKnM7CisgICAgICAgICAgaWYgKCFwb29sQXBwZW5kQ2hhcigmdGVtcFBvb2wsICpzKSkKKyAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICAgIHVyaUhhc2ggPSBDSEFSX0hBU0godXJpSGFzaCwgYyk7CisgICAgICAgIH0gd2hpbGUgKCpzKyspOworCisgICAgICAgIHsgLyogQ2hlY2sgaGFzaCB0YWJsZSBmb3IgZHVwbGljYXRlIG9mIGV4cGFuZGVkIG5hbWUgKHVyaU5hbWUpLgorICAgICAgICAgICAgIERlcml2ZWQgZnJvbSBjb2RlIGluIGxvb2t1cChIQVNIX1RBQkxFICp0YWJsZSwgLi4uKS4KKyAgICAgICAgICAqLworICAgICAgICAgIHVuc2lnbmVkIGNoYXIgc3RlcCA9IDA7CisgICAgICAgICAgdW5zaWduZWQgbG9uZyBtYXNrID0gbnNBdHRzU2l6ZSAtIDE7CisgICAgICAgICAgaiA9IHVyaUhhc2ggJiBtYXNrOyAgLyogaW5kZXggaW50byBoYXNoIHRhYmxlICovCisgICAgICAgICAgd2hpbGUgKG5zQXR0c1tqXS52ZXJzaW9uID09IHZlcnNpb24pIHsKKyAgICAgICAgICAgIC8qIGZvciBzcGVlZCB3ZSBjb21wYXJlIHN0b3JlZCBoYXNoIHZhbHVlcyBmaXJzdCAqLworICAgICAgICAgICAgaWYgKHVyaUhhc2ggPT0gbnNBdHRzW2pdLmhhc2gpIHsKKyAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnMxID0gcG9vbFN0YXJ0KCZ0ZW1wUG9vbCk7CisgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzMiA9IG5zQXR0c1tqXS51cmlOYW1lOworICAgICAgICAgICAgICAvKiBzMSBpcyBudWxsIHRlcm1pbmF0ZWQsIGJ1dCBub3QgczIgKi8KKyAgICAgICAgICAgICAgZm9yICg7ICpzMSA9PSAqczIgJiYgKnMxICE9IDA7IHMxKyssIHMyKyspOworICAgICAgICAgICAgICBpZiAoKnMxID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9EVVBMSUNBVEVfQVRUUklCVVRFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzdGVwKQorICAgICAgICAgICAgICBzdGVwID0gUFJPQkVfU1RFUCh1cmlIYXNoLCBtYXNrLCBuc0F0dHNQb3dlcik7CisgICAgICAgICAgICBqIDwgc3RlcCA/IChqICs9IG5zQXR0c1NpemUgLSBzdGVwKSA6IChqIC09IHN0ZXApOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChuc190cmlwbGV0cykgeyAgLyogYXBwZW5kIG5hbWVzcGFjZSBzZXBhcmF0b3IgYW5kIHByZWZpeCAqLworICAgICAgICAgIHRlbXBQb29sLnB0clstMV0gPSBuYW1lc3BhY2VTZXBhcmF0b3I7CisgICAgICAgICAgcyA9IGItPnByZWZpeC0+bmFtZTsKKyAgICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKCZ0ZW1wUG9vbCwgKnMpKQorICAgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgICB9IHdoaWxlICgqcysrKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHN0b3JlIGV4cGFuZGVkIG5hbWUgaW4gYXR0cmlidXRlIGxpc3QgKi8KKyAgICAgICAgcyA9IHBvb2xTdGFydCgmdGVtcFBvb2wpOworICAgICAgICBwb29sRmluaXNoKCZ0ZW1wUG9vbCk7CisgICAgICAgIGFwcEF0dHNbaV0gPSBzOworCisgICAgICAgIC8qIGZpbGwgZW1wdHkgc2xvdCB3aXRoIG5ldyB2ZXJzaW9uLCB1cmlOYW1lIGFuZCBoYXNoIHZhbHVlICovCisgICAgICAgIG5zQXR0c1tqXS52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgICAgbnNBdHRzW2pdLmhhc2ggPSB1cmlIYXNoOworICAgICAgICBuc0F0dHNbal0udXJpTmFtZSA9IHM7CisKKyAgICAgICAgaWYgKCEtLW5QcmVmaXhlcykgeworICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSAgLyogbm90IHByZWZpeGVkICovCisgICAgICAgICgoWE1MX0NoYXIgKilzKVstMV0gPSAwOyAgLyogY2xlYXIgZmxhZyAqLworICAgIH0KKyAgfQorICAvKiBjbGVhciBmbGFncyBmb3IgdGhlIHJlbWFpbmluZyBhdHRyaWJ1dGVzICovCisgIGZvciAoOyBpIDwgYXR0SW5kZXg7IGkgKz0gMikKKyAgICAoKFhNTF9DaGFyICopKGFwcEF0dHNbaV0pKVstMV0gPSAwOworICBmb3IgKGJpbmRpbmcgPSAqYmluZGluZ3NQdHI7IGJpbmRpbmc7IGJpbmRpbmcgPSBiaW5kaW5nLT5uZXh0VGFnQmluZGluZykKKyAgICBiaW5kaW5nLT5hdHRJZC0+bmFtZVstMV0gPSAwOworCisgIGlmICghbnMpCisgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworCisgIC8qIGV4cGFuZCB0aGUgZWxlbWVudCB0eXBlIG5hbWUgKi8KKyAgaWYgKGVsZW1lbnRUeXBlLT5wcmVmaXgpIHsKKyAgICBiaW5kaW5nID0gZWxlbWVudFR5cGUtPnByZWZpeC0+YmluZGluZzsKKyAgICBpZiAoIWJpbmRpbmcpCisgICAgICByZXR1cm4gWE1MX0VSUk9SX1VOQk9VTkRfUFJFRklYOworICAgIGxvY2FsUGFydCA9IHRhZ05hbWVQdHItPnN0cjsKKyAgICB3aGlsZSAoKmxvY2FsUGFydCsrICE9IFhNTF9UKEFTQ0lJX0NPTE9OKSkKKyAgICAgIDsKKyAgfQorICBlbHNlIGlmIChkdGQtPmRlZmF1bHRQcmVmaXguYmluZGluZykgeworICAgIGJpbmRpbmcgPSBkdGQtPmRlZmF1bHRQcmVmaXguYmluZGluZzsKKyAgICBsb2NhbFBhcnQgPSB0YWdOYW1lUHRyLT5zdHI7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgcHJlZml4TGVuID0gMDsKKyAgaWYgKG5zX3RyaXBsZXRzICYmIGJpbmRpbmctPnByZWZpeC0+bmFtZSkgeworICAgIGZvciAoOyBiaW5kaW5nLT5wcmVmaXgtPm5hbWVbcHJlZml4TGVuKytdOykKKyAgICAgIDsgIC8qIHByZWZpeExlbiBpbmNsdWRlcyBudWxsIHRlcm1pbmF0b3IgKi8KKyAgfQorICB0YWdOYW1lUHRyLT5sb2NhbFBhcnQgPSBsb2NhbFBhcnQ7CisgIHRhZ05hbWVQdHItPnVyaUxlbiA9IGJpbmRpbmctPnVyaUxlbjsKKyAgdGFnTmFtZVB0ci0+cHJlZml4ID0gYmluZGluZy0+cHJlZml4LT5uYW1lOworICB0YWdOYW1lUHRyLT5wcmVmaXhMZW4gPSBwcmVmaXhMZW47CisgIGZvciAoaSA9IDA7IGxvY2FsUGFydFtpKytdOykKKyAgICA7ICAvKiBpIGluY2x1ZGVzIG51bGwgdGVybWluYXRvciAqLworICBuID0gaSArIGJpbmRpbmctPnVyaUxlbiArIHByZWZpeExlbjsKKyAgaWYgKG4gPiBiaW5kaW5nLT51cmlBbGxvYykgeworICAgIFRBRyAqcDsKKyAgICB1cmkgPSAoWE1MX0NoYXIgKilNQUxMT0MoKG4gKyBFWFBBTkRfU1BBUkUpICogc2l6ZW9mKFhNTF9DaGFyKSk7CisgICAgaWYgKCF1cmkpCisgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICBiaW5kaW5nLT51cmlBbGxvYyA9IG4gKyBFWFBBTkRfU1BBUkU7CisgICAgbWVtY3B5KHVyaSwgYmluZGluZy0+dXJpLCBiaW5kaW5nLT51cmlMZW4gKiBzaXplb2YoWE1MX0NoYXIpKTsKKyAgICBmb3IgKHAgPSB0YWdTdGFjazsgcDsgcCA9IHAtPnBhcmVudCkKKyAgICAgIGlmIChwLT5uYW1lLnN0ciA9PSBiaW5kaW5nLT51cmkpCisgICAgICAgIHAtPm5hbWUuc3RyID0gdXJpOworICAgIEZSRUUoYmluZGluZy0+dXJpKTsKKyAgICBiaW5kaW5nLT51cmkgPSB1cmk7CisgIH0KKyAgLyogaWYgbmFtZXNwYWNlU2VwYXJhdG9yICE9ICdcMCcgdGhlbiB1cmkgaW5jbHVkZXMgaXQgYWxyZWFkeSAqLworICB1cmkgPSBiaW5kaW5nLT51cmkgKyBiaW5kaW5nLT51cmlMZW47CisgIG1lbWNweSh1cmksIGxvY2FsUGFydCwgaSAqIHNpemVvZihYTUxfQ2hhcikpOworICAvKiB3ZSBhbHdheXMgaGF2ZSBhIG5hbWVzcGFjZSBzZXBhcmF0b3IgYmV0d2VlbiBsb2NhbFBhcnQgYW5kIHByZWZpeCAqLworICBpZiAocHJlZml4TGVuKSB7CisgICAgdXJpICs9IGkgLSAxOworICAgICp1cmkgPSBuYW1lc3BhY2VTZXBhcmF0b3I7ICAvKiByZXBsYWNlIG51bGwgdGVybWluYXRvciAqLworICAgIG1lbWNweSh1cmkgKyAxLCBiaW5kaW5nLT5wcmVmaXgtPm5hbWUsIHByZWZpeExlbiAqIHNpemVvZihYTUxfQ2hhcikpOworICB9CisgIHRhZ05hbWVQdHItPnN0ciA9IGJpbmRpbmctPnVyaTsKKyAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworfQorCisvKiBhZGRCaW5kaW5nKCkgb3ZlcndyaXRlcyB0aGUgdmFsdWUgb2YgcHJlZml4LT5iaW5kaW5nIHdpdGhvdXQgY2hlY2tpbmcuCisgICBUaGVyZWZvcmUgb25lIG11c3Qga2VlcCB0cmFjayBvZiB0aGUgb2xkIHZhbHVlIG91dHNpZGUgb2YgYWRkQmluZGluZygpLgorKi8KK3N0YXRpYyBlbnVtIFhNTF9FcnJvcgorYWRkQmluZGluZyhYTUxfUGFyc2VyIHBhcnNlciwgUFJFRklYICpwcmVmaXgsIGNvbnN0IEFUVFJJQlVURV9JRCAqYXR0SWQsCisgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICp1cmksIEJJTkRJTkcgKipiaW5kaW5nc1B0cikKK3sKKyAgc3RhdGljIGNvbnN0IFhNTF9DaGFyIHhtbE5hbWVzcGFjZVtdID0geworICAgIEFTQ0lJX2gsIEFTQ0lJX3QsIEFTQ0lJX3QsIEFTQ0lJX3AsIEFTQ0lJX0NPTE9OLCBBU0NJSV9TTEFTSCwgQVNDSUlfU0xBU0gsCisgICAgQVNDSUlfdywgQVNDSUlfdywgQVNDSUlfdywgQVNDSUlfUEVSSU9ELCBBU0NJSV93LCBBU0NJSV8zLCBBU0NJSV9QRVJJT0QsCisgICAgQVNDSUlfbywgQVNDSUlfciwgQVNDSUlfZywgQVNDSUlfU0xBU0gsIEFTQ0lJX1gsIEFTQ0lJX00sIEFTQ0lJX0wsIAorICAgIEFTQ0lJX1NMQVNILCBBU0NJSV8xLCBBU0NJSV85LCBBU0NJSV85LCBBU0NJSV84LCBBU0NJSV9TTEFTSCwKKyAgICBBU0NJSV9uLCBBU0NJSV9hLCBBU0NJSV9tLCBBU0NJSV9lLCBBU0NJSV9zLCBBU0NJSV9wLCBBU0NJSV9hLCBBU0NJSV9jLAorICAgIEFTQ0lJX2UsICdcMCcKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGludCB4bWxMZW4gPSAKKyAgICAoaW50KXNpemVvZih4bWxOYW1lc3BhY2UpL3NpemVvZihYTUxfQ2hhcikgLSAxOworICBzdGF0aWMgY29uc3QgWE1MX0NoYXIgeG1sbnNOYW1lc3BhY2VbXSA9IHsKKyAgICBBU0NJSV9oLCBBU0NJSV90LCBBU0NJSV90LCBBU0NJSV9wLCBBU0NJSV9DT0xPTiwgQVNDSUlfU0xBU0gsIEFTQ0lJX1NMQVNILAorICAgIEFTQ0lJX3csIEFTQ0lJX3csIEFTQ0lJX3csIEFTQ0lJX1BFUklPRCwgQVNDSUlfdywgQVNDSUlfMywgQVNDSUlfUEVSSU9ELAorICAgIEFTQ0lJX28sIEFTQ0lJX3IsIEFTQ0lJX2csIEFTQ0lJX1NMQVNILCBBU0NJSV8yLCBBU0NJSV8wLCBBU0NJSV8wLCAKKyAgICBBU0NJSV8wLCBBU0NJSV9TTEFTSCwgQVNDSUlfeCwgQVNDSUlfbSwgQVNDSUlfbCwgQVNDSUlfbiwgQVNDSUlfcywgCisgICAgQVNDSUlfU0xBU0gsICdcMCcKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGludCB4bWxuc0xlbiA9IAorICAgIChpbnQpc2l6ZW9mKHhtbG5zTmFtZXNwYWNlKS9zaXplb2YoWE1MX0NoYXIpIC0gMTsKKworICBYTUxfQm9vbCBtdXN0QmVYTUwgPSBYTUxfRkFMU0U7CisgIFhNTF9Cb29sIGlzWE1MID0gWE1MX1RSVUU7CisgIFhNTF9Cb29sIGlzWE1MTlMgPSBYTUxfVFJVRTsKKyAgCisgIEJJTkRJTkcgKmI7CisgIGludCBsZW47CisKKyAgLyogZW1wdHkgVVJJIGlzIG9ubHkgdmFsaWQgZm9yIGRlZmF1bHQgbmFtZXNwYWNlIHBlciBYTUwgTlMgMS4wIChub3QgMS4xKSAqLworICBpZiAoKnVyaSA9PSBYTUxfVCgnXDAnKSAmJiBwcmVmaXgtPm5hbWUpCisgICAgcmV0dXJuIFhNTF9FUlJPUl9VTkRFQ0xBUklOR19QUkVGSVg7CisKKyAgaWYgKHByZWZpeC0+bmFtZQorICAgICAgJiYgcHJlZml4LT5uYW1lWzBdID09IFhNTF9UKEFTQ0lJX3gpCisgICAgICAmJiBwcmVmaXgtPm5hbWVbMV0gPT0gWE1MX1QoQVNDSUlfbSkKKyAgICAgICYmIHByZWZpeC0+bmFtZVsyXSA9PSBYTUxfVChBU0NJSV9sKSkgeworCisgICAgLyogTm90IGFsbG93ZWQgdG8gYmluZCB4bWxucyAqLworICAgIGlmIChwcmVmaXgtPm5hbWVbM10gPT0gWE1MX1QoQVNDSUlfbikKKyAgICAgICAgJiYgcHJlZml4LT5uYW1lWzRdID09IFhNTF9UKEFTQ0lJX3MpCisgICAgICAgICYmIHByZWZpeC0+bmFtZVs1XSA9PSBYTUxfVCgnXDAnKSkKKyAgICAgIHJldHVybiBYTUxfRVJST1JfUkVTRVJWRURfUFJFRklYX1hNTE5TOworCisgICAgaWYgKHByZWZpeC0+bmFtZVszXSA9PSBYTUxfVCgnXDAnKSkKKyAgICAgIG11c3RCZVhNTCA9IFhNTF9UUlVFOworICB9CisKKyAgZm9yIChsZW4gPSAwOyB1cmlbbGVuXTsgbGVuKyspIHsKKyAgICBpZiAoaXNYTUwgJiYgKGxlbiA+IHhtbExlbiB8fCB1cmlbbGVuXSAhPSB4bWxOYW1lc3BhY2VbbGVuXSkpCisgICAgICBpc1hNTCA9IFhNTF9GQUxTRTsKKworICAgIGlmICghbXVzdEJlWE1MICYmIGlzWE1MTlMgCisgICAgICAgICYmIChsZW4gPiB4bWxuc0xlbiB8fCB1cmlbbGVuXSAhPSB4bWxuc05hbWVzcGFjZVtsZW5dKSkKKyAgICAgIGlzWE1MTlMgPSBYTUxfRkFMU0U7CisgIH0KKyAgaXNYTUwgPSBpc1hNTCAmJiBsZW4gPT0geG1sTGVuOworICBpc1hNTE5TID0gaXNYTUxOUyAmJiBsZW4gPT0geG1sbnNMZW47CisKKyAgaWYgKG11c3RCZVhNTCAhPSBpc1hNTCkKKyAgICByZXR1cm4gbXVzdEJlWE1MID8gWE1MX0VSUk9SX1JFU0VSVkVEX1BSRUZJWF9YTUwKKyAgICAgICAgICAgICAgICAgICAgIDogWE1MX0VSUk9SX1JFU0VSVkVEX05BTUVTUEFDRV9VUkk7CisKKyAgaWYgKGlzWE1MTlMpCisgICAgcmV0dXJuIFhNTF9FUlJPUl9SRVNFUlZFRF9OQU1FU1BBQ0VfVVJJOworCisgIGlmIChuYW1lc3BhY2VTZXBhcmF0b3IpCisgICAgbGVuKys7CisgIGlmIChmcmVlQmluZGluZ0xpc3QpIHsKKyAgICBiID0gZnJlZUJpbmRpbmdMaXN0OworICAgIGlmIChsZW4gPiBiLT51cmlBbGxvYykgeworICAgICAgWE1MX0NoYXIgKnRlbXAgPSAoWE1MX0NoYXIgKilSRUFMTE9DKGItPnVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFhNTF9DaGFyKSAqIChsZW4gKyBFWFBBTkRfU1BBUkUpKTsKKyAgICAgIGlmICh0ZW1wID09IE5VTEwpCisgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgYi0+dXJpID0gdGVtcDsKKyAgICAgIGItPnVyaUFsbG9jID0gbGVuICsgRVhQQU5EX1NQQVJFOworICAgIH0KKyAgICBmcmVlQmluZGluZ0xpc3QgPSBiLT5uZXh0VGFnQmluZGluZzsKKyAgfQorICBlbHNlIHsKKyAgICBiID0gKEJJTkRJTkcgKilNQUxMT0Moc2l6ZW9mKEJJTkRJTkcpKTsKKyAgICBpZiAoIWIpCisgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICBiLT51cmkgPSAoWE1MX0NoYXIgKilNQUxMT0Moc2l6ZW9mKFhNTF9DaGFyKSAqIChsZW4gKyBFWFBBTkRfU1BBUkUpKTsKKyAgICBpZiAoIWItPnVyaSkgeworICAgICAgRlJFRShiKTsKKyAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgIH0KKyAgICBiLT51cmlBbGxvYyA9IGxlbiArIEVYUEFORF9TUEFSRTsKKyAgfQorICBiLT51cmlMZW4gPSBsZW47CisgIG1lbWNweShiLT51cmksIHVyaSwgbGVuICogc2l6ZW9mKFhNTF9DaGFyKSk7CisgIGlmIChuYW1lc3BhY2VTZXBhcmF0b3IpCisgICAgYi0+dXJpW2xlbiAtIDFdID0gbmFtZXNwYWNlU2VwYXJhdG9yOworICBiLT5wcmVmaXggPSBwcmVmaXg7CisgIGItPmF0dElkID0gYXR0SWQ7CisgIGItPnByZXZQcmVmaXhCaW5kaW5nID0gcHJlZml4LT5iaW5kaW5nOworICAvKiBOVUxMIGJpbmRpbmcgd2hlbiBkZWZhdWx0IG5hbWVzcGFjZSB1bmRlY2xhcmVkICovCisgIGlmICgqdXJpID09IFhNTF9UKCdcMCcpICYmIHByZWZpeCA9PSAmX2R0ZC0+ZGVmYXVsdFByZWZpeCkKKyAgICBwcmVmaXgtPmJpbmRpbmcgPSBOVUxMOworICBlbHNlCisgICAgcHJlZml4LT5iaW5kaW5nID0gYjsKKyAgYi0+bmV4dFRhZ0JpbmRpbmcgPSAqYmluZGluZ3NQdHI7CisgICpiaW5kaW5nc1B0ciA9IGI7CisgIC8qIGlmIGF0dElkID09IE5VTEwgdGhlbiB3ZSBhcmUgbm90IHN0YXJ0aW5nIGEgbmFtZXNwYWNlIHNjb3BlICovCisgIGlmIChhdHRJZCAmJiBzdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyKQorICAgIHN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIoaGFuZGxlckFyZywgcHJlZml4LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LT5iaW5kaW5nID8gdXJpIDogMCk7CisgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKK30KKworLyogVGhlIGlkZWEgaGVyZSBpcyB0byBhdm9pZCB1c2luZyBzdGFjayBmb3IgZWFjaCBDREFUQSBzZWN0aW9uIHdoZW4KKyAgIHRoZSB3aG9sZSBmaWxlIGlzIHBhcnNlZCB3aXRoIG9uZSBjYWxsLgorKi8KK3N0YXRpYyBlbnVtIFhNTF9FcnJvciBQVFJDQUxMCitjZGF0YVNlY3Rpb25Qcm9jZXNzb3IoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiplbmRQdHIpCit7CisgIGVudW0gWE1MX0Vycm9yIHJlc3VsdCA9IGRvQ2RhdGFTZWN0aW9uKHBhcnNlciwgZW5jb2RpbmcsICZzdGFydCwgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRQdHIsIChYTUxfQm9vbCkhcHNfZmluYWxCdWZmZXIpOworICBpZiAocmVzdWx0ICE9IFhNTF9FUlJPUl9OT05FKQorICAgIHJldHVybiByZXN1bHQ7CisgIGlmIChzdGFydCkgeworICAgIGlmIChwYXJlbnRQYXJzZXIpIHsgIC8qIHdlIGFyZSBwYXJzaW5nIGFuIGV4dGVybmFsIGVudGl0eSAqLworICAgICAgcHJvY2Vzc29yID0gZXh0ZXJuYWxFbnRpdHlDb250ZW50UHJvY2Vzc29yOworICAgICAgcmV0dXJuIGV4dGVybmFsRW50aXR5Q29udGVudFByb2Nlc3NvcihwYXJzZXIsIHN0YXJ0LCBlbmQsIGVuZFB0cik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgcHJvY2Vzc29yID0gY29udGVudFByb2Nlc3NvcjsKKyAgICAgIHJldHVybiBjb250ZW50UHJvY2Vzc29yKHBhcnNlciwgc3RhcnQsIGVuZCwgZW5kUHRyKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogc3RhcnRQdHIgZ2V0cyBzZXQgdG8gbm9uLW51bGwgaWYgdGhlIHNlY3Rpb24gaXMgY2xvc2VkLCBhbmQgdG8gbnVsbCBpZgorICAgdGhlIHNlY3Rpb24gaXMgbm90IHlldCBjbG9zZWQuCisqLworc3RhdGljIGVudW0gWE1MX0Vycm9yCitkb0NkYXRhU2VjdGlvbihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqc3RhcnRQdHIsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbmV4dFB0ciwKKyAgICAgICAgICAgICAgIFhNTF9Cb29sIGhhdmVNb3JlKQoreworICBjb25zdCBjaGFyICpzID0gKnN0YXJ0UHRyOworICBjb25zdCBjaGFyICoqZXZlbnRQUDsKKyAgY29uc3QgY2hhciAqKmV2ZW50RW5kUFA7CisgIGlmIChlbmMgPT0gZW5jb2RpbmcpIHsKKyAgICBldmVudFBQID0gJmV2ZW50UHRyOworICAgICpldmVudFBQID0gczsKKyAgICBldmVudEVuZFBQID0gJmV2ZW50RW5kUHRyOworICB9CisgIGVsc2UgeworICAgIGV2ZW50UFAgPSAmKG9wZW5JbnRlcm5hbEVudGl0aWVzLT5pbnRlcm5hbEV2ZW50UHRyKTsKKyAgICBldmVudEVuZFBQID0gJihvcGVuSW50ZXJuYWxFbnRpdGllcy0+aW50ZXJuYWxFdmVudEVuZFB0cik7CisgIH0KKyAgKmV2ZW50UFAgPSBzOworICAqc3RhcnRQdHIgPSBOVUxMOworCisgIGZvciAoOzspIHsKKyAgICBjb25zdCBjaGFyICpuZXh0OworICAgIGludCB0b2sgPSBYbWxDZGF0YVNlY3Rpb25Ub2soZW5jLCBzLCBlbmQsICZuZXh0KTsKKyAgICAqZXZlbnRFbmRQUCA9IG5leHQ7CisgICAgc3dpdGNoICh0b2spIHsKKyAgICBjYXNlIFhNTF9UT0tfQ0RBVEFfU0VDVF9DTE9TRToKKyAgICAgIGlmIChlbmRDZGF0YVNlY3Rpb25IYW5kbGVyKQorICAgICAgICBlbmRDZGF0YVNlY3Rpb25IYW5kbGVyKGhhbmRsZXJBcmcpOworI2lmIDAKKyAgICAgIC8qIHNlZSBjb21tZW50IHVuZGVyIFhNTF9UT0tfQ0RBVEFfU0VDVF9PUEVOICovCisgICAgICBlbHNlIGlmIChjaGFyYWN0ZXJEYXRhSGFuZGxlcikKKyAgICAgICAgY2hhcmFjdGVyRGF0YUhhbmRsZXIoaGFuZGxlckFyZywgZGF0YUJ1ZiwgMCk7CisjZW5kaWYKKyAgICAgIGVsc2UgaWYgKGRlZmF1bHRIYW5kbGVyKQorICAgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKKyAgICAgICpzdGFydFB0ciA9IG5leHQ7CisgICAgICAqbmV4dFB0ciA9IG5leHQ7CisgICAgICBpZiAocHNfcGFyc2luZyA9PSBYTUxfRklOSVNIRUQpCisgICAgICAgIHJldHVybiBYTUxfRVJST1JfQUJPUlRFRDsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgIGNhc2UgWE1MX1RPS19EQVRBX05FV0xJTkU6CisgICAgICBpZiAoY2hhcmFjdGVyRGF0YUhhbmRsZXIpIHsKKyAgICAgICAgWE1MX0NoYXIgYyA9IDB4QTsKKyAgICAgICAgY2hhcmFjdGVyRGF0YUhhbmRsZXIoaGFuZGxlckFyZywgJmMsIDEpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoZGVmYXVsdEhhbmRsZXIpCisgICAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHMsIG5leHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYTUxfVE9LX0RBVEFfQ0hBUlM6CisgICAgICB7CisgICAgICAgIFhNTF9DaGFyYWN0ZXJEYXRhSGFuZGxlciBjaGFyRGF0YUhhbmRsZXIgPSBjaGFyYWN0ZXJEYXRhSGFuZGxlcjsKKyAgICAgICAgaWYgKGNoYXJEYXRhSGFuZGxlcikgeworICAgICAgICAgIGlmIChNVVNUX0NPTlZFUlQoZW5jLCBzKSkgeworICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICBJQ0hBUiAqZGF0YVB0ciA9IChJQ0hBUiAqKWRhdGFCdWY7CisgICAgICAgICAgICAgIFhtbENvbnZlcnQoZW5jLCAmcywgbmV4dCwgJmRhdGFQdHIsIChJQ0hBUiAqKWRhdGFCdWZFbmQpOworICAgICAgICAgICAgICAqZXZlbnRFbmRQUCA9IG5leHQ7CisgICAgICAgICAgICAgIGNoYXJEYXRhSGFuZGxlcihoYW5kbGVyQXJnLCBkYXRhQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoZGF0YVB0ciAtIChJQ0hBUiAqKWRhdGFCdWYpKTsKKyAgICAgICAgICAgICAgaWYgKHMgPT0gbmV4dCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgKmV2ZW50UFAgPSBzOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBjaGFyRGF0YUhhbmRsZXIoaGFuZGxlckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWE1MX0NoYXIgKilzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKChYTUxfQ2hhciAqKW5leHQgLSAoWE1MX0NoYXIgKilzKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZGVmYXVsdEhhbmRsZXIpCisgICAgICAgICAgcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuYywgcywgbmV4dCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFhNTF9UT0tfSU5WQUxJRDoKKyAgICAgICpldmVudFBQID0gbmV4dDsKKyAgICAgIHJldHVybiBYTUxfRVJST1JfSU5WQUxJRF9UT0tFTjsKKyAgICBjYXNlIFhNTF9UT0tfUEFSVElBTF9DSEFSOgorICAgICAgaWYgKGhhdmVNb3JlKSB7CisgICAgICAgICpuZXh0UHRyID0gczsKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgICAgfQorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9QQVJUSUFMX0NIQVI7CisgICAgY2FzZSBYTUxfVE9LX1BBUlRJQUw6CisgICAgY2FzZSBYTUxfVE9LX05PTkU6CisgICAgICBpZiAoaGF2ZU1vcmUpIHsKKyAgICAgICAgKm5leHRQdHIgPSBzOworICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CisgICAgICB9CisgICAgICByZXR1cm4gWE1MX0VSUk9SX1VOQ0xPU0VEX0NEQVRBX1NFQ1RJT047CisgICAgZGVmYXVsdDoKKyAgICAgICpldmVudFBQID0gbmV4dDsKKyAgICAgIHJldHVybiBYTUxfRVJST1JfVU5FWFBFQ1RFRF9TVEFURTsKKyAgICB9CisKKyAgICAqZXZlbnRQUCA9IHMgPSBuZXh0OworICAgIHN3aXRjaCAocHNfcGFyc2luZykgeworICAgIGNhc2UgWE1MX1NVU1BFTkRFRDoKKyAgICAgICpuZXh0UHRyID0gbmV4dDsKKyAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICBjYXNlIFhNTF9GSU5JU0hFRDoKKyAgICAgIHJldHVybiBYTUxfRVJST1JfQUJPUlRFRDsKKyAgICBkZWZhdWx0OiA7CisgICAgfQorICB9CisgIC8qIG5vdCByZWFjaGVkICovCit9CisKKyNpZmRlZiBYTUxfRFRECisKKy8qIFRoZSBpZGVhIGhlcmUgaXMgdG8gYXZvaWQgdXNpbmcgc3RhY2sgZm9yIGVhY2ggSUdOT1JFIHNlY3Rpb24gd2hlbgorICAgdGhlIHdob2xlIGZpbGUgaXMgcGFyc2VkIHdpdGggb25lIGNhbGwuCisqLworc3RhdGljIGVudW0gWE1MX0Vycm9yIFBUUkNBTEwKK2lnbm9yZVNlY3Rpb25Qcm9jZXNzb3IoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiplbmRQdHIpCit7CisgIGVudW0gWE1MX0Vycm9yIHJlc3VsdCA9IGRvSWdub3JlU2VjdGlvbihwYXJzZXIsIGVuY29kaW5nLCAmc3RhcnQsIGVuZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRQdHIsIChYTUxfQm9vbCkhcHNfZmluYWxCdWZmZXIpOworICBpZiAocmVzdWx0ICE9IFhNTF9FUlJPUl9OT05FKQorICAgIHJldHVybiByZXN1bHQ7CisgIGlmIChzdGFydCkgeworICAgIHByb2Nlc3NvciA9IHByb2xvZ1Byb2Nlc3NvcjsKKyAgICByZXR1cm4gcHJvbG9nUHJvY2Vzc29yKHBhcnNlciwgc3RhcnQsIGVuZCwgZW5kUHRyKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKiBzdGFydFB0ciBnZXRzIHNldCB0byBub24tbnVsbCBpcyB0aGUgc2VjdGlvbiBpcyBjbG9zZWQsIGFuZCB0byBudWxsCisgICBpZiB0aGUgc2VjdGlvbiBpcyBub3QgeWV0IGNsb3NlZC4KKyovCitzdGF0aWMgZW51bSBYTUxfRXJyb3IKK2RvSWdub3JlU2VjdGlvbihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipzdGFydFB0ciwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKm5leHRQdHIsCisgICAgICAgICAgICAgICAgWE1MX0Jvb2wgaGF2ZU1vcmUpCit7CisgIGNvbnN0IGNoYXIgKm5leHQ7CisgIGludCB0b2s7CisgIGNvbnN0IGNoYXIgKnMgPSAqc3RhcnRQdHI7CisgIGNvbnN0IGNoYXIgKipldmVudFBQOworICBjb25zdCBjaGFyICoqZXZlbnRFbmRQUDsKKyAgaWYgKGVuYyA9PSBlbmNvZGluZykgeworICAgIGV2ZW50UFAgPSAmZXZlbnRQdHI7CisgICAgKmV2ZW50UFAgPSBzOworICAgIGV2ZW50RW5kUFAgPSAmZXZlbnRFbmRQdHI7CisgIH0KKyAgZWxzZSB7CisgICAgZXZlbnRQUCA9ICYob3BlbkludGVybmFsRW50aXRpZXMtPmludGVybmFsRXZlbnRQdHIpOworICAgIGV2ZW50RW5kUFAgPSAmKG9wZW5JbnRlcm5hbEVudGl0aWVzLT5pbnRlcm5hbEV2ZW50RW5kUHRyKTsKKyAgfQorICAqZXZlbnRQUCA9IHM7CisgICpzdGFydFB0ciA9IE5VTEw7CisgIHRvayA9IFhtbElnbm9yZVNlY3Rpb25Ub2soZW5jLCBzLCBlbmQsICZuZXh0KTsKKyAgKmV2ZW50RW5kUFAgPSBuZXh0OworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfSUdOT1JFX1NFQ1Q6CisgICAgaWYgKGRlZmF1bHRIYW5kbGVyKQorICAgICAgcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuYywgcywgbmV4dCk7CisgICAgKnN0YXJ0UHRyID0gbmV4dDsKKyAgICAqbmV4dFB0ciA9IG5leHQ7CisgICAgaWYgKHBzX3BhcnNpbmcgPT0gWE1MX0ZJTklTSEVEKQorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9BQk9SVEVEOworICAgIGVsc2UKKyAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX0lOVkFMSUQ6CisgICAgKmV2ZW50UFAgPSBuZXh0OworICAgIHJldHVybiBYTUxfRVJST1JfSU5WQUxJRF9UT0tFTjsKKyAgY2FzZSBYTUxfVE9LX1BBUlRJQUxfQ0hBUjoKKyAgICBpZiAoaGF2ZU1vcmUpIHsKKyAgICAgICpuZXh0UHRyID0gczsKKyAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICB9CisgICAgcmV0dXJuIFhNTF9FUlJPUl9QQVJUSUFMX0NIQVI7CisgIGNhc2UgWE1MX1RPS19QQVJUSUFMOgorICBjYXNlIFhNTF9UT0tfTk9ORToKKyAgICBpZiAoaGF2ZU1vcmUpIHsKKyAgICAgICpuZXh0UHRyID0gczsKKyAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICB9CisgICAgcmV0dXJuIFhNTF9FUlJPUl9TWU5UQVg7IC8qIFhNTF9FUlJPUl9VTkNMT1NFRF9JR05PUkVfU0VDVElPTiAqLworICBkZWZhdWx0OgorICAgICpldmVudFBQID0gbmV4dDsKKyAgICByZXR1cm4gWE1MX0VSUk9SX1VORVhQRUNURURfU1RBVEU7CisgIH0KKyAgLyogbm90IHJlYWNoZWQgKi8KK30KKworI2VuZGlmIC8qIFhNTF9EVEQgKi8KKworc3RhdGljIGVudW0gWE1MX0Vycm9yCitpbml0aWFsaXplRW5jb2RpbmcoWE1MX1BhcnNlciBwYXJzZXIpCit7CisgIGNvbnN0IGNoYXIgKnM7CisjaWZkZWYgWE1MX1VOSUNPREUKKyAgY2hhciBlbmNvZGluZ0J1ZlsxMjhdOworICBpZiAoIXByb3RvY29sRW5jb2RpbmdOYW1lKQorICAgIHMgPSBOVUxMOworICBlbHNlIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBwcm90b2NvbEVuY29kaW5nTmFtZVtpXTsgaSsrKSB7CisgICAgICBpZiAoaSA9PSBzaXplb2YoZW5jb2RpbmdCdWYpIC0gMQorICAgICAgICAgIHx8IChwcm90b2NvbEVuY29kaW5nTmFtZVtpXSAmIH4weDdmKSAhPSAwKSB7CisgICAgICAgIGVuY29kaW5nQnVmWzBdID0gJ1wwJzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlbmNvZGluZ0J1ZltpXSA9IChjaGFyKXByb3RvY29sRW5jb2RpbmdOYW1lW2ldOworICAgIH0KKyAgICBlbmNvZGluZ0J1ZltpXSA9ICdcMCc7CisgICAgcyA9IGVuY29kaW5nQnVmOworICB9CisjZWxzZQorICBzID0gcHJvdG9jb2xFbmNvZGluZ05hbWU7CisjZW5kaWYKKyAgaWYgKChucyA/IFhtbEluaXRFbmNvZGluZ05TIDogWG1sSW5pdEVuY29kaW5nKSgmaW5pdEVuY29kaW5nLCAmZW5jb2RpbmcsIHMpKQorICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgcmV0dXJuIGhhbmRsZVVua25vd25FbmNvZGluZyhwYXJzZXIsIHByb3RvY29sRW5jb2RpbmdOYW1lKTsKK30KKworc3RhdGljIGVudW0gWE1MX0Vycm9yCitwcm9jZXNzWG1sRGVjbChYTUxfUGFyc2VyIHBhcnNlciwgaW50IGlzR2VuZXJhbFRleHRFbnRpdHksCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICpuZXh0KQoreworICBjb25zdCBjaGFyICplbmNvZGluZ05hbWUgPSBOVUxMOworICBjb25zdCBYTUxfQ2hhciAqc3RvcmVkRW5jTmFtZSA9IE5VTEw7CisgIGNvbnN0IEVOQ09ESU5HICpuZXdFbmNvZGluZyA9IE5VTEw7CisgIGNvbnN0IGNoYXIgKnZlcnNpb24gPSBOVUxMOworICBjb25zdCBjaGFyICp2ZXJzaW9uZW5kOworICBjb25zdCBYTUxfQ2hhciAqc3RvcmVkdmVyc2lvbiA9IE5VTEw7CisgIGludCBzdGFuZGFsb25lID0gLTE7CisgIGlmICghKG5zCisgICAgICAgID8gWG1sUGFyc2VYbWxEZWNsTlMKKyAgICAgICAgOiBYbWxQYXJzZVhtbERlY2wpKGlzR2VuZXJhbFRleHRFbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmVyc2lvbmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3RW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhbmRhbG9uZSkpIHsKKyAgICBpZiAoaXNHZW5lcmFsVGV4dEVudGl0eSkKKyAgICAgIHJldHVybiBYTUxfRVJST1JfVEVYVF9ERUNMOworICAgIGVsc2UKKyAgICAgIHJldHVybiBYTUxfRVJST1JfWE1MX0RFQ0w7CisgIH0KKyAgaWYgKCFpc0dlbmVyYWxUZXh0RW50aXR5ICYmIHN0YW5kYWxvbmUgPT0gMSkgeworICAgIF9kdGQtPnN0YW5kYWxvbmUgPSBYTUxfVFJVRTsKKyNpZmRlZiBYTUxfRFRECisgICAgaWYgKHBhcmFtRW50aXR5UGFyc2luZyA9PSBYTUxfUEFSQU1fRU5USVRZX1BBUlNJTkdfVU5MRVNTX1NUQU5EQUxPTkUpCisgICAgICBwYXJhbUVudGl0eVBhcnNpbmcgPSBYTUxfUEFSQU1fRU5USVRZX1BBUlNJTkdfTkVWRVI7CisjZW5kaWYgLyogWE1MX0RURCAqLworICB9CisgIGlmICh4bWxEZWNsSGFuZGxlcikgeworICAgIGlmIChlbmNvZGluZ05hbWUgIT0gTlVMTCkgeworICAgICAgc3RvcmVkRW5jTmFtZSA9IHBvb2xTdG9yZVN0cmluZygmdGVtcDJQb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ05hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBYbWxOYW1lTGVuZ3RoKGVuY29kaW5nLCBlbmNvZGluZ05hbWUpKTsKKyAgICAgIGlmICghc3RvcmVkRW5jTmFtZSkKKyAgICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICBwb29sRmluaXNoKCZ0ZW1wMlBvb2wpOworICAgIH0KKyAgICBpZiAodmVyc2lvbikgeworICAgICAgc3RvcmVkdmVyc2lvbiA9IHBvb2xTdG9yZVN0cmluZygmdGVtcDJQb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbmVuZCAtIGVuY29kaW5nLT5taW5CeXRlc1BlckNoYXIpOworICAgICAgaWYgKCFzdG9yZWR2ZXJzaW9uKQorICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICB9CisgICAgeG1sRGVjbEhhbmRsZXIoaGFuZGxlckFyZywgc3RvcmVkdmVyc2lvbiwgc3RvcmVkRW5jTmFtZSwgc3RhbmRhbG9uZSk7CisgIH0KKyAgZWxzZSBpZiAoZGVmYXVsdEhhbmRsZXIpCisgICAgcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuY29kaW5nLCBzLCBuZXh0KTsKKyAgaWYgKHByb3RvY29sRW5jb2RpbmdOYW1lID09IE5VTEwpIHsKKyAgICBpZiAobmV3RW5jb2RpbmcpIHsKKyAgICAgIGlmIChuZXdFbmNvZGluZy0+bWluQnl0ZXNQZXJDaGFyICE9IGVuY29kaW5nLT5taW5CeXRlc1BlckNoYXIpIHsKKyAgICAgICAgZXZlbnRQdHIgPSBlbmNvZGluZ05hbWU7CisgICAgICAgIHJldHVybiBYTUxfRVJST1JfSU5DT1JSRUNUX0VOQ09ESU5HOworICAgICAgfQorICAgICAgZW5jb2RpbmcgPSBuZXdFbmNvZGluZzsKKyAgICB9CisgICAgZWxzZSBpZiAoZW5jb2RpbmdOYW1lKSB7CisgICAgICBlbnVtIFhNTF9FcnJvciByZXN1bHQ7CisgICAgICBpZiAoIXN0b3JlZEVuY05hbWUpIHsKKyAgICAgICAgc3RvcmVkRW5jTmFtZSA9IHBvb2xTdG9yZVN0cmluZygKKyAgICAgICAgICAmdGVtcDJQb29sLCBlbmNvZGluZywgZW5jb2RpbmdOYW1lLAorICAgICAgICAgIGVuY29kaW5nTmFtZSArIFhtbE5hbWVMZW5ndGgoZW5jb2RpbmcsIGVuY29kaW5nTmFtZSkpOworICAgICAgICBpZiAoIXN0b3JlZEVuY05hbWUpCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICB9CisgICAgICByZXN1bHQgPSBoYW5kbGVVbmtub3duRW5jb2RpbmcocGFyc2VyLCBzdG9yZWRFbmNOYW1lKTsKKyAgICAgIHBvb2xDbGVhcigmdGVtcDJQb29sKTsKKyAgICAgIGlmIChyZXN1bHQgPT0gWE1MX0VSUk9SX1VOS05PV05fRU5DT0RJTkcpCisgICAgICAgIGV2ZW50UHRyID0gZW5jb2RpbmdOYW1lOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgIH0KKworICBpZiAoc3RvcmVkRW5jTmFtZSB8fCBzdG9yZWR2ZXJzaW9uKQorICAgIHBvb2xDbGVhcigmdGVtcDJQb29sKTsKKworICByZXR1cm4gWE1MX0VSUk9SX05PTkU7Cit9CisKK3N0YXRpYyBlbnVtIFhNTF9FcnJvcgoraGFuZGxlVW5rbm93bkVuY29kaW5nKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmdOYW1lKQoreworICBpZiAodW5rbm93bkVuY29kaW5nSGFuZGxlcikgeworICAgIFhNTF9FbmNvZGluZyBpbmZvOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgIGluZm8ubWFwW2ldID0gLTE7CisgICAgaW5mby5jb252ZXJ0ID0gTlVMTDsKKyAgICBpbmZvLmRhdGEgPSBOVUxMOworICAgIGluZm8ucmVsZWFzZSA9IE5VTEw7CisgICAgaWYgKHVua25vd25FbmNvZGluZ0hhbmRsZXIodW5rbm93bkVuY29kaW5nSGFuZGxlckRhdGEsIGVuY29kaW5nTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbykpIHsKKyAgICAgIEVOQ09ESU5HICplbmM7CisgICAgICB1bmtub3duRW5jb2RpbmdNZW0gPSBNQUxMT0MoWG1sU2l6ZU9mVW5rbm93bkVuY29kaW5nKCkpOworICAgICAgaWYgKCF1bmtub3duRW5jb2RpbmdNZW0pIHsKKyAgICAgICAgaWYgKGluZm8ucmVsZWFzZSkKKyAgICAgICAgICBpbmZvLnJlbGVhc2UoaW5mby5kYXRhKTsKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICB9CisgICAgICBlbmMgPSAobnMKKyAgICAgICAgICAgICA/IFhtbEluaXRVbmtub3duRW5jb2RpbmdOUworICAgICAgICAgICAgIDogWG1sSW5pdFVua25vd25FbmNvZGluZykodW5rbm93bkVuY29kaW5nTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmNvbnZlcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmRhdGEpOworICAgICAgaWYgKGVuYykgeworICAgICAgICB1bmtub3duRW5jb2RpbmdEYXRhID0gaW5mby5kYXRhOworICAgICAgICB1bmtub3duRW5jb2RpbmdSZWxlYXNlID0gaW5mby5yZWxlYXNlOworICAgICAgICBlbmNvZGluZyA9IGVuYzsKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaW5mby5yZWxlYXNlICE9IE5VTEwpCisgICAgICBpbmZvLnJlbGVhc2UoaW5mby5kYXRhKTsKKyAgfQorICByZXR1cm4gWE1MX0VSUk9SX1VOS05PV05fRU5DT0RJTkc7Cit9CisKK3N0YXRpYyBlbnVtIFhNTF9FcnJvciBQVFJDQUxMCitwcm9sb2dJbml0UHJvY2Vzc29yKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipuZXh0UHRyKQoreworICBlbnVtIFhNTF9FcnJvciByZXN1bHQgPSBpbml0aWFsaXplRW5jb2RpbmcocGFyc2VyKTsKKyAgaWYgKHJlc3VsdCAhPSBYTUxfRVJST1JfTk9ORSkKKyAgICByZXR1cm4gcmVzdWx0OworICBwcm9jZXNzb3IgPSBwcm9sb2dQcm9jZXNzb3I7CisgIHJldHVybiBwcm9sb2dQcm9jZXNzb3IocGFyc2VyLCBzLCBlbmQsIG5leHRQdHIpOworfQorCisjaWZkZWYgWE1MX0RURAorCitzdGF0aWMgZW51bSBYTUxfRXJyb3IgUFRSQ0FMTAorZXh0ZXJuYWxQYXJFbnRJbml0UHJvY2Vzc29yKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipuZXh0UHRyKQoreworICBlbnVtIFhNTF9FcnJvciByZXN1bHQgPSBpbml0aWFsaXplRW5jb2RpbmcocGFyc2VyKTsKKyAgaWYgKHJlc3VsdCAhPSBYTUxfRVJST1JfTk9ORSkKKyAgICByZXR1cm4gcmVzdWx0OworCisgIC8qIHdlIGtub3cgbm93IHRoYXQgWE1MX1BhcnNlKEJ1ZmZlcikgaGFzIGJlZW4gY2FsbGVkLAorICAgICBzbyB3ZSBjb25zaWRlciB0aGUgZXh0ZXJuYWwgcGFyYW1ldGVyIGVudGl0eSByZWFkICovCisgIF9kdGQtPnBhcmFtRW50aXR5UmVhZCA9IFhNTF9UUlVFOworCisgIGlmIChwcm9sb2dTdGF0ZS5pbkVudGl0eVZhbHVlKSB7CisgICAgcHJvY2Vzc29yID0gZW50aXR5VmFsdWVJbml0UHJvY2Vzc29yOworICAgIHJldHVybiBlbnRpdHlWYWx1ZUluaXRQcm9jZXNzb3IocGFyc2VyLCBzLCBlbmQsIG5leHRQdHIpOworICB9CisgIGVsc2UgeworICAgIHByb2Nlc3NvciA9IGV4dGVybmFsUGFyRW50UHJvY2Vzc29yOworICAgIHJldHVybiBleHRlcm5hbFBhckVudFByb2Nlc3NvcihwYXJzZXIsIHMsIGVuZCwgbmV4dFB0cik7CisgIH0KK30KKworc3RhdGljIGVudW0gWE1MX0Vycm9yIFBUUkNBTEwKK2VudGl0eVZhbHVlSW5pdFByb2Nlc3NvcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbmV4dFB0cikKK3sKKyAgaW50IHRvazsKKyAgY29uc3QgY2hhciAqc3RhcnQgPSBzOworICBjb25zdCBjaGFyICpuZXh0ID0gc3RhcnQ7CisgIGV2ZW50UHRyID0gc3RhcnQ7CisKKyAgZm9yICg7OykgeyAgCisgICAgdG9rID0gWG1sUHJvbG9nVG9rKGVuY29kaW5nLCBzdGFydCwgZW5kLCAmbmV4dCk7CisgICAgZXZlbnRFbmRQdHIgPSBuZXh0OworICAgIGlmICh0b2sgPD0gMCkgeworICAgICAgaWYgKCFwc19maW5hbEJ1ZmZlciAmJiB0b2sgIT0gWE1MX1RPS19JTlZBTElEKSB7CisgICAgICAgICpuZXh0UHRyID0gczsKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgICAgfQorICAgICAgc3dpdGNoICh0b2spIHsKKyAgICAgIGNhc2UgWE1MX1RPS19JTlZBTElEOgorICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0lOVkFMSURfVE9LRU47CisgICAgICBjYXNlIFhNTF9UT0tfUEFSVElBTDoKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9VTkNMT1NFRF9UT0tFTjsKKyAgICAgIGNhc2UgWE1MX1RPS19QQVJUSUFMX0NIQVI6CisgICAgICAgIHJldHVybiBYTUxfRVJST1JfUEFSVElBTF9DSEFSOworICAgICAgY2FzZSBYTUxfVE9LX05PTkU6ICAgLyogc3RhcnQgPT0gZW5kICovCisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8qIGZvdW5kIGVuZCBvZiBlbnRpdHkgdmFsdWUgLSBjYW4gc3RvcmUgaXQgbm93ICovCisgICAgICByZXR1cm4gc3RvcmVFbnRpdHlWYWx1ZShwYXJzZXIsIGVuY29kaW5nLCBzLCBlbmQpOworICAgIH0KKyAgICBlbHNlIGlmICh0b2sgPT0gWE1MX1RPS19YTUxfREVDTCkgeworICAgICAgZW51bSBYTUxfRXJyb3IgcmVzdWx0OworICAgICAgcmVzdWx0ID0gcHJvY2Vzc1htbERlY2wocGFyc2VyLCAwLCBzdGFydCwgbmV4dCk7CisgICAgICBpZiAocmVzdWx0ICE9IFhNTF9FUlJPUl9OT05FKQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgc3dpdGNoIChwc19wYXJzaW5nKSB7CisgICAgICBjYXNlIFhNTF9TVVNQRU5ERUQ6IAorICAgICAgICAqbmV4dFB0ciA9IG5leHQ7CisgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICAgIGNhc2UgWE1MX0ZJTklTSEVEOgorICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0FCT1JURUQ7CisgICAgICBkZWZhdWx0OgorICAgICAgICAqbmV4dFB0ciA9IG5leHQ7CisgICAgICB9CisgICAgICAvKiBzdG9wIHNjYW5uaW5nIGZvciB0ZXh0IGRlY2xhcmF0aW9uIC0gd2UgZm91bmQgb25lICovCisgICAgICBwcm9jZXNzb3IgPSBlbnRpdHlWYWx1ZVByb2Nlc3NvcjsKKyAgICAgIHJldHVybiBlbnRpdHlWYWx1ZVByb2Nlc3NvcihwYXJzZXIsIG5leHQsIGVuZCwgbmV4dFB0cik7CisgICAgfQorICAgIC8qIElmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIsIHRoaXMgd291bGQgY2F1c2UgWG1sUHJvbG9nVG9rIHRvCisgICAgICAgcmV0dXJuIFhNTF9UT0tfTk9ORSBvbiB0aGUgbmV4dCBjYWxsLCB3aGljaCB3b3VsZCB0aGVuIGNhdXNlIHRoZQorICAgICAgIGZ1bmN0aW9uIHRvIGV4aXQgd2l0aCAqbmV4dFB0ciBzZXQgdG8gcyAtIHRoYXQgaXMgd2hhdCB3ZSB3YW50IGZvciBvdGhlcgorICAgICAgIHRva2VucywgYnV0IG5vdCBmb3IgdGhlIEJPTSAtIHdlIHdvdWxkIHJhdGhlciBsaWtlIHRvIHNraXAgaXQ7CisgICAgICAgdGhlbiwgd2hlbiB0aGlzIHJvdXRpbmUgaXMgZW50ZXJlZCB0aGUgbmV4dCB0aW1lLCBYbWxQcm9sb2dUb2sgd2lsbAorICAgICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQsIHNpbmNlIHRoZSBCT00gaXMgc3RpbGwgaW4gdGhlIGJ1ZmZlcgorICAgICovCisgICAgZWxzZSBpZiAodG9rID09IFhNTF9UT0tfQk9NICYmIG5leHQgPT0gZW5kICYmICFwc19maW5hbEJ1ZmZlcikgeworICAgICAgKm5leHRQdHIgPSBuZXh0OworICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgIH0KKyAgICBzdGFydCA9IG5leHQ7CisgICAgZXZlbnRQdHIgPSBzdGFydDsKKyAgfQorfQorCitzdGF0aWMgZW51bSBYTUxfRXJyb3IgUFRSQ0FMTAorZXh0ZXJuYWxQYXJFbnRQcm9jZXNzb3IoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKm5leHRQdHIpCit7CisgIGNvbnN0IGNoYXIgKm5leHQgPSBzOworICBpbnQgdG9rOworCisgIHRvayA9IFhtbFByb2xvZ1RvayhlbmNvZGluZywgcywgZW5kLCAmbmV4dCk7CisgIGlmICh0b2sgPD0gMCkgeworICAgIGlmICghcHNfZmluYWxCdWZmZXIgJiYgdG9rICE9IFhNTF9UT0tfSU5WQUxJRCkgeworICAgICAgKm5leHRQdHIgPSBzOworICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgIH0KKyAgICBzd2l0Y2ggKHRvaykgeworICAgIGNhc2UgWE1MX1RPS19JTlZBTElEOgorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9JTlZBTElEX1RPS0VOOworICAgIGNhc2UgWE1MX1RPS19QQVJUSUFMOgorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9VTkNMT1NFRF9UT0tFTjsKKyAgICBjYXNlIFhNTF9UT0tfUEFSVElBTF9DSEFSOgorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9QQVJUSUFMX0NIQVI7CisgICAgY2FzZSBYTUxfVE9LX05PTkU6ICAgLyogc3RhcnQgPT0gZW5kICovCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICAvKiBUaGlzIHdvdWxkIGNhdXNlIHRoZSBuZXh0IHN0YWdlLCBpLmUuIGRvUHJvbG9nIHRvIGJlIHBhc3NlZCBYTUxfVE9LX0JPTS4KKyAgICAgSG93ZXZlciwgd2hlbiBwYXJzaW5nIGFuIGV4dGVybmFsIHN1YnNldCwgZG9Qcm9sb2cgd2lsbCBub3QgYWNjZXB0IGEgQk9NCisgICAgIGFzIHZhbGlkLCBhbmQgcmVwb3J0IGEgc3ludGF4IGVycm9yLCBzbyB3ZSBoYXZlIHRvIHNraXAgdGhlIEJPTQorICAqLworICBlbHNlIGlmICh0b2sgPT0gWE1MX1RPS19CT00pIHsKKyAgICBzID0gbmV4dDsKKyAgICB0b2sgPSBYbWxQcm9sb2dUb2soZW5jb2RpbmcsIHMsIGVuZCwgJm5leHQpOworICB9CisKKyAgcHJvY2Vzc29yID0gcHJvbG9nUHJvY2Vzc29yOworICByZXR1cm4gZG9Qcm9sb2cocGFyc2VyLCBlbmNvZGluZywgcywgZW5kLCB0b2ssIG5leHQsIAorICAgICAgICAgICAgICAgICAgbmV4dFB0ciwgKFhNTF9Cb29sKSFwc19maW5hbEJ1ZmZlcik7Cit9CisKK3N0YXRpYyBlbnVtIFhNTF9FcnJvciBQVFJDQUxMCitlbnRpdHlWYWx1ZVByb2Nlc3NvcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbmV4dFB0cikKK3sKKyAgY29uc3QgY2hhciAqc3RhcnQgPSBzOworICBjb25zdCBjaGFyICpuZXh0ID0gczsKKyAgY29uc3QgRU5DT0RJTkcgKmVuYyA9IGVuY29kaW5nOworICBpbnQgdG9rOworCisgIGZvciAoOzspIHsKKyAgICB0b2sgPSBYbWxQcm9sb2dUb2soZW5jLCBzdGFydCwgZW5kLCAmbmV4dCk7CisgICAgaWYgKHRvayA8PSAwKSB7CisgICAgICBpZiAoIXBzX2ZpbmFsQnVmZmVyICYmIHRvayAhPSBYTUxfVE9LX0lOVkFMSUQpIHsKKyAgICAgICAgKm5leHRQdHIgPSBzOworICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CisgICAgICB9CisgICAgICBzd2l0Y2ggKHRvaykgeworICAgICAgY2FzZSBYTUxfVE9LX0lOVkFMSUQ6CisgICAgICAgIHJldHVybiBYTUxfRVJST1JfSU5WQUxJRF9UT0tFTjsKKyAgICAgIGNhc2UgWE1MX1RPS19QQVJUSUFMOgorICAgICAgICByZXR1cm4gWE1MX0VSUk9SX1VOQ0xPU0VEX1RPS0VOOworICAgICAgY2FzZSBYTUxfVE9LX1BBUlRJQUxfQ0hBUjoKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9QQVJUSUFMX0NIQVI7CisgICAgICBjYXNlIFhNTF9UT0tfTk9ORTogICAvKiBzdGFydCA9PSBlbmQgKi8KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLyogZm91bmQgZW5kIG9mIGVudGl0eSB2YWx1ZSAtIGNhbiBzdG9yZSBpdCBub3cgKi8KKyAgICAgIHJldHVybiBzdG9yZUVudGl0eVZhbHVlKHBhcnNlciwgZW5jLCBzLCBlbmQpOworICAgIH0KKyAgICBzdGFydCA9IG5leHQ7CisgIH0KK30KKworI2VuZGlmIC8qIFhNTF9EVEQgKi8KKworc3RhdGljIGVudW0gWE1MX0Vycm9yIFBUUkNBTEwKK3Byb2xvZ1Byb2Nlc3NvcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbmV4dFB0cikKK3sKKyAgY29uc3QgY2hhciAqbmV4dCA9IHM7CisgIGludCB0b2sgPSBYbWxQcm9sb2dUb2soZW5jb2RpbmcsIHMsIGVuZCwgJm5leHQpOworICByZXR1cm4gZG9Qcm9sb2cocGFyc2VyLCBlbmNvZGluZywgcywgZW5kLCB0b2ssIG5leHQsIAorICAgICAgICAgICAgICAgICAgbmV4dFB0ciwgKFhNTF9Cb29sKSFwc19maW5hbEJ1ZmZlcik7Cit9CisKK3N0YXRpYyBlbnVtIFhNTF9FcnJvcgorZG9Qcm9sb2coWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jLAorICAgICAgICAgY29uc3QgY2hhciAqcywKKyAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgIGludCB0b2ssCisgICAgICAgICBjb25zdCBjaGFyICpuZXh0LAorICAgICAgICAgY29uc3QgY2hhciAqKm5leHRQdHIsCisgICAgICAgICBYTUxfQm9vbCBoYXZlTW9yZSkKK3sKKyNpZmRlZiBYTUxfRFRECisgIHN0YXRpYyBjb25zdCBYTUxfQ2hhciBleHRlcm5hbFN1YnNldE5hbWVbXSA9IHsgQVNDSUlfSEFTSCAsICdcMCcgfTsKKyNlbmRpZiAvKiBYTUxfRFREICovCisgIHN0YXRpYyBjb25zdCBYTUxfQ2hhciBhdHlwZUNEQVRBW10gPSAKKyAgICAgIHsgQVNDSUlfQywgQVNDSUlfRCwgQVNDSUlfQSwgQVNDSUlfVCwgQVNDSUlfQSwgJ1wwJyB9OworICBzdGF0aWMgY29uc3QgWE1MX0NoYXIgYXR5cGVJRFtdID0geyBBU0NJSV9JLCBBU0NJSV9ELCAnXDAnIH07CisgIHN0YXRpYyBjb25zdCBYTUxfQ2hhciBhdHlwZUlEUkVGW10gPQorICAgICAgeyBBU0NJSV9JLCBBU0NJSV9ELCBBU0NJSV9SLCBBU0NJSV9FLCBBU0NJSV9GLCAnXDAnIH07CisgIHN0YXRpYyBjb25zdCBYTUxfQ2hhciBhdHlwZUlEUkVGU1tdID0KKyAgICAgIHsgQVNDSUlfSSwgQVNDSUlfRCwgQVNDSUlfUiwgQVNDSUlfRSwgQVNDSUlfRiwgQVNDSUlfUywgJ1wwJyB9OworICBzdGF0aWMgY29uc3QgWE1MX0NoYXIgYXR5cGVFTlRJVFlbXSA9CisgICAgICB7IEFTQ0lJX0UsIEFTQ0lJX04sIEFTQ0lJX1QsIEFTQ0lJX0ksIEFTQ0lJX1QsIEFTQ0lJX1ksICdcMCcgfTsKKyAgc3RhdGljIGNvbnN0IFhNTF9DaGFyIGF0eXBlRU5USVRJRVNbXSA9IHsgQVNDSUlfRSwgQVNDSUlfTiwKKyAgICAgIEFTQ0lJX1QsIEFTQ0lJX0ksIEFTQ0lJX1QsIEFTQ0lJX0ksIEFTQ0lJX0UsIEFTQ0lJX1MsICdcMCcgfTsKKyAgc3RhdGljIGNvbnN0IFhNTF9DaGFyIGF0eXBlTk1UT0tFTltdID0geworICAgICAgQVNDSUlfTiwgQVNDSUlfTSwgQVNDSUlfVCwgQVNDSUlfTywgQVNDSUlfSywgQVNDSUlfRSwgQVNDSUlfTiwgJ1wwJyB9OworICBzdGF0aWMgY29uc3QgWE1MX0NoYXIgYXR5cGVOTVRPS0VOU1tdID0geyBBU0NJSV9OLCBBU0NJSV9NLCBBU0NJSV9ULAorICAgICAgQVNDSUlfTywgQVNDSUlfSywgQVNDSUlfRSwgQVNDSUlfTiwgQVNDSUlfUywgJ1wwJyB9OworICBzdGF0aWMgY29uc3QgWE1MX0NoYXIgbm90YXRpb25QcmVmaXhbXSA9IHsgQVNDSUlfTiwgQVNDSUlfTywgQVNDSUlfVCwKKyAgICAgIEFTQ0lJX0EsIEFTQ0lJX1QsIEFTQ0lJX0ksIEFTQ0lJX08sIEFTQ0lJX04sIEFTQ0lJX0xQQVJFTiwgJ1wwJyB9OworICBzdGF0aWMgY29uc3QgWE1MX0NoYXIgZW51bVZhbHVlU2VwW10gPSB7IEFTQ0lJX1BJUEUsICdcMCcgfTsKKyAgc3RhdGljIGNvbnN0IFhNTF9DaGFyIGVudW1WYWx1ZVN0YXJ0W10gPSB7IEFTQ0lJX0xQQVJFTiwgJ1wwJyB9OworCisgIC8qIHNhdmUgb25lIGxldmVsIG9mIGluZGlyZWN0aW9uICovCisgIERURCAqIGNvbnN0IGR0ZCA9IF9kdGQ7IAorCisgIGNvbnN0IGNoYXIgKipldmVudFBQOworICBjb25zdCBjaGFyICoqZXZlbnRFbmRQUDsKKyAgZW51bSBYTUxfQ29udGVudF9RdWFudCBxdWFudDsKKworICBpZiAoZW5jID09IGVuY29kaW5nKSB7CisgICAgZXZlbnRQUCA9ICZldmVudFB0cjsKKyAgICBldmVudEVuZFBQID0gJmV2ZW50RW5kUHRyOworICB9CisgIGVsc2UgeworICAgIGV2ZW50UFAgPSAmKG9wZW5JbnRlcm5hbEVudGl0aWVzLT5pbnRlcm5hbEV2ZW50UHRyKTsKKyAgICBldmVudEVuZFBQID0gJihvcGVuSW50ZXJuYWxFbnRpdGllcy0+aW50ZXJuYWxFdmVudEVuZFB0cik7CisgIH0KKworICBmb3IgKDs7KSB7CisgICAgaW50IHJvbGU7CisgICAgWE1MX0Jvb2wgaGFuZGxlRGVmYXVsdCA9IFhNTF9UUlVFOworICAgICpldmVudFBQID0gczsKKyAgICAqZXZlbnRFbmRQUCA9IG5leHQ7CisgICAgaWYgKHRvayA8PSAwKSB7CisgICAgICBpZiAoaGF2ZU1vcmUgJiYgdG9rICE9IFhNTF9UT0tfSU5WQUxJRCkgeworICAgICAgICAqbmV4dFB0ciA9IHM7CisgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAodG9rKSB7CisgICAgICBjYXNlIFhNTF9UT0tfSU5WQUxJRDoKKyAgICAgICAgKmV2ZW50UFAgPSBuZXh0OworICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0lOVkFMSURfVE9LRU47CisgICAgICBjYXNlIFhNTF9UT0tfUEFSVElBTDoKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9VTkNMT1NFRF9UT0tFTjsKKyAgICAgIGNhc2UgWE1MX1RPS19QQVJUSUFMX0NIQVI6CisgICAgICAgIHJldHVybiBYTUxfRVJST1JfUEFSVElBTF9DSEFSOworICAgICAgY2FzZSBYTUxfVE9LX05PTkU6CisjaWZkZWYgWE1MX0RURAorICAgICAgICAvKiBmb3IgaW50ZXJuYWwgUEUgTk9UIHJlZmVyZW5jZWQgYmV0d2VlbiBkZWNsYXJhdGlvbnMgKi8KKyAgICAgICAgaWYgKGVuYyAhPSBlbmNvZGluZyAmJiAhb3BlbkludGVybmFsRW50aXRpZXMtPmJldHdlZW5EZWNsKSB7CisgICAgICAgICAgKm5leHRQdHIgPSBzOworICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICAgICAgfQorICAgICAgICAvKiBXRkM6IFBFIEJldHdlZW4gRGVjbGFyYXRpb25zIC0gbXVzdCBjaGVjayB0aGF0IFBFIGNvbnRhaW5zCisgICAgICAgICAgIGNvbXBsZXRlIG1hcmt1cCwgbm90IG9ubHkgZm9yIGV4dGVybmFsIFBFcywgYnV0IGFsc28gZm9yCisgICAgICAgICAgIGludGVybmFsIFBFcyBpZiB0aGUgcmVmZXJlbmNlIG9jY3VycyBiZXR3ZWVuIGRlY2xhcmF0aW9ucy4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKGlzUGFyYW1FbnRpdHkgfHwgZW5jICE9IGVuY29kaW5nKSB7CisgICAgICAgICAgaWYgKFhtbFRva2VuUm9sZSgmcHJvbG9nU3RhdGUsIFhNTF9UT0tfTk9ORSwgZW5kLCBlbmQsIGVuYykKKyAgICAgICAgICAgICAgPT0gWE1MX1JPTEVfRVJST1IpCisgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0lOQ09NUExFVEVfUEU7CisgICAgICAgICAgKm5leHRQdHIgPSBzOworICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICAgICAgfQorI2VuZGlmIC8qIFhNTF9EVEQgKi8KKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19FTEVNRU5UUzsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRvayA9IC10b2s7CisgICAgICAgIG5leHQgPSBlbmQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICByb2xlID0gWG1sVG9rZW5Sb2xlKCZwcm9sb2dTdGF0ZSwgdG9rLCBzLCBuZXh0LCBlbmMpOworICAgIHN3aXRjaCAocm9sZSkgeworICAgIGNhc2UgWE1MX1JPTEVfWE1MX0RFQ0w6CisgICAgICB7CisgICAgICAgIGVudW0gWE1MX0Vycm9yIHJlc3VsdCA9IHByb2Nlc3NYbWxEZWNsKHBhcnNlciwgMCwgcywgbmV4dCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gWE1MX0VSUk9SX05PTkUpCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgZW5jID0gZW5jb2Rpbmc7CisgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFhNTF9ST0xFX0RPQ1RZUEVfTkFNRToKKyAgICAgIGlmIChzdGFydERvY3R5cGVEZWNsSGFuZGxlcikgeworICAgICAgICBkb2N0eXBlTmFtZSA9IHBvb2xTdG9yZVN0cmluZygmdGVtcFBvb2wsIGVuYywgcywgbmV4dCk7CisgICAgICAgIGlmICghZG9jdHlwZU5hbWUpCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgIHBvb2xGaW5pc2goJnRlbXBQb29sKTsKKyAgICAgICAgZG9jdHlwZVB1YmlkID0gTlVMTDsKKyAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIH0KKyAgICAgIGRvY3R5cGVTeXNpZCA9IE5VTEw7IC8qIGFsd2F5cyBpbml0aWFsaXplIHRvIE5VTEwgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1JPTEVfRE9DVFlQRV9JTlRFUk5BTF9TVUJTRVQ6CisgICAgICBpZiAoc3RhcnREb2N0eXBlRGVjbEhhbmRsZXIpIHsKKyAgICAgICAgc3RhcnREb2N0eXBlRGVjbEhhbmRsZXIoaGFuZGxlckFyZywgZG9jdHlwZU5hbWUsIGRvY3R5cGVTeXNpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdHlwZVB1YmlkLCAxKTsKKyAgICAgICAgZG9jdHlwZU5hbWUgPSBOVUxMOworICAgICAgICBwb29sQ2xlYXIoJnRlbXBQb29sKTsKKyAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworI2lmZGVmIFhNTF9EVEQKKyAgICBjYXNlIFhNTF9ST0xFX1RFWFRfREVDTDoKKyAgICAgIHsKKyAgICAgICAgZW51bSBYTUxfRXJyb3IgcmVzdWx0ID0gcHJvY2Vzc1htbERlY2wocGFyc2VyLCAxLCBzLCBuZXh0KTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBYTUxfRVJST1JfTk9ORSkKKyAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICBlbmMgPSBlbmNvZGluZzsKKyAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworI2VuZGlmIC8qIFhNTF9EVEQgKi8KKyAgICBjYXNlIFhNTF9ST0xFX0RPQ1RZUEVfUFVCTElDX0lEOgorI2lmZGVmIFhNTF9EVEQKKyAgICAgIHVzZUZvcmVpZ25EVEQgPSBYTUxfRkFMU0U7CisgICAgICBkZWNsRW50aXR5ID0gKEVOVElUWSAqKWxvb2t1cCgmZHRkLT5wYXJhbUVudGl0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxTdWJzZXROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEVOVElUWSkpOworICAgICAgaWYgKCFkZWNsRW50aXR5KQorICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyNlbmRpZiAvKiBYTUxfRFREICovCisgICAgICBkdGQtPmhhc1BhcmFtRW50aXR5UmVmcyA9IFhNTF9UUlVFOworICAgICAgaWYgKHN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyKSB7CisgICAgICAgIGlmICghWG1sSXNQdWJsaWNJZChlbmMsIHMsIG5leHQsIGV2ZW50UFApKQorICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfUFVCTElDSUQ7CisgICAgICAgIGRvY3R5cGVQdWJpZCA9IHBvb2xTdG9yZVN0cmluZygmdGVtcFBvb2wsIGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgKyBlbmMtPm1pbkJ5dGVzUGVyQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgLSBlbmMtPm1pbkJ5dGVzUGVyQ2hhcik7CisgICAgICAgIGlmICghZG9jdHlwZVB1YmlkKQorICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICBub3JtYWxpemVQdWJsaWNJZCgoWE1MX0NoYXIgKilkb2N0eXBlUHViaWQpOworICAgICAgICBwb29sRmluaXNoKCZ0ZW1wUG9vbCk7CisgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICAgIGdvdG8gYWxyZWFkeUNoZWNrZWQ7CisgICAgICB9CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlIFhNTF9ST0xFX0VOVElUWV9QVUJMSUNfSUQ6CisgICAgICBpZiAoIVhtbElzUHVibGljSWQoZW5jLCBzLCBuZXh0LCBldmVudFBQKSkKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9QVUJMSUNJRDsKKyAgICBhbHJlYWR5Q2hlY2tlZDoKKyAgICAgIGlmIChkdGQtPmtlZXBQcm9jZXNzaW5nICYmIGRlY2xFbnRpdHkpIHsKKyAgICAgICAgWE1MX0NoYXIgKnRlbSA9IHBvb2xTdG9yZVN0cmluZygmZHRkLT5wb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICsgZW5jLT5taW5CeXRlc1BlckNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCAtIGVuYy0+bWluQnl0ZXNQZXJDaGFyKTsKKyAgICAgICAgaWYgKCF0ZW0pCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgIG5vcm1hbGl6ZVB1YmxpY0lkKHRlbSk7CisgICAgICAgIGRlY2xFbnRpdHktPnB1YmxpY0lkID0gdGVtOworICAgICAgICBwb29sRmluaXNoKCZkdGQtPnBvb2wpOworICAgICAgICBpZiAoZW50aXR5RGVjbEhhbmRsZXIpCisgICAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1JPTEVfRE9DVFlQRV9DTE9TRToKKyAgICAgIGlmIChkb2N0eXBlTmFtZSkgeworICAgICAgICBzdGFydERvY3R5cGVEZWNsSGFuZGxlcihoYW5kbGVyQXJnLCBkb2N0eXBlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdHlwZVN5c2lkLCBkb2N0eXBlUHViaWQsIDApOworICAgICAgICBwb29sQ2xlYXIoJnRlbXBQb29sKTsKKyAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIH0KKyAgICAgIC8qIGRvY3R5cGVTeXNpZCB3aWxsIGJlIG5vbi1OVUxMIGluIHRoZSBjYXNlIG9mIGEgcHJldmlvdXMKKyAgICAgICAgIFhNTF9ST0xFX0RPQ1RZUEVfU1lTVEVNX0lELCBldmVuIGlmIHN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyCisgICAgICAgICB3YXMgbm90IHNldCwgaW5kaWNhdGluZyBhbiBleHRlcm5hbCBzdWJzZXQKKyAgICAgICovCisjaWZkZWYgWE1MX0RURAorICAgICAgaWYgKGRvY3R5cGVTeXNpZCB8fCB1c2VGb3JlaWduRFREKSB7CisgICAgICAgIFhNTF9Cb29sIGhhZFBhcmFtRW50aXR5UmVmcyA9IGR0ZC0+aGFzUGFyYW1FbnRpdHlSZWZzOworICAgICAgICBkdGQtPmhhc1BhcmFtRW50aXR5UmVmcyA9IFhNTF9UUlVFOworICAgICAgICBpZiAocGFyYW1FbnRpdHlQYXJzaW5nICYmIGV4dGVybmFsRW50aXR5UmVmSGFuZGxlcikgeworICAgICAgICAgIEVOVElUWSAqZW50aXR5ID0gKEVOVElUWSAqKWxvb2t1cCgmZHRkLT5wYXJhbUVudGl0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbFN1YnNldE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihFTlRJVFkpKTsKKyAgICAgICAgICBpZiAoIWVudGl0eSkKKyAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICAgIGlmICh1c2VGb3JlaWduRFREKQorICAgICAgICAgICAgZW50aXR5LT5iYXNlID0gY3VyQmFzZTsKKyAgICAgICAgICBkdGQtPnBhcmFtRW50aXR5UmVhZCA9IFhNTF9GQUxTRTsKKyAgICAgICAgICBpZiAoIWV4dGVybmFsRW50aXR5UmVmSGFuZGxlcihleHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHktPmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5LT5zeXN0ZW1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHktPnB1YmxpY0lkKSkKKyAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfRVhURVJOQUxfRU5USVRZX0hBTkRMSU5HOworICAgICAgICAgIGlmIChkdGQtPnBhcmFtRW50aXR5UmVhZCkgeworICAgICAgICAgICAgaWYgKCFkdGQtPnN0YW5kYWxvbmUgJiYgCisgICAgICAgICAgICAgICAgbm90U3RhbmRhbG9uZUhhbmRsZXIgJiYgCisgICAgICAgICAgICAgICAgIW5vdFN0YW5kYWxvbmVIYW5kbGVyKGhhbmRsZXJBcmcpKQorICAgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PVF9TVEFOREFMT05FOworICAgICAgICAgIH0KKyAgICAgICAgICAvKiBpZiB3ZSBkaWRuJ3QgcmVhZCB0aGUgZm9yZWlnbiBEVEQgdGhlbiB0aGlzIG1lYW5zIHRoYXQgdGhlcmUKKyAgICAgICAgICAgICBpcyBubyBleHRlcm5hbCBzdWJzZXQgYW5kIHdlIG11c3QgcmVzZXQgZHRkLT5oYXNQYXJhbUVudGl0eVJlZnMKKyAgICAgICAgICAqLworICAgICAgICAgIGVsc2UgaWYgKCFkb2N0eXBlU3lzaWQpCisgICAgICAgICAgICBkdGQtPmhhc1BhcmFtRW50aXR5UmVmcyA9IGhhZFBhcmFtRW50aXR5UmVmczsKKyAgICAgICAgICAvKiBlbmQgb2YgRFREIC0gbm8gbmVlZCB0byB1cGRhdGUgZHRkLT5rZWVwUHJvY2Vzc2luZyAqLworICAgICAgICB9CisgICAgICAgIHVzZUZvcmVpZ25EVEQgPSBYTUxfRkFMU0U7CisgICAgICB9CisjZW5kaWYgLyogWE1MX0RURCAqLworICAgICAgaWYgKGVuZERvY3R5cGVEZWNsSGFuZGxlcikgeworICAgICAgICBlbmREb2N0eXBlRGVjbEhhbmRsZXIoaGFuZGxlckFyZyk7CisgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFhNTF9ST0xFX0lOU1RBTkNFX1NUQVJUOgorI2lmZGVmIFhNTF9EVEQKKyAgICAgIC8qIGlmIHRoZXJlIGlzIG5vIERPQ1RZUEUgZGVjbGFyYXRpb24gdGhlbiBub3cgaXMgdGhlCisgICAgICAgICBsYXN0IGNoYW5jZSB0byByZWFkIHRoZSBmb3JlaWduIERURAorICAgICAgKi8KKyAgICAgIGlmICh1c2VGb3JlaWduRFREKSB7CisgICAgICAgIFhNTF9Cb29sIGhhZFBhcmFtRW50aXR5UmVmcyA9IGR0ZC0+aGFzUGFyYW1FbnRpdHlSZWZzOworICAgICAgICBkdGQtPmhhc1BhcmFtRW50aXR5UmVmcyA9IFhNTF9UUlVFOworICAgICAgICBpZiAocGFyYW1FbnRpdHlQYXJzaW5nICYmIGV4dGVybmFsRW50aXR5UmVmSGFuZGxlcikgeworICAgICAgICAgIEVOVElUWSAqZW50aXR5ID0gKEVOVElUWSAqKWxvb2t1cCgmZHRkLT5wYXJhbUVudGl0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbFN1YnNldE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihFTlRJVFkpKTsKKyAgICAgICAgICBpZiAoIWVudGl0eSkKKyAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICAgIGVudGl0eS0+YmFzZSA9IGN1ckJhc2U7CisgICAgICAgICAgZHRkLT5wYXJhbUVudGl0eVJlYWQgPSBYTUxfRkFMU0U7CisgICAgICAgICAgaWYgKCFleHRlcm5hbEVudGl0eVJlZkhhbmRsZXIoZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5LT5iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eS0+c3lzdGVtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5LT5wdWJsaWNJZCkpCisgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0VYVEVSTkFMX0VOVElUWV9IQU5ETElORzsKKyAgICAgICAgICBpZiAoZHRkLT5wYXJhbUVudGl0eVJlYWQpIHsKKyAgICAgICAgICAgIGlmICghZHRkLT5zdGFuZGFsb25lICYmCisgICAgICAgICAgICAgICAgbm90U3RhbmRhbG9uZUhhbmRsZXIgJiYKKyAgICAgICAgICAgICAgICAhbm90U3RhbmRhbG9uZUhhbmRsZXIoaGFuZGxlckFyZykpCisgICAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9UX1NUQU5EQUxPTkU7CisgICAgICAgICAgfQorICAgICAgICAgIC8qIGlmIHdlIGRpZG4ndCByZWFkIHRoZSBmb3JlaWduIERURCB0aGVuIHRoaXMgbWVhbnMgdGhhdCB0aGVyZQorICAgICAgICAgICAgIGlzIG5vIGV4dGVybmFsIHN1YnNldCBhbmQgd2UgbXVzdCByZXNldCBkdGQtPmhhc1BhcmFtRW50aXR5UmVmcworICAgICAgICAgICovCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZHRkLT5oYXNQYXJhbUVudGl0eVJlZnMgPSBoYWRQYXJhbUVudGl0eVJlZnM7CisgICAgICAgICAgLyogZW5kIG9mIERURCAtIG5vIG5lZWQgdG8gdXBkYXRlIGR0ZC0+a2VlcFByb2Nlc3NpbmcgKi8KKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmIC8qIFhNTF9EVEQgKi8KKyAgICAgIHByb2Nlc3NvciA9IGNvbnRlbnRQcm9jZXNzb3I7CisgICAgICByZXR1cm4gY29udGVudFByb2Nlc3NvcihwYXJzZXIsIHMsIGVuZCwgbmV4dFB0cik7CisgICAgY2FzZSBYTUxfUk9MRV9BVFRMSVNUX0VMRU1FTlRfTkFNRToKKyAgICAgIGRlY2xFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKKyAgICAgIGlmICghZGVjbEVsZW1lbnRUeXBlKQorICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgIGdvdG8gY2hlY2tBdHRMaXN0RGVjbEhhbmRsZXI7CisgICAgY2FzZSBYTUxfUk9MRV9BVFRSSUJVVEVfTkFNRToKKyAgICAgIGRlY2xBdHRyaWJ1dGVJZCA9IGdldEF0dHJpYnV0ZUlkKHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKKyAgICAgIGlmICghZGVjbEF0dHJpYnV0ZUlkKQorICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgIGRlY2xBdHRyaWJ1dGVJc0NkYXRhID0gWE1MX0ZBTFNFOworICAgICAgZGVjbEF0dHJpYnV0ZVR5cGUgPSBOVUxMOworICAgICAgZGVjbEF0dHJpYnV0ZUlzSWQgPSBYTUxfRkFMU0U7CisgICAgICBnb3RvIGNoZWNrQXR0TGlzdERlY2xIYW5kbGVyOworICAgIGNhc2UgWE1MX1JPTEVfQVRUUklCVVRFX1RZUEVfQ0RBVEE6CisgICAgICBkZWNsQXR0cmlidXRlSXNDZGF0YSA9IFhNTF9UUlVFOworICAgICAgZGVjbEF0dHJpYnV0ZVR5cGUgPSBhdHlwZUNEQVRBOworICAgICAgZ290byBjaGVja0F0dExpc3REZWNsSGFuZGxlcjsKKyAgICBjYXNlIFhNTF9ST0xFX0FUVFJJQlVURV9UWVBFX0lEOgorICAgICAgZGVjbEF0dHJpYnV0ZUlzSWQgPSBYTUxfVFJVRTsKKyAgICAgIGRlY2xBdHRyaWJ1dGVUeXBlID0gYXR5cGVJRDsKKyAgICAgIGdvdG8gY2hlY2tBdHRMaXN0RGVjbEhhbmRsZXI7CisgICAgY2FzZSBYTUxfUk9MRV9BVFRSSUJVVEVfVFlQRV9JRFJFRjoKKyAgICAgIGRlY2xBdHRyaWJ1dGVUeXBlID0gYXR5cGVJRFJFRjsKKyAgICAgIGdvdG8gY2hlY2tBdHRMaXN0RGVjbEhhbmRsZXI7CisgICAgY2FzZSBYTUxfUk9MRV9BVFRSSUJVVEVfVFlQRV9JRFJFRlM6CisgICAgICBkZWNsQXR0cmlidXRlVHlwZSA9IGF0eXBlSURSRUZTOworICAgICAgZ290byBjaGVja0F0dExpc3REZWNsSGFuZGxlcjsKKyAgICBjYXNlIFhNTF9ST0xFX0FUVFJJQlVURV9UWVBFX0VOVElUWToKKyAgICAgIGRlY2xBdHRyaWJ1dGVUeXBlID0gYXR5cGVFTlRJVFk7CisgICAgICBnb3RvIGNoZWNrQXR0TGlzdERlY2xIYW5kbGVyOworICAgIGNhc2UgWE1MX1JPTEVfQVRUUklCVVRFX1RZUEVfRU5USVRJRVM6CisgICAgICBkZWNsQXR0cmlidXRlVHlwZSA9IGF0eXBlRU5USVRJRVM7CisgICAgICBnb3RvIGNoZWNrQXR0TGlzdERlY2xIYW5kbGVyOworICAgIGNhc2UgWE1MX1JPTEVfQVRUUklCVVRFX1RZUEVfTk1UT0tFTjoKKyAgICAgIGRlY2xBdHRyaWJ1dGVUeXBlID0gYXR5cGVOTVRPS0VOOworICAgICAgZ290byBjaGVja0F0dExpc3REZWNsSGFuZGxlcjsKKyAgICBjYXNlIFhNTF9ST0xFX0FUVFJJQlVURV9UWVBFX05NVE9LRU5TOgorICAgICAgZGVjbEF0dHJpYnV0ZVR5cGUgPSBhdHlwZU5NVE9LRU5TOworICAgIGNoZWNrQXR0TGlzdERlY2xIYW5kbGVyOgorICAgICAgaWYgKGR0ZC0+a2VlcFByb2Nlc3NpbmcgJiYgYXR0bGlzdERlY2xIYW5kbGVyKQorICAgICAgICBoYW5kbGVEZWZhdWx0ID0gWE1MX0ZBTFNFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYTUxfUk9MRV9BVFRSSUJVVEVfRU5VTV9WQUxVRToKKyAgICBjYXNlIFhNTF9ST0xFX0FUVFJJQlVURV9OT1RBVElPTl9WQUxVRToKKyAgICAgIGlmIChkdGQtPmtlZXBQcm9jZXNzaW5nICYmIGF0dGxpc3REZWNsSGFuZGxlcikgeworICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHJlZml4OworICAgICAgICBpZiAoZGVjbEF0dHJpYnV0ZVR5cGUpIHsKKyAgICAgICAgICBwcmVmaXggPSBlbnVtVmFsdWVTZXA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgcHJlZml4ID0gKHJvbGUgPT0gWE1MX1JPTEVfQVRUUklCVVRFX05PVEFUSU9OX1ZBTFVFCisgICAgICAgICAgICAgICAgICAgID8gbm90YXRpb25QcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgOiBlbnVtVmFsdWVTdGFydCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFwb29sQXBwZW5kU3RyaW5nKCZ0ZW1wUG9vbCwgcHJlZml4KSkKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgaWYgKCFwb29sQXBwZW5kKCZ0ZW1wUG9vbCwgZW5jLCBzLCBuZXh0KSkKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgZGVjbEF0dHJpYnV0ZVR5cGUgPSB0ZW1wUG9vbC5zdGFydDsKKyAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1JPTEVfSU1QTElFRF9BVFRSSUJVVEVfVkFMVUU6CisgICAgY2FzZSBYTUxfUk9MRV9SRVFVSVJFRF9BVFRSSUJVVEVfVkFMVUU6CisgICAgICBpZiAoZHRkLT5rZWVwUHJvY2Vzc2luZykgeworICAgICAgICBpZiAoIWRlZmluZUF0dHJpYnV0ZShkZWNsRWxlbWVudFR5cGUsIGRlY2xBdHRyaWJ1dGVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbEF0dHJpYnV0ZUlzQ2RhdGEsIGRlY2xBdHRyaWJ1dGVJc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBwYXJzZXIpKQorICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICBpZiAoYXR0bGlzdERlY2xIYW5kbGVyICYmIGRlY2xBdHRyaWJ1dGVUeXBlKSB7CisgICAgICAgICAgaWYgKCpkZWNsQXR0cmlidXRlVHlwZSA9PSBYTUxfVChBU0NJSV9MUEFSRU4pCisgICAgICAgICAgICAgIHx8ICgqZGVjbEF0dHJpYnV0ZVR5cGUgPT0gWE1MX1QoQVNDSUlfTikKKyAgICAgICAgICAgICAgICAgICYmIGRlY2xBdHRyaWJ1dGVUeXBlWzFdID09IFhNTF9UKEFTQ0lJX08pKSkgeworICAgICAgICAgICAgLyogRW51bWVyYXRlZCBvciBOb3RhdGlvbiB0eXBlICovCisgICAgICAgICAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKCZ0ZW1wUG9vbCwgWE1MX1QoQVNDSUlfUlBBUkVOKSkKKyAgICAgICAgICAgICAgICB8fCAhcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCBYTUxfVCgnXDAnKSkpCisgICAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICAgICAgZGVjbEF0dHJpYnV0ZVR5cGUgPSB0ZW1wUG9vbC5zdGFydDsKKyAgICAgICAgICAgIHBvb2xGaW5pc2goJnRlbXBQb29sKTsKKyAgICAgICAgICB9CisgICAgICAgICAgKmV2ZW50RW5kUFAgPSBzOworICAgICAgICAgIGF0dGxpc3REZWNsSGFuZGxlcihoYW5kbGVyQXJnLCBkZWNsRWxlbWVudFR5cGUtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xBdHRyaWJ1dGVJZC0+bmFtZSwgZGVjbEF0dHJpYnV0ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHJvbGUgPT0gWE1MX1JPTEVfUkVRVUlSRURfQVRUUklCVVRFX1ZBTFVFKTsKKyAgICAgICAgICBwb29sQ2xlYXIoJnRlbXBQb29sKTsKKyAgICAgICAgICBoYW5kbGVEZWZhdWx0ID0gWE1MX0ZBTFNFOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFhNTF9ST0xFX0RFRkFVTFRfQVRUUklCVVRFX1ZBTFVFOgorICAgIGNhc2UgWE1MX1JPTEVfRklYRURfQVRUUklCVVRFX1ZBTFVFOgorICAgICAgaWYgKGR0ZC0+a2VlcFByb2Nlc3NpbmcpIHsKKyAgICAgICAgY29uc3QgWE1MX0NoYXIgKmF0dFZhbDsKKyAgICAgICAgZW51bSBYTUxfRXJyb3IgcmVzdWx0ID0KKyAgICAgICAgICBzdG9yZUF0dHJpYnV0ZVZhbHVlKHBhcnNlciwgZW5jLCBkZWNsQXR0cmlidXRlSXNDZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgKyBlbmMtPm1pbkJ5dGVzUGVyQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgLSBlbmMtPm1pbkJ5dGVzUGVyQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdGQtPnBvb2wpOworICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIGF0dFZhbCA9IHBvb2xTdGFydCgmZHRkLT5wb29sKTsKKyAgICAgICAgcG9vbEZpbmlzaCgmZHRkLT5wb29sKTsKKyAgICAgICAgLyogSUQgYXR0cmlidXRlcyBhcmVuJ3QgYWxsb3dlZCB0byBoYXZlIGEgZGVmYXVsdCAqLworICAgICAgICBpZiAoIWRlZmluZUF0dHJpYnV0ZShkZWNsRWxlbWVudFR5cGUsIGRlY2xBdHRyaWJ1dGVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbEF0dHJpYnV0ZUlzQ2RhdGEsIFhNTF9GQUxTRSwgYXR0VmFsLCBwYXJzZXIpKQorICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICBpZiAoYXR0bGlzdERlY2xIYW5kbGVyICYmIGRlY2xBdHRyaWJ1dGVUeXBlKSB7CisgICAgICAgICAgaWYgKCpkZWNsQXR0cmlidXRlVHlwZSA9PSBYTUxfVChBU0NJSV9MUEFSRU4pCisgICAgICAgICAgICAgIHx8ICgqZGVjbEF0dHJpYnV0ZVR5cGUgPT0gWE1MX1QoQVNDSUlfTikKKyAgICAgICAgICAgICAgICAgICYmIGRlY2xBdHRyaWJ1dGVUeXBlWzFdID09IFhNTF9UKEFTQ0lJX08pKSkgeworICAgICAgICAgICAgLyogRW51bWVyYXRlZCBvciBOb3RhdGlvbiB0eXBlICovCisgICAgICAgICAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKCZ0ZW1wUG9vbCwgWE1MX1QoQVNDSUlfUlBBUkVOKSkKKyAgICAgICAgICAgICAgICB8fCAhcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCBYTUxfVCgnXDAnKSkpCisgICAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICAgICAgZGVjbEF0dHJpYnV0ZVR5cGUgPSB0ZW1wUG9vbC5zdGFydDsKKyAgICAgICAgICAgIHBvb2xGaW5pc2goJnRlbXBQb29sKTsKKyAgICAgICAgICB9CisgICAgICAgICAgKmV2ZW50RW5kUFAgPSBzOworICAgICAgICAgIGF0dGxpc3REZWNsSGFuZGxlcihoYW5kbGVyQXJnLCBkZWNsRWxlbWVudFR5cGUtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xBdHRyaWJ1dGVJZC0+bmFtZSwgZGVjbEF0dHJpYnV0ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZSA9PSBYTUxfUk9MRV9GSVhFRF9BVFRSSUJVVEVfVkFMVUUpOworICAgICAgICAgIHBvb2xDbGVhcigmdGVtcFBvb2wpOworICAgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1JPTEVfRU5USVRZX1ZBTFVFOgorICAgICAgaWYgKGR0ZC0+a2VlcFByb2Nlc3NpbmcpIHsKKyAgICAgICAgZW51bSBYTUxfRXJyb3IgcmVzdWx0ID0gc3RvcmVFbnRpdHlWYWx1ZShwYXJzZXIsIGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyArIGVuYy0+bWluQnl0ZXNQZXJDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IC0gZW5jLT5taW5CeXRlc1BlckNoYXIpOworICAgICAgICBpZiAoZGVjbEVudGl0eSkgeworICAgICAgICAgIGRlY2xFbnRpdHktPnRleHRQdHIgPSBwb29sU3RhcnQoJmR0ZC0+ZW50aXR5VmFsdWVQb29sKTsKKyAgICAgICAgICBkZWNsRW50aXR5LT50ZXh0TGVuID0gKGludCkocG9vbExlbmd0aCgmZHRkLT5lbnRpdHlWYWx1ZVBvb2wpKTsKKyAgICAgICAgICBwb29sRmluaXNoKCZkdGQtPmVudGl0eVZhbHVlUG9vbCk7CisgICAgICAgICAgaWYgKGVudGl0eURlY2xIYW5kbGVyKSB7CisgICAgICAgICAgICAqZXZlbnRFbmRQUCA9IHM7CisgICAgICAgICAgICBlbnRpdHlEZWNsSGFuZGxlcihoYW5kbGVyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbEVudGl0eS0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xFbnRpdHktPmlzX3BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbEVudGl0eS0+dGV4dFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xFbnRpdHktPnRleHRMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJCYXNlLCAwLCAwLCAwKTsKKyAgICAgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwb29sRGlzY2FyZCgmZHRkLT5lbnRpdHlWYWx1ZVBvb2wpOworICAgICAgICBpZiAocmVzdWx0ICE9IFhNTF9FUlJPUl9OT05FKQorICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFhNTF9ST0xFX0RPQ1RZUEVfU1lTVEVNX0lEOgorI2lmZGVmIFhNTF9EVEQKKyAgICAgIHVzZUZvcmVpZ25EVEQgPSBYTUxfRkFMU0U7CisjZW5kaWYgLyogWE1MX0RURCAqLworICAgICAgZHRkLT5oYXNQYXJhbUVudGl0eVJlZnMgPSBYTUxfVFJVRTsKKyAgICAgIGlmIChzdGFydERvY3R5cGVEZWNsSGFuZGxlcikgeworICAgICAgICBkb2N0eXBlU3lzaWQgPSBwb29sU3RvcmVTdHJpbmcoJnRlbXBQb29sLCBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICsgZW5jLT5taW5CeXRlc1BlckNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IC0gZW5jLT5taW5CeXRlc1BlckNoYXIpOworICAgICAgICBpZiAoZG9jdHlwZVN5c2lkID09IE5VTEwpCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgIHBvb2xGaW5pc2goJnRlbXBQb29sKTsKKyAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIH0KKyNpZmRlZiBYTUxfRFRECisgICAgICBlbHNlCisgICAgICAgIC8qIHVzZSBleHRlcm5hbFN1YnNldE5hbWUgdG8gbWFrZSBkb2N0eXBlU3lzaWQgbm9uLU5VTEwKKyAgICAgICAgICAgZm9yIHRoZSBjYXNlIHdoZXJlIG5vIHN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyIGlzIHNldCAqLworICAgICAgICBkb2N0eXBlU3lzaWQgPSBleHRlcm5hbFN1YnNldE5hbWU7CisjZW5kaWYgLyogWE1MX0RURCAqLworICAgICAgaWYgKCFkdGQtPnN0YW5kYWxvbmUKKyNpZmRlZiBYTUxfRFRECisgICAgICAgICAgJiYgIXBhcmFtRW50aXR5UGFyc2luZworI2VuZGlmIC8qIFhNTF9EVEQgKi8KKyAgICAgICAgICAmJiBub3RTdGFuZGFsb25lSGFuZGxlcgorICAgICAgICAgICYmICFub3RTdGFuZGFsb25lSGFuZGxlcihoYW5kbGVyQXJnKSkKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT1RfU1RBTkRBTE9ORTsKKyNpZm5kZWYgWE1MX0RURAorICAgICAgYnJlYWs7CisjZWxzZSAvKiBYTUxfRFREICovCisgICAgICBpZiAoIWRlY2xFbnRpdHkpIHsKKyAgICAgICAgZGVjbEVudGl0eSA9IChFTlRJVFkgKilsb29rdXAoJmR0ZC0+cGFyYW1FbnRpdGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxTdWJzZXROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRU5USVRZKSk7CisgICAgICAgIGlmICghZGVjbEVudGl0eSkKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgZGVjbEVudGl0eS0+cHVibGljSWQgPSBOVUxMOworICAgICAgfQorICAgICAgLyogZmFsbCB0aHJvdWdoICovCisjZW5kaWYgLyogWE1MX0RURCAqLworICAgIGNhc2UgWE1MX1JPTEVfRU5USVRZX1NZU1RFTV9JRDoKKyAgICAgIGlmIChkdGQtPmtlZXBQcm9jZXNzaW5nICYmIGRlY2xFbnRpdHkpIHsKKyAgICAgICAgZGVjbEVudGl0eS0+c3lzdGVtSWQgPSBwb29sU3RvcmVTdHJpbmcoJmR0ZC0+cG9vbCwgZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICsgZW5jLT5taW5CeXRlc1BlckNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgLSBlbmMtPm1pbkJ5dGVzUGVyQ2hhcik7CisgICAgICAgIGlmICghZGVjbEVudGl0eS0+c3lzdGVtSWQpCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgIGRlY2xFbnRpdHktPmJhc2UgPSBjdXJCYXNlOworICAgICAgICBwb29sRmluaXNoKCZkdGQtPnBvb2wpOworICAgICAgICBpZiAoZW50aXR5RGVjbEhhbmRsZXIpCisgICAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1JPTEVfRU5USVRZX0NPTVBMRVRFOgorICAgICAgaWYgKGR0ZC0+a2VlcFByb2Nlc3NpbmcgJiYgZGVjbEVudGl0eSAmJiBlbnRpdHlEZWNsSGFuZGxlcikgeworICAgICAgICAqZXZlbnRFbmRQUCA9IHM7CisgICAgICAgIGVudGl0eURlY2xIYW5kbGVyKGhhbmRsZXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xFbnRpdHktPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xFbnRpdHktPmlzX3BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAwLDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xFbnRpdHktPmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xFbnRpdHktPnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsRW50aXR5LT5wdWJsaWNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFhNTF9ST0xFX0VOVElUWV9OT1RBVElPTl9OQU1FOgorICAgICAgaWYgKGR0ZC0+a2VlcFByb2Nlc3NpbmcgJiYgZGVjbEVudGl0eSkgeworICAgICAgICBkZWNsRW50aXR5LT5ub3RhdGlvbiA9IHBvb2xTdG9yZVN0cmluZygmZHRkLT5wb29sLCBlbmMsIHMsIG5leHQpOworICAgICAgICBpZiAoIWRlY2xFbnRpdHktPm5vdGF0aW9uKQorICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICBwb29sRmluaXNoKCZkdGQtPnBvb2wpOworICAgICAgICBpZiAodW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlcikgeworICAgICAgICAgICpldmVudEVuZFBQID0gczsKKyAgICAgICAgICB1bnBhcnNlZEVudGl0eURlY2xIYW5kbGVyKGhhbmRsZXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsRW50aXR5LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbEVudGl0eS0+YmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xFbnRpdHktPnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbEVudGl0eS0+cHVibGljSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsRW50aXR5LT5ub3RhdGlvbik7CisgICAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChlbnRpdHlEZWNsSGFuZGxlcikgeworICAgICAgICAgICpldmVudEVuZFBQID0gczsKKyAgICAgICAgICBlbnRpdHlEZWNsSGFuZGxlcihoYW5kbGVyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xFbnRpdHktPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwwLDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbEVudGl0eS0+YmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsRW50aXR5LT5zeXN0ZW1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsRW50aXR5LT5wdWJsaWNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsRW50aXR5LT5ub3RhdGlvbik7CisgICAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBYTUxfUk9MRV9HRU5FUkFMX0VOVElUWV9OQU1FOgorICAgICAgeworICAgICAgICBpZiAoWG1sUHJlZGVmaW5lZEVudGl0eU5hbWUoZW5jLCBzLCBuZXh0KSkgeworICAgICAgICAgIGRlY2xFbnRpdHkgPSBOVUxMOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChkdGQtPmtlZXBQcm9jZXNzaW5nKSB7CisgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5hbWUgPSBwb29sU3RvcmVTdHJpbmcoJmR0ZC0+cG9vbCwgZW5jLCBzLCBuZXh0KTsKKyAgICAgICAgICBpZiAoIW5hbWUpCisgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgICBkZWNsRW50aXR5ID0gKEVOVElUWSAqKWxvb2t1cCgmZHRkLT5nZW5lcmFsRW50aXRpZXMsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEVOVElUWSkpOworICAgICAgICAgIGlmICghZGVjbEVudGl0eSkKKyAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICAgIGlmIChkZWNsRW50aXR5LT5uYW1lICE9IG5hbWUpIHsKKyAgICAgICAgICAgIHBvb2xEaXNjYXJkKCZkdGQtPnBvb2wpOworICAgICAgICAgICAgZGVjbEVudGl0eSA9IE5VTEw7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcG9vbEZpbmlzaCgmZHRkLT5wb29sKTsKKyAgICAgICAgICAgIGRlY2xFbnRpdHktPnB1YmxpY0lkID0gTlVMTDsKKyAgICAgICAgICAgIGRlY2xFbnRpdHktPmlzX3BhcmFtID0gWE1MX0ZBTFNFOworICAgICAgICAgICAgLyogaWYgd2UgaGF2ZSBhIHBhcmVudCBwYXJzZXIgb3IgYXJlIHJlYWRpbmcgYW4gaW50ZXJuYWwgcGFyYW1ldGVyCisgICAgICAgICAgICAgICBlbnRpdHksIHRoZW4gdGhlIGVudGl0eSBkZWNsYXJhdGlvbiBpcyBub3QgY29uc2lkZXJlZCAiaW50ZXJuYWwiCisgICAgICAgICAgICAqLworICAgICAgICAgICAgZGVjbEVudGl0eS0+aXNfaW50ZXJuYWwgPSAhKHBhcmVudFBhcnNlciB8fCBvcGVuSW50ZXJuYWxFbnRpdGllcyk7CisgICAgICAgICAgICBpZiAoZW50aXR5RGVjbEhhbmRsZXIpCisgICAgICAgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIHBvb2xEaXNjYXJkKCZkdGQtPnBvb2wpOworICAgICAgICAgIGRlY2xFbnRpdHkgPSBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFhNTF9ST0xFX1BBUkFNX0VOVElUWV9OQU1FOgorI2lmZGVmIFhNTF9EVEQKKyAgICAgIGlmIChkdGQtPmtlZXBQcm9jZXNzaW5nKSB7CisgICAgICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lID0gcG9vbFN0b3JlU3RyaW5nKCZkdGQtPnBvb2wsIGVuYywgcywgbmV4dCk7CisgICAgICAgIGlmICghbmFtZSkKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgZGVjbEVudGl0eSA9IChFTlRJVFkgKilsb29rdXAoJmR0ZC0+cGFyYW1FbnRpdGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBzaXplb2YoRU5USVRZKSk7CisgICAgICAgIGlmICghZGVjbEVudGl0eSkKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgaWYgKGRlY2xFbnRpdHktPm5hbWUgIT0gbmFtZSkgeworICAgICAgICAgIHBvb2xEaXNjYXJkKCZkdGQtPnBvb2wpOworICAgICAgICAgIGRlY2xFbnRpdHkgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIHBvb2xGaW5pc2goJmR0ZC0+cG9vbCk7CisgICAgICAgICAgZGVjbEVudGl0eS0+cHVibGljSWQgPSBOVUxMOworICAgICAgICAgIGRlY2xFbnRpdHktPmlzX3BhcmFtID0gWE1MX1RSVUU7CisgICAgICAgICAgLyogaWYgd2UgaGF2ZSBhIHBhcmVudCBwYXJzZXIgb3IgYXJlIHJlYWRpbmcgYW4gaW50ZXJuYWwgcGFyYW1ldGVyCisgICAgICAgICAgICAgZW50aXR5LCB0aGVuIHRoZSBlbnRpdHkgZGVjbGFyYXRpb24gaXMgbm90IGNvbnNpZGVyZWQgImludGVybmFsIgorICAgICAgICAgICovCisgICAgICAgICAgZGVjbEVudGl0eS0+aXNfaW50ZXJuYWwgPSAhKHBhcmVudFBhcnNlciB8fCBvcGVuSW50ZXJuYWxFbnRpdGllcyk7CisgICAgICAgICAgaWYgKGVudGl0eURlY2xIYW5kbGVyKQorICAgICAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHBvb2xEaXNjYXJkKCZkdGQtPnBvb2wpOworICAgICAgICBkZWNsRW50aXR5ID0gTlVMTDsKKyAgICAgIH0KKyNlbHNlIC8qIG5vdCBYTUxfRFREICovCisgICAgICBkZWNsRW50aXR5ID0gTlVMTDsKKyNlbmRpZiAvKiBYTUxfRFREICovCisgICAgICBicmVhazsKKyAgICBjYXNlIFhNTF9ST0xFX05PVEFUSU9OX05BTUU6CisgICAgICBkZWNsTm90YXRpb25QdWJsaWNJZCA9IE5VTEw7CisgICAgICBkZWNsTm90YXRpb25OYW1lID0gTlVMTDsKKyAgICAgIGlmIChub3RhdGlvbkRlY2xIYW5kbGVyKSB7CisgICAgICAgIGRlY2xOb3RhdGlvbk5hbWUgPSBwb29sU3RvcmVTdHJpbmcoJnRlbXBQb29sLCBlbmMsIHMsIG5leHQpOworICAgICAgICBpZiAoIWRlY2xOb3RhdGlvbk5hbWUpCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgIHBvb2xGaW5pc2goJnRlbXBQb29sKTsKKyAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1JPTEVfTk9UQVRJT05fUFVCTElDX0lEOgorICAgICAgaWYgKCFYbWxJc1B1YmxpY0lkKGVuYywgcywgbmV4dCwgZXZlbnRQUCkpCisgICAgICAgIHJldHVybiBYTUxfRVJST1JfUFVCTElDSUQ7CisgICAgICBpZiAoZGVjbE5vdGF0aW9uTmFtZSkgeyAgLyogbWVhbnMgbm90YXRpb25EZWNsSGFuZGxlciAhPSBOVUxMICovCisgICAgICAgIFhNTF9DaGFyICp0ZW0gPSBwb29sU3RvcmVTdHJpbmcoJnRlbXBQb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICsgZW5jLT5taW5CeXRlc1BlckNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCAtIGVuYy0+bWluQnl0ZXNQZXJDaGFyKTsKKyAgICAgICAgaWYgKCF0ZW0pCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgIG5vcm1hbGl6ZVB1YmxpY0lkKHRlbSk7CisgICAgICAgIGRlY2xOb3RhdGlvblB1YmxpY0lkID0gdGVtOworICAgICAgICBwb29sRmluaXNoKCZ0ZW1wUG9vbCk7CisgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFhNTF9ST0xFX05PVEFUSU9OX1NZU1RFTV9JRDoKKyAgICAgIGlmIChkZWNsTm90YXRpb25OYW1lICYmIG5vdGF0aW9uRGVjbEhhbmRsZXIpIHsKKyAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkCisgICAgICAgICAgPSBwb29sU3RvcmVTdHJpbmcoJnRlbXBQb29sLCBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyArIGVuYy0+bWluQnl0ZXNQZXJDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgLSBlbmMtPm1pbkJ5dGVzUGVyQ2hhcik7CisgICAgICAgIGlmICghc3lzdGVtSWQpCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgICpldmVudEVuZFBQID0gczsKKyAgICAgICAgbm90YXRpb25EZWNsSGFuZGxlcihoYW5kbGVyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xOb3RhdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsTm90YXRpb25QdWJsaWNJZCk7CisgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICB9CisgICAgICBwb29sQ2xlYXIoJnRlbXBQb29sKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1JPTEVfTk9UQVRJT05fTk9fU1lTVEVNX0lEOgorICAgICAgaWYgKGRlY2xOb3RhdGlvblB1YmxpY0lkICYmIG5vdGF0aW9uRGVjbEhhbmRsZXIpIHsKKyAgICAgICAgKmV2ZW50RW5kUFAgPSBzOworICAgICAgICBub3RhdGlvbkRlY2xIYW5kbGVyKGhhbmRsZXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbE5vdGF0aW9uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbE5vdGF0aW9uUHVibGljSWQpOworICAgICAgICBoYW5kbGVEZWZhdWx0ID0gWE1MX0ZBTFNFOworICAgICAgfQorICAgICAgcG9vbENsZWFyKCZ0ZW1wUG9vbCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhNTF9ST0xFX0VSUk9SOgorICAgICAgc3dpdGNoICh0b2spIHsKKyAgICAgIGNhc2UgWE1MX1RPS19QQVJBTV9FTlRJVFlfUkVGOgorICAgICAgICAvKiBQRSByZWZlcmVuY2VzIGluIGludGVybmFsIHN1YnNldCBhcmUKKyAgICAgICAgICAgbm90IGFsbG93ZWQgd2l0aGluIGRlY2xhcmF0aW9ucy4gKi8gIAorICAgICAgICByZXR1cm4gWE1MX0VSUk9SX1BBUkFNX0VOVElUWV9SRUY7CisgICAgICBjYXNlIFhNTF9UT0tfWE1MX0RFQ0w6CisgICAgICAgIHJldHVybiBYTUxfRVJST1JfTUlTUExBQ0VEX1hNTF9QSTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBYTUxfRVJST1JfU1lOVEFYOworICAgICAgfQorI2lmZGVmIFhNTF9EVEQKKyAgICBjYXNlIFhNTF9ST0xFX0lHTk9SRV9TRUNUOgorICAgICAgeworICAgICAgICBlbnVtIFhNTF9FcnJvciByZXN1bHQ7CisgICAgICAgIGlmIChkZWZhdWx0SGFuZGxlcikKKyAgICAgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKKyAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgICAgcmVzdWx0ID0gZG9JZ25vcmVTZWN0aW9uKHBhcnNlciwgZW5jLCAmbmV4dCwgZW5kLCBuZXh0UHRyLCBoYXZlTW9yZSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gWE1MX0VSUk9SX05PTkUpCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgZWxzZSBpZiAoIW5leHQpIHsKKyAgICAgICAgICBwcm9jZXNzb3IgPSBpZ25vcmVTZWN0aW9uUHJvY2Vzc29yOworICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworI2VuZGlmIC8qIFhNTF9EVEQgKi8KKyAgICBjYXNlIFhNTF9ST0xFX0dST1VQX09QRU46CisgICAgICBpZiAocHJvbG9nU3RhdGUubGV2ZWwgPj0gZ3JvdXBTaXplKSB7CisgICAgICAgIGlmIChncm91cFNpemUpIHsKKyAgICAgICAgICBjaGFyICp0ZW1wID0gKGNoYXIgKilSRUFMTE9DKGdyb3VwQ29ubmVjdG9yLCBncm91cFNpemUgKj0gMik7CisgICAgICAgICAgaWYgKHRlbXAgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICAgIGdyb3VwQ29ubmVjdG9yID0gdGVtcDsKKyAgICAgICAgICBpZiAoZHRkLT5zY2FmZkluZGV4KSB7CisgICAgICAgICAgICBpbnQgKnRlbXAgPSAoaW50ICopUkVBTExPQyhkdGQtPnNjYWZmSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwU2l6ZSAqIHNpemVvZihpbnQpKTsKKyAgICAgICAgICAgIGlmICh0ZW1wID09IE5VTEwpCisgICAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICAgICAgZHRkLT5zY2FmZkluZGV4ID0gdGVtcDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgZ3JvdXBDb25uZWN0b3IgPSAoY2hhciAqKU1BTExPQyhncm91cFNpemUgPSAzMik7CisgICAgICAgICAgaWYgKCFncm91cENvbm5lY3RvcikKKyAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICB9CisgICAgICBncm91cENvbm5lY3Rvcltwcm9sb2dTdGF0ZS5sZXZlbF0gPSAwOworICAgICAgaWYgKGR0ZC0+aW5fZWxkZWNsKSB7CisgICAgICAgIGludCBteWluZGV4ID0gbmV4dFNjYWZmb2xkUGFydChwYXJzZXIpOworICAgICAgICBpZiAobXlpbmRleCA8IDApCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgIGR0ZC0+c2NhZmZJbmRleFtkdGQtPnNjYWZmTGV2ZWxdID0gbXlpbmRleDsKKyAgICAgICAgZHRkLT5zY2FmZkxldmVsKys7CisgICAgICAgIGR0ZC0+c2NhZmZvbGRbbXlpbmRleF0udHlwZSA9IFhNTF9DVFlQRV9TRVE7CisgICAgICAgIGlmIChlbGVtZW50RGVjbEhhbmRsZXIpCisgICAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1JPTEVfR1JPVVBfU0VRVUVOQ0U6CisgICAgICBpZiAoZ3JvdXBDb25uZWN0b3JbcHJvbG9nU3RhdGUubGV2ZWxdID09IEFTQ0lJX1BJUEUpCisgICAgICAgIHJldHVybiBYTUxfRVJST1JfU1lOVEFYOworICAgICAgZ3JvdXBDb25uZWN0b3JbcHJvbG9nU3RhdGUubGV2ZWxdID0gQVNDSUlfQ09NTUE7CisgICAgICBpZiAoZHRkLT5pbl9lbGRlY2wgJiYgZWxlbWVudERlY2xIYW5kbGVyKQorICAgICAgICBoYW5kbGVEZWZhdWx0ID0gWE1MX0ZBTFNFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYTUxfUk9MRV9HUk9VUF9DSE9JQ0U6CisgICAgICBpZiAoZ3JvdXBDb25uZWN0b3JbcHJvbG9nU3RhdGUubGV2ZWxdID09IEFTQ0lJX0NPTU1BKQorICAgICAgICByZXR1cm4gWE1MX0VSUk9SX1NZTlRBWDsKKyAgICAgIGlmIChkdGQtPmluX2VsZGVjbAorICAgICAgICAgICYmICFncm91cENvbm5lY3Rvcltwcm9sb2dTdGF0ZS5sZXZlbF0KKyAgICAgICAgICAmJiAoZHRkLT5zY2FmZm9sZFtkdGQtPnNjYWZmSW5kZXhbZHRkLT5zY2FmZkxldmVsIC0gMV1dLnR5cGUKKyAgICAgICAgICAgICAgIT0gWE1MX0NUWVBFX01JWEVEKQorICAgICAgICAgICkgeworICAgICAgICBkdGQtPnNjYWZmb2xkW2R0ZC0+c2NhZmZJbmRleFtkdGQtPnNjYWZmTGV2ZWwgLSAxXV0udHlwZQorICAgICAgICAgICAgPSBYTUxfQ1RZUEVfQ0hPSUNFOworICAgICAgICBpZiAoZWxlbWVudERlY2xIYW5kbGVyKQorICAgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICB9CisgICAgICBncm91cENvbm5lY3Rvcltwcm9sb2dTdGF0ZS5sZXZlbF0gPSBBU0NJSV9QSVBFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYTUxfUk9MRV9QQVJBTV9FTlRJVFlfUkVGOgorI2lmZGVmIFhNTF9EVEQKKyAgICBjYXNlIFhNTF9ST0xFX0lOTkVSX1BBUkFNX0VOVElUWV9SRUY6CisgICAgICBkdGQtPmhhc1BhcmFtRW50aXR5UmVmcyA9IFhNTF9UUlVFOworICAgICAgaWYgKCFwYXJhbUVudGl0eVBhcnNpbmcpCisgICAgICAgIGR0ZC0+a2VlcFByb2Nlc3NpbmcgPSBkdGQtPnN0YW5kYWxvbmU7CisgICAgICBlbHNlIHsKKyAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5hbWU7CisgICAgICAgIEVOVElUWSAqZW50aXR5OworICAgICAgICBuYW1lID0gcG9vbFN0b3JlU3RyaW5nKCZkdGQtPnBvb2wsIGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyArIGVuYy0+bWluQnl0ZXNQZXJDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IC0gZW5jLT5taW5CeXRlc1BlckNoYXIpOworICAgICAgICBpZiAoIW5hbWUpCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgIGVudGl0eSA9IChFTlRJVFkgKilsb29rdXAoJmR0ZC0+cGFyYW1FbnRpdGllcywgbmFtZSwgMCk7CisgICAgICAgIHBvb2xEaXNjYXJkKCZkdGQtPnBvb2wpOworICAgICAgICAvKiBmaXJzdCwgZGV0ZXJtaW5lIGlmIGEgY2hlY2sgZm9yIGFuIGV4aXN0aW5nIGRlY2xhcmF0aW9uIGlzIG5lZWRlZDsKKyAgICAgICAgICAgaWYgeWVzLCBjaGVjayB0aGF0IHRoZSBlbnRpdHkgZXhpc3RzLCBhbmQgdGhhdCBpdCBpcyBpbnRlcm5hbCwKKyAgICAgICAgICAgb3RoZXJ3aXNlIGNhbGwgdGhlIHNraXBwZWQgZW50aXR5IGhhbmRsZXIKKyAgICAgICAgKi8KKyAgICAgICAgaWYgKHByb2xvZ1N0YXRlLmRvY3VtZW50RW50aXR5ICYmCisgICAgICAgICAgICAoZHRkLT5zdGFuZGFsb25lCisgICAgICAgICAgICAgPyAhb3BlbkludGVybmFsRW50aXRpZXMKKyAgICAgICAgICAgICA6ICFkdGQtPmhhc1BhcmFtRW50aXR5UmVmcykpIHsKKyAgICAgICAgICBpZiAoIWVudGl0eSkKKyAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfVU5ERUZJTkVEX0VOVElUWTsKKyAgICAgICAgICBlbHNlIGlmICghZW50aXR5LT5pc19pbnRlcm5hbCkKKyAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfRU5USVRZX0RFQ0xBUkVEX0lOX1BFOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCFlbnRpdHkpIHsKKyAgICAgICAgICBkdGQtPmtlZXBQcm9jZXNzaW5nID0gZHRkLT5zdGFuZGFsb25lOworICAgICAgICAgIC8qIGNhbm5vdCByZXBvcnQgc2tpcHBlZCBlbnRpdGllcyBpbiBkZWNsYXJhdGlvbnMgKi8KKyAgICAgICAgICBpZiAoKHJvbGUgPT0gWE1MX1JPTEVfUEFSQU1fRU5USVRZX1JFRikgJiYgc2tpcHBlZEVudGl0eUhhbmRsZXIpIHsKKyAgICAgICAgICAgIHNraXBwZWRFbnRpdHlIYW5kbGVyKGhhbmRsZXJBcmcsIG5hbWUsIDEpOworICAgICAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVudGl0eS0+b3BlbikKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX1JFQ1VSU0lWRV9FTlRJVFlfUkVGOworICAgICAgICBpZiAoZW50aXR5LT50ZXh0UHRyKSB7CisgICAgICAgICAgZW51bSBYTUxfRXJyb3IgcmVzdWx0OworICAgICAgICAgIFhNTF9Cb29sIGJldHdlZW5EZWNsID0gCisgICAgICAgICAgICAocm9sZSA9PSBYTUxfUk9MRV9QQVJBTV9FTlRJVFlfUkVGID8gWE1MX1RSVUUgOiBYTUxfRkFMU0UpOworICAgICAgICAgIHJlc3VsdCA9IHByb2Nlc3NJbnRlcm5hbEVudGl0eShwYXJzZXIsIGVudGl0eSwgYmV0d2VlbkRlY2wpOworICAgICAgICAgIGlmIChyZXN1bHQgIT0gWE1MX0VSUk9SX05PTkUpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4dGVybmFsRW50aXR5UmVmSGFuZGxlcikgeworICAgICAgICAgIGR0ZC0+cGFyYW1FbnRpdHlSZWFkID0gWE1MX0ZBTFNFOworICAgICAgICAgIGVudGl0eS0+b3BlbiA9IFhNTF9UUlVFOworICAgICAgICAgIGlmICghZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyKGV4dGVybmFsRW50aXR5UmVmSGFuZGxlckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eS0+YmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHktPnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eS0+cHVibGljSWQpKSB7CisgICAgICAgICAgICBlbnRpdHktPm9wZW4gPSBYTUxfRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0VYVEVSTkFMX0VOVElUWV9IQU5ETElORzsKKyAgICAgICAgICB9CisgICAgICAgICAgZW50aXR5LT5vcGVuID0gWE1MX0ZBTFNFOworICAgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICAgICAgaWYgKCFkdGQtPnBhcmFtRW50aXR5UmVhZCkgeworICAgICAgICAgICAgZHRkLT5rZWVwUHJvY2Vzc2luZyA9IGR0ZC0+c3RhbmRhbG9uZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBkdGQtPmtlZXBQcm9jZXNzaW5nID0gZHRkLT5zdGFuZGFsb25lOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisjZW5kaWYgLyogWE1MX0RURCAqLworICAgICAgaWYgKCFkdGQtPnN0YW5kYWxvbmUgJiYKKyAgICAgICAgICBub3RTdGFuZGFsb25lSGFuZGxlciAmJgorICAgICAgICAgICFub3RTdGFuZGFsb25lSGFuZGxlcihoYW5kbGVyQXJnKSkKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT1RfU1RBTkRBTE9ORTsKKyAgICAgIGJyZWFrOworCisgICAgLyogRWxlbWVudCBkZWNsYXJhdGlvbiBzdHVmZiAqLworCisgICAgY2FzZSBYTUxfUk9MRV9FTEVNRU5UX05BTUU6CisgICAgICBpZiAoZWxlbWVudERlY2xIYW5kbGVyKSB7CisgICAgICAgIGRlY2xFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKKyAgICAgICAgaWYgKCFkZWNsRWxlbWVudFR5cGUpCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgIGR0ZC0+c2NhZmZMZXZlbCA9IDA7CisgICAgICAgIGR0ZC0+c2NhZmZDb3VudCA9IDA7CisgICAgICAgIGR0ZC0+aW5fZWxkZWNsID0gWE1MX1RSVUU7CisgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgWE1MX1JPTEVfQ09OVEVOVF9BTlk6CisgICAgY2FzZSBYTUxfUk9MRV9DT05URU5UX0VNUFRZOgorICAgICAgaWYgKGR0ZC0+aW5fZWxkZWNsKSB7CisgICAgICAgIGlmIChlbGVtZW50RGVjbEhhbmRsZXIpIHsKKyAgICAgICAgICBYTUxfQ29udGVudCAqIGNvbnRlbnQgPSAoWE1MX0NvbnRlbnQgKikgTUFMTE9DKHNpemVvZihYTUxfQ29udGVudCkpOworICAgICAgICAgIGlmICghY29udGVudCkKKyAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICAgIGNvbnRlbnQtPnF1YW50ID0gWE1MX0NRVUFOVF9OT05FOworICAgICAgICAgIGNvbnRlbnQtPm5hbWUgPSBOVUxMOworICAgICAgICAgIGNvbnRlbnQtPm51bWNoaWxkcmVuID0gMDsKKyAgICAgICAgICBjb250ZW50LT5jaGlsZHJlbiA9IE5VTEw7CisgICAgICAgICAgY29udGVudC0+dHlwZSA9ICgocm9sZSA9PSBYTUxfUk9MRV9DT05URU5UX0FOWSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0NUWVBFX0FOWSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfQ1RZUEVfRU1QVFkpOworICAgICAgICAgICpldmVudEVuZFBQID0gczsKKyAgICAgICAgICBlbGVtZW50RGVjbEhhbmRsZXIoaGFuZGxlckFyZywgZGVjbEVsZW1lbnRUeXBlLT5uYW1lLCBjb250ZW50KTsKKyAgICAgICAgICBoYW5kbGVEZWZhdWx0ID0gWE1MX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGR0ZC0+aW5fZWxkZWNsID0gWE1MX0ZBTFNFOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFhNTF9ST0xFX0NPTlRFTlRfUENEQVRBOgorICAgICAgaWYgKGR0ZC0+aW5fZWxkZWNsKSB7CisgICAgICAgIGR0ZC0+c2NhZmZvbGRbZHRkLT5zY2FmZkluZGV4W2R0ZC0+c2NhZmZMZXZlbCAtIDFdXS50eXBlCisgICAgICAgICAgICA9IFhNTF9DVFlQRV9NSVhFRDsKKyAgICAgICAgaWYgKGVsZW1lbnREZWNsSGFuZGxlcikKKyAgICAgICAgICBoYW5kbGVEZWZhdWx0ID0gWE1MX0ZBTFNFOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFhNTF9ST0xFX0NPTlRFTlRfRUxFTUVOVDoKKyAgICAgIHF1YW50ID0gWE1MX0NRVUFOVF9OT05FOworICAgICAgZ290byBlbGVtZW50Q29udGVudDsKKyAgICBjYXNlIFhNTF9ST0xFX0NPTlRFTlRfRUxFTUVOVF9PUFQ6CisgICAgICBxdWFudCA9IFhNTF9DUVVBTlRfT1BUOworICAgICAgZ290byBlbGVtZW50Q29udGVudDsKKyAgICBjYXNlIFhNTF9ST0xFX0NPTlRFTlRfRUxFTUVOVF9SRVA6CisgICAgICBxdWFudCA9IFhNTF9DUVVBTlRfUkVQOworICAgICAgZ290byBlbGVtZW50Q29udGVudDsKKyAgICBjYXNlIFhNTF9ST0xFX0NPTlRFTlRfRUxFTUVOVF9QTFVTOgorICAgICAgcXVhbnQgPSBYTUxfQ1FVQU5UX1BMVVM7CisgICAgZWxlbWVudENvbnRlbnQ6CisgICAgICBpZiAoZHRkLT5pbl9lbGRlY2wpIHsKKyAgICAgICAgRUxFTUVOVF9UWVBFICplbDsKKyAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5hbWU7CisgICAgICAgIGludCBuYW1lTGVuOworICAgICAgICBjb25zdCBjaGFyICpueHQgPSAocXVhbnQgPT0gWE1MX0NRVUFOVF9OT05FCisgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5leHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV4dCAtIGVuYy0+bWluQnl0ZXNQZXJDaGFyKTsKKyAgICAgICAgaW50IG15aW5kZXggPSBuZXh0U2NhZmZvbGRQYXJ0KHBhcnNlcik7CisgICAgICAgIGlmIChteWluZGV4IDwgMCkKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgZHRkLT5zY2FmZm9sZFtteWluZGV4XS50eXBlID0gWE1MX0NUWVBFX05BTUU7CisgICAgICAgIGR0ZC0+c2NhZmZvbGRbbXlpbmRleF0ucXVhbnQgPSBxdWFudDsKKyAgICAgICAgZWwgPSBnZXRFbGVtZW50VHlwZShwYXJzZXIsIGVuYywgcywgbnh0KTsKKyAgICAgICAgaWYgKCFlbCkKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgbmFtZSA9IGVsLT5uYW1lOworICAgICAgICBkdGQtPnNjYWZmb2xkW215aW5kZXhdLm5hbWUgPSBuYW1lOworICAgICAgICBuYW1lTGVuID0gMDsKKyAgICAgICAgZm9yICg7IG5hbWVbbmFtZUxlbisrXTsgKTsKKyAgICAgICAgZHRkLT5jb250ZW50U3RyaW5nTGVuICs9ICBuYW1lTGVuOworICAgICAgICBpZiAoZWxlbWVudERlY2xIYW5kbGVyKQorICAgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgWE1MX1JPTEVfR1JPVVBfQ0xPU0U6CisgICAgICBxdWFudCA9IFhNTF9DUVVBTlRfTk9ORTsKKyAgICAgIGdvdG8gY2xvc2VHcm91cDsKKyAgICBjYXNlIFhNTF9ST0xFX0dST1VQX0NMT1NFX09QVDoKKyAgICAgIHF1YW50ID0gWE1MX0NRVUFOVF9PUFQ7CisgICAgICBnb3RvIGNsb3NlR3JvdXA7CisgICAgY2FzZSBYTUxfUk9MRV9HUk9VUF9DTE9TRV9SRVA6CisgICAgICBxdWFudCA9IFhNTF9DUVVBTlRfUkVQOworICAgICAgZ290byBjbG9zZUdyb3VwOworICAgIGNhc2UgWE1MX1JPTEVfR1JPVVBfQ0xPU0VfUExVUzoKKyAgICAgIHF1YW50ID0gWE1MX0NRVUFOVF9QTFVTOworICAgIGNsb3NlR3JvdXA6CisgICAgICBpZiAoZHRkLT5pbl9lbGRlY2wpIHsKKyAgICAgICAgaWYgKGVsZW1lbnREZWNsSGFuZGxlcikKKyAgICAgICAgICBoYW5kbGVEZWZhdWx0ID0gWE1MX0ZBTFNFOworICAgICAgICBkdGQtPnNjYWZmTGV2ZWwtLTsKKyAgICAgICAgZHRkLT5zY2FmZm9sZFtkdGQtPnNjYWZmSW5kZXhbZHRkLT5zY2FmZkxldmVsXV0ucXVhbnQgPSBxdWFudDsKKyAgICAgICAgaWYgKGR0ZC0+c2NhZmZMZXZlbCA9PSAwKSB7CisgICAgICAgICAgaWYgKCFoYW5kbGVEZWZhdWx0KSB7CisgICAgICAgICAgICBYTUxfQ29udGVudCAqbW9kZWwgPSBidWlsZF9tb2RlbChwYXJzZXIpOworICAgICAgICAgICAgaWYgKCFtb2RlbCkKKyAgICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgICAgICAqZXZlbnRFbmRQUCA9IHM7CisgICAgICAgICAgICBlbGVtZW50RGVjbEhhbmRsZXIoaGFuZGxlckFyZywgZGVjbEVsZW1lbnRUeXBlLT5uYW1lLCBtb2RlbCk7CisgICAgICAgICAgfQorICAgICAgICAgIGR0ZC0+aW5fZWxkZWNsID0gWE1MX0ZBTFNFOworICAgICAgICAgIGR0ZC0+Y29udGVudFN0cmluZ0xlbiA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgICAgLyogRW5kIGVsZW1lbnQgZGVjbGFyYXRpb24gc3R1ZmYgKi8KKworICAgIGNhc2UgWE1MX1JPTEVfUEk6CisgICAgICBpZiAoIXJlcG9ydFByb2Nlc3NpbmdJbnN0cnVjdGlvbihwYXJzZXIsIGVuYywgcywgbmV4dCkpCisgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1JPTEVfQ09NTUVOVDoKKyAgICAgIGlmICghcmVwb3J0Q29tbWVudChwYXJzZXIsIGVuYywgcywgbmV4dCkpCisgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1JPTEVfTk9ORToKKyAgICAgIHN3aXRjaCAodG9rKSB7CisgICAgICBjYXNlIFhNTF9UT0tfQk9NOgorICAgICAgICBoYW5kbGVEZWZhdWx0ID0gWE1MX0ZBTFNFOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1JPTEVfRE9DVFlQRV9OT05FOgorICAgICAgaWYgKHN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyKQorICAgICAgICBoYW5kbGVEZWZhdWx0ID0gWE1MX0ZBTFNFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYTUxfUk9MRV9FTlRJVFlfTk9ORToKKyAgICAgIGlmIChkdGQtPmtlZXBQcm9jZXNzaW5nICYmIGVudGl0eURlY2xIYW5kbGVyKQorICAgICAgICBoYW5kbGVEZWZhdWx0ID0gWE1MX0ZBTFNFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYTUxfUk9MRV9OT1RBVElPTl9OT05FOgorICAgICAgaWYgKG5vdGF0aW9uRGVjbEhhbmRsZXIpCisgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhNTF9ST0xFX0FUVExJU1RfTk9ORToKKyAgICAgIGlmIChkdGQtPmtlZXBQcm9jZXNzaW5nICYmIGF0dGxpc3REZWNsSGFuZGxlcikKKyAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1JPTEVfRUxFTUVOVF9OT05FOgorICAgICAgaWYgKGVsZW1lbnREZWNsSGFuZGxlcikKKyAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIGJyZWFrOworICAgIH0gLyogZW5kIG9mIGJpZyBzd2l0Y2ggKi8KKworICAgIGlmIChoYW5kbGVEZWZhdWx0ICYmIGRlZmF1bHRIYW5kbGVyKQorICAgICAgcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuYywgcywgbmV4dCk7CisKKyAgICBzd2l0Y2ggKHBzX3BhcnNpbmcpIHsKKyAgICBjYXNlIFhNTF9TVVNQRU5ERUQ6IAorICAgICAgKm5leHRQdHIgPSBuZXh0OworICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgIGNhc2UgWE1MX0ZJTklTSEVEOgorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9BQk9SVEVEOworICAgIGRlZmF1bHQ6CisgICAgICBzID0gbmV4dDsKKyAgICAgIHRvayA9IFhtbFByb2xvZ1RvayhlbmMsIHMsIGVuZCwgJm5leHQpOworICAgIH0KKyAgfQorICAvKiBub3QgcmVhY2hlZCAqLworfQorCitzdGF0aWMgZW51bSBYTUxfRXJyb3IgUFRSQ0FMTAorZXBpbG9nUHJvY2Vzc29yKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipuZXh0UHRyKQoreworICBwcm9jZXNzb3IgPSBlcGlsb2dQcm9jZXNzb3I7CisgIGV2ZW50UHRyID0gczsKKyAgZm9yICg7OykgeworICAgIGNvbnN0IGNoYXIgKm5leHQgPSBOVUxMOworICAgIGludCB0b2sgPSBYbWxQcm9sb2dUb2soZW5jb2RpbmcsIHMsIGVuZCwgJm5leHQpOworICAgIGV2ZW50RW5kUHRyID0gbmV4dDsKKyAgICBzd2l0Y2ggKHRvaykgeworICAgIC8qIHJlcG9ydCBwYXJ0aWFsIGxpbmVicmVhayAtIGl0IG1pZ2h0IGJlIHRoZSBsYXN0IHRva2VuICovCisgICAgY2FzZSAtWE1MX1RPS19QUk9MT0dfUzoKKyAgICAgIGlmIChkZWZhdWx0SGFuZGxlcikgeworICAgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jb2RpbmcsIHMsIG5leHQpOworICAgICAgICBpZiAocHNfcGFyc2luZyA9PSBYTUxfRklOSVNIRUQpCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9BQk9SVEVEOworICAgICAgfQorICAgICAgKm5leHRQdHIgPSBuZXh0OworICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgIGNhc2UgWE1MX1RPS19OT05FOgorICAgICAgKm5leHRQdHIgPSBzOworICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICAgIGlmIChkZWZhdWx0SGFuZGxlcikKKyAgICAgICAgcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuY29kaW5nLCBzLCBuZXh0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1RPS19QSToKKyAgICAgIGlmICghcmVwb3J0UHJvY2Vzc2luZ0luc3RydWN0aW9uKHBhcnNlciwgZW5jb2RpbmcsIHMsIG5leHQpKQorICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1RPS19DT01NRU5UOgorICAgICAgaWYgKCFyZXBvcnRDb21tZW50KHBhcnNlciwgZW5jb2RpbmcsIHMsIG5leHQpKQorICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1RPS19JTlZBTElEOgorICAgICAgZXZlbnRQdHIgPSBuZXh0OworICAgICAgcmV0dXJuIFhNTF9FUlJPUl9JTlZBTElEX1RPS0VOOworICAgIGNhc2UgWE1MX1RPS19QQVJUSUFMOgorICAgICAgaWYgKCFwc19maW5hbEJ1ZmZlcikgeworICAgICAgICAqbmV4dFB0ciA9IHM7CisgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBYTUxfRVJST1JfVU5DTE9TRURfVE9LRU47CisgICAgY2FzZSBYTUxfVE9LX1BBUlRJQUxfQ0hBUjoKKyAgICAgIGlmICghcHNfZmluYWxCdWZmZXIpIHsKKyAgICAgICAgKm5leHRQdHIgPSBzOworICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CisgICAgICB9CisgICAgICByZXR1cm4gWE1MX0VSUk9SX1BBUlRJQUxfQ0hBUjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9KVU5LX0FGVEVSX0RPQ19FTEVNRU5UOworICAgIH0KKyAgICBldmVudFB0ciA9IHMgPSBuZXh0OworICAgIHN3aXRjaCAocHNfcGFyc2luZykgeworICAgIGNhc2UgWE1MX1NVU1BFTkRFRDogCisgICAgICAqbmV4dFB0ciA9IG5leHQ7CisgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CisgICAgY2FzZSBYTUxfRklOSVNIRUQ6CisgICAgICByZXR1cm4gWE1MX0VSUk9SX0FCT1JURUQ7CisgICAgZGVmYXVsdDogOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgZW51bSBYTUxfRXJyb3IKK3Byb2Nlc3NJbnRlcm5hbEVudGl0eShYTUxfUGFyc2VyIHBhcnNlciwgRU5USVRZICplbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgWE1MX0Jvb2wgYmV0d2VlbkRlY2wpCit7CisgIGNvbnN0IGNoYXIgKnRleHRTdGFydCwgKnRleHRFbmQ7CisgIGNvbnN0IGNoYXIgKm5leHQ7CisgIGVudW0gWE1MX0Vycm9yIHJlc3VsdDsKKyAgT1BFTl9JTlRFUk5BTF9FTlRJVFkgKm9wZW5FbnRpdHk7CisKKyAgaWYgKGZyZWVJbnRlcm5hbEVudGl0aWVzKSB7CisgICAgb3BlbkVudGl0eSA9IGZyZWVJbnRlcm5hbEVudGl0aWVzOworICAgIGZyZWVJbnRlcm5hbEVudGl0aWVzID0gb3BlbkVudGl0eS0+bmV4dDsKKyAgfQorICBlbHNlIHsKKyAgICBvcGVuRW50aXR5ID0gKE9QRU5fSU5URVJOQUxfRU5USVRZICopTUFMTE9DKHNpemVvZihPUEVOX0lOVEVSTkFMX0VOVElUWSkpOworICAgIGlmICghb3BlbkVudGl0eSkKKyAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICB9CisgIGVudGl0eS0+b3BlbiA9IFhNTF9UUlVFOworICBlbnRpdHktPnByb2Nlc3NlZCA9IDA7CisgIG9wZW5FbnRpdHktPm5leHQgPSBvcGVuSW50ZXJuYWxFbnRpdGllczsKKyAgb3BlbkludGVybmFsRW50aXRpZXMgPSBvcGVuRW50aXR5OworICBvcGVuRW50aXR5LT5lbnRpdHkgPSBlbnRpdHk7CisgIG9wZW5FbnRpdHktPnN0YXJ0VGFnTGV2ZWwgPSB0YWdMZXZlbDsKKyAgb3BlbkVudGl0eS0+YmV0d2VlbkRlY2wgPSBiZXR3ZWVuRGVjbDsKKyAgb3BlbkVudGl0eS0+aW50ZXJuYWxFdmVudFB0ciA9IE5VTEw7CisgIG9wZW5FbnRpdHktPmludGVybmFsRXZlbnRFbmRQdHIgPSBOVUxMOworICB0ZXh0U3RhcnQgPSAoY2hhciAqKWVudGl0eS0+dGV4dFB0cjsKKyAgdGV4dEVuZCA9IChjaGFyICopKGVudGl0eS0+dGV4dFB0ciArIGVudGl0eS0+dGV4dExlbik7CisKKyNpZmRlZiBYTUxfRFRECisgIGlmIChlbnRpdHktPmlzX3BhcmFtKSB7CisgICAgaW50IHRvayA9IFhtbFByb2xvZ1RvayhpbnRlcm5hbEVuY29kaW5nLCB0ZXh0U3RhcnQsIHRleHRFbmQsICZuZXh0KTsKKyAgICByZXN1bHQgPSBkb1Byb2xvZyhwYXJzZXIsIGludGVybmFsRW5jb2RpbmcsIHRleHRTdGFydCwgdGV4dEVuZCwgdG9rLCAKKyAgICAgICAgICAgICAgICAgICAgICBuZXh0LCAmbmV4dCwgWE1MX0ZBTFNFKTsKKyAgfQorICBlbHNlIAorI2VuZGlmIC8qIFhNTF9EVEQgKi8KKyAgICByZXN1bHQgPSBkb0NvbnRlbnQocGFyc2VyLCB0YWdMZXZlbCwgaW50ZXJuYWxFbmNvZGluZywgdGV4dFN0YXJ0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgdGV4dEVuZCwgJm5leHQsIFhNTF9GQUxTRSk7CisKKyAgaWYgKHJlc3VsdCA9PSBYTUxfRVJST1JfTk9ORSkgeworICAgIGlmICh0ZXh0RW5kICE9IG5leHQgJiYgcHNfcGFyc2luZyA9PSBYTUxfU1VTUEVOREVEKSB7CisgICAgICBlbnRpdHktPnByb2Nlc3NlZCA9IChpbnQpKG5leHQgLSB0ZXh0U3RhcnQpOworICAgICAgcHJvY2Vzc29yID0gaW50ZXJuYWxFbnRpdHlQcm9jZXNzb3I7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZW50aXR5LT5vcGVuID0gWE1MX0ZBTFNFOworICAgICAgb3BlbkludGVybmFsRW50aXRpZXMgPSBvcGVuRW50aXR5LT5uZXh0OworICAgICAgLyogcHV0IG9wZW5FbnRpdHkgYmFjayBpbiBsaXN0IG9mIGZyZWUgaW5zdGFuY2VzICovCisgICAgICBvcGVuRW50aXR5LT5uZXh0ID0gZnJlZUludGVybmFsRW50aXRpZXM7CisgICAgICBmcmVlSW50ZXJuYWxFbnRpdGllcyA9IG9wZW5FbnRpdHk7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBlbnVtIFhNTF9FcnJvciBQVFJDQUxMCitpbnRlcm5hbEVudGl0eVByb2Nlc3NvcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbmV4dFB0cikKK3sKKyAgRU5USVRZICplbnRpdHk7CisgIGNvbnN0IGNoYXIgKnRleHRTdGFydCwgKnRleHRFbmQ7CisgIGNvbnN0IGNoYXIgKm5leHQ7CisgIGVudW0gWE1MX0Vycm9yIHJlc3VsdDsKKyAgT1BFTl9JTlRFUk5BTF9FTlRJVFkgKm9wZW5FbnRpdHkgPSBvcGVuSW50ZXJuYWxFbnRpdGllczsKKyAgaWYgKCFvcGVuRW50aXR5KQorICAgIHJldHVybiBYTUxfRVJST1JfVU5FWFBFQ1RFRF9TVEFURTsKKworICBlbnRpdHkgPSBvcGVuRW50aXR5LT5lbnRpdHk7CisgIHRleHRTdGFydCA9ICgoY2hhciAqKWVudGl0eS0+dGV4dFB0cikgKyBlbnRpdHktPnByb2Nlc3NlZDsKKyAgdGV4dEVuZCA9IChjaGFyICopKGVudGl0eS0+dGV4dFB0ciArIGVudGl0eS0+dGV4dExlbik7CisKKyNpZmRlZiBYTUxfRFRECisgIGlmIChlbnRpdHktPmlzX3BhcmFtKSB7CisgICAgaW50IHRvayA9IFhtbFByb2xvZ1RvayhpbnRlcm5hbEVuY29kaW5nLCB0ZXh0U3RhcnQsIHRleHRFbmQsICZuZXh0KTsKKyAgICByZXN1bHQgPSBkb1Byb2xvZyhwYXJzZXIsIGludGVybmFsRW5jb2RpbmcsIHRleHRTdGFydCwgdGV4dEVuZCwgdG9rLCAKKyAgICAgICAgICAgICAgICAgICAgICBuZXh0LCAmbmV4dCwgWE1MX0ZBTFNFKTsKKyAgfQorICBlbHNlCisjZW5kaWYgLyogWE1MX0RURCAqLworICAgIHJlc3VsdCA9IGRvQ29udGVudChwYXJzZXIsIG9wZW5FbnRpdHktPnN0YXJ0VGFnTGV2ZWwsIGludGVybmFsRW5jb2RpbmcsIAorICAgICAgICAgICAgICAgICAgICAgICB0ZXh0U3RhcnQsIHRleHRFbmQsICZuZXh0LCBYTUxfRkFMU0UpOyAgCisKKyAgaWYgKHJlc3VsdCAhPSBYTUxfRVJST1JfTk9ORSkKKyAgICByZXR1cm4gcmVzdWx0OworICBlbHNlIGlmICh0ZXh0RW5kICE9IG5leHQgJiYgcHNfcGFyc2luZyA9PSBYTUxfU1VTUEVOREVEKSB7CisgICAgZW50aXR5LT5wcm9jZXNzZWQgPSAoaW50KShuZXh0IC0gKGNoYXIgKillbnRpdHktPnRleHRQdHIpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgZWxzZSB7CisgICAgZW50aXR5LT5vcGVuID0gWE1MX0ZBTFNFOworICAgIG9wZW5JbnRlcm5hbEVudGl0aWVzID0gb3BlbkVudGl0eS0+bmV4dDsKKyAgICAvKiBwdXQgb3BlbkVudGl0eSBiYWNrIGluIGxpc3Qgb2YgZnJlZSBpbnN0YW5jZXMgKi8KKyAgICBvcGVuRW50aXR5LT5uZXh0ID0gZnJlZUludGVybmFsRW50aXRpZXM7CisgICAgZnJlZUludGVybmFsRW50aXRpZXMgPSBvcGVuRW50aXR5OworICB9CisKKyNpZmRlZiBYTUxfRFRECisgIGlmIChlbnRpdHktPmlzX3BhcmFtKSB7CisgICAgaW50IHRvazsKKyAgICBwcm9jZXNzb3IgPSBwcm9sb2dQcm9jZXNzb3I7CisgICAgdG9rID0gWG1sUHJvbG9nVG9rKGVuY29kaW5nLCBzLCBlbmQsICZuZXh0KTsKKyAgICByZXR1cm4gZG9Qcm9sb2cocGFyc2VyLCBlbmNvZGluZywgcywgZW5kLCB0b2ssIG5leHQsIG5leHRQdHIsIAorICAgICAgICAgICAgICAgICAgICAoWE1MX0Jvb2wpIXBzX2ZpbmFsQnVmZmVyKTsKKyAgfQorICBlbHNlCisjZW5kaWYgLyogWE1MX0RURCAqLworICB7CisgICAgcHJvY2Vzc29yID0gY29udGVudFByb2Nlc3NvcjsKKyAgICAvKiBzZWUgZXh0ZXJuYWxFbnRpdHlDb250ZW50UHJvY2Vzc29yIHZzIGNvbnRlbnRQcm9jZXNzb3IgKi8KKyAgICByZXR1cm4gZG9Db250ZW50KHBhcnNlciwgcGFyZW50UGFyc2VyID8gMSA6IDAsIGVuY29kaW5nLCBzLCBlbmQsCisgICAgICAgICAgICAgICAgICAgICBuZXh0UHRyLCAoWE1MX0Jvb2wpIXBzX2ZpbmFsQnVmZmVyKTsgCisgIH0gIAorfQorCitzdGF0aWMgZW51bSBYTUxfRXJyb3IgUFRSQ0FMTAorZXJyb3JQcm9jZXNzb3IoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKm5leHRQdHIpCit7CisgIHJldHVybiBlcnJvckNvZGU7Cit9CisKK3N0YXRpYyBlbnVtIFhNTF9FcnJvcgorc3RvcmVBdHRyaWJ1dGVWYWx1ZShYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgRU5DT0RJTkcgKmVuYywgWE1MX0Jvb2wgaXNDZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgIFNUUklOR19QT09MICpwb29sKQoreworICBlbnVtIFhNTF9FcnJvciByZXN1bHQgPSBhcHBlbmRBdHRyaWJ1dGVWYWx1ZShwYXJzZXIsIGVuYywgaXNDZGF0YSwgcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsIHBvb2wpOworICBpZiAocmVzdWx0KQorICAgIHJldHVybiByZXN1bHQ7CisgIGlmICghaXNDZGF0YSAmJiBwb29sTGVuZ3RoKHBvb2wpICYmIHBvb2xMYXN0Q2hhcihwb29sKSA9PSAweDIwKQorICAgIHBvb2xDaG9wKHBvb2wpOworICBpZiAoIXBvb2xBcHBlbmRDaGFyKHBvb2wsIFhNTF9UKCdcMCcpKSkKKyAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworfQorCitzdGF0aWMgZW51bSBYTUxfRXJyb3IKK2FwcGVuZEF0dHJpYnV0ZVZhbHVlKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBFTkNPRElORyAqZW5jLCBYTUxfQm9vbCBpc0NkYXRhLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgICBTVFJJTkdfUE9PTCAqcG9vbCkKK3sKKyAgRFREICogY29uc3QgZHRkID0gX2R0ZDsgIC8qIHNhdmUgb25lIGxldmVsIG9mIGluZGlyZWN0aW9uICovCisgIGZvciAoOzspIHsKKyAgICBjb25zdCBjaGFyICpuZXh0OworICAgIGludCB0b2sgPSBYbWxBdHRyaWJ1dGVWYWx1ZVRvayhlbmMsIHB0ciwgZW5kLCAmbmV4dCk7CisgICAgc3dpdGNoICh0b2spIHsKKyAgICBjYXNlIFhNTF9UT0tfTk9ORToKKyAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICBjYXNlIFhNTF9UT0tfSU5WQUxJRDoKKyAgICAgIGlmIChlbmMgPT0gZW5jb2RpbmcpCisgICAgICAgIGV2ZW50UHRyID0gbmV4dDsKKyAgICAgIHJldHVybiBYTUxfRVJST1JfSU5WQUxJRF9UT0tFTjsKKyAgICBjYXNlIFhNTF9UT0tfUEFSVElBTDoKKyAgICAgIGlmIChlbmMgPT0gZW5jb2RpbmcpCisgICAgICAgIGV2ZW50UHRyID0gcHRyOworICAgICAgcmV0dXJuIFhNTF9FUlJPUl9JTlZBTElEX1RPS0VOOworICAgIGNhc2UgWE1MX1RPS19DSEFSX1JFRjoKKyAgICAgIHsKKyAgICAgICAgWE1MX0NoYXIgYnVmW1hNTF9FTkNPREVfTUFYXTsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBuID0gWG1sQ2hhclJlZk51bWJlcihlbmMsIHB0cik7CisgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgIGlmIChlbmMgPT0gZW5jb2RpbmcpCisgICAgICAgICAgICBldmVudFB0ciA9IHB0cjsKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0JBRF9DSEFSX1JFRjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWlzQ2RhdGEKKyAgICAgICAgICAgICYmIG4gPT0gMHgyMCAvKiBzcGFjZSAqLworICAgICAgICAgICAgJiYgKHBvb2xMZW5ndGgocG9vbCkgPT0gMCB8fCBwb29sTGFzdENoYXIocG9vbCkgPT0gMHgyMCkpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIG4gPSBYbWxFbmNvZGUobiwgKElDSEFSICopYnVmKTsKKyAgICAgICAgaWYgKCFuKSB7CisgICAgICAgICAgaWYgKGVuYyA9PSBlbmNvZGluZykKKyAgICAgICAgICAgIGV2ZW50UHRyID0gcHRyOworICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfQkFEX0NIQVJfUkVGOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKHBvb2wsIGJ1ZltpXSkpCisgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBYTUxfVE9LX0RBVEFfQ0hBUlM6CisgICAgICBpZiAoIXBvb2xBcHBlbmQocG9vbCwgZW5jLCBwdHIsIG5leHQpKQorICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1RPS19UUkFJTElOR19DUjoKKyAgICAgIG5leHQgPSBwdHIgKyBlbmMtPm1pbkJ5dGVzUGVyQ2hhcjsKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgWE1MX1RPS19BVFRSSUJVVEVfVkFMVUVfUzoKKyAgICBjYXNlIFhNTF9UT0tfREFUQV9ORVdMSU5FOgorICAgICAgaWYgKCFpc0NkYXRhICYmIChwb29sTGVuZ3RoKHBvb2wpID09IDAgfHwgcG9vbExhc3RDaGFyKHBvb2wpID09IDB4MjApKQorICAgICAgICBicmVhazsKKyAgICAgIGlmICghcG9vbEFwcGVuZENoYXIocG9vbCwgMHgyMCkpCisgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYTUxfVE9LX0VOVElUWV9SRUY6CisgICAgICB7CisgICAgICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lOworICAgICAgICBFTlRJVFkgKmVudGl0eTsKKyAgICAgICAgY2hhciBjaGVja0VudGl0eURlY2w7CisgICAgICAgIFhNTF9DaGFyIGNoID0gKFhNTF9DaGFyKSBYbWxQcmVkZWZpbmVkRW50aXR5TmFtZShlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyICsgZW5jLT5taW5CeXRlc1BlckNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCAtIGVuYy0+bWluQnl0ZXNQZXJDaGFyKTsKKyAgICAgICAgaWYgKGNoKSB7CisgICAgICAgICAgaWYgKCFwb29sQXBwZW5kQ2hhcihwb29sLCBjaCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbmFtZSA9IHBvb2xTdG9yZVN0cmluZygmdGVtcDJQb29sLCBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyICsgZW5jLT5taW5CeXRlc1BlckNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCAtIGVuYy0+bWluQnl0ZXNQZXJDaGFyKTsKKyAgICAgICAgaWYgKCFuYW1lKQorICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICBlbnRpdHkgPSAoRU5USVRZICopbG9va3VwKCZkdGQtPmdlbmVyYWxFbnRpdGllcywgbmFtZSwgMCk7CisgICAgICAgIHBvb2xEaXNjYXJkKCZ0ZW1wMlBvb2wpOworICAgICAgICAvKiBGaXJzdCwgZGV0ZXJtaW5lIGlmIGEgY2hlY2sgZm9yIGFuIGV4aXN0aW5nIGRlY2xhcmF0aW9uIGlzIG5lZWRlZDsKKyAgICAgICAgICAgaWYgeWVzLCBjaGVjayB0aGF0IHRoZSBlbnRpdHkgZXhpc3RzLCBhbmQgdGhhdCBpdCBpcyBpbnRlcm5hbC4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKHBvb2wgPT0gJmR0ZC0+cG9vbCkgIC8qIGFyZSB3ZSBjYWxsZWQgZnJvbSBwcm9sb2c/ICovCisgICAgICAgICAgY2hlY2tFbnRpdHlEZWNsID0KKyNpZmRlZiBYTUxfRFRECisgICAgICAgICAgICAgIHByb2xvZ1N0YXRlLmRvY3VtZW50RW50aXR5ICYmCisjZW5kaWYgLyogWE1MX0RURCAqLworICAgICAgICAgICAgICAoZHRkLT5zdGFuZGFsb25lCisgICAgICAgICAgICAgICA/ICFvcGVuSW50ZXJuYWxFbnRpdGllcworICAgICAgICAgICAgICAgOiAhZHRkLT5oYXNQYXJhbUVudGl0eVJlZnMpOworICAgICAgICBlbHNlIC8qIGlmIChwb29sID09ICZ0ZW1wUG9vbCk6IHdlIGFyZSBjYWxsZWQgZnJvbSBjb250ZW50ICovCisgICAgICAgICAgY2hlY2tFbnRpdHlEZWNsID0gIWR0ZC0+aGFzUGFyYW1FbnRpdHlSZWZzIHx8IGR0ZC0+c3RhbmRhbG9uZTsKKyAgICAgICAgaWYgKGNoZWNrRW50aXR5RGVjbCkgeworICAgICAgICAgIGlmICghZW50aXR5KQorICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9VTkRFRklORURfRU5USVRZOworICAgICAgICAgIGVsc2UgaWYgKCFlbnRpdHktPmlzX2ludGVybmFsKQorICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9FTlRJVFlfREVDTEFSRURfSU5fUEU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIWVudGl0eSkgeworICAgICAgICAgIC8qIENhbm5vdCByZXBvcnQgc2tpcHBlZCBlbnRpdHkgaGVyZSAtIHNlZSBjb21tZW50cyBvbgorICAgICAgICAgICAgIHNraXBwZWRFbnRpdHlIYW5kbGVyLgorICAgICAgICAgIGlmIChza2lwcGVkRW50aXR5SGFuZGxlcikKKyAgICAgICAgICAgIHNraXBwZWRFbnRpdHlIYW5kbGVyKGhhbmRsZXJBcmcsIG5hbWUsIDApOworICAgICAgICAgICovCisgICAgICAgICAgLyogQ2Fubm90IGNhbGwgdGhlIGRlZmF1bHQgaGFuZGxlciBiZWNhdXNlIHRoaXMgd291bGQgYmUKKyAgICAgICAgICAgICBvdXQgb2Ygc3luYyB3aXRoIHRoZSBjYWxsIHRvIHRoZSBzdGFydEVsZW1lbnRIYW5kbGVyLgorICAgICAgICAgIGlmICgocG9vbCA9PSAmdGVtcFBvb2wpICYmIGRlZmF1bHRIYW5kbGVyKQorICAgICAgICAgICAgcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuYywgcHRyLCBuZXh0KTsKKyAgICAgICAgICAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChlbnRpdHktPm9wZW4pIHsKKyAgICAgICAgICBpZiAoZW5jID09IGVuY29kaW5nKQorICAgICAgICAgICAgZXZlbnRQdHIgPSBwdHI7CisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9SRUNVUlNJVkVfRU5USVRZX1JFRjsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW50aXR5LT5ub3RhdGlvbikgeworICAgICAgICAgIGlmIChlbmMgPT0gZW5jb2RpbmcpCisgICAgICAgICAgICBldmVudFB0ciA9IHB0cjsKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0JJTkFSWV9FTlRJVFlfUkVGOworICAgICAgICB9CisgICAgICAgIGlmICghZW50aXR5LT50ZXh0UHRyKSB7CisgICAgICAgICAgaWYgKGVuYyA9PSBlbmNvZGluZykKKyAgICAgICAgICAgIGV2ZW50UHRyID0gcHRyOworICAgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0FUVFJJQlVURV9FWFRFUk5BTF9FTlRJVFlfUkVGOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGVudW0gWE1MX0Vycm9yIHJlc3VsdDsKKyAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqdGV4dEVuZCA9IGVudGl0eS0+dGV4dFB0ciArIGVudGl0eS0+dGV4dExlbjsKKyAgICAgICAgICBlbnRpdHktPm9wZW4gPSBYTUxfVFJVRTsKKyAgICAgICAgICByZXN1bHQgPSBhcHBlbmRBdHRyaWJ1dGVWYWx1ZShwYXJzZXIsIGludGVybmFsRW5jb2RpbmcsIGlzQ2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKillbnRpdHktPnRleHRQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKil0ZXh0RW5kLCBwb29sKTsKKyAgICAgICAgICBlbnRpdHktPm9wZW4gPSBYTUxfRkFMU0U7CisgICAgICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoZW5jID09IGVuY29kaW5nKQorICAgICAgICBldmVudFB0ciA9IHB0cjsKKyAgICAgIHJldHVybiBYTUxfRVJST1JfVU5FWFBFQ1RFRF9TVEFURTsKKyAgICB9CisgICAgcHRyID0gbmV4dDsKKyAgfQorICAvKiBub3QgcmVhY2hlZCAqLworfQorCitzdGF0aWMgZW51bSBYTUxfRXJyb3IKK3N0b3JlRW50aXR5VmFsdWUoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVudGl0eVRleHRQdHIsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVudGl0eVRleHRFbmQpCit7CisgIERURCAqIGNvbnN0IGR0ZCA9IF9kdGQ7ICAvKiBzYXZlIG9uZSBsZXZlbCBvZiBpbmRpcmVjdGlvbiAqLworICBTVFJJTkdfUE9PTCAqcG9vbCA9ICYoZHRkLT5lbnRpdHlWYWx1ZVBvb2wpOworICBlbnVtIFhNTF9FcnJvciByZXN1bHQgPSBYTUxfRVJST1JfTk9ORTsKKyNpZmRlZiBYTUxfRFRECisgIGludCBvbGRJbkVudGl0eVZhbHVlID0gcHJvbG9nU3RhdGUuaW5FbnRpdHlWYWx1ZTsKKyAgcHJvbG9nU3RhdGUuaW5FbnRpdHlWYWx1ZSA9IDE7CisjZW5kaWYgLyogWE1MX0RURCAqLworICAvKiBuZXZlciByZXR1cm4gTnVsbCBmb3IgdGhlIHZhbHVlIGFyZ3VtZW50IGluIEVudGl0eURlY2xIYW5kbGVyLAorICAgICBzaW5jZSB0aGlzIHdvdWxkIGluZGljYXRlIGFuIGV4dGVybmFsIGVudGl0eTsgdGhlcmVmb3JlIHdlCisgICAgIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgZW50aXR5VmFsdWVQb29sLnN0YXJ0IGlzIG5vdCBudWxsICovCisgIGlmICghcG9vbC0+YmxvY2tzKSB7CisgICAgaWYgKCFwb29sR3Jvdyhwb29sKSkKKyAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICB9CisKKyAgZm9yICg7OykgeworICAgIGNvbnN0IGNoYXIgKm5leHQ7CisgICAgaW50IHRvayA9IFhtbEVudGl0eVZhbHVlVG9rKGVuYywgZW50aXR5VGV4dFB0ciwgZW50aXR5VGV4dEVuZCwgJm5leHQpOworICAgIHN3aXRjaCAodG9rKSB7CisgICAgY2FzZSBYTUxfVE9LX1BBUkFNX0VOVElUWV9SRUY6CisjaWZkZWYgWE1MX0RURAorICAgICAgaWYgKGlzUGFyYW1FbnRpdHkgfHwgZW5jICE9IGVuY29kaW5nKSB7CisgICAgICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lOworICAgICAgICBFTlRJVFkgKmVudGl0eTsKKyAgICAgICAgbmFtZSA9IHBvb2xTdG9yZVN0cmluZygmdGVtcFBvb2wsIGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHlUZXh0UHRyICsgZW5jLT5taW5CeXRlc1BlckNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCAtIGVuYy0+bWluQnl0ZXNQZXJDaGFyKTsKKyAgICAgICAgaWYgKCFuYW1lKSB7CisgICAgICAgICAgcmVzdWx0ID0gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgICBnb3RvIGVuZEVudGl0eVZhbHVlOworICAgICAgICB9CisgICAgICAgIGVudGl0eSA9IChFTlRJVFkgKilsb29rdXAoJmR0ZC0+cGFyYW1FbnRpdGllcywgbmFtZSwgMCk7CisgICAgICAgIHBvb2xEaXNjYXJkKCZ0ZW1wUG9vbCk7CisgICAgICAgIGlmICghZW50aXR5KSB7CisgICAgICAgICAgLyogbm90IGEgd2VsbC1mb3JtZWRuZXNzIGVycm9yIC0gc2VlIFhNTCAxLjA6IFdGQyBFbnRpdHkgRGVjbGFyZWQgKi8KKyAgICAgICAgICAvKiBjYW5ub3QgcmVwb3J0IHNraXBwZWQgZW50aXR5IGhlcmUgLSBzZWUgY29tbWVudHMgb24KKyAgICAgICAgICAgICBza2lwcGVkRW50aXR5SGFuZGxlcgorICAgICAgICAgIGlmIChza2lwcGVkRW50aXR5SGFuZGxlcikKKyAgICAgICAgICAgIHNraXBwZWRFbnRpdHlIYW5kbGVyKGhhbmRsZXJBcmcsIG5hbWUsIDApOworICAgICAgICAgICovCisgICAgICAgICAgZHRkLT5rZWVwUHJvY2Vzc2luZyA9IGR0ZC0+c3RhbmRhbG9uZTsKKyAgICAgICAgICBnb3RvIGVuZEVudGl0eVZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmIChlbnRpdHktPm9wZW4pIHsKKyAgICAgICAgICBpZiAoZW5jID09IGVuY29kaW5nKQorICAgICAgICAgICAgZXZlbnRQdHIgPSBlbnRpdHlUZXh0UHRyOworICAgICAgICAgIHJlc3VsdCA9IFhNTF9FUlJPUl9SRUNVUlNJVkVfRU5USVRZX1JFRjsKKyAgICAgICAgICBnb3RvIGVuZEVudGl0eVZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmIChlbnRpdHktPnN5c3RlbUlkKSB7CisgICAgICAgICAgaWYgKGV4dGVybmFsRW50aXR5UmVmSGFuZGxlcikgeworICAgICAgICAgICAgZHRkLT5wYXJhbUVudGl0eVJlYWQgPSBYTUxfRkFMU0U7CisgICAgICAgICAgICBlbnRpdHktPm9wZW4gPSBYTUxfVFJVRTsKKyAgICAgICAgICAgIGlmICghZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyKGV4dGVybmFsRW50aXR5UmVmSGFuZGxlckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHktPmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHktPnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5LT5wdWJsaWNJZCkpIHsKKyAgICAgICAgICAgICAgZW50aXR5LT5vcGVuID0gWE1MX0ZBTFNFOworICAgICAgICAgICAgICByZXN1bHQgPSBYTUxfRVJST1JfRVhURVJOQUxfRU5USVRZX0hBTkRMSU5HOworICAgICAgICAgICAgICBnb3RvIGVuZEVudGl0eVZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW50aXR5LT5vcGVuID0gWE1MX0ZBTFNFOworICAgICAgICAgICAgaWYgKCFkdGQtPnBhcmFtRW50aXR5UmVhZCkKKyAgICAgICAgICAgICAgZHRkLT5rZWVwUHJvY2Vzc2luZyA9IGR0ZC0+c3RhbmRhbG9uZTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZHRkLT5rZWVwUHJvY2Vzc2luZyA9IGR0ZC0+c3RhbmRhbG9uZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBlbnRpdHktPm9wZW4gPSBYTUxfVFJVRTsKKyAgICAgICAgICByZXN1bHQgPSBzdG9yZUVudGl0eVZhbHVlKHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsRW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKWVudGl0eS0+dGV4dFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopKGVudGl0eS0+dGV4dFB0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlbnRpdHktPnRleHRMZW4pKTsKKyAgICAgICAgICBlbnRpdHktPm9wZW4gPSBYTUxfRkFMU0U7CisgICAgICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgICAgIGdvdG8gZW5kRW50aXR5VmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisjZW5kaWYgLyogWE1MX0RURCAqLworICAgICAgLyogSW4gdGhlIGludGVybmFsIHN1YnNldCwgUEUgcmVmZXJlbmNlcyBhcmUgbm90IGxlZ2FsCisgICAgICAgICB3aXRoaW4gbWFya3VwIGRlY2xhcmF0aW9ucywgZS5nIGVudGl0eSB2YWx1ZXMgaW4gdGhpcyBjYXNlLiAqLworICAgICAgZXZlbnRQdHIgPSBlbnRpdHlUZXh0UHRyOworICAgICAgcmVzdWx0ID0gWE1MX0VSUk9SX1BBUkFNX0VOVElUWV9SRUY7CisgICAgICBnb3RvIGVuZEVudGl0eVZhbHVlOworICAgIGNhc2UgWE1MX1RPS19OT05FOgorICAgICAgcmVzdWx0ID0gWE1MX0VSUk9SX05PTkU7CisgICAgICBnb3RvIGVuZEVudGl0eVZhbHVlOworICAgIGNhc2UgWE1MX1RPS19FTlRJVFlfUkVGOgorICAgIGNhc2UgWE1MX1RPS19EQVRBX0NIQVJTOgorICAgICAgaWYgKCFwb29sQXBwZW5kKHBvb2wsIGVuYywgZW50aXR5VGV4dFB0ciwgbmV4dCkpIHsKKyAgICAgICAgcmVzdWx0ID0gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgZ290byBlbmRFbnRpdHlWYWx1ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1RPS19UUkFJTElOR19DUjoKKyAgICAgIG5leHQgPSBlbnRpdHlUZXh0UHRyICsgZW5jLT5taW5CeXRlc1BlckNoYXI7CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlIFhNTF9UT0tfREFUQV9ORVdMSU5FOgorICAgICAgaWYgKHBvb2wtPmVuZCA9PSBwb29sLT5wdHIgJiYgIXBvb2xHcm93KHBvb2wpKSB7CisgICAgICAgICAgICAgIHJlc3VsdCA9IFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgIGdvdG8gZW5kRW50aXR5VmFsdWU7CisgICAgICB9CisgICAgICAqKHBvb2wtPnB0cikrKyA9IDB4QTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1RPS19DSEFSX1JFRjoKKyAgICAgIHsKKyAgICAgICAgWE1MX0NoYXIgYnVmW1hNTF9FTkNPREVfTUFYXTsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBuID0gWG1sQ2hhclJlZk51bWJlcihlbmMsIGVudGl0eVRleHRQdHIpOworICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICBpZiAoZW5jID09IGVuY29kaW5nKQorICAgICAgICAgICAgZXZlbnRQdHIgPSBlbnRpdHlUZXh0UHRyOworICAgICAgICAgIHJlc3VsdCA9IFhNTF9FUlJPUl9CQURfQ0hBUl9SRUY7CisgICAgICAgICAgZ290byBlbmRFbnRpdHlWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICBuID0gWG1sRW5jb2RlKG4sIChJQ0hBUiAqKWJ1Zik7CisgICAgICAgIGlmICghbikgeworICAgICAgICAgIGlmIChlbmMgPT0gZW5jb2RpbmcpCisgICAgICAgICAgICBldmVudFB0ciA9IGVudGl0eVRleHRQdHI7CisgICAgICAgICAgcmVzdWx0ID0gWE1MX0VSUk9SX0JBRF9DSEFSX1JFRjsKKyAgICAgICAgICBnb3RvIGVuZEVudGl0eVZhbHVlOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICBpZiAocG9vbC0+ZW5kID09IHBvb2wtPnB0ciAmJiAhcG9vbEdyb3cocG9vbCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgICAgICBnb3RvIGVuZEVudGl0eVZhbHVlOworICAgICAgICAgIH0KKyAgICAgICAgICAqKHBvb2wtPnB0cikrKyA9IGJ1ZltpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBYTUxfVE9LX1BBUlRJQUw6CisgICAgICBpZiAoZW5jID09IGVuY29kaW5nKQorICAgICAgICBldmVudFB0ciA9IGVudGl0eVRleHRQdHI7CisgICAgICByZXN1bHQgPSBYTUxfRVJST1JfSU5WQUxJRF9UT0tFTjsKKyAgICAgIGdvdG8gZW5kRW50aXR5VmFsdWU7CisgICAgY2FzZSBYTUxfVE9LX0lOVkFMSUQ6CisgICAgICBpZiAoZW5jID09IGVuY29kaW5nKQorICAgICAgICBldmVudFB0ciA9IG5leHQ7CisgICAgICByZXN1bHQgPSBYTUxfRVJST1JfSU5WQUxJRF9UT0tFTjsKKyAgICAgIGdvdG8gZW5kRW50aXR5VmFsdWU7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChlbmMgPT0gZW5jb2RpbmcpCisgICAgICAgIGV2ZW50UHRyID0gZW50aXR5VGV4dFB0cjsKKyAgICAgIHJlc3VsdCA9IFhNTF9FUlJPUl9VTkVYUEVDVEVEX1NUQVRFOworICAgICAgZ290byBlbmRFbnRpdHlWYWx1ZTsKKyAgICB9CisgICAgZW50aXR5VGV4dFB0ciA9IG5leHQ7CisgIH0KK2VuZEVudGl0eVZhbHVlOgorI2lmZGVmIFhNTF9EVEQKKyAgcHJvbG9nU3RhdGUuaW5FbnRpdHlWYWx1ZSA9IG9sZEluRW50aXR5VmFsdWU7CisjZW5kaWYgLyogWE1MX0RURCAqLworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBGQVNUQ0FMTAorbm9ybWFsaXplTGluZXMoWE1MX0NoYXIgKnMpCit7CisgIFhNTF9DaGFyICpwOworICBmb3IgKDs7IHMrKykgeworICAgIGlmICgqcyA9PSBYTUxfVCgnXDAnKSkKKyAgICAgIHJldHVybjsKKyAgICBpZiAoKnMgPT0gMHhEKQorICAgICAgYnJlYWs7CisgIH0KKyAgcCA9IHM7CisgIGRvIHsKKyAgICBpZiAoKnMgPT0gMHhEKSB7CisgICAgICAqcCsrID0gMHhBOworICAgICAgaWYgKCorK3MgPT0gMHhBKQorICAgICAgICBzKys7CisgICAgfQorICAgIGVsc2UKKyAgICAgICpwKysgPSAqcysrOworICB9IHdoaWxlICgqcyk7CisgICpwID0gWE1MX1QoJ1wwJyk7Cit9CisKK3N0YXRpYyBpbnQKK3JlcG9ydFByb2Nlc3NpbmdJbnN0cnVjdGlvbihYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgRU5DT0RJTkcgKmVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdGFydCwgY29uc3QgY2hhciAqZW5kKQoreworICBjb25zdCBYTUxfQ2hhciAqdGFyZ2V0OworICBYTUxfQ2hhciAqZGF0YTsKKyAgY29uc3QgY2hhciAqdGVtOworICBpZiAoIXByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIpIHsKKyAgICBpZiAoZGVmYXVsdEhhbmRsZXIpCisgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzdGFydCwgZW5kKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBzdGFydCArPSBlbmMtPm1pbkJ5dGVzUGVyQ2hhciAqIDI7CisgIHRlbSA9IHN0YXJ0ICsgWG1sTmFtZUxlbmd0aChlbmMsIHN0YXJ0KTsKKyAgdGFyZ2V0ID0gcG9vbFN0b3JlU3RyaW5nKCZ0ZW1wUG9vbCwgZW5jLCBzdGFydCwgdGVtKTsKKyAgaWYgKCF0YXJnZXQpCisgICAgcmV0dXJuIDA7CisgIHBvb2xGaW5pc2goJnRlbXBQb29sKTsKKyAgZGF0YSA9IHBvb2xTdG9yZVN0cmluZygmdGVtcFBvb2wsIGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNraXBTKGVuYywgdGVtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZCAtIGVuYy0+bWluQnl0ZXNQZXJDaGFyKjIpOworICBpZiAoIWRhdGEpCisgICAgcmV0dXJuIDA7CisgIG5vcm1hbGl6ZUxpbmVzKGRhdGEpOworICBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyKGhhbmRsZXJBcmcsIHRhcmdldCwgZGF0YSk7CisgIHBvb2xDbGVhcigmdGVtcFBvb2wpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludAorcmVwb3J0Q29tbWVudChYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgRU5DT0RJTkcgKmVuYywKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RhcnQsIGNvbnN0IGNoYXIgKmVuZCkKK3sKKyAgWE1MX0NoYXIgKmRhdGE7CisgIGlmICghY29tbWVudEhhbmRsZXIpIHsKKyAgICBpZiAoZGVmYXVsdEhhbmRsZXIpCisgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzdGFydCwgZW5kKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBkYXRhID0gcG9vbFN0b3JlU3RyaW5nKCZ0ZW1wUG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBlbmMtPm1pbkJ5dGVzUGVyQ2hhciAqIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZW5kIC0gZW5jLT5taW5CeXRlc1BlckNoYXIgKiAzKTsKKyAgaWYgKCFkYXRhKQorICAgIHJldHVybiAwOworICBub3JtYWxpemVMaW5lcyhkYXRhKTsKKyAgY29tbWVudEhhbmRsZXIoaGFuZGxlckFyZywgZGF0YSk7CisgIHBvb2xDbGVhcigmdGVtcFBvb2wpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK3JlcG9ydERlZmF1bHQoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmVuZCkKK3sKKyAgaWYgKE1VU1RfQ09OVkVSVChlbmMsIHMpKSB7CisgICAgY29uc3QgY2hhciAqKmV2ZW50UFA7CisgICAgY29uc3QgY2hhciAqKmV2ZW50RW5kUFA7CisgICAgaWYgKGVuYyA9PSBlbmNvZGluZykgeworICAgICAgZXZlbnRQUCA9ICZldmVudFB0cjsKKyAgICAgIGV2ZW50RW5kUFAgPSAmZXZlbnRFbmRQdHI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZXZlbnRQUCA9ICYob3BlbkludGVybmFsRW50aXRpZXMtPmludGVybmFsRXZlbnRQdHIpOworICAgICAgZXZlbnRFbmRQUCA9ICYob3BlbkludGVybmFsRW50aXRpZXMtPmludGVybmFsRXZlbnRFbmRQdHIpOworICAgIH0KKyAgICBkbyB7CisgICAgICBJQ0hBUiAqZGF0YVB0ciA9IChJQ0hBUiAqKWRhdGFCdWY7CisgICAgICBYbWxDb252ZXJ0KGVuYywgJnMsIGVuZCwgJmRhdGFQdHIsIChJQ0hBUiAqKWRhdGFCdWZFbmQpOworICAgICAgKmV2ZW50RW5kUFAgPSBzOworICAgICAgZGVmYXVsdEhhbmRsZXIoaGFuZGxlckFyZywgZGF0YUJ1ZiwgKGludCkoZGF0YVB0ciAtIChJQ0hBUiAqKWRhdGFCdWYpKTsKKyAgICAgICpldmVudFBQID0gczsKKyAgICB9IHdoaWxlIChzICE9IGVuZCk7CisgIH0KKyAgZWxzZQorICAgIGRlZmF1bHRIYW5kbGVyKGhhbmRsZXJBcmcsIChYTUxfQ2hhciAqKXMsIChpbnQpKChYTUxfQ2hhciAqKWVuZCAtIChYTUxfQ2hhciAqKXMpKTsKK30KKworCitzdGF0aWMgaW50CitkZWZpbmVBdHRyaWJ1dGUoRUxFTUVOVF9UWVBFICp0eXBlLCBBVFRSSUJVVEVfSUQgKmF0dElkLCBYTUxfQm9vbCBpc0NkYXRhLAorICAgICAgICAgICAgICAgIFhNTF9Cb29sIGlzSWQsIGNvbnN0IFhNTF9DaGFyICp2YWx1ZSwgWE1MX1BhcnNlciBwYXJzZXIpCit7CisgIERFRkFVTFRfQVRUUklCVVRFICphdHQ7CisgIGlmICh2YWx1ZSB8fCBpc0lkKSB7CisgICAgLyogVGhlIGhhbmRsaW5nIG9mIGRlZmF1bHQgYXR0cmlidXRlcyBnZXRzIG1lc3NlZCB1cCBpZiB3ZSBoYXZlCisgICAgICAgYSBkZWZhdWx0IHdoaWNoIGR1cGxpY2F0ZXMgYSBub24tZGVmYXVsdC4gKi8KKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdHlwZS0+bkRlZmF1bHRBdHRzOyBpKyspCisgICAgICBpZiAoYXR0SWQgPT0gdHlwZS0+ZGVmYXVsdEF0dHNbaV0uaWQpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChpc0lkICYmICF0eXBlLT5pZEF0dCAmJiAhYXR0SWQtPnhtbG5zKQorICAgICAgdHlwZS0+aWRBdHQgPSBhdHRJZDsKKyAgfQorICBpZiAodHlwZS0+bkRlZmF1bHRBdHRzID09IHR5cGUtPmFsbG9jRGVmYXVsdEF0dHMpIHsKKyAgICBpZiAodHlwZS0+YWxsb2NEZWZhdWx0QXR0cyA9PSAwKSB7CisgICAgICB0eXBlLT5hbGxvY0RlZmF1bHRBdHRzID0gODsKKyAgICAgIHR5cGUtPmRlZmF1bHRBdHRzID0gKERFRkFVTFRfQVRUUklCVVRFICopTUFMTE9DKHR5cGUtPmFsbG9jRGVmYXVsdEF0dHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihERUZBVUxUX0FUVFJJQlVURSkpOworICAgICAgaWYgKCF0eXBlLT5kZWZhdWx0QXR0cykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgREVGQVVMVF9BVFRSSUJVVEUgKnRlbXA7CisgICAgICBpbnQgY291bnQgPSB0eXBlLT5hbGxvY0RlZmF1bHRBdHRzICogMjsKKyAgICAgIHRlbXAgPSAoREVGQVVMVF9BVFRSSUJVVEUgKikKKyAgICAgICAgUkVBTExPQyh0eXBlLT5kZWZhdWx0QXR0cywgKGNvdW50ICogc2l6ZW9mKERFRkFVTFRfQVRUUklCVVRFKSkpOworICAgICAgaWYgKHRlbXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB0eXBlLT5hbGxvY0RlZmF1bHRBdHRzID0gY291bnQ7CisgICAgICB0eXBlLT5kZWZhdWx0QXR0cyA9IHRlbXA7CisgICAgfQorICB9CisgIGF0dCA9IHR5cGUtPmRlZmF1bHRBdHRzICsgdHlwZS0+bkRlZmF1bHRBdHRzOworICBhdHQtPmlkID0gYXR0SWQ7CisgIGF0dC0+dmFsdWUgPSB2YWx1ZTsKKyAgYXR0LT5pc0NkYXRhID0gaXNDZGF0YTsKKyAgaWYgKCFpc0NkYXRhKQorICAgIGF0dElkLT5tYXliZVRva2VuaXplZCA9IFhNTF9UUlVFOworICB0eXBlLT5uRGVmYXVsdEF0dHMgKz0gMTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK3NldEVsZW1lbnRUeXBlUHJlZml4KFhNTF9QYXJzZXIgcGFyc2VyLCBFTEVNRU5UX1RZUEUgKmVsZW1lbnRUeXBlKQoreworICBEVEQgKiBjb25zdCBkdGQgPSBfZHRkOyAgLyogc2F2ZSBvbmUgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gKi8KKyAgY29uc3QgWE1MX0NoYXIgKm5hbWU7CisgIGZvciAobmFtZSA9IGVsZW1lbnRUeXBlLT5uYW1lOyAqbmFtZTsgbmFtZSsrKSB7CisgICAgaWYgKCpuYW1lID09IFhNTF9UKEFTQ0lJX0NPTE9OKSkgeworICAgICAgUFJFRklYICpwcmVmaXg7CisgICAgICBjb25zdCBYTUxfQ2hhciAqczsKKyAgICAgIGZvciAocyA9IGVsZW1lbnRUeXBlLT5uYW1lOyBzICE9IG5hbWU7IHMrKykgeworICAgICAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKCZkdGQtPnBvb2wsICpzKSkKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGlmICghcG9vbEFwcGVuZENoYXIoJmR0ZC0+cG9vbCwgWE1MX1QoJ1wwJykpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIHByZWZpeCA9IChQUkVGSVggKilsb29rdXAoJmR0ZC0+cHJlZml4ZXMsIHBvb2xTdGFydCgmZHRkLT5wb29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFBSRUZJWCkpOworICAgICAgaWYgKCFwcmVmaXgpCisgICAgICAgIHJldHVybiAwOworICAgICAgaWYgKHByZWZpeC0+bmFtZSA9PSBwb29sU3RhcnQoJmR0ZC0+cG9vbCkpCisgICAgICAgIHBvb2xGaW5pc2goJmR0ZC0+cG9vbCk7CisgICAgICBlbHNlCisgICAgICAgIHBvb2xEaXNjYXJkKCZkdGQtPnBvb2wpOworICAgICAgZWxlbWVudFR5cGUtPnByZWZpeCA9IHByZWZpeDsKKworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIEFUVFJJQlVURV9JRCAqCitnZXRBdHRyaWJ1dGVJZChYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgRU5DT0RJTkcgKmVuYywKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0YXJ0LCBjb25zdCBjaGFyICplbmQpCit7CisgIERURCAqIGNvbnN0IGR0ZCA9IF9kdGQ7ICAvKiBzYXZlIG9uZSBsZXZlbCBvZiBpbmRpcmVjdGlvbiAqLworICBBVFRSSUJVVEVfSUQgKmlkOworICBjb25zdCBYTUxfQ2hhciAqbmFtZTsKKyAgaWYgKCFwb29sQXBwZW5kQ2hhcigmZHRkLT5wb29sLCBYTUxfVCgnXDAnKSkpCisgICAgcmV0dXJuIE5VTEw7CisgIG5hbWUgPSBwb29sU3RvcmVTdHJpbmcoJmR0ZC0+cG9vbCwgZW5jLCBzdGFydCwgZW5kKTsKKyAgaWYgKCFuYW1lKQorICAgIHJldHVybiBOVUxMOworICAvKiBza2lwIHF1b3RhdGlvbiBtYXJrIC0gaXRzIHN0b3JhZ2Ugd2lsbCBiZSByZS11c2VkIChsaWtlIGluIG5hbWVbLTFdKSAqLworICArK25hbWU7CisgIGlkID0gKEFUVFJJQlVURV9JRCAqKWxvb2t1cCgmZHRkLT5hdHRyaWJ1dGVJZHMsIG5hbWUsIHNpemVvZihBVFRSSUJVVEVfSUQpKTsKKyAgaWYgKCFpZCkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKGlkLT5uYW1lICE9IG5hbWUpCisgICAgcG9vbERpc2NhcmQoJmR0ZC0+cG9vbCk7CisgIGVsc2UgeworICAgIHBvb2xGaW5pc2goJmR0ZC0+cG9vbCk7CisgICAgaWYgKCFucykKKyAgICAgIDsKKyAgICBlbHNlIGlmIChuYW1lWzBdID09IFhNTF9UKEFTQ0lJX3gpCisgICAgICAgICYmIG5hbWVbMV0gPT0gWE1MX1QoQVNDSUlfbSkKKyAgICAgICAgJiYgbmFtZVsyXSA9PSBYTUxfVChBU0NJSV9sKQorICAgICAgICAmJiBuYW1lWzNdID09IFhNTF9UKEFTQ0lJX24pCisgICAgICAgICYmIG5hbWVbNF0gPT0gWE1MX1QoQVNDSUlfcykKKyAgICAgICAgJiYgKG5hbWVbNV0gPT0gWE1MX1QoJ1wwJykgfHwgbmFtZVs1XSA9PSBYTUxfVChBU0NJSV9DT0xPTikpKSB7CisgICAgICBpZiAobmFtZVs1XSA9PSBYTUxfVCgnXDAnKSkKKyAgICAgICAgaWQtPnByZWZpeCA9ICZkdGQtPmRlZmF1bHRQcmVmaXg7CisgICAgICBlbHNlCisgICAgICAgIGlkLT5wcmVmaXggPSAoUFJFRklYICopbG9va3VwKCZkdGQtPnByZWZpeGVzLCBuYW1lICsgNiwgc2l6ZW9mKFBSRUZJWCkpOworICAgICAgaWQtPnhtbG5zID0gWE1MX1RSVUU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaW50IGk7CisgICAgICBmb3IgKGkgPSAwOyBuYW1lW2ldOyBpKyspIHsKKyAgICAgICAgLyogYXR0cmlidXRlcyB3aXRob3V0IHByZWZpeCBhcmUgKm5vdCogaW4gdGhlIGRlZmF1bHQgbmFtZXNwYWNlICovCisgICAgICAgIGlmIChuYW1lW2ldID09IFhNTF9UKEFTQ0lJX0NPTE9OKSkgeworICAgICAgICAgIGludCBqOworICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKyAgICAgICAgICAgIGlmICghcG9vbEFwcGVuZENoYXIoJmR0ZC0+cG9vbCwgbmFtZVtqXSkpCisgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKCZkdGQtPnBvb2wsIFhNTF9UKCdcMCcpKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgIGlkLT5wcmVmaXggPSAoUFJFRklYICopbG9va3VwKCZkdGQtPnByZWZpeGVzLCBwb29sU3RhcnQoJmR0ZC0+cG9vbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFBSRUZJWCkpOworICAgICAgICAgIGlmIChpZC0+cHJlZml4LT5uYW1lID09IHBvb2xTdGFydCgmZHRkLT5wb29sKSkKKyAgICAgICAgICAgIHBvb2xGaW5pc2goJmR0ZC0+cG9vbCk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcG9vbERpc2NhcmQoJmR0ZC0+cG9vbCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGlkOworfQorCisjZGVmaW5lIENPTlRFWFRfU0VQIFhNTF9UKEFTQ0lJX0ZGKQorCitzdGF0aWMgY29uc3QgWE1MX0NoYXIgKgorZ2V0Q29udGV4dChYTUxfUGFyc2VyIHBhcnNlcikKK3sKKyAgRFREICogY29uc3QgZHRkID0gX2R0ZDsgIC8qIHNhdmUgb25lIGxldmVsIG9mIGluZGlyZWN0aW9uICovCisgIEhBU0hfVEFCTEVfSVRFUiBpdGVyOworICBYTUxfQm9vbCBuZWVkU2VwID0gWE1MX0ZBTFNFOworCisgIGlmIChkdGQtPmRlZmF1bHRQcmVmaXguYmluZGluZykgeworICAgIGludCBpOworICAgIGludCBsZW47CisgICAgaWYgKCFwb29sQXBwZW5kQ2hhcigmdGVtcFBvb2wsIFhNTF9UKEFTQ0lJX0VRVUFMUykpKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgbGVuID0gZHRkLT5kZWZhdWx0UHJlZml4LmJpbmRpbmctPnVyaUxlbjsKKyAgICBpZiAobmFtZXNwYWNlU2VwYXJhdG9yKQorICAgICAgbGVuLS07CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgaWYgKCFwb29sQXBwZW5kQ2hhcigmdGVtcFBvb2wsIGR0ZC0+ZGVmYXVsdFByZWZpeC5iaW5kaW5nLT51cmlbaV0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuZWVkU2VwID0gWE1MX1RSVUU7CisgIH0KKworICBoYXNoVGFibGVJdGVySW5pdCgmaXRlciwgJihkdGQtPnByZWZpeGVzKSk7CisgIGZvciAoOzspIHsKKyAgICBpbnQgaTsKKyAgICBpbnQgbGVuOworICAgIGNvbnN0IFhNTF9DaGFyICpzOworICAgIFBSRUZJWCAqcHJlZml4ID0gKFBSRUZJWCAqKWhhc2hUYWJsZUl0ZXJOZXh0KCZpdGVyKTsKKyAgICBpZiAoIXByZWZpeCkKKyAgICAgIGJyZWFrOworICAgIGlmICghcHJlZml4LT5iaW5kaW5nKQorICAgICAgY29udGludWU7CisgICAgaWYgKG5lZWRTZXAgJiYgIXBvb2xBcHBlbmRDaGFyKCZ0ZW1wUG9vbCwgQ09OVEVYVF9TRVApKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChzID0gcHJlZml4LT5uYW1lOyAqczsgcysrKQorICAgICAgaWYgKCFwb29sQXBwZW5kQ2hhcigmdGVtcFBvb2wsICpzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFwb29sQXBwZW5kQ2hhcigmdGVtcFBvb2wsIFhNTF9UKEFTQ0lJX0VRVUFMUykpKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgbGVuID0gcHJlZml4LT5iaW5kaW5nLT51cmlMZW47CisgICAgaWYgKG5hbWVzcGFjZVNlcGFyYXRvcikKKyAgICAgIGxlbi0tOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgIGlmICghcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCBwcmVmaXgtPmJpbmRpbmctPnVyaVtpXSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG5lZWRTZXAgPSBYTUxfVFJVRTsKKyAgfQorCisKKyAgaGFzaFRhYmxlSXRlckluaXQoJml0ZXIsICYoZHRkLT5nZW5lcmFsRW50aXRpZXMpKTsKKyAgZm9yICg7OykgeworICAgIGNvbnN0IFhNTF9DaGFyICpzOworICAgIEVOVElUWSAqZSA9IChFTlRJVFkgKiloYXNoVGFibGVJdGVyTmV4dCgmaXRlcik7CisgICAgaWYgKCFlKQorICAgICAgYnJlYWs7CisgICAgaWYgKCFlLT5vcGVuKQorICAgICAgY29udGludWU7CisgICAgaWYgKG5lZWRTZXAgJiYgIXBvb2xBcHBlbmRDaGFyKCZ0ZW1wUG9vbCwgQ09OVEVYVF9TRVApKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChzID0gZS0+bmFtZTsgKnM7IHMrKykKKyAgICAgIGlmICghcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCAqcykpCisgICAgICAgIHJldHVybiAwOworICAgIG5lZWRTZXAgPSBYTUxfVFJVRTsKKyAgfQorCisgIGlmICghcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCBYTUxfVCgnXDAnKSkpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiB0ZW1wUG9vbC5zdGFydDsKK30KKworc3RhdGljIFhNTF9Cb29sCitzZXRDb250ZXh0KFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBYTUxfQ2hhciAqY29udGV4dCkKK3sKKyAgRFREICogY29uc3QgZHRkID0gX2R0ZDsgIC8qIHNhdmUgb25lIGxldmVsIG9mIGluZGlyZWN0aW9uICovCisgIGNvbnN0IFhNTF9DaGFyICpzID0gY29udGV4dDsKKworICB3aGlsZSAoKmNvbnRleHQgIT0gWE1MX1QoJ1wwJykpIHsKKyAgICBpZiAoKnMgPT0gQ09OVEVYVF9TRVAgfHwgKnMgPT0gWE1MX1QoJ1wwJykpIHsKKyAgICAgIEVOVElUWSAqZTsKKyAgICAgIGlmICghcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCBYTUxfVCgnXDAnKSkpCisgICAgICAgIHJldHVybiBYTUxfRkFMU0U7CisgICAgICBlID0gKEVOVElUWSAqKWxvb2t1cCgmZHRkLT5nZW5lcmFsRW50aXRpZXMsIHBvb2xTdGFydCgmdGVtcFBvb2wpLCAwKTsKKyAgICAgIGlmIChlKQorICAgICAgICBlLT5vcGVuID0gWE1MX1RSVUU7CisgICAgICBpZiAoKnMgIT0gWE1MX1QoJ1wwJykpCisgICAgICAgIHMrKzsKKyAgICAgIGNvbnRleHQgPSBzOworICAgICAgcG9vbERpc2NhcmQoJnRlbXBQb29sKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKnMgPT0gWE1MX1QoQVNDSUlfRVFVQUxTKSkgeworICAgICAgUFJFRklYICpwcmVmaXg7CisgICAgICBpZiAocG9vbExlbmd0aCgmdGVtcFBvb2wpID09IDApCisgICAgICAgIHByZWZpeCA9ICZkdGQtPmRlZmF1bHRQcmVmaXg7CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKCFwb29sQXBwZW5kQ2hhcigmdGVtcFBvb2wsIFhNTF9UKCdcMCcpKSkKKyAgICAgICAgICByZXR1cm4gWE1MX0ZBTFNFOworICAgICAgICBwcmVmaXggPSAoUFJFRklYICopbG9va3VwKCZkdGQtPnByZWZpeGVzLCBwb29sU3RhcnQoJnRlbXBQb29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUFJFRklYKSk7CisgICAgICAgIGlmICghcHJlZml4KQorICAgICAgICAgIHJldHVybiBYTUxfRkFMU0U7CisgICAgICAgIGlmIChwcmVmaXgtPm5hbWUgPT0gcG9vbFN0YXJ0KCZ0ZW1wUG9vbCkpIHsKKyAgICAgICAgICBwcmVmaXgtPm5hbWUgPSBwb29sQ29weVN0cmluZygmZHRkLT5wb29sLCBwcmVmaXgtPm5hbWUpOworICAgICAgICAgIGlmICghcHJlZml4LT5uYW1lKQorICAgICAgICAgICAgcmV0dXJuIFhNTF9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBwb29sRGlzY2FyZCgmdGVtcFBvb2wpOworICAgICAgfQorICAgICAgZm9yIChjb250ZXh0ID0gcyArIDE7CisgICAgICAgICAgICpjb250ZXh0ICE9IENPTlRFWFRfU0VQICYmICpjb250ZXh0ICE9IFhNTF9UKCdcMCcpOworICAgICAgICAgICBjb250ZXh0KyspCisgICAgICAgIGlmICghcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCAqY29udGV4dCkpCisgICAgICAgICAgcmV0dXJuIFhNTF9GQUxTRTsKKyAgICAgIGlmICghcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCBYTUxfVCgnXDAnKSkpCisgICAgICAgIHJldHVybiBYTUxfRkFMU0U7CisgICAgICBpZiAoYWRkQmluZGluZyhwYXJzZXIsIHByZWZpeCwgTlVMTCwgcG9vbFN0YXJ0KCZ0ZW1wUG9vbCksCisgICAgICAgICAgICAgICAgICAgICAmaW5oZXJpdGVkQmluZGluZ3MpICE9IFhNTF9FUlJPUl9OT05FKQorICAgICAgICByZXR1cm4gWE1MX0ZBTFNFOworICAgICAgcG9vbERpc2NhcmQoJnRlbXBQb29sKTsKKyAgICAgIGlmICgqY29udGV4dCAhPSBYTUxfVCgnXDAnKSkKKyAgICAgICAgKytjb250ZXh0OworICAgICAgcyA9IGNvbnRleHQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKCFwb29sQXBwZW5kQ2hhcigmdGVtcFBvb2wsICpzKSkKKyAgICAgICAgcmV0dXJuIFhNTF9GQUxTRTsKKyAgICAgIHMrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFhNTF9UUlVFOworfQorCitzdGF0aWMgdm9pZCBGQVNUQ0FMTAorbm9ybWFsaXplUHVibGljSWQoWE1MX0NoYXIgKnB1YmxpY0lkKQoreworICBYTUxfQ2hhciAqcCA9IHB1YmxpY0lkOworICBYTUxfQ2hhciAqczsKKyAgZm9yIChzID0gcHVibGljSWQ7ICpzOyBzKyspIHsKKyAgICBzd2l0Y2ggKCpzKSB7CisgICAgY2FzZSAweDIwOgorICAgIGNhc2UgMHhEOgorICAgIGNhc2UgMHhBOgorICAgICAgaWYgKHAgIT0gcHVibGljSWQgJiYgcFstMV0gIT0gMHgyMCkKKyAgICAgICAgKnArKyA9IDB4MjA7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgKnArKyA9ICpzOworICAgIH0KKyAgfQorICBpZiAocCAhPSBwdWJsaWNJZCAmJiBwWy0xXSA9PSAweDIwKQorICAgIC0tcDsKKyAgKnAgPSBYTUxfVCgnXDAnKTsKK30KKworc3RhdGljIERURCAqCitkdGRDcmVhdGUoY29uc3QgWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZSAqbXMpCit7CisgIERURCAqcCA9IChEVEQgKiltcy0+bWFsbG9jX2ZjbihzaXplb2YoRFREKSk7CisgIGlmIChwID09IE5VTEwpCisgICAgcmV0dXJuIHA7CisgIHBvb2xJbml0KCYocC0+cG9vbCksIG1zKTsKKyAgcG9vbEluaXQoJihwLT5lbnRpdHlWYWx1ZVBvb2wpLCBtcyk7CisgIGhhc2hUYWJsZUluaXQoJihwLT5nZW5lcmFsRW50aXRpZXMpLCBtcyk7CisgIGhhc2hUYWJsZUluaXQoJihwLT5lbGVtZW50VHlwZXMpLCBtcyk7CisgIGhhc2hUYWJsZUluaXQoJihwLT5hdHRyaWJ1dGVJZHMpLCBtcyk7CisgIGhhc2hUYWJsZUluaXQoJihwLT5wcmVmaXhlcyksIG1zKTsKKyNpZmRlZiBYTUxfRFRECisgIHAtPnBhcmFtRW50aXR5UmVhZCA9IFhNTF9GQUxTRTsKKyAgaGFzaFRhYmxlSW5pdCgmKHAtPnBhcmFtRW50aXRpZXMpLCBtcyk7CisjZW5kaWYgLyogWE1MX0RURCAqLworICBwLT5kZWZhdWx0UHJlZml4Lm5hbWUgPSBOVUxMOworICBwLT5kZWZhdWx0UHJlZml4LmJpbmRpbmcgPSBOVUxMOworCisgIHAtPmluX2VsZGVjbCA9IFhNTF9GQUxTRTsKKyAgcC0+c2NhZmZJbmRleCA9IE5VTEw7CisgIHAtPnNjYWZmb2xkID0gTlVMTDsKKyAgcC0+c2NhZmZMZXZlbCA9IDA7CisgIHAtPnNjYWZmU2l6ZSA9IDA7CisgIHAtPnNjYWZmQ291bnQgPSAwOworICBwLT5jb250ZW50U3RyaW5nTGVuID0gMDsKKworICBwLT5rZWVwUHJvY2Vzc2luZyA9IFhNTF9UUlVFOworICBwLT5oYXNQYXJhbUVudGl0eVJlZnMgPSBYTUxfRkFMU0U7CisgIHAtPnN0YW5kYWxvbmUgPSBYTUxfRkFMU0U7CisgIHJldHVybiBwOworfQorCitzdGF0aWMgdm9pZAorZHRkUmVzZXQoRFREICpwLCBjb25zdCBYTUxfTWVtb3J5X0hhbmRsaW5nX1N1aXRlICptcykKK3sKKyAgSEFTSF9UQUJMRV9JVEVSIGl0ZXI7CisgIGhhc2hUYWJsZUl0ZXJJbml0KCZpdGVyLCAmKHAtPmVsZW1lbnRUeXBlcykpOworICBmb3IgKDs7KSB7CisgICAgRUxFTUVOVF9UWVBFICplID0gKEVMRU1FTlRfVFlQRSAqKWhhc2hUYWJsZUl0ZXJOZXh0KCZpdGVyKTsKKyAgICBpZiAoIWUpCisgICAgICBicmVhazsKKyAgICBpZiAoZS0+YWxsb2NEZWZhdWx0QXR0cyAhPSAwKQorICAgICAgbXMtPmZyZWVfZmNuKGUtPmRlZmF1bHRBdHRzKTsKKyAgfQorICBoYXNoVGFibGVDbGVhcigmKHAtPmdlbmVyYWxFbnRpdGllcykpOworI2lmZGVmIFhNTF9EVEQKKyAgcC0+cGFyYW1FbnRpdHlSZWFkID0gWE1MX0ZBTFNFOworICBoYXNoVGFibGVDbGVhcigmKHAtPnBhcmFtRW50aXRpZXMpKTsKKyNlbmRpZiAvKiBYTUxfRFREICovCisgIGhhc2hUYWJsZUNsZWFyKCYocC0+ZWxlbWVudFR5cGVzKSk7CisgIGhhc2hUYWJsZUNsZWFyKCYocC0+YXR0cmlidXRlSWRzKSk7CisgIGhhc2hUYWJsZUNsZWFyKCYocC0+cHJlZml4ZXMpKTsKKyAgcG9vbENsZWFyKCYocC0+cG9vbCkpOworICBwb29sQ2xlYXIoJihwLT5lbnRpdHlWYWx1ZVBvb2wpKTsKKyAgcC0+ZGVmYXVsdFByZWZpeC5uYW1lID0gTlVMTDsKKyAgcC0+ZGVmYXVsdFByZWZpeC5iaW5kaW5nID0gTlVMTDsKKworICBwLT5pbl9lbGRlY2wgPSBYTUxfRkFMU0U7CisKKyAgbXMtPmZyZWVfZmNuKHAtPnNjYWZmSW5kZXgpOworICBwLT5zY2FmZkluZGV4ID0gTlVMTDsKKyAgbXMtPmZyZWVfZmNuKHAtPnNjYWZmb2xkKTsKKyAgcC0+c2NhZmZvbGQgPSBOVUxMOworCisgIHAtPnNjYWZmTGV2ZWwgPSAwOworICBwLT5zY2FmZlNpemUgPSAwOworICBwLT5zY2FmZkNvdW50ID0gMDsKKyAgcC0+Y29udGVudFN0cmluZ0xlbiA9IDA7CisKKyAgcC0+a2VlcFByb2Nlc3NpbmcgPSBYTUxfVFJVRTsKKyAgcC0+aGFzUGFyYW1FbnRpdHlSZWZzID0gWE1MX0ZBTFNFOworICBwLT5zdGFuZGFsb25lID0gWE1MX0ZBTFNFOworfQorCitzdGF0aWMgdm9pZAorZHRkRGVzdHJveShEVEQgKnAsIFhNTF9Cb29sIGlzRG9jRW50aXR5LCBjb25zdCBYTUxfTWVtb3J5X0hhbmRsaW5nX1N1aXRlICptcykKK3sKKyAgSEFTSF9UQUJMRV9JVEVSIGl0ZXI7CisgIGhhc2hUYWJsZUl0ZXJJbml0KCZpdGVyLCAmKHAtPmVsZW1lbnRUeXBlcykpOworICBmb3IgKDs7KSB7CisgICAgRUxFTUVOVF9UWVBFICplID0gKEVMRU1FTlRfVFlQRSAqKWhhc2hUYWJsZUl0ZXJOZXh0KCZpdGVyKTsKKyAgICBpZiAoIWUpCisgICAgICBicmVhazsKKyAgICBpZiAoZS0+YWxsb2NEZWZhdWx0QXR0cyAhPSAwKQorICAgICAgbXMtPmZyZWVfZmNuKGUtPmRlZmF1bHRBdHRzKTsKKyAgfQorICBoYXNoVGFibGVEZXN0cm95KCYocC0+Z2VuZXJhbEVudGl0aWVzKSk7CisjaWZkZWYgWE1MX0RURAorICBoYXNoVGFibGVEZXN0cm95KCYocC0+cGFyYW1FbnRpdGllcykpOworI2VuZGlmIC8qIFhNTF9EVEQgKi8KKyAgaGFzaFRhYmxlRGVzdHJveSgmKHAtPmVsZW1lbnRUeXBlcykpOworICBoYXNoVGFibGVEZXN0cm95KCYocC0+YXR0cmlidXRlSWRzKSk7CisgIGhhc2hUYWJsZURlc3Ryb3koJihwLT5wcmVmaXhlcykpOworICBwb29sRGVzdHJveSgmKHAtPnBvb2wpKTsKKyAgcG9vbERlc3Ryb3koJihwLT5lbnRpdHlWYWx1ZVBvb2wpKTsKKyAgaWYgKGlzRG9jRW50aXR5KSB7CisgICAgbXMtPmZyZWVfZmNuKHAtPnNjYWZmSW5kZXgpOworICAgIG1zLT5mcmVlX2ZjbihwLT5zY2FmZm9sZCk7CisgIH0KKyAgbXMtPmZyZWVfZmNuKHApOworfQorCisvKiBEbyBhIGRlZXAgY29weSBvZiB0aGUgRFRELiBSZXR1cm4gMCBmb3Igb3V0IG9mIG1lbW9yeSwgbm9uLXplcm8gb3RoZXJ3aXNlLgorICAgVGhlIG5ldyBEVEQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KKyovCitzdGF0aWMgaW50CitkdGRDb3B5KERURCAqbmV3RHRkLCBjb25zdCBEVEQgKm9sZER0ZCwgY29uc3QgWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZSAqbXMpCit7CisgIEhBU0hfVEFCTEVfSVRFUiBpdGVyOworCisgIC8qIENvcHkgdGhlIHByZWZpeCB0YWJsZS4gKi8KKworICBoYXNoVGFibGVJdGVySW5pdCgmaXRlciwgJihvbGREdGQtPnByZWZpeGVzKSk7CisgIGZvciAoOzspIHsKKyAgICBjb25zdCBYTUxfQ2hhciAqbmFtZTsKKyAgICBjb25zdCBQUkVGSVggKm9sZFAgPSAoUFJFRklYICopaGFzaFRhYmxlSXRlck5leHQoJml0ZXIpOworICAgIGlmICghb2xkUCkKKyAgICAgIGJyZWFrOworICAgIG5hbWUgPSBwb29sQ29weVN0cmluZygmKG5ld0R0ZC0+cG9vbCksIG9sZFAtPm5hbWUpOworICAgIGlmICghbmFtZSkKKyAgICAgIHJldHVybiAwOworICAgIGlmICghbG9va3VwKCYobmV3RHRkLT5wcmVmaXhlcyksIG5hbWUsIHNpemVvZihQUkVGSVgpKSkKKyAgICAgIHJldHVybiAwOworICB9CisKKyAgaGFzaFRhYmxlSXRlckluaXQoJml0ZXIsICYob2xkRHRkLT5hdHRyaWJ1dGVJZHMpKTsKKworICAvKiBDb3B5IHRoZSBhdHRyaWJ1dGUgaWQgdGFibGUuICovCisKKyAgZm9yICg7OykgeworICAgIEFUVFJJQlVURV9JRCAqbmV3QTsKKyAgICBjb25zdCBYTUxfQ2hhciAqbmFtZTsKKyAgICBjb25zdCBBVFRSSUJVVEVfSUQgKm9sZEEgPSAoQVRUUklCVVRFX0lEICopaGFzaFRhYmxlSXRlck5leHQoJml0ZXIpOworCisgICAgaWYgKCFvbGRBKQorICAgICAgYnJlYWs7CisgICAgLyogUmVtZW1iZXIgdG8gYWxsb2NhdGUgdGhlIHNjcmF0Y2ggYnl0ZSBiZWZvcmUgdGhlIG5hbWUuICovCisgICAgaWYgKCFwb29sQXBwZW5kQ2hhcigmKG5ld0R0ZC0+cG9vbCksIFhNTF9UKCdcMCcpKSkKKyAgICAgIHJldHVybiAwOworICAgIG5hbWUgPSBwb29sQ29weVN0cmluZygmKG5ld0R0ZC0+cG9vbCksIG9sZEEtPm5hbWUpOworICAgIGlmICghbmFtZSkKKyAgICAgIHJldHVybiAwOworICAgICsrbmFtZTsKKyAgICBuZXdBID0gKEFUVFJJQlVURV9JRCAqKWxvb2t1cCgmKG5ld0R0ZC0+YXR0cmlidXRlSWRzKSwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQVRUUklCVVRFX0lEKSk7CisgICAgaWYgKCFuZXdBKQorICAgICAgcmV0dXJuIDA7CisgICAgbmV3QS0+bWF5YmVUb2tlbml6ZWQgPSBvbGRBLT5tYXliZVRva2VuaXplZDsKKyAgICBpZiAob2xkQS0+cHJlZml4KSB7CisgICAgICBuZXdBLT54bWxucyA9IG9sZEEtPnhtbG5zOworICAgICAgaWYgKG9sZEEtPnByZWZpeCA9PSAmb2xkRHRkLT5kZWZhdWx0UHJlZml4KQorICAgICAgICBuZXdBLT5wcmVmaXggPSAmbmV3RHRkLT5kZWZhdWx0UHJlZml4OworICAgICAgZWxzZQorICAgICAgICBuZXdBLT5wcmVmaXggPSAoUFJFRklYICopbG9va3VwKCYobmV3RHRkLT5wcmVmaXhlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkQS0+cHJlZml4LT5uYW1lLCAwKTsKKyAgICB9CisgIH0KKworICAvKiBDb3B5IHRoZSBlbGVtZW50IHR5cGUgdGFibGUuICovCisKKyAgaGFzaFRhYmxlSXRlckluaXQoJml0ZXIsICYob2xkRHRkLT5lbGVtZW50VHlwZXMpKTsKKworICBmb3IgKDs7KSB7CisgICAgaW50IGk7CisgICAgRUxFTUVOVF9UWVBFICpuZXdFOworICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lOworICAgIGNvbnN0IEVMRU1FTlRfVFlQRSAqb2xkRSA9IChFTEVNRU5UX1RZUEUgKiloYXNoVGFibGVJdGVyTmV4dCgmaXRlcik7CisgICAgaWYgKCFvbGRFKQorICAgICAgYnJlYWs7CisgICAgbmFtZSA9IHBvb2xDb3B5U3RyaW5nKCYobmV3RHRkLT5wb29sKSwgb2xkRS0+bmFtZSk7CisgICAgaWYgKCFuYW1lKQorICAgICAgcmV0dXJuIDA7CisgICAgbmV3RSA9IChFTEVNRU5UX1RZUEUgKilsb29rdXAoJihuZXdEdGQtPmVsZW1lbnRUeXBlcyksIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEVMRU1FTlRfVFlQRSkpOworICAgIGlmICghbmV3RSkKKyAgICAgIHJldHVybiAwOworICAgIGlmIChvbGRFLT5uRGVmYXVsdEF0dHMpIHsKKyAgICAgIG5ld0UtPmRlZmF1bHRBdHRzID0gKERFRkFVTFRfQVRUUklCVVRFICopCisgICAgICAgICAgbXMtPm1hbGxvY19mY24ob2xkRS0+bkRlZmF1bHRBdHRzICogc2l6ZW9mKERFRkFVTFRfQVRUUklCVVRFKSk7CisgICAgICBpZiAoIW5ld0UtPmRlZmF1bHRBdHRzKSB7CisgICAgICAgIG1zLT5mcmVlX2ZjbihuZXdFKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorICAgIGlmIChvbGRFLT5pZEF0dCkKKyAgICAgIG5ld0UtPmlkQXR0ID0gKEFUVFJJQlVURV9JRCAqKQorICAgICAgICAgIGxvb2t1cCgmKG5ld0R0ZC0+YXR0cmlidXRlSWRzKSwgb2xkRS0+aWRBdHQtPm5hbWUsIDApOworICAgIG5ld0UtPmFsbG9jRGVmYXVsdEF0dHMgPSBuZXdFLT5uRGVmYXVsdEF0dHMgPSBvbGRFLT5uRGVmYXVsdEF0dHM7CisgICAgaWYgKG9sZEUtPnByZWZpeCkKKyAgICAgIG5ld0UtPnByZWZpeCA9IChQUkVGSVggKilsb29rdXAoJihuZXdEdGQtPnByZWZpeGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkRS0+cHJlZml4LT5uYW1lLCAwKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmV3RS0+bkRlZmF1bHRBdHRzOyBpKyspIHsKKyAgICAgIG5ld0UtPmRlZmF1bHRBdHRzW2ldLmlkID0gKEFUVFJJQlVURV9JRCAqKQorICAgICAgICAgIGxvb2t1cCgmKG5ld0R0ZC0+YXR0cmlidXRlSWRzKSwgb2xkRS0+ZGVmYXVsdEF0dHNbaV0uaWQtPm5hbWUsIDApOworICAgICAgbmV3RS0+ZGVmYXVsdEF0dHNbaV0uaXNDZGF0YSA9IG9sZEUtPmRlZmF1bHRBdHRzW2ldLmlzQ2RhdGE7CisgICAgICBpZiAob2xkRS0+ZGVmYXVsdEF0dHNbaV0udmFsdWUpIHsKKyAgICAgICAgbmV3RS0+ZGVmYXVsdEF0dHNbaV0udmFsdWUKKyAgICAgICAgICAgID0gcG9vbENvcHlTdHJpbmcoJihuZXdEdGQtPnBvb2wpLCBvbGRFLT5kZWZhdWx0QXR0c1tpXS52YWx1ZSk7CisgICAgICAgIGlmICghbmV3RS0+ZGVmYXVsdEF0dHNbaV0udmFsdWUpCisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIG5ld0UtPmRlZmF1bHRBdHRzW2ldLnZhbHVlID0gTlVMTDsKKyAgICB9CisgIH0KKworICAvKiBDb3B5IHRoZSBlbnRpdHkgdGFibGVzLiAqLworICBpZiAoIWNvcHlFbnRpdHlUYWJsZSgmKG5ld0R0ZC0+Z2VuZXJhbEVudGl0aWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgJihuZXdEdGQtPnBvb2wpLAorICAgICAgICAgICAgICAgICAgICAgICAmKG9sZER0ZC0+Z2VuZXJhbEVudGl0aWVzKSkpCisgICAgICByZXR1cm4gMDsKKworI2lmZGVmIFhNTF9EVEQKKyAgaWYgKCFjb3B5RW50aXR5VGFibGUoJihuZXdEdGQtPnBhcmFtRW50aXRpZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAmKG5ld0R0ZC0+cG9vbCksCisgICAgICAgICAgICAgICAgICAgICAgICYob2xkRHRkLT5wYXJhbUVudGl0aWVzKSkpCisgICAgICByZXR1cm4gMDsKKyAgbmV3RHRkLT5wYXJhbUVudGl0eVJlYWQgPSBvbGREdGQtPnBhcmFtRW50aXR5UmVhZDsKKyNlbmRpZiAvKiBYTUxfRFREICovCisKKyAgbmV3RHRkLT5rZWVwUHJvY2Vzc2luZyA9IG9sZER0ZC0+a2VlcFByb2Nlc3Npbmc7CisgIG5ld0R0ZC0+aGFzUGFyYW1FbnRpdHlSZWZzID0gb2xkRHRkLT5oYXNQYXJhbUVudGl0eVJlZnM7CisgIG5ld0R0ZC0+c3RhbmRhbG9uZSA9IG9sZER0ZC0+c3RhbmRhbG9uZTsKKworICAvKiBEb24ndCB3YW50IGRlZXAgY29weWluZyBmb3Igc2NhZmZvbGRpbmcgKi8KKyAgbmV3RHRkLT5pbl9lbGRlY2wgPSBvbGREdGQtPmluX2VsZGVjbDsKKyAgbmV3RHRkLT5zY2FmZm9sZCA9IG9sZER0ZC0+c2NhZmZvbGQ7CisgIG5ld0R0ZC0+Y29udGVudFN0cmluZ0xlbiA9IG9sZER0ZC0+Y29udGVudFN0cmluZ0xlbjsKKyAgbmV3RHRkLT5zY2FmZlNpemUgPSBvbGREdGQtPnNjYWZmU2l6ZTsKKyAgbmV3RHRkLT5zY2FmZkxldmVsID0gb2xkRHRkLT5zY2FmZkxldmVsOworICBuZXdEdGQtPnNjYWZmSW5kZXggPSBvbGREdGQtPnNjYWZmSW5kZXg7CisKKyAgcmV0dXJuIDE7Cit9ICAvKiBFbmQgZHRkQ29weSAqLworCitzdGF0aWMgaW50Citjb3B5RW50aXR5VGFibGUoSEFTSF9UQUJMRSAqbmV3VGFibGUsCisgICAgICAgICAgICAgICAgU1RSSU5HX1BPT0wgKm5ld1Bvb2wsCisgICAgICAgICAgICAgICAgY29uc3QgSEFTSF9UQUJMRSAqb2xkVGFibGUpCit7CisgIEhBU0hfVEFCTEVfSVRFUiBpdGVyOworICBjb25zdCBYTUxfQ2hhciAqY2FjaGVkT2xkQmFzZSA9IE5VTEw7CisgIGNvbnN0IFhNTF9DaGFyICpjYWNoZWROZXdCYXNlID0gTlVMTDsKKworICBoYXNoVGFibGVJdGVySW5pdCgmaXRlciwgb2xkVGFibGUpOworCisgIGZvciAoOzspIHsKKyAgICBFTlRJVFkgKm5ld0U7CisgICAgY29uc3QgWE1MX0NoYXIgKm5hbWU7CisgICAgY29uc3QgRU5USVRZICpvbGRFID0gKEVOVElUWSAqKWhhc2hUYWJsZUl0ZXJOZXh0KCZpdGVyKTsKKyAgICBpZiAoIW9sZEUpCisgICAgICBicmVhazsKKyAgICBuYW1lID0gcG9vbENvcHlTdHJpbmcobmV3UG9vbCwgb2xkRS0+bmFtZSk7CisgICAgaWYgKCFuYW1lKQorICAgICAgcmV0dXJuIDA7CisgICAgbmV3RSA9IChFTlRJVFkgKilsb29rdXAobmV3VGFibGUsIG5hbWUsIHNpemVvZihFTlRJVFkpKTsKKyAgICBpZiAoIW5ld0UpCisgICAgICByZXR1cm4gMDsKKyAgICBpZiAob2xkRS0+c3lzdGVtSWQpIHsKKyAgICAgIGNvbnN0IFhNTF9DaGFyICp0ZW0gPSBwb29sQ29weVN0cmluZyhuZXdQb29sLCBvbGRFLT5zeXN0ZW1JZCk7CisgICAgICBpZiAoIXRlbSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBuZXdFLT5zeXN0ZW1JZCA9IHRlbTsKKyAgICAgIGlmIChvbGRFLT5iYXNlKSB7CisgICAgICAgIGlmIChvbGRFLT5iYXNlID09IGNhY2hlZE9sZEJhc2UpCisgICAgICAgICAgbmV3RS0+YmFzZSA9IGNhY2hlZE5ld0Jhc2U7CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGNhY2hlZE9sZEJhc2UgPSBvbGRFLT5iYXNlOworICAgICAgICAgIHRlbSA9IHBvb2xDb3B5U3RyaW5nKG5ld1Bvb2wsIGNhY2hlZE9sZEJhc2UpOworICAgICAgICAgIGlmICghdGVtKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgY2FjaGVkTmV3QmFzZSA9IG5ld0UtPmJhc2UgPSB0ZW07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChvbGRFLT5wdWJsaWNJZCkgeworICAgICAgICB0ZW0gPSBwb29sQ29weVN0cmluZyhuZXdQb29sLCBvbGRFLT5wdWJsaWNJZCk7CisgICAgICAgIGlmICghdGVtKQorICAgICAgICAgIHJldHVybiAwOworICAgICAgICBuZXdFLT5wdWJsaWNJZCA9IHRlbTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBjb25zdCBYTUxfQ2hhciAqdGVtID0gcG9vbENvcHlTdHJpbmdOKG5ld1Bvb2wsIG9sZEUtPnRleHRQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZEUtPnRleHRMZW4pOworICAgICAgaWYgKCF0ZW0pCisgICAgICAgIHJldHVybiAwOworICAgICAgbmV3RS0+dGV4dFB0ciA9IHRlbTsKKyAgICAgIG5ld0UtPnRleHRMZW4gPSBvbGRFLT50ZXh0TGVuOworICAgIH0KKyAgICBpZiAob2xkRS0+bm90YXRpb24pIHsKKyAgICAgIGNvbnN0IFhNTF9DaGFyICp0ZW0gPSBwb29sQ29weVN0cmluZyhuZXdQb29sLCBvbGRFLT5ub3RhdGlvbik7CisgICAgICBpZiAoIXRlbSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBuZXdFLT5ub3RhdGlvbiA9IHRlbTsKKyAgICB9CisgICAgbmV3RS0+aXNfcGFyYW0gPSBvbGRFLT5pc19wYXJhbTsKKyAgICBuZXdFLT5pc19pbnRlcm5hbCA9IG9sZEUtPmlzX2ludGVybmFsOworICB9CisgIHJldHVybiAxOworfQorCisjZGVmaW5lIElOSVRfUE9XRVIgNgorCitzdGF0aWMgWE1MX0Jvb2wgRkFTVENBTEwKK2tleWVxKEtFWSBzMSwgS0VZIHMyKQoreworICBmb3IgKDsgKnMxID09ICpzMjsgczErKywgczIrKykKKyAgICBpZiAoKnMxID09IDApCisgICAgICByZXR1cm4gWE1MX1RSVUU7CisgIHJldHVybiBYTUxfRkFMU0U7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIEZBU1RDQUxMCitoYXNoKEtFWSBzKQoreworICB1bnNpZ25lZCBsb25nIGggPSAwOworICB3aGlsZSAoKnMpCisgICAgaCA9IENIQVJfSEFTSChoLCAqcysrKTsKKyAgcmV0dXJuIGg7Cit9CisKK3N0YXRpYyBOQU1FRCAqCitsb29rdXAoSEFTSF9UQUJMRSAqdGFibGUsIEtFWSBuYW1lLCBzaXplX3QgY3JlYXRlU2l6ZSkKK3sKKyAgc2l6ZV90IGk7CisgIGlmICh0YWJsZS0+c2l6ZSA9PSAwKSB7CisgICAgc2l6ZV90IHRzaXplOworICAgIGlmICghY3JlYXRlU2l6ZSkKKyAgICAgIHJldHVybiBOVUxMOworICAgIHRhYmxlLT5wb3dlciA9IElOSVRfUE9XRVI7CisgICAgLyogdGFibGUtPnNpemUgaXMgYSBwb3dlciBvZiAyICovCisgICAgdGFibGUtPnNpemUgPSAoc2l6ZV90KTEgPDwgSU5JVF9QT1dFUjsKKyAgICB0c2l6ZSA9IHRhYmxlLT5zaXplICogc2l6ZW9mKE5BTUVEICopOworICAgIHRhYmxlLT52ID0gKE5BTUVEICoqKXRhYmxlLT5tZW0tPm1hbGxvY19mY24odHNpemUpOworICAgIGlmICghdGFibGUtPnYpIHsKKyAgICAgIHRhYmxlLT5zaXplID0gMDsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtZW1zZXQodGFibGUtPnYsIDAsIHRzaXplKTsKKyAgICBpID0gaGFzaChuYW1lKSAmICgodW5zaWduZWQgbG9uZyl0YWJsZS0+c2l6ZSAtIDEpOworICB9CisgIGVsc2UgeworICAgIHVuc2lnbmVkIGxvbmcgaCA9IGhhc2gobmFtZSk7CisgICAgdW5zaWduZWQgbG9uZyBtYXNrID0gKHVuc2lnbmVkIGxvbmcpdGFibGUtPnNpemUgLSAxOworICAgIHVuc2lnbmVkIGNoYXIgc3RlcCA9IDA7CisgICAgaSA9IGggJiBtYXNrOworICAgIHdoaWxlICh0YWJsZS0+dltpXSkgeworICAgICAgaWYgKGtleWVxKG5hbWUsIHRhYmxlLT52W2ldLT5uYW1lKSkKKyAgICAgICAgcmV0dXJuIHRhYmxlLT52W2ldOworICAgICAgaWYgKCFzdGVwKQorICAgICAgICBzdGVwID0gUFJPQkVfU1RFUChoLCBtYXNrLCB0YWJsZS0+cG93ZXIpOworICAgICAgaSA8IHN0ZXAgPyAoaSArPSB0YWJsZS0+c2l6ZSAtIHN0ZXApIDogKGkgLT0gc3RlcCk7CisgICAgfQorICAgIGlmICghY3JlYXRlU2l6ZSkKKyAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogY2hlY2sgZm9yIG92ZXJmbG93ICh0YWJsZSBpcyBoYWxmIGZ1bGwpICovCisgICAgaWYgKHRhYmxlLT51c2VkID4+ICh0YWJsZS0+cG93ZXIgLSAxKSkgeworICAgICAgdW5zaWduZWQgY2hhciBuZXdQb3dlciA9IHRhYmxlLT5wb3dlciArIDE7CisgICAgICBzaXplX3QgbmV3U2l6ZSA9IChzaXplX3QpMSA8PCBuZXdQb3dlcjsKKyAgICAgIHVuc2lnbmVkIGxvbmcgbmV3TWFzayA9ICh1bnNpZ25lZCBsb25nKW5ld1NpemUgLSAxOworICAgICAgc2l6ZV90IHRzaXplID0gbmV3U2l6ZSAqIHNpemVvZihOQU1FRCAqKTsKKyAgICAgIE5BTUVEICoqbmV3ViA9IChOQU1FRCAqKil0YWJsZS0+bWVtLT5tYWxsb2NfZmNuKHRzaXplKTsKKyAgICAgIGlmICghbmV3VikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICBtZW1zZXQobmV3ViwgMCwgdHNpemUpOworICAgICAgZm9yIChpID0gMDsgaSA8IHRhYmxlLT5zaXplOyBpKyspCisgICAgICAgIGlmICh0YWJsZS0+dltpXSkgeworICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbmV3SGFzaCA9IGhhc2godGFibGUtPnZbaV0tPm5hbWUpOworICAgICAgICAgIHNpemVfdCBqID0gbmV3SGFzaCAmIG5ld01hc2s7CisgICAgICAgICAgc3RlcCA9IDA7CisgICAgICAgICAgd2hpbGUgKG5ld1Zbal0pIHsKKyAgICAgICAgICAgIGlmICghc3RlcCkKKyAgICAgICAgICAgICAgc3RlcCA9IFBST0JFX1NURVAobmV3SGFzaCwgbmV3TWFzaywgbmV3UG93ZXIpOworICAgICAgICAgICAgaiA8IHN0ZXAgPyAoaiArPSBuZXdTaXplIC0gc3RlcCkgOiAoaiAtPSBzdGVwKTsKKyAgICAgICAgICB9CisgICAgICAgICAgbmV3VltqXSA9IHRhYmxlLT52W2ldOworICAgICAgICB9CisgICAgICB0YWJsZS0+bWVtLT5mcmVlX2Zjbih0YWJsZS0+dik7CisgICAgICB0YWJsZS0+diA9IG5ld1Y7CisgICAgICB0YWJsZS0+cG93ZXIgPSBuZXdQb3dlcjsKKyAgICAgIHRhYmxlLT5zaXplID0gbmV3U2l6ZTsKKyAgICAgIGkgPSBoICYgbmV3TWFzazsKKyAgICAgIHN0ZXAgPSAwOworICAgICAgd2hpbGUgKHRhYmxlLT52W2ldKSB7CisgICAgICAgIGlmICghc3RlcCkKKyAgICAgICAgICBzdGVwID0gUFJPQkVfU1RFUChoLCBuZXdNYXNrLCBuZXdQb3dlcik7CisgICAgICAgIGkgPCBzdGVwID8gKGkgKz0gbmV3U2l6ZSAtIHN0ZXApIDogKGkgLT0gc3RlcCk7CisgICAgICB9CisgICAgfQorICB9CisgIHRhYmxlLT52W2ldID0gKE5BTUVEICopdGFibGUtPm1lbS0+bWFsbG9jX2ZjbihjcmVhdGVTaXplKTsKKyAgaWYgKCF0YWJsZS0+dltpXSkKKyAgICByZXR1cm4gTlVMTDsKKyAgbWVtc2V0KHRhYmxlLT52W2ldLCAwLCBjcmVhdGVTaXplKTsKKyAgdGFibGUtPnZbaV0tPm5hbWUgPSBuYW1lOworICAodGFibGUtPnVzZWQpKys7CisgIHJldHVybiB0YWJsZS0+dltpXTsKK30KKworc3RhdGljIHZvaWQgRkFTVENBTEwKK2hhc2hUYWJsZUNsZWFyKEhBU0hfVEFCTEUgKnRhYmxlKQoreworICBzaXplX3QgaTsKKyAgZm9yIChpID0gMDsgaSA8IHRhYmxlLT5zaXplOyBpKyspIHsKKyAgICB0YWJsZS0+bWVtLT5mcmVlX2Zjbih0YWJsZS0+dltpXSk7CisgICAgdGFibGUtPnZbaV0gPSBOVUxMOworICB9CisgIHRhYmxlLT51c2VkID0gMDsKK30KKworc3RhdGljIHZvaWQgRkFTVENBTEwKK2hhc2hUYWJsZURlc3Ryb3koSEFTSF9UQUJMRSAqdGFibGUpCit7CisgIHNpemVfdCBpOworICBmb3IgKGkgPSAwOyBpIDwgdGFibGUtPnNpemU7IGkrKykKKyAgICB0YWJsZS0+bWVtLT5mcmVlX2Zjbih0YWJsZS0+dltpXSk7CisgIHRhYmxlLT5tZW0tPmZyZWVfZmNuKHRhYmxlLT52KTsKK30KKworc3RhdGljIHZvaWQgRkFTVENBTEwKK2hhc2hUYWJsZUluaXQoSEFTSF9UQUJMRSAqcCwgY29uc3QgWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZSAqbXMpCit7CisgIHAtPnBvd2VyID0gMDsKKyAgcC0+c2l6ZSA9IDA7CisgIHAtPnVzZWQgPSAwOworICBwLT52ID0gTlVMTDsKKyAgcC0+bWVtID0gbXM7Cit9CisKK3N0YXRpYyB2b2lkIEZBU1RDQUxMCitoYXNoVGFibGVJdGVySW5pdChIQVNIX1RBQkxFX0lURVIgKml0ZXIsIGNvbnN0IEhBU0hfVEFCTEUgKnRhYmxlKQoreworICBpdGVyLT5wID0gdGFibGUtPnY7CisgIGl0ZXItPmVuZCA9IGl0ZXItPnAgKyB0YWJsZS0+c2l6ZTsKK30KKworc3RhdGljIE5BTUVEICogRkFTVENBTEwKK2hhc2hUYWJsZUl0ZXJOZXh0KEhBU0hfVEFCTEVfSVRFUiAqaXRlcikKK3sKKyAgd2hpbGUgKGl0ZXItPnAgIT0gaXRlci0+ZW5kKSB7CisgICAgTkFNRUQgKnRlbSA9ICooaXRlci0+cCkrKzsKKyAgICBpZiAodGVtKQorICAgICAgcmV0dXJuIHRlbTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgRkFTVENBTEwKK3Bvb2xJbml0KFNUUklOR19QT09MICpwb29sLCBjb25zdCBYTUxfTWVtb3J5X0hhbmRsaW5nX1N1aXRlICptcykKK3sKKyAgcG9vbC0+YmxvY2tzID0gTlVMTDsKKyAgcG9vbC0+ZnJlZUJsb2NrcyA9IE5VTEw7CisgIHBvb2wtPnN0YXJ0ID0gTlVMTDsKKyAgcG9vbC0+cHRyID0gTlVMTDsKKyAgcG9vbC0+ZW5kID0gTlVMTDsKKyAgcG9vbC0+bWVtID0gbXM7Cit9CisKK3N0YXRpYyB2b2lkIEZBU1RDQUxMCitwb29sQ2xlYXIoU1RSSU5HX1BPT0wgKnBvb2wpCit7CisgIGlmICghcG9vbC0+ZnJlZUJsb2NrcykKKyAgICBwb29sLT5mcmVlQmxvY2tzID0gcG9vbC0+YmxvY2tzOworICBlbHNlIHsKKyAgICBCTE9DSyAqcCA9IHBvb2wtPmJsb2NrczsKKyAgICB3aGlsZSAocCkgeworICAgICAgQkxPQ0sgKnRlbSA9IHAtPm5leHQ7CisgICAgICBwLT5uZXh0ID0gcG9vbC0+ZnJlZUJsb2NrczsKKyAgICAgIHBvb2wtPmZyZWVCbG9ja3MgPSBwOworICAgICAgcCA9IHRlbTsKKyAgICB9CisgIH0KKyAgcG9vbC0+YmxvY2tzID0gTlVMTDsKKyAgcG9vbC0+c3RhcnQgPSBOVUxMOworICBwb29sLT5wdHIgPSBOVUxMOworICBwb29sLT5lbmQgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBGQVNUQ0FMTAorcG9vbERlc3Ryb3koU1RSSU5HX1BPT0wgKnBvb2wpCit7CisgIEJMT0NLICpwID0gcG9vbC0+YmxvY2tzOworICB3aGlsZSAocCkgeworICAgIEJMT0NLICp0ZW0gPSBwLT5uZXh0OworICAgIHBvb2wtPm1lbS0+ZnJlZV9mY24ocCk7CisgICAgcCA9IHRlbTsKKyAgfQorICBwID0gcG9vbC0+ZnJlZUJsb2NrczsKKyAgd2hpbGUgKHApIHsKKyAgICBCTE9DSyAqdGVtID0gcC0+bmV4dDsKKyAgICBwb29sLT5tZW0tPmZyZWVfZmNuKHApOworICAgIHAgPSB0ZW07CisgIH0KK30KKworc3RhdGljIFhNTF9DaGFyICoKK3Bvb2xBcHBlbmQoU1RSSU5HX1BPT0wgKnBvb2wsIGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kKQoreworICBpZiAoIXBvb2wtPnB0ciAmJiAhcG9vbEdyb3cocG9vbCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoOzspIHsKKyAgICBYbWxDb252ZXJ0KGVuYywgJnB0ciwgZW5kLCAoSUNIQVIgKiopJihwb29sLT5wdHIpLCAoSUNIQVIgKilwb29sLT5lbmQpOworICAgIGlmIChwdHIgPT0gZW5kKQorICAgICAgYnJlYWs7CisgICAgaWYgKCFwb29sR3Jvdyhwb29sKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBwb29sLT5zdGFydDsKK30KKworc3RhdGljIGNvbnN0IFhNTF9DaGFyICogRkFTVENBTEwKK3Bvb2xDb3B5U3RyaW5nKFNUUklOR19QT09MICpwb29sLCBjb25zdCBYTUxfQ2hhciAqcykKK3sKKyAgZG8geworICAgIGlmICghcG9vbEFwcGVuZENoYXIocG9vbCwgKnMpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0gd2hpbGUgKCpzKyspOworICBzID0gcG9vbC0+c3RhcnQ7CisgIHBvb2xGaW5pc2gocG9vbCk7CisgIHJldHVybiBzOworfQorCitzdGF0aWMgY29uc3QgWE1MX0NoYXIgKgorcG9vbENvcHlTdHJpbmdOKFNUUklOR19QT09MICpwb29sLCBjb25zdCBYTUxfQ2hhciAqcywgaW50IG4pCit7CisgIGlmICghcG9vbC0+cHRyICYmICFwb29sR3Jvdyhwb29sKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yICg7IG4gPiAwOyAtLW4sIHMrKykgeworICAgIGlmICghcG9vbEFwcGVuZENoYXIocG9vbCwgKnMpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcyA9IHBvb2wtPnN0YXJ0OworICBwb29sRmluaXNoKHBvb2wpOworICByZXR1cm4gczsKK30KKworc3RhdGljIGNvbnN0IFhNTF9DaGFyICogRkFTVENBTEwKK3Bvb2xBcHBlbmRTdHJpbmcoU1RSSU5HX1BPT0wgKnBvb2wsIGNvbnN0IFhNTF9DaGFyICpzKQoreworICB3aGlsZSAoKnMpIHsKKyAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKHBvb2wsICpzKSkKKyAgICAgIHJldHVybiBOVUxMOworICAgIHMrKzsKKyAgfQorICByZXR1cm4gcG9vbC0+c3RhcnQ7Cit9CisKK3N0YXRpYyBYTUxfQ2hhciAqCitwb29sU3RvcmVTdHJpbmcoU1RSSU5HX1BPT0wgKnBvb2wsIGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQpCit7CisgIGlmICghcG9vbEFwcGVuZChwb29sLCBlbmMsIHB0ciwgZW5kKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKHBvb2wtPnB0ciA9PSBwb29sLT5lbmQgJiYgIXBvb2xHcm93KHBvb2wpKQorICAgIHJldHVybiBOVUxMOworICAqKHBvb2wtPnB0cikrKyA9IDA7CisgIHJldHVybiBwb29sLT5zdGFydDsKK30KKworc3RhdGljIFhNTF9Cb29sIEZBU1RDQUxMCitwb29sR3JvdyhTVFJJTkdfUE9PTCAqcG9vbCkKK3sKKyAgaWYgKHBvb2wtPmZyZWVCbG9ja3MpIHsKKyAgICBpZiAocG9vbC0+c3RhcnQgPT0gMCkgeworICAgICAgcG9vbC0+YmxvY2tzID0gcG9vbC0+ZnJlZUJsb2NrczsKKyAgICAgIHBvb2wtPmZyZWVCbG9ja3MgPSBwb29sLT5mcmVlQmxvY2tzLT5uZXh0OworICAgICAgcG9vbC0+YmxvY2tzLT5uZXh0ID0gTlVMTDsKKyAgICAgIHBvb2wtPnN0YXJ0ID0gcG9vbC0+YmxvY2tzLT5zOworICAgICAgcG9vbC0+ZW5kID0gcG9vbC0+c3RhcnQgKyBwb29sLT5ibG9ja3MtPnNpemU7CisgICAgICBwb29sLT5wdHIgPSBwb29sLT5zdGFydDsKKyAgICAgIHJldHVybiBYTUxfVFJVRTsKKyAgICB9CisgICAgaWYgKHBvb2wtPmVuZCAtIHBvb2wtPnN0YXJ0IDwgcG9vbC0+ZnJlZUJsb2Nrcy0+c2l6ZSkgeworICAgICAgQkxPQ0sgKnRlbSA9IHBvb2wtPmZyZWVCbG9ja3MtPm5leHQ7CisgICAgICBwb29sLT5mcmVlQmxvY2tzLT5uZXh0ID0gcG9vbC0+YmxvY2tzOworICAgICAgcG9vbC0+YmxvY2tzID0gcG9vbC0+ZnJlZUJsb2NrczsKKyAgICAgIHBvb2wtPmZyZWVCbG9ja3MgPSB0ZW07CisgICAgICBtZW1jcHkocG9vbC0+YmxvY2tzLT5zLCBwb29sLT5zdGFydCwKKyAgICAgICAgICAgICAocG9vbC0+ZW5kIC0gcG9vbC0+c3RhcnQpICogc2l6ZW9mKFhNTF9DaGFyKSk7CisgICAgICBwb29sLT5wdHIgPSBwb29sLT5ibG9ja3MtPnMgKyAocG9vbC0+cHRyIC0gcG9vbC0+c3RhcnQpOworICAgICAgcG9vbC0+c3RhcnQgPSBwb29sLT5ibG9ja3MtPnM7CisgICAgICBwb29sLT5lbmQgPSBwb29sLT5zdGFydCArIHBvb2wtPmJsb2Nrcy0+c2l6ZTsKKyAgICAgIHJldHVybiBYTUxfVFJVRTsKKyAgICB9CisgIH0KKyAgaWYgKHBvb2wtPmJsb2NrcyAmJiBwb29sLT5zdGFydCA9PSBwb29sLT5ibG9ja3MtPnMpIHsKKyAgICBpbnQgYmxvY2tTaXplID0gKGludCkocG9vbC0+ZW5kIC0gcG9vbC0+c3RhcnQpKjI7CisgICAgcG9vbC0+YmxvY2tzID0gKEJMT0NLICopCisgICAgICBwb29sLT5tZW0tPnJlYWxsb2NfZmNuKHBvb2wtPmJsb2NrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9mZnNldG9mKEJMT0NLLCBzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBibG9ja1NpemUgKiBzaXplb2YoWE1MX0NoYXIpKSk7CisgICAgaWYgKHBvb2wtPmJsb2NrcyA9PSBOVUxMKQorICAgICAgcmV0dXJuIFhNTF9GQUxTRTsKKyAgICBwb29sLT5ibG9ja3MtPnNpemUgPSBibG9ja1NpemU7CisgICAgcG9vbC0+cHRyID0gcG9vbC0+YmxvY2tzLT5zICsgKHBvb2wtPnB0ciAtIHBvb2wtPnN0YXJ0KTsKKyAgICBwb29sLT5zdGFydCA9IHBvb2wtPmJsb2Nrcy0+czsKKyAgICBwb29sLT5lbmQgPSBwb29sLT5zdGFydCArIGJsb2NrU2l6ZTsKKyAgfQorICBlbHNlIHsKKyAgICBCTE9DSyAqdGVtOworICAgIGludCBibG9ja1NpemUgPSAoaW50KShwb29sLT5lbmQgLSBwb29sLT5zdGFydCk7CisgICAgaWYgKGJsb2NrU2l6ZSA8IElOSVRfQkxPQ0tfU0laRSkKKyAgICAgIGJsb2NrU2l6ZSA9IElOSVRfQkxPQ0tfU0laRTsKKyAgICBlbHNlCisgICAgICBibG9ja1NpemUgKj0gMjsKKyAgICB0ZW0gPSAoQkxPQ0sgKilwb29sLT5tZW0tPm1hbGxvY19mY24ob2Zmc2V0b2YoQkxPQ0ssIHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBibG9ja1NpemUgKiBzaXplb2YoWE1MX0NoYXIpKTsKKyAgICBpZiAoIXRlbSkKKyAgICAgIHJldHVybiBYTUxfRkFMU0U7CisgICAgdGVtLT5zaXplID0gYmxvY2tTaXplOworICAgIHRlbS0+bmV4dCA9IHBvb2wtPmJsb2NrczsKKyAgICBwb29sLT5ibG9ja3MgPSB0ZW07CisgICAgaWYgKHBvb2wtPnB0ciAhPSBwb29sLT5zdGFydCkKKyAgICAgIG1lbWNweSh0ZW0tPnMsIHBvb2wtPnN0YXJ0LAorICAgICAgICAgICAgIChwb29sLT5wdHIgLSBwb29sLT5zdGFydCkgKiBzaXplb2YoWE1MX0NoYXIpKTsKKyAgICBwb29sLT5wdHIgPSB0ZW0tPnMgKyAocG9vbC0+cHRyIC0gcG9vbC0+c3RhcnQpOworICAgIHBvb2wtPnN0YXJ0ID0gdGVtLT5zOworICAgIHBvb2wtPmVuZCA9IHRlbS0+cyArIGJsb2NrU2l6ZTsKKyAgfQorICByZXR1cm4gWE1MX1RSVUU7Cit9CisKK3N0YXRpYyBpbnQgRkFTVENBTEwKK25leHRTY2FmZm9sZFBhcnQoWE1MX1BhcnNlciBwYXJzZXIpCit7CisgIERURCAqIGNvbnN0IGR0ZCA9IF9kdGQ7ICAvKiBzYXZlIG9uZSBsZXZlbCBvZiBpbmRpcmVjdGlvbiAqLworICBDT05URU5UX1NDQUZGT0xEICogbWU7CisgIGludCBuZXh0OworCisgIGlmICghZHRkLT5zY2FmZkluZGV4KSB7CisgICAgZHRkLT5zY2FmZkluZGV4ID0gKGludCAqKU1BTExPQyhncm91cFNpemUgKiBzaXplb2YoaW50KSk7CisgICAgaWYgKCFkdGQtPnNjYWZmSW5kZXgpCisgICAgICByZXR1cm4gLTE7CisgICAgZHRkLT5zY2FmZkluZGV4WzBdID0gMDsKKyAgfQorCisgIGlmIChkdGQtPnNjYWZmQ291bnQgPj0gZHRkLT5zY2FmZlNpemUpIHsKKyAgICBDT05URU5UX1NDQUZGT0xEICp0ZW1wOworICAgIGlmIChkdGQtPnNjYWZmb2xkKSB7CisgICAgICB0ZW1wID0gKENPTlRFTlRfU0NBRkZPTEQgKikKKyAgICAgICAgUkVBTExPQyhkdGQtPnNjYWZmb2xkLCBkdGQtPnNjYWZmU2l6ZSAqIDIgKiBzaXplb2YoQ09OVEVOVF9TQ0FGRk9MRCkpOworICAgICAgaWYgKHRlbXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgZHRkLT5zY2FmZlNpemUgKj0gMjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICB0ZW1wID0gKENPTlRFTlRfU0NBRkZPTEQgKilNQUxMT0MoSU5JVF9TQ0FGRk9MRF9FTEVNRU5UUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKENPTlRFTlRfU0NBRkZPTEQpKTsKKyAgICAgIGlmICh0ZW1wID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGR0ZC0+c2NhZmZTaXplID0gSU5JVF9TQ0FGRk9MRF9FTEVNRU5UUzsKKyAgICB9CisgICAgZHRkLT5zY2FmZm9sZCA9IHRlbXA7CisgIH0KKyAgbmV4dCA9IGR0ZC0+c2NhZmZDb3VudCsrOworICBtZSA9ICZkdGQtPnNjYWZmb2xkW25leHRdOworICBpZiAoZHRkLT5zY2FmZkxldmVsKSB7CisgICAgQ09OVEVOVF9TQ0FGRk9MRCAqcGFyZW50ID0gJmR0ZC0+c2NhZmZvbGRbZHRkLT5zY2FmZkluZGV4W2R0ZC0+c2NhZmZMZXZlbC0xXV07CisgICAgaWYgKHBhcmVudC0+bGFzdGNoaWxkKSB7CisgICAgICBkdGQtPnNjYWZmb2xkW3BhcmVudC0+bGFzdGNoaWxkXS5uZXh0c2liID0gbmV4dDsKKyAgICB9CisgICAgaWYgKCFwYXJlbnQtPmNoaWxkY250KQorICAgICAgcGFyZW50LT5maXJzdGNoaWxkID0gbmV4dDsKKyAgICBwYXJlbnQtPmxhc3RjaGlsZCA9IG5leHQ7CisgICAgcGFyZW50LT5jaGlsZGNudCsrOworICB9CisgIG1lLT5maXJzdGNoaWxkID0gbWUtPmxhc3RjaGlsZCA9IG1lLT5jaGlsZGNudCA9IG1lLT5uZXh0c2liID0gMDsKKyAgcmV0dXJuIG5leHQ7Cit9CisKK3N0YXRpYyB2b2lkCitidWlsZF9ub2RlKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICBpbnQgc3JjX25vZGUsCisgICAgICAgICAgIFhNTF9Db250ZW50ICpkZXN0LAorICAgICAgICAgICBYTUxfQ29udGVudCAqKmNvbnRwb3MsCisgICAgICAgICAgIFhNTF9DaGFyICoqc3RycG9zKQoreworICBEVEQgKiBjb25zdCBkdGQgPSBfZHRkOyAgLyogc2F2ZSBvbmUgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gKi8KKyAgZGVzdC0+dHlwZSA9IGR0ZC0+c2NhZmZvbGRbc3JjX25vZGVdLnR5cGU7CisgIGRlc3QtPnF1YW50ID0gZHRkLT5zY2FmZm9sZFtzcmNfbm9kZV0ucXVhbnQ7CisgIGlmIChkZXN0LT50eXBlID09IFhNTF9DVFlQRV9OQU1FKSB7CisgICAgY29uc3QgWE1MX0NoYXIgKnNyYzsKKyAgICBkZXN0LT5uYW1lID0gKnN0cnBvczsKKyAgICBzcmMgPSBkdGQtPnNjYWZmb2xkW3NyY19ub2RlXS5uYW1lOworICAgIGZvciAoOzspIHsKKyAgICAgICooKnN0cnBvcykrKyA9ICpzcmM7CisgICAgICBpZiAoISpzcmMpCisgICAgICAgIGJyZWFrOworICAgICAgc3JjKys7CisgICAgfQorICAgIGRlc3QtPm51bWNoaWxkcmVuID0gMDsKKyAgICBkZXN0LT5jaGlsZHJlbiA9IE5VTEw7CisgIH0KKyAgZWxzZSB7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgaW50IGNuOworICAgIGRlc3QtPm51bWNoaWxkcmVuID0gZHRkLT5zY2FmZm9sZFtzcmNfbm9kZV0uY2hpbGRjbnQ7CisgICAgZGVzdC0+Y2hpbGRyZW4gPSAqY29udHBvczsKKyAgICAqY29udHBvcyArPSBkZXN0LT5udW1jaGlsZHJlbjsKKyAgICBmb3IgKGkgPSAwLCBjbiA9IGR0ZC0+c2NhZmZvbGRbc3JjX25vZGVdLmZpcnN0Y2hpbGQ7CisgICAgICAgICBpIDwgZGVzdC0+bnVtY2hpbGRyZW47CisgICAgICAgICBpKyssIGNuID0gZHRkLT5zY2FmZm9sZFtjbl0ubmV4dHNpYikgeworICAgICAgYnVpbGRfbm9kZShwYXJzZXIsIGNuLCAmKGRlc3QtPmNoaWxkcmVuW2ldKSwgY29udHBvcywgc3RycG9zKTsKKyAgICB9CisgICAgZGVzdC0+bmFtZSA9IE5VTEw7CisgIH0KK30KKworc3RhdGljIFhNTF9Db250ZW50ICoKK2J1aWxkX21vZGVsIChYTUxfUGFyc2VyIHBhcnNlcikKK3sKKyAgRFREICogY29uc3QgZHRkID0gX2R0ZDsgIC8qIHNhdmUgb25lIGxldmVsIG9mIGluZGlyZWN0aW9uICovCisgIFhNTF9Db250ZW50ICpyZXQ7CisgIFhNTF9Db250ZW50ICpjcG9zOworICBYTUxfQ2hhciAqIHN0cjsKKyAgaW50IGFsbG9jc2l6ZSA9IChkdGQtPnNjYWZmQ291bnQgKiBzaXplb2YoWE1MX0NvbnRlbnQpCisgICAgICAgICAgICAgICAgICAgKyAoZHRkLT5jb250ZW50U3RyaW5nTGVuICogc2l6ZW9mKFhNTF9DaGFyKSkpOworCisgIHJldCA9IChYTUxfQ29udGVudCAqKU1BTExPQyhhbGxvY3NpemUpOworICBpZiAoIXJldCkKKyAgICByZXR1cm4gTlVMTDsKKworICBzdHIgPSAgKFhNTF9DaGFyICopICgmcmV0W2R0ZC0+c2NhZmZDb3VudF0pOworICBjcG9zID0gJnJldFsxXTsKKworICBidWlsZF9ub2RlKHBhcnNlciwgMCwgcmV0LCAmY3BvcywgJnN0cik7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBFTEVNRU5UX1RZUEUgKgorZ2V0RWxlbWVudFR5cGUoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kKQoreworICBEVEQgKiBjb25zdCBkdGQgPSBfZHRkOyAgLyogc2F2ZSBvbmUgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gKi8KKyAgY29uc3QgWE1MX0NoYXIgKm5hbWUgPSBwb29sU3RvcmVTdHJpbmcoJmR0ZC0+cG9vbCwgZW5jLCBwdHIsIGVuZCk7CisgIEVMRU1FTlRfVFlQRSAqcmV0OworCisgIGlmICghbmFtZSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0ID0gKEVMRU1FTlRfVFlQRSAqKSBsb29rdXAoJmR0ZC0+ZWxlbWVudFR5cGVzLCBuYW1lLCBzaXplb2YoRUxFTUVOVF9UWVBFKSk7CisgIGlmICghcmV0KQorICAgIHJldHVybiBOVUxMOworICBpZiAocmV0LT5uYW1lICE9IG5hbWUpCisgICAgcG9vbERpc2NhcmQoJmR0ZC0+cG9vbCk7CisgIGVsc2UgeworICAgIHBvb2xGaW5pc2goJmR0ZC0+cG9vbCk7CisgICAgaWYgKCFzZXRFbGVtZW50VHlwZVByZWZpeChwYXJzZXIsIHJldCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvbGliL3htbHJvbGUuYyBiL2V4cGF0LTIuMC4xL2xpYi94bWxyb2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM1ZTI1YgotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2xpYi94bWxyb2xlLmMKQEAgLTAsMCArMSwxMzM2IEBACisvKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgVGhhaSBPcGVuIFNvdXJjZSBTb2Z0d2FyZSBDZW50ZXIgTHRkCisgICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgY29weWluZyBwZXJtaXNzaW9uLgorKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaWZkZWYgQ09NUElMRURfRlJPTV9EU1AKKyNpbmNsdWRlICJ3aW5jb25maWcuaCIKKyNlbGlmIGRlZmluZWQoTUFDT1NfQ0xBU1NJQykKKyNpbmNsdWRlICJtYWNjb25maWcuaCIKKyNlbGlmIGRlZmluZWQoX19hbWlnYW9zNF9fKQorI2luY2x1ZGUgImFtaWdhY29uZmlnLmgiCisjZWxpZiBkZWZpbmVkKF9fV0FUQ09NQ19fKQorI2luY2x1ZGUgIndhdGNvbWNvbmZpZy5oIgorI2Vsc2UKKyNpZmRlZiBIQVZFX0VYUEFUX0NPTkZJR19ICisjaW5jbHVkZSA8ZXhwYXRfY29uZmlnLmg+CisjZW5kaWYKKyNlbmRpZiAvKiBuZGVmIENPTVBJTEVEX0ZST01fRFNQICovCisKKyNpbmNsdWRlICJleHBhdF9leHRlcm5hbC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAieG1scm9sZS5oIgorI2luY2x1ZGUgImFzY2lpLmgiCisKKy8qIERvZXNuJ3QgY2hlY2s6CisKKyB0aGF0ICx8IGFyZSBub3QgbWl4ZWQgaW4gYSBtb2RlbCBncm91cAorIGNvbnRlbnQgb2YgbGl0ZXJhbHMKKworKi8KKworc3RhdGljIGNvbnN0IGNoYXIgS1dfQU5ZW10gPSB7CisgICAgQVNDSUlfQSwgQVNDSUlfTiwgQVNDSUlfWSwgJ1wwJyB9Oworc3RhdGljIGNvbnN0IGNoYXIgS1dfQVRUTElTVFtdID0geworICAgIEFTQ0lJX0EsIEFTQ0lJX1QsIEFTQ0lJX1QsIEFTQ0lJX0wsIEFTQ0lJX0ksIEFTQ0lJX1MsIEFTQ0lJX1QsICdcMCcgfTsKK3N0YXRpYyBjb25zdCBjaGFyIEtXX0NEQVRBW10gPSB7CisgICAgQVNDSUlfQywgQVNDSUlfRCwgQVNDSUlfQSwgQVNDSUlfVCwgQVNDSUlfQSwgJ1wwJyB9Oworc3RhdGljIGNvbnN0IGNoYXIgS1dfRE9DVFlQRVtdID0geworICAgIEFTQ0lJX0QsIEFTQ0lJX08sIEFTQ0lJX0MsIEFTQ0lJX1QsIEFTQ0lJX1ksIEFTQ0lJX1AsIEFTQ0lJX0UsICdcMCcgfTsKK3N0YXRpYyBjb25zdCBjaGFyIEtXX0VMRU1FTlRbXSA9IHsKKyAgICBBU0NJSV9FLCBBU0NJSV9MLCBBU0NJSV9FLCBBU0NJSV9NLCBBU0NJSV9FLCBBU0NJSV9OLCBBU0NJSV9ULCAnXDAnIH07CitzdGF0aWMgY29uc3QgY2hhciBLV19FTVBUWVtdID0geworICAgIEFTQ0lJX0UsIEFTQ0lJX00sIEFTQ0lJX1AsIEFTQ0lJX1QsIEFTQ0lJX1ksICdcMCcgfTsKK3N0YXRpYyBjb25zdCBjaGFyIEtXX0VOVElUSUVTW10gPSB7CisgICAgQVNDSUlfRSwgQVNDSUlfTiwgQVNDSUlfVCwgQVNDSUlfSSwgQVNDSUlfVCwgQVNDSUlfSSwgQVNDSUlfRSwgQVNDSUlfUywKKyAgICAnXDAnIH07CitzdGF0aWMgY29uc3QgY2hhciBLV19FTlRJVFlbXSA9IHsKKyAgICBBU0NJSV9FLCBBU0NJSV9OLCBBU0NJSV9ULCBBU0NJSV9JLCBBU0NJSV9ULCBBU0NJSV9ZLCAnXDAnIH07CitzdGF0aWMgY29uc3QgY2hhciBLV19GSVhFRFtdID0geworICAgIEFTQ0lJX0YsIEFTQ0lJX0ksIEFTQ0lJX1gsIEFTQ0lJX0UsIEFTQ0lJX0QsICdcMCcgfTsKK3N0YXRpYyBjb25zdCBjaGFyIEtXX0lEW10gPSB7CisgICAgQVNDSUlfSSwgQVNDSUlfRCwgJ1wwJyB9Oworc3RhdGljIGNvbnN0IGNoYXIgS1dfSURSRUZbXSA9IHsKKyAgICBBU0NJSV9JLCBBU0NJSV9ELCBBU0NJSV9SLCBBU0NJSV9FLCBBU0NJSV9GLCAnXDAnIH07CitzdGF0aWMgY29uc3QgY2hhciBLV19JRFJFRlNbXSA9IHsKKyAgICBBU0NJSV9JLCBBU0NJSV9ELCBBU0NJSV9SLCBBU0NJSV9FLCBBU0NJSV9GLCBBU0NJSV9TLCAnXDAnIH07CisjaWZkZWYgWE1MX0RURAorc3RhdGljIGNvbnN0IGNoYXIgS1dfSUdOT1JFW10gPSB7CisgICAgQVNDSUlfSSwgQVNDSUlfRywgQVNDSUlfTiwgQVNDSUlfTywgQVNDSUlfUiwgQVNDSUlfRSwgJ1wwJyB9OworI2VuZGlmCitzdGF0aWMgY29uc3QgY2hhciBLV19JTVBMSUVEW10gPSB7CisgICAgQVNDSUlfSSwgQVNDSUlfTSwgQVNDSUlfUCwgQVNDSUlfTCwgQVNDSUlfSSwgQVNDSUlfRSwgQVNDSUlfRCwgJ1wwJyB9OworI2lmZGVmIFhNTF9EVEQKK3N0YXRpYyBjb25zdCBjaGFyIEtXX0lOQ0xVREVbXSA9IHsKKyAgICBBU0NJSV9JLCBBU0NJSV9OLCBBU0NJSV9DLCBBU0NJSV9MLCBBU0NJSV9VLCBBU0NJSV9ELCBBU0NJSV9FLCAnXDAnIH07CisjZW5kaWYKK3N0YXRpYyBjb25zdCBjaGFyIEtXX05EQVRBW10gPSB7CisgICAgQVNDSUlfTiwgQVNDSUlfRCwgQVNDSUlfQSwgQVNDSUlfVCwgQVNDSUlfQSwgJ1wwJyB9Oworc3RhdGljIGNvbnN0IGNoYXIgS1dfTk1UT0tFTltdID0geworICAgIEFTQ0lJX04sIEFTQ0lJX00sIEFTQ0lJX1QsIEFTQ0lJX08sIEFTQ0lJX0ssIEFTQ0lJX0UsIEFTQ0lJX04sICdcMCcgfTsKK3N0YXRpYyBjb25zdCBjaGFyIEtXX05NVE9LRU5TW10gPSB7CisgICAgQVNDSUlfTiwgQVNDSUlfTSwgQVNDSUlfVCwgQVNDSUlfTywgQVNDSUlfSywgQVNDSUlfRSwgQVNDSUlfTiwgQVNDSUlfUywKKyAgICAnXDAnIH07CitzdGF0aWMgY29uc3QgY2hhciBLV19OT1RBVElPTltdID0KKyAgICB7IEFTQ0lJX04sIEFTQ0lJX08sIEFTQ0lJX1QsIEFTQ0lJX0EsIEFTQ0lJX1QsIEFTQ0lJX0ksIEFTQ0lJX08sIEFTQ0lJX04sCisgICAgICAnXDAnIH07CitzdGF0aWMgY29uc3QgY2hhciBLV19QQ0RBVEFbXSA9IHsKKyAgICBBU0NJSV9QLCBBU0NJSV9DLCBBU0NJSV9ELCBBU0NJSV9BLCBBU0NJSV9ULCBBU0NJSV9BLCAnXDAnIH07CitzdGF0aWMgY29uc3QgY2hhciBLV19QVUJMSUNbXSA9IHsKKyAgICBBU0NJSV9QLCBBU0NJSV9VLCBBU0NJSV9CLCBBU0NJSV9MLCBBU0NJSV9JLCBBU0NJSV9DLCAnXDAnIH07CitzdGF0aWMgY29uc3QgY2hhciBLV19SRVFVSVJFRFtdID0geworICAgIEFTQ0lJX1IsIEFTQ0lJX0UsIEFTQ0lJX1EsIEFTQ0lJX1UsIEFTQ0lJX0ksIEFTQ0lJX1IsIEFTQ0lJX0UsIEFTQ0lJX0QsCisgICAgJ1wwJyB9Oworc3RhdGljIGNvbnN0IGNoYXIgS1dfU1lTVEVNW10gPSB7CisgICAgQVNDSUlfUywgQVNDSUlfWSwgQVNDSUlfUywgQVNDSUlfVCwgQVNDSUlfRSwgQVNDSUlfTSwgJ1wwJyB9OworCisjaWZuZGVmIE1JTl9CWVRFU19QRVJfQ0hBUgorI2RlZmluZSBNSU5fQllURVNfUEVSX0NIQVIoZW5jKSAoKGVuYyktPm1pbkJ5dGVzUGVyQ2hhcikKKyNlbmRpZgorCisjaWZkZWYgWE1MX0RURAorI2RlZmluZSBzZXRUb3BMZXZlbChzdGF0ZSkgXAorICAoKHN0YXRlKS0+aGFuZGxlciA9ICgoc3RhdGUpLT5kb2N1bWVudEVudGl0eSBcCisgICAgICAgICAgICAgICAgICAgICAgID8gaW50ZXJuYWxTdWJzZXQgXAorICAgICAgICAgICAgICAgICAgICAgICA6IGV4dGVybmFsU3Vic2V0MSkpCisjZWxzZSAvKiBub3QgWE1MX0RURCAqLworI2RlZmluZSBzZXRUb3BMZXZlbChzdGF0ZSkgKChzdGF0ZSktPmhhbmRsZXIgPSBpbnRlcm5hbFN1YnNldCkKKyNlbmRpZiAvKiBub3QgWE1MX0RURCAqLworCit0eXBlZGVmIGludCBQVFJDQUxMIFBST0xPR19IQU5ETEVSKFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKTsKKworc3RhdGljIFBST0xPR19IQU5ETEVSCisgIHByb2xvZzAsIHByb2xvZzEsIHByb2xvZzIsCisgIGRvY3R5cGUwLCBkb2N0eXBlMSwgZG9jdHlwZTIsIGRvY3R5cGUzLCBkb2N0eXBlNCwgZG9jdHlwZTUsCisgIGludGVybmFsU3Vic2V0LAorICBlbnRpdHkwLCBlbnRpdHkxLCBlbnRpdHkyLCBlbnRpdHkzLCBlbnRpdHk0LCBlbnRpdHk1LCBlbnRpdHk2LAorICBlbnRpdHk3LCBlbnRpdHk4LCBlbnRpdHk5LCBlbnRpdHkxMCwKKyAgbm90YXRpb24wLCBub3RhdGlvbjEsIG5vdGF0aW9uMiwgbm90YXRpb24zLCBub3RhdGlvbjQsCisgIGF0dGxpc3QwLCBhdHRsaXN0MSwgYXR0bGlzdDIsIGF0dGxpc3QzLCBhdHRsaXN0NCwgYXR0bGlzdDUsIGF0dGxpc3Q2LAorICBhdHRsaXN0NywgYXR0bGlzdDgsIGF0dGxpc3Q5LAorICBlbGVtZW50MCwgZWxlbWVudDEsIGVsZW1lbnQyLCBlbGVtZW50MywgZWxlbWVudDQsIGVsZW1lbnQ1LCBlbGVtZW50NiwKKyAgZWxlbWVudDcsCisjaWZkZWYgWE1MX0RURAorICBleHRlcm5hbFN1YnNldDAsIGV4dGVybmFsU3Vic2V0MSwKKyAgY29uZFNlY3QwLCBjb25kU2VjdDEsIGNvbmRTZWN0MiwKKyNlbmRpZiAvKiBYTUxfRFREICovCisgIGRlY2xDbG9zZSwKKyAgZXJyb3I7CisKK3N0YXRpYyBpbnQgRkFTVENBTEwgY29tbW9uKFBST0xPR19TVEFURSAqc3RhdGUsIGludCB0b2spOworCitzdGF0aWMgaW50IFBUUkNBTEwKK3Byb2xvZzAoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgaW50IHRvaywKKyAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IHByb2xvZzE7CisgICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7CisgIGNhc2UgWE1MX1RPS19YTUxfREVDTDoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IHByb2xvZzE7CisgICAgcmV0dXJuIFhNTF9ST0xFX1hNTF9ERUNMOworICBjYXNlIFhNTF9UT0tfUEk6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBwcm9sb2cxOworICAgIHJldHVybiBYTUxfUk9MRV9QSTsKKyAgY2FzZSBYTUxfVE9LX0NPTU1FTlQ6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBwcm9sb2cxOworICAgIHJldHVybiBYTUxfUk9MRV9DT01NRU5UOworICBjYXNlIFhNTF9UT0tfQk9NOgorICAgIHJldHVybiBYTUxfUk9MRV9OT05FOworICBjYXNlIFhNTF9UT0tfREVDTF9PUEVOOgorICAgIGlmICghWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArIDIgKiBNSU5fQllURVNfUEVSX0NIQVIoZW5jKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLV19ET0NUWVBFKSkKKyAgICAgIGJyZWFrOworICAgIHN0YXRlLT5oYW5kbGVyID0gZG9jdHlwZTA7CisgICAgcmV0dXJuIFhNTF9ST0xFX0RPQ1RZUEVfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX0lOU1RBTkNFX1NUQVJUOgorICAgIHN0YXRlLT5oYW5kbGVyID0gZXJyb3I7CisgICAgcmV0dXJuIFhNTF9ST0xFX0lOU1RBTkNFX1NUQVJUOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorcHJvbG9nMShQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICBpbnQgdG9rLAorICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgorICAgIHJldHVybiBYTUxfUk9MRV9OT05FOworICBjYXNlIFhNTF9UT0tfUEk6CisgICAgcmV0dXJuIFhNTF9ST0xFX1BJOworICBjYXNlIFhNTF9UT0tfQ09NTUVOVDoKKyAgICByZXR1cm4gWE1MX1JPTEVfQ09NTUVOVDsKKyAgY2FzZSBYTUxfVE9LX0JPTToKKyAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX0RFQ0xfT1BFTjoKKyAgICBpZiAoIVhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgKyAyICogTUlOX0JZVEVTX1BFUl9DSEFSKGVuYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS1dfRE9DVFlQRSkpCisgICAgICBicmVhazsKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGRvY3R5cGUwOworICAgIHJldHVybiBYTUxfUk9MRV9ET0NUWVBFX05PTkU7CisgIGNhc2UgWE1MX1RPS19JTlNUQU5DRV9TVEFSVDoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGVycm9yOworICAgIHJldHVybiBYTUxfUk9MRV9JTlNUQU5DRV9TVEFSVDsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK3Byb2xvZzIoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgaW50IHRvaywKKyAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX1BJOgorICAgIHJldHVybiBYTUxfUk9MRV9QSTsKKyAgY2FzZSBYTUxfVE9LX0NPTU1FTlQ6CisgICAgcmV0dXJuIFhNTF9ST0xFX0NPTU1FTlQ7CisgIGNhc2UgWE1MX1RPS19JTlNUQU5DRV9TVEFSVDoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGVycm9yOworICAgIHJldHVybiBYTUxfUk9MRV9JTlNUQU5DRV9TVEFSVDsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK2RvY3R5cGUwKFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgICBpbnQgdG9rLAorICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgorICAgIHJldHVybiBYTUxfUk9MRV9ET0NUWVBFX05PTkU7CisgIGNhc2UgWE1MX1RPS19OQU1FOgorICBjYXNlIFhNTF9UT0tfUFJFRklYRURfTkFNRToKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGRvY3R5cGUxOworICAgIHJldHVybiBYTUxfUk9MRV9ET0NUWVBFX05BTUU7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitkb2N0eXBlMShQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICAgaW50IHRvaywKKyAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfRE9DVFlQRV9OT05FOworICBjYXNlIFhNTF9UT0tfT1BFTl9CUkFDS0VUOgorICAgIHN0YXRlLT5oYW5kbGVyID0gaW50ZXJuYWxTdWJzZXQ7CisgICAgcmV0dXJuIFhNTF9ST0xFX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUOworICBjYXNlIFhNTF9UT0tfREVDTF9DTE9TRToKKyAgICBzdGF0ZS0+aGFuZGxlciA9IHByb2xvZzI7CisgICAgcmV0dXJuIFhNTF9ST0xFX0RPQ1RZUEVfQ0xPU0U7CisgIGNhc2UgWE1MX1RPS19OQU1FOgorICAgIGlmIChYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywgcHRyLCBlbmQsIEtXX1NZU1RFTSkpIHsKKyAgICAgIHN0YXRlLT5oYW5kbGVyID0gZG9jdHlwZTM7CisgICAgICByZXR1cm4gWE1MX1JPTEVfRE9DVFlQRV9OT05FOworICAgIH0KKyAgICBpZiAoWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsIHB0ciwgZW5kLCBLV19QVUJMSUMpKSB7CisgICAgICBzdGF0ZS0+aGFuZGxlciA9IGRvY3R5cGUyOworICAgICAgcmV0dXJuIFhNTF9ST0xFX0RPQ1RZUEVfTk9ORTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitkb2N0eXBlMihQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICAgaW50IHRvaywKKyAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfRE9DVFlQRV9OT05FOworICBjYXNlIFhNTF9UT0tfTElURVJBTDoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGRvY3R5cGUzOworICAgIHJldHVybiBYTUxfUk9MRV9ET0NUWVBFX1BVQkxJQ19JRDsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK2RvY3R5cGUzKFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgICBpbnQgdG9rLAorICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgorICAgIHJldHVybiBYTUxfUk9MRV9ET0NUWVBFX05PTkU7CisgIGNhc2UgWE1MX1RPS19MSVRFUkFMOgorICAgIHN0YXRlLT5oYW5kbGVyID0gZG9jdHlwZTQ7CisgICAgcmV0dXJuIFhNTF9ST0xFX0RPQ1RZUEVfU1lTVEVNX0lEOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorZG9jdHlwZTQoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgIGludCB0b2ssCisgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0RPQ1RZUEVfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX09QRU5fQlJBQ0tFVDoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGludGVybmFsU3Vic2V0OworICAgIHJldHVybiBYTUxfUk9MRV9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVDsKKyAgY2FzZSBYTUxfVE9LX0RFQ0xfQ0xPU0U6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBwcm9sb2cyOworICAgIHJldHVybiBYTUxfUk9MRV9ET0NUWVBFX0NMT1NFOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorZG9jdHlwZTUoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgIGludCB0b2ssCisgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0RPQ1RZUEVfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX0RFQ0xfQ0xPU0U6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBwcm9sb2cyOworICAgIHJldHVybiBYTUxfUk9MRV9ET0NUWVBFX0NMT1NFOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAoraW50ZXJuYWxTdWJzZXQoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgICAgICAgIGludCB0b2ssCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7CisgIGNhc2UgWE1MX1RPS19ERUNMX09QRU46CisgICAgaWYgKFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArIDIgKiBNSU5fQllURVNfUEVSX0NIQVIoZW5jKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS1dfRU5USVRZKSkgeworICAgICAgc3RhdGUtPmhhbmRsZXIgPSBlbnRpdHkwOworICAgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9OT05FOworICAgIH0KKyAgICBpZiAoWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyICsgMiAqIE1JTl9CWVRFU19QRVJfQ0hBUihlbmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLV19BVFRMSVNUKSkgeworICAgICAgc3RhdGUtPmhhbmRsZXIgPSBhdHRsaXN0MDsKKyAgICAgIHJldHVybiBYTUxfUk9MRV9BVFRMSVNUX05PTkU7CisgICAgfQorICAgIGlmIChYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgKyAyICogTUlOX0JZVEVTX1BFUl9DSEFSKGVuYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtXX0VMRU1FTlQpKSB7CisgICAgICBzdGF0ZS0+aGFuZGxlciA9IGVsZW1lbnQwOworICAgICAgcmV0dXJuIFhNTF9ST0xFX0VMRU1FTlRfTk9ORTsKKyAgICB9CisgICAgaWYgKFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArIDIgKiBNSU5fQllURVNfUEVSX0NIQVIoZW5jKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS1dfTk9UQVRJT04pKSB7CisgICAgICBzdGF0ZS0+aGFuZGxlciA9IG5vdGF0aW9uMDsKKyAgICAgIHJldHVybiBYTUxfUk9MRV9OT1RBVElPTl9OT05FOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBYTUxfVE9LX1BJOgorICAgIHJldHVybiBYTUxfUk9MRV9QSTsKKyAgY2FzZSBYTUxfVE9LX0NPTU1FTlQ6CisgICAgcmV0dXJuIFhNTF9ST0xFX0NPTU1FTlQ7CisgIGNhc2UgWE1MX1RPS19QQVJBTV9FTlRJVFlfUkVGOgorICAgIHJldHVybiBYTUxfUk9MRV9QQVJBTV9FTlRJVFlfUkVGOworICBjYXNlIFhNTF9UT0tfQ0xPU0VfQlJBQ0tFVDoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGRvY3R5cGU1OworICAgIHJldHVybiBYTUxfUk9MRV9ET0NUWVBFX05PTkU7CisgIGNhc2UgWE1MX1RPS19OT05FOgorICAgIHJldHVybiBYTUxfUk9MRV9OT05FOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKKyNpZmRlZiBYTUxfRFRECisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorZXh0ZXJuYWxTdWJzZXQwKFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgICAgICAgICAgaW50IHRvaywKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN0YXRlLT5oYW5kbGVyID0gZXh0ZXJuYWxTdWJzZXQxOworICBpZiAodG9rID09IFhNTF9UT0tfWE1MX0RFQ0wpCisgICAgcmV0dXJuIFhNTF9ST0xFX1RFWFRfREVDTDsKKyAgcmV0dXJuIGV4dGVybmFsU3Vic2V0MShzdGF0ZSwgdG9rLCBwdHIsIGVuZCwgZW5jKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitleHRlcm5hbFN1YnNldDEoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgICAgICAgICBpbnQgdG9rLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX0NPTkRfU0VDVF9PUEVOOgorICAgIHN0YXRlLT5oYW5kbGVyID0gY29uZFNlY3QwOworICAgIHJldHVybiBYTUxfUk9MRV9OT05FOworICBjYXNlIFhNTF9UT0tfQ09ORF9TRUNUX0NMT1NFOgorICAgIGlmIChzdGF0ZS0+aW5jbHVkZUxldmVsID09IDApCisgICAgICBicmVhazsKKyAgICBzdGF0ZS0+aW5jbHVkZUxldmVsIC09IDE7CisgICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX0NMT1NFX0JSQUNLRVQ6CisgICAgYnJlYWs7CisgIGNhc2UgWE1MX1RPS19OT05FOgorICAgIGlmIChzdGF0ZS0+aW5jbHVkZUxldmVsKQorICAgICAgYnJlYWs7CisgICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIGludGVybmFsU3Vic2V0KHN0YXRlLCB0b2ssIHB0ciwgZW5kLCBlbmMpOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKKyNlbmRpZiAvKiBYTUxfRFREICovCisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorZW50aXR5MChQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICBpbnQgdG9rLAorICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgorICAgIHJldHVybiBYTUxfUk9MRV9FTlRJVFlfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX1BFUkNFTlQ6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBlbnRpdHkxOworICAgIHJldHVybiBYTUxfUk9MRV9FTlRJVFlfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX05BTUU6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBlbnRpdHkyOworICAgIHJldHVybiBYTUxfUk9MRV9HRU5FUkFMX0VOVElUWV9OQU1FOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorZW50aXR5MShQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICBpbnQgdG9rLAorICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgorICAgIHJldHVybiBYTUxfUk9MRV9FTlRJVFlfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX05BTUU6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBlbnRpdHk3OworICAgIHJldHVybiBYTUxfUk9MRV9QQVJBTV9FTlRJVFlfTkFNRTsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK2VudGl0eTIoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgaW50IHRvaywKKyAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfRU5USVRZX05PTkU7CisgIGNhc2UgWE1MX1RPS19OQU1FOgorICAgIGlmIChYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywgcHRyLCBlbmQsIEtXX1NZU1RFTSkpIHsKKyAgICAgIHN0YXRlLT5oYW5kbGVyID0gZW50aXR5NDsKKyAgICAgIHJldHVybiBYTUxfUk9MRV9FTlRJVFlfTk9ORTsKKyAgICB9CisgICAgaWYgKFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLCBwdHIsIGVuZCwgS1dfUFVCTElDKSkgeworICAgICAgc3RhdGUtPmhhbmRsZXIgPSBlbnRpdHkzOworICAgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9OT05FOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBYTUxfVE9LX0xJVEVSQUw6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBkZWNsQ2xvc2U7CisgICAgc3RhdGUtPnJvbGVfbm9uZSA9IFhNTF9ST0xFX0VOVElUWV9OT05FOworICAgIHJldHVybiBYTUxfUk9MRV9FTlRJVFlfVkFMVUU7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitlbnRpdHkzKFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgIGludCB0b2ssCisgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9OT05FOworICBjYXNlIFhNTF9UT0tfTElURVJBTDoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGVudGl0eTQ7CisgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9QVUJMSUNfSUQ7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitlbnRpdHk0KFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgIGludCB0b2ssCisgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9OT05FOworICBjYXNlIFhNTF9UT0tfTElURVJBTDoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGVudGl0eTU7CisgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9TWVNURU1fSUQ7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitlbnRpdHk1KFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgIGludCB0b2ssCisgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9OT05FOworICBjYXNlIFhNTF9UT0tfREVDTF9DTE9TRToKKyAgICBzZXRUb3BMZXZlbChzdGF0ZSk7CisgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9DT01QTEVURTsKKyAgY2FzZSBYTUxfVE9LX05BTUU6CisgICAgaWYgKFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLCBwdHIsIGVuZCwgS1dfTkRBVEEpKSB7CisgICAgICBzdGF0ZS0+aGFuZGxlciA9IGVudGl0eTY7CisgICAgICByZXR1cm4gWE1MX1JPTEVfRU5USVRZX05PTkU7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorZW50aXR5NihQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICBpbnQgdG9rLAorICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgorICAgIHJldHVybiBYTUxfUk9MRV9FTlRJVFlfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX05BTUU6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBkZWNsQ2xvc2U7CisgICAgc3RhdGUtPnJvbGVfbm9uZSA9IFhNTF9ST0xFX0VOVElUWV9OT05FOworICAgIHJldHVybiBYTUxfUk9MRV9FTlRJVFlfTk9UQVRJT05fTkFNRTsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK2VudGl0eTcoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgaW50IHRvaywKKyAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfRU5USVRZX05PTkU7CisgIGNhc2UgWE1MX1RPS19OQU1FOgorICAgIGlmIChYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywgcHRyLCBlbmQsIEtXX1NZU1RFTSkpIHsKKyAgICAgIHN0YXRlLT5oYW5kbGVyID0gZW50aXR5OTsKKyAgICAgIHJldHVybiBYTUxfUk9MRV9FTlRJVFlfTk9ORTsKKyAgICB9CisgICAgaWYgKFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLCBwdHIsIGVuZCwgS1dfUFVCTElDKSkgeworICAgICAgc3RhdGUtPmhhbmRsZXIgPSBlbnRpdHk4OworICAgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9OT05FOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBYTUxfVE9LX0xJVEVSQUw6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBkZWNsQ2xvc2U7CisgICAgc3RhdGUtPnJvbGVfbm9uZSA9IFhNTF9ST0xFX0VOVElUWV9OT05FOworICAgIHJldHVybiBYTUxfUk9MRV9FTlRJVFlfVkFMVUU7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitlbnRpdHk4KFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgIGludCB0b2ssCisgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9OT05FOworICBjYXNlIFhNTF9UT0tfTElURVJBTDoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGVudGl0eTk7CisgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9QVUJMSUNfSUQ7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitlbnRpdHk5KFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgIGludCB0b2ssCisgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9OT05FOworICBjYXNlIFhNTF9UT0tfTElURVJBTDoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGVudGl0eTEwOworICAgIHJldHVybiBYTUxfUk9MRV9FTlRJVFlfU1lTVEVNX0lEOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorZW50aXR5MTAoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgIGludCB0b2ssCisgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9OT05FOworICBjYXNlIFhNTF9UT0tfREVDTF9DTE9TRToKKyAgICBzZXRUb3BMZXZlbChzdGF0ZSk7CisgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9DT01QTEVURTsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK25vdGF0aW9uMChQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICAgIGludCB0b2ssCisgICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX05PVEFUSU9OX05PTkU7CisgIGNhc2UgWE1MX1RPS19OQU1FOgorICAgIHN0YXRlLT5oYW5kbGVyID0gbm90YXRpb24xOworICAgIHJldHVybiBYTUxfUk9MRV9OT1RBVElPTl9OQU1FOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorbm90YXRpb24xKFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgICAgaW50IHRvaywKKyAgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfTk9UQVRJT05fTk9ORTsKKyAgY2FzZSBYTUxfVE9LX05BTUU6CisgICAgaWYgKFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLCBwdHIsIGVuZCwgS1dfU1lTVEVNKSkgeworICAgICAgc3RhdGUtPmhhbmRsZXIgPSBub3RhdGlvbjM7CisgICAgICByZXR1cm4gWE1MX1JPTEVfTk9UQVRJT05fTk9ORTsKKyAgICB9CisgICAgaWYgKFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLCBwdHIsIGVuZCwgS1dfUFVCTElDKSkgeworICAgICAgc3RhdGUtPmhhbmRsZXIgPSBub3RhdGlvbjI7CisgICAgICByZXR1cm4gWE1MX1JPTEVfTk9UQVRJT05fTk9ORTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitub3RhdGlvbjIoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgICBpbnQgdG9rLAorICAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgorICAgIHJldHVybiBYTUxfUk9MRV9OT1RBVElPTl9OT05FOworICBjYXNlIFhNTF9UT0tfTElURVJBTDoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IG5vdGF0aW9uNDsKKyAgICByZXR1cm4gWE1MX1JPTEVfTk9UQVRJT05fUFVCTElDX0lEOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorbm90YXRpb24zKFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgICAgaW50IHRvaywKKyAgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfTk9UQVRJT05fTk9ORTsKKyAgY2FzZSBYTUxfVE9LX0xJVEVSQUw6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBkZWNsQ2xvc2U7CisgICAgc3RhdGUtPnJvbGVfbm9uZSA9IFhNTF9ST0xFX05PVEFUSU9OX05PTkU7CisgICAgcmV0dXJuIFhNTF9ST0xFX05PVEFUSU9OX1NZU1RFTV9JRDsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK25vdGF0aW9uNChQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICAgIGludCB0b2ssCisgICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX05PVEFUSU9OX05PTkU7CisgIGNhc2UgWE1MX1RPS19MSVRFUkFMOgorICAgIHN0YXRlLT5oYW5kbGVyID0gZGVjbENsb3NlOworICAgIHN0YXRlLT5yb2xlX25vbmUgPSBYTUxfUk9MRV9OT1RBVElPTl9OT05FOworICAgIHJldHVybiBYTUxfUk9MRV9OT1RBVElPTl9TWVNURU1fSUQ7CisgIGNhc2UgWE1MX1RPS19ERUNMX0NMT1NFOgorICAgIHNldFRvcExldmVsKHN0YXRlKTsKKyAgICByZXR1cm4gWE1MX1JPTEVfTk9UQVRJT05fTk9fU1lTVEVNX0lEOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorYXR0bGlzdDAoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgIGludCB0b2ssCisgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0FUVExJU1RfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX05BTUU6CisgIGNhc2UgWE1MX1RPS19QUkVGSVhFRF9OQU1FOgorICAgIHN0YXRlLT5oYW5kbGVyID0gYXR0bGlzdDE7CisgICAgcmV0dXJuIFhNTF9ST0xFX0FUVExJU1RfRUxFTUVOVF9OQU1FOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorYXR0bGlzdDEoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgIGludCB0b2ssCisgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0FUVExJU1RfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX0RFQ0xfQ0xPU0U6CisgICAgc2V0VG9wTGV2ZWwoc3RhdGUpOworICAgIHJldHVybiBYTUxfUk9MRV9BVFRMSVNUX05PTkU7CisgIGNhc2UgWE1MX1RPS19OQU1FOgorICBjYXNlIFhNTF9UT0tfUFJFRklYRURfTkFNRToKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGF0dGxpc3QyOworICAgIHJldHVybiBYTUxfUk9MRV9BVFRSSUJVVEVfTkFNRTsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK2F0dGxpc3QyKFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgICBpbnQgdG9rLAorICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgorICAgIHJldHVybiBYTUxfUk9MRV9BVFRMSVNUX05PTkU7CisgIGNhc2UgWE1MX1RPS19OQU1FOgorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdHlwZXNbXSA9IHsKKyAgICAgICAgS1dfQ0RBVEEsCisgICAgICAgIEtXX0lELAorICAgICAgICBLV19JRFJFRiwKKyAgICAgICAgS1dfSURSRUZTLAorICAgICAgICBLV19FTlRJVFksCisgICAgICAgIEtXX0VOVElUSUVTLAorICAgICAgICBLV19OTVRPS0VOLAorICAgICAgICBLV19OTVRPS0VOUywKKyAgICAgIH07CisgICAgICBpbnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KShzaXplb2YodHlwZXMpL3NpemVvZih0eXBlc1swXSkpOyBpKyspCisgICAgICAgIGlmIChYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywgcHRyLCBlbmQsIHR5cGVzW2ldKSkgeworICAgICAgICAgIHN0YXRlLT5oYW5kbGVyID0gYXR0bGlzdDg7CisgICAgICAgICAgcmV0dXJuIFhNTF9ST0xFX0FUVFJJQlVURV9UWVBFX0NEQVRBICsgaTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsIHB0ciwgZW5kLCBLV19OT1RBVElPTikpIHsKKyAgICAgIHN0YXRlLT5oYW5kbGVyID0gYXR0bGlzdDU7CisgICAgICByZXR1cm4gWE1MX1JPTEVfQVRUTElTVF9OT05FOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBYTUxfVE9LX09QRU5fUEFSRU46CisgICAgc3RhdGUtPmhhbmRsZXIgPSBhdHRsaXN0MzsKKyAgICByZXR1cm4gWE1MX1JPTEVfQVRUTElTVF9OT05FOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorYXR0bGlzdDMoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgIGludCB0b2ssCisgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0FUVExJU1RfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX05NVE9LRU46CisgIGNhc2UgWE1MX1RPS19OQU1FOgorICBjYXNlIFhNTF9UT0tfUFJFRklYRURfTkFNRToKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGF0dGxpc3Q0OworICAgIHJldHVybiBYTUxfUk9MRV9BVFRSSUJVVEVfRU5VTV9WQUxVRTsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK2F0dGxpc3Q0KFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgICBpbnQgdG9rLAorICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgorICAgIHJldHVybiBYTUxfUk9MRV9BVFRMSVNUX05PTkU7CisgIGNhc2UgWE1MX1RPS19DTE9TRV9QQVJFTjoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGF0dGxpc3Q4OworICAgIHJldHVybiBYTUxfUk9MRV9BVFRMSVNUX05PTkU7CisgIGNhc2UgWE1MX1RPS19PUjoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGF0dGxpc3QzOworICAgIHJldHVybiBYTUxfUk9MRV9BVFRMSVNUX05PTkU7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCithdHRsaXN0NShQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICAgaW50IHRvaywKKyAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfQVRUTElTVF9OT05FOworICBjYXNlIFhNTF9UT0tfT1BFTl9QQVJFTjoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGF0dGxpc3Q2OworICAgIHJldHVybiBYTUxfUk9MRV9BVFRMSVNUX05PTkU7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCithdHRsaXN0NihQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICAgaW50IHRvaywKKyAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfQVRUTElTVF9OT05FOworICBjYXNlIFhNTF9UT0tfTkFNRToKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGF0dGxpc3Q3OworICAgIHJldHVybiBYTUxfUk9MRV9BVFRSSUJVVEVfTk9UQVRJT05fVkFMVUU7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCithdHRsaXN0NyhQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICAgaW50IHRvaywKKyAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfQVRUTElTVF9OT05FOworICBjYXNlIFhNTF9UT0tfQ0xPU0VfUEFSRU46CisgICAgc3RhdGUtPmhhbmRsZXIgPSBhdHRsaXN0ODsKKyAgICByZXR1cm4gWE1MX1JPTEVfQVRUTElTVF9OT05FOworICBjYXNlIFhNTF9UT0tfT1I6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBhdHRsaXN0NjsKKyAgICByZXR1cm4gWE1MX1JPTEVfQVRUTElTVF9OT05FOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKKy8qIGRlZmF1bHQgdmFsdWUgKi8KK3N0YXRpYyBpbnQgUFRSQ0FMTAorYXR0bGlzdDgoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgIGludCB0b2ssCisgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0FUVExJU1RfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX1BPVU5EX05BTUU6CisgICAgaWYgKFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArIE1JTl9CWVRFU19QRVJfQ0hBUihlbmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLV19JTVBMSUVEKSkgeworICAgICAgc3RhdGUtPmhhbmRsZXIgPSBhdHRsaXN0MTsKKyAgICAgIHJldHVybiBYTUxfUk9MRV9JTVBMSUVEX0FUVFJJQlVURV9WQUxVRTsKKyAgICB9CisgICAgaWYgKFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArIE1JTl9CWVRFU19QRVJfQ0hBUihlbmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLV19SRVFVSVJFRCkpIHsKKyAgICAgIHN0YXRlLT5oYW5kbGVyID0gYXR0bGlzdDE7CisgICAgICByZXR1cm4gWE1MX1JPTEVfUkVRVUlSRURfQVRUUklCVVRFX1ZBTFVFOworICAgIH0KKyAgICBpZiAoWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyICsgTUlOX0JZVEVTX1BFUl9DSEFSKGVuYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtXX0ZJWEVEKSkgeworICAgICAgc3RhdGUtPmhhbmRsZXIgPSBhdHRsaXN0OTsKKyAgICAgIHJldHVybiBYTUxfUk9MRV9BVFRMSVNUX05PTkU7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIFhNTF9UT0tfTElURVJBTDoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGF0dGxpc3QxOworICAgIHJldHVybiBYTUxfUk9MRV9ERUZBVUxUX0FUVFJJQlVURV9WQUxVRTsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK2F0dGxpc3Q5KFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgICBpbnQgdG9rLAorICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgorICAgIHJldHVybiBYTUxfUk9MRV9BVFRMSVNUX05PTkU7CisgIGNhc2UgWE1MX1RPS19MSVRFUkFMOgorICAgIHN0YXRlLT5oYW5kbGVyID0gYXR0bGlzdDE7CisgICAgcmV0dXJuIFhNTF9ST0xFX0ZJWEVEX0FUVFJJQlVURV9WQUxVRTsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK2VsZW1lbnQwKFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgICBpbnQgdG9rLAorICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgorICAgIHJldHVybiBYTUxfUk9MRV9FTEVNRU5UX05PTkU7CisgIGNhc2UgWE1MX1RPS19OQU1FOgorICBjYXNlIFhNTF9UT0tfUFJFRklYRURfTkFNRToKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGVsZW1lbnQxOworICAgIHJldHVybiBYTUxfUk9MRV9FTEVNRU5UX05BTUU7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitlbGVtZW50MShQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICAgaW50IHRvaywKKyAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfRUxFTUVOVF9OT05FOworICBjYXNlIFhNTF9UT0tfTkFNRToKKyAgICBpZiAoWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsIHB0ciwgZW5kLCBLV19FTVBUWSkpIHsKKyAgICAgIHN0YXRlLT5oYW5kbGVyID0gZGVjbENsb3NlOworICAgICAgc3RhdGUtPnJvbGVfbm9uZSA9IFhNTF9ST0xFX0VMRU1FTlRfTk9ORTsKKyAgICAgIHJldHVybiBYTUxfUk9MRV9DT05URU5UX0VNUFRZOworICAgIH0KKyAgICBpZiAoWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsIHB0ciwgZW5kLCBLV19BTlkpKSB7CisgICAgICBzdGF0ZS0+aGFuZGxlciA9IGRlY2xDbG9zZTsKKyAgICAgIHN0YXRlLT5yb2xlX25vbmUgPSBYTUxfUk9MRV9FTEVNRU5UX05PTkU7CisgICAgICByZXR1cm4gWE1MX1JPTEVfQ09OVEVOVF9BTlk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIFhNTF9UT0tfT1BFTl9QQVJFTjoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGVsZW1lbnQyOworICAgIHN0YXRlLT5sZXZlbCA9IDE7CisgICAgcmV0dXJuIFhNTF9ST0xFX0dST1VQX09QRU47CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitlbGVtZW50MihQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICAgaW50IHRvaywKKyAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfRUxFTUVOVF9OT05FOworICBjYXNlIFhNTF9UT0tfUE9VTkRfTkFNRToKKyAgICBpZiAoWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyICsgTUlOX0JZVEVTX1BFUl9DSEFSKGVuYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtXX1BDREFUQSkpIHsKKyAgICAgIHN0YXRlLT5oYW5kbGVyID0gZWxlbWVudDM7CisgICAgICByZXR1cm4gWE1MX1JPTEVfQ09OVEVOVF9QQ0RBVEE7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIFhNTF9UT0tfT1BFTl9QQVJFTjoKKyAgICBzdGF0ZS0+bGV2ZWwgPSAyOworICAgIHN0YXRlLT5oYW5kbGVyID0gZWxlbWVudDY7CisgICAgcmV0dXJuIFhNTF9ST0xFX0dST1VQX09QRU47CisgIGNhc2UgWE1MX1RPS19OQU1FOgorICBjYXNlIFhNTF9UT0tfUFJFRklYRURfTkFNRToKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGVsZW1lbnQ3OworICAgIHJldHVybiBYTUxfUk9MRV9DT05URU5UX0VMRU1FTlQ7CisgIGNhc2UgWE1MX1RPS19OQU1FX1FVRVNUSU9OOgorICAgIHN0YXRlLT5oYW5kbGVyID0gZWxlbWVudDc7CisgICAgcmV0dXJuIFhNTF9ST0xFX0NPTlRFTlRfRUxFTUVOVF9PUFQ7CisgIGNhc2UgWE1MX1RPS19OQU1FX0FTVEVSSVNLOgorICAgIHN0YXRlLT5oYW5kbGVyID0gZWxlbWVudDc7CisgICAgcmV0dXJuIFhNTF9ST0xFX0NPTlRFTlRfRUxFTUVOVF9SRVA7CisgIGNhc2UgWE1MX1RPS19OQU1FX1BMVVM6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBlbGVtZW50NzsKKyAgICByZXR1cm4gWE1MX1JPTEVfQ09OVEVOVF9FTEVNRU5UX1BMVVM7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitlbGVtZW50MyhQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICAgaW50IHRvaywKKyAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfRUxFTUVOVF9OT05FOworICBjYXNlIFhNTF9UT0tfQ0xPU0VfUEFSRU46CisgICAgc3RhdGUtPmhhbmRsZXIgPSBkZWNsQ2xvc2U7CisgICAgc3RhdGUtPnJvbGVfbm9uZSA9IFhNTF9ST0xFX0VMRU1FTlRfTk9ORTsKKyAgICByZXR1cm4gWE1MX1JPTEVfR1JPVVBfQ0xPU0U7CisgIGNhc2UgWE1MX1RPS19DTE9TRV9QQVJFTl9BU1RFUklTSzoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGRlY2xDbG9zZTsKKyAgICBzdGF0ZS0+cm9sZV9ub25lID0gWE1MX1JPTEVfRUxFTUVOVF9OT05FOworICAgIHJldHVybiBYTUxfUk9MRV9HUk9VUF9DTE9TRV9SRVA7CisgIGNhc2UgWE1MX1RPS19PUjoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGVsZW1lbnQ0OworICAgIHJldHVybiBYTUxfUk9MRV9FTEVNRU5UX05PTkU7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitlbGVtZW50NChQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICAgaW50IHRvaywKKyAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfRUxFTUVOVF9OT05FOworICBjYXNlIFhNTF9UT0tfTkFNRToKKyAgY2FzZSBYTUxfVE9LX1BSRUZJWEVEX05BTUU6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBlbGVtZW50NTsKKyAgICByZXR1cm4gWE1MX1JPTEVfQ09OVEVOVF9FTEVNRU5UOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorZWxlbWVudDUoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgIGludCB0b2ssCisgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0VMRU1FTlRfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX0NMT1NFX1BBUkVOX0FTVEVSSVNLOgorICAgIHN0YXRlLT5oYW5kbGVyID0gZGVjbENsb3NlOworICAgIHN0YXRlLT5yb2xlX25vbmUgPSBYTUxfUk9MRV9FTEVNRU5UX05PTkU7CisgICAgcmV0dXJuIFhNTF9ST0xFX0dST1VQX0NMT1NFX1JFUDsKKyAgY2FzZSBYTUxfVE9LX09SOgorICAgIHN0YXRlLT5oYW5kbGVyID0gZWxlbWVudDQ7CisgICAgcmV0dXJuIFhNTF9ST0xFX0VMRU1FTlRfTk9ORTsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK2VsZW1lbnQ2KFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgICBpbnQgdG9rLAorICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgorICAgIHJldHVybiBYTUxfUk9MRV9FTEVNRU5UX05PTkU7CisgIGNhc2UgWE1MX1RPS19PUEVOX1BBUkVOOgorICAgIHN0YXRlLT5sZXZlbCArPSAxOworICAgIHJldHVybiBYTUxfUk9MRV9HUk9VUF9PUEVOOworICBjYXNlIFhNTF9UT0tfTkFNRToKKyAgY2FzZSBYTUxfVE9LX1BSRUZJWEVEX05BTUU6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBlbGVtZW50NzsKKyAgICByZXR1cm4gWE1MX1JPTEVfQ09OVEVOVF9FTEVNRU5UOworICBjYXNlIFhNTF9UT0tfTkFNRV9RVUVTVElPTjoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGVsZW1lbnQ3OworICAgIHJldHVybiBYTUxfUk9MRV9DT05URU5UX0VMRU1FTlRfT1BUOworICBjYXNlIFhNTF9UT0tfTkFNRV9BU1RFUklTSzoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGVsZW1lbnQ3OworICAgIHJldHVybiBYTUxfUk9MRV9DT05URU5UX0VMRU1FTlRfUkVQOworICBjYXNlIFhNTF9UT0tfTkFNRV9QTFVTOgorICAgIHN0YXRlLT5oYW5kbGVyID0gZWxlbWVudDc7CisgICAgcmV0dXJuIFhNTF9ST0xFX0NPTlRFTlRfRUxFTUVOVF9QTFVTOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorZWxlbWVudDcoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgIGludCB0b2ssCisgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0VMRU1FTlRfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX0NMT1NFX1BBUkVOOgorICAgIHN0YXRlLT5sZXZlbCAtPSAxOworICAgIGlmIChzdGF0ZS0+bGV2ZWwgPT0gMCkgeworICAgICAgc3RhdGUtPmhhbmRsZXIgPSBkZWNsQ2xvc2U7CisgICAgICBzdGF0ZS0+cm9sZV9ub25lID0gWE1MX1JPTEVfRUxFTUVOVF9OT05FOworICAgIH0KKyAgICByZXR1cm4gWE1MX1JPTEVfR1JPVVBfQ0xPU0U7CisgIGNhc2UgWE1MX1RPS19DTE9TRV9QQVJFTl9BU1RFUklTSzoKKyAgICBzdGF0ZS0+bGV2ZWwgLT0gMTsKKyAgICBpZiAoc3RhdGUtPmxldmVsID09IDApIHsKKyAgICAgIHN0YXRlLT5oYW5kbGVyID0gZGVjbENsb3NlOworICAgICAgc3RhdGUtPnJvbGVfbm9uZSA9IFhNTF9ST0xFX0VMRU1FTlRfTk9ORTsKKyAgICB9CisgICAgcmV0dXJuIFhNTF9ST0xFX0dST1VQX0NMT1NFX1JFUDsKKyAgY2FzZSBYTUxfVE9LX0NMT1NFX1BBUkVOX1FVRVNUSU9OOgorICAgIHN0YXRlLT5sZXZlbCAtPSAxOworICAgIGlmIChzdGF0ZS0+bGV2ZWwgPT0gMCkgeworICAgICAgc3RhdGUtPmhhbmRsZXIgPSBkZWNsQ2xvc2U7CisgICAgICBzdGF0ZS0+cm9sZV9ub25lID0gWE1MX1JPTEVfRUxFTUVOVF9OT05FOworICAgIH0KKyAgICByZXR1cm4gWE1MX1JPTEVfR1JPVVBfQ0xPU0VfT1BUOworICBjYXNlIFhNTF9UT0tfQ0xPU0VfUEFSRU5fUExVUzoKKyAgICBzdGF0ZS0+bGV2ZWwgLT0gMTsKKyAgICBpZiAoc3RhdGUtPmxldmVsID09IDApIHsKKyAgICAgIHN0YXRlLT5oYW5kbGVyID0gZGVjbENsb3NlOworICAgICAgc3RhdGUtPnJvbGVfbm9uZSA9IFhNTF9ST0xFX0VMRU1FTlRfTk9ORTsKKyAgICB9CisgICAgcmV0dXJuIFhNTF9ST0xFX0dST1VQX0NMT1NFX1BMVVM7CisgIGNhc2UgWE1MX1RPS19DT01NQToKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGVsZW1lbnQ2OworICAgIHJldHVybiBYTUxfUk9MRV9HUk9VUF9TRVFVRU5DRTsKKyAgY2FzZSBYTUxfVE9LX09SOgorICAgIHN0YXRlLT5oYW5kbGVyID0gZWxlbWVudDY7CisgICAgcmV0dXJuIFhNTF9ST0xFX0dST1VQX0NIT0lDRTsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCisjaWZkZWYgWE1MX0RURAorCitzdGF0aWMgaW50IFBUUkNBTEwKK2NvbmRTZWN0MChQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICAgIGludCB0b2ssCisgICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7CisgIGNhc2UgWE1MX1RPS19OQU1FOgorICAgIGlmIChYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywgcHRyLCBlbmQsIEtXX0lOQ0xVREUpKSB7CisgICAgICBzdGF0ZS0+aGFuZGxlciA9IGNvbmRTZWN0MTsKKyAgICAgIHJldHVybiBYTUxfUk9MRV9OT05FOworICAgIH0KKyAgICBpZiAoWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsIHB0ciwgZW5kLCBLV19JR05PUkUpKSB7CisgICAgICBzdGF0ZS0+aGFuZGxlciA9IGNvbmRTZWN0MjsKKyAgICAgIHJldHVybiBYTUxfUk9MRV9OT05FOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK2NvbmRTZWN0MShQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICAgIGludCB0b2ssCisgICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7CisgIGNhc2UgWE1MX1RPS19PUEVOX0JSQUNLRVQ6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBleHRlcm5hbFN1YnNldDE7CisgICAgc3RhdGUtPmluY2x1ZGVMZXZlbCArPSAxOworICAgIHJldHVybiBYTUxfUk9MRV9OT05FOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorY29uZFNlY3QyKFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgICAgaW50IHRvaywKKyAgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX09QRU5fQlJBQ0tFVDoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGV4dGVybmFsU3Vic2V0MTsKKyAgICByZXR1cm4gWE1MX1JPTEVfSUdOT1JFX1NFQ1Q7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworI2VuZGlmIC8qIFhNTF9EVEQgKi8KKworc3RhdGljIGludCBQVFJDQUxMCitkZWNsQ2xvc2UoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgICBpbnQgdG9rLAorICAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgorICAgIHJldHVybiBzdGF0ZS0+cm9sZV9ub25lOworICBjYXNlIFhNTF9UT0tfREVDTF9DTE9TRToKKyAgICBzZXRUb3BMZXZlbChzdGF0ZSk7CisgICAgcmV0dXJuIHN0YXRlLT5yb2xlX25vbmU7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitlcnJvcihQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgaW50IHRvaywKKyAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHJldHVybiBYTUxfUk9MRV9OT05FOworfQorCitzdGF0aWMgaW50IEZBU1RDQUxMCitjb21tb24oUFJPTE9HX1NUQVRFICpzdGF0ZSwgaW50IHRvaykKK3sKKyNpZmRlZiBYTUxfRFRECisgIGlmICghc3RhdGUtPmRvY3VtZW50RW50aXR5ICYmIHRvayA9PSBYTUxfVE9LX1BBUkFNX0VOVElUWV9SRUYpCisgICAgcmV0dXJuIFhNTF9ST0xFX0lOTkVSX1BBUkFNX0VOVElUWV9SRUY7CisjZW5kaWYKKyAgc3RhdGUtPmhhbmRsZXIgPSBlcnJvcjsKKyAgcmV0dXJuIFhNTF9ST0xFX0VSUk9SOworfQorCit2b2lkCitYbWxQcm9sb2dTdGF0ZUluaXQoUFJPTE9HX1NUQVRFICpzdGF0ZSkKK3sKKyAgc3RhdGUtPmhhbmRsZXIgPSBwcm9sb2cwOworI2lmZGVmIFhNTF9EVEQKKyAgc3RhdGUtPmRvY3VtZW50RW50aXR5ID0gMTsKKyAgc3RhdGUtPmluY2x1ZGVMZXZlbCA9IDA7CisgIHN0YXRlLT5pbkVudGl0eVZhbHVlID0gMDsKKyNlbmRpZiAvKiBYTUxfRFREICovCit9CisKKyNpZmRlZiBYTUxfRFRECisKK3ZvaWQKK1htbFByb2xvZ1N0YXRlSW5pdEV4dGVybmFsRW50aXR5KFBST0xPR19TVEFURSAqc3RhdGUpCit7CisgIHN0YXRlLT5oYW5kbGVyID0gZXh0ZXJuYWxTdWJzZXQwOworICBzdGF0ZS0+ZG9jdW1lbnRFbnRpdHkgPSAwOworICBzdGF0ZS0+aW5jbHVkZUxldmVsID0gMDsKK30KKworI2VuZGlmIC8qIFhNTF9EVEQgKi8KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2xpYi94bWxyb2xlLmggYi9leHBhdC0yLjAuMS9saWIveG1scm9sZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZDlmMDYKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9saWIveG1scm9sZS5oCkBAIC0wLDAgKzEsMTE0IEBACisvKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgVGhhaSBPcGVuIFNvdXJjZSBTb2Z0d2FyZSBDZW50ZXIgTHRkCisgICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgY29weWluZyBwZXJtaXNzaW9uLgorKi8KKworI2lmbmRlZiBYbWxSb2xlX0lOQ0xVREVECisjZGVmaW5lIFhtbFJvbGVfSU5DTFVERUQgMQorCisjaWZkZWYgX19WTVMKKy8qICAgICAgMCAgICAgICAgMSAgICAgICAgIDIgICAgICAgICAzICAgICAgMCAgICAgICAgMSAgICAgICAgIDIgICAgICAgICAzCisgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEgICAgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEgKi8KKyNkZWZpbmUgWG1sUHJvbG9nU3RhdGVJbml0RXh0ZXJuYWxFbnRpdHkgICAgWG1sUHJvbG9nU3RhdGVJbml0RXh0ZXJuYWxFbnQKKyNlbmRpZgorCisjaW5jbHVkZSAieG1sdG9rLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworZW51bSB7CisgIFhNTF9ST0xFX0VSUk9SID0gLTEsCisgIFhNTF9ST0xFX05PTkUgPSAwLAorICBYTUxfUk9MRV9YTUxfREVDTCwKKyAgWE1MX1JPTEVfSU5TVEFOQ0VfU1RBUlQsCisgIFhNTF9ST0xFX0RPQ1RZUEVfTk9ORSwKKyAgWE1MX1JPTEVfRE9DVFlQRV9OQU1FLAorICBYTUxfUk9MRV9ET0NUWVBFX1NZU1RFTV9JRCwKKyAgWE1MX1JPTEVfRE9DVFlQRV9QVUJMSUNfSUQsCisgIFhNTF9ST0xFX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VULAorICBYTUxfUk9MRV9ET0NUWVBFX0NMT1NFLAorICBYTUxfUk9MRV9HRU5FUkFMX0VOVElUWV9OQU1FLAorICBYTUxfUk9MRV9QQVJBTV9FTlRJVFlfTkFNRSwKKyAgWE1MX1JPTEVfRU5USVRZX05PTkUsCisgIFhNTF9ST0xFX0VOVElUWV9WQUxVRSwKKyAgWE1MX1JPTEVfRU5USVRZX1NZU1RFTV9JRCwKKyAgWE1MX1JPTEVfRU5USVRZX1BVQkxJQ19JRCwKKyAgWE1MX1JPTEVfRU5USVRZX0NPTVBMRVRFLAorICBYTUxfUk9MRV9FTlRJVFlfTk9UQVRJT05fTkFNRSwKKyAgWE1MX1JPTEVfTk9UQVRJT05fTk9ORSwKKyAgWE1MX1JPTEVfTk9UQVRJT05fTkFNRSwKKyAgWE1MX1JPTEVfTk9UQVRJT05fU1lTVEVNX0lELAorICBYTUxfUk9MRV9OT1RBVElPTl9OT19TWVNURU1fSUQsCisgIFhNTF9ST0xFX05PVEFUSU9OX1BVQkxJQ19JRCwKKyAgWE1MX1JPTEVfQVRUUklCVVRFX05BTUUsCisgIFhNTF9ST0xFX0FUVFJJQlVURV9UWVBFX0NEQVRBLAorICBYTUxfUk9MRV9BVFRSSUJVVEVfVFlQRV9JRCwKKyAgWE1MX1JPTEVfQVRUUklCVVRFX1RZUEVfSURSRUYsCisgIFhNTF9ST0xFX0FUVFJJQlVURV9UWVBFX0lEUkVGUywKKyAgWE1MX1JPTEVfQVRUUklCVVRFX1RZUEVfRU5USVRZLAorICBYTUxfUk9MRV9BVFRSSUJVVEVfVFlQRV9FTlRJVElFUywKKyAgWE1MX1JPTEVfQVRUUklCVVRFX1RZUEVfTk1UT0tFTiwKKyAgWE1MX1JPTEVfQVRUUklCVVRFX1RZUEVfTk1UT0tFTlMsCisgIFhNTF9ST0xFX0FUVFJJQlVURV9FTlVNX1ZBTFVFLAorICBYTUxfUk9MRV9BVFRSSUJVVEVfTk9UQVRJT05fVkFMVUUsCisgIFhNTF9ST0xFX0FUVExJU1RfTk9ORSwKKyAgWE1MX1JPTEVfQVRUTElTVF9FTEVNRU5UX05BTUUsCisgIFhNTF9ST0xFX0lNUExJRURfQVRUUklCVVRFX1ZBTFVFLAorICBYTUxfUk9MRV9SRVFVSVJFRF9BVFRSSUJVVEVfVkFMVUUsCisgIFhNTF9ST0xFX0RFRkFVTFRfQVRUUklCVVRFX1ZBTFVFLAorICBYTUxfUk9MRV9GSVhFRF9BVFRSSUJVVEVfVkFMVUUsCisgIFhNTF9ST0xFX0VMRU1FTlRfTk9ORSwKKyAgWE1MX1JPTEVfRUxFTUVOVF9OQU1FLAorICBYTUxfUk9MRV9DT05URU5UX0FOWSwKKyAgWE1MX1JPTEVfQ09OVEVOVF9FTVBUWSwKKyAgWE1MX1JPTEVfQ09OVEVOVF9QQ0RBVEEsCisgIFhNTF9ST0xFX0dST1VQX09QRU4sCisgIFhNTF9ST0xFX0dST1VQX0NMT1NFLAorICBYTUxfUk9MRV9HUk9VUF9DTE9TRV9SRVAsCisgIFhNTF9ST0xFX0dST1VQX0NMT1NFX09QVCwKKyAgWE1MX1JPTEVfR1JPVVBfQ0xPU0VfUExVUywKKyAgWE1MX1JPTEVfR1JPVVBfQ0hPSUNFLAorICBYTUxfUk9MRV9HUk9VUF9TRVFVRU5DRSwKKyAgWE1MX1JPTEVfQ09OVEVOVF9FTEVNRU5ULAorICBYTUxfUk9MRV9DT05URU5UX0VMRU1FTlRfUkVQLAorICBYTUxfUk9MRV9DT05URU5UX0VMRU1FTlRfT1BULAorICBYTUxfUk9MRV9DT05URU5UX0VMRU1FTlRfUExVUywKKyAgWE1MX1JPTEVfUEksCisgIFhNTF9ST0xFX0NPTU1FTlQsCisjaWZkZWYgWE1MX0RURAorICBYTUxfUk9MRV9URVhUX0RFQ0wsCisgIFhNTF9ST0xFX0lHTk9SRV9TRUNULAorICBYTUxfUk9MRV9JTk5FUl9QQVJBTV9FTlRJVFlfUkVGLAorI2VuZGlmIC8qIFhNTF9EVEQgKi8KKyAgWE1MX1JPTEVfUEFSQU1fRU5USVRZX1JFRgorfTsKKwordHlwZWRlZiBzdHJ1Y3QgcHJvbG9nX3N0YXRlIHsKKyAgaW50IChQVFJDQUxMICpoYW5kbGVyKSAoc3RydWN0IHByb2xvZ19zdGF0ZSAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKTsKKyAgdW5zaWduZWQgbGV2ZWw7CisgIGludCByb2xlX25vbmU7CisjaWZkZWYgWE1MX0RURAorICB1bnNpZ25lZCBpbmNsdWRlTGV2ZWw7CisgIGludCBkb2N1bWVudEVudGl0eTsKKyAgaW50IGluRW50aXR5VmFsdWU7CisjZW5kaWYgLyogWE1MX0RURCAqLworfSBQUk9MT0dfU1RBVEU7CisKK3ZvaWQgWG1sUHJvbG9nU3RhdGVJbml0KFBST0xPR19TVEFURSAqKTsKKyNpZmRlZiBYTUxfRFRECit2b2lkIFhtbFByb2xvZ1N0YXRlSW5pdEV4dGVybmFsRW50aXR5KFBST0xPR19TVEFURSAqKTsKKyNlbmRpZiAvKiBYTUxfRFREICovCisKKyNkZWZpbmUgWG1sVG9rZW5Sb2xlKHN0YXRlLCB0b2ssIHB0ciwgZW5kLCBlbmMpIFwKKyAoKChzdGF0ZSktPmhhbmRsZXIpKHN0YXRlLCB0b2ssIHB0ciwgZW5kLCBlbmMpKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogbm90IFhtbFJvbGVfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2xpYi94bWx0b2suYyBiL2V4cGF0LTIuMC4xL2xpYi94bWx0b2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjhhZmRlCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvbGliL3htbHRvay5jCkBAIC0wLDAgKzEsMTY1MSBAQAorLyogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5IFRoYWkgT3BlbiBTb3VyY2UgU29mdHdhcmUgQ2VudGVyIEx0ZAorICAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIGNvcHlpbmcgcGVybWlzc2lvbi4KKyovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2lmZGVmIENPTVBJTEVEX0ZST01fRFNQCisjaW5jbHVkZSAid2luY29uZmlnLmgiCisjZWxpZiBkZWZpbmVkKE1BQ09TX0NMQVNTSUMpCisjaW5jbHVkZSAibWFjY29uZmlnLmgiCisjZWxpZiBkZWZpbmVkKF9fYW1pZ2FvczRfXykKKyNpbmNsdWRlICJhbWlnYWNvbmZpZy5oIgorI2VsaWYgZGVmaW5lZChfX1dBVENPTUNfXykKKyNpbmNsdWRlICJ3YXRjb21jb25maWcuaCIKKyNlbHNlCisjaWZkZWYgSEFWRV9FWFBBVF9DT05GSUdfSAorI2luY2x1ZGUgPGV4cGF0X2NvbmZpZy5oPgorI2VuZGlmCisjZW5kaWYgLyogbmRlZiBDT01QSUxFRF9GUk9NX0RTUCAqLworCisjaW5jbHVkZSAiZXhwYXRfZXh0ZXJuYWwuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInhtbHRvay5oIgorI2luY2x1ZGUgIm5hbWV0YWIuaCIKKworI2lmZGVmIFhNTF9EVEQKKyNkZWZpbmUgSUdOT1JFX1NFQ1RJT05fVE9LX1ZUQUJMRSAsIFBSRUZJWChpZ25vcmVTZWN0aW9uVG9rKQorI2Vsc2UKKyNkZWZpbmUgSUdOT1JFX1NFQ1RJT05fVE9LX1ZUQUJMRSAvKiBhcyBub3RoaW5nICovCisjZW5kaWYKKworI2RlZmluZSBWVEFCTEUxIFwKKyAgeyBQUkVGSVgocHJvbG9nVG9rKSwgUFJFRklYKGNvbnRlbnRUb2spLCBcCisgICAgUFJFRklYKGNkYXRhU2VjdGlvblRvaykgSUdOT1JFX1NFQ1RJT05fVE9LX1ZUQUJMRSB9LCBcCisgIHsgUFJFRklYKGF0dHJpYnV0ZVZhbHVlVG9rKSwgUFJFRklYKGVudGl0eVZhbHVlVG9rKSB9LCBcCisgIFBSRUZJWChzYW1lTmFtZSksIFwKKyAgUFJFRklYKG5hbWVNYXRjaGVzQXNjaWkpLCBcCisgIFBSRUZJWChuYW1lTGVuZ3RoKSwgXAorICBQUkVGSVgoc2tpcFMpLCBcCisgIFBSRUZJWChnZXRBdHRzKSwgXAorICBQUkVGSVgoY2hhclJlZk51bWJlciksIFwKKyAgUFJFRklYKHByZWRlZmluZWRFbnRpdHlOYW1lKSwgXAorICBQUkVGSVgodXBkYXRlUG9zaXRpb24pLCBcCisgIFBSRUZJWChpc1B1YmxpY0lkKQorCisjZGVmaW5lIFZUQUJMRSBWVEFCTEUxLCBQUkVGSVgodG9VdGY4KSwgUFJFRklYKHRvVXRmMTYpCisKKyNkZWZpbmUgVUNTMl9HRVRfTkFNSU5HKHBhZ2VzLCBoaSwgbG8pIFwKKyAgIChuYW1pbmdCaXRtYXBbKHBhZ2VzW2hpXSA8PCAzKSArICgobG8pID4+IDUpXSAmICgxIDw8ICgobG8pICYgMHgxRikpKQorCisvKiBBIDIgYnl0ZSBVVEYtOCByZXByZXNlbnRhdGlvbiBzcGxpdHMgdGhlIGNoYXJhY3RlcnMgMTEgYml0cyBiZXR3ZWVuCisgICB0aGUgYm90dG9tIDUgYW5kIDYgYml0cyBvZiB0aGUgYnl0ZXMuICBXZSBuZWVkIDggYml0cyB0byBpbmRleCBpbnRvCisgICBwYWdlcywgMyBiaXRzIHRvIGFkZCB0byB0aGF0IGluZGV4IGFuZCA1IGJpdHMgdG8gZ2VuZXJhdGUgdGhlIG1hc2suCisqLworI2RlZmluZSBVVEY4X0dFVF9OQU1JTkcyKHBhZ2VzLCBieXRlKSBcCisgICAgKG5hbWluZ0JpdG1hcFsoKHBhZ2VzKVsoKChieXRlKVswXSkgPj4gMikgJiA3XSA8PCAzKSBcCisgICAgICAgICAgICAgICAgICAgICAgKyAoKCgoYnl0ZSlbMF0pICYgMykgPDwgMSkgXAorICAgICAgICAgICAgICAgICAgICAgICsgKCgoKGJ5dGUpWzFdKSA+PiA1KSAmIDEpXSBcCisgICAgICAgICAmICgxIDw8ICgoKGJ5dGUpWzFdKSAmIDB4MUYpKSkKKworLyogQSAzIGJ5dGUgVVRGLTggcmVwcmVzZW50YXRpb24gc3BsaXRzIHRoZSBjaGFyYWN0ZXJzIDE2IGJpdHMgYmV0d2VlbgorICAgdGhlIGJvdHRvbSA0LCA2IGFuZCA2IGJpdHMgb2YgdGhlIGJ5dGVzLiAgV2UgbmVlZCA4IGJpdHMgdG8gaW5kZXgKKyAgIGludG8gcGFnZXMsIDMgYml0cyB0byBhZGQgdG8gdGhhdCBpbmRleCBhbmQgNSBiaXRzIHRvIGdlbmVyYXRlIHRoZQorICAgbWFzay4KKyovCisjZGVmaW5lIFVURjhfR0VUX05BTUlORzMocGFnZXMsIGJ5dGUpIFwKKyAgKG5hbWluZ0JpdG1hcFsoKHBhZ2VzKVsoKCgoYnl0ZSlbMF0pICYgMHhGKSA8PCA0KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCgoKGJ5dGUpWzFdKSA+PiAyKSAmIDB4RildIFwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgMykgXAorICAgICAgICAgICAgICAgICAgICAgICsgKCgoKGJ5dGUpWzFdKSAmIDMpIDw8IDEpIFwKKyAgICAgICAgICAgICAgICAgICAgICArICgoKChieXRlKVsyXSkgPj4gNSkgJiAxKV0gXAorICAgICAgICAgJiAoMSA8PCAoKChieXRlKVsyXSkgJiAweDFGKSkpCisKKyNkZWZpbmUgVVRGOF9HRVRfTkFNSU5HKHBhZ2VzLCBwLCBuKSBcCisgICgobikgPT0gMiBcCisgID8gVVRGOF9HRVRfTkFNSU5HMihwYWdlcywgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikocCkpIFwKKyAgOiAoKG4pID09IDMgXAorICAgICA/IFVURjhfR0VUX05BTUlORzMocGFnZXMsIChjb25zdCB1bnNpZ25lZCBjaGFyICopKHApKSBcCisgICAgIDogMCkpCisKKy8qIERldGVjdGlvbiBvZiBpbnZhbGlkIFVURi04IHNlcXVlbmNlcyBpcyBiYXNlZCBvbiBUYWJsZSAzLjFCCisgICBvZiBVbmljb2RlIDMuMjogaHR0cDovL3d3dy51bmljb2RlLm9yZy91bmljb2RlL3JlcG9ydHMvdHIyOC8KKyAgIHdpdGggdGhlIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb24gb2Ygbm90IGFsbG93aW5nIHRoZSBVbmljb2RlCisgICBjb2RlIHBvaW50cyAweEZGRkYgYW5kIDB4RkZGRSAoc2VxdWVuY2VzIEVGLEJGLEJGIGFuZCBFRixCRixCRSkuCisgICBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzOgorICAgICAoQSAmIDB4ODApID09IDAgICAgIG1lYW5zIEEgPCAweDgwCisgICBhbmQKKyAgICAgKEEgJiAweEMwKSA9PSAweEMwICBtZWFucyBBID4gMHhCRgorKi8KKworI2RlZmluZSBVVEY4X0lOVkFMSUQyKHApIFwKKyAgKCgqcCkgPCAweEMyIHx8ICgocClbMV0gJiAweDgwKSA9PSAwIHx8ICgocClbMV0gJiAweEMwKSA9PSAweEMwKQorCisjZGVmaW5lIFVURjhfSU5WQUxJRDMocCkgXAorICAoKChwKVsyXSAmIDB4ODApID09IDAgXAorICB8fCBcCisgICgoKnApID09IDB4RUYgJiYgKHApWzFdID09IDB4QkYgXAorICAgID8gXAorICAgIChwKVsyXSA+IDB4QkQgXAorICAgIDogXAorICAgICgocClbMl0gJiAweEMwKSA9PSAweEMwKSBcCisgIHx8IFwKKyAgKCgqcCkgPT0gMHhFMCBcCisgICAgPyBcCisgICAgKHApWzFdIDwgMHhBMCB8fCAoKHApWzFdICYgMHhDMCkgPT0gMHhDMCBcCisgICAgOiBcCisgICAgKChwKVsxXSAmIDB4ODApID09IDAgXAorICAgIHx8IFwKKyAgICAoKCpwKSA9PSAweEVEID8gKHApWzFdID4gMHg5RiA6ICgocClbMV0gJiAweEMwKSA9PSAweEMwKSkpCisKKyNkZWZpbmUgVVRGOF9JTlZBTElENChwKSBcCisgICgoKHApWzNdICYgMHg4MCkgPT0gMCB8fCAoKHApWzNdICYgMHhDMCkgPT0gMHhDMCBcCisgIHx8IFwKKyAgKChwKVsyXSAmIDB4ODApID09IDAgfHwgKChwKVsyXSAmIDB4QzApID09IDB4QzAgXAorICB8fCBcCisgICgoKnApID09IDB4RjAgXAorICAgID8gXAorICAgIChwKVsxXSA8IDB4OTAgfHwgKChwKVsxXSAmIDB4QzApID09IDB4QzAgXAorICAgIDogXAorICAgICgocClbMV0gJiAweDgwKSA9PSAwIFwKKyAgICB8fCBcCisgICAgKCgqcCkgPT0gMHhGNCA/IChwKVsxXSA+IDB4OEYgOiAoKHApWzFdICYgMHhDMCkgPT0gMHhDMCkpKQorCitzdGF0aWMgaW50IFBUUkZBU1RDQUxMCitpc05ldmVyKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnApCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IFBUUkZBU1RDQUxMCit1dGY4X2lzTmFtZTIoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCkKK3sKKyAgcmV0dXJuIFVURjhfR0VUX05BTUlORzIobmFtZVBhZ2VzLCAoY29uc3QgdW5zaWduZWQgY2hhciAqKXApOworfQorCitzdGF0aWMgaW50IFBUUkZBU1RDQUxMCit1dGY4X2lzTmFtZTMoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCkKK3sKKyAgcmV0dXJuIFVURjhfR0VUX05BTUlORzMobmFtZVBhZ2VzLCAoY29uc3QgdW5zaWduZWQgY2hhciAqKXApOworfQorCisjZGVmaW5lIHV0ZjhfaXNOYW1lNCBpc05ldmVyCisKK3N0YXRpYyBpbnQgUFRSRkFTVENBTEwKK3V0ZjhfaXNObXN0cnQyKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnApCit7CisgIHJldHVybiBVVEY4X0dFVF9OQU1JTkcyKG5tc3RydFBhZ2VzLCAoY29uc3QgdW5zaWduZWQgY2hhciAqKXApOworfQorCitzdGF0aWMgaW50IFBUUkZBU1RDQUxMCit1dGY4X2lzTm1zdHJ0Myhjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwKQoreworICByZXR1cm4gVVRGOF9HRVRfTkFNSU5HMyhubXN0cnRQYWdlcywgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwKTsKK30KKworI2RlZmluZSB1dGY4X2lzTm1zdHJ0NCBpc05ldmVyCisKK3N0YXRpYyBpbnQgUFRSRkFTVENBTEwKK3V0ZjhfaXNJbnZhbGlkMihjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwKQoreworICByZXR1cm4gVVRGOF9JTlZBTElEMigoY29uc3QgdW5zaWduZWQgY2hhciAqKXApOworfQorCitzdGF0aWMgaW50IFBUUkZBU1RDQUxMCit1dGY4X2lzSW52YWxpZDMoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCkKK3sKKyAgcmV0dXJuIFVURjhfSU5WQUxJRDMoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwKTsKK30KKworc3RhdGljIGludCBQVFJGQVNUQ0FMTAordXRmOF9pc0ludmFsaWQ0KGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnApCit7CisgIHJldHVybiBVVEY4X0lOVkFMSUQ0KChjb25zdCB1bnNpZ25lZCBjaGFyICopcCk7Cit9CisKK3N0cnVjdCBub3JtYWxfZW5jb2RpbmcgeworICBFTkNPRElORyBlbmM7CisgIHVuc2lnbmVkIGNoYXIgdHlwZVsyNTZdOworI2lmZGVmIFhNTF9NSU5fU0laRQorICBpbnQgKFBUUkZBU1RDQUxMICpieXRlVHlwZSkoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKKyAgaW50IChQVFJGQVNUQ0FMTCAqaXNOYW1lTWluKShjb25zdCBFTkNPRElORyAqLCBjb25zdCBjaGFyICopOworICBpbnQgKFBUUkZBU1RDQUxMICppc05tc3RydE1pbikoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKKyAgaW50IChQVFJGQVNUQ0FMTCAqYnl0ZVRvQXNjaWkpKGNvbnN0IEVOQ09ESU5HICosIGNvbnN0IGNoYXIgKik7CisgIGludCAoUFRSQ0FMTCAqY2hhck1hdGNoZXMpKGNvbnN0IEVOQ09ESU5HICosIGNvbnN0IGNoYXIgKiwgaW50KTsKKyNlbmRpZiAvKiBYTUxfTUlOX1NJWkUgKi8KKyAgaW50IChQVFJGQVNUQ0FMTCAqaXNOYW1lMikoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKKyAgaW50IChQVFJGQVNUQ0FMTCAqaXNOYW1lMykoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKKyAgaW50IChQVFJGQVNUQ0FMTCAqaXNOYW1lNCkoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKKyAgaW50IChQVFJGQVNUQ0FMTCAqaXNObXN0cnQyKShjb25zdCBFTkNPRElORyAqLCBjb25zdCBjaGFyICopOworICBpbnQgKFBUUkZBU1RDQUxMICppc05tc3RydDMpKGNvbnN0IEVOQ09ESU5HICosIGNvbnN0IGNoYXIgKik7CisgIGludCAoUFRSRkFTVENBTEwgKmlzTm1zdHJ0NCkoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKKyAgaW50IChQVFJGQVNUQ0FMTCAqaXNJbnZhbGlkMikoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKKyAgaW50IChQVFJGQVNUQ0FMTCAqaXNJbnZhbGlkMykoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKKyAgaW50IChQVFJGQVNUQ0FMTCAqaXNJbnZhbGlkNCkoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKK307CisKKyNkZWZpbmUgQVNfTk9STUFMX0VOQ09ESU5HKGVuYykgICAoKGNvbnN0IHN0cnVjdCBub3JtYWxfZW5jb2RpbmcgKikgKGVuYykpCisKKyNpZmRlZiBYTUxfTUlOX1NJWkUKKworI2RlZmluZSBTVEFOREFSRF9WVEFCTEUoRSkgXAorIEUgIyMgYnl0ZVR5cGUsIFwKKyBFICMjIGlzTmFtZU1pbiwgXAorIEUgIyMgaXNObXN0cnRNaW4sIFwKKyBFICMjIGJ5dGVUb0FzY2lpLCBcCisgRSAjIyBjaGFyTWF0Y2hlcywKKworI2Vsc2UKKworI2RlZmluZSBTVEFOREFSRF9WVEFCTEUoRSkgLyogYXMgbm90aGluZyAqLworCisjZW5kaWYKKworI2RlZmluZSBOT1JNQUxfVlRBQkxFKEUpIFwKKyBFICMjIGlzTmFtZTIsIFwKKyBFICMjIGlzTmFtZTMsIFwKKyBFICMjIGlzTmFtZTQsIFwKKyBFICMjIGlzTm1zdHJ0MiwgXAorIEUgIyMgaXNObXN0cnQzLCBcCisgRSAjIyBpc05tc3RydDQsIFwKKyBFICMjIGlzSW52YWxpZDIsIFwKKyBFICMjIGlzSW52YWxpZDMsIFwKKyBFICMjIGlzSW52YWxpZDQKKworc3RhdGljIGludCBGQVNUQ0FMTCBjaGVja0NoYXJSZWZOdW1iZXIoaW50KTsKKworI2luY2x1ZGUgInhtbHRva19pbXBsLmgiCisjaW5jbHVkZSAiYXNjaWkuaCIKKworI2lmZGVmIFhNTF9NSU5fU0laRQorI2RlZmluZSBzYl9pc05hbWVNaW4gaXNOZXZlcgorI2RlZmluZSBzYl9pc05tc3RydE1pbiBpc05ldmVyCisjZW5kaWYKKworI2lmZGVmIFhNTF9NSU5fU0laRQorI2RlZmluZSBNSU5CUEMoZW5jKSAoKGVuYyktPm1pbkJ5dGVzUGVyQ2hhcikKKyNlbHNlCisvKiBtaW5pbXVtIGJ5dGVzIHBlciBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgTUlOQlBDKGVuYykgMQorI2VuZGlmCisKKyNkZWZpbmUgU0JfQllURV9UWVBFKGVuYywgcCkgXAorICAoKChzdHJ1Y3Qgbm9ybWFsX2VuY29kaW5nICopKGVuYykpLT50eXBlWyh1bnNpZ25lZCBjaGFyKSoocCldKQorCisjaWZkZWYgWE1MX01JTl9TSVpFCitzdGF0aWMgaW50IFBUUkZBU1RDQUxMCitzYl9ieXRlVHlwZShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwKQoreworICByZXR1cm4gU0JfQllURV9UWVBFKGVuYywgcCk7Cit9CisjZGVmaW5lIEJZVEVfVFlQRShlbmMsIHApIFwKKyAoQVNfTk9STUFMX0VOQ09ESU5HKGVuYyktPmJ5dGVUeXBlKGVuYywgcCkpCisjZWxzZQorI2RlZmluZSBCWVRFX1RZUEUoZW5jLCBwKSBTQl9CWVRFX1RZUEUoZW5jLCBwKQorI2VuZGlmCisKKyNpZmRlZiBYTUxfTUlOX1NJWkUKKyNkZWZpbmUgQllURV9UT19BU0NJSShlbmMsIHApIFwKKyAoQVNfTk9STUFMX0VOQ09ESU5HKGVuYyktPmJ5dGVUb0FzY2lpKGVuYywgcCkpCitzdGF0aWMgaW50IFBUUkZBU1RDQUxMCitzYl9ieXRlVG9Bc2NpaShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwKQoreworICByZXR1cm4gKnA7Cit9CisjZWxzZQorI2RlZmluZSBCWVRFX1RPX0FTQ0lJKGVuYywgcCkgKCoocCkpCisjZW5kaWYKKworI2RlZmluZSBJU19OQU1FX0NIQVIoZW5jLCBwLCBuKSBcCisgKEFTX05PUk1BTF9FTkNPRElORyhlbmMpLT5pc05hbWUgIyMgbihlbmMsIHApKQorI2RlZmluZSBJU19OTVNUUlRfQ0hBUihlbmMsIHAsIG4pIFwKKyAoQVNfTk9STUFMX0VOQ09ESU5HKGVuYyktPmlzTm1zdHJ0ICMjIG4oZW5jLCBwKSkKKyNkZWZpbmUgSVNfSU5WQUxJRF9DSEFSKGVuYywgcCwgbikgXAorIChBU19OT1JNQUxfRU5DT0RJTkcoZW5jKS0+aXNJbnZhbGlkICMjIG4oZW5jLCBwKSkKKworI2lmZGVmIFhNTF9NSU5fU0laRQorI2RlZmluZSBJU19OQU1FX0NIQVJfTUlOQlBDKGVuYywgcCkgXAorIChBU19OT1JNQUxfRU5DT0RJTkcoZW5jKS0+aXNOYW1lTWluKGVuYywgcCkpCisjZGVmaW5lIElTX05NU1RSVF9DSEFSX01JTkJQQyhlbmMsIHApIFwKKyAoQVNfTk9STUFMX0VOQ09ESU5HKGVuYyktPmlzTm1zdHJ0TWluKGVuYywgcCkpCisjZWxzZQorI2RlZmluZSBJU19OQU1FX0NIQVJfTUlOQlBDKGVuYywgcCkgKDApCisjZGVmaW5lIElTX05NU1RSVF9DSEFSX01JTkJQQyhlbmMsIHApICgwKQorI2VuZGlmCisKKyNpZmRlZiBYTUxfTUlOX1NJWkUKKyNkZWZpbmUgQ0hBUl9NQVRDSEVTKGVuYywgcCwgYykgXAorIChBU19OT1JNQUxfRU5DT0RJTkcoZW5jKS0+Y2hhck1hdGNoZXMoZW5jLCBwLCBjKSkKK3N0YXRpYyBpbnQgUFRSQ0FMTAorc2JfY2hhck1hdGNoZXMoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCwgaW50IGMpCit7CisgIHJldHVybiAqcCA9PSBjOworfQorI2Vsc2UKKy8qIGMgaXMgYW4gQVNDSUkgY2hhcmFjdGVyICovCisjZGVmaW5lIENIQVJfTUFUQ0hFUyhlbmMsIHAsIGMpICgqKHApID09IGMpCisjZW5kaWYKKworI2RlZmluZSBQUkVGSVgoaWRlbnQpIG5vcm1hbF8gIyMgaWRlbnQKKyNkZWZpbmUgWE1MX1RPS19JTVBMX0MKKyNpbmNsdWRlICJ4bWx0b2tfaW1wbC5jIgorI3VuZGVmIFhNTF9UT0tfSU1QTF9DCisKKyN1bmRlZiBNSU5CUEMKKyN1bmRlZiBCWVRFX1RZUEUKKyN1bmRlZiBCWVRFX1RPX0FTQ0lJCisjdW5kZWYgQ0hBUl9NQVRDSEVTCisjdW5kZWYgSVNfTkFNRV9DSEFSCisjdW5kZWYgSVNfTkFNRV9DSEFSX01JTkJQQworI3VuZGVmIElTX05NU1RSVF9DSEFSCisjdW5kZWYgSVNfTk1TVFJUX0NIQVJfTUlOQlBDCisjdW5kZWYgSVNfSU5WQUxJRF9DSEFSCisKK2VudW0geyAgLyogVVRGOF9jdmFsTiBpcyB2YWx1ZSBvZiBtYXNrZWQgZmlyc3QgYnl0ZSBvZiBOIGJ5dGUgc2VxdWVuY2UgKi8KKyAgVVRGOF9jdmFsMSA9IDB4MDAsCisgIFVURjhfY3ZhbDIgPSAweGMwLAorICBVVEY4X2N2YWwzID0gMHhlMCwKKyAgVVRGOF9jdmFsNCA9IDB4ZjAKK307CisKK3N0YXRpYyB2b2lkIFBUUkNBTEwKK3V0ZjhfdG9VdGY4KGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgICBjb25zdCBjaGFyICoqZnJvbVAsIGNvbnN0IGNoYXIgKmZyb21MaW0sCisgICAgICAgICAgICBjaGFyICoqdG9QLCBjb25zdCBjaGFyICp0b0xpbSkKK3sKKyAgY2hhciAqdG87CisgIGNvbnN0IGNoYXIgKmZyb207CisgIGlmIChmcm9tTGltIC0gKmZyb21QID4gdG9MaW0gLSAqdG9QKSB7CisgICAgLyogQXZvaWQgY29weWluZyBwYXJ0aWFsIGNoYXJhY3RlcnMuICovCisgICAgZm9yIChmcm9tTGltID0gKmZyb21QICsgKHRvTGltIC0gKnRvUCk7IGZyb21MaW0gPiAqZnJvbVA7IGZyb21MaW0tLSkKKyAgICAgIGlmICgoKHVuc2lnbmVkIGNoYXIpZnJvbUxpbVstMV0gJiAweGMwKSAhPSAweDgwKQorICAgICAgICBicmVhazsKKyAgfQorICBmb3IgKHRvID0gKnRvUCwgZnJvbSA9ICpmcm9tUDsgZnJvbSAhPSBmcm9tTGltOyBmcm9tKyssIHRvKyspCisgICAgKnRvID0gKmZyb207CisgICpmcm9tUCA9IGZyb207CisgICp0b1AgPSB0bzsKK30KKworc3RhdGljIHZvaWQgUFRSQ0FMTAordXRmOF90b1V0ZjE2KGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqKmZyb21QLCBjb25zdCBjaGFyICpmcm9tTGltLAorICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICoqdG9QLCBjb25zdCB1bnNpZ25lZCBzaG9ydCAqdG9MaW0pCit7CisgIHVuc2lnbmVkIHNob3J0ICp0byA9ICp0b1A7CisgIGNvbnN0IGNoYXIgKmZyb20gPSAqZnJvbVA7CisgIHdoaWxlIChmcm9tICE9IGZyb21MaW0gJiYgdG8gIT0gdG9MaW0pIHsKKyAgICBzd2l0Y2ggKCgoc3RydWN0IG5vcm1hbF9lbmNvZGluZyAqKWVuYyktPnR5cGVbKHVuc2lnbmVkIGNoYXIpKmZyb21dKSB7CisgICAgY2FzZSBCVF9MRUFEMjoKKyAgICAgICp0bysrID0gKHVuc2lnbmVkIHNob3J0KSgoKGZyb21bMF0gJiAweDFmKSA8PCA2KSB8IChmcm9tWzFdICYgMHgzZikpOworICAgICAgZnJvbSArPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVF9MRUFEMzoKKyAgICAgICp0bysrID0gKHVuc2lnbmVkIHNob3J0KSgoKGZyb21bMF0gJiAweGYpIDw8IDEyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChmcm9tWzFdICYgMHgzZikgPDwgNikgfCAoZnJvbVsyXSAmIDB4M2YpKTsKKyAgICAgIGZyb20gKz0gMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlRfTEVBRDQ6CisgICAgICB7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgbjsKKyAgICAgICAgaWYgKHRvICsgMSA9PSB0b0xpbSkKKyAgICAgICAgICBnb3RvIGFmdGVyOworICAgICAgICBuID0gKChmcm9tWzBdICYgMHg3KSA8PCAxOCkgfCAoKGZyb21bMV0gJiAweDNmKSA8PCAxMikKKyAgICAgICAgICAgIHwgKChmcm9tWzJdICYgMHgzZikgPDwgNikgfCAoZnJvbVszXSAmIDB4M2YpOworICAgICAgICBuIC09IDB4MTAwMDA7CisgICAgICAgIHRvWzBdID0gKHVuc2lnbmVkIHNob3J0KSgobiA+PiAxMCkgfCAweEQ4MDApOworICAgICAgICB0b1sxXSA9ICh1bnNpZ25lZCBzaG9ydCkoKG4gJiAweDNGRikgfCAweERDMDApOworICAgICAgICB0byArPSAyOworICAgICAgICBmcm9tICs9IDQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgKnRvKysgPSAqZnJvbSsrOworICAgICAgYnJlYWs7CisgICAgfQorICB9CithZnRlcjoKKyAgKmZyb21QID0gZnJvbTsKKyAgKnRvUCA9IHRvOworfQorCisjaWZkZWYgWE1MX05TCitzdGF0aWMgY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyB1dGY4X2VuY29kaW5nX25zID0geworICB7IFZUQUJMRTEsIHV0ZjhfdG9VdGY4LCB1dGY4X3RvVXRmMTYsIDEsIDEsIDAgfSwKKyAgeworI2luY2x1ZGUgImFzY2lpdGFiLmgiCisjaW5jbHVkZSAidXRmOHRhYi5oIgorICB9LAorICBTVEFOREFSRF9WVEFCTEUoc2JfKSBOT1JNQUxfVlRBQkxFKHV0ZjhfKQorfTsKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyB1dGY4X2VuY29kaW5nID0geworICB7IFZUQUJMRTEsIHV0ZjhfdG9VdGY4LCB1dGY4X3RvVXRmMTYsIDEsIDEsIDAgfSwKKyAgeworI2RlZmluZSBCVF9DT0xPTiBCVF9OTVNUUlQKKyNpbmNsdWRlICJhc2NpaXRhYi5oIgorI3VuZGVmIEJUX0NPTE9OCisjaW5jbHVkZSAidXRmOHRhYi5oIgorICB9LAorICBTVEFOREFSRF9WVEFCTEUoc2JfKSBOT1JNQUxfVlRBQkxFKHV0ZjhfKQorfTsKKworI2lmZGVmIFhNTF9OUworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyBpbnRlcm5hbF91dGY4X2VuY29kaW5nX25zID0geworICB7IFZUQUJMRTEsIHV0ZjhfdG9VdGY4LCB1dGY4X3RvVXRmMTYsIDEsIDEsIDAgfSwKKyAgeworI2luY2x1ZGUgImlhc2NpaXRhYi5oIgorI2luY2x1ZGUgInV0Zjh0YWIuaCIKKyAgfSwKKyAgU1RBTkRBUkRfVlRBQkxFKHNiXykgTk9STUFMX1ZUQUJMRSh1dGY4XykKK307CisKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyBpbnRlcm5hbF91dGY4X2VuY29kaW5nID0geworICB7IFZUQUJMRTEsIHV0ZjhfdG9VdGY4LCB1dGY4X3RvVXRmMTYsIDEsIDEsIDAgfSwKKyAgeworI2RlZmluZSBCVF9DT0xPTiBCVF9OTVNUUlQKKyNpbmNsdWRlICJpYXNjaWl0YWIuaCIKKyN1bmRlZiBCVF9DT0xPTgorI2luY2x1ZGUgInV0Zjh0YWIuaCIKKyAgfSwKKyAgU1RBTkRBUkRfVlRBQkxFKHNiXykgTk9STUFMX1ZUQUJMRSh1dGY4XykKK307CisKK3N0YXRpYyB2b2lkIFBUUkNBTEwKK2xhdGluMV90b1V0ZjgoY29uc3QgRU5DT0RJTkcgKmVuYywKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmZyb21QLCBjb25zdCBjaGFyICpmcm9tTGltLAorICAgICAgICAgICAgICBjaGFyICoqdG9QLCBjb25zdCBjaGFyICp0b0xpbSkKK3sKKyAgZm9yICg7OykgeworICAgIHVuc2lnbmVkIGNoYXIgYzsKKyAgICBpZiAoKmZyb21QID09IGZyb21MaW0pCisgICAgICBicmVhazsKKyAgICBjID0gKHVuc2lnbmVkIGNoYXIpKipmcm9tUDsKKyAgICBpZiAoYyAmIDB4ODApIHsKKyAgICAgIGlmICh0b0xpbSAtICp0b1AgPCAyKQorICAgICAgICBicmVhazsKKyAgICAgICooKnRvUCkrKyA9IChjaGFyKSgoYyA+PiA2KSB8IFVURjhfY3ZhbDIpOworICAgICAgKigqdG9QKSsrID0gKGNoYXIpKChjICYgMHgzZikgfCAweDgwKTsKKyAgICAgICgqZnJvbVApKys7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKCp0b1AgPT0gdG9MaW0pCisgICAgICAgIGJyZWFrOworICAgICAgKigqdG9QKSsrID0gKigqZnJvbVApKys7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFBUUkNBTEwKK2xhdGluMV90b1V0ZjE2KGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqZnJvbVAsIGNvbnN0IGNoYXIgKmZyb21MaW0sCisgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqKnRvUCwgY29uc3QgdW5zaWduZWQgc2hvcnQgKnRvTGltKQoreworICB3aGlsZSAoKmZyb21QICE9IGZyb21MaW0gJiYgKnRvUCAhPSB0b0xpbSkKKyAgICAqKCp0b1ApKysgPSAodW5zaWduZWQgY2hhcikqKCpmcm9tUCkrKzsKK30KKworI2lmZGVmIFhNTF9OUworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyBsYXRpbjFfZW5jb2RpbmdfbnMgPSB7CisgIHsgVlRBQkxFMSwgbGF0aW4xX3RvVXRmOCwgbGF0aW4xX3RvVXRmMTYsIDEsIDAsIDAgfSwKKyAgeworI2luY2x1ZGUgImFzY2lpdGFiLmgiCisjaW5jbHVkZSAibGF0aW4xdGFiLmgiCisgIH0sCisgIFNUQU5EQVJEX1ZUQUJMRShzYl8pCit9OworCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBub3JtYWxfZW5jb2RpbmcgbGF0aW4xX2VuY29kaW5nID0geworICB7IFZUQUJMRTEsIGxhdGluMV90b1V0ZjgsIGxhdGluMV90b1V0ZjE2LCAxLCAwLCAwIH0sCisgIHsKKyNkZWZpbmUgQlRfQ09MT04gQlRfTk1TVFJUCisjaW5jbHVkZSAiYXNjaWl0YWIuaCIKKyN1bmRlZiBCVF9DT0xPTgorI2luY2x1ZGUgImxhdGluMXRhYi5oIgorICB9LAorICBTVEFOREFSRF9WVEFCTEUoc2JfKQorfTsKKworc3RhdGljIHZvaWQgUFRSQ0FMTAorYXNjaWlfdG9VdGY4KGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqKmZyb21QLCBjb25zdCBjaGFyICpmcm9tTGltLAorICAgICAgICAgICAgIGNoYXIgKip0b1AsIGNvbnN0IGNoYXIgKnRvTGltKQoreworICB3aGlsZSAoKmZyb21QICE9IGZyb21MaW0gJiYgKnRvUCAhPSB0b0xpbSkKKyAgICAqKCp0b1ApKysgPSAqKCpmcm9tUCkrKzsKK30KKworI2lmZGVmIFhNTF9OUworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyBhc2NpaV9lbmNvZGluZ19ucyA9IHsKKyAgeyBWVEFCTEUxLCBhc2NpaV90b1V0ZjgsIGxhdGluMV90b1V0ZjE2LCAxLCAxLCAwIH0sCisgIHsKKyNpbmNsdWRlICJhc2NpaXRhYi5oIgorLyogQlRfTk9OWE1MID09IDAgKi8KKyAgfSwKKyAgU1RBTkRBUkRfVlRBQkxFKHNiXykKK307CisKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyBhc2NpaV9lbmNvZGluZyA9IHsKKyAgeyBWVEFCTEUxLCBhc2NpaV90b1V0ZjgsIGxhdGluMV90b1V0ZjE2LCAxLCAxLCAwIH0sCisgIHsKKyNkZWZpbmUgQlRfQ09MT04gQlRfTk1TVFJUCisjaW5jbHVkZSAiYXNjaWl0YWIuaCIKKyN1bmRlZiBCVF9DT0xPTgorLyogQlRfTk9OWE1MID09IDAgKi8KKyAgfSwKKyAgU1RBTkRBUkRfVlRBQkxFKHNiXykKK307CisKK3N0YXRpYyBpbnQgUFRSRkFTVENBTEwKK3VuaWNvZGVfYnl0ZV90eXBlKGNoYXIgaGksIGNoYXIgbG8pCit7CisgIHN3aXRjaCAoKHVuc2lnbmVkIGNoYXIpaGkpIHsKKyAgY2FzZSAweEQ4OiBjYXNlIDB4RDk6IGNhc2UgMHhEQTogY2FzZSAweERCOgorICAgIHJldHVybiBCVF9MRUFENDsKKyAgY2FzZSAweERDOiBjYXNlIDB4REQ6IGNhc2UgMHhERTogY2FzZSAweERGOgorICAgIHJldHVybiBCVF9UUkFJTDsKKyAgY2FzZSAweEZGOgorICAgIHN3aXRjaCAoKHVuc2lnbmVkIGNoYXIpbG8pIHsKKyAgICBjYXNlIDB4RkY6CisgICAgY2FzZSAweEZFOgorICAgICAgcmV0dXJuIEJUX05PTlhNTDsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIEJUX05PTkFTQ0lJOworfQorCisjZGVmaW5lIERFRklORV9VVEYxNl9UT19VVEY4KEUpIFwKK3N0YXRpYyB2b2lkICBQVFJDQUxMIFwKK0UgIyMgdG9VdGY4KGNvbnN0IEVOQ09ESU5HICplbmMsIFwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKipmcm9tUCwgY29uc3QgY2hhciAqZnJvbUxpbSwgXAorICAgICAgICAgICAgY2hhciAqKnRvUCwgY29uc3QgY2hhciAqdG9MaW0pIFwKK3sgXAorICBjb25zdCBjaGFyICpmcm9tOyBcCisgIGZvciAoZnJvbSA9ICpmcm9tUDsgZnJvbSAhPSBmcm9tTGltOyBmcm9tICs9IDIpIHsgXAorICAgIGludCBwbGFuZTsgXAorICAgIHVuc2lnbmVkIGNoYXIgbG8yOyBcCisgICAgdW5zaWduZWQgY2hhciBsbyA9IEdFVF9MTyhmcm9tKTsgXAorICAgIHVuc2lnbmVkIGNoYXIgaGkgPSBHRVRfSEkoZnJvbSk7IFwKKyAgICBzd2l0Y2ggKGhpKSB7IFwKKyAgICBjYXNlIDA6IFwKKyAgICAgIGlmIChsbyA8IDB4ODApIHsgXAorICAgICAgICBpZiAoKnRvUCA9PSB0b0xpbSkgeyBcCisgICAgICAgICAgKmZyb21QID0gZnJvbTsgXAorICAgICAgICAgIHJldHVybjsgXAorICAgICAgICB9IFwKKyAgICAgICAgKigqdG9QKSsrID0gbG87IFwKKyAgICAgICAgYnJlYWs7IFwKKyAgICAgIH0gXAorICAgICAgLyogZmFsbCB0aHJvdWdoICovIFwKKyAgICBjYXNlIDB4MTogY2FzZSAweDI6IGNhc2UgMHgzOiBcCisgICAgY2FzZSAweDQ6IGNhc2UgMHg1OiBjYXNlIDB4NjogY2FzZSAweDc6IFwKKyAgICAgIGlmICh0b0xpbSAtICAqdG9QIDwgMikgeyBcCisgICAgICAgICpmcm9tUCA9IGZyb207IFwKKyAgICAgICAgcmV0dXJuOyBcCisgICAgICB9IFwKKyAgICAgICooKnRvUCkrKyA9ICgobG8gPj4gNikgfCAoaGkgPDwgMikgfCAgVVRGOF9jdmFsMik7IFwKKyAgICAgICooKnRvUCkrKyA9ICgobG8gJiAweDNmKSB8IDB4ODApOyBcCisgICAgICBicmVhazsgXAorICAgIGRlZmF1bHQ6IFwKKyAgICAgIGlmICh0b0xpbSAtICAqdG9QIDwgMykgIHsgXAorICAgICAgICAqZnJvbVAgPSBmcm9tOyBcCisgICAgICAgIHJldHVybjsgXAorICAgICAgfSBcCisgICAgICAvKiAxNiBiaXRzIGRpdmlkZWQgNCwgNiwgNiBhbW9uZ3N0IDMgYnl0ZXMgKi8gXAorICAgICAgKigqdG9QKSsrID0gKChoaSA+PiA0KSB8IFVURjhfY3ZhbDMpOyBcCisgICAgICAqKCp0b1ApKysgPSAoKChoaSAmIDB4ZikgPDwgMikgfCAobG8gPj4gNikgfCAweDgwKTsgXAorICAgICAgKigqdG9QKSsrID0gKChsbyAmIDB4M2YpIHwgMHg4MCk7IFwKKyAgICAgIGJyZWFrOyBcCisgICAgY2FzZSAweEQ4OiBjYXNlIDB4RDk6IGNhc2UgMHhEQTogY2FzZSAweERCOiBcCisgICAgICBpZiAodG9MaW0gLSAgKnRvUCA8IDQpIHsgXAorICAgICAgICAqZnJvbVAgPSBmcm9tOyBcCisgICAgICAgIHJldHVybjsgXAorICAgICAgfSBcCisgICAgICBwbGFuZSA9ICgoKGhpICYgMHgzKSA8PCAyKSB8ICgobG8gPj4gNikgJiAweDMpKSArIDE7IFwKKyAgICAgICooKnRvUCkrKyA9ICgocGxhbmUgPj4gMikgfCBVVEY4X2N2YWw0KTsgXAorICAgICAgKigqdG9QKSsrID0gKCgobG8gPj4gMikgJiAweEYpIHwgKChwbGFuZSAmIDB4MykgPDwgNCkgfCAweDgwKTsgXAorICAgICAgZnJvbSArPSAyOyBcCisgICAgICBsbzIgPSBHRVRfTE8oZnJvbSk7IFwKKyAgICAgICooKnRvUCkrKyA9ICgoKGxvICYgMHgzKSA8PCA0KSBcCisgICAgICAgICAgICAgICAgICAgfCAoKEdFVF9ISShmcm9tKSAmIDB4MykgPDwgMikgXAorICAgICAgICAgICAgICAgICAgIHwgKGxvMiA+PiA2KSBcCisgICAgICAgICAgICAgICAgICAgfCAweDgwKTsgXAorICAgICAgKigqdG9QKSsrID0gKChsbzIgJiAweDNmKSB8IDB4ODApOyBcCisgICAgICBicmVhazsgXAorICAgIH0gXAorICB9IFwKKyAgKmZyb21QID0gZnJvbTsgXAorfQorCisjZGVmaW5lIERFRklORV9VVEYxNl9UT19VVEYxNihFKSBcCitzdGF0aWMgdm9pZCAgUFRSQ0FMTCBcCitFICMjIHRvVXRmMTYoY29uc3QgRU5DT0RJTkcgKmVuYywgXAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipmcm9tUCwgY29uc3QgY2hhciAqZnJvbUxpbSwgXAorICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICoqdG9QLCBjb25zdCB1bnNpZ25lZCBzaG9ydCAqdG9MaW0pIFwKK3sgXAorICAvKiBBdm9pZCBjb3B5aW5nIGZpcnN0IGhhbGYgb25seSBvZiBzdXJyb2dhdGUgKi8gXAorICBpZiAoZnJvbUxpbSAtICpmcm9tUCA+ICgodG9MaW0gLSAqdG9QKSA8PCAxKSBcCisgICAgICAmJiAoR0VUX0hJKGZyb21MaW0gLSAyKSAmIDB4RjgpID09IDB4RDgpIFwKKyAgICBmcm9tTGltIC09IDI7IFwKKyAgZm9yICg7ICpmcm9tUCAhPSBmcm9tTGltICYmICp0b1AgIT0gdG9MaW07ICpmcm9tUCArPSAyKSBcCisgICAgKigqdG9QKSsrID0gKEdFVF9ISSgqZnJvbVApIDw8IDgpIHwgR0VUX0xPKCpmcm9tUCk7IFwKK30KKworI2RlZmluZSBTRVQyKHB0ciwgY2gpIFwKKyAgKCgocHRyKVswXSA9ICgoY2gpICYgMHhmZikpLCAoKHB0cilbMV0gPSAoKGNoKSA+PiA4KSkpCisjZGVmaW5lIEdFVF9MTyhwdHIpICgodW5zaWduZWQgY2hhcikocHRyKVswXSkKKyNkZWZpbmUgR0VUX0hJKHB0cikgKCh1bnNpZ25lZCBjaGFyKShwdHIpWzFdKQorCitERUZJTkVfVVRGMTZfVE9fVVRGOChsaXR0bGUyXykKK0RFRklORV9VVEYxNl9UT19VVEYxNihsaXR0bGUyXykKKworI3VuZGVmIFNFVDIKKyN1bmRlZiBHRVRfTE8KKyN1bmRlZiBHRVRfSEkKKworI2RlZmluZSBTRVQyKHB0ciwgY2gpIFwKKyAgKCgocHRyKVswXSA9ICgoY2gpID4+IDgpKSwgKChwdHIpWzFdID0gKChjaCkgJiAweEZGKSkpCisjZGVmaW5lIEdFVF9MTyhwdHIpICgodW5zaWduZWQgY2hhcikocHRyKVsxXSkKKyNkZWZpbmUgR0VUX0hJKHB0cikgKCh1bnNpZ25lZCBjaGFyKShwdHIpWzBdKQorCitERUZJTkVfVVRGMTZfVE9fVVRGOChiaWcyXykKK0RFRklORV9VVEYxNl9UT19VVEYxNihiaWcyXykKKworI3VuZGVmIFNFVDIKKyN1bmRlZiBHRVRfTE8KKyN1bmRlZiBHRVRfSEkKKworI2RlZmluZSBMSVRUTEUyX0JZVEVfVFlQRShlbmMsIHApIFwKKyAoKHApWzFdID09IDAgXAorICA/ICgoc3RydWN0IG5vcm1hbF9lbmNvZGluZyAqKShlbmMpKS0+dHlwZVsodW5zaWduZWQgY2hhcikqKHApXSBcCisgIDogdW5pY29kZV9ieXRlX3R5cGUoKHApWzFdLCAocClbMF0pKQorI2RlZmluZSBMSVRUTEUyX0JZVEVfVE9fQVNDSUkoZW5jLCBwKSAoKHApWzFdID09IDAgPyAocClbMF0gOiAtMSkKKyNkZWZpbmUgTElUVExFMl9DSEFSX01BVENIRVMoZW5jLCBwLCBjKSAoKHApWzFdID09IDAgJiYgKHApWzBdID09IGMpCisjZGVmaW5lIExJVFRMRTJfSVNfTkFNRV9DSEFSX01JTkJQQyhlbmMsIHApIFwKKyAgVUNTMl9HRVRfTkFNSU5HKG5hbWVQYWdlcywgKHVuc2lnbmVkIGNoYXIpcFsxXSwgKHVuc2lnbmVkIGNoYXIpcFswXSkKKyNkZWZpbmUgTElUVExFMl9JU19OTVNUUlRfQ0hBUl9NSU5CUEMoZW5jLCBwKSBcCisgIFVDUzJfR0VUX05BTUlORyhubXN0cnRQYWdlcywgKHVuc2lnbmVkIGNoYXIpcFsxXSwgKHVuc2lnbmVkIGNoYXIpcFswXSkKKworI2lmZGVmIFhNTF9NSU5fU0laRQorCitzdGF0aWMgaW50IFBUUkZBU1RDQUxMCitsaXR0bGUyX2J5dGVUeXBlKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnApCit7CisgIHJldHVybiBMSVRUTEUyX0JZVEVfVFlQRShlbmMsIHApOworfQorCitzdGF0aWMgaW50IFBUUkZBU1RDQUxMCitsaXR0bGUyX2J5dGVUb0FzY2lpKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnApCit7CisgIHJldHVybiBMSVRUTEUyX0JZVEVfVE9fQVNDSUkoZW5jLCBwKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitsaXR0bGUyX2NoYXJNYXRjaGVzKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnAsIGludCBjKQoreworICByZXR1cm4gTElUVExFMl9DSEFSX01BVENIRVMoZW5jLCBwLCBjKTsKK30KKworc3RhdGljIGludCBQVFJGQVNUQ0FMTAorbGl0dGxlMl9pc05hbWVNaW4oY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCkKK3sKKyAgcmV0dXJuIExJVFRMRTJfSVNfTkFNRV9DSEFSX01JTkJQQyhlbmMsIHApOworfQorCitzdGF0aWMgaW50IFBUUkZBU1RDQUxMCitsaXR0bGUyX2lzTm1zdHJ0TWluKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnApCit7CisgIHJldHVybiBMSVRUTEUyX0lTX05NU1RSVF9DSEFSX01JTkJQQyhlbmMsIHApOworfQorCisjdW5kZWYgVlRBQkxFCisjZGVmaW5lIFZUQUJMRSBWVEFCTEUxLCBsaXR0bGUyX3RvVXRmOCwgbGl0dGxlMl90b1V0ZjE2CisKKyNlbHNlIC8qIG5vdCBYTUxfTUlOX1NJWkUgKi8KKworI3VuZGVmIFBSRUZJWAorI2RlZmluZSBQUkVGSVgoaWRlbnQpIGxpdHRsZTJfICMjIGlkZW50CisjZGVmaW5lIE1JTkJQQyhlbmMpIDIKKy8qIENIQVJfTUFUQ0hFUyBpcyBndWFyYW50ZWVkIHRvIGhhdmUgTUlOQlBDIGJ5dGVzIGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgQllURV9UWVBFKGVuYywgcCkgTElUVExFMl9CWVRFX1RZUEUoZW5jLCBwKQorI2RlZmluZSBCWVRFX1RPX0FTQ0lJKGVuYywgcCkgTElUVExFMl9CWVRFX1RPX0FTQ0lJKGVuYywgcCkKKyNkZWZpbmUgQ0hBUl9NQVRDSEVTKGVuYywgcCwgYykgTElUVExFMl9DSEFSX01BVENIRVMoZW5jLCBwLCBjKQorI2RlZmluZSBJU19OQU1FX0NIQVIoZW5jLCBwLCBuKSAwCisjZGVmaW5lIElTX05BTUVfQ0hBUl9NSU5CUEMoZW5jLCBwKSBMSVRUTEUyX0lTX05BTUVfQ0hBUl9NSU5CUEMoZW5jLCBwKQorI2RlZmluZSBJU19OTVNUUlRfQ0hBUihlbmMsIHAsIG4pICgwKQorI2RlZmluZSBJU19OTVNUUlRfQ0hBUl9NSU5CUEMoZW5jLCBwKSBMSVRUTEUyX0lTX05NU1RSVF9DSEFSX01JTkJQQyhlbmMsIHApCisKKyNkZWZpbmUgWE1MX1RPS19JTVBMX0MKKyNpbmNsdWRlICJ4bWx0b2tfaW1wbC5jIgorI3VuZGVmIFhNTF9UT0tfSU1QTF9DCisKKyN1bmRlZiBNSU5CUEMKKyN1bmRlZiBCWVRFX1RZUEUKKyN1bmRlZiBCWVRFX1RPX0FTQ0lJCisjdW5kZWYgQ0hBUl9NQVRDSEVTCisjdW5kZWYgSVNfTkFNRV9DSEFSCisjdW5kZWYgSVNfTkFNRV9DSEFSX01JTkJQQworI3VuZGVmIElTX05NU1RSVF9DSEFSCisjdW5kZWYgSVNfTk1TVFJUX0NIQVJfTUlOQlBDCisjdW5kZWYgSVNfSU5WQUxJRF9DSEFSCisKKyNlbmRpZiAvKiBub3QgWE1MX01JTl9TSVpFICovCisKKyNpZmRlZiBYTUxfTlMKKworc3RhdGljIGNvbnN0IHN0cnVjdCBub3JtYWxfZW5jb2RpbmcgbGl0dGxlMl9lbmNvZGluZ19ucyA9IHsKKyAgeyBWVEFCTEUsIDIsIDAsCisjaWYgQllURU9SREVSID09IDEyMzQKKyAgICAxCisjZWxzZQorICAgIDAKKyNlbmRpZgorICB9LAorICB7CisjaW5jbHVkZSAiYXNjaWl0YWIuaCIKKyNpbmNsdWRlICJsYXRpbjF0YWIuaCIKKyAgfSwKKyAgU1RBTkRBUkRfVlRBQkxFKGxpdHRsZTJfKQorfTsKKworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgbm9ybWFsX2VuY29kaW5nIGxpdHRsZTJfZW5jb2RpbmcgPSB7CisgIHsgVlRBQkxFLCAyLCAwLAorI2lmIEJZVEVPUkRFUiA9PSAxMjM0CisgICAgMQorI2Vsc2UKKyAgICAwCisjZW5kaWYKKyAgfSwKKyAgeworI2RlZmluZSBCVF9DT0xPTiBCVF9OTVNUUlQKKyNpbmNsdWRlICJhc2NpaXRhYi5oIgorI3VuZGVmIEJUX0NPTE9OCisjaW5jbHVkZSAibGF0aW4xdGFiLmgiCisgIH0sCisgIFNUQU5EQVJEX1ZUQUJMRShsaXR0bGUyXykKK307CisKKyNpZiBCWVRFT1JERVIgIT0gNDMyMQorCisjaWZkZWYgWE1MX05TCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgbm9ybWFsX2VuY29kaW5nIGludGVybmFsX2xpdHRsZTJfZW5jb2RpbmdfbnMgPSB7CisgIHsgVlRBQkxFLCAyLCAwLCAxIH0sCisgIHsKKyNpbmNsdWRlICJpYXNjaWl0YWIuaCIKKyNpbmNsdWRlICJsYXRpbjF0YWIuaCIKKyAgfSwKKyAgU1RBTkRBUkRfVlRBQkxFKGxpdHRsZTJfKQorfTsKKworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgbm9ybWFsX2VuY29kaW5nIGludGVybmFsX2xpdHRsZTJfZW5jb2RpbmcgPSB7CisgIHsgVlRBQkxFLCAyLCAwLCAxIH0sCisgIHsKKyNkZWZpbmUgQlRfQ09MT04gQlRfTk1TVFJUCisjaW5jbHVkZSAiaWFzY2lpdGFiLmgiCisjdW5kZWYgQlRfQ09MT04KKyNpbmNsdWRlICJsYXRpbjF0YWIuaCIKKyAgfSwKKyAgU1RBTkRBUkRfVlRBQkxFKGxpdHRsZTJfKQorfTsKKworI2VuZGlmCisKKworI2RlZmluZSBCSUcyX0JZVEVfVFlQRShlbmMsIHApIFwKKyAoKHApWzBdID09IDAgXAorICA/ICgoc3RydWN0IG5vcm1hbF9lbmNvZGluZyAqKShlbmMpKS0+dHlwZVsodW5zaWduZWQgY2hhcikocClbMV1dIFwKKyAgOiB1bmljb2RlX2J5dGVfdHlwZSgocClbMF0sIChwKVsxXSkpCisjZGVmaW5lIEJJRzJfQllURV9UT19BU0NJSShlbmMsIHApICgocClbMF0gPT0gMCA/IChwKVsxXSA6IC0xKQorI2RlZmluZSBCSUcyX0NIQVJfTUFUQ0hFUyhlbmMsIHAsIGMpICgocClbMF0gPT0gMCAmJiAocClbMV0gPT0gYykKKyNkZWZpbmUgQklHMl9JU19OQU1FX0NIQVJfTUlOQlBDKGVuYywgcCkgXAorICBVQ1MyX0dFVF9OQU1JTkcobmFtZVBhZ2VzLCAodW5zaWduZWQgY2hhcilwWzBdLCAodW5zaWduZWQgY2hhcilwWzFdKQorI2RlZmluZSBCSUcyX0lTX05NU1RSVF9DSEFSX01JTkJQQyhlbmMsIHApIFwKKyAgVUNTMl9HRVRfTkFNSU5HKG5tc3RydFBhZ2VzLCAodW5zaWduZWQgY2hhcilwWzBdLCAodW5zaWduZWQgY2hhcilwWzFdKQorCisjaWZkZWYgWE1MX01JTl9TSVpFCisKK3N0YXRpYyBpbnQgUFRSRkFTVENBTEwKK2JpZzJfYnl0ZVR5cGUoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCkKK3sKKyAgcmV0dXJuIEJJRzJfQllURV9UWVBFKGVuYywgcCk7Cit9CisKK3N0YXRpYyBpbnQgUFRSRkFTVENBTEwKK2JpZzJfYnl0ZVRvQXNjaWkoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCkKK3sKKyAgcmV0dXJuIEJJRzJfQllURV9UT19BU0NJSShlbmMsIHApOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK2JpZzJfY2hhck1hdGNoZXMoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCwgaW50IGMpCit7CisgIHJldHVybiBCSUcyX0NIQVJfTUFUQ0hFUyhlbmMsIHAsIGMpOworfQorCitzdGF0aWMgaW50IFBUUkZBU1RDQUxMCitiaWcyX2lzTmFtZU1pbihjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwKQoreworICByZXR1cm4gQklHMl9JU19OQU1FX0NIQVJfTUlOQlBDKGVuYywgcCk7Cit9CisKK3N0YXRpYyBpbnQgUFRSRkFTVENBTEwKK2JpZzJfaXNObXN0cnRNaW4oY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCkKK3sKKyAgcmV0dXJuIEJJRzJfSVNfTk1TVFJUX0NIQVJfTUlOQlBDKGVuYywgcCk7Cit9CisKKyN1bmRlZiBWVEFCTEUKKyNkZWZpbmUgVlRBQkxFIFZUQUJMRTEsIGJpZzJfdG9VdGY4LCBiaWcyX3RvVXRmMTYKKworI2Vsc2UgLyogbm90IFhNTF9NSU5fU0laRSAqLworCisjdW5kZWYgUFJFRklYCisjZGVmaW5lIFBSRUZJWChpZGVudCkgYmlnMl8gIyMgaWRlbnQKKyNkZWZpbmUgTUlOQlBDKGVuYykgMgorLyogQ0hBUl9NQVRDSEVTIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSBNSU5CUEMgYnl0ZXMgYXZhaWxhYmxlLiAqLworI2RlZmluZSBCWVRFX1RZUEUoZW5jLCBwKSBCSUcyX0JZVEVfVFlQRShlbmMsIHApCisjZGVmaW5lIEJZVEVfVE9fQVNDSUkoZW5jLCBwKSBCSUcyX0JZVEVfVE9fQVNDSUkoZW5jLCBwKQorI2RlZmluZSBDSEFSX01BVENIRVMoZW5jLCBwLCBjKSBCSUcyX0NIQVJfTUFUQ0hFUyhlbmMsIHAsIGMpCisjZGVmaW5lIElTX05BTUVfQ0hBUihlbmMsIHAsIG4pIDAKKyNkZWZpbmUgSVNfTkFNRV9DSEFSX01JTkJQQyhlbmMsIHApIEJJRzJfSVNfTkFNRV9DSEFSX01JTkJQQyhlbmMsIHApCisjZGVmaW5lIElTX05NU1RSVF9DSEFSKGVuYywgcCwgbikgKDApCisjZGVmaW5lIElTX05NU1RSVF9DSEFSX01JTkJQQyhlbmMsIHApIEJJRzJfSVNfTk1TVFJUX0NIQVJfTUlOQlBDKGVuYywgcCkKKworI2RlZmluZSBYTUxfVE9LX0lNUExfQworI2luY2x1ZGUgInhtbHRva19pbXBsLmMiCisjdW5kZWYgWE1MX1RPS19JTVBMX0MKKworI3VuZGVmIE1JTkJQQworI3VuZGVmIEJZVEVfVFlQRQorI3VuZGVmIEJZVEVfVE9fQVNDSUkKKyN1bmRlZiBDSEFSX01BVENIRVMKKyN1bmRlZiBJU19OQU1FX0NIQVIKKyN1bmRlZiBJU19OQU1FX0NIQVJfTUlOQlBDCisjdW5kZWYgSVNfTk1TVFJUX0NIQVIKKyN1bmRlZiBJU19OTVNUUlRfQ0hBUl9NSU5CUEMKKyN1bmRlZiBJU19JTlZBTElEX0NIQVIKKworI2VuZGlmIC8qIG5vdCBYTUxfTUlOX1NJWkUgKi8KKworI2lmZGVmIFhNTF9OUworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyBiaWcyX2VuY29kaW5nX25zID0geworICB7IFZUQUJMRSwgMiwgMCwKKyNpZiBCWVRFT1JERVIgPT0gNDMyMQorICAxCisjZWxzZQorICAwCisjZW5kaWYKKyAgfSwKKyAgeworI2luY2x1ZGUgImFzY2lpdGFiLmgiCisjaW5jbHVkZSAibGF0aW4xdGFiLmgiCisgIH0sCisgIFNUQU5EQVJEX1ZUQUJMRShiaWcyXykKK307CisKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyBiaWcyX2VuY29kaW5nID0geworICB7IFZUQUJMRSwgMiwgMCwKKyNpZiBCWVRFT1JERVIgPT0gNDMyMQorICAxCisjZWxzZQorICAwCisjZW5kaWYKKyAgfSwKKyAgeworI2RlZmluZSBCVF9DT0xPTiBCVF9OTVNUUlQKKyNpbmNsdWRlICJhc2NpaXRhYi5oIgorI3VuZGVmIEJUX0NPTE9OCisjaW5jbHVkZSAibGF0aW4xdGFiLmgiCisgIH0sCisgIFNUQU5EQVJEX1ZUQUJMRShiaWcyXykKK307CisKKyNpZiBCWVRFT1JERVIgIT0gMTIzNAorCisjaWZkZWYgWE1MX05TCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgbm9ybWFsX2VuY29kaW5nIGludGVybmFsX2JpZzJfZW5jb2RpbmdfbnMgPSB7CisgIHsgVlRBQkxFLCAyLCAwLCAxIH0sCisgIHsKKyNpbmNsdWRlICJpYXNjaWl0YWIuaCIKKyNpbmNsdWRlICJsYXRpbjF0YWIuaCIKKyAgfSwKKyAgU1RBTkRBUkRfVlRBQkxFKGJpZzJfKQorfTsKKworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgbm9ybWFsX2VuY29kaW5nIGludGVybmFsX2JpZzJfZW5jb2RpbmcgPSB7CisgIHsgVlRBQkxFLCAyLCAwLCAxIH0sCisgIHsKKyNkZWZpbmUgQlRfQ09MT04gQlRfTk1TVFJUCisjaW5jbHVkZSAiaWFzY2lpdGFiLmgiCisjdW5kZWYgQlRfQ09MT04KKyNpbmNsdWRlICJsYXRpbjF0YWIuaCIKKyAgfSwKKyAgU1RBTkRBUkRfVlRBQkxFKGJpZzJfKQorfTsKKworI2VuZGlmCisKKyN1bmRlZiBQUkVGSVgKKworc3RhdGljIGludCBGQVNUQ0FMTAorc3RyZXFjaShjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCit7CisgIGZvciAoOzspIHsKKyAgICBjaGFyIGMxID0gKnMxKys7CisgICAgY2hhciBjMiA9ICpzMisrOworICAgIGlmIChBU0NJSV9hIDw9IGMxICYmIGMxIDw9IEFTQ0lJX3opCisgICAgICBjMSArPSBBU0NJSV9BIC0gQVNDSUlfYTsKKyAgICBpZiAoQVNDSUlfYSA8PSBjMiAmJiBjMiA8PSBBU0NJSV96KQorICAgICAgYzIgKz0gQVNDSUlfQSAtIEFTQ0lJX2E7CisgICAgaWYgKGMxICE9IGMyKQorICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFjMSkKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBQVFJDQUxMCitpbml0VXBkYXRlUG9zaXRpb24oY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwgUE9TSVRJT04gKnBvcykKK3sKKyAgbm9ybWFsX3VwZGF0ZVBvc2l0aW9uKCZ1dGY4X2VuY29kaW5nLmVuYywgcHRyLCBlbmQsIHBvcyk7Cit9CisKK3N0YXRpYyBpbnQKK3RvQXNjaWkoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQpCit7CisgIGNoYXIgYnVmWzFdOworICBjaGFyICpwID0gYnVmOworICBYbWxVdGY4Q29udmVydChlbmMsICZwdHIsIGVuZCwgJnAsIHAgKyAxKTsKKyAgaWYgKHAgPT0gYnVmKQorICAgIHJldHVybiAtMTsKKyAgZWxzZQorICAgIHJldHVybiBidWZbMF07Cit9CisKK3N0YXRpYyBpbnQgRkFTVENBTEwKK2lzU3BhY2UoaW50IGMpCit7CisgIHN3aXRjaCAoYykgeworICBjYXNlIDB4MjA6CisgIGNhc2UgMHhEOgorICBjYXNlIDB4QToKKyAgY2FzZSAweDk6CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiAxIGlmIHRoZXJlJ3MganVzdCBvcHRpb25hbCB3aGl0ZSBzcGFjZSBvciB0aGVyZSdzIGFuIFMKKyAgIGZvbGxvd2VkIGJ5IG5hbWU9dmFsLgorKi8KK3N0YXRpYyBpbnQKK3BhcnNlUHNldWRvQXR0cmlidXRlKGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbmFtZVB0ciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipuYW1lRW5kUHRyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKnZhbFB0ciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipuZXh0VG9rUHRyKQoreworICBpbnQgYzsKKyAgY2hhciBvcGVuOworICBpZiAocHRyID09IGVuZCkgeworICAgICpuYW1lUHRyID0gTlVMTDsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoIWlzU3BhY2UodG9Bc2NpaShlbmMsIHB0ciwgZW5kKSkpIHsKKyAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICByZXR1cm4gMDsKKyAgfQorICBkbyB7CisgICAgcHRyICs9IGVuYy0+bWluQnl0ZXNQZXJDaGFyOworICB9IHdoaWxlIChpc1NwYWNlKHRvQXNjaWkoZW5jLCBwdHIsIGVuZCkpKTsKKyAgaWYgKHB0ciA9PSBlbmQpIHsKKyAgICAqbmFtZVB0ciA9IE5VTEw7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgKm5hbWVQdHIgPSBwdHI7CisgIGZvciAoOzspIHsKKyAgICBjID0gdG9Bc2NpaShlbmMsIHB0ciwgZW5kKTsKKyAgICBpZiAoYyA9PSAtMSkgeworICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGMgPT0gQVNDSUlfRVFVQUxTKSB7CisgICAgICAqbmFtZUVuZFB0ciA9IHB0cjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoaXNTcGFjZShjKSkgeworICAgICAgKm5hbWVFbmRQdHIgPSBwdHI7CisgICAgICBkbyB7CisgICAgICAgIHB0ciArPSBlbmMtPm1pbkJ5dGVzUGVyQ2hhcjsKKyAgICAgIH0gd2hpbGUgKGlzU3BhY2UoYyA9IHRvQXNjaWkoZW5jLCBwdHIsIGVuZCkpKTsKKyAgICAgIGlmIChjICE9IEFTQ0lJX0VRVUFMUykgeworICAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgcHRyICs9IGVuYy0+bWluQnl0ZXNQZXJDaGFyOworICB9CisgIGlmIChwdHIgPT0gKm5hbWVQdHIpIHsKKyAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICByZXR1cm4gMDsKKyAgfQorICBwdHIgKz0gZW5jLT5taW5CeXRlc1BlckNoYXI7CisgIGMgPSB0b0FzY2lpKGVuYywgcHRyLCBlbmQpOworICB3aGlsZSAoaXNTcGFjZShjKSkgeworICAgIHB0ciArPSBlbmMtPm1pbkJ5dGVzUGVyQ2hhcjsKKyAgICBjID0gdG9Bc2NpaShlbmMsIHB0ciwgZW5kKTsKKyAgfQorICBpZiAoYyAhPSBBU0NJSV9RVU9UICYmIGMgIT0gQVNDSUlfQVBPUykgeworICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgIHJldHVybiAwOworICB9CisgIG9wZW4gPSAoY2hhciljOworICBwdHIgKz0gZW5jLT5taW5CeXRlc1BlckNoYXI7CisgICp2YWxQdHIgPSBwdHI7CisgIGZvciAoOzsgcHRyICs9IGVuYy0+bWluQnl0ZXNQZXJDaGFyKSB7CisgICAgYyA9IHRvQXNjaWkoZW5jLCBwdHIsIGVuZCk7CisgICAgaWYgKGMgPT0gb3BlbikKKyAgICAgIGJyZWFrOworICAgIGlmICghKEFTQ0lJX2EgPD0gYyAmJiBjIDw9IEFTQ0lJX3opCisgICAgICAgICYmICEoQVNDSUlfQSA8PSBjICYmIGMgPD0gQVNDSUlfWikKKyAgICAgICAgJiYgIShBU0NJSV8wIDw9IGMgJiYgYyA8PSBBU0NJSV85KQorICAgICAgICAmJiBjICE9IEFTQ0lJX1BFUklPRAorICAgICAgICAmJiBjICE9IEFTQ0lJX01JTlVTCisgICAgICAgICYmIGMgIT0gQVNDSUlfVU5ERVJTQ09SRSkgeworICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgKm5leHRUb2tQdHIgPSBwdHIgKyBlbmMtPm1pbkJ5dGVzUGVyQ2hhcjsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIEtXX3ZlcnNpb25bXSA9IHsKKyAgQVNDSUlfdiwgQVNDSUlfZSwgQVNDSUlfciwgQVNDSUlfcywgQVNDSUlfaSwgQVNDSUlfbywgQVNDSUlfbiwgJ1wwJworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgS1dfZW5jb2RpbmdbXSA9IHsKKyAgQVNDSUlfZSwgQVNDSUlfbiwgQVNDSUlfYywgQVNDSUlfbywgQVNDSUlfZCwgQVNDSUlfaSwgQVNDSUlfbiwgQVNDSUlfZywgJ1wwJworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgS1dfc3RhbmRhbG9uZVtdID0geworICBBU0NJSV9zLCBBU0NJSV90LCBBU0NJSV9hLCBBU0NJSV9uLCBBU0NJSV9kLCBBU0NJSV9hLCBBU0NJSV9sLCBBU0NJSV9vLAorICBBU0NJSV9uLCBBU0NJSV9lLCAnXDAnCit9OworCitzdGF0aWMgY29uc3QgY2hhciBLV195ZXNbXSA9IHsKKyAgQVNDSUlfeSwgQVNDSUlfZSwgQVNDSUlfcywgICdcMCcKK307CisKK3N0YXRpYyBjb25zdCBjaGFyIEtXX25vW10gPSB7CisgIEFTQ0lJX24sIEFTQ0lJX28sICAnXDAnCit9OworCitzdGF0aWMgaW50Citkb1BhcnNlWG1sRGVjbChjb25zdCBFTkNPRElORyAqKCplbmNvZGluZ0ZpbmRlcikoY29uc3QgRU5DT0RJTkcgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKSwKKyAgICAgICAgICAgICAgIGludCBpc0dlbmVyYWxUZXh0RW50aXR5LAorICAgICAgICAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYywKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipiYWRQdHIsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqdmVyc2lvblB0ciwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKip2ZXJzaW9uRW5kUHRyLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmVuY29kaW5nTmFtZSwKKyAgICAgICAgICAgICAgIGNvbnN0IEVOQ09ESU5HICoqZW5jb2RpbmcsCisgICAgICAgICAgICAgICBpbnQgKnN0YW5kYWxvbmUpCit7CisgIGNvbnN0IGNoYXIgKnZhbCA9IE5VTEw7CisgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworICBjb25zdCBjaGFyICpuYW1lRW5kID0gTlVMTDsKKyAgcHRyICs9IDUgKiBlbmMtPm1pbkJ5dGVzUGVyQ2hhcjsKKyAgZW5kIC09IDIgKiBlbmMtPm1pbkJ5dGVzUGVyQ2hhcjsKKyAgaWYgKCFwYXJzZVBzZXVkb0F0dHJpYnV0ZShlbmMsIHB0ciwgZW5kLCAmbmFtZSwgJm5hbWVFbmQsICZ2YWwsICZwdHIpCisgICAgICB8fCAhbmFtZSkgeworICAgICpiYWRQdHIgPSBwdHI7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCFYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywgbmFtZSwgbmFtZUVuZCwgS1dfdmVyc2lvbikpIHsKKyAgICBpZiAoIWlzR2VuZXJhbFRleHRFbnRpdHkpIHsKKyAgICAgICpiYWRQdHIgPSBuYW1lOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGlmICh2ZXJzaW9uUHRyKQorICAgICAgKnZlcnNpb25QdHIgPSB2YWw7CisgICAgaWYgKHZlcnNpb25FbmRQdHIpCisgICAgICAqdmVyc2lvbkVuZFB0ciA9IHB0cjsKKyAgICBpZiAoIXBhcnNlUHNldWRvQXR0cmlidXRlKGVuYywgcHRyLCBlbmQsICZuYW1lLCAmbmFtZUVuZCwgJnZhbCwgJnB0cikpIHsKKyAgICAgICpiYWRQdHIgPSBwdHI7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCFuYW1lKSB7CisgICAgICBpZiAoaXNHZW5lcmFsVGV4dEVudGl0eSkgeworICAgICAgICAvKiBhIFRleHREZWNsIG11c3QgaGF2ZSBhbiBFbmNvZGluZ0RlY2wgKi8KKyAgICAgICAgKmJhZFB0ciA9IHB0cjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgaWYgKFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLCBuYW1lLCBuYW1lRW5kLCBLV19lbmNvZGluZykpIHsKKyAgICBpbnQgYyA9IHRvQXNjaWkoZW5jLCB2YWwsIGVuZCk7CisgICAgaWYgKCEoQVNDSUlfYSA8PSBjICYmIGMgPD0gQVNDSUlfeikgJiYgIShBU0NJSV9BIDw9IGMgJiYgYyA8PSBBU0NJSV9aKSkgeworICAgICAgKmJhZFB0ciA9IHZhbDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoZW5jb2RpbmdOYW1lKQorICAgICAgKmVuY29kaW5nTmFtZSA9IHZhbDsKKyAgICBpZiAoZW5jb2RpbmcpCisgICAgICAqZW5jb2RpbmcgPSBlbmNvZGluZ0ZpbmRlcihlbmMsIHZhbCwgcHRyIC0gZW5jLT5taW5CeXRlc1BlckNoYXIpOworICAgIGlmICghcGFyc2VQc2V1ZG9BdHRyaWJ1dGUoZW5jLCBwdHIsIGVuZCwgJm5hbWUsICZuYW1lRW5kLCAmdmFsLCAmcHRyKSkgeworICAgICAgKmJhZFB0ciA9IHB0cjsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIW5hbWUpCisgICAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoIVhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLCBuYW1lLCBuYW1lRW5kLCBLV19zdGFuZGFsb25lKQorICAgICAgfHwgaXNHZW5lcmFsVGV4dEVudGl0eSkgeworICAgICpiYWRQdHIgPSBuYW1lOworICAgIHJldHVybiAwOworICB9CisgIGlmIChYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywgdmFsLCBwdHIgLSBlbmMtPm1pbkJ5dGVzUGVyQ2hhciwgS1dfeWVzKSkgeworICAgIGlmIChzdGFuZGFsb25lKQorICAgICAgKnN0YW5kYWxvbmUgPSAxOworICB9CisgIGVsc2UgaWYgKFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLCB2YWwsIHB0ciAtIGVuYy0+bWluQnl0ZXNQZXJDaGFyLCBLV19ubykpIHsKKyAgICBpZiAoc3RhbmRhbG9uZSkKKyAgICAgICpzdGFuZGFsb25lID0gMDsKKyAgfQorICBlbHNlIHsKKyAgICAqYmFkUHRyID0gdmFsOworICAgIHJldHVybiAwOworICB9CisgIHdoaWxlIChpc1NwYWNlKHRvQXNjaWkoZW5jLCBwdHIsIGVuZCkpKQorICAgIHB0ciArPSBlbmMtPm1pbkJ5dGVzUGVyQ2hhcjsKKyAgaWYgKHB0ciAhPSBlbmQpIHsKKyAgICAqYmFkUHRyID0gcHRyOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IEZBU1RDQUxMCitjaGVja0NoYXJSZWZOdW1iZXIoaW50IHJlc3VsdCkKK3sKKyAgc3dpdGNoIChyZXN1bHQgPj4gOCkgeworICBjYXNlIDB4RDg6IGNhc2UgMHhEOTogY2FzZSAweERBOiBjYXNlIDB4REI6CisgIGNhc2UgMHhEQzogY2FzZSAweEREOiBjYXNlIDB4REU6IGNhc2UgMHhERjoKKyAgICByZXR1cm4gLTE7CisgIGNhc2UgMDoKKyAgICBpZiAobGF0aW4xX2VuY29kaW5nLnR5cGVbcmVzdWx0XSA9PSBCVF9OT05YTUwpCisgICAgICByZXR1cm4gLTE7CisgICAgYnJlYWs7CisgIGNhc2UgMHhGRjoKKyAgICBpZiAocmVzdWx0ID09IDB4RkZGRSB8fCByZXN1bHQgPT0gMHhGRkZGKQorICAgICAgcmV0dXJuIC0xOworICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBGQVNUQ0FMTAorWG1sVXRmOEVuY29kZShpbnQgYywgY2hhciAqYnVmKQoreworICBlbnVtIHsKKyAgICAvKiBtaW5OIGlzIG1pbmltdW0gbGVnYWwgcmVzdWx0aW5nIHZhbHVlIGZvciBOIGJ5dGUgc2VxdWVuY2UgKi8KKyAgICBtaW4yID0gMHg4MCwKKyAgICBtaW4zID0gMHg4MDAsCisgICAgbWluNCA9IDB4MTAwMDAKKyAgfTsKKworICBpZiAoYyA8IDApCisgICAgcmV0dXJuIDA7CisgIGlmIChjIDwgbWluMikgeworICAgIGJ1ZlswXSA9IChjaGFyKShjIHwgVVRGOF9jdmFsMSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKGMgPCBtaW4zKSB7CisgICAgYnVmWzBdID0gKGNoYXIpKChjID4+IDYpIHwgVVRGOF9jdmFsMik7CisgICAgYnVmWzFdID0gKGNoYXIpKChjICYgMHgzZikgfCAweDgwKTsKKyAgICByZXR1cm4gMjsKKyAgfQorICBpZiAoYyA8IG1pbjQpIHsKKyAgICBidWZbMF0gPSAoY2hhcikoKGMgPj4gMTIpIHwgVVRGOF9jdmFsMyk7CisgICAgYnVmWzFdID0gKGNoYXIpKCgoYyA+PiA2KSAmIDB4M2YpIHwgMHg4MCk7CisgICAgYnVmWzJdID0gKGNoYXIpKChjICYgMHgzZikgfCAweDgwKTsKKyAgICByZXR1cm4gMzsKKyAgfQorICBpZiAoYyA8IDB4MTEwMDAwKSB7CisgICAgYnVmWzBdID0gKGNoYXIpKChjID4+IDE4KSB8IFVURjhfY3ZhbDQpOworICAgIGJ1ZlsxXSA9IChjaGFyKSgoKGMgPj4gMTIpICYgMHgzZikgfCAweDgwKTsKKyAgICBidWZbMl0gPSAoY2hhcikoKChjID4+IDYpICYgMHgzZikgfCAweDgwKTsKKyAgICBidWZbM10gPSAoY2hhcikoKGMgJiAweDNmKSB8IDB4ODApOworICAgIHJldHVybiA0OworICB9CisgIHJldHVybiAwOworfQorCitpbnQgRkFTVENBTEwKK1htbFV0ZjE2RW5jb2RlKGludCBjaGFyTnVtLCB1bnNpZ25lZCBzaG9ydCAqYnVmKQoreworICBpZiAoY2hhck51bSA8IDApCisgICAgcmV0dXJuIDA7CisgIGlmIChjaGFyTnVtIDwgMHgxMDAwMCkgeworICAgIGJ1ZlswXSA9ICh1bnNpZ25lZCBzaG9ydCljaGFyTnVtOworICAgIHJldHVybiAxOworICB9CisgIGlmIChjaGFyTnVtIDwgMHgxMTAwMDApIHsKKyAgICBjaGFyTnVtIC09IDB4MTAwMDA7CisgICAgYnVmWzBdID0gKHVuc2lnbmVkIHNob3J0KSgoY2hhck51bSA+PiAxMCkgKyAweEQ4MDApOworICAgIGJ1ZlsxXSA9ICh1bnNpZ25lZCBzaG9ydCkoKGNoYXJOdW0gJiAweDNGRikgKyAweERDMDApOworICAgIHJldHVybiAyOworICB9CisgIHJldHVybiAwOworfQorCitzdHJ1Y3QgdW5rbm93bl9lbmNvZGluZyB7CisgIHN0cnVjdCBub3JtYWxfZW5jb2Rpbmcgbm9ybWFsOworICBDT05WRVJURVIgY29udmVydDsKKyAgdm9pZCAqdXNlckRhdGE7CisgIHVuc2lnbmVkIHNob3J0IHV0ZjE2WzI1Nl07CisgIGNoYXIgdXRmOFsyNTZdWzRdOworfTsKKworI2RlZmluZSBBU19VTktOT1dOX0VOQ09ESU5HKGVuYykgICgoY29uc3Qgc3RydWN0IHVua25vd25fZW5jb2RpbmcgKikgKGVuYykpCisKK2ludAorWG1sU2l6ZU9mVW5rbm93bkVuY29kaW5nKHZvaWQpCit7CisgIHJldHVybiBzaXplb2Yoc3RydWN0IHVua25vd25fZW5jb2RpbmcpOworfQorCitzdGF0aWMgaW50IFBUUkZBU1RDQUxMCit1bmtub3duX2lzTmFtZShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwKQoreworICBjb25zdCBzdHJ1Y3QgdW5rbm93bl9lbmNvZGluZyAqdWVuYyA9IEFTX1VOS05PV05fRU5DT0RJTkcoZW5jKTsKKyAgaW50IGMgPSB1ZW5jLT5jb252ZXJ0KHVlbmMtPnVzZXJEYXRhLCBwKTsKKyAgaWYgKGMgJiB+MHhGRkZGKQorICAgIHJldHVybiAwOworICByZXR1cm4gVUNTMl9HRVRfTkFNSU5HKG5hbWVQYWdlcywgYyA+PiA4LCBjICYgMHhGRik7Cit9CisKK3N0YXRpYyBpbnQgUFRSRkFTVENBTEwKK3Vua25vd25faXNObXN0cnQoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCkKK3sKKyAgY29uc3Qgc3RydWN0IHVua25vd25fZW5jb2RpbmcgKnVlbmMgPSBBU19VTktOT1dOX0VOQ09ESU5HKGVuYyk7CisgIGludCBjID0gdWVuYy0+Y29udmVydCh1ZW5jLT51c2VyRGF0YSwgcCk7CisgIGlmIChjICYgfjB4RkZGRikKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIFVDUzJfR0VUX05BTUlORyhubXN0cnRQYWdlcywgYyA+PiA4LCBjICYgMHhGRik7Cit9CisKK3N0YXRpYyBpbnQgUFRSRkFTVENBTEwKK3Vua25vd25faXNJbnZhbGlkKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnApCit7CisgIGNvbnN0IHN0cnVjdCB1bmtub3duX2VuY29kaW5nICp1ZW5jID0gQVNfVU5LTk9XTl9FTkNPRElORyhlbmMpOworICBpbnQgYyA9IHVlbmMtPmNvbnZlcnQodWVuYy0+dXNlckRhdGEsIHApOworICByZXR1cm4gKGMgJiB+MHhGRkZGKSB8fCBjaGVja0NoYXJSZWZOdW1iZXIoYykgPCAwOworfQorCitzdGF0aWMgdm9pZCBQVFJDQUxMCit1bmtub3duX3RvVXRmOChjb25zdCBFTkNPRElORyAqZW5jLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmZyb21QLCBjb25zdCBjaGFyICpmcm9tTGltLAorICAgICAgICAgICAgICAgY2hhciAqKnRvUCwgY29uc3QgY2hhciAqdG9MaW0pCit7CisgIGNvbnN0IHN0cnVjdCB1bmtub3duX2VuY29kaW5nICp1ZW5jID0gQVNfVU5LTk9XTl9FTkNPRElORyhlbmMpOworICBjaGFyIGJ1ZltYTUxfVVRGOF9FTkNPREVfTUFYXTsKKyAgZm9yICg7OykgeworICAgIGNvbnN0IGNoYXIgKnV0Zjg7CisgICAgaW50IG47CisgICAgaWYgKCpmcm9tUCA9PSBmcm9tTGltKQorICAgICAgYnJlYWs7CisgICAgdXRmOCA9IHVlbmMtPnV0ZjhbKHVuc2lnbmVkIGNoYXIpKipmcm9tUF07CisgICAgbiA9ICp1dGY4Kys7CisgICAgaWYgKG4gPT0gMCkgeworICAgICAgaW50IGMgPSB1ZW5jLT5jb252ZXJ0KHVlbmMtPnVzZXJEYXRhLCAqZnJvbVApOworICAgICAgbiA9IFhtbFV0ZjhFbmNvZGUoYywgYnVmKTsKKyAgICAgIGlmIChuID4gdG9MaW0gLSAqdG9QKQorICAgICAgICBicmVhazsKKyAgICAgIHV0ZjggPSBidWY7CisgICAgICAqZnJvbVAgKz0gKEFTX05PUk1BTF9FTkNPRElORyhlbmMpLT50eXBlWyh1bnNpZ25lZCBjaGFyKSoqZnJvbVBdCisgICAgICAgICAgICAgICAgIC0gKEJUX0xFQUQyIC0gMikpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGlmIChuID4gdG9MaW0gLSAqdG9QKQorICAgICAgICBicmVhazsKKyAgICAgICgqZnJvbVApKys7CisgICAgfQorICAgIGRvIHsKKyAgICAgICooKnRvUCkrKyA9ICp1dGY4Kys7CisgICAgfSB3aGlsZSAoLS1uICE9IDApOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFBUUkNBTEwKK3Vua25vd25fdG9VdGYxNihjb25zdCBFTkNPRElORyAqZW5jLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipmcm9tUCwgY29uc3QgY2hhciAqZnJvbUxpbSwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqKnRvUCwgY29uc3QgdW5zaWduZWQgc2hvcnQgKnRvTGltKQoreworICBjb25zdCBzdHJ1Y3QgdW5rbm93bl9lbmNvZGluZyAqdWVuYyA9IEFTX1VOS05PV05fRU5DT0RJTkcoZW5jKTsKKyAgd2hpbGUgKCpmcm9tUCAhPSBmcm9tTGltICYmICp0b1AgIT0gdG9MaW0pIHsKKyAgICB1bnNpZ25lZCBzaG9ydCBjID0gdWVuYy0+dXRmMTZbKHVuc2lnbmVkIGNoYXIpKipmcm9tUF07CisgICAgaWYgKGMgPT0gMCkgeworICAgICAgYyA9ICh1bnNpZ25lZCBzaG9ydCkKKyAgICAgICAgICB1ZW5jLT5jb252ZXJ0KHVlbmMtPnVzZXJEYXRhLCAqZnJvbVApOworICAgICAgKmZyb21QICs9IChBU19OT1JNQUxfRU5DT0RJTkcoZW5jKS0+dHlwZVsodW5zaWduZWQgY2hhcikqKmZyb21QXQorICAgICAgICAgICAgICAgICAtIChCVF9MRUFEMiAtIDIpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgKCpmcm9tUCkrKzsKKyAgICAqKCp0b1ApKysgPSBjOworICB9Cit9CisKK0VOQ09ESU5HICoKK1htbEluaXRVbmtub3duRW5jb2Rpbmcodm9pZCAqbWVtLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICBDT05WRVJURVIgY29udmVydCwgCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhKQoreworICBpbnQgaTsKKyAgc3RydWN0IHVua25vd25fZW5jb2RpbmcgKmUgPSAoc3RydWN0IHVua25vd25fZW5jb2RpbmcgKiltZW07CisgIGZvciAoaSA9IDA7IGkgPCAoaW50KXNpemVvZihzdHJ1Y3Qgbm9ybWFsX2VuY29kaW5nKTsgaSsrKQorICAgICgoY2hhciAqKW1lbSlbaV0gPSAoKGNoYXIgKikmbGF0aW4xX2VuY29kaW5nKVtpXTsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgIGlmIChsYXRpbjFfZW5jb2RpbmcudHlwZVtpXSAhPSBCVF9PVEhFUgorICAgICAgICAmJiBsYXRpbjFfZW5jb2RpbmcudHlwZVtpXSAhPSBCVF9OT05YTUwKKyAgICAgICAgJiYgdGFibGVbaV0gIT0gaSkKKyAgICAgIHJldHVybiAwOworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICBpbnQgYyA9IHRhYmxlW2ldOworICAgIGlmIChjID09IC0xKSB7CisgICAgICBlLT5ub3JtYWwudHlwZVtpXSA9IEJUX01BTEZPUk07CisgICAgICAvKiBUaGlzIHNob3VsZG4ndCByZWFsbHkgZ2V0IHVzZWQuICovCisgICAgICBlLT51dGYxNltpXSA9IDB4RkZGRjsKKyAgICAgIGUtPnV0ZjhbaV1bMF0gPSAxOworICAgICAgZS0+dXRmOFtpXVsxXSA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKGMgPCAwKSB7CisgICAgICBpZiAoYyA8IC00KQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIGUtPm5vcm1hbC50eXBlW2ldID0gKHVuc2lnbmVkIGNoYXIpKEJUX0xFQUQyIC0gKGMgKyAyKSk7CisgICAgICBlLT51dGY4W2ldWzBdID0gMDsKKyAgICAgIGUtPnV0ZjE2W2ldID0gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoYyA8IDB4ODApIHsKKyAgICAgIGlmIChsYXRpbjFfZW5jb2RpbmcudHlwZVtjXSAhPSBCVF9PVEhFUgorICAgICAgICAgICYmIGxhdGluMV9lbmNvZGluZy50eXBlW2NdICE9IEJUX05PTlhNTAorICAgICAgICAgICYmIGMgIT0gaSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBlLT5ub3JtYWwudHlwZVtpXSA9IGxhdGluMV9lbmNvZGluZy50eXBlW2NdOworICAgICAgZS0+dXRmOFtpXVswXSA9IDE7CisgICAgICBlLT51dGY4W2ldWzFdID0gKGNoYXIpYzsKKyAgICAgIGUtPnV0ZjE2W2ldID0gKHVuc2lnbmVkIHNob3J0KShjID09IDAgPyAweEZGRkYgOiBjKTsKKyAgICB9CisgICAgZWxzZSBpZiAoY2hlY2tDaGFyUmVmTnVtYmVyKGMpIDwgMCkgeworICAgICAgZS0+bm9ybWFsLnR5cGVbaV0gPSBCVF9OT05YTUw7CisgICAgICAvKiBUaGlzIHNob3VsZG4ndCByZWFsbHkgZ2V0IHVzZWQuICovCisgICAgICBlLT51dGYxNltpXSA9IDB4RkZGRjsKKyAgICAgIGUtPnV0ZjhbaV1bMF0gPSAxOworICAgICAgZS0+dXRmOFtpXVsxXSA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKGMgPiAweEZGRkYpCisgICAgICAgIHJldHVybiAwOworICAgICAgaWYgKFVDUzJfR0VUX05BTUlORyhubXN0cnRQYWdlcywgYyA+PiA4LCBjICYgMHhmZikpCisgICAgICAgIGUtPm5vcm1hbC50eXBlW2ldID0gQlRfTk1TVFJUOworICAgICAgZWxzZSBpZiAoVUNTMl9HRVRfTkFNSU5HKG5hbWVQYWdlcywgYyA+PiA4LCBjICYgMHhmZikpCisgICAgICAgIGUtPm5vcm1hbC50eXBlW2ldID0gQlRfTkFNRTsKKyAgICAgIGVsc2UKKyAgICAgICAgZS0+bm9ybWFsLnR5cGVbaV0gPSBCVF9PVEhFUjsKKyAgICAgIGUtPnV0ZjhbaV1bMF0gPSAoY2hhcilYbWxVdGY4RW5jb2RlKGMsIGUtPnV0ZjhbaV0gKyAxKTsKKyAgICAgIGUtPnV0ZjE2W2ldID0gKHVuc2lnbmVkIHNob3J0KWM7CisgICAgfQorICB9CisgIGUtPnVzZXJEYXRhID0gdXNlckRhdGE7CisgIGUtPmNvbnZlcnQgPSBjb252ZXJ0OworICBpZiAoY29udmVydCkgeworICAgIGUtPm5vcm1hbC5pc05hbWUyID0gdW5rbm93bl9pc05hbWU7CisgICAgZS0+bm9ybWFsLmlzTmFtZTMgPSB1bmtub3duX2lzTmFtZTsKKyAgICBlLT5ub3JtYWwuaXNOYW1lNCA9IHVua25vd25faXNOYW1lOworICAgIGUtPm5vcm1hbC5pc05tc3RydDIgPSB1bmtub3duX2lzTm1zdHJ0OworICAgIGUtPm5vcm1hbC5pc05tc3RydDMgPSB1bmtub3duX2lzTm1zdHJ0OworICAgIGUtPm5vcm1hbC5pc05tc3RydDQgPSB1bmtub3duX2lzTm1zdHJ0OworICAgIGUtPm5vcm1hbC5pc0ludmFsaWQyID0gdW5rbm93bl9pc0ludmFsaWQ7CisgICAgZS0+bm9ybWFsLmlzSW52YWxpZDMgPSB1bmtub3duX2lzSW52YWxpZDsKKyAgICBlLT5ub3JtYWwuaXNJbnZhbGlkNCA9IHVua25vd25faXNJbnZhbGlkOworICB9CisgIGUtPm5vcm1hbC5lbmMudXRmOENvbnZlcnQgPSB1bmtub3duX3RvVXRmODsKKyAgZS0+bm9ybWFsLmVuYy51dGYxNkNvbnZlcnQgPSB1bmtub3duX3RvVXRmMTY7CisgIHJldHVybiAmKGUtPm5vcm1hbC5lbmMpOworfQorCisvKiBJZiB0aGlzIGVudW1lcmF0aW9uIGlzIGNoYW5nZWQsIGdldEVuY29kaW5nSW5kZXggYW5kIGVuY29kaW5ncworbXVzdCBhbHNvIGJlIGNoYW5nZWQuICovCitlbnVtIHsKKyAgVU5LTk9XTl9FTkMgPSAtMSwKKyAgSVNPXzg4NTlfMV9FTkMgPSAwLAorICBVU19BU0NJSV9FTkMsCisgIFVURl84X0VOQywKKyAgVVRGXzE2X0VOQywKKyAgVVRGXzE2QkVfRU5DLAorICBVVEZfMTZMRV9FTkMsCisgIC8qIG11c3QgbWF0Y2ggZW5jb2RpbmdOYW1lcyB1cCB0byBoZXJlICovCisgIE5PX0VOQworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgS1dfSVNPXzg4NTlfMVtdID0geworICBBU0NJSV9JLCBBU0NJSV9TLCBBU0NJSV9PLCBBU0NJSV9NSU5VUywgQVNDSUlfOCwgQVNDSUlfOCwgQVNDSUlfNSwgQVNDSUlfOSwKKyAgQVNDSUlfTUlOVVMsIEFTQ0lJXzEsICdcMCcKK307CitzdGF0aWMgY29uc3QgY2hhciBLV19VU19BU0NJSVtdID0geworICBBU0NJSV9VLCBBU0NJSV9TLCBBU0NJSV9NSU5VUywgQVNDSUlfQSwgQVNDSUlfUywgQVNDSUlfQywgQVNDSUlfSSwgQVNDSUlfSSwKKyAgJ1wwJworfTsKK3N0YXRpYyBjb25zdCBjaGFyIEtXX1VURl84W10gPSAgeworICBBU0NJSV9VLCBBU0NJSV9ULCBBU0NJSV9GLCBBU0NJSV9NSU5VUywgQVNDSUlfOCwgJ1wwJworfTsKK3N0YXRpYyBjb25zdCBjaGFyIEtXX1VURl8xNltdID0geworICBBU0NJSV9VLCBBU0NJSV9ULCBBU0NJSV9GLCBBU0NJSV9NSU5VUywgQVNDSUlfMSwgQVNDSUlfNiwgJ1wwJworfTsKK3N0YXRpYyBjb25zdCBjaGFyIEtXX1VURl8xNkJFW10gPSB7CisgIEFTQ0lJX1UsIEFTQ0lJX1QsIEFTQ0lJX0YsIEFTQ0lJX01JTlVTLCBBU0NJSV8xLCBBU0NJSV82LCBBU0NJSV9CLCBBU0NJSV9FLAorICAnXDAnCit9Oworc3RhdGljIGNvbnN0IGNoYXIgS1dfVVRGXzE2TEVbXSA9IHsKKyAgQVNDSUlfVSwgQVNDSUlfVCwgQVNDSUlfRiwgQVNDSUlfTUlOVVMsIEFTQ0lJXzEsIEFTQ0lJXzYsIEFTQ0lJX0wsIEFTQ0lJX0UsCisgICdcMCcKK307CisKK3N0YXRpYyBpbnQgRkFTVENBTEwKK2dldEVuY29kaW5nSW5kZXgoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBlbmNvZGluZ05hbWVzW10gPSB7CisgICAgS1dfSVNPXzg4NTlfMSwKKyAgICBLV19VU19BU0NJSSwKKyAgICBLV19VVEZfOCwKKyAgICBLV19VVEZfMTYsCisgICAgS1dfVVRGXzE2QkUsCisgICAgS1dfVVRGXzE2TEUsCisgIH07CisgIGludCBpOworICBpZiAobmFtZSA9PSBOVUxMKQorICAgIHJldHVybiBOT19FTkM7CisgIGZvciAoaSA9IDA7IGkgPCAoaW50KShzaXplb2YoZW5jb2RpbmdOYW1lcykvc2l6ZW9mKGVuY29kaW5nTmFtZXNbMF0pKTsgaSsrKQorICAgIGlmIChzdHJlcWNpKG5hbWUsIGVuY29kaW5nTmFtZXNbaV0pKQorICAgICAgcmV0dXJuIGk7CisgIHJldHVybiBVTktOT1dOX0VOQzsKK30KKworLyogRm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5LCB3ZSBzdG9yZSB0aGUgaW5kZXggb2YgdGhlIGVuY29kaW5nCisgICBzcGVjaWZpZWQgYXQgaW5pdGlhbGl6YXRpb24gaW4gdGhlIGlzVXRmMTYgbWVtYmVyLgorKi8KKworI2RlZmluZSBJTklUX0VOQ19JTkRFWChlbmMpICgoaW50KShlbmMpLT5pbml0RW5jLmlzVXRmMTYpCisjZGVmaW5lIFNFVF9JTklUX0VOQ19JTkRFWChlbmMsIGkpICgoZW5jKS0+aW5pdEVuYy5pc1V0ZjE2ID0gKGNoYXIpaSkKKworLyogVGhpcyBpcyB3aGF0IGRldGVjdHMgdGhlIGVuY29kaW5nLiAgZW5jb2RpbmdUYWJsZSBtYXBzIGZyb20KKyAgIGVuY29kaW5nIGluZGljZXMgdG8gZW5jb2RpbmdzOyBJTklUX0VOQ19JTkRFWChlbmMpIGlzIHRoZSBpbmRleCBvZgorICAgdGhlIGV4dGVybmFsIChwcm90b2NvbCkgc3BlY2lmaWVkIGVuY29kaW5nOyBzdGF0ZSBpcworICAgWE1MX0NPTlRFTlRfU1RBVEUgaWYgd2UncmUgcGFyc2luZyBhbiBleHRlcm5hbCB0ZXh0IGVudGl0eSwgYW5kCisgICBYTUxfUFJPTE9HX1NUQVRFIG90aGVyd2lzZS4KKyovCisKKworc3RhdGljIGludAoraW5pdFNjYW4oY29uc3QgRU5DT0RJTkcgKiBjb25zdCAqZW5jb2RpbmdUYWJsZSwKKyAgICAgICAgIGNvbnN0IElOSVRfRU5DT0RJTkcgKmVuYywKKyAgICAgICAgIGludCBzdGF0ZSwKKyAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgIGNvbnN0IGNoYXIgKipuZXh0VG9rUHRyKQoreworICBjb25zdCBFTkNPRElORyAqKmVuY1B0cjsKKworICBpZiAocHRyID09IGVuZCkKKyAgICByZXR1cm4gWE1MX1RPS19OT05FOworICBlbmNQdHIgPSBlbmMtPmVuY1B0cjsKKyAgaWYgKHB0ciArIDEgPT0gZW5kKSB7CisgICAgLyogb25seSBhIHNpbmdsZSBieXRlIGF2YWlsYWJsZSBmb3IgYXV0by1kZXRlY3Rpb24gKi8KKyNpZm5kZWYgWE1MX0RURCAvKiBGSVhNRSAqLworICAgIC8qIGEgd2VsbC1mb3JtZWQgZG9jdW1lbnQgZW50aXR5IG11c3QgaGF2ZSBtb3JlIHRoYW4gb25lIGJ5dGUgKi8KKyAgICBpZiAoc3RhdGUgIT0gWE1MX0NPTlRFTlRfU1RBVEUpCisgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworI2VuZGlmCisgICAgLyogc28gd2UncmUgcGFyc2luZyBhbiBleHRlcm5hbCB0ZXh0IGVudGl0eS4uLiAqLworICAgIC8qIGlmIFVURi0xNiB3YXMgZXh0ZXJuYWxseSBzcGVjaWZpZWQsIHRoZW4gd2UgbmVlZCBhdCBsZWFzdCAyIGJ5dGVzICovCisgICAgc3dpdGNoIChJTklUX0VOQ19JTkRFWChlbmMpKSB7CisgICAgY2FzZSBVVEZfMTZfRU5DOgorICAgIGNhc2UgVVRGXzE2TEVfRU5DOgorICAgIGNhc2UgVVRGXzE2QkVfRU5DOgorICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgICB9CisgICAgc3dpdGNoICgodW5zaWduZWQgY2hhcikqcHRyKSB7CisgICAgY2FzZSAweEZFOgorICAgIGNhc2UgMHhGRjoKKyAgICBjYXNlIDB4RUY6IC8qIHBvc3NpYmx5IGZpcnN0IGJ5dGUgb2YgVVRGLTggQk9NICovCisgICAgICBpZiAoSU5JVF9FTkNfSU5ERVgoZW5jKSA9PSBJU09fODg1OV8xX0VOQworICAgICAgICAgICYmIHN0YXRlID09IFhNTF9DT05URU5UX1NUQVRFKQorICAgICAgICBicmVhazsKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgMHgwMDoKKyAgICBjYXNlIDB4M0M6CisgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBzd2l0Y2ggKCgodW5zaWduZWQgY2hhcilwdHJbMF0gPDwgOCkgfCAodW5zaWduZWQgY2hhcilwdHJbMV0pIHsKKyAgICBjYXNlIDB4RkVGRjoKKyAgICAgIGlmIChJTklUX0VOQ19JTkRFWChlbmMpID09IElTT184ODU5XzFfRU5DCisgICAgICAgICAgJiYgc3RhdGUgPT0gWE1MX0NPTlRFTlRfU1RBVEUpCisgICAgICAgIGJyZWFrOworICAgICAgKm5leHRUb2tQdHIgPSBwdHIgKyAyOworICAgICAgKmVuY1B0ciA9IGVuY29kaW5nVGFibGVbVVRGXzE2QkVfRU5DXTsKKyAgICAgIHJldHVybiBYTUxfVE9LX0JPTTsKKyAgICAvKiAwMCAzQyBpcyBoYW5kbGVkIGluIHRoZSBkZWZhdWx0IGNhc2UgKi8KKyAgICBjYXNlIDB4M0MwMDoKKyAgICAgIGlmICgoSU5JVF9FTkNfSU5ERVgoZW5jKSA9PSBVVEZfMTZCRV9FTkMKKyAgICAgICAgICAgfHwgSU5JVF9FTkNfSU5ERVgoZW5jKSA9PSBVVEZfMTZfRU5DKQorICAgICAgICAgICYmIHN0YXRlID09IFhNTF9DT05URU5UX1NUQVRFKQorICAgICAgICBicmVhazsKKyAgICAgICplbmNQdHIgPSBlbmNvZGluZ1RhYmxlW1VURl8xNkxFX0VOQ107CisgICAgICByZXR1cm4gWG1sVG9rKCplbmNQdHIsIHN0YXRlLCBwdHIsIGVuZCwgbmV4dFRva1B0cik7CisgICAgY2FzZSAweEZGRkU6CisgICAgICBpZiAoSU5JVF9FTkNfSU5ERVgoZW5jKSA9PSBJU09fODg1OV8xX0VOQworICAgICAgICAgICYmIHN0YXRlID09IFhNTF9DT05URU5UX1NUQVRFKQorICAgICAgICBicmVhazsKKyAgICAgICpuZXh0VG9rUHRyID0gcHRyICsgMjsKKyAgICAgICplbmNQdHIgPSBlbmNvZGluZ1RhYmxlW1VURl8xNkxFX0VOQ107CisgICAgICByZXR1cm4gWE1MX1RPS19CT007CisgICAgY2FzZSAweEVGQkI6CisgICAgICAvKiBNYXliZSBhIFVURi04IEJPTSAoRUYgQkIgQkYpICovCisgICAgICAvKiBJZiB0aGVyZSdzIGFuIGV4cGxpY2l0bHkgc3BlY2lmaWVkIChleHRlcm5hbCkgZW5jb2RpbmcKKyAgICAgICAgIG9mIElTTy04ODU5LTEgb3Igc29tZSBmbGF2b3VyIG9mIFVURi0xNgorICAgICAgICAgYW5kIHRoaXMgaXMgYW4gZXh0ZXJuYWwgdGV4dCBlbnRpdHksCisgICAgICAgICBkb24ndCBsb29rIGZvciB0aGUgQk9NLAorICAgICAgICAgYmVjYXVzZSBpdCBtaWdodCBiZSBhIGxlZ2FsIGRhdGEuCisgICAgICAqLworICAgICAgaWYgKHN0YXRlID09IFhNTF9DT05URU5UX1NUQVRFKSB7CisgICAgICAgIGludCBlID0gSU5JVF9FTkNfSU5ERVgoZW5jKTsKKyAgICAgICAgaWYgKGUgPT0gSVNPXzg4NTlfMV9FTkMgfHwgZSA9PSBVVEZfMTZCRV9FTkMKKyAgICAgICAgICAgIHx8IGUgPT0gVVRGXzE2TEVfRU5DIHx8IGUgPT0gVVRGXzE2X0VOQykKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChwdHIgKyAyID09IGVuZCkKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgICAgIGlmICgodW5zaWduZWQgY2hhcilwdHJbMl0gPT0gMHhCRikgeworICAgICAgICAqbmV4dFRva1B0ciA9IHB0ciArIDM7CisgICAgICAgICplbmNQdHIgPSBlbmNvZGluZ1RhYmxlW1VURl84X0VOQ107CisgICAgICAgIHJldHVybiBYTUxfVE9LX0JPTTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAocHRyWzBdID09ICdcMCcpIHsKKyAgICAgICAgLyogMCBpc24ndCBhIGxlZ2FsIGRhdGEgY2hhcmFjdGVyLiBGdXJ0aGVybW9yZSBhIGRvY3VtZW50CisgICAgICAgICAgIGVudGl0eSBjYW4gb25seSBzdGFydCB3aXRoIEFTQ0lJIGNoYXJhY3RlcnMuICBTbyB0aGUgb25seQorICAgICAgICAgICB3YXkgdGhpcyBjYW4gZmFpbCB0byBiZSBiaWctZW5kaWFuIFVURi0xNiBpZiBpdCBpdCdzIGFuCisgICAgICAgICAgIGV4dGVybmFsIHBhcnNlZCBnZW5lcmFsIGVudGl0eSB0aGF0J3MgbGFiZWxsZWQgYXMKKyAgICAgICAgICAgVVRGLTE2TEUuCisgICAgICAgICovCisgICAgICAgIGlmIChzdGF0ZSA9PSBYTUxfQ09OVEVOVF9TVEFURSAmJiBJTklUX0VOQ19JTkRFWChlbmMpID09IFVURl8xNkxFX0VOQykKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgKmVuY1B0ciA9IGVuY29kaW5nVGFibGVbVVRGXzE2QkVfRU5DXTsKKyAgICAgICAgcmV0dXJuIFhtbFRvaygqZW5jUHRyLCBzdGF0ZSwgcHRyLCBlbmQsIG5leHRUb2tQdHIpOworICAgICAgfQorICAgICAgZWxzZSBpZiAocHRyWzFdID09ICdcMCcpIHsKKyAgICAgICAgLyogV2UgY291bGQgcmVjb3ZlciBoZXJlIGluIHRoZSBjYXNlOgorICAgICAgICAgICAgLSBwYXJzaW5nIGFuIGV4dGVybmFsIGVudGl0eQorICAgICAgICAgICAgLSBzZWNvbmQgYnl0ZSBpcyAwCisgICAgICAgICAgICAtIG5vIGV4dGVybmFsbHkgc3BlY2lmaWVkIGVuY29kaW5nCisgICAgICAgICAgICAtIG5vIGVuY29kaW5nIGRlY2xhcmF0aW9uCisgICAgICAgICAgIGJ5IGFzc3VtaW5nIFVURi0xNkxFLiAgQnV0IHdlIGRvbid0LCBiZWNhdXNlIHRoaXMgd291bGQgbWVhbiB3aGVuCisgICAgICAgICAgIHByZXNlbnRlZCBqdXN0IHdpdGggYSBzaW5nbGUgYnl0ZSwgd2UgY291bGRuJ3QgcmVsaWFibHkgZGV0ZXJtaW5lCisgICAgICAgICAgIHdoZXRoZXIgd2UgbmVlZGVkIGZ1cnRoZXIgYnl0ZXMuCisgICAgICAgICovCisgICAgICAgIGlmIChzdGF0ZSA9PSBYTUxfQ09OVEVOVF9TVEFURSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgKmVuY1B0ciA9IGVuY29kaW5nVGFibGVbVVRGXzE2TEVfRU5DXTsKKyAgICAgICAgcmV0dXJuIFhtbFRvaygqZW5jUHRyLCBzdGF0ZSwgcHRyLCBlbmQsIG5leHRUb2tQdHIpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICB9CisgICplbmNQdHIgPSBlbmNvZGluZ1RhYmxlW0lOSVRfRU5DX0lOREVYKGVuYyldOworICByZXR1cm4gWG1sVG9rKCplbmNQdHIsIHN0YXRlLCBwdHIsIGVuZCwgbmV4dFRva1B0cik7Cit9CisKKworI2RlZmluZSBOUyh4KSB4CisjZGVmaW5lIG5zKHgpIHgKKyNkZWZpbmUgWE1MX1RPS19OU19DCisjaW5jbHVkZSAieG1sdG9rX25zLmMiCisjdW5kZWYgWE1MX1RPS19OU19DCisjdW5kZWYgTlMKKyN1bmRlZiBucworCisjaWZkZWYgWE1MX05TCisKKyNkZWZpbmUgTlMoeCkgeCAjIyBOUworI2RlZmluZSBucyh4KSB4ICMjIF9ucworCisjZGVmaW5lIFhNTF9UT0tfTlNfQworI2luY2x1ZGUgInhtbHRva19ucy5jIgorI3VuZGVmIFhNTF9UT0tfTlNfQworCisjdW5kZWYgTlMKKyN1bmRlZiBucworCitFTkNPRElORyAqCitYbWxJbml0VW5rbm93bkVuY29kaW5nTlModm9pZCAqbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVkVSVEVSIGNvbnZlcnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhKQoreworICBFTkNPRElORyAqZW5jID0gWG1sSW5pdFVua25vd25FbmNvZGluZyhtZW0sIHRhYmxlLCBjb252ZXJ0LCB1c2VyRGF0YSk7CisgIGlmIChlbmMpCisgICAgKChzdHJ1Y3Qgbm9ybWFsX2VuY29kaW5nICopZW5jKS0+dHlwZVtBU0NJSV9DT0xPTl0gPSBCVF9DT0xPTjsKKyAgcmV0dXJuIGVuYzsKK30KKworI2VuZGlmIC8qIFhNTF9OUyAqLwpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvbGliL3htbHRvay5oIGIvZXhwYXQtMi4wLjEvbGliL3htbHRvay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhODY3YWEKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9saWIveG1sdG9rLmgKQEAgLTAsMCArMSwzMTYgQEAKKy8qIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSBUaGFpIE9wZW4gU291cmNlIFNvZnR3YXJlIENlbnRlciBMdGQKKyAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBjb3B5aW5nIHBlcm1pc3Npb24uCisqLworCisjaWZuZGVmIFhtbFRva19JTkNMVURFRAorI2RlZmluZSBYbWxUb2tfSU5DTFVERUQgMQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgdG9rZW4gbWF5IGJlIHJldHVybmVkIGJ5IFhtbENvbnRlbnRUb2sgKi8KKyNkZWZpbmUgWE1MX1RPS19UUkFJTElOR19SU1FCIC01IC8qIF0gb3IgXV0gYXQgdGhlIGVuZCBvZiB0aGUgc2NhbjsgbWlnaHQgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IG9mIGlsbGVnYWwgXV0+IHNlcXVlbmNlICovCisvKiBUaGUgZm9sbG93aW5nIHRva2VucyBtYXkgYmUgcmV0dXJuZWQgYnkgYm90aCBYbWxQcm9sb2dUb2sgYW5kCisgICBYbWxDb250ZW50VG9rLgorKi8KKyNkZWZpbmUgWE1MX1RPS19OT05FIC00ICAgICAgICAgIC8qIFRoZSBzdHJpbmcgdG8gYmUgc2Nhbm5lZCBpcyBlbXB0eSAqLworI2RlZmluZSBYTUxfVE9LX1RSQUlMSU5HX0NSIC0zICAgLyogQSBDUiBhdCB0aGUgZW5kIG9mIHRoZSBzY2FuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlnaHQgYmUgcGFydCBvZiBDUkxGIHNlcXVlbmNlICovCisjZGVmaW5lIFhNTF9UT0tfUEFSVElBTF9DSEFSIC0yICAvKiBvbmx5IHBhcnQgb2YgYSBtdWx0aWJ5dGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUgWE1MX1RPS19QQVJUSUFMIC0xICAgICAgIC8qIG9ubHkgcGFydCBvZiBhIHRva2VuICovCisjZGVmaW5lIFhNTF9UT0tfSU5WQUxJRCAwCisKKy8qIFRoZSBmb2xsb3dpbmcgdG9rZW5zIGFyZSByZXR1cm5lZCBieSBYbWxDb250ZW50VG9rOyBzb21lIGFyZSBhbHNvCisgICByZXR1cm5lZCBieSBYbWxBdHRyaWJ1dGVWYWx1ZVRvaywgWG1sRW50aXR5VG9rLCBYbWxDZGF0YVNlY3Rpb25Ub2suCisqLworI2RlZmluZSBYTUxfVE9LX1NUQVJUX1RBR19XSVRIX0FUVFMgMQorI2RlZmluZSBYTUxfVE9LX1NUQVJUX1RBR19OT19BVFRTIDIKKyNkZWZpbmUgWE1MX1RPS19FTVBUWV9FTEVNRU5UX1dJVEhfQVRUUyAzIC8qIGVtcHR5IGVsZW1lbnQgdGFnIDxlLz4gKi8KKyNkZWZpbmUgWE1MX1RPS19FTVBUWV9FTEVNRU5UX05PX0FUVFMgNAorI2RlZmluZSBYTUxfVE9LX0VORF9UQUcgNQorI2RlZmluZSBYTUxfVE9LX0RBVEFfQ0hBUlMgNgorI2RlZmluZSBYTUxfVE9LX0RBVEFfTkVXTElORSA3CisjZGVmaW5lIFhNTF9UT0tfQ0RBVEFfU0VDVF9PUEVOIDgKKyNkZWZpbmUgWE1MX1RPS19FTlRJVFlfUkVGIDkKKyNkZWZpbmUgWE1MX1RPS19DSEFSX1JFRiAxMCAgICAgICAgICAgICAgIC8qIG51bWVyaWMgY2hhcmFjdGVyIHJlZmVyZW5jZSAqLworCisvKiBUaGUgZm9sbG93aW5nIHRva2VucyBtYXkgYmUgcmV0dXJuZWQgYnkgYm90aCBYbWxQcm9sb2dUb2sgYW5kCisgICBYbWxDb250ZW50VG9rLgorKi8KKyNkZWZpbmUgWE1MX1RPS19QSSAxMSAgICAgICAgICAgICAgICAgICAgIC8qIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgWE1MX1RPS19YTUxfREVDTCAxMiAgICAgICAgICAgICAgIC8qIFhNTCBkZWNsIG9yIHRleHQgZGVjbCAqLworI2RlZmluZSBYTUxfVE9LX0NPTU1FTlQgMTMKKyNkZWZpbmUgWE1MX1RPS19CT00gMTQgICAgICAgICAgICAgICAgICAgIC8qIEJ5dGUgb3JkZXIgbWFyayAqLworCisvKiBUaGUgZm9sbG93aW5nIHRva2VucyBhcmUgcmV0dXJuZWQgb25seSBieSBYbWxQcm9sb2dUb2sgKi8KKyNkZWZpbmUgWE1MX1RPS19QUk9MT0dfUyAxNQorI2RlZmluZSBYTUxfVE9LX0RFQ0xfT1BFTiAxNiAgICAgICAgICAgICAgLyogPCFmb28gKi8KKyNkZWZpbmUgWE1MX1RPS19ERUNMX0NMT1NFIDE3ICAgICAgICAgICAgIC8qID4gKi8KKyNkZWZpbmUgWE1MX1RPS19OQU1FIDE4CisjZGVmaW5lIFhNTF9UT0tfTk1UT0tFTiAxOQorI2RlZmluZSBYTUxfVE9LX1BPVU5EX05BTUUgMjAgICAgICAgICAgICAgLyogI25hbWUgKi8KKyNkZWZpbmUgWE1MX1RPS19PUiAyMSAgICAgICAgICAgICAgICAgICAgIC8qIHwgKi8KKyNkZWZpbmUgWE1MX1RPS19QRVJDRU5UIDIyCisjZGVmaW5lIFhNTF9UT0tfT1BFTl9QQVJFTiAyMworI2RlZmluZSBYTUxfVE9LX0NMT1NFX1BBUkVOIDI0CisjZGVmaW5lIFhNTF9UT0tfT1BFTl9CUkFDS0VUIDI1CisjZGVmaW5lIFhNTF9UT0tfQ0xPU0VfQlJBQ0tFVCAyNgorI2RlZmluZSBYTUxfVE9LX0xJVEVSQUwgMjcKKyNkZWZpbmUgWE1MX1RPS19QQVJBTV9FTlRJVFlfUkVGIDI4CisjZGVmaW5lIFhNTF9UT0tfSU5TVEFOQ0VfU1RBUlQgMjkKKworLyogVGhlIGZvbGxvd2luZyBvY2N1ciBvbmx5IGluIGVsZW1lbnQgdHlwZSBkZWNsYXJhdGlvbnMgKi8KKyNkZWZpbmUgWE1MX1RPS19OQU1FX1FVRVNUSU9OIDMwICAgICAgICAgIC8qIG5hbWU/ICovCisjZGVmaW5lIFhNTF9UT0tfTkFNRV9BU1RFUklTSyAzMSAgICAgICAgICAvKiBuYW1lKiAqLworI2RlZmluZSBYTUxfVE9LX05BTUVfUExVUyAzMiAgICAgICAgICAgICAgLyogbmFtZSsgKi8KKyNkZWZpbmUgWE1MX1RPS19DT05EX1NFQ1RfT1BFTiAzMyAgICAgICAgIC8qIDwhWyAqLworI2RlZmluZSBYTUxfVE9LX0NPTkRfU0VDVF9DTE9TRSAzNCAgICAgICAgLyogXV0+ICovCisjZGVmaW5lIFhNTF9UT0tfQ0xPU0VfUEFSRU5fUVVFU1RJT04gMzUgICAvKiApPyAqLworI2RlZmluZSBYTUxfVE9LX0NMT1NFX1BBUkVOX0FTVEVSSVNLIDM2ICAgLyogKSogKi8KKyNkZWZpbmUgWE1MX1RPS19DTE9TRV9QQVJFTl9QTFVTIDM3ICAgICAgIC8qICkrICovCisjZGVmaW5lIFhNTF9UT0tfQ09NTUEgMzgKKworLyogVGhlIGZvbGxvd2luZyB0b2tlbiBpcyByZXR1cm5lZCBvbmx5IGJ5IFhtbEF0dHJpYnV0ZVZhbHVlVG9rICovCisjZGVmaW5lIFhNTF9UT0tfQVRUUklCVVRFX1ZBTFVFX1MgMzkKKworLyogVGhlIGZvbGxvd2luZyB0b2tlbiBpcyByZXR1cm5lZCBvbmx5IGJ5IFhtbENkYXRhU2VjdGlvblRvayAqLworI2RlZmluZSBYTUxfVE9LX0NEQVRBX1NFQ1RfQ0xPU0UgNDAKKworLyogV2l0aCBuYW1lc3BhY2UgcHJvY2Vzc2luZyB0aGlzIGlzIHJldHVybmVkIGJ5IFhtbFByb2xvZ1RvayBmb3IgYQorICAgbmFtZSB3aXRoIGEgY29sb24uCisqLworI2RlZmluZSBYTUxfVE9LX1BSRUZJWEVEX05BTUUgNDEKKworI2lmZGVmIFhNTF9EVEQKKyNkZWZpbmUgWE1MX1RPS19JR05PUkVfU0VDVCA0MgorI2VuZGlmIC8qIFhNTF9EVEQgKi8KKworI2lmZGVmIFhNTF9EVEQKKyNkZWZpbmUgWE1MX05fU1RBVEVTIDQKKyNlbHNlIC8qIG5vdCBYTUxfRFREICovCisjZGVmaW5lIFhNTF9OX1NUQVRFUyAzCisjZW5kaWYgLyogbm90IFhNTF9EVEQgKi8KKworI2RlZmluZSBYTUxfUFJPTE9HX1NUQVRFIDAKKyNkZWZpbmUgWE1MX0NPTlRFTlRfU1RBVEUgMQorI2RlZmluZSBYTUxfQ0RBVEFfU0VDVElPTl9TVEFURSAyCisjaWZkZWYgWE1MX0RURAorI2RlZmluZSBYTUxfSUdOT1JFX1NFQ1RJT05fU1RBVEUgMworI2VuZGlmIC8qIFhNTF9EVEQgKi8KKworI2RlZmluZSBYTUxfTl9MSVRFUkFMX1RZUEVTIDIKKyNkZWZpbmUgWE1MX0FUVFJJQlVURV9WQUxVRV9MSVRFUkFMIDAKKyNkZWZpbmUgWE1MX0VOVElUWV9WQUxVRV9MSVRFUkFMIDEKKworLyogVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBwYXNzZWQgdG8gWG1sVXRmOEVuY29kZSBtdXN0IGJlIGF0IGxlYXN0IHRoaXMuICovCisjZGVmaW5lIFhNTF9VVEY4X0VOQ09ERV9NQVggNAorLyogVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBwYXNzZWQgdG8gWG1sVXRmMTZFbmNvZGUgbXVzdCBiZSBhdCBsZWFzdCB0aGlzLiAqLworI2RlZmluZSBYTUxfVVRGMTZfRU5DT0RFX01BWCAyCisKK3R5cGVkZWYgc3RydWN0IHBvc2l0aW9uIHsKKyAgLyogZmlyc3QgbGluZSBhbmQgZmlyc3QgY29sdW1uIGFyZSAwIG5vdCAxICovCisgIFhNTF9TaXplIGxpbmVOdW1iZXI7CisgIFhNTF9TaXplIGNvbHVtbk51bWJlcjsKK30gUE9TSVRJT047CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgY29uc3QgY2hhciAqdmFsdWVQdHI7CisgIGNvbnN0IGNoYXIgKnZhbHVlRW5kOworICBjaGFyIG5vcm1hbGl6ZWQ7Cit9IEFUVFJJQlVURTsKKworc3RydWN0IGVuY29kaW5nOwordHlwZWRlZiBzdHJ1Y3QgZW5jb2RpbmcgRU5DT0RJTkc7CisKK3R5cGVkZWYgaW50IChQVFJDQUxMICpTQ0FOTkVSKShjb25zdCBFTkNPRElORyAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKik7CisKK3N0cnVjdCBlbmNvZGluZyB7CisgIFNDQU5ORVIgc2Nhbm5lcnNbWE1MX05fU1RBVEVTXTsKKyAgU0NBTk5FUiBsaXRlcmFsU2Nhbm5lcnNbWE1MX05fTElURVJBTF9UWVBFU107CisgIGludCAoUFRSQ0FMTCAqc2FtZU5hbWUpKGNvbnN0IEVOQ09ESU5HICosCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKTsKKyAgaW50IChQVFJDQUxMICpuYW1lTWF0Y2hlc0FzY2lpKShjb25zdCBFTkNPRElORyAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKTsKKyAgaW50IChQVFJGQVNUQ0FMTCAqbmFtZUxlbmd0aCkoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKKyAgY29uc3QgY2hhciAqKFBUUkZBU1RDQUxMICpza2lwUykoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKKyAgaW50IChQVFJDQUxMICpnZXRBdHRzKShjb25zdCBFTkNPRElORyAqZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXR0c01heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBVFRSSUJVVEUgKmF0dHMpOworICBpbnQgKFBUUkZBU1RDQUxMICpjaGFyUmVmTnVtYmVyKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIpOworICBpbnQgKFBUUkNBTEwgKnByZWRlZmluZWRFbnRpdHlOYW1lKShjb25zdCBFTkNPRElORyAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKik7CisgIHZvaWQgKFBUUkNBTEwgKnVwZGF0ZVBvc2l0aW9uKShjb25zdCBFTkNPRElORyAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9TSVRJT04gKik7CisgIGludCAoUFRSQ0FMTCAqaXNQdWJsaWNJZCkoY29uc3QgRU5DT0RJTkcgKmVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipiYWRQdHIpOworICB2b2lkIChQVFJDQUxMICp1dGY4Q29udmVydCkoY29uc3QgRU5DT0RJTkcgKmVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipmcm9tUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZyb21MaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqdG9QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG9MaW0pOworICB2b2lkIChQVFJDQUxMICp1dGYxNkNvbnZlcnQpKGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmZyb21QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZyb21MaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKip0b1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgKnRvTGltKTsKKyAgaW50IG1pbkJ5dGVzUGVyQ2hhcjsKKyAgY2hhciBpc1V0Zjg7CisgIGNoYXIgaXNVdGYxNjsKK307CisKKy8qIFNjYW4gdGhlIHN0cmluZyBzdGFydGluZyBhdCBwdHIgdW50aWwgdGhlIGVuZCBvZiB0aGUgbmV4dCBjb21wbGV0ZQorICAgdG9rZW4sIGJ1dCBkbyBub3Qgc2NhbiBwYXN0IGVwdHIuICBSZXR1cm4gYW4gaW50ZWdlciBnaXZpbmcgdGhlCisgICB0eXBlIG9mIHRva2VuLgorCisgICBSZXR1cm4gWE1MX1RPS19OT05FIHdoZW4gcHRyID09IGVwdHI7IG5leHRUb2tQdHIgd2lsbCBub3QgYmUgc2V0LgorCisgICBSZXR1cm4gWE1MX1RPS19QQVJUSUFMIHdoZW4gdGhlIHN0cmluZyBkb2VzIG5vdCBjb250YWluIGEgY29tcGxldGUKKyAgIHRva2VuOyBuZXh0VG9rUHRyIHdpbGwgbm90IGJlIHNldC4KKworICAgUmV0dXJuIFhNTF9UT0tfSU5WQUxJRCB3aGVuIHRoZSBzdHJpbmcgZG9lcyBub3Qgc3RhcnQgYSB2YWxpZAorICAgdG9rZW47IG5leHRUb2tQdHIgd2lsbCBiZSBzZXQgdG8gcG9pbnQgdG8gdGhlIGNoYXJhY3RlciB3aGljaCBtYWRlCisgICB0aGUgdG9rZW4gaW52YWxpZC4KKworICAgT3RoZXJ3aXNlIHRoZSBzdHJpbmcgc3RhcnRzIHdpdGggYSB2YWxpZCB0b2tlbjsgbmV4dFRva1B0ciB3aWxsIGJlCisgICBzZXQgdG8gcG9pbnQgdG8gdGhlIGNoYXJhY3RlciBmb2xsb3dpbmcgdGhlIGVuZCBvZiB0aGF0IHRva2VuLgorCisgICBFYWNoIGRhdGEgY2hhcmFjdGVyIGNvdW50cyBhcyBhIHNpbmdsZSB0b2tlbiwgYnV0IGFkamFjZW50IGRhdGEKKyAgIGNoYXJhY3RlcnMgbWF5IGJlIHJldHVybmVkIHRvZ2V0aGVyLiAgU2ltaWxhcmx5IGZvciBjaGFyYWN0ZXJzIGluCisgICB0aGUgcHJvbG9nIG91dHNpZGUgbGl0ZXJhbHMsIGNvbW1lbnRzIGFuZCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucy4KKyovCisKKworI2RlZmluZSBYbWxUb2soZW5jLCBzdGF0ZSwgcHRyLCBlbmQsIG5leHRUb2tQdHIpIFwKKyAgKCgoZW5jKS0+c2Nhbm5lcnNbc3RhdGVdKShlbmMsIHB0ciwgZW5kLCBuZXh0VG9rUHRyKSkKKworI2RlZmluZSBYbWxQcm9sb2dUb2soZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikgXAorICAgWG1sVG9rKGVuYywgWE1MX1BST0xPR19TVEFURSwgcHRyLCBlbmQsIG5leHRUb2tQdHIpCisKKyNkZWZpbmUgWG1sQ29udGVudFRvayhlbmMsIHB0ciwgZW5kLCBuZXh0VG9rUHRyKSBcCisgICBYbWxUb2soZW5jLCBYTUxfQ09OVEVOVF9TVEFURSwgcHRyLCBlbmQsIG5leHRUb2tQdHIpCisKKyNkZWZpbmUgWG1sQ2RhdGFTZWN0aW9uVG9rKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpIFwKKyAgIFhtbFRvayhlbmMsIFhNTF9DREFUQV9TRUNUSU9OX1NUQVRFLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKKworI2lmZGVmIFhNTF9EVEQKKworI2RlZmluZSBYbWxJZ25vcmVTZWN0aW9uVG9rKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpIFwKKyAgIFhtbFRvayhlbmMsIFhNTF9JR05PUkVfU0VDVElPTl9TVEFURSwgcHRyLCBlbmQsIG5leHRUb2tQdHIpCisKKyNlbmRpZiAvKiBYTUxfRFREICovCisKKy8qIFRoaXMgaXMgdXNlZCBmb3IgcGVyZm9ybWluZyBhIDJuZC1sZXZlbCB0b2tlbml6YXRpb24gb24gdGhlIGNvbnRlbnQKKyAgIG9mIGEgbGl0ZXJhbCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcmV0dXJuZWQgYnkgWG1sVG9rLgorKi8KKyNkZWZpbmUgWG1sTGl0ZXJhbFRvayhlbmMsIGxpdGVyYWxUeXBlLCBwdHIsIGVuZCwgbmV4dFRva1B0cikgXAorICAoKChlbmMpLT5saXRlcmFsU2Nhbm5lcnNbbGl0ZXJhbFR5cGVdKShlbmMsIHB0ciwgZW5kLCBuZXh0VG9rUHRyKSkKKworI2RlZmluZSBYbWxBdHRyaWJ1dGVWYWx1ZVRvayhlbmMsIHB0ciwgZW5kLCBuZXh0VG9rUHRyKSBcCisgICBYbWxMaXRlcmFsVG9rKGVuYywgWE1MX0FUVFJJQlVURV9WQUxVRV9MSVRFUkFMLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKKworI2RlZmluZSBYbWxFbnRpdHlWYWx1ZVRvayhlbmMsIHB0ciwgZW5kLCBuZXh0VG9rUHRyKSBcCisgICBYbWxMaXRlcmFsVG9rKGVuYywgWE1MX0VOVElUWV9WQUxVRV9MSVRFUkFMLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKKworI2RlZmluZSBYbWxTYW1lTmFtZShlbmMsIHB0cjEsIHB0cjIpICgoKGVuYyktPnNhbWVOYW1lKShlbmMsIHB0cjEsIHB0cjIpKQorCisjZGVmaW5lIFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLCBwdHIxLCBlbmQxLCBwdHIyKSBcCisgICgoKGVuYyktPm5hbWVNYXRjaGVzQXNjaWkpKGVuYywgcHRyMSwgZW5kMSwgcHRyMikpCisKKyNkZWZpbmUgWG1sTmFtZUxlbmd0aChlbmMsIHB0cikgXAorICAoKChlbmMpLT5uYW1lTGVuZ3RoKShlbmMsIHB0cikpCisKKyNkZWZpbmUgWG1sU2tpcFMoZW5jLCBwdHIpIFwKKyAgKCgoZW5jKS0+c2tpcFMpKGVuYywgcHRyKSkKKworI2RlZmluZSBYbWxHZXRBdHRyaWJ1dGVzKGVuYywgcHRyLCBhdHRzTWF4LCBhdHRzKSBcCisgICgoKGVuYyktPmdldEF0dHMpKGVuYywgcHRyLCBhdHRzTWF4LCBhdHRzKSkKKworI2RlZmluZSBYbWxDaGFyUmVmTnVtYmVyKGVuYywgcHRyKSBcCisgICgoKGVuYyktPmNoYXJSZWZOdW1iZXIpKGVuYywgcHRyKSkKKworI2RlZmluZSBYbWxQcmVkZWZpbmVkRW50aXR5TmFtZShlbmMsIHB0ciwgZW5kKSBcCisgICgoKGVuYyktPnByZWRlZmluZWRFbnRpdHlOYW1lKShlbmMsIHB0ciwgZW5kKSkKKworI2RlZmluZSBYbWxVcGRhdGVQb3NpdGlvbihlbmMsIHB0ciwgZW5kLCBwb3MpIFwKKyAgKCgoZW5jKS0+dXBkYXRlUG9zaXRpb24pKGVuYywgcHRyLCBlbmQsIHBvcykpCisKKyNkZWZpbmUgWG1sSXNQdWJsaWNJZChlbmMsIHB0ciwgZW5kLCBiYWRQdHIpIFwKKyAgKCgoZW5jKS0+aXNQdWJsaWNJZCkoZW5jLCBwdHIsIGVuZCwgYmFkUHRyKSkKKworI2RlZmluZSBYbWxVdGY4Q29udmVydChlbmMsIGZyb21QLCBmcm9tTGltLCB0b1AsIHRvTGltKSBcCisgICgoKGVuYyktPnV0ZjhDb252ZXJ0KShlbmMsIGZyb21QLCBmcm9tTGltLCB0b1AsIHRvTGltKSkKKworI2RlZmluZSBYbWxVdGYxNkNvbnZlcnQoZW5jLCBmcm9tUCwgZnJvbUxpbSwgdG9QLCB0b0xpbSkgXAorICAoKChlbmMpLT51dGYxNkNvbnZlcnQpKGVuYywgZnJvbVAsIGZyb21MaW0sIHRvUCwgdG9MaW0pKQorCit0eXBlZGVmIHN0cnVjdCB7CisgIEVOQ09ESU5HIGluaXRFbmM7CisgIGNvbnN0IEVOQ09ESU5HICoqZW5jUHRyOworfSBJTklUX0VOQ09ESU5HOworCitpbnQgWG1sUGFyc2VYbWxEZWNsKGludCBpc0dlbmVyYWxUZXh0RW50aXR5LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmJhZFB0ciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKnZlcnNpb25QdHIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKip2ZXJzaW9uRW5kUHRyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqZW5jb2RpbmdOYW1lUHRyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBFTkNPRElORyAqKm5hbWVkRW5jb2RpbmdQdHIsCisgICAgICAgICAgICAgICAgICAgIGludCAqc3RhbmRhbG9uZVB0cik7CisKK2ludCBYbWxJbml0RW5jb2RpbmcoSU5JVF9FTkNPRElORyAqLCBjb25zdCBFTkNPRElORyAqKiwgY29uc3QgY2hhciAqbmFtZSk7Citjb25zdCBFTkNPRElORyAqWG1sR2V0VXRmOEludGVybmFsRW5jb2Rpbmcodm9pZCk7Citjb25zdCBFTkNPRElORyAqWG1sR2V0VXRmMTZJbnRlcm5hbEVuY29kaW5nKHZvaWQpOworaW50IEZBU1RDQUxMIFhtbFV0ZjhFbmNvZGUoaW50IGNoYXJOdW1iZXIsIGNoYXIgKmJ1Zik7CitpbnQgRkFTVENBTEwgWG1sVXRmMTZFbmNvZGUoaW50IGNoYXJOdW1iZXIsIHVuc2lnbmVkIHNob3J0ICpidWYpOworaW50IFhtbFNpemVPZlVua25vd25FbmNvZGluZyh2b2lkKTsKKworCit0eXBlZGVmIGludCAoWE1MQ0FMTCAqQ09OVkVSVEVSKSAodm9pZCAqdXNlckRhdGEsIGNvbnN0IGNoYXIgKnApOworCitFTkNPRElORyAqCitYbWxJbml0VW5rbm93bkVuY29kaW5nKHZvaWQgKm1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ09OVkVSVEVSIGNvbnZlcnQsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhKTsKKworaW50IFhtbFBhcnNlWG1sRGVjbE5TKGludCBpc0dlbmVyYWxUZXh0RW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqYmFkUHRyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKip2ZXJzaW9uUHRyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKip2ZXJzaW9uRW5kUHRyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiplbmNvZGluZ05hbWVQdHIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRU5DT0RJTkcgKipuYW1lZEVuY29kaW5nUHRyLAorICAgICAgICAgICAgICAgICAgICAgIGludCAqc3RhbmRhbG9uZVB0cik7CisKK2ludCBYbWxJbml0RW5jb2RpbmdOUyhJTklUX0VOQ09ESU5HICosIGNvbnN0IEVOQ09ESU5HICoqLCBjb25zdCBjaGFyICpuYW1lKTsKK2NvbnN0IEVOQ09ESU5HICpYbWxHZXRVdGY4SW50ZXJuYWxFbmNvZGluZ05TKHZvaWQpOworY29uc3QgRU5DT0RJTkcgKlhtbEdldFV0ZjE2SW50ZXJuYWxFbmNvZGluZ05TKHZvaWQpOworRU5DT0RJTkcgKgorWG1sSW5pdFVua25vd25FbmNvZGluZ05TKHZvaWQgKm1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIENPTlZFUlRFUiBjb252ZXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhKTsKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBub3QgWG1sVG9rX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9saWIveG1sdG9rX2ltcGwuYyBiL2V4cGF0LTIuMC4xL2xpYi94bWx0b2tfaW1wbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNjg4MTkKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9saWIveG1sdG9rX2ltcGwuYwpAQCAtMCwwICsxLDE3ODMgQEAKKy8qIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSBUaGFpIE9wZW4gU291cmNlIFNvZnR3YXJlIENlbnRlciBMdGQKKyAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBjb3B5aW5nIHBlcm1pc3Npb24uCisqLworCisvKiBUaGlzIGZpbGUgaXMgaW5jbHVkZWQhICovCisjaWZkZWYgWE1MX1RPS19JTVBMX0MKKworI2lmbmRlZiBJU19JTlZBTElEX0NIQVIKKyNkZWZpbmUgSVNfSU5WQUxJRF9DSEFSKGVuYywgcHRyLCBuKSAoMCkKKyNlbmRpZgorCisjZGVmaW5lIElOVkFMSURfTEVBRF9DQVNFKG4sIHB0ciwgbmV4dFRva1B0cikgXAorICAgIGNhc2UgQlRfTEVBRCAjIyBuOiBcCisgICAgICBpZiAoZW5kIC0gcHRyIDwgbikgXAorICAgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMX0NIQVI7IFwKKyAgICAgIGlmIChJU19JTlZBTElEX0NIQVIoZW5jLCBwdHIsIG4pKSB7IFwKKyAgICAgICAgKihuZXh0VG9rUHRyKSA9IChwdHIpOyBcCisgICAgICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7IFwKKyAgICAgIH0gXAorICAgICAgcHRyICs9IG47IFwKKyAgICAgIGJyZWFrOworCisjZGVmaW5lIElOVkFMSURfQ0FTRVMocHRyLCBuZXh0VG9rUHRyKSBcCisgIElOVkFMSURfTEVBRF9DQVNFKDIsIHB0ciwgbmV4dFRva1B0cikgXAorICBJTlZBTElEX0xFQURfQ0FTRSgzLCBwdHIsIG5leHRUb2tQdHIpIFwKKyAgSU5WQUxJRF9MRUFEX0NBU0UoNCwgcHRyLCBuZXh0VG9rUHRyKSBcCisgIGNhc2UgQlRfTk9OWE1MOiBcCisgIGNhc2UgQlRfTUFMRk9STTogXAorICBjYXNlIEJUX1RSQUlMOiBcCisgICAgKihuZXh0VG9rUHRyKSA9IChwdHIpOyBcCisgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKworI2RlZmluZSBDSEVDS19OQU1FX0NBU0UobiwgZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikgXAorICAgY2FzZSBCVF9MRUFEICMjIG46IFwKKyAgICAgaWYgKGVuZCAtIHB0ciA8IG4pIFwKKyAgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMX0NIQVI7IFwKKyAgICAgaWYgKCFJU19OQU1FX0NIQVIoZW5jLCBwdHIsIG4pKSB7IFwKKyAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsgXAorICAgICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7IFwKKyAgICAgfSBcCisgICAgIHB0ciArPSBuOyBcCisgICAgIGJyZWFrOworCisjZGVmaW5lIENIRUNLX05BTUVfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikgXAorICBjYXNlIEJUX05PTkFTQ0lJOiBcCisgICAgaWYgKCFJU19OQU1FX0NIQVJfTUlOQlBDKGVuYywgcHRyKSkgeyBcCisgICAgICAqbmV4dFRva1B0ciA9IHB0cjsgXAorICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsgXAorICAgIH0gXAorICBjYXNlIEJUX05NU1RSVDogXAorICBjYXNlIEJUX0hFWDogXAorICBjYXNlIEJUX0RJR0lUOiBcCisgIGNhc2UgQlRfTkFNRTogXAorICBjYXNlIEJUX01JTlVTOiBcCisgICAgcHRyICs9IE1JTkJQQyhlbmMpOyBcCisgICAgYnJlYWs7IFwKKyAgQ0hFQ0tfTkFNRV9DQVNFKDIsIGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpIFwKKyAgQ0hFQ0tfTkFNRV9DQVNFKDMsIGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpIFwKKyAgQ0hFQ0tfTkFNRV9DQVNFKDQsIGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCisKKyNkZWZpbmUgQ0hFQ0tfTk1TVFJUX0NBU0UobiwgZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikgXAorICAgY2FzZSBCVF9MRUFEICMjIG46IFwKKyAgICAgaWYgKGVuZCAtIHB0ciA8IG4pIFwKKyAgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMX0NIQVI7IFwKKyAgICAgaWYgKCFJU19OTVNUUlRfQ0hBUihlbmMsIHB0ciwgbikpIHsgXAorICAgICAgICpuZXh0VG9rUHRyID0gcHRyOyBcCisgICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsgXAorICAgICB9IFwKKyAgICAgcHRyICs9IG47IFwKKyAgICAgYnJlYWs7CisKKyNkZWZpbmUgQ0hFQ0tfTk1TVFJUX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpIFwKKyAgY2FzZSBCVF9OT05BU0NJSTogXAorICAgIGlmICghSVNfTk1TVFJUX0NIQVJfTUlOQlBDKGVuYywgcHRyKSkgeyBcCisgICAgICAqbmV4dFRva1B0ciA9IHB0cjsgXAorICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsgXAorICAgIH0gXAorICBjYXNlIEJUX05NU1RSVDogXAorICBjYXNlIEJUX0hFWDogXAorICAgIHB0ciArPSBNSU5CUEMoZW5jKTsgXAorICAgIGJyZWFrOyBcCisgIENIRUNLX05NU1RSVF9DQVNFKDIsIGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpIFwKKyAgQ0hFQ0tfTk1TVFJUX0NBU0UoMywgZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikgXAorICBDSEVDS19OTVNUUlRfQ0FTRSg0LCBlbmMsIHB0ciwgZW5kLCBuZXh0VG9rUHRyKQorCisjaWZuZGVmIFBSRUZJWAorI2RlZmluZSBQUkVGSVgoaWRlbnQpIGlkZW50CisjZW5kaWYKKworLyogcHRyIHBvaW50cyB0byBjaGFyYWN0ZXIgZm9sbG93aW5nICI8IS0iICovCisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorUFJFRklYKHNjYW5Db21tZW50KShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwgY29uc3QgY2hhciAqKm5leHRUb2tQdHIpCit7CisgIGlmIChwdHIgIT0gZW5kKSB7CisgICAgaWYgKCFDSEFSX01BVENIRVMoZW5jLCBwdHIsIEFTQ0lJX01JTlVTKSkgeworICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgIH0KKyAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKKyAgICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICAgICAgSU5WQUxJRF9DQVNFUyhwdHIsIG5leHRUb2tQdHIpCisgICAgICBjYXNlIEJUX01JTlVTOgorICAgICAgICBpZiAoKHB0ciArPSBNSU5CUEMoZW5jKSkgPT0gZW5kKQorICAgICAgICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7CisgICAgICAgIGlmIChDSEFSX01BVENIRVMoZW5jLCBwdHIsIEFTQ0lJX01JTlVTKSkgeworICAgICAgICAgIGlmICgocHRyICs9IE1JTkJQQyhlbmMpKSA9PSBlbmQpCisgICAgICAgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworICAgICAgICAgIGlmICghQ0hBUl9NQVRDSEVTKGVuYywgcHRyLCBBU0NJSV9HVCkpIHsKKyAgICAgICAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICAgICAgICB9CisgICAgICAgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKKyAgICAgICAgICByZXR1cm4gWE1MX1RPS19DT01NRU5UOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKK30KKworLyogcHRyIHBvaW50cyB0byBjaGFyYWN0ZXIgZm9sbG93aW5nICI8ISIgKi8KKworc3RhdGljIGludCBQVFJDQUxMCitQUkVGSVgoc2NhbkRlY2wpKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLCBjb25zdCBjaGFyICoqbmV4dFRva1B0cikKK3sKKyAgaWYgKHB0ciA9PSBlbmQpCisgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisgIGNhc2UgQlRfTUlOVVM6CisgICAgcmV0dXJuIFBSRUZJWChzY2FuQ29tbWVudCkoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSwgZW5kLCBuZXh0VG9rUHRyKTsKKyAgY2FzZSBCVF9MU1FCOgorICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7CisgICAgcmV0dXJuIFhNTF9UT0tfQ09ORF9TRUNUX09QRU47CisgIGNhc2UgQlRfTk1TVFJUOgorICBjYXNlIEJUX0hFWDoKKyAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgfQorICB3aGlsZSAocHRyICE9IGVuZCkgeworICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICAgIGNhc2UgQlRfUEVSQ05UOgorICAgICAgaWYgKHB0ciArIE1JTkJQQyhlbmMpID09IGVuZCkKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgICAgIC8qIGRvbid0IGFsbG93IDwhRU5USVRZJSBmb28gIndoYXRldmVyIj4gKi8KKyAgICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyICsgTUlOQlBDKGVuYykpKSB7CisgICAgICBjYXNlIEJUX1M6IGNhc2UgQlRfQ1I6IGNhc2UgQlRfTEY6IGNhc2UgQlRfUEVSQ05UOgorICAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICAgIH0KKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgQlRfUzogY2FzZSBCVF9DUjogY2FzZSBCVF9MRjoKKyAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgcmV0dXJuIFhNTF9UT0tfREVDTF9PUEVOOworICAgIGNhc2UgQlRfTk1TVFJUOgorICAgIGNhc2UgQlRfSEVYOgorICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitQUkVGSVgoY2hlY2tQaVRhcmdldCkoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwgaW50ICp0b2tQdHIpCit7CisgIGludCB1cHBlciA9IDA7CisgICp0b2tQdHIgPSBYTUxfVE9LX1BJOworICBpZiAoZW5kIC0gcHRyICE9IE1JTkJQQyhlbmMpKjMpCisgICAgcmV0dXJuIDE7CisgIHN3aXRjaCAoQllURV9UT19BU0NJSShlbmMsIHB0cikpIHsKKyAgY2FzZSBBU0NJSV94OgorICAgIGJyZWFrOworICBjYXNlIEFTQ0lJX1g6CisgICAgdXBwZXIgPSAxOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHJldHVybiAxOworICB9CisgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgc3dpdGNoIChCWVRFX1RPX0FTQ0lJKGVuYywgcHRyKSkgeworICBjYXNlIEFTQ0lJX206CisgICAgYnJlYWs7CisgIGNhc2UgQVNDSUlfTToKKyAgICB1cHBlciA9IDE7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcHRyICs9IE1JTkJQQyhlbmMpOworICBzd2l0Y2ggKEJZVEVfVE9fQVNDSUkoZW5jLCBwdHIpKSB7CisgIGNhc2UgQVNDSUlfbDoKKyAgICBicmVhazsKKyAgY2FzZSBBU0NJSV9MOgorICAgIHVwcGVyID0gMTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAodXBwZXIpCisgICAgcmV0dXJuIDA7CisgICp0b2tQdHIgPSBYTUxfVE9LX1hNTF9ERUNMOworICByZXR1cm4gMTsKK30KKworLyogcHRyIHBvaW50cyB0byBjaGFyYWN0ZXIgZm9sbG93aW5nICI8PyIgKi8KKworc3RhdGljIGludCBQVFJDQUxMCitQUkVGSVgoc2NhblBpKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsIGNvbnN0IGNoYXIgKipuZXh0VG9rUHRyKQoreworICBpbnQgdG9rOworICBjb25zdCBjaGFyICp0YXJnZXQgPSBwdHI7CisgIGlmIChwdHIgPT0gZW5kKQorICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7CisgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICBDSEVDS19OTVNUUlRfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKKyAgZGVmYXVsdDoKKyAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICB9CisgIHdoaWxlIChwdHIgIT0gZW5kKSB7CisgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisgICAgQ0hFQ0tfTkFNRV9DQVNFUyhlbmMsIHB0ciwgZW5kLCBuZXh0VG9rUHRyKQorICAgIGNhc2UgQlRfUzogY2FzZSBCVF9DUjogY2FzZSBCVF9MRjoKKyAgICAgIGlmICghUFJFRklYKGNoZWNrUGlUYXJnZXQpKGVuYywgdGFyZ2V0LCBwdHIsICZ0b2spKSB7CisgICAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgICAgfQorICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKKyAgICAgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisgICAgICAgIElOVkFMSURfQ0FTRVMocHRyLCBuZXh0VG9rUHRyKQorICAgICAgICBjYXNlIEJUX1FVRVNUOgorICAgICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgICAgICBpZiAocHRyID09IGVuZCkKKyAgICAgICAgICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7CisgICAgICAgICAgaWYgKENIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgQVNDSUlfR1QpKSB7CisgICAgICAgICAgICAqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOworICAgICAgICAgICAgcmV0dXJuIHRvazsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworICAgIGNhc2UgQlRfUVVFU1Q6CisgICAgICBpZiAoIVBSRUZJWChjaGVja1BpVGFyZ2V0KShlbmMsIHRhcmdldCwgcHRyLCAmdG9rKSkgeworICAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICAgIH0KKyAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgIGlmIChwdHIgPT0gZW5kKQorICAgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworICAgICAgaWYgKENIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgQVNDSUlfR1QpKSB7CisgICAgICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7CisgICAgICAgIHJldHVybiB0b2s7CisgICAgICB9CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBkZWZhdWx0OgorICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgIH0KKyAgfQorICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK1BSRUZJWChzY2FuQ2RhdGFTZWN0aW9uKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLCBjb25zdCBjaGFyICoqbmV4dFRva1B0cikKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgQ0RBVEFfTFNRQltdID0geyBBU0NJSV9DLCBBU0NJSV9ELCBBU0NJSV9BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTQ0lJX1QsIEFTQ0lJX0EsIEFTQ0lJX0xTUUIgfTsKKyAgaW50IGk7CisgIC8qIENEQVRBWyAqLworICBpZiAoZW5kIC0gcHRyIDwgNiAqIE1JTkJQQyhlbmMpKQorICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7CisgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyssIHB0ciArPSBNSU5CUEMoZW5jKSkgeworICAgIGlmICghQ0hBUl9NQVRDSEVTKGVuYywgcHRyLCBDREFUQV9MU1FCW2ldKSkgeworICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgIH0KKyAgfQorICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgcmV0dXJuIFhNTF9UT0tfQ0RBVEFfU0VDVF9PUEVOOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK1BSRUZJWChjZGF0YVNlY3Rpb25Ub2spKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwgY29uc3QgY2hhciAqKm5leHRUb2tQdHIpCit7CisgIGlmIChwdHIgPT0gZW5kKQorICAgIHJldHVybiBYTUxfVE9LX05PTkU7CisgIGlmIChNSU5CUEMoZW5jKSA+IDEpIHsKKyAgICBzaXplX3QgbiA9IGVuZCAtIHB0cjsKKyAgICBpZiAobiAmIChNSU5CUEMoZW5jKSAtIDEpKSB7CisgICAgICBuICY9IH4oTUlOQlBDKGVuYykgLSAxKTsKKyAgICAgIGlmIChuID09IDApCisgICAgICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7CisgICAgICBlbmQgPSBwdHIgKyBuOworICAgIH0KKyAgfQorICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgY2FzZSBCVF9SU1FCOgorICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICBpZiAocHRyID09IGVuZCkKKyAgICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7CisgICAgaWYgKCFDSEFSX01BVENIRVMoZW5jLCBwdHIsIEFTQ0lJX1JTUUIpKQorICAgICAgYnJlYWs7CisgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgIGlmIChwdHIgPT0gZW5kKQorICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgICBpZiAoIUNIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgQVNDSUlfR1QpKSB7CisgICAgICBwdHIgLT0gTUlOQlBDKGVuYyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKKyAgICByZXR1cm4gWE1MX1RPS19DREFUQV9TRUNUX0NMT1NFOworICBjYXNlIEJUX0NSOgorICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICBpZiAocHRyID09IGVuZCkKKyAgICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7CisgICAgaWYgKEJZVEVfVFlQRShlbmMsIHB0cikgPT0gQlRfTEYpCisgICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgcmV0dXJuIFhNTF9UT0tfREFUQV9ORVdMSU5FOworICBjYXNlIEJUX0xGOgorICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7CisgICAgcmV0dXJuIFhNTF9UT0tfREFUQV9ORVdMSU5FOworICBJTlZBTElEX0NBU0VTKHB0ciwgbmV4dFRva1B0cikKKyAgZGVmYXVsdDoKKyAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgYnJlYWs7CisgIH0KKyAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKKyAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyNkZWZpbmUgTEVBRF9DQVNFKG4pIFwKKyAgICBjYXNlIEJUX0xFQUQgIyMgbjogXAorICAgICAgaWYgKGVuZCAtIHB0ciA8IG4gfHwgSVNfSU5WQUxJRF9DSEFSKGVuYywgcHRyLCBuKSkgeyBcCisgICAgICAgICpuZXh0VG9rUHRyID0gcHRyOyBcCisgICAgICAgIHJldHVybiBYTUxfVE9LX0RBVEFfQ0hBUlM7IFwKKyAgICAgIH0gXAorICAgICAgcHRyICs9IG47IFwKKyAgICAgIGJyZWFrOworICAgIExFQURfQ0FTRSgyKSBMRUFEX0NBU0UoMykgTEVBRF9DQVNFKDQpCisjdW5kZWYgTEVBRF9DQVNFCisgICAgY2FzZSBCVF9OT05YTUw6CisgICAgY2FzZSBCVF9NQUxGT1JNOgorICAgIGNhc2UgQlRfVFJBSUw6CisgICAgY2FzZSBCVF9DUjoKKyAgICBjYXNlIEJUX0xGOgorICAgIGNhc2UgQlRfUlNRQjoKKyAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgcmV0dXJuIFhNTF9UT0tfREFUQV9DSEFSUzsKKyAgICBkZWZhdWx0OgorICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgICpuZXh0VG9rUHRyID0gcHRyOworICByZXR1cm4gWE1MX1RPS19EQVRBX0NIQVJTOworfQorCisvKiBwdHIgcG9pbnRzIHRvIGNoYXJhY3RlciBmb2xsb3dpbmcgIjwvIiAqLworCitzdGF0aWMgaW50IFBUUkNBTEwKK1BSRUZJWChzY2FuRW5kVGFnKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLCBjb25zdCBjaGFyICoqbmV4dFRva1B0cikKK3sKKyAgaWYgKHB0ciA9PSBlbmQpCisgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisgIENIRUNLX05NU1RSVF9DQVNFUyhlbmMsIHB0ciwgZW5kLCBuZXh0VG9rUHRyKQorICBkZWZhdWx0OgorICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7CisgIH0KKyAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKKyAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgICBDSEVDS19OQU1FX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCisgICAgY2FzZSBCVF9TOiBjYXNlIEJUX0NSOiBjYXNlIEJUX0xGOgorICAgICAgZm9yIChwdHIgKz0gTUlOQlBDKGVuYyk7IHB0ciAhPSBlbmQ7IHB0ciArPSBNSU5CUEMoZW5jKSkgeworICAgICAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgICAgICAgY2FzZSBCVF9TOiBjYXNlIEJUX0NSOiBjYXNlIEJUX0xGOgorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJUX0dUOgorICAgICAgICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7CisgICAgICAgICAgcmV0dXJuIFhNTF9UT0tfRU5EX1RBRzsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworI2lmZGVmIFhNTF9OUworICAgIGNhc2UgQlRfQ09MT046CisgICAgICAvKiBubyBuZWVkIHRvIGNoZWNrIHFuYW1lIHN5bnRheCBoZXJlLAorICAgICAgICAgc2luY2UgZW5kLXRhZyBtdXN0IG1hdGNoIGV4YWN0bHkgKi8KKyAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBCVF9HVDoKKyAgICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7CisgICAgICByZXR1cm4gWE1MX1RPS19FTkRfVEFHOworICAgIGRlZmF1bHQ6CisgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7CisgICAgfQorICB9CisgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7Cit9CisKKy8qIHB0ciBwb2ludHMgdG8gY2hhcmFjdGVyIGZvbGxvd2luZyAiJiNYIiAqLworCitzdGF0aWMgaW50IFBUUkNBTEwKK1BSRUZJWChzY2FuSGV4Q2hhclJlZikoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsIGNvbnN0IGNoYXIgKipuZXh0VG9rUHRyKQoreworICBpZiAocHRyICE9IGVuZCkgeworICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICAgIGNhc2UgQlRfRElHSVQ6CisgICAgY2FzZSBCVF9IRVg6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgIH0KKyAgICBmb3IgKHB0ciArPSBNSU5CUEMoZW5jKTsgcHRyICE9IGVuZDsgcHRyICs9IE1JTkJQQyhlbmMpKSB7CisgICAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgICAgIGNhc2UgQlRfRElHSVQ6CisgICAgICBjYXNlIEJUX0hFWDoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEJUX1NFTUk6CisgICAgICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7CisgICAgICAgIHJldHVybiBYTUxfVE9LX0NIQVJfUkVGOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7Cit9CisKKy8qIHB0ciBwb2ludHMgdG8gY2hhcmFjdGVyIGZvbGxvd2luZyAiJiMiICovCisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorUFJFRklYKHNjYW5DaGFyUmVmKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwgY29uc3QgY2hhciAqKm5leHRUb2tQdHIpCit7CisgIGlmIChwdHIgIT0gZW5kKSB7CisgICAgaWYgKENIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgQVNDSUlfeCkpCisgICAgICByZXR1cm4gUFJFRklYKHNjYW5IZXhDaGFyUmVmKShlbmMsIHB0ciArIE1JTkJQQyhlbmMpLCBlbmQsIG5leHRUb2tQdHIpOworICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICAgIGNhc2UgQlRfRElHSVQ6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgIH0KKyAgICBmb3IgKHB0ciArPSBNSU5CUEMoZW5jKTsgcHRyICE9IGVuZDsgcHRyICs9IE1JTkJQQyhlbmMpKSB7CisgICAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgICAgIGNhc2UgQlRfRElHSVQ6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCVF9TRU1JOgorICAgICAgICAqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOworICAgICAgICByZXR1cm4gWE1MX1RPS19DSEFSX1JFRjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworfQorCisvKiBwdHIgcG9pbnRzIHRvIGNoYXJhY3RlciBmb2xsb3dpbmcgIiYiICovCisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorUFJFRklYKHNjYW5SZWYpKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipuZXh0VG9rUHRyKQoreworICBpZiAocHRyID09IGVuZCkKKyAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgQ0hFQ0tfTk1TVFJUX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCisgIGNhc2UgQlRfTlVNOgorICAgIHJldHVybiBQUkVGSVgoc2NhbkNoYXJSZWYpKGVuYywgcHRyICsgTUlOQlBDKGVuYyksIGVuZCwgbmV4dFRva1B0cik7CisgIGRlZmF1bHQ6CisgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgfQorICB3aGlsZSAocHRyICE9IGVuZCkgeworICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICAgIENIRUNLX05BTUVfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKKyAgICBjYXNlIEJUX1NFTUk6CisgICAgICAqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOworICAgICAgcmV0dXJuIFhNTF9UT0tfRU5USVRZX1JFRjsKKyAgICBkZWZhdWx0OgorICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgIH0KKyAgfQorICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworfQorCisvKiBwdHIgcG9pbnRzIHRvIGNoYXJhY3RlciBmb2xsb3dpbmcgZmlyc3QgY2hhcmFjdGVyIG9mIGF0dHJpYnV0ZSBuYW1lICovCisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorUFJFRklYKHNjYW5BdHRzKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKm5leHRUb2tQdHIpCit7CisjaWZkZWYgWE1MX05TCisgIGludCBoYWRDb2xvbiA9IDA7CisjZW5kaWYKKyAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKKyAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgICBDSEVDS19OQU1FX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCisjaWZkZWYgWE1MX05TCisgICAgY2FzZSBCVF9DT0xPTjoKKyAgICAgIGlmIChoYWRDb2xvbikgeworICAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICAgIH0KKyAgICAgIGhhZENvbG9uID0gMTsKKyAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgIGlmIChwdHIgPT0gZW5kKQorICAgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworICAgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisgICAgICBDSEVDS19OTVNUUlRfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgICAgfQorICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIEJUX1M6IGNhc2UgQlRfQ1I6IGNhc2UgQlRfTEY6CisgICAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCB0OworCisgICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgICAgaWYgKHB0ciA9PSBlbmQpCisgICAgICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgICAgICAgdCA9IEJZVEVfVFlQRShlbmMsIHB0cik7CisgICAgICAgIGlmICh0ID09IEJUX0VRVUFMUykKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgc3dpdGNoICh0KSB7CisgICAgICAgIGNhc2UgQlRfUzoKKyAgICAgICAgY2FzZSBCVF9MRjoKKyAgICAgICAgY2FzZSBCVF9DUjoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgICAgICB9CisgICAgICB9CisgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgY2FzZSBCVF9FUVVBTFM6CisgICAgICB7CisgICAgICAgIGludCBvcGVuOworI2lmZGVmIFhNTF9OUworICAgICAgICBoYWRDb2xvbiA9IDA7CisjZW5kaWYKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgICAgICBpZiAocHRyID09IGVuZCkKKyAgICAgICAgICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7CisgICAgICAgICAgb3BlbiA9IEJZVEVfVFlQRShlbmMsIHB0cik7CisgICAgICAgICAgaWYgKG9wZW4gPT0gQlRfUVVPVCB8fCBvcGVuID09IEJUX0FQT1MpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBzd2l0Y2ggKG9wZW4pIHsKKyAgICAgICAgICBjYXNlIEJUX1M6CisgICAgICAgICAgY2FzZSBCVF9MRjoKKyAgICAgICAgICBjYXNlIEJUX0NSOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgICAvKiBpbiBhdHRyaWJ1dGUgdmFsdWUgKi8KKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgIGludCB0OworICAgICAgICAgIGlmIChwdHIgPT0gZW5kKQorICAgICAgICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgICAgICAgICB0ID0gQllURV9UWVBFKGVuYywgcHRyKTsKKyAgICAgICAgICBpZiAodCA9PSBvcGVuKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgc3dpdGNoICh0KSB7CisgICAgICAgICAgSU5WQUxJRF9DQVNFUyhwdHIsIG5leHRUb2tQdHIpCisgICAgICAgICAgY2FzZSBCVF9BTVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGludCB0b2sgPSBQUkVGSVgoc2NhblJlZikoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSwgZW5kLCAmcHRyKTsKKyAgICAgICAgICAgICAgaWYgKHRvayA8PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHRvayA9PSBYTUxfVE9LX0lOVkFMSUQpCisgICAgICAgICAgICAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgQlRfTFQ6CisgICAgICAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgICAgICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgICAgIGlmIChwdHIgPT0gZW5kKQorICAgICAgICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7CisgICAgICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICAgICAgICBjYXNlIEJUX1M6CisgICAgICAgIGNhc2UgQlRfQ1I6CisgICAgICAgIGNhc2UgQlRfTEY6CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQlRfU09MOgorICAgICAgICAgIGdvdG8gc29sOworICAgICAgICBjYXNlIEJUX0dUOgorICAgICAgICAgIGdvdG8gZ3Q7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICAgICAgfQorICAgICAgICAvKiBwdHIgcG9pbnRzIHRvIGNsb3NpbmcgcXVvdGUgKi8KKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgICAgICBpZiAocHRyID09IGVuZCkKKyAgICAgICAgICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7CisgICAgICAgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisgICAgICAgICAgQ0hFQ0tfTk1TVFJUX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCisgICAgICAgICAgY2FzZSBCVF9TOiBjYXNlIEJUX0NSOiBjYXNlIEJUX0xGOgorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgY2FzZSBCVF9HVDoKKyAgICAgICAgICBndDoKKyAgICAgICAgICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7CisgICAgICAgICAgICByZXR1cm4gWE1MX1RPS19TVEFSVF9UQUdfV0lUSF9BVFRTOworICAgICAgICAgIGNhc2UgQlRfU09MOgorICAgICAgICAgIHNvbDoKKyAgICAgICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgICAgICAgIGlmIChwdHIgPT0gZW5kKQorICAgICAgICAgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworICAgICAgICAgICAgaWYgKCFDSEFSX01BVENIRVMoZW5jLCBwdHIsIEFTQ0lJX0dUKSkgeworICAgICAgICAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgICAgICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7CisgICAgICAgICAgICByZXR1cm4gWE1MX1RPS19FTVBUWV9FTEVNRU5UX1dJVEhfQVRUUzsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICAgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgIH0KKyAgfQorICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworfQorCisvKiBwdHIgcG9pbnRzIHRvIGNoYXJhY3RlciBmb2xsb3dpbmcgIjwiICovCisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorUFJFRklYKHNjYW5MdCkoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbmV4dFRva1B0cikKK3sKKyNpZmRlZiBYTUxfTlMKKyAgaW50IGhhZENvbG9uOworI2VuZGlmCisgIGlmIChwdHIgPT0gZW5kKQorICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7CisgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICBDSEVDS19OTVNUUlRfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKKyAgY2FzZSBCVF9FWENMOgorICAgIGlmICgocHRyICs9IE1JTkJQQyhlbmMpKSA9PSBlbmQpCisgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICAgIGNhc2UgQlRfTUlOVVM6CisgICAgICByZXR1cm4gUFJFRklYKHNjYW5Db21tZW50KShlbmMsIHB0ciArIE1JTkJQQyhlbmMpLCBlbmQsIG5leHRUb2tQdHIpOworICAgIGNhc2UgQlRfTFNRQjoKKyAgICAgIHJldHVybiBQUkVGSVgoc2NhbkNkYXRhU2VjdGlvbikoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLCBuZXh0VG9rUHRyKTsKKyAgICB9CisgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgY2FzZSBCVF9RVUVTVDoKKyAgICByZXR1cm4gUFJFRklYKHNjYW5QaSkoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSwgZW5kLCBuZXh0VG9rUHRyKTsKKyAgY2FzZSBCVF9TT0w6CisgICAgcmV0dXJuIFBSRUZJWChzY2FuRW5kVGFnKShlbmMsIHB0ciArIE1JTkJQQyhlbmMpLCBlbmQsIG5leHRUb2tQdHIpOworICBkZWZhdWx0OgorICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7CisgIH0KKyNpZmRlZiBYTUxfTlMKKyAgaGFkQ29sb24gPSAwOworI2VuZGlmCisgIC8qIHdlIGhhdmUgYSBzdGFydC10YWcgKi8KKyAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKKyAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgICBDSEVDS19OQU1FX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCisjaWZkZWYgWE1MX05TCisgICAgY2FzZSBCVF9DT0xPTjoKKyAgICAgIGlmIChoYWRDb2xvbikgeworICAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICAgIH0KKyAgICAgIGhhZENvbG9uID0gMTsKKyAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgIGlmIChwdHIgPT0gZW5kKQorICAgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworICAgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisgICAgICBDSEVDS19OTVNUUlRfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgICAgfQorICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIEJUX1M6IGNhc2UgQlRfQ1I6IGNhc2UgQlRfTEY6CisgICAgICB7CisgICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgICAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKKyAgICAgICAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgICAgICAgICBDSEVDS19OTVNUUlRfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKKyAgICAgICAgICBjYXNlIEJUX0dUOgorICAgICAgICAgICAgZ290byBndDsKKyAgICAgICAgICBjYXNlIEJUX1NPTDoKKyAgICAgICAgICAgIGdvdG8gc29sOworICAgICAgICAgIGNhc2UgQlRfUzogY2FzZSBCVF9DUjogY2FzZSBCVF9MRjoKKyAgICAgICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgICAgICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBQUkVGSVgoc2NhbkF0dHMpKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7CisgICAgICB9CisgICAgY2FzZSBCVF9HVDoKKyAgICBndDoKKyAgICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7CisgICAgICByZXR1cm4gWE1MX1RPS19TVEFSVF9UQUdfTk9fQVRUUzsKKyAgICBjYXNlIEJUX1NPTDoKKyAgICBzb2w6CisgICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgICBpZiAocHRyID09IGVuZCkKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgICAgIGlmICghQ0hBUl9NQVRDSEVTKGVuYywgcHRyLCBBU0NJSV9HVCkpIHsKKyAgICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7CisgICAgICB9CisgICAgICAqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOworICAgICAgcmV0dXJuIFhNTF9UT0tfRU1QVFlfRUxFTUVOVF9OT19BVFRTOworICAgIGRlZmF1bHQ6CisgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7CisgICAgfQorICB9CisgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorUFJFRklYKGNvbnRlbnRUb2spKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipuZXh0VG9rUHRyKQoreworICBpZiAocHRyID09IGVuZCkKKyAgICByZXR1cm4gWE1MX1RPS19OT05FOworICBpZiAoTUlOQlBDKGVuYykgPiAxKSB7CisgICAgc2l6ZV90IG4gPSBlbmQgLSBwdHI7CisgICAgaWYgKG4gJiAoTUlOQlBDKGVuYykgLSAxKSkgeworICAgICAgbiAmPSB+KE1JTkJQQyhlbmMpIC0gMSk7CisgICAgICBpZiAobiA9PSAwKQorICAgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworICAgICAgZW5kID0gcHRyICsgbjsKKyAgICB9CisgIH0KKyAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisgIGNhc2UgQlRfTFQ6CisgICAgcmV0dXJuIFBSRUZJWChzY2FuTHQpKGVuYywgcHRyICsgTUlOQlBDKGVuYyksIGVuZCwgbmV4dFRva1B0cik7CisgIGNhc2UgQlRfQU1QOgorICAgIHJldHVybiBQUkVGSVgoc2NhblJlZikoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSwgZW5kLCBuZXh0VG9rUHRyKTsKKyAgY2FzZSBCVF9DUjoKKyAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgaWYgKHB0ciA9PSBlbmQpCisgICAgICByZXR1cm4gWE1MX1RPS19UUkFJTElOR19DUjsKKyAgICBpZiAoQllURV9UWVBFKGVuYywgcHRyKSA9PSBCVF9MRikKKyAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICByZXR1cm4gWE1MX1RPS19EQVRBX05FV0xJTkU7CisgIGNhc2UgQlRfTEY6CisgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKKyAgICByZXR1cm4gWE1MX1RPS19EQVRBX05FV0xJTkU7CisgIGNhc2UgQlRfUlNRQjoKKyAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgaWYgKHB0ciA9PSBlbmQpCisgICAgICByZXR1cm4gWE1MX1RPS19UUkFJTElOR19SU1FCOworICAgIGlmICghQ0hBUl9NQVRDSEVTKGVuYywgcHRyLCBBU0NJSV9SU1FCKSkKKyAgICAgIGJyZWFrOworICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICBpZiAocHRyID09IGVuZCkKKyAgICAgIHJldHVybiBYTUxfVE9LX1RSQUlMSU5HX1JTUUI7CisgICAgaWYgKCFDSEFSX01BVENIRVMoZW5jLCBwdHIsIEFTQ0lJX0dUKSkgeworICAgICAgcHRyIC09IE1JTkJQQyhlbmMpOworICAgICAgYnJlYWs7CisgICAgfQorICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7CisgIElOVkFMSURfQ0FTRVMocHRyLCBuZXh0VG9rUHRyKQorICBkZWZhdWx0OgorICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICBicmVhazsKKyAgfQorICB3aGlsZSAocHRyICE9IGVuZCkgeworICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworI2RlZmluZSBMRUFEX0NBU0UobikgXAorICAgIGNhc2UgQlRfTEVBRCAjIyBuOiBcCisgICAgICBpZiAoZW5kIC0gcHRyIDwgbiB8fCBJU19JTlZBTElEX0NIQVIoZW5jLCBwdHIsIG4pKSB7IFwKKyAgICAgICAgKm5leHRUb2tQdHIgPSBwdHI7IFwKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfREFUQV9DSEFSUzsgXAorICAgICAgfSBcCisgICAgICBwdHIgKz0gbjsgXAorICAgICAgYnJlYWs7CisgICAgTEVBRF9DQVNFKDIpIExFQURfQ0FTRSgzKSBMRUFEX0NBU0UoNCkKKyN1bmRlZiBMRUFEX0NBU0UKKyAgICBjYXNlIEJUX1JTUUI6CisgICAgICBpZiAocHRyICsgTUlOQlBDKGVuYykgIT0gZW5kKSB7CisgICAgICAgICBpZiAoIUNIQVJfTUFUQ0hFUyhlbmMsIHB0ciArIE1JTkJQQyhlbmMpLCBBU0NJSV9SU1FCKSkgeworICAgICAgICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgICAgaWYgKHB0ciArIDIqTUlOQlBDKGVuYykgIT0gZW5kKSB7CisgICAgICAgICAgIGlmICghQ0hBUl9NQVRDSEVTKGVuYywgcHRyICsgMipNSU5CUEMoZW5jKSwgQVNDSUlfR1QpKSB7CisgICAgICAgICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICB9CisgICAgICAgICAgICpuZXh0VG9rUHRyID0gcHRyICsgMipNSU5CUEMoZW5jKTsKKyAgICAgICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgQlRfQU1QOgorICAgIGNhc2UgQlRfTFQ6CisgICAgY2FzZSBCVF9OT05YTUw6CisgICAgY2FzZSBCVF9NQUxGT1JNOgorICAgIGNhc2UgQlRfVFJBSUw6CisgICAgY2FzZSBCVF9DUjoKKyAgICBjYXNlIEJUX0xGOgorICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gWE1MX1RPS19EQVRBX0NIQVJTOworICAgIGRlZmF1bHQ6CisgICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgKm5leHRUb2tQdHIgPSBwdHI7CisgIHJldHVybiBYTUxfVE9LX0RBVEFfQ0hBUlM7Cit9CisKKy8qIHB0ciBwb2ludHMgdG8gY2hhcmFjdGVyIGZvbGxvd2luZyAiJSIgKi8KKworc3RhdGljIGludCBQVFJDQUxMCitQUkVGSVgoc2NhblBlcmNlbnQpKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbmV4dFRva1B0cikKK3sKKyAgaWYgKHB0ciA9PSBlbmQpCisgICAgcmV0dXJuIC1YTUxfVE9LX1BFUkNFTlQ7CisgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICBDSEVDS19OTVNUUlRfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKKyAgY2FzZSBCVF9TOiBjYXNlIEJUX0xGOiBjYXNlIEJUX0NSOiBjYXNlIEJUX1BFUkNOVDoKKyAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICByZXR1cm4gWE1MX1RPS19QRVJDRU5UOworICBkZWZhdWx0OgorICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7CisgIH0KKyAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKKyAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgICBDSEVDS19OQU1FX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCisgICAgY2FzZSBCVF9TRU1JOgorICAgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKKyAgICAgIHJldHVybiBYTUxfVE9LX1BBUkFNX0VOVElUWV9SRUY7CisgICAgZGVmYXVsdDoKKyAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitQUkVGSVgoc2NhblBvdW5kTmFtZSkoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKm5leHRUb2tQdHIpCit7CisgIGlmIChwdHIgPT0gZW5kKQorICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7CisgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICBDSEVDS19OTVNUUlRfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKKyAgZGVmYXVsdDoKKyAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICB9CisgIHdoaWxlIChwdHIgIT0gZW5kKSB7CisgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisgICAgQ0hFQ0tfTkFNRV9DQVNFUyhlbmMsIHB0ciwgZW5kLCBuZXh0VG9rUHRyKQorICAgIGNhc2UgQlRfQ1I6IGNhc2UgQlRfTEY6IGNhc2UgQlRfUzoKKyAgICBjYXNlIEJUX1JQQVI6IGNhc2UgQlRfR1Q6IGNhc2UgQlRfUEVSQ05UOiBjYXNlIEJUX1ZFUkJBUjoKKyAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgcmV0dXJuIFhNTF9UT0tfUE9VTkRfTkFNRTsKKyAgICBkZWZhdWx0OgorICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgIH0KKyAgfQorICByZXR1cm4gLVhNTF9UT0tfUE9VTkRfTkFNRTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitQUkVGSVgoc2NhbkxpdCkoaW50IG9wZW4sIGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKm5leHRUb2tQdHIpCit7CisgIHdoaWxlIChwdHIgIT0gZW5kKSB7CisgICAgaW50IHQgPSBCWVRFX1RZUEUoZW5jLCBwdHIpOworICAgIHN3aXRjaCAodCkgeworICAgIElOVkFMSURfQ0FTRVMocHRyLCBuZXh0VG9rUHRyKQorICAgIGNhc2UgQlRfUVVPVDoKKyAgICBjYXNlIEJUX0FQT1M6CisgICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgICBpZiAodCAhPSBvcGVuKQorICAgICAgICBicmVhazsKKyAgICAgIGlmIChwdHIgPT0gZW5kKQorICAgICAgICByZXR1cm4gLVhNTF9UT0tfTElURVJBTDsKKyAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisgICAgICBjYXNlIEJUX1M6IGNhc2UgQlRfQ1I6IGNhc2UgQlRfTEY6CisgICAgICBjYXNlIEJUX0dUOiBjYXNlIEJUX1BFUkNOVDogY2FzZSBCVF9MU1FCOgorICAgICAgICByZXR1cm4gWE1MX1RPS19MSVRFUkFMOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorUFJFRklYKHByb2xvZ1RvaykoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbmV4dFRva1B0cikKK3sKKyAgaW50IHRvazsKKyAgaWYgKHB0ciA9PSBlbmQpCisgICAgcmV0dXJuIFhNTF9UT0tfTk9ORTsKKyAgaWYgKE1JTkJQQyhlbmMpID4gMSkgeworICAgIHNpemVfdCBuID0gZW5kIC0gcHRyOworICAgIGlmIChuICYgKE1JTkJQQyhlbmMpIC0gMSkpIHsKKyAgICAgIG4gJj0gfihNSU5CUEMoZW5jKSAtIDEpOworICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgICAgIGVuZCA9IHB0ciArIG47CisgICAgfQorICB9CisgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICBjYXNlIEJUX1FVT1Q6CisgICAgcmV0dXJuIFBSRUZJWChzY2FuTGl0KShCVF9RVU9ULCBlbmMsIHB0ciArIE1JTkJQQyhlbmMpLCBlbmQsIG5leHRUb2tQdHIpOworICBjYXNlIEJUX0FQT1M6CisgICAgcmV0dXJuIFBSRUZJWChzY2FuTGl0KShCVF9BUE9TLCBlbmMsIHB0ciArIE1JTkJQQyhlbmMpLCBlbmQsIG5leHRUb2tQdHIpOworICBjYXNlIEJUX0xUOgorICAgIHsKKyAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgIGlmIChwdHIgPT0gZW5kKQorICAgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworICAgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisgICAgICBjYXNlIEJUX0VYQ0w6CisgICAgICAgIHJldHVybiBQUkVGSVgoc2NhbkRlY2wpKGVuYywgcHRyICsgTUlOQlBDKGVuYyksIGVuZCwgbmV4dFRva1B0cik7CisgICAgICBjYXNlIEJUX1FVRVNUOgorICAgICAgICByZXR1cm4gUFJFRklYKHNjYW5QaSkoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSwgZW5kLCBuZXh0VG9rUHRyKTsKKyAgICAgIGNhc2UgQlRfTk1TVFJUOgorICAgICAgY2FzZSBCVF9IRVg6CisgICAgICBjYXNlIEJUX05PTkFTQ0lJOgorICAgICAgY2FzZSBCVF9MRUFEMjoKKyAgICAgIGNhc2UgQlRfTEVBRDM6CisgICAgICBjYXNlIEJUX0xFQUQ0OgorICAgICAgICAqbmV4dFRva1B0ciA9IHB0ciAtIE1JTkJQQyhlbmMpOworICAgICAgICByZXR1cm4gWE1MX1RPS19JTlNUQU5DRV9TVEFSVDsKKyAgICAgIH0KKyAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICB9CisgIGNhc2UgQlRfQ1I6CisgICAgaWYgKHB0ciArIE1JTkJQQyhlbmMpID09IGVuZCkgeworICAgICAgKm5leHRUb2tQdHIgPSBlbmQ7CisgICAgICAvKiBpbmRpY2F0ZSB0aGF0IHRoaXMgbWlnaHQgYmUgcGFydCBvZiBhIENSL0xGIHBhaXIgKi8KKyAgICAgIHJldHVybiAtWE1MX1RPS19QUk9MT0dfUzsKKyAgICB9CisgICAgLyogZmFsbCB0aHJvdWdoICovCisgIGNhc2UgQlRfUzogY2FzZSBCVF9MRjoKKyAgICBmb3IgKDs7KSB7CisgICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgICBpZiAocHRyID09IGVuZCkKKyAgICAgICAgYnJlYWs7CisgICAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgICAgIGNhc2UgQlRfUzogY2FzZSBCVF9MRjoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEJUX0NSOgorICAgICAgICAvKiBkb24ndCBzcGxpdCBDUi9MRiBwYWlyICovCisgICAgICAgIGlmIChwdHIgKyBNSU5CUEMoZW5jKSAhPSBlbmQpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgZGVmYXVsdDoKKyAgICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICAgIHJldHVybiBYTUxfVE9LX1BST0xPR19TOworICAgICAgfQorICAgIH0KKyAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICByZXR1cm4gWE1MX1RPS19QUk9MT0dfUzsKKyAgY2FzZSBCVF9QRVJDTlQ6CisgICAgcmV0dXJuIFBSRUZJWChzY2FuUGVyY2VudCkoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSwgZW5kLCBuZXh0VG9rUHRyKTsKKyAgY2FzZSBCVF9DT01NQToKKyAgICAqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOworICAgIHJldHVybiBYTUxfVE9LX0NPTU1BOworICBjYXNlIEJUX0xTUUI6CisgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKKyAgICByZXR1cm4gWE1MX1RPS19PUEVOX0JSQUNLRVQ7CisgIGNhc2UgQlRfUlNRQjoKKyAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgaWYgKHB0ciA9PSBlbmQpCisgICAgICByZXR1cm4gLVhNTF9UT0tfQ0xPU0VfQlJBQ0tFVDsKKyAgICBpZiAoQ0hBUl9NQVRDSEVTKGVuYywgcHRyLCBBU0NJSV9SU1FCKSkgeworICAgICAgaWYgKHB0ciArIE1JTkJQQyhlbmMpID09IGVuZCkKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgICAgIGlmIChDSEFSX01BVENIRVMoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSwgQVNDSUlfR1QpKSB7CisgICAgICAgICpuZXh0VG9rUHRyID0gcHRyICsgMipNSU5CUEMoZW5jKTsKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfQ09ORF9TRUNUX0NMT1NFOworICAgICAgfQorICAgIH0KKyAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICByZXR1cm4gWE1MX1RPS19DTE9TRV9CUkFDS0VUOworICBjYXNlIEJUX0xQQVI6CisgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKKyAgICByZXR1cm4gWE1MX1RPS19PUEVOX1BBUkVOOworICBjYXNlIEJUX1JQQVI6CisgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgIGlmIChwdHIgPT0gZW5kKQorICAgICAgcmV0dXJuIC1YTUxfVE9LX0NMT1NFX1BBUkVOOworICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICAgIGNhc2UgQlRfQVNUOgorICAgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKKyAgICAgIHJldHVybiBYTUxfVE9LX0NMT1NFX1BBUkVOX0FTVEVSSVNLOworICAgIGNhc2UgQlRfUVVFU1Q6CisgICAgICAqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOworICAgICAgcmV0dXJuIFhNTF9UT0tfQ0xPU0VfUEFSRU5fUVVFU1RJT047CisgICAgY2FzZSBCVF9QTFVTOgorICAgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKKyAgICAgIHJldHVybiBYTUxfVE9LX0NMT1NFX1BBUkVOX1BMVVM7CisgICAgY2FzZSBCVF9DUjogY2FzZSBCVF9MRjogY2FzZSBCVF9TOgorICAgIGNhc2UgQlRfR1Q6IGNhc2UgQlRfQ09NTUE6IGNhc2UgQlRfVkVSQkFSOgorICAgIGNhc2UgQlRfUlBBUjoKKyAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgcmV0dXJuIFhNTF9UT0tfQ0xPU0VfUEFSRU47CisgICAgfQorICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7CisgIGNhc2UgQlRfVkVSQkFSOgorICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7CisgICAgcmV0dXJuIFhNTF9UT0tfT1I7CisgIGNhc2UgQlRfR1Q6CisgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKKyAgICByZXR1cm4gWE1MX1RPS19ERUNMX0NMT1NFOworICBjYXNlIEJUX05VTToKKyAgICByZXR1cm4gUFJFRklYKHNjYW5Qb3VuZE5hbWUpKGVuYywgcHRyICsgTUlOQlBDKGVuYyksIGVuZCwgbmV4dFRva1B0cik7CisjZGVmaW5lIExFQURfQ0FTRShuKSBcCisgIGNhc2UgQlRfTEVBRCAjIyBuOiBcCisgICAgaWYgKGVuZCAtIHB0ciA8IG4pIFwKKyAgICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUxfQ0hBUjsgXAorICAgIGlmIChJU19OTVNUUlRfQ0hBUihlbmMsIHB0ciwgbikpIHsgXAorICAgICAgcHRyICs9IG47IFwKKyAgICAgIHRvayA9IFhNTF9UT0tfTkFNRTsgXAorICAgICAgYnJlYWs7IFwKKyAgICB9IFwKKyAgICBpZiAoSVNfTkFNRV9DSEFSKGVuYywgcHRyLCBuKSkgeyBcCisgICAgICBwdHIgKz0gbjsgXAorICAgICAgdG9rID0gWE1MX1RPS19OTVRPS0VOOyBcCisgICAgICBicmVhazsgXAorICAgIH0gXAorICAgICpuZXh0VG9rUHRyID0gcHRyOyBcCisgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICBMRUFEX0NBU0UoMikgTEVBRF9DQVNFKDMpIExFQURfQ0FTRSg0KQorI3VuZGVmIExFQURfQ0FTRQorICBjYXNlIEJUX05NU1RSVDoKKyAgY2FzZSBCVF9IRVg6CisgICAgdG9rID0gWE1MX1RPS19OQU1FOworICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICBicmVhazsKKyAgY2FzZSBCVF9ESUdJVDoKKyAgY2FzZSBCVF9OQU1FOgorICBjYXNlIEJUX01JTlVTOgorI2lmZGVmIFhNTF9OUworICBjYXNlIEJUX0NPTE9OOgorI2VuZGlmCisgICAgdG9rID0gWE1MX1RPS19OTVRPS0VOOworICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICBicmVhazsKKyAgY2FzZSBCVF9OT05BU0NJSToKKyAgICBpZiAoSVNfTk1TVFJUX0NIQVJfTUlOQlBDKGVuYywgcHRyKSkgeworICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgdG9rID0gWE1MX1RPS19OQU1FOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChJU19OQU1FX0NIQVJfTUlOQlBDKGVuYywgcHRyKSkgeworICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgdG9rID0gWE1MX1RPS19OTVRPS0VOOworICAgICAgYnJlYWs7CisgICAgfQorICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICBkZWZhdWx0OgorICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7CisgIH0KKyAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKKyAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgICBDSEVDS19OQU1FX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCisgICAgY2FzZSBCVF9HVDogY2FzZSBCVF9SUEFSOiBjYXNlIEJUX0NPTU1BOgorICAgIGNhc2UgQlRfVkVSQkFSOiBjYXNlIEJUX0xTUUI6IGNhc2UgQlRfUEVSQ05UOgorICAgIGNhc2UgQlRfUzogY2FzZSBCVF9DUjogY2FzZSBCVF9MRjoKKyAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgcmV0dXJuIHRvazsKKyNpZmRlZiBYTUxfTlMKKyAgICBjYXNlIEJUX0NPTE9OOgorICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgc3dpdGNoICh0b2spIHsKKyAgICAgIGNhc2UgWE1MX1RPS19OQU1FOgorICAgICAgICBpZiAocHRyID09IGVuZCkKKyAgICAgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworICAgICAgICB0b2sgPSBYTUxfVE9LX1BSRUZJWEVEX05BTUU7CisgICAgICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICAgICAgICBDSEVDS19OQU1FX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdG9rID0gWE1MX1RPS19OTVRPS0VOOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBYTUxfVE9LX1BSRUZJWEVEX05BTUU6CisgICAgICAgIHRvayA9IFhNTF9UT0tfTk1UT0tFTjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgQlRfUExVUzoKKyAgICAgIGlmICh0b2sgPT0gWE1MX1RPS19OTVRPS0VOKSAgeworICAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICAgIH0KKyAgICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7CisgICAgICByZXR1cm4gWE1MX1RPS19OQU1FX1BMVVM7CisgICAgY2FzZSBCVF9BU1Q6CisgICAgICBpZiAodG9rID09IFhNTF9UT0tfTk1UT0tFTikgIHsKKyAgICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7CisgICAgICB9CisgICAgICAqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOworICAgICAgcmV0dXJuIFhNTF9UT0tfTkFNRV9BU1RFUklTSzsKKyAgICBjYXNlIEJUX1FVRVNUOgorICAgICAgaWYgKHRvayA9PSBYTUxfVE9LX05NVE9LRU4pICB7CisgICAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgICAgfQorICAgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKKyAgICAgIHJldHVybiBYTUxfVE9LX05BTUVfUVVFU1RJT047CisgICAgZGVmYXVsdDoKKyAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIC10b2s7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorUFJFRklYKGF0dHJpYnV0ZVZhbHVlVG9rKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwgY29uc3QgY2hhciAqKm5leHRUb2tQdHIpCit7CisgIGNvbnN0IGNoYXIgKnN0YXJ0OworICBpZiAocHRyID09IGVuZCkKKyAgICByZXR1cm4gWE1MX1RPS19OT05FOworICBzdGFydCA9IHB0cjsKKyAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKKyAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyNkZWZpbmUgTEVBRF9DQVNFKG4pIFwKKyAgICBjYXNlIEJUX0xFQUQgIyMgbjogcHRyICs9IG47IGJyZWFrOworICAgIExFQURfQ0FTRSgyKSBMRUFEX0NBU0UoMykgTEVBRF9DQVNFKDQpCisjdW5kZWYgTEVBRF9DQVNFCisgICAgY2FzZSBCVF9BTVA6CisgICAgICBpZiAocHRyID09IHN0YXJ0KQorICAgICAgICByZXR1cm4gUFJFRklYKHNjYW5SZWYpKGVuYywgcHRyICsgTUlOQlBDKGVuYyksIGVuZCwgbmV4dFRva1B0cik7CisgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgIHJldHVybiBYTUxfVE9LX0RBVEFfQ0hBUlM7CisgICAgY2FzZSBCVF9MVDoKKyAgICAgIC8qIHRoaXMgaXMgZm9yIGluc2lkZSBlbnRpdHkgcmVmZXJlbmNlcyAqLworICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgIGNhc2UgQlRfTEY6CisgICAgICBpZiAocHRyID09IHN0YXJ0KSB7CisgICAgICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7CisgICAgICAgIHJldHVybiBYTUxfVE9LX0RBVEFfTkVXTElORTsKKyAgICAgIH0KKyAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgcmV0dXJuIFhNTF9UT0tfREFUQV9DSEFSUzsKKyAgICBjYXNlIEJUX0NSOgorICAgICAgaWYgKHB0ciA9PSBzdGFydCkgeworICAgICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgICAgIGlmIChwdHIgPT0gZW5kKQorICAgICAgICAgIHJldHVybiBYTUxfVE9LX1RSQUlMSU5HX0NSOworICAgICAgICBpZiAoQllURV9UWVBFKGVuYywgcHRyKSA9PSBCVF9MRikKKyAgICAgICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgICByZXR1cm4gWE1MX1RPS19EQVRBX05FV0xJTkU7CisgICAgICB9CisgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgIHJldHVybiBYTUxfVE9LX0RBVEFfQ0hBUlM7CisgICAgY2FzZSBCVF9TOgorICAgICAgaWYgKHB0ciA9PSBzdGFydCkgeworICAgICAgICAqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOworICAgICAgICByZXR1cm4gWE1MX1RPS19BVFRSSUJVVEVfVkFMVUVfUzsKKyAgICAgIH0KKyAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgcmV0dXJuIFhNTF9UT0tfREFUQV9DSEFSUzsKKyAgICBkZWZhdWx0OgorICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgICpuZXh0VG9rUHRyID0gcHRyOworICByZXR1cm4gWE1MX1RPS19EQVRBX0NIQVJTOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK1BSRUZJWChlbnRpdHlWYWx1ZVRvaykoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsIGNvbnN0IGNoYXIgKipuZXh0VG9rUHRyKQoreworICBjb25zdCBjaGFyICpzdGFydDsKKyAgaWYgKHB0ciA9PSBlbmQpCisgICAgcmV0dXJuIFhNTF9UT0tfTk9ORTsKKyAgc3RhcnQgPSBwdHI7CisgIHdoaWxlIChwdHIgIT0gZW5kKSB7CisgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisjZGVmaW5lIExFQURfQ0FTRShuKSBcCisgICAgY2FzZSBCVF9MRUFEICMjIG46IHB0ciArPSBuOyBicmVhazsKKyAgICBMRUFEX0NBU0UoMikgTEVBRF9DQVNFKDMpIExFQURfQ0FTRSg0KQorI3VuZGVmIExFQURfQ0FTRQorICAgIGNhc2UgQlRfQU1QOgorICAgICAgaWYgKHB0ciA9PSBzdGFydCkKKyAgICAgICAgcmV0dXJuIFBSRUZJWChzY2FuUmVmKShlbmMsIHB0ciArIE1JTkJQQyhlbmMpLCBlbmQsIG5leHRUb2tQdHIpOworICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gWE1MX1RPS19EQVRBX0NIQVJTOworICAgIGNhc2UgQlRfUEVSQ05UOgorICAgICAgaWYgKHB0ciA9PSBzdGFydCkgeworICAgICAgICBpbnQgdG9rID0gIFBSRUZJWChzY2FuUGVyY2VudCkoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwgbmV4dFRva1B0cik7CisgICAgICAgIHJldHVybiAodG9rID09IFhNTF9UT0tfUEVSQ0VOVCkgPyBYTUxfVE9LX0lOVkFMSUQgOiB0b2s7CisgICAgICB9CisgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgIHJldHVybiBYTUxfVE9LX0RBVEFfQ0hBUlM7CisgICAgY2FzZSBCVF9MRjoKKyAgICAgIGlmIChwdHIgPT0gc3RhcnQpIHsKKyAgICAgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfREFUQV9ORVdMSU5FOworICAgICAgfQorICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gWE1MX1RPS19EQVRBX0NIQVJTOworICAgIGNhc2UgQlRfQ1I6CisgICAgICBpZiAocHRyID09IHN0YXJ0KSB7CisgICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgICAgaWYgKHB0ciA9PSBlbmQpCisgICAgICAgICAgcmV0dXJuIFhNTF9UT0tfVFJBSUxJTkdfQ1I7CisgICAgICAgIGlmIChCWVRFX1RZUEUoZW5jLCBwdHIpID09IEJUX0xGKQorICAgICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICAgIHJldHVybiBYTUxfVE9LX0RBVEFfTkVXTElORTsKKyAgICAgIH0KKyAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgcmV0dXJuIFhNTF9UT0tfREFUQV9DSEFSUzsKKyAgICBkZWZhdWx0OgorICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgICpuZXh0VG9rUHRyID0gcHRyOworICByZXR1cm4gWE1MX1RPS19EQVRBX0NIQVJTOworfQorCisjaWZkZWYgWE1MX0RURAorCitzdGF0aWMgaW50IFBUUkNBTEwKK1BSRUZJWChpZ25vcmVTZWN0aW9uVG9rKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLCBjb25zdCBjaGFyICoqbmV4dFRva1B0cikKK3sKKyAgaW50IGxldmVsID0gMDsKKyAgaWYgKE1JTkJQQyhlbmMpID4gMSkgeworICAgIHNpemVfdCBuID0gZW5kIC0gcHRyOworICAgIGlmIChuICYgKE1JTkJQQyhlbmMpIC0gMSkpIHsKKyAgICAgIG4gJj0gfihNSU5CUEMoZW5jKSAtIDEpOworICAgICAgZW5kID0gcHRyICsgbjsKKyAgICB9CisgIH0KKyAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKKyAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgICBJTlZBTElEX0NBU0VTKHB0ciwgbmV4dFRva1B0cikKKyAgICBjYXNlIEJUX0xUOgorICAgICAgaWYgKChwdHIgKz0gTUlOQlBDKGVuYykpID09IGVuZCkKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgICAgIGlmIChDSEFSX01BVENIRVMoZW5jLCBwdHIsIEFTQ0lJX0VYQ0wpKSB7CisgICAgICAgIGlmICgocHRyICs9IE1JTkJQQyhlbmMpKSA9PSBlbmQpCisgICAgICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgICAgICAgaWYgKENIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgQVNDSUlfTFNRQikpIHsKKyAgICAgICAgICArK2xldmVsOworICAgICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBCVF9SU1FCOgorICAgICAgaWYgKChwdHIgKz0gTUlOQlBDKGVuYykpID09IGVuZCkKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgICAgIGlmIChDSEFSX01BVENIRVMoZW5jLCBwdHIsIEFTQ0lJX1JTUUIpKSB7CisgICAgICAgIGlmICgocHRyICs9IE1JTkJQQyhlbmMpKSA9PSBlbmQpCisgICAgICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgICAgICAgaWYgKENIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgQVNDSUlfR1QpKSB7CisgICAgICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgICAgIGlmIChsZXZlbCA9PSAwKSB7CisgICAgICAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgICAgICAgIHJldHVybiBYTUxfVE9LX0lHTk9SRV9TRUNUOworICAgICAgICAgIH0KKyAgICAgICAgICAtLWxldmVsOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7Cit9CisKKyNlbmRpZiAvKiBYTUxfRFREICovCisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorUFJFRklYKGlzUHVibGljSWQpKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipiYWRQdHIpCit7CisgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgZW5kIC09IE1JTkJQQyhlbmMpOworICBmb3IgKDsgcHRyICE9IGVuZDsgcHRyICs9IE1JTkJQQyhlbmMpKSB7CisgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisgICAgY2FzZSBCVF9ESUdJVDoKKyAgICBjYXNlIEJUX0hFWDoKKyAgICBjYXNlIEJUX01JTlVTOgorICAgIGNhc2UgQlRfQVBPUzoKKyAgICBjYXNlIEJUX0xQQVI6CisgICAgY2FzZSBCVF9SUEFSOgorICAgIGNhc2UgQlRfUExVUzoKKyAgICBjYXNlIEJUX0NPTU1BOgorICAgIGNhc2UgQlRfU09MOgorICAgIGNhc2UgQlRfRVFVQUxTOgorICAgIGNhc2UgQlRfUVVFU1Q6CisgICAgY2FzZSBCVF9DUjoKKyAgICBjYXNlIEJUX0xGOgorICAgIGNhc2UgQlRfU0VNSToKKyAgICBjYXNlIEJUX0VYQ0w6CisgICAgY2FzZSBCVF9BU1Q6CisgICAgY2FzZSBCVF9QRVJDTlQ6CisgICAgY2FzZSBCVF9OVU06CisjaWZkZWYgWE1MX05TCisgICAgY2FzZSBCVF9DT0xPTjoKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgY2FzZSBCVF9TOgorICAgICAgaWYgKENIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgQVNDSUlfVEFCKSkgeworICAgICAgICAqYmFkUHRyID0gcHRyOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlRfTkFNRToKKyAgICBjYXNlIEJUX05NU1RSVDoKKyAgICAgIGlmICghKEJZVEVfVE9fQVNDSUkoZW5jLCBwdHIpICYgfjB4N2YpKQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgc3dpdGNoIChCWVRFX1RPX0FTQ0lJKGVuYywgcHRyKSkgeworICAgICAgY2FzZSAweDI0OiAvKiAkICovCisgICAgICBjYXNlIDB4NDA6IC8qIEAgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAqYmFkUHRyID0gcHRyOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworLyogVGhpcyBtdXN0IG9ubHkgYmUgY2FsbGVkIGZvciBhIHdlbGwtZm9ybWVkIHN0YXJ0LXRhZyBvciBlbXB0eQorICAgZWxlbWVudCB0YWcuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcy4gIFBvaW50ZXJzIHRvIHRoZQorICAgZmlyc3QgYXR0c01heCBhdHRyaWJ1dGVzIGFyZSBzdG9yZWQgaW4gYXR0cy4KKyovCisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorUFJFRklYKGdldEF0dHMpKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgICAgICAgICBpbnQgYXR0c01heCwgQVRUUklCVVRFICphdHRzKQoreworICBlbnVtIHsgb3RoZXIsIGluTmFtZSwgaW5WYWx1ZSB9IHN0YXRlID0gaW5OYW1lOworICBpbnQgbkF0dHMgPSAwOworICBpbnQgb3BlbiA9IDA7IC8qIGRlZmluZWQgd2hlbiBzdGF0ZSA9PSBpblZhbHVlOworICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIGp1c3QgdG8gc2h1dCB1cCBjb21waWxlcnMgKi8KKworICBmb3IgKHB0ciArPSBNSU5CUEMoZW5jKTs7IHB0ciArPSBNSU5CUEMoZW5jKSkgeworICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworI2RlZmluZSBTVEFSVF9OQU1FIFwKKyAgICAgIGlmIChzdGF0ZSA9PSBvdGhlcikgeyBcCisgICAgICAgIGlmIChuQXR0cyA8IGF0dHNNYXgpIHsgXAorICAgICAgICAgIGF0dHNbbkF0dHNdLm5hbWUgPSBwdHI7IFwKKyAgICAgICAgICBhdHRzW25BdHRzXS5ub3JtYWxpemVkID0gMTsgXAorICAgICAgICB9IFwKKyAgICAgICAgc3RhdGUgPSBpbk5hbWU7IFwKKyAgICAgIH0KKyNkZWZpbmUgTEVBRF9DQVNFKG4pIFwKKyAgICBjYXNlIEJUX0xFQUQgIyMgbjogU1RBUlRfTkFNRSBwdHIgKz0gKG4gLSBNSU5CUEMoZW5jKSk7IGJyZWFrOworICAgIExFQURfQ0FTRSgyKSBMRUFEX0NBU0UoMykgTEVBRF9DQVNFKDQpCisjdW5kZWYgTEVBRF9DQVNFCisgICAgY2FzZSBCVF9OT05BU0NJSToKKyAgICBjYXNlIEJUX05NU1RSVDoKKyAgICBjYXNlIEJUX0hFWDoKKyAgICAgIFNUQVJUX05BTUUKKyAgICAgIGJyZWFrOworI3VuZGVmIFNUQVJUX05BTUUKKyAgICBjYXNlIEJUX1FVT1Q6CisgICAgICBpZiAoc3RhdGUgIT0gaW5WYWx1ZSkgeworICAgICAgICBpZiAobkF0dHMgPCBhdHRzTWF4KQorICAgICAgICAgIGF0dHNbbkF0dHNdLnZhbHVlUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7CisgICAgICAgIHN0YXRlID0gaW5WYWx1ZTsKKyAgICAgICAgb3BlbiA9IEJUX1FVT1Q7CisgICAgICB9CisgICAgICBlbHNlIGlmIChvcGVuID09IEJUX1FVT1QpIHsKKyAgICAgICAgc3RhdGUgPSBvdGhlcjsKKyAgICAgICAgaWYgKG5BdHRzIDwgYXR0c01heCkKKyAgICAgICAgICBhdHRzW25BdHRzXS52YWx1ZUVuZCA9IHB0cjsKKyAgICAgICAgbkF0dHMrKzsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlRfQVBPUzoKKyAgICAgIGlmIChzdGF0ZSAhPSBpblZhbHVlKSB7CisgICAgICAgIGlmIChuQXR0cyA8IGF0dHNNYXgpCisgICAgICAgICAgYXR0c1tuQXR0c10udmFsdWVQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKKyAgICAgICAgc3RhdGUgPSBpblZhbHVlOworICAgICAgICBvcGVuID0gQlRfQVBPUzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKG9wZW4gPT0gQlRfQVBPUykgeworICAgICAgICBzdGF0ZSA9IG90aGVyOworICAgICAgICBpZiAobkF0dHMgPCBhdHRzTWF4KQorICAgICAgICAgIGF0dHNbbkF0dHNdLnZhbHVlRW5kID0gcHRyOworICAgICAgICBuQXR0cysrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBCVF9BTVA6CisgICAgICBpZiAobkF0dHMgPCBhdHRzTWF4KQorICAgICAgICBhdHRzW25BdHRzXS5ub3JtYWxpemVkID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlRfUzoKKyAgICAgIGlmIChzdGF0ZSA9PSBpbk5hbWUpCisgICAgICAgIHN0YXRlID0gb3RoZXI7CisgICAgICBlbHNlIGlmIChzdGF0ZSA9PSBpblZhbHVlCisgICAgICAgICAgICAgICAmJiBuQXR0cyA8IGF0dHNNYXgKKyAgICAgICAgICAgICAgICYmIGF0dHNbbkF0dHNdLm5vcm1hbGl6ZWQKKyAgICAgICAgICAgICAgICYmIChwdHIgPT0gYXR0c1tuQXR0c10udmFsdWVQdHIKKyAgICAgICAgICAgICAgICAgICB8fCBCWVRFX1RPX0FTQ0lJKGVuYywgcHRyKSAhPSBBU0NJSV9TUEFDRQorICAgICAgICAgICAgICAgICAgIHx8IEJZVEVfVE9fQVNDSUkoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSkgPT0gQVNDSUlfU1BBQ0UKKyAgICAgICAgICAgICAgICAgICB8fCBCWVRFX1RZUEUoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSkgPT0gb3BlbikpCisgICAgICAgIGF0dHNbbkF0dHNdLm5vcm1hbGl6ZWQgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVF9DUjogY2FzZSBCVF9MRjoKKyAgICAgIC8qIFRoaXMgY2FzZSBlbnN1cmVzIHRoYXQgdGhlIGZpcnN0IGF0dHJpYnV0ZSBuYW1lIGlzIGNvdW50ZWQKKyAgICAgICAgIEFwYXJ0IGZyb20gdGhhdCB3ZSBjb3VsZCBqdXN0IGNoYW5nZSBzdGF0ZSBvbiB0aGUgcXVvdGUuICovCisgICAgICBpZiAoc3RhdGUgPT0gaW5OYW1lKQorICAgICAgICBzdGF0ZSA9IG90aGVyOworICAgICAgZWxzZSBpZiAoc3RhdGUgPT0gaW5WYWx1ZSAmJiBuQXR0cyA8IGF0dHNNYXgpCisgICAgICAgIGF0dHNbbkF0dHNdLm5vcm1hbGl6ZWQgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVF9HVDoKKyAgICBjYXNlIEJUX1NPTDoKKyAgICAgIGlmIChzdGF0ZSAhPSBpblZhbHVlKQorICAgICAgICByZXR1cm4gbkF0dHM7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIC8qIG5vdCByZWFjaGVkICovCit9CisKK3N0YXRpYyBpbnQgUFRSRkFTVENBTEwKK1BSRUZJWChjaGFyUmVmTnVtYmVyKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIpCit7CisgIGludCByZXN1bHQgPSAwOworICAvKiBza2lwICYjICovCisgIHB0ciArPSAyKk1JTkJQQyhlbmMpOworICBpZiAoQ0hBUl9NQVRDSEVTKGVuYywgcHRyLCBBU0NJSV94KSkgeworICAgIGZvciAocHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgICAgIUNIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgQVNDSUlfU0VNSSk7CisgICAgICAgICBwdHIgKz0gTUlOQlBDKGVuYykpIHsKKyAgICAgIGludCBjID0gQllURV9UT19BU0NJSShlbmMsIHB0cik7CisgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgQVNDSUlfMDogY2FzZSBBU0NJSV8xOiBjYXNlIEFTQ0lJXzI6IGNhc2UgQVNDSUlfMzogY2FzZSBBU0NJSV80OgorICAgICAgY2FzZSBBU0NJSV81OiBjYXNlIEFTQ0lJXzY6IGNhc2UgQVNDSUlfNzogY2FzZSBBU0NJSV84OiBjYXNlIEFTQ0lJXzk6CisgICAgICAgIHJlc3VsdCA8PD0gNDsKKyAgICAgICAgcmVzdWx0IHw9IChjIC0gQVNDSUlfMCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBBU0NJSV9BOiBjYXNlIEFTQ0lJX0I6IGNhc2UgQVNDSUlfQzoKKyAgICAgIGNhc2UgQVNDSUlfRDogY2FzZSBBU0NJSV9FOiBjYXNlIEFTQ0lJX0Y6CisgICAgICAgIHJlc3VsdCA8PD0gNDsKKyAgICAgICAgcmVzdWx0ICs9IDEwICsgKGMgLSBBU0NJSV9BKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFTQ0lJX2E6IGNhc2UgQVNDSUlfYjogY2FzZSBBU0NJSV9jOgorICAgICAgY2FzZSBBU0NJSV9kOiBjYXNlIEFTQ0lJX2U6IGNhc2UgQVNDSUlfZjoKKyAgICAgICAgcmVzdWx0IDw8PSA0OworICAgICAgICByZXN1bHQgKz0gMTAgKyAoYyAtIEFTQ0lJX2EpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChyZXN1bHQgPj0gMHgxMTAwMDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgZm9yICg7ICFDSEFSX01BVENIRVMoZW5jLCBwdHIsIEFTQ0lJX1NFTUkpOyBwdHIgKz0gTUlOQlBDKGVuYykpIHsKKyAgICAgIGludCBjID0gQllURV9UT19BU0NJSShlbmMsIHB0cik7CisgICAgICByZXN1bHQgKj0gMTA7CisgICAgICByZXN1bHQgKz0gKGMgLSBBU0NJSV8wKTsKKyAgICAgIGlmIChyZXN1bHQgPj0gMHgxMTAwMDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGNoZWNrQ2hhclJlZk51bWJlcihyZXN1bHQpOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK1BSRUZJWChwcmVkZWZpbmVkRW50aXR5TmFtZSkoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQpCit7CisgIHN3aXRjaCAoKGVuZCAtIHB0cikvTUlOQlBDKGVuYykpIHsKKyAgY2FzZSAyOgorICAgIGlmIChDSEFSX01BVENIRVMoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSwgQVNDSUlfdCkpIHsKKyAgICAgIHN3aXRjaCAoQllURV9UT19BU0NJSShlbmMsIHB0cikpIHsKKyAgICAgIGNhc2UgQVNDSUlfbDoKKyAgICAgICAgcmV0dXJuIEFTQ0lJX0xUOworICAgICAgY2FzZSBBU0NJSV9nOgorICAgICAgICByZXR1cm4gQVNDSUlfR1Q7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDM6CisgICAgaWYgKENIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgQVNDSUlfYSkpIHsKKyAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgIGlmIChDSEFSX01BVENIRVMoZW5jLCBwdHIsIEFTQ0lJX20pKSB7CisgICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgICAgaWYgKENIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgQVNDSUlfcCkpCisgICAgICAgICAgcmV0dXJuIEFTQ0lJX0FNUDsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgNDoKKyAgICBzd2l0Y2ggKEJZVEVfVE9fQVNDSUkoZW5jLCBwdHIpKSB7CisgICAgY2FzZSBBU0NJSV9xOgorICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgaWYgKENIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgQVNDSUlfdSkpIHsKKyAgICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgICBpZiAoQ0hBUl9NQVRDSEVTKGVuYywgcHRyLCBBU0NJSV9vKSkgeworICAgICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgICAgICBpZiAoQ0hBUl9NQVRDSEVTKGVuYywgcHRyLCBBU0NJSV90KSkKKyAgICAgICAgICAgIHJldHVybiBBU0NJSV9RVU9UOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEFTQ0lJX2E6CisgICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgICBpZiAoQ0hBUl9NQVRDSEVTKGVuYywgcHRyLCBBU0NJSV9wKSkgeworICAgICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgICAgIGlmIChDSEFSX01BVENIRVMoZW5jLCBwdHIsIEFTQ0lJX28pKSB7CisgICAgICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgICAgIGlmIChDSEFSX01BVENIRVMoZW5jLCBwdHIsIEFTQ0lJX3MpKQorICAgICAgICAgICAgcmV0dXJuIEFTQ0lJX0FQT1M7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitQUkVGSVgoc2FtZU5hbWUpKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnB0cjEsIGNvbnN0IGNoYXIgKnB0cjIpCit7CisgIGZvciAoOzspIHsKKyAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cjEpKSB7CisjZGVmaW5lIExFQURfQ0FTRShuKSBcCisgICAgY2FzZSBCVF9MRUFEICMjIG46IFwKKyAgICAgIGlmICgqcHRyMSsrICE9ICpwdHIyKyspIFwKKyAgICAgICAgcmV0dXJuIDA7CisgICAgTEVBRF9DQVNFKDQpIExFQURfQ0FTRSgzKSBMRUFEX0NBU0UoMikKKyN1bmRlZiBMRUFEX0NBU0UKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgaWYgKCpwdHIxKysgIT0gKnB0cjIrKykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJUX05PTkFTQ0lJOgorICAgIGNhc2UgQlRfTk1TVFJUOgorI2lmZGVmIFhNTF9OUworICAgIGNhc2UgQlRfQ09MT046CisjZW5kaWYKKyAgICBjYXNlIEJUX0hFWDoKKyAgICBjYXNlIEJUX0RJR0lUOgorICAgIGNhc2UgQlRfTkFNRToKKyAgICBjYXNlIEJUX01JTlVTOgorICAgICAgaWYgKCpwdHIyKysgIT0gKnB0cjErKykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBpZiAoTUlOQlBDKGVuYykgPiAxKSB7CisgICAgICAgIGlmICgqcHRyMisrICE9ICpwdHIxKyspCisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChNSU5CUEMoZW5jKSA+IDIpIHsKKyAgICAgICAgICBpZiAoKnB0cjIrKyAhPSAqcHRyMSsrKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgaWYgKE1JTkJQQyhlbmMpID4gMykgeworICAgICAgICAgICAgaWYgKCpwdHIyKysgIT0gKnB0cjErKykKKyAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKE1JTkJQQyhlbmMpID09IDEgJiYgKnB0cjEgPT0gKnB0cjIpCisgICAgICAgIHJldHVybiAxOworICAgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIyKSkgeworICAgICAgY2FzZSBCVF9MRUFEMjoKKyAgICAgIGNhc2UgQlRfTEVBRDM6CisgICAgICBjYXNlIEJUX0xFQUQ0OgorICAgICAgY2FzZSBCVF9OT05BU0NJSToKKyAgICAgIGNhc2UgQlRfTk1TVFJUOgorI2lmZGVmIFhNTF9OUworICAgICAgY2FzZSBCVF9DT0xPTjoKKyNlbmRpZgorICAgICAgY2FzZSBCVF9IRVg6CisgICAgICBjYXNlIEJUX0RJR0lUOgorICAgICAgY2FzZSBCVF9OQU1FOgorICAgICAgY2FzZSBCVF9NSU5VUzoKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogbm90IHJlYWNoZWQgKi8KK30KKworc3RhdGljIGludCBQVFJDQUxMCitQUkVGSVgobmFtZU1hdGNoZXNBc2NpaSkoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQxLCBjb25zdCBjaGFyICpwdHIyKQoreworICBmb3IgKDsgKnB0cjI7IHB0cjEgKz0gTUlOQlBDKGVuYyksIHB0cjIrKykgeworICAgIGlmIChwdHIxID09IGVuZDEpCisgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIUNIQVJfTUFUQ0hFUyhlbmMsIHB0cjEsICpwdHIyKSkKKyAgICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBwdHIxID09IGVuZDE7Cit9CisKK3N0YXRpYyBpbnQgUFRSRkFTVENBTEwKK1BSRUZJWChuYW1lTGVuZ3RoKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIpCit7CisgIGNvbnN0IGNoYXIgKnN0YXJ0ID0gcHRyOworICBmb3IgKDs7KSB7CisgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisjZGVmaW5lIExFQURfQ0FTRShuKSBcCisgICAgY2FzZSBCVF9MRUFEICMjIG46IHB0ciArPSBuOyBicmVhazsKKyAgICBMRUFEX0NBU0UoMikgTEVBRF9DQVNFKDMpIExFQURfQ0FTRSg0KQorI3VuZGVmIExFQURfQ0FTRQorICAgIGNhc2UgQlRfTk9OQVNDSUk6CisgICAgY2FzZSBCVF9OTVNUUlQ6CisjaWZkZWYgWE1MX05TCisgICAgY2FzZSBCVF9DT0xPTjoKKyNlbmRpZgorICAgIGNhc2UgQlRfSEVYOgorICAgIGNhc2UgQlRfRElHSVQ6CisgICAgY2FzZSBCVF9OQU1FOgorICAgIGNhc2UgQlRfTUlOVVM6CisgICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIChpbnQpKHB0ciAtIHN0YXJ0KTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBQVFJGQVNUQ0FMTAorUFJFRklYKHNraXBTKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIpCit7CisgIGZvciAoOzspIHsKKyAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgICBjYXNlIEJUX0xGOgorICAgIGNhc2UgQlRfQ1I6CisgICAgY2FzZSBCVF9TOgorICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBwdHI7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFBUUkNBTEwKK1BSRUZJWCh1cGRhdGVQb3NpdGlvbikoY29uc3QgRU5DT0RJTkcgKmVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgICAgIFBPU0lUSU9OICpwb3MpCit7CisgIHdoaWxlIChwdHIgIT0gZW5kKSB7CisgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisjZGVmaW5lIExFQURfQ0FTRShuKSBcCisgICAgY2FzZSBCVF9MRUFEICMjIG46IFwKKyAgICAgIHB0ciArPSBuOyBcCisgICAgICBicmVhazsKKyAgICBMRUFEX0NBU0UoMikgTEVBRF9DQVNFKDMpIExFQURfQ0FTRSg0KQorI3VuZGVmIExFQURfQ0FTRQorICAgIGNhc2UgQlRfTEY6CisgICAgICBwb3MtPmNvbHVtbk51bWJlciA9IChYTUxfU2l6ZSktMTsKKyAgICAgIHBvcy0+bGluZU51bWJlcisrOworICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVF9DUjoKKyAgICAgIHBvcy0+bGluZU51bWJlcisrOworICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgaWYgKHB0ciAhPSBlbmQgJiYgQllURV9UWVBFKGVuYywgcHRyKSA9PSBCVF9MRikKKyAgICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgcG9zLT5jb2x1bW5OdW1iZXIgPSAoWE1MX1NpemUpLTE7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIHBvcy0+Y29sdW1uTnVtYmVyKys7CisgIH0KK30KKworI3VuZGVmIERPX0xFQURfQ0FTRQorI3VuZGVmIE1VTFRJQllURV9DQVNFUworI3VuZGVmIElOVkFMSURfQ0FTRVMKKyN1bmRlZiBDSEVDS19OQU1FX0NBU0UKKyN1bmRlZiBDSEVDS19OQU1FX0NBU0VTCisjdW5kZWYgQ0hFQ0tfTk1TVFJUX0NBU0UKKyN1bmRlZiBDSEVDS19OTVNUUlRfQ0FTRVMKKworI2VuZGlmIC8qIFhNTF9UT0tfSU1QTF9DICovCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9saWIveG1sdG9rX2ltcGwuaCBiL2V4cGF0LTIuMC4xL2xpYi94bWx0b2tfaW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMGVhNjAKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9saWIveG1sdG9rX2ltcGwuaApAQCAtMCwwICsxLDQ2IEBACisvKgorQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5IFRoYWkgT3BlbiBTb3VyY2UgU29mdHdhcmUgQ2VudGVyIEx0ZAorU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIGNvcHlpbmcgcGVybWlzc2lvbi4KKyovCisKK2VudW0geworICBCVF9OT05YTUwsCisgIEJUX01BTEZPUk0sCisgIEJUX0xULAorICBCVF9BTVAsCisgIEJUX1JTUUIsCisgIEJUX0xFQUQyLAorICBCVF9MRUFEMywKKyAgQlRfTEVBRDQsCisgIEJUX1RSQUlMLAorICBCVF9DUiwKKyAgQlRfTEYsCisgIEJUX0dULAorICBCVF9RVU9ULAorICBCVF9BUE9TLAorICBCVF9FUVVBTFMsCisgIEJUX1FVRVNULAorICBCVF9FWENMLAorICBCVF9TT0wsCisgIEJUX1NFTUksCisgIEJUX05VTSwKKyAgQlRfTFNRQiwKKyAgQlRfUywKKyAgQlRfTk1TVFJULAorICBCVF9DT0xPTiwKKyAgQlRfSEVYLAorICBCVF9ESUdJVCwKKyAgQlRfTkFNRSwKKyAgQlRfTUlOVVMsCisgIEJUX09USEVSLCAvKiBrbm93biBub3QgdG8gYmUgYSBuYW1lIG9yIG5hbWUgc3RhcnQgY2hhcmFjdGVyICovCisgIEJUX05PTkFTQ0lJLCAvKiBtaWdodCBiZSBhIG5hbWUgb3IgbmFtZSBzdGFydCBjaGFyYWN0ZXIgKi8KKyAgQlRfUEVSQ05ULAorICBCVF9MUEFSLAorICBCVF9SUEFSLAorICBCVF9BU1QsCisgIEJUX1BMVVMsCisgIEJUX0NPTU1BLAorICBCVF9WRVJCQVIKK307CisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2xpYi94bWx0b2tfbnMuYyBiL2V4cGF0LTIuMC4xL2xpYi94bWx0b2tfbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2I4OGZkCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvbGliL3htbHRva19ucy5jCkBAIC0wLDAgKzEsMTE1IEBACisvKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgVGhhaSBPcGVuIFNvdXJjZSBTb2Z0d2FyZSBDZW50ZXIgTHRkCisgICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgY29weWluZyBwZXJtaXNzaW9uLgorKi8KKworLyogVGhpcyBmaWxlIGlzIGluY2x1ZGVkISAqLworI2lmZGVmIFhNTF9UT0tfTlNfQworCitjb25zdCBFTkNPRElORyAqCitOUyhYbWxHZXRVdGY4SW50ZXJuYWxFbmNvZGluZykodm9pZCkKK3sKKyAgcmV0dXJuICZucyhpbnRlcm5hbF91dGY4X2VuY29kaW5nKS5lbmM7Cit9CisKK2NvbnN0IEVOQ09ESU5HICoKK05TKFhtbEdldFV0ZjE2SW50ZXJuYWxFbmNvZGluZykodm9pZCkKK3sKKyNpZiBCWVRFT1JERVIgPT0gMTIzNAorICByZXR1cm4gJm5zKGludGVybmFsX2xpdHRsZTJfZW5jb2RpbmcpLmVuYzsKKyNlbGlmIEJZVEVPUkRFUiA9PSA0MzIxCisgIHJldHVybiAmbnMoaW50ZXJuYWxfYmlnMl9lbmNvZGluZykuZW5jOworI2Vsc2UKKyAgY29uc3Qgc2hvcnQgbiA9IDE7CisgIHJldHVybiAoKihjb25zdCBjaGFyICopJm4KKyAgICAgICAgICA/ICZucyhpbnRlcm5hbF9saXR0bGUyX2VuY29kaW5nKS5lbmMKKyAgICAgICAgICA6ICZucyhpbnRlcm5hbF9iaWcyX2VuY29kaW5nKS5lbmMpOworI2VuZGlmCit9CisKK3N0YXRpYyBjb25zdCBFTkNPRElORyAqIGNvbnN0IE5TKGVuY29kaW5ncylbXSA9IHsKKyAgJm5zKGxhdGluMV9lbmNvZGluZykuZW5jLAorICAmbnMoYXNjaWlfZW5jb2RpbmcpLmVuYywKKyAgJm5zKHV0ZjhfZW5jb2RpbmcpLmVuYywKKyAgJm5zKGJpZzJfZW5jb2RpbmcpLmVuYywKKyAgJm5zKGJpZzJfZW5jb2RpbmcpLmVuYywKKyAgJm5zKGxpdHRsZTJfZW5jb2RpbmcpLmVuYywKKyAgJm5zKHV0ZjhfZW5jb2RpbmcpLmVuYyAvKiBOT19FTkMgKi8KK307CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorTlMoaW5pdFNjYW5Qcm9sb2cpKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipuZXh0VG9rUHRyKQoreworICByZXR1cm4gaW5pdFNjYW4oTlMoZW5jb2RpbmdzKSwgKGNvbnN0IElOSVRfRU5DT0RJTkcgKillbmMsCisgICAgICAgICAgICAgICAgICBYTUxfUFJPTE9HX1NUQVRFLCBwdHIsIGVuZCwgbmV4dFRva1B0cik7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorTlMoaW5pdFNjYW5Db250ZW50KShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKm5leHRUb2tQdHIpCit7CisgIHJldHVybiBpbml0U2NhbihOUyhlbmNvZGluZ3MpLCAoY29uc3QgSU5JVF9FTkNPRElORyAqKWVuYywKKyAgICAgICAgICAgICAgICAgIFhNTF9DT05URU5UX1NUQVRFLCBwdHIsIGVuZCwgbmV4dFRva1B0cik7Cit9CisKK2ludAorTlMoWG1sSW5pdEVuY29kaW5nKShJTklUX0VOQ09ESU5HICpwLCBjb25zdCBFTkNPRElORyAqKmVuY1B0ciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgaW50IGkgPSBnZXRFbmNvZGluZ0luZGV4KG5hbWUpOworICBpZiAoaSA9PSBVTktOT1dOX0VOQykKKyAgICByZXR1cm4gMDsKKyAgU0VUX0lOSVRfRU5DX0lOREVYKHAsIGkpOworICBwLT5pbml0RW5jLnNjYW5uZXJzW1hNTF9QUk9MT0dfU1RBVEVdID0gTlMoaW5pdFNjYW5Qcm9sb2cpOworICBwLT5pbml0RW5jLnNjYW5uZXJzW1hNTF9DT05URU5UX1NUQVRFXSA9IE5TKGluaXRTY2FuQ29udGVudCk7CisgIHAtPmluaXRFbmMudXBkYXRlUG9zaXRpb24gPSBpbml0VXBkYXRlUG9zaXRpb247CisgIHAtPmVuY1B0ciA9IGVuY1B0cjsKKyAgKmVuY1B0ciA9ICYocC0+aW5pdEVuYyk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgY29uc3QgRU5DT0RJTkcgKgorTlMoZmluZEVuY29kaW5nKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsIGNvbnN0IGNoYXIgKmVuZCkKK3sKKyNkZWZpbmUgRU5DT0RJTkdfTUFYIDEyOAorICBjaGFyIGJ1ZltFTkNPRElOR19NQVhdOworICBjaGFyICpwID0gYnVmOworICBpbnQgaTsKKyAgWG1sVXRmOENvbnZlcnQoZW5jLCAmcHRyLCBlbmQsICZwLCBwICsgRU5DT0RJTkdfTUFYIC0gMSk7CisgIGlmIChwdHIgIT0gZW5kKQorICAgIHJldHVybiAwOworICAqcCA9IDA7CisgIGlmIChzdHJlcWNpKGJ1ZiwgS1dfVVRGXzE2KSAmJiBlbmMtPm1pbkJ5dGVzUGVyQ2hhciA9PSAyKQorICAgIHJldHVybiBlbmM7CisgIGkgPSBnZXRFbmNvZGluZ0luZGV4KGJ1Zik7CisgIGlmIChpID09IFVOS05PV05fRU5DKQorICAgIHJldHVybiAwOworICByZXR1cm4gTlMoZW5jb2RpbmdzKVtpXTsKK30KKworaW50CitOUyhYbWxQYXJzZVhtbERlY2wpKGludCBpc0dlbmVyYWxUZXh0RW50aXR5LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmJhZFB0ciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKnZlcnNpb25QdHIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKip2ZXJzaW9uRW5kUHRyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqZW5jb2RpbmdOYW1lLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBFTkNPRElORyAqKmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICBpbnQgKnN0YW5kYWxvbmUpCit7CisgIHJldHVybiBkb1BhcnNlWG1sRGVjbChOUyhmaW5kRW5jb2RpbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNHZW5lcmFsVGV4dEVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhZFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25QdHIsCisgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uRW5kUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFsb25lKTsKK30KKworI2VuZGlmIC8qIFhNTF9UT0tfTlNfQyAqLwpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvdGVzdHMvUkVBRE1FLnR4dCBiL2V4cGF0LTIuMC4xL3Rlc3RzL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNhNDdjMwotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL3Rlc3RzL1JFQURNRS50eHQKQEAgLTAsMCArMSwxNCBAQAorVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIChmbGVkZ2xpbmcpIHRlc3Qgc3VpdGUgZm9yIEV4cGF0LiAgVGhlCit0ZXN0cyBwcm92aWRlIGdlbmVyYWwgdW5pdCB0ZXN0aW5nIGFuZCByZWdyZXNzaW9uIGNvdmVyYWdlLiAgVGhlIHRlc3RzCithcmUgbm90IGV4cGVjdGVkIHRvIGJlIHVzZWZ1bCBleGFtcGxlcyBvZiBFeHBhdCB1c2FnZTsgc2VlIHRoZQorZXhhbXBsZXMvIGRpcmVjdG9yeSBmb3IgdGhhdC4KKworVGhlIEV4cGF0IHRlc3RzIHVzZSBhIHBhcnRpYWwgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlICJDaGVjayIKK3VuaXQgdGVzdGluZyBmcmFtZXdvcmsgZm9yIEMuIE1vcmUgaW5mb3JtYXRpb24gb24gQ2hlY2sgY2FuIGJlIGZvdW5kIGF0OgorCisgICAgICAgIGh0dHA6Ly9jaGVjay5zb3VyY2Vmb3JnZS5uZXQvCisKK0V4cGF0IG11c3QgYmUgYnVpbHQgYW5kIGluc3RhbGxlZCBiZWZvcmUgIm1ha2UgY2hlY2siIGNhbiBiZSBleGVjdXRlZC4KKworU2luY2UgYm90aCBDaGVjayBhbmQgdGhpcyB0ZXN0IHN1aXRlIGFyZSB5b3VuZywgaXQgY2FuIGFsbCBjaGFuZ2UgaW4gYQorbGF0ZXIgdmVyc2lvbi4KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL3Rlc3RzL2JlbmNobWFyay9SRUFETUUudHh0IGIvZXhwYXQtMi4wLjEvdGVzdHMvYmVuY2htYXJrL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y5Y2NhMAotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL3Rlc3RzL2JlbmNobWFyay9SRUFETUUudHh0CkBAIC0wLDAgKzEsMTYgQEAKK1VzZSB0aGlzIGJlbmNobWFyayBjb21tYW5kIGxpbmUgdXRpbGl0eSBhcyBmb2xsb3dzOgorCisgIGJlbmNobWFyayBbLW5dIDxmaWxlIG5hbWU+IDxidWZmZXIgc2l6ZT4gPCMgaXRlcmF0aW9ucz4KKworVGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYXJlOgorCisgIC1uICAgICAgICAgICAgIC4uLiBvcHRpb25hbDsgaWYgc3VwcGxpZWQsIG5hbWVzcGFjZSBwcm9jZXNzaW5nIGlzIHR1cm5lZCBvbgorICA8ZmlsZSBuYW1lPiAgICAuLi4gbmFtZS9wYXRoIG9mIHRlc3QgeG1sIGZpbGUKKyAgPGJ1ZmZlciBzaXplPiAgLi4uIHNpemUgb2YgcHJvY2Vzc2luZyBidWZmZXI7CisgICAgICAgICAgICAgICAgICAgICB0aGUgZmlsZSBpcyBwYXJzZWQgaW4gY2h1bmtzIG9mIHRoaXMgc2l6ZQorICA8IyBpdGVyYXRpb25zPiAuLi4gaG93IG9mdGVuIHdpbGwgdGhlIGZpbGUgYmUgcGFyc2VkCisKK1JldHVybnM6CisKKyAgVGhlIHRpbWUgKGluIHNlY29uZHMpIGl0IHRha2VzIHRvIHBhcnNlIHRoZSB0ZXN0IGZpbGUsCisgIGF2ZXJhZ2VkIG92ZXIgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL3Rlc3RzL2JlbmNobWFyay9iZW5jaG1hcmsuYyBiL2V4cGF0LTIuMC4xL3Rlc3RzL2JlbmNobWFyay9iZW5jaG1hcmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjBmZDE4Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvdGVzdHMvYmVuY2htYXJrL2JlbmNobWFyay5jCkBAIC0wLDAgKzEsMTE0IEBACisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlICJleHBhdC5oIgorCisjaWYgZGVmaW5lZChfX2FtaWdhb3NfXykgJiYgZGVmaW5lZChfX1VTRV9JTkxJTkVfXykKKyNpbmNsdWRlIDxwcm90by9leHBhdC5oPgorI2VuZGlmCisKKyNpZmRlZiBYTUxfTEFSR0VfU0laRQorI2RlZmluZSBYTUxfRk1UX0lOVF9NT0QgImxsIgorI2Vsc2UKKyNkZWZpbmUgWE1MX0ZNVF9JTlRfTU9EICJsIgorI2VuZGlmCisKK3N0YXRpYyB2b2lkCit1c2FnZShjb25zdCBjaGFyICpwcm9nLCBpbnQgcmMpCit7CisgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICJ1c2FnZTogJXMgWy1uXSBmaWxlbmFtZSBidWZmZXJTaXplIG5yX29mX2xvb3BzXG4iLCBwcm9nKTsKKyAgZXhpdChyYyk7Cit9CisKK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKSAKK3sKKyAgWE1MX1BhcnNlciAgcGFyc2VyOworICBjaGFyICAgICAgICAqWE1MQnVmLCAqWE1MQnVmRW5kLCAqWE1MQnVmUHRyOworICBGSUxFICAgICAgICAqZmQ7CisgIHN0cnVjdCBzdGF0IGZpbGVBdHRyOworICBpbnQgICAgICAgICBuck9mTG9vcHMsIGJ1ZmZlclNpemUsIGZpbGVTaXplLCBpLCBpc0ZpbmFsOworICBpbnQgICAgICAgICBqID0gMCwgbnMgPSAwOworICBjbG9ja190ICAgICB0c3RhcnQsIHRlbmQ7CisgIGRvdWJsZSAgICAgIGNwdVRpbWUgPSAwLjA7CisKKyAgaWYgKGFyZ2MgPiAxKSB7CisgICAgaWYgKGFyZ3ZbMV1bMF0gPT0gJy0nKSB7CisgICAgICBpZiAoYXJndlsxXVsxXSA9PSAnbicgJiYgYXJndlsxXVsyXSA9PSAnXDAnKSB7CisgICAgICAgIG5zID0gMTsKKyAgICAgICAgaiA9IDE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHVzYWdlKGFyZ3ZbMF0sIDEpOworICAgIH0KKyAgfQorCisgIGlmIChhcmdjICE9IGogKyA0KQorICAgIHVzYWdlKGFyZ3ZbMF0sIDEpOworCisgIGlmIChzdGF0IChhcmd2W2ogKyAxXSwgJmZpbGVBdHRyKSAhPSAwKSB7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiY291bGQgbm90IGFjY2VzcyBmaWxlICclcydcbiIsIGFyZ3ZbaiArIDFdKTsKKyAgICByZXR1cm4gMjsKKyAgfQorICAKKyAgZmQgPSBmb3BlbiAoYXJndltqICsgMV0sICJyIik7CisgIGlmICghZmQpIHsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJjb3VsZCBub3Qgb3BlbiBmaWxlICclcydcbiIsIGFyZ3ZbaiArIDFdKTsKKyAgICBleGl0KDIpOworICB9CisgIAorICBidWZmZXJTaXplID0gYXRvaSAoYXJndltqICsgMl0pOworICBuck9mTG9vcHMgPSBhdG9pIChhcmd2W2ogKyAzXSk7CisgIGlmIChidWZmZXJTaXplIDw9IDAgfHwgbnJPZkxvb3BzIDw9IDApIHsKKyAgICBmcHJpbnRmIChzdGRlcnIsIAorICAgICAgICAgICAgICJidWZmZXIgc2l6ZSBhbmQgbnIgb2YgbG9vcHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby5cbiIpOworICAgIGV4aXQoMyk7CisgIH0KKworICBYTUxCdWYgPSBtYWxsb2MgKGZpbGVBdHRyLnN0X3NpemUpOworICBmaWxlU2l6ZSA9IGZyZWFkIChYTUxCdWYsIHNpemVvZiAoY2hhciksIGZpbGVBdHRyLnN0X3NpemUsIGZkKTsKKyAgZmNsb3NlIChmZCk7CisgIAorICBpZiAobnMpCisgICAgcGFyc2VyID0gWE1MX1BhcnNlckNyZWF0ZU5TKE5VTEwsICchJyk7CisgIGVsc2UKKyAgICBwYXJzZXIgPSBYTUxfUGFyc2VyQ3JlYXRlKE5VTEwpOworCisgIGkgPSAwOworICBYTUxCdWZFbmQgPSBYTUxCdWYgKyBmaWxlU2l6ZTsKKyAgd2hpbGUgKGkgPCBuck9mTG9vcHMpIHsKKyAgICBYTUxCdWZQdHIgPSBYTUxCdWY7CisgICAgaXNGaW5hbCA9IDA7CisgICAgdHN0YXJ0ID0gY2xvY2soKTsKKyAgICBkbyB7CisgICAgICBpbnQgcGFyc2VCdWZmZXJTaXplID0gWE1MQnVmRW5kIC0gWE1MQnVmUHRyOworICAgICAgaWYgKHBhcnNlQnVmZmVyU2l6ZSA8PSBidWZmZXJTaXplKQorICAgICAgICBpc0ZpbmFsID0gMTsKKyAgICAgIGVsc2UKKyAgICAgICAgcGFyc2VCdWZmZXJTaXplID0gYnVmZmVyU2l6ZTsKKyAgICAgIGlmICghWE1MX1BhcnNlIChwYXJzZXIsIFhNTEJ1ZlB0ciwgcGFyc2VCdWZmZXJTaXplLCBpc0ZpbmFsKSkgeworICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJlcnJvciAnJXMnIGF0IGxpbmUgJSIgWE1MX0ZNVF9JTlRfTU9EIFwKKyAgICAgICAgICAgICAgICAgICAgICJ1IGNoYXJhY3RlciAlIiBYTUxfRk1UX0lOVF9NT0QgInVcbiIsCisgICAgICAgICAgICAgICAgIFhNTF9FcnJvclN0cmluZyAoWE1MX0dldEVycm9yQ29kZSAocGFyc2VyKSksCisgICAgICAgICAgICAgICAgIFhNTF9HZXRDdXJyZW50TGluZU51bWJlciAocGFyc2VyKSwKKyAgICAgICAgICAgICAgICAgWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIgKHBhcnNlcikpOworICAgICAgICBmcmVlIChYTUxCdWYpOworICAgICAgICBYTUxfUGFyc2VyRnJlZSAocGFyc2VyKTsKKyAgICAgICAgZXhpdCAoNCk7CisgICAgICB9CisgICAgICBYTUxCdWZQdHIgKz0gYnVmZmVyU2l6ZTsKKyAgICB9IHdoaWxlICghaXNGaW5hbCk7CisgICAgdGVuZCA9IGNsb2NrKCk7CisgICAgY3B1VGltZSArPSAoKGRvdWJsZSkgKHRlbmQgLSB0c3RhcnQpKSAvIENMT0NLU19QRVJfU0VDOworICAgIFhNTF9QYXJzZXJSZXNldChwYXJzZXIsIE5VTEwpOworICAgIGkrKzsKKyAgfQorCisgIFhNTF9QYXJzZXJGcmVlIChwYXJzZXIpOworICBmcmVlIChYTUxCdWYpOworICAgICAgCisgIHByaW50ZiAoIiVkIGxvb3BzLCB3aXRoIGJ1ZmZlciBzaXplICVkLiBBdmVyYWdlIHRpbWUgcGVyIGxvb3A6ICVmXG4iLCAKKyAgICAgICAgICBuck9mTG9vcHMsIGJ1ZmZlclNpemUsIGNwdVRpbWUgLyAoZG91YmxlKSBuck9mTG9vcHMpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL3Rlc3RzL2JlbmNobWFyay9iZW5jaG1hcmsuZHNwIGIvZXhwYXQtMi4wLjEvdGVzdHMvYmVuY2htYXJrL2JlbmNobWFyay5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUzZjI0MAotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL3Rlc3RzL2JlbmNobWFyay9iZW5jaG1hcmsuZHNwCkBAIC0wLDAgKzEsODggQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iYmVuY2htYXJrIiAtIFBhY2thZ2UgT3duZXI9PDQ+CisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwCisjICoqIERPIE5PVCBFRElUICoqCisKKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMworCitDRkc9YmVuY2htYXJrIC0gV2luMzIgRGVidWcKKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAiYmVuY2htYXJrLm1hayIuCishTUVTU0FHRSAKKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAiYmVuY2htYXJrLm1hayIgQ0ZHPSJiZW5jaG1hcmsgLSBXaW4zMiBEZWJ1ZyIKKyFNRVNTQUdFIAorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6CishTUVTU0FHRSAKKyFNRVNTQUdFICJiZW5jaG1hcmsgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgImJlbmNobWFyayAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgCisKKyMgQmVnaW4gUHJvamVjdAorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDAKKyMgUFJPUCBTY2NfUHJvak5hbWUgIiIKKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCitDUFA9Y2wuZXhlCitSU0M9cmMuZXhlCisKKyFJRiAgIiQoQ0ZHKSIgPT0gImJlbmNobWFyayAtIFdpbjMyIFJlbGVhc2UiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCisjIFBST1AgVGFyZ2V0X0RpciAiIgorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvSSAiLi5cLi5cbGliIiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jCisjIEFERCBCQVNFIFJTQyAvbCAweDEwMDkgL2QgIk5ERUJVRyIKKyMgQUREIFJTQyAvbCAweDEwMDkgL2QgIk5ERUJVRyIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImJlbmNobWFyayAtIFdpbjMyIERlYnVnIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvR1ogL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0kgIi4uXC4uXGxpYiIgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvR1ogL2MKKyMgQUREIEJBU0UgUlNDIC9sIDB4MTAwOSAvZCAiX0RFQlVHIgorIyBBREQgUlNDIC9sIDB4MTAwOSAvZCAiX0RFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0CisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAorCishRU5ESUYgCisKKyMgQmVnaW4gVGFyZ2V0CisKKyMgTmFtZSAiYmVuY2htYXJrIC0gV2luMzIgUmVsZWFzZSIKKyMgTmFtZSAiYmVuY2htYXJrIC0gV2luMzIgRGVidWciCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGJlbmNobWFyay5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBFbmQgVGFyZ2V0CisjIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS90ZXN0cy9iZW5jaG1hcmsvYmVuY2htYXJrLmRzdyBiL2V4cGF0LTIuMC4xL3Rlc3RzL2JlbmNobWFyay9iZW5jaG1hcmsuZHN3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiODUwNGMKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS90ZXN0cy9iZW5jaG1hcmsvYmVuY2htYXJrLmRzdwpAQCAtMCwwICsxLDQ0IEBACitNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBXb3Jrc3BhY2UgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAorIyBXQVJOSU5HOiBETyBOT1QgRURJVCBPUiBERUxFVEUgVEhJUyBXT1JLU1BBQ0UgRklMRSEKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitQcm9qZWN0OiAiYmVuY2htYXJrIj0uXGJlbmNobWFyay5kc3AgLSBQYWNrYWdlIE93bmVyPTw0PgorCitQYWNrYWdlPTw1Pgore3t7Cit9fX0KKworUGFja2FnZT08ND4KK3t7eworICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQorICAgIFByb2plY3RfRGVwX05hbWUgZXhwYXQKKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5Cit9fX0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitQcm9qZWN0OiAiZXhwYXQiPS4uXC4uXGxpYlxleHBhdC5kc3AgLSBQYWNrYWdlIE93bmVyPTw0PgorCitQYWNrYWdlPTw1Pgore3t7Cit9fX0KKworUGFja2FnZT08ND4KK3t7eworfX19CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworR2xvYmFsOgorCitQYWNrYWdlPTw1Pgore3t7Cit9fX0KKworUGFja2FnZT08Mz4KK3t7eworfX19CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvdGVzdHMvY2hhcmRhdGEuYyBiL2V4cGF0LTIuMC4xL3Rlc3RzL2NoYXJkYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZiMDI5OQotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL3Rlc3RzL2NoYXJkYXRhLmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIFRoYWkgT3BlbiBTb3VyY2UgU29mdHdhcmUgQ2VudGVyIEx0ZAorICAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIGNvcHlpbmcgcGVybWlzc2lvbi4KKworICAgY2hhcmRhdGEuYworKi8KKworI2lmZGVmIEhBVkVfRVhQQVRfQ09ORklHX0gKKyNpbmNsdWRlIDxleHBhdF9jb25maWcuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfQ0hFQ0tfSAorI2luY2x1ZGUgPGNoZWNrLmg+CisjZWxzZQorI2luY2x1ZGUgIm1pbmljaGVjay5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiY2hhcmRhdGEuaCIKKworCitzdGF0aWMgaW50Cit4bWxzdHJsZW4oY29uc3QgWE1MX0NoYXIgKnMpCit7CisgICAgaW50IGxlbiA9IDA7CisgICAgYXNzZXJ0KHMgIT0gTlVMTCk7CisgICAgd2hpbGUgKHNbbGVuXSAhPSAwKQorICAgICAgICArK2xlbjsKKyAgICByZXR1cm4gbGVuOworfQorCisKK3ZvaWQKK0NoYXJEYXRhX0luaXQoQ2hhckRhdGEgKnN0b3JhZ2UpCit7CisgICAgYXNzZXJ0KHN0b3JhZ2UgIT0gTlVMTCk7CisgICAgc3RvcmFnZS0+Y291bnQgPSAtMTsKK30KKwordm9pZAorQ2hhckRhdGFfQXBwZW5kU3RyaW5nKENoYXJEYXRhICpzdG9yYWdlLCBjb25zdCBjaGFyICpzKQoreworICAgIGludCBtYXhjaGFycyA9IHNpemVvZihzdG9yYWdlLT5kYXRhKSAvIHNpemVvZihzdG9yYWdlLT5kYXRhWzBdKTsKKyAgICBpbnQgbGVuOworCisgICAgYXNzZXJ0KHMgIT0gTlVMTCk7CisgICAgbGVuID0gc3RybGVuKHMpOworICAgIGlmIChzdG9yYWdlLT5jb3VudCA8IDApCisgICAgICAgIHN0b3JhZ2UtPmNvdW50ID0gMDsKKyAgICBpZiAoKGxlbiArIHN0b3JhZ2UtPmNvdW50KSA+IG1heGNoYXJzKSB7CisgICAgICAgIGxlbiA9IChtYXhjaGFycyAtIHN0b3JhZ2UtPmNvdW50KTsKKyAgICB9CisgICAgaWYgKGxlbiArIHN0b3JhZ2UtPmNvdW50IDwgc2l6ZW9mKHN0b3JhZ2UtPmRhdGEpKSB7CisgICAgICAgIG1lbWNweShzdG9yYWdlLT5kYXRhICsgc3RvcmFnZS0+Y291bnQsIHMsIGxlbik7CisgICAgICAgIHN0b3JhZ2UtPmNvdW50ICs9IGxlbjsKKyAgICB9Cit9CisKK3ZvaWQKK0NoYXJEYXRhX0FwcGVuZFhNTENoYXJzKENoYXJEYXRhICpzdG9yYWdlLCBjb25zdCBYTUxfQ2hhciAqcywgaW50IGxlbikKK3sKKyAgICBpbnQgbWF4Y2hhcnM7CisKKyAgICBhc3NlcnQoc3RvcmFnZSAhPSBOVUxMKTsKKyAgICBhc3NlcnQocyAhPSBOVUxMKTsKKyAgICBtYXhjaGFycyA9IHNpemVvZihzdG9yYWdlLT5kYXRhKSAvIHNpemVvZihzdG9yYWdlLT5kYXRhWzBdKTsKKyAgICBpZiAoc3RvcmFnZS0+Y291bnQgPCAwKQorICAgICAgICBzdG9yYWdlLT5jb3VudCA9IDA7CisgICAgaWYgKGxlbiA8IDApCisgICAgICAgIGxlbiA9IHhtbHN0cmxlbihzKTsKKyAgICBpZiAoKGxlbiArIHN0b3JhZ2UtPmNvdW50KSA+IG1heGNoYXJzKSB7CisgICAgICAgIGxlbiA9IChtYXhjaGFycyAtIHN0b3JhZ2UtPmNvdW50KTsKKyAgICB9CisgICAgaWYgKGxlbiArIHN0b3JhZ2UtPmNvdW50IDwgc2l6ZW9mKHN0b3JhZ2UtPmRhdGEpKSB7CisgICAgICAgIG1lbWNweShzdG9yYWdlLT5kYXRhICsgc3RvcmFnZS0+Y291bnQsIHMsCisgICAgICAgICAgICAgICBsZW4gKiBzaXplb2Yoc3RvcmFnZS0+ZGF0YVswXSkpOworICAgICAgICBzdG9yYWdlLT5jb3VudCArPSBsZW47CisgICAgfQorfQorCitpbnQKK0NoYXJEYXRhX0NoZWNrU3RyaW5nKENoYXJEYXRhICpzdG9yYWdlLCBjb25zdCBjaGFyICpleHBlY3RlZCkKK3sKKyAgICBjaGFyIGJ1ZmZlclsxMjgwXTsKKyAgICBpbnQgbGVuOworICAgIGludCBjb3VudDsKKworICAgIGFzc2VydChzdG9yYWdlICE9IE5VTEwpOworICAgIGFzc2VydChleHBlY3RlZCAhPSBOVUxMKTsKKyAgICBjb3VudCA9IChzdG9yYWdlLT5jb3VudCA8IDApID8gMCA6IHN0b3JhZ2UtPmNvdW50OworICAgIGxlbiA9IHN0cmxlbihleHBlY3RlZCk7CisgICAgaWYgKGxlbiAhPSBjb3VudCkgeworICAgICAgICBpZiAoc2l6ZW9mKFhNTF9DaGFyKSA9PSAxKQorICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICJ3cm9uZyBudW1iZXIgb2YgZGF0YSBjaGFyYWN0ZXJzOiIKKyAgICAgICAgICAgICAgICAgICAgIiBnb3QgJWQsIGV4cGVjdGVkICVkOlxuJXMiLCBjb3VudCwgbGVuLCBzdG9yYWdlLT5kYXRhKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICJ3cm9uZyBudW1iZXIgb2YgZGF0YSBjaGFyYWN0ZXJzOiBnb3QgJWQsIGV4cGVjdGVkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgY291bnQsIGxlbik7CisgICAgICAgIGZhaWwoYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChtZW1jbXAoZXhwZWN0ZWQsIHN0b3JhZ2UtPmRhdGEsIGxlbikgIT0gMCkgeworICAgICAgICBmYWlsKCJnb3QgYmFkIGRhdGEgYnl0ZXMiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworfQorCitpbnQKK0NoYXJEYXRhX0NoZWNrWE1MQ2hhcnMoQ2hhckRhdGEgKnN0b3JhZ2UsIGNvbnN0IFhNTF9DaGFyICpleHBlY3RlZCkKK3sKKyAgICBjaGFyIGJ1ZmZlclsxMDI0XTsKKyAgICBpbnQgbGVuID0geG1sc3RybGVuKGV4cGVjdGVkKTsKKyAgICBpbnQgY291bnQ7CisKKyAgICBhc3NlcnQoc3RvcmFnZSAhPSBOVUxMKTsKKyAgICBjb3VudCA9IChzdG9yYWdlLT5jb3VudCA8IDApID8gMCA6IHN0b3JhZ2UtPmNvdW50OworICAgIGlmIChsZW4gIT0gY291bnQpIHsKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICJ3cm9uZyBudW1iZXIgb2YgZGF0YSBjaGFyYWN0ZXJzOiBnb3QgJWQsIGV4cGVjdGVkICVkIiwKKyAgICAgICAgICAgICAgICBjb3VudCwgbGVuKTsKKyAgICAgICAgZmFpbChidWZmZXIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKG1lbWNtcChleHBlY3RlZCwgc3RvcmFnZS0+ZGF0YSwgbGVuICogc2l6ZW9mKHN0b3JhZ2UtPmRhdGFbMF0pKSAhPSAwKSB7CisgICAgICAgIGZhaWwoImdvdCBiYWQgZGF0YSBieXRlcyIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS90ZXN0cy9jaGFyZGF0YS5oIGIvZXhwYXQtMi4wLjEvdGVzdHMvY2hhcmRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGRjNGNlCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvdGVzdHMvY2hhcmRhdGEuaApAQCAtMCwwICsxLDQwIEBACisvKiBjaGFyZGF0YS5oCisKKyAgIEludGVyZmFjZSB0byBzb21lIGhlbHBlciByb3V0aW5lcyB1c2VkIHRvIGFjY3VtdWxhdGUgYW5kIGNoZWNrIHRleHQKKyAgIGFuZCBhdHRyaWJ1dGUgY29udGVudC4KKyovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmbmRlZiBYTUxfQ0hBUkRBVEFfSAorI2RlZmluZSBYTUxfQ0hBUkRBVEFfSCAxCisKKyNpZm5kZWYgWE1MX1ZFUlNJT04KKyNpbmNsdWRlICJleHBhdC5oIiAgICAgICAgICAgICAgICAgICAgICAvKiBuZWVkIFhNTF9DaGFyICovCisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGNvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIyBvZiBjaGFycywgPCAwIGlmIG5vdCBzZXQgKi8KKyAgICBYTUxfQ2hhciBkYXRhWzEwMjRdOworfSBDaGFyRGF0YTsKKworCit2b2lkIENoYXJEYXRhX0luaXQoQ2hhckRhdGEgKnN0b3JhZ2UpOworCit2b2lkIENoYXJEYXRhX0FwcGVuZFN0cmluZyhDaGFyRGF0YSAqc3RvcmFnZSwgY29uc3QgY2hhciAqcyk7CisKK3ZvaWQgQ2hhckRhdGFfQXBwZW5kWE1MQ2hhcnMoQ2hhckRhdGEgKnN0b3JhZ2UsIGNvbnN0IFhNTF9DaGFyICpzLCBpbnQgbGVuKTsKKworaW50IENoYXJEYXRhX0NoZWNrU3RyaW5nKENoYXJEYXRhICpzdG9yYWdlLCBjb25zdCBjaGFyICpzKTsKKworaW50IENoYXJEYXRhX0NoZWNrWE1MQ2hhcnMoQ2hhckRhdGEgKnN0b3JhZ2UsIGNvbnN0IFhNTF9DaGFyICpzKTsKKworCisjZW5kaWYgIC8qIFhNTF9DSEFSREFUQV9IICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS90ZXN0cy9taW5pY2hlY2suYyBiL2V4cGF0LTIuMC4xL3Rlc3RzL21pbmljaGVjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZjQyOTUKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS90ZXN0cy9taW5pY2hlY2suYwpAQCAtMCwwICsxLDE4MiBAQAorLyogTWluaWF0dXJlIHJlLWltcGxlbWVudGF0aW9uIG9mIHRoZSAiY2hlY2siIGxpYnJhcnkuCisgKgorICogVGhpcyBpcyBpbnRlbmRlZCB0byBzdXBwb3J0IGp1c3QgZW5vdWdoIG9mIGNoZWNrIHRvIHJ1biB0aGUgRXhwYXQKKyAqIHRlc3RzLiAgVGhpcyBpbnRlcmZhY2UgaXMgYmFzZWQgZW50aXJlbHkgb24gdGhlIHBvcnRpb24gb2YgdGhlCisgKiBjaGVjayBsaWJyYXJ5IGJlaW5nIHVzZWQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJtaW5pY2hlY2suaCIKKworU3VpdGUgKgorc3VpdGVfY3JlYXRlKGNoYXIgKm5hbWUpCit7CisgICAgU3VpdGUgKnN1aXRlID0gKFN1aXRlICopIGNhbGxvYygxLCBzaXplb2YoU3VpdGUpKTsKKyAgICBpZiAoc3VpdGUgIT0gTlVMTCkgeworICAgICAgICBzdWl0ZS0+bmFtZSA9IG5hbWU7CisgICAgfQorICAgIHJldHVybiBzdWl0ZTsKK30KKworVENhc2UgKgordGNhc2VfY3JlYXRlKGNoYXIgKm5hbWUpCit7CisgICAgVENhc2UgKnRjID0gKFRDYXNlICopIGNhbGxvYygxLCBzaXplb2YoVENhc2UpKTsKKyAgICBpZiAodGMgIT0gTlVMTCkgeworICAgICAgICB0Yy0+bmFtZSA9IG5hbWU7CisgICAgfQorICAgIHJldHVybiB0YzsKK30KKwordm9pZAorc3VpdGVfYWRkX3RjYXNlKFN1aXRlICpzdWl0ZSwgVENhc2UgKnRjKSAKK3sKKyAgICBhc3NlcnQoc3VpdGUgIT0gTlVMTCk7CisgICAgYXNzZXJ0KHRjICE9IE5VTEwpOworICAgIGFzc2VydCh0Yy0+bmV4dF90Y2FzZSA9PSBOVUxMKTsKKworICAgIHRjLT5uZXh0X3RjYXNlID0gc3VpdGUtPnRlc3RzOworICAgIHN1aXRlLT50ZXN0cyA9IHRjOworfQorCit2b2lkCit0Y2FzZV9hZGRfY2hlY2tlZF9maXh0dXJlKFRDYXNlICp0YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGNhc2Vfc2V0dXBfZnVuY3Rpb24gc2V0dXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRjYXNlX3RlYXJkb3duX2Z1bmN0aW9uIHRlYXJkb3duKQoreworICAgIGFzc2VydCh0YyAhPSBOVUxMKTsKKyAgICB0Yy0+c2V0dXAgPSBzZXR1cDsKKyAgICB0Yy0+dGVhcmRvd24gPSB0ZWFyZG93bjsKK30KKwordm9pZAordGNhc2VfYWRkX3Rlc3QoVENhc2UgKnRjLCB0Y2FzZV90ZXN0X2Z1bmN0aW9uIHRlc3QpCit7CisgICAgYXNzZXJ0KHRjICE9IE5VTEwpOworICAgIGlmICh0Yy0+YWxsb2NhdGVkID09IHRjLT5udGVzdHMpIHsKKyAgICAgICAgaW50IG5hbGxvYyA9IHRjLT5hbGxvY2F0ZWQgKyAxMDA7CisgICAgICAgIHNpemVfdCBuZXdfc2l6ZSA9IHNpemVvZih0Y2FzZV90ZXN0X2Z1bmN0aW9uKSAqIG5hbGxvYzsKKyAgICAgICAgdGNhc2VfdGVzdF9mdW5jdGlvbiAqbmV3X3Rlc3RzID0gcmVhbGxvYyh0Yy0+dGVzdHMsIG5ld19zaXplKTsKKyAgICAgICAgYXNzZXJ0KG5ld190ZXN0cyAhPSBOVUxMKTsKKyAgICAgICAgaWYgKG5ld190ZXN0cyAhPSB0Yy0+dGVzdHMpIHsKKyAgICAgICAgICAgIGZyZWUodGMtPnRlc3RzKTsKKyAgICAgICAgICAgIHRjLT50ZXN0cyA9IG5ld190ZXN0czsKKyAgICAgICAgfQorICAgICAgICB0Yy0+YWxsb2NhdGVkID0gbmFsbG9jOworICAgIH0KKyAgICB0Yy0+dGVzdHNbdGMtPm50ZXN0c10gPSB0ZXN0OworICAgIHRjLT5udGVzdHMrKzsKK30KKworU1J1bm5lciAqCitzcnVubmVyX2NyZWF0ZShTdWl0ZSAqc3VpdGUpCit7CisgICAgU1J1bm5lciAqcnVubmVyID0gY2FsbG9jKDEsIHNpemVvZihTUnVubmVyKSk7CisgICAgaWYgKHJ1bm5lciAhPSBOVUxMKSB7CisgICAgICAgIHJ1bm5lci0+c3VpdGUgPSBzdWl0ZTsKKyAgICB9CisgICAgcmV0dXJuIHJ1bm5lcjsKK30KKworc3RhdGljIGptcF9idWYgZW52OworCitzdGF0aWMgY2hhciBjb25zdCAqX2NoZWNrX2N1cnJlbnRfZnVuY3Rpb24gPSBOVUxMOworc3RhdGljIGludCBfY2hlY2tfY3VycmVudF9saW5lbm8gPSAtMTsKK3N0YXRpYyBjaGFyIGNvbnN0ICpfY2hlY2tfY3VycmVudF9maWxlbmFtZSA9IE5VTEw7CisKK3ZvaWQKK19jaGVja19zZXRfdGVzdF9pbmZvKGNoYXIgY29uc3QgKmZ1bmN0aW9uLCBjaGFyIGNvbnN0ICpmaWxlbmFtZSwgaW50IGxpbmVubykKK3sKKyAgICBfY2hlY2tfY3VycmVudF9mdW5jdGlvbiA9IGZ1bmN0aW9uOworICAgIF9jaGVja19jdXJyZW50X2xpbmVubyA9IGxpbmVubzsKKyAgICBfY2hlY2tfY3VycmVudF9maWxlbmFtZSA9IGZpbGVuYW1lOworfQorCisKK3N0YXRpYyB2b2lkCithZGRfZmFpbHVyZShTUnVubmVyICpydW5uZXIsIGludCB2ZXJib3NpdHkpCit7CisgICAgcnVubmVyLT5uZmFpbHVyZXMrKzsKKyAgICBpZiAodmVyYm9zaXR5ID49IENLX1ZFUkJPU0UpIHsKKyAgICAgICAgcHJpbnRmKCIlczolZDogJXNcbiIsIF9jaGVja19jdXJyZW50X2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgX2NoZWNrX2N1cnJlbnRfbGluZW5vLCBfY2hlY2tfY3VycmVudF9mdW5jdGlvbik7CisgICAgfQorfQorCit2b2lkCitzcnVubmVyX3J1bl9hbGwoU1J1bm5lciAqcnVubmVyLCBpbnQgdmVyYm9zaXR5KQoreworICAgIFN1aXRlICpzdWl0ZTsKKyAgICBUQ2FzZSAqdGM7CisgICAgYXNzZXJ0KHJ1bm5lciAhPSBOVUxMKTsKKyAgICBzdWl0ZSA9IHJ1bm5lci0+c3VpdGU7CisgICAgdGMgPSBzdWl0ZS0+dGVzdHM7CisgICAgd2hpbGUgKHRjICE9IE5VTEwpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0Yy0+bnRlc3RzOyArK2kpIHsKKyAgICAgICAgICAgIHJ1bm5lci0+bmNoZWNrcysrOworCisgICAgICAgICAgICBpZiAodGMtPnNldHVwICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvKiBzZXR1cCAqLworICAgICAgICAgICAgICAgIGlmIChzZXRqbXAoZW52KSkgeworICAgICAgICAgICAgICAgICAgICBhZGRfZmFpbHVyZShydW5uZXIsIHZlcmJvc2l0eSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0Yy0+c2V0dXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHRlc3QgKi8KKyAgICAgICAgICAgIGlmIChzZXRqbXAoZW52KSkgeworICAgICAgICAgICAgICAgIGFkZF9mYWlsdXJlKHJ1bm5lciwgdmVyYm9zaXR5KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICh0Yy0+dGVzdHNbaV0pKCk7CisKKyAgICAgICAgICAgIC8qIHRlYXJkb3duICovCisgICAgICAgICAgICBpZiAodGMtPnRlYXJkb3duICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2V0am1wKGVudikpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkX2ZhaWx1cmUocnVubmVyLCB2ZXJib3NpdHkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGMtPnRlYXJkb3duKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGMgPSB0Yy0+bmV4dF90Y2FzZTsKKyAgICB9CisgICAgaWYgKHZlcmJvc2l0eSkgeworICAgICAgICBpbnQgcGFzc2VkID0gcnVubmVyLT5uY2hlY2tzIC0gcnVubmVyLT5uZmFpbHVyZXM7CisgICAgICAgIGRvdWJsZSBwZXJjZW50YWdlID0gKChkb3VibGUpIHBhc3NlZCkgLyBydW5uZXItPm5jaGVja3M7CisgICAgICAgIGludCBkaXNwbGF5ID0gKGludCkgKHBlcmNlbnRhZ2UgKiAxMDApOworICAgICAgICBwcmludGYoIiVkJSU6IENoZWNrczogJWQsIEZhaWxlZDogJWRcbiIsCisgICAgICAgICAgICAgICBkaXNwbGF5LCBydW5uZXItPm5jaGVja3MsIHJ1bm5lci0+bmZhaWx1cmVzKTsKKyAgICB9Cit9CisKK3ZvaWQKK19mYWlsX3VubGVzcyhpbnQgY29uZGl0aW9uLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY2hhciAqbXNnKQoreworICAgIC8qIEFsd2F5cyBwcmludCB0aGUgZXJyb3IgbWVzc2FnZSBzbyBpdCBpc24ndCBsb3N0LiAgSW4gdGhpcyBjYXNlLAorICAgICAgIHdlIGhhdmUgYSBmYWlsdXJlLCBzbyB0aGVyZSdzIG5vIHJlYXNvbiB0byBiZSBxdWlldCBhYm91dCB3aGF0CisgICAgICAgaXQgaXMuCisgICAgKi8KKyAgICBpZiAobXNnICE9IE5VTEwpCisgICAgICAgIHByaW50ZigiJXMiLCBtc2cpOworICAgIGxvbmdqbXAoZW52LCAxKTsKK30KKworaW50CitzcnVubmVyX250ZXN0c19mYWlsZWQoU1J1bm5lciAqcnVubmVyKQoreworICAgIGFzc2VydChydW5uZXIgIT0gTlVMTCk7CisgICAgcmV0dXJuIHJ1bm5lci0+bmZhaWx1cmVzOworfQorCit2b2lkCitzcnVubmVyX2ZyZWUoU1J1bm5lciAqcnVubmVyKQoreworICAgIGZyZWUocnVubmVyLT5zdWl0ZSk7CisgICAgZnJlZShydW5uZXIpOworfQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvdGVzdHMvbWluaWNoZWNrLmggYi9leHBhdC0yLjAuMS90ZXN0cy9taW5pY2hlY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODQ2YmVhCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvdGVzdHMvbWluaWNoZWNrLmgKQEAgLTAsMCArMSw4OSBAQAorLyogTWluaWF0dXJlIHJlLWltcGxlbWVudGF0aW9uIG9mIHRoZSAiY2hlY2siIGxpYnJhcnkuCisgKgorICogVGhpcyBpcyBpbnRlbmRlZCB0byBzdXBwb3J0IGp1c3QgZW5vdWdoIG9mIGNoZWNrIHRvIHJ1biB0aGUgRXhwYXQKKyAqIHRlc3RzLiAgVGhpcyBpbnRlcmZhY2UgaXMgYmFzZWQgZW50aXJlbHkgb24gdGhlIHBvcnRpb24gb2YgdGhlCisgKiBjaGVjayBsaWJyYXJ5IGJlaW5nIHVzZWQuCisgKgorICogVGhpcyBpcyAqc291cmNlKiBjb21wYXRpYmxlLCBidXQgbm90IG5lY2Vzc2FyeSAqbGluayogY29tcGF0aWJsZS4KKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgQ0tfTk9GT1JLIDAKKyNkZWZpbmUgQ0tfRk9SSyAgIDEKKworI2RlZmluZSBDS19TSUxFTlQgIDAKKyNkZWZpbmUgQ0tfTk9STUFMICAxCisjZGVmaW5lIENLX1ZFUkJPU0UgMgorCisvKiBXb3JrYXJvdW5kIGZvciBUcnU2NCBVbml4IHN5c3RlbXMgd2hlcmUgdGhlIEMgY29tcGlsZXIgaGFzIGEgd29ya2luZworICAgX19mdW5jX18sIGJ1dCB0aGUgQysrIGNvbXBpbGVyIG9ubHkgaGFzIGEgd29ya2luZyBfX0ZVTkNUSU9OX18uICBUaGlzCisgICBjb3VsZCBiZSBmaXhlZCBpbiBjb25maWd1cmUuaW4sIGJ1dCBpdCdzIG5vdCB3b3J0aCBpdCByaWdodCBub3cuICovCisjaWYgZGVmaW5lZChfX29zZl9fKSAmJiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorI2RlZmluZSBfX2Z1bmNfXyBfX0ZVTkNUSU9OX18KKyNlbmRpZgorCisjZGVmaW5lIFNUQVJUX1RFU1QodGVzdG5hbWUpIHN0YXRpYyB2b2lkIHRlc3RuYW1lKHZvaWQpIHsgXAorICAgIF9jaGVja19zZXRfdGVzdF9pbmZvKF9fZnVuY19fLCBfX0ZJTEVfXywgX19MSU5FX18pOyAgIFwKKyAgICB7CisjZGVmaW5lIEVORF9URVNUIH0gfQorCisjZGVmaW5lIGZhaWwobXNnKSAgX2ZhaWxfdW5sZXNzKDAsIF9fRklMRV9fLCBfX0xJTkVfXywgbXNnKQorCit0eXBlZGVmIHZvaWQgKCp0Y2FzZV9zZXR1cF9mdW5jdGlvbikodm9pZCk7Cit0eXBlZGVmIHZvaWQgKCp0Y2FzZV90ZWFyZG93bl9mdW5jdGlvbikodm9pZCk7Cit0eXBlZGVmIHZvaWQgKCp0Y2FzZV90ZXN0X2Z1bmN0aW9uKSh2b2lkKTsKKwordHlwZWRlZiBzdHJ1Y3QgU1J1bm5lciBTUnVubmVyOwordHlwZWRlZiBzdHJ1Y3QgU3VpdGUgU3VpdGU7Cit0eXBlZGVmIHN0cnVjdCBUQ2FzZSBUQ2FzZTsKKworc3RydWN0IFNSdW5uZXIgeworICAgIFN1aXRlICpzdWl0ZTsKKyAgICBpbnQgbmNoZWNrczsKKyAgICBpbnQgbmZhaWx1cmVzOworfTsKKworc3RydWN0IFN1aXRlIHsKKyAgICBjaGFyICpuYW1lOworICAgIFRDYXNlICp0ZXN0czsKK307CisKK3N0cnVjdCBUQ2FzZSB7CisgICAgY2hhciAqbmFtZTsKKyAgICB0Y2FzZV9zZXR1cF9mdW5jdGlvbiBzZXR1cDsKKyAgICB0Y2FzZV90ZWFyZG93bl9mdW5jdGlvbiB0ZWFyZG93bjsKKyAgICB0Y2FzZV90ZXN0X2Z1bmN0aW9uICp0ZXN0czsKKyAgICBpbnQgbnRlc3RzOworICAgIGludCBhbGxvY2F0ZWQ7CisgICAgVENhc2UgKm5leHRfdGNhc2U7Cit9OworCisKKy8qIEludGVybmFsIGhlbHBlci4gKi8KK3ZvaWQgX2NoZWNrX3NldF90ZXN0X2luZm8oY2hhciBjb25zdCAqZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKmZpbGVuYW1lLCBpbnQgbGluZW5vKTsKKworCisvKgorICogUHJvdG90eXBlcyBmb3IgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbi4KKyAqLworCit2b2lkIF9mYWlsX3VubGVzcyhpbnQgY29uZGl0aW9uLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY2hhciAqbXNnKTsKK1N1aXRlICpzdWl0ZV9jcmVhdGUoY2hhciAqbmFtZSk7CitUQ2FzZSAqdGNhc2VfY3JlYXRlKGNoYXIgKm5hbWUpOwordm9pZCBzdWl0ZV9hZGRfdGNhc2UoU3VpdGUgKnN1aXRlLCBUQ2FzZSAqdGMpOwordm9pZCB0Y2FzZV9hZGRfY2hlY2tlZF9maXh0dXJlKFRDYXNlICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNhc2Vfc2V0dXBfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNhc2VfdGVhcmRvd25fZnVuY3Rpb24pOwordm9pZCB0Y2FzZV9hZGRfdGVzdChUQ2FzZSAqdGMsIHRjYXNlX3Rlc3RfZnVuY3Rpb24gdGVzdCk7CitTUnVubmVyICpzcnVubmVyX2NyZWF0ZShTdWl0ZSAqc3VpdGUpOwordm9pZCBzcnVubmVyX3J1bl9hbGwoU1J1bm5lciAqcnVubmVyLCBpbnQgdmVyYm9zaXR5KTsKK2ludCBzcnVubmVyX250ZXN0c19mYWlsZWQoU1J1bm5lciAqcnVubmVyKTsKK3ZvaWQgc3J1bm5lcl9mcmVlKFNSdW5uZXIgKnJ1bm5lcik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS90ZXN0cy9ydW50ZXN0cy5jIGIvZXhwYXQtMi4wLjEvdGVzdHMvcnVudGVzdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTIxYzA4Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvdGVzdHMvcnVudGVzdHMuYwpAQCAtMCwwICsxLDE1MTQgQEAKKy8qIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCBUaGFpIE9wZW4gU291cmNlIFNvZnR3YXJlIENlbnRlciBMdGQKKyAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBjb3B5aW5nIHBlcm1pc3Npb24uCisKKyAgIHJ1bnRlc3QuYyA6IHJ1biB0aGUgRXhwYXQgdGVzdCBzdWl0ZQorKi8KKworI2lmZGVmIEhBVkVfRVhQQVRfQ09ORklHX0gKKyNpbmNsdWRlIDxleHBhdF9jb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImV4cGF0LmgiCisjaW5jbHVkZSAiY2hhcmRhdGEuaCIKKyNpbmNsdWRlICJtaW5pY2hlY2suaCIKKworI2lmIGRlZmluZWQoX19hbWlnYW9zX18pICYmIGRlZmluZWQoX19VU0VfSU5MSU5FX18pCisjaW5jbHVkZSA8cHJvdG8vZXhwYXQuaD4KKyNlbmRpZgorCisjaWZkZWYgWE1MX0xBUkdFX1NJWkUKKyNkZWZpbmUgWE1MX0ZNVF9JTlRfTU9EICJsbCIKKyNlbHNlCisjZGVmaW5lIFhNTF9GTVRfSU5UX01PRCAibCIKKyNlbmRpZgorCitzdGF0aWMgWE1MX1BhcnNlciBwYXJzZXI7CisKKworc3RhdGljIHZvaWQKK2Jhc2ljX3NldHVwKHZvaWQpCit7CisgICAgcGFyc2VyID0gWE1MX1BhcnNlckNyZWF0ZShOVUxMKTsKKyAgICBpZiAocGFyc2VyID09IE5VTEwpCisgICAgICAgIGZhaWwoIlBhcnNlciBub3QgY3JlYXRlZC4iKTsKK30KKworc3RhdGljIHZvaWQKK2Jhc2ljX3RlYXJkb3duKHZvaWQpCit7CisgICAgaWYgKHBhcnNlciAhPSBOVUxMKQorICAgICAgICBYTUxfUGFyc2VyRnJlZShwYXJzZXIpOworfQorCisvKiBHZW5lcmF0ZSBhIGZhaWx1cmUgdXNpbmcgdGhlIHBhcnNlciBzdGF0ZSB0byBjcmVhdGUgYW4gZXJyb3IgbWVzc2FnZTsKKyAgIHRoaXMgc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUgcGFyc2VyIHJlcG9ydHMgYW4gZXJyb3Igd2Ugd2VyZW4ndAorICAgZXhwZWN0aW5nLgorKi8KK3N0YXRpYyB2b2lkCitfeG1sX2ZhaWx1cmUoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKQoreworICAgIGNoYXIgYnVmZmVyWzEwMjRdOworICAgIGVudW0gWE1MX0Vycm9yIGVyciA9IFhNTF9HZXRFcnJvckNvZGUocGFyc2VyKTsKKyAgICBzcHJpbnRmKGJ1ZmZlciwKKyAgICAgICAgICAgICIgICAgJWQ6ICVzIChsaW5lICUiIFhNTF9GTVRfSU5UX01PRCAidSwgb2Zmc2V0ICUiXAorICAgICAgICAgICAgICAgIFhNTF9GTVRfSU5UX01PRCAidSlcbiAgICByZXBvcnRlZCBmcm9tICVzLCBsaW5lICVkXG4iLAorICAgICAgICAgICAgZXJyLAorICAgICAgICAgICAgWE1MX0Vycm9yU3RyaW5nKGVyciksCisgICAgICAgICAgICBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIocGFyc2VyKSwKKyAgICAgICAgICAgIFhNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyKHBhcnNlciksCisgICAgICAgICAgICBmaWxlLCBsaW5lKTsKKyAgICBfZmFpbF91bmxlc3MoMCwgZmlsZSwgbGluZSwgYnVmZmVyKTsKK30KKworI2RlZmluZSB4bWxfZmFpbHVyZShwYXJzZXIpIF94bWxfZmFpbHVyZSgocGFyc2VyKSwgX19GSUxFX18sIF9fTElORV9fKQorCitzdGF0aWMgdm9pZAorX2V4cGVjdF9mYWlsdXJlKGNoYXIgKnRleHQsIGVudW0gWE1MX0Vycm9yIGVycm9yQ29kZSwgY2hhciAqZXJyb3JNZXNzYWdlLAorICAgICAgICAgICAgICAgIGNoYXIgKmZpbGUsIGludCBsaW5lbm8pCit7CisgICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfT0spCisgICAgICAgIC8qIEhhY2tpc2ggdXNlIG9mIF9mYWlsX3VubGVzcygpIG1hY3JvLCBidXQgbGV0J3MgdXMgcmVwb3J0CisgICAgICAgICAgIHRoZSByaWdodCBmaWxlbmFtZSBhbmQgbGluZSBudW1iZXIuICovCisgICAgICAgIF9mYWlsX3VubGVzcygwLCBmaWxlLCBsaW5lbm8sIGVycm9yTWVzc2FnZSk7CisgICAgaWYgKFhNTF9HZXRFcnJvckNvZGUocGFyc2VyKSAhPSBlcnJvckNvZGUpCisgICAgICAgIF94bWxfZmFpbHVyZShwYXJzZXIsIGZpbGUsIGxpbmVubyk7Cit9CisKKyNkZWZpbmUgZXhwZWN0X2ZhaWx1cmUodGV4dCwgZXJyb3JDb2RlLCBlcnJvck1lc3NhZ2UpIFwKKyAgICAgICAgX2V4cGVjdF9mYWlsdXJlKCh0ZXh0KSwgKGVycm9yQ29kZSksIChlcnJvck1lc3NhZ2UpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18pCisKKy8qIER1bW15IGhhbmRsZXJzIGZvciB3aGVuIHdlIG5lZWQgdG8gc2V0IGEgaGFuZGxlciB0byB0aWNrbGUgYSBidWcsCisgICBidXQgaXQgZG9lc24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLgorKi8KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorZHVtbXlfc3RhcnRfZG9jdHlwZV9oYW5kbGVyKHZvaWQgICAgICAgICAgICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqZG9jdHlwZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBoYXNfaW50ZXJuYWxfc3Vic2V0KQore30KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorZHVtbXlfZW5kX2RvY3R5cGVfaGFuZGxlcih2b2lkICp1c2VyRGF0YSkKK3t9CisKK3N0YXRpYyB2b2lkIFhNTENBTEwKK2R1bW15X2VudGl0eV9kZWNsX2hhbmRsZXIodm9pZCAgICAgICAgICAgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqZW50aXR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgaXNfcGFyYW1ldGVyX2VudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICB2YWx1ZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqc3lzdGVtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJsaWNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5vdGF0aW9uTmFtZSkKK3t9CisKK3N0YXRpYyB2b2lkIFhNTENBTEwKK2R1bW15X25vdGF0aW9uX2RlY2xfaGFuZGxlcih2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbm90YXRpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzeXN0ZW1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHVibGljSWQpCit7fQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCitkdW1teV9lbGVtZW50X2RlY2xfaGFuZGxlcih2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0NvbnRlbnQgKm1vZGVsKQore30KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorZHVtbXlfYXR0bGlzdF9kZWNsX2hhbmRsZXIodm9pZCAgICAgICAgICAgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmVsbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICphdHRuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmF0dF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmRmbHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBpc3JlcXVpcmVkKQore30KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorZHVtbXlfY29tbWVudF9oYW5kbGVyKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqZGF0YSkKK3t9CisKK3N0YXRpYyB2b2lkIFhNTENBTEwKK2R1bW15X3BpX2hhbmRsZXIodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICp0YXJnZXQsIGNvbnN0IFhNTF9DaGFyICpkYXRhKQore30KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorZHVtbXlfc3RhcnRfZWxlbWVudCh2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5hbWUsIGNvbnN0IFhNTF9DaGFyICoqYXR0cykKK3t9CisKKworLyoKKyAqIENoYXJhY3RlciAmIGVuY29kaW5nIHRlc3RzLgorICovCisKK1NUQVJUX1RFU1QodGVzdF9udWxfYnl0ZSkKK3sKKyAgICBjaGFyIHRleHRbXSA9ICI8ZG9jPlwwPC9kb2M+IjsKKworICAgIC8qIHRlc3QgdGhhdCBhIE5VTCBieXRlIChpbiBVUy1BU0NJSSBkYXRhKSBpcyBhbiBlcnJvciAqLworICAgIGlmIChYTUxfUGFyc2UocGFyc2VyLCB0ZXh0LCBzaXplb2YodGV4dCkgLSAxLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19PSykKKyAgICAgICAgZmFpbCgiUGFyc2VyIGRpZCBub3QgcmVwb3J0IGVycm9yIG9uIE5VTC1ieXRlLiIpOworICAgIGlmIChYTUxfR2V0RXJyb3JDb2RlKHBhcnNlcikgIT0gWE1MX0VSUk9SX0lOVkFMSURfVE9LRU4pCisgICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7Cit9CitFTkRfVEVTVAorCisKK1NUQVJUX1RFU1QodGVzdF91MDAwMF9jaGFyKQoreworICAgIC8qIHRlc3QgdGhhdCBhIE5VTCBieXRlIChpbiBVUy1BU0NJSSBkYXRhKSBpcyBhbiBlcnJvciAqLworICAgIGV4cGVjdF9mYWlsdXJlKCI8ZG9jPiYjMDs8L2RvYz4iLAorICAgICAgICAgICAgICAgICAgIFhNTF9FUlJPUl9CQURfQ0hBUl9SRUYsCisgICAgICAgICAgICAgICAgICAgIlBhcnNlciBkaWQgbm90IHJlcG9ydCBlcnJvciBvbiBOVUwtYnl0ZS4iKTsKK30KK0VORF9URVNUCisKK1NUQVJUX1RFU1QodGVzdF9ib21fdXRmOCkKK3sKKyAgICAvKiBUaGlzIHRlc3QgaXMgcmVhbGx5IGp1c3QgbWFraW5nIHN1cmUgd2UgZG9uJ3QgY29yZSBvbiBhIFVURi04IEJPTS4gKi8KKyAgICBjaGFyICp0ZXh0ID0gIlwzNTdcMjczXDI3NzxlLz4iOworCisgICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7Cit9CitFTkRfVEVTVAorCitTVEFSVF9URVNUKHRlc3RfYm9tX3V0ZjE2X2JlKQoreworICAgIGNoYXIgdGV4dFtdID0gIlwzNzZcMzc3XDA8XDBlXDAvXDA+IjsKKworICAgIGlmIChYTUxfUGFyc2UocGFyc2VyLCB0ZXh0LCBzaXplb2YodGV4dCktMSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7Cit9CitFTkRfVEVTVAorCitTVEFSVF9URVNUKHRlc3RfYm9tX3V0ZjE2X2xlKQoreworICAgIGNoYXIgdGV4dFtdID0gIlwzNzdcMzc2PFwwZVwwL1wwPlwwIjsKKworICAgIGlmIChYTUxfUGFyc2UocGFyc2VyLCB0ZXh0LCBzaXplb2YodGV4dCktMSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7Cit9CitFTkRfVEVTVAorCitzdGF0aWMgdm9pZCBYTUxDQUxMCithY2N1bXVsYXRlX2NoYXJhY3RlcnModm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpzLCBpbnQgbGVuKQoreworICAgIENoYXJEYXRhX0FwcGVuZFhNTENoYXJzKChDaGFyRGF0YSAqKXVzZXJEYXRhLCBzLCBsZW4pOworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCithY2N1bXVsYXRlX2F0dHJpYnV0ZSh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqKmF0dHMpCit7CisgICAgQ2hhckRhdGEgKnN0b3JhZ2UgPSAoQ2hhckRhdGEgKil1c2VyRGF0YTsKKyAgICBpZiAoc3RvcmFnZS0+Y291bnQgPCAwICYmIGF0dHMgIT0gTlVMTCAmJiBhdHRzWzBdICE9IE5VTEwpIHsKKyAgICAgICAgLyogImFjY3VtdWxhdGUiIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgYXR0cmlidXRlIHdlIHNlZSAqLworICAgICAgICBDaGFyRGF0YV9BcHBlbmRYTUxDaGFycyhzdG9yYWdlLCBhdHRzWzFdLCAtMSk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitfcnVuX2NoYXJhY3Rlcl9jaGVjayhYTUxfQ2hhciAqdGV4dCwgWE1MX0NoYXIgKmV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpCit7CisgICAgQ2hhckRhdGEgc3RvcmFnZTsKKworICAgIENoYXJEYXRhX0luaXQoJnN0b3JhZ2UpOworICAgIFhNTF9TZXRVc2VyRGF0YShwYXJzZXIsICZzdG9yYWdlKTsKKyAgICBYTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXIocGFyc2VyLCBhY2N1bXVsYXRlX2NoYXJhY3RlcnMpOworICAgIGlmIChYTUxfUGFyc2UocGFyc2VyLCB0ZXh0LCBzdHJsZW4odGV4dCksIFhNTF9UUlVFKSA9PSBYTUxfU1RBVFVTX0VSUk9SKQorICAgICAgICBfeG1sX2ZhaWx1cmUocGFyc2VyLCBmaWxlLCBsaW5lKTsKKyAgICBDaGFyRGF0YV9DaGVja1hNTENoYXJzKCZzdG9yYWdlLCBleHBlY3RlZCk7Cit9CisKKyNkZWZpbmUgcnVuX2NoYXJhY3Rlcl9jaGVjayh0ZXh0LCBleHBlY3RlZCkgXAorICAgICAgICBfcnVuX2NoYXJhY3Rlcl9jaGVjayh0ZXh0LCBleHBlY3RlZCwgX19GSUxFX18sIF9fTElORV9fKQorCitzdGF0aWMgdm9pZAorX3J1bl9hdHRyaWJ1dGVfY2hlY2soWE1MX0NoYXIgKnRleHQsIFhNTF9DaGFyICpleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKQoreworICAgIENoYXJEYXRhIHN0b3JhZ2U7CisKKyAgICBDaGFyRGF0YV9Jbml0KCZzdG9yYWdlKTsKKyAgICBYTUxfU2V0VXNlckRhdGEocGFyc2VyLCAmc3RvcmFnZSk7CisgICAgWE1MX1NldFN0YXJ0RWxlbWVudEhhbmRsZXIocGFyc2VyLCBhY2N1bXVsYXRlX2F0dHJpYnV0ZSk7CisgICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgIF94bWxfZmFpbHVyZShwYXJzZXIsIGZpbGUsIGxpbmUpOworICAgIENoYXJEYXRhX0NoZWNrWE1MQ2hhcnMoJnN0b3JhZ2UsIGV4cGVjdGVkKTsKK30KKworI2RlZmluZSBydW5fYXR0cmlidXRlX2NoZWNrKHRleHQsIGV4cGVjdGVkKSBcCisgICAgICAgIF9ydW5fYXR0cmlidXRlX2NoZWNrKHRleHQsIGV4cGVjdGVkLCBfX0ZJTEVfXywgX19MSU5FX18pCisKKy8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICM0OTE5ODYuICovCitTVEFSVF9URVNUKHRlc3RfZGFuaXNoX2xhdGluMSkKK3sKKyAgICBjaGFyICp0ZXh0ID0KKyAgICAgICAgIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J2lzby04ODU5LTEnPz5cbiIKKyAgICAgICAgIjxlPkpceEY4cmdlbiBceEU2XHhGOFx4RTVceEM2XHhEOFx4QzU8L2U+IjsKKyAgICBydW5fY2hhcmFjdGVyX2NoZWNrKHRleHQsCisgICAgICAgICAgICAgIkpceEMzXHhCOHJnZW4gXHhDM1x4QTZceEMzXHhCOFx4QzNceEE1XHhDM1x4ODZceEMzXHg5OFx4QzNceDg1Iik7Cit9CitFTkRfVEVTVAorCisKKy8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICM1MTQyODEuICovCitTVEFSVF9URVNUKHRlc3RfZnJlbmNoX2NoYXJyZWZfaGV4aWRlY2ltYWwpCit7CisgICAgY2hhciAqdGV4dCA9CisgICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc28tODg1OS0xJz8+XG4iCisgICAgICAgICI8ZG9jPiYjeEU5OyYjeEU4OyYjeEUwOyYjeEU3OyYjeEVBOyYjeEM4OzwvZG9jPiI7CisgICAgcnVuX2NoYXJhY3Rlcl9jaGVjayh0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIlx4QzNceEE5XHhDM1x4QThceEMzXHhBMFx4QzNceEE3XHhDM1x4QUFceEMzXHg4OCIpOworfQorRU5EX1RFU1QKKworU1RBUlRfVEVTVCh0ZXN0X2ZyZW5jaF9jaGFycmVmX2RlY2ltYWwpCit7CisgICAgY2hhciAqdGV4dCA9CisgICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc28tODg1OS0xJz8+XG4iCisgICAgICAgICI8ZG9jPiYjMjMzOyYjMjMyOyYjMjI0OyYjMjMxOyYjMjM0OyYjMjAwOzwvZG9jPiI7CisgICAgcnVuX2NoYXJhY3Rlcl9jaGVjayh0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIlx4QzNceEE5XHhDM1x4QThceEMzXHhBMFx4QzNceEE3XHhDM1x4QUFceEMzXHg4OCIpOworfQorRU5EX1RFU1QKKworU1RBUlRfVEVTVCh0ZXN0X2ZyZW5jaF9sYXRpbjEpCit7CisgICAgY2hhciAqdGV4dCA9CisgICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc28tODg1OS0xJz8+XG4iCisgICAgICAgICI8ZG9jPlx4RTlceEU4XHhFMFx4RTdceEVhXHhDODwvZG9jPiI7CisgICAgcnVuX2NoYXJhY3Rlcl9jaGVjayh0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIlx4QzNceEE5XHhDM1x4QThceEMzXHhBMFx4QzNceEE3XHhDM1x4QUFceEMzXHg4OCIpOworfQorRU5EX1RFU1QKKworU1RBUlRfVEVTVCh0ZXN0X2ZyZW5jaF91dGY4KQoreworICAgIGNoYXIgKnRleHQgPQorICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz5cbiIKKyAgICAgICAgIjxkb2M+XHhDM1x4QTk8L2RvYz4iOworICAgIHJ1bl9jaGFyYWN0ZXJfY2hlY2sodGV4dCwgIlx4QzNceEE5Iik7Cit9CitFTkRfVEVTVAorCisvKiBSZWdyZXNzaW9uIHRlc3QgZm9yIFNGIGJ1ZyAjNjAwNDc5LgorICAgWFhYIFRoZXJlIHNob3VsZCBiZSBhIHRlc3QgdGhhdCBleGVyY2lzZXMgYWxsIGxlZ2FsIFhNTCBVbmljb2RlCisgICBjaGFyYWN0ZXJzIGFzIFBDREFUQSBhbmQgYXR0cmlidXRlIHZhbHVlIGNvbnRlbnQsIGFuZCBYTUwgTmFtZQorICAgY2hhcmFjdGVycyBhcyBwYXJ0IG9mIGVsZW1lbnQgYW5kIGF0dHJpYnV0ZSBuYW1lcy4KKyovCitTVEFSVF9URVNUKHRlc3RfdXRmOF9mYWxzZV9yZWplY3Rpb24pCit7CisgICAgY2hhciAqdGV4dCA9ICI8ZG9jPlx4RUZceEJBXHhCRjwvZG9jPiI7CisgICAgcnVuX2NoYXJhY3Rlcl9jaGVjayh0ZXh0LCAiXHhFRlx4QkFceEJGIik7Cit9CitFTkRfVEVTVAorCisvKiBSZWdyZXNzaW9uIHRlc3QgZm9yIFNGIGJ1ZyAjNDc3NjY3LgorICAgVGhpcyB0ZXN0IGFzc3VyZXMgdGhhdCBhbnkgOC1iaXQgY2hhcmFjdGVyIGZvbGxvd2VkIGJ5IGEgNy1iaXQKKyAgIGNoYXJhY3RlciB3aWxsIG5vdCBiZSBtaXN0YWtlbmx5IGludGVycHJldGVkIGFzIGEgdmFsaWQgVVRGLTgKKyAgIHNlcXVlbmNlLgorKi8KK1NUQVJUX1RFU1QodGVzdF9pbGxlZ2FsX3V0ZjgpCit7CisgICAgY2hhciB0ZXh0WzEwMF07CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAxMjg7IGkgPD0gMjU1OyArK2kpIHsKKyAgICAgICAgc3ByaW50Zih0ZXh0LCAiPGU+JWNjZDwvZT4iLCBpKTsKKyAgICAgICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfT0spIHsKKyAgICAgICAgICAgIHNwcmludGYodGV4dCwKKyAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHRva2VuIGVycm9yIGZvciAnJWMnIChvcmRpbmFsICVkKSBpbiBVVEYtOCB0ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgaSwgaSk7CisgICAgICAgICAgICBmYWlsKHRleHQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFhNTF9HZXRFcnJvckNvZGUocGFyc2VyKSAhPSBYTUxfRVJST1JfSU5WQUxJRF9UT0tFTikKKyAgICAgICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7CisgICAgICAgIC8qIFJlc2V0IHRoZSBwYXJzZXIgc2luY2Ugd2UgdXNlIHRoZSBzYW1lIHBhcnNlciByZXBlYXRlZGx5LiAqLworICAgICAgICBYTUxfUGFyc2VyUmVzZXQocGFyc2VyLCBOVUxMKTsKKyAgICB9Cit9CitFTkRfVEVTVAorCitTVEFSVF9URVNUKHRlc3RfdXRmMTYpCit7CisgICAgLyogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTE2Ij8+CisgICAgICAgPGRvYyBhPScxMjMnPnNvbWUgdGV4dDwvZG9jPgorICAgICovCisgICAgY2hhciB0ZXh0W10gPQorICAgICAgICAiXDAwMDxcMDAwP1wwMDB4XDAwMG1cMDAwXDE1NFwwMDAgXDAwMHZcMDAwZVwwMDByXDAwMHNcMDAwaVwwMDBvIgorICAgICAgICAiXDAwMG5cMDAwPVwwMDAnXDAwMDFcMDAwLlwwMDBcMDYwXDAwMCdcMDAwIFwwMDBlXDAwMG5cMDAwY1wwMDBvIgorICAgICAgICAiXDAwMGRcMDAwaVwwMDBuXDAwMGdcMDAwPVwwMDAnXDAwMFVcMDAwVFwwMDBGXDAwMC1cMDAwMVwwMDBcMDY2IgorICAgICAgICAiXDAwMCdcMDAwP1wwMDA+XDAwMFxuIgorICAgICAgICAiXDAwMDxcMDAwZFwwMDBvXDAwMGNcMDAwIFwwMDBhXDAwMD1cMDAwJ1wwMDAxXDAwMDJcMDAwM1wwMDAnIgorICAgICAgICAiXDAwMD5cMDAwc1wwMDBvXDAwMG1cMDAwZVwwMDAgXDAwMHRcMDAwZVwwMDB4XDAwMHRcMDAwPFwwMDAvIgorICAgICAgICAiXDAwMGRcMDAwb1wwMDBjXDAwMD4iOworICAgIGlmIChYTUxfUGFyc2UocGFyc2VyLCB0ZXh0LCBzaXplb2YodGV4dCktMSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7Cit9CitFTkRfVEVTVAorCitTVEFSVF9URVNUKHRlc3RfdXRmMTZfbGVfZXBpbG9nX25ld2xpbmUpCit7CisgICAgdW5zaWduZWQgaW50IGZpcnN0X2NodW5rX2J5dGVzID0gMTc7CisgICAgY2hhciB0ZXh0W10gPSAKKyAgICAgICAgIlx4RkZceEZFIiAgICAgICAgICAgICAgICAgICAgICAvKiBCT00gKi8KKyAgICAgICAgIjxcMDAwZVwwMDAvXDAwMD5cMDAwIiAgICAgICAgICAvKiBkb2N1bWVudCBlbGVtZW50ICovCisgICAgICAgICJcclwwMDBcblwwMDBcclwwMDBcblwwMDAiOyAgICAgLyogZXBpbG9nICovCisKKyAgICBpZiAoZmlyc3RfY2h1bmtfYnl0ZXMgPj0gc2l6ZW9mKHRleHQpIC0gMSkKKyAgICAgICAgZmFpbCgiYmFkIHZhbHVlIG9mIGZpcnN0X2NodW5rX2J5dGVzIik7CisgICAgaWYgKCAgWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgZmlyc3RfY2h1bmtfYnl0ZXMsIFhNTF9GQUxTRSkKKyAgICAgICAgICA9PSBYTUxfU1RBVFVTX0VSUk9SKQorICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOworICAgIGVsc2UgeworICAgICAgICBlbnVtIFhNTF9TdGF0dXMgcmM7CisgICAgICAgIHJjID0gWE1MX1BhcnNlKHBhcnNlciwgdGV4dCArIGZpcnN0X2NodW5rX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodGV4dCkgLSBmaXJzdF9jaHVua19ieXRlcyAtIDEsIFhNTF9UUlVFKTsKKyAgICAgICAgaWYgKHJjID09IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOworICAgIH0KK30KK0VORF9URVNUCisKKy8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICM0ODE2MDksICM3NzQwMjguICovCitTVEFSVF9URVNUKHRlc3RfbGF0aW4xX3VtbGF1dHMpCit7CisgICAgY2hhciAqdGV4dCA9CisgICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc28tODg1OS0xJz8+XG4iCisgICAgICAgICI8ZSBhPSdceEU0IFx4RjYgXHhGQyAmIzIyODsgJiMyNDY7ICYjMjUyOyAmI3gwMEU0OyAmI3gwRjY7ICYjeEZDOyA+J1xuIgorICAgICAgICAiICA+XHhFNCBceEY2IFx4RkMgJiMyMjg7ICYjMjQ2OyAmIzI1MjsgJiN4MDBFNDsgJiN4MEY2OyAmI3hGQzsgPjwvZT4iOworICAgIGNoYXIgKnV0ZjggPQorICAgICAgICAiXHhDM1x4QTQgXHhDM1x4QjYgXHhDM1x4QkMgIgorICAgICAgICAiXHhDM1x4QTQgXHhDM1x4QjYgXHhDM1x4QkMgIgorICAgICAgICAiXHhDM1x4QTQgXHhDM1x4QjYgXHhDM1x4QkMgPiI7CisgICAgcnVuX2NoYXJhY3Rlcl9jaGVjayh0ZXh0LCB1dGY4KTsKKyAgICBYTUxfUGFyc2VyUmVzZXQocGFyc2VyLCBOVUxMKTsKKyAgICBydW5fYXR0cmlidXRlX2NoZWNrKHRleHQsIHV0ZjgpOworfQorRU5EX1RFU1QKKworLyogUmVncmVzc2lvbiB0ZXN0ICMxIGZvciBTRiBidWcgIzY1MzE4MC4gKi8KK1NUQVJUX1RFU1QodGVzdF9saW5lX251bWJlcl9hZnRlcl9wYXJzZSkKK3sgIAorICAgIGNoYXIgKnRleHQgPQorICAgICAgICAiPHRhZz5cbiIKKyAgICAgICAgIlxuIgorICAgICAgICAiXG48L3RhZz4iOworICAgIFhNTF9TaXplIGxpbmVubzsKKworICAgIGlmIChYTUxfUGFyc2UocGFyc2VyLCB0ZXh0LCBzdHJsZW4odGV4dCksIFhNTF9GQUxTRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKKyAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKKyAgICBsaW5lbm8gPSBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIocGFyc2VyKTsKKyAgICBpZiAobGluZW5vICE9IDQpIHsKKyAgICAgICAgY2hhciBidWZmZXJbMTAwXTsKKyAgICAgICAgc3ByaW50ZihidWZmZXIsIAorICAgICAgICAgICAgImV4cGVjdGVkIDQgbGluZXMsIHNhdyAlIiBYTUxfRk1UX0lOVF9NT0QgInUiLCBsaW5lbm8pOworICAgICAgICBmYWlsKGJ1ZmZlcik7CisgICAgfQorfQorRU5EX1RFU1QKKworLyogUmVncmVzc2lvbiB0ZXN0ICMyIGZvciBTRiBidWcgIzY1MzE4MC4gKi8KK1NUQVJUX1RFU1QodGVzdF9jb2x1bW5fbnVtYmVyX2FmdGVyX3BhcnNlKQoreworICAgIGNoYXIgKnRleHQgPSAiPHRhZz48L3RhZz4iOworICAgIFhNTF9TaXplIGNvbG5vOworCisgICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX0ZBTFNFKSA9PSBYTUxfU1RBVFVTX0VSUk9SKQorICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOworICAgIGNvbG5vID0gWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIocGFyc2VyKTsKKyAgICBpZiAoY29sbm8gIT0gMTEpIHsKKyAgICAgICAgY2hhciBidWZmZXJbMTAwXTsKKyAgICAgICAgc3ByaW50ZihidWZmZXIsIAorICAgICAgICAgICAgImV4cGVjdGVkIDExIGNvbHVtbnMsIHNhdyAlIiBYTUxfRk1UX0lOVF9NT0QgInUiLCBjb2xubyk7CisgICAgICAgIGZhaWwoYnVmZmVyKTsKKyAgICB9Cit9CitFTkRfVEVTVAorCitzdGF0aWMgdm9pZCBYTUxDQUxMCitzdGFydF9lbGVtZW50X2V2ZW50X2hhbmRsZXIyKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqbmFtZSwKKwkJCSAgICAgY29uc3QgWE1MX0NoYXIgKiphdHRyKQoreworICAgIENoYXJEYXRhICpzdG9yYWdlID0gKENoYXJEYXRhICopIHVzZXJEYXRhOworICAgIGNoYXIgYnVmZmVyWzEwMF07CisKKyAgICBzcHJpbnRmKGJ1ZmZlciwKKyAgICAgICAgIjwlcz4gYXQgY29sOiUiIFhNTF9GTVRfSU5UX01PRCAidSBsaW5lOiUiXAorICAgICAgICAgICAgWE1MX0ZNVF9JTlRfTU9EICJ1XG4iLCBuYW1lLAorCSAgICBYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlcihwYXJzZXIpLAorCSAgICBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIocGFyc2VyKSk7CisgICAgQ2hhckRhdGFfQXBwZW5kU3RyaW5nKHN0b3JhZ2UsIGJ1ZmZlcik7Cit9CisKK3N0YXRpYyB2b2lkIFhNTENBTEwKK2VuZF9lbGVtZW50X2V2ZW50X2hhbmRsZXIyKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqbmFtZSkKK3sKKyAgICBDaGFyRGF0YSAqc3RvcmFnZSA9IChDaGFyRGF0YSAqKSB1c2VyRGF0YTsKKyAgICBjaGFyIGJ1ZmZlclsxMDBdOworCisgICAgc3ByaW50ZihidWZmZXIsCisgICAgICAgICI8LyVzPiBhdCBjb2w6JSIgWE1MX0ZNVF9JTlRfTU9EICJ1IGxpbmU6JSJcCisgICAgICAgICAgICBYTUxfRk1UX0lOVF9NT0QgInVcbiIsIG5hbWUsCisJICAgIFhNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyKHBhcnNlciksCisJICAgIFhNTF9HZXRDdXJyZW50TGluZU51bWJlcihwYXJzZXIpKTsKKyAgICBDaGFyRGF0YV9BcHBlbmRTdHJpbmcoc3RvcmFnZSwgYnVmZmVyKTsKK30KKworLyogUmVncmVzc2lvbiB0ZXN0ICMzIGZvciBTRiBidWcgIzY1MzE4MC4gKi8KK1NUQVJUX1RFU1QodGVzdF9saW5lX2FuZF9jb2x1bW5fbnVtYmVyc19pbnNpZGVfaGFuZGxlcnMpCit7CisgICAgY2hhciAqdGV4dCA9CisgICAgICAgICI8YT5cbiIgICAgICAgIC8qIFVuaXggZW5kLW9mLWxpbmUgKi8KKyAgICAgICAgIiAgPGI+XHJcbiIgICAgLyogV2luZG93cyBlbmQtb2YtbGluZSAqLworICAgICAgICAiICAgIDxjLz5cciIgICAvKiBNYWMgT1MgZW5kLW9mLWxpbmUgKi8KKyAgICAgICAgIiAgPC9iPlxuIgorICAgICAgICAiICA8ZD5cbiIKKyAgICAgICAgIiAgICA8Zi8+XG4iCisgICAgICAgICIgIDwvZD5cbiIKKyAgICAgICAgIjwvYT4iOworICAgIGNoYXIgKmV4cGVjdGVkID0KKyAgICAgICAgIjxhPiBhdCBjb2w6MCBsaW5lOjFcbiIKKyAgICAgICAgIjxiPiBhdCBjb2w6MiBsaW5lOjJcbiIKKyAgICAgICAgIjxjPiBhdCBjb2w6NCBsaW5lOjNcbiIKKyAgICAgICAgIjwvYz4gYXQgY29sOjggbGluZTozXG4iCisgICAgICAgICI8L2I+IGF0IGNvbDoyIGxpbmU6NFxuIgorICAgICAgICAiPGQ+IGF0IGNvbDoyIGxpbmU6NVxuIgorICAgICAgICAiPGY+IGF0IGNvbDo0IGxpbmU6NlxuIgorICAgICAgICAiPC9mPiBhdCBjb2w6OCBsaW5lOjZcbiIKKyAgICAgICAgIjwvZD4gYXQgY29sOjIgbGluZTo3XG4iCisgICAgICAgICI8L2E+IGF0IGNvbDowIGxpbmU6OFxuIjsKKyAgICBDaGFyRGF0YSBzdG9yYWdlOworCisgICAgQ2hhckRhdGFfSW5pdCgmc3RvcmFnZSk7CisgICAgWE1MX1NldFVzZXJEYXRhKHBhcnNlciwgJnN0b3JhZ2UpOworICAgIFhNTF9TZXRTdGFydEVsZW1lbnRIYW5kbGVyKHBhcnNlciwgc3RhcnRfZWxlbWVudF9ldmVudF9oYW5kbGVyMik7CisgICAgWE1MX1NldEVuZEVsZW1lbnRIYW5kbGVyKHBhcnNlciwgZW5kX2VsZW1lbnRfZXZlbnRfaGFuZGxlcjIpOworICAgIGlmIChYTUxfUGFyc2UocGFyc2VyLCB0ZXh0LCBzdHJsZW4odGV4dCksIFhNTF9UUlVFKSA9PSBYTUxfU1RBVFVTX0VSUk9SKQorICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOworCisgICAgQ2hhckRhdGFfQ2hlY2tTdHJpbmcoJnN0b3JhZ2UsIGV4cGVjdGVkKTsgCit9CitFTkRfVEVTVAorCisvKiBSZWdyZXNzaW9uIHRlc3QgIzQgZm9yIFNGIGJ1ZyAjNjUzMTgwLiAqLworU1RBUlRfVEVTVCh0ZXN0X2xpbmVfbnVtYmVyX2FmdGVyX2Vycm9yKQoreworICAgIGNoYXIgKnRleHQgPQorICAgICAgICAiPGE+XG4iCisgICAgICAgICIgIDxiPlxuIgorICAgICAgICAiICA8L2E+IjsgIC8qIG1pc3NpbmcgPC9iPiAqLworICAgIFhNTF9TaXplIGxpbmVubzsKKyAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfRkFMU0UpICE9IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgIGZhaWwoIkV4cGVjdGVkIGEgcGFyc2UgZXJyb3IiKTsKKworICAgIGxpbmVubyA9IFhNTF9HZXRDdXJyZW50TGluZU51bWJlcihwYXJzZXIpOworICAgIGlmIChsaW5lbm8gIT0gMykgeworICAgICAgICBjaGFyIGJ1ZmZlclsxMDBdOworICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgImV4cGVjdGVkIDMgbGluZXMsIHNhdyAlIiBYTUxfRk1UX0lOVF9NT0QgInUiLCBsaW5lbm8pOworICAgICAgICBmYWlsKGJ1ZmZlcik7CisgICAgfQorfQorRU5EX1RFU1QKKyAgICAKKy8qIFJlZ3Jlc3Npb24gdGVzdCAjNSBmb3IgU0YgYnVnICM2NTMxODAuICovCitTVEFSVF9URVNUKHRlc3RfY29sdW1uX251bWJlcl9hZnRlcl9lcnJvcikKK3sKKyAgICBjaGFyICp0ZXh0ID0KKyAgICAgICAgIjxhPlxuIgorICAgICAgICAiICA8Yj5cbiIKKyAgICAgICAgIiAgPC9hPiI7ICAvKiBtaXNzaW5nIDwvYj4gKi8KKyAgICBYTUxfU2l6ZSBjb2xubzsKKyAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfRkFMU0UpICE9IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgIGZhaWwoIkV4cGVjdGVkIGEgcGFyc2UgZXJyb3IiKTsKKworICAgIGNvbG5vID0gWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIocGFyc2VyKTsKKyAgICBpZiAoY29sbm8gIT0gNCkgeyAKKyAgICAgICAgY2hhciBidWZmZXJbMTAwXTsKKyAgICAgICAgc3ByaW50ZihidWZmZXIsIAorICAgICAgICAgICAgImV4cGVjdGVkIDQgY29sdW1ucywgc2F3ICUiIFhNTF9GTVRfSU5UX01PRCAidSIsIGNvbG5vKTsKKyAgICAgICAgZmFpbChidWZmZXIpOworICAgIH0KK30KK0VORF9URVNUCisKKy8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICM0NzgzMzIuICovCitTVEFSVF9URVNUKHRlc3RfcmVhbGx5X2xvbmdfbGluZXMpCit7CisgICAgLyogVGhpcyBwYXJzZXMgYW4gaW5wdXQgbGluZSBsb25nZXIgdGhhbiBJTklUX0RBVEFfQlVGX1NJWkUKKyAgICAgICBjaGFyYWN0ZXJzIGxvbmcgKGRlZmluZWQgdG8gYmUgMTAyNCBpbiB4bWxwYXJzZS5jKS4gIFdlIHRha2UgYQorICAgICAgIHJlYWxseSBjaGVlc3kgYXBwcm9hY2ggdG8gYnVpbGRpbmcgdGhlIGlucHV0IGJ1ZmZlciwgYmVjYXVzZQorICAgICAgIHRoaXMgYXZvaWRzIHdyaXRpbmcgYnVncyBpbiBidWZmZXItZmlsbGluZyBjb2RlLgorICAgICovCisgICAgY2hhciAqdGV4dCA9CisgICAgICAgICI8ZT4iCisgICAgICAgIC8qIDY0IGNoYXJzICovCisgICAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS0rIgorICAgICAgICAvKiB1bnRpbCB3ZSBoYXZlIGF0IGxlYXN0IDEwMjQgY2hhcmFjdGVycyBvbiB0aGUgbGluZTogKi8KKyAgICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LSsiCisgICAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS0rIgorICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktKyIKKyAgICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LSsiCisgICAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS0rIgorICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktKyIKKyAgICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LSsiCisgICAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS0rIgorICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktKyIKKyAgICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LSsiCisgICAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS0rIgorICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktKyIKKyAgICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LSsiCisgICAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS0rIgorICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktKyIKKyAgICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LSsiCisgICAgICAgICI8L2U+IjsKKyAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKKyAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKK30KK0VORF9URVNUCisKKworLyoKKyAqIEVsZW1lbnQgZXZlbnQgdGVzdHMuCisgKi8KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorZW5kX2VsZW1lbnRfZXZlbnRfaGFuZGxlcih2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKm5hbWUpCit7CisgICAgQ2hhckRhdGEgKnN0b3JhZ2UgPSAoQ2hhckRhdGEgKikgdXNlckRhdGE7CisgICAgQ2hhckRhdGFfQXBwZW5kU3RyaW5nKHN0b3JhZ2UsICIvIik7CisgICAgQ2hhckRhdGFfQXBwZW5kWE1MQ2hhcnMoc3RvcmFnZSwgbmFtZSwgLTEpOworfQorCitTVEFSVF9URVNUKHRlc3RfZW5kX2VsZW1lbnRfZXZlbnRzKQoreworICAgIGNoYXIgKnRleHQgPSAiPGE+PGI+PGMvPjwvYj48ZD48Zi8+PC9kPjwvYT4iOworICAgIGNoYXIgKmV4cGVjdGVkID0gIi9jL2IvZi9kL2EiOworICAgIENoYXJEYXRhIHN0b3JhZ2U7CisKKyAgICBDaGFyRGF0YV9Jbml0KCZzdG9yYWdlKTsKKyAgICBYTUxfU2V0VXNlckRhdGEocGFyc2VyLCAmc3RvcmFnZSk7CisgICAgWE1MX1NldEVuZEVsZW1lbnRIYW5kbGVyKHBhcnNlciwgZW5kX2VsZW1lbnRfZXZlbnRfaGFuZGxlcik7CisgICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7CisgICAgQ2hhckRhdGFfQ2hlY2tTdHJpbmcoJnN0b3JhZ2UsIGV4cGVjdGVkKTsKK30KK0VORF9URVNUCisKKworLyoKKyAqIEF0dHJpYnV0ZSB0ZXN0cy4KKyAqLworCisvKiBIZWxwZXJzIHVzZWQgYnkgdGhlIGZvbGxvd2luZyB0ZXN0OyB0aGlzIGNoZWNrcyBhbnkgImF0dHIiIGFuZCAicmVmcyIKKyAgIGF0dHJpYnV0ZXMgdG8gbWFrZSBzdXJlIHdoaXRlc3BhY2UgaGFzIGJlZW4gbm9ybWFsaXplZC4KKworICAgUmV0dXJuIHRydWUgaWYgd2hpdGVzcGFjZSBoYXMgYmVlbiBub3JtYWxpemVkIGluIGEgc3RyaW5nLCB1c2luZworICAgdGhlIHJ1bGVzIGZvciBhdHRyaWJ1dGUgdmFsdWUgbm9ybWFsaXphdGlvbi4gIFRoZSAnaXNfY2RhdGEnIGZsYWcKKyAgIGlzIG5lZWRlZCBzaW5jZSBDREFUQSBhdHRyaWJ1dGVzIGRvbid0IG5lZWQgdG8gaGF2ZSBtdWx0aXBsZQorICAgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGNvbGxhcHNlZCB0byBhIHNpbmdsZSBzcGFjZSwgd2hpbGUgb3RoZXIKKyAgIGF0dHJpYnV0ZSBkYXRhIHR5cGVzIGRvLiAgKFNlY3Rpb24gMy4zLjMgb2YgdGhlIHJlY29tbWVuZGF0aW9uLikKKyovCitzdGF0aWMgaW50Citpc193aGl0ZXNwYWNlX25vcm1hbGl6ZWQoY29uc3QgWE1MX0NoYXIgKnMsIGludCBpc19jZGF0YSkKK3sKKyAgICBpbnQgYmxhbmtzID0gMDsKKyAgICBpbnQgYXRfc3RhcnQgPSAxOworICAgIHdoaWxlICgqcykgeworICAgICAgICBpZiAoKnMgPT0gJyAnKQorICAgICAgICAgICAgKytibGFua3M7CisgICAgICAgIGVsc2UgaWYgKCpzID09ICdcdCcgfHwgKnMgPT0gJ1xuJyB8fCAqcyA9PSAnXHInKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKGF0X3N0YXJ0KSB7CisgICAgICAgICAgICAgICAgYXRfc3RhcnQgPSAwOworICAgICAgICAgICAgICAgIGlmIChibGFua3MgJiYgIWlzX2NkYXRhKQorICAgICAgICAgICAgICAgICAgICAvKiBpbGxlZ2FsIGxlYWRpbmcgYmxhbmtzICovCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYmxhbmtzID4gMSAmJiAhaXNfY2RhdGEpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBibGFua3MgPSAwOworICAgICAgICB9CisgICAgICAgICsrczsKKyAgICB9CisgICAgaWYgKGJsYW5rcyAmJiAhaXNfY2RhdGEpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOworfQorCisvKiBDaGVjayB0aGUgYXR0cmlidXRlIHdoaXRlc3BhY2UgY2hlY2tlcjogKi8KK3N0YXRpYyB2b2lkCit0ZXN0aGVscGVyX2lzX3doaXRlc3BhY2Vfbm9ybWFsaXplZCh2b2lkKQoreworICAgIGFzc2VydChpc193aGl0ZXNwYWNlX25vcm1hbGl6ZWQoImFiYyIsIDApKTsKKyAgICBhc3NlcnQoaXNfd2hpdGVzcGFjZV9ub3JtYWxpemVkKCJhYmMiLCAxKSk7CisgICAgYXNzZXJ0KGlzX3doaXRlc3BhY2Vfbm9ybWFsaXplZCgiYWJjIGRlZiBnaGkiLCAwKSk7CisgICAgYXNzZXJ0KGlzX3doaXRlc3BhY2Vfbm9ybWFsaXplZCgiYWJjIGRlZiBnaGkiLCAxKSk7CisgICAgYXNzZXJ0KCFpc193aGl0ZXNwYWNlX25vcm1hbGl6ZWQoIiBhYmMgZGVmIGdoaSIsIDApKTsKKyAgICBhc3NlcnQoaXNfd2hpdGVzcGFjZV9ub3JtYWxpemVkKCIgYWJjIGRlZiBnaGkiLCAxKSk7CisgICAgYXNzZXJ0KCFpc193aGl0ZXNwYWNlX25vcm1hbGl6ZWQoImFiYyAgZGVmIGdoaSIsIDApKTsKKyAgICBhc3NlcnQoaXNfd2hpdGVzcGFjZV9ub3JtYWxpemVkKCJhYmMgIGRlZiBnaGkiLCAxKSk7CisgICAgYXNzZXJ0KCFpc193aGl0ZXNwYWNlX25vcm1hbGl6ZWQoImFiYyBkZWYgZ2hpICIsIDApKTsKKyAgICBhc3NlcnQoaXNfd2hpdGVzcGFjZV9ub3JtYWxpemVkKCJhYmMgZGVmIGdoaSAiLCAxKSk7CisgICAgYXNzZXJ0KCFpc193aGl0ZXNwYWNlX25vcm1hbGl6ZWQoIiAiLCAwKSk7CisgICAgYXNzZXJ0KGlzX3doaXRlc3BhY2Vfbm9ybWFsaXplZCgiICIsIDEpKTsKKyAgICBhc3NlcnQoIWlzX3doaXRlc3BhY2Vfbm9ybWFsaXplZCgiXHQiLCAwKSk7CisgICAgYXNzZXJ0KCFpc193aGl0ZXNwYWNlX25vcm1hbGl6ZWQoIlx0IiwgMSkpOworICAgIGFzc2VydCghaXNfd2hpdGVzcGFjZV9ub3JtYWxpemVkKCJcbiIsIDApKTsKKyAgICBhc3NlcnQoIWlzX3doaXRlc3BhY2Vfbm9ybWFsaXplZCgiXG4iLCAxKSk7CisgICAgYXNzZXJ0KCFpc193aGl0ZXNwYWNlX25vcm1hbGl6ZWQoIlxyIiwgMCkpOworICAgIGFzc2VydCghaXNfd2hpdGVzcGFjZV9ub3JtYWxpemVkKCJcciIsIDEpKTsKKyAgICBhc3NlcnQoIWlzX3doaXRlc3BhY2Vfbm9ybWFsaXplZCgiYWJjXHQgZGVmIiwgMSkpOworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCitjaGVja19hdHRyX2NvbnRhaW5zX25vcm1hbGl6ZWRfd2hpdGVzcGFjZSh2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKiphdHRzKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGF0dHNbaV0gIT0gTlVMTDsgaSArPSAyKSB7CisgICAgICAgIGNvbnN0IFhNTF9DaGFyICphdHRybmFtZSA9IGF0dHNbaV07CisgICAgICAgIGNvbnN0IFhNTF9DaGFyICp2YWx1ZSA9IGF0dHNbaSArIDFdOworICAgICAgICBpZiAoc3RyY21wKCJhdHRyIiwgYXR0cm5hbWUpID09IDAKKyAgICAgICAgICAgIHx8IHN0cmNtcCgiZW50cyIsIGF0dHJuYW1lKSA9PSAwCisgICAgICAgICAgICB8fCBzdHJjbXAoInJlZnMiLCBhdHRybmFtZSkgPT0gMCkgeworICAgICAgICAgICAgaWYgKCFpc193aGl0ZXNwYWNlX25vcm1hbGl6ZWQodmFsdWUsIDApKSB7CisgICAgICAgICAgICAgICAgY2hhciBidWZmZXJbMjU2XTsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgImF0dHJpYnV0ZSB2YWx1ZSBub3Qgbm9ybWFsaXplZDogJXM9JyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICBhdHRybmFtZSwgdmFsdWUpOworICAgICAgICAgICAgICAgIGZhaWwoYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworU1RBUlRfVEVTVCh0ZXN0X2F0dHJfd2hpdGVzcGFjZV9ub3JtYWxpemF0aW9uKQoreworICAgIGNoYXIgKnRleHQgPQorICAgICAgICAiPCFET0NUWVBFIGRvYyBbXG4iCisgICAgICAgICIgIDwhQVRUTElTVCBkb2NcbiIKKyAgICAgICAgIiAgICAgICAgICAgIGF0dHIgTk1UT0tFTlMgI1JFUVVJUkVEXG4iCisgICAgICAgICIgICAgICAgICAgICBlbnRzIEVOVElUSUVTICNSRVFVSVJFRFxuIgorICAgICAgICAiICAgICAgICAgICAgcmVmcyBJRFJFRlMgICAjUkVRVUlSRUQ+XG4iCisgICAgICAgICJdPlxuIgorICAgICAgICAiPGRvYyBhdHRyPScgICAgYSAgYiBjXHRcdGRcdGVcdCcgcmVmcz0nIGlkLTEgICBcdCAgaWQtMlx0XHQnICBcbiIKKyAgICAgICAgIiAgICAgZW50cz0nIGVudC0xICAgXHRcclxuIgorICAgICAgICAiICAgICAgICAgICAgZW50LTIgICcgPlxuIgorICAgICAgICAiICA8ZSBpZD0naWQtMScvPlxuIgorICAgICAgICAiICA8ZSBpZD0naWQtMicvPlxuIgorICAgICAgICAiPC9kb2M+IjsKKworICAgIFhNTF9TZXRTdGFydEVsZW1lbnRIYW5kbGVyKHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19hdHRyX2NvbnRhaW5zX25vcm1hbGl6ZWRfd2hpdGVzcGFjZSk7CisgICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7Cit9CitFTkRfVEVTVAorCisKKy8qCisgKiBYTUwgZGVjbGFyYXRpb24gdGVzdHMuCisgKi8KKworU1RBUlRfVEVTVCh0ZXN0X3htbGRlY2xfbWlzcGxhY2VkKQoreworICAgIGV4cGVjdF9mYWlsdXJlKCJcbiIKKyAgICAgICAgICAgICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJz8+XG4iCisgICAgICAgICAgICAgICAgICAgIjxhLz4iLAorICAgICAgICAgICAgICAgICAgIFhNTF9FUlJPUl9NSVNQTEFDRURfWE1MX1BJLAorICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gcmVwb3J0IG1pc3BsYWNlZCBYTUwgZGVjbGFyYXRpb24iKTsKK30KK0VORF9URVNUCisKKy8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICM1ODQ4MzIuICovCitzdGF0aWMgaW50IFhNTENBTEwKK1Vua25vd25FbmNvZGluZ0hhbmRsZXIodm9pZCAqZGF0YSxjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmcsWE1MX0VuY29kaW5nICppbmZvKQoreworICAgIGlmIChzdHJjbXAoZW5jb2RpbmcsInVuc3VwcG9ydGVkLWVuY29kaW5nIikgPT0gMCkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKQorICAgICAgICAgICAgaW5mby0+bWFwW2ldID0gaTsKKyAgICAgICAgaW5mby0+ZGF0YSA9IE5VTEw7CisgICAgICAgIGluZm8tPmNvbnZlcnQgPSBOVUxMOworICAgICAgICBpbmZvLT5yZWxlYXNlID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIFhNTF9TVEFUVVNfT0s7CisgICAgfQorICAgIHJldHVybiBYTUxfU1RBVFVTX0VSUk9SOworfQorCitTVEFSVF9URVNUKHRlc3RfdW5rbm93bl9lbmNvZGluZ19pbnRlcm5hbF9lbnRpdHkpCit7CisgICAgY2hhciAqdGV4dCA9CisgICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1bnN1cHBvcnRlZC1lbmNvZGluZyc/PlxuIgorICAgICAgICAiPCFET0NUWVBFIHRlc3QgWzwhRU5USVRZIGZvbyAnYmFyJz5dPlxuIgorICAgICAgICAiPHRlc3QgYT0nJmZvbzsnLz4iOworCisgICAgWE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXIocGFyc2VyLCBVbmtub3duRW5jb2RpbmdIYW5kbGVyLCBOVUxMKTsKKyAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKKyAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKK30KK0VORF9URVNUCisKKy8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICM2MjAxMDYuICovCitzdGF0aWMgaW50IFhNTENBTEwKK2V4dGVybmFsX2VudGl0eV9sb2FkZXJfc2V0X2VuY29kaW5nKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzeXN0ZW1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJsaWNJZCkKK3sKKyAgICAvKiBUaGlzIHRleHQgc2F5cyBpdCdzIGFuIHVuc3VwcG9ydGVkIGVuY29kaW5nLCBidXQgaXQncyByZWFsbHkKKyAgICAgICBVVEYtOCwgd2hpY2ggd2UgdGVsbCBFeHBhdCB1c2luZyBYTUxfU2V0RW5jb2RpbmcoKS4KKyAgICAqLworICAgIGNoYXIgKnRleHQgPQorICAgICAgICAiPD94bWwgZW5jb2Rpbmc9J2lzby04ODU5LTMnPz4iCisgICAgICAgICJceEMzXHhBOSI7CisgICAgWE1MX1BhcnNlciBleHRwYXJzZXI7CisKKyAgICBleHRwYXJzZXIgPSBYTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUocGFyc2VyLCBjb250ZXh0LCBOVUxMKTsKKyAgICBpZiAoZXh0cGFyc2VyID09IE5VTEwpCisgICAgICAgIGZhaWwoIkNvdWxkIG5vdCBjcmVhdGUgZXh0ZXJuYWwgZW50aXR5IHBhcnNlci4iKTsKKyAgICBpZiAoIVhNTF9TZXRFbmNvZGluZyhleHRwYXJzZXIsICJ1dGYtOCIpKQorICAgICAgICBmYWlsKCJYTUxfU2V0RW5jb2RpbmcoKSBpZ25vcmVkIGZvciBleHRlcm5hbCBlbnRpdHkiKTsKKyAgICBpZiAoICBYTUxfUGFyc2UoZXh0cGFyc2VyLCB0ZXh0LCBzdHJsZW4odGV4dCksIFhNTF9UUlVFKQorICAgICAgICAgID09IFhNTF9TVEFUVVNfRVJST1IpIHsKKyAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworfQorCitTVEFSVF9URVNUKHRlc3RfZXh0X2VudGl0eV9zZXRfZW5jb2RpbmcpCit7CisgICAgY2hhciAqdGV4dCA9CisgICAgICAgICI8IURPQ1RZUEUgZG9jIFtcbiIKKyAgICAgICAgIiAgPCFFTlRJVFkgZW4gU1lTVEVNICdodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy9kdW1teS5lbnQnPlxuIgorICAgICAgICAiXT5cbiIKKyAgICAgICAgIjxkb2M+JmVuOzwvZG9jPiI7CisKKyAgICBYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyKHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsX2VudGl0eV9sb2FkZXJfc2V0X2VuY29kaW5nKTsKKyAgICBydW5fY2hhcmFjdGVyX2NoZWNrKHRleHQsICJceEMzXHhBOSIpOworfQorRU5EX1RFU1QKKworLyogVGVzdCB0aGF0IG5vIGVycm9yIGlzIHJlcG9ydGVkIGZvciB1bmtub3duIGVudGl0aWVzIGlmIHdlIGRvbid0CisgICByZWFkIGFuIGV4dGVybmFsIHN1YnNldC4gIFRoaXMgd2FzIGZpeGVkIGluIEV4cGF0IDEuOTUuNS4KKyovCitTVEFSVF9URVNUKHRlc3Rfd2ZjX3VuZGVjbGFyZWRfZW50aXR5X3VucmVhZF9leHRlcm5hbF9zdWJzZXQpIHsKKyAgICBjaGFyICp0ZXh0ID0KKyAgICAgICAgIjwhRE9DVFlQRSBkb2MgU1lTVEVNICdmb28nPlxuIgorICAgICAgICAiPGRvYz4mZW50aXR5OzwvZG9jPiI7CisKKyAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKKyAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKK30KK0VORF9URVNUCisKKy8qIFRlc3QgdGhhdCBhbiBlcnJvciBpcyByZXBvcnRlZCBmb3IgdW5rbm93biBlbnRpdGllcyBpZiB3ZSBkb24ndAorICAgaGF2ZSBhbiBleHRlcm5hbCBzdWJzZXQuCisqLworU1RBUlRfVEVTVCh0ZXN0X3dmY191bmRlY2xhcmVkX2VudGl0eV9ub19leHRlcm5hbF9zdWJzZXQpIHsKKyAgICBleHBlY3RfZmFpbHVyZSgiPGRvYz4mZW50aXR5OzwvZG9jPiIsCisgICAgICAgICAgICAgICAgICAgWE1MX0VSUk9SX1VOREVGSU5FRF9FTlRJVFksCisgICAgICAgICAgICAgICAgICAgIlBhcnNlciBkaWQgbm90IHJlcG9ydCB1bmRlZmluZWQgZW50aXR5IHcvb3V0IGEgRFRELiIpOworfQorRU5EX1RFU1QKKworLyogVGVzdCB0aGF0IGFuIGVycm9yIGlzIHJlcG9ydGVkIGZvciB1bmtub3duIGVudGl0aWVzIGlmIHdlIGRvbid0CisgICByZWFkIGFuIGV4dGVybmFsIHN1YnNldCwgYnV0IGhhdmUgYmVlbiBkZWNsYXJlZCBzdGFuZGFsb25lLgorKi8KK1NUQVJUX1RFU1QodGVzdF93ZmNfdW5kZWNsYXJlZF9lbnRpdHlfc3RhbmRhbG9uZSkgeworICAgIGNoYXIgKnRleHQgPQorICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXMtYXNjaWknIHN0YW5kYWxvbmU9J3llcyc/PlxuIgorICAgICAgICAiPCFET0NUWVBFIGRvYyBTWVNURU0gJ2Zvbyc+XG4iCisgICAgICAgICI8ZG9jPiZlbnRpdHk7PC9kb2M+IjsKKworICAgIGV4cGVjdF9mYWlsdXJlKHRleHQsCisgICAgICAgICAgICAgICAgICAgWE1MX0VSUk9SX1VOREVGSU5FRF9FTlRJVFksCisgICAgICAgICAgICAgICAgICAgIlBhcnNlciBkaWQgbm90IHJlcG9ydCB1bmRlZmluZWQgZW50aXR5IChzdGFuZGFsb25lKS4iKTsKK30KK0VORF9URVNUCisKK3N0YXRpYyBpbnQgWE1MQ0FMTAorZXh0ZXJuYWxfZW50aXR5X2xvYWRlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqc3lzdGVtSWQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJsaWNJZCkKK3sKKyAgICBjaGFyICp0ZXh0ID0gKGNoYXIgKilYTUxfR2V0VXNlckRhdGEocGFyc2VyKTsKKyAgICBYTUxfUGFyc2VyIGV4dHBhcnNlcjsKKworICAgIGV4dHBhcnNlciA9IFhNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZShwYXJzZXIsIGNvbnRleHQsIE5VTEwpOworICAgIGlmIChleHRwYXJzZXIgPT0gTlVMTCkKKyAgICAgICAgZmFpbCgiQ291bGQgbm90IGNyZWF0ZSBleHRlcm5hbCBlbnRpdHkgcGFyc2VyLiIpOworICAgIGlmICggIFhNTF9QYXJzZShleHRwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpCisgICAgICAgICAgPT0gWE1MX1NUQVRVU19FUlJPUikgeworICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOworICAgICAgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIFhNTF9TVEFUVVNfT0s7Cit9CisKKy8qIFRlc3QgdGhhdCBhbiBlcnJvciBpcyByZXBvcnRlZCBmb3IgdW5rbm93biBlbnRpdGllcyBpZiB3ZSBoYXZlIHJlYWQKKyAgIGFuIGV4dGVybmFsIHN1YnNldCwgYW5kIHN0YW5kYWxvbmUgaXMgdHJ1ZS4KKyovCitTVEFSVF9URVNUKHRlc3Rfd2ZjX3VuZGVjbGFyZWRfZW50aXR5X3dpdGhfZXh0ZXJuYWxfc3Vic2V0X3N0YW5kYWxvbmUpIHsKKyAgICBjaGFyICp0ZXh0ID0KKyAgICAgICAgIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3VzLWFzY2lpJyBzdGFuZGFsb25lPSd5ZXMnPz5cbiIKKyAgICAgICAgIjwhRE9DVFlQRSBkb2MgU1lTVEVNICdmb28nPlxuIgorICAgICAgICAiPGRvYz4mZW50aXR5OzwvZG9jPiI7CisgICAgY2hhciAqZm9vX3RleHQgPQorICAgICAgICAiPCFFTEVNRU5UIGRvYyAoI1BDREFUQSkqPiI7CisKKyAgICBYTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nKHBhcnNlciwgWE1MX1BBUkFNX0VOVElUWV9QQVJTSU5HX0FMV0FZUyk7CisgICAgWE1MX1NldFVzZXJEYXRhKHBhcnNlciwgZm9vX3RleHQpOworICAgIFhNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIocGFyc2VyLCBleHRlcm5hbF9lbnRpdHlfbG9hZGVyKTsKKyAgICBleHBlY3RfZmFpbHVyZSh0ZXh0LAorICAgICAgICAgICAgICAgICAgIFhNTF9FUlJPUl9VTkRFRklORURfRU5USVRZLAorICAgICAgICAgICAgICAgICAgICJQYXJzZXIgZGlkIG5vdCByZXBvcnQgdW5kZWZpbmVkIGVudGl0eSAoZXh0ZXJuYWwgRFREKS4iKTsKK30KK0VORF9URVNUCisKKy8qIFRlc3QgdGhhdCBubyBlcnJvciBpcyByZXBvcnRlZCBmb3IgdW5rbm93biBlbnRpdGllcyBpZiB3ZSBoYXZlIHJlYWQKKyAgIGFuIGV4dGVybmFsIHN1YnNldCwgYW5kIHN0YW5kYWxvbmUgaXMgZmFsc2UuCisqLworU1RBUlRfVEVTVCh0ZXN0X3dmY191bmRlY2xhcmVkX2VudGl0eV93aXRoX2V4dGVybmFsX3N1YnNldCkgeworICAgIGNoYXIgKnRleHQgPQorICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXMtYXNjaWknPz5cbiIKKyAgICAgICAgIjwhRE9DVFlQRSBkb2MgU1lTVEVNICdmb28nPlxuIgorICAgICAgICAiPGRvYz4mZW50aXR5OzwvZG9jPiI7CisgICAgY2hhciAqZm9vX3RleHQgPQorICAgICAgICAiPCFFTEVNRU5UIGRvYyAoI1BDREFUQSkqPiI7CisKKyAgICBYTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nKHBhcnNlciwgWE1MX1BBUkFNX0VOVElUWV9QQVJTSU5HX0FMV0FZUyk7CisgICAgWE1MX1NldFVzZXJEYXRhKHBhcnNlciwgZm9vX3RleHQpOworICAgIFhNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIocGFyc2VyLCBleHRlcm5hbF9lbnRpdHlfbG9hZGVyKTsKKyAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKKyAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKK30KK0VORF9URVNUCisKK1NUQVJUX1RFU1QodGVzdF93ZmNfbm9fcmVjdXJzaXZlX2VudGl0eV9yZWZzKQoreworICAgIGNoYXIgKnRleHQgPQorICAgICAgICAiPCFET0NUWVBFIGRvYyBbXG4iCisgICAgICAgICIgIDwhRU5USVRZIGVudGl0eSAnJiMzODtlbnRpdHk7Jz5cbiIKKyAgICAgICAgIl0+XG4iCisgICAgICAgICI8ZG9jPiZlbnRpdHk7PC9kb2M+IjsKKworICAgIGV4cGVjdF9mYWlsdXJlKHRleHQsCisgICAgICAgICAgICAgICAgICAgWE1MX0VSUk9SX1JFQ1VSU0lWRV9FTlRJVFlfUkVGLAorICAgICAgICAgICAgICAgICAgICJQYXJzZXIgZGlkIG5vdCByZXBvcnQgcmVjdXJzaXZlIGVudGl0eSByZWZlcmVuY2UuIik7Cit9CitFTkRfVEVTVAorCisvKiBSZWdyZXNzaW9uIHRlc3QgZm9yIFNGIGJ1ZyAjNDgzNTE0LiAqLworU1RBUlRfVEVTVCh0ZXN0X2R0ZF9kZWZhdWx0X2hhbmRsaW5nKQoreworICAgIGNoYXIgKnRleHQgPQorICAgICAgICAiPCFET0NUWVBFIGRvYyBbXG4iCisgICAgICAgICI8IUVOVElUWSBlIFNZU1RFTSAnaHR0cDovL3htbC5saWJleHBhdC5vcmcvZSc+XG4iCisgICAgICAgICI8IU5PVEFUSU9OIG4gU1lTVEVNICdodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy9uJz5cbiIKKyAgICAgICAgIjwhRUxFTUVOVCBkb2MgRU1QVFk+XG4iCisgICAgICAgICI8IUFUVExJU1QgZG9jIGEgQ0RBVEEgI0lNUExJRUQ+XG4iCisgICAgICAgICI8P3BpIGluIGR0ZD8+XG4iCisgICAgICAgICI8IS0tY29tbWVudCBpbiBkdGQtLT5cbiIKKyAgICAgICAgIl0+PGRvYy8+IjsKKworICAgIFhNTF9TZXREZWZhdWx0SGFuZGxlcihwYXJzZXIsIGFjY3VtdWxhdGVfY2hhcmFjdGVycyk7CisgICAgWE1MX1NldERvY3R5cGVEZWNsSGFuZGxlcihwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1teV9zdGFydF9kb2N0eXBlX2hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1teV9lbmRfZG9jdHlwZV9oYW5kbGVyKTsKKyAgICBYTUxfU2V0RW50aXR5RGVjbEhhbmRsZXIocGFyc2VyLCBkdW1teV9lbnRpdHlfZGVjbF9oYW5kbGVyKTsKKyAgICBYTUxfU2V0Tm90YXRpb25EZWNsSGFuZGxlcihwYXJzZXIsIGR1bW15X25vdGF0aW9uX2RlY2xfaGFuZGxlcik7CisgICAgWE1MX1NldEVsZW1lbnREZWNsSGFuZGxlcihwYXJzZXIsIGR1bW15X2VsZW1lbnRfZGVjbF9oYW5kbGVyKTsKKyAgICBYTUxfU2V0QXR0bGlzdERlY2xIYW5kbGVyKHBhcnNlciwgZHVtbXlfYXR0bGlzdF9kZWNsX2hhbmRsZXIpOworICAgIFhNTF9TZXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyKHBhcnNlciwgZHVtbXlfcGlfaGFuZGxlcik7CisgICAgWE1MX1NldENvbW1lbnRIYW5kbGVyKHBhcnNlciwgZHVtbXlfY29tbWVudF9oYW5kbGVyKTsKKyAgICBydW5fY2hhcmFjdGVyX2NoZWNrKHRleHQsICJcblxuXG5cblxuXG5cbjxkb2MvPiIpOworfQorRU5EX1RFU1QKKworLyogU2VlIHJlbGF0ZWQgU0YgYnVnICM2NzM3OTEuCisgICBXaGVuIG5hbWVzcGFjZSBwcm9jZXNzaW5nIGlzIGVuYWJsZWQsIHNldHRpbmcgdGhlIG5hbWVzcGFjZSBVUkkgZm9yCisgICBhIHByZWZpeCBpcyBub3QgYWxsb3dlZDsgdGhpcyB0ZXN0IGVuc3VyZXMgdGhhdCBpdCAqaXMqIGFsbG93ZWQKKyAgIHdoZW4gbmFtZXNwYWNlIHByb2Nlc3NpbmcgaXMgbm90IGVuYWJsZWQuCisgICAoU2VlIE5hbWVzcGFjZXMgaW4gWE1MLCBzZWN0aW9uIDIuKQorKi8KK1NUQVJUX1RFU1QodGVzdF9lbXB0eV9uc193aXRob3V0X25hbWVzcGFjZXMpCit7CisgICAgY2hhciAqdGV4dCA9CisgICAgICAgICI8ZG9jIHhtbG5zOnByZWZpeD0naHR0cDovL3d3dy5leGFtcGxlLmNvbS8nPlxuIgorICAgICAgICAiICA8ZSB4bWxuczpwcmVmaXg9JycvPlxuIgorICAgICAgICAiPC9kb2M+IjsKKworICAgIGlmIChYTUxfUGFyc2UocGFyc2VyLCB0ZXh0LCBzdHJsZW4odGV4dCksIFhNTF9UUlVFKSA9PSBYTUxfU1RBVFVTX0VSUk9SKQorICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOworfQorRU5EX1RFU1QKKworLyogUmVncmVzc2lvbiB0ZXN0IGZvciBTRiBidWcgIzgyNDQyMC4KKyAgIENoZWNrcyB0aGF0IGFuIHhtbG5zOnByZWZpeCBhdHRyaWJ1dGUgc2V0IGluIGFuIGF0dHJpYnV0ZSdzIGRlZmF1bHQKKyAgIHZhbHVlIGlzbid0IG1pc2ludGVycHJldGVkLgorKi8KK1NUQVJUX1RFU1QodGVzdF9uc19pbl9hdHRyaWJ1dGVfZGVmYXVsdF93aXRob3V0X25hbWVzcGFjZXMpCit7CisgICAgY2hhciAqdGV4dCA9CisgICAgICAgICI8IURPQ1RZUEUgZTplbGVtZW50IFtcbiIKKyAgICAgICAgIiAgPCFBVFRMSVNUIGU6ZWxlbWVudFxuIgorICAgICAgICAiICAgIHhtbG5zOmUgQ0RBVEEgJ2h0dHA6Ly9leGFtcGxlLmNvbS8nPlxuIgorICAgICAgICAiICAgICAgXT5cbiIKKyAgICAgICAgIjxlOmVsZW1lbnQvPiI7CisKKyAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKKyAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKK30KK0VORF9URVNUCisKK3N0YXRpYyBjaGFyICpsb25nX2NoYXJhY3Rlcl9kYXRhX3RleHQgPQorICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc28tODg1OS0xJz8+PHM+IgorICAgICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkiCisgICAgIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIKKyAgICAiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IgorICAgICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkiCisgICAgIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIKKyAgICAiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IgorICAgICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkiCisgICAgIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIKKyAgICAiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IgorICAgICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkiCisgICAgIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIKKyAgICAiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IgorICAgICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkiCisgICAgIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIKKyAgICAiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IgorICAgICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkiCisgICAgIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIKKyAgICAiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IgorICAgICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkiCisgICAgIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIKKyAgICAiPC9zPiI7CisKK3N0YXRpYyBYTUxfQm9vbCByZXN1bWFibGUgPSBYTUxfRkFMU0U7CisKK3N0YXRpYyB2b2lkCitjbGVhcmluZ19hYm9ydGluZ19jaGFyYWN0ZXJfaGFuZGxlcih2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzLCBpbnQgbGVuKQoreworICAgIFhNTF9TdG9wUGFyc2VyKHBhcnNlciwgcmVzdW1hYmxlKTsKKyAgICBYTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXIocGFyc2VyLCBOVUxMKTsKK30KKworLyogUmVncmVzc2lvbiB0ZXN0IGZvciBTRiBidWcgIzE1MTUyNjY6IG1pc3NpbmcgY2hlY2sgb2Ygc3RvcHBlZAorICAgcGFyc2VyIGluIGRvQ29udGV4dCgpICdmb3InIGxvb3AuICovCitTVEFSVF9URVNUKHRlc3Rfc3RvcF9wYXJzZXJfYmV0d2Vlbl9jaGFyX2RhdGFfY2FsbHMpCit7CisgICAgLyogVGhlIHNhbXBsZSBkYXRhIG11c3QgYmUgYmlnIGVub3VnaCB0aGF0IHRoZXJlIGFyZSB0d28gY2FsbHMgdG8KKyAgICAgICB0aGUgY2hhcmFjdGVyIGRhdGEgaGFuZGxlciBmcm9tIHdpdGhpbiB0aGUgaW5uZXIgImZvciIgbG9vcCBvZgorICAgICAgIHRoZSBYTUxfVE9LX0RBVEFfQ0hBUlMgY2FzZSBpbiBkb0NvbnRlbnQoKSwgYW5kIHRoZSBjaGFyYWN0ZXIKKyAgICAgICBoYW5kbGVyIG11c3Qgc3RvcCB0aGUgcGFyc2VyIGFuZCBjbGVhciB0aGUgY2hhcmFjdGVyIGRhdGEKKyAgICAgICBoYW5kbGVyLgorICAgICovCisgICAgY2hhciAqdGV4dCA9IGxvbmdfY2hhcmFjdGVyX2RhdGFfdGV4dDsKKworICAgIFhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcihwYXJzZXIsIGNsZWFyaW5nX2Fib3J0aW5nX2NoYXJhY3Rlcl9oYW5kbGVyKTsKKyAgICByZXN1bWFibGUgPSBYTUxfRkFMU0U7CisgICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpICE9IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7CisgICAgaWYgKFhNTF9HZXRFcnJvckNvZGUocGFyc2VyKSAhPSBYTUxfRVJST1JfQUJPUlRFRCkKKyAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKK30KK0VORF9URVNUCisKKy8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICMxNTE1MjY2OiBtaXNzaW5nIGNoZWNrIG9mIHN0b3BwZWQKKyAgIHBhcnNlciBpbiBkb0NvbnRleHQoKSAnZm9yJyBsb29wLiAqLworU1RBUlRfVEVTVCh0ZXN0X3N1c3BlbmRfcGFyc2VyX2JldHdlZW5fY2hhcl9kYXRhX2NhbGxzKQoreworICAgIC8qIFRoZSBzYW1wbGUgZGF0YSBtdXN0IGJlIGJpZyBlbm91Z2ggdGhhdCB0aGVyZSBhcmUgdHdvIGNhbGxzIHRvCisgICAgICAgdGhlIGNoYXJhY3RlciBkYXRhIGhhbmRsZXIgZnJvbSB3aXRoaW4gdGhlIGlubmVyICJmb3IiIGxvb3Agb2YKKyAgICAgICB0aGUgWE1MX1RPS19EQVRBX0NIQVJTIGNhc2UgaW4gZG9Db250ZW50KCksIGFuZCB0aGUgY2hhcmFjdGVyCisgICAgICAgaGFuZGxlciBtdXN0IHN0b3AgdGhlIHBhcnNlciBhbmQgY2xlYXIgdGhlIGNoYXJhY3RlciBkYXRhCisgICAgICAgaGFuZGxlci4KKyAgICAqLworICAgIGNoYXIgKnRleHQgPSBsb25nX2NoYXJhY3Rlcl9kYXRhX3RleHQ7CisKKyAgICBYTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXIocGFyc2VyLCBjbGVhcmluZ19hYm9ydGluZ19jaGFyYWN0ZXJfaGFuZGxlcik7CisgICAgcmVzdW1hYmxlID0gWE1MX1RSVUU7CisgICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpICE9IFhNTF9TVEFUVVNfU1VTUEVOREVEKQorICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOworICAgIGlmIChYTUxfR2V0RXJyb3JDb2RlKHBhcnNlcikgIT0gWE1MX0VSUk9SX05PTkUpCisgICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7Cit9CitFTkRfVEVTVAorCisKKy8qCisgKiBOYW1lc3BhY2VzIHRlc3RzLgorICovCisKK3N0YXRpYyB2b2lkCituYW1lc3BhY2Vfc2V0dXAodm9pZCkKK3sKKyAgICBwYXJzZXIgPSBYTUxfUGFyc2VyQ3JlYXRlTlMoTlVMTCwgJyAnKTsKKyAgICBpZiAocGFyc2VyID09IE5VTEwpCisgICAgICAgIGZhaWwoIlBhcnNlciBub3QgY3JlYXRlZC4iKTsKK30KKworc3RhdGljIHZvaWQKK25hbWVzcGFjZV90ZWFyZG93bih2b2lkKQoreworICAgIGJhc2ljX3RlYXJkb3duKCk7Cit9CisKKy8qIENoZWNrIHRoYXQgYW4gZWxlbWVudCBuYW1lIGFuZCBhdHRyaWJ1dGUgbmFtZSBtYXRjaCB0aGUgZXhwZWN0ZWQgdmFsdWVzLgorICAgVGhlIGV4cGVjdGVkIHZhbHVlcyBhcmUgcGFzc2VkIGFzIGFuIGFycmF5IHJlZmVyZW5jZSBvZiBzdHJpbmcgcG9pbnRlcnMKKyAgIHByb3ZpZGVkIGFzIHRoZSB1c2VyRGF0YSBhcmd1bWVudDsgdGhlIGZpcnN0IGlzIHRoZSBleHBlY3RlZAorICAgZWxlbWVudCBuYW1lLCBhbmQgdGhlIHNlY29uZCBpcyB0aGUgZXhwZWN0ZWQgYXR0cmlidXRlIG5hbWUuCisqLworc3RhdGljIHZvaWQgWE1MQ0FMTAordHJpcGxldF9zdGFydF9jaGVja2VyKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqKmF0dHMpCit7CisgICAgY2hhciAqKmVsZW1zdHIgPSAoY2hhciAqKil1c2VyRGF0YTsKKyAgICBjaGFyIGJ1ZmZlclsxMDI0XTsKKyAgICBpZiAoc3RyY21wKGVsZW1zdHJbMF0sIG5hbWUpICE9IDApIHsKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICJ1bmV4cGVjdGVkIHN0YXJ0IHN0cmluZzogJyVzJyIsIG5hbWUpOworICAgICAgICBmYWlsKGJ1ZmZlcik7CisgICAgfQorICAgIGlmIChzdHJjbXAoZWxlbXN0clsxXSwgYXR0c1swXSkgIT0gMCkgeworICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgInVuZXhwZWN0ZWQgYXR0cmlidXRlIHN0cmluZzogJyVzJyIsIGF0dHNbMF0pOworICAgICAgICBmYWlsKGJ1ZmZlcik7CisgICAgfQorfQorCisvKiBDaGVjayB0aGF0IHRoZSBlbGVtZW50IG5hbWUgcGFzc2VkIHRvIHRoZSBlbmQtZWxlbWVudCBoYW5kbGVyIG1hdGNoZXMKKyAgIHRoZSBleHBlY3RlZCB2YWx1ZS4gIFRoZSBleHBlY3RlZCB2YWx1ZSBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IGVsZW1lbnQKKyAgIGluIGFuIGFycmF5IG9mIHN0cmluZ3MgcGFzc2VkIGFzIHRoZSB1c2VyRGF0YSBhcmd1bWVudC4KKyovCitzdGF0aWMgdm9pZCBYTUxDQUxMCit0cmlwbGV0X2VuZF9jaGVja2VyKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqbmFtZSkKK3sKKyAgICBjaGFyICoqZWxlbXN0ciA9IChjaGFyICoqKXVzZXJEYXRhOworICAgIGlmIChzdHJjbXAoZWxlbXN0clswXSwgbmFtZSkgIT0gMCkgeworICAgICAgICBjaGFyIGJ1ZmZlclsxMDI0XTsKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICJ1bmV4cGVjdGVkIGVuZCBzdHJpbmc6ICclcyciLCBuYW1lKTsKKyAgICAgICAgZmFpbChidWZmZXIpOworICAgIH0KK30KKworU1RBUlRfVEVTVCh0ZXN0X3JldHVybl9uc190cmlwbGV0KQoreworICAgIGNoYXIgKnRleHQgPQorICAgICAgICAiPGZvbzplIHhtbG5zOmZvbz0naHR0cDovL2V4cGF0LnNmLm5ldC8nIGJhcjphPScxMidcbiIKKyAgICAgICAgIiAgICAgICB4bWxuczpiYXI9J2h0dHA6Ly9leHBhdC5zZi5uZXQvJz48L2ZvbzplPiI7CisgICAgY2hhciAqZWxlbXN0cltdID0geworICAgICAgICAiaHR0cDovL2V4cGF0LnNmLm5ldC8gZSBmb28iLAorICAgICAgICAiaHR0cDovL2V4cGF0LnNmLm5ldC8gYSBiYXIiCisgICAgfTsKKyAgICBYTUxfU2V0UmV0dXJuTlNUcmlwbGV0KHBhcnNlciwgWE1MX1RSVUUpOworICAgIFhNTF9TZXRVc2VyRGF0YShwYXJzZXIsIGVsZW1zdHIpOworICAgIFhNTF9TZXRFbGVtZW50SGFuZGxlcihwYXJzZXIsIHRyaXBsZXRfc3RhcnRfY2hlY2tlciwgdHJpcGxldF9lbmRfY2hlY2tlcik7CisgICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7Cit9CitFTkRfVEVTVAorCitzdGF0aWMgdm9pZCBYTUxDQUxMCitvdmVyd3JpdGVfc3RhcnRfY2hlY2tlcih2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqKmF0dHMpCit7CisgICAgQ2hhckRhdGEgKnN0b3JhZ2UgPSAoQ2hhckRhdGEgKikgdXNlckRhdGE7CisgICAgQ2hhckRhdGFfQXBwZW5kU3RyaW5nKHN0b3JhZ2UsICJzdGFydCAiKTsKKyAgICBDaGFyRGF0YV9BcHBlbmRYTUxDaGFycyhzdG9yYWdlLCBuYW1lLCAtMSk7CisgICAgd2hpbGUgKCphdHRzICE9IE5VTEwpIHsKKyAgICAgICAgQ2hhckRhdGFfQXBwZW5kU3RyaW5nKHN0b3JhZ2UsICJcbmF0dHJpYnV0ZSAiKTsKKyAgICAgICAgQ2hhckRhdGFfQXBwZW5kWE1MQ2hhcnMoc3RvcmFnZSwgKmF0dHMsIC0xKTsKKyAgICAgICAgYXR0cyArPSAyOworICAgIH0KKyAgICBDaGFyRGF0YV9BcHBlbmRTdHJpbmcoc3RvcmFnZSwgIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIFhNTENBTEwKK292ZXJ3cml0ZV9lbmRfY2hlY2tlcih2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKm5hbWUpCit7CisgICAgQ2hhckRhdGEgKnN0b3JhZ2UgPSAoQ2hhckRhdGEgKikgdXNlckRhdGE7CisgICAgQ2hhckRhdGFfQXBwZW5kU3RyaW5nKHN0b3JhZ2UsICJlbmQgIik7CisgICAgQ2hhckRhdGFfQXBwZW5kWE1MQ2hhcnMoc3RvcmFnZSwgbmFtZSwgLTEpOworICAgIENoYXJEYXRhX0FwcGVuZFN0cmluZyhzdG9yYWdlLCAiXG4iKTsKK30KKworc3RhdGljIHZvaWQKK3J1bl9uc190YWduYW1lX292ZXJ3cml0ZV90ZXN0KGNoYXIgKnRleHQsIGNoYXIgKnJlc3VsdCkKK3sKKyAgICBDaGFyRGF0YSBzdG9yYWdlOworICAgIENoYXJEYXRhX0luaXQoJnN0b3JhZ2UpOworICAgIFhNTF9TZXRVc2VyRGF0YShwYXJzZXIsICZzdG9yYWdlKTsKKyAgICBYTUxfU2V0RWxlbWVudEhhbmRsZXIocGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdGVfc3RhcnRfY2hlY2tlciwgb3ZlcndyaXRlX2VuZF9jaGVja2VyKTsKKyAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKKyAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKKyAgICBDaGFyRGF0YV9DaGVja1N0cmluZygmc3RvcmFnZSwgcmVzdWx0KTsKK30KKworLyogUmVncmVzc2lvbiB0ZXN0IGZvciBTRiBidWcgIzU2NjMzNC4gKi8KK1NUQVJUX1RFU1QodGVzdF9uc190YWduYW1lX292ZXJ3cml0ZSkKK3sKKyAgICBjaGFyICp0ZXh0ID0KKyAgICAgICAgIjxuOmUgeG1sbnM6bj0naHR0cDovL3htbC5saWJleHBhdC5vcmcvJz5cbiIKKyAgICAgICAgIiAgPG46ZiBuOmF0dHI9J2ZvbycvPlxuIgorICAgICAgICAiICA8bjpnIG46YXR0cjI9J2JhcicvPlxuIgorICAgICAgICAiPC9uOmU+IjsKKyAgICBjaGFyICpyZXN1bHQgPQorICAgICAgICAic3RhcnQgaHR0cDovL3htbC5saWJleHBhdC5vcmcvIGVcbiIKKyAgICAgICAgInN0YXJ0IGh0dHA6Ly94bWwubGliZXhwYXQub3JnLyBmXG4iCisgICAgICAgICJhdHRyaWJ1dGUgaHR0cDovL3htbC5saWJleHBhdC5vcmcvIGF0dHJcbiIKKyAgICAgICAgImVuZCBodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy8gZlxuIgorICAgICAgICAic3RhcnQgaHR0cDovL3htbC5saWJleHBhdC5vcmcvIGdcbiIKKyAgICAgICAgImF0dHJpYnV0ZSBodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy8gYXR0cjJcbiIKKyAgICAgICAgImVuZCBodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy8gZ1xuIgorICAgICAgICAiZW5kIGh0dHA6Ly94bWwubGliZXhwYXQub3JnLyBlXG4iOworICAgIHJ1bl9uc190YWduYW1lX292ZXJ3cml0ZV90ZXN0KHRleHQsIHJlc3VsdCk7Cit9CitFTkRfVEVTVAorCisvKiBSZWdyZXNzaW9uIHRlc3QgZm9yIFNGIGJ1ZyAjNTY2MzM0LiAqLworU1RBUlRfVEVTVCh0ZXN0X25zX3RhZ25hbWVfb3ZlcndyaXRlX3RyaXBsZXQpCit7CisgICAgY2hhciAqdGV4dCA9CisgICAgICAgICI8bjplIHhtbG5zOm49J2h0dHA6Ly94bWwubGliZXhwYXQub3JnLyc+XG4iCisgICAgICAgICIgIDxuOmYgbjphdHRyPSdmb28nLz5cbiIKKyAgICAgICAgIiAgPG46ZyBuOmF0dHIyPSdiYXInLz5cbiIKKyAgICAgICAgIjwvbjplPiI7CisgICAgY2hhciAqcmVzdWx0ID0KKyAgICAgICAgInN0YXJ0IGh0dHA6Ly94bWwubGliZXhwYXQub3JnLyBlIG5cbiIKKyAgICAgICAgInN0YXJ0IGh0dHA6Ly94bWwubGliZXhwYXQub3JnLyBmIG5cbiIKKyAgICAgICAgImF0dHJpYnV0ZSBodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy8gYXR0ciBuXG4iCisgICAgICAgICJlbmQgaHR0cDovL3htbC5saWJleHBhdC5vcmcvIGYgblxuIgorICAgICAgICAic3RhcnQgaHR0cDovL3htbC5saWJleHBhdC5vcmcvIGcgblxuIgorICAgICAgICAiYXR0cmlidXRlIGh0dHA6Ly94bWwubGliZXhwYXQub3JnLyBhdHRyMiBuXG4iCisgICAgICAgICJlbmQgaHR0cDovL3htbC5saWJleHBhdC5vcmcvIGcgblxuIgorICAgICAgICAiZW5kIGh0dHA6Ly94bWwubGliZXhwYXQub3JnLyBlIG5cbiI7CisgICAgWE1MX1NldFJldHVybk5TVHJpcGxldChwYXJzZXIsIFhNTF9UUlVFKTsKKyAgICBydW5fbnNfdGFnbmFtZV9vdmVyd3JpdGVfdGVzdCh0ZXh0LCByZXN1bHQpOworfQorRU5EX1RFU1QKKworCisvKiBSZWdyZXNzaW9uIHRlc3QgZm9yIFNGIGJ1ZyAjNjIwMzQzLiAqLworc3RhdGljIHZvaWQgWE1MQ0FMTAorc3RhcnRfZWxlbWVudF9mYWlsKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lLCBjb25zdCBYTUxfQ2hhciAqKmF0dHMpCit7CisgICAgLyogV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLiAqLworICAgIGZhaWwoInNob3VsZCBuZXZlciByZWFjaCBzdGFydF9lbGVtZW50X2ZhaWwoKSIpOworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCitzdGFydF9uc19jbGVhcmluZ19zdGFydF9lbGVtZW50KHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqdXJpKQoreworICAgIFhNTF9TZXRTdGFydEVsZW1lbnRIYW5kbGVyKChYTUxfUGFyc2VyKSB1c2VyRGF0YSwgTlVMTCk7Cit9CisKK1NUQVJUX1RFU1QodGVzdF9zdGFydF9uc19jbGVhcnNfc3RhcnRfZWxlbWVudCkKK3sKKyAgICAvKiBUaGlzIG5lZWRzIHRvIHVzZSBzZXBhcmF0ZSBzdGFydC9lbmQgdGFnczsgdXNpbmcgdGhlIGVtcHR5IHRhZworICAgICAgIHN5bnRheCBkb2Vzbid0IGNhdXNlIHRoZSBwcm9ibGVtYXRpYyBwYXRoIHRocm91Z2ggRXhwYXQgdG8gYmUKKyAgICAgICB0YWtlbi4KKyAgICAqLworICAgIGNoYXIgKnRleHQgPSAiPGUgeG1sbnM9J2h0dHA6Ly94bWwubGliZXhwYXQub3JnLyc+PC9lPiI7CisKKyAgICBYTUxfU2V0U3RhcnRFbGVtZW50SGFuZGxlcihwYXJzZXIsIHN0YXJ0X2VsZW1lbnRfZmFpbCk7CisgICAgWE1MX1NldFN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIocGFyc2VyLCBzdGFydF9uc19jbGVhcmluZ19zdGFydF9lbGVtZW50KTsKKyAgICBYTUxfVXNlUGFyc2VyQXNIYW5kbGVyQXJnKHBhcnNlcik7CisgICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7Cit9CitFTkRfVEVTVAorCisvKiBSZWdyZXNzaW9uIHRlc3QgZm9yIFNGIGJ1ZyAjNjE2ODYzLiAqLworc3RhdGljIGludCBYTUxDQUxMCitleHRlcm5hbF9lbnRpdHlfaGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqc3lzdGVtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHVibGljSWQpIAoreworICAgIGxvbmcgY2FsbG5vID0gMSArIChsb25nKVhNTF9HZXRVc2VyRGF0YShwYXJzZXIpOworICAgIGNoYXIgKnRleHQ7CisgICAgWE1MX1BhcnNlciBwMjsKKworICAgIGlmIChjYWxsbm8gPT0gMSkKKyAgICAgICAgdGV4dCA9ICgiPCFFTEVNRU5UIGRvYyAoZSspPlxuIgorICAgICAgICAgICAgICAgICI8IUFUVExJU1QgZG9jIHhtbG5zIENEQVRBICNJTVBMSUVEPlxuIgorICAgICAgICAgICAgICAgICI8IUVMRU1FTlQgZSBFTVBUWT5cbiIpOworICAgIGVsc2UKKyAgICAgICAgdGV4dCA9ICgiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXMtYXNjaWknPz4iCisgICAgICAgICAgICAgICAgIjxlLz4iKTsKKworICAgIFhNTF9TZXRVc2VyRGF0YShwYXJzZXIsICh2b2lkICopIGNhbGxubyk7CisgICAgcDIgPSBYTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUocGFyc2VyLCBjb250ZXh0LCBOVUxMKTsKKyAgICBpZiAoWE1MX1BhcnNlKHAyLCB0ZXh0LCBzdHJsZW4odGV4dCksIFhNTF9UUlVFKSA9PSBYTUxfU1RBVFVTX0VSUk9SKSB7CisgICAgICAgIHhtbF9mYWlsdXJlKHAyKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIFhNTF9QYXJzZXJGcmVlKHAyKTsKKyAgICByZXR1cm4gMTsKK30KKworU1RBUlRfVEVTVCh0ZXN0X2RlZmF1bHRfbnNfZnJvbV9leHRfc3Vic2V0X2FuZF9leHRfZ2UpCit7CisgICAgY2hhciAqdGV4dCA9CisgICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnPz5cbiIKKyAgICAgICAgIjwhRE9DVFlQRSBkb2MgU1lTVEVNICdodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy9kb2MuZHRkJyBbXG4iCisgICAgICAgICIgIDwhRU5USVRZIGVuIFNZU1RFTSAnaHR0cDovL3htbC5saWJleHBhdC5vcmcvZW50aXR5LmVudCc+XG4iCisgICAgICAgICJdPlxuIgorICAgICAgICAiPGRvYyB4bWxucz0naHR0cDovL3htbC5saWJleHBhdC5vcmcvbnMxJz5cbiIKKyAgICAgICAgIiZlbjtcbiIKKyAgICAgICAgIjwvZG9jPiI7CisKKyAgICBYTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nKHBhcnNlciwgWE1MX1BBUkFNX0VOVElUWV9QQVJTSU5HX0FMV0FZUyk7CisgICAgWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlcihwYXJzZXIsIGV4dGVybmFsX2VudGl0eV9oYW5kbGVyKTsKKyAgICAvKiBXZSBhY3R1YWxseSBuZWVkIHRvIHNldCB0aGlzIGhhbmRsZXIgdG8gdGlja2xlIHRoaXMgYnVnLiAqLworICAgIFhNTF9TZXRTdGFydEVsZW1lbnRIYW5kbGVyKHBhcnNlciwgZHVtbXlfc3RhcnRfZWxlbWVudCk7CisgICAgWE1MX1NldFVzZXJEYXRhKHBhcnNlciwgTlVMTCk7CisgICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7Cit9CitFTkRfVEVTVAorCisvKiBSZWdyZXNzaW9uIHRlc3QgIzEgZm9yIFNGIGJ1ZyAjNjczNzkxLiAqLworU1RBUlRfVEVTVCh0ZXN0X25zX3ByZWZpeF93aXRoX2VtcHR5X3VyaV8xKQoreworICAgIGNoYXIgKnRleHQgPQorICAgICAgICAiPGRvYyB4bWxuczpwcmVmaXg9J2h0dHA6Ly94bWwubGliZXhwYXQub3JnLyc+XG4iCisgICAgICAgICIgIDxlIHhtbG5zOnByZWZpeD0nJy8+XG4iCisgICAgICAgICI8L2RvYz4iOworCisgICAgZXhwZWN0X2ZhaWx1cmUodGV4dCwKKyAgICAgICAgICAgICAgICAgICBYTUxfRVJST1JfVU5ERUNMQVJJTkdfUFJFRklYLAorICAgICAgICAgICAgICAgICAgICJEaWQgbm90IHJlcG9ydCByZS1zZXR0aW5nIG5hbWVzcGFjZSIKKyAgICAgICAgICAgICAgICAgICAiIFVSSSB3aXRoIHByZWZpeCB0byAnJy4iKTsKK30KK0VORF9URVNUCisKKy8qIFJlZ3Jlc3Npb24gdGVzdCAjMiBmb3IgU0YgYnVnICM2NzM3OTEuICovCitTVEFSVF9URVNUKHRlc3RfbnNfcHJlZml4X3dpdGhfZW1wdHlfdXJpXzIpCit7CisgICAgY2hhciAqdGV4dCA9CisgICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnPz5cbiIKKyAgICAgICAgIjxkb2NlbGVtIHhtbG5zOnByZT0nJy8+IjsKKworICAgIGV4cGVjdF9mYWlsdXJlKHRleHQsCisgICAgICAgICAgICAgICAgICAgWE1MX0VSUk9SX1VOREVDTEFSSU5HX1BSRUZJWCwKKyAgICAgICAgICAgICAgICAgICAiRGlkIG5vdCByZXBvcnQgc2V0dGluZyBuYW1lc3BhY2UgVVJJIHdpdGggcHJlZml4IHRvICcnLiIpOworfQorRU5EX1RFU1QKKworLyogUmVncmVzc2lvbiB0ZXN0ICMzIGZvciBTRiBidWcgIzY3Mzc5MS4gKi8KK1NUQVJUX1RFU1QodGVzdF9uc19wcmVmaXhfd2l0aF9lbXB0eV91cmlfMykKK3sKKyAgICBjaGFyICp0ZXh0ID0KKyAgICAgICAgIjwhRE9DVFlQRSBkb2MgW1xuIgorICAgICAgICAiICA8IUVMRU1FTlQgZG9jIEVNUFRZPlxuIgorICAgICAgICAiICA8IUFUVExJU1QgZG9jXG4iCisgICAgICAgICIgICAgeG1sbnM6cHJlZml4IENEQVRBICcnPlxuIgorICAgICAgICAiXT5cbiIKKyAgICAgICAgIjxkb2MvPiI7CisKKyAgICBleHBlY3RfZmFpbHVyZSh0ZXh0LAorICAgICAgICAgICAgICAgICAgIFhNTF9FUlJPUl9VTkRFQ0xBUklOR19QUkVGSVgsCisgICAgICAgICAgICAgICAgICAgIkRpZG4ndCByZXBvcnQgYXR0ciBkZWZhdWx0IHNldHRpbmcgTlMgdy8gcHJlZml4IHRvICcnLiIpOworfQorRU5EX1RFU1QKKworLyogUmVncmVzc2lvbiB0ZXN0ICM0IGZvciBTRiBidWcgIzY3Mzc5MS4gKi8KK1NUQVJUX1RFU1QodGVzdF9uc19wcmVmaXhfd2l0aF9lbXB0eV91cmlfNCkKK3sKKyAgICBjaGFyICp0ZXh0ID0KKyAgICAgICAgIjwhRE9DVFlQRSBkb2MgW1xuIgorICAgICAgICAiICA8IUVMRU1FTlQgcHJlZml4OmRvYyBFTVBUWT5cbiIKKyAgICAgICAgIiAgPCFBVFRMSVNUIHByZWZpeDpkb2NcbiIKKyAgICAgICAgIiAgICB4bWxuczpwcmVmaXggQ0RBVEEgJ2h0dHA6Ly94bWwubGliZXhwYXQub3JnLyc+XG4iCisgICAgICAgICJdPlxuIgorICAgICAgICAiPHByZWZpeDpkb2MvPiI7CisgICAgLyogUGFja2FnZWQgaW5mbyBleHBlY3RlZCBieSB0aGUgZW5kIGVsZW1lbnQgaGFuZGxlcjsKKyAgICAgICB0aGUgd2VpcmQgc3RydWN0dXJpbmcgbGV0cyB1cyByZS11c2UgdGhlIHRyaXBsZXRfZW5kX2NoZWNrZXIoKQorICAgICAgIGZ1bmN0aW9uIGFsc28gdXNlZCBmb3IgYW5vdGhlciB0ZXN0LiAqLworICAgIGNoYXIgKmVsZW1zdHJbXSA9IHsKKyAgICAgICAgImh0dHA6Ly94bWwubGliZXhwYXQub3JnLyBkb2MgcHJlZml4IgorICAgIH07CisgICAgWE1MX1NldFJldHVybk5TVHJpcGxldChwYXJzZXIsIFhNTF9UUlVFKTsKKyAgICBYTUxfU2V0VXNlckRhdGEocGFyc2VyLCBlbGVtc3RyKTsKKyAgICBYTUxfU2V0RW5kRWxlbWVudEhhbmRsZXIocGFyc2VyLCB0cmlwbGV0X2VuZF9jaGVja2VyKTsKKyAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKKyAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKK30KK0VORF9URVNUCisKK1NUQVJUX1RFU1QodGVzdF9uc19kZWZhdWx0X3dpdGhfZW1wdHlfdXJpKQoreworICAgIGNoYXIgKnRleHQgPQorICAgICAgICAiPGRvYyB4bWxucz0naHR0cDovL3htbC5saWJleHBhdC5vcmcvJz5cbiIKKyAgICAgICAgIiAgPGUgeG1sbnM9JycvPlxuIgorICAgICAgICAiPC9kb2M+IjsKKyAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKKyAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKK30KK0VORF9URVNUCisKKy8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICM2OTI5NjQ6IHR3byBwcmVmaXhlcyBmb3Igb25lIG5hbWVzcGFjZS4gKi8KK1NUQVJUX1RFU1QodGVzdF9uc19kdXBsaWNhdGVfYXR0cnNfZGlmZl9wcmVmaXhlcykKK3sKKyAgICBjaGFyICp0ZXh0ID0KKyAgICAgICAgIjxkb2MgeG1sbnM6YT0naHR0cDovL3htbC5saWJleHBhdC5vcmcvYSdcbiIKKyAgICAgICAgIiAgICAgeG1sbnM6Yj0naHR0cDovL3htbC5saWJleHBhdC5vcmcvYSdcbiIKKyAgICAgICAgIiAgICAgYTphPSd2JyBiOmE9J3YnIC8+IjsKKyAgICBleHBlY3RfZmFpbHVyZSh0ZXh0LAorICAgICAgICAgICAgICAgICAgIFhNTF9FUlJPUl9EVVBMSUNBVEVfQVRUUklCVVRFLAorICAgICAgICAgICAgICAgICAgICJkaWQgbm90IHJlcG9ydCBtdWx0aXBsZSBhdHRyaWJ1dGVzIHdpdGggc2FtZSBVUkkrbmFtZSIpOworfQorRU5EX1RFU1QKKworLyogUmVncmVzc2lvbiB0ZXN0IGZvciBTRiBidWcgIzY5NTQwMTogdW5ib3VuZCBwcmVmaXguICovCitTVEFSVF9URVNUKHRlc3RfbnNfdW5ib3VuZF9wcmVmaXhfb25fYXR0cmlidXRlKQoreworICAgIGNoYXIgKnRleHQgPSAiPGRvYyBhOmF0dHI9JycvPiI7CisgICAgZXhwZWN0X2ZhaWx1cmUodGV4dCwKKyAgICAgICAgICAgICAgICAgICBYTUxfRVJST1JfVU5CT1VORF9QUkVGSVgsCisgICAgICAgICAgICAgICAgICAgImRpZCBub3QgcmVwb3J0IHVuYm91bmQgcHJlZml4IG9uIGF0dHJpYnV0ZSIpOworfQorRU5EX1RFU1QKKworLyogUmVncmVzc2lvbiB0ZXN0IGZvciBTRiBidWcgIzY5NTQwMTogdW5ib3VuZCBwcmVmaXguICovCitTVEFSVF9URVNUKHRlc3RfbnNfdW5ib3VuZF9wcmVmaXhfb25fZWxlbWVudCkKK3sKKyAgICBjaGFyICp0ZXh0ID0gIjxhOmRvYy8+IjsKKyAgICBleHBlY3RfZmFpbHVyZSh0ZXh0LAorICAgICAgICAgICAgICAgICAgIFhNTF9FUlJPUl9VTkJPVU5EX1BSRUZJWCwKKyAgICAgICAgICAgICAgICAgICAiZGlkIG5vdCByZXBvcnQgdW5ib3VuZCBwcmVmaXggb24gZWxlbWVudCIpOworfQorRU5EX1RFU1QKKworc3RhdGljIFN1aXRlICoKK21ha2Vfc3VpdGUodm9pZCkKK3sKKyAgICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSgiYmFzaWMiKTsKKyAgICBUQ2FzZSAqdGNfYmFzaWMgPSB0Y2FzZV9jcmVhdGUoImJhc2ljIHRlc3RzIik7CisgICAgVENhc2UgKnRjX25hbWVzcGFjZSA9IHRjYXNlX2NyZWF0ZSgiWE1MIG5hbWVzcGFjZXMiKTsKKworICAgIHN1aXRlX2FkZF90Y2FzZShzLCB0Y19iYXNpYyk7CisgICAgdGNhc2VfYWRkX2NoZWNrZWRfZml4dHVyZSh0Y19iYXNpYywgYmFzaWNfc2V0dXAsIGJhc2ljX3RlYXJkb3duKTsKKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF9udWxfYnl0ZSk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfdTAwMDBfY2hhcik7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfYm9tX3V0ZjgpOworICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X2JvbV91dGYxNl9iZSk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfYm9tX3V0ZjE2X2xlKTsKKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF9pbGxlZ2FsX3V0ZjgpOworICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X3V0ZjE2KTsKKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF91dGYxNl9sZV9lcGlsb2dfbmV3bGluZSk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfbGF0aW4xX3VtbGF1dHMpOworICAgIC8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICM0OTE5ODYuICovCisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfZGFuaXNoX2xhdGluMSk7CisgICAgLyogUmVncmVzc2lvbiB0ZXN0IGZvciBTRiBidWcgIzUxNDI4MS4gKi8KKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF9mcmVuY2hfY2hhcnJlZl9oZXhpZGVjaW1hbCk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfZnJlbmNoX2NoYXJyZWZfZGVjaW1hbCk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfZnJlbmNoX2xhdGluMSk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfZnJlbmNoX3V0ZjgpOworICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X3V0ZjhfZmFsc2VfcmVqZWN0aW9uKTsKKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF9saW5lX251bWJlcl9hZnRlcl9wYXJzZSk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfY29sdW1uX251bWJlcl9hZnRlcl9wYXJzZSk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfbGluZV9hbmRfY29sdW1uX251bWJlcnNfaW5zaWRlX2hhbmRsZXJzKTsKKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF9saW5lX251bWJlcl9hZnRlcl9lcnJvcik7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfY29sdW1uX251bWJlcl9hZnRlcl9lcnJvcik7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfcmVhbGx5X2xvbmdfbGluZXMpOworICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X2VuZF9lbGVtZW50X2V2ZW50cyk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfYXR0cl93aGl0ZXNwYWNlX25vcm1hbGl6YXRpb24pOworICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X3htbGRlY2xfbWlzcGxhY2VkKTsKKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF91bmtub3duX2VuY29kaW5nX2ludGVybmFsX2VudGl0eSk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsCisgICAgICAgICAgICAgICAgICAgdGVzdF93ZmNfdW5kZWNsYXJlZF9lbnRpdHlfdW5yZWFkX2V4dGVybmFsX3N1YnNldCk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3Rfd2ZjX3VuZGVjbGFyZWRfZW50aXR5X25vX2V4dGVybmFsX3N1YnNldCk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3Rfd2ZjX3VuZGVjbGFyZWRfZW50aXR5X3N0YW5kYWxvbmUpOworICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X3dmY191bmRlY2xhcmVkX2VudGl0eV93aXRoX2V4dGVybmFsX3N1YnNldCk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsCisgICAgICAgICAgICAgICAgICAgdGVzdF93ZmNfdW5kZWNsYXJlZF9lbnRpdHlfd2l0aF9leHRlcm5hbF9zdWJzZXRfc3RhbmRhbG9uZSk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3Rfd2ZjX25vX3JlY3Vyc2l2ZV9lbnRpdHlfcmVmcyk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfZXh0X2VudGl0eV9zZXRfZW5jb2RpbmcpOworICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X2R0ZF9kZWZhdWx0X2hhbmRsaW5nKTsKKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF9lbXB0eV9uc193aXRob3V0X25hbWVzcGFjZXMpOworICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X25zX2luX2F0dHJpYnV0ZV9kZWZhdWx0X3dpdGhvdXRfbmFtZXNwYWNlcyk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3Rfc3RvcF9wYXJzZXJfYmV0d2Vlbl9jaGFyX2RhdGFfY2FsbHMpOworICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X3N1c3BlbmRfcGFyc2VyX2JldHdlZW5fY2hhcl9kYXRhX2NhbGxzKTsKKworICAgIHN1aXRlX2FkZF90Y2FzZShzLCB0Y19uYW1lc3BhY2UpOworICAgIHRjYXNlX2FkZF9jaGVja2VkX2ZpeHR1cmUodGNfbmFtZXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlX3NldHVwLCBuYW1lc3BhY2VfdGVhcmRvd24pOworICAgIHRjYXNlX2FkZF90ZXN0KHRjX25hbWVzcGFjZSwgdGVzdF9yZXR1cm5fbnNfdHJpcGxldCk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfbmFtZXNwYWNlLCB0ZXN0X25zX3RhZ25hbWVfb3ZlcndyaXRlKTsKKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19uYW1lc3BhY2UsIHRlc3RfbnNfdGFnbmFtZV9vdmVyd3JpdGVfdHJpcGxldCk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfbmFtZXNwYWNlLCB0ZXN0X3N0YXJ0X25zX2NsZWFyc19zdGFydF9lbGVtZW50KTsKKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19uYW1lc3BhY2UsIHRlc3RfZGVmYXVsdF9uc19mcm9tX2V4dF9zdWJzZXRfYW5kX2V4dF9nZSk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfbmFtZXNwYWNlLCB0ZXN0X25zX3ByZWZpeF93aXRoX2VtcHR5X3VyaV8xKTsKKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19uYW1lc3BhY2UsIHRlc3RfbnNfcHJlZml4X3dpdGhfZW1wdHlfdXJpXzIpOworICAgIHRjYXNlX2FkZF90ZXN0KHRjX25hbWVzcGFjZSwgdGVzdF9uc19wcmVmaXhfd2l0aF9lbXB0eV91cmlfMyk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfbmFtZXNwYWNlLCB0ZXN0X25zX3ByZWZpeF93aXRoX2VtcHR5X3VyaV80KTsKKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19uYW1lc3BhY2UsIHRlc3RfbnNfZGVmYXVsdF93aXRoX2VtcHR5X3VyaSk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfbmFtZXNwYWNlLCB0ZXN0X25zX2R1cGxpY2F0ZV9hdHRyc19kaWZmX3ByZWZpeGVzKTsKKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19uYW1lc3BhY2UsIHRlc3RfbnNfdW5ib3VuZF9wcmVmaXhfb25fYXR0cmlidXRlKTsKKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19uYW1lc3BhY2UsIHRlc3RfbnNfdW5ib3VuZF9wcmVmaXhfb25fZWxlbWVudCk7CisKKyAgICByZXR1cm4gczsKK30KKworCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBpbnQgaSwgbmY7CisgICAgaW50IHZlcmJvc2l0eSA9IENLX05PUk1BTDsKKyAgICBTdWl0ZSAqcyA9IG1ha2Vfc3VpdGUoKTsKKyAgICBTUnVubmVyICpzciA9IHNydW5uZXJfY3JlYXRlKHMpOworCisgICAgLyogcnVuIHRoZSB0ZXN0cyBmb3IgaW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9ucyAqLworICAgIHRlc3RoZWxwZXJfaXNfd2hpdGVzcGFjZV9ub3JtYWxpemVkKCk7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgKytpKSB7CisgICAgICAgIGNoYXIgKm9wdCA9IGFyZ3ZbaV07CisgICAgICAgIGlmIChzdHJjbXAob3B0LCAiLXYiKSA9PSAwIHx8IHN0cmNtcChvcHQsICItLXZlcmJvc2UiKSA9PSAwKQorICAgICAgICAgICAgdmVyYm9zaXR5ID0gQ0tfVkVSQk9TRTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKG9wdCwgIi1xIikgPT0gMCB8fCBzdHJjbXAob3B0LCAiLS1xdWlldCIpID09IDApCisgICAgICAgICAgICB2ZXJib3NpdHkgPSBDS19TSUxFTlQ7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJydW50ZXN0czogdW5rbm93biBvcHRpb24gJyVzJ1xuIiwgb3B0KTsKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9CisgICAgfQorICAgIGlmICh2ZXJib3NpdHkgIT0gQ0tfU0lMRU5UKQorICAgICAgICBwcmludGYoIkV4cGF0IHZlcnNpb246ICVzXG4iLCBYTUxfRXhwYXRWZXJzaW9uKCkpOworICAgIHNydW5uZXJfcnVuX2FsbChzciwgdmVyYm9zaXR5KTsKKyAgICBuZiA9IHNydW5uZXJfbnRlc3RzX2ZhaWxlZChzcik7CisgICAgc3J1bm5lcl9mcmVlKHNyKTsKKworICAgIHJldHVybiAobmYgPT0gMCkgPyBFWElUX1NVQ0NFU1MgOiBFWElUX0ZBSUxVUkU7Cit9CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS90ZXN0cy9ydW50ZXN0c3BwLmNwcCBiL2V4cGF0LTIuMC4xL3Rlc3RzL3J1bnRlc3RzcHAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNWRjNTgKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS90ZXN0cy9ydW50ZXN0c3BwLmNwcApAQCAtMCwwICsxLDYgQEAKKy8vIEMrKyBjb21waWxhdGlvbiBoYXJuZXNzIGZvciB0aGUgdGVzdCBzdWl0ZS4KKy8vCisvLyBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHRoZSBFeHBhdCBoZWFkZXJzIGNhbiBiZSBpbmNsdWRlZCBmcm9tIEMrKworLy8gYW5kIGhhdmUgZXZlcnl0aGluZyB3b3JrIGFzIGV4cGVjdGVkLgorLy8KKyNpbmNsdWRlICJydW50ZXN0cy5jIgpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvdGVzdHMveG1sdGVzdC5zaCBiL2V4cGF0LTIuMC4xL3Rlc3RzL3htbHRlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI1NDQxZQotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL3Rlc3RzL3htbHRlc3Quc2gKQEAgLTAsMCArMSwxNDEgQEAKKyMhIC9iaW4vc2gKKworIyAgIEVYUEFUIFRFU1QgU0NSSVBUIEZPUiBXM0MgWE1MIFRFU1QgU1VJVEUKKworIyBUaGlzIHNjcmlwdCBjYW4gYmUgdXNlZCB0byBleGVyY2lzZSBFeHBhdCBhZ2FpbnN0IHRoZQorIyB3M2Mub3JnIHhtbCB0ZXN0IHN1aXRlLCBhdmFpbGFibGUgZnJvbQorIyBodHRwOi8vd3d3LnczLm9yZy9YTUwvVGVzdC94bWx0czIwMDIwNjA2LnppcC4KKworIyBUbyBydW4gdGhpcyBzY3JpcHQsIGZpcnN0IHNldCBYTUxXRiBzbyB0aGF0IHhtbHdmIGNhbiBiZQorIyBmb3VuZCwgdGhlbiBzZXQgdGhlIG91dHB1dCBkaXJlY3Rvcnkgd2l0aCBPVVRQVVQuCisKKyMgVGhlIHNjcmlwdCBsaXN0cyBhbGwgdGVzdCBjYXNlcyB3aGVyZSBFeHBhdCBzaG93cyBhIGRpc2NyZXBhbmN5CisjIGZyb20gdGhlIGV4cGVjdGVkIHJlc3VsdC4gVGVzdCBjYXNlcyB3aGVyZSBvbmx5IHRoZSBjYW5vbmljYWwKKyMgb3V0cHV0IGRpZmZlcnMgYXJlIHByZWZpeGVkIHdpdGggIk91dHB1dCBkaWZmZXJzOiIsIGFuZCBhIGRpZmYgZmlsZQorIyBpcyBnZW5lcmF0ZWQgaW4gdGhlIGFwcHJvcHJpYXRlIHN1YmRpcmVjdG9yeSB1bmRlciAkT1VUUFVULgorCisjIElmIHRoZXJlIGFyZSBvdXRwdXQgZmlsZXMgcHJvdmlkZWQsIHRoZSBzY3JpcHQgd2lsbCB1c2UKKyMgb3V0cHV0IGZyb20geG1sd2YgYW5kIGNvbXBhcmUgdGhlIGRlc2lyZWQgb3V0cHV0IGFnYWluc3QgaXQuCisjIEhvd2V2ZXIsIG9uZSBoYXMgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhhdCB0aGUgY2Fub25pY2FsIG91dHB1dAorIyBwcm9kdWNlZCBieSB4bWx3ZiBjb25mb3JtcyB0byBhbiBvbGRlciBkZWZpbml0aW9uIG9mIGNhbm9uaWNhbCBYTUwKKyMgYW5kIGRvZXMgbm90IGdlbmVyYXRlIG5vdGF0aW9uIGRlY2xhcmF0aW9ucy4KKworTVlESVI9ImBkaXJuYW1lIFwiJDBcImAiCitjZCAiJE1ZRElSIgorTVlESVI9ImBwd2RgIgorWE1MV0Y9ImBkaXJuYW1lIFwiJE1ZRElSXCJgL3htbHdmL3htbHdmIgorIyBYTUxXRj0vdXNyL2xvY2FsL2Jpbi94bWx3ZgorVFM9IiRNWURJUi9YTUwtVGVzdC1TdWl0ZSIKKyMgT1VUUFVUIG11c3QgdGVybWluYXRlIHdpdGggdGhlIGRpcmVjdG9yeSBzZXBhcmF0b3IuCitPVVRQVVQ9IiRUUy9vdXQvIgorIyBPVVRQVVQ9L2hvbWUvdG1wL3htbC10ZXN0c3VpdGUtb3V0LworCisKKyMgUnVuWG1sd2ZOb3RXRiBmaWxlIHJlbGRpcgorIyByZWxkaXIgaW5jbHVkZXMgdHJhaWxpbmcgc2xhc2gKK1J1blhtbHdmTm90V0YoKSB7CisgIGZpbGU9IiQxIgorICByZWxkaXI9IiQyIgorICAkWE1MV0YgLXAgIiRmaWxlIiA+IG91dGZpbGUgfHwgcmV0dXJuICQ/CisgIHJlYWQgb3V0ZGF0YSA8IG91dGZpbGUKKyAgaWYgdGVzdCAiJG91dGRhdGEiID0gIiIgOyB0aGVuCisgICAgICBlY2hvICJFeHBlY3RlZCB3ZWxsLWZvcm1lZDogJHJlbGRpciRmaWxlIgorICAgICAgcmV0dXJuIDEKKyAgZWxzZQorICAgICAgcmV0dXJuIDAKKyAgZmkgCit9CisKKyMgUnVuWG1sd2ZXRiBmaWxlIHJlbGRpcgorIyByZWxkaXIgaW5jbHVkZXMgdHJhaWxpbmcgc2xhc2gKK1J1blhtbHdmV0YoKSB7CisgIGZpbGU9IiQxIgorICByZWxkaXI9IiQyIgorICAkWE1MV0YgLXAgLWQgIiRPVVRQVVQkcmVsZGlyIiAiJGZpbGUiID4gb3V0ZmlsZSB8fCByZXR1cm4gJD8KKyAgcmVhZCBvdXRkYXRhIDwgb3V0ZmlsZSAKKyAgaWYgdGVzdCAiJG91dGRhdGEiID0gIiIgOyB0aGVuIAorICAgICAgaWYgWyAtZiAib3V0LyRmaWxlIiBdIDsgdGhlbiAKKyAgICAgICAgICBkaWZmICIkT1VUUFVUJHJlbGRpciRmaWxlIiAib3V0LyRmaWxlIiA+IG91dGZpbGUgCisgICAgICAgICAgaWYgWyAtcyBvdXRmaWxlIF0gOyB0aGVuIAorICAgICAgICAgICAgICBjcCBvdXRmaWxlICIkT1VUUFVUJHJlbGRpciRmaWxlLmRpZmYiCisgICAgICAgICAgICAgIGVjaG8gIk91dHB1dCBkaWZmZXJzOiAkcmVsZGlyJGZpbGUiCisgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgICAgZmkgCisgICAgICBmaSAKKyAgICAgIHJldHVybiAwCisgIGVsc2UgCisgICAgICBlY2hvICJJbiAkcmVsZGlyOiAkb3V0ZGF0YSIKKyAgICAgIHJldHVybiAxCisgIGZpIAorfQorCitTVUNDRVNTPTAKK0VSUk9SPTAKKworVXBkYXRlU3RhdHVzKCkgeworICBpZiBbICIkMSIgLWVxIDAgXSA7IHRoZW4KKyAgICBTVUNDRVNTPWBleHByICRTVUNDRVNTICsgMWAKKyAgZWxzZQorICAgIEVSUk9SPWBleHByICRFUlJPUiArIDFgCisgIGZpCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHdlbGwtZm9ybWVkIHRlc3QgY2FzZXMgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworY2QgIiRUUy94bWxjb25mIgorZm9yIHhtbGRpciBpbiBpYm0vdmFsaWQvUCogXAorICAgICAgICAgICAgICBpYm0vaW52YWxpZC9QKiBcCisgICAgICAgICAgICAgIHhtbHRlc3QvdmFsaWQvZXh0LXNhIFwKKyAgICAgICAgICAgICAgeG1sdGVzdC92YWxpZC9ub3Qtc2EgXAorICAgICAgICAgICAgICB4bWx0ZXN0L2ludmFsaWQgXAorICAgICAgICAgICAgICB4bWx0ZXN0L2ludmFsaWQvbm90LXNhIFwKKyAgICAgICAgICAgICAgeG1sdGVzdC92YWxpZC9zYSBcCisgICAgICAgICAgICAgIHN1bi92YWxpZCBcCisgICAgICAgICAgICAgIHN1bi9pbnZhbGlkIDsgZG8KKyAgY2QgIiRUUy94bWxjb25mLyR4bWxkaXIiCisgIG1rZGlyIC1wICIkT1VUUFVUJHhtbGRpciIKKyAgZm9yIHhtbGZpbGUgaW4gKi54bWwgOyBkbworICAgICAgUnVuWG1sd2ZXRiAiJHhtbGZpbGUiICIkeG1sZGlyLyIKKyAgICAgIFVwZGF0ZVN0YXR1cyAkPworICBkb25lCisgIHJtIG91dGZpbGUKK2RvbmUKKworY2QgIiRUUy94bWxjb25mL29hc2lzIgorbWtkaXIgLXAgIiRPVVRQVVQib2FzaXMKK2ZvciB4bWxmaWxlIGluICpwYXNzKi54bWwgOyBkbworICAgIFJ1blhtbHdmV0YgIiR4bWxmaWxlIiAib2FzaXMvIgorICAgIFVwZGF0ZVN0YXR1cyAkPworZG9uZQorcm0gb3V0ZmlsZQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgbm90IHdlbGwtZm9ybWVkIHRlc3QgY2FzZXMgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NkICIkVFMveG1sY29uZiIKK2ZvciB4bWxkaXIgaW4gaWJtL25vdC13Zi9QKiBcCisgICAgICAgICAgICAgIGlibS9ub3Qtd2YvbWlzYyBcCisgICAgICAgICAgICAgIHhtbHRlc3Qvbm90LXdmL2V4dC1zYSBcCisgICAgICAgICAgICAgIHhtbHRlc3Qvbm90LXdmL25vdC1zYSBcCisgICAgICAgICAgICAgIHhtbHRlc3Qvbm90LXdmL3NhIFwKKyAgICAgICAgICAgICAgc3VuL25vdC13ZiA7IGRvCisgIGNkICIkVFMveG1sY29uZi8keG1sZGlyIgorICBmb3IgeG1sZmlsZSBpbiAqLnhtbCA7IGRvCisgICAgICBSdW5YbWx3Zk5vdFdGICIkeG1sZmlsZSIgIiR4bWxkaXIvIgorICAgICAgVXBkYXRlU3RhdHVzICQ/CisgIGRvbmUKKyAgcm0gb3V0ZmlsZQorZG9uZQorCitjZCAiJFRTL3htbGNvbmYvb2FzaXMiCitmb3IgeG1sZmlsZSBpbiAqZmFpbCoueG1sIDsgZG8KKyAgICBSdW5YbWx3Zk5vdFdGICIkeG1sZmlsZSIgIm9hc2lzLyIKKyAgICBVcGRhdGVTdGF0dXMgJD8KK2RvbmUKK3JtIG91dGZpbGUKKworZWNobyAiUGFzc2VkOiAkU1VDQ0VTUyIKK2VjaG8gIkZhaWxlZDogJEVSUk9SIgpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvdm1zL1JFQURNRS52bXMgYi9leHBhdC0yLjAuMS92bXMvUkVBRE1FLnZtcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGQyY2E3Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvdm1zL1JFQURNRS52bXMKQEAgLTAsMCArMSwyMyBAQAorNC1qdW4tMjAwMglDcmFpZyBBLiBCZXJyeQorCQlBZGRlZCBydWRpbWVudGFyeSBidWlsZCBwcm9jZWR1cmVzIGZvciAKKwkJT3BlblZNUyBiYXNlZCBvbiB3b3JrIGJ5IE1hcnRpbiBWb3JsYWVuZGVyLgorCisKK1lvdSdsbCBuZWVkIE1NUyBvciBpdHMgZnJlZXdhcmUgZXF1aXZhbGVudCBNTUsuICBKdXN0IGdvIHRvIHRoZSAKK3RvcC1sZXZlbCBkaXJlY3RvcnkgYW5kIHR5cGUKKworJCBNTVMvREVTQ1JJUFRJT049Wy52bXNdCisgCisgIG9yCisKKyQgTU1LL0RFU0NSSVBUSU9OPVsudm1zXQorCitZb3UnbGwgZW5kIHVwIHdpdGggdGhlIG9iamVjdCBsaWJyYXJ5IGV4cGF0Lm9sYi4gIEZvciBub3csIGluc3RhbGxhdGlvbgorY29uc2lzdHMgbWVyZWx5IG9mIGNvcHlpbmcgdGhlIG9iamVjdCBsaWJyYXJ5LCBpbmNsdWRlIGZpbGVzLCBhbmQKK2RvY3VtZW50YXRpb24gdG8gYSBzdWl0YWJsZSBsb2NhdGlvbi4gIAorCitUby1kbyBsaXN0OgorCisJLS0gY3JlYXRlIGEgc2hhcmVhYmxlIGltYWdlCisJLS0gYnVpbGQgYW5kIHJ1biB0aGUgdGVzdHMgYW5kIGJ1aWxkIHRoZSB4bWx3ZiB1dGlsaXR5CisJLS0gY3JlYXRlIGFuIGluc3RhbGwgdGFyZ2V0CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS92bXMvZGVzY3JpcC5tbXMgYi9leHBhdC0yLjAuMS92bXMvZGVzY3JpcC5tbXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDllZTNkOQotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL3Ztcy9kZXNjcmlwLm1tcwpAQCAtMCwwICsxLDcwIEBACisjIEJhcmUgYm9uZXMgZGVzY3JpcHRpb24gZmlsZSAoTWFrZWZpbGUpIGZvciBPcGVuVk1TCisKK1BBQ0tBR0UgPSBleHBhdAorVkVSU0lPTiA9IDEuOTUuOAorRVhQQVRfTUFKT1JfVkVSU0lPTj0xCitFWFBBVF9NSU5PUl9WRVJTSU9OPTk1CitFWFBBVF9FRElUPTgKKworTyA9IC5vYmoKK09MQiA9IC5vbGIKKyAKK0xJQlJBUlkgPSBleHBhdCQoT0xCKQorTElCRElSID0gWy5saWJdCitTT1VSQ0VTID0gJChMSUJESVIpeG1scGFyc2UuYyAkKExJQkRJUil4bWx0b2suYyAkKExJQkRJUil4bWxyb2xlLmMKK09CSkVDVFMgPSB4bWxwYXJzZSQoTykgeG1sdG9rJChPKSB4bWxyb2xlJChPKQorIAorVEVNUExBVEVTID0geG1sdG9rX2ltcGwuYyB4bWx0b2tfbnMuYworQVBJSEVBREVSID0gJChMSUJESVIpZXhwYXQuaAorSEVBREVSUyA9ICQoTElCRElSKWFzY2lpLmggJChMSUJESVIpaWFzY2lpdGFiLmggJChMSUJESVIpdXRmOHRhYi5oICQoTElCRElSKXhtbHRvay5oIFwKKwkkKExJQkRJUilhc2NpaXRhYi5oICQoTElCRElSKWxhdGluMXRhYi5oIFwKKwkkKExJQkRJUiluYW1ldGFiLmggJChMSUJESVIpeG1sZGVmLmggJChMSUJESVIpeG1scm9sZS5oICQoTElCRElSKXhtbHRva19pbXBsLmgKKyAKK0NPTkZJR19IRUFERVIgPSBleHBhdF9jb25maWcuaAorSU5DTFVERVMgPSAvSU5DTFVERT0oW10sWy5saWJdKQorREVGUyA9IC9ERUZJTkU9KFBBQ0tBR0U9IiIiJChQQUNLQUdFKSIiIixWRVJTSU9OPSIiIiQoUEFDS0FHRSlfJChWRVJTSU9OKSIiIixIQVZFX0VYUEFUX0NPTkZJR19IKQorTElCUkVWSVNJT04gPSAwCitMSUJDVVJSRU5UICA9IDEKK0xJQkFHRSAgICAgID0gMAorIyAKK0NPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKQorIyAKKyMgRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKFRFTVBMQVRFUykgJChBUElIRUFERVIpICQoSEVBREVSUykgCisjIAorIyBUQVIgPSBndGFyCisjIEdaSVBfRU5WID0gLS1iZXN0CisjIAorLkZJUlNUIDoKKyAgICAgICBJRiBGJFNFQVJDSCgiJChMSUJSQVJZKSIpIC5FUVMuICIiIFRIRU4gJChMSUJSKSAvQ1JFQVRFIC9PQkpFQ1QgJChMSUJSQVJZKQorCithbGwgOiAkKExJQlJBUlkpCisgICAgICAgIEAgd3JpdGUgc3lzJG91dHB1dCAiQWxsIG1hZGUuIgorIAorLlNVRkZJWEVTIDogCisuU1VGRklYRVMgOiAkKE9MQikgJChPKSAuQyAuSCAgCisgCisuYyQoTykgOgorICAgICAgICQoQ09NUElMRSkgJChNTVMkU09VUkNFKQorIAorJChPKSQoT0xCKSA6CisgICAgICAgIEAgSUYgRiRTRUFSQ0goIiQoTU1TJFRBUkdFVCkiKSAuRVFTLiAiIiAtCisgICAgICAgICAgICAgICAgVEhFTiBMSUJSQVJZL0NSRUFURS9MT0cgJChNTVMkVEFSR0VUKQorICAgICAgICBAIExJQlJBUlkgL1JFUExBQ0UgL0xPRyAkKE1NUyRUQVJHRVQpICQoTU1TJFNPVVJDRSkKKyAKK2NsZWFuIDoKKyAgICAgICBERUxFVEUgJChMSUJSQVJZKTsqLCokKE8pOyoKKyAKKyQoTElCUkFSWSkgOiAkKExJQlJBUlkpKCAkKE9CSkVDVFMpICkgCisgICAgICAgJChMSUJSKSAvQ09NUFJFU1MgJChNTVMkVEFSR0VUKQorCiskKENPTkZJR19IRUFERVIpIDogWy52bXNdZXhwYXRfY29uZmlnLmgKKyAgICAgICAgQ09QWS9MT0cgJChNTVMkU09VUkNFKSAkKE1NUyRUQVJHRVQpCisKK3htbHBhcnNlJChPKSA6ICQoTElCRElSKXhtbHBhcnNlLmMgJChMSUJESVIpZXhwYXQuaCAkKExJQkRJUil4bWxyb2xlLmggJChMSUJESVIpeG1sdG9rLmggJChDT05GSUdfSEVBREVSKQorIAoreG1scm9sZSQoTykgOiAkKExJQkRJUil4bWxyb2xlLmMgJChMSUJESVIpYXNjaWkuaCAkKExJQkRJUil4bWxyb2xlLmggJChDT05GSUdfSEVBREVSKQorIAoreG1sdG9rJChPKSA6ICQoTElCRElSKXhtbHRvay5jICQoTElCRElSKXhtbHRva19pbXBsLmMgJChMSUJESVIpeG1sdG9rX25zLmMgXAorICAgICAgICAkKExJQkRJUilhc2NpaS5oICQoTElCRElSKWFzY2lpdGFiLmggJChMSUJESVIpaWFzY2lpdGFiLmggJChMSUJESVIpbGF0aW4xdGFiLmggXAorCSQoTElCRElSKW5hbWV0YWIuaCAkKExJQkRJUil1dGY4dGFiLmggJChMSUJESVIpeG1sdG9rLmggJChMSUJESVIpeG1sdG9rX2ltcGwuaCAkKENPTkZJR19IRUFERVIpCisKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL3Ztcy9leHBhdF9jb25maWcuaCBiL2V4cGF0LTIuMC4xL3Ztcy9leHBhdF9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWRiODllCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvdm1zL2V4cGF0X2NvbmZpZy5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qIENvcHlyaWdodCAyMDAwLCBDbGFyayBDb29wZXIKKyAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZS4gWW91IGFyZSBwZXJtaXR0ZWQgdG8gY29weSwgZGlzdHJpYnV0ZSwgb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1JVC9YIGxpY2Vuc2UgKGNvbnRhaW5lZCBpbiB0aGUgQ09QWUlORyBmaWxlCisgICB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uLikKKyovCisKKy8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KKyN1bmRlZiBjb25zdAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCisjdW5kZWYgSEFWRV9NTUFQCisKKy8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgb2ZmX3QKKworLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgc2l6ZV90CisKKy8qIERlZmluZSBpZiB5b3VyIHByb2Nlc3NvciBzdG9yZXMgd29yZHMgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudAorICAgYnl0ZSBmaXJzdCAobGlrZSBNb3Rvcm9sYSBhbmQgU1BBUkMsIHVubGlrZSBJbnRlbCBhbmQgVkFYKS4gICovCisjdW5kZWYgV09SRFNfQklHRU5ESUFOCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYmNvcHkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfQkNPUFkKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtZW1tb3ZlIGZ1bmN0aW9uLiAgKi8KKyNkZWZpbmUgSEFWRV9NRU1NT1ZFIDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KKyNkZWZpbmUgSEFWRV9VTklTVERfSCAxCisKKyNkZWZpbmUgWE1MX05TCisjZGVmaW5lIFhNTF9EVEQKKworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorI2RlZmluZSBYTUxfQllURV9PUkRFUiAyMQorI2Vsc2UKKyNkZWZpbmUgWE1MX0JZVEVfT1JERVIgMTIKKyNlbmRpZgorCisjZGVmaW5lIFhNTF9DT05URVhUX0JZVEVTIDEwMjQKKworI2lmbmRlZiBIQVZFX01FTU1PVkUKKyNpZmRlZiBIQVZFX0JDT1BZCisjZGVmaW5lIG1lbW1vdmUoZCxzLGwpIGJjb3B5KChzKSwoZCksKGwpKQorI2Vsc2UKKyNkZWZpbmUgbWVtbW92ZShkLHMsbCkgO3B1bnRpbmcgb24gbWVtbW92ZTsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL3dpbjMyL01BTklGRVNULnR4dCBiL2V4cGF0LTIuMC4xL3dpbjMyL01BTklGRVNULnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2NkMzk1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvd2luMzIvTUFOSUZFU1QudHh0CkBAIC0wLDAgKzEsMjcgQEAKKyAgICAgICAgICAgICAgICAgICAgIE92ZXJ2aWV3IG9mIHRoZSBFeHBhdCBkaXN0cmlidXRpb24KKworVGhlIEV4cGF0IGRpc3RyaWJ1dGlvbiBjcmVhdGVzIHNldmVyYWwgc3ViZGlyZWN0b3JpZXMgb24geW91ciBzeXN0ZW0uCitTb21lIG9mIHRoZXNlIGRpcmVjdG9yaWVzIGNvbnRhaW4gY29tcG9uZW50cyBvZiBpbnRlcmVzdCB0byBhbGwgRXhwYXQKK3VzZXJzLCBhbmQgc29tZSBjb250YWluIG1hdGVyaWFsIG9mIGludGVyZXN0IHRvIGRldmVsb3BlcnMgd2hvIHdpc2ggdG8KK3VzZSBFeHBhdCBpbiB0aGVpciBhcHBsaWNhdGlvbnMuICBJbiB0aGUgbGlzdCBiZWxvdywgPHRvcD4gaXMgdGhlCitkaXJlY3RvcnkgeW91IHNwZWNpZmllZCB0byB0aGUgaW5zdGFsbGVyLgorCisgIERpcmVjdG9yeSAgICAgICAgICAgQ29udGVudHMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIDx0b3A+XCAgICAgICAgICAgICAgU29tZSBnZW5lcmFsIGluZm9ybWF0aW9uIGZpbGVzLgorCisgIDx0b3A+XERvY1wgICAgICAgICAgQVBJIGRvY3VtZW50YXRpb24gZm9yIGRldmVsb3BlcnMuCisKKyAgPHRvcD5cQmluXCAgICAgICAgICBQcmUtY29tcGlsZWQgZHluYW1pYyBsaWJyYXJpZXMgZm9yIGRldmVsb3BlcnMuCisgICAgICAgICAgICAgICAgICAgICAgUHJlLWNvbXBpbGVkIHN0YXRpYyBsaWJyYXJpZXMgZm9yIGRldmVsb3BlcnMgKCpNVC5saWIpLgorICAgICAgICAgICAgICAgICAgICAgIFRoZSBYTUwgd2VsbC1mb3JtZWRuZXNzIGNoZWNrZXIgeG1sd2YuCisKKyAgPHRvcD5cU291cmNlXCAgICAgICBTb3VyY2UgY29kZSwgd2hpY2ggbWF5IGludGVyZXN0IHNvbWUgZGV2ZWxvcGVycywKKyAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRpbmcgYSB3b3Jrc3BhY2UgZm9yIE1pY3Jvc2Z0IFZpc3VhbCBDKysuCisgICAgICAgICAgICAgICAgICAgICAgVGhlIHNvdXJjZSBjb2RlIGluY2x1ZGVzIHRoZSBwYXJzZXIsIHRoZSB3ZWxsLQorICAgICAgICAgICAgICAgICAgICAgIGZvcm1lZG5lc3MgY2hlY2tlciwgYW5kIGEgY291cGxlIG9mIHNtYWxsIHNhbXBsZQorICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9ucy4KKworICA8dG9wPlxTb3VyY2VcYmNiNVwgIFByb2plY3QgZmlsZXMgZm9yIEJvcmxhbmQgQysrIEJ1aWxkZXIgNSBhbmQgQkNDIDUuNS4KKworCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS93aW4zMi9SRUFETUUudHh0IGIvZXhwYXQtMi4wLjEvd2luMzIvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2E5NGJjCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvd2luMzIvUkVBRE1FLnR4dApAQCAtMCwwICsxLDgwIEBACisKK0V4cGF0IGNhbiBiZSBidWlsdCBvbiBXaW5kb3dzIGluIHRocmVlIHdheXM6IAorICB1c2luZyBNUyBWaXN1YWwgQysrICg2LjAgb3IgLk5FVCksIEJvcmxhbmQgQysrIEJ1aWxkZXIgNSBvciBDeWd3aW4uCisKKyogQ3lnd2luOgorICBUaGlzIGZvbGxvd3MgdGhlIFVuaXggYnVpbGQgcHJvY2VkdXJlcy4KKworKiBDKysgQnVpbGRlciA1OgorICBQb3NzaWJsZSB3aXRoIG1ha2UgZmlsZXMgaW4gdGhlIEJDQjUgc3ViZGlyZWN0b3J5LgorICBEZXRhaWxzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUmVhZE1lIGZpbGUgbG9jYXRlZCB0aGVyZS4KKworKiBNUyBWaXN1YWwgQysrIDY6CisgIEJhc2VkIG9uIHRoZSB3b3Jrc3BhY2UgZmlsZSBleHBhdC5kc3cuIFRoZSByZWxhdGVkIHByb2plY3QKKyAgZmlsZXMgKC5kc3ApIGFyZSBsb2NhdGVkIGluIHRoZSBsaWIgc3ViZGlyZWN0b3J5LgorCisqIE1TIFZpc3VhbCBTdHVkaW8gLk5FVCAyMDAyLCAyMDAzLCAyMDA1OgorICBUaGUgVkMrKyA2IHdvcmtzcGFjZSBmaWxlIChleHBhdC5kc3cpIGFuZCBwcm9qZWN0IGZpbGVzICguZHNwKQorICBjYW4gYmUgb3BlbmVkIGFuZCBpbXBvcnRlZCBpbiBWUy5ORVQgd2l0aG91dCBwcm9ibGVtcy4KKworKiBBbGwgTVMgQy9DKysgY29tcGlsZXJzOgorICBUaGUgb3V0cHV0IGZvciBhbGwgcHJvamVjdHMgd2lsbCBiZSBnZW5lcmF0ZWQgaW4gdGhlIHdpbjMyXGJpbgorICBkaXJlY3RvcnksIGludGVybWVkaWF0ZSBmaWxlcyB3aWxsIGJlIGxvY2F0ZWQgaW4gcHJvamVjdC1zcGVjaWZpYworICBzdWJkaXJlY3RvcmllcyBvZiB3aW4zMlx0bXAuCisgIAorKiBDcmVhdGluZyBNaW5HVyBkeW5hbWljIGxpYnJhcmllcyBmcm9tIE1TIFZDKysgRExMczoKKyAgCisgIE9uIHRoZSBjb21tYW5kIGxpbmUsIGV4ZWN1dGUgdGhlc2Ugc3RlcHM6CisgIHBleHBvcnRzIGxpYmV4cGF0LmRsbCA+IGV4cGF0LmRlZgorICBwZXhwb3J0cyBsaWJleHBhdHcuZGxsID4gZXhwYXR3LmRlZgorICBkbGx0b29sIC1kIGV4cGF0LmRlZiAtbCBsaWJleHBhdC5hCisgIGRsbHRvb2wgLWQgZXhwYXR3LmRlZiAtbCBsaWJleHBhdHcuYQorICAKKyAgVGhlICouYSBmaWxlcyBhcmUgbWluZ3cgbGlicmFyaWVzLgorCisqIFNwZWNpYWwgbm90ZSBhYm91dCBNUyBWQysrIGFuZCBydW50aW1lIGxpYnJhcmllczoKKworICBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgY29uZmlndXJhdGlvbnM6IHVzaW5nIHRoZQorICBzaW5nbGUgdGhyZWFkZWQgb3IgbXVsdGl0aHJlYWRlZCBydW4tdGltZSBsaWJyYXJ5LAorICBvciB1c2luZyB0aGUgbXVsdGktdGhyZWFkZWQgcnVuLXRpbWUgRGxsLiBUaGF0IGlzLCAKKyAgb25lIGNhbiBidWlsZCB0aHJlZSBkaWZmZXJlbnQgRXhwYXQgbGlicmFyaWVzIGRlcGVuZGluZworICBvbiB0aGUgbmVlZHMgb2YgdGhlIGFwcGxpY2F0aW9uLgorCisgIER5bmFtaWMgTGlua2luZzoKKworICBCeSBkZWZhdWx0IHRoZSBFeHBhdCBEbGxzIGFyZSBidWlsdCB0byBsaW5rIHN0YXRpY2FsbHkKKyAgd2l0aCB0aGUgbXVsdGktdGhyZWFkZWQgcnVuLXRpbWUgbGlicmFyeS4gCisgIFRoZSBsaWJyYXJpZXMgYXJlIG5hbWVkCisgIC0gbGliZXhwYXQodykuZGxsIAorICAtIGxpYmV4cGF0KHcpLmxpYiAoaW1wb3J0IGxpYnJhcnkpCisgIFRoZSAidyIgaW5kaWNhdGVzIHRoZSBVVEYtMTYgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4KKworICBPbmUgcmFyZWx5IHVzZXMgb3RoZXIgdmVyc2lvbnMgb2YgdGhlIERsbCwgYnV0IHRoZXkgY2FuCisgIGJlIGJ1aWx0IGVhc2lseSBieSBzcGVjaWZ5aW5nIGEgZGlmZmVyZW50IFJUTCBsaW5rYWdlIGluCisgIHRoZSBJREUgb24gdGhlIEMvQysrIHRhYiB1bmRlciB0aGUgY2F0ZWdvcnkgQ29kZSBHZW5lcmF0aW9uLgorCisgIFN0YXRpYyBMaW5raW5nOgorCisgIFRoZSBsaWJyYXJpZXMgc2hvdWxkIGJlIG5hbWVkIGxpa2UgdGhpczoKKyAgU2luZ2xlLXRoZWFkZWQ6ICAgICBsaWJleHBhdCh3KU1MLmxpYgorICBNdWx0aS10aHJlYWRlZDogICAgIGxpYmV4cGF0KHcpTVQubGliCisgIE11bHRpLXRocmVhZGVkIERsbDogbGliZXhwYXQodylNRC5saWIKKyAgVGhlIHN1ZmZpeGVzIGNvbmZvcm0gdG8gdGhlIGNvbXBpbGVyIHN3aXRjaCBzZXR0aW5ncworICAvTUwsIC9NVCBhbmQgL01EIGZvciBNUyBWQysrLgorICAKKyAgTm90ZTogSW4gVmlzdWFsIFN0dWRpbyAyMDA1IChWaXN1YWwgQysrIDguMCkgYW5kIGxhdGVyLCB0aGUKKyAgc2luZ2xlLXRocmVhZGVkIHJ1bnRpbWUgbGlicmFyeSBpcyBub3Qgc3VwcG9ydGVkIGFueW1vcmUuCisKKyAgQnkgZGVmYXVsdCwgdGhlIGV4cGF0LXN0YXRpYyBhbmQgZXhwYXR3LXN0YXRpYyBwcm9qZWN0cyBhcmUgc2V0IHVwCisgIHRvIGxpbmsgc3RhdGljYWxseSBhZ2FpbnN0IHRoZSBtdWx0aXRocmVhZGVkIHJ1bi10aW1lIGxpYnJhcnksCisgIHNvIHRoZXkgd2lsbCBidWlsZCBsaWJleHBhdE1ULmxpYiBvciBsaWJleHBhdHdNVC5saWIgZmlsZXMuCisKKyAgVG8gYnVpbGQgdGhlIG90aGVyIHZlcnNpb25zIG9mIHRoZSBzdGF0aWMgbGlicmFyeSwgCisgIGdvIHRvIFByb2plY3QgLSBTZXR0aW5nczoKKyAgLSBzcGVjaWZ5IGEgZGlmZmVyZW50IFJUTCBsaW5rYWdlIG9uIHRoZSBDL0MrKyB0YWIKKyAgICB1bmRlciB0aGUgY2F0ZWdvcnkgQ29kZSBHZW5lcmF0aW9uLgorICAtIHRoZW4sIG9uIHRoZSBMaWJyYXJ5IHRhYiwgY2hhbmdlIHRoZSBvdXRwdXQgZmlsZSBuYW1lCisgICAgYWNjb3JkaW5nbHksIGFzIGRlc2NyaWJlZCBhYm92ZQorCisgIEFuIGFwcGxpY2F0aW9uIGxpbmtpbmcgdG8gdGhlIHN0YXRpYyBsaWJyYXJpZXMgbXVzdAorICBoYXZlIHRoZSBnbG9iYWwgbWFjcm8gWE1MX1NUQVRJQyBkZWZpbmVkLgpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvd2luMzIvZXhwYXQuaXNzIGIvZXhwYXQtMi4wLjEvd2luMzIvZXhwYXQuaXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMGIzMTUKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS93aW4zMi9leHBhdC5pc3MKQEAgLTAsMCArMSw2OSBAQAorOyBCYXNpYyBzZXR1cCBzY3JpcHQgZm9yIHRoZSBJbm5vIFNldHVwIGluc3RhbGxlciBidWlsZGVyLiAgRm9yIG1vcmUKKzsgaW5mb3JtYXRpb24gb24gdGhlIGZyZWUgaW5zdGFsbGVyIGJ1aWxkZXIsIHNlZSB3d3cuanJzb2Z0d2FyZS5vcmcuCis7Cis7IFRoaXMgc2NyaXB0IHdhcyBjb250cmlidXRlZCBieSBUaW0gUGV0ZXJzLgorOyBUaGUgY3VycmVudCB2ZXJzaW9uIGlzIHVzZWQgd2l0aCBJbm5vIFNldHVwIDIuMC4xOS4KKworW1NldHVwXQorQXBwTmFtZT1FeHBhdAorQXBwSWQ9ZXhwYXQKK0FwcFZlcnNpb249Mi4wLjEKK0FwcFZlck5hbWU9RXhwYXQgMi4wLjEKK0FwcENvcHlyaWdodD1Db3B5cmlnaHQgqSAxOTk4LTIwMDYgVGhhaSBPcGVuIFNvdXJjZSBTb2Z0d2FyZSBDZW50ZXIsIENsYXJrIENvb3BlciwgYW5kIHRoZSBFeHBhdCBtYWludGFpbmVycworQXBwUHVibGlzaGVyPVRoZSBFeHBhdCBEZXZlbG9wZXJzCitBcHBQdWJsaXNoZXJVUkw9aHR0cDovL3d3dy5saWJleHBhdC5vcmcvCitBcHBTdXBwb3J0VVJMPWh0dHA6Ly93d3cubGliZXhwYXQub3JnLworQXBwVXBkYXRlc1VSTD1odHRwOi8vd3d3LmxpYmV4cGF0Lm9yZy8KK1VuaW5zdGFsbERpc3BsYXlOYW1lPUV4cGF0IFhNTCBQYXJzZXIgMi4wLjEKK1ZlcnNpb25JbmZvVmVyc2lvbj0yLjAuMQorCitEZWZhdWx0RGlyTmFtZT17cGZ9XEV4cGF0IDIuMC4xCitVbmluc3RhbGxGaWxlc0Rpcj17YXBwfVxVbmluc3RhbGwKKworQ29tcHJlc3Npb249bHptYQorU29saWRDb21wcmVzc2lvbj15ZXMKK1NvdXJjZURpcj0uLgorT3V0cHV0RGlyPXdpbjMyCitEaXNhYmxlU3RhcnR1cFByb21wdD15ZXMKK0FsbG93Tm9JY29ucz15ZXMKK0Rpc2FibGVQcm9ncmFtR3JvdXBQYWdlPXllcworRGlzYWJsZVJlYWR5UGFnZT15ZXMKKworW0ZpbGVzXQorRmxhZ3M6IGlnbm9yZXZlcnNpb247IFNvdXJjZTogd2luMzJcYmluXFJlbGVhc2VceG1sd2YuZXhlOyAgRGVzdERpcjogInthcHB9XEJpbiIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IHdpbjMyXE1BTklGRVNULnR4dDsgICAgICAgICAgIERlc3REaXI6ICJ7YXBwfSIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IENoYW5nZXM7ICAgICAgICAgICAgICAgICAgICAgIERlc3REaXI6ICJ7YXBwfSI7IERlc3ROYW1lOiBDaGFuZ2VzLnR4dAorRmxhZ3M6IGlnbm9yZXZlcnNpb247IFNvdXJjZTogQ09QWUlORzsgICAgICAgICAgICAgICAgICAgICAgRGVzdERpcjogInthcHB9IjsgRGVzdE5hbWU6IENPUFlJTkcudHh0CitGbGFnczogaWdub3JldmVyc2lvbjsgU291cmNlOiBSRUFETUU7ICAgICAgICAgICAgICAgICAgICAgICBEZXN0RGlyOiAie2FwcH0iOyBEZXN0TmFtZTogUkVBRE1FLnR4dAorRmxhZ3M6IGlnbm9yZXZlcnNpb247IFNvdXJjZTogZG9jXCouaHRtbDsgICAgICAgICAgICAgICAgICAgRGVzdERpcjogInthcHB9XERvYyIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IGRvY1wqLmNzczsgICAgICAgICAgICAgICAgICAgIERlc3REaXI6ICJ7YXBwfVxEb2MiCitGbGFnczogaWdub3JldmVyc2lvbjsgU291cmNlOiBkb2NcKi5wbmc7ICAgICAgICAgICAgICAgICAgICBEZXN0RGlyOiAie2FwcH1cRG9jIgorRmxhZ3M6IGlnbm9yZXZlcnNpb247IFNvdXJjZTogd2luMzJcYmluXFJlbGVhc2VcKi5kbGw7ICAgICAgRGVzdERpcjogInthcHB9XEJpbiIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IHdpbjMyXGJpblxSZWxlYXNlXCoubGliOyAgICAgIERlc3REaXI6ICJ7YXBwfVxCaW4iCitGbGFnczogaWdub3JldmVyc2lvbjsgU291cmNlOiBleHBhdC5kc3c7ICAgICAgICAgICAgICAgICAgICBEZXN0RGlyOiAie2FwcH1cU291cmNlIgorRmxhZ3M6IGlnbm9yZXZlcnNpb247IFNvdXJjZTogd2luMzJcUkVBRE1FLnR4dDsgICAgICAgICAgICAgRGVzdERpcjogInthcHB9XFNvdXJjZSIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IGJjYjVcKi5icCo7ICAgICAgICAgICAgICAgICAgIERlc3REaXI6ICJ7YXBwfVxTb3VyY2VcYmNiNSIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IGJjYjVcKi5tYWs7ICAgICAgICAgICAgICAgICAgIERlc3REaXI6ICJ7YXBwfVxTb3VyY2VcYmNiNSIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IGJjYjVcKi5kZWY7ICAgICAgICAgICAgICAgICAgIERlc3REaXI6ICJ7YXBwfVxTb3VyY2VcYmNiNSIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IGJjYjVcKi50eHQ7ICAgICAgICAgICAgICAgICAgIERlc3REaXI6ICJ7YXBwfVxTb3VyY2VcYmNiNSIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IGJjYjVcKi5iYXQ7ICAgICAgICAgICAgICAgICAgIERlc3REaXI6ICJ7YXBwfVxTb3VyY2VcYmNiNSIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IGxpYlwqLmM7ICAgICAgICAgICAgICAgICAgICAgIERlc3REaXI6ICJ7YXBwfVxTb3VyY2VcbGliIgorRmxhZ3M6IGlnbm9yZXZlcnNpb247IFNvdXJjZTogbGliXCouaDsgICAgICAgICAgICAgICAgICAgICAgRGVzdERpcjogInthcHB9XFNvdXJjZVxsaWIiCitGbGFnczogaWdub3JldmVyc2lvbjsgU291cmNlOiBsaWJcKi5kZWY7ICAgICAgICAgICAgICAgICAgICBEZXN0RGlyOiAie2FwcH1cU291cmNlXGxpYiIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IGxpYlwqLmRzcDsgICAgICAgICAgICAgICAgICAgIERlc3REaXI6ICJ7YXBwfVxTb3VyY2VcbGliIgorRmxhZ3M6IGlnbm9yZXZlcnNpb247IFNvdXJjZTogZXhhbXBsZXNcKi5jOyAgICAgICAgICAgICAgICAgRGVzdERpcjogInthcHB9XFNvdXJjZVxleGFtcGxlcyIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IGV4YW1wbGVzXCouZHNwOyAgICAgICAgICAgICAgIERlc3REaXI6ICJ7YXBwfVxTb3VyY2VcZXhhbXBsZXMiCitGbGFnczogaWdub3JldmVyc2lvbjsgU291cmNlOiB0ZXN0c1wqLmM7ICAgICAgICAgICAgICAgICAgICBEZXN0RGlyOiAie2FwcH1cU291cmNlXHRlc3RzIgorRmxhZ3M6IGlnbm9yZXZlcnNpb247IFNvdXJjZTogdGVzdHNcKi5jcHA7ICAgICAgICAgICAgICAgICAgRGVzdERpcjogInthcHB9XFNvdXJjZVx0ZXN0cyIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IHRlc3RzXCouaDsgICAgICAgICAgICAgICAgICAgIERlc3REaXI6ICJ7YXBwfVxTb3VyY2VcdGVzdHMiCitGbGFnczogaWdub3JldmVyc2lvbjsgU291cmNlOiB0ZXN0c1xSRUFETUUudHh0OyAgICAgICAgICAgICBEZXN0RGlyOiAie2FwcH1cU291cmNlXHRlc3RzIgorRmxhZ3M6IGlnbm9yZXZlcnNpb247IFNvdXJjZTogdGVzdHNcYmVuY2htYXJrXCouYzsgICAgICAgICAgRGVzdERpcjogInthcHB9XFNvdXJjZVx0ZXN0c1xiZW5jaG1hcmsiCitGbGFnczogaWdub3JldmVyc2lvbjsgU291cmNlOiB0ZXN0c1xiZW5jaG1hcmtcKi5kcyo7ICAgICAgICBEZXN0RGlyOiAie2FwcH1cU291cmNlXHRlc3RzXGJlbmNobWFyayIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IHRlc3RzXGJlbmNobWFya1xSRUFETUUudHh0OyAgIERlc3REaXI6ICJ7YXBwfVxTb3VyY2VcdGVzdHNcYmVuY2htYXJrIgorRmxhZ3M6IGlnbm9yZXZlcnNpb247IFNvdXJjZTogeG1sd2ZcKi5jKjsgICAgICAgICAgICAgICAgICAgRGVzdERpcjogInthcHB9XFNvdXJjZVx4bWx3ZiIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IHhtbHdmXCouaDsgICAgICAgICAgICAgICAgICAgIERlc3REaXI6ICJ7YXBwfVxTb3VyY2VceG1sd2YiCitGbGFnczogaWdub3JldmVyc2lvbjsgU291cmNlOiB4bWx3ZlwqLmRzcDsgICAgICAgICAgICAgICAgICBEZXN0RGlyOiAie2FwcH1cU291cmNlXHhtbHdmIgorCitbTWVzc2FnZXNdCitXZWxjb21lTGFiZWwxPVdlbGNvbWUgdG8gdGhlIEV4cGF0IFhNTCBQYXJzZXIgU2V0dXAgV2l6YXJkCitXZWxjb21lTGFiZWwyPVRoaXMgd2lsbCBpbnN0YWxsIFtuYW1lL3Zlcl0gb24geW91ciBjb21wdXRlci4lbiVuRXhwYXQgaXMgYW4gWE1MIHBhcnNlciB3aXRoIGEgQy1sYW5ndWFnZSBBUEksIGFuZCBpcyBwcmltYXJpbHkgbWFkZSBhdmFpbGFibGUgdG8gYWxsb3cgZGV2ZWxvcGVycyB0byBidWlsZCBhcHBsaWNhdGlvbnMgd2hpY2ggdXNlIFhNTCB1c2luZyBhIHBvcnRhYmxlIEFQSSBhbmQgZmFzdCBpbXBsZW1lbnRhdGlvbi4lbiVuSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgY2xvc2UgYWxsIG90aGVyIGFwcGxpY2F0aW9ucyB5b3UgaGF2ZSBydW5uaW5nIGJlZm9yZSBjb250aW51aW5nLiBUaGlzIHdpbGwgaGVscCBwcmV2ZW50IGFueSBjb25mbGljdHMgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL3htbHdmL2NvZGVwYWdlLmMgYi9leHBhdC0yLjAuMS94bWx3Zi9jb2RlcGFnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZTQ4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS94bWx3Zi9jb2RlcGFnZS5jCkBAIC0wLDAgKzEsNjggQEAKKy8qIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSBUaGFpIE9wZW4gU291cmNlIFNvZnR3YXJlIENlbnRlciBMdGQKKyAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBjb3B5aW5nIHBlcm1pc3Npb24uCisqLworCisjaW5jbHVkZSAiY29kZXBhZ2UuaCIKKworI2lmIChkZWZpbmVkKFdJTjMyKSB8fCAoZGVmaW5lZChfX1dBVENPTUNfXykgJiYgZGVmaW5lZChfX05UX18pKSkKKyNkZWZpbmUgU1RSSUNUIDEKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTiAxCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK2ludAorY29kZXBhZ2VNYXAoaW50IGNwLCBpbnQgKm1hcCkKK3sKKyAgaW50IGk7CisgIENQSU5GTyBpbmZvOworICBpZiAoIUdldENQSW5mbyhjcCwgJmluZm8pIHx8IGluZm8uTWF4Q2hhclNpemUgPiAyKQorICAgIHJldHVybiAwOworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgbWFwW2ldID0gLTE7CisgIGlmIChpbmZvLk1heENoYXJTaXplID4gMSkgeworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTEVBREJZVEVTOyBpKz0yKSB7CisgICAgICBpbnQgaiwgbGltOworICAgICAgaWYgKGluZm8uTGVhZEJ5dGVbaV0gPT0gMCAmJiBpbmZvLkxlYWRCeXRlW2kgKyAxXSA9PSAwKQorICAgICAgICBicmVhazsKKyAgICAgIGxpbSA9IGluZm8uTGVhZEJ5dGVbaSArIDFdOworICAgICAgZm9yIChqID0gaW5mby5MZWFkQnl0ZVtpXTsgaiA8PSBsaW07IGorKykKKyAgICAgICAgbWFwW2pdID0gLTI7CisgICAgfQorICB9CisgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgaWYgKG1hcFtpXSA9PSAtMSkgeworICAgICBjaGFyIGMgPSAoY2hhcilpOworICAgICB1bnNpZ25lZCBzaG9ydCBuOworICAgICBpZiAoTXVsdGlCeXRlVG9XaWRlQ2hhcihjcCwgTUJfUFJFQ09NUE9TRUR8TUJfRVJSX0lOVkFMSURfQ0hBUlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjLCAxLCAmbiwgMSkgPT0gMSkKKyAgICAgICBtYXBbaV0gPSBuOworICAgfQorICB9CisgIHJldHVybiAxOworfQorCitpbnQKK2NvZGVwYWdlQ29udmVydChpbnQgY3AsIGNvbnN0IGNoYXIgKnApCit7CisgIHVuc2lnbmVkIHNob3J0IGM7CisgIGlmIChNdWx0aUJ5dGVUb1dpZGVDaGFyKGNwLCBNQl9QUkVDT01QT1NFRHxNQl9FUlJfSU5WQUxJRF9DSEFSUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcCwgMiwgJmMsIDEpID09IDEpCisgICAgcmV0dXJuIGM7CisgIHJldHVybiAtMTsKK30KKworI2Vsc2UgLyogbm90IFdJTjMyICovCisKK2ludAorY29kZXBhZ2VNYXAoaW50IGNwLCBpbnQgKm1hcCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK2ludAorY29kZXBhZ2VDb252ZXJ0KGludCBjcCwgY29uc3QgY2hhciAqcCkKK3sKKyAgcmV0dXJuIC0xOworfQorCisjZW5kaWYgLyogbm90IFdJTjMyICovCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS94bWx3Zi9jb2RlcGFnZS5oIGIvZXhwYXQtMi4wLjEveG1sd2YvY29kZXBhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTRkZjY4Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEveG1sd2YvY29kZXBhZ2UuaApAQCAtMCwwICsxLDYgQEAKKy8qIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSBUaGFpIE9wZW4gU291cmNlIFNvZnR3YXJlIENlbnRlciBMdGQKKyAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBjb3B5aW5nIHBlcm1pc3Npb24uCisqLworCitpbnQgY29kZXBhZ2VNYXAoaW50IGNwLCBpbnQgKm1hcCk7CitpbnQgY29kZXBhZ2VDb252ZXJ0KGludCBjcCwgY29uc3QgY2hhciAqcCk7CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS94bWx3Zi9jdC5jIGIvZXhwYXQtMi4wLjEveG1sd2YvY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTkwM2EzCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEveG1sd2YvY3QuYwpAQCAtMCwwICsxLDE0NyBAQAorI2RlZmluZSBDSEFSU0VUX01BWCA0MQorCitzdGF0aWMgY29uc3QgY2hhciAqCitnZXRUb2soY29uc3QgY2hhciAqKnBwKQoreworICBlbnVtIHsgaW5BdG9tLCBpblN0cmluZywgaW5pdCwgaW5Db21tZW50IH07CisgIGludCBzdGF0ZSA9IGluaXQ7CisgIGNvbnN0IGNoYXIgKnRva1N0YXJ0ID0gMDsKKyAgZm9yICg7OykgeworICAgIHN3aXRjaCAoKipwcCkgeworICAgIGNhc2UgJ1wwJzoKKyAgICAgIHJldHVybiAwOworICAgIGNhc2UgJyAnOgorICAgIGNhc2UgJ1xyJzoKKyAgICBjYXNlICdcdCc6CisgICAgY2FzZSAnXG4nOgorICAgICAgaWYgKHN0YXRlID09IGluQXRvbSkKKyAgICAgICAgcmV0dXJuIHRva1N0YXJ0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAnKCc6CisgICAgICBpZiAoc3RhdGUgPT0gaW5BdG9tKQorICAgICAgICByZXR1cm4gdG9rU3RhcnQ7CisgICAgICBpZiAoc3RhdGUgIT0gaW5TdHJpbmcpCisgICAgICAgIHN0YXRlKys7CisgICAgICBicmVhazsKKyAgICBjYXNlICcpJzoKKyAgICAgIGlmIChzdGF0ZSA+IGluaXQpCisgICAgICAgIC0tc3RhdGU7CisgICAgICBlbHNlIGlmIChzdGF0ZSAhPSBpblN0cmluZykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBicmVhazsKKyAgICBjYXNlICc7JzoKKyAgICBjYXNlICcvJzoKKyAgICBjYXNlICc9JzoKKyAgICAgIGlmIChzdGF0ZSA9PSBpbkF0b20pCisgICAgICAgIHJldHVybiB0b2tTdGFydDsKKyAgICAgIGlmIChzdGF0ZSA9PSBpbml0KQorICAgICAgICByZXR1cm4gKCpwcCkrKzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1xcJzoKKyAgICAgICsrKnBwOworICAgICAgaWYgKCoqcHAgPT0gJ1wwJykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBicmVhazsKKyAgICBjYXNlICciJzoKKyAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgIGNhc2UgaW5TdHJpbmc6CisgICAgICAgICsrKnBwOworICAgICAgICByZXR1cm4gdG9rU3RhcnQ7CisgICAgICBjYXNlIGluQXRvbToKKyAgICAgICAgcmV0dXJuIHRva1N0YXJ0OworICAgICAgY2FzZSBpbml0OgorICAgICAgICB0b2tTdGFydCA9ICpwcDsKKyAgICAgICAgc3RhdGUgPSBpblN0cmluZzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKHN0YXRlID09IGluaXQpIHsKKyAgICAgICAgdG9rU3RhcnQgPSAqcHA7CisgICAgICAgIHN0YXRlID0gaW5BdG9tOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgICsrKnBwOworICB9CisgIC8qIG5vdCByZWFjaGVkICovCit9CisKKy8qIGtleSBtdXN0IGJlIGxvd2VyY2FzZSBBU0NJSSAqLworCitzdGF0aWMgaW50CittYXRjaGtleShjb25zdCBjaGFyICpzdGFydCwgY29uc3QgY2hhciAqZW5kLCBjb25zdCBjaGFyICprZXkpCit7CisgIGlmICghc3RhcnQpCisgICAgcmV0dXJuIDA7CisgIGZvciAoOyBzdGFydCAhPSBlbmQ7IHN0YXJ0KyssIGtleSsrKQorICAgIGlmICgqc3RhcnQgIT0gKmtleSAmJiAqc3RhcnQgIT0gJ0EnICsgKCprZXkgLSAnYScpKQorICAgICAgcmV0dXJuIDA7CisgIHJldHVybiAqa2V5ID09ICdcMCc7Cit9CisKK3ZvaWQKK2dldFhNTENoYXJzZXQoY29uc3QgY2hhciAqYnVmLCBjaGFyICpjaGFyc2V0KQoreworICBjb25zdCBjaGFyICpuZXh0LCAqcDsKKworICBjaGFyc2V0WzBdID0gJ1wwJzsKKyAgbmV4dCA9IGJ1ZjsKKyAgcCA9IGdldFRvaygmbmV4dCk7CisgIGlmIChtYXRjaGtleShwLCBuZXh0LCAidGV4dCIpKQorICAgIHN0cmNweShjaGFyc2V0LCAidXMtYXNjaWkiKTsKKyAgZWxzZSBpZiAoIW1hdGNoa2V5KHAsIG5leHQsICJhcHBsaWNhdGlvbiIpKQorICAgIHJldHVybjsKKyAgcCA9IGdldFRvaygmbmV4dCk7CisgIGlmICghcCB8fCAqcCAhPSAnLycpCisgICAgcmV0dXJuOworICBwID0gZ2V0VG9rKCZuZXh0KTsKKyAgaWYgKG1hdGNoa2V5KHAsIG5leHQsICJ4bWwiKSkKKyAgICBpc1htbCA9IDE7CisgIHAgPSBnZXRUb2soJm5leHQpOworICB3aGlsZSAocCkgeworICAgIGlmICgqcCA9PSAnOycpIHsKKyAgICAgIHAgPSBnZXRUb2soJm5leHQpOworICAgICAgaWYgKG1hdGNoa2V5KHAsIG5leHQsICJjaGFyc2V0IikpIHsKKyAgICAgICAgcCA9IGdldFRvaygmbmV4dCk7CisgICAgICAgIGlmIChwICYmICpwID09ICc9JykgeworICAgICAgICAgIHAgPSBnZXRUb2soJm5leHQpOworICAgICAgICAgIGlmIChwKSB7CisgICAgICAgICAgICBjaGFyICpzID0gY2hhcnNldDsKKyAgICAgICAgICAgIGlmICgqcCA9PSAnIicpIHsKKyAgICAgICAgICAgICAgd2hpbGUgKCsrcCAhPSBuZXh0IC0gMSkgeworICAgICAgICAgICAgICAgIGlmICgqcCA9PSAnXFwnKQorICAgICAgICAgICAgICAgICAgKytwOworICAgICAgICAgICAgICAgIGlmIChzID09IGNoYXJzZXQgKyBDSEFSU0VUX01BWCAtIDEpIHsKKyAgICAgICAgICAgICAgICAgIGNoYXJzZXRbMF0gPSAnXDAnOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpzKysgPSAqcDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAqcysrID0gJ1wwJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBpZiAobmV4dCAtIHAgPiBDSEFSU0VUX01BWCAtIDEpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIHdoaWxlIChwICE9IG5leHQpCisgICAgICAgICAgICAgICAgKnMrKyA9ICpwKys7CisgICAgICAgICAgICAgICpzID0gMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICBlbHNlCisgICAgcCA9IGdldFRvaygmbmV4dCk7CisgIH0KK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgY2hhciBidWZbQ0hBUlNFVF9NQVhdOworICBnZXRYTUxDaGFyc2V0KGFyZ3ZbMV0sIGJ1Zik7CisgIHByaW50ZigiY2hhcnNldCA9IFwiJXNcIlxuIiwgYnVmKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS94bWx3Zi9maWxlbWFwLmggYi9leHBhdC0yLjAuMS94bWx3Zi9maWxlbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE0ZWRlYwotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL3htbHdmL2ZpbGVtYXAuaApAQCAtMCwwICsxLDE3IEBACisvKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgVGhhaSBPcGVuIFNvdXJjZSBTb2Z0d2FyZSBDZW50ZXIgTHRkCisgICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgY29weWluZyBwZXJtaXNzaW9uLgorKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaWZkZWYgWE1MX1VOSUNPREUKK2ludCBmaWxlbWFwKGNvbnN0IHdjaGFyX3QgKm5hbWUsCisgICAgICAgICAgICB2b2lkICgqcHJvY2Vzc29yKShjb25zdCB2b2lkICosIHNpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QgKiwgdm9pZCAqYXJnKSwKKyAgICAgICAgICAgIHZvaWQgKmFyZyk7CisjZWxzZQoraW50IGZpbGVtYXAoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIHZvaWQgKCpwcm9jZXNzb3IpKGNvbnN0IHZvaWQgKiwgc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLCB2b2lkICphcmcpLAorICAgICAgICAgICAgdm9pZCAqYXJnKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEveG1sd2YvcmVhZGZpbGVtYXAuYyBiL2V4cGF0LTIuMC4xL3htbHdmL3JlYWRmaWxlbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg4ZGRhNQotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL3htbHdmL3JlYWRmaWxlbWFwLmMKQEAgLTAsMCArMSw5OCBAQAorLyogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5IFRoYWkgT3BlbiBTb3VyY2UgU29mdHdhcmUgQ2VudGVyIEx0ZAorICAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIGNvcHlpbmcgcGVybWlzc2lvbi4KKyovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIF9fV0FUQ09NQ19fCisjaWZuZGVmIF9fTElOVVhfXworI2luY2x1ZGUgPGlvLmg+CisjZWxzZQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fQkVPU19fCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2lmbmRlZiBTX0lTUkVHCisjaWZuZGVmIFNfSUZSRUcKKyNkZWZpbmUgU19JRlJFRyBfU19JRlJFRworI2VuZGlmCisjaWZuZGVmIFNfSUZNVAorI2RlZmluZSBTX0lGTVQgX1NfSUZNVAorI2VuZGlmCisjZGVmaW5lIFNfSVNSRUcobSkgKCgobSkgJiBTX0lGTVQpID09IFNfSUZSRUcpCisjZW5kaWYgLyogbm90IFNfSVNSRUcgKi8KKworI2lmbmRlZiBPX0JJTkFSWQorI2lmZGVmIF9PX0JJTkFSWQorI2RlZmluZSBPX0JJTkFSWSBfT19CSU5BUlkKKyNlbHNlCisjZGVmaW5lIE9fQklOQVJZIDAKKyNlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlICJmaWxlbWFwLmgiCisKK2ludAorZmlsZW1hcChjb25zdCBjaGFyICpuYW1lLAorICAgICAgICB2b2lkICgqcHJvY2Vzc29yKShjb25zdCB2b2lkICosIHNpemVfdCwgY29uc3QgY2hhciAqLCB2b2lkICphcmcpLAorICAgICAgICB2b2lkICphcmcpCit7CisgIHNpemVfdCBuYnl0ZXM7CisgIGludCBmZDsKKyAgaW50IG47CisgIHN0cnVjdCBzdGF0IHNiOworICB2b2lkICpwOworCisgIGZkID0gb3BlbihuYW1lLCBPX1JET05MWXxPX0JJTkFSWSk7CisgIGlmIChmZCA8IDApIHsKKyAgICBwZXJyb3IobmFtZSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGZzdGF0KGZkLCAmc2IpIDwgMCkgeworICAgIHBlcnJvcihuYW1lKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIVNfSVNSRUcoc2Iuc3RfbW9kZSkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBub3QgYSByZWd1bGFyIGZpbGVcbiIsIG5hbWUpOworICAgIHJldHVybiAwOworICB9CisgIG5ieXRlcyA9IHNiLnN0X3NpemU7CisgIC8qIG1hbGxvYyB3aWxsIHJldHVybiBOVUxMIHdpdGggbmJ5dGVzID09IDAsIGhhbmRsZSBmaWxlcyB3aXRoIHNpemUgMCAqLworICBpZiAobmJ5dGVzID09IDApIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBjID0gJ1wwJzsKKyAgICBwcm9jZXNzb3IoJmMsIDAsIG5hbWUsIGFyZyk7CisgICAgY2xvc2UoZmQpOworICAgIHJldHVybiAxOworICB9CisgIHAgPSBtYWxsb2MobmJ5dGVzKTsKKyAgaWYgKCFwKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlczogb3V0IG9mIG1lbW9yeVxuIiwgbmFtZSk7CisgICAgY2xvc2UoZmQpOworICAgIHJldHVybiAwOworICB9CisgIG4gPSByZWFkKGZkLCBwLCBuYnl0ZXMpOworICBpZiAobiA8IDApIHsKKyAgICBwZXJyb3IobmFtZSk7CisgICAgZnJlZShwKTsKKyAgICBjbG9zZShmZCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKG4gIT0gbmJ5dGVzKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlczogcmVhZCB1bmV4cGVjdGVkIG51bWJlciBvZiBieXRlc1xuIiwgbmFtZSk7CisgICAgZnJlZShwKTsKKyAgICBjbG9zZShmZCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcHJvY2Vzc29yKHAsIG5ieXRlcywgbmFtZSwgYXJnKTsKKyAgZnJlZShwKTsKKyAgY2xvc2UoZmQpOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL3htbHdmL3VuaXhmaWxlbWFwLmMgYi9leHBhdC0yLjAuMS94bWx3Zi91bml4ZmlsZW1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYWRjZTMKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS94bWx3Zi91bml4ZmlsZW1hcC5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSBUaGFpIE9wZW4gU291cmNlIFNvZnR3YXJlIENlbnRlciBMdGQKKyAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBjb3B5aW5nIHBlcm1pc3Npb24uCisqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZuZGVmIE1BUF9GSUxFCisjZGVmaW5lIE1BUF9GSUxFIDAKKyNlbmRpZgorCisjaW5jbHVkZSAiZmlsZW1hcC5oIgorCitpbnQKK2ZpbGVtYXAoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgdm9pZCAoKnByb2Nlc3NvcikoY29uc3Qgdm9pZCAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgdm9pZCAqYXJnKSwKKyAgICAgICAgdm9pZCAqYXJnKQoreworICBpbnQgZmQ7CisgIHNpemVfdCBuYnl0ZXM7CisgIHN0cnVjdCBzdGF0IHNiOworICB2b2lkICpwOworCisgIGZkID0gb3BlbihuYW1lLCBPX1JET05MWSk7CisgIGlmIChmZCA8IDApIHsKKyAgICBwZXJyb3IobmFtZSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGZzdGF0KGZkLCAmc2IpIDwgMCkgeworICAgIHBlcnJvcihuYW1lKTsKKyAgICBjbG9zZShmZCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCFTX0lTUkVHKHNiLnN0X21vZGUpKSB7CisgICAgY2xvc2UoZmQpOworICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG5vdCBhIHJlZ3VsYXIgZmlsZVxuIiwgbmFtZSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBuYnl0ZXMgPSBzYi5zdF9zaXplOworICAvKiBtbWFwIGZhaWxzIGZvciB6ZXJvIGxlbmd0aCBmaWxlcyAqLworICBpZiAobmJ5dGVzID09IDApIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBjID0gJ1wwJzsKKyAgICBwcm9jZXNzb3IoJmMsIDAsIG5hbWUsIGFyZyk7CisgICAgY2xvc2UoZmQpOworICAgIHJldHVybiAxOworICB9CisgIHAgPSAodm9pZCAqKW1tYXAoKGNhZGRyX3QpMCwgKHNpemVfdCluYnl0ZXMsIFBST1RfUkVBRCwKKyAgICAgICAgICAgICAgICAgICBNQVBfRklMRXxNQVBfUFJJVkFURSwgZmQsIChvZmZfdCkwKTsKKyAgaWYgKHAgPT0gKHZvaWQgKiktMSkgeworICAgIHBlcnJvcihuYW1lKTsKKyAgICBjbG9zZShmZCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcHJvY2Vzc29yKHAsIG5ieXRlcywgbmFtZSwgYXJnKTsKKyAgbXVubWFwKChjYWRkcl90KXAsIG5ieXRlcyk7CisgIGNsb3NlKGZkKTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS94bWx3Zi93aW4zMmZpbGVtYXAuYyBiL2V4cGF0LTIuMC4xL3htbHdmL3dpbjMyZmlsZW1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZGMzNWIKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS94bWx3Zi93aW4zMmZpbGVtYXAuYwpAQCAtMCwwICsxLDk2IEBACisvKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgVGhhaSBPcGVuIFNvdXJjZSBTb2Z0d2FyZSBDZW50ZXIgTHRkCisgICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgY29weWluZyBwZXJtaXNzaW9uLgorKi8KKworI2RlZmluZSBTVFJJQ1QgMQorI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOIDEKKworI2lmZGVmIFhNTF9VTklDT0RFX1dDSEFSX1QKKyNpZm5kZWYgWE1MX1VOSUNPREUKKyNkZWZpbmUgWE1MX1VOSUNPREUKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBYTUxfVU5JQ09ERQorI2RlZmluZSBVTklDT0RFCisjZGVmaW5lIF9VTklDT0RFCisjZW5kaWYgLyogWE1MX1VOSUNPREUgKi8KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0Y2hhci5oPgorI2luY2x1ZGUgImZpbGVtYXAuaCIKKworc3RhdGljIHZvaWQgd2luMzJwZXJyb3IoY29uc3QgVENIQVIgKik7CisKK2ludAorZmlsZW1hcChjb25zdCBUQ0hBUiAqbmFtZSwKKyAgICAgICAgdm9pZCAoKnByb2Nlc3NvcikoY29uc3Qgdm9pZCAqLCBzaXplX3QsIGNvbnN0IFRDSEFSICosIHZvaWQgKmFyZyksCisgICAgICAgIHZvaWQgKmFyZykKK3sKKyAgSEFORExFIGY7CisgIEhBTkRMRSBtOworICBEV09SRCBzaXplOworICBEV09SRCBzaXplSGk7CisgIHZvaWQgKnA7CisKKyAgZiA9IENyZWF0ZUZpbGUobmFtZSwgR0VORVJJQ19SRUFELCBGSUxFX1NIQVJFX1JFQUQsIE5VTEwsIE9QRU5fRVhJU1RJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfRkxBR19TRVFVRU5USUFMX1NDQU4sIE5VTEwpOworICBpZiAoZiA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgIHdpbjMycGVycm9yKG5hbWUpOworICAgIHJldHVybiAwOworICB9CisgIHNpemUgPSBHZXRGaWxlU2l6ZShmLCAmc2l6ZUhpKTsKKyAgaWYgKHNpemUgPT0gKERXT1JEKS0xKSB7CisgICAgd2luMzJwZXJyb3IobmFtZSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKHNpemVIaSkgeworICAgIF9mdHByaW50ZihzdGRlcnIsIF9UKCIlczogYmlnZ2VyIHRoYW4gMkdiXG4iKSwgbmFtZSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgLyogQ3JlYXRlRmlsZU1hcHBpbmcgYmFyZnMgb24gemVybyBsZW5ndGggZmlsZXMgKi8KKyAgaWYgKHNpemUgPT0gMCkgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIGMgPSAnXDAnOworICAgIHByb2Nlc3NvcigmYywgMCwgbmFtZSwgYXJnKTsKKyAgICBDbG9zZUhhbmRsZShmKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBtID0gQ3JlYXRlRmlsZU1hcHBpbmcoZiwgTlVMTCwgUEFHRV9SRUFET05MWSwgMCwgMCwgTlVMTCk7CisgIGlmIChtID09IE5VTEwpIHsKKyAgICB3aW4zMnBlcnJvcihuYW1lKTsKKyAgICBDbG9zZUhhbmRsZShmKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBwID0gTWFwVmlld09mRmlsZShtLCBGSUxFX01BUF9SRUFELCAwLCAwLCAwKTsKKyAgaWYgKHAgPT0gTlVMTCkgeworICAgIHdpbjMycGVycm9yKG5hbWUpOworICAgIENsb3NlSGFuZGxlKG0pOworICAgIENsb3NlSGFuZGxlKGYpOworICAgIHJldHVybiAwOworICB9CisgIHByb2Nlc3NvcihwLCBzaXplLCBuYW1lLCBhcmcpOyAKKyAgVW5tYXBWaWV3T2ZGaWxlKHApOworICBDbG9zZUhhbmRsZShtKTsKKyAgQ2xvc2VIYW5kbGUoZik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAord2luMzJwZXJyb3IoY29uc3QgVENIQVIgKnMpCit7CisgIExQVk9JRCBidWY7CisgIGlmIChGb3JtYXRNZXNzYWdlKEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUgorICAgICAgICAgICAgICAgICAgICB8IEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNLAorICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICBHZXRMYXN0RXJyb3IoKSwKKyAgICAgICAgICAgICAgICAgICAgTUFLRUxBTkdJRChMQU5HX05FVVRSQUwsIFNVQkxBTkdfREVGQVVMVCksCisgICAgICAgICAgICAgICAgICAgIChMUFRTVFIpICZidWYsCisgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgIE5VTEwpKSB7CisgICAgX2Z0cHJpbnRmKHN0ZGVyciwgX1QoIiVzOiAlcyIpLCBzLCBidWYpOworICAgIGZmbHVzaChzdGRlcnIpOworICAgIExvY2FsRnJlZShidWYpOworICB9CisgIGVsc2UKKyAgICBfZnRwcmludGYoc3RkZXJyLCBfVCgiJXM6IHVua25vd24gV2luZG93cyBlcnJvclxuIiksIHMpOworfQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEveG1sd2YveG1sZmlsZS5jIGIvZXhwYXQtMi4wLjEveG1sd2YveG1sZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZWVlYWEKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS94bWx3Zi94bWxmaWxlLmMKQEAgLTAsMCArMSwyNDQgQEAKKy8qIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSBUaGFpIE9wZW4gU291cmNlIFNvZnR3YXJlIENlbnRlciBMdGQKKyAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBjb3B5aW5nIHBlcm1pc3Npb24uCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaWZkZWYgQ09NUElMRURfRlJPTV9EU1AKKyNpbmNsdWRlICJ3aW5jb25maWcuaCIKKyNlbGlmIGRlZmluZWQoTUFDT1NfQ0xBU1NJQykKKyNpbmNsdWRlICJtYWNjb25maWcuaCIKKyNlbGlmIGRlZmluZWQoX19hbWlnYW9zX18pCisjaW5jbHVkZSAiYW1pZ2Fjb25maWcuaCIKKyNlbGlmIGRlZmluZWQoX19XQVRDT01DX18pCisjaW5jbHVkZSAid2F0Y29tY29uZmlnLmgiCisjZWxpZiBkZWZpbmVkKEhBVkVfRVhQQVRfQ09ORklHX0gpCisjaW5jbHVkZSA8ZXhwYXRfY29uZmlnLmg+CisjZW5kaWYgLyogbmRlZiBDT01QSUxFRF9GUk9NX0RTUCAqLworCisjaW5jbHVkZSAiZXhwYXQuaCIKKyNpbmNsdWRlICJ4bWxmaWxlLmgiCisjaW5jbHVkZSAieG1sdGNoYXIuaCIKKyNpbmNsdWRlICJmaWxlbWFwLmgiCisKKyNpZiAoZGVmaW5lZChfTVNDX1ZFUikgfHwgKGRlZmluZWQoX19XQVRDT01DX18pICYmICFkZWZpbmVkKF9fTElOVVhfXykpKQorI2luY2x1ZGUgPGlvLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19hbWlnYW9zX18pICYmIGRlZmluZWQoX19VU0VfSU5MSU5FX18pCisjaW5jbHVkZSA8cHJvdG8vZXhwYXQuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpZm5kZWYgT19CSU5BUlkKKyNpZmRlZiBfT19CSU5BUlkKKyNkZWZpbmUgT19CSU5BUlkgX09fQklOQVJZCisjZWxzZQorI2RlZmluZSBPX0JJTkFSWSAwCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX0RFQlVHCisjZGVmaW5lIFJFQURfU0laRSAxNgorI2Vsc2UKKyNkZWZpbmUgUkVBRF9TSVpFICgxMDI0KjgpCisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCB7CisgIFhNTF9QYXJzZXIgcGFyc2VyOworICBpbnQgKnJldFB0cjsKK30gUFJPQ0VTU19BUkdTOworCitzdGF0aWMgdm9pZAorcmVwb3J0RXJyb3IoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICpmaWxlbmFtZSkKK3sKKyAgZW51bSBYTUxfRXJyb3IgY29kZSA9IFhNTF9HZXRFcnJvckNvZGUocGFyc2VyKTsKKyAgY29uc3QgWE1MX0NoYXIgKm1lc3NhZ2UgPSBYTUxfRXJyb3JTdHJpbmcoY29kZSk7CisgIGlmIChtZXNzYWdlKQorICAgIGZ0cHJpbnRmKHN0ZG91dCwgVCgiJXM6JSIgWE1MX0ZNVF9JTlRfTU9EICJ1OiUiIFhNTF9GTVRfSU5UX01PRCAidTogJXNcbiIpLAorICAgICAgICAgICAgIGZpbGVuYW1lLAorICAgICAgICAgICAgIFhNTF9HZXRFcnJvckxpbmVOdW1iZXIocGFyc2VyKSwKKyAgICAgICAgICAgICBYTUxfR2V0RXJyb3JDb2x1bW5OdW1iZXIocGFyc2VyKSwKKyAgICAgICAgICAgICBtZXNzYWdlKTsKKyAgZWxzZQorICAgIGZ0cHJpbnRmKHN0ZGVyciwgVCgiJXM6ICh1bmtub3duIG1lc3NhZ2UgJWQpXG4iKSwgZmlsZW5hbWUsIGNvZGUpOworfQorIAorLyogVGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIGdpdmUgcHJvYmxlbXMgb24gZmlsZXMgbGFyZ2VyIHRoYW4gSU5UX01BWC4gKi8KK3N0YXRpYyB2b2lkCitwcm9jZXNzRmlsZShjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpmaWxlbmFtZSwgdm9pZCAqYXJncykKK3sKKyAgWE1MX1BhcnNlciBwYXJzZXIgPSAoKFBST0NFU1NfQVJHUyAqKWFyZ3MpLT5wYXJzZXI7CisgIGludCAqcmV0UHRyID0gKChQUk9DRVNTX0FSR1MgKilhcmdzKS0+cmV0UHRyOworICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgKGNvbnN0IGNoYXIgKilkYXRhLCAoaW50KXNpemUsIDEpID09IFhNTF9TVEFUVVNfRVJST1IpIHsKKyAgICByZXBvcnRFcnJvcihwYXJzZXIsIGZpbGVuYW1lKTsKKyAgICAqcmV0UHRyID0gMDsKKyAgfQorICBlbHNlCisgICAgKnJldFB0ciA9IDE7Cit9CisKKyNpZiAoZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX1dBVENPTUNfXykpCisKK3N0YXRpYyBpbnQKK2lzQXNjaWlMZXR0ZXIoWE1MX0NoYXIgYykKK3sKKyAgcmV0dXJuIChUKCdhJykgPD0gYyAmJiBjIDw9IFQoJ3onKSkgfHwgKFQoJ0EnKSA8PSBjICYmIGMgPD0gVCgnWicpKTsKK30KKworI2VuZGlmIC8qIFdJTjMyICovCisKK3N0YXRpYyBjb25zdCBYTUxfQ2hhciAqCityZXNvbHZlU3lzdGVtSWQoY29uc3QgWE1MX0NoYXIgKmJhc2UsIGNvbnN0IFhNTF9DaGFyICpzeXN0ZW1JZCwKKyAgICAgICAgICAgICAgICBYTUxfQ2hhciAqKnRvRnJlZSkKK3sKKyAgWE1MX0NoYXIgKnM7CisgICp0b0ZyZWUgPSAwOworICBpZiAoIWJhc2UKKyAgICAgIHx8ICpzeXN0ZW1JZCA9PSBUKCcvJykKKyNpZiAoZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX1dBVENPTUNfXykpCisgICAgICB8fCAqc3lzdGVtSWQgPT0gVCgnXFwnKQorICAgICAgfHwgKGlzQXNjaWlMZXR0ZXIoc3lzdGVtSWRbMF0pICYmIHN5c3RlbUlkWzFdID09IFQoJzonKSkKKyNlbmRpZgorICAgICApCisgICAgcmV0dXJuIHN5c3RlbUlkOworICAqdG9GcmVlID0gKFhNTF9DaGFyICopbWFsbG9jKCh0Y3NsZW4oYmFzZSkgKyB0Y3NsZW4oc3lzdGVtSWQpICsgMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihYTUxfQ2hhcikpOworICBpZiAoISp0b0ZyZWUpCisgICAgcmV0dXJuIHN5c3RlbUlkOworICB0Y3NjcHkoKnRvRnJlZSwgYmFzZSk7CisgIHMgPSAqdG9GcmVlOworICBpZiAodGNzcmNocihzLCBUKCcvJykpKQorICAgIHMgPSB0Y3NyY2hyKHMsIFQoJy8nKSkgKyAxOworI2lmIChkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9fV0FUQ09NQ19fKSkKKyAgaWYgKHRjc3JjaHIocywgVCgnXFwnKSkpCisgICAgcyA9IHRjc3JjaHIocywgVCgnXFwnKSkgKyAxOworI2VuZGlmCisgIHRjc2NweShzLCBzeXN0ZW1JZCk7CisgIHJldHVybiAqdG9GcmVlOworfQorCitzdGF0aWMgaW50CitleHRlcm5hbEVudGl0eVJlZkZpbGVtYXAoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJsaWNJZCkKK3sKKyAgaW50IHJlc3VsdDsKKyAgWE1MX0NoYXIgKnM7CisgIGNvbnN0IFhNTF9DaGFyICpmaWxlbmFtZTsKKyAgWE1MX1BhcnNlciBlbnRQYXJzZXIgPSBYTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUocGFyc2VyLCBjb250ZXh0LCAwKTsKKyAgUFJPQ0VTU19BUkdTIGFyZ3M7CisgIGFyZ3MucmV0UHRyID0gJnJlc3VsdDsKKyAgYXJncy5wYXJzZXIgPSBlbnRQYXJzZXI7CisgIGZpbGVuYW1lID0gcmVzb2x2ZVN5c3RlbUlkKGJhc2UsIHN5c3RlbUlkLCAmcyk7CisgIFhNTF9TZXRCYXNlKGVudFBhcnNlciwgZmlsZW5hbWUpOworICBpZiAoIWZpbGVtYXAoZmlsZW5hbWUsIHByb2Nlc3NGaWxlLCAmYXJncykpCisgICAgcmVzdWx0ID0gMDsKKyAgZnJlZShzKTsKKyAgWE1MX1BhcnNlckZyZWUoZW50UGFyc2VyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludAorcHJvY2Vzc1N0cmVhbShjb25zdCBYTUxfQ2hhciAqZmlsZW5hbWUsIFhNTF9QYXJzZXIgcGFyc2VyKQoreworICAvKiBwYXNzaW5nIE5VTEwgZm9yIGZpbGVuYW1lIG1lYW5zIHJlYWQgaW50cHV0IGZyb20gc3RkaW4gKi8KKyAgaW50IGZkID0gMDsgICAvKiAwIGlzIHRoZSBmaWxlbm8gZm9yIHN0ZGluICovCisKKyAgaWYgKGZpbGVuYW1lICE9IE5VTEwpIHsKKyAgICBmZCA9IHRvcGVuKGZpbGVuYW1lLCBPX0JJTkFSWXxPX1JET05MWSk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgdHBlcnJvcihmaWxlbmFtZSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgZm9yICg7OykgeworICAgIGludCBucmVhZDsKKyAgICBjaGFyICpidWYgPSAoY2hhciAqKVhNTF9HZXRCdWZmZXIocGFyc2VyLCBSRUFEX1NJWkUpOworICAgIGlmICghYnVmKSB7CisgICAgICBpZiAoZmlsZW5hbWUgIT0gTlVMTCkKKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgZnRwcmludGYoc3RkZXJyLCBUKCIlczogb3V0IG9mIG1lbW9yeVxuIiksCisgICAgICAgICAgICAgICBmaWxlbmFtZSAhPSBOVUxMID8gZmlsZW5hbWUgOiAieG1sd2YiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBucmVhZCA9IHJlYWQoZmQsIGJ1ZiwgUkVBRF9TSVpFKTsKKyAgICBpZiAobnJlYWQgPCAwKSB7CisgICAgICB0cGVycm9yKGZpbGVuYW1lICE9IE5VTEwgPyBmaWxlbmFtZSA6ICJTVERJTiIpOworICAgICAgaWYgKGZpbGVuYW1lICE9IE5VTEwpCisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoWE1MX1BhcnNlQnVmZmVyKHBhcnNlciwgbnJlYWQsIG5yZWFkID09IDApID09IFhNTF9TVEFUVVNfRVJST1IpIHsKKyAgICAgIHJlcG9ydEVycm9yKHBhcnNlciwgZmlsZW5hbWUgIT0gTlVMTCA/IGZpbGVuYW1lIDogIlNURElOIik7CisgICAgICBpZiAoZmlsZW5hbWUgIT0gTlVMTCkKKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChucmVhZCA9PSAwKSB7CisgICAgICBpZiAoZmlsZW5hbWUgIT0gTlVMTCkKKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgYnJlYWs7OworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIGludAorZXh0ZXJuYWxFbnRpdHlSZWZTdHJlYW0oWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnB1YmxpY0lkKQoreworICBYTUxfQ2hhciAqczsKKyAgY29uc3QgWE1MX0NoYXIgKmZpbGVuYW1lOworICBpbnQgcmV0OworICBYTUxfUGFyc2VyIGVudFBhcnNlciA9IFhNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZShwYXJzZXIsIGNvbnRleHQsIDApOworICBmaWxlbmFtZSA9IHJlc29sdmVTeXN0ZW1JZChiYXNlLCBzeXN0ZW1JZCwgJnMpOworICBYTUxfU2V0QmFzZShlbnRQYXJzZXIsIGZpbGVuYW1lKTsKKyAgcmV0ID0gcHJvY2Vzc1N0cmVhbShmaWxlbmFtZSwgZW50UGFyc2VyKTsKKyAgZnJlZShzKTsKKyAgWE1MX1BhcnNlckZyZWUoZW50UGFyc2VyKTsKKyAgcmV0dXJuIHJldDsKK30KKworaW50CitYTUxfUHJvY2Vzc0ZpbGUoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZsYWdzKQoreworICBpbnQgcmVzdWx0OworCisgIGlmICghWE1MX1NldEJhc2UocGFyc2VyLCBmaWxlbmFtZSkpIHsKKyAgICBmdHByaW50ZihzdGRlcnIsIFQoIiVzOiBvdXQgb2YgbWVtb3J5IiksIGZpbGVuYW1lKTsKKyAgICBleGl0KDEpOworICB9CisKKyAgaWYgKGZsYWdzICYgWE1MX0VYVEVSTkFMX0VOVElUSUVTKQorICAgICAgWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlcihwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIFhNTF9NQVBfRklMRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBleHRlcm5hbEVudGl0eVJlZkZpbGVtYXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBleHRlcm5hbEVudGl0eVJlZlN0cmVhbSk7CisgIGlmIChmbGFncyAmIFhNTF9NQVBfRklMRSkgeworICAgIFBST0NFU1NfQVJHUyBhcmdzOworICAgIGFyZ3MucmV0UHRyID0gJnJlc3VsdDsKKyAgICBhcmdzLnBhcnNlciA9IHBhcnNlcjsKKyAgICBpZiAoIWZpbGVtYXAoZmlsZW5hbWUsIHByb2Nlc3NGaWxlLCAmYXJncykpCisgICAgICByZXN1bHQgPSAwOworICB9CisgIGVsc2UKKyAgICByZXN1bHQgPSBwcm9jZXNzU3RyZWFtKGZpbGVuYW1lLCBwYXJzZXIpOworICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEveG1sd2YveG1sZmlsZS5oIGIvZXhwYXQtMi4wLjEveG1sd2YveG1sZmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwOTNlY2MKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS94bWx3Zi94bWxmaWxlLmgKQEAgLTAsMCArMSwyMCBAQAorLyogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5IFRoYWkgT3BlbiBTb3VyY2UgU29mdHdhcmUgQ2VudGVyIEx0ZAorICAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIGNvcHlpbmcgcGVybWlzc2lvbi4KKyovCisKKyNkZWZpbmUgWE1MX01BUF9GSUxFIDAxCisjZGVmaW5lIFhNTF9FWFRFUk5BTF9FTlRJVElFUyAwMgorCisjaWZkZWYgWE1MX0xBUkdFX1NJWkUKKyNpZiBkZWZpbmVkKFhNTF9VU0VfTVNDX0VYVEVOU0lPTlMpICYmIF9NU0NfVkVSIDwgMTQwMAorI2RlZmluZSBYTUxfRk1UX0lOVF9NT0QgIkk2NCIKKyNlbHNlCisjZGVmaW5lIFhNTF9GTVRfSU5UX01PRCAibGwiCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIFhNTF9GTVRfSU5UX01PRCAibCIKKyNlbmRpZgorCitleHRlcm4gaW50IFhNTF9Qcm9jZXNzRmlsZShYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL3htbHdmL3htbG1pbWUuYyBiL2V4cGF0LTIuMC4xL3htbHdmL3htbG1pbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmEwZTdmCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEveG1sd2YveG1sbWltZS5jCkBAIC0wLDAgKzEsMTYzIEBACisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAieG1sbWltZS5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqCitnZXRUb2soY29uc3QgY2hhciAqKnBwKQoreworICAvKiBpbkNvbW1lbnQgbWVhbnMgb25lIGxldmVsIG9mIG5lc3Rpbmc7IGluQ29tbWVudCsxIG1lYW5zIHR3byBsZXZlbHMgZXRjICovCisgIGVudW0geyBpbkF0b20sIGluU3RyaW5nLCBpbml0LCBpbkNvbW1lbnQgfTsKKyAgaW50IHN0YXRlID0gaW5pdDsKKyAgY29uc3QgY2hhciAqdG9rU3RhcnQgPSAwOworICBmb3IgKDs7KSB7CisgICAgc3dpdGNoICgqKnBwKSB7CisgICAgY2FzZSAnXDAnOgorICAgICAgaWYgKHN0YXRlID09IGluQXRvbSkKKyAgICAgICAgcmV0dXJuIHRva1N0YXJ0OworICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSAnICc6CisgICAgY2FzZSAnXHInOgorICAgIGNhc2UgJ1x0JzoKKyAgICBjYXNlICdcbic6CisgICAgICBpZiAoc3RhdGUgPT0gaW5BdG9tKQorICAgICAgICByZXR1cm4gdG9rU3RhcnQ7CisgICAgICBicmVhazsKKyAgICBjYXNlICcoJzoKKyAgICAgIGlmIChzdGF0ZSA9PSBpbkF0b20pCisgICAgICAgIHJldHVybiB0b2tTdGFydDsKKyAgICAgIGlmIChzdGF0ZSAhPSBpblN0cmluZykKKyAgICAgICAgc3RhdGUrKzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJyknOgorICAgICAgaWYgKHN0YXRlID4gaW5pdCkKKyAgICAgICAgLS1zdGF0ZTsKKyAgICAgIGVsc2UgaWYgKHN0YXRlICE9IGluU3RyaW5nKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJzsnOgorICAgIGNhc2UgJy8nOgorICAgIGNhc2UgJz0nOgorICAgICAgaWYgKHN0YXRlID09IGluQXRvbSkKKyAgICAgICAgcmV0dXJuIHRva1N0YXJ0OworICAgICAgaWYgKHN0YXRlID09IGluaXQpCisgICAgICAgIHJldHVybiAoKnBwKSsrOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnXFwnOgorICAgICAgKysqcHA7CisgICAgICBpZiAoKipwcCA9PSAnXDAnKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJyInOgorICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgY2FzZSBpblN0cmluZzoKKyAgICAgICAgKysqcHA7CisgICAgICAgIHJldHVybiB0b2tTdGFydDsKKyAgICAgIGNhc2UgaW5BdG9tOgorICAgICAgICByZXR1cm4gdG9rU3RhcnQ7CisgICAgICBjYXNlIGluaXQ6CisgICAgICAgIHRva1N0YXJ0ID0gKnBwOworICAgICAgICBzdGF0ZSA9IGluU3RyaW5nOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoc3RhdGUgPT0gaW5pdCkgeworICAgICAgICB0b2tTdGFydCA9ICpwcDsKKyAgICAgICAgc3RhdGUgPSBpbkF0b207CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgKysqcHA7CisgIH0KKyAgLyogbm90IHJlYWNoZWQgKi8KK30KKworLyoga2V5IG11c3QgYmUgbG93ZXJjYXNlIEFTQ0lJICovCisKK3N0YXRpYyBpbnQKK21hdGNoa2V5KGNvbnN0IGNoYXIgKnN0YXJ0LCBjb25zdCBjaGFyICplbmQsIGNvbnN0IGNoYXIgKmtleSkKK3sKKyAgaWYgKCFzdGFydCkKKyAgICByZXR1cm4gMDsKKyAgZm9yICg7IHN0YXJ0ICE9IGVuZDsgc3RhcnQrKywga2V5KyspCisgICAgaWYgKCpzdGFydCAhPSAqa2V5ICYmICpzdGFydCAhPSAnQScgKyAoKmtleSAtICdhJykpCisgICAgICByZXR1cm4gMDsKKyAgcmV0dXJuICprZXkgPT0gJ1wwJzsKK30KKwordm9pZAorZ2V0WE1MQ2hhcnNldChjb25zdCBjaGFyICpidWYsIGNoYXIgKmNoYXJzZXQpCit7CisgIGNvbnN0IGNoYXIgKm5leHQsICpwOworCisgIGNoYXJzZXRbMF0gPSAnXDAnOworICBuZXh0ID0gYnVmOworICBwID0gZ2V0VG9rKCZuZXh0KTsKKyAgaWYgKG1hdGNoa2V5KHAsIG5leHQsICJ0ZXh0IikpCisgICAgc3RyY3B5KGNoYXJzZXQsICJ1cy1hc2NpaSIpOworICBlbHNlIGlmICghbWF0Y2hrZXkocCwgbmV4dCwgImFwcGxpY2F0aW9uIikpCisgICAgcmV0dXJuOworICBwID0gZ2V0VG9rKCZuZXh0KTsKKyAgaWYgKCFwIHx8ICpwICE9ICcvJykKKyAgICByZXR1cm47CisgIHAgPSBnZXRUb2soJm5leHQpOworI2lmIDAKKyAgaWYgKCFtYXRjaGtleShwLCBuZXh0LCAieG1sIikgJiYgY2hhcnNldFswXSA9PSAnXDAnKQorICAgIHJldHVybjsKKyNlbmRpZgorICBwID0gZ2V0VG9rKCZuZXh0KTsKKyAgd2hpbGUgKHApIHsKKyAgICBpZiAoKnAgPT0gJzsnKSB7CisgICAgICBwID0gZ2V0VG9rKCZuZXh0KTsKKyAgICAgIGlmIChtYXRjaGtleShwLCBuZXh0LCAiY2hhcnNldCIpKSB7CisgICAgICAgIHAgPSBnZXRUb2soJm5leHQpOworICAgICAgICBpZiAocCAmJiAqcCA9PSAnPScpIHsKKyAgICAgICAgICBwID0gZ2V0VG9rKCZuZXh0KTsKKyAgICAgICAgICBpZiAocCkgeworICAgICAgICAgICAgY2hhciAqcyA9IGNoYXJzZXQ7CisgICAgICAgICAgICBpZiAoKnAgPT0gJyInKSB7CisgICAgICAgICAgICAgIHdoaWxlICgrK3AgIT0gbmV4dCAtIDEpIHsKKyAgICAgICAgICAgICAgICBpZiAoKnAgPT0gJ1xcJykKKyAgICAgICAgICAgICAgICAgICsrcDsKKyAgICAgICAgICAgICAgICBpZiAocyA9PSBjaGFyc2V0ICsgQ0hBUlNFVF9NQVggLSAxKSB7CisgICAgICAgICAgICAgICAgICBjaGFyc2V0WzBdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqcysrID0gKnA7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKnMrKyA9ICdcMCc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgaWYgKG5leHQgLSBwID4gQ0hBUlNFVF9NQVggLSAxKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB3aGlsZSAocCAhPSBuZXh0KQorICAgICAgICAgICAgICAgICpzKysgPSAqcCsrOworICAgICAgICAgICAgICAqcyA9IDA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICBwID0gZ2V0VG9rKCZuZXh0KTsKKyAgfQorfQorCisjaWZkZWYgVEVTVAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGNoYXIgYnVmW0NIQVJTRVRfTUFYXTsKKyAgaWYgKGFyZ2MgPD0gMSkKKyAgICByZXR1cm4gMTsKKyAgcHJpbnRmKCIlc1xuIiwgYXJndlsxXSk7CisgIGdldFhNTENoYXJzZXQoYXJndlsxXSwgYnVmKTsKKyAgcHJpbnRmKCJjaGFyc2V0PVwiJXNcIlxuIiwgYnVmKTsKKyAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBURVNUICovCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS94bWx3Zi94bWxtaW1lLmggYi9leHBhdC0yLjAuMS94bWx3Zi94bWxtaW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwMzU2ZAotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL3htbHdmL3htbG1pbWUuaApAQCAtMCwwICsxLDE5IEBACisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFJlZ2lzdGVyZWQgY2hhcnNldCBuYW1lcyBhcmUgYXQgbW9zdCA0MCBjaGFyYWN0ZXJzIGxvbmcuICovCisKKyNkZWZpbmUgQ0hBUlNFVF9NQVggNDEKKworLyogRmlndXJlIG91dCB0aGUgY2hhcnNldCB0byB1c2UgZnJvbSB0aGUgQ29udGVudFR5cGUuCisgICBidWYgY29udGFpbnMgdGhlIGJvZHkgb2YgdGhlIGhlYWRlciBmaWVsZCAodGhlIHBhcnQgYWZ0ZXIgIkNvbnRlbnQtVHlwZToiKS4KKyAgIGNoYXJzZXQgZ2V0cyB0aGUgY2hhcnNldCB0byB1c2UuICBJdCBtdXN0IGJlIGF0IGxlYXN0IENIQVJTRVRfTUFYIGNoYXJzCisgICBsb25nLiAgY2hhcnNldCB3aWxsIGJlIGVtcHR5IGlmIHRoZSBkZWZhdWx0IGNoYXJzZXQgc2hvdWxkIGJlIHVzZWQuCisqLworCit2b2lkIGdldFhNTENoYXJzZXQoY29uc3QgY2hhciAqYnVmLCBjaGFyICpjaGFyc2V0KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL3htbHdmL3htbHRjaGFyLmggYi9leHBhdC0yLjAuMS94bWx3Zi94bWx0Y2hhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwODg1NzUKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS94bWx3Zi94bWx0Y2hhci5oCkBAIC0wLDAgKzEsMzYgQEAKKyNpZmRlZiBYTUxfVU5JQ09ERQorI2lmbmRlZiBYTUxfVU5JQ09ERV9XQ0hBUl9UCisjZXJyb3IgeG1sd2YgcmVxdWlyZXMgYSAxNi1iaXQgVW5pY29kZS1jb21wYXRpYmxlIHdjaGFyX3QgCisjZW5kaWYKKyNkZWZpbmUgVCh4KSBMICMjIHgKKyNkZWZpbmUgZnRwcmludGYgZndwcmludGYKKyNkZWZpbmUgdGZvcGVuIF93Zm9wZW4KKyNkZWZpbmUgZnB1dHRzIGZwdXR3cworI2RlZmluZSBwdXR0YyBwdXR3YworI2RlZmluZSB0Y3NjbXAgd2NzY21wCisjZGVmaW5lIHRjc2NweSB3Y3NjcHkKKyNkZWZpbmUgdGNzY2F0IHdjc2NhdAorI2RlZmluZSB0Y3NjaHIgd2NzY2hyCisjZGVmaW5lIHRjc3JjaHIgd2NzcmNocgorI2RlZmluZSB0Y3NsZW4gd2NzbGVuCisjZGVmaW5lIHRwZXJyb3IgX3dwZXJyb3IKKyNkZWZpbmUgdG9wZW4gX3dvcGVuCisjZGVmaW5lIHRtYWluIHdtYWluCisjZGVmaW5lIHRyZW1vdmUgX3dyZW1vdmUKKyNlbHNlIC8qIG5vdCBYTUxfVU5JQ09ERSAqLworI2RlZmluZSBUKHgpIHgKKyNkZWZpbmUgZnRwcmludGYgZnByaW50ZgorI2RlZmluZSB0Zm9wZW4gZm9wZW4KKyNkZWZpbmUgZnB1dHRzIGZwdXRzCisjZGVmaW5lIHB1dHRjIHB1dGMKKyNkZWZpbmUgdGNzY21wIHN0cmNtcAorI2RlZmluZSB0Y3NjcHkgc3RyY3B5CisjZGVmaW5lIHRjc2NhdCBzdHJjYXQKKyNkZWZpbmUgdGNzY2hyIHN0cmNocgorI2RlZmluZSB0Y3NyY2hyIHN0cnJjaHIKKyNkZWZpbmUgdGNzbGVuIHN0cmxlbgorI2RlZmluZSB0cGVycm9yIHBlcnJvcgorI2RlZmluZSB0b3BlbiBvcGVuCisjZGVmaW5lIHRtYWluIG1haW4KKyNkZWZpbmUgdHJlbW92ZSByZW1vdmUKKyNlbmRpZiAvKiBub3QgWE1MX1VOSUNPREUgKi8KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL3htbHdmL3htbHVybC5oIGIvZXhwYXQtMi4wLjEveG1sd2YveG1sdXJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMyOTkxMwotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL3htbHdmL3htbHVybC5oCkBAIC0wLDAgKzEsMTMgQEAKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworaW50IFhNTF9VUkxJbml0KCk7Cit2b2lkIFhNTF9VUkxVbmluaXQoKTsKK2ludCBYTUxfUHJvY2Vzc1VSTChYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqdXJsLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZsYWdzKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL3htbHdmL3htbHdmLmMgYi9leHBhdC0yLjAuMS94bWx3Zi94bWx3Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYTQzM2QKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS94bWx3Zi94bWx3Zi5jCkBAIC0wLDAgKzEsODU5IEBACisvKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgVGhhaSBPcGVuIFNvdXJjZSBTb2Z0d2FyZSBDZW50ZXIgTHRkCisgICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgY29weWluZyBwZXJtaXNzaW9uLgorKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJleHBhdC5oIgorI2luY2x1ZGUgImNvZGVwYWdlLmgiCisjaW5jbHVkZSAieG1sZmlsZS5oIgorI2luY2x1ZGUgInhtbHRjaGFyLmgiCisKKyNpZmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgPGNydGRiZy5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fYW1pZ2Fvc19fKSAmJiBkZWZpbmVkKF9fVVNFX0lOTElORV9fKQorI2luY2x1ZGUgPHByb3RvL2V4cGF0Lmg+CisjZW5kaWYKKworLyogVGhpcyBlbnN1cmVzIHByb3BlciBzb3J0aW5nLiAqLworCisjZGVmaW5lIE5TU0VQIFQoJ1wwMDEnKQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCitjaGFyYWN0ZXJEYXRhKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqcywgaW50IGxlbikKK3sKKyAgRklMRSAqZnAgPSAoRklMRSAqKXVzZXJEYXRhOworICBmb3IgKDsgbGVuID4gMDsgLS1sZW4sICsrcykgeworICAgIHN3aXRjaCAoKnMpIHsKKyAgICBjYXNlIFQoJyYnKToKKyAgICAgIGZwdXR0cyhUKCImYW1wOyIpLCBmcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFQoJzwnKToKKyAgICAgIGZwdXR0cyhUKCImbHQ7IiksIGZwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVCgnPicpOgorICAgICAgZnB1dHRzKFQoIiZndDsiKSwgZnApOworICAgICAgYnJlYWs7CisjaWZkZWYgVzNDMTROCisgICAgY2FzZSAxMzoKKyAgICAgIGZwdXR0cyhUKCImI3hEOyIpLCBmcCk7CisgICAgICBicmVhazsKKyNlbHNlCisgICAgY2FzZSBUKCciJyk6CisgICAgICBmcHV0dHMoVCgiJnF1b3Q7IiksIGZwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgOToKKyAgICBjYXNlIDEwOgorICAgIGNhc2UgMTM6CisgICAgICBmdHByaW50ZihmcCwgVCgiJiMlZDsiKSwgKnMpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgcHV0dGMoKnMsIGZwKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorYXR0cmlidXRlVmFsdWUoRklMRSAqZnAsIGNvbnN0IFhNTF9DaGFyICpzKQoreworICBwdXR0YyhUKCc9JyksIGZwKTsKKyAgcHV0dGMoVCgnIicpLCBmcCk7CisgIGZvciAoOzspIHsKKyAgICBzd2l0Y2ggKCpzKSB7CisgICAgY2FzZSAwOgorICAgIGNhc2UgTlNTRVA6CisgICAgICBwdXR0YyhUKCciJyksIGZwKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFQoJyYnKToKKyAgICAgIGZwdXR0cyhUKCImYW1wOyIpLCBmcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFQoJzwnKToKKyAgICAgIGZwdXR0cyhUKCImbHQ7IiksIGZwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVCgnIicpOgorICAgICAgZnB1dHRzKFQoIiZxdW90OyIpLCBmcCk7CisgICAgICBicmVhazsKKyNpZmRlZiBXM0MxNE4KKyAgICBjYXNlIDk6CisgICAgICBmcHV0dHMoVCgiJiN4OTsiKSwgZnApOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDoKKyAgICAgIGZwdXR0cyhUKCImI3hBOyIpLCBmcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEzOgorICAgICAgZnB1dHRzKFQoIiYjeEQ7IiksIGZwKTsKKyAgICAgIGJyZWFrOworI2Vsc2UKKyAgICBjYXNlIFQoJz4nKToKKyAgICAgIGZwdXR0cyhUKCImZ3Q7IiksIGZwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgOToKKyAgICBjYXNlIDEwOgorICAgIGNhc2UgMTM6CisgICAgICBmdHByaW50ZihmcCwgVCgiJiMlZDsiKSwgKnMpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgcHV0dGMoKnMsIGZwKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBzKys7CisgIH0KK30KKworLyogTGV4aWNvZ3JhcGhpY2FsbHkgY29tcGFyaW5nIFVURi04IGVuY29kZWQgYXR0cmlidXRlIHZhbHVlcywKK2lzIGVxdWl2YWxlbnQgdG8gbGV4aWNvZ3JhcGhpY2FsbHkgY29tcGFyaW5nIGJhc2VkIG9uIHRoZSBjaGFyYWN0ZXIgbnVtYmVyLiAqLworCitzdGF0aWMgaW50CithdHRjbXAoY29uc3Qgdm9pZCAqYXR0MSwgY29uc3Qgdm9pZCAqYXR0MikKK3sKKyAgcmV0dXJuIHRjc2NtcCgqKGNvbnN0IFhNTF9DaGFyICoqKWF0dDEsICooY29uc3QgWE1MX0NoYXIgKiopYXR0Mik7Cit9CisKK3N0YXRpYyB2b2lkIFhNTENBTEwKK3N0YXJ0RWxlbWVudCh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKm5hbWUsIGNvbnN0IFhNTF9DaGFyICoqYXR0cykKK3sKKyAgaW50IG5BdHRzOworICBjb25zdCBYTUxfQ2hhciAqKnA7CisgIEZJTEUgKmZwID0gKEZJTEUgKil1c2VyRGF0YTsKKyAgcHV0dGMoVCgnPCcpLCBmcCk7CisgIGZwdXR0cyhuYW1lLCBmcCk7CisKKyAgcCA9IGF0dHM7CisgIHdoaWxlICgqcCkKKyAgICArK3A7CisgIG5BdHRzID0gKGludCkoKHAgLSBhdHRzKSA+PiAxKTsKKyAgaWYgKG5BdHRzID4gMSkKKyAgICBxc29ydCgodm9pZCAqKWF0dHMsIG5BdHRzLCBzaXplb2YoWE1MX0NoYXIgKikgKiAyLCBhdHRjbXApOworICB3aGlsZSAoKmF0dHMpIHsKKyAgICBwdXR0YyhUKCcgJyksIGZwKTsKKyAgICBmcHV0dHMoKmF0dHMrKywgZnApOworICAgIGF0dHJpYnV0ZVZhbHVlKGZwLCAqYXR0cyk7CisgICAgYXR0cysrOworICB9CisgIHB1dHRjKFQoJz4nKSwgZnApOworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCitlbmRFbGVtZW50KHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqbmFtZSkKK3sKKyAgRklMRSAqZnAgPSAoRklMRSAqKXVzZXJEYXRhOworICBwdXR0YyhUKCc8JyksIGZwKTsKKyAgcHV0dGMoVCgnLycpLCBmcCk7CisgIGZwdXR0cyhuYW1lLCBmcCk7CisgIHB1dHRjKFQoJz4nKSwgZnApOworfQorCitzdGF0aWMgaW50Cituc2F0dGNtcChjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCit7CisgIGNvbnN0IFhNTF9DaGFyICphdHQxID0gKihjb25zdCBYTUxfQ2hhciAqKilwMTsKKyAgY29uc3QgWE1MX0NoYXIgKmF0dDIgPSAqKGNvbnN0IFhNTF9DaGFyICoqKXAyOworICBpbnQgc2VwMSA9ICh0Y3NyY2hyKGF0dDEsIE5TU0VQKSAhPSAwKTsKKyAgaW50IHNlcDIgPSAodGNzcmNocihhdHQxLCBOU1NFUCkgIT0gMCk7CisgIGlmIChzZXAxICE9IHNlcDIpCisgICAgcmV0dXJuIHNlcDEgLSBzZXAyOworICByZXR1cm4gdGNzY21wKGF0dDEsIGF0dDIpOworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCitzdGFydEVsZW1lbnROUyh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKm5hbWUsIGNvbnN0IFhNTF9DaGFyICoqYXR0cykKK3sKKyAgaW50IG5BdHRzOworICBpbnQgbnNpOworICBjb25zdCBYTUxfQ2hhciAqKnA7CisgIEZJTEUgKmZwID0gKEZJTEUgKil1c2VyRGF0YTsKKyAgY29uc3QgWE1MX0NoYXIgKnNlcDsKKyAgcHV0dGMoVCgnPCcpLCBmcCk7CisKKyAgc2VwID0gdGNzcmNocihuYW1lLCBOU1NFUCk7CisgIGlmIChzZXApIHsKKyAgICBmcHV0dHMoVCgibjE6IiksIGZwKTsKKyAgICBmcHV0dHMoc2VwICsgMSwgZnApOworICAgIGZwdXR0cyhUKCIgeG1sbnM6bjEiKSwgZnApOworICAgIGF0dHJpYnV0ZVZhbHVlKGZwLCBuYW1lKTsKKyAgICBuc2kgPSAyOworICB9CisgIGVsc2UgeworICAgIGZwdXR0cyhuYW1lLCBmcCk7CisgICAgbnNpID0gMTsKKyAgfQorCisgIHAgPSBhdHRzOworICB3aGlsZSAoKnApCisgICAgKytwOworICBuQXR0cyA9IChpbnQpKChwIC0gYXR0cykgPj4gMSk7CisgIGlmIChuQXR0cyA+IDEpCisgICAgcXNvcnQoKHZvaWQgKilhdHRzLCBuQXR0cywgc2l6ZW9mKFhNTF9DaGFyICopICogMiwgbnNhdHRjbXApOworICB3aGlsZSAoKmF0dHMpIHsKKyAgICBuYW1lID0gKmF0dHMrKzsKKyAgICBzZXAgPSB0Y3NyY2hyKG5hbWUsIE5TU0VQKTsKKyAgICBwdXR0YyhUKCcgJyksIGZwKTsKKyAgICBpZiAoc2VwKSB7CisgICAgICBmdHByaW50ZihmcCwgVCgibiVkOiIpLCBuc2kpOworICAgICAgZnB1dHRzKHNlcCArIDEsIGZwKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgZnB1dHRzKG5hbWUsIGZwKTsKKyAgICBhdHRyaWJ1dGVWYWx1ZShmcCwgKmF0dHMpOworICAgIGlmIChzZXApIHsKKyAgICAgIGZ0cHJpbnRmKGZwLCBUKCIgeG1sbnM6biVkIiksIG5zaSsrKTsKKyAgICAgIGF0dHJpYnV0ZVZhbHVlKGZwLCBuYW1lKTsKKyAgICB9CisgICAgYXR0cysrOworICB9CisgIHB1dHRjKFQoJz4nKSwgZnApOworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCitlbmRFbGVtZW50TlModm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpuYW1lKQoreworICBGSUxFICpmcCA9IChGSUxFICopdXNlckRhdGE7CisgIGNvbnN0IFhNTF9DaGFyICpzZXA7CisgIHB1dHRjKFQoJzwnKSwgZnApOworICBwdXR0YyhUKCcvJyksIGZwKTsKKyAgc2VwID0gdGNzcmNocihuYW1lLCBOU1NFUCk7CisgIGlmIChzZXApIHsKKyAgICBmcHV0dHMoVCgibjE6IiksIGZwKTsKKyAgICBmcHV0dHMoc2VwICsgMSwgZnApOworICB9CisgIGVsc2UKKyAgICBmcHV0dHMobmFtZSwgZnApOworICBwdXR0YyhUKCc+JyksIGZwKTsKK30KKworI2lmbmRlZiBXM0MxNE4KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorcHJvY2Vzc2luZ0luc3RydWN0aW9uKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpkYXRhKQoreworICBGSUxFICpmcCA9IChGSUxFICopdXNlckRhdGE7CisgIHB1dHRjKFQoJzwnKSwgZnApOworICBwdXR0YyhUKCc/JyksIGZwKTsKKyAgZnB1dHRzKHRhcmdldCwgZnApOworICBwdXR0YyhUKCcgJyksIGZwKTsKKyAgZnB1dHRzKGRhdGEsIGZwKTsKKyAgcHV0dGMoVCgnPycpLCBmcCk7CisgIHB1dHRjKFQoJz4nKSwgZnApOworfQorCisjZW5kaWYgLyogbm90IFczQzE0TiAqLworCitzdGF0aWMgdm9pZCBYTUxDQUxMCitkZWZhdWx0Q2hhcmFjdGVyRGF0YSh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKnMsIGludCBsZW4pCit7CisgIFhNTF9EZWZhdWx0Q3VycmVudCgoWE1MX1BhcnNlcikgdXNlckRhdGEpOworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCitkZWZhdWx0U3RhcnRFbGVtZW50KHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKiphdHRzKQoreworICBYTUxfRGVmYXVsdEN1cnJlbnQoKFhNTF9QYXJzZXIpIHVzZXJEYXRhKTsKK30KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorZGVmYXVsdEVuZEVsZW1lbnQodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpuYW1lKQoreworICBYTUxfRGVmYXVsdEN1cnJlbnQoKFhNTF9QYXJzZXIpIHVzZXJEYXRhKTsKK30KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorZGVmYXVsdFByb2Nlc3NpbmdJbnN0cnVjdGlvbih2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmRhdGEpCit7CisgIFhNTF9EZWZhdWx0Q3VycmVudCgoWE1MX1BhcnNlcikgdXNlckRhdGEpOworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCitub3BDaGFyYWN0ZXJEYXRhKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqcywgaW50IGxlbikKK3sKK30KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorbm9wU3RhcnRFbGVtZW50KHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqbmFtZSwgY29uc3QgWE1MX0NoYXIgKiphdHRzKQoreworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCitub3BFbmRFbGVtZW50KHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqbmFtZSkKK3sKK30KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorbm9wUHJvY2Vzc2luZ0luc3RydWN0aW9uKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpkYXRhKQoreworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCittYXJrdXAodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpzLCBpbnQgbGVuKQoreworICBGSUxFICpmcCA9IChGSUxFICopWE1MX0dldFVzZXJEYXRhKChYTUxfUGFyc2VyKSB1c2VyRGF0YSk7CisgIGZvciAoOyBsZW4gPiAwOyAtLWxlbiwgKytzKQorICAgIHB1dHRjKCpzLCBmcCk7Cit9CisKK3N0YXRpYyB2b2lkCittZXRhTG9jYXRpb24oWE1MX1BhcnNlciBwYXJzZXIpCit7CisgIGNvbnN0IFhNTF9DaGFyICp1cmkgPSBYTUxfR2V0QmFzZShwYXJzZXIpOworICBpZiAodXJpKQorICAgIGZ0cHJpbnRmKChGSUxFICopWE1MX0dldFVzZXJEYXRhKHBhcnNlciksIFQoIiB1cmk9XCIlc1wiIiksIHVyaSk7CisgIGZ0cHJpbnRmKChGSUxFICopWE1MX0dldFVzZXJEYXRhKHBhcnNlciksCisgICAgICAgICAgIFQoIiBieXRlPVwiJSIgWE1MX0ZNVF9JTlRfTU9EICJkXCIgbmJ5dGVzPVwiJWRcIiBcCisJCQkgbGluZT1cIiUiIFhNTF9GTVRfSU5UX01PRCAidVwiIGNvbD1cIiUiIFhNTF9GTVRfSU5UX01PRCAidVwiIiksCisgICAgICAgICAgIFhNTF9HZXRDdXJyZW50Qnl0ZUluZGV4KHBhcnNlciksCisgICAgICAgICAgIFhNTF9HZXRDdXJyZW50Qnl0ZUNvdW50KHBhcnNlciksCisgICAgICAgICAgIFhNTF9HZXRDdXJyZW50TGluZU51bWJlcihwYXJzZXIpLAorICAgICAgICAgICBYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlcihwYXJzZXIpKTsKK30KKworc3RhdGljIHZvaWQKK21ldGFTdGFydERvY3VtZW50KHZvaWQgKnVzZXJEYXRhKQoreworICBmcHV0dHMoVCgiPGRvY3VtZW50PlxuIiksIChGSUxFICopWE1MX0dldFVzZXJEYXRhKChYTUxfUGFyc2VyKSB1c2VyRGF0YSkpOworfQorCitzdGF0aWMgdm9pZAorbWV0YUVuZERvY3VtZW50KHZvaWQgKnVzZXJEYXRhKQoreworICBmcHV0dHMoVCgiPC9kb2N1bWVudD5cbiIpLCAoRklMRSAqKVhNTF9HZXRVc2VyRGF0YSgoWE1MX1BhcnNlcikgdXNlckRhdGEpKTsKK30KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorbWV0YVN0YXJ0RWxlbWVudCh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICoqYXR0cykKK3sKKyAgWE1MX1BhcnNlciBwYXJzZXIgPSAoWE1MX1BhcnNlcikgdXNlckRhdGE7CisgIEZJTEUgKmZwID0gKEZJTEUgKilYTUxfR2V0VXNlckRhdGEocGFyc2VyKTsKKyAgY29uc3QgWE1MX0NoYXIgKipzcGVjaWZpZWRBdHRzRW5kCisgICAgPSBhdHRzICsgWE1MX0dldFNwZWNpZmllZEF0dHJpYnV0ZUNvdW50KHBhcnNlcik7CisgIGNvbnN0IFhNTF9DaGFyICoqaWRBdHRQdHI7CisgIGludCBpZEF0dEluZGV4ID0gWE1MX0dldElkQXR0cmlidXRlSW5kZXgocGFyc2VyKTsKKyAgaWYgKGlkQXR0SW5kZXggPCAwKQorICAgIGlkQXR0UHRyID0gMDsKKyAgZWxzZQorICAgIGlkQXR0UHRyID0gYXR0cyArIGlkQXR0SW5kZXg7CisgICAgCisgIGZ0cHJpbnRmKGZwLCBUKCI8c3RhcnR0YWcgbmFtZT1cIiVzXCIiKSwgbmFtZSk7CisgIG1ldGFMb2NhdGlvbihwYXJzZXIpOworICBpZiAoKmF0dHMpIHsKKyAgICBmcHV0dHMoVCgiPlxuIiksIGZwKTsKKyAgICBkbyB7CisgICAgICBmdHByaW50ZihmcCwgVCgiPGF0dHJpYnV0ZSBuYW1lPVwiJXNcIiB2YWx1ZT1cIiIpLCBhdHRzWzBdKTsKKyAgICAgIGNoYXJhY3RlckRhdGEoZnAsIGF0dHNbMV0sIChpbnQpdGNzbGVuKGF0dHNbMV0pKTsKKyAgICAgIGlmIChhdHRzID49IHNwZWNpZmllZEF0dHNFbmQpCisgICAgICAgIGZwdXR0cyhUKCJcIiBkZWZhdWx0ZWQ9XCJ5ZXNcIi8+XG4iKSwgZnApOworICAgICAgZWxzZSBpZiAoYXR0cyA9PSBpZEF0dFB0cikKKyAgICAgICAgZnB1dHRzKFQoIlwiIGlkPVwieWVzXCIvPlxuIiksIGZwKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZnB1dHRzKFQoIlwiLz5cbiIpLCBmcCk7CisgICAgfSB3aGlsZSAoKihhdHRzICs9IDIpKTsKKyAgICBmcHV0dHMoVCgiPC9zdGFydHRhZz5cbiIpLCBmcCk7CisgIH0KKyAgZWxzZQorICAgIGZwdXR0cyhUKCIvPlxuIiksIGZwKTsKK30KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorbWV0YUVuZEVsZW1lbnQodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpuYW1lKQoreworICBYTUxfUGFyc2VyIHBhcnNlciA9IChYTUxfUGFyc2VyKSB1c2VyRGF0YTsKKyAgRklMRSAqZnAgPSAoRklMRSAqKVhNTF9HZXRVc2VyRGF0YShwYXJzZXIpOworICBmdHByaW50ZihmcCwgVCgiPGVuZHRhZyBuYW1lPVwiJXNcIiIpLCBuYW1lKTsKKyAgbWV0YUxvY2F0aW9uKHBhcnNlcik7CisgIGZwdXR0cyhUKCIvPlxuIiksIGZwKTsKK30KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorbWV0YVByb2Nlc3NpbmdJbnN0cnVjdGlvbih2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmRhdGEpCit7CisgIFhNTF9QYXJzZXIgcGFyc2VyID0gKFhNTF9QYXJzZXIpIHVzZXJEYXRhOworICBGSUxFICpmcCA9IChGSUxFICopWE1MX0dldFVzZXJEYXRhKHBhcnNlcik7CisgIGZ0cHJpbnRmKGZwLCBUKCI8cGkgdGFyZ2V0PVwiJXNcIiBkYXRhPVwiIiksIHRhcmdldCk7CisgIGNoYXJhY3RlckRhdGEoZnAsIGRhdGEsIChpbnQpdGNzbGVuKGRhdGEpKTsKKyAgcHV0dGMoVCgnIicpLCBmcCk7CisgIG1ldGFMb2NhdGlvbihwYXJzZXIpOworICBmcHV0dHMoVCgiLz5cbiIpLCBmcCk7Cit9CisKK3N0YXRpYyB2b2lkIFhNTENBTEwKK21ldGFDb21tZW50KHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqZGF0YSkKK3sKKyAgWE1MX1BhcnNlciBwYXJzZXIgPSAoWE1MX1BhcnNlcikgdXNlckRhdGE7CisgIEZJTEUgKmZwID0gKEZJTEUgKilYTUxfR2V0VXNlckRhdGEocGFyc2VyKTsKKyAgZnB1dHRzKFQoIjxjb21tZW50IGRhdGE9XCIiKSwgZnApOworICBjaGFyYWN0ZXJEYXRhKGZwLCBkYXRhLCAoaW50KXRjc2xlbihkYXRhKSk7CisgIHB1dHRjKFQoJyInKSwgZnApOworICBtZXRhTG9jYXRpb24ocGFyc2VyKTsKKyAgZnB1dHRzKFQoIi8+XG4iKSwgZnApOworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCittZXRhU3RhcnRDZGF0YVNlY3Rpb24odm9pZCAqdXNlckRhdGEpCit7CisgIFhNTF9QYXJzZXIgcGFyc2VyID0gKFhNTF9QYXJzZXIpIHVzZXJEYXRhOworICBGSUxFICpmcCA9IChGSUxFICopWE1MX0dldFVzZXJEYXRhKHBhcnNlcik7CisgIGZwdXR0cyhUKCI8c3RhcnRjZGF0YSIpLCBmcCk7CisgIG1ldGFMb2NhdGlvbihwYXJzZXIpOworICBmcHV0dHMoVCgiLz5cbiIpLCBmcCk7Cit9CisKK3N0YXRpYyB2b2lkIFhNTENBTEwKK21ldGFFbmRDZGF0YVNlY3Rpb24odm9pZCAqdXNlckRhdGEpCit7CisgIFhNTF9QYXJzZXIgcGFyc2VyID0gKFhNTF9QYXJzZXIpIHVzZXJEYXRhOworICBGSUxFICpmcCA9IChGSUxFICopWE1MX0dldFVzZXJEYXRhKHBhcnNlcik7CisgIGZwdXR0cyhUKCI8ZW5kY2RhdGEiKSwgZnApOworICBtZXRhTG9jYXRpb24ocGFyc2VyKTsKKyAgZnB1dHRzKFQoIi8+XG4iKSwgZnApOworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCittZXRhQ2hhcmFjdGVyRGF0YSh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKnMsIGludCBsZW4pCit7CisgIFhNTF9QYXJzZXIgcGFyc2VyID0gKFhNTF9QYXJzZXIpIHVzZXJEYXRhOworICBGSUxFICpmcCA9IChGSUxFICopWE1MX0dldFVzZXJEYXRhKHBhcnNlcik7CisgIGZwdXR0cyhUKCI8Y2hhcnMgc3RyPVwiIiksIGZwKTsKKyAgY2hhcmFjdGVyRGF0YShmcCwgcywgbGVuKTsKKyAgcHV0dGMoVCgnIicpLCBmcCk7CisgIG1ldGFMb2NhdGlvbihwYXJzZXIpOworICBmcHV0dHMoVCgiLz5cbiIpLCBmcCk7Cit9CisKK3N0YXRpYyB2b2lkIFhNTENBTEwKK21ldGFTdGFydERvY3R5cGVEZWNsKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmRvY3R5cGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c2lkLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnB1YmlkLAorICAgICAgICAgICAgICAgICAgICAgaW50IGhhc19pbnRlcm5hbF9zdWJzZXQpCit7CisgIFhNTF9QYXJzZXIgcGFyc2VyID0gKFhNTF9QYXJzZXIpIHVzZXJEYXRhOworICBGSUxFICpmcCA9IChGSUxFICopWE1MX0dldFVzZXJEYXRhKHBhcnNlcik7CisgIGZ0cHJpbnRmKGZwLCBUKCI8c3RhcnRkb2N0eXBlIG5hbWU9XCIlc1wiIiksIGRvY3R5cGVOYW1lKTsKKyAgbWV0YUxvY2F0aW9uKHBhcnNlcik7CisgIGZwdXR0cyhUKCIvPlxuIiksIGZwKTsKK30KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorbWV0YUVuZERvY3R5cGVEZWNsKHZvaWQgKnVzZXJEYXRhKQoreworICBYTUxfUGFyc2VyIHBhcnNlciA9IChYTUxfUGFyc2VyKSB1c2VyRGF0YTsKKyAgRklMRSAqZnAgPSAoRklMRSAqKVhNTF9HZXRVc2VyRGF0YShwYXJzZXIpOworICBmcHV0dHMoVCgiPGVuZGRvY3R5cGUiKSwgZnApOworICBtZXRhTG9jYXRpb24ocGFyc2VyKTsKKyAgZnB1dHRzKFQoIi8+XG4iKSwgZnApOworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCittZXRhTm90YXRpb25EZWNsKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbm90YXRpb25OYW1lLAorICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqYmFzZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHVibGljSWQpCit7CisgIFhNTF9QYXJzZXIgcGFyc2VyID0gKFhNTF9QYXJzZXIpIHVzZXJEYXRhOworICBGSUxFICpmcCA9IChGSUxFICopWE1MX0dldFVzZXJEYXRhKHBhcnNlcik7CisgIGZ0cHJpbnRmKGZwLCBUKCI8bm90YXRpb24gbmFtZT1cIiVzXCIiKSwgbm90YXRpb25OYW1lKTsKKyAgaWYgKHB1YmxpY0lkKQorICAgIGZ0cHJpbnRmKGZwLCBUKCIgcHVibGljPVwiJXNcIiIpLCBwdWJsaWNJZCk7CisgIGlmIChzeXN0ZW1JZCkgeworICAgIGZwdXR0cyhUKCIgc3lzdGVtPVwiIiksIGZwKTsKKyAgICBjaGFyYWN0ZXJEYXRhKGZwLCBzeXN0ZW1JZCwgKGludCl0Y3NsZW4oc3lzdGVtSWQpKTsKKyAgICBwdXR0YyhUKCciJyksIGZwKTsKKyAgfQorICBtZXRhTG9jYXRpb24ocGFyc2VyKTsKKyAgZnB1dHRzKFQoIi8+XG4iKSwgZnApOworfQorCisKK3N0YXRpYyB2b2lkIFhNTENBTEwKK21ldGFFbnRpdHlEZWNsKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmVudGl0eU5hbWUsCisgICAgICAgICAgICAgICBpbnQgIGlzX3BhcmFtLAorICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnZhbHVlLAorICAgICAgICAgICAgICAgaW50ICB2YWx1ZV9sZW5ndGgsCisgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqYmFzZSwKKyAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzeXN0ZW1JZCwKKyAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJsaWNJZCwKKyAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpub3RhdGlvbk5hbWUpCit7CisgIFhNTF9QYXJzZXIgcGFyc2VyID0gKFhNTF9QYXJzZXIpIHVzZXJEYXRhOworICBGSUxFICpmcCA9IChGSUxFICopWE1MX0dldFVzZXJEYXRhKHBhcnNlcik7CisKKyAgaWYgKHZhbHVlKSB7CisgICAgZnRwcmludGYoZnAsIFQoIjxlbnRpdHkgbmFtZT1cIiVzXCIiKSwgZW50aXR5TmFtZSk7CisgICAgbWV0YUxvY2F0aW9uKHBhcnNlcik7CisgICAgcHV0dGMoVCgnPicpLCBmcCk7CisgICAgY2hhcmFjdGVyRGF0YShmcCwgdmFsdWUsIHZhbHVlX2xlbmd0aCk7CisgICAgZnB1dHRzKFQoIjwvZW50aXR5Lz5cbiIpLCBmcCk7CisgIH0KKyAgZWxzZSBpZiAobm90YXRpb25OYW1lKSB7CisgICAgZnRwcmludGYoZnAsIFQoIjxlbnRpdHkgbmFtZT1cIiVzXCIiKSwgZW50aXR5TmFtZSk7CisgICAgaWYgKHB1YmxpY0lkKQorICAgICAgZnRwcmludGYoZnAsIFQoIiBwdWJsaWM9XCIlc1wiIiksIHB1YmxpY0lkKTsKKyAgICBmcHV0dHMoVCgiIHN5c3RlbT1cIiIpLCBmcCk7CisgICAgY2hhcmFjdGVyRGF0YShmcCwgc3lzdGVtSWQsIChpbnQpdGNzbGVuKHN5c3RlbUlkKSk7CisgICAgcHV0dGMoVCgnIicpLCBmcCk7CisgICAgZnRwcmludGYoZnAsIFQoIiBub3RhdGlvbj1cIiVzXCIiKSwgbm90YXRpb25OYW1lKTsKKyAgICBtZXRhTG9jYXRpb24ocGFyc2VyKTsKKyAgICBmcHV0dHMoVCgiLz5cbiIpLCBmcCk7CisgIH0KKyAgZWxzZSB7CisgICAgZnRwcmludGYoZnAsIFQoIjxlbnRpdHkgbmFtZT1cIiVzXCIiKSwgZW50aXR5TmFtZSk7CisgICAgaWYgKHB1YmxpY0lkKQorICAgICAgZnRwcmludGYoZnAsIFQoIiBwdWJsaWM9XCIlc1wiIiksIHB1YmxpY0lkKTsKKyAgICBmcHV0dHMoVCgiIHN5c3RlbT1cIiIpLCBmcCk7CisgICAgY2hhcmFjdGVyRGF0YShmcCwgc3lzdGVtSWQsIChpbnQpdGNzbGVuKHN5c3RlbUlkKSk7CisgICAgcHV0dGMoVCgnIicpLCBmcCk7CisgICAgbWV0YUxvY2F0aW9uKHBhcnNlcik7CisgICAgZnB1dHRzKFQoIi8+XG4iKSwgZnApOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFhNTENBTEwKK21ldGFTdGFydE5hbWVzcGFjZURlY2wodm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICp1cmkpCit7CisgIFhNTF9QYXJzZXIgcGFyc2VyID0gKFhNTF9QYXJzZXIpIHVzZXJEYXRhOworICBGSUxFICpmcCA9IChGSUxFICopWE1MX0dldFVzZXJEYXRhKHBhcnNlcik7CisgIGZwdXR0cyhUKCI8c3RhcnRucyIpLCBmcCk7CisgIGlmIChwcmVmaXgpCisgICAgZnRwcmludGYoZnAsIFQoIiBwcmVmaXg9XCIlc1wiIiksIHByZWZpeCk7CisgIGlmICh1cmkpIHsKKyAgICBmcHV0dHMoVCgiIG5zPVwiIiksIGZwKTsKKyAgICBjaGFyYWN0ZXJEYXRhKGZwLCB1cmksIChpbnQpdGNzbGVuKHVyaSkpOworICAgIGZwdXR0cyhUKCJcIi8+XG4iKSwgZnApOworICB9CisgIGVsc2UKKyAgICBmcHV0dHMoVCgiLz5cbiIpLCBmcCk7Cit9CisKK3N0YXRpYyB2b2lkIFhNTENBTEwKK21ldGFFbmROYW1lc3BhY2VEZWNsKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqcHJlZml4KQoreworICBYTUxfUGFyc2VyIHBhcnNlciA9IChYTUxfUGFyc2VyKSB1c2VyRGF0YTsKKyAgRklMRSAqZnAgPSAoRklMRSAqKVhNTF9HZXRVc2VyRGF0YShwYXJzZXIpOworICBpZiAoIXByZWZpeCkKKyAgICBmcHV0dHMoVCgiPGVuZG5zLz5cbiIpLCBmcCk7CisgIGVsc2UKKyAgICBmdHByaW50ZihmcCwgVCgiPGVuZG5zIHByZWZpeD1cIiVzXCIvPlxuIiksIHByZWZpeCk7Cit9CisKK3N0YXRpYyBpbnQgWE1MQ0FMTAordW5rbm93bkVuY29kaW5nQ29udmVydCh2b2lkICpkYXRhLCBjb25zdCBjaGFyICpwKQoreworICByZXR1cm4gY29kZXBhZ2VDb252ZXJ0KCooaW50ICopZGF0YSwgcCk7Cit9CisKK3N0YXRpYyBpbnQgWE1MQ0FMTAordW5rbm93bkVuY29kaW5nKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqbmFtZSwgWE1MX0VuY29kaW5nICppbmZvKQoreworICBpbnQgY3A7CisgIHN0YXRpYyBjb25zdCBYTUxfQ2hhciBwcmVmaXhMW10gPSBUKCJ3aW5kb3dzLSIpOworICBzdGF0aWMgY29uc3QgWE1MX0NoYXIgcHJlZml4VVtdID0gVCgiV0lORE9XUy0iKTsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgcHJlZml4VVtpXTsgaSsrKQorICAgIGlmIChuYW1lW2ldICE9IHByZWZpeFVbaV0gJiYgbmFtZVtpXSAhPSBwcmVmaXhMW2ldKQorICAgICAgcmV0dXJuIDA7CisgIAorICBjcCA9IDA7CisgIGZvciAoOyBuYW1lW2ldOyBpKyspIHsKKyAgICBzdGF0aWMgY29uc3QgWE1MX0NoYXIgZGlnaXRzW10gPSBUKCIwMTIzNDU2Nzg5Iik7CisgICAgY29uc3QgWE1MX0NoYXIgKnMgPSB0Y3NjaHIoZGlnaXRzLCBuYW1lW2ldKTsKKyAgICBpZiAoIXMpCisgICAgICByZXR1cm4gMDsKKyAgICBjcCAqPSAxMDsKKyAgICBjcCArPSAoaW50KShzIC0gZGlnaXRzKTsKKyAgICBpZiAoY3AgPj0gMHgxMDAwMCkKKyAgICAgIHJldHVybiAwOworICB9CisgIGlmICghY29kZXBhZ2VNYXAoY3AsIGluZm8tPm1hcCkpCisgICAgcmV0dXJuIDA7CisgIGluZm8tPmNvbnZlcnQgPSB1bmtub3duRW5jb2RpbmdDb252ZXJ0OworICAvKiBXZSBjb3VsZCBqdXN0IGNhc3QgdGhlIGNvZGUgcGFnZSBpbnRlZ2VyIHRvIGEgdm9pZCAqLAorICBhbmQgYXZvaWQgdGhlIHVzZSBvZiByZWxlYXNlLiAqLworICBpbmZvLT5yZWxlYXNlID0gZnJlZTsKKyAgaW5mby0+ZGF0YSA9IG1hbGxvYyhzaXplb2YoaW50KSk7CisgIGlmICghaW5mby0+ZGF0YSkKKyAgICByZXR1cm4gMDsKKyAgKihpbnQgKilpbmZvLT5kYXRhID0gY3A7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IFhNTENBTEwKK25vdFN0YW5kYWxvbmUodm9pZCAqdXNlckRhdGEpCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorc2hvd1ZlcnNpb24oWE1MX0NoYXIgKnByb2cpCit7CisgIFhNTF9DaGFyICpzID0gcHJvZzsKKyAgWE1MX0NoYXIgY2g7CisgIGNvbnN0IFhNTF9GZWF0dXJlICpmZWF0dXJlcyA9IFhNTF9HZXRGZWF0dXJlTGlzdCgpOworICB3aGlsZSAoKGNoID0gKnMpICE9IDApIHsKKyAgICBpZiAoY2ggPT0gJy8nCisjaWYgKGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX19XQVRDT01DX18pKQorICAgICAgICB8fCBjaCA9PSAnXFwnCisjZW5kaWYKKyAgICAgICAgKQorICAgICAgcHJvZyA9IHMgKyAxOworICAgICsrczsKKyAgfQorICBmdHByaW50ZihzdGRvdXQsIFQoIiVzIHVzaW5nICVzXG4iKSwgcHJvZywgWE1MX0V4cGF0VmVyc2lvbigpKTsKKyAgaWYgKGZlYXR1cmVzICE9IE5VTEwgJiYgZmVhdHVyZXNbMF0uZmVhdHVyZSAhPSBYTUxfRkVBVFVSRV9FTkQpIHsKKyAgICBpbnQgaSA9IDE7CisgICAgZnRwcmludGYoc3Rkb3V0LCBUKCIlcyIpLCBmZWF0dXJlc1swXS5uYW1lKTsKKyAgICBpZiAoZmVhdHVyZXNbMF0udmFsdWUpCisgICAgICBmdHByaW50ZihzdGRvdXQsIFQoIj0lbGQiKSwgZmVhdHVyZXNbMF0udmFsdWUpOworICAgIHdoaWxlIChmZWF0dXJlc1tpXS5mZWF0dXJlICE9IFhNTF9GRUFUVVJFX0VORCkgeworICAgICAgZnRwcmludGYoc3Rkb3V0LCBUKCIsICVzIiksIGZlYXR1cmVzW2ldLm5hbWUpOworICAgICAgaWYgKGZlYXR1cmVzW2ldLnZhbHVlKQorICAgICAgICBmdHByaW50ZihzdGRvdXQsIFQoIj0lbGQiKSwgZmVhdHVyZXNbaV0udmFsdWUpOworICAgICAgKytpOworICAgIH0KKyAgICBmdHByaW50ZihzdGRvdXQsIFQoIlxuIikpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit1c2FnZShjb25zdCBYTUxfQ2hhciAqcHJvZywgaW50IHJjKQoreworICBmdHByaW50ZihzdGRlcnIsCisgICAgICAgICAgIFQoInVzYWdlOiAlcyBbLW5dIFstcF0gWy1yXSBbLXNdIFstd10gWy14XSBbLWQgb3V0cHV0LWRpcl0gIgorICAgICAgICAgICAgICJbLWUgZW5jb2RpbmddIGZpbGUgLi4uXG4iKSwgcHJvZyk7CisgIGV4aXQocmMpOworfQorCitpbnQKK3RtYWluKGludCBhcmdjLCBYTUxfQ2hhciAqKmFyZ3YpCit7CisgIGludCBpLCBqOworICBjb25zdCBYTUxfQ2hhciAqb3V0cHV0RGlyID0gTlVMTDsKKyAgY29uc3QgWE1MX0NoYXIgKmVuY29kaW5nID0gTlVMTDsKKyAgdW5zaWduZWQgcHJvY2Vzc0ZsYWdzID0gWE1MX01BUF9GSUxFOworICBpbnQgd2luZG93c0NvZGVQYWdlcyA9IDA7CisgIGludCBvdXRwdXRUeXBlID0gMDsKKyAgaW50IHVzZU5hbWVzcGFjZXMgPSAwOworICBpbnQgcmVxdWlyZVN0YW5kYWxvbmUgPSAwOworICBlbnVtIFhNTF9QYXJhbUVudGl0eVBhcnNpbmcgcGFyYW1FbnRpdHlQYXJzaW5nID0gCisgICAgWE1MX1BBUkFNX0VOVElUWV9QQVJTSU5HX05FVkVSOworICBpbnQgdXNlU3RkaW4gPSAwOworCisjaWZkZWYgX01TQ19WRVIKKyAgX0NydFNldERiZ0ZsYWcoX0NSVERCR19BTExPQ19NRU1fREZ8X0NSVERCR19MRUFLX0NIRUNLX0RGKTsKKyNlbmRpZgorCisgIGkgPSAxOworICBqID0gMDsKKyAgd2hpbGUgKGkgPCBhcmdjKSB7CisgICAgaWYgKGogPT0gMCkgeworICAgICAgaWYgKGFyZ3ZbaV1bMF0gIT0gVCgnLScpKQorICAgICAgICBicmVhazsKKyAgICAgIGlmIChhcmd2W2ldWzFdID09IFQoJy0nKSAmJiBhcmd2W2ldWzJdID09IFQoJ1wwJykpIHsKKyAgICAgICAgaSsrOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGorKzsKKyAgICB9CisgICAgc3dpdGNoIChhcmd2W2ldW2pdKSB7CisgICAgY2FzZSBUKCdyJyk6CisgICAgICBwcm9jZXNzRmxhZ3MgJj0gflhNTF9NQVBfRklMRTsKKyAgICAgIGorKzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVCgncycpOgorICAgICAgcmVxdWlyZVN0YW5kYWxvbmUgPSAxOworICAgICAgaisrOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUKCduJyk6CisgICAgICB1c2VOYW1lc3BhY2VzID0gMTsKKyAgICAgIGorKzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVCgncCcpOgorICAgICAgcGFyYW1FbnRpdHlQYXJzaW5nID0gWE1MX1BBUkFNX0VOVElUWV9QQVJTSU5HX0FMV0FZUzsKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgVCgneCcpOgorICAgICAgcHJvY2Vzc0ZsYWdzIHw9IFhNTF9FWFRFUk5BTF9FTlRJVElFUzsKKyAgICAgIGorKzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVCgndycpOgorICAgICAgd2luZG93c0NvZGVQYWdlcyA9IDE7CisgICAgICBqKys7CisgICAgICBicmVhazsKKyAgICBjYXNlIFQoJ20nKToKKyAgICAgIG91dHB1dFR5cGUgPSAnbSc7CisgICAgICBqKys7CisgICAgICBicmVhazsKKyAgICBjYXNlIFQoJ2MnKToKKyAgICAgIG91dHB1dFR5cGUgPSAnYyc7CisgICAgICB1c2VOYW1lc3BhY2VzID0gMDsKKyAgICAgIGorKzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVCgndCcpOgorICAgICAgb3V0cHV0VHlwZSA9ICd0JzsKKyAgICAgIGorKzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVCgnZCcpOgorICAgICAgaWYgKGFyZ3ZbaV1baiArIDFdID09IFQoJ1wwJykpIHsKKyAgICAgICAgaWYgKCsraSA9PSBhcmdjKQorICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0sIDIpOworICAgICAgICBvdXRwdXREaXIgPSBhcmd2W2ldOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBvdXRwdXREaXIgPSBhcmd2W2ldICsgaiArIDE7CisgICAgICBpKys7CisgICAgICBqID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVCgnZScpOgorICAgICAgaWYgKGFyZ3ZbaV1baiArIDFdID09IFQoJ1wwJykpIHsKKyAgICAgICAgaWYgKCsraSA9PSBhcmdjKQorICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0sIDIpOworICAgICAgICBlbmNvZGluZyA9IGFyZ3ZbaV07CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGVuY29kaW5nID0gYXJndltpXSArIGogKyAxOworICAgICAgaSsrOworICAgICAgaiA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFQoJ2gnKToKKyAgICAgIHVzYWdlKGFyZ3ZbMF0sIDApOworICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBUKCd2Jyk6CisgICAgICBzaG93VmVyc2lvbihhcmd2WzBdKTsKKyAgICAgIHJldHVybiAwOworICAgIGNhc2UgVCgnXDAnKToKKyAgICAgIGlmIChqID4gMSkgeworICAgICAgICBpKys7CisgICAgICAgIGogPSAwOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGRlZmF1bHQ6CisgICAgICB1c2FnZShhcmd2WzBdLCAyKTsKKyAgICB9CisgIH0KKyAgaWYgKGkgPT0gYXJnYykgeworICAgIHVzZVN0ZGluID0gMTsKKyAgICBwcm9jZXNzRmxhZ3MgJj0gflhNTF9NQVBfRklMRTsKKyAgICBpLS07CisgIH0KKyAgZm9yICg7IGkgPCBhcmdjOyBpKyspIHsKKyAgICBGSUxFICpmcCA9IDA7CisgICAgWE1MX0NoYXIgKm91dE5hbWUgPSAwOworICAgIGludCByZXN1bHQ7CisgICAgWE1MX1BhcnNlciBwYXJzZXI7CisgICAgaWYgKHVzZU5hbWVzcGFjZXMpCisgICAgICBwYXJzZXIgPSBYTUxfUGFyc2VyQ3JlYXRlTlMoZW5jb2RpbmcsIE5TU0VQKTsKKyAgICBlbHNlCisgICAgICBwYXJzZXIgPSBYTUxfUGFyc2VyQ3JlYXRlKGVuY29kaW5nKTsKKyAgICBpZiAocmVxdWlyZVN0YW5kYWxvbmUpCisgICAgICBYTUxfU2V0Tm90U3RhbmRhbG9uZUhhbmRsZXIocGFyc2VyLCBub3RTdGFuZGFsb25lKTsKKyAgICBYTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nKHBhcnNlciwgcGFyYW1FbnRpdHlQYXJzaW5nKTsKKyAgICBpZiAob3V0cHV0VHlwZSA9PSAndCcpIHsKKyAgICAgIC8qIFRoaXMgaXMgZm9yIGRvaW5nIHRpbWluZ3M7IHRoaXMgZ2l2ZXMgYSBtb3JlIHJlYWxpc3RpYyBlc3RpbWF0ZSBvZgorICAgICAgICAgdGhlIHBhcnNpbmcgdGltZS4gKi8KKyAgICAgIG91dHB1dERpciA9IDA7CisgICAgICBYTUxfU2V0RWxlbWVudEhhbmRsZXIocGFyc2VyLCBub3BTdGFydEVsZW1lbnQsIG5vcEVuZEVsZW1lbnQpOworICAgICAgWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyKHBhcnNlciwgbm9wQ2hhcmFjdGVyRGF0YSk7CisgICAgICBYTUxfU2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlcihwYXJzZXIsIG5vcFByb2Nlc3NpbmdJbnN0cnVjdGlvbik7CisgICAgfQorICAgIGVsc2UgaWYgKG91dHB1dERpcikgeworICAgICAgY29uc3QgWE1MX0NoYXIgKiBkZWxpbSA9IFQoIi8iKTsKKyAgICAgIGNvbnN0IFhNTF9DaGFyICpmaWxlID0gdXNlU3RkaW4gPyBUKCJTVERJTiIpIDogYXJndltpXTsKKyAgICAgIGlmICghdXNlU3RkaW4pIHsKKyAgICAgICAgLyogSnVtcCBhZnRlciBsYXN0IChiYWNrKXNsYXNoICovCisgICAgICAgIGNvbnN0IFhNTF9DaGFyICogbGFzdERlbGltID0gdGNzcmNocihmaWxlLCBkZWxpbVswXSk7CisgICAgICAgIGlmIChsYXN0RGVsaW0pCisgICAgICAgICAgZmlsZSA9IGxhc3REZWxpbSArIDE7CisjaWYgKGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX19XQVRDT01DX18pKQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqIHdpbkRlbGltID0gVCgiXFwiKTsKKyAgICAgICAgICBsYXN0RGVsaW0gPSB0Y3NyY2hyKGZpbGUsIHdpbkRlbGltWzBdKTsKKyAgICAgICAgICBpZiAobGFzdERlbGltKSB7CisgICAgICAgICAgICBmaWxlID0gbGFzdERlbGltICsgMTsKKyAgICAgICAgICAgIGRlbGltID0gd2luRGVsaW07CisgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKyAgICAgIH0KKyAgICAgIG91dE5hbWUgPSAoWE1MX0NoYXIgKiltYWxsb2MoKHRjc2xlbihvdXRwdXREaXIpICsgdGNzbGVuKGZpbGUpICsgMikKKyAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoWE1MX0NoYXIpKTsKKyAgICAgIHRjc2NweShvdXROYW1lLCBvdXRwdXREaXIpOworICAgICAgdGNzY2F0KG91dE5hbWUsIGRlbGltKTsKKyAgICAgIHRjc2NhdChvdXROYW1lLCBmaWxlKTsKKyAgICAgIGZwID0gdGZvcGVuKG91dE5hbWUsIFQoIndiIikpOworICAgICAgaWYgKCFmcCkgeworICAgICAgICB0cGVycm9yKG91dE5hbWUpOworICAgICAgICBleGl0KDEpOworICAgICAgfQorICAgICAgc2V0dmJ1ZihmcCwgTlVMTCwgX0lPRkJGLCAxNjM4NCk7CisjaWZkZWYgWE1MX1VOSUNPREUKKyAgICAgIHB1dHRjKDB4RkVGRiwgZnApOworI2VuZGlmCisgICAgICBYTUxfU2V0VXNlckRhdGEocGFyc2VyLCBmcCk7CisgICAgICBzd2l0Y2ggKG91dHB1dFR5cGUpIHsKKyAgICAgIGNhc2UgJ20nOgorICAgICAgICBYTUxfVXNlUGFyc2VyQXNIYW5kbGVyQXJnKHBhcnNlcik7CisgICAgICAgIFhNTF9TZXRFbGVtZW50SGFuZGxlcihwYXJzZXIsIG1ldGFTdGFydEVsZW1lbnQsIG1ldGFFbmRFbGVtZW50KTsKKyAgICAgICAgWE1MX1NldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIocGFyc2VyLCBtZXRhUHJvY2Vzc2luZ0luc3RydWN0aW9uKTsKKyAgICAgICAgWE1MX1NldENvbW1lbnRIYW5kbGVyKHBhcnNlciwgbWV0YUNvbW1lbnQpOworICAgICAgICBYTUxfU2V0Q2RhdGFTZWN0aW9uSGFuZGxlcihwYXJzZXIsIG1ldGFTdGFydENkYXRhU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YUVuZENkYXRhU2VjdGlvbik7CisgICAgICAgIFhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcihwYXJzZXIsIG1ldGFDaGFyYWN0ZXJEYXRhKTsKKyAgICAgICAgWE1MX1NldERvY3R5cGVEZWNsSGFuZGxlcihwYXJzZXIsIG1ldGFTdGFydERvY3R5cGVEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFFbmREb2N0eXBlRGVjbCk7CisgICAgICAgIFhNTF9TZXRFbnRpdHlEZWNsSGFuZGxlcihwYXJzZXIsIG1ldGFFbnRpdHlEZWNsKTsKKyAgICAgICAgWE1MX1NldE5vdGF0aW9uRGVjbEhhbmRsZXIocGFyc2VyLCBtZXRhTm90YXRpb25EZWNsKTsKKyAgICAgICAgWE1MX1NldE5hbWVzcGFjZURlY2xIYW5kbGVyKHBhcnNlciwgbWV0YVN0YXJ0TmFtZXNwYWNlRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFFbmROYW1lc3BhY2VEZWNsKTsKKyAgICAgICAgbWV0YVN0YXJ0RG9jdW1lbnQocGFyc2VyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdjJzoKKyAgICAgICAgWE1MX1VzZVBhcnNlckFzSGFuZGxlckFyZyhwYXJzZXIpOworICAgICAgICBYTUxfU2V0RGVmYXVsdEhhbmRsZXIocGFyc2VyLCBtYXJrdXApOworICAgICAgICBYTUxfU2V0RWxlbWVudEhhbmRsZXIocGFyc2VyLCBkZWZhdWx0U3RhcnRFbGVtZW50LCBkZWZhdWx0RW5kRWxlbWVudCk7CisgICAgICAgIFhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcihwYXJzZXIsIGRlZmF1bHRDaGFyYWN0ZXJEYXRhKTsKKyAgICAgICAgWE1MX1NldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIocGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UHJvY2Vzc2luZ0luc3RydWN0aW9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAodXNlTmFtZXNwYWNlcykKKyAgICAgICAgICBYTUxfU2V0RWxlbWVudEhhbmRsZXIocGFyc2VyLCBzdGFydEVsZW1lbnROUywgZW5kRWxlbWVudE5TKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIFhNTF9TZXRFbGVtZW50SGFuZGxlcihwYXJzZXIsIHN0YXJ0RWxlbWVudCwgZW5kRWxlbWVudCk7CisgICAgICAgIFhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcihwYXJzZXIsIGNoYXJhY3RlckRhdGEpOworI2lmbmRlZiBXM0MxNE4KKyAgICAgICAgWE1MX1NldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIocGFyc2VyLCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pOworI2VuZGlmIC8qIG5vdCBXM0MxNE4gKi8KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmICh3aW5kb3dzQ29kZVBhZ2VzKQorICAgICAgWE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXIocGFyc2VyLCB1bmtub3duRW5jb2RpbmcsIDApOworICAgIHJlc3VsdCA9IFhNTF9Qcm9jZXNzRmlsZShwYXJzZXIsIHVzZVN0ZGluID8gTlVMTCA6IGFyZ3ZbaV0sIHByb2Nlc3NGbGFncyk7CisgICAgaWYgKG91dHB1dERpcikgeworICAgICAgaWYgKG91dHB1dFR5cGUgPT0gJ20nKQorICAgICAgICBtZXRhRW5kRG9jdW1lbnQocGFyc2VyKTsKKyAgICAgIGZjbG9zZShmcCk7CisgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgdHJlbW92ZShvdXROYW1lKTsKKyAgICAgIGZyZWUob3V0TmFtZSk7CisgICAgfQorICAgIFhNTF9QYXJzZXJGcmVlKHBhcnNlcik7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS94bWx3Zi94bWx3Zi5kc3AgYi9leHBhdC0yLjAuMS94bWx3Zi94bWx3Zi5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY0MDAzNAotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL3htbHdmL3htbHdmLmRzcApAQCAtMCwwICsxLDEzOSBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJ4bWx3ZiIgLSBQYWNrYWdlIE93bmVyPTw0PgorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAorIyAqKiBETyBOT1QgRURJVCAqKgorCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMKKworQ0ZHPXhtbHdmIC0gV2luMzIgUmVsZWFzZQorIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAorIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCishTUVTU0FHRSAKKyFNRVNTQUdFIE5NQUtFIC9mICJ4bWx3Zi5tYWsiLgorIU1FU1NBR0UgCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgInhtbHdmLm1hayIgQ0ZHPSJ4bWx3ZiAtIFdpbjMyIFJlbGVhc2UiCishTUVTU0FHRSAKKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgorIU1FU1NBR0UgCishTUVTU0FHRSAieG1sd2YgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgInhtbHdmIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAKKworIyBCZWdpbiBQcm9qZWN0CisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKK0NQUD1jbC5leGUKK1JTQz1yYy5leGUKKworIUlGICAiJChDRkcpIiA9PSAieG1sd2YgLSBXaW4zMiBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxSZWxlYXNlIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiLlxSZWxlYXNlIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiLiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICIuLlx3aW4zMlxiaW5cUmVsZWFzZSIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlx3aW4zMlx0bXBcUmVsZWFzZS14bWx3ZiIKKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCisjIFBST1AgVGFyZ2V0X0RpciAiLiIKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvYworIyBBREQgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9JICIuLlxsaWIiIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9DT05TT0xFIiAvRCAiQ09NUElMRURfRlJPTV9EU1AiIC9GRCAvYworIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUKKyMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgorIyBBREQgTElOSzMyIHNldGFyZ3Yub2JqIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9wZGI6bm9uZSAvbWFjaGluZTpJMzg2CisjIFNVQlRSQUNUIExJTkszMiAvbm9kZWZhdWx0bGliCisKKyFFTFNFSUYgICIkKENGRykiID09ICJ4bWx3ZiAtIFdpbjMyIERlYnVnIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxEZWJ1ZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIi5cRGVidWciCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIuIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXHdpbjMyXGJpblxEZWJ1ZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlx3aW4zMlx0bXBcRGVidWcteG1sd2YiCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAorIyBQUk9QIFRhcmdldF9EaXIgIi4iCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvYworIyBBREQgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dYIC9aSSAvT2QgL0kgIi4uXGxpYiIgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX0NPTlNPTEUiIC9EICJDT01QSUxFRF9GUk9NX0RTUCIgL0ZEIC9jCisjIFNVQlRSQUNUIENQUCAvRnIgL1lYCisjIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIgorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2CisjIEFERCBMSU5LMzIgc2V0YXJndi5vYmoga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL3BkYjpub25lIC9kZWJ1ZyAvbWFjaGluZTpJMzg2CisKKyFFTkRJRiAKKworIyBCZWdpbiBUYXJnZXQKKworIyBOYW1lICJ4bWx3ZiAtIFdpbjMyIFJlbGVhc2UiCisjIE5hbWUgInhtbHdmIC0gV2luMzIgRGVidWciCisjIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiCisKKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdDtmb3I7ZjkwIgorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llxjb2RlcGFnZS5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxyZWFkZmlsZW1hcC5jCisjIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDEKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXHVuaXhmaWxlbWFwLmMKKyMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cd2luMzJmaWxlbWFwLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXHhtbGZpbGUuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5ceG1sd2YuYworIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIEdyb3VwCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiCisKKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubDtmaTtmZCIKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cY29kZXBhZ2UuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5ceG1sZmlsZS5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx4bWx0Y2hhci5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBFbmQgR3JvdXAKKyMgQmVnaW4gR3JvdXAgIlJlc291cmNlIEZpbGVzIgorCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtjbnQ7cnRmO2dpZjtqcGc7anBlZztqcGUiCisjIEVuZCBHcm91cAorIyBFbmQgVGFyZ2V0CisjIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS94bWx3Zi94bWx3aW4zMnVybC5jeHggYi9leHBhdC0yLjAuMS94bWx3Zi94bWx3aW4zMnVybC5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJmY2NlMgotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL3htbHdmL3htbHdpbjMydXJsLmN4eApAQCAtMCwwICsxLDM5NSBAQAorI2luY2x1ZGUgImV4cGF0LmgiCisjaWZkZWYgWE1MX1VOSUNPREUKKyNkZWZpbmUgVU5JQ09ERQorI2VuZGlmCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHVybG1vbi5oPgorI2luY2x1ZGUgPHdpbmluZXQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRjaGFyLmg+CisjaW5jbHVkZSAieG1sdXJsLmgiCisjaW5jbHVkZSAieG1sbWltZS5oIgorCitzdGF0aWMgaW50Citwcm9jZXNzVVJMKFhNTF9QYXJzZXIgcGFyc2VyLCBJTW9uaWtlciAqYmFzZU1vbmlrZXIsIGNvbnN0IFhNTF9DaGFyICp1cmwpOworCit0eXBlZGVmIHZvaWQgKCpTdG9wSGFuZGxlcikodm9pZCAqLCBIUkVTVUxUKTsKKworY2xhc3MgQ2FsbGJhY2sgOiBwdWJsaWMgSUJpbmRTdGF0dXNDYWxsYmFjayB7CitwdWJsaWM6CisgIC8vIElVbmtub3duIG1ldGhvZHMKKyAgU1RETUVUSE9ESU1QIFF1ZXJ5SW50ZXJmYWNlKFJFRklJRCx2b2lkICoqKTsKKyAgU1RETUVUSE9ESU1QXyhVTE9ORykgQWRkUmVmKCk7CisgIFNURE1FVEhPRElNUF8oVUxPTkcpIFJlbGVhc2UoKTsKKyAgLy8gSUJpbmRTdGF0dXNDYWxsYmFjayBtZXRob2RzCisgIFNURE1FVEhPRElNUCBPblN0YXJ0QmluZGluZyhEV09SRCwgSUJpbmRpbmcgKik7CisgIFNURE1FVEhPRElNUCBHZXRQcmlvcml0eShMT05HICopOworICBTVERNRVRIT0RJTVAgT25Mb3dSZXNvdXJjZShEV09SRCk7CisgIFNURE1FVEhPRElNUCBPblByb2dyZXNzKFVMT05HLCBVTE9ORywgVUxPTkcsIExQQ1dTVFIpOworICBTVERNRVRIT0RJTVAgT25TdG9wQmluZGluZyhIUkVTVUxULCBMUENXU1RSKTsKKyAgU1RETUVUSE9ESU1QIEdldEJpbmRJbmZvKERXT1JEICosIEJJTkRJTkZPICopOworICBTVERNRVRIT0RJTVAgT25EYXRhQXZhaWxhYmxlKERXT1JELCBEV09SRCwgRk9STUFURVRDICosIFNUR01FRElVTSAqKTsKKyAgU1RETUVUSE9ESU1QIE9uT2JqZWN0QXZhaWxhYmxlKFJFRklJRCwgSVVua25vd24gKik7CisgIENhbGxiYWNrKFhNTF9QYXJzZXIsIElNb25pa2VyICosIFN0b3BIYW5kbGVyLCB2b2lkICopOworICB+Q2FsbGJhY2soKTsKKyAgaW50IGV4dGVybmFsRW50aXR5UmVmKGNvbnN0IFhNTF9DaGFyICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkLCBjb25zdCBYTUxfQ2hhciAqcHVibGljSWQpOworcHJpdmF0ZToKKyAgWE1MX1BhcnNlciBwYXJzZXJfOworICBJTW9uaWtlciAqYmFzZU1vbmlrZXJfOworICBEV09SRCB0b3RhbFJlYWRfOworICBVTE9ORyByZWZfOworICBJQmluZGluZyAqcEJpbmRpbmdfOworICBTdG9wSGFuZGxlciBzdG9wSGFuZGxlcl87CisgIHZvaWQgKnN0b3BBcmdfOworfTsKKworU1RETUVUSE9ESU1QXyhVTE9ORykKK0NhbGxiYWNrOjpBZGRSZWYoKQoreyAKKyAgcmV0dXJuIHJlZl8rKzsKK30KKworU1RETUVUSE9ESU1QXyhVTE9ORykKK0NhbGxiYWNrOjpSZWxlYXNlKCkKK3sgCisgIGlmICgtLXJlZl8gPT0gMCkgeworICAgIGRlbGV0ZSB0aGlzOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiByZWZfOworfQorCitTVERNRVRIT0RJTVAKK0NhbGxiYWNrOjpRdWVyeUludGVyZmFjZShSRUZJSUQgcmlpZCwgdm9pZCoqIHBwdikKK3sgCisgIGlmIChJc0VxdWFsR1VJRChyaWlkLCBJSURfSVVua25vd24pKQorICAgICpwcHYgPSAoSVVua25vd24gKil0aGlzOworICBlbHNlIGlmIChJc0VxdWFsR1VJRChyaWlkLCBJSURfSUJpbmRTdGF0dXNDYWxsYmFjaykpCisgICAgKnBwdiA9IChJQmluZFN0YXR1c0NhbGxiYWNrICopdGhpczsKKyAgZWxzZQorICAgIHJldHVybiBFX05PSU5URVJGQUNFOworICAoKExQVU5LTk9XTikqcHB2KS0+QWRkUmVmKCk7CisgIHJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAKK0NhbGxiYWNrOjpPblN0YXJ0QmluZGluZyhEV09SRCwgSUJpbmRpbmcqIHBCaW5kaW5nKQoreworICBwQmluZGluZ18gPSBwQmluZGluZzsKKyAgcEJpbmRpbmctPkFkZFJlZigpOworICByZXR1cm4gU19PSzsKK30KKworU1RETUVUSE9ESU1QCitDYWxsYmFjazo6R2V0UHJpb3JpdHkoTE9ORyAqKQoreworICByZXR1cm4gRV9OT1RJTVBMOworfQorCitTVERNRVRIT0RJTVAKK0NhbGxiYWNrOjpPbkxvd1Jlc291cmNlKERXT1JEKQoreworICByZXR1cm4gRV9OT1RJTVBMOworfQorCitTVERNRVRIT0RJTVAKK0NhbGxiYWNrOjpPblByb2dyZXNzKFVMT05HLCBVTE9ORywgVUxPTkcsIExQQ1dTVFIpCit7CisgIHJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAKK0NhbGxiYWNrOjpPblN0b3BCaW5kaW5nKEhSRVNVTFQgaHIsIExQQ1dTVFIgc3pFcnJvcikKK3sKKyAgaWYgKHBCaW5kaW5nXykgeworICAgIHBCaW5kaW5nXy0+UmVsZWFzZSgpOworICAgIHBCaW5kaW5nXyA9IDA7CisgIH0KKyAgaWYgKGJhc2VNb25pa2VyXykgeworICAgIGJhc2VNb25pa2VyXy0+UmVsZWFzZSgpOworICAgIGJhc2VNb25pa2VyXyA9IDA7CisgIH0KKyAgc3RvcEhhbmRsZXJfKHN0b3BBcmdfLCBocik7CisgIHJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAKK0NhbGxiYWNrOjpHZXRCaW5kSW5mbyhEV09SRCogcGdyZkJJTkRGLCBCSU5ESU5GTyogcGJpbmRpbmZvKQoreworICAqcGdyZkJJTkRGID0gQklOREZfQVNZTkNIUk9OT1VTOworICByZXR1cm4gU19PSzsKK30KKworc3RhdGljIHZvaWQKK3JlcG9ydEVycm9yKFhNTF9QYXJzZXIgcGFyc2VyKQoreworICBpbnQgY29kZSA9IFhNTF9HZXRFcnJvckNvZGUocGFyc2VyKTsKKyAgY29uc3QgWE1MX0NoYXIgKm1lc3NhZ2UgPSBYTUxfRXJyb3JTdHJpbmcoY29kZSk7CisgIGlmIChtZXNzYWdlKQorICAgIF9mdHByaW50ZihzdGRlcnIsIF9UKCIlczolZDolbGQ6ICVzXG4iKSwKKwkgICAgIFhNTF9HZXRCYXNlKHBhcnNlciksCisJICAgICBYTUxfR2V0RXJyb3JMaW5lTnVtYmVyKHBhcnNlciksCisJICAgICBYTUxfR2V0RXJyb3JDb2x1bW5OdW1iZXIocGFyc2VyKSwKKwkgICAgIG1lc3NhZ2UpOworICBlbHNlCisgICAgX2Z0cHJpbnRmKHN0ZGVyciwgX1QoIiVzOiAodW5rbm93biBtZXNzYWdlICVkKVxuIiksCisgICAgICAgICAgICAgIFhNTF9HZXRCYXNlKHBhcnNlciksIGNvZGUpOworfQorCitTVERNRVRIT0RJTVAKK0NhbGxiYWNrOjpPbkRhdGFBdmFpbGFibGUoRFdPUkQgZ3JmQlNDRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGT1JNQVRFVEMgKnBmbXRldGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNUR01FRElVTSogcHN0Z21lZCkKK3sKKyAgaWYgKGdyZkJTQ0YgJiBCU0NGX0ZJUlNUREFUQU5PVElGSUNBVElPTikgeworICAgIElXaW5JbmV0SHR0cEluZm8gKmhwOworICAgIEhSRVNVTFQgaHIgPSBwQmluZGluZ18tPlF1ZXJ5SW50ZXJmYWNlKElJRF9JV2luSW5ldEh0dHBJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSZocCk7CisgICAgaWYgKFNVQ0NFRURFRChocikpIHsKKyAgICAgIGNoYXIgY29udGVudFR5cGVbMTAyNF07CisgICAgICBEV09SRCBidWZTaXplID0gc2l6ZW9mKGNvbnRlbnRUeXBlKTsKKyAgICAgIERXT1JEIGZsYWdzID0gMDsKKyAgICAgIGNvbnRlbnRUeXBlWzBdID0gMDsKKyAgICAgIGhyID0gaHAtPlF1ZXJ5SW5mbyhIVFRQX1FVRVJZX0NPTlRFTlRfVFlQRSwgY29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZlNpemUsIDAsIE5VTEwpOworICAgICAgaWYgKFNVQ0NFRURFRChocikpIHsKKwljaGFyIGNoYXJzZXRbQ0hBUlNFVF9NQVhdOworCWdldFhNTENoYXJzZXQoY29udGVudFR5cGUsIGNoYXJzZXQpOworCWlmIChjaGFyc2V0WzBdKSB7CisjaWZkZWYgWE1MX1VOSUNPREUKKwkgIFhNTF9DaGFyIHdjaGFyc2V0W0NIQVJTRVRfTUFYXTsKKwkgIFhNTF9DaGFyICpwMSA9IHdjaGFyc2V0OworCSAgY29uc3QgY2hhciAqcDIgPSBjaGFyc2V0OworCSAgd2hpbGUgKCgqcDErKyA9ICh1bnNpZ25lZCBjaGFyKSpwMisrKSAhPSAwKQorCSAgICA7CisJICBYTUxfU2V0RW5jb2RpbmcocGFyc2VyXywgd2NoYXJzZXQpOworI2Vsc2UKKwkgIFhNTF9TZXRFbmNvZGluZyhwYXJzZXJfLCBjaGFyc2V0KTsKKyNlbmRpZgorCX0KKyAgICAgIH0KKyAgICAgIGhwLT5SZWxlYXNlKCk7CisgICAgfQorICB9CisgIGlmICghcGFyc2VyXykKKyAgICByZXR1cm4gRV9BQk9SVDsKKyAgaWYgKHBzdGdtZWQtPnR5bWVkID09IFRZTUVEX0lTVFJFQU0pIHsKKyAgICB3aGlsZSAodG90YWxSZWFkXyA8IGR3U2l6ZSkgeworI2RlZmluZSBSRUFEX01BWCAoNjQqMTAyNCkKKyAgICAgIERXT1JEIG5Ub1JlYWQgPSBkd1NpemUgLSB0b3RhbFJlYWRfOworICAgICAgaWYgKG5Ub1JlYWQgPiBSRUFEX01BWCkKKwluVG9SZWFkID0gUkVBRF9NQVg7CisgICAgICB2b2lkICpidWYgPSBYTUxfR2V0QnVmZmVyKHBhcnNlcl8sIG5Ub1JlYWQpOworICAgICAgaWYgKCFidWYpIHsKKwlfZnRwcmludGYoc3RkZXJyLCBfVCgib3V0IG9mIG1lbW9yeVxuIikpOworCXJldHVybiBFX0FCT1JUOworICAgICAgfQorICAgICAgRFdPUkQgblJlYWQ7CisgICAgICBIUkVTVUxUIGhyID0gcHN0Z21lZC0+cHN0bS0+UmVhZChidWYsIG5Ub1JlYWQsICZuUmVhZCk7CisgICAgICBpZiAoU1VDQ0VFREVEKGhyKSkgeworCXRvdGFsUmVhZF8gKz0gblJlYWQ7CisJaWYgKCFYTUxfUGFyc2VCdWZmZXIocGFyc2VyXywKKwkJCSAgICAgblJlYWQsCisJCQkgICAgIChncmZCU0NGICYgQlNDRl9MQVNUREFUQU5PVElGSUNBVElPTikgIT0gMAorCQkJICAgICAmJiB0b3RhbFJlYWRfID09IGR3U2l6ZSkpIHsKKwkgIHJlcG9ydEVycm9yKHBhcnNlcl8pOworCSAgcmV0dXJuIEVfQUJPUlQ7CisJfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gU19PSzsKK30KKworU1RETUVUSE9ESU1QCitDYWxsYmFjazo6T25PYmplY3RBdmFpbGFibGUoUkVGSUlELCBJVW5rbm93biAqKQoreworICByZXR1cm4gU19PSzsKK30KKworaW50CitDYWxsYmFjazo6ZXh0ZXJuYWxFbnRpdHlSZWYoY29uc3QgWE1MX0NoYXIgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJsaWNJZCkKK3sKKyAgWE1MX1BhcnNlciBlbnRQYXJzZXIgPSBYTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUocGFyc2VyXywgY29udGV4dCwgMCk7CisgIFhNTF9TZXRCYXNlKGVudFBhcnNlciwgc3lzdGVtSWQpOworICBpbnQgcmV0ID0gcHJvY2Vzc1VSTChlbnRQYXJzZXIsIGJhc2VNb25pa2VyXywgc3lzdGVtSWQpOworICBYTUxfUGFyc2VyRnJlZShlbnRQYXJzZXIpOworICByZXR1cm4gcmV0OworfQorCitDYWxsYmFjazo6Q2FsbGJhY2soWE1MX1BhcnNlciBwYXJzZXIsIElNb25pa2VyICpiYXNlTW9uaWtlciwKKyAgICAgICAgICAgICAgICAgICBTdG9wSGFuZGxlciBzdG9wSGFuZGxlciwgdm9pZCAqc3RvcEFyZykKKzogcGFyc2VyXyhwYXJzZXIpLAorICBiYXNlTW9uaWtlcl8oYmFzZU1vbmlrZXIpLAorICByZWZfKDApLAorICBwQmluZGluZ18oMCksCisgIHRvdGFsUmVhZF8oMCksCisgIHN0b3BIYW5kbGVyXyhzdG9wSGFuZGxlciksCisgIHN0b3BBcmdfKHN0b3BBcmcpCit7CisgIGlmIChiYXNlTW9uaWtlcl8pCisgICAgYmFzZU1vbmlrZXJfLT5BZGRSZWYoKTsKK30KKworQ2FsbGJhY2s6On5DYWxsYmFjaygpCit7CisgIGlmIChwQmluZGluZ18pCisgICAgcEJpbmRpbmdfLT5SZWxlYXNlKCk7CisgIGlmIChiYXNlTW9uaWtlcl8pCisgICAgYmFzZU1vbmlrZXJfLT5SZWxlYXNlKCk7Cit9CisKK3N0YXRpYyBpbnQKK2V4dGVybmFsRW50aXR5UmVmKHZvaWQgKmFyZywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmJhc2UsCisgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqc3lzdGVtSWQsCisgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHVibGljSWQpCit7CisgIHJldHVybiAoKENhbGxiYWNrICopYXJnKS0+ZXh0ZXJuYWxFbnRpdHlSZWYoY29udGV4dCwgc3lzdGVtSWQsIHB1YmxpY0lkKTsKK30KKworCitzdGF0aWMgSFJFU1VMVAorb3BlblN0cmVhbShYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgSU1vbmlrZXIgKmJhc2VNb25pa2VyLAorICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqdXJpLAorICAgICAgICAgICBTdG9wSGFuZGxlciBzdG9wSGFuZGxlciwgdm9pZCAqc3RvcEFyZykKK3sKKyAgaWYgKCFYTUxfU2V0QmFzZShwYXJzZXIsIHVyaSkpCisgICAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CisgIEhSRVNVTFQgaHI7CisgIElNb25pa2VyICptOworI2lmZGVmIFhNTF9VTklDT0RFCisgIGhyID0gQ3JlYXRlVVJMTW9uaWtlcigwLCB1cmksICZtKTsKKyNlbHNlCisgIExQV1NUUiB1cml3ID0gbmV3IHdjaGFyX3Rbc3RybGVuKHVyaSkgKyAxXTsKKyAgZm9yIChpbnQgaSA9IDA7OyBpKyspIHsKKyAgICB1cml3W2ldID0gdXJpW2ldOworICAgIGlmICh1cml3W2ldID09IDApCisgICAgICBicmVhazsKKyAgfQorICBociA9IENyZWF0ZVVSTE1vbmlrZXIoYmFzZU1vbmlrZXIsIHVyaXcsICZtKTsKKyAgZGVsZXRlIFtdIHVyaXc7CisjZW5kaWYKKyAgaWYgKEZBSUxFRChocikpCisgICAgcmV0dXJuIGhyOworICBJQmluZFN0YXR1c0NhbGxiYWNrICpjYiA9IG5ldyBDYWxsYmFjayhwYXJzZXIsIG0sIHN0b3BIYW5kbGVyLCBzdG9wQXJnKTsKKyAgWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlcihwYXJzZXIsIGV4dGVybmFsRW50aXR5UmVmKTsKKyAgWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlckFyZyhwYXJzZXIsIGNiKTsKKyAgY2ItPkFkZFJlZigpOworICBJQmluZEN0eCAqYjsKKyAgaWYgKEZBSUxFRChociA9IENyZWF0ZUFzeW5jQmluZEN0eCgwLCBjYiwgMCwgJmIpKSkgeworICAgIGNiLT5SZWxlYXNlKCk7CisgICAgbS0+UmVsZWFzZSgpOworICAgIHJldHVybiBocjsKKyAgfQorICBjYi0+UmVsZWFzZSgpOworICBJU3RyZWFtICpwU3RyZWFtOworICBociA9IG0tPkJpbmRUb1N0b3JhZ2UoYiwgMCwgSUlEX0lTdHJlYW0sICh2b2lkICoqKSZwU3RyZWFtKTsKKyAgaWYgKFNVQ0NFRURFRChocikpIHsKKyAgICBpZiAocFN0cmVhbSkKKyAgICAgIHBTdHJlYW0tPlJlbGVhc2UoKTsKKyAgfQorICBpZiAoaHIgPT0gTUtfU19BU1lOQ0hST05PVVMpCisgICAgaHIgPSBTX09LOworICBtLT5SZWxlYXNlKCk7CisgIGItPlJlbGVhc2UoKTsKKyAgcmV0dXJuIGhyOworfQorCitzdHJ1Y3QgUXVpdEluZm8geworICBjb25zdCBYTUxfQ2hhciAqdXJsOworICBIUkVTVUxUIGhyOworICBpbnQgc3RvcDsKK307CisKK3N0YXRpYyB2b2lkCit3aW5QZXJyb3IoY29uc3QgWE1MX0NoYXIgKnVybCwgSFJFU1VMVCBocikKK3sKKyAgTFBWT0lEIGJ1ZjsKKyAgaWYgKEZvcm1hdE1lc3NhZ2UoRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSCisJCSAgICB8IEZPUk1BVF9NRVNTQUdFX0ZST01fSE1PRFVMRSwKKwkJICAgIEdldE1vZHVsZUhhbmRsZUEoInVybG1vbi5kbGwiKSwKKwkJICAgIGhyLAorCQkgICAgTUFLRUxBTkdJRChMQU5HX05FVVRSQUwsIFNVQkxBTkdfREVGQVVMVCksCisJCSAgICAoTFBUU1RSKSAmYnVmLAorCQkgICAgMCwKKwkJICAgIE5VTEwpCisgICAgICB8fCBGb3JtYXRNZXNzYWdlKEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUgorCQkgICAgICB8IEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNLAorCQkgICAgICAwLAorCQkgICAgICBociwKKwkJICAgICAgTUFLRUxBTkdJRChMQU5HX05FVVRSQUwsIFNVQkxBTkdfREVGQVVMVCksCisJCSAgICAgIChMUFRTVFIpICZidWYsCisJCSAgICAgIDAsCisJCSAgICAgIE5VTEwpKSB7CisgICAgLyogVGhlIHN5c3RlbSBlcnJvciBtZXNzYWdlcyBzZWVtIHRvIGVuZCB3aXRoIGEgbmV3bGluZS4gKi8KKyAgICBfZnRwcmludGYoc3RkZXJyLCBfVCgiJXM6ICVzIiksIHVybCwgYnVmKTsKKyAgICBmZmx1c2goc3RkZXJyKTsKKyAgICBMb2NhbEZyZWUoYnVmKTsKKyAgfQorICBlbHNlCisgICAgX2Z0cHJpbnRmKHN0ZGVyciwgX1QoIiVzOiBlcnJvciAleFxuIiksIHVybCwgaHIpOworfQorCitzdGF0aWMgdm9pZAordGhyZWFkUXVpdCh2b2lkICpwLCBIUkVTVUxUIGhyKQoreworICBRdWl0SW5mbyAqcWkgPSAoUXVpdEluZm8gKilwOworICBxaS0+aHIgPSBocjsKKyAgcWktPnN0b3AgPSAxOworfQorCitleHRlcm4gIkMiCitpbnQKK1hNTF9VUkxJbml0KHZvaWQpCit7CisgIHJldHVybiBTVUNDRUVERUQoQ29Jbml0aWFsaXplKDApKTsKK30KKworZXh0ZXJuICJDIgordm9pZAorWE1MX1VSTFVuaW5pdCh2b2lkKQoreworICBDb1VuaW5pdGlhbGl6ZSgpOworfQorCitzdGF0aWMgaW50Citwcm9jZXNzVVJMKFhNTF9QYXJzZXIgcGFyc2VyLCBJTW9uaWtlciAqYmFzZU1vbmlrZXIsCisgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICp1cmwpCit7CisgIFF1aXRJbmZvIHFpOworICBxaS5zdG9wID0gMDsKKyAgcWkudXJsID0gdXJsOworCisgIFhNTF9TZXRCYXNlKHBhcnNlciwgdXJsKTsKKyAgSFJFU1VMVCBociA9IG9wZW5TdHJlYW0ocGFyc2VyLCBiYXNlTW9uaWtlciwgdXJsLCB0aHJlYWRRdWl0LCAmcWkpOworICBpZiAoRkFJTEVEKGhyKSkgeworICAgIHdpblBlcnJvcih1cmwsIGhyKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBlbHNlIGlmIChGQUlMRUQocWkuaHIpKSB7CisgICAgd2luUGVycm9yKHVybCwgcWkuaHIpOworICAgIHJldHVybiAwOworICB9CisgIE1TRyBtc2c7CisgIHdoaWxlICghcWkuc3RvcCAmJiBHZXRNZXNzYWdlICgmbXNnLCBOVUxMLCAwLCAwKSkgeworICAgIFRyYW5zbGF0ZU1lc3NhZ2UgKCZtc2cpOworICAgIERpc3BhdGNoTWVzc2FnZSAoJm1zZyk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2V4dGVybiAiQyIKK2ludAorWE1MX1Byb2Nlc3NVUkwoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqdXJsLAorICAgICAgICAgICAgICAgdW5zaWduZWQgZmxhZ3MpCit7CisgIHJldHVybiBwcm9jZXNzVVJMKHBhcnNlciwgMCwgdXJsKTsKK30K