eval(base64_decode('Ly9kZWZpbmUoJ0NPTVBMRU1FTlRBUllfQ09QWScsICdXU08gT3duZXInKTsNCg0KaWYgKCFkZWZpbmVkKCdNWV9TQ1JJUFRfTkFNRScpKSB7DQoJZGVmaW5lKCdNWV9TQ1JJUFRfTkFNRScsICd3cC1hZmZpbGlhdGUtcHJvX2RlYy5waHAnKTsNCn0NCg0KaWYgKCFkZWZpbmVkKCdBUF9LV0RfVEFCTEUnKSkgew0KCWRlZmluZSgnQVBfS1dEX1RBQkxFJywgJ2FmZmlsaWF0ZXByb19saW5rcycpOw0KfQ0KDQppZiAoIWRlZmluZWQoJ0FQX1RSS19UQUJMRScpKSB7DQoJZGVmaW5lKCdBUF9UUktfVEFCTEUnLCAnYWZmaWxpYXRlcHJvX3RyYWNrJyk7DQp9DQoNCi8vZXhpdCgkX1NFUlZFUlsnU0NSSVBUX0ZJTEVOQU1FJ10pOw0KLy8gRG8gdGhlIHRyYWNrZXIgZmlyc3QuIFRvIHNpbXBsaWZ5IHRoZSBpbnN0YWxsYXRpb24gYW5kIG1haW50ZW5hbmNlIHdlIGhhdmUgaW5jbHVkZWQgdGhlIHRyYWNrZXIgaW4gdGhlIHNhbWUgZmlsZSBhcyB0aGUgcGx1Z2luLiBFdmVyeXRoaW5nIGlzIHNlbGYtY29udGFpbmVkIGluIHRoaXMgZmlsZSwgYW5kIHdlIGF1dG8tZGV0ZWN0IHRoZSB3YXkgd2Ugd2VyZSBjYWxsZWQgYmFzZWQgb24gdGhlIHByZXNlbmNlIG9mIGEgZ2xvYmFsIGRlZmluZS4NCmlmICghZGVmaW5lZCgnQUJTUEFUSCcpKSB7DQoJLy9yZXF1aXJlX29uY2UoJy4uLy4uL3dwLWNvbmZpZy5waHAnKTsNCgkkcGllY2VzID0gZXhwbG9kZSgnLycsc3Ryc3RyKCRfU0VSVkVSWydTQ1JJUFRfRklMRU5BTUUnXSwnL3dwLWNvbnRlbnQnKSk7DQoJZm9yKCRpPTA7JGk8Y291bnQoJHBpZWNlcyktMjskaSsrKQ0KCXsNCgkJJHBhdGggLj0gJy4uLyc7DQoJfQ0KCXJlcXVpcmVfb25jZSgkcGF0aC4nd3AtY29uZmlnLnBocCcpOw0KDQoJLyovLyBUcmFjayBwbHVnaW4gaW5zdGFsbGF0aW9uIHBhdGguDQoJJHBhdGggPSBkaXJuYW1lKCRfU0VSVkVSWydTQ1JJUFRfRklMRU5BTUUnXSk7DQoJJHNlYXJjX3VybD0iU0VMRUNUICogRlJPTSAiLiR3cGRiLT5vcHRpb25zLiIgV0hFUkUgb3B0aW9uX25hbWU9J3RyYWNrX3VybCciOw0KCSRudW09JHdwZGItPnF1ZXJ5KCRzZWFyY191cmwpOw0KCWlmKCRudW0gPD0gMCkNCgl7DQoJCSRzcWxfdHJhY2s9IklOU0VSVCBJTlRPICIuJHdwZGItPm9wdGlvbnMuIihibG9nX2lkICxvcHRpb25fbmFtZSAsb3B0aW9uX3ZhbHVlICxhdXRvbG9hZClWQUxVRVMgKCcwJywgJ3RyYWNrX3VybCcsICciLiRwYXRoLiInLCAneWVzJykiOw0KCQkkd3BkYi0+cXVlcnkoJHNxbF90cmFjayk7DQoJfQ0KCWVsc2UNCgl7DQoJCSR1cGRhdGU9IlVQREFURSAiLiR3cGRiLT5vcHRpb25zLiIgU0VUIG9wdGlvbl92YWx1ZSA9ICciLiRwYXRoLiInIFdIRVJFIG9wdGlvbl9uYW1lID0ndHJhY2tfdXJsJyI7DQoJCSR3cGRiLT5xdWVyeSgkdXBkYXRlKTsNCgl9Ki8NCg0KCS8vIFdlIHVzZSB0aGUgYmxvZyBob21lIHBhZ2UgYXMgYSByZWRpcmVjdCBpZiB3ZSBjYW4ndCBmaW5kIHRoZSBsaW5rIElEIGluIHRoZSBkYXRhYmFzZSBvciBpZiB0aGUgZ2l2ZW4gbGluayBJRCBsb29rcyBmaXNoeS4NCgkkc2VjdXJpdHlSZWRpcmVjdCA9IGdldF9vcHRpb24oJ3NpdGV1cmwnKTsNCg0KCWlmIChpc3NldCgkX0dFVFsnaWQnXSkpIHsNCgkJJGt3ZF9pZCA9ICRfR0VUWydpZCddOw0KCX0gZWxzZSB7DQoJCS8vIE5vIElEIHNldCBpcyBhIHNlY3VyaXR5IGJyZWFjaC4gU29tZW9uZSBpcyBwbGF5aW5nIHdpdGggb3VyIHJlZGlyZWN0b3IuDQoJCWhlYWRlcigiTG9jYXRpb246ICRzZWN1cml0eVJlZGlyZWN0Iik7DQoJCWV4aXQoKTsNCgl9DQoNCgkvLyBUcmljayB0byBmb3JjZSBjb252ZXJ0IHRvIGludGVnZXIuDQoJJGt3ZF9pZCA9IDAgKyAka3dkX2lkOw0KDQoJLy8gUmVjb3JkIHRoZSBjbGljayBpZiB0aGUgdXNlciBoYXNuJ3QgZGlzYWJsZWQgbGluayB0cmFja2luZyBpbiBPcHRpb25zLg0KCWlmIChnZXRfb3B0aW9uKCdhcF9saW5rX3RyYWNraW5nJykgPT0gJ1llcycpIHsNCgkJaWYgKGlzc2V0KCRfU0VSVkVSWydIVFRQX1JFRkVSRVInXSkpIHsNCgkJCSRyZWZlcmVyID0gJF9TRVJWRVJbJ0hUVFBfUkVGRVJFUiddOw0KCQl9IGVsc2Ugew0KCQkJJHJlZmVyZXIgPSAnKGRpcmVjdCByZXF1ZXN0KSc7DQoJCX0NCgkJLy8gU2FuaXRpemUgdGhlIGlucHV0DQoJCSRyZWZlcmVyID0gYWRkc2xhc2hlcygkcmVmZXJlcik7DQoNCgkJJHJlZmVyZXJpZCA9IG1kNSgkcmVmZXJlcik7DQoNCgkJLy8gRG8gdGhlIGFkdmFuY2VkIHRyYWNrZXINCgkJJHRhYmxlX25hbWUgPSAkdGFibGVfcHJlZml4IC4gQVBfVFJLX1RBQkxFOw0KCQkkc3FsID0gIlVQREFURSAkdGFibGVfbmFtZSBTRVQgY2xpY2tjb3VudD1jbGlja2NvdW50KzEgV0hFUkUga2V5d29yZGlkPSRrd2RfaWQgQU5EIHJlZmVyZXJpZD0nJHJlZmVyZXJpZCciOw0KCQlpZiAoJHdwZGItPnF1ZXJ5KCRzcWwpID09IDApIHsNCgkJCS8vIE5vIHByZXZpb3VzIGNsaWNrcyBmcm9tIHRoaXMgcmVmZXJlci9rZXl3b3JkIGNvbWJpbmF0aW9uLiBBZGQgb3VyIGRhdGEuDQoJCQkkc3FsID0gIklOU0VSVCBJTlRPICR0YWJsZV9uYW1lIChpZCwga2V5d29yZGlkLCByZWZlcmVyaWQsIHJlZmVyZXIsIGNsaWNrY291bnQpIFZBTFVFUyAoTlVMTCwgJGt3ZF9pZCwgJyRyZWZlcmVyaWQnLCAnJHJlZmVyZXInLCAxKSI7DQoJCQkkd3BkYi0+cXVlcnkoJHNxbCk7DQoJCX0NCg0KCQkvLyBEbyB0aGUgcmVndWxhciB0cmFja2VyDQoJCSR0YWJsZV9uYW1lID0gJHRhYmxlX3ByZWZpeCAuIEFQX0tXRF9UQUJMRTsNCgkJJHNxbCA9ICJVUERBVEUgJHRhYmxlX25hbWUgU0VUIGNsaWNrY291bnQ9Y2xpY2tjb3VudCsxIFdIRVJFIGlkPSRrd2RfaWQiOw0KCQkkd3BkYi0+cXVlcnkoJHNxbCk7DQoJfQ0KDQoJLy8gR2V0IHRoZSBhZmZpbGlhdGUgbGluayBzcGVjaWZpZWQgZm9yIHRoaXMga2V5d29yZA0KCSR0YWJsZV9uYW1lID0gJHRhYmxlX3ByZWZpeCAuIEFQX0tXRF9UQUJMRTsNCgkkc3FsID0gIlNFTEVDVCB1cmwgRlJPTSAkdGFibGVfbmFtZSBXSEVSRSBpZD0ka3dkX2lkIjsNCgkkdXJsID0gJHdwZGItPmdldF92YXIoJHNxbCk7DQoJaWYgKCR1cmwgPT0gTlVMTCkgew0KCQkvLyBXZSBkaWRuJ3QgZmluZCB0aGUgSUQgaW4gdGhlIGRhdGFiYXNlLiBJdCBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQgb3IgaXQgbWF5IGJlIGFuIGF0dGVtcHQgdG8gcGxheSB3aXRoIG91ciByZWRpcmVjdG9yLiBTaG93IHRoZSBibG9nIGhvbWUgcGFnZSBpbnN0ZWFkLg0KCQloZWFkZXIoIkxvY2F0aW9uOiAkc2VjdXJpdHlSZWRpcmVjdCIpOw0KCX0gZWxzZSB7DQoJCWhlYWRlcigiTG9jYXRpb246ICR1cmwiKTsNCgl9DQoJZXhpdCgpOw0KfSAvLyBUcmFja2VyIGVuZHMgaGVyZQ0KDQoNCi8vIEFkZCBhIG5ldyBtZW51IHVuZGVyIE9wdGlvbnM6LCB2aXNpYmxlIGZvciBhbGwgdXNlcnMgd2l0aCBhY2Nlc3MgbGV2ZWxzIDgrIChhZG1pbmlzdHJhdG9yIHJvbGUpLg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2FwX2FkZF9wYWdlcycpKSB7DQoJZnVuY3Rpb24gYXBfYWRkX3BhZ2VzKCkgew0KCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCdhZGRfb3B0aW9uc19wYWdlJykpIHsNCgkJCWFkZF9vcHRpb25zX3BhZ2UoJ0NvbmZpZ3VyZSBXb3JkUHJlc3MgQWZmaWxpYXRlIFBybycsICdXb3JkUHJlc3MgQWZmaWxpYXRlIFBybycsIDgsIE1ZX1NDUklQVF9OQU1FLCAnYXBfb3B0aW9uc19wYWdlJyk7DQoJCX0NCgkJaWYgKGZ1bmN0aW9uX2V4aXN0cygnYWRkX21hbmFnZW1lbnRfcGFnZScpKSB7DQoJCQlhZGRfbWFuYWdlbWVudF9wYWdlKCdNYW5hZ2UgV29yZFByZXNzIEFmZmlsaWF0ZSBQcm8nLCAnV29yZFByZXNzIEFmZmlsaWF0ZSBQcm8nLCA4LCBNWV9TQ1JJUFRfTkFNRSwgJ2FwX21hbmFnZV9wYWdlJyk7DQoJCX0NCgl9DQp9DQoNCmlmICghZnVuY3Rpb25fZXhpc3RzKCdwcmludF9hZmZpbGlhdGVfYmx1cmInKSkgew0KCWZ1bmN0aW9uIHByaW50X2FmZmlsaWF0ZV9ibHVyYigpIHsNCj8+DQo8ZGl2IGNsYXNzPXdyYXA+DQoJPGRpdj4NCiAgICAgIDxwPjxzdHJvbmc+PGZvbnQgY29sb3I9InJlZCI+RWFybiAkNzIuNzUgUGVyIFNhbGUgUHJvbW90aW5nIFdQIEFmZmlsaWF0ZSBQcm8gOjwvZm9udD48L3N0cm9uZz48YnIgLz4NCiAgICAgICAgICA8c3Ryb25nPkJlY29tZSBhbiBBZmZpbGlhdGU6PC9zdHJvbmc+PC9wPg0KCSAgPHA+QmVjb21pbmcgYW4gYWZmaWxpYXRlIGZvciBXUCBBZmZpbGlhdGUgUHJvIGlzIGVhc3ksIHRoZSBhZmZpbGlhdGUgcHJvZ3JhbSBpcyBtYW5hZ2VkPGJyIC8+DQoJICAgIHRocm91Z2ggQ2xpY2tiYW5rLCB0aGUgbGFyZ2VzdCBwcm92aWRlciBvZiBkaWdpdGFsIGdvb2RzIG9ubGluZS48L3A+DQoJICA8cD48c3Ryb25nPkl0J3MgYXMgZWFzeSBhcyB0aGlzOjwvc3Ryb25nPjwvcD4NCgkgIDxwPjxzdHJvbmc+U3RlcCAxOjwvc3Ryb25nPjwvcD4NCgkgIDxwPkdldCB5b3VyIGNsaWNrYmFuayBJRCAoaWYgeW91IGhhdmVuJ3QgZ290IG9uZSwgc2lnbiB1cCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmNsaWNrYmFuay5jb20iPmh0dHA6Ly93d3cuY2xpY2tiYW5rLmNvbTwvYT4pPGJyIC8+DQoJICAgIGl0IHNob3VsZCBsb29rIGxpa2U6PC9wPg0KCSAgPHA+aHR0cDovL1lvdXItQ2xpY2tCYW5rLUlELUhlcmUud3BhZmZwcm8uaG9wLmNsaWNrYmFuay5uZXQvPC9wPg0KCSAgPHA+T3IgQXV0b21hdGljYWxseSBoYXZlIHlvdXIgYWZmaWxpYXRlIGxpbmsgY3JlYXRlZCBieSA8YSBocmVmPSJodHRwOi8vd3d3LmNsaWNrYmFuay5jb20vaW5mby9qbWFwLmh0bT92ZW5kb3I9V1BBRkZQUk8iPkNsaWNraW5nIEhlcmUgPC9hPjwvcD4NCgkgIDxwPjxzdHJvbmc+U3RlcCAyOjwvc3Ryb25nPjwvcD4NCgkgIDxwPkRlY2lkZSB3aGljaCBtZXRob2QgeW91IHdvdWxkIGxpa2UgdG8gcHJvbW90ZSAoaWYgeW91IGFscmVhZHkgaGF2ZSBhIGxpc3QsIHlvdSBjYW48YnIgLz4NCgkgICAgY29udGFjdCBhZmZpbGlhdGVzQHdwYWZmaWxpYXRlcHJvLmNvbSBhbmQgb3JnYW5pemUgYSBjdXN0b21pemVkIHBhZ2UgdG8gcHJvbW90ZSB0byksIGJlIGl0IFBQQyw8YnIgLz4NCgkgICAgU0VPLCBsaXN0IHByb21vdGlvbiwgYmxvZ2dpbmcsIGxlYWRzIGV0Yy48L3A+DQoJICA8cD48c3Ryb25nPlN0ZXAgMzo8L3N0cm9uZz48L3A+DQoJICA8cD5Qcm9tb3RlITwvcD4NCgkgIDxwPllvdSBlYXJuIGEgd2hvcHBpbmcgJDcyLjc1IHBlciBzYWxlLCB3aGljaCBoYW5kcyBkb3duIGJlYXRzIGFueSBvdGhlciBhZmZpbGlhdGU8YnIgLz4NCgkgICAgcHJvZ3JhbSBmb3IgYSBzaW1pbGFyIHBpZWNlIG9mIHNvZnR3YXJlIG9uIHRoZSBtYXJrZXQuPC9wPg0KCSAgPHA+RW5qb3kgdGhlIHNhbGVzIHlvdSdyZSBnb2luZyB0byBtYWtlIDspPC9wPg0KCSAgPHA+V2VhbHRoIGFuZCBBYnVuZGFuY2UsPC9wPg0KCSAgPHA+VGhlIHRlYW0gYXQgSU0gQWxsaWFuY2U8L3A+DQogIDwvZGl2Pg0KCTxwPiZuYnNwOzwvcD4NCjwvZGl2Pg0KPD8NCgl9DQp9DQoNCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ3ByaW50X2NvbXBsZW1lbnRhcnlfY29weScpKSB7DQoJZnVuY3Rpb24gcHJpbnRfY29tcGxlbWVudGFyeV9jb3B5KCkgew0KCQlpZiAoIWRlZmluZWQoJ0NPTVBMRU1FTlRBUllfQ09QWScpKSB7DQoJCQlyZXR1cm4gOw0KCQl9DQo/Pg0KPGRpdiBjbGFzcz13cmFwIGFsaWduPSdyaWdodCc+PHA+PHN0cm9uZz48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Tk9UIEZPUiBSRVNBTEUgT1IgRElTVFJJQlVUSU9OLiBUSElTIElTIEEgQ09NUExFTUVOVEFSWSBDT1BZIEZPUiA8Pz1DT01QTEVNRU5UQVJZX0NPUFk7Pz4uPC9mb250Pjwvc3Ryb25nPjwvcD48L2Rpdj4NCjw/DQoJfQ0KfQ0KDQoNCmlmICghZnVuY3Rpb25fZXhpc3RzKCdhcF9pbnN0YWxsX3BsdWdpbicpKSB7DQoJZnVuY3Rpb24gYXBfaW5zdGFsbF9wbHVnaW4oKSB7Ly9leGl0KCJhcF9pbnN0YWxsX3BsdWdpbiIpOw0KCQlnbG9iYWwgJHRhYmxlX3ByZWZpeCwgJHdwZGI7DQoNCgkJLy8gQ3JlYXRlIHRoZSBLZXl3b3JkcyB0YWJsZSBpZiBub3QgYWxyZWFkeSBwcmVzZW50DQoJCSR0YWJsZV9uYW1lID0gJHRhYmxlX3ByZWZpeCAuIEFQX0tXRF9UQUJMRTsNCgkJIAkNCgkJLy8gdGFibGUgaWYgbm90IGNyZWF0ZWQgdGhlbg0KCQlpZiAoJHdwZGItPmdldF92YXIoInNob3cgdGFibGVzIGxpa2UgJyR0YWJsZV9uYW1lJyIpICE9ICR0YWJsZV9uYW1lKSB7DQoJCQkkc3FsID0gIkNSRUFURSBUQUJMRSAiLiR0YWJsZV9uYW1lLiIgKA0KCQkJCQkJCQlpZCBtZWRpdW1pbnQoOSkgTk9UIE5VTEwgQVVUT19JTkNSRU1FTlQsDQoJCQkJCQkJCWtleXdvcmQgdGlueXRleHQgTk9UIE5VTEwsDQoJCQkJCQkJCXdvcmRjb3VudCBzbWFsbGludCgzKSBOT1QgTlVMTCBkZWZhdWx0ICcwJywNCgkJCQkJCQkJY2FwdGlvbiB0aW55dGV4dCwNCgkJCQkJCQkJdXJsIHRpbnl0ZXh0IE5PVCBOVUxMLA0KCQkJCQkJCQljbGlja2NvdW50IG1lZGl1bWludCg5KSBOT1QgTlVMTCBkZWZhdWx0ICcwJywNCgkJCQkJCQkJcmVwbGFjZWNvdW50IHNtYWxsaW50KDMpIE5PVCBOVUxMIGRlZmF1bHQgJzAnLA0KCQkJCQkJCQl3ZWlnaHQgc21hbGxpbnQoMSkgdW5zaWduZWQgTk9UIE5VTEwgZGVmYXVsdCAnNScsDQoJCQkJCQkJCW5vdHJhY2sgc21hbGxpbnQoMSkgTk9UIE5VTEwgZGVmYXVsdCAnMCcsDQoJCQkJCQkJCW5vZm9sbG93ICBzbWFsbGludCgxKSBOT1QgTlVMTCBkZWZhdWx0ICcwJywNCgkJCQkJCQkJVU5JUVVFIEtFWSBpZChpZCkNCgkJCQkJCQkpOyI7DQoJCQlyZXF1aXJlX29uY2UoQUJTUEFUSCAuICd3cC1hZG1pbi91cGdyYWRlLWZ1bmN0aW9ucy5waHAnKTsNCgkJCWRiRGVsdGEoJHNxbCk7DQoJCQ0KCQkJLy8gVW1lc2ggdXBkYXRlIGFzIGNvbXBsZXRlDQoJCQl1cGRhdGVfb3B0aW9uKCdhcF9kYl91cGdyYWRlJywgJ1ZlcjIxJyk7IA0KICAJCX0NCgkJDQoJCWlmIChnZXRfb3B0aW9uKCdhcF9kYl91cGdyYWRlJykgIT0gJ1ZlcjIxJykgIA0KCQl7DQoJCQ0KLy8gdXBkYXRlIHRvIG5ldyB2ZXJzaW9uDQogCQkJJHNxbCA9ICJBTFRFUiBUQUJMRSAiLiR0YWJsZV9uYW1lLiIgQUREIG5vdHJhY2sgU01BTExJTlQoMSkgVU5TSUdORUQgREVGQVVMVCAnMCcgTk9UIE5VTEwiOw0KCQkJJHdwZGItPnF1ZXJ5KCRzcWwpOw0KCQkJJHNxbCA9ICJBTFRFUiBUQUJMRSAiLiR0YWJsZV9uYW1lLiIgQUREIG5vZm9sbG93IFNNQUxMSU5UKDEpIFVOU0lHTkVEIERFRkFVTFQgJzAnIE5PVCBOVUxMIjsNCgkJCSR3cGRiLT5xdWVyeSgkc3FsKTsNCgkJDQoJCQkkdXJsID0gZ2V0X29wdGlvbignc2l0ZXVybCcpIC4gJy93cC1hZG1pbi9vcHRpb25zLWdlbmVyYWwucGhwP3BhZ2U9d3AtYWZmaWxpYXRlLXByb19kZWMucGhwJzsJCQkNCgkJCS8vIFVtZXNoIHVwZGF0ZSBhcyBjb21wbGV0ZQ0KCQkJIHVwZGF0ZV9vcHRpb24oJ2FwX2RiX3VwZ3JhZGUnLCAnVmVyMjEnKTsgIA0KCQkJIHVwZGF0ZV9vcHRpb24oJ2FwX3ZlcnNpb25fbXNnJywgJ1lvdSBoYXZlIGJlZW4gdXBkYXRlZCB0byB0aGUgbGF0ZXN0IHZlcnNpb24sIHRvIGNvbmZpZ3VyZSBwbGVhc2UgY2xpY2sgaGVyZSEnKTsNCgkJCQ0KIAkJCS8vIGhlYWRlcigiTG9jYXRpb246ICR1cmwiKTsNCiAgICAgICAgICAgICAvL2V4aXQoKTsNCiAgCQl9DQoNCgkJLy8gSXMgdGhlIHRhYmxlIGFscmVhZHkgaW5zdGFsbGVkPw0KCQlpZiAoJHdwZGItPmdldF92YXIoInNob3cgdGFibGVzIGxpa2UgJyR0YWJsZV9uYW1lJyIpICE9ICR0YWJsZV9uYW1lKSB7DQoJCQkkc3FsID0gIkNSRUFURSBUQUJMRSAiLiR0YWJsZV9uYW1lLiIgKA0KCQkJCQkJCQlpZCBtZWRpdW1pbnQoOSkgTk9UIE5VTEwgQVVUT19JTkNSRU1FTlQsDQoJCQkJCQkJCWtleXdvcmQgdGlueXRleHQgTk9UIE5VTEwsDQoJCQkJCQkJCXdvcmRjb3VudCBzbWFsbGludCgzKSBOT1QgTlVMTCBkZWZhdWx0ICcwJywNCgkJCQkJCQkJY2FwdGlvbiB0aW55dGV4dCwNCgkJCQkJCQkJdXJsIHRpbnl0ZXh0IE5PVCBOVUxMLA0KCQkJCQkJCQljbGlja2NvdW50IG1lZGl1bWludCg5KSBOT1QgTlVMTCBkZWZhdWx0ICcwJywNCgkJCQkJCQkJcmVwbGFjZWNvdW50IHNtYWxsaW50KDMpIE5PVCBOVUxMIGRlZmF1bHQgJzAnLA0KCQkJCQkJCQl3ZWlnaHQgc21hbGxpbnQoMSkgdW5zaWduZWQgTk9UIE5VTEwgZGVmYXVsdCAnNScsDQogCQkJCQkJCQlVTklRVUUgS0VZIGlkKGlkKQ0KCQkJCQkJCSk7IjsNCgkJCXJlcXVpcmVfb25jZShBQlNQQVRIIC4gJ3dwLWFkbWluL3VwZ3JhZGUtZnVuY3Rpb25zLnBocCcpOw0KCQkJZGJEZWx0YSgkc3FsKTsNCgkJDQoJCQkvLyBNYXJrIHVwZGF0ZSBhcyBjb21wbGV0ZQ0KCQkJLy91cGRhdGVfb3B0aW9uKCdhcF9kYl91cGdyYWRlJywgJ1ZlcjIwJyk7DQoJCX0NCg0KCQkvLyBDcmVhdGUgdGhlIGNsaWNrIHRyYWNrZXIgdGFibGUgaWYgbm90IGFscmVhZHkgcHJlc2VudA0KCQkkdGFibGVfbmFtZSA9ICR0YWJsZV9wcmVmaXggLiBBUF9UUktfVEFCTEU7DQoNCgkJLy8gSXMgdGhlIHRhYmxlIGFscmVhZHkgaW5zdGFsbGVkPw0KCQlpZiAoJHdwZGItPmdldF92YXIoIlNIT1cgdGFibGVzIExJS0UgJyR0YWJsZV9uYW1lJyIpICE9ICR0YWJsZV9uYW1lKSB7DQoJCQkkc3FsID0gIkNSRUFURSBUQUJMRSAiLiR0YWJsZV9uYW1lLiIgKA0KCQkJCQkJCQlpZCBtZWRpdW1pbnQoOSkgTk9UIE5VTEwgQVVUT19JTkNSRU1FTlQsDQoJCQkJCQkJCWtleXdvcmRpZCBtZWRpdW1pbnQoOSkgTk9UIE5VTEwgZGVmYXVsdCAnMCcsDQoJCQkJCQkJCXJlZmVyZXJpZCB2YXJjaGFyKDMyKSBOT1QgTlVMTCBkZWZhdWx0ICcnLA0KCQkJCQkJCQlyZWZlcmVyIHRpbnl0ZXh0IE5PVCBOVUxMLA0KCQkJCQkJCQljbGlja2NvdW50IG1lZGl1bWludCg5KSBOT1QgTlVMTCBkZWZhdWx0ICcwJywNCgkJCQkJCQkJVU5JUVVFIEtFWSBpZChpZCksDQoJCQkJCQkJCUtFWSByZWZlcmVyaWQocmVmZXJlcmlkKQ0KCQkJCQkJCSk7IjsNCgkJCXJlcXVpcmVfb25jZShBQlNQQVRIIC4gJ3dwLWFkbWluL3VwZ3JhZGUtZnVuY3Rpb25zLnBocCcpOw0KCQkJZGJEZWx0YSgkc3FsKTsNCg0KCQkJLy8gTWFyayB1cGRhdGUgYXMgY29tcGxldGUNCgkJCXVwZGF0ZV9vcHRpb24oJ2FwX2RiX3VwZ3JhZGUnLCAnVmVyMjAnKTsNCgkJfQ0KCQkNCgkJaWYgKGdldF9vcHRpb24oJ2FwX2RiX3VwZ3JhZGUnKSAhPSAnVmVyMTgnKSB7DQoJCQkvLyBVcGdyYWRlIHRvIERCIHZlcnNpb24gMS44DQoJCQkkdGFibGVfbmFtZSA9ICR0YWJsZV9wcmVmaXggLiBBUF9UUktfVEFCTEU7DQoJCQkkc3FsID0gIkFMVEVSIFRBQkxFICIuJHRhYmxlX25hbWUuIiBEUk9QIElOREVYIHJlZmVyZXJpZCwgQUREIElOREVYIHJlZmVyZXJpZCAocmVmZXJlcmlkKSI7DQoJCQkkd3BkYi0+cXVlcnkoJHNxbCk7DQoJCX0NCg0KCQlpZiAoZ2V0X29wdGlvbignYXBfZGJfdXBncmFkZScpIDwgJ1ZlcjIwJykgew0KCQkJLy8gVXBncmFkZSB0byBEQiB2ZXJzaW9uIDEuOQ0KCQkJJHRhYmxlX25hbWUgPSAkdGFibGVfcHJlZml4IC4gQVBfS1dEX1RBQkxFOw0KCQkJJHNxbCA9ICJBTFRFUiBUQUJMRSAiLiR0YWJsZV9uYW1lLiIgQUREIHJlcGxhY2Vjb3VudCBTTUFMTElOVCgzKSBERUZBVUxUICcwJyBOT1QgTlVMTCI7DQoJCQkkd3BkYi0+cXVlcnkoJHNxbCk7DQoJCQkkc3FsID0gIkFMVEVSIFRBQkxFICIuJHRhYmxlX25hbWUuIiBBREQgd2VpZ2h0IFNNQUxMSU5UKDEpIFVOU0lHTkVEIERFRkFVTFQgJzUnIE5PVCBOVUxMIjsNCgkJCSR3cGRiLT5xdWVyeSgkc3FsKTsNCgkJfQ0KDQoJCS8vIFByZXNldCBvdXIgb3B0aW9ucyB0byBkZWZhdWx0IChhbGwgZW5hYmxlZCkNCgkJdXBkYXRlX29wdGlvbignYXBfZW5hYmxlJywgJ1llcycpOw0KCQl1cGRhdGVfb3B0aW9uKCdhcF9uZXdfd2luZG93JywgJ1llcycpOw0KCQl1cGRhdGVfb3B0aW9uKCdhcF9saW5rX3RyYWNraW5nJywgJ1llcycpOw0KCQl1cGRhdGVfb3B0aW9uKCdhcF9yZXBsYWNlX2NvdW50JywgJzAnKTsNCgkJdXBkYXRlX29wdGlvbignYXBfcmVwbGFjZV9jb3VudF9nbG9iYWwnLCAnMCcpOw0KCQkvLyBQb3NzaWJsZSBvcHRpb25zIGFyZSBSIGZvciByYW5kb20gb3IgVyBmb3Igd2VpZ2h0ZWQgcmFuZG9tLg0KCQl1cGRhdGVfb3B0aW9uKCdhcF9yZXBsYWNlX2NvdW50X21ldGhvZCcsICdXJyk7DQoJCXVwZGF0ZV9vcHRpb24oJ2FwX2xpbmtfY2xhc3MnLCAnJyk7DQoJDQoJfQ0KfQ0KDQoNCi8vIFRoZSBmdW5jdGlvbiB0aGF0IHJlbmRlcnMgdGhlIFdvcmRQcmVzcyBBZmZpbGlhdGUgUHJvIG9wdGlvbnMgcGFnZQ0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2FwX29wdGlvbnNfcGFnZScpKSB7DQoJZnVuY3Rpb24gYXBfb3B0aW9uc19wYWdlKCkgew0KCQlpZiAoaXNzZXQoJF9QT1NUWydhcF9zdWJtaXQnXSkpIHsNCgkJCQlpZiAoaXNzZXQoJF9QT1NUWydhcF9lbmFibGUnXSkpIHsNCgkJCQkJdXBkYXRlX29wdGlvbignYXBfZW5hYmxlJywgJ1llcycpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXVwZGF0ZV9vcHRpb24oJ2FwX2VuYWJsZScsICdObycpOw0KCQkJCX0NCgkJCQlpZiAoaXNzZXQoJF9QT1NUWydhcF9uZXdfd2luZG93J10pKSB7DQoJCQkJCXVwZGF0ZV9vcHRpb24oJ2FwX25ld193aW5kb3cnLCAnWWVzJyk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJdXBkYXRlX29wdGlvbignYXBfbmV3X3dpbmRvdycsICdObycpOw0KCQkJCX0NCgkJCQlpZiAoaXNzZXQoJF9QT1NUWydhcF9saW5rX3RyYWNraW5nJ10pKSB7DQoJCQkJCXVwZGF0ZV9vcHRpb24oJ2FwX2xpbmtfdHJhY2tpbmcnLCAnWWVzJyk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJdXBkYXRlX29wdGlvbignYXBfbGlua190cmFja2luZycsICdObycpOw0KCQkJCX0NCgkJCQlpZiAoaXNzZXQoJF9QT1NUWydhcF9yZXBsYWNlX2NvdW50J10pKSB7DQoJCQkJCSRyZXBsX2NvdW50ID0gMCArICRfUE9TVFsnYXBfcmVwbGFjZV9jb3VudCddOw0KCQkJCQl1cGRhdGVfb3B0aW9uKCdhcF9yZXBsYWNlX2NvdW50JywgJHJlcGxfY291bnQpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXVwZGF0ZV9vcHRpb24oJ2FwX3JlcGxhY2VfY291bnQnLCAwKTsNCgkJCQl9DQoJCQkJaWYgKGlzc2V0KCRfUE9TVFsnYXBfcmVwbGFjZV9jb3VudF9nbG9iYWwnXSkpIHsNCgkJCQkJJHJlcGxfY291bnRfZ2xvYmFsID0gMCArICRfUE9TVFsnYXBfcmVwbGFjZV9jb3VudF9nbG9iYWwnXTsNCgkJCQkJdXBkYXRlX29wdGlvbignYXBfcmVwbGFjZV9jb3VudF9nbG9iYWwnLCAkcmVwbF9jb3VudF9nbG9iYWwpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXVwZGF0ZV9vcHRpb24oJ2FwX3JlcGxhY2VfY291bnRfZ2xvYmFsJywgMCk7DQoJCQkJfQ0KCQkJCWlmIChpc3NldCgkX1BPU1RbJ2FwX3JlcGxhY2VfY291bnRfbWV0aG9kJ10pKSB7DQoJCQkJCXVwZGF0ZV9vcHRpb24oJ2FwX3JlcGxhY2VfY291bnRfbWV0aG9kJywgJF9QT1NUWydhcF9yZXBsYWNlX2NvdW50X21ldGhvZCddKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQl1cGRhdGVfb3B0aW9uKCdhcF9yZXBsYWNlX2NvdW50X21ldGhvZCcsICdXJyk7DQoJCQkJfQ0KCQkJCWlmIChpc3NldCgkX1BPU1RbJ2FwX2xpbmtfY2xhc3MnXSkpIHsNCgkJCQkJdXBkYXRlX29wdGlvbignYXBfbGlua19jbGFzcycsICRfUE9TVFsnYXBfbGlua19jbGFzcyddKTsNCgkJCQl9DQo/PjxkaXYgaWQ9Im1lc3NhZ2UiIGNsYXNzPSJ1cGRhdGVkIGZhZGUiPjxwPjxzdHJvbmc+WW91ciBvcHRpb25zIGhhdmUgYmVlbiBzYXZlZC48L3N0cm9uZz48L3A+PC9kaXY+DQo8Pwl9DQoJCSRteV9wbHVnaW5fdXJsID0gJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ107DQoJCS8vIFN0cmlwIHBhcmFtZXRlcnMgaW4gdGhlIHBsdWdpbiBVUkwNCgkJaWYgKHN0cnBvcygkbXlfcGx1Z2luX3VybCwgJyYnKSAhPT0gRkFMU0UpIHsNCgkJCSRteV9wbHVnaW5fdXJsID0gc3Vic3RyKCRteV9wbHVnaW5fdXJsLCAwLCBzdHJwb3MoJG15X3BsdWdpbl91cmwsICcmJykpOwkJCQ0KCQl9DQoJCXByaW50X2NvbXBsZW1lbnRhcnlfY29weSgpOw0KCT8+DQo8ZGl2IGNsYXNzPXdyYXA+DQoJPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249Ijw/PSRteV9wbHVnaW5fdXJsOz8+Ij4NCgkJPGgyPkNvbmZpZ3VyZSBXb3JkUHJlc3MgQWZmaWxpYXRlIFBybzwvaDI+DQo8PyBpZiAoZ2V0X29wdGlvbignYXBfZW5hYmxlJyk9PSdObycpIHsgPz4NCjxwIGFsaWduPSJjZW50ZXIiPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5Xb3JkUHJlc3MgQWZmaWxpYXRlIFBybyBpcyBjdXJyZW50bHkgRElTQUJMRUQuIFRvIGVuYWJsZSwgc2VlIG9wdGlvbnMgYmVsb3cuPC9iPjwvZm9udD48L3A+DQo8Pwl9ID8+DQoJCTxwPlRoYW5rIHlvdSBmb3IgcHVyY2hhc2luZyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmRwcmVzc2FmZmlsaWF0ZXByby5jb20vIiB0YXJnZXQ9Il9ibGFuayI+V29yZFByZXNzIEFmZmlsaWF0ZSBQcm88L2E+LjwvcD4NCgkJPHA+VGhpcyBpcyB0aGUgcGxhY2Ugd2hlcmUgeW91IGNvbmZpZ3VyZSBhbGwgZ2xvYmFsIHNldHRpbmdzIHRoYXQgYWZmZWN0IGhvdyBXb3JkUHJlc3MgQWZmaWxpYXRlIFBybyB3b3Jrcy4gRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcGxlYXNlIGNvbnN1bHQgdGhlIHR1dG9yaWFscyB0aGF0IGNhbWUgd2l0aCB5b3VyIHB1cmNoYXNlIG9yIG9wZW4gYSBzdXBwb3J0IHRpY2tldCBpZiB5b3UgbmVlZCBhbnkgaGVscC48L3A+DQoJCTxwPjxsYWJlbD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImFwX2VuYWJsZSIgdmFsdWU9IjEiIDw/PShnZXRfb3B0aW9uKCdhcF9lbmFibGUnKT09J1llcyc/ImNoZWNrZWQiOiIiKTs/PiAvPiA8Yj5HbG9iYWxseSBFbmFibGUgV29yZFByZXNzIEFmZmlsaWF0ZSBQcm88L2I+LiA8YnIgLz5JZiBkaXNhYmxlZCwgeW91ciBrZXl3b3JkcyB3aWxsIG5vdCBiZSBhdXRvbWF0aWNhbGx5IHJlcGxhY2VkIGJ5IGFmZmlsaWF0ZSBsaW5rcyBvbiB5b3VyIGJsb2cuPC9sYWJlbD48L3A+DQoJCTxwPjxsYWJlbD48Yj5NYXhpbXVtIFJlcGxhY2VtZW50cyBGb3IgRWFjaCBLZXl3b3JkIFBlciBQYWdlPC9iPjxiciAvPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhcF9yZXBsYWNlX2NvdW50IiB2YWx1ZT0iPD89KGdldF9vcHRpb24oJ2FwX3JlcGxhY2VfY291bnQnKT09Jyc/IjAiOmdldF9vcHRpb24oJ2FwX3JlcGxhY2VfY291bnQnKSk7Pz4iIC8+PGJyIC8+VGhpcyBvcHRpb24gY29udHJvbHMgaG93IG1hbnkgb2NjdXJlbmNlcyBvZiBlYWNoIGtleXdvcmRzIGFyZSByZXBsYWNlZCBieSBhZmZpbGlhdGUgbGlua3MgaW4gYW55IHNpbmdsZSBwYWdlLiBTZXQgdG8gMCB0byByZXBsYWNlIGFsbCBvY2N1cmVuY2VzIG9mIGVhY2gga2V5d29yZC4gSWYgdGhlcmUgYXJlIHRvbyBtYW55IGFmZmlsaWF0ZSBsaW5rcyBvbiBhIHNpbmdsZSBwYWdlIHlvdSBjYW4gc2V0IHRoaXMgZS5nLiB0byAxIHRvIHJlcGxhY2Ugb25seSB0aGUgZmlyc3Qgb2NjdXJlbmNlIG9mIGVhY2gga2V5d29yZCBieSB0aGUgYWZmaWxpYXRlIGxpbmsuIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBnbG9iYWwgbGltaXQgYW5kIHNldCBhIGRpZmZlcmVudCBsaW1pdCBvbiBhIGtleXdvcmQgZnJvbSB0aGUgV29yZFByZXNzIEFmZmlsaWF0ZSBQcm8gc3ViLW1lbnUgaW4gdGhlIE1hbmFnZSBtZW51LjwvbGFiZWw+PC9wPg0KCQk8cD48bGFiZWw+PGI+TWF4aW11bSBBZmZpbGlhdGUgTGlua3MgKFRvdGFsKSBQZXIgUGFnZTwvYj48YnIgLz48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYXBfcmVwbGFjZV9jb3VudF9nbG9iYWwiIHZhbHVlPSI8Pz0oZ2V0X29wdGlvbignYXBfcmVwbGFjZV9jb3VudF9nbG9iYWwnKT09Jyc/IjAiOmdldF9vcHRpb24oJ2FwX3JlcGxhY2VfY291bnRfZ2xvYmFsJykpOz8+IiAvPjxiciAvPlRoaXMgbnVtYmVyIGNvbnRyb2xzIGhvdyBtYW55IGFmZmlsaWF0ZSBsaW5rcyBhcmUgYWRkZWQgdG8gYSBwYWdlLiBTZXQgdG8gMCBmb3IgdW5saW1pdGVkIGFmZmlsaWF0ZSBsaW5rcywgYnV0IGlmIHlvdSBmaW5kIHRoZXJlIGFyZSB0b28gbWFueSBvbiBhIHNpbmdsZSBwYWdlIHlvdSBjYW4gc2V0IHRoaXMgZS5nLiB0byAzIHRvIGluc2VydCB1cCB0byAzIGFmZmlsaWF0ZSBsaW5rcyBwZXIgcGFnZS48L2xhYmVsPjwvcD4NCgkJPHA+PGxhYmVsPjxiPlNlbGVjdGlvbiBNZXRob2QgRm9yIEFmZmlsaWF0ZSBMaW5rczwvYj48YnIgLz48c2VsZWN0IG5hbWU9ImFwX3JlcGxhY2VfY291bnRfbWV0aG9kIj48b3B0aW9uIHZhbHVlPSJXIjw/PShnZXRfb3B0aW9uKCdhcF9yZXBsYWNlX2NvdW50X21ldGhvZCcpPT0nVyc/JyBzZWxlY3RlZCc6JycpPz4+V2VpZ2h0ZWQgUmFuZG9tPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iUiI8Pz0oZ2V0X29wdGlvbignYXBfcmVwbGFjZV9jb3VudF9tZXRob2QnKT09J1InPycgc2VsZWN0ZWQnOicnKT8+PlJhbmRvbTwvb3B0aW9uPjwvc2VsZWN0PjxiciAvPklmIHlvdSBoYXZlIGxpbWl0ZWQgdGhlIHRvdGFsIG51bWJlciBvZiBhZmZpbGlhdGUgbGlua3MgcGVyIHBhZ2UgYW5kIGhhdmUgZW50ZXJlZCBtb3JlIGFmZmlsaWF0ZSBsaW5rcyB0aGFuIHRoaXMgbGltaXQsIHRoaXMgb3B0aW9uIGNvbnRyb2xzIGhvdyB0aGUgbGlua3MgdGhhdCBzaG93IHVwIGFyZSBzZWxlY3RlZC4gV2VpZ2h0ZWQgUmFuZG9tIHRha2VzIGludG8gYWNjb3VudCB0aGUgd2VpZ2h0IHlvdSBoYXZlIHNwZWNpZmllZCBmb3IgZWFjaCBrZXl3b3JkIGdpdmluZyB0aG9zZSBrZXl3b3JkcyB3aXRoIGEgaGlnaGVyIHdlaWdodCBhIHNsaWdodGx5IGJldHRlciBjaGFuY2UgdG8gc2hvdyB1cC4gUmFuZG9tIHBpY2tzIHdoaWNoIGFmZmlsaWF0ZSBsaW5rcyBzaG93IHVwIGNvbXBsZXRlbHkgYXQgcmFuZG9tLjwvbGFiZWw+PC9wPg0KCQk8cD48bGFiZWw+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJhcF9uZXdfd2luZG93IiB2YWx1ZT0iMSIgPD89KGdldF9vcHRpb24oJ2FwX25ld193aW5kb3cnKT09J1llcyc/ImNoZWNrZWQiOiIiKTs/PiAvPiA8Yj5BbGwgQWZmaWxpYXRlIExpbmtzIFNob3VsZCBPcGVuIEluIE5ldyBXaW5kb3c8L2I+LiA8YnIgLz5FbmFibGUgaWYgeW91IHdhbnQgYWxsIGFmZmlsaWF0ZSBsaW5rcyB0byBvcGVuIHVwIGluIGEgbmV3IHdpbmRvdyB3aGVuIGNsaWNrZWQgKHJlY29tbWVuZGVkKSwgZGlzYWJsZSB0byBvcGVuIHRoZW0gaW4gdGhlIHNhbWUgYnJvd3NlciB3aW5kb3cgdGh1cyB0YWtpbmcgeW91ciB2aXNpdG9ycyBhd2F5IGZyb20geW91ciBibG9nLjwvbGFiZWw+PC9wPg0KDQoJCTxwPjxsYWJlbD48Yj5BZmZpbGlhdGUgTGlua3MgQ1NTIENsYXNzIE5hbWU8L2I+PGJyIC8+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFwX2xpbmtfY2xhc3MiIHZhbHVlPSI8Pz1nZXRfb3B0aW9uKCdhcF9saW5rX2NsYXNzJyk7Pz4iIC8+PGJyIC8+WW91IGNhbiBnaXZlIGFsbCB5b3VyIGFmZmlsaWF0ZSBsaW5rcyBhIGRpZmZlcmVudCBsb29rIHRoYW4gb3RoZXIgcmVndWxhciBsaW5rcyBvbiB5b3VyIGJsb2cuIFlvdSBjYW4gbWFrZSB0aGVtIHJlZCBmb3IgaW5zdGFuY2UgZm9yIGEgc2xpZ2h0bHkgaGlnaGVyIGNoYW5jZSB0byBiZSBjbGlja2VkLiBIZXJlIHlvdSBzcGVjaWZ5IHRoZSBDU1MgY2xhc3MgbmFtZSB0byBiZSB1c2VkIGZvciBhbGwgYWZmaWxpYXRlIGxpbmtzLCB0aGVuIGdvIGFuZCBzZXQgaXQgdXAgaW4geW91ciB0aGVtZSBDU1MgZmlsZSAoUHJlc2VudGF0aW9uIC0+IFRoZW1lIEVkaXRvciB0aGVuIGNsaWNrIG9uIGVkaXQgU3R5bGVzaGVldCkuIExlYXZlIHRoaXMgZW1wdHkgdG8gbWFrZSBhZmZpbGlhdGUgbGlua3MgImJsZW5kIiBpbiB0byB5b3VyIGJsb2cgdGhlbWUgYnkgbG9va2luZyBsaWtlIHJlZ3VsYXIgbGlua3MuPC9sYWJlbD48L3A+DQoJCTxwPjxsYWJlbD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImFwX2xpbmtfdHJhY2tpbmciIHZhbHVlPSIxIiA8Pz0oZ2V0X29wdGlvbignYXBfbGlua190cmFja2luZycpPT0nWWVzJz8iY2hlY2tlZCI6IiIpOz8+IC8+IDxiPkVuYWJsZSBBZmZpbGlhdGUgTGlua3MgQ2xpY2sgVHJhY2tpbmc8L2I+LiA8YnIgLz5Zb3Ugc2hvdWxkIGVuYWJsZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byBhdXRvbWF0aWNhbGx5IHRyYWNrIHRoZSBudW1iZXIgb2YgY2xpY2tzIG1hZGUgYnkgeW91ciB2aXNpdG9ycyB0aHJvdWdoIGFueSBvZiB5b3VyIGFmZmlsaWF0ZSBsaW5rcy48L2xhYmVsPjwvcD4NCgkJPHAgY2xhc3M9InN1Ym1pdCI+DQoJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJhcF9zdWJtaXQiIHZhbHVlPSJVcGRhdGUgT3B0aW9ucyAmcmFxdW87IiAvPg0KCQk8L3A+DQoJPC9mb3JtPg0KCTxwIGFsaWduPSJjZW50ZXIiPldvcmRQcmVzcyBBZmZpbGlhdGUgUHJvIGlzIENvcHlyaWdodCAmY29weTsgMjAwOCBieSA8YSBocmVmPSJodHRwOi8vd3d3LndwYWZmaWxpYXRlcHJvLmNvbSIgdGFyZ2V0PSJfYmxhbmsiPklNIEFsbGlhbmNlPC9hPi4gQWxsIHJpZ2h0cyByZXNlcnZlZC48L3A+DQo8L2Rpdj4NCjw/DQoJCXByaW50X2FmZmlsaWF0ZV9ibHVyYigpOw0KCX0NCn0NCg0KDQovLyBUaGUgZnVuY3Rpb24gdGhhdCByZW5kZXJzIHRoZSBXb3JkUHJlc3MgQWZmaWxpYXRlIFBybyBtYW5hZ2VtZW50IHBhZ2UNCmlmICghZnVuY3Rpb25fZXhpc3RzKCdhcF9tYW5hZ2VfcGFnZScpKSB7DQoJZnVuY3Rpb24gc21hcnRfc2hvcnRfdGV4dCgkdGV4dCwgJGxlbikgew0KCQlpZiAoc3RybGVuKCR0ZXh0KT4kbGVuKSB7DQoJCQkkcmVzdWx0ID0gc3Vic3RyKCR0ZXh0LCAwLCAkbGVuKSAuICcuLi4nOw0KCQl9IGVsc2Ugew0KCQkJJHJlc3VsdCA9ICR0ZXh0Ow0KCQl9DQoJCXJldHVybiAkcmVzdWx0Ow0KCX0NCg0KCWZ1bmN0aW9uIGFwX21hbmFnZV9wYWdlKCkgew0KCQlnbG9iYWwgJHRhYmxlX3ByZWZpeCwgJHdwZGI7DQoNCgkJJHNob3dfa2V5d29yZF9saXN0ID0gVFJVRTsNCgkJJHNob3dfYWRkX2tleXdvcmQgPSBUUlVFOw0KCQkNCgkJJG15X3BsdWdpbl91cmwgPSAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXTsNCgkJLy8gU3RyaXAgcGFyYW1ldGVycyBpbiB0aGUgcGx1Z2luIFVSTA0KCQlpZiAoc3RycG9zKCRteV9wbHVnaW5fdXJsLCAnJicpICE9PSBGQUxTRSkgew0KCQkJJG15X3BsdWdpbl91cmwgPSBzdWJzdHIoJG15X3BsdWdpbl91cmwsIDAsIHN0cnBvcygkbXlfcGx1Z2luX3VybCwgJyYnKSk7CQkJDQoJCX0NCg0KCQkvLyBEbyB3ZSBoYXZlIGEgc29ydCBwcmVmZXJlbmNlIGZvciB0aGUga2V5d29yZCBsaXN0Pw0KCQkkc29ydHNxbCA9ICcnOw0KCQkkc29ydF90eHQgPSAndW5zb3J0ZWQnOw0KCQkkc29ydF91cmwgPSAnJzsNCgkJaWYgKGlzc2V0KCRfR0VUWydzb3J0J10pKSB7DQoJCQlpZiAoJF9HRVRbJ3NvcnQnXSA9PSAnaWQnKSB7DQoJCQkJJHNvcnRzcWwgPSAiIE9SREVSIEJZIGlkIjsNCgkJCQkkc29ydF90eHQgPSAnSUQnOw0KCQkJCSRzb3J0X3VybCA9ICcmYW1wO3NvcnQ9aWQnOw0KCQkJfSBlbHNlaWYgKCRfR0VUWydzb3J0J10gPT0gJ2t3ZCcpIHsNCgkJCQkkc29ydHNxbCA9ICIgT1JERVIgQlkga2V5d29yZCI7DQoJCQkJJHNvcnRfdHh0ID0gJ0tleXdvcmQnOw0KCQkJCSRzb3J0X3VybCA9ICcmYW1wO3NvcnQ9a3dkJzsNCgkJCX0gZWxzZWlmICgkX0dFVFsnc29ydCddID09ICdsbmsnKSB7DQoJCQkJJHNvcnRzcWwgPSAiIE9SREVSIEJZIHVybCI7DQoJCQkJJHNvcnRfdHh0ID0gJ0FmZmlsaWF0ZSBMaW5rJzsNCgkJCQkkc29ydF91cmwgPSAnJmFtcDtzb3J0PWxuayc7DQoJCQl9IGVsc2VpZiAoJF9HRVRbJ3NvcnQnXSA9PSAnY2xrJykgew0KCQkJCSRzb3J0c3FsID0gIiBPUkRFUiBCWSBjbGlja2NvdW50IERFU0MiOw0KCQkJCSRzb3J0X3R4dCA9ICdDbGljayBDb3VudHMnOw0KCQkJCSRzb3J0X3VybCA9ICcmYW1wO3NvcnQ9Y2xrJzsNCgkJCX0NCgkJfQ0KDQoJCS8vIERldGFpbGVkIHJlcG9ydCBmb3Iga2V5d29yZA0KCQlpZiAoaXNzZXQoJF9HRVRbJ29wJ10pICYmICgkX0dFVFsnb3AnXSA9PSAnZHQnKSAmJiBpc3NldCgkX0dFVFsnaWQnXSkpIHsNCgkJCSRrd2RfaWQgPSAkX0dFVFsnaWQnXTsNCgkJCS8vIGZvcmNlIGNvbnZlcnQgdG8gaW50ZWdlciB0cmljaw0KCQkJJGt3ZF9pZCA9IDAgKyAka3dkX2lkOw0KCQkJJHRhYmxlX25hbWUgPSAkdGFibGVfcHJlZml4IC4gQVBfS1dEX1RBQkxFOw0KCQkJJHNxbCA9ICJTRUxFQ1Qga2V5d29yZCBGUk9NICR0YWJsZV9uYW1lIFdIRVJFIGlkPSRrd2RfaWQiOw0KCQkJJGtleXdvcmQgPSAkd3BkYi0+Z2V0X3Zhcigkc3FsKTsNCgkJCSRkdF9zb3J0X3R4dCA9ICd1bnNvcnRlZCc7DQoJCQkkZHRfc29ydF9zcWwgPSAnJzsNCgkJCWlmIChpc3NldCgkX0dFVFsnZHRfc29ydCddKSkgew0KCQkJCWlmICgkX0dFVFsnZHRfc29ydCddID09ICdpZCcpIHsNCgkJCQkJJGR0X3NvcnRfc3FsID0gIiBPUkRFUiBCWSBrZXl3b3JkaWQiOw0KCQkJCQkkZHRfc29ydF90eHQgPSAnSUQnOw0KCQkJCX0gZWxzZWlmICgkX0dFVFsnZHRfc29ydCddID09ICdyZWYnKSB7DQoJCQkJCSRkdF9zb3J0X3NxbCA9ICIgT1JERVIgQlkgcmVmZXJlciI7DQoJCQkJCSRkdF9zb3J0X3R4dCA9ICdSZWZlcmVyIHBhZ2UnOw0KCQkJCX0gZWxzZWlmICgkX0dFVFsnZHRfc29ydCddID09ICdjbGsnKSB7DQoJCQkJCSRkdF9zb3J0X3NxbCA9ICIgT1JERVIgQlkgY2xpY2tjb3VudCBERVNDIjsNCgkJCQkJJGR0X3NvcnRfdHh0ID0gJ0NsaWNrIENvdW50cyc7DQoJCQkJfQ0KCQkJfQ0KCQkJcHJpbnRfY29tcGxlbWVudGFyeV9jb3B5KCk7DQo/Pg0KPGRpdiBjbGFzcz13cmFwPg0KCTxoMj5EZXRhaWxlZCBLZXl3b3JkIFJlcG9ydCBGb3IgJmxhcXVvOzw/PSRrZXl3b3JkOz8+JnJhcXVvOzwvaDI+DQoJPHA+Q2xpY2tpbmcgb24gaHlwZXJsaW5rZWQgY29sdW1uIGhlYWRlcnMgd2lsbCBzb3J0IHRoZSBsaXN0IGJ5IHRoYXQgY29sdW1uLiBDdXJyZW50bHkgdGhlIGxpc3QgaXMgPD89KCRkdF9zb3J0X3R4dD09J3Vuc29ydGVkJyk/JzxzdHJvbmc+dW5zb3J0ZWQ8L3N0cm9uZz4nOiJzb3J0ZWQgYnkgPHN0cm9uZz4kZHRfc29ydF90eHQ8L3N0cm9uZz4iPz4uPC9wPg0KCTx0YWJsZSBpZD0idGhlLWxpc3QteCIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMyI+DQoJCTx0cj48dGggc2NvcGU9ImNvbCI+PGEgaHJlZj0iPD89JG15X3BsdWdpbl91cmw7Pz4mYW1wO2R0X3NvcnQ9aWQmYW1wO2lkPTw/PSRrd2RfaWQ/PiZhbXA7b3A9ZHQ8Pz0kc29ydF91cmw/PiIgdGl0bGU9IkNsaWNrIHRvIHNvcnQgYnkgSUQiPklEPC9hPjwvdGg+PHRoIHNjb3BlPSJjb2wiPjxhIGhyZWY9Ijw/PSRteV9wbHVnaW5fdXJsOz8+JmFtcDtkdF9zb3J0PXJlZiZhbXA7aWQ9PD89JGt3ZF9pZD8+JmFtcDtvcD1kdDw/PSRzb3J0X3VybD8+IiB0aXRsZT0iQ2xpY2sgdG8gc29ydCBieSBSZWZlcmVyIj5SZWZlcmVyIHBhZ2U8L2E+PC90aD48dGggc2NvcGU9ImNvbCI+PGEgaHJlZj0iPD89JG15X3BsdWdpbl91cmw7Pz4mYW1wO2R0X3NvcnQ9Y2xrJmFtcDtpZD08Pz0ka3dkX2lkPz4mYW1wO29wPWR0PD89JHNvcnRfdXJsPz4iIHRpdGxlPSJDbGljayB0byBzb3J0IGJ5IENsaWNrIENvdW50Ij5DbGlja3M8L2E+PC90aD48L3RyPg0KPD8NCgkJCS8vIFJldHJpZXZlIGFuZCBkaXNwbGF5IHRoZSBrZXl3b3JkIGRhdGEgZnJvbSBvdXIgZGF0YWJhc2UNCgkJCSR0YWJsZV9uYW1lID0gJHRhYmxlX3ByZWZpeCAuIEFQX1RSS19UQUJMRTsNCgkJCSRzcWwgPSAiU0VMRUNUICogRlJPTSAkdGFibGVfbmFtZSBXSEVSRSBrZXl3b3JkaWQ9JGt3ZF9pZCRkdF9zb3J0X3NxbCI7DQoJCQkka2V5d29yZHMgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoJHNxbCwgQVJSQVlfQSk7DQoJCQlpZiAoaXNzZXQoJGtleXdvcmRzKSAmJiAoY291bnQoJGtleXdvcmRzKSA+IDApKSB7DQoJCQkJZm9yZWFjaCAoJGtleXdvcmRzIGFzICRrZXk9PiRrZXl3b3JkKSB7DQoJCQkJCWVjaG8gIjx0ciBjbGFzcz0nYWx0ZXJuYXRlJz48dGggc2NvcGU9J3Jvdyc+Ii4ka2V5d29yZFsnaWQnXS4iPC90aD48dGQ+Ii4ka2V5d29yZFsncmVmZXJlciddLiI8L3RkPjx0ZD4iLiRrZXl3b3JkWydjbGlja2NvdW50J10uIjwvdGQ+PC90cj4iOw0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJZWNobyAiPHRyIHN0eWxlPSdiYWNrZ3JvdW5kLWNvbG9yOiAnPjx0ZCBjb2xzcGFuPSczJz5ObyB0cmFja2luZyBkYXRhIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHRoZSBzZWxlY3RlZCBrZXl3b3JkLjwvdGQ+PC90cj4iOw0KCQkJfQ0KPz4NCgk8L3RhYmxlPg0KCTxwPjxhIGhyZWY9Ijw/PSRteV9wbHVnaW5fdXJsLiRzb3J0X3VybDs/PiI+JmxhcXVvOyBSZXR1cm4gdG8ga2V5d29yZCBsaXN0PC9hPjwvcD4NCjwvZGl2Pg0KPD8JDQoJCQkkc2hvd19rZXl3b3JkX2xpc3QgPSBGQUxTRTsNCgkJCSRzaG93X2FkZF9rZXl3b3JkID0gRkFMU0U7DQoJCX0gLy8gZGV0YWlsZWQgcmVwb3J0IGZvciBrZXl3b3JkIGVuZHMgaGVyZQ0KDQoJCS8vIFJlc2V0IGNsaWNrIGNvdW50cw0KCQlpZiAoaXNzZXQoJF9QT1NUWydyZXNldCddKSkgew0KCQkJJHRhYmxlX25hbWUgPSAkdGFibGVfcHJlZml4IC4gQVBfS1dEX1RBQkxFOw0KCQkJJHNxbCA9ICJVUERBVEUgJHRhYmxlX25hbWUgU0VUIGNsaWNrY291bnQ9MCI7DQoJCQlpZiAoJHdwZGItPnF1ZXJ5KCRzcWwpID09PSBGQUxTRSkgeyA/Pg0KCTxkaXYgY2xhc3M9ImVycm9yIj48cD48c3Ryb25nPlRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSByZXNldGluZyBjbGljayBjb3VudHMuPC9zdHJvbmc+PC9wPjwvZGl2Pg0KPD8JCX0gZWxzZSB7ID8+DQoJPGRpdiBpZD0ibWVzc2FnZSIgY2xhc3M9InVwZGF0ZWQgZmFkZSI+PHA+PHN0cm9uZz5Zb3UgaGF2ZSBzdWNjZXNzZnVsbHkgcmVzZXQgYWxsIGNsaWNrIGNvdW50cyB0byAwLjwvc3Ryb25nPjwvcD48L2Rpdj4JDQo8PwkJDQoJCQkJJHRhYmxlX25hbWUgPSAkdGFibGVfcHJlZml4IC4gQVBfVFJLX1RBQkxFOw0KCQkJCSRzcWwgPSAiVVBEQVRFICR0YWJsZV9uYW1lIFNFVCBjbGlja2NvdW50PTAiOw0KCQkJCSR3cGRiLT5xdWVyeSgkc3FsKTsNCgkJCX0NCgkJfSAvLyBjbGljayBjb3VudCByZXNldCBlbmRzIGhlcmUNCg0KCQkvLyBBZGQgbmV3L0VkaXQgZXhpc3Rpbmcga2V5d29yZCBpbnRvIHRoZSBkYXRhYmFzZQ0KCQlpZiAoaXNzZXQoJF9QT1NUWydhY3Rpb24nXSkpIHsNCgkJCWlmICgkX1BPU1RbJ2FjdGlvbiddID09ICdhZGRrZXl3b3JkJykgew0KCQkJCSRlZGl0X2t3ZCA9IEZBTFNFOw0KCQkJfSBlbHNlIHsNCgkJCQkkZWRpdF9rd2QgPSBUUlVFOw0KCQkJfQ0KCQkJJGVycl9tc2cgPSAnJzsNCgkJCSRrd2QgPSAnJzsNCgkJCSR1cmwgPSAnJzsNCgkJCSRjYXB0aW9uID0gJyc7DQoJCQkkcmVwbF9jb3VudCA9IDA7DQoNCgkJCWlmIChpc3NldCgkX1BPU1RbJ3VybCddKSAmJiAodHJpbSgkX1BPU1RbJ3VybCddKSAhPSAnJykpIHsNCgkJCQkkdXJsID0gdHJpbSgkX1BPU1RbJ3VybCddKTsNCgkJCX0gZWxzZSB7DQoJCQkJJGVycl9tc2cgPSAiVGhlIGFmZmlsaWF0ZSBsaW5rIHdhcyBlbXB0eS4gWW91IG11c3QgdHlwZSBpbiB0aGUgYWZmaWxpYXRlIGxpbmsuIjsNCgkJCX0NCgkJCWlmIChpc3NldCgkX1BPU1RbJ2tleXdvcmQnXSkgJiYgKHRyaW0oJF9QT1NUWydrZXl3b3JkJ10pICE9ICcnKSkgew0KCQkJCSRrd2QgPSB0cmltKCRfUE9TVFsna2V5d29yZCddKTsNCgkJCX0gZWxzZSB7DQoJCQkJJGVycl9tc2cgPSAnVGhlIGtleXdvcmQgd2FzIGVtcHR5LiBZb3UgbmVlZCB0byB0eXBlIGluIHRoZSBrZXl3b3JkIHRoYXQgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgYWZmaWxpYXRlIGxpbmsuJzsNCgkJCX0NCgkJCWlmIChpc3NldCgkX1BPU1RbJ2NhcHRpb24nXSkpIHsNCgkJCQkkY2FwdGlvbiA9IHRyaW0oJF9QT1NUWydjYXB0aW9uJ10pOw0KCQkJfQ0KCQkJaWYgKGlzc2V0KCRfUE9TVFsncmVwbF9jb3VudCddKSkgew0KCQkJCSRyZXBsX2NvdW50ID0gMCArICRfUE9TVFsncmVwbF9jb3VudCddOw0KCQkJfQ0KCQkJaWYgKCBpc3NldCgkX1BPU1RbJ25vdHJhY2snXSkgKSB7DQoJCQkJJG5vdHJhY2s9IHRyaW0oJF9QT1NUWydub3RyYWNrJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJG5vdHJhY2s9PSAnb24nKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRub3RyYWNrPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbm90cmFjaz0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KCQkJfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG5vdHJhY2s9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCgkJCWlmIChpc3NldCgkX1BPU1RbJ25vZm9sbG93J10pKSB7DQoJCQkJJG5vZm9sbG93PSB0cmltKCRfUE9TVFsnbm9mb2xsb3cnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkbm9mb2xsb3cgPT0gJ29uJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbm9mb2xsb3c9IDE7IH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRub2ZvbGxvdz0gMDsgfQ0KCQkJfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRub2ZvbGxvdz0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KCQkJaWYgKGlzc2V0KCRfUE9TVFsnd2VpZ2h0J10pKSB7DQoJCQkJJHdlaWdodCA9IDAgKyAkX1BPU1RbJ3dlaWdodCddOw0KCQkJCWlmICgkd2VpZ2h0ID4gOSkgew0KCQkJCQkkd2VpZ2h0ID0gOTsNCgkJCQl9IGVsc2VpZiAoJHdlaWdodCA8IDApIHsNCgkJCQkJJHdlaWdodCA9IDA7DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQkkd2VpZ2h0ID0gNTsNCgkJCX0NCg0KCQkJaWYgKCRlZGl0X2t3ZCkgew0KCQkJCWlmIChpc3NldCgkX1BPU1RbJ2lkJ10pKSB7DQoJCQkJCSRrd2RfaWQgPSAkX1BPU1RbJ2lkJ107DQoJCQkJCSRrd2RfaWQgPSAwICsgJGt3ZF9pZDsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkZXJyX21zZyA9ICdUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgcmV0cmlldmluZyB0aGUga2V5d29yZCBpZC4gVGhpcyBzaG91bGQgbm90IGhhcHBlbiB1bmRlciByZWd1bGFyIHVzYWdlLiBBcmUgeW91IG1lc3Npbmcgd2l0aCB0aGUgZGF0YT8nOw0KCQkJCX0NCgkJCX0NCg0KCQkJJHRhYmxlX25hbWUgPSAkdGFibGVfcHJlZml4IC4gQVBfS1dEX1RBQkxFOw0KCQkJaWYgKCRlZGl0X2t3ZCA9PSBGQUxTRSkgew0KCQkJCS8vIEZpcnN0IG1ha2Ugc3VyZSBvdXIga2V5d29yZCBpcyB1bmlxdWUgaW4gdGhlIGRhdGFiYXNlDQoJCQkJJHNxbCA9ICJTRUxFQ1QgQ09VTlQoKikgRlJPTSAkdGFibGVfbmFtZSBXSEVSRSBVUFBFUihrZXl3b3JkKT1VUFBFUignJGt3ZCcpIjsNCgkJCQlpZiAoJHdwZGItPmdldF92YXIoJHNxbCkgIT0gMCkgew0KCQkJCQkkZXJyX21zZyA9ICdUaGlzIGtleXdvcmQgaXMgYWxyZWFkeSBkZWZpbmVkIGFuZCBwb2ludHMgdG8gYSBkaWZmZXJlbnQgYWZmaWxpYXRlIGxpbmsuJzsNCgkJCQl9DQoJCQl9DQoNCgkJCWlmICgkZXJyX21zZyAhPSAnJykgez8+DQoJPGRpdiBjbGFzcz0iZXJyb3IiPjxwPjxzdHJvbmc+PD89JGVycl9tc2c7Pz48L3N0cm9uZz48L3A+PC9kaXY+DQo8PwkJfSBlbHNlIHsNCgkJCQkvLyBBbGwgc2VlbXMgb2suIENvbXB1dGUgdGhlIG51bWJlciBvZiBpbmRpdmlkdWFsIHdvcmRzIGluIHRoZSBrZXl3b3JkIGFuZCBkbyBzb21lIHNhbml0eSBjaGVja3MuDQoJCQkJJHdvcmRfY250ID0gc3Vic3RyX2NvdW50KCRrd2QsICcgJykgKyAxOw0KCQkJCWlmICgkZWRpdF9rd2QpIHsNCgkJCQkJJHNxbCA9ICJVUERBVEUgJHRhYmxlX25hbWUgU0VUIGtleXdvcmQ9JyRrd2QnLCB3b3JkY291bnQ9JHdvcmRfY250LCBjYXB0aW9uPSckY2FwdGlvbicsIHVybD0nJHVybCcsIHJlcGxhY2Vjb3VudD0kcmVwbF9jb3VudCwgd2VpZ2h0PSR3ZWlnaHQsIG5vdHJhY2s9JG5vdHJhY2ssIG5vZm9sbG93PSRub2ZvbGxvdyAgV0hFUkUgaWQ9JGt3ZF9pZCI7DQoJCQkJfSBlbHNlIHsNCgkJCQkJJHNxbCA9ICJJTlNFUlQgSU5UTyAkdGFibGVfbmFtZSAoaWQsIGtleXdvcmQsIHdvcmRjb3VudCwgY2FwdGlvbiwgdXJsLCBjbGlja2NvdW50LCByZXBsYWNlY291bnQsIHdlaWdodCwgbm90cmFjayxub2ZvbGxvdykgVkFMVUVTIChOVUxMLCAnJGt3ZCcsICR3b3JkX2NudCwgJyRjYXB0aW9uJywgJyR1cmwnLCAwLCAkcmVwbF9jb3VudCwgJHdlaWdodCwgJG5vdHJhY2ssICRub2ZvbGxvdykiOw0KCQkJCX0NCg0KCQkJCWlmICgkd3BkYi0+cXVlcnkoJHNxbCkgPT09IEZBTFNFKSB7ID8+DQoJPGRpdiBjbGFzcz0iZXJyb3IiPjxwPjxzdHJvbmc+VGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHNhdmluZyB0byB0aGUgZGF0YWJhc2UuIFlvdXIga2V5d29yZCB3YXMgTk9UIHNhdmVkLjwvc3Ryb25nPjwvcD48L2Rpdj4NCjw/CQkJfSBlbHNlIHsgPz4NCgk8ZGl2IGlkPSJtZXNzYWdlIiBjbGFzcz0idXBkYXRlZCBmYWRlIj48cD48c3Ryb25nPlRoZSBrZXl3b3JkIHdhcyBzdWNjZXNzZnVsbHkgc2F2ZWQgYW5kIGl0IHdpbGwgYmUgcmVwbGFjZWQgYXV0b21hdGljYWxseSBieSB0aGUgYWZmaWxpYXRlIGxpbmsgeW91IGhhdmUgZGVmaW5lZC48L3N0cm9uZz48L3A+PC9kaXY+CQ0KPD8JCQl9DQoJCQl9DQoJCX0gLy8gS2V5d29yZCBhZGRpdGlvbiBlbmRzIGhlcmUNCg0KCQkvLyBFZGl0IGV4aXN0aW5nIGtleXdvcmQNCgkJaWYgKGlzc2V0KCRfR0VUWydvcCddKSAmJiAoJF9HRVRbJ29wJ10gPT0gJ2VkJykgJiYgKGlzc2V0KCRfR0VUWydpZCddKSkpIHsNCgkJCSRrd2RfaWQgPSAkX0dFVFsnaWQnXTsNCgkJCS8vIGZvcmNlIGNvbnZlcnQgdG8gaW50ZWdlciB0cmljaw0KCQkJJGt3ZF9pZCA9IDAgKyAka3dkX2lkOw0KCQkJJHRhYmxlX25hbWUgPSAkdGFibGVfcHJlZml4IC4gQVBfS1dEX1RBQkxFOw0KCQkJJHNxbCA9ICJTRUxFQ1QgKiBGUk9NICR0YWJsZV9uYW1lIFdIRVJFIGlkPSRrd2RfaWQiOw0KCQkJJGtleXdvcmQgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoJHNxbCwgQVJSQVlfQSk7DQoJCQlpZiAoaXNfYXJyYXkoJGtleXdvcmQpKSB7DQoJCQkJJGt3ZCA9ICRrZXl3b3JkWzBdWydrZXl3b3JkJ107DQoJCQkJJGNhcHRpb24gPSAka2V5d29yZFswXVsnY2FwdGlvbiddOw0KCQkJCSR1cmwgPSAka2V5d29yZFswXVsndXJsJ107DQoJCQkJJHJlcGxfY291bnQgPSAka2V5d29yZFswXVsncmVwbGFjZWNvdW50J107DQoJCQkJJHdlaWdodCA9ICRrZXl3b3JkWzBdWyd3ZWlnaHQnXTsNCgkJCQkkbm9mb2xsb3cgPSAka2V5d29yZFswXVsnbm9mb2xsb3cnXTsNCgkJCQkkbm90cmFjayA9ICRrZXl3b3JkWzBdWydub3RyYWNrJ107DQoJCQkJcHJpbnRfY29tcGxlbWVudGFyeV9jb3B5KCk7DQo/Pg0KPGRpdiBjbGFzcz13cmFwPg0KCTxoMj5FZGl0IEtleXdvcmQ8L2gyPg0KCTxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSI8Pz0kbXlfcGx1Z2luX3VybC4kc29ydF91cmw7Pz4iPg0KCTxwPjxzdHJvbmc+S2V5d29yZDwvc3Ryb25nPiB0aGF0IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGFmZmlsaWF0ZSBsaW5rOjxiciAvPg0KCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJrZXl3b3JkIiB2YWx1ZT0iPD89JGt3ZD8+IiBzdHlsZT0id2lkdGg6IDQwJTsiIC8+PC9wPg0KCTxwPjxzdHJvbmc+QWZmaWxpYXRlIExpbms8L3N0cm9uZz4gKGVudGVyIHRoZSBjb21wbGV0ZSBhZmZpbGlhdGUgbGluayBoZXJlLCBpbmNsdWRpbmcgdGhlIGh0dHA6Ly8gcGFydCk6PGJyIC8+DQoJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InVybCIgdmFsdWU9Ijw/PSR1cmw/PiIgc3R5bGU9IndpZHRoOiA4MCU7IiAvPjwvcD4NCgk8cD48c3Ryb25nPlN0YXR1c2JhciBUZXh0PC9zdHJvbmc+IChsZWF2ZSBlbXB0eSB0byBzaG93IHRoZSBjbGljayB0cmFja2VyIFVSTCwgeW91ciBhZmZpbGlhdGUgbGluayBpcyBhbHdheXMgaGlkZGVuKTo8YnIgLz4NCgk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iY2FwdGlvbiIgdmFsdWU9Ijw/PSRjYXB0aW9uPz4iIHN0eWxlPSJ3aWR0aDogNDAlOyIgLz48L3A+DQoJPHA+PHN0cm9uZz5NYXhpbXVtIFJlcGxhY2VtZW50IENvdW50PC9zdHJvbmc+IChob3cgbWFueSBvY2N1cmVuY2VzIG9mIHRoaXMga2V5d29yZCB3aWxsIGJlIHJlcGxhY2VkIG9uIGEgcGFnZSwgMCBtZWFucyByZXBsYWNlIGFsbC4gSWYgbm90IDAsIHRoaXMgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGdsb2JhbCBzZXR0aW5nKTo8YnIgLz4NCgkgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJyZXBsX2NvdW50MiIgdmFsdWU9Ijw/PSRyZXBsX2NvdW50Pz4iIHN0eWxlPSJ3aWR0aDogNDAlOyIgLz4NCgk8L3A+DQoJPHA+PHN0cm9uZz5LZXl3b3JkIFdlaWdodDwvc3Ryb25nPiBmb3IgdGhlIHdlaWdodGVkIHJhbmRvbSBsaW5rIHNlbGVjdGlvbi4gVGhpcyBzaG91bGQgYmUgYmV0d2VlbiAwIGFuZCA5IChsZWF2ZSB1bmNoYW5nZWQgaWYgeW91IGRvbid0IGtub3cgd2hhdCB0aGlzIG1lYW5zKTo8YnIgLz4NCgk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0id2VpZ2h0IiB2YWx1ZT0iPD89JHdlaWdodD8+IiBzdHlsZT0id2lkdGg6IDQwJTsiIC8+PC9wPg0KCTxwPkNoZWNrIHRoaXMgYm94IGlzIHRvIGFkZA0KICAgICAgPHN0cm9uZz5yZWw9bm9mb2xsb3c8L3N0cm9uZz4gaW50byAgdGhlIGh5cGVybGluayBpdCBjcmVhdGVzIG9uIGEgcGFnZS48YnIgLz4NCg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJub2ZvbGxvdyIgIDw/IGlmICgkbm9mb2xsb3cgPT0gMSl7DQogICAgICBlY2hvICdjaGVja2VkJzsNCiB9Pz4gIC8+DQo8L3A+DQo8cD5DaGVjayB0aGlzIGJveCBpcyB0byBkaXNhYmxlIGludGVybmFsIHRyYWNraW5nIHN5c3RlbSBmb3IgdGhpcyBrZXl3b3JkLjxiciAvPg0KCSAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJub3RyYWNrIiAgPD8gaWYgKCRub3RyYWNrPT0gMSl7DQogICAgICBlY2hvICdjaGVja2VkJzt9Pz4gICAvPg0KCTwvcD4NCgk8cCBjbGFzcz0ic3VibWl0Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJlZGl0a2V5d29yZCIgLz48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJpZCIgdmFsdWU9Ijw/PSRrd2RfaWQ/PiIgLz48aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJTYXZlIENoYW5nZXMgJnJhcXVvOyIgLz48L3A+DQo8L2Zvcm0+DQo8cD48YSBocmVmPSI8Pz0kbXlfcGx1Z2luX3VybC4kc29ydF91cmw7Pz4iPiZsYXF1bzsgUmV0dXJuIHRvIGtleXdvcmQgbGlzdDwvYT48L3A+DQo8L2Rpdj4NCjw/DQoJCQkJJHNob3dfa2V5d29yZF9saXN0ID0gRkFMU0U7DQoJCQkJJHNob3dfYWRkX2tleXdvcmQgPSBGQUxTRTsNCgkJCX0NCgkJfSAvLyBLZXl3b3JkIGVkaXRpbmcgZW5kcyBoZXJlDQoNCgkJLy8gRGVsZXRpbmcgZXhpc3Rpbmcga2V5d29yZA0KCQlpZiAoaXNzZXQoJF9HRVRbJ29wJ10pICYmICgkX0dFVFsnb3AnXSA9PSAnZGVsJykgJiYgKGlzc2V0KCRfR0VUWydpZCddKSkpIHsNCgkJCSRrd2RfaWQgPSAkX0dFVFsnaWQnXTsNCgkJCS8vIGZvcmNlIGNvbnZlcnQgdG8gaW50ZWdlciB0cmljaw0KCQkJJGt3ZF9pZCA9IDAgKyAka3dkX2lkOw0KCQkJJHRhYmxlX25hbWUgPSAkdGFibGVfcHJlZml4IC4gQVBfS1dEX1RBQkxFOw0KCQkJJHNxbCA9ICJERUxFVEUgRlJPTSAkdGFibGVfbmFtZSBXSEVSRSBpZD0ka3dkX2lkIjsNCgkJCWlmICgkd3BkYi0+cXVlcnkoJHNxbCkgPT09IEZBTFNFKSB7ID8+DQoJPGRpdiBjbGFzcz0iZXJyb3IiPjxwPjxzdHJvbmc+VGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGRlbGV0aW5nIGZyb20gdGhlIGRhdGFiYXNlLiBZb3VyIGtleXdvcmQgd2FzIE5PVCBkZWxldGVkLjwvc3Ryb25nPjwvcD48L2Rpdj4NCjw/CQl9IGVsc2UgeyA/Pg0KCTxkaXYgaWQ9Im1lc3NhZ2UiIGNsYXNzPSJ1cGRhdGVkIGZhZGUiPjxwPjxzdHJvbmc+VGhlIGtleXdvcmQgd2FzIHN1Y2Nlc3NmdWxseSBkZWxldGVkIGZyb20gdGhlIGRhdGFiYXNlLjwvc3Ryb25nPjwvcD48L2Rpdj4JDQo8PwkJDQoJCQkJLy8gRGVsZXRlIGFueSBhc3NvY2lhdGVkIGNsaWNrLXRocm91Z2ggZGF0YQ0KCQkJCSR0YWJsZV9uYW1lID0gJHRhYmxlX3ByZWZpeCAuIEFQX1RSS19UQUJMRTsNCgkJCQkkc3FsID0gIkRFTEVURSBGUk9NICR0YWJsZV9uYW1lIFdIRVJFIGtleXdvcmRpZD0ka3dkX2lkIjsNCgkJCQkkd3BkYi0+cXVlcnkoJHNxbCk7DQoJCQl9DQoJCX0gLy8gS2V5d29yZCBkZWxldGlvbiBlbmRzIGhlcmUNCg0KCQkvLyBTaG93IGtleXdvcmQgY2xpY2sgY291bnQgZGV0YWlscw0KCQlpZiAoaXNzZXQoJF9HRVRbJ29wJ10pICYmICgkX0dFVFsnb3AnXSA9PSAnZHQnKSAmJiAoaXNzZXQoJF9HRVRbJ2lkJ10pKSkgew0KCQkJJGt3ZF9pZCA9ICRfR0VUWydpZCddOw0KCQkJLy8gZm9yY2UgY29udmVydCB0byBpbnRlZ2VyIHRyaWNrDQoJCQkka3dkX2lkID0gMCArICRrd2RfaWQ7DQoJCQkkdGFibGVfbmFtZSA9ICR0YWJsZV9wcmVmaXggLiBBUF9UUktfVEFCTEU7DQoJCX0gLy8gY2xpY2sgY291bnQgZGV0YWlscyBlbmRzIGhlcmUNCg0KCQlpZiAoJHNob3dfa2V5d29yZF9saXN0KSB7DQoJCQlwcmludF9jb21wbGVtZW50YXJ5X2NvcHkoKTsNCgkJPz4NCjxkaXYgY2xhc3M9d3JhcD4NCgk8aDI+TWFuYWdlIFdvcmRQcmVzcyBBZmZpbGlhdGUgUHJvIExpbmtzICg8YSBocmVmPSIjYWRka3dkIj5hZGQgbmV3PC9hPik8L2gyPg0KPD8gaWYgKGdldF9vcHRpb24oJ2FwX2VuYWJsZScpPT0nTm8nKSB7ID8+DQo8cCBhbGlnbj0iY2VudGVyIj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+V29yZFByZXNzIEFmZmlsaWF0ZSBQcm8gaXMgY3VycmVudGx5IERJU0FCTEVELiBUbyBlbmFibGUgZ28gdG8gT3B0aW9ucywgV29yZFByZXNzIEFmZmlsaWF0ZSBQcm8uPC9iPjwvZm9udD48L3A+DQo8Pwl9ID8+DQo8PyBpZiAoZ2V0X29wdGlvbignYXBfbGlua190cmFja2luZycpPT0nTm8nKSB7ID8+DQo8cCBhbGlnbj0iY2VudGVyIj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+TGluayBjbGljayB0cmFja2luZyBpcyBjdXJyZW50bHkgRElTQUJMRUQuIFRvIGVuYWJsZSBnbyB0byBPcHRpb25zLCBXb3JkUHJlc3MgQWZmaWxpYXRlIFByby48L2I+PC9mb250PjwvcD4NCjw/CX0gPz4NCgk8cD5UaGFuayB5b3UgZm9yIHB1cmNoYXNpbmcgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JkcHJlc3NhZmZpbGlhdGVwcm8uY29tIiB0YXJnZXQ9Il9ibGFuayI+V29yZFByZXNzIEFmZmlsaWF0ZSBQcm88L2E+LjwvcD4NCgk8cD5UaGlzIGlzIHRoZSBwbGFjZSB3aGVyZSB5b3UgY29uZmlndXJlIHlvdXIga2V5d29yZHMgYW5kIGFmZmlsaWF0ZSBsaW5rcy4gRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcGxlYXNlIGNvbnN1bHQgdGhlIHR1dG9yaWFscyB0aGF0IGNhbWUgd2l0aCB5b3VyIHB1cmNoYXNlIG9yIG9wZW4gYSBzdXBwb3J0IHRpY2tldCBpZiB5b3UgbmVlZCBhbnkgaGVscC48L3A+DQoJPHA+Q2xpY2tpbmcgb24gaHlwZXJsaW5rZWQgY29sdW1uIGhlYWRlcnMgd2lsbCBzb3J0IHRoZSBsaXN0IGJ5IHRoYXQgY29sdW1uLiBDdXJyZW50bHkgdGhlIGxpc3QgaXMgPD89KCRzb3J0X3R4dD09J3Vuc29ydGVkJyk/JzxzdHJvbmc+dW5zb3J0ZWQ8L3N0cm9uZz4nOiJzb3J0ZWQgYnkgPHN0cm9uZz4kc29ydF90eHQ8L3N0cm9uZz4iPz4uPC9wPg0KCQ0KPD8JDQoJLy8gVW1lc2ggdXBkYXRlIGFzIHN0YXJ0DQoNCgkkYW1zZyA9IGdldF9vcHRpb24oJ2FwX3ZlcnNpb25fbXNnJyk7DQoJaWYgKCRhbXNnICE9ICIiKSB7IA0KIAkJJHVybCA9IGdldF9vcHRpb24oJ3NpdGV1cmwnKSAuICcvd3AtYWRtaW4vb3B0aW9ucy1nZW5lcmFsLnBocD9wYWdlPXdwLWFmZmlsaWF0ZS1wcm9fZGVjLnBocCc7CQ0KCT8+DQoJPGRpdiBpZD0ibWVzc2FnZSIgY2xhc3M9InVwZGF0ZWQgZmFkZSI+PHA+PHN0cm9uZz48YSBocmVmPSI8Pz0kdXJsOz8+Ij48Pz0kYW1zZzs/PjwvYT48L3N0cm9uZz48L3A+PC9kaXY+DQoJDQo8PyAJCQ0KIAkJCSB1cGRhdGVfb3B0aW9uKCdhcF92ZXJzaW9uX21zZycsICcnKTsNCgkJCS8vIFVtZXNoIHVwZGF0ZSBhcyBjb21wbGV0ZQ0KICB9ID8+DQoJPHRhYmxlIGlkPSJ0aGUtbGlzdC14IiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIzIj4NCgkJPHRyPjx0aCBzY29wZT0iY29sIj48YSBocmVmPSI8Pz0kbXlfcGx1Z2luX3VybDs/PiZhbXA7c29ydD1pZCIgdGl0bGU9IkNsaWNrIHRvIHNvcnQgYnkgSUQiPklEPC9hPjwvdGg+PHRoIHNjb3BlPSJjb2wiPjxhIGhyZWY9Ijw/PSRteV9wbHVnaW5fdXJsOz8+JmFtcDtzb3J0PWt3ZCIgdGl0bGU9IkNsaWNrIHRvIHNvcnQgYnkgS2V5d29yZCI+S2V5d29yZDwvYT48L3RoPjx0aCBzY29wZT0iY29sIj5XZWlnaHQ8L3RoPjx0aCBzY29wZT0iY29sIj5SZXBsYWNlIENvdW50PC90aD48dGggc2NvcGU9ImNvbCI+PGEgaHJlZj0iPD89JG15X3BsdWdpbl91cmw7Pz4mYW1wO3NvcnQ9bG5rIiB0aXRsZT0iQ2xpY2sgdG8gc29ydCBieSBBZmZpbGlhdGUgTGluayI+QWZmaWxpYXRlIExpbms8L2E+PC90aD48dGggc2NvcGU9ImNvbCI+U3RhdHVzYmFyIFRleHQ8L3RoPjx0aCBzY29wZT0iY29sIj48YSBocmVmPSI8Pz0kbXlfcGx1Z2luX3VybDs/PiZhbXA7c29ydD1jbGsiIHRpdGxlPSJDbGljayB0byBzb3J0IGJ5IENsaWNrIENvdW50Ij5DbGlja3M8L2E+PC90aD48dGggY29sc3Bhbj0iMiI+QWN0aW9uPC90aD48L3RyPg0KPD8NCgkvLyBSZXRyaWV2ZSBhbmQgZGlzcGxheSB0aGUga2V5d29yZHMgZnJvbSBvdXIgZGF0YWJhc2UNCgkkdGFibGVfbmFtZSA9ICR0YWJsZV9wcmVmaXggLiBBUF9LV0RfVEFCTEU7DQoJJHNxbCA9ICJTRUxFQ1QgKiBGUk9NICR0YWJsZV9uYW1lJHNvcnRzcWwiOw0KCSRrZXl3b3JkcyA9ICR3cGRiLT5nZXRfcmVzdWx0cygkc3FsLCBBUlJBWV9BKTsNCglpZiAoaXNzZXQoJGtleXdvcmRzKSAmJiAoY291bnQoJGtleXdvcmRzKSA+IDApKSB7DQoJCWZvcmVhY2ggKCRrZXl3b3JkcyBhcyAka2V5PT4ka2V5d29yZCkgew0KCQkJZWNobyAiPHRyIGNsYXNzPSdhbHRlcm5hdGUnPjx0aCBzY29wZT0ncm93Jz4iLiRrZXl3b3JkWydpZCddLiI8L3RoPjx0ZD4iLiRrZXl3b3JkWydrZXl3b3JkJ10uIjwvdGQ+PHRkIGFsaWduPSdjZW50ZXInPiIuJGtleXdvcmRbJ3dlaWdodCddLiI8L3RkPjx0ZCBhbGlnbj0nY2VudGVyJz4iLigka2V5d29yZFsncmVwbGFjZWNvdW50J109PTA/J0FMTCc6JGtleXdvcmRbJ3JlcGxhY2Vjb3VudCddKS4iPC90ZD48dGQ+Ii5zbWFydF9zaG9ydF90ZXh0KCRrZXl3b3JkWyd1cmwnXSwgNDApLiI8L3RkPjx0ZD4iLiRrZXl3b3JkWydjYXB0aW9uJ10uIjwvdGQ+PHRkIGFsaWduPSdjZW50ZXInPiIuJGtleXdvcmRbJ2NsaWNrY291bnQnXS4iICg8YSBocmVmPSckbXlfcGx1Z2luX3VybCZhbXA7aWQ9Ii4ka2V5d29yZFsnaWQnXS4iJmFtcDtvcD1kdCRzb3J0X3VybCcgdGl0bGU9J0NsaWNrIHRvIHNob3cgYSBkZXRhaWxlZCBjbGljayB0aHJvdWdoIHJlcG9ydCBmb3IgdGhpcyBrZXl3b3JkJz5kZXRhaWxzPC9hPik8L3RkPjx0ZD48YSBocmVmPSckbXlfcGx1Z2luX3VybCZhbXA7aWQ9Ii4ka2V5d29yZFsnaWQnXS4iJmFtcDtvcD1lZCRzb3J0X3VybCc+RWRpdDwvYT48L3RkPjx0ZD48YSBocmVmPSckbXlfcGx1Z2luX3VybCZhbXA7aWQ9Ii4ka2V5d29yZFsnaWQnXS4iJmFtcDtvcD1kZWwkc29ydF91cmwnPkRlbGV0ZTwvYT48L3RkPjwvdHI+IjsNCgkJfQ0KDQoNCgl9IGVsc2Ugew0KCQllY2hvICI8dHIgc3R5bGU9J2JhY2tncm91bmQtY29sb3I6ICc+PHRkIGNvbHNwYW49JzcnPk5vIGFmZmlsaWF0ZSBsaW5rcyBhcmUgZGVmaW5lZC4gVG8gYWRkIG9uZSBvciBtb3JlIGFmZmlsaWF0ZSBsaW5rcyBhbmQgdGhlaXIgYXNzb2NpYXRlZCBrZXl3b3JkcyBwbGVhc2UgdXNlIHRoZSBmb3JtIGJlbG93LjwvdGQ+PC90cj4iOw0KCX0NCj8+DQoJPC90YWJsZT4NCg0KCTxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSI8Pz0kbXlfcGx1Z2luX3VybC4kc29ydF91cmw7Pz4iPg0KCTxwIGNsYXNzPSJzdWJtaXQiPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InJlc2V0IiB2YWx1ZT0icmVzZXRjb3VudHMiIC8+PGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iUmVzZXQgQ2xpY2sgQ291bnRzICZyYXF1bzsiIC8+PC9wPg0KCTwvZm9ybT4NCg0KCTxwIGFsaWduPSJjZW50ZXIiPldvcmRQcmVzcyBBZmZpbGlhdGUgUHJvIGlzIENvcHlyaWdodCAmY29weTsgMjAwOCBieSA8YSBocmVmPSJodHRwOi8vd3d3LndwYWZmaWxpYXRlcHJvLmNvbS8iIHRhcmdldD0iX2JsYW5rIj5JTSBBbGxpYW5jZTwvYT4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9wPg0KPC9kaXY+DQo8PwkJCQ0KCQl9CS8vIGlmIHNob3cga2V5d29yZCBsaXN0DQoJCWlmICgkc2hvd19hZGRfa2V5d29yZCkgew0KPz4NCjxkaXYgY2xhc3M9d3JhcD4NCgk8aDI+QWRkIE5ldyBLZXl3b3JkPC9oMj4NCgk8Zm9ybSBtZXRob2Q9InBvc3QiIGlkPSJhZGRrd2QiIG5hbWU9ImFkZGt3ZCIgYWN0aW9uPSI8Pz0kbXlfcGx1Z2luX3VybC4kc29ydF91cmw7Pz4iPg0KCTxwPjxzdHJvbmc+S2V5d29yZDwvc3Ryb25nPiB0aGF0IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGFmZmlsaWF0ZSBsaW5rOjxiciAvPg0KCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJrZXl3b3JkIiB2YWx1ZT0iPD89KGlzc2V0KCRrd2QpJiYoJGVycl9tc2chPScnKSk/JGt3ZDonJz8+IiBzdHlsZT0id2lkdGg6IDQwJTsiIC8+PC9wPg0KCTxwPjxzdHJvbmc+QWZmaWxpYXRlIExpbms8L3N0cm9uZz4gKGVudGVyIHRoZSBjb21wbGV0ZSBhZmZpbGlhdGUgbGluayBoZXJlLCBpbmNsdWRpbmcgdGhlIGh0dHA6Ly8gcGFydCk6PGJyIC8+DQoJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InVybCIgdmFsdWU9Ijw/PShpc3NldCgkdXJsKSYmKCRlcnJfbXNnIT0nJykpPyR1cmw6Jyc/PiIgc3R5bGU9IndpZHRoOiA4MCU7IiAvPjwvcD4NCgk8cD48c3Ryb25nPlN0YXR1c2JhciBUZXh0PC9zdHJvbmc+IChsZWF2ZSBlbXB0eSB0byBzaG93IHRoZSBjbGljayB0cmFja2VyIFVSTCwgeW91ciBhZmZpbGlhdGUgbGluayBpcyBhbHdheXMgaGlkZGVuKTo8YnIgLz4NCgk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iY2FwdGlvbiIgdmFsdWU9Ijw/PShpc3NldCgkY2FwdGlvbikmJigkZXJyX21zZyE9JycpKT8kY2FwdGlvbjonJz8+IiBzdHlsZT0id2lkdGg6IDQwJTsiIC8+PC9wPg0KCTxwPjxzdHJvbmc+TWF4aW11bSBSZXBsYWNlbWVudCBDb3VudDwvc3Ryb25nPiAoaG93IG1hbnkgb2NjdXJlbmNlcyBvZiB0aGlzIGtleXdvcmQgd2lsbCBiZSByZXBsYWNlZCBvbiBhIHBhZ2UsIDAgbWVhbnMgcmVwbGFjZSBhbGwuIElmIG5vdCAwLCB0aGlzIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBnbG9iYWwgc2V0dGluZyk6PGJyIC8+DQoJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InJlcGxfY291bnQiIHZhbHVlPSI8Pz0oaXNzZXQoJHJlcGxfY291bnQpJiYoJGVycl9tc2chPScnKSk/JHJlcGxfY291bnQ6JzAnPz4iIHN0eWxlPSJ3aWR0aDogNDAlOyIgLz48L3A+DQoJPHA+PHN0cm9uZz5LZXl3b3JkIFdlaWdodDwvc3Ryb25nPiBmb3IgdGhlIHdlaWdodGVkIHJhbmRvbSBsaW5rIHNlbGVjdGlvbi4gVGhpcyBzaG91bGQgYmUgYmV0d2VlbiAwIGFuZCA5IChsZWF2ZSB1bmNoYW5nZWQgaWYgeW91IGRvbid0IGtub3cgd2hhdCB0aGlzIG1lYW5zKTo8YnIgLz4NCgk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0id2VpZ2h0IiB2YWx1ZT0iPD89KGlzc2V0KCR3ZWlnaHQpJiYoJGVycl9tc2chPScnKSk/JHdlaWdodDonNSc/PiIgc3R5bGU9IndpZHRoOiA0MCU7IiAvPjwvcD4NCgk8cD5DaGVjayB0aGlzIGJveCBpcyB0byBhZGQNCjxzdHJvbmc+cmVsPW5vZm9sbG93PC9zdHJvbmc+IGludG8gIHRoZSBoeXBlcmxpbmsgaXQgY3JlYXRlcyBvbiBhIHBhZ2UuPGJyIC8+DQoJICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Im5vZm9sbG93IiA8PyBpZiAoaXNzZXQoJG5vZm9sbG93KSYmKCRlcnJfbXNnIT0nJykpDQp7DQogaWYgKCRub2ZvbGxvdyA9PSAxKQ0KIHsNCiAgICAgIGVjaG8gJ2NoZWNrZWQnOw0KIH0NCn0/PiAgIC8+DQoJPC9wPg0KPHA+Q2hlY2sgdGhpcyBib3ggaXMgdG8gZGlzYWJsZSBpbnRlcm5hbCB0cmFja2luZyBzeXN0ZW0gZm9yIHRoaXMga2V5d29yZC48YnIgLz4NCgkgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ibm90cmFjayIgPD8gaWYgKGlzc2V0KCRub3RyYWNrKSYmKCRlcnJfbXNnIT0nJykpDQp7DQogaWYgKCRub3RyYWNrPT0gMSkNCiB7DQogICAgICBlY2hvICdjaGVja2VkJzsNCiB9DQp9Pz4gICAvPg0KCTwvcD4NCgk8cCBjbGFzcz0ic3VibWl0Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJhZGRrZXl3b3JkIiAvPjxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IkFkZCBLZXl3b3JkICZyYXF1bzsiIC8+PC9wPg0KPC9mb3JtPg0KPC9kaXY+DQo8PwkJDQoJCX0JLy8gaWYgc2hvdyBhZGQga2V5d29yZCBib3gNCgkJcHJpbnRfYWZmaWxpYXRlX2JsdXJiKCk7DQoJfQ0KfQ0KDQoNCmlmICghZnVuY3Rpb25fZXhpc3RzKCdpbkhUTUxUYWcnKSkgew0KCWZ1bmN0aW9uIGluSFRNTFRhZygkaGF5c3RhY2ssICRvZmZzZXQpIHsNCgkJJGhheWxlbiA9IHN0cmxlbigkaGF5c3RhY2spOw0KDQoJCS8vIFJ1biBzb21lIHNhbml0eSBjaGVja3MgZmlyc3QuIElmIHRoZSBvZmZzZXQgaXMgbmVnYXRpdmUsIHRoZSBzdHJpbmcgbGVuZ3RoIGlzIGlzIGxhcmdlciB0aGFuIHRoZSBzdHJpbmcgbGVuZ3RoLCByZXR1cm4gRkFMU0UNCgkJaWYgKCgkb2Zmc2V0IDwgMCkgfHwgKCRvZmZzZXQgPiAkaGF5bGVuKSB8fCAoJGhheWxlbiA9PSAwKSkgew0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoNCg0KCQkvLyBTZWFyY2ggdXAgdG8gMjUwIGNoYXJhY3RlcnMgdG8gdGhlIGxlZnQgZm9yIHRoZSBvcGVuIEhUTUwgdGFnDQoJCSRtYXhfbGVuID0gJG9mZnNldCAtIDI1MDsNCgkJaWYgKCRtYXhfbGVuIDwgMCkgew0KCQkJJG1heF9sZW4gPSAwOw0KCQl9DQoNCgkJJGxlZnQgPSAtMTsNCgkJZm9yICgkaT0kb2Zmc2V0OyAkaT49JG1heF9sZW47ICRpLS0pIHsNCgkJCXN3aXRjaCAoJGhheXN0YWNreyRpfSkgew0KCQkJCWNhc2UgJzwnOg0KCQkJCQkkbGVmdCA9ICRpOw0KCQkJCQkkaSA9ICRtYXhfbGVuOw0KCQkJCQlicmVhazsNCgkJCQljYXNlICc+JzoNCgkJCQkJJGkgPSAkbWF4X2xlbjsNCgkJCQkJYnJlYWs7DQoJCQl9DQoJCX0NCg0KCQkvLyBTZWFyY2ggdXAgdG8gMjUwIGNoYXJhY3RlcnMgdG8gdGhlIHJpZ2h0IGZvciB0aGUgY2xvc2UgSFRNTCB0YWcNCgkJJHJpZ2h0ID0gLTE7DQoJCWlmICgkbGVmdCAhPSAtMSkgew0KCQkJJG1heF9sZW4gPSAkb2Zmc2V0ICsgMjUwOw0KCQkJaWYgKCRtYXhfbGVuID4gJGhheWxlbikgew0KCQkJCSRtYXhfbGVuID0gJGhheWxlbjsNCgkJCX0NCg0KCQkJZm9yICgkaT0kb2Zmc2V0OyAkaSA8ICRtYXhfbGVuOyAkaSsrKSB7DQoJCQkJc3dpdGNoICgkaGF5c3RhY2t7JGl9KSB7DQoJCQkJCWNhc2UgJz4nOg0KCQkJCQkJJHJpZ2h0ID0gJGk7DQoJCQkJCQkkaSA9ICRtYXhfbGVuOw0KCQkJCQkJYnJlYWs7DQoJCQkJCWNhc2UgJzwnOg0KCQkJCQkJJGkgPSAkbWF4X2xlbjsNCgkJCQkJCWJyZWFrOw0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCSRyZXN1bHQgPSAoKCRsZWZ0ICE9IC0xKSAmJiAoJHJpZ2h0ICE9IC0xKSAmJiAoJGxlZnQgPCAkb2Zmc2V0KSAmJiAoJHJpZ2h0ID4gJG9mZnNldCkpOw0KCQlyZXR1cm4gJHJlc3VsdDsNCgl9DQoNCn0NCg0KDQovLyBQSFAgNSBjb21wYXRpYmlsaXR5IGZ1bmN0aW9uOiBzdHJpcG9zDQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnc3RyaXBvcycpKSB7DQogICAgZnVuY3Rpb24gc3RyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQgPSBudWxsKQ0KICAgIHsNCiAgICAgICAgLy8gTWFuaXB1bGF0ZSB0aGUgc3RyaW5nIGlmIHRoZXJlIGlzIGFuIG9mZnNldA0KICAgICAgICAkZml4ID0gMDsNCiAgICAgICAgaWYgKCFpc19udWxsKCRvZmZzZXQpKSB7DQogICAgICAgICAgICBpZiAoJG9mZnNldCA+IDApIHsNCiAgICAgICAgICAgICAgICAkaGF5c3RhY2sgPSBzdWJzdHIoJGhheXN0YWNrLCAkb2Zmc2V0LCBzdHJsZW4oJGhheXN0YWNrKSAtICRvZmZzZXQpOw0KICAgICAgICAgICAgICAgICRmaXggPSAkb2Zmc2V0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgJHNlZ21lbnRzID0gZXhwbG9kZShzdHJ0b2xvd2VyKCRuZWVkbGUpLCBzdHJ0b2xvd2VyKCRoYXlzdGFjayksIDIpOw0KDQogICAgICAgIC8vIENoZWNrIHRoZXJlIHdhcyBhIG1hdGNoDQogICAgICAgIGlmIChjb3VudCgkc2VnbWVudHMpID09PSAxKSB7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCg0KICAgICAgICAkcG9zaXRpb24gPSBzdHJsZW4oJHNlZ21lbnRzWzBdKSArICRmaXg7DQogICAgICAgIHJldHVybiAkcG9zaXRpb247DQogICAgfQ0KfQ0KDQoNCmlmICghZnVuY3Rpb25fZXhpc3RzKCdhcF9hZGRfYWZmaWxpYXRlX2xpbmtzJykpIHsNCglmdW5jdGlvbiBhcF9hZGRfYWZmaWxpYXRlX2xpbmtzKCRjb250ZW50ID0gJycpIHsNCgkJZ2xvYmFsICR0YWJsZV9wcmVmaXgsICR3cGRiOw0KDQoJCS8vIElmIHRoZSBwcm9jZXNzaW5nIGlzIGRpc2FibGVkIHZpYSB0aGUgT3B0aW9ucyBtZW51IHRoZW4gcmV0dXJuIHRoZSB0ZXh0IHVuY2hhbmdlZA0KCQlpZiAoZ2V0X29wdGlvbignYXBfZW5hYmxlJyk9PSdObycpIHsNCgkJCXJldHVybiAkY29udGVudDsNCgkJfQ0KDQoJCWlmIChnZXRfb3B0aW9uKCdhcF9yZXBsYWNlX2NvdW50X21ldGhvZCcpID09ICdXJykgew0KCQkJJHdlaWdodGVkX3JhbmRvbSA9IFRSVUU7DQoJCX0gZWxzZSB7DQoJCQkkd2VpZ2h0ZWRfcmFuZG9tID0gRkFMU0U7DQoJCX0NCg0KCQkvLyBQdWxsIHRoZSBsaXN0IG9mIGtleXdvcmRzIGZyb20gdGhlIERCLiBJZiB0aGUgbGluayBpbnNlcnRpb24gbWV0aG9kIGlzIFdlaWdodGVkIFJhbmRvbSB0aGVuIHRha2UgdGhhdCBpbnRvIGFjY291bnQuDQoJCSR0YWJsZV9uYW1lID0gJHRhYmxlX3ByZWZpeCAuIEFQX0tXRF9UQUJMRTsNCgkJaWYgKCR3ZWlnaHRlZF9yYW5kb20pIHsNCgkJCSR3ZWlnaHRfdHh0ID0gJ09SREVSIEJZIHdlaWdodCBERVNDJzsNCgkJfSBlbHNlIHsNCgkJCSR3ZWlnaHRfdHh0ID0gJyc7DQoJCX0NCgkJJHNxbCA9ICJTRUxFQ1QgKiBGUk9NICR0YWJsZV9uYW1lICR3ZWlnaHRfdHh0IjsNCgkJJGtleXdvcmRzID0gJHdwZGItPmdldF9yZXN1bHRzKCRzcWwsIEFSUkFZX0EpOw0KDQoJCWlmIChpc19hcnJheSgka2V5d29yZHMpKSB7DQoJCQkvLyBSZXRyaWV2ZSB0aGUgZ2xvYmFsIG9wdGlvbnMNCgkJCSRuZXdfd2luZG93ID0gKGdldF9vcHRpb24oJ2FwX25ld193aW5kb3cnKSA9PSAnWWVzJyk/JyB0YXJnZXQ9Il9ibGFuayInOicnOw0KCQkJJGxpbmtfY2xhc3MgPSB0cmltKGdldF9vcHRpb24oJ2FwX2xpbmtfY2xhc3MnKSk7DQoJCQlpZiAoJGxpbmtfY2xhc3MgIT0gJycpIHsNCgkJCQkkbGlua19jbGFzcyA9ICIgY2xhc3M9JyRsaW5rX2NsYXNzJyI7DQoJCQl9DQoJCQkkcmVwbGFjZV9saW1pdF9nbG9iYWwgPSBnZXRfb3B0aW9uKCdhcF9yZXBsYWNlX2NvdW50X2dsb2JhbCcpOw0KCQkJaWYgKCRyZXBsYWNlX2xpbWl0X2dsb2JhbCA9PSAwKSB7DQoJCQkJLy8gU2V0ICJ1bmxpbWl0ZWQiIHRvIHNvbWUgYXJiaXRyYXJ5IGhpZ2ggdmFsdWUgdW5saWtlbHkgdG8gYmUgcmVhY2hlZC4NCgkJCQkkcmVwbGFjZV9saW1pdF9nbG9iYWwgPSA5OTk5Ow0KCQkJfQ0KCQkJJHJlcGxhY2VfbGltaXRfa2V5d29yZF9nbG9iYWwgPSBnZXRfb3B0aW9uKCdhcF9yZXBsYWNlX2NvdW50Jyk7DQoJCQlpZiAoJHJlcGxhY2VfbGltaXRfa2V5d29yZF9nbG9iYWwgPT0gMCkgew0KCQkJCSRyZXBsYWNlX2xpbWl0X2tleXdvcmRfZ2xvYmFsID0gOTk5OTsNCgkJCX0NCg0KCQkJJGJhc2VfdXJsID0gZ2V0X29wdGlvbignc2l0ZXVybCcpIC4gJy93cC1jb250ZW50L3BsdWdpbnMvJzsNCg0KCQkJLyokdHJhY2tlcl91cmwgPSAkYmFzZV91cmwgLiBNWV9TQ1JJUFRfTkFNRTsqLw0KCQkJLy8gUmV0cmlldmUgcGx1Z2luIHBhdGggZnJvbSBkYg0KCQkJJHNlYXJjX3VybCA9ICJTRUxFQ1QgKiBGUk9NICIuJHdwZGItPm9wdGlvbnMuIiBXSEVSRSBvcHRpb25fbmFtZT0nYWN0aXZlX3BsdWdpbnMnIjsNCg0KCQkJJHNkYXRhID0gJHdwZGItPmdldF9yb3coJHNlYXJjX3VybCwgQVJSQVlfQSk7DQoNCgkJCSRzZGFyciA9IHVuc2VyaWFsaXplKCRzZGF0YVsnb3B0aW9uX3ZhbHVlJ10pOw0KDQoJCQlmb3JlYWNoKCRzZGFyciBhcyAkayA9PiAkdikNCgkJCXsNCgkJCQkkcG9zID0gc3RycG9zKCR2LCAiYWZmaWxpYXRlIik7DQoJCQkJaWYoJHBvcyAhPT0gZmFsc2UpCWJyZWFrOw0KCQkJfQ0KDQoJCQkkdHJhY2tlcl91cmwgPSAkYmFzZV91cmwgLiAkc2RhcnJbJGtdOyAvL3ByaW50X3IoJHRyYWNrZXJfdXJsKTtleGl0Ow0KDQoNCgkJCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU1RFUCAxICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoJCQkvLyAqKioqICAgIEJ1aWxkIGEgKHdlaWdodGVkKSByYW5kb20gbGlzdCBvZiBhdmFpbGFibGUga2V5d29yZHMuICAgICAgKioqKg0KCQkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCgkJCSRrZXl3b3JkX2NvdW50ID0gY291bnQoJGtleXdvcmRzKTsNCg0KCQkJLy8gSW5pdGlhbGl6ZSB0aGUgTWVyc2VubmUgVHdpc3RlciByYW5kb20gbnVtYmVyIGdlbmVyYXRvciAoZG9uZSBhdXRvbWF0aWNhbGx5IG9ubHkgb24gUEhQID4gNC4yIHNvIHdlIHRha2UgY2FyZSBvZiBpdCBoZXJlLikNCgkJCWxpc3QoJHVzZWMsICRzZWMpID0gZXhwbG9kZSgnICcsIG1pY3JvdGltZSgpKTsNCgkJCW10X3NyYW5kKChmbG9hdCkgJHNlYyArICgoZmxvYXQpICR1c2VjICogMTAwMDAwKSk7DQoNCgkJCS8vIEFkZCB0aGUgcmFuZG9tICh3ZWlnaHRlZCkgcHJpb3JpdHkgdG8gZWFjaCBrZXl3b3JkLiBBbHNvIGNyZWF0ZSB0aGUgY29sdW1uIGFycmF5cywgdG8gcHJlcGFyZSBmb3IgYXJyYXlfbXVsdGlzb3J0IGFuZCBjcmVhdGUgdGhlIHRlbXBvcmFyeSBrZXl3b3JkIHJlcGxhY2VtZW50cy4NCgkJCSRpZHggPSAxOw0KCQkJZm9yZWFjaCAoJGtleXdvcmRzIGFzICRrZXk9PiR2YWwpIHsNCgkJCQkkcmFuZF9wcmlvID0gbXRfcmFuZCgxLCAka2V5d29yZF9jb3VudCk7DQoJCQkJaWYgKCR3ZWlnaHRlZF9yYW5kb20pIHsNCgkJCQkJLy8gS2V5d29yZCB3ZWlnaHQgaXMgMCBiYXNlZCwgYW5kIHdlIG5lZWQgaXQgMSBiYXNlZC4NCgkJCQkJJHJhbmRfcHJpbyA9ICRyYW5kX3ByaW8gKiAoJGtleXdvcmRzWyRrZXldWyd3ZWlnaHQnXSArIDEpOw0KCQkJCX0NCg0KCQkJCSRrd2RfaWRbXSA9ICR2YWxbJ2lkJ107DQoJCQkJJGt3ZF9rZXl3b3JkW10gPSAkdmFsWydrZXl3b3JkJ107DQoJCQkJJGt3ZF9jYXB0aW9uW10gPSAkdmFsWydjYXB0aW9uJ107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRrd2Rfbm9mb2xsb3dbXSA9ICR2YWxbJ25vZm9sbG93J107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRrd2Rfbm90cmFja1tdID0gJHZhbFsnbm90cmFjayddOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAka3dkX3VybFtdPSAkdmFsWyd1cmwnXTsNCg0KCQkJCWlmICgkdmFsWydyZXBsYWNlY291bnQnXSA9PSAwKSB7DQoJCQkJCS8vIFRha2UgaW50byBhY2NvdW50IHRoZSBnbG9iYWwgb3B0aW9uIGlmIG5vIHBlci1rZXl3b3JkIHNldHRpbmcgaXMgYXZhaWxhYmxlLg0KCQkJCQkkcmMgPSAkcmVwbGFjZV9saW1pdF9rZXl3b3JkX2dsb2JhbDsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkcmMgPSAkdmFsWydyZXBsYWNlY291bnQnXTsNCgkJCQl9DQoNCgkJCQkka3dkX3JlcGxhY2Vjb3VudFtdID0gJHJjOw0KCQkJCSRrd2RfcHJpb3JpdHlbXSA9ICRyYW5kX3ByaW87DQoJCQkJJGt3ZF9zZWFyY2hwb3NbXSA9IDA7DQoJCQkJJGt3ZF90bXByZXBsW10gPSAiISFUTVBBUCRpZHghISI7DQoJCQkJJGlkeCsrOw0KCQkJfQ0KDQoJCQkvLyBTb3J0IHRoZSBhcnJheSBiYXNlZCBvbiB0aGUga2V5d29yZCBwcmlvcml0eS4NCgkJCWFyc29ydCgka3dkX3ByaW9yaXR5KTsNCg0KCQkJLy8gUGVyZm9ybSB0aGUgZmlyc3Qgc3RhZ2Ugb2YgcmVwbGFjZW1lbnRzLg0KCQkJJGtlZXBfZ29pbmcgPSBUUlVFOw0KCQkJd2hpbGUgKCRrZWVwX2dvaW5nKSB7DQoJCQkJLy8gV2UgdXNlIGRvbmVfd29yayB0byBrZWVwIHRyYWNrIGlmIGF0IGxlYXN0IG9uZSByZXBsYWNlbWVudCBvY2N1cmVkIHBlciBsb29wLiBJZiBubyByZXBsYWNlbWVudHMgd2VyZSBkb25lIG9uIHRoZSBsYXN0IGxvb3AsIGJhaWwgb3V0LiBUaGlzIGlzIHRvIHByZXZlbnQgZW5kbGVzcyBsb29wcyB3aGVyZSB1c2VyIGFsbG93cyB1bmxpbWl0ZWQgbnVtYmVyIG9mIGFmZmlsaWF0ZSBsaW5rcyBwZXIgcGFnZSBhbmQgYWxsIGtleXdvcmRzIGhhdmUgdW5saW1pdGVkIHJlcGxhY2VtZW50cyB0b28uDQoJCQkJJGRvbmVfd29yayA9IEZBTFNFOw0KCQkJCWZvcmVhY2ggKCRrd2RfcHJpb3JpdHkgYXMgJGtleT0+JHZhbCkgew0KCQkJCQlpZiAoJGt3ZF9yZXBsYWNlY291bnRbJGtleV0gPiAwKSB7DQoJCQ0KCQkJJGt3ZHBvcyA9IHN0cmlwb3MoJGNvbnRlbnQsICRrd2Rfa2V5d29yZFska2V5XSwgJGt3ZF9zZWFyY2hwb3NbJGtleV0pOw0KCQkJCQkJaWYgKCRrd2Rwb3MgIT09IEZBTFNFKSB7DQoJCQkJCQkJLy8gVE9ETzogQWRkIGEgZ2xvYmFsIGZsYWcgdG8gYWxsb3cgdGhlIHVzZXIgdG8gZW5hYmxlL2Rpc2FibGUgcmVwbGFjZW1lbnQgb2Yga2V5d29yZHMgZm91bmQgd2l0aGluIEhUTUwgdGFncy4NCgkJCQkJCQlpZiAoISBpbkhUTUxUYWcoJGNvbnRlbnQsICRrd2Rwb3MpKSB7DQoJCQkJCQkJCSRjb250ZW50ID0gc3Vic3RyKCRjb250ZW50LCAwLCAka3dkcG9zKSAuICRrd2RfdG1wcmVwbFska2V5XSAuIHN1YnN0cigkY29udGVudCwgJGt3ZHBvcyArIHN0cmxlbigka3dkX2tleXdvcmRbJGtleV0pKTsNCg0KCQkJCQkJCQkkZG9uZV93b3JrID0gVFJVRTsNCgkJCQkJCQkJJHJlcGxhY2VfbGltaXRfZ2xvYmFsLS07DQoJCQkJCQkJCSRrd2RfcmVwbGFjZWNvdW50WyRrZXldLS07DQoJCQkJCQkJfQ0KCQkJCQkJCS8vIE5leHQgdGltZSB3ZSBzZWFyY2ggb25seSBvbiB0aGUgcmVtYWluaW5nIHRleHQsIG5vdCBmcm9tIHRoZSBiZWdpbm5pbmcgYWdhaW4uLi4NCgkJCQkJCQkka3dkX3NlYXJjaHBvc1ska2V5XSA9ICRrd2Rwb3MgKyBzdHJsZW4oJGt3ZF9rZXl3b3JkWyRrZXldKTsNCgkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJLy8gSWYgd2UgaGF2ZW4ndCBmb3VuZCBhbnkgb2NjdXJlbmNlcyBvZiB0aGlzIGtleXdvcmQgaW4gdGhpcyBzdGVwLCBkb24ndCBzZWFyY2ggZm9yIGl0IGluIHN1YnNlcXVlbnQgc3RlcHMuDQoJCQkJCQkJJGt3ZF9yZXBsYWNlY291bnRbJGtleV0gPSAwOw0KCQkJCQkJfQ0KCQkJCQl9DQoNCgkJCQkJLy8gSWYgd2UndmUgcmVhY2hlZCB0aGUgbWF4aW11bSBsaW5rcyBwZXIgcGFnZSwgYmFpbCBvdXQuLi4NCgkJCQkJaWYgKCRyZXBsYWNlX2xpbWl0X2dsb2JhbCA9PSAwKSB7DQoJCQkJCQkka2VlcF9nb2luZyA9IEZBTFNFOw0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQkvLyBObyByZXBsYWNlbWVudHMgb24gbGFzdCBsb29wPyBCYWlsIG91dC4NCgkJCQlpZiAoJGRvbmVfd29yayA9PSBGQUxTRSkgew0KCQkJCQkka2VlcF9nb2luZyA9IEZBTFNFOw0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gUGVyZm9ybSB0aGUgc2Vjb25kIHN0YWdlIG9mIHJlcGxhY2VtZW50cywgd2hlcmUgdGhlIHRlbXBvcmFyeSBwbGFjZWhvbGRlciBpcyBleGNoYW5nZWQgd2l0aCB0aGUgZmluYWwgSFRNTC4NCgkJCSRzb3VyY2UgPSBhcnJheSgpOw0KCQkJJGRlc3QgPSBhcnJheSgpOw0KCQkJZm9yZWFjaCAoJGt3ZF9wcmlvcml0eSBhcyAka2V5PT4kdmFsKSB7DQoJCQkJJHNvdXJjZVtdID0gJy8nLiRrd2RfdG1wcmVwbFska2V5XS4nL2knOw0KCQkJCWlmICh0cmltKCRrd2RfY2FwdGlvblska2V5XSkgIT0gJycpIHsNCgkJCQkJJGNhcHRpb24gPSAiIG9ubW91c2VvdmVyPVwidG9wLndpbmRvdy5zdGF0dXM9JyIuJGt3ZF9jYXB0aW9uWyRrZXldLiInOyByZXR1cm4gdHJ1ZVwiIG9ubW91c2VvdXQ9XCJ0b3Aud2luZG93LnN0YXR1cz0nJzsgcmV0dXJuIHRydWVcIiI7DQoJCQkJfSBlbHNlIHsNCgkJCQkJJGNhcHRpb24gPSAnJzsNCgkJCQl9DQokYWRkbm9mb2xsb3cgPSAiIjsNCg0KaWYgKCRrd2Rfbm9mb2xsb3dbJGtleV0gPT0gMSkNCnsNCiAgJGFkZG5vZm9sbG93ID0gJ3JlbD0ibm9mb2xsb3ciJzsNCn0NCiRhZGRub3RyYWNrID0gIiI7DQoNCmlmICgka3dkX25vdHJhY2tbJGtleV0gPT0gMSkNCnsNCiAgIA0KICAgJGFkZG5vdHJhY2sgPSAka3dkX3VybFska2V5XTsNCn0NCmVsc2Ugew0KICAgJGFkZG5vdHJhY2sgPSAkdHJhY2tlcl91cmwuIj9pZD0iLiRrd2RfaWRbJGtleV07DQp9DQoNCgkJCQkvLyRkZXN0W10gPSAiPGEgaHJlZj0kYWRkZWR0YWdzLiInJGNhcHRpb24kbmV3X3dpbmRvdyRsaW5rX2NsYXNzPiIuJGt3ZF9rZXl3b3JkWyRrZXldLiI8L2E+IjsNCiRkZXN0W10gPSAiPGEgIi4gJGFkZG5vZm9sbG93IC4iIGhyZWY9JyIuJGFkZG5vdHJhY2sgLiInJGNhcHRpb24kbmV3X3dpbmRvdyRsaW5rX2NsYXNzPiIuJGt3ZF9rZXl3b3JkWyRrZXldLiI8L2E+IjsNCgkJCX0NCgkJCWlmIChjb3VudCgkc291cmNlKSA+IDApIHsNCgkJCQkkY29udGVudCA9IHByZWdfcmVwbGFjZSgkc291cmNlLCAkZGVzdCwgJGNvbnRlbnQpOw0KCQkJfQ0KCQl9DQoJCXJldHVybiAkY29udGVudDsNCgl9DQp9DQoNCg0KDQoJLy8gTWFrZSBzdXJlIG91ciBpbnN0YWxsZXIgZ2V0cyBjYWxsZWQgd2hlbiB0aGUgdXNlciBhY3RpdmF0ZXMgdGhlIHBsdWdpbi4gVGhpcyBpbiB0dXJuIGNyZWF0ZXMgb3VyIGRhdGEgdGFibGVzIGFuZCBzZXRzIHRoZSBvcHRpb25zIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLg0KCWFkZF9hY3Rpb24oJ2FjdGl2YXRlXycuTVlfU0NSSVBUX05BTUUsICdhcF9pbnN0YWxsX3BsdWdpbicpO2FwX2luc3RhbGxfcGx1Z2luKCk7Ly9leGl0KCJhZGRfYWN0aW9uIik7DQoNCgkvLyBJbnNlcnQgdGhlIGFwX2FkZF9wYWdlcygpIHNpbmsgaW50byB0aGUgcGx1Z2luIGhvb2sgbGlzdCBmb3IgJ2FkbWluX21lbnUnDQoJYWRkX2FjdGlvbignYWRtaW5fbWVudScsICdhcF9hZGRfcGFnZXMnKTsNCg0KCS8vIEluc2VydCB0aGUgY29udGVudCByZXdyaXRlciBzaW5rIGludG8gdGhlIGZpbHRlciBob29rIGxpc3QgZm9yIHRoZSBwb3N0IGRpc3BsYXkNCglhZGRfZmlsdGVyKCd0aGVfY29udGVudCcsICdhcF9hZGRfYWZmaWxpYXRlX2xpbmtzJywgMSk7DQoNCgkvLyBUT0RPIGZvciBuZXh0IHJlbGVhc2U6IEFsbG93IHRoZSB1c2VyIHRvIHR1cm4gbGlua3MgaW50byBjb21tZW50cyBvbiBhbmQgb2ZmDQoJLy8gSW5zZXJ0IHRoZSBjb250ZW50IHJld3JpdGVyIHNpbmsgaW50byB0aGUgZmlsdGVyIGhvb2sgbGlzdCBmb3IgdGhlIGNvbW1lbnQgZGlzcGxheQ0KCWFkZF9maWx0ZXIoJ2NvbW1lbnRfdGV4dCcsICdhcF9hZGRfYWZmaWxpYXRlX2xpbmtzJywgMSk7')); ?>