# Name: rah_comment_spam v0.5 # Type: Admin/Client side plugin # Anti-spam tools to prevent comment spam # Author: Jukka Svahn # URL: http://rahforum.biz # Recommended load order: 5 # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YToxMDp7czo2OiJhdXRob3IiO3M6MTE6Ikp1a2thIFN2YWhuIjtzOjEwOiJhdXRob3JfdXJp IjtzOjE5OiJodHRwOi8vcmFoZm9ydW0uYml6IjtzOjExOiJkZXNjcmlwdGlvbiI7czozOToi QW50aS1zcGFtIHRvb2xzIHRvIHByZXZlbnQgY29tbWVudCBzcGFtIjtzOjQ6ImhlbHAiO3M6 NDc0NjoiCTxoMT5yYWhfY29tbWVudF9zcGFtPC9oMT4KCgk8cD5SYWhfY29tbWVudF9zcGFt IHNoaXBzIHdpdGggY3VzdG9taXphYmxlIGFudGktc3BhbSB0b29scy4gU2V0IG1pbmltdW0g YW5kIG1heGltdW0gbWVzc2FnZSBsZW5naHQsIGZpbHRlciBzcGFtIHdvcmRzLCB2YWxpZGF0 ZSBlbWFpbCBhZGRyZXNzZXMsIGxpbWl0IHBvc3RpbmcgYWN0aXZpdHkgYW5kIHNldCBoaWRk ZW4gc3BhbSB0cmFwcy4gVG9nZ2xlIHNwYW0gcHJldmVudGlvbiBtZXRob2QgYmV0d2VlbiBi bG9jaywgbW9kZXJhdGUgb3IgbWFyayBhcyBzcGFtLiBBbGwgZnJvbSBzaW1wbGUgaW50ZXJm YWNlLCBubyBoZWFkIGZpcnN0IGRpdmUgdG8gY29kZS48L3A+CgoJPHVsPgoJCTxsaT5WZXJz aW9uOiAwLjU8L2xpPgoJCTxsaT5VcGRhdGVkOiAyMDEwLzA5LzE1IDQ6MjAgQU0gPHNwYW4g Y2xhc3M9ImNhcHMiPlVUQzwvc3Bhbj48L2xpPgoJPC91bD4KCgk8aDM+VGFibGUgb2YgQ29u dGVudHM8L2gzPgoKCTx1bD4KCQk8bGk+PGEgaHJlZj0iI2xpc3Qtb2YtZmVhdHVyZXMiPkxp c3Qgb2YgZmVhdHVyZXM8L2E+PC9saT4KCQk8bGk+PGEgaHJlZj0iI3JlcXVpcmVtZW50cyI+ UmVxdWlyZW1lbnRzPC9hPjwvbGk+CgkJPGxpPjxhIGhyZWY9IiNpbnN0YWxsYXRpb24tYW5k LXVzYWdlIj5JbnN0YWxsYXRpb24gYW5kIHVzYWdlPC9hPjwvbGk+CgkJPGxpPjxhIGhyZWY9 IiNjaGFuZ2Vsb2ciPkNoYW5nZWxvZzwvYT48L2xpPgoJPC91bD4KCgk8aDMgaWQ9Imxpc3Qt b2YtZmVhdHVyZXMiPkxpc3Qgb2YgZmVhdHVyZXM8L2gzPgoKCTx1bD4KCQk8bGk+U2V0IGNv bW1lbnQgbWVzc2FnZSBsZW5naHQgbGltaXRhdGlvbnM6IG1pbmltdW0gYW5kIG1heGltdW0s IHdvcmRzIGFuZCBjaGFyYWN0ZXJzLjwvbGk+CgkJPGxpPkxpbWl0IGxpbmsgcG9zdGluZy48 L2xpPgoJCTxsaT5EZWZpbmUgc3BhbSB3b3JkcywgYW5kIHNldCB0aGUgbGltaXQgaG93IG1h bnkgc3BhbSB3b3JkcyBhcmUgbmVlZGVkIHVudGlsbCBjb21tZW50IGJlY29tZXMgc3BhbS48 L2xpPgoJCTxsaT5TaG93IGN1c3RvbWl6YWJsZSBlcnJvciBtZXNzYWdlcyB3aGVuIGNvbW1l bnQgaXMgYmxvY2tlZC48L2xpPgoJCTxsaT5TZXQgYSBjdXN0b20gaGlkZGVuIHNwYW0gdHJh cCBmaWVsZC48L2xpPgoJCTxsaT5DaGFuZ2UgdGhlIHNwYW0gcHJvdGVjdGlvbiBtZXRob2Qu PC9saT4KCQk8bGk+Q29tbWVudCBwb3N0aW5nIGxpbWl0IHBlciBzZXQgb2YgdGltZS48L2xp PgoJCTxsaT5Db21lcyB3aXRoIHNpbXBsZSBwcmVmZXJlbmNlcyBpbnRlcmZhY2U7IG5vIGRp dmluZyBpbnRvIGNvZGUgbmVlZGVkIGF0IGFsbC48L2xpPgoJPC91bD4KCgk8aDMgaWQ9InJl cXVpcmVtZW50cyI+UmVxdWlyZW1lbnRzPC9oMz4KCgk8cD5SYWhfY29tbWVudF9zcGFtJiM4 MjE3O3MgbWluaW11bSByZXF1aXJlbWVudHM6PC9wPgoKCTx1bD4KCQk8bGk+VGV4dHBhdHRl cm4gNC4wLjcrPC9saT4KCTwvdWw+CgoJPHA+UmVjb21tZW5kZWQ6PC9wPgoKCTx1bD4KCQk8 bGk+VGV4dHBhdHRlcm4gNC4yLjArPC9saT4KCQk8bGk+alF1ZXJ5IGZvciB0aGUgYWRtaW4g cGFuZWwgKGluY2x1ZGVkIHdpdGggVGV4dHBhdHRlcm4pLjwvbGk+Cgk8L3VsPgoKCTxoMyBp ZD0iaW5zdGFsbGF0aW9uLWFuZC11c2FnZSI+SW5zdGFsbGF0aW9uIGFuZCB1c2FnZTwvaDM+ CgoJPG9sPgoJCTxsaT5OYXZpZ2F0ZSB0byB5b3VyIFRleHRwYXR0ZXJuIGluc3RhbGxhdGlv biYjODIxNztzIFBsdWdpbiBwYW5lbCAoPGVtPlRleHRwYXR0ZXJuIC8gQWRtaW4gLyBQbHVn aW5zPC9lbT4pLjwvbGk+CgkJPGxpPlBhc3RlIHJhaF9jb21tZW50X3NwYW0mIzgyMTc7cyBw bHVnaW4gY29kZSB0byB0aGUgcGx1Z2luIGluc3RhbGxlciB0ZXh0YXJlYSBhbmQgcnVuIHRo ZSBhdXRvbWF0ZWQgc2V0dXAuPC9saT4KCQk8bGk+QWZ0ZXIgdGhlIHNldHVwIGlzIGNvbXBs ZXRlZCwgYWN0aXZhdGUgdGhlIHBsdWdpbiBhbmQgeW91JiM4MjE3O3JlIHNldC48L2xpPgoJ CTxsaT5Zb3UgY2FuIGN1c3RvbWl6ZSB0aGUgcGx1Z2luJiM4MjE3O3Mgc2V0dGluZ3MgaW4g dGhlIHBsdWdpbiYjODIxNztzIHBhbmVsOiA8ZW0+VGV4dHBhdHRlcm4gLyBFeHRlbnNpb25z IC8gQ29tbWVudCBhbnRpc3BhbTwvZW0+LjwvbGk+Cgk8L29sPgoKCTxoMyBpZD0iY2hhbmdl bG9nIj5DaGFuZ2Vsb2c8L2gzPgoKCTxwPjxzdHJvbmc+VmVyc2lvbiAwLjU8L3N0cm9uZz48 L3A+CgoJPHVsPgoJCTxsaT5BZGRlZCBvcHRpb24gdG8gY2hlY2sgdGhlIHRpbWUgdGhlIHVz ZXIgdXNlZCB0byB3cml0ZSB0aGUgY29tbWVudCBhbmQgYmxvY2sgaW5zdGFudCBwb3N0ZXJz LiA8YSBocmVmPSJodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/ aWQ9MzQ1MzUiPkFzIGRpc2N1c3NlZCBoZXJlPC9hPi48L2xpPgoJCTxsaT5SZW1vdmVkIHVu dXNlZCA8c3BhbiBjbGFzcz0iY2FwcyI+SFRNTDwvc3Bhbj4gZmllbGQgaWRzIGFuZCBzaXpl cyBmcm9tIHRoZSBiYWNrZW5kIHBhbmUuPC9saT4KCTwvdWw+CgoJPHA+PHN0cm9uZz5WZXJz aW9uIDAuNDwvc3Ryb25nPjwvcD4KCgk8dWw+CgkJPGxpPkFkZGVkOiBub3cgYWxzbyBmaWx0 ZXJzIDxjb2RlPmh0dHBzOi8vPC9jb2RlPiwgPGNvZGU+ZnRwOi8vPC9jb2RlPiBhbmQgPGNv ZGU+ZnRwczovLzwvY29kZT4gcHJvdG9jb2xzLCBub3QganVzdCBsaW5rcyBzdGFydGluZyB3 aXRoIDxjb2RlPmh0dHA6Ly88L2NvZGU+LjwvbGk+CgkJPGxpPkNoYW5nZWQgcG9zdGluZyBs aW1pdCBmZWF0dXJlJiM4MjE3O3MgbWF4aW11bSBwb3N0IHNldHRpbmcgZnJvbSA8ZW0+JiM4 MjIwO21vcmUgdGhhbiYjODIyMTs8L2VtPiB0byA8ZW0+JiM4MjIwO2VxdWFscyBvciBtb3Jl IHRoYW4mIzgyMjE7PC9lbT4uIFNldHRpbmcgdGhlIHZhbHVlIHRvIHplcm8vb3IgbGVhdmlu ZyBpdCBlbXB0eSB3aWxsIGRpc2FibGUgdGhlIGZlYXR1cmUuPC9saT4KCQk8bGk+Q2hhbmdl ZCBmaWx0ZXJpbmcgbWV0aG9kIGZyb20gPGVtPmFuZDwvZW0+IHRvIDxlbT5vcjwvZW0+LiBU aGlzIG1lYW5zLCB3aGVuIHRoZSBjb21tZW50IGdvdHMgZmxhZ2dlZCBieSBhIGZpbHRlciBm b3IgdGhlIGZpcnN0IHRpbWUsIHRoZSBzcGFtIGZpbHRlcmluZyBwcm9jZXNzIGVuZHMgaW5z dGVhZCBnb2luZyB0aHJ1IGFsbCB0aGUgY2hlY2tzIHdoaWNoIGFyZSBubyBsb25nZXIgbmVl ZGVkLiBHaXZlcyBzbGlnaHQgcGVyZm9ybWFuY2UgYm9vc3QuPC9saT4KCQk8bGk+RnJvbSB2 ZXJzaW9uIDAuNCBvbndhcmRzIHJlcXVpcmVzIDxzcGFuIGNsYXNzPSJjYXBzIj5UWFA8L3Nw YW4+IDQuMC43IG9yIG5ld2VyLjwvbGk+CgkJPGxpPk5vdyBwb3N0aW5nIGxpbWl0cyBhcmUg Y291bnRlZCBiYXJlbHkgYnkgTXlTUUwuIE5vIGludm9sbWVudCBvZiA8c3BhbiBjbGFzcz0i Y2FwcyI+UEhQPC9zcGFuPi48L2xpPgoJCTxsaT5NZXJnZWQgPGNvZGU+cmFoX2NvbW1lbnRf c3BhbV91cmxjb3VudCgpPC9jb2RlPiBhbmQgPGNvZGU+cmFoX2NvbW1lbnRfc3BhbV9zcGFt d29yZHMoKTwvY29kZT4uPC9saT4KCQk8bGk+Tm93IGFkbWluIHBhbmVsIHVzZXMgc2FtZSB0 eXBlIG9mIHNsaWRpbmcgcGFuZWxzIGFzIHNlZW4gaW4gPGEgaHJlZj0iaHR0cDovL3JhaGZv cnVtLmJpei9wbHVnaW5zL3JhaF9zaXRlbWFwIj5yYWhfc2l0ZW1hcDwvYT4uPC9saT4KCTwv dWw+CgoJPHA+PHN0cm9uZz5WZXJzaW9uIDAuMzwvc3Ryb25nPjwvcD4KCgk8dWw+CgkJPGxp PkFkZGVkIGVtYWlsIDxzcGFuIGNsYXNzPSJjYXBzIj5ETlM8L3NwYW4+IHZhbGlkYXRpb24u PC9saT4KCTwvdWw+CgoJPHA+PHN0cm9uZz5WZXJzaW9uIDAuMi4xPC9zdHJvbmc+PC9wPgoK CTx1bD4KCQk8bGk+TWFkZSB3cml0aW5nIHNwYW0gZGVmaXRpb24gbGlzdCBsZXNzIHN0cmlj dC4gTm93IGFsbG93cyBkb3VibGUgY29tbWFzLCBzcGFjZXMgYW5kIHNvIG9uLiA8YSBocmVm PSJodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/cGlkPTIxMjk0 MyNwMjEyOTQzIj5UaGFua3MgUm9iZXJ0LjwvYT48L2xpPgoJPC91bD4KCgk8cD48c3Ryb25n PlZlcnNpb24gMC4yPC9zdHJvbmc+PC9wPgoKCTx1bD4KCQk8bGk+QWRkZWQgdXNlciBiYXNl ZCB0aW1lIHJlbGF0aXZlIHBvc3RpbmcgbGltaXQuPC9saT4KCQk8bGk+Rml4ZWQgaGlkZGVu IHNwYW10cmFwIGlucHV0JiM4MjE3O3MgZXNjYXBpbmcuPC9saT4KCQk8bGk+SW1wcm92ZWQg Y29tbWVudCBwb3N0aW5nIGV2YWx1YXRpbmcgc3BlZWQuPC9saT4KCQk8bGk+TWVyZ2VkIGlu c3RhbGwsIHNhdmUsIHVwZGF0ZSBhbmQgZmV0Y2ggYXJyYXlzLjwvbGk+CgkJPGxpPkltcHJv dmVkIGluc3RhbGxhdGlvbiBzY3JpcHQuPC9saT4KCQk8bGk+TWVyZ2VkIDxzcGFuIGNsYXNz PSJjYXBzIj5TUUw8L3NwYW4+IHF1ZXJpZXMuPC9saT4KCTwvdWw+CgoJPHA+PHN0cm9uZz5W ZXJzaW9uIDAuMS4zPC9zdHJvbmc+PC9wPgoKCTx1bD4KCQk8bGk+Rml4ZWQgZm9yZ290dGVu IDxjb2RlPnN0cnRvbG93ZXIoKTwvY29kZT4uPC9saT4KCTwvdWw+CgoJPHA+PHN0cm9uZz5W ZXJzaW9uIDAuMS4yPC9zdHJvbmc+PC9wPgoKCTx1bD4KCQk8bGk+UmVtb3ZlZCB0eXBvIGZy b20gYWRtaW4gcGFuZWw6ICYjODIyMDtEb2N1bWVudGlvbiYjODIyMTsgdG8gJiM4MjIwO0Rv Y3VtZW50YXRpb24mIzgyMjE7LjwvbGk+Cgk8L3VsPgoKCTxwPjxzdHJvbmc+VmVyc2lvbiAw LjE8L3N0cm9uZz48L3A+CgoJPHVsPgoJCTxsaT5GaXJzdCByZWxlYXNlPC9saT4KCTwvdWw+ IjtzOjQ6ImNvZGUiO3M6MTk5MDA6IgkjIyMjIyMjIyMjIyMjIyMjIyMNCgkjDQoJIwlyYWhf Y29tbWVudF9zcGFtLXBsdWdpbiBmb3IgVGV4dHBhdHRlcm4NCgkjCXZlcnNpb24gMC41DQoJ IwlieSBKdWtrYSBTdmFobg0KCSMJaHR0cDovL3JhaGZvcnVtLmJpeg0KCSMNCgkjIyMjIyMj IyMjIyMjIyMjIyMjDQoNCglpZihAdHhwaW50ZXJmYWNlID09ICdhZG1pbicpIHsNCgkJYWRk X3ByaXZzKCdyYWhfY29tbWVudF9zcGFtJywnMSwyJyk7DQoJCXJlZ2lzdGVyX3RhYignZXh0 ZW5zaW9ucycsJ3JhaF9jb21tZW50X3NwYW0nLCdDb21tZW50IEFudGlzcGFtJyk7DQoJCXJl Z2lzdGVyX2NhbGxiYWNrKCdyYWhfY29tbWVudF9zcGFtX3BhZ2UnLCdyYWhfY29tbWVudF9z cGFtJyk7DQoJCXJlZ2lzdGVyX2NhbGxiYWNrKCdyYWhfY29tbWVudF9zcGFtX2hlYWQnLCdh ZG1pbl9zaWRlJywnaGVhZF9lbmQnKTsNCgl9IGVsc2Ugew0KCQlyZWdpc3Rlcl9jYWxsYmFj aygncmFoX2NvbW1lbnRfc3BhbScsJ2NvbW1lbnQuc2F2ZScpOw0KCQlyZWdpc3Rlcl9jYWxs YmFjaygncmFoX2NvbW1lbnRfc3BhbV9mb3JtJywnY29tbWVudC5mb3JtJyk7DQoJfQ0KDQov KioNCglDaGVjayBmb3Igc3BhbQ0KKi8NCg0KCWZ1bmN0aW9uIHJhaF9jb21tZW50X3NwYW0o KSB7DQoJCSRmb3JtID0gZ2V0Q29tbWVudCgpOw0KCQkkZXZhbHVhdG9yID0mIGdldF9jb21t ZW50X2V2YWx1YXRvcigpOw0KCQkNCgkJQCRycyA9IHJhaF9jb21tZW50X3NwYW1fZmV0Y2go KTsNCgkJDQoJCWlmKCFpc3NldCgkcnNbJ3R5cGVfaW50ZXJ2YWwnXSkpIHsNCgkJCXJhaF9j b21tZW50X3NwYW1faW5zdGFsbCgpOw0KCQkJJHJzID0gcmFoX2NvbW1lbnRfc3BhbV9mZXRj aCgpOw0KCQl9DQoJCQ0KCQkkY2hlY2sgPSBleHBsb2RlKCcsJywkcnNbJ2NoZWNrJ10pOw0K CQkNCgkJJHdoZXJlID0gDQoJCQkoKGluX2FycmF5KCdtZXNzYWdlJywkY2hlY2spKSA/ICRm b3JtWydtZXNzYWdlJ10uJyAnIDogJycpLg0KCQkJKChpbl9hcnJheSgnd2ViJywkY2hlY2sp KSA/ICRmb3JtWyd3ZWInXS4nICcgOiAnJykuDQoJCQkoKGluX2FycmF5KCdlbWFpbCcsJGNo ZWNrKSkgPyAkZm9ybVsnZW1haWwnXS4nICcgOiAnJykuDQoJCQkoKGluX2FycmF5KCduYW1l JywkY2hlY2spKSA/ICRmb3JtWyduYW1lJ10uJyAnIDogJycpOw0KCQkNCgkJaWYoDQoJCQko JHJzWydmaWVsZCddICYmIHRyaW0ocHMoJHJzWydmaWVsZCddKSkpIHx8DQoJCQkNCgkJCXJh aF9jb21tZW50X3NwYW1fd29yZHMoDQoJCQkJJHdoZXJlLA0KCQkJCSRycw0KCQkJKSB8fA0K CQkJDQoJCQlyYWhfY29tbWVudF9zcGFtX2NoYXJzKA0KCQkJCSRmb3JtWydtZXNzYWdlJ10s DQoJCQkJJHJzDQoJCQkpIHx8DQoJCQkNCgkJCXJhaF9jb21tZW50X3NwYW1fZmluZCgNCgkJ CQkkcnNbJ3NwYW13b3JkcyddLA0KCQkJCSRmb3JtWydtZXNzYWdlJ10sDQoJCQkJJHJzWydt YXhzcGFtd29yZHMnXQ0KCQkJKSB8fA0KCQkJDQoJCQlyYWhfY29tbWVudF9zcGFtX2ZpbmQo DQoJCQkJYXJyYXkoDQoJCQkJCSdodHRwczovLycsDQoJCQkJCSdodHRwOi8vJywNCgkJCQkJ J2Z0cDovLycsDQoJCQkJCSdmdHBzOi8vJw0KCQkJCSksDQoJCQkJJGZvcm1bJ21lc3NhZ2Un XSwNCgkJCQkkcnNbJ3VybGNvdW50J10NCgkJCSkgfHwNCgkJCQ0KCQkJcmFoX2NvbW1lbnRf c3BhbV9saW1pdGNvbW1lbnRzKA0KCQkJCSRycw0KCQkJKSB8fA0KCQkJDQoJCQlyYWhfY29t bWVudF9zcGFtX3R5cGVfc3BlZWQoDQoJCQkJJHJzDQoJCQkpIHx8DQoJCQkNCgkJCXJhaF9j b21tZW50X3NwYW1fZG5zKCRmb3JtWydlbWFpbCddLCRycykNCgkJDQoJCSkgew0KCQkJc3dp dGNoKCRyc1snbWV0aG9kJ10pIHsNCgkJCQljYXNlICdibG9jaycgOg0KCQkJCQkkZXZhbHVh dG9yIC0+IGFkZF9lc3RpbWF0ZShSRUxPQUQsMSwkcnNbJ21lc3NhZ2UnXSk7DQoJCQkJYnJl YWs7DQoJCQkJY2FzZSAnbW9kZXJhdGUnIDoNCgkJCQkJJGV2YWx1YXRvciAtPiBhZGRfZXN0 aW1hdGUoTU9ERVJBVEUsMC43NSk7DQoJCQkJYnJlYWs7DQoJCQkJZGVmYXVsdCA6DQoJCQkJ CSRldmFsdWF0b3IgLT4gYWRkX2VzdGltYXRlKFNQQU0sMC43NSk7DQoJCQl9DQoJCX0NCgl9 DQoNCi8qKg0KCU91dHB1dHMgaGlkZGVuIHNwYW0gdHJhcA0KKi8NCg0KCWZ1bmN0aW9uIHJh aF9jb21tZW50X3NwYW1fZm9ybSgpIHsNCgkJDQoJCUAkcnMgPSByYWhfY29tbWVudF9zcGFt X2ZldGNoKCk7DQoJCQ0KCQlpZighaXNzZXQoJHJzWyd0eXBlX2ludGVydmFsJ10pKQ0KCQkJ cmV0dXJuOw0KCQkNCgkJJG91dCA9IGFycmF5KCk7DQoJCQ0KCQlpZigkcnNbJ3VzZV90eXBl X2RldGVjdCddID09ICd5ZXMnKSB7DQoJCQkNCgkJCWlmKA0KCQkJCXBzKCdyYWhfY29tbWVu dF9zcGFtX25vbmNlJykgfHwgcHMoJ3JhaF9jb21tZW50X3NwYW1fdGltZScpDQoJCQkpIHsN CgkJCQkkbm9uY2UgPSBodG1sc3BlY2lhbGNoYXJzKHBzKCdyYWhfY29tbWVudF9zcGFtX25v bmNlJykpOw0KCQkJCSR0aW1lID0gaHRtbHNwZWNpYWxjaGFycyhwcygncmFoX2NvbW1lbnRf c3BhbV90aW1lJykpOw0KCQkJfSBlbHNlIHsNCgkJCQlAJHRpbWUgPSBzdHJ0b3RpbWUoJ25v dycpOw0KCQkJCSRub25jZSA9IG1kNSgkcnNbJ25vbmNlJ10uJHRpbWUpOw0KCQkJfQ0KCQkJ DQoJCQkNCgkJCSRvdXRbXSA9DQoJCQkJJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InJh aF9jb21tZW50X3NwYW1fbm9uY2UiIHZhbHVlPSInLiRub25jZS4nIiAvPicuDQoJCQkJJzxp bnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InJhaF9jb21tZW50X3NwYW1fdGltZSIgdmFsdWU9 IicuJHRpbWUuJyIgLz4nDQoJCQk7DQoJCX0NCg0KCQlpZighZW1wdHkoJHJzWydmaWVsZCdd KSkNCgkJCSRvdXRbXSA9IA0KCQkJCSc8ZGl2IHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4nLg0K CQkJCQknPGlucHV0IHR5cGU9InRleHQiIHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMocHMo JHJzWydmaWVsZCddKSkuJyIgbmFtZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRyc1snZmllbGQn XSkuJyIgLz4nLg0KCQkJCSc8L2Rpdj4nDQoJCQk7DQoJCQ0KCQlyZXR1cm4gDQoJCQluLmlt cGxvZGUoJycsJG91dCkubjsNCgl9DQoNCi8qKg0KCUZpbmRzIG5lZWRsZSBmcm9tIGhheXN0 YWNrDQoqLw0KDQoJZnVuY3Rpb24gcmFoX2NvbW1lbnRfc3BhbV9maW5kKCRuZWVkbGUsJHN0 cmluZywkbWF4PTAsJGNvdW50PTApIHsNCgkJDQoJCWlmKCEkbmVlZGxlIHx8ICEkc3RyaW5n KQ0KCQkJcmV0dXJuOw0KCQkNCgkJJHN0cmluZyA9IHN0cnRvbG93ZXIoJyAnLiRzdHJpbmcu JyAnKTsNCgkJDQoJCWlmKCFpc19hcnJheSgkbmVlZGxlKSkNCgkJCSRuZWVkbGUgPSBleHBs b2RlKCcsJyxzdHJ0b2xvd2VyKCRuZWVkbGUpKTsNCgkJDQoJCWZvcmVhY2goJG5lZWRsZSBh cyAkZmluZCkgew0KCQkJJGZpbmQgPSB0cmltKCRmaW5kKTsNCgkJCWlmKCFlbXB0eSgkZmlu ZCkpDQoJCQkJJGNvdW50ICs9IHN1YnN0cl9jb3VudCgkc3RyaW5nLCRmaW5kKTsNCgkJfQ0K CQkNCgkJaWYoJGNvdW50ID4gJG1heCkNCgkJCXJldHVybiAxOw0KCX0NCg0KLyoqDQoJQ291 bnQgY2hhcmFjdGVycw0KKi8NCg0KCWZ1bmN0aW9uIHJhaF9jb21tZW50X3NwYW1fY2hhcnMo JHN0cmluZywkcnMpIHsNCgkJZXh0cmFjdCgkcnMpOw0KCQkNCgkJaWYoISRzdHJpbmcgfHwg KCEkbWluY2hhcnMgJiYgISRtYXhjaGFycykpDQoJCQlyZXR1cm47DQoJCQ0KCQkkY2hhcnMg PSBzdHJsZW4oJHN0cmluZyk7DQoJCQ0KCQlpZigoJG1heGNoYXJzICYmICRtYXhjaGFycyA8 ICRjaGFycykgfHwgKCRtaW5jaGFycyAmJiAkY2hhcnMgPD0gJG1pbmNoYXJzKSkNCgkJCXJl dHVybiAxOw0KCQkNCgl9DQoNCi8qKg0KCUNvdW50IHdvcmRzDQoqLw0KDQoJZnVuY3Rpb24g cmFoX2NvbW1lbnRfc3BhbV93b3Jkcygkc3RyaW5nLCRycykgew0KCQlleHRyYWN0KCRycyk7 DQoJCQ0KCQlpZighJHN0cmluZyB8fCAoISRtYXh3b3JkcyAmJiAhJG1pbndvcmRzKSkNCgkJ CXJldHVybjsNCgkJDQoJCSR3b3JkcyA9IGNvdW50KGV4cGxvZGUoY2hyKDMyKSwkc3RyaW5n KSk7DQoJCQ0KCQlpZigoJG1heHdvcmRzICYmICRtYXh3b3JkcyA8ICR3b3JkcykgfHwgKCRt aW53b3JkcyAmJiAkd29yZHMgPD0gJG1pbndvcmRzKSkNCgkJCXJldHVybiAxOw0KCX0NCg0K LyoqDQoJTGltaXQgY29tbWVudCBwb3N0aW5nDQoqLw0KDQoJZnVuY3Rpb24gcmFoX2NvbW1l bnRfc3BhbV9saW1pdGNvbW1lbnRzKCRycykgew0KCQlnbG9iYWwgJHRoaXNhcnRpY2xlOw0K CQlleHRyYWN0KCRycyk7DQoJCQ0KCQlpZigNCgkJCSRjb21tZW50dXNlICE9ICd5ZXMnIHx8 IA0KCQkJISRjb21tZW50dGltZSB8fCANCgkJCSEkY29tbWVudGxpbWl0IHx8IA0KCQkJIWlz c2V0KCRfU0VSVkVSWydSRU1PVEVfQUREUiddKSB8fCANCgkJCSgkY29tbWVudGluID09ICd0 aGlzJyAmJiAhaXNzZXQoJHRoaXNhcnRpY2xlWydpZCddKSkNCgkJKQ0KCQkJcmV0dXJuOw0K CQkNCgkJaWYoDQoJCQlzYWZlX2NvdW50KA0KCQkJCSd0eHBfZGlzY3VzcycsDQoJCQkJImlw PSciLmRvU2xhc2goJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10pLiInIGFuZCAiLg0KCQkJCSJV TklYX1RJTUVTVEFNUChwb3N0ZWQpID4gKFVOSVhfVElNRVNUQU1QKG5vdygpKS0kY29tbWVu dHRpbWUpIi4NCgkJCQkoKCRjb21tZW50aW4gPT0gJ3RoaXMnKSA/ICIgYW5kIHBhcmVudGlk PSciLmRvU2xhc2goJHRoaXNhcnRpY2xlWydpZCddKS4iJyIgOiAnJykNCgkJCSkgPj0gJGNv bW1lbnRsaW1pdA0KCQkpDQoJCQlyZXR1cm4gMTsNCgl9DQoNCi8qKg0KCUNoZWNrIHR5cGlu ZyBzcGVlZC4gT25seSBib3RzIHdyaXRlIGV4dHJhIGZhc3QuLi4gYW5kIHRlcm1pbmF0b3Jz LA0KCWFuZCBDaHVjayBOb3JyaXMuIEhlIGRvZXNuJ3QgdHlwZSwgaGUuLi4ganVzdCBtYWtl cyB0ZXh0IGFwcGVhci4NCiovDQoNCglmdW5jdGlvbiByYWhfY29tbWVudF9zcGFtX3R5cGVf c3BlZWQoJHJzKSB7DQoNCgkJZXh0cmFjdCgkcnMpOw0KDQoJCWlmKCR1c2VfdHlwZV9kZXRl Y3QgPT0gJ25vJyB8fCAhaXNfbnVtZXJpYygkdHlwZV9pbnRlcnZhbCkpDQoJCQlyZXR1cm47 DQoNCgkJJHRpbWUgPSBwcygncmFoX2NvbW1lbnRfc3BhbV90aW1lJyk7DQoNCgkJaWYoIWlz X251bWVyaWMoJHRpbWUpKQ0KCQkJcmV0dXJuIDE7DQoNCgkJQCRub3cgPSBzdHJ0b3RpbWUo J25vdycpLSR0eXBlX2ludGVydmFsOw0KCQkkbWQ1ID0gbWQ1KCRub25jZS4kdGltZSk7DQoN CgkJaWYoJG1kNSAhPSBwcygncmFoX2NvbW1lbnRfc3BhbV9ub25jZScpIHx8ICR0aW1lID49 ICRub3cpDQoJCQlyZXR1cm4gMTsNCg0KCX0NCg0KLyoqDQoJQ2hlY2sgRE5TDQoqLw0KDQoJ ZnVuY3Rpb24gcmFoX2NvbW1lbnRfc3BhbV9kbnMoJGNoZWNraW5nLCRycykgew0KCQkNCgkJ ZXh0cmFjdCgkcnMpOw0KCQkNCgkJaWYoJGVtYWlsZG5zID09ICdubycgfHwgIXRyaW0oJGNo ZWNraW5nKSkNCgkJCXJldHVybjsNCgkJDQoJCSRjaGVja2luZyA9IGV4cGxvZGUoJ0AnLCRj aGVja2luZyk7DQoJCQ0KCQlpZihjb3VudCgkY2hlY2tpbmcpICE9IDIpDQoJCQlyZXR1cm4g MTsNCgkJDQoJCSRkb21haW4gPSB0cmltKCRjaGVja2luZ1sxXSk7DQoNCgkJaWYoISRkb21h aW4pDQoJCQlyZXR1cm4gMTsNCgkJDQoJCWlmKHN1YnN0cl9jb3VudCgkZG9tYWluLCcuJykg PT0gMCkNCgkJCXJldHVybiAxOw0KCQkNCgkJaWYoIWZ1bmN0aW9uX2V4aXN0cygnY2hlY2tk bnNycicpKQ0KCQkJcmV0dXJuOw0KCQkNCgkJaWYoIShjaGVja2Ruc3JyKCRkb21haW4sJ01Y JykgfHwgY2hlY2tkbnNycigkZG9tYWluLCdBJykpKQ0KCQkJcmV0dXJuIDE7DQoNCgl9DQoN Ci8qKg0KCURlbGl2ZXJzIHRoZSBwYW5lbHMNCiovDQoNCglmdW5jdGlvbiByYWhfY29tbWVu dF9zcGFtX3BhZ2UoKSB7DQoJCWdsb2JhbCAkc3RlcDsNCgkJcmVxdWlyZV9wcml2cygncmFo X2NvbW1lbnRfc3BhbScpOw0KCQlyYWhfY29tbWVudF9zcGFtX2luc3RhbGwoKTsNCgkJaWYo JHN0ZXAgPT0gJ3JhaF9jb21tZW50X3NwYW1fc2F2ZScpDQoJCQkkc3RlcCgpOw0KCQllbHNl DQoJCQlyYWhfY29tbWVudF9zcGFtX2VkaXQoKTsNCgl9DQoNCi8qKg0KCUFkZHMgQ1NTL0pT IHRvIDxoZWFkPiBmb3IgdGhlIHBhbmVsDQoqLw0KDQoJZnVuY3Rpb24gcmFoX2NvbW1lbnRf c3BhbV9oZWFkKCkgew0KCQkNCgkJZ2xvYmFsICRldmVudDsNCgkJDQoJCWlmKCRldmVudCAh PSAncmFoX2NvbW1lbnRfc3BhbScpDQoJCQlyZXR1cm47DQoJCQ0KCQllY2hvIDw8PEVPRg0K CQkJPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCgkJCQkjcmFoX2NvbW1lbnRfc3BhbV9jb250 YWluZXIgew0KCQkJCQl3aWR0aDogOTUwcHg7DQoJCQkJCW1hcmdpbjogMCBhdXRvOw0KCQkJ CX0NCgkJCQkjcmFoX2NvbW1lbnRfc3BhbV9jb250YWluZXIgaW5wdXQuZWRpdCwNCgkJCQkj cmFoX2NvbW1lbnRfc3BhbV9jb250YWluZXIgdGV4dGFyZWEgew0KCQkJCQl3aWR0aDogOTQw cHg7DQoJCQkJCXBhZGRpbmc6IDA7DQoJCQkJfQ0KCQkJCSNyYWhfY29tbWVudF9zcGFtX2Nv bnRhaW5lciBzZWxlY3Qgew0KCQkJCQl3aWR0aDogNjQwcHg7DQoJCQkJCXBhZGRpbmc6IDA7 DQoJCQkJfQ0KCQkJCSNyYWhfY29tbWVudF9zcGFtX2NvbnRhaW5lciAucmFoX2NvbW1lbnRf c3BhbV9tb3JlIHsNCgkJCQkJb3ZlcmZsb3c6IGhpZGRlbjsNCgkJCQl9DQoJCQkJI3JhaF9j b21tZW50X3NwYW1fbGltaXRhdGlvbnMgew0KCQkJCQltYXJnaW46IDAgMCAyMHB4IDA7DQoJ CQkJfQ0KCQkJCSNyYWhfY29tbWVudF9zcGFtX2xpbWl0YXRpb25zIGxhYmVsIHsNCgkJCQkJ d2lkdGg6IDE5MHB4Ow0KCQkJCQlmbG9hdDogbGVmdDsNCgkJCQkJbWFyZ2luOiAwOw0KCQkJ CQlwYWRkaW5nOiAwOw0KCQkJCX0NCgkJCQkjcmFoX2NvbW1lbnRfc3BhbV9jb250YWluZXIg I3JhaF9jb21tZW50X3NwYW1fbGltaXRhdGlvbnMgaW5wdXQuZWRpdCB7DQoJCQkJCXdpZHRo OiAxNzBweDsNCgkJCQl9DQoJCQkJI3JhaF9jb21tZW50X3NwYW1fY29udGFpbmVyIC5yYWhf Y29tbWVudF9zcGFtX2hlYWRpbmcgew0KCQkJCQlmb250LXdlaWdodDogOTAwOw0KCQkJCQlw YWRkaW5nOiA1cHggMDsNCgkJCQkJbWFyZ2luOiAwIDAgMTBweCAwOw0KCQkJCQlib3JkZXIt dG9wOiAxcHggc29saWQgI2NjYzsNCgkJCQkJYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNj Y2M7DQoJCQkJfQ0KCQkJCSNyYWhfY29tbWVudF9zcGFtX2NvbnRhaW5lciAucmFoX2NvbW1l bnRfc3BhbV9oZWFkaW5nIHNwYW4gew0KCQkJCQljdXJzb3I6IHBvaW50ZXI7DQoJCQkJCWNv bG9yOiAjOTYzOw0KCQkJCX0NCgkJCQkjcmFoX2NvbW1lbnRfc3BhbV9jb250YWluZXIgLnJh aF9jb21tZW50X3NwYW1faGVhZGluZyBzcGFuOmhvdmVyIHsNCgkJCQkJdGV4dC1kZWNvcmF0 aW9uOiB1bmRlcmxpbmU7DQoJCQkJfQ0KCQkJPC9zdHlsZT4NCgkJCTxzY3JpcHQgdHlwZT0i dGV4dC9qYXZhc2NyaXB0Ij4NCgkJCQkkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpew0K CQkJCQkkKCcucmFoX2NvbW1lbnRfc3BhbV9tb3JlJykuaGlkZSgpOw0KCQkJCQkkKCcucmFo X2NvbW1lbnRfc3BhbV9oZWFkaW5nJykuY2xpY2soZnVuY3Rpb24oKXsNCgkJCQkJCSQodGhp cykubmV4dCgnZGl2LnJhaF9jb21tZW50X3NwYW1fbW9yZScpLnNsaWRlVG9nZ2xlKCk7DQoJ CQkJCX0pOw0KCQkJCX0pOw0KCQkJPC9zY3JpcHQ+DQpFT0Y7DQoJfQ0KCQ0KLyoqDQoJUHJl ZmVyZW5jZXMgcGFuZWwNCiovDQoNCglmdW5jdGlvbiByYWhfY29tbWVudF9zcGFtX2VkaXQo JG1lc3NhZ2U9JycpIHsNCg0KCQlwYWdldG9wKCdDb21tZW50IEFudGlzcGFtJywkbWVzc2Fn ZSk7DQoNCgkJZXh0cmFjdCgNCgkJCXJhaF9jb21tZW50X3NwYW1fZmV0Y2goMSkNCgkJKTsN Cg0KCQkkY2hlY2sgPSBleHBsb2RlKCcsJywkY2hlY2spOw0KDQoJCWdsb2JhbCAkZXZlbnQ7 DQoJCQ0KCQlpZihlbXB0eSgkbm9uY2UpIHx8ICR1c2VfdHlwZV9kZXRlY3QgPT0gJ25vJykN CgkJCSRub25jZSA9IA0KCQkJCW1kNSh1bmlxaWQocmFuZCgpLHRydWUpKTsNCg0KCQllY2hv IG4uDQoJCQkJJwk8Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iaW5kZXgucGhwIiBpZD0i cmFoX2NvbW1lbnRfc3BhbV9jb250YWluZXIiPicubi4NCgkJCQknCQk8aDE+PHN0cm9uZz5y YWhfY29tbWVudF9zcGFtPC9zdHJvbmc+IHwgQ29tbWVudCBhbnRpLXNwYW0gdG9vbHM8L2gx Picubi4NCgkJCQknCQk8cD4mIzE4NzsgPGEgaHJlZj0iP2V2ZW50PXBsdWdpbiZhbXA7c3Rl cD1wbHVnaW5faGVscCZhbXA7bmFtZT1yYWhfY29tbWVudF9zcGFtIj5Eb2N1bWVudGF0aW9u PC9hPjwvcD4nLm4uDQoJCQkJJwkJPHA+Jy5uLg0KCQkJCScJCQk8c3Ryb25nPlByZWZlcmVu Y2VzOjwvc3Ryb25nPicubi4NCgkJCQknCQk8L3A+Jy5uLg0KCQkJCScJCTxwIHRpdGxlPSJD bGljayB0byBleHBhbmQiIGNsYXNzPSJyYWhfY29tbWVudF9zcGFtX2hlYWRpbmciPicubi4N CgkJCQknCQkJKyA8c3Bhbj5Qcm90ZWN0aW9uIG1ldGhvZCBhbmQgbWVzc2FnZXM8L3NwYW4+ Jy5uLg0KCQkJCScJCTwvcD4nLm4uDQoJCQkJJwkJPGRpdiBjbGFzcz0icmFoX2NvbW1lbnRf c3BhbV9tb3JlIj4nLm4uDQoJCQkJJwkJCTxwPicubi4NCgkJCQknCQkJCTxsYWJlbD4nLm4u DQoJCQkJJwkJCQkJUHJvdGVjdGlvbiBtZXRob2Q6PGJyIC8+Jy5uLg0KCQkJCScJCQkJCTxz ZWxlY3QgbmFtZT0ibWV0aG9kIj4nLm4uDQoJCQkJJwkJCQkJCTxvcHRpb24gdmFsdWU9ImJs b2NrIicuKCgkbWV0aG9kID09ICdibG9jaycpID8gJyBzZWxlY3RlZD0ic2VsZWN0ZWQiJyA6 ICcnKS4nPkJsb2NrIGFuZCBkb25cJ3Qgc2F2ZTwvb3B0aW9uPicubi4NCgkJCQknCQkJCQkJ PG9wdGlvbiB2YWx1ZT0ibW9kZXJhdGUiJy4oKCRtZXRob2QgPT0gJ21vZGVyYXRlJykgPyAn IHNlbGVjdGVkPSJzZWxlY3RlZCInIDogJycpLic+TW9kZXJhdGUgc3BhbTwvb3B0aW9uPicu bi4NCgkJCQknCQkJCQkJPG9wdGlvbiB2YWx1ZT0ic3BhbSInLigoJG1ldGhvZCA9PSAnc3Bh bScpID8gJyBzZWxlY3RlZD0ic2VsZWN0ZWQiJyA6ICcnKS4nPkZsYWcgYXMgc3BhbTwvb3B0 aW9uPicubi4NCgkJCQknCQkJCQk8L3NlbGVjdD4nLm4uDQoJCQkJJwkJCQk8L2xhYmVsPicu bi4NCgkJCQknCQkJPC9wPicubi4NCgkJCQknCQkJPHA+Jy5uLg0KCQkJCScJCQkJPGxhYmVs Picubi4NCgkJCQknCQkJCQlFcnJvciBtZXNzYWdlIGRpc3BsYXllZCB0byB0aGUgY29tbWVu dGF0b3I6PGJyIC8+Jy5uLg0KCQkJCScJCQkJCTxpbnB1dCBjbGFzcz0iZWRpdCIgdHlwZT0i dGV4dCIgbmFtZT0ibWVzc2FnZSIgdmFsdWU9IicuJG1lc3NhZ2UuJyIgLz4nLm4uDQoJCQkJ JwkJCQk8L2xhYmVsPicubi4NCgkJCQknCQkJPC9wPicubi4NCgkJCQknCQk8L2Rpdj4nLm4u DQoJCQkJJwkJPHAgdGl0bGU9IkNsaWNrIHRvIGV4cGFuZCIgY2xhc3M9InJhaF9jb21tZW50 X3NwYW1faGVhZGluZyI+Jy5uLg0KCQkJCScJCQkrIDxzcGFuPlNldCBjb21tZW50IG1lc3Nh Z2UgbGVuZ2h0IGxpbWl0YXRpb25zPC9zcGFuPicubi4NCgkJCQknCQk8L3A+Jy5uLg0KCQkJ CScJCTxkaXYgaWQ9InJhaF9jb21tZW50X3NwYW1fbGltaXRhdGlvbnMiIGNsYXNzPSJyYWhf Y29tbWVudF9zcGFtX21vcmUiPicubi4NCgkJCQknCQkJPHA+Jy5uLg0KCQkJCScJCQkJRmls bCBldmVyeSBmaWVsZCBvbmx5IHdpdGggZXZlbiBudW1iZXJzIGdyZWF0ZXIgdGhhbiAwLiBN aW5pbWFsIHZhbHVlIGlzIDEuICcubi4NCgkJCQknCQkJCUlmIGZpZWxkIGlzIGxlZnQgZW1w dHkgb3IgdmFsdWUgaXMgc2V0IHRvIDAgKHplcm8pLCB0aGUgbGltaXQgd2lsbCBiZSBkaXNh YmxlZC4nLm4uDQoJCQkJJwkJCTwvcD4nLm4uDQoJCQkJJwkJCTxsYWJlbD4nLm4uDQoJCQkJ JwkJCQlNYXggd29yZHM6PGJyIC8+Jy5uLg0KCQkJCScJCQkJPGlucHV0IGNsYXNzPSJlZGl0 IiB0eXBlPSJ0ZXh0IiBuYW1lPSJtYXh3b3JkcyIgdmFsdWU9IicuJG1heHdvcmRzLiciIC8+ Jy5uLg0KCQkJCScJCQk8L2xhYmVsPicubi4NCgkJCQknCQkJPGxhYmVsPicubi4NCgkJCQkn CQkJCU1pbiB3b3Jkczo8YnIgLz4nLm4uDQoJCQkJJwkJCQk8aW5wdXQgY2xhc3M9ImVkaXQi IHR5cGU9InRleHQiIG5hbWU9Im1pbndvcmRzIiB2YWx1ZT0iJy4kbWlud29yZHMuJyIgLz4n Lm4uDQoJCQkJJwkJCTwvbGFiZWw+Jy5uLg0KCQkJCScJCQk8bGFiZWw+Jy5uLg0KCQkJCScJ CQkJTWF4IGNoYXJhY3RlcnM6PGJyIC8+Jy5uLg0KCQkJCScJCQkJPGlucHV0IGNsYXNzPSJl ZGl0IiB0eXBlPSJ0ZXh0IiBuYW1lPSJtYXhjaGFycyIgdmFsdWU9IicuJG1heGNoYXJzLici IC8+Jy5uLg0KCQkJCScJCQk8L2xhYmVsPicubi4NCgkJCQknCQkJPGxhYmVsPicubi4NCgkJ CQknCQkJCU1pbiBjaGFyYWN0ZXJzOjxiciAvPicubi4NCgkJCQknCQkJCTxpbnB1dCBjbGFz cz0iZWRpdCIgdHlwZT0idGV4dCIgbmFtZT0ibWluY2hhcnMiIHZhbHVlPSInLiRtaW5jaGFy cy4nIiAvPicubi4NCgkJCQknCQkJPC9sYWJlbD4nLm4uDQoJCQkJJwkJPC9kaXY+Jy5uLg0K CQkJCScJCTxwIHRpdGxlPSJDbGljayB0byBleHBhbmQiIGNsYXNzPSJyYWhfY29tbWVudF9z cGFtX2hlYWRpbmciPicubi4NCgkJCQknCQkJKyA8c3Bhbj5VUkwgYW5kIGxpbmsgbGltaXRh dGlvbnM8L3NwYW4+Jy5uLg0KCQkJCScJCTwvcD4nLm4uDQoJCQkJJwkJPGRpdiBjbGFzcz0i cmFoX2NvbW1lbnRfc3BhbV9tb3JlIj4nLm4uDQoJCQkJJwkJCTxwPicubi4NCgkJCQknCQkJ CTxsYWJlbD4nLm4uDQoJCQkJJwkJCQkJTWF4aW11bSBhbW91bnQgb2YgVVJMcz8gSWYgc2V0 IHRvIHplcm8gKDApIG5vIFVSTHMgYXJlIGFsbG93ZWQgaW4gY29tbWVudHMuPGJyIC8+Jy5u Lg0KCQkJCScJCQkJCTxpbnB1dCBjbGFzcz0iZWRpdCIgdHlwZT0idGV4dCIgbmFtZT0idXJs Y291bnQiIHZhbHVlPSInLiR1cmxjb3VudC4nIiAvPicubi4NCgkJCQknCQkJCTwvbGFiZWw+ Jy5uLg0KCQkJCScJCQk8L3A+Jy5uLg0KCQkJCScJCTwvZGl2Picubi4NCgkJCQknCQk8cCB0 aXRsZT0iQ2xpY2sgdG8gZXhwYW5kIiBjbGFzcz0icmFoX2NvbW1lbnRfc3BhbV9oZWFkaW5n Ij4nLm4uDQoJCQkJJwkJCSsgPHNwYW4+RGVmaW5lIHNwYW0gd29yZCBmaWx0ZXJzPC9zcGFu Picubi4NCgkJCQknCQk8L3A+Jy5uLg0KCQkJCScJCTxkaXYgY2xhc3M9InJhaF9jb21tZW50 X3NwYW1fbW9yZSI+Jy5uLg0KCQkJCScJCQk8cD4nLm4uDQoJCQkJJwkJCQk8bGFiZWw+Jy5u Lg0KCQkJCScJCQkJCUxpc3Qgb2Ygc3BhbSB3b3Jkcy4gQ29tbWEgc2VwYXJhdGVkIGlmIG11 bHRpcGxlOjxiciAvPicubi4NCgkJCQknCQkJCQk8dGV4dGFyZWEgbmFtZT0ic3BhbXdvcmRz IiBjb2xzPSIzMCIgcm93cz0iOCI+Jy4kc3BhbXdvcmRzLic8L3RleHRhcmVhPicubi4NCgkJ CQknCQkJCTwvbGFiZWw+Jy5uLg0KCQkJCScJCQk8L3A+Jy5uLg0KCQkJCScJCQk8cD4nLm4u DQoJCQkJJwkJCQk8bGFiZWw+Jy5uLg0KCQkJCScJCQkJCU1heCBhbW91bnQgb2Ygc3BhbSB3 b3JkcyB1bnRpbCBjb21tZW50IGJlY29tZXMgYSBzcGFtICh6ZXJvIGlzIGluc3RhbnQpOjxi ciAvPicubi4NCgkJCQknCQkJCQk8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImVkaXQiIG5h bWU9Im1heHNwYW13b3JkcyIgdmFsdWU9IicuJG1heHNwYW13b3Jkcy4nIiAvPicubi4NCgkJ CQknCQkJCTwvbGFiZWw+Jy5uLg0KCQkJCScJCQk8L3A+Jy5uLg0KCQkJCScJCQk8cD5TZWFy Y2ggc3BhbSB3b3JkcyBmcm9tOjwvcD4nLm4uDQoJCQkJJwkJCTxwPicubi4NCgkJCQknCQkJ CTxsYWJlbD4nLm4uDQoJCQkJJwkJCQkJPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJj aGVja1tdIiB2YWx1ZT0ibWVzc2FnZSInLigoaW5fYXJyYXkoJ21lc3NhZ2UnLCRjaGVjaykp ID8gJyBjaGVja2VkPSJjaGVja2VkIicgOiAnJykuJyAvPicubi4NCgkJCQknCQkJCQlDb21t ZW50IG1lc3NhZ2UnLm4uDQoJCQkJJwkJCQk8L2xhYmVsPicubi4NCgkJCQknCQkJCTxsYWJl bD4nLm4uDQoJCQkJJwkJCQkJPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJjaGVja1td IiB2YWx1ZT0id2ViIicuKChpbl9hcnJheSgnd2ViJywkY2hlY2spKSA/ICcgY2hlY2tlZD0i Y2hlY2tlZCInIDogJycpLicgLz4nLm4uDQoJCQkJJwkJCQkJQ29tbWVudCB3ZWIgaW5wdXQn Lm4uDQoJCQkJJwkJCQk8L2xhYmVsPicubi4NCgkJCQknCQkJCTxsYWJlbD4nLm4uDQoJCQkJ JwkJCQkJPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJjaGVja1tdIiB2YWx1ZT0iZW1h aWwiJy4oKGluX2FycmF5KCdlbWFpbCcsJGNoZWNrKSkgPyAnIGNoZWNrZWQ9ImNoZWNrZWQi JyA6ICcnKS4nIC8+Jy5uLg0KCQkJCScJCQkJCUNvbW1lbnQgZW1haWwnLm4uDQoJCQkJJwkJ CQk8L2xhYmVsPicubi4NCgkJCQknCQkJCTxsYWJlbD4nLm4uDQoJCQkJJwkJCQkJPGlucHV0 IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJjaGVja1tdIiB2YWx1ZT0ibmFtZSInLigoaW5fYXJy YXkoJ25hbWUnLCRjaGVjaykpID8gJyBjaGVja2VkPSJjaGVja2VkIicgOiAnJykuJyAvPicu bi4NCgkJCQknCQkJCQlDb21tZW50YXRvciBuYW1lJy5uLg0KCQkJCScJCQkJPC9sYWJlbD4n Lm4uDQoJCQkJJwkJCTwvcD4nLm4uDQoJCQkJJwkJPC9kaXY+Jy5uLg0KCQkJCScJCTxwIHRp dGxlPSJDbGljayB0byBleHBhbmQiIGNsYXNzPSJyYWhfY29tbWVudF9zcGFtX2hlYWRpbmci Picubi4NCgkJCQknCQkJKyA8c3Bhbj5UaW1laW50ZXJ2YWxzIGFuZCBwb3N0aW5nIGxpbWl0 czwvc3Bhbj4nLm4uDQoJCQkJJwkJPC9wPicubi4NCgkJCQknCQk8ZGl2IGNsYXNzPSJyYWhf Y29tbWVudF9zcGFtX21vcmUiPicubi4NCgkJCQknCQkJPHA+Jy5uLg0KCQkJCScJCQkJQ29t bWVudGF0b3JzIHdpbGwgYmUgZGV0ZWN0ZWQgYmFzZWQgb24gdGhlIElQIGFkZHJlc3MuIElm IHRoZSBjb21tZW50YXRvciBleGNlZWRzIHRoZSBzZXQgYWN0aXZpdHkgJy5uLg0KCQkJCScJ CQkJbGltaXQsIHRoZSBjb21tZW50IHdpbGwgYmUgdHJlYXRlZCBhcyBzcGFtLicubi4NCgkJ CQknCQkJPC9wPicubi4NCgkJCQknCQkJPHA+Jy5uLg0KCQkJCScJCQkJPGxhYmVsPicubi4N CgkJCQknCQkJCQlVc2UgdGhlIGZlYXR1cmUgYW5kIGxpbWl0IHBvc3Rpbmc/PGJyIC8+Jy5u Lg0KCQkJCScJCQkJCTxzZWxlY3QgbmFtZT0iY29tbWVudHVzZSI+Jy5uLg0KCQkJCScJCQkJ CQk8b3B0aW9uIHZhbHVlPSJ5ZXMiJy4oKCRjb21tZW50dXNlID09ICd5ZXMnKSA/ICcgc2Vs ZWN0ZWQ9InNlbGVjdGVkIicgOiAnJykuJz5ZZXM8L29wdGlvbj4nLm4uDQoJCQkJJwkJCQkJ CTxvcHRpb24gdmFsdWU9Im5vIicuKCgkY29tbWVudHVzZSA9PSAnbm8nKSA/ICcgc2VsZWN0 ZWQ9InNlbGVjdGVkIicgOiAnJykuJz5Obzwvb3B0aW9uPicubi4NCgkJCQknCQkJCQk8L3Nl bGVjdD4nLm4uDQoJCQkJJwkJCQk8L2xhYmVsPicubi4NCgkJCQknCQkJPC9wPicubi4NCgkJ CQknCQkJPHA+Jy5uLg0KCQkJCScJCQkJPGxhYmVsPicubi4NCgkJCQknCQkJCQlDb3VudCBj b21tZW50cyBpbiBhcnRpY2xlczo8YnIgLz4nLm4uDQoJCQkJJwkJCQkJPHNlbGVjdCBuYW1l PSJjb21tZW50aW4iPicubi4NCgkJCQknCQkJCQkJPG9wdGlvbiB2YWx1ZT0iYWxsIicuKCgk Y29tbWVudGluID09ICdhbGwnKSA/ICcgc2VsZWN0ZWQ9InNlbGVjdGVkIicgOiAnJykuJz5B bGwgYXJ0aWNsZXM8L29wdGlvbj4nLm4uDQoJCQkJJwkJCQkJCTxvcHRpb24gdmFsdWU9InRo aXMiJy4oKCRjb21tZW50aW4gPT0gJ3RoaXMnKSA/ICcgc2VsZWN0ZWQ9InNlbGVjdGVkIicg OiAnJykuJz5Vc2VyIGN1cnJlbnRseSB2aWV3aW5nIGFuZCBjb21tZW50aW5nPC9vcHRpb24+ Jy5uLg0KCQkJCScJCQkJCTwvc2VsZWN0Picubi4NCgkJCQknCQkJCTwvbGFiZWw+Jy5uLg0K CQkJCScJCQk8L3A+Jy5uLg0KCQkJCScJCQk8cD4nLm4uDQoJCQkJJwkJCQk8bGFiZWw+Jy5u Lg0KCQkJCScJCQkJCU1heGltdW0gbnVtYmVyIG9mIHBvc3RzOjxiciAvPicubi4NCgkJCQkn CQkJCQk8aW5wdXQgY2xhc3M9ImVkaXQiIHR5cGU9InRleHQiIG5hbWU9ImNvbW1lbnRsaW1p dCIgdmFsdWU9IicuJGNvbW1lbnRsaW1pdC4nIiAvPicubi4NCgkJCQknCQkJCTwvbGFiZWw+ Jy5uLg0KCQkJCScJCQkJPGxhYmVsPicubi4NCgkJCQknCQkJCQlXaXRoaW4gbGFzdCB4IHNl Y29uZHM6PGJyIC8+Jy5uLg0KCQkJCScJCQkJCTxpbnB1dCBjbGFzcz0iZWRpdCIgdHlwZT0i dGV4dCIgbmFtZT0iY29tbWVudHRpbWUiIHZhbHVlPSInLiRjb21tZW50dGltZS4nIiAvPicu bi4NCgkJCQknCQkJCTwvbGFiZWw+Jy5uLg0KCQkJCScJCQk8L3A+Jy5uLg0KCQkJCScJCTwv ZGl2Picubi4NCgkJCQknCQk8cCB0aXRsZT0iQ2xpY2sgdG8gZXhwYW5kIiBjbGFzcz0icmFo X2NvbW1lbnRfc3BhbV9oZWFkaW5nIj4nLm4uDQoJCQkJJwkJCSsgPHNwYW4+SGlkZGVuIHNw YW0gdHJhcDwvc3Bhbj4nLm4uDQoJCQkJJwkJPC9wPicubi4NCgkJCQknCQk8ZGl2IGNsYXNz PSJyYWhfY29tbWVudF9zcGFtX21vcmUiPicubi4JDQoJCQkJJwkJCTxwPicubi4NCgkJCQkn CQkJCUFkZHMgYSBoaWRkZW4gc3BhbSB0cmFwIGZpZWxkIHRvIHRoZSBjb21tZW50IGZvcm0u IFRoZSBmaWVsZCBpcyBtYWRlIGludmlzaWJsZSB0byBub3JtYWwgdXNlcnMgd2l0aCAnLm4u DQoJCQkJJwkJCQk8YWJiciB0aXRsZT0iQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cyI+Q1NTPC9h YmJyPi4gSWYgdGhlIGZpZWxkIGlzIGZpbGxlZCwgYnkgYm90IHVzdWFsbHksIHRoZSBjb21t ZW50IGlzICcubi4NCgkJCQknCQkJCW1hcmtlZCBhcyBzcGFtLiBMZWF2ZSB0aGUgZmllbGQg YmVsb3cgZW1wdHkgaWYgeW91IGRvblwndCB3YW50IHRvIHVzZSB0aGlzIGZlYXR1cmUuJy5u Lg0KCQkJCScJCQk8L3A+Jy5uLg0KCQkJCScJCQk8cD4nLm4uDQoJCQkJJwkJCQk8bGFiZWw+ Jy5uLg0KCQkJCScJCQkJCU5hbWUgb2YgdGhlIGZpZWxkIChpZiBlbXB0eSBub3QgdXNlZCk6 Jy5uLg0KCQkJCScJCQkJCTxpbnB1dCBjbGFzcz0iZWRpdCIgdHlwZT0idGV4dCIgbmFtZT0i ZmllbGQiIHZhbHVlPSInLiRmaWVsZC4nIiAvPicubi4NCgkJCQknCQkJCTwvbGFiZWw+Jy5u Lg0KCQkJCScJCQk8L3A+Jy5uLg0KCQkJCScJCTwvZGl2Picubi4NCgkJCQknCQk8cCB0aXRs ZT0iQ2xpY2sgdG8gZXhwYW5kIiBjbGFzcz0icmFoX2NvbW1lbnRfc3BhbV9oZWFkaW5nIj4n Lm4uDQoJCQkJJwkJCSsgPHNwYW4+RE5TIHZhbGlkYXRpb248L3NwYW4+Jy5uLg0KCQkJCScJ CTwvcD4nLm4uDQoJCQkJJwkJPGRpdiBjbGFzcz0icmFoX2NvbW1lbnRfc3BhbV9tb3JlIj4n Lm4uDQoJCQkJJwkJCTxwPicubi4NCgkJCQknCQkJCUNoZWNrcyB0aGUgZW1haWwgYWRkcmVz c1wnIDxhYmJyIHRpdGxlPSJEb21haW4gTmFtZSBTeXN0ZW0iPkROUzwvYWJicj4gcmVjb3Jk cy4nLm4uDQoJCQkJJwkJCQlJZiB0aGUgZW1haWxcJ3MgZG9tYWluIGlzIGZvdW5kIHRvIGJl IG5vbi1leGlzdGVudCwgdGhlIGNvbW1lbnQgd2lsbCBiZSB0cmVhdGVkIGFzIGEgc3BhbS4n Lm4uDQoJCQkJJwkJCQlUaGUgZmVhdHVyZSByZXF1aXJlcyA8YSBocmVmPSJodHRwOi8vcGhw Lm5ldC9tYW51YWwvZW4vZnVuY3Rpb24uY2hlY2tkbnNyci5waHAiPmNoZWNrZG5zcnIoKTwv YT4gJy5uLg0KCQkJCScJCQkJYW5kIHNlcnZlciBtdXN0IGJlIGFsbG93ZWQgdG8gbWFrZSBv dXRnb2luZyBjb25uZWN0aW9ucy4nLm4uDQoJCQkJJwkJCTwvcD4nLm4uDQoJCQkJJwkJCTxw Picubi4NCgkJCQknCQkJCTxsYWJlbD4nLm4uDQoJCQkJJwkJCQkJVXNlIEROUyB2YWxpZGF0 aW9uPzxiciAvPicubi4NCgkJCQknCQkJCQk8c2VsZWN0IG5hbWU9ImVtYWlsZG5zIj4nLm4u DQoJCQkJJwkJCQkJCTxvcHRpb24gdmFsdWU9Im5vIicuKCgkZW1haWxkbnMgPT0gJ25vJykg PyAnIHNlbGVjdGVkPSJzZWxlY3RlZCInIDogJycpLic+Tm88L29wdGlvbj4nLm4uDQoJCQkJ JwkJCQkJCTxvcHRpb24gdmFsdWU9InllcyInLigoJGVtYWlsZG5zID09ICd5ZXMnKSA/ICcg c2VsZWN0ZWQ9InNlbGVjdGVkIicgOiAnJykuJz5ZZXM8L29wdGlvbj4nLm4uDQoJCQkJJwkJ CQkJPC9zZWxlY3Q+Jy5uLg0KCQkJCScJCQkJPC9sYWJlbD4nLm4uDQoJCQkJJwkJCTwvcD4n Lm4uDQoJCQkJJwkJPC9kaXY+Jy5uLg0KCQkJCScJCTxwIHRpdGxlPSJDbGljayB0byBleHBh bmQiIGNsYXNzPSJyYWhfY29tbWVudF9zcGFtX2hlYWRpbmciPicubi4NCgkJCQknCQkJKyA8 c3Bhbj5SZXF1aXJlIGNvbW1lbnQgZm9ybSBpbnRlcmFjdGlvbjwvc3Bhbj4nLm4uDQoJCQkJ JwkJPC9wPicubi4NCgkJCQknCQk8ZGl2IGNsYXNzPSJyYWhfY29tbWVudF9zcGFtX21vcmUi Picubi4NCgkJCQknCQkJPHA+Jy5uLg0KCQkJCScJCQkJTWFrZXMgc3VyZSB0aGF0IHRoZSB1 c2VyIHNwZW50IHNldCBhbW91bnQgb2YgdGltZSB3cml0aW5nIHRoZSBjb21tZW50LiBJbnN0 YW50IHBvc3RlcnMgd2lsbCBiZSB0cmVhdGVkIGFzIHNwYW1tZXJzLicubi4NCgkJCQknCQkJ CVVzdWFsbHkgaXRcJ3MgcmVjb21tZW5kZWQgdG8ga2VlcCB0aGlzIGZlYXR1cmUgZGlzYWJs ZWQuIEl0IGNhbiBhY2NpZGVudGx5IGJsb2NrIGZhc3QgdHlwZXJzLCBpZiB0aGUgcmVxdWly ZWQgInR5cGluZyIgJy5uLg0KCQkJCScJCQkJdGltZSBpcyBzZXQgdG8gdG9vIGhpZ2gsIGJ1 dCBpdCBjYW4gYWxzbyBzdWNjZXNmdWxseSBibG9jayBzcGFtbWVyIGJvdHMgd2hpY2ggbWln aHQgaW5zdGFudHBvc3QsIHVubGlrZSBub3JtYWwgdXNlcnMuICcubi4NCgkJCQknCQkJCVRo ZSB0aW1lIGlzIGNvdW50ZWQgZnJvbSBpbnRpYWwgYXJ0aWNsZSBwYWdlIHJlcXVlc3QgdG8g dGhlIGNvbW1lbnQgc3VibWl0dGluZy4gQmUgYXdhcmUsIHRoZSBmZWF0dXJlIGlzIG9ubHkg aW50ZW5kZWQgYWdhaW5zdCBtaW5kbGVzcyBib3RzLicubi4NCgkJCQknCQkJPC9wPicubi4N CgkJCQknCQkJPHA+Jy5uLg0KCQkJCScJCQkJPGxhYmVsPicubi4NCgkJCQknCQkJCQlVc2Ug dGhlIGZlYXR1cmUgdmFsaWRhdGlvbiwgYW5kIGJsb2NrIHRob3NlIHRoYXQgdHJ5IHRvIHBv c3Qgd2l0aG91dCBzcGVuZGluZyBzZXQgcGVyaW9kIG9mIHRpbWUgdG8gd3JpdGluZyB0aGUg Y29tbWVudD88YnIgLz4nLm4uDQoJCQkJJwkJCQkJPHNlbGVjdCBuYW1lPSJ1c2VfdHlwZV9k ZXRlY3QiPicubi4NCgkJCQknCQkJCQkJPG9wdGlvbiB2YWx1ZT0ibm8iJy4oKCR1c2VfdHlw ZV9kZXRlY3QgPT0gJ25vJykgPyAnIHNlbGVjdGVkPSJzZWxlY3RlZCInIDogJycpLic+Tm88 L29wdGlvbj4nLm4uDQoJCQkJJwkJCQkJCTxvcHRpb24gdmFsdWU9InllcyInLigoJHVzZV90 eXBlX2RldGVjdCA9PSAneWVzJykgPyAnIHNlbGVjdGVkPSJzZWxlY3RlZCInIDogJycpLic+ WWVzPC9vcHRpb24+Jy5uLg0KCQkJCScJCQkJCTwvc2VsZWN0Picubi4NCgkJCQknCQkJCTwv bGFiZWw+Jy5uLg0KCQkJCScJCQk8L3A+Jy5uLg0KCQkJCScJCQk8cD4nLm4uDQoJCQkJJwkJ CQk8bGFiZWw+Jy5uLg0KCQkJCScJCQkJCVRoZSB0aW1lIHJlcXVpcmVkIGluIHNlY29uZHM6 Jy5uLg0KCQkJCScJCQkJCTxpbnB1dCBjbGFzcz0iZWRpdCIgdHlwZT0idGV4dCIgbmFtZT0i dHlwZV9pbnRlcnZhbCIgdmFsdWU9IicuJHR5cGVfaW50ZXJ2YWwuJyIgLz4nLm4uDQoJCQkJ JwkJCQk8L2xhYmVsPicubi4NCgkJCQknCQkJPC9wPicubi4NCgkJCQknCQk8L2Rpdj4nLm4u DQoJCQkJJwkJPHA+PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IlNhdmUgc2V0dGluZ3Mi IGNsYXNzPSJwdWJsaXNoIiAvPjwvcD4nLm4uDQoJCQkJJwkJPGlucHV0IHR5cGU9ImhpZGRl biIgbmFtZT0iZXZlbnQiIHZhbHVlPSInLiRldmVudC4nIiAvPicubi4NCgkJCQknCQk8aW5w dXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzdGVwIiB2YWx1ZT0icmFoX2NvbW1lbnRfc3BhbV9z YXZlIiAvPicubi4NCgkJCQknCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJub25jZSIg dmFsdWU9IicuJG5vbmNlLiciIC8+Jy5uLg0KCQkJCScJPC9mb3JtPicubjsNCgl9DQoNCi8q Kg0KCUluc3RhbGxhdGlvbiBzY3JpcHQNCiovDQoNCglmdW5jdGlvbiByYWhfY29tbWVudF9z cGFtX2luc3RhbGwoKSB7DQoJCXNhZmVfcXVlcnkoDQoJCQkiQ1JFQVRFIFRBQkxFIElGIE5P VCBFWElTVFMgIi5zYWZlX3BmeCgncmFoX2NvbW1lbnRfc3BhbScpLiIgKA0KCQkJCWBuYW1l YCBWQVJDSEFSKDI1NSkgTk9UIE5VTEwgLA0KCQkJCWB2YWx1ZWAgTE9OR1RFWFQgTk9UIE5V TEwsDQoJCQlQUklNQVJZIEtFWShgbmFtZWApKSINCgkJKTsNCgkJDQoJCWZvcmVhY2gocmFo X2NvbW1lbnRfc3BhbV92YXJzKCkgYXMgJGtleSA9PiAkdmFsKSB7DQoJCQlpZigNCgkJCQlz YWZlX2NvdW50KA0KCQkJCQkncmFoX2NvbW1lbnRfc3BhbScsDQoJCQkJCSJuYW1lPSciLmRv U2xhc2goJGtleSkuIiciDQoJCQkJKSA9PSAwDQoJCQkpIA0KCQkJCXNhZmVfaW5zZXJ0KA0K CQkJCQkicmFoX2NvbW1lbnRfc3BhbSIsDQoJCQkJCSJuYW1lPSciLmRvU2xhc2goJGtleSku IicsdmFsdWU9JyIuZG9TbGFzaCgkdmFsKS4iJyINCgkJCQkpOw0KCQl9DQoJfQ0KDQovKioN CglEZWZhdWx0IHByZWZlcmVuY2VzDQoqLw0KDQoJZnVuY3Rpb24gcmFoX2NvbW1lbnRfc3Bh bV92YXJzKCkgew0KCQlyZXR1cm4gIA0KCQkJYXJyYXkoDQoJCQkJJ3NwYW13b3JkcycgPT4g J1tVUkxdLCB2aWFncmEsIHBlbmlzJywNCgkJCQknbWV0aG9kJyA9PiAnYmxvY2snLA0KCQkJ CSdtZXNzYWdlJyA9PiAnWW91ciBjb21tZW50IHdhcyBtYXJrZWQgYXMgc3BhbS4nLA0KCQkJ CSdmaWVsZCcgPT4gJ3Bob25lJywNCgkJCQkndXJsY291bnQnID0+ICczJywNCgkJCQknbWF4 c3BhbXdvcmRzJyA9PiAnMCcsDQoJCQkJJ21heHdvcmRzJyA9PiAnMjAwJywNCgkJCQknbWlu d29yZHMnID0+ICcxJywNCgkJCQknbWF4Y2hhcnMnID0+ICcyMDAwJywNCgkJCQknbWluY2hh cnMnID0+ICcyJywNCgkJCQknY2hlY2snID0+ICdtZXNzYWdlLHdlYixuYW1lJywNCgkJCQkn Y29tbWVudGxpbWl0JyA9PiAnMTAnLA0KCQkJCSdjb21tZW50aW4nID0+ICdhbGwnLA0KCQkJ CSdjb21tZW50dXNlJyA9PiAneWVzJywNCgkJCQknY29tbWVudHRpbWUnID0+ICczMDAnLA0K CQkJCSdlbWFpbGRucycgPT4gJ25vJywNCgkJCQkndXNlX3R5cGVfZGV0ZWN0JyA9PiAnbm8n LA0KCQkJCSdub25jZScgPT4gJycsDQoJCQkJJ3R5cGVfaW50ZXJ2YWwnID0+ICc1Jw0KCQkJ KQ0KCQk7DQoJfQ0KDQovKioNCglTYXZlcyBwcmVmZXJlbmNlcw0KKi8NCg0KCWZ1bmN0aW9u IHJhaF9jb21tZW50X3NwYW1fc2F2ZSgpIHsNCg0KCQlmb3JlYWNoKHJhaF9jb21tZW50X3Nw YW1fdmFycygpIGFzICRrZXkgPT4gJHZhbHVlKSB7DQoJCQkkdmFsID0gcHMoJGtleSk7DQoJ CQlpZihpc19hcnJheSgkdmFsKSkNCgkJCQkkdmFsID0gaW1wbG9kZSgnLCcsJHZhbCk7DQoJ CQkNCgkJCXNhZmVfdXBkYXRlKA0KCQkJCSdyYWhfY29tbWVudF9zcGFtJywNCgkJCQkidmFs dWU9JyIuZG9TbGFzaCgkdmFsKS4iJyIsDQoJCQkJIm5hbWU9JyIuZG9TbGFzaCgka2V5KS4i JyINCgkJCSk7DQoJCX0NCg0KCQlyYWhfY29tbWVudF9zcGFtX2VkaXQoJ1NwYW0gcHJlZmVy ZW5jZXMgc2F2ZWQuJyk7DQoJfQ0KDQovKioNCglGZXRjaCBwcmVmZXJlbmNlcyBpbnRvIGFy cmF5DQoqLw0KDQoJZnVuY3Rpb24gcmFoX2NvbW1lbnRfc3BhbV9mZXRjaCgkZXNjYXBlPTAp IHsNCgkJJG91dCA9IGFycmF5KCk7DQoNCgkJJHJzID0gDQoJCQlzYWZlX3Jvd3MoDQoJCQkJ JyonLA0KCQkJCSdyYWhfY29tbWVudF9zcGFtJywNCgkJCQknMT0xJw0KCQkJKQ0KCQk7DQoN CgkJZm9yZWFjaCgkcnMgYXMgJGEpIHsNCgkJCWlmKCRlc2NhcGUgPT0gMSkgDQoJCQkJJGFb J3ZhbHVlJ10gPSBodG1sc3BlY2lhbGNoYXJzKCRhWyd2YWx1ZSddKTsNCgkJCSRvdXRbJGFb J25hbWUnXV0gPSAkYVsndmFsdWUnXTsNCgkJfQ0KDQoJCXJldHVybiAkb3V0Ow0KCX0iO3M6 NDoidHlwZSI7czoxOiIxIjtzOjU6Im9yZGVyIjtzOjE6IjUiO3M6MzoibWQ1IjtzOjMyOiJm ZWFkMTc5NDA4MTRhZmExMThmN2E1NGNmNmFmOTk5OCI7czo0OiJuYW1lIjtzOjE2OiJyYWhf Y29tbWVudF9zcGFtIjtzOjc6InZlcnNpb24iO3M6MzoiMC41Ijt9