| 1 |
- {"remainingRequest":"/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/thread-loader/dist/cjs.js!/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/babel-loader/lib/index.js!/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/element-ui/lib/element-ui.common.js","dependencies":[{"path":"/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/element-ui/lib/element-ui.common.js","mtime":499162500000},{"path":"/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/cache-loader/dist/cjs.js","mtime":499162500000},{"path":"/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/thread-loader/dist/cjs.js","mtime":499162500000},{"path":"/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/babel-loader/lib/index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbCIpO3JlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuZGVzY3JpcHRpb24iKTtyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLml0ZXJhdG9yIik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC50by1zdHJpbmctdGFnIik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmNvbmNhdCIpO3JlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5ldmVyeSIpO3JlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWxsIik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbHRlciIpO3JlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maW5kIik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZvci1lYWNoIik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmluY2x1ZGVzIik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmluZGV4LW9mIik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmpvaW4iKTtyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkubWFwIik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnJlZHVjZSIpO3JlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zbGljZSIpO3JlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zb21lIik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNwbGljZSIpO3JlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5mdW5jdGlvbi5uYW1lIik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLmpzb24udG8tc3RyaW5nLXRhZyIpO3JlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5tYXRoLnRvLXN0cmluZy10YWciKTtyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmNvbnN0cnVjdG9yIik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5pcy1uYW4iKTtyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLnBhcnNlLWZsb2F0Iik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci50by1maXhlZCIpO3JlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZnJlZXplIik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5rZXlzIik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmciKTtyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnZhbHVlcyIpO3JlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuY29uc3RydWN0b3IiKTtyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmV4ZWMiKTtyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRvLXN0cmluZyIpO3JlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaW5jbHVkZXMiKTtyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yIik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5tYXRjaCIpO3JlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwbGFjZSIpO3JlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc3BsaXQiKTtyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0iKTtyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmZpeGVkIik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5saW5rIik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zbWFsbCIpO3JlcXVpcmUoImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoIik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3IiKTtyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvd2ViLnVybCIpO3ZhciBfdHlwZW9mMj1yZXF1aXJlKCIvdXNyL2xvY2FsL2RldmVsb3AvcGhwL3d3dy93YWliYW8vcHJvamVjdC9OTjIwMjAwNjA4MDEvYWRkb25zL2FkbWluL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZiIpO21vZHVsZS5leHBvcnRzPS8qKioqKiovZnVuY3Rpb24obW9kdWxlcyl7Ly8gd2VicGFja0Jvb3RzdHJhcAovKioqKioqLyAvLyBUaGUgbW9kdWxlIGNhY2hlCi8qKioqKiovdmFyIGluc3RhbGxlZE1vZHVsZXM9e307LyoqKioqKi8gLyoqKioqKi8gLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb24KLyoqKioqKi9mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKXsvKioqKioqLyAvKioqKioqLyAvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGUKLyoqKioqKi9pZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSl7LyoqKioqKi9yZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0czsvKioqKioqL30vKioqKioqLyAvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKQovKioqKioqL3ZhciBtb2R1bGU9aW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF09ey8qKioqKiovaTptb2R1bGVJZCwvKioqKioqL2w6ZmFsc2UsLyoqKioqKi9leHBvcnRzOnt9LyoqKioqKi99Oy8qKioqKiovIC8qKioqKiovIC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvbgovKioqKioqL21vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsbW9kdWxlLG1vZHVsZS5leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pOy8qKioqKiovIC8qKioqKiovIC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWQKLyoqKioqKi9tb2R1bGUubD10cnVlOy8qKioqKiovIC8qKioqKiovIC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlCi8qKioqKiovcmV0dXJuIG1vZHVsZS5leHBvcnRzOy8qKioqKiovfS8qKioqKiovIC8qKioqKiovIC8qKioqKiovIC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pCi8qKioqKiovX193ZWJwYWNrX3JlcXVpcmVfXy5tPW1vZHVsZXM7LyoqKioqKi8gLyoqKioqKi8gLy8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGUKLyoqKioqKi9fX3dlYnBhY2tfcmVxdWlyZV9fLmM9aW5zdGFsbGVkTW9kdWxlczsvKioqKioqLyAvKioqKioqLyAvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHMKLyoqKioqKi9fX3dlYnBhY2tfcmVxdWlyZV9fLmQ9ZnVuY3Rpb24oZXhwb3J0cyxuYW1lLGdldHRlcil7LyoqKioqKi9pZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsbmFtZSkpey8qKioqKiovT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsbmFtZSx7ZW51bWVyYWJsZTp0cnVlLGdldDpnZXR0ZXJ9KTsvKioqKioqL30vKioqKioqL307LyoqKioqKi8gLyoqKioqKi8gLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0cwovKioqKioqL19fd2VicGFja19yZXF1aXJlX18ucj1mdW5jdGlvbihleHBvcnRzKXsvKioqKioqL2lmKHR5cGVvZiBTeW1ib2whPT0ndW5kZWZpbmVkJyYmU3ltYm9sLnRvU3RyaW5nVGFnKXsvKioqKioqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6J01vZHVsZSd9KTsvKioqKioqL30vKioqKioqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCdfX2VzTW9kdWxlJyx7dmFsdWU6dHJ1ZX0pOy8qKioqKiovfTsvKioqKioqLyAvKioqKioqLyAvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3QKLyoqKioqKi8gLy8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0Ci8qKioqKiovIC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBucwovKioqKioqLyAvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3QKLyoqKioqKi8gLy8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZQovKioqKioqL19fd2VicGFja19yZXF1aXJlX18udD1mdW5jdGlvbih2YWx1ZSxtb2RlKXsvKioqKioqL2lmKG1vZGUmMSl2YWx1ZT1fX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTsvKioqKioqL2lmKG1vZGUmOClyZXR1cm4gdmFsdWU7LyoqKioqKi9pZihtb2RlJjQmJl90eXBlb2YyKHZhbHVlKT09PSdvYmplY3QnJiZ2YWx1ZSYmdmFsdWUuX19lc01vZHVsZSlyZXR1cm4gdmFsdWU7LyoqKioqKi92YXIgbnM9T2JqZWN0LmNyZWF0ZShudWxsKTsvKioqKioqL19fd2VicGFja19yZXF1aXJlX18ucihucyk7LyoqKioqKi9PYmplY3QuZGVmaW5lUHJvcGVydHkobnMsJ2RlZmF1bHQnLHtlbnVtZXJhYmxlOnRydWUsdmFsdWU6dmFsdWV9KTsvKioqKioqL2lmKG1vZGUmMiYmdHlwZW9mIHZhbHVlIT0nc3RyaW5nJylmb3IodmFyIGtleSBpbiB2YWx1ZSl7X193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLGtleSxmdW5jdGlvbihrZXkpe3JldHVybiB2YWx1ZVtrZXldO30uYmluZChudWxsLGtleSkpO30vKioqKioqL3JldHVybiBuczsvKioqKioqL307LyoqKioqKi8gLyoqKioqKi8gLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXMKLyoqKioqKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm49ZnVuY3Rpb24obW9kdWxlKXsvKioqKioqL3ZhciBnZXR0ZXI9bW9kdWxlJiZtb2R1bGUuX19lc01vZHVsZT8vKioqKioqL2Z1bmN0aW9uIGdldERlZmF1bHQoKXtyZXR1cm4gbW9kdWxlWydkZWZhdWx0J107fTovKioqKioqL2Z1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKXtyZXR1cm4gbW9kdWxlO307LyoqKioqKi9fX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCdhJyxnZXR0ZXIpOy8qKioqKiovcmV0dXJuIGdldHRlcjsvKioqKioqL307LyoqKioqKi8gLyoqKioqKi8gLy8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsCi8qKioqKiovX193ZWJwYWNrX3JlcXVpcmVfXy5vPWZ1bmN0aW9uKG9iamVjdCxwcm9wZXJ0eSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QscHJvcGVydHkpO307LyoqKioqKi8gLyoqKioqKi8gLy8gX193ZWJwYWNrX3B1YmxpY19wYXRoX18KLyoqKioqKi9fX3dlYnBhY2tfcmVxdWlyZV9fLnA9Ii9kaXN0LyI7LyoqKioqKi8gLyoqKioqKi8gLyoqKioqKi8gLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzCi8qKioqKiovcmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zPTQ1KTsvKioqKioqL30oLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLyoqKioqKi9bLyogMCAqLyAvKioqL2Z1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1yZXF1aXJlKCJlbGVtZW50LXVpL2xpYi91dGlscy9kYXRlLXV0aWwiKTsvKioqL30sLyogMSAqLyAvKioqL2Z1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1yZXF1aXJlKCJlbGVtZW50LXVpL2xpYi91dGlscy9kb20iKTsvKioqL30sLyogMiAqLyAvKioqL2Z1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1yZXF1aXJlKCJlbGVtZW50LXVpL2xpYi91dGlscy91dGlsIik7LyoqKi99LC8qIDMgKi8gLyoqKi9mdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9cmVxdWlyZSgiZWxlbWVudC11aS9saWIvbWl4aW5zL2VtaXR0ZXIiKTsvKioqL30sLyogNCAqLyAvKioqL2Z1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1yZXF1aXJlKCJlbGVtZW50LXVpL2xpYi9taXhpbnMvbG9jYWxlIik7LyoqKi99LC8qIDUgKi8gLyoqKi9mdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9cmVxdWlyZSgiZWxlbWVudC11aS9saWIvdXRpbHMvdnVlLXBvcHBlciIpOy8qKiovfSwvKiA2ICovIC8qKiovZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPXJlcXVpcmUoInZ1ZSIpOy8qKiovfSwvKiA3ICovIC8qKiovZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPXJlcXVpcmUoImVsZW1lbnQtdWkvbGliL3V0aWxzL21lcmdlIik7LyoqKi99LC8qIDggKi8gLyoqKi9mdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9cmVxdWlyZSgiZWxlbWVudC11aS9saWIvaW5wdXQiKTsvKioqL30sLyogOSAqLyAvKioqL2Z1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1yZXF1aXJlKCJlbGVtZW50LXVpL2xpYi9taXhpbnMvbWlncmF0aW5nIik7LyoqKi99LC8qIDEwICovIC8qKiovZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPXJlcXVpcmUoImVsZW1lbnQtdWkvbGliL3V0aWxzL2NsaWNrb3V0c2lkZSIpOy8qKiovfSwvKiAxMSAqLyAvKioqL2Z1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1yZXF1aXJlKCJlbGVtZW50LXVpL2xpYi9sb2NhbGUiKTsvKioqL30sLyogMTIgKi8gLyoqKi9mdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9cmVxdWlyZSgiZWxlbWVudC11aS9saWIvYnV0dG9uIik7LyoqKi99LC8qIDEzICovIC8qKiovZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPXJlcXVpcmUoImVsZW1lbnQtdWkvbGliL3V0aWxzL3Jlc2l6ZS1ldmVudCIpOy8qKiovfSwvKiAxNCAqLyAvKioqL2Z1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1yZXF1aXJlKCJlbGVtZW50LXVpL2xpYi91dGlscy9wb3B1cCIpOy8qKiovfSwvKiAxNSAqLyAvKioqL2Z1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1yZXF1aXJlKCJ0aHJvdHRsZS1kZWJvdW5jZS9kZWJvdW5jZSIpOy8qKiovfSwvKiAxNiAqLyAvKioqL2Z1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1yZXF1aXJlKCJlbGVtZW50LXVpL2xpYi9jaGVja2JveCIpOy8qKiovfSwvKiAxNyAqLyAvKioqL2Z1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1yZXF1aXJlKCJlbGVtZW50LXVpL2xpYi9zY3JvbGxiYXIiKTsvKioqL30sLyogMTggKi8gLyoqKi9mdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9cmVxdWlyZSgiZWxlbWVudC11aS9saWIvdXRpbHMvdHlwZXMiKTsvKioqL30sLyogMTkgKi8gLyoqKi9mdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9cmVxdWlyZSgiZWxlbWVudC11aS9saWIvdXRpbHMvc2hhcmVkIik7LyoqKi99LC8qIDIwICovIC8qKiovZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPXJlcXVpcmUoImVsZW1lbnQtdWkvbGliL3V0aWxzL2RhdGUiKTsvKioqL30sLyogMjEgKi8gLyoqKi9mdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9cmVxdWlyZSgiZWxlbWVudC11aS9saWIvdHJhbnNpdGlvbnMvY29sbGFwc2UtdHJhbnNpdGlvbiIpOy8qKiovfSwvKiAyMiAqLyAvKioqL2Z1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1yZXF1aXJlKCJlbGVtZW50LXVpL2xpYi9taXhpbnMvZm9jdXMiKTsvKioqL30sLyogMjMgKi8gLyoqKi9mdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9cmVxdWlyZSgiZWxlbWVudC11aS9saWIvdXRpbHMvdmRvbSIpOy8qKiovfSwvKiAyNCAqLyAvKioqL2Z1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1yZXF1aXJlKCJiYWJlbC1oZWxwZXItdnVlLWpzeC1tZXJnZS1wcm9wcyIpOy8qKiovfSwvKiAyNSAqLyAvKioqL2Z1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1yZXF1aXJlKCJ0aHJvdHRsZS1kZWJvdW5jZS90aHJvdHRsZSIpOy8qKiovfSwvKiAyNiAqLyAvKioqL2Z1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1yZXF1aXJlKCJlbGVtZW50LXVpL2xpYi90b29sdGlwIik7LyoqKi99LC8qIDI3ICovIC8qKiovZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPXJlcXVpcmUoImVsZW1lbnQtdWkvbGliL3V0aWxzL3Njcm9sbC1pbnRvLXZpZXciKTsvKioqL30sLyogMjggKi8gLyoqKi9mdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9cmVxdWlyZSgiZWxlbWVudC11aS9saWIvdXRpbHMvYXJpYS11dGlscyIpOy8qKiovfSwvKiAyOSAqLyAvKioqL2Z1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1yZXF1aXJlKCJlbGVtZW50LXVpL2xpYi9idXR0b24tZ3JvdXAiKTsvKioqL30sLyogMzAgKi8gLyoqKi9mdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9cmVxdWlyZSgiZWxlbWVudC11aS9saWIvdGFnIik7LyoqKi99LC8qIDMxICovIC8qKiovZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPXJlcXVpcmUoImVsZW1lbnQtdWkvbGliL3V0aWxzL3Njcm9sbGJhci13aWR0aCIpOy8qKiovfSwvKiAzMiAqLyAvKioqL2Z1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1yZXF1aXJlKCJlbGVtZW50LXVpL2xpYi9jaGVja2JveC1ncm91cCIpOy8qKiovfSwvKiAzMyAqLyAvKioqL2Z1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1yZXF1aXJlKCJlbGVtZW50LXVpL2xpYi91dGlscy9hZnRlci1sZWF2ZSIpOy8qKiovfSwvKiAzNCAqLyAvKioqL2Z1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1yZXF1aXJlKCJlbGVtZW50LXVpL2xpYi9wcm9ncmVzcyIpOy8qKiovfSwvKiAzNSAqLyAvKioqL2Z1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1yZXF1aXJlKCJ0aHJvdHRsZS1kZWJvdW5jZSIpOy8qKiovfSwvKiAzNiAqLyAvKioqL2Z1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1yZXF1aXJlKCJlbGVtZW50LXVpL2xpYi9zZWxlY3QiKTsvKioqL30sLyogMzcgKi8gLyoqKi9mdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9cmVxdWlyZSgiZWxlbWVudC11aS9saWIvb3B0aW9uIik7LyoqKi99LC8qIDM4ICovIC8qKiovZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPXJlcXVpcmUoIm5vcm1hbGl6ZS13aGVlbCIpOy8qKiovfSwvKiAzOSAqLyAvKioqL2Z1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1yZXF1aXJlKCJlbGVtZW50LXVpL2xpYi91dGlscy9hcmlhLWRpYWxvZyIpOy8qKiovfSwvKiA0MCAqLyAvKioqL2Z1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1yZXF1aXJlKCJhc3luYy12YWxpZGF0b3IiKTsvKioqL30sLyogNDEgKi8gLyoqKi9mdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9cmVxdWlyZSgiZWxlbWVudC11aS9saWIvaW5wdXQtbnVtYmVyIik7LyoqKi99LC8qIDQyICovIC8qKiovZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPXJlcXVpcmUoImVsZW1lbnQtdWkvbGliL2Nhc2NhZGVyLXBhbmVsIik7LyoqKi99LC8qIDQzICovIC8qKiovZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPXJlcXVpcmUoImVsZW1lbnQtdWkvbGliL3JhZGlvIik7LyoqKi99LC8qIDQ0ICovIC8qKiovZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPXJlcXVpcmUoImVsZW1lbnQtdWkvbGliL3BvcG92ZXIiKTsvKioqL30sLyogNDUgKi8gLyoqKi9mdW5jdGlvbihtb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXttb2R1bGUuZXhwb3J0cz1fX3dlYnBhY2tfcmVxdWlyZV9fKDQ2KTsvKioqL30sLyogNDYgKi8gLyoqKi9mdW5jdGlvbihtb2R1bGUsX193ZWJwYWNrX2V4cG9ydHNfXyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7X193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvcGFnaW5hdGlvbi9zcmMvcGFnZXIudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTcyNzRmMjY3Jgp2YXIgcGFnZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF83Mjc0ZjI2N19yZW5kZXI9ZnVuY3Rpb24gcGFnZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF83Mjc0ZjI2N19yZW5kZXIoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDt2YXIgX2M9X3ZtLl9zZWxmLl9jfHxfaDtyZXR1cm4gX2MoInVsIix7c3RhdGljQ2xhc3M6ImVsLXBhZ2VyIixvbjp7Y2xpY2s6X3ZtLm9uUGFnZXJDbGlja319LFtfdm0ucGFnZUNvdW50PjA/X2MoImxpIix7c3RhdGljQ2xhc3M6Im51bWJlciIsY2xhc3M6e2FjdGl2ZTpfdm0uY3VycmVudFBhZ2U9PT0xLGRpc2FibGVkOl92bS5kaXNhYmxlZH19LFtfdm0uX3YoIjEiKV0pOl92bS5fZSgpLF92bS5zaG93UHJldk1vcmU/X2MoImxpIix7c3RhdGljQ2xhc3M6ImVsLWljb24gbW9yZSBidG4tcXVpY2twcmV2IixjbGFzczpbX3ZtLnF1aWNrcHJldkljb25DbGFzcyx7ZGlzYWJsZWQ6X3ZtLmRpc2FibGVkfV0sb246e21vdXNlZW50ZXI6ZnVuY3Rpb24gbW91c2VlbnRlcigkZXZlbnQpe192bS5vbk1vdXNlZW50ZXIoImxlZnQiKTt9LG1vdXNlbGVhdmU6ZnVuY3Rpb24gbW91c2VsZWF2ZSgkZXZlbnQpe192bS5xdWlja3ByZXZJY29uQ2xhc3M9ImVsLWljb24tbW9yZSI7fX19KTpfdm0uX2UoKSxfdm0uX2woX3ZtLnBhZ2VycyxmdW5jdGlvbihwYWdlcil7cmV0dXJuIF9jKCJsaSIse2tleTpwYWdlcixzdGF0aWNDbGFzczoibnVtYmVyIixjbGFzczp7YWN0aXZlOl92bS5jdXJyZW50UGFnZT09PXBhZ2VyLGRpc2FibGVkOl92bS5kaXNhYmxlZH19LFtfdm0uX3YoX3ZtLl9zKHBhZ2VyKSldKTt9KSxfdm0uc2hvd05leHRNb3JlP19jKCJsaSIse3N0YXRpY0NsYXNzOiJlbC1pY29uIG1vcmUgYnRuLXF1aWNrbmV4dCIsY2xhc3M6W192bS5xdWlja25leHRJY29uQ2xhc3Mse2Rpc2FibGVkOl92bS5kaXNhYmxlZH1dLG9uOnttb3VzZWVudGVyOmZ1bmN0aW9uIG1vdXNlZW50ZXIoJGV2ZW50KXtfdm0ub25Nb3VzZWVudGVyKCJyaWdodCIpO30sbW91c2VsZWF2ZTpmdW5jdGlvbiBtb3VzZWxlYXZlKCRldmVudCl7X3ZtLnF1aWNrbmV4dEljb25DbGFzcz0iZWwtaWNvbi1tb3JlIjt9fX0pOl92bS5fZSgpLF92bS5wYWdlQ291bnQ+MT9fYygibGkiLHtzdGF0aWNDbGFzczoibnVtYmVyIixjbGFzczp7YWN0aXZlOl92bS5jdXJyZW50UGFnZT09PV92bS5wYWdlQ291bnQsZGlzYWJsZWQ6X3ZtLmRpc2FibGVkfX0sW192bS5fdihfdm0uX3MoX3ZtLnBhZ2VDb3VudCkpXSk6X3ZtLl9lKCldLDIpO307dmFyIHN0YXRpY1JlbmRlckZucz1bXTtwYWdlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzcyNzRmMjY3X3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9wYWdpbmF0aW9uL3NyYy9wYWdlci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NzI3NGYyNjcmCi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3BhZ2luYXRpb24vc3JjL3BhZ2VyLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYWdlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17bmFtZTonRWxQYWdlcicscHJvcHM6e2N1cnJlbnRQYWdlOk51bWJlcixwYWdlQ291bnQ6TnVtYmVyLHBhZ2VyQ291bnQ6TnVtYmVyLGRpc2FibGVkOkJvb2xlYW59LHdhdGNoOntzaG93UHJldk1vcmU6ZnVuY3Rpb24gc2hvd1ByZXZNb3JlKHZhbCl7aWYoIXZhbCl0aGlzLnF1aWNrcHJldkljb25DbGFzcz0nZWwtaWNvbi1tb3JlJzt9LHNob3dOZXh0TW9yZTpmdW5jdGlvbiBzaG93TmV4dE1vcmUodmFsKXtpZighdmFsKXRoaXMucXVpY2tuZXh0SWNvbkNsYXNzPSdlbC1pY29uLW1vcmUnO319LG1ldGhvZHM6e29uUGFnZXJDbGljazpmdW5jdGlvbiBvblBhZ2VyQ2xpY2soZXZlbnQpe3ZhciB0YXJnZXQ9ZXZlbnQudGFyZ2V0O2lmKHRhcmdldC50YWdOYW1lPT09J1VMJ3x8dGhpcy5kaXNhYmxlZCl7cmV0dXJuO312YXIgbmV3UGFnZT1OdW1iZXIoZXZlbnQudGFyZ2V0LnRleHRDb250ZW50KTt2YXIgcGFnZUNvdW50PXRoaXMucGFnZUNvdW50O3ZhciBjdXJyZW50UGFnZT10aGlzLmN1cnJlbnRQYWdlO3ZhciBwYWdlckNvdW50T2Zmc2V0PXRoaXMucGFnZXJDb3VudC0yO2lmKHRhcmdldC5jbGFzc05hbWUuaW5kZXhPZignbW9yZScpIT09LTEpe2lmKHRhcmdldC5jbGFzc05hbWUuaW5kZXhPZigncXVpY2twcmV2JykhPT0tMSl7bmV3UGFnZT1jdXJyZW50UGFnZS1wYWdlckNvdW50T2Zmc2V0O31lbHNlIGlmKHRhcmdldC5jbGFzc05hbWUuaW5kZXhPZigncXVpY2tuZXh0JykhPT0tMSl7bmV3UGFnZT1jdXJyZW50UGFnZStwYWdlckNvdW50T2Zmc2V0O319LyogaXN0YW5idWwgaWdub3JlIGlmICovaWYoIWlzTmFOKG5ld1BhZ2UpKXtpZihuZXdQYWdlPDEpe25ld1BhZ2U9MTt9aWYobmV3UGFnZT5wYWdlQ291bnQpe25ld1BhZ2U9cGFnZUNvdW50O319aWYobmV3UGFnZSE9PWN1cnJlbnRQYWdlKXt0aGlzLiRlbWl0KCdjaGFuZ2UnLG5ld1BhZ2UpO319LG9uTW91c2VlbnRlcjpmdW5jdGlvbiBvbk1vdXNlZW50ZXIoZGlyZWN0aW9uKXtpZih0aGlzLmRpc2FibGVkKXJldHVybjtpZihkaXJlY3Rpb249PT0nbGVmdCcpe3RoaXMucXVpY2twcmV2SWNvbkNsYXNzPSdlbC1pY29uLWQtYXJyb3ctbGVmdCc7fWVsc2V7dGhpcy5xdWlja25leHRJY29uQ2xhc3M9J2VsLWljb24tZC1hcnJvdy1yaWdodCc7fX19LGNvbXB1dGVkOntwYWdlcnM6ZnVuY3Rpb24gcGFnZXJzKCl7dmFyIHBhZ2VyQ291bnQ9dGhpcy5wYWdlckNvdW50O3ZhciBoYWxmUGFnZXJDb3VudD0ocGFnZXJDb3VudC0xKS8yO3ZhciBjdXJyZW50UGFnZT1OdW1iZXIodGhpcy5jdXJyZW50UGFnZSk7dmFyIHBhZ2VDb3VudD1OdW1iZXIodGhpcy5wYWdlQ291bnQpO3ZhciBzaG93UHJldk1vcmU9ZmFsc2U7dmFyIHNob3dOZXh0TW9yZT1mYWxzZTtpZihwYWdlQ291bnQ+cGFnZXJDb3VudCl7aWYoY3VycmVudFBhZ2U+cGFnZXJDb3VudC1oYWxmUGFnZXJDb3VudCl7c2hvd1ByZXZNb3JlPXRydWU7fWlmKGN1cnJlbnRQYWdlPHBhZ2VDb3VudC1oYWxmUGFnZXJDb3VudCl7c2hvd05leHRNb3JlPXRydWU7fX12YXIgYXJyYXk9W107aWYoc2hvd1ByZXZNb3JlJiYhc2hvd05leHRNb3JlKXt2YXIgc3RhcnRQYWdlPXBhZ2VDb3VudC0ocGFnZXJDb3VudC0yKTtmb3IodmFyIGk9c3RhcnRQYWdlO2k8cGFnZUNvdW50O2krKyl7YXJyYXkucHVzaChpKTt9fWVsc2UgaWYoIXNob3dQcmV2TW9yZSYmc2hvd05leHRNb3JlKXtmb3IodmFyIF9pPTI7X2k8cGFnZXJDb3VudDtfaSsrKXthcnJheS5wdXNoKF9pKTt9fWVsc2UgaWYoc2hvd1ByZXZNb3JlJiZzaG93TmV4dE1vcmUpe3ZhciBvZmZzZXQ9TWF0aC5mbG9vcihwYWdlckNvdW50LzIpLTE7Zm9yKHZhciBfaTI9Y3VycmVudFBhZ2Utb2Zmc2V0O19pMjw9Y3VycmVudFBhZ2Urb2Zmc2V0O19pMisrKXthcnJheS5wdXNoKF9pMik7fX1lbHNle2Zvcih2YXIgX2kzPTI7X2kzPHBhZ2VDb3VudDtfaTMrKyl7YXJyYXkucHVzaChfaTMpO319dGhpcy5zaG93UHJldk1vcmU9c2hvd1ByZXZNb3JlO3RoaXMuc2hvd05leHRNb3JlPXNob3dOZXh0TW9yZTtyZXR1cm4gYXJyYXk7fX0sZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue2N1cnJlbnQ6bnVsbCxzaG93UHJldk1vcmU6ZmFsc2Usc2hvd05leHRNb3JlOmZhbHNlLHF1aWNrbmV4dEljb25DbGFzczonZWwtaWNvbi1tb3JlJyxxdWlja3ByZXZJY29uQ2xhc3M6J2VsLWljb24tbW9yZSd9O319Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcGFnaW5hdGlvbi9zcmMvcGFnZXIudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHNyY19wYWdlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz1wYWdlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9ydW50aW1lL2NvbXBvbmVudE5vcm1hbGl6ZXIuanMKLyogZ2xvYmFscyBfX1ZVRV9TU1JfQ09OVEVYVF9fICovIC8vIElNUE9SVEFOVDogRG8gTk9UIHVzZSBFUzIwMTUgZmVhdHVyZXMgaW4gdGhpcyBmaWxlIChleGNlcHQgZm9yIG1vZHVsZXMpLgovLyBUaGlzIG1vZHVsZSBpcyBhIHJ1bnRpbWUgdXRpbGl0eSBmb3IgY2xlYW5lciBjb21wb25lbnQgbW9kdWxlIG91dHB1dCBhbmQgd2lsbAovLyBiZSBpbmNsdWRlZCBpbiB0aGUgZmluYWwgd2VicGFjayB1c2VyIGJ1bmRsZS4KZnVuY3Rpb24gbm9ybWFsaXplQ29tcG9uZW50KHNjcmlwdEV4cG9ydHMscmVuZGVyLHN0YXRpY1JlbmRlckZucyxmdW5jdGlvbmFsVGVtcGxhdGUsaW5qZWN0U3R5bGVzLHNjb3BlSWQsbW9kdWxlSWRlbnRpZmllciwvKiBzZXJ2ZXIgb25seSAqL3NoYWRvd01vZGUvKiB2dWUtY2xpIG9ubHkgKi8pey8vIFZ1ZS5leHRlbmQgY29uc3RydWN0b3IgZXhwb3J0IGludGVyb3AKdmFyIG9wdGlvbnM9dHlwZW9mIHNjcmlwdEV4cG9ydHM9PT0nZnVuY3Rpb24nP3NjcmlwdEV4cG9ydHMub3B0aW9uczpzY3JpcHRFeHBvcnRzOy8vIHJlbmRlciBmdW5jdGlvbnMKaWYocmVuZGVyKXtvcHRpb25zLnJlbmRlcj1yZW5kZXI7b3B0aW9ucy5zdGF0aWNSZW5kZXJGbnM9c3RhdGljUmVuZGVyRm5zO29wdGlvbnMuX2NvbXBpbGVkPXRydWU7fS8vIGZ1bmN0aW9uYWwgdGVtcGxhdGUKaWYoZnVuY3Rpb25hbFRlbXBsYXRlKXtvcHRpb25zLmZ1bmN0aW9uYWw9dHJ1ZTt9Ly8gc2NvcGVkSWQKaWYoc2NvcGVJZCl7b3B0aW9ucy5fc2NvcGVJZD0nZGF0YS12LScrc2NvcGVJZDt9dmFyIGhvb2s7aWYobW9kdWxlSWRlbnRpZmllcil7Ly8gc2VydmVyIGJ1aWxkCmhvb2s9ZnVuY3Rpb24gaG9vayhjb250ZXh0KXsvLyAyLjMgaW5qZWN0aW9uCmNvbnRleHQ9Y29udGV4dHx8Ly8gY2FjaGVkIGNhbGwKdGhpcy4kdm5vZGUmJnRoaXMuJHZub2RlLnNzckNvbnRleHR8fC8vIHN0YXRlZnVsCnRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC4kdm5vZGUmJnRoaXMucGFyZW50LiR2bm9kZS5zc3JDb250ZXh0Oy8vIGZ1bmN0aW9uYWwKLy8gMi4yIHdpdGggcnVuSW5OZXdDb250ZXh0OiB0cnVlCmlmKCFjb250ZXh0JiZ0eXBlb2YgX19WVUVfU1NSX0NPTlRFWFRfXyE9PSd1bmRlZmluZWQnKXtjb250ZXh0PV9fVlVFX1NTUl9DT05URVhUX187fS8vIGluamVjdCBjb21wb25lbnQgc3R5bGVzCmlmKGluamVjdFN0eWxlcyl7aW5qZWN0U3R5bGVzLmNhbGwodGhpcyxjb250ZXh0KTt9Ly8gcmVnaXN0ZXIgY29tcG9uZW50IG1vZHVsZSBpZGVudGlmaWVyIGZvciBhc3luYyBjaHVuayBpbmZlcnJlbmNlCmlmKGNvbnRleHQmJmNvbnRleHQuX3JlZ2lzdGVyZWRDb21wb25lbnRzKXtjb250ZXh0Ll9yZWdpc3RlcmVkQ29tcG9uZW50cy5hZGQobW9kdWxlSWRlbnRpZmllcik7fX07Ly8gdXNlZCBieSBzc3IgaW4gY2FzZSBjb21wb25lbnQgaXMgY2FjaGVkIGFuZCBiZWZvcmVDcmVhdGUKLy8gbmV2ZXIgZ2V0cyBjYWxsZWQKb3B0aW9ucy5fc3NyUmVnaXN0ZXI9aG9vazt9ZWxzZSBpZihpbmplY3RTdHlsZXMpe2hvb2s9c2hhZG93TW9kZT9mdW5jdGlvbigpe2luamVjdFN0eWxlcy5jYWxsKHRoaXMsdGhpcy4kcm9vdC4kb3B0aW9ucy5zaGFkb3dSb290KTt9OmluamVjdFN0eWxlczt9aWYoaG9vayl7aWYob3B0aW9ucy5mdW5jdGlvbmFsKXsvLyBmb3IgdGVtcGxhdGUtb25seSBob3QtcmVsb2FkIGJlY2F1c2UgaW4gdGhhdCBjYXNlIHRoZSByZW5kZXIgZm4gZG9lc24ndAovLyBnbyB0aHJvdWdoIHRoZSBub3JtYWxpemVyCm9wdGlvbnMuX2luamVjdFN0eWxlcz1ob29rOy8vIHJlZ2lzdGVyIGZvciBmdW5jdGlvYWwgY29tcG9uZW50IGluIHZ1ZSBmaWxlCnZhciBvcmlnaW5hbFJlbmRlcj1vcHRpb25zLnJlbmRlcjtvcHRpb25zLnJlbmRlcj1mdW5jdGlvbiByZW5kZXJXaXRoU3R5bGVJbmplY3Rpb24oaCxjb250ZXh0KXtob29rLmNhbGwoY29udGV4dCk7cmV0dXJuIG9yaWdpbmFsUmVuZGVyKGgsY29udGV4dCk7fTt9ZWxzZXsvLyBpbmplY3QgY29tcG9uZW50IHJlZ2lzdHJhdGlvbiBhcyBiZWZvcmVDcmVhdGUgaG9vawp2YXIgZXhpc3Rpbmc9b3B0aW9ucy5iZWZvcmVDcmVhdGU7b3B0aW9ucy5iZWZvcmVDcmVhdGU9ZXhpc3Rpbmc/W10uY29uY2F0KGV4aXN0aW5nLGhvb2spOltob29rXTt9fXJldHVybntleHBvcnRzOnNjcmlwdEV4cG9ydHMsb3B0aW9uczpvcHRpb25zfTt9Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9wYWdpbmF0aW9uL3NyYy9wYWdlci52dWUKLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciBjb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHNyY19wYWdlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxwYWdlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzcyNzRmMjY3X3JlbmRlcixzdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIGFwaTt9Y29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy9wYWdpbmF0aW9uL3NyYy9wYWdlci52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFnZXI9Y29tcG9uZW50LmV4cG9ydHM7Ly8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCAiZWxlbWVudC11aS9saWIvc2VsZWN0Igp2YXIgc2VsZWN0Xz1fX3dlYnBhY2tfcmVxdWlyZV9fKDM2KTt2YXIgc2VsZWN0X2RlZmF1bHQ9LyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihzZWxlY3RfKTsvLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsICJlbGVtZW50LXVpL2xpYi9vcHRpb24iCnZhciBvcHRpb25fPV9fd2VicGFja19yZXF1aXJlX18oMzcpO3ZhciBvcHRpb25fZGVmYXVsdD0vKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKG9wdGlvbl8pOy8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgImVsZW1lbnQtdWkvbGliL2lucHV0Igp2YXIgaW5wdXRfPV9fd2VicGFja19yZXF1aXJlX18oOCk7dmFyIGlucHV0X2RlZmF1bHQ9LyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihpbnB1dF8pOy8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgImVsZW1lbnQtdWkvbGliL21peGlucy9sb2NhbGUiCnZhciBsb2NhbGVfPV9fd2VicGFja19yZXF1aXJlX18oNCk7dmFyIGxvY2FsZV9kZWZhdWx0PS8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4obG9jYWxlXyk7Ly8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCAiZWxlbWVudC11aS9saWIvdXRpbHMvdXRpbCIKdmFyIHV0aWxfPV9fd2VicGFja19yZXF1aXJlX18oMik7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9wYWdpbmF0aW9uL3NyYy9wYWdpbmF0aW9uLmpzCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFnaW5hdGlvbj17bmFtZTonRWxQYWdpbmF0aW9uJyxwcm9wczp7cGFnZVNpemU6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MTB9LHNtYWxsOkJvb2xlYW4sdG90YWw6TnVtYmVyLHBhZ2VDb3VudDpOdW1iZXIscGFnZXJDb3VudDp7dHlwZTpOdW1iZXIsdmFsaWRhdG9yOmZ1bmN0aW9uIHZhbGlkYXRvcih2YWx1ZSl7cmV0dXJuKHZhbHVlfDApPT09dmFsdWUmJnZhbHVlPjQmJnZhbHVlPDIyJiZ2YWx1ZSUyPT09MTt9LGRlZmF1bHQ6N30sY3VycmVudFBhZ2U6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MX0sbGF5b3V0OntkZWZhdWx0OidwcmV2LCBwYWdlciwgbmV4dCwganVtcGVyLCAtPiwgdG90YWwnfSxwYWdlU2l6ZXM6e3R5cGU6QXJyYXksZGVmYXVsdDpmdW5jdGlvbiBfZGVmYXVsdCgpe3JldHVyblsxMCwyMCwzMCw0MCw1MCwxMDBdO319LHBvcHBlckNsYXNzOlN0cmluZyxwcmV2VGV4dDpTdHJpbmcsbmV4dFRleHQ6U3RyaW5nLGJhY2tncm91bmQ6Qm9vbGVhbixkaXNhYmxlZDpCb29sZWFuLGhpZGVPblNpbmdsZVBhZ2U6Qm9vbGVhbn0sZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue2ludGVybmFsQ3VycmVudFBhZ2U6MSxpbnRlcm5hbFBhZ2VTaXplOjAsbGFzdEVtaXR0ZWRQYWdlOi0xLHVzZXJDaGFuZ2VQYWdlU2l6ZTpmYWxzZX07fSxyZW5kZXI6ZnVuY3Rpb24gcmVuZGVyKGgpe3ZhciBsYXlvdXQ9dGhpcy5sYXlvdXQ7aWYoIWxheW91dClyZXR1cm4gbnVsbDtpZih0aGlzLmhpZGVPblNpbmdsZVBhZ2UmJighdGhpcy5pbnRlcm5hbFBhZ2VDb3VudHx8dGhpcy5pbnRlcm5hbFBhZ2VDb3VudD09PTEpKXJldHVybiBudWxsO3ZhciB0ZW1wbGF0ZT1oKCdkaXYnLHsnY2xhc3MnOlsnZWwtcGFnaW5hdGlvbicseydpcy1iYWNrZ3JvdW5kJzp0aGlzLmJhY2tncm91bmQsJ2VsLXBhZ2luYXRpb24tLXNtYWxsJzp0aGlzLnNtYWxsfV19KTt2YXIgVEVNUExBVEVfTUFQPXtwcmV2OmgoJ3ByZXYnKSxqdW1wZXI6aCgnanVtcGVyJykscGFnZXI6aCgncGFnZXInLHthdHRyczp7Y3VycmVudFBhZ2U6dGhpcy5pbnRlcm5hbEN1cnJlbnRQYWdlLHBhZ2VDb3VudDp0aGlzLmludGVybmFsUGFnZUNvdW50LHBhZ2VyQ291bnQ6dGhpcy5wYWdlckNvdW50LGRpc2FibGVkOnRoaXMuZGlzYWJsZWR9LG9uOnsnY2hhbmdlJzp0aGlzLmhhbmRsZUN1cnJlbnRDaGFuZ2V9fSksbmV4dDpoKCduZXh0Jyksc2l6ZXM6aCgnc2l6ZXMnLHthdHRyczp7cGFnZVNpemVzOnRoaXMucGFnZVNpemVzfX0pLHNsb3Q6aCgnc2xvdCcsW3RoaXMuJHNsb3RzLmRlZmF1bHQ/dGhpcy4kc2xvdHMuZGVmYXVsdDonJ10pLHRvdGFsOmgoJ3RvdGFsJyl9O3ZhciBjb21wb25lbnRzPWxheW91dC5zcGxpdCgnLCcpLm1hcChmdW5jdGlvbihpdGVtKXtyZXR1cm4gaXRlbS50cmltKCk7fSk7dmFyIHJpZ2h0V3JhcHBlcj1oKCdkaXYnLHsnY2xhc3MnOidlbC1wYWdpbmF0aW9uX19yaWdodHdyYXBwZXInfSk7dmFyIGhhdmVSaWdodFdyYXBwZXI9ZmFsc2U7dGVtcGxhdGUuY2hpbGRyZW49dGVtcGxhdGUuY2hpbGRyZW58fFtdO3JpZ2h0V3JhcHBlci5jaGlsZHJlbj1yaWdodFdyYXBwZXIuY2hpbGRyZW58fFtdO2NvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbihjb21wbyl7aWYoY29tcG89PT0nLT4nKXtoYXZlUmlnaHRXcmFwcGVyPXRydWU7cmV0dXJuO31pZighaGF2ZVJpZ2h0V3JhcHBlcil7dGVtcGxhdGUuY2hpbGRyZW4ucHVzaChURU1QTEFURV9NQVBbY29tcG9dKTt9ZWxzZXtyaWdodFdyYXBwZXIuY2hpbGRyZW4ucHVzaChURU1QTEFURV9NQVBbY29tcG9dKTt9fSk7aWYoaGF2ZVJpZ2h0V3JhcHBlcil7dGVtcGxhdGUuY2hpbGRyZW4udW5zaGlmdChyaWdodFdyYXBwZXIpO31yZXR1cm4gdGVtcGxhdGU7fSxjb21wb25lbnRzOntQcmV2OntyZW5kZXI6ZnVuY3Rpb24gcmVuZGVyKGgpe3JldHVybiBoKCdidXR0b24nLHthdHRyczp7dHlwZTonYnV0dG9uJyxkaXNhYmxlZDp0aGlzLiRwYXJlbnQuZGlzYWJsZWR8fHRoaXMuJHBhcmVudC5pbnRlcm5hbEN1cnJlbnRQYWdlPD0xfSwnY2xhc3MnOididG4tcHJldicsb246eydjbGljayc6dGhpcy4kcGFyZW50LnByZXZ9fSxbdGhpcy4kcGFyZW50LnByZXZUZXh0P2goJ3NwYW4nLFt0aGlzLiRwYXJlbnQucHJldlRleHRdKTpoKCdpJyx7J2NsYXNzJzonZWwtaWNvbiBlbC1pY29uLWFycm93LWxlZnQnfSldKTt9fSxOZXh0OntyZW5kZXI6ZnVuY3Rpb24gcmVuZGVyKGgpe3JldHVybiBoKCdidXR0b24nLHthdHRyczp7dHlwZTonYnV0dG9uJyxkaXNhYmxlZDp0aGlzLiRwYXJlbnQuZGlzYWJsZWR8fHRoaXMuJHBhcmVudC5pbnRlcm5hbEN1cnJlbnRQYWdlPT09dGhpcy4kcGFyZW50LmludGVybmFsUGFnZUNvdW50fHx0aGlzLiRwYXJlbnQuaW50ZXJuYWxQYWdlQ291bnQ9PT0wfSwnY2xhc3MnOididG4tbmV4dCcsb246eydjbGljayc6dGhpcy4kcGFyZW50Lm5leHR9fSxbdGhpcy4kcGFyZW50Lm5leHRUZXh0P2goJ3NwYW4nLFt0aGlzLiRwYXJlbnQubmV4dFRleHRdKTpoKCdpJyx7J2NsYXNzJzonZWwtaWNvbiBlbC1pY29uLWFycm93LXJpZ2h0J30pXSk7fX0sU2l6ZXM6e21peGluczpbbG9jYWxlX2RlZmF1bHQuYV0scHJvcHM6e3BhZ2VTaXplczpBcnJheX0sd2F0Y2g6e3BhZ2VTaXplczp7aW1tZWRpYXRlOnRydWUsaGFuZGxlcjpmdW5jdGlvbiBoYW5kbGVyKG5ld1ZhbCxvbGRWYWwpe2lmKE9iamVjdCh1dGlsX1sidmFsdWVFcXVhbHMiXSkobmV3VmFsLG9sZFZhbCkpcmV0dXJuO2lmKEFycmF5LmlzQXJyYXkobmV3VmFsKSl7dGhpcy4kcGFyZW50LmludGVybmFsUGFnZVNpemU9bmV3VmFsLmluZGV4T2YodGhpcy4kcGFyZW50LnBhZ2VTaXplKT4tMT90aGlzLiRwYXJlbnQucGFnZVNpemU6dGhpcy5wYWdlU2l6ZXNbMF07fX19fSxyZW5kZXI6ZnVuY3Rpb24gcmVuZGVyKGgpe3ZhciBfdGhpcz10aGlzO3JldHVybiBoKCdzcGFuJyx7J2NsYXNzJzonZWwtcGFnaW5hdGlvbl9fc2l6ZXMnfSxbaCgnZWwtc2VsZWN0Jyx7YXR0cnM6e3ZhbHVlOnRoaXMuJHBhcmVudC5pbnRlcm5hbFBhZ2VTaXplLHBvcHBlckNsYXNzOnRoaXMuJHBhcmVudC5wb3BwZXJDbGFzc3x8Jycsc2l6ZTonbWluaScsZGlzYWJsZWQ6dGhpcy4kcGFyZW50LmRpc2FibGVkfSxvbjp7J2lucHV0Jzp0aGlzLmhhbmRsZUNoYW5nZX19LFt0aGlzLnBhZ2VTaXplcy5tYXAoZnVuY3Rpb24oaXRlbSl7cmV0dXJuIGgoJ2VsLW9wdGlvbicse2F0dHJzOnt2YWx1ZTppdGVtLGxhYmVsOml0ZW0rX3RoaXMudCgnZWwucGFnaW5hdGlvbi5wYWdlc2l6ZScpfX0pO30pXSldKTt9LGNvbXBvbmVudHM6e0VsU2VsZWN0OnNlbGVjdF9kZWZhdWx0LmEsRWxPcHRpb246b3B0aW9uX2RlZmF1bHQuYX0sbWV0aG9kczp7aGFuZGxlQ2hhbmdlOmZ1bmN0aW9uIGhhbmRsZUNoYW5nZSh2YWwpe2lmKHZhbCE9PXRoaXMuJHBhcmVudC5pbnRlcm5hbFBhZ2VTaXplKXt0aGlzLiRwYXJlbnQuaW50ZXJuYWxQYWdlU2l6ZT12YWw9cGFyc2VJbnQodmFsLDEwKTt0aGlzLiRwYXJlbnQudXNlckNoYW5nZVBhZ2VTaXplPXRydWU7dGhpcy4kcGFyZW50LiRlbWl0KCd1cGRhdGU6cGFnZVNpemUnLHZhbCk7dGhpcy4kcGFyZW50LiRlbWl0KCdzaXplLWNoYW5nZScsdmFsKTt9fX19LEp1bXBlcjp7bWl4aW5zOltsb2NhbGVfZGVmYXVsdC5hXSxjb21wb25lbnRzOntFbElucHV0OmlucHV0X2RlZmF1bHQuYX0sZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue3VzZXJJbnB1dDpudWxsfTt9LHdhdGNoOnsnJHBhcmVudC5pbnRlcm5hbEN1cnJlbnRQYWdlJzpmdW5jdGlvbiAkcGFyZW50SW50ZXJuYWxDdXJyZW50UGFnZSgpe3RoaXMudXNlcklucHV0PW51bGw7fX0sbWV0aG9kczp7aGFuZGxlS2V5dXA6ZnVuY3Rpb24gaGFuZGxlS2V5dXAoX3JlZil7dmFyIGtleUNvZGU9X3JlZi5rZXlDb2RlLHRhcmdldD1fcmVmLnRhcmdldDsvLyBDaHJvbWUsIFNhZmFyaSwgRmlyZWZveCB0cmlnZ2VycyBjaGFuZ2UgZXZlbnQgb24gRW50ZXIKLy8gSGFjayBmb3IgSUU6IGh0dHBzOi8vZ2l0aHViLmNvbS9FbGVtZUZFL2VsZW1lbnQvaXNzdWVzLzExNzEwCi8vIERyb3AgdGhpcyBtZXRob2Qgd2hlbiB3ZSBubyBsb25nZXIgc3VwcG9ydHMgSUUKaWYoa2V5Q29kZT09PTEzKXt0aGlzLmhhbmRsZUNoYW5nZSh0YXJnZXQudmFsdWUpO319LGhhbmRsZUlucHV0OmZ1bmN0aW9uIGhhbmRsZUlucHV0KHZhbHVlKXt0aGlzLnVzZXJJbnB1dD12YWx1ZTt9LGhhbmRsZUNoYW5nZTpmdW5jdGlvbiBoYW5kbGVDaGFuZ2UodmFsdWUpe3RoaXMuJHBhcmVudC5pbnRlcm5hbEN1cnJlbnRQYWdlPXRoaXMuJHBhcmVudC5nZXRWYWxpZEN1cnJlbnRQYWdlKHZhbHVlKTt0aGlzLiRwYXJlbnQuZW1pdENoYW5nZSgpO3RoaXMudXNlcklucHV0PW51bGw7fX0scmVuZGVyOmZ1bmN0aW9uIHJlbmRlcihoKXtyZXR1cm4gaCgnc3BhbicseydjbGFzcyc6J2VsLXBhZ2luYXRpb25fX2p1bXAnfSxbdGhpcy50KCdlbC5wYWdpbmF0aW9uLmdvdG8nKSxoKCdlbC1pbnB1dCcseydjbGFzcyc6J2VsLXBhZ2luYXRpb25fX2VkaXRvciBpcy1pbi1wYWdpbmF0aW9uJyxhdHRyczp7bWluOjEsbWF4OnRoaXMuJHBhcmVudC5pbnRlcm5hbFBhZ2VDb3VudCx2YWx1ZTp0aGlzLnVzZXJJbnB1dCE9PW51bGw/dGhpcy51c2VySW5wdXQ6dGhpcy4kcGFyZW50LmludGVybmFsQ3VycmVudFBhZ2UsdHlwZTonbnVtYmVyJyxkaXNhYmxlZDp0aGlzLiRwYXJlbnQuZGlzYWJsZWR9LG5hdGl2ZU9uOnsna2V5dXAnOnRoaXMuaGFuZGxlS2V5dXB9LG9uOnsnaW5wdXQnOnRoaXMuaGFuZGxlSW5wdXQsJ2NoYW5nZSc6dGhpcy5oYW5kbGVDaGFuZ2V9fSksdGhpcy50KCdlbC5wYWdpbmF0aW9uLnBhZ2VDbGFzc2lmaWVyJyldKTt9fSxUb3RhbDp7bWl4aW5zOltsb2NhbGVfZGVmYXVsdC5hXSxyZW5kZXI6ZnVuY3Rpb24gcmVuZGVyKGgpe3JldHVybiB0eXBlb2YgdGhpcy4kcGFyZW50LnRvdGFsPT09J251bWJlcic/aCgnc3BhbicseydjbGFzcyc6J2VsLXBhZ2luYXRpb25fX3RvdGFsJ30sW3RoaXMudCgnZWwucGFnaW5hdGlvbi50b3RhbCcse3RvdGFsOnRoaXMuJHBhcmVudC50b3RhbH0pXSk6Jyc7fX0sUGFnZXI6cGFnZXJ9LG1ldGhvZHM6e2hhbmRsZUN1cnJlbnRDaGFuZ2U6ZnVuY3Rpb24gaGFuZGxlQ3VycmVudENoYW5nZSh2YWwpe3RoaXMuaW50ZXJuYWxDdXJyZW50UGFnZT10aGlzLmdldFZhbGlkQ3VycmVudFBhZ2UodmFsKTt0aGlzLnVzZXJDaGFuZ2VQYWdlU2l6ZT10cnVlO3RoaXMuZW1pdENoYW5nZSgpO30scHJldjpmdW5jdGlvbiBwcmV2KCl7aWYodGhpcy5kaXNhYmxlZClyZXR1cm47dmFyIG5ld1ZhbD10aGlzLmludGVybmFsQ3VycmVudFBhZ2UtMTt0aGlzLmludGVybmFsQ3VycmVudFBhZ2U9dGhpcy5nZXRWYWxpZEN1cnJlbnRQYWdlKG5ld1ZhbCk7dGhpcy4kZW1pdCgncHJldi1jbGljaycsdGhpcy5pbnRlcm5hbEN1cnJlbnRQYWdlKTt0aGlzLmVtaXRDaGFuZ2UoKTt9LG5leHQ6ZnVuY3Rpb24gbmV4dCgpe2lmKHRoaXMuZGlzYWJsZWQpcmV0dXJuO3ZhciBuZXdWYWw9dGhpcy5pbnRlcm5hbEN1cnJlbnRQYWdlKzE7dGhpcy5pbnRlcm5hbEN1cnJlbnRQYWdlPXRoaXMuZ2V0VmFsaWRDdXJyZW50UGFnZShuZXdWYWwpO3RoaXMuJGVtaXQoJ25leHQtY2xpY2snLHRoaXMuaW50ZXJuYWxDdXJyZW50UGFnZSk7dGhpcy5lbWl0Q2hhbmdlKCk7fSxnZXRWYWxpZEN1cnJlbnRQYWdlOmZ1bmN0aW9uIGdldFZhbGlkQ3VycmVudFBhZ2UodmFsdWUpe3ZhbHVlPXBhcnNlSW50KHZhbHVlLDEwKTt2YXIgaGF2ZVBhZ2VDb3VudD10eXBlb2YgdGhpcy5pbnRlcm5hbFBhZ2VDb3VudD09PSdudW1iZXInO3ZhciByZXNldFZhbHVlPXZvaWQgMDtpZighaGF2ZVBhZ2VDb3VudCl7aWYoaXNOYU4odmFsdWUpfHx2YWx1ZTwxKXJlc2V0VmFsdWU9MTt9ZWxzZXtpZih2YWx1ZTwxKXtyZXNldFZhbHVlPTE7fWVsc2UgaWYodmFsdWU+dGhpcy5pbnRlcm5hbFBhZ2VDb3VudCl7cmVzZXRWYWx1ZT10aGlzLmludGVybmFsUGFnZUNvdW50O319aWYocmVzZXRWYWx1ZT09PXVuZGVmaW5lZCYmaXNOYU4odmFsdWUpKXtyZXNldFZhbHVlPTE7fWVsc2UgaWYocmVzZXRWYWx1ZT09PTApe3Jlc2V0VmFsdWU9MTt9cmV0dXJuIHJlc2V0VmFsdWU9PT11bmRlZmluZWQ/dmFsdWU6cmVzZXRWYWx1ZTt9LGVtaXRDaGFuZ2U6ZnVuY3Rpb24gZW1pdENoYW5nZSgpe3ZhciBfdGhpczI9dGhpczt0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe2lmKF90aGlzMi5pbnRlcm5hbEN1cnJlbnRQYWdlIT09X3RoaXMyLmxhc3RFbWl0dGVkUGFnZXx8X3RoaXMyLnVzZXJDaGFuZ2VQYWdlU2l6ZSl7X3RoaXMyLiRlbWl0KCdjdXJyZW50LWNoYW5nZScsX3RoaXMyLmludGVybmFsQ3VycmVudFBhZ2UpO190aGlzMi5sYXN0RW1pdHRlZFBhZ2U9X3RoaXMyLmludGVybmFsQ3VycmVudFBhZ2U7X3RoaXMyLnVzZXJDaGFuZ2VQYWdlU2l6ZT1mYWxzZTt9fSk7fX0sY29tcHV0ZWQ6e2ludGVybmFsUGFnZUNvdW50OmZ1bmN0aW9uIGludGVybmFsUGFnZUNvdW50KCl7aWYodHlwZW9mIHRoaXMudG90YWw9PT0nbnVtYmVyJyl7cmV0dXJuIE1hdGgubWF4KDEsTWF0aC5jZWlsKHRoaXMudG90YWwvdGhpcy5pbnRlcm5hbFBhZ2VTaXplKSk7fWVsc2UgaWYodHlwZW9mIHRoaXMucGFnZUNvdW50PT09J251bWJlcicpe3JldHVybiBNYXRoLm1heCgxLHRoaXMucGFnZUNvdW50KTt9cmV0dXJuIG51bGw7fX0sd2F0Y2g6e2N1cnJlbnRQYWdlOntpbW1lZGlhdGU6dHJ1ZSxoYW5kbGVyOmZ1bmN0aW9uIGhhbmRsZXIodmFsKXt0aGlzLmludGVybmFsQ3VycmVudFBhZ2U9dGhpcy5nZXRWYWxpZEN1cnJlbnRQYWdlKHZhbCk7fX0scGFnZVNpemU6e2ltbWVkaWF0ZTp0cnVlLGhhbmRsZXI6ZnVuY3Rpb24gaGFuZGxlcih2YWwpe3RoaXMuaW50ZXJuYWxQYWdlU2l6ZT1pc05hTih2YWwpPzEwOnZhbDt9fSxpbnRlcm5hbEN1cnJlbnRQYWdlOntpbW1lZGlhdGU6dHJ1ZSxoYW5kbGVyOmZ1bmN0aW9uIGhhbmRsZXIobmV3VmFsKXt0aGlzLiRlbWl0KCd1cGRhdGU6Y3VycmVudFBhZ2UnLG5ld1ZhbCk7dGhpcy5sYXN0RW1pdHRlZFBhZ2U9LTE7fX0saW50ZXJuYWxQYWdlQ291bnQ6ZnVuY3Rpb24gaW50ZXJuYWxQYWdlQ291bnQobmV3VmFsKXsvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi92YXIgb2xkUGFnZT10aGlzLmludGVybmFsQ3VycmVudFBhZ2U7aWYobmV3VmFsPjAmJm9sZFBhZ2U9PT0wKXt0aGlzLmludGVybmFsQ3VycmVudFBhZ2U9MTt9ZWxzZSBpZihvbGRQYWdlPm5ld1ZhbCl7dGhpcy5pbnRlcm5hbEN1cnJlbnRQYWdlPW5ld1ZhbD09PTA/MTpuZXdWYWw7dGhpcy51c2VyQ2hhbmdlUGFnZVNpemUmJnRoaXMuZW1pdENoYW5nZSgpO310aGlzLnVzZXJDaGFuZ2VQYWdlU2l6ZT1mYWxzZTt9fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9wYWdpbmF0aW9uL2luZGV4LmpzCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovcGFnaW5hdGlvbi5pbnN0YWxsPWZ1bmN0aW9uKFZ1ZSl7VnVlLmNvbXBvbmVudChwYWdpbmF0aW9uLm5hbWUscGFnaW5hdGlvbik7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX3BhZ2luYXRpb249cGFnaW5hdGlvbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2RpYWxvZy9zcmMvY29tcG9uZW50LnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD02MDE0MGU2MiYKdmFyIGNvbXBvbmVudHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzYwMTQwZTYyX3JlbmRlcj1mdW5jdGlvbiBjb21wb25lbnR2dWVfdHlwZV90ZW1wbGF0ZV9pZF82MDE0MGU2Ml9yZW5kZXIoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDt2YXIgX2M9X3ZtLl9zZWxmLl9jfHxfaDtyZXR1cm4gX2MoInRyYW5zaXRpb24iLHthdHRyczp7bmFtZToiZGlhbG9nLWZhZGUifSxvbjp7ImFmdGVyLWVudGVyIjpfdm0uYWZ0ZXJFbnRlciwiYWZ0ZXItbGVhdmUiOl92bS5hZnRlckxlYXZlfX0sW19jKCJkaXYiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTpfdm0udmlzaWJsZSxleHByZXNzaW9uOiJ2aXNpYmxlIn1dLHN0YXRpY0NsYXNzOiJlbC1kaWFsb2dfX3dyYXBwZXIiLG9uOntjbGljazpmdW5jdGlvbiBjbGljaygkZXZlbnQpe2lmKCRldmVudC50YXJnZXQhPT0kZXZlbnQuY3VycmVudFRhcmdldCl7cmV0dXJuIG51bGw7fXJldHVybiBfdm0uaGFuZGxlV3JhcHBlckNsaWNrKCRldmVudCk7fX19LFtfYygiZGl2Iix7a2V5Ol92bS5rZXkscmVmOiJkaWFsb2ciLGNsYXNzOlsiZWwtZGlhbG9nIix7ImlzLWZ1bGxzY3JlZW4iOl92bS5mdWxsc2NyZWVuLCJlbC1kaWFsb2ctLWNlbnRlciI6X3ZtLmNlbnRlcn0sX3ZtLmN1c3RvbUNsYXNzXSxzdHlsZTpfdm0uc3R5bGUsYXR0cnM6e3JvbGU6ImRpYWxvZyIsImFyaWEtbW9kYWwiOiJ0cnVlIiwiYXJpYS1sYWJlbCI6X3ZtLnRpdGxlfHwiZGlhbG9nIn19LFtfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLWRpYWxvZ19faGVhZGVyIn0sW192bS5fdCgidGl0bGUiLFtfYygic3BhbiIse3N0YXRpY0NsYXNzOiJlbC1kaWFsb2dfX3RpdGxlIn0sW192bS5fdihfdm0uX3MoX3ZtLnRpdGxlKSldKV0pLF92bS5zaG93Q2xvc2U/X2MoImJ1dHRvbiIse3N0YXRpY0NsYXNzOiJlbC1kaWFsb2dfX2hlYWRlcmJ0biIsYXR0cnM6e3R5cGU6ImJ1dHRvbiIsImFyaWEtbGFiZWwiOiJDbG9zZSJ9LG9uOntjbGljazpfdm0uaGFuZGxlQ2xvc2V9fSxbX2MoImkiLHtzdGF0aWNDbGFzczoiZWwtZGlhbG9nX19jbG9zZSBlbC1pY29uIGVsLWljb24tY2xvc2UifSldKTpfdm0uX2UoKV0sMiksX3ZtLnJlbmRlcmVkP19jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtZGlhbG9nX19ib2R5In0sW192bS5fdCgiZGVmYXVsdCIpXSwyKTpfdm0uX2UoKSxfdm0uJHNsb3RzLmZvb3Rlcj9fYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLWRpYWxvZ19fZm9vdGVyIn0sW192bS5fdCgiZm9vdGVyIildLDIpOl92bS5fZSgpXSldKV0pO307dmFyIGNvbXBvbmVudHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzYwMTQwZTYyX3N0YXRpY1JlbmRlckZucz1bXTtjb21wb25lbnR2dWVfdHlwZV90ZW1wbGF0ZV9pZF82MDE0MGU2Ml9yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGlhbG9nL3NyYy9jb21wb25lbnQudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTYwMTQwZTYyJgovLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsICJlbGVtZW50LXVpL2xpYi91dGlscy9wb3B1cCIKdmFyIHBvcHVwXz1fX3dlYnBhY2tfcmVxdWlyZV9fKDE0KTt2YXIgcG9wdXBfZGVmYXVsdD0vKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKHBvcHVwXyk7Ly8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCAiZWxlbWVudC11aS9saWIvbWl4aW5zL21pZ3JhdGluZyIKdmFyIG1pZ3JhdGluZ189X193ZWJwYWNrX3JlcXVpcmVfXyg5KTt2YXIgbWlncmF0aW5nX2RlZmF1bHQ9LyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihtaWdyYXRpbmdfKTsvLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsICJlbGVtZW50LXVpL2xpYi9taXhpbnMvZW1pdHRlciIKdmFyIGVtaXR0ZXJfPV9fd2VicGFja19yZXF1aXJlX18oMyk7dmFyIGVtaXR0ZXJfZGVmYXVsdD0vKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGVtaXR0ZXJfKTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9kaWFsb2cvc3JjL2NvbXBvbmVudC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgY29tcG9uZW50dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbERpYWxvZycsbWl4aW5zOltwb3B1cF9kZWZhdWx0LmEsZW1pdHRlcl9kZWZhdWx0LmEsbWlncmF0aW5nX2RlZmF1bHQuYV0scHJvcHM6e3RpdGxlOnt0eXBlOlN0cmluZyxkZWZhdWx0OicnfSxtb2RhbDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6dHJ1ZX0sbW9kYWxBcHBlbmRUb0JvZHk6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OnRydWV9LGFwcGVuZFRvQm9keTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ZmFsc2V9LGxvY2tTY3JvbGw6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OnRydWV9LGNsb3NlT25DbGlja01vZGFsOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDp0cnVlfSxjbG9zZU9uUHJlc3NFc2NhcGU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OnRydWV9LHNob3dDbG9zZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6dHJ1ZX0sd2lkdGg6U3RyaW5nLGZ1bGxzY3JlZW46Qm9vbGVhbixjdXN0b21DbGFzczp7dHlwZTpTdHJpbmcsZGVmYXVsdDonJ30sdG9wOnt0eXBlOlN0cmluZyxkZWZhdWx0OicxNXZoJ30sYmVmb3JlQ2xvc2U6RnVuY3Rpb24sY2VudGVyOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDpmYWxzZX0sZGVzdHJveU9uQ2xvc2U6Qm9vbGVhbn0sZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue2Nsb3NlZDpmYWxzZSxrZXk6MH07fSx3YXRjaDp7dmlzaWJsZTpmdW5jdGlvbiB2aXNpYmxlKHZhbCl7dmFyIF90aGlzPXRoaXM7aWYodmFsKXt0aGlzLmNsb3NlZD1mYWxzZTt0aGlzLiRlbWl0KCdvcGVuJyk7dGhpcy4kZWwuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJyx0aGlzLnVwZGF0ZVBvcHBlcik7dGhpcy4kbmV4dFRpY2soZnVuY3Rpb24oKXtfdGhpcy4kcmVmcy5kaWFsb2cuc2Nyb2xsVG9wPTA7fSk7aWYodGhpcy5hcHBlbmRUb0JvZHkpe2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy4kZWwpO319ZWxzZXt0aGlzLiRlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLHRoaXMudXBkYXRlUG9wcGVyKTtpZighdGhpcy5jbG9zZWQpdGhpcy4kZW1pdCgnY2xvc2UnKTtpZih0aGlzLmRlc3Ryb3lPbkNsb3NlKXt0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe190aGlzLmtleSsrO30pO319fX0sY29tcHV0ZWQ6e3N0eWxlOmZ1bmN0aW9uIHN0eWxlKCl7dmFyIHN0eWxlPXt9O2lmKCF0aGlzLmZ1bGxzY3JlZW4pe3N0eWxlLm1hcmdpblRvcD10aGlzLnRvcDtpZih0aGlzLndpZHRoKXtzdHlsZS53aWR0aD10aGlzLndpZHRoO319cmV0dXJuIHN0eWxlO319LG1ldGhvZHM6e2dldE1pZ3JhdGluZ0NvbmZpZzpmdW5jdGlvbiBnZXRNaWdyYXRpbmdDb25maWcoKXtyZXR1cm57cHJvcHM6eydzaXplJzonc2l6ZSBpcyByZW1vdmVkLid9fTt9LGhhbmRsZVdyYXBwZXJDbGljazpmdW5jdGlvbiBoYW5kbGVXcmFwcGVyQ2xpY2soKXtpZighdGhpcy5jbG9zZU9uQ2xpY2tNb2RhbClyZXR1cm47dGhpcy5oYW5kbGVDbG9zZSgpO30saGFuZGxlQ2xvc2U6ZnVuY3Rpb24gaGFuZGxlQ2xvc2UoKXtpZih0eXBlb2YgdGhpcy5iZWZvcmVDbG9zZT09PSdmdW5jdGlvbicpe3RoaXMuYmVmb3JlQ2xvc2UodGhpcy5oaWRlKTt9ZWxzZXt0aGlzLmhpZGUoKTt9fSxoaWRlOmZ1bmN0aW9uIGhpZGUoY2FuY2VsKXtpZihjYW5jZWwhPT1mYWxzZSl7dGhpcy4kZW1pdCgndXBkYXRlOnZpc2libGUnLGZhbHNlKTt0aGlzLiRlbWl0KCdjbG9zZScpO3RoaXMuY2xvc2VkPXRydWU7fX0sdXBkYXRlUG9wcGVyOmZ1bmN0aW9uIHVwZGF0ZVBvcHBlcigpe3RoaXMuYnJvYWRjYXN0KCdFbFNlbGVjdERyb3Bkb3duJywndXBkYXRlUG9wcGVyJyk7dGhpcy5icm9hZGNhc3QoJ0VsRHJvcGRvd25NZW51JywndXBkYXRlUG9wcGVyJyk7fSxhZnRlckVudGVyOmZ1bmN0aW9uIGFmdGVyRW50ZXIoKXt0aGlzLiRlbWl0KCdvcGVuZWQnKTt9LGFmdGVyTGVhdmU6ZnVuY3Rpb24gYWZ0ZXJMZWF2ZSgpe3RoaXMuJGVtaXQoJ2Nsb3NlZCcpO319LG1vdW50ZWQ6ZnVuY3Rpb24gbW91bnRlZCgpe2lmKHRoaXMudmlzaWJsZSl7dGhpcy5yZW5kZXJlZD10cnVlO3RoaXMub3BlbigpO2lmKHRoaXMuYXBwZW5kVG9Cb2R5KXtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuJGVsKTt9fX0sZGVzdHJveWVkOmZ1bmN0aW9uIGRlc3Ryb3llZCgpey8vIGlmIGFwcGVuZFRvQm9keSBpcyB0cnVlLCByZW1vdmUgRE9NIG5vZGUgYWZ0ZXIgZGVzdHJveQppZih0aGlzLmFwcGVuZFRvQm9keSYmdGhpcy4kZWwmJnRoaXMuJGVsLnBhcmVudE5vZGUpe3RoaXMuJGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy4kZWwpO319fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RpYWxvZy9zcmMvY29tcG9uZW50LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfY29tcG9uZW50dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPWNvbXBvbmVudHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RpYWxvZy9zcmMvY29tcG9uZW50LnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIGNvbXBvbmVudF9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHNyY19jb21wb25lbnR2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sY29tcG9uZW50dnVlX3R5cGVfdGVtcGxhdGVfaWRfNjAxNDBlNjJfcmVuZGVyLGNvbXBvbmVudHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzYwMTQwZTYyX3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgY29tcG9uZW50X2FwaTt9Y29tcG9uZW50X2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvZGlhbG9nL3NyYy9jb21wb25lbnQudnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHNyY19jb21wb25lbnQ9Y29tcG9uZW50X2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGlhbG9nL2luZGV4LmpzCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovc3JjX2NvbXBvbmVudC5pbnN0YWxsPWZ1bmN0aW9uKFZ1ZSl7VnVlLmNvbXBvbmVudChzcmNfY29tcG9uZW50Lm5hbWUsc3JjX2NvbXBvbmVudCk7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGRpYWxvZz1zcmNfY29tcG9uZW50Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvYXV0b2NvbXBsZXRlL3NyYy9hdXRvY29tcGxldGUudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTE1MmYyZWU2Jgp2YXIgYXV0b2NvbXBsZXRldnVlX3R5cGVfdGVtcGxhdGVfaWRfMTUyZjJlZTZfcmVuZGVyPWZ1bmN0aW9uIGF1dG9jb21wbGV0ZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzE1MmYyZWU2X3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygiZGl2Iix7ZGlyZWN0aXZlczpbe25hbWU6ImNsaWNrb3V0c2lkZSIscmF3TmFtZToidi1jbGlja291dHNpZGUiLHZhbHVlOl92bS5jbG9zZSxleHByZXNzaW9uOiJjbG9zZSJ9XSxzdGF0aWNDbGFzczoiZWwtYXV0b2NvbXBsZXRlIixhdHRyczp7ImFyaWEtaGFzcG9wdXAiOiJsaXN0Ym94Iixyb2xlOiJjb21ib2JveCIsImFyaWEtZXhwYW5kZWQiOl92bS5zdWdnZXN0aW9uVmlzaWJsZSwiYXJpYS1vd25zIjpfdm0uaWR9fSxbX2MoImVsLWlucHV0Iixfdm0uX2Ioe3JlZjoiaW5wdXQiLG9uOntpbnB1dDpfdm0uaGFuZGxlSW5wdXQsY2hhbmdlOl92bS5oYW5kbGVDaGFuZ2UsZm9jdXM6X3ZtLmhhbmRsZUZvY3VzLGJsdXI6X3ZtLmhhbmRsZUJsdXIsY2xlYXI6X3ZtLmhhbmRsZUNsZWFyfSxuYXRpdmVPbjp7a2V5ZG93bjpbZnVuY3Rpb24oJGV2ZW50KXtpZighKCJidXR0b24iaW4gJGV2ZW50KSYmX3ZtLl9rKCRldmVudC5rZXlDb2RlLCJ1cCIsMzgsJGV2ZW50LmtleSxbIlVwIiwiQXJyb3dVcCJdKSl7cmV0dXJuIG51bGw7fSRldmVudC5wcmV2ZW50RGVmYXVsdCgpO192bS5oaWdobGlnaHQoX3ZtLmhpZ2hsaWdodGVkSW5kZXgtMSk7fSxmdW5jdGlvbigkZXZlbnQpe2lmKCEoImJ1dHRvbiJpbiAkZXZlbnQpJiZfdm0uX2soJGV2ZW50LmtleUNvZGUsImRvd24iLDQwLCRldmVudC5rZXksWyJEb3duIiwiQXJyb3dEb3duIl0pKXtyZXR1cm4gbnVsbDt9JGV2ZW50LnByZXZlbnREZWZhdWx0KCk7X3ZtLmhpZ2hsaWdodChfdm0uaGlnaGxpZ2h0ZWRJbmRleCsxKTt9LGZ1bmN0aW9uKCRldmVudCl7aWYoISgiYnV0dG9uImluICRldmVudCkmJl92bS5faygkZXZlbnQua2V5Q29kZSwiZW50ZXIiLDEzLCRldmVudC5rZXksIkVudGVyIikpe3JldHVybiBudWxsO31yZXR1cm4gX3ZtLmhhbmRsZUtleUVudGVyKCRldmVudCk7fSxmdW5jdGlvbigkZXZlbnQpe2lmKCEoImJ1dHRvbiJpbiAkZXZlbnQpJiZfdm0uX2soJGV2ZW50LmtleUNvZGUsInRhYiIsOSwkZXZlbnQua2V5LCJUYWIiKSl7cmV0dXJuIG51bGw7fXJldHVybiBfdm0uY2xvc2UoJGV2ZW50KTt9XX19LCJlbC1pbnB1dCIsW192bS4kcHJvcHMsX3ZtLiRhdHRyc10sZmFsc2UpLFtfdm0uJHNsb3RzLnByZXBlbmQ/X2MoInRlbXBsYXRlIix7c2xvdDoicHJlcGVuZCJ9LFtfdm0uX3QoInByZXBlbmQiKV0sMik6X3ZtLl9lKCksX3ZtLiRzbG90cy5hcHBlbmQ/X2MoInRlbXBsYXRlIix7c2xvdDoiYXBwZW5kIn0sW192bS5fdCgiYXBwZW5kIildLDIpOl92bS5fZSgpLF92bS4kc2xvdHMucHJlZml4P19jKCJ0ZW1wbGF0ZSIse3Nsb3Q6InByZWZpeCJ9LFtfdm0uX3QoInByZWZpeCIpXSwyKTpfdm0uX2UoKSxfdm0uJHNsb3RzLnN1ZmZpeD9fYygidGVtcGxhdGUiLHtzbG90OiJzdWZmaXgifSxbX3ZtLl90KCJzdWZmaXgiKV0sMik6X3ZtLl9lKCldLDIpLF9jKCJlbC1hdXRvY29tcGxldGUtc3VnZ2VzdGlvbnMiLHtyZWY6InN1Z2dlc3Rpb25zIixjbGFzczpbX3ZtLnBvcHBlckNsYXNzP192bS5wb3BwZXJDbGFzczoiIl0sYXR0cnM6eyJ2aXNpYmxlLWFycm93IjoiIiwicG9wcGVyLW9wdGlvbnMiOl92bS5wb3BwZXJPcHRpb25zLCJhcHBlbmQtdG8tYm9keSI6X3ZtLnBvcHBlckFwcGVuZFRvQm9keSxwbGFjZW1lbnQ6X3ZtLnBsYWNlbWVudCxpZDpfdm0uaWR9fSxfdm0uX2woX3ZtLnN1Z2dlc3Rpb25zLGZ1bmN0aW9uKGl0ZW0saW5kZXgpe3JldHVybiBfYygibGkiLHtrZXk6aW5kZXgsY2xhc3M6e2hpZ2hsaWdodGVkOl92bS5oaWdobGlnaHRlZEluZGV4PT09aW5kZXh9LGF0dHJzOntpZDpfdm0uaWQrIi1pdGVtLSIraW5kZXgscm9sZToib3B0aW9uIiwiYXJpYS1zZWxlY3RlZCI6X3ZtLmhpZ2hsaWdodGVkSW5kZXg9PT1pbmRleH0sb246e2NsaWNrOmZ1bmN0aW9uIGNsaWNrKCRldmVudCl7X3ZtLnNlbGVjdChpdGVtKTt9fX0sW192bS5fdCgiZGVmYXVsdCIsW192bS5fdigiXG4gICAgICAgICIrX3ZtLl9zKGl0ZW1bX3ZtLnZhbHVlS2V5XSkrIlxuICAgICAgIildLHtpdGVtOml0ZW19KV0sMik7fSksMCldLDEpO307dmFyIGF1dG9jb21wbGV0ZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzE1MmYyZWU2X3N0YXRpY1JlbmRlckZucz1bXTthdXRvY29tcGxldGV2dWVfdHlwZV90ZW1wbGF0ZV9pZF8xNTJmMmVlNl9yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYXV0b2NvbXBsZXRlL3NyYy9hdXRvY29tcGxldGUudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTE1MmYyZWU2JgovLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsICJ0aHJvdHRsZS1kZWJvdW5jZS9kZWJvdW5jZSIKdmFyIGRlYm91bmNlXz1fX3dlYnBhY2tfcmVxdWlyZV9fKDE1KTt2YXIgZGVib3VuY2VfZGVmYXVsdD0vKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGRlYm91bmNlXyk7Ly8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCAiZWxlbWVudC11aS9saWIvdXRpbHMvY2xpY2tvdXRzaWRlIgp2YXIgY2xpY2tvdXRzaWRlXz1fX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTt2YXIgY2xpY2tvdXRzaWRlX2RlZmF1bHQ9LyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjbGlja291dHNpZGVfKTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2F1dG9jb21wbGV0ZS9zcmMvYXV0b2NvbXBsZXRlLXN1Z2dlc3Rpb25zLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD1jZDEwZGNmMCYKdmFyIGF1dG9jb21wbGV0ZV9zdWdnZXN0aW9uc3Z1ZV90eXBlX3RlbXBsYXRlX2lkX2NkMTBkY2YwX3JlbmRlcj1mdW5jdGlvbiBhdXRvY29tcGxldGVfc3VnZ2VzdGlvbnN2dWVfdHlwZV90ZW1wbGF0ZV9pZF9jZDEwZGNmMF9yZW5kZXIoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDt2YXIgX2M9X3ZtLl9zZWxmLl9jfHxfaDtyZXR1cm4gX2MoInRyYW5zaXRpb24iLHthdHRyczp7bmFtZToiZWwtem9vbS1pbi10b3AifSxvbjp7ImFmdGVyLWxlYXZlIjpfdm0uZG9EZXN0cm95fX0sW19jKCJkaXYiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTpfdm0uc2hvd1BvcHBlcixleHByZXNzaW9uOiJzaG93UG9wcGVyIn1dLHN0YXRpY0NsYXNzOiJlbC1hdXRvY29tcGxldGUtc3VnZ2VzdGlvbiBlbC1wb3BwZXIiLGNsYXNzOnsiaXMtbG9hZGluZyI6IV92bS5wYXJlbnQuaGlkZUxvYWRpbmcmJl92bS5wYXJlbnQubG9hZGluZ30sc3R5bGU6e3dpZHRoOl92bS5kcm9wZG93bldpZHRofSxhdHRyczp7cm9sZToicmVnaW9uIn19LFtfYygiZWwtc2Nyb2xsYmFyIix7YXR0cnM6e3RhZzoidWwiLCJ3cmFwLWNsYXNzIjoiZWwtYXV0b2NvbXBsZXRlLXN1Z2dlc3Rpb25fX3dyYXAiLCJ2aWV3LWNsYXNzIjoiZWwtYXV0b2NvbXBsZXRlLXN1Z2dlc3Rpb25fX2xpc3QifX0sWyFfdm0ucGFyZW50LmhpZGVMb2FkaW5nJiZfdm0ucGFyZW50LmxvYWRpbmc/X2MoImxpIixbX2MoImkiLHtzdGF0aWNDbGFzczoiZWwtaWNvbi1sb2FkaW5nIn0pXSk6X3ZtLl90KCJkZWZhdWx0IildLDIpXSwxKV0pO307dmFyIGF1dG9jb21wbGV0ZV9zdWdnZXN0aW9uc3Z1ZV90eXBlX3RlbXBsYXRlX2lkX2NkMTBkY2YwX3N0YXRpY1JlbmRlckZucz1bXTthdXRvY29tcGxldGVfc3VnZ2VzdGlvbnN2dWVfdHlwZV90ZW1wbGF0ZV9pZF9jZDEwZGNmMF9yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYXV0b2NvbXBsZXRlL3NyYy9hdXRvY29tcGxldGUtc3VnZ2VzdGlvbnMudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWNkMTBkY2YwJgovLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsICJlbGVtZW50LXVpL2xpYi91dGlscy92dWUtcG9wcGVyIgp2YXIgdnVlX3BvcHBlcl89X193ZWJwYWNrX3JlcXVpcmVfXyg1KTt2YXIgdnVlX3BvcHBlcl9kZWZhdWx0PS8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4odnVlX3BvcHBlcl8pOy8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgImVsZW1lbnQtdWkvbGliL3Njcm9sbGJhciIKdmFyIHNjcm9sbGJhcl89X193ZWJwYWNrX3JlcXVpcmVfXygxNyk7dmFyIHNjcm9sbGJhcl9kZWZhdWx0PS8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oc2Nyb2xsYmFyXyk7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvYXV0b2NvbXBsZXRlL3NyYy9hdXRvY29tcGxldGUtc3VnZ2VzdGlvbnMudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGF1dG9jb21wbGV0ZV9zdWdnZXN0aW9uc3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17Y29tcG9uZW50czp7RWxTY3JvbGxiYXI6c2Nyb2xsYmFyX2RlZmF1bHQuYX0sbWl4aW5zOlt2dWVfcG9wcGVyX2RlZmF1bHQuYSxlbWl0dGVyX2RlZmF1bHQuYV0sY29tcG9uZW50TmFtZTonRWxBdXRvY29tcGxldGVTdWdnZXN0aW9ucycsZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue3BhcmVudDp0aGlzLiRwYXJlbnQsZHJvcGRvd25XaWR0aDonJ307fSxwcm9wczp7b3B0aW9uczp7ZGVmYXVsdDpmdW5jdGlvbiBfZGVmYXVsdCgpe3JldHVybntncHVBY2NlbGVyYXRpb246ZmFsc2V9O319LGlkOlN0cmluZ30sbWV0aG9kczp7c2VsZWN0OmZ1bmN0aW9uIHNlbGVjdChpdGVtKXt0aGlzLmRpc3BhdGNoKCdFbEF1dG9jb21wbGV0ZScsJ2l0ZW0tY2xpY2snLGl0ZW0pO319LHVwZGF0ZWQ6ZnVuY3Rpb24gdXBkYXRlZCgpe3ZhciBfdGhpcz10aGlzO3RoaXMuJG5leHRUaWNrKGZ1bmN0aW9uKF8pe190aGlzLnBvcHBlckpTJiZfdGhpcy51cGRhdGVQb3BwZXIoKTt9KTt9LG1vdW50ZWQ6ZnVuY3Rpb24gbW91bnRlZCgpe3RoaXMuJHBhcmVudC5wb3BwZXJFbG09dGhpcy5wb3BwZXJFbG09dGhpcy4kZWw7dGhpcy5yZWZlcmVuY2VFbG09dGhpcy4kcGFyZW50LiRyZWZzLmlucHV0LiRyZWZzLmlucHV0fHx0aGlzLiRwYXJlbnQuJHJlZnMuaW5wdXQuJHJlZnMudGV4dGFyZWE7dGhpcy5yZWZlcmVuY2VMaXN0PXRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5lbC1hdXRvY29tcGxldGUtc3VnZ2VzdGlvbl9fbGlzdCcpO3RoaXMucmVmZXJlbmNlTGlzdC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCdsaXN0Ym94Jyk7dGhpcy5yZWZlcmVuY2VMaXN0LnNldEF0dHJpYnV0ZSgnaWQnLHRoaXMuaWQpO30sY3JlYXRlZDpmdW5jdGlvbiBjcmVhdGVkKCl7dmFyIF90aGlzMj10aGlzO3RoaXMuJG9uKCd2aXNpYmxlJyxmdW5jdGlvbih2YWwsaW5wdXRXaWR0aCl7X3RoaXMyLmRyb3Bkb3duV2lkdGg9aW5wdXRXaWR0aCsncHgnO190aGlzMi5zaG93UG9wcGVyPXZhbDt9KTt9fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2F1dG9jb21wbGV0ZS9zcmMvYXV0b2NvbXBsZXRlLXN1Z2dlc3Rpb25zLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfYXV0b2NvbXBsZXRlX3N1Z2dlc3Rpb25zdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPWF1dG9jb21wbGV0ZV9zdWdnZXN0aW9uc3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2F1dG9jb21wbGV0ZS9zcmMvYXV0b2NvbXBsZXRlLXN1Z2dlc3Rpb25zLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIGF1dG9jb21wbGV0ZV9zdWdnZXN0aW9uc19jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHNyY19hdXRvY29tcGxldGVfc3VnZ2VzdGlvbnN2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sYXV0b2NvbXBsZXRlX3N1Z2dlc3Rpb25zdnVlX3R5cGVfdGVtcGxhdGVfaWRfY2QxMGRjZjBfcmVuZGVyLGF1dG9jb21wbGV0ZV9zdWdnZXN0aW9uc3Z1ZV90eXBlX3RlbXBsYXRlX2lkX2NkMTBkY2YwX3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgYXV0b2NvbXBsZXRlX3N1Z2dlc3Rpb25zX2FwaTt9YXV0b2NvbXBsZXRlX3N1Z2dlc3Rpb25zX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvYXV0b2NvbXBsZXRlL3NyYy9hdXRvY29tcGxldGUtc3VnZ2VzdGlvbnMudnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGF1dG9jb21wbGV0ZV9zdWdnZXN0aW9ucz1hdXRvY29tcGxldGVfc3VnZ2VzdGlvbnNfY29tcG9uZW50LmV4cG9ydHM7Ly8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCAiZWxlbWVudC11aS9saWIvbWl4aW5zL2ZvY3VzIgp2YXIgZm9jdXNfPV9fd2VicGFja19yZXF1aXJlX18oMjIpO3ZhciBmb2N1c19kZWZhdWx0PS8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oZm9jdXNfKTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9hdXRvY29tcGxldGUvc3JjL2F1dG9jb21wbGV0ZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgYXV0b2NvbXBsZXRldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbEF1dG9jb21wbGV0ZScsbWl4aW5zOltlbWl0dGVyX2RlZmF1bHQuYSxmb2N1c19kZWZhdWx0KCkoJ2lucHV0JyksbWlncmF0aW5nX2RlZmF1bHQuYV0saW5oZXJpdEF0dHJzOmZhbHNlLGNvbXBvbmVudE5hbWU6J0VsQXV0b2NvbXBsZXRlJyxjb21wb25lbnRzOntFbElucHV0OmlucHV0X2RlZmF1bHQuYSxFbEF1dG9jb21wbGV0ZVN1Z2dlc3Rpb25zOmF1dG9jb21wbGV0ZV9zdWdnZXN0aW9uc30sZGlyZWN0aXZlczp7Q2xpY2tvdXRzaWRlOmNsaWNrb3V0c2lkZV9kZWZhdWx0LmF9LHByb3BzOnt2YWx1ZUtleTp7dHlwZTpTdHJpbmcsZGVmYXVsdDondmFsdWUnfSxwb3BwZXJDbGFzczpTdHJpbmcscG9wcGVyT3B0aW9uczpPYmplY3QscGxhY2Vob2xkZXI6U3RyaW5nLGNsZWFyYWJsZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ZmFsc2V9LGRpc2FibGVkOkJvb2xlYW4sbmFtZTpTdHJpbmcsc2l6ZTpTdHJpbmcsdmFsdWU6U3RyaW5nLG1heGxlbmd0aDpOdW1iZXIsbWlubGVuZ3RoOk51bWJlcixhdXRvZm9jdXM6Qm9vbGVhbixmZXRjaFN1Z2dlc3Rpb25zOkZ1bmN0aW9uLHRyaWdnZXJPbkZvY3VzOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDp0cnVlfSxjdXN0b21JdGVtOlN0cmluZyxzZWxlY3RXaGVuVW5tYXRjaGVkOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDpmYWxzZX0scHJlZml4SWNvbjpTdHJpbmcsc3VmZml4SWNvbjpTdHJpbmcsbGFiZWw6U3RyaW5nLGRlYm91bmNlOnt0eXBlOk51bWJlcixkZWZhdWx0OjMwMH0scGxhY2VtZW50Ont0eXBlOlN0cmluZyxkZWZhdWx0Oidib3R0b20tc3RhcnQnfSxoaWRlTG9hZGluZzpCb29sZWFuLHBvcHBlckFwcGVuZFRvQm9keTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6dHJ1ZX0saGlnaGxpZ2h0Rmlyc3RJdGVtOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDpmYWxzZX19LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybnthY3RpdmF0ZWQ6ZmFsc2Usc3VnZ2VzdGlvbnM6W10sbG9hZGluZzpmYWxzZSxoaWdobGlnaHRlZEluZGV4Oi0xLHN1Z2dlc3Rpb25EaXNhYmxlZDpmYWxzZX07fSxjb21wdXRlZDp7c3VnZ2VzdGlvblZpc2libGU6ZnVuY3Rpb24gc3VnZ2VzdGlvblZpc2libGUoKXt2YXIgc3VnZ2VzdGlvbnM9dGhpcy5zdWdnZXN0aW9uczt2YXIgaXNWYWxpZERhdGE9QXJyYXkuaXNBcnJheShzdWdnZXN0aW9ucykmJnN1Z2dlc3Rpb25zLmxlbmd0aD4wO3JldHVybihpc1ZhbGlkRGF0YXx8dGhpcy5sb2FkaW5nKSYmdGhpcy5hY3RpdmF0ZWQ7fSxpZDpmdW5jdGlvbiBpZCgpe3JldHVybidlbC1hdXRvY29tcGxldGUtJytPYmplY3QodXRpbF9bImdlbmVyYXRlSWQiXSkoKTt9fSx3YXRjaDp7c3VnZ2VzdGlvblZpc2libGU6ZnVuY3Rpb24gc3VnZ2VzdGlvblZpc2libGUodmFsKXt2YXIgJGlucHV0PXRoaXMuZ2V0SW5wdXQoKTtpZigkaW5wdXQpe3RoaXMuYnJvYWRjYXN0KCdFbEF1dG9jb21wbGV0ZVN1Z2dlc3Rpb25zJywndmlzaWJsZScsW3ZhbCwkaW5wdXQub2Zmc2V0V2lkdGhdKTt9fX0sbWV0aG9kczp7Z2V0TWlncmF0aW5nQ29uZmlnOmZ1bmN0aW9uIGdldE1pZ3JhdGluZ0NvbmZpZygpe3JldHVybntwcm9wczp7J2N1c3RvbS1pdGVtJzonY3VzdG9tLWl0ZW0gaXMgcmVtb3ZlZCwgdXNlIHNjb3BlZCBzbG90IGluc3RlYWQuJywncHJvcHMnOidwcm9wcyBpcyByZW1vdmVkLCB1c2UgdmFsdWUta2V5IGluc3RlYWQuJ319O30sZ2V0RGF0YTpmdW5jdGlvbiBnZXREYXRhKHF1ZXJ5U3RyaW5nKXt2YXIgX3RoaXM9dGhpcztpZih0aGlzLnN1Z2dlc3Rpb25EaXNhYmxlZCl7cmV0dXJuO310aGlzLmxvYWRpbmc9dHJ1ZTt0aGlzLmZldGNoU3VnZ2VzdGlvbnMocXVlcnlTdHJpbmcsZnVuY3Rpb24oc3VnZ2VzdGlvbnMpe190aGlzLmxvYWRpbmc9ZmFsc2U7aWYoX3RoaXMuc3VnZ2VzdGlvbkRpc2FibGVkKXtyZXR1cm47fWlmKEFycmF5LmlzQXJyYXkoc3VnZ2VzdGlvbnMpKXtfdGhpcy5zdWdnZXN0aW9ucz1zdWdnZXN0aW9ucztfdGhpcy5oaWdobGlnaHRlZEluZGV4PV90aGlzLmhpZ2hsaWdodEZpcnN0SXRlbT8wOi0xO31lbHNle2NvbnNvbGUuZXJyb3IoJ1tFbGVtZW50IEVycm9yXVtBdXRvY29tcGxldGVdYXV0b2NvbXBsZXRlIHN1Z2dlc3Rpb25zIG11c3QgYmUgYW4gYXJyYXknKTt9fSk7fSxoYW5kbGVJbnB1dDpmdW5jdGlvbiBoYW5kbGVJbnB1dCh2YWx1ZSl7dGhpcy4kZW1pdCgnaW5wdXQnLHZhbHVlKTt0aGlzLnN1Z2dlc3Rpb25EaXNhYmxlZD1mYWxzZTtpZighdGhpcy50cmlnZ2VyT25Gb2N1cyYmIXZhbHVlKXt0aGlzLnN1Z2dlc3Rpb25EaXNhYmxlZD10cnVlO3RoaXMuc3VnZ2VzdGlvbnM9W107cmV0dXJuO310aGlzLmRlYm91bmNlZEdldERhdGEodmFsdWUpO30saGFuZGxlQ2hhbmdlOmZ1bmN0aW9uIGhhbmRsZUNoYW5nZSh2YWx1ZSl7dGhpcy4kZW1pdCgnY2hhbmdlJyx2YWx1ZSk7fSxoYW5kbGVGb2N1czpmdW5jdGlvbiBoYW5kbGVGb2N1cyhldmVudCl7dGhpcy5hY3RpdmF0ZWQ9dHJ1ZTt0aGlzLiRlbWl0KCdmb2N1cycsZXZlbnQpO2lmKHRoaXMudHJpZ2dlck9uRm9jdXMpe3RoaXMuZGVib3VuY2VkR2V0RGF0YSh0aGlzLnZhbHVlKTt9fSxoYW5kbGVCbHVyOmZ1bmN0aW9uIGhhbmRsZUJsdXIoZXZlbnQpe3RoaXMuJGVtaXQoJ2JsdXInLGV2ZW50KTt9LGhhbmRsZUNsZWFyOmZ1bmN0aW9uIGhhbmRsZUNsZWFyKCl7dGhpcy5hY3RpdmF0ZWQ9ZmFsc2U7dGhpcy4kZW1pdCgnY2xlYXInKTt9LGNsb3NlOmZ1bmN0aW9uIGNsb3NlKGUpe3RoaXMuYWN0aXZhdGVkPWZhbHNlO30saGFuZGxlS2V5RW50ZXI6ZnVuY3Rpb24gaGFuZGxlS2V5RW50ZXIoZSl7dmFyIF90aGlzMj10aGlzO2lmKHRoaXMuc3VnZ2VzdGlvblZpc2libGUmJnRoaXMuaGlnaGxpZ2h0ZWRJbmRleD49MCYmdGhpcy5oaWdobGlnaHRlZEluZGV4PHRoaXMuc3VnZ2VzdGlvbnMubGVuZ3RoKXtlLnByZXZlbnREZWZhdWx0KCk7dGhpcy5zZWxlY3QodGhpcy5zdWdnZXN0aW9uc1t0aGlzLmhpZ2hsaWdodGVkSW5kZXhdKTt9ZWxzZSBpZih0aGlzLnNlbGVjdFdoZW5Vbm1hdGNoZWQpe3RoaXMuJGVtaXQoJ3NlbGVjdCcse3ZhbHVlOnRoaXMudmFsdWV9KTt0aGlzLiRuZXh0VGljayhmdW5jdGlvbihfKXtfdGhpczIuc3VnZ2VzdGlvbnM9W107X3RoaXMyLmhpZ2hsaWdodGVkSW5kZXg9LTE7fSk7fX0sc2VsZWN0OmZ1bmN0aW9uIHNlbGVjdChpdGVtKXt2YXIgX3RoaXMzPXRoaXM7dGhpcy4kZW1pdCgnaW5wdXQnLGl0ZW1bdGhpcy52YWx1ZUtleV0pO3RoaXMuJGVtaXQoJ3NlbGVjdCcsaXRlbSk7dGhpcy4kbmV4dFRpY2soZnVuY3Rpb24oXyl7X3RoaXMzLnN1Z2dlc3Rpb25zPVtdO190aGlzMy5oaWdobGlnaHRlZEluZGV4PS0xO30pO30saGlnaGxpZ2h0OmZ1bmN0aW9uIGhpZ2hsaWdodChpbmRleCl7aWYoIXRoaXMuc3VnZ2VzdGlvblZpc2libGV8fHRoaXMubG9hZGluZyl7cmV0dXJuO31pZihpbmRleDwwKXt0aGlzLmhpZ2hsaWdodGVkSW5kZXg9LTE7cmV0dXJuO31pZihpbmRleD49dGhpcy5zdWdnZXN0aW9ucy5sZW5ndGgpe2luZGV4PXRoaXMuc3VnZ2VzdGlvbnMubGVuZ3RoLTE7fXZhciBzdWdnZXN0aW9uPXRoaXMuJHJlZnMuc3VnZ2VzdGlvbnMuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5lbC1hdXRvY29tcGxldGUtc3VnZ2VzdGlvbl9fd3JhcCcpO3ZhciBzdWdnZXN0aW9uTGlzdD1zdWdnZXN0aW9uLnF1ZXJ5U2VsZWN0b3JBbGwoJy5lbC1hdXRvY29tcGxldGUtc3VnZ2VzdGlvbl9fbGlzdCBsaScpO3ZhciBoaWdobGlnaHRJdGVtPXN1Z2dlc3Rpb25MaXN0W2luZGV4XTt2YXIgc2Nyb2xsVG9wPXN1Z2dlc3Rpb24uc2Nyb2xsVG9wO3ZhciBvZmZzZXRUb3A9aGlnaGxpZ2h0SXRlbS5vZmZzZXRUb3A7aWYob2Zmc2V0VG9wK2hpZ2hsaWdodEl0ZW0uc2Nyb2xsSGVpZ2h0PnNjcm9sbFRvcCtzdWdnZXN0aW9uLmNsaWVudEhlaWdodCl7c3VnZ2VzdGlvbi5zY3JvbGxUb3ArPWhpZ2hsaWdodEl0ZW0uc2Nyb2xsSGVpZ2h0O31pZihvZmZzZXRUb3A8c2Nyb2xsVG9wKXtzdWdnZXN0aW9uLnNjcm9sbFRvcC09aGlnaGxpZ2h0SXRlbS5zY3JvbGxIZWlnaHQ7fXRoaXMuaGlnaGxpZ2h0ZWRJbmRleD1pbmRleDt2YXIgJGlucHV0PXRoaXMuZ2V0SW5wdXQoKTskaW5wdXQuc2V0QXR0cmlidXRlKCdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnLHRoaXMuaWQrJy1pdGVtLScrdGhpcy5oaWdobGlnaHRlZEluZGV4KTt9LGdldElucHV0OmZ1bmN0aW9uIGdldElucHV0KCl7cmV0dXJuIHRoaXMuJHJlZnMuaW5wdXQuZ2V0SW5wdXQoKTt9fSxtb3VudGVkOmZ1bmN0aW9uIG1vdW50ZWQoKXt2YXIgX3RoaXM0PXRoaXM7dGhpcy5kZWJvdW5jZWRHZXREYXRhPWRlYm91bmNlX2RlZmF1bHQoKSh0aGlzLmRlYm91bmNlLHRoaXMuZ2V0RGF0YSk7dGhpcy4kb24oJ2l0ZW0tY2xpY2snLGZ1bmN0aW9uKGl0ZW0pe190aGlzNC5zZWxlY3QoaXRlbSk7fSk7dmFyICRpbnB1dD10aGlzLmdldElucHV0KCk7JGlucHV0LnNldEF0dHJpYnV0ZSgncm9sZScsJ3RleHRib3gnKTskaW5wdXQuc2V0QXR0cmlidXRlKCdhcmlhLWF1dG9jb21wbGV0ZScsJ2xpc3QnKTskaW5wdXQuc2V0QXR0cmlidXRlKCdhcmlhLWNvbnRyb2xzJywnaWQnKTskaW5wdXQuc2V0QXR0cmlidXRlKCdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnLHRoaXMuaWQrJy1pdGVtLScrdGhpcy5oaWdobGlnaHRlZEluZGV4KTt9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpe3RoaXMuJHJlZnMuc3VnZ2VzdGlvbnMuJGRlc3Ryb3koKTt9fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2F1dG9jb21wbGV0ZS9zcmMvYXV0b2NvbXBsZXRlLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfYXV0b2NvbXBsZXRldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPWF1dG9jb21wbGV0ZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2F1dG9jb21wbGV0ZS9zcmMvYXV0b2NvbXBsZXRlLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIGF1dG9jb21wbGV0ZV9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHNyY19hdXRvY29tcGxldGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sYXV0b2NvbXBsZXRldnVlX3R5cGVfdGVtcGxhdGVfaWRfMTUyZjJlZTZfcmVuZGVyLGF1dG9jb21wbGV0ZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzE1MmYyZWU2X3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgYXV0b2NvbXBsZXRlX2FwaTt9YXV0b2NvbXBsZXRlX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvYXV0b2NvbXBsZXRlL3NyYy9hdXRvY29tcGxldGUudnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGF1dG9jb21wbGV0ZT1hdXRvY29tcGxldGVfY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9hdXRvY29tcGxldGUvaW5kZXguanMKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9hdXRvY29tcGxldGUuaW5zdGFsbD1mdW5jdGlvbihWdWUpe1Z1ZS5jb21wb25lbnQoYXV0b2NvbXBsZXRlLm5hbWUsYXV0b2NvbXBsZXRlKTt9Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFja2FnZXNfYXV0b2NvbXBsZXRlPWF1dG9jb21wbGV0ZTsvLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsICJlbGVtZW50LXVpL2xpYi9idXR0b24iCnZhciBidXR0b25fPV9fd2VicGFja19yZXF1aXJlX18oMTIpO3ZhciBidXR0b25fZGVmYXVsdD0vKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGJ1dHRvbl8pOy8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgImVsZW1lbnQtdWkvbGliL2J1dHRvbi1ncm91cCIKdmFyIGJ1dHRvbl9ncm91cF89X193ZWJwYWNrX3JlcXVpcmVfXygyOSk7dmFyIGJ1dHRvbl9ncm91cF9kZWZhdWx0PS8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oYnV0dG9uX2dyb3VwXyk7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZHJvcGRvd24vc3JjL2Ryb3Bkb3duLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBkcm9wZG93bnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17bmFtZTonRWxEcm9wZG93bicsY29tcG9uZW50TmFtZTonRWxEcm9wZG93bicsbWl4aW5zOltlbWl0dGVyX2RlZmF1bHQuYSxtaWdyYXRpbmdfZGVmYXVsdC5hXSxkaXJlY3RpdmVzOntDbGlja291dHNpZGU6Y2xpY2tvdXRzaWRlX2RlZmF1bHQuYX0sY29tcG9uZW50czp7RWxCdXR0b246YnV0dG9uX2RlZmF1bHQuYSxFbEJ1dHRvbkdyb3VwOmJ1dHRvbl9ncm91cF9kZWZhdWx0LmF9LHByb3ZpZGU6ZnVuY3Rpb24gcHJvdmlkZSgpe3JldHVybntkcm9wZG93bjp0aGlzfTt9LHByb3BzOnt0cmlnZ2VyOnt0eXBlOlN0cmluZyxkZWZhdWx0Oidob3Zlcid9LHR5cGU6U3RyaW5nLHNpemU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6Jyd9LHNwbGl0QnV0dG9uOkJvb2xlYW4saGlkZU9uQ2xpY2s6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OnRydWV9LHBsYWNlbWVudDp7dHlwZTpTdHJpbmcsZGVmYXVsdDonYm90dG9tLWVuZCd9LHZpc2libGVBcnJvdzp7ZGVmYXVsdDp0cnVlfSxzaG93VGltZW91dDp7dHlwZTpOdW1iZXIsZGVmYXVsdDoyNTB9LGhpZGVUaW1lb3V0Ont0eXBlOk51bWJlcixkZWZhdWx0OjE1MH0sdGFiaW5kZXg6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MH19LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybnt0aW1lb3V0Om51bGwsdmlzaWJsZTpmYWxzZSx0cmlnZ2VyRWxtOm51bGwsbWVudUl0ZW1zOm51bGwsbWVudUl0ZW1zQXJyYXk6bnVsbCxkcm9wZG93bkVsbTpudWxsLGZvY3VzaW5nOmZhbHNlLGxpc3RJZDonZHJvcGRvd24tbWVudS0nK09iamVjdCh1dGlsX1siZ2VuZXJhdGVJZCJdKSgpfTt9LGNvbXB1dGVkOntkcm9wZG93blNpemU6ZnVuY3Rpb24gZHJvcGRvd25TaXplKCl7cmV0dXJuIHRoaXMuc2l6ZXx8KHRoaXMuJEVMRU1FTlR8fHt9KS5zaXplO319LG1vdW50ZWQ6ZnVuY3Rpb24gbW91bnRlZCgpe3RoaXMuJG9uKCdtZW51LWl0ZW0tY2xpY2snLHRoaXMuaGFuZGxlTWVudUl0ZW1DbGljayk7fSx3YXRjaDp7dmlzaWJsZTpmdW5jdGlvbiB2aXNpYmxlKHZhbCl7dGhpcy5icm9hZGNhc3QoJ0VsRHJvcGRvd25NZW51JywndmlzaWJsZScsdmFsKTt0aGlzLiRlbWl0KCd2aXNpYmxlLWNoYW5nZScsdmFsKTt9LGZvY3VzaW5nOmZ1bmN0aW9uIGZvY3VzaW5nKHZhbCl7dmFyIHNlbGZEZWZpbmU9dGhpcy4kZWwucXVlcnlTZWxlY3RvcignLmVsLWRyb3Bkb3duLXNlbGZkZWZpbmUnKTtpZihzZWxmRGVmaW5lKXsvLyDoh6rlrprkuYkKaWYodmFsKXtzZWxmRGVmaW5lLmNsYXNzTmFtZSs9JyBmb2N1c2luZyc7fWVsc2V7c2VsZkRlZmluZS5jbGFzc05hbWU9c2VsZkRlZmluZS5jbGFzc05hbWUucmVwbGFjZSgnZm9jdXNpbmcnLCcnKTt9fX19LG1ldGhvZHM6e2dldE1pZ3JhdGluZ0NvbmZpZzpmdW5jdGlvbiBnZXRNaWdyYXRpbmdDb25maWcoKXtyZXR1cm57cHJvcHM6eydtZW51LWFsaWduJzonbWVudS1hbGlnbiBpcyByZW5hbWVkIHRvIHBsYWNlbWVudC4nfX07fSxzaG93OmZ1bmN0aW9uIHNob3coKXt2YXIgX3RoaXM9dGhpcztpZih0aGlzLnRyaWdnZXJFbG0uZGlzYWJsZWQpcmV0dXJuO2NsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO3RoaXMudGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7X3RoaXMudmlzaWJsZT10cnVlO30sdGhpcy50cmlnZ2VyPT09J2NsaWNrJz8wOnRoaXMuc2hvd1RpbWVvdXQpO30saGlkZTpmdW5jdGlvbiBoaWRlKCl7dmFyIF90aGlzMj10aGlzO2lmKHRoaXMudHJpZ2dlckVsbS5kaXNhYmxlZClyZXR1cm47dGhpcy5yZW1vdmVUYWJpbmRleCgpO2lmKHRoaXMudGFiaW5kZXg+PTApe3RoaXMucmVzZXRUYWJpbmRleCh0aGlzLnRyaWdnZXJFbG0pO31jbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTt0aGlzLnRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe190aGlzMi52aXNpYmxlPWZhbHNlO30sdGhpcy50cmlnZ2VyPT09J2NsaWNrJz8wOnRoaXMuaGlkZVRpbWVvdXQpO30saGFuZGxlQ2xpY2s6ZnVuY3Rpb24gaGFuZGxlQ2xpY2soKXtpZih0aGlzLnRyaWdnZXJFbG0uZGlzYWJsZWQpcmV0dXJuO2lmKHRoaXMudmlzaWJsZSl7dGhpcy5oaWRlKCk7fWVsc2V7dGhpcy5zaG93KCk7fX0saGFuZGxlVHJpZ2dlcktleURvd246ZnVuY3Rpb24gaGFuZGxlVHJpZ2dlcktleURvd24oZXYpe3ZhciBrZXlDb2RlPWV2LmtleUNvZGU7aWYoWzM4LDQwXS5pbmRleE9mKGtleUNvZGUpPi0xKXsvLyB1cC9kb3duCnRoaXMucmVtb3ZlVGFiaW5kZXgoKTt0aGlzLnJlc2V0VGFiaW5kZXgodGhpcy5tZW51SXRlbXNbMF0pO3RoaXMubWVudUl0ZW1zWzBdLmZvY3VzKCk7ZXYucHJldmVudERlZmF1bHQoKTtldi5zdG9wUHJvcGFnYXRpb24oKTt9ZWxzZSBpZihrZXlDb2RlPT09MTMpey8vIHNwYWNlIGVudGVy6YCJ5LitCnRoaXMuaGFuZGxlQ2xpY2soKTt9ZWxzZSBpZihbOSwyN10uaW5kZXhPZihrZXlDb2RlKT4tMSl7Ly8gdGFiIHx8IGVzYwp0aGlzLmhpZGUoKTt9fSxoYW5kbGVJdGVtS2V5RG93bjpmdW5jdGlvbiBoYW5kbGVJdGVtS2V5RG93bihldil7dmFyIGtleUNvZGU9ZXYua2V5Q29kZTt2YXIgdGFyZ2V0PWV2LnRhcmdldDt2YXIgY3VycmVudEluZGV4PXRoaXMubWVudUl0ZW1zQXJyYXkuaW5kZXhPZih0YXJnZXQpO3ZhciBtYXg9dGhpcy5tZW51SXRlbXNBcnJheS5sZW5ndGgtMTt2YXIgbmV4dEluZGV4PXZvaWQgMDtpZihbMzgsNDBdLmluZGV4T2Yoa2V5Q29kZSk+LTEpey8vIHVwL2Rvd24KaWYoa2V5Q29kZT09PTM4KXsvLyB1cApuZXh0SW5kZXg9Y3VycmVudEluZGV4IT09MD9jdXJyZW50SW5kZXgtMTowO31lbHNley8vIGRvd24KbmV4dEluZGV4PWN1cnJlbnRJbmRleDxtYXg/Y3VycmVudEluZGV4KzE6bWF4O310aGlzLnJlbW92ZVRhYmluZGV4KCk7dGhpcy5yZXNldFRhYmluZGV4KHRoaXMubWVudUl0ZW1zW25leHRJbmRleF0pO3RoaXMubWVudUl0ZW1zW25leHRJbmRleF0uZm9jdXMoKTtldi5wcmV2ZW50RGVmYXVsdCgpO2V2LnN0b3BQcm9wYWdhdGlvbigpO31lbHNlIGlmKGtleUNvZGU9PT0xMyl7Ly8gZW50ZXLpgInkuK0KdGhpcy50cmlnZ2VyRWxtRm9jdXMoKTt0YXJnZXQuY2xpY2soKTtpZih0aGlzLmhpZGVPbkNsaWNrKXsvLyBjbGlja+WFs+mXrQp0aGlzLnZpc2libGU9ZmFsc2U7fX1lbHNlIGlmKFs5LDI3XS5pbmRleE9mKGtleUNvZGUpPi0xKXsvLyB0YWIgLy8gZXNjCnRoaXMuaGlkZSgpO3RoaXMudHJpZ2dlckVsbUZvY3VzKCk7fX0scmVzZXRUYWJpbmRleDpmdW5jdGlvbiByZXNldFRhYmluZGV4KGVsZSl7Ly8g5LiL5qyhdGFi5pe257uE5Lu26IGa54Sm5YWD57SgCnRoaXMucmVtb3ZlVGFiaW5kZXgoKTtlbGUuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsJzAnKTsvLyDkuIvmrKHmnJ/mnJvnmoTogZrnhKblhYPntKAKfSxyZW1vdmVUYWJpbmRleDpmdW5jdGlvbiByZW1vdmVUYWJpbmRleCgpe3RoaXMudHJpZ2dlckVsbS5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywnLTEnKTt0aGlzLm1lbnVJdGVtc0FycmF5LmZvckVhY2goZnVuY3Rpb24oaXRlbSl7aXRlbS5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywnLTEnKTt9KTt9LGluaXRBcmlhOmZ1bmN0aW9uIGluaXRBcmlhKCl7dGhpcy5kcm9wZG93bkVsbS5zZXRBdHRyaWJ1dGUoJ2lkJyx0aGlzLmxpc3RJZCk7dGhpcy50cmlnZ2VyRWxtLnNldEF0dHJpYnV0ZSgnYXJpYS1oYXNwb3B1cCcsJ2xpc3QnKTt0aGlzLnRyaWdnZXJFbG0uc2V0QXR0cmlidXRlKCdhcmlhLWNvbnRyb2xzJyx0aGlzLmxpc3RJZCk7aWYoIXRoaXMuc3BsaXRCdXR0b24pey8vIOiHquWumuS5iQp0aGlzLnRyaWdnZXJFbG0uc2V0QXR0cmlidXRlKCdyb2xlJywnYnV0dG9uJyk7dGhpcy50cmlnZ2VyRWxtLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLHRoaXMudGFiaW5kZXgpO3RoaXMudHJpZ2dlckVsbS5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywodGhpcy50cmlnZ2VyRWxtLmdldEF0dHJpYnV0ZSgnY2xhc3MnKXx8JycpKycgZWwtZHJvcGRvd24tc2VsZmRlZmluZScpOy8vIOaOp+WItgp9fSxpbml0RXZlbnQ6ZnVuY3Rpb24gaW5pdEV2ZW50KCl7dmFyIF90aGlzMz10aGlzO3ZhciB0cmlnZ2VyPXRoaXMudHJpZ2dlcixzaG93PXRoaXMuc2hvdyxoaWRlPXRoaXMuaGlkZSxoYW5kbGVDbGljaz10aGlzLmhhbmRsZUNsaWNrLHNwbGl0QnV0dG9uPXRoaXMuc3BsaXRCdXR0b24saGFuZGxlVHJpZ2dlcktleURvd249dGhpcy5oYW5kbGVUcmlnZ2VyS2V5RG93bixoYW5kbGVJdGVtS2V5RG93bj10aGlzLmhhbmRsZUl0ZW1LZXlEb3duO3RoaXMudHJpZ2dlckVsbT1zcGxpdEJ1dHRvbj90aGlzLiRyZWZzLnRyaWdnZXIuJGVsOnRoaXMuJHNsb3RzLmRlZmF1bHRbMF0uZWxtO3ZhciBkcm9wZG93bkVsbT10aGlzLmRyb3Bkb3duRWxtO3RoaXMudHJpZ2dlckVsbS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxoYW5kbGVUcmlnZ2VyS2V5RG93bik7Ly8gdHJpZ2dlckVsbSBrZXlkb3duCmRyb3Bkb3duRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLGhhbmRsZUl0ZW1LZXlEb3duLHRydWUpOy8vIGl0ZW0ga2V5ZG93bgovLyDmjqfliLboh6rlrprkuYnlhYPntKDnmoTmoLflvI8KaWYoIXNwbGl0QnV0dG9uKXt0aGlzLnRyaWdnZXJFbG0uYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLGZ1bmN0aW9uKCl7X3RoaXMzLmZvY3VzaW5nPXRydWU7fSk7dGhpcy50cmlnZ2VyRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLGZ1bmN0aW9uKCl7X3RoaXMzLmZvY3VzaW5nPWZhbHNlO30pO3RoaXMudHJpZ2dlckVsbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXtfdGhpczMuZm9jdXNpbmc9ZmFsc2U7fSk7fWlmKHRyaWdnZXI9PT0naG92ZXInKXt0aGlzLnRyaWdnZXJFbG0uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsc2hvdyk7dGhpcy50cmlnZ2VyRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLGhpZGUpO2Ryb3Bkb3duRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLHNob3cpO2Ryb3Bkb3duRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLGhpZGUpO31lbHNlIGlmKHRyaWdnZXI9PT0nY2xpY2snKXt0aGlzLnRyaWdnZXJFbG0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGhhbmRsZUNsaWNrKTt9fSxoYW5kbGVNZW51SXRlbUNsaWNrOmZ1bmN0aW9uIGhhbmRsZU1lbnVJdGVtQ2xpY2soY29tbWFuZCxpbnN0YW5jZSl7aWYodGhpcy5oaWRlT25DbGljayl7dGhpcy52aXNpYmxlPWZhbHNlO310aGlzLiRlbWl0KCdjb21tYW5kJyxjb21tYW5kLGluc3RhbmNlKTt9LHRyaWdnZXJFbG1Gb2N1czpmdW5jdGlvbiB0cmlnZ2VyRWxtRm9jdXMoKXt0aGlzLnRyaWdnZXJFbG0uZm9jdXMmJnRoaXMudHJpZ2dlckVsbS5mb2N1cygpO30saW5pdERvbU9wZXJhdGlvbjpmdW5jdGlvbiBpbml0RG9tT3BlcmF0aW9uKCl7dGhpcy5kcm9wZG93bkVsbT10aGlzLnBvcHBlckVsbTt0aGlzLm1lbnVJdGVtcz10aGlzLmRyb3Bkb3duRWxtLnF1ZXJ5U2VsZWN0b3JBbGwoIlt0YWJpbmRleD0nLTEnXSIpO3RoaXMubWVudUl0ZW1zQXJyYXk9W10uc2xpY2UuY2FsbCh0aGlzLm1lbnVJdGVtcyk7dGhpcy5pbml0RXZlbnQoKTt0aGlzLmluaXRBcmlhKCk7fX0scmVuZGVyOmZ1bmN0aW9uIHJlbmRlcihoKXt2YXIgX3RoaXM0PXRoaXM7dmFyIGhpZGU9dGhpcy5oaWRlLHNwbGl0QnV0dG9uPXRoaXMuc3BsaXRCdXR0b24sdHlwZT10aGlzLnR5cGUsZHJvcGRvd25TaXplPXRoaXMuZHJvcGRvd25TaXplO3ZhciBoYW5kbGVNYWluQnV0dG9uQ2xpY2s9ZnVuY3Rpb24gaGFuZGxlTWFpbkJ1dHRvbkNsaWNrKGV2ZW50KXtfdGhpczQuJGVtaXQoJ2NsaWNrJyxldmVudCk7aGlkZSgpO307dmFyIHRyaWdnZXJFbG09IXNwbGl0QnV0dG9uP3RoaXMuJHNsb3RzLmRlZmF1bHQ6aCgnZWwtYnV0dG9uLWdyb3VwJyxbaCgnZWwtYnV0dG9uJyx7YXR0cnM6e3R5cGU6dHlwZSxzaXplOmRyb3Bkb3duU2l6ZX0sbmF0aXZlT246eydjbGljayc6aGFuZGxlTWFpbkJ1dHRvbkNsaWNrfX0sW3RoaXMuJHNsb3RzLmRlZmF1bHRdKSxoKCdlbC1idXR0b24nLHtyZWY6J3RyaWdnZXInLGF0dHJzOnt0eXBlOnR5cGUsc2l6ZTpkcm9wZG93blNpemV9LCdjbGFzcyc6J2VsLWRyb3Bkb3duX19jYXJldC1idXR0b24nfSxbaCgnaScseydjbGFzcyc6J2VsLWRyb3Bkb3duX19pY29uIGVsLWljb24tYXJyb3ctZG93bid9KV0pXSk7cmV0dXJuIGgoJ2RpdicseydjbGFzcyc6J2VsLWRyb3Bkb3duJyxkaXJlY3RpdmVzOlt7bmFtZTonY2xpY2tvdXRzaWRlJyx2YWx1ZTpoaWRlfV19LFt0cmlnZ2VyRWxtLHRoaXMuJHNsb3RzLmRyb3Bkb3duXSk7fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kcm9wZG93bi9zcmMvZHJvcGRvd24udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHNyY19kcm9wZG93bnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz1kcm9wZG93bnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Ryb3Bkb3duL3NyYy9kcm9wZG93bi52dWUKdmFyIGRyb3Bkb3duX3JlbmRlcixkcm9wZG93bl9zdGF0aWNSZW5kZXJGbnM7Lyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciBkcm9wZG93bl9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHNyY19kcm9wZG93bnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxkcm9wZG93bl9yZW5kZXIsZHJvcGRvd25fc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciBkcm9wZG93bl9hcGk7fWRyb3Bkb3duX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvZHJvcGRvd24vc3JjL2Ryb3Bkb3duLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBkcm9wZG93bj1kcm9wZG93bl9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Ryb3Bkb3duL2luZGV4LmpzCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovZHJvcGRvd24uaW5zdGFsbD1mdW5jdGlvbihWdWUpe1Z1ZS5jb21wb25lbnQoZHJvcGRvd24ubmFtZSxkcm9wZG93bik7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX2Ryb3Bkb3duPWRyb3Bkb3duOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZHJvcGRvd24vc3JjL2Ryb3Bkb3duLW1lbnUudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTBkYTZiNzE0Jgp2YXIgZHJvcGRvd25fbWVudXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzBkYTZiNzE0X3JlbmRlcj1mdW5jdGlvbiBkcm9wZG93bl9tZW51dnVlX3R5cGVfdGVtcGxhdGVfaWRfMGRhNmI3MTRfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJ0cmFuc2l0aW9uIix7YXR0cnM6e25hbWU6ImVsLXpvb20taW4tdG9wIn0sb246eyJhZnRlci1sZWF2ZSI6X3ZtLmRvRGVzdHJveX19LFtfYygidWwiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTpfdm0uc2hvd1BvcHBlcixleHByZXNzaW9uOiJzaG93UG9wcGVyIn1dLHN0YXRpY0NsYXNzOiJlbC1kcm9wZG93bi1tZW51IGVsLXBvcHBlciIsY2xhc3M6W192bS5zaXplJiYiZWwtZHJvcGRvd24tbWVudS0tIitfdm0uc2l6ZV19LFtfdm0uX3QoImRlZmF1bHQiKV0sMildKTt9O3ZhciBkcm9wZG93bl9tZW51dnVlX3R5cGVfdGVtcGxhdGVfaWRfMGRhNmI3MTRfc3RhdGljUmVuZGVyRm5zPVtdO2Ryb3Bkb3duX21lbnV2dWVfdHlwZV90ZW1wbGF0ZV9pZF8wZGE2YjcxNF9yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZHJvcGRvd24vc3JjL2Ryb3Bkb3duLW1lbnUudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTBkYTZiNzE0JgovLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9kcm9wZG93bi9zcmMvZHJvcGRvd24tbWVudS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgZHJvcGRvd25fbWVudXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17bmFtZTonRWxEcm9wZG93bk1lbnUnLGNvbXBvbmVudE5hbWU6J0VsRHJvcGRvd25NZW51JyxtaXhpbnM6W3Z1ZV9wb3BwZXJfZGVmYXVsdC5hXSxwcm9wczp7dmlzaWJsZUFycm93Ont0eXBlOkJvb2xlYW4sZGVmYXVsdDp0cnVlfSxhcnJvd09mZnNldDp7dHlwZTpOdW1iZXIsZGVmYXVsdDowfX0sZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue3NpemU6dGhpcy5kcm9wZG93bi5kcm9wZG93blNpemV9O30saW5qZWN0OlsnZHJvcGRvd24nXSxjcmVhdGVkOmZ1bmN0aW9uIGNyZWF0ZWQoKXt2YXIgX3RoaXM9dGhpczt0aGlzLiRvbigndXBkYXRlUG9wcGVyJyxmdW5jdGlvbigpe2lmKF90aGlzLnNob3dQb3BwZXIpX3RoaXMudXBkYXRlUG9wcGVyKCk7fSk7dGhpcy4kb24oJ3Zpc2libGUnLGZ1bmN0aW9uKHZhbCl7X3RoaXMuc2hvd1BvcHBlcj12YWw7fSk7fSxtb3VudGVkOmZ1bmN0aW9uIG1vdW50ZWQoKXt0aGlzLmRyb3Bkb3duLnBvcHBlckVsbT10aGlzLnBvcHBlckVsbT10aGlzLiRlbDt0aGlzLnJlZmVyZW5jZUVsbT10aGlzLmRyb3Bkb3duLiRlbDsvLyBjb21wYXRpYmxlIHdpdGggMi42IG5ldyB2LXNsb3Qgc3ludGF4Ci8vIGlzc3VlIGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL0VsZW1lRkUvZWxlbWVudC9pc3N1ZXMvMTQzNDUKdGhpcy5kcm9wZG93bi5pbml0RG9tT3BlcmF0aW9uKCk7fSx3YXRjaDp7J2Ryb3Bkb3duLnBsYWNlbWVudCc6e2ltbWVkaWF0ZTp0cnVlLGhhbmRsZXI6ZnVuY3Rpb24gaGFuZGxlcih2YWwpe3RoaXMuY3VycmVudFBsYWNlbWVudD12YWw7fX19fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Ryb3Bkb3duL3NyYy9kcm9wZG93bi1tZW51LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfZHJvcGRvd25fbWVudXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz1kcm9wZG93bl9tZW51dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZHJvcGRvd24vc3JjL2Ryb3Bkb3duLW1lbnUudnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgZHJvcGRvd25fbWVudV9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHNyY19kcm9wZG93bl9tZW51dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLGRyb3Bkb3duX21lbnV2dWVfdHlwZV90ZW1wbGF0ZV9pZF8wZGE2YjcxNF9yZW5kZXIsZHJvcGRvd25fbWVudXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzBkYTZiNzE0X3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgZHJvcGRvd25fbWVudV9hcGk7fWRyb3Bkb3duX21lbnVfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy9kcm9wZG93bi9zcmMvZHJvcGRvd24tbWVudS52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgZHJvcGRvd25fbWVudT1kcm9wZG93bl9tZW51X2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZHJvcGRvd24tbWVudS9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL2Ryb3Bkb3duX21lbnUuaW5zdGFsbD1mdW5jdGlvbihWdWUpe1Z1ZS5jb21wb25lbnQoZHJvcGRvd25fbWVudS5uYW1lLGRyb3Bkb3duX21lbnUpO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYWNrYWdlc19kcm9wZG93bl9tZW51PWRyb3Bkb3duX21lbnU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9kcm9wZG93bi9zcmMvZHJvcGRvd24taXRlbS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NjM1OTEwMmEmCnZhciBkcm9wZG93bl9pdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfNjM1OTEwMmFfcmVuZGVyPWZ1bmN0aW9uIGRyb3Bkb3duX2l0ZW12dWVfdHlwZV90ZW1wbGF0ZV9pZF82MzU5MTAyYV9yZW5kZXIoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDt2YXIgX2M9X3ZtLl9zZWxmLl9jfHxfaDtyZXR1cm4gX2MoImxpIix7c3RhdGljQ2xhc3M6ImVsLWRyb3Bkb3duLW1lbnVfX2l0ZW0iLGNsYXNzOnsiaXMtZGlzYWJsZWQiOl92bS5kaXNhYmxlZCwiZWwtZHJvcGRvd24tbWVudV9faXRlbS0tZGl2aWRlZCI6X3ZtLmRpdmlkZWR9LGF0dHJzOnsiYXJpYS1kaXNhYmxlZCI6X3ZtLmRpc2FibGVkLHRhYmluZGV4Ol92bS5kaXNhYmxlZD9udWxsOi0xfSxvbjp7Y2xpY2s6X3ZtLmhhbmRsZUNsaWNrfX0sW192bS5pY29uP19jKCJpIix7Y2xhc3M6X3ZtLmljb259KTpfdm0uX2UoKSxfdm0uX3QoImRlZmF1bHQiKV0sMik7fTt2YXIgZHJvcGRvd25faXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzYzNTkxMDJhX3N0YXRpY1JlbmRlckZucz1bXTtkcm9wZG93bl9pdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfNjM1OTEwMmFfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Ryb3Bkb3duL3NyYy9kcm9wZG93bi1pdGVtLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD02MzU5MTAyYSYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZHJvcGRvd24vc3JjL2Ryb3Bkb3duLWl0ZW0udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGRyb3Bkb3duX2l0ZW12dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e25hbWU6J0VsRHJvcGRvd25JdGVtJyxtaXhpbnM6W2VtaXR0ZXJfZGVmYXVsdC5hXSxwcm9wczp7Y29tbWFuZDp7fSxkaXNhYmxlZDpCb29sZWFuLGRpdmlkZWQ6Qm9vbGVhbixpY29uOlN0cmluZ30sbWV0aG9kczp7aGFuZGxlQ2xpY2s6ZnVuY3Rpb24gaGFuZGxlQ2xpY2soZSl7dGhpcy5kaXNwYXRjaCgnRWxEcm9wZG93bicsJ21lbnUtaXRlbS1jbGljaycsW3RoaXMuY29tbWFuZCx0aGlzXSk7fX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZHJvcGRvd24vc3JjL2Ryb3Bkb3duLWl0ZW0udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHNyY19kcm9wZG93bl9pdGVtdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPWRyb3Bkb3duX2l0ZW12dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kcm9wZG93bi9zcmMvZHJvcGRvd24taXRlbS52dWUKLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciBkcm9wZG93bl9pdGVtX2NvbXBvbmVudD1ub3JtYWxpemVDb21wb25lbnQoc3JjX2Ryb3Bkb3duX2l0ZW12dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sZHJvcGRvd25faXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzYzNTkxMDJhX3JlbmRlcixkcm9wZG93bl9pdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfNjM1OTEwMmFfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciBkcm9wZG93bl9pdGVtX2FwaTt9ZHJvcGRvd25faXRlbV9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL2Ryb3Bkb3duL3NyYy9kcm9wZG93bi1pdGVtLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBkcm9wZG93bl9pdGVtPWRyb3Bkb3duX2l0ZW1fY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kcm9wZG93bi1pdGVtL2luZGV4LmpzCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovZHJvcGRvd25faXRlbS5pbnN0YWxsPWZ1bmN0aW9uKFZ1ZSl7VnVlLmNvbXBvbmVudChkcm9wZG93bl9pdGVtLm5hbWUsZHJvcGRvd25faXRlbSk7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX2Ryb3Bkb3duX2l0ZW09ZHJvcGRvd25faXRlbTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy91dGlscy9hcmlhLXV0aWxzLmpzCnZhciBhcmlhPWFyaWF8fHt9O2FyaWEuVXRpbHM9YXJpYS5VdGlsc3x8e307LyoqCiAqIEBkZXNjIFNldCBmb2N1cyBvbiBkZXNjZW5kYW50IG5vZGVzIHVudGlsIHRoZSBmaXJzdCBmb2N1c2FibGUgZWxlbWVudCBpcwogKiAgICAgICBmb3VuZC4KICogQHBhcmFtIGVsZW1lbnQKICogICAgICAgICAgRE9NIG5vZGUgZm9yIHdoaWNoIHRvIGZpbmQgdGhlIGZpcnN0IGZvY3VzYWJsZSBkZXNjZW5kYW50LgogKiBAcmV0dXJucwogKiAgdHJ1ZSBpZiBhIGZvY3VzYWJsZSBlbGVtZW50IGlzIGZvdW5kIGFuZCBmb2N1cyBpcyBzZXQuCiAqL2FyaWEuVXRpbHMuZm9jdXNGaXJzdERlc2NlbmRhbnQ9ZnVuY3Rpb24oZWxlbWVudCl7Zm9yKHZhciBpPTA7aTxlbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoO2krKyl7dmFyIGNoaWxkPWVsZW1lbnQuY2hpbGROb2Rlc1tpXTtpZihhcmlhLlV0aWxzLmF0dGVtcHRGb2N1cyhjaGlsZCl8fGFyaWEuVXRpbHMuZm9jdXNGaXJzdERlc2NlbmRhbnQoY2hpbGQpKXtyZXR1cm4gdHJ1ZTt9fXJldHVybiBmYWxzZTt9Oy8qKgogKiBAZGVzYyBGaW5kIHRoZSBsYXN0IGRlc2NlbmRhbnQgbm9kZSB0aGF0IGlzIGZvY3VzYWJsZS4KICogQHBhcmFtIGVsZW1lbnQKICogICAgICAgICAgRE9NIG5vZGUgZm9yIHdoaWNoIHRvIGZpbmQgdGhlIGxhc3QgZm9jdXNhYmxlIGRlc2NlbmRhbnQuCiAqIEByZXR1cm5zCiAqICB0cnVlIGlmIGEgZm9jdXNhYmxlIGVsZW1lbnQgaXMgZm91bmQgYW5kIGZvY3VzIGlzIHNldC4KICovYXJpYS5VdGlscy5mb2N1c0xhc3REZXNjZW5kYW50PWZ1bmN0aW9uKGVsZW1lbnQpe2Zvcih2YXIgaT1lbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoLTE7aT49MDtpLS0pe3ZhciBjaGlsZD1lbGVtZW50LmNoaWxkTm9kZXNbaV07aWYoYXJpYS5VdGlscy5hdHRlbXB0Rm9jdXMoY2hpbGQpfHxhcmlhLlV0aWxzLmZvY3VzTGFzdERlc2NlbmRhbnQoY2hpbGQpKXtyZXR1cm4gdHJ1ZTt9fXJldHVybiBmYWxzZTt9Oy8qKgogKiBAZGVzYyBTZXQgQXR0ZW1wdCB0byBzZXQgZm9jdXMgb24gdGhlIGN1cnJlbnQgbm9kZS4KICogQHBhcmFtIGVsZW1lbnQKICogICAgICAgICAgVGhlIG5vZGUgdG8gYXR0ZW1wdCB0byBmb2N1cyBvbi4KICogQHJldHVybnMKICogIHRydWUgaWYgZWxlbWVudCBpcyBmb2N1c2VkLgogKi9hcmlhLlV0aWxzLmF0dGVtcHRGb2N1cz1mdW5jdGlvbihlbGVtZW50KXtpZighYXJpYS5VdGlscy5pc0ZvY3VzYWJsZShlbGVtZW50KSl7cmV0dXJuIGZhbHNlO31hcmlhLlV0aWxzLklnbm9yZVV0aWxGb2N1c0NoYW5nZXM9dHJ1ZTt0cnl7ZWxlbWVudC5mb2N1cygpO31jYXRjaChlKXt9YXJpYS5VdGlscy5JZ25vcmVVdGlsRm9jdXNDaGFuZ2VzPWZhbHNlO3JldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09ZWxlbWVudDt9O2FyaWEuVXRpbHMuaXNGb2N1c2FibGU9ZnVuY3Rpb24oZWxlbWVudCl7aWYoZWxlbWVudC50YWJJbmRleD4wfHxlbGVtZW50LnRhYkluZGV4PT09MCYmZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3RhYkluZGV4JykhPT1udWxsKXtyZXR1cm4gdHJ1ZTt9aWYoZWxlbWVudC5kaXNhYmxlZCl7cmV0dXJuIGZhbHNlO31zd2l0Y2goZWxlbWVudC5ub2RlTmFtZSl7Y2FzZSdBJzpyZXR1cm4hIWVsZW1lbnQuaHJlZiYmZWxlbWVudC5yZWwhPT0naWdub3JlJztjYXNlJ0lOUFVUJzpyZXR1cm4gZWxlbWVudC50eXBlIT09J2hpZGRlbicmJmVsZW1lbnQudHlwZSE9PSdmaWxlJztjYXNlJ0JVVFRPTic6Y2FzZSdTRUxFQ1QnOmNhc2UnVEVYVEFSRUEnOnJldHVybiB0cnVlO2RlZmF1bHQ6cmV0dXJuIGZhbHNlO319Oy8qKgogKiDop6blj5HkuIDkuKrkuovku7YKICogbW91c2VlbnRlciwgbW91c2VsZWF2ZSwgbW91c2VvdmVyLCBrZXl1cCwgY2hhbmdlLCBjbGljayDnrYkKICogQHBhcmFtICB7RWxlbWVudH0gZWxtCiAqIEBwYXJhbSAge1N0cmluZ30gbmFtZQogKiBAcGFyYW0gIHsqfSBvcHRzCiAqL2FyaWEuVXRpbHMudHJpZ2dlckV2ZW50PWZ1bmN0aW9uKGVsbSxuYW1lKXt2YXIgZXZlbnROYW1lPXZvaWQgMDtpZigvXm1vdXNlfGNsaWNrLy50ZXN0KG5hbWUpKXtldmVudE5hbWU9J01vdXNlRXZlbnRzJzt9ZWxzZSBpZigvXmtleS8udGVzdChuYW1lKSl7ZXZlbnROYW1lPSdLZXlib2FyZEV2ZW50Jzt9ZWxzZXtldmVudE5hbWU9J0hUTUxFdmVudHMnO312YXIgZXZ0PWRvY3VtZW50LmNyZWF0ZUV2ZW50KGV2ZW50TmFtZSk7Zm9yKHZhciBfbGVuPWFyZ3VtZW50cy5sZW5ndGgsb3B0cz1BcnJheShfbGVuPjI/X2xlbi0yOjApLF9rZXk9Mjtfa2V5PF9sZW47X2tleSsrKXtvcHRzW19rZXktMl09YXJndW1lbnRzW19rZXldO31ldnQuaW5pdEV2ZW50LmFwcGx5KGV2dCxbbmFtZV0uY29uY2F0KG9wdHMpKTtlbG0uZGlzcGF0Y2hFdmVudD9lbG0uZGlzcGF0Y2hFdmVudChldnQpOmVsbS5maXJlRXZlbnQoJ29uJytuYW1lLGV2dCk7cmV0dXJuIGVsbTt9O2FyaWEuVXRpbHMua2V5cz17dGFiOjksZW50ZXI6MTMsc3BhY2U6MzIsbGVmdDozNyx1cDozOCxyaWdodDozOSxkb3duOjQwLGVzYzoyN307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBhcmlhX3V0aWxzPWFyaWEuVXRpbHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvdXRpbHMvbWVudS9hcmlhLXN1Ym1lbnUuanMKdmFyIFN1Yk1lbnU9ZnVuY3Rpb24gU3ViTWVudShwYXJlbnQsZG9tTm9kZSl7dGhpcy5kb21Ob2RlPWRvbU5vZGU7dGhpcy5wYXJlbnQ9cGFyZW50O3RoaXMuc3ViTWVudUl0ZW1zPVtdO3RoaXMuc3ViSW5kZXg9MDt0aGlzLmluaXQoKTt9O1N1Yk1lbnUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLnN1Yk1lbnVJdGVtcz10aGlzLmRvbU5vZGUucXVlcnlTZWxlY3RvckFsbCgnbGknKTt0aGlzLmFkZExpc3RlbmVycygpO307U3ViTWVudS5wcm90b3R5cGUuZ290b1N1YkluZGV4PWZ1bmN0aW9uKGlkeCl7aWYoaWR4PT09dGhpcy5zdWJNZW51SXRlbXMubGVuZ3RoKXtpZHg9MDt9ZWxzZSBpZihpZHg8MCl7aWR4PXRoaXMuc3ViTWVudUl0ZW1zLmxlbmd0aC0xO310aGlzLnN1Yk1lbnVJdGVtc1tpZHhdLmZvY3VzKCk7dGhpcy5zdWJJbmRleD1pZHg7fTtTdWJNZW51LnByb3RvdHlwZS5hZGRMaXN0ZW5lcnM9ZnVuY3Rpb24oKXt2YXIgX3RoaXM9dGhpczt2YXIga2V5cz1hcmlhX3V0aWxzLmtleXM7dmFyIHBhcmVudE5vZGU9dGhpcy5wYXJlbnQuZG9tTm9kZTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHRoaXMuc3ViTWVudUl0ZW1zLGZ1bmN0aW9uKGVsKXtlbC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxmdW5jdGlvbihldmVudCl7dmFyIHByZXZEZWY9ZmFsc2U7c3dpdGNoKGV2ZW50LmtleUNvZGUpe2Nhc2Uga2V5cy5kb3duOl90aGlzLmdvdG9TdWJJbmRleChfdGhpcy5zdWJJbmRleCsxKTtwcmV2RGVmPXRydWU7YnJlYWs7Y2FzZSBrZXlzLnVwOl90aGlzLmdvdG9TdWJJbmRleChfdGhpcy5zdWJJbmRleC0xKTtwcmV2RGVmPXRydWU7YnJlYWs7Y2FzZSBrZXlzLnRhYjphcmlhX3V0aWxzLnRyaWdnZXJFdmVudChwYXJlbnROb2RlLCdtb3VzZWxlYXZlJyk7YnJlYWs7Y2FzZSBrZXlzLmVudGVyOmNhc2Uga2V5cy5zcGFjZTpwcmV2RGVmPXRydWU7ZXZlbnQuY3VycmVudFRhcmdldC5jbGljaygpO2JyZWFrO31pZihwcmV2RGVmKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO2V2ZW50LnN0b3BQcm9wYWdhdGlvbigpO31yZXR1cm4gZmFsc2U7fSk7fSk7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGFyaWFfc3VibWVudT1TdWJNZW51Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL3V0aWxzL21lbnUvYXJpYS1tZW51aXRlbS5qcwp2YXIgTWVudUl0ZW09ZnVuY3Rpb24gTWVudUl0ZW0oZG9tTm9kZSl7dGhpcy5kb21Ob2RlPWRvbU5vZGU7dGhpcy5zdWJtZW51PW51bGw7dGhpcy5pbml0KCk7fTtNZW51SXRlbS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3RoaXMuZG9tTm9kZS5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywnMCcpO3ZhciBtZW51Q2hpbGQ9dGhpcy5kb21Ob2RlLnF1ZXJ5U2VsZWN0b3IoJy5lbC1tZW51Jyk7aWYobWVudUNoaWxkKXt0aGlzLnN1Ym1lbnU9bmV3IGFyaWFfc3VibWVudSh0aGlzLG1lbnVDaGlsZCk7fXRoaXMuYWRkTGlzdGVuZXJzKCk7fTtNZW51SXRlbS5wcm90b3R5cGUuYWRkTGlzdGVuZXJzPWZ1bmN0aW9uKCl7dmFyIF90aGlzPXRoaXM7dmFyIGtleXM9YXJpYV91dGlscy5rZXlzO3RoaXMuZG9tTm9kZS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxmdW5jdGlvbihldmVudCl7dmFyIHByZXZEZWY9ZmFsc2U7c3dpdGNoKGV2ZW50LmtleUNvZGUpe2Nhc2Uga2V5cy5kb3duOmFyaWFfdXRpbHMudHJpZ2dlckV2ZW50KGV2ZW50LmN1cnJlbnRUYXJnZXQsJ21vdXNlZW50ZXInKTtfdGhpcy5zdWJtZW51JiZfdGhpcy5zdWJtZW51LmdvdG9TdWJJbmRleCgwKTtwcmV2RGVmPXRydWU7YnJlYWs7Y2FzZSBrZXlzLnVwOmFyaWFfdXRpbHMudHJpZ2dlckV2ZW50KGV2ZW50LmN1cnJlbnRUYXJnZXQsJ21vdXNlZW50ZXInKTtfdGhpcy5zdWJtZW51JiZfdGhpcy5zdWJtZW51LmdvdG9TdWJJbmRleChfdGhpcy5zdWJtZW51LnN1Yk1lbnVJdGVtcy5sZW5ndGgtMSk7cHJldkRlZj10cnVlO2JyZWFrO2Nhc2Uga2V5cy50YWI6YXJpYV91dGlscy50cmlnZ2VyRXZlbnQoZXZlbnQuY3VycmVudFRhcmdldCwnbW91c2VsZWF2ZScpO2JyZWFrO2Nhc2Uga2V5cy5lbnRlcjpjYXNlIGtleXMuc3BhY2U6cHJldkRlZj10cnVlO2V2ZW50LmN1cnJlbnRUYXJnZXQuY2xpY2soKTticmVhazt9aWYocHJldkRlZil7ZXZlbnQucHJldmVudERlZmF1bHQoKTt9fSk7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGFyaWFfbWVudWl0ZW09TWVudUl0ZW07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvdXRpbHMvbWVudS9hcmlhLW1lbnViYXIuanMKdmFyIE1lbnU9ZnVuY3Rpb24gTWVudShkb21Ob2RlKXt0aGlzLmRvbU5vZGU9ZG9tTm9kZTt0aGlzLmluaXQoKTt9O01lbnUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt2YXIgbWVudUNoaWxkcmVuPXRoaXMuZG9tTm9kZS5jaGlsZE5vZGVzO1tdLmZpbHRlci5jYWxsKG1lbnVDaGlsZHJlbixmdW5jdGlvbihjaGlsZCl7cmV0dXJuIGNoaWxkLm5vZGVUeXBlPT09MTt9KS5mb3JFYWNoKGZ1bmN0aW9uKGNoaWxkKXtuZXcgYXJpYV9tZW51aXRlbShjaGlsZCk7Ly8gZXNsaW50LWRpc2FibGUtbGluZQp9KTt9Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgYXJpYV9tZW51YmFyPU1lbnU7Ly8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCAiZWxlbWVudC11aS9saWIvdXRpbHMvZG9tIgp2YXIgZG9tXz1fX3dlYnBhY2tfcmVxdWlyZV9fKDEpOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL21lbnUvc3JjL21lbnUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIG1lbnV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e25hbWU6J0VsTWVudScscmVuZGVyOmZ1bmN0aW9uIHJlbmRlcihoKXt2YXIgY29tcG9uZW50PWgoJ3VsJyx7YXR0cnM6e3JvbGU6J21lbnViYXInfSxrZXk6K3RoaXMuY29sbGFwc2Usc3R5bGU6e2JhY2tncm91bmRDb2xvcjp0aGlzLmJhY2tncm91bmRDb2xvcnx8Jyd9LCdjbGFzcyc6eydlbC1tZW51LS1ob3Jpem9udGFsJzp0aGlzLm1vZGU9PT0naG9yaXpvbnRhbCcsJ2VsLW1lbnUtLWNvbGxhcHNlJzp0aGlzLmNvbGxhcHNlLCJlbC1tZW51Ijp0cnVlfX0sW3RoaXMuJHNsb3RzLmRlZmF1bHRdKTtpZih0aGlzLmNvbGxhcHNlVHJhbnNpdGlvbil7cmV0dXJuIGgoJ2VsLW1lbnUtY29sbGFwc2UtdHJhbnNpdGlvbicsW2NvbXBvbmVudF0pO31lbHNle3JldHVybiBjb21wb25lbnQ7fX0sY29tcG9uZW50TmFtZTonRWxNZW51JyxtaXhpbnM6W2VtaXR0ZXJfZGVmYXVsdC5hLG1pZ3JhdGluZ19kZWZhdWx0LmFdLHByb3ZpZGU6ZnVuY3Rpb24gcHJvdmlkZSgpe3JldHVybntyb290TWVudTp0aGlzfTt9LGNvbXBvbmVudHM6eydlbC1tZW51LWNvbGxhcHNlLXRyYW5zaXRpb24nOntmdW5jdGlvbmFsOnRydWUscmVuZGVyOmZ1bmN0aW9uIHJlbmRlcihjcmVhdGVFbGVtZW50LGNvbnRleHQpe3ZhciBkYXRhPXtwcm9wczp7bW9kZTonb3V0LWluJ30sb246e2JlZm9yZUVudGVyOmZ1bmN0aW9uIGJlZm9yZUVudGVyKGVsKXtlbC5zdHlsZS5vcGFjaXR5PTAuMjt9LGVudGVyOmZ1bmN0aW9uIGVudGVyKGVsKXtPYmplY3QoZG9tX1siYWRkQ2xhc3MiXSkoZWwsJ2VsLW9wYWNpdHktdHJhbnNpdGlvbicpO2VsLnN0eWxlLm9wYWNpdHk9MTt9LGFmdGVyRW50ZXI6ZnVuY3Rpb24gYWZ0ZXJFbnRlcihlbCl7T2JqZWN0KGRvbV9bInJlbW92ZUNsYXNzIl0pKGVsLCdlbC1vcGFjaXR5LXRyYW5zaXRpb24nKTtlbC5zdHlsZS5vcGFjaXR5PScnO30sYmVmb3JlTGVhdmU6ZnVuY3Rpb24gYmVmb3JlTGVhdmUoZWwpe2lmKCFlbC5kYXRhc2V0KWVsLmRhdGFzZXQ9e307aWYoT2JqZWN0KGRvbV9bImhhc0NsYXNzIl0pKGVsLCdlbC1tZW51LS1jb2xsYXBzZScpKXtPYmplY3QoZG9tX1sicmVtb3ZlQ2xhc3MiXSkoZWwsJ2VsLW1lbnUtLWNvbGxhcHNlJyk7ZWwuZGF0YXNldC5vbGRPdmVyZmxvdz1lbC5zdHlsZS5vdmVyZmxvdztlbC5kYXRhc2V0LnNjcm9sbFdpZHRoPWVsLmNsaWVudFdpZHRoO09iamVjdChkb21fWyJhZGRDbGFzcyJdKShlbCwnZWwtbWVudS0tY29sbGFwc2UnKTt9ZWxzZXtPYmplY3QoZG9tX1siYWRkQ2xhc3MiXSkoZWwsJ2VsLW1lbnUtLWNvbGxhcHNlJyk7ZWwuZGF0YXNldC5vbGRPdmVyZmxvdz1lbC5zdHlsZS5vdmVyZmxvdztlbC5kYXRhc2V0LnNjcm9sbFdpZHRoPWVsLmNsaWVudFdpZHRoO09iamVjdChkb21fWyJyZW1vdmVDbGFzcyJdKShlbCwnZWwtbWVudS0tY29sbGFwc2UnKTt9ZWwuc3R5bGUud2lkdGg9ZWwuc2Nyb2xsV2lkdGgrJ3B4JztlbC5zdHlsZS5vdmVyZmxvdz0naGlkZGVuJzt9LGxlYXZlOmZ1bmN0aW9uIGxlYXZlKGVsKXtPYmplY3QoZG9tX1siYWRkQ2xhc3MiXSkoZWwsJ2hvcml6b250YWwtY29sbGFwc2UtdHJhbnNpdGlvbicpO2VsLnN0eWxlLndpZHRoPWVsLmRhdGFzZXQuc2Nyb2xsV2lkdGgrJ3B4Jzt9fX07cmV0dXJuIGNyZWF0ZUVsZW1lbnQoJ3RyYW5zaXRpb24nLGRhdGEsY29udGV4dC5jaGlsZHJlbik7fX19LHByb3BzOnttb2RlOnt0eXBlOlN0cmluZyxkZWZhdWx0Oid2ZXJ0aWNhbCd9LGRlZmF1bHRBY3RpdmU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6Jyd9LGRlZmF1bHRPcGVuZWRzOkFycmF5LHVuaXF1ZU9wZW5lZDpCb29sZWFuLHJvdXRlcjpCb29sZWFuLG1lbnVUcmlnZ2VyOnt0eXBlOlN0cmluZyxkZWZhdWx0Oidob3Zlcid9LGNvbGxhcHNlOkJvb2xlYW4sYmFja2dyb3VuZENvbG9yOlN0cmluZyx0ZXh0Q29sb3I6U3RyaW5nLGFjdGl2ZVRleHRDb2xvcjpTdHJpbmcsY29sbGFwc2VUcmFuc2l0aW9uOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDp0cnVlfX0sZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue2FjdGl2ZUluZGV4OnRoaXMuZGVmYXVsdEFjdGl2ZSxvcGVuZWRNZW51czp0aGlzLmRlZmF1bHRPcGVuZWRzJiYhdGhpcy5jb2xsYXBzZT90aGlzLmRlZmF1bHRPcGVuZWRzLnNsaWNlKDApOltdLGl0ZW1zOnt9LHN1Ym1lbnVzOnt9fTt9LGNvbXB1dGVkOntob3ZlckJhY2tncm91bmQ6ZnVuY3Rpb24gaG92ZXJCYWNrZ3JvdW5kKCl7cmV0dXJuIHRoaXMuYmFja2dyb3VuZENvbG9yP3RoaXMubWl4Q29sb3IodGhpcy5iYWNrZ3JvdW5kQ29sb3IsMC4yKTonJzt9LGlzTWVudVBvcHVwOmZ1bmN0aW9uIGlzTWVudVBvcHVwKCl7cmV0dXJuIHRoaXMubW9kZT09PSdob3Jpem9udGFsJ3x8dGhpcy5tb2RlPT09J3ZlcnRpY2FsJyYmdGhpcy5jb2xsYXBzZTt9fSx3YXRjaDp7ZGVmYXVsdEFjdGl2ZTpmdW5jdGlvbiBkZWZhdWx0QWN0aXZlKHZhbHVlKXtpZighdGhpcy5pdGVtc1t2YWx1ZV0pe3RoaXMuYWN0aXZlSW5kZXg9bnVsbDt9dGhpcy51cGRhdGVBY3RpdmVJbmRleCh2YWx1ZSk7fSxkZWZhdWx0T3BlbmVkczpmdW5jdGlvbiBkZWZhdWx0T3BlbmVkcyh2YWx1ZSl7aWYoIXRoaXMuY29sbGFwc2Upe3RoaXMub3BlbmVkTWVudXM9dmFsdWU7fX0sY29sbGFwc2U6ZnVuY3Rpb24gY29sbGFwc2UodmFsdWUpe2lmKHZhbHVlKXRoaXMub3BlbmVkTWVudXM9W107dGhpcy5icm9hZGNhc3QoJ0VsU3VibWVudScsJ3RvZ2dsZS1jb2xsYXBzZScsdmFsdWUpO319LG1ldGhvZHM6e3VwZGF0ZUFjdGl2ZUluZGV4OmZ1bmN0aW9uIHVwZGF0ZUFjdGl2ZUluZGV4KHZhbCl7dmFyIGl0ZW09dGhpcy5pdGVtc1t2YWxdfHx0aGlzLml0ZW1zW3RoaXMuYWN0aXZlSW5kZXhdfHx0aGlzLml0ZW1zW3RoaXMuZGVmYXVsdEFjdGl2ZV07aWYoaXRlbSl7dGhpcy5hY3RpdmVJbmRleD1pdGVtLmluZGV4O3RoaXMuaW5pdE9wZW5lZE1lbnUoKTt9ZWxzZXt0aGlzLmFjdGl2ZUluZGV4PW51bGw7fX0sZ2V0TWlncmF0aW5nQ29uZmlnOmZ1bmN0aW9uIGdldE1pZ3JhdGluZ0NvbmZpZygpe3JldHVybntwcm9wczp7J3RoZW1lJzondGhlbWUgaXMgcmVtb3ZlZC4nfX07fSxnZXRDb2xvckNoYW5uZWxzOmZ1bmN0aW9uIGdldENvbG9yQ2hhbm5lbHMoY29sb3Ipe2NvbG9yPWNvbG9yLnJlcGxhY2UoJyMnLCcnKTtpZigvXlswLTlhLWZBLUZdezN9JC8udGVzdChjb2xvcikpe2NvbG9yPWNvbG9yLnNwbGl0KCcnKTtmb3IodmFyIGk9MjtpPj0wO2ktLSl7Y29sb3Iuc3BsaWNlKGksMCxjb2xvcltpXSk7fWNvbG9yPWNvbG9yLmpvaW4oJycpO31pZigvXlswLTlhLWZBLUZdezZ9JC8udGVzdChjb2xvcikpe3JldHVybntyZWQ6cGFyc2VJbnQoY29sb3Iuc2xpY2UoMCwyKSwxNiksZ3JlZW46cGFyc2VJbnQoY29sb3Iuc2xpY2UoMiw0KSwxNiksYmx1ZTpwYXJzZUludChjb2xvci5zbGljZSg0LDYpLDE2KX07fWVsc2V7cmV0dXJue3JlZDoyNTUsZ3JlZW46MjU1LGJsdWU6MjU1fTt9fSxtaXhDb2xvcjpmdW5jdGlvbiBtaXhDb2xvcihjb2xvcixwZXJjZW50KXt2YXIgX2dldENvbG9yQ2hhbm5lbHM9dGhpcy5nZXRDb2xvckNoYW5uZWxzKGNvbG9yKSxyZWQ9X2dldENvbG9yQ2hhbm5lbHMucmVkLGdyZWVuPV9nZXRDb2xvckNoYW5uZWxzLmdyZWVuLGJsdWU9X2dldENvbG9yQ2hhbm5lbHMuYmx1ZTtpZihwZXJjZW50PjApey8vIHNoYWRlIGdpdmVuIGNvbG9yCnJlZCo9MS1wZXJjZW50O2dyZWVuKj0xLXBlcmNlbnQ7Ymx1ZSo9MS1wZXJjZW50O31lbHNley8vIHRpbnQgZ2l2ZW4gY29sb3IKcmVkKz0oMjU1LXJlZCkqcGVyY2VudDtncmVlbis9KDI1NS1ncmVlbikqcGVyY2VudDtibHVlKz0oMjU1LWJsdWUpKnBlcmNlbnQ7fXJldHVybidyZ2IoJytNYXRoLnJvdW5kKHJlZCkrJywgJytNYXRoLnJvdW5kKGdyZWVuKSsnLCAnK01hdGgucm91bmQoYmx1ZSkrJyknO30sYWRkSXRlbTpmdW5jdGlvbiBhZGRJdGVtKGl0ZW0pe3RoaXMuJHNldCh0aGlzLml0ZW1zLGl0ZW0uaW5kZXgsaXRlbSk7fSxyZW1vdmVJdGVtOmZ1bmN0aW9uIHJlbW92ZUl0ZW0oaXRlbSl7ZGVsZXRlIHRoaXMuaXRlbXNbaXRlbS5pbmRleF07fSxhZGRTdWJtZW51OmZ1bmN0aW9uIGFkZFN1Ym1lbnUoaXRlbSl7dGhpcy4kc2V0KHRoaXMuc3VibWVudXMsaXRlbS5pbmRleCxpdGVtKTt9LHJlbW92ZVN1Ym1lbnU6ZnVuY3Rpb24gcmVtb3ZlU3VibWVudShpdGVtKXtkZWxldGUgdGhpcy5zdWJtZW51c1tpdGVtLmluZGV4XTt9LG9wZW5NZW51OmZ1bmN0aW9uIG9wZW5NZW51KGluZGV4LGluZGV4UGF0aCl7dmFyIG9wZW5lZE1lbnVzPXRoaXMub3BlbmVkTWVudXM7aWYob3BlbmVkTWVudXMuaW5kZXhPZihpbmRleCkhPT0tMSlyZXR1cm47Ly8g5bCG5LiN5Zyo6K+l6I+c5Y2V6Lev5b6E5LiL55qE5YW25L2Z6I+c5Y2V5pS26LW3Ci8vIGNvbGxhcHNlIGFsbCBtZW51IHRoYXQgYXJlIG5vdCB1bmRlciBjdXJyZW50IG1lbnUgaXRlbQppZih0aGlzLnVuaXF1ZU9wZW5lZCl7dGhpcy5vcGVuZWRNZW51cz1vcGVuZWRNZW51cy5maWx0ZXIoZnVuY3Rpb24oaW5kZXgpe3JldHVybiBpbmRleFBhdGguaW5kZXhPZihpbmRleCkhPT0tMTt9KTt9dGhpcy5vcGVuZWRNZW51cy5wdXNoKGluZGV4KTt9LGNsb3NlTWVudTpmdW5jdGlvbiBjbG9zZU1lbnUoaW5kZXgpe3ZhciBpPXRoaXMub3BlbmVkTWVudXMuaW5kZXhPZihpbmRleCk7aWYoaSE9PS0xKXt0aGlzLm9wZW5lZE1lbnVzLnNwbGljZShpLDEpO319LGhhbmRsZVN1Ym1lbnVDbGljazpmdW5jdGlvbiBoYW5kbGVTdWJtZW51Q2xpY2soc3VibWVudSl7dmFyIGluZGV4PXN1Ym1lbnUuaW5kZXgsaW5kZXhQYXRoPXN1Ym1lbnUuaW5kZXhQYXRoO3ZhciBpc09wZW5lZD10aGlzLm9wZW5lZE1lbnVzLmluZGV4T2YoaW5kZXgpIT09LTE7aWYoaXNPcGVuZWQpe3RoaXMuY2xvc2VNZW51KGluZGV4KTt0aGlzLiRlbWl0KCdjbG9zZScsaW5kZXgsaW5kZXhQYXRoKTt9ZWxzZXt0aGlzLm9wZW5NZW51KGluZGV4LGluZGV4UGF0aCk7dGhpcy4kZW1pdCgnb3BlbicsaW5kZXgsaW5kZXhQYXRoKTt9fSxoYW5kbGVJdGVtQ2xpY2s6ZnVuY3Rpb24gaGFuZGxlSXRlbUNsaWNrKGl0ZW0pe3ZhciBfdGhpcz10aGlzO3ZhciBpbmRleD1pdGVtLmluZGV4LGluZGV4UGF0aD1pdGVtLmluZGV4UGF0aDt2YXIgb2xkQWN0aXZlSW5kZXg9dGhpcy5hY3RpdmVJbmRleDt2YXIgaGFzSW5kZXg9aXRlbS5pbmRleCE9PW51bGw7aWYoaGFzSW5kZXgpe3RoaXMuYWN0aXZlSW5kZXg9aXRlbS5pbmRleDt9dGhpcy4kZW1pdCgnc2VsZWN0JyxpbmRleCxpbmRleFBhdGgsaXRlbSk7aWYodGhpcy5tb2RlPT09J2hvcml6b250YWwnfHx0aGlzLmNvbGxhcHNlKXt0aGlzLm9wZW5lZE1lbnVzPVtdO31pZih0aGlzLnJvdXRlciYmaGFzSW5kZXgpe3RoaXMucm91dGVUb0l0ZW0oaXRlbSxmdW5jdGlvbihlcnJvcil7X3RoaXMuYWN0aXZlSW5kZXg9b2xkQWN0aXZlSW5kZXg7aWYoZXJyb3Ipey8vIHZ1ZS1yb3V0ZXIgMy4xLjArIHB1c2gvcmVwbGFjZSBjYXVzZSBOYXZpZ2F0aW9uRHVwbGljYXRlZCBlcnJvciAKLy8gaHR0cHM6Ly9naXRodWIuY29tL0VsZW1lRkUvZWxlbWVudC9pc3N1ZXMvMTcwNDQKaWYoZXJyb3IubmFtZT09PSdOYXZpZ2F0aW9uRHVwbGljYXRlZCcpcmV0dXJuO2NvbnNvbGUuZXJyb3IoZXJyb3IpO319KTt9fSwvLyDliJ3lp4vljJblsZXlvIDoj5zljZUKLy8gaW5pdGlhbGl6ZSBvcGVuZWQgbWVudQppbml0T3BlbmVkTWVudTpmdW5jdGlvbiBpbml0T3BlbmVkTWVudSgpe3ZhciBfdGhpczI9dGhpczt2YXIgaW5kZXg9dGhpcy5hY3RpdmVJbmRleDt2YXIgYWN0aXZlSXRlbT10aGlzLml0ZW1zW2luZGV4XTtpZighYWN0aXZlSXRlbXx8dGhpcy5tb2RlPT09J2hvcml6b250YWwnfHx0aGlzLmNvbGxhcHNlKXJldHVybjt2YXIgaW5kZXhQYXRoPWFjdGl2ZUl0ZW0uaW5kZXhQYXRoOy8vIOWxleW8gOivpeiPnOWNlemhueeahOi3r+W+hOS4iuaJgOacieWtkOiPnOWNlQovLyBleHBhbmQgYWxsIHN1Ym1lbnVzIG9mIHRoZSBtZW51IGl0ZW0KaW5kZXhQYXRoLmZvckVhY2goZnVuY3Rpb24oaW5kZXgpe3ZhciBzdWJtZW51PV90aGlzMi5zdWJtZW51c1tpbmRleF07c3VibWVudSYmX3RoaXMyLm9wZW5NZW51KGluZGV4LHN1Ym1lbnUuaW5kZXhQYXRoKTt9KTt9LHJvdXRlVG9JdGVtOmZ1bmN0aW9uIHJvdXRlVG9JdGVtKGl0ZW0sb25FcnJvcil7dmFyIHJvdXRlPWl0ZW0ucm91dGV8fGl0ZW0uaW5kZXg7dHJ5e3RoaXMuJHJvdXRlci5wdXNoKHJvdXRlLGZ1bmN0aW9uKCl7fSxvbkVycm9yKTt9Y2F0Y2goZSl7Y29uc29sZS5lcnJvcihlKTt9fSxvcGVuOmZ1bmN0aW9uIG9wZW4oaW5kZXgpe3ZhciBfdGhpczM9dGhpczt2YXIgaW5kZXhQYXRoPXRoaXMuc3VibWVudXNbaW5kZXgudG9TdHJpbmcoKV0uaW5kZXhQYXRoO2luZGV4UGF0aC5mb3JFYWNoKGZ1bmN0aW9uKGkpe3JldHVybiBfdGhpczMub3Blbk1lbnUoaSxpbmRleFBhdGgpO30pO30sY2xvc2U6ZnVuY3Rpb24gY2xvc2UoaW5kZXgpe3RoaXMuY2xvc2VNZW51KGluZGV4KTt9fSxtb3VudGVkOmZ1bmN0aW9uIG1vdW50ZWQoKXt0aGlzLmluaXRPcGVuZWRNZW51KCk7dGhpcy4kb24oJ2l0ZW0tY2xpY2snLHRoaXMuaGFuZGxlSXRlbUNsaWNrKTt0aGlzLiRvbignc3VibWVudS1jbGljaycsdGhpcy5oYW5kbGVTdWJtZW51Q2xpY2spO2lmKHRoaXMubW9kZT09PSdob3Jpem9udGFsJyl7bmV3IGFyaWFfbWVudWJhcih0aGlzLiRlbCk7Ly8gZXNsaW50LWRpc2FibGUtbGluZQp9dGhpcy4kd2F0Y2goJ2l0ZW1zJyx0aGlzLnVwZGF0ZUFjdGl2ZUluZGV4KTt9fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL21lbnUvc3JjL21lbnUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHNyY19tZW51dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPW1lbnV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9tZW51L3NyYy9tZW51LnZ1ZQp2YXIgbWVudV9yZW5kZXIsbWVudV9zdGF0aWNSZW5kZXJGbnM7Lyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciBtZW51X2NvbXBvbmVudD1ub3JtYWxpemVDb21wb25lbnQoc3JjX21lbnV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sbWVudV9yZW5kZXIsbWVudV9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIG1lbnVfYXBpO31tZW51X2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvbWVudS9zcmMvbWVudS52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc3JjX21lbnU9bWVudV9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL21lbnUvaW5kZXguanMKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9zcmNfbWVudS5pbnN0YWxsPWZ1bmN0aW9uKFZ1ZSl7VnVlLmNvbXBvbmVudChzcmNfbWVudS5uYW1lLHNyY19tZW51KTt9Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFja2FnZXNfbWVudT1zcmNfbWVudTsvLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsICJlbGVtZW50LXVpL2xpYi90cmFuc2l0aW9ucy9jb2xsYXBzZS10cmFuc2l0aW9uIgp2YXIgY29sbGFwc2VfdHJhbnNpdGlvbl89X193ZWJwYWNrX3JlcXVpcmVfXygyMSk7dmFyIGNvbGxhcHNlX3RyYW5zaXRpb25fZGVmYXVsdD0vKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvbGxhcHNlX3RyYW5zaXRpb25fKTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL21lbnUvc3JjL21lbnUtbWl4aW4uanMKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBtZW51X21peGluPXtpbmplY3Q6Wydyb290TWVudSddLGNvbXB1dGVkOntpbmRleFBhdGg6ZnVuY3Rpb24gaW5kZXhQYXRoKCl7dmFyIHBhdGg9W3RoaXMuaW5kZXhdO3ZhciBwYXJlbnQ9dGhpcy4kcGFyZW50O3doaWxlKHBhcmVudC4kb3B0aW9ucy5jb21wb25lbnROYW1lIT09J0VsTWVudScpe2lmKHBhcmVudC5pbmRleCl7cGF0aC51bnNoaWZ0KHBhcmVudC5pbmRleCk7fXBhcmVudD1wYXJlbnQuJHBhcmVudDt9cmV0dXJuIHBhdGg7fSxwYXJlbnRNZW51OmZ1bmN0aW9uIHBhcmVudE1lbnUoKXt2YXIgcGFyZW50PXRoaXMuJHBhcmVudDt3aGlsZShwYXJlbnQmJlsnRWxNZW51JywnRWxTdWJtZW51J10uaW5kZXhPZihwYXJlbnQuJG9wdGlvbnMuY29tcG9uZW50TmFtZSk9PT0tMSl7cGFyZW50PXBhcmVudC4kcGFyZW50O31yZXR1cm4gcGFyZW50O30scGFkZGluZ1N0eWxlOmZ1bmN0aW9uIHBhZGRpbmdTdHlsZSgpe2lmKHRoaXMucm9vdE1lbnUubW9kZSE9PSd2ZXJ0aWNhbCcpcmV0dXJue307dmFyIHBhZGRpbmc9MjA7dmFyIHBhcmVudD10aGlzLiRwYXJlbnQ7aWYodGhpcy5yb290TWVudS5jb2xsYXBzZSl7cGFkZGluZz0yMDt9ZWxzZXt3aGlsZShwYXJlbnQmJnBhcmVudC4kb3B0aW9ucy5jb21wb25lbnROYW1lIT09J0VsTWVudScpe2lmKHBhcmVudC4kb3B0aW9ucy5jb21wb25lbnROYW1lPT09J0VsU3VibWVudScpe3BhZGRpbmcrPTIwO31wYXJlbnQ9cGFyZW50LiRwYXJlbnQ7fX1yZXR1cm57cGFkZGluZ0xlZnQ6cGFkZGluZysncHgnfTt9fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvbWVudS9zcmMvc3VibWVudS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCnZhciBwb3Blck1peGlucz17cHJvcHM6e3RyYW5zZm9ybU9yaWdpbjp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ZmFsc2V9LG9mZnNldDp2dWVfcG9wcGVyX2RlZmF1bHQuYS5wcm9wcy5vZmZzZXQsYm91bmRhcmllc1BhZGRpbmc6dnVlX3BvcHBlcl9kZWZhdWx0LmEucHJvcHMuYm91bmRhcmllc1BhZGRpbmcscG9wcGVyT3B0aW9uczp2dWVfcG9wcGVyX2RlZmF1bHQuYS5wcm9wcy5wb3BwZXJPcHRpb25zfSxkYXRhOnZ1ZV9wb3BwZXJfZGVmYXVsdC5hLmRhdGEsbWV0aG9kczp2dWVfcG9wcGVyX2RlZmF1bHQuYS5tZXRob2RzLGJlZm9yZURlc3Ryb3k6dnVlX3BvcHBlcl9kZWZhdWx0LmEuYmVmb3JlRGVzdHJveSxkZWFjdGl2YXRlZDp2dWVfcG9wcGVyX2RlZmF1bHQuYS5kZWFjdGl2YXRlZH07LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzdWJtZW51dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbFN1Ym1lbnUnLGNvbXBvbmVudE5hbWU6J0VsU3VibWVudScsbWl4aW5zOlttZW51X21peGluLGVtaXR0ZXJfZGVmYXVsdC5hLHBvcGVyTWl4aW5zXSxjb21wb25lbnRzOntFbENvbGxhcHNlVHJhbnNpdGlvbjpjb2xsYXBzZV90cmFuc2l0aW9uX2RlZmF1bHQuYX0scHJvcHM6e2luZGV4Ont0eXBlOlN0cmluZyxyZXF1aXJlZDp0cnVlfSxzaG93VGltZW91dDp7dHlwZTpOdW1iZXIsZGVmYXVsdDozMDB9LGhpZGVUaW1lb3V0Ont0eXBlOk51bWJlcixkZWZhdWx0OjMwMH0scG9wcGVyQ2xhc3M6U3RyaW5nLGRpc2FibGVkOkJvb2xlYW4scG9wcGVyQXBwZW5kVG9Cb2R5Ont0eXBlOkJvb2xlYW4sZGVmYXVsdDp1bmRlZmluZWR9fSxkYXRhOmZ1bmN0aW9uIGRhdGEoKXtyZXR1cm57cG9wcGVySlM6bnVsbCx0aW1lb3V0Om51bGwsaXRlbXM6e30sc3VibWVudXM6e30sbW91c2VJbkNoaWxkOmZhbHNlfTt9LHdhdGNoOntvcGVuZWQ6ZnVuY3Rpb24gb3BlbmVkKHZhbCl7dmFyIF90aGlzPXRoaXM7aWYodGhpcy5pc01lbnVQb3B1cCl7dGhpcy4kbmV4dFRpY2soZnVuY3Rpb24oXyl7X3RoaXMudXBkYXRlUG9wcGVyKCk7fSk7fX19LGNvbXB1dGVkOnsvLyBwb3BwZXIgb3B0aW9uCmFwcGVuZFRvQm9keTpmdW5jdGlvbiBhcHBlbmRUb0JvZHkoKXtyZXR1cm4gdGhpcy5wb3BwZXJBcHBlbmRUb0JvZHk9PT11bmRlZmluZWQ/dGhpcy5pc0ZpcnN0TGV2ZWw6dGhpcy5wb3BwZXJBcHBlbmRUb0JvZHk7fSxtZW51VHJhbnNpdGlvbk5hbWU6ZnVuY3Rpb24gbWVudVRyYW5zaXRpb25OYW1lKCl7cmV0dXJuIHRoaXMucm9vdE1lbnUuY29sbGFwc2U/J2VsLXpvb20taW4tbGVmdCc6J2VsLXpvb20taW4tdG9wJzt9LG9wZW5lZDpmdW5jdGlvbiBvcGVuZWQoKXtyZXR1cm4gdGhpcy5yb290TWVudS5vcGVuZWRNZW51cy5pbmRleE9mKHRoaXMuaW5kZXgpPi0xO30sYWN0aXZlOmZ1bmN0aW9uIGFjdGl2ZSgpe3ZhciBpc0FjdGl2ZT1mYWxzZTt2YXIgc3VibWVudXM9dGhpcy5zdWJtZW51czt2YXIgaXRlbXM9dGhpcy5pdGVtcztPYmplY3Qua2V5cyhpdGVtcykuZm9yRWFjaChmdW5jdGlvbihpbmRleCl7aWYoaXRlbXNbaW5kZXhdLmFjdGl2ZSl7aXNBY3RpdmU9dHJ1ZTt9fSk7T2JqZWN0LmtleXMoc3VibWVudXMpLmZvckVhY2goZnVuY3Rpb24oaW5kZXgpe2lmKHN1Ym1lbnVzW2luZGV4XS5hY3RpdmUpe2lzQWN0aXZlPXRydWU7fX0pO3JldHVybiBpc0FjdGl2ZTt9LGhvdmVyQmFja2dyb3VuZDpmdW5jdGlvbiBob3ZlckJhY2tncm91bmQoKXtyZXR1cm4gdGhpcy5yb290TWVudS5ob3ZlckJhY2tncm91bmQ7fSxiYWNrZ3JvdW5kQ29sb3I6ZnVuY3Rpb24gYmFja2dyb3VuZENvbG9yKCl7cmV0dXJuIHRoaXMucm9vdE1lbnUuYmFja2dyb3VuZENvbG9yfHwnJzt9LGFjdGl2ZVRleHRDb2xvcjpmdW5jdGlvbiBhY3RpdmVUZXh0Q29sb3IoKXtyZXR1cm4gdGhpcy5yb290TWVudS5hY3RpdmVUZXh0Q29sb3J8fCcnO30sdGV4dENvbG9yOmZ1bmN0aW9uIHRleHRDb2xvcigpe3JldHVybiB0aGlzLnJvb3RNZW51LnRleHRDb2xvcnx8Jyc7fSxtb2RlOmZ1bmN0aW9uIG1vZGUoKXtyZXR1cm4gdGhpcy5yb290TWVudS5tb2RlO30saXNNZW51UG9wdXA6ZnVuY3Rpb24gaXNNZW51UG9wdXAoKXtyZXR1cm4gdGhpcy5yb290TWVudS5pc01lbnVQb3B1cDt9LHRpdGxlU3R5bGU6ZnVuY3Rpb24gdGl0bGVTdHlsZSgpe2lmKHRoaXMubW9kZSE9PSdob3Jpem9udGFsJyl7cmV0dXJue2NvbG9yOnRoaXMudGV4dENvbG9yfTt9cmV0dXJue2JvcmRlckJvdHRvbUNvbG9yOnRoaXMuYWN0aXZlP3RoaXMucm9vdE1lbnUuYWN0aXZlVGV4dENvbG9yP3RoaXMuYWN0aXZlVGV4dENvbG9yOicnOid0cmFuc3BhcmVudCcsY29sb3I6dGhpcy5hY3RpdmU/dGhpcy5hY3RpdmVUZXh0Q29sb3I6dGhpcy50ZXh0Q29sb3J9O30saXNGaXJzdExldmVsOmZ1bmN0aW9uIGlzRmlyc3RMZXZlbCgpe3ZhciBpc0ZpcnN0TGV2ZWw9dHJ1ZTt2YXIgcGFyZW50PXRoaXMuJHBhcmVudDt3aGlsZShwYXJlbnQmJnBhcmVudCE9PXRoaXMucm9vdE1lbnUpe2lmKFsnRWxTdWJtZW51JywnRWxNZW51SXRlbUdyb3VwJ10uaW5kZXhPZihwYXJlbnQuJG9wdGlvbnMuY29tcG9uZW50TmFtZSk+LTEpe2lzRmlyc3RMZXZlbD1mYWxzZTticmVhazt9ZWxzZXtwYXJlbnQ9cGFyZW50LiRwYXJlbnQ7fX1yZXR1cm4gaXNGaXJzdExldmVsO319LG1ldGhvZHM6e2hhbmRsZUNvbGxhcHNlVG9nZ2xlOmZ1bmN0aW9uIGhhbmRsZUNvbGxhcHNlVG9nZ2xlKHZhbHVlKXtpZih2YWx1ZSl7dGhpcy5pbml0UG9wcGVyKCk7fWVsc2V7dGhpcy5kb0Rlc3Ryb3koKTt9fSxhZGRJdGVtOmZ1bmN0aW9uIGFkZEl0ZW0oaXRlbSl7dGhpcy4kc2V0KHRoaXMuaXRlbXMsaXRlbS5pbmRleCxpdGVtKTt9LHJlbW92ZUl0ZW06ZnVuY3Rpb24gcmVtb3ZlSXRlbShpdGVtKXtkZWxldGUgdGhpcy5pdGVtc1tpdGVtLmluZGV4XTt9LGFkZFN1Ym1lbnU6ZnVuY3Rpb24gYWRkU3VibWVudShpdGVtKXt0aGlzLiRzZXQodGhpcy5zdWJtZW51cyxpdGVtLmluZGV4LGl0ZW0pO30scmVtb3ZlU3VibWVudTpmdW5jdGlvbiByZW1vdmVTdWJtZW51KGl0ZW0pe2RlbGV0ZSB0aGlzLnN1Ym1lbnVzW2l0ZW0uaW5kZXhdO30saGFuZGxlQ2xpY2s6ZnVuY3Rpb24gaGFuZGxlQ2xpY2soKXt2YXIgcm9vdE1lbnU9dGhpcy5yb290TWVudSxkaXNhYmxlZD10aGlzLmRpc2FibGVkO2lmKHJvb3RNZW51Lm1lbnVUcmlnZ2VyPT09J2hvdmVyJyYmcm9vdE1lbnUubW9kZT09PSdob3Jpem9udGFsJ3x8cm9vdE1lbnUuY29sbGFwc2UmJnJvb3RNZW51Lm1vZGU9PT0ndmVydGljYWwnfHxkaXNhYmxlZCl7cmV0dXJuO310aGlzLmRpc3BhdGNoKCdFbE1lbnUnLCdzdWJtZW51LWNsaWNrJyx0aGlzKTt9LGhhbmRsZU1vdXNlZW50ZXI6ZnVuY3Rpb24gaGFuZGxlTW91c2VlbnRlcihldmVudCl7dmFyIF90aGlzMj10aGlzO3ZhciBzaG93VGltZW91dD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMV06dGhpcy5zaG93VGltZW91dDtpZighKCdBY3RpdmVYT2JqZWN0J2luIHdpbmRvdykmJmV2ZW50LnR5cGU9PT0nZm9jdXMnJiYhZXZlbnQucmVsYXRlZFRhcmdldCl7cmV0dXJuO312YXIgcm9vdE1lbnU9dGhpcy5yb290TWVudSxkaXNhYmxlZD10aGlzLmRpc2FibGVkO2lmKHJvb3RNZW51Lm1lbnVUcmlnZ2VyPT09J2NsaWNrJyYmcm9vdE1lbnUubW9kZT09PSdob3Jpem9udGFsJ3x8IXJvb3RNZW51LmNvbGxhcHNlJiZyb290TWVudS5tb2RlPT09J3ZlcnRpY2FsJ3x8ZGlzYWJsZWQpe3JldHVybjt9dGhpcy5kaXNwYXRjaCgnRWxTdWJtZW51JywnbW91c2UtZW50ZXItY2hpbGQnKTtjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTt0aGlzLnRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe190aGlzMi5yb290TWVudS5vcGVuTWVudShfdGhpczIuaW5kZXgsX3RoaXMyLmluZGV4UGF0aCk7fSxzaG93VGltZW91dCk7aWYodGhpcy5hcHBlbmRUb0JvZHkpe3RoaXMuJHBhcmVudC4kZWwuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnbW91c2VlbnRlcicpKTt9fSxoYW5kbGVNb3VzZWxlYXZlOmZ1bmN0aW9uIGhhbmRsZU1vdXNlbGVhdmUoKXt2YXIgX3RoaXMzPXRoaXM7dmFyIGRlZXBEaXNwYXRjaD1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMF06ZmFsc2U7dmFyIHJvb3RNZW51PXRoaXMucm9vdE1lbnU7aWYocm9vdE1lbnUubWVudVRyaWdnZXI9PT0nY2xpY2snJiZyb290TWVudS5tb2RlPT09J2hvcml6b250YWwnfHwhcm9vdE1lbnUuY29sbGFwc2UmJnJvb3RNZW51Lm1vZGU9PT0ndmVydGljYWwnKXtyZXR1cm47fXRoaXMuZGlzcGF0Y2goJ0VsU3VibWVudScsJ21vdXNlLWxlYXZlLWNoaWxkJyk7Y2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7dGhpcy50aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXshX3RoaXMzLm1vdXNlSW5DaGlsZCYmX3RoaXMzLnJvb3RNZW51LmNsb3NlTWVudShfdGhpczMuaW5kZXgpO30sdGhpcy5oaWRlVGltZW91dCk7aWYodGhpcy5hcHBlbmRUb0JvZHkmJmRlZXBEaXNwYXRjaCl7aWYodGhpcy4kcGFyZW50LiRvcHRpb25zLm5hbWU9PT0nRWxTdWJtZW51Jyl7dGhpcy4kcGFyZW50LmhhbmRsZU1vdXNlbGVhdmUodHJ1ZSk7fX19LGhhbmRsZVRpdGxlTW91c2VlbnRlcjpmdW5jdGlvbiBoYW5kbGVUaXRsZU1vdXNlZW50ZXIoKXtpZih0aGlzLm1vZGU9PT0naG9yaXpvbnRhbCcmJiF0aGlzLnJvb3RNZW51LmJhY2tncm91bmRDb2xvcilyZXR1cm47dmFyIHRpdGxlPXRoaXMuJHJlZnNbJ3N1Ym1lbnUtdGl0bGUnXTt0aXRsZSYmKHRpdGxlLnN0eWxlLmJhY2tncm91bmRDb2xvcj10aGlzLnJvb3RNZW51LmhvdmVyQmFja2dyb3VuZCk7fSxoYW5kbGVUaXRsZU1vdXNlbGVhdmU6ZnVuY3Rpb24gaGFuZGxlVGl0bGVNb3VzZWxlYXZlKCl7aWYodGhpcy5tb2RlPT09J2hvcml6b250YWwnJiYhdGhpcy5yb290TWVudS5iYWNrZ3JvdW5kQ29sb3IpcmV0dXJuO3ZhciB0aXRsZT10aGlzLiRyZWZzWydzdWJtZW51LXRpdGxlJ107dGl0bGUmJih0aXRsZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9dGhpcy5yb290TWVudS5iYWNrZ3JvdW5kQ29sb3J8fCcnKTt9LHVwZGF0ZVBsYWNlbWVudDpmdW5jdGlvbiB1cGRhdGVQbGFjZW1lbnQoKXt0aGlzLmN1cnJlbnRQbGFjZW1lbnQ9dGhpcy5tb2RlPT09J2hvcml6b250YWwnJiZ0aGlzLmlzRmlyc3RMZXZlbD8nYm90dG9tLXN0YXJ0JzoncmlnaHQtc3RhcnQnO30saW5pdFBvcHBlcjpmdW5jdGlvbiBpbml0UG9wcGVyKCl7dGhpcy5yZWZlcmVuY2VFbG09dGhpcy4kZWw7dGhpcy5wb3BwZXJFbG09dGhpcy4kcmVmcy5tZW51O3RoaXMudXBkYXRlUGxhY2VtZW50KCk7fX0sY3JlYXRlZDpmdW5jdGlvbiBjcmVhdGVkKCl7dmFyIF90aGlzND10aGlzO3RoaXMuJG9uKCd0b2dnbGUtY29sbGFwc2UnLHRoaXMuaGFuZGxlQ29sbGFwc2VUb2dnbGUpO3RoaXMuJG9uKCdtb3VzZS1lbnRlci1jaGlsZCcsZnVuY3Rpb24oKXtfdGhpczQubW91c2VJbkNoaWxkPXRydWU7Y2xlYXJUaW1lb3V0KF90aGlzNC50aW1lb3V0KTt9KTt0aGlzLiRvbignbW91c2UtbGVhdmUtY2hpbGQnLGZ1bmN0aW9uKCl7X3RoaXM0Lm1vdXNlSW5DaGlsZD1mYWxzZTtjbGVhclRpbWVvdXQoX3RoaXM0LnRpbWVvdXQpO30pO30sbW91bnRlZDpmdW5jdGlvbiBtb3VudGVkKCl7dGhpcy5wYXJlbnRNZW51LmFkZFN1Ym1lbnUodGhpcyk7dGhpcy5yb290TWVudS5hZGRTdWJtZW51KHRoaXMpO3RoaXMuaW5pdFBvcHBlcigpO30sYmVmb3JlRGVzdHJveTpmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCl7dGhpcy5wYXJlbnRNZW51LnJlbW92ZVN1Ym1lbnUodGhpcyk7dGhpcy5yb290TWVudS5yZW1vdmVTdWJtZW51KHRoaXMpO30scmVuZGVyOmZ1bmN0aW9uIHJlbmRlcihoKXt2YXIgX3RoaXM1PXRoaXM7dmFyIGFjdGl2ZT10aGlzLmFjdGl2ZSxvcGVuZWQ9dGhpcy5vcGVuZWQscGFkZGluZ1N0eWxlPXRoaXMucGFkZGluZ1N0eWxlLHRpdGxlU3R5bGU9dGhpcy50aXRsZVN0eWxlLGJhY2tncm91bmRDb2xvcj10aGlzLmJhY2tncm91bmRDb2xvcixyb290TWVudT10aGlzLnJvb3RNZW51LGN1cnJlbnRQbGFjZW1lbnQ9dGhpcy5jdXJyZW50UGxhY2VtZW50LG1lbnVUcmFuc2l0aW9uTmFtZT10aGlzLm1lbnVUcmFuc2l0aW9uTmFtZSxtb2RlPXRoaXMubW9kZSxkaXNhYmxlZD10aGlzLmRpc2FibGVkLHBvcHBlckNsYXNzPXRoaXMucG9wcGVyQ2xhc3MsJHNsb3RzPXRoaXMuJHNsb3RzLGlzRmlyc3RMZXZlbD10aGlzLmlzRmlyc3RMZXZlbDt2YXIgcG9wdXBNZW51PWgoJ3RyYW5zaXRpb24nLHthdHRyczp7bmFtZTptZW51VHJhbnNpdGlvbk5hbWV9fSxbaCgnZGl2Jyx7cmVmOidtZW51JyxkaXJlY3RpdmVzOlt7bmFtZTonc2hvdycsdmFsdWU6b3BlbmVkfV0sJ2NsYXNzJzpbJ2VsLW1lbnUtLScrbW9kZSxwb3BwZXJDbGFzc10sb246eydtb3VzZWVudGVyJzpmdW5jdGlvbiBtb3VzZWVudGVyKCRldmVudCl7cmV0dXJuIF90aGlzNS5oYW5kbGVNb3VzZWVudGVyKCRldmVudCwxMDApO30sJ21vdXNlbGVhdmUnOmZ1bmN0aW9uIG1vdXNlbGVhdmUoKXtyZXR1cm4gX3RoaXM1LmhhbmRsZU1vdXNlbGVhdmUodHJ1ZSk7fSwnZm9jdXMnOmZ1bmN0aW9uIGZvY3VzKCRldmVudCl7cmV0dXJuIF90aGlzNS5oYW5kbGVNb3VzZWVudGVyKCRldmVudCwxMDApO319fSxbaCgndWwnLHthdHRyczp7cm9sZTonbWVudSd9LCdjbGFzcyc6WydlbC1tZW51IGVsLW1lbnUtLXBvcHVwJywnZWwtbWVudS0tcG9wdXAtJytjdXJyZW50UGxhY2VtZW50XSxzdHlsZTp7YmFja2dyb3VuZENvbG9yOnJvb3RNZW51LmJhY2tncm91bmRDb2xvcnx8Jyd9fSxbJHNsb3RzLmRlZmF1bHRdKV0pXSk7dmFyIGlubGluZU1lbnU9aCgnZWwtY29sbGFwc2UtdHJhbnNpdGlvbicsW2goJ3VsJyx7YXR0cnM6e3JvbGU6J21lbnUnfSwnY2xhc3MnOidlbC1tZW51IGVsLW1lbnUtLWlubGluZScsZGlyZWN0aXZlczpbe25hbWU6J3Nob3cnLHZhbHVlOm9wZW5lZH1dLHN0eWxlOntiYWNrZ3JvdW5kQ29sb3I6cm9vdE1lbnUuYmFja2dyb3VuZENvbG9yfHwnJ319LFskc2xvdHMuZGVmYXVsdF0pXSk7dmFyIHN1Ym1lbnVUaXRsZUljb249cm9vdE1lbnUubW9kZT09PSdob3Jpem9udGFsJyYmaXNGaXJzdExldmVsfHxyb290TWVudS5tb2RlPT09J3ZlcnRpY2FsJyYmIXJvb3RNZW51LmNvbGxhcHNlPydlbC1pY29uLWFycm93LWRvd24nOidlbC1pY29uLWFycm93LXJpZ2h0JztyZXR1cm4gaCgnbGknLHsnY2xhc3MnOnsnZWwtc3VibWVudSc6dHJ1ZSwnaXMtYWN0aXZlJzphY3RpdmUsJ2lzLW9wZW5lZCc6b3BlbmVkLCdpcy1kaXNhYmxlZCc6ZGlzYWJsZWR9LGF0dHJzOntyb2xlOidtZW51aXRlbScsJ2FyaWEtaGFzcG9wdXAnOid0cnVlJywnYXJpYS1leHBhbmRlZCc6b3BlbmVkfSxvbjp7J21vdXNlZW50ZXInOnRoaXMuaGFuZGxlTW91c2VlbnRlciwnbW91c2VsZWF2ZSc6ZnVuY3Rpb24gbW91c2VsZWF2ZSgpe3JldHVybiBfdGhpczUuaGFuZGxlTW91c2VsZWF2ZShmYWxzZSk7fSwnZm9jdXMnOnRoaXMuaGFuZGxlTW91c2VlbnRlcn19LFtoKCdkaXYnLHsnY2xhc3MnOidlbC1zdWJtZW51X190aXRsZScscmVmOidzdWJtZW51LXRpdGxlJyxvbjp7J2NsaWNrJzp0aGlzLmhhbmRsZUNsaWNrLCdtb3VzZWVudGVyJzp0aGlzLmhhbmRsZVRpdGxlTW91c2VlbnRlciwnbW91c2VsZWF2ZSc6dGhpcy5oYW5kbGVUaXRsZU1vdXNlbGVhdmV9LHN0eWxlOltwYWRkaW5nU3R5bGUsdGl0bGVTdHlsZSx7YmFja2dyb3VuZENvbG9yOmJhY2tncm91bmRDb2xvcn1dfSxbJHNsb3RzLnRpdGxlLGgoJ2knLHsnY2xhc3MnOlsnZWwtc3VibWVudV9faWNvbi1hcnJvdycsc3VibWVudVRpdGxlSWNvbl19KV0pLHRoaXMuaXNNZW51UG9wdXA/cG9wdXBNZW51OmlubGluZU1lbnVdKTt9fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL21lbnUvc3JjL3N1Ym1lbnUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHNyY19zdWJtZW51dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXN1Ym1lbnV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9tZW51L3NyYy9zdWJtZW51LnZ1ZQp2YXIgc3VibWVudV9yZW5kZXIsc3VibWVudV9zdGF0aWNSZW5kZXJGbnM7Lyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciBzdWJtZW51X2NvbXBvbmVudD1ub3JtYWxpemVDb21wb25lbnQoc3JjX3N1Ym1lbnV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sc3VibWVudV9yZW5kZXIsc3VibWVudV9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIHN1Ym1lbnVfYXBpO31zdWJtZW51X2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvbWVudS9zcmMvc3VibWVudS52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc3VibWVudT1zdWJtZW51X2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc3VibWVudS9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL3N1Ym1lbnUuaW5zdGFsbD1mdW5jdGlvbihWdWUpe1Z1ZS5jb21wb25lbnQoc3VibWVudS5uYW1lLHN1Ym1lbnUpO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYWNrYWdlc19zdWJtZW51PXN1Ym1lbnU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9tZW51L3NyYy9tZW51LWl0ZW0udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTJhNWRiZmVhJgp2YXIgbWVudV9pdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfMmE1ZGJmZWFfcmVuZGVyPWZ1bmN0aW9uIG1lbnVfaXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzJhNWRiZmVhX3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygibGkiLHtzdGF0aWNDbGFzczoiZWwtbWVudS1pdGVtIixjbGFzczp7ImlzLWFjdGl2ZSI6X3ZtLmFjdGl2ZSwiaXMtZGlzYWJsZWQiOl92bS5kaXNhYmxlZH0sc3R5bGU6W192bS5wYWRkaW5nU3R5bGUsX3ZtLml0ZW1TdHlsZSx7YmFja2dyb3VuZENvbG9yOl92bS5iYWNrZ3JvdW5kQ29sb3J9XSxhdHRyczp7cm9sZToibWVudWl0ZW0iLHRhYmluZGV4OiItMSJ9LG9uOntjbGljazpfdm0uaGFuZGxlQ2xpY2ssbW91c2VlbnRlcjpfdm0ub25Nb3VzZUVudGVyLGZvY3VzOl92bS5vbk1vdXNlRW50ZXIsYmx1cjpfdm0ub25Nb3VzZUxlYXZlLG1vdXNlbGVhdmU6X3ZtLm9uTW91c2VMZWF2ZX19LFtfdm0ucGFyZW50TWVudS4kb3B0aW9ucy5jb21wb25lbnROYW1lPT09IkVsTWVudSImJl92bS5yb290TWVudS5jb2xsYXBzZSYmX3ZtLiRzbG90cy50aXRsZT9fYygiZWwtdG9vbHRpcCIse2F0dHJzOntlZmZlY3Q6ImRhcmsiLHBsYWNlbWVudDoicmlnaHQifX0sW19jKCJkaXYiLHthdHRyczp7c2xvdDoiY29udGVudCJ9LHNsb3Q6ImNvbnRlbnQifSxbX3ZtLl90KCJ0aXRsZSIpXSwyKSxfYygiZGl2Iix7c3RhdGljU3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDoiMCIsdG9wOiIwIixoZWlnaHQ6IjEwMCUiLHdpZHRoOiIxMDAlIixkaXNwbGF5OiJpbmxpbmUtYmxvY2siLCJib3gtc2l6aW5nIjoiYm9yZGVyLWJveCIscGFkZGluZzoiMCAyMHB4In19LFtfdm0uX3QoImRlZmF1bHQiKV0sMildKTpbX3ZtLl90KCJkZWZhdWx0IiksX3ZtLl90KCJ0aXRsZSIpXV0sMik7fTt2YXIgbWVudV9pdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfMmE1ZGJmZWFfc3RhdGljUmVuZGVyRm5zPVtdO21lbnVfaXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzJhNWRiZmVhX3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9tZW51L3NyYy9tZW51LWl0ZW0udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTJhNWRiZmVhJgovLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsICJlbGVtZW50LXVpL2xpYi90b29sdGlwIgp2YXIgdG9vbHRpcF89X193ZWJwYWNrX3JlcXVpcmVfXygyNik7dmFyIHRvb2x0aXBfZGVmYXVsdD0vKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKHRvb2x0aXBfKTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9tZW51L3NyYy9tZW51LWl0ZW0udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIG1lbnVfaXRlbXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17bmFtZTonRWxNZW51SXRlbScsY29tcG9uZW50TmFtZTonRWxNZW51SXRlbScsbWl4aW5zOlttZW51X21peGluLGVtaXR0ZXJfZGVmYXVsdC5hXSxjb21wb25lbnRzOntFbFRvb2x0aXA6dG9vbHRpcF9kZWZhdWx0LmF9LHByb3BzOntpbmRleDp7ZGVmYXVsdDpudWxsLHZhbGlkYXRvcjpmdW5jdGlvbiB2YWxpZGF0b3IodmFsKXtyZXR1cm4gdHlwZW9mIHZhbD09PSdzdHJpbmcnfHx2YWw9PT1udWxsO319LHJvdXRlOltTdHJpbmcsT2JqZWN0XSxkaXNhYmxlZDpCb29sZWFufSxjb21wdXRlZDp7YWN0aXZlOmZ1bmN0aW9uIGFjdGl2ZSgpe3JldHVybiB0aGlzLmluZGV4PT09dGhpcy5yb290TWVudS5hY3RpdmVJbmRleDt9LGhvdmVyQmFja2dyb3VuZDpmdW5jdGlvbiBob3ZlckJhY2tncm91bmQoKXtyZXR1cm4gdGhpcy5yb290TWVudS5ob3ZlckJhY2tncm91bmQ7fSxiYWNrZ3JvdW5kQ29sb3I6ZnVuY3Rpb24gYmFja2dyb3VuZENvbG9yKCl7cmV0dXJuIHRoaXMucm9vdE1lbnUuYmFja2dyb3VuZENvbG9yfHwnJzt9LGFjdGl2ZVRleHRDb2xvcjpmdW5jdGlvbiBhY3RpdmVUZXh0Q29sb3IoKXtyZXR1cm4gdGhpcy5yb290TWVudS5hY3RpdmVUZXh0Q29sb3J8fCcnO30sdGV4dENvbG9yOmZ1bmN0aW9uIHRleHRDb2xvcigpe3JldHVybiB0aGlzLnJvb3RNZW51LnRleHRDb2xvcnx8Jyc7fSxtb2RlOmZ1bmN0aW9uIG1vZGUoKXtyZXR1cm4gdGhpcy5yb290TWVudS5tb2RlO30saXRlbVN0eWxlOmZ1bmN0aW9uIGl0ZW1TdHlsZSgpe3ZhciBzdHlsZT17Y29sb3I6dGhpcy5hY3RpdmU/dGhpcy5hY3RpdmVUZXh0Q29sb3I6dGhpcy50ZXh0Q29sb3J9O2lmKHRoaXMubW9kZT09PSdob3Jpem9udGFsJyYmIXRoaXMuaXNOZXN0ZWQpe3N0eWxlLmJvcmRlckJvdHRvbUNvbG9yPXRoaXMuYWN0aXZlP3RoaXMucm9vdE1lbnUuYWN0aXZlVGV4dENvbG9yP3RoaXMuYWN0aXZlVGV4dENvbG9yOicnOid0cmFuc3BhcmVudCc7fXJldHVybiBzdHlsZTt9LGlzTmVzdGVkOmZ1bmN0aW9uIGlzTmVzdGVkKCl7cmV0dXJuIHRoaXMucGFyZW50TWVudSE9PXRoaXMucm9vdE1lbnU7fX0sbWV0aG9kczp7b25Nb3VzZUVudGVyOmZ1bmN0aW9uIG9uTW91c2VFbnRlcigpe2lmKHRoaXMubW9kZT09PSdob3Jpem9udGFsJyYmIXRoaXMucm9vdE1lbnUuYmFja2dyb3VuZENvbG9yKXJldHVybjt0aGlzLiRlbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9dGhpcy5ob3ZlckJhY2tncm91bmQ7fSxvbk1vdXNlTGVhdmU6ZnVuY3Rpb24gb25Nb3VzZUxlYXZlKCl7aWYodGhpcy5tb2RlPT09J2hvcml6b250YWwnJiYhdGhpcy5yb290TWVudS5iYWNrZ3JvdW5kQ29sb3IpcmV0dXJuO3RoaXMuJGVsLnN0eWxlLmJhY2tncm91bmRDb2xvcj10aGlzLmJhY2tncm91bmRDb2xvcjt9LGhhbmRsZUNsaWNrOmZ1bmN0aW9uIGhhbmRsZUNsaWNrKCl7aWYoIXRoaXMuZGlzYWJsZWQpe3RoaXMuZGlzcGF0Y2goJ0VsTWVudScsJ2l0ZW0tY2xpY2snLHRoaXMpO3RoaXMuJGVtaXQoJ2NsaWNrJyx0aGlzKTt9fX0sbW91bnRlZDpmdW5jdGlvbiBtb3VudGVkKCl7dGhpcy5wYXJlbnRNZW51LmFkZEl0ZW0odGhpcyk7dGhpcy5yb290TWVudS5hZGRJdGVtKHRoaXMpO30sYmVmb3JlRGVzdHJveTpmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCl7dGhpcy5wYXJlbnRNZW51LnJlbW92ZUl0ZW0odGhpcyk7dGhpcy5yb290TWVudS5yZW1vdmVJdGVtKHRoaXMpO319Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvbWVudS9zcmMvbWVudS1pdGVtLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfbWVudV9pdGVtdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPW1lbnVfaXRlbXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL21lbnUvc3JjL21lbnUtaXRlbS52dWUKLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciBtZW51X2l0ZW1fY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChzcmNfbWVudV9pdGVtdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLG1lbnVfaXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzJhNWRiZmVhX3JlbmRlcixtZW51X2l0ZW12dWVfdHlwZV90ZW1wbGF0ZV9pZF8yYTVkYmZlYV9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIG1lbnVfaXRlbV9hcGk7fW1lbnVfaXRlbV9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL21lbnUvc3JjL21lbnUtaXRlbS52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgbWVudV9pdGVtPW1lbnVfaXRlbV9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL21lbnUtaXRlbS9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL21lbnVfaXRlbS5pbnN0YWxsPWZ1bmN0aW9uKFZ1ZSl7VnVlLmNvbXBvbmVudChtZW51X2l0ZW0ubmFtZSxtZW51X2l0ZW0pO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYWNrYWdlc19tZW51X2l0ZW09bWVudV9pdGVtOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvbWVudS9zcmMvbWVudS1pdGVtLWdyb3VwLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD01NDNiN2JkYyYKdmFyIG1lbnVfaXRlbV9ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzU0M2I3YmRjX3JlbmRlcj1mdW5jdGlvbiBtZW51X2l0ZW1fZ3JvdXB2dWVfdHlwZV90ZW1wbGF0ZV9pZF81NDNiN2JkY19yZW5kZXIoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDt2YXIgX2M9X3ZtLl9zZWxmLl9jfHxfaDtyZXR1cm4gX2MoImxpIix7c3RhdGljQ2xhc3M6ImVsLW1lbnUtaXRlbS1ncm91cCJ9LFtfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLW1lbnUtaXRlbS1ncm91cF9fdGl0bGUiLHN0eWxlOntwYWRkaW5nTGVmdDpfdm0ubGV2ZWxQYWRkaW5nKyJweCJ9fSxbIV92bS4kc2xvdHMudGl0bGU/W192bS5fdihfdm0uX3MoX3ZtLnRpdGxlKSldOl92bS5fdCgidGl0bGUiKV0sMiksX2MoInVsIixbX3ZtLl90KCJkZWZhdWx0IildLDIpXSk7fTt2YXIgbWVudV9pdGVtX2dyb3VwdnVlX3R5cGVfdGVtcGxhdGVfaWRfNTQzYjdiZGNfc3RhdGljUmVuZGVyRm5zPVtdO21lbnVfaXRlbV9ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzU0M2I3YmRjX3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9tZW51L3NyYy9tZW51LWl0ZW0tZ3JvdXAudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTU0M2I3YmRjJgovLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9tZW51L3NyYy9tZW51LWl0ZW0tZ3JvdXAudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIG1lbnVfaXRlbV9ncm91cHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17bmFtZTonRWxNZW51SXRlbUdyb3VwJyxjb21wb25lbnROYW1lOidFbE1lbnVJdGVtR3JvdXAnLGluamVjdDpbJ3Jvb3RNZW51J10scHJvcHM6e3RpdGxlOnt0eXBlOlN0cmluZ319LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybntwYWRkaW5nTGVmdDoyMH07fSxjb21wdXRlZDp7bGV2ZWxQYWRkaW5nOmZ1bmN0aW9uIGxldmVsUGFkZGluZygpe3ZhciBwYWRkaW5nPTIwO3ZhciBwYXJlbnQ9dGhpcy4kcGFyZW50O2lmKHRoaXMucm9vdE1lbnUuY29sbGFwc2UpcmV0dXJuIDIwO3doaWxlKHBhcmVudCYmcGFyZW50LiRvcHRpb25zLmNvbXBvbmVudE5hbWUhPT0nRWxNZW51Jyl7aWYocGFyZW50LiRvcHRpb25zLmNvbXBvbmVudE5hbWU9PT0nRWxTdWJtZW51Jyl7cGFkZGluZys9MjA7fXBhcmVudD1wYXJlbnQuJHBhcmVudDt9cmV0dXJuIHBhZGRpbmc7fX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvbWVudS9zcmMvbWVudS1pdGVtLWdyb3VwLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfbWVudV9pdGVtX2dyb3VwdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPW1lbnVfaXRlbV9ncm91cHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL21lbnUvc3JjL21lbnUtaXRlbS1ncm91cC52dWUKLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciBtZW51X2l0ZW1fZ3JvdXBfY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChzcmNfbWVudV9pdGVtX2dyb3VwdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLG1lbnVfaXRlbV9ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzU0M2I3YmRjX3JlbmRlcixtZW51X2l0ZW1fZ3JvdXB2dWVfdHlwZV90ZW1wbGF0ZV9pZF81NDNiN2JkY19zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIG1lbnVfaXRlbV9ncm91cF9hcGk7fW1lbnVfaXRlbV9ncm91cF9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL21lbnUvc3JjL21lbnUtaXRlbS1ncm91cC52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgbWVudV9pdGVtX2dyb3VwPW1lbnVfaXRlbV9ncm91cF9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL21lbnUtaXRlbS1ncm91cC9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL21lbnVfaXRlbV9ncm91cC5pbnN0YWxsPWZ1bmN0aW9uKFZ1ZSl7VnVlLmNvbXBvbmVudChtZW51X2l0ZW1fZ3JvdXAubmFtZSxtZW51X2l0ZW1fZ3JvdXApO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYWNrYWdlc19tZW51X2l0ZW1fZ3JvdXA9bWVudV9pdGVtX2dyb3VwOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvaW5wdXQvc3JjL2lucHV0LnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0zNDNkZDc3NCYKdmFyIGlucHV0dnVlX3R5cGVfdGVtcGxhdGVfaWRfMzQzZGQ3NzRfcmVuZGVyPWZ1bmN0aW9uIGlucHV0dnVlX3R5cGVfdGVtcGxhdGVfaWRfMzQzZGQ3NzRfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJkaXYiLHtjbGFzczpbX3ZtLnR5cGU9PT0idGV4dGFyZWEiPyJlbC10ZXh0YXJlYSI6ImVsLWlucHV0Iixfdm0uaW5wdXRTaXplPyJlbC1pbnB1dC0tIitfdm0uaW5wdXRTaXplOiIiLHsiaXMtZGlzYWJsZWQiOl92bS5pbnB1dERpc2FibGVkLCJpcy1leGNlZWQiOl92bS5pbnB1dEV4Y2VlZCwiZWwtaW5wdXQtZ3JvdXAiOl92bS4kc2xvdHMucHJlcGVuZHx8X3ZtLiRzbG90cy5hcHBlbmQsImVsLWlucHV0LWdyb3VwLS1hcHBlbmQiOl92bS4kc2xvdHMuYXBwZW5kLCJlbC1pbnB1dC1ncm91cC0tcHJlcGVuZCI6X3ZtLiRzbG90cy5wcmVwZW5kLCJlbC1pbnB1dC0tcHJlZml4Ijpfdm0uJHNsb3RzLnByZWZpeHx8X3ZtLnByZWZpeEljb24sImVsLWlucHV0LS1zdWZmaXgiOl92bS4kc2xvdHMuc3VmZml4fHxfdm0uc3VmZml4SWNvbnx8X3ZtLmNsZWFyYWJsZXx8X3ZtLnNob3dQYXNzd29yZH1dLG9uOnttb3VzZWVudGVyOmZ1bmN0aW9uIG1vdXNlZW50ZXIoJGV2ZW50KXtfdm0uaG92ZXJpbmc9dHJ1ZTt9LG1vdXNlbGVhdmU6ZnVuY3Rpb24gbW91c2VsZWF2ZSgkZXZlbnQpe192bS5ob3ZlcmluZz1mYWxzZTt9fX0sW192bS50eXBlIT09InRleHRhcmVhIj9bX3ZtLiRzbG90cy5wcmVwZW5kP19jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtaW5wdXQtZ3JvdXBfX3ByZXBlbmQifSxbX3ZtLl90KCJwcmVwZW5kIildLDIpOl92bS5fZSgpLF92bS50eXBlIT09InRleHRhcmVhIj9fYygiaW5wdXQiLF92bS5fYih7cmVmOiJpbnB1dCIsc3RhdGljQ2xhc3M6ImVsLWlucHV0X19pbm5lciIsYXR0cnM6e3RhYmluZGV4Ol92bS50YWJpbmRleCx0eXBlOl92bS5zaG93UGFzc3dvcmQ/X3ZtLnBhc3N3b3JkVmlzaWJsZT8idGV4dCI6InBhc3N3b3JkIjpfdm0udHlwZSxkaXNhYmxlZDpfdm0uaW5wdXREaXNhYmxlZCxyZWFkb25seTpfdm0ucmVhZG9ubHksYXV0b2NvbXBsZXRlOl92bS5hdXRvQ29tcGxldGV8fF92bS5hdXRvY29tcGxldGUsImFyaWEtbGFiZWwiOl92bS5sYWJlbH0sb246e2NvbXBvc2l0aW9uc3RhcnQ6X3ZtLmhhbmRsZUNvbXBvc2l0aW9uU3RhcnQsY29tcG9zaXRpb251cGRhdGU6X3ZtLmhhbmRsZUNvbXBvc2l0aW9uVXBkYXRlLGNvbXBvc2l0aW9uZW5kOl92bS5oYW5kbGVDb21wb3NpdGlvbkVuZCxpbnB1dDpfdm0uaGFuZGxlSW5wdXQsZm9jdXM6X3ZtLmhhbmRsZUZvY3VzLGJsdXI6X3ZtLmhhbmRsZUJsdXIsY2hhbmdlOl92bS5oYW5kbGVDaGFuZ2V9fSwiaW5wdXQiLF92bS4kYXR0cnMsZmFsc2UpKTpfdm0uX2UoKSxfdm0uJHNsb3RzLnByZWZpeHx8X3ZtLnByZWZpeEljb24/X2MoInNwYW4iLHtzdGF0aWNDbGFzczoiZWwtaW5wdXRfX3ByZWZpeCJ9LFtfdm0uX3QoInByZWZpeCIpLF92bS5wcmVmaXhJY29uP19jKCJpIix7c3RhdGljQ2xhc3M6ImVsLWlucHV0X19pY29uIixjbGFzczpfdm0ucHJlZml4SWNvbn0pOl92bS5fZSgpXSwyKTpfdm0uX2UoKSxfdm0uZ2V0U3VmZml4VmlzaWJsZSgpP19jKCJzcGFuIix7c3RhdGljQ2xhc3M6ImVsLWlucHV0X19zdWZmaXgifSxbX2MoInNwYW4iLHtzdGF0aWNDbGFzczoiZWwtaW5wdXRfX3N1ZmZpeC1pbm5lciJ9LFshX3ZtLnNob3dDbGVhcnx8IV92bS5zaG93UHdkVmlzaWJsZXx8IV92bS5pc1dvcmRMaW1pdFZpc2libGU/W192bS5fdCgic3VmZml4IiksX3ZtLnN1ZmZpeEljb24/X2MoImkiLHtzdGF0aWNDbGFzczoiZWwtaW5wdXRfX2ljb24iLGNsYXNzOl92bS5zdWZmaXhJY29ufSk6X3ZtLl9lKCldOl92bS5fZSgpLF92bS5zaG93Q2xlYXI/X2MoImkiLHtzdGF0aWNDbGFzczoiZWwtaW5wdXRfX2ljb24gZWwtaWNvbi1jaXJjbGUtY2xvc2UgZWwtaW5wdXRfX2NsZWFyIixvbjp7bW91c2Vkb3duOmZ1bmN0aW9uIG1vdXNlZG93bigkZXZlbnQpeyRldmVudC5wcmV2ZW50RGVmYXVsdCgpO30sY2xpY2s6X3ZtLmNsZWFyfX0pOl92bS5fZSgpLF92bS5zaG93UHdkVmlzaWJsZT9fYygiaSIse3N0YXRpY0NsYXNzOiJlbC1pbnB1dF9faWNvbiBlbC1pY29uLXZpZXcgZWwtaW5wdXRfX2NsZWFyIixvbjp7Y2xpY2s6X3ZtLmhhbmRsZVBhc3N3b3JkVmlzaWJsZX19KTpfdm0uX2UoKSxfdm0uaXNXb3JkTGltaXRWaXNpYmxlP19jKCJzcGFuIix7c3RhdGljQ2xhc3M6ImVsLWlucHV0X19jb3VudCJ9LFtfYygic3BhbiIse3N0YXRpY0NsYXNzOiJlbC1pbnB1dF9fY291bnQtaW5uZXIifSxbX3ZtLl92KCJcbiAgICAgICAgICAgICIrX3ZtLl9zKF92bS50ZXh0TGVuZ3RoKSsiLyIrX3ZtLl9zKF92bS51cHBlckxpbWl0KSsiXG4gICAgICAgICAgIildKV0pOl92bS5fZSgpXSwyKSxfdm0udmFsaWRhdGVTdGF0ZT9fYygiaSIse3N0YXRpY0NsYXNzOiJlbC1pbnB1dF9faWNvbiIsY2xhc3M6WyJlbC1pbnB1dF9fdmFsaWRhdGVJY29uIixfdm0udmFsaWRhdGVJY29uXX0pOl92bS5fZSgpXSk6X3ZtLl9lKCksX3ZtLiRzbG90cy5hcHBlbmQ/X2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1pbnB1dC1ncm91cF9fYXBwZW5kIn0sW192bS5fdCgiYXBwZW5kIildLDIpOl92bS5fZSgpXTpfYygidGV4dGFyZWEiLF92bS5fYih7cmVmOiJ0ZXh0YXJlYSIsc3RhdGljQ2xhc3M6ImVsLXRleHRhcmVhX19pbm5lciIsc3R5bGU6X3ZtLnRleHRhcmVhU3R5bGUsYXR0cnM6e3RhYmluZGV4Ol92bS50YWJpbmRleCxkaXNhYmxlZDpfdm0uaW5wdXREaXNhYmxlZCxyZWFkb25seTpfdm0ucmVhZG9ubHksYXV0b2NvbXBsZXRlOl92bS5hdXRvQ29tcGxldGV8fF92bS5hdXRvY29tcGxldGUsImFyaWEtbGFiZWwiOl92bS5sYWJlbH0sb246e2NvbXBvc2l0aW9uc3RhcnQ6X3ZtLmhhbmRsZUNvbXBvc2l0aW9uU3RhcnQsY29tcG9zaXRpb251cGRhdGU6X3ZtLmhhbmRsZUNvbXBvc2l0aW9uVXBkYXRlLGNvbXBvc2l0aW9uZW5kOl92bS5oYW5kbGVDb21wb3NpdGlvbkVuZCxpbnB1dDpfdm0uaGFuZGxlSW5wdXQsZm9jdXM6X3ZtLmhhbmRsZUZvY3VzLGJsdXI6X3ZtLmhhbmRsZUJsdXIsY2hhbmdlOl92bS5oYW5kbGVDaGFuZ2V9fSwidGV4dGFyZWEiLF92bS4kYXR0cnMsZmFsc2UpKSxfdm0uaXNXb3JkTGltaXRWaXNpYmxlJiZfdm0udHlwZT09PSJ0ZXh0YXJlYSI/X2MoInNwYW4iLHtzdGF0aWNDbGFzczoiZWwtaW5wdXRfX2NvdW50In0sW192bS5fdihfdm0uX3MoX3ZtLnRleHRMZW5ndGgpKyIvIitfdm0uX3MoX3ZtLnVwcGVyTGltaXQpKV0pOl92bS5fZSgpXSwyKTt9O3ZhciBpbnB1dHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzM0M2RkNzc0X3N0YXRpY1JlbmRlckZucz1bXTtpbnB1dHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzM0M2RkNzc0X3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9pbnB1dC9zcmMvaW5wdXQudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTM0M2RkNzc0JgovLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2lucHV0L3NyYy9jYWxjVGV4dGFyZWFIZWlnaHQuanMKdmFyIGhpZGRlblRleHRhcmVhPXZvaWQgMDt2YXIgSElEREVOX1NUWUxFPSdcbiAgaGVpZ2h0OjAgIWltcG9ydGFudDtcbiAgdmlzaWJpbGl0eTpoaWRkZW4gIWltcG9ydGFudDtcbiAgb3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnQ7XG4gIHBvc2l0aW9uOmFic29sdXRlICFpbXBvcnRhbnQ7XG4gIHotaW5kZXg6LTEwMDAgIWltcG9ydGFudDtcbiAgdG9wOjAgIWltcG9ydGFudDtcbiAgcmlnaHQ6MCAhaW1wb3J0YW50XG4nO3ZhciBDT05URVhUX1NUWUxFPVsnbGV0dGVyLXNwYWNpbmcnLCdsaW5lLWhlaWdodCcsJ3BhZGRpbmctdG9wJywncGFkZGluZy1ib3R0b20nLCdmb250LWZhbWlseScsJ2ZvbnQtd2VpZ2h0JywnZm9udC1zaXplJywndGV4dC1yZW5kZXJpbmcnLCd0ZXh0LXRyYW5zZm9ybScsJ3dpZHRoJywndGV4dC1pbmRlbnQnLCdwYWRkaW5nLWxlZnQnLCdwYWRkaW5nLXJpZ2h0JywnYm9yZGVyLXdpZHRoJywnYm94LXNpemluZyddO2Z1bmN0aW9uIGNhbGN1bGF0ZU5vZGVTdHlsaW5nKHRhcmdldEVsZW1lbnQpe3ZhciBzdHlsZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXRFbGVtZW50KTt2YXIgYm94U2l6aW5nPXN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2JveC1zaXppbmcnKTt2YXIgcGFkZGluZ1NpemU9cGFyc2VGbG9hdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLWJvdHRvbScpKStwYXJzZUZsb2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctdG9wJykpO3ZhciBib3JkZXJTaXplPXBhcnNlRmxvYXQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnYm9yZGVyLWJvdHRvbS13aWR0aCcpKStwYXJzZUZsb2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2JvcmRlci10b3Atd2lkdGgnKSk7dmFyIGNvbnRleHRTdHlsZT1DT05URVhUX1NUWUxFLm1hcChmdW5jdGlvbihuYW1lKXtyZXR1cm4gbmFtZSsnOicrc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKTt9KS5qb2luKCc7Jyk7cmV0dXJue2NvbnRleHRTdHlsZTpjb250ZXh0U3R5bGUscGFkZGluZ1NpemU6cGFkZGluZ1NpemUsYm9yZGVyU2l6ZTpib3JkZXJTaXplLGJveFNpemluZzpib3hTaXppbmd9O31mdW5jdGlvbiBjYWxjVGV4dGFyZWFIZWlnaHQodGFyZ2V0RWxlbWVudCl7dmFyIG1pblJvd3M9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOjE7dmFyIG1heFJvd3M9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzJdOm51bGw7aWYoIWhpZGRlblRleHRhcmVhKXtoaWRkZW5UZXh0YXJlYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaGlkZGVuVGV4dGFyZWEpO312YXIgX2NhbGN1bGF0ZU5vZGVTdHlsaW5nPWNhbGN1bGF0ZU5vZGVTdHlsaW5nKHRhcmdldEVsZW1lbnQpLHBhZGRpbmdTaXplPV9jYWxjdWxhdGVOb2RlU3R5bGluZy5wYWRkaW5nU2l6ZSxib3JkZXJTaXplPV9jYWxjdWxhdGVOb2RlU3R5bGluZy5ib3JkZXJTaXplLGJveFNpemluZz1fY2FsY3VsYXRlTm9kZVN0eWxpbmcuYm94U2l6aW5nLGNvbnRleHRTdHlsZT1fY2FsY3VsYXRlTm9kZVN0eWxpbmcuY29udGV4dFN0eWxlO2hpZGRlblRleHRhcmVhLnNldEF0dHJpYnV0ZSgnc3R5bGUnLGNvbnRleHRTdHlsZSsnOycrSElEREVOX1NUWUxFKTtoaWRkZW5UZXh0YXJlYS52YWx1ZT10YXJnZXRFbGVtZW50LnZhbHVlfHx0YXJnZXRFbGVtZW50LnBsYWNlaG9sZGVyfHwnJzt2YXIgaGVpZ2h0PWhpZGRlblRleHRhcmVhLnNjcm9sbEhlaWdodDt2YXIgcmVzdWx0PXt9O2lmKGJveFNpemluZz09PSdib3JkZXItYm94Jyl7aGVpZ2h0PWhlaWdodCtib3JkZXJTaXplO31lbHNlIGlmKGJveFNpemluZz09PSdjb250ZW50LWJveCcpe2hlaWdodD1oZWlnaHQtcGFkZGluZ1NpemU7fWhpZGRlblRleHRhcmVhLnZhbHVlPScnO3ZhciBzaW5nbGVSb3dIZWlnaHQ9aGlkZGVuVGV4dGFyZWEuc2Nyb2xsSGVpZ2h0LXBhZGRpbmdTaXplO2lmKG1pblJvd3MhPT1udWxsKXt2YXIgbWluSGVpZ2h0PXNpbmdsZVJvd0hlaWdodCptaW5Sb3dzO2lmKGJveFNpemluZz09PSdib3JkZXItYm94Jyl7bWluSGVpZ2h0PW1pbkhlaWdodCtwYWRkaW5nU2l6ZStib3JkZXJTaXplO31oZWlnaHQ9TWF0aC5tYXgobWluSGVpZ2h0LGhlaWdodCk7cmVzdWx0Lm1pbkhlaWdodD1taW5IZWlnaHQrJ3B4Jzt9aWYobWF4Um93cyE9PW51bGwpe3ZhciBtYXhIZWlnaHQ9c2luZ2xlUm93SGVpZ2h0Km1heFJvd3M7aWYoYm94U2l6aW5nPT09J2JvcmRlci1ib3gnKXttYXhIZWlnaHQ9bWF4SGVpZ2h0K3BhZGRpbmdTaXplK2JvcmRlclNpemU7fWhlaWdodD1NYXRoLm1pbihtYXhIZWlnaHQsaGVpZ2h0KTt9cmVzdWx0LmhlaWdodD1oZWlnaHQrJ3B4JztoaWRkZW5UZXh0YXJlYS5wYXJlbnROb2RlJiZoaWRkZW5UZXh0YXJlYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGhpZGRlblRleHRhcmVhKTtoaWRkZW5UZXh0YXJlYT1udWxsO3JldHVybiByZXN1bHQ7fTsvLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsICJlbGVtZW50LXVpL2xpYi91dGlscy9tZXJnZSIKdmFyIG1lcmdlXz1fX3dlYnBhY2tfcmVxdWlyZV9fKDcpO3ZhciBtZXJnZV9kZWZhdWx0PS8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4obWVyZ2VfKTsvLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsICJlbGVtZW50LXVpL2xpYi91dGlscy9zaGFyZWQiCnZhciBzaGFyZWRfPV9fd2VicGFja19yZXF1aXJlX18oMTkpOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2lucHV0L3NyYy9pbnB1dC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgaW5wdXR2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e25hbWU6J0VsSW5wdXQnLGNvbXBvbmVudE5hbWU6J0VsSW5wdXQnLG1peGluczpbZW1pdHRlcl9kZWZhdWx0LmEsbWlncmF0aW5nX2RlZmF1bHQuYV0saW5oZXJpdEF0dHJzOmZhbHNlLGluamVjdDp7ZWxGb3JtOntkZWZhdWx0OicnfSxlbEZvcm1JdGVtOntkZWZhdWx0OicnfX0sZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue3RleHRhcmVhQ2FsY1N0eWxlOnt9LGhvdmVyaW5nOmZhbHNlLGZvY3VzZWQ6ZmFsc2UsaXNDb21wb3Npbmc6ZmFsc2UscGFzc3dvcmRWaXNpYmxlOmZhbHNlfTt9LHByb3BzOnt2YWx1ZTpbU3RyaW5nLE51bWJlcl0sc2l6ZTpTdHJpbmcscmVzaXplOlN0cmluZyxmb3JtOlN0cmluZyxkaXNhYmxlZDpCb29sZWFuLHJlYWRvbmx5OkJvb2xlYW4sdHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDondGV4dCd9LGF1dG9zaXplOnt0eXBlOltCb29sZWFuLE9iamVjdF0sZGVmYXVsdDpmYWxzZX0sYXV0b2NvbXBsZXRlOnt0eXBlOlN0cmluZyxkZWZhdWx0OidvZmYnfSwvKiogQERlcHJlY2F0ZWQgaW4gbmV4dCBtYWpvciB2ZXJzaW9uICovYXV0b0NvbXBsZXRlOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24gdmFsaWRhdG9yKHZhbCl7ZmFsc2UmJmZhbHNlO3JldHVybiB0cnVlO319LHZhbGlkYXRlRXZlbnQ6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OnRydWV9LHN1ZmZpeEljb246U3RyaW5nLHByZWZpeEljb246U3RyaW5nLGxhYmVsOlN0cmluZyxjbGVhcmFibGU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OmZhbHNlfSxzaG93UGFzc3dvcmQ6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OmZhbHNlfSxzaG93V29yZExpbWl0Ont0eXBlOkJvb2xlYW4sZGVmYXVsdDpmYWxzZX0sdGFiaW5kZXg6U3RyaW5nfSxjb21wdXRlZDp7X2VsRm9ybUl0ZW1TaXplOmZ1bmN0aW9uIF9lbEZvcm1JdGVtU2l6ZSgpe3JldHVybih0aGlzLmVsRm9ybUl0ZW18fHt9KS5lbEZvcm1JdGVtU2l6ZTt9LHZhbGlkYXRlU3RhdGU6ZnVuY3Rpb24gdmFsaWRhdGVTdGF0ZSgpe3JldHVybiB0aGlzLmVsRm9ybUl0ZW0/dGhpcy5lbEZvcm1JdGVtLnZhbGlkYXRlU3RhdGU6Jyc7fSxuZWVkU3RhdHVzSWNvbjpmdW5jdGlvbiBuZWVkU3RhdHVzSWNvbigpe3JldHVybiB0aGlzLmVsRm9ybT90aGlzLmVsRm9ybS5zdGF0dXNJY29uOmZhbHNlO30sdmFsaWRhdGVJY29uOmZ1bmN0aW9uIHZhbGlkYXRlSWNvbigpe3JldHVybnt2YWxpZGF0aW5nOidlbC1pY29uLWxvYWRpbmcnLHN1Y2Nlc3M6J2VsLWljb24tY2lyY2xlLWNoZWNrJyxlcnJvcjonZWwtaWNvbi1jaXJjbGUtY2xvc2UnfVt0aGlzLnZhbGlkYXRlU3RhdGVdO30sdGV4dGFyZWFTdHlsZTpmdW5jdGlvbiB0ZXh0YXJlYVN0eWxlKCl7cmV0dXJuIG1lcmdlX2RlZmF1bHQoKSh7fSx0aGlzLnRleHRhcmVhQ2FsY1N0eWxlLHtyZXNpemU6dGhpcy5yZXNpemV9KTt9LGlucHV0U2l6ZTpmdW5jdGlvbiBpbnB1dFNpemUoKXtyZXR1cm4gdGhpcy5zaXplfHx0aGlzLl9lbEZvcm1JdGVtU2l6ZXx8KHRoaXMuJEVMRU1FTlR8fHt9KS5zaXplO30saW5wdXREaXNhYmxlZDpmdW5jdGlvbiBpbnB1dERpc2FibGVkKCl7cmV0dXJuIHRoaXMuZGlzYWJsZWR8fCh0aGlzLmVsRm9ybXx8e30pLmRpc2FibGVkO30sbmF0aXZlSW5wdXRWYWx1ZTpmdW5jdGlvbiBuYXRpdmVJbnB1dFZhbHVlKCl7cmV0dXJuIHRoaXMudmFsdWU9PT1udWxsfHx0aGlzLnZhbHVlPT09dW5kZWZpbmVkPycnOlN0cmluZyh0aGlzLnZhbHVlKTt9LHNob3dDbGVhcjpmdW5jdGlvbiBzaG93Q2xlYXIoKXtyZXR1cm4gdGhpcy5jbGVhcmFibGUmJiF0aGlzLmlucHV0RGlzYWJsZWQmJiF0aGlzLnJlYWRvbmx5JiZ0aGlzLm5hdGl2ZUlucHV0VmFsdWUmJih0aGlzLmZvY3VzZWR8fHRoaXMuaG92ZXJpbmcpO30sc2hvd1B3ZFZpc2libGU6ZnVuY3Rpb24gc2hvd1B3ZFZpc2libGUoKXtyZXR1cm4gdGhpcy5zaG93UGFzc3dvcmQmJiF0aGlzLmlucHV0RGlzYWJsZWQmJiF0aGlzLnJlYWRvbmx5JiYoISF0aGlzLm5hdGl2ZUlucHV0VmFsdWV8fHRoaXMuZm9jdXNlZCk7fSxpc1dvcmRMaW1pdFZpc2libGU6ZnVuY3Rpb24gaXNXb3JkTGltaXRWaXNpYmxlKCl7cmV0dXJuIHRoaXMuc2hvd1dvcmRMaW1pdCYmdGhpcy4kYXR0cnMubWF4bGVuZ3RoJiYodGhpcy50eXBlPT09J3RleHQnfHx0aGlzLnR5cGU9PT0ndGV4dGFyZWEnKSYmIXRoaXMuaW5wdXREaXNhYmxlZCYmIXRoaXMucmVhZG9ubHkmJiF0aGlzLnNob3dQYXNzd29yZDt9LHVwcGVyTGltaXQ6ZnVuY3Rpb24gdXBwZXJMaW1pdCgpe3JldHVybiB0aGlzLiRhdHRycy5tYXhsZW5ndGg7fSx0ZXh0TGVuZ3RoOmZ1bmN0aW9uIHRleHRMZW5ndGgoKXtpZih0eXBlb2YgdGhpcy52YWx1ZT09PSdudW1iZXInKXtyZXR1cm4gU3RyaW5nKHRoaXMudmFsdWUpLmxlbmd0aDt9cmV0dXJuKHRoaXMudmFsdWV8fCcnKS5sZW5ndGg7fSxpbnB1dEV4Y2VlZDpmdW5jdGlvbiBpbnB1dEV4Y2VlZCgpey8vIHNob3cgZXhjZWVkIHN0eWxlIGlmIGxlbmd0aCBvZiBpbml0aWFsIHZhbHVlIGdyZWF0ZXIgdGhlbiBtYXhsZW5ndGgKcmV0dXJuIHRoaXMuaXNXb3JkTGltaXRWaXNpYmxlJiZ0aGlzLnRleHRMZW5ndGg+dGhpcy51cHBlckxpbWl0O319LHdhdGNoOnt2YWx1ZTpmdW5jdGlvbiB2YWx1ZSh2YWwpe3RoaXMuJG5leHRUaWNrKHRoaXMucmVzaXplVGV4dGFyZWEpO2lmKHRoaXMudmFsaWRhdGVFdmVudCl7dGhpcy5kaXNwYXRjaCgnRWxGb3JtSXRlbScsJ2VsLmZvcm0uY2hhbmdlJyxbdmFsXSk7fX0sLy8gbmF0aXZlIGlucHV0IHZhbHVlIGlzIHNldCBleHBsaWNpdGx5Ci8vIGRvIG5vdCB1c2Ugdi1tb2RlbCAvIDp2YWx1ZSBpbiB0ZW1wbGF0ZQovLyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9FbGVtZUZFL2VsZW1lbnQvaXNzdWVzLzE0NTIxCm5hdGl2ZUlucHV0VmFsdWU6ZnVuY3Rpb24gbmF0aXZlSW5wdXRWYWx1ZSgpe3RoaXMuc2V0TmF0aXZlSW5wdXRWYWx1ZSgpO30sLy8gd2hlbiBjaGFuZ2UgYmV0d2VlbiA8aW5wdXQ+IGFuZCA8dGV4dGFyZWE+LAovLyB1cGRhdGUgRE9NIGRlcGVuZGVudCB2YWx1ZSBhbmQgc3R5bGVzCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9FbGVtZUZFL2VsZW1lbnQvaXNzdWVzLzE0ODU3CnR5cGU6ZnVuY3Rpb24gdHlwZSgpe3ZhciBfdGhpcz10aGlzO3RoaXMuJG5leHRUaWNrKGZ1bmN0aW9uKCl7X3RoaXMuc2V0TmF0aXZlSW5wdXRWYWx1ZSgpO190aGlzLnJlc2l6ZVRleHRhcmVhKCk7X3RoaXMudXBkYXRlSWNvbk9mZnNldCgpO30pO319LG1ldGhvZHM6e2ZvY3VzOmZ1bmN0aW9uIGZvY3VzKCl7dGhpcy5nZXRJbnB1dCgpLmZvY3VzKCk7fSxibHVyOmZ1bmN0aW9uIGJsdXIoKXt0aGlzLmdldElucHV0KCkuYmx1cigpO30sZ2V0TWlncmF0aW5nQ29uZmlnOmZ1bmN0aW9uIGdldE1pZ3JhdGluZ0NvbmZpZygpe3JldHVybntwcm9wczp7J2ljb24nOidpY29uIGlzIHJlbW92ZWQsIHVzZSBzdWZmaXgtaWNvbiAvIHByZWZpeC1pY29uIGluc3RlYWQuJywnb24taWNvbi1jbGljayc6J29uLWljb24tY2xpY2sgaXMgcmVtb3ZlZC4nfSxldmVudHM6eydjbGljayc6J2NsaWNrIGlzIHJlbW92ZWQuJ319O30saGFuZGxlQmx1cjpmdW5jdGlvbiBoYW5kbGVCbHVyKGV2ZW50KXt0aGlzLmZvY3VzZWQ9ZmFsc2U7dGhpcy4kZW1pdCgnYmx1cicsZXZlbnQpO2lmKHRoaXMudmFsaWRhdGVFdmVudCl7dGhpcy5kaXNwYXRjaCgnRWxGb3JtSXRlbScsJ2VsLmZvcm0uYmx1cicsW3RoaXMudmFsdWVdKTt9fSxzZWxlY3Q6ZnVuY3Rpb24gc2VsZWN0KCl7dGhpcy5nZXRJbnB1dCgpLnNlbGVjdCgpO30scmVzaXplVGV4dGFyZWE6ZnVuY3Rpb24gcmVzaXplVGV4dGFyZWEoKXtpZih0aGlzLiRpc1NlcnZlcilyZXR1cm47dmFyIGF1dG9zaXplPXRoaXMuYXV0b3NpemUsdHlwZT10aGlzLnR5cGU7aWYodHlwZSE9PSd0ZXh0YXJlYScpcmV0dXJuO2lmKCFhdXRvc2l6ZSl7dGhpcy50ZXh0YXJlYUNhbGNTdHlsZT17bWluSGVpZ2h0OmNhbGNUZXh0YXJlYUhlaWdodCh0aGlzLiRyZWZzLnRleHRhcmVhKS5taW5IZWlnaHR9O3JldHVybjt9dmFyIG1pblJvd3M9YXV0b3NpemUubWluUm93czt2YXIgbWF4Um93cz1hdXRvc2l6ZS5tYXhSb3dzO3RoaXMudGV4dGFyZWFDYWxjU3R5bGU9Y2FsY1RleHRhcmVhSGVpZ2h0KHRoaXMuJHJlZnMudGV4dGFyZWEsbWluUm93cyxtYXhSb3dzKTt9LHNldE5hdGl2ZUlucHV0VmFsdWU6ZnVuY3Rpb24gc2V0TmF0aXZlSW5wdXRWYWx1ZSgpe3ZhciBpbnB1dD10aGlzLmdldElucHV0KCk7aWYoIWlucHV0KXJldHVybjtpZihpbnB1dC52YWx1ZT09PXRoaXMubmF0aXZlSW5wdXRWYWx1ZSlyZXR1cm47aW5wdXQudmFsdWU9dGhpcy5uYXRpdmVJbnB1dFZhbHVlO30saGFuZGxlRm9jdXM6ZnVuY3Rpb24gaGFuZGxlRm9jdXMoZXZlbnQpe3RoaXMuZm9jdXNlZD10cnVlO3RoaXMuJGVtaXQoJ2ZvY3VzJyxldmVudCk7fSxoYW5kbGVDb21wb3NpdGlvblN0YXJ0OmZ1bmN0aW9uIGhhbmRsZUNvbXBvc2l0aW9uU3RhcnQoKXt0aGlzLmlzQ29tcG9zaW5nPXRydWU7fSxoYW5kbGVDb21wb3NpdGlvblVwZGF0ZTpmdW5jdGlvbiBoYW5kbGVDb21wb3NpdGlvblVwZGF0ZShldmVudCl7dmFyIHRleHQ9ZXZlbnQudGFyZ2V0LnZhbHVlO3ZhciBsYXN0Q2hhcmFjdGVyPXRleHRbdGV4dC5sZW5ndGgtMV18fCcnO3RoaXMuaXNDb21wb3Npbmc9IU9iamVjdChzaGFyZWRfWyJpc0tvcmVhbiJdKShsYXN0Q2hhcmFjdGVyKTt9LGhhbmRsZUNvbXBvc2l0aW9uRW5kOmZ1bmN0aW9uIGhhbmRsZUNvbXBvc2l0aW9uRW5kKGV2ZW50KXtpZih0aGlzLmlzQ29tcG9zaW5nKXt0aGlzLmlzQ29tcG9zaW5nPWZhbHNlO3RoaXMuaGFuZGxlSW5wdXQoZXZlbnQpO319LGhhbmRsZUlucHV0OmZ1bmN0aW9uIGhhbmRsZUlucHV0KGV2ZW50KXsvLyBzaG91bGQgbm90IGVtaXQgaW5wdXQgZHVyaW5nIGNvbXBvc2l0aW9uCi8vIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL0VsZW1lRkUvZWxlbWVudC9pc3N1ZXMvMTA1MTYKaWYodGhpcy5pc0NvbXBvc2luZylyZXR1cm47Ly8gaGFjayBmb3IgaHR0cHM6Ly9naXRodWIuY29tL0VsZW1lRkUvZWxlbWVudC9pc3N1ZXMvODU0OAovLyBzaG91bGQgcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSB3aGVuIHdlIGRvbid0IHN1cHBvcnQgSUUKaWYoZXZlbnQudGFyZ2V0LnZhbHVlPT09dGhpcy5uYXRpdmVJbnB1dFZhbHVlKXJldHVybjt0aGlzLiRlbWl0KCdpbnB1dCcsZXZlbnQudGFyZ2V0LnZhbHVlKTsvLyBlbnN1cmUgbmF0aXZlIGlucHV0IHZhbHVlIGlzIGNvbnRyb2xsZWQKLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vRWxlbWVGRS9lbGVtZW50L2lzc3Vlcy8xMjg1MAp0aGlzLiRuZXh0VGljayh0aGlzLnNldE5hdGl2ZUlucHV0VmFsdWUpO30saGFuZGxlQ2hhbmdlOmZ1bmN0aW9uIGhhbmRsZUNoYW5nZShldmVudCl7dGhpcy4kZW1pdCgnY2hhbmdlJyxldmVudC50YXJnZXQudmFsdWUpO30sY2FsY0ljb25PZmZzZXQ6ZnVuY3Rpb24gY2FsY0ljb25PZmZzZXQocGxhY2Upe3ZhciBlbExpc3Q9W10uc2xpY2UuY2FsbCh0aGlzLiRlbC5xdWVyeVNlbGVjdG9yQWxsKCcuZWwtaW5wdXRfXycrcGxhY2UpfHxbXSk7aWYoIWVsTGlzdC5sZW5ndGgpcmV0dXJuO3ZhciBlbD1udWxsO2Zvcih2YXIgaT0wO2k8ZWxMaXN0Lmxlbmd0aDtpKyspe2lmKGVsTGlzdFtpXS5wYXJlbnROb2RlPT09dGhpcy4kZWwpe2VsPWVsTGlzdFtpXTticmVhazt9fWlmKCFlbClyZXR1cm47dmFyIHBlbmRhbnRNYXA9e3N1ZmZpeDonYXBwZW5kJyxwcmVmaXg6J3ByZXBlbmQnfTt2YXIgcGVuZGFudD1wZW5kYW50TWFwW3BsYWNlXTtpZih0aGlzLiRzbG90c1twZW5kYW50XSl7ZWwuc3R5bGUudHJhbnNmb3JtPSd0cmFuc2xhdGVYKCcrKHBsYWNlPT09J3N1ZmZpeCc/Jy0nOicnKSt0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCcuZWwtaW5wdXQtZ3JvdXBfXycrcGVuZGFudCkub2Zmc2V0V2lkdGgrJ3B4KSc7fWVsc2V7ZWwucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO319LHVwZGF0ZUljb25PZmZzZXQ6ZnVuY3Rpb24gdXBkYXRlSWNvbk9mZnNldCgpe3RoaXMuY2FsY0ljb25PZmZzZXQoJ3ByZWZpeCcpO3RoaXMuY2FsY0ljb25PZmZzZXQoJ3N1ZmZpeCcpO30sY2xlYXI6ZnVuY3Rpb24gY2xlYXIoKXt0aGlzLiRlbWl0KCdpbnB1dCcsJycpO3RoaXMuJGVtaXQoJ2NoYW5nZScsJycpO3RoaXMuJGVtaXQoJ2NsZWFyJyk7fSxoYW5kbGVQYXNzd29yZFZpc2libGU6ZnVuY3Rpb24gaGFuZGxlUGFzc3dvcmRWaXNpYmxlKCl7dGhpcy5wYXNzd29yZFZpc2libGU9IXRoaXMucGFzc3dvcmRWaXNpYmxlO3RoaXMuZm9jdXMoKTt9LGdldElucHV0OmZ1bmN0aW9uIGdldElucHV0KCl7cmV0dXJuIHRoaXMuJHJlZnMuaW5wdXR8fHRoaXMuJHJlZnMudGV4dGFyZWE7fSxnZXRTdWZmaXhWaXNpYmxlOmZ1bmN0aW9uIGdldFN1ZmZpeFZpc2libGUoKXtyZXR1cm4gdGhpcy4kc2xvdHMuc3VmZml4fHx0aGlzLnN1ZmZpeEljb258fHRoaXMuc2hvd0NsZWFyfHx0aGlzLnNob3dQYXNzd29yZHx8dGhpcy5pc1dvcmRMaW1pdFZpc2libGV8fHRoaXMudmFsaWRhdGVTdGF0ZSYmdGhpcy5uZWVkU3RhdHVzSWNvbjt9fSxjcmVhdGVkOmZ1bmN0aW9uIGNyZWF0ZWQoKXt0aGlzLiRvbignaW5wdXRTZWxlY3QnLHRoaXMuc2VsZWN0KTt9LG1vdW50ZWQ6ZnVuY3Rpb24gbW91bnRlZCgpe3RoaXMuc2V0TmF0aXZlSW5wdXRWYWx1ZSgpO3RoaXMucmVzaXplVGV4dGFyZWEoKTt0aGlzLnVwZGF0ZUljb25PZmZzZXQoKTt9LHVwZGF0ZWQ6ZnVuY3Rpb24gdXBkYXRlZCgpe3RoaXMuJG5leHRUaWNrKHRoaXMudXBkYXRlSWNvbk9mZnNldCk7fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9pbnB1dC9zcmMvaW5wdXQudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHNyY19pbnB1dHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz1pbnB1dHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2lucHV0L3NyYy9pbnB1dC52dWUKLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciBpbnB1dF9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHNyY19pbnB1dHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxpbnB1dHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzM0M2RkNzc0X3JlbmRlcixpbnB1dHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzM0M2RkNzc0X3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgaW5wdXRfYXBpO31pbnB1dF9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL2lucHV0L3NyYy9pbnB1dC52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc3JjX2lucHV0PWlucHV0X2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvaW5wdXQvaW5kZXguanMKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9zcmNfaW5wdXQuaW5zdGFsbD1mdW5jdGlvbihWdWUpe1Z1ZS5jb21wb25lbnQoc3JjX2lucHV0Lm5hbWUsc3JjX2lucHV0KTt9Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFja2FnZXNfaW5wdXQ9c3JjX2lucHV0Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvaW5wdXQtbnVtYmVyL3NyYy9pbnB1dC1udW1iZXIudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTQyZjhjZjY2Jgp2YXIgaW5wdXRfbnVtYmVydnVlX3R5cGVfdGVtcGxhdGVfaWRfNDJmOGNmNjZfcmVuZGVyPWZ1bmN0aW9uIGlucHV0X251bWJlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQyZjhjZjY2X3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygiZGl2Iix7Y2xhc3M6WyJlbC1pbnB1dC1udW1iZXIiLF92bS5pbnB1dE51bWJlclNpemU/ImVsLWlucHV0LW51bWJlci0tIitfdm0uaW5wdXROdW1iZXJTaXplOiIiLHsiaXMtZGlzYWJsZWQiOl92bS5pbnB1dE51bWJlckRpc2FibGVkfSx7ImlzLXdpdGhvdXQtY29udHJvbHMiOiFfdm0uY29udHJvbHN9LHsiaXMtY29udHJvbHMtcmlnaHQiOl92bS5jb250cm9sc0F0UmlnaHR9XSxvbjp7ZHJhZ3N0YXJ0OmZ1bmN0aW9uIGRyYWdzdGFydCgkZXZlbnQpeyRldmVudC5wcmV2ZW50RGVmYXVsdCgpO319fSxbX3ZtLmNvbnRyb2xzP19jKCJzcGFuIix7ZGlyZWN0aXZlczpbe25hbWU6InJlcGVhdC1jbGljayIscmF3TmFtZToidi1yZXBlYXQtY2xpY2siLHZhbHVlOl92bS5kZWNyZWFzZSxleHByZXNzaW9uOiJkZWNyZWFzZSJ9XSxzdGF0aWNDbGFzczoiZWwtaW5wdXQtbnVtYmVyX19kZWNyZWFzZSIsY2xhc3M6eyJpcy1kaXNhYmxlZCI6X3ZtLm1pbkRpc2FibGVkfSxhdHRyczp7cm9sZToiYnV0dG9uIn0sb246e2tleWRvd246ZnVuY3Rpb24ga2V5ZG93bigkZXZlbnQpe2lmKCEoImJ1dHRvbiJpbiAkZXZlbnQpJiZfdm0uX2soJGV2ZW50LmtleUNvZGUsImVudGVyIiwxMywkZXZlbnQua2V5LCJFbnRlciIpKXtyZXR1cm4gbnVsbDt9cmV0dXJuIF92bS5kZWNyZWFzZSgkZXZlbnQpO319fSxbX2MoImkiLHtjbGFzczoiZWwtaWNvbi0iKyhfdm0uY29udHJvbHNBdFJpZ2h0PyJhcnJvdy1kb3duIjoibWludXMiKX0pXSk6X3ZtLl9lKCksX3ZtLmNvbnRyb2xzP19jKCJzcGFuIix7ZGlyZWN0aXZlczpbe25hbWU6InJlcGVhdC1jbGljayIscmF3TmFtZToidi1yZXBlYXQtY2xpY2siLHZhbHVlOl92bS5pbmNyZWFzZSxleHByZXNzaW9uOiJpbmNyZWFzZSJ9XSxzdGF0aWNDbGFzczoiZWwtaW5wdXQtbnVtYmVyX19pbmNyZWFzZSIsY2xhc3M6eyJpcy1kaXNhYmxlZCI6X3ZtLm1heERpc2FibGVkfSxhdHRyczp7cm9sZToiYnV0dG9uIn0sb246e2tleWRvd246ZnVuY3Rpb24ga2V5ZG93bigkZXZlbnQpe2lmKCEoImJ1dHRvbiJpbiAkZXZlbnQpJiZfdm0uX2soJGV2ZW50LmtleUNvZGUsImVudGVyIiwxMywkZXZlbnQua2V5LCJFbnRlciIpKXtyZXR1cm4gbnVsbDt9cmV0dXJuIF92bS5pbmNyZWFzZSgkZXZlbnQpO319fSxbX2MoImkiLHtjbGFzczoiZWwtaWNvbi0iKyhfdm0uY29udHJvbHNBdFJpZ2h0PyJhcnJvdy11cCI6InBsdXMiKX0pXSk6X3ZtLl9lKCksX2MoImVsLWlucHV0Iix7cmVmOiJpbnB1dCIsYXR0cnM6e3ZhbHVlOl92bS5kaXNwbGF5VmFsdWUscGxhY2Vob2xkZXI6X3ZtLnBsYWNlaG9sZGVyLGRpc2FibGVkOl92bS5pbnB1dE51bWJlckRpc2FibGVkLHNpemU6X3ZtLmlucHV0TnVtYmVyU2l6ZSxtYXg6X3ZtLm1heCxtaW46X3ZtLm1pbixuYW1lOl92bS5uYW1lLGxhYmVsOl92bS5sYWJlbH0sb246e2JsdXI6X3ZtLmhhbmRsZUJsdXIsZm9jdXM6X3ZtLmhhbmRsZUZvY3VzLGlucHV0Ol92bS5oYW5kbGVJbnB1dCxjaGFuZ2U6X3ZtLmhhbmRsZUlucHV0Q2hhbmdlfSxuYXRpdmVPbjp7a2V5ZG93bjpbZnVuY3Rpb24oJGV2ZW50KXtpZighKCJidXR0b24iaW4gJGV2ZW50KSYmX3ZtLl9rKCRldmVudC5rZXlDb2RlLCJ1cCIsMzgsJGV2ZW50LmtleSxbIlVwIiwiQXJyb3dVcCJdKSl7cmV0dXJuIG51bGw7fSRldmVudC5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBfdm0uaW5jcmVhc2UoJGV2ZW50KTt9LGZ1bmN0aW9uKCRldmVudCl7aWYoISgiYnV0dG9uImluICRldmVudCkmJl92bS5faygkZXZlbnQua2V5Q29kZSwiZG93biIsNDAsJGV2ZW50LmtleSxbIkRvd24iLCJBcnJvd0Rvd24iXSkpe3JldHVybiBudWxsO30kZXZlbnQucHJldmVudERlZmF1bHQoKTtyZXR1cm4gX3ZtLmRlY3JlYXNlKCRldmVudCk7fV19fSldLDEpO307dmFyIGlucHV0X251bWJlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQyZjhjZjY2X3N0YXRpY1JlbmRlckZucz1bXTtpbnB1dF9udW1iZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF80MmY4Y2Y2Nl9yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvaW5wdXQtbnVtYmVyL3NyYy9pbnB1dC1udW1iZXIudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTQyZjhjZjY2JgovLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXJlY3RpdmVzL3JlcGVhdC1jbGljay5qcwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHJlcGVhdF9jbGljaz17YmluZDpmdW5jdGlvbiBiaW5kKGVsLGJpbmRpbmcsdm5vZGUpe3ZhciBpbnRlcnZhbD1udWxsO3ZhciBzdGFydFRpbWU9dm9pZCAwO3ZhciBoYW5kbGVyPWZ1bmN0aW9uIGhhbmRsZXIoKXtyZXR1cm4gdm5vZGUuY29udGV4dFtiaW5kaW5nLmV4cHJlc3Npb25dLmFwcGx5KCk7fTt2YXIgY2xlYXI9ZnVuY3Rpb24gY2xlYXIoKXtpZihEYXRlLm5vdygpLXN0YXJ0VGltZTwxMDApe2hhbmRsZXIoKTt9Y2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7aW50ZXJ2YWw9bnVsbDt9O09iamVjdChkb21fWyJvbiJdKShlbCwnbW91c2Vkb3duJyxmdW5jdGlvbihlKXtpZihlLmJ1dHRvbiE9PTApcmV0dXJuO3N0YXJ0VGltZT1EYXRlLm5vdygpO09iamVjdChkb21fWyJvbmNlIl0pKGRvY3VtZW50LCdtb3VzZXVwJyxjbGVhcik7Y2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7aW50ZXJ2YWw9c2V0SW50ZXJ2YWwoaGFuZGxlciwxMDApO30pO319Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2lucHV0LW51bWJlci9zcmMvaW5wdXQtbnVtYmVyLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBpbnB1dF9udW1iZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e25hbWU6J0VsSW5wdXROdW1iZXInLG1peGluczpbZm9jdXNfZGVmYXVsdCgpKCdpbnB1dCcpXSxpbmplY3Q6e2VsRm9ybTp7ZGVmYXVsdDonJ30sZWxGb3JtSXRlbTp7ZGVmYXVsdDonJ319LGRpcmVjdGl2ZXM6e3JlcGVhdENsaWNrOnJlcGVhdF9jbGlja30sY29tcG9uZW50czp7RWxJbnB1dDppbnB1dF9kZWZhdWx0LmF9LHByb3BzOntzdGVwOnt0eXBlOk51bWJlcixkZWZhdWx0OjF9LHN0ZXBTdHJpY3RseTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ZmFsc2V9LG1heDp7dHlwZTpOdW1iZXIsZGVmYXVsdDpJbmZpbml0eX0sbWluOnt0eXBlOk51bWJlcixkZWZhdWx0Oi1JbmZpbml0eX0sdmFsdWU6e30sZGlzYWJsZWQ6Qm9vbGVhbixzaXplOlN0cmluZyxjb250cm9sczp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6dHJ1ZX0sY29udHJvbHNQb3NpdGlvbjp7dHlwZTpTdHJpbmcsZGVmYXVsdDonJ30sbmFtZTpTdHJpbmcsbGFiZWw6U3RyaW5nLHBsYWNlaG9sZGVyOlN0cmluZyxwcmVjaXNpb246e3R5cGU6TnVtYmVyLHZhbGlkYXRvcjpmdW5jdGlvbiB2YWxpZGF0b3IodmFsKXtyZXR1cm4gdmFsPj0wJiZ2YWw9PT1wYXJzZUludCh2YWwsMTApO319fSxkYXRhOmZ1bmN0aW9uIGRhdGEoKXtyZXR1cm57Y3VycmVudFZhbHVlOjAsdXNlcklucHV0Om51bGx9O30sd2F0Y2g6e3ZhbHVlOntpbW1lZGlhdGU6dHJ1ZSxoYW5kbGVyOmZ1bmN0aW9uIGhhbmRsZXIodmFsdWUpe3ZhciBuZXdWYWw9dmFsdWU9PT11bmRlZmluZWQ/dmFsdWU6TnVtYmVyKHZhbHVlKTtpZihuZXdWYWwhPT11bmRlZmluZWQpe2lmKGlzTmFOKG5ld1ZhbCkpe3JldHVybjt9aWYodGhpcy5zdGVwU3RyaWN0bHkpe3ZhciBzdGVwUHJlY2lzaW9uPXRoaXMuZ2V0UHJlY2lzaW9uKHRoaXMuc3RlcCk7dmFyIHByZWNpc2lvbkZhY3Rvcj1NYXRoLnBvdygxMCxzdGVwUHJlY2lzaW9uKTtuZXdWYWw9TWF0aC5yb3VuZChuZXdWYWwvdGhpcy5zdGVwKSpwcmVjaXNpb25GYWN0b3IqdGhpcy5zdGVwL3ByZWNpc2lvbkZhY3Rvcjt9aWYodGhpcy5wcmVjaXNpb24hPT11bmRlZmluZWQpe25ld1ZhbD10aGlzLnRvUHJlY2lzaW9uKG5ld1ZhbCx0aGlzLnByZWNpc2lvbik7fX1pZihuZXdWYWw+PXRoaXMubWF4KW5ld1ZhbD10aGlzLm1heDtpZihuZXdWYWw8PXRoaXMubWluKW5ld1ZhbD10aGlzLm1pbjt0aGlzLmN1cnJlbnRWYWx1ZT1uZXdWYWw7dGhpcy51c2VySW5wdXQ9bnVsbDt0aGlzLiRlbWl0KCdpbnB1dCcsbmV3VmFsKTt9fX0sY29tcHV0ZWQ6e21pbkRpc2FibGVkOmZ1bmN0aW9uIG1pbkRpc2FibGVkKCl7cmV0dXJuIHRoaXMuX2RlY3JlYXNlKHRoaXMudmFsdWUsdGhpcy5zdGVwKTx0aGlzLm1pbjt9LG1heERpc2FibGVkOmZ1bmN0aW9uIG1heERpc2FibGVkKCl7cmV0dXJuIHRoaXMuX2luY3JlYXNlKHRoaXMudmFsdWUsdGhpcy5zdGVwKT50aGlzLm1heDt9LG51bVByZWNpc2lvbjpmdW5jdGlvbiBudW1QcmVjaXNpb24oKXt2YXIgdmFsdWU9dGhpcy52YWx1ZSxzdGVwPXRoaXMuc3RlcCxnZXRQcmVjaXNpb249dGhpcy5nZXRQcmVjaXNpb24scHJlY2lzaW9uPXRoaXMucHJlY2lzaW9uO3ZhciBzdGVwUHJlY2lzaW9uPWdldFByZWNpc2lvbihzdGVwKTtpZihwcmVjaXNpb24hPT11bmRlZmluZWQpe2lmKHN0ZXBQcmVjaXNpb24+cHJlY2lzaW9uKXtjb25zb2xlLndhcm4oJ1tFbGVtZW50IFdhcm5dW0lucHV0TnVtYmVyXXByZWNpc2lvbiBzaG91bGQgbm90IGJlIGxlc3MgdGhhbiB0aGUgZGVjaW1hbCBwbGFjZXMgb2Ygc3RlcCcpO31yZXR1cm4gcHJlY2lzaW9uO31lbHNle3JldHVybiBNYXRoLm1heChnZXRQcmVjaXNpb24odmFsdWUpLHN0ZXBQcmVjaXNpb24pO319LGNvbnRyb2xzQXRSaWdodDpmdW5jdGlvbiBjb250cm9sc0F0UmlnaHQoKXtyZXR1cm4gdGhpcy5jb250cm9scyYmdGhpcy5jb250cm9sc1Bvc2l0aW9uPT09J3JpZ2h0Jzt9LF9lbEZvcm1JdGVtU2l6ZTpmdW5jdGlvbiBfZWxGb3JtSXRlbVNpemUoKXtyZXR1cm4odGhpcy5lbEZvcm1JdGVtfHx7fSkuZWxGb3JtSXRlbVNpemU7fSxpbnB1dE51bWJlclNpemU6ZnVuY3Rpb24gaW5wdXROdW1iZXJTaXplKCl7cmV0dXJuIHRoaXMuc2l6ZXx8dGhpcy5fZWxGb3JtSXRlbVNpemV8fCh0aGlzLiRFTEVNRU5UfHx7fSkuc2l6ZTt9LGlucHV0TnVtYmVyRGlzYWJsZWQ6ZnVuY3Rpb24gaW5wdXROdW1iZXJEaXNhYmxlZCgpe3JldHVybiB0aGlzLmRpc2FibGVkfHwhISh0aGlzLmVsRm9ybXx8e30pLmRpc2FibGVkO30sZGlzcGxheVZhbHVlOmZ1bmN0aW9uIGRpc3BsYXlWYWx1ZSgpe2lmKHRoaXMudXNlcklucHV0IT09bnVsbCl7cmV0dXJuIHRoaXMudXNlcklucHV0O312YXIgY3VycmVudFZhbHVlPXRoaXMuY3VycmVudFZhbHVlO2lmKHR5cGVvZiBjdXJyZW50VmFsdWU9PT0nbnVtYmVyJyl7aWYodGhpcy5zdGVwU3RyaWN0bHkpe3ZhciBzdGVwUHJlY2lzaW9uPXRoaXMuZ2V0UHJlY2lzaW9uKHRoaXMuc3RlcCk7dmFyIHByZWNpc2lvbkZhY3Rvcj1NYXRoLnBvdygxMCxzdGVwUHJlY2lzaW9uKTtjdXJyZW50VmFsdWU9TWF0aC5yb3VuZChjdXJyZW50VmFsdWUvdGhpcy5zdGVwKSpwcmVjaXNpb25GYWN0b3IqdGhpcy5zdGVwL3ByZWNpc2lvbkZhY3Rvcjt9aWYodGhpcy5wcmVjaXNpb24hPT11bmRlZmluZWQpe2N1cnJlbnRWYWx1ZT1jdXJyZW50VmFsdWUudG9GaXhlZCh0aGlzLnByZWNpc2lvbik7fX1yZXR1cm4gY3VycmVudFZhbHVlO319LG1ldGhvZHM6e3RvUHJlY2lzaW9uOmZ1bmN0aW9uIHRvUHJlY2lzaW9uKG51bSxwcmVjaXNpb24pe2lmKHByZWNpc2lvbj09PXVuZGVmaW5lZClwcmVjaXNpb249dGhpcy5udW1QcmVjaXNpb247cmV0dXJuIHBhcnNlRmxvYXQoTWF0aC5yb3VuZChudW0qTWF0aC5wb3coMTAscHJlY2lzaW9uKSkvTWF0aC5wb3coMTAscHJlY2lzaW9uKSk7fSxnZXRQcmVjaXNpb246ZnVuY3Rpb24gZ2V0UHJlY2lzaW9uKHZhbHVlKXtpZih2YWx1ZT09PXVuZGVmaW5lZClyZXR1cm4gMDt2YXIgdmFsdWVTdHJpbmc9dmFsdWUudG9TdHJpbmcoKTt2YXIgZG90UG9zaXRpb249dmFsdWVTdHJpbmcuaW5kZXhPZignLicpO3ZhciBwcmVjaXNpb249MDtpZihkb3RQb3NpdGlvbiE9PS0xKXtwcmVjaXNpb249dmFsdWVTdHJpbmcubGVuZ3RoLWRvdFBvc2l0aW9uLTE7fXJldHVybiBwcmVjaXNpb247fSxfaW5jcmVhc2U6ZnVuY3Rpb24gX2luY3JlYXNlKHZhbCxzdGVwKXtpZih0eXBlb2YgdmFsIT09J251bWJlcicmJnZhbCE9PXVuZGVmaW5lZClyZXR1cm4gdGhpcy5jdXJyZW50VmFsdWU7dmFyIHByZWNpc2lvbkZhY3Rvcj1NYXRoLnBvdygxMCx0aGlzLm51bVByZWNpc2lvbik7Ly8gU29sdmUgdGhlIGFjY3VyYWN5IHByb2JsZW0gb2YgSlMgZGVjaW1hbCBjYWxjdWxhdGlvbiBieSBjb252ZXJ0aW5nIHRoZSB2YWx1ZSB0byBpbnRlZ2VyLgpyZXR1cm4gdGhpcy50b1ByZWNpc2lvbigocHJlY2lzaW9uRmFjdG9yKnZhbCtwcmVjaXNpb25GYWN0b3Iqc3RlcCkvcHJlY2lzaW9uRmFjdG9yKTt9LF9kZWNyZWFzZTpmdW5jdGlvbiBfZGVjcmVhc2UodmFsLHN0ZXApe2lmKHR5cGVvZiB2YWwhPT0nbnVtYmVyJyYmdmFsIT09dW5kZWZpbmVkKXJldHVybiB0aGlzLmN1cnJlbnRWYWx1ZTt2YXIgcHJlY2lzaW9uRmFjdG9yPU1hdGgucG93KDEwLHRoaXMubnVtUHJlY2lzaW9uKTtyZXR1cm4gdGhpcy50b1ByZWNpc2lvbigocHJlY2lzaW9uRmFjdG9yKnZhbC1wcmVjaXNpb25GYWN0b3Iqc3RlcCkvcHJlY2lzaW9uRmFjdG9yKTt9LGluY3JlYXNlOmZ1bmN0aW9uIGluY3JlYXNlKCl7aWYodGhpcy5pbnB1dE51bWJlckRpc2FibGVkfHx0aGlzLm1heERpc2FibGVkKXJldHVybjt2YXIgdmFsdWU9dGhpcy52YWx1ZXx8MDt2YXIgbmV3VmFsPXRoaXMuX2luY3JlYXNlKHZhbHVlLHRoaXMuc3RlcCk7dGhpcy5zZXRDdXJyZW50VmFsdWUobmV3VmFsKTt9LGRlY3JlYXNlOmZ1bmN0aW9uIGRlY3JlYXNlKCl7aWYodGhpcy5pbnB1dE51bWJlckRpc2FibGVkfHx0aGlzLm1pbkRpc2FibGVkKXJldHVybjt2YXIgdmFsdWU9dGhpcy52YWx1ZXx8MDt2YXIgbmV3VmFsPXRoaXMuX2RlY3JlYXNlKHZhbHVlLHRoaXMuc3RlcCk7dGhpcy5zZXRDdXJyZW50VmFsdWUobmV3VmFsKTt9LGhhbmRsZUJsdXI6ZnVuY3Rpb24gaGFuZGxlQmx1cihldmVudCl7dGhpcy4kZW1pdCgnYmx1cicsZXZlbnQpO30saGFuZGxlRm9jdXM6ZnVuY3Rpb24gaGFuZGxlRm9jdXMoZXZlbnQpe3RoaXMuJGVtaXQoJ2ZvY3VzJyxldmVudCk7fSxzZXRDdXJyZW50VmFsdWU6ZnVuY3Rpb24gc2V0Q3VycmVudFZhbHVlKG5ld1ZhbCl7dmFyIG9sZFZhbD10aGlzLmN1cnJlbnRWYWx1ZTtpZih0eXBlb2YgbmV3VmFsPT09J251bWJlcicmJnRoaXMucHJlY2lzaW9uIT09dW5kZWZpbmVkKXtuZXdWYWw9dGhpcy50b1ByZWNpc2lvbihuZXdWYWwsdGhpcy5wcmVjaXNpb24pO31pZihuZXdWYWw+PXRoaXMubWF4KW5ld1ZhbD10aGlzLm1heDtpZihuZXdWYWw8PXRoaXMubWluKW5ld1ZhbD10aGlzLm1pbjtpZihvbGRWYWw9PT1uZXdWYWwpcmV0dXJuO3RoaXMudXNlcklucHV0PW51bGw7dGhpcy4kZW1pdCgnaW5wdXQnLG5ld1ZhbCk7dGhpcy4kZW1pdCgnY2hhbmdlJyxuZXdWYWwsb2xkVmFsKTt0aGlzLmN1cnJlbnRWYWx1ZT1uZXdWYWw7fSxoYW5kbGVJbnB1dDpmdW5jdGlvbiBoYW5kbGVJbnB1dCh2YWx1ZSl7dGhpcy51c2VySW5wdXQ9dmFsdWU7fSxoYW5kbGVJbnB1dENoYW5nZTpmdW5jdGlvbiBoYW5kbGVJbnB1dENoYW5nZSh2YWx1ZSl7dmFyIG5ld1ZhbD12YWx1ZT09PScnP3VuZGVmaW5lZDpOdW1iZXIodmFsdWUpO2lmKCFpc05hTihuZXdWYWwpfHx2YWx1ZT09PScnKXt0aGlzLnNldEN1cnJlbnRWYWx1ZShuZXdWYWwpO310aGlzLnVzZXJJbnB1dD1udWxsO30sc2VsZWN0OmZ1bmN0aW9uIHNlbGVjdCgpe3RoaXMuJHJlZnMuaW5wdXQuc2VsZWN0KCk7fX0sbW91bnRlZDpmdW5jdGlvbiBtb3VudGVkKCl7dmFyIGlubmVySW5wdXQ9dGhpcy4kcmVmcy5pbnB1dC4kcmVmcy5pbnB1dDtpbm5lcklucHV0LnNldEF0dHJpYnV0ZSgncm9sZScsJ3NwaW5idXR0b24nKTtpbm5lcklucHV0LnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW1heCcsdGhpcy5tYXgpO2lubmVySW5wdXQuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbWluJyx0aGlzLm1pbik7aW5uZXJJbnB1dC5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVub3cnLHRoaXMuY3VycmVudFZhbHVlKTtpbm5lcklucHV0LnNldEF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcsdGhpcy5pbnB1dE51bWJlckRpc2FibGVkKTt9LHVwZGF0ZWQ6ZnVuY3Rpb24gdXBkYXRlZCgpe2lmKCF0aGlzLiRyZWZzfHwhdGhpcy4kcmVmcy5pbnB1dClyZXR1cm47dmFyIGlubmVySW5wdXQ9dGhpcy4kcmVmcy5pbnB1dC4kcmVmcy5pbnB1dDtpbm5lcklucHV0LnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsdGhpcy5jdXJyZW50VmFsdWUpO319Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvaW5wdXQtbnVtYmVyL3NyYy9pbnB1dC1udW1iZXIudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHNyY19pbnB1dF9udW1iZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189aW5wdXRfbnVtYmVydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvaW5wdXQtbnVtYmVyL3NyYy9pbnB1dC1udW1iZXIudnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgaW5wdXRfbnVtYmVyX2NvbXBvbmVudD1ub3JtYWxpemVDb21wb25lbnQoc3JjX2lucHV0X251bWJlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxpbnB1dF9udW1iZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF80MmY4Y2Y2Nl9yZW5kZXIsaW5wdXRfbnVtYmVydnVlX3R5cGVfdGVtcGxhdGVfaWRfNDJmOGNmNjZfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciBpbnB1dF9udW1iZXJfYXBpO31pbnB1dF9udW1iZXJfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy9pbnB1dC1udW1iZXIvc3JjL2lucHV0LW51bWJlci52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgaW5wdXRfbnVtYmVyPWlucHV0X251bWJlcl9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2lucHV0LW51bWJlci9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL2lucHV0X251bWJlci5pbnN0YWxsPWZ1bmN0aW9uKFZ1ZSl7VnVlLmNvbXBvbmVudChpbnB1dF9udW1iZXIubmFtZSxpbnB1dF9udW1iZXIpO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYWNrYWdlc19pbnB1dF9udW1iZXI9aW5wdXRfbnVtYmVyOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvcmFkaW8vc3JjL3JhZGlvLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD02OWNkNjI2OCYKdmFyIHJhZGlvdnVlX3R5cGVfdGVtcGxhdGVfaWRfNjljZDYyNjhfcmVuZGVyPWZ1bmN0aW9uIHJhZGlvdnVlX3R5cGVfdGVtcGxhdGVfaWRfNjljZDYyNjhfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJsYWJlbCIse3N0YXRpY0NsYXNzOiJlbC1yYWRpbyIsY2xhc3M6W192bS5ib3JkZXImJl92bS5yYWRpb1NpemU/ImVsLXJhZGlvLS0iK192bS5yYWRpb1NpemU6IiIseyJpcy1kaXNhYmxlZCI6X3ZtLmlzRGlzYWJsZWR9LHsiaXMtZm9jdXMiOl92bS5mb2N1c30seyJpcy1ib3JkZXJlZCI6X3ZtLmJvcmRlcn0seyJpcy1jaGVja2VkIjpfdm0ubW9kZWw9PT1fdm0ubGFiZWx9XSxhdHRyczp7cm9sZToicmFkaW8iLCJhcmlhLWNoZWNrZWQiOl92bS5tb2RlbD09PV92bS5sYWJlbCwiYXJpYS1kaXNhYmxlZCI6X3ZtLmlzRGlzYWJsZWQsdGFiaW5kZXg6X3ZtLnRhYkluZGV4fSxvbjp7a2V5ZG93bjpmdW5jdGlvbiBrZXlkb3duKCRldmVudCl7aWYoISgiYnV0dG9uImluICRldmVudCkmJl92bS5faygkZXZlbnQua2V5Q29kZSwic3BhY2UiLDMyLCRldmVudC5rZXksWyIgIiwiU3BhY2ViYXIiXSkpe3JldHVybiBudWxsO30kZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7JGV2ZW50LnByZXZlbnREZWZhdWx0KCk7X3ZtLm1vZGVsPV92bS5pc0Rpc2FibGVkP192bS5tb2RlbDpfdm0ubGFiZWw7fX19LFtfYygic3BhbiIse3N0YXRpY0NsYXNzOiJlbC1yYWRpb19faW5wdXQiLGNsYXNzOnsiaXMtZGlzYWJsZWQiOl92bS5pc0Rpc2FibGVkLCJpcy1jaGVja2VkIjpfdm0ubW9kZWw9PT1fdm0ubGFiZWx9fSxbX2MoInNwYW4iLHtzdGF0aWNDbGFzczoiZWwtcmFkaW9fX2lubmVyIn0pLF9jKCJpbnB1dCIse2RpcmVjdGl2ZXM6W3tuYW1lOiJtb2RlbCIscmF3TmFtZToidi1tb2RlbCIsdmFsdWU6X3ZtLm1vZGVsLGV4cHJlc3Npb246Im1vZGVsIn1dLHJlZjoicmFkaW8iLHN0YXRpY0NsYXNzOiJlbC1yYWRpb19fb3JpZ2luYWwiLGF0dHJzOnt0eXBlOiJyYWRpbyIsImFyaWEtaGlkZGVuIjoidHJ1ZSIsbmFtZTpfdm0ubmFtZSxkaXNhYmxlZDpfdm0uaXNEaXNhYmxlZCx0YWJpbmRleDoiLTEifSxkb21Qcm9wczp7dmFsdWU6X3ZtLmxhYmVsLGNoZWNrZWQ6X3ZtLl9xKF92bS5tb2RlbCxfdm0ubGFiZWwpfSxvbjp7Zm9jdXM6ZnVuY3Rpb24gZm9jdXMoJGV2ZW50KXtfdm0uZm9jdXM9dHJ1ZTt9LGJsdXI6ZnVuY3Rpb24gYmx1cigkZXZlbnQpe192bS5mb2N1cz1mYWxzZTt9LGNoYW5nZTpbZnVuY3Rpb24oJGV2ZW50KXtfdm0ubW9kZWw9X3ZtLmxhYmVsO30sX3ZtLmhhbmRsZUNoYW5nZV19fSldKSxfYygic3BhbiIse3N0YXRpY0NsYXNzOiJlbC1yYWRpb19fbGFiZWwiLG9uOntrZXlkb3duOmZ1bmN0aW9uIGtleWRvd24oJGV2ZW50KXskZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7fX19LFtfdm0uX3QoImRlZmF1bHQiKSwhX3ZtLiRzbG90cy5kZWZhdWx0P1tfdm0uX3YoX3ZtLl9zKF92bS5sYWJlbCkpXTpfdm0uX2UoKV0sMildKTt9O3ZhciByYWRpb3Z1ZV90eXBlX3RlbXBsYXRlX2lkXzY5Y2Q2MjY4X3N0YXRpY1JlbmRlckZucz1bXTtyYWRpb3Z1ZV90eXBlX3RlbXBsYXRlX2lkXzY5Y2Q2MjY4X3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9yYWRpby9zcmMvcmFkaW8udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTY5Y2Q2MjY4JgovLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9yYWRpby9zcmMvcmFkaW8udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHJhZGlvdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbFJhZGlvJyxtaXhpbnM6W2VtaXR0ZXJfZGVmYXVsdC5hXSxpbmplY3Q6e2VsRm9ybTp7ZGVmYXVsdDonJ30sZWxGb3JtSXRlbTp7ZGVmYXVsdDonJ319LGNvbXBvbmVudE5hbWU6J0VsUmFkaW8nLHByb3BzOnt2YWx1ZTp7fSxsYWJlbDp7fSxkaXNhYmxlZDpCb29sZWFuLG5hbWU6U3RyaW5nLGJvcmRlcjpCb29sZWFuLHNpemU6U3RyaW5nfSxkYXRhOmZ1bmN0aW9uIGRhdGEoKXtyZXR1cm57Zm9jdXM6ZmFsc2V9O30sY29tcHV0ZWQ6e2lzR3JvdXA6ZnVuY3Rpb24gaXNHcm91cCgpe3ZhciBwYXJlbnQ9dGhpcy4kcGFyZW50O3doaWxlKHBhcmVudCl7aWYocGFyZW50LiRvcHRpb25zLmNvbXBvbmVudE5hbWUhPT0nRWxSYWRpb0dyb3VwJyl7cGFyZW50PXBhcmVudC4kcGFyZW50O31lbHNle3RoaXMuX3JhZGlvR3JvdXA9cGFyZW50O3JldHVybiB0cnVlO319cmV0dXJuIGZhbHNlO30sbW9kZWw6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5pc0dyb3VwP3RoaXMuX3JhZGlvR3JvdXAudmFsdWU6dGhpcy52YWx1ZTt9LHNldDpmdW5jdGlvbiBzZXQodmFsKXtpZih0aGlzLmlzR3JvdXApe3RoaXMuZGlzcGF0Y2goJ0VsUmFkaW9Hcm91cCcsJ2lucHV0JyxbdmFsXSk7fWVsc2V7dGhpcy4kZW1pdCgnaW5wdXQnLHZhbCk7fXRoaXMuJHJlZnMucmFkaW8mJih0aGlzLiRyZWZzLnJhZGlvLmNoZWNrZWQ9dGhpcy5tb2RlbD09PXRoaXMubGFiZWwpO319LF9lbEZvcm1JdGVtU2l6ZTpmdW5jdGlvbiBfZWxGb3JtSXRlbVNpemUoKXtyZXR1cm4odGhpcy5lbEZvcm1JdGVtfHx7fSkuZWxGb3JtSXRlbVNpemU7fSxyYWRpb1NpemU6ZnVuY3Rpb24gcmFkaW9TaXplKCl7dmFyIHRlbVJhZGlvU2l6ZT10aGlzLnNpemV8fHRoaXMuX2VsRm9ybUl0ZW1TaXplfHwodGhpcy4kRUxFTUVOVHx8e30pLnNpemU7cmV0dXJuIHRoaXMuaXNHcm91cD90aGlzLl9yYWRpb0dyb3VwLnJhZGlvR3JvdXBTaXplfHx0ZW1SYWRpb1NpemU6dGVtUmFkaW9TaXplO30saXNEaXNhYmxlZDpmdW5jdGlvbiBpc0Rpc2FibGVkKCl7cmV0dXJuIHRoaXMuaXNHcm91cD90aGlzLl9yYWRpb0dyb3VwLmRpc2FibGVkfHx0aGlzLmRpc2FibGVkfHwodGhpcy5lbEZvcm18fHt9KS5kaXNhYmxlZDp0aGlzLmRpc2FibGVkfHwodGhpcy5lbEZvcm18fHt9KS5kaXNhYmxlZDt9LHRhYkluZGV4OmZ1bmN0aW9uIHRhYkluZGV4KCl7cmV0dXJuIHRoaXMuaXNEaXNhYmxlZHx8dGhpcy5pc0dyb3VwJiZ0aGlzLm1vZGVsIT09dGhpcy5sYWJlbD8tMTowO319LG1ldGhvZHM6e2hhbmRsZUNoYW5nZTpmdW5jdGlvbiBoYW5kbGVDaGFuZ2UoKXt2YXIgX3RoaXM9dGhpczt0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe190aGlzLiRlbWl0KCdjaGFuZ2UnLF90aGlzLm1vZGVsKTtfdGhpcy5pc0dyb3VwJiZfdGhpcy5kaXNwYXRjaCgnRWxSYWRpb0dyb3VwJywnaGFuZGxlQ2hhbmdlJyxfdGhpcy5tb2RlbCk7fSk7fX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcmFkaW8vc3JjL3JhZGlvLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfcmFkaW92dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189cmFkaW92dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9yYWRpby9zcmMvcmFkaW8udnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgcmFkaW9fY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChzcmNfcmFkaW92dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18scmFkaW92dWVfdHlwZV90ZW1wbGF0ZV9pZF82OWNkNjI2OF9yZW5kZXIscmFkaW92dWVfdHlwZV90ZW1wbGF0ZV9pZF82OWNkNjI2OF9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIHJhZGlvX2FwaTt9cmFkaW9fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy9yYWRpby9zcmMvcmFkaW8udnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHNyY19yYWRpbz1yYWRpb19jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3JhZGlvL2luZGV4LmpzCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovc3JjX3JhZGlvLmluc3RhbGw9ZnVuY3Rpb24oVnVlKXtWdWUuY29tcG9uZW50KHNyY19yYWRpby5uYW1lLHNyY19yYWRpbyk7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX3JhZGlvPXNyY19yYWRpbzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3JhZGlvL3NyYy9yYWRpby1ncm91cC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9ODE4YTcwNGMmCnZhciByYWRpb19ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzgxOGE3MDRjX3JlbmRlcj1mdW5jdGlvbiByYWRpb19ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzgxOGE3MDRjX3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYyhfdm0uX2VsVGFnLHt0YWc6ImNvbXBvbmVudCIsc3RhdGljQ2xhc3M6ImVsLXJhZGlvLWdyb3VwIixhdHRyczp7cm9sZToicmFkaW9ncm91cCJ9LG9uOntrZXlkb3duOl92bS5oYW5kbGVLZXlkb3dufX0sW192bS5fdCgiZGVmYXVsdCIpXSwyKTt9O3ZhciByYWRpb19ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzgxOGE3MDRjX3N0YXRpY1JlbmRlckZucz1bXTtyYWRpb19ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzgxOGE3MDRjX3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9yYWRpby9zcmMvcmFkaW8tZ3JvdXAudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTgxOGE3MDRjJgovLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9yYWRpby9zcmMvcmFkaW8tZ3JvdXAudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwp2YXIga2V5Q29kZT1PYmplY3QuZnJlZXplKHtMRUZUOjM3LFVQOjM4LFJJR0hUOjM5LERPV046NDB9KTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHJhZGlvX2dyb3VwdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbFJhZGlvR3JvdXAnLGNvbXBvbmVudE5hbWU6J0VsUmFkaW9Hcm91cCcsaW5qZWN0OntlbEZvcm1JdGVtOntkZWZhdWx0OicnfX0sbWl4aW5zOltlbWl0dGVyX2RlZmF1bHQuYV0scHJvcHM6e3ZhbHVlOnt9LHNpemU6U3RyaW5nLGZpbGw6U3RyaW5nLHRleHRDb2xvcjpTdHJpbmcsZGlzYWJsZWQ6Qm9vbGVhbn0sY29tcHV0ZWQ6e19lbEZvcm1JdGVtU2l6ZTpmdW5jdGlvbiBfZWxGb3JtSXRlbVNpemUoKXtyZXR1cm4odGhpcy5lbEZvcm1JdGVtfHx7fSkuZWxGb3JtSXRlbVNpemU7fSxfZWxUYWc6ZnVuY3Rpb24gX2VsVGFnKCl7cmV0dXJuKHRoaXMuJHZub2RlLmRhdGF8fHt9KS50YWd8fCdkaXYnO30scmFkaW9Hcm91cFNpemU6ZnVuY3Rpb24gcmFkaW9Hcm91cFNpemUoKXtyZXR1cm4gdGhpcy5zaXplfHx0aGlzLl9lbEZvcm1JdGVtU2l6ZXx8KHRoaXMuJEVMRU1FTlR8fHt9KS5zaXplO319LGNyZWF0ZWQ6ZnVuY3Rpb24gY3JlYXRlZCgpe3ZhciBfdGhpcz10aGlzO3RoaXMuJG9uKCdoYW5kbGVDaGFuZ2UnLGZ1bmN0aW9uKHZhbHVlKXtfdGhpcy4kZW1pdCgnY2hhbmdlJyx2YWx1ZSk7fSk7fSxtb3VudGVkOmZ1bmN0aW9uIG1vdW50ZWQoKXsvLyDlvZNyYWRpb0dyb3Vw5rKh5pyJ6buY6K6k6YCJ6aG55pe277yM56ys5LiA5Liq5Y+v5Lul6YCJ5LitVGFi5a+86IiqCnZhciByYWRpb3M9dGhpcy4kZWwucXVlcnlTZWxlY3RvckFsbCgnW3R5cGU9cmFkaW9dJyk7dmFyIGZpcnN0TGFiZWw9dGhpcy4kZWwucXVlcnlTZWxlY3RvckFsbCgnW3JvbGU9cmFkaW9dJylbMF07aWYoIVtdLnNvbWUuY2FsbChyYWRpb3MsZnVuY3Rpb24ocmFkaW8pe3JldHVybiByYWRpby5jaGVja2VkO30pJiZmaXJzdExhYmVsKXtmaXJzdExhYmVsLnRhYkluZGV4PTA7fX0sbWV0aG9kczp7aGFuZGxlS2V5ZG93bjpmdW5jdGlvbiBoYW5kbGVLZXlkb3duKGUpey8vIOW3puWPs+S4iuS4i+aMiemUriDlj6/ku6XlnKhyYWRpb+e7hOWGheWIh+aNouS4jeWQjOmAiemhuQp2YXIgdGFyZ2V0PWUudGFyZ2V0O3ZhciBjbGFzc05hbWU9dGFyZ2V0Lm5vZGVOYW1lPT09J0lOUFVUJz8nW3R5cGU9cmFkaW9dJzonW3JvbGU9cmFkaW9dJzt2YXIgcmFkaW9zPXRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoY2xhc3NOYW1lKTt2YXIgbGVuZ3RoPXJhZGlvcy5sZW5ndGg7dmFyIGluZGV4PVtdLmluZGV4T2YuY2FsbChyYWRpb3MsdGFyZ2V0KTt2YXIgcm9sZVJhZGlvcz10aGlzLiRlbC5xdWVyeVNlbGVjdG9yQWxsKCdbcm9sZT1yYWRpb10nKTtzd2l0Y2goZS5rZXlDb2RlKXtjYXNlIGtleUNvZGUuTEVGVDpjYXNlIGtleUNvZGUuVVA6ZS5zdG9wUHJvcGFnYXRpb24oKTtlLnByZXZlbnREZWZhdWx0KCk7aWYoaW5kZXg9PT0wKXtyb2xlUmFkaW9zW2xlbmd0aC0xXS5jbGljaygpO3JvbGVSYWRpb3NbbGVuZ3RoLTFdLmZvY3VzKCk7fWVsc2V7cm9sZVJhZGlvc1tpbmRleC0xXS5jbGljaygpO3JvbGVSYWRpb3NbaW5kZXgtMV0uZm9jdXMoKTt9YnJlYWs7Y2FzZSBrZXlDb2RlLlJJR0hUOmNhc2Uga2V5Q29kZS5ET1dOOmlmKGluZGV4PT09bGVuZ3RoLTEpe2Uuc3RvcFByb3BhZ2F0aW9uKCk7ZS5wcmV2ZW50RGVmYXVsdCgpO3JvbGVSYWRpb3NbMF0uY2xpY2soKTtyb2xlUmFkaW9zWzBdLmZvY3VzKCk7fWVsc2V7cm9sZVJhZGlvc1tpbmRleCsxXS5jbGljaygpO3JvbGVSYWRpb3NbaW5kZXgrMV0uZm9jdXMoKTt9YnJlYWs7ZGVmYXVsdDpicmVhazt9fX0sd2F0Y2g6e3ZhbHVlOmZ1bmN0aW9uIHZhbHVlKF92YWx1ZSl7dGhpcy5kaXNwYXRjaCgnRWxGb3JtSXRlbScsJ2VsLmZvcm0uY2hhbmdlJyxbdGhpcy52YWx1ZV0pO319fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3JhZGlvL3NyYy9yYWRpby1ncm91cC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc3JjX3JhZGlvX2dyb3VwdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXJhZGlvX2dyb3VwdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcmFkaW8vc3JjL3JhZGlvLWdyb3VwLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIHJhZGlvX2dyb3VwX2NvbXBvbmVudD1ub3JtYWxpemVDb21wb25lbnQoc3JjX3JhZGlvX2dyb3VwdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLHJhZGlvX2dyb3VwdnVlX3R5cGVfdGVtcGxhdGVfaWRfODE4YTcwNGNfcmVuZGVyLHJhZGlvX2dyb3VwdnVlX3R5cGVfdGVtcGxhdGVfaWRfODE4YTcwNGNfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciByYWRpb19ncm91cF9hcGk7fXJhZGlvX2dyb3VwX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvcmFkaW8vc3JjL3JhZGlvLWdyb3VwLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciByYWRpb19ncm91cD1yYWRpb19ncm91cF9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3JhZGlvLWdyb3VwL2luZGV4LmpzCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovcmFkaW9fZ3JvdXAuaW5zdGFsbD1mdW5jdGlvbihWdWUpe1Z1ZS5jb21wb25lbnQocmFkaW9fZ3JvdXAubmFtZSxyYWRpb19ncm91cCk7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX3JhZGlvX2dyb3VwPXJhZGlvX2dyb3VwOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvcmFkaW8vc3JjL3JhZGlvLWJ1dHRvbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MThhNzdhMzImCnZhciByYWRpb19idXR0b252dWVfdHlwZV90ZW1wbGF0ZV9pZF8xOGE3N2EzMl9yZW5kZXI9ZnVuY3Rpb24gcmFkaW9fYnV0dG9udnVlX3R5cGVfdGVtcGxhdGVfaWRfMThhNzdhMzJfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJsYWJlbCIse3N0YXRpY0NsYXNzOiJlbC1yYWRpby1idXR0b24iLGNsYXNzOltfdm0uc2l6ZT8iZWwtcmFkaW8tYnV0dG9uLS0iK192bS5zaXplOiIiLHsiaXMtYWN0aXZlIjpfdm0udmFsdWU9PT1fdm0ubGFiZWx9LHsiaXMtZGlzYWJsZWQiOl92bS5pc0Rpc2FibGVkfSx7ImlzLWZvY3VzIjpfdm0uZm9jdXN9XSxhdHRyczp7cm9sZToicmFkaW8iLCJhcmlhLWNoZWNrZWQiOl92bS52YWx1ZT09PV92bS5sYWJlbCwiYXJpYS1kaXNhYmxlZCI6X3ZtLmlzRGlzYWJsZWQsdGFiaW5kZXg6X3ZtLnRhYkluZGV4fSxvbjp7a2V5ZG93bjpmdW5jdGlvbiBrZXlkb3duKCRldmVudCl7aWYoISgiYnV0dG9uImluICRldmVudCkmJl92bS5faygkZXZlbnQua2V5Q29kZSwic3BhY2UiLDMyLCRldmVudC5rZXksWyIgIiwiU3BhY2ViYXIiXSkpe3JldHVybiBudWxsO30kZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7JGV2ZW50LnByZXZlbnREZWZhdWx0KCk7X3ZtLnZhbHVlPV92bS5pc0Rpc2FibGVkP192bS52YWx1ZTpfdm0ubGFiZWw7fX19LFtfYygiaW5wdXQiLHtkaXJlY3RpdmVzOlt7bmFtZToibW9kZWwiLHJhd05hbWU6InYtbW9kZWwiLHZhbHVlOl92bS52YWx1ZSxleHByZXNzaW9uOiJ2YWx1ZSJ9XSxzdGF0aWNDbGFzczoiZWwtcmFkaW8tYnV0dG9uX19vcmlnLXJhZGlvIixhdHRyczp7dHlwZToicmFkaW8iLG5hbWU6X3ZtLm5hbWUsZGlzYWJsZWQ6X3ZtLmlzRGlzYWJsZWQsdGFiaW5kZXg6Ii0xIn0sZG9tUHJvcHM6e3ZhbHVlOl92bS5sYWJlbCxjaGVja2VkOl92bS5fcShfdm0udmFsdWUsX3ZtLmxhYmVsKX0sb246e2NoYW5nZTpbZnVuY3Rpb24oJGV2ZW50KXtfdm0udmFsdWU9X3ZtLmxhYmVsO30sX3ZtLmhhbmRsZUNoYW5nZV0sZm9jdXM6ZnVuY3Rpb24gZm9jdXMoJGV2ZW50KXtfdm0uZm9jdXM9dHJ1ZTt9LGJsdXI6ZnVuY3Rpb24gYmx1cigkZXZlbnQpe192bS5mb2N1cz1mYWxzZTt9fX0pLF9jKCJzcGFuIix7c3RhdGljQ2xhc3M6ImVsLXJhZGlvLWJ1dHRvbl9faW5uZXIiLHN0eWxlOl92bS52YWx1ZT09PV92bS5sYWJlbD9fdm0uYWN0aXZlU3R5bGU6bnVsbCxvbjp7a2V5ZG93bjpmdW5jdGlvbiBrZXlkb3duKCRldmVudCl7JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO319fSxbX3ZtLl90KCJkZWZhdWx0IiksIV92bS4kc2xvdHMuZGVmYXVsdD9bX3ZtLl92KF92bS5fcyhfdm0ubGFiZWwpKV06X3ZtLl9lKCldLDIpXSk7fTt2YXIgcmFkaW9fYnV0dG9udnVlX3R5cGVfdGVtcGxhdGVfaWRfMThhNzdhMzJfc3RhdGljUmVuZGVyRm5zPVtdO3JhZGlvX2J1dHRvbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzE4YTc3YTMyX3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9yYWRpby9zcmMvcmFkaW8tYnV0dG9uLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0xOGE3N2EzMiYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvcmFkaW8vc3JjL3JhZGlvLWJ1dHRvbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcmFkaW9fYnV0dG9udnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbFJhZGlvQnV0dG9uJyxtaXhpbnM6W2VtaXR0ZXJfZGVmYXVsdC5hXSxpbmplY3Q6e2VsRm9ybTp7ZGVmYXVsdDonJ30sZWxGb3JtSXRlbTp7ZGVmYXVsdDonJ319LHByb3BzOntsYWJlbDp7fSxkaXNhYmxlZDpCb29sZWFuLG5hbWU6U3RyaW5nfSxkYXRhOmZ1bmN0aW9uIGRhdGEoKXtyZXR1cm57Zm9jdXM6ZmFsc2V9O30sY29tcHV0ZWQ6e3ZhbHVlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX3JhZGlvR3JvdXAudmFsdWU7fSxzZXQ6ZnVuY3Rpb24gc2V0KHZhbHVlKXt0aGlzLl9yYWRpb0dyb3VwLiRlbWl0KCdpbnB1dCcsdmFsdWUpO319LF9yYWRpb0dyb3VwOmZ1bmN0aW9uIF9yYWRpb0dyb3VwKCl7dmFyIHBhcmVudD10aGlzLiRwYXJlbnQ7d2hpbGUocGFyZW50KXtpZihwYXJlbnQuJG9wdGlvbnMuY29tcG9uZW50TmFtZSE9PSdFbFJhZGlvR3JvdXAnKXtwYXJlbnQ9cGFyZW50LiRwYXJlbnQ7fWVsc2V7cmV0dXJuIHBhcmVudDt9fXJldHVybiBmYWxzZTt9LGFjdGl2ZVN0eWxlOmZ1bmN0aW9uIGFjdGl2ZVN0eWxlKCl7cmV0dXJue2JhY2tncm91bmRDb2xvcjp0aGlzLl9yYWRpb0dyb3VwLmZpbGx8fCcnLGJvcmRlckNvbG9yOnRoaXMuX3JhZGlvR3JvdXAuZmlsbHx8JycsYm94U2hhZG93OnRoaXMuX3JhZGlvR3JvdXAuZmlsbD8nLTFweCAwIDAgMCAnK3RoaXMuX3JhZGlvR3JvdXAuZmlsbDonJyxjb2xvcjp0aGlzLl9yYWRpb0dyb3VwLnRleHRDb2xvcnx8Jyd9O30sX2VsRm9ybUl0ZW1TaXplOmZ1bmN0aW9uIF9lbEZvcm1JdGVtU2l6ZSgpe3JldHVybih0aGlzLmVsRm9ybUl0ZW18fHt9KS5lbEZvcm1JdGVtU2l6ZTt9LHNpemU6ZnVuY3Rpb24gc2l6ZSgpe3JldHVybiB0aGlzLl9yYWRpb0dyb3VwLnJhZGlvR3JvdXBTaXplfHx0aGlzLl9lbEZvcm1JdGVtU2l6ZXx8KHRoaXMuJEVMRU1FTlR8fHt9KS5zaXplO30saXNEaXNhYmxlZDpmdW5jdGlvbiBpc0Rpc2FibGVkKCl7cmV0dXJuIHRoaXMuZGlzYWJsZWR8fHRoaXMuX3JhZGlvR3JvdXAuZGlzYWJsZWR8fCh0aGlzLmVsRm9ybXx8e30pLmRpc2FibGVkO30sdGFiSW5kZXg6ZnVuY3Rpb24gdGFiSW5kZXgoKXtyZXR1cm4gdGhpcy5pc0Rpc2FibGVkfHx0aGlzLl9yYWRpb0dyb3VwJiZ0aGlzLnZhbHVlIT09dGhpcy5sYWJlbD8tMTowO319LG1ldGhvZHM6e2hhbmRsZUNoYW5nZTpmdW5jdGlvbiBoYW5kbGVDaGFuZ2UoKXt2YXIgX3RoaXM9dGhpczt0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe190aGlzLmRpc3BhdGNoKCdFbFJhZGlvR3JvdXAnLCdoYW5kbGVDaGFuZ2UnLF90aGlzLnZhbHVlKTt9KTt9fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9yYWRpby9zcmMvcmFkaW8tYnV0dG9uLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfcmFkaW9fYnV0dG9udnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXJhZGlvX2J1dHRvbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3JhZGlvL3NyYy9yYWRpby1idXR0b24udnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgcmFkaW9fYnV0dG9uX2NvbXBvbmVudD1ub3JtYWxpemVDb21wb25lbnQoc3JjX3JhZGlvX2J1dHRvbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxyYWRpb19idXR0b252dWVfdHlwZV90ZW1wbGF0ZV9pZF8xOGE3N2EzMl9yZW5kZXIscmFkaW9fYnV0dG9udnVlX3R5cGVfdGVtcGxhdGVfaWRfMThhNzdhMzJfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciByYWRpb19idXR0b25fYXBpO31yYWRpb19idXR0b25fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy9yYWRpby9zcmMvcmFkaW8tYnV0dG9uLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciByYWRpb19idXR0b249cmFkaW9fYnV0dG9uX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcmFkaW8tYnV0dG9uL2luZGV4LmpzCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovcmFkaW9fYnV0dG9uLmluc3RhbGw9ZnVuY3Rpb24oVnVlKXtWdWUuY29tcG9uZW50KHJhZGlvX2J1dHRvbi5uYW1lLHJhZGlvX2J1dHRvbik7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX3JhZGlvX2J1dHRvbj1yYWRpb19idXR0b247Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jaGVja2JveC9zcmMvY2hlY2tib3gudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWQwMzg3MDc0Jgp2YXIgY2hlY2tib3h2dWVfdHlwZV90ZW1wbGF0ZV9pZF9kMDM4NzA3NF9yZW5kZXI9ZnVuY3Rpb24gY2hlY2tib3h2dWVfdHlwZV90ZW1wbGF0ZV9pZF9kMDM4NzA3NF9yZW5kZXIoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDt2YXIgX2M9X3ZtLl9zZWxmLl9jfHxfaDtyZXR1cm4gX2MoImxhYmVsIix7c3RhdGljQ2xhc3M6ImVsLWNoZWNrYm94IixjbGFzczpbX3ZtLmJvcmRlciYmX3ZtLmNoZWNrYm94U2l6ZT8iZWwtY2hlY2tib3gtLSIrX3ZtLmNoZWNrYm94U2l6ZToiIix7ImlzLWRpc2FibGVkIjpfdm0uaXNEaXNhYmxlZH0seyJpcy1ib3JkZXJlZCI6X3ZtLmJvcmRlcn0seyJpcy1jaGVja2VkIjpfdm0uaXNDaGVja2VkfV0sYXR0cnM6e2lkOl92bS5pZH19LFtfYygic3BhbiIse3N0YXRpY0NsYXNzOiJlbC1jaGVja2JveF9faW5wdXQiLGNsYXNzOnsiaXMtZGlzYWJsZWQiOl92bS5pc0Rpc2FibGVkLCJpcy1jaGVja2VkIjpfdm0uaXNDaGVja2VkLCJpcy1pbmRldGVybWluYXRlIjpfdm0uaW5kZXRlcm1pbmF0ZSwiaXMtZm9jdXMiOl92bS5mb2N1c30sYXR0cnM6e3RhYmluZGV4Ol92bS5pbmRldGVybWluYXRlPzA6ZmFsc2Uscm9sZTpfdm0uaW5kZXRlcm1pbmF0ZT8iY2hlY2tib3giOmZhbHNlLCJhcmlhLWNoZWNrZWQiOl92bS5pbmRldGVybWluYXRlPyJtaXhlZCI6ZmFsc2V9fSxbX2MoInNwYW4iLHtzdGF0aWNDbGFzczoiZWwtY2hlY2tib3hfX2lubmVyIn0pLF92bS50cnVlTGFiZWx8fF92bS5mYWxzZUxhYmVsP19jKCJpbnB1dCIse2RpcmVjdGl2ZXM6W3tuYW1lOiJtb2RlbCIscmF3TmFtZToidi1tb2RlbCIsdmFsdWU6X3ZtLm1vZGVsLGV4cHJlc3Npb246Im1vZGVsIn1dLHN0YXRpY0NsYXNzOiJlbC1jaGVja2JveF9fb3JpZ2luYWwiLGF0dHJzOnt0eXBlOiJjaGVja2JveCIsImFyaWEtaGlkZGVuIjpfdm0uaW5kZXRlcm1pbmF0ZT8idHJ1ZSI6ImZhbHNlIixuYW1lOl92bS5uYW1lLGRpc2FibGVkOl92bS5pc0Rpc2FibGVkLCJ0cnVlLXZhbHVlIjpfdm0udHJ1ZUxhYmVsLCJmYWxzZS12YWx1ZSI6X3ZtLmZhbHNlTGFiZWx9LGRvbVByb3BzOntjaGVja2VkOkFycmF5LmlzQXJyYXkoX3ZtLm1vZGVsKT9fdm0uX2koX3ZtLm1vZGVsLG51bGwpPi0xOl92bS5fcShfdm0ubW9kZWwsX3ZtLnRydWVMYWJlbCl9LG9uOntjaGFuZ2U6W2Z1bmN0aW9uKCRldmVudCl7dmFyICQkYT1fdm0ubW9kZWwsJCRlbD0kZXZlbnQudGFyZ2V0LCQkYz0kJGVsLmNoZWNrZWQ/X3ZtLnRydWVMYWJlbDpfdm0uZmFsc2VMYWJlbDtpZihBcnJheS5pc0FycmF5KCQkYSkpe3ZhciAkJHY9bnVsbCwkJGk9X3ZtLl9pKCQkYSwkJHYpO2lmKCQkZWwuY2hlY2tlZCl7JCRpPDAmJihfdm0ubW9kZWw9JCRhLmNvbmNhdChbJCR2XSkpO31lbHNleyQkaT4tMSYmKF92bS5tb2RlbD0kJGEuc2xpY2UoMCwkJGkpLmNvbmNhdCgkJGEuc2xpY2UoJCRpKzEpKSk7fX1lbHNle192bS5tb2RlbD0kJGM7fX0sX3ZtLmhhbmRsZUNoYW5nZV0sZm9jdXM6ZnVuY3Rpb24gZm9jdXMoJGV2ZW50KXtfdm0uZm9jdXM9dHJ1ZTt9LGJsdXI6ZnVuY3Rpb24gYmx1cigkZXZlbnQpe192bS5mb2N1cz1mYWxzZTt9fX0pOl9jKCJpbnB1dCIse2RpcmVjdGl2ZXM6W3tuYW1lOiJtb2RlbCIscmF3TmFtZToidi1tb2RlbCIsdmFsdWU6X3ZtLm1vZGVsLGV4cHJlc3Npb246Im1vZGVsIn1dLHN0YXRpY0NsYXNzOiJlbC1jaGVja2JveF9fb3JpZ2luYWwiLGF0dHJzOnt0eXBlOiJjaGVja2JveCIsImFyaWEtaGlkZGVuIjpfdm0uaW5kZXRlcm1pbmF0ZT8idHJ1ZSI6ImZhbHNlIixkaXNhYmxlZDpfdm0uaXNEaXNhYmxlZCxuYW1lOl92bS5uYW1lfSxkb21Qcm9wczp7dmFsdWU6X3ZtLmxhYmVsLGNoZWNrZWQ6QXJyYXkuaXNBcnJheShfdm0ubW9kZWwpP192bS5faShfdm0ubW9kZWwsX3ZtLmxhYmVsKT4tMTpfdm0ubW9kZWx9LG9uOntjaGFuZ2U6W2Z1bmN0aW9uKCRldmVudCl7dmFyICQkYT1fdm0ubW9kZWwsJCRlbD0kZXZlbnQudGFyZ2V0LCQkYz0kJGVsLmNoZWNrZWQ/dHJ1ZTpmYWxzZTtpZihBcnJheS5pc0FycmF5KCQkYSkpe3ZhciAkJHY9X3ZtLmxhYmVsLCQkaT1fdm0uX2koJCRhLCQkdik7aWYoJCRlbC5jaGVja2VkKXskJGk8MCYmKF92bS5tb2RlbD0kJGEuY29uY2F0KFskJHZdKSk7fWVsc2V7JCRpPi0xJiYoX3ZtLm1vZGVsPSQkYS5zbGljZSgwLCQkaSkuY29uY2F0KCQkYS5zbGljZSgkJGkrMSkpKTt9fWVsc2V7X3ZtLm1vZGVsPSQkYzt9fSxfdm0uaGFuZGxlQ2hhbmdlXSxmb2N1czpmdW5jdGlvbiBmb2N1cygkZXZlbnQpe192bS5mb2N1cz10cnVlO30sYmx1cjpmdW5jdGlvbiBibHVyKCRldmVudCl7X3ZtLmZvY3VzPWZhbHNlO319fSldKSxfdm0uJHNsb3RzLmRlZmF1bHR8fF92bS5sYWJlbD9fYygic3BhbiIse3N0YXRpY0NsYXNzOiJlbC1jaGVja2JveF9fbGFiZWwifSxbX3ZtLl90KCJkZWZhdWx0IiksIV92bS4kc2xvdHMuZGVmYXVsdD9bX3ZtLl92KF92bS5fcyhfdm0ubGFiZWwpKV06X3ZtLl9lKCldLDIpOl92bS5fZSgpXSk7fTt2YXIgY2hlY2tib3h2dWVfdHlwZV90ZW1wbGF0ZV9pZF9kMDM4NzA3NF9zdGF0aWNSZW5kZXJGbnM9W107Y2hlY2tib3h2dWVfdHlwZV90ZW1wbGF0ZV9pZF9kMDM4NzA3NF9yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2hlY2tib3gvc3JjL2NoZWNrYm94LnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD1kMDM4NzA3NCYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY2hlY2tib3gvc3JjL2NoZWNrYm94LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBjaGVja2JveHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17bmFtZTonRWxDaGVja2JveCcsbWl4aW5zOltlbWl0dGVyX2RlZmF1bHQuYV0saW5qZWN0OntlbEZvcm06e2RlZmF1bHQ6Jyd9LGVsRm9ybUl0ZW06e2RlZmF1bHQ6Jyd9fSxjb21wb25lbnROYW1lOidFbENoZWNrYm94JyxkYXRhOmZ1bmN0aW9uIGRhdGEoKXtyZXR1cm57c2VsZk1vZGVsOmZhbHNlLGZvY3VzOmZhbHNlLGlzTGltaXRFeGNlZWRlZDpmYWxzZX07fSxjb21wdXRlZDp7bW9kZWw6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5pc0dyb3VwP3RoaXMuc3RvcmU6dGhpcy52YWx1ZSE9PXVuZGVmaW5lZD90aGlzLnZhbHVlOnRoaXMuc2VsZk1vZGVsO30sc2V0OmZ1bmN0aW9uIHNldCh2YWwpe2lmKHRoaXMuaXNHcm91cCl7dGhpcy5pc0xpbWl0RXhjZWVkZWQ9ZmFsc2U7dGhpcy5fY2hlY2tib3hHcm91cC5taW4hPT11bmRlZmluZWQmJnZhbC5sZW5ndGg8dGhpcy5fY2hlY2tib3hHcm91cC5taW4mJih0aGlzLmlzTGltaXRFeGNlZWRlZD10cnVlKTt0aGlzLl9jaGVja2JveEdyb3VwLm1heCE9PXVuZGVmaW5lZCYmdmFsLmxlbmd0aD50aGlzLl9jaGVja2JveEdyb3VwLm1heCYmKHRoaXMuaXNMaW1pdEV4Y2VlZGVkPXRydWUpO3RoaXMuaXNMaW1pdEV4Y2VlZGVkPT09ZmFsc2UmJnRoaXMuZGlzcGF0Y2goJ0VsQ2hlY2tib3hHcm91cCcsJ2lucHV0JyxbdmFsXSk7fWVsc2V7dGhpcy4kZW1pdCgnaW5wdXQnLHZhbCk7dGhpcy5zZWxmTW9kZWw9dmFsO319fSxpc0NoZWNrZWQ6ZnVuY3Rpb24gaXNDaGVja2VkKCl7aWYoe30udG9TdHJpbmcuY2FsbCh0aGlzLm1vZGVsKT09PSdbb2JqZWN0IEJvb2xlYW5dJyl7cmV0dXJuIHRoaXMubW9kZWw7fWVsc2UgaWYoQXJyYXkuaXNBcnJheSh0aGlzLm1vZGVsKSl7cmV0dXJuIHRoaXMubW9kZWwuaW5kZXhPZih0aGlzLmxhYmVsKT4tMTt9ZWxzZSBpZih0aGlzLm1vZGVsIT09bnVsbCYmdGhpcy5tb2RlbCE9PXVuZGVmaW5lZCl7cmV0dXJuIHRoaXMubW9kZWw9PT10aGlzLnRydWVMYWJlbDt9fSxpc0dyb3VwOmZ1bmN0aW9uIGlzR3JvdXAoKXt2YXIgcGFyZW50PXRoaXMuJHBhcmVudDt3aGlsZShwYXJlbnQpe2lmKHBhcmVudC4kb3B0aW9ucy5jb21wb25lbnROYW1lIT09J0VsQ2hlY2tib3hHcm91cCcpe3BhcmVudD1wYXJlbnQuJHBhcmVudDt9ZWxzZXt0aGlzLl9jaGVja2JveEdyb3VwPXBhcmVudDtyZXR1cm4gdHJ1ZTt9fXJldHVybiBmYWxzZTt9LHN0b3JlOmZ1bmN0aW9uIHN0b3JlKCl7cmV0dXJuIHRoaXMuX2NoZWNrYm94R3JvdXA/dGhpcy5fY2hlY2tib3hHcm91cC52YWx1ZTp0aGlzLnZhbHVlO30sLyogdXNlZCB0byBtYWtlIHRoZSBpc0Rpc2FibGVkIGp1ZGdtZW50IHVuZGVyIG1heC9taW4gcHJvcHMgKi9pc0xpbWl0RGlzYWJsZWQ6ZnVuY3Rpb24gaXNMaW1pdERpc2FibGVkKCl7dmFyIF9jaGVja2JveEdyb3VwPXRoaXMuX2NoZWNrYm94R3JvdXAsbWF4PV9jaGVja2JveEdyb3VwLm1heCxtaW49X2NoZWNrYm94R3JvdXAubWluO3JldHVybiEhKG1heHx8bWluKSYmdGhpcy5tb2RlbC5sZW5ndGg+PW1heCYmIXRoaXMuaXNDaGVja2VkfHx0aGlzLm1vZGVsLmxlbmd0aDw9bWluJiZ0aGlzLmlzQ2hlY2tlZDt9LGlzRGlzYWJsZWQ6ZnVuY3Rpb24gaXNEaXNhYmxlZCgpe3JldHVybiB0aGlzLmlzR3JvdXA/dGhpcy5fY2hlY2tib3hHcm91cC5kaXNhYmxlZHx8dGhpcy5kaXNhYmxlZHx8KHRoaXMuZWxGb3JtfHx7fSkuZGlzYWJsZWR8fHRoaXMuaXNMaW1pdERpc2FibGVkOnRoaXMuZGlzYWJsZWR8fCh0aGlzLmVsRm9ybXx8e30pLmRpc2FibGVkO30sX2VsRm9ybUl0ZW1TaXplOmZ1bmN0aW9uIF9lbEZvcm1JdGVtU2l6ZSgpe3JldHVybih0aGlzLmVsRm9ybUl0ZW18fHt9KS5lbEZvcm1JdGVtU2l6ZTt9LGNoZWNrYm94U2l6ZTpmdW5jdGlvbiBjaGVja2JveFNpemUoKXt2YXIgdGVtQ2hlY2tib3hTaXplPXRoaXMuc2l6ZXx8dGhpcy5fZWxGb3JtSXRlbVNpemV8fCh0aGlzLiRFTEVNRU5UfHx7fSkuc2l6ZTtyZXR1cm4gdGhpcy5pc0dyb3VwP3RoaXMuX2NoZWNrYm94R3JvdXAuY2hlY2tib3hHcm91cFNpemV8fHRlbUNoZWNrYm94U2l6ZTp0ZW1DaGVja2JveFNpemU7fX0scHJvcHM6e3ZhbHVlOnt9LGxhYmVsOnt9LGluZGV0ZXJtaW5hdGU6Qm9vbGVhbixkaXNhYmxlZDpCb29sZWFuLGNoZWNrZWQ6Qm9vbGVhbixuYW1lOlN0cmluZyx0cnVlTGFiZWw6W1N0cmluZyxOdW1iZXJdLGZhbHNlTGFiZWw6W1N0cmluZyxOdW1iZXJdLGlkOlN0cmluZywvKiDlvZNpbmRldGVybWluYXRl5Li655yf5pe277yM5Li6Y29udHJvbHPmj5Dkvpvnm7jlhbPov57nmoRjaGVja2JveOeahGlk77yM6KGo5piO5YWD57Sg6Ze055qE5o6n5Yi25YWz57O7Ki9jb250cm9sczpTdHJpbmcsLyog5b2TaW5kZXRlcm1pbmF0ZeS4uuecn+aXtu+8jOS4umNvbnRyb2xz5o+Q5L6b55u45YWz6L+e55qEY2hlY2tib3jnmoRpZO+8jOihqOaYjuWFg+e0oOmXtOeahOaOp+WItuWFs+ezuyovYm9yZGVyOkJvb2xlYW4sc2l6ZTpTdHJpbmd9LG1ldGhvZHM6e2FkZFRvU3RvcmU6ZnVuY3Rpb24gYWRkVG9TdG9yZSgpe2lmKEFycmF5LmlzQXJyYXkodGhpcy5tb2RlbCkmJnRoaXMubW9kZWwuaW5kZXhPZih0aGlzLmxhYmVsKT09PS0xKXt0aGlzLm1vZGVsLnB1c2godGhpcy5sYWJlbCk7fWVsc2V7dGhpcy5tb2RlbD10aGlzLnRydWVMYWJlbHx8dHJ1ZTt9fSxoYW5kbGVDaGFuZ2U6ZnVuY3Rpb24gaGFuZGxlQ2hhbmdlKGV2KXt2YXIgX3RoaXM9dGhpcztpZih0aGlzLmlzTGltaXRFeGNlZWRlZClyZXR1cm47dmFyIHZhbHVlPXZvaWQgMDtpZihldi50YXJnZXQuY2hlY2tlZCl7dmFsdWU9dGhpcy50cnVlTGFiZWw9PT11bmRlZmluZWQ/dHJ1ZTp0aGlzLnRydWVMYWJlbDt9ZWxzZXt2YWx1ZT10aGlzLmZhbHNlTGFiZWw9PT11bmRlZmluZWQ/ZmFsc2U6dGhpcy5mYWxzZUxhYmVsO310aGlzLiRlbWl0KCdjaGFuZ2UnLHZhbHVlLGV2KTt0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe2lmKF90aGlzLmlzR3JvdXApe190aGlzLmRpc3BhdGNoKCdFbENoZWNrYm94R3JvdXAnLCdjaGFuZ2UnLFtfdGhpcy5fY2hlY2tib3hHcm91cC52YWx1ZV0pO319KTt9fSxjcmVhdGVkOmZ1bmN0aW9uIGNyZWF0ZWQoKXt0aGlzLmNoZWNrZWQmJnRoaXMuYWRkVG9TdG9yZSgpO30sbW91bnRlZDpmdW5jdGlvbiBtb3VudGVkKCl7Ly8g5Li6aW5kZXRlcm1pbmF0ZeWFg+e0oCDmt7vliqBhcmlhLWNvbnRyb2xzIOWxnuaApwppZih0aGlzLmluZGV0ZXJtaW5hdGUpe3RoaXMuJGVsLnNldEF0dHJpYnV0ZSgnYXJpYS1jb250cm9scycsdGhpcy5jb250cm9scyk7fX0sd2F0Y2g6e3ZhbHVlOmZ1bmN0aW9uIHZhbHVlKF92YWx1ZSl7dGhpcy5kaXNwYXRjaCgnRWxGb3JtSXRlbScsJ2VsLmZvcm0uY2hhbmdlJyxfdmFsdWUpO319fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NoZWNrYm94L3NyYy9jaGVja2JveC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc3JjX2NoZWNrYm94dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPWNoZWNrYm94dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2hlY2tib3gvc3JjL2NoZWNrYm94LnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIGNoZWNrYm94X2NvbXBvbmVudD1ub3JtYWxpemVDb21wb25lbnQoc3JjX2NoZWNrYm94dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLGNoZWNrYm94dnVlX3R5cGVfdGVtcGxhdGVfaWRfZDAzODcwNzRfcmVuZGVyLGNoZWNrYm94dnVlX3R5cGVfdGVtcGxhdGVfaWRfZDAzODcwNzRfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciBjaGVja2JveF9hcGk7fWNoZWNrYm94X2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvY2hlY2tib3gvc3JjL2NoZWNrYm94LnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfY2hlY2tib3g9Y2hlY2tib3hfY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jaGVja2JveC9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL3NyY19jaGVja2JveC5pbnN0YWxsPWZ1bmN0aW9uKFZ1ZSl7VnVlLmNvbXBvbmVudChzcmNfY2hlY2tib3gubmFtZSxzcmNfY2hlY2tib3gpO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYWNrYWdlc19jaGVja2JveD1zcmNfY2hlY2tib3g7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jaGVja2JveC9zcmMvY2hlY2tib3gtYnV0dG9uLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD00NzhlOTA2ZSYKdmFyIGNoZWNrYm94X2J1dHRvbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQ3OGU5MDZlX3JlbmRlcj1mdW5jdGlvbiBjaGVja2JveF9idXR0b252dWVfdHlwZV90ZW1wbGF0ZV9pZF80NzhlOTA2ZV9yZW5kZXIoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDt2YXIgX2M9X3ZtLl9zZWxmLl9jfHxfaDtyZXR1cm4gX2MoImxhYmVsIix7c3RhdGljQ2xhc3M6ImVsLWNoZWNrYm94LWJ1dHRvbiIsY2xhc3M6W192bS5zaXplPyJlbC1jaGVja2JveC1idXR0b24tLSIrX3ZtLnNpemU6IiIseyJpcy1kaXNhYmxlZCI6X3ZtLmlzRGlzYWJsZWR9LHsiaXMtY2hlY2tlZCI6X3ZtLmlzQ2hlY2tlZH0seyJpcy1mb2N1cyI6X3ZtLmZvY3VzfV0sYXR0cnM6e3JvbGU6ImNoZWNrYm94IiwiYXJpYS1jaGVja2VkIjpfdm0uaXNDaGVja2VkLCJhcmlhLWRpc2FibGVkIjpfdm0uaXNEaXNhYmxlZH19LFtfdm0udHJ1ZUxhYmVsfHxfdm0uZmFsc2VMYWJlbD9fYygiaW5wdXQiLHtkaXJlY3RpdmVzOlt7bmFtZToibW9kZWwiLHJhd05hbWU6InYtbW9kZWwiLHZhbHVlOl92bS5tb2RlbCxleHByZXNzaW9uOiJtb2RlbCJ9XSxzdGF0aWNDbGFzczoiZWwtY2hlY2tib3gtYnV0dG9uX19vcmlnaW5hbCIsYXR0cnM6e3R5cGU6ImNoZWNrYm94IixuYW1lOl92bS5uYW1lLGRpc2FibGVkOl92bS5pc0Rpc2FibGVkLCJ0cnVlLXZhbHVlIjpfdm0udHJ1ZUxhYmVsLCJmYWxzZS12YWx1ZSI6X3ZtLmZhbHNlTGFiZWx9LGRvbVByb3BzOntjaGVja2VkOkFycmF5LmlzQXJyYXkoX3ZtLm1vZGVsKT9fdm0uX2koX3ZtLm1vZGVsLG51bGwpPi0xOl92bS5fcShfdm0ubW9kZWwsX3ZtLnRydWVMYWJlbCl9LG9uOntjaGFuZ2U6W2Z1bmN0aW9uKCRldmVudCl7dmFyICQkYT1fdm0ubW9kZWwsJCRlbD0kZXZlbnQudGFyZ2V0LCQkYz0kJGVsLmNoZWNrZWQ/X3ZtLnRydWVMYWJlbDpfdm0uZmFsc2VMYWJlbDtpZihBcnJheS5pc0FycmF5KCQkYSkpe3ZhciAkJHY9bnVsbCwkJGk9X3ZtLl9pKCQkYSwkJHYpO2lmKCQkZWwuY2hlY2tlZCl7JCRpPDAmJihfdm0ubW9kZWw9JCRhLmNvbmNhdChbJCR2XSkpO31lbHNleyQkaT4tMSYmKF92bS5tb2RlbD0kJGEuc2xpY2UoMCwkJGkpLmNvbmNhdCgkJGEuc2xpY2UoJCRpKzEpKSk7fX1lbHNle192bS5tb2RlbD0kJGM7fX0sX3ZtLmhhbmRsZUNoYW5nZV0sZm9jdXM6ZnVuY3Rpb24gZm9jdXMoJGV2ZW50KXtfdm0uZm9jdXM9dHJ1ZTt9LGJsdXI6ZnVuY3Rpb24gYmx1cigkZXZlbnQpe192bS5mb2N1cz1mYWxzZTt9fX0pOl9jKCJpbnB1dCIse2RpcmVjdGl2ZXM6W3tuYW1lOiJtb2RlbCIscmF3TmFtZToidi1tb2RlbCIsdmFsdWU6X3ZtLm1vZGVsLGV4cHJlc3Npb246Im1vZGVsIn1dLHN0YXRpY0NsYXNzOiJlbC1jaGVja2JveC1idXR0b25fX29yaWdpbmFsIixhdHRyczp7dHlwZToiY2hlY2tib3giLG5hbWU6X3ZtLm5hbWUsZGlzYWJsZWQ6X3ZtLmlzRGlzYWJsZWR9LGRvbVByb3BzOnt2YWx1ZTpfdm0ubGFiZWwsY2hlY2tlZDpBcnJheS5pc0FycmF5KF92bS5tb2RlbCk/X3ZtLl9pKF92bS5tb2RlbCxfdm0ubGFiZWwpPi0xOl92bS5tb2RlbH0sb246e2NoYW5nZTpbZnVuY3Rpb24oJGV2ZW50KXt2YXIgJCRhPV92bS5tb2RlbCwkJGVsPSRldmVudC50YXJnZXQsJCRjPSQkZWwuY2hlY2tlZD90cnVlOmZhbHNlO2lmKEFycmF5LmlzQXJyYXkoJCRhKSl7dmFyICQkdj1fdm0ubGFiZWwsJCRpPV92bS5faSgkJGEsJCR2KTtpZigkJGVsLmNoZWNrZWQpeyQkaTwwJiYoX3ZtLm1vZGVsPSQkYS5jb25jYXQoWyQkdl0pKTt9ZWxzZXskJGk+LTEmJihfdm0ubW9kZWw9JCRhLnNsaWNlKDAsJCRpKS5jb25jYXQoJCRhLnNsaWNlKCQkaSsxKSkpO319ZWxzZXtfdm0ubW9kZWw9JCRjO319LF92bS5oYW5kbGVDaGFuZ2VdLGZvY3VzOmZ1bmN0aW9uIGZvY3VzKCRldmVudCl7X3ZtLmZvY3VzPXRydWU7fSxibHVyOmZ1bmN0aW9uIGJsdXIoJGV2ZW50KXtfdm0uZm9jdXM9ZmFsc2U7fX19KSxfdm0uJHNsb3RzLmRlZmF1bHR8fF92bS5sYWJlbD9fYygic3BhbiIse3N0YXRpY0NsYXNzOiJlbC1jaGVja2JveC1idXR0b25fX2lubmVyIixzdHlsZTpfdm0uaXNDaGVja2VkP192bS5hY3RpdmVTdHlsZTpudWxsfSxbX3ZtLl90KCJkZWZhdWx0IixbX3ZtLl92KF92bS5fcyhfdm0ubGFiZWwpKV0pXSwyKTpfdm0uX2UoKV0pO307dmFyIGNoZWNrYm94X2J1dHRvbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQ3OGU5MDZlX3N0YXRpY1JlbmRlckZucz1bXTtjaGVja2JveF9idXR0b252dWVfdHlwZV90ZW1wbGF0ZV9pZF80NzhlOTA2ZV9yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2hlY2tib3gvc3JjL2NoZWNrYm94LWJ1dHRvbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NDc4ZTkwNmUmCi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2NoZWNrYm94L3NyYy9jaGVja2JveC1idXR0b24udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGNoZWNrYm94X2J1dHRvbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17bmFtZTonRWxDaGVja2JveEJ1dHRvbicsbWl4aW5zOltlbWl0dGVyX2RlZmF1bHQuYV0saW5qZWN0OntlbEZvcm06e2RlZmF1bHQ6Jyd9LGVsRm9ybUl0ZW06e2RlZmF1bHQ6Jyd9fSxkYXRhOmZ1bmN0aW9uIGRhdGEoKXtyZXR1cm57c2VsZk1vZGVsOmZhbHNlLGZvY3VzOmZhbHNlLGlzTGltaXRFeGNlZWRlZDpmYWxzZX07fSxwcm9wczp7dmFsdWU6e30sbGFiZWw6e30sZGlzYWJsZWQ6Qm9vbGVhbixjaGVja2VkOkJvb2xlYW4sbmFtZTpTdHJpbmcsdHJ1ZUxhYmVsOltTdHJpbmcsTnVtYmVyXSxmYWxzZUxhYmVsOltTdHJpbmcsTnVtYmVyXX0sY29tcHV0ZWQ6e21vZGVsOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX2NoZWNrYm94R3JvdXA/dGhpcy5zdG9yZTp0aGlzLnZhbHVlIT09dW5kZWZpbmVkP3RoaXMudmFsdWU6dGhpcy5zZWxmTW9kZWw7fSxzZXQ6ZnVuY3Rpb24gc2V0KHZhbCl7aWYodGhpcy5fY2hlY2tib3hHcm91cCl7dGhpcy5pc0xpbWl0RXhjZWVkZWQ9ZmFsc2U7dGhpcy5fY2hlY2tib3hHcm91cC5taW4hPT11bmRlZmluZWQmJnZhbC5sZW5ndGg8dGhpcy5fY2hlY2tib3hHcm91cC5taW4mJih0aGlzLmlzTGltaXRFeGNlZWRlZD10cnVlKTt0aGlzLl9jaGVja2JveEdyb3VwLm1heCE9PXVuZGVmaW5lZCYmdmFsLmxlbmd0aD50aGlzLl9jaGVja2JveEdyb3VwLm1heCYmKHRoaXMuaXNMaW1pdEV4Y2VlZGVkPXRydWUpO3RoaXMuaXNMaW1pdEV4Y2VlZGVkPT09ZmFsc2UmJnRoaXMuZGlzcGF0Y2goJ0VsQ2hlY2tib3hHcm91cCcsJ2lucHV0JyxbdmFsXSk7fWVsc2UgaWYodGhpcy52YWx1ZSE9PXVuZGVmaW5lZCl7dGhpcy4kZW1pdCgnaW5wdXQnLHZhbCk7fWVsc2V7dGhpcy5zZWxmTW9kZWw9dmFsO319fSxpc0NoZWNrZWQ6ZnVuY3Rpb24gaXNDaGVja2VkKCl7aWYoe30udG9TdHJpbmcuY2FsbCh0aGlzLm1vZGVsKT09PSdbb2JqZWN0IEJvb2xlYW5dJyl7cmV0dXJuIHRoaXMubW9kZWw7fWVsc2UgaWYoQXJyYXkuaXNBcnJheSh0aGlzLm1vZGVsKSl7cmV0dXJuIHRoaXMubW9kZWwuaW5kZXhPZih0aGlzLmxhYmVsKT4tMTt9ZWxzZSBpZih0aGlzLm1vZGVsIT09bnVsbCYmdGhpcy5tb2RlbCE9PXVuZGVmaW5lZCl7cmV0dXJuIHRoaXMubW9kZWw9PT10aGlzLnRydWVMYWJlbDt9fSxfY2hlY2tib3hHcm91cDpmdW5jdGlvbiBfY2hlY2tib3hHcm91cCgpe3ZhciBwYXJlbnQ9dGhpcy4kcGFyZW50O3doaWxlKHBhcmVudCl7aWYocGFyZW50LiRvcHRpb25zLmNvbXBvbmVudE5hbWUhPT0nRWxDaGVja2JveEdyb3VwJyl7cGFyZW50PXBhcmVudC4kcGFyZW50O31lbHNle3JldHVybiBwYXJlbnQ7fX1yZXR1cm4gZmFsc2U7fSxzdG9yZTpmdW5jdGlvbiBzdG9yZSgpe3JldHVybiB0aGlzLl9jaGVja2JveEdyb3VwP3RoaXMuX2NoZWNrYm94R3JvdXAudmFsdWU6dGhpcy52YWx1ZTt9LGFjdGl2ZVN0eWxlOmZ1bmN0aW9uIGFjdGl2ZVN0eWxlKCl7cmV0dXJue2JhY2tncm91bmRDb2xvcjp0aGlzLl9jaGVja2JveEdyb3VwLmZpbGx8fCcnLGJvcmRlckNvbG9yOnRoaXMuX2NoZWNrYm94R3JvdXAuZmlsbHx8JycsY29sb3I6dGhpcy5fY2hlY2tib3hHcm91cC50ZXh0Q29sb3J8fCcnLCdib3gtc2hhZG93JzonLTFweCAwIDAgMCAnK3RoaXMuX2NoZWNrYm94R3JvdXAuZmlsbH07fSxfZWxGb3JtSXRlbVNpemU6ZnVuY3Rpb24gX2VsRm9ybUl0ZW1TaXplKCl7cmV0dXJuKHRoaXMuZWxGb3JtSXRlbXx8e30pLmVsRm9ybUl0ZW1TaXplO30sc2l6ZTpmdW5jdGlvbiBzaXplKCl7cmV0dXJuIHRoaXMuX2NoZWNrYm94R3JvdXAuY2hlY2tib3hHcm91cFNpemV8fHRoaXMuX2VsRm9ybUl0ZW1TaXplfHwodGhpcy4kRUxFTUVOVHx8e30pLnNpemU7fSwvKiB1c2VkIHRvIG1ha2UgdGhlIGlzRGlzYWJsZWQganVkZ21lbnQgdW5kZXIgbWF4L21pbiBwcm9wcyAqL2lzTGltaXREaXNhYmxlZDpmdW5jdGlvbiBpc0xpbWl0RGlzYWJsZWQoKXt2YXIgX2NoZWNrYm94R3JvdXAyPXRoaXMuX2NoZWNrYm94R3JvdXAsbWF4PV9jaGVja2JveEdyb3VwMi5tYXgsbWluPV9jaGVja2JveEdyb3VwMi5taW47cmV0dXJuISEobWF4fHxtaW4pJiZ0aGlzLm1vZGVsLmxlbmd0aD49bWF4JiYhdGhpcy5pc0NoZWNrZWR8fHRoaXMubW9kZWwubGVuZ3RoPD1taW4mJnRoaXMuaXNDaGVja2VkO30saXNEaXNhYmxlZDpmdW5jdGlvbiBpc0Rpc2FibGVkKCl7cmV0dXJuIHRoaXMuX2NoZWNrYm94R3JvdXA/dGhpcy5fY2hlY2tib3hHcm91cC5kaXNhYmxlZHx8dGhpcy5kaXNhYmxlZHx8KHRoaXMuZWxGb3JtfHx7fSkuZGlzYWJsZWR8fHRoaXMuaXNMaW1pdERpc2FibGVkOnRoaXMuZGlzYWJsZWR8fCh0aGlzLmVsRm9ybXx8e30pLmRpc2FibGVkO319LG1ldGhvZHM6e2FkZFRvU3RvcmU6ZnVuY3Rpb24gYWRkVG9TdG9yZSgpe2lmKEFycmF5LmlzQXJyYXkodGhpcy5tb2RlbCkmJnRoaXMubW9kZWwuaW5kZXhPZih0aGlzLmxhYmVsKT09PS0xKXt0aGlzLm1vZGVsLnB1c2godGhpcy5sYWJlbCk7fWVsc2V7dGhpcy5tb2RlbD10aGlzLnRydWVMYWJlbHx8dHJ1ZTt9fSxoYW5kbGVDaGFuZ2U6ZnVuY3Rpb24gaGFuZGxlQ2hhbmdlKGV2KXt2YXIgX3RoaXM9dGhpcztpZih0aGlzLmlzTGltaXRFeGNlZWRlZClyZXR1cm47dmFyIHZhbHVlPXZvaWQgMDtpZihldi50YXJnZXQuY2hlY2tlZCl7dmFsdWU9dGhpcy50cnVlTGFiZWw9PT11bmRlZmluZWQ/dHJ1ZTp0aGlzLnRydWVMYWJlbDt9ZWxzZXt2YWx1ZT10aGlzLmZhbHNlTGFiZWw9PT11bmRlZmluZWQ/ZmFsc2U6dGhpcy5mYWxzZUxhYmVsO310aGlzLiRlbWl0KCdjaGFuZ2UnLHZhbHVlLGV2KTt0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe2lmKF90aGlzLl9jaGVja2JveEdyb3VwKXtfdGhpcy5kaXNwYXRjaCgnRWxDaGVja2JveEdyb3VwJywnY2hhbmdlJyxbX3RoaXMuX2NoZWNrYm94R3JvdXAudmFsdWVdKTt9fSk7fX0sY3JlYXRlZDpmdW5jdGlvbiBjcmVhdGVkKCl7dGhpcy5jaGVja2VkJiZ0aGlzLmFkZFRvU3RvcmUoKTt9fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NoZWNrYm94L3NyYy9jaGVja2JveC1idXR0b24udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHNyY19jaGVja2JveF9idXR0b252dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189Y2hlY2tib3hfYnV0dG9udnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2hlY2tib3gvc3JjL2NoZWNrYm94LWJ1dHRvbi52dWUKLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciBjaGVja2JveF9idXR0b25fY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChzcmNfY2hlY2tib3hfYnV0dG9udnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLGNoZWNrYm94X2J1dHRvbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQ3OGU5MDZlX3JlbmRlcixjaGVja2JveF9idXR0b252dWVfdHlwZV90ZW1wbGF0ZV9pZF80NzhlOTA2ZV9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIGNoZWNrYm94X2J1dHRvbl9hcGk7fWNoZWNrYm94X2J1dHRvbl9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL2NoZWNrYm94L3NyYy9jaGVja2JveC1idXR0b24udnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGNoZWNrYm94X2J1dHRvbj1jaGVja2JveF9idXR0b25fY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jaGVja2JveC1idXR0b24vaW5kZXguanMKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9jaGVja2JveF9idXR0b24uaW5zdGFsbD1mdW5jdGlvbihWdWUpe1Z1ZS5jb21wb25lbnQoY2hlY2tib3hfYnV0dG9uLm5hbWUsY2hlY2tib3hfYnV0dG9uKTt9Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFja2FnZXNfY2hlY2tib3hfYnV0dG9uPWNoZWNrYm94X2J1dHRvbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2NoZWNrYm94L3NyYy9jaGVja2JveC1ncm91cC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NzI4OWEyOTAmCnZhciBjaGVja2JveF9ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzcyODlhMjkwX3JlbmRlcj1mdW5jdGlvbiBjaGVja2JveF9ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzcyODlhMjkwX3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLWNoZWNrYm94LWdyb3VwIixhdHRyczp7cm9sZToiZ3JvdXAiLCJhcmlhLWxhYmVsIjoiY2hlY2tib3gtZ3JvdXAifX0sW192bS5fdCgiZGVmYXVsdCIpXSwyKTt9O3ZhciBjaGVja2JveF9ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzcyODlhMjkwX3N0YXRpY1JlbmRlckZucz1bXTtjaGVja2JveF9ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzcyODlhMjkwX3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jaGVja2JveC9zcmMvY2hlY2tib3gtZ3JvdXAudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTcyODlhMjkwJgovLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jaGVja2JveC9zcmMvY2hlY2tib3gtZ3JvdXAudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGNoZWNrYm94X2dyb3VwdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbENoZWNrYm94R3JvdXAnLGNvbXBvbmVudE5hbWU6J0VsQ2hlY2tib3hHcm91cCcsbWl4aW5zOltlbWl0dGVyX2RlZmF1bHQuYV0saW5qZWN0OntlbEZvcm1JdGVtOntkZWZhdWx0OicnfX0scHJvcHM6e3ZhbHVlOnt9LGRpc2FibGVkOkJvb2xlYW4sbWluOk51bWJlcixtYXg6TnVtYmVyLHNpemU6U3RyaW5nLGZpbGw6U3RyaW5nLHRleHRDb2xvcjpTdHJpbmd9LGNvbXB1dGVkOntfZWxGb3JtSXRlbVNpemU6ZnVuY3Rpb24gX2VsRm9ybUl0ZW1TaXplKCl7cmV0dXJuKHRoaXMuZWxGb3JtSXRlbXx8e30pLmVsRm9ybUl0ZW1TaXplO30sY2hlY2tib3hHcm91cFNpemU6ZnVuY3Rpb24gY2hlY2tib3hHcm91cFNpemUoKXtyZXR1cm4gdGhpcy5zaXplfHx0aGlzLl9lbEZvcm1JdGVtU2l6ZXx8KHRoaXMuJEVMRU1FTlR8fHt9KS5zaXplO319LHdhdGNoOnt2YWx1ZTpmdW5jdGlvbiB2YWx1ZShfdmFsdWUpe3RoaXMuZGlzcGF0Y2goJ0VsRm9ybUl0ZW0nLCdlbC5mb3JtLmNoYW5nZScsW192YWx1ZV0pO319fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NoZWNrYm94L3NyYy9jaGVja2JveC1ncm91cC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc3JjX2NoZWNrYm94X2dyb3VwdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPWNoZWNrYm94X2dyb3VwdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2hlY2tib3gvc3JjL2NoZWNrYm94LWdyb3VwLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIGNoZWNrYm94X2dyb3VwX2NvbXBvbmVudD1ub3JtYWxpemVDb21wb25lbnQoc3JjX2NoZWNrYm94X2dyb3VwdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLGNoZWNrYm94X2dyb3VwdnVlX3R5cGVfdGVtcGxhdGVfaWRfNzI4OWEyOTBfcmVuZGVyLGNoZWNrYm94X2dyb3VwdnVlX3R5cGVfdGVtcGxhdGVfaWRfNzI4OWEyOTBfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciBjaGVja2JveF9ncm91cF9hcGk7fWNoZWNrYm94X2dyb3VwX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvY2hlY2tib3gvc3JjL2NoZWNrYm94LWdyb3VwLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBjaGVja2JveF9ncm91cD1jaGVja2JveF9ncm91cF9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NoZWNrYm94LWdyb3VwL2luZGV4LmpzCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovY2hlY2tib3hfZ3JvdXAuaW5zdGFsbD1mdW5jdGlvbihWdWUpe1Z1ZS5jb21wb25lbnQoY2hlY2tib3hfZ3JvdXAubmFtZSxjaGVja2JveF9ncm91cCk7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX2NoZWNrYm94X2dyb3VwPWNoZWNrYm94X2dyb3VwOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvc3dpdGNoL3NyYy9jb21wb25lbnQudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTJkY2Q4ZmJiJgp2YXIgY29tcG9uZW50dnVlX3R5cGVfdGVtcGxhdGVfaWRfMmRjZDhmYmJfcmVuZGVyPWZ1bmN0aW9uIGNvbXBvbmVudHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzJkY2Q4ZmJiX3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXN3aXRjaCIsY2xhc3M6eyJpcy1kaXNhYmxlZCI6X3ZtLnN3aXRjaERpc2FibGVkLCJpcy1jaGVja2VkIjpfdm0uY2hlY2tlZH0sYXR0cnM6e3JvbGU6InN3aXRjaCIsImFyaWEtY2hlY2tlZCI6X3ZtLmNoZWNrZWQsImFyaWEtZGlzYWJsZWQiOl92bS5zd2l0Y2hEaXNhYmxlZH0sb246e2NsaWNrOmZ1bmN0aW9uIGNsaWNrKCRldmVudCl7JGV2ZW50LnByZXZlbnREZWZhdWx0KCk7cmV0dXJuIF92bS5zd2l0Y2hWYWx1ZSgkZXZlbnQpO319fSxbX2MoImlucHV0Iix7cmVmOiJpbnB1dCIsc3RhdGljQ2xhc3M6ImVsLXN3aXRjaF9faW5wdXQiLGF0dHJzOnt0eXBlOiJjaGVja2JveCIsaWQ6X3ZtLmlkLG5hbWU6X3ZtLm5hbWUsInRydWUtdmFsdWUiOl92bS5hY3RpdmVWYWx1ZSwiZmFsc2UtdmFsdWUiOl92bS5pbmFjdGl2ZVZhbHVlLGRpc2FibGVkOl92bS5zd2l0Y2hEaXNhYmxlZH0sb246e2NoYW5nZTpfdm0uaGFuZGxlQ2hhbmdlLGtleWRvd246ZnVuY3Rpb24ga2V5ZG93bigkZXZlbnQpe2lmKCEoImJ1dHRvbiJpbiAkZXZlbnQpJiZfdm0uX2soJGV2ZW50LmtleUNvZGUsImVudGVyIiwxMywkZXZlbnQua2V5LCJFbnRlciIpKXtyZXR1cm4gbnVsbDt9cmV0dXJuIF92bS5zd2l0Y2hWYWx1ZSgkZXZlbnQpO319fSksX3ZtLmluYWN0aXZlSWNvbkNsYXNzfHxfdm0uaW5hY3RpdmVUZXh0P19jKCJzcGFuIix7Y2xhc3M6WyJlbC1zd2l0Y2hfX2xhYmVsIiwiZWwtc3dpdGNoX19sYWJlbC0tbGVmdCIsIV92bS5jaGVja2VkPyJpcy1hY3RpdmUiOiIiXX0sW192bS5pbmFjdGl2ZUljb25DbGFzcz9fYygiaSIse2NsYXNzOltfdm0uaW5hY3RpdmVJY29uQ2xhc3NdfSk6X3ZtLl9lKCksIV92bS5pbmFjdGl2ZUljb25DbGFzcyYmX3ZtLmluYWN0aXZlVGV4dD9fYygic3BhbiIse2F0dHJzOnsiYXJpYS1oaWRkZW4iOl92bS5jaGVja2VkfX0sW192bS5fdihfdm0uX3MoX3ZtLmluYWN0aXZlVGV4dCkpXSk6X3ZtLl9lKCldKTpfdm0uX2UoKSxfYygic3BhbiIse3JlZjoiY29yZSIsc3RhdGljQ2xhc3M6ImVsLXN3aXRjaF9fY29yZSIsc3R5bGU6e3dpZHRoOl92bS5jb3JlV2lkdGgrInB4In19KSxfdm0uYWN0aXZlSWNvbkNsYXNzfHxfdm0uYWN0aXZlVGV4dD9fYygic3BhbiIse2NsYXNzOlsiZWwtc3dpdGNoX19sYWJlbCIsImVsLXN3aXRjaF9fbGFiZWwtLXJpZ2h0Iixfdm0uY2hlY2tlZD8iaXMtYWN0aXZlIjoiIl19LFtfdm0uYWN0aXZlSWNvbkNsYXNzP19jKCJpIix7Y2xhc3M6W192bS5hY3RpdmVJY29uQ2xhc3NdfSk6X3ZtLl9lKCksIV92bS5hY3RpdmVJY29uQ2xhc3MmJl92bS5hY3RpdmVUZXh0P19jKCJzcGFuIix7YXR0cnM6eyJhcmlhLWhpZGRlbiI6IV92bS5jaGVja2VkfX0sW192bS5fdihfdm0uX3MoX3ZtLmFjdGl2ZVRleHQpKV0pOl92bS5fZSgpXSk6X3ZtLl9lKCldKTt9O3ZhciBjb21wb25lbnR2dWVfdHlwZV90ZW1wbGF0ZV9pZF8yZGNkOGZiYl9zdGF0aWNSZW5kZXJGbnM9W107Y29tcG9uZW50dnVlX3R5cGVfdGVtcGxhdGVfaWRfMmRjZDhmYmJfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3N3aXRjaC9zcmMvY29tcG9uZW50LnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0yZGNkOGZiYiYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvc3dpdGNoL3NyYy9jb21wb25lbnQudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHN3aXRjaF9zcmNfY29tcG9uZW50dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbFN3aXRjaCcsbWl4aW5zOltmb2N1c19kZWZhdWx0KCkoJ2lucHV0JyksbWlncmF0aW5nX2RlZmF1bHQuYSxlbWl0dGVyX2RlZmF1bHQuYV0saW5qZWN0OntlbEZvcm06e2RlZmF1bHQ6Jyd9fSxwcm9wczp7dmFsdWU6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nLE51bWJlcl0sZGVmYXVsdDpmYWxzZX0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OmZhbHNlfSx3aWR0aDp7dHlwZTpOdW1iZXIsZGVmYXVsdDo0MH0sYWN0aXZlSWNvbkNsYXNzOnt0eXBlOlN0cmluZyxkZWZhdWx0OicnfSxpbmFjdGl2ZUljb25DbGFzczp7dHlwZTpTdHJpbmcsZGVmYXVsdDonJ30sYWN0aXZlVGV4dDpTdHJpbmcsaW5hY3RpdmVUZXh0OlN0cmluZyxhY3RpdmVDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDonJ30saW5hY3RpdmVDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDonJ30sYWN0aXZlVmFsdWU6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nLE51bWJlcl0sZGVmYXVsdDp0cnVlfSxpbmFjdGl2ZVZhbHVlOnt0eXBlOltCb29sZWFuLFN0cmluZyxOdW1iZXJdLGRlZmF1bHQ6ZmFsc2V9LG5hbWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6Jyd9LHZhbGlkYXRlRXZlbnQ6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OnRydWV9LGlkOlN0cmluZ30sZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue2NvcmVXaWR0aDp0aGlzLndpZHRofTt9LGNyZWF0ZWQ6ZnVuY3Rpb24gY3JlYXRlZCgpe2lmKCF+W3RoaXMuYWN0aXZlVmFsdWUsdGhpcy5pbmFjdGl2ZVZhbHVlXS5pbmRleE9mKHRoaXMudmFsdWUpKXt0aGlzLiRlbWl0KCdpbnB1dCcsdGhpcy5pbmFjdGl2ZVZhbHVlKTt9fSxjb21wdXRlZDp7Y2hlY2tlZDpmdW5jdGlvbiBjaGVja2VkKCl7cmV0dXJuIHRoaXMudmFsdWU9PT10aGlzLmFjdGl2ZVZhbHVlO30sc3dpdGNoRGlzYWJsZWQ6ZnVuY3Rpb24gc3dpdGNoRGlzYWJsZWQoKXtyZXR1cm4gdGhpcy5kaXNhYmxlZHx8KHRoaXMuZWxGb3JtfHx7fSkuZGlzYWJsZWQ7fX0sd2F0Y2g6e2NoZWNrZWQ6ZnVuY3Rpb24gY2hlY2tlZCgpe3RoaXMuJHJlZnMuaW5wdXQuY2hlY2tlZD10aGlzLmNoZWNrZWQ7aWYodGhpcy5hY3RpdmVDb2xvcnx8dGhpcy5pbmFjdGl2ZUNvbG9yKXt0aGlzLnNldEJhY2tncm91bmRDb2xvcigpO31pZih0aGlzLnZhbGlkYXRlRXZlbnQpe3RoaXMuZGlzcGF0Y2goJ0VsRm9ybUl0ZW0nLCdlbC5mb3JtLmNoYW5nZScsW3RoaXMudmFsdWVdKTt9fX0sbWV0aG9kczp7aGFuZGxlQ2hhbmdlOmZ1bmN0aW9uIGhhbmRsZUNoYW5nZShldmVudCl7dmFyIF90aGlzPXRoaXM7dmFyIHZhbD10aGlzLmNoZWNrZWQ/dGhpcy5pbmFjdGl2ZVZhbHVlOnRoaXMuYWN0aXZlVmFsdWU7dGhpcy4kZW1pdCgnaW5wdXQnLHZhbCk7dGhpcy4kZW1pdCgnY2hhbmdlJyx2YWwpO3RoaXMuJG5leHRUaWNrKGZ1bmN0aW9uKCl7Ly8gc2V0IGlucHV0J3MgY2hlY2tlZCBwcm9wZXJ0eQovLyBpbiBjYXNlIHBhcmVudCByZWZ1c2VzIHRvIGNoYW5nZSBjb21wb25lbnQncyB2YWx1ZQpfdGhpcy4kcmVmcy5pbnB1dC5jaGVja2VkPV90aGlzLmNoZWNrZWQ7fSk7fSxzZXRCYWNrZ3JvdW5kQ29sb3I6ZnVuY3Rpb24gc2V0QmFja2dyb3VuZENvbG9yKCl7dmFyIG5ld0NvbG9yPXRoaXMuY2hlY2tlZD90aGlzLmFjdGl2ZUNvbG9yOnRoaXMuaW5hY3RpdmVDb2xvcjt0aGlzLiRyZWZzLmNvcmUuc3R5bGUuYm9yZGVyQ29sb3I9bmV3Q29sb3I7dGhpcy4kcmVmcy5jb3JlLnN0eWxlLmJhY2tncm91bmRDb2xvcj1uZXdDb2xvcjt9LHN3aXRjaFZhbHVlOmZ1bmN0aW9uIHN3aXRjaFZhbHVlKCl7IXRoaXMuc3dpdGNoRGlzYWJsZWQmJnRoaXMuaGFuZGxlQ2hhbmdlKCk7fSxnZXRNaWdyYXRpbmdDb25maWc6ZnVuY3Rpb24gZ2V0TWlncmF0aW5nQ29uZmlnKCl7cmV0dXJue3Byb3BzOnsnb24tY29sb3InOidvbi1jb2xvciBpcyByZW5hbWVkIHRvIGFjdGl2ZS1jb2xvci4nLCdvZmYtY29sb3InOidvZmYtY29sb3IgaXMgcmVuYW1lZCB0byBpbmFjdGl2ZS1jb2xvci4nLCdvbi10ZXh0Jzonb24tdGV4dCBpcyByZW5hbWVkIHRvIGFjdGl2ZS10ZXh0LicsJ29mZi10ZXh0Jzonb2ZmLXRleHQgaXMgcmVuYW1lZCB0byBpbmFjdGl2ZS10ZXh0LicsJ29uLXZhbHVlJzonb24tdmFsdWUgaXMgcmVuYW1lZCB0byBhY3RpdmUtdmFsdWUuJywnb2ZmLXZhbHVlJzonb2ZmLXZhbHVlIGlzIHJlbmFtZWQgdG8gaW5hY3RpdmUtdmFsdWUuJywnb24taWNvbi1jbGFzcyc6J29uLWljb24tY2xhc3MgaXMgcmVuYW1lZCB0byBhY3RpdmUtaWNvbi1jbGFzcy4nLCdvZmYtaWNvbi1jbGFzcyc6J29mZi1pY29uLWNsYXNzIGlzIHJlbmFtZWQgdG8gaW5hY3RpdmUtaWNvbi1jbGFzcy4nfX07fX0sbW91bnRlZDpmdW5jdGlvbiBtb3VudGVkKCl7LyogaXN0YW5idWwgaWdub3JlIGlmICovdGhpcy5jb3JlV2lkdGg9dGhpcy53aWR0aHx8NDA7aWYodGhpcy5hY3RpdmVDb2xvcnx8dGhpcy5pbmFjdGl2ZUNvbG9yKXt0aGlzLnNldEJhY2tncm91bmRDb2xvcigpO310aGlzLiRyZWZzLmlucHV0LmNoZWNrZWQ9dGhpcy5jaGVja2VkO319Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc3dpdGNoL3NyYy9jb21wb25lbnQudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX3N3aXRjaF9zcmNfY29tcG9uZW50dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXN3aXRjaF9zcmNfY29tcG9uZW50dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc3dpdGNoL3NyYy9jb21wb25lbnQudnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgc3JjX2NvbXBvbmVudF9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHBhY2thZ2VzX3N3aXRjaF9zcmNfY29tcG9uZW50dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLGNvbXBvbmVudHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzJkY2Q4ZmJiX3JlbmRlcixjb21wb25lbnR2dWVfdHlwZV90ZW1wbGF0ZV9pZF8yZGNkOGZiYl9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIHNyY19jb21wb25lbnRfYXBpO31zcmNfY29tcG9uZW50X2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvc3dpdGNoL3NyYy9jb21wb25lbnQudnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHN3aXRjaF9zcmNfY29tcG9uZW50PXNyY19jb21wb25lbnRfY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zd2l0Y2gvaW5kZXguanMKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9zd2l0Y2hfc3JjX2NvbXBvbmVudC5pbnN0YWxsPWZ1bmN0aW9uKFZ1ZSl7VnVlLmNvbXBvbmVudChzd2l0Y2hfc3JjX2NvbXBvbmVudC5uYW1lLHN3aXRjaF9zcmNfY29tcG9uZW50KTt9Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFja2FnZXNfc3dpdGNoPXN3aXRjaF9zcmNfY29tcG9uZW50Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvc2VsZWN0L3NyYy9zZWxlY3QudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTBlNGFhZGU2Jgp2YXIgc2VsZWN0dnVlX3R5cGVfdGVtcGxhdGVfaWRfMGU0YWFkZTZfcmVuZGVyPWZ1bmN0aW9uIHNlbGVjdHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzBlNGFhZGU2X3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygiZGl2Iix7ZGlyZWN0aXZlczpbe25hbWU6ImNsaWNrb3V0c2lkZSIscmF3TmFtZToidi1jbGlja291dHNpZGUiLHZhbHVlOl92bS5oYW5kbGVDbG9zZSxleHByZXNzaW9uOiJoYW5kbGVDbG9zZSJ9XSxzdGF0aWNDbGFzczoiZWwtc2VsZWN0IixjbGFzczpbX3ZtLnNlbGVjdFNpemU/ImVsLXNlbGVjdC0tIitfdm0uc2VsZWN0U2l6ZToiIl0sb246e2NsaWNrOmZ1bmN0aW9uIGNsaWNrKCRldmVudCl7JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO3JldHVybiBfdm0udG9nZ2xlTWVudSgkZXZlbnQpO319fSxbX3ZtLm11bHRpcGxlP19jKCJkaXYiLHtyZWY6InRhZ3MiLHN0YXRpY0NsYXNzOiJlbC1zZWxlY3RfX3RhZ3MiLHN0eWxlOnsibWF4LXdpZHRoIjpfdm0uaW5wdXRXaWR0aC0zMisicHgiLHdpZHRoOiIxMDAlIn19LFtfdm0uY29sbGFwc2VUYWdzJiZfdm0uc2VsZWN0ZWQubGVuZ3RoP19jKCJzcGFuIixbX2MoImVsLXRhZyIse2F0dHJzOntjbG9zYWJsZTohX3ZtLnNlbGVjdERpc2FibGVkLHNpemU6X3ZtLmNvbGxhcHNlVGFnU2l6ZSxoaXQ6X3ZtLnNlbGVjdGVkWzBdLmhpdFN0YXRlLHR5cGU6ImluZm8iLCJkaXNhYmxlLXRyYW5zaXRpb25zIjoiIn0sb246e2Nsb3NlOmZ1bmN0aW9uIGNsb3NlKCRldmVudCl7X3ZtLmRlbGV0ZVRhZygkZXZlbnQsX3ZtLnNlbGVjdGVkWzBdKTt9fX0sW19jKCJzcGFuIix7c3RhdGljQ2xhc3M6ImVsLXNlbGVjdF9fdGFncy10ZXh0In0sW192bS5fdihfdm0uX3MoX3ZtLnNlbGVjdGVkWzBdLmN1cnJlbnRMYWJlbCkpXSldKSxfdm0uc2VsZWN0ZWQubGVuZ3RoPjE/X2MoImVsLXRhZyIse2F0dHJzOntjbG9zYWJsZTpmYWxzZSxzaXplOl92bS5jb2xsYXBzZVRhZ1NpemUsdHlwZToiaW5mbyIsImRpc2FibGUtdHJhbnNpdGlvbnMiOiIifX0sW19jKCJzcGFuIix7c3RhdGljQ2xhc3M6ImVsLXNlbGVjdF9fdGFncy10ZXh0In0sW192bS5fdigiKyAiK192bS5fcyhfdm0uc2VsZWN0ZWQubGVuZ3RoLTEpKV0pXSk6X3ZtLl9lKCldLDEpOl92bS5fZSgpLCFfdm0uY29sbGFwc2VUYWdzP19jKCJ0cmFuc2l0aW9uLWdyb3VwIix7b246eyJhZnRlci1sZWF2ZSI6X3ZtLnJlc2V0SW5wdXRIZWlnaHR9fSxfdm0uX2woX3ZtLnNlbGVjdGVkLGZ1bmN0aW9uKGl0ZW0pe3JldHVybiBfYygiZWwtdGFnIix7a2V5Ol92bS5nZXRWYWx1ZUtleShpdGVtKSxhdHRyczp7Y2xvc2FibGU6IV92bS5zZWxlY3REaXNhYmxlZCxzaXplOl92bS5jb2xsYXBzZVRhZ1NpemUsaGl0Oml0ZW0uaGl0U3RhdGUsdHlwZToiaW5mbyIsImRpc2FibGUtdHJhbnNpdGlvbnMiOiIifSxvbjp7Y2xvc2U6ZnVuY3Rpb24gY2xvc2UoJGV2ZW50KXtfdm0uZGVsZXRlVGFnKCRldmVudCxpdGVtKTt9fX0sW19jKCJzcGFuIix7c3RhdGljQ2xhc3M6ImVsLXNlbGVjdF9fdGFncy10ZXh0In0sW192bS5fdihfdm0uX3MoaXRlbS5jdXJyZW50TGFiZWwpKV0pXSk7fSksMSk6X3ZtLl9lKCksX3ZtLmZpbHRlcmFibGU/X2MoImlucHV0Iix7ZGlyZWN0aXZlczpbe25hbWU6Im1vZGVsIixyYXdOYW1lOiJ2LW1vZGVsIix2YWx1ZTpfdm0ucXVlcnksZXhwcmVzc2lvbjoicXVlcnkifV0scmVmOiJpbnB1dCIsc3RhdGljQ2xhc3M6ImVsLXNlbGVjdF9faW5wdXQiLGNsYXNzOltfdm0uc2VsZWN0U2l6ZT8iaXMtIitfdm0uc2VsZWN0U2l6ZToiIl0sc3R5bGU6eyJmbGV4LWdyb3ciOiIxIix3aWR0aDpfdm0uaW5wdXRMZW5ndGgvKF92bS5pbnB1dFdpZHRoLTMyKSsiJSIsIm1heC13aWR0aCI6X3ZtLmlucHV0V2lkdGgtNDIrInB4In0sYXR0cnM6e3R5cGU6InRleHQiLGRpc2FibGVkOl92bS5zZWxlY3REaXNhYmxlZCxhdXRvY29tcGxldGU6X3ZtLmF1dG9Db21wbGV0ZXx8X3ZtLmF1dG9jb21wbGV0ZX0sZG9tUHJvcHM6e3ZhbHVlOl92bS5xdWVyeX0sb246e2ZvY3VzOl92bS5oYW5kbGVGb2N1cyxibHVyOmZ1bmN0aW9uIGJsdXIoJGV2ZW50KXtfdm0uc29mdEZvY3VzPWZhbHNlO30sa2V5dXA6X3ZtLm1hbmFnZVBsYWNlaG9sZGVyLGtleWRvd246W192bS5yZXNldElucHV0U3RhdGUsZnVuY3Rpb24oJGV2ZW50KXtpZighKCJidXR0b24iaW4gJGV2ZW50KSYmX3ZtLl9rKCRldmVudC5rZXlDb2RlLCJkb3duIiw0MCwkZXZlbnQua2V5LFsiRG93biIsIkFycm93RG93biJdKSl7cmV0dXJuIG51bGw7fSRldmVudC5wcmV2ZW50RGVmYXVsdCgpO192bS5uYXZpZ2F0ZU9wdGlvbnMoIm5leHQiKTt9LGZ1bmN0aW9uKCRldmVudCl7aWYoISgiYnV0dG9uImluICRldmVudCkmJl92bS5faygkZXZlbnQua2V5Q29kZSwidXAiLDM4LCRldmVudC5rZXksWyJVcCIsIkFycm93VXAiXSkpe3JldHVybiBudWxsO30kZXZlbnQucHJldmVudERlZmF1bHQoKTtfdm0ubmF2aWdhdGVPcHRpb25zKCJwcmV2Iik7fSxmdW5jdGlvbigkZXZlbnQpe2lmKCEoImJ1dHRvbiJpbiAkZXZlbnQpJiZfdm0uX2soJGV2ZW50LmtleUNvZGUsImVudGVyIiwxMywkZXZlbnQua2V5LCJFbnRlciIpKXtyZXR1cm4gbnVsbDt9JGV2ZW50LnByZXZlbnREZWZhdWx0KCk7cmV0dXJuIF92bS5zZWxlY3RPcHRpb24oJGV2ZW50KTt9LGZ1bmN0aW9uKCRldmVudCl7aWYoISgiYnV0dG9uImluICRldmVudCkmJl92bS5faygkZXZlbnQua2V5Q29kZSwiZXNjIiwyNywkZXZlbnQua2V5LFsiRXNjIiwiRXNjYXBlIl0pKXtyZXR1cm4gbnVsbDt9JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyRldmVudC5wcmV2ZW50RGVmYXVsdCgpO192bS52aXNpYmxlPWZhbHNlO30sZnVuY3Rpb24oJGV2ZW50KXtpZighKCJidXR0b24iaW4gJGV2ZW50KSYmX3ZtLl9rKCRldmVudC5rZXlDb2RlLCJkZWxldGUiLFs4LDQ2XSwkZXZlbnQua2V5LFsiQmFja3NwYWNlIiwiRGVsZXRlIiwiRGVsIl0pKXtyZXR1cm4gbnVsbDt9cmV0dXJuIF92bS5kZWxldGVQcmV2VGFnKCRldmVudCk7fSxmdW5jdGlvbigkZXZlbnQpe2lmKCEoImJ1dHRvbiJpbiAkZXZlbnQpJiZfdm0uX2soJGV2ZW50LmtleUNvZGUsInRhYiIsOSwkZXZlbnQua2V5LCJUYWIiKSl7cmV0dXJuIG51bGw7fV92bS52aXNpYmxlPWZhbHNlO31dLGNvbXBvc2l0aW9uc3RhcnQ6X3ZtLmhhbmRsZUNvbXBvc2l0aW9uLGNvbXBvc2l0aW9udXBkYXRlOl92bS5oYW5kbGVDb21wb3NpdGlvbixjb21wb3NpdGlvbmVuZDpfdm0uaGFuZGxlQ29tcG9zaXRpb24saW5wdXQ6W2Z1bmN0aW9uKCRldmVudCl7aWYoJGV2ZW50LnRhcmdldC5jb21wb3Npbmcpe3JldHVybjt9X3ZtLnF1ZXJ5PSRldmVudC50YXJnZXQudmFsdWU7fSxfdm0uZGVib3VuY2VkUXVlcnlDaGFuZ2VdfX0pOl92bS5fZSgpXSwxKTpfdm0uX2UoKSxfYygiZWwtaW5wdXQiLHtyZWY6InJlZmVyZW5jZSIsY2xhc3M6eyJpcy1mb2N1cyI6X3ZtLnZpc2libGV9LGF0dHJzOnt0eXBlOiJ0ZXh0IixwbGFjZWhvbGRlcjpfdm0uY3VycmVudFBsYWNlaG9sZGVyLG5hbWU6X3ZtLm5hbWUsaWQ6X3ZtLmlkLGF1dG9jb21wbGV0ZTpfdm0uYXV0b0NvbXBsZXRlfHxfdm0uYXV0b2NvbXBsZXRlLHNpemU6X3ZtLnNlbGVjdFNpemUsZGlzYWJsZWQ6X3ZtLnNlbGVjdERpc2FibGVkLHJlYWRvbmx5Ol92bS5yZWFkb25seSwidmFsaWRhdGUtZXZlbnQiOmZhbHNlLHRhYmluZGV4Ol92bS5tdWx0aXBsZSYmX3ZtLmZpbHRlcmFibGU/Ii0xIjpudWxsfSxvbjp7Zm9jdXM6X3ZtLmhhbmRsZUZvY3VzLGJsdXI6X3ZtLmhhbmRsZUJsdXJ9LG5hdGl2ZU9uOntrZXl1cDpmdW5jdGlvbiBrZXl1cCgkZXZlbnQpe3JldHVybiBfdm0uZGVib3VuY2VkT25JbnB1dENoYW5nZSgkZXZlbnQpO30sa2V5ZG93bjpbZnVuY3Rpb24oJGV2ZW50KXtpZighKCJidXR0b24iaW4gJGV2ZW50KSYmX3ZtLl9rKCRldmVudC5rZXlDb2RlLCJkb3duIiw0MCwkZXZlbnQua2V5LFsiRG93biIsIkFycm93RG93biJdKSl7cmV0dXJuIG51bGw7fSRldmVudC5zdG9wUHJvcGFnYXRpb24oKTskZXZlbnQucHJldmVudERlZmF1bHQoKTtfdm0ubmF2aWdhdGVPcHRpb25zKCJuZXh0Iik7fSxmdW5jdGlvbigkZXZlbnQpe2lmKCEoImJ1dHRvbiJpbiAkZXZlbnQpJiZfdm0uX2soJGV2ZW50LmtleUNvZGUsInVwIiwzOCwkZXZlbnQua2V5LFsiVXAiLCJBcnJvd1VwIl0pKXtyZXR1cm4gbnVsbDt9JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyRldmVudC5wcmV2ZW50RGVmYXVsdCgpO192bS5uYXZpZ2F0ZU9wdGlvbnMoInByZXYiKTt9LGZ1bmN0aW9uKCRldmVudCl7aWYoISgiYnV0dG9uImluICRldmVudCkmJl92bS5faygkZXZlbnQua2V5Q29kZSwiZW50ZXIiLDEzLCRldmVudC5rZXksIkVudGVyIikpe3JldHVybiBudWxsO30kZXZlbnQucHJldmVudERlZmF1bHQoKTtyZXR1cm4gX3ZtLnNlbGVjdE9wdGlvbigkZXZlbnQpO30sZnVuY3Rpb24oJGV2ZW50KXtpZighKCJidXR0b24iaW4gJGV2ZW50KSYmX3ZtLl9rKCRldmVudC5rZXlDb2RlLCJlc2MiLDI3LCRldmVudC5rZXksWyJFc2MiLCJFc2NhcGUiXSkpe3JldHVybiBudWxsO30kZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7JGV2ZW50LnByZXZlbnREZWZhdWx0KCk7X3ZtLnZpc2libGU9ZmFsc2U7fSxmdW5jdGlvbigkZXZlbnQpe2lmKCEoImJ1dHRvbiJpbiAkZXZlbnQpJiZfdm0uX2soJGV2ZW50LmtleUNvZGUsInRhYiIsOSwkZXZlbnQua2V5LCJUYWIiKSl7cmV0dXJuIG51bGw7fV92bS52aXNpYmxlPWZhbHNlO31dLHBhc3RlOmZ1bmN0aW9uIHBhc3RlKCRldmVudCl7cmV0dXJuIF92bS5kZWJvdW5jZWRPbklucHV0Q2hhbmdlKCRldmVudCk7fSxtb3VzZWVudGVyOmZ1bmN0aW9uIG1vdXNlZW50ZXIoJGV2ZW50KXtfdm0uaW5wdXRIb3ZlcmluZz10cnVlO30sbW91c2VsZWF2ZTpmdW5jdGlvbiBtb3VzZWxlYXZlKCRldmVudCl7X3ZtLmlucHV0SG92ZXJpbmc9ZmFsc2U7fX0sbW9kZWw6e3ZhbHVlOl92bS5zZWxlY3RlZExhYmVsLGNhbGxiYWNrOmZ1bmN0aW9uIGNhbGxiYWNrKCQkdil7X3ZtLnNlbGVjdGVkTGFiZWw9JCR2O30sZXhwcmVzc2lvbjoic2VsZWN0ZWRMYWJlbCJ9fSxbX3ZtLiRzbG90cy5wcmVmaXg/X2MoInRlbXBsYXRlIix7c2xvdDoicHJlZml4In0sW192bS5fdCgicHJlZml4IildLDIpOl92bS5fZSgpLF9jKCJ0ZW1wbGF0ZSIse3Nsb3Q6InN1ZmZpeCJ9LFtfYygiaSIse2RpcmVjdGl2ZXM6W3tuYW1lOiJzaG93IixyYXdOYW1lOiJ2LXNob3ciLHZhbHVlOiFfdm0uc2hvd0Nsb3NlLGV4cHJlc3Npb246IiFzaG93Q2xvc2UifV0sY2xhc3M6WyJlbC1zZWxlY3RfX2NhcmV0IiwiZWwtaW5wdXRfX2ljb24iLCJlbC1pY29uLSIrX3ZtLmljb25DbGFzc119KSxfdm0uc2hvd0Nsb3NlP19jKCJpIix7c3RhdGljQ2xhc3M6ImVsLXNlbGVjdF9fY2FyZXQgZWwtaW5wdXRfX2ljb24gZWwtaWNvbi1jaXJjbGUtY2xvc2UiLG9uOntjbGljazpfdm0uaGFuZGxlQ2xlYXJDbGlja319KTpfdm0uX2UoKV0pXSwyKSxfYygidHJhbnNpdGlvbiIse2F0dHJzOntuYW1lOiJlbC16b29tLWluLXRvcCJ9LG9uOnsiYmVmb3JlLWVudGVyIjpfdm0uaGFuZGxlTWVudUVudGVyLCJhZnRlci1sZWF2ZSI6X3ZtLmRvRGVzdHJveX19LFtfYygiZWwtc2VsZWN0LW1lbnUiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTpfdm0udmlzaWJsZSYmX3ZtLmVtcHR5VGV4dCE9PWZhbHNlLGV4cHJlc3Npb246InZpc2libGUgJiYgZW1wdHlUZXh0ICE9PSBmYWxzZSJ9XSxyZWY6InBvcHBlciIsYXR0cnM6eyJhcHBlbmQtdG8tYm9keSI6X3ZtLnBvcHBlckFwcGVuZFRvQm9keX19LFtfYygiZWwtc2Nyb2xsYmFyIix7ZGlyZWN0aXZlczpbe25hbWU6InNob3ciLHJhd05hbWU6InYtc2hvdyIsdmFsdWU6X3ZtLm9wdGlvbnMubGVuZ3RoPjAmJiFfdm0ubG9hZGluZyxleHByZXNzaW9uOiJvcHRpb25zLmxlbmd0aCA+IDAgJiYgIWxvYWRpbmcifV0scmVmOiJzY3JvbGxiYXIiLGNsYXNzOnsiaXMtZW1wdHkiOiFfdm0uYWxsb3dDcmVhdGUmJl92bS5xdWVyeSYmX3ZtLmZpbHRlcmVkT3B0aW9uc0NvdW50PT09MH0sYXR0cnM6e3RhZzoidWwiLCJ3cmFwLWNsYXNzIjoiZWwtc2VsZWN0LWRyb3Bkb3duX193cmFwIiwidmlldy1jbGFzcyI6ImVsLXNlbGVjdC1kcm9wZG93bl9fbGlzdCJ9fSxbX3ZtLnNob3dOZXdPcHRpb24/X2MoImVsLW9wdGlvbiIse2F0dHJzOnt2YWx1ZTpfdm0ucXVlcnksY3JlYXRlZDoiIn19KTpfdm0uX2UoKSxfdm0uX3QoImRlZmF1bHQiKV0sMiksX3ZtLmVtcHR5VGV4dCYmKCFfdm0uYWxsb3dDcmVhdGV8fF92bS5sb2FkaW5nfHxfdm0uYWxsb3dDcmVhdGUmJl92bS5vcHRpb25zLmxlbmd0aD09PTApP1tfdm0uJHNsb3RzLmVtcHR5P192bS5fdCgiZW1wdHkiKTpfYygicCIse3N0YXRpY0NsYXNzOiJlbC1zZWxlY3QtZHJvcGRvd25fX2VtcHR5In0sW192bS5fdigiXG4gICAgICAgICAgIitfdm0uX3MoX3ZtLmVtcHR5VGV4dCkrIlxuICAgICAgICAiKV0pXTpfdm0uX2UoKV0sMildLDEpXSwxKTt9O3ZhciBzZWxlY3R2dWVfdHlwZV90ZW1wbGF0ZV9pZF8wZTRhYWRlNl9zdGF0aWNSZW5kZXJGbnM9W107c2VsZWN0dnVlX3R5cGVfdGVtcGxhdGVfaWRfMGU0YWFkZTZfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NlbGVjdC9zcmMvc2VsZWN0LnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0wZTRhYWRlNiYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL3NlbGVjdC1kcm9wZG93bi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MDY4Mjg3NDgmCnZhciBzZWxlY3RfZHJvcGRvd252dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNjgyODc0OF9yZW5kZXI9ZnVuY3Rpb24gc2VsZWN0X2Ryb3Bkb3dudnVlX3R5cGVfdGVtcGxhdGVfaWRfMDY4Mjg3NDhfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtc2VsZWN0LWRyb3Bkb3duIGVsLXBvcHBlciIsY2xhc3M6W3siaXMtbXVsdGlwbGUiOl92bS4kcGFyZW50Lm11bHRpcGxlfSxfdm0ucG9wcGVyQ2xhc3NdLHN0eWxlOnttaW5XaWR0aDpfdm0ubWluV2lkdGh9fSxbX3ZtLl90KCJkZWZhdWx0IildLDIpO307dmFyIHNlbGVjdF9kcm9wZG93bnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzA2ODI4NzQ4X3N0YXRpY1JlbmRlckZucz1bXTtzZWxlY3RfZHJvcGRvd252dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNjgyODc0OF9yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2VsZWN0L3NyYy9zZWxlY3QtZHJvcGRvd24udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTA2ODI4NzQ4JgovLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL3NlbGVjdC1kcm9wZG93bi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc2VsZWN0X2Ryb3Bkb3dudnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbFNlbGVjdERyb3Bkb3duJyxjb21wb25lbnROYW1lOidFbFNlbGVjdERyb3Bkb3duJyxtaXhpbnM6W3Z1ZV9wb3BwZXJfZGVmYXVsdC5hXSxwcm9wczp7cGxhY2VtZW50OntkZWZhdWx0Oidib3R0b20tc3RhcnQnfSxib3VuZGFyaWVzUGFkZGluZzp7ZGVmYXVsdDowfSxwb3BwZXJPcHRpb25zOntkZWZhdWx0OmZ1bmN0aW9uIF9kZWZhdWx0KCl7cmV0dXJue2dwdUFjY2VsZXJhdGlvbjpmYWxzZX07fX0sdmlzaWJsZUFycm93OntkZWZhdWx0OnRydWV9LGFwcGVuZFRvQm9keTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6dHJ1ZX19LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybnttaW5XaWR0aDonJ307fSxjb21wdXRlZDp7cG9wcGVyQ2xhc3M6ZnVuY3Rpb24gcG9wcGVyQ2xhc3MoKXtyZXR1cm4gdGhpcy4kcGFyZW50LnBvcHBlckNsYXNzO319LHdhdGNoOnsnJHBhcmVudC5pbnB1dFdpZHRoJzpmdW5jdGlvbiAkcGFyZW50SW5wdXRXaWR0aCgpe3RoaXMubWluV2lkdGg9dGhpcy4kcGFyZW50LiRlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCsncHgnO319LG1vdW50ZWQ6ZnVuY3Rpb24gbW91bnRlZCgpe3ZhciBfdGhpcz10aGlzO3RoaXMucmVmZXJlbmNlRWxtPXRoaXMuJHBhcmVudC4kcmVmcy5yZWZlcmVuY2UuJGVsO3RoaXMuJHBhcmVudC5wb3BwZXJFbG09dGhpcy5wb3BwZXJFbG09dGhpcy4kZWw7dGhpcy4kb24oJ3VwZGF0ZVBvcHBlcicsZnVuY3Rpb24oKXtpZihfdGhpcy4kcGFyZW50LnZpc2libGUpX3RoaXMudXBkYXRlUG9wcGVyKCk7fSk7dGhpcy4kb24oJ2Rlc3Ryb3lQb3BwZXInLHRoaXMuZGVzdHJveVBvcHBlcik7fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL3NlbGVjdC1kcm9wZG93bi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc3JjX3NlbGVjdF9kcm9wZG93bnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz1zZWxlY3RfZHJvcGRvd252dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL3NlbGVjdC1kcm9wZG93bi52dWUKLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciBzZWxlY3RfZHJvcGRvd25fY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChzcmNfc2VsZWN0X2Ryb3Bkb3dudnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLHNlbGVjdF9kcm9wZG93bnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzA2ODI4NzQ4X3JlbmRlcixzZWxlY3RfZHJvcGRvd252dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNjgyODc0OF9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIHNlbGVjdF9kcm9wZG93bl9hcGk7fXNlbGVjdF9kcm9wZG93bl9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL3NlbGVjdC9zcmMvc2VsZWN0LWRyb3Bkb3duLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzZWxlY3RfZHJvcGRvd249c2VsZWN0X2Ryb3Bkb3duX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvc2VsZWN0L3NyYy9vcHRpb24udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTdhNDRjNjQyJgp2YXIgb3B0aW9udnVlX3R5cGVfdGVtcGxhdGVfaWRfN2E0NGM2NDJfcmVuZGVyPWZ1bmN0aW9uIG9wdGlvbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzdhNDRjNjQyX3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygibGkiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTpfdm0udmlzaWJsZSxleHByZXNzaW9uOiJ2aXNpYmxlIn1dLHN0YXRpY0NsYXNzOiJlbC1zZWxlY3QtZHJvcGRvd25fX2l0ZW0iLGNsYXNzOntzZWxlY3RlZDpfdm0uaXRlbVNlbGVjdGVkLCJpcy1kaXNhYmxlZCI6X3ZtLmRpc2FibGVkfHxfdm0uZ3JvdXBEaXNhYmxlZHx8X3ZtLmxpbWl0UmVhY2hlZCxob3Zlcjpfdm0uaG92ZXJ9LG9uOnttb3VzZWVudGVyOl92bS5ob3Zlckl0ZW0sY2xpY2s6ZnVuY3Rpb24gY2xpY2soJGV2ZW50KXskZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7cmV0dXJuIF92bS5zZWxlY3RPcHRpb25DbGljaygkZXZlbnQpO319fSxbX3ZtLl90KCJkZWZhdWx0IixbX2MoInNwYW4iLFtfdm0uX3YoX3ZtLl9zKF92bS5jdXJyZW50TGFiZWwpKV0pXSldLDIpO307dmFyIG9wdGlvbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzdhNDRjNjQyX3N0YXRpY1JlbmRlckZucz1bXTtvcHRpb252dWVfdHlwZV90ZW1wbGF0ZV9pZF83YTQ0YzY0Ml9yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2VsZWN0L3NyYy9vcHRpb24udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTdhNDRjNjQyJgovLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL29wdGlvbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCnZhciBfdHlwZW9mPXR5cGVvZiBTeW1ib2w9PT0iZnVuY3Rpb24iJiZfdHlwZW9mMihTeW1ib2wuaXRlcmF0b3IpPT09InN5bWJvbCI/ZnVuY3Rpb24ob2JqKXtyZXR1cm4gX3R5cGVvZjIob2JqKTt9OmZ1bmN0aW9uKG9iail7cmV0dXJuIG9iaiYmdHlwZW9mIFN5bWJvbD09PSJmdW5jdGlvbiImJm9iai5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmb2JqIT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjpfdHlwZW9mMihvYmopO307Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBvcHRpb252dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e21peGluczpbZW1pdHRlcl9kZWZhdWx0LmFdLG5hbWU6J0VsT3B0aW9uJyxjb21wb25lbnROYW1lOidFbE9wdGlvbicsaW5qZWN0Olsnc2VsZWN0J10scHJvcHM6e3ZhbHVlOntyZXF1aXJlZDp0cnVlfSxsYWJlbDpbU3RyaW5nLE51bWJlcl0sY3JlYXRlZDpCb29sZWFuLGRpc2FibGVkOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDpmYWxzZX19LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybntpbmRleDotMSxncm91cERpc2FibGVkOmZhbHNlLHZpc2libGU6dHJ1ZSxoaXRTdGF0ZTpmYWxzZSxob3ZlcjpmYWxzZX07fSxjb21wdXRlZDp7aXNPYmplY3Q6ZnVuY3Rpb24gaXNPYmplY3QoKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHRoaXMudmFsdWUpLnRvTG93ZXJDYXNlKCk9PT0nW29iamVjdCBvYmplY3RdJzt9LGN1cnJlbnRMYWJlbDpmdW5jdGlvbiBjdXJyZW50TGFiZWwoKXtyZXR1cm4gdGhpcy5sYWJlbHx8KHRoaXMuaXNPYmplY3Q/Jyc6dGhpcy52YWx1ZSk7fSxjdXJyZW50VmFsdWU6ZnVuY3Rpb24gY3VycmVudFZhbHVlKCl7cmV0dXJuIHRoaXMudmFsdWV8fHRoaXMubGFiZWx8fCcnO30saXRlbVNlbGVjdGVkOmZ1bmN0aW9uIGl0ZW1TZWxlY3RlZCgpe2lmKCF0aGlzLnNlbGVjdC5tdWx0aXBsZSl7cmV0dXJuIHRoaXMuaXNFcXVhbCh0aGlzLnZhbHVlLHRoaXMuc2VsZWN0LnZhbHVlKTt9ZWxzZXtyZXR1cm4gdGhpcy5jb250YWlucyh0aGlzLnNlbGVjdC52YWx1ZSx0aGlzLnZhbHVlKTt9fSxsaW1pdFJlYWNoZWQ6ZnVuY3Rpb24gbGltaXRSZWFjaGVkKCl7aWYodGhpcy5zZWxlY3QubXVsdGlwbGUpe3JldHVybiF0aGlzLml0ZW1TZWxlY3RlZCYmKHRoaXMuc2VsZWN0LnZhbHVlfHxbXSkubGVuZ3RoPj10aGlzLnNlbGVjdC5tdWx0aXBsZUxpbWl0JiZ0aGlzLnNlbGVjdC5tdWx0aXBsZUxpbWl0PjA7fWVsc2V7cmV0dXJuIGZhbHNlO319fSx3YXRjaDp7Y3VycmVudExhYmVsOmZ1bmN0aW9uIGN1cnJlbnRMYWJlbCgpe2lmKCF0aGlzLmNyZWF0ZWQmJiF0aGlzLnNlbGVjdC5yZW1vdGUpdGhpcy5kaXNwYXRjaCgnRWxTZWxlY3QnLCdzZXRTZWxlY3RlZCcpO30sdmFsdWU6ZnVuY3Rpb24gdmFsdWUodmFsLG9sZFZhbCl7dmFyIF9zZWxlY3Q9dGhpcy5zZWxlY3QscmVtb3RlPV9zZWxlY3QucmVtb3RlLHZhbHVlS2V5PV9zZWxlY3QudmFsdWVLZXk7aWYoIXRoaXMuY3JlYXRlZCYmIXJlbW90ZSl7aWYodmFsdWVLZXkmJih0eXBlb2YgdmFsPT09J3VuZGVmaW5lZCc/J3VuZGVmaW5lZCc6X3R5cGVvZih2YWwpKT09PSdvYmplY3QnJiYodHlwZW9mIG9sZFZhbD09PSd1bmRlZmluZWQnPyd1bmRlZmluZWQnOl90eXBlb2Yob2xkVmFsKSk9PT0nb2JqZWN0JyYmdmFsW3ZhbHVlS2V5XT09PW9sZFZhbFt2YWx1ZUtleV0pe3JldHVybjt9dGhpcy5kaXNwYXRjaCgnRWxTZWxlY3QnLCdzZXRTZWxlY3RlZCcpO319fSxtZXRob2RzOntpc0VxdWFsOmZ1bmN0aW9uIGlzRXF1YWwoYSxiKXtpZighdGhpcy5pc09iamVjdCl7cmV0dXJuIGE9PT1iO31lbHNle3ZhciB2YWx1ZUtleT10aGlzLnNlbGVjdC52YWx1ZUtleTtyZXR1cm4gT2JqZWN0KHV0aWxfWyJnZXRWYWx1ZUJ5UGF0aCJdKShhLHZhbHVlS2V5KT09PU9iamVjdCh1dGlsX1siZ2V0VmFsdWVCeVBhdGgiXSkoYix2YWx1ZUtleSk7fX0sY29udGFpbnM6ZnVuY3Rpb24gY29udGFpbnMoKXt2YXIgYXJyPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dW5kZWZpbmVkP2FyZ3VtZW50c1swXTpbXTt2YXIgdGFyZ2V0PWFyZ3VtZW50c1sxXTtpZighdGhpcy5pc09iamVjdCl7cmV0dXJuIGFyciYmYXJyLmluZGV4T2YodGFyZ2V0KT4tMTt9ZWxzZXt2YXIgdmFsdWVLZXk9dGhpcy5zZWxlY3QudmFsdWVLZXk7cmV0dXJuIGFyciYmYXJyLnNvbWUoZnVuY3Rpb24oaXRlbSl7cmV0dXJuIE9iamVjdCh1dGlsX1siZ2V0VmFsdWVCeVBhdGgiXSkoaXRlbSx2YWx1ZUtleSk9PT1PYmplY3QodXRpbF9bImdldFZhbHVlQnlQYXRoIl0pKHRhcmdldCx2YWx1ZUtleSk7fSk7fX0saGFuZGxlR3JvdXBEaXNhYmxlZDpmdW5jdGlvbiBoYW5kbGVHcm91cERpc2FibGVkKHZhbCl7dGhpcy5ncm91cERpc2FibGVkPXZhbDt9LGhvdmVySXRlbTpmdW5jdGlvbiBob3Zlckl0ZW0oKXtpZighdGhpcy5kaXNhYmxlZCYmIXRoaXMuZ3JvdXBEaXNhYmxlZCl7dGhpcy5zZWxlY3QuaG92ZXJJbmRleD10aGlzLnNlbGVjdC5vcHRpb25zLmluZGV4T2YodGhpcyk7fX0sc2VsZWN0T3B0aW9uQ2xpY2s6ZnVuY3Rpb24gc2VsZWN0T3B0aW9uQ2xpY2soKXtpZih0aGlzLmRpc2FibGVkIT09dHJ1ZSYmdGhpcy5ncm91cERpc2FibGVkIT09dHJ1ZSl7dGhpcy5kaXNwYXRjaCgnRWxTZWxlY3QnLCdoYW5kbGVPcHRpb25DbGljaycsW3RoaXMsdHJ1ZV0pO319LHF1ZXJ5Q2hhbmdlOmZ1bmN0aW9uIHF1ZXJ5Q2hhbmdlKHF1ZXJ5KXt0aGlzLnZpc2libGU9bmV3IFJlZ0V4cChPYmplY3QodXRpbF9bImVzY2FwZVJlZ2V4cFN0cmluZyJdKShxdWVyeSksJ2knKS50ZXN0KHRoaXMuY3VycmVudExhYmVsKXx8dGhpcy5jcmVhdGVkO2lmKCF0aGlzLnZpc2libGUpe3RoaXMuc2VsZWN0LmZpbHRlcmVkT3B0aW9uc0NvdW50LS07fX19LGNyZWF0ZWQ6ZnVuY3Rpb24gY3JlYXRlZCgpe3RoaXMuc2VsZWN0Lm9wdGlvbnMucHVzaCh0aGlzKTt0aGlzLnNlbGVjdC5jYWNoZWRPcHRpb25zLnB1c2godGhpcyk7dGhpcy5zZWxlY3Qub3B0aW9uc0NvdW50Kys7dGhpcy5zZWxlY3QuZmlsdGVyZWRPcHRpb25zQ291bnQrKzt0aGlzLiRvbigncXVlcnlDaGFuZ2UnLHRoaXMucXVlcnlDaGFuZ2UpO3RoaXMuJG9uKCdoYW5kbGVHcm91cERpc2FibGVkJyx0aGlzLmhhbmRsZUdyb3VwRGlzYWJsZWQpO30sYmVmb3JlRGVzdHJveTpmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCl7dmFyIF9zZWxlY3QyPXRoaXMuc2VsZWN0LHNlbGVjdGVkPV9zZWxlY3QyLnNlbGVjdGVkLG11bHRpcGxlPV9zZWxlY3QyLm11bHRpcGxlO3ZhciBzZWxlY3RlZE9wdGlvbnM9bXVsdGlwbGU/c2VsZWN0ZWQ6W3NlbGVjdGVkXTt2YXIgaW5kZXg9dGhpcy5zZWxlY3QuY2FjaGVkT3B0aW9ucy5pbmRleE9mKHRoaXMpO3ZhciBzZWxlY3RlZEluZGV4PXNlbGVjdGVkT3B0aW9ucy5pbmRleE9mKHRoaXMpOy8vIGlmIG9wdGlvbiBpcyBub3Qgc2VsZWN0ZWQsIHJlbW92ZSBpdCBmcm9tIGNhY2hlCmlmKGluZGV4Pi0xJiZzZWxlY3RlZEluZGV4PDApe3RoaXMuc2VsZWN0LmNhY2hlZE9wdGlvbnMuc3BsaWNlKGluZGV4LDEpO310aGlzLnNlbGVjdC5vbk9wdGlvbkRlc3Ryb3kodGhpcy5zZWxlY3Qub3B0aW9ucy5pbmRleE9mKHRoaXMpKTt9fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NlbGVjdC9zcmMvb3B0aW9uLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfb3B0aW9udnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPW9wdGlvbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NlbGVjdC9zcmMvb3B0aW9uLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIG9wdGlvbl9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHNyY19vcHRpb252dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sb3B0aW9udnVlX3R5cGVfdGVtcGxhdGVfaWRfN2E0NGM2NDJfcmVuZGVyLG9wdGlvbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzdhNDRjNjQyX3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgb3B0aW9uX2FwaTt9b3B0aW9uX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvc2VsZWN0L3NyYy9vcHRpb24udnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHNyY19vcHRpb249b3B0aW9uX2NvbXBvbmVudC5leHBvcnRzOy8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgImVsZW1lbnQtdWkvbGliL3RhZyIKdmFyIHRhZ189X193ZWJwYWNrX3JlcXVpcmVfXygzMCk7dmFyIHRhZ19kZWZhdWx0PS8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4odGFnXyk7Ly8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCAiZWxlbWVudC11aS9saWIvdXRpbHMvcmVzaXplLWV2ZW50Igp2YXIgcmVzaXplX2V2ZW50Xz1fX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTsvLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsICJlbGVtZW50LXVpL2xpYi9sb2NhbGUiCnZhciBsaWJfbG9jYWxlXz1fX3dlYnBhY2tfcmVxdWlyZV9fKDExKTt2YXIgbGliX2xvY2FsZV9kZWZhdWx0PS8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4obGliX2xvY2FsZV8pOy8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgImVsZW1lbnQtdWkvbGliL3V0aWxzL3Njcm9sbC1pbnRvLXZpZXciCnZhciBzY3JvbGxfaW50b192aWV3Xz1fX3dlYnBhY2tfcmVxdWlyZV9fKDI3KTt2YXIgc2Nyb2xsX2ludG9fdmlld19kZWZhdWx0PS8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oc2Nyb2xsX2ludG9fdmlld18pOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2VsZWN0L3NyYy9uYXZpZ2F0aW9uLW1peGluLmpzCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgbmF2aWdhdGlvbl9taXhpbj17ZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue2hvdmVyT3B0aW9uOi0xfTt9LGNvbXB1dGVkOntvcHRpb25zQWxsRGlzYWJsZWQ6ZnVuY3Rpb24gb3B0aW9uc0FsbERpc2FibGVkKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5maWx0ZXIoZnVuY3Rpb24ob3B0aW9uKXtyZXR1cm4gb3B0aW9uLnZpc2libGU7fSkuZXZlcnkoZnVuY3Rpb24ob3B0aW9uKXtyZXR1cm4gb3B0aW9uLmRpc2FibGVkO30pO319LHdhdGNoOntob3ZlckluZGV4OmZ1bmN0aW9uIGhvdmVySW5kZXgodmFsKXt2YXIgX3RoaXM9dGhpcztpZih0eXBlb2YgdmFsPT09J251bWJlcicmJnZhbD4tMSl7dGhpcy5ob3Zlck9wdGlvbj10aGlzLm9wdGlvbnNbdmFsXXx8e307fXRoaXMub3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKG9wdGlvbil7b3B0aW9uLmhvdmVyPV90aGlzLmhvdmVyT3B0aW9uPT09b3B0aW9uO30pO319LG1ldGhvZHM6e25hdmlnYXRlT3B0aW9uczpmdW5jdGlvbiBuYXZpZ2F0ZU9wdGlvbnMoZGlyZWN0aW9uKXt2YXIgX3RoaXMyPXRoaXM7aWYoIXRoaXMudmlzaWJsZSl7dGhpcy52aXNpYmxlPXRydWU7cmV0dXJuO31pZih0aGlzLm9wdGlvbnMubGVuZ3RoPT09MHx8dGhpcy5maWx0ZXJlZE9wdGlvbnNDb3VudD09PTApcmV0dXJuO2lmKCF0aGlzLm9wdGlvbnNBbGxEaXNhYmxlZCl7aWYoZGlyZWN0aW9uPT09J25leHQnKXt0aGlzLmhvdmVySW5kZXgrKztpZih0aGlzLmhvdmVySW5kZXg9PT10aGlzLm9wdGlvbnMubGVuZ3RoKXt0aGlzLmhvdmVySW5kZXg9MDt9fWVsc2UgaWYoZGlyZWN0aW9uPT09J3ByZXYnKXt0aGlzLmhvdmVySW5kZXgtLTtpZih0aGlzLmhvdmVySW5kZXg8MCl7dGhpcy5ob3ZlckluZGV4PXRoaXMub3B0aW9ucy5sZW5ndGgtMTt9fXZhciBvcHRpb249dGhpcy5vcHRpb25zW3RoaXMuaG92ZXJJbmRleF07aWYob3B0aW9uLmRpc2FibGVkPT09dHJ1ZXx8b3B0aW9uLmdyb3VwRGlzYWJsZWQ9PT10cnVlfHwhb3B0aW9uLnZpc2libGUpe3RoaXMubmF2aWdhdGVPcHRpb25zKGRpcmVjdGlvbik7fXRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uKCl7cmV0dXJuIF90aGlzMi5zY3JvbGxUb09wdGlvbihfdGhpczIuaG92ZXJPcHRpb24pO30pO319fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvc2VsZWN0L3NyYy9zZWxlY3QudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHNlbGVjdHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17bWl4aW5zOltlbWl0dGVyX2RlZmF1bHQuYSxsb2NhbGVfZGVmYXVsdC5hLGZvY3VzX2RlZmF1bHQoKSgncmVmZXJlbmNlJyksbmF2aWdhdGlvbl9taXhpbl0sbmFtZTonRWxTZWxlY3QnLGNvbXBvbmVudE5hbWU6J0VsU2VsZWN0JyxpbmplY3Q6e2VsRm9ybTp7ZGVmYXVsdDonJ30sZWxGb3JtSXRlbTp7ZGVmYXVsdDonJ319LHByb3ZpZGU6ZnVuY3Rpb24gcHJvdmlkZSgpe3JldHVybnsnc2VsZWN0Jzp0aGlzfTt9LGNvbXB1dGVkOntfZWxGb3JtSXRlbVNpemU6ZnVuY3Rpb24gX2VsRm9ybUl0ZW1TaXplKCl7cmV0dXJuKHRoaXMuZWxGb3JtSXRlbXx8e30pLmVsRm9ybUl0ZW1TaXplO30scmVhZG9ubHk6ZnVuY3Rpb24gcmVhZG9ubHkoKXtyZXR1cm4hdGhpcy5maWx0ZXJhYmxlfHx0aGlzLm11bHRpcGxlfHwhT2JqZWN0KHV0aWxfWyJpc0lFIl0pKCkmJiFPYmplY3QodXRpbF9bImlzRWRnZSJdKSgpJiYhdGhpcy52aXNpYmxlO30sc2hvd0Nsb3NlOmZ1bmN0aW9uIHNob3dDbG9zZSgpe3ZhciBoYXNWYWx1ZT10aGlzLm11bHRpcGxlP0FycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkmJnRoaXMudmFsdWUubGVuZ3RoPjA6dGhpcy52YWx1ZSE9PXVuZGVmaW5lZCYmdGhpcy52YWx1ZSE9PW51bGwmJnRoaXMudmFsdWUhPT0nJzt2YXIgY3JpdGVyaWE9dGhpcy5jbGVhcmFibGUmJiF0aGlzLnNlbGVjdERpc2FibGVkJiZ0aGlzLmlucHV0SG92ZXJpbmcmJmhhc1ZhbHVlO3JldHVybiBjcml0ZXJpYTt9LGljb25DbGFzczpmdW5jdGlvbiBpY29uQ2xhc3MoKXtyZXR1cm4gdGhpcy5yZW1vdGUmJnRoaXMuZmlsdGVyYWJsZT8nJzp0aGlzLnZpc2libGU/J2Fycm93LXVwIGlzLXJldmVyc2UnOidhcnJvdy11cCc7fSxkZWJvdW5jZTpmdW5jdGlvbiBkZWJvdW5jZSgpe3JldHVybiB0aGlzLnJlbW90ZT8zMDA6MDt9LGVtcHR5VGV4dDpmdW5jdGlvbiBlbXB0eVRleHQoKXtpZih0aGlzLmxvYWRpbmcpe3JldHVybiB0aGlzLmxvYWRpbmdUZXh0fHx0aGlzLnQoJ2VsLnNlbGVjdC5sb2FkaW5nJyk7fWVsc2V7aWYodGhpcy5yZW1vdGUmJnRoaXMucXVlcnk9PT0nJyYmdGhpcy5vcHRpb25zLmxlbmd0aD09PTApcmV0dXJuIGZhbHNlO2lmKHRoaXMuZmlsdGVyYWJsZSYmdGhpcy5xdWVyeSYmdGhpcy5vcHRpb25zLmxlbmd0aD4wJiZ0aGlzLmZpbHRlcmVkT3B0aW9uc0NvdW50PT09MCl7cmV0dXJuIHRoaXMubm9NYXRjaFRleHR8fHRoaXMudCgnZWwuc2VsZWN0Lm5vTWF0Y2gnKTt9aWYodGhpcy5vcHRpb25zLmxlbmd0aD09PTApe3JldHVybiB0aGlzLm5vRGF0YVRleHR8fHRoaXMudCgnZWwuc2VsZWN0Lm5vRGF0YScpO319cmV0dXJuIG51bGw7fSxzaG93TmV3T3B0aW9uOmZ1bmN0aW9uIHNob3dOZXdPcHRpb24oKXt2YXIgX3RoaXM9dGhpczt2YXIgaGFzRXhpc3RpbmdPcHRpb249dGhpcy5vcHRpb25zLmZpbHRlcihmdW5jdGlvbihvcHRpb24pe3JldHVybiFvcHRpb24uY3JlYXRlZDt9KS5zb21lKGZ1bmN0aW9uKG9wdGlvbil7cmV0dXJuIG9wdGlvbi5jdXJyZW50TGFiZWw9PT1fdGhpcy5xdWVyeTt9KTtyZXR1cm4gdGhpcy5maWx0ZXJhYmxlJiZ0aGlzLmFsbG93Q3JlYXRlJiZ0aGlzLnF1ZXJ5IT09JycmJiFoYXNFeGlzdGluZ09wdGlvbjt9LHNlbGVjdFNpemU6ZnVuY3Rpb24gc2VsZWN0U2l6ZSgpe3JldHVybiB0aGlzLnNpemV8fHRoaXMuX2VsRm9ybUl0ZW1TaXplfHwodGhpcy4kRUxFTUVOVHx8e30pLnNpemU7fSxzZWxlY3REaXNhYmxlZDpmdW5jdGlvbiBzZWxlY3REaXNhYmxlZCgpe3JldHVybiB0aGlzLmRpc2FibGVkfHwodGhpcy5lbEZvcm18fHt9KS5kaXNhYmxlZDt9LGNvbGxhcHNlVGFnU2l6ZTpmdW5jdGlvbiBjb2xsYXBzZVRhZ1NpemUoKXtyZXR1cm5bJ3NtYWxsJywnbWluaSddLmluZGV4T2YodGhpcy5zZWxlY3RTaXplKT4tMT8nbWluaSc6J3NtYWxsJzt9fSxjb21wb25lbnRzOntFbElucHV0OmlucHV0X2RlZmF1bHQuYSxFbFNlbGVjdE1lbnU6c2VsZWN0X2Ryb3Bkb3duLEVsT3B0aW9uOnNyY19vcHRpb24sRWxUYWc6dGFnX2RlZmF1bHQuYSxFbFNjcm9sbGJhcjpzY3JvbGxiYXJfZGVmYXVsdC5hfSxkaXJlY3RpdmVzOntDbGlja291dHNpZGU6Y2xpY2tvdXRzaWRlX2RlZmF1bHQuYX0scHJvcHM6e25hbWU6U3RyaW5nLGlkOlN0cmluZyx2YWx1ZTp7cmVxdWlyZWQ6dHJ1ZX0sYXV0b2NvbXBsZXRlOnt0eXBlOlN0cmluZyxkZWZhdWx0OidvZmYnfSwvKiogQERlcHJlY2F0ZWQgaW4gbmV4dCBtYWpvciB2ZXJzaW9uICovYXV0b0NvbXBsZXRlOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24gdmFsaWRhdG9yKHZhbCl7ZmFsc2UmJmZhbHNlO3JldHVybiB0cnVlO319LGF1dG9tYXRpY0Ryb3Bkb3duOkJvb2xlYW4sc2l6ZTpTdHJpbmcsZGlzYWJsZWQ6Qm9vbGVhbixjbGVhcmFibGU6Qm9vbGVhbixmaWx0ZXJhYmxlOkJvb2xlYW4sYWxsb3dDcmVhdGU6Qm9vbGVhbixsb2FkaW5nOkJvb2xlYW4scG9wcGVyQ2xhc3M6U3RyaW5nLHJlbW90ZTpCb29sZWFuLGxvYWRpbmdUZXh0OlN0cmluZyxub01hdGNoVGV4dDpTdHJpbmcsbm9EYXRhVGV4dDpTdHJpbmcscmVtb3RlTWV0aG9kOkZ1bmN0aW9uLGZpbHRlck1ldGhvZDpGdW5jdGlvbixtdWx0aXBsZTpCb29sZWFuLG11bHRpcGxlTGltaXQ6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MH0scGxhY2Vob2xkZXI6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6ZnVuY3Rpb24gX2RlZmF1bHQoKXtyZXR1cm4gT2JqZWN0KGxpYl9sb2NhbGVfWyJ0Il0pKCdlbC5zZWxlY3QucGxhY2Vob2xkZXInKTt9fSxkZWZhdWx0Rmlyc3RPcHRpb246Qm9vbGVhbixyZXNlcnZlS2V5d29yZDpCb29sZWFuLHZhbHVlS2V5Ont0eXBlOlN0cmluZyxkZWZhdWx0Oid2YWx1ZSd9LGNvbGxhcHNlVGFnczpCb29sZWFuLHBvcHBlckFwcGVuZFRvQm9keTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6dHJ1ZX19LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybntvcHRpb25zOltdLGNhY2hlZE9wdGlvbnM6W10sY3JlYXRlZExhYmVsOm51bGwsY3JlYXRlZFNlbGVjdGVkOmZhbHNlLHNlbGVjdGVkOnRoaXMubXVsdGlwbGU/W106e30saW5wdXRMZW5ndGg6MjAsaW5wdXRXaWR0aDowLGluaXRpYWxJbnB1dEhlaWdodDowLGNhY2hlZFBsYWNlSG9sZGVyOicnLG9wdGlvbnNDb3VudDowLGZpbHRlcmVkT3B0aW9uc0NvdW50OjAsdmlzaWJsZTpmYWxzZSxzb2Z0Rm9jdXM6ZmFsc2Usc2VsZWN0ZWRMYWJlbDonJyxob3ZlckluZGV4Oi0xLHF1ZXJ5OicnLHByZXZpb3VzUXVlcnk6bnVsbCxpbnB1dEhvdmVyaW5nOmZhbHNlLGN1cnJlbnRQbGFjZWhvbGRlcjonJyxtZW51VmlzaWJsZU9uRm9jdXM6ZmFsc2UsaXNPbkNvbXBvc2l0aW9uOmZhbHNlLGlzU2lsZW50Qmx1cjpmYWxzZX07fSx3YXRjaDp7c2VsZWN0RGlzYWJsZWQ6ZnVuY3Rpb24gc2VsZWN0RGlzYWJsZWQoKXt2YXIgX3RoaXMyPXRoaXM7dGhpcy4kbmV4dFRpY2soZnVuY3Rpb24oKXtfdGhpczIucmVzZXRJbnB1dEhlaWdodCgpO30pO30scGxhY2Vob2xkZXI6ZnVuY3Rpb24gcGxhY2Vob2xkZXIodmFsKXt0aGlzLmNhY2hlZFBsYWNlSG9sZGVyPXRoaXMuY3VycmVudFBsYWNlaG9sZGVyPXZhbDt9LHZhbHVlOmZ1bmN0aW9uIHZhbHVlKHZhbCxvbGRWYWwpe2lmKHRoaXMubXVsdGlwbGUpe3RoaXMucmVzZXRJbnB1dEhlaWdodCgpO2lmKHZhbCYmdmFsLmxlbmd0aD4wfHx0aGlzLiRyZWZzLmlucHV0JiZ0aGlzLnF1ZXJ5IT09Jycpe3RoaXMuY3VycmVudFBsYWNlaG9sZGVyPScnO31lbHNle3RoaXMuY3VycmVudFBsYWNlaG9sZGVyPXRoaXMuY2FjaGVkUGxhY2VIb2xkZXI7fWlmKHRoaXMuZmlsdGVyYWJsZSYmIXRoaXMucmVzZXJ2ZUtleXdvcmQpe3RoaXMucXVlcnk9Jyc7dGhpcy5oYW5kbGVRdWVyeUNoYW5nZSh0aGlzLnF1ZXJ5KTt9fXRoaXMuc2V0U2VsZWN0ZWQoKTtpZih0aGlzLmZpbHRlcmFibGUmJiF0aGlzLm11bHRpcGxlKXt0aGlzLmlucHV0TGVuZ3RoPTIwO31pZighT2JqZWN0KHV0aWxfWyJ2YWx1ZUVxdWFscyJdKSh2YWwsb2xkVmFsKSl7dGhpcy5kaXNwYXRjaCgnRWxGb3JtSXRlbScsJ2VsLmZvcm0uY2hhbmdlJyx2YWwpO319LHZpc2libGU6ZnVuY3Rpb24gdmlzaWJsZSh2YWwpe3ZhciBfdGhpczM9dGhpcztpZighdmFsKXt0aGlzLmJyb2FkY2FzdCgnRWxTZWxlY3REcm9wZG93bicsJ2Rlc3Ryb3lQb3BwZXInKTtpZih0aGlzLiRyZWZzLmlucHV0KXt0aGlzLiRyZWZzLmlucHV0LmJsdXIoKTt9dGhpcy5xdWVyeT0nJzt0aGlzLnByZXZpb3VzUXVlcnk9bnVsbDt0aGlzLnNlbGVjdGVkTGFiZWw9Jyc7dGhpcy5pbnB1dExlbmd0aD0yMDt0aGlzLm1lbnVWaXNpYmxlT25Gb2N1cz1mYWxzZTt0aGlzLnJlc2V0SG92ZXJJbmRleCgpO3RoaXMuJG5leHRUaWNrKGZ1bmN0aW9uKCl7aWYoX3RoaXMzLiRyZWZzLmlucHV0JiZfdGhpczMuJHJlZnMuaW5wdXQudmFsdWU9PT0nJyYmX3RoaXMzLnNlbGVjdGVkLmxlbmd0aD09PTApe190aGlzMy5jdXJyZW50UGxhY2Vob2xkZXI9X3RoaXMzLmNhY2hlZFBsYWNlSG9sZGVyO319KTtpZighdGhpcy5tdWx0aXBsZSl7aWYodGhpcy5zZWxlY3RlZCl7aWYodGhpcy5maWx0ZXJhYmxlJiZ0aGlzLmFsbG93Q3JlYXRlJiZ0aGlzLmNyZWF0ZWRTZWxlY3RlZCYmdGhpcy5jcmVhdGVkTGFiZWwpe3RoaXMuc2VsZWN0ZWRMYWJlbD10aGlzLmNyZWF0ZWRMYWJlbDt9ZWxzZXt0aGlzLnNlbGVjdGVkTGFiZWw9dGhpcy5zZWxlY3RlZC5jdXJyZW50TGFiZWw7fWlmKHRoaXMuZmlsdGVyYWJsZSl0aGlzLnF1ZXJ5PXRoaXMuc2VsZWN0ZWRMYWJlbDt9aWYodGhpcy5maWx0ZXJhYmxlKXt0aGlzLmN1cnJlbnRQbGFjZWhvbGRlcj10aGlzLmNhY2hlZFBsYWNlSG9sZGVyO319fWVsc2V7dGhpcy5icm9hZGNhc3QoJ0VsU2VsZWN0RHJvcGRvd24nLCd1cGRhdGVQb3BwZXInKTtpZih0aGlzLmZpbHRlcmFibGUpe3RoaXMucXVlcnk9dGhpcy5yZW1vdGU/Jyc6dGhpcy5zZWxlY3RlZExhYmVsO3RoaXMuaGFuZGxlUXVlcnlDaGFuZ2UodGhpcy5xdWVyeSk7aWYodGhpcy5tdWx0aXBsZSl7dGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpO31lbHNle2lmKCF0aGlzLnJlbW90ZSl7dGhpcy5icm9hZGNhc3QoJ0VsT3B0aW9uJywncXVlcnlDaGFuZ2UnLCcnKTt0aGlzLmJyb2FkY2FzdCgnRWxPcHRpb25Hcm91cCcsJ3F1ZXJ5Q2hhbmdlJyk7fWlmKHRoaXMuc2VsZWN0ZWRMYWJlbCl7dGhpcy5jdXJyZW50UGxhY2Vob2xkZXI9dGhpcy5zZWxlY3RlZExhYmVsO3RoaXMuc2VsZWN0ZWRMYWJlbD0nJzt9fX19dGhpcy4kZW1pdCgndmlzaWJsZS1jaGFuZ2UnLHZhbCk7fSxvcHRpb25zOmZ1bmN0aW9uIG9wdGlvbnMoKXt2YXIgX3RoaXM0PXRoaXM7aWYodGhpcy4kaXNTZXJ2ZXIpcmV0dXJuO3RoaXMuJG5leHRUaWNrKGZ1bmN0aW9uKCl7X3RoaXM0LmJyb2FkY2FzdCgnRWxTZWxlY3REcm9wZG93bicsJ3VwZGF0ZVBvcHBlcicpO30pO2lmKHRoaXMubXVsdGlwbGUpe3RoaXMucmVzZXRJbnB1dEhlaWdodCgpO312YXIgaW5wdXRzPXRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0Jyk7aWYoW10uaW5kZXhPZi5jYWxsKGlucHV0cyxkb2N1bWVudC5hY3RpdmVFbGVtZW50KT09PS0xKXt0aGlzLnNldFNlbGVjdGVkKCk7fWlmKHRoaXMuZGVmYXVsdEZpcnN0T3B0aW9uJiYodGhpcy5maWx0ZXJhYmxlfHx0aGlzLnJlbW90ZSkmJnRoaXMuZmlsdGVyZWRPcHRpb25zQ291bnQpe3RoaXMuY2hlY2tEZWZhdWx0Rmlyc3RPcHRpb24oKTt9fX0sbWV0aG9kczp7aGFuZGxlQ29tcG9zaXRpb246ZnVuY3Rpb24gaGFuZGxlQ29tcG9zaXRpb24oZXZlbnQpe3ZhciBfdGhpczU9dGhpczt2YXIgdGV4dD1ldmVudC50YXJnZXQudmFsdWU7aWYoZXZlbnQudHlwZT09PSdjb21wb3NpdGlvbmVuZCcpe3RoaXMuaXNPbkNvbXBvc2l0aW9uPWZhbHNlO3RoaXMuJG5leHRUaWNrKGZ1bmN0aW9uKF8pe3JldHVybiBfdGhpczUuaGFuZGxlUXVlcnlDaGFuZ2UodGV4dCk7fSk7fWVsc2V7dmFyIGxhc3RDaGFyYWN0ZXI9dGV4dFt0ZXh0Lmxlbmd0aC0xXXx8Jyc7dGhpcy5pc09uQ29tcG9zaXRpb249IU9iamVjdChzaGFyZWRfWyJpc0tvcmVhbiJdKShsYXN0Q2hhcmFjdGVyKTt9fSxoYW5kbGVRdWVyeUNoYW5nZTpmdW5jdGlvbiBoYW5kbGVRdWVyeUNoYW5nZSh2YWwpe3ZhciBfdGhpczY9dGhpcztpZih0aGlzLnByZXZpb3VzUXVlcnk9PT12YWx8fHRoaXMuaXNPbkNvbXBvc2l0aW9uKXJldHVybjtpZih0aGlzLnByZXZpb3VzUXVlcnk9PT1udWxsJiYodHlwZW9mIHRoaXMuZmlsdGVyTWV0aG9kPT09J2Z1bmN0aW9uJ3x8dHlwZW9mIHRoaXMucmVtb3RlTWV0aG9kPT09J2Z1bmN0aW9uJykpe3RoaXMucHJldmlvdXNRdWVyeT12YWw7cmV0dXJuO310aGlzLnByZXZpb3VzUXVlcnk9dmFsO3RoaXMuJG5leHRUaWNrKGZ1bmN0aW9uKCl7aWYoX3RoaXM2LnZpc2libGUpX3RoaXM2LmJyb2FkY2FzdCgnRWxTZWxlY3REcm9wZG93bicsJ3VwZGF0ZVBvcHBlcicpO30pO3RoaXMuaG92ZXJJbmRleD0tMTtpZih0aGlzLm11bHRpcGxlJiZ0aGlzLmZpbHRlcmFibGUpe3RoaXMuJG5leHRUaWNrKGZ1bmN0aW9uKCl7dmFyIGxlbmd0aD1fdGhpczYuJHJlZnMuaW5wdXQudmFsdWUubGVuZ3RoKjE1KzIwO190aGlzNi5pbnB1dExlbmd0aD1fdGhpczYuY29sbGFwc2VUYWdzP01hdGgubWluKDUwLGxlbmd0aCk6bGVuZ3RoO190aGlzNi5tYW5hZ2VQbGFjZWhvbGRlcigpO190aGlzNi5yZXNldElucHV0SGVpZ2h0KCk7fSk7fWlmKHRoaXMucmVtb3RlJiZ0eXBlb2YgdGhpcy5yZW1vdGVNZXRob2Q9PT0nZnVuY3Rpb24nKXt0aGlzLmhvdmVySW5kZXg9LTE7dGhpcy5yZW1vdGVNZXRob2QodmFsKTt9ZWxzZSBpZih0eXBlb2YgdGhpcy5maWx0ZXJNZXRob2Q9PT0nZnVuY3Rpb24nKXt0aGlzLmZpbHRlck1ldGhvZCh2YWwpO3RoaXMuYnJvYWRjYXN0KCdFbE9wdGlvbkdyb3VwJywncXVlcnlDaGFuZ2UnKTt9ZWxzZXt0aGlzLmZpbHRlcmVkT3B0aW9uc0NvdW50PXRoaXMub3B0aW9uc0NvdW50O3RoaXMuYnJvYWRjYXN0KCdFbE9wdGlvbicsJ3F1ZXJ5Q2hhbmdlJyx2YWwpO3RoaXMuYnJvYWRjYXN0KCdFbE9wdGlvbkdyb3VwJywncXVlcnlDaGFuZ2UnKTt9aWYodGhpcy5kZWZhdWx0Rmlyc3RPcHRpb24mJih0aGlzLmZpbHRlcmFibGV8fHRoaXMucmVtb3RlKSYmdGhpcy5maWx0ZXJlZE9wdGlvbnNDb3VudCl7dGhpcy5jaGVja0RlZmF1bHRGaXJzdE9wdGlvbigpO319LHNjcm9sbFRvT3B0aW9uOmZ1bmN0aW9uIHNjcm9sbFRvT3B0aW9uKG9wdGlvbil7dmFyIHRhcmdldD1BcnJheS5pc0FycmF5KG9wdGlvbikmJm9wdGlvblswXT9vcHRpb25bMF0uJGVsOm9wdGlvbi4kZWw7aWYodGhpcy4kcmVmcy5wb3BwZXImJnRhcmdldCl7dmFyIG1lbnU9dGhpcy4kcmVmcy5wb3BwZXIuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5lbC1zZWxlY3QtZHJvcGRvd25fX3dyYXAnKTtzY3JvbGxfaW50b192aWV3X2RlZmF1bHQoKShtZW51LHRhcmdldCk7fXRoaXMuJHJlZnMuc2Nyb2xsYmFyJiZ0aGlzLiRyZWZzLnNjcm9sbGJhci5oYW5kbGVTY3JvbGwoKTt9LGhhbmRsZU1lbnVFbnRlcjpmdW5jdGlvbiBoYW5kbGVNZW51RW50ZXIoKXt2YXIgX3RoaXM3PXRoaXM7dGhpcy4kbmV4dFRpY2soZnVuY3Rpb24oKXtyZXR1cm4gX3RoaXM3LnNjcm9sbFRvT3B0aW9uKF90aGlzNy5zZWxlY3RlZCk7fSk7fSxlbWl0Q2hhbmdlOmZ1bmN0aW9uIGVtaXRDaGFuZ2UodmFsKXtpZighT2JqZWN0KHV0aWxfWyJ2YWx1ZUVxdWFscyJdKSh0aGlzLnZhbHVlLHZhbCkpe3RoaXMuJGVtaXQoJ2NoYW5nZScsdmFsKTt9fSxnZXRPcHRpb246ZnVuY3Rpb24gZ2V0T3B0aW9uKHZhbHVlKXt2YXIgb3B0aW9uPXZvaWQgMDt2YXIgaXNPYmplY3Q9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKS50b0xvd2VyQ2FzZSgpPT09J1tvYmplY3Qgb2JqZWN0XSc7dmFyIGlzTnVsbD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLnRvTG93ZXJDYXNlKCk9PT0nW29iamVjdCBudWxsXSc7dmFyIGlzVW5kZWZpbmVkPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkudG9Mb3dlckNhc2UoKT09PSdbb2JqZWN0IHVuZGVmaW5lZF0nO2Zvcih2YXIgaT10aGlzLmNhY2hlZE9wdGlvbnMubGVuZ3RoLTE7aT49MDtpLS0pe3ZhciBjYWNoZWRPcHRpb249dGhpcy5jYWNoZWRPcHRpb25zW2ldO3ZhciBpc0VxdWFsPWlzT2JqZWN0P09iamVjdCh1dGlsX1siZ2V0VmFsdWVCeVBhdGgiXSkoY2FjaGVkT3B0aW9uLnZhbHVlLHRoaXMudmFsdWVLZXkpPT09T2JqZWN0KHV0aWxfWyJnZXRWYWx1ZUJ5UGF0aCJdKSh2YWx1ZSx0aGlzLnZhbHVlS2V5KTpjYWNoZWRPcHRpb24udmFsdWU9PT12YWx1ZTtpZihpc0VxdWFsKXtvcHRpb249Y2FjaGVkT3B0aW9uO2JyZWFrO319aWYob3B0aW9uKXJldHVybiBvcHRpb247dmFyIGxhYmVsPSFpc09iamVjdCYmIWlzTnVsbCYmIWlzVW5kZWZpbmVkP3ZhbHVlOicnO3ZhciBuZXdPcHRpb249e3ZhbHVlOnZhbHVlLGN1cnJlbnRMYWJlbDpsYWJlbH07aWYodGhpcy5tdWx0aXBsZSl7bmV3T3B0aW9uLmhpdFN0YXRlPWZhbHNlO31yZXR1cm4gbmV3T3B0aW9uO30sc2V0U2VsZWN0ZWQ6ZnVuY3Rpb24gc2V0U2VsZWN0ZWQoKXt2YXIgX3RoaXM4PXRoaXM7aWYoIXRoaXMubXVsdGlwbGUpe3ZhciBvcHRpb249dGhpcy5nZXRPcHRpb24odGhpcy52YWx1ZSk7aWYob3B0aW9uLmNyZWF0ZWQpe3RoaXMuY3JlYXRlZExhYmVsPW9wdGlvbi5jdXJyZW50TGFiZWw7dGhpcy5jcmVhdGVkU2VsZWN0ZWQ9dHJ1ZTt9ZWxzZXt0aGlzLmNyZWF0ZWRTZWxlY3RlZD1mYWxzZTt9dGhpcy5zZWxlY3RlZExhYmVsPW9wdGlvbi5jdXJyZW50TGFiZWw7dGhpcy5zZWxlY3RlZD1vcHRpb247aWYodGhpcy5maWx0ZXJhYmxlKXRoaXMucXVlcnk9dGhpcy5zZWxlY3RlZExhYmVsO3JldHVybjt9dmFyIHJlc3VsdD1bXTtpZihBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpKXt0aGlzLnZhbHVlLmZvckVhY2goZnVuY3Rpb24odmFsdWUpe3Jlc3VsdC5wdXNoKF90aGlzOC5nZXRPcHRpb24odmFsdWUpKTt9KTt9dGhpcy5zZWxlY3RlZD1yZXN1bHQ7dGhpcy4kbmV4dFRpY2soZnVuY3Rpb24oKXtfdGhpczgucmVzZXRJbnB1dEhlaWdodCgpO30pO30saGFuZGxlRm9jdXM6ZnVuY3Rpb24gaGFuZGxlRm9jdXMoZXZlbnQpe2lmKCF0aGlzLnNvZnRGb2N1cyl7aWYodGhpcy5hdXRvbWF0aWNEcm9wZG93bnx8dGhpcy5maWx0ZXJhYmxlKXt0aGlzLnZpc2libGU9dHJ1ZTtpZih0aGlzLmZpbHRlcmFibGUpe3RoaXMubWVudVZpc2libGVPbkZvY3VzPXRydWU7fX10aGlzLiRlbWl0KCdmb2N1cycsZXZlbnQpO31lbHNle3RoaXMuc29mdEZvY3VzPWZhbHNlO319LGJsdXI6ZnVuY3Rpb24gYmx1cigpe3RoaXMudmlzaWJsZT1mYWxzZTt0aGlzLiRyZWZzLnJlZmVyZW5jZS5ibHVyKCk7fSxoYW5kbGVCbHVyOmZ1bmN0aW9uIGhhbmRsZUJsdXIoZXZlbnQpe3ZhciBfdGhpczk9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYoX3RoaXM5LmlzU2lsZW50Qmx1cil7X3RoaXM5LmlzU2lsZW50Qmx1cj1mYWxzZTt9ZWxzZXtfdGhpczkuJGVtaXQoJ2JsdXInLGV2ZW50KTt9fSw1MCk7dGhpcy5zb2Z0Rm9jdXM9ZmFsc2U7fSxoYW5kbGVDbGVhckNsaWNrOmZ1bmN0aW9uIGhhbmRsZUNsZWFyQ2xpY2soZXZlbnQpe3RoaXMuZGVsZXRlU2VsZWN0ZWQoZXZlbnQpO30sZG9EZXN0cm95OmZ1bmN0aW9uIGRvRGVzdHJveSgpe3RoaXMuJHJlZnMucG9wcGVyJiZ0aGlzLiRyZWZzLnBvcHBlci5kb0Rlc3Ryb3koKTt9LGhhbmRsZUNsb3NlOmZ1bmN0aW9uIGhhbmRsZUNsb3NlKCl7dGhpcy52aXNpYmxlPWZhbHNlO30sdG9nZ2xlTGFzdE9wdGlvbkhpdFN0YXRlOmZ1bmN0aW9uIHRvZ2dsZUxhc3RPcHRpb25IaXRTdGF0ZShoaXQpe2lmKCFBcnJheS5pc0FycmF5KHRoaXMuc2VsZWN0ZWQpKXJldHVybjt2YXIgb3B0aW9uPXRoaXMuc2VsZWN0ZWRbdGhpcy5zZWxlY3RlZC5sZW5ndGgtMV07aWYoIW9wdGlvbilyZXR1cm47aWYoaGl0PT09dHJ1ZXx8aGl0PT09ZmFsc2Upe29wdGlvbi5oaXRTdGF0ZT1oaXQ7cmV0dXJuIGhpdDt9b3B0aW9uLmhpdFN0YXRlPSFvcHRpb24uaGl0U3RhdGU7cmV0dXJuIG9wdGlvbi5oaXRTdGF0ZTt9LGRlbGV0ZVByZXZUYWc6ZnVuY3Rpb24gZGVsZXRlUHJldlRhZyhlKXtpZihlLnRhcmdldC52YWx1ZS5sZW5ndGg8PTAmJiF0aGlzLnRvZ2dsZUxhc3RPcHRpb25IaXRTdGF0ZSgpKXt2YXIgdmFsdWU9dGhpcy52YWx1ZS5zbGljZSgpO3ZhbHVlLnBvcCgpO3RoaXMuJGVtaXQoJ2lucHV0Jyx2YWx1ZSk7dGhpcy5lbWl0Q2hhbmdlKHZhbHVlKTt9fSxtYW5hZ2VQbGFjZWhvbGRlcjpmdW5jdGlvbiBtYW5hZ2VQbGFjZWhvbGRlcigpe2lmKHRoaXMuY3VycmVudFBsYWNlaG9sZGVyIT09Jycpe3RoaXMuY3VycmVudFBsYWNlaG9sZGVyPXRoaXMuJHJlZnMuaW5wdXQudmFsdWU/Jyc6dGhpcy5jYWNoZWRQbGFjZUhvbGRlcjt9fSxyZXNldElucHV0U3RhdGU6ZnVuY3Rpb24gcmVzZXRJbnB1dFN0YXRlKGUpe2lmKGUua2V5Q29kZSE9PTgpdGhpcy50b2dnbGVMYXN0T3B0aW9uSGl0U3RhdGUoZmFsc2UpO3RoaXMuaW5wdXRMZW5ndGg9dGhpcy4kcmVmcy5pbnB1dC52YWx1ZS5sZW5ndGgqMTUrMjA7dGhpcy5yZXNldElucHV0SGVpZ2h0KCk7fSxyZXNldElucHV0SGVpZ2h0OmZ1bmN0aW9uIHJlc2V0SW5wdXRIZWlnaHQoKXt2YXIgX3RoaXMxMD10aGlzO2lmKHRoaXMuY29sbGFwc2VUYWdzJiYhdGhpcy5maWx0ZXJhYmxlKXJldHVybjt0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe2lmKCFfdGhpczEwLiRyZWZzLnJlZmVyZW5jZSlyZXR1cm47dmFyIGlucHV0Q2hpbGROb2Rlcz1fdGhpczEwLiRyZWZzLnJlZmVyZW5jZS4kZWwuY2hpbGROb2Rlczt2YXIgaW5wdXQ9W10uZmlsdGVyLmNhbGwoaW5wdXRDaGlsZE5vZGVzLGZ1bmN0aW9uKGl0ZW0pe3JldHVybiBpdGVtLnRhZ05hbWU9PT0nSU5QVVQnO30pWzBdO3ZhciB0YWdzPV90aGlzMTAuJHJlZnMudGFnczt2YXIgc2l6ZUluTWFwPV90aGlzMTAuaW5pdGlhbElucHV0SGVpZ2h0fHw0MDtpbnB1dC5zdHlsZS5oZWlnaHQ9X3RoaXMxMC5zZWxlY3RlZC5sZW5ndGg9PT0wP3NpemVJbk1hcCsncHgnOk1hdGgubWF4KHRhZ3M/dGFncy5jbGllbnRIZWlnaHQrKHRhZ3MuY2xpZW50SGVpZ2h0PnNpemVJbk1hcD82OjApOjAsc2l6ZUluTWFwKSsncHgnO2lmKF90aGlzMTAudmlzaWJsZSYmX3RoaXMxMC5lbXB0eVRleHQhPT1mYWxzZSl7X3RoaXMxMC5icm9hZGNhc3QoJ0VsU2VsZWN0RHJvcGRvd24nLCd1cGRhdGVQb3BwZXInKTt9fSk7fSxyZXNldEhvdmVySW5kZXg6ZnVuY3Rpb24gcmVzZXRIb3ZlckluZGV4KCl7dmFyIF90aGlzMTE9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYoIV90aGlzMTEubXVsdGlwbGUpe190aGlzMTEuaG92ZXJJbmRleD1fdGhpczExLm9wdGlvbnMuaW5kZXhPZihfdGhpczExLnNlbGVjdGVkKTt9ZWxzZXtpZihfdGhpczExLnNlbGVjdGVkLmxlbmd0aD4wKXtfdGhpczExLmhvdmVySW5kZXg9TWF0aC5taW4uYXBwbHkobnVsbCxfdGhpczExLnNlbGVjdGVkLm1hcChmdW5jdGlvbihpdGVtKXtyZXR1cm4gX3RoaXMxMS5vcHRpb25zLmluZGV4T2YoaXRlbSk7fSkpO31lbHNle190aGlzMTEuaG92ZXJJbmRleD0tMTt9fX0sMzAwKTt9LGhhbmRsZU9wdGlvblNlbGVjdDpmdW5jdGlvbiBoYW5kbGVPcHRpb25TZWxlY3Qob3B0aW9uLGJ5Q2xpY2spe3ZhciBfdGhpczEyPXRoaXM7aWYodGhpcy5tdWx0aXBsZSl7dmFyIHZhbHVlPSh0aGlzLnZhbHVlfHxbXSkuc2xpY2UoKTt2YXIgb3B0aW9uSW5kZXg9dGhpcy5nZXRWYWx1ZUluZGV4KHZhbHVlLG9wdGlvbi52YWx1ZSk7aWYob3B0aW9uSW5kZXg+LTEpe3ZhbHVlLnNwbGljZShvcHRpb25JbmRleCwxKTt9ZWxzZSBpZih0aGlzLm11bHRpcGxlTGltaXQ8PTB8fHZhbHVlLmxlbmd0aDx0aGlzLm11bHRpcGxlTGltaXQpe3ZhbHVlLnB1c2gob3B0aW9uLnZhbHVlKTt9dGhpcy4kZW1pdCgnaW5wdXQnLHZhbHVlKTt0aGlzLmVtaXRDaGFuZ2UodmFsdWUpO2lmKG9wdGlvbi5jcmVhdGVkKXt0aGlzLnF1ZXJ5PScnO3RoaXMuaGFuZGxlUXVlcnlDaGFuZ2UoJycpO3RoaXMuaW5wdXRMZW5ndGg9MjA7fWlmKHRoaXMuZmlsdGVyYWJsZSl0aGlzLiRyZWZzLmlucHV0LmZvY3VzKCk7fWVsc2V7dGhpcy4kZW1pdCgnaW5wdXQnLG9wdGlvbi52YWx1ZSk7dGhpcy5lbWl0Q2hhbmdlKG9wdGlvbi52YWx1ZSk7dGhpcy52aXNpYmxlPWZhbHNlO310aGlzLmlzU2lsZW50Qmx1cj1ieUNsaWNrO3RoaXMuc2V0U29mdEZvY3VzKCk7aWYodGhpcy52aXNpYmxlKXJldHVybjt0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe190aGlzMTIuc2Nyb2xsVG9PcHRpb24ob3B0aW9uKTt9KTt9LHNldFNvZnRGb2N1czpmdW5jdGlvbiBzZXRTb2Z0Rm9jdXMoKXt0aGlzLnNvZnRGb2N1cz10cnVlO3ZhciBpbnB1dD10aGlzLiRyZWZzLmlucHV0fHx0aGlzLiRyZWZzLnJlZmVyZW5jZTtpZihpbnB1dCl7aW5wdXQuZm9jdXMoKTt9fSxnZXRWYWx1ZUluZGV4OmZ1bmN0aW9uIGdldFZhbHVlSW5kZXgoKXt2YXIgYXJyPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dW5kZWZpbmVkP2FyZ3VtZW50c1swXTpbXTt2YXIgdmFsdWU9YXJndW1lbnRzWzFdO3ZhciBpc09iamVjdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLnRvTG93ZXJDYXNlKCk9PT0nW29iamVjdCBvYmplY3RdJztpZighaXNPYmplY3Qpe3JldHVybiBhcnIuaW5kZXhPZih2YWx1ZSk7fWVsc2V7dmFyIHZhbHVlS2V5PXRoaXMudmFsdWVLZXk7dmFyIGluZGV4PS0xO2Fyci5zb21lKGZ1bmN0aW9uKGl0ZW0saSl7aWYoT2JqZWN0KHV0aWxfWyJnZXRWYWx1ZUJ5UGF0aCJdKShpdGVtLHZhbHVlS2V5KT09PU9iamVjdCh1dGlsX1siZ2V0VmFsdWVCeVBhdGgiXSkodmFsdWUsdmFsdWVLZXkpKXtpbmRleD1pO3JldHVybiB0cnVlO31yZXR1cm4gZmFsc2U7fSk7cmV0dXJuIGluZGV4O319LHRvZ2dsZU1lbnU6ZnVuY3Rpb24gdG9nZ2xlTWVudSgpe2lmKCF0aGlzLnNlbGVjdERpc2FibGVkKXtpZih0aGlzLm1lbnVWaXNpYmxlT25Gb2N1cyl7dGhpcy5tZW51VmlzaWJsZU9uRm9jdXM9ZmFsc2U7fWVsc2V7dGhpcy52aXNpYmxlPSF0aGlzLnZpc2libGU7fWlmKHRoaXMudmlzaWJsZSl7KHRoaXMuJHJlZnMuaW5wdXR8fHRoaXMuJHJlZnMucmVmZXJlbmNlKS5mb2N1cygpO319fSxzZWxlY3RPcHRpb246ZnVuY3Rpb24gc2VsZWN0T3B0aW9uKCl7aWYoIXRoaXMudmlzaWJsZSl7dGhpcy50b2dnbGVNZW51KCk7fWVsc2V7aWYodGhpcy5vcHRpb25zW3RoaXMuaG92ZXJJbmRleF0pe3RoaXMuaGFuZGxlT3B0aW9uU2VsZWN0KHRoaXMub3B0aW9uc1t0aGlzLmhvdmVySW5kZXhdKTt9fX0sZGVsZXRlU2VsZWN0ZWQ6ZnVuY3Rpb24gZGVsZXRlU2VsZWN0ZWQoZXZlbnQpe2V2ZW50LnN0b3BQcm9wYWdhdGlvbigpO3ZhciB2YWx1ZT10aGlzLm11bHRpcGxlP1tdOicnO3RoaXMuJGVtaXQoJ2lucHV0Jyx2YWx1ZSk7dGhpcy5lbWl0Q2hhbmdlKHZhbHVlKTt0aGlzLnZpc2libGU9ZmFsc2U7dGhpcy4kZW1pdCgnY2xlYXInKTt9LGRlbGV0ZVRhZzpmdW5jdGlvbiBkZWxldGVUYWcoZXZlbnQsdGFnKXt2YXIgaW5kZXg9dGhpcy5zZWxlY3RlZC5pbmRleE9mKHRhZyk7aWYoaW5kZXg+LTEmJiF0aGlzLnNlbGVjdERpc2FibGVkKXt2YXIgdmFsdWU9dGhpcy52YWx1ZS5zbGljZSgpO3ZhbHVlLnNwbGljZShpbmRleCwxKTt0aGlzLiRlbWl0KCdpbnB1dCcsdmFsdWUpO3RoaXMuZW1pdENoYW5nZSh2YWx1ZSk7dGhpcy4kZW1pdCgncmVtb3ZlLXRhZycsdGFnLnZhbHVlKTt9ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7fSxvbklucHV0Q2hhbmdlOmZ1bmN0aW9uIG9uSW5wdXRDaGFuZ2UoKXtpZih0aGlzLmZpbHRlcmFibGUmJnRoaXMucXVlcnkhPT10aGlzLnNlbGVjdGVkTGFiZWwpe3RoaXMucXVlcnk9dGhpcy5zZWxlY3RlZExhYmVsO3RoaXMuaGFuZGxlUXVlcnlDaGFuZ2UodGhpcy5xdWVyeSk7fX0sb25PcHRpb25EZXN0cm95OmZ1bmN0aW9uIG9uT3B0aW9uRGVzdHJveShpbmRleCl7aWYoaW5kZXg+LTEpe3RoaXMub3B0aW9uc0NvdW50LS07dGhpcy5maWx0ZXJlZE9wdGlvbnNDb3VudC0tO3RoaXMub3B0aW9ucy5zcGxpY2UoaW5kZXgsMSk7fX0scmVzZXRJbnB1dFdpZHRoOmZ1bmN0aW9uIHJlc2V0SW5wdXRXaWR0aCgpe3RoaXMuaW5wdXRXaWR0aD10aGlzLiRyZWZzLnJlZmVyZW5jZS4kZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7fSxoYW5kbGVSZXNpemU6ZnVuY3Rpb24gaGFuZGxlUmVzaXplKCl7dGhpcy5yZXNldElucHV0V2lkdGgoKTtpZih0aGlzLm11bHRpcGxlKXRoaXMucmVzZXRJbnB1dEhlaWdodCgpO30sY2hlY2tEZWZhdWx0Rmlyc3RPcHRpb246ZnVuY3Rpb24gY2hlY2tEZWZhdWx0Rmlyc3RPcHRpb24oKXt0aGlzLmhvdmVySW5kZXg9LTE7Ly8gaGlnaGxpZ2h0IHRoZSBjcmVhdGVkIG9wdGlvbgp2YXIgaGFzQ3JlYXRlZD1mYWxzZTtmb3IodmFyIGk9dGhpcy5vcHRpb25zLmxlbmd0aC0xO2k+PTA7aS0tKXtpZih0aGlzLm9wdGlvbnNbaV0uY3JlYXRlZCl7aGFzQ3JlYXRlZD10cnVlO3RoaXMuaG92ZXJJbmRleD1pO2JyZWFrO319aWYoaGFzQ3JlYXRlZClyZXR1cm47Zm9yKHZhciBfaT0wO19pIT09dGhpcy5vcHRpb25zLmxlbmd0aDsrK19pKXt2YXIgb3B0aW9uPXRoaXMub3B0aW9uc1tfaV07aWYodGhpcy5xdWVyeSl7Ly8gaGlnaGxpZ2h0IGZpcnN0IG9wdGlvbnMgdGhhdCBwYXNzZXMgdGhlIGZpbHRlcgppZighb3B0aW9uLmRpc2FibGVkJiYhb3B0aW9uLmdyb3VwRGlzYWJsZWQmJm9wdGlvbi52aXNpYmxlKXt0aGlzLmhvdmVySW5kZXg9X2k7YnJlYWs7fX1lbHNley8vIGhpZ2hsaWdodCBjdXJyZW50bHkgc2VsZWN0ZWQgb3B0aW9uCmlmKG9wdGlvbi5pdGVtU2VsZWN0ZWQpe3RoaXMuaG92ZXJJbmRleD1faTticmVhazt9fX19LGdldFZhbHVlS2V5OmZ1bmN0aW9uIGdldFZhbHVlS2V5KGl0ZW0pe2lmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVtLnZhbHVlKS50b0xvd2VyQ2FzZSgpIT09J1tvYmplY3Qgb2JqZWN0XScpe3JldHVybiBpdGVtLnZhbHVlO31lbHNle3JldHVybiBPYmplY3QodXRpbF9bImdldFZhbHVlQnlQYXRoIl0pKGl0ZW0udmFsdWUsdGhpcy52YWx1ZUtleSk7fX19LGNyZWF0ZWQ6ZnVuY3Rpb24gY3JlYXRlZCgpe3ZhciBfdGhpczEzPXRoaXM7dGhpcy5jYWNoZWRQbGFjZUhvbGRlcj10aGlzLmN1cnJlbnRQbGFjZWhvbGRlcj10aGlzLnBsYWNlaG9sZGVyO2lmKHRoaXMubXVsdGlwbGUmJiFBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpKXt0aGlzLiRlbWl0KCdpbnB1dCcsW10pO31pZighdGhpcy5tdWx0aXBsZSYmQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSl7dGhpcy4kZW1pdCgnaW5wdXQnLCcnKTt9dGhpcy5kZWJvdW5jZWRPbklucHV0Q2hhbmdlPWRlYm91bmNlX2RlZmF1bHQoKSh0aGlzLmRlYm91bmNlLGZ1bmN0aW9uKCl7X3RoaXMxMy5vbklucHV0Q2hhbmdlKCk7fSk7dGhpcy5kZWJvdW5jZWRRdWVyeUNoYW5nZT1kZWJvdW5jZV9kZWZhdWx0KCkodGhpcy5kZWJvdW5jZSxmdW5jdGlvbihlKXtfdGhpczEzLmhhbmRsZVF1ZXJ5Q2hhbmdlKGUudGFyZ2V0LnZhbHVlKTt9KTt0aGlzLiRvbignaGFuZGxlT3B0aW9uQ2xpY2snLHRoaXMuaGFuZGxlT3B0aW9uU2VsZWN0KTt0aGlzLiRvbignc2V0U2VsZWN0ZWQnLHRoaXMuc2V0U2VsZWN0ZWQpO30sbW91bnRlZDpmdW5jdGlvbiBtb3VudGVkKCl7dmFyIF90aGlzMTQ9dGhpcztpZih0aGlzLm11bHRpcGxlJiZBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpJiZ0aGlzLnZhbHVlLmxlbmd0aD4wKXt0aGlzLmN1cnJlbnRQbGFjZWhvbGRlcj0nJzt9T2JqZWN0KHJlc2l6ZV9ldmVudF9bImFkZFJlc2l6ZUxpc3RlbmVyIl0pKHRoaXMuJGVsLHRoaXMuaGFuZGxlUmVzaXplKTt2YXIgcmVmZXJlbmNlPXRoaXMuJHJlZnMucmVmZXJlbmNlO2lmKHJlZmVyZW5jZSYmcmVmZXJlbmNlLiRlbCl7dmFyIHNpemVNYXA9e21lZGl1bTozNixzbWFsbDozMixtaW5pOjI4fTt2YXIgaW5wdXQ9cmVmZXJlbmNlLiRlbC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO3RoaXMuaW5pdGlhbElucHV0SGVpZ2h0PWlucHV0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodHx8c2l6ZU1hcFt0aGlzLnNlbGVjdFNpemVdO31pZih0aGlzLnJlbW90ZSYmdGhpcy5tdWx0aXBsZSl7dGhpcy5yZXNldElucHV0SGVpZ2h0KCk7fXRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uKCl7aWYocmVmZXJlbmNlJiZyZWZlcmVuY2UuJGVsKXtfdGhpczE0LmlucHV0V2lkdGg9cmVmZXJlbmNlLiRlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDt9fSk7dGhpcy5zZXRTZWxlY3RlZCgpO30sYmVmb3JlRGVzdHJveTpmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCl7aWYodGhpcy4kZWwmJnRoaXMuaGFuZGxlUmVzaXplKU9iamVjdChyZXNpemVfZXZlbnRfWyJyZW1vdmVSZXNpemVMaXN0ZW5lciJdKSh0aGlzLiRlbCx0aGlzLmhhbmRsZVJlc2l6ZSk7fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL3NlbGVjdC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc3JjX3NlbGVjdHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz1zZWxlY3R2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL3NlbGVjdC52dWUKLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciBzZWxlY3RfY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChzcmNfc2VsZWN0dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLHNlbGVjdHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzBlNGFhZGU2X3JlbmRlcixzZWxlY3R2dWVfdHlwZV90ZW1wbGF0ZV9pZF8wZTRhYWRlNl9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIHNlbGVjdF9hcGk7fXNlbGVjdF9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL3NlbGVjdC9zcmMvc2VsZWN0LnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfc2VsZWN0PXNlbGVjdF9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NlbGVjdC9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL3NyY19zZWxlY3QuaW5zdGFsbD1mdW5jdGlvbihWdWUpe1Z1ZS5jb21wb25lbnQoc3JjX3NlbGVjdC5uYW1lLHNyY19zZWxlY3QpO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYWNrYWdlc19zZWxlY3Q9c3JjX3NlbGVjdDsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL29wdGlvbi9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL3NyY19vcHRpb24uaW5zdGFsbD1mdW5jdGlvbihWdWUpe1Z1ZS5jb21wb25lbnQoc3JjX29wdGlvbi5uYW1lLHNyY19vcHRpb24pO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYWNrYWdlc19vcHRpb249c3JjX29wdGlvbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3NlbGVjdC9zcmMvb3B0aW9uLWdyb3VwLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD02Njg1ZTVkZSYKdmFyIG9wdGlvbl9ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzY2ODVlNWRlX3JlbmRlcj1mdW5jdGlvbiBvcHRpb25fZ3JvdXB2dWVfdHlwZV90ZW1wbGF0ZV9pZF82Njg1ZTVkZV9yZW5kZXIoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDt2YXIgX2M9X3ZtLl9zZWxmLl9jfHxfaDtyZXR1cm4gX2MoInVsIix7ZGlyZWN0aXZlczpbe25hbWU6InNob3ciLHJhd05hbWU6InYtc2hvdyIsdmFsdWU6X3ZtLnZpc2libGUsZXhwcmVzc2lvbjoidmlzaWJsZSJ9XSxzdGF0aWNDbGFzczoiZWwtc2VsZWN0LWdyb3VwX193cmFwIn0sW19jKCJsaSIse3N0YXRpY0NsYXNzOiJlbC1zZWxlY3QtZ3JvdXBfX3RpdGxlIn0sW192bS5fdihfdm0uX3MoX3ZtLmxhYmVsKSldKSxfYygibGkiLFtfYygidWwiLHtzdGF0aWNDbGFzczoiZWwtc2VsZWN0LWdyb3VwIn0sW192bS5fdCgiZGVmYXVsdCIpXSwyKV0pXSk7fTt2YXIgb3B0aW9uX2dyb3VwdnVlX3R5cGVfdGVtcGxhdGVfaWRfNjY4NWU1ZGVfc3RhdGljUmVuZGVyRm5zPVtdO29wdGlvbl9ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzY2ODVlNWRlX3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL29wdGlvbi1ncm91cC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NjY4NWU1ZGUmCi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3NlbGVjdC9zcmMvb3B0aW9uLWdyb3VwLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBvcHRpb25fZ3JvdXB2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e21peGluczpbZW1pdHRlcl9kZWZhdWx0LmFdLG5hbWU6J0VsT3B0aW9uR3JvdXAnLGNvbXBvbmVudE5hbWU6J0VsT3B0aW9uR3JvdXAnLHByb3BzOntsYWJlbDpTdHJpbmcsZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OmZhbHNlfX0sZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue3Zpc2libGU6dHJ1ZX07fSx3YXRjaDp7ZGlzYWJsZWQ6ZnVuY3Rpb24gZGlzYWJsZWQodmFsKXt0aGlzLmJyb2FkY2FzdCgnRWxPcHRpb24nLCdoYW5kbGVHcm91cERpc2FibGVkJyx2YWwpO319LG1ldGhvZHM6e3F1ZXJ5Q2hhbmdlOmZ1bmN0aW9uIHF1ZXJ5Q2hhbmdlKCl7dGhpcy52aXNpYmxlPXRoaXMuJGNoaWxkcmVuJiZBcnJheS5pc0FycmF5KHRoaXMuJGNoaWxkcmVuKSYmdGhpcy4kY2hpbGRyZW4uc29tZShmdW5jdGlvbihvcHRpb24pe3JldHVybiBvcHRpb24udmlzaWJsZT09PXRydWU7fSk7fX0sY3JlYXRlZDpmdW5jdGlvbiBjcmVhdGVkKCl7dGhpcy4kb24oJ3F1ZXJ5Q2hhbmdlJyx0aGlzLnF1ZXJ5Q2hhbmdlKTt9LG1vdW50ZWQ6ZnVuY3Rpb24gbW91bnRlZCgpe2lmKHRoaXMuZGlzYWJsZWQpe3RoaXMuYnJvYWRjYXN0KCdFbE9wdGlvbicsJ2hhbmRsZUdyb3VwRGlzYWJsZWQnLHRoaXMuZGlzYWJsZWQpO319fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NlbGVjdC9zcmMvb3B0aW9uLWdyb3VwLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfb3B0aW9uX2dyb3VwdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPW9wdGlvbl9ncm91cHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NlbGVjdC9zcmMvb3B0aW9uLWdyb3VwLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIG9wdGlvbl9ncm91cF9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHNyY19vcHRpb25fZ3JvdXB2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sb3B0aW9uX2dyb3VwdnVlX3R5cGVfdGVtcGxhdGVfaWRfNjY4NWU1ZGVfcmVuZGVyLG9wdGlvbl9ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzY2ODVlNWRlX3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgb3B0aW9uX2dyb3VwX2FwaTt9b3B0aW9uX2dyb3VwX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvc2VsZWN0L3NyYy9vcHRpb24tZ3JvdXAudnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIG9wdGlvbl9ncm91cD1vcHRpb25fZ3JvdXBfY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9vcHRpb24tZ3JvdXAvaW5kZXguanMKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9vcHRpb25fZ3JvdXAuaW5zdGFsbD1mdW5jdGlvbihWdWUpe1Z1ZS5jb21wb25lbnQob3B0aW9uX2dyb3VwLm5hbWUsb3B0aW9uX2dyb3VwKTt9Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFja2FnZXNfb3B0aW9uX2dyb3VwPW9wdGlvbl9ncm91cDsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2J1dHRvbi9zcmMvYnV0dG9uLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD1jYTg1OWZiNCYKdmFyIGJ1dHRvbnZ1ZV90eXBlX3RlbXBsYXRlX2lkX2NhODU5ZmI0X3JlbmRlcj1mdW5jdGlvbiBidXR0b252dWVfdHlwZV90ZW1wbGF0ZV9pZF9jYTg1OWZiNF9yZW5kZXIoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDt2YXIgX2M9X3ZtLl9zZWxmLl9jfHxfaDtyZXR1cm4gX2MoImJ1dHRvbiIse3N0YXRpY0NsYXNzOiJlbC1idXR0b24iLGNsYXNzOltfdm0udHlwZT8iZWwtYnV0dG9uLS0iK192bS50eXBlOiIiLF92bS5idXR0b25TaXplPyJlbC1idXR0b24tLSIrX3ZtLmJ1dHRvblNpemU6IiIseyJpcy1kaXNhYmxlZCI6X3ZtLmJ1dHRvbkRpc2FibGVkLCJpcy1sb2FkaW5nIjpfdm0ubG9hZGluZywiaXMtcGxhaW4iOl92bS5wbGFpbiwiaXMtcm91bmQiOl92bS5yb3VuZCwiaXMtY2lyY2xlIjpfdm0uY2lyY2xlfV0sYXR0cnM6e2Rpc2FibGVkOl92bS5idXR0b25EaXNhYmxlZHx8X3ZtLmxvYWRpbmcsYXV0b2ZvY3VzOl92bS5hdXRvZm9jdXMsdHlwZTpfdm0ubmF0aXZlVHlwZX0sb246e2NsaWNrOl92bS5oYW5kbGVDbGlja319LFtfdm0ubG9hZGluZz9fYygiaSIse3N0YXRpY0NsYXNzOiJlbC1pY29uLWxvYWRpbmcifSk6X3ZtLl9lKCksX3ZtLmljb24mJiFfdm0ubG9hZGluZz9fYygiaSIse2NsYXNzOl92bS5pY29ufSk6X3ZtLl9lKCksX3ZtLiRzbG90cy5kZWZhdWx0P19jKCJzcGFuIixbX3ZtLl90KCJkZWZhdWx0IildLDIpOl92bS5fZSgpXSk7fTt2YXIgYnV0dG9udnVlX3R5cGVfdGVtcGxhdGVfaWRfY2E4NTlmYjRfc3RhdGljUmVuZGVyRm5zPVtdO2J1dHRvbnZ1ZV90eXBlX3RlbXBsYXRlX2lkX2NhODU5ZmI0X3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9idXR0b24vc3JjL2J1dHRvbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9Y2E4NTlmYjQmCi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2J1dHRvbi9zcmMvYnV0dG9uLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBidXR0b252dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e25hbWU6J0VsQnV0dG9uJyxpbmplY3Q6e2VsRm9ybTp7ZGVmYXVsdDonJ30sZWxGb3JtSXRlbTp7ZGVmYXVsdDonJ319LHByb3BzOnt0eXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OidkZWZhdWx0J30sc2l6ZTpTdHJpbmcsaWNvbjp7dHlwZTpTdHJpbmcsZGVmYXVsdDonJ30sbmF0aXZlVHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDonYnV0dG9uJ30sbG9hZGluZzpCb29sZWFuLGRpc2FibGVkOkJvb2xlYW4scGxhaW46Qm9vbGVhbixhdXRvZm9jdXM6Qm9vbGVhbixyb3VuZDpCb29sZWFuLGNpcmNsZTpCb29sZWFufSxjb21wdXRlZDp7X2VsRm9ybUl0ZW1TaXplOmZ1bmN0aW9uIF9lbEZvcm1JdGVtU2l6ZSgpe3JldHVybih0aGlzLmVsRm9ybUl0ZW18fHt9KS5lbEZvcm1JdGVtU2l6ZTt9LGJ1dHRvblNpemU6ZnVuY3Rpb24gYnV0dG9uU2l6ZSgpe3JldHVybiB0aGlzLnNpemV8fHRoaXMuX2VsRm9ybUl0ZW1TaXplfHwodGhpcy4kRUxFTUVOVHx8e30pLnNpemU7fSxidXR0b25EaXNhYmxlZDpmdW5jdGlvbiBidXR0b25EaXNhYmxlZCgpe3JldHVybiB0aGlzLmRpc2FibGVkfHwodGhpcy5lbEZvcm18fHt9KS5kaXNhYmxlZDt9fSxtZXRob2RzOntoYW5kbGVDbGljazpmdW5jdGlvbiBoYW5kbGVDbGljayhldnQpe3RoaXMuJGVtaXQoJ2NsaWNrJyxldnQpO319fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2J1dHRvbi9zcmMvYnV0dG9uLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfYnV0dG9udnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPWJ1dHRvbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2J1dHRvbi9zcmMvYnV0dG9uLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIGJ1dHRvbl9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHNyY19idXR0b252dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sYnV0dG9udnVlX3R5cGVfdGVtcGxhdGVfaWRfY2E4NTlmYjRfcmVuZGVyLGJ1dHRvbnZ1ZV90eXBlX3RlbXBsYXRlX2lkX2NhODU5ZmI0X3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgYnV0dG9uX2FwaTt9YnV0dG9uX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvYnV0dG9uL3NyYy9idXR0b24udnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHNyY19idXR0b249YnV0dG9uX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYnV0dG9uL2luZGV4LmpzCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovc3JjX2J1dHRvbi5pbnN0YWxsPWZ1bmN0aW9uKFZ1ZSl7VnVlLmNvbXBvbmVudChzcmNfYnV0dG9uLm5hbWUsc3JjX2J1dHRvbik7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX2J1dHRvbj1zcmNfYnV0dG9uOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvYnV0dG9uL3NyYy9idXR0b24tZ3JvdXAudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTNkODY2MWQwJgp2YXIgYnV0dG9uX2dyb3VwdnVlX3R5cGVfdGVtcGxhdGVfaWRfM2Q4NjYxZDBfcmVuZGVyPWZ1bmN0aW9uIGJ1dHRvbl9ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzNkODY2MWQwX3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLWJ1dHRvbi1ncm91cCJ9LFtfdm0uX3QoImRlZmF1bHQiKV0sMik7fTt2YXIgYnV0dG9uX2dyb3VwdnVlX3R5cGVfdGVtcGxhdGVfaWRfM2Q4NjYxZDBfc3RhdGljUmVuZGVyRm5zPVtdO2J1dHRvbl9ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzNkODY2MWQwX3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9idXR0b24vc3JjL2J1dHRvbi1ncm91cC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9M2Q4NjYxZDAmCi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2J1dHRvbi9zcmMvYnV0dG9uLWdyb3VwLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLy8KLy8KLy8KLy8KLy8KLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBidXR0b25fZ3JvdXB2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e25hbWU6J0VsQnV0dG9uR3JvdXAnfTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2J1dHRvbi9zcmMvYnV0dG9uLWdyb3VwLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfYnV0dG9uX2dyb3VwdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPWJ1dHRvbl9ncm91cHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2J1dHRvbi9zcmMvYnV0dG9uLWdyb3VwLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIGJ1dHRvbl9ncm91cF9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHNyY19idXR0b25fZ3JvdXB2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sYnV0dG9uX2dyb3VwdnVlX3R5cGVfdGVtcGxhdGVfaWRfM2Q4NjYxZDBfcmVuZGVyLGJ1dHRvbl9ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzNkODY2MWQwX3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgYnV0dG9uX2dyb3VwX2FwaTt9YnV0dG9uX2dyb3VwX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvYnV0dG9uL3NyYy9idXR0b24tZ3JvdXAudnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGJ1dHRvbl9ncm91cD1idXR0b25fZ3JvdXBfY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9idXR0b24tZ3JvdXAvaW5kZXguanMKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9idXR0b25fZ3JvdXAuaW5zdGFsbD1mdW5jdGlvbihWdWUpe1Z1ZS5jb21wb25lbnQoYnV0dG9uX2dyb3VwLm5hbWUsYnV0dG9uX2dyb3VwKTt9Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFja2FnZXNfYnV0dG9uX2dyb3VwPWJ1dHRvbl9ncm91cDsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3RhYmxlL3NyYy90YWJsZS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NDkzZmUzNGUmCnZhciB0YWJsZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQ5M2ZlMzRlX3JlbmRlcj1mdW5jdGlvbiB0YWJsZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQ5M2ZlMzRlX3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXRhYmxlIixjbGFzczpbeyJlbC10YWJsZS0tZml0Ijpfdm0uZml0LCJlbC10YWJsZS0tc3RyaXBlZCI6X3ZtLnN0cmlwZSwiZWwtdGFibGUtLWJvcmRlciI6X3ZtLmJvcmRlcnx8X3ZtLmlzR3JvdXAsImVsLXRhYmxlLS1oaWRkZW4iOl92bS5pc0hpZGRlbiwiZWwtdGFibGUtLWdyb3VwIjpfdm0uaXNHcm91cCwiZWwtdGFibGUtLWZsdWlkLWhlaWdodCI6X3ZtLm1heEhlaWdodCwiZWwtdGFibGUtLXNjcm9sbGFibGUteCI6X3ZtLmxheW91dC5zY3JvbGxYLCJlbC10YWJsZS0tc2Nyb2xsYWJsZS15Ijpfdm0ubGF5b3V0LnNjcm9sbFksImVsLXRhYmxlLS1lbmFibGUtcm93LWhvdmVyIjohX3ZtLnN0b3JlLnN0YXRlcy5pc0NvbXBsZXgsImVsLXRhYmxlLS1lbmFibGUtcm93LXRyYW5zaXRpb24iOihfdm0uc3RvcmUuc3RhdGVzLmRhdGF8fFtdKS5sZW5ndGghPT0wJiYoX3ZtLnN0b3JlLnN0YXRlcy5kYXRhfHxbXSkubGVuZ3RoPDEwMH0sX3ZtLnRhYmxlU2l6ZT8iZWwtdGFibGUtLSIrX3ZtLnRhYmxlU2l6ZToiIl0sb246e21vdXNlbGVhdmU6ZnVuY3Rpb24gbW91c2VsZWF2ZSgkZXZlbnQpe192bS5oYW5kbGVNb3VzZUxlYXZlKCRldmVudCk7fX19LFtfYygiZGl2Iix7cmVmOiJoaWRkZW5Db2x1bW5zIixzdGF0aWNDbGFzczoiaGlkZGVuLWNvbHVtbnMifSxbX3ZtLl90KCJkZWZhdWx0IildLDIpLF92bS5zaG93SGVhZGVyP19jKCJkaXYiLHtkaXJlY3RpdmVzOlt7bmFtZToibW91c2V3aGVlbCIscmF3TmFtZToidi1tb3VzZXdoZWVsIix2YWx1ZTpfdm0uaGFuZGxlSGVhZGVyRm9vdGVyTW91c2V3aGVlbCxleHByZXNzaW9uOiJoYW5kbGVIZWFkZXJGb290ZXJNb3VzZXdoZWVsIn1dLHJlZjoiaGVhZGVyV3JhcHBlciIsc3RhdGljQ2xhc3M6ImVsLXRhYmxlX19oZWFkZXItd3JhcHBlciJ9LFtfYygidGFibGUtaGVhZGVyIix7cmVmOiJ0YWJsZUhlYWRlciIsc3R5bGU6e3dpZHRoOl92bS5sYXlvdXQuYm9keVdpZHRoP192bS5sYXlvdXQuYm9keVdpZHRoKyJweCI6IiJ9LGF0dHJzOntzdG9yZTpfdm0uc3RvcmUsYm9yZGVyOl92bS5ib3JkZXIsImRlZmF1bHQtc29ydCI6X3ZtLmRlZmF1bHRTb3J0fX0pXSwxKTpfdm0uX2UoKSxfYygiZGl2Iix7cmVmOiJib2R5V3JhcHBlciIsc3RhdGljQ2xhc3M6ImVsLXRhYmxlX19ib2R5LXdyYXBwZXIiLGNsYXNzOltfdm0ubGF5b3V0LnNjcm9sbFg/ImlzLXNjcm9sbGluZy0iK192bS5zY3JvbGxQb3NpdGlvbjoiaXMtc2Nyb2xsaW5nLW5vbmUiXSxzdHlsZTpbX3ZtLmJvZHlIZWlnaHRdfSxbX2MoInRhYmxlLWJvZHkiLHtzdHlsZTp7d2lkdGg6X3ZtLmJvZHlXaWR0aH0sYXR0cnM6e2NvbnRleHQ6X3ZtLmNvbnRleHQsc3RvcmU6X3ZtLnN0b3JlLHN0cmlwZTpfdm0uc3RyaXBlLCJyb3ctY2xhc3MtbmFtZSI6X3ZtLnJvd0NsYXNzTmFtZSwicm93LXN0eWxlIjpfdm0ucm93U3R5bGUsaGlnaGxpZ2h0Ol92bS5oaWdobGlnaHRDdXJyZW50Um93fX0pLCFfdm0uZGF0YXx8X3ZtLmRhdGEubGVuZ3RoPT09MD9fYygiZGl2Iix7cmVmOiJlbXB0eUJsb2NrIixzdGF0aWNDbGFzczoiZWwtdGFibGVfX2VtcHR5LWJsb2NrIixzdHlsZTpfdm0uZW1wdHlCbG9ja1N0eWxlfSxbX2MoInNwYW4iLHtzdGF0aWNDbGFzczoiZWwtdGFibGVfX2VtcHR5LXRleHQifSxbX3ZtLl90KCJlbXB0eSIsW192bS5fdihfdm0uX3MoX3ZtLmVtcHR5VGV4dHx8X3ZtLnQoImVsLnRhYmxlLmVtcHR5VGV4dCIpKSldKV0sMildKTpfdm0uX2UoKSxfdm0uJHNsb3RzLmFwcGVuZD9fYygiZGl2Iix7cmVmOiJhcHBlbmRXcmFwcGVyIixzdGF0aWNDbGFzczoiZWwtdGFibGVfX2FwcGVuZC13cmFwcGVyIn0sW192bS5fdCgiYXBwZW5kIildLDIpOl92bS5fZSgpXSwxKSxfdm0uc2hvd1N1bW1hcnk/X2MoImRpdiIse2RpcmVjdGl2ZXM6W3tuYW1lOiJzaG93IixyYXdOYW1lOiJ2LXNob3ciLHZhbHVlOl92bS5kYXRhJiZfdm0uZGF0YS5sZW5ndGg+MCxleHByZXNzaW9uOiJkYXRhICYmIGRhdGEubGVuZ3RoID4gMCJ9LHtuYW1lOiJtb3VzZXdoZWVsIixyYXdOYW1lOiJ2LW1vdXNld2hlZWwiLHZhbHVlOl92bS5oYW5kbGVIZWFkZXJGb290ZXJNb3VzZXdoZWVsLGV4cHJlc3Npb246ImhhbmRsZUhlYWRlckZvb3Rlck1vdXNld2hlZWwifV0scmVmOiJmb290ZXJXcmFwcGVyIixzdGF0aWNDbGFzczoiZWwtdGFibGVfX2Zvb3Rlci13cmFwcGVyIn0sW19jKCJ0YWJsZS1mb290ZXIiLHtzdHlsZTp7d2lkdGg6X3ZtLmxheW91dC5ib2R5V2lkdGg/X3ZtLmxheW91dC5ib2R5V2lkdGgrInB4IjoiIn0sYXR0cnM6e3N0b3JlOl92bS5zdG9yZSxib3JkZXI6X3ZtLmJvcmRlciwic3VtLXRleHQiOl92bS5zdW1UZXh0fHxfdm0udCgiZWwudGFibGUuc3VtVGV4dCIpLCJzdW1tYXJ5LW1ldGhvZCI6X3ZtLnN1bW1hcnlNZXRob2QsImRlZmF1bHQtc29ydCI6X3ZtLmRlZmF1bHRTb3J0fX0pXSwxKTpfdm0uX2UoKSxfdm0uZml4ZWRDb2x1bW5zLmxlbmd0aD4wP19jKCJkaXYiLHtkaXJlY3RpdmVzOlt7bmFtZToibW91c2V3aGVlbCIscmF3TmFtZToidi1tb3VzZXdoZWVsIix2YWx1ZTpfdm0uaGFuZGxlRml4ZWRNb3VzZXdoZWVsLGV4cHJlc3Npb246ImhhbmRsZUZpeGVkTW91c2V3aGVlbCJ9XSxyZWY6ImZpeGVkV3JhcHBlciIsc3RhdGljQ2xhc3M6ImVsLXRhYmxlX19maXhlZCIsc3R5bGU6W3t3aWR0aDpfdm0ubGF5b3V0LmZpeGVkV2lkdGg/X3ZtLmxheW91dC5maXhlZFdpZHRoKyJweCI6IiJ9LF92bS5maXhlZEhlaWdodF19LFtfdm0uc2hvd0hlYWRlcj9fYygiZGl2Iix7cmVmOiJmaXhlZEhlYWRlcldyYXBwZXIiLHN0YXRpY0NsYXNzOiJlbC10YWJsZV9fZml4ZWQtaGVhZGVyLXdyYXBwZXIifSxbX2MoInRhYmxlLWhlYWRlciIse3JlZjoiZml4ZWRUYWJsZUhlYWRlciIsc3R5bGU6e3dpZHRoOl92bS5ib2R5V2lkdGh9LGF0dHJzOntmaXhlZDoibGVmdCIsYm9yZGVyOl92bS5ib3JkZXIsc3RvcmU6X3ZtLnN0b3JlfX0pXSwxKTpfdm0uX2UoKSxfYygiZGl2Iix7cmVmOiJmaXhlZEJvZHlXcmFwcGVyIixzdGF0aWNDbGFzczoiZWwtdGFibGVfX2ZpeGVkLWJvZHktd3JhcHBlciIsc3R5bGU6W3t0b3A6X3ZtLmxheW91dC5oZWFkZXJIZWlnaHQrInB4In0sX3ZtLmZpeGVkQm9keUhlaWdodF19LFtfYygidGFibGUtYm9keSIse3N0eWxlOnt3aWR0aDpfdm0uYm9keVdpZHRofSxhdHRyczp7Zml4ZWQ6ImxlZnQiLHN0b3JlOl92bS5zdG9yZSxzdHJpcGU6X3ZtLnN0cmlwZSxoaWdobGlnaHQ6X3ZtLmhpZ2hsaWdodEN1cnJlbnRSb3csInJvdy1jbGFzcy1uYW1lIjpfdm0ucm93Q2xhc3NOYW1lLCJyb3ctc3R5bGUiOl92bS5yb3dTdHlsZX19KSxfdm0uJHNsb3RzLmFwcGVuZD9fYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXRhYmxlX19hcHBlbmQtZ3V0dGVyIixzdHlsZTp7aGVpZ2h0Ol92bS5sYXlvdXQuYXBwZW5kSGVpZ2h0KyJweCJ9fSk6X3ZtLl9lKCldLDEpLF92bS5zaG93U3VtbWFyeT9fYygiZGl2Iix7ZGlyZWN0aXZlczpbe25hbWU6InNob3ciLHJhd05hbWU6InYtc2hvdyIsdmFsdWU6X3ZtLmRhdGEmJl92bS5kYXRhLmxlbmd0aD4wLGV4cHJlc3Npb246ImRhdGEgJiYgZGF0YS5sZW5ndGggPiAwIn1dLHJlZjoiZml4ZWRGb290ZXJXcmFwcGVyIixzdGF0aWNDbGFzczoiZWwtdGFibGVfX2ZpeGVkLWZvb3Rlci13cmFwcGVyIn0sW19jKCJ0YWJsZS1mb290ZXIiLHtzdHlsZTp7d2lkdGg6X3ZtLmJvZHlXaWR0aH0sYXR0cnM6e2ZpeGVkOiJsZWZ0Iixib3JkZXI6X3ZtLmJvcmRlciwic3VtLXRleHQiOl92bS5zdW1UZXh0fHxfdm0udCgiZWwudGFibGUuc3VtVGV4dCIpLCJzdW1tYXJ5LW1ldGhvZCI6X3ZtLnN1bW1hcnlNZXRob2Qsc3RvcmU6X3ZtLnN0b3JlfX0pXSwxKTpfdm0uX2UoKV0pOl92bS5fZSgpLF92bS5yaWdodEZpeGVkQ29sdW1ucy5sZW5ndGg+MD9fYygiZGl2Iix7ZGlyZWN0aXZlczpbe25hbWU6Im1vdXNld2hlZWwiLHJhd05hbWU6InYtbW91c2V3aGVlbCIsdmFsdWU6X3ZtLmhhbmRsZUZpeGVkTW91c2V3aGVlbCxleHByZXNzaW9uOiJoYW5kbGVGaXhlZE1vdXNld2hlZWwifV0scmVmOiJyaWdodEZpeGVkV3JhcHBlciIsc3RhdGljQ2xhc3M6ImVsLXRhYmxlX19maXhlZC1yaWdodCIsc3R5bGU6W3t3aWR0aDpfdm0ubGF5b3V0LnJpZ2h0Rml4ZWRXaWR0aD9fdm0ubGF5b3V0LnJpZ2h0Rml4ZWRXaWR0aCsicHgiOiIiLHJpZ2h0Ol92bS5sYXlvdXQuc2Nyb2xsWT8oX3ZtLmJvcmRlcj9fdm0ubGF5b3V0Lmd1dHRlcldpZHRoOl92bS5sYXlvdXQuZ3V0dGVyV2lkdGh8fDApKyJweCI6IiJ9LF92bS5maXhlZEhlaWdodF19LFtfdm0uc2hvd0hlYWRlcj9fYygiZGl2Iix7cmVmOiJyaWdodEZpeGVkSGVhZGVyV3JhcHBlciIsc3RhdGljQ2xhc3M6ImVsLXRhYmxlX19maXhlZC1oZWFkZXItd3JhcHBlciJ9LFtfYygidGFibGUtaGVhZGVyIix7cmVmOiJyaWdodEZpeGVkVGFibGVIZWFkZXIiLHN0eWxlOnt3aWR0aDpfdm0uYm9keVdpZHRofSxhdHRyczp7Zml4ZWQ6InJpZ2h0Iixib3JkZXI6X3ZtLmJvcmRlcixzdG9yZTpfdm0uc3RvcmV9fSldLDEpOl92bS5fZSgpLF9jKCJkaXYiLHtyZWY6InJpZ2h0Rml4ZWRCb2R5V3JhcHBlciIsc3RhdGljQ2xhc3M6ImVsLXRhYmxlX19maXhlZC1ib2R5LXdyYXBwZXIiLHN0eWxlOlt7dG9wOl92bS5sYXlvdXQuaGVhZGVySGVpZ2h0KyJweCJ9LF92bS5maXhlZEJvZHlIZWlnaHRdfSxbX2MoInRhYmxlLWJvZHkiLHtzdHlsZTp7d2lkdGg6X3ZtLmJvZHlXaWR0aH0sYXR0cnM6e2ZpeGVkOiJyaWdodCIsc3RvcmU6X3ZtLnN0b3JlLHN0cmlwZTpfdm0uc3RyaXBlLCJyb3ctY2xhc3MtbmFtZSI6X3ZtLnJvd0NsYXNzTmFtZSwicm93LXN0eWxlIjpfdm0ucm93U3R5bGUsaGlnaGxpZ2h0Ol92bS5oaWdobGlnaHRDdXJyZW50Um93fX0pLF92bS4kc2xvdHMuYXBwZW5kP19jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtdGFibGVfX2FwcGVuZC1ndXR0ZXIiLHN0eWxlOntoZWlnaHQ6X3ZtLmxheW91dC5hcHBlbmRIZWlnaHQrInB4In19KTpfdm0uX2UoKV0sMSksX3ZtLnNob3dTdW1tYXJ5P19jKCJkaXYiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTpfdm0uZGF0YSYmX3ZtLmRhdGEubGVuZ3RoPjAsZXhwcmVzc2lvbjoiZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDAifV0scmVmOiJyaWdodEZpeGVkRm9vdGVyV3JhcHBlciIsc3RhdGljQ2xhc3M6ImVsLXRhYmxlX19maXhlZC1mb290ZXItd3JhcHBlciJ9LFtfYygidGFibGUtZm9vdGVyIix7c3R5bGU6e3dpZHRoOl92bS5ib2R5V2lkdGh9LGF0dHJzOntmaXhlZDoicmlnaHQiLGJvcmRlcjpfdm0uYm9yZGVyLCJzdW0tdGV4dCI6X3ZtLnN1bVRleHR8fF92bS50KCJlbC50YWJsZS5zdW1UZXh0IiksInN1bW1hcnktbWV0aG9kIjpfdm0uc3VtbWFyeU1ldGhvZCxzdG9yZTpfdm0uc3RvcmV9fSldLDEpOl92bS5fZSgpXSk6X3ZtLl9lKCksX3ZtLnJpZ2h0Rml4ZWRDb2x1bW5zLmxlbmd0aD4wP19jKCJkaXYiLHtyZWY6InJpZ2h0Rml4ZWRQYXRjaCIsc3RhdGljQ2xhc3M6ImVsLXRhYmxlX19maXhlZC1yaWdodC1wYXRjaCIsc3R5bGU6e3dpZHRoOl92bS5sYXlvdXQuc2Nyb2xsWT9fdm0ubGF5b3V0Lmd1dHRlcldpZHRoKyJweCI6IjAiLGhlaWdodDpfdm0ubGF5b3V0LmhlYWRlckhlaWdodCsicHgifX0pOl92bS5fZSgpLF9jKCJkaXYiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTpfdm0ucmVzaXplUHJveHlWaXNpYmxlLGV4cHJlc3Npb246InJlc2l6ZVByb3h5VmlzaWJsZSJ9XSxyZWY6InJlc2l6ZVByb3h5IixzdGF0aWNDbGFzczoiZWwtdGFibGVfX2NvbHVtbi1yZXNpemUtcHJveHkifSldKTt9O3ZhciB0YWJsZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQ5M2ZlMzRlX3N0YXRpY1JlbmRlckZucz1bXTt0YWJsZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQ5M2ZlMzRlX3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90YWJsZS9zcmMvdGFibGUudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTQ5M2ZlMzRlJgovLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsICJlbGVtZW50LXVpL2xpYi9jaGVja2JveCIKdmFyIGNoZWNrYm94Xz1fX3dlYnBhY2tfcmVxdWlyZV9fKDE2KTt2YXIgY2hlY2tib3hfZGVmYXVsdD0vKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNoZWNrYm94Xyk7Ly8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCAidGhyb3R0bGUtZGVib3VuY2UiCnZhciBleHRlcm5hbF90aHJvdHRsZV9kZWJvdW5jZV89X193ZWJwYWNrX3JlcXVpcmVfXygzNSk7Ly8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCAibm9ybWFsaXplLXdoZWVsIgp2YXIgZXh0ZXJuYWxfbm9ybWFsaXplX3doZWVsXz1fX3dlYnBhY2tfcmVxdWlyZV9fKDM4KTt2YXIgZXh0ZXJuYWxfbm9ybWFsaXplX3doZWVsX2RlZmF1bHQ9LyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihleHRlcm5hbF9ub3JtYWxpemVfd2hlZWxfKTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXJlY3RpdmVzL21vdXNld2hlZWwuanMKdmFyIGlzRmlyZWZveD10eXBlb2YgbmF2aWdhdG9yIT09J3VuZGVmaW5lZCcmJm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdmaXJlZm94Jyk+LTE7dmFyIG1vdXNld2hlZWxfbW91c2V3aGVlbD1mdW5jdGlvbiBtb3VzZXdoZWVsKGVsZW1lbnQsY2FsbGJhY2spe2lmKGVsZW1lbnQmJmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcil7ZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGlzRmlyZWZveD8nRE9NTW91c2VTY3JvbGwnOidtb3VzZXdoZWVsJyxmdW5jdGlvbihldmVudCl7dmFyIG5vcm1hbGl6ZWQ9ZXh0ZXJuYWxfbm9ybWFsaXplX3doZWVsX2RlZmF1bHQoKShldmVudCk7Y2FsbGJhY2smJmNhbGxiYWNrLmFwcGx5KHRoaXMsW2V2ZW50LG5vcm1hbGl6ZWRdKTt9KTt9fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGRpcmVjdGl2ZXNfbW91c2V3aGVlbD17YmluZDpmdW5jdGlvbiBiaW5kKGVsLGJpbmRpbmcpe21vdXNld2hlZWxfbW91c2V3aGVlbChlbCxiaW5kaW5nLnZhbHVlKTt9fTsvLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsICJ2dWUiCnZhciBleHRlcm5hbF92dWVfPV9fd2VicGFja19yZXF1aXJlX18oNik7dmFyIGV4dGVybmFsX3Z1ZV9kZWZhdWx0PS8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oZXh0ZXJuYWxfdnVlXyk7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90YWJsZS9zcmMvdXRpbC5qcwp2YXIgdXRpbF90eXBlb2Y9dHlwZW9mIFN5bWJvbD09PSJmdW5jdGlvbiImJl90eXBlb2YyKFN5bWJvbC5pdGVyYXRvcik9PT0ic3ltYm9sIj9mdW5jdGlvbihvYmope3JldHVybiBfdHlwZW9mMihvYmopO306ZnVuY3Rpb24ob2JqKXtyZXR1cm4gb2JqJiZ0eXBlb2YgU3ltYm9sPT09ImZ1bmN0aW9uIiYmb2JqLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZvYmohPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOl90eXBlb2YyKG9iaik7fTt2YXIgZ2V0Q2VsbD1mdW5jdGlvbiBnZXRDZWxsKGV2ZW50KXt2YXIgY2VsbD1ldmVudC50YXJnZXQ7d2hpbGUoY2VsbCYmY2VsbC50YWdOYW1lLnRvVXBwZXJDYXNlKCkhPT0nSFRNTCcpe2lmKGNlbGwudGFnTmFtZS50b1VwcGVyQ2FzZSgpPT09J1REJyl7cmV0dXJuIGNlbGw7fWNlbGw9Y2VsbC5wYXJlbnROb2RlO31yZXR1cm4gbnVsbDt9O3ZhciB1dGlsX2lzT2JqZWN0PWZ1bmN0aW9uIGlzT2JqZWN0KG9iail7cmV0dXJuIG9iaiE9PW51bGwmJih0eXBlb2Ygb2JqPT09J3VuZGVmaW5lZCc/J3VuZGVmaW5lZCc6dXRpbF90eXBlb2Yob2JqKSk9PT0nb2JqZWN0Jzt9O3ZhciB1dGlsX29yZGVyQnk9ZnVuY3Rpb24gb3JkZXJCeShhcnJheSxzb3J0S2V5LHJldmVyc2Usc29ydE1ldGhvZCxzb3J0Qnkpe2lmKCFzb3J0S2V5JiYhc29ydE1ldGhvZCYmKCFzb3J0Qnl8fEFycmF5LmlzQXJyYXkoc29ydEJ5KSYmIXNvcnRCeS5sZW5ndGgpKXtyZXR1cm4gYXJyYXk7fWlmKHR5cGVvZiByZXZlcnNlPT09J3N0cmluZycpe3JldmVyc2U9cmV2ZXJzZT09PSdkZXNjZW5kaW5nJz8tMToxO31lbHNle3JldmVyc2U9cmV2ZXJzZSYmcmV2ZXJzZTwwPy0xOjE7fXZhciBnZXRLZXk9c29ydE1ldGhvZD9udWxsOmZ1bmN0aW9uKHZhbHVlLGluZGV4KXtpZihzb3J0Qnkpe2lmKCFBcnJheS5pc0FycmF5KHNvcnRCeSkpe3NvcnRCeT1bc29ydEJ5XTt9cmV0dXJuIHNvcnRCeS5tYXAoZnVuY3Rpb24oYnkpe2lmKHR5cGVvZiBieT09PSdzdHJpbmcnKXtyZXR1cm4gT2JqZWN0KHV0aWxfWyJnZXRWYWx1ZUJ5UGF0aCJdKSh2YWx1ZSxieSk7fWVsc2V7cmV0dXJuIGJ5KHZhbHVlLGluZGV4LGFycmF5KTt9fSk7fWlmKHNvcnRLZXkhPT0nJGtleScpe2lmKHV0aWxfaXNPYmplY3QodmFsdWUpJiYnJHZhbHVlJ2luIHZhbHVlKXZhbHVlPXZhbHVlLiR2YWx1ZTt9cmV0dXJuW3V0aWxfaXNPYmplY3QodmFsdWUpP09iamVjdCh1dGlsX1siZ2V0VmFsdWVCeVBhdGgiXSkodmFsdWUsc29ydEtleSk6dmFsdWVdO307dmFyIGNvbXBhcmU9ZnVuY3Rpb24gY29tcGFyZShhLGIpe2lmKHNvcnRNZXRob2Qpe3JldHVybiBzb3J0TWV0aG9kKGEudmFsdWUsYi52YWx1ZSk7fWZvcih2YXIgaT0wLGxlbj1hLmtleS5sZW5ndGg7aTxsZW47aSsrKXtpZihhLmtleVtpXTxiLmtleVtpXSl7cmV0dXJuLTE7fWlmKGEua2V5W2ldPmIua2V5W2ldKXtyZXR1cm4gMTt9fXJldHVybiAwO307cmV0dXJuIGFycmF5Lm1hcChmdW5jdGlvbih2YWx1ZSxpbmRleCl7cmV0dXJue3ZhbHVlOnZhbHVlLGluZGV4OmluZGV4LGtleTpnZXRLZXk/Z2V0S2V5KHZhbHVlLGluZGV4KTpudWxsfTt9KS5zb3J0KGZ1bmN0aW9uKGEsYil7dmFyIG9yZGVyPWNvbXBhcmUoYSxiKTtpZighb3JkZXIpey8vIG1ha2Ugc3RhYmxlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NvcnRpbmdfYWxnb3JpdGhtI1N0YWJpbGl0eQpvcmRlcj1hLmluZGV4LWIuaW5kZXg7fXJldHVybiBvcmRlcipyZXZlcnNlO30pLm1hcChmdW5jdGlvbihpdGVtKXtyZXR1cm4gaXRlbS52YWx1ZTt9KTt9O3ZhciBnZXRDb2x1bW5CeUlkPWZ1bmN0aW9uIGdldENvbHVtbkJ5SWQodGFibGUsY29sdW1uSWQpe3ZhciBjb2x1bW49bnVsbDt0YWJsZS5jb2x1bW5zLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7aWYoaXRlbS5pZD09PWNvbHVtbklkKXtjb2x1bW49aXRlbTt9fSk7cmV0dXJuIGNvbHVtbjt9O3ZhciBnZXRDb2x1bW5CeUtleT1mdW5jdGlvbiBnZXRDb2x1bW5CeUtleSh0YWJsZSxjb2x1bW5LZXkpe3ZhciBjb2x1bW49bnVsbDtmb3IodmFyIGk9MDtpPHRhYmxlLmNvbHVtbnMubGVuZ3RoO2krKyl7dmFyIGl0ZW09dGFibGUuY29sdW1uc1tpXTtpZihpdGVtLmNvbHVtbktleT09PWNvbHVtbktleSl7Y29sdW1uPWl0ZW07YnJlYWs7fX1yZXR1cm4gY29sdW1uO307dmFyIGdldENvbHVtbkJ5Q2VsbD1mdW5jdGlvbiBnZXRDb2x1bW5CeUNlbGwodGFibGUsY2VsbCl7dmFyIG1hdGNoZXM9KGNlbGwuY2xhc3NOYW1lfHwnJykubWF0Y2goL2VsLXRhYmxlX1teXHNdKy9nbSk7aWYobWF0Y2hlcyl7cmV0dXJuIGdldENvbHVtbkJ5SWQodGFibGUsbWF0Y2hlc1swXSk7fXJldHVybiBudWxsO307dmFyIGdldFJvd0lkZW50aXR5PWZ1bmN0aW9uIGdldFJvd0lkZW50aXR5KHJvdyxyb3dLZXkpe2lmKCFyb3cpdGhyb3cgbmV3IEVycm9yKCdyb3cgaXMgcmVxdWlyZWQgd2hlbiBnZXQgcm93IGlkZW50aXR5Jyk7aWYodHlwZW9mIHJvd0tleT09PSdzdHJpbmcnKXtpZihyb3dLZXkuaW5kZXhPZignLicpPDApe3JldHVybiByb3dbcm93S2V5XTt9dmFyIGtleT1yb3dLZXkuc3BsaXQoJy4nKTt2YXIgY3VycmVudD1yb3c7Zm9yKHZhciBpPTA7aTxrZXkubGVuZ3RoO2krKyl7Y3VycmVudD1jdXJyZW50W2tleVtpXV07fXJldHVybiBjdXJyZW50O31lbHNlIGlmKHR5cGVvZiByb3dLZXk9PT0nZnVuY3Rpb24nKXtyZXR1cm4gcm93S2V5LmNhbGwobnVsbCxyb3cpO319O3ZhciBnZXRLZXlzTWFwPWZ1bmN0aW9uIGdldEtleXNNYXAoYXJyYXkscm93S2V5KXt2YXIgYXJyYXlNYXA9e307KGFycmF5fHxbXSkuZm9yRWFjaChmdW5jdGlvbihyb3csaW5kZXgpe2FycmF5TWFwW2dldFJvd0lkZW50aXR5KHJvdyxyb3dLZXkpXT17cm93OnJvdyxpbmRleDppbmRleH07fSk7cmV0dXJuIGFycmF5TWFwO307ZnVuY3Rpb24gaGFzT3duKG9iaixrZXkpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLGtleSk7fWZ1bmN0aW9uIG1lcmdlT3B0aW9ucyhkZWZhdWx0cyxjb25maWcpe3ZhciBvcHRpb25zPXt9O3ZhciBrZXk9dm9pZCAwO2ZvcihrZXkgaW4gZGVmYXVsdHMpe29wdGlvbnNba2V5XT1kZWZhdWx0c1trZXldO31mb3Ioa2V5IGluIGNvbmZpZyl7aWYoaGFzT3duKGNvbmZpZyxrZXkpKXt2YXIgdmFsdWU9Y29uZmlnW2tleV07aWYodHlwZW9mIHZhbHVlIT09J3VuZGVmaW5lZCcpe29wdGlvbnNba2V5XT12YWx1ZTt9fX1yZXR1cm4gb3B0aW9uczt9ZnVuY3Rpb24gcGFyc2VXaWR0aCh3aWR0aCl7aWYod2lkdGghPT11bmRlZmluZWQpe3dpZHRoPXBhcnNlSW50KHdpZHRoLDEwKTtpZihpc05hTih3aWR0aCkpe3dpZHRoPW51bGw7fX1yZXR1cm4gd2lkdGg7fWZ1bmN0aW9uIHBhcnNlTWluV2lkdGgobWluV2lkdGgpe2lmKHR5cGVvZiBtaW5XaWR0aCE9PSd1bmRlZmluZWQnKXttaW5XaWR0aD1wYXJzZVdpZHRoKG1pbldpZHRoKTtpZihpc05hTihtaW5XaWR0aCkpe21pbldpZHRoPTgwO319cmV0dXJuIG1pbldpZHRoO307ZnVuY3Rpb24gcGFyc2VIZWlnaHQoaGVpZ2h0KXtpZih0eXBlb2YgaGVpZ2h0PT09J251bWJlcicpe3JldHVybiBoZWlnaHQ7fWlmKHR5cGVvZiBoZWlnaHQ9PT0nc3RyaW5nJyl7aWYoL15cZCsoPzpweCk/JC8udGVzdChoZWlnaHQpKXtyZXR1cm4gcGFyc2VJbnQoaGVpZ2h0LDEwKTt9ZWxzZXtyZXR1cm4gaGVpZ2h0O319cmV0dXJuIG51bGw7fS8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWR1eGpzL3JlZHV4L2Jsb2IvbWFzdGVyL3NyYy9jb21wb3NlLmpzCmZ1bmN0aW9uIGNvbXBvc2UoKXtmb3IodmFyIF9sZW49YXJndW1lbnRzLmxlbmd0aCxmdW5jcz1BcnJheShfbGVuKSxfa2V5PTA7X2tleTxfbGVuO19rZXkrKyl7ZnVuY3NbX2tleV09YXJndW1lbnRzW19rZXldO31pZihmdW5jcy5sZW5ndGg9PT0wKXtyZXR1cm4gZnVuY3Rpb24oYXJnKXtyZXR1cm4gYXJnO307fWlmKGZ1bmNzLmxlbmd0aD09PTEpe3JldHVybiBmdW5jc1swXTt9cmV0dXJuIGZ1bmNzLnJlZHVjZShmdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBhKGIuYXBwbHkodW5kZWZpbmVkLGFyZ3VtZW50cykpO307fSk7fWZ1bmN0aW9uIHRvZ2dsZVJvd1N0YXR1cyhzdGF0dXNBcnIscm93LG5ld1ZhbCl7dmFyIGNoYW5nZWQ9ZmFsc2U7dmFyIGluZGV4PXN0YXR1c0Fyci5pbmRleE9mKHJvdyk7dmFyIGluY2x1ZGVkPWluZGV4IT09LTE7dmFyIGFkZFJvdz1mdW5jdGlvbiBhZGRSb3coKXtzdGF0dXNBcnIucHVzaChyb3cpO2NoYW5nZWQ9dHJ1ZTt9O3ZhciByZW1vdmVSb3c9ZnVuY3Rpb24gcmVtb3ZlUm93KCl7c3RhdHVzQXJyLnNwbGljZShpbmRleCwxKTtjaGFuZ2VkPXRydWU7fTtpZih0eXBlb2YgbmV3VmFsPT09J2Jvb2xlYW4nKXtpZihuZXdWYWwmJiFpbmNsdWRlZCl7YWRkUm93KCk7fWVsc2UgaWYoIW5ld1ZhbCYmaW5jbHVkZWQpe3JlbW92ZVJvdygpO319ZWxzZXtpZihpbmNsdWRlZCl7cmVtb3ZlUm93KCk7fWVsc2V7YWRkUm93KCk7fX1yZXR1cm4gY2hhbmdlZDt9ZnVuY3Rpb24gd2Fsa1RyZWVOb2RlKHJvb3QsY2Ipe3ZhciBjaGlsZHJlbktleT1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMl06J2NoaWxkcmVuJzt2YXIgbGF6eUtleT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbM106J2hhc0NoaWxkcmVuJzt2YXIgaXNOaWw9ZnVuY3Rpb24gaXNOaWwoYXJyYXkpe3JldHVybiEoQXJyYXkuaXNBcnJheShhcnJheSkmJmFycmF5Lmxlbmd0aCk7fTtmdW5jdGlvbiBfd2Fsa2VyKHBhcmVudCxjaGlsZHJlbixsZXZlbCl7Y2IocGFyZW50LGNoaWxkcmVuLGxldmVsKTtjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pe2lmKGl0ZW1bbGF6eUtleV0pe2NiKGl0ZW0sbnVsbCxsZXZlbCsxKTtyZXR1cm47fXZhciBjaGlsZHJlbj1pdGVtW2NoaWxkcmVuS2V5XTtpZighaXNOaWwoY2hpbGRyZW4pKXtfd2Fsa2VyKGl0ZW0sY2hpbGRyZW4sbGV2ZWwrMSk7fX0pO31yb290LmZvckVhY2goZnVuY3Rpb24oaXRlbSl7aWYoaXRlbVtsYXp5S2V5XSl7Y2IoaXRlbSxudWxsLDApO3JldHVybjt9dmFyIGNoaWxkcmVuPWl0ZW1bY2hpbGRyZW5LZXldO2lmKCFpc05pbChjaGlsZHJlbikpe193YWxrZXIoaXRlbSxjaGlsZHJlbiwwKTt9fSk7fS8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGFibGUvc3JjL3N0b3JlL2V4cGFuZC5qcwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGV4cGFuZD17ZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue3N0YXRlczp7ZGVmYXVsdEV4cGFuZEFsbDpmYWxzZSxleHBhbmRSb3dzOltdfX07fSxtZXRob2RzOnt1cGRhdGVFeHBhbmRSb3dzOmZ1bmN0aW9uIHVwZGF0ZUV4cGFuZFJvd3MoKXt2YXIgX3N0YXRlcz10aGlzLnN0YXRlcyxfc3RhdGVzJGRhdGE9X3N0YXRlcy5kYXRhLGRhdGE9X3N0YXRlcyRkYXRhPT09dW5kZWZpbmVkP1tdOl9zdGF0ZXMkZGF0YSxyb3dLZXk9X3N0YXRlcy5yb3dLZXksZGVmYXVsdEV4cGFuZEFsbD1fc3RhdGVzLmRlZmF1bHRFeHBhbmRBbGwsZXhwYW5kUm93cz1fc3RhdGVzLmV4cGFuZFJvd3M7aWYoZGVmYXVsdEV4cGFuZEFsbCl7dGhpcy5zdGF0ZXMuZXhwYW5kUm93cz1kYXRhLnNsaWNlKCk7fWVsc2UgaWYocm93S2V5KXsvLyBUT0RP77ya6L+Z6YeM55qE5Luj56CB5Y+v5Lul5LyY5YyWCnZhciBleHBhbmRSb3dzTWFwPWdldEtleXNNYXAoZXhwYW5kUm93cyxyb3dLZXkpO3RoaXMuc3RhdGVzLmV4cGFuZFJvd3M9ZGF0YS5yZWR1Y2UoZnVuY3Rpb24ocHJldixyb3cpe3ZhciByb3dJZD1nZXRSb3dJZGVudGl0eShyb3cscm93S2V5KTt2YXIgcm93SW5mbz1leHBhbmRSb3dzTWFwW3Jvd0lkXTtpZihyb3dJbmZvKXtwcmV2LnB1c2gocm93KTt9cmV0dXJuIHByZXY7fSxbXSk7fWVsc2V7dGhpcy5zdGF0ZXMuZXhwYW5kUm93cz1bXTt9fSx0b2dnbGVSb3dFeHBhbnNpb246ZnVuY3Rpb24gdG9nZ2xlUm93RXhwYW5zaW9uKHJvdyxleHBhbmRlZCl7dmFyIGNoYW5nZWQ9dG9nZ2xlUm93U3RhdHVzKHRoaXMuc3RhdGVzLmV4cGFuZFJvd3Mscm93LGV4cGFuZGVkKTtpZihjaGFuZ2VkKXt0aGlzLnRhYmxlLiRlbWl0KCdleHBhbmQtY2hhbmdlJyxyb3csdGhpcy5zdGF0ZXMuZXhwYW5kUm93cy5zbGljZSgpKTt0aGlzLnNjaGVkdWxlTGF5b3V0KCk7fX0sc2V0RXhwYW5kUm93S2V5czpmdW5jdGlvbiBzZXRFeHBhbmRSb3dLZXlzKHJvd0tleXMpe3RoaXMuYXNzZXJ0Um93S2V5KCk7Ly8gVE9ET++8mui/memHjOeahOS7o+eggeWPr+S7peS8mOWMlgp2YXIgX3N0YXRlczI9dGhpcy5zdGF0ZXMsZGF0YT1fc3RhdGVzMi5kYXRhLHJvd0tleT1fc3RhdGVzMi5yb3dLZXk7dmFyIGtleXNNYXA9Z2V0S2V5c01hcChkYXRhLHJvd0tleSk7dGhpcy5zdGF0ZXMuZXhwYW5kUm93cz1yb3dLZXlzLnJlZHVjZShmdW5jdGlvbihwcmV2LGN1cil7dmFyIGluZm89a2V5c01hcFtjdXJdO2lmKGluZm8pe3ByZXYucHVzaChpbmZvLnJvdyk7fXJldHVybiBwcmV2O30sW10pO30saXNSb3dFeHBhbmRlZDpmdW5jdGlvbiBpc1Jvd0V4cGFuZGVkKHJvdyl7dmFyIF9zdGF0ZXMzPXRoaXMuc3RhdGVzLF9zdGF0ZXMzJGV4cGFuZFJvd3M9X3N0YXRlczMuZXhwYW5kUm93cyxleHBhbmRSb3dzPV9zdGF0ZXMzJGV4cGFuZFJvd3M9PT11bmRlZmluZWQ/W106X3N0YXRlczMkZXhwYW5kUm93cyxyb3dLZXk9X3N0YXRlczMucm93S2V5O2lmKHJvd0tleSl7dmFyIGV4cGFuZE1hcD1nZXRLZXlzTWFwKGV4cGFuZFJvd3Mscm93S2V5KTtyZXR1cm4hIWV4cGFuZE1hcFtnZXRSb3dJZGVudGl0eShyb3cscm93S2V5KV07fXJldHVybiBleHBhbmRSb3dzLmluZGV4T2Yocm93KSE9PS0xO319fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYmxlL3NyYy9zdG9yZS9jdXJyZW50LmpzCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgY3VycmVudD17ZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue3N0YXRlczp7Ly8g5LiN5Y+v5ZON5bqU55qE77yM6K6+572uIGN1cnJlbnRSb3dLZXkg5pe277yMZGF0YSDkuI3kuIDlrprlrZjlnKjvvIzkuZ/orrjml6Dms5Xnrpflh7rmraPnoa7nmoQgY3VycmVudFJvdwovLyDmioror6XlgLznvJPlrZjkuIDkuIvvvIzlvZPnlKjmiLfngrnlh7vkv67mlLkgY3VycmVudFJvdyDml7bvvIzmioror6XlgLzph43nva7kuLogbnVsbApfY3VycmVudFJvd0tleTpudWxsLGN1cnJlbnRSb3c6bnVsbH19O30sbWV0aG9kczp7c2V0Q3VycmVudFJvd0tleTpmdW5jdGlvbiBzZXRDdXJyZW50Um93S2V5KGtleSl7dGhpcy5hc3NlcnRSb3dLZXkoKTt0aGlzLnN0YXRlcy5fY3VycmVudFJvd0tleT1rZXk7dGhpcy5zZXRDdXJyZW50Um93QnlLZXkoa2V5KTt9LHJlc3RvcmVDdXJyZW50Um93S2V5OmZ1bmN0aW9uIHJlc3RvcmVDdXJyZW50Um93S2V5KCl7dGhpcy5zdGF0ZXMuX2N1cnJlbnRSb3dLZXk9bnVsbDt9LHNldEN1cnJlbnRSb3dCeUtleTpmdW5jdGlvbiBzZXRDdXJyZW50Um93QnlLZXkoa2V5KXt2YXIgc3RhdGVzPXRoaXMuc3RhdGVzO3ZhciBfc3RhdGVzJGRhdGE9c3RhdGVzLmRhdGEsZGF0YT1fc3RhdGVzJGRhdGE9PT11bmRlZmluZWQ/W106X3N0YXRlcyRkYXRhLHJvd0tleT1zdGF0ZXMucm93S2V5O3ZhciBjdXJyZW50Um93PW51bGw7aWYocm93S2V5KXtjdXJyZW50Um93PU9iamVjdCh1dGlsX1siYXJyYXlGaW5kIl0pKGRhdGEsZnVuY3Rpb24oaXRlbSl7cmV0dXJuIGdldFJvd0lkZW50aXR5KGl0ZW0scm93S2V5KT09PWtleTt9KTt9c3RhdGVzLmN1cnJlbnRSb3c9Y3VycmVudFJvdzt9LHVwZGF0ZUN1cnJlbnRSb3c6ZnVuY3Rpb24gdXBkYXRlQ3VycmVudFJvdyhjdXJyZW50Um93KXt2YXIgc3RhdGVzPXRoaXMuc3RhdGVzLHRhYmxlPXRoaXMudGFibGU7dmFyIG9sZEN1cnJlbnRSb3c9c3RhdGVzLmN1cnJlbnRSb3c7aWYoY3VycmVudFJvdyYmY3VycmVudFJvdyE9PW9sZEN1cnJlbnRSb3cpe3N0YXRlcy5jdXJyZW50Um93PWN1cnJlbnRSb3c7dGFibGUuJGVtaXQoJ2N1cnJlbnQtY2hhbmdlJyxjdXJyZW50Um93LG9sZEN1cnJlbnRSb3cpO3JldHVybjt9aWYoIWN1cnJlbnRSb3cmJm9sZEN1cnJlbnRSb3cpe3N0YXRlcy5jdXJyZW50Um93PW51bGw7dGFibGUuJGVtaXQoJ2N1cnJlbnQtY2hhbmdlJyxudWxsLG9sZEN1cnJlbnRSb3cpO319LHVwZGF0ZUN1cnJlbnRSb3dEYXRhOmZ1bmN0aW9uIHVwZGF0ZUN1cnJlbnRSb3dEYXRhKCl7dmFyIHN0YXRlcz10aGlzLnN0YXRlcyx0YWJsZT10aGlzLnRhYmxlO3ZhciByb3dLZXk9c3RhdGVzLnJvd0tleSxfY3VycmVudFJvd0tleT1zdGF0ZXMuX2N1cnJlbnRSb3dLZXk7Ly8gZGF0YSDkuLogbnVsbCDml7bvvIzop6PmnoTml7bnmoTpu5jorqTlgLzkvJrooqvlv73nlaUKdmFyIGRhdGE9c3RhdGVzLmRhdGF8fFtdO3ZhciBvbGRDdXJyZW50Um93PXN0YXRlcy5jdXJyZW50Um93Oy8vIOW9kyBjdXJyZW50Um93IOS4jeWcqCBkYXRhIOS4reaXtuWwneivleabtOaWsOaVsOaNrgppZihkYXRhLmluZGV4T2Yob2xkQ3VycmVudFJvdyk9PT0tMSYmb2xkQ3VycmVudFJvdyl7aWYocm93S2V5KXt2YXIgY3VycmVudFJvd0tleT1nZXRSb3dJZGVudGl0eShvbGRDdXJyZW50Um93LHJvd0tleSk7dGhpcy5zZXRDdXJyZW50Um93QnlLZXkoY3VycmVudFJvd0tleSk7fWVsc2V7c3RhdGVzLmN1cnJlbnRSb3c9bnVsbDt9aWYoc3RhdGVzLmN1cnJlbnRSb3c9PT1udWxsKXt0YWJsZS4kZW1pdCgnY3VycmVudC1jaGFuZ2UnLG51bGwsb2xkQ3VycmVudFJvdyk7fX1lbHNlIGlmKF9jdXJyZW50Um93S2V5KXsvLyDmiorliJ3lp4vml7bkuIvorr7nva7nmoQgcm93S2V5IOi9rOWMluaIkCByb3dEYXRhCnRoaXMuc2V0Q3VycmVudFJvd0J5S2V5KF9jdXJyZW50Um93S2V5KTt0aGlzLnJlc3RvcmVDdXJyZW50Um93S2V5KCk7fX19fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYmxlL3NyYy9zdG9yZS90cmVlLmpzCnZhciBfZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XTt9fX1yZXR1cm4gdGFyZ2V0O307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciB0cmVlPXtkYXRhOmZ1bmN0aW9uIGRhdGEoKXtyZXR1cm57c3RhdGVzOnsvLyBkZWZhdWx0RXhwYW5kQWxsIOWtmOWcqOS6jiBleHBhbmQuanMg5Lit77yM6L+Z6YeM5LiN6YeN5aSN5re75YqgCi8vIOWcqOWxleW8gOihjOS4re+8jGV4cGFuZFJvd0tleXMg5Lya6KKr6L2s5YyW5oiQIGV4cGFuZFJvd3PvvIxleHBhbmRSb3dLZXlzIOi/meS4quWxnuaAp+WPquaYr+iusOW9leS6hiBUcmVlVGFibGUg6KGM55qE5bGV5byACi8vIFRPRE86IOaLhuWIhuS4uueLrOeri+eahCBUcmVlVGFibGXvvIznu5/kuIDnlKjms5UKZXhwYW5kUm93S2V5czpbXSx0cmVlRGF0YTp7fSxpbmRlbnQ6MTYsbGF6eTpmYWxzZSxsYXp5VHJlZU5vZGVNYXA6e30sbGF6eUNvbHVtbklkZW50aWZpZXI6J2hhc0NoaWxkcmVuJyxjaGlsZHJlbkNvbHVtbk5hbWU6J2NoaWxkcmVuJ319O30sY29tcHV0ZWQ6ey8vIOW1jOWFpeWei+eahOaVsOaNru+8jHdhdGNoIOaXoOazleaYr+ajgOa1i+WIsOWPmOWMliBodHRwczovL2dpdGh1Yi5jb20vRWxlbWVGRS9lbGVtZW50L2lzc3Vlcy8xNDk5OAovLyBUT0RPOiDkvb/nlKggY29tcHV0ZWQg6Kej5Yaz6K+l6Zeu6aKY77yM5piv5ZCm5Lya6YCg5oiQ5oCn6IO96Zeu6aKY77yfCi8vIEByZXR1cm4geyBpZDogeyBsZXZlbCwgY2hpbGRyZW4gfSB9Cm5vcm1hbGl6ZWREYXRhOmZ1bmN0aW9uIG5vcm1hbGl6ZWREYXRhKCl7aWYoIXRoaXMuc3RhdGVzLnJvd0tleSlyZXR1cm57fTt2YXIgZGF0YT10aGlzLnN0YXRlcy5kYXRhfHxbXTtyZXR1cm4gdGhpcy5ub3JtYWxpemUoZGF0YSk7fSwvLyBAcmV0dXJuIHsgaWQ6IHsgY2hpbGRyZW4gfSB9Ci8vIOmSiOWvueaHkuWKoOi9veeahOaDheW9ou+8jOS4jeWkhOeQhuW1jOWll+aVsOaNrgpub3JtYWxpemVkTGF6eU5vZGU6ZnVuY3Rpb24gbm9ybWFsaXplZExhenlOb2RlKCl7dmFyIF9zdGF0ZXM9dGhpcy5zdGF0ZXMscm93S2V5PV9zdGF0ZXMucm93S2V5LGxhenlUcmVlTm9kZU1hcD1fc3RhdGVzLmxhenlUcmVlTm9kZU1hcCxsYXp5Q29sdW1uSWRlbnRpZmllcj1fc3RhdGVzLmxhenlDb2x1bW5JZGVudGlmaWVyO3ZhciBrZXlzPU9iamVjdC5rZXlzKGxhenlUcmVlTm9kZU1hcCk7dmFyIHJlcz17fTtpZigha2V5cy5sZW5ndGgpcmV0dXJuIHJlcztrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KXtpZihsYXp5VHJlZU5vZGVNYXBba2V5XS5sZW5ndGgpe3ZhciBpdGVtPXtjaGlsZHJlbjpbXX07bGF6eVRyZWVOb2RlTWFwW2tleV0uZm9yRWFjaChmdW5jdGlvbihyb3cpe3ZhciBjdXJyZW50Um93S2V5PWdldFJvd0lkZW50aXR5KHJvdyxyb3dLZXkpO2l0ZW0uY2hpbGRyZW4ucHVzaChjdXJyZW50Um93S2V5KTtpZihyb3dbbGF6eUNvbHVtbklkZW50aWZpZXJdJiYhcmVzW2N1cnJlbnRSb3dLZXldKXtyZXNbY3VycmVudFJvd0tleV09e2NoaWxkcmVuOltdfTt9fSk7cmVzW2tleV09aXRlbTt9fSk7cmV0dXJuIHJlczt9fSx3YXRjaDp7bm9ybWFsaXplZERhdGE6J3VwZGF0ZVRyZWVEYXRhJyxub3JtYWxpemVkTGF6eU5vZGU6J3VwZGF0ZVRyZWVEYXRhJ30sbWV0aG9kczp7bm9ybWFsaXplOmZ1bmN0aW9uIG5vcm1hbGl6ZShkYXRhKXt2YXIgX3N0YXRlczI9dGhpcy5zdGF0ZXMsY2hpbGRyZW5Db2x1bW5OYW1lPV9zdGF0ZXMyLmNoaWxkcmVuQ29sdW1uTmFtZSxsYXp5Q29sdW1uSWRlbnRpZmllcj1fc3RhdGVzMi5sYXp5Q29sdW1uSWRlbnRpZmllcixyb3dLZXk9X3N0YXRlczIucm93S2V5LGxhenk9X3N0YXRlczIubGF6eTt2YXIgcmVzPXt9O3dhbGtUcmVlTm9kZShkYXRhLGZ1bmN0aW9uKHBhcmVudCxjaGlsZHJlbixsZXZlbCl7dmFyIHBhcmVudElkPWdldFJvd0lkZW50aXR5KHBhcmVudCxyb3dLZXkpO2lmKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKXtyZXNbcGFyZW50SWRdPXtjaGlsZHJlbjpjaGlsZHJlbi5tYXAoZnVuY3Rpb24ocm93KXtyZXR1cm4gZ2V0Um93SWRlbnRpdHkocm93LHJvd0tleSk7fSksbGV2ZWw6bGV2ZWx9O31lbHNlIGlmKGxhenkpey8vIOW9kyBjaGlsZHJlbiDkuI3lrZjlnKjkuJQgbGF6eSDkuLogdHJ1Ze+8jOivpeiKgueCueWNs+S4uuaHkuWKoOi9veeahOiKgueCuQpyZXNbcGFyZW50SWRdPXtjaGlsZHJlbjpbXSxsYXp5OnRydWUsbGV2ZWw6bGV2ZWx9O319LGNoaWxkcmVuQ29sdW1uTmFtZSxsYXp5Q29sdW1uSWRlbnRpZmllcik7cmV0dXJuIHJlczt9LHVwZGF0ZVRyZWVEYXRhOmZ1bmN0aW9uIHVwZGF0ZVRyZWVEYXRhKCl7dmFyIG5lc3RlZD10aGlzLm5vcm1hbGl6ZWREYXRhO3ZhciBub3JtYWxpemVkTGF6eU5vZGU9dGhpcy5ub3JtYWxpemVkTGF6eU5vZGU7dmFyIGtleXM9T2JqZWN0LmtleXMobmVzdGVkKTt2YXIgbmV3VHJlZURhdGE9e307aWYoa2V5cy5sZW5ndGgpe3ZhciBfc3RhdGVzMz10aGlzLnN0YXRlcyxvbGRUcmVlRGF0YT1fc3RhdGVzMy50cmVlRGF0YSxkZWZhdWx0RXhwYW5kQWxsPV9zdGF0ZXMzLmRlZmF1bHRFeHBhbmRBbGwsZXhwYW5kUm93S2V5cz1fc3RhdGVzMy5leHBhbmRSb3dLZXlzLGxhenk9X3N0YXRlczMubGF6eTt2YXIgcm9vdExhenlSb3dLZXlzPVtdO3ZhciBnZXRFeHBhbmRlZD1mdW5jdGlvbiBnZXRFeHBhbmRlZChvbGRWYWx1ZSxrZXkpe3ZhciBpbmNsdWRlZD1kZWZhdWx0RXhwYW5kQWxsfHxleHBhbmRSb3dLZXlzJiZleHBhbmRSb3dLZXlzLmluZGV4T2Yoa2V5KSE9PS0xO3JldHVybiEhKG9sZFZhbHVlJiZvbGRWYWx1ZS5leHBhbmRlZHx8aW5jbHVkZWQpO307Ly8g5ZCI5bm2IGV4cGFuZGVkIOS4jiBkaXNwbGF577yM56Gu5L+d5pWw5o2u5Yi35paw5ZCO77yM54q25oCB5LiN5Y+YCmtleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpe3ZhciBvbGRWYWx1ZT1vbGRUcmVlRGF0YVtrZXldO3ZhciBuZXdWYWx1ZT1fZXh0ZW5kcyh7fSxuZXN0ZWRba2V5XSk7bmV3VmFsdWUuZXhwYW5kZWQ9Z2V0RXhwYW5kZWQob2xkVmFsdWUsa2V5KTtpZihuZXdWYWx1ZS5sYXp5KXt2YXIgX3JlZj1vbGRWYWx1ZXx8e30sX3JlZiRsb2FkZWQ9X3JlZi5sb2FkZWQsbG9hZGVkPV9yZWYkbG9hZGVkPT09dW5kZWZpbmVkP2ZhbHNlOl9yZWYkbG9hZGVkLF9yZWYkbG9hZGluZz1fcmVmLmxvYWRpbmcsbG9hZGluZz1fcmVmJGxvYWRpbmc9PT11bmRlZmluZWQ/ZmFsc2U6X3JlZiRsb2FkaW5nO25ld1ZhbHVlLmxvYWRlZD0hIWxvYWRlZDtuZXdWYWx1ZS5sb2FkaW5nPSEhbG9hZGluZztyb290TGF6eVJvd0tleXMucHVzaChrZXkpO31uZXdUcmVlRGF0YVtrZXldPW5ld1ZhbHVlO30pOy8vIOagueaNruaHkuWKoOi9veaVsOaNruabtOaWsCB0cmVlRGF0YQp2YXIgbGF6eUtleXM9T2JqZWN0LmtleXMobm9ybWFsaXplZExhenlOb2RlKTtpZihsYXp5JiZsYXp5S2V5cy5sZW5ndGgmJnJvb3RMYXp5Um93S2V5cy5sZW5ndGgpe2xhenlLZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KXt2YXIgb2xkVmFsdWU9b2xkVHJlZURhdGFba2V5XTt2YXIgbGF6eU5vZGVDaGlsZHJlbj1ub3JtYWxpemVkTGF6eU5vZGVba2V5XS5jaGlsZHJlbjtpZihyb290TGF6eVJvd0tleXMuaW5kZXhPZihrZXkpIT09LTEpey8vIOaHkuWKoOi9veeahCByb290IOiKgueCue+8jOabtOaWsOS4gOS4i+WOn+acieeahOaVsOaNru+8jOWOn+adpeeahCBjaGlsZHJlbiDkuIDlrprmmK/nqbrmlbDnu4QKaWYobmV3VHJlZURhdGFba2V5XS5jaGlsZHJlbi5sZW5ndGghPT0wKXt0aHJvdyBuZXcgRXJyb3IoJ1tFbFRhYmxlXWNoaWxkcmVuIG11c3QgYmUgYW4gZW1wdHkgYXJyYXkuJyk7fW5ld1RyZWVEYXRhW2tleV0uY2hpbGRyZW49bGF6eU5vZGVDaGlsZHJlbjt9ZWxzZXt2YXIgX3JlZjI9b2xkVmFsdWV8fHt9LF9yZWYyJGxvYWRlZD1fcmVmMi5sb2FkZWQsbG9hZGVkPV9yZWYyJGxvYWRlZD09PXVuZGVmaW5lZD9mYWxzZTpfcmVmMiRsb2FkZWQsX3JlZjIkbG9hZGluZz1fcmVmMi5sb2FkaW5nLGxvYWRpbmc9X3JlZjIkbG9hZGluZz09PXVuZGVmaW5lZD9mYWxzZTpfcmVmMiRsb2FkaW5nO25ld1RyZWVEYXRhW2tleV09e2xhenk6dHJ1ZSxsb2FkZWQ6ISFsb2FkZWQsbG9hZGluZzohIWxvYWRpbmcsZXhwYW5kZWQ6Z2V0RXhwYW5kZWQob2xkVmFsdWUsa2V5KSxjaGlsZHJlbjpsYXp5Tm9kZUNoaWxkcmVuLGxldmVsOicnfTt9fSk7fX10aGlzLnN0YXRlcy50cmVlRGF0YT1uZXdUcmVlRGF0YTt0aGlzLnVwZGF0ZVRhYmxlU2Nyb2xsWSgpO30sdXBkYXRlVHJlZUV4cGFuZEtleXM6ZnVuY3Rpb24gdXBkYXRlVHJlZUV4cGFuZEtleXModmFsdWUpe3RoaXMuc3RhdGVzLmV4cGFuZFJvd0tleXM9dmFsdWU7dGhpcy51cGRhdGVUcmVlRGF0YSgpO30sdG9nZ2xlVHJlZUV4cGFuc2lvbjpmdW5jdGlvbiB0b2dnbGVUcmVlRXhwYW5zaW9uKHJvdyxleHBhbmRlZCl7dGhpcy5hc3NlcnRSb3dLZXkoKTt2YXIgX3N0YXRlczQ9dGhpcy5zdGF0ZXMscm93S2V5PV9zdGF0ZXM0LnJvd0tleSx0cmVlRGF0YT1fc3RhdGVzNC50cmVlRGF0YTt2YXIgaWQ9Z2V0Um93SWRlbnRpdHkocm93LHJvd0tleSk7dmFyIGRhdGE9aWQmJnRyZWVEYXRhW2lkXTtpZihpZCYmZGF0YSYmJ2V4cGFuZGVkJ2luIGRhdGEpe3ZhciBvbGRFeHBhbmRlZD1kYXRhLmV4cGFuZGVkO2V4cGFuZGVkPXR5cGVvZiBleHBhbmRlZD09PSd1bmRlZmluZWQnPyFkYXRhLmV4cGFuZGVkOmV4cGFuZGVkO3RyZWVEYXRhW2lkXS5leHBhbmRlZD1leHBhbmRlZDtpZihvbGRFeHBhbmRlZCE9PWV4cGFuZGVkKXt0aGlzLnRhYmxlLiRlbWl0KCdleHBhbmQtY2hhbmdlJyxyb3csZXhwYW5kZWQpO310aGlzLnVwZGF0ZVRhYmxlU2Nyb2xsWSgpO319LGxvYWRPclRvZ2dsZTpmdW5jdGlvbiBsb2FkT3JUb2dnbGUocm93KXt0aGlzLmFzc2VydFJvd0tleSgpO3ZhciBfc3RhdGVzNT10aGlzLnN0YXRlcyxsYXp5PV9zdGF0ZXM1LmxhenksdHJlZURhdGE9X3N0YXRlczUudHJlZURhdGEscm93S2V5PV9zdGF0ZXM1LnJvd0tleTt2YXIgaWQ9Z2V0Um93SWRlbnRpdHkocm93LHJvd0tleSk7dmFyIGRhdGE9dHJlZURhdGFbaWRdO2lmKGxhenkmJmRhdGEmJidsb2FkZWQnaW4gZGF0YSYmIWRhdGEubG9hZGVkKXt0aGlzLmxvYWREYXRhKHJvdyxpZCxkYXRhKTt9ZWxzZXt0aGlzLnRvZ2dsZVRyZWVFeHBhbnNpb24ocm93KTt9fSxsb2FkRGF0YTpmdW5jdGlvbiBsb2FkRGF0YShyb3csa2V5LHRyZWVOb2RlKXt2YXIgX3RoaXM9dGhpczt2YXIgbG9hZD10aGlzLnRhYmxlLmxvYWQ7dmFyIF9zdGF0ZXM2PXRoaXMuc3RhdGVzLGxhenlUcmVlTm9kZU1hcD1fc3RhdGVzNi5sYXp5VHJlZU5vZGVNYXAsdHJlZURhdGE9X3N0YXRlczYudHJlZURhdGE7aWYobG9hZCYmIXRyZWVEYXRhW2tleV0ubG9hZGVkKXt0cmVlRGF0YVtrZXldLmxvYWRpbmc9dHJ1ZTtsb2FkKHJvdyx0cmVlTm9kZSxmdW5jdGlvbihkYXRhKXtpZighQXJyYXkuaXNBcnJheShkYXRhKSl7dGhyb3cgbmV3IEVycm9yKCdbRWxUYWJsZV0gZGF0YSBtdXN0IGJlIGFuIGFycmF5Jyk7fXRyZWVEYXRhW2tleV0ubG9hZGluZz1mYWxzZTt0cmVlRGF0YVtrZXldLmxvYWRlZD10cnVlO3RyZWVEYXRhW2tleV0uZXhwYW5kZWQ9dHJ1ZTtpZihkYXRhLmxlbmd0aCl7X3RoaXMuJHNldChsYXp5VHJlZU5vZGVNYXAsa2V5LGRhdGEpO31fdGhpcy50YWJsZS4kZW1pdCgnZXhwYW5kLWNoYW5nZScscm93LHRydWUpO30pO319fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90YWJsZS9zcmMvc3RvcmUvd2F0Y2hlci5qcwp2YXIgd2F0Y2hlcl9zb3J0RGF0YT1mdW5jdGlvbiBzb3J0RGF0YShkYXRhLHN0YXRlcyl7dmFyIHNvcnRpbmdDb2x1bW49c3RhdGVzLnNvcnRpbmdDb2x1bW47aWYoIXNvcnRpbmdDb2x1bW58fHR5cGVvZiBzb3J0aW5nQ29sdW1uLnNvcnRhYmxlPT09J3N0cmluZycpe3JldHVybiBkYXRhO31yZXR1cm4gdXRpbF9vcmRlckJ5KGRhdGEsc3RhdGVzLnNvcnRQcm9wLHN0YXRlcy5zb3J0T3JkZXIsc29ydGluZ0NvbHVtbi5zb3J0TWV0aG9kLHNvcnRpbmdDb2x1bW4uc29ydEJ5KTt9O3ZhciBkb0ZsYXR0ZW5Db2x1bW5zPWZ1bmN0aW9uIGRvRmxhdHRlbkNvbHVtbnMoY29sdW1ucyl7dmFyIHJlc3VsdD1bXTtjb2x1bW5zLmZvckVhY2goZnVuY3Rpb24oY29sdW1uKXtpZihjb2x1bW4uY2hpbGRyZW4pe3Jlc3VsdC5wdXNoLmFwcGx5KHJlc3VsdCxkb0ZsYXR0ZW5Db2x1bW5zKGNvbHVtbi5jaGlsZHJlbikpO31lbHNle3Jlc3VsdC5wdXNoKGNvbHVtbik7fX0pO3JldHVybiByZXN1bHQ7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHdhdGNoZXI9ZXh0ZXJuYWxfdnVlX2RlZmF1bHQuYS5leHRlbmQoe2RhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybntzdGF0ZXM6ey8vIDMuMCDniYjmnKzlkI7opoHmsYLlv4Xpobvorr7nva7or6XlsZ7mgKcKcm93S2V5Om51bGwsLy8g5riy5p+T55qE5pWw5o2u5p2l5rqQ77yM5piv5a+5IHRhYmxlIOS4reeahCBkYXRhIOi/h+a7pOaOkuW6j+WQjueahOe7k+aenApkYXRhOltdLC8vIOaYr+WQpuWMheWQq+WbuuWumuWIlwppc0NvbXBsZXg6ZmFsc2UsLy8g5YiXCl9jb2x1bW5zOltdLC8vIOS4jeWPr+WTjeW6lOeahApvcmlnaW5Db2x1bW5zOltdLGNvbHVtbnM6W10sZml4ZWRDb2x1bW5zOltdLHJpZ2h0Rml4ZWRDb2x1bW5zOltdLGxlYWZDb2x1bW5zOltdLGZpeGVkTGVhZkNvbHVtbnM6W10scmlnaHRGaXhlZExlYWZDb2x1bW5zOltdLGxlYWZDb2x1bW5zTGVuZ3RoOjAsZml4ZWRMZWFmQ29sdW1uc0xlbmd0aDowLHJpZ2h0Rml4ZWRMZWFmQ29sdW1uc0xlbmd0aDowLC8vIOmAieaLqQppc0FsbFNlbGVjdGVkOmZhbHNlLHNlbGVjdGlvbjpbXSxyZXNlcnZlU2VsZWN0aW9uOmZhbHNlLHNlbGVjdE9uSW5kZXRlcm1pbmF0ZTpmYWxzZSxzZWxlY3RhYmxlOm51bGwsLy8g6L+H5rukCmZpbHRlcnM6e30sLy8g5LiN5Y+v5ZON5bqU55qECmZpbHRlcmVkRGF0YTpudWxsLC8vIOaOkuW6jwpzb3J0aW5nQ29sdW1uOm51bGwsc29ydFByb3A6bnVsbCxzb3J0T3JkZXI6bnVsbCxob3ZlclJvdzpudWxsfX07fSxtaXhpbnM6W2V4cGFuZCxjdXJyZW50LHRyZWVdLG1ldGhvZHM6ey8vIOajgOafpSByb3dLZXkg5piv5ZCm5a2Y5ZyoCmFzc2VydFJvd0tleTpmdW5jdGlvbiBhc3NlcnRSb3dLZXkoKXt2YXIgcm93S2V5PXRoaXMuc3RhdGVzLnJvd0tleTtpZighcm93S2V5KXRocm93IG5ldyBFcnJvcignW0VsVGFibGVdIHByb3Agcm93LWtleSBpcyByZXF1aXJlZCcpO30sLy8g5pu05paw5YiXCnVwZGF0ZUNvbHVtbnM6ZnVuY3Rpb24gdXBkYXRlQ29sdW1ucygpe3ZhciBzdGF0ZXM9dGhpcy5zdGF0ZXM7dmFyIF9jb2x1bW5zPXN0YXRlcy5fY29sdW1uc3x8W107c3RhdGVzLmZpeGVkQ29sdW1ucz1fY29sdW1ucy5maWx0ZXIoZnVuY3Rpb24oY29sdW1uKXtyZXR1cm4gY29sdW1uLmZpeGVkPT09dHJ1ZXx8Y29sdW1uLmZpeGVkPT09J2xlZnQnO30pO3N0YXRlcy5yaWdodEZpeGVkQ29sdW1ucz1fY29sdW1ucy5maWx0ZXIoZnVuY3Rpb24oY29sdW1uKXtyZXR1cm4gY29sdW1uLmZpeGVkPT09J3JpZ2h0Jzt9KTtpZihzdGF0ZXMuZml4ZWRDb2x1bW5zLmxlbmd0aD4wJiZfY29sdW1uc1swXSYmX2NvbHVtbnNbMF0udHlwZT09PSdzZWxlY3Rpb24nJiYhX2NvbHVtbnNbMF0uZml4ZWQpe19jb2x1bW5zWzBdLmZpeGVkPXRydWU7c3RhdGVzLmZpeGVkQ29sdW1ucy51bnNoaWZ0KF9jb2x1bW5zWzBdKTt9dmFyIG5vdEZpeGVkQ29sdW1ucz1fY29sdW1ucy5maWx0ZXIoZnVuY3Rpb24oY29sdW1uKXtyZXR1cm4hY29sdW1uLmZpeGVkO30pO3N0YXRlcy5vcmlnaW5Db2x1bW5zPVtdLmNvbmNhdChzdGF0ZXMuZml4ZWRDb2x1bW5zKS5jb25jYXQobm90Rml4ZWRDb2x1bW5zKS5jb25jYXQoc3RhdGVzLnJpZ2h0Rml4ZWRDb2x1bW5zKTt2YXIgbGVhZkNvbHVtbnM9ZG9GbGF0dGVuQ29sdW1ucyhub3RGaXhlZENvbHVtbnMpO3ZhciBmaXhlZExlYWZDb2x1bW5zPWRvRmxhdHRlbkNvbHVtbnMoc3RhdGVzLmZpeGVkQ29sdW1ucyk7dmFyIHJpZ2h0Rml4ZWRMZWFmQ29sdW1ucz1kb0ZsYXR0ZW5Db2x1bW5zKHN0YXRlcy5yaWdodEZpeGVkQ29sdW1ucyk7c3RhdGVzLmxlYWZDb2x1bW5zTGVuZ3RoPWxlYWZDb2x1bW5zLmxlbmd0aDtzdGF0ZXMuZml4ZWRMZWFmQ29sdW1uc0xlbmd0aD1maXhlZExlYWZDb2x1bW5zLmxlbmd0aDtzdGF0ZXMucmlnaHRGaXhlZExlYWZDb2x1bW5zTGVuZ3RoPXJpZ2h0Rml4ZWRMZWFmQ29sdW1ucy5sZW5ndGg7c3RhdGVzLmNvbHVtbnM9W10uY29uY2F0KGZpeGVkTGVhZkNvbHVtbnMpLmNvbmNhdChsZWFmQ29sdW1ucykuY29uY2F0KHJpZ2h0Rml4ZWRMZWFmQ29sdW1ucyk7c3RhdGVzLmlzQ29tcGxleD1zdGF0ZXMuZml4ZWRDb2x1bW5zLmxlbmd0aD4wfHxzdGF0ZXMucmlnaHRGaXhlZENvbHVtbnMubGVuZ3RoPjA7fSwvLyDmm7TmlrAgRE9NCnNjaGVkdWxlTGF5b3V0OmZ1bmN0aW9uIHNjaGVkdWxlTGF5b3V0KG5lZWRVcGRhdGVDb2x1bW5zKXtpZihuZWVkVXBkYXRlQ29sdW1ucyl7dGhpcy51cGRhdGVDb2x1bW5zKCk7fXRoaXMudGFibGUuZGVib3VuY2VkVXBkYXRlTGF5b3V0KCk7fSwvLyDpgInmi6kKaXNTZWxlY3RlZDpmdW5jdGlvbiBpc1NlbGVjdGVkKHJvdyl7dmFyIF9zdGF0ZXMkc2VsZWN0aW9uPXRoaXMuc3RhdGVzLnNlbGVjdGlvbixzZWxlY3Rpb249X3N0YXRlcyRzZWxlY3Rpb249PT11bmRlZmluZWQ/W106X3N0YXRlcyRzZWxlY3Rpb247cmV0dXJuIHNlbGVjdGlvbi5pbmRleE9mKHJvdyk+LTE7fSxjbGVhclNlbGVjdGlvbjpmdW5jdGlvbiBjbGVhclNlbGVjdGlvbigpe3ZhciBzdGF0ZXM9dGhpcy5zdGF0ZXM7c3RhdGVzLmlzQWxsU2VsZWN0ZWQ9ZmFsc2U7dmFyIG9sZFNlbGVjdGlvbj1zdGF0ZXMuc2VsZWN0aW9uO2lmKG9sZFNlbGVjdGlvbi5sZW5ndGgpe3N0YXRlcy5zZWxlY3Rpb249W107dGhpcy50YWJsZS4kZW1pdCgnc2VsZWN0aW9uLWNoYW5nZScsW10pO319LGNsZWFuU2VsZWN0aW9uOmZ1bmN0aW9uIGNsZWFuU2VsZWN0aW9uKCl7dmFyIHN0YXRlcz10aGlzLnN0YXRlczt2YXIgZGF0YT1zdGF0ZXMuZGF0YSxyb3dLZXk9c3RhdGVzLnJvd0tleSxzZWxlY3Rpb249c3RhdGVzLnNlbGVjdGlvbjt2YXIgZGVsZXRlZD12b2lkIDA7aWYocm93S2V5KXtkZWxldGVkPVtdO3ZhciBzZWxlY3RlZE1hcD1nZXRLZXlzTWFwKHNlbGVjdGlvbixyb3dLZXkpO3ZhciBkYXRhTWFwPWdldEtleXNNYXAoZGF0YSxyb3dLZXkpO2Zvcih2YXIga2V5IGluIHNlbGVjdGVkTWFwKXtpZihzZWxlY3RlZE1hcC5oYXNPd25Qcm9wZXJ0eShrZXkpJiYhZGF0YU1hcFtrZXldKXtkZWxldGVkLnB1c2goc2VsZWN0ZWRNYXBba2V5XS5yb3cpO319fWVsc2V7ZGVsZXRlZD1zZWxlY3Rpb24uZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pe3JldHVybiBkYXRhLmluZGV4T2YoaXRlbSk9PT0tMTt9KTt9aWYoZGVsZXRlZC5sZW5ndGgpe3ZhciBuZXdTZWxlY3Rpb249c2VsZWN0aW9uLmZpbHRlcihmdW5jdGlvbihpdGVtKXtyZXR1cm4gZGVsZXRlZC5pbmRleE9mKGl0ZW0pPT09LTE7fSk7c3RhdGVzLnNlbGVjdGlvbj1uZXdTZWxlY3Rpb247dGhpcy50YWJsZS4kZW1pdCgnc2VsZWN0aW9uLWNoYW5nZScsbmV3U2VsZWN0aW9uLnNsaWNlKCkpO319LHRvZ2dsZVJvd1NlbGVjdGlvbjpmdW5jdGlvbiB0b2dnbGVSb3dTZWxlY3Rpb24ocm93LHNlbGVjdGVkKXt2YXIgZW1pdENoYW5nZT1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMl06dHJ1ZTt2YXIgY2hhbmdlZD10b2dnbGVSb3dTdGF0dXModGhpcy5zdGF0ZXMuc2VsZWN0aW9uLHJvdyxzZWxlY3RlZCk7aWYoY2hhbmdlZCl7dmFyIG5ld1NlbGVjdGlvbj0odGhpcy5zdGF0ZXMuc2VsZWN0aW9ufHxbXSkuc2xpY2UoKTsvLyDosIPnlKggQVBJIOS/ruaUuemAieS4reWAvO+8jOS4jeinpuWPkSBzZWxlY3Qg5LqL5Lu2CmlmKGVtaXRDaGFuZ2Upe3RoaXMudGFibGUuJGVtaXQoJ3NlbGVjdCcsbmV3U2VsZWN0aW9uLHJvdyk7fXRoaXMudGFibGUuJGVtaXQoJ3NlbGVjdGlvbi1jaGFuZ2UnLG5ld1NlbGVjdGlvbik7fX0sX3RvZ2dsZUFsbFNlbGVjdGlvbjpmdW5jdGlvbiBfdG9nZ2xlQWxsU2VsZWN0aW9uKCl7dmFyIHN0YXRlcz10aGlzLnN0YXRlczt2YXIgX3N0YXRlcyRkYXRhPXN0YXRlcy5kYXRhLGRhdGE9X3N0YXRlcyRkYXRhPT09dW5kZWZpbmVkP1tdOl9zdGF0ZXMkZGF0YSxzZWxlY3Rpb249c3RhdGVzLnNlbGVjdGlvbjsvLyB3aGVuIG9ubHkgc29tZSByb3dzIGFyZSBzZWxlY3RlZCAoYnV0IG5vdCBhbGwpLCBzZWxlY3Qgb3IgZGVzZWxlY3QgYWxsIG9mIHRoZW0KLy8gZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBzZWxlY3RPbkluZGV0ZXJtaW5hdGUKdmFyIHZhbHVlPXN0YXRlcy5zZWxlY3RPbkluZGV0ZXJtaW5hdGU/IXN0YXRlcy5pc0FsbFNlbGVjdGVkOiEoc3RhdGVzLmlzQWxsU2VsZWN0ZWR8fHNlbGVjdGlvbi5sZW5ndGgpO3N0YXRlcy5pc0FsbFNlbGVjdGVkPXZhbHVlO3ZhciBzZWxlY3Rpb25DaGFuZ2VkPWZhbHNlO2RhdGEuZm9yRWFjaChmdW5jdGlvbihyb3csaW5kZXgpe2lmKHN0YXRlcy5zZWxlY3RhYmxlKXtpZihzdGF0ZXMuc2VsZWN0YWJsZS5jYWxsKG51bGwscm93LGluZGV4KSYmdG9nZ2xlUm93U3RhdHVzKHNlbGVjdGlvbixyb3csdmFsdWUpKXtzZWxlY3Rpb25DaGFuZ2VkPXRydWU7fX1lbHNle2lmKHRvZ2dsZVJvd1N0YXR1cyhzZWxlY3Rpb24scm93LHZhbHVlKSl7c2VsZWN0aW9uQ2hhbmdlZD10cnVlO319fSk7aWYoc2VsZWN0aW9uQ2hhbmdlZCl7dGhpcy50YWJsZS4kZW1pdCgnc2VsZWN0aW9uLWNoYW5nZScsc2VsZWN0aW9uP3NlbGVjdGlvbi5zbGljZSgpOltdKTt9dGhpcy50YWJsZS4kZW1pdCgnc2VsZWN0LWFsbCcsc2VsZWN0aW9uKTt9LHVwZGF0ZVNlbGVjdGlvbkJ5Um93S2V5OmZ1bmN0aW9uIHVwZGF0ZVNlbGVjdGlvbkJ5Um93S2V5KCl7dmFyIHN0YXRlcz10aGlzLnN0YXRlczt2YXIgc2VsZWN0aW9uPXN0YXRlcy5zZWxlY3Rpb24scm93S2V5PXN0YXRlcy5yb3dLZXksZGF0YT1zdGF0ZXMuZGF0YTt2YXIgc2VsZWN0ZWRNYXA9Z2V0S2V5c01hcChzZWxlY3Rpb24scm93S2V5KTtkYXRhLmZvckVhY2goZnVuY3Rpb24ocm93KXt2YXIgcm93SWQ9Z2V0Um93SWRlbnRpdHkocm93LHJvd0tleSk7dmFyIHJvd0luZm89c2VsZWN0ZWRNYXBbcm93SWRdO2lmKHJvd0luZm8pe3NlbGVjdGlvbltyb3dJbmZvLmluZGV4XT1yb3c7fX0pO30sdXBkYXRlQWxsU2VsZWN0ZWQ6ZnVuY3Rpb24gdXBkYXRlQWxsU2VsZWN0ZWQoKXt2YXIgc3RhdGVzPXRoaXMuc3RhdGVzO3ZhciBzZWxlY3Rpb249c3RhdGVzLnNlbGVjdGlvbixyb3dLZXk9c3RhdGVzLnJvd0tleSxzZWxlY3RhYmxlPXN0YXRlcy5zZWxlY3RhYmxlOy8vIGRhdGEg5Li6IG51bGwg5pe277yM6Kej5p6E5pe255qE6buY6K6k5YC85Lya6KKr5b+955WlCnZhciBkYXRhPXN0YXRlcy5kYXRhfHxbXTtpZihkYXRhLmxlbmd0aD09PTApe3N0YXRlcy5pc0FsbFNlbGVjdGVkPWZhbHNlO3JldHVybjt9dmFyIHNlbGVjdGVkTWFwPXZvaWQgMDtpZihyb3dLZXkpe3NlbGVjdGVkTWFwPWdldEtleXNNYXAoc2VsZWN0aW9uLHJvd0tleSk7fXZhciBpc1NlbGVjdGVkPWZ1bmN0aW9uIGlzU2VsZWN0ZWQocm93KXtpZihzZWxlY3RlZE1hcCl7cmV0dXJuISFzZWxlY3RlZE1hcFtnZXRSb3dJZGVudGl0eShyb3cscm93S2V5KV07fWVsc2V7cmV0dXJuIHNlbGVjdGlvbi5pbmRleE9mKHJvdykhPT0tMTt9fTt2YXIgaXNBbGxTZWxlY3RlZD10cnVlO3ZhciBzZWxlY3RlZENvdW50PTA7Zm9yKHZhciBpPTAsaj1kYXRhLmxlbmd0aDtpPGo7aSsrKXt2YXIgaXRlbT1kYXRhW2ldO3ZhciBpc1Jvd1NlbGVjdGFibGU9c2VsZWN0YWJsZSYmc2VsZWN0YWJsZS5jYWxsKG51bGwsaXRlbSxpKTtpZighaXNTZWxlY3RlZChpdGVtKSl7aWYoIXNlbGVjdGFibGV8fGlzUm93U2VsZWN0YWJsZSl7aXNBbGxTZWxlY3RlZD1mYWxzZTticmVhazt9fWVsc2V7c2VsZWN0ZWRDb3VudCsrO319aWYoc2VsZWN0ZWRDb3VudD09PTApaXNBbGxTZWxlY3RlZD1mYWxzZTtzdGF0ZXMuaXNBbGxTZWxlY3RlZD1pc0FsbFNlbGVjdGVkO30sLy8g6L+H5ruk5LiO5o6S5bqPCnVwZGF0ZUZpbHRlcnM6ZnVuY3Rpb24gdXBkYXRlRmlsdGVycyhjb2x1bW5zLHZhbHVlcyl7aWYoIUFycmF5LmlzQXJyYXkoY29sdW1ucykpe2NvbHVtbnM9W2NvbHVtbnNdO312YXIgc3RhdGVzPXRoaXMuc3RhdGVzO3ZhciBmaWx0ZXJzPXt9O2NvbHVtbnMuZm9yRWFjaChmdW5jdGlvbihjb2wpe3N0YXRlcy5maWx0ZXJzW2NvbC5pZF09dmFsdWVzO2ZpbHRlcnNbY29sLmNvbHVtbktleXx8Y29sLmlkXT12YWx1ZXM7fSk7cmV0dXJuIGZpbHRlcnM7fSx1cGRhdGVTb3J0OmZ1bmN0aW9uIHVwZGF0ZVNvcnQoY29sdW1uLHByb3Asb3JkZXIpe2lmKHRoaXMuc3RhdGVzLnNvcnRpbmdDb2x1bW4mJnRoaXMuc3RhdGVzLnNvcnRpbmdDb2x1bW4hPT1jb2x1bW4pe3RoaXMuc3RhdGVzLnNvcnRpbmdDb2x1bW4ub3JkZXI9bnVsbDt9dGhpcy5zdGF0ZXMuc29ydGluZ0NvbHVtbj1jb2x1bW47dGhpcy5zdGF0ZXMuc29ydFByb3A9cHJvcDt0aGlzLnN0YXRlcy5zb3J0T3JkZXI9b3JkZXI7fSxleGVjRmlsdGVyOmZ1bmN0aW9uIGV4ZWNGaWx0ZXIoKXt2YXIgX3RoaXM9dGhpczt2YXIgc3RhdGVzPXRoaXMuc3RhdGVzO3ZhciBfZGF0YT1zdGF0ZXMuX2RhdGEsZmlsdGVycz1zdGF0ZXMuZmlsdGVyczt2YXIgZGF0YT1fZGF0YTtPYmplY3Qua2V5cyhmaWx0ZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKGNvbHVtbklkKXt2YXIgdmFsdWVzPXN0YXRlcy5maWx0ZXJzW2NvbHVtbklkXTtpZighdmFsdWVzfHx2YWx1ZXMubGVuZ3RoPT09MClyZXR1cm47dmFyIGNvbHVtbj1nZXRDb2x1bW5CeUlkKF90aGlzLnN0YXRlcyxjb2x1bW5JZCk7aWYoY29sdW1uJiZjb2x1bW4uZmlsdGVyTWV0aG9kKXtkYXRhPWRhdGEuZmlsdGVyKGZ1bmN0aW9uKHJvdyl7cmV0dXJuIHZhbHVlcy5zb21lKGZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gY29sdW1uLmZpbHRlck1ldGhvZC5jYWxsKG51bGwsdmFsdWUscm93LGNvbHVtbik7fSk7fSk7fX0pO3N0YXRlcy5maWx0ZXJlZERhdGE9ZGF0YTt9LGV4ZWNTb3J0OmZ1bmN0aW9uIGV4ZWNTb3J0KCl7dmFyIHN0YXRlcz10aGlzLnN0YXRlcztzdGF0ZXMuZGF0YT13YXRjaGVyX3NvcnREYXRhKHN0YXRlcy5maWx0ZXJlZERhdGEsc3RhdGVzKTt9LC8vIOagueaNriBmaWx0ZXJzIOS4jiBzb3J0IOWOu+i/h+a7pCBkYXRhCmV4ZWNRdWVyeTpmdW5jdGlvbiBleGVjUXVlcnkoaWdub3JlKXtpZighKGlnbm9yZSYmaWdub3JlLmZpbHRlcikpe3RoaXMuZXhlY0ZpbHRlcigpO310aGlzLmV4ZWNTb3J0KCk7fSxjbGVhckZpbHRlcjpmdW5jdGlvbiBjbGVhckZpbHRlcihjb2x1bW5LZXlzKXt2YXIgc3RhdGVzPXRoaXMuc3RhdGVzO3ZhciBfdGFibGUkJHJlZnM9dGhpcy50YWJsZS4kcmVmcyx0YWJsZUhlYWRlcj1fdGFibGUkJHJlZnMudGFibGVIZWFkZXIsZml4ZWRUYWJsZUhlYWRlcj1fdGFibGUkJHJlZnMuZml4ZWRUYWJsZUhlYWRlcixyaWdodEZpeGVkVGFibGVIZWFkZXI9X3RhYmxlJCRyZWZzLnJpZ2h0Rml4ZWRUYWJsZUhlYWRlcjt2YXIgcGFuZWxzPXt9O2lmKHRhYmxlSGVhZGVyKXBhbmVscz1tZXJnZV9kZWZhdWx0KCkocGFuZWxzLHRhYmxlSGVhZGVyLmZpbHRlclBhbmVscyk7aWYoZml4ZWRUYWJsZUhlYWRlcilwYW5lbHM9bWVyZ2VfZGVmYXVsdCgpKHBhbmVscyxmaXhlZFRhYmxlSGVhZGVyLmZpbHRlclBhbmVscyk7aWYocmlnaHRGaXhlZFRhYmxlSGVhZGVyKXBhbmVscz1tZXJnZV9kZWZhdWx0KCkocGFuZWxzLHJpZ2h0Rml4ZWRUYWJsZUhlYWRlci5maWx0ZXJQYW5lbHMpO3ZhciBrZXlzPU9iamVjdC5rZXlzKHBhbmVscyk7aWYoIWtleXMubGVuZ3RoKXJldHVybjtpZih0eXBlb2YgY29sdW1uS2V5cz09PSdzdHJpbmcnKXtjb2x1bW5LZXlzPVtjb2x1bW5LZXlzXTt9aWYoQXJyYXkuaXNBcnJheShjb2x1bW5LZXlzKSl7dmFyIGNvbHVtbnM9Y29sdW1uS2V5cy5tYXAoZnVuY3Rpb24oa2V5KXtyZXR1cm4gZ2V0Q29sdW1uQnlLZXkoc3RhdGVzLGtleSk7fSk7a2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSl7dmFyIGNvbHVtbj1jb2x1bW5zLmZpbmQoZnVuY3Rpb24oY29sKXtyZXR1cm4gY29sLmlkPT09a2V5O30pO2lmKGNvbHVtbil7Ly8gVE9ETzog5LyY5YyW6L+Z6YeM55qE5Luj56CBCnBhbmVsc1trZXldLmZpbHRlcmVkVmFsdWU9W107fX0pO3RoaXMuY29tbWl0KCdmaWx0ZXJDaGFuZ2UnLHtjb2x1bW46Y29sdW1ucyx2YWx1ZXM6W10sc2lsZW50OnRydWUsbXVsdGk6dHJ1ZX0pO31lbHNle2tleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpey8vIFRPRE86IOS8mOWMlui/memHjOeahOS7o+eggQpwYW5lbHNba2V5XS5maWx0ZXJlZFZhbHVlPVtdO30pO3N0YXRlcy5maWx0ZXJzPXt9O3RoaXMuY29tbWl0KCdmaWx0ZXJDaGFuZ2UnLHtjb2x1bW46e30sdmFsdWVzOltdLHNpbGVudDp0cnVlfSk7fX0sY2xlYXJTb3J0OmZ1bmN0aW9uIGNsZWFyU29ydCgpe3ZhciBzdGF0ZXM9dGhpcy5zdGF0ZXM7aWYoIXN0YXRlcy5zb3J0aW5nQ29sdW1uKXJldHVybjt0aGlzLnVwZGF0ZVNvcnQobnVsbCxudWxsLG51bGwpO3RoaXMuY29tbWl0KCdjaGFuZ2VTb3J0Q29uZGl0aW9uJyx7c2lsZW50OnRydWV9KTt9LC8vIOmAgumFjeWxgu+8jGV4cGFuZC1yb3cta2V5cyDlnKggRXhwYW5kIOS4jiBUcmVlVGFibGUg5Lit6YO95pyJ5L2/55SoCnNldEV4cGFuZFJvd0tleXNBZGFwdGVyOmZ1bmN0aW9uIHNldEV4cGFuZFJvd0tleXNBZGFwdGVyKHZhbCl7Ly8g6L+Z6YeM5Lya6Kem5Y+R6aKd5aSW55qE6K6h566X77yM5L2G5Li65LqG5YW85a655oCn77yM5pqC5pe26L+Z5LmI5YGaCnRoaXMuc2V0RXhwYW5kUm93S2V5cyh2YWwpO3RoaXMudXBkYXRlVHJlZUV4cGFuZEtleXModmFsKTt9LC8vIOWxleW8gOihjOS4jiBUcmVlVGFibGUg6YO96KaB5L2/55SoCnRvZ2dsZVJvd0V4cGFuc2lvbkFkYXB0ZXI6ZnVuY3Rpb24gdG9nZ2xlUm93RXhwYW5zaW9uQWRhcHRlcihyb3csZXhwYW5kZWQpe3ZhciBoYXNFeHBhbmRDb2x1bW49dGhpcy5zdGF0ZXMuY29sdW1ucy5zb21lKGZ1bmN0aW9uKF9yZWYpe3ZhciB0eXBlPV9yZWYudHlwZTtyZXR1cm4gdHlwZT09PSdleHBhbmQnO30pO2lmKGhhc0V4cGFuZENvbHVtbil7dGhpcy50b2dnbGVSb3dFeHBhbnNpb24ocm93LGV4cGFuZGVkKTt9ZWxzZXt0aGlzLnRvZ2dsZVRyZWVFeHBhbnNpb24ocm93LGV4cGFuZGVkKTt9fX19KTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYmxlL3NyYy9zdG9yZS9pbmRleC5qcwp3YXRjaGVyLnByb3RvdHlwZS5tdXRhdGlvbnM9e3NldERhdGE6ZnVuY3Rpb24gc2V0RGF0YShzdGF0ZXMsZGF0YSl7dmFyIGRhdGFJbnN0YW5jZUNoYW5nZWQ9c3RhdGVzLl9kYXRhIT09ZGF0YTtzdGF0ZXMuX2RhdGE9ZGF0YTt0aGlzLmV4ZWNRdWVyeSgpOy8vIOaVsOaNruWPmOWMlu+8jOabtOaWsOmDqOWIhuaVsOaNruOAggovLyDmsqHmnInkvb/nlKggY29tcHV0ZWTvvIzogIzmmK/miYvliqjmm7TmlrDpg6jliIbmlbDmja4gaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3Z1ZS9pc3N1ZXMvNjY2MCNpc3N1ZWNvbW1lbnQtMzMxNDE3MTQwCnRoaXMudXBkYXRlQ3VycmVudFJvd0RhdGEoKTt0aGlzLnVwZGF0ZUV4cGFuZFJvd3MoKTtpZihzdGF0ZXMucmVzZXJ2ZVNlbGVjdGlvbil7dGhpcy5hc3NlcnRSb3dLZXkoKTt0aGlzLnVwZGF0ZVNlbGVjdGlvbkJ5Um93S2V5KCk7fWVsc2V7aWYoZGF0YUluc3RhbmNlQ2hhbmdlZCl7dGhpcy5jbGVhclNlbGVjdGlvbigpO31lbHNle3RoaXMuY2xlYW5TZWxlY3Rpb24oKTt9fXRoaXMudXBkYXRlQWxsU2VsZWN0ZWQoKTt0aGlzLnVwZGF0ZVRhYmxlU2Nyb2xsWSgpO30saW5zZXJ0Q29sdW1uOmZ1bmN0aW9uIGluc2VydENvbHVtbihzdGF0ZXMsY29sdW1uLGluZGV4LHBhcmVudCl7dmFyIGFycmF5PXN0YXRlcy5fY29sdW1ucztpZihwYXJlbnQpe2FycmF5PXBhcmVudC5jaGlsZHJlbjtpZighYXJyYXkpYXJyYXk9cGFyZW50LmNoaWxkcmVuPVtdO31pZih0eXBlb2YgaW5kZXghPT0ndW5kZWZpbmVkJyl7YXJyYXkuc3BsaWNlKGluZGV4LDAsY29sdW1uKTt9ZWxzZXthcnJheS5wdXNoKGNvbHVtbik7fWlmKGNvbHVtbi50eXBlPT09J3NlbGVjdGlvbicpe3N0YXRlcy5zZWxlY3RhYmxlPWNvbHVtbi5zZWxlY3RhYmxlO3N0YXRlcy5yZXNlcnZlU2VsZWN0aW9uPWNvbHVtbi5yZXNlcnZlU2VsZWN0aW9uO31pZih0aGlzLnRhYmxlLiRyZWFkeSl7dGhpcy51cGRhdGVDb2x1bW5zKCk7Ly8gaGFjayBmb3IgZHluYW1pY3MgaW5zZXJ0IGNvbHVtbgp0aGlzLnNjaGVkdWxlTGF5b3V0KCk7fX0scmVtb3ZlQ29sdW1uOmZ1bmN0aW9uIHJlbW92ZUNvbHVtbihzdGF0ZXMsY29sdW1uLHBhcmVudCl7dmFyIGFycmF5PXN0YXRlcy5fY29sdW1ucztpZihwYXJlbnQpe2FycmF5PXBhcmVudC5jaGlsZHJlbjtpZighYXJyYXkpYXJyYXk9cGFyZW50LmNoaWxkcmVuPVtdO31pZihhcnJheSl7YXJyYXkuc3BsaWNlKGFycmF5LmluZGV4T2YoY29sdW1uKSwxKTt9aWYodGhpcy50YWJsZS4kcmVhZHkpe3RoaXMudXBkYXRlQ29sdW1ucygpOy8vIGhhY2sgZm9yIGR5bmFtaWNzIHJlbW92ZSBjb2x1bW4KdGhpcy5zY2hlZHVsZUxheW91dCgpO319LHNvcnQ6ZnVuY3Rpb24gc29ydChzdGF0ZXMsb3B0aW9ucyl7dmFyIHByb3A9b3B0aW9ucy5wcm9wLG9yZGVyPW9wdGlvbnMub3JkZXIsaW5pdD1vcHRpb25zLmluaXQ7aWYocHJvcCl7dmFyIGNvbHVtbj1PYmplY3QodXRpbF9bImFycmF5RmluZCJdKShzdGF0ZXMuY29sdW1ucyxmdW5jdGlvbihjb2x1bW4pe3JldHVybiBjb2x1bW4ucHJvcGVydHk9PT1wcm9wO30pO2lmKGNvbHVtbil7Y29sdW1uLm9yZGVyPW9yZGVyO3RoaXMudXBkYXRlU29ydChjb2x1bW4scHJvcCxvcmRlcik7dGhpcy5jb21taXQoJ2NoYW5nZVNvcnRDb25kaXRpb24nLHtpbml0OmluaXR9KTt9fX0sY2hhbmdlU29ydENvbmRpdGlvbjpmdW5jdGlvbiBjaGFuZ2VTb3J0Q29uZGl0aW9uKHN0YXRlcyxvcHRpb25zKXsvLyDkv67lpI0gcHIgaHR0cHM6Ly9naXRodWIuY29tL0VsZW1lRkUvZWxlbWVudC9wdWxsLzE1MDEyIOWvvOiHtOeahCBidWcKdmFyIGNvbHVtbj1zdGF0ZXMuc29ydGluZ0NvbHVtbixwcm9wPXN0YXRlcy5zb3J0UHJvcCxvcmRlcj1zdGF0ZXMuc29ydE9yZGVyO2lmKG9yZGVyPT09bnVsbCl7c3RhdGVzLnNvcnRpbmdDb2x1bW49bnVsbDtzdGF0ZXMuc29ydFByb3A9bnVsbDt9dmFyIGluZ29yZT17ZmlsdGVyOnRydWV9O3RoaXMuZXhlY1F1ZXJ5KGluZ29yZSk7aWYoIW9wdGlvbnN8fCEob3B0aW9ucy5zaWxlbnR8fG9wdGlvbnMuaW5pdCkpe3RoaXMudGFibGUuJGVtaXQoJ3NvcnQtY2hhbmdlJyx7Y29sdW1uOmNvbHVtbixwcm9wOnByb3Asb3JkZXI6b3JkZXJ9KTt9dGhpcy51cGRhdGVUYWJsZVNjcm9sbFkoKTt9LGZpbHRlckNoYW5nZTpmdW5jdGlvbiBmaWx0ZXJDaGFuZ2Uoc3RhdGVzLG9wdGlvbnMpe3ZhciBjb2x1bW49b3B0aW9ucy5jb2x1bW4sdmFsdWVzPW9wdGlvbnMudmFsdWVzLHNpbGVudD1vcHRpb25zLnNpbGVudDt2YXIgbmV3RmlsdGVycz10aGlzLnVwZGF0ZUZpbHRlcnMoY29sdW1uLHZhbHVlcyk7dGhpcy5leGVjUXVlcnkoKTtpZighc2lsZW50KXt0aGlzLnRhYmxlLiRlbWl0KCdmaWx0ZXItY2hhbmdlJyxuZXdGaWx0ZXJzKTt9dGhpcy51cGRhdGVUYWJsZVNjcm9sbFkoKTt9LHRvZ2dsZUFsbFNlbGVjdGlvbjpmdW5jdGlvbiB0b2dnbGVBbGxTZWxlY3Rpb24oKXt0aGlzLnRvZ2dsZUFsbFNlbGVjdGlvbigpO30scm93U2VsZWN0ZWRDaGFuZ2VkOmZ1bmN0aW9uIHJvd1NlbGVjdGVkQ2hhbmdlZChzdGF0ZXMscm93KXt0aGlzLnRvZ2dsZVJvd1NlbGVjdGlvbihyb3cpO3RoaXMudXBkYXRlQWxsU2VsZWN0ZWQoKTt9LHNldEhvdmVyUm93OmZ1bmN0aW9uIHNldEhvdmVyUm93KHN0YXRlcyxyb3cpe3N0YXRlcy5ob3ZlclJvdz1yb3c7fSxzZXRDdXJyZW50Um93OmZ1bmN0aW9uIHNldEN1cnJlbnRSb3coc3RhdGVzLHJvdyl7dGhpcy51cGRhdGVDdXJyZW50Um93KHJvdyk7fX07d2F0Y2hlci5wcm90b3R5cGUuY29tbWl0PWZ1bmN0aW9uKG5hbWUpe3ZhciBtdXRhdGlvbnM9dGhpcy5tdXRhdGlvbnM7aWYobXV0YXRpb25zW25hbWVdKXtmb3IodmFyIF9sZW49YXJndW1lbnRzLmxlbmd0aCxhcmdzPUFycmF5KF9sZW4+MT9fbGVuLTE6MCksX2tleT0xO19rZXk8X2xlbjtfa2V5Kyspe2FyZ3NbX2tleS0xXT1hcmd1bWVudHNbX2tleV07fW11dGF0aW9uc1tuYW1lXS5hcHBseSh0aGlzLFt0aGlzLnN0YXRlc10uY29uY2F0KGFyZ3MpKTt9ZWxzZXt0aHJvdyBuZXcgRXJyb3IoJ0FjdGlvbiBub3QgZm91bmQ6ICcrbmFtZSk7fX07d2F0Y2hlci5wcm90b3R5cGUudXBkYXRlVGFibGVTY3JvbGxZPWZ1bmN0aW9uKCl7ZXh0ZXJuYWxfdnVlX2RlZmF1bHQuYS5uZXh0VGljayh0aGlzLnRhYmxlLnVwZGF0ZVNjcm9sbFkpO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfc3RvcmU9d2F0Y2hlcjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYmxlL3NyYy9zdG9yZS9oZWxwZXIuanMKZnVuY3Rpb24gY3JlYXRlU3RvcmUodGFibGUpe3ZhciBpbml0aWFsU3RhdGU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOnt9O2lmKCF0YWJsZSl7dGhyb3cgbmV3IEVycm9yKCdUYWJsZSBpcyByZXF1aXJlZC4nKTt9dmFyIHN0b3JlPW5ldyBzcmNfc3RvcmUoKTtzdG9yZS50YWJsZT10YWJsZTsvLyBmaXggaHR0cHM6Ly9naXRodWIuY29tL0VsZW1lRkUvZWxlbWVudC9pc3N1ZXMvMTQwNzUKLy8gcmVsYXRlZCBwciBodHRwczovL2dpdGh1Yi5jb20vRWxlbWVGRS9lbGVtZW50L3B1bGwvMTQxNDYKc3RvcmUudG9nZ2xlQWxsU2VsZWN0aW9uPWRlYm91bmNlX2RlZmF1bHQoKSgxMCxzdG9yZS5fdG9nZ2xlQWxsU2VsZWN0aW9uKTtPYmplY3Qua2V5cyhpbml0aWFsU3RhdGUpLmZvckVhY2goZnVuY3Rpb24oa2V5KXtzdG9yZS5zdGF0ZXNba2V5XT1pbml0aWFsU3RhdGVba2V5XTt9KTtyZXR1cm4gc3RvcmU7fWZ1bmN0aW9uIG1hcFN0YXRlcyhtYXBwZXIpe3ZhciByZXM9e307T2JqZWN0LmtleXMobWFwcGVyKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSl7dmFyIHZhbHVlPW1hcHBlcltrZXldO3ZhciBmbj12b2lkIDA7aWYodHlwZW9mIHZhbHVlPT09J3N0cmluZycpe2ZuPWZ1bmN0aW9uIGZuKCl7cmV0dXJuIHRoaXMuc3RvcmUuc3RhdGVzW3ZhbHVlXTt9O31lbHNlIGlmKHR5cGVvZiB2YWx1ZT09PSdmdW5jdGlvbicpe2ZuPWZ1bmN0aW9uIGZuKCl7cmV0dXJuIHZhbHVlLmNhbGwodGhpcyx0aGlzLnN0b3JlLnN0YXRlcyk7fTt9ZWxzZXtjb25zb2xlLmVycm9yKCdpbnZhbGlkIHZhbHVlIHR5cGUnKTt9aWYoZm4pe3Jlc1trZXldPWZuO319KTtyZXR1cm4gcmVzO307Ly8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCAiZWxlbWVudC11aS9saWIvdXRpbHMvc2Nyb2xsYmFyLXdpZHRoIgp2YXIgc2Nyb2xsYmFyX3dpZHRoXz1fX3dlYnBhY2tfcmVxdWlyZV9fKDMxKTt2YXIgc2Nyb2xsYmFyX3dpZHRoX2RlZmF1bHQ9LyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihzY3JvbGxiYXJfd2lkdGhfKTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYmxlL3NyYy90YWJsZS1sYXlvdXQuanMKZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLENvbnN0cnVjdG9yKXtpZighKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTt9fXZhciB0YWJsZV9sYXlvdXRfVGFibGVMYXlvdXQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBUYWJsZUxheW91dChvcHRpb25zKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxUYWJsZUxheW91dCk7dGhpcy5vYnNlcnZlcnM9W107dGhpcy50YWJsZT1udWxsO3RoaXMuc3RvcmU9bnVsbDt0aGlzLmNvbHVtbnM9bnVsbDt0aGlzLmZpdD10cnVlO3RoaXMuc2hvd0hlYWRlcj10cnVlO3RoaXMuaGVpZ2h0PW51bGw7dGhpcy5zY3JvbGxYPWZhbHNlO3RoaXMuc2Nyb2xsWT1mYWxzZTt0aGlzLmJvZHlXaWR0aD1udWxsO3RoaXMuZml4ZWRXaWR0aD1udWxsO3RoaXMucmlnaHRGaXhlZFdpZHRoPW51bGw7dGhpcy50YWJsZUhlaWdodD1udWxsO3RoaXMuaGVhZGVySGVpZ2h0PTQ0Oy8vIFRhYmxlIEhlYWRlciBIZWlnaHQKdGhpcy5hcHBlbmRIZWlnaHQ9MDsvLyBBcHBlbmQgU2xvdCBIZWlnaHQKdGhpcy5mb290ZXJIZWlnaHQ9NDQ7Ly8gVGFibGUgRm9vdGVyIEhlaWdodAp0aGlzLnZpZXdwb3J0SGVpZ2h0PW51bGw7Ly8gVGFibGUgSGVpZ2h0IC0gU2Nyb2xsIEJhciBIZWlnaHQKdGhpcy5ib2R5SGVpZ2h0PW51bGw7Ly8gVGFibGUgSGVpZ2h0IC0gVGFibGUgSGVhZGVyIEhlaWdodAp0aGlzLmZpeGVkQm9keUhlaWdodD1udWxsOy8vIFRhYmxlIEhlaWdodCAtIFRhYmxlIEhlYWRlciBIZWlnaHQgLSBTY3JvbGwgQmFyIEhlaWdodAp0aGlzLmd1dHRlcldpZHRoPXNjcm9sbGJhcl93aWR0aF9kZWZhdWx0KCkoKTtmb3IodmFyIG5hbWUgaW4gb3B0aW9ucyl7aWYob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShuYW1lKSl7dGhpc1tuYW1lXT1vcHRpb25zW25hbWVdO319aWYoIXRoaXMudGFibGUpe3Rocm93IG5ldyBFcnJvcigndGFibGUgaXMgcmVxdWlyZWQgZm9yIFRhYmxlIExheW91dCcpO31pZighdGhpcy5zdG9yZSl7dGhyb3cgbmV3IEVycm9yKCdzdG9yZSBpcyByZXF1aXJlZCBmb3IgVGFibGUgTGF5b3V0Jyk7fX1UYWJsZUxheW91dC5wcm90b3R5cGUudXBkYXRlU2Nyb2xsWT1mdW5jdGlvbiB1cGRhdGVTY3JvbGxZKCl7dmFyIGhlaWdodD10aGlzLmhlaWdodDtpZihoZWlnaHQ9PT1udWxsKXJldHVybiBmYWxzZTt2YXIgYm9keVdyYXBwZXI9dGhpcy50YWJsZS5ib2R5V3JhcHBlcjtpZih0aGlzLnRhYmxlLiRlbCYmYm9keVdyYXBwZXIpe3ZhciBib2R5PWJvZHlXcmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJy5lbC10YWJsZV9fYm9keScpO3ZhciBwcmV2U2Nyb2xsWT10aGlzLnNjcm9sbFk7dmFyIHNjcm9sbFk9Ym9keS5vZmZzZXRIZWlnaHQ+dGhpcy5ib2R5SGVpZ2h0O3RoaXMuc2Nyb2xsWT1zY3JvbGxZO3JldHVybiBwcmV2U2Nyb2xsWSE9PXNjcm9sbFk7fXJldHVybiBmYWxzZTt9O1RhYmxlTGF5b3V0LnByb3RvdHlwZS5zZXRIZWlnaHQ9ZnVuY3Rpb24gc2V0SGVpZ2h0KHZhbHVlKXt2YXIgX3RoaXM9dGhpczt2YXIgcHJvcD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMV06J2hlaWdodCc7aWYoZXh0ZXJuYWxfdnVlX2RlZmF1bHQuYS5wcm90b3R5cGUuJGlzU2VydmVyKXJldHVybjt2YXIgZWw9dGhpcy50YWJsZS4kZWw7dmFsdWU9cGFyc2VIZWlnaHQodmFsdWUpO3RoaXMuaGVpZ2h0PXZhbHVlO2lmKCFlbCYmKHZhbHVlfHx2YWx1ZT09PTApKXJldHVybiBleHRlcm5hbF92dWVfZGVmYXVsdC5hLm5leHRUaWNrKGZ1bmN0aW9uKCl7cmV0dXJuIF90aGlzLnNldEhlaWdodCh2YWx1ZSxwcm9wKTt9KTtpZih0eXBlb2YgdmFsdWU9PT0nbnVtYmVyJyl7ZWwuc3R5bGVbcHJvcF09dmFsdWUrJ3B4Jzt0aGlzLnVwZGF0ZUVsc0hlaWdodCgpO31lbHNlIGlmKHR5cGVvZiB2YWx1ZT09PSdzdHJpbmcnKXtlbC5zdHlsZVtwcm9wXT12YWx1ZTt0aGlzLnVwZGF0ZUVsc0hlaWdodCgpO319O1RhYmxlTGF5b3V0LnByb3RvdHlwZS5zZXRNYXhIZWlnaHQ9ZnVuY3Rpb24gc2V0TWF4SGVpZ2h0KHZhbHVlKXt0aGlzLnNldEhlaWdodCh2YWx1ZSwnbWF4LWhlaWdodCcpO307VGFibGVMYXlvdXQucHJvdG90eXBlLmdldEZsYXR0ZW5Db2x1bW5zPWZ1bmN0aW9uIGdldEZsYXR0ZW5Db2x1bW5zKCl7dmFyIGZsYXR0ZW5Db2x1bW5zPVtdO3ZhciBjb2x1bW5zPXRoaXMudGFibGUuY29sdW1ucztjb2x1bW5zLmZvckVhY2goZnVuY3Rpb24oY29sdW1uKXtpZihjb2x1bW4uaXNDb2x1bW5Hcm91cCl7ZmxhdHRlbkNvbHVtbnMucHVzaC5hcHBseShmbGF0dGVuQ29sdW1ucyxjb2x1bW4uY29sdW1ucyk7fWVsc2V7ZmxhdHRlbkNvbHVtbnMucHVzaChjb2x1bW4pO319KTtyZXR1cm4gZmxhdHRlbkNvbHVtbnM7fTtUYWJsZUxheW91dC5wcm90b3R5cGUudXBkYXRlRWxzSGVpZ2h0PWZ1bmN0aW9uIHVwZGF0ZUVsc0hlaWdodCgpe3ZhciBfdGhpczI9dGhpcztpZighdGhpcy50YWJsZS4kcmVhZHkpcmV0dXJuIGV4dGVybmFsX3Z1ZV9kZWZhdWx0LmEubmV4dFRpY2soZnVuY3Rpb24oKXtyZXR1cm4gX3RoaXMyLnVwZGF0ZUVsc0hlaWdodCgpO30pO3ZhciBfdGFibGUkJHJlZnM9dGhpcy50YWJsZS4kcmVmcyxoZWFkZXJXcmFwcGVyPV90YWJsZSQkcmVmcy5oZWFkZXJXcmFwcGVyLGFwcGVuZFdyYXBwZXI9X3RhYmxlJCRyZWZzLmFwcGVuZFdyYXBwZXIsZm9vdGVyV3JhcHBlcj1fdGFibGUkJHJlZnMuZm9vdGVyV3JhcHBlcjt0aGlzLmFwcGVuZEhlaWdodD1hcHBlbmRXcmFwcGVyP2FwcGVuZFdyYXBwZXIub2Zmc2V0SGVpZ2h0OjA7aWYodGhpcy5zaG93SGVhZGVyJiYhaGVhZGVyV3JhcHBlcilyZXR1cm47Ly8gZml4IGlzc3VlIChodHRwczovL2dpdGh1Yi5jb20vRWxlbWVGRS9lbGVtZW50L3B1bGwvMTY5NTYpCnZhciBoZWFkZXJUckVsbT1oZWFkZXJXcmFwcGVyP2hlYWRlcldyYXBwZXIucXVlcnlTZWxlY3RvcignLmVsLXRhYmxlX19oZWFkZXIgdHInKTpudWxsO3ZhciBub25lSGVhZGVyPXRoaXMuaGVhZGVyRGlzcGxheU5vbmUoaGVhZGVyVHJFbG0pO3ZhciBoZWFkZXJIZWlnaHQ9dGhpcy5oZWFkZXJIZWlnaHQ9IXRoaXMuc2hvd0hlYWRlcj8wOmhlYWRlcldyYXBwZXIub2Zmc2V0SGVpZ2h0O2lmKHRoaXMuc2hvd0hlYWRlciYmIW5vbmVIZWFkZXImJmhlYWRlcldyYXBwZXIub2Zmc2V0V2lkdGg+MCYmKHRoaXMudGFibGUuY29sdW1uc3x8W10pLmxlbmd0aD4wJiZoZWFkZXJIZWlnaHQ8Mil7cmV0dXJuIGV4dGVybmFsX3Z1ZV9kZWZhdWx0LmEubmV4dFRpY2soZnVuY3Rpb24oKXtyZXR1cm4gX3RoaXMyLnVwZGF0ZUVsc0hlaWdodCgpO30pO312YXIgdGFibGVIZWlnaHQ9dGhpcy50YWJsZUhlaWdodD10aGlzLnRhYmxlLiRlbC5jbGllbnRIZWlnaHQ7dmFyIGZvb3RlckhlaWdodD10aGlzLmZvb3RlckhlaWdodD1mb290ZXJXcmFwcGVyP2Zvb3RlcldyYXBwZXIub2Zmc2V0SGVpZ2h0OjA7aWYodGhpcy5oZWlnaHQhPT1udWxsKXt0aGlzLmJvZHlIZWlnaHQ9dGFibGVIZWlnaHQtaGVhZGVySGVpZ2h0LWZvb3RlckhlaWdodCsoZm9vdGVyV3JhcHBlcj8xOjApO310aGlzLmZpeGVkQm9keUhlaWdodD10aGlzLnNjcm9sbFg/dGhpcy5ib2R5SGVpZ2h0LXRoaXMuZ3V0dGVyV2lkdGg6dGhpcy5ib2R5SGVpZ2h0O3ZhciBub0RhdGE9ISh0aGlzLnN0b3JlLnN0YXRlcy5kYXRhJiZ0aGlzLnN0b3JlLnN0YXRlcy5kYXRhLmxlbmd0aCk7dGhpcy52aWV3cG9ydEhlaWdodD10aGlzLnNjcm9sbFg/dGFibGVIZWlnaHQtKG5vRGF0YT8wOnRoaXMuZ3V0dGVyV2lkdGgpOnRhYmxlSGVpZ2h0O3RoaXMudXBkYXRlU2Nyb2xsWSgpO3RoaXMubm90aWZ5T2JzZXJ2ZXJzKCdzY3JvbGxhYmxlJyk7fTtUYWJsZUxheW91dC5wcm90b3R5cGUuaGVhZGVyRGlzcGxheU5vbmU9ZnVuY3Rpb24gaGVhZGVyRGlzcGxheU5vbmUoZWxtKXtpZighZWxtKXJldHVybiB0cnVlO3ZhciBoZWFkZXJDaGlsZD1lbG07d2hpbGUoaGVhZGVyQ2hpbGQudGFnTmFtZSE9PSdESVYnKXtpZihnZXRDb21wdXRlZFN0eWxlKGhlYWRlckNoaWxkKS5kaXNwbGF5PT09J25vbmUnKXtyZXR1cm4gdHJ1ZTt9aGVhZGVyQ2hpbGQ9aGVhZGVyQ2hpbGQucGFyZW50RWxlbWVudDt9cmV0dXJuIGZhbHNlO307VGFibGVMYXlvdXQucHJvdG90eXBlLnVwZGF0ZUNvbHVtbnNXaWR0aD1mdW5jdGlvbiB1cGRhdGVDb2x1bW5zV2lkdGgoKXtpZihleHRlcm5hbF92dWVfZGVmYXVsdC5hLnByb3RvdHlwZS4kaXNTZXJ2ZXIpcmV0dXJuO3ZhciBmaXQ9dGhpcy5maXQ7dmFyIGJvZHlXaWR0aD10aGlzLnRhYmxlLiRlbC5jbGllbnRXaWR0aDt2YXIgYm9keU1pbldpZHRoPTA7dmFyIGZsYXR0ZW5Db2x1bW5zPXRoaXMuZ2V0RmxhdHRlbkNvbHVtbnMoKTt2YXIgZmxleENvbHVtbnM9ZmxhdHRlbkNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uKGNvbHVtbil7cmV0dXJuIHR5cGVvZiBjb2x1bW4ud2lkdGghPT0nbnVtYmVyJzt9KTtmbGF0dGVuQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uKGNvbHVtbil7Ly8gQ2xlYW4gdGhvc2UgY29sdW1ucyB3aG9zZSB3aWR0aCBjaGFuZ2VkIGZyb20gZmxleCB0byB1bmZsZXgKaWYodHlwZW9mIGNvbHVtbi53aWR0aD09PSdudW1iZXInJiZjb2x1bW4ucmVhbFdpZHRoKWNvbHVtbi5yZWFsV2lkdGg9bnVsbDt9KTtpZihmbGV4Q29sdW1ucy5sZW5ndGg+MCYmZml0KXtmbGF0dGVuQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uKGNvbHVtbil7Ym9keU1pbldpZHRoKz1jb2x1bW4ud2lkdGh8fGNvbHVtbi5taW5XaWR0aHx8ODA7fSk7dmFyIHNjcm9sbFlXaWR0aD10aGlzLnNjcm9sbFk/dGhpcy5ndXR0ZXJXaWR0aDowO2lmKGJvZHlNaW5XaWR0aDw9Ym9keVdpZHRoLXNjcm9sbFlXaWR0aCl7Ly8gRE9OJ1QgSEFWRSBTQ1JPTEwgQkFSCnRoaXMuc2Nyb2xsWD1mYWxzZTt2YXIgdG90YWxGbGV4V2lkdGg9Ym9keVdpZHRoLXNjcm9sbFlXaWR0aC1ib2R5TWluV2lkdGg7aWYoZmxleENvbHVtbnMubGVuZ3RoPT09MSl7ZmxleENvbHVtbnNbMF0ucmVhbFdpZHRoPShmbGV4Q29sdW1uc1swXS5taW5XaWR0aHx8ODApK3RvdGFsRmxleFdpZHRoO31lbHNle3ZhciBhbGxDb2x1bW5zV2lkdGg9ZmxleENvbHVtbnMucmVkdWNlKGZ1bmN0aW9uKHByZXYsY29sdW1uKXtyZXR1cm4gcHJldisoY29sdW1uLm1pbldpZHRofHw4MCk7fSwwKTt2YXIgZmxleFdpZHRoUGVyUGl4ZWw9dG90YWxGbGV4V2lkdGgvYWxsQ29sdW1uc1dpZHRoO3ZhciBub25lRmlyc3RXaWR0aD0wO2ZsZXhDb2x1bW5zLmZvckVhY2goZnVuY3Rpb24oY29sdW1uLGluZGV4KXtpZihpbmRleD09PTApcmV0dXJuO3ZhciBmbGV4V2lkdGg9TWF0aC5mbG9vcigoY29sdW1uLm1pbldpZHRofHw4MCkqZmxleFdpZHRoUGVyUGl4ZWwpO25vbmVGaXJzdFdpZHRoKz1mbGV4V2lkdGg7Y29sdW1uLnJlYWxXaWR0aD0oY29sdW1uLm1pbldpZHRofHw4MCkrZmxleFdpZHRoO30pO2ZsZXhDb2x1bW5zWzBdLnJlYWxXaWR0aD0oZmxleENvbHVtbnNbMF0ubWluV2lkdGh8fDgwKSt0b3RhbEZsZXhXaWR0aC1ub25lRmlyc3RXaWR0aDt9fWVsc2V7Ly8gSEFWRSBIT1JJWk9OVEFMIFNDUk9MTCBCQVIKdGhpcy5zY3JvbGxYPXRydWU7ZmxleENvbHVtbnMuZm9yRWFjaChmdW5jdGlvbihjb2x1bW4pe2NvbHVtbi5yZWFsV2lkdGg9Y29sdW1uLm1pbldpZHRoO30pO310aGlzLmJvZHlXaWR0aD1NYXRoLm1heChib2R5TWluV2lkdGgsYm9keVdpZHRoKTt0aGlzLnRhYmxlLnJlc2l6ZVN0YXRlLndpZHRoPXRoaXMuYm9keVdpZHRoO31lbHNle2ZsYXR0ZW5Db2x1bW5zLmZvckVhY2goZnVuY3Rpb24oY29sdW1uKXtpZighY29sdW1uLndpZHRoJiYhY29sdW1uLm1pbldpZHRoKXtjb2x1bW4ucmVhbFdpZHRoPTgwO31lbHNle2NvbHVtbi5yZWFsV2lkdGg9Y29sdW1uLndpZHRofHxjb2x1bW4ubWluV2lkdGg7fWJvZHlNaW5XaWR0aCs9Y29sdW1uLnJlYWxXaWR0aDt9KTt0aGlzLnNjcm9sbFg9Ym9keU1pbldpZHRoPmJvZHlXaWR0aDt0aGlzLmJvZHlXaWR0aD1ib2R5TWluV2lkdGg7fXZhciBmaXhlZENvbHVtbnM9dGhpcy5zdG9yZS5zdGF0ZXMuZml4ZWRDb2x1bW5zO2lmKGZpeGVkQ29sdW1ucy5sZW5ndGg+MCl7dmFyIGZpeGVkV2lkdGg9MDtmaXhlZENvbHVtbnMuZm9yRWFjaChmdW5jdGlvbihjb2x1bW4pe2ZpeGVkV2lkdGgrPWNvbHVtbi5yZWFsV2lkdGh8fGNvbHVtbi53aWR0aDt9KTt0aGlzLmZpeGVkV2lkdGg9Zml4ZWRXaWR0aDt9dmFyIHJpZ2h0Rml4ZWRDb2x1bW5zPXRoaXMuc3RvcmUuc3RhdGVzLnJpZ2h0Rml4ZWRDb2x1bW5zO2lmKHJpZ2h0Rml4ZWRDb2x1bW5zLmxlbmd0aD4wKXt2YXIgcmlnaHRGaXhlZFdpZHRoPTA7cmlnaHRGaXhlZENvbHVtbnMuZm9yRWFjaChmdW5jdGlvbihjb2x1bW4pe3JpZ2h0Rml4ZWRXaWR0aCs9Y29sdW1uLnJlYWxXaWR0aHx8Y29sdW1uLndpZHRoO30pO3RoaXMucmlnaHRGaXhlZFdpZHRoPXJpZ2h0Rml4ZWRXaWR0aDt9dGhpcy5ub3RpZnlPYnNlcnZlcnMoJ2NvbHVtbnMnKTt9O1RhYmxlTGF5b3V0LnByb3RvdHlwZS5hZGRPYnNlcnZlcj1mdW5jdGlvbiBhZGRPYnNlcnZlcihvYnNlcnZlcil7dGhpcy5vYnNlcnZlcnMucHVzaChvYnNlcnZlcik7fTtUYWJsZUxheW91dC5wcm90b3R5cGUucmVtb3ZlT2JzZXJ2ZXI9ZnVuY3Rpb24gcmVtb3ZlT2JzZXJ2ZXIob2JzZXJ2ZXIpe3ZhciBpbmRleD10aGlzLm9ic2VydmVycy5pbmRleE9mKG9ic2VydmVyKTtpZihpbmRleCE9PS0xKXt0aGlzLm9ic2VydmVycy5zcGxpY2UoaW5kZXgsMSk7fX07VGFibGVMYXlvdXQucHJvdG90eXBlLm5vdGlmeU9ic2VydmVycz1mdW5jdGlvbiBub3RpZnlPYnNlcnZlcnMoZXZlbnQpe3ZhciBfdGhpczM9dGhpczt2YXIgb2JzZXJ2ZXJzPXRoaXMub2JzZXJ2ZXJzO29ic2VydmVycy5mb3JFYWNoKGZ1bmN0aW9uKG9ic2VydmVyKXtzd2l0Y2goZXZlbnQpe2Nhc2UnY29sdW1ucyc6b2JzZXJ2ZXIub25Db2x1bW5zQ2hhbmdlKF90aGlzMyk7YnJlYWs7Y2FzZSdzY3JvbGxhYmxlJzpvYnNlcnZlci5vblNjcm9sbGFibGVDaGFuZ2UoX3RoaXMzKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcignVGFibGUgTGF5b3V0IGRvblwndCBoYXZlIGV2ZW50ICcrZXZlbnQrJy4nKTt9fSk7fTtyZXR1cm4gVGFibGVMYXlvdXQ7fSgpOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgdGFibGVfbGF5b3V0PXRhYmxlX2xheW91dF9UYWJsZUxheW91dDsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYmxlL3NyYy9sYXlvdXQtb2JzZXJ2ZXIuanMKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBsYXlvdXRfb2JzZXJ2ZXI9e2NyZWF0ZWQ6ZnVuY3Rpb24gY3JlYXRlZCgpe3RoaXMudGFibGVMYXlvdXQuYWRkT2JzZXJ2ZXIodGhpcyk7fSxkZXN0cm95ZWQ6ZnVuY3Rpb24gZGVzdHJveWVkKCl7dGhpcy50YWJsZUxheW91dC5yZW1vdmVPYnNlcnZlcih0aGlzKTt9LGNvbXB1dGVkOnt0YWJsZUxheW91dDpmdW5jdGlvbiB0YWJsZUxheW91dCgpe3ZhciBsYXlvdXQ9dGhpcy5sYXlvdXQ7aWYoIWxheW91dCYmdGhpcy50YWJsZSl7bGF5b3V0PXRoaXMudGFibGUubGF5b3V0O31pZighbGF5b3V0KXt0aHJvdyBuZXcgRXJyb3IoJ0NhbiBub3QgZmluZCB0YWJsZSBsYXlvdXQuJyk7fXJldHVybiBsYXlvdXQ7fX0sbW91bnRlZDpmdW5jdGlvbiBtb3VudGVkKCl7dGhpcy5vbkNvbHVtbnNDaGFuZ2UodGhpcy50YWJsZUxheW91dCk7dGhpcy5vblNjcm9sbGFibGVDaGFuZ2UodGhpcy50YWJsZUxheW91dCk7fSx1cGRhdGVkOmZ1bmN0aW9uIHVwZGF0ZWQoKXtpZih0aGlzLl9fdXBkYXRlZF9fKXJldHVybjt0aGlzLm9uQ29sdW1uc0NoYW5nZSh0aGlzLnRhYmxlTGF5b3V0KTt0aGlzLm9uU2Nyb2xsYWJsZUNoYW5nZSh0aGlzLnRhYmxlTGF5b3V0KTt0aGlzLl9fdXBkYXRlZF9fPXRydWU7fSxtZXRob2RzOntvbkNvbHVtbnNDaGFuZ2U6ZnVuY3Rpb24gb25Db2x1bW5zQ2hhbmdlKGxheW91dCl7dmFyIGNvbHM9dGhpcy4kZWwucXVlcnlTZWxlY3RvckFsbCgnY29sZ3JvdXAgPiBjb2wnKTtpZighY29scy5sZW5ndGgpcmV0dXJuO3ZhciBmbGF0dGVuQ29sdW1ucz1sYXlvdXQuZ2V0RmxhdHRlbkNvbHVtbnMoKTt2YXIgY29sdW1uc01hcD17fTtmbGF0dGVuQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uKGNvbHVtbil7Y29sdW1uc01hcFtjb2x1bW4uaWRdPWNvbHVtbjt9KTtmb3IodmFyIGk9MCxqPWNvbHMubGVuZ3RoO2k8ajtpKyspe3ZhciBjb2w9Y29sc1tpXTt2YXIgbmFtZT1jb2wuZ2V0QXR0cmlidXRlKCduYW1lJyk7dmFyIGNvbHVtbj1jb2x1bW5zTWFwW25hbWVdO2lmKGNvbHVtbil7Y29sLnNldEF0dHJpYnV0ZSgnd2lkdGgnLGNvbHVtbi5yZWFsV2lkdGh8fGNvbHVtbi53aWR0aCk7fX19LG9uU2Nyb2xsYWJsZUNoYW5nZTpmdW5jdGlvbiBvblNjcm9sbGFibGVDaGFuZ2UobGF5b3V0KXt2YXIgY29scz10aGlzLiRlbC5xdWVyeVNlbGVjdG9yQWxsKCdjb2xncm91cCA+IGNvbFtuYW1lPWd1dHRlcl0nKTtmb3IodmFyIGk9MCxqPWNvbHMubGVuZ3RoO2k8ajtpKyspe3ZhciBjb2w9Y29sc1tpXTtjb2wuc2V0QXR0cmlidXRlKCd3aWR0aCcsbGF5b3V0LnNjcm9sbFk/bGF5b3V0Lmd1dHRlcldpZHRoOicwJyk7fXZhciB0aHM9dGhpcy4kZWwucXVlcnlTZWxlY3RvckFsbCgndGguZ3V0dGVyJyk7Zm9yKHZhciBfaT0wLF9qPXRocy5sZW5ndGg7X2k8X2o7X2krKyl7dmFyIHRoPXRoc1tfaV07dGguc3R5bGUud2lkdGg9bGF5b3V0LnNjcm9sbFk/bGF5b3V0Lmd1dHRlcldpZHRoKydweCc6JzAnO3RoLnN0eWxlLmRpc3BsYXk9bGF5b3V0LnNjcm9sbFk/Jyc6J25vbmUnO319fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90YWJsZS9zcmMvdGFibGUtYm9keS5qcwp2YXIgdGFibGVfYm9keV90eXBlb2Y9dHlwZW9mIFN5bWJvbD09PSJmdW5jdGlvbiImJl90eXBlb2YyKFN5bWJvbC5pdGVyYXRvcik9PT0ic3ltYm9sIj9mdW5jdGlvbihvYmope3JldHVybiBfdHlwZW9mMihvYmopO306ZnVuY3Rpb24ob2JqKXtyZXR1cm4gb2JqJiZ0eXBlb2YgU3ltYm9sPT09ImZ1bmN0aW9uIiYmb2JqLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZvYmohPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOl90eXBlb2YyKG9iaik7fTt2YXIgdGFibGVfYm9keV9leHRlbmRzPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHRhcmdldCl7Zm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIHNvdXJjZT1hcmd1bWVudHNbaV07Zm9yKHZhciBrZXkgaW4gc291cmNlKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkpe3RhcmdldFtrZXldPXNvdXJjZVtrZXldO319fXJldHVybiB0YXJnZXQ7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHRhYmxlX2JvZHk9e25hbWU6J0VsVGFibGVCb2R5JyxtaXhpbnM6W2xheW91dF9vYnNlcnZlcl0sY29tcG9uZW50czp7RWxDaGVja2JveDpjaGVja2JveF9kZWZhdWx0LmEsRWxUb29sdGlwOnRvb2x0aXBfZGVmYXVsdC5hfSxwcm9wczp7c3RvcmU6e3JlcXVpcmVkOnRydWV9LHN0cmlwZTpCb29sZWFuLGNvbnRleHQ6e30scm93Q2xhc3NOYW1lOltTdHJpbmcsRnVuY3Rpb25dLHJvd1N0eWxlOltPYmplY3QsRnVuY3Rpb25dLGZpeGVkOlN0cmluZyxoaWdobGlnaHQ6Qm9vbGVhbn0scmVuZGVyOmZ1bmN0aW9uIHJlbmRlcihoKXt2YXIgX3RoaXM9dGhpczt2YXIgZGF0YT10aGlzLmRhdGF8fFtdO3JldHVybiBoKCd0YWJsZScseydjbGFzcyc6J2VsLXRhYmxlX19ib2R5JyxhdHRyczp7Y2VsbHNwYWNpbmc6JzAnLGNlbGxwYWRkaW5nOicwJyxib3JkZXI6JzAnfX0sW2goJ2NvbGdyb3VwJyxbdGhpcy5jb2x1bW5zLm1hcChmdW5jdGlvbihjb2x1bW4pe3JldHVybiBoKCdjb2wnLHthdHRyczp7bmFtZTpjb2x1bW4uaWR9LGtleTpjb2x1bW4uaWR9KTt9KV0pLGgoJ3Rib2R5JyxbZGF0YS5yZWR1Y2UoZnVuY3Rpb24oYWNjLHJvdyl7cmV0dXJuIGFjYy5jb25jYXQoX3RoaXMud3JhcHBlZFJvd1JlbmRlcihyb3csYWNjLmxlbmd0aCkpO30sW10pLGgoJ2VsLXRvb2x0aXAnLHthdHRyczp7ZWZmZWN0OnRoaXMudGFibGUudG9vbHRpcEVmZmVjdCxwbGFjZW1lbnQ6J3RvcCcsY29udGVudDp0aGlzLnRvb2x0aXBDb250ZW50fSxyZWY6J3Rvb2x0aXAnfSldKV0pO30sY29tcHV0ZWQ6dGFibGVfYm9keV9leHRlbmRzKHt0YWJsZTpmdW5jdGlvbiB0YWJsZSgpe3JldHVybiB0aGlzLiRwYXJlbnQ7fX0sbWFwU3RhdGVzKHtkYXRhOidkYXRhJyxjb2x1bW5zOidjb2x1bW5zJyx0cmVlSW5kZW50OidpbmRlbnQnLGxlZnRGaXhlZExlYWZDb3VudDonZml4ZWRMZWFmQ29sdW1uc0xlbmd0aCcscmlnaHRGaXhlZExlYWZDb3VudDoncmlnaHRGaXhlZExlYWZDb2x1bW5zTGVuZ3RoJyxjb2x1bW5zQ291bnQ6ZnVuY3Rpb24gY29sdW1uc0NvdW50KHN0YXRlcyl7cmV0dXJuIHN0YXRlcy5jb2x1bW5zLmxlbmd0aDt9LGxlZnRGaXhlZENvdW50OmZ1bmN0aW9uIGxlZnRGaXhlZENvdW50KHN0YXRlcyl7cmV0dXJuIHN0YXRlcy5maXhlZENvbHVtbnMubGVuZ3RoO30scmlnaHRGaXhlZENvdW50OmZ1bmN0aW9uIHJpZ2h0Rml4ZWRDb3VudChzdGF0ZXMpe3JldHVybiBzdGF0ZXMucmlnaHRGaXhlZENvbHVtbnMubGVuZ3RoO30saGFzRXhwYW5kQ29sdW1uOmZ1bmN0aW9uIGhhc0V4cGFuZENvbHVtbihzdGF0ZXMpe3JldHVybiBzdGF0ZXMuY29sdW1ucy5zb21lKGZ1bmN0aW9uKF9yZWYpe3ZhciB0eXBlPV9yZWYudHlwZTtyZXR1cm4gdHlwZT09PSdleHBhbmQnO30pO319KSx7Zmlyc3REZWZhdWx0Q29sdW1uSW5kZXg6ZnVuY3Rpb24gZmlyc3REZWZhdWx0Q29sdW1uSW5kZXgoKXtyZXR1cm4gT2JqZWN0KHV0aWxfWyJhcnJheUZpbmRJbmRleCJdKSh0aGlzLmNvbHVtbnMsZnVuY3Rpb24oX3JlZjIpe3ZhciB0eXBlPV9yZWYyLnR5cGU7cmV0dXJuIHR5cGU9PT0nZGVmYXVsdCc7fSk7fX0pLHdhdGNoOnsvLyBkb24ndCB0cmlnZ2VyIGdldHRlciBvZiBjdXJyZW50Um93IGluIGdldENlbGxDbGFzcy4gc2VlIGh0dHBzOi8vanNmaWRkbGUubmV0L29lMmI0aHF0LwovLyB1cGRhdGUgRE9NIG1hbnVhbGx5LiBzZWUgaHR0cHM6Ly9naXRodWIuY29tL0VsZW1lRkUvZWxlbWVudC9wdWxsLzEzOTU0L2ZpbGVzI2RpZmYtOWI0NTBjMDBkMGE5ZGVjMGZmYWQ1YTMxNzY5NzJlNDAKJ3N0b3JlLnN0YXRlcy5ob3ZlclJvdyc6ZnVuY3Rpb24gc3RvcmVTdGF0ZXNIb3ZlclJvdyhuZXdWYWwsb2xkVmFsKXt2YXIgX3RoaXMyPXRoaXM7aWYoIXRoaXMuc3RvcmUuc3RhdGVzLmlzQ29tcGxleHx8dGhpcy4kaXNTZXJ2ZXIpcmV0dXJuO3ZhciByYWY9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZTtpZighcmFmKXtyYWY9ZnVuY3Rpb24gcmFmKGZuKXtyZXR1cm4gc2V0VGltZW91dChmbiwxNik7fTt9cmFmKGZ1bmN0aW9uKCl7dmFyIHJvd3M9X3RoaXMyLiRlbC5xdWVyeVNlbGVjdG9yQWxsKCcuZWwtdGFibGVfX3JvdycpO3ZhciBvbGRSb3c9cm93c1tvbGRWYWxdO3ZhciBuZXdSb3c9cm93c1tuZXdWYWxdO2lmKG9sZFJvdyl7T2JqZWN0KGRvbV9bInJlbW92ZUNsYXNzIl0pKG9sZFJvdywnaG92ZXItcm93Jyk7fWlmKG5ld1Jvdyl7T2JqZWN0KGRvbV9bImFkZENsYXNzIl0pKG5ld1JvdywnaG92ZXItcm93Jyk7fX0pO319LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybnt0b29sdGlwQ29udGVudDonJ307fSxjcmVhdGVkOmZ1bmN0aW9uIGNyZWF0ZWQoKXt0aGlzLmFjdGl2YXRlVG9vbHRpcD1kZWJvdW5jZV9kZWZhdWx0KCkoNTAsZnVuY3Rpb24odG9vbHRpcCl7cmV0dXJuIHRvb2x0aXAuaGFuZGxlU2hvd1BvcHBlcigpO30pO30sbWV0aG9kczp7Z2V0S2V5T2ZSb3c6ZnVuY3Rpb24gZ2V0S2V5T2ZSb3cocm93LGluZGV4KXt2YXIgcm93S2V5PXRoaXMudGFibGUucm93S2V5O2lmKHJvd0tleSl7cmV0dXJuIGdldFJvd0lkZW50aXR5KHJvdyxyb3dLZXkpO31yZXR1cm4gaW5kZXg7fSxpc0NvbHVtbkhpZGRlbjpmdW5jdGlvbiBpc0NvbHVtbkhpZGRlbihpbmRleCl7aWYodGhpcy5maXhlZD09PXRydWV8fHRoaXMuZml4ZWQ9PT0nbGVmdCcpe3JldHVybiBpbmRleD49dGhpcy5sZWZ0Rml4ZWRMZWFmQ291bnQ7fWVsc2UgaWYodGhpcy5maXhlZD09PSdyaWdodCcpe3JldHVybiBpbmRleDx0aGlzLmNvbHVtbnNDb3VudC10aGlzLnJpZ2h0Rml4ZWRMZWFmQ291bnQ7fWVsc2V7cmV0dXJuIGluZGV4PHRoaXMubGVmdEZpeGVkTGVhZkNvdW50fHxpbmRleD49dGhpcy5jb2x1bW5zQ291bnQtdGhpcy5yaWdodEZpeGVkTGVhZkNvdW50O319LGdldFNwYW46ZnVuY3Rpb24gZ2V0U3Bhbihyb3csY29sdW1uLHJvd0luZGV4LGNvbHVtbkluZGV4KXt2YXIgcm93c3Bhbj0xO3ZhciBjb2xzcGFuPTE7dmFyIGZuPXRoaXMudGFibGUuc3Bhbk1ldGhvZDtpZih0eXBlb2YgZm49PT0nZnVuY3Rpb24nKXt2YXIgcmVzdWx0PWZuKHtyb3c6cm93LGNvbHVtbjpjb2x1bW4scm93SW5kZXg6cm93SW5kZXgsY29sdW1uSW5kZXg6Y29sdW1uSW5kZXh9KTtpZihBcnJheS5pc0FycmF5KHJlc3VsdCkpe3Jvd3NwYW49cmVzdWx0WzBdO2NvbHNwYW49cmVzdWx0WzFdO31lbHNlIGlmKCh0eXBlb2YgcmVzdWx0PT09J3VuZGVmaW5lZCc/J3VuZGVmaW5lZCc6dGFibGVfYm9keV90eXBlb2YocmVzdWx0KSk9PT0nb2JqZWN0Jyl7cm93c3Bhbj1yZXN1bHQucm93c3Bhbjtjb2xzcGFuPXJlc3VsdC5jb2xzcGFuO319cmV0dXJue3Jvd3NwYW46cm93c3Bhbixjb2xzcGFuOmNvbHNwYW59O30sZ2V0Um93U3R5bGU6ZnVuY3Rpb24gZ2V0Um93U3R5bGUocm93LHJvd0luZGV4KXt2YXIgcm93U3R5bGU9dGhpcy50YWJsZS5yb3dTdHlsZTtpZih0eXBlb2Ygcm93U3R5bGU9PT0nZnVuY3Rpb24nKXtyZXR1cm4gcm93U3R5bGUuY2FsbChudWxsLHtyb3c6cm93LHJvd0luZGV4OnJvd0luZGV4fSk7fXJldHVybiByb3dTdHlsZXx8bnVsbDt9LGdldFJvd0NsYXNzOmZ1bmN0aW9uIGdldFJvd0NsYXNzKHJvdyxyb3dJbmRleCl7dmFyIGNsYXNzZXM9WydlbC10YWJsZV9fcm93J107aWYodGhpcy50YWJsZS5oaWdobGlnaHRDdXJyZW50Um93JiZyb3c9PT10aGlzLnN0b3JlLnN0YXRlcy5jdXJyZW50Um93KXtjbGFzc2VzLnB1c2goJ2N1cnJlbnQtcm93Jyk7fWlmKHRoaXMuc3RyaXBlJiZyb3dJbmRleCUyPT09MSl7Y2xhc3Nlcy5wdXNoKCdlbC10YWJsZV9fcm93LS1zdHJpcGVkJyk7fXZhciByb3dDbGFzc05hbWU9dGhpcy50YWJsZS5yb3dDbGFzc05hbWU7aWYodHlwZW9mIHJvd0NsYXNzTmFtZT09PSdzdHJpbmcnKXtjbGFzc2VzLnB1c2gocm93Q2xhc3NOYW1lKTt9ZWxzZSBpZih0eXBlb2Ygcm93Q2xhc3NOYW1lPT09J2Z1bmN0aW9uJyl7Y2xhc3Nlcy5wdXNoKHJvd0NsYXNzTmFtZS5jYWxsKG51bGwse3Jvdzpyb3cscm93SW5kZXg6cm93SW5kZXh9KSk7fWlmKHRoaXMuc3RvcmUuc3RhdGVzLmV4cGFuZFJvd3MuaW5kZXhPZihyb3cpPi0xKXtjbGFzc2VzLnB1c2goJ2V4cGFuZGVkJyk7fXJldHVybiBjbGFzc2VzO30sZ2V0Q2VsbFN0eWxlOmZ1bmN0aW9uIGdldENlbGxTdHlsZShyb3dJbmRleCxjb2x1bW5JbmRleCxyb3csY29sdW1uKXt2YXIgY2VsbFN0eWxlPXRoaXMudGFibGUuY2VsbFN0eWxlO2lmKHR5cGVvZiBjZWxsU3R5bGU9PT0nZnVuY3Rpb24nKXtyZXR1cm4gY2VsbFN0eWxlLmNhbGwobnVsbCx7cm93SW5kZXg6cm93SW5kZXgsY29sdW1uSW5kZXg6Y29sdW1uSW5kZXgscm93OnJvdyxjb2x1bW46Y29sdW1ufSk7fXJldHVybiBjZWxsU3R5bGU7fSxnZXRDZWxsQ2xhc3M6ZnVuY3Rpb24gZ2V0Q2VsbENsYXNzKHJvd0luZGV4LGNvbHVtbkluZGV4LHJvdyxjb2x1bW4pe3ZhciBjbGFzc2VzPVtjb2x1bW4uaWQsY29sdW1uLmFsaWduLGNvbHVtbi5jbGFzc05hbWVdO2lmKHRoaXMuaXNDb2x1bW5IaWRkZW4oY29sdW1uSW5kZXgpKXtjbGFzc2VzLnB1c2goJ2lzLWhpZGRlbicpO312YXIgY2VsbENsYXNzTmFtZT10aGlzLnRhYmxlLmNlbGxDbGFzc05hbWU7aWYodHlwZW9mIGNlbGxDbGFzc05hbWU9PT0nc3RyaW5nJyl7Y2xhc3Nlcy5wdXNoKGNlbGxDbGFzc05hbWUpO31lbHNlIGlmKHR5cGVvZiBjZWxsQ2xhc3NOYW1lPT09J2Z1bmN0aW9uJyl7Y2xhc3Nlcy5wdXNoKGNlbGxDbGFzc05hbWUuY2FsbChudWxsLHtyb3dJbmRleDpyb3dJbmRleCxjb2x1bW5JbmRleDpjb2x1bW5JbmRleCxyb3c6cm93LGNvbHVtbjpjb2x1bW59KSk7fXJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTt9LGdldENvbHNwYW5SZWFsV2lkdGg6ZnVuY3Rpb24gZ2V0Q29sc3BhblJlYWxXaWR0aChjb2x1bW5zLGNvbHNwYW4saW5kZXgpe2lmKGNvbHNwYW48MSl7cmV0dXJuIGNvbHVtbnNbaW5kZXhdLnJlYWxXaWR0aDt9dmFyIHdpZHRoQXJyPWNvbHVtbnMubWFwKGZ1bmN0aW9uKF9yZWYzKXt2YXIgcmVhbFdpZHRoPV9yZWYzLnJlYWxXaWR0aDtyZXR1cm4gcmVhbFdpZHRoO30pLnNsaWNlKGluZGV4LGluZGV4K2NvbHNwYW4pO3JldHVybiB3aWR0aEFyci5yZWR1Y2UoZnVuY3Rpb24oYWNjLHdpZHRoKXtyZXR1cm4gYWNjK3dpZHRoO30sLTEpO30saGFuZGxlQ2VsbE1vdXNlRW50ZXI6ZnVuY3Rpb24gaGFuZGxlQ2VsbE1vdXNlRW50ZXIoZXZlbnQscm93KXt2YXIgdGFibGU9dGhpcy50YWJsZTt2YXIgY2VsbD1nZXRDZWxsKGV2ZW50KTtpZihjZWxsKXt2YXIgY29sdW1uPWdldENvbHVtbkJ5Q2VsbCh0YWJsZSxjZWxsKTt2YXIgaG92ZXJTdGF0ZT10YWJsZS5ob3ZlclN0YXRlPXtjZWxsOmNlbGwsY29sdW1uOmNvbHVtbixyb3c6cm93fTt0YWJsZS4kZW1pdCgnY2VsbC1tb3VzZS1lbnRlcicsaG92ZXJTdGF0ZS5yb3csaG92ZXJTdGF0ZS5jb2x1bW4saG92ZXJTdGF0ZS5jZWxsLGV2ZW50KTt9Ly8g5Yik5pat5piv5ZCmdGV4dC1vdmVyZmxvdywg5aaC5p6c5piv5bCx5pi+56S6dG9vbHRpcAp2YXIgY2VsbENoaWxkPWV2ZW50LnRhcmdldC5xdWVyeVNlbGVjdG9yKCcuY2VsbCcpO2lmKCEoT2JqZWN0KGRvbV9bImhhc0NsYXNzIl0pKGNlbGxDaGlsZCwnZWwtdG9vbHRpcCcpJiZjZWxsQ2hpbGQuY2hpbGROb2Rlcy5sZW5ndGgpKXtyZXR1cm47fS8vIHVzZSByYW5nZSB3aWR0aCBpbnN0ZWFkIG9mIHNjcm9sbFdpZHRoIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSB0ZXh0IGlzIG92ZXJmbG93aW5nCi8vIHRvIGFkZHJlc3MgYSBwb3RlbnRpYWwgRmlyZUZveCBidWc6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEwNzQ1NDMjYzMKdmFyIHJhbmdlPWRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7cmFuZ2Uuc2V0U3RhcnQoY2VsbENoaWxkLDApO3JhbmdlLnNldEVuZChjZWxsQ2hpbGQsY2VsbENoaWxkLmNoaWxkTm9kZXMubGVuZ3RoKTt2YXIgcmFuZ2VXaWR0aD1yYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDt2YXIgcGFkZGluZz0ocGFyc2VJbnQoT2JqZWN0KGRvbV9bImdldFN0eWxlIl0pKGNlbGxDaGlsZCwncGFkZGluZ0xlZnQnKSwxMCl8fDApKyhwYXJzZUludChPYmplY3QoZG9tX1siZ2V0U3R5bGUiXSkoY2VsbENoaWxkLCdwYWRkaW5nUmlnaHQnKSwxMCl8fDApO2lmKChyYW5nZVdpZHRoK3BhZGRpbmc+Y2VsbENoaWxkLm9mZnNldFdpZHRofHxjZWxsQ2hpbGQuc2Nyb2xsV2lkdGg+Y2VsbENoaWxkLm9mZnNldFdpZHRoKSYmdGhpcy4kcmVmcy50b29sdGlwKXt2YXIgdG9vbHRpcD10aGlzLiRyZWZzLnRvb2x0aXA7Ly8gVE9ETyDkvJrlvJXotbfmlbTkuKogVGFibGUg55qE6YeN5paw5riy5p+T77yM6ZyA6KaB5LyY5YyWCnRoaXMudG9vbHRpcENvbnRlbnQ9Y2VsbC5pbm5lclRleHR8fGNlbGwudGV4dENvbnRlbnQ7dG9vbHRpcC5yZWZlcmVuY2VFbG09Y2VsbDt0b29sdGlwLiRyZWZzLnBvcHBlciYmKHRvb2x0aXAuJHJlZnMucG9wcGVyLnN0eWxlLmRpc3BsYXk9J25vbmUnKTt0b29sdGlwLmRvRGVzdHJveSgpO3Rvb2x0aXAuc2V0RXhwZWN0ZWRTdGF0ZSh0cnVlKTt0aGlzLmFjdGl2YXRlVG9vbHRpcCh0b29sdGlwKTt9fSxoYW5kbGVDZWxsTW91c2VMZWF2ZTpmdW5jdGlvbiBoYW5kbGVDZWxsTW91c2VMZWF2ZShldmVudCl7dmFyIHRvb2x0aXA9dGhpcy4kcmVmcy50b29sdGlwO2lmKHRvb2x0aXApe3Rvb2x0aXAuc2V0RXhwZWN0ZWRTdGF0ZShmYWxzZSk7dG9vbHRpcC5oYW5kbGVDbG9zZVBvcHBlcigpO312YXIgY2VsbD1nZXRDZWxsKGV2ZW50KTtpZighY2VsbClyZXR1cm47dmFyIG9sZEhvdmVyU3RhdGU9dGhpcy50YWJsZS5ob3ZlclN0YXRlfHx7fTt0aGlzLnRhYmxlLiRlbWl0KCdjZWxsLW1vdXNlLWxlYXZlJyxvbGRIb3ZlclN0YXRlLnJvdyxvbGRIb3ZlclN0YXRlLmNvbHVtbixvbGRIb3ZlclN0YXRlLmNlbGwsZXZlbnQpO30saGFuZGxlTW91c2VFbnRlcjpkZWJvdW5jZV9kZWZhdWx0KCkoMzAsZnVuY3Rpb24oaW5kZXgpe3RoaXMuc3RvcmUuY29tbWl0KCdzZXRIb3ZlclJvdycsaW5kZXgpO30pLGhhbmRsZU1vdXNlTGVhdmU6ZGVib3VuY2VfZGVmYXVsdCgpKDMwLGZ1bmN0aW9uKCl7dGhpcy5zdG9yZS5jb21taXQoJ3NldEhvdmVyUm93JyxudWxsKTt9KSxoYW5kbGVDb250ZXh0TWVudTpmdW5jdGlvbiBoYW5kbGVDb250ZXh0TWVudShldmVudCxyb3cpe3RoaXMuaGFuZGxlRXZlbnQoZXZlbnQscm93LCdjb250ZXh0bWVudScpO30saGFuZGxlRG91YmxlQ2xpY2s6ZnVuY3Rpb24gaGFuZGxlRG91YmxlQ2xpY2soZXZlbnQscm93KXt0aGlzLmhhbmRsZUV2ZW50KGV2ZW50LHJvdywnZGJsY2xpY2snKTt9LGhhbmRsZUNsaWNrOmZ1bmN0aW9uIGhhbmRsZUNsaWNrKGV2ZW50LHJvdyl7dGhpcy5zdG9yZS5jb21taXQoJ3NldEN1cnJlbnRSb3cnLHJvdyk7dGhpcy5oYW5kbGVFdmVudChldmVudCxyb3csJ2NsaWNrJyk7fSxoYW5kbGVFdmVudDpmdW5jdGlvbiBoYW5kbGVFdmVudChldmVudCxyb3csbmFtZSl7dmFyIHRhYmxlPXRoaXMudGFibGU7dmFyIGNlbGw9Z2V0Q2VsbChldmVudCk7dmFyIGNvbHVtbj12b2lkIDA7aWYoY2VsbCl7Y29sdW1uPWdldENvbHVtbkJ5Q2VsbCh0YWJsZSxjZWxsKTtpZihjb2x1bW4pe3RhYmxlLiRlbWl0KCdjZWxsLScrbmFtZSxyb3csY29sdW1uLGNlbGwsZXZlbnQpO319dGFibGUuJGVtaXQoJ3Jvdy0nK25hbWUscm93LGNvbHVtbixldmVudCk7fSxyb3dSZW5kZXI6ZnVuY3Rpb24gcm93UmVuZGVyKHJvdywkaW5kZXgsdHJlZVJvd0RhdGEpe3ZhciBfdGhpczM9dGhpczt2YXIgaD10aGlzLiRjcmVhdGVFbGVtZW50O3ZhciB0cmVlSW5kZW50PXRoaXMudHJlZUluZGVudCxjb2x1bW5zPXRoaXMuY29sdW1ucyxmaXJzdERlZmF1bHRDb2x1bW5JbmRleD10aGlzLmZpcnN0RGVmYXVsdENvbHVtbkluZGV4O3ZhciBjb2x1bW5zSGlkZGVuPWNvbHVtbnMubWFwKGZ1bmN0aW9uKGNvbHVtbixpbmRleCl7cmV0dXJuIF90aGlzMy5pc0NvbHVtbkhpZGRlbihpbmRleCk7fSk7dmFyIHJvd0NsYXNzZXM9dGhpcy5nZXRSb3dDbGFzcyhyb3csJGluZGV4KTt2YXIgZGlzcGxheT10cnVlO2lmKHRyZWVSb3dEYXRhKXtyb3dDbGFzc2VzLnB1c2goJ2VsLXRhYmxlX19yb3ctLWxldmVsLScrdHJlZVJvd0RhdGEubGV2ZWwpO2Rpc3BsYXk9dHJlZVJvd0RhdGEuZGlzcGxheTt9Ly8g5oyH5LukIHYtc2hvdyDkvJropobnm5Ygcm93LXN0eWxlIOS4rSBkaXNwbGF5Ci8vIOS9v+eUqCA6c3R5bGUg5Luj5pu/IHYtc2hvdyBodHRwczovL2dpdGh1Yi5jb20vRWxlbWVGRS9lbGVtZW50L2lzc3Vlcy8xNjk5NQp2YXIgZGlzcGxheVN0eWxlPWRpc3BsYXk/bnVsbDp7ZGlzcGxheTonbm9uZSd9O3JldHVybiBoKCd0cicse3N0eWxlOltkaXNwbGF5U3R5bGUsdGhpcy5nZXRSb3dTdHlsZShyb3csJGluZGV4KV0sJ2NsYXNzJzpyb3dDbGFzc2VzLGtleTp0aGlzLmdldEtleU9mUm93KHJvdywkaW5kZXgpLG9uOnsnZGJsY2xpY2snOmZ1bmN0aW9uIGRibGNsaWNrKCRldmVudCl7cmV0dXJuIF90aGlzMy5oYW5kbGVEb3VibGVDbGljaygkZXZlbnQscm93KTt9LCdjbGljayc6ZnVuY3Rpb24gY2xpY2soJGV2ZW50KXtyZXR1cm4gX3RoaXMzLmhhbmRsZUNsaWNrKCRldmVudCxyb3cpO30sJ2NvbnRleHRtZW51JzpmdW5jdGlvbiBjb250ZXh0bWVudSgkZXZlbnQpe3JldHVybiBfdGhpczMuaGFuZGxlQ29udGV4dE1lbnUoJGV2ZW50LHJvdyk7fSwnbW91c2VlbnRlcic6ZnVuY3Rpb24gbW91c2VlbnRlcihfKXtyZXR1cm4gX3RoaXMzLmhhbmRsZU1vdXNlRW50ZXIoJGluZGV4KTt9LCdtb3VzZWxlYXZlJzp0aGlzLmhhbmRsZU1vdXNlTGVhdmV9fSxbY29sdW1ucy5tYXAoZnVuY3Rpb24oY29sdW1uLGNlbGxJbmRleCl7dmFyIF9nZXRTcGFuPV90aGlzMy5nZXRTcGFuKHJvdyxjb2x1bW4sJGluZGV4LGNlbGxJbmRleCkscm93c3Bhbj1fZ2V0U3Bhbi5yb3dzcGFuLGNvbHNwYW49X2dldFNwYW4uY29sc3BhbjtpZighcm93c3Bhbnx8IWNvbHNwYW4pe3JldHVybiBudWxsO312YXIgY29sdW1uRGF0YT10YWJsZV9ib2R5X2V4dGVuZHMoe30sY29sdW1uKTtjb2x1bW5EYXRhLnJlYWxXaWR0aD1fdGhpczMuZ2V0Q29sc3BhblJlYWxXaWR0aChjb2x1bW5zLGNvbHNwYW4sY2VsbEluZGV4KTt2YXIgZGF0YT17c3RvcmU6X3RoaXMzLnN0b3JlLF9zZWxmOl90aGlzMy5jb250ZXh0fHxfdGhpczMudGFibGUuJHZub2RlLmNvbnRleHQsY29sdW1uOmNvbHVtbkRhdGEscm93OnJvdywkaW5kZXg6JGluZGV4fTtpZihjZWxsSW5kZXg9PT1maXJzdERlZmF1bHRDb2x1bW5JbmRleCYmdHJlZVJvd0RhdGEpe2RhdGEudHJlZU5vZGU9e2luZGVudDp0cmVlUm93RGF0YS5sZXZlbCp0cmVlSW5kZW50LGxldmVsOnRyZWVSb3dEYXRhLmxldmVsfTtpZih0eXBlb2YgdHJlZVJvd0RhdGEuZXhwYW5kZWQ9PT0nYm9vbGVhbicpe2RhdGEudHJlZU5vZGUuZXhwYW5kZWQ9dHJlZVJvd0RhdGEuZXhwYW5kZWQ7Ly8g6KGo5piO5piv5oeS5Yqg6L29CmlmKCdsb2FkaW5nJ2luIHRyZWVSb3dEYXRhKXtkYXRhLnRyZWVOb2RlLmxvYWRpbmc9dHJlZVJvd0RhdGEubG9hZGluZzt9aWYoJ25vTGF6eUNoaWxkcmVuJ2luIHRyZWVSb3dEYXRhKXtkYXRhLnRyZWVOb2RlLm5vTGF6eUNoaWxkcmVuPXRyZWVSb3dEYXRhLm5vTGF6eUNoaWxkcmVuO319fXJldHVybiBoKCd0ZCcse3N0eWxlOl90aGlzMy5nZXRDZWxsU3R5bGUoJGluZGV4LGNlbGxJbmRleCxyb3csY29sdW1uKSwnY2xhc3MnOl90aGlzMy5nZXRDZWxsQ2xhc3MoJGluZGV4LGNlbGxJbmRleCxyb3csY29sdW1uKSxhdHRyczp7cm93c3Bhbjpyb3dzcGFuLGNvbHNwYW46Y29sc3Bhbn0sb246eydtb3VzZWVudGVyJzpmdW5jdGlvbiBtb3VzZWVudGVyKCRldmVudCl7cmV0dXJuIF90aGlzMy5oYW5kbGVDZWxsTW91c2VFbnRlcigkZXZlbnQscm93KTt9LCdtb3VzZWxlYXZlJzpfdGhpczMuaGFuZGxlQ2VsbE1vdXNlTGVhdmV9fSxbY29sdW1uLnJlbmRlckNlbGwuY2FsbChfdGhpczMuX3JlbmRlclByb3h5LF90aGlzMy4kY3JlYXRlRWxlbWVudCxkYXRhLGNvbHVtbnNIaWRkZW5bY2VsbEluZGV4XSldKTt9KV0pO30sd3JhcHBlZFJvd1JlbmRlcjpmdW5jdGlvbiB3cmFwcGVkUm93UmVuZGVyKHJvdywkaW5kZXgpe3ZhciBfdGhpczQ9dGhpczt2YXIgaD10aGlzLiRjcmVhdGVFbGVtZW50O3ZhciBzdG9yZT10aGlzLnN0b3JlO3ZhciBpc1Jvd0V4cGFuZGVkPXN0b3JlLmlzUm93RXhwYW5kZWQsYXNzZXJ0Um93S2V5PXN0b3JlLmFzc2VydFJvd0tleTt2YXIgX3N0b3JlJHN0YXRlcz1zdG9yZS5zdGF0ZXMsdHJlZURhdGE9X3N0b3JlJHN0YXRlcy50cmVlRGF0YSxsYXp5VHJlZU5vZGVNYXA9X3N0b3JlJHN0YXRlcy5sYXp5VHJlZU5vZGVNYXAsY2hpbGRyZW5Db2x1bW5OYW1lPV9zdG9yZSRzdGF0ZXMuY2hpbGRyZW5Db2x1bW5OYW1lLHJvd0tleT1fc3RvcmUkc3RhdGVzLnJvd0tleTtpZih0aGlzLmhhc0V4cGFuZENvbHVtbiYmaXNSb3dFeHBhbmRlZChyb3cpKXt2YXIgcmVuZGVyRXhwYW5kZWQ9dGhpcy50YWJsZS5yZW5kZXJFeHBhbmRlZDt2YXIgdHI9dGhpcy5yb3dSZW5kZXIocm93LCRpbmRleCk7aWYoIXJlbmRlckV4cGFuZGVkKXtjb25zb2xlLmVycm9yKCdbRWxlbWVudCBFcnJvcl1yZW5kZXJFeHBhbmRlZCBpcyByZXF1aXJlZC4nKTtyZXR1cm4gdHI7fS8vIOS9v+eUqOS6jOe7tOaVsOe7hO+8jOmBv+WFjeS/ruaUuSAkaW5kZXgKcmV0dXJuW1t0cixoKCd0cicse2tleTonZXhwYW5kZWQtcm93X18nK3RyLmtleX0sW2goJ3RkJyx7YXR0cnM6e2NvbHNwYW46dGhpcy5jb2x1bW5zQ291bnR9LCdjbGFzcyc6J2VsLXRhYmxlX19leHBhbmRlZC1jZWxsJ30sW3JlbmRlckV4cGFuZGVkKHRoaXMuJGNyZWF0ZUVsZW1lbnQse3Jvdzpyb3csJGluZGV4OiRpbmRleCxzdG9yZTp0aGlzLnN0b3JlfSldKV0pXV07fWVsc2UgaWYoT2JqZWN0LmtleXModHJlZURhdGEpLmxlbmd0aCl7YXNzZXJ0Um93S2V5KCk7Ly8gVHJlZVRhYmxlIOaXtu+8jHJvd0tleSDlv4XpobvnlLHnlKjmiLforr7lrprvvIzkuI3kvb/nlKggZ2V0S2V5T2ZSb3cg6K6h566XCi8vIOWcqOiwg+eUqCByb3dSZW5kZXIg5Ye95pWw5pe277yM5LuN54S25Lya6K6h566XIHJvd0tlee+8jOS4jeWkquWlveeahOaTjeS9nAp2YXIga2V5PWdldFJvd0lkZW50aXR5KHJvdyxyb3dLZXkpO3ZhciBjdXI9dHJlZURhdGFba2V5XTt2YXIgdHJlZVJvd0RhdGE9bnVsbDtpZihjdXIpe3RyZWVSb3dEYXRhPXtleHBhbmRlZDpjdXIuZXhwYW5kZWQsbGV2ZWw6Y3VyLmxldmVsLGRpc3BsYXk6dHJ1ZX07aWYodHlwZW9mIGN1ci5sYXp5PT09J2Jvb2xlYW4nKXtpZih0eXBlb2YgY3VyLmxvYWRlZD09PSdib29sZWFuJyYmY3VyLmxvYWRlZCl7dHJlZVJvd0RhdGEubm9MYXp5Q2hpbGRyZW49IShjdXIuY2hpbGRyZW4mJmN1ci5jaGlsZHJlbi5sZW5ndGgpO310cmVlUm93RGF0YS5sb2FkaW5nPWN1ci5sb2FkaW5nO319dmFyIHRtcD1bdGhpcy5yb3dSZW5kZXIocm93LCRpbmRleCx0cmVlUm93RGF0YSldOy8vIOa4suafk+W1jOWll+aVsOaNrgppZihjdXIpey8vIGN1cnJlbnRSb3cg6K6w5b2V55qE5pivIGluZGV477yM5omA5Lul6L+Y6ZyA5Li75Yqo5aKe5YqgIFRyZWVUYWJsZSDnmoQgaW5kZXgKdmFyIGk9MDt2YXIgdHJhdmVyc2U9ZnVuY3Rpb24gdHJhdmVyc2UoY2hpbGRyZW4scGFyZW50KXtpZighKGNoaWxkcmVuJiZjaGlsZHJlbi5sZW5ndGgmJnBhcmVudCkpcmV0dXJuO2NoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24obm9kZSl7Ly8g54i26IqC54K555qEIGRpc3BsYXkg54q25oCB5b2x5ZON5a2Q6IqC54K555qE5pi+56S654q25oCBCnZhciBpbm5lclRyZWVSb3dEYXRhPXtkaXNwbGF5OnBhcmVudC5kaXNwbGF5JiZwYXJlbnQuZXhwYW5kZWQsbGV2ZWw6cGFyZW50LmxldmVsKzF9O3ZhciBjaGlsZEtleT1nZXRSb3dJZGVudGl0eShub2RlLHJvd0tleSk7aWYoY2hpbGRLZXk9PT11bmRlZmluZWR8fGNoaWxkS2V5PT09bnVsbCl7dGhyb3cgbmV3IEVycm9yKCdmb3IgbmVzdGVkIGRhdGEgaXRlbSwgcm93LWtleSBpcyByZXF1aXJlZC4nKTt9Y3VyPXRhYmxlX2JvZHlfZXh0ZW5kcyh7fSx0cmVlRGF0YVtjaGlsZEtleV0pOy8vIOWvueS6juW9k+WJjeiKgueCue+8jOWIhuaIkOacieaXoOWtkOiKgueCueS4pOenjeaDheWGteOAggovLyDlpoLmnpzljIXlkKvlrZDoioLngrnnmoTvvIzorr7nva4gZXhwYW5kZWQg5bGe5oCn44CCCi8vIOWvueS6juWug+WtkOiKgueCueeahCBkaXNwbGF5IOWxnuaAp+eUseWug+acrOi6q+eahCBleHBhbmRlZCDkuI4gZGlzcGxheSDlhbHlkIzlhrPlrprjgIIKaWYoY3VyKXtpbm5lclRyZWVSb3dEYXRhLmV4cGFuZGVkPWN1ci5leHBhbmRlZDsvLyDmh5LliqDovb3nmoTmn5DkupvoioLngrnvvIxsZXZlbCDmnKrnn6UKY3VyLmxldmVsPWN1ci5sZXZlbHx8aW5uZXJUcmVlUm93RGF0YS5sZXZlbDtjdXIuZGlzcGxheT0hIShjdXIuZXhwYW5kZWQmJmlubmVyVHJlZVJvd0RhdGEuZGlzcGxheSk7aWYodHlwZW9mIGN1ci5sYXp5PT09J2Jvb2xlYW4nKXtpZih0eXBlb2YgY3VyLmxvYWRlZD09PSdib29sZWFuJyYmY3VyLmxvYWRlZCl7aW5uZXJUcmVlUm93RGF0YS5ub0xhenlDaGlsZHJlbj0hKGN1ci5jaGlsZHJlbiYmY3VyLmNoaWxkcmVuLmxlbmd0aCk7fWlubmVyVHJlZVJvd0RhdGEubG9hZGluZz1jdXIubG9hZGluZzt9fWkrKzt0bXAucHVzaChfdGhpczQucm93UmVuZGVyKG5vZGUsJGluZGV4K2ksaW5uZXJUcmVlUm93RGF0YSkpO2lmKGN1cil7dmFyIF9ub2Rlcz1sYXp5VHJlZU5vZGVNYXBbY2hpbGRLZXldfHxub2RlW2NoaWxkcmVuQ29sdW1uTmFtZV07dHJhdmVyc2UoX25vZGVzLGN1cik7fX0pO307Ly8g5a+55LqOIHJvb3Qg6IqC54K577yMZGlzcGxheSDkuIDlrprkuLogdHJ1ZQpjdXIuZGlzcGxheT10cnVlO3ZhciBub2Rlcz1sYXp5VHJlZU5vZGVNYXBba2V5XXx8cm93W2NoaWxkcmVuQ29sdW1uTmFtZV07dHJhdmVyc2Uobm9kZXMsY3VyKTt9cmV0dXJuIHRtcDt9ZWxzZXtyZXR1cm4gdGhpcy5yb3dSZW5kZXIocm93LCRpbmRleCk7fX19fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3RhYmxlL3NyYy9maWx0ZXItcGFuZWwudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTdmMmM5MTlmJgp2YXIgZmlsdGVyX3BhbmVsdnVlX3R5cGVfdGVtcGxhdGVfaWRfN2YyYzkxOWZfcmVuZGVyPWZ1bmN0aW9uIGZpbHRlcl9wYW5lbHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzdmMmM5MTlmX3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygidHJhbnNpdGlvbiIse2F0dHJzOntuYW1lOiJlbC16b29tLWluLXRvcCJ9fSxbX3ZtLm11bHRpcGxlP19jKCJkaXYiLHtkaXJlY3RpdmVzOlt7bmFtZToiY2xpY2tvdXRzaWRlIixyYXdOYW1lOiJ2LWNsaWNrb3V0c2lkZSIsdmFsdWU6X3ZtLmhhbmRsZU91dHNpZGVDbGljayxleHByZXNzaW9uOiJoYW5kbGVPdXRzaWRlQ2xpY2sifSx7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTpfdm0uc2hvd1BvcHBlcixleHByZXNzaW9uOiJzaG93UG9wcGVyIn1dLHN0YXRpY0NsYXNzOiJlbC10YWJsZS1maWx0ZXIifSxbX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC10YWJsZS1maWx0ZXJfX2NvbnRlbnQifSxbX2MoImVsLXNjcm9sbGJhciIse2F0dHJzOnsid3JhcC1jbGFzcyI6ImVsLXRhYmxlLWZpbHRlcl9fd3JhcCJ9fSxbX2MoImVsLWNoZWNrYm94LWdyb3VwIix7c3RhdGljQ2xhc3M6ImVsLXRhYmxlLWZpbHRlcl9fY2hlY2tib3gtZ3JvdXAiLG1vZGVsOnt2YWx1ZTpfdm0uZmlsdGVyZWRWYWx1ZSxjYWxsYmFjazpmdW5jdGlvbiBjYWxsYmFjaygkJHYpe192bS5maWx0ZXJlZFZhbHVlPSQkdjt9LGV4cHJlc3Npb246ImZpbHRlcmVkVmFsdWUifX0sX3ZtLl9sKF92bS5maWx0ZXJzLGZ1bmN0aW9uKGZpbHRlcil7cmV0dXJuIF9jKCJlbC1jaGVja2JveCIse2tleTpmaWx0ZXIudmFsdWUsYXR0cnM6e2xhYmVsOmZpbHRlci52YWx1ZX19LFtfdm0uX3YoX3ZtLl9zKGZpbHRlci50ZXh0KSldKTt9KSwxKV0sMSldLDEpLF9jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtdGFibGUtZmlsdGVyX19ib3R0b20ifSxbX2MoImJ1dHRvbiIse2NsYXNzOnsiaXMtZGlzYWJsZWQiOl92bS5maWx0ZXJlZFZhbHVlLmxlbmd0aD09PTB9LGF0dHJzOntkaXNhYmxlZDpfdm0uZmlsdGVyZWRWYWx1ZS5sZW5ndGg9PT0wfSxvbjp7Y2xpY2s6X3ZtLmhhbmRsZUNvbmZpcm19fSxbX3ZtLl92KF92bS5fcyhfdm0udCgiZWwudGFibGUuY29uZmlybUZpbHRlciIpKSldKSxfYygiYnV0dG9uIix7b246e2NsaWNrOl92bS5oYW5kbGVSZXNldH19LFtfdm0uX3YoX3ZtLl9zKF92bS50KCJlbC50YWJsZS5yZXNldEZpbHRlciIpKSldKV0pXSk6X2MoImRpdiIse2RpcmVjdGl2ZXM6W3tuYW1lOiJjbGlja291dHNpZGUiLHJhd05hbWU6InYtY2xpY2tvdXRzaWRlIix2YWx1ZTpfdm0uaGFuZGxlT3V0c2lkZUNsaWNrLGV4cHJlc3Npb246ImhhbmRsZU91dHNpZGVDbGljayJ9LHtuYW1lOiJzaG93IixyYXdOYW1lOiJ2LXNob3ciLHZhbHVlOl92bS5zaG93UG9wcGVyLGV4cHJlc3Npb246InNob3dQb3BwZXIifV0sc3RhdGljQ2xhc3M6ImVsLXRhYmxlLWZpbHRlciJ9LFtfYygidWwiLHtzdGF0aWNDbGFzczoiZWwtdGFibGUtZmlsdGVyX19saXN0In0sW19jKCJsaSIse3N0YXRpY0NsYXNzOiJlbC10YWJsZS1maWx0ZXJfX2xpc3QtaXRlbSIsY2xhc3M6eyJpcy1hY3RpdmUiOl92bS5maWx0ZXJWYWx1ZT09PXVuZGVmaW5lZHx8X3ZtLmZpbHRlclZhbHVlPT09bnVsbH0sb246e2NsaWNrOmZ1bmN0aW9uIGNsaWNrKCRldmVudCl7X3ZtLmhhbmRsZVNlbGVjdChudWxsKTt9fX0sW192bS5fdihfdm0uX3MoX3ZtLnQoImVsLnRhYmxlLmNsZWFyRmlsdGVyIikpKV0pLF92bS5fbChfdm0uZmlsdGVycyxmdW5jdGlvbihmaWx0ZXIpe3JldHVybiBfYygibGkiLHtrZXk6ZmlsdGVyLnZhbHVlLHN0YXRpY0NsYXNzOiJlbC10YWJsZS1maWx0ZXJfX2xpc3QtaXRlbSIsY2xhc3M6eyJpcy1hY3RpdmUiOl92bS5pc0FjdGl2ZShmaWx0ZXIpfSxhdHRyczp7bGFiZWw6ZmlsdGVyLnZhbHVlfSxvbjp7Y2xpY2s6ZnVuY3Rpb24gY2xpY2soJGV2ZW50KXtfdm0uaGFuZGxlU2VsZWN0KGZpbHRlci52YWx1ZSk7fX19LFtfdm0uX3YoX3ZtLl9zKGZpbHRlci50ZXh0KSldKTt9KV0sMildKV0pO307dmFyIGZpbHRlcl9wYW5lbHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzdmMmM5MTlmX3N0YXRpY1JlbmRlckZucz1bXTtmaWx0ZXJfcGFuZWx2dWVfdHlwZV90ZW1wbGF0ZV9pZF83ZjJjOTE5Zl9yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGFibGUvc3JjL2ZpbHRlci1wYW5lbC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9N2YyYzkxOWYmCi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGFibGUvc3JjL2Ryb3Bkb3duLmpzCnZhciBkcm9wZG93bnM9W107IWV4dGVybmFsX3Z1ZV9kZWZhdWx0LmEucHJvdG90eXBlLiRpc1NlcnZlciYmZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGV2ZW50KXtkcm9wZG93bnMuZm9yRWFjaChmdW5jdGlvbihkcm9wZG93bil7dmFyIHRhcmdldD1ldmVudC50YXJnZXQ7aWYoIWRyb3Bkb3dufHwhZHJvcGRvd24uJGVsKXJldHVybjtpZih0YXJnZXQ9PT1kcm9wZG93bi4kZWx8fGRyb3Bkb3duLiRlbC5jb250YWlucyh0YXJnZXQpKXtyZXR1cm47fWRyb3Bkb3duLmhhbmRsZU91dHNpZGVDbGljayYmZHJvcGRvd24uaGFuZGxlT3V0c2lkZUNsaWNrKGV2ZW50KTt9KTt9KTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHNyY19kcm9wZG93bj17b3BlbjpmdW5jdGlvbiBvcGVuKGluc3RhbmNlKXtpZihpbnN0YW5jZSl7ZHJvcGRvd25zLnB1c2goaW5zdGFuY2UpO319LGNsb3NlOmZ1bmN0aW9uIGNsb3NlKGluc3RhbmNlKXt2YXIgaW5kZXg9ZHJvcGRvd25zLmluZGV4T2YoaW5zdGFuY2UpO2lmKGluZGV4IT09LTEpe2Ryb3Bkb3ducy5zcGxpY2UoaW5zdGFuY2UsMSk7fX19Oy8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgImVsZW1lbnQtdWkvbGliL2NoZWNrYm94LWdyb3VwIgp2YXIgY2hlY2tib3hfZ3JvdXBfPV9fd2VicGFja19yZXF1aXJlX18oMzIpO3ZhciBjaGVja2JveF9ncm91cF9kZWZhdWx0PS8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY2hlY2tib3hfZ3JvdXBfKTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy90YWJsZS9zcmMvZmlsdGVyLXBhbmVsLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBmaWx0ZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e25hbWU6J0VsVGFibGVGaWx0ZXJQYW5lbCcsbWl4aW5zOlt2dWVfcG9wcGVyX2RlZmF1bHQuYSxsb2NhbGVfZGVmYXVsdC5hXSxkaXJlY3RpdmVzOntDbGlja291dHNpZGU6Y2xpY2tvdXRzaWRlX2RlZmF1bHQuYX0sY29tcG9uZW50czp7RWxDaGVja2JveDpjaGVja2JveF9kZWZhdWx0LmEsRWxDaGVja2JveEdyb3VwOmNoZWNrYm94X2dyb3VwX2RlZmF1bHQuYSxFbFNjcm9sbGJhcjpzY3JvbGxiYXJfZGVmYXVsdC5hfSxwcm9wczp7cGxhY2VtZW50Ont0eXBlOlN0cmluZyxkZWZhdWx0Oidib3R0b20tZW5kJ319LG1ldGhvZHM6e2lzQWN0aXZlOmZ1bmN0aW9uIGlzQWN0aXZlKGZpbHRlcil7cmV0dXJuIGZpbHRlci52YWx1ZT09PXRoaXMuZmlsdGVyVmFsdWU7fSxoYW5kbGVPdXRzaWRlQ2xpY2s6ZnVuY3Rpb24gaGFuZGxlT3V0c2lkZUNsaWNrKCl7dmFyIF90aGlzPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe190aGlzLnNob3dQb3BwZXI9ZmFsc2U7fSwxNik7fSxoYW5kbGVDb25maXJtOmZ1bmN0aW9uIGhhbmRsZUNvbmZpcm0oKXt0aGlzLmNvbmZpcm1GaWx0ZXIodGhpcy5maWx0ZXJlZFZhbHVlKTt0aGlzLmhhbmRsZU91dHNpZGVDbGljaygpO30saGFuZGxlUmVzZXQ6ZnVuY3Rpb24gaGFuZGxlUmVzZXQoKXt0aGlzLmZpbHRlcmVkVmFsdWU9W107dGhpcy5jb25maXJtRmlsdGVyKHRoaXMuZmlsdGVyZWRWYWx1ZSk7dGhpcy5oYW5kbGVPdXRzaWRlQ2xpY2soKTt9LGhhbmRsZVNlbGVjdDpmdW5jdGlvbiBoYW5kbGVTZWxlY3QoZmlsdGVyVmFsdWUpe3RoaXMuZmlsdGVyVmFsdWU9ZmlsdGVyVmFsdWU7aWYodHlwZW9mIGZpbHRlclZhbHVlIT09J3VuZGVmaW5lZCcmJmZpbHRlclZhbHVlIT09bnVsbCl7dGhpcy5jb25maXJtRmlsdGVyKHRoaXMuZmlsdGVyZWRWYWx1ZSk7fWVsc2V7dGhpcy5jb25maXJtRmlsdGVyKFtdKTt9dGhpcy5oYW5kbGVPdXRzaWRlQ2xpY2soKTt9LGNvbmZpcm1GaWx0ZXI6ZnVuY3Rpb24gY29uZmlybUZpbHRlcihmaWx0ZXJlZFZhbHVlKXt0aGlzLnRhYmxlLnN0b3JlLmNvbW1pdCgnZmlsdGVyQ2hhbmdlJyx7Y29sdW1uOnRoaXMuY29sdW1uLHZhbHVlczpmaWx0ZXJlZFZhbHVlfSk7dGhpcy50YWJsZS5zdG9yZS51cGRhdGVBbGxTZWxlY3RlZCgpO319LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybnt0YWJsZTpudWxsLGNlbGw6bnVsbCxjb2x1bW46bnVsbH07fSxjb21wdXRlZDp7ZmlsdGVyczpmdW5jdGlvbiBmaWx0ZXJzKCl7cmV0dXJuIHRoaXMuY29sdW1uJiZ0aGlzLmNvbHVtbi5maWx0ZXJzO30sZmlsdGVyVmFsdWU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4odGhpcy5jb2x1bW4uZmlsdGVyZWRWYWx1ZXx8W10pWzBdO30sc2V0OmZ1bmN0aW9uIHNldCh2YWx1ZSl7aWYodGhpcy5maWx0ZXJlZFZhbHVlKXtpZih0eXBlb2YgdmFsdWUhPT0ndW5kZWZpbmVkJyYmdmFsdWUhPT1udWxsKXt0aGlzLmZpbHRlcmVkVmFsdWUuc3BsaWNlKDAsMSx2YWx1ZSk7fWVsc2V7dGhpcy5maWx0ZXJlZFZhbHVlLnNwbGljZSgwLDEpO319fX0sZmlsdGVyZWRWYWx1ZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe2lmKHRoaXMuY29sdW1uKXtyZXR1cm4gdGhpcy5jb2x1bW4uZmlsdGVyZWRWYWx1ZXx8W107fXJldHVybltdO30sc2V0OmZ1bmN0aW9uIHNldCh2YWx1ZSl7aWYodGhpcy5jb2x1bW4pe3RoaXMuY29sdW1uLmZpbHRlcmVkVmFsdWU9dmFsdWU7fX19LG11bHRpcGxlOmZ1bmN0aW9uIG11bHRpcGxlKCl7aWYodGhpcy5jb2x1bW4pe3JldHVybiB0aGlzLmNvbHVtbi5maWx0ZXJNdWx0aXBsZTt9cmV0dXJuIHRydWU7fX0sbW91bnRlZDpmdW5jdGlvbiBtb3VudGVkKCl7dmFyIF90aGlzMj10aGlzO3RoaXMucG9wcGVyRWxtPXRoaXMuJGVsO3RoaXMucmVmZXJlbmNlRWxtPXRoaXMuY2VsbDt0aGlzLnRhYmxlLmJvZHlXcmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsZnVuY3Rpb24oKXtfdGhpczIudXBkYXRlUG9wcGVyKCk7fSk7dGhpcy4kd2F0Y2goJ3Nob3dQb3BwZXInLGZ1bmN0aW9uKHZhbHVlKXtpZihfdGhpczIuY29sdW1uKV90aGlzMi5jb2x1bW4uZmlsdGVyT3BlbmVkPXZhbHVlO2lmKHZhbHVlKXtzcmNfZHJvcGRvd24ub3BlbihfdGhpczIpO31lbHNle3NyY19kcm9wZG93bi5jbG9zZShfdGhpczIpO319KTt9LHdhdGNoOntzaG93UG9wcGVyOmZ1bmN0aW9uIHNob3dQb3BwZXIodmFsKXtpZih2YWw9PT10cnVlJiZwYXJzZUludCh0aGlzLnBvcHBlckpTLl9wb3BwZXIuc3R5bGUuekluZGV4LDEwKTxwb3B1cF9bIlBvcHVwTWFuYWdlciJdLnpJbmRleCl7dGhpcy5wb3BwZXJKUy5fcG9wcGVyLnN0eWxlLnpJbmRleD1wb3B1cF9bIlBvcHVwTWFuYWdlciJdLm5leHRaSW5kZXgoKTt9fX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGFibGUvc3JjL2ZpbHRlci1wYW5lbC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc3JjX2ZpbHRlcl9wYW5lbHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz1maWx0ZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90YWJsZS9zcmMvZmlsdGVyLXBhbmVsLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIGZpbHRlcl9wYW5lbF9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHNyY19maWx0ZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sZmlsdGVyX3BhbmVsdnVlX3R5cGVfdGVtcGxhdGVfaWRfN2YyYzkxOWZfcmVuZGVyLGZpbHRlcl9wYW5lbHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzdmMmM5MTlmX3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgZmlsdGVyX3BhbmVsX2FwaTt9ZmlsdGVyX3BhbmVsX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvdGFibGUvc3JjL2ZpbHRlci1wYW5lbC52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgZmlsdGVyX3BhbmVsPWZpbHRlcl9wYW5lbF9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYmxlL3NyYy90YWJsZS1oZWFkZXIuanMKdmFyIHRhYmxlX2hlYWRlcl9leHRlbmRzPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHRhcmdldCl7Zm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIHNvdXJjZT1hcmd1bWVudHNbaV07Zm9yKHZhciBrZXkgaW4gc291cmNlKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkpe3RhcmdldFtrZXldPXNvdXJjZVtrZXldO319fXJldHVybiB0YXJnZXQ7fTt2YXIgZ2V0QWxsQ29sdW1ucz1mdW5jdGlvbiBnZXRBbGxDb2x1bW5zKGNvbHVtbnMpe3ZhciByZXN1bHQ9W107Y29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uKGNvbHVtbil7aWYoY29sdW1uLmNoaWxkcmVuKXtyZXN1bHQucHVzaChjb2x1bW4pO3Jlc3VsdC5wdXNoLmFwcGx5KHJlc3VsdCxnZXRBbGxDb2x1bW5zKGNvbHVtbi5jaGlsZHJlbikpO31lbHNle3Jlc3VsdC5wdXNoKGNvbHVtbik7fX0pO3JldHVybiByZXN1bHQ7fTt2YXIgY29udmVydFRvUm93cz1mdW5jdGlvbiBjb252ZXJ0VG9Sb3dzKG9yaWdpbkNvbHVtbnMpe3ZhciBtYXhMZXZlbD0xO3ZhciB0cmF2ZXJzZT1mdW5jdGlvbiB0cmF2ZXJzZShjb2x1bW4scGFyZW50KXtpZihwYXJlbnQpe2NvbHVtbi5sZXZlbD1wYXJlbnQubGV2ZWwrMTtpZihtYXhMZXZlbDxjb2x1bW4ubGV2ZWwpe21heExldmVsPWNvbHVtbi5sZXZlbDt9fWlmKGNvbHVtbi5jaGlsZHJlbil7dmFyIGNvbFNwYW49MDtjb2x1bW4uY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihzdWJDb2x1bW4pe3RyYXZlcnNlKHN1YkNvbHVtbixjb2x1bW4pO2NvbFNwYW4rPXN1YkNvbHVtbi5jb2xTcGFuO30pO2NvbHVtbi5jb2xTcGFuPWNvbFNwYW47fWVsc2V7Y29sdW1uLmNvbFNwYW49MTt9fTtvcmlnaW5Db2x1bW5zLmZvckVhY2goZnVuY3Rpb24oY29sdW1uKXtjb2x1bW4ubGV2ZWw9MTt0cmF2ZXJzZShjb2x1bW4pO30pO3ZhciByb3dzPVtdO2Zvcih2YXIgaT0wO2k8bWF4TGV2ZWw7aSsrKXtyb3dzLnB1c2goW10pO312YXIgYWxsQ29sdW1ucz1nZXRBbGxDb2x1bW5zKG9yaWdpbkNvbHVtbnMpO2FsbENvbHVtbnMuZm9yRWFjaChmdW5jdGlvbihjb2x1bW4pe2lmKCFjb2x1bW4uY2hpbGRyZW4pe2NvbHVtbi5yb3dTcGFuPW1heExldmVsLWNvbHVtbi5sZXZlbCsxO31lbHNle2NvbHVtbi5yb3dTcGFuPTE7fXJvd3NbY29sdW1uLmxldmVsLTFdLnB1c2goY29sdW1uKTt9KTtyZXR1cm4gcm93czt9Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgdGFibGVfaGVhZGVyPXtuYW1lOidFbFRhYmxlSGVhZGVyJyxtaXhpbnM6W2xheW91dF9vYnNlcnZlcl0scmVuZGVyOmZ1bmN0aW9uIHJlbmRlcihoKXt2YXIgX3RoaXM9dGhpczt2YXIgb3JpZ2luQ29sdW1ucz10aGlzLnN0b3JlLnN0YXRlcy5vcmlnaW5Db2x1bW5zO3ZhciBjb2x1bW5Sb3dzPWNvbnZlcnRUb1Jvd3Mob3JpZ2luQ29sdW1ucyx0aGlzLmNvbHVtbnMpOy8vIOaYr+WQpuaLpeacieWkmue6p+ihqOWktAp2YXIgaXNHcm91cD1jb2x1bW5Sb3dzLmxlbmd0aD4xO2lmKGlzR3JvdXApdGhpcy4kcGFyZW50LmlzR3JvdXA9dHJ1ZTtyZXR1cm4gaCgndGFibGUnLHsnY2xhc3MnOidlbC10YWJsZV9faGVhZGVyJyxhdHRyczp7Y2VsbHNwYWNpbmc6JzAnLGNlbGxwYWRkaW5nOicwJyxib3JkZXI6JzAnfX0sW2goJ2NvbGdyb3VwJyxbdGhpcy5jb2x1bW5zLm1hcChmdW5jdGlvbihjb2x1bW4pe3JldHVybiBoKCdjb2wnLHthdHRyczp7bmFtZTpjb2x1bW4uaWR9LGtleTpjb2x1bW4uaWR9KTt9KSx0aGlzLmhhc0d1dHRlcj9oKCdjb2wnLHthdHRyczp7bmFtZTonZ3V0dGVyJ319KTonJ10pLGgoJ3RoZWFkJyx7J2NsYXNzJzpbeydpcy1ncm91cCc6aXNHcm91cCwnaGFzLWd1dHRlcic6dGhpcy5oYXNHdXR0ZXJ9XX0sW3RoaXMuX2woY29sdW1uUm93cyxmdW5jdGlvbihjb2x1bW5zLHJvd0luZGV4KXtyZXR1cm4gaCgndHInLHtzdHlsZTpfdGhpcy5nZXRIZWFkZXJSb3dTdHlsZShyb3dJbmRleCksJ2NsYXNzJzpfdGhpcy5nZXRIZWFkZXJSb3dDbGFzcyhyb3dJbmRleCl9LFtjb2x1bW5zLm1hcChmdW5jdGlvbihjb2x1bW4sY2VsbEluZGV4KXtyZXR1cm4gaCgndGgnLHthdHRyczp7Y29sc3Bhbjpjb2x1bW4uY29sU3Bhbixyb3dzcGFuOmNvbHVtbi5yb3dTcGFufSxvbjp7J21vdXNlbW92ZSc6ZnVuY3Rpb24gbW91c2Vtb3ZlKCRldmVudCl7cmV0dXJuIF90aGlzLmhhbmRsZU1vdXNlTW92ZSgkZXZlbnQsY29sdW1uKTt9LCdtb3VzZW91dCc6X3RoaXMuaGFuZGxlTW91c2VPdXQsJ21vdXNlZG93bic6ZnVuY3Rpb24gbW91c2Vkb3duKCRldmVudCl7cmV0dXJuIF90aGlzLmhhbmRsZU1vdXNlRG93bigkZXZlbnQsY29sdW1uKTt9LCdjbGljayc6ZnVuY3Rpb24gY2xpY2soJGV2ZW50KXtyZXR1cm4gX3RoaXMuaGFuZGxlSGVhZGVyQ2xpY2soJGV2ZW50LGNvbHVtbik7fSwnY29udGV4dG1lbnUnOmZ1bmN0aW9uIGNvbnRleHRtZW51KCRldmVudCl7cmV0dXJuIF90aGlzLmhhbmRsZUhlYWRlckNvbnRleHRNZW51KCRldmVudCxjb2x1bW4pO319LHN0eWxlOl90aGlzLmdldEhlYWRlckNlbGxTdHlsZShyb3dJbmRleCxjZWxsSW5kZXgsY29sdW1ucyxjb2x1bW4pLCdjbGFzcyc6X3RoaXMuZ2V0SGVhZGVyQ2VsbENsYXNzKHJvd0luZGV4LGNlbGxJbmRleCxjb2x1bW5zLGNvbHVtbiksa2V5OmNvbHVtbi5pZH0sW2goJ2RpdicseydjbGFzcyc6WydjZWxsJyxjb2x1bW4uZmlsdGVyZWRWYWx1ZSYmY29sdW1uLmZpbHRlcmVkVmFsdWUubGVuZ3RoPjA/J2hpZ2hsaWdodCc6JycsY29sdW1uLmxhYmVsQ2xhc3NOYW1lXX0sW2NvbHVtbi5yZW5kZXJIZWFkZXI/Y29sdW1uLnJlbmRlckhlYWRlci5jYWxsKF90aGlzLl9yZW5kZXJQcm94eSxoLHtjb2x1bW46Y29sdW1uLCRpbmRleDpjZWxsSW5kZXgsc3RvcmU6X3RoaXMuc3RvcmUsX3NlbGY6X3RoaXMuJHBhcmVudC4kdm5vZGUuY29udGV4dH0pOmNvbHVtbi5sYWJlbCxjb2x1bW4uc29ydGFibGU/aCgnc3BhbicseydjbGFzcyc6J2NhcmV0LXdyYXBwZXInLG9uOnsnY2xpY2snOmZ1bmN0aW9uIGNsaWNrKCRldmVudCl7cmV0dXJuIF90aGlzLmhhbmRsZVNvcnRDbGljaygkZXZlbnQsY29sdW1uKTt9fX0sW2goJ2knLHsnY2xhc3MnOidzb3J0LWNhcmV0IGFzY2VuZGluZycsb246eydjbGljayc6ZnVuY3Rpb24gY2xpY2soJGV2ZW50KXtyZXR1cm4gX3RoaXMuaGFuZGxlU29ydENsaWNrKCRldmVudCxjb2x1bW4sJ2FzY2VuZGluZycpO319fSksaCgnaScseydjbGFzcyc6J3NvcnQtY2FyZXQgZGVzY2VuZGluZycsb246eydjbGljayc6ZnVuY3Rpb24gY2xpY2soJGV2ZW50KXtyZXR1cm4gX3RoaXMuaGFuZGxlU29ydENsaWNrKCRldmVudCxjb2x1bW4sJ2Rlc2NlbmRpbmcnKTt9fX0pXSk6JycsY29sdW1uLmZpbHRlcmFibGU/aCgnc3BhbicseydjbGFzcyc6J2VsLXRhYmxlX19jb2x1bW4tZmlsdGVyLXRyaWdnZXInLG9uOnsnY2xpY2snOmZ1bmN0aW9uIGNsaWNrKCRldmVudCl7cmV0dXJuIF90aGlzLmhhbmRsZUZpbHRlckNsaWNrKCRldmVudCxjb2x1bW4pO319fSxbaCgnaScseydjbGFzcyc6WydlbC1pY29uLWFycm93LWRvd24nLGNvbHVtbi5maWx0ZXJPcGVuZWQ/J2VsLWljb24tYXJyb3ctdXAnOicnXX0pXSk6JyddKV0pO30pLF90aGlzLmhhc0d1dHRlcj9oKCd0aCcseydjbGFzcyc6J2d1dHRlcid9KTonJ10pO30pXSldKTt9LHByb3BzOntmaXhlZDpTdHJpbmcsc3RvcmU6e3JlcXVpcmVkOnRydWV9LGJvcmRlcjpCb29sZWFuLGRlZmF1bHRTb3J0Ont0eXBlOk9iamVjdCxkZWZhdWx0OmZ1bmN0aW9uIF9kZWZhdWx0KCl7cmV0dXJue3Byb3A6Jycsb3JkZXI6Jyd9O319fSxjb21wb25lbnRzOntFbENoZWNrYm94OmNoZWNrYm94X2RlZmF1bHQuYX0sY29tcHV0ZWQ6dGFibGVfaGVhZGVyX2V4dGVuZHMoe3RhYmxlOmZ1bmN0aW9uIHRhYmxlKCl7cmV0dXJuIHRoaXMuJHBhcmVudDt9LGhhc0d1dHRlcjpmdW5jdGlvbiBoYXNHdXR0ZXIoKXtyZXR1cm4hdGhpcy5maXhlZCYmdGhpcy50YWJsZUxheW91dC5ndXR0ZXJXaWR0aDt9fSxtYXBTdGF0ZXMoe2NvbHVtbnM6J2NvbHVtbnMnLGlzQWxsU2VsZWN0ZWQ6J2lzQWxsU2VsZWN0ZWQnLGxlZnRGaXhlZExlYWZDb3VudDonZml4ZWRMZWFmQ29sdW1uc0xlbmd0aCcscmlnaHRGaXhlZExlYWZDb3VudDoncmlnaHRGaXhlZExlYWZDb2x1bW5zTGVuZ3RoJyxjb2x1bW5zQ291bnQ6ZnVuY3Rpb24gY29sdW1uc0NvdW50KHN0YXRlcyl7cmV0dXJuIHN0YXRlcy5jb2x1bW5zLmxlbmd0aDt9LGxlZnRGaXhlZENvdW50OmZ1bmN0aW9uIGxlZnRGaXhlZENvdW50KHN0YXRlcyl7cmV0dXJuIHN0YXRlcy5maXhlZENvbHVtbnMubGVuZ3RoO30scmlnaHRGaXhlZENvdW50OmZ1bmN0aW9uIHJpZ2h0Rml4ZWRDb3VudChzdGF0ZXMpe3JldHVybiBzdGF0ZXMucmlnaHRGaXhlZENvbHVtbnMubGVuZ3RoO319KSksY3JlYXRlZDpmdW5jdGlvbiBjcmVhdGVkKCl7dGhpcy5maWx0ZXJQYW5lbHM9e307fSxtb3VudGVkOmZ1bmN0aW9uIG1vdW50ZWQoKXt2YXIgX3RoaXMyPXRoaXM7Ly8gbmV4dFRpY2sg5piv5pyJ5b+F6KaB55qEIGh0dHBzOi8vZ2l0aHViLmNvbS9FbGVtZUZFL2VsZW1lbnQvcHVsbC8xMTMxMQp0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe3ZhciBfZGVmYXVsdFNvcnQ9X3RoaXMyLmRlZmF1bHRTb3J0LHByb3A9X2RlZmF1bHRTb3J0LnByb3Asb3JkZXI9X2RlZmF1bHRTb3J0Lm9yZGVyO3ZhciBpbml0PXRydWU7X3RoaXMyLnN0b3JlLmNvbW1pdCgnc29ydCcse3Byb3A6cHJvcCxvcmRlcjpvcmRlcixpbml0OmluaXR9KTt9KTt9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpe3ZhciBwYW5lbHM9dGhpcy5maWx0ZXJQYW5lbHM7Zm9yKHZhciBwcm9wIGluIHBhbmVscyl7aWYocGFuZWxzLmhhc093blByb3BlcnR5KHByb3ApJiZwYW5lbHNbcHJvcF0pe3BhbmVsc1twcm9wXS4kZGVzdHJveSh0cnVlKTt9fX0sbWV0aG9kczp7aXNDZWxsSGlkZGVuOmZ1bmN0aW9uIGlzQ2VsbEhpZGRlbihpbmRleCxjb2x1bW5zKXt2YXIgc3RhcnQ9MDtmb3IodmFyIGk9MDtpPGluZGV4O2krKyl7c3RhcnQrPWNvbHVtbnNbaV0uY29sU3Bhbjt9dmFyIGFmdGVyPXN0YXJ0K2NvbHVtbnNbaW5kZXhdLmNvbFNwYW4tMTtpZih0aGlzLmZpeGVkPT09dHJ1ZXx8dGhpcy5maXhlZD09PSdsZWZ0Jyl7cmV0dXJuIGFmdGVyPj10aGlzLmxlZnRGaXhlZExlYWZDb3VudDt9ZWxzZSBpZih0aGlzLmZpeGVkPT09J3JpZ2h0Jyl7cmV0dXJuIHN0YXJ0PHRoaXMuY29sdW1uc0NvdW50LXRoaXMucmlnaHRGaXhlZExlYWZDb3VudDt9ZWxzZXtyZXR1cm4gYWZ0ZXI8dGhpcy5sZWZ0Rml4ZWRMZWFmQ291bnR8fHN0YXJ0Pj10aGlzLmNvbHVtbnNDb3VudC10aGlzLnJpZ2h0Rml4ZWRMZWFmQ291bnQ7fX0sZ2V0SGVhZGVyUm93U3R5bGU6ZnVuY3Rpb24gZ2V0SGVhZGVyUm93U3R5bGUocm93SW5kZXgpe3ZhciBoZWFkZXJSb3dTdHlsZT10aGlzLnRhYmxlLmhlYWRlclJvd1N0eWxlO2lmKHR5cGVvZiBoZWFkZXJSb3dTdHlsZT09PSdmdW5jdGlvbicpe3JldHVybiBoZWFkZXJSb3dTdHlsZS5jYWxsKG51bGwse3Jvd0luZGV4OnJvd0luZGV4fSk7fXJldHVybiBoZWFkZXJSb3dTdHlsZTt9LGdldEhlYWRlclJvd0NsYXNzOmZ1bmN0aW9uIGdldEhlYWRlclJvd0NsYXNzKHJvd0luZGV4KXt2YXIgY2xhc3Nlcz1bXTt2YXIgaGVhZGVyUm93Q2xhc3NOYW1lPXRoaXMudGFibGUuaGVhZGVyUm93Q2xhc3NOYW1lO2lmKHR5cGVvZiBoZWFkZXJSb3dDbGFzc05hbWU9PT0nc3RyaW5nJyl7Y2xhc3Nlcy5wdXNoKGhlYWRlclJvd0NsYXNzTmFtZSk7fWVsc2UgaWYodHlwZW9mIGhlYWRlclJvd0NsYXNzTmFtZT09PSdmdW5jdGlvbicpe2NsYXNzZXMucHVzaChoZWFkZXJSb3dDbGFzc05hbWUuY2FsbChudWxsLHtyb3dJbmRleDpyb3dJbmRleH0pKTt9cmV0dXJuIGNsYXNzZXMuam9pbignICcpO30sZ2V0SGVhZGVyQ2VsbFN0eWxlOmZ1bmN0aW9uIGdldEhlYWRlckNlbGxTdHlsZShyb3dJbmRleCxjb2x1bW5JbmRleCxyb3csY29sdW1uKXt2YXIgaGVhZGVyQ2VsbFN0eWxlPXRoaXMudGFibGUuaGVhZGVyQ2VsbFN0eWxlO2lmKHR5cGVvZiBoZWFkZXJDZWxsU3R5bGU9PT0nZnVuY3Rpb24nKXtyZXR1cm4gaGVhZGVyQ2VsbFN0eWxlLmNhbGwobnVsbCx7cm93SW5kZXg6cm93SW5kZXgsY29sdW1uSW5kZXg6Y29sdW1uSW5kZXgscm93OnJvdyxjb2x1bW46Y29sdW1ufSk7fXJldHVybiBoZWFkZXJDZWxsU3R5bGU7fSxnZXRIZWFkZXJDZWxsQ2xhc3M6ZnVuY3Rpb24gZ2V0SGVhZGVyQ2VsbENsYXNzKHJvd0luZGV4LGNvbHVtbkluZGV4LHJvdyxjb2x1bW4pe3ZhciBjbGFzc2VzPVtjb2x1bW4uaWQsY29sdW1uLm9yZGVyLGNvbHVtbi5oZWFkZXJBbGlnbixjb2x1bW4uY2xhc3NOYW1lLGNvbHVtbi5sYWJlbENsYXNzTmFtZV07aWYocm93SW5kZXg9PT0wJiZ0aGlzLmlzQ2VsbEhpZGRlbihjb2x1bW5JbmRleCxyb3cpKXtjbGFzc2VzLnB1c2goJ2lzLWhpZGRlbicpO31pZighY29sdW1uLmNoaWxkcmVuKXtjbGFzc2VzLnB1c2goJ2lzLWxlYWYnKTt9aWYoY29sdW1uLnNvcnRhYmxlKXtjbGFzc2VzLnB1c2goJ2lzLXNvcnRhYmxlJyk7fXZhciBoZWFkZXJDZWxsQ2xhc3NOYW1lPXRoaXMudGFibGUuaGVhZGVyQ2VsbENsYXNzTmFtZTtpZih0eXBlb2YgaGVhZGVyQ2VsbENsYXNzTmFtZT09PSdzdHJpbmcnKXtjbGFzc2VzLnB1c2goaGVhZGVyQ2VsbENsYXNzTmFtZSk7fWVsc2UgaWYodHlwZW9mIGhlYWRlckNlbGxDbGFzc05hbWU9PT0nZnVuY3Rpb24nKXtjbGFzc2VzLnB1c2goaGVhZGVyQ2VsbENsYXNzTmFtZS5jYWxsKG51bGwse3Jvd0luZGV4OnJvd0luZGV4LGNvbHVtbkluZGV4OmNvbHVtbkluZGV4LHJvdzpyb3csY29sdW1uOmNvbHVtbn0pKTt9cmV0dXJuIGNsYXNzZXMuam9pbignICcpO30sdG9nZ2xlQWxsU2VsZWN0aW9uOmZ1bmN0aW9uIHRvZ2dsZUFsbFNlbGVjdGlvbihldmVudCl7ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7dGhpcy5zdG9yZS5jb21taXQoJ3RvZ2dsZUFsbFNlbGVjdGlvbicpO30saGFuZGxlRmlsdGVyQ2xpY2s6ZnVuY3Rpb24gaGFuZGxlRmlsdGVyQ2xpY2soZXZlbnQsY29sdW1uKXtldmVudC5zdG9wUHJvcGFnYXRpb24oKTt2YXIgdGFyZ2V0PWV2ZW50LnRhcmdldDt2YXIgY2VsbD10YXJnZXQudGFnTmFtZT09PSdUSCc/dGFyZ2V0OnRhcmdldC5wYXJlbnROb2RlO2lmKE9iamVjdChkb21fWyJoYXNDbGFzcyJdKShjZWxsLCdub2NsaWNrJykpcmV0dXJuO2NlbGw9Y2VsbC5xdWVyeVNlbGVjdG9yKCcuZWwtdGFibGVfX2NvbHVtbi1maWx0ZXItdHJpZ2dlcicpfHxjZWxsO3ZhciB0YWJsZT10aGlzLiRwYXJlbnQ7dmFyIGZpbHRlclBhbmVsPXRoaXMuZmlsdGVyUGFuZWxzW2NvbHVtbi5pZF07aWYoZmlsdGVyUGFuZWwmJmNvbHVtbi5maWx0ZXJPcGVuZWQpe2ZpbHRlclBhbmVsLnNob3dQb3BwZXI9ZmFsc2U7cmV0dXJuO31pZighZmlsdGVyUGFuZWwpe2ZpbHRlclBhbmVsPW5ldyBleHRlcm5hbF92dWVfZGVmYXVsdC5hKGZpbHRlcl9wYW5lbCk7dGhpcy5maWx0ZXJQYW5lbHNbY29sdW1uLmlkXT1maWx0ZXJQYW5lbDtpZihjb2x1bW4uZmlsdGVyUGxhY2VtZW50KXtmaWx0ZXJQYW5lbC5wbGFjZW1lbnQ9Y29sdW1uLmZpbHRlclBsYWNlbWVudDt9ZmlsdGVyUGFuZWwudGFibGU9dGFibGU7ZmlsdGVyUGFuZWwuY2VsbD1jZWxsO2ZpbHRlclBhbmVsLmNvbHVtbj1jb2x1bW47IXRoaXMuJGlzU2VydmVyJiZmaWx0ZXJQYW5lbC4kbW91bnQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpO31zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZmlsdGVyUGFuZWwuc2hvd1BvcHBlcj10cnVlO30sMTYpO30saGFuZGxlSGVhZGVyQ2xpY2s6ZnVuY3Rpb24gaGFuZGxlSGVhZGVyQ2xpY2soZXZlbnQsY29sdW1uKXtpZighY29sdW1uLmZpbHRlcnMmJmNvbHVtbi5zb3J0YWJsZSl7dGhpcy5oYW5kbGVTb3J0Q2xpY2soZXZlbnQsY29sdW1uKTt9ZWxzZSBpZihjb2x1bW4uZmlsdGVyYWJsZSYmIWNvbHVtbi5zb3J0YWJsZSl7dGhpcy5oYW5kbGVGaWx0ZXJDbGljayhldmVudCxjb2x1bW4pO310aGlzLiRwYXJlbnQuJGVtaXQoJ2hlYWRlci1jbGljaycsY29sdW1uLGV2ZW50KTt9LGhhbmRsZUhlYWRlckNvbnRleHRNZW51OmZ1bmN0aW9uIGhhbmRsZUhlYWRlckNvbnRleHRNZW51KGV2ZW50LGNvbHVtbil7dGhpcy4kcGFyZW50LiRlbWl0KCdoZWFkZXItY29udGV4dG1lbnUnLGNvbHVtbixldmVudCk7fSxoYW5kbGVNb3VzZURvd246ZnVuY3Rpb24gaGFuZGxlTW91c2VEb3duKGV2ZW50LGNvbHVtbil7dmFyIF90aGlzMz10aGlzO2lmKHRoaXMuJGlzU2VydmVyKXJldHVybjtpZihjb2x1bW4uY2hpbGRyZW4mJmNvbHVtbi5jaGlsZHJlbi5sZW5ndGg+MClyZXR1cm47LyogaXN0YW5idWwgaWdub3JlIGlmICovaWYodGhpcy5kcmFnZ2luZ0NvbHVtbiYmdGhpcy5ib3JkZXIpe3RoaXMuZHJhZ2dpbmc9dHJ1ZTt0aGlzLiRwYXJlbnQucmVzaXplUHJveHlWaXNpYmxlPXRydWU7dmFyIHRhYmxlPXRoaXMuJHBhcmVudDt2YXIgdGFibGVFbD10YWJsZS4kZWw7dmFyIHRhYmxlTGVmdD10YWJsZUVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7dmFyIGNvbHVtbkVsPXRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJ3RoLicrY29sdW1uLmlkKTt2YXIgY29sdW1uUmVjdD1jb2x1bW5FbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgbWluTGVmdD1jb2x1bW5SZWN0LmxlZnQtdGFibGVMZWZ0KzMwO09iamVjdChkb21fWyJhZGRDbGFzcyJdKShjb2x1bW5FbCwnbm9jbGljaycpO3RoaXMuZHJhZ1N0YXRlPXtzdGFydE1vdXNlTGVmdDpldmVudC5jbGllbnRYLHN0YXJ0TGVmdDpjb2x1bW5SZWN0LnJpZ2h0LXRhYmxlTGVmdCxzdGFydENvbHVtbkxlZnQ6Y29sdW1uUmVjdC5sZWZ0LXRhYmxlTGVmdCx0YWJsZUxlZnQ6dGFibGVMZWZ0fTt2YXIgcmVzaXplUHJveHk9dGFibGUuJHJlZnMucmVzaXplUHJveHk7cmVzaXplUHJveHkuc3R5bGUubGVmdD10aGlzLmRyYWdTdGF0ZS5zdGFydExlZnQrJ3B4Jztkb2N1bWVudC5vbnNlbGVjdHN0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIGZhbHNlO307ZG9jdW1lbnQub25kcmFnc3RhcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gZmFsc2U7fTt2YXIgaGFuZGxlTW91c2VNb3ZlPWZ1bmN0aW9uIGhhbmRsZU1vdXNlTW92ZShldmVudCl7dmFyIGRlbHRhTGVmdD1ldmVudC5jbGllbnRYLV90aGlzMy5kcmFnU3RhdGUuc3RhcnRNb3VzZUxlZnQ7dmFyIHByb3h5TGVmdD1fdGhpczMuZHJhZ1N0YXRlLnN0YXJ0TGVmdCtkZWx0YUxlZnQ7cmVzaXplUHJveHkuc3R5bGUubGVmdD1NYXRoLm1heChtaW5MZWZ0LHByb3h5TGVmdCkrJ3B4Jzt9O3ZhciBoYW5kbGVNb3VzZVVwPWZ1bmN0aW9uIGhhbmRsZU1vdXNlVXAoKXtpZihfdGhpczMuZHJhZ2dpbmcpe3ZhciBfZHJhZ1N0YXRlPV90aGlzMy5kcmFnU3RhdGUsc3RhcnRDb2x1bW5MZWZ0PV9kcmFnU3RhdGUuc3RhcnRDb2x1bW5MZWZ0LHN0YXJ0TGVmdD1fZHJhZ1N0YXRlLnN0YXJ0TGVmdDt2YXIgZmluYWxMZWZ0PXBhcnNlSW50KHJlc2l6ZVByb3h5LnN0eWxlLmxlZnQsMTApO3ZhciBjb2x1bW5XaWR0aD1maW5hbExlZnQtc3RhcnRDb2x1bW5MZWZ0O2NvbHVtbi53aWR0aD1jb2x1bW4ucmVhbFdpZHRoPWNvbHVtbldpZHRoO3RhYmxlLiRlbWl0KCdoZWFkZXItZHJhZ2VuZCcsY29sdW1uLndpZHRoLHN0YXJ0TGVmdC1zdGFydENvbHVtbkxlZnQsY29sdW1uLGV2ZW50KTtfdGhpczMuc3RvcmUuc2NoZWR1bGVMYXlvdXQoKTtkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvcj0nJztfdGhpczMuZHJhZ2dpbmc9ZmFsc2U7X3RoaXMzLmRyYWdnaW5nQ29sdW1uPW51bGw7X3RoaXMzLmRyYWdTdGF0ZT17fTt0YWJsZS5yZXNpemVQcm94eVZpc2libGU9ZmFsc2U7fWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsaGFuZGxlTW91c2VNb3ZlKTtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJyxoYW5kbGVNb3VzZVVwKTtkb2N1bWVudC5vbnNlbGVjdHN0YXJ0PW51bGw7ZG9jdW1lbnQub25kcmFnc3RhcnQ9bnVsbDtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7T2JqZWN0KGRvbV9bInJlbW92ZUNsYXNzIl0pKGNvbHVtbkVsLCdub2NsaWNrJyk7fSwwKTt9O2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsaGFuZGxlTW91c2VNb3ZlKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJyxoYW5kbGVNb3VzZVVwKTt9fSxoYW5kbGVNb3VzZU1vdmU6ZnVuY3Rpb24gaGFuZGxlTW91c2VNb3ZlKGV2ZW50LGNvbHVtbil7aWYoY29sdW1uLmNoaWxkcmVuJiZjb2x1bW4uY2hpbGRyZW4ubGVuZ3RoPjApcmV0dXJuO3ZhciB0YXJnZXQ9ZXZlbnQudGFyZ2V0O3doaWxlKHRhcmdldCYmdGFyZ2V0LnRhZ05hbWUhPT0nVEgnKXt0YXJnZXQ9dGFyZ2V0LnBhcmVudE5vZGU7fWlmKCFjb2x1bW58fCFjb2x1bW4ucmVzaXphYmxlKXJldHVybjtpZighdGhpcy5kcmFnZ2luZyYmdGhpcy5ib3JkZXIpe3ZhciByZWN0PXRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgYm9keVN0eWxlPWRvY3VtZW50LmJvZHkuc3R5bGU7aWYocmVjdC53aWR0aD4xMiYmcmVjdC5yaWdodC1ldmVudC5wYWdlWDw4KXtib2R5U3R5bGUuY3Vyc29yPSdjb2wtcmVzaXplJztpZihPYmplY3QoZG9tX1siaGFzQ2xhc3MiXSkodGFyZ2V0LCdpcy1zb3J0YWJsZScpKXt0YXJnZXQuc3R5bGUuY3Vyc29yPSdjb2wtcmVzaXplJzt9dGhpcy5kcmFnZ2luZ0NvbHVtbj1jb2x1bW47fWVsc2UgaWYoIXRoaXMuZHJhZ2dpbmcpe2JvZHlTdHlsZS5jdXJzb3I9Jyc7aWYoT2JqZWN0KGRvbV9bImhhc0NsYXNzIl0pKHRhcmdldCwnaXMtc29ydGFibGUnKSl7dGFyZ2V0LnN0eWxlLmN1cnNvcj0ncG9pbnRlcic7fXRoaXMuZHJhZ2dpbmdDb2x1bW49bnVsbDt9fX0saGFuZGxlTW91c2VPdXQ6ZnVuY3Rpb24gaGFuZGxlTW91c2VPdXQoKXtpZih0aGlzLiRpc1NlcnZlcilyZXR1cm47ZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3I9Jyc7fSx0b2dnbGVPcmRlcjpmdW5jdGlvbiB0b2dnbGVPcmRlcihfcmVmKXt2YXIgb3JkZXI9X3JlZi5vcmRlcixzb3J0T3JkZXJzPV9yZWYuc29ydE9yZGVycztpZihvcmRlcj09PScnKXJldHVybiBzb3J0T3JkZXJzWzBdO3ZhciBpbmRleD1zb3J0T3JkZXJzLmluZGV4T2Yob3JkZXJ8fG51bGwpO3JldHVybiBzb3J0T3JkZXJzW2luZGV4PnNvcnRPcmRlcnMubGVuZ3RoLTI/MDppbmRleCsxXTt9LGhhbmRsZVNvcnRDbGljazpmdW5jdGlvbiBoYW5kbGVTb3J0Q2xpY2soZXZlbnQsY29sdW1uLGdpdmVuT3JkZXIpe2V2ZW50LnN0b3BQcm9wYWdhdGlvbigpO3ZhciBvcmRlcj1jb2x1bW4ub3JkZXI9PT1naXZlbk9yZGVyP251bGw6Z2l2ZW5PcmRlcnx8dGhpcy50b2dnbGVPcmRlcihjb2x1bW4pO3ZhciB0YXJnZXQ9ZXZlbnQudGFyZ2V0O3doaWxlKHRhcmdldCYmdGFyZ2V0LnRhZ05hbWUhPT0nVEgnKXt0YXJnZXQ9dGFyZ2V0LnBhcmVudE5vZGU7fWlmKHRhcmdldCYmdGFyZ2V0LnRhZ05hbWU9PT0nVEgnKXtpZihPYmplY3QoZG9tX1siaGFzQ2xhc3MiXSkodGFyZ2V0LCdub2NsaWNrJykpe09iamVjdChkb21fWyJyZW1vdmVDbGFzcyJdKSh0YXJnZXQsJ25vY2xpY2snKTtyZXR1cm47fX1pZighY29sdW1uLnNvcnRhYmxlKXJldHVybjt2YXIgc3RhdGVzPXRoaXMuc3RvcmUuc3RhdGVzO3ZhciBzb3J0UHJvcD1zdGF0ZXMuc29ydFByb3A7dmFyIHNvcnRPcmRlcj12b2lkIDA7dmFyIHNvcnRpbmdDb2x1bW49c3RhdGVzLnNvcnRpbmdDb2x1bW47aWYoc29ydGluZ0NvbHVtbiE9PWNvbHVtbnx8c29ydGluZ0NvbHVtbj09PWNvbHVtbiYmc29ydGluZ0NvbHVtbi5vcmRlcj09PW51bGwpe2lmKHNvcnRpbmdDb2x1bW4pe3NvcnRpbmdDb2x1bW4ub3JkZXI9bnVsbDt9c3RhdGVzLnNvcnRpbmdDb2x1bW49Y29sdW1uO3NvcnRQcm9wPWNvbHVtbi5wcm9wZXJ0eTt9aWYoIW9yZGVyKXtzb3J0T3JkZXI9Y29sdW1uLm9yZGVyPW51bGw7fWVsc2V7c29ydE9yZGVyPWNvbHVtbi5vcmRlcj1vcmRlcjt9c3RhdGVzLnNvcnRQcm9wPXNvcnRQcm9wO3N0YXRlcy5zb3J0T3JkZXI9c29ydE9yZGVyO3RoaXMuc3RvcmUuY29tbWl0KCdjaGFuZ2VTb3J0Q29uZGl0aW9uJyk7fX0sZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue2RyYWdnaW5nQ29sdW1uOm51bGwsZHJhZ2dpbmc6ZmFsc2UsZHJhZ1N0YXRlOnt9fTt9fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYmxlL3NyYy90YWJsZS1mb290ZXIuanMKdmFyIHRhYmxlX2Zvb3Rlcl9leHRlbmRzPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHRhcmdldCl7Zm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIHNvdXJjZT1hcmd1bWVudHNbaV07Zm9yKHZhciBrZXkgaW4gc291cmNlKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkpe3RhcmdldFtrZXldPXNvdXJjZVtrZXldO319fXJldHVybiB0YXJnZXQ7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHRhYmxlX2Zvb3Rlcj17bmFtZTonRWxUYWJsZUZvb3RlcicsbWl4aW5zOltsYXlvdXRfb2JzZXJ2ZXJdLHJlbmRlcjpmdW5jdGlvbiByZW5kZXIoaCl7dmFyIF90aGlzPXRoaXM7dmFyIHN1bXM9W107aWYodGhpcy5zdW1tYXJ5TWV0aG9kKXtzdW1zPXRoaXMuc3VtbWFyeU1ldGhvZCh7Y29sdW1uczp0aGlzLmNvbHVtbnMsZGF0YTp0aGlzLnN0b3JlLnN0YXRlcy5kYXRhfSk7fWVsc2V7dGhpcy5jb2x1bW5zLmZvckVhY2goZnVuY3Rpb24oY29sdW1uLGluZGV4KXtpZihpbmRleD09PTApe3N1bXNbaW5kZXhdPV90aGlzLnN1bVRleHQ7cmV0dXJuO312YXIgdmFsdWVzPV90aGlzLnN0b3JlLnN0YXRlcy5kYXRhLm1hcChmdW5jdGlvbihpdGVtKXtyZXR1cm4gTnVtYmVyKGl0ZW1bY29sdW1uLnByb3BlcnR5XSk7fSk7dmFyIHByZWNpc2lvbnM9W107dmFyIG5vdE51bWJlcj10cnVlO3ZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKXtpZighaXNOYU4odmFsdWUpKXtub3ROdW1iZXI9ZmFsc2U7dmFyIGRlY2ltYWw9KCcnK3ZhbHVlKS5zcGxpdCgnLicpWzFdO3ByZWNpc2lvbnMucHVzaChkZWNpbWFsP2RlY2ltYWwubGVuZ3RoOjApO319KTt2YXIgcHJlY2lzaW9uPU1hdGgubWF4LmFwcGx5KG51bGwscHJlY2lzaW9ucyk7aWYoIW5vdE51bWJlcil7c3Vtc1tpbmRleF09dmFsdWVzLnJlZHVjZShmdW5jdGlvbihwcmV2LGN1cnIpe3ZhciB2YWx1ZT1OdW1iZXIoY3Vycik7aWYoIWlzTmFOKHZhbHVlKSl7cmV0dXJuIHBhcnNlRmxvYXQoKHByZXYrY3VycikudG9GaXhlZChNYXRoLm1pbihwcmVjaXNpb24sMjApKSk7fWVsc2V7cmV0dXJuIHByZXY7fX0sMCk7fWVsc2V7c3Vtc1tpbmRleF09Jyc7fX0pO31yZXR1cm4gaCgndGFibGUnLHsnY2xhc3MnOidlbC10YWJsZV9fZm9vdGVyJyxhdHRyczp7Y2VsbHNwYWNpbmc6JzAnLGNlbGxwYWRkaW5nOicwJyxib3JkZXI6JzAnfX0sW2goJ2NvbGdyb3VwJyxbdGhpcy5jb2x1bW5zLm1hcChmdW5jdGlvbihjb2x1bW4pe3JldHVybiBoKCdjb2wnLHthdHRyczp7bmFtZTpjb2x1bW4uaWR9LGtleTpjb2x1bW4uaWR9KTt9KSx0aGlzLmhhc0d1dHRlcj9oKCdjb2wnLHthdHRyczp7bmFtZTonZ3V0dGVyJ319KTonJ10pLGgoJ3Rib2R5Jyx7J2NsYXNzJzpbeydoYXMtZ3V0dGVyJzp0aGlzLmhhc0d1dHRlcn1dfSxbaCgndHInLFt0aGlzLmNvbHVtbnMubWFwKGZ1bmN0aW9uKGNvbHVtbixjZWxsSW5kZXgpe3JldHVybiBoKCd0ZCcse2tleTpjZWxsSW5kZXgsYXR0cnM6e2NvbHNwYW46Y29sdW1uLmNvbFNwYW4scm93c3Bhbjpjb2x1bW4ucm93U3Bhbn0sJ2NsYXNzJzpfdGhpcy5nZXRSb3dDbGFzc2VzKGNvbHVtbixjZWxsSW5kZXgpfSxbaCgnZGl2Jyx7J2NsYXNzJzpbJ2NlbGwnLGNvbHVtbi5sYWJlbENsYXNzTmFtZV19LFtzdW1zW2NlbGxJbmRleF1dKV0pO30pLHRoaXMuaGFzR3V0dGVyP2goJ3RoJyx7J2NsYXNzJzonZ3V0dGVyJ30pOicnXSldKV0pO30scHJvcHM6e2ZpeGVkOlN0cmluZyxzdG9yZTp7cmVxdWlyZWQ6dHJ1ZX0sc3VtbWFyeU1ldGhvZDpGdW5jdGlvbixzdW1UZXh0OlN0cmluZyxib3JkZXI6Qm9vbGVhbixkZWZhdWx0U29ydDp7dHlwZTpPYmplY3QsZGVmYXVsdDpmdW5jdGlvbiBfZGVmYXVsdCgpe3JldHVybntwcm9wOicnLG9yZGVyOicnfTt9fX0sY29tcHV0ZWQ6dGFibGVfZm9vdGVyX2V4dGVuZHMoe3RhYmxlOmZ1bmN0aW9uIHRhYmxlKCl7cmV0dXJuIHRoaXMuJHBhcmVudDt9LGhhc0d1dHRlcjpmdW5jdGlvbiBoYXNHdXR0ZXIoKXtyZXR1cm4hdGhpcy5maXhlZCYmdGhpcy50YWJsZUxheW91dC5ndXR0ZXJXaWR0aDt9fSxtYXBTdGF0ZXMoe2NvbHVtbnM6J2NvbHVtbnMnLGlzQWxsU2VsZWN0ZWQ6J2lzQWxsU2VsZWN0ZWQnLGxlZnRGaXhlZExlYWZDb3VudDonZml4ZWRMZWFmQ29sdW1uc0xlbmd0aCcscmlnaHRGaXhlZExlYWZDb3VudDoncmlnaHRGaXhlZExlYWZDb2x1bW5zTGVuZ3RoJyxjb2x1bW5zQ291bnQ6ZnVuY3Rpb24gY29sdW1uc0NvdW50KHN0YXRlcyl7cmV0dXJuIHN0YXRlcy5jb2x1bW5zLmxlbmd0aDt9LGxlZnRGaXhlZENvdW50OmZ1bmN0aW9uIGxlZnRGaXhlZENvdW50KHN0YXRlcyl7cmV0dXJuIHN0YXRlcy5maXhlZENvbHVtbnMubGVuZ3RoO30scmlnaHRGaXhlZENvdW50OmZ1bmN0aW9uIHJpZ2h0Rml4ZWRDb3VudChzdGF0ZXMpe3JldHVybiBzdGF0ZXMucmlnaHRGaXhlZENvbHVtbnMubGVuZ3RoO319KSksbWV0aG9kczp7aXNDZWxsSGlkZGVuOmZ1bmN0aW9uIGlzQ2VsbEhpZGRlbihpbmRleCxjb2x1bW5zLGNvbHVtbil7aWYodGhpcy5maXhlZD09PXRydWV8fHRoaXMuZml4ZWQ9PT0nbGVmdCcpe3JldHVybiBpbmRleD49dGhpcy5sZWZ0Rml4ZWRMZWFmQ291bnQ7fWVsc2UgaWYodGhpcy5maXhlZD09PSdyaWdodCcpe3ZhciBiZWZvcmU9MDtmb3IodmFyIGk9MDtpPGluZGV4O2krKyl7YmVmb3JlKz1jb2x1bW5zW2ldLmNvbFNwYW47fXJldHVybiBiZWZvcmU8dGhpcy5jb2x1bW5zQ291bnQtdGhpcy5yaWdodEZpeGVkTGVhZkNvdW50O31lbHNlIGlmKCF0aGlzLmZpeGVkJiZjb2x1bW4uZml4ZWQpey8vIGhpZGUgY2VsbCB3aGVuIGZvb3RlciBpbnN0YW5jZSBpcyBub3QgZml4ZWQgYW5kIGNvbHVtbiBpcyBmaXhlZApyZXR1cm4gdHJ1ZTt9ZWxzZXtyZXR1cm4gaW5kZXg8dGhpcy5sZWZ0Rml4ZWRDb3VudHx8aW5kZXg+PXRoaXMuY29sdW1uc0NvdW50LXRoaXMucmlnaHRGaXhlZENvdW50O319LGdldFJvd0NsYXNzZXM6ZnVuY3Rpb24gZ2V0Um93Q2xhc3Nlcyhjb2x1bW4sY2VsbEluZGV4KXt2YXIgY2xhc3Nlcz1bY29sdW1uLmlkLGNvbHVtbi5hbGlnbixjb2x1bW4ubGFiZWxDbGFzc05hbWVdO2lmKGNvbHVtbi5jbGFzc05hbWUpe2NsYXNzZXMucHVzaChjb2x1bW4uY2xhc3NOYW1lKTt9aWYodGhpcy5pc0NlbGxIaWRkZW4oY2VsbEluZGV4LHRoaXMuY29sdW1ucyxjb2x1bW4pKXtjbGFzc2VzLnB1c2goJ2lzLWhpZGRlbicpO31pZighY29sdW1uLmNoaWxkcmVuKXtjbGFzc2VzLnB1c2goJ2lzLWxlYWYnKTt9cmV0dXJuIGNsYXNzZXM7fX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3RhYmxlL3NyYy90YWJsZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCnZhciB0YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2V4dGVuZHM9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odGFyZ2V0KXtmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXt2YXIgc291cmNlPWFyZ3VtZW50c1tpXTtmb3IodmFyIGtleSBpbiBzb3VyY2Upe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2Usa2V5KSl7dGFyZ2V0W2tleV09c291cmNlW2tleV07fX19cmV0dXJuIHRhcmdldDt9Oy8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCnZhciB0YWJsZUlkU2VlZD0xOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e25hbWU6J0VsVGFibGUnLG1peGluczpbbG9jYWxlX2RlZmF1bHQuYSxtaWdyYXRpbmdfZGVmYXVsdC5hXSxkaXJlY3RpdmVzOntNb3VzZXdoZWVsOmRpcmVjdGl2ZXNfbW91c2V3aGVlbH0scHJvcHM6e2RhdGE6e3R5cGU6QXJyYXksZGVmYXVsdDpmdW5jdGlvbiBfZGVmYXVsdCgpe3JldHVybltdO319LHNpemU6U3RyaW5nLHdpZHRoOltTdHJpbmcsTnVtYmVyXSxoZWlnaHQ6W1N0cmluZyxOdW1iZXJdLG1heEhlaWdodDpbU3RyaW5nLE51bWJlcl0sZml0Ont0eXBlOkJvb2xlYW4sZGVmYXVsdDp0cnVlfSxzdHJpcGU6Qm9vbGVhbixib3JkZXI6Qm9vbGVhbixyb3dLZXk6W1N0cmluZyxGdW5jdGlvbl0sY29udGV4dDp7fSxzaG93SGVhZGVyOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDp0cnVlfSxzaG93U3VtbWFyeTpCb29sZWFuLHN1bVRleHQ6U3RyaW5nLHN1bW1hcnlNZXRob2Q6RnVuY3Rpb24scm93Q2xhc3NOYW1lOltTdHJpbmcsRnVuY3Rpb25dLHJvd1N0eWxlOltPYmplY3QsRnVuY3Rpb25dLGNlbGxDbGFzc05hbWU6W1N0cmluZyxGdW5jdGlvbl0sY2VsbFN0eWxlOltPYmplY3QsRnVuY3Rpb25dLGhlYWRlclJvd0NsYXNzTmFtZTpbU3RyaW5nLEZ1bmN0aW9uXSxoZWFkZXJSb3dTdHlsZTpbT2JqZWN0LEZ1bmN0aW9uXSxoZWFkZXJDZWxsQ2xhc3NOYW1lOltTdHJpbmcsRnVuY3Rpb25dLGhlYWRlckNlbGxTdHlsZTpbT2JqZWN0LEZ1bmN0aW9uXSxoaWdobGlnaHRDdXJyZW50Um93OkJvb2xlYW4sY3VycmVudFJvd0tleTpbU3RyaW5nLE51bWJlcl0sZW1wdHlUZXh0OlN0cmluZyxleHBhbmRSb3dLZXlzOkFycmF5LGRlZmF1bHRFeHBhbmRBbGw6Qm9vbGVhbixkZWZhdWx0U29ydDpPYmplY3QsdG9vbHRpcEVmZmVjdDpTdHJpbmcsc3Bhbk1ldGhvZDpGdW5jdGlvbixzZWxlY3RPbkluZGV0ZXJtaW5hdGU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OnRydWV9LGluZGVudDp7dHlwZTpOdW1iZXIsZGVmYXVsdDoxNn0sdHJlZVByb3BzOnt0eXBlOk9iamVjdCxkZWZhdWx0OmZ1bmN0aW9uIF9kZWZhdWx0KCl7cmV0dXJue2hhc0NoaWxkcmVuOidoYXNDaGlsZHJlbicsY2hpbGRyZW46J2NoaWxkcmVuJ307fX0sbGF6eTpCb29sZWFuLGxvYWQ6RnVuY3Rpb259LGNvbXBvbmVudHM6e1RhYmxlSGVhZGVyOnRhYmxlX2hlYWRlcixUYWJsZUZvb3Rlcjp0YWJsZV9mb290ZXIsVGFibGVCb2R5OnRhYmxlX2JvZHksRWxDaGVja2JveDpjaGVja2JveF9kZWZhdWx0LmF9LG1ldGhvZHM6e2dldE1pZ3JhdGluZ0NvbmZpZzpmdW5jdGlvbiBnZXRNaWdyYXRpbmdDb25maWcoKXtyZXR1cm57ZXZlbnRzOntleHBhbmQ6J2V4cGFuZCBpcyByZW5hbWVkIHRvIGV4cGFuZC1jaGFuZ2UnfX07fSxzZXRDdXJyZW50Um93OmZ1bmN0aW9uIHNldEN1cnJlbnRSb3cocm93KXt0aGlzLnN0b3JlLmNvbW1pdCgnc2V0Q3VycmVudFJvdycscm93KTt9LHRvZ2dsZVJvd1NlbGVjdGlvbjpmdW5jdGlvbiB0b2dnbGVSb3dTZWxlY3Rpb24ocm93LHNlbGVjdGVkKXt0aGlzLnN0b3JlLnRvZ2dsZVJvd1NlbGVjdGlvbihyb3csc2VsZWN0ZWQsZmFsc2UpO3RoaXMuc3RvcmUudXBkYXRlQWxsU2VsZWN0ZWQoKTt9LHRvZ2dsZVJvd0V4cGFuc2lvbjpmdW5jdGlvbiB0b2dnbGVSb3dFeHBhbnNpb24ocm93LGV4cGFuZGVkKXt0aGlzLnN0b3JlLnRvZ2dsZVJvd0V4cGFuc2lvbkFkYXB0ZXIocm93LGV4cGFuZGVkKTt9LGNsZWFyU2VsZWN0aW9uOmZ1bmN0aW9uIGNsZWFyU2VsZWN0aW9uKCl7dGhpcy5zdG9yZS5jbGVhclNlbGVjdGlvbigpO30sY2xlYXJGaWx0ZXI6ZnVuY3Rpb24gY2xlYXJGaWx0ZXIoY29sdW1uS2V5cyl7dGhpcy5zdG9yZS5jbGVhckZpbHRlcihjb2x1bW5LZXlzKTt9LGNsZWFyU29ydDpmdW5jdGlvbiBjbGVhclNvcnQoKXt0aGlzLnN0b3JlLmNsZWFyU29ydCgpO30saGFuZGxlTW91c2VMZWF2ZTpmdW5jdGlvbiBoYW5kbGVNb3VzZUxlYXZlKCl7dGhpcy5zdG9yZS5jb21taXQoJ3NldEhvdmVyUm93JyxudWxsKTtpZih0aGlzLmhvdmVyU3RhdGUpdGhpcy5ob3ZlclN0YXRlPW51bGw7fSx1cGRhdGVTY3JvbGxZOmZ1bmN0aW9uIHVwZGF0ZVNjcm9sbFkoKXt2YXIgY2hhbmdlZD10aGlzLmxheW91dC51cGRhdGVTY3JvbGxZKCk7aWYoY2hhbmdlZCl7dGhpcy5sYXlvdXQubm90aWZ5T2JzZXJ2ZXJzKCdzY3JvbGxhYmxlJyk7dGhpcy5sYXlvdXQudXBkYXRlQ29sdW1uc1dpZHRoKCk7fX0saGFuZGxlRml4ZWRNb3VzZXdoZWVsOmZ1bmN0aW9uIGhhbmRsZUZpeGVkTW91c2V3aGVlbChldmVudCxkYXRhKXt2YXIgYm9keVdyYXBwZXI9dGhpcy5ib2R5V3JhcHBlcjtpZihNYXRoLmFicyhkYXRhLnNwaW5ZKT4wKXt2YXIgY3VycmVudFNjcm9sbFRvcD1ib2R5V3JhcHBlci5zY3JvbGxUb3A7aWYoZGF0YS5waXhlbFk8MCYmY3VycmVudFNjcm9sbFRvcCE9PTApe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7fWlmKGRhdGEucGl4ZWxZPjAmJmJvZHlXcmFwcGVyLnNjcm9sbEhlaWdodC1ib2R5V3JhcHBlci5jbGllbnRIZWlnaHQ+Y3VycmVudFNjcm9sbFRvcCl7ZXZlbnQucHJldmVudERlZmF1bHQoKTt9Ym9keVdyYXBwZXIuc2Nyb2xsVG9wKz1NYXRoLmNlaWwoZGF0YS5waXhlbFkvNSk7fWVsc2V7Ym9keVdyYXBwZXIuc2Nyb2xsTGVmdCs9TWF0aC5jZWlsKGRhdGEucGl4ZWxYLzUpO319LGhhbmRsZUhlYWRlckZvb3Rlck1vdXNld2hlZWw6ZnVuY3Rpb24gaGFuZGxlSGVhZGVyRm9vdGVyTW91c2V3aGVlbChldmVudCxkYXRhKXt2YXIgcGl4ZWxYPWRhdGEucGl4ZWxYLHBpeGVsWT1kYXRhLnBpeGVsWTtpZihNYXRoLmFicyhwaXhlbFgpPj1NYXRoLmFicyhwaXhlbFkpKXt0aGlzLmJvZHlXcmFwcGVyLnNjcm9sbExlZnQrPWRhdGEucGl4ZWxYLzU7fX0sLy8gVE9ETyDkvb/nlKggQ1NTIHRyYW5zZm9ybQpzeW5jUG9zdGlvbjpPYmplY3QoZXh0ZXJuYWxfdGhyb3R0bGVfZGVib3VuY2VfWyJ0aHJvdHRsZSJdKSgyMCxmdW5jdGlvbigpe3ZhciBfYm9keVdyYXBwZXI9dGhpcy5ib2R5V3JhcHBlcixzY3JvbGxMZWZ0PV9ib2R5V3JhcHBlci5zY3JvbGxMZWZ0LHNjcm9sbFRvcD1fYm9keVdyYXBwZXIuc2Nyb2xsVG9wLG9mZnNldFdpZHRoPV9ib2R5V3JhcHBlci5vZmZzZXRXaWR0aCxzY3JvbGxXaWR0aD1fYm9keVdyYXBwZXIuc2Nyb2xsV2lkdGg7dmFyIF8kcmVmcz10aGlzLiRyZWZzLGhlYWRlcldyYXBwZXI9XyRyZWZzLmhlYWRlcldyYXBwZXIsZm9vdGVyV3JhcHBlcj1fJHJlZnMuZm9vdGVyV3JhcHBlcixmaXhlZEJvZHlXcmFwcGVyPV8kcmVmcy5maXhlZEJvZHlXcmFwcGVyLHJpZ2h0Rml4ZWRCb2R5V3JhcHBlcj1fJHJlZnMucmlnaHRGaXhlZEJvZHlXcmFwcGVyO2lmKGhlYWRlcldyYXBwZXIpaGVhZGVyV3JhcHBlci5zY3JvbGxMZWZ0PXNjcm9sbExlZnQ7aWYoZm9vdGVyV3JhcHBlcilmb290ZXJXcmFwcGVyLnNjcm9sbExlZnQ9c2Nyb2xsTGVmdDtpZihmaXhlZEJvZHlXcmFwcGVyKWZpeGVkQm9keVdyYXBwZXIuc2Nyb2xsVG9wPXNjcm9sbFRvcDtpZihyaWdodEZpeGVkQm9keVdyYXBwZXIpcmlnaHRGaXhlZEJvZHlXcmFwcGVyLnNjcm9sbFRvcD1zY3JvbGxUb3A7dmFyIG1heFNjcm9sbExlZnRQb3NpdGlvbj1zY3JvbGxXaWR0aC1vZmZzZXRXaWR0aC0xO2lmKHNjcm9sbExlZnQ+PW1heFNjcm9sbExlZnRQb3NpdGlvbil7dGhpcy5zY3JvbGxQb3NpdGlvbj0ncmlnaHQnO31lbHNlIGlmKHNjcm9sbExlZnQ9PT0wKXt0aGlzLnNjcm9sbFBvc2l0aW9uPSdsZWZ0Jzt9ZWxzZXt0aGlzLnNjcm9sbFBvc2l0aW9uPSdtaWRkbGUnO319KSxiaW5kRXZlbnRzOmZ1bmN0aW9uIGJpbmRFdmVudHMoKXt0aGlzLmJvZHlXcmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsdGhpcy5zeW5jUG9zdGlvbix7cGFzc2l2ZTp0cnVlfSk7aWYodGhpcy5maXQpe09iamVjdChyZXNpemVfZXZlbnRfWyJhZGRSZXNpemVMaXN0ZW5lciJdKSh0aGlzLiRlbCx0aGlzLnJlc2l6ZUxpc3RlbmVyKTt9fSx1bmJpbmRFdmVudHM6ZnVuY3Rpb24gdW5iaW5kRXZlbnRzKCl7dGhpcy5ib2R5V3JhcHBlci5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLHRoaXMuc3luY1Bvc3Rpb24se3Bhc3NpdmU6dHJ1ZX0pO2lmKHRoaXMuZml0KXtPYmplY3QocmVzaXplX2V2ZW50X1sicmVtb3ZlUmVzaXplTGlzdGVuZXIiXSkodGhpcy4kZWwsdGhpcy5yZXNpemVMaXN0ZW5lcik7fX0scmVzaXplTGlzdGVuZXI6ZnVuY3Rpb24gcmVzaXplTGlzdGVuZXIoKXtpZighdGhpcy4kcmVhZHkpcmV0dXJuO3ZhciBzaG91bGRVcGRhdGVMYXlvdXQ9ZmFsc2U7dmFyIGVsPXRoaXMuJGVsO3ZhciBfcmVzaXplU3RhdGU9dGhpcy5yZXNpemVTdGF0ZSxvbGRXaWR0aD1fcmVzaXplU3RhdGUud2lkdGgsb2xkSGVpZ2h0PV9yZXNpemVTdGF0ZS5oZWlnaHQ7dmFyIHdpZHRoPWVsLm9mZnNldFdpZHRoO2lmKG9sZFdpZHRoIT09d2lkdGgpe3Nob3VsZFVwZGF0ZUxheW91dD10cnVlO312YXIgaGVpZ2h0PWVsLm9mZnNldEhlaWdodDtpZigodGhpcy5oZWlnaHR8fHRoaXMuc2hvdWxkVXBkYXRlSGVpZ2h0KSYmb2xkSGVpZ2h0IT09aGVpZ2h0KXtzaG91bGRVcGRhdGVMYXlvdXQ9dHJ1ZTt9aWYoc2hvdWxkVXBkYXRlTGF5b3V0KXt0aGlzLnJlc2l6ZVN0YXRlLndpZHRoPXdpZHRoO3RoaXMucmVzaXplU3RhdGUuaGVpZ2h0PWhlaWdodDt0aGlzLmRvTGF5b3V0KCk7fX0sZG9MYXlvdXQ6ZnVuY3Rpb24gZG9MYXlvdXQoKXtpZih0aGlzLnNob3VsZFVwZGF0ZUhlaWdodCl7dGhpcy5sYXlvdXQudXBkYXRlRWxzSGVpZ2h0KCk7fXRoaXMubGF5b3V0LnVwZGF0ZUNvbHVtbnNXaWR0aCgpO30sc29ydDpmdW5jdGlvbiBzb3J0KHByb3Asb3JkZXIpe3RoaXMuc3RvcmUuY29tbWl0KCdzb3J0Jyx7cHJvcDpwcm9wLG9yZGVyOm9yZGVyfSk7fSx0b2dnbGVBbGxTZWxlY3Rpb246ZnVuY3Rpb24gdG9nZ2xlQWxsU2VsZWN0aW9uKCl7dGhpcy5zdG9yZS5jb21taXQoJ3RvZ2dsZUFsbFNlbGVjdGlvbicpO319LGNvbXB1dGVkOnRhYmxldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfZXh0ZW5kcyh7dGFibGVTaXplOmZ1bmN0aW9uIHRhYmxlU2l6ZSgpe3JldHVybiB0aGlzLnNpemV8fCh0aGlzLiRFTEVNRU5UfHx7fSkuc2l6ZTt9LGJvZHlXcmFwcGVyOmZ1bmN0aW9uIGJvZHlXcmFwcGVyKCl7cmV0dXJuIHRoaXMuJHJlZnMuYm9keVdyYXBwZXI7fSxzaG91bGRVcGRhdGVIZWlnaHQ6ZnVuY3Rpb24gc2hvdWxkVXBkYXRlSGVpZ2h0KCl7cmV0dXJuIHRoaXMuaGVpZ2h0fHx0aGlzLm1heEhlaWdodHx8dGhpcy5maXhlZENvbHVtbnMubGVuZ3RoPjB8fHRoaXMucmlnaHRGaXhlZENvbHVtbnMubGVuZ3RoPjA7fSxib2R5V2lkdGg6ZnVuY3Rpb24gYm9keVdpZHRoKCl7dmFyIF9sYXlvdXQ9dGhpcy5sYXlvdXQsYm9keVdpZHRoPV9sYXlvdXQuYm9keVdpZHRoLHNjcm9sbFk9X2xheW91dC5zY3JvbGxZLGd1dHRlcldpZHRoPV9sYXlvdXQuZ3V0dGVyV2lkdGg7cmV0dXJuIGJvZHlXaWR0aD9ib2R5V2lkdGgtKHNjcm9sbFk/Z3V0dGVyV2lkdGg6MCkrJ3B4JzonJzt9LGJvZHlIZWlnaHQ6ZnVuY3Rpb24gYm9keUhlaWdodCgpe3ZhciBfbGF5b3V0Mj10aGlzLmxheW91dCxfbGF5b3V0MiRoZWFkZXJIZWlnaHQ9X2xheW91dDIuaGVhZGVySGVpZ2h0LGhlYWRlckhlaWdodD1fbGF5b3V0MiRoZWFkZXJIZWlnaHQ9PT11bmRlZmluZWQ/MDpfbGF5b3V0MiRoZWFkZXJIZWlnaHQsYm9keUhlaWdodD1fbGF5b3V0Mi5ib2R5SGVpZ2h0LF9sYXlvdXQyJGZvb3RlckhlaWdodD1fbGF5b3V0Mi5mb290ZXJIZWlnaHQsZm9vdGVySGVpZ2h0PV9sYXlvdXQyJGZvb3RlckhlaWdodD09PXVuZGVmaW5lZD8wOl9sYXlvdXQyJGZvb3RlckhlaWdodDtpZih0aGlzLmhlaWdodCl7cmV0dXJue2hlaWdodDpib2R5SGVpZ2h0P2JvZHlIZWlnaHQrJ3B4JzonJ307fWVsc2UgaWYodGhpcy5tYXhIZWlnaHQpe3ZhciBtYXhIZWlnaHQ9cGFyc2VIZWlnaHQodGhpcy5tYXhIZWlnaHQpO2lmKHR5cGVvZiBtYXhIZWlnaHQ9PT0nbnVtYmVyJyl7cmV0dXJueydtYXgtaGVpZ2h0JzptYXhIZWlnaHQtZm9vdGVySGVpZ2h0LSh0aGlzLnNob3dIZWFkZXI/aGVhZGVySGVpZ2h0OjApKydweCd9O319cmV0dXJue307fSxmaXhlZEJvZHlIZWlnaHQ6ZnVuY3Rpb24gZml4ZWRCb2R5SGVpZ2h0KCl7aWYodGhpcy5oZWlnaHQpe3JldHVybntoZWlnaHQ6dGhpcy5sYXlvdXQuZml4ZWRCb2R5SGVpZ2h0P3RoaXMubGF5b3V0LmZpeGVkQm9keUhlaWdodCsncHgnOicnfTt9ZWxzZSBpZih0aGlzLm1heEhlaWdodCl7dmFyIG1heEhlaWdodD1wYXJzZUhlaWdodCh0aGlzLm1heEhlaWdodCk7aWYodHlwZW9mIG1heEhlaWdodD09PSdudW1iZXInKXttYXhIZWlnaHQ9dGhpcy5sYXlvdXQuc2Nyb2xsWD9tYXhIZWlnaHQtdGhpcy5sYXlvdXQuZ3V0dGVyV2lkdGg6bWF4SGVpZ2h0O2lmKHRoaXMuc2hvd0hlYWRlcil7bWF4SGVpZ2h0LT10aGlzLmxheW91dC5oZWFkZXJIZWlnaHQ7fW1heEhlaWdodC09dGhpcy5sYXlvdXQuZm9vdGVySGVpZ2h0O3JldHVybnsnbWF4LWhlaWdodCc6bWF4SGVpZ2h0KydweCd9O319cmV0dXJue307fSxmaXhlZEhlaWdodDpmdW5jdGlvbiBmaXhlZEhlaWdodCgpe2lmKHRoaXMubWF4SGVpZ2h0KXtpZih0aGlzLnNob3dTdW1tYXJ5KXtyZXR1cm57Ym90dG9tOjB9O31yZXR1cm57Ym90dG9tOnRoaXMubGF5b3V0LnNjcm9sbFgmJnRoaXMuZGF0YS5sZW5ndGg/dGhpcy5sYXlvdXQuZ3V0dGVyV2lkdGgrJ3B4JzonJ307fWVsc2V7aWYodGhpcy5zaG93U3VtbWFyeSl7cmV0dXJue2hlaWdodDp0aGlzLmxheW91dC50YWJsZUhlaWdodD90aGlzLmxheW91dC50YWJsZUhlaWdodCsncHgnOicnfTt9cmV0dXJue2hlaWdodDp0aGlzLmxheW91dC52aWV3cG9ydEhlaWdodD90aGlzLmxheW91dC52aWV3cG9ydEhlaWdodCsncHgnOicnfTt9fSxlbXB0eUJsb2NrU3R5bGU6ZnVuY3Rpb24gZW1wdHlCbG9ja1N0eWxlKCl7aWYodGhpcy5kYXRhJiZ0aGlzLmRhdGEubGVuZ3RoKXJldHVybiBudWxsO3ZhciBoZWlnaHQ9JzEwMCUnO2lmKHRoaXMubGF5b3V0LmFwcGVuZEhlaWdodCl7aGVpZ2h0PSdjYWxjKDEwMCUgLSAnK3RoaXMubGF5b3V0LmFwcGVuZEhlaWdodCsncHgpJzt9cmV0dXJue3dpZHRoOnRoaXMuYm9keVdpZHRoLGhlaWdodDpoZWlnaHR9O319LG1hcFN0YXRlcyh7c2VsZWN0aW9uOidzZWxlY3Rpb24nLGNvbHVtbnM6J2NvbHVtbnMnLHRhYmxlRGF0YTonZGF0YScsZml4ZWRDb2x1bW5zOidmaXhlZENvbHVtbnMnLHJpZ2h0Rml4ZWRDb2x1bW5zOidyaWdodEZpeGVkQ29sdW1ucyd9KSksd2F0Y2g6e2hlaWdodDp7aW1tZWRpYXRlOnRydWUsaGFuZGxlcjpmdW5jdGlvbiBoYW5kbGVyKHZhbHVlKXt0aGlzLmxheW91dC5zZXRIZWlnaHQodmFsdWUpO319LG1heEhlaWdodDp7aW1tZWRpYXRlOnRydWUsaGFuZGxlcjpmdW5jdGlvbiBoYW5kbGVyKHZhbHVlKXt0aGlzLmxheW91dC5zZXRNYXhIZWlnaHQodmFsdWUpO319LGN1cnJlbnRSb3dLZXk6e2ltbWVkaWF0ZTp0cnVlLGhhbmRsZXI6ZnVuY3Rpb24gaGFuZGxlcih2YWx1ZSl7aWYoIXRoaXMucm93S2V5KXJldHVybjt0aGlzLnN0b3JlLnNldEN1cnJlbnRSb3dLZXkodmFsdWUpO319LGRhdGE6e2ltbWVkaWF0ZTp0cnVlLGhhbmRsZXI6ZnVuY3Rpb24gaGFuZGxlcih2YWx1ZSl7dGhpcy5zdG9yZS5jb21taXQoJ3NldERhdGEnLHZhbHVlKTt9fSxleHBhbmRSb3dLZXlzOntpbW1lZGlhdGU6dHJ1ZSxoYW5kbGVyOmZ1bmN0aW9uIGhhbmRsZXIobmV3VmFsKXtpZihuZXdWYWwpe3RoaXMuc3RvcmUuc2V0RXhwYW5kUm93S2V5c0FkYXB0ZXIobmV3VmFsKTt9fX19LGNyZWF0ZWQ6ZnVuY3Rpb24gY3JlYXRlZCgpe3ZhciBfdGhpcz10aGlzO3RoaXMudGFibGVJZD0nZWwtdGFibGVfJyt0YWJsZUlkU2VlZCsrO3RoaXMuZGVib3VuY2VkVXBkYXRlTGF5b3V0PU9iamVjdChleHRlcm5hbF90aHJvdHRsZV9kZWJvdW5jZV9bImRlYm91bmNlIl0pKDUwLGZ1bmN0aW9uKCl7cmV0dXJuIF90aGlzLmRvTGF5b3V0KCk7fSk7fSxtb3VudGVkOmZ1bmN0aW9uIG1vdW50ZWQoKXt2YXIgX3RoaXMyPXRoaXM7dGhpcy5iaW5kRXZlbnRzKCk7dGhpcy5zdG9yZS51cGRhdGVDb2x1bW5zKCk7dGhpcy5kb0xheW91dCgpO3RoaXMucmVzaXplU3RhdGU9e3dpZHRoOnRoaXMuJGVsLm9mZnNldFdpZHRoLGhlaWdodDp0aGlzLiRlbC5vZmZzZXRIZWlnaHR9Oy8vIGluaXQgZmlsdGVycwp0aGlzLnN0b3JlLnN0YXRlcy5jb2x1bW5zLmZvckVhY2goZnVuY3Rpb24oY29sdW1uKXtpZihjb2x1bW4uZmlsdGVyZWRWYWx1ZSYmY29sdW1uLmZpbHRlcmVkVmFsdWUubGVuZ3RoKXtfdGhpczIuc3RvcmUuY29tbWl0KCdmaWx0ZXJDaGFuZ2UnLHtjb2x1bW46Y29sdW1uLHZhbHVlczpjb2x1bW4uZmlsdGVyZWRWYWx1ZSxzaWxlbnQ6dHJ1ZX0pO319KTt0aGlzLiRyZWFkeT10cnVlO30sZGVzdHJveWVkOmZ1bmN0aW9uIGRlc3Ryb3llZCgpe3RoaXMudW5iaW5kRXZlbnRzKCk7fSxkYXRhOmZ1bmN0aW9uIGRhdGEoKXt2YXIgX3RyZWVQcm9wcz10aGlzLnRyZWVQcm9wcyxfdHJlZVByb3BzJGhhc0NoaWxkcmU9X3RyZWVQcm9wcy5oYXNDaGlsZHJlbixoYXNDaGlsZHJlbj1fdHJlZVByb3BzJGhhc0NoaWxkcmU9PT11bmRlZmluZWQ/J2hhc0NoaWxkcmVuJzpfdHJlZVByb3BzJGhhc0NoaWxkcmUsX3RyZWVQcm9wcyRjaGlsZHJlbj1fdHJlZVByb3BzLmNoaWxkcmVuLGNoaWxkcmVuPV90cmVlUHJvcHMkY2hpbGRyZW49PT11bmRlZmluZWQ/J2NoaWxkcmVuJzpfdHJlZVByb3BzJGNoaWxkcmVuO3RoaXMuc3RvcmU9Y3JlYXRlU3RvcmUodGhpcyx7cm93S2V5OnRoaXMucm93S2V5LGRlZmF1bHRFeHBhbmRBbGw6dGhpcy5kZWZhdWx0RXhwYW5kQWxsLHNlbGVjdE9uSW5kZXRlcm1pbmF0ZTp0aGlzLnNlbGVjdE9uSW5kZXRlcm1pbmF0ZSwvLyBUcmVlVGFibGUg55qE55u45YWz6YWN572uCmluZGVudDp0aGlzLmluZGVudCxsYXp5OnRoaXMubGF6eSxsYXp5Q29sdW1uSWRlbnRpZmllcjpoYXNDaGlsZHJlbixjaGlsZHJlbkNvbHVtbk5hbWU6Y2hpbGRyZW59KTt2YXIgbGF5b3V0PW5ldyB0YWJsZV9sYXlvdXQoe3N0b3JlOnRoaXMuc3RvcmUsdGFibGU6dGhpcyxmaXQ6dGhpcy5maXQsc2hvd0hlYWRlcjp0aGlzLnNob3dIZWFkZXJ9KTtyZXR1cm57bGF5b3V0OmxheW91dCxpc0hpZGRlbjpmYWxzZSxyZW5kZXJFeHBhbmRlZDpudWxsLHJlc2l6ZVByb3h5VmlzaWJsZTpmYWxzZSxyZXNpemVTdGF0ZTp7d2lkdGg6bnVsbCxoZWlnaHQ6bnVsbH0sLy8g5piv5ZCm5oul5pyJ5aSa57qn6KGo5aS0CmlzR3JvdXA6ZmFsc2Usc2Nyb2xsUG9zaXRpb246J2xlZnQnfTt9fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYmxlL3NyYy90YWJsZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc3JjX3RhYmxldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXRhYmxldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGFibGUvc3JjL3RhYmxlLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIHRhYmxlX2NvbXBvbmVudD1ub3JtYWxpemVDb21wb25lbnQoc3JjX3RhYmxldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLHRhYmxldnVlX3R5cGVfdGVtcGxhdGVfaWRfNDkzZmUzNGVfcmVuZGVyLHRhYmxldnVlX3R5cGVfdGVtcGxhdGVfaWRfNDkzZmUzNGVfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciB0YWJsZV9hcGk7fXRhYmxlX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvdGFibGUvc3JjL3RhYmxlLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfdGFibGU9dGFibGVfY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90YWJsZS9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL3NyY190YWJsZS5pbnN0YWxsPWZ1bmN0aW9uKFZ1ZSl7VnVlLmNvbXBvbmVudChzcmNfdGFibGUubmFtZSxzcmNfdGFibGUpO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYWNrYWdlc190YWJsZT1zcmNfdGFibGU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90YWJsZS9zcmMvY29uZmlnLmpzCnZhciBjZWxsU3RhcnRzPXtkZWZhdWx0OntvcmRlcjonJ30sc2VsZWN0aW9uOnt3aWR0aDo0OCxtaW5XaWR0aDo0OCxyZWFsV2lkdGg6NDgsb3JkZXI6JycsY2xhc3NOYW1lOidlbC10YWJsZS1jb2x1bW4tLXNlbGVjdGlvbid9LGV4cGFuZDp7d2lkdGg6NDgsbWluV2lkdGg6NDgscmVhbFdpZHRoOjQ4LG9yZGVyOicnfSxpbmRleDp7d2lkdGg6NDgsbWluV2lkdGg6NDgscmVhbFdpZHRoOjQ4LG9yZGVyOicnfX07Ly8g6L+Z5Lqb6YCJ6aG55LiN5bqU6K+l6KKr6KaG55uWCnZhciBjZWxsRm9yY2VkPXtzZWxlY3Rpb246e3JlbmRlckhlYWRlcjpmdW5jdGlvbiByZW5kZXJIZWFkZXIoaCxfcmVmKXt2YXIgc3RvcmU9X3JlZi5zdG9yZTtyZXR1cm4gaCgnZWwtY2hlY2tib3gnLHthdHRyczp7ZGlzYWJsZWQ6c3RvcmUuc3RhdGVzLmRhdGEmJnN0b3JlLnN0YXRlcy5kYXRhLmxlbmd0aD09PTAsaW5kZXRlcm1pbmF0ZTpzdG9yZS5zdGF0ZXMuc2VsZWN0aW9uLmxlbmd0aD4wJiYhdGhpcy5pc0FsbFNlbGVjdGVkLHZhbHVlOnRoaXMuaXNBbGxTZWxlY3RlZH0sbmF0aXZlT246eydjbGljayc6dGhpcy50b2dnbGVBbGxTZWxlY3Rpb259fSk7fSxyZW5kZXJDZWxsOmZ1bmN0aW9uIHJlbmRlckNlbGwoaCxfcmVmMil7dmFyIHJvdz1fcmVmMi5yb3csY29sdW1uPV9yZWYyLmNvbHVtbixzdG9yZT1fcmVmMi5zdG9yZSwkaW5kZXg9X3JlZjIuJGluZGV4O3JldHVybiBoKCdlbC1jaGVja2JveCcse25hdGl2ZU9uOnsnY2xpY2snOmZ1bmN0aW9uIGNsaWNrKGV2ZW50KXtyZXR1cm4gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7fX0sYXR0cnM6e3ZhbHVlOnN0b3JlLmlzU2VsZWN0ZWQocm93KSxkaXNhYmxlZDpjb2x1bW4uc2VsZWN0YWJsZT8hY29sdW1uLnNlbGVjdGFibGUuY2FsbChudWxsLHJvdywkaW5kZXgpOmZhbHNlfSxvbjp7J2lucHV0JzpmdW5jdGlvbiBpbnB1dCgpe3N0b3JlLmNvbW1pdCgncm93U2VsZWN0ZWRDaGFuZ2VkJyxyb3cpO319fSk7fSxzb3J0YWJsZTpmYWxzZSxyZXNpemFibGU6ZmFsc2V9LGluZGV4OntyZW5kZXJIZWFkZXI6ZnVuY3Rpb24gcmVuZGVySGVhZGVyKGgsX3JlZjMpe3ZhciBjb2x1bW49X3JlZjMuY29sdW1uO3JldHVybiBjb2x1bW4ubGFiZWx8fCcjJzt9LHJlbmRlckNlbGw6ZnVuY3Rpb24gcmVuZGVyQ2VsbChoLF9yZWY0KXt2YXIgJGluZGV4PV9yZWY0LiRpbmRleCxjb2x1bW49X3JlZjQuY29sdW1uO3ZhciBpPSRpbmRleCsxO3ZhciBpbmRleD1jb2x1bW4uaW5kZXg7aWYodHlwZW9mIGluZGV4PT09J251bWJlcicpe2k9JGluZGV4K2luZGV4O31lbHNlIGlmKHR5cGVvZiBpbmRleD09PSdmdW5jdGlvbicpe2k9aW5kZXgoJGluZGV4KTt9cmV0dXJuIGgoJ2RpdicsW2ldKTt9LHNvcnRhYmxlOmZhbHNlfSxleHBhbmQ6e3JlbmRlckhlYWRlcjpmdW5jdGlvbiByZW5kZXJIZWFkZXIoaCxfcmVmNSl7dmFyIGNvbHVtbj1fcmVmNS5jb2x1bW47cmV0dXJuIGNvbHVtbi5sYWJlbHx8Jyc7fSxyZW5kZXJDZWxsOmZ1bmN0aW9uIHJlbmRlckNlbGwoaCxfcmVmNil7dmFyIHJvdz1fcmVmNi5yb3csc3RvcmU9X3JlZjYuc3RvcmU7dmFyIGNsYXNzZXM9WydlbC10YWJsZV9fZXhwYW5kLWljb24nXTtpZihzdG9yZS5zdGF0ZXMuZXhwYW5kUm93cy5pbmRleE9mKHJvdyk+LTEpe2NsYXNzZXMucHVzaCgnZWwtdGFibGVfX2V4cGFuZC1pY29uLS1leHBhbmRlZCcpO312YXIgY2FsbGJhY2s9ZnVuY3Rpb24gY2FsbGJhY2soZSl7ZS5zdG9wUHJvcGFnYXRpb24oKTtzdG9yZS50b2dnbGVSb3dFeHBhbnNpb24ocm93KTt9O3JldHVybiBoKCdkaXYnLHsnY2xhc3MnOmNsYXNzZXMsb246eydjbGljayc6Y2FsbGJhY2t9fSxbaCgnaScseydjbGFzcyc6J2VsLWljb24gZWwtaWNvbi1hcnJvdy1yaWdodCd9KV0pO30sc29ydGFibGU6ZmFsc2UscmVzaXphYmxlOmZhbHNlLGNsYXNzTmFtZTonZWwtdGFibGVfX2V4cGFuZC1jb2x1bW4nfX07ZnVuY3Rpb24gZGVmYXVsdFJlbmRlckNlbGwoaCxfcmVmNyl7dmFyIHJvdz1fcmVmNy5yb3csY29sdW1uPV9yZWY3LmNvbHVtbiwkaW5kZXg9X3JlZjcuJGluZGV4O3ZhciBwcm9wZXJ0eT1jb2x1bW4ucHJvcGVydHk7dmFyIHZhbHVlPXByb3BlcnR5JiZPYmplY3QodXRpbF9bImdldFByb3BCeVBhdGgiXSkocm93LHByb3BlcnR5KS52O2lmKGNvbHVtbiYmY29sdW1uLmZvcm1hdHRlcil7cmV0dXJuIGNvbHVtbi5mb3JtYXR0ZXIocm93LGNvbHVtbix2YWx1ZSwkaW5kZXgpO31yZXR1cm4gdmFsdWU7fWZ1bmN0aW9uIHRyZWVDZWxsUHJlZml4KGgsX3JlZjgpe3ZhciByb3c9X3JlZjgucm93LHRyZWVOb2RlPV9yZWY4LnRyZWVOb2RlLHN0b3JlPV9yZWY4LnN0b3JlO2lmKCF0cmVlTm9kZSlyZXR1cm4gbnVsbDt2YXIgZWxlPVtdO3ZhciBjYWxsYmFjaz1mdW5jdGlvbiBjYWxsYmFjayhlKXtlLnN0b3BQcm9wYWdhdGlvbigpO3N0b3JlLmxvYWRPclRvZ2dsZShyb3cpO307aWYodHJlZU5vZGUuaW5kZW50KXtlbGUucHVzaChoKCdzcGFuJyx7J2NsYXNzJzonZWwtdGFibGVfX2luZGVudCcsc3R5bGU6eydwYWRkaW5nLWxlZnQnOnRyZWVOb2RlLmluZGVudCsncHgnfX0pKTt9aWYodHlwZW9mIHRyZWVOb2RlLmV4cGFuZGVkPT09J2Jvb2xlYW4nJiYhdHJlZU5vZGUubm9MYXp5Q2hpbGRyZW4pe3ZhciBleHBhbmRDbGFzc2VzPVsnZWwtdGFibGVfX2V4cGFuZC1pY29uJyx0cmVlTm9kZS5leHBhbmRlZD8nZWwtdGFibGVfX2V4cGFuZC1pY29uLS1leHBhbmRlZCc6JyddO3ZhciBpY29uQ2xhc3Nlcz1bJ2VsLWljb24tYXJyb3ctcmlnaHQnXTtpZih0cmVlTm9kZS5sb2FkaW5nKXtpY29uQ2xhc3Nlcz1bJ2VsLWljb24tbG9hZGluZyddO31lbGUucHVzaChoKCdkaXYnLHsnY2xhc3MnOmV4cGFuZENsYXNzZXMsb246eydjbGljayc6Y2FsbGJhY2t9fSxbaCgnaScseydjbGFzcyc6aWNvbkNsYXNzZXN9KV0pKTt9ZWxzZXtlbGUucHVzaChoKCdzcGFuJyx7J2NsYXNzJzonZWwtdGFibGVfX3BsYWNlaG9sZGVyJ30pKTt9cmV0dXJuIGVsZTt9Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90YWJsZS9zcmMvdGFibGUtY29sdW1uLmpzCnZhciB0YWJsZV9jb2x1bW5fZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XTt9fX1yZXR1cm4gdGFyZ2V0O307dmFyIGNvbHVtbklkU2VlZD0xOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgdGFibGVfY29sdW1uPXtuYW1lOidFbFRhYmxlQ29sdW1uJyxwcm9wczp7dHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDonZGVmYXVsdCd9LGxhYmVsOlN0cmluZyxjbGFzc05hbWU6U3RyaW5nLGxhYmVsQ2xhc3NOYW1lOlN0cmluZyxwcm9wZXJ0eTpTdHJpbmcscHJvcDpTdHJpbmcsd2lkdGg6e30sbWluV2lkdGg6e30scmVuZGVySGVhZGVyOkZ1bmN0aW9uLHNvcnRhYmxlOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDpmYWxzZX0sc29ydE1ldGhvZDpGdW5jdGlvbixzb3J0Qnk6W1N0cmluZyxGdW5jdGlvbixBcnJheV0scmVzaXphYmxlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDp0cnVlfSxjb2x1bW5LZXk6U3RyaW5nLGFsaWduOlN0cmluZyxoZWFkZXJBbGlnbjpTdHJpbmcsc2hvd1Rvb2x0aXBXaGVuT3ZlcmZsb3c6Qm9vbGVhbixzaG93T3ZlcmZsb3dUb29sdGlwOkJvb2xlYW4sZml4ZWQ6W0Jvb2xlYW4sU3RyaW5nXSxmb3JtYXR0ZXI6RnVuY3Rpb24sc2VsZWN0YWJsZTpGdW5jdGlvbixyZXNlcnZlU2VsZWN0aW9uOkJvb2xlYW4sZmlsdGVyTWV0aG9kOkZ1bmN0aW9uLGZpbHRlcmVkVmFsdWU6QXJyYXksZmlsdGVyczpBcnJheSxmaWx0ZXJQbGFjZW1lbnQ6U3RyaW5nLGZpbHRlck11bHRpcGxlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDp0cnVlfSxpbmRleDpbTnVtYmVyLEZ1bmN0aW9uXSxzb3J0T3JkZXJzOnt0eXBlOkFycmF5LGRlZmF1bHQ6ZnVuY3Rpb24gX2RlZmF1bHQoKXtyZXR1cm5bJ2FzY2VuZGluZycsJ2Rlc2NlbmRpbmcnLG51bGxdO30sdmFsaWRhdG9yOmZ1bmN0aW9uIHZhbGlkYXRvcih2YWwpe3JldHVybiB2YWwuZXZlcnkoZnVuY3Rpb24ob3JkZXIpe3JldHVyblsnYXNjZW5kaW5nJywnZGVzY2VuZGluZycsbnVsbF0uaW5kZXhPZihvcmRlcik+LTE7fSk7fX19LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybntpc1N1YkNvbHVtbjpmYWxzZSxjb2x1bW5zOltdfTt9LGNvbXB1dGVkOntvd25lcjpmdW5jdGlvbiBvd25lcigpe3ZhciBwYXJlbnQ9dGhpcy4kcGFyZW50O3doaWxlKHBhcmVudCYmIXBhcmVudC50YWJsZUlkKXtwYXJlbnQ9cGFyZW50LiRwYXJlbnQ7fXJldHVybiBwYXJlbnQ7fSxjb2x1bW5PclRhYmxlUGFyZW50OmZ1bmN0aW9uIGNvbHVtbk9yVGFibGVQYXJlbnQoKXt2YXIgcGFyZW50PXRoaXMuJHBhcmVudDt3aGlsZShwYXJlbnQmJiFwYXJlbnQudGFibGVJZCYmIXBhcmVudC5jb2x1bW5JZCl7cGFyZW50PXBhcmVudC4kcGFyZW50O31yZXR1cm4gcGFyZW50O30scmVhbFdpZHRoOmZ1bmN0aW9uIHJlYWxXaWR0aCgpe3JldHVybiBwYXJzZVdpZHRoKHRoaXMud2lkdGgpO30scmVhbE1pbldpZHRoOmZ1bmN0aW9uIHJlYWxNaW5XaWR0aCgpe3JldHVybiBwYXJzZU1pbldpZHRoKHRoaXMubWluV2lkdGgpO30scmVhbEFsaWduOmZ1bmN0aW9uIHJlYWxBbGlnbigpe3JldHVybiB0aGlzLmFsaWduPydpcy0nK3RoaXMuYWxpZ246bnVsbDt9LHJlYWxIZWFkZXJBbGlnbjpmdW5jdGlvbiByZWFsSGVhZGVyQWxpZ24oKXtyZXR1cm4gdGhpcy5oZWFkZXJBbGlnbj8naXMtJyt0aGlzLmhlYWRlckFsaWduOnRoaXMucmVhbEFsaWduO319LG1ldGhvZHM6e2dldFByb3BzRGF0YTpmdW5jdGlvbiBnZXRQcm9wc0RhdGEoKXt2YXIgX3RoaXM9dGhpcztmb3IodmFyIF9sZW49YXJndW1lbnRzLmxlbmd0aCxwcm9wcz1BcnJheShfbGVuKSxfa2V5PTA7X2tleTxfbGVuO19rZXkrKyl7cHJvcHNbX2tleV09YXJndW1lbnRzW19rZXldO31yZXR1cm4gcHJvcHMucmVkdWNlKGZ1bmN0aW9uKHByZXYsY3VyKXtpZihBcnJheS5pc0FycmF5KGN1cikpe2N1ci5mb3JFYWNoKGZ1bmN0aW9uKGtleSl7cHJldltrZXldPV90aGlzW2tleV07fSk7fXJldHVybiBwcmV2O30se30pO30sZ2V0Q29sdW1uRWxJbmRleDpmdW5jdGlvbiBnZXRDb2x1bW5FbEluZGV4KGNoaWxkcmVuLGNoaWxkKXtyZXR1cm5bXS5pbmRleE9mLmNhbGwoY2hpbGRyZW4sY2hpbGQpO30sc2V0Q29sdW1uV2lkdGg6ZnVuY3Rpb24gc2V0Q29sdW1uV2lkdGgoY29sdW1uKXtpZih0aGlzLnJlYWxXaWR0aCl7Y29sdW1uLndpZHRoPXRoaXMucmVhbFdpZHRoO31pZih0aGlzLnJlYWxNaW5XaWR0aCl7Y29sdW1uLm1pbldpZHRoPXRoaXMucmVhbE1pbldpZHRoO31pZighY29sdW1uLm1pbldpZHRoKXtjb2x1bW4ubWluV2lkdGg9ODA7fWNvbHVtbi5yZWFsV2lkdGg9Y29sdW1uLndpZHRoPT09dW5kZWZpbmVkP2NvbHVtbi5taW5XaWR0aDpjb2x1bW4ud2lkdGg7cmV0dXJuIGNvbHVtbjt9LHNldENvbHVtbkZvcmNlZFByb3BzOmZ1bmN0aW9uIHNldENvbHVtbkZvcmNlZFByb3BzKGNvbHVtbil7Ly8g5a+55LqO54m55a6a57G75Z6L55qEIGNvbHVtbu+8jOafkOS6m+WxnuaAp+S4jeWFgeiuuOiuvue9rgp2YXIgdHlwZT1jb2x1bW4udHlwZTt2YXIgc291cmNlPWNlbGxGb3JjZWRbdHlwZV18fHt9O09iamVjdC5rZXlzKHNvdXJjZSkuZm9yRWFjaChmdW5jdGlvbihwcm9wKXt2YXIgdmFsdWU9c291cmNlW3Byb3BdO2lmKHZhbHVlIT09dW5kZWZpbmVkKXtjb2x1bW5bcHJvcF09cHJvcD09PSdjbGFzc05hbWUnP2NvbHVtbltwcm9wXSsnICcrdmFsdWU6dmFsdWU7fX0pO3JldHVybiBjb2x1bW47fSxzZXRDb2x1bW5SZW5kZXJzOmZ1bmN0aW9uIHNldENvbHVtblJlbmRlcnMoY29sdW1uKXt2YXIgX3RoaXMyPXRoaXM7dmFyIGg9dGhpcy4kY3JlYXRlRWxlbWVudDsvLyByZW5kZXJIZWFkZXIg5bGe5oCn5LiN5o6o6I2Q5L2/55So44CCCmlmKHRoaXMucmVuZGVySGVhZGVyKXtjb25zb2xlLndhcm4oJ1tFbGVtZW50IFdhcm5dW1RhYmxlQ29sdW1uXUNvbXBhcmluZyB0byByZW5kZXItaGVhZGVyLCBzY29wZWQtc2xvdCBoZWFkZXIgaXMgZWFzaWVyIHRvIHVzZS4gV2UgcmVjb21tZW5kIHVzZXJzIHRvIHVzZSBzY29wZWQtc2xvdCBoZWFkZXIuJyk7fWVsc2UgaWYoY29sdW1uLnR5cGUhPT0nc2VsZWN0aW9uJyl7Y29sdW1uLnJlbmRlckhlYWRlcj1mdW5jdGlvbihoLHNjb3BlKXt2YXIgcmVuZGVySGVhZGVyPV90aGlzMi4kc2NvcGVkU2xvdHMuaGVhZGVyO3JldHVybiByZW5kZXJIZWFkZXI/cmVuZGVySGVhZGVyKHNjb3BlKTpjb2x1bW4ubGFiZWw7fTt9dmFyIG9yaWdpblJlbmRlckNlbGw9Y29sdW1uLnJlbmRlckNlbGw7Ly8gVE9ETzog6L+Z6YeM55qE5a6e546w6LCD5pW0CmlmKGNvbHVtbi50eXBlPT09J2V4cGFuZCcpey8vIOWvueS6juWxleW8gOihjO+8jHJlbmRlckNlbGwg5LiN5YWB6K646YWN572u55qE44CC5Zyo5LiK5LiA5q2l5Lit5bey57uP6K6+572u6L+H77yM6L+Z6YeM6ZyA6KaB566A5Y2V5bCB6KOF5LiA5LiL44CCCmNvbHVtbi5yZW5kZXJDZWxsPWZ1bmN0aW9uKGgsZGF0YSl7cmV0dXJuIGgoJ2RpdicseydjbGFzcyc6J2NlbGwnfSxbb3JpZ2luUmVuZGVyQ2VsbChoLGRhdGEpXSk7fTt0aGlzLm93bmVyLnJlbmRlckV4cGFuZGVkPWZ1bmN0aW9uKGgsZGF0YSl7cmV0dXJuIF90aGlzMi4kc2NvcGVkU2xvdHMuZGVmYXVsdD9fdGhpczIuJHNjb3BlZFNsb3RzLmRlZmF1bHQoZGF0YSk6X3RoaXMyLiRzbG90cy5kZWZhdWx0O307fWVsc2V7b3JpZ2luUmVuZGVyQ2VsbD1vcmlnaW5SZW5kZXJDZWxsfHxkZWZhdWx0UmVuZGVyQ2VsbDsvLyDlr7kgcmVuZGVyQ2VsbCDov5vooYzljIXoo4UKY29sdW1uLnJlbmRlckNlbGw9ZnVuY3Rpb24oaCxkYXRhKXt2YXIgY2hpbGRyZW49bnVsbDtpZihfdGhpczIuJHNjb3BlZFNsb3RzLmRlZmF1bHQpe2NoaWxkcmVuPV90aGlzMi4kc2NvcGVkU2xvdHMuZGVmYXVsdChkYXRhKTt9ZWxzZXtjaGlsZHJlbj1vcmlnaW5SZW5kZXJDZWxsKGgsZGF0YSk7fXZhciBwcmVmaXg9dHJlZUNlbGxQcmVmaXgoaCxkYXRhKTt2YXIgcHJvcHM9e2NsYXNzOidjZWxsJyxzdHlsZTp7fX07aWYoY29sdW1uLnNob3dPdmVyZmxvd1Rvb2x0aXApe3Byb3BzLmNsYXNzKz0nIGVsLXRvb2x0aXAnO3Byb3BzLnN0eWxlPXt3aWR0aDooZGF0YS5jb2x1bW4ucmVhbFdpZHRofHxkYXRhLmNvbHVtbi53aWR0aCktMSsncHgnfTt9cmV0dXJuIGgoJ2RpdicscHJvcHMsW3ByZWZpeCxjaGlsZHJlbl0pO307fXJldHVybiBjb2x1bW47fSxyZWdpc3Rlck5vcm1hbFdhdGNoZXJzOmZ1bmN0aW9uIHJlZ2lzdGVyTm9ybWFsV2F0Y2hlcnMoKXt2YXIgX3RoaXMzPXRoaXM7dmFyIHByb3BzPVsnbGFiZWwnLCdwcm9wZXJ0eScsJ2ZpbHRlcnMnLCdmaWx0ZXJNdWx0aXBsZScsJ3NvcnRhYmxlJywnaW5kZXgnLCdmb3JtYXR0ZXInLCdjbGFzc05hbWUnLCdsYWJlbENsYXNzTmFtZScsJ3Nob3dPdmVyZmxvd1Rvb2x0aXAnXTsvLyDkuIDkupvlsZ7mgKflhbfmnInliKvlkI0KdmFyIGFsaWFzZXM9e3Byb3A6J3Byb3BlcnR5JyxyZWFsQWxpZ246J2FsaWduJyxyZWFsSGVhZGVyQWxpZ246J2hlYWRlckFsaWduJyxyZWFsV2lkdGg6J3dpZHRoJ307dmFyIGFsbEFsaWFzZXM9cHJvcHMucmVkdWNlKGZ1bmN0aW9uKHByZXYsY3VyKXtwcmV2W2N1cl09Y3VyO3JldHVybiBwcmV2O30sYWxpYXNlcyk7T2JqZWN0LmtleXMoYWxsQWxpYXNlcykuZm9yRWFjaChmdW5jdGlvbihrZXkpe3ZhciBjb2x1bW5LZXk9YWxpYXNlc1trZXldO190aGlzMy4kd2F0Y2goa2V5LGZ1bmN0aW9uKG5ld1ZhbCl7X3RoaXMzLmNvbHVtbkNvbmZpZ1tjb2x1bW5LZXldPW5ld1ZhbDt9KTt9KTt9LHJlZ2lzdGVyQ29tcGxleFdhdGNoZXJzOmZ1bmN0aW9uIHJlZ2lzdGVyQ29tcGxleFdhdGNoZXJzKCl7dmFyIF90aGlzND10aGlzO3ZhciBwcm9wcz1bJ2ZpeGVkJ107dmFyIGFsaWFzZXM9e3JlYWxXaWR0aDond2lkdGgnLHJlYWxNaW5XaWR0aDonbWluV2lkdGgnfTt2YXIgYWxsQWxpYXNlcz1wcm9wcy5yZWR1Y2UoZnVuY3Rpb24ocHJldixjdXIpe3ByZXZbY3VyXT1jdXI7cmV0dXJuIHByZXY7fSxhbGlhc2VzKTtPYmplY3Qua2V5cyhhbGxBbGlhc2VzKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSl7dmFyIGNvbHVtbktleT1hbGlhc2VzW2tleV07X3RoaXM0LiR3YXRjaChrZXksZnVuY3Rpb24obmV3VmFsKXtfdGhpczQuY29sdW1uQ29uZmlnW2NvbHVtbktleV09bmV3VmFsO3ZhciB1cGRhdGVDb2x1bW5zPWNvbHVtbktleT09PSdmaXhlZCc7X3RoaXM0Lm93bmVyLnN0b3JlLnNjaGVkdWxlTGF5b3V0KHVwZGF0ZUNvbHVtbnMpO30pO30pO319LGNvbXBvbmVudHM6e0VsQ2hlY2tib3g6Y2hlY2tib3hfZGVmYXVsdC5hfSxiZWZvcmVDcmVhdGU6ZnVuY3Rpb24gYmVmb3JlQ3JlYXRlKCl7dGhpcy5yb3c9e307dGhpcy5jb2x1bW49e307dGhpcy4kaW5kZXg9MDt0aGlzLmNvbHVtbklkPScnO30sY3JlYXRlZDpmdW5jdGlvbiBjcmVhdGVkKCl7dmFyIHBhcmVudD10aGlzLmNvbHVtbk9yVGFibGVQYXJlbnQ7dGhpcy5pc1N1YkNvbHVtbj10aGlzLm93bmVyIT09cGFyZW50O3RoaXMuY29sdW1uSWQ9KHBhcmVudC50YWJsZUlkfHxwYXJlbnQuY29sdW1uSWQpKydfY29sdW1uXycrY29sdW1uSWRTZWVkKys7dmFyIHR5cGU9dGhpcy50eXBlfHwnZGVmYXVsdCc7dmFyIHNvcnRhYmxlPXRoaXMuc29ydGFibGU9PT0nJz90cnVlOnRoaXMuc29ydGFibGU7dmFyIGRlZmF1bHRzPXRhYmxlX2NvbHVtbl9leHRlbmRzKHt9LGNlbGxTdGFydHNbdHlwZV0se2lkOnRoaXMuY29sdW1uSWQsdHlwZTp0eXBlLHByb3BlcnR5OnRoaXMucHJvcHx8dGhpcy5wcm9wZXJ0eSxhbGlnbjp0aGlzLnJlYWxBbGlnbixoZWFkZXJBbGlnbjp0aGlzLnJlYWxIZWFkZXJBbGlnbixzaG93T3ZlcmZsb3dUb29sdGlwOnRoaXMuc2hvd092ZXJmbG93VG9vbHRpcHx8dGhpcy5zaG93VG9vbHRpcFdoZW5PdmVyZmxvdywvLyBmaWx0ZXIg55u45YWz5bGe5oCnCmZpbHRlcmFibGU6dGhpcy5maWx0ZXJzfHx0aGlzLmZpbHRlck1ldGhvZCxmaWx0ZXJlZFZhbHVlOltdLGZpbHRlclBsYWNlbWVudDonJyxpc0NvbHVtbkdyb3VwOmZhbHNlLGZpbHRlck9wZW5lZDpmYWxzZSwvLyBzb3J0IOebuOWFs+WxnuaApwpzb3J0YWJsZTpzb3J0YWJsZSwvLyBpbmRleCDliJcKaW5kZXg6dGhpcy5pbmRleH0pO3ZhciBiYXNpY1Byb3BzPVsnY29sdW1uS2V5JywnbGFiZWwnLCdjbGFzc05hbWUnLCdsYWJlbENsYXNzTmFtZScsJ3R5cGUnLCdyZW5kZXJIZWFkZXInLCdmb3JtYXR0ZXInLCdmaXhlZCcsJ3Jlc2l6YWJsZSddO3ZhciBzb3J0UHJvcHM9Wydzb3J0TWV0aG9kJywnc29ydEJ5Jywnc29ydE9yZGVycyddO3ZhciBzZWxlY3RQcm9wcz1bJ3NlbGVjdGFibGUnLCdyZXNlcnZlU2VsZWN0aW9uJ107dmFyIGZpbHRlclByb3BzPVsnZmlsdGVyTWV0aG9kJywnZmlsdGVycycsJ2ZpbHRlck11bHRpcGxlJywnZmlsdGVyT3BlbmVkJywnZmlsdGVyZWRWYWx1ZScsJ2ZpbHRlclBsYWNlbWVudCddO3ZhciBjb2x1bW49dGhpcy5nZXRQcm9wc0RhdGEoYmFzaWNQcm9wcyxzb3J0UHJvcHMsc2VsZWN0UHJvcHMsZmlsdGVyUHJvcHMpO2NvbHVtbj1tZXJnZU9wdGlvbnMoZGVmYXVsdHMsY29sdW1uKTsvLyDms6jmhI8gY29tcG9zZSDkuK3lh73mlbDmiafooYznmoTpobrluo/mmK/ku47lj7PliLDlt6YKdmFyIGNoYWlucz1jb21wb3NlKHRoaXMuc2V0Q29sdW1uUmVuZGVycyx0aGlzLnNldENvbHVtbldpZHRoLHRoaXMuc2V0Q29sdW1uRm9yY2VkUHJvcHMpO2NvbHVtbj1jaGFpbnMoY29sdW1uKTt0aGlzLmNvbHVtbkNvbmZpZz1jb2x1bW47Ly8g5rOo5YaMIHdhdGNoZXIKdGhpcy5yZWdpc3Rlck5vcm1hbFdhdGNoZXJzKCk7dGhpcy5yZWdpc3RlckNvbXBsZXhXYXRjaGVycygpO30sbW91bnRlZDpmdW5jdGlvbiBtb3VudGVkKCl7dmFyIG93bmVyPXRoaXMub3duZXI7dmFyIHBhcmVudD10aGlzLmNvbHVtbk9yVGFibGVQYXJlbnQ7dmFyIGNoaWxkcmVuPXRoaXMuaXNTdWJDb2x1bW4/cGFyZW50LiRlbC5jaGlsZHJlbjpwYXJlbnQuJHJlZnMuaGlkZGVuQ29sdW1ucy5jaGlsZHJlbjt2YXIgY29sdW1uSW5kZXg9dGhpcy5nZXRDb2x1bW5FbEluZGV4KGNoaWxkcmVuLHRoaXMuJGVsKTtvd25lci5zdG9yZS5jb21taXQoJ2luc2VydENvbHVtbicsdGhpcy5jb2x1bW5Db25maWcsY29sdW1uSW5kZXgsdGhpcy5pc1N1YkNvbHVtbj9wYXJlbnQuY29sdW1uQ29uZmlnOm51bGwpO30sZGVzdHJveWVkOmZ1bmN0aW9uIGRlc3Ryb3llZCgpe2lmKCF0aGlzLiRwYXJlbnQpcmV0dXJuO3ZhciBwYXJlbnQ9dGhpcy4kcGFyZW50O3RoaXMub3duZXIuc3RvcmUuY29tbWl0KCdyZW1vdmVDb2x1bW4nLHRoaXMuY29sdW1uQ29uZmlnLHRoaXMuaXNTdWJDb2x1bW4/cGFyZW50LmNvbHVtbkNvbmZpZzpudWxsKTt9LHJlbmRlcjpmdW5jdGlvbiByZW5kZXIoaCl7Ly8gc2xvdHMg5Lmf6KaB5riy5p+T77yM6ZyA6KaB6K6h566X5ZCI5bm26KGo5aS0CnJldHVybiBoKCdkaXYnLHRoaXMuJHNsb3RzLmRlZmF1bHQpO319Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGFibGUtY29sdW1uL2luZGV4LmpzCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovdGFibGVfY29sdW1uLmluc3RhbGw9ZnVuY3Rpb24oVnVlKXtWdWUuY29tcG9uZW50KHRhYmxlX2NvbHVtbi5uYW1lLHRhYmxlX2NvbHVtbik7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX3RhYmxlX2NvbHVtbj10YWJsZV9jb2x1bW47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGlja2VyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD03OWFlMDY5ZiYKdmFyIHBpY2tlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzc5YWUwNjlmX3JlbmRlcj1mdW5jdGlvbiBwaWNrZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF83OWFlMDY5Zl9yZW5kZXIoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDt2YXIgX2M9X3ZtLl9zZWxmLl9jfHxfaDtyZXR1cm4hX3ZtLnJhbmdlZD9fYygiZWwtaW5wdXQiLF92bS5fYih7ZGlyZWN0aXZlczpbe25hbWU6ImNsaWNrb3V0c2lkZSIscmF3TmFtZToidi1jbGlja291dHNpZGUiLHZhbHVlOl92bS5oYW5kbGVDbG9zZSxleHByZXNzaW9uOiJoYW5kbGVDbG9zZSJ9XSxyZWY6InJlZmVyZW5jZSIsc3RhdGljQ2xhc3M6ImVsLWRhdGUtZWRpdG9yIixjbGFzczoiZWwtZGF0ZS1lZGl0b3ItLSIrX3ZtLnR5cGUsYXR0cnM6e3JlYWRvbmx5OiFfdm0uZWRpdGFibGV8fF92bS5yZWFkb25seXx8X3ZtLnR5cGU9PT0iZGF0ZXMifHxfdm0udHlwZT09PSJ3ZWVrIixkaXNhYmxlZDpfdm0ucGlja2VyRGlzYWJsZWQsc2l6ZTpfdm0ucGlja2VyU2l6ZSxuYW1lOl92bS5uYW1lLHBsYWNlaG9sZGVyOl92bS5wbGFjZWhvbGRlcix2YWx1ZTpfdm0uZGlzcGxheVZhbHVlLHZhbGlkYXRlRXZlbnQ6ZmFsc2V9LG9uOntmb2N1czpfdm0uaGFuZGxlRm9jdXMsaW5wdXQ6ZnVuY3Rpb24gaW5wdXQodmFsdWUpe3JldHVybiBfdm0udXNlcklucHV0PXZhbHVlO30sY2hhbmdlOl92bS5oYW5kbGVDaGFuZ2V9LG5hdGl2ZU9uOntrZXlkb3duOmZ1bmN0aW9uIGtleWRvd24oJGV2ZW50KXtyZXR1cm4gX3ZtLmhhbmRsZUtleWRvd24oJGV2ZW50KTt9LG1vdXNlZW50ZXI6ZnVuY3Rpb24gbW91c2VlbnRlcigkZXZlbnQpe3JldHVybiBfdm0uaGFuZGxlTW91c2VFbnRlcigkZXZlbnQpO30sbW91c2VsZWF2ZTpmdW5jdGlvbiBtb3VzZWxlYXZlKCRldmVudCl7X3ZtLnNob3dDbG9zZT1mYWxzZTt9fX0sImVsLWlucHV0Iixfdm0uZmlyc3RJbnB1dElkLGZhbHNlKSxbX2MoImkiLHtzdGF0aWNDbGFzczoiZWwtaW5wdXRfX2ljb24iLGNsYXNzOl92bS50cmlnZ2VyQ2xhc3MsYXR0cnM6e3Nsb3Q6InByZWZpeCJ9LG9uOntjbGljazpfdm0uaGFuZGxlRm9jdXN9LHNsb3Q6InByZWZpeCJ9KSxfdm0uaGF2ZVRyaWdnZXI/X2MoImkiLHtzdGF0aWNDbGFzczoiZWwtaW5wdXRfX2ljb24iLGNsYXNzOltfdm0uc2hvd0Nsb3NlPyIiK192bS5jbGVhckljb246IiJdLGF0dHJzOntzbG90OiJzdWZmaXgifSxvbjp7Y2xpY2s6X3ZtLmhhbmRsZUNsaWNrSWNvbn0sc2xvdDoic3VmZml4In0pOl92bS5fZSgpXSk6X2MoImRpdiIse2RpcmVjdGl2ZXM6W3tuYW1lOiJjbGlja291dHNpZGUiLHJhd05hbWU6InYtY2xpY2tvdXRzaWRlIix2YWx1ZTpfdm0uaGFuZGxlQ2xvc2UsZXhwcmVzc2lvbjoiaGFuZGxlQ2xvc2UifV0scmVmOiJyZWZlcmVuY2UiLHN0YXRpY0NsYXNzOiJlbC1kYXRlLWVkaXRvciBlbC1yYW5nZS1lZGl0b3IgZWwtaW5wdXRfX2lubmVyIixjbGFzczpbImVsLWRhdGUtZWRpdG9yLS0iK192bS50eXBlLF92bS5waWNrZXJTaXplPyJlbC1yYW5nZS1lZGl0b3ItLSIrX3ZtLnBpY2tlclNpemU6IiIsX3ZtLnBpY2tlckRpc2FibGVkPyJpcy1kaXNhYmxlZCI6IiIsX3ZtLnBpY2tlclZpc2libGU/ImlzLWFjdGl2ZSI6IiJdLG9uOntjbGljazpfdm0uaGFuZGxlUmFuZ2VDbGljayxtb3VzZWVudGVyOl92bS5oYW5kbGVNb3VzZUVudGVyLG1vdXNlbGVhdmU6ZnVuY3Rpb24gbW91c2VsZWF2ZSgkZXZlbnQpe192bS5zaG93Q2xvc2U9ZmFsc2U7fSxrZXlkb3duOl92bS5oYW5kbGVLZXlkb3dufX0sW19jKCJpIix7Y2xhc3M6WyJlbC1pbnB1dF9faWNvbiIsImVsLXJhbmdlX19pY29uIixfdm0udHJpZ2dlckNsYXNzXX0pLF9jKCJpbnB1dCIsX3ZtLl9iKHtzdGF0aWNDbGFzczoiZWwtcmFuZ2UtaW5wdXQiLGF0dHJzOnthdXRvY29tcGxldGU6Im9mZiIscGxhY2Vob2xkZXI6X3ZtLnN0YXJ0UGxhY2Vob2xkZXIsZGlzYWJsZWQ6X3ZtLnBpY2tlckRpc2FibGVkLHJlYWRvbmx5OiFfdm0uZWRpdGFibGV8fF92bS5yZWFkb25seSxuYW1lOl92bS5uYW1lJiZfdm0ubmFtZVswXX0sZG9tUHJvcHM6e3ZhbHVlOl92bS5kaXNwbGF5VmFsdWUmJl92bS5kaXNwbGF5VmFsdWVbMF19LG9uOntpbnB1dDpfdm0uaGFuZGxlU3RhcnRJbnB1dCxjaGFuZ2U6X3ZtLmhhbmRsZVN0YXJ0Q2hhbmdlLGZvY3VzOl92bS5oYW5kbGVGb2N1c319LCJpbnB1dCIsX3ZtLmZpcnN0SW5wdXRJZCxmYWxzZSkpLF92bS5fdCgicmFuZ2Utc2VwYXJhdG9yIixbX2MoInNwYW4iLHtzdGF0aWNDbGFzczoiZWwtcmFuZ2Utc2VwYXJhdG9yIn0sW192bS5fdihfdm0uX3MoX3ZtLnJhbmdlU2VwYXJhdG9yKSldKV0pLF9jKCJpbnB1dCIsX3ZtLl9iKHtzdGF0aWNDbGFzczoiZWwtcmFuZ2UtaW5wdXQiLGF0dHJzOnthdXRvY29tcGxldGU6Im9mZiIscGxhY2Vob2xkZXI6X3ZtLmVuZFBsYWNlaG9sZGVyLGRpc2FibGVkOl92bS5waWNrZXJEaXNhYmxlZCxyZWFkb25seTohX3ZtLmVkaXRhYmxlfHxfdm0ucmVhZG9ubHksbmFtZTpfdm0ubmFtZSYmX3ZtLm5hbWVbMV19LGRvbVByb3BzOnt2YWx1ZTpfdm0uZGlzcGxheVZhbHVlJiZfdm0uZGlzcGxheVZhbHVlWzFdfSxvbjp7aW5wdXQ6X3ZtLmhhbmRsZUVuZElucHV0LGNoYW5nZTpfdm0uaGFuZGxlRW5kQ2hhbmdlLGZvY3VzOl92bS5oYW5kbGVGb2N1c319LCJpbnB1dCIsX3ZtLnNlY29uZElucHV0SWQsZmFsc2UpKSxfdm0uaGF2ZVRyaWdnZXI/X2MoImkiLHtzdGF0aWNDbGFzczoiZWwtaW5wdXRfX2ljb24gZWwtcmFuZ2VfX2Nsb3NlLWljb24iLGNsYXNzOltfdm0uc2hvd0Nsb3NlPyIiK192bS5jbGVhckljb246IiJdLG9uOntjbGljazpfdm0uaGFuZGxlQ2xpY2tJY29ufX0pOl92bS5fZSgpXSwyKTt9O3ZhciBwaWNrZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF83OWFlMDY5Zl9zdGF0aWNSZW5kZXJGbnM9W107cGlja2VydnVlX3R5cGVfdGVtcGxhdGVfaWRfNzlhZTA2OWZfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9waWNrZXIudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTc5YWUwNjlmJgovLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsICJlbGVtZW50LXVpL2xpYi91dGlscy9kYXRlLXV0aWwiCnZhciBkYXRlX3V0aWxfPV9fd2VicGFja19yZXF1aXJlX18oMCk7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BpY2tlci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCnZhciBOZXdQb3BwZXI9e3Byb3BzOnthcHBlbmRUb0JvZHk6dnVlX3BvcHBlcl9kZWZhdWx0LmEucHJvcHMuYXBwZW5kVG9Cb2R5LG9mZnNldDp2dWVfcG9wcGVyX2RlZmF1bHQuYS5wcm9wcy5vZmZzZXQsYm91bmRhcmllc1BhZGRpbmc6dnVlX3BvcHBlcl9kZWZhdWx0LmEucHJvcHMuYm91bmRhcmllc1BhZGRpbmcsYXJyb3dPZmZzZXQ6dnVlX3BvcHBlcl9kZWZhdWx0LmEucHJvcHMuYXJyb3dPZmZzZXR9LG1ldGhvZHM6dnVlX3BvcHBlcl9kZWZhdWx0LmEubWV0aG9kcyxkYXRhOmZ1bmN0aW9uIGRhdGEoKXtyZXR1cm4gbWVyZ2VfZGVmYXVsdCgpKHt2aXNpYmxlQXJyb3c6dHJ1ZX0sdnVlX3BvcHBlcl9kZWZhdWx0LmEuZGF0YSk7fSxiZWZvcmVEZXN0cm95OnZ1ZV9wb3BwZXJfZGVmYXVsdC5hLmJlZm9yZURlc3Ryb3l9O3ZhciBERUZBVUxUX0ZPUk1BVFM9e2RhdGU6J3l5eXktTU0tZGQnLG1vbnRoOid5eXl5LU1NJyxkYXRldGltZToneXl5eS1NTS1kZCBISDptbTpzcycsdGltZTonSEg6bW06c3MnLHdlZWs6J3l5eXl3V1cnLHRpbWVyYW5nZTonSEg6bW06c3MnLGRhdGVyYW5nZToneXl5eS1NTS1kZCcsbW9udGhyYW5nZToneXl5eS1NTScsZGF0ZXRpbWVyYW5nZToneXl5eS1NTS1kZCBISDptbTpzcycseWVhcjoneXl5eSd9O3ZhciBIQVZFX1RSSUdHRVJfVFlQRVM9WydkYXRlJywnZGF0ZXRpbWUnLCd0aW1lJywndGltZS1zZWxlY3QnLCd3ZWVrJywnbW9udGgnLCd5ZWFyJywnZGF0ZXJhbmdlJywnbW9udGhyYW5nZScsJ3RpbWVyYW5nZScsJ2RhdGV0aW1lcmFuZ2UnLCdkYXRlcyddO3ZhciBwaWNrZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19EQVRFX0ZPUk1BVFRFUj1mdW5jdGlvbiBEQVRFX0ZPUk1BVFRFUih2YWx1ZSxmb3JtYXQpe2lmKGZvcm1hdD09PSd0aW1lc3RhbXAnKXJldHVybiB2YWx1ZS5nZXRUaW1lKCk7cmV0dXJuIE9iamVjdChkYXRlX3V0aWxfWyJmb3JtYXREYXRlIl0pKHZhbHVlLGZvcm1hdCk7fTt2YXIgcGlja2VydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfREFURV9QQVJTRVI9ZnVuY3Rpb24gREFURV9QQVJTRVIodGV4dCxmb3JtYXQpe2lmKGZvcm1hdD09PSd0aW1lc3RhbXAnKXJldHVybiBuZXcgRGF0ZShOdW1iZXIodGV4dCkpO3JldHVybiBPYmplY3QoZGF0ZV91dGlsX1sicGFyc2VEYXRlIl0pKHRleHQsZm9ybWF0KTt9O3ZhciBSQU5HRV9GT1JNQVRURVI9ZnVuY3Rpb24gUkFOR0VfRk9STUFUVEVSKHZhbHVlLGZvcm1hdCl7aWYoQXJyYXkuaXNBcnJheSh2YWx1ZSkmJnZhbHVlLmxlbmd0aD09PTIpe3ZhciBzdGFydD12YWx1ZVswXTt2YXIgZW5kPXZhbHVlWzFdO2lmKHN0YXJ0JiZlbmQpe3JldHVybltwaWNrZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19EQVRFX0ZPUk1BVFRFUihzdGFydCxmb3JtYXQpLHBpY2tlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX0RBVEVfRk9STUFUVEVSKGVuZCxmb3JtYXQpXTt9fXJldHVybicnO307dmFyIFJBTkdFX1BBUlNFUj1mdW5jdGlvbiBSQU5HRV9QQVJTRVIoYXJyYXksZm9ybWF0LHNlcGFyYXRvcil7aWYoIUFycmF5LmlzQXJyYXkoYXJyYXkpKXthcnJheT1hcnJheS5zcGxpdChzZXBhcmF0b3IpO31pZihhcnJheS5sZW5ndGg9PT0yKXt2YXIgcmFuZ2UxPWFycmF5WzBdO3ZhciByYW5nZTI9YXJyYXlbMV07cmV0dXJuW3BpY2tlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX0RBVEVfUEFSU0VSKHJhbmdlMSxmb3JtYXQpLHBpY2tlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX0RBVEVfUEFSU0VSKHJhbmdlMixmb3JtYXQpXTt9cmV0dXJuW107fTt2YXIgVFlQRV9WQUxVRV9SRVNPTFZFUl9NQVA9e2RlZmF1bHQ6e2Zvcm1hdHRlcjpmdW5jdGlvbiBmb3JtYXR0ZXIodmFsdWUpe2lmKCF2YWx1ZSlyZXR1cm4nJztyZXR1cm4nJyt2YWx1ZTt9LHBhcnNlcjpmdW5jdGlvbiBwYXJzZXIodGV4dCl7aWYodGV4dD09PXVuZGVmaW5lZHx8dGV4dD09PScnKXJldHVybiBudWxsO3JldHVybiB0ZXh0O319LHdlZWs6e2Zvcm1hdHRlcjpmdW5jdGlvbiBmb3JtYXR0ZXIodmFsdWUsZm9ybWF0KXt2YXIgd2Vlaz1PYmplY3QoZGF0ZV91dGlsX1siZ2V0V2Vla051bWJlciJdKSh2YWx1ZSk7dmFyIG1vbnRoPXZhbHVlLmdldE1vbnRoKCk7dmFyIHRydWVEYXRlPW5ldyBEYXRlKHZhbHVlKTtpZih3ZWVrPT09MSYmbW9udGg9PT0xMSl7dHJ1ZURhdGUuc2V0SG91cnMoMCwwLDAsMCk7dHJ1ZURhdGUuc2V0RGF0ZSh0cnVlRGF0ZS5nZXREYXRlKCkrMy0odHJ1ZURhdGUuZ2V0RGF5KCkrNiklNyk7fXZhciBkYXRlPU9iamVjdChkYXRlX3V0aWxfWyJmb3JtYXREYXRlIl0pKHRydWVEYXRlLGZvcm1hdCk7ZGF0ZT0vV1cvLnRlc3QoZGF0ZSk/ZGF0ZS5yZXBsYWNlKC9XVy8sd2VlazwxMD8nMCcrd2Vlazp3ZWVrKTpkYXRlLnJlcGxhY2UoL1cvLHdlZWspO3JldHVybiBkYXRlO30scGFyc2VyOmZ1bmN0aW9uIHBhcnNlcih0ZXh0LGZvcm1hdCl7Ly8gcGFyc2UgYXMgaWYgYSBub3JtYWwgZGF0ZQpyZXR1cm4gVFlQRV9WQUxVRV9SRVNPTFZFUl9NQVAuZGF0ZS5wYXJzZXIodGV4dCxmb3JtYXQpO319LGRhdGU6e2Zvcm1hdHRlcjpwaWNrZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19EQVRFX0ZPUk1BVFRFUixwYXJzZXI6cGlja2VydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfREFURV9QQVJTRVJ9LGRhdGV0aW1lOntmb3JtYXR0ZXI6cGlja2VydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfREFURV9GT1JNQVRURVIscGFyc2VyOnBpY2tlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX0RBVEVfUEFSU0VSfSxkYXRlcmFuZ2U6e2Zvcm1hdHRlcjpSQU5HRV9GT1JNQVRURVIscGFyc2VyOlJBTkdFX1BBUlNFUn0sbW9udGhyYW5nZTp7Zm9ybWF0dGVyOlJBTkdFX0ZPUk1BVFRFUixwYXJzZXI6UkFOR0VfUEFSU0VSfSxkYXRldGltZXJhbmdlOntmb3JtYXR0ZXI6UkFOR0VfRk9STUFUVEVSLHBhcnNlcjpSQU5HRV9QQVJTRVJ9LHRpbWVyYW5nZTp7Zm9ybWF0dGVyOlJBTkdFX0ZPUk1BVFRFUixwYXJzZXI6UkFOR0VfUEFSU0VSfSx0aW1lOntmb3JtYXR0ZXI6cGlja2VydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfREFURV9GT1JNQVRURVIscGFyc2VyOnBpY2tlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX0RBVEVfUEFSU0VSfSxtb250aDp7Zm9ybWF0dGVyOnBpY2tlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX0RBVEVfRk9STUFUVEVSLHBhcnNlcjpwaWNrZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19EQVRFX1BBUlNFUn0seWVhcjp7Zm9ybWF0dGVyOnBpY2tlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX0RBVEVfRk9STUFUVEVSLHBhcnNlcjpwaWNrZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19EQVRFX1BBUlNFUn0sbnVtYmVyOntmb3JtYXR0ZXI6ZnVuY3Rpb24gZm9ybWF0dGVyKHZhbHVlKXtpZighdmFsdWUpcmV0dXJuJyc7cmV0dXJuJycrdmFsdWU7fSxwYXJzZXI6ZnVuY3Rpb24gcGFyc2VyKHRleHQpe3ZhciByZXN1bHQ9TnVtYmVyKHRleHQpO2lmKCFpc05hTih0ZXh0KSl7cmV0dXJuIHJlc3VsdDt9ZWxzZXtyZXR1cm4gbnVsbDt9fX0sZGF0ZXM6e2Zvcm1hdHRlcjpmdW5jdGlvbiBmb3JtYXR0ZXIodmFsdWUsZm9ybWF0KXtyZXR1cm4gdmFsdWUubWFwKGZ1bmN0aW9uKGRhdGUpe3JldHVybiBwaWNrZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19EQVRFX0ZPUk1BVFRFUihkYXRlLGZvcm1hdCk7fSk7fSxwYXJzZXI6ZnVuY3Rpb24gcGFyc2VyKHZhbHVlLGZvcm1hdCl7cmV0dXJuKHR5cGVvZiB2YWx1ZT09PSdzdHJpbmcnP3ZhbHVlLnNwbGl0KCcsICcpOnZhbHVlKS5tYXAoZnVuY3Rpb24oZGF0ZSl7cmV0dXJuIGRhdGUgaW5zdGFuY2VvZiBEYXRlP2RhdGU6cGlja2VydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfREFURV9QQVJTRVIoZGF0ZSxmb3JtYXQpO30pO319fTt2YXIgUExBQ0VNRU5UX01BUD17bGVmdDonYm90dG9tLXN0YXJ0JyxjZW50ZXI6J2JvdHRvbScscmlnaHQ6J2JvdHRvbS1lbmQnfTt2YXIgcGFyc2VBc0Zvcm1hdEFuZFR5cGU9ZnVuY3Rpb24gcGFyc2VBc0Zvcm1hdEFuZFR5cGUodmFsdWUsY3VzdG9tRm9ybWF0LHR5cGUpe3ZhciByYW5nZVNlcGFyYXRvcj1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbM106Jy0nO2lmKCF2YWx1ZSlyZXR1cm4gbnVsbDt2YXIgcGFyc2VyPShUWVBFX1ZBTFVFX1JFU09MVkVSX01BUFt0eXBlXXx8VFlQRV9WQUxVRV9SRVNPTFZFUl9NQVBbJ2RlZmF1bHQnXSkucGFyc2VyO3ZhciBmb3JtYXQ9Y3VzdG9tRm9ybWF0fHxERUZBVUxUX0ZPUk1BVFNbdHlwZV07cmV0dXJuIHBhcnNlcih2YWx1ZSxmb3JtYXQscmFuZ2VTZXBhcmF0b3IpO307dmFyIGZvcm1hdEFzRm9ybWF0QW5kVHlwZT1mdW5jdGlvbiBmb3JtYXRBc0Zvcm1hdEFuZFR5cGUodmFsdWUsY3VzdG9tRm9ybWF0LHR5cGUpe2lmKCF2YWx1ZSlyZXR1cm4gbnVsbDt2YXIgZm9ybWF0dGVyPShUWVBFX1ZBTFVFX1JFU09MVkVSX01BUFt0eXBlXXx8VFlQRV9WQUxVRV9SRVNPTFZFUl9NQVBbJ2RlZmF1bHQnXSkuZm9ybWF0dGVyO3ZhciBmb3JtYXQ9Y3VzdG9tRm9ybWF0fHxERUZBVUxUX0ZPUk1BVFNbdHlwZV07cmV0dXJuIGZvcm1hdHRlcih2YWx1ZSxmb3JtYXQpO307LyoKICogQ29uc2lkZXJzOgogKiAgIDEuIERhdGUgb2JqZWN0CiAqICAgMi4gZGF0ZSBzdHJpbmcKICogICAzLiBhcnJheSBvZiAxIG9yIDIKICovdmFyIHZhbHVlRXF1YWxzPWZ1bmN0aW9uIHZhbHVlRXF1YWxzKGEsYil7Ly8gY29uc2lkZXJzIERhdGUgb2JqZWN0IGFuZCBzdHJpbmcKdmFyIGRhdGVFcXVhbHM9ZnVuY3Rpb24gZGF0ZUVxdWFscyhhLGIpe3ZhciBhSXNEYXRlPWEgaW5zdGFuY2VvZiBEYXRlO3ZhciBiSXNEYXRlPWIgaW5zdGFuY2VvZiBEYXRlO2lmKGFJc0RhdGUmJmJJc0RhdGUpe3JldHVybiBhLmdldFRpbWUoKT09PWIuZ2V0VGltZSgpO31pZighYUlzRGF0ZSYmIWJJc0RhdGUpe3JldHVybiBhPT09Yjt9cmV0dXJuIGZhbHNlO307dmFyIGFJc0FycmF5PWEgaW5zdGFuY2VvZiBBcnJheTt2YXIgYklzQXJyYXk9YiBpbnN0YW5jZW9mIEFycmF5O2lmKGFJc0FycmF5JiZiSXNBcnJheSl7aWYoYS5sZW5ndGghPT1iLmxlbmd0aCl7cmV0dXJuIGZhbHNlO31yZXR1cm4gYS5ldmVyeShmdW5jdGlvbihpdGVtLGluZGV4KXtyZXR1cm4gZGF0ZUVxdWFscyhpdGVtLGJbaW5kZXhdKTt9KTt9aWYoIWFJc0FycmF5JiYhYklzQXJyYXkpe3JldHVybiBkYXRlRXF1YWxzKGEsYik7fXJldHVybiBmYWxzZTt9O3ZhciBpc1N0cmluZz1mdW5jdGlvbiBpc1N0cmluZyh2YWwpe3JldHVybiB0eXBlb2YgdmFsPT09J3N0cmluZyd8fHZhbCBpbnN0YW5jZW9mIFN0cmluZzt9O3ZhciBwaWNrZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc192YWxpZGF0b3I9ZnVuY3Rpb24gdmFsaWRhdG9yKHZhbCl7Ly8gZWl0aGVyOiBTdHJpbmcsIEFycmF5IG9mIFN0cmluZywgbnVsbCAvIHVuZGVmaW5lZApyZXR1cm4gdmFsPT09bnVsbHx8dmFsPT09dW5kZWZpbmVkfHxpc1N0cmluZyh2YWwpfHxBcnJheS5pc0FycmF5KHZhbCkmJnZhbC5sZW5ndGg9PT0yJiZ2YWwuZXZlcnkoaXNTdHJpbmcpO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwaWNrZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e21peGluczpbZW1pdHRlcl9kZWZhdWx0LmEsTmV3UG9wcGVyXSxpbmplY3Q6e2VsRm9ybTp7ZGVmYXVsdDonJ30sZWxGb3JtSXRlbTp7ZGVmYXVsdDonJ319LHByb3BzOntzaXplOlN0cmluZyxmb3JtYXQ6U3RyaW5nLHZhbHVlRm9ybWF0OlN0cmluZyxyZWFkb25seTpCb29sZWFuLHBsYWNlaG9sZGVyOlN0cmluZyxzdGFydFBsYWNlaG9sZGVyOlN0cmluZyxlbmRQbGFjZWhvbGRlcjpTdHJpbmcscHJlZml4SWNvbjpTdHJpbmcsY2xlYXJJY29uOnt0eXBlOlN0cmluZyxkZWZhdWx0OidlbC1pY29uLWNpcmNsZS1jbG9zZSd9LG5hbWU6e2RlZmF1bHQ6JycsdmFsaWRhdG9yOnBpY2tlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX3ZhbGlkYXRvcn0sZGlzYWJsZWQ6Qm9vbGVhbixjbGVhcmFibGU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OnRydWV9LGlkOntkZWZhdWx0OicnLHZhbGlkYXRvcjpwaWNrZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc192YWxpZGF0b3J9LHBvcHBlckNsYXNzOlN0cmluZyxlZGl0YWJsZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6dHJ1ZX0sYWxpZ246e3R5cGU6U3RyaW5nLGRlZmF1bHQ6J2xlZnQnfSx2YWx1ZTp7fSxkZWZhdWx0VmFsdWU6e30sZGVmYXVsdFRpbWU6e30scmFuZ2VTZXBhcmF0b3I6e2RlZmF1bHQ6Jy0nfSxwaWNrZXJPcHRpb25zOnt9LHVubGlua1BhbmVsczpCb29sZWFuLHZhbGlkYXRlRXZlbnQ6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OnRydWV9fSxjb21wb25lbnRzOntFbElucHV0OmlucHV0X2RlZmF1bHQuYX0sZGlyZWN0aXZlczp7Q2xpY2tvdXRzaWRlOmNsaWNrb3V0c2lkZV9kZWZhdWx0LmF9LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybntwaWNrZXJWaXNpYmxlOmZhbHNlLHNob3dDbG9zZTpmYWxzZSx1c2VySW5wdXQ6bnVsbCx2YWx1ZU9uT3BlbjpudWxsLC8vIHZhbHVlIHdoZW4gcGlja2VyIG9wZW5zLCB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIGVtaXQgY2hhbmdlCnVud2F0Y2hQaWNrZXJPcHRpb25zOm51bGx9O30sd2F0Y2g6e3BpY2tlclZpc2libGU6ZnVuY3Rpb24gcGlja2VyVmlzaWJsZSh2YWwpe2lmKHRoaXMucmVhZG9ubHl8fHRoaXMucGlja2VyRGlzYWJsZWQpcmV0dXJuO2lmKHZhbCl7dGhpcy5zaG93UGlja2VyKCk7dGhpcy52YWx1ZU9uT3Blbj1BcnJheS5pc0FycmF5KHRoaXMudmFsdWUpP1tdLmNvbmNhdCh0aGlzLnZhbHVlKTp0aGlzLnZhbHVlO31lbHNle3RoaXMuaGlkZVBpY2tlcigpO3RoaXMuZW1pdENoYW5nZSh0aGlzLnZhbHVlKTt0aGlzLnVzZXJJbnB1dD1udWxsO2lmKHRoaXMudmFsaWRhdGVFdmVudCl7dGhpcy5kaXNwYXRjaCgnRWxGb3JtSXRlbScsJ2VsLmZvcm0uYmx1cicpO310aGlzLiRlbWl0KCdibHVyJyx0aGlzKTt0aGlzLmJsdXIoKTt9fSxwYXJzZWRWYWx1ZTp7aW1tZWRpYXRlOnRydWUsaGFuZGxlcjpmdW5jdGlvbiBoYW5kbGVyKHZhbCl7aWYodGhpcy5waWNrZXIpe3RoaXMucGlja2VyLnZhbHVlPXZhbDt9fX0sZGVmYXVsdFZhbHVlOmZ1bmN0aW9uIGRlZmF1bHRWYWx1ZSh2YWwpey8vIE5PVEU6IHNob3VsZCBldmVudHVhbGx5IG1vdmUgdG8ganN4IHN0eWxlIHBpY2tlciArIHBhbmVsID8KaWYodGhpcy5waWNrZXIpe3RoaXMucGlja2VyLmRlZmF1bHRWYWx1ZT12YWw7fX0sdmFsdWU6ZnVuY3Rpb24gdmFsdWUodmFsLG9sZFZhbCl7aWYoIXZhbHVlRXF1YWxzKHZhbCxvbGRWYWwpJiYhdGhpcy5waWNrZXJWaXNpYmxlJiZ0aGlzLnZhbGlkYXRlRXZlbnQpe3RoaXMuZGlzcGF0Y2goJ0VsRm9ybUl0ZW0nLCdlbC5mb3JtLmNoYW5nZScsdmFsKTt9fX0sY29tcHV0ZWQ6e3JhbmdlZDpmdW5jdGlvbiByYW5nZWQoKXtyZXR1cm4gdGhpcy50eXBlLmluZGV4T2YoJ3JhbmdlJyk+LTE7fSxyZWZlcmVuY2U6ZnVuY3Rpb24gcmVmZXJlbmNlKCl7dmFyIHJlZmVyZW5jZT10aGlzLiRyZWZzLnJlZmVyZW5jZTtyZXR1cm4gcmVmZXJlbmNlLiRlbHx8cmVmZXJlbmNlO30scmVmSW5wdXQ6ZnVuY3Rpb24gcmVmSW5wdXQoKXtpZih0aGlzLnJlZmVyZW5jZSl7cmV0dXJuW10uc2xpY2UuY2FsbCh0aGlzLnJlZmVyZW5jZS5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCcpKTt9cmV0dXJuW107fSx2YWx1ZUlzRW1wdHk6ZnVuY3Rpb24gdmFsdWVJc0VtcHR5KCl7dmFyIHZhbD10aGlzLnZhbHVlO2lmKEFycmF5LmlzQXJyYXkodmFsKSl7Zm9yKHZhciBpPTAsbGVuPXZhbC5sZW5ndGg7aTxsZW47aSsrKXtpZih2YWxbaV0pe3JldHVybiBmYWxzZTt9fX1lbHNle2lmKHZhbCl7cmV0dXJuIGZhbHNlO319cmV0dXJuIHRydWU7fSx0cmlnZ2VyQ2xhc3M6ZnVuY3Rpb24gdHJpZ2dlckNsYXNzKCl7cmV0dXJuIHRoaXMucHJlZml4SWNvbnx8KHRoaXMudHlwZS5pbmRleE9mKCd0aW1lJykhPT0tMT8nZWwtaWNvbi10aW1lJzonZWwtaWNvbi1kYXRlJyk7fSxzZWxlY3Rpb25Nb2RlOmZ1bmN0aW9uIHNlbGVjdGlvbk1vZGUoKXtpZih0aGlzLnR5cGU9PT0nd2Vlaycpe3JldHVybid3ZWVrJzt9ZWxzZSBpZih0aGlzLnR5cGU9PT0nbW9udGgnKXtyZXR1cm4nbW9udGgnO31lbHNlIGlmKHRoaXMudHlwZT09PSd5ZWFyJyl7cmV0dXJuJ3llYXInO31lbHNlIGlmKHRoaXMudHlwZT09PSdkYXRlcycpe3JldHVybidkYXRlcyc7fXJldHVybidkYXknO30saGF2ZVRyaWdnZXI6ZnVuY3Rpb24gaGF2ZVRyaWdnZXIoKXtpZih0eXBlb2YgdGhpcy5zaG93VHJpZ2dlciE9PSd1bmRlZmluZWQnKXtyZXR1cm4gdGhpcy5zaG93VHJpZ2dlcjt9cmV0dXJuIEhBVkVfVFJJR0dFUl9UWVBFUy5pbmRleE9mKHRoaXMudHlwZSkhPT0tMTt9LGRpc3BsYXlWYWx1ZTpmdW5jdGlvbiBkaXNwbGF5VmFsdWUoKXt2YXIgZm9ybWF0dGVkVmFsdWU9Zm9ybWF0QXNGb3JtYXRBbmRUeXBlKHRoaXMucGFyc2VkVmFsdWUsdGhpcy5mb3JtYXQsdGhpcy50eXBlLHRoaXMucmFuZ2VTZXBhcmF0b3IpO2lmKEFycmF5LmlzQXJyYXkodGhpcy51c2VySW5wdXQpKXtyZXR1cm5bdGhpcy51c2VySW5wdXRbMF18fGZvcm1hdHRlZFZhbHVlJiZmb3JtYXR0ZWRWYWx1ZVswXXx8JycsdGhpcy51c2VySW5wdXRbMV18fGZvcm1hdHRlZFZhbHVlJiZmb3JtYXR0ZWRWYWx1ZVsxXXx8JyddO31lbHNlIGlmKHRoaXMudXNlcklucHV0IT09bnVsbCl7cmV0dXJuIHRoaXMudXNlcklucHV0O31lbHNlIGlmKGZvcm1hdHRlZFZhbHVlKXtyZXR1cm4gdGhpcy50eXBlPT09J2RhdGVzJz9mb3JtYXR0ZWRWYWx1ZS5qb2luKCcsICcpOmZvcm1hdHRlZFZhbHVlO31lbHNle3JldHVybicnO319LHBhcnNlZFZhbHVlOmZ1bmN0aW9uIHBhcnNlZFZhbHVlKCl7aWYoIXRoaXMudmFsdWUpcmV0dXJuIHRoaXMudmFsdWU7Ly8gY29tcG9uZW50IHZhbHVlIGlzIG5vdCBzZXQKaWYodGhpcy50eXBlPT09J3RpbWUtc2VsZWN0JylyZXR1cm4gdGhpcy52YWx1ZTsvLyB0aW1lLXNlbGVjdCBkb2VzIG5vdCByZXF1aXJlIHBhcnNpbmcsIHRoaXMgbWlnaHQgY2hhbmdlIGluIG5leHQgbWFqb3IgdmVyc2lvbgp2YXIgdmFsdWVJc0RhdGVPYmplY3Q9T2JqZWN0KGRhdGVfdXRpbF9bImlzRGF0ZU9iamVjdCJdKSh0aGlzLnZhbHVlKXx8QXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSYmdGhpcy52YWx1ZS5ldmVyeShkYXRlX3V0aWxfWyJpc0RhdGVPYmplY3QiXSk7aWYodmFsdWVJc0RhdGVPYmplY3Qpe3JldHVybiB0aGlzLnZhbHVlO31pZih0aGlzLnZhbHVlRm9ybWF0KXtyZXR1cm4gcGFyc2VBc0Zvcm1hdEFuZFR5cGUodGhpcy52YWx1ZSx0aGlzLnZhbHVlRm9ybWF0LHRoaXMudHlwZSx0aGlzLnJhbmdlU2VwYXJhdG9yKXx8dGhpcy52YWx1ZTt9Ly8gTk9URTogZGVhbCB3aXRoIGNvbW1vbiBidXQgaW5jb3JyZWN0IHVzYWdlLCBzaG91bGQgcmVtb3ZlIGluIG5leHQgbWFqb3IgdmVyc2lvbgovLyB1c2VyIG1pZ2h0IHByb3ZpZGUgc3RyaW5nIC8gdGltZXN0YW1wIHdpdGhvdXQgdmFsdWUtZm9ybWF0LCBjb2VyY2UgdGhlbSBpbnRvIGRhdGUgKG9yIGFycmF5IG9mIGRhdGUpCnJldHVybiBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpP3RoaXMudmFsdWUubWFwKGZ1bmN0aW9uKHZhbCl7cmV0dXJuIG5ldyBEYXRlKHZhbCk7fSk6bmV3IERhdGUodGhpcy52YWx1ZSk7fSxfZWxGb3JtSXRlbVNpemU6ZnVuY3Rpb24gX2VsRm9ybUl0ZW1TaXplKCl7cmV0dXJuKHRoaXMuZWxGb3JtSXRlbXx8e30pLmVsRm9ybUl0ZW1TaXplO30scGlja2VyU2l6ZTpmdW5jdGlvbiBwaWNrZXJTaXplKCl7cmV0dXJuIHRoaXMuc2l6ZXx8dGhpcy5fZWxGb3JtSXRlbVNpemV8fCh0aGlzLiRFTEVNRU5UfHx7fSkuc2l6ZTt9LHBpY2tlckRpc2FibGVkOmZ1bmN0aW9uIHBpY2tlckRpc2FibGVkKCl7cmV0dXJuIHRoaXMuZGlzYWJsZWR8fCh0aGlzLmVsRm9ybXx8e30pLmRpc2FibGVkO30sZmlyc3RJbnB1dElkOmZ1bmN0aW9uIGZpcnN0SW5wdXRJZCgpe3ZhciBvYmo9e307dmFyIGlkPXZvaWQgMDtpZih0aGlzLnJhbmdlZCl7aWQ9dGhpcy5pZCYmdGhpcy5pZFswXTt9ZWxzZXtpZD10aGlzLmlkO31pZihpZClvYmouaWQ9aWQ7cmV0dXJuIG9iajt9LHNlY29uZElucHV0SWQ6ZnVuY3Rpb24gc2Vjb25kSW5wdXRJZCgpe3ZhciBvYmo9e307dmFyIGlkPXZvaWQgMDtpZih0aGlzLnJhbmdlZCl7aWQ9dGhpcy5pZCYmdGhpcy5pZFsxXTt9aWYoaWQpb2JqLmlkPWlkO3JldHVybiBvYmo7fX0sY3JlYXRlZDpmdW5jdGlvbiBjcmVhdGVkKCl7Ly8gdnVlLXBvcHBlcgp0aGlzLnBvcHBlck9wdGlvbnM9e2JvdW5kYXJpZXNQYWRkaW5nOjAsZ3B1QWNjZWxlcmF0aW9uOmZhbHNlfTt0aGlzLnBsYWNlbWVudD1QTEFDRU1FTlRfTUFQW3RoaXMuYWxpZ25dfHxQTEFDRU1FTlRfTUFQLmxlZnQ7dGhpcy4kb24oJ2ZpZWxkUmVzZXQnLHRoaXMuaGFuZGxlRmllbGRSZXNldCk7fSxtZXRob2RzOntmb2N1czpmdW5jdGlvbiBmb2N1cygpe2lmKCF0aGlzLnJhbmdlZCl7dGhpcy4kcmVmcy5yZWZlcmVuY2UuZm9jdXMoKTt9ZWxzZXt0aGlzLmhhbmRsZUZvY3VzKCk7fX0sYmx1cjpmdW5jdGlvbiBibHVyKCl7dGhpcy5yZWZJbnB1dC5mb3JFYWNoKGZ1bmN0aW9uKGlucHV0KXtyZXR1cm4gaW5wdXQuYmx1cigpO30pO30sLy8ge3BhcnNlLCBmb3JtYXRUb30gVmFsdWUgZGVhbHMgbWFwcyBjb21wb25lbnQgdmFsdWUgd2l0aCBpbnRlcm5hbCBEYXRlCnBhcnNlVmFsdWU6ZnVuY3Rpb24gcGFyc2VWYWx1ZSh2YWx1ZSl7dmFyIGlzUGFyc2VkPU9iamVjdChkYXRlX3V0aWxfWyJpc0RhdGVPYmplY3QiXSkodmFsdWUpfHxBcnJheS5pc0FycmF5KHZhbHVlKSYmdmFsdWUuZXZlcnkoZGF0ZV91dGlsX1siaXNEYXRlT2JqZWN0Il0pO2lmKHRoaXMudmFsdWVGb3JtYXQmJiFpc1BhcnNlZCl7cmV0dXJuIHBhcnNlQXNGb3JtYXRBbmRUeXBlKHZhbHVlLHRoaXMudmFsdWVGb3JtYXQsdGhpcy50eXBlLHRoaXMucmFuZ2VTZXBhcmF0b3IpfHx2YWx1ZTt9ZWxzZXtyZXR1cm4gdmFsdWU7fX0sZm9ybWF0VG9WYWx1ZTpmdW5jdGlvbiBmb3JtYXRUb1ZhbHVlKGRhdGUpe3ZhciBpc0Zvcm1hdHRhYmxlPU9iamVjdChkYXRlX3V0aWxfWyJpc0RhdGVPYmplY3QiXSkoZGF0ZSl8fEFycmF5LmlzQXJyYXkoZGF0ZSkmJmRhdGUuZXZlcnkoZGF0ZV91dGlsX1siaXNEYXRlT2JqZWN0Il0pO2lmKHRoaXMudmFsdWVGb3JtYXQmJmlzRm9ybWF0dGFibGUpe3JldHVybiBmb3JtYXRBc0Zvcm1hdEFuZFR5cGUoZGF0ZSx0aGlzLnZhbHVlRm9ybWF0LHRoaXMudHlwZSx0aGlzLnJhbmdlU2VwYXJhdG9yKTt9ZWxzZXtyZXR1cm4gZGF0ZTt9fSwvLyB7cGFyc2UsIGZvcm1hdFRvfSBTdHJpbmcgZGVhbHMgd2l0aCB1c2VyIGlucHV0CnBhcnNlU3RyaW5nOmZ1bmN0aW9uIHBhcnNlU3RyaW5nKHZhbHVlKXt2YXIgdHlwZT1BcnJheS5pc0FycmF5KHZhbHVlKT90aGlzLnR5cGU6dGhpcy50eXBlLnJlcGxhY2UoJ3JhbmdlJywnJyk7cmV0dXJuIHBhcnNlQXNGb3JtYXRBbmRUeXBlKHZhbHVlLHRoaXMuZm9ybWF0LHR5cGUpO30sZm9ybWF0VG9TdHJpbmc6ZnVuY3Rpb24gZm9ybWF0VG9TdHJpbmcodmFsdWUpe3ZhciB0eXBlPUFycmF5LmlzQXJyYXkodmFsdWUpP3RoaXMudHlwZTp0aGlzLnR5cGUucmVwbGFjZSgncmFuZ2UnLCcnKTtyZXR1cm4gZm9ybWF0QXNGb3JtYXRBbmRUeXBlKHZhbHVlLHRoaXMuZm9ybWF0LHR5cGUpO30saGFuZGxlTW91c2VFbnRlcjpmdW5jdGlvbiBoYW5kbGVNb3VzZUVudGVyKCl7aWYodGhpcy5yZWFkb25seXx8dGhpcy5waWNrZXJEaXNhYmxlZClyZXR1cm47aWYoIXRoaXMudmFsdWVJc0VtcHR5JiZ0aGlzLmNsZWFyYWJsZSl7dGhpcy5zaG93Q2xvc2U9dHJ1ZTt9fSxoYW5kbGVDaGFuZ2U6ZnVuY3Rpb24gaGFuZGxlQ2hhbmdlKCl7aWYodGhpcy51c2VySW5wdXQpe3ZhciB2YWx1ZT10aGlzLnBhcnNlU3RyaW5nKHRoaXMuZGlzcGxheVZhbHVlKTtpZih2YWx1ZSl7dGhpcy5waWNrZXIudmFsdWU9dmFsdWU7aWYodGhpcy5pc1ZhbGlkVmFsdWUodmFsdWUpKXt0aGlzLmVtaXRJbnB1dCh2YWx1ZSk7dGhpcy51c2VySW5wdXQ9bnVsbDt9fX1pZih0aGlzLnVzZXJJbnB1dD09PScnKXt0aGlzLmVtaXRJbnB1dChudWxsKTt0aGlzLmVtaXRDaGFuZ2UobnVsbCk7dGhpcy51c2VySW5wdXQ9bnVsbDt9fSxoYW5kbGVTdGFydElucHV0OmZ1bmN0aW9uIGhhbmRsZVN0YXJ0SW5wdXQoZXZlbnQpe2lmKHRoaXMudXNlcklucHV0KXt0aGlzLnVzZXJJbnB1dD1bZXZlbnQudGFyZ2V0LnZhbHVlLHRoaXMudXNlcklucHV0WzFdXTt9ZWxzZXt0aGlzLnVzZXJJbnB1dD1bZXZlbnQudGFyZ2V0LnZhbHVlLG51bGxdO319LGhhbmRsZUVuZElucHV0OmZ1bmN0aW9uIGhhbmRsZUVuZElucHV0KGV2ZW50KXtpZih0aGlzLnVzZXJJbnB1dCl7dGhpcy51c2VySW5wdXQ9W3RoaXMudXNlcklucHV0WzBdLGV2ZW50LnRhcmdldC52YWx1ZV07fWVsc2V7dGhpcy51c2VySW5wdXQ9W251bGwsZXZlbnQudGFyZ2V0LnZhbHVlXTt9fSxoYW5kbGVTdGFydENoYW5nZTpmdW5jdGlvbiBoYW5kbGVTdGFydENoYW5nZShldmVudCl7dmFyIHZhbHVlPXRoaXMucGFyc2VTdHJpbmcodGhpcy51c2VySW5wdXQmJnRoaXMudXNlcklucHV0WzBdKTtpZih2YWx1ZSl7dGhpcy51c2VySW5wdXQ9W3RoaXMuZm9ybWF0VG9TdHJpbmcodmFsdWUpLHRoaXMuZGlzcGxheVZhbHVlWzFdXTt2YXIgbmV3VmFsdWU9W3ZhbHVlLHRoaXMucGlja2VyLnZhbHVlJiZ0aGlzLnBpY2tlci52YWx1ZVsxXV07dGhpcy5waWNrZXIudmFsdWU9bmV3VmFsdWU7aWYodGhpcy5pc1ZhbGlkVmFsdWUobmV3VmFsdWUpKXt0aGlzLmVtaXRJbnB1dChuZXdWYWx1ZSk7dGhpcy51c2VySW5wdXQ9bnVsbDt9fX0saGFuZGxlRW5kQ2hhbmdlOmZ1bmN0aW9uIGhhbmRsZUVuZENoYW5nZShldmVudCl7dmFyIHZhbHVlPXRoaXMucGFyc2VTdHJpbmcodGhpcy51c2VySW5wdXQmJnRoaXMudXNlcklucHV0WzFdKTtpZih2YWx1ZSl7dGhpcy51c2VySW5wdXQ9W3RoaXMuZGlzcGxheVZhbHVlWzBdLHRoaXMuZm9ybWF0VG9TdHJpbmcodmFsdWUpXTt2YXIgbmV3VmFsdWU9W3RoaXMucGlja2VyLnZhbHVlJiZ0aGlzLnBpY2tlci52YWx1ZVswXSx2YWx1ZV07dGhpcy5waWNrZXIudmFsdWU9bmV3VmFsdWU7aWYodGhpcy5pc1ZhbGlkVmFsdWUobmV3VmFsdWUpKXt0aGlzLmVtaXRJbnB1dChuZXdWYWx1ZSk7dGhpcy51c2VySW5wdXQ9bnVsbDt9fX0saGFuZGxlQ2xpY2tJY29uOmZ1bmN0aW9uIGhhbmRsZUNsaWNrSWNvbihldmVudCl7aWYodGhpcy5yZWFkb25seXx8dGhpcy5waWNrZXJEaXNhYmxlZClyZXR1cm47aWYodGhpcy5zaG93Q2xvc2Upe3RoaXMudmFsdWVPbk9wZW49dGhpcy52YWx1ZTtldmVudC5zdG9wUHJvcGFnYXRpb24oKTt0aGlzLmVtaXRJbnB1dChudWxsKTt0aGlzLmVtaXRDaGFuZ2UobnVsbCk7dGhpcy5zaG93Q2xvc2U9ZmFsc2U7aWYodGhpcy5waWNrZXImJnR5cGVvZiB0aGlzLnBpY2tlci5oYW5kbGVDbGVhcj09PSdmdW5jdGlvbicpe3RoaXMucGlja2VyLmhhbmRsZUNsZWFyKCk7fX1lbHNle3RoaXMucGlja2VyVmlzaWJsZT0hdGhpcy5waWNrZXJWaXNpYmxlO319LGhhbmRsZUNsb3NlOmZ1bmN0aW9uIGhhbmRsZUNsb3NlKCl7aWYoIXRoaXMucGlja2VyVmlzaWJsZSlyZXR1cm47dGhpcy5waWNrZXJWaXNpYmxlPWZhbHNlO2lmKHRoaXMudHlwZT09PSdkYXRlcycpey8vIHJlc3RvcmUgdG8gZm9ybWVyIHZhbHVlCnZhciBvbGRWYWx1ZT1wYXJzZUFzRm9ybWF0QW5kVHlwZSh0aGlzLnZhbHVlT25PcGVuLHRoaXMudmFsdWVGb3JtYXQsdGhpcy50eXBlLHRoaXMucmFuZ2VTZXBhcmF0b3IpfHx0aGlzLnZhbHVlT25PcGVuO3RoaXMuZW1pdElucHV0KG9sZFZhbHVlKTt9fSxoYW5kbGVGaWVsZFJlc2V0OmZ1bmN0aW9uIGhhbmRsZUZpZWxkUmVzZXQoaW5pdGlhbFZhbHVlKXt0aGlzLnVzZXJJbnB1dD1pbml0aWFsVmFsdWU9PT0nJz9udWxsOmluaXRpYWxWYWx1ZTt9LGhhbmRsZUZvY3VzOmZ1bmN0aW9uIGhhbmRsZUZvY3VzKCl7dmFyIHR5cGU9dGhpcy50eXBlO2lmKEhBVkVfVFJJR0dFUl9UWVBFUy5pbmRleE9mKHR5cGUpIT09LTEmJiF0aGlzLnBpY2tlclZpc2libGUpe3RoaXMucGlja2VyVmlzaWJsZT10cnVlO310aGlzLiRlbWl0KCdmb2N1cycsdGhpcyk7fSxoYW5kbGVLZXlkb3duOmZ1bmN0aW9uIGhhbmRsZUtleWRvd24oZXZlbnQpe3ZhciBfdGhpcz10aGlzO3ZhciBrZXlDb2RlPWV2ZW50LmtleUNvZGU7Ly8gRVNDCmlmKGtleUNvZGU9PT0yNyl7dGhpcy5waWNrZXJWaXNpYmxlPWZhbHNlO2V2ZW50LnN0b3BQcm9wYWdhdGlvbigpO3JldHVybjt9Ly8gVGFiCmlmKGtleUNvZGU9PT05KXtpZighdGhpcy5yYW5nZWQpe3RoaXMuaGFuZGxlQ2hhbmdlKCk7dGhpcy5waWNrZXJWaXNpYmxlPXRoaXMucGlja2VyLnZpc2libGU9ZmFsc2U7dGhpcy5ibHVyKCk7ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7fWVsc2V7Ly8gdXNlciBtYXkgY2hhbmdlIGZvY3VzIGJldHdlZW4gdHdvIGlucHV0CnNldFRpbWVvdXQoZnVuY3Rpb24oKXtpZihfdGhpcy5yZWZJbnB1dC5pbmRleE9mKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpPT09LTEpe190aGlzLnBpY2tlclZpc2libGU9ZmFsc2U7X3RoaXMuYmx1cigpO2V2ZW50LnN0b3BQcm9wYWdhdGlvbigpO319LDApO31yZXR1cm47fS8vIEVudGVyCmlmKGtleUNvZGU9PT0xMyl7aWYodGhpcy51c2VySW5wdXQ9PT0nJ3x8dGhpcy5pc1ZhbGlkVmFsdWUodGhpcy5wYXJzZVN0cmluZyh0aGlzLmRpc3BsYXlWYWx1ZSkpKXt0aGlzLmhhbmRsZUNoYW5nZSgpO3RoaXMucGlja2VyVmlzaWJsZT10aGlzLnBpY2tlci52aXNpYmxlPWZhbHNlO3RoaXMuYmx1cigpO31ldmVudC5zdG9wUHJvcGFnYXRpb24oKTtyZXR1cm47fS8vIGlmIHVzZXIgaXMgdHlwaW5nLCBkbyBub3QgbGV0IHBpY2tlciBoYW5kbGUga2V5IGlucHV0CmlmKHRoaXMudXNlcklucHV0KXtldmVudC5zdG9wUHJvcGFnYXRpb24oKTtyZXR1cm47fS8vIGRlbGVnYXRlIG90aGVyIGtleXMgdG8gcGFuZWwKaWYodGhpcy5waWNrZXImJnRoaXMucGlja2VyLmhhbmRsZUtleWRvd24pe3RoaXMucGlja2VyLmhhbmRsZUtleWRvd24oZXZlbnQpO319LGhhbmRsZVJhbmdlQ2xpY2s6ZnVuY3Rpb24gaGFuZGxlUmFuZ2VDbGljaygpe3ZhciB0eXBlPXRoaXMudHlwZTtpZihIQVZFX1RSSUdHRVJfVFlQRVMuaW5kZXhPZih0eXBlKSE9PS0xJiYhdGhpcy5waWNrZXJWaXNpYmxlKXt0aGlzLnBpY2tlclZpc2libGU9dHJ1ZTt9dGhpcy4kZW1pdCgnZm9jdXMnLHRoaXMpO30saGlkZVBpY2tlcjpmdW5jdGlvbiBoaWRlUGlja2VyKCl7aWYodGhpcy5waWNrZXIpe3RoaXMucGlja2VyLnJlc2V0VmlldyYmdGhpcy5waWNrZXIucmVzZXRWaWV3KCk7dGhpcy5waWNrZXJWaXNpYmxlPXRoaXMucGlja2VyLnZpc2libGU9ZmFsc2U7dGhpcy5kZXN0cm95UG9wcGVyKCk7fX0sc2hvd1BpY2tlcjpmdW5jdGlvbiBzaG93UGlja2VyKCl7dmFyIF90aGlzMj10aGlzO2lmKHRoaXMuJGlzU2VydmVyKXJldHVybjtpZighdGhpcy5waWNrZXIpe3RoaXMubW91bnRQaWNrZXIoKTt9dGhpcy5waWNrZXJWaXNpYmxlPXRoaXMucGlja2VyLnZpc2libGU9dHJ1ZTt0aGlzLnVwZGF0ZVBvcHBlcigpO3RoaXMucGlja2VyLnZhbHVlPXRoaXMucGFyc2VkVmFsdWU7dGhpcy5waWNrZXIucmVzZXRWaWV3JiZ0aGlzLnBpY2tlci5yZXNldFZpZXcoKTt0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe190aGlzMi5waWNrZXIuYWRqdXN0U3Bpbm5lcnMmJl90aGlzMi5waWNrZXIuYWRqdXN0U3Bpbm5lcnMoKTt9KTt9LG1vdW50UGlja2VyOmZ1bmN0aW9uIG1vdW50UGlja2VyKCl7dmFyIF90aGlzMz10aGlzO3RoaXMucGlja2VyPW5ldyBleHRlcm5hbF92dWVfZGVmYXVsdC5hKHRoaXMucGFuZWwpLiRtb3VudCgpO3RoaXMucGlja2VyLmRlZmF1bHRWYWx1ZT10aGlzLmRlZmF1bHRWYWx1ZTt0aGlzLnBpY2tlci5kZWZhdWx0VGltZT10aGlzLmRlZmF1bHRUaW1lO3RoaXMucGlja2VyLnBvcHBlckNsYXNzPXRoaXMucG9wcGVyQ2xhc3M7dGhpcy5wb3BwZXJFbG09dGhpcy5waWNrZXIuJGVsO3RoaXMucGlja2VyLndpZHRoPXRoaXMucmVmZXJlbmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO3RoaXMucGlja2VyLnNob3dUaW1lPXRoaXMudHlwZT09PSdkYXRldGltZSd8fHRoaXMudHlwZT09PSdkYXRldGltZXJhbmdlJzt0aGlzLnBpY2tlci5zZWxlY3Rpb25Nb2RlPXRoaXMuc2VsZWN0aW9uTW9kZTt0aGlzLnBpY2tlci51bmxpbmtQYW5lbHM9dGhpcy51bmxpbmtQYW5lbHM7dGhpcy5waWNrZXIuYXJyb3dDb250cm9sPXRoaXMuYXJyb3dDb250cm9sfHx0aGlzLnRpbWVBcnJvd0NvbnRyb2x8fGZhbHNlO3RoaXMuJHdhdGNoKCdmb3JtYXQnLGZ1bmN0aW9uKGZvcm1hdCl7X3RoaXMzLnBpY2tlci5mb3JtYXQ9Zm9ybWF0O30pO3ZhciB1cGRhdGVPcHRpb25zPWZ1bmN0aW9uIHVwZGF0ZU9wdGlvbnMoKXt2YXIgb3B0aW9ucz1fdGhpczMucGlja2VyT3B0aW9ucztpZihvcHRpb25zJiZvcHRpb25zLnNlbGVjdGFibGVSYW5nZSl7dmFyIHJhbmdlcz1vcHRpb25zLnNlbGVjdGFibGVSYW5nZTt2YXIgcGFyc2VyPVRZUEVfVkFMVUVfUkVTT0xWRVJfTUFQLmRhdGV0aW1lcmFuZ2UucGFyc2VyO3ZhciBmb3JtYXQ9REVGQVVMVF9GT1JNQVRTLnRpbWVyYW5nZTtyYW5nZXM9QXJyYXkuaXNBcnJheShyYW5nZXMpP3JhbmdlczpbcmFuZ2VzXTtfdGhpczMucGlja2VyLnNlbGVjdGFibGVSYW5nZT1yYW5nZXMubWFwKGZ1bmN0aW9uKHJhbmdlKXtyZXR1cm4gcGFyc2VyKHJhbmdlLGZvcm1hdCxfdGhpczMucmFuZ2VTZXBhcmF0b3IpO30pO31mb3IodmFyIG9wdGlvbiBpbiBvcHRpb25zKXtpZihvcHRpb25zLmhhc093blByb3BlcnR5KG9wdGlvbikmJi8vIOW/veeVpSB0aW1lLXBpY2tlciDnmoTor6XphY3nva7pobkKb3B0aW9uIT09J3NlbGVjdGFibGVSYW5nZScpe190aGlzMy5waWNrZXJbb3B0aW9uXT1vcHRpb25zW29wdGlvbl07fX0vLyBtYWluIGZvcm1hdCBtdXN0IHByZXZhaWwgb3ZlciB1bmRvY3VtZW50ZWQgcGlja2VyT3B0aW9ucy5mb3JtYXQKaWYoX3RoaXMzLmZvcm1hdCl7X3RoaXMzLnBpY2tlci5mb3JtYXQ9X3RoaXMzLmZvcm1hdDt9fTt1cGRhdGVPcHRpb25zKCk7dGhpcy51bndhdGNoUGlja2VyT3B0aW9ucz10aGlzLiR3YXRjaCgncGlja2VyT3B0aW9ucycsZnVuY3Rpb24oKXtyZXR1cm4gdXBkYXRlT3B0aW9ucygpO30se2RlZXA6dHJ1ZX0pO3RoaXMuJGVsLmFwcGVuZENoaWxkKHRoaXMucGlja2VyLiRlbCk7dGhpcy5waWNrZXIucmVzZXRWaWV3JiZ0aGlzLnBpY2tlci5yZXNldFZpZXcoKTt0aGlzLnBpY2tlci4kb24oJ2RvZGVzdHJveScsdGhpcy5kb0Rlc3Ryb3kpO3RoaXMucGlja2VyLiRvbigncGljaycsZnVuY3Rpb24oKXt2YXIgZGF0ZT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMF06Jyc7dmFyIHZpc2libGU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOmZhbHNlO190aGlzMy51c2VySW5wdXQ9bnVsbDtfdGhpczMucGlja2VyVmlzaWJsZT1fdGhpczMucGlja2VyLnZpc2libGU9dmlzaWJsZTtfdGhpczMuZW1pdElucHV0KGRhdGUpO190aGlzMy5waWNrZXIucmVzZXRWaWV3JiZfdGhpczMucGlja2VyLnJlc2V0VmlldygpO30pO3RoaXMucGlja2VyLiRvbignc2VsZWN0LXJhbmdlJyxmdW5jdGlvbihzdGFydCxlbmQscG9zKXtpZihfdGhpczMucmVmSW5wdXQubGVuZ3RoPT09MClyZXR1cm47aWYoIXBvc3x8cG9zPT09J21pbicpe190aGlzMy5yZWZJbnB1dFswXS5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCxlbmQpO190aGlzMy5yZWZJbnB1dFswXS5mb2N1cygpO31lbHNlIGlmKHBvcz09PSdtYXgnKXtfdGhpczMucmVmSW5wdXRbMV0uc2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsZW5kKTtfdGhpczMucmVmSW5wdXRbMV0uZm9jdXMoKTt9fSk7fSx1bm1vdW50UGlja2VyOmZ1bmN0aW9uIHVubW91bnRQaWNrZXIoKXtpZih0aGlzLnBpY2tlcil7dGhpcy5waWNrZXIuJGRlc3Ryb3koKTt0aGlzLnBpY2tlci4kb2ZmKCk7aWYodHlwZW9mIHRoaXMudW53YXRjaFBpY2tlck9wdGlvbnM9PT0nZnVuY3Rpb24nKXt0aGlzLnVud2F0Y2hQaWNrZXJPcHRpb25zKCk7fXRoaXMucGlja2VyLiRlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMucGlja2VyLiRlbCk7fX0sZW1pdENoYW5nZTpmdW5jdGlvbiBlbWl0Q2hhbmdlKHZhbCl7Ly8gZGV0ZXJtaW5lIHVzZXIgcmVhbCBjaGFuZ2Ugb25seQppZighdmFsdWVFcXVhbHModmFsLHRoaXMudmFsdWVPbk9wZW4pKXt0aGlzLiRlbWl0KCdjaGFuZ2UnLHZhbCk7dGhpcy52YWx1ZU9uT3Blbj12YWw7aWYodGhpcy52YWxpZGF0ZUV2ZW50KXt0aGlzLmRpc3BhdGNoKCdFbEZvcm1JdGVtJywnZWwuZm9ybS5jaGFuZ2UnLHZhbCk7fX19LGVtaXRJbnB1dDpmdW5jdGlvbiBlbWl0SW5wdXQodmFsKXt2YXIgZm9ybWF0dGVkPXRoaXMuZm9ybWF0VG9WYWx1ZSh2YWwpO2lmKCF2YWx1ZUVxdWFscyh0aGlzLnZhbHVlLGZvcm1hdHRlZCkpe3RoaXMuJGVtaXQoJ2lucHV0Jyxmb3JtYXR0ZWQpO319LGlzVmFsaWRWYWx1ZTpmdW5jdGlvbiBpc1ZhbGlkVmFsdWUodmFsdWUpe2lmKCF0aGlzLnBpY2tlcil7dGhpcy5tb3VudFBpY2tlcigpO31pZih0aGlzLnBpY2tlci5pc1ZhbGlkVmFsdWUpe3JldHVybiB2YWx1ZSYmdGhpcy5waWNrZXIuaXNWYWxpZFZhbHVlKHZhbHVlKTt9ZWxzZXtyZXR1cm4gdHJ1ZTt9fX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BpY2tlci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc3JjX3BpY2tlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz1waWNrZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGlja2VyLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIHBpY2tlcl9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHNyY19waWNrZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18scGlja2VydnVlX3R5cGVfdGVtcGxhdGVfaWRfNzlhZTA2OWZfcmVuZGVyLHBpY2tlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzc5YWUwNjlmX3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgcGlja2VyX2FwaTt9cGlja2VyX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BpY2tlci52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGlja2VyPXBpY2tlcl9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9wYW5lbC9kYXRlLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0yNDQwZDRlYSYKdmFyIGRhdGV2dWVfdHlwZV90ZW1wbGF0ZV9pZF8yNDQwZDRlYV9yZW5kZXI9ZnVuY3Rpb24gZGF0ZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzI0NDBkNGVhX3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygidHJhbnNpdGlvbiIse2F0dHJzOntuYW1lOiJlbC16b29tLWluLXRvcCJ9LG9uOnsiYWZ0ZXItZW50ZXIiOl92bS5oYW5kbGVFbnRlciwiYWZ0ZXItbGVhdmUiOl92bS5oYW5kbGVMZWF2ZX19LFtfYygiZGl2Iix7ZGlyZWN0aXZlczpbe25hbWU6InNob3ciLHJhd05hbWU6InYtc2hvdyIsdmFsdWU6X3ZtLnZpc2libGUsZXhwcmVzc2lvbjoidmlzaWJsZSJ9XSxzdGF0aWNDbGFzczoiZWwtcGlja2VyLXBhbmVsIGVsLWRhdGUtcGlja2VyIGVsLXBvcHBlciIsY2xhc3M6W3siaGFzLXNpZGViYXIiOl92bS4kc2xvdHMuc2lkZWJhcnx8X3ZtLnNob3J0Y3V0cywiaGFzLXRpbWUiOl92bS5zaG93VGltZX0sX3ZtLnBvcHBlckNsYXNzXX0sW19jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtcGlja2VyLXBhbmVsX19ib2R5LXdyYXBwZXIifSxbX3ZtLl90KCJzaWRlYmFyIiksX3ZtLnNob3J0Y3V0cz9fYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXBpY2tlci1wYW5lbF9fc2lkZWJhciJ9LF92bS5fbChfdm0uc2hvcnRjdXRzLGZ1bmN0aW9uKHNob3J0Y3V0LGtleSl7cmV0dXJuIF9jKCJidXR0b24iLHtrZXk6a2V5LHN0YXRpY0NsYXNzOiJlbC1waWNrZXItcGFuZWxfX3Nob3J0Y3V0IixhdHRyczp7dHlwZToiYnV0dG9uIn0sb246e2NsaWNrOmZ1bmN0aW9uIGNsaWNrKCRldmVudCl7X3ZtLmhhbmRsZVNob3J0Y3V0Q2xpY2soc2hvcnRjdXQpO319fSxbX3ZtLl92KF92bS5fcyhzaG9ydGN1dC50ZXh0KSldKTt9KSwwKTpfdm0uX2UoKSxfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXBpY2tlci1wYW5lbF9fYm9keSJ9LFtfdm0uc2hvd1RpbWU/X2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1kYXRlLXBpY2tlcl9fdGltZS1oZWFkZXIifSxbX2MoInNwYW4iLHtzdGF0aWNDbGFzczoiZWwtZGF0ZS1waWNrZXJfX2VkaXRvci13cmFwIn0sW19jKCJlbC1pbnB1dCIse2F0dHJzOntwbGFjZWhvbGRlcjpfdm0udCgiZWwuZGF0ZXBpY2tlci5zZWxlY3REYXRlIiksdmFsdWU6X3ZtLnZpc2libGVEYXRlLHNpemU6InNtYWxsIn0sb246e2lucHV0OmZ1bmN0aW9uIGlucHV0KHZhbCl7cmV0dXJuIF92bS51c2VySW5wdXREYXRlPXZhbDt9LGNoYW5nZTpfdm0uaGFuZGxlVmlzaWJsZURhdGVDaGFuZ2V9fSldLDEpLF9jKCJzcGFuIix7ZGlyZWN0aXZlczpbe25hbWU6ImNsaWNrb3V0c2lkZSIscmF3TmFtZToidi1jbGlja291dHNpZGUiLHZhbHVlOl92bS5oYW5kbGVUaW1lUGlja0Nsb3NlLGV4cHJlc3Npb246ImhhbmRsZVRpbWVQaWNrQ2xvc2UifV0sc3RhdGljQ2xhc3M6ImVsLWRhdGUtcGlja2VyX19lZGl0b3Itd3JhcCJ9LFtfYygiZWwtaW5wdXQiLHtyZWY6ImlucHV0IixhdHRyczp7cGxhY2Vob2xkZXI6X3ZtLnQoImVsLmRhdGVwaWNrZXIuc2VsZWN0VGltZSIpLHZhbHVlOl92bS52aXNpYmxlVGltZSxzaXplOiJzbWFsbCJ9LG9uOntmb2N1czpmdW5jdGlvbiBmb2N1cygkZXZlbnQpe192bS50aW1lUGlja2VyVmlzaWJsZT10cnVlO30saW5wdXQ6ZnVuY3Rpb24gaW5wdXQodmFsKXtyZXR1cm4gX3ZtLnVzZXJJbnB1dFRpbWU9dmFsO30sY2hhbmdlOl92bS5oYW5kbGVWaXNpYmxlVGltZUNoYW5nZX19KSxfYygidGltZS1waWNrZXIiLHtyZWY6InRpbWVwaWNrZXIiLGF0dHJzOnsidGltZS1hcnJvdy1jb250cm9sIjpfdm0uYXJyb3dDb250cm9sLHZpc2libGU6X3ZtLnRpbWVQaWNrZXJWaXNpYmxlfSxvbjp7cGljazpfdm0uaGFuZGxlVGltZVBpY2ssbW91bnRlZDpfdm0ucHJveHlUaW1lUGlja2VyRGF0YVByb3BlcnRpZXN9fSldLDEpXSk6X3ZtLl9lKCksX2MoImRpdiIse2RpcmVjdGl2ZXM6W3tuYW1lOiJzaG93IixyYXdOYW1lOiJ2LXNob3ciLHZhbHVlOl92bS5jdXJyZW50VmlldyE9PSJ0aW1lIixleHByZXNzaW9uOiJjdXJyZW50VmlldyAhPT0gJ3RpbWUnIn1dLHN0YXRpY0NsYXNzOiJlbC1kYXRlLXBpY2tlcl9faGVhZGVyIixjbGFzczp7ImVsLWRhdGUtcGlja2VyX19oZWFkZXItLWJvcmRlcmVkIjpfdm0uY3VycmVudFZpZXc9PT0ieWVhciJ8fF92bS5jdXJyZW50Vmlldz09PSJtb250aCJ9fSxbX2MoImJ1dHRvbiIse3N0YXRpY0NsYXNzOiJlbC1waWNrZXItcGFuZWxfX2ljb24tYnRuIGVsLWRhdGUtcGlja2VyX19wcmV2LWJ0biBlbC1pY29uLWQtYXJyb3ctbGVmdCIsYXR0cnM6e3R5cGU6ImJ1dHRvbiIsImFyaWEtbGFiZWwiOl92bS50KCJlbC5kYXRlcGlja2VyLnByZXZZZWFyIil9LG9uOntjbGljazpfdm0ucHJldlllYXJ9fSksX2MoImJ1dHRvbiIse2RpcmVjdGl2ZXM6W3tuYW1lOiJzaG93IixyYXdOYW1lOiJ2LXNob3ciLHZhbHVlOl92bS5jdXJyZW50Vmlldz09PSJkYXRlIixleHByZXNzaW9uOiJjdXJyZW50VmlldyA9PT0gJ2RhdGUnIn1dLHN0YXRpY0NsYXNzOiJlbC1waWNrZXItcGFuZWxfX2ljb24tYnRuIGVsLWRhdGUtcGlja2VyX19wcmV2LWJ0biBlbC1pY29uLWFycm93LWxlZnQiLGF0dHJzOnt0eXBlOiJidXR0b24iLCJhcmlhLWxhYmVsIjpfdm0udCgiZWwuZGF0ZXBpY2tlci5wcmV2TW9udGgiKX0sb246e2NsaWNrOl92bS5wcmV2TW9udGh9fSksX2MoInNwYW4iLHtzdGF0aWNDbGFzczoiZWwtZGF0ZS1waWNrZXJfX2hlYWRlci1sYWJlbCIsYXR0cnM6e3JvbGU6ImJ1dHRvbiJ9LG9uOntjbGljazpfdm0uc2hvd1llYXJQaWNrZXJ9fSxbX3ZtLl92KF92bS5fcyhfdm0ueWVhckxhYmVsKSldKSxfYygic3BhbiIse2RpcmVjdGl2ZXM6W3tuYW1lOiJzaG93IixyYXdOYW1lOiJ2LXNob3ciLHZhbHVlOl92bS5jdXJyZW50Vmlldz09PSJkYXRlIixleHByZXNzaW9uOiJjdXJyZW50VmlldyA9PT0gJ2RhdGUnIn1dLHN0YXRpY0NsYXNzOiJlbC1kYXRlLXBpY2tlcl9faGVhZGVyLWxhYmVsIixjbGFzczp7YWN0aXZlOl92bS5jdXJyZW50Vmlldz09PSJtb250aCJ9LGF0dHJzOntyb2xlOiJidXR0b24ifSxvbjp7Y2xpY2s6X3ZtLnNob3dNb250aFBpY2tlcn19LFtfdm0uX3YoX3ZtLl9zKF92bS50KCJlbC5kYXRlcGlja2VyLm1vbnRoIisoX3ZtLm1vbnRoKzEpKSkpXSksX2MoImJ1dHRvbiIse3N0YXRpY0NsYXNzOiJlbC1waWNrZXItcGFuZWxfX2ljb24tYnRuIGVsLWRhdGUtcGlja2VyX19uZXh0LWJ0biBlbC1pY29uLWQtYXJyb3ctcmlnaHQiLGF0dHJzOnt0eXBlOiJidXR0b24iLCJhcmlhLWxhYmVsIjpfdm0udCgiZWwuZGF0ZXBpY2tlci5uZXh0WWVhciIpfSxvbjp7Y2xpY2s6X3ZtLm5leHRZZWFyfX0pLF9jKCJidXR0b24iLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTpfdm0uY3VycmVudFZpZXc9PT0iZGF0ZSIsZXhwcmVzc2lvbjoiY3VycmVudFZpZXcgPT09ICdkYXRlJyJ9XSxzdGF0aWNDbGFzczoiZWwtcGlja2VyLXBhbmVsX19pY29uLWJ0biBlbC1kYXRlLXBpY2tlcl9fbmV4dC1idG4gZWwtaWNvbi1hcnJvdy1yaWdodCIsYXR0cnM6e3R5cGU6ImJ1dHRvbiIsImFyaWEtbGFiZWwiOl92bS50KCJlbC5kYXRlcGlja2VyLm5leHRNb250aCIpfSxvbjp7Y2xpY2s6X3ZtLm5leHRNb250aH19KV0pLF9jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtcGlja2VyLXBhbmVsX19jb250ZW50In0sW19jKCJkYXRlLXRhYmxlIix7ZGlyZWN0aXZlczpbe25hbWU6InNob3ciLHJhd05hbWU6InYtc2hvdyIsdmFsdWU6X3ZtLmN1cnJlbnRWaWV3PT09ImRhdGUiLGV4cHJlc3Npb246ImN1cnJlbnRWaWV3ID09PSAnZGF0ZScifV0sYXR0cnM6eyJzZWxlY3Rpb24tbW9kZSI6X3ZtLnNlbGVjdGlvbk1vZGUsImZpcnN0LWRheS1vZi13ZWVrIjpfdm0uZmlyc3REYXlPZldlZWssdmFsdWU6X3ZtLnZhbHVlLCJkZWZhdWx0LXZhbHVlIjpfdm0uZGVmYXVsdFZhbHVlP25ldyBEYXRlKF92bS5kZWZhdWx0VmFsdWUpOm51bGwsZGF0ZTpfdm0uZGF0ZSwiY2VsbC1jbGFzcy1uYW1lIjpfdm0uY2VsbENsYXNzTmFtZSwiZGlzYWJsZWQtZGF0ZSI6X3ZtLmRpc2FibGVkRGF0ZX0sb246e3BpY2s6X3ZtLmhhbmRsZURhdGVQaWNrfX0pLF9jKCJ5ZWFyLXRhYmxlIix7ZGlyZWN0aXZlczpbe25hbWU6InNob3ciLHJhd05hbWU6InYtc2hvdyIsdmFsdWU6X3ZtLmN1cnJlbnRWaWV3PT09InllYXIiLGV4cHJlc3Npb246ImN1cnJlbnRWaWV3ID09PSAneWVhcicifV0sYXR0cnM6e3ZhbHVlOl92bS52YWx1ZSwiZGVmYXVsdC12YWx1ZSI6X3ZtLmRlZmF1bHRWYWx1ZT9uZXcgRGF0ZShfdm0uZGVmYXVsdFZhbHVlKTpudWxsLGRhdGU6X3ZtLmRhdGUsImRpc2FibGVkLWRhdGUiOl92bS5kaXNhYmxlZERhdGV9LG9uOntwaWNrOl92bS5oYW5kbGVZZWFyUGlja319KSxfYygibW9udGgtdGFibGUiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTpfdm0uY3VycmVudFZpZXc9PT0ibW9udGgiLGV4cHJlc3Npb246ImN1cnJlbnRWaWV3ID09PSAnbW9udGgnIn1dLGF0dHJzOnt2YWx1ZTpfdm0udmFsdWUsImRlZmF1bHQtdmFsdWUiOl92bS5kZWZhdWx0VmFsdWU/bmV3IERhdGUoX3ZtLmRlZmF1bHRWYWx1ZSk6bnVsbCxkYXRlOl92bS5kYXRlLCJkaXNhYmxlZC1kYXRlIjpfdm0uZGlzYWJsZWREYXRlfSxvbjp7cGljazpfdm0uaGFuZGxlTW9udGhQaWNrfX0pXSwxKV0pXSwyKSxfYygiZGl2Iix7ZGlyZWN0aXZlczpbe25hbWU6InNob3ciLHJhd05hbWU6InYtc2hvdyIsdmFsdWU6X3ZtLmZvb3RlclZpc2libGUmJl92bS5jdXJyZW50Vmlldz09PSJkYXRlIixleHByZXNzaW9uOiJmb290ZXJWaXNpYmxlICYmIGN1cnJlbnRWaWV3ID09PSAnZGF0ZScifV0sc3RhdGljQ2xhc3M6ImVsLXBpY2tlci1wYW5lbF9fZm9vdGVyIn0sW19jKCJlbC1idXR0b24iLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTpfdm0uc2VsZWN0aW9uTW9kZSE9PSJkYXRlcyIsZXhwcmVzc2lvbjoic2VsZWN0aW9uTW9kZSAhPT0gJ2RhdGVzJyJ9XSxzdGF0aWNDbGFzczoiZWwtcGlja2VyLXBhbmVsX19saW5rLWJ0biIsYXR0cnM6e3NpemU6Im1pbmkiLHR5cGU6InRleHQifSxvbjp7Y2xpY2s6X3ZtLmNoYW5nZVRvTm93fX0sW192bS5fdigiXG4gICAgICAgICIrX3ZtLl9zKF92bS50KCJlbC5kYXRlcGlja2VyLm5vdyIpKSsiXG4gICAgICAiKV0pLF9jKCJlbC1idXR0b24iLHtzdGF0aWNDbGFzczoiZWwtcGlja2VyLXBhbmVsX19saW5rLWJ0biIsYXR0cnM6e3BsYWluOiIiLHNpemU6Im1pbmkifSxvbjp7Y2xpY2s6X3ZtLmNvbmZpcm19fSxbX3ZtLl92KCJcbiAgICAgICAgIitfdm0uX3MoX3ZtLnQoImVsLmRhdGVwaWNrZXIuY29uZmlybSIpKSsiXG4gICAgICAiKV0pXSwxKV0pXSk7fTt2YXIgZGF0ZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzI0NDBkNGVhX3N0YXRpY1JlbmRlckZucz1bXTtkYXRldnVlX3R5cGVfdGVtcGxhdGVfaWRfMjQ0MGQ0ZWFfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9wYW5lbC9kYXRlLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0yNDQwZDRlYSYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGFuZWwvdGltZS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9M2Q5MzkwODkmCnZhciB0aW1ldnVlX3R5cGVfdGVtcGxhdGVfaWRfM2Q5MzkwODlfcmVuZGVyPWZ1bmN0aW9uIHRpbWV2dWVfdHlwZV90ZW1wbGF0ZV9pZF8zZDkzOTA4OV9yZW5kZXIoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDt2YXIgX2M9X3ZtLl9zZWxmLl9jfHxfaDtyZXR1cm4gX2MoInRyYW5zaXRpb24iLHthdHRyczp7bmFtZToiZWwtem9vbS1pbi10b3AifSxvbjp7ImFmdGVyLWxlYXZlIjpmdW5jdGlvbiBhZnRlckxlYXZlKCRldmVudCl7X3ZtLiRlbWl0KCJkb2Rlc3Ryb3kiKTt9fX0sW19jKCJkaXYiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTpfdm0udmlzaWJsZSxleHByZXNzaW9uOiJ2aXNpYmxlIn1dLHN0YXRpY0NsYXNzOiJlbC10aW1lLXBhbmVsIGVsLXBvcHBlciIsY2xhc3M6X3ZtLnBvcHBlckNsYXNzfSxbX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC10aW1lLXBhbmVsX19jb250ZW50IixjbGFzczp7Imhhcy1zZWNvbmRzIjpfdm0uc2hvd1NlY29uZHN9fSxbX2MoInRpbWUtc3Bpbm5lciIse3JlZjoic3Bpbm5lciIsYXR0cnM6eyJhcnJvdy1jb250cm9sIjpfdm0udXNlQXJyb3csInNob3ctc2Vjb25kcyI6X3ZtLnNob3dTZWNvbmRzLCJhbS1wbS1tb2RlIjpfdm0uYW1QbU1vZGUsZGF0ZTpfdm0uZGF0ZX0sb246e2NoYW5nZTpfdm0uaGFuZGxlQ2hhbmdlLCJzZWxlY3QtcmFuZ2UiOl92bS5zZXRTZWxlY3Rpb25SYW5nZX19KV0sMSksX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC10aW1lLXBhbmVsX19mb290ZXIifSxbX2MoImJ1dHRvbiIse3N0YXRpY0NsYXNzOiJlbC10aW1lLXBhbmVsX19idG4gY2FuY2VsIixhdHRyczp7dHlwZToiYnV0dG9uIn0sb246e2NsaWNrOl92bS5oYW5kbGVDYW5jZWx9fSxbX3ZtLl92KF92bS5fcyhfdm0udCgiZWwuZGF0ZXBpY2tlci5jYW5jZWwiKSkpXSksX2MoImJ1dHRvbiIse3N0YXRpY0NsYXNzOiJlbC10aW1lLXBhbmVsX19idG4iLGNsYXNzOntjb25maXJtOiFfdm0uZGlzYWJsZWR9LGF0dHJzOnt0eXBlOiJidXR0b24ifSxvbjp7Y2xpY2s6ZnVuY3Rpb24gY2xpY2soJGV2ZW50KXtfdm0uaGFuZGxlQ29uZmlybSgpO319fSxbX3ZtLl92KF92bS5fcyhfdm0udCgiZWwuZGF0ZXBpY2tlci5jb25maXJtIikpKV0pXSldKV0pO307dmFyIHRpbWV2dWVfdHlwZV90ZW1wbGF0ZV9pZF8zZDkzOTA4OV9zdGF0aWNSZW5kZXJGbnM9W107dGltZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzNkOTM5MDg5X3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGFuZWwvdGltZS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9M2Q5MzkwODkmCi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL2Jhc2ljL3RpbWUtc3Bpbm5lci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MWZhY2FkZWImCnZhciB0aW1lX3NwaW5uZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF8xZmFjYWRlYl9yZW5kZXI9ZnVuY3Rpb24gdGltZV9zcGlubmVydnVlX3R5cGVfdGVtcGxhdGVfaWRfMWZhY2FkZWJfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtdGltZS1zcGlubmVyIixjbGFzczp7Imhhcy1zZWNvbmRzIjpfdm0uc2hvd1NlY29uZHN9fSxbIV92bS5hcnJvd0NvbnRyb2w/W19jKCJlbC1zY3JvbGxiYXIiLHtyZWY6ImhvdXJzIixzdGF0aWNDbGFzczoiZWwtdGltZS1zcGlubmVyX193cmFwcGVyIixhdHRyczp7IndyYXAtc3R5bGUiOiJtYXgtaGVpZ2h0OiBpbmhlcml0OyIsInZpZXctY2xhc3MiOiJlbC10aW1lLXNwaW5uZXJfX2xpc3QiLG5vcmVzaXplOiIiLHRhZzoidWwifSxuYXRpdmVPbjp7bW91c2VlbnRlcjpmdW5jdGlvbiBtb3VzZWVudGVyKCRldmVudCl7X3ZtLmVtaXRTZWxlY3RSYW5nZSgiaG91cnMiKTt9LG1vdXNlbW92ZTpmdW5jdGlvbiBtb3VzZW1vdmUoJGV2ZW50KXtfdm0uYWRqdXN0Q3VycmVudFNwaW5uZXIoImhvdXJzIik7fX19LF92bS5fbChfdm0uaG91cnNMaXN0LGZ1bmN0aW9uKGRpc2FibGVkLGhvdXIpe3JldHVybiBfYygibGkiLHtrZXk6aG91cixzdGF0aWNDbGFzczoiZWwtdGltZS1zcGlubmVyX19pdGVtIixjbGFzczp7YWN0aXZlOmhvdXI9PT1fdm0uaG91cnMsZGlzYWJsZWQ6ZGlzYWJsZWR9LG9uOntjbGljazpmdW5jdGlvbiBjbGljaygkZXZlbnQpe192bS5oYW5kbGVDbGljaygiaG91cnMiLHt2YWx1ZTpob3VyLGRpc2FibGVkOmRpc2FibGVkfSk7fX19LFtfdm0uX3YoX3ZtLl9zKCgiMCIrKF92bS5hbVBtTW9kZT9ob3VyJTEyfHwxMjpob3VyKSkuc2xpY2UoLTIpKStfdm0uX3MoX3ZtLmFtUG0oaG91cikpKV0pO30pLDApLF9jKCJlbC1zY3JvbGxiYXIiLHtyZWY6Im1pbnV0ZXMiLHN0YXRpY0NsYXNzOiJlbC10aW1lLXNwaW5uZXJfX3dyYXBwZXIiLGF0dHJzOnsid3JhcC1zdHlsZSI6Im1heC1oZWlnaHQ6IGluaGVyaXQ7Iiwidmlldy1jbGFzcyI6ImVsLXRpbWUtc3Bpbm5lcl9fbGlzdCIsbm9yZXNpemU6IiIsdGFnOiJ1bCJ9LG5hdGl2ZU9uOnttb3VzZWVudGVyOmZ1bmN0aW9uIG1vdXNlZW50ZXIoJGV2ZW50KXtfdm0uZW1pdFNlbGVjdFJhbmdlKCJtaW51dGVzIik7fSxtb3VzZW1vdmU6ZnVuY3Rpb24gbW91c2Vtb3ZlKCRldmVudCl7X3ZtLmFkanVzdEN1cnJlbnRTcGlubmVyKCJtaW51dGVzIik7fX19LF92bS5fbChfdm0ubWludXRlc0xpc3QsZnVuY3Rpb24oZW5hYmxlZCxrZXkpe3JldHVybiBfYygibGkiLHtrZXk6a2V5LHN0YXRpY0NsYXNzOiJlbC10aW1lLXNwaW5uZXJfX2l0ZW0iLGNsYXNzOnthY3RpdmU6a2V5PT09X3ZtLm1pbnV0ZXMsZGlzYWJsZWQ6IWVuYWJsZWR9LG9uOntjbGljazpmdW5jdGlvbiBjbGljaygkZXZlbnQpe192bS5oYW5kbGVDbGljaygibWludXRlcyIse3ZhbHVlOmtleSxkaXNhYmxlZDpmYWxzZX0pO319fSxbX3ZtLl92KF92bS5fcygoIjAiK2tleSkuc2xpY2UoLTIpKSldKTt9KSwwKSxfYygiZWwtc2Nyb2xsYmFyIix7ZGlyZWN0aXZlczpbe25hbWU6InNob3ciLHJhd05hbWU6InYtc2hvdyIsdmFsdWU6X3ZtLnNob3dTZWNvbmRzLGV4cHJlc3Npb246InNob3dTZWNvbmRzIn1dLHJlZjoic2Vjb25kcyIsc3RhdGljQ2xhc3M6ImVsLXRpbWUtc3Bpbm5lcl9fd3JhcHBlciIsYXR0cnM6eyJ3cmFwLXN0eWxlIjoibWF4LWhlaWdodDogaW5oZXJpdDsiLCJ2aWV3LWNsYXNzIjoiZWwtdGltZS1zcGlubmVyX19saXN0Iixub3Jlc2l6ZToiIix0YWc6InVsIn0sbmF0aXZlT246e21vdXNlZW50ZXI6ZnVuY3Rpb24gbW91c2VlbnRlcigkZXZlbnQpe192bS5lbWl0U2VsZWN0UmFuZ2UoInNlY29uZHMiKTt9LG1vdXNlbW92ZTpmdW5jdGlvbiBtb3VzZW1vdmUoJGV2ZW50KXtfdm0uYWRqdXN0Q3VycmVudFNwaW5uZXIoInNlY29uZHMiKTt9fX0sX3ZtLl9sKDYwLGZ1bmN0aW9uKHNlY29uZCxrZXkpe3JldHVybiBfYygibGkiLHtrZXk6a2V5LHN0YXRpY0NsYXNzOiJlbC10aW1lLXNwaW5uZXJfX2l0ZW0iLGNsYXNzOnthY3RpdmU6a2V5PT09X3ZtLnNlY29uZHN9LG9uOntjbGljazpmdW5jdGlvbiBjbGljaygkZXZlbnQpe192bS5oYW5kbGVDbGljaygic2Vjb25kcyIse3ZhbHVlOmtleSxkaXNhYmxlZDpmYWxzZX0pO319fSxbX3ZtLl92KF92bS5fcygoIjAiK2tleSkuc2xpY2UoLTIpKSldKTt9KSwwKV06X3ZtLl9lKCksX3ZtLmFycm93Q29udHJvbD9bX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC10aW1lLXNwaW5uZXJfX3dyYXBwZXIgaXMtYXJyb3ciLG9uOnttb3VzZWVudGVyOmZ1bmN0aW9uIG1vdXNlZW50ZXIoJGV2ZW50KXtfdm0uZW1pdFNlbGVjdFJhbmdlKCJob3VycyIpO319fSxbX2MoImkiLHtkaXJlY3RpdmVzOlt7bmFtZToicmVwZWF0LWNsaWNrIixyYXdOYW1lOiJ2LXJlcGVhdC1jbGljayIsdmFsdWU6X3ZtLmRlY3JlYXNlLGV4cHJlc3Npb246ImRlY3JlYXNlIn1dLHN0YXRpY0NsYXNzOiJlbC10aW1lLXNwaW5uZXJfX2Fycm93IGVsLWljb24tYXJyb3ctdXAifSksX2MoImkiLHtkaXJlY3RpdmVzOlt7bmFtZToicmVwZWF0LWNsaWNrIixyYXdOYW1lOiJ2LXJlcGVhdC1jbGljayIsdmFsdWU6X3ZtLmluY3JlYXNlLGV4cHJlc3Npb246ImluY3JlYXNlIn1dLHN0YXRpY0NsYXNzOiJlbC10aW1lLXNwaW5uZXJfX2Fycm93IGVsLWljb24tYXJyb3ctZG93biJ9KSxfYygidWwiLHtyZWY6ImhvdXJzIixzdGF0aWNDbGFzczoiZWwtdGltZS1zcGlubmVyX19saXN0In0sX3ZtLl9sKF92bS5hcnJvd0hvdXJMaXN0LGZ1bmN0aW9uKGhvdXIsa2V5KXtyZXR1cm4gX2MoImxpIix7a2V5OmtleSxzdGF0aWNDbGFzczoiZWwtdGltZS1zcGlubmVyX19pdGVtIixjbGFzczp7YWN0aXZlOmhvdXI9PT1fdm0uaG91cnMsZGlzYWJsZWQ6X3ZtLmhvdXJzTGlzdFtob3VyXX19LFtfdm0uX3YoX3ZtLl9zKGhvdXI9PT11bmRlZmluZWQ/IiI6KCIwIisoX3ZtLmFtUG1Nb2RlP2hvdXIlMTJ8fDEyOmhvdXIpKS5zbGljZSgtMikrX3ZtLmFtUG0oaG91cikpKV0pO30pLDApXSksX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC10aW1lLXNwaW5uZXJfX3dyYXBwZXIgaXMtYXJyb3ciLG9uOnttb3VzZWVudGVyOmZ1bmN0aW9uIG1vdXNlZW50ZXIoJGV2ZW50KXtfdm0uZW1pdFNlbGVjdFJhbmdlKCJtaW51dGVzIik7fX19LFtfYygiaSIse2RpcmVjdGl2ZXM6W3tuYW1lOiJyZXBlYXQtY2xpY2siLHJhd05hbWU6InYtcmVwZWF0LWNsaWNrIix2YWx1ZTpfdm0uZGVjcmVhc2UsZXhwcmVzc2lvbjoiZGVjcmVhc2UifV0sc3RhdGljQ2xhc3M6ImVsLXRpbWUtc3Bpbm5lcl9fYXJyb3cgZWwtaWNvbi1hcnJvdy11cCJ9KSxfYygiaSIse2RpcmVjdGl2ZXM6W3tuYW1lOiJyZXBlYXQtY2xpY2siLHJhd05hbWU6InYtcmVwZWF0LWNsaWNrIix2YWx1ZTpfdm0uaW5jcmVhc2UsZXhwcmVzc2lvbjoiaW5jcmVhc2UifV0sc3RhdGljQ2xhc3M6ImVsLXRpbWUtc3Bpbm5lcl9fYXJyb3cgZWwtaWNvbi1hcnJvdy1kb3duIn0pLF9jKCJ1bCIse3JlZjoibWludXRlcyIsc3RhdGljQ2xhc3M6ImVsLXRpbWUtc3Bpbm5lcl9fbGlzdCJ9LF92bS5fbChfdm0uYXJyb3dNaW51dGVMaXN0LGZ1bmN0aW9uKG1pbnV0ZSxrZXkpe3JldHVybiBfYygibGkiLHtrZXk6a2V5LHN0YXRpY0NsYXNzOiJlbC10aW1lLXNwaW5uZXJfX2l0ZW0iLGNsYXNzOnthY3RpdmU6bWludXRlPT09X3ZtLm1pbnV0ZXN9fSxbX3ZtLl92KCJcbiAgICAgICAgICAiK192bS5fcyhtaW51dGU9PT11bmRlZmluZWQ/IiI6KCIwIittaW51dGUpLnNsaWNlKC0yKSkrIlxuICAgICAgICAiKV0pO30pLDApXSksX3ZtLnNob3dTZWNvbmRzP19jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtdGltZS1zcGlubmVyX193cmFwcGVyIGlzLWFycm93Iixvbjp7bW91c2VlbnRlcjpmdW5jdGlvbiBtb3VzZWVudGVyKCRldmVudCl7X3ZtLmVtaXRTZWxlY3RSYW5nZSgic2Vjb25kcyIpO319fSxbX2MoImkiLHtkaXJlY3RpdmVzOlt7bmFtZToicmVwZWF0LWNsaWNrIixyYXdOYW1lOiJ2LXJlcGVhdC1jbGljayIsdmFsdWU6X3ZtLmRlY3JlYXNlLGV4cHJlc3Npb246ImRlY3JlYXNlIn1dLHN0YXRpY0NsYXNzOiJlbC10aW1lLXNwaW5uZXJfX2Fycm93IGVsLWljb24tYXJyb3ctdXAifSksX2MoImkiLHtkaXJlY3RpdmVzOlt7bmFtZToicmVwZWF0LWNsaWNrIixyYXdOYW1lOiJ2LXJlcGVhdC1jbGljayIsdmFsdWU6X3ZtLmluY3JlYXNlLGV4cHJlc3Npb246ImluY3JlYXNlIn1dLHN0YXRpY0NsYXNzOiJlbC10aW1lLXNwaW5uZXJfX2Fycm93IGVsLWljb24tYXJyb3ctZG93biJ9KSxfYygidWwiLHtyZWY6InNlY29uZHMiLHN0YXRpY0NsYXNzOiJlbC10aW1lLXNwaW5uZXJfX2xpc3QifSxfdm0uX2woX3ZtLmFycm93U2Vjb25kTGlzdCxmdW5jdGlvbihzZWNvbmQsa2V5KXtyZXR1cm4gX2MoImxpIix7a2V5OmtleSxzdGF0aWNDbGFzczoiZWwtdGltZS1zcGlubmVyX19pdGVtIixjbGFzczp7YWN0aXZlOnNlY29uZD09PV92bS5zZWNvbmRzfX0sW192bS5fdigiXG4gICAgICAgICAgIitfdm0uX3Moc2Vjb25kPT09dW5kZWZpbmVkPyIiOigiMCIrc2Vjb25kKS5zbGljZSgtMikpKyJcbiAgICAgICAgIildKTt9KSwwKV0pOl92bS5fZSgpXTpfdm0uX2UoKV0sMik7fTt2YXIgdGltZV9zcGlubmVydnVlX3R5cGVfdGVtcGxhdGVfaWRfMWZhY2FkZWJfc3RhdGljUmVuZGVyRm5zPVtdO3RpbWVfc3Bpbm5lcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzFmYWNhZGViX3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvYmFzaWMvdGltZS1zcGlubmVyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0xZmFjYWRlYiYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL2Jhc2ljL3RpbWUtc3Bpbm5lci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgdGltZV9zcGlubmVydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtjb21wb25lbnRzOntFbFNjcm9sbGJhcjpzY3JvbGxiYXJfZGVmYXVsdC5hfSxkaXJlY3RpdmVzOntyZXBlYXRDbGljazpyZXBlYXRfY2xpY2t9LHByb3BzOntkYXRlOnt9LGRlZmF1bHRWYWx1ZTp7fSwvLyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQpzaG93U2Vjb25kczp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6dHJ1ZX0sYXJyb3dDb250cm9sOkJvb2xlYW4sYW1QbU1vZGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6JycvLyAnYSc6IGFtL3BtOyAnQSc6IEFNL1BNCn19LGNvbXB1dGVkOntob3VyczpmdW5jdGlvbiBob3Vycygpe3JldHVybiB0aGlzLmRhdGUuZ2V0SG91cnMoKTt9LG1pbnV0ZXM6ZnVuY3Rpb24gbWludXRlcygpe3JldHVybiB0aGlzLmRhdGUuZ2V0TWludXRlcygpO30sc2Vjb25kczpmdW5jdGlvbiBzZWNvbmRzKCl7cmV0dXJuIHRoaXMuZGF0ZS5nZXRTZWNvbmRzKCk7fSxob3Vyc0xpc3Q6ZnVuY3Rpb24gaG91cnNMaXN0KCl7cmV0dXJuIE9iamVjdChkYXRlX3V0aWxfWyJnZXRSYW5nZUhvdXJzIl0pKHRoaXMuc2VsZWN0YWJsZVJhbmdlKTt9LG1pbnV0ZXNMaXN0OmZ1bmN0aW9uIG1pbnV0ZXNMaXN0KCl7cmV0dXJuIE9iamVjdChkYXRlX3V0aWxfWyJnZXRSYW5nZU1pbnV0ZXMiXSkodGhpcy5zZWxlY3RhYmxlUmFuZ2UsdGhpcy5ob3Vycyk7fSxhcnJvd0hvdXJMaXN0OmZ1bmN0aW9uIGFycm93SG91ckxpc3QoKXt2YXIgaG91cnM9dGhpcy5ob3VycztyZXR1cm5baG91cnM+MD9ob3Vycy0xOnVuZGVmaW5lZCxob3Vycyxob3VyczwyMz9ob3VycysxOnVuZGVmaW5lZF07fSxhcnJvd01pbnV0ZUxpc3Q6ZnVuY3Rpb24gYXJyb3dNaW51dGVMaXN0KCl7dmFyIG1pbnV0ZXM9dGhpcy5taW51dGVzO3JldHVyblttaW51dGVzPjA/bWludXRlcy0xOnVuZGVmaW5lZCxtaW51dGVzLG1pbnV0ZXM8NTk/bWludXRlcysxOnVuZGVmaW5lZF07fSxhcnJvd1NlY29uZExpc3Q6ZnVuY3Rpb24gYXJyb3dTZWNvbmRMaXN0KCl7dmFyIHNlY29uZHM9dGhpcy5zZWNvbmRzO3JldHVybltzZWNvbmRzPjA/c2Vjb25kcy0xOnVuZGVmaW5lZCxzZWNvbmRzLHNlY29uZHM8NTk/c2Vjb25kcysxOnVuZGVmaW5lZF07fX0sZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue3NlbGVjdGFibGVSYW5nZTpbXSxjdXJyZW50U2Nyb2xsYmFyOm51bGx9O30sbW91bnRlZDpmdW5jdGlvbiBtb3VudGVkKCl7dmFyIF90aGlzPXRoaXM7dGhpcy4kbmV4dFRpY2soZnVuY3Rpb24oKXshX3RoaXMuYXJyb3dDb250cm9sJiZfdGhpcy5iaW5kU2Nyb2xsRXZlbnQoKTt9KTt9LG1ldGhvZHM6e2luY3JlYXNlOmZ1bmN0aW9uIGluY3JlYXNlKCl7dGhpcy5zY3JvbGxEb3duKDEpO30sZGVjcmVhc2U6ZnVuY3Rpb24gZGVjcmVhc2UoKXt0aGlzLnNjcm9sbERvd24oLTEpO30sbW9kaWZ5RGF0ZUZpZWxkOmZ1bmN0aW9uIG1vZGlmeURhdGVGaWVsZCh0eXBlLHZhbHVlKXtzd2l0Y2godHlwZSl7Y2FzZSdob3Vycyc6dGhpcy4kZW1pdCgnY2hhbmdlJyxPYmplY3QoZGF0ZV91dGlsX1sibW9kaWZ5VGltZSJdKSh0aGlzLmRhdGUsdmFsdWUsdGhpcy5taW51dGVzLHRoaXMuc2Vjb25kcykpO2JyZWFrO2Nhc2UnbWludXRlcyc6dGhpcy4kZW1pdCgnY2hhbmdlJyxPYmplY3QoZGF0ZV91dGlsX1sibW9kaWZ5VGltZSJdKSh0aGlzLmRhdGUsdGhpcy5ob3Vycyx2YWx1ZSx0aGlzLnNlY29uZHMpKTticmVhaztjYXNlJ3NlY29uZHMnOnRoaXMuJGVtaXQoJ2NoYW5nZScsT2JqZWN0KGRhdGVfdXRpbF9bIm1vZGlmeVRpbWUiXSkodGhpcy5kYXRlLHRoaXMuaG91cnMsdGhpcy5taW51dGVzLHZhbHVlKSk7YnJlYWs7fX0saGFuZGxlQ2xpY2s6ZnVuY3Rpb24gaGFuZGxlQ2xpY2sodHlwZSxfcmVmKXt2YXIgdmFsdWU9X3JlZi52YWx1ZSxkaXNhYmxlZD1fcmVmLmRpc2FibGVkO2lmKCFkaXNhYmxlZCl7dGhpcy5tb2RpZnlEYXRlRmllbGQodHlwZSx2YWx1ZSk7dGhpcy5lbWl0U2VsZWN0UmFuZ2UodHlwZSk7dGhpcy5hZGp1c3RTcGlubmVyKHR5cGUsdmFsdWUpO319LGVtaXRTZWxlY3RSYW5nZTpmdW5jdGlvbiBlbWl0U2VsZWN0UmFuZ2UodHlwZSl7aWYodHlwZT09PSdob3Vycycpe3RoaXMuJGVtaXQoJ3NlbGVjdC1yYW5nZScsMCwyKTt9ZWxzZSBpZih0eXBlPT09J21pbnV0ZXMnKXt0aGlzLiRlbWl0KCdzZWxlY3QtcmFuZ2UnLDMsNSk7fWVsc2UgaWYodHlwZT09PSdzZWNvbmRzJyl7dGhpcy4kZW1pdCgnc2VsZWN0LXJhbmdlJyw2LDgpO310aGlzLmN1cnJlbnRTY3JvbGxiYXI9dHlwZTt9LGJpbmRTY3JvbGxFdmVudDpmdW5jdGlvbiBiaW5kU2Nyb2xsRXZlbnQoKXt2YXIgX3RoaXMyPXRoaXM7dmFyIGJpbmRGdW50aW9uPWZ1bmN0aW9uIGJpbmRGdW50aW9uKHR5cGUpe190aGlzMi4kcmVmc1t0eXBlXS53cmFwLm9uc2Nyb2xsPWZ1bmN0aW9uKGUpey8vIFRPRE86IHNjcm9sbCBpcyBlbWl0dGVkIHdoZW4gc2V0IHNjcm9sbFRvcCBwcm9ncmFtYXRpY2FsbHkKLy8gc2hvdWxkIGZpbmQgYmV0dGVyIHNvbHV0aW9ucyBpbiB0aGUgZnV0dXJlIQpfdGhpczIuaGFuZGxlU2Nyb2xsKHR5cGUsZSk7fTt9O2JpbmRGdW50aW9uKCdob3VycycpO2JpbmRGdW50aW9uKCdtaW51dGVzJyk7YmluZEZ1bnRpb24oJ3NlY29uZHMnKTt9LGhhbmRsZVNjcm9sbDpmdW5jdGlvbiBoYW5kbGVTY3JvbGwodHlwZSl7dmFyIHZhbHVlPU1hdGgubWluKE1hdGgucm91bmQoKHRoaXMuJHJlZnNbdHlwZV0ud3JhcC5zY3JvbGxUb3AtKHRoaXMuc2Nyb2xsQmFySGVpZ2h0KHR5cGUpKjAuNS0xMCkvdGhpcy50eXBlSXRlbUhlaWdodCh0eXBlKSszKS90aGlzLnR5cGVJdGVtSGVpZ2h0KHR5cGUpKSx0eXBlPT09J2hvdXJzJz8yMzo1OSk7dGhpcy5tb2RpZnlEYXRlRmllbGQodHlwZSx2YWx1ZSk7fSwvLyBOT1RFOiB1c2VkIGJ5IGRhdGV0aW1lIC8gZGF0ZS1yYW5nZSBwYW5lbAovLyAgICAgICByZW5hbWVkIGZyb20gYWRqdXN0U2Nyb2xsVG9wCi8vICAgICAgIHNob3VsZCB0cnkgdG8gcmVmYWN0b3J5IGl0CmFkanVzdFNwaW5uZXJzOmZ1bmN0aW9uIGFkanVzdFNwaW5uZXJzKCl7dGhpcy5hZGp1c3RTcGlubmVyKCdob3VycycsdGhpcy5ob3Vycyk7dGhpcy5hZGp1c3RTcGlubmVyKCdtaW51dGVzJyx0aGlzLm1pbnV0ZXMpO3RoaXMuYWRqdXN0U3Bpbm5lcignc2Vjb25kcycsdGhpcy5zZWNvbmRzKTt9LGFkanVzdEN1cnJlbnRTcGlubmVyOmZ1bmN0aW9uIGFkanVzdEN1cnJlbnRTcGlubmVyKHR5cGUpe3RoaXMuYWRqdXN0U3Bpbm5lcih0eXBlLHRoaXNbdHlwZV0pO30sYWRqdXN0U3Bpbm5lcjpmdW5jdGlvbiBhZGp1c3RTcGlubmVyKHR5cGUsdmFsdWUpe2lmKHRoaXMuYXJyb3dDb250cm9sKXJldHVybjt2YXIgZWw9dGhpcy4kcmVmc1t0eXBlXS53cmFwO2lmKGVsKXtlbC5zY3JvbGxUb3A9TWF0aC5tYXgoMCx2YWx1ZSp0aGlzLnR5cGVJdGVtSGVpZ2h0KHR5cGUpKTt9fSxzY3JvbGxEb3duOmZ1bmN0aW9uIHNjcm9sbERvd24oc3RlcCl7dmFyIF90aGlzMz10aGlzO2lmKCF0aGlzLmN1cnJlbnRTY3JvbGxiYXIpe3RoaXMuZW1pdFNlbGVjdFJhbmdlKCdob3VycycpO312YXIgbGFiZWw9dGhpcy5jdXJyZW50U2Nyb2xsYmFyO3ZhciBob3Vyc0xpc3Q9dGhpcy5ob3Vyc0xpc3Q7dmFyIG5vdz10aGlzW2xhYmVsXTtpZih0aGlzLmN1cnJlbnRTY3JvbGxiYXI9PT0naG91cnMnKXt2YXIgdG90YWw9TWF0aC5hYnMoc3RlcCk7c3RlcD1zdGVwPjA/MTotMTt2YXIgbGVuZ3RoPWhvdXJzTGlzdC5sZW5ndGg7d2hpbGUobGVuZ3RoLS0mJnRvdGFsKXtub3c9KG5vdytzdGVwK2hvdXJzTGlzdC5sZW5ndGgpJWhvdXJzTGlzdC5sZW5ndGg7aWYoaG91cnNMaXN0W25vd10pe2NvbnRpbnVlO310b3RhbC0tO31pZihob3Vyc0xpc3Rbbm93XSlyZXR1cm47fWVsc2V7bm93PShub3crc3RlcCs2MCklNjA7fXRoaXMubW9kaWZ5RGF0ZUZpZWxkKGxhYmVsLG5vdyk7dGhpcy5hZGp1c3RTcGlubmVyKGxhYmVsLG5vdyk7dGhpcy4kbmV4dFRpY2soZnVuY3Rpb24oKXtyZXR1cm4gX3RoaXMzLmVtaXRTZWxlY3RSYW5nZShfdGhpczMuY3VycmVudFNjcm9sbGJhcik7fSk7fSxhbVBtOmZ1bmN0aW9uIGFtUG0oaG91cil7dmFyIHNob3VsZFNob3dBbVBtPXRoaXMuYW1QbU1vZGUudG9Mb3dlckNhc2UoKT09PSdhJztpZighc2hvdWxkU2hvd0FtUG0pcmV0dXJuJyc7dmFyIGlzQ2FwaXRhbD10aGlzLmFtUG1Nb2RlPT09J0EnO3ZhciBjb250ZW50PWhvdXI8MTI/JyBhbSc6JyBwbSc7aWYoaXNDYXBpdGFsKWNvbnRlbnQ9Y29udGVudC50b1VwcGVyQ2FzZSgpO3JldHVybiBjb250ZW50O30sdHlwZUl0ZW1IZWlnaHQ6ZnVuY3Rpb24gdHlwZUl0ZW1IZWlnaHQodHlwZSl7cmV0dXJuIHRoaXMuJHJlZnNbdHlwZV0uJGVsLnF1ZXJ5U2VsZWN0b3IoJ2xpJykub2Zmc2V0SGVpZ2h0O30sc2Nyb2xsQmFySGVpZ2h0OmZ1bmN0aW9uIHNjcm9sbEJhckhlaWdodCh0eXBlKXtyZXR1cm4gdGhpcy4kcmVmc1t0eXBlXS4kZWwub2Zmc2V0SGVpZ2h0O319fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9iYXNpYy90aW1lLXNwaW5uZXIudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGJhc2ljX3RpbWVfc3Bpbm5lcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz10aW1lX3NwaW5uZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvYmFzaWMvdGltZS1zcGlubmVyLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIHRpbWVfc3Bpbm5lcl9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KGJhc2ljX3RpbWVfc3Bpbm5lcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyx0aW1lX3NwaW5uZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF8xZmFjYWRlYl9yZW5kZXIsdGltZV9zcGlubmVydnVlX3R5cGVfdGVtcGxhdGVfaWRfMWZhY2FkZWJfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciB0aW1lX3NwaW5uZXJfYXBpO310aW1lX3NwaW5uZXJfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvYmFzaWMvdGltZS1zcGlubmVyLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciB0aW1lX3NwaW5uZXI9dGltZV9zcGlubmVyX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9wYW5lbC90aW1lLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciB0aW1ldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXttaXhpbnM6W2xvY2FsZV9kZWZhdWx0LmFdLGNvbXBvbmVudHM6e1RpbWVTcGlubmVyOnRpbWVfc3Bpbm5lcn0scHJvcHM6e3Zpc2libGU6Qm9vbGVhbix0aW1lQXJyb3dDb250cm9sOkJvb2xlYW59LHdhdGNoOnt2aXNpYmxlOmZ1bmN0aW9uIHZpc2libGUodmFsKXt2YXIgX3RoaXM9dGhpcztpZih2YWwpe3RoaXMub2xkVmFsdWU9dGhpcy52YWx1ZTt0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe3JldHVybiBfdGhpcy4kcmVmcy5zcGlubmVyLmVtaXRTZWxlY3RSYW5nZSgnaG91cnMnKTt9KTt9ZWxzZXt0aGlzLm5lZWRJbml0QWRqdXN0PXRydWU7fX0sdmFsdWU6ZnVuY3Rpb24gdmFsdWUobmV3VmFsKXt2YXIgX3RoaXMyPXRoaXM7dmFyIGRhdGU9dm9pZCAwO2lmKG5ld1ZhbCBpbnN0YW5jZW9mIERhdGUpe2RhdGU9T2JqZWN0KGRhdGVfdXRpbF9bImxpbWl0VGltZVJhbmdlIl0pKG5ld1ZhbCx0aGlzLnNlbGVjdGFibGVSYW5nZSx0aGlzLmZvcm1hdCk7fWVsc2UgaWYoIW5ld1ZhbCl7ZGF0ZT10aGlzLmRlZmF1bHRWYWx1ZT9uZXcgRGF0ZSh0aGlzLmRlZmF1bHRWYWx1ZSk6bmV3IERhdGUoKTt9dGhpcy5kYXRlPWRhdGU7aWYodGhpcy52aXNpYmxlJiZ0aGlzLm5lZWRJbml0QWRqdXN0KXt0aGlzLiRuZXh0VGljayhmdW5jdGlvbihfKXtyZXR1cm4gX3RoaXMyLmFkanVzdFNwaW5uZXJzKCk7fSk7dGhpcy5uZWVkSW5pdEFkanVzdD1mYWxzZTt9fSxzZWxlY3RhYmxlUmFuZ2U6ZnVuY3Rpb24gc2VsZWN0YWJsZVJhbmdlKHZhbCl7dGhpcy4kcmVmcy5zcGlubmVyLnNlbGVjdGFibGVSYW5nZT12YWw7fSxkZWZhdWx0VmFsdWU6ZnVuY3Rpb24gZGVmYXVsdFZhbHVlKHZhbCl7aWYoIU9iamVjdChkYXRlX3V0aWxfWyJpc0RhdGUiXSkodGhpcy52YWx1ZSkpe3RoaXMuZGF0ZT12YWw/bmV3IERhdGUodmFsKTpuZXcgRGF0ZSgpO319fSxkYXRhOmZ1bmN0aW9uIGRhdGEoKXtyZXR1cm57cG9wcGVyQ2xhc3M6JycsZm9ybWF0OidISDptbTpzcycsdmFsdWU6JycsZGVmYXVsdFZhbHVlOm51bGwsZGF0ZTpuZXcgRGF0ZSgpLG9sZFZhbHVlOm5ldyBEYXRlKCksc2VsZWN0YWJsZVJhbmdlOltdLHNlbGVjdGlvblJhbmdlOlswLDJdLGRpc2FibGVkOmZhbHNlLGFycm93Q29udHJvbDpmYWxzZSxuZWVkSW5pdEFkanVzdDp0cnVlfTt9LGNvbXB1dGVkOntzaG93U2Vjb25kczpmdW5jdGlvbiBzaG93U2Vjb25kcygpe3JldHVybih0aGlzLmZvcm1hdHx8JycpLmluZGV4T2YoJ3NzJykhPT0tMTt9LHVzZUFycm93OmZ1bmN0aW9uIHVzZUFycm93KCl7cmV0dXJuIHRoaXMuYXJyb3dDb250cm9sfHx0aGlzLnRpbWVBcnJvd0NvbnRyb2x8fGZhbHNlO30sYW1QbU1vZGU6ZnVuY3Rpb24gYW1QbU1vZGUoKXtpZigodGhpcy5mb3JtYXR8fCcnKS5pbmRleE9mKCdBJykhPT0tMSlyZXR1cm4nQSc7aWYoKHRoaXMuZm9ybWF0fHwnJykuaW5kZXhPZignYScpIT09LTEpcmV0dXJuJ2EnO3JldHVybicnO319LG1ldGhvZHM6e2hhbmRsZUNhbmNlbDpmdW5jdGlvbiBoYW5kbGVDYW5jZWwoKXt0aGlzLiRlbWl0KCdwaWNrJyx0aGlzLm9sZFZhbHVlLGZhbHNlKTt9LGhhbmRsZUNoYW5nZTpmdW5jdGlvbiBoYW5kbGVDaGFuZ2UoZGF0ZSl7Ly8gdGhpcy52aXNpYmxlIGF2b2lkcyBlZGdlIGNhc2VzLCB3aGVuIHVzZSBzY3JvbGxzIGR1cmluZyBwYW5lbCBjbG9zaW5nIGFuaW1hdGlvbgppZih0aGlzLnZpc2libGUpe3RoaXMuZGF0ZT1PYmplY3QoZGF0ZV91dGlsX1siY2xlYXJNaWxsaXNlY29uZHMiXSkoZGF0ZSk7Ly8gaWYgZGF0ZSBpcyBvdXQgb2YgcmFuZ2UsIGRvIG5vdCBlbWl0CmlmKHRoaXMuaXNWYWxpZFZhbHVlKHRoaXMuZGF0ZSkpe3RoaXMuJGVtaXQoJ3BpY2snLHRoaXMuZGF0ZSx0cnVlKTt9fX0sc2V0U2VsZWN0aW9uUmFuZ2U6ZnVuY3Rpb24gc2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsZW5kKXt0aGlzLiRlbWl0KCdzZWxlY3QtcmFuZ2UnLHN0YXJ0LGVuZCk7dGhpcy5zZWxlY3Rpb25SYW5nZT1bc3RhcnQsZW5kXTt9LGhhbmRsZUNvbmZpcm06ZnVuY3Rpb24gaGFuZGxlQ29uZmlybSgpe3ZhciB2aXNpYmxlPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dW5kZWZpbmVkP2FyZ3VtZW50c1swXTpmYWxzZTt2YXIgZmlyc3Q9YXJndW1lbnRzWzFdO2lmKGZpcnN0KXJldHVybjt2YXIgZGF0ZT1PYmplY3QoZGF0ZV91dGlsX1siY2xlYXJNaWxsaXNlY29uZHMiXSkoT2JqZWN0KGRhdGVfdXRpbF9bImxpbWl0VGltZVJhbmdlIl0pKHRoaXMuZGF0ZSx0aGlzLnNlbGVjdGFibGVSYW5nZSx0aGlzLmZvcm1hdCkpO3RoaXMuJGVtaXQoJ3BpY2snLGRhdGUsdmlzaWJsZSxmaXJzdCk7fSxoYW5kbGVLZXlkb3duOmZ1bmN0aW9uIGhhbmRsZUtleWRvd24oZXZlbnQpe3ZhciBrZXlDb2RlPWV2ZW50LmtleUNvZGU7dmFyIG1hcHBpbmc9ezM4Oi0xLDQwOjEsMzc6LTEsMzk6MX07Ly8gTGVmdCBvciBSaWdodAppZihrZXlDb2RlPT09Mzd8fGtleUNvZGU9PT0zOSl7dmFyIHN0ZXA9bWFwcGluZ1trZXlDb2RlXTt0aGlzLmNoYW5nZVNlbGVjdGlvblJhbmdlKHN0ZXApO2V2ZW50LnByZXZlbnREZWZhdWx0KCk7cmV0dXJuO30vLyBVcCBvciBEb3duCmlmKGtleUNvZGU9PT0zOHx8a2V5Q29kZT09PTQwKXt2YXIgX3N0ZXA9bWFwcGluZ1trZXlDb2RlXTt0aGlzLiRyZWZzLnNwaW5uZXIuc2Nyb2xsRG93bihfc3RlcCk7ZXZlbnQucHJldmVudERlZmF1bHQoKTtyZXR1cm47fX0saXNWYWxpZFZhbHVlOmZ1bmN0aW9uIGlzVmFsaWRWYWx1ZShkYXRlKXtyZXR1cm4gT2JqZWN0KGRhdGVfdXRpbF9bInRpbWVXaXRoaW5SYW5nZSJdKShkYXRlLHRoaXMuc2VsZWN0YWJsZVJhbmdlLHRoaXMuZm9ybWF0KTt9LGFkanVzdFNwaW5uZXJzOmZ1bmN0aW9uIGFkanVzdFNwaW5uZXJzKCl7cmV0dXJuIHRoaXMuJHJlZnMuc3Bpbm5lci5hZGp1c3RTcGlubmVycygpO30sY2hhbmdlU2VsZWN0aW9uUmFuZ2U6ZnVuY3Rpb24gY2hhbmdlU2VsZWN0aW9uUmFuZ2Uoc3RlcCl7dmFyIGxpc3Q9WzAsM10uY29uY2F0KHRoaXMuc2hvd1NlY29uZHM/WzZdOltdKTt2YXIgbWFwcGluZz1bJ2hvdXJzJywnbWludXRlcyddLmNvbmNhdCh0aGlzLnNob3dTZWNvbmRzP1snc2Vjb25kcyddOltdKTt2YXIgaW5kZXg9bGlzdC5pbmRleE9mKHRoaXMuc2VsZWN0aW9uUmFuZ2VbMF0pO3ZhciBuZXh0PShpbmRleCtzdGVwK2xpc3QubGVuZ3RoKSVsaXN0Lmxlbmd0aDt0aGlzLiRyZWZzLnNwaW5uZXIuZW1pdFNlbGVjdFJhbmdlKG1hcHBpbmdbbmV4dF0pO319LG1vdW50ZWQ6ZnVuY3Rpb24gbW91bnRlZCgpe3ZhciBfdGhpczM9dGhpczt0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe3JldHVybiBfdGhpczMuaGFuZGxlQ29uZmlybSh0cnVlLHRydWUpO30pO3RoaXMuJGVtaXQoJ21vdW50ZWQnKTt9fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9wYW5lbC90aW1lLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYW5lbF90aW1ldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXRpbWV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGFuZWwvdGltZS52dWUKLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciB0aW1lX2NvbXBvbmVudD1ub3JtYWxpemVDb21wb25lbnQocGFuZWxfdGltZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyx0aW1ldnVlX3R5cGVfdGVtcGxhdGVfaWRfM2Q5MzkwODlfcmVuZGVyLHRpbWV2dWVfdHlwZV90ZW1wbGF0ZV9pZF8zZDkzOTA4OV9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIHRpbWVfYXBpO310aW1lX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BhbmVsL3RpbWUudnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhbmVsX3RpbWU9dGltZV9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9iYXNpYy95ZWFyLXRhYmxlLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD1jODZhYjVlMCYKdmFyIHllYXJfdGFibGV2dWVfdHlwZV90ZW1wbGF0ZV9pZF9jODZhYjVlMF9yZW5kZXI9ZnVuY3Rpb24geWVhcl90YWJsZXZ1ZV90eXBlX3RlbXBsYXRlX2lkX2M4NmFiNWUwX3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygidGFibGUiLHtzdGF0aWNDbGFzczoiZWwteWVhci10YWJsZSIsb246e2NsaWNrOl92bS5oYW5kbGVZZWFyVGFibGVDbGlja319LFtfYygidGJvZHkiLFtfYygidHIiLFtfYygidGQiLHtzdGF0aWNDbGFzczoiYXZhaWxhYmxlIixjbGFzczpfdm0uZ2V0Q2VsbFN0eWxlKF92bS5zdGFydFllYXIrMCl9LFtfYygiYSIse3N0YXRpY0NsYXNzOiJjZWxsIn0sW192bS5fdihfdm0uX3MoX3ZtLnN0YXJ0WWVhcikpXSldKSxfYygidGQiLHtzdGF0aWNDbGFzczoiYXZhaWxhYmxlIixjbGFzczpfdm0uZ2V0Q2VsbFN0eWxlKF92bS5zdGFydFllYXIrMSl9LFtfYygiYSIse3N0YXRpY0NsYXNzOiJjZWxsIn0sW192bS5fdihfdm0uX3MoX3ZtLnN0YXJ0WWVhcisxKSldKV0pLF9jKCJ0ZCIse3N0YXRpY0NsYXNzOiJhdmFpbGFibGUiLGNsYXNzOl92bS5nZXRDZWxsU3R5bGUoX3ZtLnN0YXJ0WWVhcisyKX0sW19jKCJhIix7c3RhdGljQ2xhc3M6ImNlbGwifSxbX3ZtLl92KF92bS5fcyhfdm0uc3RhcnRZZWFyKzIpKV0pXSksX2MoInRkIix7c3RhdGljQ2xhc3M6ImF2YWlsYWJsZSIsY2xhc3M6X3ZtLmdldENlbGxTdHlsZShfdm0uc3RhcnRZZWFyKzMpfSxbX2MoImEiLHtzdGF0aWNDbGFzczoiY2VsbCJ9LFtfdm0uX3YoX3ZtLl9zKF92bS5zdGFydFllYXIrMykpXSldKV0pLF9jKCJ0ciIsW19jKCJ0ZCIse3N0YXRpY0NsYXNzOiJhdmFpbGFibGUiLGNsYXNzOl92bS5nZXRDZWxsU3R5bGUoX3ZtLnN0YXJ0WWVhcis0KX0sW19jKCJhIix7c3RhdGljQ2xhc3M6ImNlbGwifSxbX3ZtLl92KF92bS5fcyhfdm0uc3RhcnRZZWFyKzQpKV0pXSksX2MoInRkIix7c3RhdGljQ2xhc3M6ImF2YWlsYWJsZSIsY2xhc3M6X3ZtLmdldENlbGxTdHlsZShfdm0uc3RhcnRZZWFyKzUpfSxbX2MoImEiLHtzdGF0aWNDbGFzczoiY2VsbCJ9LFtfdm0uX3YoX3ZtLl9zKF92bS5zdGFydFllYXIrNSkpXSldKSxfYygidGQiLHtzdGF0aWNDbGFzczoiYXZhaWxhYmxlIixjbGFzczpfdm0uZ2V0Q2VsbFN0eWxlKF92bS5zdGFydFllYXIrNil9LFtfYygiYSIse3N0YXRpY0NsYXNzOiJjZWxsIn0sW192bS5fdihfdm0uX3MoX3ZtLnN0YXJ0WWVhcis2KSldKV0pLF9jKCJ0ZCIse3N0YXRpY0NsYXNzOiJhdmFpbGFibGUiLGNsYXNzOl92bS5nZXRDZWxsU3R5bGUoX3ZtLnN0YXJ0WWVhcis3KX0sW19jKCJhIix7c3RhdGljQ2xhc3M6ImNlbGwifSxbX3ZtLl92KF92bS5fcyhfdm0uc3RhcnRZZWFyKzcpKV0pXSldKSxfYygidHIiLFtfYygidGQiLHtzdGF0aWNDbGFzczoiYXZhaWxhYmxlIixjbGFzczpfdm0uZ2V0Q2VsbFN0eWxlKF92bS5zdGFydFllYXIrOCl9LFtfYygiYSIse3N0YXRpY0NsYXNzOiJjZWxsIn0sW192bS5fdihfdm0uX3MoX3ZtLnN0YXJ0WWVhcis4KSldKV0pLF9jKCJ0ZCIse3N0YXRpY0NsYXNzOiJhdmFpbGFibGUiLGNsYXNzOl92bS5nZXRDZWxsU3R5bGUoX3ZtLnN0YXJ0WWVhcis5KX0sW19jKCJhIix7c3RhdGljQ2xhc3M6ImNlbGwifSxbX3ZtLl92KF92bS5fcyhfdm0uc3RhcnRZZWFyKzkpKV0pXSksX2MoInRkIiksX2MoInRkIildKV0pXSk7fTt2YXIgeWVhcl90YWJsZXZ1ZV90eXBlX3RlbXBsYXRlX2lkX2M4NmFiNWUwX3N0YXRpY1JlbmRlckZucz1bXTt5ZWFyX3RhYmxldnVlX3R5cGVfdGVtcGxhdGVfaWRfYzg2YWI1ZTBfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9iYXNpYy95ZWFyLXRhYmxlLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD1jODZhYjVlMCYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL2Jhc2ljL3llYXItdGFibGUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwp2YXIgeWVhcl90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2RhdGVzSW5ZZWFyPWZ1bmN0aW9uIGRhdGVzSW5ZZWFyKHllYXIpe3ZhciBudW1PZkRheXM9T2JqZWN0KGRhdGVfdXRpbF9bImdldERheUNvdW50T2ZZZWFyIl0pKHllYXIpO3ZhciBmaXJzdERheT1uZXcgRGF0ZSh5ZWFyLDAsMSk7cmV0dXJuIE9iamVjdChkYXRlX3V0aWxfWyJyYW5nZSJdKShudW1PZkRheXMpLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gT2JqZWN0KGRhdGVfdXRpbF9bIm5leHREYXRlIl0pKGZpcnN0RGF5LG4pO30pO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciB5ZWFyX3RhYmxldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtwcm9wczp7ZGlzYWJsZWREYXRlOnt9LHZhbHVlOnt9LGRlZmF1bHRWYWx1ZTp7dmFsaWRhdG9yOmZ1bmN0aW9uIHZhbGlkYXRvcih2YWwpey8vIG51bGwgb3IgdmFsaWQgRGF0ZSBPYmplY3QKcmV0dXJuIHZhbD09PW51bGx8fHZhbCBpbnN0YW5jZW9mIERhdGUmJk9iamVjdChkYXRlX3V0aWxfWyJpc0RhdGUiXSkodmFsKTt9fSxkYXRlOnt9fSxjb21wdXRlZDp7c3RhcnRZZWFyOmZ1bmN0aW9uIHN0YXJ0WWVhcigpe3JldHVybiBNYXRoLmZsb29yKHRoaXMuZGF0ZS5nZXRGdWxsWWVhcigpLzEwKSoxMDt9fSxtZXRob2RzOntnZXRDZWxsU3R5bGU6ZnVuY3Rpb24gZ2V0Q2VsbFN0eWxlKHllYXIpe3ZhciBzdHlsZT17fTt2YXIgdG9kYXk9bmV3IERhdGUoKTtzdHlsZS5kaXNhYmxlZD10eXBlb2YgdGhpcy5kaXNhYmxlZERhdGU9PT0nZnVuY3Rpb24nP3llYXJfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19kYXRlc0luWWVhcih5ZWFyKS5ldmVyeSh0aGlzLmRpc2FibGVkRGF0ZSk6ZmFsc2U7c3R5bGUuY3VycmVudD1PYmplY3QodXRpbF9bImFycmF5RmluZEluZGV4Il0pKE9iamVjdCh1dGlsX1siY29lcmNlVHJ1dGh5VmFsdWVUb0FycmF5Il0pKHRoaXMudmFsdWUpLGZ1bmN0aW9uKGRhdGUpe3JldHVybiBkYXRlLmdldEZ1bGxZZWFyKCk9PT15ZWFyO30pPj0wO3N0eWxlLnRvZGF5PXRvZGF5LmdldEZ1bGxZZWFyKCk9PT15ZWFyO3N0eWxlLmRlZmF1bHQ9dGhpcy5kZWZhdWx0VmFsdWUmJnRoaXMuZGVmYXVsdFZhbHVlLmdldEZ1bGxZZWFyKCk9PT15ZWFyO3JldHVybiBzdHlsZTt9LGhhbmRsZVllYXJUYWJsZUNsaWNrOmZ1bmN0aW9uIGhhbmRsZVllYXJUYWJsZUNsaWNrKGV2ZW50KXt2YXIgdGFyZ2V0PWV2ZW50LnRhcmdldDtpZih0YXJnZXQudGFnTmFtZT09PSdBJyl7aWYoT2JqZWN0KGRvbV9bImhhc0NsYXNzIl0pKHRhcmdldC5wYXJlbnROb2RlLCdkaXNhYmxlZCcpKXJldHVybjt2YXIgeWVhcj10YXJnZXQudGV4dENvbnRlbnR8fHRhcmdldC5pbm5lclRleHQ7dGhpcy4kZW1pdCgncGljaycsTnVtYmVyKHllYXIpKTt9fX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL2Jhc2ljL3llYXItdGFibGUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGJhc2ljX3llYXJfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189eWVhcl90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9iYXNpYy95ZWFyLXRhYmxlLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIHllYXJfdGFibGVfY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChiYXNpY195ZWFyX3RhYmxldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLHllYXJfdGFibGV2dWVfdHlwZV90ZW1wbGF0ZV9pZF9jODZhYjVlMF9yZW5kZXIseWVhcl90YWJsZXZ1ZV90eXBlX3RlbXBsYXRlX2lkX2M4NmFiNWUwX3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgeWVhcl90YWJsZV9hcGk7fXllYXJfdGFibGVfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvYmFzaWMveWVhci10YWJsZS52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgeWVhcl90YWJsZT15ZWFyX3RhYmxlX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL2Jhc2ljL21vbnRoLXRhYmxlLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD02NTRkNGY0MiYKdmFyIG1vbnRoX3RhYmxldnVlX3R5cGVfdGVtcGxhdGVfaWRfNjU0ZDRmNDJfcmVuZGVyPWZ1bmN0aW9uIG1vbnRoX3RhYmxldnVlX3R5cGVfdGVtcGxhdGVfaWRfNjU0ZDRmNDJfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJ0YWJsZSIse3N0YXRpY0NsYXNzOiJlbC1tb250aC10YWJsZSIsb246e2NsaWNrOl92bS5oYW5kbGVNb250aFRhYmxlQ2xpY2ssbW91c2Vtb3ZlOl92bS5oYW5kbGVNb3VzZU1vdmV9fSxbX2MoInRib2R5Iixfdm0uX2woX3ZtLnJvd3MsZnVuY3Rpb24ocm93LGtleSl7cmV0dXJuIF9jKCJ0ciIse2tleTprZXl9LF92bS5fbChyb3csZnVuY3Rpb24oY2VsbCxrZXkpe3JldHVybiBfYygidGQiLHtrZXk6a2V5LGNsYXNzOl92bS5nZXRDZWxsU3R5bGUoY2VsbCl9LFtfYygiZGl2IixbX2MoImEiLHtzdGF0aWNDbGFzczoiY2VsbCJ9LFtfdm0uX3YoX3ZtLl9zKF92bS50KCJlbC5kYXRlcGlja2VyLm1vbnRocy4iK192bS5tb250aHNbY2VsbC50ZXh0XSkpKV0pXSldKTt9KSwwKTt9KSwwKV0pO307dmFyIG1vbnRoX3RhYmxldnVlX3R5cGVfdGVtcGxhdGVfaWRfNjU0ZDRmNDJfc3RhdGljUmVuZGVyRm5zPVtdO21vbnRoX3RhYmxldnVlX3R5cGVfdGVtcGxhdGVfaWRfNjU0ZDRmNDJfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9iYXNpYy9tb250aC10YWJsZS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NjU0ZDRmNDImCi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9iYXNpYy9tb250aC10YWJsZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCnZhciBtb250aF90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2RhdGVzSW5Nb250aD1mdW5jdGlvbiBkYXRlc0luTW9udGgoeWVhcixtb250aCl7dmFyIG51bU9mRGF5cz1PYmplY3QoZGF0ZV91dGlsX1siZ2V0RGF5Q291bnRPZk1vbnRoIl0pKHllYXIsbW9udGgpO3ZhciBmaXJzdERheT1uZXcgRGF0ZSh5ZWFyLG1vbnRoLDEpO3JldHVybiBPYmplY3QoZGF0ZV91dGlsX1sicmFuZ2UiXSkobnVtT2ZEYXlzKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIE9iamVjdChkYXRlX3V0aWxfWyJuZXh0RGF0ZSJdKShmaXJzdERheSxuKTt9KTt9O3ZhciBjbGVhckRhdGU9ZnVuY3Rpb24gY2xlYXJEYXRlKGRhdGUpe3JldHVybiBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksZGF0ZS5nZXRNb250aCgpKTt9O3ZhciBnZXRNb250aFRpbWVzdGFtcD1mdW5jdGlvbiBnZXRNb250aFRpbWVzdGFtcCh0aW1lKXtpZih0eXBlb2YgdGltZT09PSdudW1iZXInfHx0eXBlb2YgdGltZT09PSdzdHJpbmcnKXtyZXR1cm4gY2xlYXJEYXRlKG5ldyBEYXRlKHRpbWUpKS5nZXRUaW1lKCk7fWVsc2UgaWYodGltZSBpbnN0YW5jZW9mIERhdGUpe3JldHVybiBjbGVhckRhdGUodGltZSkuZ2V0VGltZSgpO31lbHNle3JldHVybiBOYU47fX07LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBtb250aF90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17cHJvcHM6e2Rpc2FibGVkRGF0ZTp7fSx2YWx1ZTp7fSxzZWxlY3Rpb25Nb2RlOntkZWZhdWx0Oidtb250aCd9LG1pbkRhdGU6e30sbWF4RGF0ZTp7fSxkZWZhdWx0VmFsdWU6e3ZhbGlkYXRvcjpmdW5jdGlvbiB2YWxpZGF0b3IodmFsKXsvLyBudWxsIG9yIHZhbGlkIERhdGUgT2JqZWN0CnJldHVybiB2YWw9PT1udWxsfHxPYmplY3QoZGF0ZV91dGlsX1siaXNEYXRlIl0pKHZhbCl8fEFycmF5LmlzQXJyYXkodmFsKSYmdmFsLmV2ZXJ5KGRhdGVfdXRpbF9bImlzRGF0ZSJdKTt9fSxkYXRlOnt9LHJhbmdlU3RhdGU6e2RlZmF1bHQ6ZnVuY3Rpb24gX2RlZmF1bHQoKXtyZXR1cm57ZW5kRGF0ZTpudWxsLHNlbGVjdGluZzpmYWxzZX07fX19LG1peGluczpbbG9jYWxlX2RlZmF1bHQuYV0sd2F0Y2g6eydyYW5nZVN0YXRlLmVuZERhdGUnOmZ1bmN0aW9uIHJhbmdlU3RhdGVFbmREYXRlKG5ld1ZhbCl7dGhpcy5tYXJrUmFuZ2UodGhpcy5taW5EYXRlLG5ld1ZhbCk7fSxtaW5EYXRlOmZ1bmN0aW9uIG1pbkRhdGUobmV3VmFsLG9sZFZhbCl7aWYoZ2V0TW9udGhUaW1lc3RhbXAobmV3VmFsKSE9PWdldE1vbnRoVGltZXN0YW1wKG9sZFZhbCkpe3RoaXMubWFya1JhbmdlKHRoaXMubWluRGF0ZSx0aGlzLm1heERhdGUpO319LG1heERhdGU6ZnVuY3Rpb24gbWF4RGF0ZShuZXdWYWwsb2xkVmFsKXtpZihnZXRNb250aFRpbWVzdGFtcChuZXdWYWwpIT09Z2V0TW9udGhUaW1lc3RhbXAob2xkVmFsKSl7dGhpcy5tYXJrUmFuZ2UodGhpcy5taW5EYXRlLHRoaXMubWF4RGF0ZSk7fX19LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybnttb250aHM6WydqYW4nLCdmZWInLCdtYXInLCdhcHInLCdtYXknLCdqdW4nLCdqdWwnLCdhdWcnLCdzZXAnLCdvY3QnLCdub3YnLCdkZWMnXSx0YWJsZVJvd3M6W1tdLFtdLFtdXSxsYXN0Um93Om51bGwsbGFzdENvbHVtbjpudWxsfTt9LG1ldGhvZHM6e2NlbGxNYXRjaGVzRGF0ZTpmdW5jdGlvbiBjZWxsTWF0Y2hlc0RhdGUoY2VsbCxkYXRlKXt2YXIgdmFsdWU9bmV3IERhdGUoZGF0ZSk7cmV0dXJuIHRoaXMuZGF0ZS5nZXRGdWxsWWVhcigpPT09dmFsdWUuZ2V0RnVsbFllYXIoKSYmTnVtYmVyKGNlbGwudGV4dCk9PT12YWx1ZS5nZXRNb250aCgpO30sZ2V0Q2VsbFN0eWxlOmZ1bmN0aW9uIGdldENlbGxTdHlsZShjZWxsKXt2YXIgX3RoaXM9dGhpczt2YXIgc3R5bGU9e307dmFyIHllYXI9dGhpcy5kYXRlLmdldEZ1bGxZZWFyKCk7dmFyIHRvZGF5PW5ldyBEYXRlKCk7dmFyIG1vbnRoPWNlbGwudGV4dDt2YXIgZGVmYXVsdFZhbHVlPXRoaXMuZGVmYXVsdFZhbHVlP0FycmF5LmlzQXJyYXkodGhpcy5kZWZhdWx0VmFsdWUpP3RoaXMuZGVmYXVsdFZhbHVlOlt0aGlzLmRlZmF1bHRWYWx1ZV06W107c3R5bGUuZGlzYWJsZWQ9dHlwZW9mIHRoaXMuZGlzYWJsZWREYXRlPT09J2Z1bmN0aW9uJz9tb250aF90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2RhdGVzSW5Nb250aCh5ZWFyLG1vbnRoKS5ldmVyeSh0aGlzLmRpc2FibGVkRGF0ZSk6ZmFsc2U7c3R5bGUuY3VycmVudD1PYmplY3QodXRpbF9bImFycmF5RmluZEluZGV4Il0pKE9iamVjdCh1dGlsX1siY29lcmNlVHJ1dGh5VmFsdWVUb0FycmF5Il0pKHRoaXMudmFsdWUpLGZ1bmN0aW9uKGRhdGUpe3JldHVybiBkYXRlLmdldEZ1bGxZZWFyKCk9PT15ZWFyJiZkYXRlLmdldE1vbnRoKCk9PT1tb250aDt9KT49MDtzdHlsZS50b2RheT10b2RheS5nZXRGdWxsWWVhcigpPT09eWVhciYmdG9kYXkuZ2V0TW9udGgoKT09PW1vbnRoO3N0eWxlLmRlZmF1bHQ9ZGVmYXVsdFZhbHVlLnNvbWUoZnVuY3Rpb24oZGF0ZSl7cmV0dXJuIF90aGlzLmNlbGxNYXRjaGVzRGF0ZShjZWxsLGRhdGUpO30pO2lmKGNlbGwuaW5SYW5nZSl7c3R5bGVbJ2luLXJhbmdlJ109dHJ1ZTtpZihjZWxsLnN0YXJ0KXtzdHlsZVsnc3RhcnQtZGF0ZSddPXRydWU7fWlmKGNlbGwuZW5kKXtzdHlsZVsnZW5kLWRhdGUnXT10cnVlO319cmV0dXJuIHN0eWxlO30sZ2V0TW9udGhPZkNlbGw6ZnVuY3Rpb24gZ2V0TW9udGhPZkNlbGwobW9udGgpe3ZhciB5ZWFyPXRoaXMuZGF0ZS5nZXRGdWxsWWVhcigpO3JldHVybiBuZXcgRGF0ZSh5ZWFyLG1vbnRoLDEpO30sbWFya1JhbmdlOmZ1bmN0aW9uIG1hcmtSYW5nZShtaW5EYXRlLG1heERhdGUpe21pbkRhdGU9Z2V0TW9udGhUaW1lc3RhbXAobWluRGF0ZSk7bWF4RGF0ZT1nZXRNb250aFRpbWVzdGFtcChtYXhEYXRlKXx8bWluRGF0ZTt2YXIgX3JlZj1bTWF0aC5taW4obWluRGF0ZSxtYXhEYXRlKSxNYXRoLm1heChtaW5EYXRlLG1heERhdGUpXTttaW5EYXRlPV9yZWZbMF07bWF4RGF0ZT1fcmVmWzFdO3ZhciByb3dzPXRoaXMucm93cztmb3IodmFyIGk9MCxrPXJvd3MubGVuZ3RoO2k8aztpKyspe3ZhciByb3c9cm93c1tpXTtmb3IodmFyIGo9MCxsPXJvdy5sZW5ndGg7ajxsO2orKyl7dmFyIGNlbGw9cm93W2pdO3ZhciBpbmRleD1pKjQrajt2YXIgdGltZT1uZXcgRGF0ZSh0aGlzLmRhdGUuZ2V0RnVsbFllYXIoKSxpbmRleCkuZ2V0VGltZSgpO2NlbGwuaW5SYW5nZT1taW5EYXRlJiZ0aW1lPj1taW5EYXRlJiZ0aW1lPD1tYXhEYXRlO2NlbGwuc3RhcnQ9bWluRGF0ZSYmdGltZT09PW1pbkRhdGU7Y2VsbC5lbmQ9bWF4RGF0ZSYmdGltZT09PW1heERhdGU7fX19LGhhbmRsZU1vdXNlTW92ZTpmdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmUoZXZlbnQpe2lmKCF0aGlzLnJhbmdlU3RhdGUuc2VsZWN0aW5nKXJldHVybjt2YXIgdGFyZ2V0PWV2ZW50LnRhcmdldDtpZih0YXJnZXQudGFnTmFtZT09PSdBJyl7dGFyZ2V0PXRhcmdldC5wYXJlbnROb2RlLnBhcmVudE5vZGU7fWlmKHRhcmdldC50YWdOYW1lPT09J0RJVicpe3RhcmdldD10YXJnZXQucGFyZW50Tm9kZTt9aWYodGFyZ2V0LnRhZ05hbWUhPT0nVEQnKXJldHVybjt2YXIgcm93PXRhcmdldC5wYXJlbnROb2RlLnJvd0luZGV4O3ZhciBjb2x1bW49dGFyZ2V0LmNlbGxJbmRleDsvLyBjYW4gbm90IHNlbGVjdCBkaXNhYmxlZCBkYXRlCmlmKHRoaXMucm93c1tyb3ddW2NvbHVtbl0uZGlzYWJsZWQpcmV0dXJuOy8vIG9ubHkgdXBkYXRlIHJhbmdlU3RhdGUgd2hlbiBtb3VzZSBtb3ZlcyB0byBhIG5ldyBjZWxsCi8vIHRoaXMgYXZvaWRzIGZyZXF1ZW50IERhdGUgb2JqZWN0IGNyZWF0aW9uIGFuZCBpbXByb3ZlcyBwZXJmb3JtYW5jZQppZihyb3chPT10aGlzLmxhc3RSb3d8fGNvbHVtbiE9PXRoaXMubGFzdENvbHVtbil7dGhpcy5sYXN0Um93PXJvdzt0aGlzLmxhc3RDb2x1bW49Y29sdW1uO3RoaXMuJGVtaXQoJ2NoYW5nZXJhbmdlJyx7bWluRGF0ZTp0aGlzLm1pbkRhdGUsbWF4RGF0ZTp0aGlzLm1heERhdGUscmFuZ2VTdGF0ZTp7c2VsZWN0aW5nOnRydWUsZW5kRGF0ZTp0aGlzLmdldE1vbnRoT2ZDZWxsKHJvdyo0K2NvbHVtbil9fSk7fX0saGFuZGxlTW9udGhUYWJsZUNsaWNrOmZ1bmN0aW9uIGhhbmRsZU1vbnRoVGFibGVDbGljayhldmVudCl7dmFyIHRhcmdldD1ldmVudC50YXJnZXQ7aWYodGFyZ2V0LnRhZ05hbWU9PT0nQScpe3RhcmdldD10YXJnZXQucGFyZW50Tm9kZS5wYXJlbnROb2RlO31pZih0YXJnZXQudGFnTmFtZT09PSdESVYnKXt0YXJnZXQ9dGFyZ2V0LnBhcmVudE5vZGU7fWlmKHRhcmdldC50YWdOYW1lIT09J1REJylyZXR1cm47aWYoT2JqZWN0KGRvbV9bImhhc0NsYXNzIl0pKHRhcmdldCwnZGlzYWJsZWQnKSlyZXR1cm47dmFyIGNvbHVtbj10YXJnZXQuY2VsbEluZGV4O3ZhciByb3c9dGFyZ2V0LnBhcmVudE5vZGUucm93SW5kZXg7dmFyIG1vbnRoPXJvdyo0K2NvbHVtbjt2YXIgbmV3RGF0ZT10aGlzLmdldE1vbnRoT2ZDZWxsKG1vbnRoKTtpZih0aGlzLnNlbGVjdGlvbk1vZGU9PT0ncmFuZ2UnKXtpZighdGhpcy5yYW5nZVN0YXRlLnNlbGVjdGluZyl7dGhpcy4kZW1pdCgncGljaycse21pbkRhdGU6bmV3RGF0ZSxtYXhEYXRlOm51bGx9KTt0aGlzLnJhbmdlU3RhdGUuc2VsZWN0aW5nPXRydWU7fWVsc2V7aWYobmV3RGF0ZT49dGhpcy5taW5EYXRlKXt0aGlzLiRlbWl0KCdwaWNrJyx7bWluRGF0ZTp0aGlzLm1pbkRhdGUsbWF4RGF0ZTpuZXdEYXRlfSk7fWVsc2V7dGhpcy4kZW1pdCgncGljaycse21pbkRhdGU6bmV3RGF0ZSxtYXhEYXRlOnRoaXMubWluRGF0ZX0pO310aGlzLnJhbmdlU3RhdGUuc2VsZWN0aW5nPWZhbHNlO319ZWxzZXt0aGlzLiRlbWl0KCdwaWNrJyxtb250aCk7fX19LGNvbXB1dGVkOntyb3dzOmZ1bmN0aW9uIHJvd3MoKXt2YXIgX3RoaXMyPXRoaXM7Ly8gVE9ETzogcmVmYWN0b3J5IHJvd3MgLyBnZXRDZWxsQ2xhc3Nlcwp2YXIgcm93cz10aGlzLnRhYmxlUm93czt2YXIgZGlzYWJsZWREYXRlPXRoaXMuZGlzYWJsZWREYXRlO3ZhciBzZWxlY3RlZERhdGU9W107dmFyIG5vdz1nZXRNb250aFRpbWVzdGFtcChuZXcgRGF0ZSgpKTtmb3IodmFyIGk9MDtpPDM7aSsrKXt2YXIgcm93PXJvd3NbaV07dmFyIF9sb29wPWZ1bmN0aW9uIF9sb29wKGope3ZhciBjZWxsPXJvd1tqXTtpZighY2VsbCl7Y2VsbD17cm93OmksY29sdW1uOmosdHlwZTonbm9ybWFsJyxpblJhbmdlOmZhbHNlLHN0YXJ0OmZhbHNlLGVuZDpmYWxzZX07fWNlbGwudHlwZT0nbm9ybWFsJzt2YXIgaW5kZXg9aSo0K2o7dmFyIHRpbWU9bmV3IERhdGUoX3RoaXMyLmRhdGUuZ2V0RnVsbFllYXIoKSxpbmRleCkuZ2V0VGltZSgpO2NlbGwuaW5SYW5nZT10aW1lPj1nZXRNb250aFRpbWVzdGFtcChfdGhpczIubWluRGF0ZSkmJnRpbWU8PWdldE1vbnRoVGltZXN0YW1wKF90aGlzMi5tYXhEYXRlKTtjZWxsLnN0YXJ0PV90aGlzMi5taW5EYXRlJiZ0aW1lPT09Z2V0TW9udGhUaW1lc3RhbXAoX3RoaXMyLm1pbkRhdGUpO2NlbGwuZW5kPV90aGlzMi5tYXhEYXRlJiZ0aW1lPT09Z2V0TW9udGhUaW1lc3RhbXAoX3RoaXMyLm1heERhdGUpO3ZhciBpc1RvZGF5PXRpbWU9PT1ub3c7aWYoaXNUb2RheSl7Y2VsbC50eXBlPSd0b2RheSc7fWNlbGwudGV4dD1pbmRleDt2YXIgY2VsbERhdGU9bmV3IERhdGUodGltZSk7Y2VsbC5kaXNhYmxlZD10eXBlb2YgZGlzYWJsZWREYXRlPT09J2Z1bmN0aW9uJyYmZGlzYWJsZWREYXRlKGNlbGxEYXRlKTtjZWxsLnNlbGVjdGVkPU9iamVjdCh1dGlsX1siYXJyYXlGaW5kIl0pKHNlbGVjdGVkRGF0ZSxmdW5jdGlvbihkYXRlKXtyZXR1cm4gZGF0ZS5nZXRUaW1lKCk9PT1jZWxsRGF0ZS5nZXRUaW1lKCk7fSk7X3RoaXMyLiRzZXQocm93LGosY2VsbCk7fTtmb3IodmFyIGo9MDtqPDQ7aisrKXtfbG9vcChqKTt9fXJldHVybiByb3dzO319fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9iYXNpYy9tb250aC10YWJsZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgYmFzaWNfbW9udGhfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189bW9udGhfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvYmFzaWMvbW9udGgtdGFibGUudnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgbW9udGhfdGFibGVfY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChiYXNpY19tb250aF90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxtb250aF90YWJsZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzY1NGQ0ZjQyX3JlbmRlcixtb250aF90YWJsZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzY1NGQ0ZjQyX3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgbW9udGhfdGFibGVfYXBpO31tb250aF90YWJsZV9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9iYXNpYy9tb250aC10YWJsZS52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgbW9udGhfdGFibGU9bW9udGhfdGFibGVfY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvYmFzaWMvZGF0ZS10YWJsZS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NWQxZjMzNDEmCnZhciBkYXRlX3RhYmxldnVlX3R5cGVfdGVtcGxhdGVfaWRfNWQxZjMzNDFfcmVuZGVyPWZ1bmN0aW9uIGRhdGVfdGFibGV2dWVfdHlwZV90ZW1wbGF0ZV9pZF81ZDFmMzM0MV9yZW5kZXIoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDt2YXIgX2M9X3ZtLl9zZWxmLl9jfHxfaDtyZXR1cm4gX2MoInRhYmxlIix7c3RhdGljQ2xhc3M6ImVsLWRhdGUtdGFibGUiLGNsYXNzOnsiaXMtd2Vlay1tb2RlIjpfdm0uc2VsZWN0aW9uTW9kZT09PSJ3ZWVrIn0sYXR0cnM6e2NlbGxzcGFjaW5nOiIwIixjZWxscGFkZGluZzoiMCJ9LG9uOntjbGljazpfdm0uaGFuZGxlQ2xpY2ssbW91c2Vtb3ZlOl92bS5oYW5kbGVNb3VzZU1vdmV9fSxbX2MoInRib2R5IixbX2MoInRyIixbX3ZtLnNob3dXZWVrTnVtYmVyP19jKCJ0aCIsW192bS5fdihfdm0uX3MoX3ZtLnQoImVsLmRhdGVwaWNrZXIud2VlayIpKSldKTpfdm0uX2UoKSxfdm0uX2woX3ZtLldFRUtTLGZ1bmN0aW9uKHdlZWssa2V5KXtyZXR1cm4gX2MoInRoIix7a2V5OmtleX0sW192bS5fdihfdm0uX3MoX3ZtLnQoImVsLmRhdGVwaWNrZXIud2Vla3MuIit3ZWVrKSkpXSk7fSldLDIpLF92bS5fbChfdm0ucm93cyxmdW5jdGlvbihyb3csa2V5KXtyZXR1cm4gX2MoInRyIix7a2V5OmtleSxzdGF0aWNDbGFzczoiZWwtZGF0ZS10YWJsZV9fcm93IixjbGFzczp7Y3VycmVudDpfdm0uaXNXZWVrQWN0aXZlKHJvd1sxXSl9fSxfdm0uX2wocm93LGZ1bmN0aW9uKGNlbGwsa2V5KXtyZXR1cm4gX2MoInRkIix7a2V5OmtleSxjbGFzczpfdm0uZ2V0Q2VsbENsYXNzZXMoY2VsbCl9LFtfYygiZGl2IixbX2MoInNwYW4iLFtfdm0uX3YoIlxuICAgICAgICAgICIrX3ZtLl9zKGNlbGwudGV4dCkrIlxuICAgICAgICAiKV0pXSldKTt9KSwwKTt9KV0sMildKTt9O3ZhciBkYXRlX3RhYmxldnVlX3R5cGVfdGVtcGxhdGVfaWRfNWQxZjMzNDFfc3RhdGljUmVuZGVyRm5zPVtdO2RhdGVfdGFibGV2dWVfdHlwZV90ZW1wbGF0ZV9pZF81ZDFmMzM0MV9yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL2Jhc2ljL2RhdGUtdGFibGUudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTVkMWYzMzQxJgovLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvYmFzaWMvZGF0ZS10YWJsZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCnZhciBfV0VFS1M9WydzdW4nLCdtb24nLCd0dWUnLCd3ZWQnLCd0aHUnLCdmcmknLCdzYXQnXTt2YXIgZGF0ZV90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2dldERhdGVUaW1lc3RhbXA9ZnVuY3Rpb24gZ2V0RGF0ZVRpbWVzdGFtcCh0aW1lKXtpZih0eXBlb2YgdGltZT09PSdudW1iZXInfHx0eXBlb2YgdGltZT09PSdzdHJpbmcnKXtyZXR1cm4gT2JqZWN0KGRhdGVfdXRpbF9bImNsZWFyVGltZSJdKShuZXcgRGF0ZSh0aW1lKSkuZ2V0VGltZSgpO31lbHNlIGlmKHRpbWUgaW5zdGFuY2VvZiBEYXRlKXtyZXR1cm4gT2JqZWN0KGRhdGVfdXRpbF9bImNsZWFyVGltZSJdKSh0aW1lKS5nZXRUaW1lKCk7fWVsc2V7cmV0dXJuIE5hTjt9fTsvLyByZW1vdmUgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBzYXRpc2ZpZXMgYHByZWRgIGZyb20gYXJyCi8vIHJldHVybiBhIG5ldyBhcnJheSBpZiBtb2RpZmljYXRpb24gb2NjdXJzCi8vIHJldHVybiB0aGUgb3JpZ2luYWwgYXJyYXkgb3RoZXJ3aXNlCnZhciBkYXRlX3RhYmxldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfcmVtb3ZlRnJvbUFycmF5PWZ1bmN0aW9uIHJlbW92ZUZyb21BcnJheShhcnIscHJlZCl7dmFyIGlkeD10eXBlb2YgcHJlZD09PSdmdW5jdGlvbic/T2JqZWN0KHV0aWxfWyJhcnJheUZpbmRJbmRleCJdKShhcnIscHJlZCk6YXJyLmluZGV4T2YocHJlZCk7cmV0dXJuIGlkeD49MD9bXS5jb25jYXQoYXJyLnNsaWNlKDAsaWR4KSxhcnIuc2xpY2UoaWR4KzEpKTphcnI7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGRhdGVfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e21peGluczpbbG9jYWxlX2RlZmF1bHQuYV0scHJvcHM6e2ZpcnN0RGF5T2ZXZWVrOntkZWZhdWx0OjcsdHlwZTpOdW1iZXIsdmFsaWRhdG9yOmZ1bmN0aW9uIHZhbGlkYXRvcih2YWwpe3JldHVybiB2YWw+PTEmJnZhbDw9Nzt9fSx2YWx1ZTp7fSxkZWZhdWx0VmFsdWU6e3ZhbGlkYXRvcjpmdW5jdGlvbiB2YWxpZGF0b3IodmFsKXsvLyBlaXRoZXI6IG51bGwsIHZhbGlkIERhdGUgb2JqZWN0LCBBcnJheSBvZiB2YWxpZCBEYXRlIG9iamVjdHMKcmV0dXJuIHZhbD09PW51bGx8fE9iamVjdChkYXRlX3V0aWxfWyJpc0RhdGUiXSkodmFsKXx8QXJyYXkuaXNBcnJheSh2YWwpJiZ2YWwuZXZlcnkoZGF0ZV91dGlsX1siaXNEYXRlIl0pO319LGRhdGU6e30sc2VsZWN0aW9uTW9kZTp7ZGVmYXVsdDonZGF5J30sc2hvd1dlZWtOdW1iZXI6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OmZhbHNlfSxkaXNhYmxlZERhdGU6e30sY2VsbENsYXNzTmFtZTp7fSxtaW5EYXRlOnt9LG1heERhdGU6e30scmFuZ2VTdGF0ZTp7ZGVmYXVsdDpmdW5jdGlvbiBfZGVmYXVsdCgpe3JldHVybntlbmREYXRlOm51bGwsc2VsZWN0aW5nOmZhbHNlfTt9fX0sY29tcHV0ZWQ6e29mZnNldERheTpmdW5jdGlvbiBvZmZzZXREYXkoKXt2YXIgd2Vlaz10aGlzLmZpcnN0RGF5T2ZXZWVrOy8vIOWRqOaXpeS4uueVjOmZkO+8jOW3puWPs+WBj+enu+eahOWkqeaVsO+8jDMyMTc2NTQg5L6L5aaC5ZGo5LiA5bCx5pivIC0x77yM55uu55qE5piv6LCD5pW05YmN5Lik6KGM5pel5pyf55qE5L2N572uCnJldHVybiB3ZWVrPjM/Ny13ZWVrOi13ZWVrO30sV0VFS1M6ZnVuY3Rpb24gV0VFS1MoKXt2YXIgd2Vlaz10aGlzLmZpcnN0RGF5T2ZXZWVrO3JldHVybiBfV0VFS1MuY29uY2F0KF9XRUVLUykuc2xpY2Uod2Vlayx3ZWVrKzcpO30seWVhcjpmdW5jdGlvbiB5ZWFyKCl7cmV0dXJuIHRoaXMuZGF0ZS5nZXRGdWxsWWVhcigpO30sbW9udGg6ZnVuY3Rpb24gbW9udGgoKXtyZXR1cm4gdGhpcy5kYXRlLmdldE1vbnRoKCk7fSxzdGFydERhdGU6ZnVuY3Rpb24gc3RhcnREYXRlKCl7cmV0dXJuIE9iamVjdChkYXRlX3V0aWxfWyJnZXRTdGFydERhdGVPZk1vbnRoIl0pKHRoaXMueWVhcix0aGlzLm1vbnRoKTt9LHJvd3M6ZnVuY3Rpb24gcm93cygpe3ZhciBfdGhpcz10aGlzOy8vIFRPRE86IHJlZmFjdG9yeSByb3dzIC8gZ2V0Q2VsbENsYXNzZXMKdmFyIGRhdGU9bmV3IERhdGUodGhpcy55ZWFyLHRoaXMubW9udGgsMSk7dmFyIGRheT1PYmplY3QoZGF0ZV91dGlsX1siZ2V0Rmlyc3REYXlPZk1vbnRoIl0pKGRhdGUpOy8vIGRheSBvZiBmaXJzdCBkYXkKdmFyIGRhdGVDb3VudE9mTW9udGg9T2JqZWN0KGRhdGVfdXRpbF9bImdldERheUNvdW50T2ZNb250aCJdKShkYXRlLmdldEZ1bGxZZWFyKCksZGF0ZS5nZXRNb250aCgpKTt2YXIgZGF0ZUNvdW50T2ZMYXN0TW9udGg9T2JqZWN0KGRhdGVfdXRpbF9bImdldERheUNvdW50T2ZNb250aCJdKShkYXRlLmdldEZ1bGxZZWFyKCksZGF0ZS5nZXRNb250aCgpPT09MD8xMTpkYXRlLmdldE1vbnRoKCktMSk7ZGF5PWRheT09PTA/NzpkYXk7dmFyIG9mZnNldD10aGlzLm9mZnNldERheTt2YXIgcm93cz10aGlzLnRhYmxlUm93czt2YXIgY291bnQ9MTt2YXIgc3RhcnREYXRlPXRoaXMuc3RhcnREYXRlO3ZhciBkaXNhYmxlZERhdGU9dGhpcy5kaXNhYmxlZERhdGU7dmFyIGNlbGxDbGFzc05hbWU9dGhpcy5jZWxsQ2xhc3NOYW1lO3ZhciBzZWxlY3RlZERhdGU9dGhpcy5zZWxlY3Rpb25Nb2RlPT09J2RhdGVzJz9PYmplY3QodXRpbF9bImNvZXJjZVRydXRoeVZhbHVlVG9BcnJheSJdKSh0aGlzLnZhbHVlKTpbXTt2YXIgbm93PWRhdGVfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19nZXREYXRlVGltZXN0YW1wKG5ldyBEYXRlKCkpO2Zvcih2YXIgaT0wO2k8NjtpKyspe3ZhciByb3c9cm93c1tpXTtpZih0aGlzLnNob3dXZWVrTnVtYmVyKXtpZighcm93WzBdKXtyb3dbMF09e3R5cGU6J3dlZWsnLHRleHQ6T2JqZWN0KGRhdGVfdXRpbF9bImdldFdlZWtOdW1iZXIiXSkoT2JqZWN0KGRhdGVfdXRpbF9bIm5leHREYXRlIl0pKHN0YXJ0RGF0ZSxpKjcrMSkpfTt9fXZhciBfbG9vcD1mdW5jdGlvbiBfbG9vcChqKXt2YXIgY2VsbD1yb3dbX3RoaXMuc2hvd1dlZWtOdW1iZXI/aisxOmpdO2lmKCFjZWxsKXtjZWxsPXtyb3c6aSxjb2x1bW46aix0eXBlOidub3JtYWwnLGluUmFuZ2U6ZmFsc2Usc3RhcnQ6ZmFsc2UsZW5kOmZhbHNlfTt9Y2VsbC50eXBlPSdub3JtYWwnO3ZhciBpbmRleD1pKjcrajt2YXIgdGltZT1PYmplY3QoZGF0ZV91dGlsX1sibmV4dERhdGUiXSkoc3RhcnREYXRlLGluZGV4LW9mZnNldCkuZ2V0VGltZSgpO2NlbGwuaW5SYW5nZT10aW1lPj1kYXRlX3RhYmxldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfZ2V0RGF0ZVRpbWVzdGFtcChfdGhpcy5taW5EYXRlKSYmdGltZTw9ZGF0ZV90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2dldERhdGVUaW1lc3RhbXAoX3RoaXMubWF4RGF0ZSk7Y2VsbC5zdGFydD1fdGhpcy5taW5EYXRlJiZ0aW1lPT09ZGF0ZV90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2dldERhdGVUaW1lc3RhbXAoX3RoaXMubWluRGF0ZSk7Y2VsbC5lbmQ9X3RoaXMubWF4RGF0ZSYmdGltZT09PWRhdGVfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19nZXREYXRlVGltZXN0YW1wKF90aGlzLm1heERhdGUpO3ZhciBpc1RvZGF5PXRpbWU9PT1ub3c7aWYoaXNUb2RheSl7Y2VsbC50eXBlPSd0b2RheSc7fWlmKGk+PTAmJmk8PTEpe3ZhciBudW1iZXJPZkRheXNGcm9tUHJldmlvdXNNb250aD1kYXkrb2Zmc2V0PDA/NytkYXkrb2Zmc2V0OmRheStvZmZzZXQ7aWYoaitpKjc+PW51bWJlck9mRGF5c0Zyb21QcmV2aW91c01vbnRoKXtjZWxsLnRleHQ9Y291bnQrKzt9ZWxzZXtjZWxsLnRleHQ9ZGF0ZUNvdW50T2ZMYXN0TW9udGgtKG51bWJlck9mRGF5c0Zyb21QcmV2aW91c01vbnRoLWolNykrMStpKjc7Y2VsbC50eXBlPSdwcmV2LW1vbnRoJzt9fWVsc2V7aWYoY291bnQ8PWRhdGVDb3VudE9mTW9udGgpe2NlbGwudGV4dD1jb3VudCsrO31lbHNle2NlbGwudGV4dD1jb3VudCsrLWRhdGVDb3VudE9mTW9udGg7Y2VsbC50eXBlPSduZXh0LW1vbnRoJzt9fXZhciBjZWxsRGF0ZT1uZXcgRGF0ZSh0aW1lKTtjZWxsLmRpc2FibGVkPXR5cGVvZiBkaXNhYmxlZERhdGU9PT0nZnVuY3Rpb24nJiZkaXNhYmxlZERhdGUoY2VsbERhdGUpO2NlbGwuc2VsZWN0ZWQ9T2JqZWN0KHV0aWxfWyJhcnJheUZpbmQiXSkoc2VsZWN0ZWREYXRlLGZ1bmN0aW9uKGRhdGUpe3JldHVybiBkYXRlLmdldFRpbWUoKT09PWNlbGxEYXRlLmdldFRpbWUoKTt9KTtjZWxsLmN1c3RvbUNsYXNzPXR5cGVvZiBjZWxsQ2xhc3NOYW1lPT09J2Z1bmN0aW9uJyYmY2VsbENsYXNzTmFtZShjZWxsRGF0ZSk7X3RoaXMuJHNldChyb3csX3RoaXMuc2hvd1dlZWtOdW1iZXI/aisxOmosY2VsbCk7fTtmb3IodmFyIGo9MDtqPDc7aisrKXtfbG9vcChqKTt9aWYodGhpcy5zZWxlY3Rpb25Nb2RlPT09J3dlZWsnKXt2YXIgc3RhcnQ9dGhpcy5zaG93V2Vla051bWJlcj8xOjA7dmFyIGVuZD10aGlzLnNob3dXZWVrTnVtYmVyPzc6Njt2YXIgaXNXZWVrQWN0aXZlPXRoaXMuaXNXZWVrQWN0aXZlKHJvd1tzdGFydCsxXSk7cm93W3N0YXJ0XS5pblJhbmdlPWlzV2Vla0FjdGl2ZTtyb3dbc3RhcnRdLnN0YXJ0PWlzV2Vla0FjdGl2ZTtyb3dbZW5kXS5pblJhbmdlPWlzV2Vla0FjdGl2ZTtyb3dbZW5kXS5lbmQ9aXNXZWVrQWN0aXZlO319cmV0dXJuIHJvd3M7fX0sd2F0Y2g6eydyYW5nZVN0YXRlLmVuZERhdGUnOmZ1bmN0aW9uIHJhbmdlU3RhdGVFbmREYXRlKG5ld1ZhbCl7dGhpcy5tYXJrUmFuZ2UodGhpcy5taW5EYXRlLG5ld1ZhbCk7fSxtaW5EYXRlOmZ1bmN0aW9uIG1pbkRhdGUobmV3VmFsLG9sZFZhbCl7aWYoZGF0ZV90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2dldERhdGVUaW1lc3RhbXAobmV3VmFsKSE9PWRhdGVfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19nZXREYXRlVGltZXN0YW1wKG9sZFZhbCkpe3RoaXMubWFya1JhbmdlKHRoaXMubWluRGF0ZSx0aGlzLm1heERhdGUpO319LG1heERhdGU6ZnVuY3Rpb24gbWF4RGF0ZShuZXdWYWwsb2xkVmFsKXtpZihkYXRlX3RhYmxldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfZ2V0RGF0ZVRpbWVzdGFtcChuZXdWYWwpIT09ZGF0ZV90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2dldERhdGVUaW1lc3RhbXAob2xkVmFsKSl7dGhpcy5tYXJrUmFuZ2UodGhpcy5taW5EYXRlLHRoaXMubWF4RGF0ZSk7fX19LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybnt0YWJsZVJvd3M6W1tdLFtdLFtdLFtdLFtdLFtdXSxsYXN0Um93Om51bGwsbGFzdENvbHVtbjpudWxsfTt9LG1ldGhvZHM6e2NlbGxNYXRjaGVzRGF0ZTpmdW5jdGlvbiBjZWxsTWF0Y2hlc0RhdGUoY2VsbCxkYXRlKXt2YXIgdmFsdWU9bmV3IERhdGUoZGF0ZSk7cmV0dXJuIHRoaXMueWVhcj09PXZhbHVlLmdldEZ1bGxZZWFyKCkmJnRoaXMubW9udGg9PT12YWx1ZS5nZXRNb250aCgpJiZOdW1iZXIoY2VsbC50ZXh0KT09PXZhbHVlLmdldERhdGUoKTt9LGdldENlbGxDbGFzc2VzOmZ1bmN0aW9uIGdldENlbGxDbGFzc2VzKGNlbGwpe3ZhciBfdGhpczI9dGhpczt2YXIgc2VsZWN0aW9uTW9kZT10aGlzLnNlbGVjdGlvbk1vZGU7dmFyIGRlZmF1bHRWYWx1ZT10aGlzLmRlZmF1bHRWYWx1ZT9BcnJheS5pc0FycmF5KHRoaXMuZGVmYXVsdFZhbHVlKT90aGlzLmRlZmF1bHRWYWx1ZTpbdGhpcy5kZWZhdWx0VmFsdWVdOltdO3ZhciBjbGFzc2VzPVtdO2lmKChjZWxsLnR5cGU9PT0nbm9ybWFsJ3x8Y2VsbC50eXBlPT09J3RvZGF5JykmJiFjZWxsLmRpc2FibGVkKXtjbGFzc2VzLnB1c2goJ2F2YWlsYWJsZScpO2lmKGNlbGwudHlwZT09PSd0b2RheScpe2NsYXNzZXMucHVzaCgndG9kYXknKTt9fWVsc2V7Y2xhc3Nlcy5wdXNoKGNlbGwudHlwZSk7fWlmKGNlbGwudHlwZT09PSdub3JtYWwnJiZkZWZhdWx0VmFsdWUuc29tZShmdW5jdGlvbihkYXRlKXtyZXR1cm4gX3RoaXMyLmNlbGxNYXRjaGVzRGF0ZShjZWxsLGRhdGUpO30pKXtjbGFzc2VzLnB1c2goJ2RlZmF1bHQnKTt9aWYoc2VsZWN0aW9uTW9kZT09PSdkYXknJiYoY2VsbC50eXBlPT09J25vcm1hbCd8fGNlbGwudHlwZT09PSd0b2RheScpJiZ0aGlzLmNlbGxNYXRjaGVzRGF0ZShjZWxsLHRoaXMudmFsdWUpKXtjbGFzc2VzLnB1c2goJ2N1cnJlbnQnKTt9aWYoY2VsbC5pblJhbmdlJiYoY2VsbC50eXBlPT09J25vcm1hbCd8fGNlbGwudHlwZT09PSd0b2RheSd8fHRoaXMuc2VsZWN0aW9uTW9kZT09PSd3ZWVrJykpe2NsYXNzZXMucHVzaCgnaW4tcmFuZ2UnKTtpZihjZWxsLnN0YXJ0KXtjbGFzc2VzLnB1c2goJ3N0YXJ0LWRhdGUnKTt9aWYoY2VsbC5lbmQpe2NsYXNzZXMucHVzaCgnZW5kLWRhdGUnKTt9fWlmKGNlbGwuZGlzYWJsZWQpe2NsYXNzZXMucHVzaCgnZGlzYWJsZWQnKTt9aWYoY2VsbC5zZWxlY3RlZCl7Y2xhc3Nlcy5wdXNoKCdzZWxlY3RlZCcpO31pZihjZWxsLmN1c3RvbUNsYXNzKXtjbGFzc2VzLnB1c2goY2VsbC5jdXN0b21DbGFzcyk7fXJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTt9LGdldERhdGVPZkNlbGw6ZnVuY3Rpb24gZ2V0RGF0ZU9mQ2VsbChyb3csY29sdW1uKXt2YXIgb2Zmc2V0RnJvbVN0YXJ0PXJvdyo3Kyhjb2x1bW4tKHRoaXMuc2hvd1dlZWtOdW1iZXI/MTowKSktdGhpcy5vZmZzZXREYXk7cmV0dXJuIE9iamVjdChkYXRlX3V0aWxfWyJuZXh0RGF0ZSJdKSh0aGlzLnN0YXJ0RGF0ZSxvZmZzZXRGcm9tU3RhcnQpO30saXNXZWVrQWN0aXZlOmZ1bmN0aW9uIGlzV2Vla0FjdGl2ZShjZWxsKXtpZih0aGlzLnNlbGVjdGlvbk1vZGUhPT0nd2VlaycpcmV0dXJuIGZhbHNlO3ZhciBuZXdEYXRlPW5ldyBEYXRlKHRoaXMueWVhcix0aGlzLm1vbnRoLDEpO3ZhciB5ZWFyPW5ld0RhdGUuZ2V0RnVsbFllYXIoKTt2YXIgbW9udGg9bmV3RGF0ZS5nZXRNb250aCgpO2lmKGNlbGwudHlwZT09PSdwcmV2LW1vbnRoJyl7bmV3RGF0ZS5zZXRNb250aChtb250aD09PTA/MTE6bW9udGgtMSk7bmV3RGF0ZS5zZXRGdWxsWWVhcihtb250aD09PTA/eWVhci0xOnllYXIpO31pZihjZWxsLnR5cGU9PT0nbmV4dC1tb250aCcpe25ld0RhdGUuc2V0TW9udGgobW9udGg9PT0xMT8wOm1vbnRoKzEpO25ld0RhdGUuc2V0RnVsbFllYXIobW9udGg9PT0xMT95ZWFyKzE6eWVhcik7fW5ld0RhdGUuc2V0RGF0ZShwYXJzZUludChjZWxsLnRleHQsMTApKTtpZihPYmplY3QoZGF0ZV91dGlsX1siaXNEYXRlIl0pKHRoaXMudmFsdWUpKXt2YXIgZGF5T2Zmc2V0PSh0aGlzLnZhbHVlLmdldERheSgpLXRoaXMuZmlyc3REYXlPZldlZWsrNyklNy0xO3ZhciB3ZWVrRGF0ZT1PYmplY3QoZGF0ZV91dGlsX1sicHJldkRhdGUiXSkodGhpcy52YWx1ZSxkYXlPZmZzZXQpO3JldHVybiB3ZWVrRGF0ZS5nZXRUaW1lKCk9PT1uZXdEYXRlLmdldFRpbWUoKTt9cmV0dXJuIGZhbHNlO30sbWFya1JhbmdlOmZ1bmN0aW9uIG1hcmtSYW5nZShtaW5EYXRlLG1heERhdGUpe21pbkRhdGU9ZGF0ZV90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2dldERhdGVUaW1lc3RhbXAobWluRGF0ZSk7bWF4RGF0ZT1kYXRlX3RhYmxldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfZ2V0RGF0ZVRpbWVzdGFtcChtYXhEYXRlKXx8bWluRGF0ZTt2YXIgX3JlZj1bTWF0aC5taW4obWluRGF0ZSxtYXhEYXRlKSxNYXRoLm1heChtaW5EYXRlLG1heERhdGUpXTttaW5EYXRlPV9yZWZbMF07bWF4RGF0ZT1fcmVmWzFdO3ZhciBzdGFydERhdGU9dGhpcy5zdGFydERhdGU7dmFyIHJvd3M9dGhpcy5yb3dzO2Zvcih2YXIgaT0wLGs9cm93cy5sZW5ndGg7aTxrO2krKyl7dmFyIHJvdz1yb3dzW2ldO2Zvcih2YXIgaj0wLGw9cm93Lmxlbmd0aDtqPGw7aisrKXtpZih0aGlzLnNob3dXZWVrTnVtYmVyJiZqPT09MCljb250aW51ZTt2YXIgX2NlbGw9cm93W2pdO3ZhciBpbmRleD1pKjcraisodGhpcy5zaG93V2Vla051bWJlcj8tMTowKTt2YXIgdGltZT1PYmplY3QoZGF0ZV91dGlsX1sibmV4dERhdGUiXSkoc3RhcnREYXRlLGluZGV4LXRoaXMub2Zmc2V0RGF5KS5nZXRUaW1lKCk7X2NlbGwuaW5SYW5nZT1taW5EYXRlJiZ0aW1lPj1taW5EYXRlJiZ0aW1lPD1tYXhEYXRlO19jZWxsLnN0YXJ0PW1pbkRhdGUmJnRpbWU9PT1taW5EYXRlO19jZWxsLmVuZD1tYXhEYXRlJiZ0aW1lPT09bWF4RGF0ZTt9fX0saGFuZGxlTW91c2VNb3ZlOmZ1bmN0aW9uIGhhbmRsZU1vdXNlTW92ZShldmVudCl7aWYoIXRoaXMucmFuZ2VTdGF0ZS5zZWxlY3RpbmcpcmV0dXJuO3ZhciB0YXJnZXQ9ZXZlbnQudGFyZ2V0O2lmKHRhcmdldC50YWdOYW1lPT09J1NQQU4nKXt0YXJnZXQ9dGFyZ2V0LnBhcmVudE5vZGUucGFyZW50Tm9kZTt9aWYodGFyZ2V0LnRhZ05hbWU9PT0nRElWJyl7dGFyZ2V0PXRhcmdldC5wYXJlbnROb2RlO31pZih0YXJnZXQudGFnTmFtZSE9PSdURCcpcmV0dXJuO3ZhciByb3c9dGFyZ2V0LnBhcmVudE5vZGUucm93SW5kZXgtMTt2YXIgY29sdW1uPXRhcmdldC5jZWxsSW5kZXg7Ly8gY2FuIG5vdCBzZWxlY3QgZGlzYWJsZWQgZGF0ZQppZih0aGlzLnJvd3Nbcm93XVtjb2x1bW5dLmRpc2FibGVkKXJldHVybjsvLyBvbmx5IHVwZGF0ZSByYW5nZVN0YXRlIHdoZW4gbW91c2UgbW92ZXMgdG8gYSBuZXcgY2VsbAovLyB0aGlzIGF2b2lkcyBmcmVxdWVudCBEYXRlIG9iamVjdCBjcmVhdGlvbiBhbmQgaW1wcm92ZXMgcGVyZm9ybWFuY2UKaWYocm93IT09dGhpcy5sYXN0Um93fHxjb2x1bW4hPT10aGlzLmxhc3RDb2x1bW4pe3RoaXMubGFzdFJvdz1yb3c7dGhpcy5sYXN0Q29sdW1uPWNvbHVtbjt0aGlzLiRlbWl0KCdjaGFuZ2VyYW5nZScse21pbkRhdGU6dGhpcy5taW5EYXRlLG1heERhdGU6dGhpcy5tYXhEYXRlLHJhbmdlU3RhdGU6e3NlbGVjdGluZzp0cnVlLGVuZERhdGU6dGhpcy5nZXREYXRlT2ZDZWxsKHJvdyxjb2x1bW4pfX0pO319LGhhbmRsZUNsaWNrOmZ1bmN0aW9uIGhhbmRsZUNsaWNrKGV2ZW50KXt2YXIgdGFyZ2V0PWV2ZW50LnRhcmdldDtpZih0YXJnZXQudGFnTmFtZT09PSdTUEFOJyl7dGFyZ2V0PXRhcmdldC5wYXJlbnROb2RlLnBhcmVudE5vZGU7fWlmKHRhcmdldC50YWdOYW1lPT09J0RJVicpe3RhcmdldD10YXJnZXQucGFyZW50Tm9kZTt9aWYodGFyZ2V0LnRhZ05hbWUhPT0nVEQnKXJldHVybjt2YXIgcm93PXRhcmdldC5wYXJlbnROb2RlLnJvd0luZGV4LTE7dmFyIGNvbHVtbj10aGlzLnNlbGVjdGlvbk1vZGU9PT0nd2Vlayc/MTp0YXJnZXQuY2VsbEluZGV4O3ZhciBjZWxsPXRoaXMucm93c1tyb3ddW2NvbHVtbl07aWYoY2VsbC5kaXNhYmxlZHx8Y2VsbC50eXBlPT09J3dlZWsnKXJldHVybjt2YXIgbmV3RGF0ZT10aGlzLmdldERhdGVPZkNlbGwocm93LGNvbHVtbik7aWYodGhpcy5zZWxlY3Rpb25Nb2RlPT09J3JhbmdlJyl7aWYoIXRoaXMucmFuZ2VTdGF0ZS5zZWxlY3Rpbmcpe3RoaXMuJGVtaXQoJ3BpY2snLHttaW5EYXRlOm5ld0RhdGUsbWF4RGF0ZTpudWxsfSk7dGhpcy5yYW5nZVN0YXRlLnNlbGVjdGluZz10cnVlO31lbHNle2lmKG5ld0RhdGU+PXRoaXMubWluRGF0ZSl7dGhpcy4kZW1pdCgncGljaycse21pbkRhdGU6dGhpcy5taW5EYXRlLG1heERhdGU6bmV3RGF0ZX0pO31lbHNle3RoaXMuJGVtaXQoJ3BpY2snLHttaW5EYXRlOm5ld0RhdGUsbWF4RGF0ZTp0aGlzLm1pbkRhdGV9KTt9dGhpcy5yYW5nZVN0YXRlLnNlbGVjdGluZz1mYWxzZTt9fWVsc2UgaWYodGhpcy5zZWxlY3Rpb25Nb2RlPT09J2RheScpe3RoaXMuJGVtaXQoJ3BpY2snLG5ld0RhdGUpO31lbHNlIGlmKHRoaXMuc2VsZWN0aW9uTW9kZT09PSd3ZWVrJyl7dmFyIHdlZWtOdW1iZXI9T2JqZWN0KGRhdGVfdXRpbF9bImdldFdlZWtOdW1iZXIiXSkobmV3RGF0ZSk7dmFyIHZhbHVlPW5ld0RhdGUuZ2V0RnVsbFllYXIoKSsndycrd2Vla051bWJlcjt0aGlzLiRlbWl0KCdwaWNrJyx7eWVhcjpuZXdEYXRlLmdldEZ1bGxZZWFyKCksd2Vlazp3ZWVrTnVtYmVyLHZhbHVlOnZhbHVlLGRhdGU6bmV3RGF0ZX0pO31lbHNlIGlmKHRoaXMuc2VsZWN0aW9uTW9kZT09PSdkYXRlcycpe3ZhciBfdmFsdWU9dGhpcy52YWx1ZXx8W107dmFyIG5ld1ZhbHVlPWNlbGwuc2VsZWN0ZWQ/ZGF0ZV90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX3JlbW92ZUZyb21BcnJheShfdmFsdWUsZnVuY3Rpb24oZGF0ZSl7cmV0dXJuIGRhdGUuZ2V0VGltZSgpPT09bmV3RGF0ZS5nZXRUaW1lKCk7fSk6W10uY29uY2F0KF92YWx1ZSxbbmV3RGF0ZV0pO3RoaXMuJGVtaXQoJ3BpY2snLG5ld1ZhbHVlKTt9fX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL2Jhc2ljL2RhdGUtdGFibGUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGJhc2ljX2RhdGVfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189ZGF0ZV90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9iYXNpYy9kYXRlLXRhYmxlLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIGRhdGVfdGFibGVfY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChiYXNpY19kYXRlX3RhYmxldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLGRhdGVfdGFibGV2dWVfdHlwZV90ZW1wbGF0ZV9pZF81ZDFmMzM0MV9yZW5kZXIsZGF0ZV90YWJsZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzVkMWYzMzQxX3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgZGF0ZV90YWJsZV9hcGk7fWRhdGVfdGFibGVfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvYmFzaWMvZGF0ZS10YWJsZS52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgZGF0ZV90YWJsZT1kYXRlX3RhYmxlX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9wYW5lbC9kYXRlLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBkYXRldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXttaXhpbnM6W2xvY2FsZV9kZWZhdWx0LmFdLGRpcmVjdGl2ZXM6e0NsaWNrb3V0c2lkZTpjbGlja291dHNpZGVfZGVmYXVsdC5hfSx3YXRjaDp7c2hvd1RpbWU6ZnVuY3Rpb24gc2hvd1RpbWUodmFsKXt2YXIgX3RoaXM9dGhpczsvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9pZighdmFsKXJldHVybjt0aGlzLiRuZXh0VGljayhmdW5jdGlvbihfKXt2YXIgaW5wdXRFbG09X3RoaXMuJHJlZnMuaW5wdXQuJGVsO2lmKGlucHV0RWxtKXtfdGhpcy5waWNrZXJXaWR0aD1pbnB1dEVsbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCsxMDt9fSk7fSx2YWx1ZTpmdW5jdGlvbiB2YWx1ZSh2YWwpe2lmKHRoaXMuc2VsZWN0aW9uTW9kZT09PSdkYXRlcycmJnRoaXMudmFsdWUpcmV0dXJuO2lmKE9iamVjdChkYXRlX3V0aWxfWyJpc0RhdGUiXSkodmFsKSl7dGhpcy5kYXRlPW5ldyBEYXRlKHZhbCk7fWVsc2V7dGhpcy5kYXRlPXRoaXMuZ2V0RGVmYXVsdFZhbHVlKCk7fX0sZGVmYXVsdFZhbHVlOmZ1bmN0aW9uIGRlZmF1bHRWYWx1ZSh2YWwpe2lmKCFPYmplY3QoZGF0ZV91dGlsX1siaXNEYXRlIl0pKHRoaXMudmFsdWUpKXt0aGlzLmRhdGU9dmFsP25ldyBEYXRlKHZhbCk6bmV3IERhdGUoKTt9fSx0aW1lUGlja2VyVmlzaWJsZTpmdW5jdGlvbiB0aW1lUGlja2VyVmlzaWJsZSh2YWwpe3ZhciBfdGhpczI9dGhpcztpZih2YWwpdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24oKXtyZXR1cm4gX3RoaXMyLiRyZWZzLnRpbWVwaWNrZXIuYWRqdXN0U3Bpbm5lcnMoKTt9KTt9LHNlbGVjdGlvbk1vZGU6ZnVuY3Rpb24gc2VsZWN0aW9uTW9kZShuZXdWYWwpe2lmKG5ld1ZhbD09PSdtb250aCcpey8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovaWYodGhpcy5jdXJyZW50VmlldyE9PSd5ZWFyJ3x8dGhpcy5jdXJyZW50VmlldyE9PSdtb250aCcpe3RoaXMuY3VycmVudFZpZXc9J21vbnRoJzt9fWVsc2UgaWYobmV3VmFsPT09J2RhdGVzJyl7dGhpcy5jdXJyZW50Vmlldz0nZGF0ZSc7fX19LG1ldGhvZHM6e3Byb3h5VGltZVBpY2tlckRhdGFQcm9wZXJ0aWVzOmZ1bmN0aW9uIHByb3h5VGltZVBpY2tlckRhdGFQcm9wZXJ0aWVzKCl7dmFyIF90aGlzMz10aGlzO3ZhciBmb3JtYXQ9ZnVuY3Rpb24gZm9ybWF0KHRpbWVGb3JtYXQpe190aGlzMy4kcmVmcy50aW1lcGlja2VyLmZvcm1hdD10aW1lRm9ybWF0O307dmFyIHZhbHVlPWZ1bmN0aW9uIHZhbHVlKF92YWx1ZSl7X3RoaXMzLiRyZWZzLnRpbWVwaWNrZXIudmFsdWU9X3ZhbHVlO307dmFyIGRhdGU9ZnVuY3Rpb24gZGF0ZShfZGF0ZSl7X3RoaXMzLiRyZWZzLnRpbWVwaWNrZXIuZGF0ZT1fZGF0ZTt9O3ZhciBzZWxlY3RhYmxlUmFuZ2U9ZnVuY3Rpb24gc2VsZWN0YWJsZVJhbmdlKF9zZWxlY3RhYmxlUmFuZ2Upe190aGlzMy4kcmVmcy50aW1lcGlja2VyLnNlbGVjdGFibGVSYW5nZT1fc2VsZWN0YWJsZVJhbmdlO307dGhpcy4kd2F0Y2goJ3ZhbHVlJyx2YWx1ZSk7dGhpcy4kd2F0Y2goJ2RhdGUnLGRhdGUpO3RoaXMuJHdhdGNoKCdzZWxlY3RhYmxlUmFuZ2UnLHNlbGVjdGFibGVSYW5nZSk7Zm9ybWF0KHRoaXMudGltZUZvcm1hdCk7dmFsdWUodGhpcy52YWx1ZSk7ZGF0ZSh0aGlzLmRhdGUpO3NlbGVjdGFibGVSYW5nZSh0aGlzLnNlbGVjdGFibGVSYW5nZSk7fSxoYW5kbGVDbGVhcjpmdW5jdGlvbiBoYW5kbGVDbGVhcigpe3RoaXMuZGF0ZT10aGlzLmdldERlZmF1bHRWYWx1ZSgpO3RoaXMuJGVtaXQoJ3BpY2snLG51bGwpO30sZW1pdDpmdW5jdGlvbiBlbWl0KHZhbHVlKXt2YXIgX3RoaXM0PXRoaXM7Zm9yKHZhciBfbGVuPWFyZ3VtZW50cy5sZW5ndGgsYXJncz1BcnJheShfbGVuPjE/X2xlbi0xOjApLF9rZXk9MTtfa2V5PF9sZW47X2tleSsrKXthcmdzW19rZXktMV09YXJndW1lbnRzW19rZXldO31pZighdmFsdWUpe3RoaXMuJGVtaXQuYXBwbHkodGhpcyxbJ3BpY2snLHZhbHVlXS5jb25jYXQoYXJncykpO31lbHNlIGlmKEFycmF5LmlzQXJyYXkodmFsdWUpKXt2YXIgZGF0ZXM9dmFsdWUubWFwKGZ1bmN0aW9uKGRhdGUpe3JldHVybiBfdGhpczQuc2hvd1RpbWU/T2JqZWN0KGRhdGVfdXRpbF9bImNsZWFyTWlsbGlzZWNvbmRzIl0pKGRhdGUpOk9iamVjdChkYXRlX3V0aWxfWyJjbGVhclRpbWUiXSkoZGF0ZSk7fSk7dGhpcy4kZW1pdC5hcHBseSh0aGlzLFsncGljaycsZGF0ZXNdLmNvbmNhdChhcmdzKSk7fWVsc2V7dGhpcy4kZW1pdC5hcHBseSh0aGlzLFsncGljaycsdGhpcy5zaG93VGltZT9PYmplY3QoZGF0ZV91dGlsX1siY2xlYXJNaWxsaXNlY29uZHMiXSkodmFsdWUpOk9iamVjdChkYXRlX3V0aWxfWyJjbGVhclRpbWUiXSkodmFsdWUpXS5jb25jYXQoYXJncykpO310aGlzLnVzZXJJbnB1dERhdGU9bnVsbDt0aGlzLnVzZXJJbnB1dFRpbWU9bnVsbDt9LC8vIHJlc2V0RGF0ZSgpIHsKLy8gICB0aGlzLmRhdGUgPSBuZXcgRGF0ZSh0aGlzLmRhdGUpOwovLyB9LApzaG93TW9udGhQaWNrZXI6ZnVuY3Rpb24gc2hvd01vbnRoUGlja2VyKCl7dGhpcy5jdXJyZW50Vmlldz0nbW9udGgnO30sc2hvd1llYXJQaWNrZXI6ZnVuY3Rpb24gc2hvd1llYXJQaWNrZXIoKXt0aGlzLmN1cnJlbnRWaWV3PSd5ZWFyJzt9LC8vIFhYWDog5rKh55So5YiwCi8vIGhhbmRsZUxhYmVsQ2xpY2soKSB7Ci8vICAgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICdkYXRlJykgewovLyAgICAgdGhpcy5zaG93TW9udGhQaWNrZXIoKTsKLy8gICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICdtb250aCcpIHsKLy8gICAgIHRoaXMuc2hvd1llYXJQaWNrZXIoKTsKLy8gICB9Ci8vIH0sCnByZXZNb250aDpmdW5jdGlvbiBwcmV2TW9udGgoKXt0aGlzLmRhdGU9T2JqZWN0KGRhdGVfdXRpbF9bInByZXZNb250aCJdKSh0aGlzLmRhdGUpO30sbmV4dE1vbnRoOmZ1bmN0aW9uIG5leHRNb250aCgpe3RoaXMuZGF0ZT1PYmplY3QoZGF0ZV91dGlsX1sibmV4dE1vbnRoIl0pKHRoaXMuZGF0ZSk7fSxwcmV2WWVhcjpmdW5jdGlvbiBwcmV2WWVhcigpe2lmKHRoaXMuY3VycmVudFZpZXc9PT0neWVhcicpe3RoaXMuZGF0ZT1PYmplY3QoZGF0ZV91dGlsX1sicHJldlllYXIiXSkodGhpcy5kYXRlLDEwKTt9ZWxzZXt0aGlzLmRhdGU9T2JqZWN0KGRhdGVfdXRpbF9bInByZXZZZWFyIl0pKHRoaXMuZGF0ZSk7fX0sbmV4dFllYXI6ZnVuY3Rpb24gbmV4dFllYXIoKXtpZih0aGlzLmN1cnJlbnRWaWV3PT09J3llYXInKXt0aGlzLmRhdGU9T2JqZWN0KGRhdGVfdXRpbF9bIm5leHRZZWFyIl0pKHRoaXMuZGF0ZSwxMCk7fWVsc2V7dGhpcy5kYXRlPU9iamVjdChkYXRlX3V0aWxfWyJuZXh0WWVhciJdKSh0aGlzLmRhdGUpO319LGhhbmRsZVNob3J0Y3V0Q2xpY2s6ZnVuY3Rpb24gaGFuZGxlU2hvcnRjdXRDbGljayhzaG9ydGN1dCl7aWYoc2hvcnRjdXQub25DbGljayl7c2hvcnRjdXQub25DbGljayh0aGlzKTt9fSxoYW5kbGVUaW1lUGljazpmdW5jdGlvbiBoYW5kbGVUaW1lUGljayh2YWx1ZSx2aXNpYmxlLGZpcnN0KXtpZihPYmplY3QoZGF0ZV91dGlsX1siaXNEYXRlIl0pKHZhbHVlKSl7dmFyIG5ld0RhdGU9dGhpcy52YWx1ZT9PYmplY3QoZGF0ZV91dGlsX1sibW9kaWZ5VGltZSJdKSh0aGlzLnZhbHVlLHZhbHVlLmdldEhvdXJzKCksdmFsdWUuZ2V0TWludXRlcygpLHZhbHVlLmdldFNlY29uZHMoKSk6T2JqZWN0KGRhdGVfdXRpbF9bIm1vZGlmeVdpdGhUaW1lU3RyaW5nIl0pKHRoaXMuZ2V0RGVmYXVsdFZhbHVlKCksdGhpcy5kZWZhdWx0VGltZSk7dGhpcy5kYXRlPW5ld0RhdGU7dGhpcy5lbWl0KHRoaXMuZGF0ZSx0cnVlKTt9ZWxzZXt0aGlzLmVtaXQodmFsdWUsdHJ1ZSk7fWlmKCFmaXJzdCl7dGhpcy50aW1lUGlja2VyVmlzaWJsZT12aXNpYmxlO319LGhhbmRsZVRpbWVQaWNrQ2xvc2U6ZnVuY3Rpb24gaGFuZGxlVGltZVBpY2tDbG9zZSgpe3RoaXMudGltZVBpY2tlclZpc2libGU9ZmFsc2U7fSxoYW5kbGVNb250aFBpY2s6ZnVuY3Rpb24gaGFuZGxlTW9udGhQaWNrKG1vbnRoKXtpZih0aGlzLnNlbGVjdGlvbk1vZGU9PT0nbW9udGgnKXt0aGlzLmRhdGU9T2JqZWN0KGRhdGVfdXRpbF9bIm1vZGlmeURhdGUiXSkodGhpcy5kYXRlLHRoaXMueWVhcixtb250aCwxKTt0aGlzLmVtaXQodGhpcy5kYXRlKTt9ZWxzZXt0aGlzLmRhdGU9T2JqZWN0KGRhdGVfdXRpbF9bImNoYW5nZVllYXJNb250aEFuZENsYW1wRGF0ZSJdKSh0aGlzLmRhdGUsdGhpcy55ZWFyLG1vbnRoKTsvLyBUT0RPOiBzaG91bGQgZW1pdCBpbnRlcm1lZGlhdGUgdmFsdWUgPz8KLy8gdGhpcy5lbWl0KHRoaXMuZGF0ZSk7CnRoaXMuY3VycmVudFZpZXc9J2RhdGUnO319LGhhbmRsZURhdGVQaWNrOmZ1bmN0aW9uIGhhbmRsZURhdGVQaWNrKHZhbHVlKXtpZih0aGlzLnNlbGVjdGlvbk1vZGU9PT0nZGF5Jyl7dmFyIG5ld0RhdGU9dGhpcy52YWx1ZT9PYmplY3QoZGF0ZV91dGlsX1sibW9kaWZ5RGF0ZSJdKSh0aGlzLnZhbHVlLHZhbHVlLmdldEZ1bGxZZWFyKCksdmFsdWUuZ2V0TW9udGgoKSx2YWx1ZS5nZXREYXRlKCkpOk9iamVjdChkYXRlX3V0aWxfWyJtb2RpZnlXaXRoVGltZVN0cmluZyJdKSh2YWx1ZSx0aGlzLmRlZmF1bHRUaW1lKTsvLyBjaGFuZ2UgZGVmYXVsdCB0aW1lIHdoaWxlIG91dCBvZiBzZWxlY3RhYmxlUmFuZ2UKaWYoIXRoaXMuY2hlY2tEYXRlV2l0aGluUmFuZ2UobmV3RGF0ZSkpe25ld0RhdGU9T2JqZWN0KGRhdGVfdXRpbF9bIm1vZGlmeURhdGUiXSkodGhpcy5zZWxlY3RhYmxlUmFuZ2VbMF1bMF0sdmFsdWUuZ2V0RnVsbFllYXIoKSx2YWx1ZS5nZXRNb250aCgpLHZhbHVlLmdldERhdGUoKSk7fXRoaXMuZGF0ZT1uZXdEYXRlO3RoaXMuZW1pdCh0aGlzLmRhdGUsdGhpcy5zaG93VGltZSk7fWVsc2UgaWYodGhpcy5zZWxlY3Rpb25Nb2RlPT09J3dlZWsnKXt0aGlzLmVtaXQodmFsdWUuZGF0ZSk7fWVsc2UgaWYodGhpcy5zZWxlY3Rpb25Nb2RlPT09J2RhdGVzJyl7dGhpcy5lbWl0KHZhbHVlLHRydWUpOy8vIHNldCBmYWxzZSB0byBrZWVwIHBhbmVsIG9wZW4KfX0saGFuZGxlWWVhclBpY2s6ZnVuY3Rpb24gaGFuZGxlWWVhclBpY2soeWVhcil7aWYodGhpcy5zZWxlY3Rpb25Nb2RlPT09J3llYXInKXt0aGlzLmRhdGU9T2JqZWN0KGRhdGVfdXRpbF9bIm1vZGlmeURhdGUiXSkodGhpcy5kYXRlLHllYXIsMCwxKTt0aGlzLmVtaXQodGhpcy5kYXRlKTt9ZWxzZXt0aGlzLmRhdGU9T2JqZWN0KGRhdGVfdXRpbF9bImNoYW5nZVllYXJNb250aEFuZENsYW1wRGF0ZSJdKSh0aGlzLmRhdGUseWVhcix0aGlzLm1vbnRoKTsvLyBUT0RPOiBzaG91bGQgZW1pdCBpbnRlcm1lZGlhdGUgdmFsdWUgPz8KLy8gdGhpcy5lbWl0KHRoaXMuZGF0ZSwgdHJ1ZSk7CnRoaXMuY3VycmVudFZpZXc9J21vbnRoJzt9fSxjaGFuZ2VUb05vdzpmdW5jdGlvbiBjaGFuZ2VUb05vdygpey8vIE5PVEU6IG5vdCBhIHBlcm1hbmVudCBzb2x1dGlvbgovLyAgICAgICBjb25zaWRlciBkaXNhYmxlICJub3ciIGJ1dHRvbiBpbiB0aGUgZnV0dXJlCmlmKCghdGhpcy5kaXNhYmxlZERhdGV8fCF0aGlzLmRpc2FibGVkRGF0ZShuZXcgRGF0ZSgpKSkmJnRoaXMuY2hlY2tEYXRlV2l0aGluUmFuZ2UobmV3IERhdGUoKSkpe3RoaXMuZGF0ZT1uZXcgRGF0ZSgpO3RoaXMuZW1pdCh0aGlzLmRhdGUpO319LGNvbmZpcm06ZnVuY3Rpb24gY29uZmlybSgpe2lmKHRoaXMuc2VsZWN0aW9uTW9kZT09PSdkYXRlcycpe3RoaXMuZW1pdCh0aGlzLnZhbHVlKTt9ZWxzZXsvLyB2YWx1ZSB3ZXJlIGVtaXR0ZWQgaW4gaGFuZGxle0RhdGUsVGltZX1QaWNrLCBub3RoaW5nIHRvIHVwZGF0ZSBoZXJlCi8vIGRlYWwgd2l0aCB0aGUgc2NlbmFyaW8gd2hlcmU6IHVzZXIgb3BlbnMgdGhlIHBpY2tlciwgdGhlbiBjb25maXJtIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcKdmFyIHZhbHVlPXRoaXMudmFsdWU/dGhpcy52YWx1ZTpPYmplY3QoZGF0ZV91dGlsX1sibW9kaWZ5V2l0aFRpbWVTdHJpbmciXSkodGhpcy5nZXREZWZhdWx0VmFsdWUoKSx0aGlzLmRlZmF1bHRUaW1lKTt0aGlzLmRhdGU9bmV3IERhdGUodmFsdWUpOy8vIHJlZnJlc2ggZGF0ZQp0aGlzLmVtaXQodmFsdWUpO319LHJlc2V0VmlldzpmdW5jdGlvbiByZXNldFZpZXcoKXtpZih0aGlzLnNlbGVjdGlvbk1vZGU9PT0nbW9udGgnKXt0aGlzLmN1cnJlbnRWaWV3PSdtb250aCc7fWVsc2UgaWYodGhpcy5zZWxlY3Rpb25Nb2RlPT09J3llYXInKXt0aGlzLmN1cnJlbnRWaWV3PSd5ZWFyJzt9ZWxzZXt0aGlzLmN1cnJlbnRWaWV3PSdkYXRlJzt9fSxoYW5kbGVFbnRlcjpmdW5jdGlvbiBoYW5kbGVFbnRlcigpe2RvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdGhpcy5oYW5kbGVLZXlkb3duKTt9LGhhbmRsZUxlYXZlOmZ1bmN0aW9uIGhhbmRsZUxlYXZlKCl7dGhpcy4kZW1pdCgnZG9kZXN0cm95Jyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJyx0aGlzLmhhbmRsZUtleWRvd24pO30saGFuZGxlS2V5ZG93bjpmdW5jdGlvbiBoYW5kbGVLZXlkb3duKGV2ZW50KXt2YXIga2V5Q29kZT1ldmVudC5rZXlDb2RlO3ZhciBsaXN0PVszOCw0MCwzNywzOV07aWYodGhpcy52aXNpYmxlJiYhdGhpcy50aW1lUGlja2VyVmlzaWJsZSl7aWYobGlzdC5pbmRleE9mKGtleUNvZGUpIT09LTEpe3RoaXMuaGFuZGxlS2V5Q29udHJvbChrZXlDb2RlKTtldmVudC5zdG9wUHJvcGFnYXRpb24oKTtldmVudC5wcmV2ZW50RGVmYXVsdCgpO31pZihrZXlDb2RlPT09MTMmJnRoaXMudXNlcklucHV0RGF0ZT09PW51bGwmJnRoaXMudXNlcklucHV0VGltZT09PW51bGwpey8vIEVudGVyCnRoaXMuZW1pdCh0aGlzLmRhdGUsZmFsc2UpO319fSxoYW5kbGVLZXlDb250cm9sOmZ1bmN0aW9uIGhhbmRsZUtleUNvbnRyb2woa2V5Q29kZSl7dmFyIG1hcHBpbmc9eyd5ZWFyJzp7Mzg6LTQsNDA6NCwzNzotMSwzOToxLG9mZnNldDpmdW5jdGlvbiBvZmZzZXQoZGF0ZSxzdGVwKXtyZXR1cm4gZGF0ZS5zZXRGdWxsWWVhcihkYXRlLmdldEZ1bGxZZWFyKCkrc3RlcCk7fX0sJ21vbnRoJzp7Mzg6LTQsNDA6NCwzNzotMSwzOToxLG9mZnNldDpmdW5jdGlvbiBvZmZzZXQoZGF0ZSxzdGVwKXtyZXR1cm4gZGF0ZS5zZXRNb250aChkYXRlLmdldE1vbnRoKCkrc3RlcCk7fX0sJ3dlZWsnOnszODotMSw0MDoxLDM3Oi0xLDM5OjEsb2Zmc2V0OmZ1bmN0aW9uIG9mZnNldChkYXRlLHN0ZXApe3JldHVybiBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkrc3RlcCo3KTt9fSwnZGF5Jzp7Mzg6LTcsNDA6NywzNzotMSwzOToxLG9mZnNldDpmdW5jdGlvbiBvZmZzZXQoZGF0ZSxzdGVwKXtyZXR1cm4gZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpK3N0ZXApO319fTt2YXIgbW9kZT10aGlzLnNlbGVjdGlvbk1vZGU7dmFyIHllYXI9My4xNTM2ZTEwO3ZhciBub3c9dGhpcy5kYXRlLmdldFRpbWUoKTt2YXIgbmV3RGF0ZT1uZXcgRGF0ZSh0aGlzLmRhdGUuZ2V0VGltZSgpKTt3aGlsZShNYXRoLmFicyhub3ctbmV3RGF0ZS5nZXRUaW1lKCkpPD15ZWFyKXt2YXIgbWFwPW1hcHBpbmdbbW9kZV07bWFwLm9mZnNldChuZXdEYXRlLG1hcFtrZXlDb2RlXSk7aWYodHlwZW9mIHRoaXMuZGlzYWJsZWREYXRlPT09J2Z1bmN0aW9uJyYmdGhpcy5kaXNhYmxlZERhdGUobmV3RGF0ZSkpe2NvbnRpbnVlO310aGlzLmRhdGU9bmV3RGF0ZTt0aGlzLiRlbWl0KCdwaWNrJyxuZXdEYXRlLHRydWUpO2JyZWFrO319LGhhbmRsZVZpc2libGVUaW1lQ2hhbmdlOmZ1bmN0aW9uIGhhbmRsZVZpc2libGVUaW1lQ2hhbmdlKHZhbHVlKXt2YXIgdGltZT1PYmplY3QoZGF0ZV91dGlsX1sicGFyc2VEYXRlIl0pKHZhbHVlLHRoaXMudGltZUZvcm1hdCk7aWYodGltZSYmdGhpcy5jaGVja0RhdGVXaXRoaW5SYW5nZSh0aW1lKSl7dGhpcy5kYXRlPU9iamVjdChkYXRlX3V0aWxfWyJtb2RpZnlEYXRlIl0pKHRpbWUsdGhpcy55ZWFyLHRoaXMubW9udGgsdGhpcy5tb250aERhdGUpO3RoaXMudXNlcklucHV0VGltZT1udWxsO3RoaXMuJHJlZnMudGltZXBpY2tlci52YWx1ZT10aGlzLmRhdGU7dGhpcy50aW1lUGlja2VyVmlzaWJsZT1mYWxzZTt0aGlzLmVtaXQodGhpcy5kYXRlLHRydWUpO319LGhhbmRsZVZpc2libGVEYXRlQ2hhbmdlOmZ1bmN0aW9uIGhhbmRsZVZpc2libGVEYXRlQ2hhbmdlKHZhbHVlKXt2YXIgZGF0ZT1PYmplY3QoZGF0ZV91dGlsX1sicGFyc2VEYXRlIl0pKHZhbHVlLHRoaXMuZGF0ZUZvcm1hdCk7aWYoZGF0ZSl7aWYodHlwZW9mIHRoaXMuZGlzYWJsZWREYXRlPT09J2Z1bmN0aW9uJyYmdGhpcy5kaXNhYmxlZERhdGUoZGF0ZSkpe3JldHVybjt9dGhpcy5kYXRlPU9iamVjdChkYXRlX3V0aWxfWyJtb2RpZnlUaW1lIl0pKGRhdGUsdGhpcy5kYXRlLmdldEhvdXJzKCksdGhpcy5kYXRlLmdldE1pbnV0ZXMoKSx0aGlzLmRhdGUuZ2V0U2Vjb25kcygpKTt0aGlzLnVzZXJJbnB1dERhdGU9bnVsbDt0aGlzLnJlc2V0VmlldygpO3RoaXMuZW1pdCh0aGlzLmRhdGUsdHJ1ZSk7fX0saXNWYWxpZFZhbHVlOmZ1bmN0aW9uIGlzVmFsaWRWYWx1ZSh2YWx1ZSl7cmV0dXJuIHZhbHVlJiYhaXNOYU4odmFsdWUpJiYodHlwZW9mIHRoaXMuZGlzYWJsZWREYXRlPT09J2Z1bmN0aW9uJz8hdGhpcy5kaXNhYmxlZERhdGUodmFsdWUpOnRydWUpJiZ0aGlzLmNoZWNrRGF0ZVdpdGhpblJhbmdlKHZhbHVlKTt9LGdldERlZmF1bHRWYWx1ZTpmdW5jdGlvbiBnZXREZWZhdWx0VmFsdWUoKXsvLyBpZiBkZWZhdWx0LXZhbHVlIGlzIHNldCwgcmV0dXJuIGl0Ci8vIG90aGVyd2lzZSwgcmV0dXJuIG5vdyAodGhlIG1vbWVudCB0aGlzIG1ldGhvZCBnZXRzIGNhbGxlZCkKcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlP25ldyBEYXRlKHRoaXMuZGVmYXVsdFZhbHVlKTpuZXcgRGF0ZSgpO30sY2hlY2tEYXRlV2l0aGluUmFuZ2U6ZnVuY3Rpb24gY2hlY2tEYXRlV2l0aGluUmFuZ2UoZGF0ZSl7cmV0dXJuIHRoaXMuc2VsZWN0YWJsZVJhbmdlLmxlbmd0aD4wP09iamVjdChkYXRlX3V0aWxfWyJ0aW1lV2l0aGluUmFuZ2UiXSkoZGF0ZSx0aGlzLnNlbGVjdGFibGVSYW5nZSx0aGlzLmZvcm1hdHx8J0hIOm1tOnNzJyk6dHJ1ZTt9fSxjb21wb25lbnRzOntUaW1lUGlja2VyOnBhbmVsX3RpbWUsWWVhclRhYmxlOnllYXJfdGFibGUsTW9udGhUYWJsZTptb250aF90YWJsZSxEYXRlVGFibGU6ZGF0ZV90YWJsZSxFbElucHV0OmlucHV0X2RlZmF1bHQuYSxFbEJ1dHRvbjpidXR0b25fZGVmYXVsdC5hfSxkYXRhOmZ1bmN0aW9uIGRhdGEoKXtyZXR1cm57cG9wcGVyQ2xhc3M6JycsZGF0ZTpuZXcgRGF0ZSgpLHZhbHVlOicnLGRlZmF1bHRWYWx1ZTpudWxsLC8vIHVzZSBnZXREZWZhdWx0VmFsdWUoKSBmb3IgdGltZSBjb21wdXRhdGlvbgpkZWZhdWx0VGltZTpudWxsLHNob3dUaW1lOmZhbHNlLHNlbGVjdGlvbk1vZGU6J2RheScsc2hvcnRjdXRzOicnLHZpc2libGU6ZmFsc2UsY3VycmVudFZpZXc6J2RhdGUnLGRpc2FibGVkRGF0ZTonJyxjZWxsQ2xhc3NOYW1lOicnLHNlbGVjdGFibGVSYW5nZTpbXSxmaXJzdERheU9mV2Vlazo3LHNob3dXZWVrTnVtYmVyOmZhbHNlLHRpbWVQaWNrZXJWaXNpYmxlOmZhbHNlLGZvcm1hdDonJyxhcnJvd0NvbnRyb2w6ZmFsc2UsdXNlcklucHV0RGF0ZTpudWxsLHVzZXJJbnB1dFRpbWU6bnVsbH07fSxjb21wdXRlZDp7eWVhcjpmdW5jdGlvbiB5ZWFyKCl7cmV0dXJuIHRoaXMuZGF0ZS5nZXRGdWxsWWVhcigpO30sbW9udGg6ZnVuY3Rpb24gbW9udGgoKXtyZXR1cm4gdGhpcy5kYXRlLmdldE1vbnRoKCk7fSx3ZWVrOmZ1bmN0aW9uIHdlZWsoKXtyZXR1cm4gT2JqZWN0KGRhdGVfdXRpbF9bImdldFdlZWtOdW1iZXIiXSkodGhpcy5kYXRlKTt9LG1vbnRoRGF0ZTpmdW5jdGlvbiBtb250aERhdGUoKXtyZXR1cm4gdGhpcy5kYXRlLmdldERhdGUoKTt9LGZvb3RlclZpc2libGU6ZnVuY3Rpb24gZm9vdGVyVmlzaWJsZSgpe3JldHVybiB0aGlzLnNob3dUaW1lfHx0aGlzLnNlbGVjdGlvbk1vZGU9PT0nZGF0ZXMnO30sdmlzaWJsZVRpbWU6ZnVuY3Rpb24gdmlzaWJsZVRpbWUoKXtpZih0aGlzLnVzZXJJbnB1dFRpbWUhPT1udWxsKXtyZXR1cm4gdGhpcy51c2VySW5wdXRUaW1lO31lbHNle3JldHVybiBPYmplY3QoZGF0ZV91dGlsX1siZm9ybWF0RGF0ZSJdKSh0aGlzLnZhbHVlfHx0aGlzLmRlZmF1bHRWYWx1ZSx0aGlzLnRpbWVGb3JtYXQpO319LHZpc2libGVEYXRlOmZ1bmN0aW9uIHZpc2libGVEYXRlKCl7aWYodGhpcy51c2VySW5wdXREYXRlIT09bnVsbCl7cmV0dXJuIHRoaXMudXNlcklucHV0RGF0ZTt9ZWxzZXtyZXR1cm4gT2JqZWN0KGRhdGVfdXRpbF9bImZvcm1hdERhdGUiXSkodGhpcy52YWx1ZXx8dGhpcy5kZWZhdWx0VmFsdWUsdGhpcy5kYXRlRm9ybWF0KTt9fSx5ZWFyTGFiZWw6ZnVuY3Rpb24geWVhckxhYmVsKCl7dmFyIHllYXJUcmFuc2xhdGlvbj10aGlzLnQoJ2VsLmRhdGVwaWNrZXIueWVhcicpO2lmKHRoaXMuY3VycmVudFZpZXc9PT0neWVhcicpe3ZhciBzdGFydFllYXI9TWF0aC5mbG9vcih0aGlzLnllYXIvMTApKjEwO2lmKHllYXJUcmFuc2xhdGlvbil7cmV0dXJuIHN0YXJ0WWVhcisnICcreWVhclRyYW5zbGF0aW9uKycgLSAnKyhzdGFydFllYXIrOSkrJyAnK3llYXJUcmFuc2xhdGlvbjt9cmV0dXJuIHN0YXJ0WWVhcisnIC0gJysoc3RhcnRZZWFyKzkpO31yZXR1cm4gdGhpcy55ZWFyKycgJyt5ZWFyVHJhbnNsYXRpb247fSx0aW1lRm9ybWF0OmZ1bmN0aW9uIHRpbWVGb3JtYXQoKXtpZih0aGlzLmZvcm1hdCl7cmV0dXJuIE9iamVjdChkYXRlX3V0aWxfWyJleHRyYWN0VGltZUZvcm1hdCJdKSh0aGlzLmZvcm1hdCk7fWVsc2V7cmV0dXJuJ0hIOm1tOnNzJzt9fSxkYXRlRm9ybWF0OmZ1bmN0aW9uIGRhdGVGb3JtYXQoKXtpZih0aGlzLmZvcm1hdCl7cmV0dXJuIE9iamVjdChkYXRlX3V0aWxfWyJleHRyYWN0RGF0ZUZvcm1hdCJdKSh0aGlzLmZvcm1hdCk7fWVsc2V7cmV0dXJuJ3l5eXktTU0tZGQnO319fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGFuZWwvZGF0ZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFuZWxfZGF0ZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz1kYXRldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BhbmVsL2RhdGUudnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgZGF0ZV9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHBhbmVsX2RhdGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sZGF0ZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzI0NDBkNGVhX3JlbmRlcixkYXRldnVlX3R5cGVfdGVtcGxhdGVfaWRfMjQ0MGQ0ZWFfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciBkYXRlX2FwaTt9ZGF0ZV9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9wYW5lbC9kYXRlLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYW5lbF9kYXRlPWRhdGVfY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGFuZWwvZGF0ZS1yYW5nZS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MjY1Mjg0OWEmCnZhciBkYXRlX3JhbmdldnVlX3R5cGVfdGVtcGxhdGVfaWRfMjY1Mjg0OWFfcmVuZGVyPWZ1bmN0aW9uIGRhdGVfcmFuZ2V2dWVfdHlwZV90ZW1wbGF0ZV9pZF8yNjUyODQ5YV9yZW5kZXIoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDt2YXIgX2M9X3ZtLl9zZWxmLl9jfHxfaDtyZXR1cm4gX2MoInRyYW5zaXRpb24iLHthdHRyczp7bmFtZToiZWwtem9vbS1pbi10b3AifSxvbjp7ImFmdGVyLWxlYXZlIjpmdW5jdGlvbiBhZnRlckxlYXZlKCRldmVudCl7X3ZtLiRlbWl0KCJkb2Rlc3Ryb3kiKTt9fX0sW19jKCJkaXYiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTpfdm0udmlzaWJsZSxleHByZXNzaW9uOiJ2aXNpYmxlIn1dLHN0YXRpY0NsYXNzOiJlbC1waWNrZXItcGFuZWwgZWwtZGF0ZS1yYW5nZS1waWNrZXIgZWwtcG9wcGVyIixjbGFzczpbeyJoYXMtc2lkZWJhciI6X3ZtLiRzbG90cy5zaWRlYmFyfHxfdm0uc2hvcnRjdXRzLCJoYXMtdGltZSI6X3ZtLnNob3dUaW1lfSxfdm0ucG9wcGVyQ2xhc3NdfSxbX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1waWNrZXItcGFuZWxfX2JvZHktd3JhcHBlciJ9LFtfdm0uX3QoInNpZGViYXIiKSxfdm0uc2hvcnRjdXRzP19jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtcGlja2VyLXBhbmVsX19zaWRlYmFyIn0sX3ZtLl9sKF92bS5zaG9ydGN1dHMsZnVuY3Rpb24oc2hvcnRjdXQsa2V5KXtyZXR1cm4gX2MoImJ1dHRvbiIse2tleTprZXksc3RhdGljQ2xhc3M6ImVsLXBpY2tlci1wYW5lbF9fc2hvcnRjdXQiLGF0dHJzOnt0eXBlOiJidXR0b24ifSxvbjp7Y2xpY2s6ZnVuY3Rpb24gY2xpY2soJGV2ZW50KXtfdm0uaGFuZGxlU2hvcnRjdXRDbGljayhzaG9ydGN1dCk7fX19LFtfdm0uX3YoX3ZtLl9zKHNob3J0Y3V0LnRleHQpKV0pO30pLDApOl92bS5fZSgpLF9jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtcGlja2VyLXBhbmVsX19ib2R5In0sW192bS5zaG93VGltZT9fYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLWRhdGUtcmFuZ2UtcGlja2VyX190aW1lLWhlYWRlciJ9LFtfYygic3BhbiIse3N0YXRpY0NsYXNzOiJlbC1kYXRlLXJhbmdlLXBpY2tlcl9fZWRpdG9ycy13cmFwIn0sW19jKCJzcGFuIix7c3RhdGljQ2xhc3M6ImVsLWRhdGUtcmFuZ2UtcGlja2VyX190aW1lLXBpY2tlci13cmFwIn0sW19jKCJlbC1pbnB1dCIse3JlZjoibWluSW5wdXQiLHN0YXRpY0NsYXNzOiJlbC1kYXRlLXJhbmdlLXBpY2tlcl9fZWRpdG9yIixhdHRyczp7c2l6ZToic21hbGwiLGRpc2FibGVkOl92bS5yYW5nZVN0YXRlLnNlbGVjdGluZyxwbGFjZWhvbGRlcjpfdm0udCgiZWwuZGF0ZXBpY2tlci5zdGFydERhdGUiKSx2YWx1ZTpfdm0ubWluVmlzaWJsZURhdGV9LG9uOntpbnB1dDpmdW5jdGlvbiBpbnB1dCh2YWwpe3JldHVybiBfdm0uaGFuZGxlRGF0ZUlucHV0KHZhbCwibWluIik7fSxjaGFuZ2U6ZnVuY3Rpb24gY2hhbmdlKHZhbCl7cmV0dXJuIF92bS5oYW5kbGVEYXRlQ2hhbmdlKHZhbCwibWluIik7fX19KV0sMSksX2MoInNwYW4iLHtkaXJlY3RpdmVzOlt7bmFtZToiY2xpY2tvdXRzaWRlIixyYXdOYW1lOiJ2LWNsaWNrb3V0c2lkZSIsdmFsdWU6X3ZtLmhhbmRsZU1pblRpbWVDbG9zZSxleHByZXNzaW9uOiJoYW5kbGVNaW5UaW1lQ2xvc2UifV0sc3RhdGljQ2xhc3M6ImVsLWRhdGUtcmFuZ2UtcGlja2VyX190aW1lLXBpY2tlci13cmFwIn0sW19jKCJlbC1pbnB1dCIse3N0YXRpY0NsYXNzOiJlbC1kYXRlLXJhbmdlLXBpY2tlcl9fZWRpdG9yIixhdHRyczp7c2l6ZToic21hbGwiLGRpc2FibGVkOl92bS5yYW5nZVN0YXRlLnNlbGVjdGluZyxwbGFjZWhvbGRlcjpfdm0udCgiZWwuZGF0ZXBpY2tlci5zdGFydFRpbWUiKSx2YWx1ZTpfdm0ubWluVmlzaWJsZVRpbWV9LG9uOntmb2N1czpmdW5jdGlvbiBmb2N1cygkZXZlbnQpe192bS5taW5UaW1lUGlja2VyVmlzaWJsZT10cnVlO30saW5wdXQ6ZnVuY3Rpb24gaW5wdXQodmFsKXtyZXR1cm4gX3ZtLmhhbmRsZVRpbWVJbnB1dCh2YWwsIm1pbiIpO30sY2hhbmdlOmZ1bmN0aW9uIGNoYW5nZSh2YWwpe3JldHVybiBfdm0uaGFuZGxlVGltZUNoYW5nZSh2YWwsIm1pbiIpO319fSksX2MoInRpbWUtcGlja2VyIix7cmVmOiJtaW5UaW1lUGlja2VyIixhdHRyczp7InRpbWUtYXJyb3ctY29udHJvbCI6X3ZtLmFycm93Q29udHJvbCx2aXNpYmxlOl92bS5taW5UaW1lUGlja2VyVmlzaWJsZX0sb246e3BpY2s6X3ZtLmhhbmRsZU1pblRpbWVQaWNrLG1vdW50ZWQ6ZnVuY3Rpb24gbW91bnRlZCgkZXZlbnQpe192bS4kcmVmcy5taW5UaW1lUGlja2VyLmZvcm1hdD1fdm0udGltZUZvcm1hdDt9fX0pXSwxKV0pLF9jKCJzcGFuIix7c3RhdGljQ2xhc3M6ImVsLWljb24tYXJyb3ctcmlnaHQifSksX2MoInNwYW4iLHtzdGF0aWNDbGFzczoiZWwtZGF0ZS1yYW5nZS1waWNrZXJfX2VkaXRvcnMtd3JhcCBpcy1yaWdodCJ9LFtfYygic3BhbiIse3N0YXRpY0NsYXNzOiJlbC1kYXRlLXJhbmdlLXBpY2tlcl9fdGltZS1waWNrZXItd3JhcCJ9LFtfYygiZWwtaW5wdXQiLHtzdGF0aWNDbGFzczoiZWwtZGF0ZS1yYW5nZS1waWNrZXJfX2VkaXRvciIsYXR0cnM6e3NpemU6InNtYWxsIixkaXNhYmxlZDpfdm0ucmFuZ2VTdGF0ZS5zZWxlY3RpbmcscGxhY2Vob2xkZXI6X3ZtLnQoImVsLmRhdGVwaWNrZXIuZW5kRGF0ZSIpLHZhbHVlOl92bS5tYXhWaXNpYmxlRGF0ZSxyZWFkb25seTohX3ZtLm1pbkRhdGV9LG9uOntpbnB1dDpmdW5jdGlvbiBpbnB1dCh2YWwpe3JldHVybiBfdm0uaGFuZGxlRGF0ZUlucHV0KHZhbCwibWF4Iik7fSxjaGFuZ2U6ZnVuY3Rpb24gY2hhbmdlKHZhbCl7cmV0dXJuIF92bS5oYW5kbGVEYXRlQ2hhbmdlKHZhbCwibWF4Iik7fX19KV0sMSksX2MoInNwYW4iLHtkaXJlY3RpdmVzOlt7bmFtZToiY2xpY2tvdXRzaWRlIixyYXdOYW1lOiJ2LWNsaWNrb3V0c2lkZSIsdmFsdWU6X3ZtLmhhbmRsZU1heFRpbWVDbG9zZSxleHByZXNzaW9uOiJoYW5kbGVNYXhUaW1lQ2xvc2UifV0sc3RhdGljQ2xhc3M6ImVsLWRhdGUtcmFuZ2UtcGlja2VyX190aW1lLXBpY2tlci13cmFwIn0sW19jKCJlbC1pbnB1dCIse3N0YXRpY0NsYXNzOiJlbC1kYXRlLXJhbmdlLXBpY2tlcl9fZWRpdG9yIixhdHRyczp7c2l6ZToic21hbGwiLGRpc2FibGVkOl92bS5yYW5nZVN0YXRlLnNlbGVjdGluZyxwbGFjZWhvbGRlcjpfdm0udCgiZWwuZGF0ZXBpY2tlci5lbmRUaW1lIiksdmFsdWU6X3ZtLm1heFZpc2libGVUaW1lLHJlYWRvbmx5OiFfdm0ubWluRGF0ZX0sb246e2ZvY3VzOmZ1bmN0aW9uIGZvY3VzKCRldmVudCl7X3ZtLm1pbkRhdGUmJihfdm0ubWF4VGltZVBpY2tlclZpc2libGU9dHJ1ZSk7fSxpbnB1dDpmdW5jdGlvbiBpbnB1dCh2YWwpe3JldHVybiBfdm0uaGFuZGxlVGltZUlucHV0KHZhbCwibWF4Iik7fSxjaGFuZ2U6ZnVuY3Rpb24gY2hhbmdlKHZhbCl7cmV0dXJuIF92bS5oYW5kbGVUaW1lQ2hhbmdlKHZhbCwibWF4Iik7fX19KSxfYygidGltZS1waWNrZXIiLHtyZWY6Im1heFRpbWVQaWNrZXIiLGF0dHJzOnsidGltZS1hcnJvdy1jb250cm9sIjpfdm0uYXJyb3dDb250cm9sLHZpc2libGU6X3ZtLm1heFRpbWVQaWNrZXJWaXNpYmxlfSxvbjp7cGljazpfdm0uaGFuZGxlTWF4VGltZVBpY2ssbW91bnRlZDpmdW5jdGlvbiBtb3VudGVkKCRldmVudCl7X3ZtLiRyZWZzLm1heFRpbWVQaWNrZXIuZm9ybWF0PV92bS50aW1lRm9ybWF0O319fSldLDEpXSldKTpfdm0uX2UoKSxfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXBpY2tlci1wYW5lbF9fY29udGVudCBlbC1kYXRlLXJhbmdlLXBpY2tlcl9fY29udGVudCBpcy1sZWZ0In0sW19jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtZGF0ZS1yYW5nZS1waWNrZXJfX2hlYWRlciJ9LFtfYygiYnV0dG9uIix7c3RhdGljQ2xhc3M6ImVsLXBpY2tlci1wYW5lbF9faWNvbi1idG4gZWwtaWNvbi1kLWFycm93LWxlZnQiLGF0dHJzOnt0eXBlOiJidXR0b24ifSxvbjp7Y2xpY2s6X3ZtLmxlZnRQcmV2WWVhcn19KSxfYygiYnV0dG9uIix7c3RhdGljQ2xhc3M6ImVsLXBpY2tlci1wYW5lbF9faWNvbi1idG4gZWwtaWNvbi1hcnJvdy1sZWZ0IixhdHRyczp7dHlwZToiYnV0dG9uIn0sb246e2NsaWNrOl92bS5sZWZ0UHJldk1vbnRofX0pLF92bS51bmxpbmtQYW5lbHM/X2MoImJ1dHRvbiIse3N0YXRpY0NsYXNzOiJlbC1waWNrZXItcGFuZWxfX2ljb24tYnRuIGVsLWljb24tZC1hcnJvdy1yaWdodCIsY2xhc3M6eyJpcy1kaXNhYmxlZCI6IV92bS5lbmFibGVZZWFyQXJyb3d9LGF0dHJzOnt0eXBlOiJidXR0b24iLGRpc2FibGVkOiFfdm0uZW5hYmxlWWVhckFycm93fSxvbjp7Y2xpY2s6X3ZtLmxlZnROZXh0WWVhcn19KTpfdm0uX2UoKSxfdm0udW5saW5rUGFuZWxzP19jKCJidXR0b24iLHtzdGF0aWNDbGFzczoiZWwtcGlja2VyLXBhbmVsX19pY29uLWJ0biBlbC1pY29uLWFycm93LXJpZ2h0IixjbGFzczp7ImlzLWRpc2FibGVkIjohX3ZtLmVuYWJsZU1vbnRoQXJyb3d9LGF0dHJzOnt0eXBlOiJidXR0b24iLGRpc2FibGVkOiFfdm0uZW5hYmxlTW9udGhBcnJvd30sb246e2NsaWNrOl92bS5sZWZ0TmV4dE1vbnRofX0pOl92bS5fZSgpLF9jKCJkaXYiLFtfdm0uX3YoX3ZtLl9zKF92bS5sZWZ0TGFiZWwpKV0pXSksX2MoImRhdGUtdGFibGUiLHthdHRyczp7InNlbGVjdGlvbi1tb2RlIjoicmFuZ2UiLGRhdGU6X3ZtLmxlZnREYXRlLCJkZWZhdWx0LXZhbHVlIjpfdm0uZGVmYXVsdFZhbHVlLCJtaW4tZGF0ZSI6X3ZtLm1pbkRhdGUsIm1heC1kYXRlIjpfdm0ubWF4RGF0ZSwicmFuZ2Utc3RhdGUiOl92bS5yYW5nZVN0YXRlLCJkaXNhYmxlZC1kYXRlIjpfdm0uZGlzYWJsZWREYXRlLCJjZWxsLWNsYXNzLW5hbWUiOl92bS5jZWxsQ2xhc3NOYW1lLCJmaXJzdC1kYXktb2Ytd2VlayI6X3ZtLmZpcnN0RGF5T2ZXZWVrfSxvbjp7Y2hhbmdlcmFuZ2U6X3ZtLmhhbmRsZUNoYW5nZVJhbmdlLHBpY2s6X3ZtLmhhbmRsZVJhbmdlUGlja319KV0sMSksX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1waWNrZXItcGFuZWxfX2NvbnRlbnQgZWwtZGF0ZS1yYW5nZS1waWNrZXJfX2NvbnRlbnQgaXMtcmlnaHQifSxbX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1kYXRlLXJhbmdlLXBpY2tlcl9faGVhZGVyIn0sW192bS51bmxpbmtQYW5lbHM/X2MoImJ1dHRvbiIse3N0YXRpY0NsYXNzOiJlbC1waWNrZXItcGFuZWxfX2ljb24tYnRuIGVsLWljb24tZC1hcnJvdy1sZWZ0IixjbGFzczp7ImlzLWRpc2FibGVkIjohX3ZtLmVuYWJsZVllYXJBcnJvd30sYXR0cnM6e3R5cGU6ImJ1dHRvbiIsZGlzYWJsZWQ6IV92bS5lbmFibGVZZWFyQXJyb3d9LG9uOntjbGljazpfdm0ucmlnaHRQcmV2WWVhcn19KTpfdm0uX2UoKSxfdm0udW5saW5rUGFuZWxzP19jKCJidXR0b24iLHtzdGF0aWNDbGFzczoiZWwtcGlja2VyLXBhbmVsX19pY29uLWJ0biBlbC1pY29uLWFycm93LWxlZnQiLGNsYXNzOnsiaXMtZGlzYWJsZWQiOiFfdm0uZW5hYmxlTW9udGhBcnJvd30sYXR0cnM6e3R5cGU6ImJ1dHRvbiIsZGlzYWJsZWQ6IV92bS5lbmFibGVNb250aEFycm93fSxvbjp7Y2xpY2s6X3ZtLnJpZ2h0UHJldk1vbnRofX0pOl92bS5fZSgpLF9jKCJidXR0b24iLHtzdGF0aWNDbGFzczoiZWwtcGlja2VyLXBhbmVsX19pY29uLWJ0biBlbC1pY29uLWQtYXJyb3ctcmlnaHQiLGF0dHJzOnt0eXBlOiJidXR0b24ifSxvbjp7Y2xpY2s6X3ZtLnJpZ2h0TmV4dFllYXJ9fSksX2MoImJ1dHRvbiIse3N0YXRpY0NsYXNzOiJlbC1waWNrZXItcGFuZWxfX2ljb24tYnRuIGVsLWljb24tYXJyb3ctcmlnaHQiLGF0dHJzOnt0eXBlOiJidXR0b24ifSxvbjp7Y2xpY2s6X3ZtLnJpZ2h0TmV4dE1vbnRofX0pLF9jKCJkaXYiLFtfdm0uX3YoX3ZtLl9zKF92bS5yaWdodExhYmVsKSldKV0pLF9jKCJkYXRlLXRhYmxlIix7YXR0cnM6eyJzZWxlY3Rpb24tbW9kZSI6InJhbmdlIixkYXRlOl92bS5yaWdodERhdGUsImRlZmF1bHQtdmFsdWUiOl92bS5kZWZhdWx0VmFsdWUsIm1pbi1kYXRlIjpfdm0ubWluRGF0ZSwibWF4LWRhdGUiOl92bS5tYXhEYXRlLCJyYW5nZS1zdGF0ZSI6X3ZtLnJhbmdlU3RhdGUsImRpc2FibGVkLWRhdGUiOl92bS5kaXNhYmxlZERhdGUsImNlbGwtY2xhc3MtbmFtZSI6X3ZtLmNlbGxDbGFzc05hbWUsImZpcnN0LWRheS1vZi13ZWVrIjpfdm0uZmlyc3REYXlPZldlZWt9LG9uOntjaGFuZ2VyYW5nZTpfdm0uaGFuZGxlQ2hhbmdlUmFuZ2UscGljazpfdm0uaGFuZGxlUmFuZ2VQaWNrfX0pXSwxKV0pXSwyKSxfdm0uc2hvd1RpbWU/X2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1waWNrZXItcGFuZWxfX2Zvb3RlciJ9LFtfYygiZWwtYnV0dG9uIix7c3RhdGljQ2xhc3M6ImVsLXBpY2tlci1wYW5lbF9fbGluay1idG4iLGF0dHJzOntzaXplOiJtaW5pIix0eXBlOiJ0ZXh0In0sb246e2NsaWNrOl92bS5oYW5kbGVDbGVhcn19LFtfdm0uX3YoIlxuICAgICAgICAiK192bS5fcyhfdm0udCgiZWwuZGF0ZXBpY2tlci5jbGVhciIpKSsiXG4gICAgICAiKV0pLF9jKCJlbC1idXR0b24iLHtzdGF0aWNDbGFzczoiZWwtcGlja2VyLXBhbmVsX19saW5rLWJ0biIsYXR0cnM6e3BsYWluOiIiLHNpemU6Im1pbmkiLGRpc2FibGVkOl92bS5idG5EaXNhYmxlZH0sb246e2NsaWNrOmZ1bmN0aW9uIGNsaWNrKCRldmVudCl7X3ZtLmhhbmRsZUNvbmZpcm0oZmFsc2UpO319fSxbX3ZtLl92KCJcbiAgICAgICAgIitfdm0uX3MoX3ZtLnQoImVsLmRhdGVwaWNrZXIuY29uZmlybSIpKSsiXG4gICAgICAiKV0pXSwxKTpfdm0uX2UoKV0pXSk7fTt2YXIgZGF0ZV9yYW5nZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzI2NTI4NDlhX3N0YXRpY1JlbmRlckZucz1bXTtkYXRlX3JhbmdldnVlX3R5cGVfdGVtcGxhdGVfaWRfMjY1Mjg0OWFfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9wYW5lbC9kYXRlLXJhbmdlLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0yNjUyODQ5YSYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BhbmVsL2RhdGUtcmFuZ2UudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwp2YXIgZGF0ZV9yYW5nZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2NhbGNEZWZhdWx0VmFsdWU9ZnVuY3Rpb24gY2FsY0RlZmF1bHRWYWx1ZShkZWZhdWx0VmFsdWUpe2lmKEFycmF5LmlzQXJyYXkoZGVmYXVsdFZhbHVlKSl7cmV0dXJuW25ldyBEYXRlKGRlZmF1bHRWYWx1ZVswXSksbmV3IERhdGUoZGVmYXVsdFZhbHVlWzFdKV07fWVsc2UgaWYoZGVmYXVsdFZhbHVlKXtyZXR1cm5bbmV3IERhdGUoZGVmYXVsdFZhbHVlKSxPYmplY3QoZGF0ZV91dGlsX1sibmV4dERhdGUiXSkobmV3IERhdGUoZGVmYXVsdFZhbHVlKSwxKV07fWVsc2V7cmV0dXJuW25ldyBEYXRlKCksT2JqZWN0KGRhdGVfdXRpbF9bIm5leHREYXRlIl0pKG5ldyBEYXRlKCksMSldO319Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgZGF0ZV9yYW5nZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17bWl4aW5zOltsb2NhbGVfZGVmYXVsdC5hXSxkaXJlY3RpdmVzOntDbGlja291dHNpZGU6Y2xpY2tvdXRzaWRlX2RlZmF1bHQuYX0sY29tcHV0ZWQ6e2J0bkRpc2FibGVkOmZ1bmN0aW9uIGJ0bkRpc2FibGVkKCl7cmV0dXJuISh0aGlzLm1pbkRhdGUmJnRoaXMubWF4RGF0ZSYmIXRoaXMuc2VsZWN0aW5nJiZ0aGlzLmlzVmFsaWRWYWx1ZShbdGhpcy5taW5EYXRlLHRoaXMubWF4RGF0ZV0pKTt9LGxlZnRMYWJlbDpmdW5jdGlvbiBsZWZ0TGFiZWwoKXtyZXR1cm4gdGhpcy5sZWZ0RGF0ZS5nZXRGdWxsWWVhcigpKycgJyt0aGlzLnQoJ2VsLmRhdGVwaWNrZXIueWVhcicpKycgJyt0aGlzLnQoJ2VsLmRhdGVwaWNrZXIubW9udGgnKyh0aGlzLmxlZnREYXRlLmdldE1vbnRoKCkrMSkpO30scmlnaHRMYWJlbDpmdW5jdGlvbiByaWdodExhYmVsKCl7cmV0dXJuIHRoaXMucmlnaHREYXRlLmdldEZ1bGxZZWFyKCkrJyAnK3RoaXMudCgnZWwuZGF0ZXBpY2tlci55ZWFyJykrJyAnK3RoaXMudCgnZWwuZGF0ZXBpY2tlci5tb250aCcrKHRoaXMucmlnaHREYXRlLmdldE1vbnRoKCkrMSkpO30sbGVmdFllYXI6ZnVuY3Rpb24gbGVmdFllYXIoKXtyZXR1cm4gdGhpcy5sZWZ0RGF0ZS5nZXRGdWxsWWVhcigpO30sbGVmdE1vbnRoOmZ1bmN0aW9uIGxlZnRNb250aCgpe3JldHVybiB0aGlzLmxlZnREYXRlLmdldE1vbnRoKCk7fSxsZWZ0TW9udGhEYXRlOmZ1bmN0aW9uIGxlZnRNb250aERhdGUoKXtyZXR1cm4gdGhpcy5sZWZ0RGF0ZS5nZXREYXRlKCk7fSxyaWdodFllYXI6ZnVuY3Rpb24gcmlnaHRZZWFyKCl7cmV0dXJuIHRoaXMucmlnaHREYXRlLmdldEZ1bGxZZWFyKCk7fSxyaWdodE1vbnRoOmZ1bmN0aW9uIHJpZ2h0TW9udGgoKXtyZXR1cm4gdGhpcy5yaWdodERhdGUuZ2V0TW9udGgoKTt9LHJpZ2h0TW9udGhEYXRlOmZ1bmN0aW9uIHJpZ2h0TW9udGhEYXRlKCl7cmV0dXJuIHRoaXMucmlnaHREYXRlLmdldERhdGUoKTt9LG1pblZpc2libGVEYXRlOmZ1bmN0aW9uIG1pblZpc2libGVEYXRlKCl7aWYodGhpcy5kYXRlVXNlcklucHV0Lm1pbiE9PW51bGwpcmV0dXJuIHRoaXMuZGF0ZVVzZXJJbnB1dC5taW47aWYodGhpcy5taW5EYXRlKXJldHVybiBPYmplY3QoZGF0ZV91dGlsX1siZm9ybWF0RGF0ZSJdKSh0aGlzLm1pbkRhdGUsdGhpcy5kYXRlRm9ybWF0KTtyZXR1cm4nJzt9LG1heFZpc2libGVEYXRlOmZ1bmN0aW9uIG1heFZpc2libGVEYXRlKCl7aWYodGhpcy5kYXRlVXNlcklucHV0Lm1heCE9PW51bGwpcmV0dXJuIHRoaXMuZGF0ZVVzZXJJbnB1dC5tYXg7aWYodGhpcy5tYXhEYXRlfHx0aGlzLm1pbkRhdGUpcmV0dXJuIE9iamVjdChkYXRlX3V0aWxfWyJmb3JtYXREYXRlIl0pKHRoaXMubWF4RGF0ZXx8dGhpcy5taW5EYXRlLHRoaXMuZGF0ZUZvcm1hdCk7cmV0dXJuJyc7fSxtaW5WaXNpYmxlVGltZTpmdW5jdGlvbiBtaW5WaXNpYmxlVGltZSgpe2lmKHRoaXMudGltZVVzZXJJbnB1dC5taW4hPT1udWxsKXJldHVybiB0aGlzLnRpbWVVc2VySW5wdXQubWluO2lmKHRoaXMubWluRGF0ZSlyZXR1cm4gT2JqZWN0KGRhdGVfdXRpbF9bImZvcm1hdERhdGUiXSkodGhpcy5taW5EYXRlLHRoaXMudGltZUZvcm1hdCk7cmV0dXJuJyc7fSxtYXhWaXNpYmxlVGltZTpmdW5jdGlvbiBtYXhWaXNpYmxlVGltZSgpe2lmKHRoaXMudGltZVVzZXJJbnB1dC5tYXghPT1udWxsKXJldHVybiB0aGlzLnRpbWVVc2VySW5wdXQubWF4O2lmKHRoaXMubWF4RGF0ZXx8dGhpcy5taW5EYXRlKXJldHVybiBPYmplY3QoZGF0ZV91dGlsX1siZm9ybWF0RGF0ZSJdKSh0aGlzLm1heERhdGV8fHRoaXMubWluRGF0ZSx0aGlzLnRpbWVGb3JtYXQpO3JldHVybicnO30sdGltZUZvcm1hdDpmdW5jdGlvbiB0aW1lRm9ybWF0KCl7aWYodGhpcy5mb3JtYXQpe3JldHVybiBPYmplY3QoZGF0ZV91dGlsX1siZXh0cmFjdFRpbWVGb3JtYXQiXSkodGhpcy5mb3JtYXQpO31lbHNle3JldHVybidISDptbTpzcyc7fX0sZGF0ZUZvcm1hdDpmdW5jdGlvbiBkYXRlRm9ybWF0KCl7aWYodGhpcy5mb3JtYXQpe3JldHVybiBPYmplY3QoZGF0ZV91dGlsX1siZXh0cmFjdERhdGVGb3JtYXQiXSkodGhpcy5mb3JtYXQpO31lbHNle3JldHVybid5eXl5LU1NLWRkJzt9fSxlbmFibGVNb250aEFycm93OmZ1bmN0aW9uIGVuYWJsZU1vbnRoQXJyb3coKXt2YXIgbmV4dE1vbnRoPSh0aGlzLmxlZnRNb250aCsxKSUxMjt2YXIgeWVhck9mZnNldD10aGlzLmxlZnRNb250aCsxPj0xMj8xOjA7cmV0dXJuIHRoaXMudW5saW5rUGFuZWxzJiZuZXcgRGF0ZSh0aGlzLmxlZnRZZWFyK3llYXJPZmZzZXQsbmV4dE1vbnRoKTxuZXcgRGF0ZSh0aGlzLnJpZ2h0WWVhcix0aGlzLnJpZ2h0TW9udGgpO30sZW5hYmxlWWVhckFycm93OmZ1bmN0aW9uIGVuYWJsZVllYXJBcnJvdygpe3JldHVybiB0aGlzLnVubGlua1BhbmVscyYmdGhpcy5yaWdodFllYXIqMTIrdGhpcy5yaWdodE1vbnRoLSh0aGlzLmxlZnRZZWFyKjEyK3RoaXMubGVmdE1vbnRoKzEpPj0xMjt9fSxkYXRhOmZ1bmN0aW9uIGRhdGEoKXtyZXR1cm57cG9wcGVyQ2xhc3M6JycsdmFsdWU6W10sZGVmYXVsdFZhbHVlOm51bGwsZGVmYXVsdFRpbWU6bnVsbCxtaW5EYXRlOicnLG1heERhdGU6JycsbGVmdERhdGU6bmV3IERhdGUoKSxyaWdodERhdGU6T2JqZWN0KGRhdGVfdXRpbF9bIm5leHRNb250aCJdKShuZXcgRGF0ZSgpKSxyYW5nZVN0YXRlOntlbmREYXRlOm51bGwsc2VsZWN0aW5nOmZhbHNlLHJvdzpudWxsLGNvbHVtbjpudWxsfSxzaG93VGltZTpmYWxzZSxzaG9ydGN1dHM6JycsdmlzaWJsZTonJyxkaXNhYmxlZERhdGU6JycsY2VsbENsYXNzTmFtZTonJyxmaXJzdERheU9mV2Vlazo3LG1pblRpbWVQaWNrZXJWaXNpYmxlOmZhbHNlLG1heFRpbWVQaWNrZXJWaXNpYmxlOmZhbHNlLGZvcm1hdDonJyxhcnJvd0NvbnRyb2w6ZmFsc2UsdW5saW5rUGFuZWxzOmZhbHNlLGRhdGVVc2VySW5wdXQ6e21pbjpudWxsLG1heDpudWxsfSx0aW1lVXNlcklucHV0OnttaW46bnVsbCxtYXg6bnVsbH19O30sd2F0Y2g6e21pbkRhdGU6ZnVuY3Rpb24gbWluRGF0ZSh2YWwpe3ZhciBfdGhpcz10aGlzO3RoaXMuZGF0ZVVzZXJJbnB1dC5taW49bnVsbDt0aGlzLnRpbWVVc2VySW5wdXQubWluPW51bGw7dGhpcy4kbmV4dFRpY2soZnVuY3Rpb24oKXtpZihfdGhpcy4kcmVmcy5tYXhUaW1lUGlja2VyJiZfdGhpcy5tYXhEYXRlJiZfdGhpcy5tYXhEYXRlPF90aGlzLm1pbkRhdGUpe3ZhciBmb3JtYXQ9J0hIOm1tOnNzJztfdGhpcy4kcmVmcy5tYXhUaW1lUGlja2VyLnNlbGVjdGFibGVSYW5nZT1bW09iamVjdChkYXRlX3V0aWxfWyJwYXJzZURhdGUiXSkoT2JqZWN0KGRhdGVfdXRpbF9bImZvcm1hdERhdGUiXSkoX3RoaXMubWluRGF0ZSxmb3JtYXQpLGZvcm1hdCksT2JqZWN0KGRhdGVfdXRpbF9bInBhcnNlRGF0ZSJdKSgnMjM6NTk6NTknLGZvcm1hdCldXTt9fSk7aWYodmFsJiZ0aGlzLiRyZWZzLm1pblRpbWVQaWNrZXIpe3RoaXMuJHJlZnMubWluVGltZVBpY2tlci5kYXRlPXZhbDt0aGlzLiRyZWZzLm1pblRpbWVQaWNrZXIudmFsdWU9dmFsO319LG1heERhdGU6ZnVuY3Rpb24gbWF4RGF0ZSh2YWwpe3RoaXMuZGF0ZVVzZXJJbnB1dC5tYXg9bnVsbDt0aGlzLnRpbWVVc2VySW5wdXQubWF4PW51bGw7aWYodmFsJiZ0aGlzLiRyZWZzLm1heFRpbWVQaWNrZXIpe3RoaXMuJHJlZnMubWF4VGltZVBpY2tlci5kYXRlPXZhbDt0aGlzLiRyZWZzLm1heFRpbWVQaWNrZXIudmFsdWU9dmFsO319LG1pblRpbWVQaWNrZXJWaXNpYmxlOmZ1bmN0aW9uIG1pblRpbWVQaWNrZXJWaXNpYmxlKHZhbCl7dmFyIF90aGlzMj10aGlzO2lmKHZhbCl7dGhpcy4kbmV4dFRpY2soZnVuY3Rpb24oKXtfdGhpczIuJHJlZnMubWluVGltZVBpY2tlci5kYXRlPV90aGlzMi5taW5EYXRlO190aGlzMi4kcmVmcy5taW5UaW1lUGlja2VyLnZhbHVlPV90aGlzMi5taW5EYXRlO190aGlzMi4kcmVmcy5taW5UaW1lUGlja2VyLmFkanVzdFNwaW5uZXJzKCk7fSk7fX0sbWF4VGltZVBpY2tlclZpc2libGU6ZnVuY3Rpb24gbWF4VGltZVBpY2tlclZpc2libGUodmFsKXt2YXIgX3RoaXMzPXRoaXM7aWYodmFsKXt0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe190aGlzMy4kcmVmcy5tYXhUaW1lUGlja2VyLmRhdGU9X3RoaXMzLm1heERhdGU7X3RoaXMzLiRyZWZzLm1heFRpbWVQaWNrZXIudmFsdWU9X3RoaXMzLm1heERhdGU7X3RoaXMzLiRyZWZzLm1heFRpbWVQaWNrZXIuYWRqdXN0U3Bpbm5lcnMoKTt9KTt9fSx2YWx1ZTpmdW5jdGlvbiB2YWx1ZShuZXdWYWwpe2lmKCFuZXdWYWwpe3RoaXMubWluRGF0ZT1udWxsO3RoaXMubWF4RGF0ZT1udWxsO31lbHNlIGlmKEFycmF5LmlzQXJyYXkobmV3VmFsKSl7dGhpcy5taW5EYXRlPU9iamVjdChkYXRlX3V0aWxfWyJpc0RhdGUiXSkobmV3VmFsWzBdKT9uZXcgRGF0ZShuZXdWYWxbMF0pOm51bGw7dGhpcy5tYXhEYXRlPU9iamVjdChkYXRlX3V0aWxfWyJpc0RhdGUiXSkobmV3VmFsWzFdKT9uZXcgRGF0ZShuZXdWYWxbMV0pOm51bGw7aWYodGhpcy5taW5EYXRlKXt0aGlzLmxlZnREYXRlPXRoaXMubWluRGF0ZTtpZih0aGlzLnVubGlua1BhbmVscyYmdGhpcy5tYXhEYXRlKXt2YXIgbWluRGF0ZVllYXI9dGhpcy5taW5EYXRlLmdldEZ1bGxZZWFyKCk7dmFyIG1pbkRhdGVNb250aD10aGlzLm1pbkRhdGUuZ2V0TW9udGgoKTt2YXIgbWF4RGF0ZVllYXI9dGhpcy5tYXhEYXRlLmdldEZ1bGxZZWFyKCk7dmFyIG1heERhdGVNb250aD10aGlzLm1heERhdGUuZ2V0TW9udGgoKTt0aGlzLnJpZ2h0RGF0ZT1taW5EYXRlWWVhcj09PW1heERhdGVZZWFyJiZtaW5EYXRlTW9udGg9PT1tYXhEYXRlTW9udGg/T2JqZWN0KGRhdGVfdXRpbF9bIm5leHRNb250aCJdKSh0aGlzLm1heERhdGUpOnRoaXMubWF4RGF0ZTt9ZWxzZXt0aGlzLnJpZ2h0RGF0ZT1PYmplY3QoZGF0ZV91dGlsX1sibmV4dE1vbnRoIl0pKHRoaXMubGVmdERhdGUpO319ZWxzZXt0aGlzLmxlZnREYXRlPWRhdGVfcmFuZ2V2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19jYWxjRGVmYXVsdFZhbHVlKHRoaXMuZGVmYXVsdFZhbHVlKVswXTt0aGlzLnJpZ2h0RGF0ZT1PYmplY3QoZGF0ZV91dGlsX1sibmV4dE1vbnRoIl0pKHRoaXMubGVmdERhdGUpO319fSxkZWZhdWx0VmFsdWU6ZnVuY3Rpb24gZGVmYXVsdFZhbHVlKHZhbCl7aWYoIUFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkpe3ZhciBfY2FsY0RlZmF1bHRWYWx1ZT1kYXRlX3JhbmdldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfY2FsY0RlZmF1bHRWYWx1ZSh2YWwpLGxlZnQ9X2NhbGNEZWZhdWx0VmFsdWVbMF0scmlnaHQ9X2NhbGNEZWZhdWx0VmFsdWVbMV07dGhpcy5sZWZ0RGF0ZT1sZWZ0O3RoaXMucmlnaHREYXRlPXZhbCYmdmFsWzFdJiZ0aGlzLnVubGlua1BhbmVscz9yaWdodDpPYmplY3QoZGF0ZV91dGlsX1sibmV4dE1vbnRoIl0pKHRoaXMubGVmdERhdGUpO319fSxtZXRob2RzOntoYW5kbGVDbGVhcjpmdW5jdGlvbiBoYW5kbGVDbGVhcigpe3RoaXMubWluRGF0ZT1udWxsO3RoaXMubWF4RGF0ZT1udWxsO3RoaXMubGVmdERhdGU9ZGF0ZV9yYW5nZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2NhbGNEZWZhdWx0VmFsdWUodGhpcy5kZWZhdWx0VmFsdWUpWzBdO3RoaXMucmlnaHREYXRlPU9iamVjdChkYXRlX3V0aWxfWyJuZXh0TW9udGgiXSkodGhpcy5sZWZ0RGF0ZSk7dGhpcy4kZW1pdCgncGljaycsbnVsbCk7fSxoYW5kbGVDaGFuZ2VSYW5nZTpmdW5jdGlvbiBoYW5kbGVDaGFuZ2VSYW5nZSh2YWwpe3RoaXMubWluRGF0ZT12YWwubWluRGF0ZTt0aGlzLm1heERhdGU9dmFsLm1heERhdGU7dGhpcy5yYW5nZVN0YXRlPXZhbC5yYW5nZVN0YXRlO30saGFuZGxlRGF0ZUlucHV0OmZ1bmN0aW9uIGhhbmRsZURhdGVJbnB1dCh2YWx1ZSx0eXBlKXt0aGlzLmRhdGVVc2VySW5wdXRbdHlwZV09dmFsdWU7aWYodmFsdWUubGVuZ3RoIT09dGhpcy5kYXRlRm9ybWF0Lmxlbmd0aClyZXR1cm47dmFyIHBhcnNlZFZhbHVlPU9iamVjdChkYXRlX3V0aWxfWyJwYXJzZURhdGUiXSkodmFsdWUsdGhpcy5kYXRlRm9ybWF0KTtpZihwYXJzZWRWYWx1ZSl7aWYodHlwZW9mIHRoaXMuZGlzYWJsZWREYXRlPT09J2Z1bmN0aW9uJyYmdGhpcy5kaXNhYmxlZERhdGUobmV3IERhdGUocGFyc2VkVmFsdWUpKSl7cmV0dXJuO31pZih0eXBlPT09J21pbicpe3RoaXMubWluRGF0ZT1PYmplY3QoZGF0ZV91dGlsX1sibW9kaWZ5RGF0ZSJdKSh0aGlzLm1pbkRhdGV8fG5ldyBEYXRlKCkscGFyc2VkVmFsdWUuZ2V0RnVsbFllYXIoKSxwYXJzZWRWYWx1ZS5nZXRNb250aCgpLHBhcnNlZFZhbHVlLmdldERhdGUoKSk7dGhpcy5sZWZ0RGF0ZT1uZXcgRGF0ZShwYXJzZWRWYWx1ZSk7aWYoIXRoaXMudW5saW5rUGFuZWxzKXt0aGlzLnJpZ2h0RGF0ZT1PYmplY3QoZGF0ZV91dGlsX1sibmV4dE1vbnRoIl0pKHRoaXMubGVmdERhdGUpO319ZWxzZXt0aGlzLm1heERhdGU9T2JqZWN0KGRhdGVfdXRpbF9bIm1vZGlmeURhdGUiXSkodGhpcy5tYXhEYXRlfHxuZXcgRGF0ZSgpLHBhcnNlZFZhbHVlLmdldEZ1bGxZZWFyKCkscGFyc2VkVmFsdWUuZ2V0TW9udGgoKSxwYXJzZWRWYWx1ZS5nZXREYXRlKCkpO3RoaXMucmlnaHREYXRlPW5ldyBEYXRlKHBhcnNlZFZhbHVlKTtpZighdGhpcy51bmxpbmtQYW5lbHMpe3RoaXMubGVmdERhdGU9T2JqZWN0KGRhdGVfdXRpbF9bInByZXZNb250aCJdKShwYXJzZWRWYWx1ZSk7fX19fSxoYW5kbGVEYXRlQ2hhbmdlOmZ1bmN0aW9uIGhhbmRsZURhdGVDaGFuZ2UodmFsdWUsdHlwZSl7dmFyIHBhcnNlZFZhbHVlPU9iamVjdChkYXRlX3V0aWxfWyJwYXJzZURhdGUiXSkodmFsdWUsdGhpcy5kYXRlRm9ybWF0KTtpZihwYXJzZWRWYWx1ZSl7aWYodHlwZT09PSdtaW4nKXt0aGlzLm1pbkRhdGU9T2JqZWN0KGRhdGVfdXRpbF9bIm1vZGlmeURhdGUiXSkodGhpcy5taW5EYXRlLHBhcnNlZFZhbHVlLmdldEZ1bGxZZWFyKCkscGFyc2VkVmFsdWUuZ2V0TW9udGgoKSxwYXJzZWRWYWx1ZS5nZXREYXRlKCkpO2lmKHRoaXMubWluRGF0ZT50aGlzLm1heERhdGUpe3RoaXMubWF4RGF0ZT10aGlzLm1pbkRhdGU7fX1lbHNle3RoaXMubWF4RGF0ZT1PYmplY3QoZGF0ZV91dGlsX1sibW9kaWZ5RGF0ZSJdKSh0aGlzLm1heERhdGUscGFyc2VkVmFsdWUuZ2V0RnVsbFllYXIoKSxwYXJzZWRWYWx1ZS5nZXRNb250aCgpLHBhcnNlZFZhbHVlLmdldERhdGUoKSk7aWYodGhpcy5tYXhEYXRlPHRoaXMubWluRGF0ZSl7dGhpcy5taW5EYXRlPXRoaXMubWF4RGF0ZTt9fX19LGhhbmRsZVRpbWVJbnB1dDpmdW5jdGlvbiBoYW5kbGVUaW1lSW5wdXQodmFsdWUsdHlwZSl7dmFyIF90aGlzND10aGlzO3RoaXMudGltZVVzZXJJbnB1dFt0eXBlXT12YWx1ZTtpZih2YWx1ZS5sZW5ndGghPT10aGlzLnRpbWVGb3JtYXQubGVuZ3RoKXJldHVybjt2YXIgcGFyc2VkVmFsdWU9T2JqZWN0KGRhdGVfdXRpbF9bInBhcnNlRGF0ZSJdKSh2YWx1ZSx0aGlzLnRpbWVGb3JtYXQpO2lmKHBhcnNlZFZhbHVlKXtpZih0eXBlPT09J21pbicpe3RoaXMubWluRGF0ZT1PYmplY3QoZGF0ZV91dGlsX1sibW9kaWZ5VGltZSJdKSh0aGlzLm1pbkRhdGUscGFyc2VkVmFsdWUuZ2V0SG91cnMoKSxwYXJzZWRWYWx1ZS5nZXRNaW51dGVzKCkscGFyc2VkVmFsdWUuZ2V0U2Vjb25kcygpKTt0aGlzLiRuZXh0VGljayhmdW5jdGlvbihfKXtyZXR1cm4gX3RoaXM0LiRyZWZzLm1pblRpbWVQaWNrZXIuYWRqdXN0U3Bpbm5lcnMoKTt9KTt9ZWxzZXt0aGlzLm1heERhdGU9T2JqZWN0KGRhdGVfdXRpbF9bIm1vZGlmeVRpbWUiXSkodGhpcy5tYXhEYXRlLHBhcnNlZFZhbHVlLmdldEhvdXJzKCkscGFyc2VkVmFsdWUuZ2V0TWludXRlcygpLHBhcnNlZFZhbHVlLmdldFNlY29uZHMoKSk7dGhpcy4kbmV4dFRpY2soZnVuY3Rpb24oXyl7cmV0dXJuIF90aGlzNC4kcmVmcy5tYXhUaW1lUGlja2VyLmFkanVzdFNwaW5uZXJzKCk7fSk7fX19LGhhbmRsZVRpbWVDaGFuZ2U6ZnVuY3Rpb24gaGFuZGxlVGltZUNoYW5nZSh2YWx1ZSx0eXBlKXt2YXIgcGFyc2VkVmFsdWU9T2JqZWN0KGRhdGVfdXRpbF9bInBhcnNlRGF0ZSJdKSh2YWx1ZSx0aGlzLnRpbWVGb3JtYXQpO2lmKHBhcnNlZFZhbHVlKXtpZih0eXBlPT09J21pbicpe3RoaXMubWluRGF0ZT1PYmplY3QoZGF0ZV91dGlsX1sibW9kaWZ5VGltZSJdKSh0aGlzLm1pbkRhdGUscGFyc2VkVmFsdWUuZ2V0SG91cnMoKSxwYXJzZWRWYWx1ZS5nZXRNaW51dGVzKCkscGFyc2VkVmFsdWUuZ2V0U2Vjb25kcygpKTtpZih0aGlzLm1pbkRhdGU+dGhpcy5tYXhEYXRlKXt0aGlzLm1heERhdGU9dGhpcy5taW5EYXRlO310aGlzLiRyZWZzLm1pblRpbWVQaWNrZXIudmFsdWU9dGhpcy5taW5EYXRlO3RoaXMubWluVGltZVBpY2tlclZpc2libGU9ZmFsc2U7fWVsc2V7dGhpcy5tYXhEYXRlPU9iamVjdChkYXRlX3V0aWxfWyJtb2RpZnlUaW1lIl0pKHRoaXMubWF4RGF0ZSxwYXJzZWRWYWx1ZS5nZXRIb3VycygpLHBhcnNlZFZhbHVlLmdldE1pbnV0ZXMoKSxwYXJzZWRWYWx1ZS5nZXRTZWNvbmRzKCkpO2lmKHRoaXMubWF4RGF0ZTx0aGlzLm1pbkRhdGUpe3RoaXMubWluRGF0ZT10aGlzLm1heERhdGU7fXRoaXMuJHJlZnMubWF4VGltZVBpY2tlci52YWx1ZT10aGlzLm1pbkRhdGU7dGhpcy5tYXhUaW1lUGlja2VyVmlzaWJsZT1mYWxzZTt9fX0saGFuZGxlUmFuZ2VQaWNrOmZ1bmN0aW9uIGhhbmRsZVJhbmdlUGljayh2YWwpe3ZhciBfdGhpczU9dGhpczt2YXIgY2xvc2U9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOnRydWU7dmFyIGRlZmF1bHRUaW1lPXRoaXMuZGVmYXVsdFRpbWV8fFtdO3ZhciBtaW5EYXRlPU9iamVjdChkYXRlX3V0aWxfWyJtb2RpZnlXaXRoVGltZVN0cmluZyJdKSh2YWwubWluRGF0ZSxkZWZhdWx0VGltZVswXSk7dmFyIG1heERhdGU9T2JqZWN0KGRhdGVfdXRpbF9bIm1vZGlmeVdpdGhUaW1lU3RyaW5nIl0pKHZhbC5tYXhEYXRlLGRlZmF1bHRUaW1lWzFdKTtpZih0aGlzLm1heERhdGU9PT1tYXhEYXRlJiZ0aGlzLm1pbkRhdGU9PT1taW5EYXRlKXtyZXR1cm47fXRoaXMub25QaWNrJiZ0aGlzLm9uUGljayh2YWwpO3RoaXMubWF4RGF0ZT1tYXhEYXRlO3RoaXMubWluRGF0ZT1taW5EYXRlOy8vIHdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9FbGVtZUZFL2VsZW1lbnQvaXNzdWVzLzc1MzksIHNob3VsZCByZW1vdmUgdGhpcyBibG9jayB3aGVuIHdlIGRvbid0IGhhdmUgdG8gY2FyZSBhYm91dCBDaHJvbWl1bSA1NSAtIDU3CnNldFRpbWVvdXQoZnVuY3Rpb24oKXtfdGhpczUubWF4RGF0ZT1tYXhEYXRlO190aGlzNS5taW5EYXRlPW1pbkRhdGU7fSwxMCk7aWYoIWNsb3NlfHx0aGlzLnNob3dUaW1lKXJldHVybjt0aGlzLmhhbmRsZUNvbmZpcm0oKTt9LGhhbmRsZVNob3J0Y3V0Q2xpY2s6ZnVuY3Rpb24gaGFuZGxlU2hvcnRjdXRDbGljayhzaG9ydGN1dCl7aWYoc2hvcnRjdXQub25DbGljayl7c2hvcnRjdXQub25DbGljayh0aGlzKTt9fSxoYW5kbGVNaW5UaW1lUGljazpmdW5jdGlvbiBoYW5kbGVNaW5UaW1lUGljayh2YWx1ZSx2aXNpYmxlLGZpcnN0KXt0aGlzLm1pbkRhdGU9dGhpcy5taW5EYXRlfHxuZXcgRGF0ZSgpO2lmKHZhbHVlKXt0aGlzLm1pbkRhdGU9T2JqZWN0KGRhdGVfdXRpbF9bIm1vZGlmeVRpbWUiXSkodGhpcy5taW5EYXRlLHZhbHVlLmdldEhvdXJzKCksdmFsdWUuZ2V0TWludXRlcygpLHZhbHVlLmdldFNlY29uZHMoKSk7fWlmKCFmaXJzdCl7dGhpcy5taW5UaW1lUGlja2VyVmlzaWJsZT12aXNpYmxlO31pZighdGhpcy5tYXhEYXRlfHx0aGlzLm1heERhdGUmJnRoaXMubWF4RGF0ZS5nZXRUaW1lKCk8dGhpcy5taW5EYXRlLmdldFRpbWUoKSl7dGhpcy5tYXhEYXRlPW5ldyBEYXRlKHRoaXMubWluRGF0ZSk7fX0saGFuZGxlTWluVGltZUNsb3NlOmZ1bmN0aW9uIGhhbmRsZU1pblRpbWVDbG9zZSgpe3RoaXMubWluVGltZVBpY2tlclZpc2libGU9ZmFsc2U7fSxoYW5kbGVNYXhUaW1lUGljazpmdW5jdGlvbiBoYW5kbGVNYXhUaW1lUGljayh2YWx1ZSx2aXNpYmxlLGZpcnN0KXtpZih0aGlzLm1heERhdGUmJnZhbHVlKXt0aGlzLm1heERhdGU9T2JqZWN0KGRhdGVfdXRpbF9bIm1vZGlmeVRpbWUiXSkodGhpcy5tYXhEYXRlLHZhbHVlLmdldEhvdXJzKCksdmFsdWUuZ2V0TWludXRlcygpLHZhbHVlLmdldFNlY29uZHMoKSk7fWlmKCFmaXJzdCl7dGhpcy5tYXhUaW1lUGlja2VyVmlzaWJsZT12aXNpYmxlO31pZih0aGlzLm1heERhdGUmJnRoaXMubWluRGF0ZSYmdGhpcy5taW5EYXRlLmdldFRpbWUoKT50aGlzLm1heERhdGUuZ2V0VGltZSgpKXt0aGlzLm1pbkRhdGU9bmV3IERhdGUodGhpcy5tYXhEYXRlKTt9fSxoYW5kbGVNYXhUaW1lQ2xvc2U6ZnVuY3Rpb24gaGFuZGxlTWF4VGltZUNsb3NlKCl7dGhpcy5tYXhUaW1lUGlja2VyVmlzaWJsZT1mYWxzZTt9LC8vIGxlZnRQcmV2KiwgcmlnaHROZXh0KiBuZWVkIHRvIHRha2UgY2FyZSBvZiBgdW5saW5rUGFuZWxzYApsZWZ0UHJldlllYXI6ZnVuY3Rpb24gbGVmdFByZXZZZWFyKCl7dGhpcy5sZWZ0RGF0ZT1PYmplY3QoZGF0ZV91dGlsX1sicHJldlllYXIiXSkodGhpcy5sZWZ0RGF0ZSk7aWYoIXRoaXMudW5saW5rUGFuZWxzKXt0aGlzLnJpZ2h0RGF0ZT1PYmplY3QoZGF0ZV91dGlsX1sibmV4dE1vbnRoIl0pKHRoaXMubGVmdERhdGUpO319LGxlZnRQcmV2TW9udGg6ZnVuY3Rpb24gbGVmdFByZXZNb250aCgpe3RoaXMubGVmdERhdGU9T2JqZWN0KGRhdGVfdXRpbF9bInByZXZNb250aCJdKSh0aGlzLmxlZnREYXRlKTtpZighdGhpcy51bmxpbmtQYW5lbHMpe3RoaXMucmlnaHREYXRlPU9iamVjdChkYXRlX3V0aWxfWyJuZXh0TW9udGgiXSkodGhpcy5sZWZ0RGF0ZSk7fX0scmlnaHROZXh0WWVhcjpmdW5jdGlvbiByaWdodE5leHRZZWFyKCl7aWYoIXRoaXMudW5saW5rUGFuZWxzKXt0aGlzLmxlZnREYXRlPU9iamVjdChkYXRlX3V0aWxfWyJuZXh0WWVhciJdKSh0aGlzLmxlZnREYXRlKTt0aGlzLnJpZ2h0RGF0ZT1PYmplY3QoZGF0ZV91dGlsX1sibmV4dE1vbnRoIl0pKHRoaXMubGVmdERhdGUpO31lbHNle3RoaXMucmlnaHREYXRlPU9iamVjdChkYXRlX3V0aWxfWyJuZXh0WWVhciJdKSh0aGlzLnJpZ2h0RGF0ZSk7fX0scmlnaHROZXh0TW9udGg6ZnVuY3Rpb24gcmlnaHROZXh0TW9udGgoKXtpZighdGhpcy51bmxpbmtQYW5lbHMpe3RoaXMubGVmdERhdGU9T2JqZWN0KGRhdGVfdXRpbF9bIm5leHRNb250aCJdKSh0aGlzLmxlZnREYXRlKTt0aGlzLnJpZ2h0RGF0ZT1PYmplY3QoZGF0ZV91dGlsX1sibmV4dE1vbnRoIl0pKHRoaXMubGVmdERhdGUpO31lbHNle3RoaXMucmlnaHREYXRlPU9iamVjdChkYXRlX3V0aWxfWyJuZXh0TW9udGgiXSkodGhpcy5yaWdodERhdGUpO319LC8vIGxlZnROZXh0KiwgcmlnaHRQcmV2KiBhcmUgY2FsbGVkIHdoZW4gYHVubGlua1BhbmVsc2AgaXMgdHJ1ZQpsZWZ0TmV4dFllYXI6ZnVuY3Rpb24gbGVmdE5leHRZZWFyKCl7dGhpcy5sZWZ0RGF0ZT1PYmplY3QoZGF0ZV91dGlsX1sibmV4dFllYXIiXSkodGhpcy5sZWZ0RGF0ZSk7fSxsZWZ0TmV4dE1vbnRoOmZ1bmN0aW9uIGxlZnROZXh0TW9udGgoKXt0aGlzLmxlZnREYXRlPU9iamVjdChkYXRlX3V0aWxfWyJuZXh0TW9udGgiXSkodGhpcy5sZWZ0RGF0ZSk7fSxyaWdodFByZXZZZWFyOmZ1bmN0aW9uIHJpZ2h0UHJldlllYXIoKXt0aGlzLnJpZ2h0RGF0ZT1PYmplY3QoZGF0ZV91dGlsX1sicHJldlllYXIiXSkodGhpcy5yaWdodERhdGUpO30scmlnaHRQcmV2TW9udGg6ZnVuY3Rpb24gcmlnaHRQcmV2TW9udGgoKXt0aGlzLnJpZ2h0RGF0ZT1PYmplY3QoZGF0ZV91dGlsX1sicHJldk1vbnRoIl0pKHRoaXMucmlnaHREYXRlKTt9LGhhbmRsZUNvbmZpcm06ZnVuY3Rpb24gaGFuZGxlQ29uZmlybSgpe3ZhciB2aXNpYmxlPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dW5kZWZpbmVkP2FyZ3VtZW50c1swXTpmYWxzZTtpZih0aGlzLmlzVmFsaWRWYWx1ZShbdGhpcy5taW5EYXRlLHRoaXMubWF4RGF0ZV0pKXt0aGlzLiRlbWl0KCdwaWNrJyxbdGhpcy5taW5EYXRlLHRoaXMubWF4RGF0ZV0sdmlzaWJsZSk7fX0saXNWYWxpZFZhbHVlOmZ1bmN0aW9uIGlzVmFsaWRWYWx1ZSh2YWx1ZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpJiZ2YWx1ZSYmdmFsdWVbMF0mJnZhbHVlWzFdJiZPYmplY3QoZGF0ZV91dGlsX1siaXNEYXRlIl0pKHZhbHVlWzBdKSYmT2JqZWN0KGRhdGVfdXRpbF9bImlzRGF0ZSJdKSh2YWx1ZVsxXSkmJnZhbHVlWzBdLmdldFRpbWUoKTw9dmFsdWVbMV0uZ2V0VGltZSgpJiYodHlwZW9mIHRoaXMuZGlzYWJsZWREYXRlPT09J2Z1bmN0aW9uJz8hdGhpcy5kaXNhYmxlZERhdGUodmFsdWVbMF0pJiYhdGhpcy5kaXNhYmxlZERhdGUodmFsdWVbMV0pOnRydWUpO30scmVzZXRWaWV3OmZ1bmN0aW9uIHJlc2V0Vmlldygpey8vIE5PVEU6IHRoaXMgaXMgYSBoYWNrIHRvIHJlc2V0IHttaW4sIG1heH1EYXRlIG9uIHBpY2tlciBvcGVuLgovLyBUT0RPOiBjb3JyZWN0IHdheSBvZiBkb2luZyBzbyBpcyB0byByZWZhY3RvciB7bWluLCBtYXh9RGF0ZSB0byBiZSBkZXBlbmRlbnQgb24gdmFsdWUgYW5kIGludGVybmFsIHNlbGVjdGlvbiBzdGF0ZQovLyAgICAgICBhbiBhbHRlcm5hdGl2ZSB3b3VsZCBiZSByZXNldFZpZXcgd2hlbmV2ZXIgcGlja2VyIGJlY29tZXMgdmlzaWJsZSwgc2hvdWxkIGFsc28gaW52ZXN0aWdhdGUgZGF0ZS1wYW5lbCdzIHJlc2V0VmlldwppZih0aGlzLm1pbkRhdGUmJnRoaXMubWF4RGF0ZT09bnVsbCl0aGlzLnJhbmdlU3RhdGUuc2VsZWN0aW5nPWZhbHNlO3RoaXMubWluRGF0ZT10aGlzLnZhbHVlJiZPYmplY3QoZGF0ZV91dGlsX1siaXNEYXRlIl0pKHRoaXMudmFsdWVbMF0pP25ldyBEYXRlKHRoaXMudmFsdWVbMF0pOm51bGw7dGhpcy5tYXhEYXRlPXRoaXMudmFsdWUmJk9iamVjdChkYXRlX3V0aWxfWyJpc0RhdGUiXSkodGhpcy52YWx1ZVswXSk/bmV3IERhdGUodGhpcy52YWx1ZVsxXSk6bnVsbDt9fSxjb21wb25lbnRzOntUaW1lUGlja2VyOnBhbmVsX3RpbWUsRGF0ZVRhYmxlOmRhdGVfdGFibGUsRWxJbnB1dDppbnB1dF9kZWZhdWx0LmEsRWxCdXR0b246YnV0dG9uX2RlZmF1bHQuYX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BhbmVsL2RhdGUtcmFuZ2UudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhbmVsX2RhdGVfcmFuZ2V2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189ZGF0ZV9yYW5nZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9wYW5lbC9kYXRlLXJhbmdlLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIGRhdGVfcmFuZ2VfY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChwYW5lbF9kYXRlX3JhbmdldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLGRhdGVfcmFuZ2V2dWVfdHlwZV90ZW1wbGF0ZV9pZF8yNjUyODQ5YV9yZW5kZXIsZGF0ZV9yYW5nZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzI2NTI4NDlhX3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgZGF0ZV9yYW5nZV9hcGk7fWRhdGVfcmFuZ2VfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGFuZWwvZGF0ZS1yYW5nZS52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgZGF0ZV9yYW5nZT1kYXRlX3JhbmdlX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BhbmVsL21vbnRoLXJhbmdlLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD1mMjY0NWZiOCYKdmFyIG1vbnRoX3JhbmdldnVlX3R5cGVfdGVtcGxhdGVfaWRfZjI2NDVmYjhfcmVuZGVyPWZ1bmN0aW9uIG1vbnRoX3JhbmdldnVlX3R5cGVfdGVtcGxhdGVfaWRfZjI2NDVmYjhfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJ0cmFuc2l0aW9uIix7YXR0cnM6e25hbWU6ImVsLXpvb20taW4tdG9wIn0sb246eyJhZnRlci1sZWF2ZSI6ZnVuY3Rpb24gYWZ0ZXJMZWF2ZSgkZXZlbnQpe192bS4kZW1pdCgiZG9kZXN0cm95Iik7fX19LFtfYygiZGl2Iix7ZGlyZWN0aXZlczpbe25hbWU6InNob3ciLHJhd05hbWU6InYtc2hvdyIsdmFsdWU6X3ZtLnZpc2libGUsZXhwcmVzc2lvbjoidmlzaWJsZSJ9XSxzdGF0aWNDbGFzczoiZWwtcGlja2VyLXBhbmVsIGVsLWRhdGUtcmFuZ2UtcGlja2VyIGVsLXBvcHBlciIsY2xhc3M6W3siaGFzLXNpZGViYXIiOl92bS4kc2xvdHMuc2lkZWJhcnx8X3ZtLnNob3J0Y3V0c30sX3ZtLnBvcHBlckNsYXNzXX0sW19jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtcGlja2VyLXBhbmVsX19ib2R5LXdyYXBwZXIifSxbX3ZtLl90KCJzaWRlYmFyIiksX3ZtLnNob3J0Y3V0cz9fYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXBpY2tlci1wYW5lbF9fc2lkZWJhciJ9LF92bS5fbChfdm0uc2hvcnRjdXRzLGZ1bmN0aW9uKHNob3J0Y3V0LGtleSl7cmV0dXJuIF9jKCJidXR0b24iLHtrZXk6a2V5LHN0YXRpY0NsYXNzOiJlbC1waWNrZXItcGFuZWxfX3Nob3J0Y3V0IixhdHRyczp7dHlwZToiYnV0dG9uIn0sb246e2NsaWNrOmZ1bmN0aW9uIGNsaWNrKCRldmVudCl7X3ZtLmhhbmRsZVNob3J0Y3V0Q2xpY2soc2hvcnRjdXQpO319fSxbX3ZtLl92KF92bS5fcyhzaG9ydGN1dC50ZXh0KSldKTt9KSwwKTpfdm0uX2UoKSxfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXBpY2tlci1wYW5lbF9fYm9keSJ9LFtfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXBpY2tlci1wYW5lbF9fY29udGVudCBlbC1kYXRlLXJhbmdlLXBpY2tlcl9fY29udGVudCBpcy1sZWZ0In0sW19jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtZGF0ZS1yYW5nZS1waWNrZXJfX2hlYWRlciJ9LFtfYygiYnV0dG9uIix7c3RhdGljQ2xhc3M6ImVsLXBpY2tlci1wYW5lbF9faWNvbi1idG4gZWwtaWNvbi1kLWFycm93LWxlZnQiLGF0dHJzOnt0eXBlOiJidXR0b24ifSxvbjp7Y2xpY2s6X3ZtLmxlZnRQcmV2WWVhcn19KSxfdm0udW5saW5rUGFuZWxzP19jKCJidXR0b24iLHtzdGF0aWNDbGFzczoiZWwtcGlja2VyLXBhbmVsX19pY29uLWJ0biBlbC1pY29uLWQtYXJyb3ctcmlnaHQiLGNsYXNzOnsiaXMtZGlzYWJsZWQiOiFfdm0uZW5hYmxlWWVhckFycm93fSxhdHRyczp7dHlwZToiYnV0dG9uIixkaXNhYmxlZDohX3ZtLmVuYWJsZVllYXJBcnJvd30sb246e2NsaWNrOl92bS5sZWZ0TmV4dFllYXJ9fSk6X3ZtLl9lKCksX2MoImRpdiIsW192bS5fdihfdm0uX3MoX3ZtLmxlZnRMYWJlbCkpXSldKSxfYygibW9udGgtdGFibGUiLHthdHRyczp7InNlbGVjdGlvbi1tb2RlIjoicmFuZ2UiLGRhdGU6X3ZtLmxlZnREYXRlLCJkZWZhdWx0LXZhbHVlIjpfdm0uZGVmYXVsdFZhbHVlLCJtaW4tZGF0ZSI6X3ZtLm1pbkRhdGUsIm1heC1kYXRlIjpfdm0ubWF4RGF0ZSwicmFuZ2Utc3RhdGUiOl92bS5yYW5nZVN0YXRlLCJkaXNhYmxlZC1kYXRlIjpfdm0uZGlzYWJsZWREYXRlfSxvbjp7Y2hhbmdlcmFuZ2U6X3ZtLmhhbmRsZUNoYW5nZVJhbmdlLHBpY2s6X3ZtLmhhbmRsZVJhbmdlUGlja319KV0sMSksX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1waWNrZXItcGFuZWxfX2NvbnRlbnQgZWwtZGF0ZS1yYW5nZS1waWNrZXJfX2NvbnRlbnQgaXMtcmlnaHQifSxbX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1kYXRlLXJhbmdlLXBpY2tlcl9faGVhZGVyIn0sW192bS51bmxpbmtQYW5lbHM/X2MoImJ1dHRvbiIse3N0YXRpY0NsYXNzOiJlbC1waWNrZXItcGFuZWxfX2ljb24tYnRuIGVsLWljb24tZC1hcnJvdy1sZWZ0IixjbGFzczp7ImlzLWRpc2FibGVkIjohX3ZtLmVuYWJsZVllYXJBcnJvd30sYXR0cnM6e3R5cGU6ImJ1dHRvbiIsZGlzYWJsZWQ6IV92bS5lbmFibGVZZWFyQXJyb3d9LG9uOntjbGljazpfdm0ucmlnaHRQcmV2WWVhcn19KTpfdm0uX2UoKSxfYygiYnV0dG9uIix7c3RhdGljQ2xhc3M6ImVsLXBpY2tlci1wYW5lbF9faWNvbi1idG4gZWwtaWNvbi1kLWFycm93LXJpZ2h0IixhdHRyczp7dHlwZToiYnV0dG9uIn0sb246e2NsaWNrOl92bS5yaWdodE5leHRZZWFyfX0pLF9jKCJkaXYiLFtfdm0uX3YoX3ZtLl9zKF92bS5yaWdodExhYmVsKSldKV0pLF9jKCJtb250aC10YWJsZSIse2F0dHJzOnsic2VsZWN0aW9uLW1vZGUiOiJyYW5nZSIsZGF0ZTpfdm0ucmlnaHREYXRlLCJkZWZhdWx0LXZhbHVlIjpfdm0uZGVmYXVsdFZhbHVlLCJtaW4tZGF0ZSI6X3ZtLm1pbkRhdGUsIm1heC1kYXRlIjpfdm0ubWF4RGF0ZSwicmFuZ2Utc3RhdGUiOl92bS5yYW5nZVN0YXRlLCJkaXNhYmxlZC1kYXRlIjpfdm0uZGlzYWJsZWREYXRlfSxvbjp7Y2hhbmdlcmFuZ2U6X3ZtLmhhbmRsZUNoYW5nZVJhbmdlLHBpY2s6X3ZtLmhhbmRsZVJhbmdlUGlja319KV0sMSldKV0sMildKV0pO307dmFyIG1vbnRoX3JhbmdldnVlX3R5cGVfdGVtcGxhdGVfaWRfZjI2NDVmYjhfc3RhdGljUmVuZGVyRm5zPVtdO21vbnRoX3JhbmdldnVlX3R5cGVfdGVtcGxhdGVfaWRfZjI2NDVmYjhfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9wYW5lbC9tb250aC1yYW5nZS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9ZjI2NDVmYjgmCi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9wYW5lbC9tb250aC1yYW5nZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCnZhciBtb250aF9yYW5nZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2NhbGNEZWZhdWx0VmFsdWU9ZnVuY3Rpb24gY2FsY0RlZmF1bHRWYWx1ZShkZWZhdWx0VmFsdWUpe2lmKEFycmF5LmlzQXJyYXkoZGVmYXVsdFZhbHVlKSl7cmV0dXJuW25ldyBEYXRlKGRlZmF1bHRWYWx1ZVswXSksbmV3IERhdGUoZGVmYXVsdFZhbHVlWzFdKV07fWVsc2UgaWYoZGVmYXVsdFZhbHVlKXtyZXR1cm5bbmV3IERhdGUoZGVmYXVsdFZhbHVlKSxPYmplY3QoZGF0ZV91dGlsX1sibmV4dE1vbnRoIl0pKG5ldyBEYXRlKGRlZmF1bHRWYWx1ZSkpXTt9ZWxzZXtyZXR1cm5bbmV3IERhdGUoKSxPYmplY3QoZGF0ZV91dGlsX1sibmV4dE1vbnRoIl0pKG5ldyBEYXRlKCkpXTt9fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIG1vbnRoX3JhbmdldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXttaXhpbnM6W2xvY2FsZV9kZWZhdWx0LmFdLGRpcmVjdGl2ZXM6e0NsaWNrb3V0c2lkZTpjbGlja291dHNpZGVfZGVmYXVsdC5hfSxjb21wdXRlZDp7YnRuRGlzYWJsZWQ6ZnVuY3Rpb24gYnRuRGlzYWJsZWQoKXtyZXR1cm4hKHRoaXMubWluRGF0ZSYmdGhpcy5tYXhEYXRlJiYhdGhpcy5zZWxlY3RpbmcmJnRoaXMuaXNWYWxpZFZhbHVlKFt0aGlzLm1pbkRhdGUsdGhpcy5tYXhEYXRlXSkpO30sbGVmdExhYmVsOmZ1bmN0aW9uIGxlZnRMYWJlbCgpe3JldHVybiB0aGlzLmxlZnREYXRlLmdldEZ1bGxZZWFyKCkrJyAnK3RoaXMudCgnZWwuZGF0ZXBpY2tlci55ZWFyJyk7fSxyaWdodExhYmVsOmZ1bmN0aW9uIHJpZ2h0TGFiZWwoKXtyZXR1cm4gdGhpcy5yaWdodERhdGUuZ2V0RnVsbFllYXIoKSsnICcrdGhpcy50KCdlbC5kYXRlcGlja2VyLnllYXInKTt9LGxlZnRZZWFyOmZ1bmN0aW9uIGxlZnRZZWFyKCl7cmV0dXJuIHRoaXMubGVmdERhdGUuZ2V0RnVsbFllYXIoKTt9LHJpZ2h0WWVhcjpmdW5jdGlvbiByaWdodFllYXIoKXtyZXR1cm4gdGhpcy5yaWdodERhdGUuZ2V0RnVsbFllYXIoKT09PXRoaXMubGVmdERhdGUuZ2V0RnVsbFllYXIoKT90aGlzLmxlZnREYXRlLmdldEZ1bGxZZWFyKCkrMTp0aGlzLnJpZ2h0RGF0ZS5nZXRGdWxsWWVhcigpO30sZW5hYmxlWWVhckFycm93OmZ1bmN0aW9uIGVuYWJsZVllYXJBcnJvdygpe3JldHVybiB0aGlzLnVubGlua1BhbmVscyYmdGhpcy5yaWdodFllYXI+dGhpcy5sZWZ0WWVhcisxO319LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybntwb3BwZXJDbGFzczonJyx2YWx1ZTpbXSxkZWZhdWx0VmFsdWU6bnVsbCxkZWZhdWx0VGltZTpudWxsLG1pbkRhdGU6JycsbWF4RGF0ZTonJyxsZWZ0RGF0ZTpuZXcgRGF0ZSgpLHJpZ2h0RGF0ZTpPYmplY3QoZGF0ZV91dGlsX1sibmV4dFllYXIiXSkobmV3IERhdGUoKSkscmFuZ2VTdGF0ZTp7ZW5kRGF0ZTpudWxsLHNlbGVjdGluZzpmYWxzZSxyb3c6bnVsbCxjb2x1bW46bnVsbH0sc2hvcnRjdXRzOicnLHZpc2libGU6JycsZGlzYWJsZWREYXRlOicnLGZvcm1hdDonJyxhcnJvd0NvbnRyb2w6ZmFsc2UsdW5saW5rUGFuZWxzOmZhbHNlfTt9LHdhdGNoOnt2YWx1ZTpmdW5jdGlvbiB2YWx1ZShuZXdWYWwpe2lmKCFuZXdWYWwpe3RoaXMubWluRGF0ZT1udWxsO3RoaXMubWF4RGF0ZT1udWxsO31lbHNlIGlmKEFycmF5LmlzQXJyYXkobmV3VmFsKSl7dGhpcy5taW5EYXRlPU9iamVjdChkYXRlX3V0aWxfWyJpc0RhdGUiXSkobmV3VmFsWzBdKT9uZXcgRGF0ZShuZXdWYWxbMF0pOm51bGw7dGhpcy5tYXhEYXRlPU9iamVjdChkYXRlX3V0aWxfWyJpc0RhdGUiXSkobmV3VmFsWzFdKT9uZXcgRGF0ZShuZXdWYWxbMV0pOm51bGw7aWYodGhpcy5taW5EYXRlKXt0aGlzLmxlZnREYXRlPXRoaXMubWluRGF0ZTtpZih0aGlzLnVubGlua1BhbmVscyYmdGhpcy5tYXhEYXRlKXt2YXIgbWluRGF0ZVllYXI9dGhpcy5taW5EYXRlLmdldEZ1bGxZZWFyKCk7dmFyIG1heERhdGVZZWFyPXRoaXMubWF4RGF0ZS5nZXRGdWxsWWVhcigpO3RoaXMucmlnaHREYXRlPW1pbkRhdGVZZWFyPT09bWF4RGF0ZVllYXI/T2JqZWN0KGRhdGVfdXRpbF9bIm5leHRZZWFyIl0pKHRoaXMubWF4RGF0ZSk6dGhpcy5tYXhEYXRlO31lbHNle3RoaXMucmlnaHREYXRlPU9iamVjdChkYXRlX3V0aWxfWyJuZXh0WWVhciJdKSh0aGlzLmxlZnREYXRlKTt9fWVsc2V7dGhpcy5sZWZ0RGF0ZT1tb250aF9yYW5nZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2NhbGNEZWZhdWx0VmFsdWUodGhpcy5kZWZhdWx0VmFsdWUpWzBdO3RoaXMucmlnaHREYXRlPU9iamVjdChkYXRlX3V0aWxfWyJuZXh0WWVhciJdKSh0aGlzLmxlZnREYXRlKTt9fX0sZGVmYXVsdFZhbHVlOmZ1bmN0aW9uIGRlZmF1bHRWYWx1ZSh2YWwpe2lmKCFBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpKXt2YXIgX2NhbGNEZWZhdWx0VmFsdWU9bW9udGhfcmFuZ2V2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19jYWxjRGVmYXVsdFZhbHVlKHZhbCksbGVmdD1fY2FsY0RlZmF1bHRWYWx1ZVswXSxyaWdodD1fY2FsY0RlZmF1bHRWYWx1ZVsxXTt0aGlzLmxlZnREYXRlPWxlZnQ7dGhpcy5yaWdodERhdGU9dmFsJiZ2YWxbMV0mJmxlZnQuZ2V0RnVsbFllYXIoKSE9PXJpZ2h0LmdldEZ1bGxZZWFyKCkmJnRoaXMudW5saW5rUGFuZWxzP3JpZ2h0Ok9iamVjdChkYXRlX3V0aWxfWyJuZXh0WWVhciJdKSh0aGlzLmxlZnREYXRlKTt9fX0sbWV0aG9kczp7aGFuZGxlQ2xlYXI6ZnVuY3Rpb24gaGFuZGxlQ2xlYXIoKXt0aGlzLm1pbkRhdGU9bnVsbDt0aGlzLm1heERhdGU9bnVsbDt0aGlzLmxlZnREYXRlPW1vbnRoX3JhbmdldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfY2FsY0RlZmF1bHRWYWx1ZSh0aGlzLmRlZmF1bHRWYWx1ZSlbMF07dGhpcy5yaWdodERhdGU9T2JqZWN0KGRhdGVfdXRpbF9bIm5leHRZZWFyIl0pKHRoaXMubGVmdERhdGUpO3RoaXMuJGVtaXQoJ3BpY2snLG51bGwpO30saGFuZGxlQ2hhbmdlUmFuZ2U6ZnVuY3Rpb24gaGFuZGxlQ2hhbmdlUmFuZ2UodmFsKXt0aGlzLm1pbkRhdGU9dmFsLm1pbkRhdGU7dGhpcy5tYXhEYXRlPXZhbC5tYXhEYXRlO3RoaXMucmFuZ2VTdGF0ZT12YWwucmFuZ2VTdGF0ZTt9LGhhbmRsZVJhbmdlUGljazpmdW5jdGlvbiBoYW5kbGVSYW5nZVBpY2sodmFsKXt2YXIgX3RoaXM9dGhpczt2YXIgY2xvc2U9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOnRydWU7dmFyIGRlZmF1bHRUaW1lPXRoaXMuZGVmYXVsdFRpbWV8fFtdO3ZhciBtaW5EYXRlPU9iamVjdChkYXRlX3V0aWxfWyJtb2RpZnlXaXRoVGltZVN0cmluZyJdKSh2YWwubWluRGF0ZSxkZWZhdWx0VGltZVswXSk7dmFyIG1heERhdGU9T2JqZWN0KGRhdGVfdXRpbF9bIm1vZGlmeVdpdGhUaW1lU3RyaW5nIl0pKHZhbC5tYXhEYXRlLGRlZmF1bHRUaW1lWzFdKTtpZih0aGlzLm1heERhdGU9PT1tYXhEYXRlJiZ0aGlzLm1pbkRhdGU9PT1taW5EYXRlKXtyZXR1cm47fXRoaXMub25QaWNrJiZ0aGlzLm9uUGljayh2YWwpO3RoaXMubWF4RGF0ZT1tYXhEYXRlO3RoaXMubWluRGF0ZT1taW5EYXRlOy8vIHdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9FbGVtZUZFL2VsZW1lbnQvaXNzdWVzLzc1MzksIHNob3VsZCByZW1vdmUgdGhpcyBibG9jayB3aGVuIHdlIGRvbid0IGhhdmUgdG8gY2FyZSBhYm91dCBDaHJvbWl1bSA1NSAtIDU3CnNldFRpbWVvdXQoZnVuY3Rpb24oKXtfdGhpcy5tYXhEYXRlPW1heERhdGU7X3RoaXMubWluRGF0ZT1taW5EYXRlO30sMTApO2lmKCFjbG9zZSlyZXR1cm47dGhpcy5oYW5kbGVDb25maXJtKCk7fSxoYW5kbGVTaG9ydGN1dENsaWNrOmZ1bmN0aW9uIGhhbmRsZVNob3J0Y3V0Q2xpY2soc2hvcnRjdXQpe2lmKHNob3J0Y3V0Lm9uQ2xpY2spe3Nob3J0Y3V0Lm9uQ2xpY2sodGhpcyk7fX0sLy8gbGVmdFByZXYqLCByaWdodE5leHQqIG5lZWQgdG8gdGFrZSBjYXJlIG9mIGB1bmxpbmtQYW5lbHNgCmxlZnRQcmV2WWVhcjpmdW5jdGlvbiBsZWZ0UHJldlllYXIoKXt0aGlzLmxlZnREYXRlPU9iamVjdChkYXRlX3V0aWxfWyJwcmV2WWVhciJdKSh0aGlzLmxlZnREYXRlKTtpZighdGhpcy51bmxpbmtQYW5lbHMpe3RoaXMucmlnaHREYXRlPU9iamVjdChkYXRlX3V0aWxfWyJwcmV2WWVhciJdKSh0aGlzLnJpZ2h0RGF0ZSk7fX0scmlnaHROZXh0WWVhcjpmdW5jdGlvbiByaWdodE5leHRZZWFyKCl7aWYoIXRoaXMudW5saW5rUGFuZWxzKXt0aGlzLmxlZnREYXRlPU9iamVjdChkYXRlX3V0aWxfWyJuZXh0WWVhciJdKSh0aGlzLmxlZnREYXRlKTt9dGhpcy5yaWdodERhdGU9T2JqZWN0KGRhdGVfdXRpbF9bIm5leHRZZWFyIl0pKHRoaXMucmlnaHREYXRlKTt9LC8vIGxlZnROZXh0KiwgcmlnaHRQcmV2KiBhcmUgY2FsbGVkIHdoZW4gYHVubGlua1BhbmVsc2AgaXMgdHJ1ZQpsZWZ0TmV4dFllYXI6ZnVuY3Rpb24gbGVmdE5leHRZZWFyKCl7dGhpcy5sZWZ0RGF0ZT1PYmplY3QoZGF0ZV91dGlsX1sibmV4dFllYXIiXSkodGhpcy5sZWZ0RGF0ZSk7fSxyaWdodFByZXZZZWFyOmZ1bmN0aW9uIHJpZ2h0UHJldlllYXIoKXt0aGlzLnJpZ2h0RGF0ZT1PYmplY3QoZGF0ZV91dGlsX1sicHJldlllYXIiXSkodGhpcy5yaWdodERhdGUpO30saGFuZGxlQ29uZmlybTpmdW5jdGlvbiBoYW5kbGVDb25maXJtKCl7dmFyIHZpc2libGU9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzBdOmZhbHNlO2lmKHRoaXMuaXNWYWxpZFZhbHVlKFt0aGlzLm1pbkRhdGUsdGhpcy5tYXhEYXRlXSkpe3RoaXMuJGVtaXQoJ3BpY2snLFt0aGlzLm1pbkRhdGUsdGhpcy5tYXhEYXRlXSx2aXNpYmxlKTt9fSxpc1ZhbGlkVmFsdWU6ZnVuY3Rpb24gaXNWYWxpZFZhbHVlKHZhbHVlKXtyZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkmJnZhbHVlJiZ2YWx1ZVswXSYmdmFsdWVbMV0mJk9iamVjdChkYXRlX3V0aWxfWyJpc0RhdGUiXSkodmFsdWVbMF0pJiZPYmplY3QoZGF0ZV91dGlsX1siaXNEYXRlIl0pKHZhbHVlWzFdKSYmdmFsdWVbMF0uZ2V0VGltZSgpPD12YWx1ZVsxXS5nZXRUaW1lKCkmJih0eXBlb2YgdGhpcy5kaXNhYmxlZERhdGU9PT0nZnVuY3Rpb24nPyF0aGlzLmRpc2FibGVkRGF0ZSh2YWx1ZVswXSkmJiF0aGlzLmRpc2FibGVkRGF0ZSh2YWx1ZVsxXSk6dHJ1ZSk7fSxyZXNldFZpZXc6ZnVuY3Rpb24gcmVzZXRWaWV3KCl7Ly8gTk9URTogdGhpcyBpcyBhIGhhY2sgdG8gcmVzZXQge21pbiwgbWF4fURhdGUgb24gcGlja2VyIG9wZW4uCi8vIFRPRE86IGNvcnJlY3Qgd2F5IG9mIGRvaW5nIHNvIGlzIHRvIHJlZmFjdG9yIHttaW4sIG1heH1EYXRlIHRvIGJlIGRlcGVuZGVudCBvbiB2YWx1ZSBhbmQgaW50ZXJuYWwgc2VsZWN0aW9uIHN0YXRlCi8vICAgICAgIGFuIGFsdGVybmF0aXZlIHdvdWxkIGJlIHJlc2V0VmlldyB3aGVuZXZlciBwaWNrZXIgYmVjb21lcyB2aXNpYmxlLCBzaG91bGQgYWxzbyBpbnZlc3RpZ2F0ZSBkYXRlLXBhbmVsJ3MgcmVzZXRWaWV3CnRoaXMubWluRGF0ZT10aGlzLnZhbHVlJiZPYmplY3QoZGF0ZV91dGlsX1siaXNEYXRlIl0pKHRoaXMudmFsdWVbMF0pP25ldyBEYXRlKHRoaXMudmFsdWVbMF0pOm51bGw7dGhpcy5tYXhEYXRlPXRoaXMudmFsdWUmJk9iamVjdChkYXRlX3V0aWxfWyJpc0RhdGUiXSkodGhpcy52YWx1ZVswXSk/bmV3IERhdGUodGhpcy52YWx1ZVsxXSk6bnVsbDt9fSxjb21wb25lbnRzOntNb250aFRhYmxlOm1vbnRoX3RhYmxlLEVsSW5wdXQ6aW5wdXRfZGVmYXVsdC5hLEVsQnV0dG9uOmJ1dHRvbl9kZWZhdWx0LmF9fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9wYW5lbC9tb250aC1yYW5nZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFuZWxfbW9udGhfcmFuZ2V2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189bW9udGhfcmFuZ2V2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGFuZWwvbW9udGgtcmFuZ2UudnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgbW9udGhfcmFuZ2VfY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChwYW5lbF9tb250aF9yYW5nZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxtb250aF9yYW5nZXZ1ZV90eXBlX3RlbXBsYXRlX2lkX2YyNjQ1ZmI4X3JlbmRlcixtb250aF9yYW5nZXZ1ZV90eXBlX3RlbXBsYXRlX2lkX2YyNjQ1ZmI4X3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgbW9udGhfcmFuZ2VfYXBpO31tb250aF9yYW5nZV9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9wYW5lbC9tb250aC1yYW5nZS52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgbW9udGhfcmFuZ2U9bW9udGhfcmFuZ2VfY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGlja2VyL2RhdGUtcGlja2VyLmpzCnZhciBkYXRlX3BpY2tlcl9nZXRQYW5lbD1mdW5jdGlvbiBnZXRQYW5lbCh0eXBlKXtpZih0eXBlPT09J2RhdGVyYW5nZSd8fHR5cGU9PT0nZGF0ZXRpbWVyYW5nZScpe3JldHVybiBkYXRlX3JhbmdlO31lbHNlIGlmKHR5cGU9PT0nbW9udGhyYW5nZScpe3JldHVybiBtb250aF9yYW5nZTt9cmV0dXJuIHBhbmVsX2RhdGU7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGRhdGVfcGlja2VyPXttaXhpbnM6W3BpY2tlcl0sbmFtZTonRWxEYXRlUGlja2VyJyxwcm9wczp7dHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDonZGF0ZSd9LHRpbWVBcnJvd0NvbnRyb2w6Qm9vbGVhbn0sd2F0Y2g6e3R5cGU6ZnVuY3Rpb24gdHlwZShfdHlwZSl7aWYodGhpcy5waWNrZXIpe3RoaXMudW5tb3VudFBpY2tlcigpO3RoaXMucGFuZWw9ZGF0ZV9waWNrZXJfZ2V0UGFuZWwoX3R5cGUpO3RoaXMubW91bnRQaWNrZXIoKTt9ZWxzZXt0aGlzLnBhbmVsPWRhdGVfcGlja2VyX2dldFBhbmVsKF90eXBlKTt9fX0sY3JlYXRlZDpmdW5jdGlvbiBjcmVhdGVkKCl7dGhpcy5wYW5lbD1kYXRlX3BpY2tlcl9nZXRQYW5lbCh0aGlzLnR5cGUpO319Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGF0ZS1waWNrZXIvaW5kZXguanMKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9kYXRlX3BpY2tlci5pbnN0YWxsPWZ1bmN0aW9uIGluc3RhbGwoVnVlKXtWdWUuY29tcG9uZW50KGRhdGVfcGlja2VyLm5hbWUsZGF0ZV9waWNrZXIpO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYWNrYWdlc19kYXRlX3BpY2tlcj1kYXRlX3BpY2tlcjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9wYW5lbC90aW1lLXNlbGVjdC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NTFhYjkzMjAmCnZhciB0aW1lX3NlbGVjdHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzUxYWI5MzIwX3JlbmRlcj1mdW5jdGlvbiB0aW1lX3NlbGVjdHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzUxYWI5MzIwX3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygidHJhbnNpdGlvbiIse2F0dHJzOntuYW1lOiJlbC16b29tLWluLXRvcCJ9LG9uOnsiYmVmb3JlLWVudGVyIjpfdm0uaGFuZGxlTWVudUVudGVyLCJhZnRlci1sZWF2ZSI6ZnVuY3Rpb24gYWZ0ZXJMZWF2ZSgkZXZlbnQpe192bS4kZW1pdCgiZG9kZXN0cm95Iik7fX19LFtfYygiZGl2Iix7ZGlyZWN0aXZlczpbe25hbWU6InNob3ciLHJhd05hbWU6InYtc2hvdyIsdmFsdWU6X3ZtLnZpc2libGUsZXhwcmVzc2lvbjoidmlzaWJsZSJ9XSxyZWY6InBvcHBlciIsc3RhdGljQ2xhc3M6ImVsLXBpY2tlci1wYW5lbCB0aW1lLXNlbGVjdCBlbC1wb3BwZXIiLGNsYXNzOl92bS5wb3BwZXJDbGFzcyxzdHlsZTp7d2lkdGg6X3ZtLndpZHRoKyJweCJ9fSxbX2MoImVsLXNjcm9sbGJhciIse2F0dHJzOntub3Jlc2l6ZToiIiwid3JhcC1jbGFzcyI6ImVsLXBpY2tlci1wYW5lbF9fY29udGVudCJ9fSxfdm0uX2woX3ZtLml0ZW1zLGZ1bmN0aW9uKGl0ZW0pe3JldHVybiBfYygiZGl2Iix7a2V5Oml0ZW0udmFsdWUsc3RhdGljQ2xhc3M6InRpbWUtc2VsZWN0LWl0ZW0iLGNsYXNzOntzZWxlY3RlZDpfdm0udmFsdWU9PT1pdGVtLnZhbHVlLGRpc2FibGVkOml0ZW0uZGlzYWJsZWQsZGVmYXVsdDppdGVtLnZhbHVlPT09X3ZtLmRlZmF1bHRWYWx1ZX0sYXR0cnM6e2Rpc2FibGVkOml0ZW0uZGlzYWJsZWR9LG9uOntjbGljazpmdW5jdGlvbiBjbGljaygkZXZlbnQpe192bS5oYW5kbGVDbGljayhpdGVtKTt9fX0sW192bS5fdihfdm0uX3MoaXRlbS52YWx1ZSkpXSk7fSksMCldLDEpXSk7fTt2YXIgdGltZV9zZWxlY3R2dWVfdHlwZV90ZW1wbGF0ZV9pZF81MWFiOTMyMF9zdGF0aWNSZW5kZXJGbnM9W107dGltZV9zZWxlY3R2dWVfdHlwZV90ZW1wbGF0ZV9pZF81MWFiOTMyMF9yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BhbmVsL3RpbWUtc2VsZWN0LnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD01MWFiOTMyMCYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BhbmVsL3RpbWUtc2VsZWN0LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KdmFyIHBhcnNlVGltZT1mdW5jdGlvbiBwYXJzZVRpbWUodGltZSl7dmFyIHZhbHVlcz0odGltZXx8JycpLnNwbGl0KCc6Jyk7aWYodmFsdWVzLmxlbmd0aD49Mil7dmFyIGhvdXJzPXBhcnNlSW50KHZhbHVlc1swXSwxMCk7dmFyIG1pbnV0ZXM9cGFyc2VJbnQodmFsdWVzWzFdLDEwKTtyZXR1cm57aG91cnM6aG91cnMsbWludXRlczptaW51dGVzfTt9LyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9yZXR1cm4gbnVsbDt9O3ZhciBjb21wYXJlVGltZT1mdW5jdGlvbiBjb21wYXJlVGltZSh0aW1lMSx0aW1lMil7dmFyIHZhbHVlMT1wYXJzZVRpbWUodGltZTEpO3ZhciB2YWx1ZTI9cGFyc2VUaW1lKHRpbWUyKTt2YXIgbWludXRlczE9dmFsdWUxLm1pbnV0ZXMrdmFsdWUxLmhvdXJzKjYwO3ZhciBtaW51dGVzMj12YWx1ZTIubWludXRlcyt2YWx1ZTIuaG91cnMqNjA7aWYobWludXRlczE9PT1taW51dGVzMil7cmV0dXJuIDA7fXJldHVybiBtaW51dGVzMT5taW51dGVzMj8xOi0xO307dmFyIGZvcm1hdFRpbWU9ZnVuY3Rpb24gZm9ybWF0VGltZSh0aW1lKXtyZXR1cm4odGltZS5ob3VyczwxMD8nMCcrdGltZS5ob3Vyczp0aW1lLmhvdXJzKSsnOicrKHRpbWUubWludXRlczwxMD8nMCcrdGltZS5taW51dGVzOnRpbWUubWludXRlcyk7fTt2YXIgbmV4dFRpbWU9ZnVuY3Rpb24gbmV4dFRpbWUodGltZSxzdGVwKXt2YXIgdGltZVZhbHVlPXBhcnNlVGltZSh0aW1lKTt2YXIgc3RlcFZhbHVlPXBhcnNlVGltZShzdGVwKTt2YXIgbmV4dD17aG91cnM6dGltZVZhbHVlLmhvdXJzLG1pbnV0ZXM6dGltZVZhbHVlLm1pbnV0ZXN9O25leHQubWludXRlcys9c3RlcFZhbHVlLm1pbnV0ZXM7bmV4dC5ob3Vycys9c3RlcFZhbHVlLmhvdXJzO25leHQuaG91cnMrPU1hdGguZmxvb3IobmV4dC5taW51dGVzLzYwKTtuZXh0Lm1pbnV0ZXM9bmV4dC5taW51dGVzJTYwO3JldHVybiBmb3JtYXRUaW1lKG5leHQpO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciB0aW1lX3NlbGVjdHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17Y29tcG9uZW50czp7RWxTY3JvbGxiYXI6c2Nyb2xsYmFyX2RlZmF1bHQuYX0sd2F0Y2g6e3ZhbHVlOmZ1bmN0aW9uIHZhbHVlKHZhbCl7dmFyIF90aGlzPXRoaXM7aWYoIXZhbClyZXR1cm47dGhpcy4kbmV4dFRpY2soZnVuY3Rpb24oKXtyZXR1cm4gX3RoaXMuc2Nyb2xsVG9PcHRpb24oKTt9KTt9fSxtZXRob2RzOntoYW5kbGVDbGljazpmdW5jdGlvbiBoYW5kbGVDbGljayhpdGVtKXtpZighaXRlbS5kaXNhYmxlZCl7dGhpcy4kZW1pdCgncGljaycsaXRlbS52YWx1ZSk7fX0saGFuZGxlQ2xlYXI6ZnVuY3Rpb24gaGFuZGxlQ2xlYXIoKXt0aGlzLiRlbWl0KCdwaWNrJyxudWxsKTt9LHNjcm9sbFRvT3B0aW9uOmZ1bmN0aW9uIHNjcm9sbFRvT3B0aW9uKCl7dmFyIHNlbGVjdG9yPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dW5kZWZpbmVkP2FyZ3VtZW50c1swXTonLnNlbGVjdGVkJzt2YXIgbWVudT10aGlzLiRyZWZzLnBvcHBlci5xdWVyeVNlbGVjdG9yKCcuZWwtcGlja2VyLXBhbmVsX19jb250ZW50Jyk7c2Nyb2xsX2ludG9fdmlld19kZWZhdWx0KCkobWVudSxtZW51LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpKTt9LGhhbmRsZU1lbnVFbnRlcjpmdW5jdGlvbiBoYW5kbGVNZW51RW50ZXIoKXt2YXIgX3RoaXMyPXRoaXM7dmFyIHNlbGVjdGVkPXRoaXMuaXRlbXMubWFwKGZ1bmN0aW9uKGl0ZW0pe3JldHVybiBpdGVtLnZhbHVlO30pLmluZGV4T2YodGhpcy52YWx1ZSkhPT0tMTt2YXIgaGFzRGVmYXVsdD10aGlzLml0ZW1zLm1hcChmdW5jdGlvbihpdGVtKXtyZXR1cm4gaXRlbS52YWx1ZTt9KS5pbmRleE9mKHRoaXMuZGVmYXVsdFZhbHVlKSE9PS0xO3ZhciBvcHRpb249c2VsZWN0ZWQmJicuc2VsZWN0ZWQnfHxoYXNEZWZhdWx0JiYnLmRlZmF1bHQnfHwnLnRpbWUtc2VsZWN0LWl0ZW06bm90KC5kaXNhYmxlZCknO3RoaXMuJG5leHRUaWNrKGZ1bmN0aW9uKCl7cmV0dXJuIF90aGlzMi5zY3JvbGxUb09wdGlvbihvcHRpb24pO30pO30sc2Nyb2xsRG93bjpmdW5jdGlvbiBzY3JvbGxEb3duKHN0ZXApe3ZhciBpdGVtcz10aGlzLml0ZW1zO3ZhciBsZW5ndGg9aXRlbXMubGVuZ3RoO3ZhciB0b3RhbD1pdGVtcy5sZW5ndGg7dmFyIGluZGV4PWl0ZW1zLm1hcChmdW5jdGlvbihpdGVtKXtyZXR1cm4gaXRlbS52YWx1ZTt9KS5pbmRleE9mKHRoaXMudmFsdWUpO3doaWxlKHRvdGFsLS0pe2luZGV4PShpbmRleCtzdGVwK2xlbmd0aCklbGVuZ3RoO2lmKCFpdGVtc1tpbmRleF0uZGlzYWJsZWQpe3RoaXMuJGVtaXQoJ3BpY2snLGl0ZW1zW2luZGV4XS52YWx1ZSx0cnVlKTtyZXR1cm47fX19LGlzVmFsaWRWYWx1ZTpmdW5jdGlvbiBpc1ZhbGlkVmFsdWUoZGF0ZSl7cmV0dXJuIHRoaXMuaXRlbXMuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pe3JldHVybiFpdGVtLmRpc2FibGVkO30pLm1hcChmdW5jdGlvbihpdGVtKXtyZXR1cm4gaXRlbS52YWx1ZTt9KS5pbmRleE9mKGRhdGUpIT09LTE7fSxoYW5kbGVLZXlkb3duOmZ1bmN0aW9uIGhhbmRsZUtleWRvd24oZXZlbnQpe3ZhciBrZXlDb2RlPWV2ZW50LmtleUNvZGU7aWYoa2V5Q29kZT09PTM4fHxrZXlDb2RlPT09NDApe3ZhciBtYXBwaW5nPXs0MDoxLDM4Oi0xfTt2YXIgb2Zmc2V0PW1hcHBpbmdba2V5Q29kZS50b1N0cmluZygpXTt0aGlzLnNjcm9sbERvd24ob2Zmc2V0KTtldmVudC5zdG9wUHJvcGFnYXRpb24oKTtyZXR1cm47fX19LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybntwb3BwZXJDbGFzczonJyxzdGFydDonMDk6MDAnLGVuZDonMTg6MDAnLHN0ZXA6JzAwOjMwJyx2YWx1ZTonJyxkZWZhdWx0VmFsdWU6JycsdmlzaWJsZTpmYWxzZSxtaW5UaW1lOicnLG1heFRpbWU6Jycsd2lkdGg6MH07fSxjb21wdXRlZDp7aXRlbXM6ZnVuY3Rpb24gaXRlbXMoKXt2YXIgc3RhcnQ9dGhpcy5zdGFydDt2YXIgZW5kPXRoaXMuZW5kO3ZhciBzdGVwPXRoaXMuc3RlcDt2YXIgcmVzdWx0PVtdO2lmKHN0YXJ0JiZlbmQmJnN0ZXApe3ZhciBjdXJyZW50PXN0YXJ0O3doaWxlKGNvbXBhcmVUaW1lKGN1cnJlbnQsZW5kKTw9MCl7cmVzdWx0LnB1c2goe3ZhbHVlOmN1cnJlbnQsZGlzYWJsZWQ6Y29tcGFyZVRpbWUoY3VycmVudCx0aGlzLm1pblRpbWV8fCctMTotMScpPD0wfHxjb21wYXJlVGltZShjdXJyZW50LHRoaXMubWF4VGltZXx8JzEwMDoxMDAnKT49MH0pO2N1cnJlbnQ9bmV4dFRpbWUoY3VycmVudCxzdGVwKTt9fXJldHVybiByZXN1bHQ7fX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BhbmVsL3RpbWUtc2VsZWN0LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYW5lbF90aW1lX3NlbGVjdHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz10aW1lX3NlbGVjdHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9wYW5lbC90aW1lLXNlbGVjdC52dWUKLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciB0aW1lX3NlbGVjdF9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHBhbmVsX3RpbWVfc2VsZWN0dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLHRpbWVfc2VsZWN0dnVlX3R5cGVfdGVtcGxhdGVfaWRfNTFhYjkzMjBfcmVuZGVyLHRpbWVfc2VsZWN0dnVlX3R5cGVfdGVtcGxhdGVfaWRfNTFhYjkzMjBfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciB0aW1lX3NlbGVjdF9hcGk7fXRpbWVfc2VsZWN0X2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BhbmVsL3RpbWUtc2VsZWN0LnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciB0aW1lX3NlbGVjdD10aW1lX3NlbGVjdF9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9waWNrZXIvdGltZS1zZWxlY3QuanMKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwaWNrZXJfdGltZV9zZWxlY3Q9e21peGluczpbcGlja2VyXSxuYW1lOidFbFRpbWVTZWxlY3QnLGNvbXBvbmVudE5hbWU6J0VsVGltZVNlbGVjdCcscHJvcHM6e3R5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6J3RpbWUtc2VsZWN0J319LGJlZm9yZUNyZWF0ZTpmdW5jdGlvbiBiZWZvcmVDcmVhdGUoKXt0aGlzLnBhbmVsPXRpbWVfc2VsZWN0O319Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGltZS1zZWxlY3QvaW5kZXguanMKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9waWNrZXJfdGltZV9zZWxlY3QuaW5zdGFsbD1mdW5jdGlvbihWdWUpe1Z1ZS5jb21wb25lbnQocGlja2VyX3RpbWVfc2VsZWN0Lm5hbWUscGlja2VyX3RpbWVfc2VsZWN0KTt9Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFja2FnZXNfdGltZV9zZWxlY3Q9cGlja2VyX3RpbWVfc2VsZWN0Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BhbmVsL3RpbWUtcmFuZ2UudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWZiMjg2NjBlJgp2YXIgdGltZV9yYW5nZXZ1ZV90eXBlX3RlbXBsYXRlX2lkX2ZiMjg2NjBlX3JlbmRlcj1mdW5jdGlvbiB0aW1lX3JhbmdldnVlX3R5cGVfdGVtcGxhdGVfaWRfZmIyODY2MGVfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJ0cmFuc2l0aW9uIix7YXR0cnM6e25hbWU6ImVsLXpvb20taW4tdG9wIn0sb246eyJhZnRlci1sZWF2ZSI6ZnVuY3Rpb24gYWZ0ZXJMZWF2ZSgkZXZlbnQpe192bS4kZW1pdCgiZG9kZXN0cm95Iik7fX19LFtfYygiZGl2Iix7ZGlyZWN0aXZlczpbe25hbWU6InNob3ciLHJhd05hbWU6InYtc2hvdyIsdmFsdWU6X3ZtLnZpc2libGUsZXhwcmVzc2lvbjoidmlzaWJsZSJ9XSxzdGF0aWNDbGFzczoiZWwtdGltZS1yYW5nZS1waWNrZXIgZWwtcGlja2VyLXBhbmVsIGVsLXBvcHBlciIsY2xhc3M6X3ZtLnBvcHBlckNsYXNzfSxbX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC10aW1lLXJhbmdlLXBpY2tlcl9fY29udGVudCJ9LFtfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXRpbWUtcmFuZ2UtcGlja2VyX19jZWxsIn0sW19jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtdGltZS1yYW5nZS1waWNrZXJfX2hlYWRlciJ9LFtfdm0uX3YoX3ZtLl9zKF92bS50KCJlbC5kYXRlcGlja2VyLnN0YXJ0VGltZSIpKSldKSxfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXRpbWUtcmFuZ2UtcGlja2VyX19ib2R5IGVsLXRpbWUtcGFuZWxfX2NvbnRlbnQiLGNsYXNzOnsiaGFzLXNlY29uZHMiOl92bS5zaG93U2Vjb25kcywiaXMtYXJyb3ciOl92bS5hcnJvd0NvbnRyb2x9fSxbX2MoInRpbWUtc3Bpbm5lciIse3JlZjoibWluU3Bpbm5lciIsYXR0cnM6eyJzaG93LXNlY29uZHMiOl92bS5zaG93U2Vjb25kcywiYW0tcG0tbW9kZSI6X3ZtLmFtUG1Nb2RlLCJhcnJvdy1jb250cm9sIjpfdm0uYXJyb3dDb250cm9sLGRhdGU6X3ZtLm1pbkRhdGV9LG9uOntjaGFuZ2U6X3ZtLmhhbmRsZU1pbkNoYW5nZSwic2VsZWN0LXJhbmdlIjpfdm0uc2V0TWluU2VsZWN0aW9uUmFuZ2V9fSldLDEpXSksX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC10aW1lLXJhbmdlLXBpY2tlcl9fY2VsbCJ9LFtfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXRpbWUtcmFuZ2UtcGlja2VyX19oZWFkZXIifSxbX3ZtLl92KF92bS5fcyhfdm0udCgiZWwuZGF0ZXBpY2tlci5lbmRUaW1lIikpKV0pLF9jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtdGltZS1yYW5nZS1waWNrZXJfX2JvZHkgZWwtdGltZS1wYW5lbF9fY29udGVudCIsY2xhc3M6eyJoYXMtc2Vjb25kcyI6X3ZtLnNob3dTZWNvbmRzLCJpcy1hcnJvdyI6X3ZtLmFycm93Q29udHJvbH19LFtfYygidGltZS1zcGlubmVyIix7cmVmOiJtYXhTcGlubmVyIixhdHRyczp7InNob3ctc2Vjb25kcyI6X3ZtLnNob3dTZWNvbmRzLCJhbS1wbS1tb2RlIjpfdm0uYW1QbU1vZGUsImFycm93LWNvbnRyb2wiOl92bS5hcnJvd0NvbnRyb2wsZGF0ZTpfdm0ubWF4RGF0ZX0sb246e2NoYW5nZTpfdm0uaGFuZGxlTWF4Q2hhbmdlLCJzZWxlY3QtcmFuZ2UiOl92bS5zZXRNYXhTZWxlY3Rpb25SYW5nZX19KV0sMSldKV0pLF9jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtdGltZS1wYW5lbF9fZm9vdGVyIn0sW19jKCJidXR0b24iLHtzdGF0aWNDbGFzczoiZWwtdGltZS1wYW5lbF9fYnRuIGNhbmNlbCIsYXR0cnM6e3R5cGU6ImJ1dHRvbiJ9LG9uOntjbGljazpmdW5jdGlvbiBjbGljaygkZXZlbnQpe192bS5oYW5kbGVDYW5jZWwoKTt9fX0sW192bS5fdihfdm0uX3MoX3ZtLnQoImVsLmRhdGVwaWNrZXIuY2FuY2VsIikpKV0pLF9jKCJidXR0b24iLHtzdGF0aWNDbGFzczoiZWwtdGltZS1wYW5lbF9fYnRuIGNvbmZpcm0iLGF0dHJzOnt0eXBlOiJidXR0b24iLGRpc2FibGVkOl92bS5idG5EaXNhYmxlZH0sb246e2NsaWNrOmZ1bmN0aW9uIGNsaWNrKCRldmVudCl7X3ZtLmhhbmRsZUNvbmZpcm0oKTt9fX0sW192bS5fdihfdm0uX3MoX3ZtLnQoImVsLmRhdGVwaWNrZXIuY29uZmlybSIpKSldKV0pXSldKTt9O3ZhciB0aW1lX3JhbmdldnVlX3R5cGVfdGVtcGxhdGVfaWRfZmIyODY2MGVfc3RhdGljUmVuZGVyRm5zPVtdO3RpbWVfcmFuZ2V2dWVfdHlwZV90ZW1wbGF0ZV9pZF9mYjI4NjYwZV9yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BhbmVsL3RpbWUtcmFuZ2UudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWZiMjg2NjBlJgovLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGFuZWwvdGltZS1yYW5nZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCnZhciBNSU5fVElNRT1PYmplY3QoZGF0ZV91dGlsX1sicGFyc2VEYXRlIl0pKCcwMDowMDowMCcsJ0hIOm1tOnNzJyk7dmFyIE1BWF9USU1FPU9iamVjdChkYXRlX3V0aWxfWyJwYXJzZURhdGUiXSkoJzIzOjU5OjU5JywnSEg6bW06c3MnKTt2YXIgdGltZV9yYW5nZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX21pblRpbWVPZkRheT1mdW5jdGlvbiBtaW5UaW1lT2ZEYXkoZGF0ZSl7cmV0dXJuIE9iamVjdChkYXRlX3V0aWxfWyJtb2RpZnlEYXRlIl0pKE1JTl9USU1FLGRhdGUuZ2V0RnVsbFllYXIoKSxkYXRlLmdldE1vbnRoKCksZGF0ZS5nZXREYXRlKCkpO307dmFyIHRpbWVfcmFuZ2V2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19tYXhUaW1lT2ZEYXk9ZnVuY3Rpb24gbWF4VGltZU9mRGF5KGRhdGUpe3JldHVybiBPYmplY3QoZGF0ZV91dGlsX1sibW9kaWZ5RGF0ZSJdKShNQVhfVElNRSxkYXRlLmdldEZ1bGxZZWFyKCksZGF0ZS5nZXRNb250aCgpLGRhdGUuZ2V0RGF0ZSgpKTt9Oy8vIGluY3JlYXNlIHRpbWUgYnkgYW1vdW50IG9mIG1pbGxpc2Vjb25kcywgYnV0IHdpdGhpbiB0aGUgcmFuZ2Ugb2YgZGF5CnZhciBhZHZhbmNlVGltZT1mdW5jdGlvbiBhZHZhbmNlVGltZShkYXRlLGFtb3VudCl7cmV0dXJuIG5ldyBEYXRlKE1hdGgubWluKGRhdGUuZ2V0VGltZSgpK2Ftb3VudCx0aW1lX3JhbmdldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfbWF4VGltZU9mRGF5KGRhdGUpLmdldFRpbWUoKSkpO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciB0aW1lX3JhbmdldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXttaXhpbnM6W2xvY2FsZV9kZWZhdWx0LmFdLGNvbXBvbmVudHM6e1RpbWVTcGlubmVyOnRpbWVfc3Bpbm5lcn0sY29tcHV0ZWQ6e3Nob3dTZWNvbmRzOmZ1bmN0aW9uIHNob3dTZWNvbmRzKCl7cmV0dXJuKHRoaXMuZm9ybWF0fHwnJykuaW5kZXhPZignc3MnKSE9PS0xO30sb2Zmc2V0OmZ1bmN0aW9uIG9mZnNldCgpe3JldHVybiB0aGlzLnNob3dTZWNvbmRzPzExOjg7fSxzcGlubmVyOmZ1bmN0aW9uIHNwaW5uZXIoKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb25SYW5nZVswXTx0aGlzLm9mZnNldD90aGlzLiRyZWZzLm1pblNwaW5uZXI6dGhpcy4kcmVmcy5tYXhTcGlubmVyO30sYnRuRGlzYWJsZWQ6ZnVuY3Rpb24gYnRuRGlzYWJsZWQoKXtyZXR1cm4gdGhpcy5taW5EYXRlLmdldFRpbWUoKT50aGlzLm1heERhdGUuZ2V0VGltZSgpO30sYW1QbU1vZGU6ZnVuY3Rpb24gYW1QbU1vZGUoKXtpZigodGhpcy5mb3JtYXR8fCcnKS5pbmRleE9mKCdBJykhPT0tMSlyZXR1cm4nQSc7aWYoKHRoaXMuZm9ybWF0fHwnJykuaW5kZXhPZignYScpIT09LTEpcmV0dXJuJ2EnO3JldHVybicnO319LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybntwb3BwZXJDbGFzczonJyxtaW5EYXRlOm5ldyBEYXRlKCksbWF4RGF0ZTpuZXcgRGF0ZSgpLHZhbHVlOltdLG9sZFZhbHVlOltuZXcgRGF0ZSgpLG5ldyBEYXRlKCldLGRlZmF1bHRWYWx1ZTpudWxsLGZvcm1hdDonSEg6bW06c3MnLHZpc2libGU6ZmFsc2Usc2VsZWN0aW9uUmFuZ2U6WzAsMl0sYXJyb3dDb250cm9sOmZhbHNlfTt9LHdhdGNoOnt2YWx1ZTpmdW5jdGlvbiB2YWx1ZShfdmFsdWUpe2lmKEFycmF5LmlzQXJyYXkoX3ZhbHVlKSl7dGhpcy5taW5EYXRlPW5ldyBEYXRlKF92YWx1ZVswXSk7dGhpcy5tYXhEYXRlPW5ldyBEYXRlKF92YWx1ZVsxXSk7fWVsc2V7aWYoQXJyYXkuaXNBcnJheSh0aGlzLmRlZmF1bHRWYWx1ZSkpe3RoaXMubWluRGF0ZT1uZXcgRGF0ZSh0aGlzLmRlZmF1bHRWYWx1ZVswXSk7dGhpcy5tYXhEYXRlPW5ldyBEYXRlKHRoaXMuZGVmYXVsdFZhbHVlWzFdKTt9ZWxzZSBpZih0aGlzLmRlZmF1bHRWYWx1ZSl7dGhpcy5taW5EYXRlPW5ldyBEYXRlKHRoaXMuZGVmYXVsdFZhbHVlKTt0aGlzLm1heERhdGU9YWR2YW5jZVRpbWUobmV3IERhdGUodGhpcy5kZWZhdWx0VmFsdWUpLDYwKjYwKjEwMDApO31lbHNle3RoaXMubWluRGF0ZT1uZXcgRGF0ZSgpO3RoaXMubWF4RGF0ZT1hZHZhbmNlVGltZShuZXcgRGF0ZSgpLDYwKjYwKjEwMDApO319fSx2aXNpYmxlOmZ1bmN0aW9uIHZpc2libGUodmFsKXt2YXIgX3RoaXM9dGhpcztpZih2YWwpe3RoaXMub2xkVmFsdWU9dGhpcy52YWx1ZTt0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe3JldHVybiBfdGhpcy4kcmVmcy5taW5TcGlubmVyLmVtaXRTZWxlY3RSYW5nZSgnaG91cnMnKTt9KTt9fX0sbWV0aG9kczp7aGFuZGxlQ2xlYXI6ZnVuY3Rpb24gaGFuZGxlQ2xlYXIoKXt0aGlzLiRlbWl0KCdwaWNrJyxudWxsKTt9LGhhbmRsZUNhbmNlbDpmdW5jdGlvbiBoYW5kbGVDYW5jZWwoKXt0aGlzLiRlbWl0KCdwaWNrJyx0aGlzLm9sZFZhbHVlKTt9LGhhbmRsZU1pbkNoYW5nZTpmdW5jdGlvbiBoYW5kbGVNaW5DaGFuZ2UoZGF0ZSl7dGhpcy5taW5EYXRlPU9iamVjdChkYXRlX3V0aWxfWyJjbGVhck1pbGxpc2Vjb25kcyJdKShkYXRlKTt0aGlzLmhhbmRsZUNoYW5nZSgpO30saGFuZGxlTWF4Q2hhbmdlOmZ1bmN0aW9uIGhhbmRsZU1heENoYW5nZShkYXRlKXt0aGlzLm1heERhdGU9T2JqZWN0KGRhdGVfdXRpbF9bImNsZWFyTWlsbGlzZWNvbmRzIl0pKGRhdGUpO3RoaXMuaGFuZGxlQ2hhbmdlKCk7fSxoYW5kbGVDaGFuZ2U6ZnVuY3Rpb24gaGFuZGxlQ2hhbmdlKCl7aWYodGhpcy5pc1ZhbGlkVmFsdWUoW3RoaXMubWluRGF0ZSx0aGlzLm1heERhdGVdKSl7dGhpcy4kcmVmcy5taW5TcGlubmVyLnNlbGVjdGFibGVSYW5nZT1bW3RpbWVfcmFuZ2V2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19taW5UaW1lT2ZEYXkodGhpcy5taW5EYXRlKSx0aGlzLm1heERhdGVdXTt0aGlzLiRyZWZzLm1heFNwaW5uZXIuc2VsZWN0YWJsZVJhbmdlPVtbdGhpcy5taW5EYXRlLHRpbWVfcmFuZ2V2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19tYXhUaW1lT2ZEYXkodGhpcy5tYXhEYXRlKV1dO3RoaXMuJGVtaXQoJ3BpY2snLFt0aGlzLm1pbkRhdGUsdGhpcy5tYXhEYXRlXSx0cnVlKTt9fSxzZXRNaW5TZWxlY3Rpb25SYW5nZTpmdW5jdGlvbiBzZXRNaW5TZWxlY3Rpb25SYW5nZShzdGFydCxlbmQpe3RoaXMuJGVtaXQoJ3NlbGVjdC1yYW5nZScsc3RhcnQsZW5kLCdtaW4nKTt0aGlzLnNlbGVjdGlvblJhbmdlPVtzdGFydCxlbmRdO30sc2V0TWF4U2VsZWN0aW9uUmFuZ2U6ZnVuY3Rpb24gc2V0TWF4U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsZW5kKXt0aGlzLiRlbWl0KCdzZWxlY3QtcmFuZ2UnLHN0YXJ0LGVuZCwnbWF4Jyk7dGhpcy5zZWxlY3Rpb25SYW5nZT1bc3RhcnQrdGhpcy5vZmZzZXQsZW5kK3RoaXMub2Zmc2V0XTt9LGhhbmRsZUNvbmZpcm06ZnVuY3Rpb24gaGFuZGxlQ29uZmlybSgpe3ZhciB2aXNpYmxlPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dW5kZWZpbmVkP2FyZ3VtZW50c1swXTpmYWxzZTt2YXIgbWluU2VsZWN0YWJsZVJhbmdlPXRoaXMuJHJlZnMubWluU3Bpbm5lci5zZWxlY3RhYmxlUmFuZ2U7dmFyIG1heFNlbGVjdGFibGVSYW5nZT10aGlzLiRyZWZzLm1heFNwaW5uZXIuc2VsZWN0YWJsZVJhbmdlO3RoaXMubWluRGF0ZT1PYmplY3QoZGF0ZV91dGlsX1sibGltaXRUaW1lUmFuZ2UiXSkodGhpcy5taW5EYXRlLG1pblNlbGVjdGFibGVSYW5nZSx0aGlzLmZvcm1hdCk7dGhpcy5tYXhEYXRlPU9iamVjdChkYXRlX3V0aWxfWyJsaW1pdFRpbWVSYW5nZSJdKSh0aGlzLm1heERhdGUsbWF4U2VsZWN0YWJsZVJhbmdlLHRoaXMuZm9ybWF0KTt0aGlzLiRlbWl0KCdwaWNrJyxbdGhpcy5taW5EYXRlLHRoaXMubWF4RGF0ZV0sdmlzaWJsZSk7fSxhZGp1c3RTcGlubmVyczpmdW5jdGlvbiBhZGp1c3RTcGlubmVycygpe3RoaXMuJHJlZnMubWluU3Bpbm5lci5hZGp1c3RTcGlubmVycygpO3RoaXMuJHJlZnMubWF4U3Bpbm5lci5hZGp1c3RTcGlubmVycygpO30sY2hhbmdlU2VsZWN0aW9uUmFuZ2U6ZnVuY3Rpb24gY2hhbmdlU2VsZWN0aW9uUmFuZ2Uoc3RlcCl7dmFyIGxpc3Q9dGhpcy5zaG93U2Vjb25kcz9bMCwzLDYsMTEsMTQsMTddOlswLDMsOCwxMV07dmFyIG1hcHBpbmc9Wydob3VycycsJ21pbnV0ZXMnXS5jb25jYXQodGhpcy5zaG93U2Vjb25kcz9bJ3NlY29uZHMnXTpbXSk7dmFyIGluZGV4PWxpc3QuaW5kZXhPZih0aGlzLnNlbGVjdGlvblJhbmdlWzBdKTt2YXIgbmV4dD0oaW5kZXgrc3RlcCtsaXN0Lmxlbmd0aCklbGlzdC5sZW5ndGg7dmFyIGhhbGY9bGlzdC5sZW5ndGgvMjtpZihuZXh0PGhhbGYpe3RoaXMuJHJlZnMubWluU3Bpbm5lci5lbWl0U2VsZWN0UmFuZ2UobWFwcGluZ1tuZXh0XSk7fWVsc2V7dGhpcy4kcmVmcy5tYXhTcGlubmVyLmVtaXRTZWxlY3RSYW5nZShtYXBwaW5nW25leHQtaGFsZl0pO319LGlzVmFsaWRWYWx1ZTpmdW5jdGlvbiBpc1ZhbGlkVmFsdWUoZGF0ZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZGF0ZSkmJk9iamVjdChkYXRlX3V0aWxfWyJ0aW1lV2l0aGluUmFuZ2UiXSkodGhpcy5taW5EYXRlLHRoaXMuJHJlZnMubWluU3Bpbm5lci5zZWxlY3RhYmxlUmFuZ2UpJiZPYmplY3QoZGF0ZV91dGlsX1sidGltZVdpdGhpblJhbmdlIl0pKHRoaXMubWF4RGF0ZSx0aGlzLiRyZWZzLm1heFNwaW5uZXIuc2VsZWN0YWJsZVJhbmdlKTt9LGhhbmRsZUtleWRvd246ZnVuY3Rpb24gaGFuZGxlS2V5ZG93bihldmVudCl7dmFyIGtleUNvZGU9ZXZlbnQua2V5Q29kZTt2YXIgbWFwcGluZz17Mzg6LTEsNDA6MSwzNzotMSwzOToxfTsvLyBMZWZ0IG9yIFJpZ2h0CmlmKGtleUNvZGU9PT0zN3x8a2V5Q29kZT09PTM5KXt2YXIgc3RlcD1tYXBwaW5nW2tleUNvZGVdO3RoaXMuY2hhbmdlU2VsZWN0aW9uUmFuZ2Uoc3RlcCk7ZXZlbnQucHJldmVudERlZmF1bHQoKTtyZXR1cm47fS8vIFVwIG9yIERvd24KaWYoa2V5Q29kZT09PTM4fHxrZXlDb2RlPT09NDApe3ZhciBfc3RlcD1tYXBwaW5nW2tleUNvZGVdO3RoaXMuc3Bpbm5lci5zY3JvbGxEb3duKF9zdGVwKTtldmVudC5wcmV2ZW50RGVmYXVsdCgpO3JldHVybjt9fX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BhbmVsL3RpbWUtcmFuZ2UudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhbmVsX3RpbWVfcmFuZ2V2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189dGltZV9yYW5nZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9wYW5lbC90aW1lLXJhbmdlLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIHRpbWVfcmFuZ2VfY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChwYW5lbF90aW1lX3JhbmdldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLHRpbWVfcmFuZ2V2dWVfdHlwZV90ZW1wbGF0ZV9pZF9mYjI4NjYwZV9yZW5kZXIsdGltZV9yYW5nZXZ1ZV90eXBlX3RlbXBsYXRlX2lkX2ZiMjg2NjBlX3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgdGltZV9yYW5nZV9hcGk7fXRpbWVfcmFuZ2VfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGFuZWwvdGltZS1yYW5nZS52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgdGltZV9yYW5nZT10aW1lX3JhbmdlX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BpY2tlci90aW1lLXBpY2tlci5qcwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHRpbWVfcGlja2VyPXttaXhpbnM6W3BpY2tlcl0sbmFtZTonRWxUaW1lUGlja2VyJyxwcm9wczp7aXNSYW5nZTpCb29sZWFuLGFycm93Q29udHJvbDpCb29sZWFufSxkYXRhOmZ1bmN0aW9uIGRhdGEoKXtyZXR1cm57dHlwZTonJ307fSx3YXRjaDp7aXNSYW5nZTpmdW5jdGlvbiBpc1JhbmdlKF9pc1JhbmdlKXtpZih0aGlzLnBpY2tlcil7dGhpcy51bm1vdW50UGlja2VyKCk7dGhpcy50eXBlPV9pc1JhbmdlPyd0aW1lcmFuZ2UnOid0aW1lJzt0aGlzLnBhbmVsPV9pc1JhbmdlP3RpbWVfcmFuZ2U6cGFuZWxfdGltZTt0aGlzLm1vdW50UGlja2VyKCk7fWVsc2V7dGhpcy50eXBlPV9pc1JhbmdlPyd0aW1lcmFuZ2UnOid0aW1lJzt0aGlzLnBhbmVsPV9pc1JhbmdlP3RpbWVfcmFuZ2U6cGFuZWxfdGltZTt9fX0sY3JlYXRlZDpmdW5jdGlvbiBjcmVhdGVkKCl7dGhpcy50eXBlPXRoaXMuaXNSYW5nZT8ndGltZXJhbmdlJzondGltZSc7dGhpcy5wYW5lbD10aGlzLmlzUmFuZ2U/dGltZV9yYW5nZTpwYW5lbF90aW1lO319Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGltZS1waWNrZXIvaW5kZXguanMKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi90aW1lX3BpY2tlci5pbnN0YWxsPWZ1bmN0aW9uKFZ1ZSl7VnVlLmNvbXBvbmVudCh0aW1lX3BpY2tlci5uYW1lLHRpbWVfcGlja2VyKTt9Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFja2FnZXNfdGltZV9waWNrZXI9dGltZV9waWNrZXI7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9wb3BvdmVyL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD01MjA2MDI3MiYKdmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81MjA2MDI3Ml9yZW5kZXI9ZnVuY3Rpb24gbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzUyMDYwMjcyX3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygic3BhbiIsW19jKCJ0cmFuc2l0aW9uIix7YXR0cnM6e25hbWU6X3ZtLnRyYW5zaXRpb259LG9uOnsiYWZ0ZXItZW50ZXIiOl92bS5oYW5kbGVBZnRlckVudGVyLCJhZnRlci1sZWF2ZSI6X3ZtLmhhbmRsZUFmdGVyTGVhdmV9fSxbX2MoImRpdiIse2RpcmVjdGl2ZXM6W3tuYW1lOiJzaG93IixyYXdOYW1lOiJ2LXNob3ciLHZhbHVlOiFfdm0uZGlzYWJsZWQmJl92bS5zaG93UG9wcGVyLGV4cHJlc3Npb246IiFkaXNhYmxlZCAmJiBzaG93UG9wcGVyIn1dLHJlZjoicG9wcGVyIixzdGF0aWNDbGFzczoiZWwtcG9wb3ZlciBlbC1wb3BwZXIiLGNsYXNzOltfdm0ucG9wcGVyQ2xhc3MsX3ZtLmNvbnRlbnQmJiJlbC1wb3BvdmVyLS1wbGFpbiJdLHN0eWxlOnt3aWR0aDpfdm0ud2lkdGgrInB4In0sYXR0cnM6e3JvbGU6InRvb2x0aXAiLGlkOl92bS50b29sdGlwSWQsImFyaWEtaGlkZGVuIjpfdm0uZGlzYWJsZWR8fCFfdm0uc2hvd1BvcHBlcj8idHJ1ZSI6ImZhbHNlIn19LFtfdm0udGl0bGU/X2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1wb3BvdmVyX190aXRsZSIsZG9tUHJvcHM6e3RleHRDb250ZW50Ol92bS5fcyhfdm0udGl0bGUpfX0pOl92bS5fZSgpLF92bS5fdCgiZGVmYXVsdCIsW192bS5fdihfdm0uX3MoX3ZtLmNvbnRlbnQpKV0pXSwyKV0pLF92bS5fdCgicmVmZXJlbmNlIildLDIpO307dmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81MjA2MDI3Ml9zdGF0aWNSZW5kZXJGbnM9W107bWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzUyMDYwMjcyX3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9wb3BvdmVyL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD01MjA2MDI3MiYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvcG9wb3Zlci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17bmFtZTonRWxQb3BvdmVyJyxtaXhpbnM6W3Z1ZV9wb3BwZXJfZGVmYXVsdC5hXSxwcm9wczp7dHJpZ2dlcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDonY2xpY2snLHZhbGlkYXRvcjpmdW5jdGlvbiB2YWxpZGF0b3IodmFsdWUpe3JldHVyblsnY2xpY2snLCdmb2N1cycsJ2hvdmVyJywnbWFudWFsJ10uaW5kZXhPZih2YWx1ZSk+LTE7fX0sb3BlbkRlbGF5Ont0eXBlOk51bWJlcixkZWZhdWx0OjB9LGNsb3NlRGVsYXk6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MjAwfSx0aXRsZTpTdHJpbmcsZGlzYWJsZWQ6Qm9vbGVhbixjb250ZW50OlN0cmluZyxyZWZlcmVuY2U6e30scG9wcGVyQ2xhc3M6U3RyaW5nLHdpZHRoOnt9LHZpc2libGVBcnJvdzp7ZGVmYXVsdDp0cnVlfSxhcnJvd09mZnNldDp7dHlwZTpOdW1iZXIsZGVmYXVsdDowfSx0cmFuc2l0aW9uOnt0eXBlOlN0cmluZyxkZWZhdWx0OidmYWRlLWluLWxpbmVhcid9LHRhYmluZGV4Ont0eXBlOk51bWJlcixkZWZhdWx0OjB9fSxjb21wdXRlZDp7dG9vbHRpcElkOmZ1bmN0aW9uIHRvb2x0aXBJZCgpe3JldHVybidlbC1wb3BvdmVyLScrT2JqZWN0KHV0aWxfWyJnZW5lcmF0ZUlkIl0pKCk7fX0sd2F0Y2g6e3Nob3dQb3BwZXI6ZnVuY3Rpb24gc2hvd1BvcHBlcih2YWwpe2lmKHRoaXMuZGlzYWJsZWQpe3JldHVybjt9dmFsP3RoaXMuJGVtaXQoJ3Nob3cnKTp0aGlzLiRlbWl0KCdoaWRlJyk7fX0sbW91bnRlZDpmdW5jdGlvbiBtb3VudGVkKCl7dmFyIF90aGlzPXRoaXM7dmFyIHJlZmVyZW5jZT10aGlzLnJlZmVyZW5jZUVsbT10aGlzLnJlZmVyZW5jZXx8dGhpcy4kcmVmcy5yZWZlcmVuY2U7dmFyIHBvcHBlcj10aGlzLnBvcHBlcnx8dGhpcy4kcmVmcy5wb3BwZXI7aWYoIXJlZmVyZW5jZSYmdGhpcy4kc2xvdHMucmVmZXJlbmNlJiZ0aGlzLiRzbG90cy5yZWZlcmVuY2VbMF0pe3JlZmVyZW5jZT10aGlzLnJlZmVyZW5jZUVsbT10aGlzLiRzbG90cy5yZWZlcmVuY2VbMF0uZWxtO30vLyDlj6/orr/pl67mgKcKaWYocmVmZXJlbmNlKXtPYmplY3QoZG9tX1siYWRkQ2xhc3MiXSkocmVmZXJlbmNlLCdlbC1wb3BvdmVyX19yZWZlcmVuY2UnKTtyZWZlcmVuY2Uuc2V0QXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZGJ5Jyx0aGlzLnRvb2x0aXBJZCk7cmVmZXJlbmNlLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLHRoaXMudGFiaW5kZXgpOy8vIHRhYuW6j+WIlwpwb3BwZXIuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsMCk7aWYodGhpcy50cmlnZ2VyIT09J2NsaWNrJyl7T2JqZWN0KGRvbV9bIm9uIl0pKHJlZmVyZW5jZSwnZm9jdXNpbicsZnVuY3Rpb24oKXtfdGhpcy5oYW5kbGVGb2N1cygpO3ZhciBpbnN0YW5jZT1yZWZlcmVuY2UuX192dWVfXztpZihpbnN0YW5jZSYmdHlwZW9mIGluc3RhbmNlLmZvY3VzPT09J2Z1bmN0aW9uJyl7aW5zdGFuY2UuZm9jdXMoKTt9fSk7T2JqZWN0KGRvbV9bIm9uIl0pKHBvcHBlciwnZm9jdXNpbicsdGhpcy5oYW5kbGVGb2N1cyk7T2JqZWN0KGRvbV9bIm9uIl0pKHJlZmVyZW5jZSwnZm9jdXNvdXQnLHRoaXMuaGFuZGxlQmx1cik7T2JqZWN0KGRvbV9bIm9uIl0pKHBvcHBlciwnZm9jdXNvdXQnLHRoaXMuaGFuZGxlQmx1cik7fU9iamVjdChkb21fWyJvbiJdKShyZWZlcmVuY2UsJ2tleWRvd24nLHRoaXMuaGFuZGxlS2V5ZG93bik7T2JqZWN0KGRvbV9bIm9uIl0pKHJlZmVyZW5jZSwnY2xpY2snLHRoaXMuaGFuZGxlQ2xpY2spO31pZih0aGlzLnRyaWdnZXI9PT0nY2xpY2snKXtPYmplY3QoZG9tX1sib24iXSkocmVmZXJlbmNlLCdjbGljaycsdGhpcy5kb1RvZ2dsZSk7T2JqZWN0KGRvbV9bIm9uIl0pKGRvY3VtZW50LCdjbGljaycsdGhpcy5oYW5kbGVEb2N1bWVudENsaWNrKTt9ZWxzZSBpZih0aGlzLnRyaWdnZXI9PT0naG92ZXInKXtPYmplY3QoZG9tX1sib24iXSkocmVmZXJlbmNlLCdtb3VzZWVudGVyJyx0aGlzLmhhbmRsZU1vdXNlRW50ZXIpO09iamVjdChkb21fWyJvbiJdKShwb3BwZXIsJ21vdXNlZW50ZXInLHRoaXMuaGFuZGxlTW91c2VFbnRlcik7T2JqZWN0KGRvbV9bIm9uIl0pKHJlZmVyZW5jZSwnbW91c2VsZWF2ZScsdGhpcy5oYW5kbGVNb3VzZUxlYXZlKTtPYmplY3QoZG9tX1sib24iXSkocG9wcGVyLCdtb3VzZWxlYXZlJyx0aGlzLmhhbmRsZU1vdXNlTGVhdmUpO31lbHNlIGlmKHRoaXMudHJpZ2dlcj09PSdmb2N1cycpe2lmKHRoaXMudGFiaW5kZXg8MCl7Y29uc29sZS53YXJuKCdbRWxlbWVudCBXYXJuXVtQb3BvdmVyXWEgbmVnYXRpdmUgdGFpbmRleCBtZWFucyB0aGF0IHRoZSBlbGVtZW50IGNhbm5vdCBiZSBmb2N1c2VkIGJ5IHRhYiBrZXknKTt9aWYocmVmZXJlbmNlLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0LCB0ZXh0YXJlYScpKXtPYmplY3QoZG9tX1sib24iXSkocmVmZXJlbmNlLCdmb2N1c2luJyx0aGlzLmRvU2hvdyk7T2JqZWN0KGRvbV9bIm9uIl0pKHJlZmVyZW5jZSwnZm9jdXNvdXQnLHRoaXMuZG9DbG9zZSk7fWVsc2V7T2JqZWN0KGRvbV9bIm9uIl0pKHJlZmVyZW5jZSwnbW91c2Vkb3duJyx0aGlzLmRvU2hvdyk7T2JqZWN0KGRvbV9bIm9uIl0pKHJlZmVyZW5jZSwnbW91c2V1cCcsdGhpcy5kb0Nsb3NlKTt9fX0sYmVmb3JlRGVzdHJveTpmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCl7dGhpcy5jbGVhbnVwKCk7fSxkZWFjdGl2YXRlZDpmdW5jdGlvbiBkZWFjdGl2YXRlZCgpe3RoaXMuY2xlYW51cCgpO30sbWV0aG9kczp7ZG9Ub2dnbGU6ZnVuY3Rpb24gZG9Ub2dnbGUoKXt0aGlzLnNob3dQb3BwZXI9IXRoaXMuc2hvd1BvcHBlcjt9LGRvU2hvdzpmdW5jdGlvbiBkb1Nob3coKXt0aGlzLnNob3dQb3BwZXI9dHJ1ZTt9LGRvQ2xvc2U6ZnVuY3Rpb24gZG9DbG9zZSgpe3RoaXMuc2hvd1BvcHBlcj1mYWxzZTt9LGhhbmRsZUZvY3VzOmZ1bmN0aW9uIGhhbmRsZUZvY3VzKCl7T2JqZWN0KGRvbV9bImFkZENsYXNzIl0pKHRoaXMucmVmZXJlbmNlRWxtLCdmb2N1c2luZycpO2lmKHRoaXMudHJpZ2dlcj09PSdjbGljayd8fHRoaXMudHJpZ2dlcj09PSdmb2N1cycpdGhpcy5zaG93UG9wcGVyPXRydWU7fSxoYW5kbGVDbGljazpmdW5jdGlvbiBoYW5kbGVDbGljaygpe09iamVjdChkb21fWyJyZW1vdmVDbGFzcyJdKSh0aGlzLnJlZmVyZW5jZUVsbSwnZm9jdXNpbmcnKTt9LGhhbmRsZUJsdXI6ZnVuY3Rpb24gaGFuZGxlQmx1cigpe09iamVjdChkb21fWyJyZW1vdmVDbGFzcyJdKSh0aGlzLnJlZmVyZW5jZUVsbSwnZm9jdXNpbmcnKTtpZih0aGlzLnRyaWdnZXI9PT0nY2xpY2snfHx0aGlzLnRyaWdnZXI9PT0nZm9jdXMnKXRoaXMuc2hvd1BvcHBlcj1mYWxzZTt9LGhhbmRsZU1vdXNlRW50ZXI6ZnVuY3Rpb24gaGFuZGxlTW91c2VFbnRlcigpe3ZhciBfdGhpczI9dGhpcztjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO2lmKHRoaXMub3BlbkRlbGF5KXt0aGlzLl90aW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7X3RoaXMyLnNob3dQb3BwZXI9dHJ1ZTt9LHRoaXMub3BlbkRlbGF5KTt9ZWxzZXt0aGlzLnNob3dQb3BwZXI9dHJ1ZTt9fSxoYW5kbGVLZXlkb3duOmZ1bmN0aW9uIGhhbmRsZUtleWRvd24oZXYpe2lmKGV2LmtleUNvZGU9PT0yNyYmdGhpcy50cmlnZ2VyIT09J21hbnVhbCcpey8vIGVzYwp0aGlzLmRvQ2xvc2UoKTt9fSxoYW5kbGVNb3VzZUxlYXZlOmZ1bmN0aW9uIGhhbmRsZU1vdXNlTGVhdmUoKXt2YXIgX3RoaXMzPXRoaXM7Y2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTtpZih0aGlzLmNsb3NlRGVsYXkpe3RoaXMuX3RpbWVyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtfdGhpczMuc2hvd1BvcHBlcj1mYWxzZTt9LHRoaXMuY2xvc2VEZWxheSk7fWVsc2V7dGhpcy5zaG93UG9wcGVyPWZhbHNlO319LGhhbmRsZURvY3VtZW50Q2xpY2s6ZnVuY3Rpb24gaGFuZGxlRG9jdW1lbnRDbGljayhlKXt2YXIgcmVmZXJlbmNlPXRoaXMucmVmZXJlbmNlfHx0aGlzLiRyZWZzLnJlZmVyZW5jZTt2YXIgcG9wcGVyPXRoaXMucG9wcGVyfHx0aGlzLiRyZWZzLnBvcHBlcjtpZighcmVmZXJlbmNlJiZ0aGlzLiRzbG90cy5yZWZlcmVuY2UmJnRoaXMuJHNsb3RzLnJlZmVyZW5jZVswXSl7cmVmZXJlbmNlPXRoaXMucmVmZXJlbmNlRWxtPXRoaXMuJHNsb3RzLnJlZmVyZW5jZVswXS5lbG07fWlmKCF0aGlzLiRlbHx8IXJlZmVyZW5jZXx8dGhpcy4kZWwuY29udGFpbnMoZS50YXJnZXQpfHxyZWZlcmVuY2UuY29udGFpbnMoZS50YXJnZXQpfHwhcG9wcGVyfHxwb3BwZXIuY29udGFpbnMoZS50YXJnZXQpKXJldHVybjt0aGlzLnNob3dQb3BwZXI9ZmFsc2U7fSxoYW5kbGVBZnRlckVudGVyOmZ1bmN0aW9uIGhhbmRsZUFmdGVyRW50ZXIoKXt0aGlzLiRlbWl0KCdhZnRlci1lbnRlcicpO30saGFuZGxlQWZ0ZXJMZWF2ZTpmdW5jdGlvbiBoYW5kbGVBZnRlckxlYXZlKCl7dGhpcy4kZW1pdCgnYWZ0ZXItbGVhdmUnKTt0aGlzLmRvRGVzdHJveSgpO30sY2xlYW51cDpmdW5jdGlvbiBjbGVhbnVwKCl7aWYodGhpcy5vcGVuRGVsYXl8fHRoaXMuY2xvc2VEZWxheSl7Y2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTt9fX0sZGVzdHJveWVkOmZ1bmN0aW9uIGRlc3Ryb3llZCgpe3ZhciByZWZlcmVuY2U9dGhpcy5yZWZlcmVuY2U7T2JqZWN0KGRvbV9bIm9mZiJdKShyZWZlcmVuY2UsJ2NsaWNrJyx0aGlzLmRvVG9nZ2xlKTtPYmplY3QoZG9tX1sib2ZmIl0pKHJlZmVyZW5jZSwnbW91c2V1cCcsdGhpcy5kb0Nsb3NlKTtPYmplY3QoZG9tX1sib2ZmIl0pKHJlZmVyZW5jZSwnbW91c2Vkb3duJyx0aGlzLmRvU2hvdyk7T2JqZWN0KGRvbV9bIm9mZiJdKShyZWZlcmVuY2UsJ2ZvY3VzaW4nLHRoaXMuZG9TaG93KTtPYmplY3QoZG9tX1sib2ZmIl0pKHJlZmVyZW5jZSwnZm9jdXNvdXQnLHRoaXMuZG9DbG9zZSk7T2JqZWN0KGRvbV9bIm9mZiJdKShyZWZlcmVuY2UsJ21vdXNlZG93bicsdGhpcy5kb1Nob3cpO09iamVjdChkb21fWyJvZmYiXSkocmVmZXJlbmNlLCdtb3VzZXVwJyx0aGlzLmRvQ2xvc2UpO09iamVjdChkb21fWyJvZmYiXSkocmVmZXJlbmNlLCdtb3VzZWxlYXZlJyx0aGlzLmhhbmRsZU1vdXNlTGVhdmUpO09iamVjdChkb21fWyJvZmYiXSkocmVmZXJlbmNlLCdtb3VzZWVudGVyJyx0aGlzLmhhbmRsZU1vdXNlRW50ZXIpO09iamVjdChkb21fWyJvZmYiXSkoZG9jdW1lbnQsJ2NsaWNrJyx0aGlzLmhhbmRsZURvY3VtZW50Q2xpY2spO319Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcG9wb3Zlci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189bWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3BvcG92ZXIvc3JjL21haW4udnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgbWFpbl9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHNyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81MjA2MDI3Ml9yZW5kZXIsbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzUyMDYwMjcyX3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgbWFpbl9hcGk7fW1haW5fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy9wb3BvdmVyL3NyYy9tYWluLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBtYWluPW1haW5fY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9wb3BvdmVyL3NyYy9kaXJlY3RpdmUuanMKdmFyIGdldFJlZmVyZW5jZT1mdW5jdGlvbiBnZXRSZWZlcmVuY2UoZWwsYmluZGluZyx2bm9kZSl7dmFyIF9yZWY9YmluZGluZy5leHByZXNzaW9uP2JpbmRpbmcudmFsdWU6YmluZGluZy5hcmc7dmFyIHBvcHBlcj12bm9kZS5jb250ZXh0LiRyZWZzW19yZWZdO2lmKHBvcHBlcil7aWYoQXJyYXkuaXNBcnJheShwb3BwZXIpKXtwb3BwZXJbMF0uJHJlZnMucmVmZXJlbmNlPWVsO31lbHNle3BvcHBlci4kcmVmcy5yZWZlcmVuY2U9ZWw7fX19Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgZGlyZWN0aXZlPXtiaW5kOmZ1bmN0aW9uIGJpbmQoZWwsYmluZGluZyx2bm9kZSl7Z2V0UmVmZXJlbmNlKGVsLGJpbmRpbmcsdm5vZGUpO30saW5zZXJ0ZWQ6ZnVuY3Rpb24gaW5zZXJ0ZWQoZWwsYmluZGluZyx2bm9kZSl7Z2V0UmVmZXJlbmNlKGVsLGJpbmRpbmcsdm5vZGUpO319Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcG9wb3Zlci9pbmRleC5qcwpleHRlcm5hbF92dWVfZGVmYXVsdC5hLmRpcmVjdGl2ZSgncG9wb3ZlcicsZGlyZWN0aXZlKTsvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL21haW4uaW5zdGFsbD1mdW5jdGlvbihWdWUpe1Z1ZS5kaXJlY3RpdmUoJ3BvcG92ZXInLGRpcmVjdGl2ZSk7VnVlLmNvbXBvbmVudChtYWluLm5hbWUsbWFpbik7fTttYWluLmRpcmVjdGl2ZT1kaXJlY3RpdmU7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwb3BvdmVyPW1haW47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90b29sdGlwL3NyYy9tYWluLmpzCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc3JjX21haW49e25hbWU6J0VsVG9vbHRpcCcsbWl4aW5zOlt2dWVfcG9wcGVyX2RlZmF1bHQuYV0scHJvcHM6e29wZW5EZWxheTp7dHlwZTpOdW1iZXIsZGVmYXVsdDowfSxkaXNhYmxlZDpCb29sZWFuLG1hbnVhbDpCb29sZWFuLGVmZmVjdDp7dHlwZTpTdHJpbmcsZGVmYXVsdDonZGFyayd9LGFycm93T2Zmc2V0Ont0eXBlOk51bWJlcixkZWZhdWx0OjB9LHBvcHBlckNsYXNzOlN0cmluZyxjb250ZW50OlN0cmluZyx2aXNpYmxlQXJyb3c6e2RlZmF1bHQ6dHJ1ZX0sdHJhbnNpdGlvbjp7dHlwZTpTdHJpbmcsZGVmYXVsdDonZWwtZmFkZS1pbi1saW5lYXInfSxwb3BwZXJPcHRpb25zOntkZWZhdWx0OmZ1bmN0aW9uIF9kZWZhdWx0KCl7cmV0dXJue2JvdW5kYXJpZXNQYWRkaW5nOjEwLGdwdUFjY2VsZXJhdGlvbjpmYWxzZX07fX0sZW50ZXJhYmxlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDp0cnVlfSxoaWRlQWZ0ZXI6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MH0sdGFiaW5kZXg6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MH19LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybnt0b29sdGlwSWQ6J2VsLXRvb2x0aXAtJytPYmplY3QodXRpbF9bImdlbmVyYXRlSWQiXSkoKSx0aW1lb3V0UGVuZGluZzpudWxsLGZvY3VzaW5nOmZhbHNlfTt9LGJlZm9yZUNyZWF0ZTpmdW5jdGlvbiBiZWZvcmVDcmVhdGUoKXt2YXIgX3RoaXM9dGhpcztpZih0aGlzLiRpc1NlcnZlcilyZXR1cm47dGhpcy5wb3BwZXJWTT1uZXcgZXh0ZXJuYWxfdnVlX2RlZmF1bHQuYSh7ZGF0YTp7bm9kZTonJ30scmVuZGVyOmZ1bmN0aW9uIHJlbmRlcihoKXtyZXR1cm4gdGhpcy5ub2RlO319KS4kbW91bnQoKTt0aGlzLmRlYm91bmNlQ2xvc2U9ZGVib3VuY2VfZGVmYXVsdCgpKDIwMCxmdW5jdGlvbigpe3JldHVybiBfdGhpcy5oYW5kbGVDbG9zZVBvcHBlcigpO30pO30scmVuZGVyOmZ1bmN0aW9uIHJlbmRlcihoKXt2YXIgX3RoaXMyPXRoaXM7aWYodGhpcy5wb3BwZXJWTSl7dGhpcy5wb3BwZXJWTS5ub2RlPWgoJ3RyYW5zaXRpb24nLHthdHRyczp7bmFtZTp0aGlzLnRyYW5zaXRpb259LG9uOnsnYWZ0ZXJMZWF2ZSc6dGhpcy5kb0Rlc3Ryb3l9fSxbaCgnZGl2Jyx7b246eydtb3VzZWxlYXZlJzpmdW5jdGlvbiBtb3VzZWxlYXZlKCl7X3RoaXMyLnNldEV4cGVjdGVkU3RhdGUoZmFsc2UpO190aGlzMi5kZWJvdW5jZUNsb3NlKCk7fSwnbW91c2VlbnRlcic6ZnVuY3Rpb24gbW91c2VlbnRlcigpe190aGlzMi5zZXRFeHBlY3RlZFN0YXRlKHRydWUpO319LHJlZjoncG9wcGVyJyxhdHRyczp7cm9sZTondG9vbHRpcCcsaWQ6dGhpcy50b29sdGlwSWQsJ2FyaWEtaGlkZGVuJzp0aGlzLmRpc2FibGVkfHwhdGhpcy5zaG93UG9wcGVyPyd0cnVlJzonZmFsc2UnfSxkaXJlY3RpdmVzOlt7bmFtZTonc2hvdycsdmFsdWU6IXRoaXMuZGlzYWJsZWQmJnRoaXMuc2hvd1BvcHBlcn1dLCdjbGFzcyc6WydlbC10b29sdGlwX19wb3BwZXInLCdpcy0nK3RoaXMuZWZmZWN0LHRoaXMucG9wcGVyQ2xhc3NdfSxbdGhpcy4kc2xvdHMuY29udGVudHx8dGhpcy5jb250ZW50XSldKTt9dmFyIGZpcnN0RWxlbWVudD10aGlzLmdldEZpcnN0RWxlbWVudCgpO2lmKCFmaXJzdEVsZW1lbnQpcmV0dXJuIG51bGw7dmFyIGRhdGE9Zmlyc3RFbGVtZW50LmRhdGE9Zmlyc3RFbGVtZW50LmRhdGF8fHt9O2RhdGEuc3RhdGljQ2xhc3M9dGhpcy5hZGRUb29sdGlwQ2xhc3MoZGF0YS5zdGF0aWNDbGFzcyk7cmV0dXJuIGZpcnN0RWxlbWVudDt9LG1vdW50ZWQ6ZnVuY3Rpb24gbW91bnRlZCgpe3ZhciBfdGhpczM9dGhpczt0aGlzLnJlZmVyZW5jZUVsbT10aGlzLiRlbDtpZih0aGlzLiRlbC5ub2RlVHlwZT09PTEpe3RoaXMuJGVsLnNldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScsdGhpcy50b29sdGlwSWQpO3RoaXMuJGVsLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLHRoaXMudGFiaW5kZXgpO09iamVjdChkb21fWyJvbiJdKSh0aGlzLnJlZmVyZW5jZUVsbSwnbW91c2VlbnRlcicsdGhpcy5zaG93KTtPYmplY3QoZG9tX1sib24iXSkodGhpcy5yZWZlcmVuY2VFbG0sJ21vdXNlbGVhdmUnLHRoaXMuaGlkZSk7T2JqZWN0KGRvbV9bIm9uIl0pKHRoaXMucmVmZXJlbmNlRWxtLCdmb2N1cycsZnVuY3Rpb24oKXtpZighX3RoaXMzLiRzbG90cy5kZWZhdWx0fHwhX3RoaXMzLiRzbG90cy5kZWZhdWx0Lmxlbmd0aCl7X3RoaXMzLmhhbmRsZUZvY3VzKCk7cmV0dXJuO312YXIgaW5zdGFuY2U9X3RoaXMzLiRzbG90cy5kZWZhdWx0WzBdLmNvbXBvbmVudEluc3RhbmNlO2lmKGluc3RhbmNlJiZpbnN0YW5jZS5mb2N1cyl7aW5zdGFuY2UuZm9jdXMoKTt9ZWxzZXtfdGhpczMuaGFuZGxlRm9jdXMoKTt9fSk7T2JqZWN0KGRvbV9bIm9uIl0pKHRoaXMucmVmZXJlbmNlRWxtLCdibHVyJyx0aGlzLmhhbmRsZUJsdXIpO09iamVjdChkb21fWyJvbiJdKSh0aGlzLnJlZmVyZW5jZUVsbSwnY2xpY2snLHRoaXMucmVtb3ZlRm9jdXNpbmcpO30vLyBmaXggaXNzdWUgaHR0cHM6Ly9naXRodWIuY29tL0VsZW1lRkUvZWxlbWVudC9pc3N1ZXMvMTQ0MjQKaWYodGhpcy52YWx1ZSYmdGhpcy5wb3BwZXJWTSl7dGhpcy5wb3BwZXJWTS4kbmV4dFRpY2soZnVuY3Rpb24oKXtpZihfdGhpczMudmFsdWUpe190aGlzMy51cGRhdGVQb3BwZXIoKTt9fSk7fX0sd2F0Y2g6e2ZvY3VzaW5nOmZ1bmN0aW9uIGZvY3VzaW5nKHZhbCl7aWYodmFsKXtPYmplY3QoZG9tX1siYWRkQ2xhc3MiXSkodGhpcy5yZWZlcmVuY2VFbG0sJ2ZvY3VzaW5nJyk7fWVsc2V7T2JqZWN0KGRvbV9bInJlbW92ZUNsYXNzIl0pKHRoaXMucmVmZXJlbmNlRWxtLCdmb2N1c2luZycpO319fSxtZXRob2RzOntzaG93OmZ1bmN0aW9uIHNob3coKXt0aGlzLnNldEV4cGVjdGVkU3RhdGUodHJ1ZSk7dGhpcy5oYW5kbGVTaG93UG9wcGVyKCk7fSxoaWRlOmZ1bmN0aW9uIGhpZGUoKXt0aGlzLnNldEV4cGVjdGVkU3RhdGUoZmFsc2UpO3RoaXMuZGVib3VuY2VDbG9zZSgpO30saGFuZGxlRm9jdXM6ZnVuY3Rpb24gaGFuZGxlRm9jdXMoKXt0aGlzLmZvY3VzaW5nPXRydWU7dGhpcy5zaG93KCk7fSxoYW5kbGVCbHVyOmZ1bmN0aW9uIGhhbmRsZUJsdXIoKXt0aGlzLmZvY3VzaW5nPWZhbHNlO3RoaXMuaGlkZSgpO30scmVtb3ZlRm9jdXNpbmc6ZnVuY3Rpb24gcmVtb3ZlRm9jdXNpbmcoKXt0aGlzLmZvY3VzaW5nPWZhbHNlO30sYWRkVG9vbHRpcENsYXNzOmZ1bmN0aW9uIGFkZFRvb2x0aXBDbGFzcyhwcmV2KXtpZighcHJldil7cmV0dXJuJ2VsLXRvb2x0aXAnO31lbHNle3JldHVybidlbC10b29sdGlwICcrcHJldi5yZXBsYWNlKCdlbC10b29sdGlwJywnJyk7fX0saGFuZGxlU2hvd1BvcHBlcjpmdW5jdGlvbiBoYW5kbGVTaG93UG9wcGVyKCl7dmFyIF90aGlzND10aGlzO2lmKCF0aGlzLmV4cGVjdGVkU3RhdGV8fHRoaXMubWFudWFsKXJldHVybjtjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTt0aGlzLnRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe190aGlzNC5zaG93UG9wcGVyPXRydWU7fSx0aGlzLm9wZW5EZWxheSk7aWYodGhpcy5oaWRlQWZ0ZXI+MCl7dGhpcy50aW1lb3V0UGVuZGluZz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7X3RoaXM0LnNob3dQb3BwZXI9ZmFsc2U7fSx0aGlzLmhpZGVBZnRlcik7fX0saGFuZGxlQ2xvc2VQb3BwZXI6ZnVuY3Rpb24gaGFuZGxlQ2xvc2VQb3BwZXIoKXtpZih0aGlzLmVudGVyYWJsZSYmdGhpcy5leHBlY3RlZFN0YXRlfHx0aGlzLm1hbnVhbClyZXR1cm47Y2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7aWYodGhpcy50aW1lb3V0UGVuZGluZyl7Y2xlYXJUaW1lb3V0KHRoaXMudGltZW91dFBlbmRpbmcpO310aGlzLnNob3dQb3BwZXI9ZmFsc2U7aWYodGhpcy5kaXNhYmxlZCl7dGhpcy5kb0Rlc3Ryb3koKTt9fSxzZXRFeHBlY3RlZFN0YXRlOmZ1bmN0aW9uIHNldEV4cGVjdGVkU3RhdGUoZXhwZWN0ZWRTdGF0ZSl7aWYoZXhwZWN0ZWRTdGF0ZT09PWZhbHNlKXtjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0UGVuZGluZyk7fXRoaXMuZXhwZWN0ZWRTdGF0ZT1leHBlY3RlZFN0YXRlO30sZ2V0Rmlyc3RFbGVtZW50OmZ1bmN0aW9uIGdldEZpcnN0RWxlbWVudCgpe3ZhciBzbG90cz10aGlzLiRzbG90cy5kZWZhdWx0O2lmKCFBcnJheS5pc0FycmF5KHNsb3RzKSlyZXR1cm4gbnVsbDt2YXIgZWxlbWVudD1udWxsO2Zvcih2YXIgaW5kZXg9MDtpbmRleDxzbG90cy5sZW5ndGg7aW5kZXgrKyl7aWYoc2xvdHNbaW5kZXhdJiZzbG90c1tpbmRleF0udGFnKXtlbGVtZW50PXNsb3RzW2luZGV4XTt9O31yZXR1cm4gZWxlbWVudDt9fSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKXt0aGlzLnBvcHBlclZNJiZ0aGlzLnBvcHBlclZNLiRkZXN0cm95KCk7fSxkZXN0cm95ZWQ6ZnVuY3Rpb24gZGVzdHJveWVkKCl7dmFyIHJlZmVyZW5jZT10aGlzLnJlZmVyZW5jZUVsbTtpZihyZWZlcmVuY2Uubm9kZVR5cGU9PT0xKXtPYmplY3QoZG9tX1sib2ZmIl0pKHJlZmVyZW5jZSwnbW91c2VlbnRlcicsdGhpcy5zaG93KTtPYmplY3QoZG9tX1sib2ZmIl0pKHJlZmVyZW5jZSwnbW91c2VsZWF2ZScsdGhpcy5oaWRlKTtPYmplY3QoZG9tX1sib2ZmIl0pKHJlZmVyZW5jZSwnZm9jdXMnLHRoaXMuaGFuZGxlRm9jdXMpO09iamVjdChkb21fWyJvZmYiXSkocmVmZXJlbmNlLCdibHVyJyx0aGlzLmhhbmRsZUJsdXIpO09iamVjdChkb21fWyJvZmYiXSkocmVmZXJlbmNlLCdjbGljaycsdGhpcy5yZW1vdmVGb2N1c2luZyk7fX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdG9vbHRpcC9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL3NyY19tYWluLmluc3RhbGw9ZnVuY3Rpb24oVnVlKXtWdWUuY29tcG9uZW50KHNyY19tYWluLm5hbWUsc3JjX21haW4pO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYWNrYWdlc190b29sdGlwPXNyY19tYWluOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvbWVzc2FnZS1ib3gvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTZiMjliMDEyJgp2YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzZiMjliMDEyX3JlbmRlcj1mdW5jdGlvbiBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNmIyOWIwMTJfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJ0cmFuc2l0aW9uIix7YXR0cnM6e25hbWU6Im1zZ2JveC1mYWRlIn19LFtfYygiZGl2Iix7ZGlyZWN0aXZlczpbe25hbWU6InNob3ciLHJhd05hbWU6InYtc2hvdyIsdmFsdWU6X3ZtLnZpc2libGUsZXhwcmVzc2lvbjoidmlzaWJsZSJ9XSxzdGF0aWNDbGFzczoiZWwtbWVzc2FnZS1ib3hfX3dyYXBwZXIiLGF0dHJzOnt0YWJpbmRleDoiLTEiLHJvbGU6ImRpYWxvZyIsImFyaWEtbW9kYWwiOiJ0cnVlIiwiYXJpYS1sYWJlbCI6X3ZtLnRpdGxlfHwiZGlhbG9nIn0sb246e2NsaWNrOmZ1bmN0aW9uIGNsaWNrKCRldmVudCl7aWYoJGV2ZW50LnRhcmdldCE9PSRldmVudC5jdXJyZW50VGFyZ2V0KXtyZXR1cm4gbnVsbDt9cmV0dXJuIF92bS5oYW5kbGVXcmFwcGVyQ2xpY2soJGV2ZW50KTt9fX0sW19jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtbWVzc2FnZS1ib3giLGNsYXNzOltfdm0uY3VzdG9tQ2xhc3MsX3ZtLmNlbnRlciYmImVsLW1lc3NhZ2UtYm94LS1jZW50ZXIiXX0sW192bS50aXRsZSE9PW51bGw/X2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1tZXNzYWdlLWJveF9faGVhZGVyIn0sW19jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtbWVzc2FnZS1ib3hfX3RpdGxlIn0sW192bS5pY29uJiZfdm0uY2VudGVyP19jKCJkaXYiLHtjbGFzczpbImVsLW1lc3NhZ2UtYm94X19zdGF0dXMiLF92bS5pY29uXX0pOl92bS5fZSgpLF9jKCJzcGFuIixbX3ZtLl92KF92bS5fcyhfdm0udGl0bGUpKV0pXSksX3ZtLnNob3dDbG9zZT9fYygiYnV0dG9uIix7c3RhdGljQ2xhc3M6ImVsLW1lc3NhZ2UtYm94X19oZWFkZXJidG4iLGF0dHJzOnt0eXBlOiJidXR0b24iLCJhcmlhLWxhYmVsIjoiQ2xvc2UifSxvbjp7Y2xpY2s6ZnVuY3Rpb24gY2xpY2soJGV2ZW50KXtfdm0uaGFuZGxlQWN0aW9uKF92bS5kaXN0aW5ndWlzaENhbmNlbEFuZENsb3NlPyJjbG9zZSI6ImNhbmNlbCIpO30sa2V5ZG93bjpmdW5jdGlvbiBrZXlkb3duKCRldmVudCl7aWYoISgiYnV0dG9uImluICRldmVudCkmJl92bS5faygkZXZlbnQua2V5Q29kZSwiZW50ZXIiLDEzLCRldmVudC5rZXksIkVudGVyIikpe3JldHVybiBudWxsO31fdm0uaGFuZGxlQWN0aW9uKF92bS5kaXN0aW5ndWlzaENhbmNlbEFuZENsb3NlPyJjbG9zZSI6ImNhbmNlbCIpO319fSxbX2MoImkiLHtzdGF0aWNDbGFzczoiZWwtbWVzc2FnZS1ib3hfX2Nsb3NlIGVsLWljb24tY2xvc2UifSldKTpfdm0uX2UoKV0pOl92bS5fZSgpLF9jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtbWVzc2FnZS1ib3hfX2NvbnRlbnQifSxbX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1tZXNzYWdlLWJveF9fY29udGFpbmVyIn0sW192bS5pY29uJiYhX3ZtLmNlbnRlciYmX3ZtLm1lc3NhZ2UhPT0iIj9fYygiZGl2Iix7Y2xhc3M6WyJlbC1tZXNzYWdlLWJveF9fc3RhdHVzIixfdm0uaWNvbl19KTpfdm0uX2UoKSxfdm0ubWVzc2FnZSE9PSIiP19jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtbWVzc2FnZS1ib3hfX21lc3NhZ2UifSxbX3ZtLl90KCJkZWZhdWx0IixbIV92bS5kYW5nZXJvdXNseVVzZUhUTUxTdHJpbmc/X2MoInAiLFtfdm0uX3YoX3ZtLl9zKF92bS5tZXNzYWdlKSldKTpfYygicCIse2RvbVByb3BzOntpbm5lckhUTUw6X3ZtLl9zKF92bS5tZXNzYWdlKX19KV0pXSwyKTpfdm0uX2UoKV0pLF9jKCJkaXYiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTpfdm0uc2hvd0lucHV0LGV4cHJlc3Npb246InNob3dJbnB1dCJ9XSxzdGF0aWNDbGFzczoiZWwtbWVzc2FnZS1ib3hfX2lucHV0In0sW19jKCJlbC1pbnB1dCIse3JlZjoiaW5wdXQiLGF0dHJzOnt0eXBlOl92bS5pbnB1dFR5cGUscGxhY2Vob2xkZXI6X3ZtLmlucHV0UGxhY2Vob2xkZXJ9LG5hdGl2ZU9uOntrZXlkb3duOmZ1bmN0aW9uIGtleWRvd24oJGV2ZW50KXtpZighKCJidXR0b24iaW4gJGV2ZW50KSYmX3ZtLl9rKCRldmVudC5rZXlDb2RlLCJlbnRlciIsMTMsJGV2ZW50LmtleSwiRW50ZXIiKSl7cmV0dXJuIG51bGw7fXJldHVybiBfdm0uaGFuZGxlSW5wdXRFbnRlcigkZXZlbnQpO319LG1vZGVsOnt2YWx1ZTpfdm0uaW5wdXRWYWx1ZSxjYWxsYmFjazpmdW5jdGlvbiBjYWxsYmFjaygkJHYpe192bS5pbnB1dFZhbHVlPSQkdjt9LGV4cHJlc3Npb246ImlucHV0VmFsdWUifX0pLF9jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtbWVzc2FnZS1ib3hfX2Vycm9ybXNnIixzdHlsZTp7dmlzaWJpbGl0eTohIV92bS5lZGl0b3JFcnJvck1lc3NhZ2U/InZpc2libGUiOiJoaWRkZW4ifX0sW192bS5fdihfdm0uX3MoX3ZtLmVkaXRvckVycm9yTWVzc2FnZSkpXSldLDEpXSksX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1tZXNzYWdlLWJveF9fYnRucyJ9LFtfdm0uc2hvd0NhbmNlbEJ1dHRvbj9fYygiZWwtYnV0dG9uIix7Y2xhc3M6W192bS5jYW5jZWxCdXR0b25DbGFzc2VzXSxhdHRyczp7bG9hZGluZzpfdm0uY2FuY2VsQnV0dG9uTG9hZGluZyxyb3VuZDpfdm0ucm91bmRCdXR0b24sc2l6ZToic21hbGwifSxvbjp7a2V5ZG93bjpmdW5jdGlvbiBrZXlkb3duKCRldmVudCl7aWYoISgiYnV0dG9uImluICRldmVudCkmJl92bS5faygkZXZlbnQua2V5Q29kZSwiZW50ZXIiLDEzLCRldmVudC5rZXksIkVudGVyIikpe3JldHVybiBudWxsO31fdm0uaGFuZGxlQWN0aW9uKCJjYW5jZWwiKTt9fSxuYXRpdmVPbjp7Y2xpY2s6ZnVuY3Rpb24gY2xpY2soJGV2ZW50KXtfdm0uaGFuZGxlQWN0aW9uKCJjYW5jZWwiKTt9fX0sW192bS5fdigiXG4gICAgICAgICAgIitfdm0uX3MoX3ZtLmNhbmNlbEJ1dHRvblRleHR8fF92bS50KCJlbC5tZXNzYWdlYm94LmNhbmNlbCIpKSsiXG4gICAgICAgICIpXSk6X3ZtLl9lKCksX2MoImVsLWJ1dHRvbiIse2RpcmVjdGl2ZXM6W3tuYW1lOiJzaG93IixyYXdOYW1lOiJ2LXNob3ciLHZhbHVlOl92bS5zaG93Q29uZmlybUJ1dHRvbixleHByZXNzaW9uOiJzaG93Q29uZmlybUJ1dHRvbiJ9XSxyZWY6ImNvbmZpcm0iLGNsYXNzOltfdm0uY29uZmlybUJ1dHRvbkNsYXNzZXNdLGF0dHJzOntsb2FkaW5nOl92bS5jb25maXJtQnV0dG9uTG9hZGluZyxyb3VuZDpfdm0ucm91bmRCdXR0b24sc2l6ZToic21hbGwifSxvbjp7a2V5ZG93bjpmdW5jdGlvbiBrZXlkb3duKCRldmVudCl7aWYoISgiYnV0dG9uImluICRldmVudCkmJl92bS5faygkZXZlbnQua2V5Q29kZSwiZW50ZXIiLDEzLCRldmVudC5rZXksIkVudGVyIikpe3JldHVybiBudWxsO31fdm0uaGFuZGxlQWN0aW9uKCJjb25maXJtIik7fX0sbmF0aXZlT246e2NsaWNrOmZ1bmN0aW9uIGNsaWNrKCRldmVudCl7X3ZtLmhhbmRsZUFjdGlvbigiY29uZmlybSIpO319fSxbX3ZtLl92KCJcbiAgICAgICAgICAiK192bS5fcyhfdm0uY29uZmlybUJ1dHRvblRleHR8fF92bS50KCJlbC5tZXNzYWdlYm94LmNvbmZpcm0iKSkrIlxuICAgICAgICAiKV0pXSwxKV0pXSldKTt9O3ZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNmIyOWIwMTJfc3RhdGljUmVuZGVyRm5zPVtdO21haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF82YjI5YjAxMl9yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvbWVzc2FnZS1ib3gvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTZiMjliMDEyJgovLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsICJlbGVtZW50LXVpL2xpYi91dGlscy9hcmlhLWRpYWxvZyIKdmFyIGFyaWFfZGlhbG9nXz1fX3dlYnBhY2tfcmVxdWlyZV9fKDM5KTt2YXIgYXJpYV9kaWFsb2dfZGVmYXVsdD0vKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGFyaWFfZGlhbG9nXyk7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvbWVzc2FnZS1ib3gvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwp2YXIgbWVzc2FnZUJveD12b2lkIDA7dmFyIHR5cGVNYXA9e3N1Y2Nlc3M6J3N1Y2Nlc3MnLGluZm86J2luZm8nLHdhcm5pbmc6J3dhcm5pbmcnLGVycm9yOidlcnJvcid9Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgbWVzc2FnZV9ib3hfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e21peGluczpbcG9wdXBfZGVmYXVsdC5hLGxvY2FsZV9kZWZhdWx0LmFdLHByb3BzOnttb2RhbDp7ZGVmYXVsdDp0cnVlfSxsb2NrU2Nyb2xsOntkZWZhdWx0OnRydWV9LHNob3dDbG9zZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6dHJ1ZX0sY2xvc2VPbkNsaWNrTW9kYWw6e2RlZmF1bHQ6dHJ1ZX0sY2xvc2VPblByZXNzRXNjYXBlOntkZWZhdWx0OnRydWV9LGNsb3NlT25IYXNoQ2hhbmdlOntkZWZhdWx0OnRydWV9LGNlbnRlcjp7ZGVmYXVsdDpmYWxzZSx0eXBlOkJvb2xlYW59LHJvdW5kQnV0dG9uOntkZWZhdWx0OmZhbHNlLHR5cGU6Qm9vbGVhbn19LGNvbXBvbmVudHM6e0VsSW5wdXQ6aW5wdXRfZGVmYXVsdC5hLEVsQnV0dG9uOmJ1dHRvbl9kZWZhdWx0LmF9LGNvbXB1dGVkOntpY29uOmZ1bmN0aW9uIGljb24oKXt2YXIgdHlwZT10aGlzLnR5cGUsaWNvbkNsYXNzPXRoaXMuaWNvbkNsYXNzO3JldHVybiBpY29uQ2xhc3N8fCh0eXBlJiZ0eXBlTWFwW3R5cGVdPydlbC1pY29uLScrdHlwZU1hcFt0eXBlXTonJyk7fSxjb25maXJtQnV0dG9uQ2xhc3NlczpmdW5jdGlvbiBjb25maXJtQnV0dG9uQ2xhc3Nlcygpe3JldHVybidlbC1idXR0b24tLXByaW1hcnkgJyt0aGlzLmNvbmZpcm1CdXR0b25DbGFzczt9LGNhbmNlbEJ1dHRvbkNsYXNzZXM6ZnVuY3Rpb24gY2FuY2VsQnV0dG9uQ2xhc3Nlcygpe3JldHVybicnK3RoaXMuY2FuY2VsQnV0dG9uQ2xhc3M7fX0sbWV0aG9kczp7Z2V0U2FmZUNsb3NlOmZ1bmN0aW9uIGdldFNhZmVDbG9zZSgpe3ZhciBfdGhpcz10aGlzO3ZhciBjdXJyZW50SWQ9dGhpcy51aWQ7cmV0dXJuIGZ1bmN0aW9uKCl7X3RoaXMuJG5leHRUaWNrKGZ1bmN0aW9uKCl7aWYoY3VycmVudElkPT09X3RoaXMudWlkKV90aGlzLmRvQ2xvc2UoKTt9KTt9O30sZG9DbG9zZTpmdW5jdGlvbiBkb0Nsb3NlKCl7dmFyIF90aGlzMj10aGlzO2lmKCF0aGlzLnZpc2libGUpcmV0dXJuO3RoaXMudmlzaWJsZT1mYWxzZTt0aGlzLl9jbG9zaW5nPXRydWU7dGhpcy5vbkNsb3NlJiZ0aGlzLm9uQ2xvc2UoKTttZXNzYWdlQm94LmNsb3NlRGlhbG9nKCk7Ly8g6Kej57uRCmlmKHRoaXMubG9ja1Njcm9sbCl7c2V0VGltZW91dCh0aGlzLnJlc3RvcmVCb2R5U3R5bGUsMjAwKTt9dGhpcy5vcGVuZWQ9ZmFsc2U7dGhpcy5kb0FmdGVyQ2xvc2UoKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYoX3RoaXMyLmFjdGlvbilfdGhpczIuY2FsbGJhY2soX3RoaXMyLmFjdGlvbixfdGhpczIpO30pO30saGFuZGxlV3JhcHBlckNsaWNrOmZ1bmN0aW9uIGhhbmRsZVdyYXBwZXJDbGljaygpe2lmKHRoaXMuY2xvc2VPbkNsaWNrTW9kYWwpe3RoaXMuaGFuZGxlQWN0aW9uKHRoaXMuZGlzdGluZ3Vpc2hDYW5jZWxBbmRDbG9zZT8nY2xvc2UnOidjYW5jZWwnKTt9fSxoYW5kbGVJbnB1dEVudGVyOmZ1bmN0aW9uIGhhbmRsZUlucHV0RW50ZXIoKXtpZih0aGlzLmlucHV0VHlwZSE9PSd0ZXh0YXJlYScpe3JldHVybiB0aGlzLmhhbmRsZUFjdGlvbignY29uZmlybScpO319LGhhbmRsZUFjdGlvbjpmdW5jdGlvbiBoYW5kbGVBY3Rpb24oYWN0aW9uKXtpZih0aGlzLiR0eXBlPT09J3Byb21wdCcmJmFjdGlvbj09PSdjb25maXJtJyYmIXRoaXMudmFsaWRhdGUoKSl7cmV0dXJuO310aGlzLmFjdGlvbj1hY3Rpb247aWYodHlwZW9mIHRoaXMuYmVmb3JlQ2xvc2U9PT0nZnVuY3Rpb24nKXt0aGlzLmNsb3NlPXRoaXMuZ2V0U2FmZUNsb3NlKCk7dGhpcy5iZWZvcmVDbG9zZShhY3Rpb24sdGhpcyx0aGlzLmNsb3NlKTt9ZWxzZXt0aGlzLmRvQ2xvc2UoKTt9fSx2YWxpZGF0ZTpmdW5jdGlvbiB2YWxpZGF0ZSgpe2lmKHRoaXMuJHR5cGU9PT0ncHJvbXB0Jyl7dmFyIGlucHV0UGF0dGVybj10aGlzLmlucHV0UGF0dGVybjtpZihpbnB1dFBhdHRlcm4mJiFpbnB1dFBhdHRlcm4udGVzdCh0aGlzLmlucHV0VmFsdWV8fCcnKSl7dGhpcy5lZGl0b3JFcnJvck1lc3NhZ2U9dGhpcy5pbnB1dEVycm9yTWVzc2FnZXx8T2JqZWN0KGxpYl9sb2NhbGVfWyJ0Il0pKCdlbC5tZXNzYWdlYm94LmVycm9yJyk7T2JqZWN0KGRvbV9bImFkZENsYXNzIl0pKHRoaXMuZ2V0SW5wdXRFbGVtZW50KCksJ2ludmFsaWQnKTtyZXR1cm4gZmFsc2U7fXZhciBpbnB1dFZhbGlkYXRvcj10aGlzLmlucHV0VmFsaWRhdG9yO2lmKHR5cGVvZiBpbnB1dFZhbGlkYXRvcj09PSdmdW5jdGlvbicpe3ZhciB2YWxpZGF0ZVJlc3VsdD1pbnB1dFZhbGlkYXRvcih0aGlzLmlucHV0VmFsdWUpO2lmKHZhbGlkYXRlUmVzdWx0PT09ZmFsc2Upe3RoaXMuZWRpdG9yRXJyb3JNZXNzYWdlPXRoaXMuaW5wdXRFcnJvck1lc3NhZ2V8fE9iamVjdChsaWJfbG9jYWxlX1sidCJdKSgnZWwubWVzc2FnZWJveC5lcnJvcicpO09iamVjdChkb21fWyJhZGRDbGFzcyJdKSh0aGlzLmdldElucHV0RWxlbWVudCgpLCdpbnZhbGlkJyk7cmV0dXJuIGZhbHNlO31pZih0eXBlb2YgdmFsaWRhdGVSZXN1bHQ9PT0nc3RyaW5nJyl7dGhpcy5lZGl0b3JFcnJvck1lc3NhZ2U9dmFsaWRhdGVSZXN1bHQ7T2JqZWN0KGRvbV9bImFkZENsYXNzIl0pKHRoaXMuZ2V0SW5wdXRFbGVtZW50KCksJ2ludmFsaWQnKTtyZXR1cm4gZmFsc2U7fX19dGhpcy5lZGl0b3JFcnJvck1lc3NhZ2U9Jyc7T2JqZWN0KGRvbV9bInJlbW92ZUNsYXNzIl0pKHRoaXMuZ2V0SW5wdXRFbGVtZW50KCksJ2ludmFsaWQnKTtyZXR1cm4gdHJ1ZTt9LGdldEZpcnN0Rm9jdXM6ZnVuY3Rpb24gZ2V0Rmlyc3RGb2N1cygpe3ZhciBidG49dGhpcy4kZWwucXVlcnlTZWxlY3RvcignLmVsLW1lc3NhZ2UtYm94X19idG5zIC5lbC1idXR0b24nKTt2YXIgdGl0bGU9dGhpcy4kZWwucXVlcnlTZWxlY3RvcignLmVsLW1lc3NhZ2UtYm94X19idG5zIC5lbC1tZXNzYWdlLWJveF9fdGl0bGUnKTtyZXR1cm4gYnRufHx0aXRsZTt9LGdldElucHV0RWxlbWVudDpmdW5jdGlvbiBnZXRJbnB1dEVsZW1lbnQoKXt2YXIgaW5wdXRSZWZzPXRoaXMuJHJlZnMuaW5wdXQuJHJlZnM7cmV0dXJuIGlucHV0UmVmcy5pbnB1dHx8aW5wdXRSZWZzLnRleHRhcmVhO30saGFuZGxlQ2xvc2U6ZnVuY3Rpb24gaGFuZGxlQ2xvc2UoKXt0aGlzLmhhbmRsZUFjdGlvbignY2xvc2UnKTt9fSx3YXRjaDp7aW5wdXRWYWx1ZTp7aW1tZWRpYXRlOnRydWUsaGFuZGxlcjpmdW5jdGlvbiBoYW5kbGVyKHZhbCl7dmFyIF90aGlzMz10aGlzO3RoaXMuJG5leHRUaWNrKGZ1bmN0aW9uKF8pe2lmKF90aGlzMy4kdHlwZT09PSdwcm9tcHQnJiZ2YWwhPT1udWxsKXtfdGhpczMudmFsaWRhdGUoKTt9fSk7fX0sdmlzaWJsZTpmdW5jdGlvbiB2aXNpYmxlKHZhbCl7dmFyIF90aGlzND10aGlzO2lmKHZhbCl7dGhpcy51aWQrKztpZih0aGlzLiR0eXBlPT09J2FsZXJ0J3x8dGhpcy4kdHlwZT09PSdjb25maXJtJyl7dGhpcy4kbmV4dFRpY2soZnVuY3Rpb24oKXtfdGhpczQuJHJlZnMuY29uZmlybS4kZWwuZm9jdXMoKTt9KTt9dGhpcy5mb2N1c0FmdGVyQ2xvc2VkPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7bWVzc2FnZUJveD1uZXcgYXJpYV9kaWFsb2dfZGVmYXVsdC5hKHRoaXMuJGVsLHRoaXMuZm9jdXNBZnRlckNsb3NlZCx0aGlzLmdldEZpcnN0Rm9jdXMoKSk7fS8vIHByb21wdAppZih0aGlzLiR0eXBlIT09J3Byb21wdCcpcmV0dXJuO2lmKHZhbCl7c2V0VGltZW91dChmdW5jdGlvbigpe2lmKF90aGlzNC4kcmVmcy5pbnB1dCYmX3RoaXM0LiRyZWZzLmlucHV0LiRlbCl7X3RoaXM0LmdldElucHV0RWxlbWVudCgpLmZvY3VzKCk7fX0sNTAwKTt9ZWxzZXt0aGlzLmVkaXRvckVycm9yTWVzc2FnZT0nJztPYmplY3QoZG9tX1sicmVtb3ZlQ2xhc3MiXSkodGhpcy5nZXRJbnB1dEVsZW1lbnQoKSwnaW52YWxpZCcpO319fSxtb3VudGVkOmZ1bmN0aW9uIG1vdW50ZWQoKXt2YXIgX3RoaXM1PXRoaXM7dGhpcy4kbmV4dFRpY2soZnVuY3Rpb24oKXtpZihfdGhpczUuY2xvc2VPbkhhc2hDaGFuZ2Upe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdoYXNoY2hhbmdlJyxfdGhpczUuY2xvc2UpO319KTt9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpe2lmKHRoaXMuY2xvc2VPbkhhc2hDaGFuZ2Upe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdoYXNoY2hhbmdlJyx0aGlzLmNsb3NlKTt9c2V0VGltZW91dChmdW5jdGlvbigpe21lc3NhZ2VCb3guY2xvc2VEaWFsb2coKTt9KTt9LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybnt1aWQ6MSx0aXRsZTp1bmRlZmluZWQsbWVzc2FnZTonJyx0eXBlOicnLGljb25DbGFzczonJyxjdXN0b21DbGFzczonJyxzaG93SW5wdXQ6ZmFsc2UsaW5wdXRWYWx1ZTpudWxsLGlucHV0UGxhY2Vob2xkZXI6JycsaW5wdXRUeXBlOid0ZXh0JyxpbnB1dFBhdHRlcm46bnVsbCxpbnB1dFZhbGlkYXRvcjpudWxsLGlucHV0RXJyb3JNZXNzYWdlOicnLHNob3dDb25maXJtQnV0dG9uOnRydWUsc2hvd0NhbmNlbEJ1dHRvbjpmYWxzZSxhY3Rpb246JycsY29uZmlybUJ1dHRvblRleHQ6JycsY2FuY2VsQnV0dG9uVGV4dDonJyxjb25maXJtQnV0dG9uTG9hZGluZzpmYWxzZSxjYW5jZWxCdXR0b25Mb2FkaW5nOmZhbHNlLGNvbmZpcm1CdXR0b25DbGFzczonJyxjb25maXJtQnV0dG9uRGlzYWJsZWQ6ZmFsc2UsY2FuY2VsQnV0dG9uQ2xhc3M6JycsZWRpdG9yRXJyb3JNZXNzYWdlOm51bGwsY2FsbGJhY2s6bnVsbCxkYW5nZXJvdXNseVVzZUhUTUxTdHJpbmc6ZmFsc2UsZm9jdXNBZnRlckNsb3NlZDpudWxsLGlzT25Db21wb3NpdGlvbjpmYWxzZSxkaXN0aW5ndWlzaENhbmNlbEFuZENsb3NlOmZhbHNlfTt9fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL21lc3NhZ2UtYm94L3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYWNrYWdlc19tZXNzYWdlX2JveF9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz1tZXNzYWdlX2JveF9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL21lc3NhZ2UtYm94L3NyYy9tYWluLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIHNyY19tYWluX2NvbXBvbmVudD1ub3JtYWxpemVDb21wb25lbnQocGFja2FnZXNfbWVzc2FnZV9ib3hfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzZiMjliMDEyX3JlbmRlcixtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNmIyOWIwMTJfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciBzcmNfbWFpbl9hcGk7fXNyY19tYWluX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvbWVzc2FnZS1ib3gvc3JjL21haW4udnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIG1lc3NhZ2VfYm94X3NyY19tYWluPXNyY19tYWluX2NvbXBvbmVudC5leHBvcnRzOy8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgImVsZW1lbnQtdWkvbGliL3V0aWxzL3Zkb20iCnZhciB2ZG9tXz1fX3dlYnBhY2tfcmVxdWlyZV9fKDIzKTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL21lc3NhZ2UtYm94L3NyYy9tYWluLmpzCnZhciBtYWluX3R5cGVvZj10eXBlb2YgU3ltYm9sPT09ImZ1bmN0aW9uIiYmX3R5cGVvZjIoU3ltYm9sLml0ZXJhdG9yKT09PSJzeW1ib2wiP2Z1bmN0aW9uKG9iail7cmV0dXJuIF90eXBlb2YyKG9iaik7fTpmdW5jdGlvbihvYmope3JldHVybiBvYmomJnR5cGVvZiBTeW1ib2w9PT0iZnVuY3Rpb24iJiZvYmouY29uc3RydWN0b3I9PT1TeW1ib2wmJm9iaiE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6X3R5cGVvZjIob2JqKTt9O3ZhciBtYWluX2RlZmF1bHRzPXt0aXRsZTpudWxsLG1lc3NhZ2U6JycsdHlwZTonJyxpY29uQ2xhc3M6Jycsc2hvd0lucHV0OmZhbHNlLHNob3dDbG9zZTp0cnVlLG1vZGFsRmFkZTp0cnVlLGxvY2tTY3JvbGw6dHJ1ZSxjbG9zZU9uQ2xpY2tNb2RhbDp0cnVlLGNsb3NlT25QcmVzc0VzY2FwZTp0cnVlLGNsb3NlT25IYXNoQ2hhbmdlOnRydWUsaW5wdXRWYWx1ZTpudWxsLGlucHV0UGxhY2Vob2xkZXI6JycsaW5wdXRUeXBlOid0ZXh0JyxpbnB1dFBhdHRlcm46bnVsbCxpbnB1dFZhbGlkYXRvcjpudWxsLGlucHV0RXJyb3JNZXNzYWdlOicnLHNob3dDb25maXJtQnV0dG9uOnRydWUsc2hvd0NhbmNlbEJ1dHRvbjpmYWxzZSxjb25maXJtQnV0dG9uUG9zaXRpb246J3JpZ2h0Jyxjb25maXJtQnV0dG9uSGlnaGxpZ2h0OmZhbHNlLGNhbmNlbEJ1dHRvbkhpZ2hsaWdodDpmYWxzZSxjb25maXJtQnV0dG9uVGV4dDonJyxjYW5jZWxCdXR0b25UZXh0OicnLGNvbmZpcm1CdXR0b25DbGFzczonJyxjYW5jZWxCdXR0b25DbGFzczonJyxjdXN0b21DbGFzczonJyxiZWZvcmVDbG9zZTpudWxsLGRhbmdlcm91c2x5VXNlSFRNTFN0cmluZzpmYWxzZSxjZW50ZXI6ZmFsc2Uscm91bmRCdXR0b246ZmFsc2UsZGlzdGluZ3Vpc2hDYW5jZWxBbmRDbG9zZTpmYWxzZX07dmFyIE1lc3NhZ2VCb3hDb25zdHJ1Y3Rvcj1leHRlcm5hbF92dWVfZGVmYXVsdC5hLmV4dGVuZChtZXNzYWdlX2JveF9zcmNfbWFpbik7dmFyIGN1cnJlbnRNc2c9dm9pZCAwLG1haW5faW5zdGFuY2U9dm9pZCAwO3ZhciBtc2dRdWV1ZT1bXTt2YXIgZGVmYXVsdENhbGxiYWNrPWZ1bmN0aW9uIGRlZmF1bHRDYWxsYmFjayhhY3Rpb24pe2lmKGN1cnJlbnRNc2cpe3ZhciBjYWxsYmFjaz1jdXJyZW50TXNnLmNhbGxiYWNrO2lmKHR5cGVvZiBjYWxsYmFjaz09PSdmdW5jdGlvbicpe2lmKG1haW5faW5zdGFuY2Uuc2hvd0lucHV0KXtjYWxsYmFjayhtYWluX2luc3RhbmNlLmlucHV0VmFsdWUsYWN0aW9uKTt9ZWxzZXtjYWxsYmFjayhhY3Rpb24pO319aWYoY3VycmVudE1zZy5yZXNvbHZlKXtpZihhY3Rpb249PT0nY29uZmlybScpe2lmKG1haW5faW5zdGFuY2Uuc2hvd0lucHV0KXtjdXJyZW50TXNnLnJlc29sdmUoe3ZhbHVlOm1haW5faW5zdGFuY2UuaW5wdXRWYWx1ZSxhY3Rpb246YWN0aW9ufSk7fWVsc2V7Y3VycmVudE1zZy5yZXNvbHZlKGFjdGlvbik7fX1lbHNlIGlmKGN1cnJlbnRNc2cucmVqZWN0JiYoYWN0aW9uPT09J2NhbmNlbCd8fGFjdGlvbj09PSdjbG9zZScpKXtjdXJyZW50TXNnLnJlamVjdChhY3Rpb24pO319fX07dmFyIGluaXRJbnN0YW5jZT1mdW5jdGlvbiBpbml0SW5zdGFuY2UoKXttYWluX2luc3RhbmNlPW5ldyBNZXNzYWdlQm94Q29uc3RydWN0b3Ioe2VsOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpfSk7bWFpbl9pbnN0YW5jZS5jYWxsYmFjaz1kZWZhdWx0Q2FsbGJhY2s7fTt2YXIgbWFpbl9zaG93TmV4dE1zZz1mdW5jdGlvbiBzaG93TmV4dE1zZygpe2lmKCFtYWluX2luc3RhbmNlKXtpbml0SW5zdGFuY2UoKTt9bWFpbl9pbnN0YW5jZS5hY3Rpb249Jyc7aWYoIW1haW5faW5zdGFuY2UudmlzaWJsZXx8bWFpbl9pbnN0YW5jZS5jbG9zZVRpbWVyKXtpZihtc2dRdWV1ZS5sZW5ndGg+MCl7Y3VycmVudE1zZz1tc2dRdWV1ZS5zaGlmdCgpO3ZhciBvcHRpb25zPWN1cnJlbnRNc2cub3B0aW9ucztmb3IodmFyIHByb3AgaW4gb3B0aW9ucyl7aWYob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShwcm9wKSl7bWFpbl9pbnN0YW5jZVtwcm9wXT1vcHRpb25zW3Byb3BdO319aWYob3B0aW9ucy5jYWxsYmFjaz09PXVuZGVmaW5lZCl7bWFpbl9pbnN0YW5jZS5jYWxsYmFjaz1kZWZhdWx0Q2FsbGJhY2s7fXZhciBvbGRDYj1tYWluX2luc3RhbmNlLmNhbGxiYWNrO21haW5faW5zdGFuY2UuY2FsbGJhY2s9ZnVuY3Rpb24oYWN0aW9uLGluc3RhbmNlKXtvbGRDYihhY3Rpb24saW5zdGFuY2UpO3Nob3dOZXh0TXNnKCk7fTtpZihPYmplY3QodmRvbV9bImlzVk5vZGUiXSkobWFpbl9pbnN0YW5jZS5tZXNzYWdlKSl7bWFpbl9pbnN0YW5jZS4kc2xvdHMuZGVmYXVsdD1bbWFpbl9pbnN0YW5jZS5tZXNzYWdlXTttYWluX2luc3RhbmNlLm1lc3NhZ2U9bnVsbDt9ZWxzZXtkZWxldGUgbWFpbl9pbnN0YW5jZS4kc2xvdHMuZGVmYXVsdDt9Wydtb2RhbCcsJ3Nob3dDbG9zZScsJ2Nsb3NlT25DbGlja01vZGFsJywnY2xvc2VPblByZXNzRXNjYXBlJywnY2xvc2VPbkhhc2hDaGFuZ2UnXS5mb3JFYWNoKGZ1bmN0aW9uKHByb3Ape2lmKG1haW5faW5zdGFuY2VbcHJvcF09PT11bmRlZmluZWQpe21haW5faW5zdGFuY2VbcHJvcF09dHJ1ZTt9fSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtYWluX2luc3RhbmNlLiRlbCk7ZXh0ZXJuYWxfdnVlX2RlZmF1bHQuYS5uZXh0VGljayhmdW5jdGlvbigpe21haW5faW5zdGFuY2UudmlzaWJsZT10cnVlO30pO319fTt2YXIgbWFpbl9NZXNzYWdlQm94PWZ1bmN0aW9uIE1lc3NhZ2VCb3gob3B0aW9ucyxjYWxsYmFjayl7aWYoZXh0ZXJuYWxfdnVlX2RlZmF1bHQuYS5wcm90b3R5cGUuJGlzU2VydmVyKXJldHVybjtpZih0eXBlb2Ygb3B0aW9ucz09PSdzdHJpbmcnfHxPYmplY3QodmRvbV9bImlzVk5vZGUiXSkob3B0aW9ucykpe29wdGlvbnM9e21lc3NhZ2U6b3B0aW9uc307aWYodHlwZW9mIGFyZ3VtZW50c1sxXT09PSdzdHJpbmcnKXtvcHRpb25zLnRpdGxlPWFyZ3VtZW50c1sxXTt9fWVsc2UgaWYob3B0aW9ucy5jYWxsYmFjayYmIWNhbGxiYWNrKXtjYWxsYmFjaz1vcHRpb25zLmNhbGxiYWNrO31pZih0eXBlb2YgUHJvbWlzZSE9PSd1bmRlZmluZWQnKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSxyZWplY3Qpey8vIGVzbGludC1kaXNhYmxlLWxpbmUKbXNnUXVldWUucHVzaCh7b3B0aW9uczptZXJnZV9kZWZhdWx0KCkoe30sbWFpbl9kZWZhdWx0cyxNZXNzYWdlQm94LmRlZmF1bHRzLG9wdGlvbnMpLGNhbGxiYWNrOmNhbGxiYWNrLHJlc29sdmU6cmVzb2x2ZSxyZWplY3Q6cmVqZWN0fSk7bWFpbl9zaG93TmV4dE1zZygpO30pO31lbHNle21zZ1F1ZXVlLnB1c2goe29wdGlvbnM6bWVyZ2VfZGVmYXVsdCgpKHt9LG1haW5fZGVmYXVsdHMsTWVzc2FnZUJveC5kZWZhdWx0cyxvcHRpb25zKSxjYWxsYmFjazpjYWxsYmFja30pO21haW5fc2hvd05leHRNc2coKTt9fTttYWluX01lc3NhZ2VCb3guc2V0RGVmYXVsdHM9ZnVuY3Rpb24oZGVmYXVsdHMpe21haW5fTWVzc2FnZUJveC5kZWZhdWx0cz1kZWZhdWx0czt9O21haW5fTWVzc2FnZUJveC5hbGVydD1mdW5jdGlvbihtZXNzYWdlLHRpdGxlLG9wdGlvbnMpe2lmKCh0eXBlb2YgdGl0bGU9PT0ndW5kZWZpbmVkJz8ndW5kZWZpbmVkJzptYWluX3R5cGVvZih0aXRsZSkpPT09J29iamVjdCcpe29wdGlvbnM9dGl0bGU7dGl0bGU9Jyc7fWVsc2UgaWYodGl0bGU9PT11bmRlZmluZWQpe3RpdGxlPScnO31yZXR1cm4gbWFpbl9NZXNzYWdlQm94KG1lcmdlX2RlZmF1bHQoKSh7dGl0bGU6dGl0bGUsbWVzc2FnZTptZXNzYWdlLCR0eXBlOidhbGVydCcsY2xvc2VPblByZXNzRXNjYXBlOmZhbHNlLGNsb3NlT25DbGlja01vZGFsOmZhbHNlfSxvcHRpb25zKSk7fTttYWluX01lc3NhZ2VCb3guY29uZmlybT1mdW5jdGlvbihtZXNzYWdlLHRpdGxlLG9wdGlvbnMpe2lmKCh0eXBlb2YgdGl0bGU9PT0ndW5kZWZpbmVkJz8ndW5kZWZpbmVkJzptYWluX3R5cGVvZih0aXRsZSkpPT09J29iamVjdCcpe29wdGlvbnM9dGl0bGU7dGl0bGU9Jyc7fWVsc2UgaWYodGl0bGU9PT11bmRlZmluZWQpe3RpdGxlPScnO31yZXR1cm4gbWFpbl9NZXNzYWdlQm94KG1lcmdlX2RlZmF1bHQoKSh7dGl0bGU6dGl0bGUsbWVzc2FnZTptZXNzYWdlLCR0eXBlOidjb25maXJtJyxzaG93Q2FuY2VsQnV0dG9uOnRydWV9LG9wdGlvbnMpKTt9O21haW5fTWVzc2FnZUJveC5wcm9tcHQ9ZnVuY3Rpb24obWVzc2FnZSx0aXRsZSxvcHRpb25zKXtpZigodHlwZW9mIHRpdGxlPT09J3VuZGVmaW5lZCc/J3VuZGVmaW5lZCc6bWFpbl90eXBlb2YodGl0bGUpKT09PSdvYmplY3QnKXtvcHRpb25zPXRpdGxlO3RpdGxlPScnO31lbHNlIGlmKHRpdGxlPT09dW5kZWZpbmVkKXt0aXRsZT0nJzt9cmV0dXJuIG1haW5fTWVzc2FnZUJveChtZXJnZV9kZWZhdWx0KCkoe3RpdGxlOnRpdGxlLG1lc3NhZ2U6bWVzc2FnZSxzaG93Q2FuY2VsQnV0dG9uOnRydWUsc2hvd0lucHV0OnRydWUsJHR5cGU6J3Byb21wdCd9LG9wdGlvbnMpKTt9O21haW5fTWVzc2FnZUJveC5jbG9zZT1mdW5jdGlvbigpe21haW5faW5zdGFuY2UuZG9DbG9zZSgpO21haW5faW5zdGFuY2UudmlzaWJsZT1mYWxzZTttc2dRdWV1ZT1bXTtjdXJyZW50TXNnPW51bGw7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX21lc3NhZ2VfYm94X3NyY19tYWluPW1haW5fTWVzc2FnZUJveDsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL21lc3NhZ2UtYm94L2luZGV4LmpzCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgbWVzc2FnZV9ib3g9cGFja2FnZXNfbWVzc2FnZV9ib3hfc3JjX21haW47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9icmVhZGNydW1iL3NyYy9icmVhZGNydW1iLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD00YjQ2NGMwNiYKdmFyIGJyZWFkY3J1bWJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF80YjQ2NGMwNl9yZW5kZXI9ZnVuY3Rpb24gYnJlYWRjcnVtYnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzRiNDY0YzA2X3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLWJyZWFkY3J1bWIiLGF0dHJzOnsiYXJpYS1sYWJlbCI6IkJyZWFkY3J1bWIiLHJvbGU6Im5hdmlnYXRpb24ifX0sW192bS5fdCgiZGVmYXVsdCIpXSwyKTt9O3ZhciBicmVhZGNydW1idnVlX3R5cGVfdGVtcGxhdGVfaWRfNGI0NjRjMDZfc3RhdGljUmVuZGVyRm5zPVtdO2JyZWFkY3J1bWJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF80YjQ2NGMwNl9yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYnJlYWRjcnVtYi9zcmMvYnJlYWRjcnVtYi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NGI0NjRjMDYmCi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2JyZWFkY3J1bWIvc3JjL2JyZWFkY3J1bWIudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovLwovLwovLwovLwovLwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGJyZWFkY3J1bWJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e25hbWU6J0VsQnJlYWRjcnVtYicscHJvcHM6e3NlcGFyYXRvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDonLyd9LHNlcGFyYXRvckNsYXNzOnt0eXBlOlN0cmluZyxkZWZhdWx0OicnfX0scHJvdmlkZTpmdW5jdGlvbiBwcm92aWRlKCl7cmV0dXJue2VsQnJlYWRjcnVtYjp0aGlzfTt9LG1vdW50ZWQ6ZnVuY3Rpb24gbW91bnRlZCgpe3ZhciBpdGVtcz10aGlzLiRlbC5xdWVyeVNlbGVjdG9yQWxsKCcuZWwtYnJlYWRjcnVtYl9faXRlbScpO2lmKGl0ZW1zLmxlbmd0aCl7aXRlbXNbaXRlbXMubGVuZ3RoLTFdLnNldEF0dHJpYnV0ZSgnYXJpYS1jdXJyZW50JywncGFnZScpO319fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2JyZWFkY3J1bWIvc3JjL2JyZWFkY3J1bWIudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHNyY19icmVhZGNydW1idnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPWJyZWFkY3J1bWJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9icmVhZGNydW1iL3NyYy9icmVhZGNydW1iLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIGJyZWFkY3J1bWJfY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChzcmNfYnJlYWRjcnVtYnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxicmVhZGNydW1idnVlX3R5cGVfdGVtcGxhdGVfaWRfNGI0NjRjMDZfcmVuZGVyLGJyZWFkY3J1bWJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF80YjQ2NGMwNl9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIGJyZWFkY3J1bWJfYXBpO31icmVhZGNydW1iX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvYnJlYWRjcnVtYi9zcmMvYnJlYWRjcnVtYi52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgYnJlYWRjcnVtYj1icmVhZGNydW1iX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYnJlYWRjcnVtYi9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL2JyZWFkY3J1bWIuaW5zdGFsbD1mdW5jdGlvbihWdWUpe1Z1ZS5jb21wb25lbnQoYnJlYWRjcnVtYi5uYW1lLGJyZWFkY3J1bWIpO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYWNrYWdlc19icmVhZGNydW1iPWJyZWFkY3J1bWI7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9icmVhZGNydW1iL3NyYy9icmVhZGNydW1iLWl0ZW0udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWZjZjllYWFjJgp2YXIgYnJlYWRjcnVtYl9pdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfZmNmOWVhYWNfcmVuZGVyPWZ1bmN0aW9uIGJyZWFkY3J1bWJfaXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkX2ZjZjllYWFjX3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygic3BhbiIse3N0YXRpY0NsYXNzOiJlbC1icmVhZGNydW1iX19pdGVtIn0sW19jKCJzcGFuIix7cmVmOiJsaW5rIixjbGFzczpbImVsLWJyZWFkY3J1bWJfX2lubmVyIixfdm0udG8/ImlzLWxpbmsiOiIiXSxhdHRyczp7cm9sZToibGluayJ9fSxbX3ZtLl90KCJkZWZhdWx0IildLDIpLF92bS5zZXBhcmF0b3JDbGFzcz9fYygiaSIse3N0YXRpY0NsYXNzOiJlbC1icmVhZGNydW1iX19zZXBhcmF0b3IiLGNsYXNzOl92bS5zZXBhcmF0b3JDbGFzc30pOl9jKCJzcGFuIix7c3RhdGljQ2xhc3M6ImVsLWJyZWFkY3J1bWJfX3NlcGFyYXRvciIsYXR0cnM6e3JvbGU6InByZXNlbnRhdGlvbiJ9fSxbX3ZtLl92KF92bS5fcyhfdm0uc2VwYXJhdG9yKSldKV0pO307dmFyIGJyZWFkY3J1bWJfaXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkX2ZjZjllYWFjX3N0YXRpY1JlbmRlckZucz1bXTticmVhZGNydW1iX2l0ZW12dWVfdHlwZV90ZW1wbGF0ZV9pZF9mY2Y5ZWFhY19yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYnJlYWRjcnVtYi9zcmMvYnJlYWRjcnVtYi1pdGVtLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD1mY2Y5ZWFhYyYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvYnJlYWRjcnVtYi9zcmMvYnJlYWRjcnVtYi1pdGVtLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBicmVhZGNydW1iX2l0ZW12dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e25hbWU6J0VsQnJlYWRjcnVtYkl0ZW0nLHByb3BzOnt0bzp7fSxyZXBsYWNlOkJvb2xlYW59LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybntzZXBhcmF0b3I6Jycsc2VwYXJhdG9yQ2xhc3M6Jyd9O30saW5qZWN0OlsnZWxCcmVhZGNydW1iJ10sbW91bnRlZDpmdW5jdGlvbiBtb3VudGVkKCl7dmFyIF90aGlzPXRoaXM7dGhpcy5zZXBhcmF0b3I9dGhpcy5lbEJyZWFkY3J1bWIuc2VwYXJhdG9yO3RoaXMuc2VwYXJhdG9yQ2xhc3M9dGhpcy5lbEJyZWFkY3J1bWIuc2VwYXJhdG9yQ2xhc3M7dmFyIGxpbms9dGhpcy4kcmVmcy5saW5rO2xpbmsuc2V0QXR0cmlidXRlKCdyb2xlJywnbGluaycpO2xpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKF8pe3ZhciB0bz1fdGhpcy50bywkcm91dGVyPV90aGlzLiRyb3V0ZXI7aWYoIXRvfHwhJHJvdXRlcilyZXR1cm47X3RoaXMucmVwbGFjZT8kcm91dGVyLnJlcGxhY2UodG8pOiRyb3V0ZXIucHVzaCh0byk7fSk7fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9icmVhZGNydW1iL3NyYy9icmVhZGNydW1iLWl0ZW0udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHNyY19icmVhZGNydW1iX2l0ZW12dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189YnJlYWRjcnVtYl9pdGVtdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYnJlYWRjcnVtYi9zcmMvYnJlYWRjcnVtYi1pdGVtLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIGJyZWFkY3J1bWJfaXRlbV9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHNyY19icmVhZGNydW1iX2l0ZW12dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sYnJlYWRjcnVtYl9pdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfZmNmOWVhYWNfcmVuZGVyLGJyZWFkY3J1bWJfaXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkX2ZjZjllYWFjX3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgYnJlYWRjcnVtYl9pdGVtX2FwaTt9YnJlYWRjcnVtYl9pdGVtX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvYnJlYWRjcnVtYi9zcmMvYnJlYWRjcnVtYi1pdGVtLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBicmVhZGNydW1iX2l0ZW09YnJlYWRjcnVtYl9pdGVtX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYnJlYWRjcnVtYi1pdGVtL2luZGV4LmpzCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovYnJlYWRjcnVtYl9pdGVtLmluc3RhbGw9ZnVuY3Rpb24oVnVlKXtWdWUuY29tcG9uZW50KGJyZWFkY3J1bWJfaXRlbS5uYW1lLGJyZWFkY3J1bWJfaXRlbSk7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX2JyZWFkY3J1bWJfaXRlbT1icmVhZGNydW1iX2l0ZW07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9mb3JtL3NyYy9mb3JtLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD1hMWI1ZmYzNCYKdmFyIGZvcm12dWVfdHlwZV90ZW1wbGF0ZV9pZF9hMWI1ZmYzNF9yZW5kZXI9ZnVuY3Rpb24gZm9ybXZ1ZV90eXBlX3RlbXBsYXRlX2lkX2ExYjVmZjM0X3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygiZm9ybSIse3N0YXRpY0NsYXNzOiJlbC1mb3JtIixjbGFzczpbX3ZtLmxhYmVsUG9zaXRpb24/ImVsLWZvcm0tLWxhYmVsLSIrX3ZtLmxhYmVsUG9zaXRpb246IiIseyJlbC1mb3JtLS1pbmxpbmUiOl92bS5pbmxpbmV9XX0sW192bS5fdCgiZGVmYXVsdCIpXSwyKTt9O3ZhciBmb3JtdnVlX3R5cGVfdGVtcGxhdGVfaWRfYTFiNWZmMzRfc3RhdGljUmVuZGVyRm5zPVtdO2Zvcm12dWVfdHlwZV90ZW1wbGF0ZV9pZF9hMWI1ZmYzNF9yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZm9ybS9zcmMvZm9ybS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9YTFiNWZmMzQmCi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2Zvcm0vc3JjL2Zvcm0udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovLwovLwovLwovLwovLwovLwovLwovLwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGZvcm12dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e25hbWU6J0VsRm9ybScsY29tcG9uZW50TmFtZTonRWxGb3JtJyxwcm92aWRlOmZ1bmN0aW9uIHByb3ZpZGUoKXtyZXR1cm57ZWxGb3JtOnRoaXN9O30scHJvcHM6e21vZGVsOk9iamVjdCxydWxlczpPYmplY3QsbGFiZWxQb3NpdGlvbjpTdHJpbmcsbGFiZWxXaWR0aDpTdHJpbmcsbGFiZWxTdWZmaXg6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6Jyd9LGlubGluZTpCb29sZWFuLGlubGluZU1lc3NhZ2U6Qm9vbGVhbixzdGF0dXNJY29uOkJvb2xlYW4sc2hvd01lc3NhZ2U6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OnRydWV9LHNpemU6U3RyaW5nLGRpc2FibGVkOkJvb2xlYW4sdmFsaWRhdGVPblJ1bGVDaGFuZ2U6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OnRydWV9LGhpZGVSZXF1aXJlZEFzdGVyaXNrOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDpmYWxzZX19LHdhdGNoOntydWxlczpmdW5jdGlvbiBydWxlcygpey8vIHJlbW92ZSB0aGVuIGFkZCBldmVudCBsaXN0ZW5lcnMgb24gZm9ybS1pdGVtIGFmdGVyIGZvcm0gcnVsZXMgY2hhbmdlCnRoaXMuZmllbGRzLmZvckVhY2goZnVuY3Rpb24oZmllbGQpe2ZpZWxkLnJlbW92ZVZhbGlkYXRlRXZlbnRzKCk7ZmllbGQuYWRkVmFsaWRhdGVFdmVudHMoKTt9KTtpZih0aGlzLnZhbGlkYXRlT25SdWxlQ2hhbmdlKXt0aGlzLnZhbGlkYXRlKGZ1bmN0aW9uKCl7fSk7fX19LGNvbXB1dGVkOnthdXRvTGFiZWxXaWR0aDpmdW5jdGlvbiBhdXRvTGFiZWxXaWR0aCgpe2lmKCF0aGlzLnBvdGVudGlhbExhYmVsV2lkdGhBcnIubGVuZ3RoKXJldHVybiAwO3ZhciBtYXg9TWF0aC5tYXguYXBwbHkoTWF0aCx0aGlzLnBvdGVudGlhbExhYmVsV2lkdGhBcnIpO3JldHVybiBtYXg/bWF4KydweCc6Jyc7fX0sZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue2ZpZWxkczpbXSxwb3RlbnRpYWxMYWJlbFdpZHRoQXJyOltdLy8gdXNlIHRoaXMgYXJyYXkgdG8gY2FsY3VsYXRlIGF1dG8gd2lkdGgKfTt9LGNyZWF0ZWQ6ZnVuY3Rpb24gY3JlYXRlZCgpe3ZhciBfdGhpcz10aGlzO3RoaXMuJG9uKCdlbC5mb3JtLmFkZEZpZWxkJyxmdW5jdGlvbihmaWVsZCl7aWYoZmllbGQpe190aGlzLmZpZWxkcy5wdXNoKGZpZWxkKTt9fSk7LyogaXN0YW5idWwgaWdub3JlIG5leHQgKi90aGlzLiRvbignZWwuZm9ybS5yZW1vdmVGaWVsZCcsZnVuY3Rpb24oZmllbGQpe2lmKGZpZWxkLnByb3Ape190aGlzLmZpZWxkcy5zcGxpY2UoX3RoaXMuZmllbGRzLmluZGV4T2YoZmllbGQpLDEpO319KTt9LG1ldGhvZHM6e3Jlc2V0RmllbGRzOmZ1bmN0aW9uIHJlc2V0RmllbGRzKCl7aWYoIXRoaXMubW9kZWwpe2NvbnNvbGUud2FybignW0VsZW1lbnQgV2Fybl1bRm9ybV1tb2RlbCBpcyByZXF1aXJlZCBmb3IgcmVzZXRGaWVsZHMgdG8gd29yay4nKTtyZXR1cm47fXRoaXMuZmllbGRzLmZvckVhY2goZnVuY3Rpb24oZmllbGQpe2ZpZWxkLnJlc2V0RmllbGQoKTt9KTt9LGNsZWFyVmFsaWRhdGU6ZnVuY3Rpb24gY2xlYXJWYWxpZGF0ZSgpe3ZhciBwcm9wcz1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMF06W107dmFyIGZpZWxkcz1wcm9wcy5sZW5ndGg/dHlwZW9mIHByb3BzPT09J3N0cmluZyc/dGhpcy5maWVsZHMuZmlsdGVyKGZ1bmN0aW9uKGZpZWxkKXtyZXR1cm4gcHJvcHM9PT1maWVsZC5wcm9wO30pOnRoaXMuZmllbGRzLmZpbHRlcihmdW5jdGlvbihmaWVsZCl7cmV0dXJuIHByb3BzLmluZGV4T2YoZmllbGQucHJvcCk+LTE7fSk6dGhpcy5maWVsZHM7ZmllbGRzLmZvckVhY2goZnVuY3Rpb24oZmllbGQpe2ZpZWxkLmNsZWFyVmFsaWRhdGUoKTt9KTt9LHZhbGlkYXRlOmZ1bmN0aW9uIHZhbGlkYXRlKGNhbGxiYWNrKXt2YXIgX3RoaXMyPXRoaXM7aWYoIXRoaXMubW9kZWwpe2NvbnNvbGUud2FybignW0VsZW1lbnQgV2Fybl1bRm9ybV1tb2RlbCBpcyByZXF1aXJlZCBmb3IgdmFsaWRhdGUgdG8gd29yayEnKTtyZXR1cm47fXZhciBwcm9taXNlPXZvaWQgMDsvLyBpZiBubyBjYWxsYmFjaywgcmV0dXJuIHByb21pc2UKaWYodHlwZW9mIGNhbGxiYWNrIT09J2Z1bmN0aW9uJyYmd2luZG93LlByb21pc2Upe3Byb21pc2U9bmV3IHdpbmRvdy5Qcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXtjYWxsYmFjaz1mdW5jdGlvbiBjYWxsYmFjayh2YWxpZCl7dmFsaWQ/cmVzb2x2ZSh2YWxpZCk6cmVqZWN0KHZhbGlkKTt9O30pO312YXIgdmFsaWQ9dHJ1ZTt2YXIgY291bnQ9MDsvLyDlpoLmnpzpnIDopoHpqozor4HnmoRmaWVsZHPkuLrnqbrvvIzosIPnlKjpqozor4Hml7bnq4vliLvov5Tlm55jYWxsYmFjawppZih0aGlzLmZpZWxkcy5sZW5ndGg9PT0wJiZjYWxsYmFjayl7Y2FsbGJhY2sodHJ1ZSk7fXZhciBpbnZhbGlkRmllbGRzPXt9O3RoaXMuZmllbGRzLmZvckVhY2goZnVuY3Rpb24oZmllbGQpe2ZpZWxkLnZhbGlkYXRlKCcnLGZ1bmN0aW9uKG1lc3NhZ2UsZmllbGQpe2lmKG1lc3NhZ2Upe3ZhbGlkPWZhbHNlO31pbnZhbGlkRmllbGRzPW1lcmdlX2RlZmF1bHQoKSh7fSxpbnZhbGlkRmllbGRzLGZpZWxkKTtpZih0eXBlb2YgY2FsbGJhY2s9PT0nZnVuY3Rpb24nJiYrK2NvdW50PT09X3RoaXMyLmZpZWxkcy5sZW5ndGgpe2NhbGxiYWNrKHZhbGlkLGludmFsaWRGaWVsZHMpO319KTt9KTtpZihwcm9taXNlKXtyZXR1cm4gcHJvbWlzZTt9fSx2YWxpZGF0ZUZpZWxkOmZ1bmN0aW9uIHZhbGlkYXRlRmllbGQocHJvcHMsY2Ipe3Byb3BzPVtdLmNvbmNhdChwcm9wcyk7dmFyIGZpZWxkcz10aGlzLmZpZWxkcy5maWx0ZXIoZnVuY3Rpb24oZmllbGQpe3JldHVybiBwcm9wcy5pbmRleE9mKGZpZWxkLnByb3ApIT09LTE7fSk7aWYoIWZpZWxkcy5sZW5ndGgpe2NvbnNvbGUud2FybignW0VsZW1lbnQgV2Fybl1wbGVhc2UgcGFzcyBjb3JyZWN0IHByb3BzIScpO3JldHVybjt9ZmllbGRzLmZvckVhY2goZnVuY3Rpb24oZmllbGQpe2ZpZWxkLnZhbGlkYXRlKCcnLGNiKTt9KTt9LGdldExhYmVsV2lkdGhJbmRleDpmdW5jdGlvbiBnZXRMYWJlbFdpZHRoSW5kZXgod2lkdGgpe3ZhciBpbmRleD10aGlzLnBvdGVudGlhbExhYmVsV2lkdGhBcnIuaW5kZXhPZih3aWR0aCk7Ly8gaXQncyBpbXBvc3NpYmxlCmlmKGluZGV4PT09LTEpe3Rocm93IG5ldyBFcnJvcignW0VsZW1lbnRGb3JtXXVucGVjdGVkIHdpZHRoICcsd2lkdGgpO31yZXR1cm4gaW5kZXg7fSxyZWdpc3RlckxhYmVsV2lkdGg6ZnVuY3Rpb24gcmVnaXN0ZXJMYWJlbFdpZHRoKHZhbCxvbGRWYWwpe2lmKHZhbCYmb2xkVmFsKXt2YXIgaW5kZXg9dGhpcy5nZXRMYWJlbFdpZHRoSW5kZXgob2xkVmFsKTt0aGlzLnBvdGVudGlhbExhYmVsV2lkdGhBcnIuc3BsaWNlKGluZGV4LDEsdmFsKTt9ZWxzZSBpZih2YWwpe3RoaXMucG90ZW50aWFsTGFiZWxXaWR0aEFyci5wdXNoKHZhbCk7fX0sZGVyZWdpc3RlckxhYmVsV2lkdGg6ZnVuY3Rpb24gZGVyZWdpc3RlckxhYmVsV2lkdGgodmFsKXt2YXIgaW5kZXg9dGhpcy5nZXRMYWJlbFdpZHRoSW5kZXgodmFsKTt0aGlzLnBvdGVudGlhbExhYmVsV2lkdGhBcnIuc3BsaWNlKGluZGV4LDEpO319fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Zvcm0vc3JjL2Zvcm0udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHNyY19mb3JtdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPWZvcm12dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9mb3JtL3NyYy9mb3JtLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIGZvcm1fY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChzcmNfZm9ybXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxmb3JtdnVlX3R5cGVfdGVtcGxhdGVfaWRfYTFiNWZmMzRfcmVuZGVyLGZvcm12dWVfdHlwZV90ZW1wbGF0ZV9pZF9hMWI1ZmYzNF9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIGZvcm1fYXBpO31mb3JtX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvZm9ybS9zcmMvZm9ybS52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc3JjX2Zvcm09Zm9ybV9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Zvcm0vaW5kZXguanMKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9zcmNfZm9ybS5pbnN0YWxsPWZ1bmN0aW9uKFZ1ZSl7VnVlLmNvbXBvbmVudChzcmNfZm9ybS5uYW1lLHNyY19mb3JtKTt9Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFja2FnZXNfZm9ybT1zcmNfZm9ybTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2Zvcm0vc3JjL2Zvcm0taXRlbS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9YjZmM2RiNmMmCnZhciBmb3JtX2l0ZW12dWVfdHlwZV90ZW1wbGF0ZV9pZF9iNmYzZGI2Y19yZW5kZXI9ZnVuY3Rpb24gZm9ybV9pdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfYjZmM2RiNmNfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtZm9ybS1pdGVtIixjbGFzczpbeyJlbC1mb3JtLWl0ZW0tLWZlZWRiYWNrIjpfdm0uZWxGb3JtJiZfdm0uZWxGb3JtLnN0YXR1c0ljb24sImlzLWVycm9yIjpfdm0udmFsaWRhdGVTdGF0ZT09PSJlcnJvciIsImlzLXZhbGlkYXRpbmciOl92bS52YWxpZGF0ZVN0YXRlPT09InZhbGlkYXRpbmciLCJpcy1zdWNjZXNzIjpfdm0udmFsaWRhdGVTdGF0ZT09PSJzdWNjZXNzIiwiaXMtcmVxdWlyZWQiOl92bS5pc1JlcXVpcmVkfHxfdm0ucmVxdWlyZWQsImlzLW5vLWFzdGVyaXNrIjpfdm0uZWxGb3JtJiZfdm0uZWxGb3JtLmhpZGVSZXF1aXJlZEFzdGVyaXNrfSxfdm0uc2l6ZUNsYXNzPyJlbC1mb3JtLWl0ZW0tLSIrX3ZtLnNpemVDbGFzczoiIl19LFtfYygibGFiZWwtd3JhcCIse2F0dHJzOnsiaXMtYXV0by13aWR0aCI6X3ZtLmxhYmVsU3R5bGUmJl92bS5sYWJlbFN0eWxlLndpZHRoPT09ImF1dG8iLCJ1cGRhdGUtYWxsIjpfdm0uZm9ybS5sYWJlbFdpZHRoPT09ImF1dG8ifX0sW192bS5sYWJlbHx8X3ZtLiRzbG90cy5sYWJlbD9fYygibGFiZWwiLHtzdGF0aWNDbGFzczoiZWwtZm9ybS1pdGVtX19sYWJlbCIsc3R5bGU6X3ZtLmxhYmVsU3R5bGUsYXR0cnM6e2Zvcjpfdm0ubGFiZWxGb3J9fSxbX3ZtLl90KCJsYWJlbCIsW192bS5fdihfdm0uX3MoX3ZtLmxhYmVsK192bS5mb3JtLmxhYmVsU3VmZml4KSldKV0sMik6X3ZtLl9lKCldKSxfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLWZvcm0taXRlbV9fY29udGVudCIsc3R5bGU6X3ZtLmNvbnRlbnRTdHlsZX0sW192bS5fdCgiZGVmYXVsdCIpLF9jKCJ0cmFuc2l0aW9uIix7YXR0cnM6e25hbWU6ImVsLXpvb20taW4tdG9wIn19LFtfdm0udmFsaWRhdGVTdGF0ZT09PSJlcnJvciImJl92bS5zaG93TWVzc2FnZSYmX3ZtLmZvcm0uc2hvd01lc3NhZ2U/X3ZtLl90KCJlcnJvciIsW19jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtZm9ybS1pdGVtX19lcnJvciIsY2xhc3M6eyJlbC1mb3JtLWl0ZW1fX2Vycm9yLS1pbmxpbmUiOnR5cGVvZiBfdm0uaW5saW5lTWVzc2FnZT09PSJib29sZWFuIj9fdm0uaW5saW5lTWVzc2FnZTpfdm0uZWxGb3JtJiZfdm0uZWxGb3JtLmlubGluZU1lc3NhZ2V8fGZhbHNlfX0sW192bS5fdigiXG4gICAgICAgICAgIitfdm0uX3MoX3ZtLnZhbGlkYXRlTWVzc2FnZSkrIlxuICAgICAgICAiKV0pXSx7ZXJyb3I6X3ZtLnZhbGlkYXRlTWVzc2FnZX0pOl92bS5fZSgpXSwyKV0sMildLDEpO307dmFyIGZvcm1faXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkX2I2ZjNkYjZjX3N0YXRpY1JlbmRlckZucz1bXTtmb3JtX2l0ZW12dWVfdHlwZV90ZW1wbGF0ZV9pZF9iNmYzZGI2Y19yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZm9ybS9zcmMvZm9ybS1pdGVtLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD1iNmYzZGI2YyYKLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCAiYXN5bmMtdmFsaWRhdG9yIgp2YXIgZXh0ZXJuYWxfYXN5bmNfdmFsaWRhdG9yXz1fX3dlYnBhY2tfcmVxdWlyZV9fKDQwKTt2YXIgZXh0ZXJuYWxfYXN5bmNfdmFsaWRhdG9yX2RlZmF1bHQ9LyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihleHRlcm5hbF9hc3luY192YWxpZGF0b3JfKTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9mb3JtL3NyYy9sYWJlbC13cmFwLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBsYWJlbF93cmFwdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtwcm9wczp7aXNBdXRvV2lkdGg6Qm9vbGVhbix1cGRhdGVBbGw6Qm9vbGVhbn0saW5qZWN0OlsnZWxGb3JtJywnZWxGb3JtSXRlbSddLHJlbmRlcjpmdW5jdGlvbiByZW5kZXIoKXt2YXIgaD1hcmd1bWVudHNbMF07dmFyIHNsb3RzPXRoaXMuJHNsb3RzLmRlZmF1bHQ7aWYoIXNsb3RzKXJldHVybiBudWxsO2lmKHRoaXMuaXNBdXRvV2lkdGgpe3ZhciBhdXRvTGFiZWxXaWR0aD10aGlzLmVsRm9ybS5hdXRvTGFiZWxXaWR0aDt2YXIgc3R5bGU9e307aWYoYXV0b0xhYmVsV2lkdGgmJmF1dG9MYWJlbFdpZHRoIT09J2F1dG8nKXt2YXIgbWFyZ2luTGVmdD1wYXJzZUludChhdXRvTGFiZWxXaWR0aCwxMCktdGhpcy5jb21wdXRlZFdpZHRoO2lmKG1hcmdpbkxlZnQpe3N0eWxlLm1hcmdpbkxlZnQ9bWFyZ2luTGVmdCsncHgnO319cmV0dXJuIGgoJ2RpdicseydjbGFzcyc6J2VsLWZvcm0taXRlbV9fbGFiZWwtd3JhcCcsc3R5bGU6c3R5bGV9LFtzbG90c10pO31lbHNle3JldHVybiBzbG90c1swXTt9fSxtZXRob2RzOntnZXRMYWJlbFdpZHRoOmZ1bmN0aW9uIGdldExhYmVsV2lkdGgoKXtpZih0aGlzLiRlbCYmdGhpcy4kZWwuZmlyc3RFbGVtZW50Q2hpbGQpe3ZhciBjb21wdXRlZFdpZHRoPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuJGVsLmZpcnN0RWxlbWVudENoaWxkKS53aWR0aDtyZXR1cm4gTWF0aC5jZWlsKHBhcnNlRmxvYXQoY29tcHV0ZWRXaWR0aCkpO31lbHNle3JldHVybiAwO319LHVwZGF0ZUxhYmVsV2lkdGg6ZnVuY3Rpb24gdXBkYXRlTGFiZWxXaWR0aCgpe3ZhciBhY3Rpb249YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzBdOid1cGRhdGUnO2lmKHRoaXMuJHNsb3RzLmRlZmF1bHQmJnRoaXMuaXNBdXRvV2lkdGgmJnRoaXMuJGVsLmZpcnN0RWxlbWVudENoaWxkKXtpZihhY3Rpb249PT0ndXBkYXRlJyl7dGhpcy5jb21wdXRlZFdpZHRoPXRoaXMuZ2V0TGFiZWxXaWR0aCgpO31lbHNlIGlmKGFjdGlvbj09PSdyZW1vdmUnKXt0aGlzLmVsRm9ybS5kZXJlZ2lzdGVyTGFiZWxXaWR0aCh0aGlzLmNvbXB1dGVkV2lkdGgpO319fX0sd2F0Y2g6e2NvbXB1dGVkV2lkdGg6ZnVuY3Rpb24gY29tcHV0ZWRXaWR0aCh2YWwsb2xkVmFsKXtpZih0aGlzLnVwZGF0ZUFsbCl7dGhpcy5lbEZvcm0ucmVnaXN0ZXJMYWJlbFdpZHRoKHZhbCxvbGRWYWwpO3RoaXMuZWxGb3JtSXRlbS51cGRhdGVDb21wdXRlZExhYmVsV2lkdGgodmFsKTt9fX0sZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue2NvbXB1dGVkV2lkdGg6MH07fSxtb3VudGVkOmZ1bmN0aW9uIG1vdW50ZWQoKXt0aGlzLnVwZGF0ZUxhYmVsV2lkdGgoJ3VwZGF0ZScpO30sdXBkYXRlZDpmdW5jdGlvbiB1cGRhdGVkKCl7dGhpcy51cGRhdGVMYWJlbFdpZHRoKCd1cGRhdGUnKTt9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpe3RoaXMudXBkYXRlTGFiZWxXaWR0aCgncmVtb3ZlJyk7fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9mb3JtL3NyYy9sYWJlbC13cmFwLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfbGFiZWxfd3JhcHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz1sYWJlbF93cmFwdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZm9ybS9zcmMvbGFiZWwtd3JhcC52dWUKdmFyIGxhYmVsX3dyYXBfcmVuZGVyLGxhYmVsX3dyYXBfc3RhdGljUmVuZGVyRm5zOy8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgbGFiZWxfd3JhcF9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHNyY19sYWJlbF93cmFwdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLGxhYmVsX3dyYXBfcmVuZGVyLGxhYmVsX3dyYXBfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciBsYWJlbF93cmFwX2FwaTt9bGFiZWxfd3JhcF9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL2Zvcm0vc3JjL2xhYmVsLXdyYXAudnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGxhYmVsX3dyYXA9bGFiZWxfd3JhcF9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9mb3JtL3NyYy9mb3JtLWl0ZW0udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGZvcm1faXRlbXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17bmFtZTonRWxGb3JtSXRlbScsY29tcG9uZW50TmFtZTonRWxGb3JtSXRlbScsbWl4aW5zOltlbWl0dGVyX2RlZmF1bHQuYV0scHJvdmlkZTpmdW5jdGlvbiBwcm92aWRlKCl7cmV0dXJue2VsRm9ybUl0ZW06dGhpc307fSxpbmplY3Q6WydlbEZvcm0nXSxwcm9wczp7bGFiZWw6U3RyaW5nLGxhYmVsV2lkdGg6U3RyaW5nLHByb3A6U3RyaW5nLHJlcXVpcmVkOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDp1bmRlZmluZWR9LHJ1bGVzOltPYmplY3QsQXJyYXldLGVycm9yOlN0cmluZyx2YWxpZGF0ZVN0YXR1czpTdHJpbmcsZm9yOlN0cmluZyxpbmxpbmVNZXNzYWdlOnt0eXBlOltTdHJpbmcsQm9vbGVhbl0sZGVmYXVsdDonJ30sc2hvd01lc3NhZ2U6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OnRydWV9LHNpemU6U3RyaW5nfSxjb21wb25lbnRzOnsvLyB1c2UgdGhpcyBjb21wb25lbnQgdG8gY2FsY3VsYXRlIGF1dG8gd2lkdGgKTGFiZWxXcmFwOmxhYmVsX3dyYXB9LHdhdGNoOntlcnJvcjp7aW1tZWRpYXRlOnRydWUsaGFuZGxlcjpmdW5jdGlvbiBoYW5kbGVyKHZhbHVlKXt0aGlzLnZhbGlkYXRlTWVzc2FnZT12YWx1ZTt0aGlzLnZhbGlkYXRlU3RhdGU9dmFsdWU/J2Vycm9yJzonJzt9fSx2YWxpZGF0ZVN0YXR1czpmdW5jdGlvbiB2YWxpZGF0ZVN0YXR1cyh2YWx1ZSl7dGhpcy52YWxpZGF0ZVN0YXRlPXZhbHVlO319LGNvbXB1dGVkOntsYWJlbEZvcjpmdW5jdGlvbiBsYWJlbEZvcigpe3JldHVybiB0aGlzLmZvcnx8dGhpcy5wcm9wO30sbGFiZWxTdHlsZTpmdW5jdGlvbiBsYWJlbFN0eWxlKCl7dmFyIHJldD17fTtpZih0aGlzLmZvcm0ubGFiZWxQb3NpdGlvbj09PSd0b3AnKXJldHVybiByZXQ7dmFyIGxhYmVsV2lkdGg9dGhpcy5sYWJlbFdpZHRofHx0aGlzLmZvcm0ubGFiZWxXaWR0aDtpZihsYWJlbFdpZHRoKXtyZXQud2lkdGg9bGFiZWxXaWR0aDt9cmV0dXJuIHJldDt9LGNvbnRlbnRTdHlsZTpmdW5jdGlvbiBjb250ZW50U3R5bGUoKXt2YXIgcmV0PXt9O3ZhciBsYWJlbD10aGlzLmxhYmVsO2lmKHRoaXMuZm9ybS5sYWJlbFBvc2l0aW9uPT09J3RvcCd8fHRoaXMuZm9ybS5pbmxpbmUpcmV0dXJuIHJldDtpZighbGFiZWwmJiF0aGlzLmxhYmVsV2lkdGgmJnRoaXMuaXNOZXN0ZWQpcmV0dXJuIHJldDt2YXIgbGFiZWxXaWR0aD10aGlzLmxhYmVsV2lkdGh8fHRoaXMuZm9ybS5sYWJlbFdpZHRoO2lmKGxhYmVsV2lkdGg9PT0nYXV0bycpe2lmKHRoaXMubGFiZWxXaWR0aD09PSdhdXRvJyl7cmV0Lm1hcmdpbkxlZnQ9dGhpcy5jb21wdXRlZExhYmVsV2lkdGg7fWVsc2UgaWYodGhpcy5mb3JtLmxhYmVsV2lkdGg9PT0nYXV0bycpe3JldC5tYXJnaW5MZWZ0PXRoaXMuZWxGb3JtLmF1dG9MYWJlbFdpZHRoO319ZWxzZXtyZXQubWFyZ2luTGVmdD1sYWJlbFdpZHRoO31yZXR1cm4gcmV0O30sZm9ybTpmdW5jdGlvbiBmb3JtKCl7dmFyIHBhcmVudD10aGlzLiRwYXJlbnQ7dmFyIHBhcmVudE5hbWU9cGFyZW50LiRvcHRpb25zLmNvbXBvbmVudE5hbWU7d2hpbGUocGFyZW50TmFtZSE9PSdFbEZvcm0nKXtpZihwYXJlbnROYW1lPT09J0VsRm9ybUl0ZW0nKXt0aGlzLmlzTmVzdGVkPXRydWU7fXBhcmVudD1wYXJlbnQuJHBhcmVudDtwYXJlbnROYW1lPXBhcmVudC4kb3B0aW9ucy5jb21wb25lbnROYW1lO31yZXR1cm4gcGFyZW50O30sZmllbGRWYWx1ZTpmdW5jdGlvbiBmaWVsZFZhbHVlKCl7dmFyIG1vZGVsPXRoaXMuZm9ybS5tb2RlbDtpZighbW9kZWx8fCF0aGlzLnByb3Ape3JldHVybjt9dmFyIHBhdGg9dGhpcy5wcm9wO2lmKHBhdGguaW5kZXhPZignOicpIT09LTEpe3BhdGg9cGF0aC5yZXBsYWNlKC86LywnLicpO31yZXR1cm4gT2JqZWN0KHV0aWxfWyJnZXRQcm9wQnlQYXRoIl0pKG1vZGVsLHBhdGgsdHJ1ZSkudjt9LGlzUmVxdWlyZWQ6ZnVuY3Rpb24gaXNSZXF1aXJlZCgpe3ZhciBydWxlcz10aGlzLmdldFJ1bGVzKCk7dmFyIGlzUmVxdWlyZWQ9ZmFsc2U7aWYocnVsZXMmJnJ1bGVzLmxlbmd0aCl7cnVsZXMuZXZlcnkoZnVuY3Rpb24ocnVsZSl7aWYocnVsZS5yZXF1aXJlZCl7aXNSZXF1aXJlZD10cnVlO3JldHVybiBmYWxzZTt9cmV0dXJuIHRydWU7fSk7fXJldHVybiBpc1JlcXVpcmVkO30sX2Zvcm1TaXplOmZ1bmN0aW9uIF9mb3JtU2l6ZSgpe3JldHVybiB0aGlzLmVsRm9ybS5zaXplO30sZWxGb3JtSXRlbVNpemU6ZnVuY3Rpb24gZWxGb3JtSXRlbVNpemUoKXtyZXR1cm4gdGhpcy5zaXplfHx0aGlzLl9mb3JtU2l6ZTt9LHNpemVDbGFzczpmdW5jdGlvbiBzaXplQ2xhc3MoKXtyZXR1cm4gdGhpcy5lbEZvcm1JdGVtU2l6ZXx8KHRoaXMuJEVMRU1FTlR8fHt9KS5zaXplO319LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybnt2YWxpZGF0ZVN0YXRlOicnLHZhbGlkYXRlTWVzc2FnZTonJyx2YWxpZGF0ZURpc2FibGVkOmZhbHNlLHZhbGlkYXRvcjp7fSxpc05lc3RlZDpmYWxzZSxjb21wdXRlZExhYmVsV2lkdGg6Jyd9O30sbWV0aG9kczp7dmFsaWRhdGU6ZnVuY3Rpb24gdmFsaWRhdGUodHJpZ2dlcil7dmFyIF90aGlzPXRoaXM7dmFyIGNhbGxiYWNrPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dW5kZWZpbmVkP2FyZ3VtZW50c1sxXTp1dGlsX1sibm9vcCJdO3RoaXMudmFsaWRhdGVEaXNhYmxlZD1mYWxzZTt2YXIgcnVsZXM9dGhpcy5nZXRGaWx0ZXJlZFJ1bGUodHJpZ2dlcik7aWYoKCFydWxlc3x8cnVsZXMubGVuZ3RoPT09MCkmJnRoaXMucmVxdWlyZWQ9PT11bmRlZmluZWQpe2NhbGxiYWNrKCk7cmV0dXJuIHRydWU7fXRoaXMudmFsaWRhdGVTdGF0ZT0ndmFsaWRhdGluZyc7dmFyIGRlc2NyaXB0b3I9e307aWYocnVsZXMmJnJ1bGVzLmxlbmd0aD4wKXtydWxlcy5mb3JFYWNoKGZ1bmN0aW9uKHJ1bGUpe2RlbGV0ZSBydWxlLnRyaWdnZXI7fSk7fWRlc2NyaXB0b3JbdGhpcy5wcm9wXT1ydWxlczt2YXIgdmFsaWRhdG9yPW5ldyBleHRlcm5hbF9hc3luY192YWxpZGF0b3JfZGVmYXVsdC5hKGRlc2NyaXB0b3IpO3ZhciBtb2RlbD17fTttb2RlbFt0aGlzLnByb3BdPXRoaXMuZmllbGRWYWx1ZTt2YWxpZGF0b3IudmFsaWRhdGUobW9kZWwse2ZpcnN0RmllbGRzOnRydWV9LGZ1bmN0aW9uKGVycm9ycyxpbnZhbGlkRmllbGRzKXtfdGhpcy52YWxpZGF0ZVN0YXRlPSFlcnJvcnM/J3N1Y2Nlc3MnOidlcnJvcic7X3RoaXMudmFsaWRhdGVNZXNzYWdlPWVycm9ycz9lcnJvcnNbMF0ubWVzc2FnZTonJztjYWxsYmFjayhfdGhpcy52YWxpZGF0ZU1lc3NhZ2UsaW52YWxpZEZpZWxkcyk7X3RoaXMuZWxGb3JtJiZfdGhpcy5lbEZvcm0uJGVtaXQoJ3ZhbGlkYXRlJyxfdGhpcy5wcm9wLCFlcnJvcnMsX3RoaXMudmFsaWRhdGVNZXNzYWdlfHxudWxsKTt9KTt9LGNsZWFyVmFsaWRhdGU6ZnVuY3Rpb24gY2xlYXJWYWxpZGF0ZSgpe3RoaXMudmFsaWRhdGVTdGF0ZT0nJzt0aGlzLnZhbGlkYXRlTWVzc2FnZT0nJzt0aGlzLnZhbGlkYXRlRGlzYWJsZWQ9ZmFsc2U7fSxyZXNldEZpZWxkOmZ1bmN0aW9uIHJlc2V0RmllbGQoKXt2YXIgX3RoaXMyPXRoaXM7dGhpcy52YWxpZGF0ZVN0YXRlPScnO3RoaXMudmFsaWRhdGVNZXNzYWdlPScnO3ZhciBtb2RlbD10aGlzLmZvcm0ubW9kZWw7dmFyIHZhbHVlPXRoaXMuZmllbGRWYWx1ZTt2YXIgcGF0aD10aGlzLnByb3A7aWYocGF0aC5pbmRleE9mKCc6JykhPT0tMSl7cGF0aD1wYXRoLnJlcGxhY2UoLzovLCcuJyk7fXZhciBwcm9wPU9iamVjdCh1dGlsX1siZ2V0UHJvcEJ5UGF0aCJdKShtb2RlbCxwYXRoLHRydWUpO3RoaXMudmFsaWRhdGVEaXNhYmxlZD10cnVlO2lmKEFycmF5LmlzQXJyYXkodmFsdWUpKXtwcm9wLm9bcHJvcC5rXT1bXS5jb25jYXQodGhpcy5pbml0aWFsVmFsdWUpO31lbHNle3Byb3Aub1twcm9wLmtdPXRoaXMuaW5pdGlhbFZhbHVlO30vLyByZXNldCB2YWxpZGF0ZURpc2FibGVkIGFmdGVyIG9uRmllbGRDaGFuZ2UgdHJpZ2dlcmVkCnRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uKCl7X3RoaXMyLnZhbGlkYXRlRGlzYWJsZWQ9ZmFsc2U7fSk7dGhpcy5icm9hZGNhc3QoJ0VsVGltZVNlbGVjdCcsJ2ZpZWxkUmVzZXQnLHRoaXMuaW5pdGlhbFZhbHVlKTt9LGdldFJ1bGVzOmZ1bmN0aW9uIGdldFJ1bGVzKCl7dmFyIGZvcm1SdWxlcz10aGlzLmZvcm0ucnVsZXM7dmFyIHNlbGZSdWxlcz10aGlzLnJ1bGVzO3ZhciByZXF1aXJlZFJ1bGU9dGhpcy5yZXF1aXJlZCE9PXVuZGVmaW5lZD97cmVxdWlyZWQ6ISF0aGlzLnJlcXVpcmVkfTpbXTt2YXIgcHJvcD1PYmplY3QodXRpbF9bImdldFByb3BCeVBhdGgiXSkoZm9ybVJ1bGVzLHRoaXMucHJvcHx8JycpO2Zvcm1SdWxlcz1mb3JtUnVsZXM/cHJvcC5vW3RoaXMucHJvcHx8JyddfHxwcm9wLnY6W107cmV0dXJuW10uY29uY2F0KHNlbGZSdWxlc3x8Zm9ybVJ1bGVzfHxbXSkuY29uY2F0KHJlcXVpcmVkUnVsZSk7fSxnZXRGaWx0ZXJlZFJ1bGU6ZnVuY3Rpb24gZ2V0RmlsdGVyZWRSdWxlKHRyaWdnZXIpe3ZhciBydWxlcz10aGlzLmdldFJ1bGVzKCk7cmV0dXJuIHJ1bGVzLmZpbHRlcihmdW5jdGlvbihydWxlKXtpZighcnVsZS50cmlnZ2VyfHx0cmlnZ2VyPT09JycpcmV0dXJuIHRydWU7aWYoQXJyYXkuaXNBcnJheShydWxlLnRyaWdnZXIpKXtyZXR1cm4gcnVsZS50cmlnZ2VyLmluZGV4T2YodHJpZ2dlcik+LTE7fWVsc2V7cmV0dXJuIHJ1bGUudHJpZ2dlcj09PXRyaWdnZXI7fX0pLm1hcChmdW5jdGlvbihydWxlKXtyZXR1cm4gbWVyZ2VfZGVmYXVsdCgpKHt9LHJ1bGUpO30pO30sb25GaWVsZEJsdXI6ZnVuY3Rpb24gb25GaWVsZEJsdXIoKXt0aGlzLnZhbGlkYXRlKCdibHVyJyk7fSxvbkZpZWxkQ2hhbmdlOmZ1bmN0aW9uIG9uRmllbGRDaGFuZ2UoKXtpZih0aGlzLnZhbGlkYXRlRGlzYWJsZWQpe3RoaXMudmFsaWRhdGVEaXNhYmxlZD1mYWxzZTtyZXR1cm47fXRoaXMudmFsaWRhdGUoJ2NoYW5nZScpO30sdXBkYXRlQ29tcHV0ZWRMYWJlbFdpZHRoOmZ1bmN0aW9uIHVwZGF0ZUNvbXB1dGVkTGFiZWxXaWR0aCh3aWR0aCl7dGhpcy5jb21wdXRlZExhYmVsV2lkdGg9d2lkdGg/d2lkdGgrJ3B4JzonJzt9LGFkZFZhbGlkYXRlRXZlbnRzOmZ1bmN0aW9uIGFkZFZhbGlkYXRlRXZlbnRzKCl7dmFyIHJ1bGVzPXRoaXMuZ2V0UnVsZXMoKTtpZihydWxlcy5sZW5ndGh8fHRoaXMucmVxdWlyZWQhPT11bmRlZmluZWQpe3RoaXMuJG9uKCdlbC5mb3JtLmJsdXInLHRoaXMub25GaWVsZEJsdXIpO3RoaXMuJG9uKCdlbC5mb3JtLmNoYW5nZScsdGhpcy5vbkZpZWxkQ2hhbmdlKTt9fSxyZW1vdmVWYWxpZGF0ZUV2ZW50czpmdW5jdGlvbiByZW1vdmVWYWxpZGF0ZUV2ZW50cygpe3RoaXMuJG9mZigpO319LG1vdW50ZWQ6ZnVuY3Rpb24gbW91bnRlZCgpe2lmKHRoaXMucHJvcCl7dGhpcy5kaXNwYXRjaCgnRWxGb3JtJywnZWwuZm9ybS5hZGRGaWVsZCcsW3RoaXNdKTt2YXIgaW5pdGlhbFZhbHVlPXRoaXMuZmllbGRWYWx1ZTtpZihBcnJheS5pc0FycmF5KGluaXRpYWxWYWx1ZSkpe2luaXRpYWxWYWx1ZT1bXS5jb25jYXQoaW5pdGlhbFZhbHVlKTt9T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsJ2luaXRpYWxWYWx1ZScse3ZhbHVlOmluaXRpYWxWYWx1ZX0pO3RoaXMuYWRkVmFsaWRhdGVFdmVudHMoKTt9fSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKXt0aGlzLmRpc3BhdGNoKCdFbEZvcm0nLCdlbC5mb3JtLnJlbW92ZUZpZWxkJyxbdGhpc10pO319Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZm9ybS9zcmMvZm9ybS1pdGVtLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfZm9ybV9pdGVtdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPWZvcm1faXRlbXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Zvcm0vc3JjL2Zvcm0taXRlbS52dWUKLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciBmb3JtX2l0ZW1fY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChzcmNfZm9ybV9pdGVtdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLGZvcm1faXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkX2I2ZjNkYjZjX3JlbmRlcixmb3JtX2l0ZW12dWVfdHlwZV90ZW1wbGF0ZV9pZF9iNmYzZGI2Y19zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIGZvcm1faXRlbV9hcGk7fWZvcm1faXRlbV9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL2Zvcm0vc3JjL2Zvcm0taXRlbS52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgZm9ybV9pdGVtPWZvcm1faXRlbV9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Zvcm0taXRlbS9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL2Zvcm1faXRlbS5pbnN0YWxsPWZ1bmN0aW9uKFZ1ZSl7VnVlLmNvbXBvbmVudChmb3JtX2l0ZW0ubmFtZSxmb3JtX2l0ZW0pO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYWNrYWdlc19mb3JtX2l0ZW09Zm9ybV9pdGVtOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvdGFicy9zcmMvdGFiLWJhci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MjAzMWYzM2EmCnZhciB0YWJfYmFydnVlX3R5cGVfdGVtcGxhdGVfaWRfMjAzMWYzM2FfcmVuZGVyPWZ1bmN0aW9uIHRhYl9iYXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF8yMDMxZjMzYV9yZW5kZXIoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDt2YXIgX2M9X3ZtLl9zZWxmLl9jfHxfaDtyZXR1cm4gX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC10YWJzX19hY3RpdmUtYmFyIixjbGFzczoiaXMtIitfdm0ucm9vdFRhYnMudGFiUG9zaXRpb24sc3R5bGU6X3ZtLmJhclN0eWxlfSk7fTt2YXIgdGFiX2JhcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzIwMzFmMzNhX3N0YXRpY1JlbmRlckZucz1bXTt0YWJfYmFydnVlX3R5cGVfdGVtcGxhdGVfaWRfMjAzMWYzM2FfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYnMvc3JjL3RhYi1iYXIudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTIwMzFmMzNhJgovLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy90YWJzL3NyYy90YWItYmFyLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLy8KLy8KLy8KLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciB0YWJfYmFydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidUYWJCYXInLHByb3BzOnt0YWJzOkFycmF5fSxpbmplY3Q6Wydyb290VGFicyddLGNvbXB1dGVkOntiYXJTdHlsZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3ZhciBfdGhpcz10aGlzO3ZhciBzdHlsZT17fTt2YXIgb2Zmc2V0PTA7dmFyIHRhYlNpemU9MDt2YXIgc2l6ZU5hbWU9Wyd0b3AnLCdib3R0b20nXS5pbmRleE9mKHRoaXMucm9vdFRhYnMudGFiUG9zaXRpb24pIT09LTE/J3dpZHRoJzonaGVpZ2h0Jzt2YXIgc2l6ZURpcj1zaXplTmFtZT09PSd3aWR0aCc/J3gnOid5Jzt2YXIgZmlyc3RVcHBlckNhc2U9ZnVuY3Rpb24gZmlyc3RVcHBlckNhc2Uoc3RyKXtyZXR1cm4gc3RyLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvKCB8XilbYS16XS9nLGZ1bmN0aW9uKEwpe3JldHVybiBMLnRvVXBwZXJDYXNlKCk7fSk7fTt0aGlzLnRhYnMuZXZlcnkoZnVuY3Rpb24odGFiLGluZGV4KXt2YXIgJGVsPU9iamVjdCh1dGlsX1siYXJyYXlGaW5kIl0pKF90aGlzLiRwYXJlbnQuJHJlZnMudGFic3x8W10sZnVuY3Rpb24odCl7cmV0dXJuIHQuaWQucmVwbGFjZSgndGFiLScsJycpPT09dGFiLnBhbmVOYW1lO30pO2lmKCEkZWwpe3JldHVybiBmYWxzZTt9aWYoIXRhYi5hY3RpdmUpe29mZnNldCs9JGVsWydjbGllbnQnK2ZpcnN0VXBwZXJDYXNlKHNpemVOYW1lKV07cmV0dXJuIHRydWU7fWVsc2V7dGFiU2l6ZT0kZWxbJ2NsaWVudCcrZmlyc3RVcHBlckNhc2Uoc2l6ZU5hbWUpXTt2YXIgdGFiU3R5bGVzPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCRlbCk7aWYoc2l6ZU5hbWU9PT0nd2lkdGgnJiZfdGhpcy50YWJzLmxlbmd0aD4xKXt0YWJTaXplLT1wYXJzZUZsb2F0KHRhYlN0eWxlcy5wYWRkaW5nTGVmdCkrcGFyc2VGbG9hdCh0YWJTdHlsZXMucGFkZGluZ1JpZ2h0KTt9aWYoc2l6ZU5hbWU9PT0nd2lkdGgnKXtvZmZzZXQrPXBhcnNlRmxvYXQodGFiU3R5bGVzLnBhZGRpbmdMZWZ0KTt9cmV0dXJuIGZhbHNlO319KTt2YXIgdHJhbnNmb3JtPSd0cmFuc2xhdGUnK2ZpcnN0VXBwZXJDYXNlKHNpemVEaXIpKycoJytvZmZzZXQrJ3B4KSc7c3R5bGVbc2l6ZU5hbWVdPXRhYlNpemUrJ3B4JztzdHlsZS50cmFuc2Zvcm09dHJhbnNmb3JtO3N0eWxlLm1zVHJhbnNmb3JtPXRyYW5zZm9ybTtzdHlsZS53ZWJraXRUcmFuc2Zvcm09dHJhbnNmb3JtO3JldHVybiBzdHlsZTt9fX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGFicy9zcmMvdGFiLWJhci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc3JjX3RhYl9iYXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189dGFiX2JhcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYnMvc3JjL3RhYi1iYXIudnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgdGFiX2Jhcl9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHNyY190YWJfYmFydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLHRhYl9iYXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF8yMDMxZjMzYV9yZW5kZXIsdGFiX2JhcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzIwMzFmMzNhX3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgdGFiX2Jhcl9hcGk7fXRhYl9iYXJfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy90YWJzL3NyYy90YWItYmFyLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciB0YWJfYmFyPXRhYl9iYXJfY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvdGFicy9zcmMvdGFiLW5hdi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCmZ1bmN0aW9uIG5vb3AoKXt9dmFyIHRhYl9uYXZ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19maXJzdFVwcGVyQ2FzZT1mdW5jdGlvbiBmaXJzdFVwcGVyQ2FzZShzdHIpe3JldHVybiBzdHIudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC8oIHxeKVthLXpdL2csZnVuY3Rpb24oTCl7cmV0dXJuIEwudG9VcHBlckNhc2UoKTt9KTt9Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgdGFiX25hdnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17bmFtZTonVGFiTmF2Jyxjb21wb25lbnRzOntUYWJCYXI6dGFiX2Jhcn0saW5qZWN0Olsncm9vdFRhYnMnXSxwcm9wczp7cGFuZXM6QXJyYXksY3VycmVudE5hbWU6U3RyaW5nLGVkaXRhYmxlOkJvb2xlYW4sb25UYWJDbGljazp7dHlwZTpGdW5jdGlvbixkZWZhdWx0Om5vb3B9LG9uVGFiUmVtb3ZlOnt0eXBlOkZ1bmN0aW9uLGRlZmF1bHQ6bm9vcH0sdHlwZTpTdHJpbmcsc3RyZXRjaDpCb29sZWFufSxkYXRhOmZ1bmN0aW9uIGRhdGEoKXtyZXR1cm57c2Nyb2xsYWJsZTpmYWxzZSxuYXZPZmZzZXQ6MCxpc0ZvY3VzOmZhbHNlLGZvY3VzYWJsZTp0cnVlfTt9LGNvbXB1dGVkOntuYXZTdHlsZTpmdW5jdGlvbiBuYXZTdHlsZSgpe3ZhciBkaXI9Wyd0b3AnLCdib3R0b20nXS5pbmRleE9mKHRoaXMucm9vdFRhYnMudGFiUG9zaXRpb24pIT09LTE/J1gnOidZJztyZXR1cm57dHJhbnNmb3JtOid0cmFuc2xhdGUnK2RpcisnKC0nK3RoaXMubmF2T2Zmc2V0KydweCknfTt9LHNpemVOYW1lOmZ1bmN0aW9uIHNpemVOYW1lKCl7cmV0dXJuWyd0b3AnLCdib3R0b20nXS5pbmRleE9mKHRoaXMucm9vdFRhYnMudGFiUG9zaXRpb24pIT09LTE/J3dpZHRoJzonaGVpZ2h0Jzt9fSxtZXRob2RzOntzY3JvbGxQcmV2OmZ1bmN0aW9uIHNjcm9sbFByZXYoKXt2YXIgY29udGFpbmVyU2l6ZT10aGlzLiRyZWZzLm5hdlNjcm9sbFsnb2Zmc2V0Jyt0YWJfbmF2dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfZmlyc3RVcHBlckNhc2UodGhpcy5zaXplTmFtZSldO3ZhciBjdXJyZW50T2Zmc2V0PXRoaXMubmF2T2Zmc2V0O2lmKCFjdXJyZW50T2Zmc2V0KXJldHVybjt2YXIgbmV3T2Zmc2V0PWN1cnJlbnRPZmZzZXQ+Y29udGFpbmVyU2l6ZT9jdXJyZW50T2Zmc2V0LWNvbnRhaW5lclNpemU6MDt0aGlzLm5hdk9mZnNldD1uZXdPZmZzZXQ7fSxzY3JvbGxOZXh0OmZ1bmN0aW9uIHNjcm9sbE5leHQoKXt2YXIgbmF2U2l6ZT10aGlzLiRyZWZzLm5hdlsnb2Zmc2V0Jyt0YWJfbmF2dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfZmlyc3RVcHBlckNhc2UodGhpcy5zaXplTmFtZSldO3ZhciBjb250YWluZXJTaXplPXRoaXMuJHJlZnMubmF2U2Nyb2xsWydvZmZzZXQnK3RhYl9uYXZ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19maXJzdFVwcGVyQ2FzZSh0aGlzLnNpemVOYW1lKV07dmFyIGN1cnJlbnRPZmZzZXQ9dGhpcy5uYXZPZmZzZXQ7aWYobmF2U2l6ZS1jdXJyZW50T2Zmc2V0PD1jb250YWluZXJTaXplKXJldHVybjt2YXIgbmV3T2Zmc2V0PW5hdlNpemUtY3VycmVudE9mZnNldD5jb250YWluZXJTaXplKjI/Y3VycmVudE9mZnNldCtjb250YWluZXJTaXplOm5hdlNpemUtY29udGFpbmVyU2l6ZTt0aGlzLm5hdk9mZnNldD1uZXdPZmZzZXQ7fSxzY3JvbGxUb0FjdGl2ZVRhYjpmdW5jdGlvbiBzY3JvbGxUb0FjdGl2ZVRhYigpe2lmKCF0aGlzLnNjcm9sbGFibGUpcmV0dXJuO3ZhciBuYXY9dGhpcy4kcmVmcy5uYXY7dmFyIGFjdGl2ZVRhYj10aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCcuaXMtYWN0aXZlJyk7aWYoIWFjdGl2ZVRhYilyZXR1cm47dmFyIG5hdlNjcm9sbD10aGlzLiRyZWZzLm5hdlNjcm9sbDt2YXIgaXNIb3Jpem9udGFsPVsndG9wJywnYm90dG9tJ10uaW5kZXhPZih0aGlzLnJvb3RUYWJzLnRhYlBvc2l0aW9uKSE9PS0xO3ZhciBhY3RpdmVUYWJCb3VuZGluZz1hY3RpdmVUYWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dmFyIG5hdlNjcm9sbEJvdW5kaW5nPW5hdlNjcm9sbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgbWF4T2Zmc2V0PWlzSG9yaXpvbnRhbD9uYXYub2Zmc2V0V2lkdGgtbmF2U2Nyb2xsQm91bmRpbmcud2lkdGg6bmF2Lm9mZnNldEhlaWdodC1uYXZTY3JvbGxCb3VuZGluZy5oZWlnaHQ7dmFyIGN1cnJlbnRPZmZzZXQ9dGhpcy5uYXZPZmZzZXQ7dmFyIG5ld09mZnNldD1jdXJyZW50T2Zmc2V0O2lmKGlzSG9yaXpvbnRhbCl7aWYoYWN0aXZlVGFiQm91bmRpbmcubGVmdDxuYXZTY3JvbGxCb3VuZGluZy5sZWZ0KXtuZXdPZmZzZXQ9Y3VycmVudE9mZnNldC0obmF2U2Nyb2xsQm91bmRpbmcubGVmdC1hY3RpdmVUYWJCb3VuZGluZy5sZWZ0KTt9aWYoYWN0aXZlVGFiQm91bmRpbmcucmlnaHQ+bmF2U2Nyb2xsQm91bmRpbmcucmlnaHQpe25ld09mZnNldD1jdXJyZW50T2Zmc2V0K2FjdGl2ZVRhYkJvdW5kaW5nLnJpZ2h0LW5hdlNjcm9sbEJvdW5kaW5nLnJpZ2h0O319ZWxzZXtpZihhY3RpdmVUYWJCb3VuZGluZy50b3A8bmF2U2Nyb2xsQm91bmRpbmcudG9wKXtuZXdPZmZzZXQ9Y3VycmVudE9mZnNldC0obmF2U2Nyb2xsQm91bmRpbmcudG9wLWFjdGl2ZVRhYkJvdW5kaW5nLnRvcCk7fWlmKGFjdGl2ZVRhYkJvdW5kaW5nLmJvdHRvbT5uYXZTY3JvbGxCb3VuZGluZy5ib3R0b20pe25ld09mZnNldD1jdXJyZW50T2Zmc2V0KyhhY3RpdmVUYWJCb3VuZGluZy5ib3R0b20tbmF2U2Nyb2xsQm91bmRpbmcuYm90dG9tKTt9fW5ld09mZnNldD1NYXRoLm1heChuZXdPZmZzZXQsMCk7dGhpcy5uYXZPZmZzZXQ9TWF0aC5taW4obmV3T2Zmc2V0LG1heE9mZnNldCk7fSx1cGRhdGU6ZnVuY3Rpb24gdXBkYXRlKCl7aWYoIXRoaXMuJHJlZnMubmF2KXJldHVybjt2YXIgc2l6ZU5hbWU9dGhpcy5zaXplTmFtZTt2YXIgbmF2U2l6ZT10aGlzLiRyZWZzLm5hdlsnb2Zmc2V0Jyt0YWJfbmF2dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfZmlyc3RVcHBlckNhc2Uoc2l6ZU5hbWUpXTt2YXIgY29udGFpbmVyU2l6ZT10aGlzLiRyZWZzLm5hdlNjcm9sbFsnb2Zmc2V0Jyt0YWJfbmF2dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfZmlyc3RVcHBlckNhc2Uoc2l6ZU5hbWUpXTt2YXIgY3VycmVudE9mZnNldD10aGlzLm5hdk9mZnNldDtpZihjb250YWluZXJTaXplPG5hdlNpemUpe3ZhciBfY3VycmVudE9mZnNldD10aGlzLm5hdk9mZnNldDt0aGlzLnNjcm9sbGFibGU9dGhpcy5zY3JvbGxhYmxlfHx7fTt0aGlzLnNjcm9sbGFibGUucHJldj1fY3VycmVudE9mZnNldDt0aGlzLnNjcm9sbGFibGUubmV4dD1fY3VycmVudE9mZnNldCtjb250YWluZXJTaXplPG5hdlNpemU7aWYobmF2U2l6ZS1fY3VycmVudE9mZnNldDxjb250YWluZXJTaXplKXt0aGlzLm5hdk9mZnNldD1uYXZTaXplLWNvbnRhaW5lclNpemU7fX1lbHNle3RoaXMuc2Nyb2xsYWJsZT1mYWxzZTtpZihjdXJyZW50T2Zmc2V0PjApe3RoaXMubmF2T2Zmc2V0PTA7fX19LGNoYW5nZVRhYjpmdW5jdGlvbiBjaGFuZ2VUYWIoZSl7dmFyIGtleUNvZGU9ZS5rZXlDb2RlO3ZhciBuZXh0SW5kZXg9dm9pZCAwO3ZhciBjdXJyZW50SW5kZXg9dm9pZCAwLHRhYkxpc3Q9dm9pZCAwO2lmKFszNywzOCwzOSw0MF0uaW5kZXhPZihrZXlDb2RlKSE9PS0xKXsvLyDlt6blj7PkuIrkuIvplK7mm7TmjaJ0YWIKdGFiTGlzdD1lLmN1cnJlbnRUYXJnZXQucXVlcnlTZWxlY3RvckFsbCgnW3JvbGU9dGFiXScpO2N1cnJlbnRJbmRleD1BcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHRhYkxpc3QsZS50YXJnZXQpO31lbHNle3JldHVybjt9aWYoa2V5Q29kZT09PTM3fHxrZXlDb2RlPT09Mzgpey8vIGxlZnQKaWYoY3VycmVudEluZGV4PT09MCl7Ly8gZmlyc3QKbmV4dEluZGV4PXRhYkxpc3QubGVuZ3RoLTE7fWVsc2V7bmV4dEluZGV4PWN1cnJlbnRJbmRleC0xO319ZWxzZXsvLyByaWdodAppZihjdXJyZW50SW5kZXg8dGFiTGlzdC5sZW5ndGgtMSl7Ly8gbm90IGxhc3QKbmV4dEluZGV4PWN1cnJlbnRJbmRleCsxO31lbHNle25leHRJbmRleD0wO319dGFiTGlzdFtuZXh0SW5kZXhdLmZvY3VzKCk7Ly8g5pS55Y+Y54Sm54K55YWD57SgCnRhYkxpc3RbbmV4dEluZGV4XS5jbGljaygpOy8vIOmAieS4reS4i+S4gOS4qnRhYgp0aGlzLnNldEZvY3VzKCk7fSxzZXRGb2N1czpmdW5jdGlvbiBzZXRGb2N1cygpe2lmKHRoaXMuZm9jdXNhYmxlKXt0aGlzLmlzRm9jdXM9dHJ1ZTt9fSxyZW1vdmVGb2N1czpmdW5jdGlvbiByZW1vdmVGb2N1cygpe3RoaXMuaXNGb2N1cz1mYWxzZTt9LHZpc2liaWxpdHlDaGFuZ2VIYW5kbGVyOmZ1bmN0aW9uIHZpc2liaWxpdHlDaGFuZ2VIYW5kbGVyKCl7dmFyIF90aGlzPXRoaXM7dmFyIHZpc2liaWxpdHk9ZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlO2lmKHZpc2liaWxpdHk9PT0naGlkZGVuJyl7dGhpcy5mb2N1c2FibGU9ZmFsc2U7fWVsc2UgaWYodmlzaWJpbGl0eT09PSd2aXNpYmxlJyl7c2V0VGltZW91dChmdW5jdGlvbigpe190aGlzLmZvY3VzYWJsZT10cnVlO30sNTApO319LHdpbmRvd0JsdXJIYW5kbGVyOmZ1bmN0aW9uIHdpbmRvd0JsdXJIYW5kbGVyKCl7dGhpcy5mb2N1c2FibGU9ZmFsc2U7fSx3aW5kb3dGb2N1c0hhbmRsZXI6ZnVuY3Rpb24gd2luZG93Rm9jdXNIYW5kbGVyKCl7dmFyIF90aGlzMj10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtfdGhpczIuZm9jdXNhYmxlPXRydWU7fSw1MCk7fX0sdXBkYXRlZDpmdW5jdGlvbiB1cGRhdGVkKCl7dGhpcy51cGRhdGUoKTt9LHJlbmRlcjpmdW5jdGlvbiByZW5kZXIoaCl7dmFyIF90aGlzMz10aGlzO3ZhciB0eXBlPXRoaXMudHlwZSxwYW5lcz10aGlzLnBhbmVzLGVkaXRhYmxlPXRoaXMuZWRpdGFibGUsc3RyZXRjaD10aGlzLnN0cmV0Y2gsb25UYWJDbGljaz10aGlzLm9uVGFiQ2xpY2ssb25UYWJSZW1vdmU9dGhpcy5vblRhYlJlbW92ZSxuYXZTdHlsZT10aGlzLm5hdlN0eWxlLHNjcm9sbGFibGU9dGhpcy5zY3JvbGxhYmxlLHNjcm9sbE5leHQ9dGhpcy5zY3JvbGxOZXh0LHNjcm9sbFByZXY9dGhpcy5zY3JvbGxQcmV2LGNoYW5nZVRhYj10aGlzLmNoYW5nZVRhYixzZXRGb2N1cz10aGlzLnNldEZvY3VzLHJlbW92ZUZvY3VzPXRoaXMucmVtb3ZlRm9jdXM7dmFyIHNjcm9sbEJ0bj1zY3JvbGxhYmxlP1toKCdzcGFuJyx7J2NsYXNzJzpbJ2VsLXRhYnNfX25hdi1wcmV2JyxzY3JvbGxhYmxlLnByZXY/Jyc6J2lzLWRpc2FibGVkJ10sb246eydjbGljayc6c2Nyb2xsUHJldn19LFtoKCdpJyx7J2NsYXNzJzonZWwtaWNvbi1hcnJvdy1sZWZ0J30pXSksaCgnc3BhbicseydjbGFzcyc6WydlbC10YWJzX19uYXYtbmV4dCcsc2Nyb2xsYWJsZS5uZXh0PycnOidpcy1kaXNhYmxlZCddLG9uOnsnY2xpY2snOnNjcm9sbE5leHR9fSxbaCgnaScseydjbGFzcyc6J2VsLWljb24tYXJyb3ctcmlnaHQnfSldKV06bnVsbDt2YXIgdGFicz10aGlzLl9sKHBhbmVzLGZ1bmN0aW9uKHBhbmUsaW5kZXgpe3ZhciBfcmVmO3ZhciB0YWJOYW1lPXBhbmUubmFtZXx8cGFuZS5pbmRleHx8aW5kZXg7dmFyIGNsb3NhYmxlPXBhbmUuaXNDbG9zYWJsZXx8ZWRpdGFibGU7cGFuZS5pbmRleD0nJytpbmRleDt2YXIgYnRuQ2xvc2U9Y2xvc2FibGU/aCgnc3BhbicseydjbGFzcyc6J2VsLWljb24tY2xvc2UnLG9uOnsnY2xpY2snOmZ1bmN0aW9uIGNsaWNrKGV2KXtvblRhYlJlbW92ZShwYW5lLGV2KTt9fX0pOm51bGw7dmFyIHRhYkxhYmVsQ29udGVudD1wYW5lLiRzbG90cy5sYWJlbHx8cGFuZS5sYWJlbDt2YXIgdGFiaW5kZXg9cGFuZS5hY3RpdmU/MDotMTtyZXR1cm4gaCgnZGl2Jyx7J2NsYXNzJzooX3JlZj17J2VsLXRhYnNfX2l0ZW0nOnRydWV9LF9yZWZbJ2lzLScrX3RoaXMzLnJvb3RUYWJzLnRhYlBvc2l0aW9uXT10cnVlLF9yZWZbJ2lzLWFjdGl2ZSddPXBhbmUuYWN0aXZlLF9yZWZbJ2lzLWRpc2FibGVkJ109cGFuZS5kaXNhYmxlZCxfcmVmWydpcy1jbG9zYWJsZSddPWNsb3NhYmxlLF9yZWZbJ2lzLWZvY3VzJ109X3RoaXMzLmlzRm9jdXMsX3JlZiksYXR0cnM6e2lkOid0YWItJyt0YWJOYW1lLCdhcmlhLWNvbnRyb2xzJzoncGFuZS0nK3RhYk5hbWUscm9sZTondGFiJywnYXJpYS1zZWxlY3RlZCc6cGFuZS5hY3RpdmUsdGFiaW5kZXg6dGFiaW5kZXh9LGtleTondGFiLScrdGFiTmFtZSxyZWY6J3RhYnMnLHJlZkluRm9yOnRydWUsb246eydmb2N1cyc6ZnVuY3Rpb24gZm9jdXMoKXtzZXRGb2N1cygpO30sJ2JsdXInOmZ1bmN0aW9uIGJsdXIoKXtyZW1vdmVGb2N1cygpO30sJ2NsaWNrJzpmdW5jdGlvbiBjbGljayhldil7cmVtb3ZlRm9jdXMoKTtvblRhYkNsaWNrKHBhbmUsdGFiTmFtZSxldik7fSwna2V5ZG93bic6ZnVuY3Rpb24ga2V5ZG93bihldil7aWYoY2xvc2FibGUmJihldi5rZXlDb2RlPT09NDZ8fGV2LmtleUNvZGU9PT04KSl7b25UYWJSZW1vdmUocGFuZSxldik7fX19fSxbdGFiTGFiZWxDb250ZW50LGJ0bkNsb3NlXSk7fSk7cmV0dXJuIGgoJ2RpdicseydjbGFzcyc6WydlbC10YWJzX19uYXYtd3JhcCcsc2Nyb2xsYWJsZT8naXMtc2Nyb2xsYWJsZSc6JycsJ2lzLScrdGhpcy5yb290VGFicy50YWJQb3NpdGlvbl19LFtzY3JvbGxCdG4saCgnZGl2Jyx7J2NsYXNzJzpbJ2VsLXRhYnNfX25hdi1zY3JvbGwnXSxyZWY6J25hdlNjcm9sbCd9LFtoKCdkaXYnLHsnY2xhc3MnOlsnZWwtdGFic19fbmF2JywnaXMtJyt0aGlzLnJvb3RUYWJzLnRhYlBvc2l0aW9uLHN0cmV0Y2gmJlsndG9wJywnYm90dG9tJ10uaW5kZXhPZih0aGlzLnJvb3RUYWJzLnRhYlBvc2l0aW9uKSE9PS0xPydpcy1zdHJldGNoJzonJ10scmVmOiduYXYnLHN0eWxlOm5hdlN0eWxlLGF0dHJzOntyb2xlOid0YWJsaXN0J30sb246eydrZXlkb3duJzpjaGFuZ2VUYWJ9fSxbIXR5cGU/aCgndGFiLWJhcicse2F0dHJzOnt0YWJzOnBhbmVzfX0pOm51bGwsdGFic10pXSldKTt9LG1vdW50ZWQ6ZnVuY3Rpb24gbW91bnRlZCgpe3ZhciBfdGhpczQ9dGhpcztPYmplY3QocmVzaXplX2V2ZW50X1siYWRkUmVzaXplTGlzdGVuZXIiXSkodGhpcy4kZWwsdGhpcy51cGRhdGUpO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLHRoaXMudmlzaWJpbGl0eUNoYW5nZUhhbmRsZXIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdibHVyJyx0aGlzLndpbmRvd0JsdXJIYW5kbGVyKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLHRoaXMud2luZG93Rm9jdXNIYW5kbGVyKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7X3RoaXM0LnNjcm9sbFRvQWN0aXZlVGFiKCk7fSwwKTt9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpe2lmKHRoaXMuJGVsJiZ0aGlzLnVwZGF0ZSlPYmplY3QocmVzaXplX2V2ZW50X1sicmVtb3ZlUmVzaXplTGlzdGVuZXIiXSkodGhpcy4kZWwsdGhpcy51cGRhdGUpO2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLHRoaXMudmlzaWJpbGl0eUNoYW5nZUhhbmRsZXIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdibHVyJyx0aGlzLndpbmRvd0JsdXJIYW5kbGVyKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXMnLHRoaXMud2luZG93Rm9jdXNIYW5kbGVyKTt9fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYnMvc3JjL3RhYi1uYXYudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHNyY190YWJfbmF2dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXRhYl9uYXZ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90YWJzL3NyYy90YWItbmF2LnZ1ZQp2YXIgdGFiX25hdl9yZW5kZXIsdGFiX25hdl9zdGF0aWNSZW5kZXJGbnM7Lyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciB0YWJfbmF2X2NvbXBvbmVudD1ub3JtYWxpemVDb21wb25lbnQoc3JjX3RhYl9uYXZ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sdGFiX25hdl9yZW5kZXIsdGFiX25hdl9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIHRhYl9uYXZfYXBpO310YWJfbmF2X2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvdGFicy9zcmMvdGFiLW5hdi52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgdGFiX25hdj10YWJfbmF2X2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3RhYnMvc3JjL3RhYnMudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHRhYnN2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e25hbWU6J0VsVGFicycsY29tcG9uZW50czp7VGFiTmF2OnRhYl9uYXZ9LHByb3BzOnt0eXBlOlN0cmluZyxhY3RpdmVOYW1lOlN0cmluZyxjbG9zYWJsZTpCb29sZWFuLGFkZGFibGU6Qm9vbGVhbix2YWx1ZTp7fSxlZGl0YWJsZTpCb29sZWFuLHRhYlBvc2l0aW9uOnt0eXBlOlN0cmluZyxkZWZhdWx0Oid0b3AnfSxiZWZvcmVMZWF2ZTpGdW5jdGlvbixzdHJldGNoOkJvb2xlYW59LHByb3ZpZGU6ZnVuY3Rpb24gcHJvdmlkZSgpe3JldHVybntyb290VGFiczp0aGlzfTt9LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybntjdXJyZW50TmFtZTp0aGlzLnZhbHVlfHx0aGlzLmFjdGl2ZU5hbWUscGFuZXM6W119O30sd2F0Y2g6e2FjdGl2ZU5hbWU6ZnVuY3Rpb24gYWN0aXZlTmFtZSh2YWx1ZSl7dGhpcy5zZXRDdXJyZW50TmFtZSh2YWx1ZSk7fSx2YWx1ZTpmdW5jdGlvbiB2YWx1ZShfdmFsdWUpe3RoaXMuc2V0Q3VycmVudE5hbWUoX3ZhbHVlKTt9LGN1cnJlbnROYW1lOmZ1bmN0aW9uIGN1cnJlbnROYW1lKHZhbHVlKXt2YXIgX3RoaXM9dGhpcztpZih0aGlzLiRyZWZzLm5hdil7dGhpcy4kbmV4dFRpY2soZnVuY3Rpb24oKXtfdGhpcy4kcmVmcy5uYXYuJG5leHRUaWNrKGZ1bmN0aW9uKF8pe190aGlzLiRyZWZzLm5hdi5zY3JvbGxUb0FjdGl2ZVRhYigpO30pO30pO319fSxtZXRob2RzOntjYWxjUGFuZUluc3RhbmNlczpmdW5jdGlvbiBjYWxjUGFuZUluc3RhbmNlcygpe3ZhciBfdGhpczI9dGhpczt2YXIgaXNGb3JjZVVwZGF0ZT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMF06ZmFsc2U7aWYodGhpcy4kc2xvdHMuZGVmYXVsdCl7dmFyIHBhbmVTbG90cz10aGlzLiRzbG90cy5kZWZhdWx0LmZpbHRlcihmdW5jdGlvbih2bm9kZSl7cmV0dXJuIHZub2RlLnRhZyYmdm5vZGUuY29tcG9uZW50T3B0aW9ucyYmdm5vZGUuY29tcG9uZW50T3B0aW9ucy5DdG9yLm9wdGlvbnMubmFtZT09PSdFbFRhYlBhbmUnO30pOy8vIHVwZGF0ZSBpbmRlZWQKdmFyIHBhbmVzPXBhbmVTbG90cy5tYXAoZnVuY3Rpb24oX3JlZil7dmFyIGNvbXBvbmVudEluc3RhbmNlPV9yZWYuY29tcG9uZW50SW5zdGFuY2U7cmV0dXJuIGNvbXBvbmVudEluc3RhbmNlO30pO3ZhciBwYW5lc0NoYW5nZWQ9IShwYW5lcy5sZW5ndGg9PT10aGlzLnBhbmVzLmxlbmd0aCYmcGFuZXMuZXZlcnkoZnVuY3Rpb24ocGFuZSxpbmRleCl7cmV0dXJuIHBhbmU9PT1fdGhpczIucGFuZXNbaW5kZXhdO30pKTtpZihpc0ZvcmNlVXBkYXRlfHxwYW5lc0NoYW5nZWQpe3RoaXMucGFuZXM9cGFuZXM7fX1lbHNlIGlmKHRoaXMucGFuZXMubGVuZ3RoIT09MCl7dGhpcy5wYW5lcz1bXTt9fSxoYW5kbGVUYWJDbGljazpmdW5jdGlvbiBoYW5kbGVUYWJDbGljayh0YWIsdGFiTmFtZSxldmVudCl7aWYodGFiLmRpc2FibGVkKXJldHVybjt0aGlzLnNldEN1cnJlbnROYW1lKHRhYk5hbWUpO3RoaXMuJGVtaXQoJ3RhYi1jbGljaycsdGFiLGV2ZW50KTt9LGhhbmRsZVRhYlJlbW92ZTpmdW5jdGlvbiBoYW5kbGVUYWJSZW1vdmUocGFuZSxldil7aWYocGFuZS5kaXNhYmxlZClyZXR1cm47ZXYuc3RvcFByb3BhZ2F0aW9uKCk7dGhpcy4kZW1pdCgnZWRpdCcscGFuZS5uYW1lLCdyZW1vdmUnKTt0aGlzLiRlbWl0KCd0YWItcmVtb3ZlJyxwYW5lLm5hbWUpO30saGFuZGxlVGFiQWRkOmZ1bmN0aW9uIGhhbmRsZVRhYkFkZCgpe3RoaXMuJGVtaXQoJ2VkaXQnLG51bGwsJ2FkZCcpO3RoaXMuJGVtaXQoJ3RhYi1hZGQnKTt9LHNldEN1cnJlbnROYW1lOmZ1bmN0aW9uIHNldEN1cnJlbnROYW1lKHZhbHVlKXt2YXIgX3RoaXMzPXRoaXM7dmFyIGNoYW5nZUN1cnJlbnROYW1lPWZ1bmN0aW9uIGNoYW5nZUN1cnJlbnROYW1lKCl7X3RoaXMzLmN1cnJlbnROYW1lPXZhbHVlO190aGlzMy4kZW1pdCgnaW5wdXQnLHZhbHVlKTt9O2lmKHRoaXMuY3VycmVudE5hbWUhPT12YWx1ZSYmdGhpcy5iZWZvcmVMZWF2ZSl7dmFyIGJlZm9yZT10aGlzLmJlZm9yZUxlYXZlKHZhbHVlLHRoaXMuY3VycmVudE5hbWUpO2lmKGJlZm9yZSYmYmVmb3JlLnRoZW4pe2JlZm9yZS50aGVuKGZ1bmN0aW9uKCl7Y2hhbmdlQ3VycmVudE5hbWUoKTtfdGhpczMuJHJlZnMubmF2JiZfdGhpczMuJHJlZnMubmF2LnJlbW92ZUZvY3VzKCk7fSxmdW5jdGlvbigpey8vIGh0dHBzOi8vZ2l0aHViLmNvbS9FbGVtZUZFL2VsZW1lbnQvcHVsbC8xNDgxNgovLyBpZ25vcmUgcHJvbWlzZSByZWplY3Rpb24gaW4gYGJlZm9yZS1sZWF2ZWAgaG9vawp9KTt9ZWxzZSBpZihiZWZvcmUhPT1mYWxzZSl7Y2hhbmdlQ3VycmVudE5hbWUoKTt9fWVsc2V7Y2hhbmdlQ3VycmVudE5hbWUoKTt9fX0scmVuZGVyOmZ1bmN0aW9uIHJlbmRlcihoKXt2YXIgX3JlZjI7dmFyIHR5cGU9dGhpcy50eXBlLGhhbmRsZVRhYkNsaWNrPXRoaXMuaGFuZGxlVGFiQ2xpY2ssaGFuZGxlVGFiUmVtb3ZlPXRoaXMuaGFuZGxlVGFiUmVtb3ZlLGhhbmRsZVRhYkFkZD10aGlzLmhhbmRsZVRhYkFkZCxjdXJyZW50TmFtZT10aGlzLmN1cnJlbnROYW1lLHBhbmVzPXRoaXMucGFuZXMsZWRpdGFibGU9dGhpcy5lZGl0YWJsZSxhZGRhYmxlPXRoaXMuYWRkYWJsZSx0YWJQb3NpdGlvbj10aGlzLnRhYlBvc2l0aW9uLHN0cmV0Y2g9dGhpcy5zdHJldGNoO3ZhciBuZXdCdXR0b249ZWRpdGFibGV8fGFkZGFibGU/aCgnc3BhbicseydjbGFzcyc6J2VsLXRhYnNfX25ldy10YWInLG9uOnsnY2xpY2snOmhhbmRsZVRhYkFkZCwna2V5ZG93bic6ZnVuY3Rpb24ga2V5ZG93bihldil7aWYoZXYua2V5Q29kZT09PTEzKXtoYW5kbGVUYWJBZGQoKTt9fX0sYXR0cnM6e3RhYmluZGV4OicwJ319LFtoKCdpJyx7J2NsYXNzJzonZWwtaWNvbi1wbHVzJ30pXSk6bnVsbDt2YXIgbmF2RGF0YT17cHJvcHM6e2N1cnJlbnROYW1lOmN1cnJlbnROYW1lLG9uVGFiQ2xpY2s6aGFuZGxlVGFiQ2xpY2ssb25UYWJSZW1vdmU6aGFuZGxlVGFiUmVtb3ZlLGVkaXRhYmxlOmVkaXRhYmxlLHR5cGU6dHlwZSxwYW5lczpwYW5lcyxzdHJldGNoOnN0cmV0Y2h9LHJlZjonbmF2J307dmFyIGhlYWRlcj1oKCdkaXYnLHsnY2xhc3MnOlsnZWwtdGFic19faGVhZGVyJywnaXMtJyt0YWJQb3NpdGlvbl19LFtuZXdCdXR0b24saCgndGFiLW5hdicsbmF2RGF0YSldKTt2YXIgcGFuZWxzPWgoJ2RpdicseydjbGFzcyc6J2VsLXRhYnNfX2NvbnRlbnQnfSxbdGhpcy4kc2xvdHMuZGVmYXVsdF0pO3JldHVybiBoKCdkaXYnLHsnY2xhc3MnOihfcmVmMj17J2VsLXRhYnMnOnRydWUsJ2VsLXRhYnMtLWNhcmQnOnR5cGU9PT0nY2FyZCd9LF9yZWYyWydlbC10YWJzLS0nK3RhYlBvc2l0aW9uXT10cnVlLF9yZWYyWydlbC10YWJzLS1ib3JkZXItY2FyZCddPXR5cGU9PT0nYm9yZGVyLWNhcmQnLF9yZWYyKX0sW3RhYlBvc2l0aW9uIT09J2JvdHRvbSc/W2hlYWRlcixwYW5lbHNdOltwYW5lbHMsaGVhZGVyXV0pO30sY3JlYXRlZDpmdW5jdGlvbiBjcmVhdGVkKCl7aWYoIXRoaXMuY3VycmVudE5hbWUpe3RoaXMuc2V0Q3VycmVudE5hbWUoJzAnKTt9dGhpcy4kb24oJ3RhYi1uYXYtdXBkYXRlJyx0aGlzLmNhbGNQYW5lSW5zdGFuY2VzLmJpbmQobnVsbCx0cnVlKSk7fSxtb3VudGVkOmZ1bmN0aW9uIG1vdW50ZWQoKXt0aGlzLmNhbGNQYW5lSW5zdGFuY2VzKCk7fSx1cGRhdGVkOmZ1bmN0aW9uIHVwZGF0ZWQoKXt0aGlzLmNhbGNQYW5lSW5zdGFuY2VzKCk7fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90YWJzL3NyYy90YWJzLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfdGFic3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz10YWJzdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGFicy9zcmMvdGFicy52dWUKdmFyIHRhYnNfcmVuZGVyLHRhYnNfc3RhdGljUmVuZGVyRm5zOy8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgdGFic19jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHNyY190YWJzdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLHRhYnNfcmVuZGVyLHRhYnNfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciB0YWJzX2FwaTt9dGFic19jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL3RhYnMvc3JjL3RhYnMudnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHRhYnM9dGFic19jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYnMvaW5kZXguanMKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi90YWJzLmluc3RhbGw9ZnVuY3Rpb24oVnVlKXtWdWUuY29tcG9uZW50KHRhYnMubmFtZSx0YWJzKTt9Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFja2FnZXNfdGFicz10YWJzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvdGFicy9zcmMvdGFiLXBhbmUudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTkxNDVhMDcwJgp2YXIgdGFiX3BhbmV2dWVfdHlwZV90ZW1wbGF0ZV9pZF85MTQ1YTA3MF9yZW5kZXI9ZnVuY3Rpb24gdGFiX3BhbmV2dWVfdHlwZV90ZW1wbGF0ZV9pZF85MTQ1YTA3MF9yZW5kZXIoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDt2YXIgX2M9X3ZtLl9zZWxmLl9jfHxfaDtyZXR1cm4hX3ZtLmxhenl8fF92bS5sb2FkZWR8fF92bS5hY3RpdmU/X2MoImRpdiIse2RpcmVjdGl2ZXM6W3tuYW1lOiJzaG93IixyYXdOYW1lOiJ2LXNob3ciLHZhbHVlOl92bS5hY3RpdmUsZXhwcmVzc2lvbjoiYWN0aXZlIn1dLHN0YXRpY0NsYXNzOiJlbC10YWItcGFuZSIsYXR0cnM6e3JvbGU6InRhYnBhbmVsIiwiYXJpYS1oaWRkZW4iOiFfdm0uYWN0aXZlLGlkOiJwYW5lLSIrX3ZtLnBhbmVOYW1lLCJhcmlhLWxhYmVsbGVkYnkiOiJ0YWItIitfdm0ucGFuZU5hbWV9fSxbX3ZtLl90KCJkZWZhdWx0IildLDIpOl92bS5fZSgpO307dmFyIHRhYl9wYW5ldnVlX3R5cGVfdGVtcGxhdGVfaWRfOTE0NWEwNzBfc3RhdGljUmVuZGVyRm5zPVtdO3RhYl9wYW5ldnVlX3R5cGVfdGVtcGxhdGVfaWRfOTE0NWEwNzBfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYnMvc3JjL3RhYi1wYW5lLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD05MTQ1YTA3MCYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvdGFicy9zcmMvdGFiLXBhbmUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHRhYl9wYW5ldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbFRhYlBhbmUnLGNvbXBvbmVudE5hbWU6J0VsVGFiUGFuZScscHJvcHM6e2xhYmVsOlN0cmluZyxsYWJlbENvbnRlbnQ6RnVuY3Rpb24sbmFtZTpTdHJpbmcsY2xvc2FibGU6Qm9vbGVhbixkaXNhYmxlZDpCb29sZWFuLGxhenk6Qm9vbGVhbn0sZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue2luZGV4Om51bGwsbG9hZGVkOmZhbHNlfTt9LGNvbXB1dGVkOntpc0Nsb3NhYmxlOmZ1bmN0aW9uIGlzQ2xvc2FibGUoKXtyZXR1cm4gdGhpcy5jbG9zYWJsZXx8dGhpcy4kcGFyZW50LmNsb3NhYmxlO30sYWN0aXZlOmZ1bmN0aW9uIGFjdGl2ZSgpe3ZhciBhY3RpdmU9dGhpcy4kcGFyZW50LmN1cnJlbnROYW1lPT09KHRoaXMubmFtZXx8dGhpcy5pbmRleCk7aWYoYWN0aXZlKXt0aGlzLmxvYWRlZD10cnVlO31yZXR1cm4gYWN0aXZlO30scGFuZU5hbWU6ZnVuY3Rpb24gcGFuZU5hbWUoKXtyZXR1cm4gdGhpcy5uYW1lfHx0aGlzLmluZGV4O319LHVwZGF0ZWQ6ZnVuY3Rpb24gdXBkYXRlZCgpe3RoaXMuJHBhcmVudC4kZW1pdCgndGFiLW5hdi11cGRhdGUnKTt9fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYnMvc3JjL3RhYi1wYW5lLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfdGFiX3BhbmV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189dGFiX3BhbmV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90YWJzL3NyYy90YWItcGFuZS52dWUKLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciB0YWJfcGFuZV9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHNyY190YWJfcGFuZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyx0YWJfcGFuZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzkxNDVhMDcwX3JlbmRlcix0YWJfcGFuZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzkxNDVhMDcwX3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgdGFiX3BhbmVfYXBpO310YWJfcGFuZV9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL3RhYnMvc3JjL3RhYi1wYW5lLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciB0YWJfcGFuZT10YWJfcGFuZV9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYi1wYW5lL2luZGV4LmpzCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovdGFiX3BhbmUuaW5zdGFsbD1mdW5jdGlvbihWdWUpe1Z1ZS5jb21wb25lbnQodGFiX3BhbmUubmFtZSx0YWJfcGFuZSk7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX3RhYl9wYW5lPXRhYl9wYW5lOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3RhZy9zcmMvdGFnLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciB0YWd2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e25hbWU6J0VsVGFnJyxwcm9wczp7dGV4dDpTdHJpbmcsY2xvc2FibGU6Qm9vbGVhbix0eXBlOlN0cmluZyxoaXQ6Qm9vbGVhbixkaXNhYmxlVHJhbnNpdGlvbnM6Qm9vbGVhbixjb2xvcjpTdHJpbmcsc2l6ZTpTdHJpbmcsZWZmZWN0Ont0eXBlOlN0cmluZyxkZWZhdWx0OidsaWdodCcsdmFsaWRhdG9yOmZ1bmN0aW9uIHZhbGlkYXRvcih2YWwpe3JldHVyblsnZGFyaycsJ2xpZ2h0JywncGxhaW4nXS5pbmRleE9mKHZhbCkhPT0tMTt9fX0sbWV0aG9kczp7aGFuZGxlQ2xvc2U6ZnVuY3Rpb24gaGFuZGxlQ2xvc2UoZXZlbnQpe2V2ZW50LnN0b3BQcm9wYWdhdGlvbigpO3RoaXMuJGVtaXQoJ2Nsb3NlJyxldmVudCk7fSxoYW5kbGVDbGljazpmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCl7dGhpcy4kZW1pdCgnY2xpY2snLGV2ZW50KTt9fSxjb21wdXRlZDp7dGFnU2l6ZTpmdW5jdGlvbiB0YWdTaXplKCl7cmV0dXJuIHRoaXMuc2l6ZXx8KHRoaXMuJEVMRU1FTlR8fHt9KS5zaXplO319LHJlbmRlcjpmdW5jdGlvbiByZW5kZXIoaCl7dmFyIHR5cGU9dGhpcy50eXBlLHRhZ1NpemU9dGhpcy50YWdTaXplLGhpdD10aGlzLmhpdCxlZmZlY3Q9dGhpcy5lZmZlY3Q7dmFyIGNsYXNzZXM9WydlbC10YWcnLHR5cGU/J2VsLXRhZy0tJyt0eXBlOicnLHRhZ1NpemU/J2VsLXRhZy0tJyt0YWdTaXplOicnLGVmZmVjdD8nZWwtdGFnLS0nK2VmZmVjdDonJyxoaXQmJidpcy1oaXQnXTt2YXIgdGFnRWw9aCgnc3BhbicseydjbGFzcyc6Y2xhc3NlcyxzdHlsZTp7YmFja2dyb3VuZENvbG9yOnRoaXMuY29sb3J9LG9uOnsnY2xpY2snOnRoaXMuaGFuZGxlQ2xpY2t9fSxbdGhpcy4kc2xvdHMuZGVmYXVsdCx0aGlzLmNsb3NhYmxlJiZoKCdpJyx7J2NsYXNzJzonZWwtdGFnX19jbG9zZSBlbC1pY29uLWNsb3NlJyxvbjp7J2NsaWNrJzp0aGlzLmhhbmRsZUNsb3NlfX0pXSk7cmV0dXJuIHRoaXMuZGlzYWJsZVRyYW5zaXRpb25zP3RhZ0VsOmgoJ3RyYW5zaXRpb24nLHthdHRyczp7bmFtZTonZWwtem9vbS1pbi1jZW50ZXInfX0sW3RhZ0VsXSk7fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90YWcvc3JjL3RhZy52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc3JjX3RhZ3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz10YWd2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90YWcvc3JjL3RhZy52dWUKdmFyIHRhZ19yZW5kZXIsdGFnX3N0YXRpY1JlbmRlckZuczsvKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIHRhZ19jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHNyY190YWd2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sdGFnX3JlbmRlcix0YWdfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciB0YWdfYXBpO310YWdfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy90YWcvc3JjL3RhZy52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgdGFnPXRhZ19jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhZy9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL3RhZy5pbnN0YWxsPWZ1bmN0aW9uKFZ1ZSl7VnVlLmNvbXBvbmVudCh0YWcubmFtZSx0YWcpO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYWNrYWdlc190YWc9dGFnOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvdHJlZS9zcmMvdHJlZS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NTQ3NTc1YTYmCnZhciB0cmVldnVlX3R5cGVfdGVtcGxhdGVfaWRfNTQ3NTc1YTZfcmVuZGVyPWZ1bmN0aW9uIHRyZWV2dWVfdHlwZV90ZW1wbGF0ZV9pZF81NDc1NzVhNl9yZW5kZXIoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDt2YXIgX2M9X3ZtLl9zZWxmLl9jfHxfaDtyZXR1cm4gX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC10cmVlIixjbGFzczp7ImVsLXRyZWUtLWhpZ2hsaWdodC1jdXJyZW50Ijpfdm0uaGlnaGxpZ2h0Q3VycmVudCwiaXMtZHJhZ2dpbmciOiEhX3ZtLmRyYWdTdGF0ZS5kcmFnZ2luZ05vZGUsImlzLWRyb3Atbm90LWFsbG93IjohX3ZtLmRyYWdTdGF0ZS5hbGxvd0Ryb3AsImlzLWRyb3AtaW5uZXIiOl92bS5kcmFnU3RhdGUuZHJvcFR5cGU9PT0iaW5uZXIifSxhdHRyczp7cm9sZToidHJlZSJ9fSxbX3ZtLl9sKF92bS5yb290LmNoaWxkTm9kZXMsZnVuY3Rpb24oY2hpbGQpe3JldHVybiBfYygiZWwtdHJlZS1ub2RlIix7a2V5Ol92bS5nZXROb2RlS2V5KGNoaWxkKSxhdHRyczp7bm9kZTpjaGlsZCxwcm9wczpfdm0ucHJvcHMsInJlbmRlci1hZnRlci1leHBhbmQiOl92bS5yZW5kZXJBZnRlckV4cGFuZCwic2hvdy1jaGVja2JveCI6X3ZtLnNob3dDaGVja2JveCwicmVuZGVyLWNvbnRlbnQiOl92bS5yZW5kZXJDb250ZW50fSxvbjp7Im5vZGUtZXhwYW5kIjpfdm0uaGFuZGxlTm9kZUV4cGFuZH19KTt9KSxfdm0uaXNFbXB0eT9fYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXRyZWVfX2VtcHR5LWJsb2NrIn0sW19jKCJzcGFuIix7c3RhdGljQ2xhc3M6ImVsLXRyZWVfX2VtcHR5LXRleHQifSxbX3ZtLl92KF92bS5fcyhfdm0uZW1wdHlUZXh0KSldKV0pOl92bS5fZSgpLF9jKCJkaXYiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTpfdm0uZHJhZ1N0YXRlLnNob3dEcm9wSW5kaWNhdG9yLGV4cHJlc3Npb246ImRyYWdTdGF0ZS5zaG93RHJvcEluZGljYXRvciJ9XSxyZWY6ImRyb3BJbmRpY2F0b3IiLHN0YXRpY0NsYXNzOiJlbC10cmVlX19kcm9wLWluZGljYXRvciJ9KV0sMik7fTt2YXIgdHJlZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzU0NzU3NWE2X3N0YXRpY1JlbmRlckZucz1bXTt0cmVldnVlX3R5cGVfdGVtcGxhdGVfaWRfNTQ3NTc1YTZfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RyZWUvc3JjL3RyZWUudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTU0NzU3NWE2JgovLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RyZWUvc3JjL21vZGVsL3V0aWwuanMKdmFyIE5PREVfS0VZPSckdHJlZU5vZGVJZCc7dmFyIG1hcmtOb2RlRGF0YT1mdW5jdGlvbiBtYXJrTm9kZURhdGEobm9kZSxkYXRhKXtpZighZGF0YXx8ZGF0YVtOT0RFX0tFWV0pcmV0dXJuO09iamVjdC5kZWZpbmVQcm9wZXJ0eShkYXRhLE5PREVfS0VZLHt2YWx1ZTpub2RlLmlkLGVudW1lcmFibGU6ZmFsc2UsY29uZmlndXJhYmxlOmZhbHNlLHdyaXRhYmxlOmZhbHNlfSk7fTt2YXIgdXRpbF9nZXROb2RlS2V5PWZ1bmN0aW9uIGdldE5vZGVLZXkoa2V5LGRhdGEpe2lmKCFrZXkpcmV0dXJuIGRhdGFbTk9ERV9LRVldO3JldHVybiBkYXRhW2tleV07fTt2YXIgZmluZE5lYXJlc3RDb21wb25lbnQ9ZnVuY3Rpb24gZmluZE5lYXJlc3RDb21wb25lbnQoZWxlbWVudCxjb21wb25lbnROYW1lKXt2YXIgdGFyZ2V0PWVsZW1lbnQ7d2hpbGUodGFyZ2V0JiZ0YXJnZXQudGFnTmFtZSE9PSdCT0RZJyl7aWYodGFyZ2V0Ll9fdnVlX18mJnRhcmdldC5fX3Z1ZV9fLiRvcHRpb25zLm5hbWU9PT1jb21wb25lbnROYW1lKXtyZXR1cm4gdGFyZ2V0Ll9fdnVlX187fXRhcmdldD10YXJnZXQucGFyZW50Tm9kZTt9cmV0dXJuIG51bGw7fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RyZWUvc3JjL21vZGVsL25vZGUuanMKdmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoInZhbHVlImluIGRlc2NyaXB0b3IpZGVzY3JpcHRvci53cml0YWJsZT10cnVlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsZGVzY3JpcHRvci5rZXksZGVzY3JpcHRvcik7fX1yZXR1cm4gZnVuY3Rpb24oQ29uc3RydWN0b3IscHJvdG9Qcm9wcyxzdGF0aWNQcm9wcyl7aWYocHJvdG9Qcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSxwcm90b1Byb3BzKTtpZihzdGF0aWNQcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLHN0YXRpY1Byb3BzKTtyZXR1cm4gQ29uc3RydWN0b3I7fTt9KCk7ZnVuY3Rpb24gbm9kZV9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSxDb25zdHJ1Y3Rvcil7aWYoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7fX12YXIgZ2V0Q2hpbGRTdGF0ZT1mdW5jdGlvbiBnZXRDaGlsZFN0YXRlKG5vZGUpe3ZhciBhbGw9dHJ1ZTt2YXIgbm9uZT10cnVlO3ZhciBhbGxXaXRob3V0RGlzYWJsZT10cnVlO2Zvcih2YXIgaT0wLGo9bm9kZS5sZW5ndGg7aTxqO2krKyl7dmFyIG49bm9kZVtpXTtpZihuLmNoZWNrZWQhPT10cnVlfHxuLmluZGV0ZXJtaW5hdGUpe2FsbD1mYWxzZTtpZighbi5kaXNhYmxlZCl7YWxsV2l0aG91dERpc2FibGU9ZmFsc2U7fX1pZihuLmNoZWNrZWQhPT1mYWxzZXx8bi5pbmRldGVybWluYXRlKXtub25lPWZhbHNlO319cmV0dXJue2FsbDphbGwsbm9uZTpub25lLGFsbFdpdGhvdXREaXNhYmxlOmFsbFdpdGhvdXREaXNhYmxlLGhhbGY6IWFsbCYmIW5vbmV9O307dmFyIHJlSW5pdENoZWNrZWQ9ZnVuY3Rpb24gcmVJbml0Q2hlY2tlZChub2RlKXtpZihub2RlLmNoaWxkTm9kZXMubGVuZ3RoPT09MClyZXR1cm47dmFyIF9nZXRDaGlsZFN0YXRlPWdldENoaWxkU3RhdGUobm9kZS5jaGlsZE5vZGVzKSxhbGw9X2dldENoaWxkU3RhdGUuYWxsLG5vbmU9X2dldENoaWxkU3RhdGUubm9uZSxoYWxmPV9nZXRDaGlsZFN0YXRlLmhhbGY7aWYoYWxsKXtub2RlLmNoZWNrZWQ9dHJ1ZTtub2RlLmluZGV0ZXJtaW5hdGU9ZmFsc2U7fWVsc2UgaWYoaGFsZil7bm9kZS5jaGVja2VkPWZhbHNlO25vZGUuaW5kZXRlcm1pbmF0ZT10cnVlO31lbHNlIGlmKG5vbmUpe25vZGUuY2hlY2tlZD1mYWxzZTtub2RlLmluZGV0ZXJtaW5hdGU9ZmFsc2U7fXZhciBwYXJlbnQ9bm9kZS5wYXJlbnQ7aWYoIXBhcmVudHx8cGFyZW50LmxldmVsPT09MClyZXR1cm47aWYoIW5vZGUuc3RvcmUuY2hlY2tTdHJpY3RseSl7cmVJbml0Q2hlY2tlZChwYXJlbnQpO319O3ZhciBnZXRQcm9wZXJ0eUZyb21EYXRhPWZ1bmN0aW9uIGdldFByb3BlcnR5RnJvbURhdGEobm9kZSxwcm9wKXt2YXIgcHJvcHM9bm9kZS5zdG9yZS5wcm9wczt2YXIgZGF0YT1ub2RlLmRhdGF8fHt9O3ZhciBjb25maWc9cHJvcHNbcHJvcF07aWYodHlwZW9mIGNvbmZpZz09PSdmdW5jdGlvbicpe3JldHVybiBjb25maWcoZGF0YSxub2RlKTt9ZWxzZSBpZih0eXBlb2YgY29uZmlnPT09J3N0cmluZycpe3JldHVybiBkYXRhW2NvbmZpZ107fWVsc2UgaWYodHlwZW9mIGNvbmZpZz09PSd1bmRlZmluZWQnKXt2YXIgZGF0YVByb3A9ZGF0YVtwcm9wXTtyZXR1cm4gZGF0YVByb3A9PT11bmRlZmluZWQ/Jyc6ZGF0YVByb3A7fX07dmFyIG5vZGVJZFNlZWQ9MDt2YXIgbm9kZV9Ob2RlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gTm9kZShvcHRpb25zKXtub2RlX2NsYXNzQ2FsbENoZWNrKHRoaXMsTm9kZSk7dGhpcy5pZD1ub2RlSWRTZWVkKys7dGhpcy50ZXh0PW51bGw7dGhpcy5jaGVja2VkPWZhbHNlO3RoaXMuaW5kZXRlcm1pbmF0ZT1mYWxzZTt0aGlzLmRhdGE9bnVsbDt0aGlzLmV4cGFuZGVkPWZhbHNlO3RoaXMucGFyZW50PW51bGw7dGhpcy52aXNpYmxlPXRydWU7dGhpcy5pc0N1cnJlbnQ9ZmFsc2U7Zm9yKHZhciBuYW1lIGluIG9wdGlvbnMpe2lmKG9wdGlvbnMuaGFzT3duUHJvcGVydHkobmFtZSkpe3RoaXNbbmFtZV09b3B0aW9uc1tuYW1lXTt9fS8vIGludGVybmFsCnRoaXMubGV2ZWw9MDt0aGlzLmxvYWRlZD1mYWxzZTt0aGlzLmNoaWxkTm9kZXM9W107dGhpcy5sb2FkaW5nPWZhbHNlO2lmKHRoaXMucGFyZW50KXt0aGlzLmxldmVsPXRoaXMucGFyZW50LmxldmVsKzE7fXZhciBzdG9yZT10aGlzLnN0b3JlO2lmKCFzdG9yZSl7dGhyb3cgbmV3IEVycm9yKCdbTm9kZV1zdG9yZSBpcyByZXF1aXJlZCEnKTt9c3RvcmUucmVnaXN0ZXJOb2RlKHRoaXMpO3ZhciBwcm9wcz1zdG9yZS5wcm9wcztpZihwcm9wcyYmdHlwZW9mIHByb3BzLmlzTGVhZiE9PSd1bmRlZmluZWQnKXt2YXIgaXNMZWFmPWdldFByb3BlcnR5RnJvbURhdGEodGhpcywnaXNMZWFmJyk7aWYodHlwZW9mIGlzTGVhZj09PSdib29sZWFuJyl7dGhpcy5pc0xlYWZCeVVzZXI9aXNMZWFmO319aWYoc3RvcmUubGF6eSE9PXRydWUmJnRoaXMuZGF0YSl7dGhpcy5zZXREYXRhKHRoaXMuZGF0YSk7aWYoc3RvcmUuZGVmYXVsdEV4cGFuZEFsbCl7dGhpcy5leHBhbmRlZD10cnVlO319ZWxzZSBpZih0aGlzLmxldmVsPjAmJnN0b3JlLmxhenkmJnN0b3JlLmRlZmF1bHRFeHBhbmRBbGwpe3RoaXMuZXhwYW5kKCk7fWlmKCFBcnJheS5pc0FycmF5KHRoaXMuZGF0YSkpe21hcmtOb2RlRGF0YSh0aGlzLHRoaXMuZGF0YSk7fWlmKCF0aGlzLmRhdGEpcmV0dXJuO3ZhciBkZWZhdWx0RXhwYW5kZWRLZXlzPXN0b3JlLmRlZmF1bHRFeHBhbmRlZEtleXM7dmFyIGtleT1zdG9yZS5rZXk7aWYoa2V5JiZkZWZhdWx0RXhwYW5kZWRLZXlzJiZkZWZhdWx0RXhwYW5kZWRLZXlzLmluZGV4T2YodGhpcy5rZXkpIT09LTEpe3RoaXMuZXhwYW5kKG51bGwsc3RvcmUuYXV0b0V4cGFuZFBhcmVudCk7fWlmKGtleSYmc3RvcmUuY3VycmVudE5vZGVLZXkhPT11bmRlZmluZWQmJnRoaXMua2V5PT09c3RvcmUuY3VycmVudE5vZGVLZXkpe3N0b3JlLmN1cnJlbnROb2RlPXRoaXM7c3RvcmUuY3VycmVudE5vZGUuaXNDdXJyZW50PXRydWU7fWlmKHN0b3JlLmxhenkpe3N0b3JlLl9pbml0RGVmYXVsdENoZWNrZWROb2RlKHRoaXMpO310aGlzLnVwZGF0ZUxlYWZTdGF0ZSgpO31Ob2RlLnByb3RvdHlwZS5zZXREYXRhPWZ1bmN0aW9uIHNldERhdGEoZGF0YSl7aWYoIUFycmF5LmlzQXJyYXkoZGF0YSkpe21hcmtOb2RlRGF0YSh0aGlzLGRhdGEpO310aGlzLmRhdGE9ZGF0YTt0aGlzLmNoaWxkTm9kZXM9W107dmFyIGNoaWxkcmVuPXZvaWQgMDtpZih0aGlzLmxldmVsPT09MCYmdGhpcy5kYXRhIGluc3RhbmNlb2YgQXJyYXkpe2NoaWxkcmVuPXRoaXMuZGF0YTt9ZWxzZXtjaGlsZHJlbj1nZXRQcm9wZXJ0eUZyb21EYXRhKHRoaXMsJ2NoaWxkcmVuJyl8fFtdO31mb3IodmFyIGk9MCxqPWNoaWxkcmVuLmxlbmd0aDtpPGo7aSsrKXt0aGlzLmluc2VydENoaWxkKHtkYXRhOmNoaWxkcmVuW2ldfSk7fX07Tm9kZS5wcm90b3R5cGUuY29udGFpbnM9ZnVuY3Rpb24gY29udGFpbnModGFyZ2V0KXt2YXIgZGVlcD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMV06dHJ1ZTt2YXIgd2Fsaz1mdW5jdGlvbiB3YWxrKHBhcmVudCl7dmFyIGNoaWxkcmVuPXBhcmVudC5jaGlsZE5vZGVzfHxbXTt2YXIgcmVzdWx0PWZhbHNlO2Zvcih2YXIgaT0wLGo9Y2hpbGRyZW4ubGVuZ3RoO2k8ajtpKyspe3ZhciBjaGlsZD1jaGlsZHJlbltpXTtpZihjaGlsZD09PXRhcmdldHx8ZGVlcCYmd2FsayhjaGlsZCkpe3Jlc3VsdD10cnVlO2JyZWFrO319cmV0dXJuIHJlc3VsdDt9O3JldHVybiB3YWxrKHRoaXMpO307Tm9kZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uIHJlbW92ZSgpe3ZhciBwYXJlbnQ9dGhpcy5wYXJlbnQ7aWYocGFyZW50KXtwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7fX07Tm9kZS5wcm90b3R5cGUuaW5zZXJ0Q2hpbGQ9ZnVuY3Rpb24gaW5zZXJ0Q2hpbGQoY2hpbGQsaW5kZXgsYmF0Y2gpe2lmKCFjaGlsZCl0aHJvdyBuZXcgRXJyb3IoJ2luc2VydENoaWxkIGVycm9yOiBjaGlsZCBpcyByZXF1aXJlZC4nKTtpZighKGNoaWxkIGluc3RhbmNlb2YgTm9kZSkpe2lmKCFiYXRjaCl7dmFyIGNoaWxkcmVuPXRoaXMuZ2V0Q2hpbGRyZW4odHJ1ZSk7aWYoY2hpbGRyZW4uaW5kZXhPZihjaGlsZC5kYXRhKT09PS0xKXtpZih0eXBlb2YgaW5kZXg9PT0ndW5kZWZpbmVkJ3x8aW5kZXg8MCl7Y2hpbGRyZW4ucHVzaChjaGlsZC5kYXRhKTt9ZWxzZXtjaGlsZHJlbi5zcGxpY2UoaW5kZXgsMCxjaGlsZC5kYXRhKTt9fX1tZXJnZV9kZWZhdWx0KCkoY2hpbGQse3BhcmVudDp0aGlzLHN0b3JlOnRoaXMuc3RvcmV9KTtjaGlsZD1uZXcgTm9kZShjaGlsZCk7fWNoaWxkLmxldmVsPXRoaXMubGV2ZWwrMTtpZih0eXBlb2YgaW5kZXg9PT0ndW5kZWZpbmVkJ3x8aW5kZXg8MCl7dGhpcy5jaGlsZE5vZGVzLnB1c2goY2hpbGQpO31lbHNle3RoaXMuY2hpbGROb2Rlcy5zcGxpY2UoaW5kZXgsMCxjaGlsZCk7fXRoaXMudXBkYXRlTGVhZlN0YXRlKCk7fTtOb2RlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmU9ZnVuY3Rpb24gaW5zZXJ0QmVmb3JlKGNoaWxkLHJlZil7dmFyIGluZGV4PXZvaWQgMDtpZihyZWYpe2luZGV4PXRoaXMuY2hpbGROb2Rlcy5pbmRleE9mKHJlZik7fXRoaXMuaW5zZXJ0Q2hpbGQoY2hpbGQsaW5kZXgpO307Tm9kZS5wcm90b3R5cGUuaW5zZXJ0QWZ0ZXI9ZnVuY3Rpb24gaW5zZXJ0QWZ0ZXIoY2hpbGQscmVmKXt2YXIgaW5kZXg9dm9pZCAwO2lmKHJlZil7aW5kZXg9dGhpcy5jaGlsZE5vZGVzLmluZGV4T2YocmVmKTtpZihpbmRleCE9PS0xKWluZGV4Kz0xO310aGlzLmluc2VydENoaWxkKGNoaWxkLGluZGV4KTt9O05vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkPWZ1bmN0aW9uIHJlbW92ZUNoaWxkKGNoaWxkKXt2YXIgY2hpbGRyZW49dGhpcy5nZXRDaGlsZHJlbigpfHxbXTt2YXIgZGF0YUluZGV4PWNoaWxkcmVuLmluZGV4T2YoY2hpbGQuZGF0YSk7aWYoZGF0YUluZGV4Pi0xKXtjaGlsZHJlbi5zcGxpY2UoZGF0YUluZGV4LDEpO312YXIgaW5kZXg9dGhpcy5jaGlsZE5vZGVzLmluZGV4T2YoY2hpbGQpO2lmKGluZGV4Pi0xKXt0aGlzLnN0b3JlJiZ0aGlzLnN0b3JlLmRlcmVnaXN0ZXJOb2RlKGNoaWxkKTtjaGlsZC5wYXJlbnQ9bnVsbDt0aGlzLmNoaWxkTm9kZXMuc3BsaWNlKGluZGV4LDEpO310aGlzLnVwZGF0ZUxlYWZTdGF0ZSgpO307Tm9kZS5wcm90b3R5cGUucmVtb3ZlQ2hpbGRCeURhdGE9ZnVuY3Rpb24gcmVtb3ZlQ2hpbGRCeURhdGEoZGF0YSl7dmFyIHRhcmdldE5vZGU9bnVsbDtmb3IodmFyIGk9MDtpPHRoaXMuY2hpbGROb2Rlcy5sZW5ndGg7aSsrKXtpZih0aGlzLmNoaWxkTm9kZXNbaV0uZGF0YT09PWRhdGEpe3RhcmdldE5vZGU9dGhpcy5jaGlsZE5vZGVzW2ldO2JyZWFrO319aWYodGFyZ2V0Tm9kZSl7dGhpcy5yZW1vdmVDaGlsZCh0YXJnZXROb2RlKTt9fTtOb2RlLnByb3RvdHlwZS5leHBhbmQ9ZnVuY3Rpb24gZXhwYW5kKGNhbGxiYWNrLGV4cGFuZFBhcmVudCl7dmFyIF90aGlzPXRoaXM7dmFyIGRvbmU9ZnVuY3Rpb24gZG9uZSgpe2lmKGV4cGFuZFBhcmVudCl7dmFyIHBhcmVudD1fdGhpcy5wYXJlbnQ7d2hpbGUocGFyZW50LmxldmVsPjApe3BhcmVudC5leHBhbmRlZD10cnVlO3BhcmVudD1wYXJlbnQucGFyZW50O319X3RoaXMuZXhwYW5kZWQ9dHJ1ZTtpZihjYWxsYmFjayljYWxsYmFjaygpO307aWYodGhpcy5zaG91bGRMb2FkRGF0YSgpKXt0aGlzLmxvYWREYXRhKGZ1bmN0aW9uKGRhdGEpe2lmKGRhdGEgaW5zdGFuY2VvZiBBcnJheSl7aWYoX3RoaXMuY2hlY2tlZCl7X3RoaXMuc2V0Q2hlY2tlZCh0cnVlLHRydWUpO31lbHNlIGlmKCFfdGhpcy5zdG9yZS5jaGVja1N0cmljdGx5KXtyZUluaXRDaGVja2VkKF90aGlzKTt9ZG9uZSgpO319KTt9ZWxzZXtkb25lKCk7fX07Tm9kZS5wcm90b3R5cGUuZG9DcmVhdGVDaGlsZHJlbj1mdW5jdGlvbiBkb0NyZWF0ZUNoaWxkcmVuKGFycmF5KXt2YXIgX3RoaXMyPXRoaXM7dmFyIGRlZmF1bHRQcm9wcz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMV06e307YXJyYXkuZm9yRWFjaChmdW5jdGlvbihpdGVtKXtfdGhpczIuaW5zZXJ0Q2hpbGQobWVyZ2VfZGVmYXVsdCgpKHtkYXRhOml0ZW19LGRlZmF1bHRQcm9wcyksdW5kZWZpbmVkLHRydWUpO30pO307Tm9kZS5wcm90b3R5cGUuY29sbGFwc2U9ZnVuY3Rpb24gY29sbGFwc2UoKXt0aGlzLmV4cGFuZGVkPWZhbHNlO307Tm9kZS5wcm90b3R5cGUuc2hvdWxkTG9hZERhdGE9ZnVuY3Rpb24gc2hvdWxkTG9hZERhdGEoKXtyZXR1cm4gdGhpcy5zdG9yZS5sYXp5PT09dHJ1ZSYmdGhpcy5zdG9yZS5sb2FkJiYhdGhpcy5sb2FkZWQ7fTtOb2RlLnByb3RvdHlwZS51cGRhdGVMZWFmU3RhdGU9ZnVuY3Rpb24gdXBkYXRlTGVhZlN0YXRlKCl7aWYodGhpcy5zdG9yZS5sYXp5PT09dHJ1ZSYmdGhpcy5sb2FkZWQhPT10cnVlJiZ0eXBlb2YgdGhpcy5pc0xlYWZCeVVzZXIhPT0ndW5kZWZpbmVkJyl7dGhpcy5pc0xlYWY9dGhpcy5pc0xlYWZCeVVzZXI7cmV0dXJuO312YXIgY2hpbGROb2Rlcz10aGlzLmNoaWxkTm9kZXM7aWYoIXRoaXMuc3RvcmUubGF6eXx8dGhpcy5zdG9yZS5sYXp5PT09dHJ1ZSYmdGhpcy5sb2FkZWQ9PT10cnVlKXt0aGlzLmlzTGVhZj0hY2hpbGROb2Rlc3x8Y2hpbGROb2Rlcy5sZW5ndGg9PT0wO3JldHVybjt9dGhpcy5pc0xlYWY9ZmFsc2U7fTtOb2RlLnByb3RvdHlwZS5zZXRDaGVja2VkPWZ1bmN0aW9uIHNldENoZWNrZWQodmFsdWUsZGVlcCxyZWN1cnNpb24scGFzc1ZhbHVlKXt2YXIgX3RoaXMzPXRoaXM7dGhpcy5pbmRldGVybWluYXRlPXZhbHVlPT09J2hhbGYnO3RoaXMuY2hlY2tlZD12YWx1ZT09PXRydWU7aWYodGhpcy5zdG9yZS5jaGVja1N0cmljdGx5KXJldHVybjtpZighKHRoaXMuc2hvdWxkTG9hZERhdGEoKSYmIXRoaXMuc3RvcmUuY2hlY2tEZXNjZW5kYW50cykpe3ZhciBfZ2V0Q2hpbGRTdGF0ZTI9Z2V0Q2hpbGRTdGF0ZSh0aGlzLmNoaWxkTm9kZXMpLGFsbD1fZ2V0Q2hpbGRTdGF0ZTIuYWxsLGFsbFdpdGhvdXREaXNhYmxlPV9nZXRDaGlsZFN0YXRlMi5hbGxXaXRob3V0RGlzYWJsZTtpZighdGhpcy5pc0xlYWYmJiFhbGwmJmFsbFdpdGhvdXREaXNhYmxlKXt0aGlzLmNoZWNrZWQ9ZmFsc2U7dmFsdWU9ZmFsc2U7fXZhciBoYW5kbGVEZXNjZW5kYW50cz1mdW5jdGlvbiBoYW5kbGVEZXNjZW5kYW50cygpe2lmKGRlZXApe3ZhciBjaGlsZE5vZGVzPV90aGlzMy5jaGlsZE5vZGVzO2Zvcih2YXIgaT0wLGo9Y2hpbGROb2Rlcy5sZW5ndGg7aTxqO2krKyl7dmFyIGNoaWxkPWNoaWxkTm9kZXNbaV07cGFzc1ZhbHVlPXBhc3NWYWx1ZXx8dmFsdWUhPT1mYWxzZTt2YXIgaXNDaGVjaz1jaGlsZC5kaXNhYmxlZD9jaGlsZC5jaGVja2VkOnBhc3NWYWx1ZTtjaGlsZC5zZXRDaGVja2VkKGlzQ2hlY2ssZGVlcCx0cnVlLHBhc3NWYWx1ZSk7fXZhciBfZ2V0Q2hpbGRTdGF0ZTM9Z2V0Q2hpbGRTdGF0ZShjaGlsZE5vZGVzKSxoYWxmPV9nZXRDaGlsZFN0YXRlMy5oYWxmLF9hbGw9X2dldENoaWxkU3RhdGUzLmFsbDtpZighX2FsbCl7X3RoaXMzLmNoZWNrZWQ9X2FsbDtfdGhpczMuaW5kZXRlcm1pbmF0ZT1oYWxmO319fTtpZih0aGlzLnNob3VsZExvYWREYXRhKCkpey8vIE9ubHkgd29yayBvbiBsYXp5IGxvYWQgZGF0YS4KdGhpcy5sb2FkRGF0YShmdW5jdGlvbigpe2hhbmRsZURlc2NlbmRhbnRzKCk7cmVJbml0Q2hlY2tlZChfdGhpczMpO30se2NoZWNrZWQ6dmFsdWUhPT1mYWxzZX0pO3JldHVybjt9ZWxzZXtoYW5kbGVEZXNjZW5kYW50cygpO319dmFyIHBhcmVudD10aGlzLnBhcmVudDtpZighcGFyZW50fHxwYXJlbnQubGV2ZWw9PT0wKXJldHVybjtpZighcmVjdXJzaW9uKXtyZUluaXRDaGVja2VkKHBhcmVudCk7fX07Tm9kZS5wcm90b3R5cGUuZ2V0Q2hpbGRyZW49ZnVuY3Rpb24gZ2V0Q2hpbGRyZW4oKXt2YXIgZm9yY2VJbml0PWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dW5kZWZpbmVkP2FyZ3VtZW50c1swXTpmYWxzZTsvLyB0aGlzIGlzIGRhdGEKaWYodGhpcy5sZXZlbD09PTApcmV0dXJuIHRoaXMuZGF0YTt2YXIgZGF0YT10aGlzLmRhdGE7aWYoIWRhdGEpcmV0dXJuIG51bGw7dmFyIHByb3BzPXRoaXMuc3RvcmUucHJvcHM7dmFyIGNoaWxkcmVuPSdjaGlsZHJlbic7aWYocHJvcHMpe2NoaWxkcmVuPXByb3BzLmNoaWxkcmVufHwnY2hpbGRyZW4nO31pZihkYXRhW2NoaWxkcmVuXT09PXVuZGVmaW5lZCl7ZGF0YVtjaGlsZHJlbl09bnVsbDt9aWYoZm9yY2VJbml0JiYhZGF0YVtjaGlsZHJlbl0pe2RhdGFbY2hpbGRyZW5dPVtdO31yZXR1cm4gZGF0YVtjaGlsZHJlbl07fTtOb2RlLnByb3RvdHlwZS51cGRhdGVDaGlsZHJlbj1mdW5jdGlvbiB1cGRhdGVDaGlsZHJlbigpe3ZhciBfdGhpczQ9dGhpczt2YXIgbmV3RGF0YT10aGlzLmdldENoaWxkcmVuKCl8fFtdO3ZhciBvbGREYXRhPXRoaXMuY2hpbGROb2Rlcy5tYXAoZnVuY3Rpb24obm9kZSl7cmV0dXJuIG5vZGUuZGF0YTt9KTt2YXIgbmV3RGF0YU1hcD17fTt2YXIgbmV3Tm9kZXM9W107bmV3RGF0YS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0saW5kZXgpe3ZhciBrZXk9aXRlbVtOT0RFX0tFWV07dmFyIGlzTm9kZUV4aXN0cz0hIWtleSYmT2JqZWN0KHV0aWxfWyJhcnJheUZpbmRJbmRleCJdKShvbGREYXRhLGZ1bmN0aW9uKGRhdGEpe3JldHVybiBkYXRhW05PREVfS0VZXT09PWtleTt9KT49MDtpZihpc05vZGVFeGlzdHMpe25ld0RhdGFNYXBba2V5XT17aW5kZXg6aW5kZXgsZGF0YTppdGVtfTt9ZWxzZXtuZXdOb2Rlcy5wdXNoKHtpbmRleDppbmRleCxkYXRhOml0ZW19KTt9fSk7aWYoIXRoaXMuc3RvcmUubGF6eSl7b2xkRGF0YS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pe2lmKCFuZXdEYXRhTWFwW2l0ZW1bTk9ERV9LRVldXSlfdGhpczQucmVtb3ZlQ2hpbGRCeURhdGEoaXRlbSk7fSk7fW5ld05vZGVzLmZvckVhY2goZnVuY3Rpb24oX3JlZil7dmFyIGluZGV4PV9yZWYuaW5kZXgsZGF0YT1fcmVmLmRhdGE7X3RoaXM0Lmluc2VydENoaWxkKHtkYXRhOmRhdGF9LGluZGV4KTt9KTt0aGlzLnVwZGF0ZUxlYWZTdGF0ZSgpO307Tm9kZS5wcm90b3R5cGUubG9hZERhdGE9ZnVuY3Rpb24gbG9hZERhdGEoY2FsbGJhY2spe3ZhciBfdGhpczU9dGhpczt2YXIgZGVmYXVsdFByb3BzPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dW5kZWZpbmVkP2FyZ3VtZW50c1sxXTp7fTtpZih0aGlzLnN0b3JlLmxhenk9PT10cnVlJiZ0aGlzLnN0b3JlLmxvYWQmJiF0aGlzLmxvYWRlZCYmKCF0aGlzLmxvYWRpbmd8fE9iamVjdC5rZXlzKGRlZmF1bHRQcm9wcykubGVuZ3RoKSl7dGhpcy5sb2FkaW5nPXRydWU7dmFyIHJlc29sdmU9ZnVuY3Rpb24gcmVzb2x2ZShjaGlsZHJlbil7X3RoaXM1LmxvYWRlZD10cnVlO190aGlzNS5sb2FkaW5nPWZhbHNlO190aGlzNS5jaGlsZE5vZGVzPVtdO190aGlzNS5kb0NyZWF0ZUNoaWxkcmVuKGNoaWxkcmVuLGRlZmF1bHRQcm9wcyk7X3RoaXM1LnVwZGF0ZUxlYWZTdGF0ZSgpO2lmKGNhbGxiYWNrKXtjYWxsYmFjay5jYWxsKF90aGlzNSxjaGlsZHJlbik7fX07dGhpcy5zdG9yZS5sb2FkKHRoaXMscmVzb2x2ZSk7fWVsc2V7aWYoY2FsbGJhY2spe2NhbGxiYWNrLmNhbGwodGhpcyk7fX19O19jcmVhdGVDbGFzcyhOb2RlLFt7a2V5OidsYWJlbCcsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBnZXRQcm9wZXJ0eUZyb21EYXRhKHRoaXMsJ2xhYmVsJyk7fX0se2tleTona2V5JyxnZXQ6ZnVuY3Rpb24gZ2V0KCl7dmFyIG5vZGVLZXk9dGhpcy5zdG9yZS5rZXk7aWYodGhpcy5kYXRhKXJldHVybiB0aGlzLmRhdGFbbm9kZUtleV07cmV0dXJuIG51bGw7fX0se2tleTonZGlzYWJsZWQnLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gZ2V0UHJvcGVydHlGcm9tRGF0YSh0aGlzLCdkaXNhYmxlZCcpO319LHtrZXk6J25leHRTaWJsaW5nJyxnZXQ6ZnVuY3Rpb24gZ2V0KCl7dmFyIHBhcmVudD10aGlzLnBhcmVudDtpZihwYXJlbnQpe3ZhciBpbmRleD1wYXJlbnQuY2hpbGROb2Rlcy5pbmRleE9mKHRoaXMpO2lmKGluZGV4Pi0xKXtyZXR1cm4gcGFyZW50LmNoaWxkTm9kZXNbaW5kZXgrMV07fX1yZXR1cm4gbnVsbDt9fSx7a2V5OidwcmV2aW91c1NpYmxpbmcnLGdldDpmdW5jdGlvbiBnZXQoKXt2YXIgcGFyZW50PXRoaXMucGFyZW50O2lmKHBhcmVudCl7dmFyIGluZGV4PXBhcmVudC5jaGlsZE5vZGVzLmluZGV4T2YodGhpcyk7aWYoaW5kZXg+LTEpe3JldHVybiBpbmRleD4wP3BhcmVudC5jaGlsZE5vZGVzW2luZGV4LTFdOm51bGw7fX1yZXR1cm4gbnVsbDt9fV0pO3JldHVybiBOb2RlO30oKTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIG1vZGVsX25vZGU9bm9kZV9Ob2RlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdHJlZS9zcmMvbW9kZWwvdHJlZS1zdG9yZS5qcwp2YXIgdHJlZV9zdG9yZV90eXBlb2Y9dHlwZW9mIFN5bWJvbD09PSJmdW5jdGlvbiImJl90eXBlb2YyKFN5bWJvbC5pdGVyYXRvcik9PT0ic3ltYm9sIj9mdW5jdGlvbihvYmope3JldHVybiBfdHlwZW9mMihvYmopO306ZnVuY3Rpb24ob2JqKXtyZXR1cm4gb2JqJiZ0eXBlb2YgU3ltYm9sPT09ImZ1bmN0aW9uIiYmb2JqLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZvYmohPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOl90eXBlb2YyKG9iaik7fTtmdW5jdGlvbiB0cmVlX3N0b3JlX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLENvbnN0cnVjdG9yKXtpZighKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTt9fXZhciB0cmVlX3N0b3JlX1RyZWVTdG9yZT1mdW5jdGlvbigpe2Z1bmN0aW9uIFRyZWVTdG9yZShvcHRpb25zKXt2YXIgX3RoaXM9dGhpczt0cmVlX3N0b3JlX2NsYXNzQ2FsbENoZWNrKHRoaXMsVHJlZVN0b3JlKTt0aGlzLmN1cnJlbnROb2RlPW51bGw7dGhpcy5jdXJyZW50Tm9kZUtleT1udWxsO2Zvcih2YXIgb3B0aW9uIGluIG9wdGlvbnMpe2lmKG9wdGlvbnMuaGFzT3duUHJvcGVydHkob3B0aW9uKSl7dGhpc1tvcHRpb25dPW9wdGlvbnNbb3B0aW9uXTt9fXRoaXMubm9kZXNNYXA9e307dGhpcy5yb290PW5ldyBtb2RlbF9ub2RlKHtkYXRhOnRoaXMuZGF0YSxzdG9yZTp0aGlzfSk7aWYodGhpcy5sYXp5JiZ0aGlzLmxvYWQpe3ZhciBsb2FkRm49dGhpcy5sb2FkO2xvYWRGbih0aGlzLnJvb3QsZnVuY3Rpb24oZGF0YSl7X3RoaXMucm9vdC5kb0NyZWF0ZUNoaWxkcmVuKGRhdGEpO190aGlzLl9pbml0RGVmYXVsdENoZWNrZWROb2RlcygpO30pO31lbHNle3RoaXMuX2luaXREZWZhdWx0Q2hlY2tlZE5vZGVzKCk7fX1UcmVlU3RvcmUucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbiBmaWx0ZXIodmFsdWUpe3ZhciBmaWx0ZXJOb2RlTWV0aG9kPXRoaXMuZmlsdGVyTm9kZU1ldGhvZDt2YXIgbGF6eT10aGlzLmxhenk7dmFyIHRyYXZlcnNlPWZ1bmN0aW9uIHRyYXZlcnNlKG5vZGUpe3ZhciBjaGlsZE5vZGVzPW5vZGUucm9vdD9ub2RlLnJvb3QuY2hpbGROb2Rlczpub2RlLmNoaWxkTm9kZXM7Y2hpbGROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGNoaWxkKXtjaGlsZC52aXNpYmxlPWZpbHRlck5vZGVNZXRob2QuY2FsbChjaGlsZCx2YWx1ZSxjaGlsZC5kYXRhLGNoaWxkKTt0cmF2ZXJzZShjaGlsZCk7fSk7aWYoIW5vZGUudmlzaWJsZSYmY2hpbGROb2Rlcy5sZW5ndGgpe3ZhciBhbGxIaWRkZW49dHJ1ZTthbGxIaWRkZW49IWNoaWxkTm9kZXMuc29tZShmdW5jdGlvbihjaGlsZCl7cmV0dXJuIGNoaWxkLnZpc2libGU7fSk7aWYobm9kZS5yb290KXtub2RlLnJvb3QudmlzaWJsZT1hbGxIaWRkZW49PT1mYWxzZTt9ZWxzZXtub2RlLnZpc2libGU9YWxsSGlkZGVuPT09ZmFsc2U7fX1pZighdmFsdWUpcmV0dXJuO2lmKG5vZGUudmlzaWJsZSYmIW5vZGUuaXNMZWFmJiYhbGF6eSlub2RlLmV4cGFuZCgpO307dHJhdmVyc2UodGhpcyk7fTtUcmVlU3RvcmUucHJvdG90eXBlLnNldERhdGE9ZnVuY3Rpb24gc2V0RGF0YShuZXdWYWwpe3ZhciBpbnN0YW5jZUNoYW5nZWQ9bmV3VmFsIT09dGhpcy5yb290LmRhdGE7aWYoaW5zdGFuY2VDaGFuZ2VkKXt0aGlzLnJvb3Quc2V0RGF0YShuZXdWYWwpO3RoaXMuX2luaXREZWZhdWx0Q2hlY2tlZE5vZGVzKCk7fWVsc2V7dGhpcy5yb290LnVwZGF0ZUNoaWxkcmVuKCk7fX07VHJlZVN0b3JlLnByb3RvdHlwZS5nZXROb2RlPWZ1bmN0aW9uIGdldE5vZGUoZGF0YSl7aWYoZGF0YSBpbnN0YW5jZW9mIG1vZGVsX25vZGUpcmV0dXJuIGRhdGE7dmFyIGtleT0odHlwZW9mIGRhdGE9PT0ndW5kZWZpbmVkJz8ndW5kZWZpbmVkJzp0cmVlX3N0b3JlX3R5cGVvZihkYXRhKSkhPT0nb2JqZWN0Jz9kYXRhOnV0aWxfZ2V0Tm9kZUtleSh0aGlzLmtleSxkYXRhKTtyZXR1cm4gdGhpcy5ub2Rlc01hcFtrZXldfHxudWxsO307VHJlZVN0b3JlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmU9ZnVuY3Rpb24gaW5zZXJ0QmVmb3JlKGRhdGEscmVmRGF0YSl7dmFyIHJlZk5vZGU9dGhpcy5nZXROb2RlKHJlZkRhdGEpO3JlZk5vZGUucGFyZW50Lmluc2VydEJlZm9yZSh7ZGF0YTpkYXRhfSxyZWZOb2RlKTt9O1RyZWVTdG9yZS5wcm90b3R5cGUuaW5zZXJ0QWZ0ZXI9ZnVuY3Rpb24gaW5zZXJ0QWZ0ZXIoZGF0YSxyZWZEYXRhKXt2YXIgcmVmTm9kZT10aGlzLmdldE5vZGUocmVmRGF0YSk7cmVmTm9kZS5wYXJlbnQuaW5zZXJ0QWZ0ZXIoe2RhdGE6ZGF0YX0scmVmTm9kZSk7fTtUcmVlU3RvcmUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbiByZW1vdmUoZGF0YSl7dmFyIG5vZGU9dGhpcy5nZXROb2RlKGRhdGEpO2lmKG5vZGUmJm5vZGUucGFyZW50KXtpZihub2RlPT09dGhpcy5jdXJyZW50Tm9kZSl7dGhpcy5jdXJyZW50Tm9kZT1udWxsO31ub2RlLnBhcmVudC5yZW1vdmVDaGlsZChub2RlKTt9fTtUcmVlU3RvcmUucHJvdG90eXBlLmFwcGVuZD1mdW5jdGlvbiBhcHBlbmQoZGF0YSxwYXJlbnREYXRhKXt2YXIgcGFyZW50Tm9kZT1wYXJlbnREYXRhP3RoaXMuZ2V0Tm9kZShwYXJlbnREYXRhKTp0aGlzLnJvb3Q7aWYocGFyZW50Tm9kZSl7cGFyZW50Tm9kZS5pbnNlcnRDaGlsZCh7ZGF0YTpkYXRhfSk7fX07VHJlZVN0b3JlLnByb3RvdHlwZS5faW5pdERlZmF1bHRDaGVja2VkTm9kZXM9ZnVuY3Rpb24gX2luaXREZWZhdWx0Q2hlY2tlZE5vZGVzKCl7dmFyIF90aGlzMj10aGlzO3ZhciBkZWZhdWx0Q2hlY2tlZEtleXM9dGhpcy5kZWZhdWx0Q2hlY2tlZEtleXN8fFtdO3ZhciBub2Rlc01hcD10aGlzLm5vZGVzTWFwO2RlZmF1bHRDaGVja2VkS2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGNoZWNrZWRLZXkpe3ZhciBub2RlPW5vZGVzTWFwW2NoZWNrZWRLZXldO2lmKG5vZGUpe25vZGUuc2V0Q2hlY2tlZCh0cnVlLCFfdGhpczIuY2hlY2tTdHJpY3RseSk7fX0pO307VHJlZVN0b3JlLnByb3RvdHlwZS5faW5pdERlZmF1bHRDaGVja2VkTm9kZT1mdW5jdGlvbiBfaW5pdERlZmF1bHRDaGVja2VkTm9kZShub2RlKXt2YXIgZGVmYXVsdENoZWNrZWRLZXlzPXRoaXMuZGVmYXVsdENoZWNrZWRLZXlzfHxbXTtpZihkZWZhdWx0Q2hlY2tlZEtleXMuaW5kZXhPZihub2RlLmtleSkhPT0tMSl7bm9kZS5zZXRDaGVja2VkKHRydWUsIXRoaXMuY2hlY2tTdHJpY3RseSk7fX07VHJlZVN0b3JlLnByb3RvdHlwZS5zZXREZWZhdWx0Q2hlY2tlZEtleT1mdW5jdGlvbiBzZXREZWZhdWx0Q2hlY2tlZEtleShuZXdWYWwpe2lmKG5ld1ZhbCE9PXRoaXMuZGVmYXVsdENoZWNrZWRLZXlzKXt0aGlzLmRlZmF1bHRDaGVja2VkS2V5cz1uZXdWYWw7dGhpcy5faW5pdERlZmF1bHRDaGVja2VkTm9kZXMoKTt9fTtUcmVlU3RvcmUucHJvdG90eXBlLnJlZ2lzdGVyTm9kZT1mdW5jdGlvbiByZWdpc3Rlck5vZGUobm9kZSl7dmFyIGtleT10aGlzLmtleTtpZigha2V5fHwhbm9kZXx8IW5vZGUuZGF0YSlyZXR1cm47dmFyIG5vZGVLZXk9bm9kZS5rZXk7aWYobm9kZUtleSE9PXVuZGVmaW5lZCl0aGlzLm5vZGVzTWFwW25vZGUua2V5XT1ub2RlO307VHJlZVN0b3JlLnByb3RvdHlwZS5kZXJlZ2lzdGVyTm9kZT1mdW5jdGlvbiBkZXJlZ2lzdGVyTm9kZShub2RlKXt2YXIgX3RoaXMzPXRoaXM7dmFyIGtleT10aGlzLmtleTtpZigha2V5fHwhbm9kZXx8IW5vZGUuZGF0YSlyZXR1cm47bm9kZS5jaGlsZE5vZGVzLmZvckVhY2goZnVuY3Rpb24oY2hpbGQpe190aGlzMy5kZXJlZ2lzdGVyTm9kZShjaGlsZCk7fSk7ZGVsZXRlIHRoaXMubm9kZXNNYXBbbm9kZS5rZXldO307VHJlZVN0b3JlLnByb3RvdHlwZS5nZXRDaGVja2VkTm9kZXM9ZnVuY3Rpb24gZ2V0Q2hlY2tlZE5vZGVzKCl7dmFyIGxlYWZPbmx5PWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dW5kZWZpbmVkP2FyZ3VtZW50c1swXTpmYWxzZTt2YXIgaW5jbHVkZUhhbGZDaGVja2VkPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dW5kZWZpbmVkP2FyZ3VtZW50c1sxXTpmYWxzZTt2YXIgY2hlY2tlZE5vZGVzPVtdO3ZhciB0cmF2ZXJzZT1mdW5jdGlvbiB0cmF2ZXJzZShub2RlKXt2YXIgY2hpbGROb2Rlcz1ub2RlLnJvb3Q/bm9kZS5yb290LmNoaWxkTm9kZXM6bm9kZS5jaGlsZE5vZGVzO2NoaWxkTm9kZXMuZm9yRWFjaChmdW5jdGlvbihjaGlsZCl7aWYoKGNoaWxkLmNoZWNrZWR8fGluY2x1ZGVIYWxmQ2hlY2tlZCYmY2hpbGQuaW5kZXRlcm1pbmF0ZSkmJighbGVhZk9ubHl8fGxlYWZPbmx5JiZjaGlsZC5pc0xlYWYpKXtjaGVja2VkTm9kZXMucHVzaChjaGlsZC5kYXRhKTt9dHJhdmVyc2UoY2hpbGQpO30pO307dHJhdmVyc2UodGhpcyk7cmV0dXJuIGNoZWNrZWROb2Rlczt9O1RyZWVTdG9yZS5wcm90b3R5cGUuZ2V0Q2hlY2tlZEtleXM9ZnVuY3Rpb24gZ2V0Q2hlY2tlZEtleXMoKXt2YXIgX3RoaXM0PXRoaXM7dmFyIGxlYWZPbmx5PWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dW5kZWZpbmVkP2FyZ3VtZW50c1swXTpmYWxzZTtyZXR1cm4gdGhpcy5nZXRDaGVja2VkTm9kZXMobGVhZk9ubHkpLm1hcChmdW5jdGlvbihkYXRhKXtyZXR1cm4oZGF0YXx8e30pW190aGlzNC5rZXldO30pO307VHJlZVN0b3JlLnByb3RvdHlwZS5nZXRIYWxmQ2hlY2tlZE5vZGVzPWZ1bmN0aW9uIGdldEhhbGZDaGVja2VkTm9kZXMoKXt2YXIgbm9kZXM9W107dmFyIHRyYXZlcnNlPWZ1bmN0aW9uIHRyYXZlcnNlKG5vZGUpe3ZhciBjaGlsZE5vZGVzPW5vZGUucm9vdD9ub2RlLnJvb3QuY2hpbGROb2Rlczpub2RlLmNoaWxkTm9kZXM7Y2hpbGROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGNoaWxkKXtpZihjaGlsZC5pbmRldGVybWluYXRlKXtub2Rlcy5wdXNoKGNoaWxkLmRhdGEpO310cmF2ZXJzZShjaGlsZCk7fSk7fTt0cmF2ZXJzZSh0aGlzKTtyZXR1cm4gbm9kZXM7fTtUcmVlU3RvcmUucHJvdG90eXBlLmdldEhhbGZDaGVja2VkS2V5cz1mdW5jdGlvbiBnZXRIYWxmQ2hlY2tlZEtleXMoKXt2YXIgX3RoaXM1PXRoaXM7cmV0dXJuIHRoaXMuZ2V0SGFsZkNoZWNrZWROb2RlcygpLm1hcChmdW5jdGlvbihkYXRhKXtyZXR1cm4oZGF0YXx8e30pW190aGlzNS5rZXldO30pO307VHJlZVN0b3JlLnByb3RvdHlwZS5fZ2V0QWxsTm9kZXM9ZnVuY3Rpb24gX2dldEFsbE5vZGVzKCl7dmFyIGFsbE5vZGVzPVtdO3ZhciBub2Rlc01hcD10aGlzLm5vZGVzTWFwO2Zvcih2YXIgbm9kZUtleSBpbiBub2Rlc01hcCl7aWYobm9kZXNNYXAuaGFzT3duUHJvcGVydHkobm9kZUtleSkpe2FsbE5vZGVzLnB1c2gobm9kZXNNYXBbbm9kZUtleV0pO319cmV0dXJuIGFsbE5vZGVzO307VHJlZVN0b3JlLnByb3RvdHlwZS51cGRhdGVDaGlsZHJlbj1mdW5jdGlvbiB1cGRhdGVDaGlsZHJlbihrZXksZGF0YSl7dmFyIG5vZGU9dGhpcy5ub2Rlc01hcFtrZXldO2lmKCFub2RlKXJldHVybjt2YXIgY2hpbGROb2Rlcz1ub2RlLmNoaWxkTm9kZXM7Zm9yKHZhciBpPWNoaWxkTm9kZXMubGVuZ3RoLTE7aT49MDtpLS0pe3ZhciBjaGlsZD1jaGlsZE5vZGVzW2ldO3RoaXMucmVtb3ZlKGNoaWxkLmRhdGEpO31mb3IodmFyIF9pPTAsaj1kYXRhLmxlbmd0aDtfaTxqO19pKyspe3ZhciBfY2hpbGQ9ZGF0YVtfaV07dGhpcy5hcHBlbmQoX2NoaWxkLG5vZGUuZGF0YSk7fX07VHJlZVN0b3JlLnByb3RvdHlwZS5fc2V0Q2hlY2tlZEtleXM9ZnVuY3Rpb24gX3NldENoZWNrZWRLZXlzKGtleSl7dmFyIGxlYWZPbmx5PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dW5kZWZpbmVkP2FyZ3VtZW50c1sxXTpmYWxzZTt2YXIgY2hlY2tlZEtleXM9YXJndW1lbnRzWzJdO3ZhciBhbGxOb2Rlcz10aGlzLl9nZXRBbGxOb2RlcygpLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5sZXZlbC1hLmxldmVsO30pO3ZhciBjYWNoZT1PYmplY3QuY3JlYXRlKG51bGwpO3ZhciBrZXlzPU9iamVjdC5rZXlzKGNoZWNrZWRLZXlzKTthbGxOb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUpe3JldHVybiBub2RlLnNldENoZWNrZWQoZmFsc2UsZmFsc2UpO30pO2Zvcih2YXIgaT0wLGo9YWxsTm9kZXMubGVuZ3RoO2k8ajtpKyspe3ZhciBub2RlPWFsbE5vZGVzW2ldO3ZhciBub2RlS2V5PW5vZGUuZGF0YVtrZXldLnRvU3RyaW5nKCk7dmFyIGNoZWNrZWQ9a2V5cy5pbmRleE9mKG5vZGVLZXkpPi0xO2lmKCFjaGVja2VkKXtpZihub2RlLmNoZWNrZWQmJiFjYWNoZVtub2RlS2V5XSl7bm9kZS5zZXRDaGVja2VkKGZhbHNlLGZhbHNlKTt9Y29udGludWU7fXZhciBwYXJlbnQ9bm9kZS5wYXJlbnQ7d2hpbGUocGFyZW50JiZwYXJlbnQubGV2ZWw+MCl7Y2FjaGVbcGFyZW50LmRhdGFba2V5XV09dHJ1ZTtwYXJlbnQ9cGFyZW50LnBhcmVudDt9aWYobm9kZS5pc0xlYWZ8fHRoaXMuY2hlY2tTdHJpY3RseSl7bm9kZS5zZXRDaGVja2VkKHRydWUsZmFsc2UpO2NvbnRpbnVlO31ub2RlLnNldENoZWNrZWQodHJ1ZSx0cnVlKTtpZihsZWFmT25seSl7KGZ1bmN0aW9uKCl7bm9kZS5zZXRDaGVja2VkKGZhbHNlLGZhbHNlKTt2YXIgdHJhdmVyc2U9ZnVuY3Rpb24gdHJhdmVyc2Uobm9kZSl7dmFyIGNoaWxkTm9kZXM9bm9kZS5jaGlsZE5vZGVzO2NoaWxkTm9kZXMuZm9yRWFjaChmdW5jdGlvbihjaGlsZCl7aWYoIWNoaWxkLmlzTGVhZil7Y2hpbGQuc2V0Q2hlY2tlZChmYWxzZSxmYWxzZSk7fXRyYXZlcnNlKGNoaWxkKTt9KTt9O3RyYXZlcnNlKG5vZGUpO30pKCk7fX19O1RyZWVTdG9yZS5wcm90b3R5cGUuc2V0Q2hlY2tlZE5vZGVzPWZ1bmN0aW9uIHNldENoZWNrZWROb2RlcyhhcnJheSl7dmFyIGxlYWZPbmx5PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dW5kZWZpbmVkP2FyZ3VtZW50c1sxXTpmYWxzZTt2YXIga2V5PXRoaXMua2V5O3ZhciBjaGVja2VkS2V5cz17fTthcnJheS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pe2NoZWNrZWRLZXlzWyhpdGVtfHx7fSlba2V5XV09dHJ1ZTt9KTt0aGlzLl9zZXRDaGVja2VkS2V5cyhrZXksbGVhZk9ubHksY2hlY2tlZEtleXMpO307VHJlZVN0b3JlLnByb3RvdHlwZS5zZXRDaGVja2VkS2V5cz1mdW5jdGlvbiBzZXRDaGVja2VkS2V5cyhrZXlzKXt2YXIgbGVhZk9ubHk9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOmZhbHNlO3RoaXMuZGVmYXVsdENoZWNrZWRLZXlzPWtleXM7dmFyIGtleT10aGlzLmtleTt2YXIgY2hlY2tlZEtleXM9e307a2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSl7Y2hlY2tlZEtleXNba2V5XT10cnVlO30pO3RoaXMuX3NldENoZWNrZWRLZXlzKGtleSxsZWFmT25seSxjaGVja2VkS2V5cyk7fTtUcmVlU3RvcmUucHJvdG90eXBlLnNldERlZmF1bHRFeHBhbmRlZEtleXM9ZnVuY3Rpb24gc2V0RGVmYXVsdEV4cGFuZGVkS2V5cyhrZXlzKXt2YXIgX3RoaXM2PXRoaXM7a2V5cz1rZXlzfHxbXTt0aGlzLmRlZmF1bHRFeHBhbmRlZEtleXM9a2V5cztrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KXt2YXIgbm9kZT1fdGhpczYuZ2V0Tm9kZShrZXkpO2lmKG5vZGUpbm9kZS5leHBhbmQobnVsbCxfdGhpczYuYXV0b0V4cGFuZFBhcmVudCk7fSk7fTtUcmVlU3RvcmUucHJvdG90eXBlLnNldENoZWNrZWQ9ZnVuY3Rpb24gc2V0Q2hlY2tlZChkYXRhLGNoZWNrZWQsZGVlcCl7dmFyIG5vZGU9dGhpcy5nZXROb2RlKGRhdGEpO2lmKG5vZGUpe25vZGUuc2V0Q2hlY2tlZCghIWNoZWNrZWQsZGVlcCk7fX07VHJlZVN0b3JlLnByb3RvdHlwZS5nZXRDdXJyZW50Tm9kZT1mdW5jdGlvbiBnZXRDdXJyZW50Tm9kZSgpe3JldHVybiB0aGlzLmN1cnJlbnROb2RlO307VHJlZVN0b3JlLnByb3RvdHlwZS5zZXRDdXJyZW50Tm9kZT1mdW5jdGlvbiBzZXRDdXJyZW50Tm9kZShjdXJyZW50Tm9kZSl7dmFyIHByZXZDdXJyZW50Tm9kZT10aGlzLmN1cnJlbnROb2RlO2lmKHByZXZDdXJyZW50Tm9kZSl7cHJldkN1cnJlbnROb2RlLmlzQ3VycmVudD1mYWxzZTt9dGhpcy5jdXJyZW50Tm9kZT1jdXJyZW50Tm9kZTt0aGlzLmN1cnJlbnROb2RlLmlzQ3VycmVudD10cnVlO307VHJlZVN0b3JlLnByb3RvdHlwZS5zZXRVc2VyQ3VycmVudE5vZGU9ZnVuY3Rpb24gc2V0VXNlckN1cnJlbnROb2RlKG5vZGUpe3ZhciBrZXk9bm9kZVt0aGlzLmtleV07dmFyIGN1cnJOb2RlPXRoaXMubm9kZXNNYXBba2V5XTt0aGlzLnNldEN1cnJlbnROb2RlKGN1cnJOb2RlKTt9O1RyZWVTdG9yZS5wcm90b3R5cGUuc2V0Q3VycmVudE5vZGVLZXk9ZnVuY3Rpb24gc2V0Q3VycmVudE5vZGVLZXkoa2V5KXtpZihrZXk9PT1udWxsfHxrZXk9PT11bmRlZmluZWQpe3RoaXMuY3VycmVudE5vZGUmJih0aGlzLmN1cnJlbnROb2RlLmlzQ3VycmVudD1mYWxzZSk7dGhpcy5jdXJyZW50Tm9kZT1udWxsO3JldHVybjt9dmFyIG5vZGU9dGhpcy5nZXROb2RlKGtleSk7aWYobm9kZSl7dGhpcy5zZXRDdXJyZW50Tm9kZShub2RlKTt9fTtyZXR1cm4gVHJlZVN0b3JlO30oKTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHRyZWVfc3RvcmU9dHJlZV9zdG9yZV9UcmVlU3RvcmU7Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvdHJlZS9zcmMvdHJlZS1ub2RlLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0zYmEzZWYwZSYKdmFyIHRyZWVfbm9kZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzNiYTNlZjBlX3JlbmRlcj1mdW5jdGlvbiB0cmVlX25vZGV2dWVfdHlwZV90ZW1wbGF0ZV9pZF8zYmEzZWYwZV9yZW5kZXIoKXt2YXIgdGhpcyQxPXRoaXM7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJkaXYiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTpfdm0ubm9kZS52aXNpYmxlLGV4cHJlc3Npb246Im5vZGUudmlzaWJsZSJ9XSxyZWY6Im5vZGUiLHN0YXRpY0NsYXNzOiJlbC10cmVlLW5vZGUiLGNsYXNzOnsiaXMtZXhwYW5kZWQiOl92bS5leHBhbmRlZCwiaXMtY3VycmVudCI6X3ZtLm5vZGUuaXNDdXJyZW50LCJpcy1oaWRkZW4iOiFfdm0ubm9kZS52aXNpYmxlLCJpcy1mb2N1c2FibGUiOiFfdm0ubm9kZS5kaXNhYmxlZCwiaXMtY2hlY2tlZCI6IV92bS5ub2RlLmRpc2FibGVkJiZfdm0ubm9kZS5jaGVja2VkfSxhdHRyczp7cm9sZToidHJlZWl0ZW0iLHRhYmluZGV4OiItMSIsImFyaWEtZXhwYW5kZWQiOl92bS5leHBhbmRlZCwiYXJpYS1kaXNhYmxlZCI6X3ZtLm5vZGUuZGlzYWJsZWQsImFyaWEtY2hlY2tlZCI6X3ZtLm5vZGUuY2hlY2tlZCxkcmFnZ2FibGU6X3ZtLnRyZWUuZHJhZ2dhYmxlfSxvbjp7Y2xpY2s6ZnVuY3Rpb24gY2xpY2soJGV2ZW50KXskZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7cmV0dXJuIF92bS5oYW5kbGVDbGljaygkZXZlbnQpO30sY29udGV4dG1lbnU6ZnVuY3Rpb24gY29udGV4dG1lbnUoJGV2ZW50KXtyZXR1cm4gdGhpcyQxLmhhbmRsZUNvbnRleHRNZW51KCRldmVudCk7fSxkcmFnc3RhcnQ6ZnVuY3Rpb24gZHJhZ3N0YXJ0KCRldmVudCl7JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO3JldHVybiBfdm0uaGFuZGxlRHJhZ1N0YXJ0KCRldmVudCk7fSxkcmFnb3ZlcjpmdW5jdGlvbiBkcmFnb3ZlcigkZXZlbnQpeyRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtyZXR1cm4gX3ZtLmhhbmRsZURyYWdPdmVyKCRldmVudCk7fSxkcmFnZW5kOmZ1bmN0aW9uIGRyYWdlbmQoJGV2ZW50KXskZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7cmV0dXJuIF92bS5oYW5kbGVEcmFnRW5kKCRldmVudCk7fSxkcm9wOmZ1bmN0aW9uIGRyb3AoJGV2ZW50KXskZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7cmV0dXJuIF92bS5oYW5kbGVEcm9wKCRldmVudCk7fX19LFtfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXRyZWUtbm9kZV9fY29udGVudCIsc3R5bGU6eyJwYWRkaW5nLWxlZnQiOihfdm0ubm9kZS5sZXZlbC0xKSpfdm0udHJlZS5pbmRlbnQrInB4In19LFtfYygic3BhbiIse2NsYXNzOlt7ImlzLWxlYWYiOl92bS5ub2RlLmlzTGVhZixleHBhbmRlZDohX3ZtLm5vZGUuaXNMZWFmJiZfdm0uZXhwYW5kZWR9LCJlbC10cmVlLW5vZGVfX2V4cGFuZC1pY29uIixfdm0udHJlZS5pY29uQ2xhc3M/X3ZtLnRyZWUuaWNvbkNsYXNzOiJlbC1pY29uLWNhcmV0LXJpZ2h0Il0sb246e2NsaWNrOmZ1bmN0aW9uIGNsaWNrKCRldmVudCl7JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO3JldHVybiBfdm0uaGFuZGxlRXhwYW5kSWNvbkNsaWNrKCRldmVudCk7fX19KSxfdm0uc2hvd0NoZWNrYm94P19jKCJlbC1jaGVja2JveCIse2F0dHJzOntpbmRldGVybWluYXRlOl92bS5ub2RlLmluZGV0ZXJtaW5hdGUsZGlzYWJsZWQ6ISFfdm0ubm9kZS5kaXNhYmxlZH0sb246e2NoYW5nZTpfdm0uaGFuZGxlQ2hlY2tDaGFuZ2V9LG5hdGl2ZU9uOntjbGljazpmdW5jdGlvbiBjbGljaygkZXZlbnQpeyRldmVudC5zdG9wUHJvcGFnYXRpb24oKTt9fSxtb2RlbDp7dmFsdWU6X3ZtLm5vZGUuY2hlY2tlZCxjYWxsYmFjazpmdW5jdGlvbiBjYWxsYmFjaygkJHYpe192bS4kc2V0KF92bS5ub2RlLCJjaGVja2VkIiwkJHYpO30sZXhwcmVzc2lvbjoibm9kZS5jaGVja2VkIn19KTpfdm0uX2UoKSxfdm0ubm9kZS5sb2FkaW5nP19jKCJzcGFuIix7c3RhdGljQ2xhc3M6ImVsLXRyZWUtbm9kZV9fbG9hZGluZy1pY29uIGVsLWljb24tbG9hZGluZyJ9KTpfdm0uX2UoKSxfYygibm9kZS1jb250ZW50Iix7YXR0cnM6e25vZGU6X3ZtLm5vZGV9fSldLDEpLF9jKCJlbC1jb2xsYXBzZS10cmFuc2l0aW9uIixbIV92bS5yZW5kZXJBZnRlckV4cGFuZHx8X3ZtLmNoaWxkTm9kZVJlbmRlcmVkP19jKCJkaXYiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTpfdm0uZXhwYW5kZWQsZXhwcmVzc2lvbjoiZXhwYW5kZWQifV0sc3RhdGljQ2xhc3M6ImVsLXRyZWUtbm9kZV9fY2hpbGRyZW4iLGF0dHJzOntyb2xlOiJncm91cCIsImFyaWEtZXhwYW5kZWQiOl92bS5leHBhbmRlZH19LF92bS5fbChfdm0ubm9kZS5jaGlsZE5vZGVzLGZ1bmN0aW9uKGNoaWxkKXtyZXR1cm4gX2MoImVsLXRyZWUtbm9kZSIse2tleTpfdm0uZ2V0Tm9kZUtleShjaGlsZCksYXR0cnM6eyJyZW5kZXItY29udGVudCI6X3ZtLnJlbmRlckNvbnRlbnQsInJlbmRlci1hZnRlci1leHBhbmQiOl92bS5yZW5kZXJBZnRlckV4cGFuZCwic2hvdy1jaGVja2JveCI6X3ZtLnNob3dDaGVja2JveCxub2RlOmNoaWxkfSxvbjp7Im5vZGUtZXhwYW5kIjpfdm0uaGFuZGxlQ2hpbGROb2RlRXhwYW5kfX0pO30pLDEpOl92bS5fZSgpXSldLDEpO307dmFyIHRyZWVfbm9kZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzNiYTNlZjBlX3N0YXRpY1JlbmRlckZucz1bXTt0cmVlX25vZGV2dWVfdHlwZV90ZW1wbGF0ZV9pZF8zYmEzZWYwZV9yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdHJlZS9zcmMvdHJlZS1ub2RlLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0zYmEzZWYwZSYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvdHJlZS9zcmMvdHJlZS1ub2RlLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciB0cmVlX25vZGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e25hbWU6J0VsVHJlZU5vZGUnLGNvbXBvbmVudE5hbWU6J0VsVHJlZU5vZGUnLG1peGluczpbZW1pdHRlcl9kZWZhdWx0LmFdLHByb3BzOntub2RlOntkZWZhdWx0OmZ1bmN0aW9uIF9kZWZhdWx0KCl7cmV0dXJue307fX0scHJvcHM6e30scmVuZGVyQ29udGVudDpGdW5jdGlvbixyZW5kZXJBZnRlckV4cGFuZDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6dHJ1ZX0sc2hvd0NoZWNrYm94Ont0eXBlOkJvb2xlYW4sZGVmYXVsdDpmYWxzZX19LGNvbXBvbmVudHM6e0VsQ29sbGFwc2VUcmFuc2l0aW9uOmNvbGxhcHNlX3RyYW5zaXRpb25fZGVmYXVsdC5hLEVsQ2hlY2tib3g6Y2hlY2tib3hfZGVmYXVsdC5hLE5vZGVDb250ZW50Ontwcm9wczp7bm9kZTp7cmVxdWlyZWQ6dHJ1ZX19LHJlbmRlcjpmdW5jdGlvbiByZW5kZXIoaCl7dmFyIHBhcmVudD10aGlzLiRwYXJlbnQ7dmFyIHRyZWU9cGFyZW50LnRyZWU7dmFyIG5vZGU9dGhpcy5ub2RlO3ZhciBkYXRhPW5vZGUuZGF0YSxzdG9yZT1ub2RlLnN0b3JlO3JldHVybiBwYXJlbnQucmVuZGVyQ29udGVudD9wYXJlbnQucmVuZGVyQ29udGVudC5jYWxsKHBhcmVudC5fcmVuZGVyUHJveHksaCx7X3NlbGY6dHJlZS4kdm5vZGUuY29udGV4dCxub2RlOm5vZGUsZGF0YTpkYXRhLHN0b3JlOnN0b3JlfSk6dHJlZS4kc2NvcGVkU2xvdHMuZGVmYXVsdD90cmVlLiRzY29wZWRTbG90cy5kZWZhdWx0KHtub2RlOm5vZGUsZGF0YTpkYXRhfSk6aCgnc3BhbicseydjbGFzcyc6J2VsLXRyZWUtbm9kZV9fbGFiZWwnfSxbbm9kZS5sYWJlbF0pO319fSxkYXRhOmZ1bmN0aW9uIGRhdGEoKXtyZXR1cm57dHJlZTpudWxsLGV4cGFuZGVkOmZhbHNlLGNoaWxkTm9kZVJlbmRlcmVkOmZhbHNlLG9sZENoZWNrZWQ6bnVsbCxvbGRJbmRldGVybWluYXRlOm51bGx9O30sd2F0Y2g6eydub2RlLmluZGV0ZXJtaW5hdGUnOmZ1bmN0aW9uIG5vZGVJbmRldGVybWluYXRlKHZhbCl7dGhpcy5oYW5kbGVTZWxlY3RDaGFuZ2UodGhpcy5ub2RlLmNoZWNrZWQsdmFsKTt9LCdub2RlLmNoZWNrZWQnOmZ1bmN0aW9uIG5vZGVDaGVja2VkKHZhbCl7dGhpcy5oYW5kbGVTZWxlY3RDaGFuZ2UodmFsLHRoaXMubm9kZS5pbmRldGVybWluYXRlKTt9LCdub2RlLmV4cGFuZGVkJzpmdW5jdGlvbiBub2RlRXhwYW5kZWQodmFsKXt2YXIgX3RoaXM9dGhpczt0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe3JldHVybiBfdGhpcy5leHBhbmRlZD12YWw7fSk7aWYodmFsKXt0aGlzLmNoaWxkTm9kZVJlbmRlcmVkPXRydWU7fX19LG1ldGhvZHM6e2dldE5vZGVLZXk6ZnVuY3Rpb24gZ2V0Tm9kZUtleShub2RlKXtyZXR1cm4gdXRpbF9nZXROb2RlS2V5KHRoaXMudHJlZS5ub2RlS2V5LG5vZGUuZGF0YSk7fSxoYW5kbGVTZWxlY3RDaGFuZ2U6ZnVuY3Rpb24gaGFuZGxlU2VsZWN0Q2hhbmdlKGNoZWNrZWQsaW5kZXRlcm1pbmF0ZSl7aWYodGhpcy5vbGRDaGVja2VkIT09Y2hlY2tlZCYmdGhpcy5vbGRJbmRldGVybWluYXRlIT09aW5kZXRlcm1pbmF0ZSl7dGhpcy50cmVlLiRlbWl0KCdjaGVjay1jaGFuZ2UnLHRoaXMubm9kZS5kYXRhLGNoZWNrZWQsaW5kZXRlcm1pbmF0ZSk7fXRoaXMub2xkQ2hlY2tlZD1jaGVja2VkO3RoaXMuaW5kZXRlcm1pbmF0ZT1pbmRldGVybWluYXRlO30saGFuZGxlQ2xpY2s6ZnVuY3Rpb24gaGFuZGxlQ2xpY2soKXt2YXIgc3RvcmU9dGhpcy50cmVlLnN0b3JlO3N0b3JlLnNldEN1cnJlbnROb2RlKHRoaXMubm9kZSk7dGhpcy50cmVlLiRlbWl0KCdjdXJyZW50LWNoYW5nZScsc3RvcmUuY3VycmVudE5vZGU/c3RvcmUuY3VycmVudE5vZGUuZGF0YTpudWxsLHN0b3JlLmN1cnJlbnROb2RlKTt0aGlzLnRyZWUuY3VycmVudE5vZGU9dGhpcztpZih0aGlzLnRyZWUuZXhwYW5kT25DbGlja05vZGUpe3RoaXMuaGFuZGxlRXhwYW5kSWNvbkNsaWNrKCk7fWlmKHRoaXMudHJlZS5jaGVja09uQ2xpY2tOb2RlJiYhdGhpcy5ub2RlLmRpc2FibGVkKXt0aGlzLmhhbmRsZUNoZWNrQ2hhbmdlKG51bGwse3RhcmdldDp7Y2hlY2tlZDohdGhpcy5ub2RlLmNoZWNrZWR9fSk7fXRoaXMudHJlZS4kZW1pdCgnbm9kZS1jbGljaycsdGhpcy5ub2RlLmRhdGEsdGhpcy5ub2RlLHRoaXMpO30saGFuZGxlQ29udGV4dE1lbnU6ZnVuY3Rpb24gaGFuZGxlQ29udGV4dE1lbnUoZXZlbnQpe2lmKHRoaXMudHJlZS5fZXZlbnRzWydub2RlLWNvbnRleHRtZW51J10mJnRoaXMudHJlZS5fZXZlbnRzWydub2RlLWNvbnRleHRtZW51J10ubGVuZ3RoPjApe2V2ZW50LnN0b3BQcm9wYWdhdGlvbigpO2V2ZW50LnByZXZlbnREZWZhdWx0KCk7fXRoaXMudHJlZS4kZW1pdCgnbm9kZS1jb250ZXh0bWVudScsZXZlbnQsdGhpcy5ub2RlLmRhdGEsdGhpcy5ub2RlLHRoaXMpO30saGFuZGxlRXhwYW5kSWNvbkNsaWNrOmZ1bmN0aW9uIGhhbmRsZUV4cGFuZEljb25DbGljaygpe2lmKHRoaXMubm9kZS5pc0xlYWYpcmV0dXJuO2lmKHRoaXMuZXhwYW5kZWQpe3RoaXMudHJlZS4kZW1pdCgnbm9kZS1jb2xsYXBzZScsdGhpcy5ub2RlLmRhdGEsdGhpcy5ub2RlLHRoaXMpO3RoaXMubm9kZS5jb2xsYXBzZSgpO31lbHNle3RoaXMubm9kZS5leHBhbmQoKTt0aGlzLiRlbWl0KCdub2RlLWV4cGFuZCcsdGhpcy5ub2RlLmRhdGEsdGhpcy5ub2RlLHRoaXMpO319LGhhbmRsZUNoZWNrQ2hhbmdlOmZ1bmN0aW9uIGhhbmRsZUNoZWNrQ2hhbmdlKHZhbHVlLGV2KXt2YXIgX3RoaXMyPXRoaXM7dGhpcy5ub2RlLnNldENoZWNrZWQoZXYudGFyZ2V0LmNoZWNrZWQsIXRoaXMudHJlZS5jaGVja1N0cmljdGx5KTt0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe3ZhciBzdG9yZT1fdGhpczIudHJlZS5zdG9yZTtfdGhpczIudHJlZS4kZW1pdCgnY2hlY2snLF90aGlzMi5ub2RlLmRhdGEse2NoZWNrZWROb2RlczpzdG9yZS5nZXRDaGVja2VkTm9kZXMoKSxjaGVja2VkS2V5czpzdG9yZS5nZXRDaGVja2VkS2V5cygpLGhhbGZDaGVja2VkTm9kZXM6c3RvcmUuZ2V0SGFsZkNoZWNrZWROb2RlcygpLGhhbGZDaGVja2VkS2V5czpzdG9yZS5nZXRIYWxmQ2hlY2tlZEtleXMoKX0pO30pO30saGFuZGxlQ2hpbGROb2RlRXhwYW5kOmZ1bmN0aW9uIGhhbmRsZUNoaWxkTm9kZUV4cGFuZChub2RlRGF0YSxub2RlLGluc3RhbmNlKXt0aGlzLmJyb2FkY2FzdCgnRWxUcmVlTm9kZScsJ3RyZWUtbm9kZS1leHBhbmQnLG5vZGUpO3RoaXMudHJlZS4kZW1pdCgnbm9kZS1leHBhbmQnLG5vZGVEYXRhLG5vZGUsaW5zdGFuY2UpO30saGFuZGxlRHJhZ1N0YXJ0OmZ1bmN0aW9uIGhhbmRsZURyYWdTdGFydChldmVudCl7aWYoIXRoaXMudHJlZS5kcmFnZ2FibGUpcmV0dXJuO3RoaXMudHJlZS4kZW1pdCgndHJlZS1ub2RlLWRyYWctc3RhcnQnLGV2ZW50LHRoaXMpO30saGFuZGxlRHJhZ092ZXI6ZnVuY3Rpb24gaGFuZGxlRHJhZ092ZXIoZXZlbnQpe2lmKCF0aGlzLnRyZWUuZHJhZ2dhYmxlKXJldHVybjt0aGlzLnRyZWUuJGVtaXQoJ3RyZWUtbm9kZS1kcmFnLW92ZXInLGV2ZW50LHRoaXMpO2V2ZW50LnByZXZlbnREZWZhdWx0KCk7fSxoYW5kbGVEcm9wOmZ1bmN0aW9uIGhhbmRsZURyb3AoZXZlbnQpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7fSxoYW5kbGVEcmFnRW5kOmZ1bmN0aW9uIGhhbmRsZURyYWdFbmQoZXZlbnQpe2lmKCF0aGlzLnRyZWUuZHJhZ2dhYmxlKXJldHVybjt0aGlzLnRyZWUuJGVtaXQoJ3RyZWUtbm9kZS1kcmFnLWVuZCcsZXZlbnQsdGhpcyk7fX0sY3JlYXRlZDpmdW5jdGlvbiBjcmVhdGVkKCl7dmFyIF90aGlzMz10aGlzO3ZhciBwYXJlbnQ9dGhpcy4kcGFyZW50O2lmKHBhcmVudC5pc1RyZWUpe3RoaXMudHJlZT1wYXJlbnQ7fWVsc2V7dGhpcy50cmVlPXBhcmVudC50cmVlO312YXIgdHJlZT10aGlzLnRyZWU7aWYoIXRyZWUpe2NvbnNvbGUud2FybignQ2FuIG5vdCBmaW5kIG5vZGVcJ3MgdHJlZS4nKTt9dmFyIHByb3BzPXRyZWUucHJvcHN8fHt9O3ZhciBjaGlsZHJlbktleT1wcm9wc1snY2hpbGRyZW4nXXx8J2NoaWxkcmVuJzt0aGlzLiR3YXRjaCgnbm9kZS5kYXRhLicrY2hpbGRyZW5LZXksZnVuY3Rpb24oKXtfdGhpczMubm9kZS51cGRhdGVDaGlsZHJlbigpO30pO2lmKHRoaXMubm9kZS5leHBhbmRlZCl7dGhpcy5leHBhbmRlZD10cnVlO3RoaXMuY2hpbGROb2RlUmVuZGVyZWQ9dHJ1ZTt9aWYodGhpcy50cmVlLmFjY29yZGlvbil7dGhpcy4kb24oJ3RyZWUtbm9kZS1leHBhbmQnLGZ1bmN0aW9uKG5vZGUpe2lmKF90aGlzMy5ub2RlIT09bm9kZSl7X3RoaXMzLm5vZGUuY29sbGFwc2UoKTt9fSk7fX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdHJlZS9zcmMvdHJlZS1ub2RlLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfdHJlZV9ub2RldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXRyZWVfbm9kZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RyZWUvc3JjL3RyZWUtbm9kZS52dWUKLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciB0cmVlX25vZGVfY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChzcmNfdHJlZV9ub2RldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLHRyZWVfbm9kZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzNiYTNlZjBlX3JlbmRlcix0cmVlX25vZGV2dWVfdHlwZV90ZW1wbGF0ZV9pZF8zYmEzZWYwZV9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIHRyZWVfbm9kZV9hcGk7fXRyZWVfbm9kZV9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL3RyZWUvc3JjL3RyZWUtbm9kZS52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgdHJlZV9ub2RlPXRyZWVfbm9kZV9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy90cmVlL3NyYy90cmVlLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciB0cmVldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbFRyZWUnLG1peGluczpbZW1pdHRlcl9kZWZhdWx0LmFdLGNvbXBvbmVudHM6e0VsVHJlZU5vZGU6dHJlZV9ub2RlfSxkYXRhOmZ1bmN0aW9uIGRhdGEoKXtyZXR1cm57c3RvcmU6bnVsbCxyb290Om51bGwsY3VycmVudE5vZGU6bnVsbCx0cmVlSXRlbXM6bnVsbCxjaGVja2JveEl0ZW1zOltdLGRyYWdTdGF0ZTp7c2hvd0Ryb3BJbmRpY2F0b3I6ZmFsc2UsZHJhZ2dpbmdOb2RlOm51bGwsZHJvcE5vZGU6bnVsbCxhbGxvd0Ryb3A6dHJ1ZX19O30scHJvcHM6e2RhdGE6e3R5cGU6QXJyYXl9LGVtcHR5VGV4dDp7dHlwZTpTdHJpbmcsZGVmYXVsdDpmdW5jdGlvbiBfZGVmYXVsdCgpe3JldHVybiBPYmplY3QobGliX2xvY2FsZV9bInQiXSkoJ2VsLnRyZWUuZW1wdHlUZXh0Jyk7fX0scmVuZGVyQWZ0ZXJFeHBhbmQ6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OnRydWV9LG5vZGVLZXk6U3RyaW5nLGNoZWNrU3RyaWN0bHk6Qm9vbGVhbixkZWZhdWx0RXhwYW5kQWxsOkJvb2xlYW4sZXhwYW5kT25DbGlja05vZGU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OnRydWV9LGNoZWNrT25DbGlja05vZGU6Qm9vbGVhbixjaGVja0Rlc2NlbmRhbnRzOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDpmYWxzZX0sYXV0b0V4cGFuZFBhcmVudDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6dHJ1ZX0sZGVmYXVsdENoZWNrZWRLZXlzOkFycmF5LGRlZmF1bHRFeHBhbmRlZEtleXM6QXJyYXksY3VycmVudE5vZGVLZXk6W1N0cmluZyxOdW1iZXJdLHJlbmRlckNvbnRlbnQ6RnVuY3Rpb24sc2hvd0NoZWNrYm94Ont0eXBlOkJvb2xlYW4sZGVmYXVsdDpmYWxzZX0sZHJhZ2dhYmxlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDpmYWxzZX0sYWxsb3dEcmFnOkZ1bmN0aW9uLGFsbG93RHJvcDpGdW5jdGlvbixwcm9wczp7ZGVmYXVsdDpmdW5jdGlvbiBfZGVmYXVsdCgpe3JldHVybntjaGlsZHJlbjonY2hpbGRyZW4nLGxhYmVsOidsYWJlbCcsZGlzYWJsZWQ6J2Rpc2FibGVkJ307fX0sbGF6eTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ZmFsc2V9LGhpZ2hsaWdodEN1cnJlbnQ6Qm9vbGVhbixsb2FkOkZ1bmN0aW9uLGZpbHRlck5vZGVNZXRob2Q6RnVuY3Rpb24sYWNjb3JkaW9uOkJvb2xlYW4saW5kZW50Ont0eXBlOk51bWJlcixkZWZhdWx0OjE4fSxpY29uQ2xhc3M6U3RyaW5nfSxjb21wdXRlZDp7Y2hpbGRyZW46e3NldDpmdW5jdGlvbiBzZXQodmFsdWUpe3RoaXMuZGF0YT12YWx1ZTt9LGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5kYXRhO319LHRyZWVJdGVtQXJyYXk6ZnVuY3Rpb24gdHJlZUl0ZW1BcnJheSgpe3JldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLnRyZWVJdGVtcyk7fSxpc0VtcHR5OmZ1bmN0aW9uIGlzRW1wdHkoKXt2YXIgY2hpbGROb2Rlcz10aGlzLnJvb3QuY2hpbGROb2RlcztyZXR1cm4hY2hpbGROb2Rlc3x8Y2hpbGROb2Rlcy5sZW5ndGg9PT0wfHxjaGlsZE5vZGVzLmV2ZXJ5KGZ1bmN0aW9uKF9yZWYpe3ZhciB2aXNpYmxlPV9yZWYudmlzaWJsZTtyZXR1cm4hdmlzaWJsZTt9KTt9fSx3YXRjaDp7ZGVmYXVsdENoZWNrZWRLZXlzOmZ1bmN0aW9uIGRlZmF1bHRDaGVja2VkS2V5cyhuZXdWYWwpe3RoaXMuc3RvcmUuc2V0RGVmYXVsdENoZWNrZWRLZXkobmV3VmFsKTt9LGRlZmF1bHRFeHBhbmRlZEtleXM6ZnVuY3Rpb24gZGVmYXVsdEV4cGFuZGVkS2V5cyhuZXdWYWwpe3RoaXMuc3RvcmUuZGVmYXVsdEV4cGFuZGVkS2V5cz1uZXdWYWw7dGhpcy5zdG9yZS5zZXREZWZhdWx0RXhwYW5kZWRLZXlzKG5ld1ZhbCk7fSxkYXRhOmZ1bmN0aW9uIGRhdGEobmV3VmFsKXt0aGlzLnN0b3JlLnNldERhdGEobmV3VmFsKTt9LGNoZWNrYm94SXRlbXM6ZnVuY3Rpb24gY2hlY2tib3hJdGVtcyh2YWwpe0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodmFsLGZ1bmN0aW9uKGNoZWNrYm94KXtjaGVja2JveC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywtMSk7fSk7fSxjaGVja1N0cmljdGx5OmZ1bmN0aW9uIGNoZWNrU3RyaWN0bHkobmV3VmFsKXt0aGlzLnN0b3JlLmNoZWNrU3RyaWN0bHk9bmV3VmFsO319LG1ldGhvZHM6e2ZpbHRlcjpmdW5jdGlvbiBmaWx0ZXIodmFsdWUpe2lmKCF0aGlzLmZpbHRlck5vZGVNZXRob2QpdGhyb3cgbmV3IEVycm9yKCdbVHJlZV0gZmlsdGVyTm9kZU1ldGhvZCBpcyByZXF1aXJlZCB3aGVuIGZpbHRlcicpO3RoaXMuc3RvcmUuZmlsdGVyKHZhbHVlKTt9LGdldE5vZGVLZXk6ZnVuY3Rpb24gZ2V0Tm9kZUtleShub2RlKXtyZXR1cm4gdXRpbF9nZXROb2RlS2V5KHRoaXMubm9kZUtleSxub2RlLmRhdGEpO30sZ2V0Tm9kZVBhdGg6ZnVuY3Rpb24gZ2V0Tm9kZVBhdGgoZGF0YSl7aWYoIXRoaXMubm9kZUtleSl0aHJvdyBuZXcgRXJyb3IoJ1tUcmVlXSBub2RlS2V5IGlzIHJlcXVpcmVkIGluIGdldE5vZGVQYXRoJyk7dmFyIG5vZGU9dGhpcy5zdG9yZS5nZXROb2RlKGRhdGEpO2lmKCFub2RlKXJldHVybltdO3ZhciBwYXRoPVtub2RlLmRhdGFdO3ZhciBwYXJlbnQ9bm9kZS5wYXJlbnQ7d2hpbGUocGFyZW50JiZwYXJlbnQhPT10aGlzLnJvb3Qpe3BhdGgucHVzaChwYXJlbnQuZGF0YSk7cGFyZW50PXBhcmVudC5wYXJlbnQ7fXJldHVybiBwYXRoLnJldmVyc2UoKTt9LGdldENoZWNrZWROb2RlczpmdW5jdGlvbiBnZXRDaGVja2VkTm9kZXMobGVhZk9ubHksaW5jbHVkZUhhbGZDaGVja2VkKXtyZXR1cm4gdGhpcy5zdG9yZS5nZXRDaGVja2VkTm9kZXMobGVhZk9ubHksaW5jbHVkZUhhbGZDaGVja2VkKTt9LGdldENoZWNrZWRLZXlzOmZ1bmN0aW9uIGdldENoZWNrZWRLZXlzKGxlYWZPbmx5KXtyZXR1cm4gdGhpcy5zdG9yZS5nZXRDaGVja2VkS2V5cyhsZWFmT25seSk7fSxnZXRDdXJyZW50Tm9kZTpmdW5jdGlvbiBnZXRDdXJyZW50Tm9kZSgpe3ZhciBjdXJyZW50Tm9kZT10aGlzLnN0b3JlLmdldEN1cnJlbnROb2RlKCk7cmV0dXJuIGN1cnJlbnROb2RlP2N1cnJlbnROb2RlLmRhdGE6bnVsbDt9LGdldEN1cnJlbnRLZXk6ZnVuY3Rpb24gZ2V0Q3VycmVudEtleSgpe2lmKCF0aGlzLm5vZGVLZXkpdGhyb3cgbmV3IEVycm9yKCdbVHJlZV0gbm9kZUtleSBpcyByZXF1aXJlZCBpbiBnZXRDdXJyZW50S2V5Jyk7dmFyIGN1cnJlbnROb2RlPXRoaXMuZ2V0Q3VycmVudE5vZGUoKTtyZXR1cm4gY3VycmVudE5vZGU/Y3VycmVudE5vZGVbdGhpcy5ub2RlS2V5XTpudWxsO30sc2V0Q2hlY2tlZE5vZGVzOmZ1bmN0aW9uIHNldENoZWNrZWROb2Rlcyhub2RlcyxsZWFmT25seSl7aWYoIXRoaXMubm9kZUtleSl0aHJvdyBuZXcgRXJyb3IoJ1tUcmVlXSBub2RlS2V5IGlzIHJlcXVpcmVkIGluIHNldENoZWNrZWROb2RlcycpO3RoaXMuc3RvcmUuc2V0Q2hlY2tlZE5vZGVzKG5vZGVzLGxlYWZPbmx5KTt9LHNldENoZWNrZWRLZXlzOmZ1bmN0aW9uIHNldENoZWNrZWRLZXlzKGtleXMsbGVhZk9ubHkpe2lmKCF0aGlzLm5vZGVLZXkpdGhyb3cgbmV3IEVycm9yKCdbVHJlZV0gbm9kZUtleSBpcyByZXF1aXJlZCBpbiBzZXRDaGVja2VkS2V5cycpO3RoaXMuc3RvcmUuc2V0Q2hlY2tlZEtleXMoa2V5cyxsZWFmT25seSk7fSxzZXRDaGVja2VkOmZ1bmN0aW9uIHNldENoZWNrZWQoZGF0YSxjaGVja2VkLGRlZXApe3RoaXMuc3RvcmUuc2V0Q2hlY2tlZChkYXRhLGNoZWNrZWQsZGVlcCk7fSxnZXRIYWxmQ2hlY2tlZE5vZGVzOmZ1bmN0aW9uIGdldEhhbGZDaGVja2VkTm9kZXMoKXtyZXR1cm4gdGhpcy5zdG9yZS5nZXRIYWxmQ2hlY2tlZE5vZGVzKCk7fSxnZXRIYWxmQ2hlY2tlZEtleXM6ZnVuY3Rpb24gZ2V0SGFsZkNoZWNrZWRLZXlzKCl7cmV0dXJuIHRoaXMuc3RvcmUuZ2V0SGFsZkNoZWNrZWRLZXlzKCk7fSxzZXRDdXJyZW50Tm9kZTpmdW5jdGlvbiBzZXRDdXJyZW50Tm9kZShub2RlKXtpZighdGhpcy5ub2RlS2V5KXRocm93IG5ldyBFcnJvcignW1RyZWVdIG5vZGVLZXkgaXMgcmVxdWlyZWQgaW4gc2V0Q3VycmVudE5vZGUnKTt0aGlzLnN0b3JlLnNldFVzZXJDdXJyZW50Tm9kZShub2RlKTt9LHNldEN1cnJlbnRLZXk6ZnVuY3Rpb24gc2V0Q3VycmVudEtleShrZXkpe2lmKCF0aGlzLm5vZGVLZXkpdGhyb3cgbmV3IEVycm9yKCdbVHJlZV0gbm9kZUtleSBpcyByZXF1aXJlZCBpbiBzZXRDdXJyZW50S2V5Jyk7dGhpcy5zdG9yZS5zZXRDdXJyZW50Tm9kZUtleShrZXkpO30sZ2V0Tm9kZTpmdW5jdGlvbiBnZXROb2RlKGRhdGEpe3JldHVybiB0aGlzLnN0b3JlLmdldE5vZGUoZGF0YSk7fSxyZW1vdmU6ZnVuY3Rpb24gcmVtb3ZlKGRhdGEpe3RoaXMuc3RvcmUucmVtb3ZlKGRhdGEpO30sYXBwZW5kOmZ1bmN0aW9uIGFwcGVuZChkYXRhLHBhcmVudE5vZGUpe3RoaXMuc3RvcmUuYXBwZW5kKGRhdGEscGFyZW50Tm9kZSk7fSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24gaW5zZXJ0QmVmb3JlKGRhdGEscmVmTm9kZSl7dGhpcy5zdG9yZS5pbnNlcnRCZWZvcmUoZGF0YSxyZWZOb2RlKTt9LGluc2VydEFmdGVyOmZ1bmN0aW9uIGluc2VydEFmdGVyKGRhdGEscmVmTm9kZSl7dGhpcy5zdG9yZS5pbnNlcnRBZnRlcihkYXRhLHJlZk5vZGUpO30saGFuZGxlTm9kZUV4cGFuZDpmdW5jdGlvbiBoYW5kbGVOb2RlRXhwYW5kKG5vZGVEYXRhLG5vZGUsaW5zdGFuY2Upe3RoaXMuYnJvYWRjYXN0KCdFbFRyZWVOb2RlJywndHJlZS1ub2RlLWV4cGFuZCcsbm9kZSk7dGhpcy4kZW1pdCgnbm9kZS1leHBhbmQnLG5vZGVEYXRhLG5vZGUsaW5zdGFuY2UpO30sdXBkYXRlS2V5Q2hpbGRyZW46ZnVuY3Rpb24gdXBkYXRlS2V5Q2hpbGRyZW4oa2V5LGRhdGEpe2lmKCF0aGlzLm5vZGVLZXkpdGhyb3cgbmV3IEVycm9yKCdbVHJlZV0gbm9kZUtleSBpcyByZXF1aXJlZCBpbiB1cGRhdGVLZXlDaGlsZCcpO3RoaXMuc3RvcmUudXBkYXRlQ2hpbGRyZW4oa2V5LGRhdGEpO30saW5pdFRhYkluZGV4OmZ1bmN0aW9uIGluaXRUYWJJbmRleCgpe3RoaXMudHJlZUl0ZW1zPXRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5pcy1mb2N1c2FibGVbcm9sZT10cmVlaXRlbV0nKTt0aGlzLmNoZWNrYm94SXRlbXM9dGhpcy4kZWwucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT1jaGVja2JveF0nKTt2YXIgY2hlY2tlZEl0ZW09dGhpcy4kZWwucXVlcnlTZWxlY3RvckFsbCgnLmlzLWNoZWNrZWRbcm9sZT10cmVlaXRlbV0nKTtpZihjaGVja2VkSXRlbS5sZW5ndGgpe2NoZWNrZWRJdGVtWzBdLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLDApO3JldHVybjt9dGhpcy50cmVlSXRlbXNbMF0mJnRoaXMudHJlZUl0ZW1zWzBdLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLDApO30saGFuZGxlS2V5ZG93bjpmdW5jdGlvbiBoYW5kbGVLZXlkb3duKGV2KXt2YXIgY3VycmVudEl0ZW09ZXYudGFyZ2V0O2lmKGN1cnJlbnRJdGVtLmNsYXNzTmFtZS5pbmRleE9mKCdlbC10cmVlLW5vZGUnKT09PS0xKXJldHVybjt2YXIga2V5Q29kZT1ldi5rZXlDb2RlO3RoaXMudHJlZUl0ZW1zPXRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5pcy1mb2N1c2FibGVbcm9sZT10cmVlaXRlbV0nKTt2YXIgY3VycmVudEluZGV4PXRoaXMudHJlZUl0ZW1BcnJheS5pbmRleE9mKGN1cnJlbnRJdGVtKTt2YXIgbmV4dEluZGV4PXZvaWQgMDtpZihbMzgsNDBdLmluZGV4T2Yoa2V5Q29kZSk+LTEpey8vIHVw44CBZG93bgpldi5wcmV2ZW50RGVmYXVsdCgpO2lmKGtleUNvZGU9PT0zOCl7Ly8gdXAKbmV4dEluZGV4PWN1cnJlbnRJbmRleCE9PTA/Y3VycmVudEluZGV4LTE6MDt9ZWxzZXtuZXh0SW5kZXg9Y3VycmVudEluZGV4PHRoaXMudHJlZUl0ZW1BcnJheS5sZW5ndGgtMT9jdXJyZW50SW5kZXgrMTowO310aGlzLnRyZWVJdGVtQXJyYXlbbmV4dEluZGV4XS5mb2N1cygpOy8vIOmAieS4rQp9aWYoWzM3LDM5XS5pbmRleE9mKGtleUNvZGUpPi0xKXsvLyBsZWZ044CBcmlnaHQg5bGV5byACmV2LnByZXZlbnREZWZhdWx0KCk7Y3VycmVudEl0ZW0uY2xpY2soKTsvLyDpgInkuK0KfXZhciBoYXNJbnB1dD1jdXJyZW50SXRlbS5xdWVyeVNlbGVjdG9yKCdbdHlwZT0iY2hlY2tib3giXScpO2lmKFsxMywzMl0uaW5kZXhPZihrZXlDb2RlKT4tMSYmaGFzSW5wdXQpey8vIHNwYWNlIGVudGVy6YCJ5LitY2hlY2tib3gKZXYucHJldmVudERlZmF1bHQoKTtoYXNJbnB1dC5jbGljaygpO319fSxjcmVhdGVkOmZ1bmN0aW9uIGNyZWF0ZWQoKXt2YXIgX3RoaXM9dGhpczt0aGlzLmlzVHJlZT10cnVlO3RoaXMuc3RvcmU9bmV3IHRyZWVfc3RvcmUoe2tleTp0aGlzLm5vZGVLZXksZGF0YTp0aGlzLmRhdGEsbGF6eTp0aGlzLmxhenkscHJvcHM6dGhpcy5wcm9wcyxsb2FkOnRoaXMubG9hZCxjdXJyZW50Tm9kZUtleTp0aGlzLmN1cnJlbnROb2RlS2V5LGNoZWNrU3RyaWN0bHk6dGhpcy5jaGVja1N0cmljdGx5LGNoZWNrRGVzY2VuZGFudHM6dGhpcy5jaGVja0Rlc2NlbmRhbnRzLGRlZmF1bHRDaGVja2VkS2V5czp0aGlzLmRlZmF1bHRDaGVja2VkS2V5cyxkZWZhdWx0RXhwYW5kZWRLZXlzOnRoaXMuZGVmYXVsdEV4cGFuZGVkS2V5cyxhdXRvRXhwYW5kUGFyZW50OnRoaXMuYXV0b0V4cGFuZFBhcmVudCxkZWZhdWx0RXhwYW5kQWxsOnRoaXMuZGVmYXVsdEV4cGFuZEFsbCxmaWx0ZXJOb2RlTWV0aG9kOnRoaXMuZmlsdGVyTm9kZU1ldGhvZH0pO3RoaXMucm9vdD10aGlzLnN0b3JlLnJvb3Q7dmFyIGRyYWdTdGF0ZT10aGlzLmRyYWdTdGF0ZTt0aGlzLiRvbigndHJlZS1ub2RlLWRyYWctc3RhcnQnLGZ1bmN0aW9uKGV2ZW50LHRyZWVOb2RlKXtpZih0eXBlb2YgX3RoaXMuYWxsb3dEcmFnPT09J2Z1bmN0aW9uJyYmIV90aGlzLmFsbG93RHJhZyh0cmVlTm9kZS5ub2RlKSl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtyZXR1cm4gZmFsc2U7fWV2ZW50LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkPSdtb3ZlJzsvLyB3cmFwIGluIHRyeSBjYXRjaCB0byBhZGRyZXNzIElFJ3MgZXJyb3Igd2hlbiBmaXJzdCBwYXJhbSBpcyAndGV4dC9wbGFpbicKdHJ5ey8vIHNldERhdGEgaXMgcmVxdWlyZWQgZm9yIGRyYWdnYWJsZSB0byB3b3JrIGluIEZpcmVGb3gKLy8gdGhlIGNvbnRlbnQgaGFzIHRvIGJlICcnIHNvIGRyYWdnaW5nIGEgbm9kZSBvdXQgb2YgdGhlIHRyZWUgd29uJ3Qgb3BlbiBhIG5ldyB0YWIgaW4gRmlyZUZveApldmVudC5kYXRhVHJhbnNmZXIuc2V0RGF0YSgndGV4dC9wbGFpbicsJycpO31jYXRjaChlKXt9ZHJhZ1N0YXRlLmRyYWdnaW5nTm9kZT10cmVlTm9kZTtfdGhpcy4kZW1pdCgnbm9kZS1kcmFnLXN0YXJ0Jyx0cmVlTm9kZS5ub2RlLGV2ZW50KTt9KTt0aGlzLiRvbigndHJlZS1ub2RlLWRyYWctb3ZlcicsZnVuY3Rpb24oZXZlbnQsdHJlZU5vZGUpe3ZhciBkcm9wTm9kZT1maW5kTmVhcmVzdENvbXBvbmVudChldmVudC50YXJnZXQsJ0VsVHJlZU5vZGUnKTt2YXIgb2xkRHJvcE5vZGU9ZHJhZ1N0YXRlLmRyb3BOb2RlO2lmKG9sZERyb3BOb2RlJiZvbGREcm9wTm9kZSE9PWRyb3BOb2RlKXtPYmplY3QoZG9tX1sicmVtb3ZlQ2xhc3MiXSkob2xkRHJvcE5vZGUuJGVsLCdpcy1kcm9wLWlubmVyJyk7fXZhciBkcmFnZ2luZ05vZGU9ZHJhZ1N0YXRlLmRyYWdnaW5nTm9kZTtpZighZHJhZ2dpbmdOb2RlfHwhZHJvcE5vZGUpcmV0dXJuO3ZhciBkcm9wUHJldj10cnVlO3ZhciBkcm9wSW5uZXI9dHJ1ZTt2YXIgZHJvcE5leHQ9dHJ1ZTt2YXIgdXNlckFsbG93RHJvcElubmVyPXRydWU7aWYodHlwZW9mIF90aGlzLmFsbG93RHJvcD09PSdmdW5jdGlvbicpe2Ryb3BQcmV2PV90aGlzLmFsbG93RHJvcChkcmFnZ2luZ05vZGUubm9kZSxkcm9wTm9kZS5ub2RlLCdwcmV2Jyk7dXNlckFsbG93RHJvcElubmVyPWRyb3BJbm5lcj1fdGhpcy5hbGxvd0Ryb3AoZHJhZ2dpbmdOb2RlLm5vZGUsZHJvcE5vZGUubm9kZSwnaW5uZXInKTtkcm9wTmV4dD1fdGhpcy5hbGxvd0Ryb3AoZHJhZ2dpbmdOb2RlLm5vZGUsZHJvcE5vZGUubm9kZSwnbmV4dCcpO31ldmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdD1kcm9wSW5uZXI/J21vdmUnOidub25lJztpZigoZHJvcFByZXZ8fGRyb3BJbm5lcnx8ZHJvcE5leHQpJiZvbGREcm9wTm9kZSE9PWRyb3BOb2RlKXtpZihvbGREcm9wTm9kZSl7X3RoaXMuJGVtaXQoJ25vZGUtZHJhZy1sZWF2ZScsZHJhZ2dpbmdOb2RlLm5vZGUsb2xkRHJvcE5vZGUubm9kZSxldmVudCk7fV90aGlzLiRlbWl0KCdub2RlLWRyYWctZW50ZXInLGRyYWdnaW5nTm9kZS5ub2RlLGRyb3BOb2RlLm5vZGUsZXZlbnQpO31pZihkcm9wUHJldnx8ZHJvcElubmVyfHxkcm9wTmV4dCl7ZHJhZ1N0YXRlLmRyb3BOb2RlPWRyb3BOb2RlO31pZihkcm9wTm9kZS5ub2RlLm5leHRTaWJsaW5nPT09ZHJhZ2dpbmdOb2RlLm5vZGUpe2Ryb3BOZXh0PWZhbHNlO31pZihkcm9wTm9kZS5ub2RlLnByZXZpb3VzU2libGluZz09PWRyYWdnaW5nTm9kZS5ub2RlKXtkcm9wUHJldj1mYWxzZTt9aWYoZHJvcE5vZGUubm9kZS5jb250YWlucyhkcmFnZ2luZ05vZGUubm9kZSxmYWxzZSkpe2Ryb3BJbm5lcj1mYWxzZTt9aWYoZHJhZ2dpbmdOb2RlLm5vZGU9PT1kcm9wTm9kZS5ub2RlfHxkcmFnZ2luZ05vZGUubm9kZS5jb250YWlucyhkcm9wTm9kZS5ub2RlKSl7ZHJvcFByZXY9ZmFsc2U7ZHJvcElubmVyPWZhbHNlO2Ryb3BOZXh0PWZhbHNlO312YXIgdGFyZ2V0UG9zaXRpb249ZHJvcE5vZGUuJGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3ZhciB0cmVlUG9zaXRpb249X3RoaXMuJGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3ZhciBkcm9wVHlwZT12b2lkIDA7dmFyIHByZXZQZXJjZW50PWRyb3BQcmV2P2Ryb3BJbm5lcj8wLjI1OmRyb3BOZXh0PzAuNDU6MTotMTt2YXIgbmV4dFBlcmNlbnQ9ZHJvcE5leHQ/ZHJvcElubmVyPzAuNzU6ZHJvcFByZXY/MC41NTowOjE7dmFyIGluZGljYXRvclRvcD0tOTk5OTt2YXIgZGlzdGFuY2U9ZXZlbnQuY2xpZW50WS10YXJnZXRQb3NpdGlvbi50b3A7aWYoZGlzdGFuY2U8dGFyZ2V0UG9zaXRpb24uaGVpZ2h0KnByZXZQZXJjZW50KXtkcm9wVHlwZT0nYmVmb3JlJzt9ZWxzZSBpZihkaXN0YW5jZT50YXJnZXRQb3NpdGlvbi5oZWlnaHQqbmV4dFBlcmNlbnQpe2Ryb3BUeXBlPSdhZnRlcic7fWVsc2UgaWYoZHJvcElubmVyKXtkcm9wVHlwZT0naW5uZXInO31lbHNle2Ryb3BUeXBlPSdub25lJzt9dmFyIGljb25Qb3NpdGlvbj1kcm9wTm9kZS4kZWwucXVlcnlTZWxlY3RvcignLmVsLXRyZWUtbm9kZV9fZXhwYW5kLWljb24nKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgZHJvcEluZGljYXRvcj1fdGhpcy4kcmVmcy5kcm9wSW5kaWNhdG9yO2lmKGRyb3BUeXBlPT09J2JlZm9yZScpe2luZGljYXRvclRvcD1pY29uUG9zaXRpb24udG9wLXRyZWVQb3NpdGlvbi50b3A7fWVsc2UgaWYoZHJvcFR5cGU9PT0nYWZ0ZXInKXtpbmRpY2F0b3JUb3A9aWNvblBvc2l0aW9uLmJvdHRvbS10cmVlUG9zaXRpb24udG9wO31kcm9wSW5kaWNhdG9yLnN0eWxlLnRvcD1pbmRpY2F0b3JUb3ArJ3B4Jztkcm9wSW5kaWNhdG9yLnN0eWxlLmxlZnQ9aWNvblBvc2l0aW9uLnJpZ2h0LXRyZWVQb3NpdGlvbi5sZWZ0KydweCc7aWYoZHJvcFR5cGU9PT0naW5uZXInKXtPYmplY3QoZG9tX1siYWRkQ2xhc3MiXSkoZHJvcE5vZGUuJGVsLCdpcy1kcm9wLWlubmVyJyk7fWVsc2V7T2JqZWN0KGRvbV9bInJlbW92ZUNsYXNzIl0pKGRyb3BOb2RlLiRlbCwnaXMtZHJvcC1pbm5lcicpO31kcmFnU3RhdGUuc2hvd0Ryb3BJbmRpY2F0b3I9ZHJvcFR5cGU9PT0nYmVmb3JlJ3x8ZHJvcFR5cGU9PT0nYWZ0ZXInO2RyYWdTdGF0ZS5hbGxvd0Ryb3A9ZHJhZ1N0YXRlLnNob3dEcm9wSW5kaWNhdG9yfHx1c2VyQWxsb3dEcm9wSW5uZXI7ZHJhZ1N0YXRlLmRyb3BUeXBlPWRyb3BUeXBlO190aGlzLiRlbWl0KCdub2RlLWRyYWctb3ZlcicsZHJhZ2dpbmdOb2RlLm5vZGUsZHJvcE5vZGUubm9kZSxldmVudCk7fSk7dGhpcy4kb24oJ3RyZWUtbm9kZS1kcmFnLWVuZCcsZnVuY3Rpb24oZXZlbnQpe3ZhciBkcmFnZ2luZ05vZGU9ZHJhZ1N0YXRlLmRyYWdnaW5nTm9kZSxkcm9wVHlwZT1kcmFnU3RhdGUuZHJvcFR5cGUsZHJvcE5vZGU9ZHJhZ1N0YXRlLmRyb3BOb2RlO2V2ZW50LnByZXZlbnREZWZhdWx0KCk7ZXZlbnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3Q9J21vdmUnO2lmKGRyYWdnaW5nTm9kZSYmZHJvcE5vZGUpe3ZhciBkcmFnZ2luZ05vZGVDb3B5PXtkYXRhOmRyYWdnaW5nTm9kZS5ub2RlLmRhdGF9O2lmKGRyb3BUeXBlIT09J25vbmUnKXtkcmFnZ2luZ05vZGUubm9kZS5yZW1vdmUoKTt9aWYoZHJvcFR5cGU9PT0nYmVmb3JlJyl7ZHJvcE5vZGUubm9kZS5wYXJlbnQuaW5zZXJ0QmVmb3JlKGRyYWdnaW5nTm9kZUNvcHksZHJvcE5vZGUubm9kZSk7fWVsc2UgaWYoZHJvcFR5cGU9PT0nYWZ0ZXInKXtkcm9wTm9kZS5ub2RlLnBhcmVudC5pbnNlcnRBZnRlcihkcmFnZ2luZ05vZGVDb3B5LGRyb3BOb2RlLm5vZGUpO31lbHNlIGlmKGRyb3BUeXBlPT09J2lubmVyJyl7ZHJvcE5vZGUubm9kZS5pbnNlcnRDaGlsZChkcmFnZ2luZ05vZGVDb3B5KTt9aWYoZHJvcFR5cGUhPT0nbm9uZScpe190aGlzLnN0b3JlLnJlZ2lzdGVyTm9kZShkcmFnZ2luZ05vZGVDb3B5KTt9T2JqZWN0KGRvbV9bInJlbW92ZUNsYXNzIl0pKGRyb3BOb2RlLiRlbCwnaXMtZHJvcC1pbm5lcicpO190aGlzLiRlbWl0KCdub2RlLWRyYWctZW5kJyxkcmFnZ2luZ05vZGUubm9kZSxkcm9wTm9kZS5ub2RlLGRyb3BUeXBlLGV2ZW50KTtpZihkcm9wVHlwZSE9PSdub25lJyl7X3RoaXMuJGVtaXQoJ25vZGUtZHJvcCcsZHJhZ2dpbmdOb2RlLm5vZGUsZHJvcE5vZGUubm9kZSxkcm9wVHlwZSxldmVudCk7fX1pZihkcmFnZ2luZ05vZGUmJiFkcm9wTm9kZSl7X3RoaXMuJGVtaXQoJ25vZGUtZHJhZy1lbmQnLGRyYWdnaW5nTm9kZS5ub2RlLG51bGwsZHJvcFR5cGUsZXZlbnQpO31kcmFnU3RhdGUuc2hvd0Ryb3BJbmRpY2F0b3I9ZmFsc2U7ZHJhZ1N0YXRlLmRyYWdnaW5nTm9kZT1udWxsO2RyYWdTdGF0ZS5kcm9wTm9kZT1udWxsO2RyYWdTdGF0ZS5hbGxvd0Ryb3A9dHJ1ZTt9KTt9LG1vdW50ZWQ6ZnVuY3Rpb24gbW91bnRlZCgpe3RoaXMuaW5pdFRhYkluZGV4KCk7dGhpcy4kZWwuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdGhpcy5oYW5kbGVLZXlkb3duKTt9LHVwZGF0ZWQ6ZnVuY3Rpb24gdXBkYXRlZCgpe3RoaXMudHJlZUl0ZW1zPXRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tyb2xlPXRyZWVpdGVtXScpO3RoaXMuY2hlY2tib3hJdGVtcz10aGlzLiRlbC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPWNoZWNrYm94XScpO319Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdHJlZS9zcmMvdHJlZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc3JjX3RyZWV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189dHJlZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RyZWUvc3JjL3RyZWUudnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgdHJlZV9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHNyY190cmVldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLHRyZWV2dWVfdHlwZV90ZW1wbGF0ZV9pZF81NDc1NzVhNl9yZW5kZXIsdHJlZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzU0NzU3NWE2X3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgdHJlZV9hcGk7fXRyZWVfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy90cmVlL3NyYy90cmVlLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfdHJlZT10cmVlX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdHJlZS9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL3NyY190cmVlLmluc3RhbGw9ZnVuY3Rpb24oVnVlKXtWdWUuY29tcG9uZW50KHNyY190cmVlLm5hbWUsc3JjX3RyZWUpO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYWNrYWdlc190cmVlPXNyY190cmVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvYWxlcnQvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTZlNTMzNDFiJgp2YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzZlNTMzNDFiX3JlbmRlcj1mdW5jdGlvbiBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNmU1MzM0MWJfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJ0cmFuc2l0aW9uIix7YXR0cnM6e25hbWU6ImVsLWFsZXJ0LWZhZGUifX0sW19jKCJkaXYiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTpfdm0udmlzaWJsZSxleHByZXNzaW9uOiJ2aXNpYmxlIn1dLHN0YXRpY0NsYXNzOiJlbC1hbGVydCIsY2xhc3M6W192bS50eXBlQ2xhc3MsX3ZtLmNlbnRlcj8iaXMtY2VudGVyIjoiIiwiaXMtIitfdm0uZWZmZWN0XSxhdHRyczp7cm9sZToiYWxlcnQifX0sW192bS5zaG93SWNvbj9fYygiaSIse3N0YXRpY0NsYXNzOiJlbC1hbGVydF9faWNvbiIsY2xhc3M6W192bS5pY29uQ2xhc3MsX3ZtLmlzQmlnSWNvbl19KTpfdm0uX2UoKSxfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLWFsZXJ0X19jb250ZW50In0sW192bS50aXRsZXx8X3ZtLiRzbG90cy50aXRsZT9fYygic3BhbiIse3N0YXRpY0NsYXNzOiJlbC1hbGVydF9fdGl0bGUiLGNsYXNzOltfdm0uaXNCb2xkVGl0bGVdfSxbX3ZtLl90KCJ0aXRsZSIsW192bS5fdihfdm0uX3MoX3ZtLnRpdGxlKSldKV0sMik6X3ZtLl9lKCksX3ZtLiRzbG90cy5kZWZhdWx0JiYhX3ZtLmRlc2NyaXB0aW9uP19jKCJwIix7c3RhdGljQ2xhc3M6ImVsLWFsZXJ0X19kZXNjcmlwdGlvbiJ9LFtfdm0uX3QoImRlZmF1bHQiKV0sMik6X3ZtLl9lKCksX3ZtLmRlc2NyaXB0aW9uJiYhX3ZtLiRzbG90cy5kZWZhdWx0P19jKCJwIix7c3RhdGljQ2xhc3M6ImVsLWFsZXJ0X19kZXNjcmlwdGlvbiJ9LFtfdm0uX3YoX3ZtLl9zKF92bS5kZXNjcmlwdGlvbikpXSk6X3ZtLl9lKCksX2MoImkiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTpfdm0uY2xvc2FibGUsZXhwcmVzc2lvbjoiY2xvc2FibGUifV0sc3RhdGljQ2xhc3M6ImVsLWFsZXJ0X19jbG9zZWJ0biIsY2xhc3M6eyJpcy1jdXN0b21lZCI6X3ZtLmNsb3NlVGV4dCE9PSIiLCJlbC1pY29uLWNsb3NlIjpfdm0uY2xvc2VUZXh0PT09IiJ9LG9uOntjbGljazpmdW5jdGlvbiBjbGljaygkZXZlbnQpe192bS5jbG9zZSgpO319fSxbX3ZtLl92KF92bS5fcyhfdm0uY2xvc2VUZXh0KSldKV0pXSldKTt9O3ZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNmU1MzM0MWJfc3RhdGljUmVuZGVyRm5zPVtdO21haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF82ZTUzMzQxYl9yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYWxlcnQvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTZlNTMzNDFiJgovLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9hbGVydC9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCnZhciBUWVBFX0NMQVNTRVNfTUFQPXsnc3VjY2Vzcyc6J2VsLWljb24tc3VjY2VzcycsJ3dhcm5pbmcnOidlbC1pY29uLXdhcm5pbmcnLCdlcnJvcic6J2VsLWljb24tZXJyb3InfTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGFsZXJ0X3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbEFsZXJ0Jyxwcm9wczp7dGl0bGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6Jyd9LGRlc2NyaXB0aW9uOnt0eXBlOlN0cmluZyxkZWZhdWx0OicnfSx0eXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OidpbmZvJ30sY2xvc2FibGU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OnRydWV9LGNsb3NlVGV4dDp7dHlwZTpTdHJpbmcsZGVmYXVsdDonJ30sc2hvd0ljb246Qm9vbGVhbixjZW50ZXI6Qm9vbGVhbixlZmZlY3Q6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6J2xpZ2h0Jyx2YWxpZGF0b3I6ZnVuY3Rpb24gdmFsaWRhdG9yKHZhbHVlKXtyZXR1cm5bJ2xpZ2h0JywnZGFyayddLmluZGV4T2YodmFsdWUpIT09LTE7fX19LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybnt2aXNpYmxlOnRydWV9O30sbWV0aG9kczp7Y2xvc2U6ZnVuY3Rpb24gY2xvc2UoKXt0aGlzLnZpc2libGU9ZmFsc2U7dGhpcy4kZW1pdCgnY2xvc2UnKTt9fSxjb21wdXRlZDp7dHlwZUNsYXNzOmZ1bmN0aW9uIHR5cGVDbGFzcygpe3JldHVybidlbC1hbGVydC0tJyt0aGlzLnR5cGU7fSxpY29uQ2xhc3M6ZnVuY3Rpb24gaWNvbkNsYXNzKCl7cmV0dXJuIFRZUEVfQ0xBU1NFU19NQVBbdGhpcy50eXBlXXx8J2VsLWljb24taW5mbyc7fSxpc0JpZ0ljb246ZnVuY3Rpb24gaXNCaWdJY29uKCl7cmV0dXJuIHRoaXMuZGVzY3JpcHRpb258fHRoaXMuJHNsb3RzLmRlZmF1bHQ/J2lzLWJpZyc6Jyc7fSxpc0JvbGRUaXRsZTpmdW5jdGlvbiBpc0JvbGRUaXRsZSgpe3JldHVybiB0aGlzLmRlc2NyaXB0aW9ufHx0aGlzLiRzbG90cy5kZWZhdWx0Pydpcy1ib2xkJzonJzt9fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9hbGVydC9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFja2FnZXNfYWxlcnRfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189YWxlcnRfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9hbGVydC9zcmMvbWFpbi52dWUKLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciBhbGVydF9zcmNfbWFpbl9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHBhY2thZ2VzX2FsZXJ0X3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF82ZTUzMzQxYl9yZW5kZXIsbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzZlNTMzNDFiX3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgYWxlcnRfc3JjX21haW5fYXBpO31hbGVydF9zcmNfbWFpbl9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL2FsZXJ0L3NyYy9tYWluLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBhbGVydF9zcmNfbWFpbj1hbGVydF9zcmNfbWFpbl9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2FsZXJ0L2luZGV4LmpzCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovYWxlcnRfc3JjX21haW4uaW5zdGFsbD1mdW5jdGlvbihWdWUpe1Z1ZS5jb21wb25lbnQoYWxlcnRfc3JjX21haW4ubmFtZSxhbGVydF9zcmNfbWFpbik7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX2FsZXJ0PWFsZXJ0X3NyY19tYWluOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvbm90aWZpY2F0aW9uL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD00M2RiYzNkOCYKdmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF80M2RiYzNkOF9yZW5kZXI9ZnVuY3Rpb24gbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQzZGJjM2Q4X3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygidHJhbnNpdGlvbiIse2F0dHJzOntuYW1lOiJlbC1ub3RpZmljYXRpb24tZmFkZSJ9fSxbX2MoImRpdiIse2RpcmVjdGl2ZXM6W3tuYW1lOiJzaG93IixyYXdOYW1lOiJ2LXNob3ciLHZhbHVlOl92bS52aXNpYmxlLGV4cHJlc3Npb246InZpc2libGUifV0sY2xhc3M6WyJlbC1ub3RpZmljYXRpb24iLF92bS5jdXN0b21DbGFzcyxfdm0uaG9yaXpvbnRhbENsYXNzXSxzdHlsZTpfdm0ucG9zaXRpb25TdHlsZSxhdHRyczp7cm9sZToiYWxlcnQifSxvbjp7bW91c2VlbnRlcjpmdW5jdGlvbiBtb3VzZWVudGVyKCRldmVudCl7X3ZtLmNsZWFyVGltZXIoKTt9LG1vdXNlbGVhdmU6ZnVuY3Rpb24gbW91c2VsZWF2ZSgkZXZlbnQpe192bS5zdGFydFRpbWVyKCk7fSxjbGljazpfdm0uY2xpY2t9fSxbX3ZtLnR5cGV8fF92bS5pY29uQ2xhc3M/X2MoImkiLHtzdGF0aWNDbGFzczoiZWwtbm90aWZpY2F0aW9uX19pY29uIixjbGFzczpbX3ZtLnR5cGVDbGFzcyxfdm0uaWNvbkNsYXNzXX0pOl92bS5fZSgpLF9jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtbm90aWZpY2F0aW9uX19ncm91cCIsY2xhc3M6eyJpcy13aXRoLWljb24iOl92bS50eXBlQ2xhc3N8fF92bS5pY29uQ2xhc3N9fSxbX2MoImgyIix7c3RhdGljQ2xhc3M6ImVsLW5vdGlmaWNhdGlvbl9fdGl0bGUiLGRvbVByb3BzOnt0ZXh0Q29udGVudDpfdm0uX3MoX3ZtLnRpdGxlKX19KSxfYygiZGl2Iix7ZGlyZWN0aXZlczpbe25hbWU6InNob3ciLHJhd05hbWU6InYtc2hvdyIsdmFsdWU6X3ZtLm1lc3NhZ2UsZXhwcmVzc2lvbjoibWVzc2FnZSJ9XSxzdGF0aWNDbGFzczoiZWwtbm90aWZpY2F0aW9uX19jb250ZW50In0sW192bS5fdCgiZGVmYXVsdCIsWyFfdm0uZGFuZ2Vyb3VzbHlVc2VIVE1MU3RyaW5nP19jKCJwIixbX3ZtLl92KF92bS5fcyhfdm0ubWVzc2FnZSkpXSk6X2MoInAiLHtkb21Qcm9wczp7aW5uZXJIVE1MOl92bS5fcyhfdm0ubWVzc2FnZSl9fSldKV0sMiksX3ZtLnNob3dDbG9zZT9fYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLW5vdGlmaWNhdGlvbl9fY2xvc2VCdG4gZWwtaWNvbi1jbG9zZSIsb246e2NsaWNrOmZ1bmN0aW9uIGNsaWNrKCRldmVudCl7JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO3JldHVybiBfdm0uY2xvc2UoJGV2ZW50KTt9fX0pOl92bS5fZSgpXSldKV0pO307dmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF80M2RiYzNkOF9zdGF0aWNSZW5kZXJGbnM9W107bWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQzZGJjM2Q4X3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9ub3RpZmljYXRpb24vc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTQzZGJjM2Q4JgovLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9ub3RpZmljYXRpb24vc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwp2YXIgbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX3R5cGVNYXA9e3N1Y2Nlc3M6J3N1Y2Nlc3MnLGluZm86J2luZm8nLHdhcm5pbmc6J3dhcm5pbmcnLGVycm9yOidlcnJvcid9Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgbm90aWZpY2F0aW9uX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtkYXRhOmZ1bmN0aW9uIGRhdGEoKXtyZXR1cm57dmlzaWJsZTpmYWxzZSx0aXRsZTonJyxtZXNzYWdlOicnLGR1cmF0aW9uOjQ1MDAsdHlwZTonJyxzaG93Q2xvc2U6dHJ1ZSxjdXN0b21DbGFzczonJyxpY29uQ2xhc3M6Jycsb25DbG9zZTpudWxsLG9uQ2xpY2s6bnVsbCxjbG9zZWQ6ZmFsc2UsdmVydGljYWxPZmZzZXQ6MCx0aW1lcjpudWxsLGRhbmdlcm91c2x5VXNlSFRNTFN0cmluZzpmYWxzZSxwb3NpdGlvbjondG9wLXJpZ2h0J307fSxjb21wdXRlZDp7dHlwZUNsYXNzOmZ1bmN0aW9uIHR5cGVDbGFzcygpe3JldHVybiB0aGlzLnR5cGUmJm1haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc190eXBlTWFwW3RoaXMudHlwZV0/J2VsLWljb24tJyttYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfdHlwZU1hcFt0aGlzLnR5cGVdOicnO30saG9yaXpvbnRhbENsYXNzOmZ1bmN0aW9uIGhvcml6b250YWxDbGFzcygpe3JldHVybiB0aGlzLnBvc2l0aW9uLmluZGV4T2YoJ3JpZ2h0Jyk+LTE/J3JpZ2h0JzonbGVmdCc7fSx2ZXJ0aWNhbFByb3BlcnR5OmZ1bmN0aW9uIHZlcnRpY2FsUHJvcGVydHkoKXtyZXR1cm4gL150b3AtLy50ZXN0KHRoaXMucG9zaXRpb24pPyd0b3AnOidib3R0b20nO30scG9zaXRpb25TdHlsZTpmdW5jdGlvbiBwb3NpdGlvblN0eWxlKCl7dmFyIF9yZWY7cmV0dXJuIF9yZWY9e30sX3JlZlt0aGlzLnZlcnRpY2FsUHJvcGVydHldPXRoaXMudmVydGljYWxPZmZzZXQrJ3B4JyxfcmVmO319LHdhdGNoOntjbG9zZWQ6ZnVuY3Rpb24gY2xvc2VkKG5ld1ZhbCl7aWYobmV3VmFsKXt0aGlzLnZpc2libGU9ZmFsc2U7dGhpcy4kZWwuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsdGhpcy5kZXN0cm95RWxlbWVudCk7fX19LG1ldGhvZHM6e2Rlc3Ryb3lFbGVtZW50OmZ1bmN0aW9uIGRlc3Ryb3lFbGVtZW50KCl7dGhpcy4kZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsdGhpcy5kZXN0cm95RWxlbWVudCk7dGhpcy4kZGVzdHJveSh0cnVlKTt0aGlzLiRlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuJGVsKTt9LGNsaWNrOmZ1bmN0aW9uIGNsaWNrKCl7aWYodHlwZW9mIHRoaXMub25DbGljaz09PSdmdW5jdGlvbicpe3RoaXMub25DbGljaygpO319LGNsb3NlOmZ1bmN0aW9uIGNsb3NlKCl7dGhpcy5jbG9zZWQ9dHJ1ZTtpZih0eXBlb2YgdGhpcy5vbkNsb3NlPT09J2Z1bmN0aW9uJyl7dGhpcy5vbkNsb3NlKCk7fX0sY2xlYXJUaW1lcjpmdW5jdGlvbiBjbGVhclRpbWVyKCl7Y2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO30sc3RhcnRUaW1lcjpmdW5jdGlvbiBzdGFydFRpbWVyKCl7dmFyIF90aGlzPXRoaXM7aWYodGhpcy5kdXJhdGlvbj4wKXt0aGlzLnRpbWVyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpZighX3RoaXMuY2xvc2VkKXtfdGhpcy5jbG9zZSgpO319LHRoaXMuZHVyYXRpb24pO319LGtleWRvd246ZnVuY3Rpb24ga2V5ZG93bihlKXtpZihlLmtleUNvZGU9PT00Nnx8ZS5rZXlDb2RlPT09OCl7dGhpcy5jbGVhclRpbWVyKCk7Ly8gZGV0ZWxlIOWPlua2iOWAkuiuoeaXtgp9ZWxzZSBpZihlLmtleUNvZGU9PT0yNyl7Ly8gZXNj5YWz6Zet5raI5oGvCmlmKCF0aGlzLmNsb3NlZCl7dGhpcy5jbG9zZSgpO319ZWxzZXt0aGlzLnN0YXJ0VGltZXIoKTsvLyDmgaLlpI3lgJLorqHml7YKfX19LG1vdW50ZWQ6ZnVuY3Rpb24gbW91bnRlZCgpe3ZhciBfdGhpczI9dGhpcztpZih0aGlzLmR1cmF0aW9uPjApe3RoaXMudGltZXI9c2V0VGltZW91dChmdW5jdGlvbigpe2lmKCFfdGhpczIuY2xvc2VkKXtfdGhpczIuY2xvc2UoKTt9fSx0aGlzLmR1cmF0aW9uKTt9ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdGhpcy5rZXlkb3duKTt9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpe2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLHRoaXMua2V5ZG93bik7fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9ub3RpZmljYXRpb24vc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX25vdGlmaWNhdGlvbl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz1ub3RpZmljYXRpb25fc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9ub3RpZmljYXRpb24vc3JjL21haW4udnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgbm90aWZpY2F0aW9uX3NyY19tYWluX2NvbXBvbmVudD1ub3JtYWxpemVDb21wb25lbnQocGFja2FnZXNfbm90aWZpY2F0aW9uX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF80M2RiYzNkOF9yZW5kZXIsbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQzZGJjM2Q4X3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgbm90aWZpY2F0aW9uX3NyY19tYWluX2FwaTt9bm90aWZpY2F0aW9uX3NyY19tYWluX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvbm90aWZpY2F0aW9uL3NyYy9tYWluLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBub3RpZmljYXRpb25fc3JjX21haW49bm90aWZpY2F0aW9uX3NyY19tYWluX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvbm90aWZpY2F0aW9uL3NyYy9tYWluLmpzCnZhciBOb3RpZmljYXRpb25Db25zdHJ1Y3Rvcj1leHRlcm5hbF92dWVfZGVmYXVsdC5hLmV4dGVuZChub3RpZmljYXRpb25fc3JjX21haW4pO3ZhciBzcmNfbWFpbl9pbnN0YW5jZT12b2lkIDA7dmFyIGluc3RhbmNlcz1bXTt2YXIgc2VlZD0xO3ZhciBtYWluX05vdGlmaWNhdGlvbj1mdW5jdGlvbiBOb3RpZmljYXRpb24ob3B0aW9ucyl7aWYoZXh0ZXJuYWxfdnVlX2RlZmF1bHQuYS5wcm90b3R5cGUuJGlzU2VydmVyKXJldHVybjtvcHRpb25zPW1lcmdlX2RlZmF1bHQoKSh7fSxvcHRpb25zKTt2YXIgdXNlck9uQ2xvc2U9b3B0aW9ucy5vbkNsb3NlO3ZhciBpZD0nbm90aWZpY2F0aW9uXycrc2VlZCsrO3ZhciBwb3NpdGlvbj1vcHRpb25zLnBvc2l0aW9ufHwndG9wLXJpZ2h0JztvcHRpb25zLm9uQ2xvc2U9ZnVuY3Rpb24oKXtOb3RpZmljYXRpb24uY2xvc2UoaWQsdXNlck9uQ2xvc2UpO307c3JjX21haW5faW5zdGFuY2U9bmV3IE5vdGlmaWNhdGlvbkNvbnN0cnVjdG9yKHtkYXRhOm9wdGlvbnN9KTtpZihPYmplY3QodmRvbV9bImlzVk5vZGUiXSkob3B0aW9ucy5tZXNzYWdlKSl7c3JjX21haW5faW5zdGFuY2UuJHNsb3RzLmRlZmF1bHQ9W29wdGlvbnMubWVzc2FnZV07b3B0aW9ucy5tZXNzYWdlPSdSRVBMQUNFRF9CWV9WTk9ERSc7fXNyY19tYWluX2luc3RhbmNlLmlkPWlkO3NyY19tYWluX2luc3RhbmNlLiRtb3VudCgpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc3JjX21haW5faW5zdGFuY2UuJGVsKTtzcmNfbWFpbl9pbnN0YW5jZS52aXNpYmxlPXRydWU7c3JjX21haW5faW5zdGFuY2UuZG9tPXNyY19tYWluX2luc3RhbmNlLiRlbDtzcmNfbWFpbl9pbnN0YW5jZS5kb20uc3R5bGUuekluZGV4PXBvcHVwX1siUG9wdXBNYW5hZ2VyIl0ubmV4dFpJbmRleCgpO3ZhciB2ZXJ0aWNhbE9mZnNldD1vcHRpb25zLm9mZnNldHx8MDtpbnN0YW5jZXMuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pe3JldHVybiBpdGVtLnBvc2l0aW9uPT09cG9zaXRpb247fSkuZm9yRWFjaChmdW5jdGlvbihpdGVtKXt2ZXJ0aWNhbE9mZnNldCs9aXRlbS4kZWwub2Zmc2V0SGVpZ2h0KzE2O30pO3ZlcnRpY2FsT2Zmc2V0Kz0xNjtzcmNfbWFpbl9pbnN0YW5jZS52ZXJ0aWNhbE9mZnNldD12ZXJ0aWNhbE9mZnNldDtpbnN0YW5jZXMucHVzaChzcmNfbWFpbl9pbnN0YW5jZSk7cmV0dXJuIHNyY19tYWluX2luc3RhbmNlO307WydzdWNjZXNzJywnd2FybmluZycsJ2luZm8nLCdlcnJvciddLmZvckVhY2goZnVuY3Rpb24odHlwZSl7bWFpbl9Ob3RpZmljYXRpb25bdHlwZV09ZnVuY3Rpb24ob3B0aW9ucyl7aWYodHlwZW9mIG9wdGlvbnM9PT0nc3RyaW5nJ3x8T2JqZWN0KHZkb21fWyJpc1ZOb2RlIl0pKG9wdGlvbnMpKXtvcHRpb25zPXttZXNzYWdlOm9wdGlvbnN9O31vcHRpb25zLnR5cGU9dHlwZTtyZXR1cm4gbWFpbl9Ob3RpZmljYXRpb24ob3B0aW9ucyk7fTt9KTttYWluX05vdGlmaWNhdGlvbi5jbG9zZT1mdW5jdGlvbihpZCx1c2VyT25DbG9zZSl7dmFyIGluZGV4PS0xO3ZhciBsZW49aW5zdGFuY2VzLmxlbmd0aDt2YXIgaW5zdGFuY2U9aW5zdGFuY2VzLmZpbHRlcihmdW5jdGlvbihpbnN0YW5jZSxpKXtpZihpbnN0YW5jZS5pZD09PWlkKXtpbmRleD1pO3JldHVybiB0cnVlO31yZXR1cm4gZmFsc2U7fSlbMF07aWYoIWluc3RhbmNlKXJldHVybjtpZih0eXBlb2YgdXNlck9uQ2xvc2U9PT0nZnVuY3Rpb24nKXt1c2VyT25DbG9zZShpbnN0YW5jZSk7fWluc3RhbmNlcy5zcGxpY2UoaW5kZXgsMSk7aWYobGVuPD0xKXJldHVybjt2YXIgcG9zaXRpb249aW5zdGFuY2UucG9zaXRpb247dmFyIHJlbW92ZWRIZWlnaHQ9aW5zdGFuY2UuZG9tLm9mZnNldEhlaWdodDtmb3IodmFyIGk9aW5kZXg7aTxsZW4tMTtpKyspe2lmKGluc3RhbmNlc1tpXS5wb3NpdGlvbj09PXBvc2l0aW9uKXtpbnN0YW5jZXNbaV0uZG9tLnN0eWxlW2luc3RhbmNlLnZlcnRpY2FsUHJvcGVydHldPXBhcnNlSW50KGluc3RhbmNlc1tpXS5kb20uc3R5bGVbaW5zdGFuY2UudmVydGljYWxQcm9wZXJ0eV0sMTApLXJlbW92ZWRIZWlnaHQtMTYrJ3B4Jzt9fX07bWFpbl9Ob3RpZmljYXRpb24uY2xvc2VBbGw9ZnVuY3Rpb24oKXtmb3IodmFyIGk9aW5zdGFuY2VzLmxlbmd0aC0xO2k+PTA7aS0tKXtpbnN0YW5jZXNbaV0uY2xvc2UoKTt9fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX25vdGlmaWNhdGlvbl9zcmNfbWFpbj1tYWluX05vdGlmaWNhdGlvbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL25vdGlmaWNhdGlvbi9pbmRleC5qcwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIG5vdGlmaWNhdGlvbj1wYWNrYWdlc19ub3RpZmljYXRpb25fc3JjX21haW47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9zbGlkZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTMyNzA4NjQ0Jgp2YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzMyNzA4NjQ0X3JlbmRlcj1mdW5jdGlvbiBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfMzI3MDg2NDRfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtc2xpZGVyIixjbGFzczp7ImlzLXZlcnRpY2FsIjpfdm0udmVydGljYWwsImVsLXNsaWRlci0td2l0aC1pbnB1dCI6X3ZtLnNob3dJbnB1dH0sYXR0cnM6e3JvbGU6InNsaWRlciIsImFyaWEtdmFsdWVtaW4iOl92bS5taW4sImFyaWEtdmFsdWVtYXgiOl92bS5tYXgsImFyaWEtb3JpZW50YXRpb24iOl92bS52ZXJ0aWNhbD8idmVydGljYWwiOiJob3Jpem9udGFsIiwiYXJpYS1kaXNhYmxlZCI6X3ZtLnNsaWRlckRpc2FibGVkfX0sW192bS5zaG93SW5wdXQmJiFfdm0ucmFuZ2U/X2MoImVsLWlucHV0LW51bWJlciIse3JlZjoiaW5wdXQiLHN0YXRpY0NsYXNzOiJlbC1zbGlkZXJfX2lucHV0IixhdHRyczp7c3RlcDpfdm0uc3RlcCxkaXNhYmxlZDpfdm0uc2xpZGVyRGlzYWJsZWQsY29udHJvbHM6X3ZtLnNob3dJbnB1dENvbnRyb2xzLG1pbjpfdm0ubWluLG1heDpfdm0ubWF4LGRlYm91bmNlOl92bS5kZWJvdW5jZSxzaXplOl92bS5pbnB1dFNpemV9LG9uOntjaGFuZ2U6X3ZtLmVtaXRDaGFuZ2V9LG1vZGVsOnt2YWx1ZTpfdm0uZmlyc3RWYWx1ZSxjYWxsYmFjazpmdW5jdGlvbiBjYWxsYmFjaygkJHYpe192bS5maXJzdFZhbHVlPSQkdjt9LGV4cHJlc3Npb246ImZpcnN0VmFsdWUifX0pOl92bS5fZSgpLF9jKCJkaXYiLHtyZWY6InNsaWRlciIsc3RhdGljQ2xhc3M6ImVsLXNsaWRlcl9fcnVud2F5IixjbGFzczp7InNob3ctaW5wdXQiOl92bS5zaG93SW5wdXQsZGlzYWJsZWQ6X3ZtLnNsaWRlckRpc2FibGVkfSxzdHlsZTpfdm0ucnVud2F5U3R5bGUsb246e2NsaWNrOl92bS5vblNsaWRlckNsaWNrfX0sW19jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtc2xpZGVyX19iYXIiLHN0eWxlOl92bS5iYXJTdHlsZX0pLF9jKCJzbGlkZXItYnV0dG9uIix7cmVmOiJidXR0b24xIixhdHRyczp7dmVydGljYWw6X3ZtLnZlcnRpY2FsLCJ0b29sdGlwLWNsYXNzIjpfdm0udG9vbHRpcENsYXNzfSxtb2RlbDp7dmFsdWU6X3ZtLmZpcnN0VmFsdWUsY2FsbGJhY2s6ZnVuY3Rpb24gY2FsbGJhY2soJCR2KXtfdm0uZmlyc3RWYWx1ZT0kJHY7fSxleHByZXNzaW9uOiJmaXJzdFZhbHVlIn19KSxfdm0ucmFuZ2U/X2MoInNsaWRlci1idXR0b24iLHtyZWY6ImJ1dHRvbjIiLGF0dHJzOnt2ZXJ0aWNhbDpfdm0udmVydGljYWwsInRvb2x0aXAtY2xhc3MiOl92bS50b29sdGlwQ2xhc3N9LG1vZGVsOnt2YWx1ZTpfdm0uc2Vjb25kVmFsdWUsY2FsbGJhY2s6ZnVuY3Rpb24gY2FsbGJhY2soJCR2KXtfdm0uc2Vjb25kVmFsdWU9JCR2O30sZXhwcmVzc2lvbjoic2Vjb25kVmFsdWUifX0pOl92bS5fZSgpLF92bS5fbChfdm0uc3RvcHMsZnVuY3Rpb24oaXRlbSxrZXkpe3JldHVybiBfdm0uc2hvd1N0b3BzP19jKCJkaXYiLHtrZXk6a2V5LHN0YXRpY0NsYXNzOiJlbC1zbGlkZXJfX3N0b3AiLHN0eWxlOl92bS5nZXRTdG9wU3R5bGUoaXRlbSl9KTpfdm0uX2UoKTt9KSxfdm0ubWFya0xpc3QubGVuZ3RoPjA/W19jKCJkaXYiLF92bS5fbChfdm0ubWFya0xpc3QsZnVuY3Rpb24oaXRlbSxrZXkpe3JldHVybiBfYygiZGl2Iix7a2V5OmtleSxzdGF0aWNDbGFzczoiZWwtc2xpZGVyX19zdG9wIGVsLXNsaWRlcl9fbWFya3Mtc3RvcCIsc3R5bGU6X3ZtLmdldFN0b3BTdHlsZShpdGVtLnBvc2l0aW9uKX0pO30pLDApLF9jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtc2xpZGVyX19tYXJrcyJ9LF92bS5fbChfdm0ubWFya0xpc3QsZnVuY3Rpb24oaXRlbSxrZXkpe3JldHVybiBfYygic2xpZGVyLW1hcmtlciIse2tleTprZXksc3R5bGU6X3ZtLmdldFN0b3BTdHlsZShpdGVtLnBvc2l0aW9uKSxhdHRyczp7bWFyazppdGVtLm1hcmt9fSk7fSksMSldOl92bS5fZSgpXSwyKV0sMSk7fTt2YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzMyNzA4NjQ0X3N0YXRpY1JlbmRlckZucz1bXTttYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfMzI3MDg2NDRfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NsaWRlci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MzI3MDg2NDQmCi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgImVsZW1lbnQtdWkvbGliL2lucHV0LW51bWJlciIKdmFyIGlucHV0X251bWJlcl89X193ZWJwYWNrX3JlcXVpcmVfXyg0MSk7dmFyIGlucHV0X251bWJlcl9kZWZhdWx0PS8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oaW5wdXRfbnVtYmVyXyk7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9zbGlkZXIvc3JjL2J1dHRvbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9ZTcyZDJhZDImCnZhciBidXR0b252dWVfdHlwZV90ZW1wbGF0ZV9pZF9lNzJkMmFkMl9yZW5kZXI9ZnVuY3Rpb24gYnV0dG9udnVlX3R5cGVfdGVtcGxhdGVfaWRfZTcyZDJhZDJfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJkaXYiLHtyZWY6ImJ1dHRvbiIsc3RhdGljQ2xhc3M6ImVsLXNsaWRlcl9fYnV0dG9uLXdyYXBwZXIiLGNsYXNzOntob3Zlcjpfdm0uaG92ZXJpbmcsZHJhZ2dpbmc6X3ZtLmRyYWdnaW5nfSxzdHlsZTpfdm0ud3JhcHBlclN0eWxlLGF0dHJzOnt0YWJpbmRleDoiMCJ9LG9uOnttb3VzZWVudGVyOl92bS5oYW5kbGVNb3VzZUVudGVyLG1vdXNlbGVhdmU6X3ZtLmhhbmRsZU1vdXNlTGVhdmUsbW91c2Vkb3duOl92bS5vbkJ1dHRvbkRvd24sdG91Y2hzdGFydDpfdm0ub25CdXR0b25Eb3duLGZvY3VzOl92bS5oYW5kbGVNb3VzZUVudGVyLGJsdXI6X3ZtLmhhbmRsZU1vdXNlTGVhdmUsa2V5ZG93bjpbZnVuY3Rpb24oJGV2ZW50KXtpZighKCJidXR0b24iaW4gJGV2ZW50KSYmX3ZtLl9rKCRldmVudC5rZXlDb2RlLCJsZWZ0IiwzNywkZXZlbnQua2V5LFsiTGVmdCIsIkFycm93TGVmdCJdKSl7cmV0dXJuIG51bGw7fWlmKCJidXR0b24iaW4gJGV2ZW50JiYkZXZlbnQuYnV0dG9uIT09MCl7cmV0dXJuIG51bGw7fXJldHVybiBfdm0ub25MZWZ0S2V5RG93bigkZXZlbnQpO30sZnVuY3Rpb24oJGV2ZW50KXtpZighKCJidXR0b24iaW4gJGV2ZW50KSYmX3ZtLl9rKCRldmVudC5rZXlDb2RlLCJyaWdodCIsMzksJGV2ZW50LmtleSxbIlJpZ2h0IiwiQXJyb3dSaWdodCJdKSl7cmV0dXJuIG51bGw7fWlmKCJidXR0b24iaW4gJGV2ZW50JiYkZXZlbnQuYnV0dG9uIT09Mil7cmV0dXJuIG51bGw7fXJldHVybiBfdm0ub25SaWdodEtleURvd24oJGV2ZW50KTt9LGZ1bmN0aW9uKCRldmVudCl7aWYoISgiYnV0dG9uImluICRldmVudCkmJl92bS5faygkZXZlbnQua2V5Q29kZSwiZG93biIsNDAsJGV2ZW50LmtleSxbIkRvd24iLCJBcnJvd0Rvd24iXSkpe3JldHVybiBudWxsO30kZXZlbnQucHJldmVudERlZmF1bHQoKTtyZXR1cm4gX3ZtLm9uTGVmdEtleURvd24oJGV2ZW50KTt9LGZ1bmN0aW9uKCRldmVudCl7aWYoISgiYnV0dG9uImluICRldmVudCkmJl92bS5faygkZXZlbnQua2V5Q29kZSwidXAiLDM4LCRldmVudC5rZXksWyJVcCIsIkFycm93VXAiXSkpe3JldHVybiBudWxsO30kZXZlbnQucHJldmVudERlZmF1bHQoKTtyZXR1cm4gX3ZtLm9uUmlnaHRLZXlEb3duKCRldmVudCk7fV19fSxbX2MoImVsLXRvb2x0aXAiLHtyZWY6InRvb2x0aXAiLGF0dHJzOntwbGFjZW1lbnQ6InRvcCIsInBvcHBlci1jbGFzcyI6X3ZtLnRvb2x0aXBDbGFzcyxkaXNhYmxlZDohX3ZtLnNob3dUb29sdGlwfX0sW19jKCJzcGFuIix7YXR0cnM6e3Nsb3Q6ImNvbnRlbnQifSxzbG90OiJjb250ZW50In0sW192bS5fdihfdm0uX3MoX3ZtLmZvcm1hdFZhbHVlKSldKSxfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXNsaWRlcl9fYnV0dG9uIixjbGFzczp7aG92ZXI6X3ZtLmhvdmVyaW5nLGRyYWdnaW5nOl92bS5kcmFnZ2luZ319KV0pXSwxKTt9O3ZhciBidXR0b252dWVfdHlwZV90ZW1wbGF0ZV9pZF9lNzJkMmFkMl9zdGF0aWNSZW5kZXJGbnM9W107YnV0dG9udnVlX3R5cGVfdGVtcGxhdGVfaWRfZTcyZDJhZDJfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NsaWRlci9zcmMvYnV0dG9uLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD1lNzJkMmFkMiYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvc2xpZGVyL3NyYy9idXR0b24udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHNsaWRlcl9zcmNfYnV0dG9udnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbFNsaWRlckJ1dHRvbicsY29tcG9uZW50czp7RWxUb29sdGlwOnRvb2x0aXBfZGVmYXVsdC5hfSxwcm9wczp7dmFsdWU6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MH0sdmVydGljYWw6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OmZhbHNlfSx0b29sdGlwQ2xhc3M6U3RyaW5nfSxkYXRhOmZ1bmN0aW9uIGRhdGEoKXtyZXR1cm57aG92ZXJpbmc6ZmFsc2UsZHJhZ2dpbmc6ZmFsc2UsaXNDbGljazpmYWxzZSxzdGFydFg6MCxjdXJyZW50WDowLHN0YXJ0WTowLGN1cnJlbnRZOjAsc3RhcnRQb3NpdGlvbjowLG5ld1Bvc2l0aW9uOm51bGwsb2xkVmFsdWU6dGhpcy52YWx1ZX07fSxjb21wdXRlZDp7ZGlzYWJsZWQ6ZnVuY3Rpb24gZGlzYWJsZWQoKXtyZXR1cm4gdGhpcy4kcGFyZW50LnNsaWRlckRpc2FibGVkO30sbWF4OmZ1bmN0aW9uIG1heCgpe3JldHVybiB0aGlzLiRwYXJlbnQubWF4O30sbWluOmZ1bmN0aW9uIG1pbigpe3JldHVybiB0aGlzLiRwYXJlbnQubWluO30sc3RlcDpmdW5jdGlvbiBzdGVwKCl7cmV0dXJuIHRoaXMuJHBhcmVudC5zdGVwO30sc2hvd1Rvb2x0aXA6ZnVuY3Rpb24gc2hvd1Rvb2x0aXAoKXtyZXR1cm4gdGhpcy4kcGFyZW50LnNob3dUb29sdGlwO30scHJlY2lzaW9uOmZ1bmN0aW9uIHByZWNpc2lvbigpe3JldHVybiB0aGlzLiRwYXJlbnQucHJlY2lzaW9uO30sY3VycmVudFBvc2l0aW9uOmZ1bmN0aW9uIGN1cnJlbnRQb3NpdGlvbigpe3JldHVybih0aGlzLnZhbHVlLXRoaXMubWluKS8odGhpcy5tYXgtdGhpcy5taW4pKjEwMCsnJSc7fSxlbmFibGVGb3JtYXQ6ZnVuY3Rpb24gZW5hYmxlRm9ybWF0KCl7cmV0dXJuIHRoaXMuJHBhcmVudC5mb3JtYXRUb29sdGlwIGluc3RhbmNlb2YgRnVuY3Rpb247fSxmb3JtYXRWYWx1ZTpmdW5jdGlvbiBmb3JtYXRWYWx1ZSgpe3JldHVybiB0aGlzLmVuYWJsZUZvcm1hdCYmdGhpcy4kcGFyZW50LmZvcm1hdFRvb2x0aXAodGhpcy52YWx1ZSl8fHRoaXMudmFsdWU7fSx3cmFwcGVyU3R5bGU6ZnVuY3Rpb24gd3JhcHBlclN0eWxlKCl7cmV0dXJuIHRoaXMudmVydGljYWw/e2JvdHRvbTp0aGlzLmN1cnJlbnRQb3NpdGlvbn06e2xlZnQ6dGhpcy5jdXJyZW50UG9zaXRpb259O319LHdhdGNoOntkcmFnZ2luZzpmdW5jdGlvbiBkcmFnZ2luZyh2YWwpe3RoaXMuJHBhcmVudC5kcmFnZ2luZz12YWw7fX0sbWV0aG9kczp7ZGlzcGxheVRvb2x0aXA6ZnVuY3Rpb24gZGlzcGxheVRvb2x0aXAoKXt0aGlzLiRyZWZzLnRvb2x0aXAmJih0aGlzLiRyZWZzLnRvb2x0aXAuc2hvd1BvcHBlcj10cnVlKTt9LGhpZGVUb29sdGlwOmZ1bmN0aW9uIGhpZGVUb29sdGlwKCl7dGhpcy4kcmVmcy50b29sdGlwJiYodGhpcy4kcmVmcy50b29sdGlwLnNob3dQb3BwZXI9ZmFsc2UpO30saGFuZGxlTW91c2VFbnRlcjpmdW5jdGlvbiBoYW5kbGVNb3VzZUVudGVyKCl7dGhpcy5ob3ZlcmluZz10cnVlO3RoaXMuZGlzcGxheVRvb2x0aXAoKTt9LGhhbmRsZU1vdXNlTGVhdmU6ZnVuY3Rpb24gaGFuZGxlTW91c2VMZWF2ZSgpe3RoaXMuaG92ZXJpbmc9ZmFsc2U7dGhpcy5oaWRlVG9vbHRpcCgpO30sb25CdXR0b25Eb3duOmZ1bmN0aW9uIG9uQnV0dG9uRG93bihldmVudCl7aWYodGhpcy5kaXNhYmxlZClyZXR1cm47ZXZlbnQucHJldmVudERlZmF1bHQoKTt0aGlzLm9uRHJhZ1N0YXJ0KGV2ZW50KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyx0aGlzLm9uRHJhZ2dpbmcpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLHRoaXMub25EcmFnZ2luZyk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLHRoaXMub25EcmFnRW5kKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLHRoaXMub25EcmFnRW5kKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLHRoaXMub25EcmFnRW5kKTt9LG9uTGVmdEtleURvd246ZnVuY3Rpb24gb25MZWZ0S2V5RG93bigpe2lmKHRoaXMuZGlzYWJsZWQpcmV0dXJuO3RoaXMubmV3UG9zaXRpb249cGFyc2VGbG9hdCh0aGlzLmN1cnJlbnRQb3NpdGlvbiktdGhpcy5zdGVwLyh0aGlzLm1heC10aGlzLm1pbikqMTAwO3RoaXMuc2V0UG9zaXRpb24odGhpcy5uZXdQb3NpdGlvbik7dGhpcy4kcGFyZW50LmVtaXRDaGFuZ2UoKTt9LG9uUmlnaHRLZXlEb3duOmZ1bmN0aW9uIG9uUmlnaHRLZXlEb3duKCl7aWYodGhpcy5kaXNhYmxlZClyZXR1cm47dGhpcy5uZXdQb3NpdGlvbj1wYXJzZUZsb2F0KHRoaXMuY3VycmVudFBvc2l0aW9uKSt0aGlzLnN0ZXAvKHRoaXMubWF4LXRoaXMubWluKSoxMDA7dGhpcy5zZXRQb3NpdGlvbih0aGlzLm5ld1Bvc2l0aW9uKTt0aGlzLiRwYXJlbnQuZW1pdENoYW5nZSgpO30sb25EcmFnU3RhcnQ6ZnVuY3Rpb24gb25EcmFnU3RhcnQoZXZlbnQpe3RoaXMuZHJhZ2dpbmc9dHJ1ZTt0aGlzLmlzQ2xpY2s9dHJ1ZTtpZihldmVudC50eXBlPT09J3RvdWNoc3RhcnQnKXtldmVudC5jbGllbnRZPWV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WTtldmVudC5jbGllbnRYPWV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WDt9aWYodGhpcy52ZXJ0aWNhbCl7dGhpcy5zdGFydFk9ZXZlbnQuY2xpZW50WTt9ZWxzZXt0aGlzLnN0YXJ0WD1ldmVudC5jbGllbnRYO310aGlzLnN0YXJ0UG9zaXRpb249cGFyc2VGbG9hdCh0aGlzLmN1cnJlbnRQb3NpdGlvbik7dGhpcy5uZXdQb3NpdGlvbj10aGlzLnN0YXJ0UG9zaXRpb247fSxvbkRyYWdnaW5nOmZ1bmN0aW9uIG9uRHJhZ2dpbmcoZXZlbnQpe2lmKHRoaXMuZHJhZ2dpbmcpe3RoaXMuaXNDbGljaz1mYWxzZTt0aGlzLmRpc3BsYXlUb29sdGlwKCk7dGhpcy4kcGFyZW50LnJlc2V0U2l6ZSgpO3ZhciBkaWZmPTA7aWYoZXZlbnQudHlwZT09PSd0b3VjaG1vdmUnKXtldmVudC5jbGllbnRZPWV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WTtldmVudC5jbGllbnRYPWV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WDt9aWYodGhpcy52ZXJ0aWNhbCl7dGhpcy5jdXJyZW50WT1ldmVudC5jbGllbnRZO2RpZmY9KHRoaXMuc3RhcnRZLXRoaXMuY3VycmVudFkpL3RoaXMuJHBhcmVudC5zbGlkZXJTaXplKjEwMDt9ZWxzZXt0aGlzLmN1cnJlbnRYPWV2ZW50LmNsaWVudFg7ZGlmZj0odGhpcy5jdXJyZW50WC10aGlzLnN0YXJ0WCkvdGhpcy4kcGFyZW50LnNsaWRlclNpemUqMTAwO310aGlzLm5ld1Bvc2l0aW9uPXRoaXMuc3RhcnRQb3NpdGlvbitkaWZmO3RoaXMuc2V0UG9zaXRpb24odGhpcy5uZXdQb3NpdGlvbik7fX0sb25EcmFnRW5kOmZ1bmN0aW9uIG9uRHJhZ0VuZCgpe3ZhciBfdGhpcz10aGlzO2lmKHRoaXMuZHJhZ2dpbmcpey8qCiAgICAgICAgICog6Ziy5q2i5ZyoIG1vdXNldXAg5ZCO56uL5Y2z6Kem5Y+RIGNsaWNr77yM5a+86Ie05ruR5Z2X5pyJ5Yeg546H5Lqn55Sf5LiA5bCP5q615L2N56e7CiAgICAgICAgICog5LiN5L2/55SoIHByZXZlbnREZWZhdWx0IOaYr+WboOS4uiBtb3VzZXVwIOWSjCBjbGljayDmsqHmnInms6jlhozlnKjlkIzkuIDkuKogRE9NIOS4igogICAgICAgICAqL3NldFRpbWVvdXQoZnVuY3Rpb24oKXtfdGhpcy5kcmFnZ2luZz1mYWxzZTtfdGhpcy5oaWRlVG9vbHRpcCgpO2lmKCFfdGhpcy5pc0NsaWNrKXtfdGhpcy5zZXRQb3NpdGlvbihfdGhpcy5uZXdQb3NpdGlvbik7X3RoaXMuJHBhcmVudC5lbWl0Q2hhbmdlKCk7fX0sMCk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsdGhpcy5vbkRyYWdnaW5nKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJyx0aGlzLm9uRHJhZ2dpbmcpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJyx0aGlzLm9uRHJhZ0VuZCk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJyx0aGlzLm9uRHJhZ0VuZCk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jyx0aGlzLm9uRHJhZ0VuZCk7fX0sc2V0UG9zaXRpb246ZnVuY3Rpb24gc2V0UG9zaXRpb24obmV3UG9zaXRpb24pe3ZhciBfdGhpczI9dGhpcztpZihuZXdQb3NpdGlvbj09PW51bGx8fGlzTmFOKG5ld1Bvc2l0aW9uKSlyZXR1cm47aWYobmV3UG9zaXRpb248MCl7bmV3UG9zaXRpb249MDt9ZWxzZSBpZihuZXdQb3NpdGlvbj4xMDApe25ld1Bvc2l0aW9uPTEwMDt9dmFyIGxlbmd0aFBlclN0ZXA9MTAwLygodGhpcy5tYXgtdGhpcy5taW4pL3RoaXMuc3RlcCk7dmFyIHN0ZXBzPU1hdGgucm91bmQobmV3UG9zaXRpb24vbGVuZ3RoUGVyU3RlcCk7dmFyIHZhbHVlPXN0ZXBzKmxlbmd0aFBlclN0ZXAqKHRoaXMubWF4LXRoaXMubWluKSowLjAxK3RoaXMubWluO3ZhbHVlPXBhcnNlRmxvYXQodmFsdWUudG9GaXhlZCh0aGlzLnByZWNpc2lvbikpO3RoaXMuJGVtaXQoJ2lucHV0Jyx2YWx1ZSk7dGhpcy4kbmV4dFRpY2soZnVuY3Rpb24oKXtfdGhpczIuZGlzcGxheVRvb2x0aXAoKTtfdGhpczIuJHJlZnMudG9vbHRpcCYmX3RoaXMyLiRyZWZzLnRvb2x0aXAudXBkYXRlUG9wcGVyKCk7fSk7aWYoIXRoaXMuZHJhZ2dpbmcmJnRoaXMudmFsdWUhPT10aGlzLm9sZFZhbHVlKXt0aGlzLm9sZFZhbHVlPXRoaXMudmFsdWU7fX19fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NsaWRlci9zcmMvYnV0dG9uLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYWNrYWdlc19zbGlkZXJfc3JjX2J1dHRvbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz1zbGlkZXJfc3JjX2J1dHRvbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NsaWRlci9zcmMvYnV0dG9uLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIHNyY19idXR0b25fY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChwYWNrYWdlc19zbGlkZXJfc3JjX2J1dHRvbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxidXR0b252dWVfdHlwZV90ZW1wbGF0ZV9pZF9lNzJkMmFkMl9yZW5kZXIsYnV0dG9udnVlX3R5cGVfdGVtcGxhdGVfaWRfZTcyZDJhZDJfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciBzcmNfYnV0dG9uX2FwaTt9c3JjX2J1dHRvbl9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL3NsaWRlci9zcmMvYnV0dG9uLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzbGlkZXJfc3JjX2J1dHRvbj1zcmNfYnV0dG9uX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2xpZGVyL3NyYy9tYXJrZXIuanMKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBtYXJrZXI9e25hbWU6J0VsTWFya2VyJyxwcm9wczp7bWFyazp7dHlwZTpbU3RyaW5nLE9iamVjdF19fSxyZW5kZXI6ZnVuY3Rpb24gcmVuZGVyKCl7dmFyIGg9YXJndW1lbnRzWzBdO3ZhciBsYWJlbD10eXBlb2YgdGhpcy5tYXJrPT09J3N0cmluZyc/dGhpcy5tYXJrOnRoaXMubWFyay5sYWJlbDtyZXR1cm4gaCgnZGl2Jyx7J2NsYXNzJzonZWwtc2xpZGVyX19tYXJrcy10ZXh0JyxzdHlsZTp0aGlzLm1hcmsuc3R5bGV8fHt9fSxbbGFiZWxdKTt9fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9zbGlkZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHNsaWRlcl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17bmFtZTonRWxTbGlkZXInLG1peGluczpbZW1pdHRlcl9kZWZhdWx0LmFdLGluamVjdDp7ZWxGb3JtOntkZWZhdWx0OicnfX0scHJvcHM6e21pbjp7dHlwZTpOdW1iZXIsZGVmYXVsdDowfSxtYXg6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MTAwfSxzdGVwOnt0eXBlOk51bWJlcixkZWZhdWx0OjF9LHZhbHVlOnt0eXBlOltOdW1iZXIsQXJyYXldLGRlZmF1bHQ6MH0sc2hvd0lucHV0Ont0eXBlOkJvb2xlYW4sZGVmYXVsdDpmYWxzZX0sc2hvd0lucHV0Q29udHJvbHM6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OnRydWV9LGlucHV0U2l6ZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDonc21hbGwnfSxzaG93U3RvcHM6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OmZhbHNlfSxzaG93VG9vbHRpcDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6dHJ1ZX0sZm9ybWF0VG9vbHRpcDpGdW5jdGlvbixkaXNhYmxlZDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ZmFsc2V9LHJhbmdlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDpmYWxzZX0sdmVydGljYWw6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OmZhbHNlfSxoZWlnaHQ6e3R5cGU6U3RyaW5nfSxkZWJvdW5jZTp7dHlwZTpOdW1iZXIsZGVmYXVsdDozMDB9LGxhYmVsOnt0eXBlOlN0cmluZ30sdG9vbHRpcENsYXNzOlN0cmluZyxtYXJrczpPYmplY3R9LGNvbXBvbmVudHM6e0VsSW5wdXROdW1iZXI6aW5wdXRfbnVtYmVyX2RlZmF1bHQuYSxTbGlkZXJCdXR0b246c2xpZGVyX3NyY19idXR0b24sU2xpZGVyTWFya2VyOm1hcmtlcn0sZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue2ZpcnN0VmFsdWU6bnVsbCxzZWNvbmRWYWx1ZTpudWxsLG9sZFZhbHVlOm51bGwsZHJhZ2dpbmc6ZmFsc2Usc2xpZGVyU2l6ZToxfTt9LHdhdGNoOnt2YWx1ZTpmdW5jdGlvbiB2YWx1ZSh2YWwsb2xkVmFsKXtpZih0aGlzLmRyYWdnaW5nfHxBcnJheS5pc0FycmF5KHZhbCkmJkFycmF5LmlzQXJyYXkob2xkVmFsKSYmdmFsLmV2ZXJ5KGZ1bmN0aW9uKGl0ZW0saW5kZXgpe3JldHVybiBpdGVtPT09b2xkVmFsW2luZGV4XTt9KSl7cmV0dXJuO310aGlzLnNldFZhbHVlcygpO30sZHJhZ2dpbmc6ZnVuY3Rpb24gZHJhZ2dpbmcodmFsKXtpZighdmFsKXt0aGlzLnNldFZhbHVlcygpO319LGZpcnN0VmFsdWU6ZnVuY3Rpb24gZmlyc3RWYWx1ZSh2YWwpe2lmKHRoaXMucmFuZ2Upe3RoaXMuJGVtaXQoJ2lucHV0JyxbdGhpcy5taW5WYWx1ZSx0aGlzLm1heFZhbHVlXSk7fWVsc2V7dGhpcy4kZW1pdCgnaW5wdXQnLHZhbCk7fX0sc2Vjb25kVmFsdWU6ZnVuY3Rpb24gc2Vjb25kVmFsdWUoKXtpZih0aGlzLnJhbmdlKXt0aGlzLiRlbWl0KCdpbnB1dCcsW3RoaXMubWluVmFsdWUsdGhpcy5tYXhWYWx1ZV0pO319LG1pbjpmdW5jdGlvbiBtaW4oKXt0aGlzLnNldFZhbHVlcygpO30sbWF4OmZ1bmN0aW9uIG1heCgpe3RoaXMuc2V0VmFsdWVzKCk7fX0sbWV0aG9kczp7dmFsdWVDaGFuZ2VkOmZ1bmN0aW9uIHZhbHVlQ2hhbmdlZCgpe3ZhciBfdGhpcz10aGlzO2lmKHRoaXMucmFuZ2Upe3JldHVybiFbdGhpcy5taW5WYWx1ZSx0aGlzLm1heFZhbHVlXS5ldmVyeShmdW5jdGlvbihpdGVtLGluZGV4KXtyZXR1cm4gaXRlbT09PV90aGlzLm9sZFZhbHVlW2luZGV4XTt9KTt9ZWxzZXtyZXR1cm4gdGhpcy52YWx1ZSE9PXRoaXMub2xkVmFsdWU7fX0sc2V0VmFsdWVzOmZ1bmN0aW9uIHNldFZhbHVlcygpe2lmKHRoaXMubWluPnRoaXMubWF4KXtjb25zb2xlLmVycm9yKCdbRWxlbWVudCBFcnJvcl1bU2xpZGVyXW1pbiBzaG91bGQgbm90IGJlIGdyZWF0ZXIgdGhhbiBtYXguJyk7cmV0dXJuO312YXIgdmFsPXRoaXMudmFsdWU7aWYodGhpcy5yYW5nZSYmQXJyYXkuaXNBcnJheSh2YWwpKXtpZih2YWxbMV08dGhpcy5taW4pe3RoaXMuJGVtaXQoJ2lucHV0JyxbdGhpcy5taW4sdGhpcy5taW5dKTt9ZWxzZSBpZih2YWxbMF0+dGhpcy5tYXgpe3RoaXMuJGVtaXQoJ2lucHV0JyxbdGhpcy5tYXgsdGhpcy5tYXhdKTt9ZWxzZSBpZih2YWxbMF08dGhpcy5taW4pe3RoaXMuJGVtaXQoJ2lucHV0JyxbdGhpcy5taW4sdmFsWzFdXSk7fWVsc2UgaWYodmFsWzFdPnRoaXMubWF4KXt0aGlzLiRlbWl0KCdpbnB1dCcsW3ZhbFswXSx0aGlzLm1heF0pO31lbHNle3RoaXMuZmlyc3RWYWx1ZT12YWxbMF07dGhpcy5zZWNvbmRWYWx1ZT12YWxbMV07aWYodGhpcy52YWx1ZUNoYW5nZWQoKSl7dGhpcy5kaXNwYXRjaCgnRWxGb3JtSXRlbScsJ2VsLmZvcm0uY2hhbmdlJyxbdGhpcy5taW5WYWx1ZSx0aGlzLm1heFZhbHVlXSk7dGhpcy5vbGRWYWx1ZT12YWwuc2xpY2UoKTt9fX1lbHNlIGlmKCF0aGlzLnJhbmdlJiZ0eXBlb2YgdmFsPT09J251bWJlcicmJiFpc05hTih2YWwpKXtpZih2YWw8dGhpcy5taW4pe3RoaXMuJGVtaXQoJ2lucHV0Jyx0aGlzLm1pbik7fWVsc2UgaWYodmFsPnRoaXMubWF4KXt0aGlzLiRlbWl0KCdpbnB1dCcsdGhpcy5tYXgpO31lbHNle3RoaXMuZmlyc3RWYWx1ZT12YWw7aWYodGhpcy52YWx1ZUNoYW5nZWQoKSl7dGhpcy5kaXNwYXRjaCgnRWxGb3JtSXRlbScsJ2VsLmZvcm0uY2hhbmdlJyx2YWwpO3RoaXMub2xkVmFsdWU9dmFsO319fX0sc2V0UG9zaXRpb246ZnVuY3Rpb24gc2V0UG9zaXRpb24ocGVyY2VudCl7dmFyIHRhcmdldFZhbHVlPXRoaXMubWluK3BlcmNlbnQqKHRoaXMubWF4LXRoaXMubWluKS8xMDA7aWYoIXRoaXMucmFuZ2Upe3RoaXMuJHJlZnMuYnV0dG9uMS5zZXRQb3NpdGlvbihwZXJjZW50KTtyZXR1cm47fXZhciBidXR0b249dm9pZCAwO2lmKE1hdGguYWJzKHRoaXMubWluVmFsdWUtdGFyZ2V0VmFsdWUpPE1hdGguYWJzKHRoaXMubWF4VmFsdWUtdGFyZ2V0VmFsdWUpKXtidXR0b249dGhpcy5maXJzdFZhbHVlPHRoaXMuc2Vjb25kVmFsdWU/J2J1dHRvbjEnOididXR0b24yJzt9ZWxzZXtidXR0b249dGhpcy5maXJzdFZhbHVlPnRoaXMuc2Vjb25kVmFsdWU/J2J1dHRvbjEnOididXR0b24yJzt9dGhpcy4kcmVmc1tidXR0b25dLnNldFBvc2l0aW9uKHBlcmNlbnQpO30sb25TbGlkZXJDbGljazpmdW5jdGlvbiBvblNsaWRlckNsaWNrKGV2ZW50KXtpZih0aGlzLnNsaWRlckRpc2FibGVkfHx0aGlzLmRyYWdnaW5nKXJldHVybjt0aGlzLnJlc2V0U2l6ZSgpO2lmKHRoaXMudmVydGljYWwpe3ZhciBzbGlkZXJPZmZzZXRCb3R0b209dGhpcy4kcmVmcy5zbGlkZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tO3RoaXMuc2V0UG9zaXRpb24oKHNsaWRlck9mZnNldEJvdHRvbS1ldmVudC5jbGllbnRZKS90aGlzLnNsaWRlclNpemUqMTAwKTt9ZWxzZXt2YXIgc2xpZGVyT2Zmc2V0TGVmdD10aGlzLiRyZWZzLnNsaWRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O3RoaXMuc2V0UG9zaXRpb24oKGV2ZW50LmNsaWVudFgtc2xpZGVyT2Zmc2V0TGVmdCkvdGhpcy5zbGlkZXJTaXplKjEwMCk7fXRoaXMuZW1pdENoYW5nZSgpO30scmVzZXRTaXplOmZ1bmN0aW9uIHJlc2V0U2l6ZSgpe2lmKHRoaXMuJHJlZnMuc2xpZGVyKXt0aGlzLnNsaWRlclNpemU9dGhpcy4kcmVmcy5zbGlkZXJbJ2NsaWVudCcrKHRoaXMudmVydGljYWw/J0hlaWdodCc6J1dpZHRoJyldO319LGVtaXRDaGFuZ2U6ZnVuY3Rpb24gZW1pdENoYW5nZSgpe3ZhciBfdGhpczI9dGhpczt0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe190aGlzMi4kZW1pdCgnY2hhbmdlJyxfdGhpczIucmFuZ2U/W190aGlzMi5taW5WYWx1ZSxfdGhpczIubWF4VmFsdWVdOl90aGlzMi52YWx1ZSk7fSk7fSxnZXRTdG9wU3R5bGU6ZnVuY3Rpb24gZ2V0U3RvcFN0eWxlKHBvc2l0aW9uKXtyZXR1cm4gdGhpcy52ZXJ0aWNhbD97J2JvdHRvbSc6cG9zaXRpb24rJyUnfTp7J2xlZnQnOnBvc2l0aW9uKyclJ307fX0sY29tcHV0ZWQ6e3N0b3BzOmZ1bmN0aW9uIHN0b3BzKCl7dmFyIF90aGlzMz10aGlzO2lmKCF0aGlzLnNob3dTdG9wc3x8dGhpcy5taW4+dGhpcy5tYXgpcmV0dXJuW107aWYodGhpcy5zdGVwPT09MCl7ZmFsc2UmJmZhbHNlO3JldHVybltdO312YXIgc3RvcENvdW50PSh0aGlzLm1heC10aGlzLm1pbikvdGhpcy5zdGVwO3ZhciBzdGVwV2lkdGg9MTAwKnRoaXMuc3RlcC8odGhpcy5tYXgtdGhpcy5taW4pO3ZhciByZXN1bHQ9W107Zm9yKHZhciBpPTE7aTxzdG9wQ291bnQ7aSsrKXtyZXN1bHQucHVzaChpKnN0ZXBXaWR0aCk7fWlmKHRoaXMucmFuZ2Upe3JldHVybiByZXN1bHQuZmlsdGVyKGZ1bmN0aW9uKHN0ZXApe3JldHVybiBzdGVwPDEwMCooX3RoaXMzLm1pblZhbHVlLV90aGlzMy5taW4pLyhfdGhpczMubWF4LV90aGlzMy5taW4pfHxzdGVwPjEwMCooX3RoaXMzLm1heFZhbHVlLV90aGlzMy5taW4pLyhfdGhpczMubWF4LV90aGlzMy5taW4pO30pO31lbHNle3JldHVybiByZXN1bHQuZmlsdGVyKGZ1bmN0aW9uKHN0ZXApe3JldHVybiBzdGVwPjEwMCooX3RoaXMzLmZpcnN0VmFsdWUtX3RoaXMzLm1pbikvKF90aGlzMy5tYXgtX3RoaXMzLm1pbik7fSk7fX0sbWFya0xpc3Q6ZnVuY3Rpb24gbWFya0xpc3QoKXt2YXIgX3RoaXM0PXRoaXM7aWYoIXRoaXMubWFya3Mpe3JldHVybltdO312YXIgbWFya3NLZXlzPU9iamVjdC5rZXlzKHRoaXMubWFya3MpO3JldHVybiBtYXJrc0tleXMubWFwKHBhcnNlRmxvYXQpLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS1iO30pLmZpbHRlcihmdW5jdGlvbihwb2ludCl7cmV0dXJuIHBvaW50PD1fdGhpczQubWF4JiZwb2ludD49X3RoaXM0Lm1pbjt9KS5tYXAoZnVuY3Rpb24ocG9pbnQpe3JldHVybntwb2ludDpwb2ludCxwb3NpdGlvbjoocG9pbnQtX3RoaXM0Lm1pbikqMTAwLyhfdGhpczQubWF4LV90aGlzNC5taW4pLG1hcms6X3RoaXM0Lm1hcmtzW3BvaW50XX07fSk7fSxtaW5WYWx1ZTpmdW5jdGlvbiBtaW5WYWx1ZSgpe3JldHVybiBNYXRoLm1pbih0aGlzLmZpcnN0VmFsdWUsdGhpcy5zZWNvbmRWYWx1ZSk7fSxtYXhWYWx1ZTpmdW5jdGlvbiBtYXhWYWx1ZSgpe3JldHVybiBNYXRoLm1heCh0aGlzLmZpcnN0VmFsdWUsdGhpcy5zZWNvbmRWYWx1ZSk7fSxiYXJTaXplOmZ1bmN0aW9uIGJhclNpemUoKXtyZXR1cm4gdGhpcy5yYW5nZT8xMDAqKHRoaXMubWF4VmFsdWUtdGhpcy5taW5WYWx1ZSkvKHRoaXMubWF4LXRoaXMubWluKSsnJSc6MTAwKih0aGlzLmZpcnN0VmFsdWUtdGhpcy5taW4pLyh0aGlzLm1heC10aGlzLm1pbikrJyUnO30sYmFyU3RhcnQ6ZnVuY3Rpb24gYmFyU3RhcnQoKXtyZXR1cm4gdGhpcy5yYW5nZT8xMDAqKHRoaXMubWluVmFsdWUtdGhpcy5taW4pLyh0aGlzLm1heC10aGlzLm1pbikrJyUnOicwJSc7fSxwcmVjaXNpb246ZnVuY3Rpb24gcHJlY2lzaW9uKCl7dmFyIHByZWNpc2lvbnM9W3RoaXMubWluLHRoaXMubWF4LHRoaXMuc3RlcF0ubWFwKGZ1bmN0aW9uKGl0ZW0pe3ZhciBkZWNpbWFsPSgnJytpdGVtKS5zcGxpdCgnLicpWzFdO3JldHVybiBkZWNpbWFsP2RlY2ltYWwubGVuZ3RoOjA7fSk7cmV0dXJuIE1hdGgubWF4LmFwcGx5KG51bGwscHJlY2lzaW9ucyk7fSxydW53YXlTdHlsZTpmdW5jdGlvbiBydW53YXlTdHlsZSgpe3JldHVybiB0aGlzLnZlcnRpY2FsP3toZWlnaHQ6dGhpcy5oZWlnaHR9Ont9O30sYmFyU3R5bGU6ZnVuY3Rpb24gYmFyU3R5bGUoKXtyZXR1cm4gdGhpcy52ZXJ0aWNhbD97aGVpZ2h0OnRoaXMuYmFyU2l6ZSxib3R0b206dGhpcy5iYXJTdGFydH06e3dpZHRoOnRoaXMuYmFyU2l6ZSxsZWZ0OnRoaXMuYmFyU3RhcnR9O30sc2xpZGVyRGlzYWJsZWQ6ZnVuY3Rpb24gc2xpZGVyRGlzYWJsZWQoKXtyZXR1cm4gdGhpcy5kaXNhYmxlZHx8KHRoaXMuZWxGb3JtfHx7fSkuZGlzYWJsZWQ7fX0sbW91bnRlZDpmdW5jdGlvbiBtb3VudGVkKCl7dmFyIHZhbHVldGV4dD12b2lkIDA7aWYodGhpcy5yYW5nZSl7aWYoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSl7dGhpcy5maXJzdFZhbHVlPU1hdGgubWF4KHRoaXMubWluLHRoaXMudmFsdWVbMF0pO3RoaXMuc2Vjb25kVmFsdWU9TWF0aC5taW4odGhpcy5tYXgsdGhpcy52YWx1ZVsxXSk7fWVsc2V7dGhpcy5maXJzdFZhbHVlPXRoaXMubWluO3RoaXMuc2Vjb25kVmFsdWU9dGhpcy5tYXg7fXRoaXMub2xkVmFsdWU9W3RoaXMuZmlyc3RWYWx1ZSx0aGlzLnNlY29uZFZhbHVlXTt2YWx1ZXRleHQ9dGhpcy5maXJzdFZhbHVlKyctJyt0aGlzLnNlY29uZFZhbHVlO31lbHNle2lmKHR5cGVvZiB0aGlzLnZhbHVlIT09J251bWJlcid8fGlzTmFOKHRoaXMudmFsdWUpKXt0aGlzLmZpcnN0VmFsdWU9dGhpcy5taW47fWVsc2V7dGhpcy5maXJzdFZhbHVlPU1hdGgubWluKHRoaXMubWF4LE1hdGgubWF4KHRoaXMubWluLHRoaXMudmFsdWUpKTt9dGhpcy5vbGRWYWx1ZT10aGlzLmZpcnN0VmFsdWU7dmFsdWV0ZXh0PXRoaXMuZmlyc3RWYWx1ZTt9dGhpcy4kZWwuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVldGV4dCcsdmFsdWV0ZXh0KTsvLyBsYWJlbCBzY3JlZW4gcmVhZGVyCnRoaXMuJGVsLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsdGhpcy5sYWJlbD90aGlzLmxhYmVsOidzbGlkZXIgYmV0d2VlbiAnK3RoaXMubWluKycgYW5kICcrdGhpcy5tYXgpO3RoaXMucmVzZXRTaXplKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsdGhpcy5yZXNldFNpemUpO30sYmVmb3JlRGVzdHJveTpmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsdGhpcy5yZXNldFNpemUpO319Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2xpZGVyL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYWNrYWdlc19zbGlkZXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189c2xpZGVyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2xpZGVyL3NyYy9tYWluLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIHNsaWRlcl9zcmNfbWFpbl9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHBhY2thZ2VzX3NsaWRlcl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfMzI3MDg2NDRfcmVuZGVyLG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF8zMjcwODY0NF9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIHNsaWRlcl9zcmNfbWFpbl9hcGk7fXNsaWRlcl9zcmNfbWFpbl9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL3NsaWRlci9zcmMvbWFpbi52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc2xpZGVyX3NyY19tYWluPXNsaWRlcl9zcmNfbWFpbl9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NsaWRlci9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL3NsaWRlcl9zcmNfbWFpbi5pbnN0YWxsPWZ1bmN0aW9uKFZ1ZSl7VnVlLmNvbXBvbmVudChzbGlkZXJfc3JjX21haW4ubmFtZSxzbGlkZXJfc3JjX21haW4pO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzbGlkZXI9c2xpZGVyX3NyY19tYWluOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvbG9hZGluZy9zcmMvbG9hZGluZy52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9ZWVlMGE3YWMmCnZhciBsb2FkaW5ndnVlX3R5cGVfdGVtcGxhdGVfaWRfZWVlMGE3YWNfcmVuZGVyPWZ1bmN0aW9uIGxvYWRpbmd2dWVfdHlwZV90ZW1wbGF0ZV9pZF9lZWUwYTdhY19yZW5kZXIoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDt2YXIgX2M9X3ZtLl9zZWxmLl9jfHxfaDtyZXR1cm4gX2MoInRyYW5zaXRpb24iLHthdHRyczp7bmFtZToiZWwtbG9hZGluZy1mYWRlIn0sb246eyJhZnRlci1sZWF2ZSI6X3ZtLmhhbmRsZUFmdGVyTGVhdmV9fSxbX2MoImRpdiIse2RpcmVjdGl2ZXM6W3tuYW1lOiJzaG93IixyYXdOYW1lOiJ2LXNob3ciLHZhbHVlOl92bS52aXNpYmxlLGV4cHJlc3Npb246InZpc2libGUifV0sc3RhdGljQ2xhc3M6ImVsLWxvYWRpbmctbWFzayIsY2xhc3M6W192bS5jdXN0b21DbGFzcyx7ImlzLWZ1bGxzY3JlZW4iOl92bS5mdWxsc2NyZWVufV0sc3R5bGU6e2JhY2tncm91bmRDb2xvcjpfdm0uYmFja2dyb3VuZHx8IiJ9fSxbX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1sb2FkaW5nLXNwaW5uZXIifSxbIV92bS5zcGlubmVyP19jKCJzdmciLHtzdGF0aWNDbGFzczoiY2lyY3VsYXIiLGF0dHJzOnt2aWV3Qm94OiIyNSAyNSA1MCA1MCJ9fSxbX2MoImNpcmNsZSIse3N0YXRpY0NsYXNzOiJwYXRoIixhdHRyczp7Y3g6IjUwIixjeToiNTAiLHI6IjIwIixmaWxsOiJub25lIn19KV0pOl9jKCJpIix7Y2xhc3M6X3ZtLnNwaW5uZXJ9KSxfdm0udGV4dD9fYygicCIse3N0YXRpY0NsYXNzOiJlbC1sb2FkaW5nLXRleHQifSxbX3ZtLl92KF92bS5fcyhfdm0udGV4dCkpXSk6X3ZtLl9lKCldKV0pXSk7fTt2YXIgbG9hZGluZ3Z1ZV90eXBlX3RlbXBsYXRlX2lkX2VlZTBhN2FjX3N0YXRpY1JlbmRlckZucz1bXTtsb2FkaW5ndnVlX3R5cGVfdGVtcGxhdGVfaWRfZWVlMGE3YWNfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2xvYWRpbmcvc3JjL2xvYWRpbmcudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWVlZTBhN2FjJgovLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9sb2FkaW5nL3NyYy9sb2FkaW5nLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBsb2FkaW5ndnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtkYXRhOmZ1bmN0aW9uIGRhdGEoKXtyZXR1cm57dGV4dDpudWxsLHNwaW5uZXI6bnVsbCxiYWNrZ3JvdW5kOm51bGwsZnVsbHNjcmVlbjp0cnVlLHZpc2libGU6ZmFsc2UsY3VzdG9tQ2xhc3M6Jyd9O30sbWV0aG9kczp7aGFuZGxlQWZ0ZXJMZWF2ZTpmdW5jdGlvbiBoYW5kbGVBZnRlckxlYXZlKCl7dGhpcy4kZW1pdCgnYWZ0ZXItbGVhdmUnKTt9LHNldFRleHQ6ZnVuY3Rpb24gc2V0VGV4dCh0ZXh0KXt0aGlzLnRleHQ9dGV4dDt9fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9sb2FkaW5nL3NyYy9sb2FkaW5nLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfbG9hZGluZ3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz1sb2FkaW5ndnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvbG9hZGluZy9zcmMvbG9hZGluZy52dWUKLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciBsb2FkaW5nX2NvbXBvbmVudD1ub3JtYWxpemVDb21wb25lbnQoc3JjX2xvYWRpbmd2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sbG9hZGluZ3Z1ZV90eXBlX3RlbXBsYXRlX2lkX2VlZTBhN2FjX3JlbmRlcixsb2FkaW5ndnVlX3R5cGVfdGVtcGxhdGVfaWRfZWVlMGE3YWNfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciBsb2FkaW5nX2FwaTt9bG9hZGluZ19jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL2xvYWRpbmcvc3JjL2xvYWRpbmcudnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGxvYWRpbmc9bG9hZGluZ19jb21wb25lbnQuZXhwb3J0czsvLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsICJlbGVtZW50LXVpL2xpYi91dGlscy9hZnRlci1sZWF2ZSIKdmFyIGFmdGVyX2xlYXZlXz1fX3dlYnBhY2tfcmVxdWlyZV9fKDMzKTt2YXIgYWZ0ZXJfbGVhdmVfZGVmYXVsdD0vKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGFmdGVyX2xlYXZlXyk7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9sb2FkaW5nL3NyYy9kaXJlY3RpdmUuanMKdmFyIE1hc2s9ZXh0ZXJuYWxfdnVlX2RlZmF1bHQuYS5leHRlbmQobG9hZGluZyk7dmFyIGxvYWRpbmdEaXJlY3RpdmU9e307bG9hZGluZ0RpcmVjdGl2ZS5pbnN0YWxsPWZ1bmN0aW9uKFZ1ZSl7aWYoVnVlLnByb3RvdHlwZS4kaXNTZXJ2ZXIpcmV0dXJuO3ZhciB0b2dnbGVMb2FkaW5nPWZ1bmN0aW9uIHRvZ2dsZUxvYWRpbmcoZWwsYmluZGluZyl7aWYoYmluZGluZy52YWx1ZSl7VnVlLm5leHRUaWNrKGZ1bmN0aW9uKCl7aWYoYmluZGluZy5tb2RpZmllcnMuZnVsbHNjcmVlbil7ZWwub3JpZ2luYWxQb3NpdGlvbj1PYmplY3QoZG9tX1siZ2V0U3R5bGUiXSkoZG9jdW1lbnQuYm9keSwncG9zaXRpb24nKTtlbC5vcmlnaW5hbE92ZXJmbG93PU9iamVjdChkb21fWyJnZXRTdHlsZSJdKShkb2N1bWVudC5ib2R5LCdvdmVyZmxvdycpO2VsLm1hc2tTdHlsZS56SW5kZXg9cG9wdXBfWyJQb3B1cE1hbmFnZXIiXS5uZXh0WkluZGV4KCk7T2JqZWN0KGRvbV9bImFkZENsYXNzIl0pKGVsLm1hc2ssJ2lzLWZ1bGxzY3JlZW4nKTtpbnNlcnREb20oZG9jdW1lbnQuYm9keSxlbCxiaW5kaW5nKTt9ZWxzZXtPYmplY3QoZG9tX1sicmVtb3ZlQ2xhc3MiXSkoZWwubWFzaywnaXMtZnVsbHNjcmVlbicpO2lmKGJpbmRpbmcubW9kaWZpZXJzLmJvZHkpe2VsLm9yaWdpbmFsUG9zaXRpb249T2JqZWN0KGRvbV9bImdldFN0eWxlIl0pKGRvY3VtZW50LmJvZHksJ3Bvc2l0aW9uJyk7Wyd0b3AnLCdsZWZ0J10uZm9yRWFjaChmdW5jdGlvbihwcm9wZXJ0eSl7dmFyIHNjcm9sbD1wcm9wZXJ0eT09PSd0b3AnPydzY3JvbGxUb3AnOidzY3JvbGxMZWZ0JztlbC5tYXNrU3R5bGVbcHJvcGVydHldPWVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW3Byb3BlcnR5XStkb2N1bWVudC5ib2R5W3Njcm9sbF0rZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W3Njcm9sbF0tcGFyc2VJbnQoT2JqZWN0KGRvbV9bImdldFN0eWxlIl0pKGRvY3VtZW50LmJvZHksJ21hcmdpbi0nK3Byb3BlcnR5KSwxMCkrJ3B4Jzt9KTtbJ2hlaWdodCcsJ3dpZHRoJ10uZm9yRWFjaChmdW5jdGlvbihwcm9wZXJ0eSl7ZWwubWFza1N0eWxlW3Byb3BlcnR5XT1lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtwcm9wZXJ0eV0rJ3B4Jzt9KTtpbnNlcnREb20oZG9jdW1lbnQuYm9keSxlbCxiaW5kaW5nKTt9ZWxzZXtlbC5vcmlnaW5hbFBvc2l0aW9uPU9iamVjdChkb21fWyJnZXRTdHlsZSJdKShlbCwncG9zaXRpb24nKTtpbnNlcnREb20oZWwsZWwsYmluZGluZyk7fX19KTt9ZWxzZXthZnRlcl9sZWF2ZV9kZWZhdWx0KCkoZWwuaW5zdGFuY2UsZnVuY3Rpb24oXyl7aWYoIWVsLmluc3RhbmNlLmhpZGluZylyZXR1cm47ZWwuZG9tVmlzaWJsZT1mYWxzZTt2YXIgdGFyZ2V0PWJpbmRpbmcubW9kaWZpZXJzLmZ1bGxzY3JlZW58fGJpbmRpbmcubW9kaWZpZXJzLmJvZHk/ZG9jdW1lbnQuYm9keTplbDtPYmplY3QoZG9tX1sicmVtb3ZlQ2xhc3MiXSkodGFyZ2V0LCdlbC1sb2FkaW5nLXBhcmVudC0tcmVsYXRpdmUnKTtPYmplY3QoZG9tX1sicmVtb3ZlQ2xhc3MiXSkodGFyZ2V0LCdlbC1sb2FkaW5nLXBhcmVudC0taGlkZGVuJyk7ZWwuaW5zdGFuY2UuaGlkaW5nPWZhbHNlO30sMzAwLHRydWUpO2VsLmluc3RhbmNlLnZpc2libGU9ZmFsc2U7ZWwuaW5zdGFuY2UuaGlkaW5nPXRydWU7fX07dmFyIGluc2VydERvbT1mdW5jdGlvbiBpbnNlcnREb20ocGFyZW50LGVsLGJpbmRpbmcpe2lmKCFlbC5kb21WaXNpYmxlJiZPYmplY3QoZG9tX1siZ2V0U3R5bGUiXSkoZWwsJ2Rpc3BsYXknKSE9PSdub25lJyYmT2JqZWN0KGRvbV9bImdldFN0eWxlIl0pKGVsLCd2aXNpYmlsaXR5JykhPT0naGlkZGVuJyl7T2JqZWN0LmtleXMoZWwubWFza1N0eWxlKS5mb3JFYWNoKGZ1bmN0aW9uKHByb3BlcnR5KXtlbC5tYXNrLnN0eWxlW3Byb3BlcnR5XT1lbC5tYXNrU3R5bGVbcHJvcGVydHldO30pO2lmKGVsLm9yaWdpbmFsUG9zaXRpb24hPT0nYWJzb2x1dGUnJiZlbC5vcmlnaW5hbFBvc2l0aW9uIT09J2ZpeGVkJyl7T2JqZWN0KGRvbV9bImFkZENsYXNzIl0pKHBhcmVudCwnZWwtbG9hZGluZy1wYXJlbnQtLXJlbGF0aXZlJyk7fWlmKGJpbmRpbmcubW9kaWZpZXJzLmZ1bGxzY3JlZW4mJmJpbmRpbmcubW9kaWZpZXJzLmxvY2spe09iamVjdChkb21fWyJhZGRDbGFzcyJdKShwYXJlbnQsJ2VsLWxvYWRpbmctcGFyZW50LS1oaWRkZW4nKTt9ZWwuZG9tVmlzaWJsZT10cnVlO3BhcmVudC5hcHBlbmRDaGlsZChlbC5tYXNrKTtWdWUubmV4dFRpY2soZnVuY3Rpb24oKXtpZihlbC5pbnN0YW5jZS5oaWRpbmcpe2VsLmluc3RhbmNlLiRlbWl0KCdhZnRlci1sZWF2ZScpO31lbHNle2VsLmluc3RhbmNlLnZpc2libGU9dHJ1ZTt9fSk7ZWwuZG9tSW5zZXJ0ZWQ9dHJ1ZTt9ZWxzZSBpZihlbC5kb21WaXNpYmxlJiZlbC5pbnN0YW5jZS5oaWRpbmc9PT10cnVlKXtlbC5pbnN0YW5jZS52aXNpYmxlPXRydWU7ZWwuaW5zdGFuY2UuaGlkaW5nPWZhbHNlO319O1Z1ZS5kaXJlY3RpdmUoJ2xvYWRpbmcnLHtiaW5kOmZ1bmN0aW9uIGJpbmQoZWwsYmluZGluZyx2bm9kZSl7dmFyIHRleHRFeHI9ZWwuZ2V0QXR0cmlidXRlKCdlbGVtZW50LWxvYWRpbmctdGV4dCcpO3ZhciBzcGlubmVyRXhyPWVsLmdldEF0dHJpYnV0ZSgnZWxlbWVudC1sb2FkaW5nLXNwaW5uZXInKTt2YXIgYmFja2dyb3VuZEV4cj1lbC5nZXRBdHRyaWJ1dGUoJ2VsZW1lbnQtbG9hZGluZy1iYWNrZ3JvdW5kJyk7dmFyIGN1c3RvbUNsYXNzRXhyPWVsLmdldEF0dHJpYnV0ZSgnZWxlbWVudC1sb2FkaW5nLWN1c3RvbS1jbGFzcycpO3ZhciB2bT12bm9kZS5jb250ZXh0O3ZhciBtYXNrPW5ldyBNYXNrKHtlbDpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSxkYXRhOnt0ZXh0OnZtJiZ2bVt0ZXh0RXhyXXx8dGV4dEV4cixzcGlubmVyOnZtJiZ2bVtzcGlubmVyRXhyXXx8c3Bpbm5lckV4cixiYWNrZ3JvdW5kOnZtJiZ2bVtiYWNrZ3JvdW5kRXhyXXx8YmFja2dyb3VuZEV4cixjdXN0b21DbGFzczp2bSYmdm1bY3VzdG9tQ2xhc3NFeHJdfHxjdXN0b21DbGFzc0V4cixmdWxsc2NyZWVuOiEhYmluZGluZy5tb2RpZmllcnMuZnVsbHNjcmVlbn19KTtlbC5pbnN0YW5jZT1tYXNrO2VsLm1hc2s9bWFzay4kZWw7ZWwubWFza1N0eWxlPXt9O2JpbmRpbmcudmFsdWUmJnRvZ2dsZUxvYWRpbmcoZWwsYmluZGluZyk7fSx1cGRhdGU6ZnVuY3Rpb24gdXBkYXRlKGVsLGJpbmRpbmcpe2VsLmluc3RhbmNlLnNldFRleHQoZWwuZ2V0QXR0cmlidXRlKCdlbGVtZW50LWxvYWRpbmctdGV4dCcpKTtpZihiaW5kaW5nLm9sZFZhbHVlIT09YmluZGluZy52YWx1ZSl7dG9nZ2xlTG9hZGluZyhlbCxiaW5kaW5nKTt9fSx1bmJpbmQ6ZnVuY3Rpb24gdW5iaW5kKGVsLGJpbmRpbmcpe2lmKGVsLmRvbUluc2VydGVkKXtlbC5tYXNrJiZlbC5tYXNrLnBhcmVudE5vZGUmJmVsLm1hc2sucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbC5tYXNrKTt0b2dnbGVMb2FkaW5nKGVsLHt2YWx1ZTpmYWxzZSxtb2RpZmllcnM6YmluZGluZy5tb2RpZmllcnN9KTt9ZWwuaW5zdGFuY2UmJmVsLmluc3RhbmNlLiRkZXN0cm95KCk7fX0pO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfZGlyZWN0aXZlPWxvYWRpbmdEaXJlY3RpdmU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9sb2FkaW5nL3NyYy9pbmRleC5qcwp2YXIgTG9hZGluZ0NvbnN0cnVjdG9yPWV4dGVybmFsX3Z1ZV9kZWZhdWx0LmEuZXh0ZW5kKGxvYWRpbmcpO3ZhciBzcmNfZGVmYXVsdHM9e3RleHQ6bnVsbCxmdWxsc2NyZWVuOnRydWUsYm9keTpmYWxzZSxsb2NrOmZhbHNlLGN1c3RvbUNsYXNzOicnfTt2YXIgZnVsbHNjcmVlbkxvYWRpbmc9dm9pZCAwO0xvYWRpbmdDb25zdHJ1Y3Rvci5wcm90b3R5cGUub3JpZ2luYWxQb3NpdGlvbj0nJztMb2FkaW5nQ29uc3RydWN0b3IucHJvdG90eXBlLm9yaWdpbmFsT3ZlcmZsb3c9Jyc7TG9hZGluZ0NvbnN0cnVjdG9yLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe3ZhciBfdGhpcz10aGlzO2lmKHRoaXMuZnVsbHNjcmVlbil7ZnVsbHNjcmVlbkxvYWRpbmc9dW5kZWZpbmVkO31hZnRlcl9sZWF2ZV9kZWZhdWx0KCkodGhpcyxmdW5jdGlvbihfKXt2YXIgdGFyZ2V0PV90aGlzLmZ1bGxzY3JlZW58fF90aGlzLmJvZHk/ZG9jdW1lbnQuYm9keTpfdGhpcy50YXJnZXQ7T2JqZWN0KGRvbV9bInJlbW92ZUNsYXNzIl0pKHRhcmdldCwnZWwtbG9hZGluZy1wYXJlbnQtLXJlbGF0aXZlJyk7T2JqZWN0KGRvbV9bInJlbW92ZUNsYXNzIl0pKHRhcmdldCwnZWwtbG9hZGluZy1wYXJlbnQtLWhpZGRlbicpO2lmKF90aGlzLiRlbCYmX3RoaXMuJGVsLnBhcmVudE5vZGUpe190aGlzLiRlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKF90aGlzLiRlbCk7fV90aGlzLiRkZXN0cm95KCk7fSwzMDApO3RoaXMudmlzaWJsZT1mYWxzZTt9O3ZhciBzcmNfYWRkU3R5bGU9ZnVuY3Rpb24gYWRkU3R5bGUob3B0aW9ucyxwYXJlbnQsaW5zdGFuY2Upe3ZhciBtYXNrU3R5bGU9e307aWYob3B0aW9ucy5mdWxsc2NyZWVuKXtpbnN0YW5jZS5vcmlnaW5hbFBvc2l0aW9uPU9iamVjdChkb21fWyJnZXRTdHlsZSJdKShkb2N1bWVudC5ib2R5LCdwb3NpdGlvbicpO2luc3RhbmNlLm9yaWdpbmFsT3ZlcmZsb3c9T2JqZWN0KGRvbV9bImdldFN0eWxlIl0pKGRvY3VtZW50LmJvZHksJ292ZXJmbG93Jyk7bWFza1N0eWxlLnpJbmRleD1wb3B1cF9bIlBvcHVwTWFuYWdlciJdLm5leHRaSW5kZXgoKTt9ZWxzZSBpZihvcHRpb25zLmJvZHkpe2luc3RhbmNlLm9yaWdpbmFsUG9zaXRpb249T2JqZWN0KGRvbV9bImdldFN0eWxlIl0pKGRvY3VtZW50LmJvZHksJ3Bvc2l0aW9uJyk7Wyd0b3AnLCdsZWZ0J10uZm9yRWFjaChmdW5jdGlvbihwcm9wZXJ0eSl7dmFyIHNjcm9sbD1wcm9wZXJ0eT09PSd0b3AnPydzY3JvbGxUb3AnOidzY3JvbGxMZWZ0JzttYXNrU3R5bGVbcHJvcGVydHldPW9wdGlvbnMudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW3Byb3BlcnR5XStkb2N1bWVudC5ib2R5W3Njcm9sbF0rZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W3Njcm9sbF0rJ3B4Jzt9KTtbJ2hlaWdodCcsJ3dpZHRoJ10uZm9yRWFjaChmdW5jdGlvbihwcm9wZXJ0eSl7bWFza1N0eWxlW3Byb3BlcnR5XT1vcHRpb25zLnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtwcm9wZXJ0eV0rJ3B4Jzt9KTt9ZWxzZXtpbnN0YW5jZS5vcmlnaW5hbFBvc2l0aW9uPU9iamVjdChkb21fWyJnZXRTdHlsZSJdKShwYXJlbnQsJ3Bvc2l0aW9uJyk7fU9iamVjdC5rZXlzKG1hc2tTdHlsZSkuZm9yRWFjaChmdW5jdGlvbihwcm9wZXJ0eSl7aW5zdGFuY2UuJGVsLnN0eWxlW3Byb3BlcnR5XT1tYXNrU3R5bGVbcHJvcGVydHldO30pO307dmFyIHNyY19Mb2FkaW5nPWZ1bmN0aW9uIExvYWRpbmcoKXt2YXIgb3B0aW9ucz1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMF06e307aWYoZXh0ZXJuYWxfdnVlX2RlZmF1bHQuYS5wcm90b3R5cGUuJGlzU2VydmVyKXJldHVybjtvcHRpb25zPW1lcmdlX2RlZmF1bHQoKSh7fSxzcmNfZGVmYXVsdHMsb3B0aW9ucyk7aWYodHlwZW9mIG9wdGlvbnMudGFyZ2V0PT09J3N0cmluZycpe29wdGlvbnMudGFyZ2V0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iob3B0aW9ucy50YXJnZXQpO31vcHRpb25zLnRhcmdldD1vcHRpb25zLnRhcmdldHx8ZG9jdW1lbnQuYm9keTtpZihvcHRpb25zLnRhcmdldCE9PWRvY3VtZW50LmJvZHkpe29wdGlvbnMuZnVsbHNjcmVlbj1mYWxzZTt9ZWxzZXtvcHRpb25zLmJvZHk9dHJ1ZTt9aWYob3B0aW9ucy5mdWxsc2NyZWVuJiZmdWxsc2NyZWVuTG9hZGluZyl7cmV0dXJuIGZ1bGxzY3JlZW5Mb2FkaW5nO312YXIgcGFyZW50PW9wdGlvbnMuYm9keT9kb2N1bWVudC5ib2R5Om9wdGlvbnMudGFyZ2V0O3ZhciBpbnN0YW5jZT1uZXcgTG9hZGluZ0NvbnN0cnVjdG9yKHtlbDpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSxkYXRhOm9wdGlvbnN9KTtzcmNfYWRkU3R5bGUob3B0aW9ucyxwYXJlbnQsaW5zdGFuY2UpO2lmKGluc3RhbmNlLm9yaWdpbmFsUG9zaXRpb24hPT0nYWJzb2x1dGUnJiZpbnN0YW5jZS5vcmlnaW5hbFBvc2l0aW9uIT09J2ZpeGVkJyl7T2JqZWN0KGRvbV9bImFkZENsYXNzIl0pKHBhcmVudCwnZWwtbG9hZGluZy1wYXJlbnQtLXJlbGF0aXZlJyk7fWlmKG9wdGlvbnMuZnVsbHNjcmVlbiYmb3B0aW9ucy5sb2NrKXtPYmplY3QoZG9tX1siYWRkQ2xhc3MiXSkocGFyZW50LCdlbC1sb2FkaW5nLXBhcmVudC0taGlkZGVuJyk7fXBhcmVudC5hcHBlbmRDaGlsZChpbnN0YW5jZS4kZWwpO2V4dGVybmFsX3Z1ZV9kZWZhdWx0LmEubmV4dFRpY2soZnVuY3Rpb24oKXtpbnN0YW5jZS52aXNpYmxlPXRydWU7fSk7aWYob3B0aW9ucy5mdWxsc2NyZWVuKXtmdWxsc2NyZWVuTG9hZGluZz1pbnN0YW5jZTt9cmV0dXJuIGluc3RhbmNlO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmM9c3JjX0xvYWRpbmc7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9sb2FkaW5nL2luZGV4LmpzCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFja2FnZXNfbG9hZGluZz17aW5zdGFsbDpmdW5jdGlvbiBpbnN0YWxsKFZ1ZSl7VnVlLnVzZShzcmNfZGlyZWN0aXZlKTtWdWUucHJvdG90eXBlLiRsb2FkaW5nPXNyYzt9LGRpcmVjdGl2ZTpzcmNfZGlyZWN0aXZlLHNlcnZpY2U6c3JjfTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2ljb24vc3JjL2ljb24udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWNiM2ZlN2Y0Jgp2YXIgaWNvbnZ1ZV90eXBlX3RlbXBsYXRlX2lkX2NiM2ZlN2Y0X3JlbmRlcj1mdW5jdGlvbiBpY29udnVlX3R5cGVfdGVtcGxhdGVfaWRfY2IzZmU3ZjRfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJpIix7Y2xhc3M6ImVsLWljb24tIitfdm0ubmFtZX0pO307dmFyIGljb252dWVfdHlwZV90ZW1wbGF0ZV9pZF9jYjNmZTdmNF9zdGF0aWNSZW5kZXJGbnM9W107aWNvbnZ1ZV90eXBlX3RlbXBsYXRlX2lkX2NiM2ZlN2Y0X3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9pY29uL3NyYy9pY29uLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD1jYjNmZTdmNCYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvaWNvbi9zcmMvaWNvbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgaWNvbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17bmFtZTonRWxJY29uJyxwcm9wczp7bmFtZTpTdHJpbmd9fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2ljb24vc3JjL2ljb24udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHNyY19pY29udnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPWljb252dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9pY29uL3NyYy9pY29uLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIGljb25fY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChzcmNfaWNvbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxpY29udnVlX3R5cGVfdGVtcGxhdGVfaWRfY2IzZmU3ZjRfcmVuZGVyLGljb252dWVfdHlwZV90ZW1wbGF0ZV9pZF9jYjNmZTdmNF9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIGljb25fYXBpO31pY29uX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvaWNvbi9zcmMvaWNvbi52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgaWNvbj1pY29uX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvaWNvbi9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL2ljb24uaW5zdGFsbD1mdW5jdGlvbihWdWUpe1Z1ZS5jb21wb25lbnQoaWNvbi5uYW1lLGljb24pO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYWNrYWdlc19pY29uPWljb247Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9yb3cvc3JjL3Jvdy5qcwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHNyY19yb3c9e25hbWU6J0VsUm93Jyxjb21wb25lbnROYW1lOidFbFJvdycscHJvcHM6e3RhZzp7dHlwZTpTdHJpbmcsZGVmYXVsdDonZGl2J30sZ3V0dGVyOk51bWJlcix0eXBlOlN0cmluZyxqdXN0aWZ5Ont0eXBlOlN0cmluZyxkZWZhdWx0OidzdGFydCd9LGFsaWduOnt0eXBlOlN0cmluZyxkZWZhdWx0Oid0b3AnfX0sY29tcHV0ZWQ6e3N0eWxlOmZ1bmN0aW9uIHN0eWxlKCl7dmFyIHJldD17fTtpZih0aGlzLmd1dHRlcil7cmV0Lm1hcmdpbkxlZnQ9Jy0nK3RoaXMuZ3V0dGVyLzIrJ3B4JztyZXQubWFyZ2luUmlnaHQ9cmV0Lm1hcmdpbkxlZnQ7fXJldHVybiByZXQ7fX0scmVuZGVyOmZ1bmN0aW9uIHJlbmRlcihoKXtyZXR1cm4gaCh0aGlzLnRhZyx7Y2xhc3M6WydlbC1yb3cnLHRoaXMuanVzdGlmeSE9PSdzdGFydCc/J2lzLWp1c3RpZnktJyt0aGlzLmp1c3RpZnk6JycsdGhpcy5hbGlnbiE9PSd0b3AnPydpcy1hbGlnbi0nK3RoaXMuYWxpZ246JycseydlbC1yb3ctLWZsZXgnOnRoaXMudHlwZT09PSdmbGV4J31dLHN0eWxlOnRoaXMuc3R5bGV9LHRoaXMuJHNsb3RzLmRlZmF1bHQpO319Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcm93L2luZGV4LmpzCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovc3JjX3Jvdy5pbnN0YWxsPWZ1bmN0aW9uKFZ1ZSl7VnVlLmNvbXBvbmVudChzcmNfcm93Lm5hbWUsc3JjX3Jvdyk7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX3Jvdz1zcmNfcm93Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY29sL3NyYy9jb2wuanMKdmFyIGNvbF90eXBlb2Y9dHlwZW9mIFN5bWJvbD09PSJmdW5jdGlvbiImJl90eXBlb2YyKFN5bWJvbC5pdGVyYXRvcik9PT0ic3ltYm9sIj9mdW5jdGlvbihvYmope3JldHVybiBfdHlwZW9mMihvYmopO306ZnVuY3Rpb24ob2JqKXtyZXR1cm4gb2JqJiZ0eXBlb2YgU3ltYm9sPT09ImZ1bmN0aW9uIiYmb2JqLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZvYmohPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOl90eXBlb2YyKG9iaik7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGNvbD17bmFtZTonRWxDb2wnLHByb3BzOntzcGFuOnt0eXBlOk51bWJlcixkZWZhdWx0OjI0fSx0YWc6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6J2Rpdid9LG9mZnNldDpOdW1iZXIscHVsbDpOdW1iZXIscHVzaDpOdW1iZXIseHM6W051bWJlcixPYmplY3RdLHNtOltOdW1iZXIsT2JqZWN0XSxtZDpbTnVtYmVyLE9iamVjdF0sbGc6W051bWJlcixPYmplY3RdLHhsOltOdW1iZXIsT2JqZWN0XX0sY29tcHV0ZWQ6e2d1dHRlcjpmdW5jdGlvbiBndXR0ZXIoKXt2YXIgcGFyZW50PXRoaXMuJHBhcmVudDt3aGlsZShwYXJlbnQmJnBhcmVudC4kb3B0aW9ucy5jb21wb25lbnROYW1lIT09J0VsUm93Jyl7cGFyZW50PXBhcmVudC4kcGFyZW50O31yZXR1cm4gcGFyZW50P3BhcmVudC5ndXR0ZXI6MDt9fSxyZW5kZXI6ZnVuY3Rpb24gcmVuZGVyKGgpe3ZhciBfdGhpcz10aGlzO3ZhciBjbGFzc0xpc3Q9W107dmFyIHN0eWxlPXt9O2lmKHRoaXMuZ3V0dGVyKXtzdHlsZS5wYWRkaW5nTGVmdD10aGlzLmd1dHRlci8yKydweCc7c3R5bGUucGFkZGluZ1JpZ2h0PXN0eWxlLnBhZGRpbmdMZWZ0O31bJ3NwYW4nLCdvZmZzZXQnLCdwdWxsJywncHVzaCddLmZvckVhY2goZnVuY3Rpb24ocHJvcCl7aWYoX3RoaXNbcHJvcF18fF90aGlzW3Byb3BdPT09MCl7Y2xhc3NMaXN0LnB1c2gocHJvcCE9PSdzcGFuJz8nZWwtY29sLScrcHJvcCsnLScrX3RoaXNbcHJvcF06J2VsLWNvbC0nK190aGlzW3Byb3BdKTt9fSk7Wyd4cycsJ3NtJywnbWQnLCdsZycsJ3hsJ10uZm9yRWFjaChmdW5jdGlvbihzaXplKXtpZih0eXBlb2YgX3RoaXNbc2l6ZV09PT0nbnVtYmVyJyl7Y2xhc3NMaXN0LnB1c2goJ2VsLWNvbC0nK3NpemUrJy0nK190aGlzW3NpemVdKTt9ZWxzZSBpZihjb2xfdHlwZW9mKF90aGlzW3NpemVdKT09PSdvYmplY3QnKXt2YXIgcHJvcHM9X3RoaXNbc2l6ZV07T2JqZWN0LmtleXMocHJvcHMpLmZvckVhY2goZnVuY3Rpb24ocHJvcCl7Y2xhc3NMaXN0LnB1c2gocHJvcCE9PSdzcGFuJz8nZWwtY29sLScrc2l6ZSsnLScrcHJvcCsnLScrcHJvcHNbcHJvcF06J2VsLWNvbC0nK3NpemUrJy0nK3Byb3BzW3Byb3BdKTt9KTt9fSk7cmV0dXJuIGgodGhpcy50YWcse2NsYXNzOlsnZWwtY29sJyxjbGFzc0xpc3RdLHN0eWxlOnN0eWxlfSx0aGlzLiRzbG90cy5kZWZhdWx0KTt9fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NvbC9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL2NvbC5pbnN0YWxsPWZ1bmN0aW9uKFZ1ZSl7VnVlLmNvbXBvbmVudChjb2wubmFtZSxjb2wpO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYWNrYWdlc19jb2w9Y29sOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvdXBsb2FkL3NyYy91cGxvYWQtbGlzdC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MTczZmVkZjUmCnZhciB1cGxvYWRfbGlzdHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzE3M2ZlZGY1X3JlbmRlcj1mdW5jdGlvbiB1cGxvYWRfbGlzdHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzE3M2ZlZGY1X3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygidHJhbnNpdGlvbi1ncm91cCIse2NsYXNzOlsiZWwtdXBsb2FkLWxpc3QiLCJlbC11cGxvYWQtbGlzdC0tIitfdm0ubGlzdFR5cGUseyJpcy1kaXNhYmxlZCI6X3ZtLmRpc2FibGVkfV0sYXR0cnM6e3RhZzoidWwiLG5hbWU6ImVsLWxpc3QifX0sX3ZtLl9sKF92bS5maWxlcyxmdW5jdGlvbihmaWxlKXtyZXR1cm4gX2MoImxpIix7a2V5OmZpbGUudWlkLGNsYXNzOlsiZWwtdXBsb2FkLWxpc3RfX2l0ZW0iLCJpcy0iK2ZpbGUuc3RhdHVzLF92bS5mb2N1c2luZz8iZm9jdXNpbmciOiIiXSxhdHRyczp7dGFiaW5kZXg6IjAifSxvbjp7a2V5ZG93bjpmdW5jdGlvbiBrZXlkb3duKCRldmVudCl7aWYoISgiYnV0dG9uImluICRldmVudCkmJl92bS5faygkZXZlbnQua2V5Q29kZSwiZGVsZXRlIixbOCw0Nl0sJGV2ZW50LmtleSxbIkJhY2tzcGFjZSIsIkRlbGV0ZSIsIkRlbCJdKSl7cmV0dXJuIG51bGw7fSFfdm0uZGlzYWJsZWQmJl92bS4kZW1pdCgicmVtb3ZlIixmaWxlKTt9LGZvY3VzOmZ1bmN0aW9uIGZvY3VzKCRldmVudCl7X3ZtLmZvY3VzaW5nPXRydWU7fSxibHVyOmZ1bmN0aW9uIGJsdXIoJGV2ZW50KXtfdm0uZm9jdXNpbmc9ZmFsc2U7fSxjbGljazpmdW5jdGlvbiBjbGljaygkZXZlbnQpe192bS5mb2N1c2luZz1mYWxzZTt9fX0sW192bS5fdCgiZGVmYXVsdCIsW2ZpbGUuc3RhdHVzIT09InVwbG9hZGluZyImJlsicGljdHVyZS1jYXJkIiwicGljdHVyZSJdLmluZGV4T2YoX3ZtLmxpc3RUeXBlKT4tMT9fYygiaW1nIix7c3RhdGljQ2xhc3M6ImVsLXVwbG9hZC1saXN0X19pdGVtLXRodW1ibmFpbCIsYXR0cnM6e3NyYzpmaWxlLnVybCxhbHQ6IiJ9fSk6X3ZtLl9lKCksX2MoImEiLHtzdGF0aWNDbGFzczoiZWwtdXBsb2FkLWxpc3RfX2l0ZW0tbmFtZSIsb246e2NsaWNrOmZ1bmN0aW9uIGNsaWNrKCRldmVudCl7X3ZtLmhhbmRsZUNsaWNrKGZpbGUpO319fSxbX2MoImkiLHtzdGF0aWNDbGFzczoiZWwtaWNvbi1kb2N1bWVudCJ9KSxfdm0uX3YoX3ZtLl9zKGZpbGUubmFtZSkrIlxuICAgICAgIildKSxfYygibGFiZWwiLHtzdGF0aWNDbGFzczoiZWwtdXBsb2FkLWxpc3RfX2l0ZW0tc3RhdHVzLWxhYmVsIn0sW19jKCJpIix7Y2xhc3M6eyJlbC1pY29uLXVwbG9hZC1zdWNjZXNzIjp0cnVlLCJlbC1pY29uLWNpcmNsZS1jaGVjayI6X3ZtLmxpc3RUeXBlPT09InRleHQiLCJlbC1pY29uLWNoZWNrIjpbInBpY3R1cmUtY2FyZCIsInBpY3R1cmUiXS5pbmRleE9mKF92bS5saXN0VHlwZSk+LTF9fSldKSwhX3ZtLmRpc2FibGVkP19jKCJpIix7c3RhdGljQ2xhc3M6ImVsLWljb24tY2xvc2UiLG9uOntjbGljazpmdW5jdGlvbiBjbGljaygkZXZlbnQpe192bS4kZW1pdCgicmVtb3ZlIixmaWxlKTt9fX0pOl92bS5fZSgpLCFfdm0uZGlzYWJsZWQ/X2MoImkiLHtzdGF0aWNDbGFzczoiZWwtaWNvbi1jbG9zZS10aXAifSxbX3ZtLl92KF92bS5fcyhfdm0udCgiZWwudXBsb2FkLmRlbGV0ZVRpcCIpKSldKTpfdm0uX2UoKSxmaWxlLnN0YXR1cz09PSJ1cGxvYWRpbmciP19jKCJlbC1wcm9ncmVzcyIse2F0dHJzOnt0eXBlOl92bS5saXN0VHlwZT09PSJwaWN0dXJlLWNhcmQiPyJjaXJjbGUiOiJsaW5lIiwic3Ryb2tlLXdpZHRoIjpfdm0ubGlzdFR5cGU9PT0icGljdHVyZS1jYXJkIj82OjIscGVyY2VudGFnZTpfdm0ucGFyc2VQZXJjZW50YWdlKGZpbGUucGVyY2VudGFnZSl9fSk6X3ZtLl9lKCksX3ZtLmxpc3RUeXBlPT09InBpY3R1cmUtY2FyZCI/X2MoInNwYW4iLHtzdGF0aWNDbGFzczoiZWwtdXBsb2FkLWxpc3RfX2l0ZW0tYWN0aW9ucyJ9LFtfdm0uaGFuZGxlUHJldmlldyYmX3ZtLmxpc3RUeXBlPT09InBpY3R1cmUtY2FyZCI/X2MoInNwYW4iLHtzdGF0aWNDbGFzczoiZWwtdXBsb2FkLWxpc3RfX2l0ZW0tcHJldmlldyIsb246e2NsaWNrOmZ1bmN0aW9uIGNsaWNrKCRldmVudCl7X3ZtLmhhbmRsZVByZXZpZXcoZmlsZSk7fX19LFtfYygiaSIse3N0YXRpY0NsYXNzOiJlbC1pY29uLXpvb20taW4ifSldKTpfdm0uX2UoKSwhX3ZtLmRpc2FibGVkP19jKCJzcGFuIix7c3RhdGljQ2xhc3M6ImVsLXVwbG9hZC1saXN0X19pdGVtLWRlbGV0ZSIsb246e2NsaWNrOmZ1bmN0aW9uIGNsaWNrKCRldmVudCl7X3ZtLiRlbWl0KCJyZW1vdmUiLGZpbGUpO319fSxbX2MoImkiLHtzdGF0aWNDbGFzczoiZWwtaWNvbi1kZWxldGUifSldKTpfdm0uX2UoKV0pOl92bS5fZSgpXSx7ZmlsZTpmaWxlfSldLDIpO30pLDApO307dmFyIHVwbG9hZF9saXN0dnVlX3R5cGVfdGVtcGxhdGVfaWRfMTczZmVkZjVfc3RhdGljUmVuZGVyRm5zPVtdO3VwbG9hZF9saXN0dnVlX3R5cGVfdGVtcGxhdGVfaWRfMTczZmVkZjVfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3VwbG9hZC9zcmMvdXBsb2FkLWxpc3QudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTE3M2ZlZGY1JgovLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsICJlbGVtZW50LXVpL2xpYi9wcm9ncmVzcyIKdmFyIHByb2dyZXNzXz1fX3dlYnBhY2tfcmVxdWlyZV9fKDM0KTt2YXIgcHJvZ3Jlc3NfZGVmYXVsdD0vKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKHByb2dyZXNzXyk7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvdXBsb2FkL3NyYy91cGxvYWQtbGlzdC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgdXBsb2FkX2xpc3R2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e25hbWU6J0VsVXBsb2FkTGlzdCcsbWl4aW5zOltsb2NhbGVfZGVmYXVsdC5hXSxkYXRhOmZ1bmN0aW9uIGRhdGEoKXtyZXR1cm57Zm9jdXNpbmc6ZmFsc2V9O30sY29tcG9uZW50czp7RWxQcm9ncmVzczpwcm9ncmVzc19kZWZhdWx0LmF9LHByb3BzOntmaWxlczp7dHlwZTpBcnJheSxkZWZhdWx0OmZ1bmN0aW9uIF9kZWZhdWx0KCl7cmV0dXJuW107fX0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OmZhbHNlfSxoYW5kbGVQcmV2aWV3OkZ1bmN0aW9uLGxpc3RUeXBlOlN0cmluZ30sbWV0aG9kczp7cGFyc2VQZXJjZW50YWdlOmZ1bmN0aW9uIHBhcnNlUGVyY2VudGFnZSh2YWwpe3JldHVybiBwYXJzZUludCh2YWwsMTApO30saGFuZGxlQ2xpY2s6ZnVuY3Rpb24gaGFuZGxlQ2xpY2soZmlsZSl7dGhpcy5oYW5kbGVQcmV2aWV3JiZ0aGlzLmhhbmRsZVByZXZpZXcoZmlsZSk7fX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdXBsb2FkL3NyYy91cGxvYWQtbGlzdC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc3JjX3VwbG9hZF9saXN0dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXVwbG9hZF9saXN0dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdXBsb2FkL3NyYy91cGxvYWQtbGlzdC52dWUKLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciB1cGxvYWRfbGlzdF9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHNyY191cGxvYWRfbGlzdHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyx1cGxvYWRfbGlzdHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzE3M2ZlZGY1X3JlbmRlcix1cGxvYWRfbGlzdHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzE3M2ZlZGY1X3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgdXBsb2FkX2xpc3RfYXBpO311cGxvYWRfbGlzdF9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL3VwbG9hZC9zcmMvdXBsb2FkLWxpc3QudnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHVwbG9hZF9saXN0PXVwbG9hZF9saXN0X2NvbXBvbmVudC5leHBvcnRzOy8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgImJhYmVsLWhlbHBlci12dWUtanN4LW1lcmdlLXByb3BzIgp2YXIgZXh0ZXJuYWxfYmFiZWxfaGVscGVyX3Z1ZV9qc3hfbWVyZ2VfcHJvcHNfPV9fd2VicGFja19yZXF1aXJlX18oMjQpO3ZhciBleHRlcm5hbF9iYWJlbF9oZWxwZXJfdnVlX2pzeF9tZXJnZV9wcm9wc19kZWZhdWx0PS8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oZXh0ZXJuYWxfYmFiZWxfaGVscGVyX3Z1ZV9qc3hfbWVyZ2VfcHJvcHNfKTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3VwbG9hZC9zcmMvYWpheC5qcwpmdW5jdGlvbiBnZXRFcnJvcihhY3Rpb24sb3B0aW9uLHhocil7dmFyIG1zZz12b2lkIDA7aWYoeGhyLnJlc3BvbnNlKXttc2c9JycrKHhoci5yZXNwb25zZS5lcnJvcnx8eGhyLnJlc3BvbnNlKTt9ZWxzZSBpZih4aHIucmVzcG9uc2VUZXh0KXttc2c9JycreGhyLnJlc3BvbnNlVGV4dDt9ZWxzZXttc2c9J2ZhaWwgdG8gcG9zdCAnK2FjdGlvbisnICcreGhyLnN0YXR1czt9dmFyIGVycj1uZXcgRXJyb3IobXNnKTtlcnIuc3RhdHVzPXhoci5zdGF0dXM7ZXJyLm1ldGhvZD0ncG9zdCc7ZXJyLnVybD1hY3Rpb247cmV0dXJuIGVycjt9ZnVuY3Rpb24gZ2V0Qm9keSh4aHIpe3ZhciB0ZXh0PXhoci5yZXNwb25zZVRleHR8fHhoci5yZXNwb25zZTtpZighdGV4dCl7cmV0dXJuIHRleHQ7fXRyeXtyZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KTt9Y2F0Y2goZSl7cmV0dXJuIHRleHQ7fX1mdW5jdGlvbiB1cGxvYWQob3B0aW9uKXtpZih0eXBlb2YgWE1MSHR0cFJlcXVlc3Q9PT0ndW5kZWZpbmVkJyl7cmV0dXJuO312YXIgeGhyPW5ldyBYTUxIdHRwUmVxdWVzdCgpO3ZhciBhY3Rpb249b3B0aW9uLmFjdGlvbjtpZih4aHIudXBsb2FkKXt4aHIudXBsb2FkLm9ucHJvZ3Jlc3M9ZnVuY3Rpb24gcHJvZ3Jlc3MoZSl7aWYoZS50b3RhbD4wKXtlLnBlcmNlbnQ9ZS5sb2FkZWQvZS50b3RhbCoxMDA7fW9wdGlvbi5vblByb2dyZXNzKGUpO307fXZhciBmb3JtRGF0YT1uZXcgRm9ybURhdGEoKTtpZihvcHRpb24uZGF0YSl7T2JqZWN0LmtleXMob3B0aW9uLmRhdGEpLmZvckVhY2goZnVuY3Rpb24oa2V5KXtmb3JtRGF0YS5hcHBlbmQoa2V5LG9wdGlvbi5kYXRhW2tleV0pO30pO31mb3JtRGF0YS5hcHBlbmQob3B0aW9uLmZpbGVuYW1lLG9wdGlvbi5maWxlLG9wdGlvbi5maWxlLm5hbWUpO3hoci5vbmVycm9yPWZ1bmN0aW9uIGVycm9yKGUpe29wdGlvbi5vbkVycm9yKGUpO307eGhyLm9ubG9hZD1mdW5jdGlvbiBvbmxvYWQoKXtpZih4aHIuc3RhdHVzPDIwMHx8eGhyLnN0YXR1cz49MzAwKXtyZXR1cm4gb3B0aW9uLm9uRXJyb3IoZ2V0RXJyb3IoYWN0aW9uLG9wdGlvbix4aHIpKTt9b3B0aW9uLm9uU3VjY2VzcyhnZXRCb2R5KHhocikpO307eGhyLm9wZW4oJ3Bvc3QnLGFjdGlvbix0cnVlKTtpZihvcHRpb24ud2l0aENyZWRlbnRpYWxzJiYnd2l0aENyZWRlbnRpYWxzJ2luIHhocil7eGhyLndpdGhDcmVkZW50aWFscz10cnVlO312YXIgaGVhZGVycz1vcHRpb24uaGVhZGVyc3x8e307Zm9yKHZhciBpdGVtIGluIGhlYWRlcnMpe2lmKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoaXRlbSkmJmhlYWRlcnNbaXRlbV0hPT1udWxsKXt4aHIuc2V0UmVxdWVzdEhlYWRlcihpdGVtLGhlYWRlcnNbaXRlbV0pO319eGhyLnNlbmQoZm9ybURhdGEpO3JldHVybiB4aHI7fS8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvdXBsb2FkL3NyYy91cGxvYWQtZHJhZ2dlci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9N2ViYmYyMTkmCnZhciB1cGxvYWRfZHJhZ2dlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzdlYmJmMjE5X3JlbmRlcj1mdW5jdGlvbiB1cGxvYWRfZHJhZ2dlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzdlYmJmMjE5X3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXVwbG9hZC1kcmFnZ2VyIixjbGFzczp7ImlzLWRyYWdvdmVyIjpfdm0uZHJhZ292ZXJ9LG9uOntkcm9wOmZ1bmN0aW9uIGRyb3AoJGV2ZW50KXskZXZlbnQucHJldmVudERlZmF1bHQoKTtyZXR1cm4gX3ZtLm9uRHJvcCgkZXZlbnQpO30sZHJhZ292ZXI6ZnVuY3Rpb24gZHJhZ292ZXIoJGV2ZW50KXskZXZlbnQucHJldmVudERlZmF1bHQoKTtyZXR1cm4gX3ZtLm9uRHJhZ292ZXIoJGV2ZW50KTt9LGRyYWdsZWF2ZTpmdW5jdGlvbiBkcmFnbGVhdmUoJGV2ZW50KXskZXZlbnQucHJldmVudERlZmF1bHQoKTtfdm0uZHJhZ292ZXI9ZmFsc2U7fX19LFtfdm0uX3QoImRlZmF1bHQiKV0sMik7fTt2YXIgdXBsb2FkX2RyYWdnZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF83ZWJiZjIxOV9zdGF0aWNSZW5kZXJGbnM9W107dXBsb2FkX2RyYWdnZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF83ZWJiZjIxOV9yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdXBsb2FkL3NyYy91cGxvYWQtZHJhZ2dlci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9N2ViYmYyMTkmCi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3VwbG9hZC9zcmMvdXBsb2FkLWRyYWdnZXIudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHVwbG9hZF9kcmFnZ2VydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbFVwbG9hZERyYWcnLHByb3BzOntkaXNhYmxlZDpCb29sZWFufSxpbmplY3Q6e3VwbG9hZGVyOntkZWZhdWx0OicnfX0sZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue2RyYWdvdmVyOmZhbHNlfTt9LG1ldGhvZHM6e29uRHJhZ292ZXI6ZnVuY3Rpb24gb25EcmFnb3Zlcigpe2lmKCF0aGlzLmRpc2FibGVkKXt0aGlzLmRyYWdvdmVyPXRydWU7fX0sb25Ecm9wOmZ1bmN0aW9uIG9uRHJvcChlKXtpZih0aGlzLmRpc2FibGVkfHwhdGhpcy51cGxvYWRlcilyZXR1cm47dmFyIGFjY2VwdD10aGlzLnVwbG9hZGVyLmFjY2VwdDt0aGlzLmRyYWdvdmVyPWZhbHNlO2lmKCFhY2NlcHQpe3RoaXMuJGVtaXQoJ2ZpbGUnLGUuZGF0YVRyYW5zZmVyLmZpbGVzKTtyZXR1cm47fXRoaXMuJGVtaXQoJ2ZpbGUnLFtdLnNsaWNlLmNhbGwoZS5kYXRhVHJhbnNmZXIuZmlsZXMpLmZpbHRlcihmdW5jdGlvbihmaWxlKXt2YXIgdHlwZT1maWxlLnR5cGUsbmFtZT1maWxlLm5hbWU7dmFyIGV4dGVuc2lvbj1uYW1lLmluZGV4T2YoJy4nKT4tMT8nLicrbmFtZS5zcGxpdCgnLicpLnBvcCgpOicnO3ZhciBiYXNlVHlwZT10eXBlLnJlcGxhY2UoL1wvLiokLywnJyk7cmV0dXJuIGFjY2VwdC5zcGxpdCgnLCcpLm1hcChmdW5jdGlvbih0eXBlKXtyZXR1cm4gdHlwZS50cmltKCk7fSkuZmlsdGVyKGZ1bmN0aW9uKHR5cGUpe3JldHVybiB0eXBlO30pLnNvbWUoZnVuY3Rpb24oYWNjZXB0ZWRUeXBlKXtpZigvXC4uKyQvLnRlc3QoYWNjZXB0ZWRUeXBlKSl7cmV0dXJuIGV4dGVuc2lvbj09PWFjY2VwdGVkVHlwZTt9aWYoL1wvXCokLy50ZXN0KGFjY2VwdGVkVHlwZSkpe3JldHVybiBiYXNlVHlwZT09PWFjY2VwdGVkVHlwZS5yZXBsYWNlKC9cL1wqJC8sJycpO31pZigvXlteXC9dK1wvW15cL10rJC8udGVzdChhY2NlcHRlZFR5cGUpKXtyZXR1cm4gdHlwZT09PWFjY2VwdGVkVHlwZTt9cmV0dXJuIGZhbHNlO30pO30pKTt9fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy91cGxvYWQvc3JjL3VwbG9hZC1kcmFnZ2VyLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfdXBsb2FkX2RyYWdnZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189dXBsb2FkX2RyYWdnZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy91cGxvYWQvc3JjL3VwbG9hZC1kcmFnZ2VyLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIHVwbG9hZF9kcmFnZ2VyX2NvbXBvbmVudD1ub3JtYWxpemVDb21wb25lbnQoc3JjX3VwbG9hZF9kcmFnZ2VydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLHVwbG9hZF9kcmFnZ2VydnVlX3R5cGVfdGVtcGxhdGVfaWRfN2ViYmYyMTlfcmVuZGVyLHVwbG9hZF9kcmFnZ2VydnVlX3R5cGVfdGVtcGxhdGVfaWRfN2ViYmYyMTlfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciB1cGxvYWRfZHJhZ2dlcl9hcGk7fXVwbG9hZF9kcmFnZ2VyX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvdXBsb2FkL3NyYy91cGxvYWQtZHJhZ2dlci52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgdXBsb2FkX2RyYWdnZXI9dXBsb2FkX2RyYWdnZXJfY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvdXBsb2FkL3NyYy91cGxvYWQudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHVwbG9hZHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17aW5qZWN0OlsndXBsb2FkZXInXSxjb21wb25lbnRzOntVcGxvYWREcmFnZ2VyOnVwbG9hZF9kcmFnZ2VyfSxwcm9wczp7dHlwZTpTdHJpbmcsYWN0aW9uOnt0eXBlOlN0cmluZyxyZXF1aXJlZDp0cnVlfSxuYW1lOnt0eXBlOlN0cmluZyxkZWZhdWx0OidmaWxlJ30sZGF0YTpPYmplY3QsaGVhZGVyczpPYmplY3Qsd2l0aENyZWRlbnRpYWxzOkJvb2xlYW4sbXVsdGlwbGU6Qm9vbGVhbixhY2NlcHQ6U3RyaW5nLG9uU3RhcnQ6RnVuY3Rpb24sb25Qcm9ncmVzczpGdW5jdGlvbixvblN1Y2Nlc3M6RnVuY3Rpb24sb25FcnJvcjpGdW5jdGlvbixiZWZvcmVVcGxvYWQ6RnVuY3Rpb24sZHJhZzpCb29sZWFuLG9uUHJldmlldzp7dHlwZTpGdW5jdGlvbixkZWZhdWx0OmZ1bmN0aW9uIF9kZWZhdWx0KCl7fX0sb25SZW1vdmU6e3R5cGU6RnVuY3Rpb24sZGVmYXVsdDpmdW5jdGlvbiBfZGVmYXVsdCgpe319LGZpbGVMaXN0OkFycmF5LGF1dG9VcGxvYWQ6Qm9vbGVhbixsaXN0VHlwZTpTdHJpbmcsaHR0cFJlcXVlc3Q6e3R5cGU6RnVuY3Rpb24sZGVmYXVsdDp1cGxvYWR9LGRpc2FibGVkOkJvb2xlYW4sbGltaXQ6TnVtYmVyLG9uRXhjZWVkOkZ1bmN0aW9ufSxkYXRhOmZ1bmN0aW9uIGRhdGEoKXtyZXR1cm57bW91c2VvdmVyOmZhbHNlLHJlcXM6e319O30sbWV0aG9kczp7aXNJbWFnZTpmdW5jdGlvbiBpc0ltYWdlKHN0cil7cmV0dXJuIHN0ci5pbmRleE9mKCdpbWFnZScpIT09LTE7fSxoYW5kbGVDaGFuZ2U6ZnVuY3Rpb24gaGFuZGxlQ2hhbmdlKGV2KXt2YXIgZmlsZXM9ZXYudGFyZ2V0LmZpbGVzO2lmKCFmaWxlcylyZXR1cm47dGhpcy51cGxvYWRGaWxlcyhmaWxlcyk7fSx1cGxvYWRGaWxlczpmdW5jdGlvbiB1cGxvYWRGaWxlcyhmaWxlcyl7dmFyIF90aGlzPXRoaXM7aWYodGhpcy5saW1pdCYmdGhpcy5maWxlTGlzdC5sZW5ndGgrZmlsZXMubGVuZ3RoPnRoaXMubGltaXQpe3RoaXMub25FeGNlZWQmJnRoaXMub25FeGNlZWQoZmlsZXMsdGhpcy5maWxlTGlzdCk7cmV0dXJuO312YXIgcG9zdEZpbGVzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZpbGVzKTtpZighdGhpcy5tdWx0aXBsZSl7cG9zdEZpbGVzPXBvc3RGaWxlcy5zbGljZSgwLDEpO31pZihwb3N0RmlsZXMubGVuZ3RoPT09MCl7cmV0dXJuO31wb3N0RmlsZXMuZm9yRWFjaChmdW5jdGlvbihyYXdGaWxlKXtfdGhpcy5vblN0YXJ0KHJhd0ZpbGUpO2lmKF90aGlzLmF1dG9VcGxvYWQpX3RoaXMudXBsb2FkKHJhd0ZpbGUpO30pO30sdXBsb2FkOmZ1bmN0aW9uIHVwbG9hZChyYXdGaWxlKXt2YXIgX3RoaXMyPXRoaXM7dGhpcy4kcmVmcy5pbnB1dC52YWx1ZT1udWxsO2lmKCF0aGlzLmJlZm9yZVVwbG9hZCl7cmV0dXJuIHRoaXMucG9zdChyYXdGaWxlKTt9dmFyIGJlZm9yZT10aGlzLmJlZm9yZVVwbG9hZChyYXdGaWxlKTtpZihiZWZvcmUmJmJlZm9yZS50aGVuKXtiZWZvcmUudGhlbihmdW5jdGlvbihwcm9jZXNzZWRGaWxlKXt2YXIgZmlsZVR5cGU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHByb2Nlc3NlZEZpbGUpO2lmKGZpbGVUeXBlPT09J1tvYmplY3QgRmlsZV0nfHxmaWxlVHlwZT09PSdbb2JqZWN0IEJsb2JdJyl7aWYoZmlsZVR5cGU9PT0nW29iamVjdCBCbG9iXScpe3Byb2Nlc3NlZEZpbGU9bmV3IEZpbGUoW3Byb2Nlc3NlZEZpbGVdLHJhd0ZpbGUubmFtZSx7dHlwZTpyYXdGaWxlLnR5cGV9KTt9Zm9yKHZhciBwIGluIHJhd0ZpbGUpe2lmKHJhd0ZpbGUuaGFzT3duUHJvcGVydHkocCkpe3Byb2Nlc3NlZEZpbGVbcF09cmF3RmlsZVtwXTt9fV90aGlzMi5wb3N0KHByb2Nlc3NlZEZpbGUpO31lbHNle190aGlzMi5wb3N0KHJhd0ZpbGUpO319LGZ1bmN0aW9uKCl7X3RoaXMyLm9uUmVtb3ZlKG51bGwscmF3RmlsZSk7fSk7fWVsc2UgaWYoYmVmb3JlIT09ZmFsc2Upe3RoaXMucG9zdChyYXdGaWxlKTt9ZWxzZXt0aGlzLm9uUmVtb3ZlKG51bGwscmF3RmlsZSk7fX0sYWJvcnQ6ZnVuY3Rpb24gYWJvcnQoZmlsZSl7dmFyIHJlcXM9dGhpcy5yZXFzO2lmKGZpbGUpe3ZhciB1aWQ9ZmlsZTtpZihmaWxlLnVpZCl1aWQ9ZmlsZS51aWQ7aWYocmVxc1t1aWRdKXtyZXFzW3VpZF0uYWJvcnQoKTt9fWVsc2V7T2JqZWN0LmtleXMocmVxcykuZm9yRWFjaChmdW5jdGlvbih1aWQpe2lmKHJlcXNbdWlkXSlyZXFzW3VpZF0uYWJvcnQoKTtkZWxldGUgcmVxc1t1aWRdO30pO319LHBvc3Q6ZnVuY3Rpb24gcG9zdChyYXdGaWxlKXt2YXIgX3RoaXMzPXRoaXM7dmFyIHVpZD1yYXdGaWxlLnVpZDt2YXIgb3B0aW9ucz17aGVhZGVyczp0aGlzLmhlYWRlcnMsd2l0aENyZWRlbnRpYWxzOnRoaXMud2l0aENyZWRlbnRpYWxzLGZpbGU6cmF3RmlsZSxkYXRhOnRoaXMuZGF0YSxmaWxlbmFtZTp0aGlzLm5hbWUsYWN0aW9uOnRoaXMuYWN0aW9uLG9uUHJvZ3Jlc3M6ZnVuY3Rpb24gb25Qcm9ncmVzcyhlKXtfdGhpczMub25Qcm9ncmVzcyhlLHJhd0ZpbGUpO30sb25TdWNjZXNzOmZ1bmN0aW9uIG9uU3VjY2VzcyhyZXMpe190aGlzMy5vblN1Y2Nlc3MocmVzLHJhd0ZpbGUpO2RlbGV0ZSBfdGhpczMucmVxc1t1aWRdO30sb25FcnJvcjpmdW5jdGlvbiBvbkVycm9yKGVycil7X3RoaXMzLm9uRXJyb3IoZXJyLHJhd0ZpbGUpO2RlbGV0ZSBfdGhpczMucmVxc1t1aWRdO319O3ZhciByZXE9dGhpcy5odHRwUmVxdWVzdChvcHRpb25zKTt0aGlzLnJlcXNbdWlkXT1yZXE7aWYocmVxJiZyZXEudGhlbil7cmVxLnRoZW4ob3B0aW9ucy5vblN1Y2Nlc3Msb3B0aW9ucy5vbkVycm9yKTt9fSxoYW5kbGVDbGljazpmdW5jdGlvbiBoYW5kbGVDbGljaygpe2lmKCF0aGlzLmRpc2FibGVkKXt0aGlzLiRyZWZzLmlucHV0LnZhbHVlPW51bGw7dGhpcy4kcmVmcy5pbnB1dC5jbGljaygpO319LGhhbmRsZUtleWRvd246ZnVuY3Rpb24gaGFuZGxlS2V5ZG93bihlKXtpZihlLnRhcmdldCE9PWUuY3VycmVudFRhcmdldClyZXR1cm47aWYoZS5rZXlDb2RlPT09MTN8fGUua2V5Q29kZT09PTMyKXt0aGlzLmhhbmRsZUNsaWNrKCk7fX19LHJlbmRlcjpmdW5jdGlvbiByZW5kZXIoaCl7dmFyIGhhbmRsZUNsaWNrPXRoaXMuaGFuZGxlQ2xpY2ssZHJhZz10aGlzLmRyYWcsbmFtZT10aGlzLm5hbWUsaGFuZGxlQ2hhbmdlPXRoaXMuaGFuZGxlQ2hhbmdlLG11bHRpcGxlPXRoaXMubXVsdGlwbGUsYWNjZXB0PXRoaXMuYWNjZXB0LGxpc3RUeXBlPXRoaXMubGlzdFR5cGUsdXBsb2FkRmlsZXM9dGhpcy51cGxvYWRGaWxlcyxkaXNhYmxlZD10aGlzLmRpc2FibGVkLGhhbmRsZUtleWRvd249dGhpcy5oYW5kbGVLZXlkb3duO3ZhciBkYXRhPXtjbGFzczp7J2VsLXVwbG9hZCc6dHJ1ZX0sb246e2NsaWNrOmhhbmRsZUNsaWNrLGtleWRvd246aGFuZGxlS2V5ZG93bn19O2RhdGEuY2xhc3NbJ2VsLXVwbG9hZC0tJytsaXN0VHlwZV09dHJ1ZTtyZXR1cm4gaCgnZGl2JyxleHRlcm5hbF9iYWJlbF9oZWxwZXJfdnVlX2pzeF9tZXJnZV9wcm9wc19kZWZhdWx0KCkoW2RhdGEse2F0dHJzOnt0YWJpbmRleDonMCd9fV0pLFtkcmFnP2goJ3VwbG9hZC1kcmFnZ2VyJyx7YXR0cnM6e2Rpc2FibGVkOmRpc2FibGVkfSxvbjp7J2ZpbGUnOnVwbG9hZEZpbGVzfX0sW3RoaXMuJHNsb3RzLmRlZmF1bHRdKTp0aGlzLiRzbG90cy5kZWZhdWx0LGgoJ2lucHV0Jyx7J2NsYXNzJzonZWwtdXBsb2FkX19pbnB1dCcsYXR0cnM6e3R5cGU6J2ZpbGUnLG5hbWU6bmFtZSxtdWx0aXBsZTptdWx0aXBsZSxhY2NlcHQ6YWNjZXB0fSxyZWY6J2lucHV0Jyxvbjp7J2NoYW5nZSc6aGFuZGxlQ2hhbmdlfX0pXSk7fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy91cGxvYWQvc3JjL3VwbG9hZC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc3JjX3VwbG9hZHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz11cGxvYWR2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy91cGxvYWQvc3JjL3VwbG9hZC52dWUKdmFyIHVwbG9hZF9yZW5kZXIsdXBsb2FkX3N0YXRpY1JlbmRlckZuczsvKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIHVwbG9hZF9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHNyY191cGxvYWR2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sdXBsb2FkX3JlbmRlcix1cGxvYWRfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciB1cGxvYWRfYXBpO311cGxvYWRfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy91cGxvYWQvc3JjL3VwbG9hZC52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc3JjX3VwbG9hZD11cGxvYWRfY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvdXBsb2FkL3NyYy9pbmRleC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCmZ1bmN0aW9uIHNyY3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX25vb3AoKXt9LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmN2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e25hbWU6J0VsVXBsb2FkJyxtaXhpbnM6W21pZ3JhdGluZ19kZWZhdWx0LmFdLGNvbXBvbmVudHM6e0VsUHJvZ3Jlc3M6cHJvZ3Jlc3NfZGVmYXVsdC5hLFVwbG9hZExpc3Q6dXBsb2FkX2xpc3QsVXBsb2FkOnNyY191cGxvYWR9LHByb3ZpZGU6ZnVuY3Rpb24gcHJvdmlkZSgpe3JldHVybnt1cGxvYWRlcjp0aGlzfTt9LGluamVjdDp7ZWxGb3JtOntkZWZhdWx0OicnfX0scHJvcHM6e2FjdGlvbjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6dHJ1ZX0saGVhZGVyczp7dHlwZTpPYmplY3QsZGVmYXVsdDpmdW5jdGlvbiBfZGVmYXVsdCgpe3JldHVybnt9O319LGRhdGE6T2JqZWN0LG11bHRpcGxlOkJvb2xlYW4sbmFtZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDonZmlsZSd9LGRyYWc6Qm9vbGVhbixkcmFnZ2VyOkJvb2xlYW4sd2l0aENyZWRlbnRpYWxzOkJvb2xlYW4sc2hvd0ZpbGVMaXN0Ont0eXBlOkJvb2xlYW4sZGVmYXVsdDp0cnVlfSxhY2NlcHQ6U3RyaW5nLHR5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6J3NlbGVjdCd9LGJlZm9yZVVwbG9hZDpGdW5jdGlvbixiZWZvcmVSZW1vdmU6RnVuY3Rpb24sb25SZW1vdmU6e3R5cGU6RnVuY3Rpb24sZGVmYXVsdDpzcmN2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19ub29wfSxvbkNoYW5nZTp7dHlwZTpGdW5jdGlvbixkZWZhdWx0OnNyY3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX25vb3B9LG9uUHJldmlldzp7dHlwZTpGdW5jdGlvbn0sb25TdWNjZXNzOnt0eXBlOkZ1bmN0aW9uLGRlZmF1bHQ6c3JjdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfbm9vcH0sb25Qcm9ncmVzczp7dHlwZTpGdW5jdGlvbixkZWZhdWx0OnNyY3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX25vb3B9LG9uRXJyb3I6e3R5cGU6RnVuY3Rpb24sZGVmYXVsdDpzcmN2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19ub29wfSxmaWxlTGlzdDp7dHlwZTpBcnJheSxkZWZhdWx0OmZ1bmN0aW9uIF9kZWZhdWx0KCl7cmV0dXJuW107fX0sYXV0b1VwbG9hZDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6dHJ1ZX0sbGlzdFR5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6J3RleHQnLy8gdGV4dCxwaWN0dXJlLHBpY3R1cmUtY2FyZAp9LGh0dHBSZXF1ZXN0OkZ1bmN0aW9uLGRpc2FibGVkOkJvb2xlYW4sbGltaXQ6TnVtYmVyLG9uRXhjZWVkOnt0eXBlOkZ1bmN0aW9uLGRlZmF1bHQ6c3JjdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfbm9vcH19LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybnt1cGxvYWRGaWxlczpbXSxkcmFnT3ZlcjpmYWxzZSxkcmFnaW5nOmZhbHNlLHRlbXBJbmRleDoxfTt9LGNvbXB1dGVkOnt1cGxvYWREaXNhYmxlZDpmdW5jdGlvbiB1cGxvYWREaXNhYmxlZCgpe3JldHVybiB0aGlzLmRpc2FibGVkfHwodGhpcy5lbEZvcm18fHt9KS5kaXNhYmxlZDt9fSx3YXRjaDp7bGlzdFR5cGU6ZnVuY3Rpb24gbGlzdFR5cGUodHlwZSl7aWYodHlwZT09PSdwaWN0dXJlLWNhcmQnfHx0eXBlPT09J3BpY3R1cmUnKXt0aGlzLnVwbG9hZEZpbGVzPXRoaXMudXBsb2FkRmlsZXMubWFwKGZ1bmN0aW9uKGZpbGUpe2lmKCFmaWxlLnVybCYmZmlsZS5yYXcpe3RyeXtmaWxlLnVybD1VUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUucmF3KTt9Y2F0Y2goZXJyKXtjb25zb2xlLmVycm9yKCdbRWxlbWVudCBFcnJvcl1bVXBsb2FkXScsZXJyKTt9fXJldHVybiBmaWxlO30pO319LGZpbGVMaXN0OntpbW1lZGlhdGU6dHJ1ZSxoYW5kbGVyOmZ1bmN0aW9uIGhhbmRsZXIoZmlsZUxpc3Qpe3ZhciBfdGhpcz10aGlzO3RoaXMudXBsb2FkRmlsZXM9ZmlsZUxpc3QubWFwKGZ1bmN0aW9uKGl0ZW0pe2l0ZW0udWlkPWl0ZW0udWlkfHxEYXRlLm5vdygpK190aGlzLnRlbXBJbmRleCsrO2l0ZW0uc3RhdHVzPWl0ZW0uc3RhdHVzfHwnc3VjY2Vzcyc7cmV0dXJuIGl0ZW07fSk7fX19LG1ldGhvZHM6e2hhbmRsZVN0YXJ0OmZ1bmN0aW9uIGhhbmRsZVN0YXJ0KHJhd0ZpbGUpe3Jhd0ZpbGUudWlkPURhdGUubm93KCkrdGhpcy50ZW1wSW5kZXgrKzt2YXIgZmlsZT17c3RhdHVzOidyZWFkeScsbmFtZTpyYXdGaWxlLm5hbWUsc2l6ZTpyYXdGaWxlLnNpemUscGVyY2VudGFnZTowLHVpZDpyYXdGaWxlLnVpZCxyYXc6cmF3RmlsZX07aWYodGhpcy5saXN0VHlwZT09PSdwaWN0dXJlLWNhcmQnfHx0aGlzLmxpc3RUeXBlPT09J3BpY3R1cmUnKXt0cnl7ZmlsZS51cmw9VVJMLmNyZWF0ZU9iamVjdFVSTChyYXdGaWxlKTt9Y2F0Y2goZXJyKXtjb25zb2xlLmVycm9yKCdbRWxlbWVudCBFcnJvcl1bVXBsb2FkXScsZXJyKTtyZXR1cm47fX10aGlzLnVwbG9hZEZpbGVzLnB1c2goZmlsZSk7dGhpcy5vbkNoYW5nZShmaWxlLHRoaXMudXBsb2FkRmlsZXMpO30saGFuZGxlUHJvZ3Jlc3M6ZnVuY3Rpb24gaGFuZGxlUHJvZ3Jlc3MoZXYscmF3RmlsZSl7dmFyIGZpbGU9dGhpcy5nZXRGaWxlKHJhd0ZpbGUpO3RoaXMub25Qcm9ncmVzcyhldixmaWxlLHRoaXMudXBsb2FkRmlsZXMpO2ZpbGUuc3RhdHVzPSd1cGxvYWRpbmcnO2ZpbGUucGVyY2VudGFnZT1ldi5wZXJjZW50fHwwO30saGFuZGxlU3VjY2VzczpmdW5jdGlvbiBoYW5kbGVTdWNjZXNzKHJlcyxyYXdGaWxlKXt2YXIgZmlsZT10aGlzLmdldEZpbGUocmF3RmlsZSk7aWYoZmlsZSl7ZmlsZS5zdGF0dXM9J3N1Y2Nlc3MnO2ZpbGUucmVzcG9uc2U9cmVzO3RoaXMub25TdWNjZXNzKHJlcyxmaWxlLHRoaXMudXBsb2FkRmlsZXMpO3RoaXMub25DaGFuZ2UoZmlsZSx0aGlzLnVwbG9hZEZpbGVzKTt9fSxoYW5kbGVFcnJvcjpmdW5jdGlvbiBoYW5kbGVFcnJvcihlcnIscmF3RmlsZSl7dmFyIGZpbGU9dGhpcy5nZXRGaWxlKHJhd0ZpbGUpO3ZhciBmaWxlTGlzdD10aGlzLnVwbG9hZEZpbGVzO2ZpbGUuc3RhdHVzPSdmYWlsJztmaWxlTGlzdC5zcGxpY2UoZmlsZUxpc3QuaW5kZXhPZihmaWxlKSwxKTt0aGlzLm9uRXJyb3IoZXJyLGZpbGUsdGhpcy51cGxvYWRGaWxlcyk7dGhpcy5vbkNoYW5nZShmaWxlLHRoaXMudXBsb2FkRmlsZXMpO30saGFuZGxlUmVtb3ZlOmZ1bmN0aW9uIGhhbmRsZVJlbW92ZShmaWxlLHJhdyl7dmFyIF90aGlzMj10aGlzO2lmKHJhdyl7ZmlsZT10aGlzLmdldEZpbGUocmF3KTt9dmFyIGRvUmVtb3ZlPWZ1bmN0aW9uIGRvUmVtb3ZlKCl7X3RoaXMyLmFib3J0KGZpbGUpO3ZhciBmaWxlTGlzdD1fdGhpczIudXBsb2FkRmlsZXM7ZmlsZUxpc3Quc3BsaWNlKGZpbGVMaXN0LmluZGV4T2YoZmlsZSksMSk7X3RoaXMyLm9uUmVtb3ZlKGZpbGUsZmlsZUxpc3QpO307aWYoIXRoaXMuYmVmb3JlUmVtb3ZlKXtkb1JlbW92ZSgpO31lbHNlIGlmKHR5cGVvZiB0aGlzLmJlZm9yZVJlbW92ZT09PSdmdW5jdGlvbicpe3ZhciBiZWZvcmU9dGhpcy5iZWZvcmVSZW1vdmUoZmlsZSx0aGlzLnVwbG9hZEZpbGVzKTtpZihiZWZvcmUmJmJlZm9yZS50aGVuKXtiZWZvcmUudGhlbihmdW5jdGlvbigpe2RvUmVtb3ZlKCk7fSxzcmN2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19ub29wKTt9ZWxzZSBpZihiZWZvcmUhPT1mYWxzZSl7ZG9SZW1vdmUoKTt9fX0sZ2V0RmlsZTpmdW5jdGlvbiBnZXRGaWxlKHJhd0ZpbGUpe3ZhciBmaWxlTGlzdD10aGlzLnVwbG9hZEZpbGVzO3ZhciB0YXJnZXQ9dm9pZCAwO2ZpbGVMaXN0LmV2ZXJ5KGZ1bmN0aW9uKGl0ZW0pe3RhcmdldD1yYXdGaWxlLnVpZD09PWl0ZW0udWlkP2l0ZW06bnVsbDtyZXR1cm4hdGFyZ2V0O30pO3JldHVybiB0YXJnZXQ7fSxhYm9ydDpmdW5jdGlvbiBhYm9ydChmaWxlKXt0aGlzLiRyZWZzWyd1cGxvYWQtaW5uZXInXS5hYm9ydChmaWxlKTt9LGNsZWFyRmlsZXM6ZnVuY3Rpb24gY2xlYXJGaWxlcygpe3RoaXMudXBsb2FkRmlsZXM9W107fSxzdWJtaXQ6ZnVuY3Rpb24gc3VibWl0KCl7dmFyIF90aGlzMz10aGlzO3RoaXMudXBsb2FkRmlsZXMuZmlsdGVyKGZ1bmN0aW9uKGZpbGUpe3JldHVybiBmaWxlLnN0YXR1cz09PSdyZWFkeSc7fSkuZm9yRWFjaChmdW5jdGlvbihmaWxlKXtfdGhpczMuJHJlZnNbJ3VwbG9hZC1pbm5lciddLnVwbG9hZChmaWxlLnJhdyk7fSk7fSxnZXRNaWdyYXRpbmdDb25maWc6ZnVuY3Rpb24gZ2V0TWlncmF0aW5nQ29uZmlnKCl7cmV0dXJue3Byb3BzOnsnZGVmYXVsdC1maWxlLWxpc3QnOidkZWZhdWx0LWZpbGUtbGlzdCBpcyByZW5hbWVkIHRvIGZpbGUtbGlzdC4nLCdzaG93LXVwbG9hZC1saXN0Jzonc2hvdy11cGxvYWQtbGlzdCBpcyByZW5hbWVkIHRvIHNob3ctZmlsZS1saXN0LicsJ3RodW1ibmFpbC1tb2RlJzondGh1bWJuYWlsLW1vZGUgaGFzIGJlZW4gZGVwcmVjYXRlZCwgeW91IGNhbiBpbXBsZW1lbnQgdGhlIHNhbWUgZWZmZWN0IGFjY29yZGluZyB0byB0aGlzIGNhc2U6IGh0dHA6Ly9lbGVtZW50LmVsZW1lLmlvLyMvemgtQ04vY29tcG9uZW50L3VwbG9hZCN5b25nLWh1LXRvdS14aWFuZy1zaGFuZy1jaHVhbid9fTt9fSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKXt0aGlzLnVwbG9hZEZpbGVzLmZvckVhY2goZnVuY3Rpb24oZmlsZSl7aWYoZmlsZS51cmwmJmZpbGUudXJsLmluZGV4T2YoJ2Jsb2I6Jyk9PT0wKXtVUkwucmV2b2tlT2JqZWN0VVJMKGZpbGUudXJsKTt9fSk7fSxyZW5kZXI6ZnVuY3Rpb24gcmVuZGVyKGgpe3ZhciBfdGhpczQ9dGhpczt2YXIgdXBsb2FkTGlzdD12b2lkIDA7aWYodGhpcy5zaG93RmlsZUxpc3Qpe3VwbG9hZExpc3Q9aCh1cGxvYWRfbGlzdCx7YXR0cnM6e2Rpc2FibGVkOnRoaXMudXBsb2FkRGlzYWJsZWQsbGlzdFR5cGU6dGhpcy5saXN0VHlwZSxmaWxlczp0aGlzLnVwbG9hZEZpbGVzLGhhbmRsZVByZXZpZXc6dGhpcy5vblByZXZpZXd9LG9uOnsncmVtb3ZlJzp0aGlzLmhhbmRsZVJlbW92ZX19LFtmdW5jdGlvbihwcm9wcyl7aWYoX3RoaXM0LiRzY29wZWRTbG90cy5maWxlKXtyZXR1cm4gX3RoaXM0LiRzY29wZWRTbG90cy5maWxlKHtmaWxlOnByb3BzLmZpbGV9KTt9fV0pO312YXIgdXBsb2FkRGF0YT17cHJvcHM6e3R5cGU6dGhpcy50eXBlLGRyYWc6dGhpcy5kcmFnLGFjdGlvbjp0aGlzLmFjdGlvbixtdWx0aXBsZTp0aGlzLm11bHRpcGxlLCdiZWZvcmUtdXBsb2FkJzp0aGlzLmJlZm9yZVVwbG9hZCwnd2l0aC1jcmVkZW50aWFscyc6dGhpcy53aXRoQ3JlZGVudGlhbHMsaGVhZGVyczp0aGlzLmhlYWRlcnMsbmFtZTp0aGlzLm5hbWUsZGF0YTp0aGlzLmRhdGEsYWNjZXB0OnRoaXMuYWNjZXB0LGZpbGVMaXN0OnRoaXMudXBsb2FkRmlsZXMsYXV0b1VwbG9hZDp0aGlzLmF1dG9VcGxvYWQsbGlzdFR5cGU6dGhpcy5saXN0VHlwZSxkaXNhYmxlZDp0aGlzLnVwbG9hZERpc2FibGVkLGxpbWl0OnRoaXMubGltaXQsJ29uLWV4Y2VlZCc6dGhpcy5vbkV4Y2VlZCwnb24tc3RhcnQnOnRoaXMuaGFuZGxlU3RhcnQsJ29uLXByb2dyZXNzJzp0aGlzLmhhbmRsZVByb2dyZXNzLCdvbi1zdWNjZXNzJzp0aGlzLmhhbmRsZVN1Y2Nlc3MsJ29uLWVycm9yJzp0aGlzLmhhbmRsZUVycm9yLCdvbi1wcmV2aWV3Jzp0aGlzLm9uUHJldmlldywnb24tcmVtb3ZlJzp0aGlzLmhhbmRsZVJlbW92ZSwnaHR0cC1yZXF1ZXN0Jzp0aGlzLmh0dHBSZXF1ZXN0fSxyZWY6J3VwbG9hZC1pbm5lcid9O3ZhciB0cmlnZ2VyPXRoaXMuJHNsb3RzLnRyaWdnZXJ8fHRoaXMuJHNsb3RzLmRlZmF1bHQ7dmFyIHVwbG9hZENvbXBvbmVudD1oKCd1cGxvYWQnLHVwbG9hZERhdGEsW3RyaWdnZXJdKTtyZXR1cm4gaCgnZGl2JyxbdGhpcy5saXN0VHlwZT09PSdwaWN0dXJlLWNhcmQnP3VwbG9hZExpc3Q6JycsdGhpcy4kc2xvdHMudHJpZ2dlcj9bdXBsb2FkQ29tcG9uZW50LHRoaXMuJHNsb3RzLmRlZmF1bHRdOnVwbG9hZENvbXBvbmVudCx0aGlzLiRzbG90cy50aXAsdGhpcy5saXN0VHlwZSE9PSdwaWN0dXJlLWNhcmQnP3VwbG9hZExpc3Q6JyddKTt9fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3VwbG9hZC9zcmMvaW5kZXgudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHVwbG9hZF9zcmN2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189c3JjdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdXBsb2FkL3NyYy9pbmRleC52dWUKdmFyIHNyY19yZW5kZXIsc3JjX3N0YXRpY1JlbmRlckZuczsvKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIHVwbG9hZF9zcmNfY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudCh1cGxvYWRfc3JjdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLHNyY19yZW5kZXIsc3JjX3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgc3JjX2FwaTt9dXBsb2FkX3NyY19jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL3VwbG9hZC9zcmMvaW5kZXgudnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHVwbG9hZF9zcmM9dXBsb2FkX3NyY19jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3VwbG9hZC9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL3VwbG9hZF9zcmMuaW5zdGFsbD1mdW5jdGlvbihWdWUpe1Z1ZS5jb21wb25lbnQodXBsb2FkX3NyYy5uYW1lLHVwbG9hZF9zcmMpO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYWNrYWdlc191cGxvYWQ9dXBsb2FkX3NyYzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3Byb2dyZXNzL3NyYy9wcm9ncmVzcy52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MjI5ZWU0MDYmCnZhciBwcm9ncmVzc3Z1ZV90eXBlX3RlbXBsYXRlX2lkXzIyOWVlNDA2X3JlbmRlcj1mdW5jdGlvbiBwcm9ncmVzc3Z1ZV90eXBlX3RlbXBsYXRlX2lkXzIyOWVlNDA2X3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXByb2dyZXNzIixjbGFzczpbImVsLXByb2dyZXNzLS0iK192bS50eXBlLF92bS5zdGF0dXM/ImlzLSIrX3ZtLnN0YXR1czoiIix7ImVsLXByb2dyZXNzLS13aXRob3V0LXRleHQiOiFfdm0uc2hvd1RleHQsImVsLXByb2dyZXNzLS10ZXh0LWluc2lkZSI6X3ZtLnRleHRJbnNpZGV9XSxhdHRyczp7cm9sZToicHJvZ3Jlc3NiYXIiLCJhcmlhLXZhbHVlbm93Ijpfdm0ucGVyY2VudGFnZSwiYXJpYS12YWx1ZW1pbiI6IjAiLCJhcmlhLXZhbHVlbWF4IjoiMTAwIn19LFtfdm0udHlwZT09PSJsaW5lIj9fYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXByb2dyZXNzLWJhciJ9LFtfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXByb2dyZXNzLWJhcl9fb3V0ZXIiLHN0eWxlOntoZWlnaHQ6X3ZtLnN0cm9rZVdpZHRoKyJweCJ9fSxbX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1wcm9ncmVzcy1iYXJfX2lubmVyIixzdHlsZTpfdm0uYmFyU3R5bGV9LFtfdm0uc2hvd1RleHQmJl92bS50ZXh0SW5zaWRlP19jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtcHJvZ3Jlc3MtYmFyX19pbm5lclRleHQifSxbX3ZtLl92KF92bS5fcyhfdm0uY29udGVudCkpXSk6X3ZtLl9lKCldKV0pXSk6X2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1wcm9ncmVzcy1jaXJjbGUiLHN0eWxlOntoZWlnaHQ6X3ZtLndpZHRoKyJweCIsd2lkdGg6X3ZtLndpZHRoKyJweCJ9fSxbX2MoInN2ZyIse2F0dHJzOnt2aWV3Qm94OiIwIDAgMTAwIDEwMCJ9fSxbX2MoInBhdGgiLHtzdGF0aWNDbGFzczoiZWwtcHJvZ3Jlc3MtY2lyY2xlX190cmFjayIsc3R5bGU6X3ZtLnRyYWlsUGF0aFN0eWxlLGF0dHJzOntkOl92bS50cmFja1BhdGgsc3Ryb2tlOiIjZTVlOWYyIiwic3Ryb2tlLXdpZHRoIjpfdm0ucmVsYXRpdmVTdHJva2VXaWR0aCxmaWxsOiJub25lIn19KSxfYygicGF0aCIse3N0YXRpY0NsYXNzOiJlbC1wcm9ncmVzcy1jaXJjbGVfX3BhdGgiLHN0eWxlOl92bS5jaXJjbGVQYXRoU3R5bGUsYXR0cnM6e2Q6X3ZtLnRyYWNrUGF0aCxzdHJva2U6X3ZtLnN0cm9rZSxmaWxsOiJub25lIiwic3Ryb2tlLWxpbmVjYXAiOl92bS5zdHJva2VMaW5lY2FwLCJzdHJva2Utd2lkdGgiOl92bS5wZXJjZW50YWdlP192bS5yZWxhdGl2ZVN0cm9rZVdpZHRoOjB9fSldKV0pLF92bS5zaG93VGV4dCYmIV92bS50ZXh0SW5zaWRlP19jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtcHJvZ3Jlc3NfX3RleHQiLHN0eWxlOntmb250U2l6ZTpfdm0ucHJvZ3Jlc3NUZXh0U2l6ZSsicHgifX0sWyFfdm0uc3RhdHVzP1tfdm0uX3YoX3ZtLl9zKF92bS5jb250ZW50KSldOl9jKCJpIix7Y2xhc3M6X3ZtLmljb25DbGFzc30pXSwyKTpfdm0uX2UoKV0pO307dmFyIHByb2dyZXNzdnVlX3R5cGVfdGVtcGxhdGVfaWRfMjI5ZWU0MDZfc3RhdGljUmVuZGVyRm5zPVtdO3Byb2dyZXNzdnVlX3R5cGVfdGVtcGxhdGVfaWRfMjI5ZWU0MDZfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3Byb2dyZXNzL3NyYy9wcm9ncmVzcy52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MjI5ZWU0MDYmCi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3Byb2dyZXNzL3NyYy9wcm9ncmVzcy52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcHJvZ3Jlc3N2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e25hbWU6J0VsUHJvZ3Jlc3MnLHByb3BzOnt0eXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OidsaW5lJyx2YWxpZGF0b3I6ZnVuY3Rpb24gdmFsaWRhdG9yKHZhbCl7cmV0dXJuWydsaW5lJywnY2lyY2xlJywnZGFzaGJvYXJkJ10uaW5kZXhPZih2YWwpPi0xO319LHBlcmNlbnRhZ2U6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MCxyZXF1aXJlZDp0cnVlLHZhbGlkYXRvcjpmdW5jdGlvbiB2YWxpZGF0b3IodmFsKXtyZXR1cm4gdmFsPj0wJiZ2YWw8PTEwMDt9fSxzdGF0dXM6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbiB2YWxpZGF0b3IodmFsKXtyZXR1cm5bJ3N1Y2Nlc3MnLCdleGNlcHRpb24nLCd3YXJuaW5nJ10uaW5kZXhPZih2YWwpPi0xO319LHN0cm9rZVdpZHRoOnt0eXBlOk51bWJlcixkZWZhdWx0OjZ9LHN0cm9rZUxpbmVjYXA6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6J3JvdW5kJ30sdGV4dEluc2lkZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ZmFsc2V9LHdpZHRoOnt0eXBlOk51bWJlcixkZWZhdWx0OjEyNn0sc2hvd1RleHQ6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OnRydWV9LGNvbG9yOnt0eXBlOltTdHJpbmcsQXJyYXksRnVuY3Rpb25dLGRlZmF1bHQ6Jyd9LGZvcm1hdDpGdW5jdGlvbn0sY29tcHV0ZWQ6e2JhclN0eWxlOmZ1bmN0aW9uIGJhclN0eWxlKCl7dmFyIHN0eWxlPXt9O3N0eWxlLndpZHRoPXRoaXMucGVyY2VudGFnZSsnJSc7c3R5bGUuYmFja2dyb3VuZENvbG9yPXRoaXMuZ2V0Q3VycmVudENvbG9yKHRoaXMucGVyY2VudGFnZSk7cmV0dXJuIHN0eWxlO30scmVsYXRpdmVTdHJva2VXaWR0aDpmdW5jdGlvbiByZWxhdGl2ZVN0cm9rZVdpZHRoKCl7cmV0dXJuKHRoaXMuc3Ryb2tlV2lkdGgvdGhpcy53aWR0aCoxMDApLnRvRml4ZWQoMSk7fSxyYWRpdXM6ZnVuY3Rpb24gcmFkaXVzKCl7aWYodGhpcy50eXBlPT09J2NpcmNsZSd8fHRoaXMudHlwZT09PSdkYXNoYm9hcmQnKXtyZXR1cm4gcGFyc2VJbnQoNTAtcGFyc2VGbG9hdCh0aGlzLnJlbGF0aXZlU3Ryb2tlV2lkdGgpLzIsMTApO31lbHNle3JldHVybiAwO319LHRyYWNrUGF0aDpmdW5jdGlvbiB0cmFja1BhdGgoKXt2YXIgcmFkaXVzPXRoaXMucmFkaXVzO3ZhciBpc0Rhc2hib2FyZD10aGlzLnR5cGU9PT0nZGFzaGJvYXJkJztyZXR1cm4nXG4gICAgICAgIE0gNTAgNTBcbiAgICAgICAgbSAwICcrKGlzRGFzaGJvYXJkPycnOictJykrcmFkaXVzKydcbiAgICAgICAgYSAnK3JhZGl1cysnICcrcmFkaXVzKycgMCAxIDEgMCAnKyhpc0Rhc2hib2FyZD8nLSc6JycpK3JhZGl1cyoyKydcbiAgICAgICAgYSAnK3JhZGl1cysnICcrcmFkaXVzKycgMCAxIDEgMCAnKyhpc0Rhc2hib2FyZD8nJzonLScpK3JhZGl1cyoyKydcbiAgICAgICAgJzt9LHBlcmltZXRlcjpmdW5jdGlvbiBwZXJpbWV0ZXIoKXtyZXR1cm4gMipNYXRoLlBJKnRoaXMucmFkaXVzO30scmF0ZTpmdW5jdGlvbiByYXRlKCl7cmV0dXJuIHRoaXMudHlwZT09PSdkYXNoYm9hcmQnPzAuNzU6MTt9LHN0cm9rZURhc2hvZmZzZXQ6ZnVuY3Rpb24gc3Ryb2tlRGFzaG9mZnNldCgpe3ZhciBvZmZzZXQ9LTEqdGhpcy5wZXJpbWV0ZXIqKDEtdGhpcy5yYXRlKS8yO3JldHVybiBvZmZzZXQrJ3B4Jzt9LHRyYWlsUGF0aFN0eWxlOmZ1bmN0aW9uIHRyYWlsUGF0aFN0eWxlKCl7cmV0dXJue3N0cm9rZURhc2hhcnJheTp0aGlzLnBlcmltZXRlcip0aGlzLnJhdGUrJ3B4LCAnK3RoaXMucGVyaW1ldGVyKydweCcsc3Ryb2tlRGFzaG9mZnNldDp0aGlzLnN0cm9rZURhc2hvZmZzZXR9O30sY2lyY2xlUGF0aFN0eWxlOmZ1bmN0aW9uIGNpcmNsZVBhdGhTdHlsZSgpe3JldHVybntzdHJva2VEYXNoYXJyYXk6dGhpcy5wZXJpbWV0ZXIqdGhpcy5yYXRlKih0aGlzLnBlcmNlbnRhZ2UvMTAwKSsncHgsICcrdGhpcy5wZXJpbWV0ZXIrJ3B4JyxzdHJva2VEYXNob2Zmc2V0OnRoaXMuc3Ryb2tlRGFzaG9mZnNldCx0cmFuc2l0aW9uOidzdHJva2UtZGFzaGFycmF5IDAuNnMgZWFzZSAwcywgc3Ryb2tlIDAuNnMgZWFzZSd9O30sc3Ryb2tlOmZ1bmN0aW9uIHN0cm9rZSgpe3ZhciByZXQ9dm9pZCAwO2lmKHRoaXMuY29sb3Ipe3JldD10aGlzLmdldEN1cnJlbnRDb2xvcih0aGlzLnBlcmNlbnRhZ2UpO31lbHNle3N3aXRjaCh0aGlzLnN0YXR1cyl7Y2FzZSdzdWNjZXNzJzpyZXQ9JyMxM2NlNjYnO2JyZWFrO2Nhc2UnZXhjZXB0aW9uJzpyZXQ9JyNmZjQ5NDknO2JyZWFrO2Nhc2Und2FybmluZyc6cmV0PScjZTZhMjNjJzticmVhaztkZWZhdWx0OnJldD0nIzIwYTBmZic7fX1yZXR1cm4gcmV0O30saWNvbkNsYXNzOmZ1bmN0aW9uIGljb25DbGFzcygpe2lmKHRoaXMuc3RhdHVzPT09J3dhcm5pbmcnKXtyZXR1cm4nZWwtaWNvbi13YXJuaW5nJzt9aWYodGhpcy50eXBlPT09J2xpbmUnKXtyZXR1cm4gdGhpcy5zdGF0dXM9PT0nc3VjY2Vzcyc/J2VsLWljb24tY2lyY2xlLWNoZWNrJzonZWwtaWNvbi1jaXJjbGUtY2xvc2UnO31lbHNle3JldHVybiB0aGlzLnN0YXR1cz09PSdzdWNjZXNzJz8nZWwtaWNvbi1jaGVjayc6J2VsLWljb24tY2xvc2UnO319LHByb2dyZXNzVGV4dFNpemU6ZnVuY3Rpb24gcHJvZ3Jlc3NUZXh0U2l6ZSgpe3JldHVybiB0aGlzLnR5cGU9PT0nbGluZSc/MTIrdGhpcy5zdHJva2VXaWR0aCowLjQ6dGhpcy53aWR0aCowLjExMTExMSsyO30sY29udGVudDpmdW5jdGlvbiBjb250ZW50KCl7aWYodHlwZW9mIHRoaXMuZm9ybWF0PT09J2Z1bmN0aW9uJyl7cmV0dXJuIHRoaXMuZm9ybWF0KHRoaXMucGVyY2VudGFnZSl8fCcnO31lbHNle3JldHVybiB0aGlzLnBlcmNlbnRhZ2UrJyUnO319fSxtZXRob2RzOntnZXRDdXJyZW50Q29sb3I6ZnVuY3Rpb24gZ2V0Q3VycmVudENvbG9yKHBlcmNlbnRhZ2Upe2lmKHR5cGVvZiB0aGlzLmNvbG9yPT09J2Z1bmN0aW9uJyl7cmV0dXJuIHRoaXMuY29sb3IocGVyY2VudGFnZSk7fWVsc2UgaWYodHlwZW9mIHRoaXMuY29sb3I9PT0nc3RyaW5nJyl7cmV0dXJuIHRoaXMuY29sb3I7fWVsc2V7cmV0dXJuIHRoaXMuZ2V0TGV2ZWxDb2xvcihwZXJjZW50YWdlKTt9fSxnZXRMZXZlbENvbG9yOmZ1bmN0aW9uIGdldExldmVsQ29sb3IocGVyY2VudGFnZSl7dmFyIGNvbG9yQXJyYXk9dGhpcy5nZXRDb2xvckFycmF5KCkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLnBlcmNlbnRhZ2UtYi5wZXJjZW50YWdlO30pO2Zvcih2YXIgaT0wO2k8Y29sb3JBcnJheS5sZW5ndGg7aSsrKXtpZihjb2xvckFycmF5W2ldLnBlcmNlbnRhZ2U+cGVyY2VudGFnZSl7cmV0dXJuIGNvbG9yQXJyYXlbaV0uY29sb3I7fX1yZXR1cm4gY29sb3JBcnJheVtjb2xvckFycmF5Lmxlbmd0aC0xXS5jb2xvcjt9LGdldENvbG9yQXJyYXk6ZnVuY3Rpb24gZ2V0Q29sb3JBcnJheSgpe3ZhciBjb2xvcj10aGlzLmNvbG9yO3ZhciBzcGFuPTEwMC9jb2xvci5sZW5ndGg7cmV0dXJuIGNvbG9yLm1hcChmdW5jdGlvbihzZXJpZXNDb2xvcixpbmRleCl7aWYodHlwZW9mIHNlcmllc0NvbG9yPT09J3N0cmluZycpe3JldHVybntjb2xvcjpzZXJpZXNDb2xvcixwZXJjZW50YWdlOihpbmRleCsxKSpzcGFufTt9cmV0dXJuIHNlcmllc0NvbG9yO30pO319fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3Byb2dyZXNzL3NyYy9wcm9ncmVzcy52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc3JjX3Byb2dyZXNzdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXByb2dyZXNzdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcHJvZ3Jlc3Mvc3JjL3Byb2dyZXNzLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIHByb2dyZXNzX2NvbXBvbmVudD1ub3JtYWxpemVDb21wb25lbnQoc3JjX3Byb2dyZXNzdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLHByb2dyZXNzdnVlX3R5cGVfdGVtcGxhdGVfaWRfMjI5ZWU0MDZfcmVuZGVyLHByb2dyZXNzdnVlX3R5cGVfdGVtcGxhdGVfaWRfMjI5ZWU0MDZfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciBwcm9ncmVzc19hcGk7fXByb2dyZXNzX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvcHJvZ3Jlc3Mvc3JjL3Byb2dyZXNzLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwcm9ncmVzcz1wcm9ncmVzc19jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3Byb2dyZXNzL2luZGV4LmpzCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovcHJvZ3Jlc3MuaW5zdGFsbD1mdW5jdGlvbihWdWUpe1Z1ZS5jb21wb25lbnQocHJvZ3Jlc3MubmFtZSxwcm9ncmVzcyk7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX3Byb2dyZXNzPXByb2dyZXNzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvc3Bpbm5lci9zcmMvc3Bpbm5lci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9Njk3Yjg1MzgmCnZhciBzcGlubmVydnVlX3R5cGVfdGVtcGxhdGVfaWRfNjk3Yjg1MzhfcmVuZGVyPWZ1bmN0aW9uIHNwaW5uZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF82OTdiODUzOF9yZW5kZXIoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDt2YXIgX2M9X3ZtLl9zZWxmLl9jfHxfaDtyZXR1cm4gX2MoInNwYW4iLHtzdGF0aWNDbGFzczoiZWwtc3Bpbm5lciJ9LFtfYygic3ZnIix7c3RhdGljQ2xhc3M6ImVsLXNwaW5uZXItaW5uZXIiLHN0eWxlOnt3aWR0aDpfdm0ucmFkaXVzLzIrInB4IixoZWlnaHQ6X3ZtLnJhZGl1cy8yKyJweCJ9LGF0dHJzOnt2aWV3Qm94OiIwIDAgNTAgNTAifX0sW19jKCJjaXJjbGUiLHtzdGF0aWNDbGFzczoicGF0aCIsYXR0cnM6e2N4OiIyNSIsY3k6IjI1IixyOiIyMCIsZmlsbDoibm9uZSIsc3Ryb2tlOl92bS5zdHJva2VDb2xvciwic3Ryb2tlLXdpZHRoIjpfdm0uc3Ryb2tlV2lkdGh9fSldKV0pO307dmFyIHNwaW5uZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF82OTdiODUzOF9zdGF0aWNSZW5kZXJGbnM9W107c3Bpbm5lcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzY5N2I4NTM4X3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zcGlubmVyL3NyYy9zcGlubmVyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD02OTdiODUzOCYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvc3Bpbm5lci9zcmMvc3Bpbm5lci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc3Bpbm5lcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17bmFtZTonRWxTcGlubmVyJyxwcm9wczp7dHlwZTpTdHJpbmcscmFkaXVzOnt0eXBlOk51bWJlcixkZWZhdWx0OjEwMH0sc3Ryb2tlV2lkdGg6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6NX0sc3Ryb2tlQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6JyNlZmVmZWYnfX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc3Bpbm5lci9zcmMvc3Bpbm5lci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc3JjX3NwaW5uZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189c3Bpbm5lcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NwaW5uZXIvc3JjL3NwaW5uZXIudnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgc3Bpbm5lcl9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHNyY19zcGlubmVydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLHNwaW5uZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF82OTdiODUzOF9yZW5kZXIsc3Bpbm5lcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzY5N2I4NTM4X3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgc3Bpbm5lcl9hcGk7fXNwaW5uZXJfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy9zcGlubmVyL3NyYy9zcGlubmVyLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcGlubmVyPXNwaW5uZXJfY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zcGlubmVyL2luZGV4LmpzCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovc3Bpbm5lci5pbnN0YWxsPWZ1bmN0aW9uKFZ1ZSl7VnVlLmNvbXBvbmVudChzcGlubmVyLm5hbWUsc3Bpbm5lcik7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX3NwaW5uZXI9c3Bpbm5lcjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL21lc3NhZ2Uvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTQ1NWI5ZjYwJgp2YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQ1NWI5ZjYwX3JlbmRlcj1mdW5jdGlvbiBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNDU1YjlmNjBfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJ0cmFuc2l0aW9uIix7YXR0cnM6e25hbWU6ImVsLW1lc3NhZ2UtZmFkZSJ9LG9uOnsiYWZ0ZXItbGVhdmUiOl92bS5oYW5kbGVBZnRlckxlYXZlfX0sW19jKCJkaXYiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTpfdm0udmlzaWJsZSxleHByZXNzaW9uOiJ2aXNpYmxlIn1dLGNsYXNzOlsiZWwtbWVzc2FnZSIsX3ZtLnR5cGUmJiFfdm0uaWNvbkNsYXNzPyJlbC1tZXNzYWdlLS0iK192bS50eXBlOiIiLF92bS5jZW50ZXI/ImlzLWNlbnRlciI6IiIsX3ZtLnNob3dDbG9zZT8iaXMtY2xvc2FibGUiOiIiLF92bS5jdXN0b21DbGFzc10sc3R5bGU6X3ZtLnBvc2l0aW9uU3R5bGUsYXR0cnM6e3JvbGU6ImFsZXJ0In0sb246e21vdXNlZW50ZXI6X3ZtLmNsZWFyVGltZXIsbW91c2VsZWF2ZTpfdm0uc3RhcnRUaW1lcn19LFtfdm0uaWNvbkNsYXNzP19jKCJpIix7Y2xhc3M6X3ZtLmljb25DbGFzc30pOl9jKCJpIix7Y2xhc3M6X3ZtLnR5cGVDbGFzc30pLF92bS5fdCgiZGVmYXVsdCIsWyFfdm0uZGFuZ2Vyb3VzbHlVc2VIVE1MU3RyaW5nP19jKCJwIix7c3RhdGljQ2xhc3M6ImVsLW1lc3NhZ2VfX2NvbnRlbnQifSxbX3ZtLl92KF92bS5fcyhfdm0ubWVzc2FnZSkpXSk6X2MoInAiLHtzdGF0aWNDbGFzczoiZWwtbWVzc2FnZV9fY29udGVudCIsZG9tUHJvcHM6e2lubmVySFRNTDpfdm0uX3MoX3ZtLm1lc3NhZ2UpfX0pXSksX3ZtLnNob3dDbG9zZT9fYygiaSIse3N0YXRpY0NsYXNzOiJlbC1tZXNzYWdlX19jbG9zZUJ0biBlbC1pY29uLWNsb3NlIixvbjp7Y2xpY2s6X3ZtLmNsb3NlfX0pOl92bS5fZSgpXSwyKV0pO307dmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF80NTViOWY2MF9zdGF0aWNSZW5kZXJGbnM9W107bWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQ1NWI5ZjYwX3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9tZXNzYWdlL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD00NTViOWY2MCYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvbWVzc2FnZS9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCnZhciBzcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX3R5cGVNYXA9e3N1Y2Nlc3M6J3N1Y2Nlc3MnLGluZm86J2luZm8nLHdhcm5pbmc6J3dhcm5pbmcnLGVycm9yOidlcnJvcid9Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgbWVzc2FnZV9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17ZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue3Zpc2libGU6ZmFsc2UsbWVzc2FnZTonJyxkdXJhdGlvbjozMDAwLHR5cGU6J2luZm8nLGljb25DbGFzczonJyxjdXN0b21DbGFzczonJyxvbkNsb3NlOm51bGwsc2hvd0Nsb3NlOmZhbHNlLGNsb3NlZDpmYWxzZSx2ZXJ0aWNhbE9mZnNldDoyMCx0aW1lcjpudWxsLGRhbmdlcm91c2x5VXNlSFRNTFN0cmluZzpmYWxzZSxjZW50ZXI6ZmFsc2V9O30sY29tcHV0ZWQ6e3R5cGVDbGFzczpmdW5jdGlvbiB0eXBlQ2xhc3MoKXtyZXR1cm4gdGhpcy50eXBlJiYhdGhpcy5pY29uQ2xhc3M/J2VsLW1lc3NhZ2VfX2ljb24gZWwtaWNvbi0nK3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfdHlwZU1hcFt0aGlzLnR5cGVdOicnO30scG9zaXRpb25TdHlsZTpmdW5jdGlvbiBwb3NpdGlvblN0eWxlKCl7cmV0dXJueyd0b3AnOnRoaXMudmVydGljYWxPZmZzZXQrJ3B4J307fX0sd2F0Y2g6e2Nsb3NlZDpmdW5jdGlvbiBjbG9zZWQobmV3VmFsKXtpZihuZXdWYWwpe3RoaXMudmlzaWJsZT1mYWxzZTt9fX0sbWV0aG9kczp7aGFuZGxlQWZ0ZXJMZWF2ZTpmdW5jdGlvbiBoYW5kbGVBZnRlckxlYXZlKCl7dGhpcy4kZGVzdHJveSh0cnVlKTt0aGlzLiRlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuJGVsKTt9LGNsb3NlOmZ1bmN0aW9uIGNsb3NlKCl7dGhpcy5jbG9zZWQ9dHJ1ZTtpZih0eXBlb2YgdGhpcy5vbkNsb3NlPT09J2Z1bmN0aW9uJyl7dGhpcy5vbkNsb3NlKHRoaXMpO319LGNsZWFyVGltZXI6ZnVuY3Rpb24gY2xlYXJUaW1lcigpe2NsZWFyVGltZW91dCh0aGlzLnRpbWVyKTt9LHN0YXJ0VGltZXI6ZnVuY3Rpb24gc3RhcnRUaW1lcigpe3ZhciBfdGhpcz10aGlzO2lmKHRoaXMuZHVyYXRpb24+MCl7dGhpcy50aW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYoIV90aGlzLmNsb3NlZCl7X3RoaXMuY2xvc2UoKTt9fSx0aGlzLmR1cmF0aW9uKTt9fSxrZXlkb3duOmZ1bmN0aW9uIGtleWRvd24oZSl7aWYoZS5rZXlDb2RlPT09Mjcpey8vIGVzY+WFs+mXrea2iOaBrwppZighdGhpcy5jbG9zZWQpe3RoaXMuY2xvc2UoKTt9fX19LG1vdW50ZWQ6ZnVuY3Rpb24gbW91bnRlZCgpe3RoaXMuc3RhcnRUaW1lcigpO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLHRoaXMua2V5ZG93bik7fSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKXtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJyx0aGlzLmtleWRvd24pO319Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvbWVzc2FnZS9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFja2FnZXNfbWVzc2FnZV9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz1tZXNzYWdlX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvbWVzc2FnZS9zcmMvbWFpbi52dWUKLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciBtZXNzYWdlX3NyY19tYWluX2NvbXBvbmVudD1ub3JtYWxpemVDb21wb25lbnQocGFja2FnZXNfbWVzc2FnZV9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNDU1YjlmNjBfcmVuZGVyLG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF80NTViOWY2MF9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIG1lc3NhZ2Vfc3JjX21haW5fYXBpO31tZXNzYWdlX3NyY19tYWluX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvbWVzc2FnZS9zcmMvbWFpbi52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgbWVzc2FnZV9zcmNfbWFpbj1tZXNzYWdlX3NyY19tYWluX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvbWVzc2FnZS9zcmMvbWFpbi5qcwp2YXIgTWVzc2FnZUNvbnN0cnVjdG9yPWV4dGVybmFsX3Z1ZV9kZWZhdWx0LmEuZXh0ZW5kKG1lc3NhZ2Vfc3JjX21haW4pO3ZhciBtZXNzYWdlX3NyY19tYWluX2luc3RhbmNlPXZvaWQgMDt2YXIgbWFpbl9pbnN0YW5jZXM9W107dmFyIG1haW5fc2VlZD0xO3ZhciBtYWluX01lc3NhZ2U9ZnVuY3Rpb24gTWVzc2FnZShvcHRpb25zKXtpZihleHRlcm5hbF92dWVfZGVmYXVsdC5hLnByb3RvdHlwZS4kaXNTZXJ2ZXIpcmV0dXJuO29wdGlvbnM9b3B0aW9uc3x8e307aWYodHlwZW9mIG9wdGlvbnM9PT0nc3RyaW5nJyl7b3B0aW9ucz17bWVzc2FnZTpvcHRpb25zfTt9dmFyIHVzZXJPbkNsb3NlPW9wdGlvbnMub25DbG9zZTt2YXIgaWQ9J21lc3NhZ2VfJyttYWluX3NlZWQrKztvcHRpb25zLm9uQ2xvc2U9ZnVuY3Rpb24oKXtNZXNzYWdlLmNsb3NlKGlkLHVzZXJPbkNsb3NlKTt9O21lc3NhZ2Vfc3JjX21haW5faW5zdGFuY2U9bmV3IE1lc3NhZ2VDb25zdHJ1Y3Rvcih7ZGF0YTpvcHRpb25zfSk7bWVzc2FnZV9zcmNfbWFpbl9pbnN0YW5jZS5pZD1pZDtpZihPYmplY3QodmRvbV9bImlzVk5vZGUiXSkobWVzc2FnZV9zcmNfbWFpbl9pbnN0YW5jZS5tZXNzYWdlKSl7bWVzc2FnZV9zcmNfbWFpbl9pbnN0YW5jZS4kc2xvdHMuZGVmYXVsdD1bbWVzc2FnZV9zcmNfbWFpbl9pbnN0YW5jZS5tZXNzYWdlXTttZXNzYWdlX3NyY19tYWluX2luc3RhbmNlLm1lc3NhZ2U9bnVsbDt9bWVzc2FnZV9zcmNfbWFpbl9pbnN0YW5jZS4kbW91bnQoKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1lc3NhZ2Vfc3JjX21haW5faW5zdGFuY2UuJGVsKTt2YXIgdmVydGljYWxPZmZzZXQ9b3B0aW9ucy5vZmZzZXR8fDIwO21haW5faW5zdGFuY2VzLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7dmVydGljYWxPZmZzZXQrPWl0ZW0uJGVsLm9mZnNldEhlaWdodCsxNjt9KTttZXNzYWdlX3NyY19tYWluX2luc3RhbmNlLnZlcnRpY2FsT2Zmc2V0PXZlcnRpY2FsT2Zmc2V0O21lc3NhZ2Vfc3JjX21haW5faW5zdGFuY2UudmlzaWJsZT10cnVlO21lc3NhZ2Vfc3JjX21haW5faW5zdGFuY2UuJGVsLnN0eWxlLnpJbmRleD1wb3B1cF9bIlBvcHVwTWFuYWdlciJdLm5leHRaSW5kZXgoKTttYWluX2luc3RhbmNlcy5wdXNoKG1lc3NhZ2Vfc3JjX21haW5faW5zdGFuY2UpO3JldHVybiBtZXNzYWdlX3NyY19tYWluX2luc3RhbmNlO307WydzdWNjZXNzJywnd2FybmluZycsJ2luZm8nLCdlcnJvciddLmZvckVhY2goZnVuY3Rpb24odHlwZSl7bWFpbl9NZXNzYWdlW3R5cGVdPWZ1bmN0aW9uKG9wdGlvbnMpe2lmKHR5cGVvZiBvcHRpb25zPT09J3N0cmluZycpe29wdGlvbnM9e21lc3NhZ2U6b3B0aW9uc307fW9wdGlvbnMudHlwZT10eXBlO3JldHVybiBtYWluX01lc3NhZ2Uob3B0aW9ucyk7fTt9KTttYWluX01lc3NhZ2UuY2xvc2U9ZnVuY3Rpb24oaWQsdXNlck9uQ2xvc2Upe3ZhciBsZW49bWFpbl9pbnN0YW5jZXMubGVuZ3RoO3ZhciBpbmRleD0tMTt2YXIgcmVtb3ZlZEhlaWdodD12b2lkIDA7Zm9yKHZhciBpPTA7aTxsZW47aSsrKXtpZihpZD09PW1haW5faW5zdGFuY2VzW2ldLmlkKXtyZW1vdmVkSGVpZ2h0PW1haW5faW5zdGFuY2VzW2ldLiRlbC5vZmZzZXRIZWlnaHQ7aW5kZXg9aTtpZih0eXBlb2YgdXNlck9uQ2xvc2U9PT0nZnVuY3Rpb24nKXt1c2VyT25DbG9zZShtYWluX2luc3RhbmNlc1tpXSk7fW1haW5faW5zdGFuY2VzLnNwbGljZShpLDEpO2JyZWFrO319aWYobGVuPD0xfHxpbmRleD09PS0xfHxpbmRleD5tYWluX2luc3RhbmNlcy5sZW5ndGgtMSlyZXR1cm47Zm9yKHZhciBfaT1pbmRleDtfaTxsZW4tMTtfaSsrKXt2YXIgZG9tPW1haW5faW5zdGFuY2VzW19pXS4kZWw7ZG9tLnN0eWxlWyd0b3AnXT1wYXJzZUludChkb20uc3R5bGVbJ3RvcCddLDEwKS1yZW1vdmVkSGVpZ2h0LTE2KydweCc7fX07bWFpbl9NZXNzYWdlLmNsb3NlQWxsPWZ1bmN0aW9uKCl7Zm9yKHZhciBpPW1haW5faW5zdGFuY2VzLmxlbmd0aC0xO2k+PTA7aS0tKXttYWluX2luc3RhbmNlc1tpXS5jbG9zZSgpO319Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFja2FnZXNfbWVzc2FnZV9zcmNfbWFpbj1tYWluX01lc3NhZ2U7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9tZXNzYWdlL2luZGV4LmpzCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFja2FnZXNfbWVzc2FnZT1wYWNrYWdlc19tZXNzYWdlX3NyY19tYWluOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvYmFkZ2Uvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTdjY2I2NTk4Jgp2YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzdjY2I2NTk4X3JlbmRlcj1mdW5jdGlvbiBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfN2NjYjY1OThfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtYmFkZ2UifSxbX3ZtLl90KCJkZWZhdWx0IiksX2MoInRyYW5zaXRpb24iLHthdHRyczp7bmFtZToiZWwtem9vbS1pbi1jZW50ZXIifX0sW19jKCJzdXAiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTohX3ZtLmhpZGRlbiYmKF92bS5jb250ZW50fHxfdm0uY29udGVudD09PTB8fF92bS5pc0RvdCksZXhwcmVzc2lvbjoiIWhpZGRlbiAmJiAoY29udGVudCB8fCBjb250ZW50ID09PSAwIHx8IGlzRG90KSJ9XSxzdGF0aWNDbGFzczoiZWwtYmFkZ2VfX2NvbnRlbnQiLGNsYXNzOlsiZWwtYmFkZ2VfX2NvbnRlbnQtLSIrX3ZtLnR5cGUseyJpcy1maXhlZCI6X3ZtLiRzbG90cy5kZWZhdWx0LCJpcy1kb3QiOl92bS5pc0RvdH1dLGRvbVByb3BzOnt0ZXh0Q29udGVudDpfdm0uX3MoX3ZtLmNvbnRlbnQpfX0pXSldLDIpO307dmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF83Y2NiNjU5OF9zdGF0aWNSZW5kZXJGbnM9W107bWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzdjY2I2NTk4X3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9iYWRnZS9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9N2NjYjY1OTgmCi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2JhZGdlL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBiYWRnZV9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17bmFtZTonRWxCYWRnZScscHJvcHM6e3ZhbHVlOltTdHJpbmcsTnVtYmVyXSxtYXg6TnVtYmVyLGlzRG90OkJvb2xlYW4saGlkZGVuOkJvb2xlYW4sdHlwZTp7dHlwZTpTdHJpbmcsdmFsaWRhdG9yOmZ1bmN0aW9uIHZhbGlkYXRvcih2YWwpe3JldHVyblsncHJpbWFyeScsJ3N1Y2Nlc3MnLCd3YXJuaW5nJywnaW5mbycsJ2RhbmdlciddLmluZGV4T2YodmFsKT4tMTt9fX0sY29tcHV0ZWQ6e2NvbnRlbnQ6ZnVuY3Rpb24gY29udGVudCgpe2lmKHRoaXMuaXNEb3QpcmV0dXJuO3ZhciB2YWx1ZT10aGlzLnZhbHVlO3ZhciBtYXg9dGhpcy5tYXg7aWYodHlwZW9mIHZhbHVlPT09J251bWJlcicmJnR5cGVvZiBtYXg9PT0nbnVtYmVyJyl7cmV0dXJuIG1heDx2YWx1ZT9tYXgrJysnOnZhbHVlO31yZXR1cm4gdmFsdWU7fX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYmFkZ2Uvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX2JhZGdlX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPWJhZGdlX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYmFkZ2Uvc3JjL21haW4udnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgYmFkZ2Vfc3JjX21haW5fY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChwYWNrYWdlc19iYWRnZV9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfN2NjYjY1OThfcmVuZGVyLG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF83Y2NiNjU5OF9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIGJhZGdlX3NyY19tYWluX2FwaTt9YmFkZ2Vfc3JjX21haW5fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy9iYWRnZS9zcmMvbWFpbi52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgYmFkZ2Vfc3JjX21haW49YmFkZ2Vfc3JjX21haW5fY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9iYWRnZS9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL2JhZGdlX3NyY19tYWluLmluc3RhbGw9ZnVuY3Rpb24oVnVlKXtWdWUuY29tcG9uZW50KGJhZGdlX3NyY19tYWluLm5hbWUsYmFkZ2Vfc3JjX21haW4pO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBiYWRnZT1iYWRnZV9zcmNfbWFpbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2NhcmQvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTU5YTRhNDBmJgp2YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzU5YTRhNDBmX3JlbmRlcj1mdW5jdGlvbiBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNTlhNGE0MGZfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtY2FyZCIsY2xhc3M6X3ZtLnNoYWRvdz8iaXMtIitfdm0uc2hhZG93KyItc2hhZG93IjoiaXMtYWx3YXlzLXNoYWRvdyJ9LFtfdm0uJHNsb3RzLmhlYWRlcnx8X3ZtLmhlYWRlcj9fYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLWNhcmRfX2hlYWRlciJ9LFtfdm0uX3QoImhlYWRlciIsW192bS5fdihfdm0uX3MoX3ZtLmhlYWRlcikpXSldLDIpOl92bS5fZSgpLF9jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtY2FyZF9fYm9keSIsc3R5bGU6X3ZtLmJvZHlTdHlsZX0sW192bS5fdCgiZGVmYXVsdCIpXSwyKV0pO307dmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81OWE0YTQwZl9zdGF0aWNSZW5kZXJGbnM9W107bWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzU5YTRhNDBmX3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXJkL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD01OWE0YTQwZiYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY2FyZC9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgY2FyZF9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17bmFtZTonRWxDYXJkJyxwcm9wczp7aGVhZGVyOnt9LGJvZHlTdHlsZTp7fSxzaGFkb3c6e3R5cGU6U3RyaW5nfX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FyZC9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFja2FnZXNfY2FyZF9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz1jYXJkX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FyZC9zcmMvbWFpbi52dWUKLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciBjYXJkX3NyY19tYWluX2NvbXBvbmVudD1ub3JtYWxpemVDb21wb25lbnQocGFja2FnZXNfY2FyZF9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNTlhNGE0MGZfcmVuZGVyLG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81OWE0YTQwZl9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIGNhcmRfc3JjX21haW5fYXBpO31jYXJkX3NyY19tYWluX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvY2FyZC9zcmMvbWFpbi52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgY2FyZF9zcmNfbWFpbj1jYXJkX3NyY19tYWluX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FyZC9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL2NhcmRfc3JjX21haW4uaW5zdGFsbD1mdW5jdGlvbihWdWUpe1Z1ZS5jb21wb25lbnQoY2FyZF9zcmNfbWFpbi5uYW1lLGNhcmRfc3JjX21haW4pO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBjYXJkPWNhcmRfc3JjX21haW47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9yYXRlL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD1hZGE1Nzc4MiYKdmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF9hZGE1Nzc4Ml9yZW5kZXI9ZnVuY3Rpb24gbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkX2FkYTU3NzgyX3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXJhdGUiLGF0dHJzOntyb2xlOiJzbGlkZXIiLCJhcmlhLXZhbHVlbm93Ijpfdm0uY3VycmVudFZhbHVlLCJhcmlhLXZhbHVldGV4dCI6X3ZtLnRleHQsImFyaWEtdmFsdWVtaW4iOiIwIiwiYXJpYS12YWx1ZW1heCI6X3ZtLm1heCx0YWJpbmRleDoiMCJ9LG9uOntrZXlkb3duOl92bS5oYW5kbGVLZXl9fSxbX3ZtLl9sKF92bS5tYXgsZnVuY3Rpb24oaXRlbSxrZXkpe3JldHVybiBfYygic3BhbiIse2tleTprZXksc3RhdGljQ2xhc3M6ImVsLXJhdGVfX2l0ZW0iLHN0eWxlOntjdXJzb3I6X3ZtLnJhdGVEaXNhYmxlZD8iYXV0byI6InBvaW50ZXIifSxvbjp7bW91c2Vtb3ZlOmZ1bmN0aW9uIG1vdXNlbW92ZSgkZXZlbnQpe192bS5zZXRDdXJyZW50VmFsdWUoaXRlbSwkZXZlbnQpO30sbW91c2VsZWF2ZTpfdm0ucmVzZXRDdXJyZW50VmFsdWUsY2xpY2s6ZnVuY3Rpb24gY2xpY2soJGV2ZW50KXtfdm0uc2VsZWN0VmFsdWUoaXRlbSk7fX19LFtfYygiaSIse3N0YXRpY0NsYXNzOiJlbC1yYXRlX19pY29uIixjbGFzczpbX3ZtLmNsYXNzZXNbaXRlbS0xXSx7aG92ZXI6X3ZtLmhvdmVySW5kZXg9PT1pdGVtfV0sc3R5bGU6X3ZtLmdldEljb25TdHlsZShpdGVtKX0sW192bS5zaG93RGVjaW1hbEljb24oaXRlbSk/X2MoImkiLHtzdGF0aWNDbGFzczoiZWwtcmF0ZV9fZGVjaW1hbCIsY2xhc3M6X3ZtLmRlY2ltYWxJY29uQ2xhc3Msc3R5bGU6X3ZtLmRlY2ltYWxTdHlsZX0pOl92bS5fZSgpXSldKTt9KSxfdm0uc2hvd1RleHR8fF92bS5zaG93U2NvcmU/X2MoInNwYW4iLHtzdGF0aWNDbGFzczoiZWwtcmF0ZV9fdGV4dCIsc3R5bGU6e2NvbG9yOl92bS50ZXh0Q29sb3J9fSxbX3ZtLl92KF92bS5fcyhfdm0udGV4dCkpXSk6X3ZtLl9lKCldLDIpO307dmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF9hZGE1Nzc4Ml9zdGF0aWNSZW5kZXJGbnM9W107bWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkX2FkYTU3NzgyX3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9yYXRlL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD1hZGE1Nzc4MiYKLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCAiZWxlbWVudC11aS9saWIvdXRpbHMvdHlwZXMiCnZhciB0eXBlc189X193ZWJwYWNrX3JlcXVpcmVfXygxOCk7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvcmF0ZS9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcmF0ZV9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17bmFtZTonRWxSYXRlJyxtaXhpbnM6W21pZ3JhdGluZ19kZWZhdWx0LmFdLGluamVjdDp7ZWxGb3JtOntkZWZhdWx0OicnfX0sZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue3BvaW50ZXJBdExlZnRIYWxmOnRydWUsY3VycmVudFZhbHVlOnRoaXMudmFsdWUsaG92ZXJJbmRleDotMX07fSxwcm9wczp7dmFsdWU6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MH0sbG93VGhyZXNob2xkOnt0eXBlOk51bWJlcixkZWZhdWx0OjJ9LGhpZ2hUaHJlc2hvbGQ6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6NH0sbWF4Ont0eXBlOk51bWJlcixkZWZhdWx0OjV9LGNvbG9yczp7dHlwZTpbQXJyYXksT2JqZWN0XSxkZWZhdWx0OmZ1bmN0aW9uIF9kZWZhdWx0KCl7cmV0dXJuWycjRjdCQTJBJywnI0Y3QkEyQScsJyNGN0JBMkEnXTt9fSx2b2lkQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6JyNDNkQxREUnfSxkaXNhYmxlZFZvaWRDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDonI0VGRjJGNyd9LGljb25DbGFzc2VzOnt0eXBlOltBcnJheSxPYmplY3RdLGRlZmF1bHQ6ZnVuY3Rpb24gX2RlZmF1bHQoKXtyZXR1cm5bJ2VsLWljb24tc3Rhci1vbicsJ2VsLWljb24tc3Rhci1vbicsJ2VsLWljb24tc3Rhci1vbiddO319LHZvaWRJY29uQ2xhc3M6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6J2VsLWljb24tc3Rhci1vZmYnfSxkaXNhYmxlZFZvaWRJY29uQ2xhc3M6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6J2VsLWljb24tc3Rhci1vbid9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDpmYWxzZX0sYWxsb3dIYWxmOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDpmYWxzZX0sc2hvd1RleHQ6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OmZhbHNlfSxzaG93U2NvcmU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OmZhbHNlfSx0ZXh0Q29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6JyMxZjJkM2QnfSx0ZXh0czp7dHlwZTpBcnJheSxkZWZhdWx0OmZ1bmN0aW9uIF9kZWZhdWx0KCl7cmV0dXJuWyfmnoHlt64nLCflpLHmnJsnLCfkuIDoiKwnLCfmu6HmhI8nLCfmg4rllpwnXTt9fSxzY29yZVRlbXBsYXRlOnt0eXBlOlN0cmluZyxkZWZhdWx0Oid7dmFsdWV9J319LGNvbXB1dGVkOnt0ZXh0OmZ1bmN0aW9uIHRleHQoKXt2YXIgcmVzdWx0PScnO2lmKHRoaXMuc2hvd1Njb3JlKXtyZXN1bHQ9dGhpcy5zY29yZVRlbXBsYXRlLnJlcGxhY2UoL1x7XHMqdmFsdWVccypcfS8sdGhpcy5yYXRlRGlzYWJsZWQ/dGhpcy52YWx1ZTp0aGlzLmN1cnJlbnRWYWx1ZSk7fWVsc2UgaWYodGhpcy5zaG93VGV4dCl7cmVzdWx0PXRoaXMudGV4dHNbTWF0aC5jZWlsKHRoaXMuY3VycmVudFZhbHVlKS0xXTt9cmV0dXJuIHJlc3VsdDt9LGRlY2ltYWxTdHlsZTpmdW5jdGlvbiBkZWNpbWFsU3R5bGUoKXt2YXIgd2lkdGg9Jyc7aWYodGhpcy5yYXRlRGlzYWJsZWQpe3dpZHRoPXRoaXMudmFsdWVEZWNpbWFsKyclJzt9ZWxzZSBpZih0aGlzLmFsbG93SGFsZil7d2lkdGg9JzUwJSc7fXJldHVybntjb2xvcjp0aGlzLmFjdGl2ZUNvbG9yLHdpZHRoOndpZHRofTt9LHZhbHVlRGVjaW1hbDpmdW5jdGlvbiB2YWx1ZURlY2ltYWwoKXtyZXR1cm4gdGhpcy52YWx1ZSoxMDAtTWF0aC5mbG9vcih0aGlzLnZhbHVlKSoxMDA7fSxjbGFzc01hcDpmdW5jdGlvbiBjbGFzc01hcCgpe3ZhciBfcmVmO3JldHVybiBBcnJheS5pc0FycmF5KHRoaXMuaWNvbkNsYXNzZXMpPyhfcmVmPXt9LF9yZWZbdGhpcy5sb3dUaHJlc2hvbGRdPXRoaXMuaWNvbkNsYXNzZXNbMF0sX3JlZlt0aGlzLmhpZ2hUaHJlc2hvbGRdPXt2YWx1ZTp0aGlzLmljb25DbGFzc2VzWzFdLGV4Y2x1ZGVkOnRydWV9LF9yZWZbdGhpcy5tYXhdPXRoaXMuaWNvbkNsYXNzZXNbMl0sX3JlZik6dGhpcy5pY29uQ2xhc3Nlczt9LGRlY2ltYWxJY29uQ2xhc3M6ZnVuY3Rpb24gZGVjaW1hbEljb25DbGFzcygpe3JldHVybiB0aGlzLmdldFZhbHVlRnJvbU1hcCh0aGlzLnZhbHVlLHRoaXMuY2xhc3NNYXApO30sdm9pZENsYXNzOmZ1bmN0aW9uIHZvaWRDbGFzcygpe3JldHVybiB0aGlzLnJhdGVEaXNhYmxlZD90aGlzLmRpc2FibGVkVm9pZEljb25DbGFzczp0aGlzLnZvaWRJY29uQ2xhc3M7fSxhY3RpdmVDbGFzczpmdW5jdGlvbiBhY3RpdmVDbGFzcygpe3JldHVybiB0aGlzLmdldFZhbHVlRnJvbU1hcCh0aGlzLmN1cnJlbnRWYWx1ZSx0aGlzLmNsYXNzTWFwKTt9LGNvbG9yTWFwOmZ1bmN0aW9uIGNvbG9yTWFwKCl7dmFyIF9yZWYyO3JldHVybiBBcnJheS5pc0FycmF5KHRoaXMuY29sb3JzKT8oX3JlZjI9e30sX3JlZjJbdGhpcy5sb3dUaHJlc2hvbGRdPXRoaXMuY29sb3JzWzBdLF9yZWYyW3RoaXMuaGlnaFRocmVzaG9sZF09e3ZhbHVlOnRoaXMuY29sb3JzWzFdLGV4Y2x1ZGVkOnRydWV9LF9yZWYyW3RoaXMubWF4XT10aGlzLmNvbG9yc1syXSxfcmVmMik6dGhpcy5jb2xvcnM7fSxhY3RpdmVDb2xvcjpmdW5jdGlvbiBhY3RpdmVDb2xvcigpe3JldHVybiB0aGlzLmdldFZhbHVlRnJvbU1hcCh0aGlzLmN1cnJlbnRWYWx1ZSx0aGlzLmNvbG9yTWFwKTt9LGNsYXNzZXM6ZnVuY3Rpb24gY2xhc3Nlcygpe3ZhciByZXN1bHQ9W107dmFyIGk9MDt2YXIgdGhyZXNob2xkPXRoaXMuY3VycmVudFZhbHVlO2lmKHRoaXMuYWxsb3dIYWxmJiZ0aGlzLmN1cnJlbnRWYWx1ZSE9PU1hdGguZmxvb3IodGhpcy5jdXJyZW50VmFsdWUpKXt0aHJlc2hvbGQtLTt9Zm9yKDtpPHRocmVzaG9sZDtpKyspe3Jlc3VsdC5wdXNoKHRoaXMuYWN0aXZlQ2xhc3MpO31mb3IoO2k8dGhpcy5tYXg7aSsrKXtyZXN1bHQucHVzaCh0aGlzLnZvaWRDbGFzcyk7fXJldHVybiByZXN1bHQ7fSxyYXRlRGlzYWJsZWQ6ZnVuY3Rpb24gcmF0ZURpc2FibGVkKCl7cmV0dXJuIHRoaXMuZGlzYWJsZWR8fCh0aGlzLmVsRm9ybXx8e30pLmRpc2FibGVkO319LHdhdGNoOnt2YWx1ZTpmdW5jdGlvbiB2YWx1ZSh2YWwpe3RoaXMuY3VycmVudFZhbHVlPXZhbDt0aGlzLnBvaW50ZXJBdExlZnRIYWxmPXRoaXMudmFsdWUhPT1NYXRoLmZsb29yKHRoaXMudmFsdWUpO319LG1ldGhvZHM6e2dldE1pZ3JhdGluZ0NvbmZpZzpmdW5jdGlvbiBnZXRNaWdyYXRpbmdDb25maWcoKXtyZXR1cm57cHJvcHM6eyd0ZXh0LXRlbXBsYXRlJzondGV4dC10ZW1wbGF0ZSBpcyByZW5hbWVkIHRvIHNjb3JlLXRlbXBsYXRlLid9fTt9LGdldFZhbHVlRnJvbU1hcDpmdW5jdGlvbiBnZXRWYWx1ZUZyb21NYXAodmFsdWUsbWFwKXt2YXIgbWF0Y2hlZEtleXM9T2JqZWN0LmtleXMobWFwKS5maWx0ZXIoZnVuY3Rpb24oa2V5KXt2YXIgdmFsPW1hcFtrZXldO3ZhciBleGNsdWRlZD1PYmplY3QodHlwZXNfWyJpc09iamVjdCJdKSh2YWwpP3ZhbC5leGNsdWRlZDpmYWxzZTtyZXR1cm4gZXhjbHVkZWQ/dmFsdWU8a2V5OnZhbHVlPD1rZXk7fSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLWI7fSk7dmFyIG1hdGNoZWRWYWx1ZT1tYXBbbWF0Y2hlZEtleXNbMF1dO3JldHVybiBPYmplY3QodHlwZXNfWyJpc09iamVjdCJdKShtYXRjaGVkVmFsdWUpP21hdGNoZWRWYWx1ZS52YWx1ZTptYXRjaGVkVmFsdWV8fCcnO30sc2hvd0RlY2ltYWxJY29uOmZ1bmN0aW9uIHNob3dEZWNpbWFsSWNvbihpdGVtKXt2YXIgc2hvd1doZW5EaXNhYmxlZD10aGlzLnJhdGVEaXNhYmxlZCYmdGhpcy52YWx1ZURlY2ltYWw+MCYmaXRlbS0xPHRoaXMudmFsdWUmJml0ZW0+dGhpcy52YWx1ZTsvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL3ZhciBzaG93V2hlbkFsbG93SGFsZj10aGlzLmFsbG93SGFsZiYmdGhpcy5wb2ludGVyQXRMZWZ0SGFsZiYmaXRlbS0wLjU8PXRoaXMuY3VycmVudFZhbHVlJiZpdGVtPnRoaXMuY3VycmVudFZhbHVlO3JldHVybiBzaG93V2hlbkRpc2FibGVkfHxzaG93V2hlbkFsbG93SGFsZjt9LGdldEljb25TdHlsZTpmdW5jdGlvbiBnZXRJY29uU3R5bGUoaXRlbSl7dmFyIHZvaWRDb2xvcj10aGlzLnJhdGVEaXNhYmxlZD90aGlzLmRpc2FibGVkVm9pZENvbG9yOnRoaXMudm9pZENvbG9yO3JldHVybntjb2xvcjppdGVtPD10aGlzLmN1cnJlbnRWYWx1ZT90aGlzLmFjdGl2ZUNvbG9yOnZvaWRDb2xvcn07fSxzZWxlY3RWYWx1ZTpmdW5jdGlvbiBzZWxlY3RWYWx1ZSh2YWx1ZSl7aWYodGhpcy5yYXRlRGlzYWJsZWQpe3JldHVybjt9aWYodGhpcy5hbGxvd0hhbGYmJnRoaXMucG9pbnRlckF0TGVmdEhhbGYpe3RoaXMuJGVtaXQoJ2lucHV0Jyx0aGlzLmN1cnJlbnRWYWx1ZSk7dGhpcy4kZW1pdCgnY2hhbmdlJyx0aGlzLmN1cnJlbnRWYWx1ZSk7fWVsc2V7dGhpcy4kZW1pdCgnaW5wdXQnLHZhbHVlKTt0aGlzLiRlbWl0KCdjaGFuZ2UnLHZhbHVlKTt9fSxoYW5kbGVLZXk6ZnVuY3Rpb24gaGFuZGxlS2V5KGUpe2lmKHRoaXMucmF0ZURpc2FibGVkKXtyZXR1cm47fXZhciBjdXJyZW50VmFsdWU9dGhpcy5jdXJyZW50VmFsdWU7dmFyIGtleUNvZGU9ZS5rZXlDb2RlO2lmKGtleUNvZGU9PT0zOHx8a2V5Q29kZT09PTM5KXsvLyBsZWZ0IC8gZG93bgppZih0aGlzLmFsbG93SGFsZil7Y3VycmVudFZhbHVlKz0wLjU7fWVsc2V7Y3VycmVudFZhbHVlKz0xO31lLnN0b3BQcm9wYWdhdGlvbigpO2UucHJldmVudERlZmF1bHQoKTt9ZWxzZSBpZihrZXlDb2RlPT09Mzd8fGtleUNvZGU9PT00MCl7aWYodGhpcy5hbGxvd0hhbGYpe2N1cnJlbnRWYWx1ZS09MC41O31lbHNle2N1cnJlbnRWYWx1ZS09MTt9ZS5zdG9wUHJvcGFnYXRpb24oKTtlLnByZXZlbnREZWZhdWx0KCk7fWN1cnJlbnRWYWx1ZT1jdXJyZW50VmFsdWU8MD8wOmN1cnJlbnRWYWx1ZTtjdXJyZW50VmFsdWU9Y3VycmVudFZhbHVlPnRoaXMubWF4P3RoaXMubWF4OmN1cnJlbnRWYWx1ZTt0aGlzLiRlbWl0KCdpbnB1dCcsY3VycmVudFZhbHVlKTt0aGlzLiRlbWl0KCdjaGFuZ2UnLGN1cnJlbnRWYWx1ZSk7fSxzZXRDdXJyZW50VmFsdWU6ZnVuY3Rpb24gc2V0Q3VycmVudFZhbHVlKHZhbHVlLGV2ZW50KXtpZih0aGlzLnJhdGVEaXNhYmxlZCl7cmV0dXJuO30vKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9pZih0aGlzLmFsbG93SGFsZil7dmFyIHRhcmdldD1ldmVudC50YXJnZXQ7aWYoT2JqZWN0KGRvbV9bImhhc0NsYXNzIl0pKHRhcmdldCwnZWwtcmF0ZV9faXRlbScpKXt0YXJnZXQ9dGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoJy5lbC1yYXRlX19pY29uJyk7fWlmKE9iamVjdChkb21fWyJoYXNDbGFzcyJdKSh0YXJnZXQsJ2VsLXJhdGVfX2RlY2ltYWwnKSl7dGFyZ2V0PXRhcmdldC5wYXJlbnROb2RlO310aGlzLnBvaW50ZXJBdExlZnRIYWxmPWV2ZW50Lm9mZnNldFgqMjw9dGFyZ2V0LmNsaWVudFdpZHRoO3RoaXMuY3VycmVudFZhbHVlPXRoaXMucG9pbnRlckF0TGVmdEhhbGY/dmFsdWUtMC41OnZhbHVlO31lbHNle3RoaXMuY3VycmVudFZhbHVlPXZhbHVlO310aGlzLmhvdmVySW5kZXg9dmFsdWU7fSxyZXNldEN1cnJlbnRWYWx1ZTpmdW5jdGlvbiByZXNldEN1cnJlbnRWYWx1ZSgpe2lmKHRoaXMucmF0ZURpc2FibGVkKXtyZXR1cm47fWlmKHRoaXMuYWxsb3dIYWxmKXt0aGlzLnBvaW50ZXJBdExlZnRIYWxmPXRoaXMudmFsdWUhPT1NYXRoLmZsb29yKHRoaXMudmFsdWUpO310aGlzLmN1cnJlbnRWYWx1ZT10aGlzLnZhbHVlO3RoaXMuaG92ZXJJbmRleD0tMTt9fSxjcmVhdGVkOmZ1bmN0aW9uIGNyZWF0ZWQoKXtpZighdGhpcy52YWx1ZSl7dGhpcy4kZW1pdCgnaW5wdXQnLDApO319fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3JhdGUvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX3JhdGVfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189cmF0ZV9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3JhdGUvc3JjL21haW4udnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgcmF0ZV9zcmNfbWFpbl9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHBhY2thZ2VzX3JhdGVfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkX2FkYTU3NzgyX3JlbmRlcixtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfYWRhNTc3ODJfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciByYXRlX3NyY19tYWluX2FwaTt9cmF0ZV9zcmNfbWFpbl9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL3JhdGUvc3JjL21haW4udnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHJhdGVfc3JjX21haW49cmF0ZV9zcmNfbWFpbl9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3JhdGUvaW5kZXguanMKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9yYXRlX3NyY19tYWluLmluc3RhbGw9ZnVuY3Rpb24oVnVlKXtWdWUuY29tcG9uZW50KHJhdGVfc3JjX21haW4ubmFtZSxyYXRlX3NyY19tYWluKTt9Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcmF0ZT1yYXRlX3NyY19tYWluOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvc3RlcHMvc3JjL3N0ZXBzLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0zYzZiNmRjMCYKdmFyIHN0ZXBzdnVlX3R5cGVfdGVtcGxhdGVfaWRfM2M2YjZkYzBfcmVuZGVyPWZ1bmN0aW9uIHN0ZXBzdnVlX3R5cGVfdGVtcGxhdGVfaWRfM2M2YjZkYzBfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtc3RlcHMiLGNsYXNzOlshX3ZtLnNpbXBsZSYmImVsLXN0ZXBzLS0iK192bS5kaXJlY3Rpb24sX3ZtLnNpbXBsZSYmImVsLXN0ZXBzLS1zaW1wbGUiXX0sW192bS5fdCgiZGVmYXVsdCIpXSwyKTt9O3ZhciBzdGVwc3Z1ZV90eXBlX3RlbXBsYXRlX2lkXzNjNmI2ZGMwX3N0YXRpY1JlbmRlckZucz1bXTtzdGVwc3Z1ZV90eXBlX3RlbXBsYXRlX2lkXzNjNmI2ZGMwX3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zdGVwcy9zcmMvc3RlcHMudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTNjNmI2ZGMwJgovLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9zdGVwcy9zcmMvc3RlcHMudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHN0ZXBzdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbFN0ZXBzJyxtaXhpbnM6W21pZ3JhdGluZ19kZWZhdWx0LmFdLHByb3BzOntzcGFjZTpbTnVtYmVyLFN0cmluZ10sYWN0aXZlOk51bWJlcixkaXJlY3Rpb246e3R5cGU6U3RyaW5nLGRlZmF1bHQ6J2hvcml6b250YWwnfSxhbGlnbkNlbnRlcjpCb29sZWFuLHNpbXBsZTpCb29sZWFuLGZpbmlzaFN0YXR1czp7dHlwZTpTdHJpbmcsZGVmYXVsdDonZmluaXNoJ30scHJvY2Vzc1N0YXR1czp7dHlwZTpTdHJpbmcsZGVmYXVsdDoncHJvY2Vzcyd9fSxkYXRhOmZ1bmN0aW9uIGRhdGEoKXtyZXR1cm57c3RlcHM6W10sc3RlcE9mZnNldDowfTt9LG1ldGhvZHM6e2dldE1pZ3JhdGluZ0NvbmZpZzpmdW5jdGlvbiBnZXRNaWdyYXRpbmdDb25maWcoKXtyZXR1cm57cHJvcHM6eydjZW50ZXInOidjZW50ZXIgaXMgcmVtb3ZlZC4nfX07fX0sd2F0Y2g6e2FjdGl2ZTpmdW5jdGlvbiBhY3RpdmUobmV3VmFsLG9sZFZhbCl7dGhpcy4kZW1pdCgnY2hhbmdlJyxuZXdWYWwsb2xkVmFsKTt9LHN0ZXBzOmZ1bmN0aW9uIHN0ZXBzKF9zdGVwcyl7X3N0ZXBzLmZvckVhY2goZnVuY3Rpb24oY2hpbGQsaW5kZXgpe2NoaWxkLmluZGV4PWluZGV4O30pO319fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3N0ZXBzL3NyYy9zdGVwcy52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc3JjX3N0ZXBzdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXN0ZXBzdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc3RlcHMvc3JjL3N0ZXBzLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIHN0ZXBzX2NvbXBvbmVudD1ub3JtYWxpemVDb21wb25lbnQoc3JjX3N0ZXBzdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLHN0ZXBzdnVlX3R5cGVfdGVtcGxhdGVfaWRfM2M2YjZkYzBfcmVuZGVyLHN0ZXBzdnVlX3R5cGVfdGVtcGxhdGVfaWRfM2M2YjZkYzBfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciBzdGVwc19hcGk7fXN0ZXBzX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvc3RlcHMvc3JjL3N0ZXBzLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzdGVwcz1zdGVwc19jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3N0ZXBzL2luZGV4LmpzCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovc3RlcHMuaW5zdGFsbD1mdW5jdGlvbihWdWUpe1Z1ZS5jb21wb25lbnQoc3RlcHMubmFtZSxzdGVwcyk7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX3N0ZXBzPXN0ZXBzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvc3RlcHMvc3JjL3N0ZXAudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWY0MTRhODdhJgp2YXIgc3RlcHZ1ZV90eXBlX3RlbXBsYXRlX2lkX2Y0MTRhODdhX3JlbmRlcj1mdW5jdGlvbiBzdGVwdnVlX3R5cGVfdGVtcGxhdGVfaWRfZjQxNGE4N2FfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtc3RlcCIsY2xhc3M6WyFfdm0uaXNTaW1wbGUmJiJpcy0iK192bS4kcGFyZW50LmRpcmVjdGlvbixfdm0uaXNTaW1wbGUmJiJpcy1zaW1wbGUiLF92bS5pc0xhc3QmJiFfdm0uc3BhY2UmJiFfdm0uaXNDZW50ZXImJiJpcy1mbGV4Iixfdm0uaXNDZW50ZXImJiFfdm0uaXNWZXJ0aWNhbCYmIV92bS5pc1NpbXBsZSYmImlzLWNlbnRlciJdLHN0eWxlOl92bS5zdHlsZX0sW19jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtc3RlcF9faGVhZCIsY2xhc3M6ImlzLSIrX3ZtLmN1cnJlbnRTdGF0dXN9LFtfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXN0ZXBfX2xpbmUiLHN0eWxlOl92bS5pc0xhc3Q/IiI6e21hcmdpblJpZ2h0Ol92bS4kcGFyZW50LnN0ZXBPZmZzZXQrInB4In19LFtfYygiaSIse3N0YXRpY0NsYXNzOiJlbC1zdGVwX19saW5lLWlubmVyIixzdHlsZTpfdm0ubGluZVN0eWxlfSldKSxfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXN0ZXBfX2ljb24iLGNsYXNzOiJpcy0iKyhfdm0uaWNvbj8iaWNvbiI6InRleHQiKX0sW192bS5jdXJyZW50U3RhdHVzIT09InN1Y2Nlc3MiJiZfdm0uY3VycmVudFN0YXR1cyE9PSJlcnJvciI/X3ZtLl90KCJpY29uIixbX3ZtLmljb24/X2MoImkiLHtzdGF0aWNDbGFzczoiZWwtc3RlcF9faWNvbi1pbm5lciIsY2xhc3M6W192bS5pY29uXX0pOl92bS5fZSgpLCFfdm0uaWNvbiYmIV92bS5pc1NpbXBsZT9fYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXN0ZXBfX2ljb24taW5uZXIifSxbX3ZtLl92KF92bS5fcyhfdm0uaW5kZXgrMSkpXSk6X3ZtLl9lKCldKTpfYygiaSIse3N0YXRpY0NsYXNzOiJlbC1zdGVwX19pY29uLWlubmVyIGlzLXN0YXR1cyIsY2xhc3M6WyJlbC1pY29uLSIrKF92bS5jdXJyZW50U3RhdHVzPT09InN1Y2Nlc3MiPyJjaGVjayI6ImNsb3NlIildfSldLDIpXSksX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1zdGVwX19tYWluIn0sW19jKCJkaXYiLHtyZWY6InRpdGxlIixzdGF0aWNDbGFzczoiZWwtc3RlcF9fdGl0bGUiLGNsYXNzOlsiaXMtIitfdm0uY3VycmVudFN0YXR1c119LFtfdm0uX3QoInRpdGxlIixbX3ZtLl92KF92bS5fcyhfdm0udGl0bGUpKV0pXSwyKSxfdm0uaXNTaW1wbGU/X2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1zdGVwX19hcnJvdyJ9KTpfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXN0ZXBfX2Rlc2NyaXB0aW9uIixjbGFzczpbImlzLSIrX3ZtLmN1cnJlbnRTdGF0dXNdfSxbX3ZtLl90KCJkZXNjcmlwdGlvbiIsW192bS5fdihfdm0uX3MoX3ZtLmRlc2NyaXB0aW9uKSldKV0sMildKV0pO307dmFyIHN0ZXB2dWVfdHlwZV90ZW1wbGF0ZV9pZF9mNDE0YTg3YV9zdGF0aWNSZW5kZXJGbnM9W107c3RlcHZ1ZV90eXBlX3RlbXBsYXRlX2lkX2Y0MTRhODdhX3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zdGVwcy9zcmMvc3RlcC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9ZjQxNGE4N2EmCi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3N0ZXBzL3NyYy9zdGVwLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzdGVwdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbFN0ZXAnLHByb3BzOnt0aXRsZTpTdHJpbmcsaWNvbjpTdHJpbmcsZGVzY3JpcHRpb246U3RyaW5nLHN0YXR1czpTdHJpbmd9LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybntpbmRleDotMSxsaW5lU3R5bGU6e30saW50ZXJuYWxTdGF0dXM6Jyd9O30sYmVmb3JlQ3JlYXRlOmZ1bmN0aW9uIGJlZm9yZUNyZWF0ZSgpe3RoaXMuJHBhcmVudC5zdGVwcy5wdXNoKHRoaXMpO30sYmVmb3JlRGVzdHJveTpmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCl7dmFyIHN0ZXBzPXRoaXMuJHBhcmVudC5zdGVwczt2YXIgaW5kZXg9c3RlcHMuaW5kZXhPZih0aGlzKTtpZihpbmRleD49MCl7c3RlcHMuc3BsaWNlKGluZGV4LDEpO319LGNvbXB1dGVkOntjdXJyZW50U3RhdHVzOmZ1bmN0aW9uIGN1cnJlbnRTdGF0dXMoKXtyZXR1cm4gdGhpcy5zdGF0dXN8fHRoaXMuaW50ZXJuYWxTdGF0dXM7fSxwcmV2U3RhdHVzOmZ1bmN0aW9uIHByZXZTdGF0dXMoKXt2YXIgcHJldlN0ZXA9dGhpcy4kcGFyZW50LnN0ZXBzW3RoaXMuaW5kZXgtMV07cmV0dXJuIHByZXZTdGVwP3ByZXZTdGVwLmN1cnJlbnRTdGF0dXM6J3dhaXQnO30saXNDZW50ZXI6ZnVuY3Rpb24gaXNDZW50ZXIoKXtyZXR1cm4gdGhpcy4kcGFyZW50LmFsaWduQ2VudGVyO30saXNWZXJ0aWNhbDpmdW5jdGlvbiBpc1ZlcnRpY2FsKCl7cmV0dXJuIHRoaXMuJHBhcmVudC5kaXJlY3Rpb249PT0ndmVydGljYWwnO30saXNTaW1wbGU6ZnVuY3Rpb24gaXNTaW1wbGUoKXtyZXR1cm4gdGhpcy4kcGFyZW50LnNpbXBsZTt9LGlzTGFzdDpmdW5jdGlvbiBpc0xhc3QoKXt2YXIgcGFyZW50PXRoaXMuJHBhcmVudDtyZXR1cm4gcGFyZW50LnN0ZXBzW3BhcmVudC5zdGVwcy5sZW5ndGgtMV09PT10aGlzO30sc3RlcHNDb3VudDpmdW5jdGlvbiBzdGVwc0NvdW50KCl7cmV0dXJuIHRoaXMuJHBhcmVudC5zdGVwcy5sZW5ndGg7fSxzcGFjZTpmdW5jdGlvbiBzcGFjZSgpe3ZhciBpc1NpbXBsZT10aGlzLmlzU2ltcGxlLHNwYWNlPXRoaXMuJHBhcmVudC5zcGFjZTtyZXR1cm4gaXNTaW1wbGU/Jyc6c3BhY2U7fSxzdHlsZTpmdW5jdGlvbiBzdHlsZSgpe3ZhciBzdHlsZT17fTt2YXIgcGFyZW50PXRoaXMuJHBhcmVudDt2YXIgbGVuPXBhcmVudC5zdGVwcy5sZW5ndGg7dmFyIHNwYWNlPXR5cGVvZiB0aGlzLnNwYWNlPT09J251bWJlcic/dGhpcy5zcGFjZSsncHgnOnRoaXMuc3BhY2U/dGhpcy5zcGFjZToxMDAvKGxlbi0odGhpcy5pc0NlbnRlcj8wOjEpKSsnJSc7c3R5bGUuZmxleEJhc2lzPXNwYWNlO2lmKHRoaXMuaXNWZXJ0aWNhbClyZXR1cm4gc3R5bGU7aWYodGhpcy5pc0xhc3Qpe3N0eWxlLm1heFdpZHRoPTEwMC90aGlzLnN0ZXBzQ291bnQrJyUnO31lbHNle3N0eWxlLm1hcmdpblJpZ2h0PS10aGlzLiRwYXJlbnQuc3RlcE9mZnNldCsncHgnO31yZXR1cm4gc3R5bGU7fX0sbWV0aG9kczp7dXBkYXRlU3RhdHVzOmZ1bmN0aW9uIHVwZGF0ZVN0YXR1cyh2YWwpe3ZhciBwcmV2Q2hpbGQ9dGhpcy4kcGFyZW50LiRjaGlsZHJlblt0aGlzLmluZGV4LTFdO2lmKHZhbD50aGlzLmluZGV4KXt0aGlzLmludGVybmFsU3RhdHVzPXRoaXMuJHBhcmVudC5maW5pc2hTdGF0dXM7fWVsc2UgaWYodmFsPT09dGhpcy5pbmRleCYmdGhpcy5wcmV2U3RhdHVzIT09J2Vycm9yJyl7dGhpcy5pbnRlcm5hbFN0YXR1cz10aGlzLiRwYXJlbnQucHJvY2Vzc1N0YXR1czt9ZWxzZXt0aGlzLmludGVybmFsU3RhdHVzPSd3YWl0Jzt9aWYocHJldkNoaWxkKXByZXZDaGlsZC5jYWxjUHJvZ3Jlc3ModGhpcy5pbnRlcm5hbFN0YXR1cyk7fSxjYWxjUHJvZ3Jlc3M6ZnVuY3Rpb24gY2FsY1Byb2dyZXNzKHN0YXR1cyl7dmFyIHN0ZXA9MTAwO3ZhciBzdHlsZT17fTtzdHlsZS50cmFuc2l0aW9uRGVsYXk9MTUwKnRoaXMuaW5kZXgrJ21zJztpZihzdGF0dXM9PT10aGlzLiRwYXJlbnQucHJvY2Vzc1N0YXR1cyl7c3RlcD10aGlzLmN1cnJlbnRTdGF0dXMhPT0nZXJyb3InPzA6MDt9ZWxzZSBpZihzdGF0dXM9PT0nd2FpdCcpe3N0ZXA9MDtzdHlsZS50cmFuc2l0aW9uRGVsYXk9LTE1MCp0aGlzLmluZGV4Kydtcyc7fXN0eWxlLmJvcmRlcldpZHRoPXN0ZXAmJiF0aGlzLmlzU2ltcGxlPycxcHgnOjA7dGhpcy4kcGFyZW50LmRpcmVjdGlvbj09PSd2ZXJ0aWNhbCc/c3R5bGUuaGVpZ2h0PXN0ZXArJyUnOnN0eWxlLndpZHRoPXN0ZXArJyUnO3RoaXMubGluZVN0eWxlPXN0eWxlO319LG1vdW50ZWQ6ZnVuY3Rpb24gbW91bnRlZCgpe3ZhciBfdGhpcz10aGlzO3ZhciB1bndhdGNoPXRoaXMuJHdhdGNoKCdpbmRleCcsZnVuY3Rpb24odmFsKXtfdGhpcy4kd2F0Y2goJyRwYXJlbnQuYWN0aXZlJyxfdGhpcy51cGRhdGVTdGF0dXMse2ltbWVkaWF0ZTp0cnVlfSk7X3RoaXMuJHdhdGNoKCckcGFyZW50LnByb2Nlc3NTdGF0dXMnLGZ1bmN0aW9uKCl7dmFyIGFjdGl2ZUluZGV4PV90aGlzLiRwYXJlbnQuYWN0aXZlO190aGlzLnVwZGF0ZVN0YXR1cyhhY3RpdmVJbmRleCk7fSx7aW1tZWRpYXRlOnRydWV9KTt1bndhdGNoKCk7fSk7fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zdGVwcy9zcmMvc3RlcC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc3JjX3N0ZXB2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189c3RlcHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3N0ZXBzL3NyYy9zdGVwLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIHN0ZXBfY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChzcmNfc3RlcHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxzdGVwdnVlX3R5cGVfdGVtcGxhdGVfaWRfZjQxNGE4N2FfcmVuZGVyLHN0ZXB2dWVfdHlwZV90ZW1wbGF0ZV9pZF9mNDE0YTg3YV9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIHN0ZXBfYXBpO31zdGVwX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvc3RlcHMvc3JjL3N0ZXAudnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHN0ZXA9c3RlcF9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3N0ZXAvaW5kZXguanMKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9zdGVwLmluc3RhbGw9ZnVuY3Rpb24oVnVlKXtWdWUuY29tcG9uZW50KHN0ZXAubmFtZSxzdGVwKTt9Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFja2FnZXNfc3RlcD1zdGVwOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY2Fyb3VzZWwvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTVkNWQxNDgyJgp2YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzVkNWQxNDgyX3JlbmRlcj1mdW5jdGlvbiBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNWQ1ZDE0ODJfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJkaXYiLHtjbGFzczpfdm0uY2Fyb3VzZWxDbGFzc2VzLG9uOnttb3VzZWVudGVyOmZ1bmN0aW9uIG1vdXNlZW50ZXIoJGV2ZW50KXskZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7cmV0dXJuIF92bS5oYW5kbGVNb3VzZUVudGVyKCRldmVudCk7fSxtb3VzZWxlYXZlOmZ1bmN0aW9uIG1vdXNlbGVhdmUoJGV2ZW50KXskZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7cmV0dXJuIF92bS5oYW5kbGVNb3VzZUxlYXZlKCRldmVudCk7fX19LFtfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLWNhcm91c2VsX19jb250YWluZXIiLHN0eWxlOntoZWlnaHQ6X3ZtLmhlaWdodH19LFtfdm0uYXJyb3dEaXNwbGF5P19jKCJ0cmFuc2l0aW9uIix7YXR0cnM6e25hbWU6ImNhcm91c2VsLWFycm93LWxlZnQifX0sW19jKCJidXR0b24iLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTooX3ZtLmFycm93PT09ImFsd2F5cyJ8fF92bS5ob3ZlcikmJihfdm0ubG9vcHx8X3ZtLmFjdGl2ZUluZGV4PjApLGV4cHJlc3Npb246IihhcnJvdyA9PT0gJ2Fsd2F5cycgfHwgaG92ZXIpICYmIChsb29wIHx8IGFjdGl2ZUluZGV4ID4gMCkifV0sc3RhdGljQ2xhc3M6ImVsLWNhcm91c2VsX19hcnJvdyBlbC1jYXJvdXNlbF9fYXJyb3ctLWxlZnQiLGF0dHJzOnt0eXBlOiJidXR0b24ifSxvbjp7bW91c2VlbnRlcjpmdW5jdGlvbiBtb3VzZWVudGVyKCRldmVudCl7X3ZtLmhhbmRsZUJ1dHRvbkVudGVyKCJsZWZ0Iik7fSxtb3VzZWxlYXZlOl92bS5oYW5kbGVCdXR0b25MZWF2ZSxjbGljazpmdW5jdGlvbiBjbGljaygkZXZlbnQpeyRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtfdm0udGhyb3R0bGVkQXJyb3dDbGljayhfdm0uYWN0aXZlSW5kZXgtMSk7fX19LFtfYygiaSIse3N0YXRpY0NsYXNzOiJlbC1pY29uLWFycm93LWxlZnQifSldKV0pOl92bS5fZSgpLF92bS5hcnJvd0Rpc3BsYXk/X2MoInRyYW5zaXRpb24iLHthdHRyczp7bmFtZToiY2Fyb3VzZWwtYXJyb3ctcmlnaHQifX0sW19jKCJidXR0b24iLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTooX3ZtLmFycm93PT09ImFsd2F5cyJ8fF92bS5ob3ZlcikmJihfdm0ubG9vcHx8X3ZtLmFjdGl2ZUluZGV4PF92bS5pdGVtcy5sZW5ndGgtMSksZXhwcmVzc2lvbjoiKGFycm93ID09PSAnYWx3YXlzJyB8fCBob3ZlcikgJiYgKGxvb3AgfHwgYWN0aXZlSW5kZXggPCBpdGVtcy5sZW5ndGggLSAxKSJ9XSxzdGF0aWNDbGFzczoiZWwtY2Fyb3VzZWxfX2Fycm93IGVsLWNhcm91c2VsX19hcnJvdy0tcmlnaHQiLGF0dHJzOnt0eXBlOiJidXR0b24ifSxvbjp7bW91c2VlbnRlcjpmdW5jdGlvbiBtb3VzZWVudGVyKCRldmVudCl7X3ZtLmhhbmRsZUJ1dHRvbkVudGVyKCJyaWdodCIpO30sbW91c2VsZWF2ZTpfdm0uaGFuZGxlQnV0dG9uTGVhdmUsY2xpY2s6ZnVuY3Rpb24gY2xpY2soJGV2ZW50KXskZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7X3ZtLnRocm90dGxlZEFycm93Q2xpY2soX3ZtLmFjdGl2ZUluZGV4KzEpO319fSxbX2MoImkiLHtzdGF0aWNDbGFzczoiZWwtaWNvbi1hcnJvdy1yaWdodCJ9KV0pXSk6X3ZtLl9lKCksX3ZtLl90KCJkZWZhdWx0IildLDIpLF92bS5pbmRpY2F0b3JQb3NpdGlvbiE9PSJub25lIj9fYygidWwiLHtjbGFzczpfdm0uaW5kaWNhdG9yc0NsYXNzZXN9LF92bS5fbChfdm0uaXRlbXMsZnVuY3Rpb24oaXRlbSxpbmRleCl7cmV0dXJuIF9jKCJsaSIse2tleTppbmRleCxjbGFzczpbImVsLWNhcm91c2VsX19pbmRpY2F0b3IiLCJlbC1jYXJvdXNlbF9faW5kaWNhdG9yLS0iK192bS5kaXJlY3Rpb24seyJpcy1hY3RpdmUiOmluZGV4PT09X3ZtLmFjdGl2ZUluZGV4fV0sb246e21vdXNlZW50ZXI6ZnVuY3Rpb24gbW91c2VlbnRlcigkZXZlbnQpe192bS50aHJvdHRsZWRJbmRpY2F0b3JIb3ZlcihpbmRleCk7fSxjbGljazpmdW5jdGlvbiBjbGljaygkZXZlbnQpeyRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtfdm0uaGFuZGxlSW5kaWNhdG9yQ2xpY2soaW5kZXgpO319fSxbX2MoImJ1dHRvbiIse3N0YXRpY0NsYXNzOiJlbC1jYXJvdXNlbF9fYnV0dG9uIn0sW192bS5oYXNMYWJlbD9fYygic3BhbiIsW192bS5fdihfdm0uX3MoaXRlbS5sYWJlbCkpXSk6X3ZtLl9lKCldKV0pO30pLDApOl92bS5fZSgpXSk7fTt2YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzVkNWQxNDgyX3N0YXRpY1JlbmRlckZucz1bXTttYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNWQ1ZDE0ODJfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Nhcm91c2VsL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD01ZDVkMTQ4MiYKLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCAidGhyb3R0bGUtZGVib3VuY2UvdGhyb3R0bGUiCnZhciB0aHJvdHRsZV89X193ZWJwYWNrX3JlcXVpcmVfXygyNSk7dmFyIHRocm90dGxlX2RlZmF1bHQ9LyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubih0aHJvdHRsZV8pOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2Nhcm91c2VsL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBjYXJvdXNlbF9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17bmFtZTonRWxDYXJvdXNlbCcscHJvcHM6e2luaXRpYWxJbmRleDp7dHlwZTpOdW1iZXIsZGVmYXVsdDowfSxoZWlnaHQ6U3RyaW5nLHRyaWdnZXI6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6J2hvdmVyJ30sYXV0b3BsYXk6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OnRydWV9LGludGVydmFsOnt0eXBlOk51bWJlcixkZWZhdWx0OjMwMDB9LGluZGljYXRvclBvc2l0aW9uOlN0cmluZyxpbmRpY2F0b3I6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OnRydWV9LGFycm93Ont0eXBlOlN0cmluZyxkZWZhdWx0Oidob3Zlcid9LHR5cGU6U3RyaW5nLGxvb3A6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OnRydWV9LGRpcmVjdGlvbjp7dHlwZTpTdHJpbmcsZGVmYXVsdDonaG9yaXpvbnRhbCcsdmFsaWRhdG9yOmZ1bmN0aW9uIHZhbGlkYXRvcih2YWwpe3JldHVyblsnaG9yaXpvbnRhbCcsJ3ZlcnRpY2FsJ10uaW5kZXhPZih2YWwpIT09LTE7fX19LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybntpdGVtczpbXSxhY3RpdmVJbmRleDotMSxjb250YWluZXJXaWR0aDowLHRpbWVyOm51bGwsaG92ZXI6ZmFsc2V9O30sY29tcHV0ZWQ6e2Fycm93RGlzcGxheTpmdW5jdGlvbiBhcnJvd0Rpc3BsYXkoKXtyZXR1cm4gdGhpcy5hcnJvdyE9PSduZXZlcicmJnRoaXMuZGlyZWN0aW9uIT09J3ZlcnRpY2FsJzt9LGhhc0xhYmVsOmZ1bmN0aW9uIGhhc0xhYmVsKCl7cmV0dXJuIHRoaXMuaXRlbXMuc29tZShmdW5jdGlvbihpdGVtKXtyZXR1cm4gaXRlbS5sYWJlbC50b1N0cmluZygpLmxlbmd0aD4wO30pO30sY2Fyb3VzZWxDbGFzc2VzOmZ1bmN0aW9uIGNhcm91c2VsQ2xhc3Nlcygpe3ZhciBjbGFzc2VzPVsnZWwtY2Fyb3VzZWwnLCdlbC1jYXJvdXNlbC0tJyt0aGlzLmRpcmVjdGlvbl07aWYodGhpcy50eXBlPT09J2NhcmQnKXtjbGFzc2VzLnB1c2goJ2VsLWNhcm91c2VsLS1jYXJkJyk7fXJldHVybiBjbGFzc2VzO30saW5kaWNhdG9yc0NsYXNzZXM6ZnVuY3Rpb24gaW5kaWNhdG9yc0NsYXNzZXMoKXt2YXIgY2xhc3Nlcz1bJ2VsLWNhcm91c2VsX19pbmRpY2F0b3JzJywnZWwtY2Fyb3VzZWxfX2luZGljYXRvcnMtLScrdGhpcy5kaXJlY3Rpb25dO2lmKHRoaXMuaGFzTGFiZWwpe2NsYXNzZXMucHVzaCgnZWwtY2Fyb3VzZWxfX2luZGljYXRvcnMtLWxhYmVscycpO31pZih0aGlzLmluZGljYXRvclBvc2l0aW9uPT09J291dHNpZGUnfHx0aGlzLnR5cGU9PT0nY2FyZCcpe2NsYXNzZXMucHVzaCgnZWwtY2Fyb3VzZWxfX2luZGljYXRvcnMtLW91dHNpZGUnKTt9cmV0dXJuIGNsYXNzZXM7fX0sd2F0Y2g6e2l0ZW1zOmZ1bmN0aW9uIGl0ZW1zKHZhbCl7aWYodmFsLmxlbmd0aD4wKXRoaXMuc2V0QWN0aXZlSXRlbSh0aGlzLmluaXRpYWxJbmRleCk7fSxhY3RpdmVJbmRleDpmdW5jdGlvbiBhY3RpdmVJbmRleCh2YWwsb2xkVmFsKXt0aGlzLnJlc2V0SXRlbVBvc2l0aW9uKG9sZFZhbCk7aWYob2xkVmFsPi0xKXt0aGlzLiRlbWl0KCdjaGFuZ2UnLHZhbCxvbGRWYWwpO319LGF1dG9wbGF5OmZ1bmN0aW9uIGF1dG9wbGF5KHZhbCl7dmFsP3RoaXMuc3RhcnRUaW1lcigpOnRoaXMucGF1c2VUaW1lcigpO30sbG9vcDpmdW5jdGlvbiBsb29wKCl7dGhpcy5zZXRBY3RpdmVJdGVtKHRoaXMuYWN0aXZlSW5kZXgpO319LG1ldGhvZHM6e2hhbmRsZU1vdXNlRW50ZXI6ZnVuY3Rpb24gaGFuZGxlTW91c2VFbnRlcigpe3RoaXMuaG92ZXI9dHJ1ZTt0aGlzLnBhdXNlVGltZXIoKTt9LGhhbmRsZU1vdXNlTGVhdmU6ZnVuY3Rpb24gaGFuZGxlTW91c2VMZWF2ZSgpe3RoaXMuaG92ZXI9ZmFsc2U7dGhpcy5zdGFydFRpbWVyKCk7fSxpdGVtSW5TdGFnZTpmdW5jdGlvbiBpdGVtSW5TdGFnZShpdGVtLGluZGV4KXt2YXIgbGVuZ3RoPXRoaXMuaXRlbXMubGVuZ3RoO2lmKGluZGV4PT09bGVuZ3RoLTEmJml0ZW0uaW5TdGFnZSYmdGhpcy5pdGVtc1swXS5hY3RpdmV8fGl0ZW0uaW5TdGFnZSYmdGhpcy5pdGVtc1tpbmRleCsxXSYmdGhpcy5pdGVtc1tpbmRleCsxXS5hY3RpdmUpe3JldHVybidsZWZ0Jzt9ZWxzZSBpZihpbmRleD09PTAmJml0ZW0uaW5TdGFnZSYmdGhpcy5pdGVtc1tsZW5ndGgtMV0uYWN0aXZlfHxpdGVtLmluU3RhZ2UmJnRoaXMuaXRlbXNbaW5kZXgtMV0mJnRoaXMuaXRlbXNbaW5kZXgtMV0uYWN0aXZlKXtyZXR1cm4ncmlnaHQnO31yZXR1cm4gZmFsc2U7fSxoYW5kbGVCdXR0b25FbnRlcjpmdW5jdGlvbiBoYW5kbGVCdXR0b25FbnRlcihhcnJvdyl7dmFyIF90aGlzPXRoaXM7aWYodGhpcy5kaXJlY3Rpb249PT0ndmVydGljYWwnKXJldHVybjt0aGlzLml0ZW1zLmZvckVhY2goZnVuY3Rpb24oaXRlbSxpbmRleCl7aWYoYXJyb3c9PT1fdGhpcy5pdGVtSW5TdGFnZShpdGVtLGluZGV4KSl7aXRlbS5ob3Zlcj10cnVlO319KTt9LGhhbmRsZUJ1dHRvbkxlYXZlOmZ1bmN0aW9uIGhhbmRsZUJ1dHRvbkxlYXZlKCl7aWYodGhpcy5kaXJlY3Rpb249PT0ndmVydGljYWwnKXJldHVybjt0aGlzLml0ZW1zLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7aXRlbS5ob3Zlcj1mYWxzZTt9KTt9LHVwZGF0ZUl0ZW1zOmZ1bmN0aW9uIHVwZGF0ZUl0ZW1zKCl7dGhpcy5pdGVtcz10aGlzLiRjaGlsZHJlbi5maWx0ZXIoZnVuY3Rpb24oY2hpbGQpe3JldHVybiBjaGlsZC4kb3B0aW9ucy5uYW1lPT09J0VsQ2Fyb3VzZWxJdGVtJzt9KTt9LHJlc2V0SXRlbVBvc2l0aW9uOmZ1bmN0aW9uIHJlc2V0SXRlbVBvc2l0aW9uKG9sZEluZGV4KXt2YXIgX3RoaXMyPXRoaXM7dGhpcy5pdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0saW5kZXgpe2l0ZW0udHJhbnNsYXRlSXRlbShpbmRleCxfdGhpczIuYWN0aXZlSW5kZXgsb2xkSW5kZXgpO30pO30scGxheVNsaWRlczpmdW5jdGlvbiBwbGF5U2xpZGVzKCl7aWYodGhpcy5hY3RpdmVJbmRleDx0aGlzLml0ZW1zLmxlbmd0aC0xKXt0aGlzLmFjdGl2ZUluZGV4Kys7fWVsc2UgaWYodGhpcy5sb29wKXt0aGlzLmFjdGl2ZUluZGV4PTA7fX0scGF1c2VUaW1lcjpmdW5jdGlvbiBwYXVzZVRpbWVyKCl7aWYodGhpcy50aW1lcil7Y2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyKTt0aGlzLnRpbWVyPW51bGw7fX0sc3RhcnRUaW1lcjpmdW5jdGlvbiBzdGFydFRpbWVyKCl7aWYodGhpcy5pbnRlcnZhbDw9MHx8IXRoaXMuYXV0b3BsYXl8fHRoaXMudGltZXIpcmV0dXJuO3RoaXMudGltZXI9c2V0SW50ZXJ2YWwodGhpcy5wbGF5U2xpZGVzLHRoaXMuaW50ZXJ2YWwpO30sc2V0QWN0aXZlSXRlbTpmdW5jdGlvbiBzZXRBY3RpdmVJdGVtKGluZGV4KXtpZih0eXBlb2YgaW5kZXg9PT0nc3RyaW5nJyl7dmFyIGZpbHRlcmVkSXRlbXM9dGhpcy5pdGVtcy5maWx0ZXIoZnVuY3Rpb24oaXRlbSl7cmV0dXJuIGl0ZW0ubmFtZT09PWluZGV4O30pO2lmKGZpbHRlcmVkSXRlbXMubGVuZ3RoPjApe2luZGV4PXRoaXMuaXRlbXMuaW5kZXhPZihmaWx0ZXJlZEl0ZW1zWzBdKTt9fWluZGV4PU51bWJlcihpbmRleCk7aWYoaXNOYU4oaW5kZXgpfHxpbmRleCE9PU1hdGguZmxvb3IoaW5kZXgpKXtjb25zb2xlLndhcm4oJ1tFbGVtZW50IFdhcm5dW0Nhcm91c2VsXWluZGV4IG11c3QgYmUgYW4gaW50ZWdlci4nKTtyZXR1cm47fXZhciBsZW5ndGg9dGhpcy5pdGVtcy5sZW5ndGg7dmFyIG9sZEluZGV4PXRoaXMuYWN0aXZlSW5kZXg7aWYoaW5kZXg8MCl7dGhpcy5hY3RpdmVJbmRleD10aGlzLmxvb3A/bGVuZ3RoLTE6MDt9ZWxzZSBpZihpbmRleD49bGVuZ3RoKXt0aGlzLmFjdGl2ZUluZGV4PXRoaXMubG9vcD8wOmxlbmd0aC0xO31lbHNle3RoaXMuYWN0aXZlSW5kZXg9aW5kZXg7fWlmKG9sZEluZGV4PT09dGhpcy5hY3RpdmVJbmRleCl7dGhpcy5yZXNldEl0ZW1Qb3NpdGlvbihvbGRJbmRleCk7fX0scHJldjpmdW5jdGlvbiBwcmV2KCl7dGhpcy5zZXRBY3RpdmVJdGVtKHRoaXMuYWN0aXZlSW5kZXgtMSk7fSxuZXh0OmZ1bmN0aW9uIG5leHQoKXt0aGlzLnNldEFjdGl2ZUl0ZW0odGhpcy5hY3RpdmVJbmRleCsxKTt9LGhhbmRsZUluZGljYXRvckNsaWNrOmZ1bmN0aW9uIGhhbmRsZUluZGljYXRvckNsaWNrKGluZGV4KXt0aGlzLmFjdGl2ZUluZGV4PWluZGV4O30saGFuZGxlSW5kaWNhdG9ySG92ZXI6ZnVuY3Rpb24gaGFuZGxlSW5kaWNhdG9ySG92ZXIoaW5kZXgpe2lmKHRoaXMudHJpZ2dlcj09PSdob3ZlcicmJmluZGV4IT09dGhpcy5hY3RpdmVJbmRleCl7dGhpcy5hY3RpdmVJbmRleD1pbmRleDt9fX0sY3JlYXRlZDpmdW5jdGlvbiBjcmVhdGVkKCl7dmFyIF90aGlzMz10aGlzO3RoaXMudGhyb3R0bGVkQXJyb3dDbGljaz10aHJvdHRsZV9kZWZhdWx0KCkoMzAwLHRydWUsZnVuY3Rpb24oaW5kZXgpe190aGlzMy5zZXRBY3RpdmVJdGVtKGluZGV4KTt9KTt0aGlzLnRocm90dGxlZEluZGljYXRvckhvdmVyPXRocm90dGxlX2RlZmF1bHQoKSgzMDAsZnVuY3Rpb24oaW5kZXgpe190aGlzMy5oYW5kbGVJbmRpY2F0b3JIb3ZlcihpbmRleCk7fSk7fSxtb3VudGVkOmZ1bmN0aW9uIG1vdW50ZWQoKXt2YXIgX3RoaXM0PXRoaXM7dGhpcy51cGRhdGVJdGVtcygpO3RoaXMuJG5leHRUaWNrKGZ1bmN0aW9uKCl7T2JqZWN0KHJlc2l6ZV9ldmVudF9bImFkZFJlc2l6ZUxpc3RlbmVyIl0pKF90aGlzNC4kZWwsX3RoaXM0LnJlc2V0SXRlbVBvc2l0aW9uKTtpZihfdGhpczQuaW5pdGlhbEluZGV4PF90aGlzNC5pdGVtcy5sZW5ndGgmJl90aGlzNC5pbml0aWFsSW5kZXg+PTApe190aGlzNC5hY3RpdmVJbmRleD1fdGhpczQuaW5pdGlhbEluZGV4O31fdGhpczQuc3RhcnRUaW1lcigpO30pO30sYmVmb3JlRGVzdHJveTpmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCl7aWYodGhpcy4kZWwpT2JqZWN0KHJlc2l6ZV9ldmVudF9bInJlbW92ZVJlc2l6ZUxpc3RlbmVyIl0pKHRoaXMuJGVsLHRoaXMucmVzZXRJdGVtUG9zaXRpb24pO3RoaXMucGF1c2VUaW1lcigpO319Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2Fyb3VzZWwvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX2Nhcm91c2VsX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPWNhcm91c2VsX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2Fyb3VzZWwvc3JjL21haW4udnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgY2Fyb3VzZWxfc3JjX21haW5fY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChwYWNrYWdlc19jYXJvdXNlbF9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNWQ1ZDE0ODJfcmVuZGVyLG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81ZDVkMTQ4Ml9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIGNhcm91c2VsX3NyY19tYWluX2FwaTt9Y2Fyb3VzZWxfc3JjX21haW5fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy9jYXJvdXNlbC9zcmMvbWFpbi52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgY2Fyb3VzZWxfc3JjX21haW49Y2Fyb3VzZWxfc3JjX21haW5fY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXJvdXNlbC9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL2Nhcm91c2VsX3NyY19tYWluLmluc3RhbGw9ZnVuY3Rpb24oVnVlKXtWdWUuY29tcG9uZW50KGNhcm91c2VsX3NyY19tYWluLm5hbWUsY2Fyb3VzZWxfc3JjX21haW4pO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBjYXJvdXNlbD1jYXJvdXNlbF9zcmNfbWFpbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3Njcm9sbGJhci9zcmMvdXRpbC5qcwp2YXIgQkFSX01BUD17dmVydGljYWw6e29mZnNldDonb2Zmc2V0SGVpZ2h0JyxzY3JvbGw6J3Njcm9sbFRvcCcsc2Nyb2xsU2l6ZTonc2Nyb2xsSGVpZ2h0JyxzaXplOidoZWlnaHQnLGtleTondmVydGljYWwnLGF4aXM6J1knLGNsaWVudDonY2xpZW50WScsZGlyZWN0aW9uOid0b3AnfSxob3Jpem9udGFsOntvZmZzZXQ6J29mZnNldFdpZHRoJyxzY3JvbGw6J3Njcm9sbExlZnQnLHNjcm9sbFNpemU6J3Njcm9sbFdpZHRoJyxzaXplOid3aWR0aCcsa2V5Oidob3Jpem9udGFsJyxheGlzOidYJyxjbGllbnQ6J2NsaWVudFgnLGRpcmVjdGlvbjonbGVmdCd9fTtmdW5jdGlvbiByZW5kZXJUaHVtYlN0eWxlKF9yZWYpe3ZhciBtb3ZlPV9yZWYubW92ZSxzaXplPV9yZWYuc2l6ZSxiYXI9X3JlZi5iYXI7dmFyIHN0eWxlPXt9O3ZhciB0cmFuc2xhdGU9J3RyYW5zbGF0ZScrYmFyLmF4aXMrJygnK21vdmUrJyUpJztzdHlsZVtiYXIuc2l6ZV09c2l6ZTtzdHlsZS50cmFuc2Zvcm09dHJhbnNsYXRlO3N0eWxlLm1zVHJhbnNmb3JtPXRyYW5zbGF0ZTtzdHlsZS53ZWJraXRUcmFuc2Zvcm09dHJhbnNsYXRlO3JldHVybiBzdHlsZTt9Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2Nyb2xsYmFyL3NyYy9iYXIuanMKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfYmFyPXtuYW1lOidCYXInLHByb3BzOnt2ZXJ0aWNhbDpCb29sZWFuLHNpemU6U3RyaW5nLG1vdmU6TnVtYmVyfSxjb21wdXRlZDp7YmFyOmZ1bmN0aW9uIGJhcigpe3JldHVybiBCQVJfTUFQW3RoaXMudmVydGljYWw/J3ZlcnRpY2FsJzonaG9yaXpvbnRhbCddO30sd3JhcDpmdW5jdGlvbiB3cmFwKCl7cmV0dXJuIHRoaXMuJHBhcmVudC53cmFwO319LHJlbmRlcjpmdW5jdGlvbiByZW5kZXIoaCl7dmFyIHNpemU9dGhpcy5zaXplLG1vdmU9dGhpcy5tb3ZlLGJhcj10aGlzLmJhcjtyZXR1cm4gaCgnZGl2Jyx7J2NsYXNzJzpbJ2VsLXNjcm9sbGJhcl9fYmFyJywnaXMtJytiYXIua2V5XSxvbjp7J21vdXNlZG93bic6dGhpcy5jbGlja1RyYWNrSGFuZGxlcn19LFtoKCdkaXYnLHtyZWY6J3RodW1iJywnY2xhc3MnOidlbC1zY3JvbGxiYXJfX3RodW1iJyxvbjp7J21vdXNlZG93bic6dGhpcy5jbGlja1RodW1iSGFuZGxlcn0sc3R5bGU6cmVuZGVyVGh1bWJTdHlsZSh7c2l6ZTpzaXplLG1vdmU6bW92ZSxiYXI6YmFyfSl9KV0pO30sbWV0aG9kczp7Y2xpY2tUaHVtYkhhbmRsZXI6ZnVuY3Rpb24gY2xpY2tUaHVtYkhhbmRsZXIoZSl7Ly8gcHJldmVudCBjbGljayBldmVudCBvZiByaWdodCBidXR0b24KaWYoZS5jdHJsS2V5fHxlLmJ1dHRvbj09PTIpe3JldHVybjt9dGhpcy5zdGFydERyYWcoZSk7dGhpc1t0aGlzLmJhci5heGlzXT1lLmN1cnJlbnRUYXJnZXRbdGhpcy5iYXIub2Zmc2V0XS0oZVt0aGlzLmJhci5jbGllbnRdLWUuY3VycmVudFRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVt0aGlzLmJhci5kaXJlY3Rpb25dKTt9LGNsaWNrVHJhY2tIYW5kbGVyOmZ1bmN0aW9uIGNsaWNrVHJhY2tIYW5kbGVyKGUpe3ZhciBvZmZzZXQ9TWF0aC5hYnMoZS50YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbdGhpcy5iYXIuZGlyZWN0aW9uXS1lW3RoaXMuYmFyLmNsaWVudF0pO3ZhciB0aHVtYkhhbGY9dGhpcy4kcmVmcy50aHVtYlt0aGlzLmJhci5vZmZzZXRdLzI7dmFyIHRodW1iUG9zaXRpb25QZXJjZW50YWdlPShvZmZzZXQtdGh1bWJIYWxmKSoxMDAvdGhpcy4kZWxbdGhpcy5iYXIub2Zmc2V0XTt0aGlzLndyYXBbdGhpcy5iYXIuc2Nyb2xsXT10aHVtYlBvc2l0aW9uUGVyY2VudGFnZSp0aGlzLndyYXBbdGhpcy5iYXIuc2Nyb2xsU2l6ZV0vMTAwO30sc3RhcnREcmFnOmZ1bmN0aW9uIHN0YXJ0RHJhZyhlKXtlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO3RoaXMuY3Vyc29yRG93bj10cnVlO09iamVjdChkb21fWyJvbiJdKShkb2N1bWVudCwnbW91c2Vtb3ZlJyx0aGlzLm1vdXNlTW92ZURvY3VtZW50SGFuZGxlcik7T2JqZWN0KGRvbV9bIm9uIl0pKGRvY3VtZW50LCdtb3VzZXVwJyx0aGlzLm1vdXNlVXBEb2N1bWVudEhhbmRsZXIpO2RvY3VtZW50Lm9uc2VsZWN0c3RhcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gZmFsc2U7fTt9LG1vdXNlTW92ZURvY3VtZW50SGFuZGxlcjpmdW5jdGlvbiBtb3VzZU1vdmVEb2N1bWVudEhhbmRsZXIoZSl7aWYodGhpcy5jdXJzb3JEb3duPT09ZmFsc2UpcmV0dXJuO3ZhciBwcmV2UGFnZT10aGlzW3RoaXMuYmFyLmF4aXNdO2lmKCFwcmV2UGFnZSlyZXR1cm47dmFyIG9mZnNldD0odGhpcy4kZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbdGhpcy5iYXIuZGlyZWN0aW9uXS1lW3RoaXMuYmFyLmNsaWVudF0pKi0xO3ZhciB0aHVtYkNsaWNrUG9zaXRpb249dGhpcy4kcmVmcy50aHVtYlt0aGlzLmJhci5vZmZzZXRdLXByZXZQYWdlO3ZhciB0aHVtYlBvc2l0aW9uUGVyY2VudGFnZT0ob2Zmc2V0LXRodW1iQ2xpY2tQb3NpdGlvbikqMTAwL3RoaXMuJGVsW3RoaXMuYmFyLm9mZnNldF07dGhpcy53cmFwW3RoaXMuYmFyLnNjcm9sbF09dGh1bWJQb3NpdGlvblBlcmNlbnRhZ2UqdGhpcy53cmFwW3RoaXMuYmFyLnNjcm9sbFNpemVdLzEwMDt9LG1vdXNlVXBEb2N1bWVudEhhbmRsZXI6ZnVuY3Rpb24gbW91c2VVcERvY3VtZW50SGFuZGxlcihlKXt0aGlzLmN1cnNvckRvd249ZmFsc2U7dGhpc1t0aGlzLmJhci5heGlzXT0wO09iamVjdChkb21fWyJvZmYiXSkoZG9jdW1lbnQsJ21vdXNlbW92ZScsdGhpcy5tb3VzZU1vdmVEb2N1bWVudEhhbmRsZXIpO2RvY3VtZW50Lm9uc2VsZWN0c3RhcnQ9bnVsbDt9fSxkZXN0cm95ZWQ6ZnVuY3Rpb24gZGVzdHJveWVkKCl7T2JqZWN0KGRvbV9bIm9mZiJdKShkb2N1bWVudCwnbW91c2V1cCcsdGhpcy5tb3VzZVVwRG9jdW1lbnRIYW5kbGVyKTt9fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3Njcm9sbGJhci9zcmMvbWFpbi5qcwovLyByZWZlcmVuY2UgaHR0cHM6Ly9naXRodWIuY29tL25vZWxkZWxnYWRvL2dlbWluaS1zY3JvbGxiYXIvYmxvYi9tYXN0ZXIvaW5kZXguanMKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzY3JvbGxiYXJfc3JjX21haW49e25hbWU6J0VsU2Nyb2xsYmFyJyxjb21wb25lbnRzOntCYXI6c3JjX2Jhcn0scHJvcHM6e25hdGl2ZTpCb29sZWFuLHdyYXBTdHlsZTp7fSx3cmFwQ2xhc3M6e30sdmlld0NsYXNzOnt9LHZpZXdTdHlsZTp7fSxub3Jlc2l6ZTpCb29sZWFuLC8vIOWmguaenCBjb250YWluZXIg5bC65a+45LiN5Lya5Y+R55Sf5Y+Y5YyW77yM5pyA5aW96K6+572u5a6D5Y+v5Lul5LyY5YyW5oCn6IO9CnRhZzp7dHlwZTpTdHJpbmcsZGVmYXVsdDonZGl2J319LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybntzaXplV2lkdGg6JzAnLHNpemVIZWlnaHQ6JzAnLG1vdmVYOjAsbW92ZVk6MH07fSxjb21wdXRlZDp7d3JhcDpmdW5jdGlvbiB3cmFwKCl7cmV0dXJuIHRoaXMuJHJlZnMud3JhcDt9fSxyZW5kZXI6ZnVuY3Rpb24gcmVuZGVyKGgpe3ZhciBndXR0ZXI9c2Nyb2xsYmFyX3dpZHRoX2RlZmF1bHQoKSgpO3ZhciBzdHlsZT10aGlzLndyYXBTdHlsZTtpZihndXR0ZXIpe3ZhciBndXR0ZXJXaXRoPSctJytndXR0ZXIrJ3B4Jzt2YXIgZ3V0dGVyU3R5bGU9J21hcmdpbi1ib3R0b206ICcrZ3V0dGVyV2l0aCsnOyBtYXJnaW4tcmlnaHQ6ICcrZ3V0dGVyV2l0aCsnOyc7aWYoQXJyYXkuaXNBcnJheSh0aGlzLndyYXBTdHlsZSkpe3N0eWxlPU9iamVjdCh1dGlsX1sidG9PYmplY3QiXSkodGhpcy53cmFwU3R5bGUpO3N0eWxlLm1hcmdpblJpZ2h0PXN0eWxlLm1hcmdpbkJvdHRvbT1ndXR0ZXJXaXRoO31lbHNlIGlmKHR5cGVvZiB0aGlzLndyYXBTdHlsZT09PSdzdHJpbmcnKXtzdHlsZSs9Z3V0dGVyU3R5bGU7fWVsc2V7c3R5bGU9Z3V0dGVyU3R5bGU7fX12YXIgdmlldz1oKHRoaXMudGFnLHtjbGFzczpbJ2VsLXNjcm9sbGJhcl9fdmlldycsdGhpcy52aWV3Q2xhc3NdLHN0eWxlOnRoaXMudmlld1N0eWxlLHJlZjoncmVzaXplJ30sdGhpcy4kc2xvdHMuZGVmYXVsdCk7dmFyIHdyYXA9aCgnZGl2Jyx7cmVmOid3cmFwJyxzdHlsZTpzdHlsZSxvbjp7J3Njcm9sbCc6dGhpcy5oYW5kbGVTY3JvbGx9LCdjbGFzcyc6W3RoaXMud3JhcENsYXNzLCdlbC1zY3JvbGxiYXJfX3dyYXAnLGd1dHRlcj8nJzonZWwtc2Nyb2xsYmFyX193cmFwLS1oaWRkZW4tZGVmYXVsdCddfSxbW3ZpZXddXSk7dmFyIG5vZGVzPXZvaWQgMDtpZighdGhpcy5uYXRpdmUpe25vZGVzPVt3cmFwLGgoc3JjX2Jhcix7YXR0cnM6e21vdmU6dGhpcy5tb3ZlWCxzaXplOnRoaXMuc2l6ZVdpZHRofX0pLGgoc3JjX2Jhcix7YXR0cnM6e3ZlcnRpY2FsOnRydWUsbW92ZTp0aGlzLm1vdmVZLHNpemU6dGhpcy5zaXplSGVpZ2h0fX0pXTt9ZWxzZXtub2Rlcz1baCgnZGl2Jyx7cmVmOid3cmFwJywnY2xhc3MnOlt0aGlzLndyYXBDbGFzcywnZWwtc2Nyb2xsYmFyX193cmFwJ10sc3R5bGU6c3R5bGV9LFtbdmlld11dKV07fXJldHVybiBoKCdkaXYnLHtjbGFzczonZWwtc2Nyb2xsYmFyJ30sbm9kZXMpO30sbWV0aG9kczp7aGFuZGxlU2Nyb2xsOmZ1bmN0aW9uIGhhbmRsZVNjcm9sbCgpe3ZhciB3cmFwPXRoaXMud3JhcDt0aGlzLm1vdmVZPXdyYXAuc2Nyb2xsVG9wKjEwMC93cmFwLmNsaWVudEhlaWdodDt0aGlzLm1vdmVYPXdyYXAuc2Nyb2xsTGVmdCoxMDAvd3JhcC5jbGllbnRXaWR0aDt9LHVwZGF0ZTpmdW5jdGlvbiB1cGRhdGUoKXt2YXIgaGVpZ2h0UGVyY2VudGFnZT12b2lkIDAsd2lkdGhQZXJjZW50YWdlPXZvaWQgMDt2YXIgd3JhcD10aGlzLndyYXA7aWYoIXdyYXApcmV0dXJuO2hlaWdodFBlcmNlbnRhZ2U9d3JhcC5jbGllbnRIZWlnaHQqMTAwL3dyYXAuc2Nyb2xsSGVpZ2h0O3dpZHRoUGVyY2VudGFnZT13cmFwLmNsaWVudFdpZHRoKjEwMC93cmFwLnNjcm9sbFdpZHRoO3RoaXMuc2l6ZUhlaWdodD1oZWlnaHRQZXJjZW50YWdlPDEwMD9oZWlnaHRQZXJjZW50YWdlKyclJzonJzt0aGlzLnNpemVXaWR0aD13aWR0aFBlcmNlbnRhZ2U8MTAwP3dpZHRoUGVyY2VudGFnZSsnJSc6Jyc7fX0sbW91bnRlZDpmdW5jdGlvbiBtb3VudGVkKCl7aWYodGhpcy5uYXRpdmUpcmV0dXJuO3RoaXMuJG5leHRUaWNrKHRoaXMudXBkYXRlKTshdGhpcy5ub3Jlc2l6ZSYmT2JqZWN0KHJlc2l6ZV9ldmVudF9bImFkZFJlc2l6ZUxpc3RlbmVyIl0pKHRoaXMuJHJlZnMucmVzaXplLHRoaXMudXBkYXRlKTt9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpe2lmKHRoaXMubmF0aXZlKXJldHVybjshdGhpcy5ub3Jlc2l6ZSYmT2JqZWN0KHJlc2l6ZV9ldmVudF9bInJlbW92ZVJlc2l6ZUxpc3RlbmVyIl0pKHRoaXMuJHJlZnMucmVzaXplLHRoaXMudXBkYXRlKTt9fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3Njcm9sbGJhci9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL3Njcm9sbGJhcl9zcmNfbWFpbi5pbnN0YWxsPWZ1bmN0aW9uKFZ1ZSl7VnVlLmNvbXBvbmVudChzY3JvbGxiYXJfc3JjX21haW4ubmFtZSxzY3JvbGxiYXJfc3JjX21haW4pO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzY3JvbGxiYXI9c2Nyb2xsYmFyX3NyY19tYWluOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY2Fyb3VzZWwvc3JjL2l0ZW0udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTE4MDFhZTE5Jgp2YXIgaXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzE4MDFhZTE5X3JlbmRlcj1mdW5jdGlvbiBpdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfMTgwMWFlMTlfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJkaXYiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTpfdm0ucmVhZHksZXhwcmVzc2lvbjoicmVhZHkifV0sc3RhdGljQ2xhc3M6ImVsLWNhcm91c2VsX19pdGVtIixjbGFzczp7ImlzLWFjdGl2ZSI6X3ZtLmFjdGl2ZSwiZWwtY2Fyb3VzZWxfX2l0ZW0tLWNhcmQiOl92bS4kcGFyZW50LnR5cGU9PT0iY2FyZCIsImlzLWluLXN0YWdlIjpfdm0uaW5TdGFnZSwiaXMtaG92ZXIiOl92bS5ob3ZlciwiaXMtYW5pbWF0aW5nIjpfdm0uYW5pbWF0aW5nfSxzdHlsZTpfdm0uaXRlbVN0eWxlLG9uOntjbGljazpfdm0uaGFuZGxlSXRlbUNsaWNrfX0sW192bS4kcGFyZW50LnR5cGU9PT0iY2FyZCI/X2MoImRpdiIse2RpcmVjdGl2ZXM6W3tuYW1lOiJzaG93IixyYXdOYW1lOiJ2LXNob3ciLHZhbHVlOiFfdm0uYWN0aXZlLGV4cHJlc3Npb246IiFhY3RpdmUifV0sc3RhdGljQ2xhc3M6ImVsLWNhcm91c2VsX19tYXNrIn0pOl92bS5fZSgpLF92bS5fdCgiZGVmYXVsdCIpXSwyKTt9O3ZhciBpdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfMTgwMWFlMTlfc3RhdGljUmVuZGVyRm5zPVtdO2l0ZW12dWVfdHlwZV90ZW1wbGF0ZV9pZF8xODAxYWUxOV9yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2Fyb3VzZWwvc3JjL2l0ZW0udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTE4MDFhZTE5JgovLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jYXJvdXNlbC9zcmMvaXRlbS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCnZhciBDQVJEX1NDQUxFPTAuODM7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBpdGVtdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbENhcm91c2VsSXRlbScscHJvcHM6e25hbWU6U3RyaW5nLGxhYmVsOnt0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OicnfX0sZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue2hvdmVyOmZhbHNlLHRyYW5zbGF0ZTowLHNjYWxlOjEsYWN0aXZlOmZhbHNlLHJlYWR5OmZhbHNlLGluU3RhZ2U6ZmFsc2UsYW5pbWF0aW5nOmZhbHNlfTt9LG1ldGhvZHM6e3Byb2Nlc3NJbmRleDpmdW5jdGlvbiBwcm9jZXNzSW5kZXgoaW5kZXgsYWN0aXZlSW5kZXgsbGVuZ3RoKXtpZihhY3RpdmVJbmRleD09PTAmJmluZGV4PT09bGVuZ3RoLTEpe3JldHVybi0xO31lbHNlIGlmKGFjdGl2ZUluZGV4PT09bGVuZ3RoLTEmJmluZGV4PT09MCl7cmV0dXJuIGxlbmd0aDt9ZWxzZSBpZihpbmRleDxhY3RpdmVJbmRleC0xJiZhY3RpdmVJbmRleC1pbmRleD49bGVuZ3RoLzIpe3JldHVybiBsZW5ndGgrMTt9ZWxzZSBpZihpbmRleD5hY3RpdmVJbmRleCsxJiZpbmRleC1hY3RpdmVJbmRleD49bGVuZ3RoLzIpe3JldHVybi0yO31yZXR1cm4gaW5kZXg7fSxjYWxjQ2FyZFRyYW5zbGF0ZTpmdW5jdGlvbiBjYWxjQ2FyZFRyYW5zbGF0ZShpbmRleCxhY3RpdmVJbmRleCl7dmFyIHBhcmVudFdpZHRoPXRoaXMuJHBhcmVudC4kZWwub2Zmc2V0V2lkdGg7aWYodGhpcy5pblN0YWdlKXtyZXR1cm4gcGFyZW50V2lkdGgqKCgyLUNBUkRfU0NBTEUpKihpbmRleC1hY3RpdmVJbmRleCkrMSkvNDt9ZWxzZSBpZihpbmRleDxhY3RpdmVJbmRleCl7cmV0dXJuLSgxK0NBUkRfU0NBTEUpKnBhcmVudFdpZHRoLzQ7fWVsc2V7cmV0dXJuKDMrQ0FSRF9TQ0FMRSkqcGFyZW50V2lkdGgvNDt9fSxjYWxjVHJhbnNsYXRlOmZ1bmN0aW9uIGNhbGNUcmFuc2xhdGUoaW5kZXgsYWN0aXZlSW5kZXgsaXNWZXJ0aWNhbCl7dmFyIGRpc3RhbmNlPXRoaXMuJHBhcmVudC4kZWxbaXNWZXJ0aWNhbD8nb2Zmc2V0SGVpZ2h0Jzonb2Zmc2V0V2lkdGgnXTtyZXR1cm4gZGlzdGFuY2UqKGluZGV4LWFjdGl2ZUluZGV4KTt9LHRyYW5zbGF0ZUl0ZW06ZnVuY3Rpb24gdHJhbnNsYXRlSXRlbShpbmRleCxhY3RpdmVJbmRleCxvbGRJbmRleCl7dmFyIHBhcmVudFR5cGU9dGhpcy4kcGFyZW50LnR5cGU7dmFyIHBhcmVudERpcmVjdGlvbj10aGlzLnBhcmVudERpcmVjdGlvbjt2YXIgbGVuZ3RoPXRoaXMuJHBhcmVudC5pdGVtcy5sZW5ndGg7aWYocGFyZW50VHlwZSE9PSdjYXJkJyYmb2xkSW5kZXghPT11bmRlZmluZWQpe3RoaXMuYW5pbWF0aW5nPWluZGV4PT09YWN0aXZlSW5kZXh8fGluZGV4PT09b2xkSW5kZXg7fWlmKGluZGV4IT09YWN0aXZlSW5kZXgmJmxlbmd0aD4yJiZ0aGlzLiRwYXJlbnQubG9vcCl7aW5kZXg9dGhpcy5wcm9jZXNzSW5kZXgoaW5kZXgsYWN0aXZlSW5kZXgsbGVuZ3RoKTt9aWYocGFyZW50VHlwZT09PSdjYXJkJyl7aWYocGFyZW50RGlyZWN0aW9uPT09J3ZlcnRpY2FsJyl7Y29uc29sZS53YXJuKCdbRWxlbWVudCBXYXJuXVtDYXJvdXNlbF12ZXJ0aWNhbCBkaXJlY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBpbiBjYXJkIG1vZGUnKTt9dGhpcy5pblN0YWdlPU1hdGgucm91bmQoTWF0aC5hYnMoaW5kZXgtYWN0aXZlSW5kZXgpKTw9MTt0aGlzLmFjdGl2ZT1pbmRleD09PWFjdGl2ZUluZGV4O3RoaXMudHJhbnNsYXRlPXRoaXMuY2FsY0NhcmRUcmFuc2xhdGUoaW5kZXgsYWN0aXZlSW5kZXgpO3RoaXMuc2NhbGU9dGhpcy5hY3RpdmU/MTpDQVJEX1NDQUxFO31lbHNle3RoaXMuYWN0aXZlPWluZGV4PT09YWN0aXZlSW5kZXg7dmFyIGlzVmVydGljYWw9cGFyZW50RGlyZWN0aW9uPT09J3ZlcnRpY2FsJzt0aGlzLnRyYW5zbGF0ZT10aGlzLmNhbGNUcmFuc2xhdGUoaW5kZXgsYWN0aXZlSW5kZXgsaXNWZXJ0aWNhbCk7fXRoaXMucmVhZHk9dHJ1ZTt9LGhhbmRsZUl0ZW1DbGljazpmdW5jdGlvbiBoYW5kbGVJdGVtQ2xpY2soKXt2YXIgcGFyZW50PXRoaXMuJHBhcmVudDtpZihwYXJlbnQmJnBhcmVudC50eXBlPT09J2NhcmQnKXt2YXIgaW5kZXg9cGFyZW50Lml0ZW1zLmluZGV4T2YodGhpcyk7cGFyZW50LnNldEFjdGl2ZUl0ZW0oaW5kZXgpO319fSxjb21wdXRlZDp7cGFyZW50RGlyZWN0aW9uOmZ1bmN0aW9uIHBhcmVudERpcmVjdGlvbigpe3JldHVybiB0aGlzLiRwYXJlbnQuZGlyZWN0aW9uO30saXRlbVN0eWxlOmZ1bmN0aW9uIGl0ZW1TdHlsZSgpe3ZhciB0cmFuc2xhdGVUeXBlPXRoaXMucGFyZW50RGlyZWN0aW9uPT09J3ZlcnRpY2FsJz8ndHJhbnNsYXRlWSc6J3RyYW5zbGF0ZVgnO3ZhciB2YWx1ZT10cmFuc2xhdGVUeXBlKycoJyt0aGlzLnRyYW5zbGF0ZSsncHgpIHNjYWxlKCcrdGhpcy5zY2FsZSsnKSc7dmFyIHN0eWxlPXt0cmFuc2Zvcm06dmFsdWV9O3JldHVybiBPYmplY3QodXRpbF9bImF1dG9wcmVmaXhlciJdKShzdHlsZSk7fX0sY3JlYXRlZDpmdW5jdGlvbiBjcmVhdGVkKCl7dGhpcy4kcGFyZW50JiZ0aGlzLiRwYXJlbnQudXBkYXRlSXRlbXMoKTt9LGRlc3Ryb3llZDpmdW5jdGlvbiBkZXN0cm95ZWQoKXt0aGlzLiRwYXJlbnQmJnRoaXMuJHBhcmVudC51cGRhdGVJdGVtcygpO319Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2Fyb3VzZWwvc3JjL2l0ZW0udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHNyY19pdGVtdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPWl0ZW12dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXJvdXNlbC9zcmMvaXRlbS52dWUKLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciBpdGVtX2NvbXBvbmVudD1ub3JtYWxpemVDb21wb25lbnQoc3JjX2l0ZW12dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18saXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzE4MDFhZTE5X3JlbmRlcixpdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfMTgwMWFlMTlfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciBpdGVtX2FwaTt9aXRlbV9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL2Nhcm91c2VsL3NyYy9pdGVtLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfaXRlbT1pdGVtX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2Fyb3VzZWwtaXRlbS9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL3NyY19pdGVtLmluc3RhbGw9ZnVuY3Rpb24oVnVlKXtWdWUuY29tcG9uZW50KHNyY19pdGVtLm5hbWUsc3JjX2l0ZW0pO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBjYXJvdXNlbF9pdGVtPXNyY19pdGVtOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY29sbGFwc2Uvc3JjL2NvbGxhcHNlLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD00NjFkNTdmNCYKdmFyIGNvbGxhcHNldnVlX3R5cGVfdGVtcGxhdGVfaWRfNDYxZDU3ZjRfcmVuZGVyPWZ1bmN0aW9uIGNvbGxhcHNldnVlX3R5cGVfdGVtcGxhdGVfaWRfNDYxZDU3ZjRfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtY29sbGFwc2UiLGF0dHJzOntyb2xlOiJ0YWJsaXN0IiwiYXJpYS1tdWx0aXNlbGVjdGFibGUiOiJ0cnVlIn19LFtfdm0uX3QoImRlZmF1bHQiKV0sMik7fTt2YXIgY29sbGFwc2V2dWVfdHlwZV90ZW1wbGF0ZV9pZF80NjFkNTdmNF9zdGF0aWNSZW5kZXJGbnM9W107Y29sbGFwc2V2dWVfdHlwZV90ZW1wbGF0ZV9pZF80NjFkNTdmNF9yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY29sbGFwc2Uvc3JjL2NvbGxhcHNlLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD00NjFkNTdmNCYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY29sbGFwc2Uvc3JjL2NvbGxhcHNlLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLy8KLy8KLy8KLy8KLy8KLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBjb2xsYXBzZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17bmFtZTonRWxDb2xsYXBzZScsY29tcG9uZW50TmFtZTonRWxDb2xsYXBzZScscHJvcHM6e2FjY29yZGlvbjpCb29sZWFuLHZhbHVlOnt0eXBlOltBcnJheSxTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OmZ1bmN0aW9uIF9kZWZhdWx0KCl7cmV0dXJuW107fX19LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybnthY3RpdmVOYW1lczpbXS5jb25jYXQodGhpcy52YWx1ZSl9O30scHJvdmlkZTpmdW5jdGlvbiBwcm92aWRlKCl7cmV0dXJue2NvbGxhcHNlOnRoaXN9O30sd2F0Y2g6e3ZhbHVlOmZ1bmN0aW9uIHZhbHVlKF92YWx1ZSl7dGhpcy5hY3RpdmVOYW1lcz1bXS5jb25jYXQoX3ZhbHVlKTt9fSxtZXRob2RzOntzZXRBY3RpdmVOYW1lczpmdW5jdGlvbiBzZXRBY3RpdmVOYW1lcyhhY3RpdmVOYW1lcyl7YWN0aXZlTmFtZXM9W10uY29uY2F0KGFjdGl2ZU5hbWVzKTt2YXIgdmFsdWU9dGhpcy5hY2NvcmRpb24/YWN0aXZlTmFtZXNbMF06YWN0aXZlTmFtZXM7dGhpcy5hY3RpdmVOYW1lcz1hY3RpdmVOYW1lczt0aGlzLiRlbWl0KCdpbnB1dCcsdmFsdWUpO3RoaXMuJGVtaXQoJ2NoYW5nZScsdmFsdWUpO30saGFuZGxlSXRlbUNsaWNrOmZ1bmN0aW9uIGhhbmRsZUl0ZW1DbGljayhpdGVtKXtpZih0aGlzLmFjY29yZGlvbil7dGhpcy5zZXRBY3RpdmVOYW1lcygodGhpcy5hY3RpdmVOYW1lc1swXXx8dGhpcy5hY3RpdmVOYW1lc1swXT09PTApJiZ0aGlzLmFjdGl2ZU5hbWVzWzBdPT09aXRlbS5uYW1lPycnOml0ZW0ubmFtZSk7fWVsc2V7dmFyIGFjdGl2ZU5hbWVzPXRoaXMuYWN0aXZlTmFtZXMuc2xpY2UoMCk7dmFyIGluZGV4PWFjdGl2ZU5hbWVzLmluZGV4T2YoaXRlbS5uYW1lKTtpZihpbmRleD4tMSl7YWN0aXZlTmFtZXMuc3BsaWNlKGluZGV4LDEpO31lbHNle2FjdGl2ZU5hbWVzLnB1c2goaXRlbS5uYW1lKTt9dGhpcy5zZXRBY3RpdmVOYW1lcyhhY3RpdmVOYW1lcyk7fX19LGNyZWF0ZWQ6ZnVuY3Rpb24gY3JlYXRlZCgpe3RoaXMuJG9uKCdpdGVtLWNsaWNrJyx0aGlzLmhhbmRsZUl0ZW1DbGljayk7fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jb2xsYXBzZS9zcmMvY29sbGFwc2UudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHNyY19jb2xsYXBzZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz1jb2xsYXBzZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NvbGxhcHNlL3NyYy9jb2xsYXBzZS52dWUKLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciBjb2xsYXBzZV9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHNyY19jb2xsYXBzZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxjb2xsYXBzZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQ2MWQ1N2Y0X3JlbmRlcixjb2xsYXBzZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQ2MWQ1N2Y0X3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgY29sbGFwc2VfYXBpO31jb2xsYXBzZV9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL2NvbGxhcHNlL3NyYy9jb2xsYXBzZS52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgY29sbGFwc2U9Y29sbGFwc2VfY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jb2xsYXBzZS9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL2NvbGxhcHNlLmluc3RhbGw9ZnVuY3Rpb24oVnVlKXtWdWUuY29tcG9uZW50KGNvbGxhcHNlLm5hbWUsY29sbGFwc2UpO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYWNrYWdlc19jb2xsYXBzZT1jb2xsYXBzZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2NvbGxhcHNlL3NyYy9jb2xsYXBzZS1pdGVtLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0yZDA1ZmFhYyYKdmFyIGNvbGxhcHNlX2l0ZW12dWVfdHlwZV90ZW1wbGF0ZV9pZF8yZDA1ZmFhY19yZW5kZXI9ZnVuY3Rpb24gY29sbGFwc2VfaXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzJkMDVmYWFjX3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLWNvbGxhcHNlLWl0ZW0iLGNsYXNzOnsiaXMtYWN0aXZlIjpfdm0uaXNBY3RpdmUsImlzLWRpc2FibGVkIjpfdm0uZGlzYWJsZWR9fSxbX2MoImRpdiIse2F0dHJzOntyb2xlOiJ0YWIiLCJhcmlhLWV4cGFuZGVkIjpfdm0uaXNBY3RpdmUsImFyaWEtY29udHJvbHMiOiJlbC1jb2xsYXBzZS1jb250ZW50LSIrX3ZtLmlkLCJhcmlhLWRlc2NyaWJlZGJ5IjoiZWwtY29sbGFwc2UtY29udGVudC0iK192bS5pZH19LFtfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLWNvbGxhcHNlLWl0ZW1fX2hlYWRlciIsY2xhc3M6e2ZvY3VzaW5nOl92bS5mb2N1c2luZywiaXMtYWN0aXZlIjpfdm0uaXNBY3RpdmV9LGF0dHJzOntyb2xlOiJidXR0b24iLGlkOiJlbC1jb2xsYXBzZS1oZWFkLSIrX3ZtLmlkLHRhYmluZGV4Ol92bS5kaXNhYmxlZD91bmRlZmluZWQ6MH0sb246e2NsaWNrOl92bS5oYW5kbGVIZWFkZXJDbGljayxrZXl1cDpmdW5jdGlvbiBrZXl1cCgkZXZlbnQpe2lmKCEoImJ1dHRvbiJpbiAkZXZlbnQpJiZfdm0uX2soJGV2ZW50LmtleUNvZGUsInNwYWNlIiwzMiwkZXZlbnQua2V5LFsiICIsIlNwYWNlYmFyIl0pJiZfdm0uX2soJGV2ZW50LmtleUNvZGUsImVudGVyIiwxMywkZXZlbnQua2V5LCJFbnRlciIpKXtyZXR1cm4gbnVsbDt9JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO3JldHVybiBfdm0uaGFuZGxlRW50ZXJDbGljaygkZXZlbnQpO30sZm9jdXM6X3ZtLmhhbmRsZUZvY3VzLGJsdXI6ZnVuY3Rpb24gYmx1cigkZXZlbnQpe192bS5mb2N1c2luZz1mYWxzZTt9fX0sW192bS5fdCgidGl0bGUiLFtfdm0uX3YoX3ZtLl9zKF92bS50aXRsZSkpXSksX2MoImkiLHtzdGF0aWNDbGFzczoiZWwtY29sbGFwc2UtaXRlbV9fYXJyb3cgZWwtaWNvbi1hcnJvdy1yaWdodCIsY2xhc3M6eyJpcy1hY3RpdmUiOl92bS5pc0FjdGl2ZX19KV0sMildKSxfYygiZWwtY29sbGFwc2UtdHJhbnNpdGlvbiIsW19jKCJkaXYiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTpfdm0uaXNBY3RpdmUsZXhwcmVzc2lvbjoiaXNBY3RpdmUifV0sc3RhdGljQ2xhc3M6ImVsLWNvbGxhcHNlLWl0ZW1fX3dyYXAiLGF0dHJzOntyb2xlOiJ0YWJwYW5lbCIsImFyaWEtaGlkZGVuIjohX3ZtLmlzQWN0aXZlLCJhcmlhLWxhYmVsbGVkYnkiOiJlbC1jb2xsYXBzZS1oZWFkLSIrX3ZtLmlkLGlkOiJlbC1jb2xsYXBzZS1jb250ZW50LSIrX3ZtLmlkfX0sW19jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtY29sbGFwc2UtaXRlbV9fY29udGVudCJ9LFtfdm0uX3QoImRlZmF1bHQiKV0sMildKV0pXSwxKTt9O3ZhciBjb2xsYXBzZV9pdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfMmQwNWZhYWNfc3RhdGljUmVuZGVyRm5zPVtdO2NvbGxhcHNlX2l0ZW12dWVfdHlwZV90ZW1wbGF0ZV9pZF8yZDA1ZmFhY19yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY29sbGFwc2Uvc3JjL2NvbGxhcHNlLWl0ZW0udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTJkMDVmYWFjJgovLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jb2xsYXBzZS9zcmMvY29sbGFwc2UtaXRlbS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgY29sbGFwc2VfaXRlbXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17bmFtZTonRWxDb2xsYXBzZUl0ZW0nLGNvbXBvbmVudE5hbWU6J0VsQ29sbGFwc2VJdGVtJyxtaXhpbnM6W2VtaXR0ZXJfZGVmYXVsdC5hXSxjb21wb25lbnRzOntFbENvbGxhcHNlVHJhbnNpdGlvbjpjb2xsYXBzZV90cmFuc2l0aW9uX2RlZmF1bHQuYX0sZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue2NvbnRlbnRXcmFwU3R5bGU6e2hlaWdodDonYXV0bycsZGlzcGxheTonYmxvY2snfSxjb250ZW50SGVpZ2h0OjAsZm9jdXNpbmc6ZmFsc2UsaXNDbGljazpmYWxzZSxpZDpPYmplY3QodXRpbF9bImdlbmVyYXRlSWQiXSkoKX07fSxpbmplY3Q6Wydjb2xsYXBzZSddLHByb3BzOnt0aXRsZTpTdHJpbmcsbmFtZTp7dHlwZTpbU3RyaW5nLE51bWJlcl0sZGVmYXVsdDpmdW5jdGlvbiBfZGVmYXVsdCgpe3JldHVybiB0aGlzLl91aWQ7fX0sZGlzYWJsZWQ6Qm9vbGVhbn0sY29tcHV0ZWQ6e2lzQWN0aXZlOmZ1bmN0aW9uIGlzQWN0aXZlKCl7cmV0dXJuIHRoaXMuY29sbGFwc2UuYWN0aXZlTmFtZXMuaW5kZXhPZih0aGlzLm5hbWUpPi0xO319LG1ldGhvZHM6e2hhbmRsZUZvY3VzOmZ1bmN0aW9uIGhhbmRsZUZvY3VzKCl7dmFyIF90aGlzPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2lmKCFfdGhpcy5pc0NsaWNrKXtfdGhpcy5mb2N1c2luZz10cnVlO31lbHNle190aGlzLmlzQ2xpY2s9ZmFsc2U7fX0sNTApO30saGFuZGxlSGVhZGVyQ2xpY2s6ZnVuY3Rpb24gaGFuZGxlSGVhZGVyQ2xpY2soKXtpZih0aGlzLmRpc2FibGVkKXJldHVybjt0aGlzLmRpc3BhdGNoKCdFbENvbGxhcHNlJywnaXRlbS1jbGljaycsdGhpcyk7dGhpcy5mb2N1c2luZz1mYWxzZTt0aGlzLmlzQ2xpY2s9dHJ1ZTt9LGhhbmRsZUVudGVyQ2xpY2s6ZnVuY3Rpb24gaGFuZGxlRW50ZXJDbGljaygpe3RoaXMuZGlzcGF0Y2goJ0VsQ29sbGFwc2UnLCdpdGVtLWNsaWNrJyx0aGlzKTt9fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jb2xsYXBzZS9zcmMvY29sbGFwc2UtaXRlbS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc3JjX2NvbGxhcHNlX2l0ZW12dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189Y29sbGFwc2VfaXRlbXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NvbGxhcHNlL3NyYy9jb2xsYXBzZS1pdGVtLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIGNvbGxhcHNlX2l0ZW1fY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChzcmNfY29sbGFwc2VfaXRlbXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxjb2xsYXBzZV9pdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfMmQwNWZhYWNfcmVuZGVyLGNvbGxhcHNlX2l0ZW12dWVfdHlwZV90ZW1wbGF0ZV9pZF8yZDA1ZmFhY19zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIGNvbGxhcHNlX2l0ZW1fYXBpO31jb2xsYXBzZV9pdGVtX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvY29sbGFwc2Uvc3JjL2NvbGxhcHNlLWl0ZW0udnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGNvbGxhcHNlX2l0ZW09Y29sbGFwc2VfaXRlbV9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NvbGxhcHNlLWl0ZW0vaW5kZXguanMKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9jb2xsYXBzZV9pdGVtLmluc3RhbGw9ZnVuY3Rpb24oVnVlKXtWdWUuY29tcG9uZW50KGNvbGxhcHNlX2l0ZW0ubmFtZSxjb2xsYXBzZV9pdGVtKTt9Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFja2FnZXNfY29sbGFwc2VfaXRlbT1jb2xsYXBzZV9pdGVtOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY2FzY2FkZXIvc3JjL2Nhc2NhZGVyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0wMzI1MzdhNiYKdmFyIGNhc2NhZGVydnVlX3R5cGVfdGVtcGxhdGVfaWRfMDMyNTM3YTZfcmVuZGVyPWZ1bmN0aW9uIGNhc2NhZGVydnVlX3R5cGVfdGVtcGxhdGVfaWRfMDMyNTM3YTZfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJkaXYiLHtkaXJlY3RpdmVzOlt7bmFtZToiY2xpY2tvdXRzaWRlIixyYXdOYW1lOiJ2LWNsaWNrb3V0c2lkZSIsdmFsdWU6ZnVuY3Rpb24gdmFsdWUoKXtyZXR1cm4gX3ZtLnRvZ2dsZURyb3BEb3duVmlzaWJsZShmYWxzZSk7fSxleHByZXNzaW9uOiIoKSA9PiB0b2dnbGVEcm9wRG93blZpc2libGUoZmFsc2UpIn1dLHJlZjoicmVmZXJlbmNlIixjbGFzczpbImVsLWNhc2NhZGVyIixfdm0ucmVhbFNpemUmJiJlbC1jYXNjYWRlci0tIitfdm0ucmVhbFNpemUseyJpcy1kaXNhYmxlZCI6X3ZtLmlzRGlzYWJsZWR9XSxvbjp7bW91c2VlbnRlcjpmdW5jdGlvbiBtb3VzZWVudGVyKCRldmVudCl7X3ZtLmlucHV0SG92ZXI9dHJ1ZTt9LG1vdXNlbGVhdmU6ZnVuY3Rpb24gbW91c2VsZWF2ZSgkZXZlbnQpe192bS5pbnB1dEhvdmVyPWZhbHNlO30sY2xpY2s6ZnVuY3Rpb24gY2xpY2soKXtyZXR1cm4gX3ZtLnRvZ2dsZURyb3BEb3duVmlzaWJsZShfdm0ucmVhZG9ubHk/dW5kZWZpbmVkOnRydWUpO30sa2V5ZG93bjpfdm0uaGFuZGxlS2V5RG93bn19LFtfYygiZWwtaW5wdXQiLHtyZWY6ImlucHV0IixjbGFzczp7ImlzLWZvY3VzIjpfdm0uZHJvcERvd25WaXNpYmxlfSxhdHRyczp7c2l6ZTpfdm0ucmVhbFNpemUscGxhY2Vob2xkZXI6X3ZtLnBsYWNlaG9sZGVyLHJlYWRvbmx5Ol92bS5yZWFkb25seSxkaXNhYmxlZDpfdm0uaXNEaXNhYmxlZCwidmFsaWRhdGUtZXZlbnQiOmZhbHNlfSxvbjp7Zm9jdXM6X3ZtLmhhbmRsZUZvY3VzLGJsdXI6X3ZtLmhhbmRsZUJsdXIsaW5wdXQ6X3ZtLmhhbmRsZUlucHV0fSxtb2RlbDp7dmFsdWU6X3ZtLm11bHRpcGxlP192bS5wcmVzZW50VGV4dDpfdm0uaW5wdXRWYWx1ZSxjYWxsYmFjazpmdW5jdGlvbiBjYWxsYmFjaygkJHYpe192bS5tdWx0aXBsZT9fdm0ucHJlc2VudFRleHQ6X3ZtLmlucHV0VmFsdWU9JCR2O30sZXhwcmVzc2lvbjoibXVsdGlwbGUgPyBwcmVzZW50VGV4dCA6IGlucHV0VmFsdWUifX0sW19jKCJ0ZW1wbGF0ZSIse3Nsb3Q6InN1ZmZpeCJ9LFtfdm0uY2xlYXJCdG5WaXNpYmxlP19jKCJpIix7a2V5OiJjbGVhciIsc3RhdGljQ2xhc3M6ImVsLWlucHV0X19pY29uIGVsLWljb24tY2lyY2xlLWNsb3NlIixvbjp7Y2xpY2s6ZnVuY3Rpb24gY2xpY2soJGV2ZW50KXskZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7cmV0dXJuIF92bS5oYW5kbGVDbGVhcigkZXZlbnQpO319fSk6X2MoImkiLHtrZXk6ImFycm93LWRvd24iLGNsYXNzOlsiZWwtaW5wdXRfX2ljb24iLCJlbC1pY29uLWFycm93LWRvd24iLF92bS5kcm9wRG93blZpc2libGUmJiJpcy1yZXZlcnNlIl0sb246e2NsaWNrOmZ1bmN0aW9uIGNsaWNrKCRldmVudCl7JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO192bS50b2dnbGVEcm9wRG93blZpc2libGUoKTt9fX0pXSldLDIpLF92bS5tdWx0aXBsZT9fYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLWNhc2NhZGVyX190YWdzIn0sW192bS5fbChfdm0ucHJlc2VudFRhZ3MsZnVuY3Rpb24odGFnLGluZGV4KXtyZXR1cm4gX2MoImVsLXRhZyIse2tleTp0YWcua2V5LGF0dHJzOnt0eXBlOiJpbmZvIixzaXplOl92bS50YWdTaXplLGhpdDp0YWcuaGl0U3RhdGUsY2xvc2FibGU6dGFnLmNsb3NhYmxlLCJkaXNhYmxlLXRyYW5zaXRpb25zIjoiIn0sb246e2Nsb3NlOmZ1bmN0aW9uIGNsb3NlKCRldmVudCl7X3ZtLmRlbGV0ZVRhZyhpbmRleCk7fX19LFtfYygic3BhbiIsW192bS5fdihfdm0uX3ModGFnLnRleHQpKV0pXSk7fSksX3ZtLmZpbHRlcmFibGUmJiFfdm0uaXNEaXNhYmxlZD9fYygiaW5wdXQiLHtkaXJlY3RpdmVzOlt7bmFtZToibW9kZWwiLHJhd05hbWU6InYtbW9kZWwudHJpbSIsdmFsdWU6X3ZtLmlucHV0VmFsdWUsZXhwcmVzc2lvbjoiaW5wdXRWYWx1ZSIsbW9kaWZpZXJzOnt0cmltOnRydWV9fV0sc3RhdGljQ2xhc3M6ImVsLWNhc2NhZGVyX19zZWFyY2gtaW5wdXQiLGF0dHJzOnt0eXBlOiJ0ZXh0IixwbGFjZWhvbGRlcjpfdm0ucHJlc2VudFRhZ3MubGVuZ3RoPyIiOl92bS5wbGFjZWhvbGRlcn0sZG9tUHJvcHM6e3ZhbHVlOl92bS5pbnB1dFZhbHVlfSxvbjp7aW5wdXQ6W2Z1bmN0aW9uKCRldmVudCl7aWYoJGV2ZW50LnRhcmdldC5jb21wb3Npbmcpe3JldHVybjt9X3ZtLmlucHV0VmFsdWU9JGV2ZW50LnRhcmdldC52YWx1ZS50cmltKCk7fSxmdW5jdGlvbihlKXtyZXR1cm4gX3ZtLmhhbmRsZUlucHV0KF92bS5pbnB1dFZhbHVlLGUpO31dLGNsaWNrOmZ1bmN0aW9uIGNsaWNrKCRldmVudCl7JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO192bS50b2dnbGVEcm9wRG93blZpc2libGUodHJ1ZSk7fSxrZXlkb3duOmZ1bmN0aW9uIGtleWRvd24oJGV2ZW50KXtpZighKCJidXR0b24iaW4gJGV2ZW50KSYmX3ZtLl9rKCRldmVudC5rZXlDb2RlLCJkZWxldGUiLFs4LDQ2XSwkZXZlbnQua2V5LFsiQmFja3NwYWNlIiwiRGVsZXRlIiwiRGVsIl0pKXtyZXR1cm4gbnVsbDt9cmV0dXJuIF92bS5oYW5kbGVEZWxldGUoJGV2ZW50KTt9LGJsdXI6ZnVuY3Rpb24gYmx1cigkZXZlbnQpe192bS4kZm9yY2VVcGRhdGUoKTt9fX0pOl92bS5fZSgpXSwyKTpfdm0uX2UoKSxfYygidHJhbnNpdGlvbiIse2F0dHJzOntuYW1lOiJlbC16b29tLWluLXRvcCJ9LG9uOnsiYWZ0ZXItbGVhdmUiOl92bS5oYW5kbGVEcm9wZG93bkxlYXZlfX0sW19jKCJkaXYiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTpfdm0uZHJvcERvd25WaXNpYmxlLGV4cHJlc3Npb246ImRyb3BEb3duVmlzaWJsZSJ9XSxyZWY6InBvcHBlciIsY2xhc3M6WyJlbC1wb3BwZXIiLCJlbC1jYXNjYWRlcl9fZHJvcGRvd24iLF92bS5wb3BwZXJDbGFzc119LFtfYygiZWwtY2FzY2FkZXItcGFuZWwiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTohX3ZtLmZpbHRlcmluZyxleHByZXNzaW9uOiIhZmlsdGVyaW5nIn1dLHJlZjoicGFuZWwiLGF0dHJzOntvcHRpb25zOl92bS5vcHRpb25zLHByb3BzOl92bS5jb25maWcsYm9yZGVyOmZhbHNlLCJyZW5kZXItbGFiZWwiOl92bS4kc2NvcGVkU2xvdHMuZGVmYXVsdH0sb246eyJleHBhbmQtY2hhbmdlIjpfdm0uaGFuZGxlRXhwYW5kQ2hhbmdlLGNsb3NlOmZ1bmN0aW9uIGNsb3NlKCRldmVudCl7X3ZtLnRvZ2dsZURyb3BEb3duVmlzaWJsZShmYWxzZSk7fX0sbW9kZWw6e3ZhbHVlOl92bS5jaGVja2VkVmFsdWUsY2FsbGJhY2s6ZnVuY3Rpb24gY2FsbGJhY2soJCR2KXtfdm0uY2hlY2tlZFZhbHVlPSQkdjt9LGV4cHJlc3Npb246ImNoZWNrZWRWYWx1ZSJ9fSksX3ZtLmZpbHRlcmFibGU/X2MoImVsLXNjcm9sbGJhciIse2RpcmVjdGl2ZXM6W3tuYW1lOiJzaG93IixyYXdOYW1lOiJ2LXNob3ciLHZhbHVlOl92bS5maWx0ZXJpbmcsZXhwcmVzc2lvbjoiZmlsdGVyaW5nIn1dLHJlZjoic3VnZ2VzdGlvblBhbmVsIixzdGF0aWNDbGFzczoiZWwtY2FzY2FkZXJfX3N1Z2dlc3Rpb24tcGFuZWwiLGF0dHJzOnt0YWc6InVsIiwidmlldy1jbGFzcyI6ImVsLWNhc2NhZGVyX19zdWdnZXN0aW9uLWxpc3QifSxuYXRpdmVPbjp7a2V5ZG93bjpmdW5jdGlvbiBrZXlkb3duKCRldmVudCl7cmV0dXJuIF92bS5oYW5kbGVTdWdnZXN0aW9uS2V5RG93bigkZXZlbnQpO319fSxbX3ZtLnN1Z2dlc3Rpb25zLmxlbmd0aD9fdm0uX2woX3ZtLnN1Z2dlc3Rpb25zLGZ1bmN0aW9uKGl0ZW0saW5kZXgpe3JldHVybiBfYygibGkiLHtrZXk6aXRlbS51aWQsY2xhc3M6WyJlbC1jYXNjYWRlcl9fc3VnZ2VzdGlvbi1pdGVtIixpdGVtLmNoZWNrZWQmJiJpcy1jaGVja2VkIl0sYXR0cnM6e3RhYmluZGV4Oi0xfSxvbjp7Y2xpY2s6ZnVuY3Rpb24gY2xpY2soJGV2ZW50KXtfdm0uaGFuZGxlU3VnZ2VzdGlvbkNsaWNrKGluZGV4KTt9fX0sW19jKCJzcGFuIixbX3ZtLl92KF92bS5fcyhpdGVtLnRleHQpKV0pLGl0ZW0uY2hlY2tlZD9fYygiaSIse3N0YXRpY0NsYXNzOiJlbC1pY29uLWNoZWNrIn0pOl92bS5fZSgpXSk7fSk6X3ZtLl90KCJlbXB0eSIsW19jKCJsaSIse3N0YXRpY0NsYXNzOiJlbC1jYXNjYWRlcl9fZW1wdHktdGV4dCJ9LFtfdm0uX3YoX3ZtLl9zKF92bS50KCJlbC5jYXNjYWRlci5ub01hdGNoIikpKV0pXSldLDIpOl92bS5fZSgpXSwxKV0pXSwxKTt9O3ZhciBjYXNjYWRlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzAzMjUzN2E2X3N0YXRpY1JlbmRlckZucz1bXTtjYXNjYWRlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzAzMjUzN2E2X3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXNjYWRlci9zcmMvY2FzY2FkZXIudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTAzMjUzN2E2JgovLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsICJlbGVtZW50LXVpL2xpYi9jYXNjYWRlci1wYW5lbCIKdmFyIGNhc2NhZGVyX3BhbmVsXz1fX3dlYnBhY2tfcmVxdWlyZV9fKDQyKTt2YXIgY2FzY2FkZXJfcGFuZWxfZGVmYXVsdD0vKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNhc2NhZGVyX3BhbmVsXyk7Ly8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCAiZWxlbWVudC11aS9saWIvdXRpbHMvYXJpYS11dGlscyIKdmFyIGFyaWFfdXRpbHNfPV9fd2VicGFja19yZXF1aXJlX18oMjgpO3ZhciBhcmlhX3V0aWxzX2RlZmF1bHQ9LyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihhcmlhX3V0aWxzXyk7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY2FzY2FkZXIvc3JjL2Nhc2NhZGVyLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KdmFyIEtleUNvZGU9YXJpYV91dGlsc19kZWZhdWx0LmEua2V5czt2YXIgTWlncmF0aW5nUHJvcHM9e2V4cGFuZFRyaWdnZXI6e25ld1Byb3A6J2V4cGFuZFRyaWdnZXInLHR5cGU6U3RyaW5nfSxjaGFuZ2VPblNlbGVjdDp7bmV3UHJvcDonY2hlY2tTdHJpY3RseScsdHlwZTpCb29sZWFufSxob3ZlclRocmVzaG9sZDp7bmV3UHJvcDonaG92ZXJUaHJlc2hvbGQnLHR5cGU6TnVtYmVyfX07dmFyIFBvcHBlck1peGluPXtwcm9wczp7cGxhY2VtZW50Ont0eXBlOlN0cmluZyxkZWZhdWx0Oidib3R0b20tc3RhcnQnfSxhcHBlbmRUb0JvZHk6dnVlX3BvcHBlcl9kZWZhdWx0LmEucHJvcHMuYXBwZW5kVG9Cb2R5LHZpc2libGVBcnJvdzp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6dHJ1ZX0sYXJyb3dPZmZzZXQ6dnVlX3BvcHBlcl9kZWZhdWx0LmEucHJvcHMuYXJyb3dPZmZzZXQsb2Zmc2V0OnZ1ZV9wb3BwZXJfZGVmYXVsdC5hLnByb3BzLm9mZnNldCxib3VuZGFyaWVzUGFkZGluZzp2dWVfcG9wcGVyX2RlZmF1bHQuYS5wcm9wcy5ib3VuZGFyaWVzUGFkZGluZyxwb3BwZXJPcHRpb25zOnZ1ZV9wb3BwZXJfZGVmYXVsdC5hLnByb3BzLnBvcHBlck9wdGlvbnN9LG1ldGhvZHM6dnVlX3BvcHBlcl9kZWZhdWx0LmEubWV0aG9kcyxkYXRhOnZ1ZV9wb3BwZXJfZGVmYXVsdC5hLmRhdGEsYmVmb3JlRGVzdHJveTp2dWVfcG9wcGVyX2RlZmF1bHQuYS5iZWZvcmVEZXN0cm95fTt2YXIgSW5wdXRTaXplTWFwPXttZWRpdW06MzYsc21hbGw6MzIsbWluaToyOH07LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBjYXNjYWRlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17bmFtZTonRWxDYXNjYWRlcicsZGlyZWN0aXZlczp7Q2xpY2tvdXRzaWRlOmNsaWNrb3V0c2lkZV9kZWZhdWx0LmF9LG1peGluczpbUG9wcGVyTWl4aW4sZW1pdHRlcl9kZWZhdWx0LmEsbG9jYWxlX2RlZmF1bHQuYSxtaWdyYXRpbmdfZGVmYXVsdC5hXSxpbmplY3Q6e2VsRm9ybTp7ZGVmYXVsdDonJ30sZWxGb3JtSXRlbTp7ZGVmYXVsdDonJ319LGNvbXBvbmVudHM6e0VsSW5wdXQ6aW5wdXRfZGVmYXVsdC5hLEVsVGFnOnRhZ19kZWZhdWx0LmEsRWxTY3JvbGxiYXI6c2Nyb2xsYmFyX2RlZmF1bHQuYSxFbENhc2NhZGVyUGFuZWw6Y2FzY2FkZXJfcGFuZWxfZGVmYXVsdC5hfSxwcm9wczp7dmFsdWU6e30sb3B0aW9uczpBcnJheSxwcm9wczpPYmplY3Qsc2l6ZTpTdHJpbmcscGxhY2Vob2xkZXI6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6ZnVuY3Rpb24gX2RlZmF1bHQoKXtyZXR1cm4gT2JqZWN0KGxpYl9sb2NhbGVfWyJ0Il0pKCdlbC5jYXNjYWRlci5wbGFjZWhvbGRlcicpO319LGRpc2FibGVkOkJvb2xlYW4sY2xlYXJhYmxlOkJvb2xlYW4sZmlsdGVyYWJsZTpCb29sZWFuLGZpbHRlck1ldGhvZDpGdW5jdGlvbixzZXBhcmF0b3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6JyAvICd9LHNob3dBbGxMZXZlbHM6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OnRydWV9LGNvbGxhcHNlVGFnczpCb29sZWFuLGRlYm91bmNlOnt0eXBlOk51bWJlcixkZWZhdWx0OjMwMH0sYmVmb3JlRmlsdGVyOnt0eXBlOkZ1bmN0aW9uLGRlZmF1bHQ6ZnVuY3Rpb24gX2RlZmF1bHQoKXtyZXR1cm4gZnVuY3Rpb24oKXt9O319LHBvcHBlckNsYXNzOlN0cmluZ30sZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue2Ryb3BEb3duVmlzaWJsZTpmYWxzZSxjaGVja2VkVmFsdWU6dGhpcy52YWx1ZXx8bnVsbCxpbnB1dEhvdmVyOmZhbHNlLGlucHV0VmFsdWU6bnVsbCxwcmVzZW50VGV4dDpudWxsLHByZXNlbnRUYWdzOltdLGNoZWNrZWROb2RlczpbXSxmaWx0ZXJpbmc6ZmFsc2Usc3VnZ2VzdGlvbnM6W10saW5wdXRJbml0aWFsSGVpZ2h0OjAscHJlc3NEZWxldGVDb3VudDowfTt9LGNvbXB1dGVkOntyZWFsU2l6ZTpmdW5jdGlvbiByZWFsU2l6ZSgpe3ZhciBfZWxGb3JtSXRlbVNpemU9KHRoaXMuZWxGb3JtSXRlbXx8e30pLmVsRm9ybUl0ZW1TaXplO3JldHVybiB0aGlzLnNpemV8fF9lbEZvcm1JdGVtU2l6ZXx8KHRoaXMuJEVMRU1FTlR8fHt9KS5zaXplO30sdGFnU2l6ZTpmdW5jdGlvbiB0YWdTaXplKCl7cmV0dXJuWydzbWFsbCcsJ21pbmknXS5pbmRleE9mKHRoaXMucmVhbFNpemUpPi0xPydtaW5pJzonc21hbGwnO30saXNEaXNhYmxlZDpmdW5jdGlvbiBpc0Rpc2FibGVkKCl7cmV0dXJuIHRoaXMuZGlzYWJsZWR8fCh0aGlzLmVsRm9ybXx8e30pLmRpc2FibGVkO30sY29uZmlnOmZ1bmN0aW9uIGNvbmZpZygpe3ZhciBjb25maWc9dGhpcy5wcm9wc3x8e307dmFyICRhdHRycz10aGlzLiRhdHRycztPYmplY3Qua2V5cyhNaWdyYXRpbmdQcm9wcykuZm9yRWFjaChmdW5jdGlvbihvbGRQcm9wKXt2YXIgX01pZ3JhdGluZ1Byb3BzJG9sZFByPU1pZ3JhdGluZ1Byb3BzW29sZFByb3BdLG5ld1Byb3A9X01pZ3JhdGluZ1Byb3BzJG9sZFByLm5ld1Byb3AsdHlwZT1fTWlncmF0aW5nUHJvcHMkb2xkUHIudHlwZTt2YXIgb2xkVmFsdWU9JGF0dHJzW29sZFByb3BdfHwkYXR0cnNbT2JqZWN0KHV0aWxfWyJrZWJhYkNhc2UiXSkob2xkUHJvcCldO2lmKE9iamVjdChzaGFyZWRfWyJpc0RlZiJdKShvbGRQcm9wKSYmIU9iamVjdChzaGFyZWRfWyJpc0RlZiJdKShjb25maWdbbmV3UHJvcF0pKXtpZih0eXBlPT09Qm9vbGVhbiYmb2xkVmFsdWU9PT0nJyl7b2xkVmFsdWU9dHJ1ZTt9Y29uZmlnW25ld1Byb3BdPW9sZFZhbHVlO319KTtyZXR1cm4gY29uZmlnO30sbXVsdGlwbGU6ZnVuY3Rpb24gbXVsdGlwbGUoKXtyZXR1cm4gdGhpcy5jb25maWcubXVsdGlwbGU7fSxsZWFmT25seTpmdW5jdGlvbiBsZWFmT25seSgpe3JldHVybiF0aGlzLmNvbmZpZy5jaGVja1N0cmljdGx5O30scmVhZG9ubHk6ZnVuY3Rpb24gcmVhZG9ubHkoKXtyZXR1cm4hdGhpcy5maWx0ZXJhYmxlfHx0aGlzLm11bHRpcGxlO30sY2xlYXJCdG5WaXNpYmxlOmZ1bmN0aW9uIGNsZWFyQnRuVmlzaWJsZSgpe2lmKCF0aGlzLmNsZWFyYWJsZXx8dGhpcy5pc0Rpc2FibGVkfHx0aGlzLmZpbHRlcmluZ3x8IXRoaXMuaW5wdXRIb3Zlcil7cmV0dXJuIGZhbHNlO31yZXR1cm4gdGhpcy5tdWx0aXBsZT8hIXRoaXMuY2hlY2tlZE5vZGVzLmZpbHRlcihmdW5jdGlvbihub2RlKXtyZXR1cm4hbm9kZS5pc0Rpc2FibGVkO30pLmxlbmd0aDohIXRoaXMucHJlc2VudFRleHQ7fSxwYW5lbDpmdW5jdGlvbiBwYW5lbCgpe3JldHVybiB0aGlzLiRyZWZzLnBhbmVsO319LHdhdGNoOntkaXNhYmxlZDpmdW5jdGlvbiBkaXNhYmxlZCgpe3RoaXMuY29tcHV0ZVByZXNlbnRDb250ZW50KCk7fSx2YWx1ZTpmdW5jdGlvbiB2YWx1ZSh2YWwpe2lmKCFPYmplY3QodXRpbF9bImlzRXF1YWwiXSkodmFsLHRoaXMuY2hlY2tlZFZhbHVlKSl7dGhpcy5jaGVja2VkVmFsdWU9dmFsO3RoaXMuY29tcHV0ZVByZXNlbnRDb250ZW50KCk7fX0sY2hlY2tlZFZhbHVlOmZ1bmN0aW9uIGNoZWNrZWRWYWx1ZSh2YWwpe3ZhciB2YWx1ZT10aGlzLnZhbHVlLGRyb3BEb3duVmlzaWJsZT10aGlzLmRyb3BEb3duVmlzaWJsZTt2YXIgX2NvbmZpZz10aGlzLmNvbmZpZyxjaGVja1N0cmljdGx5PV9jb25maWcuY2hlY2tTdHJpY3RseSxtdWx0aXBsZT1fY29uZmlnLm11bHRpcGxlO2lmKCFPYmplY3QodXRpbF9bImlzRXF1YWwiXSkodmFsLHZhbHVlKXx8T2JqZWN0KHR5cGVzX1siaXNVbmRlZmluZWQiXSkodmFsdWUpKXt0aGlzLmNvbXB1dGVQcmVzZW50Q29udGVudCgpOy8vIGhpZGUgZHJvcGRvd24gd2hlbiBzaW5nbGUgbW9kZQppZighbXVsdGlwbGUmJiFjaGVja1N0cmljdGx5JiZkcm9wRG93blZpc2libGUpe3RoaXMudG9nZ2xlRHJvcERvd25WaXNpYmxlKGZhbHNlKTt9dGhpcy4kZW1pdCgnaW5wdXQnLHZhbCk7dGhpcy4kZW1pdCgnY2hhbmdlJyx2YWwpO3RoaXMuZGlzcGF0Y2goJ0VsRm9ybUl0ZW0nLCdlbC5mb3JtLmNoYW5nZScsW3ZhbF0pO319LG9wdGlvbnM6e2hhbmRsZXI6ZnVuY3Rpb24gaGFuZGxlcigpe3RoaXMuJG5leHRUaWNrKHRoaXMuY29tcHV0ZVByZXNlbnRDb250ZW50KTt9LGRlZXA6dHJ1ZX0scHJlc2VudFRleHQ6ZnVuY3Rpb24gcHJlc2VudFRleHQodmFsKXt0aGlzLmlucHV0VmFsdWU9dmFsO30scHJlc2VudFRhZ3M6ZnVuY3Rpb24gcHJlc2VudFRhZ3ModmFsLG9sZFZhbCl7aWYodGhpcy5tdWx0aXBsZSYmKHZhbC5sZW5ndGh8fG9sZFZhbC5sZW5ndGgpKXt0aGlzLiRuZXh0VGljayh0aGlzLnVwZGF0ZVN0eWxlKTt9fSxmaWx0ZXJpbmc6ZnVuY3Rpb24gZmlsdGVyaW5nKHZhbCl7dGhpcy4kbmV4dFRpY2sodGhpcy51cGRhdGVQb3BwZXIpO319LG1vdW50ZWQ6ZnVuY3Rpb24gbW91bnRlZCgpe3ZhciBfdGhpcz10aGlzO3ZhciBpbnB1dD10aGlzLiRyZWZzLmlucHV0O2lmKGlucHV0JiZpbnB1dC4kZWwpe3RoaXMuaW5wdXRJbml0aWFsSGVpZ2h0PWlucHV0LiRlbC5vZmZzZXRIZWlnaHR8fElucHV0U2l6ZU1hcFt0aGlzLnJlYWxTaXplXXx8NDA7fWlmKCFPYmplY3QodXRpbF9bImlzRW1wdHkiXSkodGhpcy52YWx1ZSkpe3RoaXMuY29tcHV0ZVByZXNlbnRDb250ZW50KCk7fXRoaXMuZmlsdGVySGFuZGxlcj1kZWJvdW5jZV9kZWZhdWx0KCkodGhpcy5kZWJvdW5jZSxmdW5jdGlvbigpe3ZhciBpbnB1dFZhbHVlPV90aGlzLmlucHV0VmFsdWU7aWYoIWlucHV0VmFsdWUpe190aGlzLmZpbHRlcmluZz1mYWxzZTtyZXR1cm47fXZhciBiZWZvcmU9X3RoaXMuYmVmb3JlRmlsdGVyKGlucHV0VmFsdWUpO2lmKGJlZm9yZSYmYmVmb3JlLnRoZW4pe2JlZm9yZS50aGVuKF90aGlzLmdldFN1Z2dlc3Rpb25zKTt9ZWxzZSBpZihiZWZvcmUhPT1mYWxzZSl7X3RoaXMuZ2V0U3VnZ2VzdGlvbnMoKTt9ZWxzZXtfdGhpcy5maWx0ZXJpbmc9ZmFsc2U7fX0pO09iamVjdChyZXNpemVfZXZlbnRfWyJhZGRSZXNpemVMaXN0ZW5lciJdKSh0aGlzLiRlbCx0aGlzLnVwZGF0ZVN0eWxlKTt9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpe09iamVjdChyZXNpemVfZXZlbnRfWyJyZW1vdmVSZXNpemVMaXN0ZW5lciJdKSh0aGlzLiRlbCx0aGlzLnVwZGF0ZVN0eWxlKTt9LG1ldGhvZHM6e2dldE1pZ3JhdGluZ0NvbmZpZzpmdW5jdGlvbiBnZXRNaWdyYXRpbmdDb25maWcoKXtyZXR1cm57cHJvcHM6eydleHBhbmQtdHJpZ2dlcic6J2V4cGFuZC10cmlnZ2VyIGlzIHJlbW92ZWQsIHVzZSBgcHJvcHMuZXhwYW5kVHJpZ2dlcmAgaW5zdGVhZC4nLCdjaGFuZ2Utb24tc2VsZWN0JzonY2hhbmdlLW9uLXNlbGVjdCBpcyByZW1vdmVkLCB1c2UgYHByb3BzLmNoZWNrU3RyaWN0bHlgIGluc3RlYWQuJywnaG92ZXItdGhyZXNob2xkJzonaG92ZXItdGhyZXNob2xkIGlzIHJlbW92ZWQsIHVzZSBgcHJvcHMuaG92ZXJUaHJlc2hvbGRgIGluc3RlYWQnfSxldmVudHM6eydhY3RpdmUtaXRlbS1jaGFuZ2UnOidhY3RpdmUtaXRlbS1jaGFuZ2UgaXMgcmVuYW1lZCB0byBleHBhbmQtY2hhbmdlJ319O30sdG9nZ2xlRHJvcERvd25WaXNpYmxlOmZ1bmN0aW9uIHRvZ2dsZURyb3BEb3duVmlzaWJsZSh2aXNpYmxlKXt2YXIgX3RoaXMyPXRoaXM7aWYodGhpcy5pc0Rpc2FibGVkKXJldHVybjt2YXIgZHJvcERvd25WaXNpYmxlPXRoaXMuZHJvcERvd25WaXNpYmxlO3ZhciBpbnB1dD10aGlzLiRyZWZzLmlucHV0O3Zpc2libGU9T2JqZWN0KHNoYXJlZF9bImlzRGVmIl0pKHZpc2libGUpP3Zpc2libGU6IWRyb3BEb3duVmlzaWJsZTtpZih2aXNpYmxlIT09ZHJvcERvd25WaXNpYmxlKXt0aGlzLmRyb3BEb3duVmlzaWJsZT12aXNpYmxlO2lmKHZpc2libGUpe3RoaXMuJG5leHRUaWNrKGZ1bmN0aW9uKCl7X3RoaXMyLnVwZGF0ZVBvcHBlcigpO190aGlzMi5wYW5lbC5zY3JvbGxJbnRvVmlldygpO30pO31pbnB1dC4kcmVmcy5pbnB1dC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLHZpc2libGUpO3RoaXMuJGVtaXQoJ3Zpc2libGUtY2hhbmdlJyx2aXNpYmxlKTt9fSxoYW5kbGVEcm9wZG93bkxlYXZlOmZ1bmN0aW9uIGhhbmRsZURyb3Bkb3duTGVhdmUoKXt0aGlzLmZpbHRlcmluZz1mYWxzZTt0aGlzLmlucHV0VmFsdWU9dGhpcy5wcmVzZW50VGV4dDt9LGhhbmRsZUtleURvd246ZnVuY3Rpb24gaGFuZGxlS2V5RG93bihldmVudCl7c3dpdGNoKGV2ZW50LmtleUNvZGUpe2Nhc2UgS2V5Q29kZS5lbnRlcjp0aGlzLnRvZ2dsZURyb3BEb3duVmlzaWJsZSgpO2JyZWFrO2Nhc2UgS2V5Q29kZS5kb3duOnRoaXMudG9nZ2xlRHJvcERvd25WaXNpYmxlKHRydWUpO3RoaXMuZm9jdXNGaXJzdE5vZGUoKTtldmVudC5wcmV2ZW50RGVmYXVsdCgpO2JyZWFrO2Nhc2UgS2V5Q29kZS5lc2M6Y2FzZSBLZXlDb2RlLnRhYjp0aGlzLnRvZ2dsZURyb3BEb3duVmlzaWJsZShmYWxzZSk7YnJlYWs7fX0saGFuZGxlRm9jdXM6ZnVuY3Rpb24gaGFuZGxlRm9jdXMoZSl7dGhpcy4kZW1pdCgnZm9jdXMnLGUpO30saGFuZGxlQmx1cjpmdW5jdGlvbiBoYW5kbGVCbHVyKGUpe3RoaXMuJGVtaXQoJ2JsdXInLGUpO30saGFuZGxlSW5wdXQ6ZnVuY3Rpb24gaGFuZGxlSW5wdXQodmFsLGV2ZW50KXshdGhpcy5kcm9wRG93blZpc2libGUmJnRoaXMudG9nZ2xlRHJvcERvd25WaXNpYmxlKHRydWUpO2lmKGV2ZW50JiZldmVudC5pc0NvbXBvc2luZylyZXR1cm47aWYodmFsKXt0aGlzLmZpbHRlckhhbmRsZXIoKTt9ZWxzZXt0aGlzLmZpbHRlcmluZz1mYWxzZTt9fSxoYW5kbGVDbGVhcjpmdW5jdGlvbiBoYW5kbGVDbGVhcigpe3RoaXMucHJlc2VudFRleHQ9Jyc7dGhpcy5wYW5lbC5jbGVhckNoZWNrZWROb2RlcygpO30saGFuZGxlRXhwYW5kQ2hhbmdlOmZ1bmN0aW9uIGhhbmRsZUV4cGFuZENoYW5nZSh2YWx1ZSl7dGhpcy4kbmV4dFRpY2sodGhpcy51cGRhdGVQb3BwZXIuYmluZCh0aGlzKSk7dGhpcy4kZW1pdCgnZXhwYW5kLWNoYW5nZScsdmFsdWUpO3RoaXMuJGVtaXQoJ2FjdGl2ZS1pdGVtLWNoYW5nZScsdmFsdWUpOy8vIERlcHJlY2F0ZWQKfSxmb2N1c0ZpcnN0Tm9kZTpmdW5jdGlvbiBmb2N1c0ZpcnN0Tm9kZSgpe3ZhciBfdGhpczM9dGhpczt0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe3ZhciBmaWx0ZXJpbmc9X3RoaXMzLmZpbHRlcmluZzt2YXIgXyRyZWZzPV90aGlzMy4kcmVmcyxwb3BwZXI9XyRyZWZzLnBvcHBlcixzdWdnZXN0aW9uUGFuZWw9XyRyZWZzLnN1Z2dlc3Rpb25QYW5lbDt2YXIgZmlyc3ROb2RlPW51bGw7aWYoZmlsdGVyaW5nJiZzdWdnZXN0aW9uUGFuZWwpe2ZpcnN0Tm9kZT1zdWdnZXN0aW9uUGFuZWwuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5lbC1jYXNjYWRlcl9fc3VnZ2VzdGlvbi1pdGVtJyk7fWVsc2V7dmFyIGZpcnN0TWVudT1wb3BwZXIucXVlcnlTZWxlY3RvcignLmVsLWNhc2NhZGVyLW1lbnUnKTtmaXJzdE5vZGU9Zmlyc3RNZW51LnF1ZXJ5U2VsZWN0b3IoJy5lbC1jYXNjYWRlci1ub2RlW3RhYmluZGV4PSItMSJdJyk7fWlmKGZpcnN0Tm9kZSl7Zmlyc3ROb2RlLmZvY3VzKCk7IWZpbHRlcmluZyYmZmlyc3ROb2RlLmNsaWNrKCk7fX0pO30sY29tcHV0ZVByZXNlbnRDb250ZW50OmZ1bmN0aW9uIGNvbXB1dGVQcmVzZW50Q29udGVudCgpe3ZhciBfdGhpczQ9dGhpczsvLyBuZXh0VGljayBpcyByZXF1aXJlZCwgYmVjYXVzZSBjaGVja2VkIG5vZGVzIG1heSBub3QgY2hhbmdlIHJpZ2h0IG5vdwp0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe2lmKF90aGlzNC5jb25maWcubXVsdGlwbGUpe190aGlzNC5jb21wdXRlUHJlc2VudFRhZ3MoKTtfdGhpczQucHJlc2VudFRleHQ9X3RoaXM0LnByZXNlbnRUYWdzLmxlbmd0aD8nICc6bnVsbDt9ZWxzZXtfdGhpczQuY29tcHV0ZVByZXNlbnRUZXh0KCk7fX0pO30sY29tcHV0ZVByZXNlbnRUZXh0OmZ1bmN0aW9uIGNvbXB1dGVQcmVzZW50VGV4dCgpe3ZhciBjaGVja2VkVmFsdWU9dGhpcy5jaGVja2VkVmFsdWUsY29uZmlnPXRoaXMuY29uZmlnO2lmKCFPYmplY3QodXRpbF9bImlzRW1wdHkiXSkoY2hlY2tlZFZhbHVlKSl7dmFyIG5vZGU9dGhpcy5wYW5lbC5nZXROb2RlQnlWYWx1ZShjaGVja2VkVmFsdWUpO2lmKG5vZGUmJihjb25maWcuY2hlY2tTdHJpY3RseXx8bm9kZS5pc0xlYWYpKXt0aGlzLnByZXNlbnRUZXh0PW5vZGUuZ2V0VGV4dCh0aGlzLnNob3dBbGxMZXZlbHMsdGhpcy5zZXBhcmF0b3IpO3JldHVybjt9fXRoaXMucHJlc2VudFRleHQ9bnVsbDt9LGNvbXB1dGVQcmVzZW50VGFnczpmdW5jdGlvbiBjb21wdXRlUHJlc2VudFRhZ3MoKXt2YXIgaXNEaXNhYmxlZD10aGlzLmlzRGlzYWJsZWQsbGVhZk9ubHk9dGhpcy5sZWFmT25seSxzaG93QWxsTGV2ZWxzPXRoaXMuc2hvd0FsbExldmVscyxzZXBhcmF0b3I9dGhpcy5zZXBhcmF0b3IsY29sbGFwc2VUYWdzPXRoaXMuY29sbGFwc2VUYWdzO3ZhciBjaGVja2VkTm9kZXM9dGhpcy5nZXRDaGVja2VkTm9kZXMobGVhZk9ubHkpO3ZhciB0YWdzPVtdO3ZhciBnZW5UYWc9ZnVuY3Rpb24gZ2VuVGFnKG5vZGUpe3JldHVybntub2RlOm5vZGUsa2V5Om5vZGUudWlkLHRleHQ6bm9kZS5nZXRUZXh0KHNob3dBbGxMZXZlbHMsc2VwYXJhdG9yKSxoaXRTdGF0ZTpmYWxzZSxjbG9zYWJsZTohaXNEaXNhYmxlZCYmIW5vZGUuaXNEaXNhYmxlZH07fTtpZihjaGVja2VkTm9kZXMubGVuZ3RoKXt2YXIgZmlyc3Q9Y2hlY2tlZE5vZGVzWzBdLHJlc3Q9Y2hlY2tlZE5vZGVzLnNsaWNlKDEpO3ZhciByZXN0Q291bnQ9cmVzdC5sZW5ndGg7dGFncy5wdXNoKGdlblRhZyhmaXJzdCkpO2lmKHJlc3RDb3VudCl7aWYoY29sbGFwc2VUYWdzKXt0YWdzLnB1c2goe2tleTotMSx0ZXh0OicrICcrcmVzdENvdW50LGNsb3NhYmxlOmZhbHNlfSk7fWVsc2V7cmVzdC5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUpe3JldHVybiB0YWdzLnB1c2goZ2VuVGFnKG5vZGUpKTt9KTt9fX10aGlzLmNoZWNrZWROb2Rlcz1jaGVja2VkTm9kZXM7dGhpcy5wcmVzZW50VGFncz10YWdzO30sZ2V0U3VnZ2VzdGlvbnM6ZnVuY3Rpb24gZ2V0U3VnZ2VzdGlvbnMoKXt2YXIgX3RoaXM1PXRoaXM7dmFyIGZpbHRlck1ldGhvZD10aGlzLmZpbHRlck1ldGhvZDtpZighT2JqZWN0KHR5cGVzX1siaXNGdW5jdGlvbiJdKShmaWx0ZXJNZXRob2QpKXtmaWx0ZXJNZXRob2Q9ZnVuY3Rpb24gZmlsdGVyTWV0aG9kKG5vZGUsa2V5d29yZCl7cmV0dXJuIG5vZGUudGV4dC5pbmNsdWRlcyhrZXl3b3JkKTt9O312YXIgc3VnZ2VzdGlvbnM9dGhpcy5wYW5lbC5nZXRGbGF0dGVkTm9kZXModGhpcy5sZWFmT25seSkuZmlsdGVyKGZ1bmN0aW9uKG5vZGUpe2lmKG5vZGUuaXNEaXNhYmxlZClyZXR1cm4gZmFsc2U7bm9kZS50ZXh0PW5vZGUuZ2V0VGV4dChfdGhpczUuc2hvd0FsbExldmVscyxfdGhpczUuc2VwYXJhdG9yKXx8Jyc7cmV0dXJuIGZpbHRlck1ldGhvZChub2RlLF90aGlzNS5pbnB1dFZhbHVlKTt9KTtpZih0aGlzLm11bHRpcGxlKXt0aGlzLnByZXNlbnRUYWdzLmZvckVhY2goZnVuY3Rpb24odGFnKXt0YWcuaGl0U3RhdGU9ZmFsc2U7fSk7fWVsc2V7c3VnZ2VzdGlvbnMuZm9yRWFjaChmdW5jdGlvbihub2RlKXtub2RlLmNoZWNrZWQ9T2JqZWN0KHV0aWxfWyJpc0VxdWFsIl0pKF90aGlzNS5jaGVja2VkVmFsdWUsbm9kZS5nZXRWYWx1ZUJ5T3B0aW9uKCkpO30pO310aGlzLmZpbHRlcmluZz10cnVlO3RoaXMuc3VnZ2VzdGlvbnM9c3VnZ2VzdGlvbnM7dGhpcy4kbmV4dFRpY2sodGhpcy51cGRhdGVQb3BwZXIpO30saGFuZGxlU3VnZ2VzdGlvbktleURvd246ZnVuY3Rpb24gaGFuZGxlU3VnZ2VzdGlvbktleURvd24oZXZlbnQpe3ZhciBrZXlDb2RlPWV2ZW50LmtleUNvZGUsdGFyZ2V0PWV2ZW50LnRhcmdldDtzd2l0Y2goa2V5Q29kZSl7Y2FzZSBLZXlDb2RlLmVudGVyOnRhcmdldC5jbGljaygpO2JyZWFrO2Nhc2UgS2V5Q29kZS51cDp2YXIgcHJldj10YXJnZXQucHJldmlvdXNFbGVtZW50U2libGluZztwcmV2JiZwcmV2LmZvY3VzKCk7YnJlYWs7Y2FzZSBLZXlDb2RlLmRvd246dmFyIG5leHQ9dGFyZ2V0Lm5leHRFbGVtZW50U2libGluZztuZXh0JiZuZXh0LmZvY3VzKCk7YnJlYWs7Y2FzZSBLZXlDb2RlLmVzYzpjYXNlIEtleUNvZGUudGFiOnRoaXMudG9nZ2xlRHJvcERvd25WaXNpYmxlKGZhbHNlKTticmVhazt9fSxoYW5kbGVEZWxldGU6ZnVuY3Rpb24gaGFuZGxlRGVsZXRlKCl7dmFyIGlucHV0VmFsdWU9dGhpcy5pbnB1dFZhbHVlLHByZXNzRGVsZXRlQ291bnQ9dGhpcy5wcmVzc0RlbGV0ZUNvdW50LHByZXNlbnRUYWdzPXRoaXMucHJlc2VudFRhZ3M7dmFyIGxhc3RJbmRleD1wcmVzZW50VGFncy5sZW5ndGgtMTt2YXIgbGFzdFRhZz1wcmVzZW50VGFnc1tsYXN0SW5kZXhdO3RoaXMucHJlc3NEZWxldGVDb3VudD1pbnB1dFZhbHVlPzA6cHJlc3NEZWxldGVDb3VudCsxO2lmKCFsYXN0VGFnKXJldHVybjtpZih0aGlzLnByZXNzRGVsZXRlQ291bnQpe2lmKGxhc3RUYWcuaGl0U3RhdGUpe3RoaXMuZGVsZXRlVGFnKGxhc3RJbmRleCk7fWVsc2V7bGFzdFRhZy5oaXRTdGF0ZT10cnVlO319fSxoYW5kbGVTdWdnZXN0aW9uQ2xpY2s6ZnVuY3Rpb24gaGFuZGxlU3VnZ2VzdGlvbkNsaWNrKGluZGV4KXt2YXIgbXVsdGlwbGU9dGhpcy5tdWx0aXBsZTt2YXIgdGFyZ2V0Tm9kZT10aGlzLnN1Z2dlc3Rpb25zW2luZGV4XTtpZihtdWx0aXBsZSl7dmFyIGNoZWNrZWQ9dGFyZ2V0Tm9kZS5jaGVja2VkO3RhcmdldE5vZGUuZG9DaGVjayghY2hlY2tlZCk7dGhpcy5wYW5lbC5jYWxjdWxhdGVNdWx0aUNoZWNrZWRWYWx1ZSgpO31lbHNle3RoaXMuY2hlY2tlZFZhbHVlPXRhcmdldE5vZGUuZ2V0VmFsdWVCeU9wdGlvbigpO3RoaXMudG9nZ2xlRHJvcERvd25WaXNpYmxlKGZhbHNlKTt9fSxkZWxldGVUYWc6ZnVuY3Rpb24gZGVsZXRlVGFnKGluZGV4KXt2YXIgY2hlY2tlZFZhbHVlPXRoaXMuY2hlY2tlZFZhbHVlO3ZhciB2YWw9Y2hlY2tlZFZhbHVlW2luZGV4XTt0aGlzLmNoZWNrZWRWYWx1ZT1jaGVja2VkVmFsdWUuZmlsdGVyKGZ1bmN0aW9uKG4saSl7cmV0dXJuIGkhPT1pbmRleDt9KTt0aGlzLiRlbWl0KCdyZW1vdmUtdGFnJyx2YWwpO30sdXBkYXRlU3R5bGU6ZnVuY3Rpb24gdXBkYXRlU3R5bGUoKXt2YXIgJGVsPXRoaXMuJGVsLGlucHV0SW5pdGlhbEhlaWdodD10aGlzLmlucHV0SW5pdGlhbEhlaWdodDtpZih0aGlzLiRpc1NlcnZlcnx8ISRlbClyZXR1cm47dmFyIHN1Z2dlc3Rpb25QYW5lbD10aGlzLiRyZWZzLnN1Z2dlc3Rpb25QYW5lbDt2YXIgaW5wdXRJbm5lcj0kZWwucXVlcnlTZWxlY3RvcignLmVsLWlucHV0X19pbm5lcicpO2lmKCFpbnB1dElubmVyKXJldHVybjt2YXIgdGFncz0kZWwucXVlcnlTZWxlY3RvcignLmVsLWNhc2NhZGVyX190YWdzJyk7dmFyIHN1Z2dlc3Rpb25QYW5lbEVsPW51bGw7aWYoc3VnZ2VzdGlvblBhbmVsJiYoc3VnZ2VzdGlvblBhbmVsRWw9c3VnZ2VzdGlvblBhbmVsLiRlbCkpe3ZhciBzdWdnZXN0aW9uTGlzdD1zdWdnZXN0aW9uUGFuZWxFbC5xdWVyeVNlbGVjdG9yKCcuZWwtY2FzY2FkZXJfX3N1Z2dlc3Rpb24tbGlzdCcpO3N1Z2dlc3Rpb25MaXN0LnN0eWxlLm1pbldpZHRoPWlucHV0SW5uZXIub2Zmc2V0V2lkdGgrJ3B4Jzt9aWYodGFncyl7dmFyIG9mZnNldEhlaWdodD10YWdzLm9mZnNldEhlaWdodDt2YXIgaGVpZ2h0PU1hdGgubWF4KG9mZnNldEhlaWdodCs2LGlucHV0SW5pdGlhbEhlaWdodCkrJ3B4JztpbnB1dElubmVyLnN0eWxlLmhlaWdodD1oZWlnaHQ7dGhpcy51cGRhdGVQb3BwZXIoKTt9fSwvKioKICAgICAqIHB1YmxpYyBtZXRob2RzCiAgICAqL2dldENoZWNrZWROb2RlczpmdW5jdGlvbiBnZXRDaGVja2VkTm9kZXMobGVhZk9ubHkpe3JldHVybiB0aGlzLnBhbmVsLmdldENoZWNrZWROb2RlcyhsZWFmT25seSk7fX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FzY2FkZXIvc3JjL2Nhc2NhZGVyLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfY2FzY2FkZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189Y2FzY2FkZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXNjYWRlci9zcmMvY2FzY2FkZXIudnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgY2FzY2FkZXJfY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChzcmNfY2FzY2FkZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sY2FzY2FkZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF8wMzI1MzdhNl9yZW5kZXIsY2FzY2FkZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF8wMzI1MzdhNl9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIGNhc2NhZGVyX2FwaTt9Y2FzY2FkZXJfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy9jYXNjYWRlci9zcmMvY2FzY2FkZXIudnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGNhc2NhZGVyPWNhc2NhZGVyX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FzY2FkZXIvaW5kZXguanMKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9jYXNjYWRlci5pbnN0YWxsPWZ1bmN0aW9uKFZ1ZSl7VnVlLmNvbXBvbmVudChjYXNjYWRlci5uYW1lLGNhc2NhZGVyKTt9Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFja2FnZXNfY2FzY2FkZXI9Y2FzY2FkZXI7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTU1YzhhZGU3Jgp2YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzU1YzhhZGU3X3JlbmRlcj1mdW5jdGlvbiBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNTVjOGFkZTdfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJkaXYiLHtkaXJlY3RpdmVzOlt7bmFtZToiY2xpY2tvdXRzaWRlIixyYXdOYW1lOiJ2LWNsaWNrb3V0c2lkZSIsdmFsdWU6X3ZtLmhpZGUsZXhwcmVzc2lvbjoiaGlkZSJ9XSxjbGFzczpbImVsLWNvbG9yLXBpY2tlciIsX3ZtLmNvbG9yRGlzYWJsZWQ/ImlzLWRpc2FibGVkIjoiIixfdm0uY29sb3JTaXplPyJlbC1jb2xvci1waWNrZXItLSIrX3ZtLmNvbG9yU2l6ZToiIl19LFtfdm0uY29sb3JEaXNhYmxlZD9fYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLWNvbG9yLXBpY2tlcl9fbWFzayJ9KTpfdm0uX2UoKSxfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLWNvbG9yLXBpY2tlcl9fdHJpZ2dlciIsb246e2NsaWNrOl92bS5oYW5kbGVUcmlnZ2VyfX0sW19jKCJzcGFuIix7c3RhdGljQ2xhc3M6ImVsLWNvbG9yLXBpY2tlcl9fY29sb3IiLGNsYXNzOnsiaXMtYWxwaGEiOl92bS5zaG93QWxwaGF9fSxbX2MoInNwYW4iLHtzdGF0aWNDbGFzczoiZWwtY29sb3ItcGlja2VyX19jb2xvci1pbm5lciIsc3R5bGU6e2JhY2tncm91bmRDb2xvcjpfdm0uZGlzcGxheWVkQ29sb3J9fSksIV92bS52YWx1ZSYmIV92bS5zaG93UGFuZWxDb2xvcj9fYygic3BhbiIse3N0YXRpY0NsYXNzOiJlbC1jb2xvci1waWNrZXJfX2VtcHR5IGVsLWljb24tY2xvc2UifSk6X3ZtLl9lKCldKSxfYygic3BhbiIse2RpcmVjdGl2ZXM6W3tuYW1lOiJzaG93IixyYXdOYW1lOiJ2LXNob3ciLHZhbHVlOl92bS52YWx1ZXx8X3ZtLnNob3dQYW5lbENvbG9yLGV4cHJlc3Npb246InZhbHVlIHx8IHNob3dQYW5lbENvbG9yIn1dLHN0YXRpY0NsYXNzOiJlbC1jb2xvci1waWNrZXJfX2ljb24gZWwtaWNvbi1hcnJvdy1kb3duIn0pXSksX2MoInBpY2tlci1kcm9wZG93biIse3JlZjoiZHJvcGRvd24iLGNsYXNzOlsiZWwtY29sb3ItcGlja2VyX19wYW5lbCIsX3ZtLnBvcHBlckNsYXNzfHwiIl0sYXR0cnM6e2NvbG9yOl92bS5jb2xvciwic2hvdy1hbHBoYSI6X3ZtLnNob3dBbHBoYSxwcmVkZWZpbmU6X3ZtLnByZWRlZmluZX0sb246e3BpY2s6X3ZtLmNvbmZpcm1WYWx1ZSxjbGVhcjpfdm0uY2xlYXJWYWx1ZX0sbW9kZWw6e3ZhbHVlOl92bS5zaG93UGlja2VyLGNhbGxiYWNrOmZ1bmN0aW9uIGNhbGxiYWNrKCQkdil7X3ZtLnNob3dQaWNrZXI9JCR2O30sZXhwcmVzc2lvbjoic2hvd1BpY2tlciJ9fSldLDEpO307dmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81NWM4YWRlN19zdGF0aWNSZW5kZXJGbnM9W107bWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzU1YzhhZGU3X3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTU1YzhhZGU3JgovLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NvbG9yLXBpY2tlci9zcmMvY29sb3IuanMKdmFyIGNvbG9yX3R5cGVvZj10eXBlb2YgU3ltYm9sPT09ImZ1bmN0aW9uIiYmX3R5cGVvZjIoU3ltYm9sLml0ZXJhdG9yKT09PSJzeW1ib2wiP2Z1bmN0aW9uKG9iail7cmV0dXJuIF90eXBlb2YyKG9iaik7fTpmdW5jdGlvbihvYmope3JldHVybiBvYmomJnR5cGVvZiBTeW1ib2w9PT0iZnVuY3Rpb24iJiZvYmouY29uc3RydWN0b3I9PT1TeW1ib2wmJm9iaiE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6X3R5cGVvZjIob2JqKTt9O2Z1bmN0aW9uIGNvbG9yX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLENvbnN0cnVjdG9yKXtpZighKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTt9fXZhciBoc3YyaHNsPWZ1bmN0aW9uIGhzdjJoc2woaHVlLHNhdCx2YWwpe3JldHVybltodWUsc2F0KnZhbC8oKGh1ZT0oMi1zYXQpKnZhbCk8MT9odWU6Mi1odWUpfHwwLGh1ZS8yXTt9Oy8vIE5lZWQgdG8gaGFuZGxlIDEuMCBhcyAxMDAlLCBzaW5jZSBvbmNlIGl0IGlzIGEgbnVtYmVyLCB0aGVyZSBpcyBubyBkaWZmZXJlbmNlIGJldHdlZW4gaXQgYW5kIDEKLy8gPGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzQyMjA3Mi9qYXZhc2NyaXB0LWhvdy10by1kZXRlY3QtbnVtYmVyLWFzLWEtZGVjaW1hbC1pbmNsdWRpbmctMS0wPgp2YXIgaXNPbmVQb2ludFplcm89ZnVuY3Rpb24gaXNPbmVQb2ludFplcm8obil7cmV0dXJuIHR5cGVvZiBuPT09J3N0cmluZycmJm4uaW5kZXhPZignLicpIT09LTEmJnBhcnNlRmxvYXQobik9PT0xO307dmFyIGlzUGVyY2VudGFnZT1mdW5jdGlvbiBpc1BlcmNlbnRhZ2Uobil7cmV0dXJuIHR5cGVvZiBuPT09J3N0cmluZycmJm4uaW5kZXhPZignJScpIT09LTE7fTsvLyBUYWtlIGlucHV0IGZyb20gWzAsIG5dIGFuZCByZXR1cm4gaXQgYXMgWzAsIDFdCnZhciBib3VuZDAxPWZ1bmN0aW9uIGJvdW5kMDEodmFsdWUsbWF4KXtpZihpc09uZVBvaW50WmVybyh2YWx1ZSkpdmFsdWU9JzEwMCUnO3ZhciBwcm9jZXNzUGVyY2VudD1pc1BlcmNlbnRhZ2UodmFsdWUpO3ZhbHVlPU1hdGgubWluKG1heCxNYXRoLm1heCgwLHBhcnNlRmxvYXQodmFsdWUpKSk7Ly8gQXV0b21hdGljYWxseSBjb252ZXJ0IHBlcmNlbnRhZ2UgaW50byBudW1iZXIKaWYocHJvY2Vzc1BlcmNlbnQpe3ZhbHVlPXBhcnNlSW50KHZhbHVlKm1heCwxMCkvMTAwO30vLyBIYW5kbGUgZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgZXJyb3JzCmlmKE1hdGguYWJzKHZhbHVlLW1heCk8MC4wMDAwMDEpe3JldHVybiAxO30vLyBDb252ZXJ0IGludG8gWzAsIDFdIHJhbmdlIGlmIGl0IGlzbid0IGFscmVhZHkKcmV0dXJuIHZhbHVlJW1heC9wYXJzZUZsb2F0KG1heCk7fTt2YXIgSU5UX0hFWF9NQVA9ezEwOidBJywxMTonQicsMTI6J0MnLDEzOidEJywxNDonRScsMTU6J0YnfTt2YXIgdG9IZXg9ZnVuY3Rpb24gdG9IZXgoX3JlZil7dmFyIHI9X3JlZi5yLGc9X3JlZi5nLGI9X3JlZi5iO3ZhciBoZXhPbmU9ZnVuY3Rpb24gaGV4T25lKHZhbHVlKXt2YWx1ZT1NYXRoLm1pbihNYXRoLnJvdW5kKHZhbHVlKSwyNTUpO3ZhciBoaWdoPU1hdGguZmxvb3IodmFsdWUvMTYpO3ZhciBsb3c9dmFsdWUlMTY7cmV0dXJuJycrKElOVF9IRVhfTUFQW2hpZ2hdfHxoaWdoKSsoSU5UX0hFWF9NQVBbbG93XXx8bG93KTt9O2lmKGlzTmFOKHIpfHxpc05hTihnKXx8aXNOYU4oYikpcmV0dXJuJyc7cmV0dXJuJyMnK2hleE9uZShyKStoZXhPbmUoZykraGV4T25lKGIpO307dmFyIEhFWF9JTlRfTUFQPXtBOjEwLEI6MTEsQzoxMixEOjEzLEU6MTQsRjoxNX07dmFyIHBhcnNlSGV4Q2hhbm5lbD1mdW5jdGlvbiBwYXJzZUhleENoYW5uZWwoaGV4KXtpZihoZXgubGVuZ3RoPT09Mil7cmV0dXJuKEhFWF9JTlRfTUFQW2hleFswXS50b1VwcGVyQ2FzZSgpXXx8K2hleFswXSkqMTYrKEhFWF9JTlRfTUFQW2hleFsxXS50b1VwcGVyQ2FzZSgpXXx8K2hleFsxXSk7fXJldHVybiBIRVhfSU5UX01BUFtoZXhbMV0udG9VcHBlckNhc2UoKV18fCtoZXhbMV07fTt2YXIgaHNsMmhzdj1mdW5jdGlvbiBoc2wyaHN2KGh1ZSxzYXQsbGlnaHQpe3NhdD1zYXQvMTAwO2xpZ2h0PWxpZ2h0LzEwMDt2YXIgc21pbj1zYXQ7dmFyIGxtaW49TWF0aC5tYXgobGlnaHQsMC4wMSk7dmFyIHN2PXZvaWQgMDt2YXIgdj12b2lkIDA7bGlnaHQqPTI7c2F0Kj1saWdodDw9MT9saWdodDoyLWxpZ2h0O3NtaW4qPWxtaW48PTE/bG1pbjoyLWxtaW47dj0obGlnaHQrc2F0KS8yO3N2PWxpZ2h0PT09MD8yKnNtaW4vKGxtaW4rc21pbik6MipzYXQvKGxpZ2h0K3NhdCk7cmV0dXJue2g6aHVlLHM6c3YqMTAwLHY6dioxMDB9O307Ly8gYHJnYlRvSHN2YAovLyBDb252ZXJ0cyBhbiBSR0IgY29sb3IgdmFsdWUgdG8gSFNWCi8vICpBc3N1bWVzOiogciwgZywgYW5kIGIgYXJlIGNvbnRhaW5lZCBpbiB0aGUgc2V0IFswLCAyNTVdIG9yIFswLCAxXQovLyAqUmV0dXJuczoqIHsgaCwgcywgdiB9IGluIFswLDFdCnZhciByZ2IyaHN2PWZ1bmN0aW9uIHJnYjJoc3YocixnLGIpe3I9Ym91bmQwMShyLDI1NSk7Zz1ib3VuZDAxKGcsMjU1KTtiPWJvdW5kMDEoYiwyNTUpO3ZhciBtYXg9TWF0aC5tYXgocixnLGIpO3ZhciBtaW49TWF0aC5taW4ocixnLGIpO3ZhciBoPXZvaWQgMCxzPXZvaWQgMDt2YXIgdj1tYXg7dmFyIGQ9bWF4LW1pbjtzPW1heD09PTA/MDpkL21heDtpZihtYXg9PT1taW4pe2g9MDsvLyBhY2hyb21hdGljCn1lbHNle3N3aXRjaChtYXgpe2Nhc2UgcjpoPShnLWIpL2QrKGc8Yj82OjApO2JyZWFrO2Nhc2UgZzpoPShiLXIpL2QrMjticmVhaztjYXNlIGI6aD0oci1nKS9kKzQ7YnJlYWs7fWgvPTY7fXJldHVybntoOmgqMzYwLHM6cyoxMDAsdjp2KjEwMH07fTsvLyBgaHN2VG9SZ2JgCi8vIENvbnZlcnRzIGFuIEhTViBjb2xvciB2YWx1ZSB0byBSR0IuCi8vICpBc3N1bWVzOiogaCBpcyBjb250YWluZWQgaW4gWzAsIDFdIG9yIFswLCAzNjBdIGFuZCBzIGFuZCB2IGFyZSBjb250YWluZWQgaW4gWzAsIDFdIG9yIFswLCAxMDBdCi8vICpSZXR1cm5zOiogeyByLCBnLCBiIH0gaW4gdGhlIHNldCBbMCwgMjU1XQp2YXIgaHN2MnJnYj1mdW5jdGlvbiBoc3YycmdiKGgscyx2KXtoPWJvdW5kMDEoaCwzNjApKjY7cz1ib3VuZDAxKHMsMTAwKTt2PWJvdW5kMDEodiwxMDApO3ZhciBpPU1hdGguZmxvb3IoaCk7dmFyIGY9aC1pO3ZhciBwPXYqKDEtcyk7dmFyIHE9diooMS1mKnMpO3ZhciB0PXYqKDEtKDEtZikqcyk7dmFyIG1vZD1pJTY7dmFyIHI9W3YscSxwLHAsdCx2XVttb2RdO3ZhciBnPVt0LHYsdixxLHAscF1bbW9kXTt2YXIgYj1bcCxwLHQsdix2LHFdW21vZF07cmV0dXJue3I6TWF0aC5yb3VuZChyKjI1NSksZzpNYXRoLnJvdW5kKGcqMjU1KSxiOk1hdGgucm91bmQoYioyNTUpfTt9O3ZhciBDb2xvcj1mdW5jdGlvbigpe2Z1bmN0aW9uIENvbG9yKG9wdGlvbnMpe2NvbG9yX2NsYXNzQ2FsbENoZWNrKHRoaXMsQ29sb3IpO3RoaXMuX2h1ZT0wO3RoaXMuX3NhdHVyYXRpb249MTAwO3RoaXMuX3ZhbHVlPTEwMDt0aGlzLl9hbHBoYT0xMDA7dGhpcy5lbmFibGVBbHBoYT1mYWxzZTt0aGlzLmZvcm1hdD0naGV4Jzt0aGlzLnZhbHVlPScnO29wdGlvbnM9b3B0aW9uc3x8e307Zm9yKHZhciBvcHRpb24gaW4gb3B0aW9ucyl7aWYob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShvcHRpb24pKXt0aGlzW29wdGlvbl09b3B0aW9uc1tvcHRpb25dO319dGhpcy5kb09uQ2hhbmdlKCk7fUNvbG9yLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24gc2V0KHByb3AsdmFsdWUpe2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0xJiYodHlwZW9mIHByb3A9PT0ndW5kZWZpbmVkJz8ndW5kZWZpbmVkJzpjb2xvcl90eXBlb2YocHJvcCkpPT09J29iamVjdCcpe2Zvcih2YXIgcCBpbiBwcm9wKXtpZihwcm9wLmhhc093blByb3BlcnR5KHApKXt0aGlzLnNldChwLHByb3BbcF0pO319cmV0dXJuO310aGlzWydfJytwcm9wXT12YWx1ZTt0aGlzLmRvT25DaGFuZ2UoKTt9O0NvbG9yLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24gZ2V0KHByb3Ape3JldHVybiB0aGlzWydfJytwcm9wXTt9O0NvbG9yLnByb3RvdHlwZS50b1JnYj1mdW5jdGlvbiB0b1JnYigpe3JldHVybiBoc3YycmdiKHRoaXMuX2h1ZSx0aGlzLl9zYXR1cmF0aW9uLHRoaXMuX3ZhbHVlKTt9O0NvbG9yLnByb3RvdHlwZS5mcm9tU3RyaW5nPWZ1bmN0aW9uIGZyb21TdHJpbmcodmFsdWUpe3ZhciBfdGhpcz10aGlzO2lmKCF2YWx1ZSl7dGhpcy5faHVlPTA7dGhpcy5fc2F0dXJhdGlvbj0xMDA7dGhpcy5fdmFsdWU9MTAwO3RoaXMuZG9PbkNoYW5nZSgpO3JldHVybjt9dmFyIGZyb21IU1Y9ZnVuY3Rpb24gZnJvbUhTVihoLHMsdil7X3RoaXMuX2h1ZT1NYXRoLm1heCgwLE1hdGgubWluKDM2MCxoKSk7X3RoaXMuX3NhdHVyYXRpb249TWF0aC5tYXgoMCxNYXRoLm1pbigxMDAscykpO190aGlzLl92YWx1ZT1NYXRoLm1heCgwLE1hdGgubWluKDEwMCx2KSk7X3RoaXMuZG9PbkNoYW5nZSgpO307aWYodmFsdWUuaW5kZXhPZignaHNsJykhPT0tMSl7dmFyIHBhcnRzPXZhbHVlLnJlcGxhY2UoL2hzbGF8aHNsfFwofFwpL2dtLCcnKS5zcGxpdCgvXHN8LC9nKS5maWx0ZXIoZnVuY3Rpb24odmFsKXtyZXR1cm4gdmFsIT09Jyc7fSkubWFwKGZ1bmN0aW9uKHZhbCxpbmRleCl7cmV0dXJuIGluZGV4PjI/cGFyc2VGbG9hdCh2YWwpOnBhcnNlSW50KHZhbCwxMCk7fSk7aWYocGFydHMubGVuZ3RoPT09NCl7dGhpcy5fYWxwaGE9TWF0aC5mbG9vcihwYXJzZUZsb2F0KHBhcnRzWzNdKSoxMDApO31lbHNlIGlmKHBhcnRzLmxlbmd0aD09PTMpe3RoaXMuX2FscGhhPTEwMDt9aWYocGFydHMubGVuZ3RoPj0zKXt2YXIgX2hzbDJoc3Y9aHNsMmhzdihwYXJ0c1swXSxwYXJ0c1sxXSxwYXJ0c1syXSksaD1faHNsMmhzdi5oLHM9X2hzbDJoc3Yucyx2PV9oc2wyaHN2LnY7ZnJvbUhTVihoLHMsdik7fX1lbHNlIGlmKHZhbHVlLmluZGV4T2YoJ2hzdicpIT09LTEpe3ZhciBfcGFydHM9dmFsdWUucmVwbGFjZSgvaHN2YXxoc3Z8XCh8XCkvZ20sJycpLnNwbGl0KC9cc3wsL2cpLmZpbHRlcihmdW5jdGlvbih2YWwpe3JldHVybiB2YWwhPT0nJzt9KS5tYXAoZnVuY3Rpb24odmFsLGluZGV4KXtyZXR1cm4gaW5kZXg+Mj9wYXJzZUZsb2F0KHZhbCk6cGFyc2VJbnQodmFsLDEwKTt9KTtpZihfcGFydHMubGVuZ3RoPT09NCl7dGhpcy5fYWxwaGE9TWF0aC5mbG9vcihwYXJzZUZsb2F0KF9wYXJ0c1szXSkqMTAwKTt9ZWxzZSBpZihfcGFydHMubGVuZ3RoPT09Myl7dGhpcy5fYWxwaGE9MTAwO31pZihfcGFydHMubGVuZ3RoPj0zKXtmcm9tSFNWKF9wYXJ0c1swXSxfcGFydHNbMV0sX3BhcnRzWzJdKTt9fWVsc2UgaWYodmFsdWUuaW5kZXhPZigncmdiJykhPT0tMSl7dmFyIF9wYXJ0czI9dmFsdWUucmVwbGFjZSgvcmdiYXxyZ2J8XCh8XCkvZ20sJycpLnNwbGl0KC9cc3wsL2cpLmZpbHRlcihmdW5jdGlvbih2YWwpe3JldHVybiB2YWwhPT0nJzt9KS5tYXAoZnVuY3Rpb24odmFsLGluZGV4KXtyZXR1cm4gaW5kZXg+Mj9wYXJzZUZsb2F0KHZhbCk6cGFyc2VJbnQodmFsLDEwKTt9KTtpZihfcGFydHMyLmxlbmd0aD09PTQpe3RoaXMuX2FscGhhPU1hdGguZmxvb3IocGFyc2VGbG9hdChfcGFydHMyWzNdKSoxMDApO31lbHNlIGlmKF9wYXJ0czIubGVuZ3RoPT09Myl7dGhpcy5fYWxwaGE9MTAwO31pZihfcGFydHMyLmxlbmd0aD49Myl7dmFyIF9yZ2IyaHN2PXJnYjJoc3YoX3BhcnRzMlswXSxfcGFydHMyWzFdLF9wYXJ0czJbMl0pLF9oPV9yZ2IyaHN2LmgsX3M9X3JnYjJoc3Yucyxfdj1fcmdiMmhzdi52O2Zyb21IU1YoX2gsX3MsX3YpO319ZWxzZSBpZih2YWx1ZS5pbmRleE9mKCcjJykhPT0tMSl7dmFyIGhleD12YWx1ZS5yZXBsYWNlKCcjJywnJykudHJpbSgpO2lmKCEvXig/OlswLTlhLWZBLUZdezN9KXsxLDJ9JC8udGVzdChoZXgpKXJldHVybjt2YXIgcj12b2lkIDAsZz12b2lkIDAsYj12b2lkIDA7aWYoaGV4Lmxlbmd0aD09PTMpe3I9cGFyc2VIZXhDaGFubmVsKGhleFswXStoZXhbMF0pO2c9cGFyc2VIZXhDaGFubmVsKGhleFsxXStoZXhbMV0pO2I9cGFyc2VIZXhDaGFubmVsKGhleFsyXStoZXhbMl0pO31lbHNlIGlmKGhleC5sZW5ndGg9PT02fHxoZXgubGVuZ3RoPT09OCl7cj1wYXJzZUhleENoYW5uZWwoaGV4LnN1YnN0cmluZygwLDIpKTtnPXBhcnNlSGV4Q2hhbm5lbChoZXguc3Vic3RyaW5nKDIsNCkpO2I9cGFyc2VIZXhDaGFubmVsKGhleC5zdWJzdHJpbmcoNCw2KSk7fWlmKGhleC5sZW5ndGg9PT04KXt0aGlzLl9hbHBoYT1NYXRoLmZsb29yKHBhcnNlSGV4Q2hhbm5lbChoZXguc3Vic3RyaW5nKDYpKS8yNTUqMTAwKTt9ZWxzZSBpZihoZXgubGVuZ3RoPT09M3x8aGV4Lmxlbmd0aD09PTYpe3RoaXMuX2FscGhhPTEwMDt9dmFyIF9yZ2IyaHN2Mj1yZ2IyaHN2KHIsZyxiKSxfaDI9X3JnYjJoc3YyLmgsX3MyPV9yZ2IyaHN2Mi5zLF92Mj1fcmdiMmhzdjIudjtmcm9tSFNWKF9oMixfczIsX3YyKTt9fTtDb2xvci5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbiBjb21wYXJlKGNvbG9yKXtyZXR1cm4gTWF0aC5hYnMoY29sb3IuX2h1ZS10aGlzLl9odWUpPDImJk1hdGguYWJzKGNvbG9yLl9zYXR1cmF0aW9uLXRoaXMuX3NhdHVyYXRpb24pPDEmJk1hdGguYWJzKGNvbG9yLl92YWx1ZS10aGlzLl92YWx1ZSk8MSYmTWF0aC5hYnMoY29sb3IuX2FscGhhLXRoaXMuX2FscGhhKTwxO307Q29sb3IucHJvdG90eXBlLmRvT25DaGFuZ2U9ZnVuY3Rpb24gZG9PbkNoYW5nZSgpe3ZhciBfaHVlPXRoaXMuX2h1ZSxfc2F0dXJhdGlvbj10aGlzLl9zYXR1cmF0aW9uLF92YWx1ZT10aGlzLl92YWx1ZSxfYWxwaGE9dGhpcy5fYWxwaGEsZm9ybWF0PXRoaXMuZm9ybWF0O2lmKHRoaXMuZW5hYmxlQWxwaGEpe3N3aXRjaChmb3JtYXQpe2Nhc2UnaHNsJzp2YXIgaHNsPWhzdjJoc2woX2h1ZSxfc2F0dXJhdGlvbi8xMDAsX3ZhbHVlLzEwMCk7dGhpcy52YWx1ZT0naHNsYSgnK19odWUrJywgJytNYXRoLnJvdW5kKGhzbFsxXSoxMDApKyclLCAnK01hdGgucm91bmQoaHNsWzJdKjEwMCkrJyUsICcrX2FscGhhLzEwMCsnKSc7YnJlYWs7Y2FzZSdoc3YnOnRoaXMudmFsdWU9J2hzdmEoJytfaHVlKycsICcrTWF0aC5yb3VuZChfc2F0dXJhdGlvbikrJyUsICcrTWF0aC5yb3VuZChfdmFsdWUpKyclLCAnK19hbHBoYS8xMDArJyknO2JyZWFrO2RlZmF1bHQ6dmFyIF9oc3YycmdiPWhzdjJyZ2IoX2h1ZSxfc2F0dXJhdGlvbixfdmFsdWUpLHI9X2hzdjJyZ2IucixnPV9oc3YycmdiLmcsYj1faHN2MnJnYi5iO3RoaXMudmFsdWU9J3JnYmEoJytyKycsICcrZysnLCAnK2IrJywgJytfYWxwaGEvMTAwKycpJzt9fWVsc2V7c3dpdGNoKGZvcm1hdCl7Y2FzZSdoc2wnOnZhciBfaHNsPWhzdjJoc2woX2h1ZSxfc2F0dXJhdGlvbi8xMDAsX3ZhbHVlLzEwMCk7dGhpcy52YWx1ZT0naHNsKCcrX2h1ZSsnLCAnK01hdGgucm91bmQoX2hzbFsxXSoxMDApKyclLCAnK01hdGgucm91bmQoX2hzbFsyXSoxMDApKyclKSc7YnJlYWs7Y2FzZSdoc3YnOnRoaXMudmFsdWU9J2hzdignK19odWUrJywgJytNYXRoLnJvdW5kKF9zYXR1cmF0aW9uKSsnJSwgJytNYXRoLnJvdW5kKF92YWx1ZSkrJyUpJzticmVhaztjYXNlJ3JnYic6dmFyIF9oc3YycmdiMj1oc3YycmdiKF9odWUsX3NhdHVyYXRpb24sX3ZhbHVlKSxfcj1faHN2MnJnYjIucixfZz1faHN2MnJnYjIuZyxfYj1faHN2MnJnYjIuYjt0aGlzLnZhbHVlPSdyZ2IoJytfcisnLCAnK19nKycsICcrX2IrJyknO2JyZWFrO2RlZmF1bHQ6dGhpcy52YWx1ZT10b0hleChoc3YycmdiKF9odWUsX3NhdHVyYXRpb24sX3ZhbHVlKSk7fX19O3JldHVybiBDb2xvcjt9KCk7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfY29sb3I9Q29sb3I7Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY29sb3ItcGlja2VyL3NyYy9jb21wb25lbnRzL3BpY2tlci1kcm9wZG93bi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MDY2MDE2MjUmCnZhciBwaWNrZXJfZHJvcGRvd252dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNjYwMTYyNV9yZW5kZXI9ZnVuY3Rpb24gcGlja2VyX2Ryb3Bkb3dudnVlX3R5cGVfdGVtcGxhdGVfaWRfMDY2MDE2MjVfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJ0cmFuc2l0aW9uIix7YXR0cnM6e25hbWU6ImVsLXpvb20taW4tdG9wIn0sb246eyJhZnRlci1sZWF2ZSI6X3ZtLmRvRGVzdHJveX19LFtfYygiZGl2Iix7ZGlyZWN0aXZlczpbe25hbWU6InNob3ciLHJhd05hbWU6InYtc2hvdyIsdmFsdWU6X3ZtLnNob3dQb3BwZXIsZXhwcmVzc2lvbjoic2hvd1BvcHBlciJ9XSxzdGF0aWNDbGFzczoiZWwtY29sb3ItZHJvcGRvd24ifSxbX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1jb2xvci1kcm9wZG93bl9fbWFpbi13cmFwcGVyIn0sW19jKCJodWUtc2xpZGVyIix7cmVmOiJodWUiLHN0YXRpY1N0eWxlOntmbG9hdDoicmlnaHQifSxhdHRyczp7Y29sb3I6X3ZtLmNvbG9yLHZlcnRpY2FsOiIifX0pLF9jKCJzdi1wYW5lbCIse3JlZjoic2wiLGF0dHJzOntjb2xvcjpfdm0uY29sb3J9fSldLDEpLF92bS5zaG93QWxwaGE/X2MoImFscGhhLXNsaWRlciIse3JlZjoiYWxwaGEiLGF0dHJzOntjb2xvcjpfdm0uY29sb3J9fSk6X3ZtLl9lKCksX3ZtLnByZWRlZmluZT9fYygicHJlZGVmaW5lIix7YXR0cnM6e2NvbG9yOl92bS5jb2xvcixjb2xvcnM6X3ZtLnByZWRlZmluZX19KTpfdm0uX2UoKSxfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLWNvbG9yLWRyb3Bkb3duX19idG5zIn0sW19jKCJzcGFuIix7c3RhdGljQ2xhc3M6ImVsLWNvbG9yLWRyb3Bkb3duX192YWx1ZSJ9LFtfYygiZWwtaW5wdXQiLHthdHRyczp7InZhbGlkYXRlLWV2ZW50IjpmYWxzZSxzaXplOiJtaW5pIn0sb246e2JsdXI6X3ZtLmhhbmRsZUNvbmZpcm19LG5hdGl2ZU9uOntrZXl1cDpmdW5jdGlvbiBrZXl1cCgkZXZlbnQpe2lmKCEoImJ1dHRvbiJpbiAkZXZlbnQpJiZfdm0uX2soJGV2ZW50LmtleUNvZGUsImVudGVyIiwxMywkZXZlbnQua2V5LCJFbnRlciIpKXtyZXR1cm4gbnVsbDt9cmV0dXJuIF92bS5oYW5kbGVDb25maXJtKCRldmVudCk7fX0sbW9kZWw6e3ZhbHVlOl92bS5jdXN0b21JbnB1dCxjYWxsYmFjazpmdW5jdGlvbiBjYWxsYmFjaygkJHYpe192bS5jdXN0b21JbnB1dD0kJHY7fSxleHByZXNzaW9uOiJjdXN0b21JbnB1dCJ9fSldLDEpLF9jKCJlbC1idXR0b24iLHtzdGF0aWNDbGFzczoiZWwtY29sb3ItZHJvcGRvd25fX2xpbmstYnRuIixhdHRyczp7c2l6ZToibWluaSIsdHlwZToidGV4dCJ9LG9uOntjbGljazpmdW5jdGlvbiBjbGljaygkZXZlbnQpe192bS4kZW1pdCgiY2xlYXIiKTt9fX0sW192bS5fdigiXG4gICAgICAgICIrX3ZtLl9zKF92bS50KCJlbC5jb2xvcnBpY2tlci5jbGVhciIpKSsiXG4gICAgICAiKV0pLF9jKCJlbC1idXR0b24iLHtzdGF0aWNDbGFzczoiZWwtY29sb3ItZHJvcGRvd25fX2J0biIsYXR0cnM6e3BsYWluOiIiLHNpemU6Im1pbmkifSxvbjp7Y2xpY2s6X3ZtLmNvbmZpcm1WYWx1ZX19LFtfdm0uX3YoIlxuICAgICAgICAiK192bS5fcyhfdm0udCgiZWwuY29sb3JwaWNrZXIuY29uZmlybSIpKSsiXG4gICAgICAiKV0pXSwxKV0sMSldKTt9O3ZhciBwaWNrZXJfZHJvcGRvd252dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNjYwMTYyNV9zdGF0aWNSZW5kZXJGbnM9W107cGlja2VyX2Ryb3Bkb3dudnVlX3R5cGVfdGVtcGxhdGVfaWRfMDY2MDE2MjVfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NvbG9yLXBpY2tlci9zcmMvY29tcG9uZW50cy9waWNrZXItZHJvcGRvd24udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTA2NjAxNjI1JgovLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2NvbG9yLXBpY2tlci9zcmMvY29tcG9uZW50cy9zdi1wYW5lbC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9ZDg1ODM1OTYmCnZhciBzdl9wYW5lbHZ1ZV90eXBlX3RlbXBsYXRlX2lkX2Q4NTgzNTk2X3JlbmRlcj1mdW5jdGlvbiBzdl9wYW5lbHZ1ZV90eXBlX3RlbXBsYXRlX2lkX2Q4NTgzNTk2X3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLWNvbG9yLXN2cGFuZWwiLHN0eWxlOntiYWNrZ3JvdW5kQ29sb3I6X3ZtLmJhY2tncm91bmR9fSxbX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1jb2xvci1zdnBhbmVsX193aGl0ZSJ9KSxfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLWNvbG9yLXN2cGFuZWxfX2JsYWNrIn0pLF9jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtY29sb3Itc3ZwYW5lbF9fY3Vyc29yIixzdHlsZTp7dG9wOl92bS5jdXJzb3JUb3ArInB4IixsZWZ0Ol92bS5jdXJzb3JMZWZ0KyJweCJ9fSxbX2MoImRpdiIpXSldKTt9O3ZhciBzdl9wYW5lbHZ1ZV90eXBlX3RlbXBsYXRlX2lkX2Q4NTgzNTk2X3N0YXRpY1JlbmRlckZucz1bXTtzdl9wYW5lbHZ1ZV90eXBlX3RlbXBsYXRlX2lkX2Q4NTgzNTk2X3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL2NvbXBvbmVudHMvc3YtcGFuZWwudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWQ4NTgzNTk2JgovLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NvbG9yLXBpY2tlci9zcmMvZHJhZ2dhYmxlLmpzCnZhciBpc0RyYWdnaW5nPWZhbHNlOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgZHJhZ2dhYmxlPWZ1bmN0aW9uIGRyYWdnYWJsZShlbGVtZW50LG9wdGlvbnMpe2lmKGV4dGVybmFsX3Z1ZV9kZWZhdWx0LmEucHJvdG90eXBlLiRpc1NlcnZlcilyZXR1cm47dmFyIG1vdmVGbj1mdW5jdGlvbiBtb3ZlRm4oZXZlbnQpe2lmKG9wdGlvbnMuZHJhZyl7b3B0aW9ucy5kcmFnKGV2ZW50KTt9fTt2YXIgdXBGbj1mdW5jdGlvbiB1cEZuKGV2ZW50KXtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLG1vdmVGbik7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsdXBGbik7ZG9jdW1lbnQub25zZWxlY3RzdGFydD1udWxsO2RvY3VtZW50Lm9uZHJhZ3N0YXJ0PW51bGw7aXNEcmFnZ2luZz1mYWxzZTtpZihvcHRpb25zLmVuZCl7b3B0aW9ucy5lbmQoZXZlbnQpO319O2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJyxmdW5jdGlvbihldmVudCl7aWYoaXNEcmFnZ2luZylyZXR1cm47ZG9jdW1lbnQub25zZWxlY3RzdGFydD1mdW5jdGlvbigpe3JldHVybiBmYWxzZTt9O2RvY3VtZW50Lm9uZHJhZ3N0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIGZhbHNlO307ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyxtb3ZlRm4pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLHVwRm4pO2lzRHJhZ2dpbmc9dHJ1ZTtpZihvcHRpb25zLnN0YXJ0KXtvcHRpb25zLnN0YXJ0KGV2ZW50KTt9fSk7fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL2NvbXBvbmVudHMvc3YtcGFuZWwudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHN2X3BhbmVsdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidlbC1zbC1wYW5lbCcscHJvcHM6e2NvbG9yOntyZXF1aXJlZDp0cnVlfX0sY29tcHV0ZWQ6e2NvbG9yVmFsdWU6ZnVuY3Rpb24gY29sb3JWYWx1ZSgpe3ZhciBodWU9dGhpcy5jb2xvci5nZXQoJ2h1ZScpO3ZhciB2YWx1ZT10aGlzLmNvbG9yLmdldCgndmFsdWUnKTtyZXR1cm57aHVlOmh1ZSx2YWx1ZTp2YWx1ZX07fX0sd2F0Y2g6e2NvbG9yVmFsdWU6ZnVuY3Rpb24gY29sb3JWYWx1ZSgpe3RoaXMudXBkYXRlKCk7fX0sbWV0aG9kczp7dXBkYXRlOmZ1bmN0aW9uIHVwZGF0ZSgpe3ZhciBzYXR1cmF0aW9uPXRoaXMuY29sb3IuZ2V0KCdzYXR1cmF0aW9uJyk7dmFyIHZhbHVlPXRoaXMuY29sb3IuZ2V0KCd2YWx1ZScpO3ZhciBlbD10aGlzLiRlbDt2YXIgd2lkdGg9ZWwuY2xpZW50V2lkdGgsaGVpZ2h0PWVsLmNsaWVudEhlaWdodDt0aGlzLmN1cnNvckxlZnQ9c2F0dXJhdGlvbip3aWR0aC8xMDA7dGhpcy5jdXJzb3JUb3A9KDEwMC12YWx1ZSkqaGVpZ2h0LzEwMDt0aGlzLmJhY2tncm91bmQ9J2hzbCgnK3RoaXMuY29sb3IuZ2V0KCdodWUnKSsnLCAxMDAlLCA1MCUpJzt9LGhhbmRsZURyYWc6ZnVuY3Rpb24gaGFuZGxlRHJhZyhldmVudCl7dmFyIGVsPXRoaXMuJGVsO3ZhciByZWN0PWVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3ZhciBsZWZ0PWV2ZW50LmNsaWVudFgtcmVjdC5sZWZ0O3ZhciB0b3A9ZXZlbnQuY2xpZW50WS1yZWN0LnRvcDtsZWZ0PU1hdGgubWF4KDAsbGVmdCk7bGVmdD1NYXRoLm1pbihsZWZ0LHJlY3Qud2lkdGgpO3RvcD1NYXRoLm1heCgwLHRvcCk7dG9wPU1hdGgubWluKHRvcCxyZWN0LmhlaWdodCk7dGhpcy5jdXJzb3JMZWZ0PWxlZnQ7dGhpcy5jdXJzb3JUb3A9dG9wO3RoaXMuY29sb3Iuc2V0KHtzYXR1cmF0aW9uOmxlZnQvcmVjdC53aWR0aCoxMDAsdmFsdWU6MTAwLXRvcC9yZWN0LmhlaWdodCoxMDB9KTt9fSxtb3VudGVkOmZ1bmN0aW9uIG1vdW50ZWQoKXt2YXIgX3RoaXM9dGhpcztkcmFnZ2FibGUodGhpcy4kZWwse2RyYWc6ZnVuY3Rpb24gZHJhZyhldmVudCl7X3RoaXMuaGFuZGxlRHJhZyhldmVudCk7fSxlbmQ6ZnVuY3Rpb24gZW5kKGV2ZW50KXtfdGhpcy5oYW5kbGVEcmFnKGV2ZW50KTt9fSk7dGhpcy51cGRhdGUoKTt9LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybntjdXJzb3JUb3A6MCxjdXJzb3JMZWZ0OjAsYmFja2dyb3VuZDonaHNsKDAsIDEwMCUsIDUwJSknfTt9fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NvbG9yLXBpY2tlci9zcmMvY29tcG9uZW50cy9zdi1wYW5lbC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgY29tcG9uZW50c19zdl9wYW5lbHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz1zdl9wYW5lbHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NvbG9yLXBpY2tlci9zcmMvY29tcG9uZW50cy9zdi1wYW5lbC52dWUKLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciBzdl9wYW5lbF9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KGNvbXBvbmVudHNfc3ZfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sc3ZfcGFuZWx2dWVfdHlwZV90ZW1wbGF0ZV9pZF9kODU4MzU5Nl9yZW5kZXIsc3ZfcGFuZWx2dWVfdHlwZV90ZW1wbGF0ZV9pZF9kODU4MzU5Nl9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIHN2X3BhbmVsX2FwaTt9c3ZfcGFuZWxfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL2NvbXBvbmVudHMvc3YtcGFuZWwudnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHN2X3BhbmVsPXN2X3BhbmVsX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY29sb3ItcGlja2VyL3NyYy9jb21wb25lbnRzL2h1ZS1zbGlkZXIudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTVjZGM0M2IxJgp2YXIgaHVlX3NsaWRlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzVjZGM0M2IxX3JlbmRlcj1mdW5jdGlvbiBodWVfc2xpZGVydnVlX3R5cGVfdGVtcGxhdGVfaWRfNWNkYzQzYjFfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtY29sb3ItaHVlLXNsaWRlciIsY2xhc3M6eyJpcy12ZXJ0aWNhbCI6X3ZtLnZlcnRpY2FsfX0sW19jKCJkaXYiLHtyZWY6ImJhciIsc3RhdGljQ2xhc3M6ImVsLWNvbG9yLWh1ZS1zbGlkZXJfX2JhciIsb246e2NsaWNrOl92bS5oYW5kbGVDbGlja319KSxfYygiZGl2Iix7cmVmOiJ0aHVtYiIsc3RhdGljQ2xhc3M6ImVsLWNvbG9yLWh1ZS1zbGlkZXJfX3RodW1iIixzdHlsZTp7bGVmdDpfdm0udGh1bWJMZWZ0KyJweCIsdG9wOl92bS50aHVtYlRvcCsicHgifX0pXSk7fTt2YXIgaHVlX3NsaWRlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzVjZGM0M2IxX3N0YXRpY1JlbmRlckZucz1bXTtodWVfc2xpZGVydnVlX3R5cGVfdGVtcGxhdGVfaWRfNWNkYzQzYjFfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NvbG9yLXBpY2tlci9zcmMvY29tcG9uZW50cy9odWUtc2xpZGVyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD01Y2RjNDNiMSYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY29sb3ItcGlja2VyL3NyYy9jb21wb25lbnRzL2h1ZS1zbGlkZXIudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGh1ZV9zbGlkZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e25hbWU6J2VsLWNvbG9yLWh1ZS1zbGlkZXInLHByb3BzOntjb2xvcjp7cmVxdWlyZWQ6dHJ1ZX0sdmVydGljYWw6Qm9vbGVhbn0sZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue3RodW1iTGVmdDowLHRodW1iVG9wOjB9O30sY29tcHV0ZWQ6e2h1ZVZhbHVlOmZ1bmN0aW9uIGh1ZVZhbHVlKCl7dmFyIGh1ZT10aGlzLmNvbG9yLmdldCgnaHVlJyk7cmV0dXJuIGh1ZTt9fSx3YXRjaDp7aHVlVmFsdWU6ZnVuY3Rpb24gaHVlVmFsdWUoKXt0aGlzLnVwZGF0ZSgpO319LG1ldGhvZHM6e2hhbmRsZUNsaWNrOmZ1bmN0aW9uIGhhbmRsZUNsaWNrKGV2ZW50KXt2YXIgdGh1bWI9dGhpcy4kcmVmcy50aHVtYjt2YXIgdGFyZ2V0PWV2ZW50LnRhcmdldDtpZih0YXJnZXQhPT10aHVtYil7dGhpcy5oYW5kbGVEcmFnKGV2ZW50KTt9fSxoYW5kbGVEcmFnOmZ1bmN0aW9uIGhhbmRsZURyYWcoZXZlbnQpe3ZhciByZWN0PXRoaXMuJGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3ZhciB0aHVtYj10aGlzLiRyZWZzLnRodW1iO3ZhciBodWU9dm9pZCAwO2lmKCF0aGlzLnZlcnRpY2FsKXt2YXIgbGVmdD1ldmVudC5jbGllbnRYLXJlY3QubGVmdDtsZWZ0PU1hdGgubWluKGxlZnQscmVjdC53aWR0aC10aHVtYi5vZmZzZXRXaWR0aC8yKTtsZWZ0PU1hdGgubWF4KHRodW1iLm9mZnNldFdpZHRoLzIsbGVmdCk7aHVlPU1hdGgucm91bmQoKGxlZnQtdGh1bWIub2Zmc2V0V2lkdGgvMikvKHJlY3Qud2lkdGgtdGh1bWIub2Zmc2V0V2lkdGgpKjM2MCk7fWVsc2V7dmFyIHRvcD1ldmVudC5jbGllbnRZLXJlY3QudG9wO3RvcD1NYXRoLm1pbih0b3AscmVjdC5oZWlnaHQtdGh1bWIub2Zmc2V0SGVpZ2h0LzIpO3RvcD1NYXRoLm1heCh0aHVtYi5vZmZzZXRIZWlnaHQvMix0b3ApO2h1ZT1NYXRoLnJvdW5kKCh0b3AtdGh1bWIub2Zmc2V0SGVpZ2h0LzIpLyhyZWN0LmhlaWdodC10aHVtYi5vZmZzZXRIZWlnaHQpKjM2MCk7fXRoaXMuY29sb3Iuc2V0KCdodWUnLGh1ZSk7fSxnZXRUaHVtYkxlZnQ6ZnVuY3Rpb24gZ2V0VGh1bWJMZWZ0KCl7aWYodGhpcy52ZXJ0aWNhbClyZXR1cm4gMDt2YXIgZWw9dGhpcy4kZWw7dmFyIGh1ZT10aGlzLmNvbG9yLmdldCgnaHVlJyk7aWYoIWVsKXJldHVybiAwO3ZhciB0aHVtYj10aGlzLiRyZWZzLnRodW1iO3JldHVybiBNYXRoLnJvdW5kKGh1ZSooZWwub2Zmc2V0V2lkdGgtdGh1bWIub2Zmc2V0V2lkdGgvMikvMzYwKTt9LGdldFRodW1iVG9wOmZ1bmN0aW9uIGdldFRodW1iVG9wKCl7aWYoIXRoaXMudmVydGljYWwpcmV0dXJuIDA7dmFyIGVsPXRoaXMuJGVsO3ZhciBodWU9dGhpcy5jb2xvci5nZXQoJ2h1ZScpO2lmKCFlbClyZXR1cm4gMDt2YXIgdGh1bWI9dGhpcy4kcmVmcy50aHVtYjtyZXR1cm4gTWF0aC5yb3VuZChodWUqKGVsLm9mZnNldEhlaWdodC10aHVtYi5vZmZzZXRIZWlnaHQvMikvMzYwKTt9LHVwZGF0ZTpmdW5jdGlvbiB1cGRhdGUoKXt0aGlzLnRodW1iTGVmdD10aGlzLmdldFRodW1iTGVmdCgpO3RoaXMudGh1bWJUb3A9dGhpcy5nZXRUaHVtYlRvcCgpO319LG1vdW50ZWQ6ZnVuY3Rpb24gbW91bnRlZCgpe3ZhciBfdGhpcz10aGlzO3ZhciBfJHJlZnM9dGhpcy4kcmVmcyxiYXI9XyRyZWZzLmJhcix0aHVtYj1fJHJlZnMudGh1bWI7dmFyIGRyYWdDb25maWc9e2RyYWc6ZnVuY3Rpb24gZHJhZyhldmVudCl7X3RoaXMuaGFuZGxlRHJhZyhldmVudCk7fSxlbmQ6ZnVuY3Rpb24gZW5kKGV2ZW50KXtfdGhpcy5oYW5kbGVEcmFnKGV2ZW50KTt9fTtkcmFnZ2FibGUoYmFyLGRyYWdDb25maWcpO2RyYWdnYWJsZSh0aHVtYixkcmFnQ29uZmlnKTt0aGlzLnVwZGF0ZSgpO319Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY29sb3ItcGlja2VyL3NyYy9jb21wb25lbnRzL2h1ZS1zbGlkZXIudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGNvbXBvbmVudHNfaHVlX3NsaWRlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz1odWVfc2xpZGVydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY29sb3ItcGlja2VyL3NyYy9jb21wb25lbnRzL2h1ZS1zbGlkZXIudnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgaHVlX3NsaWRlcl9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KGNvbXBvbmVudHNfaHVlX3NsaWRlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxodWVfc2xpZGVydnVlX3R5cGVfdGVtcGxhdGVfaWRfNWNkYzQzYjFfcmVuZGVyLGh1ZV9zbGlkZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF81Y2RjNDNiMV9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIGh1ZV9zbGlkZXJfYXBpO31odWVfc2xpZGVyX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvY29sb3ItcGlja2VyL3NyYy9jb21wb25lbnRzL2h1ZS1zbGlkZXIudnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGh1ZV9zbGlkZXI9aHVlX3NsaWRlcl9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2NvbG9yLXBpY2tlci9zcmMvY29tcG9uZW50cy9hbHBoYS1zbGlkZXIudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTA2OGM2NmNiJgp2YXIgYWxwaGFfc2xpZGVydnVlX3R5cGVfdGVtcGxhdGVfaWRfMDY4YzY2Y2JfcmVuZGVyPWZ1bmN0aW9uIGFscGhhX3NsaWRlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzA2OGM2NmNiX3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLWNvbG9yLWFscGhhLXNsaWRlciIsY2xhc3M6eyJpcy12ZXJ0aWNhbCI6X3ZtLnZlcnRpY2FsfX0sW19jKCJkaXYiLHtyZWY6ImJhciIsc3RhdGljQ2xhc3M6ImVsLWNvbG9yLWFscGhhLXNsaWRlcl9fYmFyIixzdHlsZTp7YmFja2dyb3VuZDpfdm0uYmFja2dyb3VuZH0sb246e2NsaWNrOl92bS5oYW5kbGVDbGlja319KSxfYygiZGl2Iix7cmVmOiJ0aHVtYiIsc3RhdGljQ2xhc3M6ImVsLWNvbG9yLWFscGhhLXNsaWRlcl9fdGh1bWIiLHN0eWxlOntsZWZ0Ol92bS50aHVtYkxlZnQrInB4Iix0b3A6X3ZtLnRodW1iVG9wKyJweCJ9fSldKTt9O3ZhciBhbHBoYV9zbGlkZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNjhjNjZjYl9zdGF0aWNSZW5kZXJGbnM9W107YWxwaGFfc2xpZGVydnVlX3R5cGVfdGVtcGxhdGVfaWRfMDY4YzY2Y2JfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NvbG9yLXBpY2tlci9zcmMvY29tcG9uZW50cy9hbHBoYS1zbGlkZXIudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTA2OGM2NmNiJgovLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL2NvbXBvbmVudHMvYWxwaGEtc2xpZGVyLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBhbHBoYV9zbGlkZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e25hbWU6J2VsLWNvbG9yLWFscGhhLXNsaWRlcicscHJvcHM6e2NvbG9yOntyZXF1aXJlZDp0cnVlfSx2ZXJ0aWNhbDpCb29sZWFufSx3YXRjaDp7J2NvbG9yLl9hbHBoYSc6ZnVuY3Rpb24gY29sb3JfYWxwaGEoKXt0aGlzLnVwZGF0ZSgpO30sJ2NvbG9yLnZhbHVlJzpmdW5jdGlvbiBjb2xvclZhbHVlKCl7dGhpcy51cGRhdGUoKTt9fSxtZXRob2RzOntoYW5kbGVDbGljazpmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCl7dmFyIHRodW1iPXRoaXMuJHJlZnMudGh1bWI7dmFyIHRhcmdldD1ldmVudC50YXJnZXQ7aWYodGFyZ2V0IT09dGh1bWIpe3RoaXMuaGFuZGxlRHJhZyhldmVudCk7fX0saGFuZGxlRHJhZzpmdW5jdGlvbiBoYW5kbGVEcmFnKGV2ZW50KXt2YXIgcmVjdD10aGlzLiRlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgdGh1bWI9dGhpcy4kcmVmcy50aHVtYjtpZighdGhpcy52ZXJ0aWNhbCl7dmFyIGxlZnQ9ZXZlbnQuY2xpZW50WC1yZWN0LmxlZnQ7bGVmdD1NYXRoLm1heCh0aHVtYi5vZmZzZXRXaWR0aC8yLGxlZnQpO2xlZnQ9TWF0aC5taW4obGVmdCxyZWN0LndpZHRoLXRodW1iLm9mZnNldFdpZHRoLzIpO3RoaXMuY29sb3Iuc2V0KCdhbHBoYScsTWF0aC5yb3VuZCgobGVmdC10aHVtYi5vZmZzZXRXaWR0aC8yKS8ocmVjdC53aWR0aC10aHVtYi5vZmZzZXRXaWR0aCkqMTAwKSk7fWVsc2V7dmFyIHRvcD1ldmVudC5jbGllbnRZLXJlY3QudG9wO3RvcD1NYXRoLm1heCh0aHVtYi5vZmZzZXRIZWlnaHQvMix0b3ApO3RvcD1NYXRoLm1pbih0b3AscmVjdC5oZWlnaHQtdGh1bWIub2Zmc2V0SGVpZ2h0LzIpO3RoaXMuY29sb3Iuc2V0KCdhbHBoYScsTWF0aC5yb3VuZCgodG9wLXRodW1iLm9mZnNldEhlaWdodC8yKS8ocmVjdC5oZWlnaHQtdGh1bWIub2Zmc2V0SGVpZ2h0KSoxMDApKTt9fSxnZXRUaHVtYkxlZnQ6ZnVuY3Rpb24gZ2V0VGh1bWJMZWZ0KCl7aWYodGhpcy52ZXJ0aWNhbClyZXR1cm4gMDt2YXIgZWw9dGhpcy4kZWw7dmFyIGFscGhhPXRoaXMuY29sb3IuX2FscGhhO2lmKCFlbClyZXR1cm4gMDt2YXIgdGh1bWI9dGhpcy4kcmVmcy50aHVtYjtyZXR1cm4gTWF0aC5yb3VuZChhbHBoYSooZWwub2Zmc2V0V2lkdGgtdGh1bWIub2Zmc2V0V2lkdGgvMikvMTAwKTt9LGdldFRodW1iVG9wOmZ1bmN0aW9uIGdldFRodW1iVG9wKCl7aWYoIXRoaXMudmVydGljYWwpcmV0dXJuIDA7dmFyIGVsPXRoaXMuJGVsO3ZhciBhbHBoYT10aGlzLmNvbG9yLl9hbHBoYTtpZighZWwpcmV0dXJuIDA7dmFyIHRodW1iPXRoaXMuJHJlZnMudGh1bWI7cmV0dXJuIE1hdGgucm91bmQoYWxwaGEqKGVsLm9mZnNldEhlaWdodC10aHVtYi5vZmZzZXRIZWlnaHQvMikvMTAwKTt9LGdldEJhY2tncm91bmQ6ZnVuY3Rpb24gZ2V0QmFja2dyb3VuZCgpe2lmKHRoaXMuY29sb3ImJnRoaXMuY29sb3IudmFsdWUpe3ZhciBfY29sb3IkdG9SZ2I9dGhpcy5jb2xvci50b1JnYigpLHI9X2NvbG9yJHRvUmdiLnIsZz1fY29sb3IkdG9SZ2IuZyxiPV9jb2xvciR0b1JnYi5iO3JldHVybidsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoJytyKycsICcrZysnLCAnK2IrJywgMCkgMCUsIHJnYmEoJytyKycsICcrZysnLCAnK2IrJywgMSkgMTAwJSknO31yZXR1cm4gbnVsbDt9LHVwZGF0ZTpmdW5jdGlvbiB1cGRhdGUoKXt0aGlzLnRodW1iTGVmdD10aGlzLmdldFRodW1iTGVmdCgpO3RoaXMudGh1bWJUb3A9dGhpcy5nZXRUaHVtYlRvcCgpO3RoaXMuYmFja2dyb3VuZD10aGlzLmdldEJhY2tncm91bmQoKTt9fSxkYXRhOmZ1bmN0aW9uIGRhdGEoKXtyZXR1cm57dGh1bWJMZWZ0OjAsdGh1bWJUb3A6MCxiYWNrZ3JvdW5kOm51bGx9O30sbW91bnRlZDpmdW5jdGlvbiBtb3VudGVkKCl7dmFyIF90aGlzPXRoaXM7dmFyIF8kcmVmcz10aGlzLiRyZWZzLGJhcj1fJHJlZnMuYmFyLHRodW1iPV8kcmVmcy50aHVtYjt2YXIgZHJhZ0NvbmZpZz17ZHJhZzpmdW5jdGlvbiBkcmFnKGV2ZW50KXtfdGhpcy5oYW5kbGVEcmFnKGV2ZW50KTt9LGVuZDpmdW5jdGlvbiBlbmQoZXZlbnQpe190aGlzLmhhbmRsZURyYWcoZXZlbnQpO319O2RyYWdnYWJsZShiYXIsZHJhZ0NvbmZpZyk7ZHJhZ2dhYmxlKHRodW1iLGRyYWdDb25maWcpO3RoaXMudXBkYXRlKCk7fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL2NvbXBvbmVudHMvYWxwaGEtc2xpZGVyLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBjb21wb25lbnRzX2FscGhhX3NsaWRlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz1hbHBoYV9zbGlkZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL2NvbXBvbmVudHMvYWxwaGEtc2xpZGVyLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIGFscGhhX3NsaWRlcl9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KGNvbXBvbmVudHNfYWxwaGFfc2xpZGVydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLGFscGhhX3NsaWRlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzA2OGM2NmNiX3JlbmRlcixhbHBoYV9zbGlkZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNjhjNjZjYl9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIGFscGhhX3NsaWRlcl9hcGk7fWFscGhhX3NsaWRlcl9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL2NvbG9yLXBpY2tlci9zcmMvY29tcG9uZW50cy9hbHBoYS1zbGlkZXIudnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGFscGhhX3NsaWRlcj1hbHBoYV9zbGlkZXJfY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL2NvbXBvbmVudHMvcHJlZGVmaW5lLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0wNmUwMzA5MyYKdmFyIHByZWRlZmluZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzA2ZTAzMDkzX3JlbmRlcj1mdW5jdGlvbiBwcmVkZWZpbmV2dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNmUwMzA5M19yZW5kZXIoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDt2YXIgX2M9X3ZtLl9zZWxmLl9jfHxfaDtyZXR1cm4gX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1jb2xvci1wcmVkZWZpbmUifSxbX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1jb2xvci1wcmVkZWZpbmVfX2NvbG9ycyJ9LF92bS5fbChfdm0ucmdiYUNvbG9ycyxmdW5jdGlvbihpdGVtLGluZGV4KXtyZXR1cm4gX2MoImRpdiIse2tleTpfdm0uY29sb3JzW2luZGV4XSxzdGF0aWNDbGFzczoiZWwtY29sb3ItcHJlZGVmaW5lX19jb2xvci1zZWxlY3RvciIsY2xhc3M6e3NlbGVjdGVkOml0ZW0uc2VsZWN0ZWQsImlzLWFscGhhIjppdGVtLl9hbHBoYTwxMDB9LG9uOntjbGljazpmdW5jdGlvbiBjbGljaygkZXZlbnQpe192bS5oYW5kbGVTZWxlY3QoaW5kZXgpO319fSxbX2MoImRpdiIse3N0eWxlOnsiYmFja2dyb3VuZC1jb2xvciI6aXRlbS52YWx1ZX19KV0pO30pLDApXSk7fTt2YXIgcHJlZGVmaW5ldnVlX3R5cGVfdGVtcGxhdGVfaWRfMDZlMDMwOTNfc3RhdGljUmVuZGVyRm5zPVtdO3ByZWRlZmluZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzA2ZTAzMDkzX3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL2NvbXBvbmVudHMvcHJlZGVmaW5lLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0wNmUwMzA5MyYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY29sb3ItcGlja2VyL3NyYy9jb21wb25lbnRzL3ByZWRlZmluZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcHJlZGVmaW5ldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtwcm9wczp7Y29sb3JzOnt0eXBlOkFycmF5LHJlcXVpcmVkOnRydWV9LGNvbG9yOntyZXF1aXJlZDp0cnVlfX0sZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue3JnYmFDb2xvcnM6dGhpcy5wYXJzZUNvbG9ycyh0aGlzLmNvbG9ycyx0aGlzLmNvbG9yKX07fSxtZXRob2RzOntoYW5kbGVTZWxlY3Q6ZnVuY3Rpb24gaGFuZGxlU2VsZWN0KGluZGV4KXt0aGlzLmNvbG9yLmZyb21TdHJpbmcodGhpcy5jb2xvcnNbaW5kZXhdKTt9LHBhcnNlQ29sb3JzOmZ1bmN0aW9uIHBhcnNlQ29sb3JzKGNvbG9ycyxjb2xvcil7cmV0dXJuIGNvbG9ycy5tYXAoZnVuY3Rpb24odmFsdWUpe3ZhciBjPW5ldyBzcmNfY29sb3IoKTtjLmVuYWJsZUFscGhhPXRydWU7Yy5mb3JtYXQ9J3JnYmEnO2MuZnJvbVN0cmluZyh2YWx1ZSk7Yy5zZWxlY3RlZD1jLnZhbHVlPT09Y29sb3IudmFsdWU7cmV0dXJuIGM7fSk7fX0sd2F0Y2g6eyckcGFyZW50LmN1cnJlbnRDb2xvcic6ZnVuY3Rpb24gJHBhcmVudEN1cnJlbnRDb2xvcih2YWwpe3ZhciBjb2xvcj1uZXcgc3JjX2NvbG9yKCk7Y29sb3IuZnJvbVN0cmluZyh2YWwpO3RoaXMucmdiYUNvbG9ycy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pe2l0ZW0uc2VsZWN0ZWQ9Y29sb3IuY29tcGFyZShpdGVtKTt9KTt9LGNvbG9yczpmdW5jdGlvbiBjb2xvcnMobmV3VmFsKXt0aGlzLnJnYmFDb2xvcnM9dGhpcy5wYXJzZUNvbG9ycyhuZXdWYWwsdGhpcy5jb2xvcik7fSxjb2xvcjpmdW5jdGlvbiBjb2xvcihuZXdWYWwpe3RoaXMucmdiYUNvbG9ycz10aGlzLnBhcnNlQ29sb3JzKHRoaXMuY29sb3JzLG5ld1ZhbCk7fX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY29sb3ItcGlja2VyL3NyYy9jb21wb25lbnRzL3ByZWRlZmluZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgY29tcG9uZW50c19wcmVkZWZpbmV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189cHJlZGVmaW5ldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY29sb3ItcGlja2VyL3NyYy9jb21wb25lbnRzL3ByZWRlZmluZS52dWUKLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciBwcmVkZWZpbmVfY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChjb21wb25lbnRzX3ByZWRlZmluZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxwcmVkZWZpbmV2dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNmUwMzA5M19yZW5kZXIscHJlZGVmaW5ldnVlX3R5cGVfdGVtcGxhdGVfaWRfMDZlMDMwOTNfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciBwcmVkZWZpbmVfYXBpO31wcmVkZWZpbmVfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL2NvbXBvbmVudHMvcHJlZGVmaW5lLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwcmVkZWZpbmU9cHJlZGVmaW5lX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2NvbG9yLXBpY2tlci9zcmMvY29tcG9uZW50cy9waWNrZXItZHJvcGRvd24udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBpY2tlcl9kcm9wZG93bnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17bmFtZTonZWwtY29sb3ItcGlja2VyLWRyb3Bkb3duJyxtaXhpbnM6W3Z1ZV9wb3BwZXJfZGVmYXVsdC5hLGxvY2FsZV9kZWZhdWx0LmFdLGNvbXBvbmVudHM6e1N2UGFuZWw6c3ZfcGFuZWwsSHVlU2xpZGVyOmh1ZV9zbGlkZXIsQWxwaGFTbGlkZXI6YWxwaGFfc2xpZGVyLEVsSW5wdXQ6aW5wdXRfZGVmYXVsdC5hLEVsQnV0dG9uOmJ1dHRvbl9kZWZhdWx0LmEsUHJlZGVmaW5lOnByZWRlZmluZX0scHJvcHM6e2NvbG9yOntyZXF1aXJlZDp0cnVlfSxzaG93QWxwaGE6Qm9vbGVhbixwcmVkZWZpbmU6QXJyYXl9LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybntjdXN0b21JbnB1dDonJ307fSxjb21wdXRlZDp7Y3VycmVudENvbG9yOmZ1bmN0aW9uIGN1cnJlbnRDb2xvcigpe3ZhciBwYXJlbnQ9dGhpcy4kcGFyZW50O3JldHVybiFwYXJlbnQudmFsdWUmJiFwYXJlbnQuc2hvd1BhbmVsQ29sb3I/Jyc6cGFyZW50LmNvbG9yLnZhbHVlO319LG1ldGhvZHM6e2NvbmZpcm1WYWx1ZTpmdW5jdGlvbiBjb25maXJtVmFsdWUoKXt0aGlzLiRlbWl0KCdwaWNrJyk7fSxoYW5kbGVDb25maXJtOmZ1bmN0aW9uIGhhbmRsZUNvbmZpcm0oKXt0aGlzLmNvbG9yLmZyb21TdHJpbmcodGhpcy5jdXN0b21JbnB1dCk7fX0sbW91bnRlZDpmdW5jdGlvbiBtb3VudGVkKCl7dGhpcy4kcGFyZW50LnBvcHBlckVsbT10aGlzLnBvcHBlckVsbT10aGlzLiRlbDt0aGlzLnJlZmVyZW5jZUVsbT10aGlzLiRwYXJlbnQuJGVsO30sd2F0Y2g6e3Nob3dQb3BwZXI6ZnVuY3Rpb24gc2hvd1BvcHBlcih2YWwpe3ZhciBfdGhpcz10aGlzO2lmKHZhbD09PXRydWUpe3RoaXMuJG5leHRUaWNrKGZ1bmN0aW9uKCl7dmFyIF8kcmVmcz1fdGhpcy4kcmVmcyxzbD1fJHJlZnMuc2wsaHVlPV8kcmVmcy5odWUsYWxwaGE9XyRyZWZzLmFscGhhO3NsJiZzbC51cGRhdGUoKTtodWUmJmh1ZS51cGRhdGUoKTthbHBoYSYmYWxwaGEudXBkYXRlKCk7fSk7fX0sY3VycmVudENvbG9yOntpbW1lZGlhdGU6dHJ1ZSxoYW5kbGVyOmZ1bmN0aW9uIGhhbmRsZXIodmFsKXt0aGlzLmN1c3RvbUlucHV0PXZhbDt9fX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY29sb3ItcGlja2VyL3NyYy9jb21wb25lbnRzL3BpY2tlci1kcm9wZG93bi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgY29tcG9uZW50c19waWNrZXJfZHJvcGRvd252dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189cGlja2VyX2Ryb3Bkb3dudnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY29sb3ItcGlja2VyL3NyYy9jb21wb25lbnRzL3BpY2tlci1kcm9wZG93bi52dWUKLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciBwaWNrZXJfZHJvcGRvd25fY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChjb21wb25lbnRzX3BpY2tlcl9kcm9wZG93bnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxwaWNrZXJfZHJvcGRvd252dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNjYwMTYyNV9yZW5kZXIscGlja2VyX2Ryb3Bkb3dudnVlX3R5cGVfdGVtcGxhdGVfaWRfMDY2MDE2MjVfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciBwaWNrZXJfZHJvcGRvd25fYXBpO31waWNrZXJfZHJvcGRvd25fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL2NvbXBvbmVudHMvcGlja2VyLWRyb3Bkb3duLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwaWNrZXJfZHJvcGRvd249cGlja2VyX2Ryb3Bkb3duX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2NvbG9yLXBpY2tlci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgY29sb3JfcGlja2VyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbENvbG9yUGlja2VyJyxtaXhpbnM6W2VtaXR0ZXJfZGVmYXVsdC5hXSxwcm9wczp7dmFsdWU6U3RyaW5nLHNob3dBbHBoYTpCb29sZWFuLGNvbG9yRm9ybWF0OlN0cmluZyxkaXNhYmxlZDpCb29sZWFuLHNpemU6U3RyaW5nLHBvcHBlckNsYXNzOlN0cmluZyxwcmVkZWZpbmU6QXJyYXl9LGluamVjdDp7ZWxGb3JtOntkZWZhdWx0OicnfSxlbEZvcm1JdGVtOntkZWZhdWx0OicnfX0sZGlyZWN0aXZlczp7Q2xpY2tvdXRzaWRlOmNsaWNrb3V0c2lkZV9kZWZhdWx0LmF9LGNvbXB1dGVkOntkaXNwbGF5ZWRDb2xvcjpmdW5jdGlvbiBkaXNwbGF5ZWRDb2xvcigpe2lmKCF0aGlzLnZhbHVlJiYhdGhpcy5zaG93UGFuZWxDb2xvcil7cmV0dXJuJ3RyYW5zcGFyZW50Jzt9cmV0dXJuIHRoaXMuZGlzcGxheWVkUmdiKHRoaXMuY29sb3IsdGhpcy5zaG93QWxwaGEpO30sX2VsRm9ybUl0ZW1TaXplOmZ1bmN0aW9uIF9lbEZvcm1JdGVtU2l6ZSgpe3JldHVybih0aGlzLmVsRm9ybUl0ZW18fHt9KS5lbEZvcm1JdGVtU2l6ZTt9LGNvbG9yU2l6ZTpmdW5jdGlvbiBjb2xvclNpemUoKXtyZXR1cm4gdGhpcy5zaXplfHx0aGlzLl9lbEZvcm1JdGVtU2l6ZXx8KHRoaXMuJEVMRU1FTlR8fHt9KS5zaXplO30sY29sb3JEaXNhYmxlZDpmdW5jdGlvbiBjb2xvckRpc2FibGVkKCl7cmV0dXJuIHRoaXMuZGlzYWJsZWR8fCh0aGlzLmVsRm9ybXx8e30pLmRpc2FibGVkO319LHdhdGNoOnt2YWx1ZTpmdW5jdGlvbiB2YWx1ZSh2YWwpe2lmKCF2YWwpe3RoaXMuc2hvd1BhbmVsQ29sb3I9ZmFsc2U7fWVsc2UgaWYodmFsJiZ2YWwhPT10aGlzLmNvbG9yLnZhbHVlKXt0aGlzLmNvbG9yLmZyb21TdHJpbmcodmFsKTt9fSxjb2xvcjp7ZGVlcDp0cnVlLGhhbmRsZXI6ZnVuY3Rpb24gaGFuZGxlcigpe3RoaXMuc2hvd1BhbmVsQ29sb3I9dHJ1ZTt9fSxkaXNwbGF5ZWRDb2xvcjpmdW5jdGlvbiBkaXNwbGF5ZWRDb2xvcih2YWwpe2lmKCF0aGlzLnNob3dQaWNrZXIpcmV0dXJuO3ZhciBjdXJyZW50VmFsdWVDb2xvcj1uZXcgc3JjX2NvbG9yKHtlbmFibGVBbHBoYTp0aGlzLnNob3dBbHBoYSxmb3JtYXQ6dGhpcy5jb2xvckZvcm1hdH0pO2N1cnJlbnRWYWx1ZUNvbG9yLmZyb21TdHJpbmcodGhpcy52YWx1ZSk7dmFyIGN1cnJlbnRWYWx1ZUNvbG9yUmdiPXRoaXMuZGlzcGxheWVkUmdiKGN1cnJlbnRWYWx1ZUNvbG9yLHRoaXMuc2hvd0FscGhhKTtpZih2YWwhPT1jdXJyZW50VmFsdWVDb2xvclJnYil7dGhpcy4kZW1pdCgnYWN0aXZlLWNoYW5nZScsdmFsKTt9fX0sbWV0aG9kczp7aGFuZGxlVHJpZ2dlcjpmdW5jdGlvbiBoYW5kbGVUcmlnZ2VyKCl7aWYodGhpcy5jb2xvckRpc2FibGVkKXJldHVybjt0aGlzLnNob3dQaWNrZXI9IXRoaXMuc2hvd1BpY2tlcjt9LGNvbmZpcm1WYWx1ZTpmdW5jdGlvbiBjb25maXJtVmFsdWUoKXt2YXIgdmFsdWU9dGhpcy5jb2xvci52YWx1ZTt0aGlzLiRlbWl0KCdpbnB1dCcsdmFsdWUpO3RoaXMuJGVtaXQoJ2NoYW5nZScsdmFsdWUpO3RoaXMuZGlzcGF0Y2goJ0VsRm9ybUl0ZW0nLCdlbC5mb3JtLmNoYW5nZScsdmFsdWUpO3RoaXMuc2hvd1BpY2tlcj1mYWxzZTt9LGNsZWFyVmFsdWU6ZnVuY3Rpb24gY2xlYXJWYWx1ZSgpe3RoaXMuJGVtaXQoJ2lucHV0JyxudWxsKTt0aGlzLiRlbWl0KCdjaGFuZ2UnLG51bGwpO2lmKHRoaXMudmFsdWUhPT1udWxsKXt0aGlzLmRpc3BhdGNoKCdFbEZvcm1JdGVtJywnZWwuZm9ybS5jaGFuZ2UnLG51bGwpO310aGlzLnNob3dQYW5lbENvbG9yPWZhbHNlO3RoaXMuc2hvd1BpY2tlcj1mYWxzZTt0aGlzLnJlc2V0Q29sb3IoKTt9LGhpZGU6ZnVuY3Rpb24gaGlkZSgpe3RoaXMuc2hvd1BpY2tlcj1mYWxzZTt0aGlzLnJlc2V0Q29sb3IoKTt9LHJlc2V0Q29sb3I6ZnVuY3Rpb24gcmVzZXRDb2xvcigpe3ZhciBfdGhpcz10aGlzO3RoaXMuJG5leHRUaWNrKGZ1bmN0aW9uKF8pe2lmKF90aGlzLnZhbHVlKXtfdGhpcy5jb2xvci5mcm9tU3RyaW5nKF90aGlzLnZhbHVlKTt9ZWxzZXtfdGhpcy5zaG93UGFuZWxDb2xvcj1mYWxzZTt9fSk7fSxkaXNwbGF5ZWRSZ2I6ZnVuY3Rpb24gZGlzcGxheWVkUmdiKGNvbG9yLHNob3dBbHBoYSl7aWYoIShjb2xvciBpbnN0YW5jZW9mIHNyY19jb2xvcikpe3Rocm93IEVycm9yKCdjb2xvciBzaG91bGQgYmUgaW5zdGFuY2Ugb2YgQ29sb3IgQ2xhc3MnKTt9dmFyIF9jb2xvciR0b1JnYj1jb2xvci50b1JnYigpLHI9X2NvbG9yJHRvUmdiLnIsZz1fY29sb3IkdG9SZ2IuZyxiPV9jb2xvciR0b1JnYi5iO3JldHVybiBzaG93QWxwaGE/J3JnYmEoJytyKycsICcrZysnLCAnK2IrJywgJytjb2xvci5nZXQoJ2FscGhhJykvMTAwKycpJzoncmdiKCcrcisnLCAnK2crJywgJytiKycpJzt9fSxtb3VudGVkOmZ1bmN0aW9uIG1vdW50ZWQoKXt2YXIgdmFsdWU9dGhpcy52YWx1ZTtpZih2YWx1ZSl7dGhpcy5jb2xvci5mcm9tU3RyaW5nKHZhbHVlKTt9dGhpcy5wb3BwZXJFbG09dGhpcy4kcmVmcy5kcm9wZG93bi4kZWw7fSxkYXRhOmZ1bmN0aW9uIGRhdGEoKXt2YXIgY29sb3I9bmV3IHNyY19jb2xvcih7ZW5hYmxlQWxwaGE6dGhpcy5zaG93QWxwaGEsZm9ybWF0OnRoaXMuY29sb3JGb3JtYXR9KTtyZXR1cm57Y29sb3I6Y29sb3Isc2hvd1BpY2tlcjpmYWxzZSxzaG93UGFuZWxDb2xvcjpmYWxzZX07fSxjb21wb25lbnRzOntQaWNrZXJEcm9wZG93bjpwaWNrZXJfZHJvcGRvd259fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NvbG9yLXBpY2tlci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFja2FnZXNfY29sb3JfcGlja2VyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPWNvbG9yX3BpY2tlcl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NvbG9yLXBpY2tlci9zcmMvbWFpbi52dWUKLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciBjb2xvcl9waWNrZXJfc3JjX21haW5fY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChwYWNrYWdlc19jb2xvcl9waWNrZXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzU1YzhhZGU3X3JlbmRlcixtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNTVjOGFkZTdfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciBjb2xvcl9waWNrZXJfc3JjX21haW5fYXBpO31jb2xvcl9waWNrZXJfc3JjX21haW5fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL21haW4udnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGNvbG9yX3BpY2tlcl9zcmNfbWFpbj1jb2xvcl9waWNrZXJfc3JjX21haW5fY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jb2xvci1waWNrZXIvaW5kZXguanMKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9jb2xvcl9waWNrZXJfc3JjX21haW4uaW5zdGFsbD1mdW5jdGlvbihWdWUpe1Z1ZS5jb21wb25lbnQoY29sb3JfcGlja2VyX3NyY19tYWluLm5hbWUsY29sb3JfcGlja2VyX3NyY19tYWluKTt9Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgY29sb3JfcGlja2VyPWNvbG9yX3BpY2tlcl9zcmNfbWFpbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3RyYW5zZmVyL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD01YzY1NGRkOCYKdmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81YzY1NGRkOF9yZW5kZXI9ZnVuY3Rpb24gbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzVjNjU0ZGQ4X3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXRyYW5zZmVyIn0sW19jKCJ0cmFuc2Zlci1wYW5lbCIsX3ZtLl9iKHtyZWY6ImxlZnRQYW5lbCIsYXR0cnM6e2RhdGE6X3ZtLnNvdXJjZURhdGEsdGl0bGU6X3ZtLnRpdGxlc1swXXx8X3ZtLnQoImVsLnRyYW5zZmVyLnRpdGxlcy4wIiksImRlZmF1bHQtY2hlY2tlZCI6X3ZtLmxlZnREZWZhdWx0Q2hlY2tlZCxwbGFjZWhvbGRlcjpfdm0uZmlsdGVyUGxhY2Vob2xkZXJ8fF92bS50KCJlbC50cmFuc2Zlci5maWx0ZXJQbGFjZWhvbGRlciIpfSxvbjp7ImNoZWNrZWQtY2hhbmdlIjpfdm0ub25Tb3VyY2VDaGVja2VkQ2hhbmdlfX0sInRyYW5zZmVyLXBhbmVsIixfdm0uJHByb3BzLGZhbHNlKSxbX3ZtLl90KCJsZWZ0LWZvb3RlciIpXSwyKSxfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXRyYW5zZmVyX19idXR0b25zIn0sW19jKCJlbC1idXR0b24iLHtjbGFzczpbImVsLXRyYW5zZmVyX19idXR0b24iLF92bS5oYXNCdXR0b25UZXh0cz8iaXMtd2l0aC10ZXh0cyI6IiJdLGF0dHJzOnt0eXBlOiJwcmltYXJ5IixkaXNhYmxlZDpfdm0ucmlnaHRDaGVja2VkLmxlbmd0aD09PTB9LG5hdGl2ZU9uOntjbGljazpmdW5jdGlvbiBjbGljaygkZXZlbnQpe3JldHVybiBfdm0uYWRkVG9MZWZ0KCRldmVudCk7fX19LFtfYygiaSIse3N0YXRpY0NsYXNzOiJlbC1pY29uLWFycm93LWxlZnQifSksX3ZtLmJ1dHRvblRleHRzWzBdIT09dW5kZWZpbmVkP19jKCJzcGFuIixbX3ZtLl92KF92bS5fcyhfdm0uYnV0dG9uVGV4dHNbMF0pKV0pOl92bS5fZSgpXSksX2MoImVsLWJ1dHRvbiIse2NsYXNzOlsiZWwtdHJhbnNmZXJfX2J1dHRvbiIsX3ZtLmhhc0J1dHRvblRleHRzPyJpcy13aXRoLXRleHRzIjoiIl0sYXR0cnM6e3R5cGU6InByaW1hcnkiLGRpc2FibGVkOl92bS5sZWZ0Q2hlY2tlZC5sZW5ndGg9PT0wfSxuYXRpdmVPbjp7Y2xpY2s6ZnVuY3Rpb24gY2xpY2soJGV2ZW50KXtyZXR1cm4gX3ZtLmFkZFRvUmlnaHQoJGV2ZW50KTt9fX0sW192bS5idXR0b25UZXh0c1sxXSE9PXVuZGVmaW5lZD9fYygic3BhbiIsW192bS5fdihfdm0uX3MoX3ZtLmJ1dHRvblRleHRzWzFdKSldKTpfdm0uX2UoKSxfYygiaSIse3N0YXRpY0NsYXNzOiJlbC1pY29uLWFycm93LXJpZ2h0In0pXSldLDEpLF9jKCJ0cmFuc2Zlci1wYW5lbCIsX3ZtLl9iKHtyZWY6InJpZ2h0UGFuZWwiLGF0dHJzOntkYXRhOl92bS50YXJnZXREYXRhLHRpdGxlOl92bS50aXRsZXNbMV18fF92bS50KCJlbC50cmFuc2Zlci50aXRsZXMuMSIpLCJkZWZhdWx0LWNoZWNrZWQiOl92bS5yaWdodERlZmF1bHRDaGVja2VkLHBsYWNlaG9sZGVyOl92bS5maWx0ZXJQbGFjZWhvbGRlcnx8X3ZtLnQoImVsLnRyYW5zZmVyLmZpbHRlclBsYWNlaG9sZGVyIil9LG9uOnsiY2hlY2tlZC1jaGFuZ2UiOl92bS5vblRhcmdldENoZWNrZWRDaGFuZ2V9fSwidHJhbnNmZXItcGFuZWwiLF92bS4kcHJvcHMsZmFsc2UpLFtfdm0uX3QoInJpZ2h0LWZvb3RlciIpXSwyKV0sMSk7fTt2YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzVjNjU0ZGQ4X3N0YXRpY1JlbmRlckZucz1bXTttYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNWM2NTRkZDhfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RyYW5zZmVyL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD01YzY1NGRkOCYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy90cmFuc2Zlci9zcmMvdHJhbnNmZXItcGFuZWwudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTJkZGFiOGJkJgp2YXIgdHJhbnNmZXJfcGFuZWx2dWVfdHlwZV90ZW1wbGF0ZV9pZF8yZGRhYjhiZF9yZW5kZXI9ZnVuY3Rpb24gdHJhbnNmZXJfcGFuZWx2dWVfdHlwZV90ZW1wbGF0ZV9pZF8yZGRhYjhiZF9yZW5kZXIoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDt2YXIgX2M9X3ZtLl9zZWxmLl9jfHxfaDtyZXR1cm4gX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC10cmFuc2Zlci1wYW5lbCJ9LFtfYygicCIse3N0YXRpY0NsYXNzOiJlbC10cmFuc2Zlci1wYW5lbF9faGVhZGVyIn0sW19jKCJlbC1jaGVja2JveCIse2F0dHJzOntpbmRldGVybWluYXRlOl92bS5pc0luZGV0ZXJtaW5hdGV9LG9uOntjaGFuZ2U6X3ZtLmhhbmRsZUFsbENoZWNrZWRDaGFuZ2V9LG1vZGVsOnt2YWx1ZTpfdm0uYWxsQ2hlY2tlZCxjYWxsYmFjazpmdW5jdGlvbiBjYWxsYmFjaygkJHYpe192bS5hbGxDaGVja2VkPSQkdjt9LGV4cHJlc3Npb246ImFsbENoZWNrZWQifX0sW192bS5fdigiXG4gICAgICAiK192bS5fcyhfdm0udGl0bGUpKyJcbiAgICAgICIpLF9jKCJzcGFuIixbX3ZtLl92KF92bS5fcyhfdm0uY2hlY2tlZFN1bW1hcnkpKV0pXSldLDEpLF9jKCJkaXYiLHtjbGFzczpbImVsLXRyYW5zZmVyLXBhbmVsX19ib2R5Iixfdm0uaGFzRm9vdGVyPyJpcy13aXRoLWZvb3RlciI6IiJdfSxbX3ZtLmZpbHRlcmFibGU/X2MoImVsLWlucHV0Iix7c3RhdGljQ2xhc3M6ImVsLXRyYW5zZmVyLXBhbmVsX19maWx0ZXIiLGF0dHJzOntzaXplOiJzbWFsbCIscGxhY2Vob2xkZXI6X3ZtLnBsYWNlaG9sZGVyfSxuYXRpdmVPbjp7bW91c2VlbnRlcjpmdW5jdGlvbiBtb3VzZWVudGVyKCRldmVudCl7X3ZtLmlucHV0SG92ZXI9dHJ1ZTt9LG1vdXNlbGVhdmU6ZnVuY3Rpb24gbW91c2VsZWF2ZSgkZXZlbnQpe192bS5pbnB1dEhvdmVyPWZhbHNlO319LG1vZGVsOnt2YWx1ZTpfdm0ucXVlcnksY2FsbGJhY2s6ZnVuY3Rpb24gY2FsbGJhY2soJCR2KXtfdm0ucXVlcnk9JCR2O30sZXhwcmVzc2lvbjoicXVlcnkifX0sW19jKCJpIix7Y2xhc3M6WyJlbC1pbnB1dF9faWNvbiIsImVsLWljb24tIitfdm0uaW5wdXRJY29uXSxhdHRyczp7c2xvdDoicHJlZml4In0sb246e2NsaWNrOl92bS5jbGVhclF1ZXJ5fSxzbG90OiJwcmVmaXgifSldKTpfdm0uX2UoKSxfYygiZWwtY2hlY2tib3gtZ3JvdXAiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTohX3ZtLmhhc05vTWF0Y2gmJl92bS5kYXRhLmxlbmd0aD4wLGV4cHJlc3Npb246IiFoYXNOb01hdGNoICYmIGRhdGEubGVuZ3RoID4gMCJ9XSxzdGF0aWNDbGFzczoiZWwtdHJhbnNmZXItcGFuZWxfX2xpc3QiLGNsYXNzOnsiaXMtZmlsdGVyYWJsZSI6X3ZtLmZpbHRlcmFibGV9LG1vZGVsOnt2YWx1ZTpfdm0uY2hlY2tlZCxjYWxsYmFjazpmdW5jdGlvbiBjYWxsYmFjaygkJHYpe192bS5jaGVja2VkPSQkdjt9LGV4cHJlc3Npb246ImNoZWNrZWQifX0sX3ZtLl9sKF92bS5maWx0ZXJlZERhdGEsZnVuY3Rpb24oaXRlbSl7cmV0dXJuIF9jKCJlbC1jaGVja2JveCIse2tleTppdGVtW192bS5rZXlQcm9wXSxzdGF0aWNDbGFzczoiZWwtdHJhbnNmZXItcGFuZWxfX2l0ZW0iLGF0dHJzOntsYWJlbDppdGVtW192bS5rZXlQcm9wXSxkaXNhYmxlZDppdGVtW192bS5kaXNhYmxlZFByb3BdfX0sW19jKCJvcHRpb24tY29udGVudCIse2F0dHJzOntvcHRpb246aXRlbX19KV0sMSk7fSksMSksX2MoInAiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTpfdm0uaGFzTm9NYXRjaCxleHByZXNzaW9uOiJoYXNOb01hdGNoIn1dLHN0YXRpY0NsYXNzOiJlbC10cmFuc2Zlci1wYW5lbF9fZW1wdHkifSxbX3ZtLl92KF92bS5fcyhfdm0udCgiZWwudHJhbnNmZXIubm9NYXRjaCIpKSldKSxfYygicCIse2RpcmVjdGl2ZXM6W3tuYW1lOiJzaG93IixyYXdOYW1lOiJ2LXNob3ciLHZhbHVlOl92bS5kYXRhLmxlbmd0aD09PTAmJiFfdm0uaGFzTm9NYXRjaCxleHByZXNzaW9uOiJkYXRhLmxlbmd0aCA9PT0gMCAmJiAhaGFzTm9NYXRjaCJ9XSxzdGF0aWNDbGFzczoiZWwtdHJhbnNmZXItcGFuZWxfX2VtcHR5In0sW192bS5fdihfdm0uX3MoX3ZtLnQoImVsLnRyYW5zZmVyLm5vRGF0YSIpKSldKV0sMSksX3ZtLmhhc0Zvb3Rlcj9fYygicCIse3N0YXRpY0NsYXNzOiJlbC10cmFuc2Zlci1wYW5lbF9fZm9vdGVyIn0sW192bS5fdCgiZGVmYXVsdCIpXSwyKTpfdm0uX2UoKV0pO307dmFyIHRyYW5zZmVyX3BhbmVsdnVlX3R5cGVfdGVtcGxhdGVfaWRfMmRkYWI4YmRfc3RhdGljUmVuZGVyRm5zPVtdO3RyYW5zZmVyX3BhbmVsdnVlX3R5cGVfdGVtcGxhdGVfaWRfMmRkYWI4YmRfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RyYW5zZmVyL3NyYy90cmFuc2Zlci1wYW5lbC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MmRkYWI4YmQmCi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3RyYW5zZmVyL3NyYy90cmFuc2Zlci1wYW5lbC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgdHJhbnNmZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e21peGluczpbbG9jYWxlX2RlZmF1bHQuYV0sbmFtZTonRWxUcmFuc2ZlclBhbmVsJyxjb21wb25lbnROYW1lOidFbFRyYW5zZmVyUGFuZWwnLGNvbXBvbmVudHM6e0VsQ2hlY2tib3hHcm91cDpjaGVja2JveF9ncm91cF9kZWZhdWx0LmEsRWxDaGVja2JveDpjaGVja2JveF9kZWZhdWx0LmEsRWxJbnB1dDppbnB1dF9kZWZhdWx0LmEsT3B0aW9uQ29udGVudDp7cHJvcHM6e29wdGlvbjpPYmplY3R9LHJlbmRlcjpmdW5jdGlvbiByZW5kZXIoaCl7dmFyIGdldFBhcmVudD1mdW5jdGlvbiBnZXRQYXJlbnQodm0pe2lmKHZtLiRvcHRpb25zLmNvbXBvbmVudE5hbWU9PT0nRWxUcmFuc2ZlclBhbmVsJyl7cmV0dXJuIHZtO31lbHNlIGlmKHZtLiRwYXJlbnQpe3JldHVybiBnZXRQYXJlbnQodm0uJHBhcmVudCk7fWVsc2V7cmV0dXJuIHZtO319O3ZhciBwYW5lbD1nZXRQYXJlbnQodGhpcyk7dmFyIHRyYW5zZmVyPXBhbmVsLiRwYXJlbnR8fHBhbmVsO3JldHVybiBwYW5lbC5yZW5kZXJDb250ZW50P3BhbmVsLnJlbmRlckNvbnRlbnQoaCx0aGlzLm9wdGlvbik6dHJhbnNmZXIuJHNjb3BlZFNsb3RzLmRlZmF1bHQ/dHJhbnNmZXIuJHNjb3BlZFNsb3RzLmRlZmF1bHQoe29wdGlvbjp0aGlzLm9wdGlvbn0pOmgoJ3NwYW4nLFt0aGlzLm9wdGlvbltwYW5lbC5sYWJlbFByb3BdfHx0aGlzLm9wdGlvbltwYW5lbC5rZXlQcm9wXV0pO319fSxwcm9wczp7ZGF0YTp7dHlwZTpBcnJheSxkZWZhdWx0OmZ1bmN0aW9uIF9kZWZhdWx0KCl7cmV0dXJuW107fX0scmVuZGVyQ29udGVudDpGdW5jdGlvbixwbGFjZWhvbGRlcjpTdHJpbmcsdGl0bGU6U3RyaW5nLGZpbHRlcmFibGU6Qm9vbGVhbixmb3JtYXQ6T2JqZWN0LGZpbHRlck1ldGhvZDpGdW5jdGlvbixkZWZhdWx0Q2hlY2tlZDpBcnJheSxwcm9wczpPYmplY3R9LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybntjaGVja2VkOltdLGFsbENoZWNrZWQ6ZmFsc2UscXVlcnk6JycsaW5wdXRIb3ZlcjpmYWxzZSxjaGVja0NoYW5nZUJ5VXNlcjp0cnVlfTt9LHdhdGNoOntjaGVja2VkOmZ1bmN0aW9uIGNoZWNrZWQodmFsLG9sZFZhbCl7dGhpcy51cGRhdGVBbGxDaGVja2VkKCk7aWYodGhpcy5jaGVja0NoYW5nZUJ5VXNlcil7dmFyIG1vdmVkS2V5cz12YWwuY29uY2F0KG9sZFZhbCkuZmlsdGVyKGZ1bmN0aW9uKHYpe3JldHVybiB2YWwuaW5kZXhPZih2KT09PS0xfHxvbGRWYWwuaW5kZXhPZih2KT09PS0xO30pO3RoaXMuJGVtaXQoJ2NoZWNrZWQtY2hhbmdlJyx2YWwsbW92ZWRLZXlzKTt9ZWxzZXt0aGlzLiRlbWl0KCdjaGVja2VkLWNoYW5nZScsdmFsKTt0aGlzLmNoZWNrQ2hhbmdlQnlVc2VyPXRydWU7fX0sZGF0YTpmdW5jdGlvbiBkYXRhKCl7dmFyIF90aGlzPXRoaXM7dmFyIGNoZWNrZWQ9W107dmFyIGZpbHRlcmVkRGF0YUtleXM9dGhpcy5maWx0ZXJlZERhdGEubWFwKGZ1bmN0aW9uKGl0ZW0pe3JldHVybiBpdGVtW190aGlzLmtleVByb3BdO30pO3RoaXMuY2hlY2tlZC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pe2lmKGZpbHRlcmVkRGF0YUtleXMuaW5kZXhPZihpdGVtKT4tMSl7Y2hlY2tlZC5wdXNoKGl0ZW0pO319KTt0aGlzLmNoZWNrQ2hhbmdlQnlVc2VyPWZhbHNlO3RoaXMuY2hlY2tlZD1jaGVja2VkO30sY2hlY2thYmxlRGF0YTpmdW5jdGlvbiBjaGVja2FibGVEYXRhKCl7dGhpcy51cGRhdGVBbGxDaGVja2VkKCk7fSxkZWZhdWx0Q2hlY2tlZDp7aW1tZWRpYXRlOnRydWUsaGFuZGxlcjpmdW5jdGlvbiBoYW5kbGVyKHZhbCxvbGRWYWwpe3ZhciBfdGhpczI9dGhpcztpZihvbGRWYWwmJnZhbC5sZW5ndGg9PT1vbGRWYWwubGVuZ3RoJiZ2YWwuZXZlcnkoZnVuY3Rpb24oaXRlbSl7cmV0dXJuIG9sZFZhbC5pbmRleE9mKGl0ZW0pPi0xO30pKXJldHVybjt2YXIgY2hlY2tlZD1bXTt2YXIgY2hlY2thYmxlRGF0YUtleXM9dGhpcy5jaGVja2FibGVEYXRhLm1hcChmdW5jdGlvbihpdGVtKXtyZXR1cm4gaXRlbVtfdGhpczIua2V5UHJvcF07fSk7dmFsLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7aWYoY2hlY2thYmxlRGF0YUtleXMuaW5kZXhPZihpdGVtKT4tMSl7Y2hlY2tlZC5wdXNoKGl0ZW0pO319KTt0aGlzLmNoZWNrQ2hhbmdlQnlVc2VyPWZhbHNlO3RoaXMuY2hlY2tlZD1jaGVja2VkO319fSxjb21wdXRlZDp7ZmlsdGVyZWREYXRhOmZ1bmN0aW9uIGZpbHRlcmVkRGF0YSgpe3ZhciBfdGhpczM9dGhpcztyZXR1cm4gdGhpcy5kYXRhLmZpbHRlcihmdW5jdGlvbihpdGVtKXtpZih0eXBlb2YgX3RoaXMzLmZpbHRlck1ldGhvZD09PSdmdW5jdGlvbicpe3JldHVybiBfdGhpczMuZmlsdGVyTWV0aG9kKF90aGlzMy5xdWVyeSxpdGVtKTt9ZWxzZXt2YXIgbGFiZWw9aXRlbVtfdGhpczMubGFiZWxQcm9wXXx8aXRlbVtfdGhpczMua2V5UHJvcF0udG9TdHJpbmcoKTtyZXR1cm4gbGFiZWwudG9Mb3dlckNhc2UoKS5pbmRleE9mKF90aGlzMy5xdWVyeS50b0xvd2VyQ2FzZSgpKT4tMTt9fSk7fSxjaGVja2FibGVEYXRhOmZ1bmN0aW9uIGNoZWNrYWJsZURhdGEoKXt2YXIgX3RoaXM0PXRoaXM7cmV0dXJuIHRoaXMuZmlsdGVyZWREYXRhLmZpbHRlcihmdW5jdGlvbihpdGVtKXtyZXR1cm4haXRlbVtfdGhpczQuZGlzYWJsZWRQcm9wXTt9KTt9LGNoZWNrZWRTdW1tYXJ5OmZ1bmN0aW9uIGNoZWNrZWRTdW1tYXJ5KCl7dmFyIGNoZWNrZWRMZW5ndGg9dGhpcy5jaGVja2VkLmxlbmd0aDt2YXIgZGF0YUxlbmd0aD10aGlzLmRhdGEubGVuZ3RoO3ZhciBfZm9ybWF0PXRoaXMuZm9ybWF0LG5vQ2hlY2tlZD1fZm9ybWF0Lm5vQ2hlY2tlZCxoYXNDaGVja2VkPV9mb3JtYXQuaGFzQ2hlY2tlZDtpZihub0NoZWNrZWQmJmhhc0NoZWNrZWQpe3JldHVybiBjaGVja2VkTGVuZ3RoPjA/aGFzQ2hlY2tlZC5yZXBsYWNlKC9cJHtjaGVja2VkfS9nLGNoZWNrZWRMZW5ndGgpLnJlcGxhY2UoL1wke3RvdGFsfS9nLGRhdGFMZW5ndGgpOm5vQ2hlY2tlZC5yZXBsYWNlKC9cJHt0b3RhbH0vZyxkYXRhTGVuZ3RoKTt9ZWxzZXtyZXR1cm4gY2hlY2tlZExlbmd0aCsnLycrZGF0YUxlbmd0aDt9fSxpc0luZGV0ZXJtaW5hdGU6ZnVuY3Rpb24gaXNJbmRldGVybWluYXRlKCl7dmFyIGNoZWNrZWRMZW5ndGg9dGhpcy5jaGVja2VkLmxlbmd0aDtyZXR1cm4gY2hlY2tlZExlbmd0aD4wJiZjaGVja2VkTGVuZ3RoPHRoaXMuY2hlY2thYmxlRGF0YS5sZW5ndGg7fSxoYXNOb01hdGNoOmZ1bmN0aW9uIGhhc05vTWF0Y2goKXtyZXR1cm4gdGhpcy5xdWVyeS5sZW5ndGg+MCYmdGhpcy5maWx0ZXJlZERhdGEubGVuZ3RoPT09MDt9LGlucHV0SWNvbjpmdW5jdGlvbiBpbnB1dEljb24oKXtyZXR1cm4gdGhpcy5xdWVyeS5sZW5ndGg+MCYmdGhpcy5pbnB1dEhvdmVyPydjaXJjbGUtY2xvc2UnOidzZWFyY2gnO30sbGFiZWxQcm9wOmZ1bmN0aW9uIGxhYmVsUHJvcCgpe3JldHVybiB0aGlzLnByb3BzLmxhYmVsfHwnbGFiZWwnO30sa2V5UHJvcDpmdW5jdGlvbiBrZXlQcm9wKCl7cmV0dXJuIHRoaXMucHJvcHMua2V5fHwna2V5Jzt9LGRpc2FibGVkUHJvcDpmdW5jdGlvbiBkaXNhYmxlZFByb3AoKXtyZXR1cm4gdGhpcy5wcm9wcy5kaXNhYmxlZHx8J2Rpc2FibGVkJzt9LGhhc0Zvb3RlcjpmdW5jdGlvbiBoYXNGb290ZXIoKXtyZXR1cm4hIXRoaXMuJHNsb3RzLmRlZmF1bHQ7fX0sbWV0aG9kczp7dXBkYXRlQWxsQ2hlY2tlZDpmdW5jdGlvbiB1cGRhdGVBbGxDaGVja2VkKCl7dmFyIF90aGlzNT10aGlzO3ZhciBjaGVja2FibGVEYXRhS2V5cz10aGlzLmNoZWNrYWJsZURhdGEubWFwKGZ1bmN0aW9uKGl0ZW0pe3JldHVybiBpdGVtW190aGlzNS5rZXlQcm9wXTt9KTt0aGlzLmFsbENoZWNrZWQ9Y2hlY2thYmxlRGF0YUtleXMubGVuZ3RoPjAmJmNoZWNrYWJsZURhdGFLZXlzLmV2ZXJ5KGZ1bmN0aW9uKGl0ZW0pe3JldHVybiBfdGhpczUuY2hlY2tlZC5pbmRleE9mKGl0ZW0pPi0xO30pO30saGFuZGxlQWxsQ2hlY2tlZENoYW5nZTpmdW5jdGlvbiBoYW5kbGVBbGxDaGVja2VkQ2hhbmdlKHZhbHVlKXt2YXIgX3RoaXM2PXRoaXM7dGhpcy5jaGVja2VkPXZhbHVlP3RoaXMuY2hlY2thYmxlRGF0YS5tYXAoZnVuY3Rpb24oaXRlbSl7cmV0dXJuIGl0ZW1bX3RoaXM2LmtleVByb3BdO30pOltdO30sY2xlYXJRdWVyeTpmdW5jdGlvbiBjbGVhclF1ZXJ5KCl7aWYodGhpcy5pbnB1dEljb249PT0nY2lyY2xlLWNsb3NlJyl7dGhpcy5xdWVyeT0nJzt9fX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdHJhbnNmZXIvc3JjL3RyYW5zZmVyLXBhbmVsLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfdHJhbnNmZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189dHJhbnNmZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90cmFuc2Zlci9zcmMvdHJhbnNmZXItcGFuZWwudnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgdHJhbnNmZXJfcGFuZWxfY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChzcmNfdHJhbnNmZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sdHJhbnNmZXJfcGFuZWx2dWVfdHlwZV90ZW1wbGF0ZV9pZF8yZGRhYjhiZF9yZW5kZXIsdHJhbnNmZXJfcGFuZWx2dWVfdHlwZV90ZW1wbGF0ZV9pZF8yZGRhYjhiZF9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIHRyYW5zZmVyX3BhbmVsX2FwaTt9dHJhbnNmZXJfcGFuZWxfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy90cmFuc2Zlci9zcmMvdHJhbnNmZXItcGFuZWwudnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHRyYW5zZmVyX3BhbmVsPXRyYW5zZmVyX3BhbmVsX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3RyYW5zZmVyL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciB0cmFuc2Zlcl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17bmFtZTonRWxUcmFuc2ZlcicsbWl4aW5zOltlbWl0dGVyX2RlZmF1bHQuYSxsb2NhbGVfZGVmYXVsdC5hLG1pZ3JhdGluZ19kZWZhdWx0LmFdLGNvbXBvbmVudHM6e1RyYW5zZmVyUGFuZWw6dHJhbnNmZXJfcGFuZWwsRWxCdXR0b246YnV0dG9uX2RlZmF1bHQuYX0scHJvcHM6e2RhdGE6e3R5cGU6QXJyYXksZGVmYXVsdDpmdW5jdGlvbiBfZGVmYXVsdCgpe3JldHVybltdO319LHRpdGxlczp7dHlwZTpBcnJheSxkZWZhdWx0OmZ1bmN0aW9uIF9kZWZhdWx0KCl7cmV0dXJuW107fX0sYnV0dG9uVGV4dHM6e3R5cGU6QXJyYXksZGVmYXVsdDpmdW5jdGlvbiBfZGVmYXVsdCgpe3JldHVybltdO319LGZpbHRlclBsYWNlaG9sZGVyOnt0eXBlOlN0cmluZyxkZWZhdWx0OicnfSxmaWx0ZXJNZXRob2Q6RnVuY3Rpb24sbGVmdERlZmF1bHRDaGVja2VkOnt0eXBlOkFycmF5LGRlZmF1bHQ6ZnVuY3Rpb24gX2RlZmF1bHQoKXtyZXR1cm5bXTt9fSxyaWdodERlZmF1bHRDaGVja2VkOnt0eXBlOkFycmF5LGRlZmF1bHQ6ZnVuY3Rpb24gX2RlZmF1bHQoKXtyZXR1cm5bXTt9fSxyZW5kZXJDb250ZW50OkZ1bmN0aW9uLHZhbHVlOnt0eXBlOkFycmF5LGRlZmF1bHQ6ZnVuY3Rpb24gX2RlZmF1bHQoKXtyZXR1cm5bXTt9fSxmb3JtYXQ6e3R5cGU6T2JqZWN0LGRlZmF1bHQ6ZnVuY3Rpb24gX2RlZmF1bHQoKXtyZXR1cm57fTt9fSxmaWx0ZXJhYmxlOkJvb2xlYW4scHJvcHM6e3R5cGU6T2JqZWN0LGRlZmF1bHQ6ZnVuY3Rpb24gX2RlZmF1bHQoKXtyZXR1cm57bGFiZWw6J2xhYmVsJyxrZXk6J2tleScsZGlzYWJsZWQ6J2Rpc2FibGVkJ307fX0sdGFyZ2V0T3JkZXI6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6J29yaWdpbmFsJ319LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybntsZWZ0Q2hlY2tlZDpbXSxyaWdodENoZWNrZWQ6W119O30sY29tcHV0ZWQ6e2RhdGFPYmo6ZnVuY3Rpb24gZGF0YU9iaigpe3ZhciBrZXk9dGhpcy5wcm9wcy5rZXk7cmV0dXJuIHRoaXMuZGF0YS5yZWR1Y2UoZnVuY3Rpb24obyxjdXIpe3JldHVybihvW2N1cltrZXldXT1jdXIpJiZvO30se30pO30sc291cmNlRGF0YTpmdW5jdGlvbiBzb3VyY2VEYXRhKCl7dmFyIF90aGlzPXRoaXM7cmV0dXJuIHRoaXMuZGF0YS5maWx0ZXIoZnVuY3Rpb24oaXRlbSl7cmV0dXJuIF90aGlzLnZhbHVlLmluZGV4T2YoaXRlbVtfdGhpcy5wcm9wcy5rZXldKT09PS0xO30pO30sdGFyZ2V0RGF0YTpmdW5jdGlvbiB0YXJnZXREYXRhKCl7dmFyIF90aGlzMj10aGlzO2lmKHRoaXMudGFyZ2V0T3JkZXI9PT0nb3JpZ2luYWwnKXtyZXR1cm4gdGhpcy5kYXRhLmZpbHRlcihmdW5jdGlvbihpdGVtKXtyZXR1cm4gX3RoaXMyLnZhbHVlLmluZGV4T2YoaXRlbVtfdGhpczIucHJvcHMua2V5XSk+LTE7fSk7fWVsc2V7cmV0dXJuIHRoaXMudmFsdWUucmVkdWNlKGZ1bmN0aW9uKGFycixjdXIpe3ZhciB2YWw9X3RoaXMyLmRhdGFPYmpbY3VyXTtpZih2YWwpe2Fyci5wdXNoKHZhbCk7fXJldHVybiBhcnI7fSxbXSk7fX0saGFzQnV0dG9uVGV4dHM6ZnVuY3Rpb24gaGFzQnV0dG9uVGV4dHMoKXtyZXR1cm4gdGhpcy5idXR0b25UZXh0cy5sZW5ndGg9PT0yO319LHdhdGNoOnt2YWx1ZTpmdW5jdGlvbiB2YWx1ZSh2YWwpe3RoaXMuZGlzcGF0Y2goJ0VsRm9ybUl0ZW0nLCdlbC5mb3JtLmNoYW5nZScsdmFsKTt9fSxtZXRob2RzOntnZXRNaWdyYXRpbmdDb25maWc6ZnVuY3Rpb24gZ2V0TWlncmF0aW5nQ29uZmlnKCl7cmV0dXJue3Byb3BzOnsnZm9vdGVyLWZvcm1hdCc6J2Zvb3Rlci1mb3JtYXQgaXMgcmVuYW1lZCB0byBmb3JtYXQuJ319O30sb25Tb3VyY2VDaGVja2VkQ2hhbmdlOmZ1bmN0aW9uIG9uU291cmNlQ2hlY2tlZENoYW5nZSh2YWwsbW92ZWRLZXlzKXt0aGlzLmxlZnRDaGVja2VkPXZhbDtpZihtb3ZlZEtleXM9PT11bmRlZmluZWQpcmV0dXJuO3RoaXMuJGVtaXQoJ2xlZnQtY2hlY2stY2hhbmdlJyx2YWwsbW92ZWRLZXlzKTt9LG9uVGFyZ2V0Q2hlY2tlZENoYW5nZTpmdW5jdGlvbiBvblRhcmdldENoZWNrZWRDaGFuZ2UodmFsLG1vdmVkS2V5cyl7dGhpcy5yaWdodENoZWNrZWQ9dmFsO2lmKG1vdmVkS2V5cz09PXVuZGVmaW5lZClyZXR1cm47dGhpcy4kZW1pdCgncmlnaHQtY2hlY2stY2hhbmdlJyx2YWwsbW92ZWRLZXlzKTt9LGFkZFRvTGVmdDpmdW5jdGlvbiBhZGRUb0xlZnQoKXt2YXIgY3VycmVudFZhbHVlPXRoaXMudmFsdWUuc2xpY2UoKTt0aGlzLnJpZ2h0Q2hlY2tlZC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pe3ZhciBpbmRleD1jdXJyZW50VmFsdWUuaW5kZXhPZihpdGVtKTtpZihpbmRleD4tMSl7Y3VycmVudFZhbHVlLnNwbGljZShpbmRleCwxKTt9fSk7dGhpcy4kZW1pdCgnaW5wdXQnLGN1cnJlbnRWYWx1ZSk7dGhpcy4kZW1pdCgnY2hhbmdlJyxjdXJyZW50VmFsdWUsJ2xlZnQnLHRoaXMucmlnaHRDaGVja2VkKTt9LGFkZFRvUmlnaHQ6ZnVuY3Rpb24gYWRkVG9SaWdodCgpe3ZhciBfdGhpczM9dGhpczt2YXIgY3VycmVudFZhbHVlPXRoaXMudmFsdWUuc2xpY2UoKTt2YXIgaXRlbXNUb0JlTW92ZWQ9W107dmFyIGtleT10aGlzLnByb3BzLmtleTt0aGlzLmRhdGEuZm9yRWFjaChmdW5jdGlvbihpdGVtKXt2YXIgaXRlbUtleT1pdGVtW2tleV07aWYoX3RoaXMzLmxlZnRDaGVja2VkLmluZGV4T2YoaXRlbUtleSk+LTEmJl90aGlzMy52YWx1ZS5pbmRleE9mKGl0ZW1LZXkpPT09LTEpe2l0ZW1zVG9CZU1vdmVkLnB1c2goaXRlbUtleSk7fX0pO2N1cnJlbnRWYWx1ZT10aGlzLnRhcmdldE9yZGVyPT09J3Vuc2hpZnQnP2l0ZW1zVG9CZU1vdmVkLmNvbmNhdChjdXJyZW50VmFsdWUpOmN1cnJlbnRWYWx1ZS5jb25jYXQoaXRlbXNUb0JlTW92ZWQpO3RoaXMuJGVtaXQoJ2lucHV0JyxjdXJyZW50VmFsdWUpO3RoaXMuJGVtaXQoJ2NoYW5nZScsY3VycmVudFZhbHVlLCdyaWdodCcsdGhpcy5sZWZ0Q2hlY2tlZCk7fSxjbGVhclF1ZXJ5OmZ1bmN0aW9uIGNsZWFyUXVlcnkod2hpY2gpe2lmKHdoaWNoPT09J2xlZnQnKXt0aGlzLiRyZWZzLmxlZnRQYW5lbC5xdWVyeT0nJzt9ZWxzZSBpZih3aGljaD09PSdyaWdodCcpe3RoaXMuJHJlZnMucmlnaHRQYW5lbC5xdWVyeT0nJzt9fX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdHJhbnNmZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX3RyYW5zZmVyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXRyYW5zZmVyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdHJhbnNmZXIvc3JjL21haW4udnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgdHJhbnNmZXJfc3JjX21haW5fY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChwYWNrYWdlc190cmFuc2Zlcl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNWM2NTRkZDhfcmVuZGVyLG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81YzY1NGRkOF9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIHRyYW5zZmVyX3NyY19tYWluX2FwaTt9dHJhbnNmZXJfc3JjX21haW5fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy90cmFuc2Zlci9zcmMvbWFpbi52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgdHJhbnNmZXJfc3JjX21haW49dHJhbnNmZXJfc3JjX21haW5fY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90cmFuc2Zlci9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL3RyYW5zZmVyX3NyY19tYWluLmluc3RhbGw9ZnVuY3Rpb24oVnVlKXtWdWUuY29tcG9uZW50KHRyYW5zZmVyX3NyY19tYWluLm5hbWUsdHJhbnNmZXJfc3JjX21haW4pO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciB0cmFuc2Zlcj10cmFuc2Zlcl9zcmNfbWFpbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2NvbnRhaW5lci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NWJmMTgxZDQmCnZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNWJmMTgxZDRfcmVuZGVyPWZ1bmN0aW9uIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81YmYxODFkNF9yZW5kZXIoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDt2YXIgX2M9X3ZtLl9zZWxmLl9jfHxfaDtyZXR1cm4gX2MoInNlY3Rpb24iLHtzdGF0aWNDbGFzczoiZWwtY29udGFpbmVyIixjbGFzczp7ImlzLXZlcnRpY2FsIjpfdm0uaXNWZXJ0aWNhbH19LFtfdm0uX3QoImRlZmF1bHQiKV0sMik7fTt2YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzViZjE4MWQ0X3N0YXRpY1JlbmRlckZucz1bXTttYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNWJmMTgxZDRfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NvbnRhaW5lci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NWJmMTgxZDQmCi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2NvbnRhaW5lci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgY29udGFpbmVyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbENvbnRhaW5lcicsY29tcG9uZW50TmFtZTonRWxDb250YWluZXInLHByb3BzOntkaXJlY3Rpb246U3RyaW5nfSxjb21wdXRlZDp7aXNWZXJ0aWNhbDpmdW5jdGlvbiBpc1ZlcnRpY2FsKCl7aWYodGhpcy5kaXJlY3Rpb249PT0ndmVydGljYWwnKXtyZXR1cm4gdHJ1ZTt9ZWxzZSBpZih0aGlzLmRpcmVjdGlvbj09PSdob3Jpem9udGFsJyl7cmV0dXJuIGZhbHNlO31yZXR1cm4gdGhpcy4kc2xvdHMmJnRoaXMuJHNsb3RzLmRlZmF1bHQ/dGhpcy4kc2xvdHMuZGVmYXVsdC5zb21lKGZ1bmN0aW9uKHZub2RlKXt2YXIgdGFnPXZub2RlLmNvbXBvbmVudE9wdGlvbnMmJnZub2RlLmNvbXBvbmVudE9wdGlvbnMudGFnO3JldHVybiB0YWc9PT0nZWwtaGVhZGVyJ3x8dGFnPT09J2VsLWZvb3Rlcic7fSk6ZmFsc2U7fX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY29udGFpbmVyL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYWNrYWdlc19jb250YWluZXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189Y29udGFpbmVyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY29udGFpbmVyL3NyYy9tYWluLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIGNvbnRhaW5lcl9zcmNfbWFpbl9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHBhY2thZ2VzX2NvbnRhaW5lcl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNWJmMTgxZDRfcmVuZGVyLG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81YmYxODFkNF9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIGNvbnRhaW5lcl9zcmNfbWFpbl9hcGk7fWNvbnRhaW5lcl9zcmNfbWFpbl9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL2NvbnRhaW5lci9zcmMvbWFpbi52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgY29udGFpbmVyX3NyY19tYWluPWNvbnRhaW5lcl9zcmNfbWFpbl9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NvbnRhaW5lci9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL2NvbnRhaW5lcl9zcmNfbWFpbi5pbnN0YWxsPWZ1bmN0aW9uKFZ1ZSl7VnVlLmNvbXBvbmVudChjb250YWluZXJfc3JjX21haW4ubmFtZSxjb250YWluZXJfc3JjX21haW4pO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYWNrYWdlc19jb250YWluZXI9Y29udGFpbmVyX3NyY19tYWluOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvaGVhZGVyL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0yYjI5NmFiMiYKdmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF8yYjI5NmFiMl9yZW5kZXI9ZnVuY3Rpb24gbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzJiMjk2YWIyX3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygiaGVhZGVyIix7c3RhdGljQ2xhc3M6ImVsLWhlYWRlciIsc3R5bGU6e2hlaWdodDpfdm0uaGVpZ2h0fX0sW192bS5fdCgiZGVmYXVsdCIpXSwyKTt9O3ZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfMmIyOTZhYjJfc3RhdGljUmVuZGVyRm5zPVtdO21haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF8yYjI5NmFiMl9yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvaGVhZGVyL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0yYjI5NmFiMiYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvaGVhZGVyL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLy8KLy8KLy8KLy8KLy8KLy8KLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBoZWFkZXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e25hbWU6J0VsSGVhZGVyJyxjb21wb25lbnROYW1lOidFbEhlYWRlcicscHJvcHM6e2hlaWdodDp7dHlwZTpTdHJpbmcsZGVmYXVsdDonNjBweCd9fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9oZWFkZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX2hlYWRlcl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz1oZWFkZXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9oZWFkZXIvc3JjL21haW4udnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgaGVhZGVyX3NyY19tYWluX2NvbXBvbmVudD1ub3JtYWxpemVDb21wb25lbnQocGFja2FnZXNfaGVhZGVyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF8yYjI5NmFiMl9yZW5kZXIsbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzJiMjk2YWIyX3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgaGVhZGVyX3NyY19tYWluX2FwaTt9aGVhZGVyX3NyY19tYWluX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvaGVhZGVyL3NyYy9tYWluLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBoZWFkZXJfc3JjX21haW49aGVhZGVyX3NyY19tYWluX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvaGVhZGVyL2luZGV4LmpzCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovaGVhZGVyX3NyY19tYWluLmluc3RhbGw9ZnVuY3Rpb24oVnVlKXtWdWUuY29tcG9uZW50KGhlYWRlcl9zcmNfbWFpbi5uYW1lLGhlYWRlcl9zcmNfbWFpbik7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGhlYWRlcj1oZWFkZXJfc3JjX21haW47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9hc2lkZS9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MDM0MTFkYmYmCnZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfMDM0MTFkYmZfcmVuZGVyPWZ1bmN0aW9uIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF8wMzQxMWRiZl9yZW5kZXIoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDt2YXIgX2M9X3ZtLl9zZWxmLl9jfHxfaDtyZXR1cm4gX2MoImFzaWRlIix7c3RhdGljQ2xhc3M6ImVsLWFzaWRlIixzdHlsZTp7d2lkdGg6X3ZtLndpZHRofX0sW192bS5fdCgiZGVmYXVsdCIpXSwyKTt9O3ZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfMDM0MTFkYmZfc3RhdGljUmVuZGVyRm5zPVtdO21haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF8wMzQxMWRiZl9yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYXNpZGUvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTAzNDExZGJmJgovLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9hc2lkZS9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgYXNpZGVfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e25hbWU6J0VsQXNpZGUnLGNvbXBvbmVudE5hbWU6J0VsQXNpZGUnLHByb3BzOnt3aWR0aDp7dHlwZTpTdHJpbmcsZGVmYXVsdDonMzAwcHgnfX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYXNpZGUvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX2FzaWRlX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPWFzaWRlX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYXNpZGUvc3JjL21haW4udnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgYXNpZGVfc3JjX21haW5fY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChwYWNrYWdlc19hc2lkZV9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfMDM0MTFkYmZfcmVuZGVyLG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF8wMzQxMWRiZl9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIGFzaWRlX3NyY19tYWluX2FwaTt9YXNpZGVfc3JjX21haW5fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy9hc2lkZS9zcmMvbWFpbi52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgYXNpZGVfc3JjX21haW49YXNpZGVfc3JjX21haW5fY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9hc2lkZS9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL2FzaWRlX3NyY19tYWluLmluc3RhbGw9ZnVuY3Rpb24oVnVlKXtWdWUuY29tcG9uZW50KGFzaWRlX3NyY19tYWluLm5hbWUsYXNpZGVfc3JjX21haW4pO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBhc2lkZT1hc2lkZV9zcmNfbWFpbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL21haW4vc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTJhM2E3NDA2Jgp2YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzJhM2E3NDA2X3JlbmRlcj1mdW5jdGlvbiBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfMmEzYTc0MDZfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJtYWluIix7c3RhdGljQ2xhc3M6ImVsLW1haW4ifSxbX3ZtLl90KCJkZWZhdWx0IildLDIpO307dmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF8yYTNhNzQwNl9zdGF0aWNSZW5kZXJGbnM9W107bWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzJhM2E3NDA2X3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9tYWluL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0yYTNhNzQwNiYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvbWFpbi9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgbWFpbl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17bmFtZTonRWxNYWluJyxjb21wb25lbnROYW1lOidFbE1haW4nfTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL21haW4vc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX21haW5fc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189bWFpbl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL21haW4vc3JjL21haW4udnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgbWFpbl9zcmNfbWFpbl9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHBhY2thZ2VzX21haW5fc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzJhM2E3NDA2X3JlbmRlcixtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfMmEzYTc0MDZfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciBtYWluX3NyY19tYWluX2FwaTt9bWFpbl9zcmNfbWFpbl9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL21haW4vc3JjL21haW4udnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIG1haW5fc3JjX21haW49bWFpbl9zcmNfbWFpbl9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL21haW4vaW5kZXguanMKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9tYWluX3NyY19tYWluLmluc3RhbGw9ZnVuY3Rpb24oVnVlKXtWdWUuY29tcG9uZW50KG1haW5fc3JjX21haW4ubmFtZSxtYWluX3NyY19tYWluKTt9Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFja2FnZXNfbWFpbj1tYWluX3NyY19tYWluOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZm9vdGVyL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD04MDIxMDMzOCYKdmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF84MDIxMDMzOF9yZW5kZXI9ZnVuY3Rpb24gbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzgwMjEwMzM4X3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygiZm9vdGVyIix7c3RhdGljQ2xhc3M6ImVsLWZvb3RlciIsc3R5bGU6e2hlaWdodDpfdm0uaGVpZ2h0fX0sW192bS5fdCgiZGVmYXVsdCIpXSwyKTt9O3ZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfODAyMTAzMzhfc3RhdGljUmVuZGVyRm5zPVtdO21haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF84MDIxMDMzOF9yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZm9vdGVyL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD04MDIxMDMzOCYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZm9vdGVyL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLy8KLy8KLy8KLy8KLy8KLy8KLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBmb290ZXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e25hbWU6J0VsRm9vdGVyJyxjb21wb25lbnROYW1lOidFbEZvb3RlcicscHJvcHM6e2hlaWdodDp7dHlwZTpTdHJpbmcsZGVmYXVsdDonNjBweCd9fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9mb290ZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX2Zvb3Rlcl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz1mb290ZXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9mb290ZXIvc3JjL21haW4udnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgZm9vdGVyX3NyY19tYWluX2NvbXBvbmVudD1ub3JtYWxpemVDb21wb25lbnQocGFja2FnZXNfZm9vdGVyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF84MDIxMDMzOF9yZW5kZXIsbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzgwMjEwMzM4X3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgZm9vdGVyX3NyY19tYWluX2FwaTt9Zm9vdGVyX3NyY19tYWluX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvZm9vdGVyL3NyYy9tYWluLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBmb290ZXJfc3JjX21haW49Zm9vdGVyX3NyY19tYWluX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZm9vdGVyL2luZGV4LmpzCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovZm9vdGVyX3NyY19tYWluLmluc3RhbGw9ZnVuY3Rpb24oVnVlKXtWdWUuY29tcG9uZW50KGZvb3Rlcl9zcmNfbWFpbi5uYW1lLGZvb3Rlcl9zcmNfbWFpbik7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGZvb3Rlcj1mb290ZXJfc3JjX21haW47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvdGltZWxpbmUvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHRpbWVsaW5lX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbFRpbWVsaW5lJyxwcm9wczp7cmV2ZXJzZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ZmFsc2V9fSxwcm92aWRlOmZ1bmN0aW9uIHByb3ZpZGUoKXtyZXR1cm57dGltZWxpbmU6dGhpc307fSxyZW5kZXI6ZnVuY3Rpb24gcmVuZGVyKCl7dmFyIGg9YXJndW1lbnRzWzBdO3ZhciByZXZlcnNlPXRoaXMucmV2ZXJzZTt2YXIgY2xhc3Nlcz17J2VsLXRpbWVsaW5lJzp0cnVlLCdpcy1yZXZlcnNlJzpyZXZlcnNlfTt2YXIgc2xvdHM9dGhpcy4kc2xvdHMuZGVmYXVsdHx8W107aWYocmV2ZXJzZSl7c2xvdHM9c2xvdHMucmV2ZXJzZSgpO31yZXR1cm4gaCgndWwnLHsnY2xhc3MnOmNsYXNzZXN9LFtzbG90c10pO319Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGltZWxpbmUvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX3RpbWVsaW5lX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXRpbWVsaW5lX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGltZWxpbmUvc3JjL21haW4udnVlCnZhciBtYWluX3JlbmRlcixtYWluX3N0YXRpY1JlbmRlckZuczsvKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIHRpbWVsaW5lX3NyY19tYWluX2NvbXBvbmVudD1ub3JtYWxpemVDb21wb25lbnQocGFja2FnZXNfdGltZWxpbmVfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sbWFpbl9yZW5kZXIsbWFpbl9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIHRpbWVsaW5lX3NyY19tYWluX2FwaTt9dGltZWxpbmVfc3JjX21haW5fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy90aW1lbGluZS9zcmMvbWFpbi52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgdGltZWxpbmVfc3JjX21haW49dGltZWxpbmVfc3JjX21haW5fY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90aW1lbGluZS9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL3RpbWVsaW5lX3NyY19tYWluLmluc3RhbGw9ZnVuY3Rpb24oVnVlKXtWdWUuY29tcG9uZW50KHRpbWVsaW5lX3NyY19tYWluLm5hbWUsdGltZWxpbmVfc3JjX21haW4pO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciB0aW1lbGluZT10aW1lbGluZV9zcmNfbWFpbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3RpbWVsaW5lL3NyYy9pdGVtLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD02MWE2OWU1MCYKdmFyIGl0ZW12dWVfdHlwZV90ZW1wbGF0ZV9pZF82MWE2OWU1MF9yZW5kZXI9ZnVuY3Rpb24gaXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzYxYTY5ZTUwX3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygibGkiLHtzdGF0aWNDbGFzczoiZWwtdGltZWxpbmUtaXRlbSJ9LFtfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXRpbWVsaW5lLWl0ZW1fX3RhaWwifSksIV92bS4kc2xvdHMuZG90P19jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtdGltZWxpbmUtaXRlbV9fbm9kZSIsY2xhc3M6WyJlbC10aW1lbGluZS1pdGVtX19ub2RlLS0iKyhfdm0uc2l6ZXx8IiIpLCJlbC10aW1lbGluZS1pdGVtX19ub2RlLS0iKyhfdm0udHlwZXx8IiIpXSxzdHlsZTp7YmFja2dyb3VuZENvbG9yOl92bS5jb2xvcn19LFtfdm0uaWNvbj9fYygiaSIse3N0YXRpY0NsYXNzOiJlbC10aW1lbGluZS1pdGVtX19pY29uIixjbGFzczpfdm0uaWNvbn0pOl92bS5fZSgpXSk6X3ZtLl9lKCksX3ZtLiRzbG90cy5kb3Q/X2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC10aW1lbGluZS1pdGVtX19kb3QifSxbX3ZtLl90KCJkb3QiKV0sMik6X3ZtLl9lKCksX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC10aW1lbGluZS1pdGVtX193cmFwcGVyIn0sWyFfdm0uaGlkZVRpbWVzdGFtcCYmX3ZtLnBsYWNlbWVudD09PSJ0b3AiP19jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtdGltZWxpbmUtaXRlbV9fdGltZXN0YW1wIGlzLXRvcCJ9LFtfdm0uX3YoIlxuICAgICAgIitfdm0uX3MoX3ZtLnRpbWVzdGFtcCkrIlxuICAgICIpXSk6X3ZtLl9lKCksX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC10aW1lbGluZS1pdGVtX19jb250ZW50In0sW192bS5fdCgiZGVmYXVsdCIpXSwyKSwhX3ZtLmhpZGVUaW1lc3RhbXAmJl92bS5wbGFjZW1lbnQ9PT0iYm90dG9tIj9fYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXRpbWVsaW5lLWl0ZW1fX3RpbWVzdGFtcCBpcy1ib3R0b20ifSxbX3ZtLl92KCJcbiAgICAgICIrX3ZtLl9zKF92bS50aW1lc3RhbXApKyJcbiAgICAiKV0pOl92bS5fZSgpXSldKTt9O3ZhciBpdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfNjFhNjllNTBfc3RhdGljUmVuZGVyRm5zPVtdO2l0ZW12dWVfdHlwZV90ZW1wbGF0ZV9pZF82MWE2OWU1MF9yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGltZWxpbmUvc3JjL2l0ZW0udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTYxYTY5ZTUwJgovLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy90aW1lbGluZS9zcmMvaXRlbS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgdGltZWxpbmVfc3JjX2l0ZW12dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e25hbWU6J0VsVGltZWxpbmVJdGVtJyxpbmplY3Q6Wyd0aW1lbGluZSddLHByb3BzOnt0aW1lc3RhbXA6U3RyaW5nLGhpZGVUaW1lc3RhbXA6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OmZhbHNlfSxwbGFjZW1lbnQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6J2JvdHRvbSd9LHR5cGU6U3RyaW5nLGNvbG9yOlN0cmluZyxzaXplOnt0eXBlOlN0cmluZyxkZWZhdWx0Oidub3JtYWwnfSxpY29uOlN0cmluZ319Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGltZWxpbmUvc3JjL2l0ZW0udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX3RpbWVsaW5lX3NyY19pdGVtdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXRpbWVsaW5lX3NyY19pdGVtdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGltZWxpbmUvc3JjL2l0ZW0udnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgc3JjX2l0ZW1fY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChwYWNrYWdlc190aW1lbGluZV9zcmNfaXRlbXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxpdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfNjFhNjllNTBfcmVuZGVyLGl0ZW12dWVfdHlwZV90ZW1wbGF0ZV9pZF82MWE2OWU1MF9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIHNyY19pdGVtX2FwaTt9c3JjX2l0ZW1fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy90aW1lbGluZS9zcmMvaXRlbS52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgdGltZWxpbmVfc3JjX2l0ZW09c3JjX2l0ZW1fY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90aW1lbGluZS1pdGVtL2luZGV4LmpzCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovdGltZWxpbmVfc3JjX2l0ZW0uaW5zdGFsbD1mdW5jdGlvbihWdWUpe1Z1ZS5jb21wb25lbnQodGltZWxpbmVfc3JjX2l0ZW0ubmFtZSx0aW1lbGluZV9zcmNfaXRlbSk7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHRpbWVsaW5lX2l0ZW09dGltZWxpbmVfc3JjX2l0ZW07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9saW5rL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0wMWNmM2I2NSYKdmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF8wMWNmM2I2NV9yZW5kZXI9ZnVuY3Rpb24gbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzAxY2YzYjY1X3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygiYSIsX3ZtLl9iKHtjbGFzczpbImVsLWxpbmsiLF92bS50eXBlPyJlbC1saW5rLS0iK192bS50eXBlOiIiLF92bS5kaXNhYmxlZCYmImlzLWRpc2FibGVkIixfdm0udW5kZXJsaW5lJiYhX3ZtLmRpc2FibGVkJiYiaXMtdW5kZXJsaW5lIl0sYXR0cnM6e2hyZWY6X3ZtLmRpc2FibGVkP251bGw6X3ZtLmhyZWZ9LG9uOntjbGljazpfdm0uaGFuZGxlQ2xpY2t9fSwiYSIsX3ZtLiRhdHRycyxmYWxzZSksW192bS5pY29uP19jKCJpIix7Y2xhc3M6X3ZtLmljb259KTpfdm0uX2UoKSxfdm0uJHNsb3RzLmRlZmF1bHQ/X2MoInNwYW4iLHtzdGF0aWNDbGFzczoiZWwtbGluay0taW5uZXIifSxbX3ZtLl90KCJkZWZhdWx0IildLDIpOl92bS5fZSgpLF92bS4kc2xvdHMuaWNvbj9bX3ZtLiRzbG90cy5pY29uP192bS5fdCgiaWNvbiIpOl92bS5fZSgpXTpfdm0uX2UoKV0sMik7fTt2YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzAxY2YzYjY1X3N0YXRpY1JlbmRlckZucz1bXTttYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfMDFjZjNiNjVfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2xpbmsvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTAxY2YzYjY1JgovLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9saW5rL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBsaW5rX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbExpbmsnLHByb3BzOnt0eXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OidkZWZhdWx0J30sdW5kZXJsaW5lOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDp0cnVlfSxkaXNhYmxlZDpCb29sZWFuLGhyZWY6U3RyaW5nLGljb246U3RyaW5nfSxtZXRob2RzOntoYW5kbGVDbGljazpmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCl7aWYoIXRoaXMuZGlzYWJsZWQpe2lmKCF0aGlzLmhyZWYpe3RoaXMuJGVtaXQoJ2NsaWNrJyxldmVudCk7fX19fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9saW5rL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYWNrYWdlc19saW5rX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPWxpbmtfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9saW5rL3NyYy9tYWluLnZ1ZQovKiBub3JtYWxpemUgY29tcG9uZW50ICovdmFyIGxpbmtfc3JjX21haW5fY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChwYWNrYWdlc19saW5rX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF8wMWNmM2I2NV9yZW5kZXIsbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzAxY2YzYjY1X3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgbGlua19zcmNfbWFpbl9hcGk7fWxpbmtfc3JjX21haW5fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy9saW5rL3NyYy9tYWluLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBsaW5rX3NyY19tYWluPWxpbmtfc3JjX21haW5fY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9saW5rL2luZGV4LmpzCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovbGlua19zcmNfbWFpbi5pbnN0YWxsPWZ1bmN0aW9uKFZ1ZSl7VnVlLmNvbXBvbmVudChsaW5rX3NyY19tYWluLm5hbWUsbGlua19zcmNfbWFpbik7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX2xpbms9bGlua19zcmNfbWFpbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2RpdmlkZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTdmYTAyYTdlJmZ1bmN0aW9uYWw9dHJ1ZSYKdmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF83ZmEwMmE3ZV9mdW5jdGlvbmFsX3RydWVfcmVuZGVyPWZ1bmN0aW9uIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF83ZmEwMmE3ZV9mdW5jdGlvbmFsX3RydWVfcmVuZGVyKF9oLF92bSl7dmFyIF9jPV92bS5fYztyZXR1cm4gX2MoImRpdiIsX3ZtLl9nKF92bS5fYih7Y2xhc3M6W192bS5kYXRhLnN0YXRpY0NsYXNzLCJlbC1kaXZpZGVyIiwiZWwtZGl2aWRlci0tIitfdm0ucHJvcHMuZGlyZWN0aW9uXX0sImRpdiIsX3ZtLmRhdGEuYXR0cnMsZmFsc2UpLF92bS5saXN0ZW5lcnMpLFtfdm0uc2xvdHMoKS5kZWZhdWx0JiZfdm0ucHJvcHMuZGlyZWN0aW9uIT09InZlcnRpY2FsIj9fYygiZGl2Iix7Y2xhc3M6WyJlbC1kaXZpZGVyX190ZXh0IiwiaXMtIitfdm0ucHJvcHMuY29udGVudFBvc2l0aW9uXX0sW192bS5fdCgiZGVmYXVsdCIpXSwyKTpfdm0uX2UoKV0pO307dmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF83ZmEwMmE3ZV9mdW5jdGlvbmFsX3RydWVfc3RhdGljUmVuZGVyRm5zPVtdO21haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF83ZmEwMmE3ZV9mdW5jdGlvbmFsX3RydWVfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RpdmlkZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTdmYTAyYTdlJmZ1bmN0aW9uYWw9dHJ1ZSYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZGl2aWRlci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgZGl2aWRlcl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17bmFtZTonRWxEaXZpZGVyJyxwcm9wczp7ZGlyZWN0aW9uOnt0eXBlOlN0cmluZyxkZWZhdWx0Oidob3Jpem9udGFsJyx2YWxpZGF0b3I6ZnVuY3Rpb24gdmFsaWRhdG9yKHZhbCl7cmV0dXJuWydob3Jpem9udGFsJywndmVydGljYWwnXS5pbmRleE9mKHZhbCkhPT0tMTt9fSxjb250ZW50UG9zaXRpb246e3R5cGU6U3RyaW5nLGRlZmF1bHQ6J2NlbnRlcicsdmFsaWRhdG9yOmZ1bmN0aW9uIHZhbGlkYXRvcih2YWwpe3JldHVyblsnbGVmdCcsJ2NlbnRlcicsJ3JpZ2h0J10uaW5kZXhPZih2YWwpIT09LTE7fX19fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RpdmlkZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX2RpdmlkZXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189ZGl2aWRlcl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RpdmlkZXIvc3JjL21haW4udnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgZGl2aWRlcl9zcmNfbWFpbl9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHBhY2thZ2VzX2RpdmlkZXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzdmYTAyYTdlX2Z1bmN0aW9uYWxfdHJ1ZV9yZW5kZXIsbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzdmYTAyYTdlX2Z1bmN0aW9uYWxfdHJ1ZV9zdGF0aWNSZW5kZXJGbnMsdHJ1ZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgZGl2aWRlcl9zcmNfbWFpbl9hcGk7fWRpdmlkZXJfc3JjX21haW5fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy9kaXZpZGVyL3NyYy9tYWluLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBkaXZpZGVyX3NyY19tYWluPWRpdmlkZXJfc3JjX21haW5fY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kaXZpZGVyL2luZGV4LmpzCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovZGl2aWRlcl9zcmNfbWFpbi5pbnN0YWxsPWZ1bmN0aW9uKFZ1ZSl7VnVlLmNvbXBvbmVudChkaXZpZGVyX3NyY19tYWluLm5hbWUsZGl2aWRlcl9zcmNfbWFpbik7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGRpdmlkZXI9ZGl2aWRlcl9zcmNfbWFpbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2ltYWdlL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD00NGQ4NGE3YyYKdmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF80NGQ4NGE3Y19yZW5kZXI9ZnVuY3Rpb24gbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQ0ZDg0YTdjX3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLWltYWdlIn0sW192bS5sb2FkaW5nP192bS5fdCgicGxhY2Vob2xkZXIiLFtfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLWltYWdlX19wbGFjZWhvbGRlciJ9KV0pOl92bS5lcnJvcj9fdm0uX3QoImVycm9yIixbX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1pbWFnZV9fZXJyb3IifSxbX3ZtLl92KF92bS5fcyhfdm0udCgiZWwuaW1hZ2UuZXJyb3IiKSkpXSldKTpfYygiaW1nIixfdm0uX2coX3ZtLl9iKHtzdGF0aWNDbGFzczoiZWwtaW1hZ2VfX2lubmVyIixjbGFzczp7ImVsLWltYWdlX19pbm5lci0tY2VudGVyIjpfdm0uYWxpZ25DZW50ZXIsImVsLWltYWdlX19wcmV2aWV3Ijpfdm0ucHJldmlld30sc3R5bGU6X3ZtLmltYWdlU3R5bGUsYXR0cnM6e3NyYzpfdm0uc3JjfSxvbjp7Y2xpY2s6X3ZtLmNsaWNrSGFuZGxlcn19LCJpbWciLF92bS4kYXR0cnMsZmFsc2UpLF92bS4kbGlzdGVuZXJzKSksX3ZtLnByZXZpZXc/W192bS5zaG93Vmlld2VyP19jKCJpbWFnZS12aWV3ZXIiLHthdHRyczp7InotaW5kZXgiOl92bS56SW5kZXgsImluaXRpYWwtaW5kZXgiOl92bS5pbWFnZUluZGV4LCJvbi1jbG9zZSI6X3ZtLmNsb3NlVmlld2VyLCJ1cmwtbGlzdCI6X3ZtLnByZXZpZXdTcmNMaXN0fX0pOl92bS5fZSgpXTpfdm0uX2UoKV0sMik7fTt2YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQ0ZDg0YTdjX3N0YXRpY1JlbmRlckZucz1bXTttYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNDRkODRhN2NfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2ltYWdlL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD00NGQ4NGE3YyYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9pbWFnZS9zcmMvaW1hZ2Utdmlld2VyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD01ZTczYjMwNyYKdmFyIGltYWdlX3ZpZXdlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzVlNzNiMzA3X3JlbmRlcj1mdW5jdGlvbiBpbWFnZV92aWV3ZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF81ZTczYjMwN19yZW5kZXIoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDt2YXIgX2M9X3ZtLl9zZWxmLl9jfHxfaDtyZXR1cm4gX2MoInRyYW5zaXRpb24iLHthdHRyczp7bmFtZToidmlld2VyLWZhZGUifX0sW19jKCJkaXYiLHtyZWY6ImVsLWltYWdlLXZpZXdlcl9fd3JhcHBlciIsc3RhdGljQ2xhc3M6ImVsLWltYWdlLXZpZXdlcl9fd3JhcHBlciIsc3R5bGU6eyJ6LWluZGV4Ijpfdm0uekluZGV4fSxhdHRyczp7dGFiaW5kZXg6Ii0xIn19LFtfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLWltYWdlLXZpZXdlcl9fbWFzayJ9KSxfYygic3BhbiIse3N0YXRpY0NsYXNzOiJlbC1pbWFnZS12aWV3ZXJfX2J0biBlbC1pbWFnZS12aWV3ZXJfX2Nsb3NlIixvbjp7Y2xpY2s6X3ZtLmhpZGV9fSxbX2MoImkiLHtzdGF0aWNDbGFzczoiZWwtaWNvbi1jaXJjbGUtY2xvc2UifSldKSwhX3ZtLmlzU2luZ2xlP1tfYygic3BhbiIse3N0YXRpY0NsYXNzOiJlbC1pbWFnZS12aWV3ZXJfX2J0biBlbC1pbWFnZS12aWV3ZXJfX3ByZXYiLGNsYXNzOnsiaXMtZGlzYWJsZWQiOiFfdm0uaW5maW5pdGUmJl92bS5pc0ZpcnN0fSxvbjp7Y2xpY2s6X3ZtLnByZXZ9fSxbX2MoImkiLHtzdGF0aWNDbGFzczoiZWwtaWNvbi1hcnJvdy1sZWZ0In0pXSksX2MoInNwYW4iLHtzdGF0aWNDbGFzczoiZWwtaW1hZ2Utdmlld2VyX19idG4gZWwtaW1hZ2Utdmlld2VyX19uZXh0IixjbGFzczp7ImlzLWRpc2FibGVkIjohX3ZtLmluZmluaXRlJiZfdm0uaXNMYXN0fSxvbjp7Y2xpY2s6X3ZtLm5leHR9fSxbX2MoImkiLHtzdGF0aWNDbGFzczoiZWwtaWNvbi1hcnJvdy1yaWdodCJ9KV0pXTpfdm0uX2UoKSxfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLWltYWdlLXZpZXdlcl9fYnRuIGVsLWltYWdlLXZpZXdlcl9fYWN0aW9ucyJ9LFtfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLWltYWdlLXZpZXdlcl9fYWN0aW9uc19faW5uZXIifSxbX2MoImkiLHtzdGF0aWNDbGFzczoiZWwtaWNvbi16b29tLW91dCIsb246e2NsaWNrOmZ1bmN0aW9uIGNsaWNrKCRldmVudCl7X3ZtLmhhbmRsZUFjdGlvbnMoInpvb21PdXQiKTt9fX0pLF9jKCJpIix7c3RhdGljQ2xhc3M6ImVsLWljb24tem9vbS1pbiIsb246e2NsaWNrOmZ1bmN0aW9uIGNsaWNrKCRldmVudCl7X3ZtLmhhbmRsZUFjdGlvbnMoInpvb21JbiIpO319fSksX2MoImkiLHtzdGF0aWNDbGFzczoiZWwtaW1hZ2Utdmlld2VyX19hY3Rpb25zX19kaXZpZGVyIn0pLF9jKCJpIix7Y2xhc3M6X3ZtLm1vZGUuaWNvbixvbjp7Y2xpY2s6X3ZtLnRvZ2dsZU1vZGV9fSksX2MoImkiLHtzdGF0aWNDbGFzczoiZWwtaW1hZ2Utdmlld2VyX19hY3Rpb25zX19kaXZpZGVyIn0pLF9jKCJpIix7c3RhdGljQ2xhc3M6ImVsLWljb24tcmVmcmVzaC1sZWZ0Iixvbjp7Y2xpY2s6ZnVuY3Rpb24gY2xpY2soJGV2ZW50KXtfdm0uaGFuZGxlQWN0aW9ucygiYW50aWNsb2NlbGlzZSIpO319fSksX2MoImkiLHtzdGF0aWNDbGFzczoiZWwtaWNvbi1yZWZyZXNoLXJpZ2h0Iixvbjp7Y2xpY2s6ZnVuY3Rpb24gY2xpY2soJGV2ZW50KXtfdm0uaGFuZGxlQWN0aW9ucygiY2xvY2VsaXNlIik7fX19KV0pXSksX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1pbWFnZS12aWV3ZXJfX2NhbnZhcyJ9LF92bS5fbChfdm0udXJsTGlzdCxmdW5jdGlvbih1cmwsaSl7cmV0dXJuIGk9PT1fdm0uaW5kZXg/X2MoImltZyIse2tleTp1cmwscmVmOiJpbWciLHJlZkluRm9yOnRydWUsc3RhdGljQ2xhc3M6ImVsLWltYWdlLXZpZXdlcl9faW1nIixzdHlsZTpfdm0uaW1nU3R5bGUsYXR0cnM6e3NyYzpfdm0uY3VycmVudEltZ30sb246e2xvYWQ6X3ZtLmhhbmRsZUltZ0xvYWQsZXJyb3I6X3ZtLmhhbmRsZUltZ0Vycm9yLG1vdXNlZG93bjpfdm0uaGFuZGxlTW91c2VEb3dufX0pOl92bS5fZSgpO30pLDApXSwyKV0pO307dmFyIGltYWdlX3ZpZXdlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzVlNzNiMzA3X3N0YXRpY1JlbmRlckZucz1bXTtpbWFnZV92aWV3ZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF81ZTczYjMwN19yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvaW1hZ2Uvc3JjL2ltYWdlLXZpZXdlci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NWU3M2IzMDcmCi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2ltYWdlL3NyYy9pbWFnZS12aWV3ZXIudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgp2YXIgaW1hZ2Vfdmlld2VydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XTt9fX1yZXR1cm4gdGFyZ2V0O307Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KdmFyIE1vZGU9e0NPTlRBSU46e25hbWU6J2NvbnRhaW4nLGljb246J2VsLWljb24tZnVsbC1zY3JlZW4nfSxPUklHSU5BTDp7bmFtZTonb3JpZ2luYWwnLGljb246J2VsLWljb24tYy1zY2FsZS10by1vcmlnaW5hbCd9fTt2YXIgbW91c2V3aGVlbEV2ZW50TmFtZT1PYmplY3QodXRpbF9bImlzRmlyZWZveCJdKSgpPydET01Nb3VzZVNjcm9sbCc6J21vdXNld2hlZWwnOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgaW1hZ2Vfdmlld2VydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidlbEltYWdlVmlld2VyJyxwcm9wczp7dXJsTGlzdDp7dHlwZTpBcnJheSxkZWZhdWx0OmZ1bmN0aW9uIF9kZWZhdWx0KCl7cmV0dXJuW107fX0sekluZGV4Ont0eXBlOk51bWJlcixkZWZhdWx0OjIwMDB9LG9uU3dpdGNoOnt0eXBlOkZ1bmN0aW9uLGRlZmF1bHQ6ZnVuY3Rpb24gX2RlZmF1bHQoKXt9fSxvbkNsb3NlOnt0eXBlOkZ1bmN0aW9uLGRlZmF1bHQ6ZnVuY3Rpb24gX2RlZmF1bHQoKXt9fSxpbml0aWFsSW5kZXg6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MH19LGRhdGE6ZnVuY3Rpb24gZGF0YSgpe3JldHVybntpbmRleDp0aGlzLmluaXRpYWxJbmRleCxpc1Nob3c6ZmFsc2UsaW5maW5pdGU6dHJ1ZSxsb2FkaW5nOmZhbHNlLG1vZGU6TW9kZS5DT05UQUlOLHRyYW5zZm9ybTp7c2NhbGU6MSxkZWc6MCxvZmZzZXRYOjAsb2Zmc2V0WTowLGVuYWJsZVRyYW5zaXRpb246ZmFsc2V9fTt9LGNvbXB1dGVkOntpc1NpbmdsZTpmdW5jdGlvbiBpc1NpbmdsZSgpe3JldHVybiB0aGlzLnVybExpc3QubGVuZ3RoPD0xO30saXNGaXJzdDpmdW5jdGlvbiBpc0ZpcnN0KCl7cmV0dXJuIHRoaXMuaW5kZXg9PT0wO30saXNMYXN0OmZ1bmN0aW9uIGlzTGFzdCgpe3JldHVybiB0aGlzLmluZGV4PT09dGhpcy51cmxMaXN0Lmxlbmd0aC0xO30sY3VycmVudEltZzpmdW5jdGlvbiBjdXJyZW50SW1nKCl7cmV0dXJuIHRoaXMudXJsTGlzdFt0aGlzLmluZGV4XTt9LGltZ1N0eWxlOmZ1bmN0aW9uIGltZ1N0eWxlKCl7dmFyIF90cmFuc2Zvcm09dGhpcy50cmFuc2Zvcm0sc2NhbGU9X3RyYW5zZm9ybS5zY2FsZSxkZWc9X3RyYW5zZm9ybS5kZWcsb2Zmc2V0WD1fdHJhbnNmb3JtLm9mZnNldFgsb2Zmc2V0WT1fdHJhbnNmb3JtLm9mZnNldFksZW5hYmxlVHJhbnNpdGlvbj1fdHJhbnNmb3JtLmVuYWJsZVRyYW5zaXRpb247dmFyIHN0eWxlPXt0cmFuc2Zvcm06J3NjYWxlKCcrc2NhbGUrJykgcm90YXRlKCcrZGVnKydkZWcpJyx0cmFuc2l0aW9uOmVuYWJsZVRyYW5zaXRpb24/J3RyYW5zZm9ybSAuM3MnOicnLCdtYXJnaW4tbGVmdCc6b2Zmc2V0WCsncHgnLCdtYXJnaW4tdG9wJzpvZmZzZXRZKydweCd9O2lmKHRoaXMubW9kZT09PU1vZGUuQ09OVEFJTil7c3R5bGUubWF4V2lkdGg9c3R5bGUubWF4SGVpZ2h0PScxMDAlJzt9cmV0dXJuIHN0eWxlO319LHdhdGNoOntpbmRleDp7aGFuZGxlcjpmdW5jdGlvbiBoYW5kbGVyKHZhbCl7dGhpcy5yZXNldCgpO3RoaXMub25Td2l0Y2godmFsKTt9fSxjdXJyZW50SW1nOmZ1bmN0aW9uIGN1cnJlbnRJbWcodmFsKXt2YXIgX3RoaXM9dGhpczt0aGlzLiRuZXh0VGljayhmdW5jdGlvbihfKXt2YXIgJGltZz1fdGhpcy4kcmVmcy5pbWdbMF07aWYoISRpbWcuY29tcGxldGUpe190aGlzLmxvYWRpbmc9dHJ1ZTt9fSk7fX0sbWV0aG9kczp7aGlkZTpmdW5jdGlvbiBoaWRlKCl7dGhpcy5kZXZpY2VTdXBwb3J0VW5pbnN0YWxsKCk7dGhpcy5vbkNsb3NlKCk7fSxkZXZpY2VTdXBwb3J0SW5zdGFsbDpmdW5jdGlvbiBkZXZpY2VTdXBwb3J0SW5zdGFsbCgpe3ZhciBfdGhpczI9dGhpczt0aGlzLl9rZXlEb3duSGFuZGxlcj1PYmplY3QodXRpbF9bInJhZlRocm90dGxlIl0pKGZ1bmN0aW9uKGUpe3ZhciBrZXlDb2RlPWUua2V5Q29kZTtzd2l0Y2goa2V5Q29kZSl7Ly8gRVNDCmNhc2UgMjc6X3RoaXMyLmhpZGUoKTticmVhazsvLyBTUEFDRQpjYXNlIDMyOl90aGlzMi50b2dnbGVNb2RlKCk7YnJlYWs7Ly8gTEVGVF9BUlJPVwpjYXNlIDM3Ol90aGlzMi5wcmV2KCk7YnJlYWs7Ly8gVVBfQVJST1cKY2FzZSAzODpfdGhpczIuaGFuZGxlQWN0aW9ucygnem9vbUluJyk7YnJlYWs7Ly8gUklHSFRfQVJST1cKY2FzZSAzOTpfdGhpczIubmV4dCgpO2JyZWFrOy8vIERPV05fQVJST1cKY2FzZSA0MDpfdGhpczIuaGFuZGxlQWN0aW9ucygnem9vbU91dCcpO2JyZWFrO319KTt0aGlzLl9tb3VzZVdoZWVsSGFuZGxlcj1PYmplY3QodXRpbF9bInJhZlRocm90dGxlIl0pKGZ1bmN0aW9uKGUpe3ZhciBkZWx0YT1lLndoZWVsRGVsdGE/ZS53aGVlbERlbHRhOi1lLmRldGFpbDtpZihkZWx0YT4wKXtfdGhpczIuaGFuZGxlQWN0aW9ucygnem9vbUluJyx7em9vbVJhdGU6MC4wMTUsZW5hYmxlVHJhbnNpdGlvbjpmYWxzZX0pO31lbHNle190aGlzMi5oYW5kbGVBY3Rpb25zKCd6b29tT3V0Jyx7em9vbVJhdGU6MC4wMTUsZW5hYmxlVHJhbnNpdGlvbjpmYWxzZX0pO319KTtPYmplY3QoZG9tX1sib24iXSkoZG9jdW1lbnQsJ2tleWRvd24nLHRoaXMuX2tleURvd25IYW5kbGVyKTtPYmplY3QoZG9tX1sib24iXSkoZG9jdW1lbnQsbW91c2V3aGVlbEV2ZW50TmFtZSx0aGlzLl9tb3VzZVdoZWVsSGFuZGxlcik7fSxkZXZpY2VTdXBwb3J0VW5pbnN0YWxsOmZ1bmN0aW9uIGRldmljZVN1cHBvcnRVbmluc3RhbGwoKXtPYmplY3QoZG9tX1sib2ZmIl0pKGRvY3VtZW50LCdrZXlkb3duJyx0aGlzLl9rZXlEb3duSGFuZGxlcik7T2JqZWN0KGRvbV9bIm9mZiJdKShkb2N1bWVudCxtb3VzZXdoZWVsRXZlbnROYW1lLHRoaXMuX21vdXNlV2hlZWxIYW5kbGVyKTt0aGlzLl9rZXlEb3duSGFuZGxlcj1udWxsO3RoaXMuX21vdXNlV2hlZWxIYW5kbGVyPW51bGw7fSxoYW5kbGVJbWdMb2FkOmZ1bmN0aW9uIGhhbmRsZUltZ0xvYWQoZSl7dGhpcy5sb2FkaW5nPWZhbHNlO30saGFuZGxlSW1nRXJyb3I6ZnVuY3Rpb24gaGFuZGxlSW1nRXJyb3IoZSl7dGhpcy5sb2FkaW5nPWZhbHNlO2UudGFyZ2V0LmFsdD0n5Yqg6L295aSx6LSlJzt9LGhhbmRsZU1vdXNlRG93bjpmdW5jdGlvbiBoYW5kbGVNb3VzZURvd24oZSl7dmFyIF90aGlzMz10aGlzO2lmKHRoaXMubG9hZGluZ3x8ZS5idXR0b24hPT0wKXJldHVybjt2YXIgX3RyYW5zZm9ybTI9dGhpcy50cmFuc2Zvcm0sb2Zmc2V0WD1fdHJhbnNmb3JtMi5vZmZzZXRYLG9mZnNldFk9X3RyYW5zZm9ybTIub2Zmc2V0WTt2YXIgc3RhcnRYPWUucGFnZVg7dmFyIHN0YXJ0WT1lLnBhZ2VZO3RoaXMuX2RyYWdIYW5kbGVyPU9iamVjdCh1dGlsX1sicmFmVGhyb3R0bGUiXSkoZnVuY3Rpb24oZXYpe190aGlzMy50cmFuc2Zvcm0ub2Zmc2V0WD1vZmZzZXRYK2V2LnBhZ2VYLXN0YXJ0WDtfdGhpczMudHJhbnNmb3JtLm9mZnNldFk9b2Zmc2V0WStldi5wYWdlWS1zdGFydFk7fSk7T2JqZWN0KGRvbV9bIm9uIl0pKGRvY3VtZW50LCdtb3VzZW1vdmUnLHRoaXMuX2RyYWdIYW5kbGVyKTtPYmplY3QoZG9tX1sib24iXSkoZG9jdW1lbnQsJ21vdXNldXAnLGZ1bmN0aW9uKGV2KXtPYmplY3QoZG9tX1sib2ZmIl0pKGRvY3VtZW50LCdtb3VzZW1vdmUnLF90aGlzMy5fZHJhZ0hhbmRsZXIpO30pO2UucHJldmVudERlZmF1bHQoKTt9LHJlc2V0OmZ1bmN0aW9uIHJlc2V0KCl7dGhpcy50cmFuc2Zvcm09e3NjYWxlOjEsZGVnOjAsb2Zmc2V0WDowLG9mZnNldFk6MCxlbmFibGVUcmFuc2l0aW9uOmZhbHNlfTt9LHRvZ2dsZU1vZGU6ZnVuY3Rpb24gdG9nZ2xlTW9kZSgpe2lmKHRoaXMubG9hZGluZylyZXR1cm47dmFyIG1vZGVOYW1lcz1PYmplY3Qua2V5cyhNb2RlKTt2YXIgbW9kZVZhbHVlcz1PYmplY3QudmFsdWVzKE1vZGUpO3ZhciBpbmRleD1tb2RlVmFsdWVzLmluZGV4T2YodGhpcy5tb2RlKTt2YXIgbmV4dEluZGV4PShpbmRleCsxKSVtb2RlTmFtZXMubGVuZ3RoO3RoaXMubW9kZT1Nb2RlW21vZGVOYW1lc1tuZXh0SW5kZXhdXTt0aGlzLnJlc2V0KCk7fSxwcmV2OmZ1bmN0aW9uIHByZXYoKXtpZih0aGlzLmlzRmlyc3QmJiF0aGlzLmluZmluaXRlKXJldHVybjt2YXIgbGVuPXRoaXMudXJsTGlzdC5sZW5ndGg7dGhpcy5pbmRleD0odGhpcy5pbmRleC0xK2xlbiklbGVuO30sbmV4dDpmdW5jdGlvbiBuZXh0KCl7aWYodGhpcy5pc0xhc3QmJiF0aGlzLmluZmluaXRlKXJldHVybjt2YXIgbGVuPXRoaXMudXJsTGlzdC5sZW5ndGg7dGhpcy5pbmRleD0odGhpcy5pbmRleCsxKSVsZW47fSxoYW5kbGVBY3Rpb25zOmZ1bmN0aW9uIGhhbmRsZUFjdGlvbnMoYWN0aW9uKXt2YXIgb3B0aW9ucz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMV06e307aWYodGhpcy5sb2FkaW5nKXJldHVybjt2YXIgX3pvb21SYXRlJHJvdGF0ZURlZyRlPWltYWdlX3ZpZXdlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2V4dGVuZHMoe3pvb21SYXRlOjAuMixyb3RhdGVEZWc6OTAsZW5hYmxlVHJhbnNpdGlvbjp0cnVlfSxvcHRpb25zKSx6b29tUmF0ZT1fem9vbVJhdGUkcm90YXRlRGVnJGUuem9vbVJhdGUscm90YXRlRGVnPV96b29tUmF0ZSRyb3RhdGVEZWckZS5yb3RhdGVEZWcsZW5hYmxlVHJhbnNpdGlvbj1fem9vbVJhdGUkcm90YXRlRGVnJGUuZW5hYmxlVHJhbnNpdGlvbjt2YXIgdHJhbnNmb3JtPXRoaXMudHJhbnNmb3JtO3N3aXRjaChhY3Rpb24pe2Nhc2Unem9vbU91dCc6aWYodHJhbnNmb3JtLnNjYWxlPjAuMil7dHJhbnNmb3JtLnNjYWxlPXBhcnNlRmxvYXQoKHRyYW5zZm9ybS5zY2FsZS16b29tUmF0ZSkudG9GaXhlZCgzKSk7fWJyZWFrO2Nhc2Unem9vbUluJzp0cmFuc2Zvcm0uc2NhbGU9cGFyc2VGbG9hdCgodHJhbnNmb3JtLnNjYWxlK3pvb21SYXRlKS50b0ZpeGVkKDMpKTticmVhaztjYXNlJ2Nsb2NlbGlzZSc6dHJhbnNmb3JtLmRlZys9cm90YXRlRGVnO2JyZWFrO2Nhc2UnYW50aWNsb2NlbGlzZSc6dHJhbnNmb3JtLmRlZy09cm90YXRlRGVnO2JyZWFrO310cmFuc2Zvcm0uZW5hYmxlVHJhbnNpdGlvbj1lbmFibGVUcmFuc2l0aW9uO319LG1vdW50ZWQ6ZnVuY3Rpb24gbW91bnRlZCgpe3RoaXMuZGV2aWNlU3VwcG9ydEluc3RhbGwoKTsvLyBhZGQgdGFiaW5kZXggdGhlbiB3cmFwcGVyIGNhbiBiZSBmb2N1c2FibGUgdmlhIEphdmFzY3JpcHQKLy8gZm9jdXMgd3JhcHBlciBzbyBhcnJvdyBrZXkgY2FuJ3QgY2F1c2UgaW5uZXIgc2Nyb2xsIGJlaGF2aW9yIHVuZGVybmVhdGgKdGhpcy4kcmVmc1snZWwtaW1hZ2Utdmlld2VyX193cmFwcGVyJ10uZm9jdXMoKTt9fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2ltYWdlL3NyYy9pbWFnZS12aWV3ZXIudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHNyY19pbWFnZV92aWV3ZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189aW1hZ2Vfdmlld2VydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvaW1hZ2Uvc3JjL2ltYWdlLXZpZXdlci52dWUKLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciBpbWFnZV92aWV3ZXJfY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChzcmNfaW1hZ2Vfdmlld2VydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLGltYWdlX3ZpZXdlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzVlNzNiMzA3X3JlbmRlcixpbWFnZV92aWV3ZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF81ZTczYjMwN19zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIGltYWdlX3ZpZXdlcl9hcGk7fWltYWdlX3ZpZXdlcl9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL2ltYWdlL3NyYy9pbWFnZS12aWV3ZXIudnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGltYWdlX3ZpZXdlcj1pbWFnZV92aWV3ZXJfY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvaW1hZ2Uvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwp2YXIgaXNTdXBwb3J0T2JqZWN0Rml0PWZ1bmN0aW9uIGlzU3VwcG9ydE9iamVjdEZpdCgpe3JldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUub2JqZWN0Rml0IT09dW5kZWZpbmVkO307dmFyIE9iamVjdEZpdD17Tk9ORTonbm9uZScsQ09OVEFJTjonY29udGFpbicsQ09WRVI6J2NvdmVyJyxGSUxMOidmaWxsJyxTQ0FMRV9ET1dOOidzY2FsZS1kb3duJ307dmFyIHByZXZPdmVyZmxvdz0nJzsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGltYWdlX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbEltYWdlJyxtaXhpbnM6W2xvY2FsZV9kZWZhdWx0LmFdLGluaGVyaXRBdHRyczpmYWxzZSxjb21wb25lbnRzOntJbWFnZVZpZXdlcjppbWFnZV92aWV3ZXJ9LHByb3BzOntzcmM6U3RyaW5nLGZpdDpTdHJpbmcsbGF6eTpCb29sZWFuLHNjcm9sbENvbnRhaW5lcjp7fSxwcmV2aWV3U3JjTGlzdDp7dHlwZTpBcnJheSxkZWZhdWx0OmZ1bmN0aW9uIF9kZWZhdWx0KCl7cmV0dXJuW107fX0sekluZGV4Ont0eXBlOk51bWJlcixkZWZhdWx0OjIwMDB9fSxkYXRhOmZ1bmN0aW9uIGRhdGEoKXtyZXR1cm57bG9hZGluZzp0cnVlLGVycm9yOmZhbHNlLHNob3c6IXRoaXMubGF6eSxpbWFnZVdpZHRoOjAsaW1hZ2VIZWlnaHQ6MCxzaG93Vmlld2VyOmZhbHNlfTt9LGNvbXB1dGVkOntpbWFnZVN0eWxlOmZ1bmN0aW9uIGltYWdlU3R5bGUoKXt2YXIgZml0PXRoaXMuZml0O2lmKCF0aGlzLiRpc1NlcnZlciYmZml0KXtyZXR1cm4gaXNTdXBwb3J0T2JqZWN0Rml0KCk/eydvYmplY3QtZml0JzpmaXR9OnRoaXMuZ2V0SW1hZ2VTdHlsZShmaXQpO31yZXR1cm57fTt9LGFsaWduQ2VudGVyOmZ1bmN0aW9uIGFsaWduQ2VudGVyKCl7cmV0dXJuIXRoaXMuJGlzU2VydmVyJiYhaXNTdXBwb3J0T2JqZWN0Rml0KCkmJnRoaXMuZml0IT09T2JqZWN0Rml0LkZJTEw7fSxwcmV2aWV3OmZ1bmN0aW9uIHByZXZpZXcoKXt2YXIgcHJldmlld1NyY0xpc3Q9dGhpcy5wcmV2aWV3U3JjTGlzdDtyZXR1cm4gQXJyYXkuaXNBcnJheShwcmV2aWV3U3JjTGlzdCkmJnByZXZpZXdTcmNMaXN0Lmxlbmd0aD4wO30saW1hZ2VJbmRleDpmdW5jdGlvbiBpbWFnZUluZGV4KCl7dmFyIHByZXZpZXdJbmRleD0wO3ZhciBzcmNJbmRleD10aGlzLnByZXZpZXdTcmNMaXN0LmluZGV4T2YodGhpcy5zcmMpO2lmKHNyY0luZGV4Pj0wKXtwcmV2aWV3SW5kZXg9c3JjSW5kZXg7fXJldHVybiBwcmV2aWV3SW5kZXg7fX0sd2F0Y2g6e3NyYzpmdW5jdGlvbiBzcmModmFsKXt0aGlzLnNob3cmJnRoaXMubG9hZEltYWdlKCk7fSxzaG93OmZ1bmN0aW9uIHNob3codmFsKXt2YWwmJnRoaXMubG9hZEltYWdlKCk7fX0sbW91bnRlZDpmdW5jdGlvbiBtb3VudGVkKCl7aWYodGhpcy5sYXp5KXt0aGlzLmFkZExhenlMb2FkTGlzdGVuZXIoKTt9ZWxzZXt0aGlzLmxvYWRJbWFnZSgpO319LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpe3RoaXMubGF6eSYmdGhpcy5yZW1vdmVMYXp5TG9hZExpc3RlbmVyKCk7fSxtZXRob2RzOntsb2FkSW1hZ2U6ZnVuY3Rpb24gbG9hZEltYWdlKCl7dmFyIF90aGlzPXRoaXM7aWYodGhpcy4kaXNTZXJ2ZXIpcmV0dXJuOy8vIHJlc2V0IHN0YXR1cwp0aGlzLmxvYWRpbmc9dHJ1ZTt0aGlzLmVycm9yPWZhbHNlO3ZhciBpbWc9bmV3IEltYWdlKCk7aW1nLm9ubG9hZD1mdW5jdGlvbihlKXtyZXR1cm4gX3RoaXMuaGFuZGxlTG9hZChlLGltZyk7fTtpbWcub25lcnJvcj10aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcyk7Ly8gYmluZCBodG1sIGF0dHJzCi8vIHNvIGl0IGNhbiBiZWhhdmUgY29uc2lzdGVudGx5Ck9iamVjdC5rZXlzKHRoaXMuJGF0dHJzKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSl7dmFyIHZhbHVlPV90aGlzLiRhdHRyc1trZXldO2ltZy5zZXRBdHRyaWJ1dGUoa2V5LHZhbHVlKTt9KTtpbWcuc3JjPXRoaXMuc3JjO30saGFuZGxlTG9hZDpmdW5jdGlvbiBoYW5kbGVMb2FkKGUsaW1nKXt0aGlzLmltYWdlV2lkdGg9aW1nLndpZHRoO3RoaXMuaW1hZ2VIZWlnaHQ9aW1nLmhlaWdodDt0aGlzLmxvYWRpbmc9ZmFsc2U7dGhpcy5lcnJvcj1mYWxzZTt9LGhhbmRsZUVycm9yOmZ1bmN0aW9uIGhhbmRsZUVycm9yKGUpe3RoaXMubG9hZGluZz1mYWxzZTt0aGlzLmVycm9yPXRydWU7dGhpcy4kZW1pdCgnZXJyb3InLGUpO30saGFuZGxlTGF6eUxvYWQ6ZnVuY3Rpb24gaGFuZGxlTGF6eUxvYWQoKXtpZihPYmplY3QoZG9tX1siaXNJbkNvbnRhaW5lciJdKSh0aGlzLiRlbCx0aGlzLl9zY3JvbGxDb250YWluZXIpKXt0aGlzLnNob3c9dHJ1ZTt0aGlzLnJlbW92ZUxhenlMb2FkTGlzdGVuZXIoKTt9fSxhZGRMYXp5TG9hZExpc3RlbmVyOmZ1bmN0aW9uIGFkZExhenlMb2FkTGlzdGVuZXIoKXtpZih0aGlzLiRpc1NlcnZlcilyZXR1cm47dmFyIHNjcm9sbENvbnRhaW5lcj10aGlzLnNjcm9sbENvbnRhaW5lcjt2YXIgX3Njcm9sbENvbnRhaW5lcj1udWxsO2lmKE9iamVjdCh0eXBlc19bImlzSHRtbEVsZW1lbnQiXSkoc2Nyb2xsQ29udGFpbmVyKSl7X3Njcm9sbENvbnRhaW5lcj1zY3JvbGxDb250YWluZXI7fWVsc2UgaWYoT2JqZWN0KHR5cGVzX1siaXNTdHJpbmciXSkoc2Nyb2xsQ29udGFpbmVyKSl7X3Njcm9sbENvbnRhaW5lcj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNjcm9sbENvbnRhaW5lcik7fWVsc2V7X3Njcm9sbENvbnRhaW5lcj1PYmplY3QoZG9tX1siZ2V0U2Nyb2xsQ29udGFpbmVyIl0pKHRoaXMuJGVsKTt9aWYoX3Njcm9sbENvbnRhaW5lcil7dGhpcy5fc2Nyb2xsQ29udGFpbmVyPV9zY3JvbGxDb250YWluZXI7dGhpcy5fbGF6eUxvYWRIYW5kbGVyPXRocm90dGxlX2RlZmF1bHQoKSgyMDAsdGhpcy5oYW5kbGVMYXp5TG9hZCk7T2JqZWN0KGRvbV9bIm9uIl0pKF9zY3JvbGxDb250YWluZXIsJ3Njcm9sbCcsdGhpcy5fbGF6eUxvYWRIYW5kbGVyKTt0aGlzLmhhbmRsZUxhenlMb2FkKCk7fX0scmVtb3ZlTGF6eUxvYWRMaXN0ZW5lcjpmdW5jdGlvbiByZW1vdmVMYXp5TG9hZExpc3RlbmVyKCl7dmFyIF9zY3JvbGxDb250YWluZXI9dGhpcy5fc2Nyb2xsQ29udGFpbmVyLF9sYXp5TG9hZEhhbmRsZXI9dGhpcy5fbGF6eUxvYWRIYW5kbGVyO2lmKHRoaXMuJGlzU2VydmVyfHwhX3Njcm9sbENvbnRhaW5lcnx8IV9sYXp5TG9hZEhhbmRsZXIpcmV0dXJuO09iamVjdChkb21fWyJvZmYiXSkoX3Njcm9sbENvbnRhaW5lciwnc2Nyb2xsJyxfbGF6eUxvYWRIYW5kbGVyKTt0aGlzLl9zY3JvbGxDb250YWluZXI9bnVsbDt0aGlzLl9sYXp5TG9hZEhhbmRsZXI9bnVsbDt9LC8qKgogICAgICogc2ltdWxhdGUgb2JqZWN0LWZpdCBiZWhhdmlvciB0byBjb21wYXRpYmxlIHdpdGggSUUxMSBhbmQgb3RoZXIgYnJvd3NlcnMgd2hpY2ggbm90IHN1cHBvcnQgb2JqZWN0LWZpdAogICAgICovZ2V0SW1hZ2VTdHlsZTpmdW5jdGlvbiBnZXRJbWFnZVN0eWxlKGZpdCl7dmFyIGltYWdlV2lkdGg9dGhpcy5pbWFnZVdpZHRoLGltYWdlSGVpZ2h0PXRoaXMuaW1hZ2VIZWlnaHQ7dmFyIF8kZWw9dGhpcy4kZWwsY29udGFpbmVyV2lkdGg9XyRlbC5jbGllbnRXaWR0aCxjb250YWluZXJIZWlnaHQ9XyRlbC5jbGllbnRIZWlnaHQ7aWYoIWltYWdlV2lkdGh8fCFpbWFnZUhlaWdodHx8IWNvbnRhaW5lcldpZHRofHwhY29udGFpbmVySGVpZ2h0KXJldHVybnt9O3ZhciB2ZXJ0aWNhbD1pbWFnZVdpZHRoL2ltYWdlSGVpZ2h0PDE7aWYoZml0PT09T2JqZWN0Rml0LlNDQUxFX0RPV04pe3ZhciBpc1NtYWxsZXI9aW1hZ2VXaWR0aDxjb250YWluZXJXaWR0aCYmaW1hZ2VIZWlnaHQ8Y29udGFpbmVySGVpZ2h0O2ZpdD1pc1NtYWxsZXI/T2JqZWN0Rml0Lk5PTkU6T2JqZWN0Rml0LkNPTlRBSU47fXN3aXRjaChmaXQpe2Nhc2UgT2JqZWN0Rml0Lk5PTkU6cmV0dXJue3dpZHRoOidhdXRvJyxoZWlnaHQ6J2F1dG8nfTtjYXNlIE9iamVjdEZpdC5DT05UQUlOOnJldHVybiB2ZXJ0aWNhbD97d2lkdGg6J2F1dG8nfTp7aGVpZ2h0OidhdXRvJ307Y2FzZSBPYmplY3RGaXQuQ09WRVI6cmV0dXJuIHZlcnRpY2FsP3toZWlnaHQ6J2F1dG8nfTp7d2lkdGg6J2F1dG8nfTtkZWZhdWx0OnJldHVybnt9O319LGNsaWNrSGFuZGxlcjpmdW5jdGlvbiBjbGlja0hhbmRsZXIoKXsvLyBkb24ndCBzaG93IHZpZXdlciB3aGVuIHByZXZpZXcgaXMgZmFsc2UKaWYoIXRoaXMucHJldmlldyl7cmV0dXJuO30vLyBwcmV2ZW50IGJvZHkgc2Nyb2xsCnByZXZPdmVyZmxvdz1kb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93O2RvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3c9J2hpZGRlbic7dGhpcy5zaG93Vmlld2VyPXRydWU7fSxjbG9zZVZpZXdlcjpmdW5jdGlvbiBjbG9zZVZpZXdlcigpe2RvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3c9cHJldk92ZXJmbG93O3RoaXMuc2hvd1ZpZXdlcj1mYWxzZTt9fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9pbWFnZS9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFja2FnZXNfaW1hZ2Vfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189aW1hZ2Vfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9pbWFnZS9zcmMvbWFpbi52dWUKLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciBpbWFnZV9zcmNfbWFpbl9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHBhY2thZ2VzX2ltYWdlX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF80NGQ4NGE3Y19yZW5kZXIsbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQ0ZDg0YTdjX3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgaW1hZ2Vfc3JjX21haW5fYXBpO31pbWFnZV9zcmNfbWFpbl9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL2ltYWdlL3NyYy9tYWluLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBpbWFnZV9zcmNfbWFpbj1pbWFnZV9zcmNfbWFpbl9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2ltYWdlL2luZGV4LmpzCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovaW1hZ2Vfc3JjX21haW4uaW5zdGFsbD1mdW5jdGlvbihWdWUpe1Z1ZS5jb21wb25lbnQoaW1hZ2Vfc3JjX21haW4ubmFtZSxpbWFnZV9zcmNfbWFpbik7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX2ltYWdlPWltYWdlX3NyY19tYWluOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY2FsZW5kYXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTZkOTc1NmJlJgp2YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzZkOTc1NmJlX3JlbmRlcj1mdW5jdGlvbiBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNmQ5NzU2YmVfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtY2FsZW5kYXIifSxbX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1jYWxlbmRhcl9faGVhZGVyIn0sW19jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtY2FsZW5kYXJfX3RpdGxlIn0sW192bS5fdigiXG4gICAgICAiK192bS5fcyhfdm0uaTE4bkRhdGUpKyJcbiAgICAiKV0pLF92bS52YWxpZGF0ZWRSYW5nZS5sZW5ndGg9PT0wP19jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtY2FsZW5kYXJfX2J1dHRvbi1ncm91cCJ9LFtfYygiZWwtYnV0dG9uLWdyb3VwIixbX2MoImVsLWJ1dHRvbiIse2F0dHJzOnt0eXBlOiJwbGFpbiIsc2l6ZToibWluaSJ9LG9uOntjbGljazpmdW5jdGlvbiBjbGljaygkZXZlbnQpe192bS5zZWxlY3REYXRlKCJwcmV2LW1vbnRoIik7fX19LFtfdm0uX3YoIlxuICAgICAgICAgICIrX3ZtLl9zKF92bS50KCJlbC5kYXRlcGlja2VyLnByZXZNb250aCIpKSsiXG4gICAgICAgICIpXSksX2MoImVsLWJ1dHRvbiIse2F0dHJzOnt0eXBlOiJwbGFpbiIsc2l6ZToibWluaSJ9LG9uOntjbGljazpmdW5jdGlvbiBjbGljaygkZXZlbnQpe192bS5zZWxlY3REYXRlKCJ0b2RheSIpO319fSxbX3ZtLl92KCJcbiAgICAgICAgICAiK192bS5fcyhfdm0udCgiZWwuZGF0ZXBpY2tlci50b2RheSIpKSsiXG4gICAgICAgICIpXSksX2MoImVsLWJ1dHRvbiIse2F0dHJzOnt0eXBlOiJwbGFpbiIsc2l6ZToibWluaSJ9LG9uOntjbGljazpmdW5jdGlvbiBjbGljaygkZXZlbnQpe192bS5zZWxlY3REYXRlKCJuZXh0LW1vbnRoIik7fX19LFtfdm0uX3YoIlxuICAgICAgICAgICIrX3ZtLl9zKF92bS50KCJlbC5kYXRlcGlja2VyLm5leHRNb250aCIpKSsiXG4gICAgICAgICIpXSldLDEpXSwxKTpfdm0uX2UoKV0pLF92bS52YWxpZGF0ZWRSYW5nZS5sZW5ndGg9PT0wP19jKCJkaXYiLHtrZXk6Im5vLXJhbmdlIixzdGF0aWNDbGFzczoiZWwtY2FsZW5kYXJfX2JvZHkifSxbX2MoImRhdGUtdGFibGUiLHthdHRyczp7ZGF0ZTpfdm0uZGF0ZSwic2VsZWN0ZWQtZGF5Ijpfdm0ucmVhbFNlbGVjdGVkRGF5LCJmaXJzdC1kYXktb2Ytd2VlayI6X3ZtLnJlYWxGaXJzdERheU9mV2Vla30sb246e3BpY2s6X3ZtLnBpY2tEYXl9fSldLDEpOl9jKCJkaXYiLHtrZXk6Imhhcy1yYW5nZSIsc3RhdGljQ2xhc3M6ImVsLWNhbGVuZGFyX19ib2R5In0sX3ZtLl9sKF92bS52YWxpZGF0ZWRSYW5nZSxmdW5jdGlvbihyYW5nZSxpbmRleCl7cmV0dXJuIF9jKCJkYXRlLXRhYmxlIix7a2V5OmluZGV4LGF0dHJzOntkYXRlOnJhbmdlWzBdLCJzZWxlY3RlZC1kYXkiOl92bS5yZWFsU2VsZWN0ZWREYXkscmFuZ2U6cmFuZ2UsImhpZGUtaGVhZGVyIjppbmRleCE9PTAsImZpcnN0LWRheS1vZi13ZWVrIjpfdm0ucmVhbEZpcnN0RGF5T2ZXZWVrfSxvbjp7cGljazpfdm0ucGlja0RheX19KTt9KSwxKV0pO307dmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF82ZDk3NTZiZV9zdGF0aWNSZW5kZXJGbnM9W107bWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzZkOTc1NmJlX3JlbmRlci5fd2l0aFN0cmlwcGVkPXRydWU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYWxlbmRhci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NmQ5NzU2YmUmCi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgImVsZW1lbnQtdWkvbGliL3V0aWxzL2RhdGUiCnZhciBkYXRlXz1fX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTt2YXIgZGF0ZV9kZWZhdWx0PS8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oZGF0ZV8pOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2NhbGVuZGFyL3NyYy9kYXRlLXRhYmxlLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfZGF0ZV90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17cHJvcHM6e3NlbGVjdGVkRGF5OlN0cmluZywvLyBmb3JtYXRlZCBkYXRlIHl5eXktTU0tZGQKcmFuZ2U6e3R5cGU6QXJyYXksdmFsaWRhdG9yOmZ1bmN0aW9uIHZhbGlkYXRvcih2YWwpe2lmKCEodmFsJiZ2YWwubGVuZ3RoKSlyZXR1cm4gdHJ1ZTt2YXIgc3RhcnQ9dmFsWzBdLGVuZD12YWxbMV07cmV0dXJuIE9iamVjdChkYXRlX3V0aWxfWyJ2YWxpZGF0ZVJhbmdlSW5PbmVNb250aCJdKShzdGFydCxlbmQpO319LGRhdGU6RGF0ZSxoaWRlSGVhZGVyOkJvb2xlYW4sZmlyc3REYXlPZldlZWs6TnVtYmVyfSxpbmplY3Q6WydlbENhbGVuZGFyJ10sZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue1dFRUtfREFZUzpPYmplY3QoZGF0ZV91dGlsX1siZ2V0STE4blNldHRpbmdzIl0pKCkuZGF5TmFtZXN9O30sbWV0aG9kczp7dG9OZXN0ZWRBcnI6ZnVuY3Rpb24gdG9OZXN0ZWRBcnIoZGF5cyl7cmV0dXJuIE9iamVjdChkYXRlX3V0aWxfWyJyYW5nZSJdKShkYXlzLmxlbmd0aC83KS5tYXAoZnVuY3Rpb24oXyxpbmRleCl7dmFyIHN0YXJ0PWluZGV4Kjc7cmV0dXJuIGRheXMuc2xpY2Uoc3RhcnQsc3RhcnQrNyk7fSk7fSxnZXRGb3JtYXRlRGF0ZTpmdW5jdGlvbiBnZXRGb3JtYXRlRGF0ZShkYXksdHlwZSl7aWYoIWRheXx8WydwcmV2JywnY3VycmVudCcsJ25leHQnXS5pbmRleE9mKHR5cGUpPT09LTEpe3Rocm93IG5ldyBFcnJvcignaW52YWxpZCBkYXkgb3IgdHlwZScpO312YXIgcHJlZml4PXRoaXMuY3VyTW9udGhEYXRlUHJlZml4O2lmKHR5cGU9PT0ncHJldicpe3ByZWZpeD10aGlzLnByZXZNb250aERhdGVQcmVmaXg7fWVsc2UgaWYodHlwZT09PSduZXh0Jyl7cHJlZml4PXRoaXMubmV4dE1vbnRoRGF0ZVByZWZpeDt9ZGF5PSgnMDAnK2RheSkuc2xpY2UoLTIpO3JldHVybiBwcmVmaXgrJy0nK2RheTt9LGdldENlbGxDbGFzczpmdW5jdGlvbiBnZXRDZWxsQ2xhc3MoX3JlZil7dmFyIHRleHQ9X3JlZi50ZXh0LHR5cGU9X3JlZi50eXBlO3ZhciBjbGFzc2VzPVt0eXBlXTtpZih0eXBlPT09J2N1cnJlbnQnKXt2YXIgZGF0ZT10aGlzLmdldEZvcm1hdGVEYXRlKHRleHQsdHlwZSk7aWYoZGF0ZT09PXRoaXMuc2VsZWN0ZWREYXkpe2NsYXNzZXMucHVzaCgnaXMtc2VsZWN0ZWQnKTt9aWYoZGF0ZT09PXRoaXMuZm9ybWF0ZWRUb2RheSl7Y2xhc3Nlcy5wdXNoKCdpcy10b2RheScpO319cmV0dXJuIGNsYXNzZXM7fSxwaWNrRGF5OmZ1bmN0aW9uIHBpY2tEYXkoX3JlZjIpe3ZhciB0ZXh0PV9yZWYyLnRleHQsdHlwZT1fcmVmMi50eXBlO3ZhciBkYXRlPXRoaXMuZ2V0Rm9ybWF0ZURhdGUodGV4dCx0eXBlKTt0aGlzLiRlbWl0KCdwaWNrJyxkYXRlKTt9LGNlbGxSZW5kZXJQcm94eTpmdW5jdGlvbiBjZWxsUmVuZGVyUHJveHkoX3JlZjMpe3ZhciB0ZXh0PV9yZWYzLnRleHQsdHlwZT1fcmVmMy50eXBlO3ZhciBoPXRoaXMuJGNyZWF0ZUVsZW1lbnQ7dmFyIHJlbmRlcj10aGlzLmVsQ2FsZW5kYXIuJHNjb3BlZFNsb3RzLmRhdGVDZWxsO2lmKCFyZW5kZXIpcmV0dXJuIGgoJ3NwYW4nLFt0ZXh0XSk7dmFyIGRheT10aGlzLmdldEZvcm1hdGVEYXRlKHRleHQsdHlwZSk7dmFyIGRhdGU9bmV3IERhdGUoZGF5KTt2YXIgZGF0YT17aXNTZWxlY3RlZDp0aGlzLnNlbGVjdGVkRGF5PT09ZGF5LHR5cGU6dHlwZSsnLW1vbnRoJyxkYXk6ZGF5fTtyZXR1cm4gcmVuZGVyKHtkYXRlOmRhdGUsZGF0YTpkYXRhfSk7fX0sY29tcHV0ZWQ6e3ByZXZNb250aERhdGVQcmVmaXg6ZnVuY3Rpb24gcHJldk1vbnRoRGF0ZVByZWZpeCgpe3ZhciB0ZW1wPW5ldyBEYXRlKHRoaXMuZGF0ZS5nZXRUaW1lKCkpO3RlbXAuc2V0RGF0ZSgwKTtyZXR1cm4gZGF0ZV9kZWZhdWx0LmEuZm9ybWF0KHRlbXAsJ3l5eXktTU0nKTt9LGN1ck1vbnRoRGF0ZVByZWZpeDpmdW5jdGlvbiBjdXJNb250aERhdGVQcmVmaXgoKXtyZXR1cm4gZGF0ZV9kZWZhdWx0LmEuZm9ybWF0KHRoaXMuZGF0ZSwneXl5eS1NTScpO30sbmV4dE1vbnRoRGF0ZVByZWZpeDpmdW5jdGlvbiBuZXh0TW9udGhEYXRlUHJlZml4KCl7dmFyIHRlbXA9bmV3IERhdGUodGhpcy5kYXRlLmdldEZ1bGxZZWFyKCksdGhpcy5kYXRlLmdldE1vbnRoKCkrMSwxKTtyZXR1cm4gZGF0ZV9kZWZhdWx0LmEuZm9ybWF0KHRlbXAsJ3l5eXktTU0nKTt9LGZvcm1hdGVkVG9kYXk6ZnVuY3Rpb24gZm9ybWF0ZWRUb2RheSgpe3JldHVybiB0aGlzLmVsQ2FsZW5kYXIuZm9ybWF0ZWRUb2RheTt9LGlzSW5SYW5nZTpmdW5jdGlvbiBpc0luUmFuZ2UoKXtyZXR1cm4gdGhpcy5yYW5nZSYmdGhpcy5yYW5nZS5sZW5ndGg7fSxyb3dzOmZ1bmN0aW9uIHJvd3MoKXt2YXIgZGF5cz1bXTsvLyBpZiByYW5nZSBleGlzdHMsIHNob3VsZCByZW5kZXIgZGF5cyBpbiByYW5nZS4KaWYodGhpcy5pc0luUmFuZ2Upe3ZhciBfcmFuZ2U9dGhpcy5yYW5nZSxzdGFydD1fcmFuZ2VbMF0sZW5kPV9yYW5nZVsxXTt2YXIgY3VycmVudE1vbnRoUmFuZ2U9T2JqZWN0KGRhdGVfdXRpbF9bInJhbmdlIl0pKGVuZC5nZXREYXRlKCktc3RhcnQuZ2V0RGF0ZSgpKzEpLm1hcChmdW5jdGlvbihfLGluZGV4KXtyZXR1cm57dGV4dDpzdGFydC5nZXREYXRlKCkraW5kZXgsdHlwZTonY3VycmVudCd9O30pO3ZhciByZW1haW5pbmc9Y3VycmVudE1vbnRoUmFuZ2UubGVuZ3RoJTc7cmVtYWluaW5nPXJlbWFpbmluZz09PTA/MDo3LXJlbWFpbmluZzt2YXIgbmV4dE1vbnRoUmFuZ2U9T2JqZWN0KGRhdGVfdXRpbF9bInJhbmdlIl0pKHJlbWFpbmluZykubWFwKGZ1bmN0aW9uKF8saW5kZXgpe3JldHVybnt0ZXh0OmluZGV4KzEsdHlwZTonbmV4dCd9O30pO2RheXM9Y3VycmVudE1vbnRoUmFuZ2UuY29uY2F0KG5leHRNb250aFJhbmdlKTt9ZWxzZXt2YXIgZGF0ZT10aGlzLmRhdGU7dmFyIGZpcnN0RGF5PU9iamVjdChkYXRlX3V0aWxfWyJnZXRGaXJzdERheU9mTW9udGgiXSkoZGF0ZSk7Zmlyc3REYXk9Zmlyc3REYXk9PT0wPzc6Zmlyc3REYXk7dmFyIGZpcnN0RGF5T2ZXZWVrPXR5cGVvZiB0aGlzLmZpcnN0RGF5T2ZXZWVrPT09J251bWJlcic/dGhpcy5maXJzdERheU9mV2VlazoxO3ZhciBwcmV2TW9udGhEYXlzPU9iamVjdChkYXRlX3V0aWxfWyJnZXRQcmV2TW9udGhMYXN0RGF5cyJdKShkYXRlLGZpcnN0RGF5LWZpcnN0RGF5T2ZXZWVrKS5tYXAoZnVuY3Rpb24oZGF5KXtyZXR1cm57dGV4dDpkYXksdHlwZToncHJldid9O30pO3ZhciBjdXJyZW50TW9udGhEYXlzPU9iamVjdChkYXRlX3V0aWxfWyJnZXRNb250aERheXMiXSkoZGF0ZSkubWFwKGZ1bmN0aW9uKGRheSl7cmV0dXJue3RleHQ6ZGF5LHR5cGU6J2N1cnJlbnQnfTt9KTtkYXlzPVtdLmNvbmNhdChwcmV2TW9udGhEYXlzLGN1cnJlbnRNb250aERheXMpO3ZhciBuZXh0TW9udGhEYXlzPU9iamVjdChkYXRlX3V0aWxfWyJyYW5nZSJdKSg0Mi1kYXlzLmxlbmd0aCkubWFwKGZ1bmN0aW9uKF8saW5kZXgpe3JldHVybnt0ZXh0OmluZGV4KzEsdHlwZTonbmV4dCd9O30pO2RheXM9ZGF5cy5jb25jYXQobmV4dE1vbnRoRGF5cyk7fXJldHVybiB0aGlzLnRvTmVzdGVkQXJyKGRheXMpO30sd2Vla0RheXM6ZnVuY3Rpb24gd2Vla0RheXMoKXt2YXIgc3RhcnQ9dGhpcy5maXJzdERheU9mV2Vlazt2YXIgV0VFS19EQVlTPXRoaXMuV0VFS19EQVlTO2lmKHR5cGVvZiBzdGFydCE9PSdudW1iZXInfHxzdGFydD09PTApe3JldHVybiBXRUVLX0RBWVMuc2xpY2UoKTt9ZWxzZXtyZXR1cm4gV0VFS19EQVlTLnNsaWNlKHN0YXJ0KS5jb25jYXQoV0VFS19EQVlTLnNsaWNlKDAsc3RhcnQpKTt9fX0scmVuZGVyOmZ1bmN0aW9uIHJlbmRlcigpe3ZhciBfdGhpcz10aGlzO3ZhciBoPWFyZ3VtZW50c1swXTt2YXIgdGhlYWQ9dGhpcy5oaWRlSGVhZGVyP251bGw6aCgndGhlYWQnLFt0aGlzLndlZWtEYXlzLm1hcChmdW5jdGlvbihkYXkpe3JldHVybiBoKCd0aCcse2tleTpkYXl9LFtkYXldKTt9KV0pO3JldHVybiBoKCd0YWJsZScseydjbGFzcyc6eydlbC1jYWxlbmRhci10YWJsZSc6dHJ1ZSwnaXMtcmFuZ2UnOnRoaXMuaXNJblJhbmdlfSxhdHRyczp7Y2VsbHNwYWNpbmc6JzAnLGNlbGxwYWRkaW5nOicwJ319LFt0aGVhZCxoKCd0Ym9keScsW3RoaXMucm93cy5tYXAoZnVuY3Rpb24ocm93LGluZGV4KXtyZXR1cm4gaCgndHInLHsnY2xhc3MnOnsnZWwtY2FsZW5kYXItdGFibGVfX3Jvdyc6dHJ1ZSwnZWwtY2FsZW5kYXItdGFibGVfX3Jvdy0taGlkZS1ib3JkZXInOmluZGV4PT09MCYmX3RoaXMuaGlkZUhlYWRlcn0sa2V5OmluZGV4fSxbcm93Lm1hcChmdW5jdGlvbihjZWxsLGtleSl7cmV0dXJuIGgoJ3RkJyx7a2V5OmtleSwnY2xhc3MnOl90aGlzLmdldENlbGxDbGFzcyhjZWxsKSxvbjp7J2NsaWNrJzpfdGhpcy5waWNrRGF5LmJpbmQoX3RoaXMsY2VsbCl9fSxbaCgnZGl2Jyx7J2NsYXNzJzonZWwtY2FsZW5kYXItZGF5J30sW190aGlzLmNlbGxSZW5kZXJQcm94eShjZWxsKV0pXSk7fSldKTt9KV0pXSk7fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYWxlbmRhci9zcmMvZGF0ZS10YWJsZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgY2FsZW5kYXJfc3JjX2RhdGVfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189c3JjX2RhdGVfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYWxlbmRhci9zcmMvZGF0ZS10YWJsZS52dWUKdmFyIGRhdGVfdGFibGVfcmVuZGVyLGRhdGVfdGFibGVfc3RhdGljUmVuZGVyRm5zOy8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgc3JjX2RhdGVfdGFibGVfY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChjYWxlbmRhcl9zcmNfZGF0ZV90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxkYXRlX3RhYmxlX3JlbmRlcixkYXRlX3RhYmxlX3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgc3JjX2RhdGVfdGFibGVfYXBpO31zcmNfZGF0ZV90YWJsZV9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL2NhbGVuZGFyL3NyYy9kYXRlLXRhYmxlLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfZGF0ZV90YWJsZT1zcmNfZGF0ZV90YWJsZV9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jYWxlbmRhci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCnZhciB2YWxpZFR5cGVzPVsncHJldi1tb250aCcsJ3RvZGF5JywnbmV4dC1tb250aCddO3ZhciB3ZWVrRGF5cz1bJ1N1bmRheScsJ01vbmRheScsJ1R1ZXNkYXknLCdXZWRuZXNkYXknLCdUaHVyc2RheScsJ0ZyaWRheScsJ1NhdHVyZGF5J107dmFyIG9uZURheT04NjQwMDAwMDsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGNhbGVuZGFyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbENhbGVuZGFyJyxtaXhpbnM6W2xvY2FsZV9kZWZhdWx0LmFdLGNvbXBvbmVudHM6e0RhdGVUYWJsZTpzcmNfZGF0ZV90YWJsZSxFbEJ1dHRvbjpidXR0b25fZGVmYXVsdC5hLEVsQnV0dG9uR3JvdXA6YnV0dG9uX2dyb3VwX2RlZmF1bHQuYX0scHJvcHM6e3ZhbHVlOltEYXRlLFN0cmluZyxOdW1iZXJdLHJhbmdlOnt0eXBlOkFycmF5LHZhbGlkYXRvcjpmdW5jdGlvbiB2YWxpZGF0b3IocmFuZ2Upe2lmKEFycmF5LmlzQXJyYXkocmFuZ2UpKXtyZXR1cm4gcmFuZ2UubGVuZ3RoPT09MiYmcmFuZ2UuZXZlcnkoZnVuY3Rpb24oaXRlbSl7cmV0dXJuIHR5cGVvZiBpdGVtPT09J3N0cmluZyd8fHR5cGVvZiBpdGVtPT09J251bWJlcid8fGl0ZW0gaW5zdGFuY2VvZiBEYXRlO30pO31lbHNle3JldHVybiB0cnVlO319fSxmaXJzdERheU9mV2Vlazp7dHlwZTpOdW1iZXIsZGVmYXVsdDoxfX0scHJvdmlkZTpmdW5jdGlvbiBwcm92aWRlKCl7cmV0dXJue2VsQ2FsZW5kYXI6dGhpc307fSxtZXRob2RzOntwaWNrRGF5OmZ1bmN0aW9uIHBpY2tEYXkoZGF5KXt0aGlzLnJlYWxTZWxlY3RlZERheT1kYXk7fSxzZWxlY3REYXRlOmZ1bmN0aW9uIHNlbGVjdERhdGUodHlwZSl7aWYodmFsaWRUeXBlcy5pbmRleE9mKHR5cGUpPT09LTEpe3Rocm93IG5ldyBFcnJvcignaW52YWxpZCB0eXBlICcrdHlwZSk7fXZhciBkYXk9Jyc7aWYodHlwZT09PSdwcmV2LW1vbnRoJyl7ZGF5PXRoaXMucHJldk1vbnRoRGF0ZVByZWZpeCsnLTAxJzt9ZWxzZSBpZih0eXBlPT09J25leHQtbW9udGgnKXtkYXk9dGhpcy5uZXh0TW9udGhEYXRlUHJlZml4KyctMDEnO31lbHNle2RheT10aGlzLmZvcm1hdGVkVG9kYXk7fWlmKGRheT09PXRoaXMuZm9ybWF0ZWREYXRlKXJldHVybjt0aGlzLnBpY2tEYXkoZGF5KTt9LHRvRGF0ZTpmdW5jdGlvbiB0b0RhdGUodmFsKXtpZighdmFsKXt0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdmFsJyk7fXJldHVybiB2YWwgaW5zdGFuY2VvZiBEYXRlP3ZhbDpuZXcgRGF0ZSh2YWwpO30scmFuZ2VWYWxpZGF0b3I6ZnVuY3Rpb24gcmFuZ2VWYWxpZGF0b3IoZGF0ZSxpc1N0YXJ0KXt2YXIgZmlyc3REYXlPZldlZWs9dGhpcy5yZWFsRmlyc3REYXlPZldlZWs7dmFyIGV4cGVjdGVkPWlzU3RhcnQ/Zmlyc3REYXlPZldlZWs6Zmlyc3REYXlPZldlZWs9PT0wPzY6Zmlyc3REYXlPZldlZWstMTt2YXIgbWVzc2FnZT0oaXNTdGFydD8nc3RhcnQnOidlbmQnKSsnIG9mIHJhbmdlIHNob3VsZCBiZSAnK3dlZWtEYXlzW2V4cGVjdGVkXSsnLic7aWYoZGF0ZS5nZXREYXkoKSE9PWV4cGVjdGVkKXtjb25zb2xlLndhcm4oJ1tFbGVtZW50Q2FsZW5kYXJdJyxtZXNzYWdlLCdJbnZhbGlkIHJhbmdlIHdpbGwgYmUgaWdub3JlZC4nKTtyZXR1cm4gZmFsc2U7fXJldHVybiB0cnVlO319LGNvbXB1dGVkOntwcmV2TW9udGhEYXRlUHJlZml4OmZ1bmN0aW9uIHByZXZNb250aERhdGVQcmVmaXgoKXt2YXIgdGVtcD1uZXcgRGF0ZSh0aGlzLmRhdGUuZ2V0VGltZSgpKTt0ZW1wLnNldERhdGUoMCk7cmV0dXJuIGRhdGVfZGVmYXVsdC5hLmZvcm1hdCh0ZW1wLCd5eXl5LU1NJyk7fSxjdXJNb250aERhdGVQcmVmaXg6ZnVuY3Rpb24gY3VyTW9udGhEYXRlUHJlZml4KCl7cmV0dXJuIGRhdGVfZGVmYXVsdC5hLmZvcm1hdCh0aGlzLmRhdGUsJ3l5eXktTU0nKTt9LG5leHRNb250aERhdGVQcmVmaXg6ZnVuY3Rpb24gbmV4dE1vbnRoRGF0ZVByZWZpeCgpe3ZhciB0ZW1wPW5ldyBEYXRlKHRoaXMuZGF0ZS5nZXRGdWxsWWVhcigpLHRoaXMuZGF0ZS5nZXRNb250aCgpKzEsMSk7cmV0dXJuIGRhdGVfZGVmYXVsdC5hLmZvcm1hdCh0ZW1wLCd5eXl5LU1NJyk7fSxmb3JtYXRlZERhdGU6ZnVuY3Rpb24gZm9ybWF0ZWREYXRlKCl7cmV0dXJuIGRhdGVfZGVmYXVsdC5hLmZvcm1hdCh0aGlzLmRhdGUsJ3l5eXktTU0tZGQnKTt9LGkxOG5EYXRlOmZ1bmN0aW9uIGkxOG5EYXRlKCl7dmFyIHllYXI9dGhpcy5kYXRlLmdldEZ1bGxZZWFyKCk7dmFyIG1vbnRoPXRoaXMuZGF0ZS5nZXRNb250aCgpKzE7cmV0dXJuIHllYXIrJyAnK3RoaXMudCgnZWwuZGF0ZXBpY2tlci55ZWFyJykrJyAnK3RoaXMudCgnZWwuZGF0ZXBpY2tlci5tb250aCcrbW9udGgpO30sZm9ybWF0ZWRUb2RheTpmdW5jdGlvbiBmb3JtYXRlZFRvZGF5KCl7cmV0dXJuIGRhdGVfZGVmYXVsdC5hLmZvcm1hdCh0aGlzLm5vdywneXl5eS1NTS1kZCcpO30scmVhbFNlbGVjdGVkRGF5OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7aWYoIXRoaXMudmFsdWUpcmV0dXJuIHRoaXMuc2VsZWN0ZWREYXk7cmV0dXJuIHRoaXMuZm9ybWF0ZWREYXRlO30sc2V0OmZ1bmN0aW9uIHNldCh2YWwpe3RoaXMuc2VsZWN0ZWREYXk9dmFsO3ZhciBkYXRlPW5ldyBEYXRlKHZhbCk7dGhpcy4kZW1pdCgnaW5wdXQnLGRhdGUpO319LGRhdGU6ZnVuY3Rpb24gZGF0ZSgpe2lmKCF0aGlzLnZhbHVlKXtpZih0aGlzLnJlYWxTZWxlY3RlZERheSl7dmFyIGQ9dGhpcy5zZWxlY3RlZERheS5zcGxpdCgnLScpO3JldHVybiBuZXcgRGF0ZShkWzBdLGRbMV0tMSxkWzJdKTt9ZWxzZSBpZih0aGlzLnZhbGlkYXRlZFJhbmdlLmxlbmd0aCl7cmV0dXJuIHRoaXMudmFsaWRhdGVkUmFuZ2VbMF1bMF07fXJldHVybiB0aGlzLm5vdzt9ZWxzZXtyZXR1cm4gdGhpcy50b0RhdGUodGhpcy52YWx1ZSk7fX0sLy8gaWYgcmFuZ2UgaXMgdmFsaWQsIHdlIGdldCBhIHR3by1kaWdpdCBhcnJheQp2YWxpZGF0ZWRSYW5nZTpmdW5jdGlvbiB2YWxpZGF0ZWRSYW5nZSgpe3ZhciBfdGhpcz10aGlzO3ZhciByYW5nZT10aGlzLnJhbmdlO2lmKCFyYW5nZSlyZXR1cm5bXTtyYW5nZT1yYW5nZS5yZWR1Y2UoZnVuY3Rpb24ocHJldix2YWwsaW5kZXgpe3ZhciBkYXRlPV90aGlzLnRvRGF0ZSh2YWwpO2lmKF90aGlzLnJhbmdlVmFsaWRhdG9yKGRhdGUsaW5kZXg9PT0wKSl7cHJldj1wcmV2LmNvbmNhdChkYXRlKTt9cmV0dXJuIHByZXY7fSxbXSk7aWYocmFuZ2UubGVuZ3RoPT09Mil7dmFyIF9yYW5nZT1yYW5nZSxzdGFydD1fcmFuZ2VbMF0sZW5kPV9yYW5nZVsxXTtpZihzdGFydD5lbmQpe2NvbnNvbGUud2FybignW0VsZW1lbnRDYWxlbmRhcl1lbmQgdGltZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIHN0YXJ0IHRpbWUnKTtyZXR1cm5bXTt9Ly8gc3RhcnQgdGltZSBhbmQgZW5kIHRpbWUgaW4gb25lIG1vbnRoCmlmKE9iamVjdChkYXRlX3V0aWxfWyJ2YWxpZGF0ZVJhbmdlSW5PbmVNb250aCJdKShzdGFydCxlbmQpKXtyZXR1cm5bW3N0YXJ0LGVuZF1dO312YXIgZGF0YT1bXTt2YXIgc3RhcnREYXk9bmV3IERhdGUoc3RhcnQuZ2V0RnVsbFllYXIoKSxzdGFydC5nZXRNb250aCgpKzEsMSk7dmFyIGxhc3REYXk9dGhpcy50b0RhdGUoc3RhcnREYXkuZ2V0VGltZSgpLW9uZURheSk7aWYoIU9iamVjdChkYXRlX3V0aWxfWyJ2YWxpZGF0ZVJhbmdlSW5PbmVNb250aCJdKShzdGFydERheSxlbmQpKXtjb25zb2xlLndhcm4oJ1tFbGVtZW50Q2FsZW5kYXJdc3RhcnQgdGltZSBhbmQgZW5kIHRpbWUgaW50ZXJ2YWwgbXVzdCBub3QgZXhjZWVkIHR3byBtb250aHMnKTtyZXR1cm5bXTt9Ly8g56ys5LiA5Liq5pyI55qE5pe26Ze06IyD5Zu0CmRhdGEucHVzaChbc3RhcnQsbGFzdERheV0pOy8vIOS4i+S4gOaciOeahOaXtumXtOiMg+WbtO+8jOmcgOimgeiuoeeul+S4gOS4i+ivpeaciOeahOesrOS4gOS4quWRqOi1t+Wni+aXpQp2YXIgZmlyc3REYXlPZldlZWs9dGhpcy5yZWFsRmlyc3REYXlPZldlZWs7dmFyIG5leHRNb250Rmlyc3REYXk9c3RhcnREYXkuZ2V0RGF5KCk7dmFyIGludGVydmFsPTA7aWYobmV4dE1vbnRGaXJzdERheSE9PWZpcnN0RGF5T2ZXZWVrKXtpZihmaXJzdERheU9mV2Vlaz09PTApe2ludGVydmFsPTctbmV4dE1vbnRGaXJzdERheTt9ZWxzZXtpbnRlcnZhbD1maXJzdERheU9mV2Vlay1uZXh0TW9udEZpcnN0RGF5O2ludGVydmFsPWludGVydmFsPjA/aW50ZXJ2YWw6NytpbnRlcnZhbDt9fXN0YXJ0RGF5PXRoaXMudG9EYXRlKHN0YXJ0RGF5LmdldFRpbWUoKStpbnRlcnZhbCpvbmVEYXkpO2lmKHN0YXJ0RGF5LmdldERhdGUoKTxlbmQuZ2V0RGF0ZSgpKXtkYXRhLnB1c2goW3N0YXJ0RGF5LGVuZF0pO31yZXR1cm4gZGF0YTt9cmV0dXJuW107fSxyZWFsRmlyc3REYXlPZldlZWs6ZnVuY3Rpb24gcmVhbEZpcnN0RGF5T2ZXZWVrKCl7aWYodGhpcy5maXJzdERheU9mV2VlazwxfHx0aGlzLmZpcnN0RGF5T2ZXZWVrPjYpe3JldHVybiAwO31yZXR1cm4gTWF0aC5mbG9vcih0aGlzLmZpcnN0RGF5T2ZXZWVrKTt9fSxkYXRhOmZ1bmN0aW9uIGRhdGEoKXtyZXR1cm57c2VsZWN0ZWREYXk6Jycsbm93Om5ldyBEYXRlKCl9O319Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FsZW5kYXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX2NhbGVuZGFyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPWNhbGVuZGFyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FsZW5kYXIvc3JjL21haW4udnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgY2FsZW5kYXJfc3JjX21haW5fY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChwYWNrYWdlc19jYWxlbmRhcl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNmQ5NzU2YmVfcmVuZGVyLG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF82ZDk3NTZiZV9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIGNhbGVuZGFyX3NyY19tYWluX2FwaTt9Y2FsZW5kYXJfc3JjX21haW5fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy9jYWxlbmRhci9zcmMvbWFpbi52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgY2FsZW5kYXJfc3JjX21haW49Y2FsZW5kYXJfc3JjX21haW5fY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYWxlbmRhci9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL2NhbGVuZGFyX3NyY19tYWluLmluc3RhbGw9ZnVuY3Rpb24oVnVlKXtWdWUuY29tcG9uZW50KGNhbGVuZGFyX3NyY19tYWluLm5hbWUsY2FsZW5kYXJfc3JjX21haW4pO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBjYWxlbmRhcj1jYWxlbmRhcl9zcmNfbWFpbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2JhY2t0b3Avc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTI1N2RkNGE5Jgp2YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzI1N2RkNGE5X3JlbmRlcj1mdW5jdGlvbiBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfMjU3ZGQ0YTlfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJ0cmFuc2l0aW9uIix7YXR0cnM6e25hbWU6ImVsLWZhZGUtaW4ifX0sW192bS52aXNpYmxlP19jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtYmFja3RvcCIsc3R5bGU6e3JpZ2h0Ol92bS5zdHlsZVJpZ2h0LGJvdHRvbTpfdm0uc3R5bGVCb3R0b219LG9uOntjbGljazpmdW5jdGlvbiBjbGljaygkZXZlbnQpeyRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtyZXR1cm4gX3ZtLmhhbmRsZUNsaWNrKCRldmVudCk7fX19LFtfdm0uX3QoImRlZmF1bHQiLFtfYygiZWwtaWNvbiIse2F0dHJzOntuYW1lOiJjYXJldC10b3AifX0pXSldLDIpOl92bS5fZSgpXSk7fTt2YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzI1N2RkNGE5X3N0YXRpY1JlbmRlckZucz1bXTttYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfMjU3ZGQ0YTlfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2JhY2t0b3Avc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTI1N2RkNGE5JgovLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9iYWNrdG9wL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KdmFyIGN1YmljPWZ1bmN0aW9uIGN1YmljKHZhbHVlKXtyZXR1cm4gTWF0aC5wb3codmFsdWUsMyk7fTt2YXIgZWFzZUluT3V0Q3ViaWM9ZnVuY3Rpb24gZWFzZUluT3V0Q3ViaWModmFsdWUpe3JldHVybiB2YWx1ZTwwLjU/Y3ViaWModmFsdWUqMikvMjoxLWN1YmljKCgxLXZhbHVlKSoyKS8yO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBiYWNrdG9wX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbEJhY2t0b3AnLHByb3BzOnt2aXNpYmlsaXR5SGVpZ2h0Ont0eXBlOk51bWJlcixkZWZhdWx0OjIwMH0sdGFyZ2V0OltTdHJpbmddLHJpZ2h0Ont0eXBlOk51bWJlcixkZWZhdWx0OjQwfSxib3R0b206e3R5cGU6TnVtYmVyLGRlZmF1bHQ6NDB9fSxkYXRhOmZ1bmN0aW9uIGRhdGEoKXtyZXR1cm57ZWw6bnVsbCxjb250YWluZXI6bnVsbCx2aXNpYmxlOmZhbHNlfTt9LGNvbXB1dGVkOntzdHlsZUJvdHRvbTpmdW5jdGlvbiBzdHlsZUJvdHRvbSgpe3JldHVybiB0aGlzLmJvdHRvbSsncHgnO30sc3R5bGVSaWdodDpmdW5jdGlvbiBzdHlsZVJpZ2h0KCl7cmV0dXJuIHRoaXMucmlnaHQrJ3B4Jzt9fSxtb3VudGVkOmZ1bmN0aW9uIG1vdW50ZWQoKXt0aGlzLmluaXQoKTt0aGlzLnRocm90dGxlZFNjcm9sbEhhbmRsZXI9dGhyb3R0bGVfZGVmYXVsdCgpKDMwMCx0aGlzLm9uU2Nyb2xsKTt0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLHRoaXMudGhyb3R0bGVkU2Nyb2xsSGFuZGxlcik7fSxtZXRob2RzOntpbml0OmZ1bmN0aW9uIGluaXQoKXt0aGlzLmNvbnRhaW5lcj1kb2N1bWVudDt0aGlzLmVsPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtpZih0aGlzLnRhcmdldCl7dGhpcy5lbD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMudGFyZ2V0KTtpZighdGhpcy5lbCl7dGhyb3cgbmV3IEVycm9yKCd0YXJnZXQgaXMgbm90IGV4aXN0ZWQ6ICcrdGhpcy50YXJnZXQpO310aGlzLmNvbnRhaW5lcj10aGlzLmVsO319LG9uU2Nyb2xsOmZ1bmN0aW9uIG9uU2Nyb2xsKCl7dmFyIHNjcm9sbFRvcD10aGlzLmVsLnNjcm9sbFRvcDt0aGlzLnZpc2libGU9c2Nyb2xsVG9wPj10aGlzLnZpc2liaWxpdHlIZWlnaHQ7fSxoYW5kbGVDbGljazpmdW5jdGlvbiBoYW5kbGVDbGljayhlKXt0aGlzLnNjcm9sbFRvVG9wKCk7dGhpcy4kZW1pdCgnY2xpY2snLGUpO30sc2Nyb2xsVG9Ub3A6ZnVuY3Rpb24gc2Nyb2xsVG9Ub3AoKXt2YXIgZWw9dGhpcy5lbDt2YXIgYmVnaW5UaW1lPURhdGUubm93KCk7dmFyIGJlZ2luVmFsdWU9ZWwuc2Nyb2xsVG9wO3ZhciByQUY9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZXx8ZnVuY3Rpb24oZnVuYyl7cmV0dXJuIHNldFRpbWVvdXQoZnVuYywxNik7fTt2YXIgZnJhbWVGdW5jPWZ1bmN0aW9uIGZyYW1lRnVuYygpe3ZhciBwcm9ncmVzcz0oRGF0ZS5ub3coKS1iZWdpblRpbWUpLzUwMDtpZihwcm9ncmVzczwxKXtlbC5zY3JvbGxUb3A9YmVnaW5WYWx1ZSooMS1lYXNlSW5PdXRDdWJpYyhwcm9ncmVzcykpO3JBRihmcmFtZUZ1bmMpO31lbHNle2VsLnNjcm9sbFRvcD0wO319O3JBRihmcmFtZUZ1bmMpO319LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpe3RoaXMuY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsdGhpcy50aHJvdHRsZWRTY3JvbGxIYW5kbGVyKTt9fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2JhY2t0b3Avc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX2JhY2t0b3Bfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189YmFja3RvcF9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2JhY2t0b3Avc3JjL21haW4udnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgYmFja3RvcF9zcmNfbWFpbl9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHBhY2thZ2VzX2JhY2t0b3Bfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzI1N2RkNGE5X3JlbmRlcixtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfMjU3ZGQ0YTlfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciBiYWNrdG9wX3NyY19tYWluX2FwaTt9YmFja3RvcF9zcmNfbWFpbl9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL2JhY2t0b3Avc3JjL21haW4udnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGJhY2t0b3Bfc3JjX21haW49YmFja3RvcF9zcmNfbWFpbl9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2JhY2t0b3AvaW5kZXguanMKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9iYWNrdG9wX3NyY19tYWluLmluc3RhbGw9ZnVuY3Rpb24oVnVlKXtWdWUuY29tcG9uZW50KGJhY2t0b3Bfc3JjX21haW4ubmFtZSxiYWNrdG9wX3NyY19tYWluKTt9Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgYmFja3RvcD1iYWNrdG9wX3NyY19tYWluOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvaW5maW5pdGUtc2Nyb2xsL3NyYy9tYWluLmpzCnZhciBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHk9ZnVuY3Rpb24gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGVsZW1lbnQscHJvcGVydHkpe2lmKGVsZW1lbnQ9PT13aW5kb3cpe2VsZW1lbnQ9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O31pZihlbGVtZW50Lm5vZGVUeXBlIT09MSl7cmV0dXJuW107fS8vIE5PVEU6IDEgRE9NIGFjY2VzcyBoZXJlCnZhciBjc3M9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCxudWxsKTtyZXR1cm4gcHJvcGVydHk/Y3NzW3Byb3BlcnR5XTpjc3M7fTt2YXIgZW50cmllcz1mdW5jdGlvbiBlbnRyaWVzKG9iail7cmV0dXJuIE9iamVjdC5rZXlzKG9ianx8e30pLm1hcChmdW5jdGlvbihrZXkpe3JldHVybltrZXksb2JqW2tleV1dO30pO307dmFyIGdldFBvc2l0aW9uU2l6ZT1mdW5jdGlvbiBnZXRQb3NpdGlvblNpemUoZWwscHJvcCl7cmV0dXJuIGVsPT09d2luZG93fHxlbD09PWRvY3VtZW50P2RvY3VtZW50LmRvY3VtZW50RWxlbWVudFtwcm9wXTplbFtwcm9wXTt9O3ZhciBnZXRPZmZzZXRIZWlnaHQ9ZnVuY3Rpb24gZ2V0T2Zmc2V0SGVpZ2h0KGVsKXtyZXR1cm4gZ2V0UG9zaXRpb25TaXplKGVsLCdvZmZzZXRIZWlnaHQnKTt9O3ZhciBnZXRDbGllbnRIZWlnaHQ9ZnVuY3Rpb24gZ2V0Q2xpZW50SGVpZ2h0KGVsKXtyZXR1cm4gZ2V0UG9zaXRpb25TaXplKGVsLCdjbGllbnRIZWlnaHQnKTt9O3ZhciBzY29wZT0nRWxJbmZpbml0ZVNjcm9sbCc7dmFyIGF0dHJpYnV0ZXM9e2RlbGF5Ont0eXBlOk51bWJlcixkZWZhdWx0OjIwMH0sZGlzdGFuY2U6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MH0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OmZhbHNlfSxpbW1lZGlhdGU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OnRydWV9fTt2YXIgbWFpbl9nZXRTY3JvbGxPcHRpb25zPWZ1bmN0aW9uIGdldFNjcm9sbE9wdGlvbnMoZWwsdm0pe2lmKCFPYmplY3QodHlwZXNfWyJpc0h0bWxFbGVtZW50Il0pKGVsKSlyZXR1cm57fTtyZXR1cm4gZW50cmllcyhhdHRyaWJ1dGVzKS5yZWR1Y2UoZnVuY3Rpb24obWFwLF9yZWYpe3ZhciBrZXk9X3JlZlswXSxvcHRpb249X3JlZlsxXTt2YXIgdHlwZT1vcHRpb24udHlwZSxkZWZhdWx0VmFsdWU9b3B0aW9uLmRlZmF1bHQ7dmFyIHZhbHVlPWVsLmdldEF0dHJpYnV0ZSgnaW5maW5pdGUtc2Nyb2xsLScra2V5KTt2YWx1ZT1PYmplY3QodHlwZXNfWyJpc1VuZGVmaW5lZCJdKSh2bVt2YWx1ZV0pP3ZhbHVlOnZtW3ZhbHVlXTtzd2l0Y2godHlwZSl7Y2FzZSBOdW1iZXI6dmFsdWU9TnVtYmVyKHZhbHVlKTt2YWx1ZT1OdW1iZXIuaXNOYU4odmFsdWUpP2RlZmF1bHRWYWx1ZTp2YWx1ZTticmVhaztjYXNlIEJvb2xlYW46dmFsdWU9T2JqZWN0KHR5cGVzX1siaXNEZWZpbmVkIl0pKHZhbHVlKT92YWx1ZT09PSdmYWxzZSc/ZmFsc2U6Qm9vbGVhbih2YWx1ZSk6ZGVmYXVsdFZhbHVlO2JyZWFrO2RlZmF1bHQ6dmFsdWU9dHlwZSh2YWx1ZSk7fW1hcFtrZXldPXZhbHVlO3JldHVybiBtYXA7fSx7fSk7fTt2YXIgZ2V0RWxlbWVudFRvcD1mdW5jdGlvbiBnZXRFbGVtZW50VG9wKGVsKXtyZXR1cm4gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO307dmFyIG1haW5faGFuZGxlU2Nyb2xsPWZ1bmN0aW9uIGhhbmRsZVNjcm9sbChjYil7dmFyIF9zY29wZT10aGlzW3Njb3BlXSxlbD1fc2NvcGUuZWwsdm09X3Njb3BlLnZtLGNvbnRhaW5lcj1fc2NvcGUuY29udGFpbmVyLG9ic2VydmVyPV9zY29wZS5vYnNlcnZlcjt2YXIgX2dldFNjcm9sbE9wdGlvbnM9bWFpbl9nZXRTY3JvbGxPcHRpb25zKGVsLHZtKSxkaXN0YW5jZT1fZ2V0U2Nyb2xsT3B0aW9ucy5kaXN0YW5jZSxkaXNhYmxlZD1fZ2V0U2Nyb2xsT3B0aW9ucy5kaXNhYmxlZDtpZihkaXNhYmxlZClyZXR1cm47dmFyIGNvbnRhaW5lckluZm89Y29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFjb250YWluZXJJbmZvLndpZHRoJiYhY29udGFpbmVySW5mby5oZWlnaHQpcmV0dXJuO3ZhciBzaG91bGRUcmlnZ2VyPWZhbHNlO2lmKGNvbnRhaW5lcj09PWVsKXsvLyBiZSBhd2FyZSBvZiBkaWZmZXJlbmNlIGJldHdlZW4gY2xpZW50SGVpZ2h0ICYgb2Zmc2V0SGVpZ2h0ICYgd2luZG93LmdldENvbXB1dGVkU3R5bGUoKS5oZWlnaHQKdmFyIHNjcm9sbEJvdHRvbT1jb250YWluZXIuc2Nyb2xsVG9wK2dldENsaWVudEhlaWdodChjb250YWluZXIpO3Nob3VsZFRyaWdnZXI9Y29udGFpbmVyLnNjcm9sbEhlaWdodC1zY3JvbGxCb3R0b208PWRpc3RhbmNlO31lbHNle3ZhciBoZWlnaHRCZWxvd1RvcD1nZXRPZmZzZXRIZWlnaHQoZWwpK2dldEVsZW1lbnRUb3AoZWwpLWdldEVsZW1lbnRUb3AoY29udGFpbmVyKTt2YXIgb2Zmc2V0SGVpZ2h0PWdldE9mZnNldEhlaWdodChjb250YWluZXIpO3ZhciBib3JkZXJCb3R0b209TnVtYmVyLnBhcnNlRmxvYXQoZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGNvbnRhaW5lciwnYm9yZGVyQm90dG9tV2lkdGgnKSk7c2hvdWxkVHJpZ2dlcj1oZWlnaHRCZWxvd1RvcC1vZmZzZXRIZWlnaHQrYm9yZGVyQm90dG9tPD1kaXN0YW5jZTt9aWYoc2hvdWxkVHJpZ2dlciYmT2JqZWN0KHR5cGVzX1siaXNGdW5jdGlvbiJdKShjYikpe2NiLmNhbGwodm0pO31lbHNlIGlmKG9ic2VydmVyKXtvYnNlcnZlci5kaXNjb25uZWN0KCk7dGhpc1tzY29wZV0ub2JzZXJ2ZXI9bnVsbDt9fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGluZmluaXRlX3Njcm9sbF9zcmNfbWFpbj17bmFtZTonSW5maW5pdGVTY3JvbGwnLGluc2VydGVkOmZ1bmN0aW9uIGluc2VydGVkKGVsLGJpbmRpbmcsdm5vZGUpe3ZhciBjYj1iaW5kaW5nLnZhbHVlO3ZhciB2bT12bm9kZS5jb250ZXh0Oy8vIG9ubHkgaW5jbHVkZSB2ZXJ0aWNhbCBzY3JvbGwKdmFyIGNvbnRhaW5lcj1PYmplY3QoZG9tX1siZ2V0U2Nyb2xsQ29udGFpbmVyIl0pKGVsLHRydWUpO3ZhciBfZ2V0U2Nyb2xsT3B0aW9uczI9bWFpbl9nZXRTY3JvbGxPcHRpb25zKGVsLHZtKSxkZWxheT1fZ2V0U2Nyb2xsT3B0aW9uczIuZGVsYXksaW1tZWRpYXRlPV9nZXRTY3JvbGxPcHRpb25zMi5pbW1lZGlhdGU7dmFyIG9uU2Nyb2xsPWRlYm91bmNlX2RlZmF1bHQoKShkZWxheSxtYWluX2hhbmRsZVNjcm9sbC5iaW5kKGVsLGNiKSk7ZWxbc2NvcGVdPXtlbDplbCx2bTp2bSxjb250YWluZXI6Y29udGFpbmVyLG9uU2Nyb2xsOm9uU2Nyb2xsfTtpZihjb250YWluZXIpe2NvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLG9uU2Nyb2xsKTtpZihpbW1lZGlhdGUpe3ZhciBvYnNlcnZlcj1lbFtzY29wZV0ub2JzZXJ2ZXI9bmV3IE11dGF0aW9uT2JzZXJ2ZXIob25TY3JvbGwpO29ic2VydmVyLm9ic2VydmUoY29udGFpbmVyLHtjaGlsZExpc3Q6dHJ1ZSxzdWJ0cmVlOnRydWV9KTtvblNjcm9sbCgpO319fSx1bmJpbmQ6ZnVuY3Rpb24gdW5iaW5kKGVsKXt2YXIgX2VsJHNjb3BlPWVsW3Njb3BlXSxjb250YWluZXI9X2VsJHNjb3BlLmNvbnRhaW5lcixvblNjcm9sbD1fZWwkc2NvcGUub25TY3JvbGw7aWYoY29udGFpbmVyKXtjb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJyxvblNjcm9sbCk7fX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvaW5maW5pdGUtc2Nyb2xsL2luZGV4LmpzCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovaW5maW5pdGVfc2Nyb2xsX3NyY19tYWluLmluc3RhbGw9ZnVuY3Rpb24oVnVlKXtWdWUuZGlyZWN0aXZlKGluZmluaXRlX3Njcm9sbF9zcmNfbWFpbi5uYW1lLGluZmluaXRlX3Njcm9sbF9zcmNfbWFpbik7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGluZmluaXRlX3Njcm9sbD1pbmZpbml0ZV9zY3JvbGxfc3JjX21haW47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9wYWdlLWhlYWRlci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NTA3MDk1NGMmCnZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNTA3MDk1NGNfcmVuZGVyPWZ1bmN0aW9uIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81MDcwOTU0Y19yZW5kZXIoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDt2YXIgX2M9X3ZtLl9zZWxmLl9jfHxfaDtyZXR1cm4gX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1wYWdlLWhlYWRlciJ9LFtfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXBhZ2UtaGVhZGVyX19sZWZ0Iixvbjp7Y2xpY2s6ZnVuY3Rpb24gY2xpY2soJGV2ZW50KXtfdm0uJGVtaXQoImJhY2siKTt9fX0sW19jKCJpIix7c3RhdGljQ2xhc3M6ImVsLWljb24tYmFjayJ9KSxfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXBhZ2UtaGVhZGVyX190aXRsZSJ9LFtfdm0uX3QoInRpdGxlIixbX3ZtLl92KF92bS5fcyhfdm0udGl0bGUpKV0pXSwyKV0pLF9jKCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtcGFnZS1oZWFkZXJfX2NvbnRlbnQifSxbX3ZtLl90KCJjb250ZW50IixbX3ZtLl92KF92bS5fcyhfdm0uY29udGVudCkpXSldLDIpXSk7fTt2YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzUwNzA5NTRjX3N0YXRpY1JlbmRlckZucz1bXTttYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNTA3MDk1NGNfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3BhZ2UtaGVhZGVyL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD01MDcwOTU0YyYKLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvcGFnZS1oZWFkZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhZ2VfaGVhZGVyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbFBhZ2VIZWFkZXInLHByb3BzOnt0aXRsZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDpmdW5jdGlvbiBfZGVmYXVsdCgpe3JldHVybiBPYmplY3QobGliX2xvY2FsZV9bInQiXSkoJ2VsLnBhZ2VIZWFkZXIudGl0bGUnKTt9fSxjb250ZW50OlN0cmluZ319Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcGFnZS1oZWFkZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX3BhZ2VfaGVhZGVyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXBhZ2VfaGVhZGVyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcGFnZS1oZWFkZXIvc3JjL21haW4udnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgcGFnZV9oZWFkZXJfc3JjX21haW5fY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChwYWNrYWdlc19wYWdlX2hlYWRlcl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNTA3MDk1NGNfcmVuZGVyLG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81MDcwOTU0Y19zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIHBhZ2VfaGVhZGVyX3NyY19tYWluX2FwaTt9cGFnZV9oZWFkZXJfc3JjX21haW5fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy9wYWdlLWhlYWRlci9zcmMvbWFpbi52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFnZV9oZWFkZXJfc3JjX21haW49cGFnZV9oZWFkZXJfc3JjX21haW5fY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9wYWdlLWhlYWRlci9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL3BhZ2VfaGVhZGVyX3NyY19tYWluLmluc3RhbGw9ZnVuY3Rpb24oVnVlKXtWdWUuY29tcG9uZW50KHBhZ2VfaGVhZGVyX3NyY19tYWluLm5hbWUscGFnZV9oZWFkZXJfc3JjX21haW4pO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwYWdlX2hlYWRlcj1wYWdlX2hlYWRlcl9zcmNfbWFpbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2Nhc2NhZGVyLXBhbmVsL3NyYy9jYXNjYWRlci1wYW5lbC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MzQ5MzIzNDYmCnZhciBjYXNjYWRlcl9wYW5lbHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzM0OTMyMzQ2X3JlbmRlcj1mdW5jdGlvbiBjYXNjYWRlcl9wYW5lbHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzM0OTMyMzQ2X3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygiZGl2Iix7Y2xhc3M6WyJlbC1jYXNjYWRlci1wYW5lbCIsX3ZtLmJvcmRlciYmImlzLWJvcmRlcmVkIl0sb246e2tleWRvd246X3ZtLmhhbmRsZUtleURvd259fSxfdm0uX2woX3ZtLm1lbnVzLGZ1bmN0aW9uKG1lbnUsaW5kZXgpe3JldHVybiBfYygiY2FzY2FkZXItbWVudSIse2tleTppbmRleCxyZWY6Im1lbnUiLHJlZkluRm9yOnRydWUsYXR0cnM6e2luZGV4OmluZGV4LG5vZGVzOm1lbnV9fSk7fSksMSk7fTt2YXIgY2FzY2FkZXJfcGFuZWx2dWVfdHlwZV90ZW1wbGF0ZV9pZF8zNDkzMjM0Nl9zdGF0aWNSZW5kZXJGbnM9W107Y2FzY2FkZXJfcGFuZWx2dWVfdHlwZV90ZW1wbGF0ZV9pZF8zNDkzMjM0Nl9yZW5kZXIuX3dpdGhTdHJpcHBlZD10cnVlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL2Nhc2NhZGVyLXBhbmVsLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0zNDkzMjM0NiYKLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCAiZWxlbWVudC11aS9saWIvcmFkaW8iCnZhciByYWRpb189X193ZWJwYWNrX3JlcXVpcmVfXyg0Myk7dmFyIHJhZGlvX2RlZmF1bHQ9LyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihyYWRpb18pOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2Nhc2NhZGVyLXBhbmVsL3NyYy9jYXNjYWRlci1ub2RlLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKdmFyIHN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbiBzdG9wUHJvcGFnYXRpb24oZSl7cmV0dXJuIGUuc3RvcFByb3BhZ2F0aW9uKCk7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGNhc2NhZGVyX25vZGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e2luamVjdDpbJ3BhbmVsJ10sY29tcG9uZW50czp7RWxDaGVja2JveDpjaGVja2JveF9kZWZhdWx0LmEsRWxSYWRpbzpyYWRpb19kZWZhdWx0LmF9LHByb3BzOntub2RlOntyZXF1aXJlZDp0cnVlfSxub2RlSWQ6U3RyaW5nfSxjb21wdXRlZDp7Y29uZmlnOmZ1bmN0aW9uIGNvbmZpZygpe3JldHVybiB0aGlzLnBhbmVsLmNvbmZpZzt9LGlzTGVhZjpmdW5jdGlvbiBpc0xlYWYoKXtyZXR1cm4gdGhpcy5ub2RlLmlzTGVhZjt9LGlzRGlzYWJsZWQ6ZnVuY3Rpb24gaXNEaXNhYmxlZCgpe3JldHVybiB0aGlzLm5vZGUuaXNEaXNhYmxlZDt9LGNoZWNrZWRWYWx1ZTpmdW5jdGlvbiBjaGVja2VkVmFsdWUoKXtyZXR1cm4gdGhpcy5wYW5lbC5jaGVja2VkVmFsdWU7fSxpc0NoZWNrZWQ6ZnVuY3Rpb24gaXNDaGVja2VkKCl7cmV0dXJuIHRoaXMubm9kZS5pc1NhbWVOb2RlKHRoaXMuY2hlY2tlZFZhbHVlKTt9LGluQWN0aXZlUGF0aDpmdW5jdGlvbiBpbkFjdGl2ZVBhdGgoKXtyZXR1cm4gdGhpcy5pc0luUGF0aCh0aGlzLnBhbmVsLmFjdGl2ZVBhdGgpO30saW5DaGVja2VkUGF0aDpmdW5jdGlvbiBpbkNoZWNrZWRQYXRoKCl7dmFyIF90aGlzPXRoaXM7aWYoIXRoaXMuY29uZmlnLmNoZWNrU3RyaWN0bHkpcmV0dXJuIGZhbHNlO3JldHVybiB0aGlzLnBhbmVsLmNoZWNrZWROb2RlUGF0aHMuc29tZShmdW5jdGlvbihjaGVja2VkUGF0aCl7cmV0dXJuIF90aGlzLmlzSW5QYXRoKGNoZWNrZWRQYXRoKTt9KTt9LHZhbHVlOmZ1bmN0aW9uIHZhbHVlKCl7cmV0dXJuIHRoaXMubm9kZS5nZXRWYWx1ZUJ5T3B0aW9uKCk7fX0sbWV0aG9kczp7aGFuZGxlRXhwYW5kOmZ1bmN0aW9uIGhhbmRsZUV4cGFuZCgpe3ZhciBfdGhpczI9dGhpczt2YXIgcGFuZWw9dGhpcy5wYW5lbCxub2RlPXRoaXMubm9kZSxpc0Rpc2FibGVkPXRoaXMuaXNEaXNhYmxlZCxjb25maWc9dGhpcy5jb25maWc7dmFyIG11bHRpcGxlPWNvbmZpZy5tdWx0aXBsZSxjaGVja1N0cmljdGx5PWNvbmZpZy5jaGVja1N0cmljdGx5O2lmKCFjaGVja1N0cmljdGx5JiZpc0Rpc2FibGVkfHxub2RlLmxvYWRpbmcpcmV0dXJuO2lmKGNvbmZpZy5sYXp5JiYhbm9kZS5sb2FkZWQpe3BhbmVsLmxhenlMb2FkKG5vZGUsZnVuY3Rpb24oKXsvLyBkbyBub3QgdXNlIGNhY2hlZCBsZWFmIHZhbHVlIGhlcmUsIGludm9rZSB0aGlzLmlzTGVhZiB0byBnZXQgbmV3IHZhbHVlLgp2YXIgaXNMZWFmPV90aGlzMi5pc0xlYWY7aWYoIWlzTGVhZilfdGhpczIuaGFuZGxlRXhwYW5kKCk7aWYobXVsdGlwbGUpey8vIGlmIGxlYWYgc3luYyBjaGVja2VkIHN0YXRlLCBlbHNlIGNsZWFyIGNoZWNrZWQgc3RhdGUKdmFyIGNoZWNrZWQ9aXNMZWFmP25vZGUuY2hlY2tlZDpmYWxzZTtfdGhpczIuaGFuZGxlTXVsdGlDaGVja0NoYW5nZShjaGVja2VkKTt9fSk7fWVsc2V7cGFuZWwuaGFuZGxlRXhwYW5kKG5vZGUpO319LGhhbmRsZUNoZWNrQ2hhbmdlOmZ1bmN0aW9uIGhhbmRsZUNoZWNrQ2hhbmdlKCl7dmFyIHBhbmVsPXRoaXMucGFuZWwsdmFsdWU9dGhpcy52YWx1ZSxub2RlPXRoaXMubm9kZTtwYW5lbC5oYW5kbGVDaGVja0NoYW5nZSh2YWx1ZSk7cGFuZWwuaGFuZGxlRXhwYW5kKG5vZGUpO30saGFuZGxlTXVsdGlDaGVja0NoYW5nZTpmdW5jdGlvbiBoYW5kbGVNdWx0aUNoZWNrQ2hhbmdlKGNoZWNrZWQpe3RoaXMubm9kZS5kb0NoZWNrKGNoZWNrZWQpO3RoaXMucGFuZWwuY2FsY3VsYXRlTXVsdGlDaGVja2VkVmFsdWUoKTt9LGlzSW5QYXRoOmZ1bmN0aW9uIGlzSW5QYXRoKHBhdGhOb2Rlcyl7dmFyIG5vZGU9dGhpcy5ub2RlO3ZhciBzZWxlY3RlZFBhdGhOb2RlPXBhdGhOb2Rlc1tub2RlLmxldmVsLTFdfHx7fTtyZXR1cm4gc2VsZWN0ZWRQYXRoTm9kZS51aWQ9PT1ub2RlLnVpZDt9LHJlbmRlclByZWZpeDpmdW5jdGlvbiByZW5kZXJQcmVmaXgoaCl7dmFyIGlzTGVhZj10aGlzLmlzTGVhZixpc0NoZWNrZWQ9dGhpcy5pc0NoZWNrZWQsY29uZmlnPXRoaXMuY29uZmlnO3ZhciBjaGVja1N0cmljdGx5PWNvbmZpZy5jaGVja1N0cmljdGx5LG11bHRpcGxlPWNvbmZpZy5tdWx0aXBsZTtpZihtdWx0aXBsZSl7cmV0dXJuIHRoaXMucmVuZGVyQ2hlY2tib3goaCk7fWVsc2UgaWYoY2hlY2tTdHJpY3RseSl7cmV0dXJuIHRoaXMucmVuZGVyUmFkaW8oaCk7fWVsc2UgaWYoaXNMZWFmJiZpc0NoZWNrZWQpe3JldHVybiB0aGlzLnJlbmRlckNoZWNrSWNvbihoKTt9cmV0dXJuIG51bGw7fSxyZW5kZXJQb3N0Zml4OmZ1bmN0aW9uIHJlbmRlclBvc3RmaXgoaCl7dmFyIG5vZGU9dGhpcy5ub2RlLGlzTGVhZj10aGlzLmlzTGVhZjtpZihub2RlLmxvYWRpbmcpe3JldHVybiB0aGlzLnJlbmRlckxvYWRpbmdJY29uKGgpO31lbHNlIGlmKCFpc0xlYWYpe3JldHVybiB0aGlzLnJlbmRlckV4cGFuZEljb24oaCk7fXJldHVybiBudWxsO30scmVuZGVyQ2hlY2tib3g6ZnVuY3Rpb24gcmVuZGVyQ2hlY2tib3goaCl7dmFyIG5vZGU9dGhpcy5ub2RlLGNvbmZpZz10aGlzLmNvbmZpZyxpc0Rpc2FibGVkPXRoaXMuaXNEaXNhYmxlZDt2YXIgZXZlbnRzPXtvbjp7Y2hhbmdlOnRoaXMuaGFuZGxlTXVsdGlDaGVja0NoYW5nZX0sbmF0aXZlT246e319O2lmKGNvbmZpZy5jaGVja1N0cmljdGx5KXsvLyB3aGVuIGV2ZXJ5IG5vZGUgaXMgc2VsZWN0YWJsZSwgY2xpY2sgZXZlbnQgc2hvdWxkIG5vdCB0cmlnZ2VyIGV4cGFuZCBldmVudC4KZXZlbnRzLm5hdGl2ZU9uLmNsaWNrPXN0b3BQcm9wYWdhdGlvbjt9cmV0dXJuIGgoJ2VsLWNoZWNrYm94JyxleHRlcm5hbF9iYWJlbF9oZWxwZXJfdnVlX2pzeF9tZXJnZV9wcm9wc19kZWZhdWx0KCkoW3thdHRyczp7dmFsdWU6bm9kZS5jaGVja2VkLGluZGV0ZXJtaW5hdGU6bm9kZS5pbmRldGVybWluYXRlLGRpc2FibGVkOmlzRGlzYWJsZWR9fSxldmVudHNdKSk7fSxyZW5kZXJSYWRpbzpmdW5jdGlvbiByZW5kZXJSYWRpbyhoKXt2YXIgY2hlY2tlZFZhbHVlPXRoaXMuY2hlY2tlZFZhbHVlLHZhbHVlPXRoaXMudmFsdWUsaXNEaXNhYmxlZD10aGlzLmlzRGlzYWJsZWQ7Ly8gdG8ga2VlcCBzYW1lIHJlZmVyZW5jZSBpZiB2YWx1ZSBjYXVzZSByYWRpbydzIGNoZWNrZWQgc3RhdGUgaXMgY2FsY3VsYXRlZCBieSByZWZlcmVuY2UgY29tcGFyaXNpb247CmlmKE9iamVjdCh1dGlsX1siaXNFcXVhbCJdKSh2YWx1ZSxjaGVja2VkVmFsdWUpKXt2YWx1ZT1jaGVja2VkVmFsdWU7fXJldHVybiBoKCdlbC1yYWRpbycse2F0dHJzOnt2YWx1ZTpjaGVja2VkVmFsdWUsbGFiZWw6dmFsdWUsZGlzYWJsZWQ6aXNEaXNhYmxlZH0sb246eydjaGFuZ2UnOnRoaXMuaGFuZGxlQ2hlY2tDaGFuZ2V9LG5hdGl2ZU9uOnsnY2xpY2snOnN0b3BQcm9wYWdhdGlvbn19LFtoKCdzcGFuJyldKTt9LHJlbmRlckNoZWNrSWNvbjpmdW5jdGlvbiByZW5kZXJDaGVja0ljb24oaCl7cmV0dXJuIGgoJ2knLHsnY2xhc3MnOidlbC1pY29uLWNoZWNrIGVsLWNhc2NhZGVyLW5vZGVfX3ByZWZpeCd9KTt9LHJlbmRlckxvYWRpbmdJY29uOmZ1bmN0aW9uIHJlbmRlckxvYWRpbmdJY29uKGgpe3JldHVybiBoKCdpJyx7J2NsYXNzJzonZWwtaWNvbi1sb2FkaW5nIGVsLWNhc2NhZGVyLW5vZGVfX3Bvc3RmaXgnfSk7fSxyZW5kZXJFeHBhbmRJY29uOmZ1bmN0aW9uIHJlbmRlckV4cGFuZEljb24oaCl7cmV0dXJuIGgoJ2knLHsnY2xhc3MnOidlbC1pY29uLWFycm93LXJpZ2h0IGVsLWNhc2NhZGVyLW5vZGVfX3Bvc3RmaXgnfSk7fSxyZW5kZXJDb250ZW50OmZ1bmN0aW9uIHJlbmRlckNvbnRlbnQoaCl7dmFyIHBhbmVsPXRoaXMucGFuZWwsbm9kZT10aGlzLm5vZGU7dmFyIHJlbmRlcj1wYW5lbC5yZW5kZXJMYWJlbEZuO3ZhciB2bm9kZT1yZW5kZXI/cmVuZGVyKHtub2RlOm5vZGUsZGF0YTpub2RlLmRhdGF9KTpudWxsO3JldHVybiBoKCdzcGFuJyx7J2NsYXNzJzonZWwtY2FzY2FkZXItbm9kZV9fbGFiZWwnfSxbdm5vZGV8fG5vZGUubGFiZWxdKTt9fSxyZW5kZXI6ZnVuY3Rpb24gcmVuZGVyKGgpe3ZhciBfdGhpczM9dGhpczt2YXIgaW5BY3RpdmVQYXRoPXRoaXMuaW5BY3RpdmVQYXRoLGluQ2hlY2tlZFBhdGg9dGhpcy5pbkNoZWNrZWRQYXRoLGlzQ2hlY2tlZD10aGlzLmlzQ2hlY2tlZCxpc0xlYWY9dGhpcy5pc0xlYWYsaXNEaXNhYmxlZD10aGlzLmlzRGlzYWJsZWQsY29uZmlnPXRoaXMuY29uZmlnLG5vZGVJZD10aGlzLm5vZGVJZDt2YXIgZXhwYW5kVHJpZ2dlcj1jb25maWcuZXhwYW5kVHJpZ2dlcixjaGVja1N0cmljdGx5PWNvbmZpZy5jaGVja1N0cmljdGx5LG11bHRpcGxlPWNvbmZpZy5tdWx0aXBsZTt2YXIgZGlzYWJsZWQ9IWNoZWNrU3RyaWN0bHkmJmlzRGlzYWJsZWQ7dmFyIGV2ZW50cz17b246e319O2lmKGV4cGFuZFRyaWdnZXI9PT0nY2xpY2snKXtldmVudHMub24uY2xpY2s9dGhpcy5oYW5kbGVFeHBhbmQ7fWVsc2V7ZXZlbnRzLm9uLm1vdXNlZW50ZXI9ZnVuY3Rpb24oZSl7X3RoaXMzLmhhbmRsZUV4cGFuZCgpO190aGlzMy4kZW1pdCgnZXhwYW5kJyxlKTt9O2V2ZW50cy5vbi5mb2N1cz1mdW5jdGlvbihlKXtfdGhpczMuaGFuZGxlRXhwYW5kKCk7X3RoaXMzLiRlbWl0KCdleHBhbmQnLGUpO307fWlmKGlzTGVhZiYmIWlzRGlzYWJsZWQmJiFjaGVja1N0cmljdGx5JiYhbXVsdGlwbGUpe2V2ZW50cy5vbi5jbGljaz10aGlzLmhhbmRsZUNoZWNrQ2hhbmdlO31yZXR1cm4gaCgnbGknLGV4dGVybmFsX2JhYmVsX2hlbHBlcl92dWVfanN4X21lcmdlX3Byb3BzX2RlZmF1bHQoKShbe2F0dHJzOntyb2xlOidtZW51aXRlbScsaWQ6bm9kZUlkLCdhcmlhLWV4cGFuZGVkJzppbkFjdGl2ZVBhdGgsdGFiaW5kZXg6ZGlzYWJsZWQ/bnVsbDotMX0sJ2NsYXNzJzp7J2VsLWNhc2NhZGVyLW5vZGUnOnRydWUsJ2lzLXNlbGVjdGFibGUnOmNoZWNrU3RyaWN0bHksJ2luLWFjdGl2ZS1wYXRoJzppbkFjdGl2ZVBhdGgsJ2luLWNoZWNrZWQtcGF0aCc6aW5DaGVja2VkUGF0aCwnaXMtYWN0aXZlJzppc0NoZWNrZWQsJ2lzLWRpc2FibGVkJzpkaXNhYmxlZH19LGV2ZW50c10pLFt0aGlzLnJlbmRlclByZWZpeChoKSx0aGlzLnJlbmRlckNvbnRlbnQoaCksdGhpcy5yZW5kZXJQb3N0Zml4KGgpXSk7fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvY2FzY2FkZXItbm9kZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgc3JjX2Nhc2NhZGVyX25vZGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189Y2FzY2FkZXJfbm9kZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Nhc2NhZGVyLXBhbmVsL3NyYy9jYXNjYWRlci1ub2RlLnZ1ZQp2YXIgY2FzY2FkZXJfbm9kZV9yZW5kZXIsY2FzY2FkZXJfbm9kZV9zdGF0aWNSZW5kZXJGbnM7Lyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciBjYXNjYWRlcl9ub2RlX2NvbXBvbmVudD1ub3JtYWxpemVDb21wb25lbnQoc3JjX2Nhc2NhZGVyX25vZGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sY2FzY2FkZXJfbm9kZV9yZW5kZXIsY2FzY2FkZXJfbm9kZV9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIGNhc2NhZGVyX25vZGVfYXBpO31jYXNjYWRlcl9ub2RlX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL2Nhc2NhZGVyLW5vZGUudnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGNhc2NhZGVyX25vZGU9Y2FzY2FkZXJfbm9kZV9jb21wb25lbnQuZXhwb3J0czsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvY2FzY2FkZXItbWVudS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgY2FzY2FkZXJfbWVudXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz17bmFtZTonRWxDYXNjYWRlck1lbnUnLG1peGluczpbbG9jYWxlX2RlZmF1bHQuYV0saW5qZWN0OlsncGFuZWwnXSxjb21wb25lbnRzOntFbFNjcm9sbGJhcjpzY3JvbGxiYXJfZGVmYXVsdC5hLENhc2NhZGVyTm9kZTpjYXNjYWRlcl9ub2RlfSxwcm9wczp7bm9kZXM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6dHJ1ZX0saW5kZXg6TnVtYmVyfSxkYXRhOmZ1bmN0aW9uIGRhdGEoKXtyZXR1cm57YWN0aXZlTm9kZTpudWxsLGhvdmVyVGltZXI6bnVsbCxpZDpPYmplY3QodXRpbF9bImdlbmVyYXRlSWQiXSkoKX07fSxjb21wdXRlZDp7aXNFbXB0eTpmdW5jdGlvbiBpc0VtcHR5KCl7cmV0dXJuIXRoaXMubm9kZXMubGVuZ3RoO30sbWVudUlkOmZ1bmN0aW9uIG1lbnVJZCgpe3JldHVybidjYXNjYWRlci1tZW51LScrdGhpcy5pZCsnLScrdGhpcy5pbmRleDt9fSxtZXRob2RzOntoYW5kbGVFeHBhbmQ6ZnVuY3Rpb24gaGFuZGxlRXhwYW5kKGUpe3RoaXMuYWN0aXZlTm9kZT1lLnRhcmdldDt9LGhhbmRsZU1vdXNlTW92ZTpmdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmUoZSl7dmFyIGFjdGl2ZU5vZGU9dGhpcy5hY3RpdmVOb2RlLGhvdmVyVGltZXI9dGhpcy5ob3ZlclRpbWVyO3ZhciBob3ZlclpvbmU9dGhpcy4kcmVmcy5ob3ZlclpvbmU7aWYoIWFjdGl2ZU5vZGV8fCFob3ZlclpvbmUpcmV0dXJuO2lmKGFjdGl2ZU5vZGUuY29udGFpbnMoZS50YXJnZXQpKXtjbGVhclRpbWVvdXQoaG92ZXJUaW1lcik7dmFyIF8kZWwkZ2V0Qm91bmRpbmdDbGllbj10aGlzLiRlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxsZWZ0PV8kZWwkZ2V0Qm91bmRpbmdDbGllbi5sZWZ0O3ZhciBzdGFydFg9ZS5jbGllbnRYLWxlZnQ7dmFyIF8kZWw9dGhpcy4kZWwsb2Zmc2V0V2lkdGg9XyRlbC5vZmZzZXRXaWR0aCxvZmZzZXRIZWlnaHQ9XyRlbC5vZmZzZXRIZWlnaHQ7dmFyIHRvcD1hY3RpdmVOb2RlLm9mZnNldFRvcDt2YXIgYm90dG9tPXRvcCthY3RpdmVOb2RlLm9mZnNldEhlaWdodDtob3ZlclpvbmUuaW5uZXJIVE1MPSdcbiAgICAgICAgICA8cGF0aCBzdHlsZT0icG9pbnRlci1ldmVudHM6IGF1dG87IiBmaWxsPSJ0cmFuc3BhcmVudCIgZD0iTScrc3RhcnRYKycgJyt0b3ArJyBMJytvZmZzZXRXaWR0aCsnIDAgVicrdG9wKycgWiIgLz5cbiAgICAgICAgICA8cGF0aCBzdHlsZT0icG9pbnRlci1ldmVudHM6IGF1dG87IiBmaWxsPSJ0cmFuc3BhcmVudCIgZD0iTScrc3RhcnRYKycgJytib3R0b20rJyBMJytvZmZzZXRXaWR0aCsnICcrb2Zmc2V0SGVpZ2h0KycgVicrYm90dG9tKycgWiIgLz5cbiAgICAgICAgJzt9ZWxzZSBpZighaG92ZXJUaW1lcil7dGhpcy5ob3ZlclRpbWVyPXNldFRpbWVvdXQodGhpcy5jbGVhckhvdmVyWm9uZSx0aGlzLnBhbmVsLmNvbmZpZy5ob3ZlclRocmVzaG9sZCk7fX0sY2xlYXJIb3ZlclpvbmU6ZnVuY3Rpb24gY2xlYXJIb3ZlclpvbmUoKXt2YXIgaG92ZXJab25lPXRoaXMuJHJlZnMuaG92ZXJab25lO2lmKCFob3ZlclpvbmUpcmV0dXJuO2hvdmVyWm9uZS5pbm5lckhUTUw9Jyc7fSxyZW5kZXJFbXB0eVRleHQ6ZnVuY3Rpb24gcmVuZGVyRW1wdHlUZXh0KGgpe3JldHVybiBoKCdkaXYnLHsnY2xhc3MnOidlbC1jYXNjYWRlci1tZW51X19lbXB0eS10ZXh0J30sW3RoaXMudCgnZWwuY2FzY2FkZXIubm9EYXRhJyldKTt9LHJlbmRlck5vZGVMaXN0OmZ1bmN0aW9uIHJlbmRlck5vZGVMaXN0KGgpe3ZhciBtZW51SWQ9dGhpcy5tZW51SWQ7dmFyIGlzSG92ZXJNZW51PXRoaXMucGFuZWwuaXNIb3Zlck1lbnU7dmFyIGV2ZW50cz17b246e319O2lmKGlzSG92ZXJNZW51KXtldmVudHMub24uZXhwYW5kPXRoaXMuaGFuZGxlRXhwYW5kO312YXIgbm9kZXM9dGhpcy5ub2Rlcy5tYXAoZnVuY3Rpb24obm9kZSxpbmRleCl7dmFyIGhhc0NoaWxkcmVuPW5vZGUuaGFzQ2hpbGRyZW47cmV0dXJuIGgoJ2Nhc2NhZGVyLW5vZGUnLGV4dGVybmFsX2JhYmVsX2hlbHBlcl92dWVfanN4X21lcmdlX3Byb3BzX2RlZmF1bHQoKShbe2tleTpub2RlLnVpZCxhdHRyczp7bm9kZTpub2RlLCdub2RlLWlkJzptZW51SWQrJy0nK2luZGV4LCdhcmlhLWhhc3BvcHVwJzpoYXNDaGlsZHJlbiwnYXJpYS1vd25zJzpoYXNDaGlsZHJlbj9tZW51SWQ6bnVsbH19LGV2ZW50c10pKTt9KTtyZXR1cm5bXS5jb25jYXQobm9kZXMsW2lzSG92ZXJNZW51P2goJ3N2Zycse3JlZjonaG92ZXJab25lJywnY2xhc3MnOidlbC1jYXNjYWRlci1tZW51X19ob3Zlci16b25lJ30pOm51bGxdKTt9fSxyZW5kZXI6ZnVuY3Rpb24gcmVuZGVyKGgpe3ZhciBpc0VtcHR5PXRoaXMuaXNFbXB0eSxtZW51SWQ9dGhpcy5tZW51SWQ7dmFyIGV2ZW50cz17bmF0aXZlT246e319Oy8vIG9wdGltaXplIGhvdmVyIHRvIGV4cGFuZCBleHBlcmllbmNlICgjODAxMCkKaWYodGhpcy5wYW5lbC5pc0hvdmVyTWVudSl7ZXZlbnRzLm5hdGl2ZU9uLm1vdXNlbW92ZT10aGlzLmhhbmRsZU1vdXNlTW92ZTsvLyBldmVudHMubmF0aXZlT24ubW91c2VsZWF2ZSA9IHRoaXMuY2xlYXJIb3ZlclpvbmU7Cn1yZXR1cm4gaCgnZWwtc2Nyb2xsYmFyJyxleHRlcm5hbF9iYWJlbF9oZWxwZXJfdnVlX2pzeF9tZXJnZV9wcm9wc19kZWZhdWx0KCkoW3thdHRyczp7dGFnOid1bCcscm9sZTonbWVudScsaWQ6bWVudUlkLCd3cmFwLWNsYXNzJzonZWwtY2FzY2FkZXItbWVudV9fd3JhcCcsJ3ZpZXctY2xhc3MnOnsnZWwtY2FzY2FkZXItbWVudV9fbGlzdCc6dHJ1ZSwnaXMtZW1wdHknOmlzRW1wdHl9fSwnY2xhc3MnOidlbC1jYXNjYWRlci1tZW51J30sZXZlbnRzXSksW2lzRW1wdHk/dGhpcy5yZW5kZXJFbXB0eVRleHQoaCk6dGhpcy5yZW5kZXJOb2RlTGlzdChoKV0pO319Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL2Nhc2NhZGVyLW1lbnUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHNyY19jYXNjYWRlcl9tZW51dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPWNhc2NhZGVyX21lbnV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvY2FzY2FkZXItbWVudS52dWUKdmFyIGNhc2NhZGVyX21lbnVfcmVuZGVyLGNhc2NhZGVyX21lbnVfc3RhdGljUmVuZGVyRm5zOy8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgY2FzY2FkZXJfbWVudV9jb21wb25lbnQ9bm9ybWFsaXplQ29tcG9uZW50KHNyY19jYXNjYWRlcl9tZW51dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLGNhc2NhZGVyX21lbnVfcmVuZGVyLGNhc2NhZGVyX21lbnVfc3RhdGljUmVuZGVyRm5zLGZhbHNlLG51bGwsbnVsbCxudWxsKTsvKiBob3QgcmVsb2FkICovaWYoZmFsc2Upe3ZhciBjYXNjYWRlcl9tZW51X2FwaTt9Y2FzY2FkZXJfbWVudV9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGU9InBhY2thZ2VzL2Nhc2NhZGVyLXBhbmVsL3NyYy9jYXNjYWRlci1tZW51LnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBjYXNjYWRlcl9tZW51PWNhc2NhZGVyX21lbnVfY29tcG9uZW50LmV4cG9ydHM7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvbm9kZS5qcwp2YXIgbm9kZV9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoInZhbHVlImluIGRlc2NyaXB0b3IpZGVzY3JpcHRvci53cml0YWJsZT10cnVlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsZGVzY3JpcHRvci5rZXksZGVzY3JpcHRvcik7fX1yZXR1cm4gZnVuY3Rpb24oQ29uc3RydWN0b3IscHJvdG9Qcm9wcyxzdGF0aWNQcm9wcyl7aWYocHJvdG9Qcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSxwcm90b1Byb3BzKTtpZihzdGF0aWNQcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLHN0YXRpY1Byb3BzKTtyZXR1cm4gQ29uc3RydWN0b3I7fTt9KCk7ZnVuY3Rpb24gc3JjX25vZGVfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpO319dmFyIHVpZD0wO3ZhciBzcmNfbm9kZV9Ob2RlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gTm9kZShkYXRhLGNvbmZpZyxwYXJlbnROb2RlKXtzcmNfbm9kZV9jbGFzc0NhbGxDaGVjayh0aGlzLE5vZGUpO3RoaXMuZGF0YT1kYXRhO3RoaXMuY29uZmlnPWNvbmZpZzt0aGlzLnBhcmVudD1wYXJlbnROb2RlfHxudWxsO3RoaXMubGV2ZWw9IXRoaXMucGFyZW50PzE6dGhpcy5wYXJlbnQubGV2ZWwrMTt0aGlzLnVpZD11aWQrKzt0aGlzLmluaXRTdGF0ZSgpO3RoaXMuaW5pdENoaWxkcmVuKCk7fU5vZGUucHJvdG90eXBlLmluaXRTdGF0ZT1mdW5jdGlvbiBpbml0U3RhdGUoKXt2YXIgX2NvbmZpZz10aGlzLmNvbmZpZyx2YWx1ZUtleT1fY29uZmlnLnZhbHVlLGxhYmVsS2V5PV9jb25maWcubGFiZWw7dGhpcy52YWx1ZT10aGlzLmRhdGFbdmFsdWVLZXldO3RoaXMubGFiZWw9dGhpcy5kYXRhW2xhYmVsS2V5XTt0aGlzLnBhdGhOb2Rlcz10aGlzLmNhbGN1bGF0ZVBhdGhOb2RlcygpO3RoaXMucGF0aD10aGlzLnBhdGhOb2Rlcy5tYXAoZnVuY3Rpb24obm9kZSl7cmV0dXJuIG5vZGUudmFsdWU7fSk7dGhpcy5wYXRoTGFiZWxzPXRoaXMucGF0aE5vZGVzLm1hcChmdW5jdGlvbihub2RlKXtyZXR1cm4gbm9kZS5sYWJlbDt9KTsvLyBsYXp5IGxvYWQKdGhpcy5sb2FkaW5nPWZhbHNlO3RoaXMubG9hZGVkPWZhbHNlO307Tm9kZS5wcm90b3R5cGUuaW5pdENoaWxkcmVuPWZ1bmN0aW9uIGluaXRDaGlsZHJlbigpe3ZhciBfdGhpcz10aGlzO3ZhciBjb25maWc9dGhpcy5jb25maWc7dmFyIGNoaWxkcmVuS2V5PWNvbmZpZy5jaGlsZHJlbjt2YXIgY2hpbGRyZW5EYXRhPXRoaXMuZGF0YVtjaGlsZHJlbktleV07dGhpcy5oYXNDaGlsZHJlbj1BcnJheS5pc0FycmF5KGNoaWxkcmVuRGF0YSk7dGhpcy5jaGlsZHJlbj0oY2hpbGRyZW5EYXRhfHxbXSkubWFwKGZ1bmN0aW9uKGNoaWxkKXtyZXR1cm4gbmV3IE5vZGUoY2hpbGQsY29uZmlnLF90aGlzKTt9KTt9O05vZGUucHJvdG90eXBlLmNhbGN1bGF0ZVBhdGhOb2Rlcz1mdW5jdGlvbiBjYWxjdWxhdGVQYXRoTm9kZXMoKXt2YXIgbm9kZXM9W3RoaXNdO3ZhciBwYXJlbnQ9dGhpcy5wYXJlbnQ7d2hpbGUocGFyZW50KXtub2Rlcy51bnNoaWZ0KHBhcmVudCk7cGFyZW50PXBhcmVudC5wYXJlbnQ7fXJldHVybiBub2Rlczt9O05vZGUucHJvdG90eXBlLmdldFBhdGg9ZnVuY3Rpb24gZ2V0UGF0aCgpe3JldHVybiB0aGlzLnBhdGg7fTtOb2RlLnByb3RvdHlwZS5nZXRWYWx1ZT1mdW5jdGlvbiBnZXRWYWx1ZSgpe3JldHVybiB0aGlzLnZhbHVlO307Tm9kZS5wcm90b3R5cGUuZ2V0VmFsdWVCeU9wdGlvbj1mdW5jdGlvbiBnZXRWYWx1ZUJ5T3B0aW9uKCl7cmV0dXJuIHRoaXMuY29uZmlnLmVtaXRQYXRoP3RoaXMuZ2V0UGF0aCgpOnRoaXMuZ2V0VmFsdWUoKTt9O05vZGUucHJvdG90eXBlLmdldFRleHQ9ZnVuY3Rpb24gZ2V0VGV4dChhbGxMZXZlbHMsc2VwYXJhdG9yKXtyZXR1cm4gYWxsTGV2ZWxzP3RoaXMucGF0aExhYmVscy5qb2luKHNlcGFyYXRvcik6dGhpcy5sYWJlbDt9O05vZGUucHJvdG90eXBlLmlzU2FtZU5vZGU9ZnVuY3Rpb24gaXNTYW1lTm9kZShjaGVja2VkVmFsdWUpe3ZhciB2YWx1ZT10aGlzLmdldFZhbHVlQnlPcHRpb24oKTtyZXR1cm4gdGhpcy5jb25maWcubXVsdGlwbGUmJkFycmF5LmlzQXJyYXkoY2hlY2tlZFZhbHVlKT9jaGVja2VkVmFsdWUuc29tZShmdW5jdGlvbih2YWwpe3JldHVybiBPYmplY3QodXRpbF9bImlzRXF1YWwiXSkodmFsLHZhbHVlKTt9KTpPYmplY3QodXRpbF9bImlzRXF1YWwiXSkoY2hlY2tlZFZhbHVlLHZhbHVlKTt9O05vZGUucHJvdG90eXBlLmJyb2FkY2FzdD1mdW5jdGlvbiBicm9hZGNhc3QoZXZlbnQpe2Zvcih2YXIgX2xlbj1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkoX2xlbj4xP19sZW4tMTowKSxfa2V5PTE7X2tleTxfbGVuO19rZXkrKyl7YXJnc1tfa2V5LTFdPWFyZ3VtZW50c1tfa2V5XTt9dmFyIGhhbmRsZXJOYW1lPSdvblBhcmVudCcrT2JqZWN0KHV0aWxfWyJjYXBpdGFsaXplIl0pKGV2ZW50KTt0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oY2hpbGQpe2lmKGNoaWxkKXsvLyBib3R0b20gdXAKY2hpbGQuYnJvYWRjYXN0LmFwcGx5KGNoaWxkLFtldmVudF0uY29uY2F0KGFyZ3MpKTtjaGlsZFtoYW5kbGVyTmFtZV0mJmNoaWxkW2hhbmRsZXJOYW1lXS5hcHBseShjaGlsZCxhcmdzKTt9fSk7fTtOb2RlLnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uIGVtaXQoZXZlbnQpe3ZhciBwYXJlbnQ9dGhpcy5wYXJlbnQ7dmFyIGhhbmRsZXJOYW1lPSdvbkNoaWxkJytPYmplY3QodXRpbF9bImNhcGl0YWxpemUiXSkoZXZlbnQpO2lmKHBhcmVudCl7Zm9yKHZhciBfbGVuMj1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkoX2xlbjI+MT9fbGVuMi0xOjApLF9rZXkyPTE7X2tleTI8X2xlbjI7X2tleTIrKyl7YXJnc1tfa2V5Mi0xXT1hcmd1bWVudHNbX2tleTJdO31wYXJlbnRbaGFuZGxlck5hbWVdJiZwYXJlbnRbaGFuZGxlck5hbWVdLmFwcGx5KHBhcmVudCxhcmdzKTtwYXJlbnQuZW1pdC5hcHBseShwYXJlbnQsW2V2ZW50XS5jb25jYXQoYXJncykpO319O05vZGUucHJvdG90eXBlLm9uUGFyZW50Q2hlY2s9ZnVuY3Rpb24gb25QYXJlbnRDaGVjayhjaGVja2VkKXtpZighdGhpcy5pc0Rpc2FibGVkKXt0aGlzLnNldENoZWNrU3RhdGUoY2hlY2tlZCk7fX07Tm9kZS5wcm90b3R5cGUub25DaGlsZENoZWNrPWZ1bmN0aW9uIG9uQ2hpbGRDaGVjaygpe3ZhciBjaGlsZHJlbj10aGlzLmNoaWxkcmVuO3ZhciB2YWxpZENoaWxkcmVuPWNoaWxkcmVuLmZpbHRlcihmdW5jdGlvbihjaGlsZCl7cmV0dXJuIWNoaWxkLmlzRGlzYWJsZWQ7fSk7dmFyIGNoZWNrZWQ9dmFsaWRDaGlsZHJlbi5sZW5ndGg/dmFsaWRDaGlsZHJlbi5ldmVyeShmdW5jdGlvbihjaGlsZCl7cmV0dXJuIGNoaWxkLmNoZWNrZWQ7fSk6ZmFsc2U7dGhpcy5zZXRDaGVja1N0YXRlKGNoZWNrZWQpO307Tm9kZS5wcm90b3R5cGUuc2V0Q2hlY2tTdGF0ZT1mdW5jdGlvbiBzZXRDaGVja1N0YXRlKGNoZWNrZWQpe3ZhciB0b3RhbE51bT10aGlzLmNoaWxkcmVuLmxlbmd0aDt2YXIgY2hlY2tlZE51bT10aGlzLmNoaWxkcmVuLnJlZHVjZShmdW5jdGlvbihjLHApe3ZhciBudW09cC5jaGVja2VkPzE6cC5pbmRldGVybWluYXRlPzAuNTowO3JldHVybiBjK251bTt9LDApO3RoaXMuY2hlY2tlZD1jaGVja2VkO3RoaXMuaW5kZXRlcm1pbmF0ZT1jaGVja2VkTnVtIT09dG90YWxOdW0mJmNoZWNrZWROdW0+MDt9O05vZGUucHJvdG90eXBlLnN5bmNDaGVja1N0YXRlPWZ1bmN0aW9uIHN5bmNDaGVja1N0YXRlKGNoZWNrZWRWYWx1ZSl7dmFyIHZhbHVlPXRoaXMuZ2V0VmFsdWVCeU9wdGlvbigpO3ZhciBjaGVja2VkPXRoaXMuaXNTYW1lTm9kZShjaGVja2VkVmFsdWUsdmFsdWUpO3RoaXMuZG9DaGVjayhjaGVja2VkKTt9O05vZGUucHJvdG90eXBlLmRvQ2hlY2s9ZnVuY3Rpb24gZG9DaGVjayhjaGVja2VkKXtpZih0aGlzLmNoZWNrZWQhPT1jaGVja2VkKXtpZih0aGlzLmNvbmZpZy5jaGVja1N0cmljdGx5KXt0aGlzLmNoZWNrZWQ9Y2hlY2tlZDt9ZWxzZXsvLyBib3R0b20gdXAgdG8gdW5pZnkgdGhlIGNhbGN1bGF0aW9uIG9mIHRoZSBpbmRldGVybWluYXRlIHN0YXRlCnRoaXMuYnJvYWRjYXN0KCdjaGVjaycsY2hlY2tlZCk7dGhpcy5zZXRDaGVja1N0YXRlKGNoZWNrZWQpO3RoaXMuZW1pdCgnY2hlY2snKTt9fX07bm9kZV9jcmVhdGVDbGFzcyhOb2RlLFt7a2V5Oidpc0Rpc2FibGVkJyxnZXQ6ZnVuY3Rpb24gZ2V0KCl7dmFyIGRhdGE9dGhpcy5kYXRhLHBhcmVudD10aGlzLnBhcmVudCxjb25maWc9dGhpcy5jb25maWc7dmFyIGRpc2FibGVkS2V5PWNvbmZpZy5kaXNhYmxlZDt2YXIgY2hlY2tTdHJpY3RseT1jb25maWcuY2hlY2tTdHJpY3RseTtyZXR1cm4gZGF0YVtkaXNhYmxlZEtleV18fCFjaGVja1N0cmljdGx5JiZwYXJlbnQmJnBhcmVudC5pc0Rpc2FibGVkO319LHtrZXk6J2lzTGVhZicsZ2V0OmZ1bmN0aW9uIGdldCgpe3ZhciBkYXRhPXRoaXMuZGF0YSxsb2FkZWQ9dGhpcy5sb2FkZWQsaGFzQ2hpbGRyZW49dGhpcy5oYXNDaGlsZHJlbixjaGlsZHJlbj10aGlzLmNoaWxkcmVuO3ZhciBfY29uZmlnMj10aGlzLmNvbmZpZyxsYXp5PV9jb25maWcyLmxhenksbGVhZktleT1fY29uZmlnMi5sZWFmO2lmKGxhenkpe3ZhciBpc0xlYWY9T2JqZWN0KHNoYXJlZF9bImlzRGVmIl0pKGRhdGFbbGVhZktleV0pP2RhdGFbbGVhZktleV06bG9hZGVkPyFjaGlsZHJlbi5sZW5ndGg6ZmFsc2U7dGhpcy5oYXNDaGlsZHJlbj0haXNMZWFmO3JldHVybiBpc0xlYWY7fXJldHVybiFoYXNDaGlsZHJlbjt9fV0pO3JldHVybiBOb2RlO30oKTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHNyY19ub2RlPXNyY19ub2RlX05vZGU7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvc3RvcmUuanMKZnVuY3Rpb24gc3RvcmVfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpO319dmFyIGZsYXROb2Rlcz1mdW5jdGlvbiBmbGF0Tm9kZXMoZGF0YSxsZWFmT25seSl7cmV0dXJuIGRhdGEucmVkdWNlKGZ1bmN0aW9uKHJlcyxub2RlKXtpZihub2RlLmlzTGVhZil7cmVzLnB1c2gobm9kZSk7fWVsc2V7IWxlYWZPbmx5JiZyZXMucHVzaChub2RlKTtyZXM9cmVzLmNvbmNhdChmbGF0Tm9kZXMobm9kZS5jaGlsZHJlbixsZWFmT25seSkpO31yZXR1cm4gcmVzO30sW10pO307dmFyIHN0b3JlX1N0b3JlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gU3RvcmUoZGF0YSxjb25maWcpe3N0b3JlX2NsYXNzQ2FsbENoZWNrKHRoaXMsU3RvcmUpO3RoaXMuY29uZmlnPWNvbmZpZzt0aGlzLmluaXROb2RlcyhkYXRhKTt9U3RvcmUucHJvdG90eXBlLmluaXROb2Rlcz1mdW5jdGlvbiBpbml0Tm9kZXMoZGF0YSl7dmFyIF90aGlzPXRoaXM7ZGF0YT1PYmplY3QodXRpbF9bImNvZXJjZVRydXRoeVZhbHVlVG9BcnJheSJdKShkYXRhKTt0aGlzLm5vZGVzPWRhdGEubWFwKGZ1bmN0aW9uKG5vZGVEYXRhKXtyZXR1cm4gbmV3IHNyY19ub2RlKG5vZGVEYXRhLF90aGlzLmNvbmZpZyk7fSk7dGhpcy5mbGF0dGVkTm9kZXM9dGhpcy5nZXRGbGF0dGVkTm9kZXMoZmFsc2UsZmFsc2UpO3RoaXMubGVhZk5vZGVzPXRoaXMuZ2V0RmxhdHRlZE5vZGVzKHRydWUsZmFsc2UpO307U3RvcmUucHJvdG90eXBlLmFwcGVuZE5vZGU9ZnVuY3Rpb24gYXBwZW5kTm9kZShub2RlRGF0YSxwYXJlbnROb2RlKXt2YXIgbm9kZT1uZXcgc3JjX25vZGUobm9kZURhdGEsdGhpcy5jb25maWcscGFyZW50Tm9kZSk7dmFyIGNoaWxkcmVuPXBhcmVudE5vZGU/cGFyZW50Tm9kZS5jaGlsZHJlbjp0aGlzLm5vZGVzO2NoaWxkcmVuLnB1c2gobm9kZSk7fTtTdG9yZS5wcm90b3R5cGUuYXBwZW5kTm9kZXM9ZnVuY3Rpb24gYXBwZW5kTm9kZXMobm9kZURhdGFMaXN0LHBhcmVudE5vZGUpe3ZhciBfdGhpczI9dGhpcztub2RlRGF0YUxpc3Q9T2JqZWN0KHV0aWxfWyJjb2VyY2VUcnV0aHlWYWx1ZVRvQXJyYXkiXSkobm9kZURhdGFMaXN0KTtub2RlRGF0YUxpc3QuZm9yRWFjaChmdW5jdGlvbihub2RlRGF0YSl7cmV0dXJuIF90aGlzMi5hcHBlbmROb2RlKG5vZGVEYXRhLHBhcmVudE5vZGUpO30pO307U3RvcmUucHJvdG90eXBlLmdldE5vZGVzPWZ1bmN0aW9uIGdldE5vZGVzKCl7cmV0dXJuIHRoaXMubm9kZXM7fTtTdG9yZS5wcm90b3R5cGUuZ2V0RmxhdHRlZE5vZGVzPWZ1bmN0aW9uIGdldEZsYXR0ZWROb2RlcyhsZWFmT25seSl7dmFyIGNhY2hlZD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMV06dHJ1ZTt2YXIgY2FjaGVkTm9kZXM9bGVhZk9ubHk/dGhpcy5sZWFmTm9kZXM6dGhpcy5mbGF0dGVkTm9kZXM7cmV0dXJuIGNhY2hlZD9jYWNoZWROb2RlczpmbGF0Tm9kZXModGhpcy5ub2RlcyxsZWFmT25seSk7fTtTdG9yZS5wcm90b3R5cGUuZ2V0Tm9kZUJ5VmFsdWU9ZnVuY3Rpb24gZ2V0Tm9kZUJ5VmFsdWUodmFsdWUpe2lmKHZhbHVlKXt2YXIgbm9kZXM9dGhpcy5nZXRGbGF0dGVkTm9kZXMoZmFsc2UsIXRoaXMuY29uZmlnLmxhenkpLmZpbHRlcihmdW5jdGlvbihub2RlKXtyZXR1cm4gT2JqZWN0KHV0aWxfWyJ2YWx1ZUVxdWFscyJdKShub2RlLnBhdGgsdmFsdWUpfHxub2RlLnZhbHVlPT09dmFsdWU7fSk7cmV0dXJuIG5vZGVzJiZub2Rlcy5sZW5ndGg/bm9kZXNbMF06bnVsbDt9cmV0dXJuIG51bGw7fTtyZXR1cm4gU3RvcmU7fSgpOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgY2FzY2FkZXJfcGFuZWxfc3JjX3N0b3JlPXN0b3JlX1N0b3JlOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2Nhc2NhZGVyLXBhbmVsL3NyYy9jYXNjYWRlci1wYW5lbC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCnZhciBjYXNjYWRlcl9wYW5lbHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2V4dGVuZHM9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odGFyZ2V0KXtmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXt2YXIgc291cmNlPWFyZ3VtZW50c1tpXTtmb3IodmFyIGtleSBpbiBzb3VyY2Upe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2Usa2V5KSl7dGFyZ2V0W2tleV09c291cmNlW2tleV07fX19cmV0dXJuIHRhcmdldDt9Oy8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCnZhciBjYXNjYWRlcl9wYW5lbHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX0tleUNvZGU9YXJpYV91dGlsc19kZWZhdWx0LmEua2V5czt2YXIgRGVmYXVsdFByb3BzPXtleHBhbmRUcmlnZ2VyOidjbGljaycsLy8gb3IgaG92ZXIKbXVsdGlwbGU6ZmFsc2UsY2hlY2tTdHJpY3RseTpmYWxzZSwvLyB3aGV0aGVyIGFsbCBub2RlcyBjYW4gYmUgc2VsZWN0ZWQKZW1pdFBhdGg6dHJ1ZSwvLyB3ZXRoZXIgdG8gZW1pdCBhbiBhcnJheSBvZiBhbGwgbGV2ZWxzIHZhbHVlIGluIHdoaWNoIG5vZGUgaXMgbG9jYXRlZApsYXp5OmZhbHNlLGxhenlMb2FkOnV0aWxfWyJub29wIl0sdmFsdWU6J3ZhbHVlJyxsYWJlbDonbGFiZWwnLGNoaWxkcmVuOidjaGlsZHJlbicsbGVhZjonbGVhZicsZGlzYWJsZWQ6J2Rpc2FibGVkJyxob3ZlclRocmVzaG9sZDo1MDB9O3ZhciBjYXNjYWRlcl9wYW5lbHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2lzTGVhZj1mdW5jdGlvbiBpc0xlYWYoZWwpe3JldHVybiFlbC5nZXRBdHRyaWJ1dGUoJ2FyaWEtb3ducycpO307dmFyIGdldFNpYmxpbmc9ZnVuY3Rpb24gZ2V0U2libGluZyhlbCxkaXN0YW5jZSl7dmFyIHBhcmVudE5vZGU9ZWwucGFyZW50Tm9kZTtpZihwYXJlbnROb2RlKXt2YXIgc2libGluZ3M9cGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKCcuZWwtY2FzY2FkZXItbm9kZVt0YWJpbmRleD0iLTEiXScpO3ZhciBpbmRleD1BcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHNpYmxpbmdzLGVsKTtyZXR1cm4gc2libGluZ3NbaW5kZXgrZGlzdGFuY2VdfHxudWxsO31yZXR1cm4gbnVsbDt9O3ZhciBnZXRNZW51SW5kZXg9ZnVuY3Rpb24gZ2V0TWVudUluZGV4KGVsLGRpc3RhbmNlKXtpZighZWwpcmV0dXJuO3ZhciBwaWVjZXM9ZWwuaWQuc3BsaXQoJy0nKTtyZXR1cm4gTnVtYmVyKHBpZWNlc1twaWVjZXMubGVuZ3RoLTJdKTt9O3ZhciBmb2N1c05vZGU9ZnVuY3Rpb24gZm9jdXNOb2RlKGVsKXtpZighZWwpcmV0dXJuO2VsLmZvY3VzKCk7IWNhc2NhZGVyX3BhbmVsdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfaXNMZWFmKGVsKSYmZWwuY2xpY2soKTt9O3ZhciBjaGVja05vZGU9ZnVuY3Rpb24gY2hlY2tOb2RlKGVsKXtpZighZWwpcmV0dXJuO3ZhciBpbnB1dD1lbC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO2lmKGlucHV0KXtpbnB1dC5jbGljaygpO31lbHNlIGlmKGNhc2NhZGVyX3BhbmVsdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfaXNMZWFmKGVsKSl7ZWwuY2xpY2soKTt9fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGNhc2NhZGVyX3BhbmVsdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbENhc2NhZGVyUGFuZWwnLGNvbXBvbmVudHM6e0Nhc2NhZGVyTWVudTpjYXNjYWRlcl9tZW51fSxwcm9wczp7dmFsdWU6e30sb3B0aW9uczpBcnJheSxwcm9wczpPYmplY3QsYm9yZGVyOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDp0cnVlfSxyZW5kZXJMYWJlbDpGdW5jdGlvbn0scHJvdmlkZTpmdW5jdGlvbiBwcm92aWRlKCl7cmV0dXJue3BhbmVsOnRoaXN9O30sZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue2NoZWNrZWRWYWx1ZTpudWxsLGNoZWNrZWROb2RlUGF0aHM6W10sc3RvcmU6W10sbWVudXM6W10sYWN0aXZlUGF0aDpbXSxsb2FkQ291bnQ6MH07fSxjb21wdXRlZDp7Y29uZmlnOmZ1bmN0aW9uIGNvbmZpZygpe3JldHVybiBtZXJnZV9kZWZhdWx0KCkoY2FzY2FkZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19leHRlbmRzKHt9LERlZmF1bHRQcm9wcyksdGhpcy5wcm9wc3x8e30pO30sbXVsdGlwbGU6ZnVuY3Rpb24gbXVsdGlwbGUoKXtyZXR1cm4gdGhpcy5jb25maWcubXVsdGlwbGU7fSxjaGVja1N0cmljdGx5OmZ1bmN0aW9uIGNoZWNrU3RyaWN0bHkoKXtyZXR1cm4gdGhpcy5jb25maWcuY2hlY2tTdHJpY3RseTt9LGxlYWZPbmx5OmZ1bmN0aW9uIGxlYWZPbmx5KCl7cmV0dXJuIXRoaXMuY2hlY2tTdHJpY3RseTt9LGlzSG92ZXJNZW51OmZ1bmN0aW9uIGlzSG92ZXJNZW51KCl7cmV0dXJuIHRoaXMuY29uZmlnLmV4cGFuZFRyaWdnZXI9PT0naG92ZXInO30scmVuZGVyTGFiZWxGbjpmdW5jdGlvbiByZW5kZXJMYWJlbEZuKCl7cmV0dXJuIHRoaXMucmVuZGVyTGFiZWx8fHRoaXMuJHNjb3BlZFNsb3RzLmRlZmF1bHQ7fX0sd2F0Y2g6e29wdGlvbnM6e2hhbmRsZXI6ZnVuY3Rpb24gaGFuZGxlcigpe3RoaXMuaW5pdFN0b3JlKCk7fSxpbW1lZGlhdGU6dHJ1ZSxkZWVwOnRydWV9LHZhbHVlOmZ1bmN0aW9uIHZhbHVlKCl7dGhpcy5zeW5jQ2hlY2tlZFZhbHVlKCk7dGhpcy5jaGVja1N0cmljdGx5JiZ0aGlzLmNhbGN1bGF0ZUNoZWNrZWROb2RlUGF0aHMoKTt9LGNoZWNrZWRWYWx1ZTpmdW5jdGlvbiBjaGVja2VkVmFsdWUodmFsKXtpZighT2JqZWN0KHV0aWxfWyJpc0VxdWFsIl0pKHZhbCx0aGlzLnZhbHVlKSl7dGhpcy5jaGVja1N0cmljdGx5JiZ0aGlzLmNhbGN1bGF0ZUNoZWNrZWROb2RlUGF0aHMoKTt0aGlzLiRlbWl0KCdpbnB1dCcsdmFsKTt0aGlzLiRlbWl0KCdjaGFuZ2UnLHZhbCk7fX19LG1vdW50ZWQ6ZnVuY3Rpb24gbW91bnRlZCgpe2lmKCFPYmplY3QodXRpbF9bImlzRW1wdHkiXSkodGhpcy52YWx1ZSkpe3RoaXMuc3luY0NoZWNrZWRWYWx1ZSgpO319LG1ldGhvZHM6e2luaXRTdG9yZTpmdW5jdGlvbiBpbml0U3RvcmUoKXt2YXIgY29uZmlnPXRoaXMuY29uZmlnLG9wdGlvbnM9dGhpcy5vcHRpb25zO2lmKGNvbmZpZy5sYXp5JiZPYmplY3QodXRpbF9bImlzRW1wdHkiXSkob3B0aW9ucykpe3RoaXMubGF6eUxvYWQoKTt9ZWxzZXt0aGlzLnN0b3JlPW5ldyBjYXNjYWRlcl9wYW5lbF9zcmNfc3RvcmUob3B0aW9ucyxjb25maWcpO3RoaXMubWVudXM9W3RoaXMuc3RvcmUuZ2V0Tm9kZXMoKV07dGhpcy5zeW5jTWVudVN0YXRlKCk7fX0sc3luY0NoZWNrZWRWYWx1ZTpmdW5jdGlvbiBzeW5jQ2hlY2tlZFZhbHVlKCl7dmFyIHZhbHVlPXRoaXMudmFsdWUsY2hlY2tlZFZhbHVlPXRoaXMuY2hlY2tlZFZhbHVlO2lmKCFPYmplY3QodXRpbF9bImlzRXF1YWwiXSkodmFsdWUsY2hlY2tlZFZhbHVlKSl7dGhpcy5jaGVja2VkVmFsdWU9dmFsdWU7dGhpcy5zeW5jTWVudVN0YXRlKCk7fX0sc3luY01lbnVTdGF0ZTpmdW5jdGlvbiBzeW5jTWVudVN0YXRlKCl7dmFyIG11bHRpcGxlPXRoaXMubXVsdGlwbGUsY2hlY2tTdHJpY3RseT10aGlzLmNoZWNrU3RyaWN0bHk7dGhpcy5zeW5jQWN0aXZlUGF0aCgpO211bHRpcGxlJiZ0aGlzLnN5bmNNdWx0aUNoZWNrU3RhdGUoKTtjaGVja1N0cmljdGx5JiZ0aGlzLmNhbGN1bGF0ZUNoZWNrZWROb2RlUGF0aHMoKTt0aGlzLiRuZXh0VGljayh0aGlzLnNjcm9sbEludG9WaWV3KTt9LHN5bmNNdWx0aUNoZWNrU3RhdGU6ZnVuY3Rpb24gc3luY011bHRpQ2hlY2tTdGF0ZSgpe3ZhciBfdGhpcz10aGlzO3ZhciBub2Rlcz10aGlzLmdldEZsYXR0ZWROb2Rlcyh0aGlzLmxlYWZPbmx5KTtub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUpe25vZGUuc3luY0NoZWNrU3RhdGUoX3RoaXMuY2hlY2tlZFZhbHVlKTt9KTt9LHN5bmNBY3RpdmVQYXRoOmZ1bmN0aW9uIHN5bmNBY3RpdmVQYXRoKCl7dmFyIF90aGlzMj10aGlzO3ZhciBzdG9yZT10aGlzLnN0b3JlLG11bHRpcGxlPXRoaXMubXVsdGlwbGUsYWN0aXZlUGF0aD10aGlzLmFjdGl2ZVBhdGgsY2hlY2tlZFZhbHVlPXRoaXMuY2hlY2tlZFZhbHVlO2lmKCFPYmplY3QodXRpbF9bImlzRW1wdHkiXSkoYWN0aXZlUGF0aCkpe3ZhciBub2Rlcz1hY3RpdmVQYXRoLm1hcChmdW5jdGlvbihub2RlKXtyZXR1cm4gX3RoaXMyLmdldE5vZGVCeVZhbHVlKG5vZGUuZ2V0VmFsdWUoKSk7fSk7dGhpcy5leHBhbmROb2Rlcyhub2Rlcyk7fWVsc2UgaWYoIU9iamVjdCh1dGlsX1siaXNFbXB0eSJdKShjaGVja2VkVmFsdWUpKXt2YXIgdmFsdWU9bXVsdGlwbGU/Y2hlY2tlZFZhbHVlWzBdOmNoZWNrZWRWYWx1ZTt2YXIgY2hlY2tlZE5vZGU9dGhpcy5nZXROb2RlQnlWYWx1ZSh2YWx1ZSl8fHt9O3ZhciBfbm9kZXM9KGNoZWNrZWROb2RlLnBhdGhOb2Rlc3x8W10pLnNsaWNlKDAsLTEpO3RoaXMuZXhwYW5kTm9kZXMoX25vZGVzKTt9ZWxzZXt0aGlzLmFjdGl2ZVBhdGg9W107dGhpcy5tZW51cz1bc3RvcmUuZ2V0Tm9kZXMoKV07fX0sZXhwYW5kTm9kZXM6ZnVuY3Rpb24gZXhwYW5kTm9kZXMobm9kZXMpe3ZhciBfdGhpczM9dGhpcztub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUpe3JldHVybiBfdGhpczMuaGFuZGxlRXhwYW5kKG5vZGUsdHJ1ZS8qIHNpbGVudCAqLyk7fSk7fSxjYWxjdWxhdGVDaGVja2VkTm9kZVBhdGhzOmZ1bmN0aW9uIGNhbGN1bGF0ZUNoZWNrZWROb2RlUGF0aHMoKXt2YXIgX3RoaXM0PXRoaXM7dmFyIGNoZWNrZWRWYWx1ZT10aGlzLmNoZWNrZWRWYWx1ZSxtdWx0aXBsZT10aGlzLm11bHRpcGxlO3ZhciBjaGVja2VkVmFsdWVzPW11bHRpcGxlP09iamVjdCh1dGlsX1siY29lcmNlVHJ1dGh5VmFsdWVUb0FycmF5Il0pKGNoZWNrZWRWYWx1ZSk6W2NoZWNrZWRWYWx1ZV07dGhpcy5jaGVja2VkTm9kZVBhdGhzPWNoZWNrZWRWYWx1ZXMubWFwKGZ1bmN0aW9uKHYpe3ZhciBjaGVja2VkTm9kZT1fdGhpczQuZ2V0Tm9kZUJ5VmFsdWUodik7cmV0dXJuIGNoZWNrZWROb2RlP2NoZWNrZWROb2RlLnBhdGhOb2RlczpbXTt9KTt9LGhhbmRsZUtleURvd246ZnVuY3Rpb24gaGFuZGxlS2V5RG93bihlKXt2YXIgdGFyZ2V0PWUudGFyZ2V0LGtleUNvZGU9ZS5rZXlDb2RlO3N3aXRjaChrZXlDb2RlKXtjYXNlIGNhc2NhZGVyX3BhbmVsdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfS2V5Q29kZS51cDp2YXIgcHJldj1nZXRTaWJsaW5nKHRhcmdldCwtMSk7Zm9jdXNOb2RlKHByZXYpO2JyZWFrO2Nhc2UgY2FzY2FkZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19LZXlDb2RlLmRvd246dmFyIG5leHQ9Z2V0U2libGluZyh0YXJnZXQsMSk7Zm9jdXNOb2RlKG5leHQpO2JyZWFrO2Nhc2UgY2FzY2FkZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19LZXlDb2RlLmxlZnQ6dmFyIHByZU1lbnU9dGhpcy4kcmVmcy5tZW51W2dldE1lbnVJbmRleCh0YXJnZXQpLTFdO2lmKHByZU1lbnUpe3ZhciBleHBhbmRlZE5vZGU9cHJlTWVudS4kZWwucXVlcnlTZWxlY3RvcignLmVsLWNhc2NhZGVyLW5vZGVbYXJpYS1leHBhbmRlZD0idHJ1ZSJdJyk7Zm9jdXNOb2RlKGV4cGFuZGVkTm9kZSk7fWJyZWFrO2Nhc2UgY2FzY2FkZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19LZXlDb2RlLnJpZ2h0OnZhciBuZXh0TWVudT10aGlzLiRyZWZzLm1lbnVbZ2V0TWVudUluZGV4KHRhcmdldCkrMV07aWYobmV4dE1lbnUpe3ZhciBmaXJzdE5vZGU9bmV4dE1lbnUuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5lbC1jYXNjYWRlci1ub2RlW3RhYmluZGV4PSItMSJdJyk7Zm9jdXNOb2RlKGZpcnN0Tm9kZSk7fWJyZWFrO2Nhc2UgY2FzY2FkZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19LZXlDb2RlLmVudGVyOmNoZWNrTm9kZSh0YXJnZXQpO2JyZWFrO2Nhc2UgY2FzY2FkZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19LZXlDb2RlLmVzYzpjYXNlIGNhc2NhZGVyX3BhbmVsdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfS2V5Q29kZS50YWI6dGhpcy4kZW1pdCgnY2xvc2UnKTticmVhaztkZWZhdWx0OnJldHVybjt9fSxoYW5kbGVFeHBhbmQ6ZnVuY3Rpb24gaGFuZGxlRXhwYW5kKG5vZGUsc2lsZW50KXt2YXIgYWN0aXZlUGF0aD10aGlzLmFjdGl2ZVBhdGg7dmFyIGxldmVsPW5vZGUubGV2ZWw7dmFyIHBhdGg9YWN0aXZlUGF0aC5zbGljZSgwLGxldmVsLTEpO3ZhciBtZW51cz10aGlzLm1lbnVzLnNsaWNlKDAsbGV2ZWwpO2lmKCFub2RlLmlzTGVhZil7cGF0aC5wdXNoKG5vZGUpO21lbnVzLnB1c2gobm9kZS5jaGlsZHJlbik7fXRoaXMuYWN0aXZlUGF0aD1wYXRoO3RoaXMubWVudXM9bWVudXM7aWYoIXNpbGVudCl7dmFyIHBhdGhWYWx1ZXM9cGF0aC5tYXAoZnVuY3Rpb24obm9kZSl7cmV0dXJuIG5vZGUuZ2V0VmFsdWUoKTt9KTt2YXIgYWN0aXZlUGF0aFZhbHVlcz1hY3RpdmVQYXRoLm1hcChmdW5jdGlvbihub2RlKXtyZXR1cm4gbm9kZS5nZXRWYWx1ZSgpO30pO2lmKCFPYmplY3QodXRpbF9bInZhbHVlRXF1YWxzIl0pKHBhdGhWYWx1ZXMsYWN0aXZlUGF0aFZhbHVlcykpe3RoaXMuJGVtaXQoJ2FjdGl2ZS1pdGVtLWNoYW5nZScscGF0aFZhbHVlcyk7Ly8gRGVwcmVjYXRlZAp0aGlzLiRlbWl0KCdleHBhbmQtY2hhbmdlJyxwYXRoVmFsdWVzKTt9fX0saGFuZGxlQ2hlY2tDaGFuZ2U6ZnVuY3Rpb24gaGFuZGxlQ2hlY2tDaGFuZ2UodmFsdWUpe3RoaXMuY2hlY2tlZFZhbHVlPXZhbHVlO30sbGF6eUxvYWQ6ZnVuY3Rpb24gbGF6eUxvYWQobm9kZSxvbkZ1bGxmaWxlZCl7dmFyIF90aGlzNT10aGlzO3ZhciBjb25maWc9dGhpcy5jb25maWc7aWYoIW5vZGUpe25vZGU9bm9kZXx8e3Jvb3Q6dHJ1ZSxsZXZlbDowfTt0aGlzLnN0b3JlPW5ldyBjYXNjYWRlcl9wYW5lbF9zcmNfc3RvcmUoW10sY29uZmlnKTt0aGlzLm1lbnVzPVt0aGlzLnN0b3JlLmdldE5vZGVzKCldO31ub2RlLmxvYWRpbmc9dHJ1ZTt2YXIgcmVzb2x2ZT1mdW5jdGlvbiByZXNvbHZlKGRhdGFMaXN0KXt2YXIgcGFyZW50PW5vZGUucm9vdD9udWxsOm5vZGU7ZGF0YUxpc3QmJmRhdGFMaXN0Lmxlbmd0aCYmX3RoaXM1LnN0b3JlLmFwcGVuZE5vZGVzKGRhdGFMaXN0LHBhcmVudCk7bm9kZS5sb2FkaW5nPWZhbHNlO25vZGUubG9hZGVkPXRydWU7Ly8gZGlzcG9zZSBkZWZhdWx0IHZhbHVlIG9uIGxhenkgbG9hZCBtb2RlCmlmKEFycmF5LmlzQXJyYXkoX3RoaXM1LmNoZWNrZWRWYWx1ZSkpe3ZhciBub2RlVmFsdWU9X3RoaXM1LmNoZWNrZWRWYWx1ZVtfdGhpczUubG9hZENvdW50KytdO3ZhciB2YWx1ZUtleT1fdGhpczUuY29uZmlnLnZhbHVlO3ZhciBsZWFmS2V5PV90aGlzNS5jb25maWcubGVhZjtpZihBcnJheS5pc0FycmF5KGRhdGFMaXN0KSYmZGF0YUxpc3QuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pe3JldHVybiBpdGVtW3ZhbHVlS2V5XT09PW5vZGVWYWx1ZTt9KS5sZW5ndGg+MCl7dmFyIGNoZWNrZWROb2RlPV90aGlzNS5zdG9yZS5nZXROb2RlQnlWYWx1ZShub2RlVmFsdWUpO2lmKCFjaGVja2VkTm9kZS5kYXRhW2xlYWZLZXldKXtfdGhpczUubGF6eUxvYWQoY2hlY2tlZE5vZGUsZnVuY3Rpb24oKXtfdGhpczUuaGFuZGxlRXhwYW5kKGNoZWNrZWROb2RlKTt9KTt9aWYoX3RoaXM1LmxvYWRDb3VudD09PV90aGlzNS5jaGVja2VkVmFsdWUubGVuZ3RoKXtfdGhpczUuJHBhcmVudC5jb21wdXRlUHJlc2VudFRleHQoKTt9fX1vbkZ1bGxmaWxlZCYmb25GdWxsZmlsZWQoZGF0YUxpc3QpO307Y29uZmlnLmxhenlMb2FkKG5vZGUscmVzb2x2ZSk7fSwvKioKICAgICAqIHB1YmxpYyBtZXRob2RzCiAgICAqL2NhbGN1bGF0ZU11bHRpQ2hlY2tlZFZhbHVlOmZ1bmN0aW9uIGNhbGN1bGF0ZU11bHRpQ2hlY2tlZFZhbHVlKCl7dGhpcy5jaGVja2VkVmFsdWU9dGhpcy5nZXRDaGVja2VkTm9kZXModGhpcy5sZWFmT25seSkubWFwKGZ1bmN0aW9uKG5vZGUpe3JldHVybiBub2RlLmdldFZhbHVlQnlPcHRpb24oKTt9KTt9LHNjcm9sbEludG9WaWV3OmZ1bmN0aW9uIHNjcm9sbEludG9WaWV3KCl7aWYodGhpcy4kaXNTZXJ2ZXIpcmV0dXJuO3ZhciBtZW51cz10aGlzLiRyZWZzLm1lbnV8fFtdO21lbnVzLmZvckVhY2goZnVuY3Rpb24obWVudSl7dmFyIG1lbnVFbGVtZW50PW1lbnUuJGVsO2lmKG1lbnVFbGVtZW50KXt2YXIgY29udGFpbmVyPW1lbnVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5lbC1zY3JvbGxiYXJfX3dyYXAnKTt2YXIgYWN0aXZlTm9kZT1tZW51RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuZWwtY2FzY2FkZXItbm9kZS5pcy1hY3RpdmUnKXx8bWVudUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmVsLWNhc2NhZGVyLW5vZGUuaW4tYWN0aXZlLXBhdGgnKTtzY3JvbGxfaW50b192aWV3X2RlZmF1bHQoKShjb250YWluZXIsYWN0aXZlTm9kZSk7fX0pO30sZ2V0Tm9kZUJ5VmFsdWU6ZnVuY3Rpb24gZ2V0Tm9kZUJ5VmFsdWUodmFsKXtyZXR1cm4gdGhpcy5zdG9yZS5nZXROb2RlQnlWYWx1ZSh2YWwpO30sZ2V0RmxhdHRlZE5vZGVzOmZ1bmN0aW9uIGdldEZsYXR0ZWROb2RlcyhsZWFmT25seSl7dmFyIGNhY2hlZD0hdGhpcy5jb25maWcubGF6eTtyZXR1cm4gdGhpcy5zdG9yZS5nZXRGbGF0dGVkTm9kZXMobGVhZk9ubHksY2FjaGVkKTt9LGdldENoZWNrZWROb2RlczpmdW5jdGlvbiBnZXRDaGVja2VkTm9kZXMobGVhZk9ubHkpe3ZhciBjaGVja2VkVmFsdWU9dGhpcy5jaGVja2VkVmFsdWUsbXVsdGlwbGU9dGhpcy5tdWx0aXBsZTtpZihtdWx0aXBsZSl7dmFyIG5vZGVzPXRoaXMuZ2V0RmxhdHRlZE5vZGVzKGxlYWZPbmx5KTtyZXR1cm4gbm9kZXMuZmlsdGVyKGZ1bmN0aW9uKG5vZGUpe3JldHVybiBub2RlLmNoZWNrZWQ7fSk7fWVsc2V7cmV0dXJuIE9iamVjdCh1dGlsX1siaXNFbXB0eSJdKShjaGVja2VkVmFsdWUpP1tdOlt0aGlzLmdldE5vZGVCeVZhbHVlKGNoZWNrZWRWYWx1ZSldO319LGNsZWFyQ2hlY2tlZE5vZGVzOmZ1bmN0aW9uIGNsZWFyQ2hlY2tlZE5vZGVzKCl7dmFyIGNvbmZpZz10aGlzLmNvbmZpZyxsZWFmT25seT10aGlzLmxlYWZPbmx5O3ZhciBtdWx0aXBsZT1jb25maWcubXVsdGlwbGUsZW1pdFBhdGg9Y29uZmlnLmVtaXRQYXRoO2lmKG11bHRpcGxlKXt0aGlzLmdldENoZWNrZWROb2RlcyhsZWFmT25seSkuZmlsdGVyKGZ1bmN0aW9uKG5vZGUpe3JldHVybiFub2RlLmlzRGlzYWJsZWQ7fSkuZm9yRWFjaChmdW5jdGlvbihub2RlKXtyZXR1cm4gbm9kZS5kb0NoZWNrKGZhbHNlKTt9KTt0aGlzLmNhbGN1bGF0ZU11bHRpQ2hlY2tlZFZhbHVlKCk7fWVsc2V7dGhpcy5jaGVja2VkVmFsdWU9ZW1pdFBhdGg/W106bnVsbDt9fX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL2Nhc2NhZGVyLXBhbmVsLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfY2FzY2FkZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189Y2FzY2FkZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvY2FzY2FkZXItcGFuZWwudnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgY2FzY2FkZXJfcGFuZWxfY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChzcmNfY2FzY2FkZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sY2FzY2FkZXJfcGFuZWx2dWVfdHlwZV90ZW1wbGF0ZV9pZF8zNDkzMjM0Nl9yZW5kZXIsY2FzY2FkZXJfcGFuZWx2dWVfdHlwZV90ZW1wbGF0ZV9pZF8zNDkzMjM0Nl9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIGNhc2NhZGVyX3BhbmVsX2FwaTt9Y2FzY2FkZXJfcGFuZWxfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlPSJwYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvY2FzY2FkZXItcGFuZWwudnVlIjsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGNhc2NhZGVyX3BhbmVsPWNhc2NhZGVyX3BhbmVsX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FzY2FkZXItcGFuZWwvaW5kZXguanMKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9jYXNjYWRlcl9wYW5lbC5pbnN0YWxsPWZ1bmN0aW9uKFZ1ZSl7VnVlLmNvbXBvbmVudChjYXNjYWRlcl9wYW5lbC5uYW1lLGNhc2NhZGVyX3BhbmVsKTt9Oy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFja2FnZXNfY2FzY2FkZXJfcGFuZWw9Y2FzY2FkZXJfcGFuZWw7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvYXZhdGFyL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBhdmF0YXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc189e25hbWU6J0VsQXZhdGFyJyxwcm9wczp7c2l6ZTp7dHlwZTpbTnVtYmVyLFN0cmluZ10sdmFsaWRhdG9yOmZ1bmN0aW9uIHZhbGlkYXRvcih2YWwpe2lmKHR5cGVvZiB2YWw9PT0nc3RyaW5nJyl7cmV0dXJuWydsYXJnZScsJ21lZGl1bScsJ3NtYWxsJ10uaW5jbHVkZXModmFsKTt9cmV0dXJuIHR5cGVvZiB2YWw9PT0nbnVtYmVyJzt9fSxzaGFwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDonY2lyY2xlJyx2YWxpZGF0b3I6ZnVuY3Rpb24gdmFsaWRhdG9yKHZhbCl7cmV0dXJuWydjaXJjbGUnLCdzcXVhcmUnXS5pbmNsdWRlcyh2YWwpO319LGljb246U3RyaW5nLHNyYzpTdHJpbmcsYWx0OlN0cmluZyxzcmNTZXQ6U3RyaW5nLGVycm9yOkZ1bmN0aW9uLGZpdDp7dHlwZTpTdHJpbmcsZGVmYXVsdDonY292ZXInfX0sZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue2lzSW1hZ2VFeGlzdDp0cnVlfTt9LGNvbXB1dGVkOnthdmF0YXJDbGFzczpmdW5jdGlvbiBhdmF0YXJDbGFzcygpe3ZhciBzaXplPXRoaXMuc2l6ZSxpY29uPXRoaXMuaWNvbixzaGFwZT10aGlzLnNoYXBlO3ZhciBjbGFzc0xpc3Q9WydlbC1hdmF0YXInXTtpZihzaXplJiZ0eXBlb2Ygc2l6ZT09PSdzdHJpbmcnKXtjbGFzc0xpc3QucHVzaCgnZWwtYXZhdGFyLS0nK3NpemUpO31pZihpY29uKXtjbGFzc0xpc3QucHVzaCgnZWwtYXZhdGFyLS1pY29uJyk7fWlmKHNoYXBlKXtjbGFzc0xpc3QucHVzaCgnZWwtYXZhdGFyLS0nK3NoYXBlKTt9cmV0dXJuIGNsYXNzTGlzdC5qb2luKCcgJyk7fX0sbWV0aG9kczp7aGFuZGxlRXJyb3I6ZnVuY3Rpb24gaGFuZGxlRXJyb3IoKXt2YXIgZXJyb3I9dGhpcy5lcnJvcjt2YXIgZXJyb3JGbGFnPWVycm9yP2Vycm9yKCk6dW5kZWZpbmVkO2lmKGVycm9yRmxhZyE9PWZhbHNlKXt0aGlzLmlzSW1hZ2VFeGlzdD1mYWxzZTt9fSxyZW5kZXJBdmF0YXI6ZnVuY3Rpb24gcmVuZGVyQXZhdGFyKCl7dmFyIGg9dGhpcy4kY3JlYXRlRWxlbWVudDt2YXIgaWNvbj10aGlzLmljb24sc3JjPXRoaXMuc3JjLGFsdD10aGlzLmFsdCxpc0ltYWdlRXhpc3Q9dGhpcy5pc0ltYWdlRXhpc3Qsc3JjU2V0PXRoaXMuc3JjU2V0LGZpdD10aGlzLmZpdDtpZihpc0ltYWdlRXhpc3QmJnNyYyl7cmV0dXJuIGgoJ2ltZycse2F0dHJzOntzcmM6c3JjLGFsdDphbHQsc3JjU2V0OnNyY1NldH0sb246eydlcnJvcic6dGhpcy5oYW5kbGVFcnJvcn0sc3R5bGU6eydvYmplY3QtZml0JzpmaXR9fSk7fWlmKGljb24pe3JldHVybiBoKCdpJyx7J2NsYXNzJzppY29ufSk7fXJldHVybiB0aGlzLiRzbG90cy5kZWZhdWx0O319LHJlbmRlcjpmdW5jdGlvbiByZW5kZXIoKXt2YXIgaD1hcmd1bWVudHNbMF07dmFyIGF2YXRhckNsYXNzPXRoaXMuYXZhdGFyQ2xhc3Msc2l6ZT10aGlzLnNpemU7dmFyIHNpemVTdHlsZT10eXBlb2Ygc2l6ZT09PSdudW1iZXInP3toZWlnaHQ6c2l6ZSsncHgnLHdpZHRoOnNpemUrJ3B4JyxsaW5lSGVpZ2h0OnNpemUrJ3B4J306e307cmV0dXJuIGgoJ3NwYW4nLHsnY2xhc3MnOmF2YXRhckNsYXNzLHN0eWxlOnNpemVTdHlsZX0sW3RoaXMucmVuZGVyQXZhdGFyKCldKTt9fTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2F2YXRhci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFja2FnZXNfYXZhdGFyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPWF2YXRhcl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2F2YXRhci9zcmMvbWFpbi52dWUKdmFyIHNyY19tYWluX3JlbmRlcixzcmNfbWFpbl9zdGF0aWNSZW5kZXJGbnM7Lyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciBhdmF0YXJfc3JjX21haW5fY29tcG9uZW50PW5vcm1hbGl6ZUNvbXBvbmVudChwYWNrYWdlc19hdmF0YXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sc3JjX21haW5fcmVuZGVyLHNyY19tYWluX3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgYXZhdGFyX3NyY19tYWluX2FwaTt9YXZhdGFyX3NyY19tYWluX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvYXZhdGFyL3NyYy9tYWluLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBhdmF0YXJfc3JjX21haW49YXZhdGFyX3NyY19tYWluX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYXZhdGFyL2luZGV4LmpzCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovYXZhdGFyX3NyY19tYWluLmluc3RhbGw9ZnVuY3Rpb24oVnVlKXtWdWUuY29tcG9uZW50KGF2YXRhcl9zcmNfbWFpbi5uYW1lLGF2YXRhcl9zcmNfbWFpbik7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGF2YXRhcj1hdmF0YXJfc3JjX21haW47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9kcmF3ZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWE0ODg1MjY0Jgp2YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkX2E0ODg1MjY0X3JlbmRlcj1mdW5jdGlvbiBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfYTQ4ODUyNjRfcmVuZGVyKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCJ0cmFuc2l0aW9uIix7YXR0cnM6e25hbWU6ImVsLWRyYXdlci1mYWRlIn0sb246eyJhZnRlci1lbnRlciI6X3ZtLmFmdGVyRW50ZXIsImFmdGVyLWxlYXZlIjpfdm0uYWZ0ZXJMZWF2ZX19LFtfYygiZGl2Iix7ZGlyZWN0aXZlczpbe25hbWU6InNob3ciLHJhd05hbWU6InYtc2hvdyIsdmFsdWU6X3ZtLnZpc2libGUsZXhwcmVzc2lvbjoidmlzaWJsZSJ9XSxzdGF0aWNDbGFzczoiZWwtZHJhd2VyX193cmFwcGVyIixhdHRyczp7dGFiaW5kZXg6Ii0xIn19LFtfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLWRyYXdlcl9fY29udGFpbmVyIixjbGFzczpfdm0udmlzaWJsZSYmImVsLWRyYXdlcl9fb3BlbiIsYXR0cnM6e3JvbGU6ImRvY3VtZW50Iix0YWJpbmRleDoiLTEifSxvbjp7Y2xpY2s6ZnVuY3Rpb24gY2xpY2soJGV2ZW50KXtpZigkZXZlbnQudGFyZ2V0IT09JGV2ZW50LmN1cnJlbnRUYXJnZXQpe3JldHVybiBudWxsO31yZXR1cm4gX3ZtLmhhbmRsZVdyYXBwZXJDbGljaygkZXZlbnQpO319fSxbX2MoImRpdiIse3JlZjoiZHJhd2VyIixzdGF0aWNDbGFzczoiZWwtZHJhd2VyIixjbGFzczpbX3ZtLmRpcmVjdGlvbixfdm0uY3VzdG9tQ2xhc3NdLHN0eWxlOl92bS5pc0hvcml6b250YWw/IndpZHRoOiAiK192bS5zaXplOiJoZWlnaHQ6ICIrX3ZtLnNpemUsYXR0cnM6eyJhcmlhLW1vZGFsIjoidHJ1ZSIsImFyaWEtbGFiZWxsZWRieSI6ImVsLWRyYXdlcl9fdGl0bGUiLCJhcmlhLWxhYmVsIjpfdm0udGl0bGUscm9sZToiZGlhbG9nIix0YWJpbmRleDoiLTEifX0sW192bS53aXRoSGVhZGVyP19jKCJoZWFkZXIiLHtzdGF0aWNDbGFzczoiZWwtZHJhd2VyX19oZWFkZXIiLGF0dHJzOntpZDoiZWwtZHJhd2VyX190aXRsZSJ9fSxbX3ZtLl90KCJ0aXRsZSIsW19jKCJzcGFuIix7YXR0cnM6e3JvbGU6ImhlYWRpbmciLHRhYmluZGV4OiIwIix0aXRsZTpfdm0udGl0bGV9fSxbX3ZtLl92KF92bS5fcyhfdm0udGl0bGUpKV0pXSksX3ZtLnNob3dDbG9zZT9fYygiYnV0dG9uIix7c3RhdGljQ2xhc3M6ImVsLWRyYXdlcl9fY2xvc2UtYnRuIixhdHRyczp7ImFyaWEtbGFiZWwiOiJjbG9zZSAiKyhfdm0udGl0bGV8fCJkcmF3ZXIiKSx0eXBlOiJidXR0b24ifSxvbjp7Y2xpY2s6X3ZtLmNsb3NlRHJhd2VyfX0sW19jKCJpIix7c3RhdGljQ2xhc3M6ImVsLWRpYWxvZ19fY2xvc2UgZWwtaWNvbiBlbC1pY29uLWNsb3NlIn0pXSk6X3ZtLl9lKCldLDIpOl92bS5fZSgpLF92bS5yZW5kZXJlZD9fYygic2VjdGlvbiIse3N0YXRpY0NsYXNzOiJlbC1kcmF3ZXJfX2JvZHkifSxbX3ZtLl90KCJkZWZhdWx0IildLDIpOl92bS5fZSgpXSldKV0pXSk7fTt2YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkX2E0ODg1MjY0X3N0YXRpY1JlbmRlckZucz1bXTttYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfYTQ4ODUyNjRfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RyYXdlci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9YTQ4ODUyNjQmCi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2RyYXdlci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgZHJhd2VyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbERyYXdlcicsbWl4aW5zOltwb3B1cF9kZWZhdWx0LmEsZW1pdHRlcl9kZWZhdWx0LmFdLHByb3BzOnthcHBlbmRUb0JvZHk6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OmZhbHNlfSxiZWZvcmVDbG9zZTp7dHlwZTpGdW5jdGlvbn0sY3VzdG9tQ2xhc3M6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6Jyd9LGNsb3NlT25QcmVzc0VzY2FwZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6dHJ1ZX0sZGVzdHJveU9uQ2xvc2U6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OmZhbHNlfSxtb2RhbDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6dHJ1ZX0sZGlyZWN0aW9uOnt0eXBlOlN0cmluZyxkZWZhdWx0OidydGwnLHZhbGlkYXRvcjpmdW5jdGlvbiB2YWxpZGF0b3IodmFsKXtyZXR1cm5bJ2x0cicsJ3J0bCcsJ3R0YicsJ2J0dCddLmluZGV4T2YodmFsKSE9PS0xO319LG1vZGFsQXBwZW5kVG9Cb2R5Ont0eXBlOkJvb2xlYW4sZGVmYXVsdDp0cnVlfSxzaG93Q2xvc2U6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OnRydWV9LHNpemU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6JzMwJSd9LHRpdGxlOnt0eXBlOlN0cmluZyxkZWZhdWx0OicnfSx2aXNpYmxlOnt0eXBlOkJvb2xlYW59LHdyYXBwZXJDbG9zYWJsZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6dHJ1ZX0sd2l0aEhlYWRlcjp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6dHJ1ZX19LGNvbXB1dGVkOntpc0hvcml6b250YWw6ZnVuY3Rpb24gaXNIb3Jpem9udGFsKCl7cmV0dXJuIHRoaXMuZGlyZWN0aW9uPT09J3J0bCd8fHRoaXMuZGlyZWN0aW9uPT09J2x0cic7fX0sZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue2Nsb3NlZDpmYWxzZSxwcmV2QWN0aXZlRWxlbWVudDpudWxsfTt9LHdhdGNoOnt2aXNpYmxlOmZ1bmN0aW9uIHZpc2libGUodmFsKXt2YXIgX3RoaXM9dGhpcztpZih2YWwpe3RoaXMuY2xvc2VkPWZhbHNlO3RoaXMuJGVtaXQoJ29wZW4nKTtpZih0aGlzLmFwcGVuZFRvQm9keSl7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLiRlbCk7fXRoaXMucHJldkFjdGl2ZUVsZW1lbnQ9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDt0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe2FyaWFfdXRpbHNfZGVmYXVsdC5hLmZvY3VzRmlyc3REZXNjZW5kYW50KF90aGlzLiRyZWZzLmRyYXdlcik7fSk7fWVsc2V7aWYoIXRoaXMuY2xvc2VkKXRoaXMuJGVtaXQoJ2Nsb3NlJyk7dGhpcy4kbmV4dFRpY2soZnVuY3Rpb24oKXtpZihfdGhpcy5wcmV2QWN0aXZlRWxlbWVudCl7X3RoaXMucHJldkFjdGl2ZUVsZW1lbnQuZm9jdXMoKTt9fSk7fX19LG1ldGhvZHM6e2FmdGVyRW50ZXI6ZnVuY3Rpb24gYWZ0ZXJFbnRlcigpe3RoaXMuJGVtaXQoJ29wZW5lZCcpO30sYWZ0ZXJMZWF2ZTpmdW5jdGlvbiBhZnRlckxlYXZlKCl7dGhpcy4kZW1pdCgnY2xvc2VkJyk7fSxoaWRlOmZ1bmN0aW9uIGhpZGUoY2FuY2VsKXtpZihjYW5jZWwhPT1mYWxzZSl7dGhpcy4kZW1pdCgndXBkYXRlOnZpc2libGUnLGZhbHNlKTt0aGlzLiRlbWl0KCdjbG9zZScpO2lmKHRoaXMuZGVzdHJveU9uQ2xvc2U9PT10cnVlKXt0aGlzLnJlbmRlcmVkPWZhbHNlO310aGlzLmNsb3NlZD10cnVlO319LGhhbmRsZVdyYXBwZXJDbGljazpmdW5jdGlvbiBoYW5kbGVXcmFwcGVyQ2xpY2soKXtpZih0aGlzLndyYXBwZXJDbG9zYWJsZSl7dGhpcy5jbG9zZURyYXdlcigpO319LGNsb3NlRHJhd2VyOmZ1bmN0aW9uIGNsb3NlRHJhd2VyKCl7aWYodHlwZW9mIHRoaXMuYmVmb3JlQ2xvc2U9PT0nZnVuY3Rpb24nKXt0aGlzLmJlZm9yZUNsb3NlKHRoaXMuaGlkZSk7fWVsc2V7dGhpcy5oaWRlKCk7fX0saGFuZGxlQ2xvc2U6ZnVuY3Rpb24gaGFuZGxlQ2xvc2UoKXsvLyBUaGlzIG1ldGhvZCBoZXJlIHdpbGwgYmUgY2FsbGVkIGJ5IFBvcHVwTWFuZ2VyLCB3aGVuIHRoZSBgY2xvc2VPblByZXNzRXNjYXBlYCB3YXMgc2V0IHRvIHRydWUKLy8gcHJlc3NpbmcgYEVTQ2Agd2lsbCBjYWxsIHRoaXMgbWV0aG9kLCBhbmQgYWxzbyBjbG9zZSB0aGUgZHJhd2VyLgovLyBUaGlzIG1ldGhvZCBhbHNvIGNhbGxzIGBiZWZvcmVDbG9zZWAgaWYgdGhlcmUgd2FzIG9uZS4KdGhpcy5jbG9zZURyYXdlcigpO319LG1vdW50ZWQ6ZnVuY3Rpb24gbW91bnRlZCgpe2lmKHRoaXMudmlzaWJsZSl7dGhpcy5yZW5kZXJlZD10cnVlO3RoaXMub3BlbigpO319LGRlc3Ryb3llZDpmdW5jdGlvbiBkZXN0cm95ZWQoKXsvLyBpZiBhcHBlbmRUb0JvZHkgaXMgdHJ1ZSwgcmVtb3ZlIERPTSBub2RlIGFmdGVyIGRlc3Ryb3kKaWYodGhpcy5hcHBlbmRUb0JvZHkmJnRoaXMuJGVsJiZ0aGlzLiRlbC5wYXJlbnROb2RlKXt0aGlzLiRlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuJGVsKTt9fX07Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kcmF3ZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIHBhY2thZ2VzX2RyYXdlcl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz1kcmF3ZXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kcmF3ZXIvc3JjL21haW4udnVlCi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi92YXIgZHJhd2VyX3NyY19tYWluX2NvbXBvbmVudD1ub3JtYWxpemVDb21wb25lbnQocGFja2FnZXNfZHJhd2VyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF9hNDg4NTI2NF9yZW5kZXIsbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkX2E0ODg1MjY0X3N0YXRpY1JlbmRlckZucyxmYWxzZSxudWxsLG51bGwsbnVsbCk7LyogaG90IHJlbG9hZCAqL2lmKGZhbHNlKXt2YXIgZHJhd2VyX3NyY19tYWluX2FwaTt9ZHJhd2VyX3NyY19tYWluX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvZHJhd2VyL3NyYy9tYWluLnZ1ZSI7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBkcmF3ZXJfc3JjX21haW49ZHJhd2VyX3NyY19tYWluX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZHJhd2VyL2luZGV4LmpzCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovZHJhd2VyX3NyY19tYWluLmluc3RhbGw9ZnVuY3Rpb24oVnVlKXtWdWUuY29tcG9uZW50KGRyYXdlcl9zcmNfbWFpbi5uYW1lLGRyYXdlcl9zcmNfbWFpbik7fTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovdmFyIGRyYXdlcj1kcmF3ZXJfc3JjX21haW47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9wb3Bjb25maXJtL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0wNDhkZTczMCYKdmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNDhkZTczMF9yZW5kZXI9ZnVuY3Rpb24gbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzA0OGRlNzMwX3JlbmRlcigpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O3ZhciBfYz1fdm0uX3NlbGYuX2N8fF9oO3JldHVybiBfYygiZWwtcG9wb3ZlciIsX3ZtLl9iKHthdHRyczp7dHJpZ2dlcjoiY2xpY2sifSxtb2RlbDp7dmFsdWU6X3ZtLnZpc2libGUsY2FsbGJhY2s6ZnVuY3Rpb24gY2FsbGJhY2soJCR2KXtfdm0udmlzaWJsZT0kJHY7fSxleHByZXNzaW9uOiJ2aXNpYmxlIn19LCJlbC1wb3BvdmVyIixfdm0uJGF0dHJzLGZhbHNlKSxbX2MoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1wb3Bjb25maXJtIn0sW19jKCJwIix7c3RhdGljQ2xhc3M6ImVsLXBvcGNvbmZpcm1fX21haW4ifSxbIV92bS5oaWRlSWNvbj9fYygiaSIse3N0YXRpY0NsYXNzOiJlbC1wb3Bjb25maXJtX19pY29uIixjbGFzczpfdm0uaWNvbixzdHlsZTp7Y29sb3I6X3ZtLmljb25Db2xvcn19KTpfdm0uX2UoKSxfdm0uX3YoIlxuICAgICAgIitfdm0uX3MoX3ZtLnRpdGxlKSsiXG4gICAgIildKSxfYygiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXBvcGNvbmZpcm1fX2FjdGlvbiJ9LFtfYygiZWwtYnV0dG9uIix7YXR0cnM6e3NpemU6Im1pbmkiLHR5cGU6X3ZtLmNhbmNlbEJ1dHRvblR5cGV9LG9uOntjbGljazpfdm0uY2FuY2VsfX0sW192bS5fdigiXG4gICAgICAgICIrX3ZtLl9zKF92bS5jYW5jZWxCdXR0b25UZXh0KSsiXG4gICAgICAiKV0pLF9jKCJlbC1idXR0b24iLHthdHRyczp7c2l6ZToibWluaSIsdHlwZTpfdm0uY29uZmlybUJ1dHRvblR5cGV9LG9uOntjbGljazpfdm0uY29uZmlybX19LFtfdm0uX3YoIlxuICAgICAgICAiK192bS5fcyhfdm0uY29uZmlybUJ1dHRvblRleHQpKyJcbiAgICAgICIpXSldLDEpXSksX3ZtLl90KCJyZWZlcmVuY2UiLG51bGwse3Nsb3Q6InJlZmVyZW5jZSJ9KV0sMik7fTt2YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzA0OGRlNzMwX3N0YXRpY1JlbmRlckZucz1bXTttYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfMDQ4ZGU3MzBfcmVuZGVyLl93aXRoU3RyaXBwZWQ9dHJ1ZTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3BvcGNvbmZpcm0vc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTA0OGRlNzMwJgovLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsICJlbGVtZW50LXVpL2xpYi9wb3BvdmVyIgp2YXIgcG9wb3Zlcl89X193ZWJwYWNrX3JlcXVpcmVfXyg0NCk7dmFyIHBvcG92ZXJfZGVmYXVsdD0vKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKHBvcG92ZXJfKTsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9wb3Bjb25maXJtL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwb3Bjb25maXJtX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfPXtuYW1lOidFbFBvcGNvbmZpcm0nLHByb3BzOnt0aXRsZTp7dHlwZTpTdHJpbmd9LGNvbmZpcm1CdXR0b25UZXh0Ont0eXBlOlN0cmluZyxkZWZhdWx0Ok9iamVjdChsaWJfbG9jYWxlX1sidCJdKSgnZWwucG9wY29uZmlybS5jb25maXJtQnV0dG9uVGV4dCcpfSxjYW5jZWxCdXR0b25UZXh0Ont0eXBlOlN0cmluZyxkZWZhdWx0Ok9iamVjdChsaWJfbG9jYWxlX1sidCJdKSgnZWwucG9wY29uZmlybS5jYW5jZWxCdXR0b25UZXh0Jyl9LGNvbmZpcm1CdXR0b25UeXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OidwcmltYXJ5J30sY2FuY2VsQnV0dG9uVHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDondGV4dCd9LGljb246e3R5cGU6U3RyaW5nLGRlZmF1bHQ6J2VsLWljb24tcXVlc3Rpb24nfSxpY29uQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6JyNmOTAnfSxoaWRlSWNvbjp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ZmFsc2V9fSxjb21wb25lbnRzOntFbFBvcG92ZXI6cG9wb3Zlcl9kZWZhdWx0LmEsRWxCdXR0b246YnV0dG9uX2RlZmF1bHQuYX0sZGF0YTpmdW5jdGlvbiBkYXRhKCl7cmV0dXJue3Zpc2libGU6ZmFsc2V9O30sbWV0aG9kczp7Y29uZmlybTpmdW5jdGlvbiBjb25maXJtKCl7dGhpcy52aXNpYmxlPWZhbHNlO3RoaXMuJGVtaXQoJ2NvbmZpcm0nKTt9LGNhbmNlbDpmdW5jdGlvbiBjYW5jZWwoKXt0aGlzLnZpc2libGU9ZmFsc2U7dGhpcy4kZW1pdCgnY2FuY2VsJyk7fX19Oy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcG9wY29uZmlybS9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcGFja2FnZXNfcG9wY29uZmlybV9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXz1wb3Bjb25maXJtX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcG9wY29uZmlybS9zcmMvbWFpbi52dWUKLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL3ZhciBwb3Bjb25maXJtX3NyY19tYWluX2NvbXBvbmVudD1ub3JtYWxpemVDb21wb25lbnQocGFja2FnZXNfcG9wY29uZmlybV9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfMDQ4ZGU3MzBfcmVuZGVyLG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNDhkZTczMF9zdGF0aWNSZW5kZXJGbnMsZmFsc2UsbnVsbCxudWxsLG51bGwpOy8qIGhvdCByZWxvYWQgKi9pZihmYWxzZSl7dmFyIHBvcGNvbmZpcm1fc3JjX21haW5fYXBpO31wb3Bjb25maXJtX3NyY19tYWluX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZT0icGFja2FnZXMvcG9wY29uZmlybS9zcmMvbWFpbi52dWUiOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi92YXIgcG9wY29uZmlybV9zcmNfbWFpbj1wb3Bjb25maXJtX3NyY19tYWluX2NvbXBvbmVudC5leHBvcnRzOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcG9wY29uZmlybS9pbmRleC5qcwovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL3BvcGNvbmZpcm1fc3JjX21haW4uaW5zdGFsbD1mdW5jdGlvbihWdWUpe1Z1ZS5jb21wb25lbnQocG9wY29uZmlybV9zcmNfbWFpbi5uYW1lLHBvcGNvbmZpcm1fc3JjX21haW4pO307LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBwb3Bjb25maXJtPXBvcGNvbmZpcm1fc3JjX21haW47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvaW5kZXguanMKLyogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgJy4vYnVpbGQvYmluL2J1aWxkLWVudHJ5LmpzJyAqL3ZhciBjb21wb25lbnRzPVtwYWNrYWdlc19wYWdpbmF0aW9uLGRpYWxvZyxwYWNrYWdlc19hdXRvY29tcGxldGUscGFja2FnZXNfZHJvcGRvd24scGFja2FnZXNfZHJvcGRvd25fbWVudSxwYWNrYWdlc19kcm9wZG93bl9pdGVtLHBhY2thZ2VzX21lbnUscGFja2FnZXNfc3VibWVudSxwYWNrYWdlc19tZW51X2l0ZW0scGFja2FnZXNfbWVudV9pdGVtX2dyb3VwLHBhY2thZ2VzX2lucHV0LHBhY2thZ2VzX2lucHV0X251bWJlcixwYWNrYWdlc19yYWRpbyxwYWNrYWdlc19yYWRpb19ncm91cCxwYWNrYWdlc19yYWRpb19idXR0b24scGFja2FnZXNfY2hlY2tib3gscGFja2FnZXNfY2hlY2tib3hfYnV0dG9uLHBhY2thZ2VzX2NoZWNrYm94X2dyb3VwLHBhY2thZ2VzX3N3aXRjaCxwYWNrYWdlc19zZWxlY3QscGFja2FnZXNfb3B0aW9uLHBhY2thZ2VzX29wdGlvbl9ncm91cCxwYWNrYWdlc19idXR0b24scGFja2FnZXNfYnV0dG9uX2dyb3VwLHBhY2thZ2VzX3RhYmxlLHBhY2thZ2VzX3RhYmxlX2NvbHVtbixwYWNrYWdlc19kYXRlX3BpY2tlcixwYWNrYWdlc190aW1lX3NlbGVjdCxwYWNrYWdlc190aW1lX3BpY2tlcixwb3BvdmVyLHBhY2thZ2VzX3Rvb2x0aXAscGFja2FnZXNfYnJlYWRjcnVtYixwYWNrYWdlc19icmVhZGNydW1iX2l0ZW0scGFja2FnZXNfZm9ybSxwYWNrYWdlc19mb3JtX2l0ZW0scGFja2FnZXNfdGFicyxwYWNrYWdlc190YWJfcGFuZSxwYWNrYWdlc190YWcscGFja2FnZXNfdHJlZSxwYWNrYWdlc19hbGVydCxzbGlkZXIscGFja2FnZXNfaWNvbixwYWNrYWdlc19yb3cscGFja2FnZXNfY29sLHBhY2thZ2VzX3VwbG9hZCxwYWNrYWdlc19wcm9ncmVzcyxwYWNrYWdlc19zcGlubmVyLGJhZGdlLGNhcmQscmF0ZSxwYWNrYWdlc19zdGVwcyxwYWNrYWdlc19zdGVwLGNhcm91c2VsLHNjcm9sbGJhcixjYXJvdXNlbF9pdGVtLHBhY2thZ2VzX2NvbGxhcHNlLHBhY2thZ2VzX2NvbGxhcHNlX2l0ZW0scGFja2FnZXNfY2FzY2FkZXIsY29sb3JfcGlja2VyLHRyYW5zZmVyLHBhY2thZ2VzX2NvbnRhaW5lcixoZWFkZXIsYXNpZGUscGFja2FnZXNfbWFpbixmb290ZXIsdGltZWxpbmUsdGltZWxpbmVfaXRlbSxwYWNrYWdlc19saW5rLGRpdmlkZXIscGFja2FnZXNfaW1hZ2UsY2FsZW5kYXIsYmFja3RvcCxwYWdlX2hlYWRlcixwYWNrYWdlc19jYXNjYWRlcl9wYW5lbCxhdmF0YXIsZHJhd2VyLHBvcGNvbmZpcm0sY29sbGFwc2VfdHJhbnNpdGlvbl9kZWZhdWx0LmFdO3ZhciBzcmNfaW5zdGFsbD1mdW5jdGlvbiBpbnN0YWxsKFZ1ZSl7dmFyIG9wdHM9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOnt9O2xpYl9sb2NhbGVfZGVmYXVsdC5hLnVzZShvcHRzLmxvY2FsZSk7bGliX2xvY2FsZV9kZWZhdWx0LmEuaTE4bihvcHRzLmkxOG4pO2NvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbihjb21wb25lbnQpe1Z1ZS5jb21wb25lbnQoY29tcG9uZW50Lm5hbWUsY29tcG9uZW50KTt9KTtWdWUudXNlKGluZmluaXRlX3Njcm9sbCk7VnVlLnVzZShwYWNrYWdlc19sb2FkaW5nLmRpcmVjdGl2ZSk7VnVlLnByb3RvdHlwZS4kRUxFTUVOVD17c2l6ZTpvcHRzLnNpemV8fCcnLHpJbmRleDpvcHRzLnpJbmRleHx8MjAwMH07VnVlLnByb3RvdHlwZS4kbG9hZGluZz1wYWNrYWdlc19sb2FkaW5nLnNlcnZpY2U7VnVlLnByb3RvdHlwZS4kbXNnYm94PW1lc3NhZ2VfYm94O1Z1ZS5wcm90b3R5cGUuJGFsZXJ0PW1lc3NhZ2VfYm94LmFsZXJ0O1Z1ZS5wcm90b3R5cGUuJGNvbmZpcm09bWVzc2FnZV9ib3guY29uZmlybTtWdWUucHJvdG90eXBlLiRwcm9tcHQ9bWVzc2FnZV9ib3gucHJvbXB0O1Z1ZS5wcm90b3R5cGUuJG5vdGlmeT1ub3RpZmljYXRpb247VnVlLnByb3RvdHlwZS4kbWVzc2FnZT1wYWNrYWdlc19tZXNzYWdlO307LyogaXN0YW5idWwgaWdub3JlIGlmICovaWYodHlwZW9mIHdpbmRvdyE9PSd1bmRlZmluZWQnJiZ3aW5kb3cuVnVlKXtzcmNfaW5zdGFsbCh3aW5kb3cuVnVlKTt9LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqL3ZhciBzcmNfMD1fX3dlYnBhY2tfZXhwb3J0c19fWyJkZWZhdWx0Il09e3ZlcnNpb246JzIuMTQuMCcsbG9jYWxlOmxpYl9sb2NhbGVfZGVmYXVsdC5hLnVzZSxpMThuOmxpYl9sb2NhbGVfZGVmYXVsdC5hLmkxOG4saW5zdGFsbDpzcmNfaW5zdGFsbCxDb2xsYXBzZVRyYW5zaXRpb246Y29sbGFwc2VfdHJhbnNpdGlvbl9kZWZhdWx0LmEsTG9hZGluZzpwYWNrYWdlc19sb2FkaW5nLFBhZ2luYXRpb246cGFja2FnZXNfcGFnaW5hdGlvbixEaWFsb2c6ZGlhbG9nLEF1dG9jb21wbGV0ZTpwYWNrYWdlc19hdXRvY29tcGxldGUsRHJvcGRvd246cGFja2FnZXNfZHJvcGRvd24sRHJvcGRvd25NZW51OnBhY2thZ2VzX2Ryb3Bkb3duX21lbnUsRHJvcGRvd25JdGVtOnBhY2thZ2VzX2Ryb3Bkb3duX2l0ZW0sTWVudTpwYWNrYWdlc19tZW51LFN1Ym1lbnU6cGFja2FnZXNfc3VibWVudSxNZW51SXRlbTpwYWNrYWdlc19tZW51X2l0ZW0sTWVudUl0ZW1Hcm91cDpwYWNrYWdlc19tZW51X2l0ZW1fZ3JvdXAsSW5wdXQ6cGFja2FnZXNfaW5wdXQsSW5wdXROdW1iZXI6cGFja2FnZXNfaW5wdXRfbnVtYmVyLFJhZGlvOnBhY2thZ2VzX3JhZGlvLFJhZGlvR3JvdXA6cGFja2FnZXNfcmFkaW9fZ3JvdXAsUmFkaW9CdXR0b246cGFja2FnZXNfcmFkaW9fYnV0dG9uLENoZWNrYm94OnBhY2thZ2VzX2NoZWNrYm94LENoZWNrYm94QnV0dG9uOnBhY2thZ2VzX2NoZWNrYm94X2J1dHRvbixDaGVja2JveEdyb3VwOnBhY2thZ2VzX2NoZWNrYm94X2dyb3VwLFN3aXRjaDpwYWNrYWdlc19zd2l0Y2gsU2VsZWN0OnBhY2thZ2VzX3NlbGVjdCxPcHRpb246cGFja2FnZXNfb3B0aW9uLE9wdGlvbkdyb3VwOnBhY2thZ2VzX29wdGlvbl9ncm91cCxCdXR0b246cGFja2FnZXNfYnV0dG9uLEJ1dHRvbkdyb3VwOnBhY2thZ2VzX2J1dHRvbl9ncm91cCxUYWJsZTpwYWNrYWdlc190YWJsZSxUYWJsZUNvbHVtbjpwYWNrYWdlc190YWJsZV9jb2x1bW4sRGF0ZVBpY2tlcjpwYWNrYWdlc19kYXRlX3BpY2tlcixUaW1lU2VsZWN0OnBhY2thZ2VzX3RpbWVfc2VsZWN0LFRpbWVQaWNrZXI6cGFja2FnZXNfdGltZV9waWNrZXIsUG9wb3Zlcjpwb3BvdmVyLFRvb2x0aXA6cGFja2FnZXNfdG9vbHRpcCxNZXNzYWdlQm94Om1lc3NhZ2VfYm94LEJyZWFkY3J1bWI6cGFja2FnZXNfYnJlYWRjcnVtYixCcmVhZGNydW1iSXRlbTpwYWNrYWdlc19icmVhZGNydW1iX2l0ZW0sRm9ybTpwYWNrYWdlc19mb3JtLEZvcm1JdGVtOnBhY2thZ2VzX2Zvcm1faXRlbSxUYWJzOnBhY2thZ2VzX3RhYnMsVGFiUGFuZTpwYWNrYWdlc190YWJfcGFuZSxUYWc6cGFja2FnZXNfdGFnLFRyZWU6cGFja2FnZXNfdHJlZSxBbGVydDpwYWNrYWdlc19hbGVydCxOb3RpZmljYXRpb246bm90aWZpY2F0aW9uLFNsaWRlcjpzbGlkZXIsSWNvbjpwYWNrYWdlc19pY29uLFJvdzpwYWNrYWdlc19yb3csQ29sOnBhY2thZ2VzX2NvbCxVcGxvYWQ6cGFja2FnZXNfdXBsb2FkLFByb2dyZXNzOnBhY2thZ2VzX3Byb2dyZXNzLFNwaW5uZXI6cGFja2FnZXNfc3Bpbm5lcixNZXNzYWdlOnBhY2thZ2VzX21lc3NhZ2UsQmFkZ2U6YmFkZ2UsQ2FyZDpjYXJkLFJhdGU6cmF0ZSxTdGVwczpwYWNrYWdlc19zdGVwcyxTdGVwOnBhY2thZ2VzX3N0ZXAsQ2Fyb3VzZWw6Y2Fyb3VzZWwsU2Nyb2xsYmFyOnNjcm9sbGJhcixDYXJvdXNlbEl0ZW06Y2Fyb3VzZWxfaXRlbSxDb2xsYXBzZTpwYWNrYWdlc19jb2xsYXBzZSxDb2xsYXBzZUl0ZW06cGFja2FnZXNfY29sbGFwc2VfaXRlbSxDYXNjYWRlcjpwYWNrYWdlc19jYXNjYWRlcixDb2xvclBpY2tlcjpjb2xvcl9waWNrZXIsVHJhbnNmZXI6dHJhbnNmZXIsQ29udGFpbmVyOnBhY2thZ2VzX2NvbnRhaW5lcixIZWFkZXI6aGVhZGVyLEFzaWRlOmFzaWRlLE1haW46cGFja2FnZXNfbWFpbixGb290ZXI6Zm9vdGVyLFRpbWVsaW5lOnRpbWVsaW5lLFRpbWVsaW5lSXRlbTp0aW1lbGluZV9pdGVtLExpbms6cGFja2FnZXNfbGluayxEaXZpZGVyOmRpdmlkZXIsSW1hZ2U6cGFja2FnZXNfaW1hZ2UsQ2FsZW5kYXI6Y2FsZW5kYXIsQmFja3RvcDpiYWNrdG9wLEluZmluaXRlU2Nyb2xsOmluZmluaXRlX3Njcm9sbCxQYWdlSGVhZGVyOnBhZ2VfaGVhZGVyLENhc2NhZGVyUGFuZWw6cGFja2FnZXNfY2FzY2FkZXJfcGFuZWwsQXZhdGFyOmF2YXRhcixEcmF3ZXI6ZHJhd2VyLFBvcGNvbmZpcm06cG9wY29uZmlybX07LyoqKi99LyoqKioqKi9dKVsiZGVmYXVsdCJdOw=="},null]}
|