iszolea-ui 1.2.6 → 1.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -4438,6 +4438,9 @@
|
|
|
4438
4438
|
// src/Scripts/Reports/Pages/CDM/Index.ts
|
|
4439
4439
|
var Index_exports4 = {};
|
|
4440
4440
|
__export(Index_exports4, {
|
|
4441
|
+
ControlConfigurator: () => ControlConfigurator,
|
|
4442
|
+
ControlDisplay: () => ControlDisplay,
|
|
4443
|
+
DisplayManager: () => DisplayManager,
|
|
4441
4444
|
default: () => CDMReportPage
|
|
4442
4445
|
});
|
|
4443
4446
|
|
|
@@ -10393,4 +10396,4 @@ By default grid shows only first 10 rows in the Edit mode.`).dxPopover({
|
|
|
10393
10396
|
var Scripts_default = IszoleaUI;
|
|
10394
10397
|
window.IszoleaUI = IszoleaUI;
|
|
10395
10398
|
})();
|
|
10396
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzL2ZpbGUtc2F2ZXIvc3JjL0ZpbGVTYXZlci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY3JvcHByL2Rpc3QvY3JvcHByLmpzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0J1c2luZXNzL0xpY2VuY2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQnVzaW5lc3MvTWVudUl0ZW1UeXBlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvTm90aWZ5LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvQXBpUmVzcG9uc2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9SZXF1ZXN0U3RhdGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9Qb3B1cC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9TdHlsaW5nL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvRXJyb3JJbmZvUG9wdXAudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9FeGNlcHRpb25UeXBlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1V0aWxzL0dlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9SZXF1ZXN0LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvRHhEYXRhU291cmNlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvTG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0NvcmUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVscGVycy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWxwZXJzL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0NvbmZpZy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWFkZXIvVXNlck1lbnUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQ29tcG9uZW50cy9NZW51L01lbnUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQ29tcG9uZW50cy9NZW51L0Jvb3RzdHJhcENvbGxhcHNpbmdNZW51LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9OYXZpZ2F0aW9uTWVudS50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db25zdGFudHMvQ2FjaGVLZXlzLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9Mb2dvLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9NZW51U3dpdGNoZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVhZGVyL1NlYXJjaC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9VdGlscy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9VdGlscy9FdmVudEVtaXR0ZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvVXRpbHMvR3JpZEV4cG9ydC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWFkZXIvSGVhZGVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvQnVzaW5lc3MvR3JpZENvbHVtblR5cGVzLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvQnVzaW5lc3MvY2RtSW1wb3J0RmlsZU1vZGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9JR3JpZFN0YXRlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvQmFja2dyb3VuZEltYWdlVmlld2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0Zvb3Rlci9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0F1dG9SZXNpemUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9GdWxsU2NyZWVuLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlbHBlcnMvVGhlbWUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVscGVycy9Ub29sYmFyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvRGVmYXVsdFRvb2xiYXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9QYW5lbEhlaWdodC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0dyaWQvQ3JlYXRlRnVsbFNjcmVlbkdyaWQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkQmFzZS50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkT2Jzb2xldGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRUcmVlTGlzdC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0ltYWdlQ3JvcERpYWxvZy9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0ltYWdlQ3JvcERpYWxvZy9IZWxwZXJzLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1BhZ2VzL0FjY291bnRTZXR0aW5ncy9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0NvbmZpcm0udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9MYW5kaW5nLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvQWNjZXNzRGVuaWVkVG9SZXBvcnQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvR3JpZC9DcmVhdGVEZWZhdWx0R3JpZC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9Db250cm9sQ29uZmlndXJhdG9yLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1V0aWxzL01lbW9pemUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vR3JpZFZpZXdzTWFuYWdlci50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9HcmlkU3RhdGVNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vR3JpZEZpbHRlcnNNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0ZpbGVVcGxvYWRlci9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0ZpbGVJbXBvcnRlci9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9HcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWREaXNwbGF5c01hbmFnZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW4udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRTdW1tYXJ5SGVscGVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0NvbnRyb2xEaXNwbGF5LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0Rpc3BsYXlNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0NvbXBvbmVudHMvU2Vzc2lvbk5vdGlmaWVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvR3JpZC9HcmlkSW5kaWNhdG9yU3RhdGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL0dyaWRTdGF0ZU1hbmFnZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL01vZGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9EYXRhL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvQ29tcG9uZW50cy9SZWZyZXNoVGltZXIvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9Db21wb25lbnRzL1JlZnJlc2hUaW1lci9CdXR0b24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvRGFzaGJvYXJkL0V4dGVuc2lvbnMvR2F1Z2VTdWJ2YWx1ZXNFeHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9EYXNoYm9hcmQvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HYW5udENoYXJ0L0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvUmVwb3J0L0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvRGlhZ3JhbS9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL1NsaWRlc2hvdy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLypcbiogRmlsZVNhdmVyLmpzXG4qIEEgc2F2ZUFzKCkgRmlsZVNhdmVyIGltcGxlbWVudGF0aW9uLlxuKlxuKiBCeSBFbGkgR3JleSwgaHR0cDovL2VsaWdyZXkuY29tXG4qXG4qIExpY2Vuc2UgOiBodHRwczovL2dpdGh1Yi5jb20vZWxpZ3JleS9GaWxlU2F2ZXIuanMvYmxvYi9tYXN0ZXIvTElDRU5TRS5tZCAoTUlUKVxuKiBzb3VyY2UgIDogaHR0cDovL3B1cmwuZWxpZ3JleS5jb20vZ2l0aHViL0ZpbGVTYXZlci5qc1xuKi9cblxuLy8gVGhlIG9uZSBhbmQgb25seSB3YXkgb2YgZ2V0dGluZyBnbG9iYWwgc2NvcGUgaW4gYWxsIGVudmlyb25tZW50c1xuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xLzMyNzcxODIvMTAwODk5OVxudmFyIF9nbG9iYWwgPSB0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JyAmJiB3aW5kb3cud2luZG93ID09PSB3aW5kb3dcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCcgJiYgc2VsZi5zZWxmID09PSBzZWxmXG4gID8gc2VsZiA6IHR5cGVvZiBnbG9iYWwgPT09ICdvYmplY3QnICYmIGdsb2JhbC5nbG9iYWwgPT09IGdsb2JhbFxuICA/IGdsb2JhbFxuICA6IHRoaXNcblxuZnVuY3Rpb24gYm9tIChibG9iLCBvcHRzKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ3VuZGVmaW5lZCcpIG9wdHMgPSB7IGF1dG9Cb206IGZhbHNlIH1cbiAgZWxzZSBpZiAodHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgY29uc29sZS53YXJuKCdEZXByZWNhdGVkOiBFeHBlY3RlZCB0aGlyZCBhcmd1bWVudCB0byBiZSBhIG9iamVjdCcpXG4gICAgb3B0cyA9IHsgYXV0b0JvbTogIW9wdHMgfVxuICB9XG5cbiAgLy8gcHJlcGVuZCBCT00gZm9yIFVURi04IFhNTCBhbmQgdGV4dC8qIHR5cGVzIChpbmNsdWRpbmcgSFRNTClcbiAgLy8gbm90ZTogeW91ciBicm93c2VyIHdpbGwgYXV0b21hdGljYWxseSBjb252ZXJ0IFVURi0xNiBVK0ZFRkYgdG8gRUYgQkIgQkZcbiAgaWYgKG9wdHMuYXV0b0JvbSAmJiAvXlxccyooPzp0ZXh0XFwvXFxTKnxhcHBsaWNhdGlvblxcL3htbHxcXFMqXFwvXFxTKlxcK3htbClcXHMqOy4qY2hhcnNldFxccyo9XFxzKnV0Zi04L2kudGVzdChibG9iLnR5cGUpKSB7XG4gICAgcmV0dXJuIG5ldyBCbG9iKFtTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RkVGRiksIGJsb2JdLCB7IHR5cGU6IGJsb2IudHlwZSB9KVxuICB9XG4gIHJldHVybiBibG9iXG59XG5cbmZ1bmN0aW9uIGRvd25sb2FkICh1cmwsIG5hbWUsIG9wdHMpIHtcbiAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gIHhoci5vcGVuKCdHRVQnLCB1cmwpXG4gIHhoci5yZXNwb25zZVR5cGUgPSAnYmxvYidcbiAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBzYXZlQXMoeGhyLnJlc3BvbnNlLCBuYW1lLCBvcHRzKVxuICB9XG4gIHhoci5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ2NvdWxkIG5vdCBkb3dubG9hZCBmaWxlJylcbiAgfVxuICB4aHIuc2VuZCgpXG59XG5cbmZ1bmN0aW9uIGNvcnNFbmFibGVkICh1cmwpIHtcbiAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gIC8vIHVzZSBzeW5jIHRvIGF2b2lkIHBvcHVwIGJsb2NrZXJcbiAgeGhyLm9wZW4oJ0hFQUQnLCB1cmwsIGZhbHNlKVxuICB0cnkge1xuICAgIHhoci5zZW5kKClcbiAgfSBjYXRjaCAoZSkge31cbiAgcmV0dXJuIHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPD0gMjk5XG59XG5cbi8vIGBhLmNsaWNrKClgIGRvZXNuJ3Qgd29yayBmb3IgYWxsIGJyb3dzZXJzICgjNDY1KVxuZnVuY3Rpb24gY2xpY2sgKG5vZGUpIHtcbiAgdHJ5IHtcbiAgICBub2RlLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ2NsaWNrJykpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ01vdXNlRXZlbnRzJylcbiAgICBldnQuaW5pdE1vdXNlRXZlbnQoJ2NsaWNrJywgdHJ1ZSwgdHJ1ZSwgd2luZG93LCAwLCAwLCAwLCA4MCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgMjAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwLCBudWxsKVxuICAgIG5vZGUuZGlzcGF0Y2hFdmVudChldnQpXG4gIH1cbn1cblxuLy8gRGV0ZWN0IFdlYlZpZXcgaW5zaWRlIGEgbmF0aXZlIG1hY09TIGFwcCBieSBydWxpbmcgb3V0IGFsbCBicm93c2Vyc1xuLy8gV2UganVzdCBuZWVkIHRvIGNoZWNrIGZvciAnU2FmYXJpJyBiZWNhdXNlIGFsbCBvdGhlciBicm93c2VycyAoYmVzaWRlcyBGaXJlZm94KSBpbmNsdWRlIHRoYXQgdG9vXG4vLyBodHRwczovL3d3dy53aGF0aXNteWJyb3dzZXIuY29tL2d1aWRlcy90aGUtbGF0ZXN0LXVzZXItYWdlbnQvbWFjb3NcbnZhciBpc01hY09TV2ViVmlldyA9IF9nbG9iYWwubmF2aWdhdG9yICYmIC9NYWNpbnRvc2gvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgL0FwcGxlV2ViS2l0Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmICEvU2FmYXJpLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbnZhciBzYXZlQXMgPSBfZ2xvYmFsLnNhdmVBcyB8fCAoXG4gIC8vIHByb2JhYmx5IGluIHNvbWUgd2ViIHdvcmtlclxuICAodHlwZW9mIHdpbmRvdyAhPT0gJ29iamVjdCcgfHwgd2luZG93ICE9PSBfZ2xvYmFsKVxuICAgID8gZnVuY3Rpb24gc2F2ZUFzICgpIHsgLyogbm9vcCAqLyB9XG5cbiAgLy8gVXNlIGRvd25sb2FkIGF0dHJpYnV0ZSBmaXJzdCBpZiBwb3NzaWJsZSAoIzE5MyBMdW1pYSBtb2JpbGUpIHVubGVzcyB0aGlzIGlzIGEgbWFjT1MgV2ViVmlld1xuICA6ICgnZG93bmxvYWQnIGluIEhUTUxBbmNob3JFbGVtZW50LnByb3RvdHlwZSAmJiAhaXNNYWNPU1dlYlZpZXcpXG4gID8gZnVuY3Rpb24gc2F2ZUFzIChibG9iLCBuYW1lLCBvcHRzKSB7XG4gICAgdmFyIFVSTCA9IF9nbG9iYWwuVVJMIHx8IF9nbG9iYWwud2Via2l0VVJMXG4gICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcbiAgICBuYW1lID0gbmFtZSB8fCBibG9iLm5hbWUgfHwgJ2Rvd25sb2FkJ1xuXG4gICAgYS5kb3dubG9hZCA9IG5hbWVcbiAgICBhLnJlbCA9ICdub29wZW5lcicgLy8gdGFibmFiYmluZ1xuXG4gICAgLy8gVE9ETzogZGV0ZWN0IGNocm9tZSBleHRlbnNpb25zICYgcGFja2FnZWQgYXBwc1xuICAgIC8vIGEudGFyZ2V0ID0gJ19ibGFuaydcblxuICAgIGlmICh0eXBlb2YgYmxvYiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFN1cHBvcnQgcmVndWxhciBsaW5rc1xuICAgICAgYS5ocmVmID0gYmxvYlxuICAgICAgaWYgKGEub3JpZ2luICE9PSBsb2NhdGlvbi5vcmlnaW4pIHtcbiAgICAgICAgY29yc0VuYWJsZWQoYS5ocmVmKVxuICAgICAgICAgID8gZG93bmxvYWQoYmxvYiwgbmFtZSwgb3B0cylcbiAgICAgICAgICA6IGNsaWNrKGEsIGEudGFyZ2V0ID0gJ19ibGFuaycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGljayhhKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdXBwb3J0IGJsb2JzXG4gICAgICBhLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgVVJMLnJldm9rZU9iamVjdFVSTChhLmhyZWYpIH0sIDRFNCkgLy8gNDBzXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgY2xpY2soYSkgfSwgMClcbiAgICB9XG4gIH1cblxuICAvLyBVc2UgbXNTYXZlT3JPcGVuQmxvYiBhcyBhIHNlY29uZCBhcHByb2FjaFxuICA6ICdtc1NhdmVPck9wZW5CbG9iJyBpbiBuYXZpZ2F0b3JcbiAgPyBmdW5jdGlvbiBzYXZlQXMgKGJsb2IsIG5hbWUsIG9wdHMpIHtcbiAgICBuYW1lID0gbmFtZSB8fCBibG9iLm5hbWUgfHwgJ2Rvd25sb2FkJ1xuXG4gICAgaWYgKHR5cGVvZiBibG9iID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKGNvcnNFbmFibGVkKGJsb2IpKSB7XG4gICAgICAgIGRvd25sb2FkKGJsb2IsIG5hbWUsIG9wdHMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxuICAgICAgICBhLmhyZWYgPSBibG9iXG4gICAgICAgIGEudGFyZ2V0ID0gJ19ibGFuaydcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGNsaWNrKGEpIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGJvbShibG9iLCBvcHRzKSwgbmFtZSlcbiAgICB9XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byB1c2luZyBGaWxlUmVhZGVyIGFuZCBhIHBvcHVwXG4gIDogZnVuY3Rpb24gc2F2ZUFzIChibG9iLCBuYW1lLCBvcHRzLCBwb3B1cCkge1xuICAgIC8vIE9wZW4gYSBwb3B1cCBpbW1lZGlhdGVseSBkbyBnbyBhcm91bmQgcG9wdXAgYmxvY2tlclxuICAgIC8vIE1vc3RseSBvbmx5IGF2YWlsYWJsZSBvbiB1c2VyIGludGVyYWN0aW9uIGFuZCB0aGUgZmlsZVJlYWRlciBpcyBhc3luYyBzby4uLlxuICAgIHBvcHVwID0gcG9wdXAgfHwgb3BlbignJywgJ19ibGFuaycpXG4gICAgaWYgKHBvcHVwKSB7XG4gICAgICBwb3B1cC5kb2N1bWVudC50aXRsZSA9XG4gICAgICBwb3B1cC5kb2N1bWVudC5ib2R5LmlubmVyVGV4dCA9ICdkb3dubG9hZGluZy4uLidcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGJsb2IgPT09ICdzdHJpbmcnKSByZXR1cm4gZG93bmxvYWQoYmxvYiwgbmFtZSwgb3B0cylcblxuICAgIHZhciBmb3JjZSA9IGJsb2IudHlwZSA9PT0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbiAgICB2YXIgaXNTYWZhcmkgPSAvY29uc3RydWN0b3IvaS50ZXN0KF9nbG9iYWwuSFRNTEVsZW1lbnQpIHx8IF9nbG9iYWwuc2FmYXJpXG4gICAgdmFyIGlzQ2hyb21lSU9TID0gL0NyaU9TXFwvW1xcZF0rLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbiAgICBpZiAoKGlzQ2hyb21lSU9TIHx8IChmb3JjZSAmJiBpc1NhZmFyaSkgfHwgaXNNYWNPU1dlYlZpZXcpICYmIHR5cGVvZiBGaWxlUmVhZGVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gU2FmYXJpIGRvZXNuJ3QgYWxsb3cgZG93bmxvYWRpbmcgb2YgYmxvYiBVUkxzXG4gICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHVybCA9IHJlYWRlci5yZXN1bHRcbiAgICAgICAgdXJsID0gaXNDaHJvbWVJT1MgPyB1cmwgOiB1cmwucmVwbGFjZSgvXmRhdGE6W147XSo7LywgJ2RhdGE6YXR0YWNobWVudC9maWxlOycpXG4gICAgICAgIGlmIChwb3B1cCkgcG9wdXAubG9jYXRpb24uaHJlZiA9IHVybFxuICAgICAgICBlbHNlIGxvY2F0aW9uID0gdXJsXG4gICAgICAgIHBvcHVwID0gbnVsbCAvLyByZXZlcnNlLXRhYm5hYmJpbmcgIzQ2MFxuICAgICAgfVxuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYilcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIFVSTCA9IF9nbG9iYWwuVVJMIHx8IF9nbG9iYWwud2Via2l0VVJMXG4gICAgICB2YXIgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAgaWYgKHBvcHVwKSBwb3B1cC5sb2NhdGlvbiA9IHVybFxuICAgICAgZWxzZSBsb2NhdGlvbi5ocmVmID0gdXJsXG4gICAgICBwb3B1cCA9IG51bGwgLy8gcmV2ZXJzZS10YWJuYWJiaW5nICM0NjBcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCkgfSwgNEU0KSAvLyA0MHNcbiAgICB9XG4gIH1cbilcblxuX2dsb2JhbC5zYXZlQXMgPSBzYXZlQXMuc2F2ZUFzID0gc2F2ZUFzXG5cbmlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHNhdmVBcztcbn1cbiIsICIvKipcbiAqIENyb3Bwci5qc1xuICogaHR0cHM6Ly9naXRodWIuY29tL2phbWVzc3Nvb2kvQ3JvcHByLmpzXG4gKiBcbiAqIEEgSmF2YVNjcmlwdCBpbWFnZSBjcm9wcGVyIHRoYXQncyBsaWdodHdlaWdodCwgYXdlc29tZSwgYW5kIGhhc1xuICogemVybyBkZXBlbmRlbmNpZXMuXG4gKiBcbiAqIChDKSAyMDE3IEphbWVzIE9vaS4gUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG5cdHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcblx0dHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcblx0KGdsb2JhbC5Dcm9wcHIgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbihmdW5jdGlvbiAoKSB7XG4gIHZhciBsYXN0VGltZSA9IDA7XG4gIHZhciB2ZW5kb3JzID0gWydtcycsICdtb3onLCAnd2Via2l0JywgJ28nXTtcbiAgZm9yICh2YXIgeCA9IDA7IHggPCB2ZW5kb3JzLmxlbmd0aCAmJiAhd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZTsgKyt4KSB7XG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHdpbmRvd1t2ZW5kb3JzW3hdICsgJ1JlcXVlc3RBbmltYXRpb25GcmFtZSddO1xuICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSA9IHdpbmRvd1t2ZW5kb3JzW3hdICsgJ0NhbmNlbEFuaW1hdGlvbkZyYW1lJ10gfHwgd2luZG93W3ZlbmRvcnNbeF0gKyAnQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lJ107XG4gIH1cbiAgaWYgKCF3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBlbGVtZW50KSB7XG4gICAgdmFyIGN1cnJUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgdmFyIHRpbWVUb0NhbGwgPSBNYXRoLm1heCgwLCAxNiAtIChjdXJyVGltZSAtIGxhc3RUaW1lKSk7XG4gICAgdmFyIGlkID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGJhY2soY3VyclRpbWUgKyB0aW1lVG9DYWxsKTtcbiAgICB9LCB0aW1lVG9DYWxsKTtcbiAgICBsYXN0VGltZSA9IGN1cnJUaW1lICsgdGltZVRvQ2FsbDtcbiAgICByZXR1cm4gaWQ7XG4gIH07XG4gIGlmICghd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKSB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICBjbGVhclRpbWVvdXQoaWQpO1xuICB9O1xufSkoKTtcbihmdW5jdGlvbiAoKSB7XG4gIGlmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBmYWxzZTtcbiAgZnVuY3Rpb24gQ3VzdG9tRXZlbnQoZXZlbnQsIHBhcmFtcykge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiBmYWxzZSwgZGV0YWlsOiB1bmRlZmluZWQgfTtcbiAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7XG4gICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudCwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlLCBwYXJhbXMuZGV0YWlsKTtcbiAgICByZXR1cm4gZXZ0O1xuICB9XG4gIEN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IHdpbmRvdy5FdmVudC5wcm90b3R5cGU7XG4gIHdpbmRvdy5DdXN0b21FdmVudCA9IEN1c3RvbUV2ZW50O1xufSkoKTtcbihmdW5jdGlvbiAod2luZG93KSB7XG4gIHRyeSB7XG4gICAgbmV3IEN1c3RvbUV2ZW50KCd0ZXN0Jyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlKSB7fVxuICBmdW5jdGlvbiBNb3VzZUV2ZW50KGV2ZW50VHlwZSwgcGFyYW1zKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHsgYnViYmxlczogZmFsc2UsIGNhbmNlbGFibGU6IGZhbHNlIH07XG4gICAgdmFyIG1vdXNlRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnTW91c2VFdmVudCcpO1xuICAgIG1vdXNlRXZlbnQuaW5pdE1vdXNlRXZlbnQoZXZlbnRUeXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUsIHdpbmRvdywgMCwgMCwgMCwgMCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAsIG51bGwpO1xuICAgIHJldHVybiBtb3VzZUV2ZW50O1xuICB9XG4gIE1vdXNlRXZlbnQucHJvdG90eXBlID0gRXZlbnQucHJvdG90eXBlO1xuICB3aW5kb3cuTW91c2VFdmVudCA9IE1vdXNlRXZlbnQ7XG59KSh3aW5kb3cpO1xuXG52YXIgY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufTtcblxudmFyIGNyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gICAgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9O1xufSgpO1xuXG5cblxuXG5cblxuXG52YXIgZ2V0ID0gZnVuY3Rpb24gZ2V0KG9iamVjdCwgcHJvcGVydHksIHJlY2VpdmVyKSB7XG4gIGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbiAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpO1xuXG4gIGlmIChkZXNjID09PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7XG5cbiAgICBpZiAocGFyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0KHBhcmVudCwgcHJvcGVydHksIHJlY2VpdmVyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MpIHtcbiAgICByZXR1cm4gZGVzYy52YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7XG5cbiAgICBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTtcbiAgfVxufTtcblxudmFyIGluaGVyaXRzID0gZnVuY3Rpb24gKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xufTtcblxuXG5cblxuXG5cblxuXG5cblxuXG52YXIgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiA9IGZ1bmN0aW9uIChzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmO1xufTtcblxuXG5cblxuXG52YXIgc2xpY2VkVG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gc2xpY2VJdGVyYXRvcihhcnIsIGkpIHtcbiAgICB2YXIgX2FyciA9IFtdO1xuICAgIHZhciBfbiA9IHRydWU7XG4gICAgdmFyIF9kID0gZmFsc2U7XG4gICAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgICBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfZCA9IHRydWU7XG4gICAgICBfZSA9IGVycjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSkgX2lbXCJyZXR1cm5cIl0oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIF9hcnI7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGFyciwgaSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICAgIHJldHVybiBhcnI7XG4gICAgfSBlbHNlIGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpIHtcbiAgICAgIHJldHVybiBzbGljZUl0ZXJhdG9yKGFyciwgaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpO1xuICAgIH1cbiAgfTtcbn0oKTtcblxudmFyIEhhbmRsZSA9XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgSGFuZGxlIGluc3RhbmNlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBwb3NpdGlvbiBUaGUgeCBhbmQgeSByYXRpbyBwb3NpdGlvbiBvZiB0aGUgaGFuZGxlXG4gKiAgICAgIHdpdGhpbiB0aGUgY3JvcCByZWdpb24uIEFjY2VwdHMgYSB2YWx1ZSBiZXR3ZWVuIDAgdG8gMSBpbiB0aGUgb3JkZXJcbiAqICAgICAgb2YgW1gsIFldLlxuICogQHBhcmFtIHtBcnJheX0gY29uc3RyYWludHMgRGVmaW5lIHRoZSBzaWRlIG9mIHRoZSBjcm9wIHJlZ2lvbiB0aGF0XG4gKiAgICAgIGlzIHRvIGJlIGFmZmVjdGVkIGJ5IHRoaXMgaGFuZGxlLiBBY2NlcHRzIGEgdmFsdWUgb2YgMCBvciAxIGluIHRoZVxuICogICAgICBvcmRlciBvZiBbVE9QLCBSSUdIVCwgQk9UVE9NLCBMRUZUXS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBjdXJzb3IgVGhlIENTUyBjdXJzb3Igb2YgdGhpcyBoYW5kbGUuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGV2ZW50QnVzIFRoZSBlbGVtZW50IHRvIGRpc3BhdGNoIGV2ZW50cyB0by5cbiAqL1xuZnVuY3Rpb24gSGFuZGxlKHBvc2l0aW9uLCBjb25zdHJhaW50cywgY3Vyc29yLCBldmVudEJ1cykge1xuICBjbGFzc0NhbGxDaGVjayh0aGlzLCBIYW5kbGUpO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgdGhpcy5jb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzO1xuICB0aGlzLmN1cnNvciA9IGN1cnNvcjtcbiAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzO1xuICB0aGlzLmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHRoaXMuZWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1oYW5kbGUnO1xuICB0aGlzLmVsLnN0eWxlLmN1cnNvciA9IGN1cnNvcjtcbiAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gIGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICBzZWxmLmV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdoYW5kbGVzdGFydCcsIHtcbiAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYgfVxuICAgIH0pKTtcbiAgfVxuICBmdW5jdGlvbiBvbk1vdXNlVXAoZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZWVuZCcsIHtcbiAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYgfVxuICAgIH0pKTtcbiAgfVxuICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBzZWxmLmV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdoYW5kbGVtb3ZlJywge1xuICAgICAgZGV0YWlsOiB7IG1vdXNlWDogZS5jbGllbnRYLCBtb3VzZVk6IGUuY2xpZW50WSB9XG4gICAgfSkpO1xuICB9XG59O1xuXG52YXIgQm94ID0gZnVuY3Rpb24gKCkge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBCb3ggaW5zdGFuY2UuXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge051bWJlcn0geDFcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHkxXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB4MlxuICAgKiBAcGFyYW0ge051bWJlcn0geTJcbiAgICovXG4gIGZ1bmN0aW9uIEJveCh4MSwgeTEsIHgyLCB5Mikge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEJveCk7XG4gICAgdGhpcy54MSA9IHgxO1xuICAgIHRoaXMueTEgPSB5MTtcbiAgICB0aGlzLngyID0geDI7XG4gICAgdGhpcy55MiA9IHkyO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBuZXcgZGltZW5zaW9ucyBvZiB0aGUgYm94LlxuICAgKiBAcGFyYW0ge051bWJlcn0geDFcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHkxXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB4MlxuICAgKiBAcGFyYW0ge051bWJlcn0geTJcbiAgICovXG4gIGNyZWF0ZUNsYXNzKEJveCwgW3tcbiAgICBrZXk6ICdzZXQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQkJDEoKSB7XG4gICAgICB2YXIgeDEgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG4gICAgICB2YXIgeTEgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICB2YXIgeDIgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7XG4gICAgICB2YXIgeTIgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gICAgICB0aGlzLngxID0geDEgPT0gbnVsbCA/IHRoaXMueDEgOiB4MTtcbiAgICAgIHRoaXMueTEgPSB5MSA9PSBudWxsID8gdGhpcy55MSA6IHkxO1xuICAgICAgdGhpcy54MiA9IHgyID09IG51bGwgPyB0aGlzLngyIDogeDI7XG4gICAgICB0aGlzLnkyID0geTIgPT0gbnVsbCA/IHRoaXMueTIgOiB5MjtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSB3aWR0aCBvZiB0aGUgYm94LlxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICd3aWR0aCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHdpZHRoKCkge1xuICAgICAgcmV0dXJuIE1hdGguYWJzKHRoaXMueDIgLSB0aGlzLngxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgaGVpZ2h0IG9mIHRoZSBib3guXG4gICAgICogQHJldHVybnMge051bWJlcn1cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ2hlaWdodCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhlaWdodCgpIHtcbiAgICAgIHJldHVybiBNYXRoLmFicyh0aGlzLnkyIC0gdGhpcy55MSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2l6ZXMgdGhlIGJveCB0byBhIG5ldyBzaXplLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBuZXdXaWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBuZXdIZWlnaHRcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbb3JpZ2luXSBUaGUgb3JpZ2luIHBvaW50IHRvIHJlc2l6ZSBmcm9tLlxuICAgICAqICAgICAgRGVmYXVsdHMgdG8gWzAsIDBdICh0b3AgbGVmdCkuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdyZXNpemUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCkge1xuICAgICAgdmFyIG9yaWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogWzAsIDBdO1xuICAgICAgdmFyIGZyb21YID0gdGhpcy54MSArIHRoaXMud2lkdGgoKSAqIG9yaWdpblswXTtcbiAgICAgIHZhciBmcm9tWSA9IHRoaXMueTEgKyB0aGlzLmhlaWdodCgpICogb3JpZ2luWzFdO1xuICAgICAgdGhpcy54MSA9IGZyb21YIC0gbmV3V2lkdGggKiBvcmlnaW5bMF07XG4gICAgICB0aGlzLnkxID0gZnJvbVkgLSBuZXdIZWlnaHQgKiBvcmlnaW5bMV07XG4gICAgICB0aGlzLngyID0gdGhpcy54MSArIG5ld1dpZHRoO1xuICAgICAgdGhpcy55MiA9IHRoaXMueTEgKyBuZXdIZWlnaHQ7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2NhbGUgdGhlIGJveCBieSBhIGZhY3Rvci5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZmFjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW29yaWdpbl0gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnc2NhbGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzY2FsZShmYWN0b3IpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFswLCAwXTtcbiAgICAgIHZhciBuZXdXaWR0aCA9IHRoaXMud2lkdGgoKSAqIGZhY3RvcjtcbiAgICAgIHZhciBuZXdIZWlnaHQgPSB0aGlzLmhlaWdodCgpICogZmFjdG9yO1xuICAgICAgdGhpcy5yZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ21vdmUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtb3ZlKCkge1xuICAgICAgdmFyIHggPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG4gICAgICB2YXIgeSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgoKTtcbiAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodCgpO1xuICAgICAgeCA9IHggPT09IG51bGwgPyB0aGlzLngxIDogeDtcbiAgICAgIHkgPSB5ID09PSBudWxsID8gdGhpcy55MSA6IHk7XG4gICAgICB0aGlzLngxID0geDtcbiAgICAgIHRoaXMueTEgPSB5O1xuICAgICAgdGhpcy54MiA9IHggKyB3aWR0aDtcbiAgICAgIHRoaXMueTIgPSB5ICsgaGVpZ2h0O1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCByZWxhdGl2ZSB4IGFuZCB5IGNvb3JkaW5hdGVzIG9mIGEgZ2l2ZW4gcG9pbnQgd2l0aGluIHRoZSBib3guXG4gICAgICogQHBhcmFtIHtBcnJheX0gcG9pbnQgVGhlIHggYW5kIHkgcmF0aW8gcG9zaXRpb24gd2l0aGluIHRoZSBib3guXG4gICAgICogQHJldHVybnMge0FycmF5fSBUaGUgeCBhbmQgeSBjb29yZGluYXRlcyBbeCwgeV0uXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdnZXRSZWxhdGl2ZVBvaW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmVsYXRpdmVQb2ludCgpIHtcbiAgICAgIHZhciBwb2ludCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogWzAsIDBdO1xuICAgICAgdmFyIHggPSB0aGlzLndpZHRoKCkgKiBwb2ludFswXTtcbiAgICAgIHZhciB5ID0gdGhpcy5oZWlnaHQoKSAqIHBvaW50WzFdO1xuICAgICAgcmV0dXJuIFt4LCB5XTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGFic29sdXRlIHggYW5kIHkgY29vcmRpbmF0ZXMgb2YgYSBnaXZlbiBwb2ludCB3aXRoaW4gdGhlIGJveC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwb2ludCBUaGUgeCBhbmQgeSByYXRpbyBwb3NpdGlvbiB3aXRoaW4gdGhlIGJveC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFRoZSB4IGFuZCB5IGNvb3JkaW5hdGVzIFt4LCB5XS5cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ2dldEFic29sdXRlUG9pbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBYnNvbHV0ZVBvaW50KCkge1xuICAgICAgdmFyIHBvaW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbMCwgMF07XG4gICAgICB2YXIgeCA9IHRoaXMueDEgKyB0aGlzLndpZHRoKCkgKiBwb2ludFswXTtcbiAgICAgIHZhciB5ID0gdGhpcy55MSArIHRoaXMuaGVpZ2h0KCkgKiBwb2ludFsxXTtcbiAgICAgIHJldHVybiBbeCwgeV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cmFpbiB0aGUgYm94IHRvIGEgZml4ZWQgcmF0aW8uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHJhdGlvXG4gICAgICogQHBhcmFtIHtBcnJheX0gW29yaWdpbl0gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgRGVmYXVsdHMgdG8gWzAsIDBdICh0b3AgbGVmdCkuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtncm93XSBUaGUgYXhpcyB0byBncm93IHRvIG1haW50YWluIHRoZSByYXRpby5cbiAgICAgKiAgICAgRGVmYXVsdHMgdG8gJ2hlaWdodCcuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdjb25zdHJhaW5Ub1JhdGlvJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29uc3RyYWluVG9SYXRpbyhyYXRpbykge1xuICAgICAgdmFyIG9yaWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogWzAsIDBdO1xuICAgICAgdmFyIGdyb3cgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6ICdoZWlnaHQnO1xuICAgICAgaWYgKHJhdGlvID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgoKTtcbiAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodCgpO1xuICAgICAgc3dpdGNoIChncm93KSB7XG4gICAgICAgIGNhc2UgJ2hlaWdodCc6XG4gICAgICAgICAgdGhpcy5yZXNpemUodGhpcy53aWR0aCgpLCB0aGlzLndpZHRoKCkgKiByYXRpbywgb3JpZ2luKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnd2lkdGgnOlxuICAgICAgICAgIHRoaXMucmVzaXplKHRoaXMuaGVpZ2h0KCkgKiAxIC8gcmF0aW8sIHRoaXMuaGVpZ2h0KCksIG9yaWdpbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5yZXNpemUodGhpcy53aWR0aCgpLCB0aGlzLndpZHRoKCkgKiByYXRpbywgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJhaW4gdGhlIGJveCB3aXRoaW4gYSBib3VuZGFyeS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYm91bmRhcnlXaWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBib3VuZGFyeUhlaWdodFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtvcmlnaW5dIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnY29uc3RyYWluVG9Cb3VuZGFyeScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbnN0cmFpblRvQm91bmRhcnkoYm91bmRhcnlXaWR0aCwgYm91bmRhcnlIZWlnaHQpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IFswLCAwXTtcbiAgICAgIHZhciBfZ2V0QWJzb2x1dGVQb2ludCA9IHRoaXMuZ2V0QWJzb2x1dGVQb2ludChvcmlnaW4pLFxuICAgICAgICAgIF9nZXRBYnNvbHV0ZVBvaW50MiA9IHNsaWNlZFRvQXJyYXkoX2dldEFic29sdXRlUG9pbnQsIDIpLFxuICAgICAgICAgIG9yaWdpblggPSBfZ2V0QWJzb2x1dGVQb2ludDJbMF0sXG4gICAgICAgICAgb3JpZ2luWSA9IF9nZXRBYnNvbHV0ZVBvaW50MlsxXTtcbiAgICAgIHZhciBtYXhJZkxlZnQgPSBvcmlnaW5YO1xuICAgICAgdmFyIG1heElmVG9wID0gb3JpZ2luWTtcbiAgICAgIHZhciBtYXhJZlJpZ2h0ID0gYm91bmRhcnlXaWR0aCAtIG9yaWdpblg7XG4gICAgICB2YXIgbWF4SWZCb3R0b20gPSBib3VuZGFyeUhlaWdodCAtIG9yaWdpblk7XG4gICAgICB2YXIgZGlyZWN0aW9uWCA9IC0yICogb3JpZ2luWzBdICsgMTtcbiAgICAgIHZhciBkaXJlY3Rpb25ZID0gLTIgKiBvcmlnaW5bMV0gKyAxO1xuICAgICAgdmFyIG1heFdpZHRoID0gbnVsbCxcbiAgICAgICAgICBtYXhIZWlnaHQgPSBudWxsO1xuICAgICAgc3dpdGNoIChkaXJlY3Rpb25YKSB7XG4gICAgICAgIGNhc2UgLTE6XG4gICAgICAgICAgbWF4V2lkdGggPSBtYXhJZkxlZnQ7YnJlYWs7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWluKG1heElmTGVmdCwgbWF4SWZSaWdodCkgKiAyO2JyZWFrO1xuICAgICAgICBjYXNlICsxOlxuICAgICAgICAgIG1heFdpZHRoID0gbWF4SWZSaWdodDticmVhaztcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoZGlyZWN0aW9uWSkge1xuICAgICAgICBjYXNlIC0xOlxuICAgICAgICAgIG1heEhlaWdodCA9IG1heElmVG9wO2JyZWFrO1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5taW4obWF4SWZUb3AsIG1heElmQm90dG9tKSAqIDI7YnJlYWs7XG4gICAgICAgIGNhc2UgKzE6XG4gICAgICAgICAgbWF4SGVpZ2h0ID0gbWF4SWZCb3R0b207YnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy53aWR0aCgpID4gbWF4V2lkdGgpIHtcbiAgICAgICAgdmFyIGZhY3RvciA9IG1heFdpZHRoIC8gdGhpcy53aWR0aCgpO1xuICAgICAgICB0aGlzLnNjYWxlKGZhY3Rvciwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmhlaWdodCgpID4gbWF4SGVpZ2h0KSB7XG4gICAgICAgIHZhciBfZmFjdG9yID0gbWF4SGVpZ2h0IC8gdGhpcy5oZWlnaHQoKTtcbiAgICAgICAgdGhpcy5zY2FsZShfZmFjdG9yLCBvcmlnaW4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cmFpbiB0aGUgYm94IHRvIGEgbWF4aW11bS9taW5pbXVtIHNpemUuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFttYXhXaWR0aF1cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW21heEhlaWdodF1cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW21pbldpZHRoXVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbbWluSGVpZ2h0XVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtvcmlnaW5dIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbcmF0aW9dIFJhdGlvIHRvIG1haW50YWluLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnY29uc3RyYWluVG9TaXplJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29uc3RyYWluVG9TaXplKCkge1xuICAgICAgdmFyIG1heFdpZHRoID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBudWxsO1xuICAgICAgdmFyIG1heEhlaWdodCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgIHZhciBtaW5XaWR0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcbiAgICAgIHZhciBtaW5IZWlnaHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gICAgICB2YXIgb3JpZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiBbMCwgMF07XG4gICAgICB2YXIgcmF0aW8gPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IG51bGw7XG4gICAgICBpZiAocmF0aW8pIHtcbiAgICAgICAgaWYgKHJhdGlvID4gMSkge1xuICAgICAgICAgIG1heFdpZHRoID0gbWF4SGVpZ2h0ICogMSAvIHJhdGlvO1xuICAgICAgICAgIG1pbkhlaWdodCA9IG1pbkhlaWdodCAqIHJhdGlvO1xuICAgICAgICB9IGVsc2UgaWYgKHJhdGlvIDwgMSkge1xuICAgICAgICAgIG1heEhlaWdodCA9IG1heFdpZHRoICogcmF0aW87XG4gICAgICAgICAgbWluV2lkdGggPSBtaW5IZWlnaHQgKiAxIC8gcmF0aW87XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtYXhXaWR0aCAmJiB0aGlzLndpZHRoKCkgPiBtYXhXaWR0aCkge1xuICAgICAgICB2YXIgbmV3V2lkdGggPSBtYXhXaWR0aCxcbiAgICAgICAgICAgIG5ld0hlaWdodCA9IHJhdGlvID09PSBudWxsID8gdGhpcy5oZWlnaHQoKSA6IG1heEhlaWdodDtcbiAgICAgICAgdGhpcy5yZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhIZWlnaHQgJiYgdGhpcy5oZWlnaHQoKSA+IG1heEhlaWdodCkge1xuICAgICAgICB2YXIgX25ld1dpZHRoID0gcmF0aW8gPT09IG51bGwgPyB0aGlzLndpZHRoKCkgOiBtYXhXaWR0aCxcbiAgICAgICAgICAgIF9uZXdIZWlnaHQgPSBtYXhIZWlnaHQ7XG4gICAgICAgIHRoaXMucmVzaXplKF9uZXdXaWR0aCwgX25ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmIChtaW5XaWR0aCAmJiB0aGlzLndpZHRoKCkgPCBtaW5XaWR0aCkge1xuICAgICAgICB2YXIgX25ld1dpZHRoMiA9IG1pbldpZHRoLFxuICAgICAgICAgICAgX25ld0hlaWdodDIgPSByYXRpbyA9PT0gbnVsbCA/IHRoaXMuaGVpZ2h0KCkgOiBtaW5IZWlnaHQ7XG4gICAgICAgIHRoaXMucmVzaXplKF9uZXdXaWR0aDIsIF9uZXdIZWlnaHQyLCBvcmlnaW4pO1xuICAgICAgfVxuICAgICAgaWYgKG1pbkhlaWdodCAmJiB0aGlzLmhlaWdodCgpIDwgbWluSGVpZ2h0KSB7XG4gICAgICAgIHZhciBfbmV3V2lkdGgzID0gcmF0aW8gPT09IG51bGwgPyB0aGlzLndpZHRoKCkgOiBtaW5XaWR0aCxcbiAgICAgICAgICAgIF9uZXdIZWlnaHQzID0gbWluSGVpZ2h0O1xuICAgICAgICB0aGlzLnJlc2l6ZShfbmV3V2lkdGgzLCBfbmV3SGVpZ2h0Mywgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQm94O1xufSgpO1xuXG4vKipcbiAqIEJpbmRzIGFuIGVsZW1lbnQncyB0b3VjaCBldmVudHMgdG8gYmUgc2ltdWxhdGVkIGFzIG1vdXNlIGV2ZW50cy5cbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICovXG5mdW5jdGlvbiBlbmFibGVUb3VjaChlbGVtZW50KSB7XG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHNpbXVsYXRlTW91c2VFdmVudCk7XG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBzaW11bGF0ZU1vdXNlRXZlbnQpO1xuICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHNpbXVsYXRlTW91c2VFdmVudCk7XG59XG4vKipcbiAqIFRyYW5zbGF0ZXMgYSB0b3VjaCBldmVudCB0byBhIG1vdXNlIGV2ZW50LlxuICogQHBhcmFtIHtFdmVudH0gZVxuICovXG5mdW5jdGlvbiBzaW11bGF0ZU1vdXNlRXZlbnQoZSkge1xuICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIHZhciB0b3VjaCA9IGUuY2hhbmdlZFRvdWNoZXNbMF07XG4gIHZhciBldmVudE1hcCA9IHtcbiAgICAndG91Y2hzdGFydCc6ICdtb3VzZWRvd24nLFxuICAgICd0b3VjaG1vdmUnOiAnbW91c2Vtb3ZlJyxcbiAgICAndG91Y2hlbmQnOiAnbW91c2V1cCdcbiAgfTtcbiAgdG91Y2gudGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoZXZlbnRNYXBbZS50eXBlXSwge1xuICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICB2aWV3OiB3aW5kb3csXG4gICAgY2xpZW50WDogdG91Y2guY2xpZW50WCxcbiAgICBjbGllbnRZOiB0b3VjaC5jbGllbnRZLFxuICAgIHNjcmVlblg6IHRvdWNoLnNjcmVlblgsXG4gICAgc2NyZWVuWTogdG91Y2guc2NyZWVuWVxuICB9KSk7XG59XG5cbi8qKlxuICogRGVmaW5lIGEgbGlzdCBvZiBoYW5kbGVzIHRvIGNyZWF0ZS5cbiAqXG4gKiBAcHJvcGVydHkge0FycmF5fSBwb3NpdGlvbiAtIFRoZSB4IGFuZCB5IHJhdGlvIHBvc2l0aW9uIG9mIHRoZSBoYW5kbGUgd2l0aGluXG4gKiAgICAgIHRoZSBjcm9wIHJlZ2lvbi4gQWNjZXB0cyBhIHZhbHVlIGJldHdlZW4gMCB0byAxIGluIHRoZSBvcmRlciBvZiBbWCwgWV0uXG4gKiBAcHJvcGVydHkge0FycmF5fSBjb25zdHJhaW50cyAtIERlZmluZSB0aGUgc2lkZSBvZiB0aGUgY3JvcCByZWdpb24gdGhhdCBpcyB0b1xuICogICAgICBiZSBhZmZlY3RlZCBieSB0aGlzIGhhbmRsZS4gQWNjZXB0cyBhIHZhbHVlIG9mIDAgb3IgMSBpbiB0aGUgb3JkZXIgb2ZcbiAqICAgICAgW1RPUCwgUklHSFQsIEJPVFRPTSwgTEVGVF0uXG4gKiBAcHJvcGVydHkge1N0cmluZ30gY3Vyc29yIC0gVGhlIENTUyBjdXJzb3Igb2YgdGhpcyBoYW5kbGUuXG4gKi9cbnZhciBIQU5ETEVTID0gW3sgcG9zaXRpb246IFswLjAsIDAuMF0sIGNvbnN0cmFpbnRzOiBbMSwgMCwgMCwgMV0sIGN1cnNvcjogJ253LXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuNSwgMC4wXSwgY29uc3RyYWludHM6IFsxLCAwLCAwLCAwXSwgY3Vyc29yOiAnbi1yZXNpemUnIH0sIHsgcG9zaXRpb246IFsxLjAsIDAuMF0sIGNvbnN0cmFpbnRzOiBbMSwgMSwgMCwgMF0sIGN1cnNvcjogJ25lLXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzEuMCwgMC41XSwgY29uc3RyYWludHM6IFswLCAxLCAwLCAwXSwgY3Vyc29yOiAnZS1yZXNpemUnIH0sIHsgcG9zaXRpb246IFsxLjAsIDEuMF0sIGNvbnN0cmFpbnRzOiBbMCwgMSwgMSwgMF0sIGN1cnNvcjogJ3NlLXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuNSwgMS4wXSwgY29uc3RyYWludHM6IFswLCAwLCAxLCAwXSwgY3Vyc29yOiAncy1yZXNpemUnIH0sIHsgcG9zaXRpb246IFswLjAsIDEuMF0sIGNvbnN0cmFpbnRzOiBbMCwgMCwgMSwgMV0sIGN1cnNvcjogJ3N3LXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuMCwgMC41XSwgY29uc3RyYWludHM6IFswLCAwLCAwLCAxXSwgY3Vyc29yOiAndy1yZXNpemUnIH1dO1xudmFyIENyb3BwckNvcmUgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENyb3BwckNvcmUoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgdmFyIGRlZmVycmVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDcm9wcHJDb3JlKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBDcm9wcHJDb3JlLnBhcnNlT3B0aW9ucyhvcHRpb25zIHx8IHt9KTtcbiAgICBpZiAoIWVsZW1lbnQubm9kZU5hbWUpIHtcbiAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpO1xuICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyAnVW5hYmxlIHRvIGZpbmQgZWxlbWVudC4nO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzcmMnKSkge1xuICAgICAgdGhyb3cgJ0ltYWdlIHNyYyBub3QgcHJvdmlkZWQuJztcbiAgICB9XG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZXN0b3JlID0ge1xuICAgICAgcGFyZW50OiBlbGVtZW50LnBhcmVudE5vZGUsXG4gICAgICBlbGVtZW50OiBlbGVtZW50XG4gICAgfTtcbiAgICBpZiAoIWRlZmVycmVkKSB7XG4gICAgICBpZiAoZWxlbWVudC53aWR0aCA9PT0gMCB8fCBlbGVtZW50LmhlaWdodCA9PT0gMCkge1xuICAgICAgICBlbGVtZW50Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpcy5pbml0aWFsaXplKGVsZW1lbnQpO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjcmVhdGVDbGFzcyhDcm9wcHJDb3JlLCBbe1xuICAgIGtleTogJ2luaXRpYWxpemUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0aWFsaXplKGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuY3JlYXRlRE9NKGVsZW1lbnQpO1xuICAgICAgdGhpcy5vcHRpb25zLmNvbnZlcnRUb1BpeGVscyh0aGlzLmNyb3BwZXJFbCk7XG4gICAgICB0aGlzLmF0dGFjaEhhbmRsZXJFdmVudHMoKTtcbiAgICAgIHRoaXMuYXR0YWNoUmVnaW9uRXZlbnRzKCk7XG4gICAgICB0aGlzLmF0dGFjaE92ZXJsYXlFdmVudHMoKTtcbiAgICAgIHRoaXMuYm94ID0gdGhpcy5pbml0aWFsaXplQm94KHRoaXMub3B0aW9ucyk7XG4gICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkluaXRpYWxpemUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uSW5pdGlhbGl6ZSh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjcmVhdGVET00nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVET00odGFyZ2V0RWwpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMuY29udGFpbmVyRWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1jb250YWluZXInO1xuICAgICAgdGhpcy5ldmVudEJ1cyA9IHRoaXMuY29udGFpbmVyRWw7XG4gICAgICBlbmFibGVUb3VjaCh0aGlzLmNvbnRhaW5lckVsKTtcbiAgICAgIHRoaXMuY3JvcHBlckVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aGlzLmNyb3BwZXJFbC5jbGFzc05hbWUgPSAnY3JvcHByJztcbiAgICAgIHRoaXMuaW1hZ2VFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgdGhpcy5pbWFnZUVsLnNldEF0dHJpYnV0ZSgnc3JjJywgdGFyZ2V0RWwuZ2V0QXR0cmlidXRlKCdzcmMnKSk7XG4gICAgICB0aGlzLmltYWdlRWwuc2V0QXR0cmlidXRlKCdhbHQnLCB0YXJnZXRFbC5nZXRBdHRyaWJ1dGUoJ2FsdCcpKTtcbiAgICAgIHRoaXMuaW1hZ2VFbC5jbGFzc05hbWUgPSAnY3JvcHByLWltYWdlJztcbiAgICAgIHRoaXMuaW1hZ2VDbGlwcGVkRWwgPSB0aGlzLmltYWdlRWwuY2xvbmVOb2RlKCk7XG4gICAgICB0aGlzLmltYWdlQ2xpcHBlZEVsLmNsYXNzTmFtZSA9ICdjcm9wcHItaW1hZ2VDbGlwcGVkJztcbiAgICAgIHRoaXMucmVnaW9uRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMucmVnaW9uRWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1yZWdpb24nO1xuICAgICAgdGhpcy5vdmVybGF5RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMub3ZlcmxheUVsLmNsYXNzTmFtZSA9ICdjcm9wcHItb3ZlcmxheSc7XG4gICAgICB2YXIgaGFuZGxlQ29udGFpbmVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGhhbmRsZUNvbnRhaW5lckVsLmNsYXNzTmFtZSA9ICdjcm9wcHItaGFuZGxlQ29udGFpbmVyJztcbiAgICAgIHRoaXMuaGFuZGxlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBIQU5ETEVTLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBoYW5kbGUgPSBuZXcgSGFuZGxlKEhBTkRMRVNbaV0ucG9zaXRpb24sIEhBTkRMRVNbaV0uY29uc3RyYWludHMsIEhBTkRMRVNbaV0uY3Vyc29yLCB0aGlzLmV2ZW50QnVzKTtcbiAgICAgICAgdGhpcy5oYW5kbGVzLnB1c2goaGFuZGxlKTtcbiAgICAgICAgaGFuZGxlQ29udGFpbmVyRWwuYXBwZW5kQ2hpbGQoaGFuZGxlLmVsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3JvcHBlckVsLmFwcGVuZENoaWxkKHRoaXMuaW1hZ2VFbCk7XG4gICAgICB0aGlzLmNyb3BwZXJFbC5hcHBlbmRDaGlsZCh0aGlzLmltYWdlQ2xpcHBlZEVsKTtcbiAgICAgIHRoaXMuY3JvcHBlckVsLmFwcGVuZENoaWxkKHRoaXMucmVnaW9uRWwpO1xuICAgICAgdGhpcy5jcm9wcGVyRWwuYXBwZW5kQ2hpbGQodGhpcy5vdmVybGF5RWwpO1xuICAgICAgdGhpcy5jcm9wcGVyRWwuYXBwZW5kQ2hpbGQoaGFuZGxlQ29udGFpbmVyRWwpO1xuICAgICAgdGhpcy5jb250YWluZXJFbC5hcHBlbmRDaGlsZCh0aGlzLmNyb3BwZXJFbCk7XG4gICAgICB0YXJnZXRFbC5wYXJlbnRFbGVtZW50LnJlcGxhY2VDaGlsZCh0aGlzLmNvbnRhaW5lckVsLCB0YXJnZXRFbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIGltYWdlIHNyYy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3JjXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdzZXRJbWFnZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEltYWdlKHNyYykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG4gICAgICB0aGlzLmltYWdlRWwub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczIuYm94ID0gX3RoaXMyLmluaXRpYWxpemVCb3goX3RoaXMyLm9wdGlvbnMpO1xuICAgICAgICBfdGhpczIucmVkcmF3KCk7XG4gICAgICB9O1xuICAgICAgdGhpcy5pbWFnZUVsLnNyYyA9IHNyYztcbiAgICAgIHRoaXMuaW1hZ2VDbGlwcGVkRWwuc3JjID0gc3JjO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZGVzdHJveScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLl9yZXN0b3JlLnBhcmVudC5yZXBsYWNlQ2hpbGQodGhpcy5fcmVzdG9yZS5lbGVtZW50LCB0aGlzLmNvbnRhaW5lckVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGJveCByZWdpb24gd2l0aCBhIHNldCBvZiBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIFRoZSBvcHRpb25zLlxuICAgICAqIEByZXR1cm5zIHtCb3h9XG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdpbml0aWFsaXplQm94JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZUJveChvcHRzKSB7XG4gICAgICB2YXIgd2lkdGggPSBvcHRzLnN0YXJ0U2l6ZS53aWR0aDtcbiAgICAgIHZhciBoZWlnaHQgPSBvcHRzLnN0YXJ0U2l6ZS5oZWlnaHQ7XG4gICAgICB2YXIgYm94ID0gbmV3IEJveCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIGJveC5jb25zdHJhaW5Ub1JhdGlvKG9wdHMuYXNwZWN0UmF0aW8sIFswLjUsIDAuNV0pO1xuICAgICAgdmFyIG1pbiA9IG9wdHMubWluU2l6ZTtcbiAgICAgIHZhciBtYXggPSBvcHRzLm1heFNpemU7XG4gICAgICBib3guY29uc3RyYWluVG9TaXplKG1heC53aWR0aCwgbWF4LmhlaWdodCwgbWluLndpZHRoLCBtaW4uaGVpZ2h0LCBbMC41LCAwLjVdLCBvcHRzLmFzcGVjdFJhdGlvKTtcbiAgICAgIHZhciBwYXJlbnRXaWR0aCA9IHRoaXMuY3JvcHBlckVsLm9mZnNldFdpZHRoO1xuICAgICAgdmFyIHBhcmVudEhlaWdodCA9IHRoaXMuY3JvcHBlckVsLm9mZnNldEhlaWdodDtcbiAgICAgIGJveC5jb25zdHJhaW5Ub0JvdW5kYXJ5KHBhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHQsIFswLjUsIDAuNV0pO1xuICAgICAgdmFyIHggPSB0aGlzLmNyb3BwZXJFbC5vZmZzZXRXaWR0aCAvIDIgLSBib3gud2lkdGgoKSAvIDI7XG4gICAgICB2YXIgeSA9IHRoaXMuY3JvcHBlckVsLm9mZnNldEhlaWdodCAvIDIgLSBib3guaGVpZ2h0KCkgLyAyO1xuICAgICAgYm94Lm1vdmUoeCwgeSk7XG4gICAgICByZXR1cm4gYm94O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3JlZHJhdycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlZHJhdygpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuICAgICAgdmFyIHdpZHRoID0gTWF0aC5yb3VuZCh0aGlzLmJveC53aWR0aCgpKSxcbiAgICAgICAgICBoZWlnaHQgPSBNYXRoLnJvdW5kKHRoaXMuYm94LmhlaWdodCgpKSxcbiAgICAgICAgICB4MSA9IE1hdGgucm91bmQodGhpcy5ib3gueDEpLFxuICAgICAgICAgIHkxID0gTWF0aC5yb3VuZCh0aGlzLmJveC55MSksXG4gICAgICAgICAgeDIgPSBNYXRoLnJvdW5kKHRoaXMuYm94LngyKSxcbiAgICAgICAgICB5MiA9IE1hdGgucm91bmQodGhpcy5ib3gueTIpO1xuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMy5yZWdpb25FbC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKCcgKyB4MSArICdweCwgJyArIHkxICsgJ3B4KSc7XG4gICAgICAgIF90aGlzMy5yZWdpb25FbC5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICAgICAgX3RoaXMzLnJlZ2lvbkVsLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG4gICAgICAgIF90aGlzMy5pbWFnZUNsaXBwZWRFbC5zdHlsZS5jbGlwID0gJ3JlY3QoJyArIHkxICsgJ3B4LCAnICsgeDIgKyAncHgsICcgKyB5MiArICdweCwgJyArIHgxICsgJ3B4KSc7XG4gICAgICAgIHZhciBjZW50ZXIgPSBfdGhpczMuYm94LmdldEFic29sdXRlUG9pbnQoWy41LCAuNV0pO1xuICAgICAgICB2YXIgeFNpZ24gPSBjZW50ZXJbMF0gLSBfdGhpczMuY3JvcHBlckVsLm9mZnNldFdpZHRoIC8gMiA+PiAzMTtcbiAgICAgICAgdmFyIHlTaWduID0gY2VudGVyWzFdIC0gX3RoaXMzLmNyb3BwZXJFbC5vZmZzZXRIZWlnaHQgLyAyID4+IDMxO1xuICAgICAgICB2YXIgcXVhZHJhbnQgPSAoeFNpZ24gXiB5U2lnbikgKyB5U2lnbiArIHlTaWduICsgNDtcbiAgICAgICAgdmFyIGZvcmVncm91bmRIYW5kbGVJbmRleCA9IC0yICogcXVhZHJhbnQgKyA4O1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IF90aGlzMy5oYW5kbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGhhbmRsZSA9IF90aGlzMy5oYW5kbGVzW2ldO1xuICAgICAgICAgIHZhciBoYW5kbGVXaWR0aCA9IGhhbmRsZS5lbC5vZmZzZXRXaWR0aDtcbiAgICAgICAgICB2YXIgaGFuZGxlSGVpZ2h0ID0gaGFuZGxlLmVsLm9mZnNldEhlaWdodDtcbiAgICAgICAgICB2YXIgbGVmdCA9IHgxICsgd2lkdGggKiBoYW5kbGUucG9zaXRpb25bMF0gLSBoYW5kbGVXaWR0aCAvIDI7XG4gICAgICAgICAgdmFyIHRvcCA9IHkxICsgaGVpZ2h0ICogaGFuZGxlLnBvc2l0aW9uWzFdIC0gaGFuZGxlSGVpZ2h0IC8gMjtcbiAgICAgICAgICBoYW5kbGUuZWwuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgnICsgTWF0aC5yb3VuZChsZWZ0KSArICdweCwgJyArIE1hdGgucm91bmQodG9wKSArICdweCknO1xuICAgICAgICAgIGhhbmRsZS5lbC5zdHlsZS56SW5kZXggPSBmb3JlZ3JvdW5kSGFuZGxlSW5kZXggPT0gaSA/IDUgOiA0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdhdHRhY2hIYW5kbGVyRXZlbnRzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXR0YWNoSGFuZGxlckV2ZW50cygpIHtcbiAgICAgIHZhciBldmVudEJ1cyA9IHRoaXMuZXZlbnRCdXM7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVzdGFydCcsIHRoaXMub25IYW5kbGVNb3ZlU3RhcnQuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVtb3ZlJywgdGhpcy5vbkhhbmRsZU1vdmVNb3ZpbmcuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVlbmQnLCB0aGlzLm9uSGFuZGxlTW92ZUVuZC5iaW5kKHRoaXMpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdhdHRhY2hSZWdpb25FdmVudHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhdHRhY2hSZWdpb25FdmVudHMoKSB7XG4gICAgICB2YXIgZXZlbnRCdXMgPSB0aGlzLmV2ZW50QnVzO1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdGhpcy5yZWdpb25FbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25zdGFydCcsIHRoaXMub25SZWdpb25Nb3ZlU3RhcnQuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25tb3ZlJywgdGhpcy5vblJlZ2lvbk1vdmVNb3ZpbmcuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25lbmQnLCB0aGlzLm9uUmVnaW9uTW92ZUVuZC5iaW5kKHRoaXMpKTtcbiAgICAgIGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICAgICAgZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ3JlZ2lvbnN0YXJ0Jywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdyZWdpb25tb3ZlJywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlVXAoZSkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgICAgICBldmVudEJ1cy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgncmVnaW9uZW5kJywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnYXR0YWNoT3ZlcmxheUV2ZW50cycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGF0dGFjaE92ZXJsYXlFdmVudHMoKSB7XG4gICAgICB2YXIgU09VVEhFQVNUX0hBTkRMRV9JRFggPSA0O1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHRtcEJveCA9IG51bGw7XG4gICAgICB0aGlzLm92ZXJsYXlFbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICAgIHZhciBjb250YWluZXIgPSBzZWxmLmNyb3BwZXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdmFyIG1vdXNlWCA9IGUuY2xpZW50WCAtIGNvbnRhaW5lci5sZWZ0O1xuICAgICAgICB2YXIgbW91c2VZID0gZS5jbGllbnRZIC0gY29udGFpbmVyLnRvcDtcbiAgICAgICAgdG1wQm94ID0gc2VsZi5ib3g7XG4gICAgICAgIHNlbGYuYm94ID0gbmV3IEJveChtb3VzZVgsIG1vdXNlWSwgbW91c2VYICsgMSwgbW91c2VZICsgMSk7XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZXN0YXJ0Jywge1xuICAgICAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYuaGFuZGxlc1tTT1VUSEVBU1RfSEFORExFX0lEWF0gfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZW1vdmUnLCB7XG4gICAgICAgICAgZGV0YWlsOiB7IG1vdXNlWDogZS5jbGllbnRYLCBtb3VzZVk6IGUuY2xpZW50WSB9XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIG9uTW91c2VVcChlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICAgIGlmIChzZWxmLmJveC53aWR0aCgpID09PSAxICYmIHNlbGYuYm94LmhlaWdodCgpID09PSAxKSB7XG4gICAgICAgICAgc2VsZi5ib3ggPSB0bXBCb3g7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZWVuZCcsIHtcbiAgICAgICAgICBkZXRhaWw6IHsgbW91c2VYOiBlLmNsaWVudFgsIG1vdXNlWTogZS5jbGllbnRZIH1cbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uSGFuZGxlTW92ZVN0YXJ0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25IYW5kbGVNb3ZlU3RhcnQoZSkge1xuICAgICAgdmFyIGhhbmRsZSA9IGUuZGV0YWlsLmhhbmRsZTtcbiAgICAgIHZhciBvcmlnaW5Qb2ludCA9IFsxIC0gaGFuZGxlLnBvc2l0aW9uWzBdLCAxIC0gaGFuZGxlLnBvc2l0aW9uWzFdXTtcbiAgICAgIHZhciBfYm94JGdldEFic29sdXRlUG9pbnQgPSB0aGlzLmJveC5nZXRBYnNvbHV0ZVBvaW50KG9yaWdpblBvaW50KSxcbiAgICAgICAgICBfYm94JGdldEFic29sdXRlUG9pbnQyID0gc2xpY2VkVG9BcnJheShfYm94JGdldEFic29sdXRlUG9pbnQsIDIpLFxuICAgICAgICAgIG9yaWdpblggPSBfYm94JGdldEFic29sdXRlUG9pbnQyWzBdLFxuICAgICAgICAgIG9yaWdpblkgPSBfYm94JGdldEFic29sdXRlUG9pbnQyWzFdO1xuICAgICAgdGhpcy5hY3RpdmVIYW5kbGUgPSB7IGhhbmRsZTogaGFuZGxlLCBvcmlnaW5Qb2ludDogb3JpZ2luUG9pbnQsIG9yaWdpblg6IG9yaWdpblgsIG9yaWdpblk6IG9yaWdpblkgfTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wU3RhcnQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcFN0YXJ0KHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnb25IYW5kbGVNb3ZlTW92aW5nJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25IYW5kbGVNb3ZlTW92aW5nKGUpIHtcbiAgICAgIHZhciBfZSRkZXRhaWwgPSBlLmRldGFpbCxcbiAgICAgICAgICBtb3VzZVggPSBfZSRkZXRhaWwubW91c2VYLFxuICAgICAgICAgIG1vdXNlWSA9IF9lJGRldGFpbC5tb3VzZVk7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jcm9wcGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBtb3VzZVggPSBtb3VzZVggLSBjb250YWluZXIubGVmdDtcbiAgICAgIG1vdXNlWSA9IG1vdXNlWSAtIGNvbnRhaW5lci50b3A7XG4gICAgICBpZiAobW91c2VYIDwgMCkge1xuICAgICAgICBtb3VzZVggPSAwO1xuICAgICAgfSBlbHNlIGlmIChtb3VzZVggPiBjb250YWluZXIud2lkdGgpIHtcbiAgICAgICAgbW91c2VYID0gY29udGFpbmVyLndpZHRoO1xuICAgICAgfVxuICAgICAgaWYgKG1vdXNlWSA8IDApIHtcbiAgICAgICAgbW91c2VZID0gMDtcbiAgICAgIH0gZWxzZSBpZiAobW91c2VZID4gY29udGFpbmVyLmhlaWdodCkge1xuICAgICAgICBtb3VzZVkgPSBjb250YWluZXIuaGVpZ2h0O1xuICAgICAgfVxuICAgICAgdmFyIG9yaWdpbiA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblBvaW50LnNsaWNlKCk7XG4gICAgICB2YXIgb3JpZ2luWCA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblg7XG4gICAgICB2YXIgb3JpZ2luWSA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblk7XG4gICAgICB2YXIgaGFuZGxlID0gdGhpcy5hY3RpdmVIYW5kbGUuaGFuZGxlO1xuICAgICAgdmFyIFRPUF9NT1ZBQkxFID0gaGFuZGxlLmNvbnN0cmFpbnRzWzBdID09PSAxO1xuICAgICAgdmFyIFJJR0hUX01PVkFCTEUgPSBoYW5kbGUuY29uc3RyYWludHNbMV0gPT09IDE7XG4gICAgICB2YXIgQk9UVE9NX01PVkFCTEUgPSBoYW5kbGUuY29uc3RyYWludHNbMl0gPT09IDE7XG4gICAgICB2YXIgTEVGVF9NT1ZBQkxFID0gaGFuZGxlLmNvbnN0cmFpbnRzWzNdID09PSAxO1xuICAgICAgdmFyIE1VTFRJX0FYSVMgPSAoTEVGVF9NT1ZBQkxFIHx8IFJJR0hUX01PVkFCTEUpICYmIChUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSk7XG4gICAgICB2YXIgeDEgPSBMRUZUX01PVkFCTEUgfHwgUklHSFRfTU9WQUJMRSA/IG9yaWdpblggOiB0aGlzLmJveC54MTtcbiAgICAgIHZhciB4MiA9IExFRlRfTU9WQUJMRSB8fCBSSUdIVF9NT1ZBQkxFID8gb3JpZ2luWCA6IHRoaXMuYm94LngyO1xuICAgICAgdmFyIHkxID0gVE9QX01PVkFCTEUgfHwgQk9UVE9NX01PVkFCTEUgPyBvcmlnaW5ZIDogdGhpcy5ib3gueTE7XG4gICAgICB2YXIgeTIgPSBUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSA/IG9yaWdpblkgOiB0aGlzLmJveC55MjtcbiAgICAgIHgxID0gTEVGVF9NT1ZBQkxFID8gbW91c2VYIDogeDE7XG4gICAgICB4MiA9IFJJR0hUX01PVkFCTEUgPyBtb3VzZVggOiB4MjtcbiAgICAgIHkxID0gVE9QX01PVkFCTEUgPyBtb3VzZVkgOiB5MTtcbiAgICAgIHkyID0gQk9UVE9NX01PVkFCTEUgPyBtb3VzZVkgOiB5MjtcbiAgICAgIHZhciBpc0ZsaXBwZWRYID0gZmFsc2UsXG4gICAgICAgICAgaXNGbGlwcGVkWSA9IGZhbHNlO1xuICAgICAgaWYgKExFRlRfTU9WQUJMRSB8fCBSSUdIVF9NT1ZBQkxFKSB7XG4gICAgICAgIGlzRmxpcHBlZFggPSBMRUZUX01PVkFCTEUgPyBtb3VzZVggPiBvcmlnaW5YIDogbW91c2VYIDwgb3JpZ2luWDtcbiAgICAgIH1cbiAgICAgIGlmIChUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSkge1xuICAgICAgICBpc0ZsaXBwZWRZID0gVE9QX01PVkFCTEUgPyBtb3VzZVkgPiBvcmlnaW5ZIDogbW91c2VZIDwgb3JpZ2luWTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0ZsaXBwZWRYKSB7XG4gICAgICAgIHZhciB0bXAgPSB4MTt4MSA9IHgyO3gyID0gdG1wO1xuICAgICAgICBvcmlnaW5bMF0gPSAxIC0gb3JpZ2luWzBdO1xuICAgICAgfVxuICAgICAgaWYgKGlzRmxpcHBlZFkpIHtcbiAgICAgICAgdmFyIF90bXAgPSB5MTt5MSA9IHkyO3kyID0gX3RtcDtcbiAgICAgICAgb3JpZ2luWzFdID0gMSAtIG9yaWdpblsxXTtcbiAgICAgIH1cbiAgICAgIHZhciBib3ggPSBuZXcgQm94KHgxLCB5MSwgeDIsIHkyKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXNwZWN0UmF0aW8pIHtcbiAgICAgICAgdmFyIHJhdGlvID0gdGhpcy5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgICB2YXIgaXNWZXJ0aWNhbE1vdmVtZW50ID0gZmFsc2U7XG4gICAgICAgIGlmIChNVUxUSV9BWElTKSB7XG4gICAgICAgICAgaXNWZXJ0aWNhbE1vdmVtZW50ID0gbW91c2VZID4gYm94LnkxICsgcmF0aW8gKiBib3gud2lkdGgoKSB8fCBtb3VzZVkgPCBib3gueTIgLSByYXRpbyAqIGJveC53aWR0aCgpO1xuICAgICAgICB9IGVsc2UgaWYgKFRPUF9NT1ZBQkxFIHx8IEJPVFRPTV9NT1ZBQkxFKSB7XG4gICAgICAgICAgaXNWZXJ0aWNhbE1vdmVtZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmF0aW9Nb2RlID0gaXNWZXJ0aWNhbE1vdmVtZW50ID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgICAgICBib3guY29uc3RyYWluVG9SYXRpbyhyYXRpbywgb3JpZ2luLCByYXRpb01vZGUpO1xuICAgICAgfVxuICAgICAgdmFyIG1pbiA9IHRoaXMub3B0aW9ucy5taW5TaXplO1xuICAgICAgdmFyIG1heCA9IHRoaXMub3B0aW9ucy5tYXhTaXplO1xuICAgICAgYm94LmNvbnN0cmFpblRvU2l6ZShtYXgud2lkdGgsIG1heC5oZWlnaHQsIG1pbi53aWR0aCwgbWluLmhlaWdodCwgb3JpZ2luLCB0aGlzLm9wdGlvbnMuYXNwZWN0UmF0aW8pO1xuICAgICAgdmFyIHBhcmVudFdpZHRoID0gdGhpcy5jcm9wcGVyRWwub2Zmc2V0V2lkdGg7XG4gICAgICB2YXIgcGFyZW50SGVpZ2h0ID0gdGhpcy5jcm9wcGVyRWwub2Zmc2V0SGVpZ2h0O1xuICAgICAgYm94LmNvbnN0cmFpblRvQm91bmRhcnkocGFyZW50V2lkdGgsIHBhcmVudEhlaWdodCwgb3JpZ2luKTtcbiAgICAgIHRoaXMuYm94ID0gYm94O1xuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wTW92ZSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wTW92ZSh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uSGFuZGxlTW92ZUVuZCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uSGFuZGxlTW92ZUVuZChlKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnb25SZWdpb25Nb3ZlU3RhcnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVTdGFydChlKSB7XG4gICAgICB2YXIgX2UkZGV0YWlsMiA9IGUuZGV0YWlsLFxuICAgICAgICAgIG1vdXNlWCA9IF9lJGRldGFpbDIubW91c2VYLFxuICAgICAgICAgIG1vdXNlWSA9IF9lJGRldGFpbDIubW91c2VZO1xuICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY3JvcHBlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgbW91c2VYID0gbW91c2VYIC0gY29udGFpbmVyLmxlZnQ7XG4gICAgICBtb3VzZVkgPSBtb3VzZVkgLSBjb250YWluZXIudG9wO1xuICAgICAgdGhpcy5jdXJyZW50TW92ZSA9IHtcbiAgICAgICAgb2Zmc2V0WDogbW91c2VYIC0gdGhpcy5ib3gueDEsXG4gICAgICAgIG9mZnNldFk6IG1vdXNlWSAtIHRoaXMuYm94LnkxXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BTdGFydCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wU3RhcnQodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvblJlZ2lvbk1vdmVNb3ZpbmcnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVNb3ZpbmcoZSkge1xuICAgICAgdmFyIF9lJGRldGFpbDMgPSBlLmRldGFpbCxcbiAgICAgICAgICBtb3VzZVggPSBfZSRkZXRhaWwzLm1vdXNlWCxcbiAgICAgICAgICBtb3VzZVkgPSBfZSRkZXRhaWwzLm1vdXNlWTtcbiAgICAgIHZhciBfY3VycmVudE1vdmUgPSB0aGlzLmN1cnJlbnRNb3ZlLFxuICAgICAgICAgIG9mZnNldFggPSBfY3VycmVudE1vdmUub2Zmc2V0WCxcbiAgICAgICAgICBvZmZzZXRZID0gX2N1cnJlbnRNb3ZlLm9mZnNldFk7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jcm9wcGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBtb3VzZVggPSBtb3VzZVggLSBjb250YWluZXIubGVmdDtcbiAgICAgIG1vdXNlWSA9IG1vdXNlWSAtIGNvbnRhaW5lci50b3A7XG4gICAgICB0aGlzLmJveC5tb3ZlKG1vdXNlWCAtIG9mZnNldFgsIG1vdXNlWSAtIG9mZnNldFkpO1xuICAgICAgaWYgKHRoaXMuYm94LngxIDwgMCkge1xuICAgICAgICB0aGlzLmJveC5tb3ZlKDAsIG51bGwpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYm94LngyID4gY29udGFpbmVyLndpZHRoKSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUoY29udGFpbmVyLndpZHRoIC0gdGhpcy5ib3gud2lkdGgoKSwgbnVsbCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ib3gueTEgPCAwKSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUobnVsbCwgMCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ib3gueTIgPiBjb250YWluZXIuaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUobnVsbCwgY29udGFpbmVyLmhlaWdodCAtIHRoaXMuYm94LmhlaWdodCgpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcE1vdmUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcE1vdmUodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvblJlZ2lvbk1vdmVFbmQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVFbmQoZSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BFbmQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcEVuZCh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWUoKSB7XG4gICAgICB2YXIgbW9kZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbnVsbDtcbiAgICAgIGlmIChtb2RlID09PSBudWxsKSB7XG4gICAgICAgIG1vZGUgPSB0aGlzLm9wdGlvbnMucmV0dXJuTW9kZTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2RlID09ICdyZWFsJykge1xuICAgICAgICB2YXIgYWN0dWFsV2lkdGggPSB0aGlzLmltYWdlRWwubmF0dXJhbFdpZHRoO1xuICAgICAgICB2YXIgYWN0dWFsSGVpZ2h0ID0gdGhpcy5pbWFnZUVsLm5hdHVyYWxIZWlnaHQ7XG4gICAgICAgIHZhciBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MgPSB0aGlzLmltYWdlRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICBlbGVtZW50V2lkdGggPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0Mud2lkdGgsXG4gICAgICAgICAgICBlbGVtZW50SGVpZ2h0ID0gX2ltYWdlRWwkZ2V0Qm91bmRpbmdDLmhlaWdodDtcbiAgICAgICAgdmFyIGZhY3RvclggPSBhY3R1YWxXaWR0aCAvIGVsZW1lbnRXaWR0aDtcbiAgICAgICAgdmFyIGZhY3RvclkgPSBhY3R1YWxIZWlnaHQgLyBlbGVtZW50SGVpZ2h0O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IE1hdGgucm91bmQodGhpcy5ib3gueDEgKiBmYWN0b3JYKSxcbiAgICAgICAgICB5OiBNYXRoLnJvdW5kKHRoaXMuYm94LnkxICogZmFjdG9yWSksXG4gICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQodGhpcy5ib3gud2lkdGgoKSAqIGZhY3RvclgpLFxuICAgICAgICAgIGhlaWdodDogTWF0aC5yb3VuZCh0aGlzLmJveC5oZWlnaHQoKSAqIGZhY3RvclkpXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gJ3JhdGlvJykge1xuICAgICAgICB2YXIgX2ltYWdlRWwkZ2V0Qm91bmRpbmdDMiA9IHRoaXMuaW1hZ2VFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgICAgIF9lbGVtZW50V2lkdGggPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MyLndpZHRoLFxuICAgICAgICAgICAgX2VsZW1lbnRIZWlnaHQgPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MyLmhlaWdodDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiByb3VuZCh0aGlzLmJveC54MSAvIF9lbGVtZW50V2lkdGgsIDMpLFxuICAgICAgICAgIHk6IHJvdW5kKHRoaXMuYm94LnkxIC8gX2VsZW1lbnRIZWlnaHQsIDMpLFxuICAgICAgICAgIHdpZHRoOiByb3VuZCh0aGlzLmJveC53aWR0aCgpIC8gX2VsZW1lbnRXaWR0aCwgMyksXG4gICAgICAgICAgaGVpZ2h0OiByb3VuZCh0aGlzLmJveC5oZWlnaHQoKSAvIF9lbGVtZW50SGVpZ2h0LCAzKVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChtb2RlID09ICdyYXcnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogTWF0aC5yb3VuZCh0aGlzLmJveC54MSksXG4gICAgICAgICAgeTogTWF0aC5yb3VuZCh0aGlzLmJveC55MSksXG4gICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQodGhpcy5ib3gud2lkdGgoKSksXG4gICAgICAgICAgaGVpZ2h0OiBNYXRoLnJvdW5kKHRoaXMuYm94LmhlaWdodCgpKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiAncGFyc2VPcHRpb25zJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VPcHRpb25zKG9wdHMpIHtcbiAgICAgIHZhciBkZWZhdWx0cyQkMSA9IHtcbiAgICAgICAgYXNwZWN0UmF0aW86IG51bGwsXG4gICAgICAgIG1heFNpemU6IHsgd2lkdGg6IG51bGwsIGhlaWdodDogbnVsbCB9LFxuICAgICAgICBtaW5TaXplOiB7IHdpZHRoOiBudWxsLCBoZWlnaHQ6IG51bGwgfSxcbiAgICAgICAgc3RhcnRTaXplOiB7IHdpZHRoOiAxMDAsIGhlaWdodDogMTAwLCB1bml0OiAnJScgfSxcbiAgICAgICAgcmV0dXJuTW9kZTogJ3JlYWwnLFxuICAgICAgICBvbkluaXRpYWxpemU6IG51bGwsXG4gICAgICAgIG9uQ3JvcFN0YXJ0OiBudWxsLFxuICAgICAgICBvbkNyb3BNb3ZlOiBudWxsLFxuICAgICAgICBvbkNyb3BFbmQ6IG51bGxcbiAgICAgIH07XG4gICAgICB2YXIgYXNwZWN0UmF0aW8gPSBudWxsO1xuICAgICAgaWYgKG9wdHMuYXNwZWN0UmF0aW8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMuYXNwZWN0UmF0aW8gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgYXNwZWN0UmF0aW8gPSBvcHRzLmFzcGVjdFJhdGlvO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdHMuYXNwZWN0UmF0aW8gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIGFzcGVjdFJhdGlvID0gb3B0cy5hc3BlY3RSYXRpb1sxXSAvIG9wdHMuYXNwZWN0UmF0aW9bMF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBtYXhTaXplID0gbnVsbDtcbiAgICAgIGlmIChvcHRzLm1heFNpemUgIT09IHVuZGVmaW5lZCAmJiBvcHRzLm1heFNpemUgIT09IG51bGwpIHtcbiAgICAgICAgbWF4U2l6ZSA9IHtcbiAgICAgICAgICB3aWR0aDogb3B0cy5tYXhTaXplWzBdIHx8IG51bGwsXG4gICAgICAgICAgaGVpZ2h0OiBvcHRzLm1heFNpemVbMV0gfHwgbnVsbCxcbiAgICAgICAgICB1bml0OiBvcHRzLm1heFNpemVbMl0gfHwgJ3B4J1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdmFyIG1pblNpemUgPSBudWxsO1xuICAgICAgaWYgKG9wdHMubWluU2l6ZSAhPT0gdW5kZWZpbmVkICYmIG9wdHMubWluU2l6ZSAhPT0gbnVsbCkge1xuICAgICAgICBtaW5TaXplID0ge1xuICAgICAgICAgIHdpZHRoOiBvcHRzLm1pblNpemVbMF0gfHwgbnVsbCxcbiAgICAgICAgICBoZWlnaHQ6IG9wdHMubWluU2l6ZVsxXSB8fCBudWxsLFxuICAgICAgICAgIHVuaXQ6IG9wdHMubWluU2l6ZVsyXSB8fCAncHgnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YXIgc3RhcnRTaXplID0gbnVsbDtcbiAgICAgIGlmIChvcHRzLnN0YXJ0U2l6ZSAhPT0gdW5kZWZpbmVkICYmIG9wdHMuc3RhcnRTaXplICE9PSBudWxsKSB7XG4gICAgICAgIHN0YXJ0U2l6ZSA9IHtcbiAgICAgICAgICB3aWR0aDogb3B0cy5zdGFydFNpemVbMF0gfHwgbnVsbCxcbiAgICAgICAgICBoZWlnaHQ6IG9wdHMuc3RhcnRTaXplWzFdIHx8IG51bGwsXG4gICAgICAgICAgdW5pdDogb3B0cy5zdGFydFNpemVbMl0gfHwgJyUnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YXIgb25Jbml0aWFsaXplID0gbnVsbDtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5vbkluaXRpYWxpemUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb25Jbml0aWFsaXplID0gb3B0cy5vbkluaXRpYWxpemU7XG4gICAgICB9XG4gICAgICB2YXIgb25Dcm9wU3RhcnQgPSBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uQ3JvcFN0YXJ0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9uQ3JvcFN0YXJ0ID0gb3B0cy5vbkNyb3BTdGFydDtcbiAgICAgIH1cbiAgICAgIHZhciBvbkNyb3BFbmQgPSBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uQ3JvcEVuZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvbkNyb3BFbmQgPSBvcHRzLm9uQ3JvcEVuZDtcbiAgICAgIH1cbiAgICAgIHZhciBvbkNyb3BNb3ZlID0gbnVsbDtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5vblVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0Nyb3Bwci5qczogYG9uVXBkYXRlYCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS4gUGxlYXNlIHVzZSBgb25Dcm9wTW92ZWAgb3IgYG9uQ3JvcEVuZGAgaW5zdGVhZC4nKTtcbiAgICAgICAgb25Dcm9wTW92ZSA9IG9wdHMub25VcGRhdGU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG9wdHMub25Dcm9wTW92ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvbkNyb3BNb3ZlID0gb3B0cy5vbkNyb3BNb3ZlO1xuICAgICAgfVxuICAgICAgdmFyIHJldHVybk1vZGUgPSBudWxsO1xuICAgICAgaWYgKG9wdHMucmV0dXJuTW9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBzID0gb3B0cy5yZXR1cm5Nb2RlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChbJ3JlYWwnLCAncmF0aW8nLCAncmF3J10uaW5kZXhPZihzKSA9PT0gLTEpIHtcbiAgICAgICAgICB0aHJvdyBcIkludmFsaWQgcmV0dXJuIG1vZGUuXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuTW9kZSA9IHM7XG4gICAgICB9XG4gICAgICB2YXIgY29udmVydFRvUGl4ZWxzID0gZnVuY3Rpb24gY29udmVydFRvUGl4ZWxzKGNvbnRhaW5lcikge1xuICAgICAgICB2YXIgd2lkdGggPSBjb250YWluZXIub2Zmc2V0V2lkdGg7XG4gICAgICAgIHZhciBoZWlnaHQgPSBjb250YWluZXIub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB2YXIgc2l6ZUtleXMgPSBbJ21heFNpemUnLCAnbWluU2l6ZScsICdzdGFydFNpemUnXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBrZXkgPSBzaXplS2V5c1tpXTtcbiAgICAgICAgICBpZiAodGhpc1trZXldICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGhpc1trZXldLnVuaXQgPT0gJyUnKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzW2tleV0ud2lkdGggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzW2tleV0ud2lkdGggPSB0aGlzW2tleV0ud2lkdGggLyAxMDAgKiB3aWR0aDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodGhpc1trZXldLmhlaWdodCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXNba2V5XS5oZWlnaHQgPSB0aGlzW2tleV0uaGVpZ2h0IC8gMTAwICogaGVpZ2h0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgdGhpc1trZXldLnVuaXQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IGZ1bmN0aW9uIGRlZmF1bHRWYWx1ZSh2LCBkKSB7XG4gICAgICAgIHJldHVybiB2ICE9PSBudWxsID8gdiA6IGQ7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXNwZWN0UmF0aW86IGRlZmF1bHRWYWx1ZShhc3BlY3RSYXRpbywgZGVmYXVsdHMkJDEuYXNwZWN0UmF0aW8pLFxuICAgICAgICBtYXhTaXplOiBkZWZhdWx0VmFsdWUobWF4U2l6ZSwgZGVmYXVsdHMkJDEubWF4U2l6ZSksXG4gICAgICAgIG1pblNpemU6IGRlZmF1bHRWYWx1ZShtaW5TaXplLCBkZWZhdWx0cyQkMS5taW5TaXplKSxcbiAgICAgICAgc3RhcnRTaXplOiBkZWZhdWx0VmFsdWUoc3RhcnRTaXplLCBkZWZhdWx0cyQkMS5zdGFydFNpemUpLFxuICAgICAgICByZXR1cm5Nb2RlOiBkZWZhdWx0VmFsdWUocmV0dXJuTW9kZSwgZGVmYXVsdHMkJDEucmV0dXJuTW9kZSksXG4gICAgICAgIG9uSW5pdGlhbGl6ZTogZGVmYXVsdFZhbHVlKG9uSW5pdGlhbGl6ZSwgZGVmYXVsdHMkJDEub25Jbml0aWFsaXplKSxcbiAgICAgICAgb25Dcm9wU3RhcnQ6IGRlZmF1bHRWYWx1ZShvbkNyb3BTdGFydCwgZGVmYXVsdHMkJDEub25Dcm9wU3RhcnQpLFxuICAgICAgICBvbkNyb3BNb3ZlOiBkZWZhdWx0VmFsdWUob25Dcm9wTW92ZSwgZGVmYXVsdHMkJDEub25Dcm9wTW92ZSksXG4gICAgICAgIG9uQ3JvcEVuZDogZGVmYXVsdFZhbHVlKG9uQ3JvcEVuZCwgZGVmYXVsdHMkJDEub25Dcm9wRW5kKSxcbiAgICAgICAgY29udmVydFRvUGl4ZWxzOiBjb252ZXJ0VG9QaXhlbHNcbiAgICAgIH07XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBDcm9wcHJDb3JlO1xufSgpO1xuZnVuY3Rpb24gcm91bmQodmFsdWUsIGRlY2ltYWxzKSB7XG4gIHJldHVybiBOdW1iZXIoTWF0aC5yb3VuZCh2YWx1ZSArICdlJyArIGRlY2ltYWxzKSArICdlLScgKyBkZWNpbWFscyk7XG59XG5cbnZhciBDcm9wcHIkMSA9IGZ1bmN0aW9uIChfQ3JvcHByQ29yZSkge1xuICBpbmhlcml0cyhDcm9wcHIsIF9Dcm9wcHJDb3JlKTtcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBDYWxscyB0aGUgQ3JvcHByQ29yZSdzIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgZnVuY3Rpb24gQ3JvcHByKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB2YXIgX2RlZmVycmVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDcm9wcHIpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChDcm9wcHIuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihDcm9wcHIpKS5jYWxsKHRoaXMsIGVsZW1lbnQsIG9wdGlvbnMsIF9kZWZlcnJlZCkpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY3JvcCByZWdpb24uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbbW9kZV0gV2hpY2ggbW9kZSBvZiBjYWxjdWxhdGlvbiB0byB1c2U6ICdyZWFsJywgJ3JhdGlvJyBvclxuICAgKiAgICAgICdyYXcnLlxuICAgKi9cbiAgY3JlYXRlQ2xhc3MoQ3JvcHByLCBbe1xuICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWUobW9kZSkge1xuICAgICAgcmV0dXJuIGdldChDcm9wcHIucHJvdG90eXBlLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ3JvcHByLnByb3RvdHlwZSksICdnZXRWYWx1ZScsIHRoaXMpLmNhbGwodGhpcywgbW9kZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIGltYWdlIHNyYy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3JjXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdzZXRJbWFnZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEltYWdlKHNyYykge1xuICAgICAgcmV0dXJuIGdldChDcm9wcHIucHJvdG90eXBlLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ3JvcHByLnByb3RvdHlwZSksICdzZXRJbWFnZScsIHRoaXMpLmNhbGwodGhpcywgc3JjKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdkZXN0cm95JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHJldHVybiBnZXQoQ3JvcHByLnByb3RvdHlwZS5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKENyb3Bwci5wcm90b3R5cGUpLCAnZGVzdHJveScsIHRoaXMpLmNhbGwodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1vdmVzIHRoZSBjcm9wIHJlZ2lvbiB0byBhIHNwZWNpZmllZCBjb29yZGluYXRlLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ21vdmVUbycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1vdmVUbyh4LCB5KSB7XG4gICAgICB0aGlzLmJveC5tb3ZlKHgsIHkpO1xuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wRW5kICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5vbkNyb3BFbmQodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNpemVzIHRoZSBjcm9wIHJlZ2lvbiB0byBhIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0LlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHRcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBvcmlnaW4gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgIERlZmF1bHRzIHRvIFswLjUsIDAuNV0gKGNlbnRlcikuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdyZXNpemVUbycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2l6ZVRvKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IFsuNSwgLjVdO1xuICAgICAgdGhpcy5ib3gucmVzaXplKHdpZHRoLCBoZWlnaHQsIG9yaWdpbik7XG4gICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BFbmQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcEVuZCh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNjYWxlIHRoZSBjcm9wIHJlZ2lvbiBieSBhIGZhY3Rvci5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZmFjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gb3JpZ2luIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgICBEZWZhdWx0cyB0byBbMC41LCAwLjVdIChjZW50ZXIpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnc2NhbGVCeScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNjYWxlQnkoZmFjdG9yKSB7XG4gICAgICB2YXIgb3JpZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBbLjUsIC41XTtcbiAgICAgIHRoaXMuYm94LnNjYWxlKGZhY3Rvciwgb3JpZ2luKTtcbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdyZXNldCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgdGhpcy5ib3ggPSB0aGlzLmluaXRpYWxpemVCb3godGhpcy5vcHRpb25zKTtcbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIENyb3Bwcjtcbn0oQ3JvcHByQ29yZSk7XG5cbnJldHVybiBDcm9wcHIkMTtcblxufSkpKTtcbiIsICJleHBvcnQgZW51bSBMaWNlbmNlU3RhdHVzIHtcclxuICBJbnZhbGlkLFxyXG4gIFZhbGlkLFxyXG4gIEV4cGlyZVNvb24sXHJcbiAgRXhwaXJlZFxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElMaWNlbmNlIHtcclxuICByZWFkb25seSBTdGF0dXM/OiBMaWNlbmNlU3RhdHVzO1xyXG4gIHJlYWRvbmx5IE5hbWU6IHN0cmluZztcclxuICByZWFkb25seSBPd25lcjogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IEV4cGlyYXRpb25EYXRlOiBEYXRlIHwgc3RyaW5nO1xyXG4gIHJlYWRvbmx5IEFwcGxpY2F0aW9uczogUmVhZG9ubHlBcnJheTxzdHJpbmc+O1xyXG4gIHJlYWRvbmx5IFNvdXJjZUNvbnRlbnQ6IHN0cmluZztcclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGVudW0gTWVudUl0ZW1UeXBlIHtcclxuICBHcmlkVmlldyA9IDAsXHJcbiAgRGFzaGJvYXJkID0gMSxcclxuICBNZW51Tm9kZSA9IDIsXHJcbiAgUmVwb3J0ID0gMyxcclxuICBEaWFncmFtID0gNCxcclxuICBDRE0gPSA1LFxyXG4gIFNsaWRlc2hvdyA9IDYsXHJcbiAgR2FudHRDaGFydCA9IDdcclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbm90aWZ5KG1zZzogc3RyaW5nLCBzdWNjZWVkOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gIGNvbnN0IHN0YXR1cyA9IHN1Y2NlZWQgPyAnc3VjY2VzcycgOiAnZXJyb3InO1xyXG4gIGNvbnN0IGRpc3BsYXlUaW1lID0gc3VjY2VlZCA/IDIwMDAgOiA0MDAwO1xyXG5cclxuICBEZXZFeHByZXNzLnVpLm5vdGlmeSh7XHJcbiAgICBtZXNzYWdlOiBtc2csXHJcbiAgICB0eXBlOiBzdGF0dXMsXHJcbiAgICBvblNob3dpbmc6IChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1lc3NhZ2VFbGVtZW50ID0gZS5lbGVtZW50LmZpbmQoJy5keC10b2FzdC1tZXNzYWdlJyk7XHJcbiAgICAgIG1lc3NhZ2VFbGVtZW50Lmh0bWwoKG1lc3NhZ2VFbGVtZW50Lmh0bWwoKSB8fCAnJykucmVwbGFjZSgnXFxcXG4nLCAnPGJyIC8+JykpO1xyXG4gICAgfVxyXG4gIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvYXN0T3B0aW9ucywgc3RhdHVzLCBkaXNwbGF5VGltZSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcclxuXHJcbmV4cG9ydCBjb25zdCBpc0Vycm9ySW5mbyA9IChcclxuICByZXNwb25zZURhdGE6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBJRXJyb3JJbmZvIHwgSUVycm9ySW5mb1tdIHwgdW5kZWZpbmVkIHwgbnVsbFxyXG4pOiByZXNwb25zZURhdGEgaXMgSUVycm9ySW5mbyB8IElFcnJvckluZm9bXSA9PiB7XHJcbiAgaWYgKCFyZXNwb25zZURhdGEpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHJlc3BvbnNlRGF0YSlcclxuICAgID8gKHJlc3BvbnNlRGF0YVswXS5TdGFja1RyYWNlICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2VEYXRhWzBdLkVycm9yICE9PSB1bmRlZmluZWQpXHJcbiAgICA6IChyZXNwb25zZURhdGEuRXJyb3IgIT09IHVuZGVmaW5lZCk7XHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElFcnJvckluZm8ge1xyXG4gIEVycm9yOiBzdHJpbmc7XHJcbiAgU3RhY2tUcmFjZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElBcGlSZXNwb25zZTxUPiB7XHJcbiAgRGF0YTogVCB8IElFcnJvckluZm8gfCBJRXJyb3JJbmZvW10gfCB1bmRlZmluZWQ7XHJcbiAgTWVzc2FnZTogc3RyaW5nO1xyXG4gIFJlcXVlc3RTdGF0ZTogUmVxdWVzdFN0YXRlO1xyXG4gIFN0YXR1c0NvZGU6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTG9va3VwRHRvPFQ+IHtcclxuICBWYWx1ZTogVDtcclxuICBUZXh0OiBzdHJpbmc7XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBlbnVtIFJlcXVlc3RTdGF0ZSB7XHJcbiAgQ29tcGxldGVkID0gMSxcclxuICBFcnJvcmVkID0gMlxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBDU1NfQ0xBU1NFUyB9IGZyb20gJy4uL1N0eWxpbmcvSW5kZXgnO1xyXG5cclxuY29uc3QgUE9QVVBfQ09OVEVOVF9DTEFTUyA9ICdwb3B1cC1jb250ZW50JztcclxuY29uc3QgUE9QVVBfRk9PVEVSX0NMQVNTID0gJ3BvcHVwLWZvb3Rlcic7XHJcbmNvbnN0IEJVVFRPTlNfQ0xBU1MgPSAnYnV0dG9ucyc7XHJcbmNvbnN0IE9LX0JUTl9DTEFTUyA9ICdvay1idG4nO1xyXG5jb25zdCBDQU5DRUxfQlROX0NMQVNTID0gJ2NhbmNlbC1idG4nO1xyXG5cclxuaW50ZXJmYWNlIElQb3B1cCB7XHJcbiAgc2hvdzogKCkgPT4gdm9pZDtcclxuICBoaWRlOiAoKSA9PiB2b2lkO1xyXG4gIHJlbW92ZTogKCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUG9wdXBCdXR0b25PcHRpb25zIHtcclxuICB0ZXh0OiBzdHJpbmc7XHJcbiAgaWNvbj86IHN0cmluZztcclxuICBkaXNhYmxlZD86IGJvb2xlYW47XHJcbiAgb25DbGljazogKGNsb3NlUG9wdXApID0+IHZvaWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUxheW91dCgkY29udGFpbmVyLCBjb250ZW50Q2xhc3NOYW1lPykge1xyXG4gIHJldHVybiB7XHJcbiAgICAkY29udGVudDogJCgnPGRpdiAvPicpLmFkZENsYXNzKFBPUFVQX0NPTlRFTlRfQ0xBU1MpLmFkZENsYXNzKGNvbnRlbnRDbGFzc05hbWUpLmFwcGVuZFRvKCRjb250YWluZXIpLFxyXG4gICAgJGZvb3RlcjogJCgnPGRpdiAvPicpLmFkZENsYXNzKFBPUFVQX0ZPT1RFUl9DTEFTUykuYXBwZW5kVG8oJGNvbnRhaW5lcilcclxuICB9O1xyXG59XHJcblxyXG5jb25zdCBzaG93blBvcHVwcyA9IFtdO1xyXG5cclxuZnVuY3Rpb24gY3JlYXRlUG9wdXAoJGVsOiBKUXVlcnksIGR4UG9wdXBPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuUHJvcGVydGllcywgdXNlS2V5UHJlc3NCZWhhdmlvcjogYm9vbGVhbiA9IGZhbHNlKTogSVBvcHVwIHtcclxuICBjb25zdCBzYXZlZE9uU2hvd2luZyA9IGR4UG9wdXBPcHRpb25zLm9uU2hvd2luZztcclxuXHJcbiAgZHhQb3B1cE9wdGlvbnMub25TaG93biA9IChlKSA9PiB7XHJcbiAgICBpZiAoc2F2ZWRPblNob3dpbmcpIHtcclxuICAgICAgc2F2ZWRPblNob3dpbmcoZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYWxsSW5wdXRzID0gcG9wdXAuY29udGVudCgpLmZpbmQoJ2lucHV0W3R5cGU9dGV4dF0nKTtcclxuICAgIGNvbnN0IGZpcnN0SW5wdXQgPSBhbGxJbnB1dHMuZXEoMCk7XHJcblxyXG4gICAgZmlyc3RJbnB1dC5mb2N1cygpO1xyXG5cclxuICAgIGNvbnN0IGtleUhhbmRsZXJzID0ge1xyXG4gICAgICBrZXlkb3duOiAoZXY6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChzaG93blBvcHVwc1tzaG93blBvcHVwcy5sZW5ndGggLSAxXSAhPT0gcG9wdXApIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChldi5rZXlDb2RlID09PSAxMykge1xyXG4gICAgICAgICAgJChldi5jdXJyZW50VGFyZ2V0KS50cmlnZ2VyKCdjaGFuZ2UnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG9uS2V5RG93bihldik7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgaWYgKHVzZUtleVByZXNzQmVoYXZpb3IpIHtcclxuICAgICAgYWxsSW5wdXRzLm9uKGtleUhhbmRsZXJzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZpcnN0SW5wdXQub24oa2V5SGFuZGxlcnMpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XHJcbiAgICBpZiAoZS5rZXlDb2RlID09PSAxMykge1xyXG4gICAgICBwb3B1cC5jb250ZW50KCkuZmluZChgLiR7Q1NTX0NMQVNTRVMuZHhCdXR0b259LiR7T0tfQlROX0NMQVNTfWApLmNsaWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gMjcpIHtcclxuICAgICAgcG9wdXAuY29udGVudCgpLmZpbmQoYC4ke0NTU19DTEFTU0VTLmR4QnV0dG9ufS4ke0NBTkNFTF9CVE5fQ0xBU1N9YCkuY2xpY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IHBvcHVwID0gJGVsXHJcbiAgICAuZHhQb3B1cChkeFBvcHVwT3B0aW9ucylcclxuICAgIC5keFBvcHVwKCdpbnN0YW5jZScpO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc2hvdzogKCkgPT4ge1xyXG4gICAgICBwb3B1cC5zaG93KCk7XHJcbiAgICAgICQoZG9jdW1lbnQpLm9uKHsga2V5ZG93bjogb25LZXlEb3duIH0pO1xyXG4gICAgICBzaG93blBvcHVwcy5wdXNoKHBvcHVwKTtcclxuICAgIH0sXHJcbiAgICBoaWRlOiAoKSA9PiB7XHJcbiAgICAgICQoZG9jdW1lbnQpLm9mZih7IGtleWRvd246IG9uS2V5RG93biB9KTtcclxuICAgICAgcG9wdXAuaGlkZSgpO1xyXG4gICAgICBzaG93blBvcHVwcy5wb3AoKTtcclxuICAgIH0sXHJcbiAgICByZW1vdmU6ICgpID0+ICRlbC5yZW1vdmUoKVxyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCdXR0b25zKFxyXG4gIG9rT3B0aW9uczogRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnMsXHJcbiAgY2FuY2VsT3B0aW9uczogRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuKSB7XHJcbiAgY29uc3QgJHRhYmxlID0gJCgnPHRhYmxlIC8+JykuYWRkQ2xhc3MoQlVUVE9OU19DTEFTUyk7XHJcbiAgY29uc3QgJHRyID0gJCgnPHRyPicpLmFwcGVuZFRvKCR0YWJsZSk7XHJcblxyXG4gIGlmIChva09wdGlvbnMpIHtcclxuICAgICQoJzx0ZCAvPicpXHJcbiAgICAgIC5hdHRyKCd3aWR0aCcsICc1MCUnKVxyXG4gICAgICAuYXBwZW5kKCQoJzxkaXYgLz4nKS5hZGRDbGFzcyhDU1NfQ0xBU1NFUy5keEJ1dHRvbikuYWRkQ2xhc3MoT0tfQlROX0NMQVNTKS5keEJ1dHRvbihva09wdGlvbnMpKVxyXG4gICAgICAuYXBwZW5kVG8oJHRyKTtcclxuICB9XHJcblxyXG4gIGlmIChjYW5jZWxPcHRpb25zKSB7XHJcbiAgICAkKCc8dGQgLz4nKVxyXG4gICAgICAuYXR0cignd2lkdGgnLCAnNTAlJylcclxuICAgICAgLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoQ1NTX0NMQVNTRVMuZHhCdXR0b24pLmFkZENsYXNzKENBTkNFTF9CVE5fQ0xBU1MpLmR4QnV0dG9uKGNhbmNlbE9wdGlvbnMpKVxyXG4gICAgICAuYXBwZW5kVG8oJHRyKTtcclxuICB9XHJcblxyXG4gIHJldHVybiAkdGFibGU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJdGVtKGxhYmVsOiBzdHJpbmcsICR2YWx1ZTogSlF1ZXJ5KSB7XHJcbiAgcmV0dXJuICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnaXRlbScpXHJcbiAgICAuYXBwZW5kKFxyXG4gICAgICAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2Zvcm0tbGFiZWwnKS50ZXh0KGxhYmVsKSxcclxuICAgICAgJCgnPGRpdiAvPicpLmFkZENsYXNzKCd2YWx1ZScpLmFwcGVuZCgkdmFsdWUpXHJcbiAgICApO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElQb3B1cE9wdGlvbnMge1xyXG4gIHVzZUtleVByZXNzQmVoYXZpb3I6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEaWFsb2coXHJcbiAgb3B0aW9uczogRGV2RXhwcmVzcy51aS5keFBvcHVwLlByb3BlcnRpZXMsXHJcbiAgJHBvcHVwQ29udGVudDogSlF1ZXJ5LFxyXG4gIG9rQnRuT3B0aW9ucz86IElQb3B1cEJ1dHRvbk9wdGlvbnMsXHJcbiAgY2FuY2VsQnRuT3B0aW9ucz86IElQb3B1cEJ1dHRvbk9wdGlvbnMsXHJcbiAgYWRkaXRpb25hbE9wdGlvbnM/OiBJUG9wdXBPcHRpb25zXHJcbikge1xyXG4gIGNvbnN0ICRlbCA9ICQoJzxkaXY+JykuYXBwZW5kVG8oJ2JvZHknKTtcclxuICBsZXQgJGJ1dHRvbnM6IEpRdWVyeSA9IG51bGw7XHJcblxyXG4gIGxldCBwb3B1cDogSVBvcHVwID0gbnVsbDtcclxuXHJcbiAgY29uc3QgdXNlS2V5UHJlc3NCZWhhdmlvciA9IGFkZGl0aW9uYWxPcHRpb25zID8gYWRkaXRpb25hbE9wdGlvbnMudXNlS2V5UHJlc3NCZWhhdmlvciA6IGZhbHNlO1xyXG5cclxuICBmdW5jdGlvbiBjbG9zZVBvcHVwKCkge1xyXG4gICAgcG9wdXAuaGlkZSgpO1xyXG4gICAgcG9wdXAucmVtb3ZlKCk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBkeFBvcHVwT3B0aW9uczogRGV2RXhwcmVzcy51aS5keFBvcHVwLlByb3BlcnRpZXMgPSB7XHJcbiAgICBjb250ZW50VGVtcGxhdGU6ICgkcG9wdXBDb250YWluZXIpID0+IHtcclxuICAgICAgY29uc3QgeyAkY29udGVudCwgJGZvb3RlciB9ID0gY3JlYXRlTGF5b3V0KCRwb3B1cENvbnRhaW5lcik7XHJcblxyXG4gICAgICAkY29udGVudC5hcHBlbmQoJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgICBpZiAob2tCdG5PcHRpb25zICYmIGNhbmNlbEJ0bk9wdGlvbnMpIHtcclxuICAgICAgICAkYnV0dG9ucyA9IGNyZWF0ZUJ1dHRvbnMoXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRleHQ6IG9rQnRuT3B0aW9ucy50ZXh0LFxyXG4gICAgICAgICAgICBpY29uOiBva0J0bk9wdGlvbnMuaWNvbixcclxuICAgICAgICAgICAgZGlzYWJsZWQ6IG9rQnRuT3B0aW9ucy5kaXNhYmxlZCxcclxuICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxyXG4gICAgICAgICAgICBvbkNsaWNrOiAoZSkgPT4gb2tCdG5PcHRpb25zLm9uQ2xpY2soY2xvc2VQb3B1cClcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRleHQ6IGNhbmNlbEJ0bk9wdGlvbnMudGV4dCxcclxuICAgICAgICAgICAgaWNvbjogY2FuY2VsQnRuT3B0aW9ucy5pY29uLFxyXG4gICAgICAgICAgICBkaXNhYmxlZDogY2FuY2VsQnRuT3B0aW9ucy5kaXNhYmxlZCxcclxuICAgICAgICAgICAgb25DbGljazogKGUpID0+IGNhbmNlbEJ0bk9wdGlvbnMub25DbGljayhjbG9zZVBvcHVwKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgICRmb290ZXIuYXBwZW5kKCRidXR0b25zKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAkZm9vdGVyLnJlbW92ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgZWxlbWVudEF0dHI6IHsgY2xhc3M6ICdpc3pvbGVhLWR4LXBvcHVwJyB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgcG9wdXBPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuUHJvcGVydGllcyA9IHt9O1xyXG5cclxuICAkLmV4dGVuZCh0cnVlLCBwb3B1cE9wdGlvbnMsIG9wdGlvbnMsIGR4UG9wdXBPcHRpb25zKTtcclxuXHJcbiAgcG9wdXAgPSBjcmVhdGVQb3B1cCgkZWwsIHBvcHVwT3B0aW9ucywgdXNlS2V5UHJlc3NCZWhhdmlvcik7XHJcblxyXG4gIHBvcHVwLnNob3coKTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogcHJlZmVyLXRlbXBsYXRlXHJcbiAgICBva0J0bjogJGJ1dHRvbnMgPyAkYnV0dG9ucy5maW5kKGAuJHsgIE9LX0JUTl9DTEFTU31gKS5keEJ1dHRvbignaW5zdGFuY2UnKSA6IG51bGwsXHJcbiAgICBjbG9zZTogKCkgPT4gY2xvc2VQb3B1cCgpXHJcbiAgfTtcclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGNvbnN0IENTU19DTEFTU0VTID0ge1xyXG4gIGR4RGF0YUdyaWQ6ICdpc3pvbGVhLWR4LWRhdGFncmlkJyxcclxuICBkeEJ1dHRvbjogJ2lzem9sZWEtZHgtYnV0dG9uJyxcclxuICBkeFBvcHVwOiAnaXN6b2xlYS1keC1wb3B1cCdcclxufTtcclxuIiwgIlx1RkVGRmltcG9ydCB7IGNyZWF0ZURpYWxvZyB9IGZyb20gJy4vUG9wdXAnO1xyXG5pbXBvcnQgeyBJRXJyb3JJbmZvIH0gZnJvbSAnLi4vRGF0YS9BcGlSZXNwb25zZSc7XHJcblxyXG5jb25zdCBNQUlOX0VMRU1FTlRfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cCc7XHJcbmNvbnN0IFBPUFVQX0NPTlRFTlRfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fY29udGVudCc7XHJcbmNvbnN0IEVSUk9SX1BPUFVQX01FU1NBR0VfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fZXJyb3ItbWVzc2FnZSc7XHJcbmNvbnN0IEVSUk9SX1BPUFVQX0RFVEFJTFNfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fZXJyb3ItZGV0YWlscyc7XHJcblxyXG5jb25zdCBTSE9XX0RFVEFJTFNfVEVYVCA9ICdTaG93IGRldGFpbHMnO1xyXG5jb25zdCBISURFX0RFVEFJTFNfVEVYVCA9ICdIaWRlIGRldGFpbHMnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVycm9ySW5mb1BvcHVwKHRpdGxlTWVzc2FnZTogc3RyaW5nLCBlcnJvckluZm86IElFcnJvckluZm8gfCBJRXJyb3JJbmZvW10pOiB2b2lkIHtcclxuICBsZXQgcG9wdXA6IERldkV4cHJlc3MudWkuZHhQb3B1cDtcclxuICBjb25zdCBpbmZvQXJyYXkgPSBBcnJheS5pc0FycmF5KGVycm9ySW5mbykgPyBlcnJvckluZm8gOiBbZXJyb3JJbmZvXTtcclxuXHJcbiAgY29uc3QgJHBvcHVwQ29udGVudCA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcyhQT1BVUF9DT05URU5UX0NMQVNTKTtcclxuXHJcbiAgaW5mb0FycmF5LmZvckVhY2goKGksIGluZGV4KSA9PiB7XHJcbiAgICBjb25zdCAkZXJyb3JNZXNzYWdlRWxlbWVudCA9ICQoJzxwIC8+JykuYWRkQ2xhc3MoRVJST1JfUE9QVVBfTUVTU0FHRV9DTEFTUykudGV4dChpLkVycm9yKTtcclxuICAgIGNvbnN0ICRlcnJvckRldGFpbHNFbGVtZW50ID0gJCgnPHAgLz4nKS5hZGRDbGFzcyhFUlJPUl9QT1BVUF9ERVRBSUxTX0NMQVNTKS50ZXh0KGkuU3RhY2tUcmFjZSk7XHJcbiAgICAkcG9wdXBDb250ZW50LmFwcGVuZCgkZXJyb3JNZXNzYWdlRWxlbWVudCwgJGVycm9yRGV0YWlsc0VsZW1lbnQpLmhpZGUoKTtcclxuXHJcbiAgICBpZiAoaW5kZXggPCBpbmZvQXJyYXkubGVuZ3RoIC0gMSkge1xyXG4gICAgICAkcG9wdXBDb250ZW50LmFwcGVuZCgkKCc8aHIgLz4nKSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IHBvcHVwSW5mbyA9IGNyZWF0ZURpYWxvZyhcclxuICAgIHtcclxuICAgICAgdGl0bGU6IHRpdGxlTWVzc2FnZSxcclxuICAgICAgaGVpZ2h0OiAnYXV0bycsXHJcbiAgICAgIGFuaW1hdGlvbjoge1xyXG4gICAgICAgIHNob3c6IHsgZGlyZWN0aW9uOiAnYm90dG9tJywgdHlwZTogJ3NsaWRlSW4nIH0sXHJcbiAgICAgICAgaGlkZTogeyBkaXJlY3Rpb246ICdib3R0b20nLCB0eXBlOiAnc2xpZGVPdXQnIH1cclxuICAgICAgfSxcclxuICAgICAgcG9zaXRpb246IHsgbXk6ICdib3R0b20nLCBhdDogJ2JvdHRvbScsIG9mZnNldDogeyB5OiAtNTAgfSB9LFxyXG4gICAgICBzaGFkaW5nOiBmYWxzZSxcclxuICAgICAgZHJhZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4ge1xyXG4gICAgICAgIHBvcHVwID0gZS5jb21wb25lbnQ7XHJcbiAgICAgICAgZS5lbGVtZW50LmFkZENsYXNzKE1BSU5fRUxFTUVOVF9DTEFTUyk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAkcG9wdXBDb250ZW50LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiBTSE9XX0RFVEFJTFNfVEVYVCxcclxuICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGlzRnVsbFNjcmVlblJlcXVpcmVkOiBib29sZWFuID0gIXBvcHVwLm9wdGlvbignZnVsbFNjcmVlbicpO1xyXG4gICAgICAgIHRvZ2dsZUZ1bGxTY3JlZW4oaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xyXG4gICAgICAgIHBvcHVwSW5mby5va0J0bi5vcHRpb24oJ3RleHQnLCBpc0Z1bGxTY3JlZW5SZXF1aXJlZCA/IEhJREVfREVUQUlMU19URVhUIDogU0hPV19ERVRBSUxTX1RFWFQpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiAnQ2xvc2UnLFxyXG4gICAgICBvbkNsaWNrOiAoY2xvc2VQb3B1cCkgPT4gY2xvc2VQb3B1cCgpXHJcbiAgICB9KTtcclxuXHJcbiAgY29uc3QgdG9nZ2xlRnVsbFNjcmVlbiA9IChpc0Z1bGxTY3JlZW5SZXF1aXJlZDogYm9vbGVhbikgPT4ge1xyXG4gICAgJHBvcHVwQ29udGVudC50b2dnbGUoaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xyXG4gICAgcG9wdXAub3B0aW9uKCdmdWxsU2NyZWVuJywgaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xyXG4gICAgcG9wdXAucmVwYWludCgpO1xyXG4gIH07XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBlbnVtIEV4Y2VwdGlvblR5cGUge1xyXG4gIFVuZXhwZWN0ZWRFeGNlcHRpb24gPSAwLFxyXG4gIFNxbEV4Y2VwdGlvbiA9IDEsXHJcbiAgSXN6b2xlYUNvbmZpZ3VyYXRpb25FeGNlcHRpb24gPSAyXHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IEV4Y2VwdGlvblR5cGUgfSBmcm9tICcuLi9EYXRhL0V4Y2VwdGlvblR5cGUnO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgPSAoZXhjZXB0aW9uVHlwZTogRXhjZXB0aW9uVHlwZSkgPT4ge1xyXG4gIHN3aXRjaCAoZXhjZXB0aW9uVHlwZSkge1xyXG4gICAgY2FzZSBFeGNlcHRpb25UeXBlLlNxbEV4Y2VwdGlvbjpcclxuICAgICAgcmV0dXJuICdXZSBhdHRlbXB0ZWQgdG8gZXhlY3V0ZSB0aGUgZGF0YSBxdWVyeSBob3dldmVyIGl0IGFwcGVhcnMgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIGRhdGEgc291cmNlLic7XHJcblxyXG4gICAgY2FzZSBFeGNlcHRpb25UeXBlLklzem9sZWFDb25maWd1cmF0aW9uRXhjZXB0aW9uOlxyXG4gICAgICByZXR1cm4gJ1NvbWV0aGluZyB3cm9uZyB3aXRoIGlzem9sZWEgY29uZmlndXJhdGlvbi4gQ2hlY2sgQ2xpZW50SWQvQ2xpZW50U2VjcmV0IGZpZWxkcyBpbiB0aGUgYXBwc2V0dGluZ3MuanNvbiBmaWxlLic7XHJcblxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuICcnO1xyXG4gIH1cclxufTtcclxuIiwgIlx1RkVGRmltcG9ydCBub3RpZnkgZnJvbSAnLi4vV2lkZ2V0cy9Ob3RpZnknO1xyXG5pbXBvcnQgeyBJQXBpUmVzcG9uc2UsIGlzRXJyb3JJbmZvIH0gZnJvbSAnLi9BcGlSZXNwb25zZSc7XHJcbmltcG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcclxuaW1wb3J0IHsgY3JlYXRlRXJyb3JJbmZvUG9wdXAgfSBmcm9tICcuLi9XaWRnZXRzL0Vycm9ySW5mb1BvcHVwJztcclxuaW1wb3J0IHsgRXhjZXB0aW9uVHlwZSB9IGZyb20gJy4vRXhjZXB0aW9uVHlwZSc7XHJcbmltcG9ydCB7IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi9VdGlscy9HZW5lcmFsVXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlJztcclxuXHJcbmNvbnN0IERFRkFVTFRfRVJST1JfTUVTU0FHRSA9ICdVbmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLiBQbGVhc2UgY29udGFjdCB0byBkZXZlbG9wZXJzLic7XHJcbmNvbnN0IE5PVF9FU1NFTlRJQUxfU1RBVFVTRVMgPSBbNTA0XTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0RXJyb3JNZXNzYWdlID0gKCkgPT4gREVGQVVMVF9FUlJPUl9NRVNTQUdFO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZVN1Y2Nlc3MocmVzOiBJQXBpUmVzcG9uc2U8YW55Piwgbm90aWZ5U3VjY2VzcyA9IGZhbHNlKSB7XHJcbiAgaWYgKG5vdGlmeVN1Y2Nlc3MpIHtcclxuICAgIG5vdGlmeShyZXMuTWVzc2FnZSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVzLkRhdGEpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRXJyb3I8VD4oXHJcbiAgcmVzOiBJQXBpUmVzcG9uc2U8VD4sXHJcbiAgbm90aWZ5RXJyb3I6IGJvb2xlYW4sXHJcbiAgZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlPzogKGV4Y2VwdGlvblR5cGU6IEV4Y2VwdGlvblR5cGUpID0+IHN0cmluZ1xyXG4pOiB7IG1lc3NhZ2U6IHN0cmluZyB9IHtcclxuICBjb25zdCBtZXNzYWdlID0gcmVzLk1lc3NhZ2U7XHJcblxyXG4gIGNvbnN0IHJlc3VsdCA9IHsgbWVzc2FnZSB9O1xyXG5cclxuICBsZXQgbWVzc2FnZVRvU2hvdztcclxuICBjb25zdCBleGNlcHRpb25UeXBlID0gcGFyc2VFeGNlcHRpb25UeXBlKG1lc3NhZ2UpO1xyXG4gIGlmIChleGNlcHRpb25UeXBlICE9PSBudWxsKSB7XHJcbiAgICBjb25zdCBjdXN0b21FcnJvck1lc3NhZ2UgPSBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgPyBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UoZXhjZXB0aW9uVHlwZSkgOiAnJztcclxuICAgIG1lc3NhZ2VUb1Nob3cgPSBjdXN0b21FcnJvck1lc3NhZ2UgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBtZXNzYWdlVG9TaG93ID0gbWVzc2FnZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0U7XHJcbiAgfVxyXG5cclxuICBpZiAobm90aWZ5RXJyb3IpIHtcclxuICAgIGNvbnN0IGVycm9ySW5mbyA9IHJlcy5EYXRhO1xyXG4gICAgaWYgKGlzRXJyb3JJbmZvKGVycm9ySW5mbykpIHtcclxuICAgICAgY29uc3QgaXNFcnJvckluZm9Ob3RFbXB0eUFycmF5ID0gQXJyYXkuaXNBcnJheShlcnJvckluZm8pICYmIGVycm9ySW5mby5sZW5ndGg7XHJcbiAgICAgIGNvbnN0IGlzRXJyb3JJbmZvSGFzRGF0YSA9ICFBcnJheS5pc0FycmF5KGVycm9ySW5mbykgJiYgKGVycm9ySW5mby5TdGFja1RyYWNlIHx8IGVycm9ySW5mby5FcnJvcik7XHJcblxyXG4gICAgICBpZiAoaXNFcnJvckluZm9Ob3RFbXB0eUFycmF5IHx8IGlzRXJyb3JJbmZvSGFzRGF0YSkge1xyXG4gICAgICAgIGNyZWF0ZUVycm9ySW5mb1BvcHVwKG1lc3NhZ2VUb1Nob3csIGVycm9ySW5mbyk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBub3RpZnkobWVzc2FnZVRvU2hvdywgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VFeGNlcHRpb25UeXBlKG1lc3NhZ2U6IHN0cmluZyk6IEV4Y2VwdGlvblR5cGUgfCBudWxsIHtcclxuICByZXR1cm4gKCFpc05hTihtZXNzYWdlIGFzIGFueSkpICYmIEV4Y2VwdGlvblR5cGVbK21lc3NhZ2VdID8gK21lc3NhZ2UgOiBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlVXBsb2FkKGU6IHsgcmVxdWVzdDogeyByZXNwb25zZTogc3RyaW5nOyB9IH0pIHtcclxuICBjb25zdCByZXNwb25zZTogSUFwaVJlc3BvbnNlPGFueT4gPSBlLnJlcXVlc3QucmVzcG9uc2UgPyBKU09OLnBhcnNlKGUucmVxdWVzdC5yZXNwb25zZSkgOiB7fTtcclxuXHJcbiAgaWYgKHJlc3BvbnNlLlJlcXVlc3RTdGF0ZSA9PT0gUmVxdWVzdFN0YXRlLkNvbXBsZXRlZCkge1xyXG4gICAgaGFuZGxlU3VjY2VzcyhyZXNwb25zZSk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVFcnJvcihyZXNwb25zZSwgdHJ1ZSk7XHJcblxyXG4gIHJldHVybiBmYWxzZTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgSVNlbmRSZXF1ZXN0U2V0dGluZ3MgPSBKUXVlcnlBamF4U2V0dGluZ3MgJiB7XHJcbiAgbm90aWZ5RXJyb3I/OiBib29sZWFuO1xyXG4gIGdldFVzZXJGcmllbmRseUVycm9yTWVzc2FnZT86IChleGNlcHRpb25UeXBlOiBFeGNlcHRpb25UeXBlKSA9PiBzdHJpbmc7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2VuZFJlcXVlc3Q8VCA9IGFueT4oXHJcbiAgdXJsOiBzdHJpbmcsXHJcbiAgdHlwZTogc3RyaW5nID0gJ0dFVCcsXHJcbiAgZGF0YSA9IG51bGwsXHJcbiAgbm90aWZ5U3VjY2Vzcz86IGJvb2xlYW4sXHJcbiAgc2V0dGluZ3M/OiBJU2VuZFJlcXVlc3RTZXR0aW5ncyxcclxuKTogSlF1ZXJ5LkRlZmVycmVkPFQ+IHtcclxuICBjb25zdCBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcclxuXHJcbiAgY29uc3Qgbm90aWZ5RXJyb3IgPSBzZXR0aW5ncz8ubm90aWZ5RXJyb3IgPT09IHVuZGVmaW5lZCB8fCBzZXR0aW5ncy5ub3RpZnlFcnJvcjtcclxuXHJcbiAgY29uc3QgbWFuZGF0b3J5T3B0aW9ucyA9IHtcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbidcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBhamF4U2V0dGluZ3MgPSAkLmV4dGVuZCh7IHR5cGUsIHVybCwgZGF0YSB9LCBzZXR0aW5ncywgbWFuZGF0b3J5T3B0aW9ucyk7XHJcblxyXG4gICQuYWpheChhamF4U2V0dGluZ3MpXHJcbiAgICAuZG9uZSgocmVzKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBJQXBpUmVzcG9uc2U8YW55PiA9IHJlcztcclxuXHJcbiAgICAgIGlmIChyZXNwb25zZS5SZXF1ZXN0U3RhdGUgPT09IFJlcXVlc3RTdGF0ZS5Db21wbGV0ZWQpIHtcclxuICAgICAgICBoYW5kbGVTdWNjZXNzKHJlc3BvbnNlLCBub3RpZnlTdWNjZXNzKTtcclxuICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlLkRhdGEpO1xyXG5cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHsgbWVzc2FnZSB9ID0gaGFuZGxlRXJyb3IocmVzcG9uc2UsIG5vdGlmeUVycm9yLCBzZXR0aW5ncz8uZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlIHx8IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UpO1xyXG5cclxuICAgICAgZGVmZXJyZWQucmVqZWN0KG1lc3NhZ2UpO1xyXG4gICAgfSlcclxuICAgIC5mYWlsKChqcVhIUiwgdGV4dFN0YXR1cykgPT4ge1xyXG4gICAgICBpZiAoIU5PVF9FU1NFTlRJQUxfU1RBVFVTRVMuaW5jbHVkZXMoanFYSFIuc3RhdHVzKSAmJiBub3RpZnlFcnJvcikge1xyXG4gICAgICAgIG5vdGlmeShnZXREZWZhdWx0RXJyb3JNZXNzYWdlKCksIGZhbHNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZGVmZXJyZWQucmVqZWN0KHRleHRTdGF0dXMpO1xyXG4gICAgfSk7XHJcblxyXG4gIHJldHVybiBkZWZlcnJlZDtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUFwaVJlc3BvbnNlIH0gZnJvbSAnLi9BcGlSZXNwb25zZSc7XHJcbmltcG9ydCB7IGhhbmRsZUVycm9yLCBoYW5kbGVTdWNjZXNzLCBnZXREZWZhdWx0RXJyb3JNZXNzYWdlIH0gZnJvbSAnLi9SZXF1ZXN0JztcclxuaW1wb3J0IHsgUmVxdWVzdFN0YXRlIH0gZnJvbSAnLi9SZXF1ZXN0U3RhdGUnO1xyXG5pbXBvcnQgeyBFeGNlcHRpb25UeXBlIH0gZnJvbSAnLi9FeGNlcHRpb25UeXBlJztcclxuXHJcbmV4cG9ydCB0eXBlIElEeERhdGFTb3VyY2VPcHRpb25zID0gRGV2RXhwcmVzcy5kYXRhLkFzcE5ldC5PcHRpb25zICYge1xyXG4gIG5vdGlmeVN1Y2Nlc3M/OiBib29sZWFuO1xyXG4gIG5vdGlmeUVycm9yPzogYm9vbGVhbjtcclxuICBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2U/OiAoZXhjZXB0aW9uVHlwZTogRXhjZXB0aW9uVHlwZSkgPT4gc3RyaW5nO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUR4RGF0YVNvdXJjZShvcHRpb25zOiBJRHhEYXRhU291cmNlT3B0aW9ucykge1xyXG4gIGNvbnN0IHN0b3JlID0gRGV2RXhwcmVzcy5kYXRhLkFzcE5ldC5jcmVhdGVTdG9yZSh7XHJcbiAgICAuLi5vcHRpb25zLFxyXG4gICAgb25CZWZvcmVTZW5kOiAoanFYaHIsIHNldHRpbmdzKSA9PiB7XHJcbiAgICAgIGlmIChvcHRpb25zLm9uQmVmb3JlU2VuZCkge1xyXG4gICAgICAgIG9wdGlvbnMub25CZWZvcmVTZW5kKGpxWGhyLCBzZXR0aW5ncyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG5vdGlmeUVycm9yID0gb3B0aW9ucz8ubm90aWZ5RXJyb3IgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLm5vdGlmeUVycm9yO1xyXG5cclxuICAgICAgc2V0dGluZ3MuZGF0YUZpbHRlciA9IChyYXdSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlczogSUFwaVJlc3BvbnNlPGFueT4gPSBKU09OLnBhcnNlKHJhd1Jlc3BvbnNlKTtcclxuXHJcbiAgICAgICAgaWYgKHJlcy5SZXF1ZXN0U3RhdGUgPT09IFJlcXVlc3RTdGF0ZS5Db21wbGV0ZWQpIHtcclxuICAgICAgICAgIHJldHVybiBoYW5kbGVTdWNjZXNzKHJlcywgb3B0aW9ucy5ub3RpZnlTdWNjZXNzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShoYW5kbGVFcnJvcihyZXMsIG5vdGlmeUVycm9yLCBvcHRpb25zPy5nZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UpKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHNldHRpbmdzLmVycm9yID0gKHhocjogSlF1ZXJ5WEhSKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVzOiBJQXBpUmVzcG9uc2U8YW55PiA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCB8fCAne30nKTtcclxuXHJcbiAgICAgICAgLy8gTk9URTogZm9yIHVuaGFuZGxlZCBlcnJvcnMgb24gdGhlIHNlcnZlclxyXG4gICAgICAgIGlmICghcmVzLlJlcXVlc3RTdGF0ZSkge1xyXG4gICAgICAgICAgaGFuZGxlRXJyb3IocmVzLCBub3RpZnlFcnJvciwgb3B0aW9ucz8uZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIChzdG9yZSBhcyBhbnkpLl9lcnJvckhhbmRsZXIgPSAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgaWYgKGVycm9yICYmICFlcnJvci5tZXNzYWdlKSB7XHJcbiAgICAgIGVycm9yLm1lc3NhZ2UgPSBnZXREZWZhdWx0RXJyb3JNZXNzYWdlKCk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIHN0b3JlO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4vUmVxdWVzdCc7XHJcblxyXG5jb25zdCBsb2FkUHJvbWlzZXM6IHsgW3VybDogc3RyaW5nXTogSlF1ZXJ5RGVmZXJyZWQ8YW55PiB9ID0ge307XHJcblxyXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbjxUPih1cmw6IHN0cmluZykge1xyXG4gIGlmIChsb2FkUHJvbWlzZXNbdXJsXSkge1xyXG4gICAgcmV0dXJuIGF3YWl0IGxvYWRQcm9taXNlc1t1cmxdO1xyXG4gIH1cclxuXHJcbiAgbG9hZFByb21pc2VzW3VybF0gPSBzZW5kUmVxdWVzdDxUPih1cmwpO1xyXG4gIGxvYWRQcm9taXNlc1t1cmxdLmNhdGNoKChlcnIpID0+IHtcclxuICAgIGxvYWRQcm9taXNlc1t1cmxdID0gbnVsbDtcclxuXHJcbiAgICB0aHJvdyBlcnI7XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IHJlc3VsdDogVCA9IGF3YWl0IGxvYWRQcm9taXNlc1t1cmxdO1xyXG5cclxuICBsb2FkUHJvbWlzZXNbdXJsXSA9IG51bGw7XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IHNlbmRSZXF1ZXN0LCBoYW5kbGVFcnJvciwgaGFuZGxlU3VjY2VzcywgaGFuZGxlVXBsb2FkIH0gZnJvbSAnLi9SZXF1ZXN0JztcclxuaW1wb3J0IHsgaXNFcnJvckluZm8gfSBmcm9tICcuL0FwaVJlc3BvbnNlJztcclxuaW1wb3J0IHsgY3JlYXRlRHhEYXRhU291cmNlIH0gZnJvbSAnLi9EeERhdGFTb3VyY2UnO1xyXG5pbXBvcnQgKiBhcyBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbiBmcm9tICcuL0xvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uJztcclxuXHJcbi8vIFRPRE86IGV4cG9ydCB0eXBlXHJcbmV4cG9ydCB7IElBcGlSZXNwb25zZSwgSUVycm9ySW5mbyB9IGZyb20gJy4vQXBpUmVzcG9uc2UnO1xyXG5leHBvcnQgeyBJRHhEYXRhU291cmNlT3B0aW9ucyB9IGZyb20gJy4vRHhEYXRhU291cmNlJztcclxuZXhwb3J0IHsgSUxvZ29TZXR0aW5ncyB9IGZyb20gJy4vSUxvZ29TZXR0aW5ncyc7XHJcbmV4cG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICBzZW5kUmVxdWVzdCxcclxuICBoYW5kbGVFcnJvcixcclxuICBoYW5kbGVTdWNjZXNzLFxyXG4gIGhhbmRsZVVwbG9hZCxcclxuICBjcmVhdGVEeERhdGFTb3VyY2UsXHJcbiAgaXNFcnJvckluZm8sXHJcbiAgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb25cclxufTtcclxuIiwgImV4cG9ydCBpbnRlcmZhY2UgSVJlbmRlcmVkIHtcclxuICByZW5kZXIoKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGVzdHJveWFibGUge1xyXG4gIGRlc3Ryb3koKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGlzRGVzdHJveWFibGUgPSAob2JqOiBhbnkpOiBvYmogaXMgSURlc3Ryb3lhYmxlID0+IHtcclxuICByZXR1cm4gdHlwZW9mIG9iai5kZXN0cm95ID09PSAnZnVuY3Rpb24nO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IHRocm93UmVuZGVyRXJyb3IgPSAoZWxlbWVudE5hbWU/OiBzdHJpbmcpOiBuZXZlciA9PiB7XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBwcmVmZXItdGVtcGxhdGVcclxuICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByZXF1aXJlZCAke2VsZW1lbnROYW1lID8gKGAke2VsZW1lbnROYW1lICB9IGApIDogJyd9IGlzbid0IGNyZWF0ZWRgKTtcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIERlZXBSZWFkb25seTxUPiA9IHtcclxuICByZWFkb25seSBbUCBpbiBrZXlvZiBUXTogKFxyXG4gICAgVFtQXSBleHRlbmRzIEFycmF5PGluZmVyIFUxPiA/IFJlYWRvbmx5QXJyYXk8RGVlcFJlYWRvbmx5PFUxPj4gOiAoXHJcbiAgICAgIFRbUF0gZXh0ZW5kcyBNYXA8aW5mZXIgSywgaW5mZXIgVTI+ID8gUmVhZG9ubHlNYXA8SywgRGVlcFJlYWRvbmx5PFUyPj4gOiAoXHJcbiAgICAgICAgVFtQXSBleHRlbmRzIFNldDxpbmZlciBVMz4gPyBSZWFkb25seVNldDxEZWVwUmVhZG9ubHk8VTM+PiA6IChcclxuICAgICAgICAgIFRbUF0gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IFRbUF0gOiAoXHJcbiAgICAgICAgICAgIERlZXBSZWFkb25seTxUW1BdPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBEZWVwUGFydGlhbDxUPiA9IHtcclxuICBbUCBpbiBrZXlvZiBUXT86IChcclxuICAgIFRbUF0gZXh0ZW5kcyBBcnJheTxpbmZlciBVMT4gPyBBcnJheTxEZWVwUGFydGlhbDxVMT4+IDogKFxyXG4gICAgICBUW1BdIGV4dGVuZHMgTWFwPGluZmVyIEssIGluZmVyIFUyPiA/IE1hcDxLLCBEZWVwUGFydGlhbDxVMj4+IDogKFxyXG4gICAgICAgIFRbUF0gZXh0ZW5kcyBTZXQ8aW5mZXIgVTM+ID8gU2V0PERlZXBQYXJ0aWFsPFUzPj4gOiAoXHJcbiAgICAgICAgICBUW1BdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPyBUW1BdIDogKFxyXG4gICAgICAgICAgICBEZWVwUGFydGlhbDxUW1BdPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBEZWVwUmVxdWlyZWQ8VD4gPSB7XHJcbiAgW1AgaW4ga2V5b2YgVF0tPzogKFxyXG4gICAgVFtQXSBleHRlbmRzIEFycmF5PGluZmVyIFUxPiA/IEFycmF5PERlZXBSZXF1aXJlZDxVMT4+IDogKFxyXG4gICAgICBUW1BdIGV4dGVuZHMgTWFwPGluZmVyIEssIGluZmVyIFUyPiA/IE1hcDxLLCBEZWVwUmVxdWlyZWQ8VTI+PiA6IChcclxuICAgICAgICBUW1BdIGV4dGVuZHMgU2V0PGluZmVyIFUzPiA/IFNldDxEZWVwUmVxdWlyZWQ8VTM+PiA6IChcclxuICAgICAgICAgIFRbUF0gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IFRbUF0gOiAoXHJcbiAgICAgICAgICAgIERlZXBSZXF1aXJlZDxUW1BdPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBNdXRhYmxlPFQ+ID0ge1xyXG4gIC1yZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXTtcclxufTtcclxuIiwgIlx1RkVGRmltcG9ydCB7IERlZXBSZWFkb25seSB9IGZyb20gJy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4uL0hlYWRlci9JTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFVybEJ5TWVudUl0ZW1EYXRhKGl0ZW1EYXRhOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwgfCBEZWVwUmVhZG9ubHk8SU5hdmlnYXRpb25NZW51SXRlbU1vZGVsPikge1xyXG4gIGNvbnN0IHsgQXJlYSwgQ29udHJvbGxlciwgQWN0aW9uLCBJc0NsaWNrYWJsZSB9ID0gaXRlbURhdGE7XHJcblxyXG4gIGlmIChJc0NsaWNrYWJsZSAmJiBDb250cm9sbGVyKSB7XHJcbiAgICByZXR1cm4gQXJlYSA/IGVuY29kZVVSSShgLyR7QXJlYX0vJHtDb250cm9sbGVyfS8ke0FjdGlvbn1gKSA6IGVuY29kZVVSSShgLyR7Q29udHJvbGxlcn0vJHtBY3Rpb259YCk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdW5kZWZpbmVkO1xyXG59XHJcblxyXG5leHBvcnQgeyBXaW5kb3dSZXNpemVMaXN0ZW5lciwgYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHMgfSBmcm9tICcuL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyJztcclxuZXhwb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQgfSBmcm9tICcuL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyJztcclxuIiwgImltcG9ydCB7IElEZXN0cm95YWJsZSB9IGZyb20gJy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElMYXlvdXRCcmVha3BvaW50IHtcclxuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgbWluV2lkdGg6IG51bWJlcjtcclxuICByZWFkb25seSBtYXhXaWR0aDogbnVtYmVyO1xyXG59XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGludGVyZmFjZS1uYW1lXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0QnJlYWtwb2ludENoYW5nZWRFdmVudCB7XHJcbiAgcmVhZG9ubHkgcHJldmlvdXNCcmVha3BvaW50OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICByZWFkb25seSBjdXJyZW50QnJlYWtwb2ludDogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgcmVhZG9ubHkgb3JpZ2luYWxFdmVudDogVUlFdmVudDtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzID0ge1xyXG4gIHhzOiB7XHJcbiAgICBuYW1lOiAneHMnLFxyXG4gICAgbWluV2lkdGg6IDAsXHJcbiAgICBtYXhXaWR0aDogNTc1XHJcbiAgfSxcclxuICBzbToge1xyXG4gICAgbmFtZTogJ3NtJyxcclxuICAgIG1pbldpZHRoOiA1NzYsXHJcbiAgICBtYXhXaWR0aDogNzY3XHJcbiAgfSxcclxuICBtZDoge1xyXG4gICAgbmFtZTogJ21kJyxcclxuICAgIG1pbldpZHRoOiA3NjgsXHJcbiAgICBtYXhXaWR0aDogOTkxXHJcbiAgfSxcclxuICBsZzoge1xyXG4gICAgbmFtZTogJ2xnJyxcclxuICAgIG1pbldpZHRoOiA5OTIsXHJcbiAgICBtYXhXaWR0aDogMTE5OVxyXG4gIH0sXHJcbiAgeGw6IHtcclxuICAgIG5hbWU6ICd4bCcsXHJcbiAgICBtaW5XaWR0aDogMTIwMCxcclxuICAgIG1heFdpZHRoOiBJbmZpbml0eVxyXG4gIH1cclxufSBhcyBjb25zdDtcclxuXHJcbmNvbnN0IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzTGlzdDogcmVhZG9ubHkgSUxheW91dEJyZWFrcG9pbnRbXSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzKVxyXG4gIC5tYXAoKGJyZWFrcG9pbnROYW1lKSA9PiBib290c3RyYXBMYXlvdXRCcmVha3BvaW50c1ticmVha3BvaW50TmFtZV0pO1xyXG5cclxuZXhwb3J0IGNsYXNzIFdpbmRvd1Jlc2l6ZUxpc3RlbmVyIGltcGxlbWVudHMgSURlc3Ryb3lhYmxlIHtcclxuICBwdWJsaWMgY3VycmVudExheW91dEJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25XaW5kb3dSZXNpemVMaXN0ZW5lciA9IHRoaXMub25XaW5kb3dSZXNpemUuYmluZCh0aGlzKTtcclxuXHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxheW91dEJyZWFrcG9pbnRzOiByZWFkb25seSBJTGF5b3V0QnJlYWtwb2ludFtdO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSByZXNpemVEZWxheTogbnVtYmVyO1xyXG4gIC8vIFRPRE86IHVzZSBtdWx0aXBsZSBldmVudCBsaXN0ZW5lclxyXG4gIHByb3RlY3RlZCByZWFkb25seSBvblJlc2l6ZTogKChlOiBVSUV2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZDogKChlOiBMYXlvdXRCcmVha3BvaW50Q2hhbmdlZEV2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcm90ZWN0ZWQgbGFzdFdpbmRvd1Jlc2l6ZVRpbWVvdXRJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIG9uUmVzaXplPzogKGU6IFVJRXZlbnQpID0+IHZvaWQsXHJcbiAgICBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkPzogKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpID0+IHZvaWQsXHJcbiAgICByZXNpemVEZWxheSA9IDEwMCxcclxuICAgIGxheW91dEJyZWFrcG9pbnRzOiByZWFkb25seSBJTGF5b3V0QnJlYWtwb2ludFtdID0gYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHNMaXN0XHJcbiAgKSB7XHJcbiAgICB0aGlzLm9uUmVzaXplID0gb25SZXNpemU7XHJcbiAgICB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWQgPSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkO1xyXG4gICAgdGhpcy5yZXNpemVEZWxheSA9IHJlc2l6ZURlbGF5O1xyXG4gICAgdGhpcy5sYXlvdXRCcmVha3BvaW50cyA9IGxheW91dEJyZWFrcG9pbnRzO1xyXG5cclxuICAgIHRoaXMuY3VycmVudExheW91dEJyZWFrcG9pbnQgPSB0aGlzLmdldExheW91dEJyZWFrcG9pbnRCeVdpbmRvd1dpZHRoKHdpbmRvdy5pbm5lcldpZHRoKTtcclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGV0YWNoRXZlbnRzKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXR0YWNoRXZlbnRzKCkge1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMub25XaW5kb3dSZXNpemVMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZGV0YWNoRXZlbnRzKCkge1xyXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMub25XaW5kb3dSZXNpemVMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0TGF5b3V0QnJlYWtwb2ludEJ5V2luZG93V2lkdGgod2luZG93V2lkdGg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMubGF5b3V0QnJlYWtwb2ludHMuZmluZCgobGF5b3V0QnJlYWtwb2ludCkgPT4ge1xyXG4gICAgICByZXR1cm4gbGF5b3V0QnJlYWtwb2ludC5taW5XaWR0aCA8PSB3aW5kb3dXaWR0aCAmJiAoIWxheW91dEJyZWFrcG9pbnQubWF4V2lkdGggfHwgbGF5b3V0QnJlYWtwb2ludC5tYXhXaWR0aCA+PSB3aW5kb3dXaWR0aCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvbldpbmRvd1Jlc2l6ZShlOiBVSUV2ZW50KSB7XHJcbiAgICBjbGVhclRpbWVvdXQodGhpcy5sYXN0V2luZG93UmVzaXplVGltZW91dElkKTtcclxuICAgIHRoaXMubGFzdFdpbmRvd1Jlc2l6ZVRpbWVvdXRJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMub25XaW5kb3dSZXNpemVJbnRlcm5hbChlKSwgdGhpcy5yZXNpemVEZWxheSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25XaW5kb3dSZXNpemVJbnRlcm5hbChlOiBVSUV2ZW50KSB7XHJcbiAgICBjb25zdCBsYXlvdXRCcmVha3BvaW50ID0gdGhpcy5nZXRMYXlvdXRCcmVha3BvaW50QnlXaW5kb3dXaWR0aCh3aW5kb3cuaW5uZXJXaWR0aCk7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50TGF5b3V0QnJlYWtwb2ludCAhPT0gbGF5b3V0QnJlYWtwb2ludCkge1xyXG4gICAgICBjb25zdCBwcmV2aW91c0xheW91dEJyZWFrcG9pbnQgPSB0aGlzLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50O1xyXG4gICAgICB0aGlzLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50ID0gbGF5b3V0QnJlYWtwb2ludDtcclxuXHJcbiAgICAgIHRoaXMuZW1pdEJyZWFrcG9pbnRDaGFuZ2VkKHtcclxuICAgICAgICBwcmV2aW91c0JyZWFrcG9pbnQ6IHByZXZpb3VzTGF5b3V0QnJlYWtwb2ludCxcclxuICAgICAgICBjdXJyZW50QnJlYWtwb2ludDogdGhpcy5jdXJyZW50TGF5b3V0QnJlYWtwb2ludCxcclxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZW1pdFJlc2l6ZUV2ZW50KGUpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRSZXNpemVFdmVudChlOiBVSUV2ZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uUmVzaXplPy4oZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdEJyZWFrcG9pbnRDaGFuZ2VkKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMub25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZD8uKGUpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiZXhwb3J0IGludGVyZmFjZSBJQ29uZmlnIHtcclxuICBpc0xlZ2FjeVJlbmRlcj86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBjb25maWc6IElDb25maWcgPSB7XHJcbiAgaXNMZWdhY3lSZW5kZXI6IGZhbHNlXHJcbn07XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJVXNlck1lbnVJdGVtTW9kZWwsIElCYWRnZU1vZGVsIH0gZnJvbSAnLi9JVXNlck1lbnVJdGVtJztcclxuaW1wb3J0IHsgdGhyb3dSZW5kZXJFcnJvciwgRGVlcFJlYWRvbmx5IH0gZnJvbSAnLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIFdpbmRvd1Jlc2l6ZUxpc3RlbmVyLCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cywgTGF5b3V0QnJlYWtwb2ludENoYW5nZWRFdmVudCB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuLi9Db25maWcvSW5kZXgnO1xyXG5cclxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBpbnRlcmZhY2UtbmFtZVxyXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJNZW51SXRlbUNsaWNrRXZlbnQge1xyXG4gIHJlYWRvbmx5IGl0ZW06IERlZXBSZWFkb25seTxJVXNlck1lbnVJdGVtTW9kZWw+O1xyXG4gIHJlYWRvbmx5IG9yaWdpbmFsRXZlbnQ6IFVJRXZlbnQ7XHJcbiAgY2FuY2VsPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVXNlck1lbnVPcHRpb25zIHtcclxuICBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgdXNlckF2YXRhcjogc3RyaW5nO1xyXG4gIGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXTtcclxuICBjb2xsYXBzZUJyZWFrcG9pbnQ/OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBnZXREaXNwbGF5ZWRVc2VySW5mbz86ICh1c2VyTmFtZTogc3RyaW5nKSA9PiBzdHJpbmc7XHJcbiAgb25JdGVtQ2xpY2s/OiAoZTogVXNlck1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFVzZXJNZW51IHtcclxuICBwcm90ZWN0ZWQgc3RhdGljIGRlZmF1bHRHZXREaXNwbGF5ZWRVc2VySW5mbzogKHVzZXJOYW1lOiBzdHJpbmcpID0+IHN0cmluZyA9ICh1c2VyTmFtZSkgPT4gYFdlbGNvbWUgJHt1c2VyTmFtZX1gO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VyTmFtZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlckF2YXRhcjogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2V0RGlzcGxheWVkVXNlckluZm86ICh1c2VyTmFtZTogc3RyaW5nKSA9PiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb2xsYXBzZUJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgd2luZG93UmVzaXplTGlzdGVuZXI6IFdpbmRvd1Jlc2l6ZUxpc3RlbmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZExpc3RlbmVyID0gdGhpcy5vbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkLmJpbmQodGhpcyk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkl0ZW1DbGljazogKChlOiBVc2VyTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXTtcclxuICAvLyBFbGVtZW50c1xyXG4gIHByaXZhdGUgX3Jvb3Q6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgbW9iaWxlQ29udGVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBkZXNrdG9wUm9vdERyb3Bkb3duOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGRlc2t0b3BDb250ZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGRlc2t0b3BDb250ZW50VHJpZ2dlcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSB1c2VySW5mb0NvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSB1c2VySW5mb0RpdmlkZXI6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgaXRlbXNDb250YWluZXI6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwdWJsaWMgZ2V0IHJvb3QoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcm9vdDtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElVc2VyTWVudU9wdGlvbnMpIHtcclxuICAgIHRoaXMuY29udGFpbmVyID0gb3B0aW9ucy5jb250YWluZXI7XHJcbiAgICB0aGlzLnVzZXJBdmF0YXIgPSBvcHRpb25zLnVzZXJBdmF0YXI7XHJcbiAgICB0aGlzLnVzZXJOYW1lID0gb3B0aW9ucy51c2VyTmFtZTtcclxuICAgIHRoaXMuaXRlbXMgPSBvcHRpb25zLml0ZW1zO1xyXG4gICAgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQgPSBvcHRpb25zLmNvbGxhcHNlQnJlYWtwb2ludCB8fCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cy5tZDtcclxuICAgIHRoaXMuZ2V0RGlzcGxheWVkVXNlckluZm8gPSBvcHRpb25zLmdldERpc3BsYXllZFVzZXJJbmZvIHx8IFVzZXJNZW51LmRlZmF1bHRHZXREaXNwbGF5ZWRVc2VySW5mbztcclxuICAgIHRoaXMub25JdGVtQ2xpY2sgPSBvcHRpb25zLm9uSXRlbUNsaWNrO1xyXG5cclxuICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBuZXcgV2luZG93UmVzaXplTGlzdGVuZXIodW5kZWZpbmVkLCB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWRMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgaWYgKHRoaXMuX3Jvb3QpIHtcclxuICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy5fcm9vdCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW5kZXJNYWluRWxlbWVudHMoKTtcclxuICAgIHRoaXMucmVuZGVyVXNlckluZm8oKTtcclxuICAgIHRoaXMucmVuZGVySXRlbXMoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMucm9vdCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWRkSXRlbXMoaXRlbXM6IElVc2VyTWVudUl0ZW1Nb2RlbFtdKSB7XHJcbiAgICB0aGlzLml0ZW1zID0gdGhpcy5pdGVtcy5jb25jYXQoaXRlbXMpO1xyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbnNlcnRJdGVtcyhpdGVtczogSVVzZXJNZW51SXRlbU1vZGVsW10sIHBvc2l0aW9uOiBudW1iZXIpIHtcclxuICAgIHRoaXMuaXRlbXMuc3BsaWNlKHBvc2l0aW9uLCAwLCAuLi5pdGVtcyk7XHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZUl0ZW1zKGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXSkge1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgbWVudUl0ZW1zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXRlbXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0QmFkZ2UoaXRlbU5hbWU6IHN0cmluZyk6IElCYWRnZU1vZGVsIHwgbnVsbCB7XHJcbiAgICBjb25zdCBtZW51SXRlbSA9IHRoaXMuaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5UZXh0Py50b0xvd2VyQ2FzZSgpID09PSBpdGVtTmFtZSk7XHJcblxyXG4gICAgcmV0dXJuIG1lbnVJdGVtPy5CYWRnZSB8fCBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEJhZGdlKGl0ZW1OYW1lOiBzdHJpbmcsIGJhZGdlOiBJQmFkZ2VNb2RlbCkge1xyXG4gICAgY29uc3QgbWVudUl0ZW0gPSB0aGlzLml0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0uVGV4dD8udG9Mb3dlckNhc2UoKSA9PT0gaXRlbU5hbWUpO1xyXG5cclxuICAgIGlmIChtZW51SXRlbSkge1xyXG4gICAgICBtZW51SXRlbS5CYWRnZSA9IGJhZGdlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0IGlzTW9iaWxlVmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1heFdpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWF4V2lkdGg7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVuZGVyTWFpbkVsZW1lbnRzKCkge1xyXG4gICAgdGhpcy5fcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5fcm9vdC5jbGFzc0xpc3QuYWRkKCd1c2VyLW1lbnUnKTtcclxuXHJcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMubW9iaWxlQ29udGVudENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKC8qJ25hdmJhci1uYXYnLCAqL2BkLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX0tbm9uZWApO1xyXG5cclxuICAgIHRoaXMuZGVza3RvcFJvb3REcm9wZG93biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5kZXNrdG9wUm9vdERyb3Bkb3duLmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duJywgJ2Qtbm9uZScsIGBkLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX0tYmxvY2tgKTtcclxuXHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudFRyaWdnZXIuY2xhc3NMaXN0LmFkZCgnaGVhZGVyX19pY29uLWJ1dHRvbicsICdidG4nLCAnYnRuLW91dGxpbmUtbGlnaHQnKTtcclxuICAgIHRoaXMuZGVza3RvcENvbnRlbnRUcmlnZ2VyLnNldEF0dHJpYnV0ZSgndHlwZScsICdidXR0b24nKTtcclxuICAgIHRoaXMuZGVza3RvcENvbnRlbnRUcmlnZ2VyLnNldEF0dHJpYnV0ZSgnZGF0YS10b2dnbGUnLCAnZHJvcGRvd24nKTtcclxuXHJcbiAgICBsZXQgYXZhdGFyO1xyXG4gICAgaWYgKGNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICBpZiAodGhpcy51c2VyQXZhdGFyKSB7XHJcbiAgICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XHJcbiAgICAgICAgYXZhdGFyLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24taWNvbicsICdoZWFkZXJfX2ljb24tYnV0dG9uLWF2YXRhcicpO1xyXG4gICAgICAgIGF2YXRhci5zcmMgPSB0aGlzLnVzZXJBdmF0YXI7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xyXG4gICAgICAgIGF2YXRhci5jbGFzc0xpc3QuYWRkKCdoZWFkZXJfX2ljb24tYnV0dG9uLWljb24nLCAnZmFzJywgJ2ZhLXVzZXInKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xyXG4gICAgICBhdmF0YXIuY2xhc3NMaXN0LmFkZCgnaGVhZGVyX19pY29uLWJ1dHRvbi1pY29uJywgJ2lzb3otaWNvbi11c2VyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1tZW51JywgJ2Ryb3Bkb3duLW1lbnUtcmlnaHQnKTtcclxuXHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlci5hcHBlbmRDaGlsZChhdmF0YXIpO1xyXG5cclxuICAgIGlmICh0aGlzLml0ZW1zLnNvbWUoKGl0ZW0pID0+ICEhaXRlbS5CYWRnZSkpIHtcclxuICAgICAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgIGJhZGdlLmNsYXNzTGlzdC5hZGQoJ3VzZXItbWVudV9fYmFkZ2UnKTtcclxuICAgICAgdGhpcy5kZXNrdG9wQ29udGVudFRyaWdnZXIuYXBwZW5kQ2hpbGQoYmFkZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGVza3RvcFJvb3REcm9wZG93bi5hcHBlbmRDaGlsZCh0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlcik7XHJcbiAgICB0aGlzLmRlc2t0b3BSb290RHJvcGRvd24uYXBwZW5kQ2hpbGQodGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy5pdGVtc0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XHJcbiAgICB0aGlzLml0ZW1zQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3VzZXItbWVudV9faXRlbXMnKTtcclxuXHJcbiAgICBpZiAoY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICAgIHRoaXMudXNlckluZm9Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoNicpO1xyXG4gICAgICB0aGlzLnVzZXJJbmZvQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3VzZXItaW5mbycsICdoNicpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCd1c2VyLWluZm8nLCAnZHJvcGRvd24taXRlbScpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXNlckluZm9EaXZpZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLnVzZXJJbmZvRGl2aWRlci5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1kaXZpZGVyJywgJ2Qtbm9uZScsIGBkLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX0tYmxvY2tgKTtcclxuXHJcbiAgICBpZiAodGhpcy5pc01vYmlsZVZpZXcpIHtcclxuICAgICAgdGhpcy5tb2JpbGVDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9Db250YWluZXIpO1xyXG4gICAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy51c2VySW5mb0RpdmlkZXIpO1xyXG4gICAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5pdGVtc0NvbnRhaW5lcik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9Db250YWluZXIpO1xyXG4gICAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9EaXZpZGVyKTtcclxuICAgICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLml0ZW1zQ29udGFpbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9yb290LmFwcGVuZENoaWxkKHRoaXMubW9iaWxlQ29udGVudENvbnRhaW5lcik7XHJcbiAgICB0aGlzLl9yb290LmFwcGVuZENoaWxkKHRoaXMuZGVza3RvcFJvb3REcm9wZG93bik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVuZGVyVXNlckluZm8oKSB7XHJcbiAgICBpZiAoIXRoaXMudXNlckluZm9Db250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ3VzZXJJbmZvQ29udGFpbmVyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICBjb25zdCB1c2VySW5mb0NvbnRlbnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgICB1c2VySW5mb0NvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3VzZXItaW5mb19fY29udGVudCcpO1xyXG4gICAgICB1c2VySW5mb0NvbnRlbnRFbGVtZW50LmlubmVyVGV4dCA9IHRoaXMuZ2V0RGlzcGxheWVkVXNlckluZm8odGhpcy51c2VyTmFtZSk7XHJcblxyXG4gICAgICB0aGlzLnVzZXJJbmZvQ29udGFpbmVyLmFwcGVuZENoaWxkKHVzZXJJbmZvQ29udGVudEVsZW1lbnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lci5pbm5lclRleHQgPSB0aGlzLmdldERpc3BsYXllZFVzZXJJbmZvKHRoaXMudXNlck5hbWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlckl0ZW1zKCkge1xyXG4gICAgaWYgKCF0aGlzLml0ZW1zQ29udGFpbmVyKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdpdGVtc0NvbnRhaW5lcicpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2xlYXJJdGVtc0NvbnRhaW5lcigpO1xyXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtRWxlbWVudChpdGVtLCB0aGlzLmlzTW9iaWxlVmlldyk7XHJcbiAgICAgIHRoaXMuaXRlbXNDb250YWluZXIhLmFwcGVuZENoaWxkKGl0ZW1FbGVtZW50KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZUl0ZW1FbGVtZW50KGl0ZW06IElVc2VyTWVudUl0ZW1Nb2RlbCwgaXNNb2JpbGU6IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtRWxlbWVudEJhc2UoaXRlbSk7XHJcblxyXG4gICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICBsaW5rRWxlbWVudC5jbGFzc0xpc3QuYWRkKGlzTW9iaWxlID8gJ25hdi1saW5rJyA6ICdkcm9wZG93bi1pdGVtJyk7XHJcbiAgICBsaW5rRWxlbWVudC5ocmVmID0gaXRlbS5VcmwgfHwgJ2phdmFzY3JpcHQ6dm9pZCgwKSc7XHJcbiAgICBsaW5rRWxlbWVudC50ZXh0ID0gaXRlbS5UZXh0O1xyXG4gICAgaWYoaXRlbS5PcGVuSW5OZXdQYWdlKSB7XHJcbiAgICAgIGxpbmtFbGVtZW50LnRhcmdldCA9ICdfYmxhbmsnO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzVG9JdGVtKGxpbmtFbGVtZW50LCBpdGVtKTtcclxuICAgIGl0ZW1FbGVtZW50LmFwcGVuZENoaWxkKGxpbmtFbGVtZW50KTtcclxuXHJcbiAgICBpZiAoaXRlbS5CYWRnZSkge1xyXG4gICAgICBjb25zdCBiYWRnZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuICAgICAgYmFkZ2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaXNvei1iYWRnZScpO1xyXG4gICAgICBiYWRnZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdpc296LWJhZGdlLS1jaXJjbGUnKTtcclxuICAgICAgYmFkZ2VsZW1lbnQuY2xhc3NMaXN0LmFkZChgaXNvei1iYWRnZS0tJHtpdGVtLkJhZGdlLlR5cGUgfHwgJ2luZm9ybWF0aW9uJ31gKTtcclxuICAgICAgYmFkZ2VsZW1lbnQuaW5uZXJIVE1MID0gaXRlbS5CYWRnZS5UZXh0O1xyXG5cclxuICAgICAgbGlua0VsZW1lbnQuYXBwZW5kQ2hpbGQoYmFkZ2VsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpdGVtRWxlbWVudDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBjcmVhdGVJdGVtRWxlbWVudEJhc2UoaXRlbTogSVVzZXJNZW51SXRlbU1vZGVsKSB7XHJcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCduYXYtaXRlbScpO1xyXG5cclxuICAgIHJldHVybiBpdGVtRWxlbWVudDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhdHRhY2hFdmVudHNUb0l0ZW0oaXRlbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBpdGVtOiBJVXNlck1lbnVJdGVtTW9kZWwpIHtcclxuICAgIGl0ZW1FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHRoaXMub25NZW51SXRlbUNsaWNrKHtcclxuICAgICAgaXRlbSxcclxuICAgICAgb3JpZ2luYWxFdmVudDogZVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHN3aXRjaFZpZXcoaXNNb2JpbGU6IGJvb2xlYW4pIHtcclxuICAgIGlmIChpc01vYmlsZSkge1xyXG4gICAgICB0aGlzLmFwcGx5TW9iaWxlVmlld0ZvclVzZXJJbmZvKCk7XHJcbiAgICAgIHRoaXMuYXBwbHlNb2JpbGVWaWV3Rm9ySXRlbXMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYXBwbHlEZXNrdG9wVmlld0ZvclVzZXJJbmZvKCk7XHJcbiAgICAgIHRoaXMuYXBwbHlEZXNrdG9wVmlld0Zvckl0ZW1zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlNb2JpbGVWaWV3Rm9yVXNlckluZm8oKSB7XHJcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMudXNlckluZm9Db250YWluZXIsIG51bGwpO1xyXG4gICAgdGhpcy5tb2JpbGVDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLnVzZXJJbmZvRGl2aWRlciwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlEZXNrdG9wVmlld0ZvclVzZXJJbmZvKCkge1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy51c2VySW5mb0NvbnRhaW5lciwgbnVsbCk7XHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLnVzZXJJbmZvRGl2aWRlciwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlNb2JpbGVWaWV3Rm9ySXRlbXMoKSB7XHJcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMuaXRlbXNDb250YWluZXIsIG51bGwpO1xyXG5cclxuICAgIGZvciAoY29uc3QgaXRlbUVsZW1lbnQgb2YgdGhpcy5pdGVtc0NvbnRhaW5lci5jaGlsZHJlbikge1xyXG4gICAgICBpdGVtRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZD8uY2xhc3NMaXN0LnJlcGxhY2UoJ2Ryb3Bkb3duLWl0ZW0nLCAnbmF2LWxpbmsnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseURlc2t0b3BWaWV3Rm9ySXRlbXMoKSB7XHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLml0ZW1zQ29udGFpbmVyLCBudWxsKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGl0ZW1FbGVtZW50IG9mIHRoaXMuaXRlbXNDb250YWluZXIuY2hpbGRyZW4pIHtcclxuICAgICAgaXRlbUVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ/LmNsYXNzTGlzdC5yZXBsYWNlKCduYXYtbGluaycsICdkcm9wZG93bi1pdGVtJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY2xlYXJJdGVtc0NvbnRhaW5lcigpIHtcclxuICAgIHdoaWxlICh0aGlzLml0ZW1zQ29udGFpbmVyLmZpcnN0Q2hpbGQpIHtcclxuICAgICAgdGhpcy5pdGVtc0NvbnRhaW5lci5maXJzdENoaWxkLnJlbW92ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRJdGVtQ2xpY2soZTogVXNlck1lbnVJdGVtQ2xpY2tFdmVudCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5vbkl0ZW1DbGljaz8uKGUpO1xyXG4gICAgICBlLml0ZW0uT25DbGljaz8uKGUpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpIHtcclxuICAgIHRoaXMuc3dpdGNoVmlldyh0aGlzLmlzTW9iaWxlVmlldyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uTWVudUl0ZW1DbGljayhlOiBVc2VyTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0aGlzLmVtaXRJdGVtQ2xpY2soZSk7XHJcblxyXG4gICAgaWYgKGUuY2FuY2VsKSB7XHJcbiAgICAgIGUub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSVJlbmRlcmVkIH0gZnJvbSAnLi4vQ29yZSc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4uLy4uL0hlYWRlcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElNZW51SXRlbSB7XHJcbiAgdGV4dDogc3RyaW5nO1xyXG4gIGljb24/OiBzdHJpbmc7XHJcbiAgaXRlbXM/OiBJTWVudUl0ZW1bXTtcclxuICB1cmw/OiBzdHJpbmc7XHJcbiAgaGlkZGVuPzogYm9vbGVhbjtcclxuICBhY3RpdmU/OiBib29sZWFuO1xyXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcclxuICB0aXRsZT86IHN0cmluZztcclxuICBtZW51SXRlbUVsPzogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgb3JpZ2luYWxNb2RlbDogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsO1xyXG59XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGludGVyZmFjZS1uYW1lXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVudUl0ZW1DbGlja0V2ZW50IHtcclxuICByZWFkb25seSBpdGVtOiBJTWVudUl0ZW07XHJcbiAgcmVhZG9ubHkgb3JpZ2luYWxFdmVudDogVUlFdmVudDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTWVudU9wdGlvbnMge1xyXG4gIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgaXRlbXM6IElNZW51SXRlbVtdO1xyXG4gIG9uSXRlbUNsaWNrPzogKGU6IE1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1lbnUgaW1wbGVtZW50cyBJUmVuZGVyZWQge1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHByb3RlY3RlZCBpdGVtczogSU1lbnVJdGVtW107XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9uSXRlbUNsaWNrOiAoKGU6IE1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XHJcbiAgLy8gZWxlbWVudHNcclxuICBwcm90ZWN0ZWQgcm9vdDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElNZW51T3B0aW9ucykge1xyXG4gICAgdGhpcy5jb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcjtcclxuICAgIHRoaXMuaXRlbXMgPSBvcHRpb25zLml0ZW1zO1xyXG4gICAgdGhpcy5vbkl0ZW1DbGljayA9IG9wdGlvbnMub25JdGVtQ2xpY2s7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWJzdHJhY3QgcmVuZGVyKCk6IHZvaWQ7XHJcbiAgcHVibGljIHVwZGF0ZUl0ZW1zKGl0ZW1zOiBJTWVudUl0ZW1bXSkge1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRJdGVtQ2xpY2soZTogTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uSXRlbUNsaWNrPy4oZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBNZW51LCBJTWVudU9wdGlvbnMsIElNZW51SXRlbSB9IGZyb20gJy4vTWVudSc7XHJcbmltcG9ydCB7IHRocm93UmVuZGVyRXJyb3IgfSBmcm9tICcuLi9Db3JlJztcclxuaW1wb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIFdpbmRvd1Jlc2l6ZUxpc3RlbmVyLCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cyB9IGZyb20gJy4uLy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwsIGlzSXRlbUFjdGl2ZSB9IGZyb20gJy4uLy4uL0hlYWRlcic7XHJcblxyXG5leHBvcnQgZW51bSBDb2xsYXBzaW5nTW9kZSB7XHJcbiAgRGlzYWJsZWQsXHJcbiAgQ29sbGFwc2VkLFxyXG4gIEV4cGFuZGVkLFxyXG4gIEFkYXB0aXZlQ29sbGFwc2luZ1xyXG59XHJcblxyXG50eXBlIEl0ZW1BY3Rpb25Nb2RlID0gJ2hvdmVyJyB8ICdjbGljayc7XHJcbmV4cG9ydCBpbnRlcmZhY2UgSUJvb3RzdHJhcENvbGxhcHNpbmdNZW51T3B0aW9ucyBleHRlbmRzIElNZW51T3B0aW9ucyB7XHJcbiAgaXRlbUFjdGlvbj86IEl0ZW1BY3Rpb25Nb2RlO1xyXG4gIGNvbGxhcHNpbmdNb2RlPzogQ29sbGFwc2luZ01vZGU7XHJcbiAgY29sbGFwc2VCcmVha3BvaW50PzogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgY29sbGFwc2VJY29uPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUgZXh0ZW5kcyBNZW51IHtcclxuICBwcm90ZWN0ZWQgc3RhdGljIEhPVkVSX01PREVfQ1NTX0NMQVNTID0gJ25hdmJhci1uYXZfaG92ZXItYWN0aW9uJztcclxuICBwcm90ZWN0ZWQgc3RhdGljIGFkYXB0aXZpdHlDb2xsYXBzaW5nRGVsYXkgPSA1MDtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXRlbUFjdGlvbk1vZGU6IEl0ZW1BY3Rpb25Nb2RlO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBjb2xsYXBzaW5nTW9kZTogQ29sbGFwc2luZ01vZGU7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbGxhcHNlSWNvbk5hbWU6IHN0cmluZztcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29sbGFwc2VCcmVha3BvaW50OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgd2luZG93UmVzaXplTGlzdGVuZXI6IFdpbmRvd1Jlc2l6ZUxpc3RlbmVyO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBvbldpbmRvd1Jlc2l6ZUV2ZW50SGFuZGxlciA9IHRoaXMub25XaW5kb3dSZXNpemUuYmluZCh0aGlzKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25Ub2dnbGVEcm9wZG93bkJ1dHRvbkNsaWNrSGFuZGxlciA9IHRoaXMub25Ub2dnbGVEcm9wZG93bkJ1dHRvbkNsaWNrLmJpbmQodGhpcyk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9uVG9nZ2xlRHJvcGRvd25CdXR0b25Nb3VzZUVudGVySGFuZGxlciA9IHRoaXMub25Ub2dnbGVEcm9wZG93bkJ1dHRvbk1vdXNlRW50ZXIuYmluZCh0aGlzKTtcclxuICAvLyBlbGVtZW50c1xyXG4gIHByb3RlY3RlZCBjb2xsYXBzZVJvb3Q6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByb3RlY3RlZCBjb2xsYXBzZUJ1dHRvbjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJvdGVjdGVkIGNvbGxhcHNlRHJvcGRvd246IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByb3RlY3RlZCBjdXJyZW50T3BlbmluZ1N1Yk1lbnU6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJQm9vdHN0cmFwQ29sbGFwc2luZ01lbnVPcHRpb25zKSB7XHJcbiAgICBzdXBlcihvcHRpb25zKTtcclxuXHJcbiAgICB0aGlzLml0ZW1BY3Rpb25Nb2RlID0gb3B0aW9ucy5pdGVtQWN0aW9uIHx8ICdob3Zlcic7XHJcbiAgICB0aGlzLmNvbGxhcHNpbmdNb2RlID0gb3B0aW9ucy5jb2xsYXBzaW5nTW9kZSA/PyBDb2xsYXBzaW5nTW9kZS5BZGFwdGl2ZUNvbGxhcHNpbmc7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludCA9IG9wdGlvbnMuY29sbGFwc2VCcmVha3BvaW50IHx8IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzLm1kO1xyXG4gICAgdGhpcy5jb2xsYXBzZUljb25OYW1lID0gb3B0aW9ucy5jb2xsYXBzZUljb24gfHwgJ2ZhLWVsbGlwc2lzLXYnO1xyXG5cclxuICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBuZXcgV2luZG93UmVzaXplTGlzdGVuZXIoXHJcbiAgICAgIHRoaXMuY29sbGFwc2luZ01vZGUgPT09IENvbGxhcHNpbmdNb2RlLkFkYXB0aXZlQ29sbGFwc2luZyA/IHRoaXMub25XaW5kb3dSZXNpemVFdmVudEhhbmRsZXIgOiB1bmRlZmluZWQsXHJcbiAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuYWRhcHRpdml0eUNvbGxhcHNpbmdEZWxheVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBpZiAodGhpcy5yb290KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlclJvb3QoKTtcclxuICAgIHRoaXMucmVuZGVySXRlbXMoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5yb290KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVJdGVtcyhpdGVtczogSU1lbnVJdGVtW10pIHtcclxuICAgIHN1cGVyLnVwZGF0ZUl0ZW1zKGl0ZW1zKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucm9vdCkge1xyXG4gICAgICByZXR1cm4gbmV3IEVycm9yKCdUaGUgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUgaXNuXFwndCByZW5kZXJlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHdoaWxlICh0aGlzLnJvb3QuZmlyc3RDaGlsZCkge1xyXG4gICAgICB0aGlzLnJvb3QuZmlyc3RDaGlsZC5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlckl0ZW1zKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpIHtcclxuICAgIGlmICh0aGlzLmNvbGxhcHNpbmdNb2RlICE9PSBDb2xsYXBzaW5nTW9kZS5BZGFwdGl2ZUNvbGxhcHNpbmdcclxuICAgICAgfHwgIXRoaXMucm9vdCB8fCAhdGhpcy5pdGVtcy5sZW5ndGggfHwgIXRoaXMuY29sbGFwc2VSb290IHx8ICF0aGlzLmNvbGxhcHNlRHJvcGRvd24pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzTmVlZENvbGxhcHNlKCkpIHtcclxuICAgICAgdGhpcy5jb2xsYXBzZVJvb3QuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7XHJcblxyXG4gICAgICBkbyB7XHJcbiAgICAgICAgY29uc3QgbGFzdEl0ZW1FbGVtZW50ID0gdGhpcy5yb290LmNoaWxkcmVuW3RoaXMucm9vdC5jaGlsZHJlbi5sZW5ndGggLSAyXTtcclxuICAgICAgICBpZiAoIWxhc3RJdGVtRWxlbWVudCkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1vdmVSb290SXRlbXNUb0NvbGxhcHNlRHJvcGRvd24obGFzdEl0ZW1FbGVtZW50KTtcclxuICAgICAgfSB3aGlsZSAodGhpcy5pc05lZWRDb2xsYXBzZSgpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHdoaWxlICh0aGlzLmNvbGxhcHNlRHJvcGRvd24uY2hpbGRyZW4ubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5tb3ZlUm9vdEl0ZW1zVG9Sb290KHRoaXMuY29sbGFwc2VEcm9wZG93bi5maXJzdEVsZW1lbnRDaGlsZCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzTmVlZENvbGxhcHNlKCkpIHtcclxuICAgICAgICAgIGNvbnN0IGxhc3RJdGVtRWxlbWVudCA9IHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLnJvb3QuY2hpbGRyZW4ubGVuZ3RoIC0gMl07XHJcbiAgICAgICAgICBsYXN0SXRlbUVsZW1lbnQgJiYgdGhpcy5tb3ZlUm9vdEl0ZW1zVG9Db2xsYXBzZURyb3Bkb3duKGxhc3RJdGVtRWxlbWVudCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5jb2xsYXBzZURyb3Bkb3duLmNoaWxkcmVuLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuY29sbGFwc2VSb290LmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpIHtcclxuICAgIHRoaXMuZm9yRWFjaE1lbnVJdGVtUmVjdXJzaXZlKHRoaXMuaXRlbXMsIChpdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IG9sZEFjdGl2ZVZhbHVlID0gaXRlbS5hY3RpdmU7XHJcbiAgICAgIGl0ZW0uYWN0aXZlID0gaXNJdGVtQWN0aXZlKGl0ZW0ub3JpZ2luYWxNb2RlbCk7XHJcblxyXG4gICAgICBpZiAoaXRlbS5hY3RpdmUgIT09IG9sZEFjdGl2ZVZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5hcHBseVN0YXRlc1RvSXRlbUVsZW1lbnQoaXRlbS5tZW51SXRlbUVsLmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50LCBpdGVtKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2VPcGVuZWREcm9wZG93bih0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgaWYgKHRoaXMuaXRlbUFjdGlvbk1vZGUgPT09ICdob3ZlcicpIHtcclxuICAgICAgLy9OT1RFOiBGb3IgY2xvc2luZyBvcGVuZWQgZHJvcGRvd25cclxuICAgICAgdGhpcy5yb290LmNsYXNzTGlzdC5yZW1vdmUoQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuSE9WRVJfTU9ERV9DU1NfQ0xBU1MpO1xyXG4gICAgICAkKHRhcmdldEVsZW1lbnQpLm9uZSgnbW91c2VsZWF2ZScsICgpID0+IHtcclxuICAgICAgICB0aGlzLnJvb3QuY2xhc3NMaXN0LmFkZChCb290c3RyYXBDb2xsYXBzaW5nTWVudS5IT1ZFUl9NT0RFX0NTU19DTEFTUyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGZvckVhY2hNZW51SXRlbVJlY3Vyc2l2ZShyb290SXRlbXM6IElNZW51SXRlbVtdLCBhY3Rpb246IChpdGVtOiBJTWVudUl0ZW0pID0+IHZvaWQpIHtcclxuICAgIHJvb3RJdGVtcy5mb3JFYWNoKChpKSA9PiB7XHJcbiAgICAgIGFjdGlvbihpKTtcclxuICAgICAgaWYgKHRoaXMuaXNOZXN0ZWRJdGVtc093bmVySXRlbShpKSkge1xyXG4gICAgICAgIHRoaXMuZm9yRWFjaE1lbnVJdGVtUmVjdXJzaXZlKGkuaXRlbXMsIGFjdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlclJvb3QoKSB7XHJcbiAgICB0aGlzLnJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xyXG4gICAgdGhpcy5yb290LmNsYXNzTGlzdC5hZGQoJ25hdmJhci1uYXYnLCAnbXItYXV0bycpO1xyXG4gICAgaWYgKHRoaXMuaXRlbUFjdGlvbk1vZGUgPT09ICdob3ZlcicpIHtcclxuICAgICAgdGhpcy5yb290LmNsYXNzTGlzdC5hZGQoQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuSE9WRVJfTU9ERV9DU1NfQ0xBU1MpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlckl0ZW1zKCkge1xyXG4gICAgdGhpcy5yZW5kZXJSb290SXRlbXMoKTtcclxuXHJcbiAgICBpZiAodGhpcy5pdGVtcy5sZW5ndGggJiYgdGhpcy5jb2xsYXBzaW5nTW9kZSAhPT0gQ29sbGFwc2luZ01vZGUuRGlzYWJsZWQpIHtcclxuICAgICAgaWYgKCF0aGlzLnJvb3QpIHtcclxuICAgICAgICB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMucm9vdC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XHJcbiAgICAgIHRoaXMucmVuZGVyQ29sbGFwc2VFbGVtZW50cygpO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmFwcGx5QWRhcHRpdml0eUNvbGxhcHNpbmcoKTtcclxuICAgICAgICB0aGlzLnJvb3Quc3R5bGUudmlzaWJpbGl0eSA9ICcnO1xyXG4gICAgICB9LCAxMCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jaGFuZ2VEZWZhdWx0RHJvcGRvd25CZWhhdmlvckZvck5lc3RlZERyb3Bkb3duKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY2hhbmdlRGVmYXVsdERyb3Bkb3duQmVoYXZpb3JGb3JOZXN0ZWREcm9wZG93bigpIHtcclxuICAgICQodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wZG93bicpKS5vbignaGlkZS5icy5kcm9wZG93bicsIChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGUudGFyZ2V0ICE9PSB0aGlzLmN1cnJlbnRPcGVuaW5nU3ViTWVudSAmJiBlLnRhcmdldC5jb250YWlucyh0aGlzLmN1cnJlbnRPcGVuaW5nU3ViTWVudSk7XHJcblxyXG4gICAgICByZXR1cm4gIXJlc3VsdDtcclxuICAgIH0pO1xyXG5cclxuICAgICQodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wZG93bi1zdWJtZW51JykpLm9uKCdzaG93LmJzLmRyb3Bkb3duJywgKGUpID0+IHtcclxuICAgICAgdGhpcy5jdXJyZW50T3BlbmluZ1N1Yk1lbnUgPSB1bmRlZmluZWQ7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZW5kZXJDb2xsYXBzZUVsZW1lbnRzKCkge1xyXG4gICAgaWYgKCF0aGlzLnJvb3QpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ3Jvb3QnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNvbGxhcHNlUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlUm9vdC5jbGFzc0xpc3QuYWRkKCduYXYtaXRlbScsICdkcm9wZG93bicsICdjb2xsYXBzaW5nLW1lbnVfX2NvbGxhcHNlLXJvb3QnKTtcclxuXHJcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24nLCAnYnRuJywgJ2J0bi1vdXRsaW5lLWxpZ2h0Jyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uLnNldEF0dHJpYnV0ZSgndHlwZScsICdidXR0b24nKTtcclxuICAgIHRoaXMuY29sbGFwc2VCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLXRvZ2dsZScsICdkcm9wZG93bicpO1xyXG5cclxuICAgIGNvbnN0IGljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJyk7XHJcbiAgICBpY29uLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24taWNvbicsICdmYXMnLCB0aGlzLmNvbGxhcHNlSWNvbk5hbWUpO1xyXG5cclxuICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlRHJvcGRvd24uY2xhc3NMaXN0LmFkZCgnZHJvcGRvd24tbWVudScsICdkcm9wZG93bi1tZW51LXJpZ2h0Jyk7XHJcblxyXG4gICAgdGhpcy5jb2xsYXBzZUJ1dHRvbi5hcHBlbmRDaGlsZChpY29uKTtcclxuICAgIHRoaXMuY29sbGFwc2VSb290LmFwcGVuZENoaWxkKHRoaXMuY29sbGFwc2VCdXR0b24pO1xyXG4gICAgdGhpcy5jb2xsYXBzZVJvb3QuYXBwZW5kQ2hpbGQodGhpcy5jb2xsYXBzZURyb3Bkb3duKTtcclxuXHJcbiAgICB0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5jb2xsYXBzZVJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlclJvb3RJdGVtcygpIHtcclxuICAgIGlmICghdGhpcy5yb290KSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGxldCBjb250ZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmlzTmVzdGVkSXRlbXNPd25lckl0ZW0oaXRlbSkpIHtcclxuICAgICAgICBjb250ZW50ID0gdGhpcy5jcmVhdGVSb290SXRlbVdpdGhOZXN0ZWRJdGVtcyhpdGVtIGFzIElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnRlbnQgPSB0aGlzLmNyZWF0ZVJvb3RJdGVtRWxlbWVudChpdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5yb290IS5hcHBlbmRDaGlsZChjb250ZW50KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVJvb3RJdGVtV2l0aE5lc3RlZEl0ZW1zKGl0ZW06IElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pIHtcclxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVSb290SXRlbUVsZW1lbnQoaXRlbSk7XHJcbiAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bicpO1xyXG5cclxuICAgIGNvbnN0IGl0ZW1Db250ZW50ID0gaXRlbUVsZW1lbnQucXVlcnlTZWxlY3RvcignLm5hdi1saW5rJyk7XHJcbiAgICBpdGVtQ29udGVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRoaXMuc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudCk7XHJcblxyXG4gICAgY29uc3QgZHJvcGRvd25NZW51RWxlbWVudCA9IHRoaXMuY3JlYXRlRHJvcGRvd25NZW51KGl0ZW0pO1xyXG4gICAgaXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25NZW51RWxlbWVudCk7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVJvb3RJdGVtRWxlbWVudChpdGVtOiBJTWVudUl0ZW0pIHtcclxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcclxuICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ25hdi1pdGVtJyk7XHJcbiAgICBpdGVtLnRpdGxlICYmIGl0ZW1FbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCBpdGVtLnRpdGxlKTtcclxuXHJcbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGl0ZW1Db250ZW50LmNsYXNzTGlzdC5hZGQoJ25hdi1saW5rJyk7XHJcbiAgICBpdGVtQ29udGVudC5ocmVmID0gaXRlbS51cmwgfHwgJ2phdmFzY3JpcHQ6dm9pZCgwKSc7XHJcbiAgICBpdGVtQ29udGVudC50ZXh0ID0gaXRlbS50ZXh0O1xyXG5cclxuICAgIGNvbnN0IGljb25FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtSWNvbkVsZW1lbnQoaXRlbSk7XHJcbiAgICBpY29uRWxlbWVudCAmJiBpdGVtQ29udGVudC5pbnNlcnRCZWZvcmUoaWNvbkVsZW1lbnQsIGl0ZW1Db250ZW50LmZpcnN0Q2hpbGQpO1xyXG5cclxuICAgIHRoaXMuYXBwbHlTdGF0ZXNUb0l0ZW1FbGVtZW50KGl0ZW1Db250ZW50LCBpdGVtKTtcclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzVG9JdGVtKGl0ZW1Db250ZW50LCBpdGVtKTtcclxuXHJcbiAgICBpdGVtRWxlbWVudC5hcHBlbmRDaGlsZChpdGVtQ29udGVudCk7XHJcblxyXG4gICAgaXRlbS5tZW51SXRlbUVsID0gaXRlbUVsZW1lbnQ7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZU5lc3RlZFN1Yk1lbnVJdGVtRWxlbWVudChpdGVtOiBJTWVudUl0ZW0gJiB7IGl0ZW1zOiBJTWVudUl0ZW1bXSB9KSB7XHJcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IHRoaXMuY3JlYXRlTmVzdGVkSXRlbShpdGVtKTtcclxuICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duJywgJ2Ryb3Bkb3duLXN1Ym1lbnUnKTtcclxuXHJcbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGl0ZW1FbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kcm9wZG93bi1pdGVtJyk7XHJcbiAgICBpdGVtQ29udGVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRoaXMuc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudCk7XHJcblxyXG4gICAgY29uc3QgZHJvcGRvd25NZW51RWxlbWVudCA9IHRoaXMuY3JlYXRlRHJvcGRvd25NZW51KGl0ZW0pO1xyXG4gICAgaXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25NZW51RWxlbWVudCk7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZU5lc3RlZEl0ZW0oaXRlbTogSU1lbnVJdGVtKSB7XHJcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICBpdGVtLnRpdGxlICYmIGl0ZW1FbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCBpdGVtLnRpdGxlKTtcclxuXHJcbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGl0ZW1Db250ZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLWl0ZW0nKTtcclxuICAgIGl0ZW1Db250ZW50LmhyZWYgPSBpdGVtLnVybCB8fCAnamF2YXNjcmlwdDp2b2lkKDApJztcclxuICAgIGl0ZW1Db250ZW50LnRleHQgPSBpdGVtLnRleHQ7XHJcblxyXG4gICAgY29uc3QgaWNvbkVsZW1lbnQgPSB0aGlzLmNyZWF0ZUl0ZW1JY29uRWxlbWVudChpdGVtKTtcclxuICAgIGljb25FbGVtZW50ICYmIGl0ZW1Db250ZW50Lmluc2VydEJlZm9yZShpY29uRWxlbWVudCwgaXRlbUNvbnRlbnQuZmlyc3RDaGlsZCk7XHJcblxyXG4gICAgdGhpcy5hcHBseVN0YXRlc1RvSXRlbUVsZW1lbnQoaXRlbUNvbnRlbnQsIGl0ZW0pO1xyXG4gICAgdGhpcy5hdHRhY2hFdmVudHNUb0l0ZW0oaXRlbUNvbnRlbnQsIGl0ZW0pO1xyXG5cclxuICAgIGl0ZW1FbGVtZW50LmFwcGVuZENoaWxkKGl0ZW1Db250ZW50KTtcclxuXHJcbiAgICBpdGVtLm1lbnVJdGVtRWwgPSBpdGVtRWxlbWVudDtcclxuXHJcbiAgICByZXR1cm4gaXRlbUVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY3JlYXRlRHJvcGRvd25NZW51KGl0ZW06IElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pIHtcclxuICAgIGNvbnN0IGRyb3Bkb3duTWVudUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xyXG4gICAgZHJvcGRvd25NZW51RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1tZW51Jyk7XHJcblxyXG4gICAgaXRlbS5pdGVtcy5mb3JFYWNoKChuZXN0ZWRJdGVtKSA9PiB7XHJcbiAgICAgIGxldCBjb250ZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmlzTmVzdGVkSXRlbXNPd25lckl0ZW0obmVzdGVkSXRlbSkpIHtcclxuICAgICAgICBjb250ZW50ID0gdGhpcy5jcmVhdGVOZXN0ZWRTdWJNZW51SXRlbUVsZW1lbnQobmVzdGVkSXRlbSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29udGVudCA9IHRoaXMuY3JlYXRlTmVzdGVkSXRlbShuZXN0ZWRJdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZHJvcGRvd25NZW51RWxlbWVudC5hcHBlbmRDaGlsZChjb250ZW50KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBkcm9wZG93bk1lbnVFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZUl0ZW1JY29uRWxlbWVudChpdGVtOiBJTWVudUl0ZW0pIHtcclxuICAgIGlmICghaXRlbS5pY29uKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGl0ZW1JY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xyXG4gICAgaXRlbUljb24uc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYHVybCgke2l0ZW0uaWNvbn0pYDtcclxuXHJcbiAgICByZXR1cm4gaXRlbUljb247XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgIGl0ZW1Db250ZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLXRvZ2dsZScpO1xyXG4gICAgaXRlbUNvbnRlbnQuc2V0QXR0cmlidXRlKCdkYXRhLXRvZ2dsZScsICdkcm9wZG93bicpO1xyXG4gICAgaXRlbUNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uVG9nZ2xlRHJvcGRvd25CdXR0b25DbGlja0hhbmRsZXIpO1xyXG4gICAgaXRlbUNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHRoaXMub25Ub2dnbGVEcm9wZG93bkJ1dHRvbk1vdXNlRW50ZXJIYW5kbGVyKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseVN0YXRlc1RvSXRlbUVsZW1lbnQoaXRlbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBpdGVtOiBJTWVudUl0ZW0pIHtcclxuICAgIGlmIChpdGVtLmFjdGl2ZSkge1xyXG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpdGVtLmhpZGRlbikge1xyXG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkLW5vbmUnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpdGVtLmRpc2FibGVkKSB7XHJcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkaXNhYmxlZCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGF0dGFjaEV2ZW50c1RvSXRlbShpdGVtRWxlbWVudDogSFRNTEVsZW1lbnQsIGl0ZW06IElNZW51SXRlbSkge1xyXG4gICAgaXRlbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4gdGhpcy5lbWl0SXRlbUNsaWNrKHtcclxuICAgICAgaXRlbSxcclxuICAgICAgb3JpZ2luYWxFdmVudDogZVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGlzTmVzdGVkSXRlbXNPd25lckl0ZW0oaXRlbTogSU1lbnVJdGVtKTogaXRlbSBpcyBJTWVudUl0ZW0gJiB7IGl0ZW1zOiBJTWVudUl0ZW1bXSB9IHtcclxuICAgIHJldHVybiBpdGVtLml0ZW1zICYmIGl0ZW0uaXRlbXMubGVuZ3RoICYmIGl0ZW0uaXRlbXMuc29tZSgoaSkgPT4gIWkuaGlkZGVuKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBtb3ZlUm9vdEl0ZW1zVG9Db2xsYXBzZURyb3Bkb3duKHJvb3RJdGVtT3JJdGVtczogRWxlbWVudCB8IEl0ZXJhYmxlPEVsZW1lbnQ+KTogdm9pZCB7XHJcbiAgICBpZiAocm9vdEl0ZW1Pckl0ZW1zIGluc3RhbmNlb2YgRWxlbWVudCkge1xyXG4gICAgICB0aGlzLmFwcGx5Q29sbGFwc2luZ1ZpZXdGb3JSb290SXRlbShyb290SXRlbU9ySXRlbXMpO1xyXG4gICAgICB0aGlzLmNvbGxhcHNlRHJvcGRvd24uaW5zZXJ0QmVmb3JlKHJvb3RJdGVtT3JJdGVtcywgdGhpcy5jb2xsYXBzZURyb3Bkb3duLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRlbXBJdGVtRWxlbWVudHNTdG9yZSA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuXHJcbiAgICAgIGZvciAoY29uc3Qgcm9vdEl0ZW0gb2Ygcm9vdEl0ZW1Pckl0ZW1zKSB7XHJcbiAgICAgICAgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmluc2VydEJlZm9yZShyb290SXRlbSwgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgICAgICB0aGlzLmFwcGx5Q29sbGFwc2luZ1ZpZXdGb3JSb290SXRlbShyb290SXRlbSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY29sbGFwc2VEcm9wZG93bi5hcHBlbmRDaGlsZCh0ZW1wSXRlbUVsZW1lbnRzU3RvcmUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG1vdmVSb290SXRlbXNUb1Jvb3Qocm9vdEl0ZW1Pckl0ZW1zOiBFbGVtZW50IHwgSXRlcmFibGU8RWxlbWVudD4pOiB2b2lkIHtcclxuICAgIGlmIChyb290SXRlbU9ySXRlbXMgaW5zdGFuY2VvZiBFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuYXBwbHlFeHBhbmRlZFZpZXdGb3JSb290SXRlbShyb290SXRlbU9ySXRlbXMpO1xyXG4gICAgICB0aGlzLnJvb3QuaW5zZXJ0QmVmb3JlKHJvb3RJdGVtT3JJdGVtcywgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMucm9vdC5jaGlsZHJlbi5sZW5ndGggLSAxXSB8fCBudWxsKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRlbXBJdGVtRWxlbWVudHNTdG9yZSA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuXHJcbiAgICAgIGZvciAoY29uc3Qgcm9vdEl0ZW0gb2Ygcm9vdEl0ZW1Pckl0ZW1zKSB7XHJcbiAgICAgICAgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmluc2VydEJlZm9yZShyb290SXRlbSwgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgICAgICB0aGlzLmFwcGx5RXhwYW5kZWRWaWV3Rm9yUm9vdEl0ZW0ocm9vdEl0ZW0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGVtcEl0ZW1FbGVtZW50c1N0b3JlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseUNvbGxhcHNpbmdWaWV3Rm9yUm9vdEl0ZW0ocm9vdEl0ZW06IEVsZW1lbnQpIHtcclxuICAgIHJvb3RJdGVtLmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLXN1Ym1lbnUnKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHJvb3RJdGVtLmNoaWxkcmVuKSB7XHJcbiAgICAgIGNoaWxkLmNsYXNzTGlzdC5yZXBsYWNlKCduYXYtbGluaycsICdkcm9wZG93bi1pdGVtJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlFeHBhbmRlZFZpZXdGb3JSb290SXRlbShyb290SXRlbTogRWxlbWVudCkge1xyXG4gICAgcm9vdEl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgnZHJvcGRvd24tc3VibWVudScpO1xyXG5cclxuICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygcm9vdEl0ZW0uY2hpbGRyZW4pIHtcclxuICAgICAgY2hpbGQuY2xhc3NMaXN0LnJlcGxhY2UoJ2Ryb3Bkb3duLWl0ZW0nLCAnbmF2LWxpbmsnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBpc05lZWRDb2xsYXBzZSgpIHtcclxuICAgIGlmICh0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1pbldpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWluV2lkdGgpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucm9vdC5zdHlsZS5tYXhXaWR0aCA9ICdub25lJztcclxuICAgIGNvbnN0IGN1cnJlbnRSb290UmVjdCA9IHRoaXMucm9vdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIHRoaXMucm9vdC5jbGFzc0xpc3QuYWRkKCdjb2xsYXBzaW5nLW1lbnVfbm9ybWFsLXdoaXRlLXNwYWNlJyk7XHJcblxyXG4gICAgY29uc3Qgbm9ybWFsUm9vdFJlY3QgPSB0aGlzLnJvb3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICB0aGlzLnJvb3QuY2xhc3NMaXN0LnJlbW92ZSgnY29sbGFwc2luZy1tZW51X25vcm1hbC13aGl0ZS1zcGFjZScpO1xyXG4gICAgdGhpcy5yb290LnN0eWxlLm1heFdpZHRoID0gJyc7XHJcblxyXG4gICAgcmV0dXJuIGN1cnJlbnRSb290UmVjdC53aWR0aCA+IG5vcm1hbFJvb3RSZWN0LndpZHRoO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGlzRHJvcGRvd25SZWN0c0ludGVyc2VjdChkcm9wZG93blJlY3QxOiBDbGllbnRSZWN0LCBkcm9wZG93blJlY3QyOiBDbGllbnRSZWN0LCBkZWx0YSA9IDIpIHtcclxuICAgIHJldHVybiBkcm9wZG93blJlY3QxLmxlZnQgPCAoZHJvcGRvd25SZWN0Mi5yaWdodCAtIGRlbHRhKSAmJiAoZHJvcGRvd25SZWN0Mi5sZWZ0ICsgZGVsdGEpIDwgZHJvcGRvd25SZWN0MS5yaWdodFxyXG4gICAgICAmJiBkcm9wZG93blJlY3QxLnRvcCA8IChkcm9wZG93blJlY3QyLmJvdHRvbSAtIGRlbHRhKSAmJiAoZHJvcGRvd25SZWN0Mi50b3AgKyBkZWx0YSkgPCBkcm9wZG93blJlY3QxLmJvdHRvbTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseVNoYWRvd3NGb3JPdmVybGFwaW5nRHJvcGRvd25JZk5lZWRlZChvcGVuZWREcm9wZG93bkVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAvLyBSZXNldCB0aGUgc3R5bGUgYmVmb3JlIHRoZSByZWN0IGdldHRpbmcgdG8gZ2V0IHJlYWwgdmFsdWVzXHJcbiAgICBvcGVuZWREcm9wZG93bkVsZW1lbnQuc3R5bGUubGVmdCA9ICcnO1xyXG4gICAgb3BlbmVkRHJvcGRvd25FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Ryb3Bkb3duLW1lbnUtbGVmdC1zaGFkb3dlZCcpO1xyXG4gICAgbGV0IHJlY3QgPSBvcGVuZWREcm9wZG93bkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBpZiAocmVjdC5yaWdodCA+IHdpbmRvdy5pbm5lcldpZHRoKSB7XHJcbiAgICAgIG9wZW5lZERyb3Bkb3duRWxlbWVudC5zdHlsZS5sZWZ0ID0gYC0ke3JlY3Qud2lkdGh9cHhgO1xyXG4gICAgfVxyXG5cclxuICAgIHJlY3QgPSBvcGVuZWREcm9wZG93bkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCBkcm9wZG93bkVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRyb3Bkb3duLW1lbnUnKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGRyb3Bkb3duRWxlbWVudCBvZiBkcm9wZG93bkVsZW1lbnRzKSB7XHJcbiAgICAgIGlmIChkcm9wZG93bkVsZW1lbnQgPT09IG9wZW5lZERyb3Bkb3duRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5pc0Ryb3Bkb3duUmVjdHNJbnRlcnNlY3QoZHJvcGRvd25FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCByZWN0KSkge1xyXG4gICAgICAgIG9wZW5lZERyb3Bkb3duRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1tZW51LWxlZnQtc2hhZG93ZWQnKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uV2luZG93UmVzaXplKGU6IFVJRXZlbnQpIHtcclxuICAgIHRoaXMuYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uVG9nZ2xlRHJvcGRvd25CdXR0b25DbGljayhlOiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAoZS50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBlLnRhcmdldC5wYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuY3VycmVudE9wZW5pbmdTdWJNZW51ID0gZS50YXJnZXQucGFyZW50RWxlbWVudDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvblRvZ2dsZURyb3Bkb3duQnV0dG9uTW91c2VFbnRlcihlOiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy53aW5kb3dSZXNpemVMaXN0ZW5lci5jdXJyZW50TGF5b3V0QnJlYWtwb2ludC5tYXhXaWR0aCA+PSB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludC5tYXhXaWR0aCAmJlxyXG4gICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50XHJcbiAgICAgICYmIGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZy5jbGFzc0xpc3QuY29udGFpbnMoJ2Ryb3Bkb3duLW1lbnUnKSkge1xyXG4gICAgICB0aGlzLmFwcGx5U2hhZG93c0Zvck92ZXJsYXBpbmdEcm9wZG93bklmTmVlZGVkKGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwgfSBmcm9tICcuL0lOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCc7XHJcbmltcG9ydCB7IGdldFVybEJ5TWVudUl0ZW1EYXRhLCBJTGF5b3V0QnJlYWtwb2ludCB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBCb290c3RyYXBDb2xsYXBzaW5nTWVudSB9IGZyb20gJy4uL0NvbXBvbmVudHMvTWVudSc7XHJcbmltcG9ydCB7IElNZW51SXRlbSwgTWVudUl0ZW1DbGlja0V2ZW50IH0gZnJvbSAnLi4vQ29tcG9uZW50cy9NZW51L01lbnUnO1xyXG5pbXBvcnQgeyBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4vU2VhcmNoJztcclxuXHJcbmNvbnN0IGZpbmRJdGVtQnlOYW1lUmVjdXJzaXZlbHkgPSAoaXRlbXM6IHJlYWRvbmx5IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFtdLCBpdGVtTmFtZTogc3RyaW5nKTogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsIHwgdW5kZWZpbmVkID0+IHtcclxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgIGlmIChpdGVtLk5hbWUgPT09IGl0ZW1OYW1lKSB7XHJcbiAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgfSBlbHNlIGlmIChpdGVtLkl0ZW1zPy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgbmVzdGVkSXRlbSA9IGZpbmRJdGVtQnlOYW1lUmVjdXJzaXZlbHkoaXRlbS5JdGVtcywgaXRlbU5hbWUpO1xyXG5cclxuICAgICAgaWYgKG5lc3RlZEl0ZW0pIHtcclxuICAgICAgICByZXR1cm4gbmVzdGVkSXRlbTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IGdldEl0ZW1VcmxzUmVjdXJzaXZlbHkgPSAoaXRlbURhdGE6IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCk6IHN0cmluZ1tdID0+IHtcclxuICBjb25zdCBpdGVtcyA9IGl0ZW1EYXRhLkl0ZW1zO1xyXG5cclxuICBpZiAoIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcclxuICAgIGNvbnN0IG93blVybCA9IGdldFVybEJ5TWVudUl0ZW1EYXRhKGl0ZW1EYXRhKTtcclxuXHJcbiAgICByZXR1cm4gb3duVXJsID8gW293blVybF0gOiBbXTtcclxuICB9XHJcblxyXG4gIGxldCB1cmxzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGl0ZW1zKSB7XHJcbiAgICB1cmxzID0gdXJscy5jb25jYXQoZ2V0SXRlbVVybHNSZWN1cnNpdmVseShjaGlsZCkpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHVybHM7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaXNJdGVtQWN0aXZlID0gKGl0ZW1EYXRhOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwpID0+IHtcclxuICBjb25zdCBjdXJyZW50TG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoO1xyXG4gIGNvbnN0IGl0ZW1VcmxzID0gZ2V0SXRlbVVybHNSZWN1cnNpdmVseShpdGVtRGF0YSk7XHJcblxyXG4gIGZvciAoY29uc3QgdXJsIG9mIGl0ZW1VcmxzKSB7XHJcbiAgICBjb25zdCB1cmxSZSA9IG5ldyBSZWdFeHAoYF4uKiR7dXJsLnJlcGxhY2UoJz8nLCAnXFxcXD8nKX0kYCk7XHJcblxyXG4gICAgaWYgKHVybFJlLnRlc3QoY3VycmVudExvY2F0aW9uKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBmYWxzZTtcclxufTtcclxuXHJcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogaW50ZXJmYWNlLW5hbWVcclxuZXhwb3J0IGludGVyZmFjZSBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50IHtcclxuICByZWFkb25seSBpdGVtOiBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbDtcclxuICByZWFkb25seSBvcmlnaW5hbEV2ZW50OiBVSUV2ZW50O1xyXG4gIGNhbmNlbD86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOYXZpZ2F0aW9uTWVudSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25OYXZpZ2F0aW9uTWVudUl0ZW1DbGljazogKChlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbk1lbnVJdGVtQ2xpY2tIYW5kbGVyID0gdGhpcy5vbk1lbnVJdGVtQ2xpY2suYmluZCh0aGlzKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IG1lbnU6IEJvb3RzdHJhcENvbGxhcHNpbmdNZW51O1xyXG4gIHByaXZhdGUgaXNHbG9iYWxNZW51OiBib29sZWFuO1xyXG4gIHByaXZhdGUgaXRlbXM6IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXHJcbiAgICBpdGVtczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10sXHJcbiAgICBpc0dsb2JhbE1lbnU6IGJvb2xlYW4sXHJcbiAgICBjb2xsYXBzZUJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50LFxyXG4gICAgb25OYXZpZ2F0aW9uTWVudUl0ZW1DbGljazogKGU6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQpID0+IHZvaWRcclxuICApIHtcclxuICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xyXG4gICAgdGhpcy5pc0dsb2JhbE1lbnUgPSBpc0dsb2JhbE1lbnUsXHJcbiAgICB0aGlzLml0ZW1zID0gaXRlbXM7XHJcbiAgICB0aGlzLm9uTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2sgPSBvbk5hdmlnYXRpb25NZW51SXRlbUNsaWNrO1xyXG4gICAgdGhpcy5tZW51ID0gbmV3IEJvb3RzdHJhcENvbGxhcHNpbmdNZW51KHtcclxuICAgICAgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lcixcclxuICAgICAgaXRlbXM6IHRoaXMubWFwTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxUb01lbnVJdGVtcyhpdGVtcyksXHJcbiAgICAgIGNvbGxhcHNlQnJlYWtwb2ludCxcclxuICAgICAgb25JdGVtQ2xpY2s6IHRoaXMub25NZW51SXRlbUNsaWNrSGFuZGxlclxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlRGF0YShpdGVtczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10sIGlzR2xvYmFsTWVudTogYm9vbGVhbikge1xyXG4gICAgLyogZXNsaW50IEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtZXhwcmVzc2lvbnM6IG9mZiAqL1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gICAgdGhpcy5pc0dsb2JhbE1lbnUgPSBpc0dsb2JhbE1lbnU7XHJcbiAgICB0aGlzLm1lbnUudXBkYXRlSXRlbXModGhpcy5tYXBOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFRvTWVudUl0ZW1zKHRoaXMuaXRlbXMpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICB0aGlzLm1lbnUucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpIHtcclxuICAgIHRoaXMubWVudS5hcHBseUFkYXB0aXZpdHlDb2xsYXBzaW5nKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpIHtcclxuICAgIHRoaXMubWVudS51cGRhdGVBY3RpdmVJdGVtc1N0YXRlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uTWVudUl0ZW1DbGljayhlOiBNZW51SXRlbUNsaWNrRXZlbnQpIHtcclxuICAgIGNvbnN0IGV2ZW50QXJncyA9IHRoaXMubWFwTWVudUl0ZW1DbGlja0V2ZW50QXJnc1RvTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2tFdmVudEFyZ3MoZSk7XHJcbiAgICBpZiAoZXZlbnRBcmdzKSB7XHJcbiAgICAgIHRoaXMuZW1pdE5hdmlnYXRpb25NZW51SXRlbUNsaWNrKGV2ZW50QXJncyk7XHJcblxyXG4gICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xyXG4gICAgICAgIGUub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXRFbCA9IGUub3JpZ2luYWxFdmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5tZW51LmNsb3NlT3BlbmVkRHJvcGRvd24odGFyZ2V0RWwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVtaXROYXZpZ2F0aW9uTWVudUl0ZW1DbGljayhlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2s/LihlKTtcclxuICAgICAgZS5pdGVtLk9uQ2xpY2s/LihlKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxUb01lbnVJdGVtcyhtZW51SXRlbU1vZGVsczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10pIHtcclxuICAgIHJldHVybiBtZW51SXRlbU1vZGVscy5tYXA8SU1lbnVJdGVtPigobWVudUl0ZW1Nb2RlbCkgPT4ge1xyXG4gICAgICBjb25zdCBtZW51SXRlbSA9IHtcclxuICAgICAgICB0ZXh0OiBtZW51SXRlbU1vZGVsLk5hbWUsXHJcbiAgICAgICAgaWNvbjogbWVudUl0ZW1Nb2RlbC5JY29uLFxyXG4gICAgICAgIGl0ZW1zOiBtZW51SXRlbU1vZGVsLkl0ZW1zID8gdGhpcy5tYXBOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFRvTWVudUl0ZW1zKG1lbnVJdGVtTW9kZWwuSXRlbXMpIDogdW5kZWZpbmVkLFxyXG4gICAgICAgIHVybDogZ2V0VXJsQnlNZW51SXRlbURhdGEobWVudUl0ZW1Nb2RlbCksXHJcbiAgICAgICAgaGlkZGVuOiBtZW51SXRlbU1vZGVsLlZpc2libGUgPT09IGZhbHNlLFxyXG4gICAgICAgIGFjdGl2ZTogaXNJdGVtQWN0aXZlKG1lbnVJdGVtTW9kZWwpLFxyXG4gICAgICAgIGRpc2FibGVkOiBtZW51SXRlbU1vZGVsLkRpc2FibGVkLFxyXG4gICAgICAgIHRpdGxlOiBtZW51SXRlbU1vZGVsLkRlc2NyaXB0aW9uLFxyXG4gICAgICAgIG9yaWdpbmFsTW9kZWw6IG1lbnVJdGVtTW9kZWxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJldHVybiBtZW51SXRlbTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXBNZW51SXRlbUNsaWNrRXZlbnRBcmdzVG9OYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50QXJncyhlOiBNZW51SXRlbUNsaWNrRXZlbnQpOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50IHwgbnVsbCB7XHJcbiAgICBjb25zdCBpdGVtID0gZmluZEl0ZW1CeU5hbWVSZWN1cnNpdmVseSh0aGlzLml0ZW1zLCBlLml0ZW0udGV4dCk7XHJcblxyXG4gICAgcmV0dXJuICFpdGVtID8gbnVsbCA6IHtcclxuICAgICAgb3JpZ2luYWxFdmVudDogZS5vcmlnaW5hbEV2ZW50LFxyXG4gICAgICBjYW5jZWw6IGZhbHNlLFxyXG4gICAgICBpdGVtOiB7IC4uLml0ZW0sIGlzR2xvYmFsOiB0aGlzLmlzR2xvYmFsTWVudSB9XHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGNvbnN0IExPR09fU0VUVElOR1NfQ0FDSEVfS0VZID0gJ2lzem9sZWEtdWl8bG9nby1zZXR0aW5ncyc7XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTG9nb1NldHRpbmdzIH0gZnJvbSAnLi4vRGF0YSc7XHJcbmltcG9ydCB7IExPR09fU0VUVElOR1NfQ0FDSEVfS0VZIH0gZnJvbSAnLi4vQ29uc3RhbnRzL0NhY2hlS2V5cyc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vRGF0YS9SZXF1ZXN0JztcclxuXHJcbmV4cG9ydCBjbGFzcyBMb2dvIHtcclxuICBwcml2YXRlIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgcHJpdmF0ZSAkaW1hZ2VFbGVtZW50OiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gIHByaXZhdGUgJHRpdGxlQ29udGFpbmVyOiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YVNvdXJjZTogSUxvZ29TZXR0aW5ncyB8IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IoJGNvbnRhaW5lcjogSlF1ZXJ5LCBkYXRhU291cmNlOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSAkY29udGFpbmVyO1xyXG4gICAgdGhpcy5kYXRhU291cmNlID0gZGF0YVNvdXJjZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0V2lkZ2V0KCk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luaXRXaWRnZXQodGhpcy5kYXRhU291cmNlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVEYXRhKCk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xyXG4gICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVkpO1xyXG4gICAgdGhpcy4kaW1hZ2VFbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgdGhpcy4kdGl0bGVDb250YWluZXIucmVtb3ZlKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2luaXRXaWRnZXQodGhpcy5kYXRhU291cmNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRXaWRnZXQoZGF0YVNvdXJjZTogSUxvZ29TZXR0aW5ncyB8IHN0cmluZyk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xyXG4gICAgY29uc3QgY2FjaGVkU2V0dGluZ3NSYXcgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShMT0dPX1NFVFRJTkdTX0NBQ0hFX0tFWSk7XHJcblxyXG4gICAgaWYgKGNhY2hlZFNldHRpbmdzUmF3KSB7XHJcbiAgICAgIHRoaXMuX2NyZWF0ZUxvZ28oSlNPTi5wYXJzZShjYWNoZWRTZXR0aW5nc1JhdykgYXMgSUxvZ29TZXR0aW5ncyk7XHJcblxyXG4gICAgICByZXR1cm4gJC5EZWZlcnJlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVMb2dvKGRhdGFTb3VyY2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlTG9nbyhkYXRhU291cmNlOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nKTogSlF1ZXJ5RGVmZXJyZWQ8YW55PiB7XHJcbiAgICBpZiAodHlwZW9mIGRhdGFTb3VyY2UgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIGNvbnN0IGxvZ29TZXR0aW5ncyA9IGRhdGFTb3VyY2UgYXMgSUxvZ29TZXR0aW5ncztcclxuXHJcbiAgICAgIHRoaXMuX2NyZWF0ZUxvZ29NYXJrdXAobG9nb1NldHRpbmdzKTtcclxuXHJcbiAgICAgIHJldHVybiAkLkRlZmVycmVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHRoaXMuZGF0YVNvdXJjZSBhcyBzdHJpbmcsICdwb3N0JykuZG9uZSgoZGF0YSkgPT4ge1xyXG4gICAgICBjb25zdCBsb2dvU2V0dGluZ3M6IElMb2dvU2V0dGluZ3MgPSB7fTtcclxuICAgICAgbG9nb1NldHRpbmdzLmFwcGxpY2F0aW9uTmFtZSA9IGRhdGEuQXBwbGljYXRpb25OYW1lO1xyXG4gICAgICBsb2dvU2V0dGluZ3MuYnVzaW5lc3NOYW1lID0gZGF0YS5CdXNpbmVzc05hbWU7XHJcbiAgICAgIGxvZ29TZXR0aW5ncy5sb2dvSW1hZ2UgPSBkYXRhLkxvZ29JbWFnZTtcclxuICAgICAgbG9nb1NldHRpbmdzLmxhbmRpbmdQYWdlTG9nbyA9IGRhdGEuTGFuZGluZ1BhZ2VMb2dvO1xyXG4gICAgICBsb2dvU2V0dGluZ3MuZGVzY3JpcHRpb24gPSBkYXRhLkRlc2NyaXB0aW9uO1xyXG5cclxuICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVksIEpTT04uc3RyaW5naWZ5KGxvZ29TZXR0aW5ncykpO1xyXG5cclxuICAgICAgdGhpcy5fY3JlYXRlTG9nb01hcmt1cChsb2dvU2V0dGluZ3MpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVMb2dvTWFya3VwKGxvZ29TZXR0aW5nczogSUxvZ29TZXR0aW5ncykge1xyXG4gICAgdGhpcy4kaW1hZ2VFbGVtZW50ID0gJCgnPGltZyAvPicpLmF0dHIoJ3NyYycsIGxvZ29TZXR0aW5ncy5sb2dvSW1hZ2UpLmFwcGVuZFRvKHRoaXMuJGNvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy4kdGl0bGVDb250YWluZXIgPSAkKCc8c3BhbiAvPicpLmFkZENsYXNzKCd0aXRsZS1jb250YWluZXInKS5hcHBlbmRUbyh0aGlzLiRjb250YWluZXIpO1xyXG5cclxuICAgIHRoaXMuJHRpdGxlQ29udGFpbmVyLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2J1c2luZXNzLW5hbWUnKS50ZXh0KGxvZ29TZXR0aW5ncy5idXNpbmVzc05hbWUpKTtcclxuICAgIHRoaXMuJHRpdGxlQ29udGFpbmVyLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2FwcC1uYW1lJykudGV4dChsb2dvU2V0dGluZ3MuYXBwbGljYXRpb25OYW1lLnRvVXBwZXJDYXNlKCkpKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElEZXN0cm95YWJsZSwgSVJlbmRlcmVkIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHsgV2luZG93UmVzaXplTGlzdGVuZXIsIElMYXlvdXRCcmVha3BvaW50LCBMYXlvdXRCcmVha3BvaW50Q2hhbmdlZEV2ZW50LCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cyB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTWVudVN3aXRjaGVyT3B0aW9ucyB7XHJcbiAgZGVza3RvcENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgbW9iaWxlQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICBjb2xsYXBzZUJyZWFrcG9pbnQ/OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBzdGFydFZhbHVlPzogYm9vbGVhbjtcclxuICBvblN3aXRjaD86ICh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE1lbnVTd2l0Y2hlciBpbXBsZW1lbnRzIElSZW5kZXJlZCwgSURlc3Ryb3lhYmxlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc2t0b3BDb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbW9iaWxlQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbGxhcHNlQnJlYWtwb2ludDogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblN3aXRjaDogKCh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkTGlzdGVuZXIgPSB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWQuYmluZCh0aGlzKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHdpbmRvd1Jlc2l6ZUxpc3RlbmVyOiBXaW5kb3dSZXNpemVMaXN0ZW5lcjtcclxuICBwcml2YXRlIF92YWx1ZTogYm9vbGVhbjtcclxuICBwcml2YXRlIG1lbnVTd2l0Y2hlcjogRGV2RXhwcmVzcy51aS5keFN3aXRjaCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIG9uVmFsdWVDaGFuZ2VkOiAodmFsdWU6IGJvb2xlYW4pID0+IHZvaWQ7XHJcblxyXG4gIHB1YmxpYyBnZXQgdmFsdWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJTWVudVN3aXRjaGVyT3B0aW9ucykge1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGFpbmVyID0gb3B0aW9ucy5kZXNrdG9wQ29udGFpbmVyO1xyXG4gICAgdGhpcy5tb2JpbGVDb250YWluZXIgPSBvcHRpb25zLm1vYmlsZUNvbnRhaW5lcjtcclxuICAgIHRoaXMuY29sbGFwc2VCcmVha3BvaW50ID0gb3B0aW9ucy5jb2xsYXBzZUJyZWFrcG9pbnQgfHwgYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHMubWQ7XHJcbiAgICB0aGlzLm9uU3dpdGNoID0gb3B0aW9ucy5vblN3aXRjaDtcclxuICAgIHRoaXMuX3ZhbHVlID0gb3B0aW9ucy5zdGFydFZhbHVlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnN0YXJ0VmFsdWUgOiB0cnVlO1xyXG5cclxuICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBuZXcgV2luZG93UmVzaXplTGlzdGVuZXIodW5kZWZpbmVkLCB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWRMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBjb250YWluZXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pc01vYmlsZVZpZXcgPyB0aGlzLm1vYmlsZUNvbnRhaW5lciA6IHRoaXMuZGVza3RvcENvbnRhaW5lcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGlzTW9iaWxlVmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1heFdpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWF4V2lkdGg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VmlzaWJsZShpc1Zpc2libGU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMubWVudVN3aXRjaGVyPy5vcHRpb24oJ3Zpc2libGUnLCBpc1Zpc2libGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIHRoaXMucmVuZGVyU3dpdGNoKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVzdHJveSgpIHtcclxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLm1lbnVTd2l0Y2hlci5lbGVtZW50KCk7XHJcbiAgICB0aGlzLm1lbnVTd2l0Y2hlcj8uZGlzcG9zZSgpO1xyXG5cclxuICAgIHJvb3Q/LnJlbW92ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFZhbHVlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLm1lbnVTd2l0Y2hlci5vcHRpb24oJ3ZhbHVlJywgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZVZhbHVlQ2hhbmdlZChvblZhbHVlQ2hhbmdlZDogKHZhbHVlOiBib29sZWFuKSA9PiB2b2lkKSB7XHJcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkID0gb25WYWx1ZUNoYW5nZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclN3aXRjaCgpIHtcclxuICAgIHRoaXMubWVudVN3aXRjaGVyID0gJCgnPGRpdj4nKS5keFN3aXRjaCh7XHJcbiAgICAgIHN3aXRjaGVkT2ZmVGV4dDogJ1BlcnNvbmFsJyxcclxuICAgICAgc3dpdGNoZWRPblRleHQ6ICdHbG9iYWwnLFxyXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcclxuICAgICAgd2lkdGg6ICcxMDBweCcsXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoeyB2YWx1ZSB9KSA9PiB7XHJcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5vblN3aXRjaCkge1xyXG4gICAgICAgICAgdGhpcy5vblN3aXRjaCh0aGlzLnZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9uVmFsdWVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkKHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICB9KS5keFN3aXRjaCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLm1lbnVTd2l0Y2hlci5lbGVtZW50KClbMF0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzd2l0Y2hWaWV3KCkge1xyXG4gICAgdGhpcy5kZXN0cm95KCk7XHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpIHtcclxuICAgIHRoaXMuc3dpdGNoVmlldygpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2tFdmVudCB9IGZyb20gJy4nO1xyXG5pbXBvcnQgeyBNZW51SXRlbVR5cGUgfSBmcm9tICcuLi9CdXNpbmVzcyc7XHJcbmltcG9ydCB7IGdldFVybEJ5TWVudUl0ZW1EYXRhIH0gZnJvbSAnLi4vSGVscGVycy9JbmRleCc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4vSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVNlYXJjaE9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICBnZXRNZW51RGF0YVNvdXJjZTogKCkgPT4gSVNlYXJjaERhdGFTb3VyY2U7XHJcbiAgZ2V0SXNHbG9iYWxNZW51U2hvd246ICgpID0+IGJvb2xlYW47XHJcbiAgb25EaW1lbnNpb25zQ2hhbmdlZD86ICgpID0+IHZvaWQ7XHJcbiAgb25NZW51SXRlbUNsaWNrPzogKGU6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQpID0+IHZvaWQ7XHJcbiAgb25NZW51SXRlbU9wZW5lZD86IChlOiBJT3BlblJlcG9ydEV2ZW50QXJncykgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU2VhcmNoRGF0YVNvdXJjZSB7XHJcbiAgZ2xvYWJhbEl0ZW1zOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXTtcclxuICBwZXJzb25hbEl0ZW1zOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXSB8IHVuZGVmaW5lZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJT3BlblJlcG9ydEV2ZW50QXJncyB7XHJcbiAgbWVudUl0ZW06IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCA9IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCAmIHtcclxuICBpc0dsb2JhbDogYm9vbGVhbjtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlYXJjaCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBnZXRNZW51RGF0YVNvdXJjZTogKCkgPT4gSVNlYXJjaERhdGFTb3VyY2U7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBnZXRJc0dsb2JhbE1lbnVTaG93bjogKCkgPT4gYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uRGltZW5zaW9uc0NoYW5nZWQ6ICgpID0+IHZvaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbk1lbnVJdGVtQ2xpY2s6IChlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25NZW51SXRlbU9wZW5lZDogKGU6IElPcGVuUmVwb3J0RXZlbnRBcmdzKSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIHNlYXJjaERyb3BEb3duOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3ggfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBzZWFyY2hSZXN1bHRzVHJlZUxpc3Q6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVNlYXJjaE9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZ2V0TWVudURhdGFTb3VyY2UgPSBvcHRpb25zLmdldE1lbnVEYXRhU291cmNlO1xyXG4gICAgdGhpcy5nZXRJc0dsb2JhbE1lbnVTaG93biA9IG9wdGlvbnMuZ2V0SXNHbG9iYWxNZW51U2hvd247XHJcbiAgICB0aGlzLm9uRGltZW5zaW9uc0NoYW5nZWQgPSBvcHRpb25zLm9uRGltZW5zaW9uc0NoYW5nZWQ7XHJcbiAgICB0aGlzLm9uTWVudUl0ZW1PcGVuZWQgPSBvcHRpb25zLm9uTWVudUl0ZW1PcGVuZWQ7XHJcbiAgICB0aGlzLm9uTWVudUl0ZW1DbGljayA9IG9wdGlvbnMub25NZW51SXRlbUNsaWNrO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFZpc2libGUoaXNWaXNpYmxlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5vcHRpb24oJ3Zpc2libGUnLCBpc1Zpc2libGUpO1xyXG4gICAgdGhpcy5vbkRpbWVuc2lvbnNDaGFuZ2VkICYmIHRoaXMub25EaW1lbnNpb25zQ2hhbmdlZCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFNlYXJjaFRleHQodGV4dDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5vcHRpb24oJ3ZhbHVlJywgdGV4dCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVsb2FkTWVudUl0ZW1zKCkge1xyXG4gICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3Q/Lm9wdGlvbignZGF0YVNvdXJjZScsIHRoaXMuZ2V0RGF0YVNvdXJjZUZvclNlYXJjaCh0aGlzLmdldE1lbnVEYXRhU291cmNlKCkpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBjb25zdCBmb3JtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTtcclxuICAgIGZvcm1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Zvcm0taW5saW5lJyk7XHJcblxyXG4gICAgY29uc3QgJGlucHV0ID0gJCgnPGRpdiAvPicpLmR4RHJvcERvd25Cb3goe1xyXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlYXJjaCcsXHJcbiAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICBzaG93RHJvcERvd25CdXR0b246IGZhbHNlLFxyXG4gICAgICBhcHBseVZhbHVlTW9kZTogJ2luc3RhbnRseScsXHJcbiAgICAgIGFjY2VwdEN1c3RvbVZhbHVlOiB0cnVlLFxyXG4gICAgICBvcGVuT25GaWVsZENsaWNrOiBmYWxzZSxcclxuICAgICAgbW9kZTogJ3NlYXJjaCcsXHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7XHJcbiAgICAgICAgJ3R5cGUnOiAnc2VhcmNoJyxcclxuICAgICAgICAnYXJpYS1sYWJlbCc6ICdTZWFyY2gnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKGUsICRlbCkgPT4ge1xyXG4gICAgICAgICRlbC5hZGRDbGFzcygnaGVhZGVyLXNlYXJjaC1yZXN1bHRzLXRyZWUtbGlzdCcpO1xyXG4gICAgICAgIGNvbnN0ICR0cmVlTGlzdCA9ICQoJzxkaXY+JykuZHhUcmVlTGlzdCh7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiB0aGlzLmdldERhdGFTb3VyY2VGb3JTZWFyY2godGhpcy5nZXRNZW51RGF0YVNvdXJjZSgpKSxcclxuICAgICAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgICAgZm9jdXNlZFJvd0VuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgICAgIGFsbG93QWRkaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgYWxsb3dVcGRhdGluZzogZmFsc2UsXHJcbiAgICAgICAgICAgIGFsbG93RGVsZXRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG5vRGF0YVRleHQ6ICdObyByZXN1bHRzIGZvdW5kJyxcclxuICAgICAgICAgIGRhdGFTdHJ1Y3R1cmU6ICd0cmVlJyxcclxuICAgICAgICAgIGtleUV4cHI6ICdJZCcsXHJcbiAgICAgICAgICBpdGVtc0V4cHI6ICdJdGVtcycsXHJcbiAgICAgICAgICBmaWx0ZXJNb2RlOiAnZnVsbEJyYW5jaCcsXHJcbiAgICAgICAgICBzaG93Q29sdW1uSGVhZGVyczogZmFsc2UsXHJcbiAgICAgICAgICBjb2x1bW5zOiBbe1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdOYW1lJyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnXHJcbiAgICAgICAgICB9XSxcclxuICAgICAgICAgIG9uQ2VsbENsaWNrOiAoeyBkYXRhIH0pID0+IHtcclxuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvTWVudUl0ZW0oZGF0YSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb25LZXlEb3duOiAoYXJncykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBldmVudDogS2V5Ym9hcmRFdmVudCA9IGFyZ3MuZXZlbnQgYXMgYW55O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZm9jdXNlZFJvd0tleSA9IHRoaXMuc2VhcmNoUmVzdWx0c1RyZWVMaXN0Lm9wdGlvbignZm9jdXNlZFJvd0tleScpO1xyXG4gICAgICAgICAgICBpZiAoZm9jdXNlZFJvd0tleSAhPT0gbnVsbCAmJiBmb2N1c2VkUm93S2V5ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnRW50ZXInOlxyXG4gICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3QuZ2V0Tm9kZUJ5S2V5KGZvY3VzZWRSb3dLZXkpLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVUb01lbnVJdGVtKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJyAnOlxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdC5leHBhbmRSb3coZm9jdXNlZFJvd0tleSk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoUmVzdWx0c1RyZWVMaXN0LmNvbGxhcHNlUm93KGZvY3VzZWRSb3dLZXkpO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdFc2NhcGUnOlxyXG4gICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VhcmNoRHJvcERvd24uZm9jdXMoKSk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdCA9ICR0cmVlTGlzdC5keFRyZWVMaXN0KCdpbnN0YW5jZScpO1xyXG5cclxuICAgICAgICByZXR1cm4gJHRyZWVMaXN0O1xyXG4gICAgICB9LFxyXG4gICAgICBkcm9wRG93bk9wdGlvbnM6IHtcclxuICAgICAgICBwb3NpdGlvbjoge1xyXG4gICAgICAgICAgb2Y6ICcuc2VhcmNoLWRyb3Bkb3duJyxcclxuICAgICAgICAgIG15OiAndG9wJyxcclxuICAgICAgICAgIGF0OiAnYm90dG9tJyxcclxuICAgICAgICAgIG9mZnNldDogeyB4OiAxNDksIHk6IDQgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd2lkdGg6IDUxOCxcclxuICAgICAgICBhbmltYXRpb246IHtcclxuICAgICAgICAgIHNob3c6IHsgZHVyYXRpb246IDAgfSxcclxuICAgICAgICAgIGhpZGU6IHsgZHVyYXRpb246IDAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXHJcbiAgICAgICAgb25TaG93bjogKGUpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2VhcmNoRHJvcERvd24uZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRm9jdXNJbjogKGUpID0+IHtcclxuICAgICAgICBlLmNvbXBvbmVudC5lbGVtZW50KCkuYWRkQ2xhc3MoJ2ZvY3VzZWQnKTtcclxuICAgICAgICB0aGlzLm9uRGltZW5zaW9uc0NoYW5nZWQgJiYgdGhpcy5vbkRpbWVuc2lvbnNDaGFuZ2VkKCk7XHJcbiAgICAgICAgdGhpcy5jaGVja1NlYXJjaFJlc3V0UG9wdXBWaXNpYmlsaXR5KGUuY29tcG9uZW50LmVsZW1lbnQoKS5maW5kKCdpbnB1dC5keC10ZXh0ZWRpdG9yLWlucHV0JykudmFsKCkgYXMgc3RyaW5nKTtcclxuICAgICAgfSxcclxuICAgICAgb25Gb2N1c091dDogKGUpID0+IHtcclxuICAgICAgICBpZiAoIWUuY29tcG9uZW50LmVsZW1lbnQoKS5maW5kKCdpbnB1dC5keC10ZXh0ZWRpdG9yLWlucHV0JykudmFsKCkpIHtcclxuICAgICAgICAgIGUuY29tcG9uZW50LmVsZW1lbnQoKS5yZW1vdmVDbGFzcygnZm9jdXNlZCcpO1xyXG4gICAgICAgICAgdGhpcy5vbkRpbWVuc2lvbnNDaGFuZ2VkICYmIHRoaXMub25EaW1lbnNpb25zQ2hhbmdlZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgb25LZXlVcDogKGUpID0+IHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGV2ZW50OiBLZXlib2FyZEV2ZW50ID0gZS5ldmVudCBhcyBhbnk7XHJcblxyXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBlLmNvbXBvbmVudC5lbGVtZW50KCkuZmluZCgnaW5wdXQuZHgtdGV4dGVkaXRvci1pbnB1dCcpLnZhbCgpIGFzIHN0cmluZztcclxuXHJcbiAgICAgICAgICB0aGlzLmNoZWNrU2VhcmNoUmVzdXRQb3B1cFZpc2liaWxpdHkodmFsdWUpO1xyXG4gICAgICAgICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3Quc2VhcmNoQnlUZXh0KHZhbHVlKTtcclxuICAgICAgICAgIGNvbnN0IHRyaWdnZXJlZEZvY3VzQnV0dG9ucyA9IFsnVGFiJywgJ0VudGVyJywgJ0Fycm93RG93bicsICdBcnJvd1VwJ107XHJcbiAgICAgICAgICBpZiAodHJpZ2dlcmVkRm9jdXNCdXR0b25zLnNvbWUoKGIpID0+IGIgPT09IGV2ZW50LmtleSkpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3QuZm9jdXModGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3QuZ2V0Q2VsbEVsZW1lbnQoMCwgJ05hbWUnKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uS2V5RG93bjogKGUpID0+IHtcclxuICAgICAgICBjb25zdCBldmVudDogS2V5Ym9hcmRFdmVudCA9IGUuZXZlbnQgYXMgYW55O1xyXG5cclxuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xyXG4gICAgICAgICAgdGhpcy5jbG9zZVNlYXJjaERyb3BEb3duKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvblZhbHVlQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICB0aGlzLmNoZWNrU2VhcmNoUmVzdXRQb3B1cFZpc2liaWxpdHkoZS52YWx1ZSk7XHJcbiAgICAgIH0sXHJcbiAgICB9KS5hZGRDbGFzcyhbJ2Zvcm0tY29udHJvbCcsICdtci1zbS0yJywgJ3NlYXJjaC1kcm9wZG93biddKTtcclxuXHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duID0gJGlucHV0LmR4RHJvcERvd25Cb3goJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgZm9ybUVsZW1lbnQuYXBwZW5kQ2hpbGQoJGlucHV0WzBdKTtcclxuICAgIHRoaXMuJGNvbnRhaW5lci5hcHBlbmQoZm9ybUVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0ZVRvTWVudUl0ZW0obWVudUl0ZW06IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsKSB7XHJcbiAgICBjb25zdCB1cmwgPSBnZXRVcmxCeU1lbnVJdGVtRGF0YShtZW51SXRlbSk7XHJcblxyXG4gICAgaWYgKHVybCkge1xyXG4gICAgICB0aGlzLmNsb3NlU2VhcmNoRHJvcERvd24oKTtcclxuXHJcbiAgICAgIGNvbnN0IGFyZ3M6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQgPSB7XHJcbiAgICAgICAgaXRlbTogbWVudUl0ZW0sXHJcbiAgICAgICAgb3JpZ2luYWxFdmVudDogbnVsbCxcclxuICAgICAgICBjYW5jZWw6IGZhbHNlXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLm9uTWVudUl0ZW1DbGljaz8uKGFyZ3MpO1xyXG5cclxuICAgICAgaWYgKGFyZ3MuY2FuY2VsKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLm9uTWVudUl0ZW1PcGVuZWQgJiYgdGhpcy5vbk1lbnVJdGVtT3BlbmVkKHsgbWVudUl0ZW0gfSk7XHJcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbG9zZVNlYXJjaERyb3BEb3duKCkge1xyXG4gICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3Qub3B0aW9uKCdmb2N1c2VkUm93S2V5JywgdW5kZWZpbmVkKTtcclxuICAgIHRoaXMuc2VhcmNoRHJvcERvd24/Lm9wdGlvbigndmFsdWUnLCAnJyk7XHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5mb2N1cygpO1xyXG4gICAgdGhpcy5zZWFyY2hEcm9wRG93bj8uYmx1cigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja1NlYXJjaFJlc3V0UG9wdXBWaXNpYmlsaXR5KHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5vcGVuKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5jbG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREYXRhU291cmNlRm9yU2VhcmNoKGRzOiBJU2VhcmNoRGF0YVNvdXJjZSk6IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10gfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKCFkcykge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGdldFJlZHVjZXIgPSAoaXNHbG9iYWw6IGJvb2xlYW4pID0+IHtcclxuICAgICAgY29uc3QgcmVkdWNlciA9IChyZXM6IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10sIGl0ZW06IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCkgPT4ge1xyXG4gICAgICAgIGlmIChpdGVtLkl0ZW1zICYmIGl0ZW0uSXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBpdGVtLkl0ZW1zID0gaXRlbS5JdGVtcy5yZWR1Y2UocmVkdWNlciwgW10pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaXNWaXNpYmxlID0gaXRlbS5WaXNpYmxlID09PSB1bmRlZmluZWQgfHwgaXRlbS5WaXNpYmxlID09PSBudWxsIHx8IGl0ZW0uVmlzaWJsZSA9PT0gdHJ1ZTtcclxuICAgICAgICBjb25zdCBpc0Rpc2FibGVkID0gaXRlbS5EaXNhYmxlZCA9PT0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKGlzVmlzaWJsZSAmJiAhaXNEaXNhYmxlZCkge1xyXG4gICAgICAgICAgcmVzLnB1c2goeyAuLi5pdGVtLCBpc0dsb2JhbCB9IGFzIElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICByZXR1cm4gcmVkdWNlcjtcclxuICAgIH07XHJcblxyXG4gICAgaWYgKGRzLnBlcnNvbmFsSXRlbXMgJiYgZHMucGVyc29uYWxJdGVtcy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgZ2xvYmFsTWVudVJvb3QgPSB7XHJcbiAgICAgICAgTmFtZTogJ0dsb2JhbCBNZW51JywgSWQ6IC0xLCBpc0dsb2JhbDogdHJ1ZSwgVHlwZTogTWVudUl0ZW1UeXBlLk1lbnVOb2RlLFxyXG4gICAgICAgIEl0ZW1zOiBkcy5nbG9hYmFsSXRlbXMucmVkdWNlKGdldFJlZHVjZXIodHJ1ZSksIFtdKVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc3QgcGVyc29uYWxNZW51Um9vdCA9IHtcclxuICAgICAgICBOYW1lOiAnUGVyc29uYWwgTWVudScsIElkOiAtMiwgaXNHbG9iYWw6IGZhbHNlLCBUeXBlOiBNZW51SXRlbVR5cGUuTWVudU5vZGUsXHJcbiAgICAgICAgSXRlbXM6IGRzLnBlcnNvbmFsSXRlbXMucmVkdWNlKGdldFJlZHVjZXIoZmFsc2UpLCBbXSlcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmdldElzR2xvYmFsTWVudVNob3duKCkgPyBbZ2xvYmFsTWVudVJvb3QsIHBlcnNvbmFsTWVudVJvb3RdIDogW3BlcnNvbmFsTWVudVJvb3QsIGdsb2JhbE1lbnVSb290XTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBkcy5nbG9hYmFsSXRlbXMucmVkdWNlKGdldFJlZHVjZXIodHJ1ZSksIFtdKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCB7IERldkV4cHJlc3NFdmVudEFyZ3MgfSBmcm9tICcuL0RldkV4cHJlc3NFdmVudEFyZ3MnO1xyXG5leHBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuL0V2ZW50RW1pdHRlcic7XHJcbmV4cG9ydCB7IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgfSBmcm9tICcuL0dlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UnO1xyXG5leHBvcnQgeyBjcmVhdGVHcmlkRXhwb3J0RnVuY3Rpb24gfSBmcm9tICcuL0dyaWRFeHBvcnQnO1xyXG4iLCAiXHVGRUZGZXhwb3J0IGNsYXNzIEV2ZW50RW1pdHRlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudExpc3RlbmVyczogYW55W107XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5ldmVudExpc3RlbmVycyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uKGV2dCwgbGlzdGVuZXIpIHtcclxuICAgIGlmICghdGhpcy5ldmVudExpc3RlbmVyc1tldnRdKSB7XHJcbiAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnNbZXZ0XSA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnNbZXZ0XS5wdXNoKGxpc3RlbmVyKTtcclxuXHJcbiAgICByZXR1cm4gbGlzdGVuZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25jZShldnQsIGxpc3RlbmVyKSB7XHJcbiAgICB0aGlzLm9uKGV2dCwgKGUpID0+IHtcclxuICAgICAgbGlzdGVuZXIoZSk7XHJcbiAgICAgIHRoaXMub2ZmKGV2dCwgbGlzdGVuZXIpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdChldnQsIGUgPSBudWxsKSB7XHJcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2dF07XHJcblxyXG4gICAgaWYgKGxpc3RlbmVycykge1xyXG4gICAgICBmb3IgKGNvbnN0IGN1cnJlbnRMaXN0ZW5lciBvZiBsaXN0ZW5lcnMpIHtcclxuICAgICAgICBpZiAoY3VycmVudExpc3RlbmVyKSB7XHJcbiAgICAgICAgICBjdXJyZW50TGlzdGVuZXIuY2FsbCh0aGlzLCBlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvZmYoZXZ0LCBsaXN0ZW5lcikge1xyXG4gICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5ldmVudExpc3RlbmVyc1tldnRdO1xyXG5cclxuICAgIGlmIChsaXN0ZW5lcnMpIHtcclxuICAgICAgY29uc3QgZmlsdGVyZWQgPSBbXTtcclxuXHJcbiAgICAgIGZvciAoY29uc3QgY3VycmVudExpc3RlbmVyIG9mIGxpc3RlbmVycykge1xyXG4gICAgICAgIGlmIChjdXJyZW50TGlzdGVuZXIgIT09IGxpc3RlbmVyKSB7XHJcbiAgICAgICAgICBmaWx0ZXJlZC5wdXNoKGN1cnJlbnRMaXN0ZW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2dF0gPSBmaWx0ZXJlZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhZGRIYW5kbGVyKGV2ZW50OiBzdHJpbmcsIG9yaWdpbkhhbmRsZXIsIGdldEFyZ3VtZW50cykge1xyXG4gICAgY29uc3QgaW50ZXJuYWxIYW5kbGVyID0gKCkgPT4ge1xyXG4gICAgICBvcmlnaW5IYW5kbGVyKFxyXG4gICAgICAgIGdldEFyZ3VtZW50cygpLFxyXG4gICAgICAgICgpID0+IHRoaXMub2ZmKGV2ZW50LCBpbnRlcm5hbEhhbmRsZXIpXHJcbiAgICAgICk7XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMub24oZXZlbnQsIGludGVybmFsSGFuZGxlcik7XHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQgc2F2ZUFzIGZyb20gJ2ZpbGUtc2F2ZXInO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUdyaWRFeHBvcnRGdW5jdGlvbihyZXBvcnROYW1lOiBzdHJpbmcpOiAoZTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLkV4cG9ydGluZ0V2ZW50KSA9PiB2b2lkIHtcclxuICByZXR1cm4gKGU6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5FeHBvcnRpbmdFdmVudCkgPT4ge1xyXG4gICAgY29uc3Qgd29ya2Jvb2sgPSBuZXcgKHdpbmRvdyBhcyBhbnkpLkV4Y2VsSlMuV29ya2Jvb2soKTtcclxuICAgIGNvbnN0IHdvcmtzaGVldCA9IHdvcmtib29rLmFkZFdvcmtzaGVldChyZXBvcnROYW1lKTtcclxuXHJcbiAgICBEZXZFeHByZXNzLmV4Y2VsRXhwb3J0ZXIuZXhwb3J0RGF0YUdyaWQoe1xyXG4gICAgICB3b3Jrc2hlZXQsXHJcbiAgICAgIGNvbXBvbmVudDogZS5jb21wb25lbnQsXHJcbiAgICAgIGN1c3RvbWl6ZUNlbGw6IChvcHRpb25zKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZXhjZWxDZWxsID0gb3B0aW9ucy5leGNlbENlbGw7XHJcblxyXG4gICAgICAgIGV4Y2VsQ2VsbC5mb250ID0geyBuYW1lOiAnQXJpYWwnLCBzaXplOiAxMiB9O1xyXG4gICAgICAgIGV4Y2VsQ2VsbC5hbGlnbm1lbnQgPSB7IGhvcml6b250YWw6ICdsZWZ0JyB9O1xyXG4gICAgICB9XHJcbiAgICB9KS50aGVuKGZ1bmN0aW9uKCkge1xyXG4gICAgICB3b3JrYm9vay54bHN4LndyaXRlQnVmZmVyKCkudGhlbihmdW5jdGlvbihidWZmZXIpIHtcclxuICAgICAgICBzYXZlQXMobmV3IEJsb2IoW2J1ZmZlcl0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgfSksIGAke3JlcG9ydE5hbWV9Lnhsc3hgKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIGUuY2FuY2VsID0gdHJ1ZTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElMb2dvU2V0dGluZ3MgfSBmcm9tICcuLi9EYXRhJztcclxuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi9EYXRhL1JlcXVlc3QnO1xyXG5pbXBvcnQgeyB0aHJvd1JlbmRlckVycm9yLCBNdXRhYmxlIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzLCBnZXRVcmxCeU1lbnVJdGVtRGF0YSB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBVc2VyTWVudSwgVXNlck1lbnVJdGVtQ2xpY2tFdmVudCB9IGZyb20gJy4vVXNlck1lbnUnO1xyXG5pbXBvcnQgeyBOYXZpZ2F0aW9uTWVudSwgTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2tFdmVudCB9IGZyb20gJy4vTmF2aWdhdGlvbk1lbnUnO1xyXG5pbXBvcnQgeyBMb2dvIH0gZnJvbSAnLi9Mb2dvJztcclxuaW1wb3J0IHsgTWVudVN3aXRjaGVyIH0gZnJvbSAnLi9NZW51U3dpdGNoZXInO1xyXG5pbXBvcnQgeyBJVXNlck1lbnVJdGVtTW9kZWwgfSBmcm9tICcuL0lVc2VyTWVudUl0ZW0nO1xyXG5pbXBvcnQgeyBJTWVudVNldHRpbmdzIH0gZnJvbSAnLi9JTWVudVNldHRpbmdzJztcclxuaW1wb3J0IHsgSUFwcE1lbnVNb2RlbCB9IGZyb20gJy4vSUFwcE1lbnVNb2RlbCc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4vSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsJztcclxuaW1wb3J0IFNlYXJjaCwgeyBJT3BlblJlcG9ydEV2ZW50QXJncywgSVNlYXJjaERhdGFTb3VyY2UgfSBmcm9tICcuL1NlYXJjaCc7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL1V0aWxzL0luZGV4JztcclxuXHJcbmNvbnN0IEhFQURFUl9EQVRBX0NBQ0hFX0ZJRUxEID0gJ2lzem9sZWEtdWl8aGVhZGVyLWRhdGEtY2FjaGUnO1xyXG5jb25zdCBTSE9XX0dMT0JBTF9NRU5VX0tFWSA9ICdpc3pvbGVhLXVpfHNob3ctZ2xvYmFsLW1lbnUnO1xyXG5cclxuY29uc3QgZ2V0RGF0YVNvdXJjZUNhY2hlRmllbGQgPSAodXNlck5hbWU/OiBzdHJpbmcpID0+IHtcclxuICByZXR1cm4gYCR7SEVBREVSX0RBVEFfQ0FDSEVfRklFTER9JHt1c2VyTmFtZSA/IGB8JHt1c2VyTmFtZX1gIDogJyd9YDtcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIEhlYWRlclRoZW1lcyA9ICdpc3pvbGVhJztcclxuZXhwb3J0IGludGVyZmFjZSBJSGVhZGVyT3B0aW9ucyB7XHJcbiAgJGVsOiBKUXVlcnk7XHJcbiAgbWVudVNldHRpbmdzPzogSU1lbnVTZXR0aW5ncztcclxuICBsb2dvU2V0dGluZ3M/OiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nO1xyXG4gIGRpc3BsYXlTZWFyY2g/OiBib29sZWFuO1xyXG4gIGltbWVkaWF0ZVJlbmRlcj86IGJvb2xlYW47XHJcbiAgdGhlbWU/OiBIZWFkZXJUaGVtZXM7XHJcbiAgb25Jbml0PzogKCkgPT4gdm9pZDtcclxufVxyXG5cclxuaW50ZXJmYWNlIElIZWFkZXJFbGVtZW50cyB7XHJcbiAgcmVhZG9ubHkgcm9vdD86IEhUTUxFbGVtZW50O1xyXG4gIHJlYWRvbmx5IGxvZ29Db250YWluZXI/OiBIVE1MRWxlbWVudDtcclxuICByZWFkb25seSBjb250ZW50Q29udGFpbmVyPzogSFRNTEVsZW1lbnQ7XHJcbiAgcmVhZG9ubHkgdG9nZ2xlQnV0dG9uQ29udGFpbmVyPzogSFRNTEVsZW1lbnQ7XHJcbiAgcmVhZG9ubHkgdG9nZ2xlQnV0dG9uPzogSFRNTEVsZW1lbnQ7XHJcbiAgcmVhZG9ubHkgbWVudVN3aXRjaGVyRGVza3RvcENvbnRhaW5lcj86IEhUTUxFbGVtZW50O1xyXG4gIHJlYWRvbmx5IG1lbnVTd2l0Y2hlck1vYmlsZUNvbnRhaW5lcj86IEhUTUxFbGVtZW50O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUFqYXhQYWdlTWFya2VyIHtcclxuICBpc0xvYWRlZEJ5QWpheDogdHJ1ZTtcclxuICB1cmw6IHN0cmluZztcclxuICBpc01lbnVTd2l0Y2hlckdsb2JhbDogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEhlYWRlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBNRU5VX1NXSVRDSEVSX0lOSVRJQUxJWkVEX0VWRU5UID0gJ21lbnUtc3dpdGNoZXItaW5pdGlhbGl6ZWQtZXZlbnQnO1xyXG5cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBHTE9CQUxfVVJMX1JFR0VYID0gbmV3IFJlZ0V4cCgnXig/OlthLXpdKzopPy8vJywgJ2knKTtcclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBET0NUWVBFX01BUktFUl9SRUdFWCA9IG5ldyBSZWdFeHAoJyFET0NUWVBFIGh0bWw+JywgJ2knKTtcclxuXHJcbiAgcHVibGljIHVzZXJNZW51OiBVc2VyTWVudSB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgbmF2aWdhdGlvbk1lbnU6IE5hdmlnYXRpb25NZW51IHwgdW5kZWZpbmVkO1xyXG4gIHB1YmxpYyBtZW51U3dpdGNoZXI6IE1lbnVTd2l0Y2hlciB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgbG9nbzogTG9nbyB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgZGF0YTogSUFwcE1lbnVNb2RlbCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSB0aGVtZTogSGVhZGVyVGhlbWVzO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nb1NldHRpbmdzOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbWVudVNldHRpbmdzOiBJTWVudVNldHRpbmdzIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGxheVNlYXJjaDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbGxhcHNlQnJlYWtwb2ludDogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkUGFuZWw6IERldkV4cHJlc3MudWkuZHhMb2FkUGFuZWw7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkcGFydGlhbFZpZXdQbGFjZUhvbGRlcjogSlF1ZXJ5IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlVXJsQWZ0ZXJQYXJ0aWFsTG9hZGluZzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uUGFydGlhbFZpZXdMb2FkZWQ6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGJlZm9yZVBhcnRpYWxWaWV3TG9hZGluZzogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25OYXZpYWd0aW9uTWVudUl0ZW1DbGlja0hhbmRsZXIgPSB0aGlzLm9uTmF2aWFndGlvbk1lbnVJdGVtQ2xpY2suYmluZCh0aGlzKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uTmF2aWdhdGlvbk1lbnVJdGVtT3BlbmVkSGFuZGxlciA9IHRoaXMub25OYXZpZ2F0aW9uTWVudUl0ZW1PcGVuZWQuYmluZCh0aGlzKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uVXNlck1lbnVJdGVtQ2xpY2tIYW5kbGVyID0gdGhpcy5vblVzZXJNZW51SXRlbUNsaWNrLmJpbmQodGhpcyk7XHJcbiAgcHJpdmF0ZSBzZWFyY2g6IFNlYXJjaCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLy8gZWxlbWVudHNcclxuICBwcml2YXRlIHJlYWRvbmx5ICRlbDogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudHM6IE11dGFibGU8SUhlYWRlckVsZW1lbnRzPiA9IHt9O1xyXG4gIHByaXZhdGUgJGxvYWRCYXI6IEpRdWVyeSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUhlYWRlck9wdGlvbnMpIHtcclxuICAgIHN1cGVyKCk7XHJcblxyXG4gICAgdGhpcy4kZWwgPSBvcHRpb25zLiRlbDtcclxuICAgIHRoaXMubWVudVNldHRpbmdzID0gb3B0aW9ucy5tZW51U2V0dGluZ3M7XHJcbiAgICB0aGlzLmxvZ29TZXR0aW5ncyA9IG9wdGlvbnMubG9nb1NldHRpbmdzO1xyXG4gICAgdGhpcy50aGVtZSA9IG9wdGlvbnMudGhlbWUgfHwgJ2lzem9sZWEnO1xyXG4gICAgdGhpcy5kaXNwbGF5U2VhcmNoID0gb3B0aW9ucy5kaXNwbGF5U2VhcmNoO1xyXG4gICAgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQgPSBvcHRpb25zLm1lbnVTZXR0aW5ncz8uY29sbGFwc2VCcmVha3BvaW50IHx8IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzLm1kO1xyXG5cclxuICAgIHRoaXMuJHBhcnRpYWxWaWV3UGxhY2VIb2xkZXIgPSBvcHRpb25zLm1lbnVTZXR0aW5ncz8ucGFydGlhbFZpZXdQbGFjZUhvbGRlcjtcclxuICAgIHRoaXMudXBkYXRlVXJsQWZ0ZXJQYXJ0aWFsTG9hZGluZyA9IG9wdGlvbnMubWVudVNldHRpbmdzPy51cGRhdGVVcmxBZnRlclBhcnRpYWxMb2FkaW5nO1xyXG4gICAgdGhpcy5vblBhcnRpYWxWaWV3TG9hZGVkID0gb3B0aW9ucy5tZW51U2V0dGluZ3M/Lm9uUGFydGlhbFZpZXdMb2FkZWQ7XHJcbiAgICB0aGlzLmJlZm9yZVBhcnRpYWxWaWV3TG9hZGluZyA9IG9wdGlvbnMubWVudVNldHRpbmdzPy5iZWZvcmVQYXJ0aWFsVmlld0xvYWRpbmc7XHJcblxyXG4gICAgdGhpcy5sb2FkUGFuZWwgPSB0aGlzLmNyZWF0ZUxvYWRQYW5lbCgpO1xyXG5cclxuICAgIGlmIChvcHRpb25zLmltbWVkaWF0ZVJlbmRlciA9PT0gZmFsc2UpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUud2FybignVGhlIFxcJ2ltbWVkaWF0ZVJlbmRlciA9PT0gZmFsc2VcXCcgb3B0aW9uIGlzblxcJ3Qgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnQuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9OT1RFOiBUbyBvdmVycmlkZSBib290c3RyYXAgaGVhZGVyIHotaW5kZXggd2hpY2ggaXMgMTYwMFxyXG4gICAgRGV2RXhwcmVzcy51aS5keE92ZXJsYXkuYmFzZVpJbmRleCgxNzAwKTtcclxuXHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gICAgdGhpcy5pbml0KClcclxuICAgICAgLnRoZW4oKCkgPT4gb3B0aW9ucz8ub25Jbml0Py4oKSk7XHJcblxyXG4gICAgdGhpcy5zdWJzY3JpYmVPbkhpc3RvcnlQb3BTdGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHVwZGF0ZURhdGEoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNsZWFyQXBwTWVudU1vZGVsQ2FjaGUoKTtcclxuICAgIHRoaXMuZGF0YSA9IGF3YWl0IHRoaXMubG9hZERhdGEoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMucm9vdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZXJlbmRlck1lbnVzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgLyoqXHJcbiAgICAgKiA8Um9vdD5cclxuICAgICAqICA8QnJhbmQ+XHJcbiAgICAgKiAgICA8TG9nbyAvPlxyXG4gICAgICogIDwvQnJhbmQ+XHJcbiAgICAgKiAgPENvbnRlbnRUb2dnbGVyIC8+XHJcbiAgICAgKiAgPENvbnRlbnQ+XHJcbiAgICAgKiAgICA8U2VhcmNoIC8+XHJcbiAgICAgKiAgICA8TmF2aWdhdGlvbk1lbnUgLz5cclxuICAgICAqICAgIDxVc2VyTWVudSAvPlxyXG4gICAgICogIDwvQ29udGVudD5cclxuICAgICAqICA8TWVudVN3aXRjaGVyIC8+XHJcbiAgICAgKiA8L1Jvb3Q+XHJcbiAgICAgKiA8TG9hZEJhciAvPlxyXG4gICAgICovXHJcblxyXG4gICAgdGhpcy5yZW5kZXJSb290KCk7XHJcbiAgICB0aGlzLnJlbmRlckJyYW5kKCk7XHJcbiAgICB0aGlzLnJlbmRlckNvbnRlbnRUb2dnbGVyKCk7XHJcbiAgICB0aGlzLnJlbmRlckNvbnRlbnQoKTtcclxuICAgIHRoaXMucmVuZGVyTG9hZEJhcigpO1xyXG5cclxuICAgIHRoaXMudXBkYXRlQ29udGVudEFuZFRvZ2dsZXJWaXNpYmxlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN1YnNjcmliZU9uSGlzdG9yeVBvcFN0YXRlKCkge1xyXG4gICAgaWYgKHRoaXMuJHBhcnRpYWxWaWV3UGxhY2VIb2xkZXIpIHtcclxuICAgICAgJCh3aW5kb3cpLmJpbmQoJ3BvcHN0YXRlJywgKGUpID0+IHtcclxuICAgICAgICBjb25zdCBldmVudCA9IGUub3JpZ2luYWxFdmVudCBhcyBQb3BTdGF0ZUV2ZW50O1xyXG4gICAgICAgIGNvbnN0IHN0YXRlID0gZXZlbnQuc3RhdGUgYXMgSUFqYXhQYWdlTWFya2VyO1xyXG4gICAgICAgIGlmIChzdGF0ZSAmJiBzdGF0ZS5pc0xvYWRlZEJ5QWpheCkge1xyXG4gICAgICAgICAgdGhpcy5sb2FkUGFnZVZpYUFqYXhDb3JlKHN0YXRlLnVybCk7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZU1lbnVTd2l0Y2hlclN0YXRlKHN0YXRlLmlzTWVudVN3aXRjaGVyR2xvYmFsKTtcclxuICAgICAgICAgIHRoaXMubmF2aWdhdGlvbk1lbnUudXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVMb2FkUGFuZWwoKTogRGV2RXhwcmVzcy51aS5keExvYWRQYW5lbCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpLmR4TG9hZFBhbmVsKHtcclxuICAgICAgc2hhZGluZ0NvbG9yOiAncmdiYSgwLDAsMCwwLjQpJyxcclxuICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgIHNob3dJbmRpY2F0b3I6IHRydWUsXHJcbiAgICAgIHNob3dQYW5lOiB0cnVlLFxyXG4gICAgICBzaGFkaW5nOiB0cnVlLFxyXG4gICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiBmYWxzZSxcclxuICAgIH0pLmFwcGVuZFRvKHRoaXMuJGVsKS5keExvYWRQYW5lbCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyUm9vdCgpIHtcclxuICAgIHRoaXMuZWxlbWVudHMucm9vdCA9IHRoaXMuJGVsWzBdO1xyXG4gICAgdGhpcy5lbGVtZW50cy5yb290LmNsYXNzTGlzdC5hZGQoJ2hlYWRlcicsIHRoaXMudGhlbWUsICduYXZiYXInLCAnbmF2YmFyLWRhcmsnLCBgbmF2YmFyLWV4cGFuZC0ke3RoaXMuY29sbGFwc2VCcmVha3BvaW50Lm5hbWV9YCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckJyYW5kKCkge1xyXG4gICAgaWYgKHRoaXMubG9nbyB8fCAhdGhpcy5sb2dvU2V0dGluZ3MpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5yb290KSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYnJhbmRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgYnJhbmRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9fYnJhbmQnLCAnbmF2YmFyLWJyYW5kJyk7XHJcbiAgICBicmFuZEVsZW1lbnQuaHJlZiA9ICcvJztcclxuICAgIHRoaXMuZWxlbWVudHMucm9vdC5hcHBlbmRDaGlsZChicmFuZEVsZW1lbnQpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudHMubG9nb0NvbnRhaW5lciA9IGJyYW5kRWxlbWVudDtcclxuXHJcbiAgICB0aGlzLmxvZ28gPSBuZXcgTG9nbygkKHRoaXMuZWxlbWVudHMubG9nb0NvbnRhaW5lciksIHRoaXMubG9nb1NldHRpbmdzKTtcclxuICAgIHRoaXMubG9nby5pbml0V2lkZ2V0KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclNlYXJjaCgpIHtcclxuICAgIGlmICghdGhpcy5kaXNwbGF5U2VhcmNoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lcikge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcignY29udGVudENvbnRhaW5lcicpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VhcmNoID0gbmV3IFNlYXJjaCh7XHJcbiAgICAgICRjb250YWluZXI6ICQodGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyKSxcclxuICAgICAgZ2V0TWVudURhdGFTb3VyY2U6ICgpID0+IHRoaXMuZ2V0U2VhcmNoRGF0YVNvdXJjZSh0aGlzLmRhdGEpLFxyXG4gICAgICBnZXRJc0dsb2JhbE1lbnVTaG93bjogKCkgPT4gdGhpcy5nZXRJc0dsb2JhbE1lbnVTaG93bigpLFxyXG4gICAgICBvbkRpbWVuc2lvbnNDaGFuZ2VkOiAoKSA9PiB0aGlzLm5hdmlnYXRpb25NZW51Py5hcHBseUFkYXB0aXZpdHlDb2xsYXBzaW5nKCksXHJcbiAgICAgIG9uTWVudUl0ZW1DbGljazogdGhpcy5vbk5hdmlhZ3Rpb25NZW51SXRlbUNsaWNrSGFuZGxlcixcclxuICAgICAgb25NZW51SXRlbU9wZW5lZDogdGhpcy5vbk5hdmlnYXRpb25NZW51SXRlbU9wZW5lZEhhbmRsZXIsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuc2VhcmNoLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRJc0dsb2JhbE1lbnVTaG93bigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmlzU2hvd0dsb2JhbE1lbnUoKSB8fCAhdGhpcy5kYXRhPy5BZGRHbG9iYWxQZXJzb25hbFN3aXRjaGVyO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbk5hdmlnYXRpb25NZW51SXRlbU9wZW5lZChlOiBJT3BlblJlcG9ydEV2ZW50QXJncykge1xyXG4gICAgdGhpcy51cGRhdGVNZW51U3dpdGNoZXJTdGF0ZShlLm1lbnVJdGVtLmlzR2xvYmFsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlTWVudVN3aXRjaGVyU3RhdGUoaXNHbG9iYWw6IGJvb2xlYW4pIHtcclxuICAgIGlmICghdGhpcy5tZW51U3dpdGNoZXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm1lbnVTd2l0Y2hlci52YWx1ZSAhPT0gaXNHbG9iYWwpIHtcclxuICAgICAgdGhpcy5tZW51U3dpdGNoZXIuc2V0VmFsdWUoaXNHbG9iYWwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJDb250ZW50VG9nZ2xlcigpIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5yb290KSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcclxuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ25hdmJhci10b2dnbGVyJyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnYnV0dG9uJyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtdG9nZ2xlJywgJ2NvbGxhcHNlJyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGFyZ2V0JywgJy5oZWFkZXJfX2NvbnRlbnQnKTtcclxuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2VhcmNoPy5zZXRTZWFyY2hUZXh0KCcnKTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgaWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuICAgIGljb24uY2xhc3NMaXN0LmFkZCgnbmF2YmFyLXRvZ2dsZXItaWNvbicpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbkNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdoZWFkZXJfX3RvZ2dsZS1idXR0b24tY29udGFpbmVyJyk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uYXBwZW5kQ2hpbGQoaWNvbik7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbkNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbik7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b25Db250YWluZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJDb250ZW50KCkge1xyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLnJvb3QpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ3Jvb3QnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdjb2xsYXBzZScsICduYXZiYXItY29sbGFwc2UnLCAnaGVhZGVyX19jb250ZW50Jyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyKTtcclxuXHJcbiAgICB0aGlzLnJlbmRlclNlYXJjaCgpO1xyXG4gICAgdGhpcy5yZW5kZXJOYXZpZ2F0aW9uTWVudShbXSk7XHJcbiAgICB0aGlzLnJlbmRlck1lbnVTd2l0Y2hlcigpO1xyXG4gICAgdGhpcy5yZW5kZXJVc2VyTWVudShbXSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlck5hdmlnYXRpb25NZW51KG1lbnVJdGVtTW9kZWxzOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXSkge1xyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ2NvbnRlbnRDb250YWluZXInKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpc0dsb2JhbE1lbnUgPSB0aGlzLmdldElzR2xvYmFsTWVudVNob3duKCk7XHJcblxyXG4gICAgaWYgKHRoaXMubmF2aWdhdGlvbk1lbnUpIHtcclxuICAgICAgdGhpcy5uYXZpZ2F0aW9uTWVudS51cGRhdGVEYXRhKG1lbnVJdGVtTW9kZWxzLCBpc0dsb2JhbE1lbnUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5uYXZpZ2F0aW9uTWVudSA9IG5ldyBOYXZpZ2F0aW9uTWVudShcclxuICAgICAgICB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIsXHJcbiAgICAgICAgbWVudUl0ZW1Nb2RlbHMsXHJcbiAgICAgICAgaXNHbG9iYWxNZW51LFxyXG4gICAgICAgIHRoaXMuY29sbGFwc2VCcmVha3BvaW50LFxyXG4gICAgICAgIHRoaXMub25OYXZpYWd0aW9uTWVudUl0ZW1DbGlja0hhbmRsZXIsXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMubmF2aWdhdGlvbk1lbnUucmVuZGVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uVXNlck1lbnVJdGVtQ2xpY2soZTogVXNlck1lbnVJdGVtQ2xpY2tFdmVudCkge1xyXG4gICAgdGhpcy5tZW51U2V0dGluZ3Mub25Vc2VyTWVudUNsaWNrPy4oZSk7XHJcbiAgICBpZiAoZS5jYW5jZWwgfHwgdGhpcy5pc0tleVByZXNzZWQoZS5vcmlnaW5hbEV2ZW50IGFzIE1vdXNlRXZlbnQpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB1cmwgPSBlLml0ZW0uVXJsO1xyXG5cclxuICAgIGlmIChlLml0ZW0uQWx3YXlzUmVsb2FkUGFnZSkge1xyXG4gICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGUuY2FuY2VsID0gdGhpcy50cnlEb1BhcnRpYWxQYWdlTG9hZGluZyh1cmwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbk5hdmlhZ3Rpb25NZW51SXRlbUNsaWNrKGU6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQpIHtcclxuICAgIHRoaXMubWVudVNldHRpbmdzLm9uTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2s/LihlKTtcclxuICAgIGlmIChlLmNhbmNlbCB8fCB0aGlzLmlzS2V5UHJlc3NlZChlLm9yaWdpbmFsRXZlbnQgYXMgTW91c2VFdmVudCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlTWVudVN3aXRjaGVyU3RhdGUoZS5pdGVtLmlzR2xvYmFsKTtcclxuXHJcbiAgICBjb25zdCB1cmwgPSBnZXRVcmxCeU1lbnVJdGVtRGF0YShlLml0ZW0pO1xyXG4gICAgZS5jYW5jZWwgPSB0aGlzLnRyeURvUGFydGlhbFBhZ2VMb2FkaW5nKHVybCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzS2V5UHJlc3NlZChldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgcmV0dXJuIGV2ZW50ICYmIChldmVudC5hbHRLZXkgfHwgZXZlbnQuY3RybEtleSB8fCBldmVudC5zaGlmdEtleSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRyeURvUGFydGlhbFBhZ2VMb2FkaW5nKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy4kcGFydGlhbFZpZXdQbGFjZUhvbGRlciAmJiB1cmwgJiYgdGhpcy5jaGVja0lzTG9jYWxVcmwodXJsKSkge1xyXG4gICAgICBpZiAodGhpcy51cGRhdGVVcmxBZnRlclBhcnRpYWxMb2FkaW5nKSB7XHJcbiAgICAgICAgY29uc3Qgc3RhdGU6IElBamF4UGFnZU1hcmtlciA9IHtcclxuICAgICAgICAgIGlzTG9hZGVkQnlBamF4OiB0cnVlLFxyXG4gICAgICAgICAgaXNNZW51U3dpdGNoZXJHbG9iYWw6ICEhdGhpcy5tZW51U3dpdGNoZXI/LnZhbHVlLFxyXG4gICAgICAgICAgdXJsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKHN0YXRlLCBudWxsLCB1cmwpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmxvYWRQYWdlVmlhQWpheENvcmUodXJsKTtcclxuICAgICAgdGhpcy5uYXZpZ2F0aW9uTWVudS51cGRhdGVBY3RpdmVJdGVtc1N0YXRlKCk7XHJcblxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrSXNMb2NhbFVybCh1cmw6IHN0cmluZykge1xyXG4gICAgcmV0dXJuICFIZWFkZXIuR0xPQkFMX1VSTF9SRUdFWC50ZXN0KHVybCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrSXNQYXJ0aWFsUGFnZUNvbnRlbnQoY29udGVudDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gY29udGVudCAmJiAhSGVhZGVyLkRPQ1RZUEVfTUFSS0VSX1JFR0VYLnRlc3QoY29udGVudCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRQYWdlVmlhQWpheENvcmUodXJsOiBzdHJpbmcpIHtcclxuICAgIHdpbmRvdy5pc0lzb3pTZXJ2ZXJFeGNlcHRpb24gPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLmxvYWRQYW5lbC5zaG93KCk7XHJcblxyXG4gICAgY29uc3QgdXJsRm9yUGFydGlhbExvYWRpbmcgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyB1cmwpO1xyXG4gICAgdXJsRm9yUGFydGlhbExvYWRpbmcuc2VhcmNoUGFyYW1zLmFwcGVuZCgnaXNvelBhcnRpYWxMb2FkaW5nJywgJ3RydWUnKTtcclxuICAgIGNvbnN0IHBhcnRpYWxVcmwgPSB1cmxGb3JQYXJ0aWFsTG9hZGluZy50b1N0cmluZygpO1xyXG5cclxuICAgIHRoaXMuYmVmb3JlUGFydGlhbFZpZXdMb2FkaW5nPy4oKTtcclxuXHJcbiAgICAkLmFqYXgocGFydGlhbFVybCwgeyBkYXRhVHlwZTogJ2h0bWwnIH0pLmFsd2F5cygoZGF0YSwgdGV4dFN0YXR1cykgPT4ge1xyXG4gICAgICBpZiAodGV4dFN0YXR1cyAhPT0gJ3N1Y2Nlc3MnIHx8ICF0aGlzLmNoZWNrSXNQYXJ0aWFsUGFnZUNvbnRlbnQoZGF0YSkpIHtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLiRwYXJ0aWFsVmlld1BsYWNlSG9sZGVyLmh0bWwoZGF0YSk7XHJcbiAgICAgICAgdGhpcy5vblBhcnRpYWxWaWV3TG9hZGVkPy4oKTtcclxuICAgICAgICB0aGlzLmxvYWRQYW5lbC5oaWRlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJVc2VyTWVudShpdGVtczogSVVzZXJNZW51SXRlbU1vZGVsW10pIHtcclxuICAgIGlmICghdGhpcy5tZW51U2V0dGluZ3M/LnVzZXJOYW1lKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lcikge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcignY29udGVudENvbnRhaW5lcicpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy51c2VyTWVudSkge1xyXG4gICAgICBjb25zdCBkaXZpZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgIGRpdmlkZXIuY2xhc3NMaXN0LmFkZCgnZHJvcGRvd24tZGl2aWRlcicpO1xyXG4gICAgICB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIuYXBwZW5kQ2hpbGQoZGl2aWRlcik7XHJcblxyXG4gICAgICB0aGlzLnVzZXJNZW51ID0gbmV3IFVzZXJNZW51KHtcclxuICAgICAgICBjb250YWluZXI6IHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lcixcclxuICAgICAgICB1c2VyTmFtZTogdGhpcy5tZW51U2V0dGluZ3MudXNlck5hbWUsXHJcbiAgICAgICAgdXNlckF2YXRhcjogdGhpcy5tZW51U2V0dGluZ3MudXNlckF2YXRhcixcclxuICAgICAgICBpdGVtcyxcclxuICAgICAgICBjb2xsYXBzZUJyZWFrcG9pbnQ6IHRoaXMuY29sbGFwc2VCcmVha3BvaW50LFxyXG4gICAgICAgIG9uSXRlbUNsaWNrOiB0aGlzLm9uVXNlck1lbnVJdGVtQ2xpY2tIYW5kbGVyLFxyXG4gICAgICAgIGdldERpc3BsYXllZFVzZXJJbmZvOiB0aGlzLm1lbnVTZXR0aW5ncy5nZXREaXNwbGF5ZWRVc2VySW5mb1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy51c2VyTWVudS5yZW5kZXIoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudXNlck1lbnUudXBkYXRlSXRlbXMoaXRlbXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJNZW51U3dpdGNoZXIoKSB7XHJcbiAgICBpZiAoIXRoaXMuZGF0YT8uQWRkR2xvYmFsUGVyc29uYWxTd2l0Y2hlcikge1xyXG4gICAgICBpZiAodGhpcy5tZW51U3dpdGNoZXIpIHtcclxuICAgICAgICB0aGlzLm1lbnVTd2l0Y2hlci5kZXN0cm95KCk7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJEZXNrdG9wQ29udGFpbmVyPy5yZW1vdmUoKTtcclxuICAgICAgICB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlck1vYmlsZUNvbnRhaW5lcj8ucmVtb3ZlKCk7XHJcblxyXG4gICAgICAgIHRoaXMubWVudVN3aXRjaGVyID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyRGVza3RvcENvbnRhaW5lciA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlck1vYmlsZUNvbnRhaW5lciA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLm1lbnVTd2l0Y2hlcikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ2NvbnRlbnRDb250YWluZXInKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b25Db250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ3RvZ2dsZUJ1dHRvbkNvbnRhaW5lcicpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyRGVza3RvcENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJEZXNrdG9wQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21lbnUtc3dpdGNoZXInKTtcclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlck1vYmlsZUNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWVudS1zd2l0Y2hlcicpO1xyXG5cclxuICAgIHRoaXMubWVudVN3aXRjaGVyID0gbmV3IE1lbnVTd2l0Y2hlcih7XHJcbiAgICAgIGRlc2t0b3BDb250YWluZXI6IHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyRGVza3RvcENvbnRhaW5lcixcclxuICAgICAgbW9iaWxlQ29udGFpbmVyOiB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlck1vYmlsZUNvbnRhaW5lcixcclxuICAgICAgY29sbGFwc2VCcmVha3BvaW50OiB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludCxcclxuICAgICAgc3RhcnRWYWx1ZTogdGhpcy5pc1Nob3dHbG9iYWxNZW51KCksXHJcbiAgICAgIG9uU3dpdGNoOiAodmFsdWUpID0+IHtcclxuICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oU0hPV19HTE9CQUxfTUVOVV9LRVksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IG5hdmlnYXRpb25JdGVtcyA9IHRoaXMuZ2V0TmF2aWdhdGlvbkl0ZW1zKHRoaXMuZGF0YSk7XHJcbiAgICAgICAgdGhpcy5zZWFyY2g/LnNldFNlYXJjaFRleHQoJycpO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoPy5yZWxvYWRNZW51SXRlbXMoKTtcclxuICAgICAgICB0aGlzLnJlbmRlck5hdmlnYXRpb25NZW51KG5hdmlnYXRpb25JdGVtcyB8fCBbXSk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVDb250ZW50QW5kVG9nZ2xlclZpc2libGUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLm1lbnVTd2l0Y2hlci5yZW5kZXIoKTtcclxuICAgIHRoaXMuZW1pdChIZWFkZXIuTUVOVV9TV0lUQ0hFUl9JTklUSUFMSVpFRF9FVkVOVCk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXIsIHRoaXMudXNlck1lbnU/LnJvb3QpO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b25Db250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyTW9iaWxlQ29udGFpbmVyLCB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckxvYWRCYXIoKSB7XHJcbiAgICB0aGlzLiRsb2FkQmFyID0gJCgnPGRpdiAvPicpLmFkZENsYXNzKCdsb2FkLWJhcicpLmhpZGUoKS5hcHBlbmRUbyh0aGlzLiRlbCk7XHJcblxyXG4gICAgY29uc3QgJGxvYWQgPSAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2xvYWQnKS5hcHBlbmRUbyh0aGlzLiRsb2FkQmFyKTtcclxuICAgICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnYmFyJykuYXBwZW5kVG8oJGxvYWQpO1xyXG5cclxuICAgIGZ1bmN0aW9uIHJvdGF0ZShzZWxlY3Rvcjogc3RyaW5nKSB7XHJcbiAgICAgICQoc2VsZWN0b3IpLmFuaW1hdGUoeyBsZWZ0OiAkKCcubG9hZCcpLndpZHRoKCkgfSwgMjAwMCwgKCkgPT4ge1xyXG4gICAgICAgICQoc2VsZWN0b3IpLmNzcygnbGVmdCcsIGAkey0kKHNlbGVjdG9yKS53aWR0aCgpIX1weGApO1xyXG4gICAgICAgIHJvdGF0ZShzZWxlY3Rvcik7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJvdGF0ZSgnLmJhcicpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXJlbmRlck1lbnVzKCkge1xyXG4gICAgY29uc3QgbmF2aWdhdGlvbkl0ZW1zID0gdGhpcy5nZXROYXZpZ2F0aW9uSXRlbXModGhpcy5kYXRhKTtcclxuICAgIGNvbnN0IHVzZXJJdGVtcyA9IHRoaXMuZ2V0VXNlckl0ZW1zKHRoaXMuZGF0YSk7XHJcbiAgICAvLyBJZiBpdGVtcyBhcmUgdW5kZWZpbmVkIHdlIGRvbid0IHVwZGF0ZSBtZW51c1xyXG4gICAgbmF2aWdhdGlvbkl0ZW1zICYmIHRoaXMucmVuZGVyTmF2aWdhdGlvbk1lbnUobmF2aWdhdGlvbkl0ZW1zKTtcclxuICAgIHVzZXJJdGVtcyAmJiB0aGlzLnJlbmRlclVzZXJNZW51KHVzZXJJdGVtcyk7XHJcbiAgICB0aGlzLnJlbmRlck1lbnVTd2l0Y2hlcigpO1xyXG4gICAgdGhpcy51cGRhdGVDb250ZW50QW5kVG9nZ2xlclZpc2libGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlQ29udGVudEFuZFRvZ2dsZXJWaXNpYmxlKCkge1xyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIgJiYgIXRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBuYXZpZ2F0aW9uSXRlbXMgPSB0aGlzLmdldE5hdmlnYXRpb25JdGVtcyh0aGlzLmRhdGEpO1xyXG4gICAgY29uc3QgdXNlckl0ZW1zID0gdGhpcy5nZXRVc2VySXRlbXModGhpcy5kYXRhKTtcclxuICAgIGNvbnN0IGlzVmlzaWJsZSA9IChuYXZpZ2F0aW9uSXRlbXMgJiYgbmF2aWdhdGlvbkl0ZW1zLmxlbmd0aCA+IDApXHJcbiAgICAgIHx8IHRoaXMubWVudVNldHRpbmdzPy51c2VyTmFtZVxyXG4gICAgICB8fCAodXNlckl0ZW1zICYmIHVzZXJJdGVtcy5sZW5ndGggPiAwKTtcclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnLCAhaXNWaXNpYmxlKTtcclxuICAgIHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnLCAhaXNWaXNpYmxlKTtcclxuXHJcbiAgICB0aGlzLnNlYXJjaD8uc2V0VmlzaWJsZSghIWlzVmlzaWJsZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRhdGEgPSBhd2FpdCB0aGlzLmxvYWREYXRhKCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLnJvb3QpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVyZW5kZXJNZW51cygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBsb2FkRGF0YSgpOiBQcm9taXNlPElBcHBNZW51TW9kZWwgfCB1bmRlZmluZWQ+IHtcclxuICAgIGlmICghdGhpcy5tZW51U2V0dGluZ3MpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgaGVhZGVyIGRvZXNuXFwndCBoYXZlIG1lbnUgc2V0dGluZ3MnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIHRoaXMubWVudVNldHRpbmdzLmRhdGEgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLm1lbnVTZXR0aW5ncy5kYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBkYXRhID0gdGhpcy5nZXRDYWNoZWRBcHBNZW51TW9kZWwoKTtcclxuICAgIGlmIChkYXRhKSB7XHJcbiAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoPy5zZXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgdGhpcy4kbG9hZEJhcj8uc2hvdygpO1xyXG4gICAgICBkYXRhID0gYXdhaXQgc2VuZFJlcXVlc3Q8SUFwcE1lbnVNb2RlbD4odGhpcy5tZW51U2V0dGluZ3MuZGF0YSk7XHJcbiAgICAgIHRoaXMuY2FjaGVBcHBNZW51TW9kZWwoZGF0YSk7XHJcbiAgICAgIHRoaXMuc2VhcmNoPy5yZWxvYWRNZW51SXRlbXMoKTtcclxuXHJcbiAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5zZWFyY2g/LnNldFZpc2libGUodHJ1ZSk7XHJcbiAgICAgIHRoaXMuJGxvYWRCYXI/LmhpZGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0TmF2aWdhdGlvbkl0ZW1zKGFwcE1lbnVNb2RlbDogSUFwcE1lbnVNb2RlbCB8IHVuZGVmaW5lZCkge1xyXG4gICAgaWYgKCFhcHBNZW51TW9kZWwpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzaG93R2xvYmFsTWVudSA9IHRoaXMuaXNTaG93R2xvYmFsTWVudSgpO1xyXG5cclxuICAgIHJldHVybiBzaG93R2xvYmFsTWVudSB8fCAhYXBwTWVudU1vZGVsLkFkZEdsb2JhbFBlcnNvbmFsU3dpdGNoZXJcclxuICAgICAgPyBhcHBNZW51TW9kZWwuTmF2aWdhdGlvbkl0ZW1zXHJcbiAgICAgIDogYXBwTWVudU1vZGVsLlBlcnNvbmFsTmF2aWdhdGlvbkl0ZW1zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTZWFyY2hEYXRhU291cmNlKGFwcE1lbnVNb2RlbDogSUFwcE1lbnVNb2RlbCB8IHVuZGVmaW5lZCk6IElTZWFyY2hEYXRhU291cmNlIHtcclxuICAgIGlmICghYXBwTWVudU1vZGVsKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZ2xvYWJhbEl0ZW1zOiBhcHBNZW51TW9kZWwuTmF2aWdhdGlvbkl0ZW1zLFxyXG4gICAgICBwZXJzb25hbEl0ZW1zOiBhcHBNZW51TW9kZWwuQWRkR2xvYmFsUGVyc29uYWxTd2l0Y2hlciA/IGFwcE1lbnVNb2RlbC5QZXJzb25hbE5hdmlnYXRpb25JdGVtcyA6IHVuZGVmaW5lZFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0VXNlckl0ZW1zKGFwcE1lbnVNb2RlbDogSUFwcE1lbnVNb2RlbCB8IHVuZGVmaW5lZCkge1xyXG4gICAgaWYgKCFhcHBNZW51TW9kZWwpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYXBwTWVudU1vZGVsLlVzZXJJdGVtcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q2FjaGVkQXBwTWVudU1vZGVsKCk6IElBcHBNZW51TW9kZWwgfCBudWxsIHtcclxuICAgIGlmICghdGhpcy5tZW51U2V0dGluZ3MpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmF3VmFsdWUgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShnZXREYXRhU291cmNlQ2FjaGVGaWVsZCh0aGlzLm1lbnVTZXR0aW5ncy51c2VyTmFtZSkpO1xyXG5cclxuICAgIHJldHVybiByYXdWYWx1ZSA9PT0gbnVsbCA/IHJhd1ZhbHVlIDogSlNPTi5wYXJzZShyYXdWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhY2hlQXBwTWVudU1vZGVsKGRhdGE6IElBcHBNZW51TW9kZWwpIHtcclxuICAgIGlmICghdGhpcy5tZW51U2V0dGluZ3MpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGdldERhdGFTb3VyY2VDYWNoZUZpZWxkKHRoaXMubWVudVNldHRpbmdzLnVzZXJOYW1lKSwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGVhckFwcE1lbnVNb2RlbENhY2hlKCkge1xyXG4gICAgaWYgKCF0aGlzLm1lbnVTZXR0aW5ncykge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oZ2V0RGF0YVNvdXJjZUNhY2hlRmllbGQodGhpcy5tZW51U2V0dGluZ3MudXNlck5hbWUpKTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNTaG93R2xvYmFsTWVudSgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHJhd0lzR2xvYmFsID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFNIT1dfR0xPQkFMX01FTlVfS0VZKTtcclxuICAgIGNvbnN0IGlzR2xvYmFsID0gcmF3SXNHbG9iYWwgPT09IG51bGwgPyByYXdJc0dsb2JhbCBhcyBudWxsIDogSlNPTi5wYXJzZShyYXdJc0dsb2JhbCkgYXMgYm9vbGVhbjtcclxuXHJcbiAgICByZXR1cm4gaXNHbG9iYWwgPT09IG51bGwgfHwgaXNHbG9iYWw7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZjb25zdCBncmlkQ29sdW1uVHlwZXMgPSBbJ2RlZmF1bHQnLCAnc3RyaW5nJywgJ251bWJlcicsICdkYXRlJywgJ2Jvb2xlYW4nLCAnb2JqZWN0JywgJ2RhdGV0aW1lJ107XHJcblxyXG5leHBvcnQgZGVmYXVsdCBncmlkQ29sdW1uVHlwZXM7XHJcbiIsICJcdUZFRkZleHBvcnQgZW51bSBDZG1JbXBvcnRGaWxlTW9kZSB7XHJcbiAgTm9uZSA9IDAsXHJcbiAgQWRkTmV3Um93cyA9IDEsXHJcbiAgUmVwbGFjZUFsbFJvd3MgPSAyLFxyXG59XHJcbiIsICJcdUZFRkZcclxuZXhwb3J0IGVudW0gR3JpZERhdGFDb2x1bW5EYXRhVHlwZSB7XHJcbiAgRGVmYXVsdCA9ICdkZWZhdWx0JyxcclxuICBTdHJpbmcgPSAnc3RyaW5nJyxcclxuICBOdW1iZXIgPSAnbnVtYmVyJyxcclxuICBEYXRlID0gJ2RhdGUnLFxyXG4gIEJvb2xlYW4gPSAnYm9vbGVhbicsXHJcbiAgT2JqZWN0ID0gJ29iamVjdCcsXHJcbiAgRGF0ZXRpbWUgPSAnZGF0ZXRpbWUnXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRDb2x1bW5TdGF0ZSB7XHJcbiAgZGF0YUZpZWxkOiBzdHJpbmc7XHJcbiAgZGF0YVR5cGU6IEdyaWREYXRhQ29sdW1uRGF0YVR5cGU7XHJcbiAgd2lkdGg/OiBzdHJpbmcgfCBudW1iZXI7XHJcbiAgZ3JvdXBJbmRleD86IG51bWJlcjtcclxuICBzb3J0SW5kZXg/OiBudW1iZXI7XHJcbiAgc29ydE9yZGVyPzogbnVtYmVyO1xyXG4gIHZpc2libGU/OiBib29sZWFuO1xyXG4gIHZpc2libGVJbmRleD86IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZSB7XHJcbiAgY2FwdGlvbj86IHN0cmluZztcclxuICB0b29sdGlwPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRXh0ZW5kZWRDb2x1bW5TdGF0ZSBleHRlbmRzIElHcmlkQ29sdW1uU3RhdGUsIElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlIHtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZFN0YXRlIHtcclxuICBjb2x1bW5zOiBJR3JpZEV4dGVuZGVkQ29sdW1uU3RhdGVbXTtcclxufVxyXG4iLCAiY29uc3QgbG9hZGVkVXJsczogc3RyaW5nW10gPSBbXVxyXG5cclxuZnVuY3Rpb24gcmFuZG9tSW50ZWdlcihtaW46IG51bWJlciwgbWF4OiBudW1iZXIpIHtcclxuICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKSArIG1pbjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNob3cgKCRjb250YWluZXI6IEpRdWVyeSwgaW1hZ2VVcmxzOiBzdHJpbmdbXSwgaW1nQ2hhbmdlSW50ZXJ2YWxTZWM6IG51bWJlciA9IDUsIHRyYW5zaXRpb25UaW1lU2VjOiBudW1iZXIgPSAyKSB7XHJcbiAgLy8gU2h1ZmZsZSB1cmxzXHJcbiAgY29uc3Qgc2h1ZmZsZWRVcmxzID0gaW1hZ2VVcmxzLnNvcnQoKGEsIGIpID0+IDAuNSAtIE1hdGgucmFuZG9tKCkpO1xyXG5cclxuICAkY29udGFpbmVyLmFkZENsYXNzKCdpc3pvbGVhLWJhY2tncm91bmQtaW1hZ2Utdmlld2VyJykuY3NzKHtcclxuICAgICd0cmFuc2l0aW9uJzogYGJhY2tncm91bmQtaW1hZ2UgJHt0cmFuc2l0aW9uVGltZVNlY31zIGVhc2UtaW4tb3V0IDBzYCxcclxuICB9KTtcclxuXHJcbiAgc2h1ZmZsZWRVcmxzLmZvckVhY2goKHVybCwgaW5kZXgpID0+IHtcclxuICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xyXG5cclxuICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xyXG4gICAgICBsb2FkZWRVcmxzLnB1c2godXJsKTtcclxuXHJcbiAgICAgIGlmKGxvYWRlZFVybHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgaW5pdEltYWdlc0NoYW5naW5nKCRjb250YWluZXIsIGltZ0NoYW5nZUludGVydmFsU2VjKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpbWcuc3JjID0gdXJsO1xyXG4gICAgfSwgaW5kZXggKiAxMDApO1xyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXROZXh0SW5kZXhUb1Nob3cgKGN1cnJlbnRJbmRleDogbnVtYmVyKSB7XHJcbiAgaWYobG9hZGVkVXJscy5sZW5ndGggPT09IDEpIHtcclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuXHJcbiAgaWYobG9hZGVkVXJscy5sZW5ndGggPT09IDIpIHtcclxuICAgIHJldHVybiBjdXJyZW50SW5kZXggPT09IDAgPyAxIDogMDtcclxuICB9XHJcblxyXG4gIGNvbnN0IG5leHRJbmRleCA9IHJhbmRvbUludGVnZXIoMCwgbG9hZGVkVXJscy5sZW5ndGggLSAxKTtcclxuXHJcbiAgaWYobmV4dEluZGV4ID09PSBjdXJyZW50SW5kZXgpIHtcclxuICAgIHJldHVybiBuZXh0SW5kZXggPT09IGxvYWRlZFVybHMubGVuZ3RoIC0gMSA/IDAgOiBuZXh0SW5kZXggKyAxO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG5leHRJbmRleDtcclxufVxyXG5cclxuZnVuY3Rpb24gaW5pdEltYWdlc0NoYW5naW5nICgkY29udGFpbmVyOiBKUXVlcnksIGltZ0NoYW5nZUludGVydmFsU2VjOiBudW1iZXIpIHtcclxuICBsZXQgY3VycmVudFNob3duSW5kZXggPSAwO1xyXG5cclxuICBzaG93SW1hZ2UoJGNvbnRhaW5lciwgY3VycmVudFNob3duSW5kZXgpO1xyXG5cclxuICB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgaWYobG9hZGVkVXJscy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGN1cnJlbnRTaG93bkluZGV4ID0gZ2V0TmV4dEluZGV4VG9TaG93KGN1cnJlbnRTaG93bkluZGV4KTtcclxuICAgIHNob3dJbWFnZSgkY29udGFpbmVyLCBjdXJyZW50U2hvd25JbmRleCk7XHJcbiAgfSwgaW1nQ2hhbmdlSW50ZXJ2YWxTZWMgKiAxMDAwKTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd0ltYWdlICgkY29udGFpbmVyOiBKUXVlcnksIGluZGV4OiBudW1iZXIpIHtcclxuICAkY29udGFpbmVyLmNzcygnYmFja2dyb3VuZC1pbWFnZScsIGB1cmwoXCIke2xvYWRlZFVybHNbaW5kZXhdfVwiKWApO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTGljZW5jZSB9IGZyb20gJy4uL0J1c2luZXNzJztcclxuXHJcbmV4cG9ydCBlbnVtIEZvb3RlckluZGljYXRvclN0YXR1cyB7XHJcbiAgU3VjY2VzcyxcclxuICBXYXJuaW5nLFxyXG4gIEVycm9yXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZvb3RlckluZGljYXRvclZhbHVlIHtcclxuICBzdGF0dXM6IEZvb3RlckluZGljYXRvclN0YXR1cztcclxuICB0aXRsZT86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRm9vdGVySW5kaWNhdG9yT3B0aW9ucyB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIHRleHQ6IHN0cmluZztcclxuICB2YWx1ZTogSUZvb3RlckluZGljYXRvclZhbHVlO1xyXG4gIGdldFZhbHVlPzogKCkgPT4gUHJvbWlzZTxJRm9vdGVySW5kaWNhdG9yVmFsdWU+O1xyXG4gIGdldFZhbHVlSW50ZXJ2YWxNcz86IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRm9vdGVyT3B0aW9ucyB7XHJcbiAgJHJvb3Q6IEpRdWVyeTtcclxuICBuYW1lOiBzdHJpbmcgfCBmYWxzZTtcclxuICBsaWNlbmNlOiBJTGljZW5jZSB8IGZhbHNlO1xyXG4gIHllYXI/OiBudW1iZXIgfCAnbG9jYWwnIHwgZmFsc2U7XHJcbiAgdmVyc2lvbj86IHN0cmluZztcclxuICBzZXJ2ZXJOYW1lPzogc3RyaW5nO1xyXG4gIGRhdGFiYXNlPzogc3RyaW5nO1xyXG4gIGluZGljYXRvcnM/OiBJRm9vdGVySW5kaWNhdG9yT3B0aW9uc1tdO1xyXG59XHJcblxyXG5jb25zdCBkZWZhdWx0T3B0aW9uczogUGFydGlhbDxJRm9vdGVyT3B0aW9ucz4gPSB7XHJcbiAgeWVhcjogJ2xvY2FsJ1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRm9vdGVyIHtcclxuICBwcml2YXRlIHN0YXRpYyBnZXRDdXJyZW50WWVhcihjdXJyZW50WWVhcjogbnVtYmVyIHwgJ2xvY2FsJyB8IGZhbHNlKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBjdXJyZW50WWVhciA9PT0gJ2xvY2FsJyB8fCBjdXJyZW50WWVhciA9PT0gZmFsc2VcclxuICAgICAgPyBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKClcclxuICAgICAgOiBjdXJyZW50WWVhcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgJHJvb3Q6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbm5lY3RlZFRvOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93TmFtZTogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxpY2VuY2U6IElMaWNlbmNlIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd0xpY2VuY2U6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSB5ZWFyOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93WWVhcjogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IHNob3dDb25uZWN0ZWRUbzogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGluZGljYXRvcnNPcHRpb25zOiBJRm9vdGVySW5kaWNhdG9yT3B0aW9uc1tdO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5kaWNhdG9yc0J5TmFtZTogTWFwPHN0cmluZywgSlF1ZXJ5PjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGluZGljYXRvckNsYXNzQnlTdGF0dXMgPSBuZXcgTWFwPEZvb3RlckluZGljYXRvclN0YXR1cywgc3RyaW5nPihbXHJcbiAgICBbRm9vdGVySW5kaWNhdG9yU3RhdHVzLlN1Y2Nlc3MsICdmb290ZXJfX2luZGljYXRvcl90eXBlX3N1Y2Nlc3MnXSxcclxuICAgIFtGb290ZXJJbmRpY2F0b3JTdGF0dXMuV2FybmluZywgJ2Zvb3Rlcl9faW5kaWNhdG9yX3R5cGVfd2FybmluZyddLFxyXG4gICAgW0Zvb3RlckluZGljYXRvclN0YXR1cy5FcnJvciwgJ2Zvb3Rlcl9faW5kaWNhdG9yX3R5cGVfZXJyb3InXVxyXG4gIF0pO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJRm9vdGVyT3B0aW9ucykge1xyXG4gICAgY29uc3QgbWVyZ2VkT3B0aW9ucyA9IHsgLi4ub3B0aW9ucywgLi4uZGVmYXVsdE9wdGlvbnMgfSBhcyBSZXF1aXJlZDxJRm9vdGVyT3B0aW9ucz47XHJcblxyXG4gICAgdGhpcy4kcm9vdCA9IG1lcmdlZE9wdGlvbnMuJHJvb3Q7XHJcbiAgICB0aGlzLm5hbWUgPSBtZXJnZWRPcHRpb25zLm5hbWUgIT09IGZhbHNlID8gbWVyZ2VkT3B0aW9ucy5uYW1lIDogdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5saWNlbmNlID0gbWVyZ2VkT3B0aW9ucy5saWNlbmNlICE9PSBmYWxzZSA/IG1lcmdlZE9wdGlvbnMubGljZW5jZSA6IHVuZGVmaW5lZDtcclxuICAgIHRoaXMueWVhciA9IEZvb3Rlci5nZXRDdXJyZW50WWVhcihtZXJnZWRPcHRpb25zLnllYXIpO1xyXG4gICAgdGhpcy52ZXJzaW9uID0gb3B0aW9ucy52ZXJzaW9uIHx8IHVuZGVmaW5lZDtcclxuXHJcbiAgICB0aGlzLnNob3dOYW1lID0gbWVyZ2VkT3B0aW9ucy5uYW1lICE9PSBmYWxzZTtcclxuICAgIHRoaXMuc2hvd0xpY2VuY2UgPSBtZXJnZWRPcHRpb25zLmxpY2VuY2UgIT09IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93WWVhciA9IG1lcmdlZE9wdGlvbnMueWVhciAhPT0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dDb25uZWN0ZWRUbyA9ICEhbWVyZ2VkT3B0aW9ucy5zZXJ2ZXJOYW1lICYmICEhbWVyZ2VkT3B0aW9ucy5kYXRhYmFzZTtcclxuICAgIHRoaXMuaW5kaWNhdG9yc09wdGlvbnMgPSBvcHRpb25zLmluZGljYXRvcnMgfHwgW107XHJcbiAgICB0aGlzLmluZGljYXRvcnNCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgSlF1ZXJ5PigpO1xyXG5cclxuICAgIHRoaXMuY29ubmVjdGVkVG8gPSB0aGlzLnNob3dDb25uZWN0ZWRUbyA/IGAke21lcmdlZE9wdGlvbnMuc2VydmVyTmFtZX0gLSAke21lcmdlZE9wdGlvbnMuZGF0YWJhc2V9YCA6IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0KCkge1xyXG4gICAgdGhpcy4kcm9vdC5hZGRDbGFzcygnZm9vdGVyJyk7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJJbmRpY2F0b3JzKCk7XHJcbiAgICB0aGlzLnJlbmRlckNvcHlyaWdodCgpO1xyXG4gICAgdGhpcy5zaG93WWVhciAmJiB0aGlzLnJlbmRlclllYXIoKTtcclxuICAgIHRoaXMuc2hvd05hbWUgJiYgdGhpcy5yZW5kZXJOYW1lKCk7XHJcbiAgICB0aGlzLnNob3dDb25uZWN0ZWRUbyAmJiB0aGlzLnJlbmRlckNvbm5lY3RlZFRvKCk7XHJcbiAgICB0aGlzLnNob3dMaWNlbmNlICYmIHRoaXMucmVuZGVyTGljZW5jZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEluZGljYXRvclZhbHVlKGluZGljYXRvck5hbWU6IHN0cmluZywgdmFsdWU6IElGb290ZXJJbmRpY2F0b3JWYWx1ZSkge1xyXG4gICAgY29uc3QgJGluZGljYXRvckVsID0gdGhpcy5pbmRpY2F0b3JzQnlOYW1lLmdldChpbmRpY2F0b3JOYW1lKTtcclxuICAgIGlmICgkaW5kaWNhdG9yRWwpIHtcclxuICAgICAgdGhpcy5zZXRJbmRpY2F0b3JWYWx1ZUNvcmUoJGluZGljYXRvckVsLCB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckluZGljYXRvcnMoKSB7XHJcbiAgICB0aGlzLmluZGljYXRvcnNPcHRpb25zPy5mb3JFYWNoKChvKSA9PiB7XHJcbiAgICAgIGlmIChvLnRleHQpIHtcclxuICAgICAgICAkKCc8c3Bhbj4nKVxyXG4gICAgICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2luZGljYXRvci10ZXh0JylcclxuICAgICAgICAgIC5odG1sKGAke28udGV4dH06YClcclxuICAgICAgICAgIC5hcHBlbmRUbyh0aGlzLiRyb290KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgJGluZGljYXRvckVsID0gJCgnPHNwYW4+JylcclxuICAgICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9faW5kaWNhdG9yJylcclxuICAgICAgICAuYXBwZW5kVG8odGhpcy4kcm9vdCk7XHJcblxyXG4gICAgICB0aGlzLnNldEluZGljYXRvclZhbHVlQ29yZSgkaW5kaWNhdG9yRWwsIG8udmFsdWUpO1xyXG4gICAgICB0aGlzLmluZGljYXRvcnNCeU5hbWUuc2V0KG8ubmFtZSwgJGluZGljYXRvckVsKTtcclxuXHJcbiAgICAgIGlmIChvLmdldFZhbHVlICYmIG8uZ2V0VmFsdWVJbnRlcnZhbE1zKSB7XHJcbiAgICAgICAgc2V0SW50ZXJ2YWwoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBvLmdldFZhbHVlKCk7XHJcbiAgICAgICAgICB0aGlzLnNldEluZGljYXRvclZhbHVlQ29yZSgkaW5kaWNhdG9yRWwsIHZhbHVlKTtcclxuICAgICAgICB9LCBvLmdldFZhbHVlSW50ZXJ2YWxNcyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRJbmRpY2F0b3JWYWx1ZUNvcmUoJGluZGljYXRvckVsOiBKUXVlcnksIHZhbHVlOiBJRm9vdGVySW5kaWNhdG9yVmFsdWUpIHtcclxuICAgICRpbmRpY2F0b3JFbC5hdHRyKCd0aXRsZScsIHZhbHVlLnRpdGxlKTtcclxuICAgICRpbmRpY2F0b3JFbC5yZW1vdmVDbGFzcyhbLi4udGhpcy5pbmRpY2F0b3JDbGFzc0J5U3RhdHVzLnZhbHVlcygpXSk7XHJcbiAgICAkaW5kaWNhdG9yRWwuYWRkQ2xhc3ModGhpcy5pbmRpY2F0b3JDbGFzc0J5U3RhdHVzLmdldCh2YWx1ZS5zdGF0dXMpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQ29weXJpZ2h0KCkge1xyXG4gICAgJCgnPHNwYW4+JylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2NvcHlyaWdodCcpXHJcbiAgICAgIC5odG1sKCcmY29weTsnKVxyXG4gICAgICAuYXBwZW5kVG8odGhpcy4kcm9vdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlck5hbWUoKSB7XHJcbiAgICB0aGlzLm5hbWUgJiYgJCgnPHNwYW4+JylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2l0ZW0nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9fYXBwLW5hbWUnKVxyXG4gICAgICAudGV4dCh0aGlzLm5hbWUgKyAoISF0aGlzLnZlcnNpb24gPyBgOiAke3RoaXMudmVyc2lvbn1gIDogJycpKVxyXG4gICAgICAuYXBwZW5kVG8odGhpcy4kcm9vdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckNvbm5lY3RlZFRvKCkge1xyXG4gICAgdGhpcy5uYW1lICYmICQoJzxzcGFuPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pdGVtJylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2Nvbm5lY3RlZC10bycpXHJcbiAgICAgIC50ZXh0KGBDb25uZWN0ZWQgdG86ICR7dGhpcy5jb25uZWN0ZWRUb30uYClcclxuICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJZZWFyKCkge1xyXG4gICAgJCgnPHNwYW4+JylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2l0ZW0nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9fY3VycmVudC15ZWFyJylcclxuICAgICAgLnRleHQodGhpcy55ZWFyKVxyXG4gICAgICAuYXBwZW5kVG8odGhpcy4kcm9vdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckxpY2VuY2UoKSB7XHJcbiAgICB0aGlzLmxpY2VuY2UgJiYgJCgnPHNwYW4+JylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2l0ZW0nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9fbGljZW5jZS1pbmZvJylcclxuICAgICAgLmFwcGVuZChcclxuICAgICAgICAkKCc8c3Bhbj4nKVxyXG4gICAgICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2xpY2VuY2Utb3duZXInKVxyXG4gICAgICAgICAgLnRleHQoYCR7dGhpcy5nZXRMaWNlbmNlT3duZXJEaXNwbGF5VGV4dCh0aGlzLmxpY2VuY2UpfS4gYClcclxuICAgICAgKVxyXG4gICAgICAuYXBwZW5kKFxyXG4gICAgICAgICQoJzxzcGFuPicpXHJcbiAgICAgICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9fbGljZW5jZS1kYXRlJylcclxuICAgICAgICAgIC50ZXh0KHRoaXMuZ2V0TGljZW5jZUV4cGlyYXRpb25EYXRlRGlzcGxheVRleHQodGhpcy5saWNlbmNlKSlcclxuICAgICAgKVxyXG4gICAgICAuYXBwZW5kVG8odGhpcy4kcm9vdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldExpY2VuY2VPd25lckRpc3BsYXlUZXh0KGxpY2VuY2U6IElMaWNlbmNlKSB7XHJcbiAgICByZXR1cm4gYExpY2VuY2VkIHRvOiAke2xpY2VuY2UuT3duZXJ9YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0TGljZW5jZUV4cGlyYXRpb25EYXRlRGlzcGxheVRleHQobGljZW5jZTogSUxpY2VuY2UpIHtcclxuICAgIGNvbnN0IGRhdGUgPSB0eXBlb2YgbGljZW5jZS5FeHBpcmF0aW9uRGF0ZSA9PT0gJ3N0cmluZycgPyBuZXcgRGF0ZShsaWNlbmNlLkV4cGlyYXRpb25EYXRlKSA6IGxpY2VuY2UuRXhwaXJhdGlvbkRhdGU7XHJcblxyXG4gICAgcmV0dXJuIGBMaWNlbmNlIEV4cGlyeTogJHtkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpfWA7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZsZXQgcmVwYWludFRpbWVvdXQgPSBudWxsO1xyXG5jb25zdCByZXNpemVIYW5kbGVycyA9IFtdO1xyXG5cclxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHtcclxuICBpZiAocmVwYWludFRpbWVvdXQpIHtcclxuICAgIHdpbmRvdy5jbGVhclRpbWVvdXQocmVwYWludFRpbWVvdXQpO1xyXG4gIH1cclxuXHJcbiAgcmVwYWludFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICByZXNpemVIYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiBoYW5kbGVyKCkpO1xyXG4gICAgcmVwYWludFRpbWVvdXQgPSBudWxsO1xyXG4gIH0sIDEwMCk7XHJcbn0pO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ob25SZXNpemU6ICgpID0+IHZvaWQpIHtcclxuICByZXNpemVIYW5kbGVycy5wdXNoKG9uUmVzaXplKTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IGF1dG9SZXNpemUgZnJvbSAnLi9BdXRvUmVzaXplJztcclxuXHJcbmNvbnN0IENTUyA9IHtcclxuICBtYWluOiAnLm1haW4nLFxyXG4gIGhlYWRlcjogJy5tYWluIC5oZWFkZXInLFxyXG4gIGNvbnRlbnQ6ICcuY29udGVudC1hcmVhJyxcclxuICBwYW5lbDogJy5wYW5lbCcsXHJcbiAgZm9vdGVyOiAnZm9vdGVyJ1xyXG59O1xyXG5cclxubGV0IGxhc3RXaW5kb3dIZWlnaHQgPSBudWxsO1xyXG5sZXQgbGFzdENvbnRlbnRIZWlnaHQgPSBudWxsO1xyXG5sZXQgbGFzdFdpZGdldEhlaWdodCA9IG51bGw7XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVIZWlnaHQod2lkZ2V0KSB7XHJcbiAgY29uc3QgJGNvbnRlbnQgPSAkKENTUy5jb250ZW50KTtcclxuXHJcbiAgJGNvbnRlbnQuaGVpZ2h0KGxhc3RDb250ZW50SGVpZ2h0KTtcclxuICB3aWRnZXQub3B0aW9uKCdoZWlnaHQnLCBsYXN0V2lkZ2V0SGVpZ2h0KTtcclxufVxyXG5cclxuZnVuY3Rpb24gY2FsY3VsYXRlSGVpZ2h0KHdpZGdldDogRGV2RXhwcmVzcy51aS5XaWRnZXQ8YW55PiwgaWdub3JlU2libGluZ3M6IGJvb2xlYW4gPSBmYWxzZSwgYWRkT3duU2l6ZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgY29uc3QgJG1haW4gPSAkKENTUy5tYWluKTtcclxuICBjb25zdCAkaGVhZGVyID0gJChDU1MuaGVhZGVyKTtcclxuICBjb25zdCAkY29udGVudCA9ICQoQ1NTLmNvbnRlbnQpO1xyXG4gIGNvbnN0ICRmb290ZXIgPSAkKENTUy5mb290ZXIpO1xyXG5cclxuICBjb25zdCBwYWRkaW5ncyA9ICRjb250ZW50Lm91dGVySGVpZ2h0KCkgLSAkY29udGVudC5oZWlnaHQoKTtcclxuXHJcbiAgbGFzdENvbnRlbnRIZWlnaHQgPSAkbWFpbi5oZWlnaHQoKSAtICRoZWFkZXIuaGVpZ2h0KCkgLSAkZm9vdGVyLm91dGVySGVpZ2h0KCkgLSBwYWRkaW5ncztcclxuICBsYXN0V2luZG93SGVpZ2h0ID0gJCh3aW5kb3cpLmhlaWdodCgpO1xyXG5cclxuICBjb25zdCAkY29udGVudEVsZW1lbnRzID0gJGNvbnRlbnQuY2hpbGRyZW4oKTtcclxuICBsZXQgY29udGVudEVsZW1lbnRzSGVpZ2h0ID0gMDtcclxuXHJcbiAgaWYgKCFpZ25vcmVTaWJsaW5ncykge1xyXG4gICAgY29uc3QgJHdpZGdldEVsZW1lbnQgPSB3aWRnZXQuZWxlbWVudCgpO1xyXG4gICAgJGNvbnRlbnRFbGVtZW50cy5lYWNoKChpbmRleCwgZWwpID0+IHtcclxuICAgICAgY29uc3QgJGNoaWxkID0gJChlbCk7XHJcblxyXG4gICAgICBpZiAoJGNoaWxkLmlzKCR3aWRnZXRFbGVtZW50KSB8fCAkY2hpbGQuaGFzKCR3aWRnZXRFbGVtZW50WzBdKS5sZW5ndGgpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnRlbnRFbGVtZW50c0hlaWdodCArPSAoJGNoaWxkLmlzKCc6dmlzaWJsZScpICYmICRjaGlsZC5jc3MoJ3Bvc2l0aW9uJykgIT09ICdhYnNvbHV0ZScpID8gJGNoaWxkLm91dGVySGVpZ2h0KHRydWUpIDogMDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbGFzdFdpZGdldEhlaWdodCA9IGxhc3RDb250ZW50SGVpZ2h0IC0gY29udGVudEVsZW1lbnRzSGVpZ2h0O1xyXG5cclxuICBpZiAoYWRkT3duU2l6ZSkge1xyXG4gICAgbGFzdFdpZGdldEhlaWdodCArPSB3aWRnZXQuZWxlbWVudCgpLm91dGVySGVpZ2h0KCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVIZWlnaHQod2lkZ2V0KTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVjYWxjdWxhdGVIZWlnaHQod2lkZ2V0OiBEZXZFeHByZXNzLnVpLldpZGdldDxhbnk+KSB7XHJcbiAgY29uc3Qgd2luZG93SGVpZ2h0ID0gJCh3aW5kb3cpLmhlaWdodCgpO1xyXG4gIGNvbnN0IGRpZmYgPSB3aW5kb3dIZWlnaHQgLSBsYXN0V2luZG93SGVpZ2h0O1xyXG5cclxuICBsYXN0Q29udGVudEhlaWdodCArPSBkaWZmO1xyXG4gIGxhc3RXaWRnZXRIZWlnaHQgKz0gZGlmZjtcclxuICBsYXN0V2luZG93SGVpZ2h0ID0gd2luZG93SGVpZ2h0O1xyXG5cclxuICB1cGRhdGVIZWlnaHQod2lkZ2V0KTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24od2lkZ2V0OiBEZXZFeHByZXNzLnVpLldpZGdldDxhbnk+LCBpZ25vcmVTaWJsaW5nczogYm9vbGVhbiA9IGZhbHNlLCBhZGRPd25TaXplOiBib29sZWFuID0gZmFsc2UpIHtcclxuICBjYWxjdWxhdGVIZWlnaHQod2lkZ2V0LCBpZ25vcmVTaWJsaW5ncywgYWRkT3duU2l6ZSk7XHJcblxyXG4gIGF1dG9SZXNpemUoKCkgPT4gcmVjYWxjdWxhdGVIZWlnaHQod2lkZ2V0KSk7XHJcbn1cclxuIiwgIlx1RkVGRmNvbnN0IERJU0FCTEVEX0NMQVNTID0gJ2lzb3otaWNvbi1kaXNhYmxlZCc7XHJcblxyXG5leHBvcnQgY29uc3QgVEhFTUVfQ0xBU1NFUyA9IHtcclxuICBsZzogJ2lzem9sZWEtbGcnLFxyXG4gIG1kOiAnaXN6b2xlYS1tZCcsXHJcbiAgc206ICdpc3pvbGVhLXNtJ1xyXG59O1xyXG5cclxuZXhwb3J0IGNsYXNzIFRoZW1lSGVscGVyIHtcclxuICBwdWJsaWMgc3RhdGljIHNldEVsZW1lbnRNaWRkbGVTaXplKGVsZW1lbnQ6IEpRdWVyeTxIVE1MRWxlbWVudD4pIHtcclxuICAgIGVsZW1lbnQuYWRkQ2xhc3MoVEhFTUVfQ0xBU1NFUy5tZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHNldEVsZW1lbnRTbWFsbFNpemUoZWxlbWVudDogSlF1ZXJ5PEhUTUxFbGVtZW50Pikge1xyXG4gICAgZWxlbWVudC5hZGRDbGFzcyhUSEVNRV9DTEFTU0VTLnNtKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgc2V0V2lkZ2V0TWlkZGxlU2l6ZShpbnN0YW5jZTogYW55KSB7XHJcbiAgICBUaGVtZUhlbHBlci5zZXRXaWRnZXRTaXplKGluc3RhbmNlLCBUSEVNRV9DTEFTU0VTLm1kKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgc2V0V2lkZ2V0U21hbGxTaXplKGluc3RhbmNlOiBhbnkpIHtcclxuICAgIFRoZW1lSGVscGVyLnNldFdpZGdldFNpemUoaW5zdGFuY2UsIFRIRU1FX0NMQVNTRVMuc20pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBnZXRJY29uQ2xhc3MoaWNvbjogc3RyaW5nLCBkaXNhYmxlZD86IGJvb2xlYW4sIHNpemU6IDE2IHwgMjQgPSAxNikge1xyXG4gICAgY29uc3QgaWNvbkNsYXNzID0gYGlzb3ogaXNvei1pY29uLSR7aWNvbn0tJHtzaXplfWA7XHJcblxyXG4gICAgcmV0dXJuICFkaXNhYmxlZFxyXG4gICAgICA/IGljb25DbGFzc1xyXG4gICAgICA6IGAke2ljb25DbGFzc30gJHtESVNBQkxFRF9DTEFTU31gO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgc2V0V2lkZ2V0U2l6ZShpbnN0YW5jZTogYW55LCBzaXplQ2xhc3M6IHN0cmluZykge1xyXG4gICAgaWYgKGluc3RhbmNlKSB7XHJcbiAgICAgIGluc3RhbmNlLm9wdGlvbignZWxlbWVudEF0dHInLCB7IGNsYXNzOiBzaXplQ2xhc3MgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZjb25zdCBDTEFTU0VTID0ge1xyXG4gIHRpdGxlOiAnaXNvei10aXRsZSdcclxufTtcclxuXHJcbmV4cG9ydCBjbGFzcyBUb29sYmFySGVscGVyIHtcclxuICBwdWJsaWMgc3RhdGljIGdldFRvb2xiYXJUaXRsZVRlbXBsYXRlSXRlbSh0aXRsZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBkZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgIHRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgJGVsID0gJChgPHNwYW4gY2xhc3M9XCIke0NMQVNTRVMudGl0bGV9XCI+JHt0aXRsZX08L3NwYW4+YCk7XHJcblxyXG4gICAgICAgIGlmIChkZXNjcmlwdGlvbikge1xyXG4gICAgICAgICAgJGVsLmFwcGVuZCgkKCc8aSAvPicpLmFkZENsYXNzKCdmYXMnKS5hZGRDbGFzcygnZmEtaW5mby1jaXJjbGUnKS5hZGRDbGFzcygncmVwb3J0LWRldGFpbHMtbGluaycpLmF0dHIoJ3RpdGxlJywgJ1JlcG9ydCBkZXRhaWxzJykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuICRlbDtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IFRIRU1FX0NMQVNTRVMgfSBmcm9tICcuLi9IZWxwZXJzL1RoZW1lJztcclxuaW1wb3J0IHsgVG9vbGJhckhlbHBlciB9IGZyb20gJy4uL0hlbHBlcnMvVG9vbGJhcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElUb29sYmFyU2V0dGluZyB7XHJcbiAgb3B0aW9ucz86IERldkV4cHJlc3MudWkuZHhUb29sYmFyT3B0aW9ucztcclxuICB0aXRsZT86IHN0cmluZztcclxuICBkZXNjcmlwdGlvbj86IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgQ0xBU1NFUyA9IHtcclxuICB0aXRsZTogJ2lzb3otdGl0bGUnLFxyXG4gIGhlYWRlcjogJ2lzb3otdG9vbGJhci1oZWFkZXInLFxyXG4gIGRyb3BEb3duQnV0dG9uOiAnZHgtZHJvcGRvd25tZW51LWJ1dHRvbidcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yOiBzdHJpbmcsIHNldHRpbmdzOiBJVG9vbGJhclNldHRpbmcgPSB7IHRpdGxlOiAnJywgZGVzY3JpcHRpb246ICcnLCBvcHRpb25zOiB7fSB9KTpcclxuICBEZXZFeHByZXNzLnVpLmR4VG9vbGJhciB7XHJcbiAgY29uc3Qge1xyXG4gICAgdGl0bGUgPSAnJyxcclxuICAgIGRlc2NyaXB0aW9uID0gJycsXHJcbiAgICBvcHRpb25zID0ge30sXHJcbiAgfSA9IHNldHRpbmdzO1xyXG4gIGNvbnN0IHtcclxuICAgIGl0ZW1zID0gW10sXHJcbiAgICBlbGVtZW50QXR0ciA9IHt9XHJcbiAgfSA9IG9wdGlvbnM7XHJcblxyXG4gIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgIGNvbnN0IG1pZGxkZVNpemVFbGVtZW50QXR0ciA9IHsgY2xhc3M6IFRIRU1FX0NMQVNTRVMubWQgfTtcclxuXHJcbiAgICBpZiAoaXRlbS5vcHRpb25zKSB7XHJcbiAgICAgIGxldCB7IGVkaXRvck9wdGlvbnMgfSA9IGl0ZW0ub3B0aW9ucztcclxuXHJcbiAgICAgIGlmICghZWRpdG9yT3B0aW9ucykge1xyXG4gICAgICAgIGVkaXRvck9wdGlvbnMgPSB7fTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZWRpdG9yT3B0aW9ucy5lbGVtZW50QXR0ciA9IG1pZGxkZVNpemVFbGVtZW50QXR0cjtcclxuICAgICAgaXRlbS5vcHRpb25zLmVsZW1lbnRBdHRyID0gbWlkbGRlU2l6ZUVsZW1lbnRBdHRyO1xyXG4gICAgICBpdGVtLm9wdGlvbnMuZWRpdG9yT3Rpb25zID0gZWRpdG9yT3B0aW9ucztcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgY29uc3Qgb25Db250ZW50UmVhZHkgPSAoZSkgPT4ge1xyXG4gICAgZS5lbGVtZW50XHJcbiAgICAgIC5maW5kKGAuJHtDTEFTU0VTLmRyb3BEb3duQnV0dG9ufWApXHJcbiAgICAgIC5hZGRDbGFzcyhUSEVNRV9DTEFTU0VTLm1kKTtcclxuXHJcbiAgICBpZiAob3B0aW9ucz8ub25Db250ZW50UmVhZHkpIHtcclxuICAgICAgb3B0aW9ucy5vbkNvbnRlbnRSZWFkeShlKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICByZXR1cm4gJChgJHtzZWxlY3Rvcn1gKVxyXG4gICAgLmR4VG9vbGJhcih7XHJcbiAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgVG9vbGJhckhlbHBlci5nZXRUb29sYmFyVGl0bGVUZW1wbGF0ZUl0ZW0odGl0bGUsIGRlc2NyaXB0aW9uKSxcclxuICAgICAgICAuLi5pdGVtc1xyXG4gICAgICBdLFxyXG4gICAgICBvbkNvbnRlbnRSZWFkeSxcclxuICAgICAgZWxlbWVudEF0dHI6IHtcclxuICAgICAgICAuLi5lbGVtZW50QXR0cixcclxuICAgICAgICBjbGFzczogQ0xBU1NFUy5oZWFkZXJcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIC5keFRvb2xiYXIoJ2luc3RhbmNlJyk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCBhdXRvUmVzaXplIGZyb20gJy4vQXV0b1Jlc2l6ZSc7XHJcblxyXG5jb25zdCBDU1MgPSB7XHJcbiAgcGFuZWw6ICcucGFuZWwtYm9keSdcclxufTtcclxuXHJcbmxldCBsYXN0V2luZG93SGVpZ2h0ID0gbnVsbDtcclxubGV0IGxhc3RDb250ZW50SGVpZ2h0ID0gbnVsbDtcclxubGV0IGxhc3RXaWRnZXRIZWlnaHQgPSBudWxsO1xyXG5cclxuZnVuY3Rpb24gdXBkYXRlSGVpZ2h0KHdpZGdldCkge1xyXG4gIGNvbnN0ICR3aWRnZXQgPSB3aWRnZXQuZWxlbWVudCgpO1xyXG4gIGNvbnN0ICRwYW5lbCA9ICR3aWRnZXQucGFyZW50cyhDU1MucGFuZWwpLmVxKDApO1xyXG5cclxuICAkcGFuZWwuaGVpZ2h0KGxhc3RDb250ZW50SGVpZ2h0KTtcclxuICB3aWRnZXQub3B0aW9uKCdoZWlnaHQnLCBsYXN0V2lkZ2V0SGVpZ2h0KTtcclxufVxyXG5cclxuZnVuY3Rpb24gY2FsY3VsYXRlSGVpZ2h0KHdpZGdldDogRGV2RXhwcmVzcy51aS5XaWRnZXQ8YW55Pikge1xyXG4gIGNvbnN0ICR3aWRnZXQgPSB3aWRnZXQuZWxlbWVudCgpO1xyXG4gIGNvbnN0ICRwYW5lbCA9IHdpZGdldC5lbGVtZW50KCkucGFyZW50cyhDU1MucGFuZWwpLmVxKDApO1xyXG5cclxuICBjb25zdCBwYW5lbFRvcCA9ICRwYW5lbC5wb3NpdGlvbigpLnRvcDtcclxuICBjb25zdCBwYW5lbEhlaWdodCA9ICRwYW5lbC5oZWlnaHQoKTtcclxuICBjb25zdCBwYW5lbFBhZGRpbmcgPSAkcGFuZWwub3V0ZXJIZWlnaHQoKSAtICRwYW5lbC5oZWlnaHQoKTtcclxuICBjb25zdCB3aWRnZXRUb3AgPSAkd2lkZ2V0LnBvc2l0aW9uKCkudG9wO1xyXG5cclxuICBjb25zdCB3aWRnZXRIZWlnaHQgPSBwYW5lbEhlaWdodCAtICh3aWRnZXRUb3AgLSBwYW5lbFRvcCkgKyBwYW5lbFBhZGRpbmcgLyAyO1xyXG5cclxuICB3aWRnZXQub3B0aW9uKCdoZWlnaHQnLCB3aWRnZXRIZWlnaHQpO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZWNhbGN1bGF0ZUhlaWdodCh3aWRnZXQ6IERldkV4cHJlc3MudWkuV2lkZ2V0PGFueT4pIHtcclxuICBjb25zdCB3aW5kb3dIZWlnaHQgPSAkKHdpbmRvdykuaGVpZ2h0KCk7XHJcbiAgY29uc3QgZGlmZiA9IHdpbmRvd0hlaWdodCAtIGxhc3RXaW5kb3dIZWlnaHQ7XHJcblxyXG4gIGxhc3RDb250ZW50SGVpZ2h0ICs9IGRpZmY7XHJcbiAgbGFzdFdpZGdldEhlaWdodCArPSBkaWZmO1xyXG4gIGxhc3RXaW5kb3dIZWlnaHQgPSB3aW5kb3dIZWlnaHQ7XHJcblxyXG4gIHVwZGF0ZUhlaWdodCh3aWRnZXQpO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih3aWRnZXQ6IERldkV4cHJlc3MudWkuV2lkZ2V0PGFueT4pIHtcclxuICBjYWxjdWxhdGVIZWlnaHQod2lkZ2V0KTtcclxuXHJcbiAgYXV0b1Jlc2l6ZSgoKSA9PiBjYWxjdWxhdGVIZWlnaHQod2lkZ2V0KSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCBmdWxsU2NyZWVuIGZyb20gJy4uL0Z1bGxTY3JlZW4nO1xyXG5pbXBvcnQgcGFuZWxIZWlnaHQgZnJvbSAnLi4vUGFuZWxIZWlnaHQnO1xyXG5pbXBvcnQgeyBDU1NfQ0xBU1NFUyB9IGZyb20gJy4uLy4uL1N0eWxpbmcvSW5kZXgnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZEFkZGl0aW9uYWxPcHRpb25zIHtcclxuICBleHBvcnRGaWxlTmFtZT86IHN0cmluZztcclxuICBzdW1tYXJ5Q29sdW1uPzogc3RyaW5nO1xyXG4gIHNob3dTdW1tYXJ5SW5Db2x1bW4/OiBzdHJpbmc7XHJcbiAgaW5QYW5lbEdyaWQ/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkKGlkOiBKUXVlcnksIG9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMsIGlzSW5QYW5lbEdyaWQgPSBmYWxzZSk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgY29uc3QgZ3JpZCA9IGNyZWF0ZURhdGFHcmlkKGlkLCBvcHRpb25zKTtcclxuXHJcbiAgaWYgKCFvcHRpb25zLmhlaWdodCkge1xyXG4gICAgaWYgKGlzSW5QYW5lbEdyaWQpIHtcclxuICAgICAgcGFuZWxIZWlnaHQoZ3JpZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmdWxsU2NyZWVuKGdyaWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGdyaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEYXRhR3JpZChlbDogSlF1ZXJ5LCBvcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICBjb25zdCBncmlkID0gZWwuZHhEYXRhR3JpZChvcHRpb25zKS5keERhdGFHcmlkKCdpbnN0YW5jZScpO1xyXG5cclxuICBncmlkLmVsZW1lbnQoKS5hZGRDbGFzcyhDU1NfQ0xBU1NFUy5keERhdGFHcmlkKTtcclxuXHJcbiAgcmV0dXJuIGdyaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGdWxsU2NyZWVuVHJlZUxpc3QoXHJcbiAgZWw6IHN0cmluZyB8IEpRdWVyeSwgb3B0aW9uczogRGV2RXhwcmVzcy51aS5keFRyZWVMaXN0LlByb3BlcnRpZXMsIGlzSW5QYW5lbCA9IGZhbHNlXHJcbik6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdCB7XHJcbiAgY29uc3QgdHJlZUxpc3QgPSAodHlwZW9mIGVsID09PSAnc3RyaW5nJyA/ICQoZWwpIDogZWwpLmR4VHJlZUxpc3Qob3B0aW9ucykuZHhUcmVlTGlzdCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgdHJlZUxpc3QuZWxlbWVudCgpLmFkZENsYXNzKENTU19DTEFTU0VTLmR4RGF0YUdyaWQpO1xyXG5cclxuICBpZiAoIW9wdGlvbnMuaGVpZ2h0KSB7XHJcbiAgICBpZiAoaXNJblBhbmVsKSB7XHJcbiAgICAgIHBhbmVsSGVpZ2h0KHRyZWVMaXN0KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZ1bGxTY3JlZW4odHJlZUxpc3QpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHRyZWVMaXN0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKHRleHQsIHRpdGxlKSB7XHJcbiAgcmV0dXJuICQoJzxzcGFuPicpXHJcbiAgICAuYXR0cigndGl0bGUnLCB0aXRsZSlcclxuICAgIC50ZXh0KHRleHQpO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBUb29sYmFySGVscGVyIH0gZnJvbSAnLi4vLi4vSGVscGVycy9Ub29sYmFyJztcclxuaW1wb3J0IHsgVGhlbWVIZWxwZXIsIFRIRU1FX0NMQVNTRVMgfSBmcm9tICcuLi8uLi9IZWxwZXJzL1RoZW1lJztcclxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi4vLi4vQ29uZmlnL0luZGV4JztcclxuaW1wb3J0IHsgY3JlYXRlR3JpZEV4cG9ydEZ1bmN0aW9uIH0gZnJvbSAnLi4vLi4vVXRpbHMvR3JpZEV4cG9ydCc7XHJcblxyXG5pbnRlcmZhY2UgSUdyaWRTZXR0aW5nc0Jhc2U8VD4ge1xyXG4gIG9wdGlvbnM/OiBUO1xyXG5cclxuICBleHBvcnRGaWxlTmFtZT86IHN0cmluZztcclxuICBoZWFkZXJEZXNjcmlwdGlvbj86IHN0cmluZztcclxuICBpblBhbmVsR3JpZD86IGJvb2xlYW47XHJcbiAgaXNGdWxsU2NyZWVuPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcclxuICBzZXREZWZhdWx0Q29sdW1uV2lkdGg/OiBib29sZWFuO1xyXG4gIHNob3dTdW1tYXJ5SW5Db2x1bW4/OiBzdHJpbmc7XHJcbiAgc3VtbWFyeUNvbHVtbj86IHN0cmluZztcclxuICBkaXNhYmxlU3VtbWFyeUNvbHVtbkRldGVjdGlvbj86IGJvb2xlYW47XHJcbiAgdGl0bGU/OiBzdHJpbmc7XHJcbiAgdG9vbGJhckFjY2VudEJ1dHRvbk5hbWU/OiBzdHJpbmc7XHJcbiAgdG9vbGJhckl0ZW1zPzogYW55W107XHJcbiAgYnV0dG9uc1NpemU/OiAnc20nIHwgJ21kJztcclxufVxyXG5cclxuY29uc3QgZ2V0V2lkZ2V0TmFtZSA9ICh3aWRnZXQ6IHN0cmluZykgPT4ge1xyXG4gIHJldHVybiB3aWRnZXRcclxuICAgIC5zbGljZSgnZHgnLmxlbmd0aClcclxuICAgIC50b0xvd2VyQ2FzZSgpO1xyXG59O1xyXG5cclxuY29uc3QgZ2V0U2VsZWN0b3JzID0gKHdpZGdldDogc3RyaW5nKSA9PiB7XHJcbiAgY29uc3QgZ3JpZE5hbWUgPSBnZXRXaWRnZXROYW1lKHdpZGdldCk7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBzZWFyY2hQYW5lbDogYC5keC0ke2dyaWROYW1lfS1zZWFyY2gtcGFuZWxgLFxyXG4gICAgdG9vbGJhckVkaXRCdXR0b246IGAuZHgtJHtncmlkTmFtZX0tdG9vbGJhci1idXR0b24uZHgtZWRpdC1idXR0b25gLFxyXG4gICAgdG9vbGJhckV4cG9ydEJ1dHRvbjogYC5keC0ke2dyaWROYW1lfS1leHBvcnQtYnV0dG9uIC5keC1idXR0b25gLFxyXG4gICAgc2VsZWN0Q2hlY2tCb3g6ICcuZHgtc2VsZWN0LWNoZWNrYm94J1xyXG4gIH07XHJcbn07XHJcbmV4cG9ydCBpbnRlcmZhY2UgSURhdGFHcmlkU2V0dGluZ3MgZXh0ZW5kcyBJR3JpZFNldHRpbmdzQmFzZTxEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zPiB7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVRyZWVMaXN0U2V0dGluZ3MgZXh0ZW5kcyBJR3JpZFNldHRpbmdzQmFzZTxEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zPiB7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRHcmlkRGVmYXVsdE9wdGlvbnMoc2V0dGluZ3M6IElEYXRhR3JpZFNldHRpbmdzKSB7XHJcbiAgY29uc3QgcmVzdWx0OiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuUHJvcGVydGllcyA9IGNvbmZpZy5pc0xlZ2FjeVJlbmRlciA/IGdldExlZ2FjeURlZmF1bHRPcHRpb25zKHNldHRpbmdzKSA6IGdldERlZmF1bHRPcHRpb25zKHNldHRpbmdzKTtcclxuXHJcbiAgaWYgKHNldHRpbmdzLnN1bW1hcnlDb2x1bW4gfHwgc2V0dGluZ3Muc2hvd1N1bW1hcnlJbkNvbHVtbikge1xyXG4gICAgKHJlc3VsdCBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuUHJvcGVydGllcykuc3VtbWFyeSA9IHtcclxuICAgICAgdG90YWxJdGVtczogW3tcclxuICAgICAgICBjb2x1bW46IHNldHRpbmdzLnN1bW1hcnlDb2x1bW4gfHwgc2V0dGluZ3Muc2hvd1N1bW1hcnlJbkNvbHVtbixcclxuICAgICAgICBzaG93SW5Db2x1bW46IHNldHRpbmdzLnNob3dTdW1tYXJ5SW5Db2x1bW4gfHwgc2V0dGluZ3Muc3VtbWFyeUNvbHVtbixcclxuICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xyXG4gICAgICB9XVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHJlc3VsdC5leHBvcnQgPSB7XHJcbiAgICBlbmFibGVkOiAhIXNldHRpbmdzLmV4cG9ydEZpbGVOYW1lLFxyXG4gICAgYWxsb3dFeHBvcnRTZWxlY3RlZERhdGE6IHRydWUsXHJcbiAgfTtcclxuXHJcbiAgaWYgKCFjb25maWcuaXNMZWdhY3lSZW5kZXIpIHtcclxuICAgIHJlc3VsdC5ncm91cFBhbmVsID0geyB2aXNpYmxlOiB0cnVlIH07XHJcbiAgfVxyXG5cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJlZUxpc3REZWZhdWx0T3B0aW9ucyhzZXR0aW5nczogSVRyZWVMaXN0U2V0dGluZ3MpIHtcclxuICBjb25zdCByZXN1bHQ6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdE9wdGlvbnMgPSBnZXREZWZhdWx0T3B0aW9ucyhzZXR0aW5ncyk7XHJcblxyXG4gIHJlc3VsdC5zZWxlY3Rpb24gPSB7IG1vZGU6ICdub25lJyB9O1xyXG5cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXREZWZhdWx0T3B0aW9uc1xyXG4gIDxUIGV4dGVuZHMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyB8IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdE9wdGlvbnM+KHNldHRpbmdzOiBJRGF0YUdyaWRTZXR0aW5ncyB8IElUcmVlTGlzdFNldHRpbmdzKTogVCB7XHJcbiAgcmV0dXJuIHtcclxuICAgIGFsbG93Q29sdW1uUmVzaXppbmc6IHRydWUsXHJcbiAgICBjYWNoZUVuYWJsZWQ6IHRydWUsXHJcbiAgICBjb2x1bW5BdXRvV2lkdGg6IHRydWUsXHJcbiAgICBmaWx0ZXJSb3c6IHsgdmlzaWJsZTogdHJ1ZSwgYXBwbHlGaWx0ZXI6ICdvbkNsaWNrJyB9LFxyXG4gICAgaGVhZGVyRmlsdGVyOiB7IHZpc2libGU6IHRydWUgfSxcclxuICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgcGFnaW5nOiB7IHBhZ2VTaXplOiA4MCB9LFxyXG4gICAgcGFnZXI6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgIHJlbW90ZU9wZXJhdGlvbnM6IHRydWUsXHJcbiAgICBzY3JvbGxpbmc6IHtcclxuICAgICAgbW9kZTogJ3ZpcnR1YWwnLFxyXG4gICAgICByb3dSZW5kZXJpbmdNb2RlOiAndmlydHVhbCdcclxuICAgIH0sXHJcbiAgICBzZWFyY2hQYW5lbDoge1xyXG4gICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICB3aWR0aDogMjQwLFxyXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlYXJjaC4uLidcclxuICAgIH0sXHJcbiAgICBzaG93Um93TGluZXM6IHRydWUsXHJcbiAgICBzaG93Qm9yZGVyczogdHJ1ZSxcclxuICAgIHNlbGVjdGlvbjogeyBtb2RlOiAnbXVsdGlwbGUnIH0sXHJcbiAgICB3b3JkV3JhcEVuYWJsZWQ6IHRydWVcclxuICB9IGFzIFQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldExlZ2FjeURlZmF1bHRPcHRpb25zXHJcbiAgPFQgZXh0ZW5kcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zIHwgRGV2RXhwcmVzcy51aS5keFRyZWVMaXN0T3B0aW9ucz4oc2V0dGluZ3M6IElEYXRhR3JpZFNldHRpbmdzIHwgSVRyZWVMaXN0U2V0dGluZ3MpOiBUIHtcclxuICByZXR1cm4ge1xyXG4gICAgYWxsb3dDb2x1bW5SZXNpemluZzogdHJ1ZSxcclxuICAgIHJlbW90ZU9wZXJhdGlvbnM6IHRydWUsXHJcbiAgICBjb2x1bW5BdXRvV2lkdGg6IHRydWUsXHJcbiAgICBzaG93Qm9yZGVyczogdHJ1ZSxcclxuICAgIGZpbHRlclJvdzogeyB2aXNpYmxlOiB0cnVlLCBhcHBseUZpbHRlcjogJ29uQ2xpY2snIH0sXHJcblxyXG4gICAgc2VsZWN0aW9uOiB7IG1vZGU6ICdtdWx0aXBsZScgfSxcclxuICAgIHBhZ2luZzogeyBwYWdlU2l6ZTogNTAgfSxcclxuICAgIHNlYXJjaFBhbmVsOiB7IHZpc2libGU6IHRydWUgfSxcclxuICAgIGhlYWRlckZpbHRlcjogeyB2aXNpYmxlOiB0cnVlIH0sXHJcbiAgICBzY3JvbGxpbmc6IHsgbW9kZTogJ3ZpcnR1YWwnIH0sXHJcbiAgfSBhcyBUO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwcmVwYXJlRGVmYXVsdFRvb2xiYXJCdXR0b25zKHRvb2xiYXJPcHRpb25zOiBhbnksIHRvb2xiYXJBY2NlbnRCdXR0b25OYW1lPzogc3RyaW5nKSB7XHJcbiAgY29uc3QgZmluZFRvb2xiYXJJdGVtID0gKGl0ZW1zOiBhbnlbXSwgbmFtZTogc3RyaW5nKSA9PiBpdGVtcy5maW5kKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09IG5hbWUpO1xyXG5cclxuICBpZiAodG9vbGJhck9wdGlvbnM/Lml0ZW1zKSB7XHJcbiAgICBjb25zdCB7IGl0ZW1zIH0gPSB0b29sYmFyT3B0aW9ucztcclxuXHJcbiAgICBpZiAodG9vbGJhckFjY2VudEJ1dHRvbk5hbWUpIHtcclxuICAgICAgY29uc3QgYWNjZW50QnV0dG9uSXRlbSA9IGZpbmRUb29sYmFySXRlbShpdGVtcywgdG9vbGJhckFjY2VudEJ1dHRvbk5hbWUpO1xyXG4gICAgICBpZiAoYWNjZW50QnV0dG9uSXRlbSkge1xyXG4gICAgICAgIGFjY2VudEJ1dHRvbkl0ZW0ub3B0aW9ucy50eXBlID0gJ2RlZmF1bHQnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2F2ZUJ1dHRvbkl0ZW0gPSBmaW5kVG9vbGJhckl0ZW0oaXRlbXMsICdzYXZlQnV0dG9uJyk7XHJcbiAgICBpZiAoc2F2ZUJ1dHRvbkl0ZW0pIHtcclxuICAgICAgc2F2ZUJ1dHRvbkl0ZW0uc2hvd1RleHQgPSAnYWx3YXlzJztcclxuICAgICAgc2F2ZUJ1dHRvbkl0ZW0ub3B0aW9ucy50ZXh0ID0gJ1NhdmUnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJldmVydEJ1dHRvbkl0ZW0gPSBmaW5kVG9vbGJhckl0ZW0oaXRlbXMsICdyZXZlcnRCdXR0b24nKTtcclxuICAgIGlmIChyZXZlcnRCdXR0b25JdGVtKSB7XHJcbiAgICAgIHJldmVydEJ1dHRvbkl0ZW0uc2hvd1RleHQgPSAnYWx3YXlzJztcclxuICAgICAgcmV2ZXJ0QnV0dG9uSXRlbS5vcHRpb25zLnRleHQgPSAnRGlzY2FyZCc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVmcmVzaEJ1dHRvbkl0ZW0gPSBmaW5kVG9vbGJhckl0ZW0oaXRlbXMsICdyZWZyZXNoJyk7XHJcbiAgICBpZiAocmVmcmVzaEJ1dHRvbkl0ZW0pIHtcclxuICAgICAgcmVmcmVzaEJ1dHRvbkl0ZW0uc2hvd1RleHQgPSAnYWx3YXlzJztcclxuICAgICAgcmVmcmVzaEJ1dHRvbkl0ZW0ub3B0aW9ucy50ZXh0ID0gJ1JlZnJlc2gnO1xyXG4gICAgICByZWZyZXNoQnV0dG9uSXRlbS5vcHRpb25zLmhpbnQgPSAnUmVsb2FkIERhdGEnO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlU3VtbWFyeUNvbHVtbklmUmVxdWlyZWQoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XHJcbiAgY29uc3QgdG90YWxJdGVtcyA9IGdyaWQub3B0aW9uKCdzdW1tYXJ5LnRvdGFsSXRlbXMnKSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydzdW1tYXJ5J11bJ3RvdGFsSXRlbXMnXTtcclxuICBjb25zdCBjdXJyZW50U3VtbWFyeUNvbHVtbiA9IHRvdGFsSXRlbXM/LmZpbHRlcigoaSkgPT4gaS5zdW1tYXJ5VHlwZSA9PT0gJ2NvdW50JylbMF0/LmNvbHVtbjtcclxuXHJcbiAgbGV0IHN1bW1hcnlDb2x1bW5JbmRleCA9IGN1cnJlbnRTdW1tYXJ5Q29sdW1uICYmIGdyaWQuZ2V0VmlzaWJsZUNvbHVtbnMoKS5maW5kSW5kZXgoKGVsKSA9PiBlbC5kYXRhRmllbGQgPT09IGN1cnJlbnRTdW1tYXJ5Q29sdW1uKTtcclxuICBpZiAoIXN1bW1hcnlDb2x1bW5JbmRleCkge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gZ3JpZC5vcHRpb24oJ3NlbGVjdGlvbicpO1xyXG4gICAgY29uc3QgaGFzU2VsZWN0aW9uID0gc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5tb2RlICE9PSAnbm9uZSc7XHJcbiAgICBzdW1tYXJ5Q29sdW1uSW5kZXggPSBoYXNTZWxlY3Rpb24gPyBncmlkLmdldFZpc2libGVDb2x1bW5zKCkuZmluZEluZGV4KChlbCkgPT4gISFlbC5kYXRhRmllbGQpIDogMDtcclxuICB9XHJcblxyXG4gIGNvbnN0IG5ld1N1bW1hcnlDb2x1bW4gPSBncmlkLmdldFZpc2libGVDb2x1bW5zKClbc3VtbWFyeUNvbHVtbkluZGV4XT8uZGF0YUZpZWxkO1xyXG5cclxuICBpZiAobmV3U3VtbWFyeUNvbHVtbiAmJiBjdXJyZW50U3VtbWFyeUNvbHVtbiAhPT0gbmV3U3VtbWFyeUNvbHVtbikge1xyXG4gICAgZ3JpZC5vcHRpb24oJ3N1bW1hcnknLCB7XHJcbiAgICAgIHRvdGFsSXRlbXM6IFt7XHJcbiAgICAgICAgY29sdW1uOiBncmlkLmdldFZpc2libGVDb2x1bW5zKClbc3VtbWFyeUNvbHVtbkluZGV4XT8uZGF0YUZpZWxkLFxyXG4gICAgICAgIHN1bW1hcnlUeXBlOiAnY291bnQnXHJcbiAgICAgIH1dXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRIYW5kbGVyczxUIGV4dGVuZHMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyB8IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdE9wdGlvbnM+KFxyXG4gIHdpZGdldDogJ2R4RGF0YUdyaWQnIHwgJ2R4VHJlZUxpc3QnLFxyXG4gIHNldHRpbmdzOiBJRGF0YUdyaWRTZXR0aW5ncyB8IElUcmVlTGlzdFNldHRpbmdzXHJcbik6IFQge1xyXG4gIGNvbnN0IHNlbGVjdG9ycyA9IGdldFNlbGVjdG9ycyh3aWRnZXQpO1xyXG4gIGxldCBpc0dyaWRJbml0aWFsaXphZWQgPSBmYWxzZTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIG9uQ2VsbFByZXBhcmVkOiAoZSkgPT4ge1xyXG4gICAgICBpZiAoIWNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICAgIGlmIChlLnJvd1R5cGUgPT09ICdoZWFkZXInKSB7XHJcbiAgICAgICAgICBlLmNlbGxFbGVtZW50LmNzcygndGV4dC1hbGlnbicsICdjZW50ZXInKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChzZXR0aW5ncy5vcHRpb25zPy5vbkNlbGxQcmVwYXJlZCkge1xyXG4gICAgICAgIHNldHRpbmdzLm9wdGlvbnM/Lm9uQ2VsbFByZXBhcmVkKGUpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgb25Db250ZW50UmVhZHk6IChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IGRhdGFHcmlkID0gZS5jb21wb25lbnQ7XHJcblxyXG4gICAgICBpZiAoIXNldHRpbmdzLmRpc2FibGVTdW1tYXJ5Q29sdW1uRGV0ZWN0aW9uKSB7XHJcbiAgICAgICAgdXBkYXRlU3VtbWFyeUNvbHVtbklmUmVxdWlyZWQoZGF0YUdyaWQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWlzR3JpZEluaXRpYWxpemFlZCkge1xyXG4gICAgICAgIGlzR3JpZEluaXRpYWxpemFlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8vdG8gZml4IGF1dG9zY3JvbGxcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHNjcm9sbGFibGUgPSBkYXRhR3JpZC5nZXRTY3JvbGxhYmxlKCk7XHJcblxyXG4gICAgICAgICAgaWYgKHNjcm9sbGFibGUpIHtcclxuICAgICAgICAgICAgc2Nyb2xsYWJsZS5zY3JvbGxUbyh7IHRvcDogMCB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhR3JpZC5jb2x1bW5Db3VudCgpOyBpKyspIHtcclxuICAgICAgICBjb25zdCBkYXRhVHlwZSA9IGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnZGF0YVR5cGUnKTtcclxuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzLnNldERlZmF1bHRDb2x1bW5XaWR0aCB8fCBzZXR0aW5ncy5zZXREZWZhdWx0Q29sdW1uV2lkdGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgaWYgKCFkYXRhR3JpZC5jb2x1bW5PcHRpb24oaSwgJ3dpZHRoJykpIHtcclxuICAgICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgICAgICAgICBkYXRhR3JpZC5jb2x1bW5PcHRpb24oaSwgJ3dpZHRoJywgJzQ1cHgnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnZGF0ZXRpbWUnKSB7XHJcbiAgICAgICAgICAgICAgZGF0YUdyaWQuY29sdW1uT3B0aW9uKGksICd3aWR0aCcsICcxMzVweCcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdkYXRlJykge1xyXG4gICAgICAgICAgICAgIGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnd2lkdGgnLCAnMTQwcHgnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFjb25maWcuaXNMZWdhY3lSZW5kZXIpIHtcclxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2RhdGV0aW1lJyB8fCBkYXRhVHlwZSA9PT0gJ2RhdGUnKSB7XHJcbiAgICAgICAgICAgIGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnYWxpZ25tZW50JywgJ3JpZ2h0Jyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnZGF0ZScpIHtcclxuICAgICAgICAgICAgZGF0YUdyaWQuY29sdW1uT3B0aW9uKGksICdmb3JtYXQnLCAnZGQgTU1NIHl5eXknKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdkYXRldGltZScpIHtcclxuICAgICAgICAgICAgZGF0YUdyaWQuY29sdW1uT3B0aW9uKGksICdmb3JtYXQnLCAnSEg6bW0sIGRkIE1NTSB5eXl5Jyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICAgIGlmIChzZXR0aW5ncy5idXR0b25zU2l6ZSA9PT0gJ3NtJykge1xyXG4gICAgICAgICAgVGhlbWVIZWxwZXIuc2V0V2lkZ2V0U21hbGxTaXplKCQoc2VsZWN0b3JzLnNlYXJjaFBhbmVsKS5keFRleHRCb3goJ2luc3RhbmNlJykpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBUaGVtZUhlbHBlci5zZXRXaWRnZXRNaWRkbGVTaXplKCQoc2VsZWN0b3JzLnNlYXJjaFBhbmVsKS5keFRleHRCb3goJ2luc3RhbmNlJykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgVGhlbWVIZWxwZXIuc2V0RWxlbWVudFNtYWxsU2l6ZShlLmNvbXBvbmVudC5lbGVtZW50KCkuZmluZChzZWxlY3RvcnMuc2VsZWN0Q2hlY2tCb3gpKTtcclxuXHJcbiAgICAgICAgaWYgKCQoc2VsZWN0b3JzLnRvb2xiYXJFeHBvcnRCdXR0b24pLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGlmIChzZXR0aW5ncy5idXR0b25zU2l6ZSA9PT0gJ3NtJykge1xyXG4gICAgICAgICAgICBUaGVtZUhlbHBlci5zZXRXaWRnZXRTbWFsbFNpemUoJChzZWxlY3RvcnMudG9vbGJhckV4cG9ydEJ1dHRvbikuZHhCdXR0b24oJ2luc3RhbmNlJykpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgVGhlbWVIZWxwZXIuc2V0V2lkZ2V0TWlkZGxlU2l6ZSgkKHNlbGVjdG9ycy50b29sYmFyRXhwb3J0QnV0dG9uKS5keEJ1dHRvbignaW5zdGFuY2UnKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc2V0dGluZ3Mub3B0aW9ucz8ub25Db250ZW50UmVhZHkpIHtcclxuICAgICAgICBzZXR0aW5ncy5vcHRpb25zLm9uQ29udGVudFJlYWR5KGUpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgb25Ub29sYmFyUHJlcGFyaW5nOiAoZSkgPT4ge1xyXG4gICAgICBjb25zdCB7XHJcbiAgICAgICAgdG9vbGJhck9wdGlvbnMgPSB7fVxyXG4gICAgICB9ID0gZTtcclxuXHJcbiAgICAgIGNvbnN0IGRhdGFHcmlkID0gZS5jb21wb25lbnQ7XHJcblxyXG4gICAgICBjb25zdCB7XHJcbiAgICAgICAgaXRlbXMgPSBbXVxyXG4gICAgICB9ID0gdG9vbGJhck9wdGlvbnM7XHJcblxyXG4gICAgICBpZiAoY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzLnRpdGxlKSB7XHJcbiAgICAgICAgICBlLnRvb2xiYXJPcHRpb25zLml0ZW1zLnVuc2hpZnQoe1xyXG4gICAgICAgICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlKCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGhlYWRlckVsID0gJCgnPGgyIC8+JykuYWRkQ2xhc3MoJ2dyaWQtaGVhZGVyJykudGV4dChzZXR0aW5ncy50aXRsZSk7XHJcbiAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLmhlYWRlckRlc2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBoZWFkZXJFbC5hcHBlbmQoJCgnPGkgLz4nKS5hZGRDbGFzcygnZmFzJykuYWRkQ2xhc3MoJ2ZhLWluZm8tY2lyY2xlJykuYWRkQ2xhc3MoJ3JlcG9ydC1kZXRhaWxzLWxpbmsnKS5hdHRyKCd0aXRsZScsICdDbGljayB0byBzZWUgZnVydGhlciBkZXRhaWxzJykpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuIGhlYWRlckVsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgIGlmIChpdGVtLndpZGdldCA9PT0gJ2R4QnV0dG9uJyAmJiBpdGVtLm5hbWUgPT09ICdhcHBseUZpbHRlckJ1dHRvbicpIHtcclxuICAgICAgICAgICAgaXRlbS5vcHRpb25zLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3MudGl0bGUpIHtcclxuICAgICAgICAgIGl0ZW1zLnVuc2hpZnQoVG9vbGJhckhlbHBlci5nZXRUb29sYmFyVGl0bGVUZW1wbGF0ZUl0ZW0oc2V0dGluZ3MudGl0bGUsIHNldHRpbmdzLmhlYWRlckRlc2NyaXB0aW9uKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpdGVtcy5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGl0ZW0ud2lkZ2V0ID09PSAnZHhCdXR0b24nKSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLm5hbWUgPT09ICdhcHBseUZpbHRlckJ1dHRvbicpIHtcclxuICAgICAgICAgICAgICBpdGVtLm9wdGlvbnMudmlzaWJsZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGljb25TaXplID0gc2V0dGluZ3MuYnV0dG9uc1NpemUgPT09ICdzbScgPyAxNiA6IDI0O1xyXG5cclxuICAgICAgICAgICAgc3dpdGNoIChpdGVtLm5hbWUpIHtcclxuICAgICAgICAgICAgICBjYXNlICdhZGRSb3dCdXR0b24nOlxyXG4gICAgICAgICAgICAgICAgaXRlbS5vcHRpb25zLmljb24gPSBUaGVtZUhlbHBlci5nZXRJY29uQ2xhc3MoJ3BsdXMnLCBmYWxzZSwgaWNvblNpemUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgIGNhc2UgJ3NhdmVCdXR0b24nOlxyXG4gICAgICAgICAgICAgICAgaXRlbS5vcHRpb25zLmljb24gPSBUaGVtZUhlbHBlci5nZXRJY29uQ2xhc3MoJ3NhdmUnLCBmYWxzZSwgaWNvblNpemUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgIGNhc2UgJ3JldmVydEJ1dHRvbic6XHJcbiAgICAgICAgICAgICAgICBpdGVtLm9wdGlvbnMuaWNvbiA9IFRoZW1lSGVscGVyLmdldEljb25DbGFzcygnY2xvc2UnLCBmYWxzZSwgaWNvblNpemUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBpdGVtLm9wdGlvbnMuaWNvbiA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWl0ZW0ub3B0aW9ucy5lbGVtZW50QXR0cikge1xyXG4gICAgICAgICAgICAgIGl0ZW0ub3B0aW9ucy5lbGVtZW50QXR0ciA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpdGVtLm9wdGlvbnMuZWxlbWVudEF0dHIuY2xhc3MgPSBzZXR0aW5ncy5idXR0b25zU2l6ZSA9PT0gJ3NtJyA/IFRIRU1FX0NMQVNTRVMuc20gOiBUSEVNRV9DTEFTU0VTLm1kO1xyXG4gICAgICAgICAgICBpdGVtLnNob3dUZXh0ID0gJ2Fsd2F5cyc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHByZXBhcmVEZWZhdWx0VG9vbGJhckJ1dHRvbnModG9vbGJhck9wdGlvbnMsIHNldHRpbmdzLnRvb2xiYXJBY2NlbnRCdXR0b25OYW1lKTtcclxuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzLnRvb2xiYXJJdGVtcykge1xyXG4gICAgICAgICAgaXRlbXMucHVzaCguLi5zZXR0aW5ncy50b29sYmFySXRlbXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdG9vbGJhck9wdGlvbnMuZWxlbWVudEF0dHIgPSB7XHJcbiAgICAgICAgICBjbGFzczogJ2lzb3otdG9vbGJhci1oZWFkZXInXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3Qgc2F2ZUJ1dHRvbkluZGV4ID0gZS50b29sYmFyT3B0aW9ucy5pdGVtcy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gJ3NhdmVCdXR0b24nKTtcclxuICAgICAgY29uc3Qgc2VhcmNoUGFuZWxJbmRleCA9IGUudG9vbGJhck9wdGlvbnMuaXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdzZWFyY2hQYW5lbCcpO1xyXG4gICAgICBsZXQgaW5kZXhGb3JVcGRhdGUgPSAtMTtcclxuXHJcbiAgICAgIGlmIChzYXZlQnV0dG9uSW5kZXggPiAtMSkge1xyXG4gICAgICAgIGluZGV4Rm9yVXBkYXRlID0gc2F2ZUJ1dHRvbkluZGV4O1xyXG4gICAgICB9IGVsc2UgaWYgKHNlYXJjaFBhbmVsSW5kZXggPiAtMSkge1xyXG4gICAgICAgIGluZGV4Rm9yVXBkYXRlID0gc2VhcmNoUGFuZWxJbmRleDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpbmRleEZvclVwZGF0ZSA9IGUudG9vbGJhck9wdGlvbnMuaXRlbXMubGVuZ3RoO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBlLnRvb2xiYXJPcHRpb25zLml0ZW1zLnNwbGljZShpbmRleEZvclVwZGF0ZSwgMCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgICAgIG5hbWU6ICdyZWZyZXNoJyxcclxuICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgaWNvbjogJ3JlZnJlc2gnLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IGNvbmZpZy5pc0xlZ2FjeVJlbmRlciA/IDMwIDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBlbGVtZW50QXR0cjogeyBjbGFzczogYGR4LWRhdGFncmlkLXRvb2xiYXItYnV0dG9uICR7c2V0dGluZ3MuYnV0dG9uc1NpemUgPT09ICdzbScgPyBUSEVNRV9DTEFTU0VTLnNtIDogVEhFTUVfQ0xBU1NFUy5tZH1gIH0sXHJcbiAgICAgICAgICAgIHN0eWxpbmdNb2RlOiBjb25maWcuaXNMZWdhY3lSZW5kZXIgPyAndGV4dCcgOiAnY29udGFpbmVkJyxcclxuICAgICAgICAgICAgb25DbGljazogKCkgPT4gZGF0YUdyaWQ/LnJlZnJlc2goKSxcclxuICAgICAgICAgICAgb25Db250ZW50UmVhZHk6IGNvbmZpZy5pc0xlZ2FjeVJlbmRlciA/IChjb250ZW50UmVhZHlFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnRlbnRSZWFkeUV2ZW50LmVsZW1lbnQuZmluZCgnLmR4LWJ1dHRvbi1jb250ZW50JykuY3NzKHtcclxuICAgICAgICAgICAgICAgIHBhZGRpbmdUb3A6IDYsXHJcbiAgICAgICAgICAgICAgICBwYWRkaW5nQm90dG9tOiA2XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gOiB1bmRlZmluZWRcclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbi5Qcm9wZXJ0aWVzXHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKHNldHRpbmdzLm9wdGlvbnM/Lm9uVG9vbGJhclByZXBhcmluZykge1xyXG4gICAgICAgIHNldHRpbmdzLm9wdGlvbnMub25Ub29sYmFyUHJlcGFyaW5nKGUpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgb25FZGl0b3JQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgIGlmICghY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICAgICAgZS5lZGl0b3JPcHRpb25zID0ge1xyXG4gICAgICAgICAgLi4uZS5lZGl0b3JPcHRpb25zLFxyXG4gICAgICAgICAgZWxlbWVudEF0dHI6IHtcclxuICAgICAgICAgICAgY2xhc3M6IFRIRU1FX0NMQVNTRVMubWRcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAoZS5lZGl0b3JOYW1lID09PSAnZHhTZWxlY3RCb3gnKSB7XHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMuZHJvcERvd25PcHRpb25zID0ge1xyXG4gICAgICAgICAgICAuLi5lLmVkaXRvck9wdGlvbnMuZHJvcERvd25PcHRpb25zLFxyXG4gICAgICAgICAgICBvblNob3dpbmc6IChhcmdzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCB3aWRnZXROYW1lID0gZ2V0V2lkZ2V0TmFtZSh3aWRnZXQpO1xyXG4gICAgICAgICAgICAgIGFyZ3MuY29tcG9uZW50Ll8kcG9wdXBDb250ZW50LmFkZENsYXNzKGBpc296LSR7d2lkZ2V0TmFtZX0tc2VsZWN0Ym94LXBvcHVwYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZS5lZGl0b3JOYW1lID09PSAnZHhDaGVja0JveCcpIHtcclxuICAgICAgICAgIFRoZW1lSGVscGVyLnNldEVsZW1lbnRTbWFsbFNpemUoZS5lZGl0b3JFbGVtZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHN3aXRjaCAoZS5wYXJlbnRUeXBlKSB7XHJcbiAgICAgICAgY2FzZSAnZmlsdGVyUm93JzpcclxuICAgICAgICAgIGNvbnN0IGFwcGx5RmlsdGVyOiBEZXZFeHByZXNzLnVpLmR4VGV4dEVkaXRvci5Qcm9wZXJ0aWVzWydvbkVudGVyS2V5J10gPSAoYXJncykgPT4ge1xyXG4gICAgICAgICAgICBlLmVsZW1lbnQgJiYgZS5lbGVtZW50LmZpbmQoJy5keC1hcHBseS1idXR0b24nKS50cmlnZ2VyKCdkeGNsaWNrJyk7XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vbkVudGVyS2V5ID0gYXBwbHlGaWx0ZXI7XHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25Gb2N1c091dCA9IGFwcGx5RmlsdGVyO1xyXG5cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdzZWFyY2hQYW5lbCc6XHJcbiAgICAgICAgICBjb25zdCBhcHBseVNlYXJjaDogRGV2RXhwcmVzcy51aS5keFRleHRFZGl0b3IuUHJvcGVydGllc1snb25FbnRlcktleSddID0gKGFyZ3MpID0+IHtcclxuICAgICAgICAgICAgZS5jb21wb25lbnQuc2VhcmNoQnlUZXh0KGFyZ3MuY29tcG9uZW50Lm9wdGlvbigndmFsdWUnKSk7XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZCA9ICgpID0+IHsgfTtcclxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vbkVudGVyS2V5ID0gYXBwbHlTZWFyY2g7XHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25Gb2N1c091dCA9IGFwcGx5U2VhcmNoO1xyXG5cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc2V0dGluZ3Mub3B0aW9ucz8ub25FZGl0b3JQcmVwYXJpbmcpIHtcclxuICAgICAgICBzZXR0aW5ncy5vcHRpb25zLm9uRWRpdG9yUHJlcGFyaW5nKGUpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgb25Db250ZXh0TWVudVByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgaWYgKCFjb25maWcuaXNMZWdhY3lSZW5kZXIpIHtcclxuICAgICAgICBpZiAoZS50YXJnZXQgPT09ICdjb250ZW50JyAmJiAhIXNldHRpbmdzLmV4cG9ydEZpbGVOYW1lKSB7XHJcbiAgICAgICAgICBpZiAoIWUuaXRlbXMpIHtcclxuICAgICAgICAgICAgZS5pdGVtcyA9IFtdO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGUuaXRlbXMucHVzaCh7XHJcbiAgICAgICAgICAgIHRleHQ6ICdFeHBvcnQgYWxsIGRhdGEnLFxyXG4gICAgICAgICAgICBvbkl0ZW1DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGUuY29tcG9uZW50LmV4cG9ydFRvRXhjZWwoZmFsc2UpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBpY29uOiAneGxzeGZpbGUnXHJcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhDb250ZXh0TWVudUl0ZW0pO1xyXG5cclxuICAgICAgICAgIGlmIChzZXR0aW5ncy5vcHRpb25zLnNlbGVjdGlvbj8ubW9kZSAhPT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkUm93cyA9IGUuY29tcG9uZW50LmdldFNlbGVjdGVkUm93S2V5cygpO1xyXG5cclxuICAgICAgICAgICAgZS5pdGVtcy5wdXNoKHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnRXhwb3J0IHNlbGVjdGVkIHJvd3MnLFxyXG4gICAgICAgICAgICAgIG9uSXRlbUNsaWNrOiAoKSA9PiBlLmNvbXBvbmVudC5leHBvcnRUb0V4Y2VsKHRydWUpLFxyXG4gICAgICAgICAgICAgIGljb246ICdleHBvcnRzZWxlY3RlZCcsXHJcbiAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFzZWxlY3RlZFJvd3MgfHwgIXNlbGVjdGVkUm93cy5sZW5ndGhcclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4Q29udGV4dE1lbnVJdGVtKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChzZXR0aW5ncy5vcHRpb25zPy5vbkNvbnRleHRNZW51UHJlcGFyaW5nKSB7XHJcbiAgICAgICAgc2V0dGluZ3Mub3B0aW9ucz8ub25Db250ZXh0TWVudVByZXBhcmluZyhlKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uRXhwb3J0aW5nOiAhIXNldHRpbmdzLmV4cG9ydEZpbGVOYW1lID8gY3JlYXRlR3JpZEV4cG9ydEZ1bmN0aW9uKHNldHRpbmdzLmV4cG9ydEZpbGVOYW1lKSA6IHZvaWQgMCxcclxuICB9IGFzIFQ7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IGNyZWF0ZURhdGFHcmlkLCBjcmVhdGVGdWxsU2NyZWVuRGF0YUdyaWQgfSBmcm9tICcuL0NyZWF0ZUZ1bGxTY3JlZW5HcmlkJztcclxuaW1wb3J0IHsgZ2V0R3JpZERlZmF1bHRPcHRpb25zLCBnZXRIYW5kbGVycywgSURhdGFHcmlkU2V0dGluZ3MgfSBmcm9tICcuL0RlZmF1bHRHcmlkQmFzZSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihlbDogSlF1ZXJ5LCBzZXR0aW5nczogSURhdGFHcmlkU2V0dGluZ3MpOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gZ2V0R3JpZERlZmF1bHRPcHRpb25zKHNldHRpbmdzKTtcclxuICBsZXQgbWVyZ2VkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBkZWZhdWx0T3B0aW9ucywgc2V0dGluZ3Mub3B0aW9ucyk7XHJcbiAgY29uc3QgaGFuZGxlcnMgPSBnZXRIYW5kbGVyczxEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zPignZHhEYXRhR3JpZCcsICQuZXh0ZW5kKHRydWUsIHt9LCBzZXR0aW5ncywgeyBvcHRpb25zOiBtZXJnZWRPcHRpb25zIH0pKTtcclxuXHJcbiAgbWVyZ2VkT3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBtZXJnZWRPcHRpb25zLCBoYW5kbGVycyk7XHJcblxyXG4gIGlmIChzZXR0aW5ncy5pc0Z1bGxTY3JlZW4gfHwgc2V0dGluZ3MuaXNGdWxsU2NyZWVuID09PSB1bmRlZmluZWQpIHtcclxuICAgIHJldHVybiBjcmVhdGVGdWxsU2NyZWVuRGF0YUdyaWQoZWwsIG1lcmdlZE9wdGlvbnMsIHNldHRpbmdzLmluUGFuZWxHcmlkKTtcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIGNyZWF0ZURhdGFHcmlkKGVsLCBtZXJnZWRPcHRpb25zKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElHcmlkQWRkaXRpb25hbE9wdGlvbnMgfSBmcm9tICcuL0NyZWF0ZUZ1bGxTY3JlZW5HcmlkJztcclxuaW1wb3J0IGRlZmF1bHRHcmlkIGZyb20gJy4vRGVmYXVsdEdyaWQnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oXHJcbiAgaWQ6IHN0cmluZywgZGF0YUdyaWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9uczogSUdyaWRBZGRpdGlvbmFsT3B0aW9ucyA9IHt9LFxyXG4gIGhlYWRlclRleHQ/OiBzdHJpbmcsIGhlYWRlckRlc2NyaXB0aW9uPzogc3RyaW5nXHJcbik6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgcmV0dXJuIGRlZmF1bHRHcmlkKCQoYCMke2lkfWApLCB7XHJcbiAgICBvcHRpb25zOiBkYXRhR3JpZE9wdGlvbnMsXHJcbiAgICBleHBvcnRGaWxlTmFtZTogYWRkaXRpb25hbE9wdGlvbnMuZXhwb3J0RmlsZU5hbWUsXHJcbiAgICBpblBhbmVsR3JpZDogYWRkaXRpb25hbE9wdGlvbnMuaW5QYW5lbEdyaWQsXHJcbiAgICBzaG93U3VtbWFyeUluQ29sdW1uOiBhZGRpdGlvbmFsT3B0aW9ucy5zaG93U3VtbWFyeUluQ29sdW1uLFxyXG4gICAgc3VtbWFyeUNvbHVtbjogYWRkaXRpb25hbE9wdGlvbnMuc3VtbWFyeUNvbHVtbixcclxuICAgIGhlYWRlckRlc2NyaXB0aW9uLFxyXG4gICAgdGl0bGU6IGhlYWRlclRleHRcclxuICB9KTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSVRyZWVMaXN0U2V0dGluZ3MsIGdldFRyZWVMaXN0RGVmYXVsdE9wdGlvbnMsIGdldEhhbmRsZXJzIH0gZnJvbSAnLi9EZWZhdWx0R3JpZEJhc2UnO1xyXG5pbXBvcnQgeyBjcmVhdGVGdWxsU2NyZWVuVHJlZUxpc3QgfSBmcm9tICcuL0NyZWF0ZUZ1bGxTY3JlZW5HcmlkJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKFxyXG4gIGlkOiBzdHJpbmcgfCBKUXVlcnksXHJcbiAgc2V0dGluZ3M6IElUcmVlTGlzdFNldHRpbmdzID0ge31cclxuKTogRGV2RXhwcmVzcy51aS5keFRyZWVMaXN0IHtcclxuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IGdldFRyZWVMaXN0RGVmYXVsdE9wdGlvbnMoc2V0dGluZ3MpO1xyXG4gIGxldCBtZXJnZWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zID0gJC5leHRlbmQoe30sIGRlZmF1bHRPcHRpb25zLCBzZXR0aW5ncy5vcHRpb25zKTtcclxuICBjb25zdCBoYW5kbGVycyA9IGdldEhhbmRsZXJzPERldkV4cHJlc3MudWkuZHhUcmVlTGlzdE9wdGlvbnM+KCdkeFRyZWVMaXN0JywgJC5leHRlbmQodHJ1ZSwge30sIHNldHRpbmdzLCB7IG9wdGlvbnM6IG1lcmdlZE9wdGlvbnMgfSkpO1xyXG5cclxuICBtZXJnZWRPcHRpb25zID0gJC5leHRlbmQodHJ1ZSwge30sIG1lcmdlZE9wdGlvbnMsIGhhbmRsZXJzKTtcclxuXHJcbiAgcmV0dXJuIGNyZWF0ZUZ1bGxTY3JlZW5UcmVlTGlzdChpZCwgbWVyZ2VkT3B0aW9ucywgc2V0dGluZ3MuaW5QYW5lbEdyaWQpO1xyXG59XHJcbiIsICJpbXBvcnQgQ3JvcHByIGZyb20gJ2Nyb3Bwcic7XHJcbmltcG9ydCB7IGNyZWF0ZURpYWxvZyB9IGZyb20gJy4uL1BvcHVwJztcclxuXHJcbmltcG9ydCBJbml0aWFsaXplZEV2ZW50SW5mbyA9IERldkV4cHJlc3MuZXZlbnRzLkluaXRpYWxpemVkRXZlbnRJbmZvO1xyXG5cclxuY29uc3QgYXZhdGFyU2l6ZSA9IHtcclxuICBoZWlnaHQ6IDMwMCxcclxuICB3aWR0aDogMzAwLFxyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRJbWFnZVRvUHJldmlldyAocHJldmlldzogSlF1ZXJ5LCBiYXNlNjRJbWc6IHN0cmluZyB8IG51bGwpIHtcclxuICBwcmV2aWV3LmF0dHIoJ3NyYycsIGJhc2U2NEltZyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUNvbnRlbnRNYXJrdXAgKGltYWdlQmFzZTY0OiBzdHJpbmcgfCBudWxsKSB7XHJcbiAgY29uc3QgJGF2YXRhclBvcHVwQ29udGVudCA9ICQoJzxkaXY+JylcclxuICAgIC5hZGRDbGFzcygnYXZhdGFyLXBvcHVwX19kcm9wem9uZScpO1xyXG4gIC8vLm9uKCdkcm9wJyAsIGV2ID0+IGV2LmRhdGFUcmFuc2Zlci5maWxlcylcclxuXHJcbiAgY29uc3QgJGNyb3BwZXJDb250YWluZXIgPSAkKCc8ZGl2PicpXHJcbiAgICAuYWRkQ2xhc3MoJ2F2YXRhci1wb3B1cF9fY3JvcC1jb250YWluZXInKVxyXG4gICAgLmFwcGVuZFRvKCRhdmF0YXJQb3B1cENvbnRlbnQpO1xyXG5cclxuICBjb25zdCAkY3JvcEltYWdlID0gJCgnPGltZyAvPicpLnByZXBlbmRUbygkY3JvcHBlckNvbnRhaW5lcik7XHJcblxyXG4gIHNldEltYWdlVG9QcmV2aWV3KCRjcm9wSW1hZ2UsIGltYWdlQmFzZTY0KTtcclxuXHJcbiAgY29uc3QgY3JvcHBlciA9IG5ldyBDcm9wcHIoJGNyb3BJbWFnZVswXSwge1xyXG4gICAgYXNwZWN0UmF0aW86IDEsXHJcbiAgICBzdGFydFNpemU6IFs5MCwgOTBdLFxyXG4gIH0pO1xyXG5cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgICRjb250ZW50OiAkYXZhdGFyUG9wdXBDb250ZW50LFxyXG4gICAgY3JvcHBlclxyXG4gIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNob3dQb3B1cCAoJGNvbnRlbnQ6IEpRdWVyeSwgY3JvcHBlcjogQ3JvcHByLCBvbkF2YXRhclVwZGF0ZWQ6IChwaG90b0Jhc2U2NDogc3RyaW5nKSA9PiB2b2lkKSB7XHJcbiAgY3JlYXRlRGlhbG9nKFxyXG4gICAge1xyXG4gICAgICB0aXRsZTogJ1VwZGF0ZSBwcm9maWxlIHBpY3R1cmUnLFxyXG4gICAgICBzaG93VGl0bGU6IHRydWUsXHJcbiAgICAgIGRyYWdFbmFibGVkOiBmYWxzZSxcclxuICAgICAgcmVzaXplRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSxcclxuICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXHJcbiAgICAgIG1heFdpZHRoOiAxMDI0LFxyXG4gICAgICBvbkluaXRpYWxpemVkOiAoZTogSW5pdGlhbGl6ZWRFdmVudEluZm88RGV2RXhwcmVzcy51aS5keFBvcHVwPikgPT4ge1xyXG4gICAgICAgIGUuY29tcG9uZW50ICYmIGUuY29tcG9uZW50Lm9wdGlvbignZnVsbFNjcmVlbicsIHdpbmRvdy5pbm5lcldpZHRoIDw9IDEwMjQpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgJGNvbnRlbnQsXHJcbiAgICB7XHJcbiAgICAgIHRleHQ6ICdVcGRhdGUnLFxyXG4gICAgICBvbkNsaWNrOiAoY2xvc2UpID0+IHtcclxuICAgICAgICBjb25zdCBjcm9wT3B0aW9ucyA9IGNyb3BwZXIuZ2V0VmFsdWUoKTtcclxuICAgICAgICBjb25zdCAkY2FudmFzOiBKUXVlcnk8SFRNTENhbnZhc0VsZW1lbnQ+ID0gJCgnPGNhbnZhcz4nKS5hdHRyKCdoZWlnaHQnLCBhdmF0YXJTaXplLmhlaWdodCkuYXR0cignd2lkdGgnLCBhdmF0YXJTaXplLndpZHRoKSBhcyBKUXVlcnk8SFRNTENhbnZhc0VsZW1lbnQ+O1xyXG4gICAgICAgIGNvbnN0IGN0eCA9ICgkY2FudmFzWzBdIGFzIGFueSkuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgICAgICBjb25zdCAkaW1hZ2UgPSAkY29udGVudC5maW5kKCdpbWcuY3JvcHByLWltYWdlJylbMF07XHJcblxyXG4gICAgICAgIGN0eC5kcmF3SW1hZ2UoJGltYWdlLCBjcm9wT3B0aW9ucy54LCBjcm9wT3B0aW9ucy55LCBjcm9wT3B0aW9ucy53aWR0aCwgY3JvcE9wdGlvbnMuaGVpZ2h0LCAwLCAwLCBhdmF0YXJTaXplLndpZHRoLCBhdmF0YXJTaXplLmhlaWdodCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNyb3BwZWQgPSAkY2FudmFzWzBdLnRvRGF0YVVSTCgnaW1hZ2UvanBlZycsIDAuOSk7XHJcblxyXG4gICAgICAgIG9uQXZhdGFyVXBkYXRlZChjcm9wcGVkKTtcclxuICAgICAgICBjbG9zZSgpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiAnQ2FuY2VsJyxcclxuICAgICAgb25DbGljazogKGNsb3NlKSA9PiBjbG9zZSgpXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNob3cgKGltYWdlQmFzZTY0OiBzdHJpbmcgfCBudWxsLCBvbkF2YXRhclVwZGF0ZWQ6IChwaG90b0Jhc2U2NDogc3RyaW5nKSA9PiB2b2lkKSB7XHJcbiAgY29uc3QgY29udGVudCA9IGNyZWF0ZUNvbnRlbnRNYXJrdXAoaW1hZ2VCYXNlNjQpO1xyXG5cclxuICBzaG93UG9wdXAoY29udGVudC4kY29udGVudCwgY29udGVudC5jcm9wcGVyLCBvbkF2YXRhclVwZGF0ZWQpO1xyXG59XHJcbiIsICJleHBvcnQgY29uc3QgZ2V0QmFzZTY0ID0gKGZpbGU6IEZpbGUpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+ID0+IHtcclxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcblxyXG4gICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBmaWxlUmVhZGVyLnJlc3VsdDtcclxuICAgICAgICByZXNvbHZlKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnID8gcmVzdWx0IDogbnVsbCk7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBmaWxlUmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcblxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgIH1cclxuICB9KTtcclxufTtcclxuIiwgImltcG9ydCB7SVJlbmRlcmVkfSBmcm9tICcuLi8uLi9Db21wb25lbnRzL0NvcmUnO1xyXG5pbXBvcnQge0RldkV4cHJlc3NFdmVudEFyZ3N9IGZyb20gJy4uLy4uL1V0aWxzL0RldkV4cHJlc3NFdmVudEFyZ3MnO1xyXG5pbXBvcnQgeyBzaG93IH0gZnJvbSAnLi4vLi4vV2lkZ2V0cy9JbWFnZUNyb3BEaWFsb2cnO1xyXG5pbXBvcnQge2dldEJhc2U2NH0gZnJvbSAnLi4vLi4vV2lkZ2V0cy9JbWFnZUNyb3BEaWFsb2cvSGVscGVycyc7XHJcbmltcG9ydCBkeFRleHRCb3hPcHRpb25zID0gRGV2RXhwcmVzcy51aS5keFRleHRCb3hPcHRpb25zO1xyXG5pbXBvcnQgZHhUZXh0Qm94ID0gRGV2RXhwcmVzcy51aS5keFRleHRCb3g7XHJcbmltcG9ydCBJc3pvbGVhVUkgZnJvbSAnLi4vLi4vaW5kZXgnO1xyXG5cclxuY29uc3QgbWF4RmlsZU1iU2l6ZSA9IDEwO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQWNjb3VudFNldHRpbmdzRGF0YSB7XHJcbiAgVXNlck5hbWU6IHN0cmluZztcclxuICBGaXJzdE5hbWU6IHN0cmluZztcclxuICBMYXN0TmFtZTogc3RyaW5nO1xyXG4gIFBob25lTnVtYmVyOiBzdHJpbmc7XHJcbiAgRW1haWw6IHN0cmluZztcclxuICBPbGRQYXNzd29yZDogc3RyaW5nO1xyXG4gIE5ld1Bhc3N3b3JkOiBzdHJpbmc7XHJcbiAgTmV3UGFzc3dvcmRSZXBlYXQ6IHN0cmluZztcclxuICBBdmF0YXI6IHN0cmluZztcclxuICBIYXNDaGFuZ2VzOiBib29sZWFuO1xyXG4gIEVycm9yTWVzc2FnZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyIHtcclxuICBJZDogc3RyaW5nO1xyXG4gIFVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgRmlyc3ROYW1lOiBzdHJpbmc7XHJcbiAgTGFzdE5hbWU6IHN0cmluZztcclxuICBVc2VyQXZhdGFyOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBBY2NvdW50U2V0dGluZ3NQYWdlIGltcGxlbWVudHMgSVJlbmRlcmVkIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRVc2VySW5mbzogSVVzZXIgfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIHJlYWRvbmx5IGFjY291bnRTZXR0aW5nc0RhdGE6IElBY2NvdW50U2V0dGluZ3NEYXRhIHwgdW5kZWZpbmVkO1xyXG4gIHB1YmxpYyByZWFkb25seSBmb3JtQWN0aW9uOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBhdmF0YXJVcGxvYWRlcjogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlciB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGFjY291bnRTZXR0aW5nc0Zvcm06IERldkV4cHJlc3MudWkuZHhGb3JtIHwgdW5kZWZpbmVkO1xyXG5cclxuICAvLyBlbGVtZW50c1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgXyRyb290RWxlbWVudDogSlF1ZXJ5PEhUTUxEaXZFbGVtZW50PiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICAkY29udGFpbmVyOiBKUXVlcnk8SFRNTERpdkVsZW1lbnQ+LFxyXG4gICAgZm9ybUFjdGlvbjogc3RyaW5nLFxyXG4gICAgYWNjb3VudFNldHRpbmdzRGF0YTogSUFjY291bnRTZXR0aW5nc0RhdGEgfCB1bmRlZmluZWQsXHJcbiAgICB1c2VySW5mbzogSVVzZXIgfCB1bmRlZmluZWRcclxuICApIHtcclxuICAgIHRoaXMuYWNjb3VudFNldHRpbmdzRGF0YSA9IGFjY291bnRTZXR0aW5nc0RhdGE7XHJcbiAgICB0aGlzLmN1cnJlbnRVc2VySW5mbyA9IHVzZXJJbmZvO1xyXG4gICAgdGhpcy5fJHJvb3RFbGVtZW50ID0gJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZm9ybUFjdGlvbiA9IGZvcm1BY3Rpb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgdGhpcy5yZW5kZXJVcGxvYWRlcih0aGlzLiRyb290RWxlbWVudCk7XHJcbiAgICB0aGlzLnJlbmRlckFjY291bnRTZXR0aW5nc0Zvcm0odGhpcy4kcm9vdEVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgJHJvb3RFbGVtZW50KCkge1xyXG4gICAgaWYgKCF0aGlzLl8kcm9vdEVsZW1lbnQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgcm9vdCBlbGVtZW50IGlzIHVuZGVmaW5lZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl8kcm9vdEVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclVwbG9hZGVyKCRjb250YWluZXI6IEpRdWVyeSkge1xyXG4gICAgdGhpcy5hdmF0YXJVcGxvYWRlciA9ICQoJzxkaXY+JylcclxuICAgICAgLmFkZENsYXNzKCdhdmF0YXItcG9wdXBfX3VwbG9hZGVyJylcclxuICAgICAgLmR4RmlsZVVwbG9hZGVyKHtcclxuICAgICAgICBtdWx0aXBsZTogZmFsc2UsXHJcbiAgICAgICAgdXBsb2FkTW9kZTogJ3VzZUZvcm0nLFxyXG4gICAgICAgIGFjY2VwdDogJ2ltYWdlLyonLFxyXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICAgIG1heEZpbGVTaXplOiBtYXhGaWxlTWJTaXplICogMTAwMDAwMCxcclxuXHJcbiAgICAgICAgb25WYWx1ZUNoYW5nZWQ6IChlOiBEZXZFeHByZXNzRXZlbnRBcmdzPERldkV4cHJlc3MudWkuZHhGaWxlVXBsb2FkZXJPcHRpb25zLCAnb25WYWx1ZUNoYW5nZWQnPikgPT4ge1xyXG4gICAgICAgICAgaWYgKCFlLmNvbXBvbmVudCB8fCAhZS52YWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb25zdCBmaWxlID0gZS52YWx1ZVswXTtcclxuICAgICAgICAgIGNvbnN0IG1heFNpemUgPSBlLmNvbXBvbmVudC5vcHRpb24oJ21heEZpbGVTaXplJykgfHwgbWF4RmlsZU1iU2l6ZTtcclxuXHJcbiAgICAgICAgICBpZiAoIWZpbGUgfHwgZmlsZS5zaXplID4gbWF4U2l6ZSkge1xyXG4gICAgICAgICAgICBEZXZFeHByZXNzLnVpLm5vdGlmeShgRmlsZSBzaXplIHNob3VsZCBiZSBsZXNzIHRoYW4gJHttYXhGaWxlTWJTaXplfSBNQi4gUGxlYXNlIHNlbGVjdCBhbm90aGVyIGZpbGVgLCAnZXJyb3InLCA1MDAwKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBnZXRCYXNlNjQoZmlsZSlcclxuICAgICAgICAgICAgLnRoZW4oKGltYWdlQmFzZTY0KSA9PiB7XHJcbiAgICAgICAgICAgICAgc2hvdyhpbWFnZUJhc2U2NCwgKG5ld0ltZ1NvdXJjZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY2NvdW50U2V0dGluZ3NGb3JtPy51cGRhdGVEYXRhKCdBdmF0YXInLCBuZXdJbWdTb3VyY2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY2NvdW50U2V0dGluZ3NGb3JtPy5yZXBhaW50KCk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IERldkV4cHJlc3MudWkubm90aWZ5KGVycm9yLCAnZXJyb3InLCAzMDAwKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSlcclxuICAgICAgLmFwcGVuZFRvKCRjb250YWluZXIpXHJcbiAgICAgIC5keEZpbGVVcGxvYWRlcignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQWNjb3VudFNldHRpbmdzRm9ybSgkY29udGFpbmVyOiBKUXVlcnkpIHtcclxuICAgIGlmICh0aGlzLmFjY291bnRTZXR0aW5nc0Zvcm0pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWNjb3VudFNldHRpbmdzRm9ybSA9ICQoJzxmb3JtIC8+JylcclxuICAgICAgLmF0dHIoJ2FjdGlvbicsIHRoaXMuZm9ybUFjdGlvbilcclxuICAgICAgLmF0dHIoJ21ldGhvZCcsICdwb3N0JylcclxuICAgICAgLmFkZENsYXNzKCdhY2NvdW50LXNldHRpbmdzX19mb3JtJylcclxuICAgICAgLmFkZENsYXNzKCdmb3JtLWNvbnRlbnQnKVxyXG4gICAgICAuYXBwZW5kVG8oJGNvbnRhaW5lcilcclxuICAgICAgLmR4Rm9ybSh0aGlzLmdldEZvcm1PcHRpb25zKCkpXHJcbiAgICAgIC5keEZvcm0oJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgaWYgKHRoaXMuYWNjb3VudFNldHRpbmdzRGF0YT8uSGFzQ2hhbmdlcyAmJiAhdGhpcy5hY2NvdW50U2V0dGluZ3NEYXRhLkVycm9yTWVzc2FnZSkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IElzem9sZWFVSS53aWRnZXRzLm5vdGlmeSgnQ2hhbmdlcyBoYXZlIGJlZW4gc2F2ZWQnLCB0cnVlKSwgNTAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Rm9ybU9wdGlvbnMoKSA6IERldkV4cHJlc3MudWkuZHhGb3JtT3B0aW9ucyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBmb3JtRGF0YTogdGhpcy5hY2NvdW50U2V0dGluZ3NEYXRhLFxyXG4gICAgICBtaW5Db2xXaWR0aDogMjAwLFxyXG4gICAgICBsYWJlbExvY2F0aW9uOiAndG9wJyxcclxuICAgICAgYWxpZ25JdGVtTGFiZWxzOiB0cnVlLFxyXG4gICAgICBzaG93VmFsaWRhdGlvblN1bW1hcnk6IHRydWUsXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgICAgICBjb2xDb3VudDogMTYsXHJcbiAgICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgY29sU3BhbjogNixcclxuICAgICAgICAgICAgICBjYXB0aW9uOiAnUHJvZmlsZSBQaWN0dXJlJyxcclxuICAgICAgICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ0F2YXRhcicsXHJcbiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgJGF2YXRhclZpZXdDb250YWluZXIgPSAkKCc8ZGl2PicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2FjY291bnQtc2V0dGluZ3NfX2F2YXRhci12aWV3LWNvbnRhaW5lcicpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCAkYXZhdGFyQ29udGFpbmVyID0gJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdhY2NvdW50LXNldHRpbmdzX19hdmF0YXInKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgLmFkZCgkYXZhdGFyVmlld0NvbnRhaW5lcilcclxuICAgICAgICAgICAgICAgICAgICAgIC5hZGQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQoJzxkaXY+JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2FjY291bnQtc2V0dGluZ3NfX2F2YXRhci1idXR0b24nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5keEJ1dHRvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMjAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2RlZmF1bHQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ3Bob3RvJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICdVcGxvYWQgbmV3IGltYWdlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB0aGlzLmF2YXRhclVwbG9hZGVyICYmIHRoaXMuYXZhdGFyVXBsb2FkZXIub3B0aW9uKCdkaWFsb2dUcmlnZ2VyJywgZS5lbGVtZW50KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICApLmFwcGVuZFRvKCRhdmF0YXJDb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdmF0YXJCYXNlNjQgPSBkYXRhLmVkaXRvck9wdGlvbnMudmFsdWUgfHwgdGhpcy5jdXJyZW50VXNlckluZm8/LlVzZXJBdmF0YXI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhdmF0YXJCYXNlNjQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICQoJzxpbWc+JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdhY2NvdW50LXNldHRpbmdzX19hdmF0YXItdmlldycpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdzcmMnLCBhdmF0YXJCYXNlNjQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkYXZhdGFyVmlld0NvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZWRpdG9yT3B0aW9ucy52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKCc8aW5wdXQ+JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2FjY291bnQtc2V0dGluZ3NfX2F2YXRhci1pbnB1dCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3R5cGUnLCAndGV4dCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ25hbWUnLCAnQXZhdGFyJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJGF2YXRhckNvbnRhaW5lcilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsKGRhdGEuZWRpdG9yT3B0aW9ucy52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICQoJzxpPicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcyhbJ2FjY291bnQtc2V0dGluZ3NfX2F2YXRhci12aWV3LWRlZmF1bHQnLCAnZmFzJywgJ2ZhLXVzZXInXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRhdmF0YXJWaWV3Q29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmKHRoaXMuYXZhdGFyVXBsb2FkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgIHRoaXMuYXZhdGFyVXBsb2FkZXIub3B0aW9uKCdkcm9wWm9uZScsICRhdmF0YXJDb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgdGhpcy5hdmF0YXJVcGxvYWRlci5vcHRpb24oJ29uRHJvcFpvbmVFbnRlcicsICgpID0+ICRhdmF0YXJDb250YWluZXIuYWRkQ2xhc3MoJ2Ryb3AnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICB0aGlzLmF2YXRhclVwbG9hZGVyLm9wdGlvbignb25Ecm9wWm9uZUxlYXZlJywgKCkgPT4gJGF2YXRhckNvbnRhaW5lci5yZW1vdmVDbGFzcygnZHJvcCcpKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkYXZhdGFyQ29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgaXRlbVR5cGU6ICdlbXB0eScsXHJcbiAgICAgICAgICAgICAgY29sU3BhbjogMVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgY29sU3BhbjogOSxcclxuICAgICAgICAgICAgICBjYXB0aW9uOiAnQWNjb3VudCBEZXRhaWxzJyxcclxuICAgICAgICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ0Vycm9yTWVzc2FnZScsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZGF0YSAmJiBkYXRhLmVkaXRvck9wdGlvbnMgJiYgZGF0YS5lZGl0b3JPcHRpb25zLnZhbHVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3JNZXNzYWdlICYmICQoJzxkaXYgLz4nKS50ZXh0KGVycm9yTWVzc2FnZSkuYWRkQ2xhc3MoJ2Vycm9yLW1lc3NhZ2UnKTtcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAvLyB7XHJcbiAgICAgICAgICAgICAgICAvLyAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgIC8vICAgZGF0YUZpZWxkOiAnSGFzQ2hhbmdlcycsXHJcbiAgICAgICAgICAgICAgICAvLyAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgdmlzaWJsZTogZmFsc2VcclxuICAgICAgICAgICAgICAgIC8vICAgfSxcclxuICAgICAgICAgICAgICAgIC8vICAgdmlzaWJsZTogdGhpcy5hY2NvdW50U2V0dGluZ3NEYXRhPy5IYXNDaGFuZ2VzICYmICF0aGlzLmFjY291bnRTZXR0aW5nc0RhdGEuRXJyb3JNZXNzYWdlLFxyXG4gICAgICAgICAgICAgICAgLy8gICB0ZW1wbGF0ZTogKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybiAkKCc8ZGl2IC8+JykudGV4dCgnQ2hhbmdlcyBoYXZlIGJlZW4gc2F2ZWQnKS5hZGRDbGFzcygnc3VjY2Vzcy1tZXNzYWdlJyk7XHJcbiAgICAgICAgICAgICAgICAvLyAgIH0sXHJcbiAgICAgICAgICAgICAgICAvLyB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ1VzZXJOYW1lJyxcclxuICAgICAgICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnVXNlcm5hbWUnXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ3JlcXVpcmVkJywgbWVzc2FnZTogJ1VzZXJuYW1lIGlzIHJlcXVpcmVkJyB9LFxyXG4gICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgICAgICAgICAgICAgY29sQ291bnQ6IDIsXHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnRmlyc3ROYW1lJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICdGaXJzdCBOYW1lJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdyZXF1aXJlZCcsIG1lc3NhZ2U6ICdGaXJzdCBOYW1lIGlzIHJlcXVpcmVkJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnTGFzdE5hbWUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJ0xhc3QgTmFtZSdcclxuICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAncmVxdWlyZWQnLCBtZXNzYWdlOiAnTGFzdCBOYW1lIGlzIHJlcXVpcmVkJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdQaG9uZU51bWJlcicsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1Bob25lIE51bWJlcidcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdFbWFpbCcsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ0VtYWlsJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdyZXF1aXJlZCcsIG1lc3NhZ2U6ICdFbWFpbCBpcyByZXF1aXJlZCcgfSxcclxuICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdlbWFpbCcsIG1lc3NhZ2U6ICdQbGVhc2UgdXNlIGEgdmFsaWQgZW1haWwgYWRkcmVzcycgfVxyXG4gICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGNzc0NsYXNzOiAnYWNjb3VudC1zZXR0aW5nc19fcGFzc3dvcmQtYXJlYScsXHJcbiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiAkKCc8ZGl2IC8+JykuY3NzKCdmb250LXdlaWdodCcsICdib2xkJykudGV4dCgnQ2hhbmdlIFBhc3N3b3JkJylcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnT2xkUGFzc3dvcmQnLFxyXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdDdXJyZW50IHBhc3N3b3JkJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogJ3Bhc3N3b3JkJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgICAgICAgICAgICAgICAgIHJlZXZhbHVhdGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2FsbGJhY2s6IChwYXJhbXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoISF0aGlzLmFjY291bnRTZXR0aW5nc0Zvcm0/LmdldEVkaXRvcignTmV3UGFzc3dvcmQnKT8ub3B0aW9uKCd2YWx1ZScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhcGFyYW1zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnT2xkIHBhc3N3b3JkIGlzIHJlcXVpcmVkJ1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnTmV3UGFzc3dvcmQnLFxyXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdOZXcgcGFzc3dvcmQnXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBtb2RlOiAncGFzc3dvcmQnLFxyXG4gICAgICAgICAgICAgICAgICAgIGlucHV0QXR0cjogeyBhdXRvY29tcGxldGU6ICduZXctcGFzc3dvcmQnIH1cclxuICAgICAgICAgICAgICAgICAgfSBhcyBkeFRleHRCb3hPcHRpb25zPGR4VGV4dEJveD4sXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ05ld1Bhc3N3b3JkUmVwZWF0JyxcclxuICAgICAgICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnQ29uZmlybSBuZXcgcGFzc3dvcmQnXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBtb2RlOiAncGFzc3dvcmQnXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcmVldmFsdWF0ZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25DYWxsYmFjazogKHBhcmFtcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuYWNjb3VudFNldHRpbmdzRm9ybT8uZ2V0RWRpdG9yKCdOZXdQYXNzd29yZCcpPy5vcHRpb24oJ3ZhbHVlJykgfHwgJycpID09PSBwYXJhbXMudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1Bhc3N3b3JkIG1pc21hdGNoJyxcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ2J1dHRvbicsXHJcbiAgICAgICAgICAgICAgICAgIGhvcml6b250YWxBbGlnbm1lbnQ6ICdyaWdodCcsXHJcbiAgICAgICAgICAgICAgICAgIGNzc0NsYXNzOiAnYWNjb3VudC1zZXR0aW5nc19fc3VibWl0LWJ0bicsXHJcbiAgICAgICAgICAgICAgICAgIGJ1dHRvbk9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnU2F2ZSBDaGFuZ2VzJyxcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlU3VibWl0QmVoYXZpb3I6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDIwMCxcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb25maXJtKHRleHQ6IHN0cmluZyk6IEpRdWVyeURlZmVycmVkPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0ICRkZWZmZXJlZDogSlF1ZXJ5RGVmZXJyZWQ8Ym9vbGVhbj4gPSAkLkRlZmVycmVkKCk7XHJcbiAgICBjb25zdCAkZWxlbWVudCA9ICQoJzxkaXYvPicpLmFwcGVuZFRvKHdpbmRvdy5kb2N1bWVudC5ib2R5KTtcclxuXHJcbiAgICBjb25zdCBwb3B1cCA9ICRlbGVtZW50LmR4UG9wdXAoe1xyXG4gICAgICAgIHNob3dUaXRsZTogZmFsc2UsXHJcbiAgICAgICAgaGVpZ2h0OiAxNDAsXHJcbiAgICAgICAgd2lkdGg6IDM3MCxcclxuICAgICAgICBjb250ZW50VGVtcGxhdGU6ICgkY29udGVudCkgPT4ge1xyXG4gICAgICAgICAgICAkY29udGVudC5hZGRDbGFzcygnaXN6b2xlYS1keC1jb25maXJtJyk7XHJcblxyXG4gICAgICAgICAgICAkKCc8Yi8+JykuYWRkQ2xhc3MoJ21lc3NhZ2UnKS50ZXh0KHRleHQpLmFwcGVuZFRvKCRjb250ZW50KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0ICRidXR0b25zU2VjdGlvbiA9ICQoJzxkaXYvPicpLmFkZENsYXNzKCdidXR0b25zJykuYXBwZW5kVG8oJGNvbnRlbnQpO1xyXG5cclxuICAgICAgICAgICAgJCgnPGRpdi8+JykuZHhCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgdGV4dDogJ0RlbGV0ZScsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnZGFuZ2VyJyxcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBwb3B1cC5oaWRlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICRkZWZmZXJlZC5yZXNvbHZlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KS5hcHBlbmRUbygkYnV0dG9uc1NlY3Rpb24pO1xyXG5cclxuICAgICAgICAgICAgJCgnPGRpdi8+JykuZHhCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgdGV4dDogJ0NhbmNlbCcsXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9wdXAuaGlkZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAkZGVmZmVyZWQucmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLmFwcGVuZFRvKCRidXR0b25zU2VjdGlvbik7XHJcbiAgICAgICAgfSxcclxuICAgICAgb25IaWRkZW46ICgpID0+IHtcclxuICAgICAgICBwb3B1cC5kaXNwb3NlKCk7XHJcbiAgICAgICAgcG9wdXAuZWxlbWVudCgpLnJlbW92ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KS5keFBvcHVwKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHBvcHVwLnNob3coKTtcclxuXHJcbiAgICByZXR1cm4gJGRlZmZlcmVkO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTG9nb1NldHRpbmdzIH0gZnJvbSAnLi4vRGF0YSc7XHJcbmltcG9ydCB7IExPR09fU0VUVElOR1NfQ0FDSEVfS0VZIH0gZnJvbSAnLi4vQ29uc3RhbnRzL0NhY2hlS2V5cyc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi4vQ29uZmlnL0luZGV4JztcclxuaW1wb3J0IHsgSUJhY2tncm91bmRQaG90b1ZpZXdlclNldHRpbmdzIH0gZnJvbSAnLi4vRGF0YS9JQmFja2dyb3VuZFBob3RvVmlld2VyU2V0dGluZ3MnO1xyXG5pbXBvcnQgeyBzaG93IGFzIHNob3dJbWFnZVZpZXdlciB9IGZyb20gJy4uL1dpZGdldHMvQmFja2dyb3VuZEltYWdlVmlld2VyJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYW5kaW5nKCRjb250YWluZXI6IEpRdWVyeSwgbG9nb1NldHRpbmdzOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nLCBzaG93U2lnbkluQnV0dG9uOiBib29sZWFuLCBwaG90b0dhbGxlcnlTZXR0aW5nczogSUJhY2tncm91bmRQaG90b1ZpZXdlclNldHRpbmdzID0geyBlbmFibGVkOiBmYWxzZSB9KSB7XHJcbiAgZ2V0TG9nb1NldHRpbmdzKGxvZ29TZXR0aW5ncykudGhlbigoc2V0dGluZ3MpID0+IHtcclxuICAgIGNyZWF0ZUxhbmRpbmdNYXJrdXAoJGNvbnRhaW5lciwgc2V0dGluZ3MsIHNob3dTaWduSW5CdXR0b24sIHBob3RvR2FsbGVyeVNldHRpbmdzKTtcclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0TG9nb1NldHRpbmdzKGxvZ29TZXR0aW5nczogSUxvZ29TZXR0aW5ncyB8IHN0cmluZyk6IEpRdWVyeURlZmVycmVkPElMb2dvU2V0dGluZ3M+IHtcclxuICBjb25zdCAkZGVmZmVyZWQ6IEpRdWVyeURlZmVycmVkPElMb2dvU2V0dGluZ3M+ID0gJC5EZWZlcnJlZCgpO1xyXG5cclxuICBpZiAodHlwZW9mIGxvZ29TZXR0aW5ncyA9PT0gJ3N0cmluZycpIHtcclxuICAgIGNvbnN0IGNhY2hlZFNldHRpbmdzUmF3ID0gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVkpO1xyXG4gICAgaWYgKGNhY2hlZFNldHRpbmdzUmF3KSB7XHJcbiAgICAgICRkZWZmZXJlZC5yZXNvbHZlKEpTT04ucGFyc2UoY2FjaGVkU2V0dGluZ3NSYXcpIGFzIElMb2dvU2V0dGluZ3MpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2VuZFJlcXVlc3QobG9nb1NldHRpbmdzLCAncG9zdCcpLmRvbmUoKGRhdGEpID0+IHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSB7XHJcbiAgICAgICAgICBhcHBsaWNhdGlvbk5hbWU6IGRhdGEuQXBwbGljYXRpb25OYW1lLFxyXG4gICAgICAgICAgYnVzaW5lc3NOYW1lOiBkYXRhLkJ1c2luZXNzTmFtZSxcclxuICAgICAgICAgIGxhbmRpbmdQYWdlTG9nbzogZGF0YS5MYW5kaW5nUGFnZUxvZ28sXHJcbiAgICAgICAgICBsb2dvSW1hZ2U6IGRhdGEuTG9nb0ltYWdlLFxyXG4gICAgICAgICAgZGVzY3JpcHRpb246IGRhdGEuRGVzY3JpcHRpb25cclxuICAgICAgICB9IGFzIElMb2dvU2V0dGluZ3M7XHJcbiAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVksIEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpO1xyXG4gICAgICAgICRkZWZmZXJlZC5yZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICAkZGVmZmVyZWQucmVzb2x2ZShsb2dvU2V0dGluZ3MpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuICRkZWZmZXJlZDtcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlTGFuZGluZ01hcmt1cCgkY29udGFpbmVyOiBKUXVlcnksIGxvZ29TZXR0aW5nczogSUxvZ29TZXR0aW5ncywgc2hvd1NpZ25JbkJ1dHRvbjogYm9vbGVhbiwgcGhvdG9HYWxsZXJ5U2V0dGluZ3M6IElCYWNrZ3JvdW5kUGhvdG9WaWV3ZXJTZXR0aW5ncykge1xyXG4gIGNvbnN0ICRsYW5kaW5nUGFnZSA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnaXN6b2xlYS1sYW5kaW5nLXBhZ2UnKS5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuICBsZXQgJGxhbmRpbmdDb250YWluZXIgPSAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2xhbmRpbmctY29udGFpbmVyJykuYXBwZW5kVG8oJGxhbmRpbmdQYWdlKTtcclxuXHJcbiAgaWYocGhvdG9HYWxsZXJ5U2V0dGluZ3MuZW5hYmxlZCkge1xyXG4gICAgJGxhbmRpbmdQYWdlLmFkZENsYXNzKCdwaG90by1nYWxsZXJ5LW1vZGUnKTtcclxuICB9IGVsc2Uge1xyXG4gICAgJGxhbmRpbmdQYWdlLmFkZENsYXNzKCdkZWZhdWx0LW1vZGUnKTtcclxuICAgICRsYW5kaW5nQ29udGFpbmVyID0gJGxhbmRpbmdQYWdlO1xyXG4gIH1cclxuXHJcbiAgJCgnPGRpdiAvPicpLmFkZENsYXNzKCdsb2dvLWNvbnRhaW5lcicpXHJcbiAgICAuYXBwZW5kVG8oJGxhbmRpbmdDb250YWluZXIpXHJcbiAgICAuYXBwZW5kKFxyXG4gICAgICAkKCc8aW1nIC8+JykuYXR0cignc3JjJywgbG9nb1NldHRpbmdzLmxhbmRpbmdQYWdlTG9nbykuYWRkQ2xhc3MoJ2xvZ28tbGFyZ2UnKS5hcHBlbmRUbygkbGFuZGluZ0NvbnRhaW5lciksXHJcbiAgICAgICQoJzxzcGFuIC8+JykuYWRkQ2xhc3MoJ2J1c2luZXNzLW5hbWUnKS50ZXh0KGxvZ29TZXR0aW5ncy5idXNpbmVzc05hbWUpLmFwcGVuZFRvKCRsYW5kaW5nQ29udGFpbmVyKVxyXG4gICk7XHJcblxyXG4gICQoJzxoMiAvPicpLnRleHQoYFdlbGNvbWUgdG8gJHtsb2dvU2V0dGluZ3MuZGVzY3JpcHRpb259YCkuYXBwZW5kVG8oJGxhbmRpbmdDb250YWluZXIpO1xyXG5cclxuICBpZiAoc2hvd1NpZ25JbkJ1dHRvbikge1xyXG4gICAgJCgnPGRpdiAvPicpLmFkZENsYXNzKCdzaWduLWluLWJ1dHRvbicpLmFwcGVuZCgkKCc8ZGl2IC8+JykuZHhCdXR0b24oe1xyXG4gICAgICB0ZXh0OiAnU2lnbiBJbicsXHJcbiAgICAgIHdpZHRoOiBjb25maWcuaXNMZWdhY3lSZW5kZXIgPyB1bmRlZmluZWQgOiAnMjAwcHgnLFxyXG4gICAgICB0eXBlOiAnZGVmYXVsdCcsXHJcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuY2xlYXIoKTtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGAvSG9tZS9Mb2dpbj9yZXR1cm5Vcmw9JHtlbmNvZGVVUklDb21wb25lbnQod2luZG93LmxvY2F0aW9uLmhyZWYudG9TdHJpbmcoKSl9YDtcclxuICAgICAgfVxyXG4gICAgfSkpLmFwcGVuZFRvKCRsYW5kaW5nQ29udGFpbmVyKTtcclxuICB9XHJcblxyXG4gIGlmKHBob3RvR2FsbGVyeVNldHRpbmdzLmVuYWJsZWQpIHtcclxuICAgIHNob3dJbWFnZVZpZXdlcihcclxuICAgICAgcGhvdG9HYWxsZXJ5U2V0dGluZ3MuJGNvbnRhaW5lciB8fCAkbGFuZGluZ1BhZ2UsXHJcbiAgICAgIHBob3RvR2FsbGVyeVNldHRpbmdzLmltYWdlVXJscyB8fCBbXSxcclxuICAgICAgcGhvdG9HYWxsZXJ5U2V0dGluZ3MuaW1nQ2hhbmdlSW50ZXJ2YWxTZWMgfHwgOCxcclxuICAgICAgcGhvdG9HYWxsZXJ5U2V0dGluZ3MudHJhbnNpdGlvblRpbWVTZWMgfHwgMlxyXG4gICAgKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBY2Nlc3NEZW5pZWRUb1JlcG9ydCgkY29udGFpbmVyOiBKUXVlcnksIGFsbG93ZWRSZXBvcnRSb2xlczogc3RyaW5nW10sIGFsbG93ZWRDb25uZWN0aW9uUm9sZXM6IHN0cmluZ1tdKSB7XHJcbiAgY29uc3QgJGlzem9sZWFDb250YWluZXIgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdhY2Nlc3MtZGVuaWVkLXRvLXJlcG9ydC1wYWdlJykuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcbiAgJCgnPGgyPicpLmFkZENsYXNzKCdlcnJvci10ZXh0JykudGV4dCgnQWNjZXNzIGRlbmllZCB0byB0aGUgcmVwb3J0JykuYXBwZW5kVG8oJGlzem9sZWFDb250YWluZXIpO1xyXG5cclxuICBpZiAoYWxsb3dlZFJlcG9ydFJvbGVzICYmIGFsbG93ZWRSZXBvcnRSb2xlcy5sZW5ndGgpIHtcclxuICAgIGNvbnN0IHJlcG9ydFJvbGVzID0gYWxsb3dlZFJlcG9ydFJvbGVzLm1hcCgocikgPT4gJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ3JvbGUnKS50ZXh0KHIpKTtcclxuICAgICQoJzxwPicpLnRleHQoJ1JlcXVpcmVkIHJvbGVzIGZvciByZXBvcnQ6ICcpLmFwcGVuZChyZXBvcnRSb2xlcykuYXBwZW5kVG8oJGlzem9sZWFDb250YWluZXIpO1xyXG4gIH1cclxuXHJcbiAgaWYgKGFsbG93ZWRDb25uZWN0aW9uUm9sZXMgJiYgYWxsb3dlZENvbm5lY3Rpb25Sb2xlcy5sZW5ndGgpIHtcclxuICAgIGNvbnN0IGNvbm5lY3Rpb25zUm9sZXMgPSBhbGxvd2VkQ29ubmVjdGlvblJvbGVzLm1hcCgocikgPT4gJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ3JvbGUnKS50ZXh0KHIpKTtcclxuICAgICQoJzxwPicpLnRleHQoJ1JlcXVpcmVkIHJvbGVzIGZvciBkYiBjb25uZWN0aW9uOiAnKS5hcHBlbmQoY29ubmVjdGlvbnNSb2xlcykuYXBwZW5kVG8oJGlzem9sZWFDb250YWluZXIpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IGZ1bGxTY3JlZW4gZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9GdWxsU2NyZWVuJztcclxuaW1wb3J0IHsgaW5pdFBvcG92ZXIgfSBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyJztcclxuaW1wb3J0IHsgSUNkbVJlcG9ydFBhcmFtcywgTW9kZSB9IGZyb20gJy4uLy4uL0lSZXBvcnRQYXJhbXMnO1xyXG5pbXBvcnQgeyBDb250cm9sQ29uZmlndXJhdG9yLCBJQ29udHJvbENvbmZpZ3VyYXRvck9wdGlvbnMgfSBmcm9tICcuL0NvbnRyb2xDb25maWd1cmF0b3InO1xyXG5pbXBvcnQgeyBDb250cm9sRGlzcGxheSwgSUNvbnRyb2xEaXNwbGF5T3B0aW9ucyB9IGZyb20gJy4vQ29udHJvbERpc3BsYXknO1xyXG5pbXBvcnQgeyBEaXNwbGF5TWFuYWdlciwgSURpc3BsYXlNYW5hZ2VyT3B0aW9ucyB9IGZyb20gJy4vRGlzcGxheU1hbmFnZXInO1xyXG5pbXBvcnQge0lSZXBvcnRDb21wb25lbnR9IGZyb20gJy4uLy4uL0lSZXBvcnRDb21wb25lbnQnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ0RNUmVwb3J0UGFnZU9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICByZXBvcnRQYXJhbXM6IElDZG1SZXBvcnRQYXJhbXM7XHJcbiAgdXNlck5hbWU6IHN0cmluZztcclxuICBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XHJcbiAgY2RtUmVwb3J0Q29udHJvbGxlclVybDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDRE1SZXBvcnRQYWdlIGltcGxlbWVudHMgSVJlcG9ydENvbXBvbmVudCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBTV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA9ICdTd2l0Y2ggdG8gU2V0dGluZ3MnO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgU1dJVENIX1RPX1ZJRVdFUl9URVhUID0gJ1N3aXRjaCB0byBEaXNwbGF5JztcclxuICBwcml2YXRlIHJlYWRvbmx5IFNUT1JBR0VfTU9ERV9LRVkgPSAnQ0RNX1NUT1JBR0VfTU9ERV9LRVknO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5ICRyb290RWxlbWVudDogSlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlcG9ydFBhcmFtczogSUNkbVJlcG9ydFBhcmFtcztcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zOiBJQ29udHJvbENvbmZpZ3VyYXRvck9wdGlvbnM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwbGF5TWFuYWdlck9wdGlvbnM6IElEaXNwbGF5TWFuYWdlck9wdGlvbnM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb250cm9sRGlzcGxheU9wdGlvbnM6IElDb250cm9sRGlzcGxheU9wdGlvbnM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBtdWx0aVZpZXc6IERldkV4cHJlc3MudWkuZHhNdWx0aVZpZXc7XHJcbiAgcHJpdmF0ZSB0YWJQYW5lbDogRGV2RXhwcmVzcy51aS5keFRhYlBhbmVsO1xyXG4gIHByaXZhdGUgcG9wb3ZlcjogRGV2RXhwcmVzcy51aS5keFBvcG92ZXI7XHJcblxyXG4gIHByaXZhdGUgbW9kZTogTW9kZTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUNETVJlcG9ydFBhZ2VPcHRpb25zKSB7XHJcbiAgICBjb25zdCBiYXNlVXJsID0gYC8ke29wdGlvbnMuY2RtUmVwb3J0Q29udHJvbGxlclVybH0vJHtvcHRpb25zLnJlcG9ydFBhcmFtcy5SZXBvcnRJZH1gO1xyXG4gICAgdGhpcy4kcm9vdEVsZW1lbnQgPSBvcHRpb25zLiRjb250YWluZXI7XHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy5hbGxvd0VkaXRpbmcgPSBvcHRpb25zLmFsbG93RWRpdGluZztcclxuICAgIHRoaXMubW9kZSA9IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpKSBhcyBNb2RlIHx8IE1vZGUuVmlld2VyO1xyXG5cclxuICAgIHRoaXMuY29udHJvbENvbmZpZ3VyYXRvck9wdGlvbnMgPSB0aGlzLmdldENvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zKGJhc2VVcmwsIG9wdGlvbnMuY2RtUmVwb3J0Q29udHJvbGxlclVybCk7XHJcbiAgICB0aGlzLmRpc3BsYXlNYW5hZ2VyT3B0aW9ucyA9IHRoaXMuZ2V0RGlzcGxheU1hbmFnZXJPcHRpb25zKGJhc2VVcmwpO1xyXG4gICAgdGhpcy5jb250cm9sRGlzcGxheU9wdGlvbnMgPSB0aGlzLmdldENvbnRyb2xEaXNwbGF5T3B0aW9ucyhiYXNlVXJsLCBvcHRpb25zLnVzZXJOYW1lLCBvcHRpb25zLnJlcG9ydFBhcmFtcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdCgpIHtcclxuICAgIGlmICh0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMucG9wb3ZlciA9IGluaXRQb3BvdmVyKCcucmVwb3J0LWRldGFpbHMtbGluaycsIHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmFsbG93RWRpdGluZykge1xyXG4gICAgICB0aGlzLmluaXRTd2l0Y2hNb2RlQnV0dG9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW5kZXJDb250ZW50KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzcG9zZSgpIHtcclxuICAgIHRoaXMubXVsdGlWaWV3Py5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnRhYlBhbmVsPy5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnBvcG92ZXI/LmRpc3Bvc2UoKTtcclxuICB9XHJcblxyXG4gIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckNvbnRlbnQoKSB7XHJcbiAgICBpZiAodGhpcy5tb2RlID09PSBNb2RlLlZpZXdlcikge1xyXG4gICAgICB0aGlzLnJlbmRlckRpc3BsYXkoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmVuZGVyVGFiUGFuZWwoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q29udHJvbENvbmZpZ3VyYXRvck9wdGlvbnMoYmFzZVVybDogc3RyaW5nLCBjZG1SZXBvcnRDb250cm9sbGVyVXJsOiBzdHJpbmcpOiBJQ29udHJvbENvbmZpZ3VyYXRvck9wdGlvbnMge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgJGNvbnRhaW5lcjogbnVsbCxcclxuICAgICAgaXNTdGFuZGFsb25lUGFnZTogZmFsc2UsXHJcbiAgICAgIHBhZ2VUaXRsZTogJycsXHJcbiAgICAgIGF2YWlsYWJsZVJvbGVzVXJsOiBgLyR7Y2RtUmVwb3J0Q29udHJvbGxlclVybH0vQXZhaWxhYmxlUm9sZXNgLFxyXG4gICAgICBncm91cEZpZWxkc1VybDogYCR7YmFzZVVybH0vQWxsQ29udHJvbEZpZWxkc2AsXHJcbiAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9Db25maWd1cmF0b3JEYXRhYCxcclxuICAgICAgdXBkYXRlRGF0YVVybDogYCR7YmFzZVVybH0vQ29uZmlndXJhdG9yRGF0YWBcclxuICAgIH0gYXMgSUNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREaXNwbGF5TWFuYWdlck9wdGlvbnMoYmFzZVVybDogc3RyaW5nKTogSURpc3BsYXlNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAkY29udGFpbmVyOiBudWxsLFxyXG4gICAgICBpc1N0YW5kYWxvbmVQYWdlOiBmYWxzZSxcclxuICAgICAgcGFnZVRpdGxlOiAnJyxcclxuICAgICAgbG9hZERhdGFVcmw6IGAke2Jhc2VVcmx9L0NvbnRyb2xEaXNwbGF5VXNlckFzc2lnbm1lbnRzYCxcclxuICAgICAgdXBkYXRlRGF0YVVybDogYCR7YmFzZVVybH0vVXBkYXRlQ29udHJvbERpc3BsYXlVc2VyQXNzaWdubWVudHNgXHJcbiAgICB9IGFzIElEaXNwbGF5TWFuYWdlck9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENvbnRyb2xEaXNwbGF5T3B0aW9ucyhcclxuICAgIGJhc2VVcmw6IHN0cmluZyxcclxuICAgIHVzZXJOYW1lOiBzdHJpbmcsXHJcbiAgICByZXBvcnRQYXJhbXM6IElDZG1SZXBvcnRQYXJhbXNcclxuICApOiBJQ29udHJvbERpc3BsYXlPcHRpb25zIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICRjb250YWluZXI6IG51bGwsXHJcbiAgICAgIGlzU3RhbmRhbG9uZVBhZ2U6IGZhbHNlLFxyXG4gICAgICBwYWdlVGl0bGU6ICcnLFxyXG4gICAgICBleHBvcnRGaWxlTmFtZTogcmVwb3J0UGFyYW1zLk5hbWUsXHJcbiAgICAgIHVzZXJDb25maWdVcmw6IGAke2Jhc2VVcmx9L0ZpZWxkc1Blcm1pc3Npb25zYCxcclxuICAgICAgY29udHJvbExvZ3NVcmw6IGAke2Jhc2VVcmx9L0dldENvbnRyb2xMb2dzYCxcclxuICAgICAgbG9hZERhdGFVcmw6IGAke2Jhc2VVcmx9L0NvbnRyb2xEaXNwbGF5RGF0YWAsXHJcbiAgICAgIHVwZGF0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L1VwZGF0ZUNvbnRyb2xEaXNwbGF5RGF0YWAsXHJcbiAgICAgIHVzZXJOYW1lLFxyXG4gICAgICBpbXBvcnRGaWxlT3B0aW9uczogcmVwb3J0UGFyYW1zLkFsbG93SW1wb3J0aW5nID8ge1xyXG4gICAgICAgIG1vZGU6IHJlcG9ydFBhcmFtcy5JbXBvcnRGaWxlTW9kZSxcclxuICAgICAgICBjcmVhdGVUYWJsZVVybDogYCR7YmFzZVVybH0vY3JlYXRlLXRhYmxlYCxcclxuICAgICAgICBhZGRSb3dzVXJsOiBgJHtiYXNlVXJsfS9hZGQtcm93c2AsXHJcbiAgICAgICAgZmlsZVVwbG9hZFVybDogYCR7YmFzZVVybH0vZ2V0LWNvbHVtbnNgLFxyXG4gICAgICAgIHByZWRlZmluZWRUYWJsZTogcmVwb3J0UGFyYW1zLkZpbGVJbXBvcnRlclRhYmxlSW5mb1xyXG4gICAgICB9IDogdW5kZWZpbmVkLFxyXG4gICAgICBncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zOiB7XHJcbiAgICAgICAgbG9hZERhdGFVcmw6IGAke2Jhc2VVcmx9L0dldENvbnRyb2xGaWx0ZXJzYCxcclxuICAgICAgICBpbnNlcnREYXRhVXJsOiBgJHtiYXNlVXJsfS9BZGRDb250cm9sRmlsdGVyYCxcclxuICAgICAgICB1cGRhdGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9VcGRhdGVDb250cm9sRmlsdGVyYCxcclxuICAgICAgICBkZWxldGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9SZW1vdmVDb250cm9sRmlsdGVyYFxyXG4gICAgICB9LFxyXG4gICAgICBncmlkVmlld3NNYW5hZ2VyT3B0aW9uczoge1xyXG4gICAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9HZXRDb250cm9sVmlld3NgLFxyXG4gICAgICAgIGluc2VydERhdGFVcmw6IGAke2Jhc2VVcmx9L0FkZENvbnRyb2xWaWV3YCxcclxuICAgICAgICB1cGRhdGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9VcGRhdGVDb250cm9sVmlld2AsXHJcbiAgICAgICAgZGVsZXRlRGF0YVVybDogYCR7YmFzZVVybH0vUmVtb3ZlQ29udHJvbFZpZXdgXHJcbiAgICAgIH0sXHJcbiAgICAgIGdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zOiB7XHJcbiAgICAgICAgbG9hZERhdGFVcmw6IGAke2Jhc2VVcmx9L0dldENvbnRyb2xEaXNwbGF5c2AsXHJcbiAgICAgICAgaW5zZXJ0RGF0YVVybDogYCR7YmFzZVVybH0vQWRkQ29udHJvbERpc3BsYXlgLFxyXG4gICAgICAgIHVwZGF0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L1VwZGF0ZUNvbnRyb2xEaXNwbGF5YCxcclxuICAgICAgICBkZWxldGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9SZW1vdmVDb250cm9sRGlzcGxheWBcclxuICAgICAgfSxcclxuICAgICAgcmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnM6IHtcclxuICAgICAgICBsb2FkRGF0YVVybDogYCR7YmFzZVVybH0vR2V0Q29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NgLFxyXG4gICAgICAgIHVwZGF0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L1VwZGF0ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzYCxcclxuICAgICAgfVxyXG4gICAgfSBhcyBJQ29udHJvbERpc3BsYXlPcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0U3dpdGNoTW9kZUJ1dHRvbigpIHtcclxuICAgIGNvbnN0IGJ1dHRvbiA9ICQoJy5zd2l0Y2gtbW9kZS1idG4nKS5keEJ1dHRvbih7XHJcbiAgICAgIHRleHQ6IHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyB0aGlzLlNXSVRDSF9UT19ERVNJR05FUl9URVhUIDogdGhpcy5TV0lUQ0hfVE9fVklFV0VSX1RFWFQsXHJcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICB0aGlzLm1vZGUgPSB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gTW9kZS5EZXNpZ25lciA6IE1vZGUuVmlld2VyO1xyXG4gICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpLCB0aGlzLm1vZGUpO1xyXG4gICAgICAgIGJ1dHRvbi5vcHRpb24oJ3RleHQnLCB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gdGhpcy5TV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IHRoaXMuU1dJVENIX1RPX1ZJRVdFUl9URVhUKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZW5kZXJDb250ZW50KCk7XHJcbiAgICAgIH1cclxuICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLW1kJykuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckRpc3BsYXkoKSB7XHJcbiAgICB0aGlzLiRyb290RWxlbWVudC5odG1sKCcnKTtcclxuICAgIGNvbnN0ICR2aWV3ID0gJCgnPGRpdiAvPicpLmFwcGVuZFRvKHRoaXMuJHJvb3RFbGVtZW50KTtcclxuXHJcbiAgICB0aGlzLm11bHRpVmlldyA9ICR2aWV3LmR4TXVsdGlWaWV3KHtcclxuICAgICAgaXRlbXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgQ29udHJvbERpc3BsYXkoeyAuLi50aGlzLmNvbnRyb2xEaXNwbGF5T3B0aW9ucywgJGNvbnRhaW5lcjogJCgnPGRpdiAvPicpIH0pO1xyXG4gICAgICAgICAgICBjb21wb25lbnQucmVuZGVyKCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50LiRjb250YWluZXI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9KS5hZGRDbGFzcygnY2RtLXJlcG9ydF9fZGlzcGx5LWdyaWQnKS5keE11bHRpVmlldygnaW5zdGFuY2UnKTtcclxuICAgIGZ1bGxTY3JlZW4odGhpcy5tdWx0aVZpZXcsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyVGFiUGFuZWwoKSB7XHJcbiAgICB0aGlzLiRyb290RWxlbWVudC5odG1sKCcnKTtcclxuXHJcbiAgICBjb25zdCAkbWFpblRhYlBhbmVsID0gJCgnPGRpdiAvPicpLmFwcGVuZFRvKHRoaXMuJHJvb3RFbGVtZW50KTtcclxuXHJcbiAgICB0aGlzLnRhYlBhbmVsID0gdGhpcy5jcmVhdGVUYWJQYW5lbCgkbWFpblRhYlBhbmVsKTtcclxuICAgIGZ1bGxTY3JlZW4odGhpcy50YWJQYW5lbCwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVUYWJQYW5lbChlbGVtZW50OiBKUXVlcnk8SFRNTEVsZW1lbnQ+KTogRGV2RXhwcmVzcy51aS5keFRhYlBhbmVsIHtcclxuICAgIHJldHVybiBlbGVtZW50LmR4VGFiUGFuZWwoe1xyXG4gICAgICBzd2lwZUVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBzaG93TmF2QnV0dG9uczogdHJ1ZSxcclxuICAgICAgZm9jdXNTdGF0ZUVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBhY3RpdmVTdGF0ZUVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBob3ZlclN0YXRlRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIG9uU2VsZWN0aW9uQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGUuY29tcG9uZW50LnJlcGFpbnQoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSxcclxuICAgICAgaXRlbXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICB0aXRsZTogJ0NvbmZpZ3VyYXRvcicsXHJcbiAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgQ29udHJvbENvbmZpZ3VyYXRvcih7IC4uLnRoaXMuY29udHJvbENvbmZpZ3VyYXRvck9wdGlvbnMsICRjb250YWluZXI6ICQoJzxkaXYgLz4nKSB9KTtcclxuICAgICAgICAgICAgY29tcG9uZW50LnJlbmRlcigpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC4kY29udGFpbmVyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdGl0bGU6ICdEaXNwbGF5IE1hbmFnZXInLFxyXG4gICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IERpc3BsYXlNYW5hZ2VyKHsgLi4udGhpcy5kaXNwbGF5TWFuYWdlck9wdGlvbnMsICRjb250YWluZXI6ICQoJzxkaXYgLz4nKSB9KTtcclxuICAgICAgICAgICAgY29tcG9uZW50LnJlbmRlcigpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC4kY29udGFpbmVyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgIF1cclxuICAgIH0pLmFkZENsYXNzKCdjZG0tcmVwb3J0X19jb25maWd1cmF0aW9uLXRhYi1wYW5lbCcpXHJcbiAgICAgIC5keFRhYlBhbmVsKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTZXNzaW9uS2V5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5TVE9SQUdFX01PREVfS0VZICsgdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQ7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZleHBvcnQgZnVuY3Rpb24gaW5pdFBvcG92ZXIobGluazogc3RyaW5nLCBkZXRhaWxzOiBzdHJpbmcpOiBEZXZFeHByZXNzLnVpLmR4UG9wb3ZlciB7XHJcbiAgY29uc3QgaHRtbCA9ICQoJzxwLz4nKS5odG1sKGRldGFpbHMpLnRleHQoKTtcclxuXHJcbiAgY29uc3QgcG9wb3ZlciA9ICQoJzxkaXY+JywgeyBjbGFzczogJ3JlcG9ydC1kZXRhaWxzLXBvcG92ZXInIH0pXHJcbiAgICAuaHRtbChodG1sKVxyXG4gICAgLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpO1xyXG5cclxuICByZXR1cm4gJChwb3BvdmVyKS5keFBvcG92ZXIoe1xyXG4gICAgdGFyZ2V0OiBsaW5rLFxyXG4gICAgc2hvd0V2ZW50OiAnZHhjbGljaycsXHJcbiAgICBwb3NpdGlvbjogJ2JvdHRvbScsXHJcbiAgICB3aWR0aDogNTAwXHJcbiAgfSkuZHhQb3BvdmVyKCdpbnN0YW5jZScpO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgZnVsbFNjcmVlbiBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL0Z1bGxTY3JlZW4nO1xyXG5pbXBvcnQge0NTU19DTEFTU0VTfSBmcm9tICcuLi8uLi8uLi9TdHlsaW5nL0luZGV4JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRBZGRpdGlvbmFsT3B0aW9ucyB7XHJcbiAgZXhwb3J0RmlsZU5hbWU/OiBzdHJpbmc7XHJcbiAgc3VtbWFyeUNvbHVtbj86IHN0cmluZztcclxuICBzaG93U3VtbWFyeUluQ29sdW1uPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdERhdGFHcmlkKFxyXG4gICR0YXJnZXQsIGRhdGFHcmlkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucywgYWRkaXRpb25hbE9wdGlvbnM6IElHcmlkQWRkaXRpb25hbE9wdGlvbnMgPSB7fSxcclxuICBoZWFkZXJUZXh0Pzogc3RyaW5nLCBoZWFkZXJEZXNjcmlwdGlvbj86IHN0cmluZywgZGVmYXVsdENvbHVtbldpZHRoID0gZmFsc2VcclxuKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICBsZXQgaXNHcmlkSW5pdGlhbGl6YWVkID0gZmFsc2U7XHJcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgPSB7XHJcbiAgICBleHBvcnQ6IHtcclxuICAgICAgZW5hYmxlZDogISFhZGRpdGlvbmFsT3B0aW9ucy5leHBvcnRGaWxlTmFtZSxcclxuICAgICAgYWxsb3dFeHBvcnRTZWxlY3RlZERhdGE6IHRydWVcclxuICAgIH0sXHJcbiAgICByZW1vdGVPcGVyYXRpb25zOiB0cnVlLFxyXG5cclxuICAgIGNvbHVtbkF1dG9XaWR0aDogdHJ1ZSxcclxuICAgIHNob3dCb3JkZXJzOiB0cnVlLFxyXG5cclxuICAgIHNlbGVjdGlvbjoge21vZGU6ICdtdWx0aXBsZSd9LFxyXG4gICAga2V5Ym9hcmROYXZpZ2F0aW9uOiB7ZW5hYmxlZDogZmFsc2V9LFxyXG4gICAgcGFnaW5nOiB7cGFnZVNpemU6IDUwfSxcclxuICAgIHNlYXJjaFBhbmVsOiB7dmlzaWJsZTogdHJ1ZX0sXHJcbiAgICBmaWx0ZXJSb3c6IHt2aXNpYmxlOiB0cnVlfSxcclxuICAgIGhlYWRlckZpbHRlcjoge3Zpc2libGU6IHRydWV9LFxyXG4gICAgc2Nyb2xsaW5nOiB7bW9kZTogJ3ZpcnR1YWwnfSxcclxuICAgIG9uQ29udGVudFJlYWR5OiAoZSkgPT4ge1xyXG4gICAgICB1cGRhdGVTdW1tYXJ5Q29sdW1uSWZSZXF1aXJlZChlLmNvbXBvbmVudCk7XHJcblxyXG4gICAgICBpZiAoaXNHcmlkSW5pdGlhbGl6YWVkKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpc0dyaWRJbml0aWFsaXphZWQgPSB0cnVlO1xyXG5cclxuICAgICAgaWYgKCFkZWZhdWx0Q29sdW1uV2lkdGgpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGUuY29tcG9uZW50LmNvbHVtbkNvdW50KCk7IGkrKykge1xyXG4gICAgICAgICAgY29uc3QgZGF0YVR5cGUgPSBlLmNvbXBvbmVudC5jb2x1bW5PcHRpb24oaSwgJ2RhdGFUeXBlJyk7XHJcblxyXG4gICAgICAgICAgaWYgKCFlLmNvbXBvbmVudC5jb2x1bW5PcHRpb24oaSwgJ3dpZHRoJykpIHtcclxuICAgICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgICAgICAgICBlLmNvbXBvbmVudC5jb2x1bW5PcHRpb24oaSwgJ3dpZHRoJywgJzEwMHB4Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnZGF0ZXRpbWUnKSB7XHJcbiAgICAgICAgICAgICAgZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKGksICd3aWR0aCcsICcxNTBweCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvL3RvIGZpeCBhdXRvc2Nyb2xsXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNjcm9sbGFibGUgPSBlLmNvbXBvbmVudC5nZXRTY3JvbGxhYmxlKCk7XHJcblxyXG4gICAgICAgIGlmIChzY3JvbGxhYmxlKSB7XHJcbiAgICAgICAgICBzY3JvbGxhYmxlLnNjcm9sbFRvKHt0b3A6IDB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuICAgIG9uVG9vbGJhclByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgaWYgKGhlYWRlclRleHQpIHtcclxuICAgICAgICBlLnRvb2xiYXJPcHRpb25zLml0ZW1zLnVuc2hpZnQoe1xyXG4gICAgICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICAgICAgdGVtcGxhdGUoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlckVsID0gJCgnPGgyIC8+JykuYWRkQ2xhc3MoJ2dyaWQtaGVhZGVyJykudGV4dChoZWFkZXJUZXh0KTtcclxuICAgICAgICAgICAgaWYgKGhlYWRlckRlc2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgaGVhZGVyRWwuYXBwZW5kKCQoJzxpIC8+JykuYWRkQ2xhc3MoJ2ZhcycpLmFkZENsYXNzKCdmYS1pbmZvLWNpcmNsZScpLmFkZENsYXNzKCdyZXBvcnQtZGV0YWlscy1saW5rJykuYXR0cigndGl0bGUnLCAnQ2xpY2sgdG8gc2VlIGZ1cnRoZXIgZGV0YWlscycpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGhlYWRlckVsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3Qgb25Db250ZW50UmVhZHkgPSBkYXRhR3JpZE9wdGlvbnMub25Db250ZW50UmVhZHlcclxuICAgID8gKGUpID0+IHtcclxuICAgICAgZGVmYXVsdE9wdGlvbnMub25Db250ZW50UmVhZHkoZSk7XHJcbiAgICAgIGRhdGFHcmlkT3B0aW9ucy5vbkNvbnRlbnRSZWFkeShlKTtcclxuICAgIH1cclxuICAgIDogZGVmYXVsdE9wdGlvbnMub25Db250ZW50UmVhZHk7XHJcblxyXG4gIHRyeVNldFRvdGFsU3VtbWFyeShkYXRhR3JpZE9wdGlvbnMsIGFkZGl0aW9uYWxPcHRpb25zKTtcclxuXHJcbiAgY29uc3QgbWVyZ2VkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBkZWZhdWx0T3B0aW9ucywgZGF0YUdyaWRPcHRpb25zLCB7b25Db250ZW50UmVhZHl9KTtcclxuXHJcbiAgY29uc3QgZ3JpZCA9ICR0YXJnZXQuZHhEYXRhR3JpZChtZXJnZWRPcHRpb25zKS5keERhdGFHcmlkKCdpbnN0YW5jZScpO1xyXG5cclxuICBncmlkLmVsZW1lbnQoKS5hZGRDbGFzcyhDU1NfQ0xBU1NFUy5keERhdGFHcmlkKTtcclxuXHJcbiAgcmV0dXJuIGdyaWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRyeVNldFRvdGFsU3VtbWFyeShkYXRhR3JpZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMsIGFkZGl0aW9uYWxPcHRpb25zOiBJR3JpZEFkZGl0aW9uYWxPcHRpb25zKSB7XHJcbiAgaWYgKGRhdGFHcmlkT3B0aW9ucz8uc3VtbWFyeT8udG90YWxJdGVtcz8uc29tZSgoaSkgPT4gaS5zdW1tYXJ5VHlwZSA9PT0gJ2NvdW50JykpIHtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIGxldCBzdW1tYXJ5Q29sdW1uID0gYWRkaXRpb25hbE9wdGlvbnM/LnN1bW1hcnlDb2x1bW47XHJcbiAgaWYgKCFzdW1tYXJ5Q29sdW1uICYmIGRhdGFHcmlkT3B0aW9ucz8uY29sdW1ucz8ubGVuZ3RoKSB7XHJcbiAgICBzdW1tYXJ5Q29sdW1uID0gdHlwZW9mIGRhdGFHcmlkT3B0aW9ucy5jb2x1bW5zWzBdID09PSAnc3RyaW5nJ1xyXG4gICAgICA/IGRhdGFHcmlkT3B0aW9ucy5jb2x1bW5zWzBdXHJcbiAgICAgIDogZGF0YUdyaWRPcHRpb25zLmNvbHVtbnNbMF0uZGF0YUZpZWxkO1xyXG4gIH1cclxuXHJcbiAgaWYgKHN1bW1hcnlDb2x1bW4pIHtcclxuICAgIGlmICghZGF0YUdyaWRPcHRpb25zLnN1bW1hcnkpIHtcclxuICAgICAgZGF0YUdyaWRPcHRpb25zLnN1bW1hcnkgPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWRhdGFHcmlkT3B0aW9ucy5zdW1tYXJ5LnRvdGFsSXRlbXMpIHtcclxuICAgICAgZGF0YUdyaWRPcHRpb25zLnN1bW1hcnkudG90YWxJdGVtcyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGRhdGFHcmlkT3B0aW9ucy5zdW1tYXJ5LnRvdGFsSXRlbXMucHVzaCh7XHJcbiAgICAgIGNvbHVtbjogc3VtbWFyeUNvbHVtbixcclxuICAgICAgc3VtbWFyeVR5cGU6ICdjb3VudCdcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlU3VtbWFyeUNvbHVtbklmUmVxdWlyZWQoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XHJcbiAgY29uc3QgdG90YWxJdGVtcyA9IGdyaWQub3B0aW9uKCdzdW1tYXJ5LnRvdGFsSXRlbXMnKSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydzdW1tYXJ5J11bJ3RvdGFsSXRlbXMnXTtcclxuICBjb25zdCBjdXJyZW50U3VtbWFyeUNvbHVtbiA9IHRvdGFsSXRlbXM/LmZpbHRlcigoaSkgPT4gaS5zdW1tYXJ5VHlwZSA9PT0gJ2NvdW50JylbMF0/LmNvbHVtbjtcclxuXHJcbiAgbGV0IHN1bW1hcnlDb2x1bW5JbmRleCA9IGN1cnJlbnRTdW1tYXJ5Q29sdW1uICYmIGdyaWQuZ2V0VmlzaWJsZUNvbHVtbnMoKS5maW5kSW5kZXgoKGVsKSA9PiBlbC5kYXRhRmllbGQgPT09IGN1cnJlbnRTdW1tYXJ5Q29sdW1uKTtcclxuICBpZiAoIXN1bW1hcnlDb2x1bW5JbmRleCkge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gZ3JpZC5vcHRpb24oJ3NlbGVjdGlvbicpO1xyXG4gICAgY29uc3QgaGFzU2VsZWN0aW9uID0gc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5tb2RlICE9PSAnbm9uZSc7XHJcbiAgICBzdW1tYXJ5Q29sdW1uSW5kZXggPSBoYXNTZWxlY3Rpb24gPyBncmlkLmdldFZpc2libGVDb2x1bW5zKCkuZmluZEluZGV4KChlbCkgPT4gISFlbC5kYXRhRmllbGQpIDogMDtcclxuICB9XHJcblxyXG4gIGNvbnN0IG5ld1N1bW1hcnlDb2x1bW4gPSBncmlkLmdldFZpc2libGVDb2x1bW5zKClbc3VtbWFyeUNvbHVtbkluZGV4XT8uZGF0YUZpZWxkO1xyXG5cclxuICBpZiAobmV3U3VtbWFyeUNvbHVtbiAmJiBjdXJyZW50U3VtbWFyeUNvbHVtbiAhPT0gbmV3U3VtbWFyeUNvbHVtbikge1xyXG4gICAgZ3JpZC5vcHRpb24oJ3N1bW1hcnknLCB7XHJcbiAgICAgIHRvdGFsSXRlbXM6IFt7XHJcbiAgICAgICAgY29sdW1uOiBncmlkLmdldFZpc2libGVDb2x1bW5zKClbc3VtbWFyeUNvbHVtbkluZGV4XT8uZGF0YUZpZWxkLFxyXG4gICAgICAgIHN1bW1hcnlUeXBlOiAnY291bnQnXHJcbiAgICAgIH1dXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGdWxsU2NyZWVuRGF0YUdyaWQoXHJcbiAgJHRhcmdldCwgZGF0YUdyaWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9uczogSUdyaWRBZGRpdGlvbmFsT3B0aW9ucyA9IHt9LFxyXG4gIGhlYWRlclRleHQ/OiBzdHJpbmcsIGhlYWRlckRlc2NyaXB0aW9uPzogc3RyaW5nLCBkZWZhdWx0Q29sdW1uV2lkdGggPSBmYWxzZSwgc2tpcEZ1bGxTY3JlZW4gPSBmYWxzZVxyXG4pOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gIGNvbnN0IGdyaWQgPSBjcmVhdGVEZWZhdWx0RGF0YUdyaWQoJHRhcmdldCwgZGF0YUdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9ucywgaGVhZGVyVGV4dCwgaGVhZGVyRGVzY3JpcHRpb24sIGRlZmF1bHRDb2x1bW5XaWR0aCk7XHJcblxyXG4gIGlmICghc2tpcEZ1bGxTY3JlZW4pIHtcclxuICAgIGZ1bGxTY3JlZW4oZ3JpZCk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZ3JpZDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSh0ZXh0LCB0aXRsZSkge1xyXG4gIHJldHVybiAkKCc8c3Bhbj4nKVxyXG4gICAgLmF0dHIoJ3RpdGxlJywgdGl0bGUpXHJcbiAgICAudGV4dCh0ZXh0KTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgY3JlYXRlRHhEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9EeERhdGFTb3VyY2UnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IGNyZWF0ZUZ1bGxTY3JlZW5EYXRhR3JpZCwgY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlIH0gZnJvbSAnLi4vR3JpZC9DcmVhdGVEZWZhdWx0R3JpZCc7XHJcbmltcG9ydCBjcmVhdGVEZWZhdWx0R3JpZCBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQnO1xyXG5pbXBvcnQge0lMb29rdXBEdG99IGZyb20gJy4uLy4uLy4uL0RhdGEvQXBpUmVzcG9uc2UnO1xyXG5cclxuLy8gTk9URTogY29uc3QgZGVmYXVsdFNob3dlZFJvbGVzID0gWydQcm9kdWN0aW9uJywgJ1NhbGVzJywgJ0Zsb29yJ107XHJcbmNvbnN0IHJvbGVzT3JkZXIgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xyXG5cclxuZXhwb3J0IGNvbnN0IGVudW0gRGlzcGxheVR5cGUge1xyXG4gIEljb25zID0gMSxcclxuICBQcmVkZWZpbmVkVmFsdWVzID0gMixcclxuICBSYWJiaXRBY3Rpb24gPSAzXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUljb25zQ29sdW1uRWRpdG9ySXRlbSB7XHJcbiAgdmFsdWU6IHN0cmluZztcclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIGltYWdlOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVByZWRlZmluZWRWYWx1ZXNFZGl0b3JJdGVtIHtcclxuICB2YWx1ZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElSYWJiaXRBY3Rpb25FZGl0b3JEYXRhIHtcclxuICBhY3Rpb25UeXBlOiBzdHJpbmc7XHJcbiAgZmllbGRzOiBzdHJpbmdbXTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgSURpc3BsYXlUeXBlU2V0dGluZ3MgPSBJRGlzcGxheUljb25zVHlwZVNldHRpbmdzIHwgSURpc3BsYXlJUHJlZGVmaW5lZFZhbHVlc1R5cGVTZXR0aW5ncyB8IElEaXNwbGF5SVJhYmJpdEFjdGlvblR5cGVTZXR0aW5ncztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSURpc3BsYXlJY29uc1R5cGVTZXR0aW5ncyB7XHJcbiAgdHlwZTogRGlzcGxheVR5cGUuSWNvbnM7XHJcbiAgZGF0YTogSUljb25zQ29sdW1uRWRpdG9ySXRlbVtdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEaXNwbGF5SVByZWRlZmluZWRWYWx1ZXNUeXBlU2V0dGluZ3Mge1xyXG4gIHR5cGU6IERpc3BsYXlUeXBlLlByZWRlZmluZWRWYWx1ZXM7XHJcbiAgZGF0YTogSVByZWRlZmluZWRWYWx1ZXNFZGl0b3JJdGVtW107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSURpc3BsYXlJUmFiYml0QWN0aW9uVHlwZVNldHRpbmdzIHtcclxuICB0eXBlOiBEaXNwbGF5VHlwZS5SYWJiaXRBY3Rpb247XHJcbiAgZGF0YTogSVJhYmJpdEFjdGlvbkVkaXRvckRhdGE7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zIHtcclxuICAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgaXNTdGFuZGFsb25lUGFnZTogYm9vbGVhbjtcclxuICBwYWdlVGl0bGU6IHN0cmluZztcclxuICBhdmFpbGFibGVSb2xlc1VybDogc3RyaW5nO1xyXG4gIGdyb3VwRmllbGRzVXJsOiBzdHJpbmc7XHJcbiAgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJUmFiYml0QWN0aW9uRWRpdG9ySW5pdERhdGEge1xyXG4gIGZpZWxkczogSUxvb2t1cER0bzxzdHJpbmc+W107XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBDb250cm9sQ29uZmlndXJhdG9yIHtcclxuICBwdWJsaWMgcmVhZG9ubHkgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaXNTdGFuZGFsb25lUGFnZTogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IHBhZ2VUaXRsZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYXZhaWxhYmxlUm9sZXNVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyb3VwRmllbGRzVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGRpc3BsYXlUeXBlczogYW55W10gPSBbXHJcbiAgICB7IGtleTogRGlzcGxheVR5cGUuSWNvbnMsIHZhbHVlOiAnSWNvbnMnIH0sXHJcbiAgICB7IGtleTogRGlzcGxheVR5cGUuUHJlZGVmaW5lZFZhbHVlcywgdmFsdWU6ICdQcmVkZWZpbmVkVmFsdWVzJyB9LFxyXG4gICAgeyBrZXk6IERpc3BsYXlUeXBlLlJhYmJpdEFjdGlvbiwgdmFsdWU6ICdSYWJiaXRBY3Rpb24nIH1cclxuICBdO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZWRpdG9ycyA9IHtcclxuICAgIFtEaXNwbGF5VHlwZS5JY29uc106IEljb25zQ29sdW1uRWRpdG9yLFxyXG4gICAgW0Rpc3BsYXlUeXBlLlByZWRlZmluZWRWYWx1ZXNdOiBQcmVkZWZpbmVkVmFsdWVzQ29sdW1uRWRpdG9yLFxyXG4gICAgW0Rpc3BsYXlUeXBlLlJhYmJpdEFjdGlvbl06IFJhYmJpdEFjdGlvbkNvbHVtbkVkaXRvcixcclxuICB9O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZWRpdG9yc0luaXREYXRhIDoge1tpZDogbnVtYmVyXSA6IG9iamVjdDt9ID0ge307XHJcbiAgcHJpdmF0ZSByb2xlczogc3RyaW5nW10gPSBbXTtcclxuICBwcml2YXRlIGZpZWxkczogSUxvb2t1cER0bzxzdHJpbmc+W10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSBvcHRpb25zLiRjb250YWluZXI7XHJcbiAgICB0aGlzLmlzU3RhbmRhbG9uZVBhZ2UgPSBvcHRpb25zLmlzU3RhbmRhbG9uZVBhZ2U7XHJcbiAgICB0aGlzLmF2YWlsYWJsZVJvbGVzVXJsID0gb3B0aW9ucy5hdmFpbGFibGVSb2xlc1VybDtcclxuICAgIHRoaXMuZ3JvdXBGaWVsZHNVcmwgPSBvcHRpb25zLmdyb3VwRmllbGRzVXJsO1xyXG4gICAgdGhpcy5sb2FkRGF0YVVybCA9IG9wdGlvbnMubG9hZERhdGFVcmw7XHJcbiAgICB0aGlzLnVwZGF0ZURhdGFVcmwgPSBvcHRpb25zLnVwZGF0ZURhdGFVcmw7XHJcbiAgICB0aGlzLnBhZ2VUaXRsZSA9IG9wdGlvbnMucGFnZVRpdGxlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lci5hZGRDbGFzcygnYXBzLWdyaWQnKTtcclxuXHJcbiAgICBQcm9taXNlLmFsbChbXHJcbiAgICAgIHRoaXMuZ2V0QXZhaWxhYmxlUm9sZXMoKSxcclxuICAgICAgdGhpcy5nZXRBdmFpbGFibGVGaWVsZHMoKVxyXG4gICAgXSkudGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgIHRoaXMucm9sZXMgPSByZXN1bHRbMF07XHJcbiAgICAgIHRoaXMuZmllbGRzID0gcmVzdWx0WzFdO1xyXG4gICAgICB0aGlzLmVkaXRvcnNJbml0RGF0YVtEaXNwbGF5VHlwZS5SYWJiaXRBY3Rpb25dID0geyBmaWVsZHM6IHRoaXMuZmllbGRzIH07XHJcbiAgICAgIHRoaXMuY3JlYXRlTWFpbkdyaWQoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRBdmFpbGFibGVSb2xlcygpIHtcclxuICAgIHJldHVybiBzZW5kUmVxdWVzdDxBcnJheTx7IE5hbWU6IHN0cmluZyB9Pj4odGhpcy5hdmFpbGFibGVSb2xlc1VybClcclxuICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLm1hcCgocikgPT4gci5OYW1lKS5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYU9yZGVyID0gcm9sZXNPcmRlci5nZXQoYSkgfHwgOTk5OTtcclxuICAgICAgICBjb25zdCBiT3JkZXIgPSByb2xlc09yZGVyLmdldChiKSB8fCA5OTk5O1xyXG5cclxuICAgICAgICByZXR1cm4gYU9yZGVyIC0gYk9yZGVyO1xyXG4gICAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldEF2YWlsYWJsZUZpZWxkcygpOiBQcm9taXNlPElMb29rdXBEdG88c3RyaW5nPltdPiB7XHJcbiAgICByZXR1cm4gc2VuZFJlcXVlc3QodGhpcy5ncm91cEZpZWxkc1VybCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldERpc3BsYXlUeXBlRWRpdG9yKCRjb250YWluZXIsIHR5cGUsIGRhdGEpIHtcclxuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yc1t0eXBlXTtcclxuICAgIGNvbnN0IGluaXREYXRhID0gdGhpcy5lZGl0b3JzSW5pdERhdGFbdHlwZV07XHJcblxyXG4gICAgcmV0dXJuIGVkaXRvclxyXG4gICAgICA/IG5ldyBlZGl0b3IoJGNvbnRhaW5lciwgZGF0YSwgaW5pdERhdGEpXHJcbiAgICAgIDogbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTWFpbkdyaWQoKSB7XHJcbiAgICBsZXQgZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG5cclxuICAgIGNvbnN0IGdyaWRPcHRpb25zID0ge1xyXG4gICAgICBkYXRhU291cmNlOiB0aGlzLmNyZWF0ZU1haW5HcmlkRGF0YVNvdXJjZSgpLFxyXG4gICAgICBjb2x1bW5DaG9vc2VyOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBhbGxvd1NlYXJjaDogdHJ1ZSxcclxuICAgICAgICBtb2RlOiAnc2VsZWN0J1xyXG4gICAgICB9LFxyXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcclxuICAgICAgZWRpdGluZzoge1xyXG4gICAgICAgIG1vZGU6ICdjZWxsJyxcclxuICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxyXG4gICAgICAgIHJlZnJlc2hNb2RlOiAncmVwYWludCdcclxuICAgICAgfSxcclxuICAgICAgcmVwYWludENoYW5nZXNPbmx5OiB0cnVlLFxyXG4gICAgICByZW1vdGVPcGVyYXRpb25zOiB7XHJcbiAgICAgICAgc3VtbWFyeTogdHJ1ZSxcclxuICAgICAgICBwYWdpbmc6IHRydWUsXHJcbiAgICAgICAgZ3JvdXBpbmc6IGZhbHNlLFxyXG4gICAgICAgIHNvcnRpbmc6IGZhbHNlLFxyXG4gICAgICAgIGZpbHRlcmluZzogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgZ3JvdXBpbmc6IHtcclxuICAgICAgICBhbGxvd0NvbGxhcHNpbmc6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIGdyb3VwUGFuZWw6IHtcclxuICAgICAgICB2aXNpYmxlOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBzZWxlY3Rpb246IHtcclxuICAgICAgICBtb2RlOiAnbXVsdGlwbGUnXHJcbiAgICAgIH0sXHJcbiAgICAgIGFsbG93Q29sdW1uUmVvcmRlcmluZzogZmFsc2UsXHJcbiAgICAgIGNvbHVtbkhpZGluZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBob3ZlclN0YXRlRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgY29sdW1uQXV0b1dpZHRoOiBmYWxzZSxcclxuICAgICAgcm93QWx0ZXJuYXRpb25FbmFibGVkOiB0cnVlLFxyXG4gICAgICBjb2x1bW5NaW5XaWR0aDogODAsXHJcbiAgICAgIG9uUm93VXBkYXRpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgaWYgKCFlLm5ld0RhdGEgfHwgIWUub2xkRGF0YSkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZS5jb21wb25lbnQuYmVnaW5DdXN0b21Mb2FkaW5nKCdVcGRhdGluZycpO1xyXG5cclxuICAgICAgICBjb25zdCB1cGRhdGVkUm9sZXMgPSBlLm5ld0RhdGEuUm9sZXM7XHJcbiAgICAgICAgY29uc3QgY3VycmVudFJvbGVzID0gZS5vbGREYXRhLlJvbGVzO1xyXG5cclxuICAgICAgICBjb25zdCBhZGRPbGREYXRhVG9OZXdEYXRhID0gKGZpZWxkTmFtZTogc3RyaW5nLCBuZXdEYXRhU2VjdGlvbiA9IGUubmV3RGF0YSwgb2xkRGF0YVNlY3Rpb24gPSBlLm9sZERhdGEpID0+IHtcclxuICAgICAgICAgIGlmICghbmV3RGF0YVNlY3Rpb24uaGFzT3duUHJvcGVydHkoZmllbGROYW1lKSkge1xyXG4gICAgICAgICAgICBuZXdEYXRhU2VjdGlvbltmaWVsZE5hbWVdID0gb2xkRGF0YVNlY3Rpb25bZmllbGROYW1lXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAodXBkYXRlZFJvbGVzICYmIGN1cnJlbnRSb2xlcykge1xyXG4gICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModXBkYXRlZFJvbGVzKVxyXG4gICAgICAgICAgICAuZm9yRWFjaCgocm9sZU5hbWUpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCB1cGRhdGVkUm9sZSA9IHVwZGF0ZWRSb2xlc1tyb2xlTmFtZV07XHJcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudFJvbGUgPSBjdXJyZW50Um9sZXNbcm9sZU5hbWVdO1xyXG5cclxuICAgICAgICAgICAgICB1cGRhdGVkUm9sZS5JZCA9IGN1cnJlbnRSb2xlLklkO1xyXG5cclxuICAgICAgICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdDYW5CZUNyZWF0ZWQnLCB1cGRhdGVkUm9sZSwgY3VycmVudFJvbGUpO1xyXG4gICAgICAgICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0NhbkJlUmVhZCcsIHVwZGF0ZWRSb2xlLCBjdXJyZW50Um9sZSk7XHJcbiAgICAgICAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnQ2FuQmVVcGRhdGVkJywgdXBkYXRlZFJvbGUsIGN1cnJlbnRSb2xlKTtcclxuICAgICAgICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdDYW5CZURlbGV0ZWQnLCB1cGRhdGVkUm9sZSwgY3VycmVudFJvbGUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0xhYmVsJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnT3JkZXInKTtcclxuICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdUb29sVGlwJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnSXNEZWZhdWx0Vmlld0ZpZWxkJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnSXNLZXlDb2x1bW4nKTtcclxuICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdHcm91cEZpZWxkJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnRGlzcGxheVR5cGUnKTtcclxuICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdEYXRhT3duZXInKTtcclxuICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdYTFNTY2hlZHVsZUxhYmVsJyk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uUm93VXBkYXRlZDogKGUpID0+IHtcclxuICAgICAgICBlLmNvbXBvbmVudC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgICAgICAgZS5jb21wb25lbnQucmVwYWludCgpO1xyXG4gICAgICB9LFxyXG4gICAgICBjb2x1bW5zOiB0aGlzLnByZXBhcmVNYWluR3JpZENvbHVtbnMoW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ05hbWUnLFxyXG4gICAgICAgICAgY2FwdGlvbjogJ0ZpZWxkJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogZmFsc2UsXHJcbiAgICAgICAgICBmaXhlZDogdHJ1ZSxcclxuICAgICAgICAgIGZpeGVkUG9zaXRpb246ICdsZWZ0JyxcclxuICAgICAgICAgIHNvcnRPcmRlcjogJ2FzYycsXHJcbiAgICAgICAgICB3aWR0aDogMTgwLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnR3JvdXBGaWVsZCcsXHJcbiAgICAgICAgICBjYXB0aW9uOiAnR3JvdXAnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgd2lkdGg6IDIwMCxcclxuICAgICAgICAgIGVkaXRDZWxsVGVtcGxhdGU6IChfLCBjZWxsSW5mbykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gJCgnPGRpdiAvPicpLmR4U2VsZWN0Qm94KHtcclxuICAgICAgICAgICAgICB2YWx1ZTogY2VsbEluZm8udmFsdWUsXHJcbiAgICAgICAgICAgICAgZGF0YVNvdXJjZTogWy4uLm5ldyBTZXQoZ3JpZC5nZXREYXRhU291cmNlKCkuaXRlbXMoKS5maWx0ZXIoKGkpID0+IGkuR3JvdXBGaWVsZCkubWFwKChpKSA9PiBpLkdyb3VwRmllbGQpLnNvcnQoKSldLFxyXG4gICAgICAgICAgICAgIGFjY2VwdEN1c3RvbVZhbHVlOiB0cnVlLFxyXG4gICAgICAgICAgICAgIHNob3dDbGVhckJ1dHRvbjogdHJ1ZSxcclxuICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGNlbGxJbmZvLnNldFZhbHVlKGUudmFsdWUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdMYWJlbCcsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICB3aWR0aDogMTgwLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnVHlwZScsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgd2lkdGg6IDgwLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnRGF0YU93bmVyJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIHdpZHRoOiA4MCxcclxuICAgICAgICAgIGhlYWRlckNlbGxUZW1wbGF0ZTogY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKCdETycsICdEYXRhIE93bmVyJylcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ1hMU1NjaGVkdWxlTGFiZWwnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgd2lkdGg6IDgwLFxyXG4gICAgICAgICAgaGVhZGVyQ2VsbFRlbXBsYXRlOiBjcmVhdGVIZWFkZXJDZWxsVGVtcGxhdGUoJ1hMUycsICdYTFMgU2NoZWR1bGUgTGFiZWwnKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnRGlzcGxheVR5cGUnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgd2lkdGg6IDE2MCxcclxuICAgICAgICAgIGN1c3RvbWl6ZVRleHQ6IChjZWxsSW5mbykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIWNlbGxJbmZvLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShjZWxsSW5mby52YWx1ZSBhcyBzdHJpbmcpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5kaXNwbGF5VHlwZXNcclxuICAgICAgICAgICAgICAuZmluZCgoaXRlbSkgPT4gaXRlbS5rZXkgPT09IHNldHRpbmdzLnR5cGUpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlZGl0Q2VsbFRlbXBsYXRlOiAoXywgY2VsbEluZm8pID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGNlbGxJbmZvLnZhbHVlKTtcclxuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHNldHRpbmdzID8gc2V0dGluZ3MudHlwZSA6IG51bGw7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBzZXR0aW5ncyA/IHNldHRpbmdzLmRhdGEgOiBbXTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiAkKCc8ZGl2IC8+JykuZHhEcm9wRG93bkJveCh7XHJcbiAgICAgICAgICAgICAgZHJvcERvd25PcHRpb25zOiB7IHdpZHRoOiA0MDAgfSxcclxuICAgICAgICAgICAgICBkYXRhU291cmNlOiB0aGlzLmRpc3BsYXlUeXBlcyxcclxuICAgICAgICAgICAgICB2YWx1ZUV4cHI6ICdrZXknLFxyXG4gICAgICAgICAgICAgIGRpc3BsYXlFeHByOiAndmFsdWUnLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiB0eXBlLFxyXG4gICAgICAgICAgICAgIHNob3dDbGVhckJ1dHRvbjogdHJ1ZSxcclxuICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGNlbGxJbmZvLnNldFZhbHVlKGUudmFsdWUpO1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgY29udGVudFRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCAkY29udGFpdGVyID0gJCgnPGRpdiAvPicpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgJHNlbGVjdG9yID0gJCgnPGRpdiAvPicpLmFwcGVuZFRvKCRjb250YWl0ZXIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgJGJvZHkgPSAkKCc8ZGl2IHN0eWxlPVwibWFyZ2luOiA4cHggMDtcIiAvPicpLmFwcGVuZFRvKCRjb250YWl0ZXIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgJGJ1dHRvbnMgPSAkKCc8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogcmlnaHQ7XCIgLz4nKS5hcHBlbmRUbygkY29udGFpdGVyKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICRzYXZlQnV0dG9uID0gJCgnPGRpdiBzdHlsZT1cIm1hcmdpbi1yaWdodDogOHB4O1wiIC8+JykuYXBwZW5kVG8oJGJ1dHRvbnMpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgJGNhbmNlbEJ1dHRvbiA9ICQoJzxkaXYgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDhweDtcIiAvPicpLmFwcGVuZFRvKCRidXR0b25zKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgZWRpdG9yID0gdHlwZVxyXG4gICAgICAgICAgICAgICAgICA/IHRoaXMuZ2V0RGlzcGxheVR5cGVFZGl0b3IoJGJvZHksIHR5cGUsIGRhdGEpXHJcbiAgICAgICAgICAgICAgICAgIDogbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZWRpdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICRib2R5Lmh0bWwoJycpO1xyXG4gICAgICAgICAgICAgICAgICBlZGl0b3IucmVuZGVyKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgJHNlbGVjdG9yLmR4U2VsZWN0Qm94KHtcclxuICAgICAgICAgICAgICAgICAgaXRlbXM6IHRoaXMuZGlzcGxheVR5cGVzLFxyXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogdHlwZSxcclxuICAgICAgICAgICAgICAgICAgdmFsdWVFeHByOiAna2V5JyxcclxuICAgICAgICAgICAgICAgICAgZGlzcGxheUV4cHI6ICd2YWx1ZScsXHJcbiAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGVkaXRvciA9IHRoaXMuZ2V0RGlzcGxheVR5cGVFZGl0b3IoJGJvZHksIGUudmFsdWUsIGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICRib2R5Lmh0bWwoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVkaXRvci5yZW5kZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICAkc2F2ZUJ1dHRvbi5keEJ1dHRvbignaW5zdGFuY2UnKS5vcHRpb24oJ2Rpc2FibGVkJywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAkc2F2ZUJ1dHRvbi5keEJ1dHRvbih7XHJcbiAgICAgICAgICAgICAgICAgIHRleHQ6ICdTYXZlJyxcclxuICAgICAgICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxyXG4gICAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWVkaXRvcixcclxuICAgICAgICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVkaXRvckRhdGEgPSBlZGl0b3IuZ2V0RGF0YSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGVkaXRvckRhdGEgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdTZXR0aW5ncyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICRzZWxlY3Rvci5keFNlbGVjdEJveCgnaW5zdGFuY2UnKS5vcHRpb24oJ3ZhbHVlJyksXHJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBlZGl0b3JEYXRhXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbEluZm8uc2V0VmFsdWUoSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpKTtcclxuICAgICAgICAgICAgICAgICAgICBjZWxsSW5mby5jb21wb25lbnQuY2xvc2VFZGl0Q2VsbCgpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KS5hcHBlbmRUbygkYnV0dG9ucyk7XHJcblxyXG4gICAgICAgICAgICAgICAgJGNhbmNlbEJ1dHRvbi5keEJ1dHRvbih7XHJcbiAgICAgICAgICAgICAgICAgIHRleHQ6ICdDYW5jZWwnLFxyXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbEluZm8uY29tcG9uZW50LmNsb3NlRWRpdENlbGwoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkuYXBwZW5kVG8oJGJ1dHRvbnMpO1xyXG5cclxuICAgICAgICAgICAgICAgICRjb250YWl0ZXIuZHhTY3JvbGxWaWV3KHtcclxuICAgICAgICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAnMTAwJSdcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiAkY29udGFpdGVyO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdJc0RlZmF1bHRWaWV3RmllbGQnLFxyXG4gICAgICAgICAgY2FwdGlvbjogJ0Rpc3BsYXkgaW4gZGVmYXVsdCB2aWV3JyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIHdpZHRoOiAxMDAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdJc0tleUNvbHVtbicsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICB3aWR0aDogMTUwLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnT3JkZXInLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgZWRpdG9yT3B0aW9uczogeyBmb3JtYXQ6ICcjJyB9LFxyXG4gICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiAncmFuZ2UnLFxyXG4gICAgICAgICAgICAgIG1pbjogMCxcclxuICAgICAgICAgICAgICBtZXNzYWdlOiAnT3JkZXIgY2FuXFwndCBiZSBuZWdhdGl2ZSdcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgXSxcclxuICAgICAgICAgIHdpZHRoOiA4MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ1dpZHRoJyxcclxuICAgICAgICAgIGRhdGFUeXBlOiAnbnVtYmVyJyxcclxuICAgICAgICAgIGhlYWRlckNlbGxUZW1wbGF0ZTogY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKCdXaWR0aCcsICdXaWR0aCAoaW4gcGl4ZWxzKScpLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgZWRpdG9yT3B0aW9uczogeyBmb3JtYXQ6ICcjJyB9LFxyXG4gICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiAncmFuZ2UnLFxyXG4gICAgICAgICAgICAgIG1pbjogMSxcclxuICAgICAgICAgICAgICBtZXNzYWdlOiAnV2lkdGggY2FuXFwndCBiZSBsZXNzIHRoZW4gMXB4J1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgICAgd2lkdGg6IDgwLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnSGlkaW5nT3JkZXInLFxyXG4gICAgICAgICAgZGF0YVR5cGU6ICdudW1iZXInLFxyXG4gICAgICAgICAgaGVhZGVyQ2VsbFRlbXBsYXRlOiBjcmVhdGVIZWFkZXJDZWxsVGVtcGxhdGUoJ0hpZGUnLCAnSGlkaW5nIE9yZGVyJyksXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7IGZvcm1hdDogJyMnIH0sXHJcbiAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHR5cGU6ICdyYW5nZScsXHJcbiAgICAgICAgICAgICAgbWluOiAxLFxyXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdIaWRpbmcgb3JkZXIgY2FuXFwndCBiZSBsZXNzIHRoZW4gMSdcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgXSxcclxuICAgICAgICAgIHdpZHRoOiA3MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ1Rvb2xUaXAnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgbWluV2lkdGg6IDE4MFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ1JvbGVzJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIGFsbG93SGlkaW5nOiBmYWxzZSxcclxuICAgICAgICAgIHNob3dJbkNvbHVtbkNob29zZXI6IHRydWUsXHJcbiAgICAgICAgICBjb2x1bW5zOiB0aGlzLmNyZWF0ZVJvbGVzQ29sdW1ucyh0aGlzLnJvbGVzKVxyXG4gICAgICAgIH1cclxuICAgICAgXSksXHJcbiAgICB9IGFzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnM7XHJcblxyXG4gICAgY29uc3QgYWRkaXRpb25hbE9wdGlvbnMgPSB7XHJcbiAgICAgIHN1bW1hcnlDb2x1bW46ICdOYW1lJ1xyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodGhpcy5pc1N0YW5kYWxvbmVQYWdlKSB7XHJcbiAgICAgIGdyaWQgPSBjcmVhdGVGdWxsU2NyZWVuRGF0YUdyaWQodGhpcy4kY29udGFpbmVyLCBncmlkT3B0aW9ucywgYWRkaXRpb25hbE9wdGlvbnMsIHRoaXMucGFnZVRpdGxlLCAnJywgdHJ1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBncmlkID0gY3JlYXRlRGVmYXVsdEdyaWQodGhpcy4kY29udGFpbmVyLCB7XHJcbiAgICAgICAgb3B0aW9uczogZ3JpZE9wdGlvbnMsXHJcbiAgICAgICAgc3VtbWFyeUNvbHVtbjogYWRkaXRpb25hbE9wdGlvbnMuc3VtbWFyeUNvbHVtbixcclxuICAgICAgICB0aXRsZTogdGhpcy5wYWdlVGl0bGUsXHJcbiAgICAgICAgaXNGdWxsU2NyZWVuOiBmYWxzZSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGdyaWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHByZXBhcmVNYWluR3JpZENvbHVtbnMoY29sdW1uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uW10pIHtcclxuICAgIGNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgIGlmIChjb2x1bW4uYWxsb3dIaWRpbmcgPT09IHVuZGVmaW5lZCB8fCBjb2x1bW4uYWxsb3dIaWRpbmcgPT09IG51bGwpIHtcclxuICAgICAgICBjb2x1bW4uYWxsb3dIaWRpbmcgPSBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNvbHVtbi5zaG93SW5Db2x1bW5DaG9vc2VyID09PSB1bmRlZmluZWQgfHwgY29sdW1uLnNob3dJbkNvbHVtbkNob29zZXIgPT09IG51bGwpIHtcclxuICAgICAgICBjb2x1bW4uc2hvd0luQ29sdW1uQ2hvb3NlciA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gY29sdW1ucztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlUm9sZXNDb2x1bW5zKHJvbGVzOiBzdHJpbmdbXSk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbltdIHtcclxuICAgIHJldHVybiByb2xlc1xyXG4gICAgICAubWFwKChyb2xlKSA9PiAoe1xyXG4gICAgICAgIG5hbWU6IHJvbGUsXHJcbiAgICAgICAgY2FwdGlvbjogcm9sZSxcclxuICAgICAgICBhbGxvd0hpZGluZzogdHJ1ZSxcclxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICAgIHNob3dJbkNvbHVtbkNob29zZXI6IHRydWUsXHJcbiAgICAgICAgY29sdW1uczogW1xyXG4gICAgICAgICAgdGhpcy5jcmVhdGVSb2xlc1Blcm1pc3Npb25Db2x1bW4ocm9sZSwgJ0NhbkJlUmVhZCcsIHtcclxuICAgICAgICAgICAgaGVhZGVyQ2VsbFRlbXBsYXRlOiBjcmVhdGVIZWFkZXJDZWxsVGVtcGxhdGUoJ1JlYWQnLCAnUmVhZCcpXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIHRoaXMuY3JlYXRlUm9sZXNQZXJtaXNzaW9uQ29sdW1uKHJvbGUsICdDYW5CZVVwZGF0ZWQnLCB7XHJcbiAgICAgICAgICAgIGhlYWRlckNlbGxUZW1wbGF0ZTogY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKCdFZGl0JywgJ0VkaXQnKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICBdXHJcbiAgICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlUm9sZXNQZXJtaXNzaW9uQ29sdW1uKFxyXG4gICAgcm9sZTogc3RyaW5nLCBwZXJtaXNzaW9uTmFtZTogc3RyaW5nLCBiYXNlQ29sdW1uT3B0aW9ucz86IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtblxyXG4gICk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi5iYXNlQ29sdW1uT3B0aW9ucyxcclxuICAgICAgbmFtZTogYCR7cm9sZX1fJHtwZXJtaXNzaW9uTmFtZX1gLFxyXG4gICAgICBkYXRhRmllbGQ6IGBSb2xlcy4ke3JvbGV9LiR7cGVybWlzc2lvbk5hbWV9YCxcclxuICAgICAgYWxsb3dIaWRpbmc6IGZhbHNlLFxyXG4gICAgICBzaG93SW5Db2x1bW5DaG9vc2VyOiBmYWxzZSxcclxuICAgICAgYWxsb3dIZWFkZXJGaWx0ZXJpbmc6IGZhbHNlLFxyXG4gICAgICBhbGxvd0ZpbHRlcmluZzogZmFsc2UsXHJcbiAgICAgIG1pbldpZHRoOiA2MFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTWFpbkdyaWREYXRhU291cmNlKCk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnNbJ2RhdGFTb3VyY2UnXSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzdG9yZTogY3JlYXRlRHhEYXRhU291cmNlKHtcclxuICAgICAgICBsb2FkVXJsOiB0aGlzLmxvYWREYXRhVXJsLFxyXG4gICAgICAgIHVwZGF0ZVVybDogdGhpcy51cGRhdGVEYXRhVXJsLFxyXG4gICAgICAgIGtleTogJ05hbWUnLFxyXG4gICAgICB9KVxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuXHJcbmNsYXNzIEljb25zQ29sdW1uRWRpdG9yIHtcclxuICBwcml2YXRlIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRhdGE6IElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXTtcclxuICBwcml2YXRlIGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuXHJcbiAgY29uc3RydWN0b3IoJGNvbnRhaW5lcjogSlF1ZXJ5LCBkYXRhOiBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtW10pIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9ICRjb250YWluZXI7XHJcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIGNvbnN0IG9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5Qcm9wZXJ0aWVzID0ge1xyXG4gICAgICBkYXRhU291cmNlOiB0aGlzLmRhdGEsXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBtb2RlOiAncm93JyxcclxuICAgICAgICBhbGxvd0FkZGluZzogdHJ1ZSxcclxuICAgICAgICBhbGxvd0RlbGV0aW5nOiB0cnVlLFxyXG4gICAgICAgIGFsbG93VXBkYXRpbmc6IHRydWUsXHJcbiAgICAgICAgdXNlSWNvbnM6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgaGVhZGVyRmlsdGVyOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIGdyb3VwaW5nOiB7IGNvbnRleHRNZW51RW5hYmxlZDogZmFsc2UgfSxcclxuICAgICAgZ3JvdXBQYW5lbDogeyB2aXNpYmxlOiBmYWxzZSB9LFxyXG4gICAgICBzZWFyY2hQYW5lbDogeyB2aXNpYmxlOiBmYWxzZSB9LFxyXG4gICAgICBmaWx0ZXJSb3c6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgcmVtb3RlT3BlcmF0aW9uczogZmFsc2UsXHJcbiAgICAgIHNlbGVjdGlvbjoge1xyXG4gICAgICAgIG1vZGU6ICdub25lJ1xyXG4gICAgICB9LFxyXG4gICAgICBjb2x1bW5zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAndmFsdWUnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAndGl0bGUnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnaW1hZ2UnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgY2VsbFRlbXBsYXRlOiAoY29udGFpbmVyLCBjZWxsRGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAkKCc8ZGl2PicpXHJcbiAgICAgICAgICAgICAgLmNzcyh7ICd0ZXh0LWFsaWduJzogJ2NlbnRlcicgfSlcclxuICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxpbWc+JywgeyBzcmM6IGNlbGxEYXRhLmRhdGEuaW1hZ2UgfSkpXHJcbiAgICAgICAgICAgICAgLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZWRpdENlbGxUZW1wbGF0ZTogKF8sIGNlbGxJbmZvKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGltZyA9IGNlbGxJbmZvLnZhbHVlIHx8ICcnO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgJGNvbnRhaW5lciA9ICQoJzxkaXYgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyO1wiIC8+Jyk7XHJcbiAgICAgICAgICAgIGNvbnN0ICRpbWcgPSAkKGA8aW1nIHNyYz1cIiR7aW1nfVwiIC8+YCk7XHJcbiAgICAgICAgICAgIGNvbnN0ICRsaW5rID0gJCgnPGEgY2xhc3M9XCJkeC1saW5rIGR4LWljb24tdXBsb2FkXCIgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IHJpZ2h0OiA4cHg7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC1zaXplOiAxOHB4O1wiIC8+Jyk7XHJcbiAgICAgICAgICAgIGNvbnN0ICRmaWxlSW5wdXQgPSAkKCc8aW5wdXQgdHlwZT1cImZpbGVcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiAvPicpO1xyXG5cclxuICAgICAgICAgICAgJGxpbmsub24oJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICRmaWxlSW5wdXQuY2xpY2soKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAkZmlsZUlucHV0Lm9uKCdjaGFuZ2UnLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICgoZS50YXJnZXQgYXMgYW55KS5maWxlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgICAgICAgICByZWFkZXIub25sb2FkZW5kID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAkaW1nLmF0dHIoJ3NyYycsIChyZWFkZXIucmVzdWx0IGFzIHN0cmluZykpO1xyXG4gICAgICAgICAgICAgICAgICBjZWxsSW5mby5zZXRWYWx1ZSgocmVhZGVyLnJlc3VsdCBhcyBzdHJpbmcpKTtcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IChlLnRhcmdldCBhcyBhbnkpLmZpbGVzWzBdO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7XHJcbiAgICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgJGltZy5hdHRyKCdzcmMnLCAnJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICRpbWcuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICRsaW5rLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG4gICAgICAgICAgICAkZmlsZUlucHV0LmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuICRjb250YWluZXI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgdHlwZTogJ2J1dHRvbnMnLFxyXG4gICAgICAgICAgd2lkdGg6IDEwMCxcclxuICAgICAgICAgIGJ1dHRvbnM6IFtcclxuICAgICAgICAgICAgJ2VkaXQnLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgaGludDogJ0RlbGV0ZScsXHJcbiAgICAgICAgICAgICAgaWNvbjogJ3RyYXNoJyxcclxuICAgICAgICAgICAgICBvbkNsaWNrOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93cyA9IHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAocm93cyBhcyBhbnlbXSkuc3BsaWNlKGUucm93LnJvd0luZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnLCByb3dzKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgJGdyaWQgPSAkKCc8ZGl2IC8+JykuYXBwZW5kVG8odGhpcy4kY29udGFpbmVyKTtcclxuXHJcbiAgICB0aGlzLmdyaWQgPSBjcmVhdGVEZWZhdWx0R3JpZChcclxuICAgICAgJGdyaWQsXHJcbiAgICAgIHtcclxuICAgICAgICBvcHRpb25zLFxyXG4gICAgICAgIGlzRnVsbFNjcmVlbjogZmFsc2VcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREYXRhKCk6IElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmlkLm9wdGlvbignZGF0YVNvdXJjZScpIGFzIElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXTtcclxuICB9XHJcbn1cclxuXHJcbmNsYXNzIFByZWRlZmluZWRWYWx1ZXNDb2x1bW5FZGl0b3Ige1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YTogSVByZWRlZmluZWRWYWx1ZXNFZGl0b3JJdGVtW107XHJcbiAgcHJpdmF0ZSBncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCRjb250YWluZXI6IEpRdWVyeSwgZGF0YTogSUljb25zQ29sdW1uRWRpdG9ySXRlbVtdKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSAkY29udGFpbmVyO1xyXG4gICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBjb25zdCBvcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuUHJvcGVydGllcyA9IHtcclxuICAgICAgZGF0YVNvdXJjZTogdGhpcy5kYXRhLFxyXG4gICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgbW9kZTogJ3JvdycsXHJcbiAgICAgICAgYWxsb3dBZGRpbmc6IHRydWUsXHJcbiAgICAgICAgYWxsb3dEZWxldGluZzogdHJ1ZSxcclxuICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxyXG4gICAgICAgIHVzZUljb25zOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIGhlYWRlckZpbHRlcjogeyB2aXNpYmxlOiBmYWxzZSB9LFxyXG4gICAgICBncm91cGluZzogeyBjb250ZXh0TWVudUVuYWJsZWQ6IGZhbHNlIH0sXHJcbiAgICAgIGdyb3VwUGFuZWw6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgc2VhcmNoUGFuZWw6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgZmlsdGVyUm93OiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IGZhbHNlLFxyXG4gICAgICBzZWxlY3Rpb246IHtcclxuICAgICAgICBtb2RlOiAnbm9uZSdcclxuICAgICAgfSxcclxuICAgICAgY29sdW1uczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ3ZhbHVlJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICB0eXBlOiAnYnV0dG9ucycsXHJcbiAgICAgICAgICB3aWR0aDogMTAwLFxyXG4gICAgICAgICAgYnV0dG9uczogW1xyXG4gICAgICAgICAgICAnZWRpdCcsXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBoaW50OiAnRGVsZXRlJyxcclxuICAgICAgICAgICAgICBpY29uOiAndHJhc2gnLFxyXG4gICAgICAgICAgICAgIG9uQ2xpY2s6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByb3dzID0gdGhpcy5ncmlkLm9wdGlvbignZGF0YVNvdXJjZScpO1xyXG5cclxuICAgICAgICAgICAgICAgIChyb3dzIGFzIGFueVtdKS5zcGxpY2UoZS5yb3cucm93SW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkLm9wdGlvbignZGF0YVNvdXJjZScsIHJvd3MpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgXVxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCAkZ3JpZCA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbyh0aGlzLiRjb250YWluZXIpO1xyXG5cclxuICAgIHRoaXMuZ3JpZCA9IGNyZWF0ZURlZmF1bHRHcmlkKCRncmlkLCB7XHJcbiAgICAgIG9wdGlvbnMsXHJcbiAgICAgIGlzRnVsbFNjcmVlbjogZmFsc2VcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldERhdGEoKTogSUljb25zQ29sdW1uRWRpdG9ySXRlbVtdIHtcclxuICAgIHJldHVybiB0aGlzLmdyaWQub3B0aW9uKCdkYXRhU291cmNlJykgYXMgSUljb25zQ29sdW1uRWRpdG9ySXRlbVtdO1xyXG4gIH1cclxufVxyXG5cclxuY2xhc3MgUmFiYml0QWN0aW9uQ29sdW1uRWRpdG9yIHtcclxuICBwcml2YXRlIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRhdGE6IElSYWJiaXRBY3Rpb25FZGl0b3JEYXRhO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5pdERhdGE6IElSYWJiaXRBY3Rpb25FZGl0b3JJbml0RGF0YTtcclxuICBwcml2YXRlIGZvcm06IERldkV4cHJlc3MudWkuZHhGb3JtO1xyXG5cclxuICBjb25zdHJ1Y3RvcigkY29udGFpbmVyOiBKUXVlcnksIGRhdGE6IElSYWJiaXRBY3Rpb25FZGl0b3JEYXRhLCBpbml0RGF0YTogSVJhYmJpdEFjdGlvbkVkaXRvckluaXREYXRhKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSAkY29udGFpbmVyO1xyXG4gICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgIHRoaXMuaW5pdERhdGEgPSBpbml0RGF0YTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICB0aGlzLmZvcm0gPSAkKCc8ZGl2IC8+JykuZHhGb3JtKHtcclxuICAgICAgZm9ybURhdGE6IHRoaXMuZGF0YSxcclxuICAgICAgbGFiZWxMb2NhdGlvbjogJ3RvcCcsXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnYWN0aW9uVHlwZScsXHJcbiAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFt7XHJcbiAgICAgICAgICAgIHR5cGU6ICdyZXF1aXJlZCdcclxuICAgICAgICAgIH1dXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdmaWVsZHMnLFxyXG4gICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbe1xyXG4gICAgICAgICAgICB0eXBlOiAncmVxdWlyZWQnXHJcbiAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxyXG4gICAgICAgICAgICB2YWxpZGF0aW9uQ2FsbGJhY2s6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIChlLnZhbHVlIGFzIGFueSkubGVuZ3RoID4gMDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbWVzc2FnZTogJ1JlcXVpcmVkJ1xyXG4gICAgICAgICAgfV0sXHJcbiAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhUYWdCb3gnLFxyXG4gICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgICBkYXRhU291cmNlOiB0aGlzLmluaXREYXRhLmZpZWxkcyxcclxuICAgICAgICAgICAgZGlzcGxheUV4cHI6ICdUZXh0JyxcclxuICAgICAgICAgICAgdmFsdWVFeHByOiAnVmFsdWUnLFxyXG4gICAgICAgICAgICBzZWFyY2hFbmFibGVkOiB0cnVlXHJcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUYWdCb3hPcHRpb25zXHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9KS5hcHBlbmRUbyh0aGlzLiRjb250YWluZXIpLmR4Rm9ybSgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREYXRhKCk6IElSYWJiaXRBY3Rpb25FZGl0b3JEYXRhIHtcclxuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB0aGlzLmZvcm0udmFsaWRhdGUoKTtcclxuXHJcbiAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYWN0aW9uVHlwZSA9IHRoaXMuZm9ybS5nZXRFZGl0b3IoJ2FjdGlvblR5cGUnKS5vcHRpb24oJ3ZhbHVlJykgYXMgc3RyaW5nO1xyXG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5mb3JtLmdldEVkaXRvcignZmllbGRzJykub3B0aW9uKCd2YWx1ZScpIGFzIHN0cmluZ1tdO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGFjdGlvblR5cGUsXHJcbiAgICAgIGZpZWxkc1xyXG4gICAgfTtcclxuICB9XHJcbn1cclxuXHJcbihEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQgYXMgYW55KS5yZWdpc3Rlck1vZHVsZSgnY29sdW1uQ2hvb3NlclNvcnRpbmcnLCB7XHJcbiAgZXh0ZW5kZXJzOiB7XHJcbiAgICBjb250cm9sbGVyczoge1xyXG4gICAgICBjb2x1bW5zOiB7XHJcbiAgICAgICAgZ2V0Q2hvb3NlckNvbHVtbnMobG9hZEFsbENvbHVtbnMpIHtcclxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9ICh0aGlzIGFzIGFueSkuY2FsbEJhc2UobG9hZEFsbENvbHVtbnMpO1xyXG5cclxuICAgICAgICAgIHJldHVybiByZXN1bHQuc29ydCgoY29sdW1uMSwgY29sdW1uMikgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjYXB0aW9uMSA9IGNvbHVtbjE/LmNhcHRpb24gfHwgJyc7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhcHRpb24yID0gY29sdW1uMj8uY2FwdGlvbiB8fCAnJztcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjYXB0aW9uMS5sb2NhbGVDb21wYXJlKGNhcHRpb24yKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufSk7XHJcbiIsICJcdUZFRkZjb25zdCBhcmVBcmd1bWVudHNTaGFsbG93bHlFcXVhbCA9IChwcmV2OiBhbnlbXSB8IG51bGwsIG5leHQ6IGFueVtdIHwgbnVsbCkgPT4ge1xyXG4gIGlmIChwcmV2ID09PSBudWxsIHx8IG5leHQgPT09IG51bGwgfHwgcHJldi5sZW5ndGggIT09IG5leHQubGVuZ3RoKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXYubGVuZ3RoOyBpKyspIHtcclxuICAgIGlmIChwcmV2W2ldICE9PSBuZXh0W2ldKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiB0cnVlO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IG1lbW9pemUgPSA8VCBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55PihmdW5jOiBUKTogVCA9PiB7XHJcbiAgbGV0IGxhc3RBcmdzOiBhbnlbXSB8IG51bGwgPSBudWxsO1xyXG4gIGxldCBsYXN0UmVzdWx0OiB1bmtub3duIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogb25seS1hcnJvdy1mdW5jdGlvbnNcclxuICByZXR1cm4gZnVuY3Rpb24oLi4uYXJncykge1xyXG4gICAgaWYgKCFhcmVBcmd1bWVudHNTaGFsbG93bHlFcXVhbChsYXN0QXJncywgYXJncykpIHtcclxuICAgICAgbGFzdFJlc3VsdCA9IGZ1bmMoLi4uYXJncyBhcyBhbnkpO1xyXG4gICAgfVxyXG5cclxuICAgIGxhc3RBcmdzID0gYXJncztcclxuXHJcbiAgICByZXR1cm4gbGFzdFJlc3VsdDtcclxuICB9IGFzIFQ7XHJcbn07XHJcbiIsICJcdUZFRkYvLyB0c2xpbnQ6ZGlzYWJsZTogbWVtYmVyLW9yZGVyaW5nXHJcbmltcG9ydCB7IElHcmlkU3RhdGUgfSBmcm9tICcuL0dyaWRTdGF0ZSc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHsgbWVtb2l6ZSB9IGZyb20gJy4uLy4uLy4uL1V0aWxzL01lbW9pemUnO1xyXG5pbXBvcnQgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24gZnJvbSAnLi4vLi4vLi4vRGF0YS9Mb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDb250cm9sRGlzcGxheVZpZXcge1xyXG4gIHJlYWRvbmx5IGlkOiBudW1iZXI7XHJcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IGdyaWRTdGF0ZTogSUdyaWRTdGF0ZSB8IG51bGw7XHJcbiAgaXNHbG9iYWw6IGJvb2xlYW47XHJcbn1cclxuXHJcbmludGVyZmFjZSBJQ29udHJvbERpc3BsYXlWaWV3RHRvIHtcclxuICBJZDogbnVtYmVyO1xyXG4gIE5hbWU6IHN0cmluZztcclxuICBHcmlkU3RhdGU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XHJcbiAgSXNHbG9iYWw6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zIHtcclxuICAvLyByZWFkb25seSBkZWZhdWx0T3BlbmVkVmlld0lkOiBudW1iZXI7XHJcbiAgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBpbnNlcnREYXRhVXJsOiBzdHJpbmc7XHJcbiAgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG4gIGRlbGV0ZURhdGFVcmw6IHN0cmluZztcclxufVxyXG5cclxudHlwZSBDb250cm9sRGlzcGxheVZpZXdVcGRhdGVzID0gUGFydGlhbDxQaWNrPElDb250cm9sRGlzcGxheVZpZXcsICduYW1lJyB8ICdncmlkU3RhdGUnIHwgJ2lzR2xvYmFsJz4+O1xyXG5cclxuZXhwb3J0IGNsYXNzIEdyaWRWaWV3c01hbmFnZXIge1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZGVmYXVsdENvbnRyb2xEaXNwbGF5VmlldzogSUNvbnRyb2xEaXNwbGF5VmlldyA9IHtcclxuICAgIGlkOiAwLFxyXG4gICAgbmFtZTogJ0RlZmF1bHQnLFxyXG4gICAgZ3JpZFN0YXRlOiBudWxsLFxyXG4gICAgaXNHbG9iYWw6IGZhbHNlXHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgZGVmYXVsdFZpZXdzID0gW0dyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlld107XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgX2N1cnJlbnRWaWV3SWQ6IG51bWJlciA9IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZDtcclxuICBwcml2YXRlIHZpZXdzOiBJQ29udHJvbERpc3BsYXlWaWV3W10gPSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRWaWV3cztcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbnNlcnREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVEYXRhVXJsOiBzdHJpbmc7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2V0Vmlld0J5SWRJbnRlcm5hbCA9ICh2aWV3SWQ6IG51bWJlcikgPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMudmlld3MgJiYgdGhpcy52aWV3cy5maW5kKCh2KSA9PiB2LmlkID09PSB2aWV3SWQpO1xyXG4gIH1cclxuICBwcml2YXRlIGdldFZpZXdCeUlkID0gbWVtb2l6ZSh0aGlzLmdldFZpZXdCeUlkSW50ZXJuYWwpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJR3JpZFZpZXdzTWFuYWdlck9wdGlvbnMpIHtcclxuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xyXG4gICAgdGhpcy5pbnNlcnREYXRhVXJsID0gb3B0aW9ucy5pbnNlcnREYXRhVXJsO1xyXG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xyXG4gICAgdGhpcy5kZWxldGVEYXRhVXJsID0gb3B0aW9ucy5kZWxldGVEYXRhVXJsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXJyZW50VmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLmdldFZpZXdCeUlkKHRoaXMuX2N1cnJlbnRWaWV3SWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXJyZW50Vmlld0lkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRWaWV3SWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGN1cnJlbnRWaWV3SWQoaWQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5fY3VycmVudFZpZXdJZCA9IGlkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldFZpZXdzKCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5Vmlld1tdPiB7XHJcbiAgICBpZiAodGhpcy52aWV3cyA9PT0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Vmlld3MpIHtcclxuICAgICAgYXdhaXQgdGhpcy5sb2FkVmlld3MoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy52aWV3cztcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVDdXJyZW50Vmlldyh2aWV3VXBkYXRlczogQ29udHJvbERpc3BsYXlWaWV3VXBkYXRlcykge1xyXG4gICAgcmV0dXJuIHRoaXMudXBkYXRlVmlldyh0aGlzLmN1cnJlbnRWaWV3LmlkLCB2aWV3VXBkYXRlcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgY3JlYXRlTmV3Vmlldyh2aWV3TmFtZTogc3RyaW5nLCBncmlkU3RhdGU6IElHcmlkU3RhdGUsIGlzR2xvYmFsKTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlWaWV3PiB7XHJcbiAgICBsZXQgbmV3Vmlld0R0bzogSUNvbnRyb2xEaXNwbGF5Vmlld0R0byA9IHRoaXMubWFwVmlld01vZGVsVG9EdG8oe1xyXG4gICAgICBpZDogLTEsXHJcbiAgICAgIG5hbWU6IHZpZXdOYW1lLFxyXG4gICAgICBncmlkU3RhdGUsXHJcbiAgICAgIGlzR2xvYmFsXHJcbiAgICB9KTtcclxuXHJcbiAgICBuZXdWaWV3RHRvID0gYXdhaXQgc2VuZFJlcXVlc3Q8SUNvbnRyb2xEaXNwbGF5Vmlld0R0bz4odGhpcy5pbnNlcnREYXRhVXJsLCAnUE9TVCcsIG5ld1ZpZXdEdG8pO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkVmlld3MoKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5tYXBWaWV3RHRvVG9Nb2RlbChuZXdWaWV3RHRvKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVWaWV3KHZpZXdJZDogbnVtYmVyLCB1cGRhdGVzOiBDb250cm9sRGlzcGxheVZpZXdVcGRhdGVzKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAodmlld0lkID09PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHZpZXcgPSB0aGlzLmdldFZpZXdCeUlkKHZpZXdJZCk7XHJcbiAgICBpZiAoIXZpZXcpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHVwZGF0ZWRWaWV3OiBJQ29udHJvbERpc3BsYXlWaWV3ID0ge1xyXG4gICAgICAuLi52aWV3LFxyXG4gICAgICAuLi51cGRhdGVzXHJcbiAgICB9O1xyXG4gICAgbGV0IHVwZGF0ZWRWaWV3RHRvOiBJQ29udHJvbERpc3BsYXlWaWV3RHRvID0gdGhpcy5tYXBWaWV3TW9kZWxUb0R0byh1cGRhdGVkVmlldyk7XHJcblxyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgIHVwZGF0ZWRWaWV3RHRvID0gYXdhaXQgc2VuZFJlcXVlc3Q8SUNvbnRyb2xEaXNwbGF5Vmlld0R0bz4odGhpcy51cGRhdGVEYXRhVXJsLCAnUFVUJywgdXBkYXRlZFZpZXdEdG8pO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkVmlld3MoKTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBkZWxldGVWaWV3KHZpZXdJZDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAodmlld0lkID09PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHZpZXcgPSB0aGlzLmdldFZpZXdCeUlkKHZpZXdJZCk7XHJcbiAgICBpZiAoIXZpZXcpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IHNlbmRSZXF1ZXN0KHRoaXMuZGVsZXRlRGF0YVVybCwgJ0RFTEVURScsIHsgdmlld0lkIH0pO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkVmlld3MoKTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbG9hZFZpZXdzKCkge1xyXG4gICAgY29uc3Qgdmlld3MgPSBhd2FpdCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbjxJQ29udHJvbERpc3BsYXlWaWV3RHRvW10+KHRoaXMubG9hZERhdGFVcmwpO1xyXG5cclxuICAgIHRoaXMudmlld3MgPSB2aWV3cy5tYXAoKGR0bykgPT4gdGhpcy5tYXBWaWV3RHRvVG9Nb2RlbChkdG8pKTtcclxuICAgIHRoaXMudmlld3MudW5zaGlmdChHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcpO1xyXG4gICAgLy8gTk9URTogcmVzZXQgbWVtb2l6ZVxyXG4gICAgdGhpcy5yZXNldENhY2hlZFJlc3VsdE9mR2V0Vmlld0J5SWRGdW5jdGlvbigpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnZpZXdzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXBWaWV3TW9kZWxUb0R0byhtb2RlbDogSUNvbnRyb2xEaXNwbGF5Vmlldyk6IElDb250cm9sRGlzcGxheVZpZXdEdG8ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgSWQ6IG1vZGVsLmlkLFxyXG4gICAgICBOYW1lOiBtb2RlbC5uYW1lLFxyXG4gICAgICBHcmlkU3RhdGU6IEpTT04uc3RyaW5naWZ5KG1vZGVsLmdyaWRTdGF0ZSksXHJcbiAgICAgIElzR2xvYmFsOiBtb2RlbC5pc0dsb2JhbFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwVmlld0R0b1RvTW9kZWwoZHRvOiBJQ29udHJvbERpc3BsYXlWaWV3RHRvKTogSUNvbnRyb2xEaXNwbGF5VmlldyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpZDogZHRvLklkLFxyXG4gICAgICBuYW1lOiBkdG8uTmFtZSxcclxuICAgICAgZ3JpZFN0YXRlOiBKU09OLnBhcnNlKGR0by5HcmlkU3RhdGUpLFxyXG4gICAgICBpc0dsb2JhbDogZHRvLklzR2xvYmFsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldENhY2hlZFJlc3VsdE9mR2V0Vmlld0J5SWRGdW5jdGlvbigpIHtcclxuICAgIHRoaXMuZ2V0Vmlld0J5SWQgPSBtZW1vaXplKHRoaXMuZ2V0Vmlld0J5SWRJbnRlcm5hbCk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJR3JpZFN0YXRlIH0gZnJvbSAnLi9HcmlkU3RhdGUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJT25lVGltZUdyaWRTdGF0ZU1hbmFnZXJPcHRpb25zIHtcclxuICByZWFkb25seSBvd25lcjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG4gIHJlYWRvbmx5IGluaXRpYWxTdGF0ZTogSUdyaWRTdGF0ZSB8IG51bGw7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBPbmVUaW1lR3JpZFN0YXRlTWFuYWdlciB7XHJcbiAgcHVibGljIGN1cnJlbnRTYXZlZEdyaWRTdGF0ZTogSUdyaWRTdGF0ZTtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBJT25lVGltZUdyaWRTdGF0ZU1hbmFnZXJPcHRpb25zO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJT25lVGltZUdyaWRTdGF0ZU1hbmFnZXJPcHRpb25zKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgdGhpcy5jdXJyZW50U2F2ZWRHcmlkU3RhdGUgPSBvcHRpb25zLmluaXRpYWxTdGF0ZTtcclxuXHJcbiAgICB0aGlzLm9wdGlvbnMub3duZXIub3B0aW9uKCdzdGF0ZVN0b3JpbmcnLCB7XHJcbiAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgIHR5cGU6ICdjdXN0b20nLFxyXG4gICAgICBjdXN0b21Mb2FkOiAoKSA9PiBQcm9taXNlLnJlc29sdmUodGhpcy5jdXJyZW50U2F2ZWRHcmlkU3RhdGUpXHJcbiAgICB9IGFzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnNbJ3N0YXRlU3RvcmluZyddKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaGFzQ2hhbmdlcygpIHtcclxuICAgIC8vIFRPRE86IHVzZSBkZWVwIGVxdWFsXHJcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U2F2ZWRHcmlkU3RhdGUgIT09IG51bGwgJiYgSlNPTi5zdHJpbmdpZnkodGhpcy5jdXJyZW50VW5zYXZlZEdyaWRTdGF0ZSkgIT09IEpTT04uc3RyaW5naWZ5KFxyXG4gICAgICB0aGlzLmN1cnJlbnRTYXZlZEdyaWRTdGF0ZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1cnJlbnRVbnNhdmVkR3JpZFN0YXRlKCk6IElHcmlkU3RhdGUge1xyXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZVVuc2F2ZWRHcmlkU3RhdGUodGhpcy5vcHRpb25zLm93bmVyLnN0YXRlKCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGFwcGx5KGdyaWRTdGF0ZTogSUdyaWRTdGF0ZSB8IG51bGwsIHJlc2V0RmlsdGVyID0gdHJ1ZSkge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3QgY3VycmVudEZpbHRlciA9IHJlc2V0RmlsdGVyID8gdW5kZWZpbmVkIDogdGhpcy5vcHRpb25zLm93bmVyLmZpbHRlcigpO1xyXG5cclxuICAgICAgLyogTk9URTogU29tZXRpbWVzIGEgZ3JpZCBjYW4gcmV0dXJuIGEgbmV3IHN0YXRlIHdpdGggb2xkIGZpbHRlclZhbHVlLFxyXG4gICAgICAgIHNvIHdlIHNob3VsZCByZXNldCB0aGUgZmlsdGVyVmFsdWUgYmVmb3JlIHN0YXRlIGFwcGx5aW5nXHJcbiAgICAgICAgaWYgdGhpcyBidWcgd2lsbCBiZSBmaXhlZCBvbiB0aGUgRGV2RXh0cmVtZSBzaWRlIHdlIGNhbiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lXHJcbiAgICAgICovXHJcbiAgICAgIHRoaXMub3B0aW9ucy5vd25lci5iZWdpblVwZGF0ZSgpO1xyXG4gICAgICB0aGlzLm9wdGlvbnMub3duZXIuY2xlYXJGaWx0ZXIoJ2ZpbHRlclZhbHVlJyk7XHJcblxyXG4gICAgICB0aGlzLm9wdGlvbnMub3duZXIuc3RhdGUoZ3JpZFN0YXRlKTtcclxuXHJcbiAgICAgIGNvbnN0IHZpc2libGVDb2x1bW5zID0gdGhpcy5vcHRpb25zLm93bmVyLmdldFZpc2libGVDb2x1bW5zKCkuZmlsdGVyKChjKSA9PiAhYy50eXBlKTtcclxuXHJcbiAgICAgIGlmICh2aXNpYmxlQ29sdW1uc1swXSAmJiB2aXNpYmxlQ29sdW1uc1swXS5kYXRhRmllbGQpIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMub3duZXIub3B0aW9uKCdzdW1tYXJ5Jywge1xyXG4gICAgICAgICAgdG90YWxJdGVtczogW3tcclxuICAgICAgICAgICAgY29sdW1uOiB2aXNpYmxlQ29sdW1uc1swXS5kYXRhRmllbGQsXHJcbiAgICAgICAgICAgIHN1bW1hcnlUeXBlOiAnY291bnQnXHJcbiAgICAgICAgICB9XVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjdXJyZW50RmlsdGVyICYmIHRoaXMub3B0aW9ucy5vd25lci5maWx0ZXIoY3VycmVudEZpbHRlcik7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5vd25lci5lbmRVcGRhdGUoKTtcclxuXHJcbiAgICAgIGNvbnN0IG9uQ29udGVudFJlYWR5ID0gKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2F2ZSgpO1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB0aGlzLm9wdGlvbnMub3duZXIub2ZmKCdjb250ZW50UmVhZHknLCBvbkNvbnRlbnRSZWFkeSk7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLm9wdGlvbnMub3duZXIub24oJ2NvbnRlbnRSZWFkeScsIG9uQ29udGVudFJlYWR5KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNhdmUoKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRTYXZlZEdyaWRTdGF0ZSA9IHRoaXMuY3VycmVudFVuc2F2ZWRHcmlkU3RhdGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzZXQoKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMub3duZXIuc3RhdGUodGhpcy5jdXJyZW50U2F2ZWRHcmlkU3RhdGUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwcmVwYXJlVW5zYXZlZEdyaWRTdGF0ZSh1bnNhdmVkR3JpZFN0YXRlOiBJR3JpZFN0YXRlKTogSUdyaWRTdGF0ZSB7XHJcbiAgICBpZiAodW5zYXZlZEdyaWRTdGF0ZS5jb2x1bW5zKSB7XHJcbiAgICAgIGNvbnN0IHZpc2libGVDb2x1bW5zID0gdW5zYXZlZEdyaWRTdGF0ZS5jb2x1bW5zXHJcbiAgICAgICAgLmZpbHRlcigoYykgPT4gYy52aXNpYmxlKTtcclxuICAgICAgY29uc3QgbGFzdENvbHVtbiA9IHZpc2libGVDb2x1bW5zW3Zpc2libGVDb2x1bW5zLmxlbmd0aCAtIDFdO1xyXG4gICAgICBsYXN0Q29sdW1uLndpZHRoID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB1bnNhdmVkR3JpZFN0YXRlO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgR3JpZFZpZXdzTWFuYWdlciwgSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zIH0gZnJvbSAnLi9HcmlkVmlld3NNYW5hZ2VyJztcclxuaW1wb3J0IHsgT25lVGltZUdyaWRTdGF0ZU1hbmFnZXIgfSBmcm9tICcuL0dyaWRTdGF0ZU1hbmFnZXInO1xyXG5pbXBvcnQgeyBNdXRhYmxlIH0gZnJvbSAnLi4vLi4vLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHsgY3JlYXRlRGlhbG9nIH0gZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9Qb3B1cCc7XHJcbmltcG9ydCBub3RpZnkgZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9Ob3RpZnknO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMge1xyXG4gIHJlYWRvbmx5IG93bmVyOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XHJcbiAgcmVhZG9ubHkgZ3JpZFZpZXdzTWFuYWdlcjogR3JpZFZpZXdzTWFuYWdlcjtcclxuICByZWFkb25seSBncmlkU3RhdGVNYW5hZ2VyOiBPbmVUaW1lR3JpZFN0YXRlTWFuYWdlcjtcclxuICByZWFkb25seSBhdXRvSW50ZWdyYXRpb246IGJvb2xlYW47XHJcbiAgcmVhZG9ubHkgb25WaWV3QXBwbGllZD86ICh2aWV3SWQ6IG51bWJlcikgPT4gdm9pZDtcclxuICByZWFkb25seSBvblZpZXdEZWxldGVkPzogKHZpZXdJZDogbnVtYmVyKSA9PiB2b2lkO1xyXG4gIHJlYWRvbmx5IGNhbkNyZWF0ZUdsb2JhbFZpZXdzOiBib29sZWFuO1xyXG4gIHJlYWRvbmx5IHZpc2libGU6IGJvb2xlYW47XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudERlZmF1bHRPcHRpb25zIHtcclxuICByZWFkb25seSBncmlkVmlld3NNYW5hZ2VyOiBHcmlkVmlld3NNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGdyaWRWaWV3c01hbmFnZXJPcHRpb25zOiBJR3JpZFZpZXdzTWFuYWdlck9wdGlvbnM7XHJcbiAgcmVhZG9ubHkgZ3JpZFN0YXRlTWFuYWdlcjogT25lVGltZUdyaWRTdGF0ZU1hbmFnZXI7XHJcbiAgcmVhZG9ubHkgYXV0b0ludGVncmF0aW9uOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50T3B0aW9ucyA9XHJcbiAgTXV0YWJsZTxPbWl0PElHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50T3B0aW9ucywga2V5b2YgSUdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnREZWZhdWx0T3B0aW9ucz4+ICZcclxuICBNdXRhYmxlPFBhcnRpYWw8SUdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnREZWZhdWx0T3B0aW9ucz4+O1xyXG5cclxuZXhwb3J0IGNsYXNzIEdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQge1xyXG4gIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBJR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudE9wdGlvbnM7XHJcbiAgLy8gdG9vbGJhciBpdGVtc1xyXG4gIC8vIHRzbGludDpkaXNhYmxlIHZhcmlhYmxlLW5hbWVcclxuICBwcml2YXRlIF92aWV3c1Rvb2xiYXJJdGVtOiBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW0gfCB1bmRlZmluZWQ7XHJcbiAgLy8gdHNsaW50OmVuYWJsZSB2YXJpYWJsZS1uYW1lXHJcblxyXG4gIC8vIHRvb2xiYXIgd2lkZ2V0c1xyXG4gIHByaXZhdGUgdmlld3NEcm9wZG93bkJveDogRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHZpZXdzRGF0YUdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGN1cnJlbnRWaWV3VGl0bGU6IERldkV4cHJlc3MudWkuZHhUZXh0Qm94IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgc2F2ZVZpZXdCdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b24gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBzYXZlVmlld0FzQnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgY29sdW1uQ2hvb3NlckJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IHtcclxuICAgICAgLi4ub3B0aW9ucyxcclxuICAgICAgZ3JpZFN0YXRlTWFuYWdlcjogb3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyID8gb3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyIDogbmV3IE9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyKHtcclxuICAgICAgICBvd25lcjogb3B0aW9ucy5vd25lcixcclxuICAgICAgICBpbml0aWFsU3RhdGU6IG51bGxcclxuICAgICAgfSksXHJcbiAgICAgIGdyaWRWaWV3c01hbmFnZXI6IG9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlciA/IG9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlciA6IG5ldyBHcmlkVmlld3NNYW5hZ2VyKG9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlck9wdGlvbnMpLFxyXG4gICAgICBhdXRvSW50ZWdyYXRpb246IChvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuYXV0b0ludGVncmF0aW9uICE9PSBudWxsKVxyXG4gICAgICAgID8gb3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gOiB0cnVlXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMub3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gJiYgdGhpcy5pbnRlZ3JhdGVUb0dyaWQodGhpcy5vcHRpb25zLm93bmVyKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyB0cnlBcHBseVZpZXcodmlld0lkOiBudW1iZXIgfCB1bmRlZmluZWQpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IGlzQ2FuQmVWaWV3QXBwbGllZCA9IGF3YWl0IHRoaXMuY29uZmlybUNoYW5nZXNMb3NzKCk7XHJcblxyXG4gICAgaWYgKGlzQ2FuQmVWaWV3QXBwbGllZCkge1xyXG4gICAgICBhd2FpdCB0aGlzLmFwcGx5Vmlldyh2aWV3SWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpc0NhbkJlVmlld0FwcGxpZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgYXBwbHlWaWV3KHZpZXdJZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmJlZ2luVmlld0FwcGx5aW5nTG9hZGluZygpO1xyXG5cclxuICAgIHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWQgPSB2aWV3SWQ7XHJcbiAgICBhd2FpdCB0aGlzLm9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlci5hcHBseSh0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlldy5ncmlkU3RhdGUsIGZhbHNlKTtcclxuXHJcbiAgICB0aGlzLmVuZFZpZXdBcHBseWluZ0xvYWRpbmcoKTtcclxuICAgIHRoaXMuc3luY1VJV2l0aEN1cnJlbnRWaWV3KCk7XHJcblxyXG4gICAgdGhpcy5vcHRpb25zLm9uVmlld0FwcGxpZWQgJiYgdGhpcy5vcHRpb25zLm9uVmlld0FwcGxpZWQodmlld0lkKTtcclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGludGVncmF0ZVRvR3JpZChncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQpIHtcclxuICAgIGNvbnN0IGN1cnJlbnRUb29sYmFyUHJlcGFyaW5nID0gZ3JpZC5vcHRpb24oJ29uVG9vbGJhclByZXBhcmluZycpO1xyXG5cclxuICAgIGdyaWQub3B0aW9uKCdvblRvb2xiYXJQcmVwYXJpbmcnLCAoZTogYW55KSA9PiB7XHJcbiAgICAgIGN1cnJlbnRUb29sYmFyUHJlcGFyaW5nICYmIGN1cnJlbnRUb29sYmFyUHJlcGFyaW5nKGUpO1xyXG4gICAgICB0aGlzLm9uR3JpZFRvb2xiYXJQcmVwYXJpbmcoZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25HcmlkVG9vbGJhclByZXBhcmluZzogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snb25Ub29sYmFyUHJlcGFyaW5nJ10gPSAoZSkgPT4ge1xyXG4gICAgY29uc3QgdG9vbGJhckl0ZW1zID0gZS50b29sYmFyT3B0aW9ucyAmJiBlLnRvb2xiYXJPcHRpb25zLml0ZW1zO1xyXG4gICAgaWYgKCF0b29sYmFySXRlbXMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVtb3ZlRGVmYXVsdENvbHVtbkNob29zZXJCdXR0b24odG9vbGJhckl0ZW1zKTtcclxuXHJcbiAgICB0b29sYmFySXRlbXMuc3BsaWNlKDEsIDAsXHJcbiAgICAgIHRoaXMudmlld3NUb29sYmFySXRlbSxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbW92ZURlZmF1bHRDb2x1bW5DaG9vc2VyQnV0dG9uKHRvb2xiYXJJdGVtczogQXJyYXk8eyBuYW1lPzogc3RyaW5nIH0+KSB7XHJcbiAgICB0b29sYmFySXRlbXMuc3BsaWNlKHRvb2xiYXJJdGVtcy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gJ2NvbHVtbkNob29zZXJCdXR0b24nKSwgMSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCB2aWV3c1Rvb2xiYXJJdGVtKCkge1xyXG4gICAgaWYgKCF0aGlzLl92aWV3c1Rvb2xiYXJJdGVtKSB7XHJcbiAgICAgIHRoaXMuX3ZpZXdzVG9vbGJhckl0ZW0gPSB0aGlzLmNyZWF0ZVZpZXdzVG9vbGJhckl0ZW0oKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fdmlld3NUb29sYmFySXRlbTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGlzRGVmYXVsdFZpZXcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXdJZCA9PT0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgaGFzQ2hhbmdlcygpIHtcclxuICAgIGNvbnN0IGN1cnJlbnRWaWV3ID0gdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXc7XHJcbiAgICBpZiAoIXRoaXMuY3VycmVudFZpZXdUaXRsZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFZpZXdUaXRsZS5vcHRpb24oJ3ZhbHVlJykgIT09IGN1cnJlbnRWaWV3Lm5hbWUgfHwgdGhpcy5vcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIuaGFzQ2hhbmdlcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlVmlld3NUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW0ge1xyXG4gICAgbGV0IGlzTmVlZEhhbmRsZVZhbHVlQ2hhbmdlZCA9IHRydWU7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgd2lkZ2V0OiAnZHhEcm9wRG93bkJveCcgYXMgYW55LFxyXG4gICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgdGV4dDogJ1ZpZXdzJyxcclxuICAgICAgdmlzaWJsZTogdGhpcy5vcHRpb25zLnZpc2libGUsXHJcbiAgICAgIGNzc0NsYXNzOiAnYXBzLXZpZXdzX190b29sYmFyLWl0ZW0nLFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgZWxlbWVudEF0dHI6IHtjbGFzczogJ2lzem9sZWEtbWQnfSxcclxuICAgICAgICBpdGVtczogW0dyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlld10sXHJcbiAgICAgICAgdmFsdWU6IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZCxcclxuICAgICAgICB2YWx1ZUV4cHI6ICdpZCcsXHJcbiAgICAgICAgZGlzcGxheUV4cHI6ICduYW1lJyxcclxuICAgICAgICB3aWR0aDogMjAwLFxyXG4gICAgICAgIGRyb3BEb3duT3B0aW9uczoge1xyXG4gICAgICAgICAgd2lkdGg6IDU1MFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25Jbml0aWFsaXplZDogKGUpID0+IHtcclxuICAgICAgICAgIHRoaXMudmlld3NEcm9wZG93bkJveCA9IGUuY29tcG9uZW50O1xyXG4gICAgICAgICAgdGhpcy5sb2FkVmlld0Ryb3Bkb3duQm94RGF0YSgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25WYWx1ZUNoYW5nZWQ6IGFzeW5jIChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZS52YWx1ZSA9PT0gdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXdJZCB8fCAhaXNOZWVkSGFuZGxlVmFsdWVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIGlzTmVlZEhhbmRsZVZhbHVlQ2hhbmdlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgaXNWaWV3QXBwbGllZCA9IGF3YWl0IHRoaXMudHJ5QXBwbHlWaWV3KGUudmFsdWUpO1xyXG4gICAgICAgICAgaWYgKGlzVmlld0FwcGxpZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlzTmVlZEhhbmRsZVZhbHVlQ2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5zeW5jVUlXaXRoQ3VycmVudFZpZXcodHJ1ZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb250ZW50VGVtcGxhdGU6IChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWUuY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnZpZXdzRGF0YUdyaWQgPSB0aGlzLmNyZWF0ZVZpZXdzRGF0YUdyaWQoZS5jb21wb25lbnQpO1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50Vmlld1RpdGxlID0gdGhpcy5jcmVhdGVDdXJyZW50Vmlld1RpdGxlKGUuY29tcG9uZW50KTtcclxuICAgICAgICAgIHRoaXMuc2F2ZVZpZXdCdXR0b24gPSB0aGlzLmNyZWF0ZVNhdmVWaWV3QnV0dG9uKCk7XHJcbiAgICAgICAgICB0aGlzLnNhdmVWaWV3QXNCdXR0b24gPSB0aGlzLmNyZWF0ZVNhdmVWaWV3QXNCdXR0b24oKTtcclxuICAgICAgICAgIHRoaXMuY29sdW1uQ2hvb3NlckJ1dHRvbiA9IHRoaXMuY3JlYXRlQ29sdW1uQ2hvb3NlckJ1dHRvbigpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udGVudEhlYWRlciA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAuYWRkQ2xhc3MoJ2Fwcy12aWV3c19faGVhZGVyJylcclxuICAgICAgICAgICAgLmFwcGVuZCh0aGlzLmN1cnJlbnRWaWV3VGl0bGUuZWxlbWVudCgpKVxyXG4gICAgICAgICAgICAuYXBwZW5kKHRoaXMuc2F2ZVZpZXdCdXR0b24uZWxlbWVudCgpKVxyXG4gICAgICAgICAgICAuYXBwZW5kKHRoaXMuc2F2ZVZpZXdBc0J1dHRvbi5lbGVtZW50KCkpXHJcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy5jb2x1bW5DaG9vc2VyQnV0dG9uLmVsZW1lbnQoKSk7XHJcblxyXG4gICAgICAgICAgY29uc3QgZHJvcGRvd25Db250ZW50ID0gJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAgIC5oZWlnaHQoJzEwMCUnKVxyXG4gICAgICAgICAgICAuYXBwZW5kKGRyb3Bkb3duQ29udGVudEhlYWRlcilcclxuICAgICAgICAgICAgLmFwcGVuZCh0aGlzLnZpZXdzRGF0YUdyaWQuZWxlbWVudCgpKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gZHJvcGRvd25Db250ZW50O1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94T3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlVmlld3NEYXRhR3JpZChkcm9wZG93bkJveE93bmVyOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3gpOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKVxyXG4gICAgICAuZHhEYXRhR3JpZCh7XHJcbiAgICAgICAgZGF0YVNvdXJjZTogZHJvcGRvd25Cb3hPd25lci5nZXREYXRhU291cmNlKCksXHJcbiAgICAgICAgcmVtb3RlT3BlcmF0aW9uczogZmFsc2UsXHJcbiAgICAgICAgZWRpdGluZzoge1xyXG4gICAgICAgICAgYWxsb3dBZGRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgYWxsb3dVcGRhdGluZzogdHJ1ZSxcclxuICAgICAgICAgIGFsbG93RGVsZXRpbmc6IHRydWUsXHJcbiAgICAgICAgICBtb2RlOiAnY2VsbCcsXHJcbiAgICAgICAgICB1c2VJY29uczogdHJ1ZSxcclxuICAgICAgICAgIHRleHRzOiB7XHJcbiAgICAgICAgICAgIGNvbmZpcm1EZWxldGVNZXNzYWdlOiAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIHZpZXc/J1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd29yZFdyYXBFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGxvYWRQYW5lbDoge1xyXG4gICAgICAgICAgc2hhZGluZzogdHJ1ZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29sdW1uczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICduYW1lJyxcclxuICAgICAgICAgICAgYWxsb3dFZGl0aW5nOiBmYWxzZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnaXNHbG9iYWwnLFxyXG4gICAgICAgICAgICBjYXB0aW9uOiAnSXMgR2xvYmFsJyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdib29sZWFuJyxcclxuICAgICAgICAgICAgd2lkdGg6IDcwXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0eXBlOiAnYnV0dG9ucycsXHJcbiAgICAgICAgICAgIGJ1dHRvbnM6IFtcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiAnZGVsZXRlJyxcclxuICAgICAgICAgICAgICAgIHZpc2libGU6IChlKSA9PiBlLnJvdyAmJiBlLnJvdy5rZXkgIT09IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZFxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIF0sXHJcbiAgICAgICAga2V5Ym9hcmROYXZpZ2F0aW9uOiB7XHJcbiAgICAgICAgICBlZGl0T25LZXlQcmVzczogZmFsc2UsXHJcbiAgICAgICAgICBlbmFibGVkOiBmYWxzZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2hvd0NvbHVtbkhlYWRlcnM6IHRydWUsXHJcbiAgICAgICAgaG92ZXJTdGF0ZUVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgZm9jdXNlZFJvd0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIHNob3dCb3JkZXJzOiBmYWxzZSxcclxuICAgICAgICBzaG93Q29sdW1uTGluZXM6IGZhbHNlLFxyXG4gICAgICAgIHNlbGVjdGlvbjogeyBtb2RlOiAnc2luZ2xlJyB9LFxyXG4gICAgICAgIGhlaWdodDogJ2NhbGMoMTAwJSAtIDUxcHgpJyxcclxuICAgICAgICBzY3JvbGxpbmc6IHsgbW9kZTogJ3N0YW5kYXJkJyB9LFxyXG4gICAgICAgIHBhZ2luZzogeyBlbmFibGVkOiBmYWxzZSB9LFxyXG4gICAgICAgIG5vRGF0YVRleHQ6ICdObyB2aWV3cycsXHJcbiAgICAgICAgb25TZWxlY3Rpb25DaGFuZ2VkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3ZhbHVlJywgZS5zZWxlY3RlZFJvd0tleXMgJiYgZS5zZWxlY3RlZFJvd0tleXMubGVuZ3RoID8gZS5zZWxlY3RlZFJvd0tleXNbMF0gOiAwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uRWRpdG9yUHJlcGFyaW5nOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGUuZGF0YUZpZWxkID09PSAnaXNHbG9iYWwnKSB7XHJcbiAgICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5kaXNhYmxlZCA9ICF0aGlzLm9wdGlvbnMuY2FuQ3JlYXRlR2xvYmFsVmlld3M7XHJcbiAgICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy52aXNpYmxlID0gZS5yb3cuZGF0YS5pZCAhPT0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgb25WYWx1ZUNoYW5nZWQgPSBlLmVkaXRvck9wdGlvbnMub25WYWx1ZUNoYW5nZWQ7XHJcbiAgICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZCA9IGFzeW5jIChvcHQpID0+IHtcclxuICAgICAgICAgICAgICBlLmNvbXBvbmVudC5iZWdpbkN1c3RvbUxvYWRpbmcoJ1VwZGF0aW5nJyk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIudXBkYXRlVmlldyhlLnJvdy5kYXRhLmlkLCB7IGlzR2xvYmFsOiBvcHQudmFsdWUgfSk7XHJcbiAgICAgICAgICAgICAgZS5jb21wb25lbnQuZW5kQ3VzdG9tTG9hZGluZygpO1xyXG5cclxuICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlZChvcHQpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25DZWxsUHJlcGFyZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZS5jb2x1bW4udHlwZSAhPT0gJ2J1dHRvbnMnIHx8ICFlLmRhdGEpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGVuYWJsZWQgPSAhZS5kYXRhLmlzR2xvYmFsXHJcbiAgICAgICAgICAgIHx8IChlLmRhdGEuaXNHbG9iYWwgJiYgdGhpcy5vcHRpb25zLmNhbkNyZWF0ZUdsb2JhbFZpZXdzKTtcclxuXHJcbiAgICAgICAgICBpZiAoIWVuYWJsZWQpIHtcclxuICAgICAgICAgICAgQXJyYXkuZnJvbShlLmNlbGxFbGVtZW50LmNoaWxkcmVuKCkpLmZvckVhY2goKGMpID0+IHtcclxuICAgICAgICAgICAgICAkKGMpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICBjb2xvcjogJyNkZGQgIWltcG9ydGFudCcsXHJcbiAgICAgICAgICAgICAgICBjdXJzb3I6ICdkZWZhdWx0J1xyXG4gICAgICAgICAgICAgIH0pLm9mZignY2xpY2snKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvblJvd1JlbW92aW5nOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFlLmtleSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5kZWxldGVWaWV3KGUua2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5keERhdGFHcmlkKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVDdXJyZW50Vmlld1RpdGxlKGRyb3Bkb3duQm94T3duZXI6IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveCk6IERldkV4cHJlc3MudWkuZHhUZXh0Qm94IHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JylcclxuICAgICAgLmFkZENsYXNzKCdhcHMtdmlld3NfX2N1cnJlbnQtdmlldyBpc3pvbGVhLW1kJylcclxuICAgICAgLmR4VGV4dEJveCh7XHJcbiAgICAgICAgdmFsdWU6IGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCd0ZXh0JykgfHwgZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3BsYWNlaG9sZGVyJyksXHJcbiAgICAgICAgcmVhZE9ubHk6IHRoaXMuaXNEZWZhdWx0Vmlld1xyXG4gICAgICB9KVxyXG4gICAgICAuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlVmlld0J1dHRvbigpOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHtcclxuICAgIHJldHVybiAkKCc8YnV0dG9uIC8+JylcclxuICAgICAgLmFkZENsYXNzKCdhcHMtdmlld3NfX3NhdmUtdmlldyBpc3pvbGVhLW1kJylcclxuICAgICAgLmR4QnV0dG9uKHtcclxuICAgICAgICB0ZXh0OiAnU2F2ZScsXHJcbiAgICAgICAgdHlwZTogJ25vcm1hbCcsXHJcbiAgICAgICAgZGlzYWJsZWQ6IHRoaXMuaXNEZWZhdWx0VmlldyxcclxuICAgICAgICBvbkNsaWNrOiB0aGlzLnNhdmUuYmluZCh0aGlzKSxcclxuICAgICAgICBpY29uOiAnc2F2ZScsXHJcbiAgICAgICAgd2lkdGg6IDg3XHJcbiAgICAgIH0pXHJcbiAgICAgIC5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2F2ZVZpZXdBc0J1dHRvbigpOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHtcclxuICAgIHJldHVybiAkKCc8YnV0dG9uIC8+JylcclxuICAgICAgLmFkZENsYXNzKCdhcHMtdmlld3NfX3NhdmUtdmlldy1hcyBpc3pvbGVhLW1kJylcclxuICAgICAgLmR4QnV0dG9uKHtcclxuICAgICAgICB0ZXh0OiAnU2F2ZSBBcycsXHJcbiAgICAgICAgdHlwZTogJ25vcm1hbCcsXHJcbiAgICAgICAgb25DbGljazogdGhpcy5jcmVhdGVTYXZlQXNEaWFsb2cuYmluZCh0aGlzKSxcclxuICAgICAgICBpY29uOiAnc2F2ZScsXHJcbiAgICAgICAgd2lkdGg6IDExOFxyXG4gICAgICB9KVxyXG4gICAgICAuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUNvbHVtbkNob29zZXJCdXR0b24oKTogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB7XHJcbiAgICByZXR1cm4gJCgnPGJ1dHRvbiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLXZpZXdzX19jb2x1bW4tY2hvb3NlciBpc3pvbGVhLW1kJylcclxuICAgICAgLmR4QnV0dG9uKHtcclxuICAgICAgICBvbkNsaWNrOiB0aGlzLm9wZW5Db2x1bW5DaG9vc2VyLmJpbmQodGhpcyksXHJcbiAgICAgICAgaWNvbjogJ2NvbHVtbi1jaG9vc2VyJ1xyXG4gICAgICB9KVxyXG4gICAgICAuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVNhdmVBc0RpYWxvZygpIHtcclxuICAgIGNvbnN0ICRwb3B1cENvbnRlbnQgPSAkKCc8ZGl2IC8+Jyk7XHJcblxyXG4gICAgY29uc3QgZGlhbG9nQ29udGVudEVsZW1lbnQgPSAkKCc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTo4cHg7XCIgLz4nKS5keFRleHRCb3goe1xyXG4gICAgICBwbGFjZWhvbGRlcjogJ1ZpZXcgTmFtZScsXHJcbiAgICAgIHNob3dDbGVhckJ1dHRvbjogdHJ1ZSxcclxuICAgIH0pLmR4VmFsaWRhdG9yKHtcclxuICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgeyB0eXBlOiAncmVxdWlyZWQnIH0sXHJcbiAgICAgIF1cclxuICAgIH0pO1xyXG4gICAgY29uc3Qgdmlld05hbWVUZXh0Qm94ID0gZGlhbG9nQ29udGVudEVsZW1lbnQuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG4gICAgY29uc3Qgdmlld05hbWVUZXh0Qm94VmFsaWRhdG9yID0gZGlhbG9nQ29udGVudEVsZW1lbnQuZHhWYWxpZGF0b3IoJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgdmlld05hbWVUZXh0Qm94LmVsZW1lbnQoKS5hcHBlbmRUbygkcG9wdXBDb250ZW50KTtcclxuXHJcbiAgICBjb25zdCB2aWV3SXNHbG9iYWxDaGVja2JveCA9ICQoJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE2cHg7XCIgLz4nKVxyXG4gICAgICAuZHhDaGVja0JveCh7XHJcbiAgICAgICAgdGV4dDogJ0dsb2JhbCB2aWV3JyxcclxuICAgICAgICBkaXNhYmxlZDogIXRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxWaWV3c1xyXG4gICAgICB9KVxyXG4gICAgICAuZHhDaGVja0JveCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICB2aWV3SXNHbG9iYWxDaGVja2JveC5lbGVtZW50KCkuYXBwZW5kVG8oJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgcmV0dXJuIGNyZWF0ZURpYWxvZyhcclxuICAgICAge1xyXG4gICAgICAgIHRpdGxlOiAnQ3JlYXRlIE5ldyBWaWV3JyxcclxuICAgICAgICBoZWlnaHQ6ICdhdXRvJyxcclxuICAgICAgICB3aWR0aDogJzEwMCUnLFxyXG4gICAgICAgIG1heFdpZHRoOiAnMzAwcHgnLFxyXG4gICAgICB9LFxyXG4gICAgICAkcG9wdXBDb250ZW50LFxyXG4gICAgICB7XHJcbiAgICAgICAgdGV4dDogJ09rJyxcclxuICAgICAgICBvbkNsaWNrOiBhc3luYyAoY2xvc2VQb3B1cCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCF2aWV3TmFtZVRleHRCb3hWYWxpZGF0b3IudmFsaWRhdGUoKS5pc1ZhbGlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnNhdmVBcyh2aWV3TmFtZVRleHRCb3gub3B0aW9uKCd2YWx1ZScpLCB2aWV3SXNHbG9iYWxDaGVja2JveC5vcHRpb24oJ3ZhbHVlJykpO1xyXG4gICAgICAgICAgY2xvc2VQb3B1cCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB0ZXh0OiAnQ2FuY2VsJyxcclxuICAgICAgICBvbkNsaWNrOiAoY2xvc2VQb3B1cCkgPT4gY2xvc2VQb3B1cCgpXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvcGVuQ29sdW1uQ2hvb3NlcigpIHtcclxuICAgIHRoaXMub3B0aW9ucy5vd25lci5zaG93Q29sdW1uQ2hvb3NlcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBsb2FkVmlld0Ryb3Bkb3duQm94RGF0YSgpIHtcclxuICAgIGlmICghdGhpcy52aWV3c0Ryb3Bkb3duQm94KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2aWV3cyA9IGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmdldFZpZXdzKCk7XHJcbiAgICBjb25zdCBkYXRhU291cmNlID0gbmV3IERldkV4cHJlc3MuZGF0YS5BcnJheVN0b3JlKHtcclxuICAgICAga2V5OiAnaWQnLFxyXG4gICAgICBkYXRhOiB2aWV3c1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnZpZXdzRHJvcGRvd25Cb3gub3B0aW9uKCdkYXRhU291cmNlJywgZGF0YVNvdXJjZSk7XHJcbiAgICB0aGlzLnZpZXdzRHJvcGRvd25Cb3gub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWQpO1xyXG4gICAgdGhpcy52aWV3c0RhdGFHcmlkICYmIHRoaXMudmlld3NEYXRhR3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnLCBkYXRhU291cmNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgc2F2ZSgpIHtcclxuICAgIGlmICghdGhpcy5oYXNDaGFuZ2VzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlci5zYXZlKCk7XHJcbiAgICBhd2FpdCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci51cGRhdGVDdXJyZW50Vmlldyh7XHJcbiAgICAgIG5hbWU6IHRoaXMuY3VycmVudFZpZXdUaXRsZS5vcHRpb24oJ3ZhbHVlJyksXHJcbiAgICAgIGdyaWRTdGF0ZTogdGhpcy5vcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIuY3VycmVudFNhdmVkR3JpZFN0YXRlXHJcbiAgICB9KTtcclxuXHJcbiAgICBub3RpZnkoJ1NhdmVkJywgdHJ1ZSk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5sb2FkVmlld0Ryb3Bkb3duQm94RGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBzYXZlQXModmlld05hbWU6IHN0cmluZywgaXNHbG9iYWw6IGJvb2xlYW4pIHtcclxuICAgIGlmICghdGhpcy5vcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyLnNhdmUoKTtcclxuICAgIGNvbnN0IHVwZGF0ZWRWaWV3ID0gYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3JlYXRlTmV3VmlldyhcclxuICAgICAgdmlld05hbWUsXHJcbiAgICAgIHRoaXMub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyLmN1cnJlbnRTYXZlZEdyaWRTdGF0ZSxcclxuICAgICAgaXNHbG9iYWxcclxuICAgICk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRWaWV3RHJvcGRvd25Cb3hEYXRhKCk7XHJcbiAgICBhd2FpdCB0aGlzLmFwcGx5Vmlldyh1cGRhdGVkVmlldy5pZCk7XHJcblxyXG4gICAgbm90aWZ5KCdWaWV3IGlzIGNyZWF0ZWQnLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZGVsZXRlVmlldyh2aWV3SWQ6IG51bWJlcikge1xyXG4gICAgYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuZGVsZXRlVmlldyh2aWV3SWQpO1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5vblZpZXdEZWxldGVkKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5vblZpZXdEZWxldGVkKHZpZXdJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXdhaXQgdGhpcy5sb2FkVmlld0Ryb3Bkb3duQm94RGF0YSgpO1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWQgIT09IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZCkge1xyXG4gICAgICBhd2FpdCB0aGlzLmFwcGx5VmlldyhHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiZWdpblZpZXdBcHBseWluZ0xvYWRpbmcoKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRWaWV3VGl0bGUgJiYgdGhpcy5jdXJyZW50Vmlld1RpdGxlLm9wdGlvbigncmVhZE9ubHknLCB0cnVlKTtcclxuICAgIHRoaXMuc2F2ZVZpZXdCdXR0b24gJiYgdGhpcy5zYXZlVmlld0J1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgdHJ1ZSk7XHJcbiAgICB0aGlzLnNhdmVWaWV3QXNCdXR0b24gJiYgdGhpcy5zYXZlVmlld0FzQnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCB0cnVlKTtcclxuICAgIHRoaXMudmlld3NEYXRhR3JpZCAmJiB0aGlzLnZpZXdzRGF0YUdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdBcHBseWluZy4uLicpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbmRWaWV3QXBwbHlpbmdMb2FkaW5nKCkge1xyXG4gICAgdGhpcy5jdXJyZW50Vmlld1RpdGxlICYmIHRoaXMuY3VycmVudFZpZXdUaXRsZS5vcHRpb24oJ3JlYWRPbmx5JywgZmFsc2UpO1xyXG4gICAgdGhpcy5zYXZlVmlld0J1dHRvbiAmJiB0aGlzLnNhdmVWaWV3QnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCBmYWxzZSk7XHJcbiAgICB0aGlzLnNhdmVWaWV3QXNCdXR0b24gJiYgdGhpcy5zYXZlVmlld0FzQnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCBmYWxzZSk7XHJcbiAgICB0aGlzLnZpZXdzRGF0YUdyaWQgJiYgdGhpcy52aWV3c0RhdGFHcmlkLmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3luY1VJV2l0aEN1cnJlbnRWaWV3KGlnbm9yZUN1cnJlbnRWaWV3VGl0bGUgPSBmYWxzZSkge1xyXG4gICAgaWYgKCFpZ25vcmVDdXJyZW50Vmlld1RpdGxlICYmIHRoaXMuY3VycmVudFZpZXdUaXRsZSkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRWaWV3VGl0bGUub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3Lm5hbWUpO1xyXG4gICAgICB0aGlzLmN1cnJlbnRWaWV3VGl0bGUub3B0aW9uKCdyZWFkT25seScsIHRoaXMuaXNEZWZhdWx0Vmlldyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnZpZXdzRHJvcGRvd25Cb3gub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWQpO1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy52aWV3c0RhdGFHcmlkKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWQgPT09IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZCkge1xyXG4gICAgICAgICAgdGhpcy52aWV3c0RhdGFHcmlkLnNlbGVjdFJvd3NCeUluZGV4ZXMoWzBdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy52aWV3c0RhdGFHcmlkLnNlbGVjdFJvd3MoW3RoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWRdLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LCAwKTtcclxuXHJcbiAgICBjb25zdCBpc0dsb2JhbFZpZXcgPSB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlldy5pc0dsb2JhbFxyXG4gICAgICAmJiAhdGhpcy5vcHRpb25zLmNhbkNyZWF0ZUdsb2JhbFZpZXdzO1xyXG5cclxuICAgIHRoaXMuc2F2ZVZpZXdCdXR0b24gJiYgdGhpcy5zYXZlVmlld0J1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgdGhpcy5pc0RlZmF1bHRWaWV3IHx8IGlzR2xvYmFsVmlldyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGNvbmZpcm1DaGFuZ2VzTG9zcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghdGhpcy5oYXNDaGFuZ2VzKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBEZXZFeHByZXNzLnVpLmRpYWxvZy5jb25maXJtKFxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gICAgICAnWW91IGhhdmUgdW5zYXZlZCBjaGFuZ2VzIHRoYXQgd2lsbCBiZSBsb3N0IGlmIHlvdSBjbG9zZSB0aGlzIHBvcHVwLiBEbyB5b3Ugd2FudCB0byBjbG9zZSB0aGUgcG9wdXAgYW5kIG5vdCBzYXZlIGNoYW5nZXM/JyxcclxuICAgICAgJ1Vuc2F2ZWQgY2hhbmdlcydcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkYvLyB0c2xpbnQ6ZGlzYWJsZTogbWVtYmVyLW9yZGVyaW5nXHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uIGZyb20gJy4uLy4uLy4uL0RhdGEvTG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24nO1xyXG5pbXBvcnQgeyBtZW1vaXplIH0gZnJvbSAnLi4vLi4vLi4vVXRpbHMvTWVtb2l6ZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDb250cm9sRGlzcGxheUZpbHRlciB7XHJcbiAgcmVhZG9ubHkgaWQ6IG51bWJlcjtcclxuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgaXNEZWZhdWx0OiBib29sZWFuO1xyXG4gIHJlYWRvbmx5IGlzR2xvYmFsOiBib29sZWFuO1xyXG4gIHJlYWRvbmx5IGZpbHRlclN0YXRlOiBhbnkgfCBudWxsO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5RmlsdGVyRHRvIHtcclxuICBJZDogbnVtYmVyO1xyXG4gIE5hbWU6IHN0cmluZztcclxuICBJc0RlZmF1bHQ6IGJvb2xlYW47XHJcbiAgSXNHbG9iYWw6IGJvb2xlYW47XHJcbiAgRmlsdGVyU3RhdGU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnMge1xyXG4gIC8vIHJlYWRvbmx5IGRlZmF1bHRPcGVuZWRGaWx0ZXJJZDogbnVtYmVyO1xyXG4gIGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG4gIGluc2VydERhdGFVcmw6IHN0cmluZztcclxuICBkZWxldGVEYXRhVXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbnR5cGUgQ29udHJvbERpc3BsYXlGaWx0ZXJVcGRhdGVzID0gUGFydGlhbDxQaWNrPElDb250cm9sRGlzcGxheUZpbHRlciwgJ25hbWUnIHwgJ2ZpbHRlclN0YXRlJyB8ICdpc0dsb2JhbCc+PjtcclxuXHJcbmV4cG9ydCBjbGFzcyBHcmlkRmlsdGVyc01hbmFnZXIge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGluc2VydERhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlbGV0ZURhdGFVcmw6IHN0cmluZztcclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfY3VycmVudEZpbHRlcklkOiBudW1iZXIgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBmaWx0ZXJzOiBJQ29udHJvbERpc3BsYXlGaWx0ZXJbXSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBnZXRGaWx0ZXJCeUlkSW50ZXJuYWwgPSAoZmlsdGVySWQ6IG51bWJlcikgPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVycyAmJiB0aGlzLmZpbHRlcnMuZmluZCgodikgPT4gdi5pZCA9PT0gZmlsdGVySWQpO1xyXG4gIH1cclxuICBwcml2YXRlIGdldEZpbHRlckJ5SWQgPSBtZW1vaXplKHRoaXMuZ2V0RmlsdGVyQnlJZEludGVybmFsKTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnMpIHtcclxuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xyXG4gICAgdGhpcy5pbnNlcnREYXRhVXJsID0gb3B0aW9ucy5pbnNlcnREYXRhVXJsO1xyXG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xyXG4gICAgdGhpcy5kZWxldGVEYXRhVXJsID0gb3B0aW9ucy5kZWxldGVEYXRhVXJsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXJyZW50RmlsdGVyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RmlsdGVyQnlJZCh0aGlzLl9jdXJyZW50RmlsdGVySWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXJyZW50RmlsdGVySWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudEZpbHRlcklkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBjdXJyZW50RmlsdGVySWQoaWQ6IG51bWJlciB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fY3VycmVudEZpbHRlcklkID0gaWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0RmlsdGVycygpOiBQcm9taXNlPElDb250cm9sRGlzcGxheUZpbHRlcltdPiB7XHJcbiAgICBpZiAoIXRoaXMuZmlsdGVycykge1xyXG4gICAgICBhd2FpdCB0aGlzLmxvYWRGaWx0ZXJzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVycztcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVDdXJyZW50RmlsdGVyKGZpbHRlclVwZGF0ZXM6IENvbnRyb2xEaXNwbGF5RmlsdGVyVXBkYXRlcykge1xyXG4gICAgcmV0dXJuICEhdGhpcy5jdXJyZW50RmlsdGVyICYmIHRoaXMudXBkYXRlRmlsdGVyKHRoaXMuY3VycmVudEZpbHRlci5pZCwgZmlsdGVyVXBkYXRlcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgY3JlYXRlTmV3RmlsdGVyKGZpbHRlck5hbWU6IHN0cmluZywgZmlsdGVyU3RhdGU6IGFueSwgaXNEZWZhdWx0OiBib29sZWFuLCBpc0dsb2JhbDogYm9vbGVhbilcclxuICAgIDogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlGaWx0ZXI+IHtcclxuICAgIGxldCBuZXdGaWx0ZXJEdG86IElDb250cm9sRGlzcGxheUZpbHRlckR0byA9IHRoaXMubWFwRmlsdGVyTW9kZWxUb0R0byh7XHJcbiAgICAgIGlkOiAtMSxcclxuICAgICAgbmFtZTogZmlsdGVyTmFtZSxcclxuICAgICAgaXNEZWZhdWx0LFxyXG4gICAgICBpc0dsb2JhbCxcclxuICAgICAgZmlsdGVyU3RhdGVcclxuICAgIH0pO1xyXG5cclxuICAgIG5ld0ZpbHRlckR0byA9IGF3YWl0IHNlbmRSZXF1ZXN0PElDb250cm9sRGlzcGxheUZpbHRlckR0bz4odGhpcy5pbnNlcnREYXRhVXJsLFxyXG4gICAgICAnUE9TVCcsIG5ld0ZpbHRlckR0byk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRGaWx0ZXJzKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubWFwRmlsdGVyRHRvVG9Nb2RlbChuZXdGaWx0ZXJEdG8pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHVwZGF0ZUZpbHRlcihmaWx0ZXJJZDogbnVtYmVyLCB1cGRhdGVzOiBDb250cm9sRGlzcGxheUZpbHRlclVwZGF0ZXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZ2V0RmlsdGVyQnlJZChmaWx0ZXJJZCk7XHJcbiAgICBpZiAoIWZpbHRlcikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdXBkYXRlZEZpbHRlcjogSUNvbnRyb2xEaXNwbGF5RmlsdGVyID0ge1xyXG4gICAgICAuLi5maWx0ZXIsXHJcbiAgICAgIC4uLnVwZGF0ZXNcclxuICAgIH07XHJcbiAgICBsZXQgdXBkYXRlZEZpbHRlckR0bzogSUNvbnRyb2xEaXNwbGF5RmlsdGVyRHRvID0gdGhpcy5tYXBGaWx0ZXJNb2RlbFRvRHRvKHVwZGF0ZWRGaWx0ZXIpO1xyXG5cclxuICAgIHVwZGF0ZWRGaWx0ZXJEdG8gPSBhd2FpdCBzZW5kUmVxdWVzdDxJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG8+KHRoaXMudXBkYXRlRGF0YVVybCxcclxuICAgICAgJ1BVVCcsIHVwZGF0ZWRGaWx0ZXJEdG8pO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkRmlsdGVycygpO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGRlbGV0ZUZpbHRlcihmaWx0ZXJJZDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmdldEZpbHRlckJ5SWQoZmlsdGVySWQpO1xyXG4gICAgaWYgKCFmaWx0ZXIpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IHNlbmRSZXF1ZXN0KHRoaXMuZGVsZXRlRGF0YVVybCwgJ0RFTEVURScsIHsgZmlsdGVySWQgfSk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRGaWx0ZXJzKCk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGxvYWRGaWx0ZXJzKCkge1xyXG4gICAgY29uc3QgZmlsdGVycyA9IGF3YWl0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uPElDb250cm9sRGlzcGxheUZpbHRlckR0b1tdPih0aGlzLmxvYWREYXRhVXJsKTtcclxuXHJcbiAgICB0aGlzLmZpbHRlcnMgPSBmaWx0ZXJzLm1hcCgoZHRvKSA9PiB0aGlzLm1hcEZpbHRlckR0b1RvTW9kZWwoZHRvKSk7XHJcbiAgICAvLyBOT1RFOiByZXNldCBtZW1vaXplXHJcbiAgICB0aGlzLnJlc2V0Q2FjaGVkUmVzdWx0T2ZHZXRGaWx0ZXJCeUlkRnVuY3Rpb24oKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXBGaWx0ZXJNb2RlbFRvRHRvKG1vZGVsOiBJQ29udHJvbERpc3BsYXlGaWx0ZXIpOiBJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG8ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgSWQ6IG1vZGVsLmlkLFxyXG4gICAgICBOYW1lOiBtb2RlbC5uYW1lLFxyXG4gICAgICBJc0RlZmF1bHQ6IG1vZGVsLmlzRGVmYXVsdCxcclxuICAgICAgSXNHbG9iYWw6IG1vZGVsLmlzR2xvYmFsLFxyXG4gICAgICBGaWx0ZXJTdGF0ZTogSlNPTi5zdHJpbmdpZnkobW9kZWwuZmlsdGVyU3RhdGUpXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXBGaWx0ZXJEdG9Ub01vZGVsKGR0bzogSUNvbnRyb2xEaXNwbGF5RmlsdGVyRHRvKTogSUNvbnRyb2xEaXNwbGF5RmlsdGVyIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGlkOiBkdG8uSWQsXHJcbiAgICAgIG5hbWU6IGR0by5OYW1lLFxyXG4gICAgICBpc0RlZmF1bHQ6IGR0by5Jc0RlZmF1bHQgfHwgZmFsc2UsXHJcbiAgICAgIGlzR2xvYmFsOiBkdG8uSXNHbG9iYWwgfHwgZmFsc2UsXHJcbiAgICAgIGZpbHRlclN0YXRlOiBKU09OLnBhcnNlKGR0by5GaWx0ZXJTdGF0ZSlcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0Q2FjaGVkUmVzdWx0T2ZHZXRGaWx0ZXJCeUlkRnVuY3Rpb24oKSB7XHJcbiAgICB0aGlzLmdldEZpbHRlckJ5SWQgPSBtZW1vaXplKHRoaXMuZ2V0RmlsdGVyQnlJZEludGVybmFsKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IEdyaWRGaWx0ZXJzTWFuYWdlciwgSUNvbnRyb2xEaXNwbGF5RmlsdGVyLCBJR3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucyB9IGZyb20gJy4vR3JpZEZpbHRlcnNNYW5hZ2VyJztcclxuaW1wb3J0IHsgQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyIH0gZnJvbSAnLi9Db250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXInO1xyXG5pbXBvcnQgbm90aWZ5IGZyb20gJy4uLy4uLy4uL1dpZGdldHMvTm90aWZ5JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMge1xyXG4gIHJlYWRvbmx5IG93bmVyOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XHJcbiAgcmVhZG9ubHkgZ3JpZEZpbHRlcnNNYW5hZ2VyOiBHcmlkRmlsdGVyc01hbmFnZXI7XHJcbiAgcmVhZG9ubHkgYXBzQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyOiBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXI7XHJcbiAgcmVhZG9ubHkgYXV0b0ludGVncmF0aW9uOiBib29sZWFuO1xyXG4gIHJlYWRvbmx5IG9uRmlsdGVyQXBwbGllZD86IChmaWx0ZXJJZDogbnVtYmVyIHwgdW5kZWZpbmVkKSA9PiB2b2lkO1xyXG4gIHJlYWRvbmx5IG9uRmlsdGVyRGVsZXRlZD86IChmaWx0ZXJJZDogbnVtYmVyIHwgdW5kZWZpbmVkKSA9PiB2b2lkO1xyXG4gIHJlYWRvbmx5IGNhbkNyZWF0ZUdsb2JhbEZpbHRlcnM6IGJvb2xlYW47XHJcbiAgcmVhZG9ubHkgdmlzaWJsZTogYm9vbGVhbjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnREZWZhdWx0T3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgZ3JpZEZpbHRlcnNNYW5hZ2VyOiBHcmlkRmlsdGVyc01hbmFnZXI7XHJcbiAgcmVhZG9ubHkgZ3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9uczogSUdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnM7XHJcbiAgcmVhZG9ubHkgYXV0b0ludGVncmF0aW9uOiBib29sZWFuO1xyXG59XHJcblxyXG50eXBlIE11dGFibGU8VD4gPSB7XHJcbiAgLXJlYWRvbmx5IFtQIGluIGtleW9mIFRdOiBUW1BdO1xyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50T3B0aW9ucyA9XHJcbiAgTXV0YWJsZTxPbWl0PElHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnRPcHRpb25zLCBrZXlvZiBJR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50RGVmYXVsdE9wdGlvbnM+PiAmXHJcbiAgTXV0YWJsZTxQYXJ0aWFsPElHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnREZWZhdWx0T3B0aW9ucz4+O1xyXG5cclxuZXhwb3J0IGNsYXNzIEdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudCB7XHJcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IElHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnRPcHRpb25zO1xyXG4gIC8vIHRvb2xiYXIgaXRlbXNcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZSB2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfZmlsdGVyc1Rvb2xiYXJJdGVtOiBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW0gfCB1bmRlZmluZWQ7XHJcbiAgLy8gdHNsaW50OmVuYWJsZSB2YXJpYWJsZS1uYW1lXHJcblxyXG4gIC8vIHRvb2xiYXIgd2lkZ2V0c1xyXG4gIHByaXZhdGUgZmlsdGVyc0Ryb3Bkb3duQm94OiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3ggfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBmaWx0ZXJzRGF0YUdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGN1cnJlbnRGaWx0ZXJUaXRsZTogRGV2RXhwcmVzcy51aS5keFRleHRCb3ggfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBuZXdGaWx0ZXJCdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b24gfCB1bmRlZmluZWQ7XHJcbiAgLy8gd2lkZ2V0c1xyXG4gIC8vIHRzbGludDpkaXNhYmxlIHZhcmlhYmxlLW5hbWVcclxuICBwcml2YXRlIF9maWx0ZXJQb3B1cDogRGV2RXhwcmVzcy51aS5keFBvcHVwIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgZmlsdGVyTmFtZVRleHRCb3g6IERldkV4cHJlc3MudWkuZHhUZXh0Qm94IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgZmlsdGVyQnVpbGRlcjogRGV2RXhwcmVzcy51aS5keEZpbHRlckJ1aWxkZXIgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBmaWx0ZXJFeHByZXNzaW9uQ2FsY3VsYXRvcjogRGV2RXhwcmVzcy51aS5keEZpbHRlckJ1aWxkZXI7XHJcbiAgcHJpdmF0ZSBmaWx0ZXJJc0dsb2JhbENoZWNrYm94OiBEZXZFeHByZXNzLnVpLmR4Q2hlY2tCb3ggfCB1bmRlZmluZWQ7XHJcbiAgLy8gdHNsaW50OmVuYWJsZSB2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBpc0luRmlsdGVyQXBwbHlpbmcgPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50T3B0aW9ucykge1xyXG4gICAgdGhpcy5vcHRpb25zID0ge1xyXG4gICAgICAuLi5vcHRpb25zLFxyXG4gICAgICBncmlkRmlsdGVyc01hbmFnZXI6IG9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyXHJcbiAgICAgICAgPyBvcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlclxyXG4gICAgICAgIDogbmV3IEdyaWRGaWx0ZXJzTWFuYWdlcihvcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnMpLFxyXG4gICAgICBhdXRvSW50ZWdyYXRpb246IChvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuYXV0b0ludGVncmF0aW9uICE9PSBudWxsKVxyXG4gICAgICAgID8gb3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gOiB0cnVlXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMub3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gJiYgdGhpcy5pbnRlZ3JhdGVUb0dyaWQodGhpcy5vcHRpb25zLm93bmVyKTtcclxuICAgIHRoaXMuZmlsdGVyRXhwcmVzc2lvbkNhbGN1bGF0b3IgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgLmR4RmlsdGVyQnVpbGRlcih7XHJcbiAgICAgICAgZmllbGRzOiB0aGlzLmdldEZsYXRDb2x1bW5zTGlzdCh0aGlzLm9wdGlvbnMub3duZXIub3B0aW9uKCdjb2x1bW5zJykpXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keEZpbHRlckJ1aWxkZXIoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgdHJ5QXBwbHlGaWx0ZXIoZmlsdGVySWQ6IG51bWJlciB8IHVuZGVmaW5lZCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgaXNDYW5CZUZpbHRlckFwcGxpZWQgPSBhd2FpdCB0aGlzLmNvbmZpcm1DaGFuZ2VzTG9zcygpO1xyXG5cclxuICAgIGlmIChpc0NhbkJlRmlsdGVyQXBwbGllZCkge1xyXG4gICAgICBhd2FpdCB0aGlzLmFwcGx5RmlsdGVyKGZpbHRlcklkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXNDYW5CZUZpbHRlckFwcGxpZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgYXBwbHlGaWx0ZXIoZmlsdGVySWQ6IG51bWJlciB8IHVuZGVmaW5lZCwgZGVmZXJyZWRMb2FkaW5nID0gZmFsc2UpIHtcclxuICAgIC8vIE5PVEU6IElmIHdlIGNoYW5nZSB0aGUgZmlsdGVyLCB0aGUgZ3JpZCB3aWxsIGJlIHJlbG9hZGVkIGluIHRoZSBmaWx0ZXJzRHJvcGRvd25Cb3gub25WYWx1ZUNoYW5nZWRcclxuICAgIC8vIGNvbnN0IGZpbHRlckNoYW5nZWQgPSB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZCAhPT0gZmlsdGVySWQ7XHJcbiAgICB0aGlzLmlzSW5GaWx0ZXJBcHBseWluZyA9IHRydWU7XHJcbiAgICB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZCA9IGZpbHRlcklkO1xyXG4gICAgdGhpcy51cGRhdGVGaWx0ZXJQb3B1cENvbnRlbnQodGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyKTtcclxuXHJcbiAgICB0aGlzLmZpbHRlcnNEcm9wZG93bkJveC5vcHRpb24oJ3ZhbHVlJywgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQpO1xyXG5cclxuICAgIGxldCBncmlkRGF0YVNvdXJjZSA9IHRoaXMub3B0aW9ucy5vd25lci5nZXREYXRhU291cmNlKCk7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcikge1xyXG4gICAgICAvLyBOT1RFOiBuZWVkIHRvIHByb2Nlc3MgZmlsdGVyIHZhbHVlIGJ5IHRoZSBnZXRGaWx0ZXJFeHByZXNzaW9uIG1ldGhvZFxyXG4gICAgICAvLyB0byBiZSBzdXJlIGl0IHdpbGwgd29yayBpbiBkYXRhc291cmNlIChmb3IgZXhhbXBsZSwgdGhlICdiZXR3ZWVuJyBjb25kaXRpb24pXHJcbiAgICAgIC8vIHdpbGwgYmUgbW9kaWZpZWQgdG8gXCI+PSBhbmQgPD1cIiBiZWNhdXNlIGRhdGEgc291cmNlIGRvZXNuJ3Qgc3VwcG9ydCAnYmV0d2VlbicuXHJcblxyXG4gICAgICB0aGlzLmZpbHRlckV4cHJlc3Npb25DYWxjdWxhdG9yLm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIuZmlsdGVyU3RhdGUpO1xyXG4gICAgICBjb25zdCB2YWwgPSB0aGlzLmZpbHRlckV4cHJlc3Npb25DYWxjdWxhdG9yLmdldEZpbHRlckV4cHJlc3Npb24oKTtcclxuXHJcbiAgICAgIGlmIChncmlkRGF0YVNvdXJjZS5pc0xvYWRpbmcoKSkge1xyXG4gICAgICAgIGNvbnN0IGFwcGx5VmFsdWUgPSAoKSA9PiB7XHJcbiAgICAgICAgICBncmlkRGF0YVNvdXJjZS5vZmYoJ2xvYWRpbmdDaGFuZ2VkJywgYXBwbHlWYWx1ZSk7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgZ3JpZERhdGFTb3VyY2UgPSB0aGlzLm9wdGlvbnMub3duZXIuZ2V0RGF0YVNvdXJjZSgpO1xyXG4gICAgICAgICAgICBncmlkRGF0YVNvdXJjZS5maWx0ZXIodmFsKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGdyaWREYXRhU291cmNlLm9uKCdsb2FkaW5nQ2hhbmdlZCcsIGFwcGx5VmFsdWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGdyaWREYXRhU291cmNlLmZpbHRlcih2YWwpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZ3JpZERhdGFTb3VyY2UuZmlsdGVyKG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmICghZmlsdGVyQ2hhbmdlZCkge1xyXG4gICAgaWYgKCFkZWZlcnJlZExvYWRpbmcpIHtcclxuICAgICAgYXdhaXQgZ3JpZERhdGFTb3VyY2UubG9hZCgpO1xyXG4gICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIHRoaXMub3B0aW9ucy5vbkZpbHRlckFwcGxpZWQgJiYgdGhpcy5vcHRpb25zLm9uRmlsdGVyQXBwbGllZChmaWx0ZXJJZCk7XHJcbiAgICB0aGlzLmlzSW5GaWx0ZXJBcHBseWluZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbnRlZ3JhdGVUb0dyaWQoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XHJcbiAgICBjb25zdCBjdXJyZW50VG9vbGJhclByZXBhcmluZyA9IGdyaWQub3B0aW9uKCdvblRvb2xiYXJQcmVwYXJpbmcnKTtcclxuXHJcbiAgICBncmlkLm9wdGlvbignb25Ub29sYmFyUHJlcGFyaW5nJywgKGU6IGFueSkgPT4ge1xyXG4gICAgICBjdXJyZW50VG9vbGJhclByZXBhcmluZyAmJiBjdXJyZW50VG9vbGJhclByZXBhcmluZyhlKTtcclxuICAgICAgdGhpcy5vbkdyaWRUb29sYmFyUHJlcGFyaW5nKGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG9uR3JpZFRvb2xiYXJQcmVwYXJpbmc6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnNbJ29uVG9vbGJhclByZXBhcmluZyddID0gKGUpID0+IHtcclxuICAgIGNvbnN0IHRvb2xiYXJJdGVtcyA9IGUudG9vbGJhck9wdGlvbnMgJiYgZS50b29sYmFyT3B0aW9ucy5pdGVtcztcclxuICAgIGlmICghdG9vbGJhckl0ZW1zKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0b29sYmFySXRlbXMuc3BsaWNlKDEsIDAsXHJcbiAgICAgIHRoaXMuZmlsdGVyc1Rvb2xiYXJJdGVtXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgZmlsdGVyc1Rvb2xiYXJJdGVtKCkge1xyXG4gICAgaWYgKCF0aGlzLl9maWx0ZXJzVG9vbGJhckl0ZW0pIHtcclxuICAgICAgdGhpcy5fZmlsdGVyc1Rvb2xiYXJJdGVtID0gdGhpcy5jcmVhdGVGaWx0ZXJzVG9vbGJhckl0ZW0oKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyc1Rvb2xiYXJJdGVtO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgZmlsdGVyUG9wdXAoKSB7XHJcbiAgICBpZiAoIXRoaXMuX2ZpbHRlclBvcHVwKSB7XHJcbiAgICAgIHRoaXMuX2ZpbHRlclBvcHVwID0gdGhpcy5jcmVhdGVGaWx0ZXJQb3B1cCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9maWx0ZXJQb3B1cDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGhhc0NoYW5nZXMoKSB7XHJcbiAgICBjb25zdCBjdXJyZW50RmlsdGVyID0gdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyO1xyXG5cclxuICAgIGNvbnN0IG5ld05hbWUgPSB0aGlzLmZpbHRlck5hbWVUZXh0Qm94ICYmIHRoaXMuZmlsdGVyTmFtZVRleHRCb3gub3B0aW9uKCd2YWx1ZScpO1xyXG4gICAgY29uc3Qgb2xkTmFtZSA9IGN1cnJlbnRGaWx0ZXIgJiYgY3VycmVudEZpbHRlci5uYW1lO1xyXG5cclxuICAgIGNvbnN0IG5ld0ZpbHRlciA9IHRoaXMuZmlsdGVyQnVpbGRlciAmJiB0aGlzLmZpbHRlckJ1aWxkZXIub3B0aW9uKCd2YWx1ZScpO1xyXG4gICAgY29uc3Qgb2xkRmlsdGVyID0gY3VycmVudEZpbHRlciAmJiBjdXJyZW50RmlsdGVyLmZpbHRlclN0YXRlO1xyXG5cclxuICAgIGNvbnN0IG5ld0lzR2xvYmFsID0gdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94ICYmIHRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveC5vcHRpb24oJ3ZhbHVlJyk7XHJcbiAgICBjb25zdCBvbGRJc0dsb2JhbCA9IGN1cnJlbnRGaWx0ZXIgJiYgY3VycmVudEZpbHRlci5pc0dsb2JhbDtcclxuXHJcbiAgICByZXR1cm4gbmV3TmFtZSAhPT0gb2xkTmFtZSB8fCBuZXdGaWx0ZXIgIT09IG9sZEZpbHRlciB8fCBuZXdJc0dsb2JhbCAhPT0gb2xkSXNHbG9iYWw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZpbHRlcnNUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW0ge1xyXG4gICAgbGV0IGlzTmVlZEhhbmRsZVZhbHVlQ2hhbmdlZCA9IHRydWU7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgd2lkZ2V0OiAnZHhEcm9wRG93bkJveCcgYXMgYW55LFxyXG4gICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgdGV4dDogJ0RhdGEgU2V0cycsXHJcbiAgICAgIHZpc2libGU6IHRoaXMub3B0aW9ucy52aXNpYmxlLFxyXG4gICAgICBjc3NDbGFzczogJ2Fwcy1maWx0ZXJzX190b29sYmFyLWl0ZW0nLFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgZWxlbWVudEF0dHI6IHtjbGFzczogJ2lzem9sZWEtbWQnfSxcclxuICAgICAgICB2YWx1ZTogdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQsXHJcbiAgICAgICAgdmFsdWVFeHByOiAnaWQnLFxyXG4gICAgICAgIGRpc3BsYXlFeHByOiAnbmFtZScsXHJcbiAgICAgICAgc2hvd0NsZWFyQnV0dG9uOiB0cnVlLFxyXG4gICAgICAgIHBsYWNlaG9sZGVyOiAnTm9uZScsXHJcbiAgICAgICAgd2lkdGg6IDIwMCxcclxuICAgICAgICBkcm9wRG93bk9wdGlvbnM6IHtcclxuICAgICAgICAgIHdpZHRoOiA1MDBcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uSW5pdGlhbGl6ZWQ6IGFzeW5jIChlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcnNEcm9wZG93bkJveCA9IGUuY29tcG9uZW50O1xyXG4gICAgICAgICAgY29uc3QgWywgdXNlclNldHRpbmdzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcclxuICAgICAgICAgICAgdGhpcy5sb2FkRmlsdGVyRHJvcGRvd25Cb3hEYXRhKCksXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hcHNDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIuZ2V0VXNlclNldHRpbmdzKClcclxuICAgICAgICAgIF0pO1xyXG5cclxuICAgICAgICAgIHVzZXJTZXR0aW5ncy5kZWZhdWx0RmlsdGVySWQgJiYgZS5jb21wb25lbnQub3B0aW9uKCd2YWx1ZScsIHVzZXJTZXR0aW5ncy5kZWZhdWx0RmlsdGVySWQpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25WYWx1ZUNoYW5nZWQ6IGFzeW5jIChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5pc0luRmlsdGVyQXBwbHlpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICghaXNOZWVkSGFuZGxlVmFsdWVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIGlzTmVlZEhhbmRsZVZhbHVlQ2hhbmdlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgbGV0IHZhbHVlID0gZS52YWx1ZTtcclxuICAgICAgICAgIGNvbnN0IGlzRmlsdGVyQXBwbGllZCA9IGF3YWl0IHRoaXMudHJ5QXBwbHlGaWx0ZXIodmFsdWUpO1xyXG5cclxuICAgICAgICAgIGlmICghaXNGaWx0ZXJBcHBsaWVkKSB7XHJcbiAgICAgICAgICAgIGlzTmVlZEhhbmRsZVZhbHVlQ2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB2YWx1ZSA9IGUucHJldmlvdXNWYWx1ZTtcclxuICAgICAgICAgICAgZS5jb21wb25lbnQub3B0aW9uKCd2YWx1ZScsIHZhbHVlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmZpbHRlcnNEYXRhR3JpZCAmJiB0aGlzLmZpbHRlcnNEYXRhR3JpZC5zZWxlY3RSb3dzKHZhbHVlLCBmYWxzZSk7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRGaWx0ZXJUaXRsZSAmJiB0aGlzLmN1cnJlbnRGaWx0ZXJUaXRsZS5vcHRpb24oJ3ZhbHVlJyxcclxuICAgICAgICAgICAgZS5jb21wb25lbnQub3B0aW9uKCd0ZXh0JykgfHwgZS5jb21wb25lbnQub3B0aW9uKCdwbGFjZWhvbGRlcicpKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uT3BlbmVkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFlLmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5maWx0ZXJzRGF0YUdyaWQgJiYgdGhpcy5maWx0ZXJzRGF0YUdyaWQuc2VsZWN0Um93cyhlLmNvbXBvbmVudC5vcHRpb24oJ3ZhbHVlJyksIGZhbHNlKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKGUpID0+IHtcclxuICAgICAgICAgIGlmICghZS5jb21wb25lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuZmlsdGVyc0RhdGFHcmlkID0gdGhpcy5jcmVhdGVGaWx0ZXJzRGF0YUdyaWQoZS5jb21wb25lbnQpO1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50RmlsdGVyVGl0bGUgPSB0aGlzLmNyZWF0ZUN1cnJlbnRGaWx0ZXJUaXRsZShlLmNvbXBvbmVudCk7XHJcbiAgICAgICAgICB0aGlzLm5ld0ZpbHRlckJ1dHRvbiA9IHRoaXMuY3JlYXRlTmV3RmlsdGVyQnV0dG9uKCk7XHJcblxyXG4gICAgICAgICAgY29uc3QgZHJvcGRvd25Db250ZW50SGVhZGVyID0gJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAgIC5hZGRDbGFzcygnYXBzLWZpbHRlcnNfX2hlYWRlcicpXHJcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy5jdXJyZW50RmlsdGVyVGl0bGUuZWxlbWVudCgpKVxyXG4gICAgICAgICAgICAuYXBwZW5kKHRoaXMubmV3RmlsdGVyQnV0dG9uLmVsZW1lbnQoKSk7XHJcblxyXG4gICAgICAgICAgY29uc3QgZHJvcGRvd25Db250ZW50ID0gJCgnPGRpdiAvPicpLmNzcygnaGVpZ2h0JywgJzEwMCUnKVxyXG4gICAgICAgICAgICAuYXBwZW5kKGRyb3Bkb3duQ29udGVudEhlYWRlcilcclxuICAgICAgICAgICAgLmFwcGVuZCh0aGlzLmZpbHRlcnNEYXRhR3JpZC5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICAgIHJldHVybiBkcm9wZG93bkNvbnRlbnQ7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3hPcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJzRGF0YUdyaWQoZHJvcGRvd25Cb3hPd25lcjogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94KTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JylcclxuICAgICAgLmR4RGF0YUdyaWQoe1xyXG4gICAgICAgIGRhdGFTb3VyY2U6IGRyb3Bkb3duQm94T3duZXIuZ2V0RGF0YVNvdXJjZSgpLFxyXG4gICAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IGZhbHNlLFxyXG4gICAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICAgIGFsbG93QWRkaW5nOiBmYWxzZSxcclxuICAgICAgICAgIGFsbG93VXBkYXRpbmc6IHRydWUsXHJcbiAgICAgICAgICBhbGxvd0RlbGV0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgbW9kZTogJ2NlbGwnLFxyXG4gICAgICAgICAgdXNlSWNvbnM6IHRydWUsXHJcbiAgICAgICAgICB0ZXh0czoge1xyXG4gICAgICAgICAgICBjb25maXJtRGVsZXRlTWVzc2FnZTogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBkYXRhIHNldD8nXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB3b3JkV3JhcEVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgY29sdW1uczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICduYW1lJyxcclxuICAgICAgICAgICAgYWxsb3dFZGl0aW5nOiBmYWxzZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnaXNEZWZhdWx0JyxcclxuICAgICAgICAgICAgY2FwdGlvbjogJ0lzIERlZmF1bHQnLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2Jvb2xlYW4nLFxyXG4gICAgICAgICAgICB3aWR0aDogODAsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdpc0dsb2JhbCcsXHJcbiAgICAgICAgICAgIGNhcHRpb246ICdJcyBHbG9iYWwnLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2Jvb2xlYW4nLFxyXG4gICAgICAgICAgICB3aWR0aDogNzBcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdidXR0b25zJyxcclxuICAgICAgICAgICAgYnV0dG9uczogW1xyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGljb246ICdlZGl0JyxcclxuICAgICAgICAgICAgICAgIGhpbnQ6ICdFZGl0JyxcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s6IGFzeW5jIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICghZS5yb3cgfHwgIWUucm93LmtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgY29uc3QgaXNGaWx0ZXJBcHBsaWVkID0gYXdhaXQgdGhpcy50cnlBcHBseUZpbHRlcihlLnJvdy5rZXkpO1xyXG4gICAgICAgICAgICAgICAgICBpc0ZpbHRlckFwcGxpZWQgJiYgIXRoaXMuZmlsdGVyUG9wdXAub3B0aW9uKCd2aXNpYmxlJylcclxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLm9wZW5FZGl0RmlsdGVyUG9wdXAodGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICdkZWxldGUnXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH1cclxuICAgICAgICBdLFxyXG4gICAgICAgIGtleWJvYXJkTmF2aWdhdGlvbjoge1xyXG4gICAgICAgICAgZWRpdE9uS2V5UHJlc3M6IGZhbHNlLFxyXG4gICAgICAgICAgZW5hYmxlZDogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNob3dDb2x1bW5IZWFkZXJzOiB0cnVlLFxyXG4gICAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGZvY3VzZWRSb3dFbmFibGVkOiBmYWxzZSxcclxuICAgICAgICBzaG93Qm9yZGVyczogZmFsc2UsXHJcbiAgICAgICAgc2hvd0NvbHVtbkxpbmVzOiBmYWxzZSxcclxuICAgICAgICBzZWxlY3Rpb246IHsgbW9kZTogJ3NpbmdsZScgfSxcclxuICAgICAgICBoZWlnaHQ6ICdjYWxjKDEwMCUgLSA1MXB4KScsXHJcbiAgICAgICAgc2Nyb2xsaW5nOiB7IG1vZGU6ICdzdGFuZGFyZCcgfSxcclxuICAgICAgICBwYWdpbmc6IHsgZW5hYmxlZDogZmFsc2UgfSxcclxuICAgICAgICBub0RhdGFUZXh0OiAnTm8gZGF0YSBzZXRzJyxcclxuICAgICAgICBvblNlbGVjdGlvbkNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICBkcm9wZG93bkJveE93bmVyLm9wdGlvbigndmFsdWUnLCBlLnNlbGVjdGVkUm93S2V5cyA/IGUuc2VsZWN0ZWRSb3dLZXlzWzBdIDogbnVsbCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkVkaXRvclByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgICAgIGlmIChlLmRhdGFGaWVsZCA9PT0gJ2lzR2xvYmFsJykge1xyXG4gICAgICAgICAgICBlLmVkaXRvck9wdGlvbnMuZGlzYWJsZWQgPSAhdGhpcy5vcHRpb25zLmNhbkNyZWF0ZUdsb2JhbEZpbHRlcnM7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBvblZhbHVlQ2hhbmdlZCA9IGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZDtcclxuICAgICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uVmFsdWVDaGFuZ2VkID0gYXN5bmMgKG9wdCkgPT4ge1xyXG4gICAgICAgICAgICAgIGUuY29tcG9uZW50LmJlZ2luQ3VzdG9tTG9hZGluZygnVXBkYXRpbmcnKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLnVwZGF0ZUZpbHRlcihlLnJvdy5kYXRhLmlkLCB7IGlzR2xvYmFsOiBvcHQudmFsdWUgfSk7XHJcbiAgICAgICAgICAgICAgZS5jb21wb25lbnQuZW5kQ3VzdG9tTG9hZGluZygpO1xyXG5cclxuICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlZChvcHQpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25DZWxsUHJlcGFyZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZS5jb2x1bW4udHlwZSAhPT0gJ2J1dHRvbnMnIHx8ICFlLmRhdGEpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGUuY29sdW1uLnR5cGUgPT09ICdidXR0b25zJykge1xyXG4gICAgICAgICAgICBjb25zdCBlbmFibGVkID0gIWUuZGF0YS5pc0dsb2JhbFxyXG4gICAgICAgICAgICAgIHx8IChlLmRhdGEuaXNHbG9iYWwgJiYgdGhpcy5vcHRpb25zLmNhbkNyZWF0ZUdsb2JhbEZpbHRlcnMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFlbmFibGVkKSB7XHJcbiAgICAgICAgICAgICAgQXJyYXkuZnJvbShlLmNlbGxFbGVtZW50LmNoaWxkcmVuKCkpLmZvckVhY2goKGMpID0+IHtcclxuICAgICAgICAgICAgICAgICQoYykuY3NzKHtcclxuICAgICAgICAgICAgICAgICAgY29sb3I6ICcjZGRkICFpbXBvcnRhbnQnLFxyXG4gICAgICAgICAgICAgICAgICBjdXJzb3I6ICdkZWZhdWx0J1xyXG4gICAgICAgICAgICAgICAgfSkub2ZmKCdjbGljaycpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvblJvd1VwZGF0aW5nOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFlLmtleSB8fCBlLm5ld0RhdGEuaXNEZWZhdWx0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGRlZmF1bHRGaWx0ZXIgPSBlLmNvbXBvbmVudC5nZXREYXRhU291cmNlKCkuaXRlbXMoKS5maW5kKChmaWx0ZXIpID0+IGZpbHRlci5pc0RlZmF1bHQpO1xyXG4gICAgICAgICAgaWYgKGRlZmF1bHRGaWx0ZXIpIHtcclxuICAgICAgICAgICAgZGVmYXVsdEZpbHRlci5pc0RlZmF1bHQgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuYXBzQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyLnVwZGF0ZVVzZXJTZXR0aW5ncyh7XHJcbiAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJJZDogZS5uZXdEYXRhLmlzRGVmYXVsdCA/IGUua2V5IDogdW5kZWZpbmVkXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uUm93UmVtb3Zpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWUua2V5KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmRlbGV0ZUZpbHRlcihlLmtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlQ3VycmVudEZpbHRlclRpdGxlKGRyb3Bkb3duQm94T3duZXI6IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveCk6IERldkV4cHJlc3MudWkuZHhUZXh0Qm94IHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JylcclxuICAgICAgLmFkZENsYXNzKCdhcHMtZmlsdGVyc19fY3VycmVudC1maWx0ZXInKVxyXG4gICAgICAuZHhUZXh0Qm94KHtcclxuICAgICAgICB2YWx1ZTogZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3RleHQnKSB8fCBkcm9wZG93bkJveE93bmVyLm9wdGlvbigncGxhY2Vob2xkZXInKSxcclxuICAgICAgICByZWFkT25seTogdHJ1ZVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVOZXdGaWx0ZXJCdXR0b24oKTogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB7XHJcbiAgICByZXR1cm4gJCgnPGJ1dHRvbiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLWZpbHRlcnNfX2FkZC1uZXctZmlsdGVyIGlzem9sZWEtbWQnKVxyXG4gICAgICAuZHhCdXR0b24oe1xyXG4gICAgICAgIHRleHQ6ICdOZXcgRGF0YSBTZXQnLFxyXG4gICAgICAgIHR5cGU6ICdub3JtYWwnLFxyXG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMub3Blbk5ld0ZpbHRlclBvcHVwKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBpY29uOiAncGx1cydcclxuICAgICAgfSlcclxuICAgICAgLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJQb3B1cCgpIHtcclxuICAgIGNvbnN0ICRwb3B1cFJvb3QgPSAkKCc8ZGl2IC8+JykuYXBwZW5kVG8oJ2JvZHknKTtcclxuICAgIGxldCBpc1BvcHVwSGlkaW5nQ29uZmlybWVkID0gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuICRwb3B1cFJvb3QuZHhQb3B1cCh7XHJcbiAgICAgIGNvbnRhaW5lcjogdGhpcy5vcHRpb25zLm93bmVyLmVsZW1lbnQoKSxcclxuICAgICAgc2hhZGluZzogZmFsc2UsXHJcbiAgICAgIHJlc2l6ZUVuYWJsZWQ6IHRydWUsXHJcbiAgICAgIHdpZHRoOiA2NTAsXHJcbiAgICAgIGhlaWdodDogNTAwLFxyXG4gICAgICBvblNob3dpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3ggJiYgdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3guY2xvc2UoKTtcclxuICAgICAgfSxcclxuICAgICAgb25IaWRpbmc6IGFzeW5jIChlKSA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc0NoYW5nZXMgfHwgaXNQb3B1cEhpZGluZ0NvbmZpcm1lZCkge1xyXG4gICAgICAgICAgaXNQb3B1cEhpZGluZ0NvbmZpcm1lZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGUuY2FuY2VsID0gdHJ1ZTtcclxuICAgICAgICBpc1BvcHVwSGlkaW5nQ29uZmlybWVkID0gYXdhaXQgdGhpcy5jb25maXJtQ2hhbmdlc0xvc3MoKTtcclxuICAgICAgICBpZiAoaXNQb3B1cEhpZGluZ0NvbmZpcm1lZCkge1xyXG4gICAgICAgICAgZS5jb21wb25lbnQuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3ggJiYgdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3gub3BlbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSkuZHhQb3B1cCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyTmFtZVRleHRCb3goKSB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5keFRleHRCb3goe1xyXG4gICAgICAgIHBsYWNlaG9sZGVyOiAnRW50ZXIgRGF0YSBTZXQgTmFtZS4uLicsXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keFRleHRCb3goJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZpbHRlcklzR2xvYmFsQ2hlY2tib3goKSB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5keENoZWNrQm94KHtcclxuICAgICAgICB0ZXh0OiAnR2xvYmFsIGRhdGEgc2V0JyxcclxuICAgICAgfSlcclxuICAgICAgLmR4Q2hlY2tCb3goJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZsYXRDb2x1bW5zTGlzdChzb3VyY2VDb2x1bW5zLCAuLi5yZXN0KSB7XHJcbiAgICBsZXQgcmVzdWx0ID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBzb3VyY2VDb2x1bW4gb2Ygc291cmNlQ29sdW1ucykge1xyXG4gICAgICBpZiAoc291cmNlQ29sdW1uLmNvbHVtbnMgJiYgc291cmNlQ29sdW1uLmNvbHVtbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IG5lc3RlZENvbHVtbnMgPSB0aGlzLmdldEZsYXRDb2x1bW5zTGlzdChzb3VyY2VDb2x1bW4uY29sdW1ucyk7XHJcblxyXG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQobmVzdGVkQ29sdW1ucyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgY29sdW1uID0gJC5leHRlbmQoe30sIHNvdXJjZUNvbHVtbik7XHJcblxyXG4gICAgICAgIGlmIChjb2x1bW4uZGF0YVR5cGUgPT09ICdkYXRlJyB8fCBjb2x1bW4uZGF0YVR5cGUgPT09ICdkYXRldGltZScpIHtcclxuICAgICAgICAgIGNvbnN0IGlzRGF0ZVRpbWUgPSBjb2x1bW4uZGF0YVR5cGUgPT09ICdkYXRldGltZSc7XHJcbiAgICAgICAgICBjb25zdCBkYXRlRm9ybWF0ID0gJ2RkIE1NTSB5eSc7XHJcbiAgICAgICAgICBjb25zdCBkYXRlVGltZUZvcm1hdCA9ICdoaDptbSwgZGQgTU1NIHl5JztcclxuICAgICAgICAgIGNvbnN0IGRpc3BsYXlGb3JtYXQgPSBpc0RhdGVUaW1lID8gZGF0ZVRpbWVGb3JtYXQgOiBkYXRlRm9ybWF0O1xyXG5cclxuICAgICAgICAgIGNvbnN0IHBhcnNlRGF0ZVRpbWUgPSAoZGF0ZVN0cjogc3RyaW5nKTogRGF0ZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGVUaW1lUGFydHMgPSBkYXRlU3RyLnNwbGl0KCcsICcpO1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlID0gRGV2RXhwcmVzcy5sb2NhbGl6YXRpb24ucGFyc2VEYXRlKGRhdGVUaW1lUGFydHNbMV0sIGRhdGVGb3JtYXQpIHx8IG51bGw7XHJcblxyXG4gICAgICAgICAgICBpZiAoZGF0ZSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHRpbWVQYXJ0cyA9IGRhdGVUaW1lUGFydHNbMF0uc3BsaXQoJzonKTtcclxuXHJcbiAgICAgICAgICAgICAgZGF0ZS5zZXRIb3VycyhwYXJzZUludCh0aW1lUGFydHNbMF0pKTtcclxuICAgICAgICAgICAgICBkYXRlLnNldE1pbnV0ZXMocGFyc2VJbnQodGltZVBhcnRzWzFdKSk7XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiBkYXRlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGNvbHVtbi5mb3JtYXQgPSBkaXNwbGF5Rm9ybWF0O1xyXG4gICAgICAgICAgY29sdW1uLmVkaXRvclRlbXBsYXRlID0gKGUpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuICQoJzxkaXYgLz4nKS5keERhdGVCb3goe1xyXG4gICAgICAgICAgICAgIGRpc3BsYXlGb3JtYXQsXHJcbiAgICAgICAgICAgICAgdHlwZTogaXNEYXRlVGltZSA/ICdkYXRldGltZScgOiAnZGF0ZScsXHJcbiAgICAgICAgICAgICAgd2lkdGg6IDE1MCxcclxuICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKHsgdmFsdWUgfSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZS5zZXRWYWx1ZShEZXZFeHByZXNzLmxvY2FsaXphdGlvbi5mb3JtYXREYXRlKHZhbHVlLCBkaXNwbGF5Rm9ybWF0KSk7XHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB2YWx1ZTogKGlzRGF0ZVRpbWUgPyBwYXJzZURhdGVUaW1lKGUudmFsdWUpIDogRGV2RXhwcmVzcy5sb2NhbGl6YXRpb24ucGFyc2VEYXRlKGUudmFsdWUsIGRpc3BsYXlGb3JtYXQpKVxyXG4gICAgICAgICAgICAgICAgfHwgbnVsbFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICBjb2x1bW4uZmlsdGVyT3BlcmF0aW9ucyA9IFsnPScsICc8PicsICc8JywgJz4nLCAnPD0nLCAnPj0nLCAnaXNibGFuaycsICdpc25vdGJsYW5rJ107XHJcbiAgICAgICAgICBjb2x1bW4uY2FsY3VsYXRlRmlsdGVyRXhwcmVzc2lvbiA9IGZ1bmN0aW9uKGZpbHRlclZhbHVlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBbc291cmNlQ29sdW1ucywgLi4ucmVzdF07XHJcblxyXG4gICAgICAgICAgICBpZiAoYXJnc1swXSkge1xyXG4gICAgICAgICAgICAgIGlmIChpc0RhdGVUaW1lKSB7XHJcbiAgICAgICAgICAgICAgICBhcmdzWzBdID0gcGFyc2VEYXRlVGltZShhcmdzWzBdKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXJnc1swXSA9IERldkV4cHJlc3MubG9jYWxpemF0aW9uLnBhcnNlRGF0ZShmaWx0ZXJWYWx1ZSwgZGlzcGxheUZvcm1hdCkgfHwgbnVsbDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRDYWxjdWxhdGVGaWx0ZXJFeHByZXNzaW9uKC4uLmFyZ3MpO1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlc3VsdC5wdXNoKGNvbHVtbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0LnNvcnQoKGNvbDEsIGNvbDIpID0+IHtcclxuICAgICAgY29uc3QgY2FwdGlvbjEgPSAoY29sMS5jYXB0aW9uIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICBjb25zdCBjYXB0aW9uMiA9IChjb2wyLmNhcHRpb24gfHwgJycpLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgICBpZiAoY2FwdGlvbjEgPCBjYXB0aW9uMikge1xyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNhcHRpb24xID4gY2FwdGlvbjIpIHtcclxuICAgICAgICByZXR1cm4gMTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyQnVpbGRlcigpIHtcclxuICAgIGNvbnN0IGZpbHRlckJ1aWxkZXIgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgLmR4RmlsdGVyQnVpbGRlcih7XHJcbiAgICAgICAgZmllbGRzOiB0aGlzLmdldEZsYXRDb2x1bW5zTGlzdCh0aGlzLm9wdGlvbnMub3duZXIub3B0aW9uKCdjb2x1bW5zJykpXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keEZpbHRlckJ1aWxkZXIoJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgcmV0dXJuIGZpbHRlckJ1aWxkZXI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZpbHRlclBvcHVwQ29udGVudChmaWx0ZXI/OiBJQ29udHJvbERpc3BsYXlGaWx0ZXIpIHtcclxuICAgIGNvbnN0ICRwb3B1cENvbnRlbnQgPSAkKCc8ZGl2IC8+JykuaGVpZ2h0KCcxMDAlJyk7XHJcblxyXG4gICAgY29uc3QgJG5hbWVDb250YWluZXIgPSAkKCc8ZGl2IGNsYXNzPVwiYXBzLWZpbHRlcnNfX25hbWUtY29udGFpbmVyXCIgLz4nKS5oZWlnaHQoJzM2cHgnKTtcclxuXHJcbiAgICAvLyBOT1RFOiBSZWNyZWF0ZSB3aWRnZXRzXHJcbiAgICB0aGlzLmZpbHRlck5hbWVUZXh0Qm94ID0gdGhpcy5jcmVhdGVGaWx0ZXJOYW1lVGV4dEJveCgpO1xyXG4gICAgdGhpcy5maWx0ZXJCdWlsZGVyID0gdGhpcy5jcmVhdGVGaWx0ZXJCdWlsZGVyKCk7XHJcbiAgICB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3ggPSB0aGlzLmNyZWF0ZUZpbHRlcklzR2xvYmFsQ2hlY2tib3goKTtcclxuXHJcbiAgICB0aGlzLmZpbHRlck5hbWVUZXh0Qm94Lm9wdGlvbigndmFsdWUnLCBmaWx0ZXIgJiYgZmlsdGVyLm5hbWUpO1xyXG4gICAgdGhpcy5maWx0ZXJOYW1lVGV4dEJveC5lbGVtZW50KCkuYXBwZW5kVG8oJG5hbWVDb250YWluZXIpO1xyXG5cclxuICAgIHRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveC5vcHRpb24oJ3ZhbHVlJywgZmlsdGVyICYmIGZpbHRlci5pc0dsb2JhbCk7XHJcbiAgICB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3guZWxlbWVudCgpLmFwcGVuZFRvKCRuYW1lQ29udGFpbmVyKTtcclxuICAgIHRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveC5vcHRpb24oJ2Rpc2FibGVkJywgIXRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxGaWx0ZXJzKTtcclxuXHJcbiAgICAkbmFtZUNvbnRhaW5lci5hcHBlbmRUbygkcG9wdXBDb250ZW50KTtcclxuXHJcbiAgICB0aGlzLmZpbHRlckJ1aWxkZXIub3B0aW9uKCd2YWx1ZScsIGZpbHRlciAmJiBmaWx0ZXIuZmlsdGVyU3RhdGUpO1xyXG5cclxuICAgIGNvbnN0ICRmaWx0ZXJCdWlsZGVyQ29udGFpbmVyID0gJCgnPGRpdiAvPicpLmhlaWdodCgnY2FsYygxMDAlIC0gMzZweCknKS5hcHBlbmRUbygkcG9wdXBDb250ZW50KTtcclxuXHJcbiAgICB0aGlzLmZpbHRlckJ1aWxkZXIuZWxlbWVudCgpLmFwcGVuZFRvKCRmaWx0ZXJCdWlsZGVyQ29udGFpbmVyKTtcclxuXHJcbiAgICAkZmlsdGVyQnVpbGRlckNvbnRhaW5lci5keFNjcm9sbFZpZXcoe1xyXG4gICAgICBzY3JvbGxCeUNvbnRlbnQ6IHRydWVcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiAkcG9wdXBDb250ZW50O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtcyhmaWx0ZXI/OiBJQ29udHJvbERpc3BsYXlGaWx0ZXIpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuVG9vbGJhckl0ZW1bXSB7XHJcbiAgICByZXR1cm4gZmlsdGVyID8gW1xyXG4gICAgICB0aGlzLmNyZWF0ZVVwZGF0ZUZpbHRlclBvcHVwVG9vbGJhckl0ZW0oKSxcclxuICAgICAgdGhpcy5jcmVhdGVTYXZlRmlsdGVyQXNOZXdQb3B1cFRvb2xiYXJJdGVtKCksXHJcbiAgICAgIHRoaXMuY3JlYXRlUmVzZXRGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCksXHJcbiAgICAgIHRoaXMuY3JlYXRlRGVsZXRlRmlsdGVyUG9wdXBUb29sYmFySXRlbSgpXHJcbiAgICBdIDogW3RoaXMuY3JlYXRlU2F2ZUZpbHRlclBvcHVwVG9vbGJhckl0ZW0oKV07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVNhdmVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCk6IERldkV4cHJlc3MudWkuZHhQb3B1cC5Ub29sYmFySXRlbSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICB0ZXh0OiAnQXBwbHkgYW5kIFNhdmUnLFxyXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuY3JlYXRlTmV3RmlsdGVyLmJpbmQodGhpcyksXHJcbiAgICAgICAgaWNvbjogJ3NhdmUnXHJcbiAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVVwZGF0ZUZpbHRlclBvcHVwVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFBvcHVwLlRvb2xiYXJJdGVtIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIHRleHQ6ICdBcHBseSBhbmQgVXBkYXRlJyxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXIodGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGljb246ICdzYXZlJ1xyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlRmlsdGVyQXNOZXdQb3B1cFRvb2xiYXJJdGVtKCk6IERldkV4cHJlc3MudWkuZHhQb3B1cC5Ub29sYmFySXRlbSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICB0ZXh0OiAnU2F2ZSBBcyBOZXcnLFxyXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuY3JlYXRlTmV3RmlsdGVyLmJpbmQodGhpcyksXHJcbiAgICAgICAgaWNvbjogJ3NhdmUnXHJcbiAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVJlc2V0RmlsdGVyUG9wdXBUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuVG9vbGJhckl0ZW0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgdGV4dDogJ1Jlc2V0JyxcclxuICAgICAgICBvbkNsaWNrOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuaGFzQ2hhbmdlcyB8fCAhdGhpcy5maWx0ZXJCdWlsZGVyIHx8ICF0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGlzQ29uZmlybWVkID0gYXdhaXQgRGV2RXhwcmVzcy51aS5kaWFsb2cuY29uZmlybShcclxuICAgICAgICAgICAgJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZXNldCB1bnNhdmVkIGNoYW5nZXM/JyxcclxuICAgICAgICAgICAgJ1Jlc2V0IHRoZSBkYXRhIHNldCdcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpZiAoIWlzQ29uZmlybWVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnJlc2V0Q2hhbmdlcygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaWNvbjogJ3VuZG8nXHJcbiAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZURlbGV0ZUZpbHRlclBvcHVwVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFBvcHVwLlRvb2xiYXJJdGVtIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIHRleHQ6ICdEZWxldGUgRGF0YSBTZXQnLFxyXG4gICAgICAgIG9uQ2xpY2s6IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBpc0NvbmZpcm1lZCA9IGF3YWl0IERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oXHJcbiAgICAgICAgICAgIGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSBcIiR7dGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyLm5hbWV9XCIgZGF0YSBzZXQ/YCxcclxuICAgICAgICAgICAgJ0RlbGV0ZSB0aGUgZGF0YSBzZXQnXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKCFpc0NvbmZpcm1lZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVGaWx0ZXIodGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQpO1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJQb3B1cC5oaWRlKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBpY29uOiAndHJhc2gnXHJcbiAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9wZW5OZXdGaWx0ZXJQb3B1cCgpIHtcclxuICAgIGNvbnN0IGlzRmlsdGVyQXBwbGllZCA9IGF3YWl0IHRoaXMudHJ5QXBwbHlGaWx0ZXIodW5kZWZpbmVkKTtcclxuICAgIGlmICghaXNGaWx0ZXJBcHBsaWVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnVwZGF0ZUZpbHRlclBvcHVwQ29udGVudCgpO1xyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5zaG93KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9wZW5FZGl0RmlsdGVyUG9wdXAoZmlsdGVyOiBJQ29udHJvbERpc3BsYXlGaWx0ZXIpIHtcclxuICAgIHRoaXMudXBkYXRlRmlsdGVyUG9wdXBDb250ZW50KGZpbHRlcik7XHJcbiAgICB0aGlzLmZpbHRlclBvcHVwLnNob3coKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRmlsdGVyUG9wdXBDb250ZW50KGZpbHRlcj86IElDb250cm9sRGlzcGxheUZpbHRlcikge1xyXG4gICAgY29uc3QgY3VycmVudEFuaW1hdGlvbiA9IHRoaXMuZmlsdGVyUG9wdXAub3B0aW9uKCdhbmltYXRpb24nKTtcclxuXHJcbiAgICB0aGlzLmZpbHRlclBvcHVwLm9wdGlvbignYW5pbWF0aW9uJywgdW5kZWZpbmVkKTtcclxuICAgIHRoaXMuZmlsdGVyUG9wdXAub3B0aW9uKCd0aXRsZScsIGZpbHRlciA/IGBFZGl0IHRoZSBcIiR7ZmlsdGVyLm5hbWV9XCIgZGF0YSBzZXRgIDogJ0NyZWF0ZSBhIG5ldyBkYXRhIHNldCcpO1xyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ2NvbnRlbnRUZW1wbGF0ZScsICgpID0+IHRoaXMuY3JlYXRlRmlsdGVyUG9wdXBDb250ZW50KGZpbHRlcikpO1xyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ3Rvb2xiYXJJdGVtcycsIHRoaXMuY3JlYXRlRmlsdGVyUG9wdXBUb29sYmFySXRlbXMoZmlsdGVyKSk7XHJcbiAgICB0aGlzLmZpbHRlclBvcHVwLnJlcGFpbnQoKTtcclxuXHJcbiAgICB0aGlzLmZpbHRlclBvcHVwLm9wdGlvbignYW5pbWF0aW9uJywgY3VycmVudEFuaW1hdGlvbik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZU5ld0ZpbHRlcigpIHtcclxuICAgIGlmICghdGhpcy5maWx0ZXJOYW1lVGV4dEJveCB8fCAhdGhpcy5maWx0ZXJCdWlsZGVyIHx8ICF0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGZpbHRlck5hbWUgPSB0aGlzLmZpbHRlck5hbWVUZXh0Qm94Lm9wdGlvbigndmFsdWUnKTtcclxuICAgIGNvbnN0IGZpbHRlckJ1aWxkZXJTdGF0ZSA9IHRoaXMuZmlsdGVyQnVpbGRlci5vcHRpb24oJ3ZhbHVlJyk7XHJcbiAgICBjb25zdCBpc0RlZmF1bHQgPSBmYWxzZTtcclxuICAgIGNvbnN0IGlzR2xvYmFsID0gdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94Lm9wdGlvbigndmFsdWUnKTtcclxuXHJcbiAgICBpZiAoIWZpbHRlck5hbWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbnRyb2xEaXNwbGF5RmlsdGVyID0gYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jcmVhdGVOZXdGaWx0ZXIoXHJcbiAgICAgIGZpbHRlck5hbWUsIGZpbHRlckJ1aWxkZXJTdGF0ZSwgaXNEZWZhdWx0LCBpc0dsb2JhbFxyXG4gICAgKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZEZpbHRlckRyb3Bkb3duQm94RGF0YSgpO1xyXG4gICAgYXdhaXQgdGhpcy5hcHBseUZpbHRlcihjb250cm9sRGlzcGxheUZpbHRlci5pZCk7XHJcblxyXG4gICAgbm90aWZ5KCdDcmVhdGVkJywgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZUZpbHRlcihmaWx0ZXI6IElDb250cm9sRGlzcGxheUZpbHRlcikge1xyXG4gICAgaWYgKCF0aGlzLmZpbHRlck5hbWVUZXh0Qm94IHx8ICF0aGlzLmZpbHRlckJ1aWxkZXIgfHwgIXRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZmlsdGVyTmFtZSA9IHRoaXMuZmlsdGVyTmFtZVRleHRCb3gub3B0aW9uKCd2YWx1ZScpO1xyXG4gICAgY29uc3QgZmlsdGVyU3RhdGUgPSB0aGlzLmZpbHRlckJ1aWxkZXIub3B0aW9uKCd2YWx1ZScpO1xyXG4gICAgY29uc3QgaXNHbG9iYWwgPSB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCd2YWx1ZScpO1xyXG5cclxuICAgIGlmICghZmlsdGVyTmFtZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaXNVcGRhdGVkID0gYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci51cGRhdGVGaWx0ZXIoZmlsdGVyLmlkLCB7XHJcbiAgICAgIG5hbWU6IGZpbHRlck5hbWUsXHJcbiAgICAgIGZpbHRlclN0YXRlLFxyXG4gICAgICBpc0dsb2JhbFxyXG4gICAgfSk7XHJcbiAgICBpZiAoIWlzVXBkYXRlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVE9ETzogdXBkYXRlIHRpdGxlXHJcbiAgICBub3RpZnkoJ1VwZGF0ZWQnLCB0cnVlKTtcclxuICAgIGF3YWl0IHRoaXMuYXBwbHlGaWx0ZXIodGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyLmlkKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZEZpbHRlckRyb3Bkb3duQm94RGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBkZWxldGVGaWx0ZXIoZmlsdGVySWQ6IG51bWJlcikge1xyXG4gICAgYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5kZWxldGVGaWx0ZXIoZmlsdGVySWQpO1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5vbkZpbHRlckRlbGV0ZWQpIHtcclxuICAgICAgdGhpcy5vcHRpb25zLm9uRmlsdGVyRGVsZXRlZChmaWx0ZXJJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXdhaXQgdGhpcy5hcHBseUZpbHRlcih1bmRlZmluZWQpO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkRmlsdGVyRHJvcGRvd25Cb3hEYXRhKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0Q2hhbmdlcygpIHtcclxuICAgIHRoaXMuZmlsdGVyTmFtZVRleHRCb3gub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5uYW1lKTtcclxuICAgIHRoaXMuZmlsdGVyQnVpbGRlci5vcHRpb24oJ3ZhbHVlJywgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyLmZpbHRlclN0YXRlKTtcclxuICAgIHRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveC5vcHRpb24oJ3ZhbHVlJywgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyLmlzR2xvYmFsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbG9hZEZpbHRlckRyb3Bkb3duQm94RGF0YSgpIHtcclxuICAgIGlmICghdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3gpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IFt1c2VyU2V0dGluZ3MsIGZpbHRlcnNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xyXG4gICAgICB0aGlzLm9wdGlvbnMuYXBzQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyLmdldFVzZXJTZXR0aW5ncygpLFxyXG4gICAgICB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmdldEZpbHRlcnMoKVxyXG4gICAgXSk7XHJcblxyXG4gICAgaWYgKHVzZXJTZXR0aW5ncy5kZWZhdWx0RmlsdGVySWQpIHtcclxuICAgICAgY29uc3QgZGVmYXVsdEZpbHRlciA9IGZpbHRlcnMuZmluZCgoZikgPT4gZi5pZCA9PT0gdXNlclNldHRpbmdzLmRlZmF1bHRGaWx0ZXJJZCk7XHJcbiAgICAgIGlmIChkZWZhdWx0RmlsdGVyKSB7XHJcbiAgICAgICAgKGRlZmF1bHRGaWx0ZXIgYXMgYW55KS5pc0RlZmF1bHQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBEZXZFeHByZXNzLmRhdGEuQXJyYXlTdG9yZSh7XHJcbiAgICAgIGtleTogJ2lkJyxcclxuICAgICAgZGF0YTogZmlsdGVyc1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZpbHRlcnNEcm9wZG93bkJveC5vcHRpb24oJ2RhdGFTb3VyY2UnLCBkYXRhU291cmNlKTtcclxuICAgIHRoaXMuZmlsdGVyc0RhdGFHcmlkICYmIHRoaXMuZmlsdGVyc0RhdGFHcmlkLm9wdGlvbignZGF0YVNvdXJjZScsIGRhdGFTb3VyY2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjb25maXJtQ2hhbmdlc0xvc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAvLyBOT1RFOiBEZWxheSBmb3IgcG9wdXAgdmlzaWJpbGl0eSBjaGVja2luZ1xyXG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCAwKSk7XHJcbiAgICBpZiAoIXRoaXMuaGFzQ2hhbmdlcyB8fCAhdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ3Zpc2libGUnKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gRGV2RXhwcmVzcy51aS5kaWFsb2cuY29uZmlybShcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgJ1lvdSBoYXZlIHVuc2F2ZWQgY2hhbmdlcyB0aGF0IHdpbGwgYmUgbG9zdCBpZiB5b3UgY2xvc2UgdGhpcyBwb3B1cC4gRG8geW91IHdhbnQgdG8gY2xvc2UgdGhlIHBvcHVwIGFuZCBub3Qgc2F2ZSBjaGFuZ2VzPycsXHJcbiAgICAgICdVbnNhdmVkIGNoYW5nZXMnXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUFwaVJlc3BvbnNlLCBSZXF1ZXN0U3RhdGUgfSBmcm9tICcuLi8uLi9EYXRhJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZpbGVVcGxvYWRlck9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICBtYXhGaWxlU2l6ZTogbnVtYmVyO1xyXG4gIGFjY2VwdGVkRmlsZVR5cGVzOiBzdHJpbmc7XHJcbiAgYWxsb3dlZEZpbGVFeHRlbnNpb25zOiBzdHJpbmdbXTtcclxuICBvblZhbHVlQ2hhbmdlZD86IChlOiBEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyLlZhbHVlQ2hhbmdlZEV2ZW50KSA9PiB2b2lkO1xyXG4gIG9uVXBsb2FkU3RhcnRlZD86IChlOiBEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyLlVwbG9hZFN0YXJ0ZWRFdmVudCkgPT4gdm9pZDtcclxuICBvblVwbG9hZGVkPzogKGU6IERldkV4cHJlc3MudWkuZHhGaWxlVXBsb2FkZXIuVXBsb2FkZWRFdmVudCkgPT4gdm9pZDtcclxuICBzZWxlY3RCdXR0b25UZXh0Pzogc3RyaW5nO1xyXG4gIGNzc0NsYXNzPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRmlsZVVwbG9hZGVyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IG1heEZpbGVTaXplOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhY2NlcHRlZEZpbGVUeXBlczogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dlZEZpbGVFeHRlbnNpb25zOiBzdHJpbmdbXTtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uVmFsdWVDaGFuZ2VkOiAoZTogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlci5WYWx1ZUNoYW5nZWRFdmVudCkgPT4gdm9pZCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uVXBsb2FkU3RhcnRlZDogKGU6IERldkV4cHJlc3MudWkuZHhGaWxlVXBsb2FkZXIuVXBsb2FkU3RhcnRlZEV2ZW50KSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25VcGxvYWRlZDogKGU6IERldkV4cHJlc3MudWkuZHhGaWxlVXBsb2FkZXIuVXBsb2FkZWRFdmVudCkgPT4gdm9pZCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNzc0NsYXNzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzZWxlY3RCdXR0b25UZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgZmlsZVVwbG9hZGVyOiBEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJRmlsZVVwbG9hZGVyT3B0aW9ucykge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy5jc3NDbGFzcyA9IG9wdGlvbnMuY3NzQ2xhc3M7XHJcbiAgICB0aGlzLm1heEZpbGVTaXplID0gb3B0aW9ucy5tYXhGaWxlU2l6ZTtcclxuICAgIHRoaXMuYWNjZXB0ZWRGaWxlVHlwZXMgPSBvcHRpb25zLmFjY2VwdGVkRmlsZVR5cGVzO1xyXG4gICAgdGhpcy5zZWxlY3RCdXR0b25UZXh0ID0gb3B0aW9ucy5zZWxlY3RCdXR0b25UZXh0O1xyXG4gICAgdGhpcy5hbGxvd2VkRmlsZUV4dGVuc2lvbnMgPSBvcHRpb25zLmFsbG93ZWRGaWxlRXh0ZW5zaW9ucztcclxuICAgIHRoaXMub25WYWx1ZUNoYW5nZWQgPSBvcHRpb25zLm9uVmFsdWVDaGFuZ2VkO1xyXG4gICAgdGhpcy5vblVwbG9hZFN0YXJ0ZWQgPSBvcHRpb25zLm9uVXBsb2FkU3RhcnRlZDtcclxuICAgIHRoaXMub25VcGxvYWRlZCA9IG9wdGlvbnMub25VcGxvYWRlZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBjb25zdCAkZmlsZVVwbG9hZGVyID0gJCgnPGRpdiAvPicpO1xyXG4gICAgaWYgKHRoaXMuY3NzQ2xhc3MpIHtcclxuICAgICAgJGZpbGVVcGxvYWRlci5hZGRDbGFzcyh0aGlzLmNzc0NsYXNzKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZpbGVVcGxvYWRlciA9ICRmaWxlVXBsb2FkZXIuZHhGaWxlVXBsb2FkZXIoe1xyXG4gICAgICBzZWxlY3RCdXR0b25UZXh0OiB0aGlzLnNlbGVjdEJ1dHRvblRleHQsXHJcbiAgICAgIGxhYmVsVGV4dDogJycsXHJcbiAgICAgIGFsbG93ZWRGaWxlRXh0ZW5zaW9uczogdGhpcy5hbGxvd2VkRmlsZUV4dGVuc2lvbnMsXHJcbiAgICAgIGFjY2VwdDogdGhpcy5hY2NlcHRlZEZpbGVUeXBlcyxcclxuICAgICAgdXBsb2FkTW9kZTogJ3VzZUZvcm0nLFxyXG4gICAgICBtYXhGaWxlU2l6ZTogdGhpcy5tYXhGaWxlU2l6ZSxcclxuICAgICAgc2hvd0ZpbGVMaXN0OiBmYWxzZSxcclxuICAgICAgb25WYWx1ZUNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgZS5jb21wb25lbnQub3B0aW9uKCdsYWJlbFRleHQnLCBlLnZhbHVlWzBdID8gZS52YWx1ZVswXS5uYW1lIDogJycpO1xyXG4gICAgICAgIHRoaXMub25WYWx1ZUNoYW5nZWQ/LihlKTtcclxuICAgICAgfSxcclxuICAgICAgb25VcGxvYWRTdGFydGVkOiAoZSkgPT4ge1xyXG4gICAgICAgIGUuZWxlbWVudC5maW5kKCcuZHgtZmlsZXVwbG9hZGVyLXVwbG9hZC1idXR0b24nKS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy5vblVwbG9hZFN0YXJ0ZWQ/LihlKTtcclxuICAgICAgfSxcclxuICAgICAgb25VcGxvYWRlZDogKGUpID0+IHtcclxuICAgICAgICB0aGlzLm9uVXBsb2FkZWQ/LihlKTtcclxuICAgICAgfSxcclxuICAgIH0pLmR4RmlsZVVwbG9hZGVyKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHRoaXMuJGNvbnRhaW5lci5hcHBlbmQodGhpcy5maWxlVXBsb2FkZXIuZWxlbWVudCgpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGxvYWQ8VD4odXBsb2FkVXJsOiBzdHJpbmcsIHBhcmFtcz86IGFueSk6IFByb21pc2U8VD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3QgZmQgPSBuZXcgRm9ybURhdGEoKTtcclxuICAgICAgY29uc3QgZmlsZSA9ICh0aGlzLmZpbGVVcGxvYWRlci5lbGVtZW50KCkuZmluZCgnaW5wdXQnKVswXSBhcyBIVE1MSW5wdXRFbGVtZW50KS5maWxlc1swXTtcclxuXHJcbiAgICAgIGZkLmFwcGVuZCgnZmlsZScsIGZpbGUpO1xyXG5cclxuICAgICAgLyogZXNsaW50IGd1YXJkLWZvci1pbjogb2ZmICovXHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogZm9yaW5cclxuICAgICAgZm9yIChjb25zdCBwcm9wIGluIHBhcmFtcykge1xyXG4gICAgICAgIGZkLmFwcGVuZChwcm9wLCBwYXJhbXNbcHJvcF0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAkLmFqYXgoe1xyXG4gICAgICAgIHVybDogdXBsb2FkVXJsLFxyXG4gICAgICAgIHR5cGU6ICdwb3N0JyxcclxuICAgICAgICBkYXRhOiBmZCxcclxuICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsXHJcbiAgICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLFxyXG4gICAgICAgIHN1Y2Nlc3M6IChyZXNwb25zZTogSUFwaVJlc3BvbnNlPFQ+KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2UuUmVxdWVzdFN0YXRlID09PSBSZXF1ZXN0U3RhdGUuQ29tcGxldGVkKSB7XHJcbiAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UuRGF0YSBhcyBhbnkpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVqZWN0KHJlc3BvbnNlLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlKSA9PiByZWplY3QoJ1Vua25vd24gZXJyb3InKVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgY3JlYXRlRHhEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vRGF0YS9EeERhdGFTb3VyY2UnO1xyXG5pbXBvcnQgbm90aWZ5IGZyb20gJy4uLy4uL1dpZGdldHMvTm90aWZ5JztcclxuaW1wb3J0IHsgRmlsZVVwbG9hZGVyIH0gZnJvbSAnLi4vRmlsZVVwbG9hZGVyL0luZGV4JztcclxuaW1wb3J0IHsgSUZpbGVJbXBvcnRlckNvbHVtbkluZm8sIElGaWxlSW1wb3J0ZXJUYWJsZU1ldGFkYXRhIH0gZnJvbSAnLi9JRmlsZUltcG9ydGVyVGFibGVNZXRhZGF0YSc7XHJcbmltcG9ydCBkZWZhdWx0R3JpZCBmcm9tICcuLi8uLi9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQnO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi8uLi9VdGlscy9FdmVudEVtaXR0ZXInO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRmlsZUltcG9ydGVyVGFibGVJbmZvIHtcclxuICBzY2hlbWE6IHN0cmluZztcclxuICB0YWJsZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElGaWxlSW1wb3J0ZXJPcHRpb25zIHtcclxuICAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICBmaWxlVXBsb2FkVXJsOiBzdHJpbmc7XHJcbiAgY3JlYXRlVGFibGVVcmw6IHN0cmluZztcclxuICBhZGRSb3dzVXJsOiBzdHJpbmc7XHJcbiAgZ2V0VGFibGVzTGlzdFVybD86IHN0cmluZztcclxuICBwcmVkZWZpbmVkVGFibGU/OiBJRmlsZUltcG9ydGVyVGFibGVJbmZvO1xyXG4gIHByZWRlZmluZWRJbXBvcnRGaWxlTW9kZT86IEltcG9ydEZpbGVNb2RlO1xyXG4gIGNyZWF0ZVRhYmxlQnV0dG9uVGV4dD86IHN0cmluZztcclxuICB1cGRhdGVUYWJsZUJ1dHRvblRleHQ/OiBzdHJpbmc7XHJcbiAgY3JlYXRlVGFibGVNb2RlVGV4dD86IHN0cmluZztcclxuICB1cGRhdGVUYWJsZU1vZGVUZXh0Pzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgZW51bSBJbXBvcnRGaWxlTW9kZSB7XHJcbiAgQ3JlYXRlTmV3VGFibGUgPSAwLFxyXG4gIEFkZE5ld1Jvd3MgPSAxXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBGaWxlSW1wb3J0ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVEFCTEVfVVBEQVRFRF9FVkVOVCA9ICdmaWxlLWltcG9ydGVyLXRhYmxlLXVwZGF0ZWQtZXZlbnQnO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGZpbGVVcGxvYWRVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjcmVhdGVUYWJsZVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkUm93c1VybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJlZGVmaW5lZFRhYmxlOiBJRmlsZUltcG9ydGVyVGFibGVJbmZvIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2V0VGFibGVzTGlzdFVybDogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY2FuQ2hhbmdlTW9kZTogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNyZWF0ZVRhYmxlQnV0dG9uVGV4dDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlVGFibGVCdXR0b25UZXh0OiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjcmVhdGVUYWJsZU1vZGVUZXh0OiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVUYWJsZU1vZGVUZXh0OiBzdHJpbmc7XHJcblxyXG4gIHByaXZhdGUgcG9wdXA6IERldkV4cHJlc3MudWkuZHhQb3B1cDtcclxuICBwcml2YXRlIGZvcm06IERldkV4cHJlc3MudWkuZHhGb3JtO1xyXG4gIHByaXZhdGUgZmlsZVVwbG9hZGVyOiBGaWxlVXBsb2FkZXI7XHJcbiAgcHJpdmF0ZSBkYXRhR3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG4gIHByaXZhdGUgYWN0aW9uQnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uO1xyXG4gIHByaXZhdGUgcm93c0NvdW50ZXJDb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJvd3NDb3VudGVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSBtb2RlOiBJbXBvcnRGaWxlTW9kZTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUZpbGVJbXBvcnRlck9wdGlvbnMpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLmZpbGVVcGxvYWRVcmwgPSBvcHRpb25zLmZpbGVVcGxvYWRVcmw7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSBvcHRpb25zLiRjb250YWluZXI7XHJcbiAgICB0aGlzLnRpdGxlID0gb3B0aW9ucy50aXRsZTtcclxuICAgIHRoaXMuZ2V0VGFibGVzTGlzdFVybCA9IG9wdGlvbnMuZ2V0VGFibGVzTGlzdFVybDtcclxuICAgIHRoaXMuY3JlYXRlVGFibGVVcmwgPSBvcHRpb25zLmNyZWF0ZVRhYmxlVXJsO1xyXG4gICAgdGhpcy5hZGRSb3dzVXJsID0gb3B0aW9ucy5hZGRSb3dzVXJsO1xyXG4gICAgdGhpcy5wcmVkZWZpbmVkVGFibGUgPSBvcHRpb25zLnByZWRlZmluZWRUYWJsZTtcclxuICAgIHRoaXMuY2FuQ2hhbmdlTW9kZSA9IG9wdGlvbnMucHJlZGVmaW5lZEltcG9ydEZpbGVNb2RlID09PSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLm1vZGUgPSBvcHRpb25zLnByZWRlZmluZWRJbXBvcnRGaWxlTW9kZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5wcmVkZWZpbmVkSW1wb3J0RmlsZU1vZGUgOiBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZTtcclxuICAgIHRoaXMuY3JlYXRlVGFibGVCdXR0b25UZXh0ID0gb3B0aW9ucy5jcmVhdGVUYWJsZUJ1dHRvblRleHQgfHwgJ0NyZWF0ZSBUYWJsZSc7XHJcbiAgICB0aGlzLnVwZGF0ZVRhYmxlQnV0dG9uVGV4dCA9IG9wdGlvbnMudXBkYXRlVGFibGVCdXR0b25UZXh0IHx8ICdBZGQgTmV3IFJvd3MnO1xyXG4gICAgdGhpcy5jcmVhdGVUYWJsZU1vZGVUZXh0ID0gb3B0aW9ucy5jcmVhdGVUYWJsZU1vZGVUZXh0IHx8ICdDcmVhdGUgVGFibGUnO1xyXG4gICAgdGhpcy51cGRhdGVUYWJsZU1vZGVUZXh0ID0gb3B0aW9ucy51cGRhdGVUYWJsZU1vZGVUZXh0IHx8ICdBZGQgTmV3IFJvd3MnO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3coKSB7XHJcbiAgICB0aGlzLnBvcHVwID0gJCgnPGRpdiAvPicpLmFwcGVuZFRvKHRoaXMuJGNvbnRhaW5lcilcclxuICAgICAgLmR4UG9wdXAoe1xyXG4gICAgICAgIHNob3dUaXRsZTogdHJ1ZSxcclxuICAgICAgICB0aXRsZTogdGhpcy50aXRsZSxcclxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcclxuICAgICAgICBkcmFnRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgICAgcmVzaXplRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLFxyXG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxyXG4gICAgICAgIGZ1bGxTY3JlZW46IHRydWUsXHJcbiAgICAgICAgbWF4V2lkdGg6IDEzMDAsXHJcbiAgICAgICAgbWF4SGVpZ2h0OiA4MDAsXHJcbiAgICAgICAgY29udGVudFRlbXBsYXRlOiAoJGNvbnRhaW5lcikgPT4ge1xyXG4gICAgICAgICAgY29uc3QgJHNjcm9sbFZpZXcgPSAkKCc8ZGl2IC8+Jyk7XHJcblxyXG4gICAgICAgICAgdGhpcy5mb3JtID0gdGhpcy5jcmVhdGVGb3JtKCk7XHJcbiAgICAgICAgICAkc2Nyb2xsVmlldy5hcHBlbmQodGhpcy5mb3JtLmVsZW1lbnQoKSk7XHJcblxyXG4gICAgICAgICAgJHNjcm9sbFZpZXcuZHhTY3JvbGxWaWV3KHtcclxuICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgICAgICAgaGVpZ2h0OiAnMTAwJSdcclxuICAgICAgICAgIH0pLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdG9vbGJhckl0ZW1zOiBbe1xyXG4gICAgICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgdGV4dDogdGhpcy5nZXRBY3Rpb25CdXR0b25UZXh0KCksXHJcbiAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJyxcclxuICAgICAgICAgICAgb25Jbml0aWFsaXplZDogKGUpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLmFjdGlvbkJ1dHRvbiA9IGUuY29tcG9uZW50O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBvbkNsaWNrOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVGFibGUoKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRSb3dzVG9UYWJsZSgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIHRleHQ6ICdDYW5jZWwnLFxyXG4gICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB0aGlzLnBvcHVwLmhpZGUoKVxyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgICAgIH1dXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keFBvcHVwKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHRoaXMucG9wdXAuc2hvdygpO1xyXG4gICAgdGhpcy5vbk1vZGVTd2l0Y2hpbmcoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwb3NlKCkge1xyXG4gICAgaWYgKHRoaXMucG9wdXApIHtcclxuICAgICAgdGhpcy5wb3B1cC5kaXNwb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZvcm0oKTogRGV2RXhwcmVzcy51aS5keEZvcm0ge1xyXG4gICAgY29uc3QgZm9ybSA9ICQoJzxkaXY+JykuZHhGb3JtKHtcclxuICAgICAgc2hvd0NvbG9uQWZ0ZXJMYWJlbDogdHJ1ZSxcclxuICAgICAgbGFiZWxMb2NhdGlvbjogJ3RvcCcsXHJcbiAgICAgIGNvbENvdW50QnlTY3JlZW46IHsgbWQ6IDQsIHNtOiAxIH0sXHJcbiAgICAgIHNjcmVlbkJ5V2lkdGg6ICh3aWR0aCkgPT4gd2lkdGggPCAxMjU2ID8gJ3NtJyA6ICdtZCcsXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgIGRhdGFGaWVsZDogJ01vZGUnLFxyXG4gICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICB0ZW1wbGF0ZTogKF9kYXRhLCAkY29udGFpbmVyKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNyZWF0ZU1vZGVTd2l0Y2hlcigkY29udGFpbmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdTY2hlbWEnLFxyXG4gICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgIGRpc2FibGVkOiAhdGhpcy5jYW5DaGFuZ2VNb2RlXHJcbiAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VGV4dEJveC5Qcm9wZXJ0aWVzLFxyXG4gICAgICAgIHZhbGlkYXRpb25SdWxlczogW3tcclxuICAgICAgICAgIHR5cGU6ICdyZXF1aXJlZCcsXHJcbiAgICAgICAgfV1cclxuICAgICAgfSwge1xyXG4gICAgICAgIGRhdGFGaWVsZDogJ1RhYmxlJyxcclxuICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICBkaXNhYmxlZDogIXRoaXMuY2FuQ2hhbmdlTW9kZVxyXG4gICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRleHRCb3guUHJvcGVydGllcyxcclxuICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFt7XHJcbiAgICAgICAgICB0eXBlOiAncmVxdWlyZWQnLFxyXG4gICAgICAgIH1dXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdUYWJsZVNlbGVjdG9yJyxcclxuICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgdGV4dDogJ1RhYmxlJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZWRpdG9yVHlwZTogJ2R4U2VsZWN0Qm94JyxcclxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcclxuICAgICAgICBjb2xTcGFuOiAyLFxyXG4gICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgIGRhdGFTb3VyY2U6IG5ldyBEZXZFeHByZXNzLmRhdGEuRGF0YVNvdXJjZSh7XHJcbiAgICAgICAgICAgIHN0b3JlOiBjcmVhdGVEeERhdGFTb3VyY2Uoe1xyXG4gICAgICAgICAgICAgIGxvYWRVcmw6IHRoaXMuZ2V0VGFibGVzTGlzdFVybCxcclxuICAgICAgICAgICAgICBsb2FkUGFyYW1zOiB7IGNvbnRleHROYW1lOiAnJywgdGFibGVzT25seTogdHJ1ZSwgaXNXYXJlaG91c2VDb250ZXh0OiB0cnVlIH0sXHJcbiAgICAgICAgICAgICAgbG9hZE1ldGhvZDogJ3Bvc3QnLFxyXG4gICAgICAgICAgICAgIG5vdGlmeUVycm9yOiBmYWxzZVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgcGFnaW5hdGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBzb3J0OiAndGhpcycsXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIHNlYXJjaEVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VGV4dEJveC5Qcm9wZXJ0aWVzLFxyXG4gICAgICAgIHZhbGlkYXRpb25SdWxlczogW3tcclxuICAgICAgICAgIHR5cGU6ICdyZXF1aXJlZCcsXHJcbiAgICAgICAgfV1cclxuICAgICAgfSwge1xyXG4gICAgICAgIGRhdGFGaWVsZDogJ1NvdXJjZSBGaWxlJyxcclxuICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgdGVtcGxhdGU6IChfZGF0YSwgJGNvbnRhaW5lcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jcmVhdGVGaWxlc1VwbG9hZGVyKCRjb250YWluZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwge1xyXG4gICAgICAgIGRhdGFGaWVsZDogJ0NvbHVtbnMgU2VsZWN0b3InLFxyXG4gICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29sU3BhbjogNCxcclxuICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgdGVtcGxhdGU6IChfZGF0YSwgJGNvbnRhaW5lcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jcmVhdGVEYXRhR3JpZCgkY29udGFpbmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1dXHJcbiAgICB9KS5keEZvcm0oJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgcmV0dXJuIGZvcm07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZU1vZGVTd2l0Y2hlcigkY29udGFpbmVyOiBKUXVlcnkpIHtcclxuICAgICQoJzxkaXYgLz4nKS5keEJ1dHRvbkdyb3VwKHtcclxuICAgICAgaXRlbXM6IFt7XHJcbiAgICAgICAgdGV4dDogdGhpcy5jcmVhdGVUYWJsZU1vZGVUZXh0LFxyXG4gICAgICAgIGljb246ICdpbnNlcnR0YWJsZScsXHJcbiAgICAgICAgdmFsdWU6IEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlXHJcbiAgICAgIH0sIHtcclxuICAgICAgICB0ZXh0OiB0aGlzLnVwZGF0ZVRhYmxlTW9kZVRleHQsXHJcbiAgICAgICAgaWNvbjogJ2luc2VydHJvd2JlbG93JyxcclxuICAgICAgICB2YWx1ZTogSW1wb3J0RmlsZU1vZGUuQWRkTmV3Um93c1xyXG4gICAgICB9XSBhcyBhbnksXHJcbiAgICAgIGtleUV4cHI6ICd2YWx1ZScsXHJcbiAgICAgIGRpc2FibGVkOiAhdGhpcy5jYW5DaGFuZ2VNb2RlLFxyXG4gICAgICBzdHlsaW5nTW9kZTogJ291dGxpbmVkJyxcclxuICAgICAgc2VsZWN0aW9uTW9kZTogJ3NpbmdsZScsXHJcbiAgICAgIHNlbGVjdGVkSXRlbUtleXM6IFt0aGlzLm1vZGVdLFxyXG4gICAgICBvbkl0ZW1DbGljazogKGUpID0+IHtcclxuICAgICAgICB0aGlzLm1vZGUgPSBlLml0ZW1EYXRhLnZhbHVlO1xyXG4gICAgICAgIHRoaXMub25Nb2RlU3dpdGNoaW5nKCk7XHJcbiAgICAgIH0sXHJcbiAgICB9KS5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsZXNVcGxvYWRlcigkY29udGFpbmVyOiBKUXVlcnkpIHtcclxuICAgIHRoaXMuZmlsZVVwbG9hZGVyID0gbmV3IEZpbGVVcGxvYWRlcih7XHJcbiAgICAgICRjb250YWluZXIsXHJcbiAgICAgIGNzc0NsYXNzOiAndGFibGUtY3JlYXRvcl9fdXBsb2FkJyxcclxuICAgICAgbWF4RmlsZVNpemU6IDEwICogMTAwMDAwMCxcclxuICAgICAgYWNjZXB0ZWRGaWxlVHlwZXM6ICcueGxzLCAueGxzeCcsXHJcbiAgICAgIGFsbG93ZWRGaWxlRXh0ZW5zaW9uczogWycueGxzJywgJy54bHN4J10sXHJcbiAgICAgIHNlbGVjdEJ1dHRvblRleHQ6ICdTZWxlY3QgRXhjZWwgZmlsZScsXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhR3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ1BhcnNpbmcgc2VsZWN0ZWQgZmlsZS4uLicpO1xyXG4gICAgICAgIHRoaXMuZmlsZVVwbG9hZGVyLnVwbG9hZDxJRmlsZUltcG9ydGVyVGFibGVNZXRhZGF0YT4odGhpcy5maWxlVXBsb2FkVXJsKS50aGVuKCh0YWJsZU1ldGEpID0+IHtcclxuICAgICAgICAgIGlmICh0YWJsZU1ldGEpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRSb3dzQ291bnQodGFibGVNZXRhLlJvd3NDb3VudCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGV2RXhwcmVzcy5kYXRhLkRhdGFTb3VyY2Uoe1xyXG4gICAgICAgICAgICAgIHN0b3JlOiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnYXJyYXknLFxyXG4gICAgICAgICAgICAgICAga2V5OiAnSWQnLFxyXG4gICAgICAgICAgICAgICAgZGF0YTogdGFibGVNZXRhLkNvbHVtbnNcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIHBhZ2luYXRlOiBmYWxzZVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZGF0YUdyaWQub3B0aW9uKCdkYXRhU291cmNlJywgZGF0YVNvdXJjZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICAgIG5vdGlmeShgUGFyc2luZyBFcnJvciA6ICR7ZX1gLCBmYWxzZSk7XHJcbiAgICAgICAgfSkuZmluYWxseSgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFHcmlkLmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZpbGVVcGxvYWRlci5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRGF0YUdyaWQoJGNvbnRhaW5lcjogSlF1ZXJ5KSB7XHJcbiAgICBjb25zdCBncmlkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyA9IHtcclxuICAgICAgbm9EYXRhVGV4dDogJ1NlbGVjdCBFeGNlbCBGaWxlJyxcclxuICAgICAgaG92ZXJTdGF0ZUVuYWJsZWQ6IHRydWUsXHJcbiAgICAgIHNlYXJjaFBhbmVsOiB7XHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgZ3JvdXBQYW5lbDoge1xyXG4gICAgICAgIHZpc2libGU6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIGhlYWRlckZpbHRlcjoge1xyXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICB9LFxyXG4gICAgICBmaWx0ZXJSb3c6IHtcclxuICAgICAgICB2aXNpYmxlOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBzb3J0aW5nOiB7XHJcbiAgICAgICAgbW9kZTogJ25vbmUnXHJcbiAgICAgIH0sXHJcbiAgICAgIHBhZ2luZzoge1xyXG4gICAgICAgIHBhZ2VTaXplOiAxMDAwMCxcclxuICAgICAgICBlbmFibGVkOiBmYWxzZSxcclxuICAgICAgfSxcclxuICAgICAgZWRpdGluZzoge1xyXG4gICAgICAgIGFsbG93VXBkYXRpbmc6IHRydWUsXHJcbiAgICAgICAgbW9kZTogJ2NlbGwnLFxyXG4gICAgICB9LFxyXG4gICAgICBzZWxlY3Rpb246IHtcclxuICAgICAgICBtb2RlOiAnbm9uZSdcclxuICAgICAgfSxcclxuICAgICAgY29sdW1uczogW3tcclxuICAgICAgICBkYXRhRmllbGQ6ICdJZCcsXHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdTZWxlY3RlZCcsXHJcbiAgICAgICAgZGF0YVR5cGU6ICdib29sZWFuJyxcclxuICAgICAgICB2aXNpYmxlOiB0aGlzLm1vZGUgPT09IEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdJc0tleUNvbHVtbicsXHJcbiAgICAgICAgZGF0YVR5cGU6ICdib29sZWFuJyxcclxuICAgICAgICB2aXNpYmxlOiB0aGlzLm1vZGUgPT09IEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdOYW1lJyxcclxuICAgICAgICBjYXB0aW9uOiAnQ29sdW1uIE5hbWUnXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdUeXBlJyxcclxuICAgICAgICBhbGxvd0VkaXRpbmc6IGZhbHNlXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdJc051bGxhYmxlJyxcclxuICAgICAgICBhbGxvd0VkaXRpbmc6IHRoaXMubW9kZSA9PT0gSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGUgJiYgdGhpcy5jYW5DaGFuZ2VNb2RlLFxyXG4gICAgICAgIHNldENlbGxWYWx1ZTogKG5ld0RhdGEsIHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICBuZXdEYXRhLklzTnVsbGFibGUgPSB2YWx1ZTtcclxuICAgICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICBuZXdEYXRhLklzS2V5Q29sdW1uID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XSxcclxuICAgICAgcmVtb3RlT3BlcmF0aW9uczogZmFsc2UsXHJcbiAgICAgIG9uVG9vbGJhclByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgICBjb25zdCB0b29sYmFySXRlbXMgPSBlLnRvb2xiYXJPcHRpb25zLml0ZW1zO1xyXG4gICAgICAgIHRvb2xiYXJJdGVtcy5wdXNoKHtcclxuICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAkKCc8ZGl2PicpXHJcbiAgICAgICAgICAgICAgLmFwcGVuZCgkKCc8c3Bhbj4nKVxyXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKCd0YWJsZS1jcmVhdG9yX190YWJsZS1oZWFkZXInKVxyXG4gICAgICAgICAgICAgICAgLnRleHQoJ1BhcnNlZCBGaWxlIE1ldGFkYXRhJyksXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBsb2NhdGlvbjogJ2JlZm9yZSdcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJvd3NDb3VudGVyID0gJCgnPHNwYW4+JykudGV4dCgnMTAwMCcpO1xyXG4gICAgICAgICAgICB0aGlzLnJvd3NDb3VudGVyQ29udGFpbmVyID0gJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAgIC5hcHBlbmQoJCgnPHNwYW4+JykudGV4dCgnUm93cyBDb3VudDogJyksIHRoaXMucm93c0NvdW50ZXIpLmhpZGUoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvd3NDb3VudGVyQ29udGFpbmVyO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRWRpdG9yUHJlcGFyaW5nOiAoZSkgPT4ge1xyXG4gICAgICAgIGlmIChlLnBhcmVudFR5cGUgPT09ICdkYXRhUm93JyAmJiBlLmRhdGFGaWVsZCA9PT0gJ0lzS2V5Q29sdW1uJykge1xyXG4gICAgICAgICAgY29uc3QgZWRpdG9yT3B0aW9ucyA9IGUuZWRpdG9yT3B0aW9ucyBhcyBEZXZFeHByZXNzLnVpLmR4Q2hlY2tCb3hPcHRpb25zO1xyXG4gICAgICAgICAgZWRpdG9yT3B0aW9ucy5kaXNhYmxlZCA9IGUucm93LmRhdGEuSXNOdWxsYWJsZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5kYXRhR3JpZCA9IGRlZmF1bHRHcmlkKCQoJzxkaXYgLz4nKSwge1xyXG4gICAgICBvcHRpb25zOiBncmlkT3B0aW9ucyxcclxuICAgICAgc3VtbWFyeUNvbHVtbjogJ05hbWUnLFxyXG4gICAgICBpc0Z1bGxTY3JlZW46IGZhbHNlLFxyXG4gICAgICBzZXREZWZhdWx0Q29sdW1uV2lkdGg6IGZhbHNlXHJcbiAgICB9KTtcclxuXHJcbiAgICAkY29udGFpbmVyLmFwcGVuZCh0aGlzLmRhdGFHcmlkLmVsZW1lbnQoKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVRhYmxlKCkge1xyXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMuZm9ybS52YWxpZGF0ZSgpO1xyXG4gICAgaWYgKHZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xyXG4gICAgICBjb25zdCBkcyA9IHRoaXMuZGF0YUdyaWQuZ2V0RGF0YVNvdXJjZSgpO1xyXG4gICAgICBpZiAoIWRzKSB7XHJcbiAgICAgICAgbm90aWZ5KCdTZWxlY3QgZmlsZSB3aXRoIGRhdGEnLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgY29sdW1ucyA9IGRzLml0ZW1zKCk7XHJcbiAgICAgIGlmICghdGhpcy5hcmVDb2x1bW5zVmFsaWQoY29sdW1ucykpIHtcclxuICAgICAgICBub3RpZnkoJ0F0IGxlYXN0IDEga2V5IGNvbHVtbiBtdXN0IGJlIHNldCcsIGZhbHNlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICAgICBzY2hlbWE6IHRoaXMuZm9ybS5vcHRpb24oJ2Zvcm1EYXRhJykuU2NoZW1hLFxyXG4gICAgICAgICAgdGFibGU6IHRoaXMuZm9ybS5vcHRpb24oJ2Zvcm1EYXRhJykuVGFibGUsXHJcbiAgICAgICAgICBjb2x1bW5zOiBKU09OLnN0cmluZ2lmeShjb2x1bW5zKVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5kYXRhR3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ0NyZWF0aW5nIGFuZCBmaWxsaW5nIERCIHRhYmxlLi4uJyk7XHJcbiAgICAgICAgdGhpcy5maWxlVXBsb2FkZXIudXBsb2FkPGJvb2xlYW4+KHRoaXMuY3JlYXRlVGFibGVVcmwsIHBhcmFtcykudGhlbigocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGlmIChyZXNwb25zZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnBvcHVwLmhpZGUoKTtcclxuICAgICAgICAgICAgbm90aWZ5KGBUaGUgdGFibGUgWyR7cGFyYW1zLnNjaGVtYX1dLlske3BhcmFtcy50YWJsZX1dIGhhcyBiZWVuIGNyZWF0ZWRgLCB0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KEZpbGVJbXBvcnRlci5UQUJMRV9VUERBVEVEX0VWRU5UKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG5vdGlmeSgnVGhlIHRhYmxlIGhhcyBub3QgYmVlbiBjcmVhdGVkJywgZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgICBub3RpZnkoYFRhYmxlIGNyZWF0aW5nIGVycm9yOiAke2V9YCwgZmFsc2UpO1xyXG4gICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRhR3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkUm93c1RvVGFibGUoKSB7XHJcbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdGhpcy5mb3JtLnZhbGlkYXRlKCk7XHJcbiAgICBpZiAodmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XHJcbiAgICAgIGNvbnN0IGRzID0gdGhpcy5kYXRhR3JpZC5nZXREYXRhU291cmNlKCk7XHJcbiAgICAgIGlmICghZHMpIHtcclxuICAgICAgICBub3RpZnkoJ1NlbGVjdCBmaWxlIHdpdGggZGF0YScsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBjb2x1bW5zID0gZHMuaXRlbXMoKTtcclxuICAgICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAgIHRhYmxlOiB0aGlzLmZvcm0ub3B0aW9uKCdmb3JtRGF0YScpLlRhYmxlU2VsZWN0b3IsXHJcbiAgICAgICAgY29sdW1uczogSlNPTi5zdHJpbmdpZnkoY29sdW1ucylcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5kYXRhR3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ0FkZGluZyByb3dzIHRvIERCIHRhYmxlLi4uJyk7XHJcbiAgICAgIHRoaXMuZmlsZVVwbG9hZGVyLnVwbG9hZDxib29sZWFuPih0aGlzLmFkZFJvd3NVcmwsIHBhcmFtcykudGhlbigocmVzcG9uc2UpID0+IHtcclxuICAgICAgICBpZiAocmVzcG9uc2UgPT09IHRydWUpIHtcclxuICAgICAgICAgIHRoaXMucG9wdXAuaGlkZSgpO1xyXG4gICAgICAgICAgbm90aWZ5KGBUaGUgdGFibGUgJHtwYXJhbXMudGFibGV9IGhhcyBiZWVuIHVwZGF0ZWRgLCB0cnVlKTtcclxuICAgICAgICAgIHRoaXMuZW1pdChGaWxlSW1wb3J0ZXIuVEFCTEVfVVBEQVRFRF9FVkVOVCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5vdGlmeSgnVGhlIHRhYmxlIGhhcyBub3QgYmVlbiB1cGRhdGVkJywgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSkuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICBub3RpZnkoYFRhYmxlIHVwZGF0aW5nIGVycm9yOiAke2V9YCwgZmFsc2UpO1xyXG4gICAgICB9KS5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFHcmlkLmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uTW9kZVN3aXRjaGluZygpIHtcclxuICAgIGNvbnN0IGlzQ3JlYXRlVGFibGVNb2RlID0gdGhpcy5tb2RlID09PSBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZTtcclxuXHJcbiAgICB0aGlzLmFjdGlvbkJ1dHRvbi5vcHRpb24oJ3RleHQnLCB0aGlzLmdldEFjdGlvbkJ1dHRvblRleHQoKSk7XHJcbiAgICB0aGlzLmRhdGFHcmlkLmNvbHVtbk9wdGlvbignSXNLZXlDb2x1bW4nLCAndmlzaWJsZScsIGlzQ3JlYXRlVGFibGVNb2RlKTtcclxuICAgIHRoaXMuZGF0YUdyaWQuY29sdW1uT3B0aW9uKCdJc051bGxhYmxlJywgJ3Zpc2libGUnLCBpc0NyZWF0ZVRhYmxlTW9kZSk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmNhbkNoYW5nZU1vZGUpIHtcclxuICAgICAgdGhpcy5mb3JtLml0ZW1PcHRpb24oJ1NjaGVtYScsICd2aXNpYmxlJywgdHJ1ZSk7XHJcbiAgICAgIHRoaXMuZm9ybS51cGRhdGVEYXRhKCdTY2hlbWEnLCB0aGlzLnByZWRlZmluZWRUYWJsZS5zY2hlbWEpO1xyXG5cclxuICAgICAgdGhpcy5mb3JtLml0ZW1PcHRpb24oJ1RhYmxlJywgJ3Zpc2libGUnLCB0cnVlKTtcclxuICAgICAgdGhpcy5mb3JtLnVwZGF0ZURhdGEoJ1RhYmxlJywgdGhpcy5wcmVkZWZpbmVkVGFibGUudGFibGUpO1xyXG5cclxuICAgICAgdGhpcy5mb3JtLml0ZW1PcHRpb24oJ1RhYmxlU2VsZWN0b3InLCAndmlzaWJsZScsIGZhbHNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZm9ybS5pdGVtT3B0aW9uKCdTY2hlbWEnLCAndmlzaWJsZScsIGlzQ3JlYXRlVGFibGVNb2RlKTtcclxuICAgICAgdGhpcy5mb3JtLml0ZW1PcHRpb24oJ1RhYmxlJywgJ3Zpc2libGUnLCBpc0NyZWF0ZVRhYmxlTW9kZSk7XHJcbiAgICAgIHRoaXMuZm9ybS5pdGVtT3B0aW9uKCdUYWJsZVNlbGVjdG9yJywgJ3Zpc2libGUnLCAhaXNDcmVhdGVUYWJsZU1vZGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRBY3Rpb25CdXR0b25UZXh0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZSA/IHRoaXMuY3JlYXRlVGFibGVCdXR0b25UZXh0IDogdGhpcy51cGRhdGVUYWJsZUJ1dHRvblRleHQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFyZUNvbHVtbnNWYWxpZChjb2x1bW5zOiBJRmlsZUltcG9ydGVyQ29sdW1uSW5mb1tdKSB7XHJcbiAgICByZXR1cm4gY29sdW1ucy5maWx0ZXIoKGMpID0+IGMuU2VsZWN0ZWQpLnNvbWUoKHMpID0+IHMuSXNLZXlDb2x1bW4pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRSb3dzQ291bnQoY291bnQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5yb3dzQ291bnRlckNvbnRhaW5lci5zaG93KCk7XHJcbiAgICB0aGlzLnJvd3NDb3VudGVyLnRleHQoY291bnQpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgR3JpZERpc3BsYXlzTWFuYWdlciB9IGZyb20gJy4vR3JpZERpc3BsYXlzTWFuYWdlcic7XHJcbmltcG9ydCB7IEdyaWRWaWV3c01hbmFnZXIgfSBmcm9tICcuL0dyaWRWaWV3c01hbmFnZXInO1xyXG5pbXBvcnQgeyBHcmlkRmlsdGVyc01hbmFnZXIgfSBmcm9tICcuL0dyaWRGaWx0ZXJzTWFuYWdlcic7XHJcbmltcG9ydCB7IGNyZWF0ZURpYWxvZyB9IGZyb20gJy4uLy4uLy4uL1dpZGdldHMvUG9wdXAnO1xyXG5pbXBvcnQgeyBDZG1JbXBvcnRGaWxlTW9kZSB9IGZyb20gJy4uLy4uL0J1c2luZXNzJztcclxuaW1wb3J0IHsgRmlsZUltcG9ydGVyLCBJRmlsZUltcG9ydGVyVGFibGVJbmZvLCBJbXBvcnRGaWxlTW9kZSB9IGZyb20gJy4uLy4uLy4uL0NvbXBvbmVudHMvRmlsZUltcG9ydGVyL0luZGV4JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZpbGVJbXBvcnRlck9wdGlvbnMge1xyXG4gIG1vZGU6IENkbUltcG9ydEZpbGVNb2RlO1xyXG4gIGNyZWF0ZVRhYmxlVXJsOiBzdHJpbmc7XHJcbiAgYWRkUm93c1VybDogc3RyaW5nO1xyXG4gIGZpbGVVcGxvYWRVcmw6IHN0cmluZztcclxuICBwcmVkZWZpbmVkVGFibGU6IElGaWxlSW1wb3J0ZXJUYWJsZUluZm87XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQge1xyXG4gIHJlYWRvbmx5IG93bmVyOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XHJcbiAgcmVhZG9ubHkgZWRpdE1vZGU6IGJvb2xlYW47XHJcbiAgcmVhZG9ubHkgZ3JpZERpc3BsYXlzTWFuYWdlcjogR3JpZERpc3BsYXlzTWFuYWdlcjtcclxuICByZWFkb25seSBncmlkVmlld3NNYW5hZ2VyOiBHcmlkVmlld3NNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGdyaWRGaWx0ZXJzTWFuYWdlcjogR3JpZEZpbHRlcnNNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGltcG9ydEZpbGVPcHRpb25zPzogSUZpbGVJbXBvcnRlck9wdGlvbnM7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBHcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50IHtcclxuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogSUdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQ7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JpZERpc3BsYXlzTWFuYWdlcjogR3JpZERpc3BsYXlzTWFuYWdlcjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWRWaWV3c01hbmFnZXI6IEdyaWRWaWV3c01hbmFnZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncmlkRmlsdGVyc01hbmFnZXI6IEdyaWRGaWx0ZXJzTWFuYWdlcjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGltcG9ydEZpbGVPcHRpb25zOiBJRmlsZUltcG9ydGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSBkaXNwbGF5c0Ryb3Bkb3duQm94OiBEZXZFeHByZXNzLnVpLmR4U2VsZWN0Qm94IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgY3VycmVudERpc3BsYXlUaXRsZTogRGV2RXhwcmVzcy51aS5keFRleHRCb3ggfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBzYXZlQnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgc2F2ZUFzQnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgZGF0YUdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGZpbGVJbXBvcnRlcjogRmlsZUltcG9ydGVyIHwgdW5kZWZpbmVkO1xyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZSB2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfZGlzcGxheXNUb29sYmFySXRlbTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX2ltcG9ydEZpbGVUb29sYmFySXRlbTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHwgdW5kZWZpbmVkO1xyXG4gIC8vIHRzbGludDplbmFibGUgdmFyaWFibGUtbmFtZVxyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJR3JpZERpc3BsYXlzVG9vbGJhckNvbXBvbmVudCkge1xyXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuICAgIHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlciA9IG9wdGlvbnMuZ3JpZERpc3BsYXlzTWFuYWdlcjtcclxuICAgIHRoaXMuZ3JpZFZpZXdzTWFuYWdlciA9IG9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlcjtcclxuICAgIHRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyID0gb3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXI7XHJcbiAgICB0aGlzLmltcG9ydEZpbGVPcHRpb25zID0gb3B0aW9ucy5pbXBvcnRGaWxlT3B0aW9ucztcclxuXHJcbiAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIub25EaXNwbGFpc0xvYWRlZCA9IChkaXNwbGF5cykgPT4ge1xyXG4gICAgICBjb25zdCBkYXRhU291cmNlID0gbmV3IERldkV4cHJlc3MuZGF0YS5BcnJheVN0b3JlKHtcclxuICAgICAgICBrZXk6ICdJZCcsXHJcbiAgICAgICAgZGF0YTogZGlzcGxheXNcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLmRpc3BsYXlzRHJvcGRvd25Cb3ggJiYgdGhpcy5kaXNwbGF5c0Ryb3Bkb3duQm94Lm9wdGlvbignZGF0YVNvdXJjZScsIGRhdGFTb3VyY2UpO1xyXG5cclxuICAgICAgdGhpcy5kYXRhR3JpZCAmJiB0aGlzLmRhdGFHcmlkLm9wdGlvbignZGF0YVNvdXJjZScsIGRhdGFTb3VyY2UpO1xyXG4gICAgICB0aGlzLmRhdGFHcmlkICYmIHRoaXMuZGF0YUdyaWQuZW5kQ3VzdG9tTG9hZGluZygpO1xyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIub25EaXNwbGF5Q2hhbmdlZCA9IChkaXNwbGF5KSA9PiB7XHJcbiAgICAgIHRoaXMuZGlzcGxheXNEcm9wZG93bkJveCAmJiB0aGlzLmRpc3BsYXlzRHJvcGRvd25Cb3gub3B0aW9uKCd2YWx1ZScsIGRpc3BsYXkgPyBkaXNwbGF5LklkIDogbnVsbCk7XHJcbiAgICAgIHRoaXMuY3VycmVudERpc3BsYXlUaXRsZSAmJiB0aGlzLmN1cnJlbnREaXNwbGF5VGl0bGUub3B0aW9uKCd2YWx1ZScsIGRpc3BsYXkgPyBkaXNwbGF5Lk5hbWUgOiBudWxsKTtcclxuICAgICAgdGhpcy5jdXJyZW50RGlzcGxheVRpdGxlICYmIHRoaXMuY3VycmVudERpc3BsYXlUaXRsZS5vcHRpb24oJ2Rpc2FibGVkJywgIWRpc3BsYXkpO1xyXG4gICAgICB0aGlzLnNhdmVBc0J1dHRvbiAmJiB0aGlzLnNhdmVBc0J1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgIWRpc3BsYXkpO1xyXG4gICAgICB0aGlzLnNhdmVCdXR0b24gJiYgdGhpcy5zYXZlQnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCAhZGlzcGxheSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5kYXRhR3JpZCkge1xyXG4gICAgICAgIGRpc3BsYXlcclxuICAgICAgICAgID8gdGhpcy5kYXRhR3JpZC5zZWxlY3RSb3dzKFtkaXNwbGF5LklkXSwgZmFsc2UpXHJcbiAgICAgICAgICA6IHRoaXMuZGF0YUdyaWQuZGVzZWxlY3RBbGwoKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmludGVncmF0ZVRvR3JpZCh0aGlzLm9wdGlvbnMub3duZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbnRlZ3JhdGVUb0dyaWQoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XHJcbiAgICBjb25zdCBjdXJyZW50VG9vbGJhclByZXBhcmluZyA9IGdyaWQub3B0aW9uKCdvblRvb2xiYXJQcmVwYXJpbmcnKTtcclxuXHJcbiAgICBncmlkLm9wdGlvbignb25Ub29sYmFyUHJlcGFyaW5nJywgKGU6IGFueSkgPT4ge1xyXG4gICAgICBjdXJyZW50VG9vbGJhclByZXBhcmluZyAmJiBjdXJyZW50VG9vbGJhclByZXBhcmluZyhlKTtcclxuICAgICAgdGhpcy5vbkdyaWRUb29sYmFyUHJlcGFyaW5nKGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG9uR3JpZFRvb2xiYXJQcmVwYXJpbmc6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnNbJ29uVG9vbGJhclByZXBhcmluZyddID0gKGUpID0+IHtcclxuICAgIGNvbnN0IHRvb2xiYXJJdGVtcyA9IGUudG9vbGJhck9wdGlvbnMgJiYgZS50b29sYmFyT3B0aW9ucy5pdGVtcztcclxuICAgIGlmICghdG9vbGJhckl0ZW1zKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBuZXdJdGVtcyA9IFt0aGlzLmRpc3BsYXlzVG9vbGJhckl0ZW1dO1xyXG5cclxuICAgIGlmICh0aGlzLmltcG9ydEZpbGVPcHRpb25zICYmIHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMubW9kZSAhPT0gQ2RtSW1wb3J0RmlsZU1vZGUuTm9uZSkge1xyXG4gICAgICBuZXdJdGVtcy5wdXNoKHRoaXMuaW1wb3J0RmlsZVRvb2xiYXJJdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICB0b29sYmFySXRlbXMuc3BsaWNlKDEsIDAsIC4uLm5ld0l0ZW1zKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRGF0YUdyaWQoZHJvcGRvd25Cb3hPd25lcjogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94KTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JylcclxuICAgICAgLmR4RGF0YUdyaWQoe1xyXG4gICAgICAgIGRhdGFTb3VyY2U6IGRyb3Bkb3duQm94T3duZXIuZ2V0RGF0YVNvdXJjZSgpLFxyXG4gICAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IGZhbHNlLFxyXG4gICAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICAgIGFsbG93QWRkaW5nOiBmYWxzZSxcclxuICAgICAgICAgIGFsbG93VXBkYXRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgYWxsb3dEZWxldGluZzogdGhpcy5vcHRpb25zLmVkaXRNb2RlLFxyXG4gICAgICAgICAgbW9kZTogJ3JvdycsXHJcbiAgICAgICAgICB1c2VJY29uczogdHJ1ZSxcclxuICAgICAgICAgIHRleHRzOiB7XHJcbiAgICAgICAgICAgIGNvbmZpcm1EZWxldGVNZXNzYWdlOiAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGRpc3BsYXk/J1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbG9hZFBhbmVsOiB7XHJcbiAgICAgICAgICBzaGFkaW5nOiB0cnVlXHJcbiAgICAgICAgfSxcclxuICAgICAgICBhbGxvd0NvbHVtblJlc2l6aW5nOiB0cnVlLFxyXG4gICAgICAgIGNvbHVtbkF1dG9XaWR0aDogdHJ1ZSxcclxuICAgICAgICB3b3JkV3JhcEVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgY29sdW1uczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdOYW1lJyxcclxuICAgICAgICAgICAgY2FwdGlvbjogJ0Rpc3BsYXknXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdGaWx0ZXJJZCcsXHJcbiAgICAgICAgICAgIGNhcHRpb246ICdEYXRhIFNldCcsXHJcbiAgICAgICAgICAgIGxvb2t1cDoge1xyXG4gICAgICAgICAgICAgIHZhbHVlRXhwcjogJ2lkJyxcclxuICAgICAgICAgICAgICBkaXNwbGF5RXhwcjogJ25hbWUnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ1ZpZXdJZCcsXHJcbiAgICAgICAgICAgIGNhcHRpb246ICdWaWV3JyxcclxuICAgICAgICAgICAgbG9va3VwOiB7XHJcbiAgICAgICAgICAgICAgdmFsdWVFeHByOiAnaWQnLFxyXG4gICAgICAgICAgICAgIGRpc3BsYXlFeHByOiAnbmFtZSdcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIF0sXHJcbiAgICAgICAga2V5Ym9hcmROYXZpZ2F0aW9uOiB7XHJcbiAgICAgICAgICBlZGl0T25LZXlQcmVzczogZmFsc2UsXHJcbiAgICAgICAgICBlbmFibGVkOiBmYWxzZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2hvd0NvbHVtbkhlYWRlcnM6IHRydWUsXHJcbiAgICAgICAgaG92ZXJTdGF0ZUVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgZm9jdXNlZFJvd0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIHNob3dCb3JkZXJzOiBmYWxzZSxcclxuICAgICAgICBoZWlnaHQ6IHRoaXMub3B0aW9ucy5lZGl0TW9kZSA/ICdjYWxjKDEwMCUgLSA1MXB4KScgOiAnMTAwJScsXHJcbiAgICAgICAgc2Nyb2xsaW5nOiB7IG1vZGU6ICdzdGFuZGFyZCcgfSxcclxuICAgICAgICBwYWdpbmc6IHsgZW5hYmxlZDogZmFsc2UgfSxcclxuICAgICAgICBub0RhdGFUZXh0OiAnTm8gZGlzcGxheXMnLFxyXG4gICAgICAgIG9uSW5pdGlhbGl6ZWQ6IGFzeW5jIChlKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBmaWx0ZXJzID0gYXdhaXQgdGhpcy5ncmlkRmlsdGVyc01hbmFnZXIuZ2V0RmlsdGVycygpO1xyXG4gICAgICAgICAgY29uc3Qgdmlld3MgPSBhd2FpdCB0aGlzLmdyaWRWaWV3c01hbmFnZXIuZ2V0Vmlld3MoKTtcclxuXHJcbiAgICAgICAgICBlLmNvbXBvbmVudC5jb2x1bW5PcHRpb24oJ0ZpbHRlcklkJywgJ2xvb2t1cC5kYXRhU291cmNlJywgZmlsdGVycyk7XHJcbiAgICAgICAgICBlLmNvbXBvbmVudC5jb2x1bW5PcHRpb24oJ1ZpZXdJZCcsICdsb29rdXAuZGF0YVNvdXJjZScsIHZpZXdzKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uQ2VsbENsaWNrOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGUucm93VHlwZSAhPT0gJ2RhdGEnKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBkcm9wZG93bkJveE93bmVyLm9wdGlvbigndmFsdWUnLCBlLmRhdGEuSWQpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25Sb3dSZW1vdmluZzogYXN5bmMgKGUpID0+IHtcclxuICAgICAgICAgIHRoaXMuZGF0YUdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdMb2FkaW5nJyk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuZGVsZXRlRGlzcGxheShlLmtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRGlzcGxheXNUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW0ge1xyXG4gICAgY29uc3QgYmFzaWNPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4U2VsZWN0Qm94LlByb3BlcnRpZXMgfCBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3guUHJvcGVydGllcyA9IHtcclxuICAgICAgdmFsdWVFeHByOiAnSWQnLFxyXG4gICAgICBkaXNwbGF5RXhwcjogJ05hbWUnLFxyXG4gICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICAgIHBsYWNlaG9sZGVyOiAnTm9uZScsXHJcbiAgICAgIHdpZHRoOiAyMDAsXHJcbiAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5c0Ryb3Bkb3duQm94ID0gZS5jb21wb25lbnQ7XHJcbiAgICAgICAgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmdldERpc3BsYXlzKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRpc3BsYXkgPSB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuY3VycmVudERpc3BsYXk7XHJcblxyXG4gICAgICAgIGNvbnN0IGZpbHRlckNoYW5nZWQgPSBkaXNwbGF5ICYmIGRpc3BsYXkuRmlsdGVySWQgIT09IHRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZDtcclxuICAgICAgICBjb25zdCB2aWV3Q2hhbmdlZCA9IGRpc3BsYXkgJiYgZGlzcGxheS5WaWV3SWQgIT09IHRoaXMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkO1xyXG5cclxuICAgICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCAoZmlsdGVyQ2hhbmdlZCB8fCB2aWV3Q2hhbmdlZFxyXG4gICAgICAgICAgPyB0aGlzLmNvbmZpcm1DaGFuZ2VzTG9zcygpXHJcbiAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZSh0cnVlKSk7XHJcblxyXG4gICAgICAgIGlmIChjb25maXJtZWQpIHtcclxuICAgICAgICAgIHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci5jdXJyZW50RGlzcGxheUlkID0gZS52YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgZHJvcERvd25Cb3hPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3hPcHRpb25zID0ge1xyXG4gICAgICBlbGVtZW50QXR0cjoge2NsYXNzOiAnaXN6b2xlYS1tZCd9LFxyXG4gICAgICBkcm9wRG93bk9wdGlvbnM6IHtcclxuICAgICAgICB3aWR0aDogODAwXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbnRlbnRUZW1wbGF0ZTogIXRoaXMub3B0aW9ucy5lZGl0TW9kZSA/IHZvaWQgMCA6IChlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhR3JpZCA9IHRoaXMuY3JlYXRlRGF0YUdyaWQoZS5jb21wb25lbnQpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudERpc3BsYXlUaXRsZSA9IHRoaXMuY3JlYXRlQ3VycmVudERpc3BsYXlUaXRsZShlLmNvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5zYXZlQnV0dG9uID0gdGhpcy5jcmVhdGVTYXZlVmlld0J1dHRvbigpO1xyXG4gICAgICAgIHRoaXMuc2F2ZUFzQnV0dG9uID0gdGhpcy5jcmVhdGVTYXZlVmlld0FzQnV0dG9uKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udGVudEhlYWRlciA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgLmFkZENsYXNzKCdhcHMtZGlzcGxheXNfX2hlYWRlcicpXHJcbiAgICAgICAgICAuYXBwZW5kKHRoaXMuY3VycmVudERpc3BsYXlUaXRsZS5lbGVtZW50KCkpXHJcbiAgICAgICAgICAuYXBwZW5kKHRoaXMuc2F2ZUJ1dHRvbi5lbGVtZW50KCkpXHJcbiAgICAgICAgICAuYXBwZW5kKHRoaXMuc2F2ZUFzQnV0dG9uLmVsZW1lbnQoKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udGVudCA9ICQoJzxkaXYgLz4nKS5oZWlnaHQoJzEwMCUnKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5lZGl0TW9kZSkge1xyXG4gICAgICAgICAgZHJvcGRvd25Db250ZW50LmFwcGVuZChkcm9wZG93bkNvbnRlbnRIZWFkZXIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZHJvcGRvd25Db250ZW50LmFwcGVuZCh0aGlzLmRhdGFHcmlkLmVsZW1lbnQoKSk7XHJcblxyXG4gICAgICAgIHJldHVybiBkcm9wZG93bkNvbnRlbnQ7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uT3BlbmVkOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zYXZlQXNCdXR0b24gJiYgdGhpcy5zYXZlQXNCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsICF0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQpO1xyXG4gICAgICAgIHRoaXMuc2F2ZUJ1dHRvbiAmJiB0aGlzLnNhdmVCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsICF0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuY3VycmVudERpc3BsYXkpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHdpZGdldDogdGhpcy5vcHRpb25zLmVkaXRNb2RlID8gKCdkeERyb3BEb3duQm94JyBhcyBhbnkpIDogJ2R4U2VsZWN0Qm94JyxcclxuICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgIHRleHQ6ICdEaXNwbGF5cycsXHJcbiAgICAgIGNzc0NsYXNzOiAnYXBzLWRpc3BsYXlzX190b29sYmFyLWl0ZW0nLFxyXG4gICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMuZWRpdE1vZGUgPyAkLmV4dGVuZChiYXNpY09wdGlvbnMsIGRyb3BEb3duQm94T3B0aW9ucykgOiBiYXNpY09wdGlvbnNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUltcG9ydEZpbGVUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIGljb246ICd1cGxvYWQnLFxyXG4gICAgICAgIGhpbnQ6ICdJbXBvcnQgZmlsZScsXHJcbiAgICAgICAgaGVpZ2h0OiAzMCxcclxuICAgICAgICBzdHlsaW5nTW9kZTogJ3RleHQnLFxyXG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLmZpbGVJbXBvcnRlcikge1xyXG4gICAgICAgICAgICB0aGlzLmZpbGVJbXBvcnRlci5kaXNwb3NlKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5maWxlSW1wb3J0ZXIgPSBuZXcgRmlsZUltcG9ydGVyKHtcclxuICAgICAgICAgICAgJGNvbnRhaW5lcjogdGhpcy5vcHRpb25zLm93bmVyLmVsZW1lbnQoKS5wYXJlbnQoKSxcclxuICAgICAgICAgICAgdGl0bGU6ICdJbXBvcnQgRmlsZSB0byBDRE0nLFxyXG4gICAgICAgICAgICBjcmVhdGVUYWJsZVVybDogdGhpcy5pbXBvcnRGaWxlT3B0aW9ucy5jcmVhdGVUYWJsZVVybCxcclxuICAgICAgICAgICAgYWRkUm93c1VybDogdGhpcy5pbXBvcnRGaWxlT3B0aW9ucy5hZGRSb3dzVXJsLFxyXG4gICAgICAgICAgICBmaWxlVXBsb2FkVXJsOiB0aGlzLmltcG9ydEZpbGVPcHRpb25zLmZpbGVVcGxvYWRVcmwsXHJcbiAgICAgICAgICAgIHByZWRlZmluZWRJbXBvcnRGaWxlTW9kZTogdGhpcy5nZXRQcmVkZWZpbmVkSW1wb3J0RmlsZU1vZGUodGhpcy5pbXBvcnRGaWxlT3B0aW9ucy5tb2RlKSxcclxuICAgICAgICAgICAgcHJlZGVmaW5lZFRhYmxlOiB0aGlzLmltcG9ydEZpbGVPcHRpb25zLnByZWRlZmluZWRUYWJsZSxcclxuICAgICAgICAgICAgY3JlYXRlVGFibGVCdXR0b25UZXh0OiAnUmVwbGFjZSBBbGwgUm93cycsXHJcbiAgICAgICAgICAgIGNyZWF0ZVRhYmxlTW9kZVRleHQ6ICdSZXBsYWNlIFJvd3MnLFxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgdGhpcy5maWxlSW1wb3J0ZXIub24oRmlsZUltcG9ydGVyLlRBQkxFX1VQREFURURfRVZFTlQsICgpID0+IHRoaXMub3B0aW9ucy5vd25lci5yZWZyZXNoKCkpO1xyXG4gICAgICAgICAgdGhpcy5maWxlSW1wb3J0ZXIuc2hvdygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25Db250ZW50UmVhZHk6IChlKSA9PiB7XHJcbiAgICAgICAgICBlLmVsZW1lbnQuZmluZCgnLmR4LWJ1dHRvbi1jb250ZW50JykuY3NzKHtcclxuICAgICAgICAgICAgcGFkZGluZ1RvcDogNSxcclxuICAgICAgICAgICAgcGFkZGluZ0JvdHRvbTogNVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRQcmVkZWZpbmVkSW1wb3J0RmlsZU1vZGUobW9kZTogQ2RtSW1wb3J0RmlsZU1vZGUpOiBJbXBvcnRGaWxlTW9kZSB7XHJcbiAgICBzd2l0Y2ggKG1vZGUpIHtcclxuICAgICAgY2FzZSBDZG1JbXBvcnRGaWxlTW9kZS5BZGROZXdSb3dzOlxyXG4gICAgICAgIHJldHVybiBJbXBvcnRGaWxlTW9kZS5BZGROZXdSb3dzO1xyXG5cclxuICAgICAgY2FzZSBDZG1JbXBvcnRGaWxlTW9kZS5SZXBsYWNlQWxsUm93czpcclxuICAgICAgICByZXR1cm4gSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGU7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgbW9kZScpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVDdXJyZW50RGlzcGxheVRpdGxlKGRyb3Bkb3duQm94T3duZXI6IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveCk6IERldkV4cHJlc3MudWkuZHhUZXh0Qm94IHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JylcclxuICAgICAgLmFkZENsYXNzKCdhcHMtZGlzcGxheXNfX2N1cnJlbnQtZGlzcGxheSBpc3pvbGVhLW1kJylcclxuICAgICAgLmR4VGV4dEJveCh7XHJcbiAgICAgICAgdmFsdWU6IGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCd0ZXh0JykgfHwgZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3BsYWNlaG9sZGVyJyksXHJcbiAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuY3VycmVudERpc3BsYXksXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keFRleHRCb3goJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVNhdmVWaWV3QnV0dG9uKCk6IERldkV4cHJlc3MudWkuZHhCdXR0b24ge1xyXG4gICAgcmV0dXJuICQoJzxidXR0b24gLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy1kaXNwbGF5c19fc2F2ZS1kaXNwbGF5IGlzem9sZWEtbWQnKVxyXG4gICAgICAuZHhCdXR0b24oe1xyXG4gICAgICAgIHRleHQ6ICdTYXZlJyxcclxuICAgICAgICB0eXBlOiAnbm9ybWFsJyxcclxuICAgICAgICBkaXNhYmxlZDogIXRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci5jdXJyZW50RGlzcGxheSxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFHcmlkLmJlZ2luQ3VzdG9tTG9hZGluZygnTG9hZGluZycpO1xyXG5cclxuICAgICAgICAgIHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci51cGRhdGVDdXJyZW50RGlzcGxheShcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50RGlzcGxheVRpdGxlLm9wdGlvbigndmFsdWUnKSxcclxuICAgICAgICAgICAgdGhpcy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkLFxyXG4gICAgICAgICAgICB0aGlzLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXdJZFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGljb246ICdzYXZlJyxcclxuICAgICAgICB3aWR0aDogMTI1XHJcbiAgICAgIH0pXHJcbiAgICAgIC5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2F2ZVZpZXdBc0J1dHRvbigpOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHtcclxuICAgIHJldHVybiAkKCc8YnV0dG9uIC8+JylcclxuICAgICAgLmFkZENsYXNzKCdhcHMtZGlzcGxheV9fc2F2ZS1kaXNwbGF5LWFzIGlzem9sZWEtbWQnKVxyXG4gICAgICAuZHhCdXR0b24oe1xyXG4gICAgICAgIHRleHQ6ICdTYXZlIEFzJyxcclxuICAgICAgICB0eXBlOiAnbm9ybWFsJyxcclxuICAgICAgICBkaXNhYmxlZDogIXRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZCxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiAoXHJcbiAgICAgICAgICB0aGlzLmNyZWF0ZVNhdmVBc0RpYWxvZygpXHJcbiAgICAgICAgKSxcclxuICAgICAgICBpY29uOiAnc2F2ZScsXHJcbiAgICAgICAgd2lkdGg6IDE2MFxyXG4gICAgICB9KVxyXG4gICAgICAuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVNhdmVBc0RpYWxvZygpIHtcclxuICAgIGNvbnN0ICRwb3B1cENvbnRlbnQgPSAkKCc8ZGl2IC8+Jyk7XHJcblxyXG4gICAgY29uc3QgZGlhbG9nQ29udGVudEVsZW1lbnQgPSAkKCc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTo4cHg7XCIgLz4nKS5keFRleHRCb3goe1xyXG4gICAgICBwbGFjZWhvbGRlcjogJ0Rpc3BsYXkgTmFtZScsXHJcbiAgICAgIHNob3dDbGVhckJ1dHRvbjogdHJ1ZSxcclxuICAgIH0pLmR4VmFsaWRhdG9yKHtcclxuICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgeyB0eXBlOiAncmVxdWlyZWQnIH0sXHJcbiAgICAgIF1cclxuICAgIH0pO1xyXG4gICAgY29uc3QgbmFtZVRleHRCb3ggPSBkaWFsb2dDb250ZW50RWxlbWVudC5keFRleHRCb3goJ2luc3RhbmNlJyk7XHJcbiAgICBjb25zdCB2YWxpZGF0b3IgPSBkaWFsb2dDb250ZW50RWxlbWVudC5keFZhbGlkYXRvcignaW5zdGFuY2UnKTtcclxuXHJcbiAgICBuYW1lVGV4dEJveC5lbGVtZW50KCkuYXBwZW5kVG8oJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgcmV0dXJuIGNyZWF0ZURpYWxvZyhcclxuICAgICAge1xyXG4gICAgICAgIHRpdGxlOiAnQ3JlYXRlIE5ldyBEaXNwbGF5JyxcclxuICAgICAgICBoZWlnaHQ6ICdhdXRvJyxcclxuICAgICAgICB3aWR0aDogJzEwMCUnLFxyXG4gICAgICAgIG1heFdpZHRoOiAnMzAwcHgnLFxyXG4gICAgICB9LFxyXG4gICAgICAkcG9wdXBDb250ZW50LFxyXG4gICAgICB7XHJcbiAgICAgICAgdGV4dDogJ09rJyxcclxuICAgICAgICBvbkNsaWNrOiBhc3luYyAoY2xvc2VQb3B1cCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCF2YWxpZGF0b3IudmFsaWRhdGUoKS5pc1ZhbGlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmRhdGFHcmlkLmJlZ2luQ3VzdG9tTG9hZGluZygnTG9hZGluZycpO1xyXG5cclxuICAgICAgICAgIHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci5jcmVhdGVOZXdEaXNwbGF5KFxyXG4gICAgICAgICAgICBuYW1lVGV4dEJveC5vcHRpb24oJ3ZhbHVlJyksXHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZCxcclxuICAgICAgICAgICAgdGhpcy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWRcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgY2xvc2VQb3B1cCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB0ZXh0OiAnQ2FuY2VsJyxcclxuICAgICAgICBvbkNsaWNrOiAoY2xvc2VQb3B1cCkgPT4gY2xvc2VQb3B1cCgpXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjb25maXJtQ2hhbmdlc0xvc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gRGV2RXhwcmVzcy51aS5kaWFsb2cuY29uZmlybShcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgJ1lvdSBoYXZlIHVuc2F2ZWQgY2hhbmdlcyB0aGF0IHdpbGwgYmUgbG9zdCBpZiB5b3UgY2xvc2UgdGhpcyBwb3B1cC4gRG8geW91IHdhbnQgdG8gY2xvc2UgdGhlIHBvcHVwIGFuZCBub3Qgc2F2ZSBjaGFuZ2VzPycsXHJcbiAgICAgICdVbnNhdmVkIGNoYW5nZXMnXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgZGlzcGxheXNUb29sYmFySXRlbSgpIHtcclxuICAgIGlmICghdGhpcy5fZGlzcGxheXNUb29sYmFySXRlbSkge1xyXG4gICAgICB0aGlzLl9kaXNwbGF5c1Rvb2xiYXJJdGVtID0gdGhpcy5jcmVhdGVEaXNwbGF5c1Rvb2xiYXJJdGVtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlzVG9vbGJhckl0ZW07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBpbXBvcnRGaWxlVG9vbGJhckl0ZW0oKSB7XHJcbiAgICBpZiAoIXRoaXMuX2ltcG9ydEZpbGVUb29sYmFySXRlbSkge1xyXG4gICAgICB0aGlzLl9pbXBvcnRGaWxlVG9vbGJhckl0ZW0gPSB0aGlzLmNyZWF0ZUltcG9ydEZpbGVUb29sYmFySXRlbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9pbXBvcnRGaWxlVG9vbGJhckl0ZW07XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24gZnJvbSAnLi4vLi4vLi4vRGF0YS9Mb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbic7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zIHtcclxuICBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIGluc2VydERhdGFVcmw6IHN0cmluZztcclxuICB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbiAgZGVsZXRlRGF0YVVybDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDb250cm9sRGlzcGxheSB7XHJcbiAgcmVhZG9ubHkgSWQ6IG51bWJlcjtcclxuICByZWFkb25seSBOYW1lOiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgRmlsdGVySWQ6IG51bWJlcjtcclxuICByZWFkb25seSBWaWV3SWQ6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEdyaWREaXNwbGF5c01hbmFnZXIge1xyXG4gIHByaXZhdGUgZGlzcGxheXM6IElDb250cm9sRGlzcGxheVtdIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRIYW5kbGVyczoge1xyXG4gICAgY2hhbmdlZDogQXJyYXk8KGRpc3BsYXk6IElDb250cm9sRGlzcGxheSkgPT4gdm9pZD4sXHJcbiAgICBsb2FkZWQ6IEFycmF5PChkaXNwbGFpczogSUNvbnRyb2xEaXNwbGF5W10pID0+IHZvaWQ+XHJcbiAgfTtcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcclxuICBwcml2YXRlIF9jdXJyZW50RGlzcGxheUlkOiBudW1iZXIgPSAwO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbnNlcnREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVEYXRhVXJsOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElHcmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9ucykge1xyXG4gICAgdGhpcy5sb2FkRGF0YVVybCA9IG9wdGlvbnMubG9hZERhdGFVcmw7XHJcbiAgICB0aGlzLmluc2VydERhdGFVcmwgPSBvcHRpb25zLmluc2VydERhdGFVcmw7XHJcbiAgICB0aGlzLnVwZGF0ZURhdGFVcmwgPSBvcHRpb25zLnVwZGF0ZURhdGFVcmw7XHJcbiAgICB0aGlzLmRlbGV0ZURhdGFVcmwgPSBvcHRpb25zLmRlbGV0ZURhdGFVcmw7XHJcblxyXG4gICAgdGhpcy5ldmVudEhhbmRsZXJzID0ge1xyXG4gICAgICBjaGFuZ2VkOiBbXSxcclxuICAgICAgbG9hZGVkOiBbXVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBsb2FkRGlzcGxheXMoKSB7XHJcbiAgICB0aGlzLmRpc3BsYXlzID0gYXdhaXQgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb248SUNvbnRyb2xEaXNwbGF5W10+KHRoaXMubG9hZERhdGFVcmwpO1xyXG4gICAgdGhpcy5vbkRpc3BsYWlzTG9hZGVkUHJpdmF0ZSgpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldERpc3BsYXlzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheXMgfHwgYXdhaXQgdGhpcy5sb2FkRGlzcGxheXMoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREaXNwbGF5QnlJZCA9IChpZDogbnVtYmVyKSA9PiB7XHJcbiAgICBpZiAoIWlkIHx8ICF0aGlzLmRpc3BsYXlzKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlzLmZpbmQoKHYpID0+IHYuSWQgPT09IGlkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVOZXdEaXNwbGF5KG5hbWU6IHN0cmluZywgZmlsdGVySWQ6IG51bWJlciwgdmlld0lkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG5ld1ZpZXdEdG8gPSB7XHJcbiAgICAgIElkOiAwLFxyXG4gICAgICBOYW1lOiBuYW1lLFxyXG4gICAgICBGaWx0ZXJJZDogZmlsdGVySWQsXHJcbiAgICAgIFZpZXdJZDogdmlld0lkXHJcbiAgICB9O1xyXG5cclxuICAgIGF3YWl0IHNlbmRSZXF1ZXN0KHRoaXMuaW5zZXJ0RGF0YVVybCwgJ1BPU1QnLCBuZXdWaWV3RHRvKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZERpc3BsYXlzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZGVsZXRlRGlzcGxheShpZDogbnVtYmVyKSB7XHJcbiAgICBhd2FpdCBzZW5kUmVxdWVzdCh0aGlzLmRlbGV0ZURhdGFVcmwsICdERUxFVEUnLCB7IGlkIH0pO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkRGlzcGxheXMoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVDdXJyZW50RGlzcGxheShuYW1lOiBzdHJpbmcsIGZpbHRlcklkOiBudW1iZXIsIHZpZXdJZDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gdGhpcy51cGRhdGVEaXNwbGF5KHRoaXMuY3VycmVudERpc3BsYXkuSWQsIG5hbWUsIGZpbHRlcklkLCB2aWV3SWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHVwZGF0ZURpc3BsYXkoaWQ6IG51bWJlciwgbmFtZTogc3RyaW5nLCBmaWx0ZXJJZDogbnVtYmVyLCB2aWV3SWQ6IG51bWJlcikge1xyXG4gICAgYXdhaXQgc2VuZFJlcXVlc3QodGhpcy51cGRhdGVEYXRhVXJsLCAnUFVUJywge1xyXG4gICAgICBpZCwgbmFtZSwgZmlsdGVySWQsIHZpZXdJZFxyXG4gICAgfSk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWREaXNwbGF5cygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkRpc3BsYXlDaGFuZ2VkUHJpdmF0ZSgpIHtcclxuICAgIHRoaXMuZXZlbnRIYW5kbGVycy5jaGFuZ2VkLmZvckVhY2goKGhhbmRsZXJzKSA9PiAoXHJcbiAgICAgIGhhbmRsZXJzKHRoaXMuY3VycmVudERpc3BsYXkpXHJcbiAgICApKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25EaXNwbGFpc0xvYWRlZFByaXZhdGUoKSB7XHJcbiAgICB0aGlzLmV2ZW50SGFuZGxlcnMubG9hZGVkLmZvckVhY2goKGhhbmRsZXJzKSA9PiAoXHJcbiAgICAgIGhhbmRsZXJzKHRoaXMuZGlzcGxheXMpXHJcbiAgICApKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudERpc3BsYXlJZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50RGlzcGxheUlkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBjdXJyZW50RGlzcGxheUlkKGlkOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2N1cnJlbnREaXNwbGF5SWQgPSBpZDtcclxuICAgIHRoaXMub25EaXNwbGF5Q2hhbmdlZFByaXZhdGUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudERpc3BsYXkoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXREaXNwbGF5QnlJZCh0aGlzLl9jdXJyZW50RGlzcGxheUlkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgb25EaXNwbGF5Q2hhbmdlZChoYW5kbGVyOiAoZGlzcGxheTogSUNvbnRyb2xEaXNwbGF5KSA9PiB2b2lkKSB7XHJcbiAgICB0aGlzLmV2ZW50SGFuZGxlcnMuY2hhbmdlZC5wdXNoKGhhbmRsZXIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBvbkRpc3BsYWlzTG9hZGVkKGhhbmRsZXI6IChkaXNwbGFpczogSUNvbnRyb2xEaXNwbGF5W10pID0+IHZvaWQpIHtcclxuICAgIHRoaXMuZXZlbnRIYW5kbGVycy5sb2FkZWQucHVzaChoYW5kbGVyKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IE11dGFibGUgfSBmcm9tICcuLi8uLi8uLi9Db21wb25lbnRzL0NvcmUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW5PcHRpb25zIHtcclxuICByZWFkb25seSBvd25lcjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG4gIHJlYWRvbmx5IGF1dG9JbnRlZ3JhdGlvbjogYm9vbGVhbjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbkRlZmF1bHRPcHRpb25zIHtcclxuICByZWFkb25seSBhdXRvSW50ZWdyYXRpb246IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIE11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luT3B0aW9ucyA9XHJcbiAgTXV0YWJsZTxPbWl0PElNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbk9wdGlvbnMsIGtleW9mIElNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbkRlZmF1bHRPcHRpb25zPj4gJlxyXG4gIE11dGFibGU8UGFydGlhbDxJTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW5EZWZhdWx0T3B0aW9ucz4+O1xyXG5cclxuZXhwb3J0IGNsYXNzIE11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luIHtcclxuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogSU11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luT3B0aW9ucztcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW5PcHRpb25zKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSB7XHJcbiAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICAgIGF1dG9JbnRlZ3JhdGlvbjogKG9wdGlvbnMuYXV0b0ludGVncmF0aW9uICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gIT09IG51bGwpXHJcbiAgICAgICAgPyBvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiA6IHRydWVcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5vcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAmJiB0aGlzLmludGVncmF0ZVRvR3JpZCh0aGlzLm9wdGlvbnMub3duZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbnRlZ3JhdGVUb0dyaWQoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XHJcbiAgICBncmlkLm9wdGlvbignc2VsZWN0aW9uJywge1xyXG4gICAgICBtb2RlOiAnbXVsdGlwbGUnXHJcbiAgICB9IGFzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnNbJ3NlbGVjdGlvbiddKTtcclxuICAgIGdyaWQub24oJ2VkaXRvclByZXBhcmluZycsIHRoaXMub25HcmlkRWRpdG9yUHJlcGFyaW5nKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25HcmlkRWRpdG9yUHJlcGFyaW5nOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydvbkVkaXRvclByZXBhcmluZyddID0gKGUpID0+IHtcclxuICAgIGlmICghZS5jb21wb25lbnQgfHwgIWUuZWRpdG9yT3B0aW9ucyB8fCBlLnBhcmVudFR5cGUgIT09ICdkYXRhUm93JyB8fCAhZS5kYXRhRmllbGQgfHwgIWUucm93IHx8ICFlLnJvdy5rZXkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRhdGFGaWVsZCA9IGUuZGF0YUZpZWxkO1xyXG4gICAgY29uc3QgZWRpdG9yS2V5ID0gZS5yb3cua2V5O1xyXG4gICAgY29uc3QgZGVmYXVsdExpc3RlbmVyID0gZS5lZGl0b3JPcHRpb25zLm9uVmFsdWVDaGFuZ2VkO1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1zaGFkb3dlZC12YXJpYWJsZVxyXG4gICAgZS5lZGl0b3JPcHRpb25zLm9uVmFsdWVDaGFuZ2VkID0gKGV2ZW50OiB7IHZhbHVlOiBhbnkgfSkgPT4ge1xyXG4gICAgICBkZWZhdWx0TGlzdGVuZXIoZXZlbnQpO1xyXG5cclxuICAgICAgdGhpcy51cGRhdGVNdWx0aXBsZVJvd3MoZGF0YUZpZWxkLCBlZGl0b3JLZXksIGV2ZW50LnZhbHVlKTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZU11bHRpcGxlUm93czxUPihkYXRhRmllbGQ6IHN0cmluZywgZWRpdG9yS2V5OiBzdHJpbmcsIHZhbHVlOiBUKSB7XHJcbiAgICBjb25zdCBzZWxlY3RlZFJvd0tleXM6IHN0cmluZ1tdID0gYXdhaXQgdGhpcy5vcHRpb25zLm93bmVyLmdldFNlbGVjdGVkUm93S2V5cygpO1xyXG4gICAgaWYgKCFzZWxlY3RlZFJvd0tleXMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBlZGl0b3JLZXlTZWxlY3RlZEluZGV4ID0gc2VsZWN0ZWRSb3dLZXlzLmZpbmRJbmRleCgoaykgPT4gayA9PT0gZWRpdG9yS2V5KTtcclxuICAgIGlmIChlZGl0b3JLZXlTZWxlY3RlZEluZGV4IDwgMCB8fCBzZWxlY3RlZFJvd0tleXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RlZFJvd0tleXMuc3BsaWNlKGVkaXRvcktleVNlbGVjdGVkSW5kZXgsIDEpO1xyXG4gICAgc2VsZWN0ZWRSb3dLZXlzLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICB0aGlzLm9wdGlvbnMub3duZXIuY2VsbFZhbHVlKHRoaXMub3B0aW9ucy5vd25lci5nZXRSb3dJbmRleEJ5S2V5KGtleSksIGRhdGFGaWVsZCwgdmFsdWUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBHcmlkVmlld3NNYW5hZ2VyIH0gZnJvbSAnLi9HcmlkVmlld3NNYW5hZ2VyJztcclxuaW1wb3J0IHsgTXV0YWJsZSB9IGZyb20gJy4uLy4uLy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uIGZyb20gJy4uLy4uLy4uL0RhdGEvTG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24nO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3Mge1xyXG4gIHJlYWRvbmx5IGRlZmF1bHRGaWx0ZXJJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIHJlYWRvbmx5IGRlZmF1bHRWaWV3SWQ6IG51bWJlcjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc0R0byB7XHJcbiAgRGVmYXVsdEZpbHRlcklkOiBudW1iZXIgfCB1bmRlZmluZWQ7XHJcbiAgRGVmYXVsdFZpZXdJZDogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJPcHRpb25zIHtcclxuICByZWFkb25seSB1c2VySWQ6IHN0cmluZztcclxuICByZWFkb25seSBsb2FkZWRVc2VyU2V0dGluZ3M/OiBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M7XHJcbn1cclxuXHJcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tZW1wdHktaW50ZXJmYWNlXHJcbmludGVyZmFjZSBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyRGVmYXVsdE9wdGlvbnMge1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBBUFNDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJPcHRpb25zID1cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIE11dGFibGU8T21pdDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucywga2V5b2YgSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckRlZmF1bHRPcHRpb25zPj4gJlxyXG4gIE11dGFibGU8UGFydGlhbDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyRGVmYXVsdE9wdGlvbnM+PjtcclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIge1xyXG4gIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucztcclxuXHJcbiAgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRVc2VyU2V0dGluZ3M6IElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncyA9IHtcclxuICAgIGRlZmF1bHRGaWx0ZXJJZDogdW5kZWZpbmVkLFxyXG4gICAgZGVmYXVsdFZpZXdJZDogR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkXHJcbiAgfTtcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcclxuICBwcm90ZWN0ZWQgX2xhdGVzdExvYWRlZFVzZXJTZXR0aW5nczogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgaXNMYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3NFeHBpcmVkOiBib29sZWFuID0gdHJ1ZTtcclxuICBwcml2YXRlIGF1dG9SZXNldHRpbmdDYWNoZVRpbWVySWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogQVBTQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucykge1xyXG4gICAgdGhpcy5vcHRpb25zID0ge1xyXG4gICAgICAuLi5vcHRpb25zLFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmxvYWRlZFVzZXJTZXR0aW5ncykge1xyXG4gICAgICB0aGlzLmxhdGVzdExvYWRlZFVzZXJTZXR0aW5ncyA9IHRoaXMub3B0aW9ucy5sb2FkZWRVc2VyU2V0dGluZ3M7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdGFydEF1dG9DYWNoZVJlc2V0dGluZ1RpbWVyKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGxhdGVzdExvYWRlZFVzZXJTZXR0aW5ncygpIHtcclxuICAgIHJldHVybiB0aGlzLl9sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGxhdGVzdExvYWRlZFVzZXJTZXR0aW5ncyh2YWx1ZTogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzKSB7XHJcbiAgICB0aGlzLl9sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3MgPSB2YWx1ZTtcclxuICAgIHRoaXMuaXNMYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3NFeHBpcmVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0VXNlclNldHRpbmdzKCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPiB7XHJcbiAgICBpZiAoIXRoaXMuaXNMYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3NFeHBpcmVkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmxhdGVzdExvYWRlZFVzZXJTZXR0aW5ncztcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmxhdGVzdExvYWRlZFVzZXJTZXR0aW5ncyA9IGF3YWl0IHRoaXMubG9hZFVzZXJTZXR0aW5ncygpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmxhdGVzdExvYWRlZFVzZXJTZXR0aW5ncztcclxuICB9XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgcHVibGljIGFzeW5jIHVwZGF0ZVVzZXJTZXR0aW5ncyh1cGRhdGVzOiBQYXJ0aWFsPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4pOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3MgPSBhd2FpdCB0aGlzLnVwZGF0ZVVzZXJTZXR0aW5nc0ludGVybmFsKHVwZGF0ZXMpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmxhdGVzdExvYWRlZFVzZXJTZXR0aW5ncztcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBsb2FkVXNlclNldHRpbmdzKCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPjtcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCB1cGRhdGVVc2VyU2V0dGluZ3NJbnRlcm5hbCh1cGRhdGVzOiBQYXJ0aWFsPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4pOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz47XHJcblxyXG4gIHByb3RlY3RlZCBzdGFydEF1dG9DYWNoZVJlc2V0dGluZ1RpbWVyKCkge1xyXG4gICAgdGhpcy5hdXRvUmVzZXR0aW5nQ2FjaGVUaW1lcklkID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgdGhpcy5pc0xhdGVzdExvYWRlZFVzZXJTZXR0aW5nc0V4cGlyZWQgPSB0cnVlO1xyXG4gICAgfSwgNTAwMCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc3RvcEF1dG9DYWNoZVJlc2V0dGluZ1RpbWVyKCkge1xyXG4gICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5hdXRvUmVzZXR0aW5nQ2FjaGVUaW1lcklkKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBMb2NhbENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlciBleHRlbmRzIENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlciB7XHJcbiAgcHJvdGVjdGVkIHN0YXRpYyByZWFkb25seSB1c2VyU2V0dGluZ3NTdG9yYWdlS2V5ID0gJ2Fwczpjb250cm9sLWRpc3BsYXk6dXNlci1zZXR0aW5ncyc7XHJcblxyXG4gIHByb3RlY3RlZCBhc3luYyBsb2FkVXNlclNldHRpbmdzKCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPiB7XHJcbiAgICBjb25zdCByYXdVc2VyU2V0dGluZ3MgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMb2NhbENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlci51c2VyU2V0dGluZ3NTdG9yYWdlS2V5KTtcclxuICAgIGlmICghcmF3VXNlclNldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRVc2VyU2V0dGluZ3M7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdXNlclNldHRpbmdzOiBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3MgPSBKU09OLnBhcnNlKHJhd1VzZXJTZXR0aW5ncyk7XHJcblxyXG4gICAgcmV0dXJuIHVzZXJTZXR0aW5ncztcclxuICB9XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgcHJvdGVjdGVkIGFzeW5jIHVwZGF0ZVVzZXJTZXR0aW5nc0ludGVybmFsKHVwZGF0ZXM6IFBhcnRpYWw8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPik6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPiB7XHJcbiAgICBjb25zdCBjdXJyZW50VXNlclNldHRpbmdzID0gYXdhaXQgdGhpcy5nZXRVc2VyU2V0dGluZ3MoKTtcclxuICAgIGNvbnN0IHVwZGF0ZWRVc2VyU2V0dGluZ3MgPSB7IC4uLmN1cnJlbnRVc2VyU2V0dGluZ3MsIC4uLnVwZGF0ZXMgfTtcclxuXHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMb2NhbENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlci51c2VyU2V0dGluZ3NTdG9yYWdlS2V5LFxyXG4gICAgICBKU09OLnN0cmluZ2lmeSh1cGRhdGVkVXNlclNldHRpbmdzKSk7XHJcblxyXG4gICAgcmV0dXJuIHVwZGF0ZWRVc2VyU2V0dGluZ3M7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9ucyB7XHJcbiAgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIElSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJPcHRpb25zID1cclxuICBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucyAmIElSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9ucztcclxuXHJcbmV4cG9ydCBjbGFzcyBSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIgZXh0ZW5kcyBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlck9wdGlvbnMpIHtcclxuICAgIHN1cGVyKG9wdGlvbnMpO1xyXG5cclxuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xyXG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFzeW5jIGxvYWRVc2VyU2V0dGluZ3MoKTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+IHtcclxuICAgIGNvbnN0IHVzZXJTZXR0aW5nc0R0byA9IGF3YWl0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc0R0bz4odGhpcy5sb2FkRGF0YVVybCk7XHJcblxyXG4gICAgcmV0dXJuIHVzZXJTZXR0aW5nc0R0byA/IHRoaXMubWFwQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG9Ub01vZGVsKHVzZXJTZXR0aW5nc0R0bykgOiB0aGlzLmRlZmF1bHRVc2VyU2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIHByb3RlY3RlZCBhc3luYyB1cGRhdGVVc2VyU2V0dGluZ3NJbnRlcm5hbCh1cGRhdGVzOiBQYXJ0aWFsPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4pOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4ge1xyXG4gICAgY29uc3QgY3VycmVudFVzZXJTZXR0aW5ncyA9IGF3YWl0IHRoaXMuZ2V0VXNlclNldHRpbmdzKCk7XHJcbiAgICBjb25zdCB1cGRhdGVkVXNlclNldHRpbmdzID0geyAuLi5jdXJyZW50VXNlclNldHRpbmdzLCAuLi51cGRhdGVzIH07XHJcblxyXG4gICAgY29uc3QgdXBkYXRlZFVzZXJTZXR0aW5nc0R0byA9IGF3YWl0IHNlbmRSZXF1ZXN0PElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc0R0bz4oXHJcbiAgICAgIHRoaXMudXBkYXRlRGF0YVVybCwgJ1BVVCcsXHJcbiAgICAgIHRoaXMubWFwQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNb2RlbFRvRHRvKHVwZGF0ZWRVc2VyU2V0dGluZ3MpXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiB0aGlzLm1hcENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzRHRvVG9Nb2RlbCh1cGRhdGVkVXNlclNldHRpbmdzRHRvKTtcclxuICB9XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgcHJpdmF0ZSBtYXBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01vZGVsVG9EdG8obW9kZWw6IFBhcnRpYWw8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPik6IFBhcnRpYWw8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzRHRvPiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBEZWZhdWx0RmlsdGVySWQ6IG1vZGVsLmRlZmF1bHRGaWx0ZXJJZCxcclxuICAgICAgRGVmYXVsdFZpZXdJZDogbW9kZWwuZGVmYXVsdFZpZXdJZFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgcHJpdmF0ZSBtYXBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc0R0b1RvTW9kZWwoZHRvOiBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG8pOiBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3Mge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZGVmYXVsdEZpbHRlcklkOiBkdG8uRGVmYXVsdEZpbHRlcklkLFxyXG4gICAgICBkZWZhdWx0Vmlld0lkOiBkdG8uRGVmYXVsdFZpZXdJZFxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBmdW5jdGlvbiBnZXRTdW1tYXJ5Q29sdW1uKGNvbHVtbnM6IEFycmF5PHsgdmlzaWJsZUluZGV4OiBudW1iZXIsIHZpc2libGU6IGJvb2xlYW4sIGRhdGFGaWVsZDogc3RyaW5nIH0+IHxcclxuICBSZWFkb25seUFycmF5PFBpY2s8RGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uLCAndmlzaWJsZUluZGV4JyB8ICd2aXNpYmxlJyB8ICdkYXRhRmllbGQnPj4pIHtcclxuICBsZXQgY29sdW1uRm9yU3VtbWFyeSA9ICcnO1xyXG5cclxuICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKChjKSA9PiBjLnZpc2libGUpO1xyXG4gIGNvbnN0IGNvbHVtbnNXaXRoSW5kZXggPSB2aXNpYmxlQ29sdW1ucy5maWx0ZXIoKGMpID0+IGMudmlzaWJsZUluZGV4ICE9PSBudWxsICYmIGMudmlzaWJsZUluZGV4ICE9PSB2b2lkIDApO1xyXG5cclxuICBpZiAoISFjb2x1bW5zV2l0aEluZGV4Lmxlbmd0aCkge1xyXG4gICAgY29sdW1uRm9yU3VtbWFyeSA9IGNvbHVtbnNXaXRoSW5kZXguc29ydCgoYSwgYikgPT4gYS52aXNpYmxlSW5kZXggLSBiLnZpc2libGVJbmRleClbMF0uZGF0YUZpZWxkO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb2x1bW5Gb3JTdW1tYXJ5ID0gKHZpc2libGVDb2x1bW5zWzBdICYmIHZpc2libGVDb2x1bW5zWzBdLmRhdGFGaWVsZCkgfHwgJyc7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gY29sdW1uRm9yU3VtbWFyeTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudCB9IGZyb20gJy4vR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudCB9IGZyb20gJy4vR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50JztcclxuaW1wb3J0IHsgR3JpZERpc3BsYXlzVG9vbGJhckNvbXBvbmVudCwgSUZpbGVJbXBvcnRlck9wdGlvbnMgfSBmcm9tICcuL0dyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQnO1xyXG5pbXBvcnQgeyBHcmlkRGlzcGxheXNNYW5hZ2VyLCBJR3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnMgfSBmcm9tICcuL0dyaWREaXNwbGF5c01hbmFnZXInO1xyXG5pbXBvcnQgeyBHcmlkVmlld3NNYW5hZ2VyLCBJR3JpZFZpZXdzTWFuYWdlck9wdGlvbnMgfSBmcm9tICcuL0dyaWRWaWV3c01hbmFnZXInO1xyXG5pbXBvcnQgeyBHcmlkRmlsdGVyc01hbmFnZXIsIElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zIH0gZnJvbSAnLi9HcmlkRmlsdGVyc01hbmFnZXInO1xyXG5pbXBvcnQgeyBNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbiB9IGZyb20gJy4vTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW4nO1xyXG5pbXBvcnQgeyBJUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnMsIFJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlciB9IGZyb20gJy4vQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyJztcclxuaW1wb3J0IHsgRGlzcGxheVR5cGUsIElEaXNwbGF5VHlwZVNldHRpbmdzLCBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtIH0gZnJvbSAnLi9Db250cm9sQ29uZmlndXJhdG9yJztcclxuaW1wb3J0IHsgY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlLCBJR3JpZEFkZGl0aW9uYWxPcHRpb25zIH0gZnJvbSAnLi4vR3JpZC9DcmVhdGVEZWZhdWx0R3JpZCc7XHJcbmltcG9ydCBjcmVhdGVEZWZhdWx0R3JpZCBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQnO1xyXG5pbXBvcnQgeyBjcmVhdGVEeERhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi8uLi9EYXRhL0R4RGF0YVNvdXJjZSc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHsgZ2V0U3VtbWFyeUNvbHVtbiB9IGZyb20gJy4vR3JpZFN1bW1hcnlIZWxwZXInO1xyXG5pbXBvcnQgeyBDZG1JbXBvcnRGaWxlTW9kZSB9IGZyb20gJy4uLy4uL0J1c2luZXNzJztcclxuXHJcbmludGVyZmFjZSBJQVBTQ29udHJvbEZpZWxkQ29uZmlndXJhdGlvbiB7XHJcbiAgUGVybWlzc2lvbnM6IENvbnRyb2xSb2xlUGVybWlzc2lvbnM7XHJcbiAgTmFtZTogc3RyaW5nO1xyXG4gIFR5cGU6ICdzdHJpbmcnIHwgJ251bWJlcicgfCAnYm9vbGVhbicgfCAnb2JqZWN0JyB8ICdkYXRlJyB8ICdkYXRldGltZSc7XHJcbiAgTGFiZWw6IHN0cmluZztcclxuICBPcmRlcjogbnVtYmVyO1xyXG4gIFRvb2xUaXA6IHN0cmluZztcclxuICBJc0RlZmF1bHRWaWV3RmllbGQ6IGJvb2xlYW47XHJcbiAgSXNLZXlDb2x1bW46IGJvb2xlYW47XHJcbiAgR3JvdXBGaWVsZDogc3RyaW5nO1xyXG4gIERpc3BsYXlUeXBlOiBzdHJpbmc7XHJcbiAgV2lkdGg/OiBudW1iZXI7XHJcbiAgSGlkaW5nT3JkZXI/OiBudW1iZXI7XHJcbiAgQ29sdW1ucz86IElBUFNDb250cm9sRmllbGRDb25maWd1cmF0aW9uW107XHJcbn1cclxuXHJcbmludGVyZmFjZSBJVXNlckNvbmZpZ3VyYXRpb25SZXNwb25zZSB7XHJcbiAgRmllbGRzQ29uZmlndXJhdGlvbjogSUFQU0NvbnRyb2xGaWVsZENvbmZpZ3VyYXRpb25bXTtcclxuICBDYW5DcmVhdGVHbG9iYWxWaWV3czogYm9vbGVhbjtcclxuICBDYW5DcmVhdGVHbG9iYWxGaWx0ZXJzOiBib29sZWFuO1xyXG4gIENhbkNyZWF0ZUZpbHRlcnM6IGJvb2xlYW47XHJcbiAgQ2FuQ3JlYXRlVmlld3M6IGJvb2xlYW47XHJcbiAgQ2FuQ3JlYXRlRGlzcGxheXM6IGJvb2xlYW47XHJcbiAgQ2FuQXBwbGF5RGlzcGxheXM6IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qIGVzbGludCBuby1iaXR3aXNlOiBvZmYgKi9cclxuLyogdHNsaW50OmRpc2FibGU6IG5vLWJpdHdpc2UgKi9cclxuY29uc3QgZW51bSBDb250cm9sUm9sZVBlcm1pc3Npb25zIHtcclxuICBOb25lID0gMCxcclxuICBSZWFkID0gMSA8PCAwLFxyXG4gIENyZWF0ZSA9IDEgPDwgMSxcclxuICBVcGRhdGUgPSAxIDw8IDIsXHJcbiAgRGVsZXRlID0gMSA8PCAzLFxyXG59XHJcbi8qIHRzbGludDplbmFibGU6IG5vLWJpdHdpc2UgKi9cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5T3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIGlzU3RhbmRhbG9uZVBhZ2U6IGJvb2xlYW47XHJcbiAgcGFnZVRpdGxlOiBzdHJpbmc7XHJcbiAgZXhwb3J0RmlsZU5hbWU6IHN0cmluZztcclxuICB1c2VyTmFtZTogc3RyaW5nO1xyXG4gIHVzZXJDb25maWdVcmw6IHN0cmluZztcclxuICBjb250cm9sTG9nc1VybDogc3RyaW5nO1xyXG4gIGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG4gIGdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnM6IElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zO1xyXG4gIGdyaWRWaWV3c01hbmFnZXJPcHRpb25zOiBJR3JpZFZpZXdzTWFuYWdlck9wdGlvbnM7XHJcbiAgZ3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnM6IElHcmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9ucztcclxuICByZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9uczogSVJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zO1xyXG4gIGltcG9ydEZpbGVPcHRpb25zPzogSUZpbGVJbXBvcnRlck9wdGlvbnM7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBDb250cm9sRGlzcGxheSB7XHJcbiAgcHVibGljIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBpc1N0YW5kYWxvbmVQYWdlOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFnZVRpdGxlOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBleHBvcnRGaWxlTmFtZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlck5hbWU6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJDb25maWdVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRyb2xMb2dzVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9uczogSUdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncmlkVmlld3NNYW5hZ2VyT3B0aW9uczogSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnM6IElHcmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9ucztcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zOiBJUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbXBvcnRGaWxlT3B0aW9uczogSUZpbGVJbXBvcnRlck9wdGlvbnMgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgbWFpbkdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSBncmlkVmlld3NUb29sYmFyQ29tcG9uZW50OiBHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIGdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudDogR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIGdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQ6IEdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgbXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW46IE11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luIHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJQ29udHJvbERpc3BsYXlPcHRpb25zKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSBvcHRpb25zLiRjb250YWluZXI7XHJcbiAgICB0aGlzLmlzU3RhbmRhbG9uZVBhZ2UgPSBvcHRpb25zLmlzU3RhbmRhbG9uZVBhZ2U7XHJcbiAgICB0aGlzLnBhZ2VUaXRsZSA9IG9wdGlvbnMucGFnZVRpdGxlO1xyXG4gICAgdGhpcy5leHBvcnRGaWxlTmFtZSA9IG9wdGlvbnMuZXhwb3J0RmlsZU5hbWU7XHJcbiAgICB0aGlzLnVzZXJOYW1lID0gb3B0aW9ucy51c2VyTmFtZTtcclxuICAgIHRoaXMudXNlckNvbmZpZ1VybCA9IG9wdGlvbnMudXNlckNvbmZpZ1VybDtcclxuICAgIHRoaXMuY29udHJvbExvZ3NVcmwgPSBvcHRpb25zLmNvbnRyb2xMb2dzVXJsO1xyXG4gICAgdGhpcy5sb2FkRGF0YVVybCA9IG9wdGlvbnMubG9hZERhdGFVcmw7XHJcbiAgICB0aGlzLnVwZGF0ZURhdGFVcmwgPSBvcHRpb25zLnVwZGF0ZURhdGFVcmw7XHJcbiAgICB0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnMgPSBvcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnM7XHJcbiAgICB0aGlzLmdyaWRWaWV3c01hbmFnZXJPcHRpb25zID0gb3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyT3B0aW9ucztcclxuICAgIHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnMgPSBvcHRpb25zLmdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zO1xyXG4gICAgdGhpcy5yZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9ucyA9IG9wdGlvbnMucmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnM7XHJcbiAgICB0aGlzLmltcG9ydEZpbGVPcHRpb25zID0gb3B0aW9ucy5pbXBvcnRGaWxlT3B0aW9ucztcclxuXHJcbiAgICB0aGlzLiRjb250YWluZXIuYWRkQ2xhc3MoWydhcHMtZ3JpZCcsICdjb250cm9sLWRpc3BsYXktZ3JpZCddKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBzZW5kUmVxdWVzdDxJVXNlckNvbmZpZ3VyYXRpb25SZXNwb25zZT4odGhpcy51c2VyQ29uZmlnVXJsKVxyXG4gICAgICAudGhlbigocmVzKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZ3JpZEZpbHRlcnNNYW5hZ2VyID0gbmV3IEdyaWRGaWx0ZXJzTWFuYWdlcih0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnMpO1xyXG4gICAgICAgIGNvbnN0IGdyaWRWaWV3c01hbmFnZXIgPSBuZXcgR3JpZFZpZXdzTWFuYWdlcih0aGlzLmdyaWRWaWV3c01hbmFnZXJPcHRpb25zKTtcclxuICAgICAgICBjb25zdCBncmlkRGlzcGxheXNNYW5hZ2VyID0gbmV3IEdyaWREaXNwbGF5c01hbmFnZXIodGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9ucyk7XHJcblxyXG4gICAgICAgIHRoaXMubWFpbkdyaWQgPSB0aGlzLmNyZWF0ZU1haW5HcmlkKHJlcy5GaWVsZHNDb25maWd1cmF0aW9uKTtcclxuXHJcbiAgICAgICAgY29uc3QgY2FuQ3JlYXRlRGlzcGxheXMgPSByZXMuQ2FuQ3JlYXRlRGlzcGxheXMgJiYgcmVzLkNhbkNyZWF0ZVZpZXdzICYmIHJlcy5DYW5DcmVhdGVGaWx0ZXJzO1xyXG5cclxuICAgICAgICBpZiAoY2FuQ3JlYXRlRGlzcGxheXMgfHwgcmVzLkNhbkFwcGxheURpc3BsYXlzKSB7XHJcbiAgICAgICAgICB0aGlzLmdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQgPSBuZXcgR3JpZERpc3BsYXlzVG9vbGJhckNvbXBvbmVudCh7XHJcbiAgICAgICAgICAgIG93bmVyOiB0aGlzLm1haW5HcmlkLFxyXG4gICAgICAgICAgICBlZGl0TW9kZTogY2FuQ3JlYXRlRGlzcGxheXMsXHJcbiAgICAgICAgICAgIGdyaWRGaWx0ZXJzTWFuYWdlcixcclxuICAgICAgICAgICAgZ3JpZFZpZXdzTWFuYWdlcixcclxuICAgICAgICAgICAgZ3JpZERpc3BsYXlzTWFuYWdlcixcclxuICAgICAgICAgICAgaW1wb3J0RmlsZU9wdGlvbnM6IHRoaXMuaW1wb3J0RmlsZU9wdGlvbnNcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5ncmlkVmlld3NUb29sYmFyQ29tcG9uZW50ID0gbmV3IEdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQoe1xyXG4gICAgICAgICAgb3duZXI6IHRoaXMubWFpbkdyaWQsXHJcbiAgICAgICAgICBvblZpZXdBcHBsaWVkOiB0aGlzLm9uVmlld0FwcGxpZWQsXHJcbiAgICAgICAgICBvblZpZXdEZWxldGVkOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIGF3YWl0IGdyaWREaXNwbGF5c01hbmFnZXIubG9hZERpc3BsYXlzKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgYXV0b0ludGVncmF0aW9uOiB0cnVlLFxyXG4gICAgICAgICAgZ3JpZFZpZXdzTWFuYWdlcixcclxuICAgICAgICAgIGNhbkNyZWF0ZUdsb2JhbFZpZXdzOiByZXMuQ2FuQ3JlYXRlR2xvYmFsVmlld3MsXHJcbiAgICAgICAgICB2aXNpYmxlOiByZXMuQ2FuQ3JlYXRlVmlld3NcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5ncmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQgPSBuZXcgR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50KHtcclxuICAgICAgICAgIGFwc0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlcjogbmV3IFJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlcih7XHJcbiAgICAgICAgICAgIHVzZXJJZDogdGhpcy51c2VyTmFtZSxcclxuICAgICAgICAgICAgbG9hZERhdGFVcmw6IHRoaXMucmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnMubG9hZERhdGFVcmwsXHJcbiAgICAgICAgICAgIHVwZGF0ZURhdGFVcmw6IHRoaXMucmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnMudXBkYXRlRGF0YVVybFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBvd25lcjogdGhpcy5tYWluR3JpZCxcclxuICAgICAgICAgIG9uRmlsdGVyRGVsZXRlZDogYXN5bmMgKGZpbHRlcklkKSA9PiB7XHJcbiAgICAgICAgICAgIGF3YWl0IGdyaWREaXNwbGF5c01hbmFnZXIubG9hZERpc3BsYXlzKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgYXV0b0ludGVncmF0aW9uOiB0cnVlLFxyXG4gICAgICAgICAgZ3JpZEZpbHRlcnNNYW5hZ2VyLFxyXG4gICAgICAgICAgY2FuQ3JlYXRlR2xvYmFsRmlsdGVyczogcmVzLkNhbkNyZWF0ZUdsb2JhbEZpbHRlcnMsXHJcbiAgICAgICAgICB2aXNpYmxlOiByZXMuQ2FuQ3JlYXRlRmlsdGVyc1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLm11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luID0gbmV3IE11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luKHtcclxuICAgICAgICAgIG93bmVyOiB0aGlzLm1haW5HcmlkXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGdyaWREaXNwbGF5c01hbmFnZXIub25EaXNwbGF5Q2hhbmdlZCA9IGFzeW5jIChkaXNwbGF5KSA9PiB7XHJcbiAgICAgICAgICBpZiAoZGlzcGxheSkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudC5hcHBseUZpbHRlcihkaXNwbGF5LkZpbHRlcklkLCB0cnVlKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5ncmlkVmlld3NUb29sYmFyQ29tcG9uZW50LmFwcGx5VmlldyhkaXNwbGF5LlZpZXdJZCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudC5hcHBseUZpbHRlcih2b2lkIDAsIHRydWUpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQuYXBwbHlWaWV3KEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiB0c2xpbnQ6ZGlzYWJsZTogbm8tYml0d2lzZSAqL1xyXG4gIHByaXZhdGUgaGFzUGVybWlzc29uKHJ1bGVzLCBwZXJtaXNzb24pIHtcclxuICAgIHJldHVybiBydWxlcyAmIHBlcm1pc3NvbjtcclxuICB9XHJcbiAgLyogdHNsaW50OmVuYWJsZTogbm8tYml0d2lzZSAqL1xyXG5cclxuICBwcml2YXRlIGJ1aWxkVHJlZShjb2x1bW5zKSB7XHJcbiAgICBjb25zdCBncm91cFByZWZpeCA9ICdfX0dST1VQX18nO1xyXG5cclxuICAgIGxldCBjb2x1bW5zTWFwID0gY29sdW1ucy5yZWR1Y2UoKGFjYywgY29sdW1uKSA9PiB7XHJcbiAgICAgIGNvbHVtbi5Db2x1bW5zID0gW107XHJcbiAgICAgIGNvbHVtbi5Hcm91cEZpZWxkID0gY29sdW1uLkdyb3VwRmllbGRcclxuICAgICAgICA/IGAke2dyb3VwUHJlZml4fSR7Y29sdW1uLkdyb3VwRmllbGR9YFxyXG4gICAgICAgIDogbnVsbDtcclxuICAgICAgYWNjW2NvbHVtbi5OYW1lXSA9IGNvbHVtbjtcclxuXHJcbiAgICAgIHJldHVybiBhY2M7XHJcbiAgICB9LCB7fSk7XHJcblxyXG4gICAgY29sdW1uc01hcCA9IGNvbHVtbnNcclxuICAgICAgLmZpbHRlcigoY29sdW1uKSA9PiBjb2x1bW4uR3JvdXBGaWVsZClcclxuICAgICAgLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4uR3JvdXBGaWVsZClcclxuICAgICAgLmZpbHRlcigodmFsdWUsIGluZGV4LCBzZWxmKSA9PiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleClcclxuICAgICAgLnJlZHVjZSgoYWNjLCBncm91cEZpZWxkKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY29sdW1uTmFtZSA9IGdyb3VwRmllbGQucmVwbGFjZShncm91cFByZWZpeCwgJycpO1xyXG5cclxuICAgICAgICBjb25zdCBncm91cENvbHVtbiA9IHtcclxuICAgICAgICAgIE5hbWU6IGdyb3VwRmllbGQsXHJcbiAgICAgICAgICBMYWJlbDogY29sdW1uTmFtZSxcclxuICAgICAgICAgIENvbHVtbnM6IFtdLFxyXG4gICAgICAgICAgLyogdHNsaW50OmRpc2FibGU6IG1heC1saW5lLWxlbmd0aCAqL1xyXG4gICAgICAgICAgR3JvdXBGaWVsZDogY29sdW1uc01hcFtjb2x1bW5OYW1lXSAmJiBjb2x1bW5zTWFwW2NvbHVtbk5hbWVdLkdyb3VwRmllbGQgJiYgY29sdW1uc01hcFtjb2x1bW5OYW1lXS5Hcm91cEZpZWxkICE9PSBncm91cEZpZWxkXHJcbiAgICAgICAgICAgID8gY29sdW1uc01hcFtjb2x1bW5OYW1lXS5Hcm91cEZpZWxkXHJcbiAgICAgICAgICAgIDogbnVsbFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGFjY1tncm91cEZpZWxkXSA9IGdyb3VwQ29sdW1uO1xyXG5cclxuICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICB9LCBjb2x1bW5zTWFwKTtcclxuXHJcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGNvbHVtbk5hbWUgaW4gY29sdW1uc01hcCkge1xyXG4gICAgICBpZiAoY29sdW1uc01hcC5oYXNPd25Qcm9wZXJ0eShjb2x1bW5OYW1lKSkge1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGNvbHVtbnNNYXBbY29sdW1uTmFtZV07XHJcblxyXG4gICAgICAgIGlmIChjb2x1bW4uR3JvdXBGaWVsZCkge1xyXG4gICAgICAgICAgY29sdW1uc01hcFtjb2x1bW4uR3JvdXBGaWVsZF0uQ29sdW1ucy5wdXNoKGNvbHVtbik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlc3VsdC5wdXNoKGNvbHVtbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyRGlzcGxheVR5cGUoc2V0dGluZ3M6IElEaXNwbGF5VHlwZVNldHRpbmdzLCBjb2x1bW46IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbiwgcGVybWlzc2lvbnM6IENvbnRyb2xSb2xlUGVybWlzc2lvbnMpIHtcclxuICAgIGlmIChzZXR0aW5ncy50eXBlID09PSBEaXNwbGF5VHlwZS5JY29ucykge1xyXG4gICAgICBjb2x1bW4uY2VsbFRlbXBsYXRlID0gKGNvbnRhaW5lciwgb3B0aW9ucykgPT4ge1xyXG4gICAgICAgIGNvbnN0IHN0cmluZ1ZhbHVlID0gU3RyaW5nKG9wdGlvbnMudmFsdWUpO1xyXG4gICAgICAgIGNvbnN0IGNlbGxTZXR0aW5ncyA9IHNldHRpbmdzLmRhdGEuZmluZCgoaXRlbSkgPT4gU3RyaW5nKGl0ZW0udmFsdWUpID09PSBzdHJpbmdWYWx1ZSk7XHJcblxyXG4gICAgICAgIGlmIChjZWxsU2V0dGluZ3MpIHtcclxuICAgICAgICAgICQoJzxkaXY+JylcclxuICAgICAgICAgICAgLmNzcyh7ICd0ZXh0LWFsaWduJzogJ2NlbnRlcicgfSlcclxuICAgICAgICAgICAgLmF0dHIoJ3RpdGxlJywgY2VsbFNldHRpbmdzLnRpdGxlKVxyXG4gICAgICAgICAgICAuYXBwZW5kKCQoJzxpbWc+JywgeyBzcmM6IGNlbGxTZXR0aW5ncy5pbWFnZSB9KSlcclxuICAgICAgICAgICAgLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAuY3NzKHsgJ3RleHQtYWxpZ24nOiAnY2VudGVyJyB9KVxyXG4gICAgICAgICAgICAudGV4dChvcHRpb25zLnZhbHVlKVxyXG4gICAgICAgICAgICAuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb2x1bW4uZWRpdENlbGxUZW1wbGF0ZSA9IChjb250YWluZXIsIGNlbGxJbmZvKSA9PiB7XHJcbiAgICAgICAgJCgnPGRpdiAvPicpLmR4U2VsZWN0Qm94KHtcclxuICAgICAgICAgIGRhdGFTb3VyY2U6IHNldHRpbmdzLmRhdGEsXHJcbiAgICAgICAgICBkaXNwbGF5VmFsdWU6ICd0aXRsZScsXHJcbiAgICAgICAgICBpdGVtVGVtcGxhdGU6IChkYXRhOiBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgICAuY3NzKHsgJ3RleHQtYWxpZ24nOiAnY2VudGVyJyB9KVxyXG4gICAgICAgICAgICAgIC5hdHRyKCd0aXRsZScsIGRhdGEudGl0bGUpXHJcbiAgICAgICAgICAgICAgLmFwcGVuZCgkKCc8aW1nPicsIHsgc3JjOiBkYXRhLmltYWdlIH0pKVxyXG4gICAgICAgICAgICAgIC5hcHBlbmRUbyhjb250YWluZXIpO1xyXG4gICAgICAgICAgfSxcclxuXHJcbiAgICAgICAgICBmaWVsZFRlbXBsYXRlOiAoZGF0YSwgZWwpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudEl0ZW0gPSBzZXR0aW5ncy5kYXRhLmZpbmQoKGl0ZW0pID0+IHBhcnNlSW50KGl0ZW0udmFsdWUpID09PSBjZWxsSW5mby52YWx1ZSk7XHJcbiAgICAgICAgICAgIGNvbnN0ICRpdGVtTmFtZSA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnaXRlbS1uYW1lJyk7XHJcbiAgICAgICAgICAgIGNvbnN0ICRyZXN1bHQgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2Fwcy1pY29uLWVkaXRvcl9fY3VzdG9tLWl0ZW0nKVxyXG4gICAgICAgICAgICAgIC5hcHBlbmQoJCgnPGltZz4nLCB7IHNyYzogY3VycmVudEl0ZW0gPyBjdXJyZW50SXRlbS5pbWFnZSA6ICcnIH0pLmF0dHIoJ3RpdGxlJywgY3VycmVudEl0ZW0gPyBjdXJyZW50SXRlbS50aXRsZSA6ICcnKSlcclxuICAgICAgICAgICAgICAuYXBwZW5kKCRpdGVtTmFtZSk7XHJcblxyXG4gICAgICAgICAgICAkaXRlbU5hbWVcclxuICAgICAgICAgICAgICAuZHhUZXh0Qm94KHtcclxuICAgICAgICAgICAgICAgIHZhbHVlOiAnJyxcclxuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlXHJcbiAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBlbC5hcHBlbmQoJHJlc3VsdCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6ICh7IHZhbHVlLCBjb21wb25lbnQgfSkgPT4ge1xyXG4gICAgICAgICAgICBjZWxsSW5mby5zZXRWYWx1ZShwYXJzZUludCh2YWx1ZS52YWx1ZSkpO1xyXG4gICAgICAgICAgICBjb21wb25lbnQuYmx1cigpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHZhbHVlOiAoY2VsbEluZm8udmFsdWUgIT09IG51bGwgJiYgY2VsbEluZm8gIT09IHZvaWQgMCkgJiYgY2VsbEluZm8udmFsdWUudG9TdHJpbmcoKSxcclxuICAgICAgICAgIHNlbGVjdGVkSXRlbTogc2V0dGluZ3MuZGF0YS5maW5kKChpdGVtKSA9PiBwYXJzZUludChpdGVtLnZhbHVlKSA9PT0gY2VsbEluZm8udmFsdWUpXHJcbiAgICAgICAgfSkuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbHVtbi5hbGxvd1NlYXJjaCA9IGZhbHNlO1xyXG4gICAgICBjb2x1bW4uYWxsb3dGaWx0ZXJpbmcgPSBmYWxzZTtcclxuICAgICAgY29sdW1uLmFsbG93SGVhZGVyRmlsdGVyaW5nID0gdHJ1ZTtcclxuICAgICAgY29sdW1uLmFsbG93R3JvdXBpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2V0dGluZ3MudHlwZSA9PT0gRGlzcGxheVR5cGUuUHJlZGVmaW5lZFZhbHVlcykge1xyXG4gICAgICBjb2x1bW4uZWRpdENlbGxUZW1wbGF0ZSA9IChjb250YWluZXIsIGNlbGxJbmZvKSA9PiB7XHJcbiAgICAgICAgJCgnPGRpdiAvPicpLmR4U2VsZWN0Qm94KHtcclxuICAgICAgICAgIGRhdGFTb3VyY2U6IHNldHRpbmdzLmRhdGEubWFwKChpKSA9PiBpLnZhbHVlKS5zb3J0KCksXHJcbiAgICAgICAgICBhY2NlcHRDdXN0b21WYWx1ZTogdHJ1ZSxcclxuICAgICAgICAgIHNob3dDbGVhckJ1dHRvbjogdHJ1ZSxcclxuICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoeyB2YWx1ZSwgY29tcG9uZW50IH0pID0+IHtcclxuICAgICAgICAgICAgY2VsbEluZm8uc2V0VmFsdWUodmFsdWUgfHwgJycpO1xyXG4gICAgICAgICAgICBjb21wb25lbnQuYmx1cigpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHZhbHVlOiBjZWxsSW5mby52YWx1ZSxcclxuICAgICAgICB9KS5hcHBlbmRUbyhjb250YWluZXIpO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZXR0aW5ncy50eXBlID09PSBEaXNwbGF5VHlwZS5SYWJiaXRBY3Rpb24pIHtcclxuICAgICAgY29sdW1uLmVkaXRDZWxsVGVtcGxhdGUgPSAoY29udGFpbmVyLCBjZWxsSW5mbykgPT4ge1xyXG4gICAgICAgICQoJzxkaXYgLz4nKS5keENoZWNrQm94KHtcclxuICAgICAgICAgIHZhbHVlOiBjZWxsSW5mby52YWx1ZSB8fCBmYWxzZSxcclxuICAgICAgICAgIHJlYWRPbmx5OiAhdGhpcy5oYXNQZXJtaXNzb24ocGVybWlzc2lvbnMsIENvbnRyb2xSb2xlUGVybWlzc2lvbnMuVXBkYXRlKSxcclxuICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICBjZWxsSW5mby5jb21wb25lbnQuY2VsbFZhbHVlKGNlbGxJbmZvLnJvd0luZGV4LCBjZWxsSW5mby5jb2x1bW4uZGF0YUZpZWxkLCBlLnZhbHVlKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSkuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uZmlndXJlQ29sdW1uKGNvbHVtbkNvbmZpZzogSUFQU0NvbnRyb2xGaWVsZENvbmZpZ3VyYXRpb24pOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW4ge1xyXG4gICAgY29uc3QgdGl0bGUgPSBjb2x1bW5Db25maWcuTGFiZWwgfHwgY29sdW1uQ29uZmlnLk5hbWU7XHJcbiAgICBjb25zdCB0b29sdGlwID0gY29sdW1uQ29uZmlnLlRvb2xUaXAgfHwgdGl0bGU7XHJcblxyXG4gICAgY29uc3QgY29sdW1uOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW4gPSAhY29sdW1uQ29uZmlnLkNvbHVtbnMubGVuZ3RoXHJcbiAgICAgID8ge1xyXG4gICAgICAgIGRhdGFGaWVsZDogY29sdW1uQ29uZmlnLk5hbWUsXHJcbiAgICAgICAgZGF0YVR5cGU6IGNvbHVtbkNvbmZpZy5UeXBlLFxyXG4gICAgICAgIGNhcHRpb246IHRpdGxlLFxyXG4gICAgICAgIGhlYWRlckNlbGxUZW1wbGF0ZTogY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKHRpdGxlLCB0b29sdGlwKSxcclxuICAgICAgICB2aXNpYmxlOiBjb2x1bW5Db25maWcuSXNEZWZhdWx0Vmlld0ZpZWxkLFxyXG4gICAgICAgIHZpc2libGVJbmRleDogY29sdW1uQ29uZmlnLk9yZGVyLFxyXG4gICAgICAgIGFsbG93Rml4aW5nOiBmYWxzZSxcclxuICAgICAgICBhbGxvd0VkaXRpbmc6ICEhdGhpcy5oYXNQZXJtaXNzb24oY29sdW1uQ29uZmlnLlBlcm1pc3Npb25zLCBDb250cm9sUm9sZVBlcm1pc3Npb25zLlVwZGF0ZSksXHJcbiAgICAgICAgd2lkdGg6IGNvbHVtbkNvbmZpZy5XaWR0aCxcclxuICAgICAgICBoaWRpbmdQcmlvcml0eTogY29sdW1uQ29uZmlnLkhpZGluZ09yZGVyXHJcbiAgICAgIH0gOiB7XHJcbiAgICAgICAgY2FwdGlvbjogdGl0bGUsXHJcbiAgICAgICAgY29sdW1uczogY29sdW1uQ29uZmlnLkNvbHVtbnMubWFwKChjKSA9PiB0aGlzLmNvbmZpZ3VyZUNvbHVtbihjKSlcclxuICAgICAgfTtcclxuXHJcbiAgICBpZiAoY29sdW1uQ29uZmlnLkRpc3BsYXlUeXBlKSB7XHJcbiAgICAgIGNvbnN0IGRpc3BsYXlTZXR0aW5nczogSURpc3BsYXlUeXBlU2V0dGluZ3MgPSBKU09OLnBhcnNlKGNvbHVtbkNvbmZpZy5EaXNwbGF5VHlwZSk7XHJcblxyXG4gICAgICBpZiAoZGlzcGxheVNldHRpbmdzLnR5cGUgPT09IERpc3BsYXlUeXBlLkljb25zKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSBkaXNwbGF5U2V0dGluZ3MuZGF0YS5tYXAoKGl0ZW0pID0+ICh7XHJcbiAgICAgICAgICB0ZXh0OiBpdGVtLnRpdGxlLFxyXG4gICAgICAgICAgdmFsdWU6IGl0ZW0udmFsdWVcclxuICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgIGl0ZW1zLnNwbGljZSgwLCAwLCB7XHJcbiAgICAgICAgICB0ZXh0OiAnQmxhbmsnLFxyXG4gICAgICAgICAgdmFsdWU6IG51bGxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgKGNvbHVtbiBhcyBhbnkpLmhlYWRlckZpbHRlciA9IHtcclxuICAgICAgICAgIGRhdGFTb3VyY2U6IGl0ZW1zXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5yZW5kZXJEaXNwbGF5VHlwZShkaXNwbGF5U2V0dGluZ3MsIGNvbHVtbiwgY29sdW1uQ29uZmlnLlBlcm1pc3Npb25zKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY29sdW1uO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25maWd1cmVDb2x1bW5zKGNvbmZpZ3VyYXRpb246IElBUFNDb250cm9sRmllbGRDb25maWd1cmF0aW9uW10pIHtcclxuICAgIGNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uLmZpbHRlcihcclxuICAgICAgKGMpID0+IHRoaXMuaGFzUGVybWlzc29uKGMuUGVybWlzc2lvbnMsIENvbnRyb2xSb2xlUGVybWlzc2lvbnMuUmVhZClcclxuICAgICk7XHJcblxyXG4gICAgY29uZmlndXJhdGlvbiA9IHRoaXMuYnVpbGRUcmVlKGNvbmZpZ3VyYXRpb24pO1xyXG4gICAgY29uc3QgY29sdW1ucyA9IGNvbmZpZ3VyYXRpb24ubWFwKChjKSA9PiB0aGlzLmNvbmZpZ3VyZUNvbHVtbihjKSk7XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtbnM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZU1haW5HcmlkKGNvbmZpZ3VyYXRpb246IElBUFNDb250cm9sRmllbGRDb25maWd1cmF0aW9uW10pIHtcclxuICAgIGNvbnN0IGhhc0tleXMgPSBjb25maWd1cmF0aW9uLnNvbWUoKGMpID0+IGMuSXNLZXlDb2x1bW4pO1xyXG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuY29uZmlndXJlQ29sdW1ucyhjb25maWd1cmF0aW9uKTtcclxuXHJcbiAgICBjb25zdCBjb2x1bW5Gb3JTdW1tYXJ5ID0gZ2V0U3VtbWFyeUNvbHVtbihjb2x1bW5zKTtcclxuICAgIGNvbnN0IGdyaWRPcHRpb25zID0ge1xyXG4gICAgICBkYXRhU291cmNlOiB0aGlzLmNyZWF0ZU1haW5HcmlkRGF0YVNvdXJjZShjb25maWd1cmF0aW9uKSxcclxuICAgICAgY29sdW1uUmVzaXppbmdNb2RlOiAnd2lkZ2V0JyxcclxuICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgZWRpdGluZzoge1xyXG4gICAgICAgIGFsbG93VXBkYXRpbmc6IGhhc0tleXMsXHJcbiAgICAgICAgYWxsb3dBZGRpbmc6IGZhbHNlLFxyXG4gICAgICAgIGFsbG93RGVsZXRpbmc6IGZhbHNlLFxyXG4gICAgICAgIG1vZGU6ICdiYXRjaCdcclxuICAgICAgfSxcclxuICAgICAgc2Nyb2xsaW5nOiB7IG1vZGU6ICd2aXJ0dWFsJywgcHJlbG9hZEVuYWJsZWQ6IHRydWUgfSxcclxuICAgICAgcmVtb3RlT3BlcmF0aW9uczogdHJ1ZSxcclxuICAgICAgcGFnZXI6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgaGVpZ2h0OiB0aGlzLmlzU3RhbmRhbG9uZVBhZ2UgPyB1bmRlZmluZWQgOiAnMTAwJScsXHJcbiAgICAgIGNvbHVtbkNob29zZXI6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIG1vZGU6ICdkcmFnQW5kRHJvcCdcclxuICAgICAgfSxcclxuICAgICAgY29sdW1uRml4aW5nOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBmaWx0ZXJQYW5lbDoge1xyXG4gICAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgICAgdGV4dHM6IHtcclxuICAgICAgICAgIGNyZWF0ZUZpbHRlcjogJ05vbmUnLFxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgc3VtbWFyeToge1xyXG4gICAgICAgIHRvdGFsSXRlbXM6IFt7IHN1bW1hcnlUeXBlOiAnY291bnQnLCBjb2x1bW46IGNvbHVtbkZvclN1bW1hcnkgfV1cclxuICAgICAgfSxcclxuICAgICAgYWxsb3dDb2x1bW5SZXNpemluZzogdHJ1ZSxcclxuICAgICAgY29sdW1uSGlkaW5nRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICBjb2x1bW5zLFxyXG4gICAgICBhbGxvd0NvbHVtblJlb3JkZXJpbmc6IHRydWUsXHJcbiAgICAgIGdyb3VwaW5nOiB7XHJcbiAgICAgICAgY29udGV4dE1lbnVFbmFibGVkOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIGdyb3VwUGFuZWw6IHtcclxuICAgICAgICB2aXNpYmxlOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIG1hc3RlckRldGFpbDogIWhhc0tleXMgPyB1bmRlZmluZWQgOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICB0ZW1wbGF0ZTogKGNvbnRhaW5lciwgb3B0aW9ucykgPT4ge1xyXG4gICAgICAgICAgY29uc3Qga2V5cyA9IHt9O1xyXG4gICAgICAgICAgY29uZmlndXJhdGlvbi5maWx0ZXIoKGMpID0+IGMuSXNLZXlDb2x1bW4pLmZvckVhY2goKGMpID0+IGtleXNbYy5OYW1lXSA9IG9wdGlvbnMuZGF0YVtjLk5hbWVdKTtcclxuXHJcbiAgICAgICAgICAkKCc8ZGl2PicpXHJcbiAgICAgICAgICAgIC5keERhdGFHcmlkKHtcclxuICAgICAgICAgICAgICBkYXRhU291cmNlOiB7XHJcbiAgICAgICAgICAgICAgICBzdG9yZTogY3JlYXRlRHhEYXRhU291cmNlKHtcclxuICAgICAgICAgICAgICAgICAgbG9hZFVybDogYCR7dGhpcy5jb250cm9sTG9nc1VybH0/a2V5PSR7SlNPTi5zdHJpbmdpZnkoa2V5cyl9YCxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBzaG93Qm9yZGVyczogdHJ1ZSxcclxuICAgICAgICAgICAgICBjb2x1bW5zOiBbe1xyXG4gICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnVXNlcicsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogMjAwXHJcbiAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnQ3JlYXRlZEF0JyxcclxuICAgICAgICAgICAgICAgIGNhcHRpb246ICdEYXRlJyxcclxuICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAnZGF0ZScsXHJcbiAgICAgICAgICAgICAgICBmb3JtYXQ6ICdzaG9ydERhdGVTaG9ydFRpbWUnLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IDIwMFxyXG4gICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ0NoYW5nZXMnLFxyXG4gICAgICAgICAgICAgICAgY2VsbFRlbXBsYXRlOiAoYywgbykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gby5kYXRhLkNoYW5nZXNcclxuICAgICAgICAgICAgICAgICAgICAubWFwKFxyXG4gICAgICAgICAgICAgICAgICAgICAgKGl0ZW0pID0+IChcclxuICAgICAgICAgICAgICAgICAgICAgICAgYDxkaXYgY2xhc3M9J2Fwcy1jb250cm9sLWxvZyc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0nYXBzLWNvbnRyb2wtbG9nX19maWVsZCc+JHtpdGVtLkZpZWxkfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSdhcHMtY29udHJvbC1sb2dfX29sZC12YWx1ZSc+JHtpdGVtLk9sZFZhbHVlfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1MjE5MlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9J2Fwcy1jb250cm9sLWxvZ19fbmV3LXZhbHVlJz4ke2l0ZW0uTmV3VmFsdWV9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PmBcclxuICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJycpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgJChgPGRpdiBjbGFzcz0nYXBzLWNvbnRyb2wtbG9ncyc+JHtjb250ZW50fTwvZGl2PmApLmFwcGVuZFRvKGMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1dLFxyXG4gICAgICAgICAgICB9KS5hcHBlbmRUbyhjb250YWluZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgb25Db250ZW50UmVhZHk6IChlKSA9PiB7XHJcbiAgICAgICAgaWYgKCFlLmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wcmVwYXJlRmlsdGVyUGFuZWwoZS5jb21wb25lbnQpO1xyXG4gICAgICB9LFxyXG4gICAgICBvbkVkaXRvclByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgICBpZiAoZS5wYXJlbnRUeXBlICE9PSAnZGF0YVJvdycpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGZpZWxkQ29uZmlnID0gY29uZmlndXJhdGlvbi5maW5kKChjKSA9PiBjLk5hbWUgPT09IGUuZGF0YUZpZWxkKTtcclxuXHJcbiAgICAgICAgaWYgKCFmaWVsZENvbmZpZykge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZGlzYWJsZUVkaXRpbmcgPSAhdGhpcy5oYXNQZXJtaXNzb24oZmllbGRDb25maWcuUGVybWlzc2lvbnMsIENvbnRyb2xSb2xlUGVybWlzc2lvbnMuVXBkYXRlKTtcclxuXHJcbiAgICAgICAgZS5lZGl0b3JPcHRpb25zLnJlYWRPbmx5ID0gZGlzYWJsZUVkaXRpbmc7XHJcblxyXG4gICAgICAgIGlmICghZGlzYWJsZUVkaXRpbmcgJiYgZmllbGRDb25maWcuVHlwZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGNvbnN0IGJhc2VTZXRWYWx1ZSA9IGUuc2V0VmFsdWU7XHJcblxyXG4gICAgICAgICAgKGUgYXMgYW55KS5zZXRWYWx1ZSA9IChuZXdWYWx1ZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGJhc2VTZXRWYWx1ZShuZXdWYWx1ZS50cmltKCkpO1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uQ2VsbFByZXBhcmVkOiAoZSkgPT4ge1xyXG4gICAgICAgIGlmIChlLnJvd1R5cGUgPT09ICdkYXRhJykge1xyXG4gICAgICAgICAgY29uc3QgZmllbGRDb25maWcgPSBjb25maWd1cmF0aW9uLmZpbmQoKGMpID0+IGMuTmFtZSA9PT0gZS5jb2x1bW4uZGF0YUZpZWxkKTtcclxuXHJcbiAgICAgICAgICBpZiAoZmllbGRDb25maWcgJiYgIXRoaXMuaGFzUGVybWlzc29uKGZpZWxkQ29uZmlnLlBlcm1pc3Npb25zLCBDb250cm9sUm9sZVBlcm1pc3Npb25zLlVwZGF0ZSkpIHtcclxuICAgICAgICAgICAgJChlLmNlbGxFbGVtZW50KS5hZGRDbGFzcygnYXBzLWdyaWRfX2Rpc2FibGVkLWNlbGwnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uUm93RXhwYW5kZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZGV0YWlsUm93SW5kZXggPSBlLmNvbXBvbmVudC5nZXRSb3dJbmRleEJ5S2V5KGUua2V5KSArIDE7XHJcbiAgICAgICAgY29uc3QgJGRldGFpbENlbGwgPSBlLmNvbXBvbmVudC5nZXRDZWxsRWxlbWVudChkZXRhaWxSb3dJbmRleCwgMCkucGFyZW50KCkuZmluZCgnLmR4LW1hc3Rlci1kZXRhaWwtY2VsbCcpO1xyXG4gICAgICAgIGNvbnN0IGRhdGFHcmlkID0gJGRldGFpbENlbGwuZmluZCgnLmR4LWRhdGFncmlkJykuZmlyc3QoKS5wYXJlbnQoKS5keERhdGFHcmlkKCdpbnN0YW5jZScpO1xyXG5cclxuICAgICAgICBkYXRhR3JpZC5yZWZyZXNoKCk7XHJcbiAgICAgIH0sXHJcbiAgICB9IGFzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnM7XHJcblxyXG4gICAgcmV0dXJuIGNyZWF0ZURlZmF1bHRHcmlkKHRoaXMuJGNvbnRhaW5lciwge1xyXG4gICAgICBvcHRpb25zOiBncmlkT3B0aW9ucyxcclxuICAgICAgaXNGdWxsU2NyZWVuOiB0aGlzLmlzU3RhbmRhbG9uZVBhZ2UsXHJcbiAgICAgIHNldERlZmF1bHRDb2x1bW5XaWR0aDogdHJ1ZSxcclxuICAgICAgZXhwb3J0RmlsZU5hbWU6IHRoaXMuZXhwb3J0RmlsZU5hbWUsXHJcbiAgICAgIHRpdGxlOiB0aGlzLnBhZ2VUaXRsZSxcclxuICAgICAgZGlzYWJsZVN1bW1hcnlDb2x1bW5EZXRlY3Rpb246IHRydWVcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVNYWluR3JpZERhdGFTb3VyY2UoY29uZmlndXJhdGlvbjogSUFQU0NvbnRyb2xGaWVsZENvbmZpZ3VyYXRpb25bXSk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnNbJ2RhdGFTb3VyY2UnXSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzdG9yZTogY3JlYXRlRHhEYXRhU291cmNlKHtcclxuICAgICAgICBrZXk6IGNvbmZpZ3VyYXRpb24uZmlsdGVyKChjKSA9PiBjLklzS2V5Q29sdW1uKS5tYXAoKGMpID0+IGMuTmFtZSksXHJcbiAgICAgICAgbG9hZFVybDogdGhpcy5sb2FkRGF0YVVybCxcclxuICAgICAgICB1cGRhdGVVcmw6IHRoaXMudXBkYXRlRGF0YVVybFxyXG4gICAgICB9KVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25WaWV3QXBwbGllZCA9ICh2aWV3SWQ6IG51bWJlcikgPT4ge1xyXG4gICAgdGhpcy5jbGVhckZpbHRlclJvd0FmdGVyVmlld1N3aXRjaGluZygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwcmVwYXJlRmlsdGVyUGFuZWwoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XHJcbiAgICBjb25zdCAkZmlsdGVyUGFuZWxFbGVtZW50ID0gZ3JpZC5lbGVtZW50KClcclxuICAgICAgLmZpbmQoJy5keC1kYXRhZ3JpZC1maWx0ZXItcGFuZWwnKTtcclxuICAgIGNvbnN0ICRmaWx0ZXJJY29uRmlsdGVyID0gJGZpbHRlclBhbmVsRWxlbWVudC5maW5kKCcuZHgtaWNvbi1maWx0ZXInKTtcclxuICAgIGNvbnN0ICRmaWx0ZXJQYW5lbFRleHQgPSAkZmlsdGVyUGFuZWxFbGVtZW50LmZpbmQoJy5keC1kYXRhZ3JpZC1maWx0ZXItcGFuZWwtdGV4dCcpO1xyXG5cclxuICAgICRmaWx0ZXJJY29uRmlsdGVyLm9mZignY2xpY2snKTtcclxuICAgICRmaWx0ZXJQYW5lbFRleHQub2ZmKCdjbGljaycpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0Um93c0NvdW50U3VtbWFyeShncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQpIHtcclxuICAgIGNvbnN0IGZpcnN0VmlzaWJsZURhdGFDb2x1bW4gPSBncmlkLmdldFZpc2libGVDb2x1bW5zKCkuZmluZCgoYykgPT4gISFjLmRhdGFGaWVsZCk7XHJcbiAgICBpZiAoIWZpcnN0VmlzaWJsZURhdGFDb2x1bW4pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJvd3NDb3VudFN1bW1hcnlOYW1lID0gJ1Jvd3NDb3VudCc7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gICAgY29uc3QgdG90YWxJdGVtczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXNbJ3N1bW1hcnknXVsndG90YWxJdGVtcyddID0gKGdyaWQub3B0aW9uKCdzdW1tYXJ5LnRvdGFsSXRlbXMnKSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuUHJvcGVydGllc1snc3VtbWFyeSddWyd0b3RhbEl0ZW1zJ10gKSB8fCBbXTtcclxuICAgIGNvbnN0IHJvd3NDb3VudFN1bW1hcnlJdGVtID0gdG90YWxJdGVtcy5maW5kKChpdGVtKSA9PiBpdGVtICYmIGl0ZW0ubmFtZSA9PT0gcm93c0NvdW50U3VtbWFyeU5hbWUpO1xyXG4gICAgaWYgKHJvd3NDb3VudFN1bW1hcnlJdGVtICYmIHJvd3NDb3VudFN1bW1hcnlJdGVtLmNvbHVtbiA9PT0gZmlyc3RWaXNpYmxlRGF0YUNvbHVtbi5kYXRhRmllbGQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyb3dzQ291bnRTdW1tYXJ5SXRlbSkge1xyXG4gICAgICByb3dzQ291bnRTdW1tYXJ5SXRlbS5jb2x1bW4gPSBmaXJzdFZpc2libGVEYXRhQ29sdW1uLmRhdGFGaWVsZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRvdGFsSXRlbXMucHVzaCh7XHJcbiAgICAgICAgbmFtZTogcm93c0NvdW50U3VtbWFyeU5hbWUsXHJcbiAgICAgICAgY29sdW1uOiBmaXJzdFZpc2libGVEYXRhQ29sdW1uLmRhdGFGaWVsZCxcclxuICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50JyxcclxuICAgICAgICBhbGlnbm1lbnQ6ICdsZWZ0JyxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5tYWluR3JpZC5vcHRpb24oJ3N1bW1hcnkudG90YWxJdGVtcycsIHRvdGFsSXRlbXMpO1xyXG4gIH1cclxuXHJcbiAgLy8gTk9URTogV29ya2Fyb3VuZC4gVGhlIGdyaWQgY2FuJ3QgY2xlYXIgdGhlIGZpbHRlciByb3csIHNvIHdlIGNsZWFyIHRoYXQgbWFudWFsbHlcclxuICBwcml2YXRlIGNsZWFyRmlsdGVyUm93QWZ0ZXJWaWV3U3dpdGNoaW5nKCkge1xyXG4gICAgY29uc3QgY2xlYXJIZWFkZXIgPSAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbHVtbnNXaXRoRmlsdGVyZWRWYWx1ZXM6IHsgW3Zpc2libGVJbmRleDogbnVtYmVyXTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uIH0gPSB7fTtcclxuXHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyLmN1cnJlbnRTYXZlZEdyaWRTdGF0ZS5jb2x1bW5zXHJcbiAgICAgICAgfHwgdGhpcy5ncmlkVmlld3NUb29sYmFyQ29tcG9uZW50Lm9wdGlvbnMub3duZXIub3B0aW9uKCdjb2x1bW5zJykgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLkNvbHVtbltdO1xyXG5cclxuICAgICAgY29sdW1uc1xyXG4gICAgICAgIC5maWx0ZXIoKGMpID0+IGMudmlzaWJsZUluZGV4ICYmIChjLmZpbHRlclZhbHVlIHx8IGMuZmlsdGVyVmFsdWVzKSlcclxuICAgICAgICAuZm9yRWFjaCgoYykgPT4gY29sdW1uc1dpdGhGaWx0ZXJlZFZhbHVlc1tjLnZpc2libGVJbmRleF0gPSBjKTtcclxuXHJcbiAgICAgICQoJ3RkIFthcmlhLWxhYmVsKj1cIkZpbHRlciBjZWxsXCJdJylcclxuICAgICAgICAuZmlsdGVyKChpbmRleCkgPT4gIWNvbHVtbnNXaXRoRmlsdGVyZWRWYWx1ZXNbaW5kZXhdKVxyXG4gICAgICAgIC52YWwoJycpO1xyXG4gICAgICB0aGlzLm1haW5HcmlkLm9mZignY29udGVudFJlYWR5JywgY2xlYXJIZWFkZXIpO1xyXG4gICAgfTtcclxuICAgIHRoaXMubWFpbkdyaWQub24oJ2NvbnRlbnRSZWFkeScsIGNsZWFySGVhZGVyKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHsgY3JlYXRlRGVmYXVsdERhdGFHcmlkLCBjcmVhdGVGdWxsU2NyZWVuRGF0YUdyaWQsIElHcmlkQWRkaXRpb25hbE9wdGlvbnMgfSBmcm9tICcuLi9HcmlkL0NyZWF0ZURlZmF1bHRHcmlkJztcclxuaW1wb3J0IGNyZWF0ZURlZmF1bHRHcmlkIGZyb20gJy4uLy4uLy4uL1dpZGdldHMvR3JpZC9EZWZhdWx0R3JpZCc7XHJcblxyXG5pbnRlcmZhY2UgSUFwcFVzZXIge1xyXG4gIElkOiBzdHJpbmc7XHJcbiAgVXNlck5hbWU6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIElEaXNwbGF5IHtcclxuICBJZDogbnVtYmVyO1xyXG4gIE5hbWU6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIElDb250cm9sRGlzcGxheXNVc2VyQXNzaWdubWVudCB7XHJcbiAgRGlzcGxheUlkOiBudW1iZXI7XHJcbiAgVXNlcklkOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR3JpZENvbHVtbiB7XHJcbiAgSWQ6IHN0cmluZztcclxuICBDYXB0aW9uOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJQVBTQ29udHJvbERpc3BsYXlBc3NpZ25tZW50c0RhdGEge1xyXG4gIFVzZXJzOiBJQXBwVXNlcltdO1xyXG4gIERpc3BsYXlzOiBJRGlzcGxheVtdO1xyXG4gIEFzc2lnbm1lbnRzOiBJQ29udHJvbERpc3BsYXlzVXNlckFzc2lnbm1lbnRbXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGlzcGxheU1hbmFnZXJPcHRpb25zIHtcclxuICAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgaXNTdGFuZGFsb25lUGFnZTogYm9vbGVhbjtcclxuICBwYWdlVGl0bGU6IHN0cmluZztcclxuICBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIERpc3BsYXlNYW5hZ2VyIHtcclxuICBwdWJsaWMgcmVhZG9ubHkgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaXNTdGFuZGFsb25lUGFnZTogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IHBhZ2VUaXRsZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSURpc3BsYXlNYW5hZ2VyT3B0aW9ucykge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy5pc1N0YW5kYWxvbmVQYWdlID0gb3B0aW9ucy5pc1N0YW5kYWxvbmVQYWdlO1xyXG4gICAgdGhpcy5sb2FkRGF0YVVybCA9IG9wdGlvbnMubG9hZERhdGFVcmw7XHJcbiAgICB0aGlzLnVwZGF0ZURhdGFVcmwgPSBvcHRpb25zLnVwZGF0ZURhdGFVcmw7XHJcbiAgICB0aGlzLnBhZ2VUaXRsZSA9IG9wdGlvbnMucGFnZVRpdGxlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIGxldCBjb2x1bW5zOiBJR3JpZENvbHVtbltdID0gW107XHJcblxyXG4gICAgY29uc3QgbG9hZERhdGFQcm9taXNlID0gc2VuZFJlcXVlc3Q8SUFQU0NvbnRyb2xEaXNwbGF5QXNzaWdubWVudHNEYXRhPih0aGlzLmxvYWREYXRhVXJsLCAnZ2V0JylcclxuICAgICAgLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICAgIGNvbHVtbnMgPSByZXMuRGlzcGxheXMubWFwKChkKSA9PiAoeyBJZDogZC5JZC50b1N0cmluZygpLCBDYXB0aW9uOiBkLk5hbWUgfSkpO1xyXG5cclxuICAgICAgICBjb25zdCBkYXRhID0gW107XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgdXNlciBvZiByZXMuVXNlcnMpIHtcclxuICAgICAgICAgIGNvbnN0IGl0ZW0gPSB7IFVzZXJOYW1lOiB1c2VyLlVzZXJOYW1lLCBVc2VySWQ6IHVzZXIuSWQgfTtcclxuICAgICAgICAgIGNvbnN0IHVzZXJBc3NpZ25tZW50cyA9IHJlcy5Bc3NpZ25tZW50cy5maWx0ZXIoKGEpID0+IGEuVXNlcklkID09PSB1c2VyLklkKTtcclxuXHJcbiAgICAgICAgICB1c2VyQXNzaWdubWVudHMuZm9yRWFjaCgoYXNzaWdubWVudCkgPT4ge1xyXG4gICAgICAgICAgICBpdGVtW2Fzc2lnbm1lbnQuRGlzcGxheUlkXSA9IHRydWU7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBkYXRhLnB1c2goaXRlbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBncmlkQ29sdW1ucyA9IFtcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiAnVXNlck5hbWUnLCB3aWR0aDogMzAwLCBmaXhlZDogdHJ1ZSwgZml4ZWRQb3NpdGlvbjogJ2xlZnQnLCBhbGxvd0VkaXRpbmc6IGZhbHNlIH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogJ1VzZXJJZCcsIHZpc2libGU6IGZhbHNlIH1cclxuICAgICAgICBdIGFzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5Db2x1bW5bXTtcclxuXHJcbiAgICAgICAgZ3JpZC5vcHRpb24oJ2NvbHVtbnMnLCBncmlkQ29sdW1ucy5jb25jYXQoY29sdW1ucy5tYXAoKGNvbCkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiBjb2wuSWQsXHJcbiAgICAgICAgICAgIGNhcHRpb246IGNvbC5DYXB0aW9uLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2Jvb2xlYW4nLFxyXG4gICAgICAgICAgICBjYWxjdWxhdGVDZWxsVmFsdWU6IChyb3dEYXRhKSA9PiAhIXJvd0RhdGFbY29sLklkXVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9KSkpO1xyXG5cclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgbGV0IHVwZGF0aW5nSXNJblByb2dyZXNzID0gZmFsc2U7XHJcbiAgICBjb25zdCBncmlkT3B0aW9ucyA9IHtcclxuICAgICAgZWxlbWVudEF0dHI6IHtjbGFzczogJ2Fwcy1kaXNwbGF5LW1hbmFnZXInfSxcclxuICAgICAgZGF0YVNvdXJjZToge1xyXG4gICAgICAgIHN0b3JlOiBuZXcgRGV2RXhwcmVzcy5kYXRhLkN1c3RvbVN0b3JlKHtcclxuICAgICAgICAgIGtleTogJ1VzZXJJZCcsXHJcbiAgICAgICAgICBsb2FkTW9kZTogJ3JhdycsXHJcbiAgICAgICAgICBsb2FkOiAoKSA9PiBsb2FkRGF0YVByb21pc2UsXHJcbiAgICAgICAgICB1cGRhdGU6IChrZXksIHZhbHVlczogeyBbZGlzcGxheUlkOiBudW1iZXJdOiBib29sZWFuIH0pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgdG9SZW1vdmU6IG51bWJlcltdID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IHRvQWRkOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgICAgICAgICBjb25zdCB0aGVyZUlzQ3VycmVudFVwZGF0aW5nID0gdXBkYXRpbmdJc0luUHJvZ3Jlc3M7XHJcblxyXG4gICAgICAgICAgICB1cGRhdGluZ0lzSW5Qcm9ncmVzcyA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBkaXNwbGF5SWRzID0gT2JqZWN0LmtleXModmFsdWVzKTtcclxuXHJcbiAgICAgICAgICAgIGRpc3BsYXlJZHMuZm9yRWFjaCgoaWQpID0+IHtcclxuICAgICAgICAgICAgICBpZiAodmFsdWVzW2lkXSkge1xyXG4gICAgICAgICAgICAgICAgdG9BZGQucHVzaChwYXJzZUludChpZCkpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0b1JlbW92ZS5wdXNoKHBhcnNlSW50KGlkKSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIE5PVEU6IG5vdGlmeSBhYm91dCBzdWNjZXNzZnVsIHJlcXVlc3Qgb25seSBmb3IgdGhlIGZpcnN0IHJlcXVlc3QgaW4gdGhlIHF1ZXVlXHJcbiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHsgdXBkYXRpbmdJc0luUHJvZ3Jlc3MgPSBmYWxzZTsgfSwgMCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gc2VuZFJlcXVlc3QodGhpcy51cGRhdGVEYXRhVXJsLCAncHV0Jywge1xyXG4gICAgICAgICAgICAgIHVzZXJJZDoga2V5LFxyXG4gICAgICAgICAgICAgIGRpc3BsYXlzVG9SZW1vdmU6IHRvUmVtb3ZlLFxyXG4gICAgICAgICAgICAgIGRpc3BsYXlzVG9BZGQ6IHRvQWRkXHJcbiAgICAgICAgICAgIH0sICF0aGVyZUlzQ3VycmVudFVwZGF0aW5nKS5wcm9taXNlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSxcclxuICAgICAgaGVpZ2h0OiAnMTAwJScsXHJcbiAgICAgIHNlbGVjdGlvbjoge1xyXG4gICAgICAgIG1vZGU6ICdub25lJ1xyXG4gICAgICB9LFxyXG4gICAgICBhbGxvd0NvbHVtblJlc2l6aW5nOiB0cnVlLFxyXG4gICAgICBncm91cGluZzoge1xyXG4gICAgICAgIGNvbnRleHRNZW51RW5hYmxlZDogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBncm91cFBhbmVsOiB7XHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICByZW1vdGVPcGVyYXRpb25zOiBmYWxzZSxcclxuICAgICAgZWRpdGluZzoge1xyXG4gICAgICAgIGFsbG93VXBkYXRpbmc6IHRydWUsXHJcbiAgICAgICAgbW9kZTogJ2NlbGwnLFxyXG4gICAgICAgIHJlZnJlc2hNb2RlOiAncmVwYWludCdcclxuICAgICAgfVxyXG4gICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuUHJvcGVydGllcztcclxuXHJcbiAgICBjb25zdCBhZGRpdGlvbmFsT3B0aW9ucyA9IHtcclxuICAgICAgZXhwb3J0RmlsZU5hbWU6ICdEaXNwbGF5TWFuYWdlbWVudCcsXHJcbiAgICAgIHN1bW1hcnlDb2x1bW46ICdVc2VyTmFtZSdcclxuICAgIH0gYXMgSUdyaWRBZGRpdGlvbmFsT3B0aW9ucztcclxuXHJcbiAgICBsZXQgZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG4gICAgaWYgKHRoaXMuaXNTdGFuZGFsb25lUGFnZSkge1xyXG4gICAgICBncmlkID0gY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkKHRoaXMuJGNvbnRhaW5lciwgZ3JpZE9wdGlvbnMsIGFkZGl0aW9uYWxPcHRpb25zLCB0aGlzLnBhZ2VUaXRsZSwgJycsIHRydWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZ3JpZCA9IGNyZWF0ZURlZmF1bHRHcmlkKHRoaXMuJGNvbnRhaW5lciwge1xyXG4gICAgICAgIG9wdGlvbnM6IGdyaWRPcHRpb25zLFxyXG4gICAgICAgIHN1bW1hcnlDb2x1bW46IGFkZGl0aW9uYWxPcHRpb25zLnN1bW1hcnlDb2x1bW4sXHJcbiAgICAgICAgdGl0bGU6IHRoaXMucGFnZVRpdGxlLFxyXG4gICAgICAgIGlzRnVsbFNjcmVlbjogZmFsc2UsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi9EYXRhL1JlcXVlc3QnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUGluZ1Jlc3VsdCB7XHJcbiAgaXNBdXRoZW50aWNhdGVkOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElTZXNzaW9uTm90aWZpZXJPcHRpb25zIHtcclxuICBzZXNzaW9uRXhwaXJlVGltZU1zOiBudW1iZXI7XHJcbiAgZGlzcGxheUR1cmF0aW9uTXM6IG51bWJlcjtcclxuICBzZXNzaW9uUGluZ1VybDogc3RyaW5nO1xyXG4gIGxvZ291dFVybDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU2Vzc2lvbk5vdGlmaWVyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IHNlc3Npb25FeHBpcmVUaW1lTXM6IG51bWJlcjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRpc3BsYXlEdXJhdGlvbk1zOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uUGluZ1VybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nb3V0VXJsOiBzdHJpbmc7XHJcblxyXG4gIHByaXZhdGUgd2F0aW5nVGltZW91dElkOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBjb3VudGVySW50ZXJ2YWxJZDogbnVtYmVyO1xyXG4gIHByaXZhdGUgcGluZ0ludGVydmFsSWQ6IG51bWJlcjtcclxuICBwcml2YXRlIGV4cGlyYXRpb25UaW1lOiBEYXRlO1xyXG4gIHByaXZhdGUgJHRleHRDb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIGNvbnRpbnVlckJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbjtcclxuICBwcml2YXRlIG9rQnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uO1xyXG4gIHByaXZhdGUgbG9nb3V0QnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uO1xyXG5cclxuICBwcml2YXRlIF9wb3B1cDogRGV2RXhwcmVzcy51aS5keFBvcHVwO1xyXG4gIHByaXZhdGUgZ2V0IHBvcHVwKCk6IERldkV4cHJlc3MudWkuZHhQb3B1cCB7XHJcbiAgICBpZiAoIXRoaXMuX3BvcHVwKSB7XHJcbiAgICAgIHRoaXMuX3BvcHVwID0gdGhpcy5jcmVhdGVQb3B1cCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9wb3B1cDtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElTZXNzaW9uTm90aWZpZXJPcHRpb25zKSB7XHJcbiAgICB0aGlzLnNlc3Npb25FeHBpcmVUaW1lTXMgPSBvcHRpb25zLnNlc3Npb25FeHBpcmVUaW1lTXM7XHJcbiAgICB0aGlzLmRpc3BsYXlEdXJhdGlvbk1zID0gb3B0aW9ucy5kaXNwbGF5RHVyYXRpb25NcztcclxuICAgIHRoaXMuc2Vzc2lvblBpbmdVcmwgPSBvcHRpb25zLnNlc3Npb25QaW5nVXJsO1xyXG4gICAgdGhpcy5sb2dvdXRVcmwgPSBvcHRpb25zLmxvZ291dFVybDtcclxuXHJcbiAgICB0aGlzLnBpbmdTZXNzaW9uSWZUYWJJc0FjdGl2ZSA9IHRoaXMucGluZ1Nlc3Npb25JZlRhYklzQWN0aXZlLmJpbmQodGhpcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzZXQoKSB7XHJcbiAgICB0aGlzLmNsZWFyVGltZW91dHNBbmRJbnRlcnZhbHMoKTtcclxuXHJcbiAgICB0aGlzLnBvcHVwPy5oaWRlKCk7XHJcblxyXG4gICAgdGhpcy5leHBpcmF0aW9uVGltZSA9IHRoaXMuZ2V0RXhwaXJhdGlvblRpbWUoKTtcclxuXHJcbiAgICB0aGlzLndhdGluZ1RpbWVvdXRJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5zaG93Tm90aWZpY2F0aW9uKCk7XHJcbiAgICB9LCBNYXRoLm1heCh0aGlzLnNlc3Npb25FeHBpcmVUaW1lTXMgLSB0aGlzLmRpc3BsYXlEdXJhdGlvbk1zLCAwKSk7XHJcblxyXG4gICAgdGhpcy5waW5nSW50ZXJ2YWxJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgIHRoaXMucGluZ1Nlc3Npb25JZlRhYklzQWN0aXZlKCk7XHJcbiAgICB9LCA2MCAqIDEwMDApO1xyXG5cclxuICAgICQoZG9jdW1lbnQpLm9uKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5waW5nU2Vzc2lvbklmVGFiSXNBY3RpdmUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLmNsZWFyVGltZW91dHNBbmRJbnRlcnZhbHMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2hvd05vdGlmaWNhdGlvbigpIHtcclxuICAgIHRoaXMucG9wdXA/LnNob3coKTtcclxuXHJcbiAgICB0aGlzLmNsZWFyVGltZW91dHNBbmRJbnRlcnZhbHMoKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZVBvcHVwQ29udGVudCgpO1xyXG4gICAgdGhpcy5jb3VudGVySW50ZXJ2YWxJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlUG9wdXBDb250ZW50KCk7XHJcbiAgICB9LCAxMDAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJUaW1lb3V0c0FuZEludGVydmFscygpIHtcclxuICAgIGlmICh0aGlzLndhdGluZ1RpbWVvdXRJZCkge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy53YXRpbmdUaW1lb3V0SWQpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY291bnRlckludGVydmFsSWQpIHtcclxuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmNvdW50ZXJJbnRlcnZhbElkKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBpbmdJbnRlcnZhbElkKSB7XHJcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5waW5nSW50ZXJ2YWxJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgJChkb2N1bWVudCkub2ZmKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5waW5nU2Vzc2lvbklmVGFiSXNBY3RpdmUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRFeHBpcmF0aW9uVGltZSgpOiBEYXRlIHtcclxuICAgIGNvbnN0IGV4cGlyYXRpb25UaW1lID0gbmV3IERhdGUoKTtcclxuICAgIGV4cGlyYXRpb25UaW1lLnNldE1pbGxpc2Vjb25kcyhleHBpcmF0aW9uVGltZS5nZXRNaWxsaXNlY29uZHMoKSArIHRoaXMuc2Vzc2lvbkV4cGlyZVRpbWVNcyk7XHJcblxyXG4gICAgcmV0dXJuIGV4cGlyYXRpb25UaW1lO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVQb3B1cCgpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKS5keFBvcHVwKHtcclxuICAgICAgdGl0bGU6ICdTZXNzaW9uIEV4cGlyaW5nJyxcclxuICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXHJcbiAgICAgIHJlc2l6ZUVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBzaG93Q2xvc2VCdXR0b246IGZhbHNlLFxyXG4gICAgICBkcmFnRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIG1heEhlaWdodDogMTkwLFxyXG4gICAgICBtYXhXaWR0aDogMzcwLFxyXG4gICAgICB2aXNpYmxlOiBmYWxzZSxcclxuICAgICAgY29udGVudFRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy4kdGV4dENvbnRhaW5lciA9ICQoJzxzcGFuIC8+Jyk7XHJcbiAgICAgICAgdGhpcy4kdGV4dENvbnRhaW5lci5hcHBlbmQodGhpcy5nZXRDb3VudGVyVGV4dCgpKTtcclxuICAgICAgICBjb25zdCAkY29udGFpbmVyID0gJCgnPGRpdiAvPicpLmFwcGVuZCh0aGlzLiR0ZXh0Q29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuICRjb250YWluZXI7XHJcbiAgICAgIH0sXHJcbiAgICAgIHRvb2xiYXJJdGVtczogW3tcclxuICAgICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgIHR5cGU6ICdkZWZhdWx0JyxcclxuICAgICAgICAgIHRleHQ6ICdDb250aW51ZSBzZXNzaW9uJyxcclxuICAgICAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB0aGlzLmNvbnRpbnVlckJ1dHRvbiA9IGUuY29tcG9uZW50LFxyXG4gICAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hTZXNzaW9uKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgICAgfSwge1xyXG4gICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgdHlwZTogJ2RlZmF1bHQnLFxyXG4gICAgICAgICAgdGV4dDogJ1JlbG9hZCBwYWdlJyxcclxuICAgICAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB0aGlzLm9rQnV0dG9uID0gZS5jb21wb25lbnQsXHJcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgIHRleHQ6ICdMb2cgT3V0JyxcclxuICAgICAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB0aGlzLmxvZ291dEJ1dHRvbiA9IGUuY29tcG9uZW50LFxyXG4gICAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ091dCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfV0sXHJcbiAgICB9KS5hcHBlbmRUbygkKGRvY3VtZW50LmJvZHkpKS5keFBvcHVwKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDb3VudGVyVGV4dCgpOiBKUXVlcnkge1xyXG4gICAgY29uc3QgcmVtYWluZWRTZWNvbmRzID0gTWF0aC5tYXgodGhpcy5nZXRTZWNvbmRzVG9FeHBpcmF0aW9uKCksIDApO1xyXG4gICAgaWYgKHJlbWFpbmVkU2Vjb25kcyA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gJCgnPHNwYW4gLz4nKS50ZXh0KCdZb3VyIHNlc3Npb24gaGFzIGJlZW4gZXhwaXJlZCcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgJHN0YXJ0VGV4dCA9ICQoJzxzcGFuIC8+JykudGV4dCgnWW91ciBzZXNzaW9uIHdpbGwgZXhwaXJlIGluICcpO1xyXG4gICAgICBjb25zdCAkY291bnRlciA9ICQoJzxzcGFuIC8+JykuYWRkQ2xhc3MoJ3Nlc3Npb24tbm90aWZpZXJfX2NvdW50ZXInKS50ZXh0KHJlbWFpbmVkU2Vjb25kcy50b0ZpeGVkKDApKTtcclxuICAgICAgY29uc3QgJGZpbmlzaFRleHQgPSAkKCc8c3BhbiAvPicpLnRleHQoJyBzZWNvbmRzJyk7XHJcblxyXG4gICAgICByZXR1cm4gJCgnPHNwYW4gLz4nKS5hcHBlbmQoJHN0YXJ0VGV4dCwgJGNvdW50ZXIsICRmaW5pc2hUZXh0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Vjb25kc1RvRXhwaXJhdGlvbigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuICh0aGlzLmV4cGlyYXRpb25UaW1lLmdldFRpbWUoKSAtIG5ldyBEYXRlKCkuZ2V0VGltZSgpKSAvIDEwMDA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlZnJlc2hTZXNzaW9uKCkge1xyXG4gICAgdGhpcy5yZXNldCgpO1xyXG5cclxuICAgIHNlbmRSZXF1ZXN0PElQaW5nUmVzdWx0Pih0aGlzLnNlc3Npb25QaW5nVXJsLCAnR0VUJywgbnVsbCwgZmFsc2UsIHsgbm90aWZ5RXJyb3I6IGZhbHNlIH0pLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICBpZiAoIXJlcy5pc0F1dGhlbnRpY2F0ZWQpIHtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgIH1cclxuICAgIH0pLmNhdGNoKCgpID0+IHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBpbmdTZXNzaW9uSWZUYWJJc0FjdGl2ZSgpIHtcclxuICAgIGlmIChkb2N1bWVudC5oaWRkZW4pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbmRSZXF1ZXN0PElQaW5nUmVzdWx0Pih0aGlzLnNlc3Npb25QaW5nVXJsLCAnR0VUJywgbnVsbCwgZmFsc2UsIHsgbm90aWZ5RXJyb3I6IGZhbHNlIH0pLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICBpZiAoIXJlcy5pc0F1dGhlbnRpY2F0ZWQpIHtcclxuICAgICAgICB0aGlzLnNldEV4cGlyZWQoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEV4cGlyZWQoKSB7XHJcbiAgICB0aGlzLmV4cGlyYXRpb25UaW1lID0gbmV3IERhdGUoKTtcclxuICAgIHRoaXMuc2hvd05vdGlmaWNhdGlvbigpO1xyXG4gICAgaWYgKHRoaXMucGluZ0ludGVydmFsSWQpIHtcclxuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnBpbmdJbnRlcnZhbElkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9nT3V0KCkge1xyXG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB0aGlzLmxvZ291dFVybDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlUG9wdXBDb250ZW50KCkge1xyXG4gICAgY29uc3QgaXNBbHJlYWR5RXhwaXJlZCA9IHRoaXMuZ2V0U2Vjb25kc1RvRXhwaXJhdGlvbigpIDw9IDA7XHJcblxyXG4gICAgdGhpcy4kdGV4dENvbnRhaW5lcj8uaHRtbCgnJykuYXBwZW5kKHRoaXMuZ2V0Q291bnRlclRleHQoKSk7XHJcbiAgICB0aGlzLm9rQnV0dG9uLm9wdGlvbigndmlzaWJsZScsIGlzQWxyZWFkeUV4cGlyZWQpO1xyXG4gICAgdGhpcy5jb250aW51ZXJCdXR0b24ub3B0aW9uKCd2aXNpYmxlJywgIWlzQWxyZWFkeUV4cGlyZWQpO1xyXG4gICAgdGhpcy5sb2dvdXRCdXR0b24ub3B0aW9uKCd2aXNpYmxlJywgIWlzQWxyZWFkeUV4cGlyZWQpO1xyXG4gIH1cclxufVxyXG4iLCAiY29uc3QgR1JJRF9JTkRJQ0FUT1JfU1RBVEUgPSB7XHJcbiAgZWRpdDogJ2VkaXQnLFxyXG4gIHNhdmluZzogJ3NhdmluZycsXHJcbiAgc2F2ZWQ6ICdzYXZlZCdcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEdSSURfSU5ESUNBVE9SX1NUQVRFO1xyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUdyaWREYXRhTGF5ZXIgfSBmcm9tICcuLi8uLi9EYXRhL0luZGV4JztcclxuaW1wb3J0IHsgSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGUsIElHcmlkU3RhdGUsIElHcmlkRXh0ZW5kZWRDb2x1bW5TdGF0ZSwgR3JpZERhdGFDb2x1bW5EYXRhVHlwZSB9IGZyb20gJy4uLy4uLy4uL1dpZGdldHMvSUdyaWRTdGF0ZSc7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uLy4uLy4uL1V0aWxzL0luZGV4JztcclxuXHJcbmludGVyZmFjZSBJTG9hZGVkQ29sdW1ucyB7IFtkYXRhRmllbGQ6IHN0cmluZ106IGJvb2xlYW47IH1cclxuaW50ZXJmYWNlIElHcmlkQWRkaXRpb25hbENvbHVtblNldHRpbmdzIHsgW2RhdGFGaWVsZDogc3RyaW5nXTogSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGU7IH1cclxuaW50ZXJmYWNlIElDb2x1bW5XaWR0aHMgeyBbdmlzaWJsZUluZGV4OiBudW1iZXJdOiBudW1iZXIgfCBzdHJpbmc7IH1cclxuXHJcbmludGVyZmFjZSBJQ29sdW1uQ2FwdGlvbiB7XHJcbiAgZGF0YUZpZWxkOiBzdHJpbmc7XHJcbiAgY2FwdGlvbjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHcmlkU3RhdGVNYW5hZ2VyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICBwdWJsaWMgT1VUREFURV9DT0xVTU5TX0ZPVU5EX0VWRU5UID0gJ291dGRhdGVkLWNvbHVtbnMtZm91bmQtZXZlbnQnO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaWQ6IG51bWJlcjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWREYXRhTGF5ZXI6IElHcmlkRGF0YUxheWVyO1xyXG5cclxuICBwcml2YXRlIHN0YXRlTG9hZGVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBsb2FkZWRDb2x1bW5zOiBJTG9hZGVkQ29sdW1ucyA9IHt9O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nczogSUdyaWRBZGRpdGlvbmFsQ29sdW1uU2V0dGluZ3MgPSB7fTtcclxuXHJcbiAgcHJpdmF0ZSBsYXN0Q29sdW1uU2V0dGluZ3NTdHI6IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IoZ3JpZElkOiBudW1iZXIsIGdyaWREYXRhTGF5ZXI6IElHcmlkRGF0YUxheWVyKSB7XHJcbiAgICBzdXBlcigpO1xyXG5cclxuICAgIHRoaXMuaWQgPSBncmlkSWQ7XHJcbiAgICB0aGlzLmdyaWREYXRhTGF5ZXIgPSBncmlkRGF0YUxheWVyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGxvYWQoY2hlY2tPdXRkYXRlZENvbHVtbnM6IGJvb2xlYW4sIG91dGRhdGVkQ29sdW1uc0NhbGxiYWNrOiAoY29sdW1ucykgPT4gdm9pZCk6IEpRdWVyeVByb21pc2U8SUdyaWRTdGF0ZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZERhdGFMYXllci5nZXRHcmlkVmlld1NldHRpbmdzKHRoaXMuaWQpXHJcbiAgICAgIC50aGVuKChkYXRhOiBJR3JpZFN0YXRlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vbkRhdGFMb2FkZWQoZGF0YSk7XHJcblxyXG4gICAgICAgIGlmIChjaGVja091dGRhdGVkQ29sdW1ucykge1xyXG4gICAgICAgICAgdGhpcy5jaGVja0NvbHVtbnNSZWxldmFuY2UoZGF0YS5jb2x1bW5zLCBvdXRkYXRlZENvbHVtbnNDYWxsYmFjayk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2F2ZShzdGF0ZTogSUdyaWRTdGF0ZSwgc2F2aW5nQ2FsbGJhY2s/OiAoKSA9PiB2b2lkLCBzYXZlZENhbGxiYWNrPzogKCkgPT4gdm9pZCk6IElDb2x1bW5XaWR0aHMge1xyXG4gICAgY29uc3QgY29sdW1uV2lkdGhzOiBJQ29sdW1uV2lkdGhzID0ge307XHJcblxyXG4gICAgaWYgKCFzdGF0ZS5jb2x1bW5zKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0ZS5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICBjb25zdCBhZGRTZXR0aW5ncyA9IHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tjb2x1bW4uZGF0YUZpZWxkXTtcclxuXHJcbiAgICAgIGlmIChhZGRTZXR0aW5ncykge1xyXG4gICAgICAgIGNvbHVtbi5jYXB0aW9uID0gYWRkU2V0dGluZ3MuY2FwdGlvbjtcclxuICAgICAgICBjb2x1bW4udG9vbHRpcCA9IGFkZFNldHRpbmdzLnRvb2x0aXA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vTk9URTogaWYgREIgdGFibGUgaGFzIG5vIGRhdGEgaW4gYSBjb2x1bW4sIGRhdGEgZ3JpZCBjYW4ndCBpbmZlciBkYXRhIHR5cGUgYW5kIGRvZXNuJ3Qgc2V0IHRoZSBkYXRhVHlwZSBmaWVsZFxyXG4gICAgICBpZiAoIWNvbHVtbi5kYXRhVHlwZSkge1xyXG4gICAgICAgIGNvbHVtbi5kYXRhVHlwZSA9IEdyaWREYXRhQ29sdW1uRGF0YVR5cGUuRGVmYXVsdDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCEhY29sdW1uLndpZHRoICYmIGNvbHVtbi52aXNpYmxlKSB7XHJcbiAgICAgICAgY29sdW1uV2lkdGhzW2NvbHVtbi52aXNpYmxlSW5kZXhdID0gY29sdW1uLndpZHRoO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBjb2x1bW5TZXR0aW5nc1N0ciA9IEpTT04uc3RyaW5naWZ5KHN0YXRlLmNvbHVtbnMpO1xyXG5cclxuICAgIGlmICghdGhpcy5zdGF0ZUxvYWRlZCB8fCBjb2x1bW5TZXR0aW5nc1N0ciA9PT0gdGhpcy5sYXN0Q29sdW1uU2V0dGluZ3NTdHIpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sYXN0Q29sdW1uU2V0dGluZ3NTdHIgPSBjb2x1bW5TZXR0aW5nc1N0cjtcclxuXHJcbiAgICBpZiAoc2F2aW5nQ2FsbGJhY2spIHtcclxuICAgICAgc2F2aW5nQ2FsbGJhY2soKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmdyaWREYXRhTGF5ZXIudXBkYXRlR3JpZFZpZXdTZXR0aW5ncyh0aGlzLmlkLCBzdGF0ZSlcclxuICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIGlmIChzYXZlZENhbGxiYWNrKSB7XHJcbiAgICAgICAgICBzYXZlZENhbGxiYWNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gY29sdW1uV2lkdGhzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNoZWNrTmV3Q29sdW1ucyhzdGF0ZTogSUdyaWRTdGF0ZSk6IHN0cmluZ1tdIHtcclxuICAgIGNvbnN0IG5ld0NvbHVtbkZpZWxkczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICBpZiAoc3RhdGUuY29sdW1ucykge1xyXG4gICAgICBjb25zdCBuZXdDb2x1bW5zID0gc3RhdGUuY29sdW1ucy5maWx0ZXIoKGNvbHVtbikgPT4gIXRoaXMubG9hZGVkQ29sdW1uc1tjb2x1bW4uZGF0YUZpZWxkXSAmJiBjb2x1bW4udmlzaWJsZSk7XHJcblxyXG4gICAgICBpZiAobmV3Q29sdW1ucy5sZW5ndGgpIHtcclxuICAgICAgICBuZXdDb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICAgICAgbmV3Q29sdW1uRmllbGRzLnB1c2goY29sdW1uLmRhdGFGaWVsZCk7XHJcbiAgICAgICAgICB0aGlzLmxvYWRlZENvbHVtbnNbY29sdW1uLmRhdGFGaWVsZF0gPSB0cnVlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ld0NvbHVtbkZpZWxkcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDb2x1bW5DYXB0aW9ucygpOiBJQ29sdW1uQ2FwdGlvbltdIHtcclxuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3MpLm1hcCgoZGF0YUZpZWxkKSA9PiB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgZGF0YUZpZWxkLFxyXG4gICAgICAgIGNhcHRpb246IHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tkYXRhRmllbGRdLmNhcHRpb25cclxuICAgICAgfSBhcyBJQ29sdW1uQ2FwdGlvbjtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldENvbHVtbkNhcHRpb24oZGF0YUZpZWxkOiBzdHJpbmcsIGNhcHRpb246IHN0cmluZykge1xyXG4gICAgaWYgKCF0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3NbZGF0YUZpZWxkXSkge1xyXG4gICAgICB0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3NbZGF0YUZpZWxkXSA9IHsgY2FwdGlvbjogJycsIHRvb2x0aXA6ICcnIH07XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzW2RhdGFGaWVsZF0uY2FwdGlvbiA9IGNhcHRpb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q29sdW1uQWRkaXRpb25hbFNldHRpbmdzKGRhdGFGaWVsZDogc3RyaW5nKTogSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGUge1xyXG4gICAgcmV0dXJuIHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tkYXRhRmllbGRdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNoZWNrQ29sdW1uc1JlbGV2YW5jZShjb2x1bW5zOiBJR3JpZEV4dGVuZGVkQ29sdW1uU3RhdGVbXSwgY2FsbGJhY2s6IChvdXRkYXRlZENvbHVtbnM6IHN0cmluZ1tdKSA9PiB2b2lkKSB7XHJcbiAgICB0aGlzLmdyaWREYXRhTGF5ZXIuZ2V0Q29sdW1uc0J5UmVwb3J0SWQodGhpcy5pZClcclxuICAgICAgLnRoZW4oKGRhdGEpID0+IHtcclxuICAgICAgICBjb25zdCBhY3R1YWxDb2x1bW5zID0ge307XHJcblxyXG4gICAgICAgIGRhdGEuZm9yRWFjaCgoYykgPT4gYWN0dWFsQ29sdW1uc1tjLk5hbWVdID0gdHJ1ZSk7XHJcblxyXG4gICAgICAgIGNvbnN0IG91dGRhdGVkQ29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKChjKSA9PiAhYWN0dWFsQ29sdW1uc1tjLmRhdGFGaWVsZF0pLm1hcCgoYykgPT4gYy5kYXRhRmllbGQpO1xyXG5cclxuICAgICAgICBpZiAob3V0ZGF0ZWRDb2x1bW5zLmxlbmd0aCkge1xyXG4gICAgICAgICAgRGV2RXhwcmVzcy51aS5kaWFsb2cuY29uZmlybShgR3JpZCBzZXR0aW5ncyBjb250YWluIHNvbWUgY29sdW5tcyB3aGljaCBkb24ndCBleGlzdCBpbiB0aGUgZGF0YWJhc2UgdGFibGUgYW55bW9yZTpcclxuXHJcbiAgICAgICAgICAnJHtvdXRkYXRlZENvbHVtbnMuam9pbignLCAnKX0nLlxyXG5cclxuICAgICAgICAgIERvIHlvdSB3YW50IHRvIHJlbW92ZSB0aGVzZSBjb2x1bW5zIGZyb20gZ3JpZCBzZXR0aW5ncz9cclxuICAgICAgICAgIGAsICdSZW1vdmUgcmVkdW5kYW50IGNvbHVtbnM/JylcclxuICAgICAgICAgICAgLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICghcmVzKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBjYWxsYmFjayhvdXRkYXRlZENvbHVtbnMpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc2V0U2V0dGluZ3MoKTogSlF1ZXJ5UHJvbWlzZTxJR3JpZFN0YXRlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmlkRGF0YUxheWVyLnJlc2V0U2V0dGluZ3ModGhpcy5pZClcclxuICAgICAgLnRoZW4oKGRhdGEpID0+IHtcclxuICAgICAgICB0aGlzLm9uRGF0YUxvYWRlZChkYXRhKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkRhdGFMb2FkZWQoZGF0YTogSUdyaWRTdGF0ZSkge1xyXG4gICAgY29uc3QgbG9hZGVkR3JpZFN0YXRlQ29sdW1ucyA9IGRhdGEgJiYgZGF0YS5jb2x1bW5zO1xyXG4gICAgbGV0IHZpc2libGVJbmRleENvdW50ZXIgPSAwO1xyXG5cclxuICAgIHRoaXMuc3RhdGVMb2FkZWQgPSB0cnVlO1xyXG5cclxuICAgIGlmIChsb2FkZWRHcmlkU3RhdGVDb2x1bW5zKSB7XHJcbiAgICAgIHRoaXMubG9hZGVkQ29sdW1ucyA9IHt9O1xyXG5cclxuICAgICAgbG9hZGVkR3JpZFN0YXRlQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgICB0aGlzLmxvYWRlZENvbHVtbnNbY29sdW1uLmRhdGFGaWVsZF0gPSB0cnVlO1xyXG5cclxuICAgICAgICAvLyBOT1RFOiBzZXQgdmlzaWJsZSBpbmRleGVzIGlmIHRoZXkgaGF2ZSBub3QgYmVlbiBzZXQuIEl0J3MgcmVxdWlyZWQgZm9yIHByb3BlciBkeERhdGFHcmlkIGFwcGVhcmFuY2UuXHJcbiAgICAgICAgaWYgKGNvbHVtbi52aXNpYmxlICYmIGNvbHVtbi52aXNpYmxlSW5kZXggPT09IG51bGwpIHtcclxuICAgICAgICAgIGNvbHVtbi52aXNpYmxlSW5kZXggPSB2aXNpYmxlSW5kZXhDb3VudGVyKys7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBOT1RFOiByZW1vdmUgZW1wdHkgdmFsdWVzIGJlY2F1c2UgdGhleSBsZWFkIHRvIHdyb25nIGR4RGF0YUdyaWQgYmVoYXZpb3JcclxuICAgICAgICBPYmplY3Qua2V5cyhjb2x1bW4pLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGNvbHVtbltrZXldID09PSBudWxsIHx8IGNvbHVtbltrZXldID09PSB2b2lkIDAgfHwgY29sdW1uW2tleV0gPT09ICcnKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBjb2x1bW5ba2V5XTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgYWRkaXRpb25hbFNldHRpbmdzID0gdGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzW2NvbHVtbi5kYXRhRmllbGRdO1xyXG5cclxuICAgICAgICBpZiAoIWFkZGl0aW9uYWxTZXR0aW5ncykge1xyXG4gICAgICAgICAgdGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzW2NvbHVtbi5kYXRhRmllbGRdID0ge1xyXG4gICAgICAgICAgICBjYXB0aW9uOiBjb2x1bW4uY2FwdGlvbixcclxuICAgICAgICAgICAgdG9vbHRpcDogY29sdW1uLnRvb2x0aXBcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGFkZGl0aW9uYWxTZXR0aW5ncy5jYXB0aW9uID0gY29sdW1uLmNhcHRpb247XHJcbiAgICAgICAgICBhZGRpdGlvbmFsU2V0dGluZ3MudG9vbHRpcCA9IGNvbHVtbi50b29sdGlwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTk9URTogcmVtb3ZlIGNvbHVtbnMgd2hpY2ggZHhEYXRhR3JpZCBkb2Vzbid0IGV4cGVjdC5cclxuICAgICAgICBkZWxldGUgY29sdW1uLmNhcHRpb247XHJcbiAgICAgICAgZGVsZXRlIGNvbHVtbi50b29sdGlwO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxhc3RDb2x1bW5TZXR0aW5nc1N0ciA9IEpTT04uc3RyaW5naWZ5KGRhdGEuY29sdW1ucyk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZlbnVtIEdyaWRNb2RlIHtcclxuICBWaWV3ID0gMSxcclxuICBFZGl0ID0gMlxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBHcmlkTW9kZTtcclxuIiwgIlx1RkVGRmltcG9ydCBHcmlkTW9kZSBmcm9tICcuLi9QYWdlcy9HcmlkL01vZGUnO1xyXG5pbXBvcnQgeyBJUmVwb3J0UGFyYW1zIH0gZnJvbSAnLi4vSVJlcG9ydFBhcmFtcyc7XHJcbmltcG9ydCB7IElHcmlkU3RhdGUgfSBmcm9tICcuLi8uLi9XaWRnZXRzL0lHcmlkU3RhdGUnO1xyXG5pbXBvcnQgeyBJQ29sdW1uTWV0YURhdGEgfSBmcm9tICcuLi9Db2x1bW5NZXRhRGF0YSc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHsgY3JlYXRlRHhEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vRGF0YS9EeERhdGFTb3VyY2UnO1xyXG5pbXBvcnQgeyBFeGNlcHRpb25UeXBlIH0gZnJvbSAnLi4vLi4vRGF0YS9FeGNlcHRpb25UeXBlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWREYXRhTGF5ZXIge1xyXG4gIGdldENvbHVtbnNCeVJlcG9ydElkKHJlcG9ydElkOiBudW1iZXIpOiBKUXVlcnlEZWZlcnJlZDxJQ29sdW1uTWV0YURhdGFbXT47XHJcbiAgZ2V0R3JpZERhdGFTb3VyY2UocmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zLCBncmlkTW9kZTogR3JpZE1vZGUsIHNob3dBbGxEYXRhSW5FZGl0OiBib29sZWFuKTogRGV2RXhwcmVzcy5kYXRhLkN1c3RvbVN0b3JlPGFueSwgYW55PjtcclxuICByZXNldFNldHRpbmdzKHJlcG9ydElkOiBudW1iZXIpOiBKUXVlcnlEZWZlcnJlZDxJR3JpZFN0YXRlPjtcclxuICB1cGRhdGVHcmlkVmlld1NldHRpbmdzKHJlcG9ydElkOiBudW1iZXIsIHN0YXRlOiBJR3JpZFN0YXRlKTogSlF1ZXJ5RGVmZXJyZWQ8YW55PjtcclxuICBnZXRHcmlkVmlld1NldHRpbmdzKHJlcG9ydElkOiBudW1iZXIpOiBKUXVlcnlEZWZlcnJlZDxJR3JpZFN0YXRlPjtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGNyZWF0ZUdyaWREYXRhTGF5ZXI6IChncmlkUmVwb3J0Q29udHJvbGxlclVybDogc3RyaW5nKSA9PiBJR3JpZERhdGFMYXllciA9IChncmlkUmVwb3J0Q29udHJvbGxlclVybDogc3RyaW5nKSA9PiB7XHJcbiAgY29uc3QgdXJscyA9IHtcclxuICAgIGdyaWRSZXN1bHQ6IGAke2dyaWRSZXBvcnRDb250cm9sbGVyVXJsfS9HcmlkVmlld1Jlc3VsdGAsXHJcbiAgICBnZXRDb2x1bW5zQnlSZXBvcnRJZDogYCR7Z3JpZFJlcG9ydENvbnRyb2xsZXJVcmx9L0dldERiVGFibGVGaWVsZHNgLFxyXG4gICAgcmVzZXRHcmlkU2V0dGluZ3M6IGAke2dyaWRSZXBvcnRDb250cm9sbGVyVXJsfS9SZXNldEdyaWRWaWV3U2V0dGluZ3NgLFxyXG4gICAgdXBkYXRlR3JpZFZpZXdTZXR0aW5nczogYCR7Z3JpZFJlcG9ydENvbnRyb2xsZXJVcmx9L1VwZGF0ZUdyaWRWaWV3U2V0dGluZ3NgLFxyXG4gICAgZ2V0R3JpZFZpZXdTZXR0aW5nczogYCR7Z3JpZFJlcG9ydENvbnRyb2xsZXJVcmx9L0dldEdyaWRWaWV3U2V0dGluZ3NgXHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGdldEdyaWREYXRhU291cmNlKHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcywgZ3JpZE1vZGU6IEdyaWRNb2RlLCBzaG93QWxsRGF0YUluRWRpdCkge1xyXG4gICAgICByZXR1cm4gY3JlYXRlRHhEYXRhU291cmNlKHtcclxuICAgICAgICBsb2FkUGFyYW1zOiB7XHJcbiAgICAgICAgICBpZDogcmVwb3J0UGFyYW1zLlJlcG9ydElkLFxyXG4gICAgICAgICAgYXBwTmFtZTogcmVwb3J0UGFyYW1zLkFwcE5hbWUsXHJcbiAgICAgICAgICBncmlkTW9kZSxcclxuICAgICAgICAgIHJvd3NMaW1pdDogZ3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQgJiYgIXNob3dBbGxEYXRhSW5FZGl0ID8gMTUgOiBudWxsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBsb2FkVXJsOiB1cmxzLmdyaWRSZXN1bHQsXHJcbiAgICAgICAgZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlXHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRDb2x1bW5zQnlSZXBvcnRJZDogKHJlcG9ydElkOiBudW1iZXIpID0+IHtcclxuICAgICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHVybHMuZ2V0Q29sdW1uc0J5UmVwb3J0SWQsICdwb3N0JywgeyBpZDogcmVwb3J0SWQgfSwgZmFsc2UsIHtcclxuICAgICAgICBkYXRhVHlwZTogJ2pzb24nXHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICByZXNldFNldHRpbmdzOiAocmVwb3J0SWQ6IG51bWJlcikgPT4ge1xyXG4gICAgICByZXR1cm4gc2VuZFJlcXVlc3QodXJscy5yZXNldEdyaWRTZXR0aW5ncywgJ3Bvc3QnLCB7IGlkOiByZXBvcnRJZCB9LCBmYWxzZSwgeyBkYXRhVHlwZTogJ2pzb24nIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICB1cGRhdGVHcmlkVmlld1NldHRpbmdzOiAocmVwb3J0SWQ6IG51bWJlciwgc3RhdGU6IElHcmlkU3RhdGUpID0+IHtcclxuICAgICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHVybHMudXBkYXRlR3JpZFZpZXdTZXR0aW5ncywgJ3Bvc3QnLCB7XHJcbiAgICAgICAgaWQ6IHJlcG9ydElkLCBjb2x1bW5zU2V0dGluZ3M6IEpTT04uc3RyaW5naWZ5KHN0YXRlLmNvbHVtbnMpXHJcbiAgICAgIH0sIGZhbHNlLCB7XHJcbiAgICAgICAgZGF0YVR5cGU6ICdqc29uJ1xyXG4gICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgZ2V0R3JpZFZpZXdTZXR0aW5nczogKHJlcG9ydElkOiBudW1iZXIpID0+IHtcclxuICAgICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHVybHMuZ2V0R3JpZFZpZXdTZXR0aW5ncywgJ3Bvc3QnLCB7IGlkOiByZXBvcnRJZCB9LCBmYWxzZSwge1xyXG4gICAgICAgIGRhdGFUeXBlOiAnanNvbidcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfTtcclxufTtcclxuXHJcbmNvbnN0IGdldFVzZXJGcmllbmRseUVycm9yTWVzc2FnZSA9IChleGNlcHRpb25UeXBlOiBFeGNlcHRpb25UeXBlKTogc3RyaW5nID0+IHtcclxuICBzd2l0Y2ggKGV4Y2VwdGlvblR5cGUpIHtcclxuICAgIGNhc2UgRXhjZXB0aW9uVHlwZS5TcWxFeGNlcHRpb246XHJcbiAgICAgIHJldHVybiAnV2UgYXR0ZW1wdGVkIHRvIGV4ZWN1dGUgdGhlIGRhdGEgcXVlcnkgaG93ZXZlciBpdCBhcHBlYXJzIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBkYXRhIHNvdXJjZS4gUGxlYXNlIGNvbnRhY3QgdGhlIHJlcG9ydCBhdXRob3IgdG8gY29uZmlybSB0aGUgZGF0YSByZXF1aXJlbWVudHMuJztcclxuXHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG59O1xyXG4iLCAiZXhwb3J0IGludGVyZmFjZSBJUmVmcmVzaE9wdGlvbnMge1xyXG4gIGNhbGxiYWNrOiAoKSA9PiB2b2lkO1xyXG4gIGVsYXBzZWRDYWxsYmFjazogKHRpbWU6IG51bWJlcikgPT4gdm9pZDtcclxufVxyXG5cclxuY29uc3QgdXBkYXRlVGltZW91dCA9IDEwMDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlZnJlc2hUaW1lciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjYWxsYmFjazogKCkgPT4gdm9pZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGVsYXBzZWRDYWxsYmFjazogKHRpbWU6IG51bWJlcikgPT4gdm9pZDtcclxuICBwcml2YXRlIGFjdGl2ZVRpbWVySWQ6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBjdXJyZW50SW50ZXJ2YWw6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBsYXN0U3RhdGVDaGVja2VkOiBEYXRlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJUmVmcmVzaE9wdGlvbnMpIHtcclxuICAgIHRoaXMuZWxhcHNlZENhbGxiYWNrID0gb3B0aW9ucy5lbGFwc2VkQ2FsbGJhY2s7XHJcbiAgICB0aGlzLmNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjaztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGFydChpbnRlcnZhbDogbnVtYmVyKSB7XHJcbiAgICBpZiAoaW50ZXJ2YWwgPD0gMCkge1xyXG4gICAgICB0aGlzLmNhbGxiYWNrKCk7XHJcblxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sYXN0U3RhdGVDaGVja2VkID0gbmV3IERhdGUoKTtcclxuICAgIHRoaXMuY3VycmVudEludGVydmFsID0gaW50ZXJ2YWw7XHJcblxyXG4gICAgY29uc3QgdGltZXJJZCA9IHRoaXMuYWN0aXZlVGltZXJJZCA9IE1hdGgucmFuZG9tKCk7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50SW50ZXJ2YWwgPCAwKSB7XHJcbiAgICAgIHRoaXMuZWxhcHNlZENhbGxiYWNrKHRoaXMuY3VycmVudEludGVydmFsKTtcclxuXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnRpY2tUaW1lckZ1bmN0aW9uKHRpbWVySWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRyaWdnZXJDaGFuZ2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxhc3RTdGF0ZUNoZWNrZWQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgdGhpcy5jYWxsYmFjaygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKSB7XHJcbiAgICAvL0NoYW5nZSB0aW1lcklkIGZvciBicmVha2luZyByZWZyZXNoIHByb2Nlc3MgaW4gbmV4dCBzZXRUaW1lb3V0IGNhbGwuIGRrbGltYW5vdlxyXG4gICAgdGhpcy5hY3RpdmVUaW1lcklkLS07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRpY2tUaW1lckZ1bmN0aW9uKHRpbWVySWQ6IG51bWJlcikge1xyXG4gICAgaWYgKHRpbWVySWQgIT09IHRoaXMuYWN0aXZlVGltZXJJZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcclxuICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgbGV0IHRpbWVUb1VwZGF0ZTogbnVtYmVyID0gdGhpcy5jdXJyZW50SW50ZXJ2YWwgLSAobmV3IERhdGUoKSAtIHRoaXMubGFzdFN0YXRlQ2hlY2tlZCk7XHJcbiAgICBpZiAodGltZVRvVXBkYXRlIDw9IDApIHtcclxuICAgICAgdGltZVRvVXBkYXRlID0gdGhpcy5jdXJyZW50SW50ZXJ2YWwgKyA5OTk7XHJcbiAgICAgIHRoaXMuY2FsbGJhY2soKTtcclxuICAgICAgdGhpcy5sYXN0U3RhdGVDaGVja2VkID0gbmV3IERhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVsYXBzZWRDYWxsYmFjayh0aW1lVG9VcGRhdGUpO1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy50aWNrVGltZXJGdW5jdGlvbih0aW1lcklkKSwgdXBkYXRlVGltZW91dCk7XHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQgUmVmcmVzaENvbXBvbmVudCBmcm9tICcuL0luZGV4JztcclxuXHJcbmNvbnN0IGRlZmF1bHRSZWZyZXNoRW50cmllczogSVJlZnJlc2hFbnRyeVtdID0gW3tcclxuICB0aW1lb3V0OiAwLFxyXG4gIHRleHQ6ICdyZWZyZXNoIG5vdycsXHJcbiAgcmVmcmVzaFRlbXBsYXRlOiAnJyxcclxufSwge1xyXG4gIHRpbWVvdXQ6IDE1ICogMTAwMCxcclxuICB0ZXh0OiAnMTUgc2VjJyxcclxuICByZWZyZXNoVGVtcGxhdGU6ICdBdXRvIFVwZGF0ZSAoJSknLFxyXG59LCB7XHJcbiAgdGltZW91dDogMzAgKiAxMDAwLFxyXG4gIHRleHQ6ICczMCBzZWMnLFxyXG4gIHJlZnJlc2hUZW1wbGF0ZTogJ0F1dG8gVXBkYXRlICglKScsXHJcbn0sIHtcclxuICB0aW1lb3V0OiA2MCAqIDEwMDAsXHJcbiAgdGV4dDogJzEgbWluJyxcclxuICByZWZyZXNoVGVtcGxhdGU6ICdBdXRvIFVwZGF0ZSAoJSknLFxyXG59LCB7XHJcbiAgdGltZW91dDogMTgwICogMTAwMCxcclxuICB0ZXh0OiAnMyBtaW4nLFxyXG4gIHJlZnJlc2hUZW1wbGF0ZTogJ0F1dG8gVXBkYXRlICglKScsXHJcbn0sIHtcclxuICB0aW1lb3V0OiAzMDAgKiAxMDAwLFxyXG4gIHRleHQ6ICc1IG1pbicsXHJcbiAgcmVmcmVzaFRlbXBsYXRlOiAnQXV0byBVcGRhdGUgKCUpJyxcclxufSwge1xyXG4gIHRpbWVvdXQ6IDYwMCAqIDEwMDAsXHJcbiAgdGV4dDogJzEwIG1pbicsXHJcbiAgcmVmcmVzaFRlbXBsYXRlOiAnQXV0byBVcGRhdGUgKCUpJyxcclxufSwge1xyXG4gIHRpbWVvdXQ6IC0xLFxyXG4gIHRleHQ6ICdvZmYnLFxyXG4gIHJlZnJlc2hUZW1wbGF0ZTogJ0F1dG8gVXBkYXRlOiBvZmYnLFxyXG4gIGlzRGVmYXVsdDogdHJ1ZVxyXG59XTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVJlZnJlc2hFbnRyeSB7XHJcbiAgdGltZW91dDogbnVtYmVyLFxyXG4gIHRleHQ6IHN0cmluZyxcclxuICByZWZyZXNoVGVtcGxhdGU6IHN0cmluZyxcclxuICBpc0RlZmF1bHQ/OiBib29sZWFuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlZnJlc2hCdXR0b24ge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZHJvcERvd25CdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b247XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb250ZXh0TWVudTogRGV2RXhwcmVzcy51aS5keENvbnRleHRNZW51O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVmcmVzaENvbXBvbmVudDogUmVmcmVzaENvbXBvbmVudDtcclxuICBwcml2YXRlIG1lbnVJc09wZW5lZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgc2VsZWN0ZWRFbnRyeTogSVJlZnJlc2hFbnRyeTtcclxuXHJcbiAgY29uc3RydWN0b3IoJHRhcmdldDogSlF1ZXJ5LCBjYWxsYmFjazogKCkgPT4gdm9pZCwgcmVmcmVzaEVudHJpZXM6IElSZWZyZXNoRW50cnlbXSB8IG51bGwgPSBkZWZhdWx0UmVmcmVzaEVudHJpZXMpIHtcclxuICAgIHRoaXMucmVmcmVzaENvbXBvbmVudCA9IG5ldyBSZWZyZXNoQ29tcG9uZW50KHsgY2FsbGJhY2ssIGVsYXBzZWRDYWxsYmFjazogKGUpID0+IHRoaXMuZWxhcHNlZENhbGxiYWNrKGUpIH0pO1xyXG4gICAgdGhpcy5zZWxlY3RlZEVudHJ5ID0gcmVmcmVzaEVudHJpZXMuZmluZCgoZSkgPT4gZS5pc0RlZmF1bHQpIHx8IHJlZnJlc2hFbnRyaWVzLmZpbHRlcigoZSkgPT4gISFlLnRpbWVvdXQpWzBdO1xyXG5cclxuICAgIHRoaXMuY29udGV4dE1lbnUgPSAkKCc8ZGl2IC8+JykuZHhDb250ZXh0TWVudSh7XHJcbiAgICAgIGRhdGFTb3VyY2U6IHJlZnJlc2hFbnRyaWVzLFxyXG4gICAgICB0YXJnZXQ6ICR0YXJnZXQsXHJcbiAgICAgIHBvc2l0aW9uOiB7IG15OiAncmlnaHQgdG9wJywgYXQ6ICdyaWdodCBib3R0b20nIH0sXHJcbiAgICAgIG9uSXRlbUNsaWNrOiAoZSkgPT4ge1xyXG4gICAgICAgIGlmKCEoZS5pdGVtRGF0YSBhcyBhbnkpLnRpbWVvdXQpIHtcclxuICAgICAgICAgIGUuY29tcG9uZW50LmhpZGUoKTtcclxuICAgICAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRW50cnkgPSBlLml0ZW1EYXRhIGFzIElSZWZyZXNoRW50cnk7XHJcbiAgICAgICAgICBlLmNvbXBvbmVudC5zZWxlY3RJdGVtKHRoaXMuc2VsZWN0ZWRFbnRyeSBhcyBhbnkpO1xyXG4gICAgICAgICAgdGhpcy5yZWZyZXNoQ29tcG9uZW50LnN0YXJ0KChlLml0ZW1EYXRhIGFzIGFueSkudGltZW91dCk7XHJcbiAgICAgICAgICBlLmNvbXBvbmVudC5oaWRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvbkhpZGRlbjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubWVudUlzT3BlbmVkID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uU2hvd246IChlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tZW51SXNPcGVuZWQgPSB0cnVlO1xyXG4gICAgICAgIChlLmNvbXBvbmVudCBhcyBhbnkpLml0ZW1zQ29udGFpbmVyKClbMF0ucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdpc3pvbGVhLXRoZW1lJyk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGl0ZW1UZW1wbGF0ZTogKGVudHJ5KSA9PiBlbnRyeS50ZXh0LFxyXG5cclxuICAgICAgY3NzQ2xhc3M6ICdpc3pvbGVhLXRoZW1lJ1xyXG4gICAgfSkuYXBwZW5kVG8oJ2JvZHknKS5keENvbnRleHRNZW51KCdpbnN0YW5jZScpO1xyXG4gICAgdGhpcy5jb250ZXh0TWVudS5zZWxlY3RJdGVtKHRoaXMuc2VsZWN0ZWRFbnRyeSBhcyBhbnkpO1xyXG5cclxuICAgIHRoaXMuZHJvcERvd25CdXR0b24gPSAkdGFyZ2V0LmR4QnV0dG9uKHtcclxuICAgICAgdGV4dDogdGhpcy5zZWxlY3RlZEVudHJ5LnRleHQsXHJcbiAgICAgIHRlbXBsYXRlOiAoYnV0dG9uRGF0YSwgY29udGVudCkgPT4ge1xyXG4gICAgICAgICQoJzxpIC8+JykuYWRkQ2xhc3MoJ2R4LWljb24gZHgtaWNvbi1yZWZyZXNoJykuYXBwZW5kVG8oY29udGVudCk7XHJcbiAgICAgICAgJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ2J1dHRvbi13aXRoLWV4cGFuZC10ZXh0JykudGV4dChidXR0b25EYXRhLnRleHQpLmFwcGVuZFRvKGNvbnRlbnQpO1xyXG4gICAgICAgICQoJzxzcGFuPicpLmFkZENsYXNzKCdidXR0b24td2l0aC1leHBhbmQtaWNvbiBpc296LWljb24tMTYgaXNvei1pY29uLWFycm93LWRvd24tMTYnKS5hcHBlbmRUbyhjb250ZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7XHJcbiAgICAgICAgY2xhc3M6ICdpc3pvbGVhLW1kIGJ1dHRvbi13aXRoLWV4cGFuZCdcclxuICAgICAgfSxcclxuXHJcbiAgICAgIG9uQ2xpY2s6IChlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0TWVudS5lbGVtZW50KCkud2lkdGgoJHRhcmdldC5vdXRlcldpZHRoKCkpO1xyXG4gICAgICAgIGlmICh0aGlzLm1lbnVJc09wZW5lZCkge1xyXG4gICAgICAgICAgdGhpcy5jb250ZXh0TWVudS5oaWRlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuY29udGV4dE1lbnUuc2hvdygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSkuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgKHRoaXMuc2VsZWN0ZWRFbnRyeS50aW1lb3V0ID4gMCkgJiYgdGhpcy5yZWZyZXNoQ29tcG9uZW50LnN0YXJ0KHRoaXMuc2VsZWN0ZWRFbnRyeS50aW1lb3V0KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZWZyZXNoQ29tcG9uZW50LnRyaWdnZXJDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZWxhcHNlZENhbGxiYWNrKHRpbWVUb1VwZGF0ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmRyb3BEb3duQnV0dG9uLm9wdGlvbigndGV4dCcsIHRoaXMuc2VsZWN0ZWRFbnRyeS5yZWZyZXNoVGVtcGxhdGUucmVwbGFjZSgnJScsIE1hdGguZmxvb3IodGltZVRvVXBkYXRlIC8gMTAwMCkudG9TdHJpbmcoKSkpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IGdyaWRDb2x1bW5UeXBlcyBmcm9tICcuLi8uLi9CdXNpbmVzcy9HcmlkQ29sdW1uVHlwZXMnO1xyXG5pbXBvcnQge2luaXRQb3BvdmVyfSBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyJztcclxuaW1wb3J0IHtJR3JpZFJlcG9ydFBhcmFtcywgSVJlcG9ydFBhcmFtc30gZnJvbSAnLi4vLi4vSVJlcG9ydFBhcmFtcyc7XHJcbmltcG9ydCBHUklEX0lORElDQVRPUl9TVEFURSBmcm9tICcuL0dyaWRJbmRpY2F0b3JTdGF0ZSc7XHJcbmltcG9ydCBkZWZhdWx0R3JpZCBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQnO1xyXG5pbXBvcnQgR3JpZFN0YXRlTWFuYWdlciBmcm9tICcuL0dyaWRTdGF0ZU1hbmFnZXInO1xyXG5pbXBvcnQgR3JpZE1vZGUgZnJvbSAnLi9Nb2RlJztcclxuaW1wb3J0IHtjcmVhdGVHcmlkRGF0YUxheWVyLCBJR3JpZERhdGFMYXllcn0gZnJvbSAnLi4vLi4vRGF0YS9JbmRleCc7XHJcbmltcG9ydCB7R3JpZERhdGFDb2x1bW5EYXRhVHlwZSwgSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGUsIElHcmlkU3RhdGV9IGZyb20gJy4uLy4uLy4uL1dpZGdldHMvSUdyaWRTdGF0ZSc7XHJcbmltcG9ydCB7SVJlcG9ydENvbXBvbmVudH0gZnJvbSAnLi4vLi4vSVJlcG9ydENvbXBvbmVudCc7XHJcbmltcG9ydCBSZWZyZXNoQnV0dG9uIGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVmcmVzaFRpbWVyL0J1dHRvbic7XHJcblxyXG5jb25zdCBSRVNFVF9TQVZFRF9JTkRJQ0FUT1JfVElNRU9VVCA9IDMwMDA7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkT3B0aW9ucyB7XHJcbiAgZ3JpZFBvc2l0aW9uTWFya2VyOiBKUXVlcnk7XHJcbiAgcmVwb3J0UGFyYW1zOiBJR3JpZFJlcG9ydFBhcmFtcztcclxuICBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XHJcbiAgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxuICBncmlkUmVwb3J0Q29udHJvbGxlclVybDogc3RyaW5nO1xyXG4gIHNob3dIZWFkZXI/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHcmlkIGltcGxlbWVudHMgSVJlcG9ydENvbXBvbmVudCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncmlkUG9zaXRpb25NYXJrZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlcG9ydFBhcmFtczogSUdyaWRSZXBvcnRQYXJhbXM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncmlkUmVwb3J0Q29udHJvbGxlclVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd0hlYWRlcjogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGFkZFJlZnJlc2hCdXR0b246IGJvb2xlYW47XHJcblxyXG4gIHByaXZhdGUgY3VycmVudEdyaWRNb2RlOiBHcmlkTW9kZSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgc2hvd0FsbERhdGFJbkVkaXQgPSBmYWxzZTtcclxuICBwcml2YXRlIGxvYWRpbmdUaW1lb3V0ID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHBvcG92ZXI6IERldkV4cHJlc3MudWkuZHhQb3BvdmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgZ3JpZFN0YXRlTWFuYWdlcjogR3JpZFN0YXRlTWFuYWdlciB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgJGdyaWRTdGF0ZUluZGljYXRvcjogSlF1ZXJ5IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSAkZ3JpZEVycm9yUGxhY2Vob2xkZXI6IEpRdWVyeSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgJGdyaWRUYXJnZXRFbGVtZW50OiBKUXVlcnkgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlICRyZXNldFNldHRpbmdUYXJnZXRFbGVtZW50OiBKUXVlcnkgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGdyaWRTdGF0ZUluZGljYXRvclRpbWVvdXQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgZGF0YUxheWVyOiBJR3JpZERhdGFMYXllcjtcclxuICBwcml2YXRlIGVkaXRXaWR0aEVkaXRCb3hlczogRGV2RXhwcmVzcy51aS5keFRleHRCb3hbXSB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIGdyaWRSZXBhaW50UXVldWVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBjb2x1bW5OYW1lc1VwZGF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIHJlZnJlc2hCdXR0b246IFJlZnJlc2hCdXR0b24gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUdyaWRPcHRpb25zKSB7XHJcbiAgICB0aGlzLmdyaWRQb3NpdGlvbk1hcmtlciA9IG9wdGlvbnMuZ3JpZFBvc2l0aW9uTWFya2VyO1xyXG4gICAgdGhpcy5yZXBvcnRQYXJhbXMgPSBvcHRpb25zLnJlcG9ydFBhcmFtcztcclxuICAgIHRoaXMuYWxsb3dFZGl0aW5nID0gb3B0aW9ucy5hbGxvd0VkaXRpbmc7XHJcbiAgICB0aGlzLmFkZFJlZnJlc2hCdXR0b24gPSBvcHRpb25zLmFkZFJlZnJlc2hCdXR0b247XHJcbiAgICB0aGlzLmdyaWRSZXBvcnRDb250cm9sbGVyVXJsID0gb3B0aW9ucy5ncmlkUmVwb3J0Q29udHJvbGxlclVybDtcclxuICAgIHRoaXMuc2hvd0hlYWRlciA9IG9wdGlvbnMuc2hvd0hlYWRlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRHcmlkTW9kZSkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9IEdyaWRNb2RlLlZpZXc7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbml0SW50ZXJuYWwoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncmlkPy5yZWZyZXNoKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JpZD8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5ncmlkID0gbnVsbDtcclxuXHJcbiAgICB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9IG51bGw7XHJcbiAgICB0aGlzLiRyZXNldFNldHRpbmdUYXJnZXRFbGVtZW50Py5yZW1vdmUoKTtcclxuICAgIHRoaXMuJGdyaWRUYXJnZXRFbGVtZW50Py5yZW1vdmUoKTtcclxuXHJcbiAgICB0aGlzLnBvcG92ZXI/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMucG9wb3ZlciA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRJbnRlcm5hbCgpOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gICAgdGhpcy5kYXRhTGF5ZXIgPSBjcmVhdGVHcmlkRGF0YUxheWVyKHRoaXMuZ3JpZFJlcG9ydENvbnRyb2xsZXJVcmwpO1xyXG5cclxuICAgIGlmICh0aGlzLiRncmlkVGFyZ2V0RWxlbWVudCkge1xyXG4gICAgICB0aGlzLiRncmlkVGFyZ2V0RWxlbWVudC5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLiRncmlkVGFyZ2V0RWxlbWVudCA9ICQoJzxkaXYgLz4nKS5pbnNlcnRBZnRlcih0aGlzLmdyaWRQb3NpdGlvbk1hcmtlcik7XHJcblxyXG4gICAgdGhpcy5ncmlkU3RhdGVNYW5hZ2VyID0gbmV3IEdyaWRTdGF0ZU1hbmFnZXIodGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQsIHRoaXMuZGF0YUxheWVyKTtcclxuXHJcbiAgICB0aGlzLiRncmlkRXJyb3JQbGFjZWhvbGRlciA9ICQoJzxkaXYgLz4nKS50ZXh0KCdEYXRhIGxvYWRpbmcgZmFpbGVkLicpLmFkZENsYXNzKCdkeC1kYXRhZ3JpZC1ub2RhdGEnKS5jc3MoeyB6SW5kZXg6IDEgfSk7XHJcbiAgICB0aGlzLiRncmlkRXJyb3JQbGFjZWhvbGRlci5hcHBlbmRUbyh0aGlzLmdyaWRQb3NpdGlvbk1hcmtlcik7XHJcbiAgICB0aGlzLiRncmlkRXJyb3JQbGFjZWhvbGRlci5oaWRlKCk7XHJcblxyXG4gICAgaWYgKHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpIHtcclxuICAgICAgLy8gVE9ETzogZWxlbWVudCBzZWxlY3RvciBhcyBhIHBhcmFtXHJcbiAgICAgIHRoaXMucG9wb3ZlciA9IGluaXRQb3BvdmVyKCcucmVwb3J0LWRldGFpbHMtbGluaycsIHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZWRpdFdpZHRoRWRpdEJveGVzID0gW107XHJcbiAgICBjb25zdCBncmlkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyA9IHtcclxuICAgICAgZGF0YVNvdXJjZTogdGhpcy5jcmVhdGVEYXRhU291cmNlKHRoaXMucmVwb3J0UGFyYW1zLCB0aGlzLmN1cnJlbnRHcmlkTW9kZSwgdGhpcy5zaG93QWxsRGF0YUluRWRpdCksXHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7IGNsYXNzOiB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuRWRpdCA/ICdlZGl0LW1vZGUnIDogJ3ZpZXctbW9kZScgfSxcclxuICAgICAgcmVwYWludENoYW5nZXNPbmx5OiB0cnVlLFxyXG4gICAgICBvblRvb2xiYXJQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSBlLnRvb2xiYXJPcHRpb25zLml0ZW1zO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLlZpZXcgJiYgdGhpcy5hbGxvd0VkaXRpbmcpIHtcclxuICAgICAgICAgIGNvbnN0IHNlYXJjaFBhbmVsID0gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdzZWFyY2hQYW5lbCcpWzBdO1xyXG4gICAgICAgICAgY29uc3Qgc2VhcmNoUGFuZWxJbmRleCA9IGl0ZW1zLmluZGV4T2Yoc2VhcmNoUGFuZWwpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IHN3aXRjaFRvRWRpdEJ0biA9IHtcclxuICAgICAgICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdTd2l0Y2ggdG8gRWRpdCBNb2RlJyxcclxuICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB0aGlzLnN3aXRjaFRvTW9kZShHcmlkTW9kZS5FZGl0KSxcclxuICAgICAgICAgICAgICBpY29uOiAnc3dpdGNoLXRvLWVkaXQtbW9kZScsXHJcbiAgICAgICAgICAgICAgZWxlbWVudEF0dHI6IHtjbGFzczogJ2lzem9sZWEtbWQnfVxyXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbTtcclxuXHJcbiAgICAgICAgICBpdGVtcy5zcGxpY2Uoc2VhcmNoUGFuZWxJbmRleCwgMSk7XHJcbiAgICAgICAgICBpdGVtcy5wdXNoKHN3aXRjaFRvRWRpdEJ0bik7XHJcbiAgICAgICAgICBpdGVtcy5wdXNoKHNlYXJjaFBhbmVsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuRWRpdCkge1xyXG4gICAgICAgICAgY29uc3QgY29sdW1uQ2hvb3NlckJ0biA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5uYW1lID09PSAnY29sdW1uQ2hvb3NlckJ1dHRvbicpWzBdO1xyXG4gICAgICAgICAgY29uc3QgY29sdW1udENob29zZXJCdG5JbmRleCA9IGl0ZW1zLmluZGV4T2YoY29sdW1uQ2hvb3NlckJ0bik7XHJcblxyXG4gICAgICAgICAgY29uc3Qgc2hvd0RhdGFJdGVtID0ge1xyXG4gICAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCAkY29udGFpbmVyID0gJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAgICAgICAuY3NzKHtcclxuICAgICAgICAgICAgICAgICAgYm9yZGVyOiAnMXB4ICNlMGUwZTAgc29saWQnLFxyXG4gICAgICAgICAgICAgICAgICBwYWRkaW5nOiAnM3B4IDZweCcsXHJcbiAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzRweCcsXHJcbiAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICd3aGl0ZScsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgJCgnPHNwYW4gLz4nKVxyXG4gICAgICAgICAgICAgICAgLmNzcyh7IG1hcmdpbjogJzAgNXB4IDAgMCcsIHdpZHRoOiAnNTRweCcgfSlcclxuICAgICAgICAgICAgICAgIC5keFN3aXRjaCh7XHJcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnNob3dBbGxEYXRhSW5FZGl0LFxyXG4gICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKHsgdmFsdWUgfSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0FsbERhdGFJbkVkaXQgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWQub3B0aW9uKCdkYXRhU291cmNlJywgdGhpcy5jcmVhdGVEYXRhU291cmNlKHRoaXMucmVwb3J0UGFyYW1zLCB0aGlzLmN1cnJlbnRHcmlkTW9kZSwgdGhpcy5zaG93QWxsRGF0YUluRWRpdCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5yZWZyZXNoKCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICAgICQoJzxzcGFuIC8+JykudGV4dCgnU2hvdyBhbGwgZGF0YSAnKS5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgJGhpbnRUYXJnZXQgPSAkKCc8YSAvPicpXHJcbiAgICAgICAgICAgICAgICAuY3NzKHsgdGV4dERlY29yYXRpb246ICd1bmRlcmxpbmUnLCBjb2xvcjogJ2JsdWUnIH0pXHJcbiAgICAgICAgICAgICAgICAudGV4dCgnKD8pJylcclxuICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAgICAgICAudGV4dChgSWYgdGhlIHRhYmxlIGNvbnRhaW5zIGEgbG90IG9mIGNvbHVtbnMgc2hvd2luZyBhbGwgZGF0YSBjYW4gbGVhZCB0byBzbG93IHBhZ2UgcGVyZm9ybWFuY2Ugd2hlbiB5b3UncmUgZWRpdGluZyB0aGUgZ3JpZC5cclxuQnkgZGVmYXVsdCBncmlkIHNob3dzIG9ubHkgZmlyc3QgMTAgcm93cyBpbiB0aGUgRWRpdCBtb2RlLmApXHJcbiAgICAgICAgICAgICAgICAuZHhQb3BvdmVyKHtcclxuICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAkaGludFRhcmdldCxcclxuICAgICAgICAgICAgICAgICAgc2hvd0V2ZW50OiAnbW91c2VlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgIGhpZGVFdmVudDogJ21vdXNlbGVhdmUnLFxyXG4gICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3RvcCcsXHJcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiA1MDBcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiAkY29udGFpbmVyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbTtcclxuXHJcbiAgICAgICAgICBjb25zdCBzd2l0Y2hUb1ZpZXdCdG4gPSB7XHJcbiAgICAgICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnU3dpdGNoIHRvIFZpZXcgTW9kZScsXHJcbiAgICAgICAgICAgICAgb25DbGljazogKCkgPT4gdGhpcy5zd2l0Y2hUb01vZGUoR3JpZE1vZGUuVmlldyksXHJcbiAgICAgICAgICAgICAgaWNvbjogJ3N3aXRjaC10by12aWV3LW1vZGUnLFxyXG4gICAgICAgICAgICAgIGVsZW1lbnRBdHRyOiB7Y2xhc3M6ICdpc3pvbGVhLW1kJ31cclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW07XHJcblxyXG4gICAgICAgICAgaXRlbXMuc3BsaWNlKGNvbHVtbnRDaG9vc2VyQnRuSW5kZXgsIDEpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGV4cG9ydEJ0biA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5uYW1lID09PSAnZXhwb3J0QnV0dG9uJylbMF07XHJcbiAgICAgICAgICBjb25zdCBleHBvcnRCdG5JbmRleCA9IGl0ZW1zLmluZGV4T2YoZXhwb3J0QnRuKTtcclxuXHJcbiAgICAgICAgICBpdGVtcy5zcGxpY2UoZXhwb3J0QnRuSW5kZXgsIDEpO1xyXG5cclxuICAgICAgICAgIGl0ZW1zLnB1c2goc2hvd0RhdGFJdGVtKTtcclxuICAgICAgICAgIGl0ZW1zLnB1c2goc3dpdGNoVG9WaWV3QnRuKTtcclxuICAgICAgICAgIGl0ZW1zLnB1c2goY29sdW1uQ2hvb3NlckJ0bik7XHJcblxyXG4gICAgICAgICAgY29uc3QgZWRpdFN0YXR1cyA9IHtcclxuICAgICAgICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuJGdyaWRTdGF0ZUluZGljYXRvciA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKCdlZGl0LWdyaWQtc3RhdGUnKTtcclxuXHJcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVHcmlkU3RhdGVJbmRpY2F0b3IoR1JJRF9JTkRJQ0FUT1JfU1RBVEUuZWRpdCk7XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLiRncmlkU3RhdGVJbmRpY2F0b3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtO1xyXG5cclxuICAgICAgICAgIGl0ZW1zLnVuc2hpZnQoZWRpdFN0YXR1cyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5hZGRSZWZyZXNoQnV0dG9uKSB7XHJcbiAgICAgICAgICBjb25zdCByZWZyZXNoQnRuID0gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdyZWZyZXNoJylbMF07XHJcbiAgICAgICAgICBjb25zdCByZWZyZXNoQnRuSW5kZXggPSBpdGVtcy5pbmRleE9mKHJlZnJlc2hCdG4pO1xyXG5cclxuICAgICAgICAgIGl0ZW1zW3JlZnJlc2hCdG5JbmRleF0gPSB7XHJcbiAgICAgICAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0ICRjb250YWluZXIgPSAkKCc8ZGl2IC8+Jyk7XHJcbiAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoQnV0dG9uID0gbmV3IFJlZnJlc2hCdXR0b24oJGNvbnRhaW5lciwgKCkgPT4gdGhpcy5yZWZyZXNoKCkpO1xyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gJGNvbnRhaW5lcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW07XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvbkNlbGxQcmVwYXJlZDogKHsgcm93VHlwZSwgY29sdW1uLCBjZWxsRWxlbWVudCB9KSA9PiB7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICBpZiAocm93VHlwZSA9PT0gJ2hlYWRlcicgJiYgIWNvbHVtbi5jb21tYW5kKSB7XHJcbiAgICAgICAgICBjb25zdCBkYXRhRmllbGQgPSBjb2x1bW4uZGF0YUZpZWxkO1xyXG4gICAgICAgICAgY29uc3QgYWRkaXRpb25hbFNldHRpbmdzID0gdGhpcy5ncmlkU3RhdGVNYW5hZ2VyLmdldENvbHVtbkFkZGl0aW9uYWxTZXR0aW5ncyhkYXRhRmllbGQpO1xyXG5cclxuICAgICAgICAgIHRoaXMuaW5pdEdyaWRIZWFkZXJDZWxsKGNlbGxFbGVtZW50LCBhZGRpdGlvbmFsU2V0dGluZ3MpO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuRWRpdCkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRHcmlkSGVhZGVyQ2VsbEVkaXRQYW5lbChjb2x1bW4sIGNlbGxFbGVtZW50LCBhZGRpdGlvbmFsU2V0dGluZ3MpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuXHJcbiAgICAgIG9uQ29udGVudFJlYWR5OiAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRHcmlkID0gZS5jb21wb25lbnQ7XHJcbiAgICAgICAgY29uc3QgY3VycmVudFN0YXRlOiBJR3JpZFN0YXRlID0gY3VycmVudEdyaWQuc3RhdGUoKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbHVtbk5hbWVzVXBkYXRlZCkge1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVDb2x1bW5OYW1pbmcoY3VycmVudFN0YXRlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gTk9URTogY29sdW1uIG5hbWUgdXBkYXRpbmcgdHJpZ2dlcnMgb25Db250ZW50UmVhZHkgZXZlbnQgcmFpc2luZyBhZ2Fpbi5cclxuICAgICAgICAgIC8vIFdlIG5lZWQgbm90IHRvIGV4ZXVjdXRlIHRoZSBzYW1lIG9uZSBtb3JlIHRpbWUuXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiBjdXJyZW50R3JpZC5lbmRDdXN0b21Mb2FkaW5nKCkpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50R3JpZE1vZGUgIT09IEdyaWRNb2RlLkVkaXQpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG5ld0NvbHVtbnMgPSB0aGlzLmdyaWRTdGF0ZU1hbmFnZXIuY2hlY2tOZXdDb2x1bW5zKGN1cnJlbnRTdGF0ZSk7XHJcblxyXG4gICAgICAgIG5ld0NvbHVtbnMuZm9yRWFjaCgoY29sdW1uTmFtZSkgPT4gZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKGNvbHVtbk5hbWUsICd2aXNpYmxlJywgZmFsc2UpKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29sdW1uQ2FwdGlvbnMgPSB0aGlzLmdyaWRTdGF0ZU1hbmFnZXIuZ2V0Q29sdW1uQ2FwdGlvbnMoKTtcclxuXHJcbiAgICAgICAgY29sdW1uQ2FwdGlvbnMuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgICAgaWYgKGMuY2FwdGlvbiAmJiBjdXJyZW50R3JpZC5jb2x1bW5PcHRpb24oYy5kYXRhRmllbGQsICdjYXB0aW9uJykgIT09IGMuY2FwdGlvbikge1xyXG4gICAgICAgICAgICBjdXJyZW50R3JpZC5jb2x1bW5PcHRpb24oYy5kYXRhRmllbGQsICdjYXB0aW9uJywgYy5jYXB0aW9uKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSxcclxuICAgICAgc3RhdGVTdG9yaW5nOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgICBjdXN0b21Mb2FkOiAoKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5ncmlkU3RhdGVNYW5hZ2VyLmxvYWQodGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQsIChvdXRkYXRlZENvbHVtbnMpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdyaWQuc3RhdGUoKTtcclxuXHJcbiAgICAgICAgICAgIHN0YXRlLmNvbHVtbnMgPSAoc3RhdGUuY29sdW1ucyBhcyBhbnlbXSkuZmlsdGVyKChjb2x1bW4pID0+IG91dGRhdGVkQ29sdW1ucy5pbmRleE9mKGNvbHVtbi5kYXRhRmllbGQpIDwgMCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmdyaWQuc3RhdGUoc3RhdGUpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjdXN0b21TYXZlOiAoc3RhdGUpID0+IHRoaXMuc2F2ZUdyaWRTdGF0ZShzdGF0ZSlcclxuICAgICAgfSxcclxuXHJcbiAgICAgIGZpbHRlclJvdzogeyB2aXNpYmxlOiB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuVmlldywgYXBwbHlGaWx0ZXI6ICdvbkNsaWNrJyB9LFxyXG4gICAgICBoZWFkZXJGaWx0ZXI6IHsgdmlzaWJsZTogdGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLlZpZXcgfSxcclxuICAgICAgc2VhcmNoUGFuZWw6IHsgdmlzaWJsZTogdGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLlZpZXcgfSxcclxuICAgICAgZXJyb3JSb3dFbmFibGVkOiBmYWxzZSxcclxuICAgICAgYWxsb3dDb2x1bW5SZXNpemluZzogdHJ1ZSxcclxuICAgICAgc29ydGluZzogeyBtb2RlOiAnbXVsdGlwbGUnIH0sXHJcbiAgICAgIGdyb3VwUGFuZWw6IHsgdmlzaWJsZTogdHJ1ZSB9LFxyXG4gICAgICBncm91cGluZzogeyBhdXRvRXhwYW5kQWxsOiBmYWxzZSB9LFxyXG4gICAgICBhbGxvd0NvbHVtblJlb3JkZXJpbmc6IHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5FZGl0LFxyXG4gICAgICBjb2x1bW5DaG9vc2VyOiB7IGVuYWJsZWQ6IHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5FZGl0IH0sXHJcbiAgICAgIHNob3dDb2x1bW5IZWFkZXJzOiB0cnVlLFxyXG4gICAgICBrZXlib2FyZE5hdmlnYXRpb246IHtlbmFibGVkOiBmYWxzZX0sXHJcblxyXG4gICAgICBzaG93Qm9yZGVyczogdHJ1ZSxcclxuICAgICAgcGFnaW5nOiB7IHBhZ2VTaXplOiA1MCwgZW5hYmxlZDogdHJ1ZSB9LFxyXG4gICAgICByZW1vdGVPcGVyYXRpb25zOiB0cnVlLFxyXG5cclxuICAgICAgc3VtbWFyeTogdGhpcy5yZXBvcnRQYXJhbXMuVG90YWxTdW1tYXJ5Q29sdW1uID8ge1xyXG4gICAgICAgIHRvdGFsSXRlbXM6IFt7XHJcbiAgICAgICAgICBjb2x1bW46IHRoaXMucmVwb3J0UGFyYW1zLlRvdGFsU3VtbWFyeUNvbHVtbixcclxuICAgICAgICAgIHN1bW1hcnlUeXBlOiAnY291bnQnXHJcbiAgICAgICAgfV1cclxuICAgICAgfSA6IHVuZGVmaW5lZCxcclxuXHJcbiAgICAgIG9uRWRpdG9yUHJlcGFyaW5nKGUpIHtcclxuICAgICAgICBpZiAoZS5wYXJlbnRUeXBlID09PSAnZmlsdGVyUm93Jykge1xyXG4gICAgICAgICAgY29uc3QgYXBwbHkgPSAoKSA9PiBlLmVsZW1lbnQuZmluZCgnLmR4LWFwcGx5LWJ1dHRvbicpLnRyaWdnZXIoJ2R4Y2xpY2snKTtcclxuXHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25FbnRlcktleSA9IGFwcGx5O1xyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uRm9jdXNPdXQgPSBhcHBseTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGUucGFyZW50VHlwZSA9PT0gJ3NlYXJjaFBhbmVsJykge1xyXG4gICAgICAgICAgY29uc3QgYXBwbHlTZWFyY2g6IERldkV4cHJlc3MudWkuZHhUZXh0RWRpdG9yLlByb3BlcnRpZXNbJ29uRW50ZXJLZXknXSA9IChhcmdzKSA9PiB7XHJcbiAgICAgICAgICAgIGUuY29tcG9uZW50LnNlYXJjaEJ5VGV4dChhcmdzLmNvbXBvbmVudC5vcHRpb24oJ3ZhbHVlJykpO1xyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25WYWx1ZUNoYW5nZWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25FbnRlcktleSA9IGFwcGx5U2VhcmNoO1xyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uRm9jdXNPdXQgPSBhcHBseVNlYXJjaDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5ncmlkID0gZGVmYXVsdEdyaWQodGhpcy4kZ3JpZFRhcmdldEVsZW1lbnQsIHtcclxuICAgICAgb3B0aW9uczogZ3JpZE9wdGlvbnMsXHJcbiAgICAgIGV4cG9ydEZpbGVOYW1lOiB0aGlzLnJlcG9ydFBhcmFtcy5OYW1lLFxyXG4gICAgICB0aXRsZTogdGhpcy5zaG93SGVhZGVyID8gdGhpcy5yZXBvcnRQYXJhbXMuTmFtZSA6IG51bGwsXHJcbiAgICAgIGhlYWRlckRlc2NyaXB0aW9uOiB0aGlzLnNob3dIZWFkZXIgPyB0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzIDogbnVsbFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy4kcmVzZXRTZXR0aW5nVGFyZ2V0RWxlbWVudD8ucmVtb3ZlKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5FZGl0KSB7XHJcbiAgICAgIHRoaXMuJHJlc2V0U2V0dGluZ1RhcmdldEVsZW1lbnQgPSAkKCc8c3BhbiAvPicpXHJcbiAgICAgICAgLmNzcyh7XHJcbiAgICAgICAgICBmbG9hdDogJ3JpZ2h0JyxcclxuICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxyXG4gICAgICAgICAgYm90dG9tOiAnOHB4J1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmFkZENsYXNzKCdpc3pvbGVhLW1kJylcclxuICAgICAgICAuZHhCdXR0b24oe1xyXG4gICAgICAgICAgdGV4dDogJ1Jlc2V0IHNldHRpbmdzJyxcclxuICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHRoaXMucmVzZXRTZXR0aW5ncygpLFxyXG4gICAgICAgICAgaWNvbjogJ3Jlc2V0LWdyaWQtc2V0dGluZ3MnXHJcbiAgICAgICAgfSlcclxuICAgICAgICAuYXBwZW5kVG8oJ2Zvb3RlcicpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmdyaWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUdyaWRTdGF0ZUluZGljYXRvcihzdGF0ZTogc3RyaW5nKSB7XHJcbiAgICBPYmplY3Qua2V5cyhHUklEX0lORElDQVRPUl9TVEFURSkuZm9yRWFjaCgocykgPT4gdGhpcy4kZ3JpZFN0YXRlSW5kaWNhdG9yLnJlbW92ZUNsYXNzKEdSSURfSU5ESUNBVE9SX1NUQVRFW3NdKSk7XHJcblxyXG4gICAgdGhpcy4kZ3JpZFN0YXRlSW5kaWNhdG9yLmFkZENsYXNzKHN0YXRlKTtcclxuXHJcbiAgICBpZiAodGhpcy5ncmlkU3RhdGVJbmRpY2F0b3JUaW1lb3V0KSB7XHJcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5ncmlkU3RhdGVJbmRpY2F0b3JUaW1lb3V0KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc3RhdGUgPT09IEdSSURfSU5ESUNBVE9SX1NUQVRFLnNhdmVkKSB7XHJcbiAgICAgIHRoaXMuZ3JpZFN0YXRlSW5kaWNhdG9yVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnVwZGF0ZUdyaWRTdGF0ZUluZGljYXRvcihHUklEX0lORElDQVRPUl9TVEFURS5lZGl0KTtcclxuICAgICAgfSwgUkVTRVRfU0FWRURfSU5ESUNBVE9SX1RJTUVPVVQpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB0aXRsZSA9ICcnO1xyXG5cclxuICAgIHN3aXRjaCAoc3RhdGUpIHtcclxuICAgICAgY2FzZSBHUklEX0lORElDQVRPUl9TVEFURS5lZGl0OlxyXG4gICAgICAgIHRpdGxlID0gJ0VkaXQgbW9kZSc7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEdSSURfSU5ESUNBVE9SX1NUQVRFLnNhdmVkOlxyXG4gICAgICAgIHRpdGxlID0gJ1NhdmVkJztcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgR1JJRF9JTkRJQ0FUT1JfU1RBVEUuc2F2aW5nOlxyXG4gICAgICAgIHRpdGxlID0gJ1NhdmluZyc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy4kZ3JpZFN0YXRlSW5kaWNhdG9yLmF0dHIoJ3RpdGxlJywgdGl0bGUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVDb2x1bW5OYW1pbmcoc3RhdGU6IElHcmlkU3RhdGUpIHtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlOm1heC1saW5lLWxlbmd0aFxyXG4gICAgLy8gSEFDSzogRGV2RXh0cmVtZSBncmlkIGRvZXNuJ3Qgc2hvdyBjb2x1bW5zIGRhdGEgaWYgYSBkYXRhRmllbGQgaGFzIHNwZWNpYWwgc3ltYm9scy5cclxuICAgIC8vIFNlZSBodHRwczovL3d3dy5kZXZleHByZXNzLmNvbS9TdXBwb3J0L0NlbnRlci9RdWVzdGlvbi9EZXRhaWxzL1Q2MjE4MzgvZHhkYXRhZ3JpZC1hLWNvbHVtbi1pcy1lbXB0eS1pZi1kYXRhZmllbGQtY29udGFpbnMtc3BlY2lhbC1jaGFyYWN0ZXJzXHJcbiAgICAvLyB0c2xpbnQ6ZW5hYmxlOm1heC1saW5lLWxlbmd0aFxyXG4gICAgaWYgKHN0YXRlLmNvbHVtbnMpIHtcclxuICAgICAgc3RhdGUuY29sdW1ucy5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgaWYgKC9bXmEtekEtWjAtOV9dLy50ZXN0KGMuZGF0YUZpZWxkKSkge1xyXG4gICAgICAgICAgdGhpcy5ncmlkLmNvbHVtbk9wdGlvbihjLmRhdGFGaWVsZCwgJ2NhbGN1bGF0ZUNlbGxWYWx1ZScsIChyb3dEYXRhKSA9PiByb3dEYXRhW2MuZGF0YUZpZWxkXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNvbHVtbk5hbWVzVXBkYXRlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXNoYWRvd2VkLXZhcmlhYmxlXHJcbiAgcHJpdmF0ZSBjcmVhdGVEYXRhU291cmNlKHJlcG9ydFBhcmFtc0RhdGFTb3VyY2U6IElSZXBvcnRQYXJhbXMsIGdyaWRNb2RlOiBHcmlkTW9kZSwgc2hvd0FsbERhdGFJbkVkaXREYXRhU291cmNlOiBib29sZWFuKSB7XHJcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuZGF0YUxheWVyLmdldEdyaWREYXRhU291cmNlKHJlcG9ydFBhcmFtc0RhdGFTb3VyY2UsIGdyaWRNb2RlLCBzaG93QWxsRGF0YUluRWRpdERhdGFTb3VyY2UpO1xyXG4gICAgY29uc3QgZHMgPSBuZXcgRGV2RXhwcmVzcy5kYXRhLkRhdGFTb3VyY2Uoe1xyXG4gICAgICBzdG9yZSxcclxuICAgICAgb25DaGFuZ2VkOiBncmlkTW9kZSA9PT0gR3JpZE1vZGUuVmlldyA/IHZvaWQgMCA6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmNvbHVtbk5hbWVzVXBkYXRlZCA9IGZhbHNlO1xyXG4gICAgICB9LFxyXG4gICAgICBvbkxvYWRFcnJvcjogKGUpID0+IHtcclxuICAgICAgICBpZiAoIWRzLmlzTG9hZGVkKCkpIHtcclxuICAgICAgICAgIHRoaXMuJGdyaWRFcnJvclBsYWNlaG9sZGVyLnNob3coKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZ3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uTG9hZGluZ0NoYW5nZWQ6IChpc0xvYWRpbmcpID0+IHtcclxuICAgICAgICBpZiAoaXNMb2FkaW5nKSB7XHJcbiAgICAgICAgICB0aGlzLiRncmlkRXJyb3JQbGFjZWhvbGRlci5oaWRlKCk7XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmdUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncmlkLmJlZ2luQ3VzdG9tTG9hZGluZygnUGxlYXNlIHdhaXQsIGRhdGEgbG9hZGluZyBpbiBwcm9ncmVzcy4nKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgMTAwMDApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5sb2FkaW5nVGltZW91dCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5sb2FkaW5nVGltZW91dCk7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1RpbWVvdXQgPSBudWxsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5ncmlkLmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBkcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzZXRTZXR0aW5ncygpIHtcclxuICAgIERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oJ1Jlc2V0IGdyaWQgc2V0dGluZ3MgdG8gZGVmYXVsdCB2YWx1ZXM/JywgJ1Jlc2V0IHRvIGRlZmF1bHQ/JylcclxuICAgICAgLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICAgIHRoaXMuZ3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ0xvYWRpbmcnKTtcclxuICAgICAgICAgIHRoaXMuZ3JpZFN0YXRlTWFuYWdlclxyXG4gICAgICAgICAgICAucmVzZXRTZXR0aW5ncygpXHJcbiAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncmlkLnN0YXRlKGRhdGEpO1xyXG4gICAgICAgICAgICAgIHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnLCB0aGlzLmNyZWF0ZURhdGFTb3VyY2UodGhpcy5yZXBvcnRQYXJhbXMsIHRoaXMuY3VycmVudEdyaWRNb2RlLCB0aGlzLnNob3dBbGxEYXRhSW5FZGl0KSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncmlkLnJlZnJlc2goKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3dpdGNoVG9Nb2RlKG1vZGU6IEdyaWRNb2RlKSB7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IG1vZGUgfHwgbW9kZSA9PT0gR3JpZE1vZGUuRWRpdCAmJiAhdGhpcy5hbGxvd0VkaXRpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY3VycmVudEdyaWRNb2RlID0gbW9kZTtcclxuXHJcbiAgICBjb25zdCBjdXJyZW50U3VtbWFyeUNvbHVtbiA9IHRoaXMuZ3JpZC5vcHRpb24oJ3N1bW1hcnkudG90YWxJdGVtc1swXS5jb2x1bW4nKSBhcyBzdHJpbmc7XHJcblxyXG4gICAgY29uc3QgbmV3UmVwb3J0UGFyYW1zID0ge1xyXG4gICAgICAuLi50aGlzLnJlcG9ydFBhcmFtcyxcclxuICAgICAgVG90YWxTdW1tYXJ5Q29sdW1uOiBjdXJyZW50U3VtbWFyeUNvbHVtbiA/IGN1cnJlbnRTdW1tYXJ5Q29sdW1uIDogdGhpcy5yZXBvcnRQYXJhbXMuVG90YWxTdW1tYXJ5Q29sdW1uXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMucmVwb3J0UGFyYW1zID0gbmV3UmVwb3J0UGFyYW1zO1xyXG5cclxuICAgIHRoaXMuZ3JpZC5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLiRncmlkVGFyZ2V0RWxlbWVudC5yZW1vdmUoKTtcclxuICAgIHRoaXMuZ3JpZCA9IHRoaXMuaW5pdEludGVybmFsKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNhdmVHcmlkU3RhdGUoc3RhdGUpIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRHcmlkTW9kZSAhPT0gR3JpZE1vZGUuRWRpdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb2x1bW5OYW1lc1VwZGF0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdCB3aWR0aHMgPSB0aGlzLmdyaWRTdGF0ZU1hbmFnZXIuc2F2ZShzdGF0ZSxcclxuICAgICAgKCkgPT4gdGhpcy51cGRhdGVHcmlkU3RhdGVJbmRpY2F0b3IoR1JJRF9JTkRJQ0FUT1JfU1RBVEUuc2F2aW5nKSxcclxuICAgICAgKCkgPT4gdGhpcy51cGRhdGVHcmlkU3RhdGVJbmRpY2F0b3IoR1JJRF9JTkRJQ0FUT1JfU1RBVEUuc2F2ZWQpKTtcclxuXHJcbiAgICBpZiAod2lkdGhzKSB7XHJcbiAgICAgIE9iamVjdC5rZXlzKHdpZHRocykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZWRpdFdpZHRoQm94ID0gdGhpcy5lZGl0V2lkdGhFZGl0Qm94ZXNba2V5XTtcclxuXHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSB3aWR0aHNba2V5XSA9PT0gJ2luaGVyaXQnID8gJycgOiB3aWR0aHNba2V5XTtcclxuXHJcbiAgICAgICAgaWYgKGVkaXRXaWR0aEJveCAmJiBlZGl0V2lkdGhCb3gub3B0aW9uKCd2YWx1ZScpICE9PSB2YWx1ZSkge1xyXG4gICAgICAgICAgZWRpdFdpZHRoQm94Lm9wdGlvbigndmFsdWUnLCB2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdEdyaWRIZWFkZXJDZWxsRWRpdFBhbmVsKFxyXG4gICAgY29sdW1uOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW4sXHJcbiAgICAkY2VsbDogSlF1ZXJ5LFxyXG4gICAgYWRkaXRpb25hbFNldHRpbmdzOiBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZVxyXG4gICkge1xyXG4gICAgY29uc3QgZGF0YUZpZWxkID0gY29sdW1uLmRhdGFGaWVsZDtcclxuICAgIGNvbnN0ICRjb2x1bW5DYXB0aW9uRWwgPSAkY2VsbC5maW5kKCcuZHgtZGF0YWdyaWQtdGV4dC1jb250ZW50Jyk7XHJcbiAgICBjb25zdCAkZWRpdG9yQXJlYSA9ICQoJzxzcGFuIC8+JykuYWRkQ2xhc3MoJ2NvbHVtbi1lZGl0b3ItYXJlYScpLmluc2VydEFmdGVyKCRjb2x1bW5DYXB0aW9uRWwpO1xyXG5cclxuICAgICRjb2x1bW5DYXB0aW9uRWwuY3NzKCdtYXhXaWR0aCcsICc1NSUnKTtcclxuXHJcbiAgICBjb25zdCAkZWRpdFR5cGVQYW5lbCA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2VkaXQtdHlwZS1wYW5lbCcpXHJcbiAgICAgIC53aWR0aCgnMTAwJScpXHJcbiAgICAgIC5hcHBlbmRUbygkY2VsbCk7XHJcblxyXG4gICAgY29uc3QgJGVkaXRXaWR0aFBhbmVsID0gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZWRpdC13aWR0aC1wYW5lbCcpXHJcbiAgICAgIC53aWR0aCgnMTAwJScpXHJcbiAgICAgIC5hcHBlbmRUbygkY2VsbCk7XHJcblxyXG4gICAgJGVkaXRUeXBlUGFuZWxbMF0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICBjb25zdCBzZWxlY3RCb3ggPSAkZWRpdFR5cGVCb3guZHhTZWxlY3RCb3goJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgICBpZiAoc2VsZWN0Qm94Lm9wdGlvbignb3BlbmVkJykpIHtcclxuICAgICAgICBzZWxlY3RCb3guY2xvc2UoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzZWxlY3RCb3gub3BlbigpO1xyXG4gICAgICB9XHJcbiAgICB9LCB0cnVlKTtcclxuXHJcbiAgICBsZXQgbGFzdENhcHRpb25WYWx1ZSA9IGNvbHVtbi5jYXB0aW9uO1xyXG5cclxuICAgIGNvbnN0ICRlZGl0Q2FwdGlvbkJ0biA9ICQoJzxzcGFuIC8+JykuZHhCdXR0b24oe1xyXG4gICAgICBoaW50OiAnRWRpdCBjb2x1bW4gY2FwdGlvbicsXHJcbiAgICAgIHRlbXBsYXRlOiAoZGF0YSwgJGNvbnRlbnQpID0+ICRjb250ZW50LmFwcGVuZCgkKCc8c3BhbiAvPicpLmFkZENsYXNzKCdlZGl0LWNhcHRpb24tYnRuJykpLFxyXG4gICAgICBvbkNsaWNrOiAoeyBldmVudCB9KSA9PiB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgJGNvbHVtbkNhcHRpb25FbC5oaWRlKCk7XHJcbiAgICAgICAgJGVkaXRDYXB0aW9uQnRuLmhpZGUoKTtcclxuICAgICAgICAkZWRpdFRvb2x0aXBCdG4uaGlkZSgpO1xyXG5cclxuICAgICAgICBjb25zdCAkZWRpdCA9ICQoJzxzcGFuIC8+JykuZHhUZXh0Qm94KHtcclxuICAgICAgICAgIHZhbHVlOiBsYXN0Q2FwdGlvblZhbHVlLFxyXG4gICAgICAgICAgZWxlbWVudEF0dHI6IHsgY2xhc3M6ICdjYXB0aW9uLWVkaXRvcicgfSxcclxuICAgICAgICAgIG9uRW50ZXJLZXk6IChlKSA9PiB7XHJcbiAgICAgICAgICAgIGVkaXRCdG4uYmx1cigpO1xyXG4gICAgICAgICAgICBlLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9uS2V5RG93bjogKGUpID0+IHtcclxuICAgICAgICAgICAgZS5ldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBvbkZvY3VzT3V0OiAoZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGVkaXRCdG4ub3B0aW9uKCd2YWx1ZScpO1xyXG5cclxuICAgICAgICAgICAgJGVkaXQucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICRjb2x1bW5DYXB0aW9uRWwudGV4dChuZXdWYWx1ZSkuc2hvdygpO1xyXG4gICAgICAgICAgICAkZWRpdENhcHRpb25CdG4uc2hvdygpO1xyXG4gICAgICAgICAgICAkZWRpdFRvb2x0aXBCdG4uc2hvdygpO1xyXG5cclxuICAgICAgICAgICAgbGFzdENhcHRpb25WYWx1ZSA9IG5ld1ZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLmdyaWRTdGF0ZU1hbmFnZXIuc2V0Q29sdW1uQ2FwdGlvbihkYXRhRmllbGQsIG5ld1ZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5zYXZlR3JpZFN0YXRlKHRoaXMuZ3JpZC5zdGF0ZSgpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1zbScpXHJcbiAgICAgICAgICAuYXBwZW5kVG8oJGVkaXRvckFyZWEpXHJcbiAgICAgICAgICAub24oJ2NsaWNrJywgKGUpID0+IHtcclxuICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGVkaXRCdG4gPSAkZWRpdC5keFRleHRCb3goJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgICAgIGVkaXRCdG4uZm9jdXMoKTtcclxuICAgICAgfVxyXG4gICAgfSkuaW5zZXJ0QWZ0ZXIoJGNvbHVtbkNhcHRpb25FbCk7XHJcblxyXG4gICAgY29uc3QgJGVkaXRUb29sdGlwQnRuID0gJCgnPHNwYW4gLz4nKS5keEJ1dHRvbih7XHJcbiAgICAgIGhpbnQ6ICdFZGl0IGNvbHVtbiB0b29sdGlwJyxcclxuICAgICAgdGVtcGxhdGU6IChkYXRhLCAkY29udGVudCkgPT4gJGNvbnRlbnQuYXBwZW5kKCQoJzxzcGFuIC8+JykuYWRkQ2xhc3MoJ2VkaXQtdG9vbHRpcC1idG4nKSksXHJcbiAgICAgIG9uQ2xpY2s6ICh7IGV2ZW50IH0pID0+IHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAkY29sdW1uQ2FwdGlvbkVsLmhpZGUoKTtcclxuICAgICAgICAkZWRpdENhcHRpb25CdG4uaGlkZSgpO1xyXG4gICAgICAgICRlZGl0VG9vbHRpcEJ0bi5oaWRlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0ICRlZGl0ID0gJCgnPHNwYW4gLz4nKS5keFRleHRCb3goe1xyXG4gICAgICAgICAgdmFsdWU6IGFkZGl0aW9uYWxTZXR0aW5ncyAmJiBhZGRpdGlvbmFsU2V0dGluZ3MudG9vbHRpcCxcclxuICAgICAgICAgIHRleHQ6IGFkZGl0aW9uYWxTZXR0aW5ncyAmJiBhZGRpdGlvbmFsU2V0dGluZ3MudG9vbHRpcCxcclxuICAgICAgICAgIHBsYWNlaG9sZGVyOiAnRW50ZXIgY29sdW1uIHRvb2x0aXAuLi4nLFxyXG4gICAgICAgICAgb25FbnRlcktleTogKGUpID0+IHtcclxuICAgICAgICAgICAgZWRpdEJ0bi5ibHVyKCk7XHJcbiAgICAgICAgICAgIGUuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb25LZXlEb3duOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICBlLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9uRm9jdXNPdXQ6ICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBlZGl0QnRuLm9wdGlvbigndmFsdWUnKTtcclxuXHJcbiAgICAgICAgICAgICRlZGl0LnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAkY29sdW1uQ2FwdGlvbkVsLnNob3coKTtcclxuICAgICAgICAgICAgJGVkaXRDYXB0aW9uQnRuLnNob3coKTtcclxuICAgICAgICAgICAgJGVkaXRUb29sdGlwQnRuLnNob3coKTtcclxuXHJcbiAgICAgICAgICAgIGFkZGl0aW9uYWxTZXR0aW5ncy50b29sdGlwID0gbmV3VmFsdWU7XHJcbiAgICAgICAgICAgICRjZWxsLmF0dHIoJ3RpdGxlJywgbmV3VmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLnNhdmVHcmlkU3RhdGUodGhpcy5ncmlkLnN0YXRlKCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLXNtJylcclxuICAgICAgICAgIC5hcHBlbmRUbygkZWRpdG9yQXJlYSlcclxuICAgICAgICAgIC5vbignY2xpY2snLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgZWRpdEJ0biA9ICRlZGl0LmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICAgICAgZWRpdEJ0bi5mb2N1cygpO1xyXG4gICAgICB9XHJcbiAgICB9KS5pbnNlcnRBZnRlcigkZWRpdENhcHRpb25CdG4pO1xyXG5cclxuICAgIGNvbnN0ICRlZGl0VHlwZUJveCA9ICQoJzxzcGFuIC8+JykuZHhTZWxlY3RCb3goe1xyXG4gICAgICBkYXRhU291cmNlOiBncmlkQ29sdW1uVHlwZXMsXHJcbiAgICAgIHZhbHVlOiBjb2x1bW4uZGF0YVR5cGUgfHwgR3JpZERhdGFDb2x1bW5EYXRhVHlwZS5EZWZhdWx0LFxyXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBjb2x1bW4gdHlwZS4uLicsXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoeyB2YWx1ZSB9KSA9PiB7XHJcbiAgICAgICAgdGhpcy5ncmlkLmNvbHVtbk9wdGlvbihkYXRhRmllbGQsICdkYXRhVHlwZScsIHZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfSkuYWRkQ2xhc3MoJ2lzem9sZWEtc20nKS5hcHBlbmRUbygkZWRpdFR5cGVQYW5lbCk7XHJcblxyXG4gICAgbGV0IHByZXZWYWx1ZSA9ICEhY29sdW1uLndpZHRoID8gY29sdW1uLndpZHRoLnRvU3RyaW5nKCkgOiAnJztcclxuXHJcbiAgICBjb25zdCBvbldpZHRoVmFsdWVDaGFuZ2VkID0gKGUpID0+IHtcclxuICAgICAgbGV0IG5ld1ZhbHVlID0gZS5jb21wb25lbnQub3B0aW9uKCd2YWx1ZScpO1xyXG5cclxuICAgICAgaWYgKCFuZXdWYWx1ZSB8fCBuZXdWYWx1ZSA9PT0gJ2luaGVyaXQnKSB7XHJcbiAgICAgICAgbmV3VmFsdWUgPSAnJztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFwcmV2VmFsdWUgfHwgcHJldlZhbHVlID09PSAnaW5oZXJpdCcpIHtcclxuICAgICAgICBwcmV2VmFsdWUgPSAnJztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKG5ld1ZhbHVlICE9PSBwcmV2VmFsdWUpIHtcclxuICAgICAgICBwcmV2VmFsdWUgPSBuZXdWYWx1ZTtcclxuICAgICAgICB0aGlzLmdyaWQuY29sdW1uT3B0aW9uKGRhdGFGaWVsZCwgJ3dpZHRoJywgbmV3VmFsdWUgfHwgJ2luaGVyaXQnKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmdyaWRSZXBhaW50UXVldWVkKSB7XHJcbiAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZC5yZXBhaW50KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZFJlcGFpbnRRdWV1ZWQgPSBmYWxzZTtcclxuICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgICB0aGlzLmdyaWRSZXBhaW50UXVldWVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCAkZWRpdFdpZHRoQm94ID0gJCgnPHNwYW4gLz4nKS5keFRleHRCb3goe1xyXG4gICAgICB0ZXh0OiBwcmV2VmFsdWUgPT09ICdpbmhlcml0JyA/ICcnIDogcHJldlZhbHVlLFxyXG4gICAgICBwbGFjZWhvbGRlcjogJ1NldCB3aWR0aC4uLicsXHJcbiAgICAgIG9uRW50ZXJLZXk6ICgpID0+ICRlZGl0V2lkdGhCb3guZHhUZXh0Qm94KCdpbnN0YW5jZScpLmJsdXIoKSxcclxuICAgICAgb25Gb2N1c091dDogb25XaWR0aFZhbHVlQ2hhbmdlZCxcclxuICAgICAgb25WYWx1ZUNoYW5nZWQ6IG9uV2lkdGhWYWx1ZUNoYW5nZWRcclxuICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLXNtJylcclxuICAgICAgLmFwcGVuZFRvKCRlZGl0V2lkdGhQYW5lbClcclxuICAgICAgLm9uKCdjbGljaycsIChlKSA9PiB7XHJcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZWRpdFdpZHRoRWRpdEJveGVzW2NvbHVtbi52aXNpYmxlSW5kZXhdID0gJGVkaXRXaWR0aEJveC5keFRleHRCb3goJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRHcmlkSGVhZGVyQ2VsbCgkY2VsbEVsOiBKUXVlcnksIGFkZGl0aW9uYWxTZXR0aW5nczogSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGUpIHtcclxuICAgIGNvbnN0ICRjb2x1bW5DYXB0aW9uRWwgPSAkY2VsbEVsLmZpbmQoJy5keC1kYXRhZ3JpZC10ZXh0LWNvbnRlbnQnKTtcclxuICAgIGNvbnN0IHRvb2x0aXAgPSBhZGRpdGlvbmFsU2V0dGluZ3MgJiYgYWRkaXRpb25hbFNldHRpbmdzLnRvb2x0aXA7XHJcbiAgICBjb25zdCBjYXB0aW9uID0gYWRkaXRpb25hbFNldHRpbmdzICYmIGFkZGl0aW9uYWxTZXR0aW5ncy5jYXB0aW9uO1xyXG5cclxuICAgICRjZWxsRWwuYXR0cigndGl0bGUnLCB0b29sdGlwIHx8IHZvaWQgMCk7XHJcblxyXG4gICAgaWYgKGNhcHRpb24pIHtcclxuICAgICAgJGNvbHVtbkNhcHRpb25FbC50ZXh0KGNhcHRpb24pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW50ZXJmYWNlIElHYXVnZVN1YnZhbHVlc09wdGlvbnMge1xyXG4gIHN1YnZhbHVlczogSVN1YnZhbHVlT3B0aW9uc1tdO1xyXG4gIHR5cGU6IHN0cmluZztcclxuICB3aWR0aDogbnVtYmVyO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSVN1YnZhbHVlT3B0aW9ucyB7XHJcbiAga2V5OiBudW1iZXI7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGlzQm91bmQ6IGJvb2xlYW47XHJcbiAgbWVhc3VyZUlkOiBzdHJpbmc7XHJcbiAgdmFsdWU6IG51bWJlcjtcclxuICBjb2xvcjogc3RyaW5nO1xyXG59XHJcblxyXG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcclxuICBzdWJ2YWx1ZXM6IFtdLFxyXG4gIHR5cGU6ICd0cmlhbmdsZU1hcmtlcicsXHJcbiAgY29sb3I6ICcjODc5OGE1JyxcclxuICBzZWNvbmRDb2xvcjogJyNlMThlOTInLFxyXG4gIHdpZHRoOiAxMCxcclxuICBpc0N1c3RvbVBhbGV0dGU6IGZhbHNlLFxyXG4gIHBhbGV0dGU6IG51bGwsXHJcbiAgY3VzdG9tUGFsZXR0ZTogWycjNjFhNTk1JywgJ0dyZXknLCAncmdiKDE1MywgMTAyLCAyNTUpJywgJ05hdnknXVxyXG59IGFzIElHYXVnZVN1YnZhbHVlc09wdGlvbnM7XHJcblxyXG5jb25zdCBDU1NfQ0xBU1MgPSAnaXNvei1zdWJ2YWx1ZUVkaXRvckZvcm1Hcm91cCc7XHJcbmNvbnN0IE5BTUVfSVRFTV9DU1NfQ0xBU1MgPSBgJHtDU1NfQ0xBU1N9X19uYW1lYDtcclxuY29uc3QgSVNfQk9VTkRfSVRFTV9DU1NfQ0xBU1MgPSBgJHtDU1NfQ0xBU1N9X19pcy1ib3VuZGA7XHJcbmNvbnN0IFZBTFVFX0lURU1fQ1NTX0NMQVNTID0gYCR7Q1NTX0NMQVNTfV9fdmFsdWVgO1xyXG5jb25zdCBNRUFTVVJFX0lEX0lURU1fQ1NTX0NMQVNTID0gYCR7Q1NTX0NMQVNTfV9fbWVhc3VyZS1pZGA7XHJcbmNvbnN0IENPTE9SX0lURU1fQ1NTX0NMQVNTID0gYCR7Q1NTX0NMQVNTfV9fY29sb3JgO1xyXG5cclxuY29uc3QgQ0lSQ0xVQVJfSU5ESUNBVE9SX1RZUEVTID0gWydyZWN0YW5nbGVOZWVkbGUnLCAndHJpYW5nbGVOZWVkbGUnLCAncmFuZ2VCYXInLCAndHJpYW5nbGVNYXJrZXInLCAndGV4dENsb3VkJ107XHJcbmNvbnN0IExJTkVBUl9JTkRJQ0FUT1JfVFlQRVMgPSBbJ3JlY3RhbmdsZScsICdjaXJjbGUnLCAncmhvbWJ1cycsICdyYW5nZUJhcicsICd0cmlhbmdsZU1hcmtlcicsICd0ZXh0Q2xvdWQnXTtcclxuXHJcbmNvbnN0IENJUkNVTEFSX1ZJRVdfVFlQRVM6IERldkV4cHJlc3MuRGFzaGJvYXJkLk1vZGVsLkdhdWdlVmlld1R5cGVbXSA9IFsnQ2lyY3VsYXJGdWxsJywgJ0NpcmN1bGFySGFsZicsICdDaXJjdWxhclF1YXJ0ZXJMZWZ0JywgJ0NpcmN1bGFyUXVhcnRlclJpZ2h0JywgJ0NpcmN1bGFyVGhyZWVGb3VydGgnXTtcclxuY29uc3QgTElORUFSX1ZJRVdfVFlQRVM6IERldkV4cHJlc3MuRGFzaGJvYXJkLk1vZGVsLkdhdWdlVmlld1R5cGVbXSA9IFsnTGluZWFySG9yaXpvbnRhbCcsICdMaW5lYXJWZXJ0aWNhbCddO1xyXG5cclxuY29uc3QgREVGQVVMVF9QQUxFVFRFID0gWycjMWRiMmY1JywgJyNmNTU2NGEnLCAnIzk3Yzk1YycsICcjZmZjNzIwJywgJyNlYjM1NzMnLCAnI2E2M2RiOCcsICcjNjU5M2JjJywgJyNmYWEzMzUnLCAnI2ZmODg3YyddO1xyXG5cclxuY29uc3QgUFJFREVGSU5FRF9QQUxFVFRFUyA9IFsnQnJpZ2h0JywgJ0hhcm1vbnkgTGlnaHQnLCAnT2NlYW4nLCAnUGFzdGVsJywgJ1NvZnQnLCAnU29mdCBQYXN0ZWwnLCAnVmludGFnZScsXHJcbiAgJ1Zpb2xldCcsICdDYXJtaW5lJywgJ0RhcmsgTW9vbicsICdEYXJrIFZpb2xldCcsICdHcmVlbiBNaXN0JywgJ1NvZnQgQmx1ZScsICdNYXRlcmlhbCcsICdPZmZpY2UnXTtcclxuXHJcbi8vIDEuIE1vZGVsXHJcbmNvbnN0IHByb3BlcnR5ID0ge1xyXG4gIG93bmVyVHlwZTogRGV2RXhwcmVzcz8uRGFzaGJvYXJkPy5Nb2RlbD8uR2F1Z2VJdGVtLFxyXG4gIHByb3BlcnR5TmFtZTogJ0dhdWdlU3VidmFsdWVzU2V0dGluZ3MnLFxyXG4gIGRlZmF1bHRWYWx1ZTogSlNPTi5zdHJpbmdpZnkoZGVmYXVsdE9wdGlvbnMpLFxyXG4gIHZhbHVlVHlwZTogJ3N0cmluZydcclxufSBhcyBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5DdXN0b21Qcm9wZXJ0eU1ldGFkYXRhO1xyXG5cclxuRGV2RXhwcmVzcz8uRGFzaGJvYXJkPy5Nb2RlbD8ucmVnaXN0ZXJDdXN0b21Qcm9wZXJ0eShwcm9wZXJ0eSk7XHJcblxyXG4vLyAyLiBWaWV3ZXJcclxuZnVuY3Rpb24gb25JdGVtV2lkZ2V0T3B0aW9uc1ByZXBhcmVkKGFyZ3M6IERldkV4cHJlc3MuRGFzaGJvYXJkLkl0ZW1XaWRnZXRPcHRpb25FdmVudEFyZ3MpIHtcclxuICBpZiAoYXJncy5kYXNoYm9hcmRJdGVtIGluc3RhbmNlb2YgRGV2RXhwcmVzcz8uRGFzaGJvYXJkPy5Nb2RlbD8uR2F1Z2VJdGVtKSB7XHJcbiAgICBjb25zdCBzdG9yZWRPcHRpb25zID0gZ2V0T3B0aW9ucyhhcmdzLmRhc2hib2FyZEl0ZW0pO1xyXG5cclxuICAgIGNvbnN0IGdhdWdlT3B0aW9ucyA9IGFyZ3Mub3B0aW9ucyBhcyBEZXZFeHByZXNzLnZpei5keExpbmVhckdhdWdlT3B0aW9ucyB8IERldkV4cHJlc3Mudml6LmR4Q2lyY3VsYXJHYXVnZU9wdGlvbnM7XHJcbiAgICBnYXVnZU9wdGlvbnMuc3VidmFsdWVzID0gZ2F1Z2VPcHRpb25zLnN1YnZhbHVlcyB8fCBbXTtcclxuICAgIGdhdWdlT3B0aW9ucy5zdWJ2YWx1ZUluZGljYXRvciA9IGdhdWdlT3B0aW9ucy5zdWJ2YWx1ZUluZGljYXRvciB8fCB7fTtcclxuXHJcbiAgICBnYXVnZU9wdGlvbnMuc3VidmFsdWVJbmRpY2F0b3IudHlwZSA9IHN0b3JlZE9wdGlvbnMudHlwZSBhcyBhbnk7XHJcbiAgICBnYXVnZU9wdGlvbnMuc3VidmFsdWVJbmRpY2F0b3Iud2lkdGggPSBzdG9yZWRPcHRpb25zLndpZHRoO1xyXG5cclxuICAgIGNvbnN0IGhhc1RhcmdldFZhbHVlID0gISFhcmdzLmRhc2hib2FyZEl0ZW0uZ2F1Z2VzKClbMF0/LnRhcmdldFZhbHVlKCk7XHJcbiAgICBnYXVnZU9wdGlvbnMuc3VidmFsdWVJbmRpY2F0b3IucGFsZXR0ZSA9IHN0b3JlZE9wdGlvbnMuc3VidmFsdWVzLmZpbHRlcigocykgPT4gaGFzVGFyZ2V0VmFsdWUgfHwgcy5rZXkgPiAtMSkubWFwKChzKSA9PiBzLmNvbG9yKTtcclxuXHJcbiAgICBzdG9yZWRPcHRpb25zLnN1YnZhbHVlcy5mb3JFYWNoKChzdWJ2YWx1ZSkgPT4ge1xyXG4gICAgICBpZiAoc3VidmFsdWUua2V5ID09PSAtMSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgdmFsdWUgPSBzdWJ2YWx1ZS5pc0JvdW5kID8gYXJncy5pdGVtRGF0YS5nZXRNZWFzdXJlVmFsdWUoc3VidmFsdWUubWVhc3VyZUlkKS5nZXRWYWx1ZSgpIDogc3VidmFsdWUudmFsdWU7XHJcbiAgICAgIGdhdWdlT3B0aW9ucy5zdWJ2YWx1ZXMucHVzaCh2YWx1ZSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbi8vIDMuIERlc2lnbmVyXHJcbmZ1bmN0aW9uIG9uQ3VzdG9taXplU2VjdGlvbnMoYXJnczogRGV2RXhwcmVzcy5EYXNoYm9hcmQuRGVzaWduZXIuQ3VzdG9taXplU2VjdGlvbnNFdmVudEFyZ3MpIHtcclxuICBjb25zdCBnYXVnZUl0ZW0gPSBhcmdzLmRhc2hib2FyZEl0ZW07XHJcbiAgaWYgKGdhdWdlSXRlbSBpbnN0YW5jZW9mIERldkV4cHJlc3M/LkRhc2hib2FyZD8uTW9kZWw/LkdhdWdlSXRlbSkge1xyXG4gICAgYXJncy5hZGRTZWN0aW9uKHtcclxuICAgICAgdGl0bGU6ICdTdWJ2YWx1ZXMnLFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogcHJvcGVydHkucHJvcGVydHlOYW1lLFxyXG4gICAgICAgICAgdGVtcGxhdGUoYSwgZWxlbWVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBidXR0b25Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICAgICAgbmV3IERldkV4cHJlc3MudWkuZHhCdXR0b24oYnV0dG9uQ29udGFpbmVyLCB7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ0VkaXQgaW4gV2l6YXJkJyxcclxuICAgICAgICAgICAgICBvbkNsaWNrKCkge1xyXG4gICAgICAgICAgICAgICAgc2hvd1BvcHVwKGdhdWdlSXRlbSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBidXR0b25Db250YWluZXI7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNob3dQb3B1cChnYXVnZUl0ZW06IERldkV4cHJlc3MuRGFzaGJvYXJkLk1vZGVsLkdhdWdlSXRlbSkge1xyXG4gIGNvbnN0IHBvcHVwQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChwb3B1cENvbnRhaW5lcik7XHJcbiAgY29uc3QgcG9wdXBPcHRpb25zID0ge1xyXG4gICAgd2lkdGg6ICc4MDBweCcsXHJcbiAgICBoZWlnaHQ6ICdhdXRvJyxcclxuICAgIG1heEhlaWdodDogJzEwMCUnLFxyXG4gICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXHJcbiAgICBjb250ZW50VGVtcGxhdGUodGhpczogYW55LCBjb250ZW50Q29udGFpbmVyKSB7XHJcbiAgICAgIGNvbnN0IHN1YnZhbHVlc0Zvcm1Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgY29uc3Qgc3VidmFsdWVzZm9ybU9wdGlvbnMgPSBnZXRTdWJ2YWx1ZUZvcm1PcHRpb25zKGdhdWdlSXRlbSk7XHJcbiAgICAgIHRoaXMuX3N1YnZhbHVlc0Zvcm0gPSBuZXcgRGV2RXhwcmVzcy51aS5keEZvcm0oc3VidmFsdWVzRm9ybUNvbnRhaW5lciwgc3VidmFsdWVzZm9ybU9wdGlvbnMpO1xyXG5cclxuICAgICAgY29uc3QgaW5kaWNhdG9yRm9ybUNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICBjb25zdCBpbmRpY2F0b3Jmb3JtT3B0aW9ucyA9IGdldEluZGljYXRvckZvcm1PcHRpb25zKGdhdWdlSXRlbSk7XHJcbiAgICAgIHRoaXMuX2luZGljYXRvckZvcm0gPSBuZXcgRGV2RXhwcmVzcy51aS5keEZvcm0oaW5kaWNhdG9yRm9ybUNvbnRhaW5lciwgaW5kaWNhdG9yZm9ybU9wdGlvbnMpO1xyXG5cclxuICAgICAgY29uc3QgY29udGVudCA9ICQoJzxkaXYgLz4nKS5hcHBlbmQoc3VidmFsdWVzRm9ybUNvbnRhaW5lciwgaW5kaWNhdG9yRm9ybUNvbnRhaW5lcik7XHJcblxyXG4gICAgICBjb25zdCBzY3JvbGxWaWV3ID0gJCgnPGRpdiAvPicpO1xyXG4gICAgICBzY3JvbGxWaWV3LmFwcGVuZChjb250ZW50KTtcclxuICAgICAgc2Nyb2xsVmlldy5keFNjcm9sbFZpZXcoe1xyXG4gICAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgICAgaGVpZ2h0OiAnMTAwJSdcclxuICAgICAgfSk7XHJcblxyXG4gICAgICByZXR1cm4gc2Nyb2xsVmlldztcclxuICAgIH0sXHJcbiAgICBvbkhpZGRlbigpIHtcclxuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChwb3B1cENvbnRhaW5lcik7XHJcbiAgICB9LFxyXG4gICAgdGl0bGU6ICdTdWJ2YWx1ZXMgV2l6YXJkJyxcclxuICB9IGFzIERldkV4cHJlc3MudWkuZHhQb3B1cC5Qcm9wZXJ0aWVzO1xyXG4gIGNvbnN0IHBvcHVwID0gbmV3IERldkV4cHJlc3MudWkuZHhQb3B1cChwb3B1cENvbnRhaW5lciwgcG9wdXBPcHRpb25zKTtcclxuICBwb3B1cC5zaG93KCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldE9wdGlvbnMoZ2FndWVJdGVtOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5HYXVnZUl0ZW0pOiBJR2F1Z2VTdWJ2YWx1ZXNPcHRpb25zIHtcclxuICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShnYWd1ZUl0ZW0uY3VzdG9tUHJvcGVydGllcy5nZXRWYWx1ZShwcm9wZXJ0eS5wcm9wZXJ0eU5hbWUpIGFzIHN0cmluZykgYXMgSUdhdWdlU3VidmFsdWVzT3B0aW9ucztcclxuICBjb25zdCBoYXNUYXJnZXRWYWx1ZSA9ICEhZ2FndWVJdGVtLmdhdWdlcygpWzBdPy50YXJnZXRWYWx1ZSgpO1xyXG5cclxuICBpZiAoaGFzVGFyZ2V0VmFsdWUgJiYgKCFkYXRhLnN1YnZhbHVlcyB8fCAhZGF0YS5zdWJ2YWx1ZXMuc29tZSgocykgPT4gcy5rZXkgPT09IC0xKSkpIHtcclxuICAgIGRhdGEuc3VidmFsdWVzLnNwbGljZSgwLCAwLCB7XHJcbiAgICAgIGtleTogLTEsXHJcbiAgICAgIG5hbWU6ICdUYXJnZXQgVmFsdWUnLFxyXG4gICAgICBpc0JvdW5kOiBmYWxzZSxcclxuICAgICAgbWVhc3VyZUlkOiAnJyxcclxuICAgICAgdmFsdWU6IDAsXHJcbiAgICAgIGNvbG9yOiBERUZBVUxUX1BBTEVUVEVbKGRhdGEuc3VidmFsdWVzPy5sZW5ndGggfHwgMCkgJSAoREVGQVVMVF9QQUxFVFRFLmxlbmd0aCAtIDEpXSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGRhdGE7XHJcbn1cclxuZnVuY3Rpb24gc2V0T3B0aW9ucyhnYXVnZUl0ZW06IERldkV4cHJlc3MuRGFzaGJvYXJkLk1vZGVsLkdhdWdlSXRlbSwgdmFsdWU6IElHYXVnZVN1YnZhbHVlc09wdGlvbnMpIHtcclxuICByZXR1cm4gZ2F1Z2VJdGVtLmN1c3RvbVByb3BlcnRpZXMuc2V0VmFsdWUocHJvcGVydHkucHJvcGVydHlOYW1lLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xyXG59XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG5mdW5jdGlvbiBjcmVhdGVMaXN0QW5kVG9vbGJhcihmb3JtOiBEZXZFeHByZXNzLnVpLmR4Rm9ybSwgZ2F1Z2VJdGVtOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5HYXVnZUl0ZW0pOiBbSlF1ZXJ5LCBEZXZFeHByZXNzLnVpLmR4TGlzdCwgRGV2RXhwcmVzcy51aS5keFRvb2xiYXJdIHtcclxuICBjb25zdCAkZWxlbWVudCA9ICQoJzxkaXYgLz4nKTtcclxuICBjb25zdCAkdG9vbGJhckNvbnRhaW5lciA9ICQoJzxkaXYgLz4nKTtcclxuICAkZWxlbWVudC5hcHBlbmQoJHRvb2xiYXJDb250YWluZXIpO1xyXG4gIGNvbnN0IGVkaXRCdXR0b24gPSBudWxsO1xyXG4gIGxldCBsaXN0OiBEZXZFeHByZXNzLnVpLmR4TGlzdCA9IG51bGw7XHJcblxyXG4gIGNvbnN0IHRvb2xiYXJPcHRpb25zID0ge1xyXG4gICAgaXRlbXM6IFt7XHJcbiAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgaWNvbjogJ2FkZCcsXHJcbiAgICAgICAgc3R5bGluZ01vZGU6ICd0ZXh0JyxcclxuICAgICAgICBvbkNsaWNrKGUpIHtcclxuICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKGdhdWdlSXRlbSk7XHJcbiAgICAgICAgICBjb25zdCBrZXkgPSBvcHRpb25zLnN1YnZhbHVlcy5yZWR1Y2UoKGFjYywgaXRlbSkgPT4gYWNjIDwgaXRlbS5rZXkgPyBpdGVtLmtleSA6IGFjYywgMCkgKyAxO1xyXG4gICAgICAgICAgY29uc3QgbmV3U3VidmFsdWU6IElTdWJ2YWx1ZU9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIGtleSxcclxuICAgICAgICAgICAgbmFtZTogYFN1YnZhbHVlICR7a2V5fWAsXHJcbiAgICAgICAgICAgIGlzQm91bmQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBtZWFzdXJlSWQ6ICcnLFxyXG4gICAgICAgICAgICB2YWx1ZTogMCxcclxuICAgICAgICAgICAgY29sb3I6IERFRkFVTFRfUEFMRVRURVtvcHRpb25zLnN1YnZhbHVlcy5sZW5ndGggJSAoREVGQVVMVF9QQUxFVFRFLmxlbmd0aCAtIDEpXSxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICBmb3JtLm9wdGlvbignZm9ybURhdGEnLCBuZXdTdWJ2YWx1ZSk7XHJcblxyXG4gICAgICAgICAgY29uc3QgaXRlbUluRGF0YVNvdXJjZSA9IG9wdGlvbnMuc3VidmFsdWVzLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5rZXkgPT09IG5ld1N1YnZhbHVlLmtleSlbMF07XHJcbiAgICAgICAgICBpZiAoIWl0ZW1JbkRhdGFTb3VyY2UpIHtcclxuICAgICAgICAgICAgb3B0aW9ucy5zdWJ2YWx1ZXMucHVzaChuZXdTdWJ2YWx1ZSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IG9wdGlvbnMuc3VidmFsdWVzLmluZGV4T2YoaXRlbUluRGF0YVNvdXJjZSk7XHJcbiAgICAgICAgICAgIG9wdGlvbnNbaW5kZXhdID0gbmV3U3VidmFsdWU7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgc2V0T3B0aW9ucyhnYXVnZUl0ZW0sIG9wdGlvbnMpO1xyXG4gICAgICAgICAgbGlzdC5yZWxvYWQoKTtcclxuICAgICAgICAgIGxpc3Qub3B0aW9uKCdzZWxlY3RlZEl0ZW0nLCBvcHRpb25zLnN1YnZhbHVlc1tvcHRpb25zLnN1YnZhbHVlcy5sZW5ndGggLSAxXSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfVxyXG4gICAgfV1cclxuICB9IGFzIERldkV4cHJlc3MudWkuZHhUb29sYmFyT3B0aW9ucztcclxuXHJcbiAgY29uc3QgdXBkYXRlVG9vbGJhclN0YXRlID0gKGhhc1NlbGVjdGVkSXRlbTogYm9vbGVhbikgPT4ge1xyXG4gICAgZWRpdEJ1dHRvbiAmJiBlZGl0QnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCAhaGFzU2VsZWN0ZWRJdGVtKTtcclxuICB9O1xyXG5cclxuICBjb25zdCB0b29sYmFyID0gbmV3IERldkV4cHJlc3MudWkuZHhUb29sYmFyKCR0b29sYmFyQ29udGFpbmVyLCB0b29sYmFyT3B0aW9ucyk7XHJcbiAgZm9ybS5lbGVtZW50KCkuZmluZChgLiR7Q1NTX0NMQVNTfWApLmNzcygnZGlzcGxheScsICdub25lJyk7XHJcblxyXG4gIGNvbnN0IGxpc3RPcHRpb25zID0ge1xyXG4gICAgZGF0YVNvdXJjZTogbmV3IERldkV4cHJlc3MuZGF0YS5EYXRhU291cmNlKHtcclxuICAgICAgbG9hZDogKCkgPT4gZ2V0T3B0aW9ucyhnYXVnZUl0ZW0pLnN1YnZhbHVlcyxcclxuICAgICAgcmVtb3ZlOiAoKSA9PiB7IH1cclxuICAgIH0gYXMgYW55KSxcclxuICAgIGRpc3BsYXlFeHByOiAnbmFtZScsXHJcbiAgICBoZWlnaHQ6ICcyMDBweCcsXHJcbiAgICBrZXlFeHByOiAna2V5JyxcclxuICAgIG5vRGF0YVRleHQ6ICdBZGQgYSBTdWJ2YWx1ZScsXHJcbiAgICBhbGxvd0l0ZW1EZWxldGluZzogdHJ1ZSxcclxuICAgIGl0ZW1EZWxldGVNb2RlOiAnc3RhdGljJyxcclxuICAgIHNlbGVjdGlvbk1vZGU6ICdzaW5nbGUnLFxyXG4gICAgb25Db250ZW50UmVhZHkoZSkgeyB1cGRhdGVUb29sYmFyU3RhdGUoISFlLmNvbXBvbmVudC5vcHRpb24oJ3NlbGVjdGVkSXRlbScpKTsgfSxcclxuICAgIG9uSXRlbVJlbmRlcmVkKGUpIHtcclxuICAgICAgY29uc3QgaXRlbURhdGEgPSBlLml0ZW1EYXRhIGFzIElTdWJ2YWx1ZU9wdGlvbnM7XHJcbiAgICAgIGlmIChpdGVtRGF0YS5rZXkgPT09IC0xKSB7XHJcbiAgICAgICAgY29uc3QgZGVsZXRlRWxlbWVudCA9IGUuaXRlbUVsZW1lbnRbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZHgtbGlzdC1zdGF0aWMtZGVsZXRlLWJ1dHRvbi1jb250YWluZXInKVswXSBhcyBIVE1MRGl2RWxlbWVudDtcclxuICAgICAgICBkZWxldGVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBvblNlbGVjdGlvbkNoYW5nZWQoZSkge1xyXG4gICAgICB1cGRhdGVUb29sYmFyU3RhdGUoISFlLmNvbXBvbmVudC5vcHRpb24oJ3NlbGVjdGVkSXRlbScpKTtcclxuICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtID0gZS5jb21wb25lbnQub3B0aW9uKCdzZWxlY3RlZEl0ZW0nKTtcclxuICAgICAgZm9ybS5vcHRpb24oJ2Zvcm1EYXRhJywgc2VsZWN0ZWRJdGVtKTtcclxuICAgICAgY29uc3Qgd2FzZm9ybVZpc2libGUgPSBmb3JtLmVsZW1lbnQoKS5maW5kKGAuJHtDU1NfQ0xBU1N9YCkuY3NzKCdkaXNwbGF5JykgPT09ICdibG9jayc7XHJcbiAgICAgIGNvbnN0IHNob3VsZEZvcm1CZVZpc2libGUgPSAhIXNlbGVjdGVkSXRlbTtcclxuICAgICAgaWYgKCF3YXNmb3JtVmlzaWJsZSAmJiBzaG91bGRGb3JtQmVWaXNpYmxlIHx8IHdhc2Zvcm1WaXNpYmxlICYmICFzaG91bGRGb3JtQmVWaXNpYmxlKSB7XHJcbiAgICAgICAgZm9ybS5lbGVtZW50KCkuZmluZChgLiR7Q1NTX0NMQVNTfWApLmNzcygnZGlzcGxheScsIHNob3VsZEZvcm1CZVZpc2libGUgPyAnYmxvY2snIDogJ25vbmUnKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uSXRlbURlbGV0ZWQ6IChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKGdhdWdlSXRlbSk7XHJcbiAgICAgIGNvbnN0IGtleSA9IGUuaXRlbURhdGEua2V5O1xyXG4gICAgICBjb25zdCBpbmRleCA9IG9wdGlvbnMuc3VidmFsdWVzLmluZGV4T2Yob3B0aW9ucy5zdWJ2YWx1ZXMuZmlsdGVyKChzdWJ2YWx1ZSkgPT4gc3VidmFsdWUua2V5ID09PSBrZXkpWzBdKTtcclxuICAgICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgICBvcHRpb25zLnN1YnZhbHVlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgIHNldE9wdGlvbnMoZ2F1Z2VJdGVtLCBvcHRpb25zKTtcclxuICAgICAgfVxyXG4gICAgICBsaXN0LnJlbG9hZCgpO1xyXG4gICAgICBsaXN0Lm9wdGlvbignc2VsZWN0ZWRJdGVtJywgb3B0aW9ucy5zdWJ2YWx1ZXNbb3B0aW9ucy5zdWJ2YWx1ZXMubGVuZ3RoIC0gMV0pO1xyXG4gICAgfVxyXG4gIH0gYXMgRGV2RXhwcmVzcy51aS5keExpc3RPcHRpb25zO1xyXG5cclxuICBjb25zdCAkbGlzdENvbnRhaW5lciA9ICQoJzxkaXYgLz4nKTtcclxuICAkZWxlbWVudC5hcHBlbmQoJGxpc3RDb250YWluZXIpO1xyXG5cclxuICBsaXN0ID0gbmV3IERldkV4cHJlc3MudWkuZHhMaXN0KCRsaXN0Q29udGFpbmVyLCBsaXN0T3B0aW9ucyk7XHJcblxyXG4gIHJldHVybiBbJGVsZW1lbnQsIGxpc3QsIHRvb2xiYXJdO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRTdWJ2YWx1ZUZvcm1PcHRpb25zKGdhdWdlSXRlbTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VJdGVtKTogRGV2RXhwcmVzcy51aS5keEZvcm1PcHRpb25zIHtcclxuICBsZXQgaXRlbXNMaXN0OiBEZXZFeHByZXNzLnVpLmR4TGlzdCB8IG51bGwgPSBudWxsO1xyXG4gIGNvbnN0IHVwZGF0ZUZvcm1TdGF0ZSA9IChmb3JtOiBEZXZFeHByZXNzLnVpLmR4Rm9ybSkgPT4ge1xyXG4gICAgY29uc3QgdmFsdWVFZGl0b3IgPSBmb3JtLmdldEVkaXRvcigndmFsdWUnKTtcclxuICAgIGNvbnN0IG1lYXN1cmVJZEVkaXRvciA9IGZvcm0uZ2V0RWRpdG9yKCdtZWFzdXJlSWQnKTtcclxuICAgIGNvbnN0IG5hbWVFZGl0b3IgPSBmb3JtLmdldEVkaXRvcignbmFtZScpO1xyXG4gICAgY29uc3QgaXNCb3VuZCA9IGZvcm0ub3B0aW9uKCdmb3JtRGF0YScpLmlzQm91bmQ7XHJcbiAgICBjb25zdCBpc1RhcmdldFZhbHVlID0gZm9ybS5vcHRpb24oJ2Zvcm1EYXRhJykua2V5ID09PSAtMTtcclxuXHJcbiAgICB2YWx1ZUVkaXRvciAmJiB2YWx1ZUVkaXRvci5vcHRpb24oJ2Rpc2FibGVkJywgaXNCb3VuZCk7XHJcbiAgICBtZWFzdXJlSWRFZGl0b3IgJiYgbWVhc3VyZUlkRWRpdG9yLm9wdGlvbignZGlzYWJsZWQnLCAhaXNCb3VuZCk7XHJcblxyXG4gICAgZm9ybS5lbGVtZW50KCkuZmluZChgLiR7SVNfQk9VTkRfSVRFTV9DU1NfQ0xBU1N9YCkuY3NzKCdkaXNwbGF5JywgIWlzVGFyZ2V0VmFsdWUgPyAnZmxleCcgOiAnbm9uZScpO1xyXG4gICAgZm9ybS5lbGVtZW50KCkuZmluZChgLiR7VkFMVUVfSVRFTV9DU1NfQ0xBU1N9YCkuY3NzKCdkaXNwbGF5JywgIWlzVGFyZ2V0VmFsdWUgPyAnZmxleCcgOiAnbm9uZScpO1xyXG4gICAgZm9ybS5lbGVtZW50KCkuZmluZChgLiR7TUVBU1VSRV9JRF9JVEVNX0NTU19DTEFTU31gKS5jc3MoJ2Rpc3BsYXknLCAhaXNUYXJnZXRWYWx1ZSA/ICdmbGV4JyA6ICdub25lJyk7XHJcblxyXG4gICAgbmFtZUVkaXRvciAmJiBuYW1lRWRpdG9yLm9wdGlvbignZGlzYWJsZWQnLCBpc1RhcmdldFZhbHVlKTtcclxuICB9O1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgZm9ybURhdGE6IG51bGwsXHJcbiAgICBjb2xDb3VudDogMixcclxuICAgIGl0ZW1zOiBbXHJcbiAgICAgIHtcclxuICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgICBjYXB0aW9uOiAnU3VidmFsdWVzIGl0ZW1zJyxcclxuICAgICAgICB0ZW1wbGF0ZTogKGFyZ3MpID0+IHtcclxuICAgICAgICAgIGNvbnN0IFskY29udGFpbmVyLCBsaXN0XSA9IGNyZWF0ZUxpc3RBbmRUb29sYmFyKGFyZ3MuY29tcG9uZW50LCBnYXVnZUl0ZW0pO1xyXG4gICAgICAgICAgaXRlbXNMaXN0ID0gbGlzdDtcclxuXHJcbiAgICAgICAgICByZXR1cm4gJGNvbnRhaW5lcjtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ3N1YnZhbHVlRWRpdG9yJyxcclxuICAgICAgICBjc3NDbGFzczogQ1NTX0NMQVNTLFxyXG4gICAgICAgIGl0ZW1UeXBlOiAnZ3JvdXAnLFxyXG4gICAgICAgIGNhcHRpb246ICdJdGVtIG9wdGlvbnMnLFxyXG4gICAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ25hbWUnLFxyXG4gICAgICAgICAgICBjc3NDbGFzczogTkFNRV9JVEVNX0NTU19DTEFTUyxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4VGV4dEJveCcsXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICB2YWx1ZUNoYW5nZUV2ZW50OiAna2V5dXAnXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRleHRCb3guUHJvcGVydGllc1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnaXNCb3VuZCcsXHJcbiAgICAgICAgICAgIGNzc0NsYXNzOiBJU19CT1VORF9JVEVNX0NTU19DTEFTUyxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4UmFkaW9Hcm91cCcsXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBkaXNwbGF5RXhwcjogJ3RleHQnLFxyXG4gICAgICAgICAgICAgIHZhbHVlRXhwcjogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICBsYXlvdXQ6ICdob3Jpem9udGFsJyxcclxuICAgICAgICAgICAgICBpdGVtczogW3tcclxuICAgICAgICAgICAgICAgIHRleHQ6ICdVbmJvdW5kJywgdmFsdWU6IGZhbHNlXHJcbiAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgdGV4dDogJ0JvdW5kJywgdmFsdWU6IHRydWVcclxuICAgICAgICAgICAgICB9XVxyXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhSYWRpb0dyb3VwLlByb3BlcnRpZXMsXHJcbiAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ1R5cGUnLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAndmFsdWUnLFxyXG4gICAgICAgICAgICBjc3NDbGFzczogVkFMVUVfSVRFTV9DU1NfQ0xBU1MsXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeE51bWJlckJveCcsXHJcbiAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ1ZhbHVlJyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIHNob3dTcGluQnV0dG9uczogdHJ1ZSxcclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4TnVtYmVyQm94LlByb3BlcnRpZXNcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ21lYXN1cmVJZCcsXHJcbiAgICAgICAgICAgIGNzc0NsYXNzOiBNRUFTVVJFX0lEX0lURU1fQ1NTX0NMQVNTLFxyXG4gICAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhTZWxlY3RCb3gnLFxyXG4gICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdIaWRkZW4gbWVhc3VyZXMnLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgZGlzcGxheUV4cHI6ICd0ZXh0JyxcclxuICAgICAgICAgICAgICB2YWx1ZUV4cHI6ICd2YWx1ZScsXHJcbiAgICAgICAgICAgICAgaXRlbXM6IGdhdWdlSXRlbS5oaWRkZW5NZWFzdXJlcygpLm1hcCgobWVhc3VyZSkgPT4gKHtcclxuICAgICAgICAgICAgICAgIHRleHQ6IGdldE1lYXN1cmVEaXNhcGxheVRleHQobWVhc3VyZSksXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogbWVhc3VyZS51bmlxdWVOYW1lKClcclxuICAgICAgICAgICAgICB9KSksXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveC5Qcm9wZXJ0aWVzXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnY29sb3InLFxyXG4gICAgICAgICAgICBjc3NDbGFzczogQ09MT1JfSVRFTV9DU1NfQ0xBU1MsXHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ2NvbG9yJyxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4Q29sb3JCb3gnLFxyXG4gICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdDb2xvcicsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgXVxyXG4gICAgICB9XHJcbiAgICBdLFxyXG4gICAgb25Db250ZW50UmVhZHkoZSkgeyB1cGRhdGVGb3JtU3RhdGUoZS5jb21wb25lbnQpOyB9LFxyXG4gICAgb25GaWVsZERhdGFDaGFuZ2VkKGUpIHtcclxuICAgICAgY29uc3QgZm9ybURhdGEgPSBlLmNvbXBvbmVudC5vcHRpb24oJ2Zvcm1EYXRhJykgYXMgSVN1YnZhbHVlT3B0aW9ucztcclxuICAgICAgY29uc3Qgb3B0aW9ucyA9IGdldE9wdGlvbnMoZ2F1Z2VJdGVtKTtcclxuICAgICAgY29uc3QgZWRpdGVkU3VidmFsdWUgPSBvcHRpb25zLnN1YnZhbHVlcy5maWx0ZXIoKHN1YnZhbHVlKSA9PiBzdWJ2YWx1ZS5rZXkgPT09IGZvcm1EYXRhLmtleSlbMF07XHJcblxyXG4gICAgICBvcHRpb25zLnN1YnZhbHVlc1tvcHRpb25zLnN1YnZhbHVlcy5pbmRleE9mKGVkaXRlZFN1YnZhbHVlKV0gPSBmb3JtRGF0YTtcclxuICAgICAgc2V0T3B0aW9ucyhnYXVnZUl0ZW0sIG9wdGlvbnMpO1xyXG5cclxuICAgICAgaWYgKGVkaXRlZFN1YnZhbHVlICYmIGVkaXRlZFN1YnZhbHVlLm5hbWUgIT09IGZvcm1EYXRhLm5hbWUgJiYgaXRlbXNMaXN0KSB7XHJcbiAgICAgICAgaXRlbXNMaXN0LnJlcGFpbnQoKTtcclxuICAgICAgfVxyXG4gICAgICB1cGRhdGVGb3JtU3RhdGUoZS5jb21wb25lbnQpO1xyXG4gICAgfSxcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRNZWFzdXJlRGlzYXBsYXlUZXh0KG1lYXN1cmU6IERldkV4cHJlc3MuRGFzaGJvYXJkLk1vZGVsLk1lYXN1cmUpOiBzdHJpbmcge1xyXG4gIGlmIChtZWFzdXJlLm5hbWUoKSkge1xyXG4gICAgcmV0dXJuIG1lYXN1cmUubmFtZSgpO1xyXG4gIH1cclxuXHJcbiAgbGV0IHJlc3VsdCA9IG1lYXN1cmUuZGF0YU1lbWJlcigpO1xyXG4gIGlmIChtZWFzdXJlLnN1bW1hcnlUeXBlICYmIG1lYXN1cmUuc3VtbWFyeVR5cGUoKSkge1xyXG4gICAgcmVzdWx0ICs9IGAgKCR7bWVhc3VyZS5zdW1tYXJ5VHlwZSgpfSlgO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0SW5kaWNhdG9yRm9ybU9wdGlvbnMoZ2F1Z2VJdGVtOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5HYXVnZUl0ZW0pOiBEZXZFeHByZXNzLnVpLmR4Rm9ybU9wdGlvbnMge1xyXG4gIGNvbnN0IGN1cnJlbnRWaWV3VHlwZSA9IGdhdWdlSXRlbS52aWV3VHlwZSgpO1xyXG4gIGNvbnN0IGluZGljYXRvclR5cGVzID0gTElORUFSX1ZJRVdfVFlQRVMuc29tZSgodCkgPT4gdCA9PT0gY3VycmVudFZpZXdUeXBlKVxyXG4gICAgPyBMSU5FQVJfSU5ESUNBVE9SX1RZUEVTXHJcbiAgICA6IENJUkNMVUFSX0lORElDQVRPUl9UWVBFUztcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGZvcm1EYXRhOiBnZXRPcHRpb25zKGdhdWdlSXRlbSkgfHwgbnVsbCxcclxuICAgIGl0ZW1zOiBbXHJcbiAgICAgIHtcclxuICAgICAgICBjYXB0aW9uOiAnSW5kaWNhdG9yIG9wdGlvbnMnLFxyXG4gICAgICAgIGl0ZW1UeXBlOiAnZ3JvdXAnLFxyXG4gICAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ3R5cGUnLFxyXG4gICAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhTZWxlY3RCb3gnLFxyXG4gICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdUeXBlJyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIGRpc3BsYXlFeHByOiAndGV4dCcsXHJcbiAgICAgICAgICAgICAgdmFsdWVFeHByOiAndmFsdWUnLFxyXG4gICAgICAgICAgICAgIGl0ZW1zOiBpbmRpY2F0b3JUeXBlcy5tYXAoKHQpID0+ICh7IHRleHQ6IHQsIHZhbHVlOiB0IH0pKSxcclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4U2VsZWN0Qm94LlByb3BlcnRpZXNcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ3dpZHRoJyxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4TnVtYmVyQm94JyxcclxuICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIHNob3dTcGluQnV0dG9uczogdHJ1ZSxcclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4TnVtYmVyQm94T3B0aW9ucyxcclxuICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnV2lkdGgnLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG4gICAgICB9XHJcbiAgICBdLFxyXG4gICAgb25GaWVsZERhdGFDaGFuZ2VkKGUpIHtcclxuICAgICAgY29uc3QgZm9ybURhdGEgPSBlLmNvbXBvbmVudC5vcHRpb24oJ2Zvcm1EYXRhJykgYXMgSUdhdWdlU3VidmFsdWVzT3B0aW9ucztcclxuICAgICAgY29uc3Qgb3B0aW9ucyA9IGdldE9wdGlvbnMoZ2F1Z2VJdGVtKTtcclxuXHJcbiAgICAgIG9wdGlvbnMud2lkdGggPSBmb3JtRGF0YS53aWR0aDtcclxuICAgICAgb3B0aW9ucy50eXBlID0gZm9ybURhdGEudHlwZTtcclxuXHJcbiAgICAgIHNldE9wdGlvbnMoZ2F1Z2VJdGVtLCBvcHRpb25zKTtcclxuICAgIH1cclxuICB9O1xyXG59XHJcblxyXG4vLyA0LiBFdmVudCBTdWJzY3JpcHRpb25cclxuZXhwb3J0IGZ1bmN0aW9uIGdhdWdlU3VidmFsdWVzRXh0ZW5zaW9uKHRoaXM6IGFueSwgZGFzaGJvYXJkQ29udHJvbDogRGV2RXhwcmVzcy5EYXNoYm9hcmQuRGFzaGJvYXJkQ29udHJvbCkge1xyXG4gIHRoaXMubmFtZSA9ICdHYXVnZVN1YnZhbHVlcyc7XHJcbiAgdGhpcy5zdGFydCA9ICgpID0+IHtcclxuICAgIGNvbnN0IHZpZXdlckFwaUV4dGVuc2lvbiA9IGRhc2hib2FyZENvbnRyb2wuZmluZEV4dGVuc2lvbigndmlld2VyLWFwaScpIGFzIERldkV4cHJlc3MuRGFzaGJvYXJkLlZpZXdlckFwaUV4dGVuc2lvbjtcclxuICAgIGlmICh2aWV3ZXJBcGlFeHRlbnNpb24pIHtcclxuICAgICAgdmlld2VyQXBpRXh0ZW5zaW9uLm9uKCdpdGVtV2lkZ2V0T3B0aW9uc1ByZXBhcmVkJywgb25JdGVtV2lkZ2V0T3B0aW9uc1ByZXBhcmVkKTtcclxuICAgIH1cclxuICAgIGNvbnN0IG9wdGlvbnNQYW5lbEV4dGVuc2lvbiA9IGRhc2hib2FyZENvbnRyb2wuZmluZEV4dGVuc2lvbignaXRlbS1vcHRpb25zLXBhbmVsJykgYXMgYW55O1xyXG4gICAgaWYgKG9wdGlvbnNQYW5lbEV4dGVuc2lvbikge1xyXG4gICAgICBvcHRpb25zUGFuZWxFeHRlbnNpb24ub24oJ2N1c3RvbWl6ZVNlY3Rpb25zJywgb25DdXN0b21pemVTZWN0aW9ucyk7XHJcbiAgICB9XHJcbiAgfTtcclxuICB0aGlzLnN0b3AgPSAoKSA9PiB7XHJcbiAgICBjb25zdCB2aWV3ZXJBcGlFeHRlbnNpb24gPSBkYXNoYm9hcmRDb250cm9sLmZpbmRFeHRlbnNpb24oJ3ZpZXdlci1hcGknKSBhcyBEZXZFeHByZXNzLkRhc2hib2FyZC5WaWV3ZXJBcGlFeHRlbnNpb247XHJcbiAgICBpZiAodmlld2VyQXBpRXh0ZW5zaW9uKSB7XHJcbiAgICAgIHZpZXdlckFwaUV4dGVuc2lvbi5vZmYoJ2l0ZW1XaWRnZXRPcHRpb25zUHJlcGFyZWQnLCBvbkl0ZW1XaWRnZXRPcHRpb25zUHJlcGFyZWQpO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgb3B0aW9uc1BhbmVsRXh0ZW5zaW9uID0gZGFzaGJvYXJkQ29udHJvbC5maW5kRXh0ZW5zaW9uKCdpdGVtLW9wdGlvbnMtcGFuZWwnKSBhcyBhbnk7XHJcbiAgICBpZiAob3B0aW9uc1BhbmVsRXh0ZW5zaW9uKSB7XHJcbiAgICAgIG9wdGlvbnNQYW5lbEV4dGVuc2lvbi5vZmYoJ2N1c3RvbWl6ZVNlY3Rpb25zJywgb25DdXN0b21pemVTZWN0aW9ucyk7XHJcbiAgICB9XHJcbiAgfTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgaW5pdFBvcG92ZXIgfSBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyJztcclxuaW1wb3J0IHsgSURhc2hib2FyZFBlcm1pc3Npb25zLCBJRGFzaGJvYXJkVXJscywgSVJlcG9ydFBhcmFtcyB9IGZyb20gJy4uLy4uL0lSZXBvcnRQYXJhbXMnO1xyXG5pbXBvcnQgeyBnYXVnZVN1YnZhbHVlc0V4dGVuc2lvbiB9IGZyb20gJy4vRXh0ZW5zaW9ucy9HYXVnZVN1YnZhbHVlc0V4dGVuc2lvbic7XHJcbmltcG9ydCBSZWZyZXNoQnV0dG9uIGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVmcmVzaFRpbWVyL0J1dHRvbic7XHJcbmltcG9ydCB7SVJlcG9ydENvbXBvbmVudH0gZnJvbSAnLi4vLi4vSVJlcG9ydENvbXBvbmVudCc7XHJcblxyXG5jb25zdCBEQVNIQk9BUkRfTU9ERV9LRVkgPSAnREFTSEJPQVJEX01PREVfS0VZJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSURhc2hib2FyZE9wdGlvbnMge1xyXG4gICRkYXNoYm9hcmRDb250YWluZXI6IEpRdWVyeTtcclxuICByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XHJcbiAgcGVybWlzc2lvbnM6IElEYXNoYm9hcmRQZXJtaXNzaW9ucztcclxuICB1cmxzOiBJRGFzaGJvYXJkVXJscztcclxuICBhZGRSZWZyZXNoQnV0dG9uOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXNoYm9hcmQgaW1wbGVtZW50cyBJUmVwb3J0Q29tcG9uZW50IHtcclxuICBwcml2YXRlIHJlYWRvbmx5ICRkYXNoYm9hcmRDb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcztcclxuICBwcml2YXRlIHJlYWRvbmx5IHBlcm1pc3Npb25zOiBJRGFzaGJvYXJkUGVybWlzc2lvbnM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cmxzOiBJRGFzaGJvYXJkVXJscztcclxuICBwcml2YXRlIHJlZnJlc2hCdXR0b246IFJlZnJlc2hCdXR0b24gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBkYXNoYm9hcmQ6IERldkV4cHJlc3MuRGFzaGJvYXJkLkRhc2hib2FyZENvbnRyb2wgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHBvcG92ZXI6IERldkV4cHJlc3MudWkuZHhQb3BvdmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSURhc2hib2FyZE9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGRhc2hib2FyZENvbnRhaW5lciA9IG9wdGlvbnMuJGRhc2hib2FyZENvbnRhaW5lcjtcclxuICAgIHRoaXMuYWRkUmVmcmVzaEJ1dHRvbiA9IG9wdGlvbnMuYWRkUmVmcmVzaEJ1dHRvbjtcclxuICAgIHRoaXMucmVwb3J0UGFyYW1zID0gb3B0aW9ucy5yZXBvcnRQYXJhbXM7XHJcbiAgICB0aGlzLnJlcG9ydElkID0gb3B0aW9ucy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQ7XHJcbiAgICB0aGlzLnBlcm1pc3Npb25zID0gb3B0aW9ucy5wZXJtaXNzaW9ucztcclxuICAgIHRoaXMudXJscyA9IG9wdGlvbnMudXJscztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0KCk6IHZvaWQge1xyXG4gICAgbGV0IHJlcG9ydElkU3RyID0gdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQgJiYgdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQudG9TdHJpbmcoKTtcclxuXHJcbiAgICBEZXZFeHByZXNzLkRhc2hib2FyZC5SZXNvdXJjZU1hbmFnZXIuZW1iZWRCdW5kbGVkUmVzb3VyY2VzKCk7XHJcblxyXG4gICAgbGV0IG1vZGU6IERldkV4cHJlc3MuRGFzaGJvYXJkLldvcmtpbmdNb2RlID0gdGhpcy5wZXJtaXNzaW9ucy5BbGxvd0VkaXRpbmdcclxuICAgICAgPyB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSkgYXMgRGV2RXhwcmVzcy5EYXNoYm9hcmQuV29ya2luZ01vZGUgfHwgJ1ZpZXdlcidcclxuICAgICAgOiAnVmlld2VyJztcclxuXHJcbiAgICBpZiAodGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscykge1xyXG4gICAgICB0aGlzLnBvcG92ZXIgPSBpbml0UG9wb3ZlcignLnJlcG9ydC1kZXRhaWxzLWxpbmsnLCB0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBOT1RFOiBEYXNoYm9hcmQgMTguMSBkb2Vzbid0IHN1cHBvcnQgZXhwb3J0LiBXZSBoaWRlIHRoZSBleHBvcnQgYnV0dG9uIHZpYSBzdHlsZXNcclxuICAgIHRoaXMuZGFzaGJvYXJkID0gbmV3IERldkV4cHJlc3MuRGFzaGJvYXJkLkRhc2hib2FyZENvbnRyb2wodGhpcy4kZGFzaGJvYXJkQ29udGFpbmVyWzBdLCB7XHJcbiAgICAgIHdvcmtpbmdNb2RlOiBtb2RlLFxyXG4gICAgICBpbml0aWFsRGFzaGJvYXJkSWQ6IHJlcG9ydElkU3RyLFxyXG4gICAgICBlbmRwb2ludDogdGhpcy51cmxzLkVuZFBvaW50LFxyXG4gICAgICBhamF4UmVtb3RlU2VydmljZToge1xyXG4gICAgICAgIGhlYWRlcnM6ICF0aGlzLnJlcG9ydFBhcmFtcy5Ub2tlbiA/IHVuZGVmaW5lZCA6IHtcclxuICAgICAgICAgIHRva2VuOiB0aGlzLnJlcG9ydFBhcmFtcy5Ub2tlblxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgb25EYXNoYm9hcmRJbml0aWFsaXppbmc6IChlKSA9PiB7XHJcbiAgICAgICAgZS5jb21wb25lbnQucmVnaXN0ZXJFeHRlbnNpb24obmV3IGdhdWdlU3VidmFsdWVzRXh0ZW5zaW9uKGUuY29tcG9uZW50KSk7XHJcblxyXG4gICAgICAgIGlmIChyZXBvcnRJZFN0ciAhPT0gZS5kYXNoYm9hcmRJZCkge1xyXG4gICAgICAgICAgcmVwb3J0SWRTdHIgPSBlLmRhc2hib2FyZElkO1xyXG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBlbmNvZGVVUkkodGhpcy51cmxzLlByZXZpZXdVcmwgKyBlLmRhc2hib2FyZElkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uQmVmb3JlUmVuZGVyOiAoZSkgPT4ge1xyXG4gICAgICAgIGUuY29tcG9uZW50LnJlZ2lzdGVyRXh0ZW5zaW9uKG5ldyBEZXZFeHByZXNzLkRhc2hib2FyZC5EZXNpZ25lci5UZXh0Qm94SXRlbUVkaXRvckV4dGVuc2lvbihlLmNvbXBvbmVudCkpO1xyXG4gICAgICB9LFxyXG4gICAgICBleHRlbnNpb25zOiB7XHJcbiAgICAgICAgJ2RhdGEtc291cmNlLXdpemFyZCc6IHtcclxuICAgICAgICAgIGVuYWJsZUN1c3RvbVNxbDogdHJ1ZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgJ2Rhc2hib2FyZC1leHBvcnQnOiB7XHJcbiAgICAgICAgICBhbGxvd0V4cG9ydERhc2hib2FyZEl0ZW1zOiB0cnVlXHJcbiAgICAgICAgfSxcclxuICAgICAgICAnZGF0YS1pbnNwZWN0b3InOiB7XHJcbiAgICAgICAgICBhbGxvd0luc3BlY3RBZ2dyZWdhdGVkRGF0YTogdHJ1ZSxcclxuICAgICAgICAgIGFsbG93SW5zcGVjdFJhd0RhdGE6IHRydWUsXHJcbiAgICAgICAgICBvbkdyaWRJbml0aWFsaXplZDogKGUpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZ3JpZCA9IGUuY29tcG9uZW50IGFzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICAgICAgICAgICAgZ3JpZC5vcHRpb24oJ2V4cG9ydC5lbmFibGVkJywgdHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmRhc2hib2FyZC5yZW5kZXIoKTtcclxuXHJcbiAgICBpZiAodGhpcy5wZXJtaXNzaW9ucy5BbGxvd0VkaXRpbmcpIHtcclxuICAgICAgY29uc3QgYnV0dG9uID0gJCgnLnN3aXRjaC1tb2RlLWJ0bicpLmR4QnV0dG9uKHtcclxuICAgICAgICB0ZXh0OiBtb2RlID09PSAnVmlld2VyJyA/ICdTd2l0Y2ggdG8gRGVzaWduZXInIDogJ1N3aXRjaCB0byBWaWV3ZXInLFxyXG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgIG1vZGUgPSBtb2RlID09PSAnVmlld2VyJyA/ICdEZXNpZ25lcicgOiAnVmlld2VyJztcclxuXHJcbiAgICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSwgbW9kZSk7XHJcblxyXG4gICAgICAgICAgaWYgKG1vZGUgPT09ICdWaWV3ZXInKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGFzaGJvYXJkLnN3aXRjaFRvVmlld2VyKCk7XHJcbiAgICAgICAgICAgIGJ1dHRvbi5vcHRpb24oJ3RleHQnLCAnU3dpdGNoIHRvIERlc2lnbmVyJyk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRhc2hib2FyZC5zd2l0Y2hUb0Rlc2lnbmVyKCk7XHJcbiAgICAgICAgICAgIGJ1dHRvbi5vcHRpb24oJ3RleHQnLCAnU3dpdGNoIHRvIFZpZXdlcicpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSkuYWRkQ2xhc3MoJ2lzem9sZWEtbWQnKS5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuXHJcbiAgICAgIHJlbW92ZVJlZHVuZGFudFRvb2xib3hJdGVtcyh0aGlzLmRhc2hib2FyZCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hZGRSZWZyZXNoQnV0dG9uICYmICh0aGlzLnJlZnJlc2hCdXR0b24gPSBuZXcgUmVmcmVzaEJ1dHRvbigkKCcucmVwb3J0LXJlZnJlc2gtYnV0dG9uJyksICgpID0+IHRoaXMucmVmcmVzaCgpKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGFzaGJvYXJkPy5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLmRhc2hib2FyZCA9IG51bGw7XHJcblxyXG4gICAgdGhpcy5wb3BvdmVyPy5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnBvcG92ZXIgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTZXNzaW9uS2V5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gREFTSEJPQVJEX01PREVfS0VZICsgdGhpcy5yZXBvcnRJZDtcclxuICB9XHJcblxyXG4gIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgICB0aGlzLmRhc2hib2FyZD8ucmVmcmVzaCgpO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gcmVtb3ZlUmVkdW5kYW50VG9vbGJveEl0ZW1zKGNvbnRyb2w6IERldkV4cHJlc3MuRGFzaGJvYXJkLkRhc2hib2FyZENvbnRyb2wpIHtcclxuICBjb25zdCBpdGVtc1RvUmVtb3ZlID0gWydjcmVhdGUtZGFzaGJvYXJkJywgJ29wZW4tZGFzaGJvYXJkJ107XHJcbiAgY29uc3QgdG9vbGJveCA9IGNvbnRyb2wuZmluZEV4dGVuc2lvbigndG9vbGJveCcpIGFzIERldkV4cHJlc3MuRGFzaGJvYXJkLkRlc2lnbmVyLlRvb2xib3hFeHRlbnNpb247XHJcbiAgaXRlbXNUb1JlbW92ZS5mb3JFYWNoKChpdGVtSWQpID0+IHtcclxuICAgIGNvbnN0IGl0ZW0gPSB0b29sYm94Lm1lbnVJdGVtcygpLmZpbHRlcigoaSkgPT4gaS5pZCA9PT0gaXRlbUlkKVswXTtcclxuXHJcbiAgICBpZiAoaXRlbSkge1xyXG4gICAgICB0b29sYm94LnJlbW92ZU1lbnVJdGVtKGl0ZW1JZCk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElSZXBvcnRQYXJhbXMsIE1vZGUgfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IHsgSVJlcG9ydENvbXBvbmVudCB9IGZyb20gJy4uLy4uL0lSZXBvcnRDb21wb25lbnQnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IEdyaWREYXRhQ29sdW1uRGF0YVR5cGUgfSBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL0lHcmlkU3RhdGUnO1xyXG5pbXBvcnQgeyBpbml0UG9wb3ZlciB9IGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVwb3J0RGV0YWlsc1BvcG92ZXInO1xyXG5pbXBvcnQgUmVmcmVzaEJ1dHRvbiBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlZnJlc2hUaW1lci9CdXR0b24nO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR2FudHRDaGFydE9wdGlvbnMge1xyXG4gIGNoYXJ0UG9zaXRpb25NYXJrZXI6IEpRdWVyeTtcclxuICBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XHJcbiAgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xyXG4gIGFkZFJlZnJlc2hCdXR0b246IGJvb2xlYW47XHJcbiAgZ2FudHRSZXBvcnRDb250cm9sbGVyVXJsOiBzdHJpbmc7XHJcbiAgc2hvd0hlYWRlcjogYm9vbGVhbjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElHYW50dFRhc2sge1xyXG4gIElkOiBudW1iZXI7XHJcbiAgUGFyZW50SWQ6IG51bWJlcjtcclxuICBUaXRsZTogc3RyaW5nO1xyXG4gIFN0YXJ0OiBEYXRlO1xyXG4gIEVuZDogRGF0ZTtcclxuICBQcm9ncmVzczogbnVtYmVyO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdhbnR0RGVwZW5kZW5jeVxyXG57XHJcbiAgSWQ6IG51bWJlcjtcclxuICBQcmVkZWNlc3NvcklkOiBudW1iZXI7XHJcbiAgU3VjY2Vzc29ySWQ6IG51bWJlcjtcclxuICBUeXBlOiBudW1iZXI7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR2FudHRSZXNvdXJjZSB7XHJcbiAgSWQ6IG51bWJlcjtcclxuICBUZXh0OiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR2FudHRSZXNvdXJjZUFzc2lnbm1lbnQge1xyXG4gIElkOiBudW1iZXI7XHJcbiAgVGFza0lkOiBudW1iZXI7XHJcbiAgUmVzb3VyY2VJZDogbnVtYmVyO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdhbnR0Q2hhcnREYXRhTW9kZWwge1xyXG4gIFRhc2tzOiBJR2FudHRUYXNrW107XHJcbiAgRGVwZW5kZW5jaWVzOiBJR2FudHREZXBlbmRlbmN5W107XHJcbiAgUmVzb3VyY2VzOiBJR2FudHRSZXNvdXJjZVtdO1xyXG4gIFJlc291cmNlQXNzaWdubWVudHM6IElHYW50dFJlc291cmNlQXNzaWdubWVudFtdO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdhbnR0Q29sdW1uU3RhdGUge1xyXG4gIGRhdGFGaWVsZD86IHN0cmluZztcclxuICBkYXRhVHlwZT86IEdyaWREYXRhQ29sdW1uRGF0YVR5cGU7XHJcbiAgd2lkdGg/OiBzdHJpbmc7XHJcbiAgc29ydEluZGV4PzogbnVtYmVyO1xyXG4gIHNvcnRPcmRlcj86IHN0cmluZztcclxuICBjYXB0aW9uPzogc3RyaW5nO1xyXG4gIHZpc2libGU/OiBib29sZWFuO1xyXG4gIHZpc2libGVJbmRleD86IG51bWJlcjtcclxuICB0YXNrQ29sdW1uVHlwZTogR2FudHRUYXNrc0NvbHVtblR5cGU7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR2FudHRTZXR0aW5ncyB7XHJcbiAgVGFza0NvbHVtbnM6IElHYW50dENvbHVtblN0YXRlW10sXHJcbiAgRGJDb25uZWN0aW9uTmFtZTogc3RyaW5nLFxyXG4gIFRhYmxlTmFtZTogc3RyaW5nLFxyXG4gIFJlc291cmNlc1RhYmxlTmFtZTogc3RyaW5nLFxyXG4gIFJlc291cmNlc0tleUZpZWxkOiBzdHJpbmcsXHJcbiAgUmVzb3VyY2VzVGV4dEZpZWxkOiBzdHJpbmcsXHJcbiAgUmVzb3VyY2VBc3NpZ25tZW50VGFibGVOYW1lOiBzdHJpbmc7XHJcbiAgUmVzb3VyY2VBc3NpZ25tZW50S2V5RmllbGQ6IHN0cmluZztcclxuICBSZXNvdXJjZUFzc2lnbm1lbnRUYXNrSWRGaWVsZDogc3RyaW5nO1xyXG4gIFJlc291cmNlQXNzaWdubWVudFJlc291cmNlSWRGaWVsZDogc3RyaW5nO1xyXG4gIERlcGVuZGVuY2llc1RhYmxlTmFtZTogc3RyaW5nO1xyXG4gIERlcGVuZGVuY2llc0tleUZpZWxkOiBzdHJpbmc7XHJcbiAgRGVwZW5kZW5jaWVzUHJlZGVjZXNzb3JJZEZpZWxkOiBzdHJpbmc7XHJcbiAgRGVwZW5kZW5jaWVzU3VjY2Vzc29ySWRGaWVsZDogc3RyaW5nO1xyXG4gIERlcGVuZGVuY2llc1R5cGVGaWVsZDogc3RyaW5nO1xyXG5cclxuICBUYXNrVGl0bGVQb3NpdGlvbjogRGV2RXhwcmVzcy51aS5keEdhbnR0LkdhbnR0VGFza1RpdGxlUG9zaXRpb247XHJcbiAgU2NhbGVUeXBlOiBEZXZFeHByZXNzLnVpLmR4R2FudHQuR2FudHRTY2FsZVR5cGU7XHJcbiAgU3RhcnREYXRlUmFuZ2U6IHN0cmluZztcclxuICBFbmREYXRlUmFuZ2U6IHN0cmluZztcclxufVxyXG5cclxuZW51bSBHYW50dFRhc2tzQ29sdW1uVHlwZVxyXG57XHJcbiAgS2V5ID0gMSxcclxuICBUaXRsZSA9IDIsXHJcbiAgU3RhcnQgPSAzLFxyXG4gIEVuZCA9IDQsXHJcbiAgUGFyZW50SWQgPSA1LFxyXG4gIFByb2dyZXNzID0gNlxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHYW5udENoYXJ0IGltcGxlbWVudHMgSVJlcG9ydENvbXBvbmVudCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBTV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA9ICdTd2l0Y2ggdG8gRGVzaWduZXInO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgU1dJVENIX1RPX1ZJRVdFUl9URVhUID0gJ1N3aXRjaCB0byBWaWV3ZXInO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgQ0hBUlRfU1RPUkFHRV9NT0RFX0tFWSA9ICdDSEFSVF9TVE9SQUdFX01PREVfS0VZJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBjaGFydFBvc2l0aW9uTWFya2VyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhZGRSZWZyZXNoQnV0dG9uOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2FudHRSZXBvcnRDb250cm9sbGVyVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93SGVhZGVyOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcG9wb3ZlcjogRGV2RXhwcmVzcy51aS5keFBvcG92ZXIgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBtb2RlOiBNb2RlO1xyXG4gIHByaXZhdGUgaGFzRm9ybSA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGNoYXJ0OiBEZXZFeHByZXNzLnVpLmR4R2FudHQgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcztcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUdhbnR0Q2hhcnRPcHRpb25zKSB7XHJcbiAgICB0aGlzLmNoYXJ0UG9zaXRpb25NYXJrZXIgPSBvcHRpb25zLmNoYXJ0UG9zaXRpb25NYXJrZXI7XHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy5hZGRSZWZyZXNoQnV0dG9uID0gb3B0aW9ucy5hZGRSZWZyZXNoQnV0dG9uO1xyXG4gICAgdGhpcy5hbGxvd0VkaXRpbmcgPSBvcHRpb25zLmFsbG93RWRpdGluZztcclxuICAgIHRoaXMuZ2FudHRSZXBvcnRDb250cm9sbGVyVXJsID0gb3B0aW9ucy5nYW50dFJlcG9ydENvbnRyb2xsZXJVcmw7XHJcbiAgICB0aGlzLnNob3dIZWFkZXIgPSBvcHRpb25zLnNob3dIZWFkZXI7XHJcbiAgICB0aGlzLm1vZGUgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSkgYXMgTW9kZSB8fCBNb2RlLlZpZXdlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0KCk6IHZvaWQge1xyXG4gICAgbGV0IGdhbnR0U2V0dGluZ3M6IElHYW50dFNldHRpbmdzID0ge1xyXG4gICAgICBEYkNvbm5lY3Rpb25OYW1lOiAnJywgVGFibGVOYW1lOiAnJywgVGFza0NvbHVtbnM6IFtdLFxyXG4gICAgICBSZXNvdXJjZXNUYWJsZU5hbWU6ICcnLCBSZXNvdXJjZXNUZXh0RmllbGQ6ICcnLCBSZXNvdXJjZXNLZXlGaWVsZDogJycsXHJcbiAgICAgIFJlc291cmNlQXNzaWdubWVudFRhc2tJZEZpZWxkOiAnJywgUmVzb3VyY2VBc3NpZ25tZW50UmVzb3VyY2VJZEZpZWxkOiAnJywgUmVzb3VyY2VBc3NpZ25tZW50S2V5RmllbGQ6ICcnLCBSZXNvdXJjZUFzc2lnbm1lbnRUYWJsZU5hbWU6ICcnLFxyXG4gICAgICBEZXBlbmRlbmNpZXNLZXlGaWVsZDogJycsIERlcGVuZGVuY2llc1ByZWRlY2Vzc29ySWRGaWVsZDogJycsIERlcGVuZGVuY2llc1N1Y2Nlc3NvcklkRmllbGQ6ICcnLCBEZXBlbmRlbmNpZXNUYWJsZU5hbWU6ICcnLCBEZXBlbmRlbmNpZXNUeXBlRmllbGQ6ICcnLFxyXG4gICAgICBFbmREYXRlUmFuZ2U6IHZvaWQgMCwgU3RhcnREYXRlUmFuZ2U6IHZvaWQgMCwgVGFza1RpdGxlUG9zaXRpb246ICdvdXRzaWRlJywgU2NhbGVUeXBlOiAnYXV0bydcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgY29sdW1uczogSUdhbnR0Q29sdW1uU3RhdGVbXSA9IFtdO1xyXG4gICAgbGV0IGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuXHJcbiAgICBzZW5kUmVxdWVzdChgJHt0aGlzLmdhbnR0UmVwb3J0Q29udHJvbGxlclVybH0vR2V0R2FudHRDaGFydFNldHRpbmdzYCwgJ3Bvc3QnLCB7IGlkOiB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZCB9LCBmYWxzZSwgeyBkYXRhVHlwZTogJ2pzb24nIH0pXHJcbiAgICAgIC50aGVuKChkYXRhOiBJR2FudHRTZXR0aW5ncykgPT4ge1xyXG4gICAgICAgIGdhbnR0U2V0dGluZ3MgPSBkYXRhO1xyXG5cclxuICAgICAgICBpZighZ2FudHRTZXR0aW5ncy5EYkNvbm5lY3Rpb25OYW1lIHx8ICFnYW50dFNldHRpbmdzLlRhYmxlTmFtZSB8fCAhZ2FudHRTZXR0aW5ncy5UYXNrQ29sdW1ucyB8fCAhZ2FudHRTZXR0aW5ncy5UYXNrQ29sdW1ucy5sZW5ndGgpIHtcclxuICAgICAgICAgIGdhbnR0U2V0dGluZ3MuVGFza0NvbHVtbnMgPSBbXTtcclxuXHJcbiAgICAgICAgICBmb3IgKGxldCBpdGVtID0gMDsgaXRlbSA8IDY7IGl0ZW0rKykge1xyXG4gICAgICAgICAgICBnYW50dFNldHRpbmdzLlRhc2tDb2x1bW5zLnB1c2goeyB0YXNrQ29sdW1uVHlwZTogR2FudHRUYXNrc0NvbHVtblR5cGVbR2FudHRUYXNrc0NvbHVtblR5cGVbaXRlbSsxXV0gfSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5zZXR1cEZvcm0oZ2FudHRTZXR0aW5ncywgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGF0YS5UYXNrQ29sdW1ucy5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgICBjb2x1bW5zW2MudGFza0NvbHVtblR5cGUtMV0gPSBjO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBnYW50dFNldHRpbmdzLlRhc2tDb2x1bW5zID0gY29sdW1ucztcclxuXHJcbiAgICAgICAgaXNJbml0aWFsaXplZCA9IHRydWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoRGF0YSgpO1xyXG4gICAgICB9KVxyXG4gICAgICAudGhlbigoZGF0YTogeyBEYXRhOiBJR2FudHRDaGFydERhdGFNb2RlbCB9KSA9PiB7XHJcbiAgICAgICAgaWYoIWlzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKHRoaXMubW9kZSA9PT0gTW9kZS5EZXNpZ25lcikge1xyXG4gICAgICAgICAgdGhpcy5zZXR1cEZvcm0oZ2FudHRTZXR0aW5ncywgIWlzSW5pdGlhbGl6ZWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZXR1cENoYXJ0KGNvbHVtbnMsIGdhbnR0U2V0dGluZ3MpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlRGF0YShkYXRhLkRhdGEpO1xyXG4gICAgICB9KS5jYXRjaCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZXR1cEZvcm0oZ2FudHRTZXR0aW5ncywgdHJ1ZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy5hbGxvd0VkaXRpbmcpIHtcclxuICAgICAgdGhpcy5pbml0U3dpdGNoTW9kZUJ1dHRvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMucG9wb3ZlciA9IGluaXRQb3BvdmVyKCcuZGlhZ3JhbS1kZXRhaWxzLWxpbmsnLCB0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmV0Y2hEYXRhKCkge1xyXG4gICAgcmV0dXJuIHNlbmRSZXF1ZXN0KGAke3RoaXMuZ2FudHRSZXBvcnRDb250cm9sbGVyVXJsfS9HZXRHYW50dENoYXJ0RGF0YWAsICdwb3N0JywgeyBpZDogdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQgfSwgZmFsc2UsIHtcclxuICAgICAgZGF0YVR5cGU6ICdqc29uJ1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRTd2l0Y2hNb2RlQnV0dG9uKCkge1xyXG4gICAgY29uc3QgYnV0dG9uID0gJCgnLnN3aXRjaC1tb2RlLWJ0bicpLmR4QnV0dG9uKHtcclxuICAgICAgdGV4dDogdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IHRoaXMuU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgOiB0aGlzLlNXSVRDSF9UT19WSUVXRVJfVEVYVCxcclxuICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubW9kZSA9IHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyBNb2RlLkRlc2lnbmVyIDogTW9kZS5WaWV3ZXI7XHJcbiAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCksIHRoaXMubW9kZSk7XHJcbiAgICAgICAgYnV0dG9uLm9wdGlvbigndGV4dCcsIHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyB0aGlzLlNXSVRDSF9UT19ERVNJR05FUl9URVhUIDogdGhpcy5TV0lUQ0hfVE9fVklFV0VSX1RFWFQpO1xyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgICAgfVxyXG4gICAgfSkuYWRkQ2xhc3MoJ2lzem9sZWEtbWQnKS5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBGb3JtKGdhbnR0U2V0dGluZ3M6IElHYW50dFNldHRpbmdzLCBpbml0aWFsU2V0dXA6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuaGFzRm9ybSA9IHRydWU7XHJcblxyXG4gICAgY29uc3QgZm9ybUl0ZW1zOiBEZXZFeHByZXNzLnVpLmR4Rm9ybS5JdGVtW10gPSBbXHJcbiAgICAgIHsgZGF0YUZpZWxkOiAnRGJDb25uZWN0aW9uTmFtZScsIGNhcHRpb246ICdDb25uZWN0aW9uIE5hbWUnIH0sXHJcbiAgICAgIHsgZGF0YUZpZWxkOiAnVGFibGVOYW1lJywgY2FwdGlvbjogJ1RhYmxlJyB9LFxyXG4gICAgXTtcclxuXHJcbiAgICBmb3IgKGxldCBpdGVtID0gMTsgaXRlbSA8IDc7IGl0ZW0rKykge1xyXG4gICAgICBmb3JtSXRlbXMucHVzaCh7IGl0ZW1UeXBlOiAnZ3JvdXAnLCBjb2xDb3VudDogOCwgaXRlbXM6IFtcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS50YXNrQ29sdW1uVHlwZWAsIHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0uZGF0YUZpZWxkYCwgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiBgJHtHYW50dFRhc2tzQ29sdW1uVHlwZVtpdGVtXX0gRGF0YSBGaWVsZGAgfSB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLmNhcHRpb25gLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdDYXB0aW9uJyB9IH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0uZGF0YVR5cGVgLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdEYXRhVHlwZScgfSB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLndpZHRoYCwgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnV2lkdGgnIH0sIGVkaXRvclR5cGU6ICdkeE51bWJlckJveCcgfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS5zb3J0SW5kZXhgLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdTb3J0SW5kZXgnIH0sIGVkaXRvclR5cGU6ICdkeE51bWJlckJveCcgfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS5zb3J0T3JkZXJgLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdTb3J0T3JkZXInIH0sIGVkaXRvclR5cGU6ICdkeFNlbGVjdEJveCcsIGVkaXRvck9wdGlvbnM6IHsgaXRlbXM6IFsnYXNjJywgJ2Rlc2MnXSwgc2hvd0NsZWFyQnV0dG9uOiB0cnVlIH0gYXMgRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveC5Qcm9wZXJ0aWVzIH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0udmlzaWJsZWAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1Zpc2libGUnIH0sIGVkaXRvclR5cGU6ICdkeENoZWNrQm94JyB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLnZpc2libGVJbmRleGAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1Zpc2libGVJbmRleCcgfSB9LFxyXG4gICAgICAgIF1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9ybUl0ZW1zLnB1c2goe1xyXG4gICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgY2FwdGlvbjogJ1Jlc291cmNlcycsXHJcbiAgICAgIGNvbENvdW50OiA0LFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnUmVzb3VyY2VzVGFibGVOYW1lJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnICx0ZXh0OiAnVGFibGUnIH0sIGNvbFNwYW46IDIgfSxcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ1Jlc291cmNlc0tleUZpZWxkJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnS2V5IEZpZWxkJyB9IH0sXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdSZXNvdXJjZXNUZXh0RmllbGQnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdUZXh0IEZpZWxkJyB9IH0sXHJcbiAgICAgIF1cclxuICAgIH0pO1xyXG5cclxuICAgIGZvcm1JdGVtcy5wdXNoKHtcclxuICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgIGNhcHRpb246ICdSZXNvdXJjZSBBc3NpZ25tZW50cycsXHJcbiAgICAgIGNvbENvdW50OiA1LFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnUmVzb3VyY2VBc3NpZ25tZW50VGFibGVOYW1lJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnVGFibGUnIH0sIGNvbFNwYW46IDIgfSxcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ1Jlc291cmNlQXNzaWdubWVudEtleUZpZWxkJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnS2V5IEZpZWxkJyB9IH0sXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdSZXNvdXJjZUFzc2lnbm1lbnRUYXNrSWRGaWVsZCcsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1Rhc2sgSWQgRmllbGQnIH0gfSxcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ1Jlc291cmNlQXNzaWdubWVudFJlc291cmNlSWRGaWVsZCcsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1Jlc291cmNlIElkIEZpZWxkJyB9IH0sXHJcbiAgICAgIF1cclxuICAgIH0pO1xyXG5cclxuICAgIGZvcm1JdGVtcy5wdXNoKHtcclxuICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgIGNhcHRpb246ICdEZXBlbmRlbmNpZXMnLFxyXG4gICAgICBjb2xDb3VudDogNixcclxuICAgICAgaXRlbXM6IFtcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ0RlcGVuZGVuY2llc1RhYmxlTmFtZScsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1RhYmxlJyB9LCBjb2xTcGFuOiAyIH0sXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdEZXBlbmRlbmNpZXNLZXlGaWVsZCcsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ0tleSBGaWVsZCcgfSB9LFxyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnRGVwZW5kZW5jaWVzUHJlZGVjZXNzb3JJZEZpZWxkJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnUHJlZGVjZXNzb3IgSWQgRmllbGQnIH0gfSxcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ0RlcGVuZGVuY2llc1N1Y2Nlc3NvcklkRmllbGQnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdTdWNjZXNzb3IgSWQgRmllbGQnIH0gfSxcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ0RlcGVuZGVuY2llc1R5cGVGaWVsZCcsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ0RlcGVuZGVuY3kgVHlwZSBGaWVsZCcgfSB9XHJcbiAgICAgIF1cclxuICAgIH0pO1xyXG5cclxuICAgIGZvcm1JdGVtcy5wdXNoKHtcclxuICAgICAgaXRlbVR5cGU6ICdidXR0b24nLFxyXG4gICAgICBidXR0b25PcHRpb25zOiB7XHJcbiAgICAgICAgdGV4dDogJ1NhdmUnLFxyXG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IHRoaXMuc2F2ZUZvcm1EYXRhKGZvcm0pLnRoZW4oKCkgPT4gd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpKVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBmb3JtSXRlbXMucHVzaChcclxuICAgICAge1xyXG4gICAgICAgIGl0ZW1UeXBlOiAnZ3JvdXAnLFxyXG4gICAgICAgIGNhcHRpb246ICdBcHBlYXJhbmNlJyxcclxuICAgICAgICBjb2xDb3VudDogNSxcclxuICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6ICdUYXNrVGl0bGVQb3NpdGlvbicsXHJcbiAgICAgICAgICAgIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJyB9LFxyXG4gICAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhTZWxlY3RCb3gnLFxyXG4gICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgaXRlbXM6IFsnaW5zaWRlJywgJ291dHNpZGUnLCAnbm9uZSddXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveC5Qcm9wZXJ0aWVzXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6ICdTY2FsZVR5cGUnLFxyXG4gICAgICAgICAgICBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcgfSxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4U2VsZWN0Qm94JyxcclxuICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIGl0ZW1zOiBbJ2F1dG8nLCAnbWludXRlcycsICdob3VycycsICdkYXlzJywgJ3dlZWtzJywgJ21vbnRocycsICdxdWFydGVycycsICd5ZWFycyddXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveC5Qcm9wZXJ0aWVzXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6ICdTdGFydERhdGVSYW5nZScsXHJcbiAgICAgICAgICAgIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJyB9LFxyXG4gICAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhEYXRlQm94JyxcclxuICAgICAgICAgICAgZWRpdG9yT3B0aW9uczogeyBzaG93Q2xlYXJCdXR0b246IHRydWUgfSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0ZUJveC5Qcm9wZXJ0aWVzXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6ICdFbmREYXRlUmFuZ2UnLFxyXG4gICAgICAgICAgICBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcgfSxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4RGF0ZUJveCcsXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHsgc2hvd0NsZWFyQnV0dG9uOiB0cnVlIH0gYXMgRGV2RXhwcmVzcy51aS5keERhdGVCb3guUHJvcGVydGllc1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbVR5cGU6ICdidXR0b24nLFxyXG4gICAgICAgICAgICBidXR0b25PcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ1VwZGF0ZScsXHJcbiAgICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYoIXRoaXMuY2hhcnQpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGZvcm0ub3B0aW9uKCdmb3JtRGF0YScpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhcnQuYmVnaW5VcGRhdGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhcnQub3B0aW9uKHtcclxuICAgICAgICAgICAgICAgICAgc2NhbGVUeXBlOiBkYXRhLlNjYWxlVHlwZSxcclxuICAgICAgICAgICAgICAgICAgdGFza1RpdGxlUG9zaXRpb246IGRhdGEuVGFza1RpdGxlUG9zaXRpb24sXHJcbiAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZVJhbmdlOiBkYXRhLlN0YXJ0RGF0ZVJhbmdlID8gbmV3IERhdGUoZGF0YS5TdGFydERhdGVSYW5nZSkgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICBlbmREYXRlUmFuZ2U6IGRhdGEuRW5kRGF0ZVJhbmdlID8gbmV3IERhdGUoZGF0YS5FbmREYXRlUmFuZ2UpIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFydC5lbmRVcGRhdGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhcnQucmVwYWludCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUZvcm1EYXRhKGZvcm0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBmb3JtID0gJCgnPGRpdiAvPicpLmNzcygncGFkZGluZycsIDIwKS5pbnNlcnRBZnRlcih0aGlzLmNoYXJ0UG9zaXRpb25NYXJrZXIpLmR4Rm9ybSh7XHJcbiAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgIGhlaWdodDogaW5pdGlhbFNldHVwID8gJ2NhbGMoMTAwJSAtIDUwcHgpJyA6ICdjYWxjKDUwJSAtIDUwcHgpJyxcclxuICAgICAgZm9ybURhdGE6IGdhbnR0U2V0dGluZ3MsXHJcbiAgICAgIHNjcm9sbGluZ0VuYWJsZWQ6IHRydWUsXHJcbiAgICAgIGl0ZW1zOiBmb3JtSXRlbXNcclxuICAgIH0pLmR4Rm9ybSgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2F2ZUZvcm1EYXRhKGZvcm06IERldkV4cHJlc3MudWkuZHhGb3JtKSB7XHJcbiAgICBjb25zdCBkYXRhID0gZm9ybS5vcHRpb24oJ2Zvcm1EYXRhJykgYXMgSUdhbnR0U2V0dGluZ3M7XHJcblxyXG4gICAgaWYgKGRhdGEuVGFza0NvbHVtbnMpIHtcclxuICAgICAgZGF0YS5UYXNrQ29sdW1ucyA9IGRhdGEuVGFza0NvbHVtbnMuZmlsdGVyKChjKSA9PiAhIWMuZGF0YUZpZWxkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2VuZFJlcXVlc3QoYCR7dGhpcy5nYW50dFJlcG9ydENvbnRyb2xsZXJVcmx9L1VwZGF0ZUdhbnR0Q2hhcnRTZXR0aW5nc2AsICdwb3N0Jywge1xyXG4gICAgICBpZDogdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQsXHJcbiAgICAgIHNldHRpbmdzOiBKU09OLnN0cmluZ2lmeShmb3JtLm9wdGlvbignZm9ybURhdGEnKSlcclxuICAgIH0sIHRydWUsIHsgZGF0YVR5cGU6ICdqc29uJyB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBDaGFydCAoY29sdW1uczogSUdhbnR0Q29sdW1uU3RhdGVbXSwgZ2FudHRTZXR0aW5nczogSUdhbnR0U2V0dGluZ3MpIHtcclxuICAgIGxldCB0b3RhbFdpZHRoID0gMDtcclxuICAgIGxldCB1c2VBdXRvV2lkdGggPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdCBjb2x1bW5zTWFwcGluZyA9IHt9O1xyXG5cclxuICAgIGNvbHVtbnMuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICBpZiAoYy50YXNrQ29sdW1uVHlwZSkge1xyXG4gICAgICAgIGNvbHVtbnNNYXBwaW5nW2MudGFza0NvbHVtblR5cGVdID0gYy5kYXRhRmllbGQ7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbHVtbnMuZmlsdGVyKChjKSA9PiBjLnZpc2libGUpLmZvckVhY2goKGMpID0+IHtcclxuICAgICAgY29uc3QgdyA9IHBhcnNlSW50KGMud2lkdGgpO1xyXG5cclxuICAgICAgaWYoIWlzTmFOKHcpKSB7XHJcbiAgICAgICAgdG90YWxXaWR0aCArPSB3O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHVzZUF1dG9XaWR0aCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2hhcnQgPSB0aGlzLmNoYXJ0UG9zaXRpb25NYXJrZXIuZHhHYW50dCh7XHJcbiAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgIGhlaWdodDogdGhpcy5oYXNGb3JtID8gJzUwJScgOiAnY2FsYygxMDAlIC0gNjBweCknLFxyXG4gICAgICBmaXJzdERheU9mV2VlazogNixcclxuICAgICAgdGFza0xpc3RXaWR0aDogKCF1c2VBdXRvV2lkdGggJiYgdG90YWxXaWR0aCA+IDApID8gdG90YWxXaWR0aCA6IHZvaWQgMCxcclxuICAgICAgdG9vbGJhcjoge1xyXG4gICAgICAgIGl0ZW1zOiBbJ3pvb21JbicsICd6b29tT3V0JywgJ3NlcGFyYXRvcicsICd0YXNrRGV0YWlscyddXHJcbiAgICAgIH0sXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIHN0YXJ0RGF0ZVJhbmdlOiBnYW50dFNldHRpbmdzLlN0YXJ0RGF0ZVJhbmdlID8gbmV3IERhdGUoZ2FudHRTZXR0aW5ncy5TdGFydERhdGVSYW5nZSkgOiB2b2lkIDAsXHJcbiAgICAgIGVuZERhdGVSYW5nZTogZ2FudHRTZXR0aW5ncy5FbmREYXRlUmFuZ2UgPyBuZXcgRGF0ZShnYW50dFNldHRpbmdzLkVuZERhdGVSYW5nZSkgOiB2b2lkIDAsXHJcbiAgICAgIHNjYWxlVHlwZTogZ2FudHRTZXR0aW5ncy5TY2FsZVR5cGUsXHJcbiAgICAgIHRhc2tUaXRsZVBvc2l0aW9uOiBnYW50dFNldHRpbmdzLlRhc2tUaXRsZVBvc2l0aW9uLFxyXG4gICAgICBjb2x1bW5zOiBjb2x1bW5zLmZpbHRlcigoYykgPT4gYy52aXNpYmxlKS5tYXAoKGMpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiBjLmRhdGFGaWVsZCxcclxuICAgICAgICAgIGRhdGFUeXBlOiBjLmRhdGFUeXBlLFxyXG4gICAgICAgICAgd2lkdGg6IGMud2lkdGgsXHJcbiAgICAgICAgICB2aXNpYmxlSW5kZXg6IGMudmlzaWJsZUluZGV4LFxyXG4gICAgICAgICAgc29ydEluZGV4OiBjLnNvcnRJbmRleCxcclxuICAgICAgICAgIHNvcnRPcmRlcjogYy5zb3J0T3JkZXIgJiYgKGMuc29ydE9yZGVyID09PSAnYXNjJyA/ICdhc2MnIDogJ2Rlc2MnKSxcclxuICAgICAgICAgIGNhcHRpb246IGMuY2FwdGlvbiB8fCB2b2lkIDBcclxuICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUcmVlTGlzdENvbHVtblxyXG4gICAgICB9KSxcclxuICAgICAgdGFza3M6IHtcclxuICAgICAgICBrZXlFeHByOiBjb2x1bW5zTWFwcGluZ1tHYW50dFRhc2tzQ29sdW1uVHlwZS5LZXldLFxyXG4gICAgICAgIHN0YXJ0RXhwcjogY29sdW1uc01hcHBpbmdbR2FudHRUYXNrc0NvbHVtblR5cGUuU3RhcnRdLFxyXG4gICAgICAgIGVuZEV4cHI6IGNvbHVtbnNNYXBwaW5nW0dhbnR0VGFza3NDb2x1bW5UeXBlLkVuZF0sXHJcbiAgICAgICAgcGFyZW50SWRFeHByOiBjb2x1bW5zTWFwcGluZ1tHYW50dFRhc2tzQ29sdW1uVHlwZS5QYXJlbnRJZF0sXHJcbiAgICAgICAgcHJvZ3Jlc3NFeHByOiBjb2x1bW5zTWFwcGluZ1tHYW50dFRhc2tzQ29sdW1uVHlwZS5Qcm9ncmVzc10sXHJcbiAgICAgICAgdGl0bGVFeHByOiBjb2x1bW5zTWFwcGluZ1tHYW50dFRhc2tzQ29sdW1uVHlwZS5UaXRsZV1cclxuICAgICAgfSxcclxuICAgICAgZGVwZW5kZW5jaWVzOiB7XHJcbiAgICAgICAga2V5RXhwcjogZ2FudHRTZXR0aW5ncy5EZXBlbmRlbmNpZXNLZXlGaWVsZCxcclxuICAgICAgICBwcmVkZWNlc3NvcklkRXhwcjogZ2FudHRTZXR0aW5ncy5EZXBlbmRlbmNpZXNQcmVkZWNlc3NvcklkRmllbGQsXHJcbiAgICAgICAgc3VjY2Vzc29ySWRFeHByOiBnYW50dFNldHRpbmdzLkRlcGVuZGVuY2llc1N1Y2Nlc3NvcklkRmllbGQsXHJcbiAgICAgICAgdHlwZUV4cHI6IGdhbnR0U2V0dGluZ3MuRGVwZW5kZW5jaWVzVHlwZUZpZWxkXHJcbiAgICAgIH0sXHJcbiAgICAgIHJlc291cmNlczoge1xyXG4gICAgICAgIGtleUV4cHI6IGdhbnR0U2V0dGluZ3MuUmVzb3VyY2VzS2V5RmllbGQsXHJcbiAgICAgICAgdGV4dEV4cHI6IGdhbnR0U2V0dGluZ3MuUmVzb3VyY2VzVGV4dEZpZWxkXHJcbiAgICAgIH0sXHJcbiAgICAgIHJlc291cmNlQXNzaWdubWVudHM6IHtcclxuICAgICAgICBrZXlFeHByOiBnYW50dFNldHRpbmdzLlJlc291cmNlQXNzaWdubWVudEtleUZpZWxkLFxyXG4gICAgICAgIHJlc291cmNlSWRFeHByOiBnYW50dFNldHRpbmdzLlJlc291cmNlQXNzaWdubWVudFJlc291cmNlSWRGaWVsZCxcclxuICAgICAgICB0YXNrSWRFeHByOiBnYW50dFNldHRpbmdzLlJlc291cmNlQXNzaWdubWVudFRhc2tJZEZpZWxkXHJcbiAgICAgIH0sXHJcbiAgICB9KS5keEdhbnR0KCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHRoaXMuYWRkUmVmcmVzaEJ1dHRvbiAmJiBuZXcgUmVmcmVzaEJ1dHRvbigkKCcucmVwb3J0LXJlZnJlc2gtYnV0dG9uJyksICgpID0+IHRoaXMucmVmcmVzaCgpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRGF0YShkYXRhOiBJR2FudHRDaGFydERhdGFNb2RlbCk6IHZvaWQge1xyXG4gICAgaWYoIXRoaXMuY2hhcnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2hhcnQub3B0aW9uKCd0YXNrcy5kYXRhU291cmNlJywgZGF0YS5UYXNrcyk7XHJcbiAgICB0aGlzLmNoYXJ0Lm9wdGlvbignZGVwZW5kZW5jaWVzLmRhdGFTb3VyY2UnLCBkYXRhLkRlcGVuZGVuY2llcyk7XHJcbiAgICB0aGlzLmNoYXJ0Lm9wdGlvbigncmVzb3VyY2VzLmRhdGFTb3VyY2UnLCBkYXRhLlJlc291cmNlcyk7XHJcbiAgICB0aGlzLmNoYXJ0Lm9wdGlvbigncmVzb3VyY2VBc3NpZ25tZW50cy5kYXRhU291cmNlJywgZGF0YS5SZXNvdXJjZUFzc2lnbm1lbnRzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5mZXRjaERhdGEoKS50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlRGF0YShkYXRhLkRhdGEpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2hhcnQ/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMuY2hhcnQgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTZXNzaW9uS2V5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5DSEFSVF9TVE9SQUdFX01PREVfS0VZICsgdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQ7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBpbml0UG9wb3ZlciB9IGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVwb3J0RGV0YWlsc1BvcG92ZXInO1xyXG5pbXBvcnQgeyBJUmVwb3J0UGFyYW1zLCBNb2RlIH0gZnJvbSAnLi4vLi4vSVJlcG9ydFBhcmFtcyc7XHJcbmltcG9ydCB7SVJlcG9ydENvbXBvbmVudH0gZnJvbSAnLi4vLi4vSVJlcG9ydENvbXBvbmVudCc7XHJcblxyXG5jb25zdCBTV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA9ICdTd2l0Y2ggdG8gRGVzaWduZXInO1xyXG5jb25zdCBTV0lUQ0hfVE9fVklFV0VSX1RFWFQgPSAnU3dpdGNoIHRvIFZpZXdlcic7XHJcbmNvbnN0IFNFU1NJT05fU1RPUkFHRV9NT0RFX0tFWSA9ICdyZXBvcnRNb2RlJztcclxuY29uc3QgQ1VSUkVOVF9VUkxfS0VZID0gJ2N1c3RvbUN1cnJlbnRVcmwnO1xyXG5cclxuZGVjbGFyZSBjb25zdCBkeFJlcG9ydERlc2lnbmVyOiBhbnk7XHJcbmNvbnN0IGtvID0gKHdpbmRvdyBhcyBhbnkpLmtvO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUmVwb3J0T3B0aW9ucyB7XHJcbiAgJHJlcG9ydENvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcztcclxuICBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XHJcbiAgZGVzaWduZXJNb2RlbFVybDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXBvcnQgaW1wbGVtZW50cyBJUmVwb3J0Q29tcG9uZW50IHtcclxuICBwcml2YXRlIHJlYWRvbmx5ICRyZXBvcnRDb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcztcclxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc2lnbmVyTW9kZWxVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlcG9ydElkOiBudW1iZXI7XHJcblxyXG4gIHByaXZhdGUgcG9wb3ZlcjogRGV2RXhwcmVzcy51aS5keFBvcG92ZXIgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJUmVwb3J0T3B0aW9ucykge1xyXG4gICAgdGhpcy4kcmVwb3J0Q29udGFpbmVyID0gb3B0aW9ucy4kcmVwb3J0Q29udGFpbmVyO1xyXG4gICAgdGhpcy5yZXBvcnRQYXJhbXMgPSBvcHRpb25zLnJlcG9ydFBhcmFtcztcclxuICAgIHRoaXMuYWxsb3dFZGl0aW5nID0gb3B0aW9ucy5hbGxvd0VkaXRpbmc7XHJcbiAgICB0aGlzLmRlc2lnbmVyTW9kZWxVcmwgPSBvcHRpb25zLmRlc2lnbmVyTW9kZWxVcmw7XHJcbiAgICB0aGlzLnJlcG9ydElkID0gb3B0aW9ucy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQ7XHJcbiAgfVxyXG5cclxuICBpbml0KCk6IHZvaWQge1xyXG4gICAgbGV0IG1vZGUgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSkgYXMgTW9kZSB8fCBNb2RlLlZpZXdlcjtcclxuICAgIGxldCBidXR0b24gPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMucG9wb3ZlciA9IGluaXRQb3BvdmVyKCcucmVwb3J0LWRldGFpbHMtbGluaycsIHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmFsbG93RWRpdGluZykge1xyXG4gICAgICBidXR0b24gPSAkKCcuc3dpdGNoLW1vZGUtYnRuJykuZHhCdXR0b24oe1xyXG4gICAgICAgIHRleHQ6IG1vZGUgPT09IE1vZGUuVmlld2VyID8gU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgOiBTV0lUQ0hfVE9fVklFV0VSX1RFWFQsXHJcbiAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgbW9kZSA9IG1vZGUgPT09IE1vZGUuVmlld2VyID8gTW9kZS5EZXNpZ25lciA6IE1vZGUuVmlld2VyO1xyXG4gICAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCksIG1vZGUpO1xyXG4gICAgICAgICAgdGhpcy5zd2l0Y2hNb2RlKG1vZGUsIGJ1dHRvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1tZCcpLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY3JlYXRlUmVwb3J0RGVzaWduZXIodGhpcy4kcmVwb3J0Q29udGFpbmVyLCB0aGlzLmRlc2lnbmVyTW9kZWxVcmwsICdkeFJlcG9ydERlc2lnbmVyJywgdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQudG9TdHJpbmcoKSwgKHMpID0+IHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTd2l0Y2hNb2RlQnV0dG9uKG1vZGUsIGJ1dHRvbik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSwgbW9kZSA9PT0gTW9kZS5WaWV3ZXIpO1xyXG5cclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCAoZSkgPT4ge1xyXG4gICAgICBjb25zdCBpc05vdFNhdmVkUmVwb3J0ID0gZHhSZXBvcnREZXNpZ25lciAmJiBkeFJlcG9ydERlc2lnbmVyLkdldERlc2lnbmVyTW9kZWwoKSAmJiBkeFJlcG9ydERlc2lnbmVyLkdldERlc2lnbmVyTW9kZWwoKS5pc0RpcnR5O1xyXG5cclxuICAgICAgaWYgKGlzTm90U2F2ZWRSZXBvcnQpIHtcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZS5yZXR1cm5WYWx1ZSA9ICdUaGUgcmVwb3J0IGRvY3VtZW50IGlzIG5vdCBzYXZlZC4gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGxlYXZlIHRoZSBwYWdlPyc7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMucG9wb3Zlcj8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5wb3BvdmVyID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVQcmV2aWV3KGRlc2lnbmVyKSB7XHJcbiAgICBjb25zdCByZXBvcnRQcmV2aWV3ID0gZGVzaWduZXIuZGVzaWduZXJNb2RlbC5yZXBvcnRQcmV2aWV3TW9kZWwucmVwb3J0UHJldmlldztcclxuICAgIGNvbnN0IFJlcG9ydFByZXZpZXdTZXJ2aWNlID0gKERldkV4cHJlc3MgYXMgYW55KS5SZXBvcnRpbmcuRGVzaWduZXIuSW50ZXJuYWwuUmVwb3J0UHJldmlld1NlcnZpY2U7XHJcblxyXG4gICAgcmVwb3J0UHJldmlldy5pbml0aWFsaXplKFJlcG9ydFByZXZpZXdTZXJ2aWNlLmluaXRpYWxpemVQcmV2aWV3KGRlc2lnbmVyLmRlc2lnbmVyTW9kZWwubW9kZWwoKSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzd2l0Y2hNb2RlKG1vZGU6IE1vZGUsIGJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbikge1xyXG4gICAgaWYgKG1vZGUgPT09IE1vZGUuVmlld2VyKSB7XHJcbiAgICAgIGR4UmVwb3J0RGVzaWduZXIuZGVzaWduZXJNb2RlbC5yZXBvcnRQcmV2aWV3TW9kZWwucmVwb3J0UHJldmlldy5wcmV2aWV3VmlzaWJsZSA9IHRydWU7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVByZXZpZXcoZHhSZXBvcnREZXNpZ25lcik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBkeFJlcG9ydERlc2lnbmVyLmRlc2lnbmVyTW9kZWwucmVwb3J0UHJldmlld01vZGVsLnJlcG9ydFByZXZpZXcucHJldmlld1Zpc2libGUgPSBmYWxzZTtcclxuICAgICAgZHhSZXBvcnREZXNpZ25lci5kZXNpZ25lck1vZGVsLnJlcG9ydFByZXZpZXdNb2RlbC5yZXBvcnRQcmV2aWV3LmRlYWN0aXZhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnVwZGF0ZVN3aXRjaE1vZGVCdXR0b24obW9kZSwgYnV0dG9uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlU3dpdGNoTW9kZUJ1dHRvbihtb2RlOiBNb2RlLCBidXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b24pIHtcclxuICAgIGlmIChidXR0b24pIHtcclxuICAgICAgYnV0dG9uLm9wdGlvbigndGV4dCcsIG1vZGUgPT09IE1vZGUuVmlld2VyID8gU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgOiBTV0lUQ0hfVE9fVklFV0VSX1RFWFQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVSZXBvcnREZXNpZ25lcihcclxuICAgICRyZXBvcnRDb250YWluZXI6IEpRdWVyeSxcclxuICAgIGRlc2lnbmVyTW9kZWxVcmw6IHN0cmluZyxcclxuICAgIGdsb2JhbE5hbWU6IHN0cmluZyxcclxuICAgIHJlcG9ydElkU3RyOiBzdHJpbmcsXHJcbiAgICBvbkluaXRIYW5kbGVyOiAoc2VuZGVyOiBhbnkpID0+IHZvaWQsXHJcbiAgICBpc1ByZXZpZXdNb2RlOiBib29sZWFuXHJcbiAgKTogSlF1ZXJ5PEhUTUxFbGVtZW50PiB7XHJcbiAgICBjb25zdCBkZXNpZ25lciA9ICRyZXBvcnRDb250YWluZXJcclxuICAgICAgLmF0dHIoJ2RhdGEtYmluZCcsICdkeFJlcG9ydERlc2lnbmVyOiBkZXNpZ25lck9wdGlvbnMnKVxyXG4gICAgICAuYWRkQ2xhc3MoJ3JlcG9ydC1kZXNpZ25lcicpO1xyXG5cclxuICAgIGNvbnN0IGRlc2lnbmVyT3B0aW9ucyA9IHtcclxuICAgICAgcmVwb3J0VXJsOiByZXBvcnRJZFN0cixcclxuICAgICAgcmVxdWVzdE9wdGlvbnM6IHtcclxuICAgICAgICBnZXREZXNpZ25lck1vZGVsQWN0aW9uOiBkZXNpZ25lck1vZGVsVXJsXHJcbiAgICAgIH0sXHJcbiAgICAgIGNhbGxiYWNrczoge1xyXG4gICAgICAgIEJlZm9yZVJlbmRlcjogKHMpID0+IHtcclxuICAgICAgICAgICh3aW5kb3cgYXMgYW55KVtnbG9iYWxOYW1lXSA9IHM7XHJcblxyXG4gICAgICAgICAgaWYgKGlzUHJldmlld01vZGUpIHtcclxuICAgICAgICAgICAgcy5kZXNpZ25lck1vZGVsLnJlcG9ydFByZXZpZXdNb2RlbC5yZXBvcnRQcmV2aWV3LnByZXZpZXdWaXNpYmxlID0gdHJ1ZSA7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgb25Jbml0SGFuZGxlcihzKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIEN1c3RvbWl6ZU1lbnVBY3Rpb25zOiB0aGlzLkN1c3RvbWl6ZU1lbnVBY3Rpb25zLFxyXG4gICAgICAgIFByZXZpZXdDdXN0b21pemVNZW51QWN0aW9uczogdGhpcy5QcmV2aWV3Q3VzdG9taXplTWVudUFjdGlvbnMsXHJcbiAgICAgICAgUmVwb3J0T3BlbmVkOiAocywgZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGlzUHJldmlld01vZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplUHJldmlldyhzKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLlJlcG9ydE9wZW5lZChzLCBlKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIFJlcG9ydFRhYkNsb3NlZDogdGhpcy5SZXBvcnRUYWJDbG9zZWRcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBrby5hcHBseUJpbmRpbmdzKHsgZGVzaWduZXJPcHRpb25zIH0sIGRlc2lnbmVyWzBdKTtcclxuXHJcbiAgICByZXR1cm4gZGVzaWduZXI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIFByZXZpZXdDdXN0b21pemVNZW51QWN0aW9ucyhzLCBlKSB7XHJcbiAgICBjb25zdCBzaG93RGVzaWduZXJJdGVtID0gZS5HZXRCeUlkKChEZXZFeHByZXNzIGFzIGFueSkuUmVwb3J0aW5nLlZpZXdlci5BY3Rpb25JZC5EZXNpZ24pO1xyXG5cclxuICAgIGlmIChzaG93RGVzaWduZXJJdGVtKSB7XHJcbiAgICAgIHNob3dEZXNpZ25lckl0ZW0udmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBDdXN0b21pemVNZW51QWN0aW9ucyhzLCBlKSB7XHJcbiAgICBjb25zdCBBY3Rpb25JZCA9IChEZXZFeHByZXNzIGFzIGFueSkuUmVwb3J0aW5nLkRlc2lnbmVyLkFjdGlvbnMuQWN0aW9uSWQ7XHJcbiAgICBjb25zdCBhY3Rpb25JZHNUb01vdmVJblRvb2xiYXI6IHN0cmluZ1tdID0gW0FjdGlvbklkLlNhdmVdO1xyXG4gICAgY29uc3QgYWN0aW9uSWRzVG9IaWRlOiBzdHJpbmdbXSA9IFtBY3Rpb25JZC5OZXdSZXBvcnQsIEFjdGlvbklkLk5ld1JlcG9ydFZpYVdpemFyZCwgQWN0aW9uSWQuT3BlblJlcG9ydCxcclxuICAgICAgQWN0aW9uSWQuUHJldmlldywgQWN0aW9uSWQuU2F2ZUFzLCBBY3Rpb25JZC5FeGl0XTtcclxuXHJcbiAgICBhY3Rpb25JZHNUb01vdmVJblRvb2xiYXIuZm9yRWFjaCgoaWQpID0+IHtcclxuICAgICAgY29uc3QgaXRlbSA9IGUuR2V0QnlJZChpZCk7XHJcblxyXG4gICAgICBpZiAoaXRlbSAmJiAoaXRlbS5jb250YWluZXIgPT09ICdtZW51JykpIHtcclxuICAgICAgICBpdGVtLmNvbnRhaW5lciA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgYWN0aW9uSWRzVG9IaWRlLmZvckVhY2goKGlkKSA9PiB7XHJcbiAgICAgIGNvbnN0IGl0ZW0gPSBlLkdldEJ5SWQoaWQpO1xyXG5cclxuICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICBpdGVtLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3Qgc2F2ZUFjdGlvbiA9IGUuR2V0QnlJZCgoRGV2RXhwcmVzcyBhcyBhbnkpLlJlcG9ydGluZy5EZXNpZ25lci5BY3Rpb25zLkFjdGlvbklkLlNhdmUpO1xyXG4gICAgY29uc3Qgb3JpZ0NsaWNrQWN0aW9uID0gc2F2ZUFjdGlvbi5jbGlja0FjdGlvbjtcclxuICAgIHNhdmVBY3Rpb24uY2xpY2tBY3Rpb24gPSAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHRhYiA9IHMuR2V0Q3VycmVudFRhYigpO1xyXG4gICAgICB0YWIudXJsKGtvLnVud3JhcChzW0NVUlJFTlRfVVJMX0tFWV0pKTtcclxuICAgICAgb3JpZ0NsaWNrQWN0aW9uKCk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBSZXBvcnRPcGVuZWQocywgZSkge1xyXG4gICAgc1tDVVJSRU5UX1VSTF9LRVldID0gc1tDVVJSRU5UX1VSTF9LRVldIHx8IGtvLm9ic2VydmFibGUoKTtcclxuICAgIHNbQ1VSUkVOVF9VUkxfS0VZXShlLlVybCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIFJlcG9ydFRhYkNsb3NlZChzLCBlKSB7XHJcbiAgICBzW0NVUlJFTlRfVVJMX0tFWV0gPSBzW0NVUlJFTlRfVVJMX0tFWV0gfHwga28ub2JzZXJ2YWJsZSgpO1xyXG4gICAgc1tDVVJSRU5UX1VSTF9LRVldKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTZXNzaW9uS2V5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gU0VTU0lPTl9TVE9SQUdFX01PREVfS0VZICsgdGhpcy5yZXBvcnRJZDtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IGluaXRQb3BvdmVyIH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZXBvcnREZXRhaWxzUG9wb3Zlcic7XHJcbmltcG9ydCB7IElSZXBvcnRQYXJhbXMsIE1vZGUgfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi9EYXRhL1JlcXVlc3QnO1xyXG5pbXBvcnQge0lSZXBvcnRDb21wb25lbnR9IGZyb20gJy4uLy4uL0lSZXBvcnRDb21wb25lbnQnO1xyXG5pbXBvcnQgUmVmcmVzaEJ1dHRvbiBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlZnJlc2hUaW1lci9CdXR0b24nO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGlhZ3JhbVBhZ2VPcHRpb25zIHtcclxuICAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xyXG4gIGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBkaWFncmFtQ29udHJvbGxlclVybDogc3RyaW5nO1xyXG4gIGFkZFJlZnJlc2hCdXR0b246IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERpYWdyYW1QYWdlIGltcGxlbWVudHMgSVJlcG9ydENvbXBvbmVudCB7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgPSAnU3dpdGNoIHRvIERlc2lnbmVyJztcclxuICBwcml2YXRlIHJlYWRvbmx5IFNXSVRDSF9UT19WSUVXRVJfVEVYVCA9ICdTd2l0Y2ggdG8gVmlld2VyJztcclxuICBwcml2YXRlIHJlYWRvbmx5IERJQUdSQU1fU1RPUkFHRV9NT0RFX0tFWSA9ICdESUFHUkFNX1NUT1JBR0VfTU9ERV9LRVknO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcztcclxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRpYWdyYW1Db250cm9sbGVyVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhZGRSZWZyZXNoQnV0dG9uOiBib29sZWFuO1xyXG5cclxuICBwcml2YXRlIG1vZGU6IE1vZGU7XHJcbiAgcHJpdmF0ZSBkaWFncmFtOiBEZXZFeHByZXNzLnVpLmR4RGlhZ3JhbTtcclxuICBwcml2YXRlIHBvcG92ZXI6IERldkV4cHJlc3MudWkuZHhQb3BvdmVyIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVmcmVzaEJ1dHRvbjogUmVmcmVzaEJ1dHRvbjtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSURpYWdyYW1QYWdlT3B0aW9ucykge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy5yZXBvcnRQYXJhbXMgPSBvcHRpb25zLnJlcG9ydFBhcmFtcztcclxuICAgIHRoaXMuYWxsb3dFZGl0aW5nID0gb3B0aW9ucy5hbGxvd0VkaXRpbmc7XHJcbiAgICB0aGlzLmFkZFJlZnJlc2hCdXR0b24gPSBvcHRpb25zLmFkZFJlZnJlc2hCdXR0b247XHJcbiAgICB0aGlzLmRpYWdyYW1Db250cm9sbGVyVXJsID0gb3B0aW9ucy5kaWFncmFtQ29udHJvbGxlclVybDtcclxuXHJcbiAgICB0aGlzLm1vZGUgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSkgYXMgTW9kZSB8fCBNb2RlLlZpZXdlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0KCkge1xyXG4gICAgdGhpcy5jcmVhdGVEaWFncmFtQ29udHJvbCgpO1xyXG4gICAgdGhpcy5pbml0RGlhZ3JhbSgpO1xyXG5cclxuICAgIGlmICh0aGlzLmFsbG93RWRpdGluZykge1xyXG4gICAgICB0aGlzLmluaXRTd2l0Y2hNb2RlQnV0dG9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpIHtcclxuICAgICAgdGhpcy5wb3BvdmVyID0gaW5pdFBvcG92ZXIoJy5kaWFncmFtLWRldGFpbHMtbGluaycsIHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLmRpYWdyYW0uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5wb3BvdmVyPy5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLmRpYWdyYW0gPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcmVmcmVzaCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGlhZ3JhbSAmJiBzZW5kUmVxdWVzdChgJHt0aGlzLmRpYWdyYW1Db250cm9sbGVyVXJsfT9pZD0ke3RoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkfWAsICdnZXQnKS50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgIHRoaXMuZGlhZ3JhbS5pbXBvcnQoSlNPTi5zdHJpbmdpZnkoZGF0YSksIGZhbHNlKTtcclxuICAgICAgdGhpcy5kaWFncmFtLm9wdGlvbignaGFzQ2hhbmdlcycsIGZhbHNlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVEaWFncmFtQ29udHJvbCgpIHtcclxuICAgIHRoaXMuZGlhZ3JhbSA9IHRoaXMuJGNvbnRhaW5lci5keERpYWdyYW0oe1xyXG4gICAgICBoaXN0b3J5VG9vbGJhcjoge1xyXG4gICAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgICAgY29tbWFuZHM6IFsnc2VwYXJhdG9yJywgJ3VuZG8nLCAncmVkbycsICdzZXBhcmF0b3InLCB7IG5hbWU6ICdzYXZlJywgdGV4dDogJ1NhdmUnLCBpY29uOiAnc2F2ZScgfV0gYXMgYW55XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uQ3VzdG9tQ29tbWFuZDogKGUpID0+IHtcclxuICAgICAgICBzd2l0Y2ggKGUubmFtZSkge1xyXG4gICAgICAgICAgY2FzZSAnc2F2ZSc6XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZVJlcG9ydChlLmNvbXBvbmVudC5leHBvcnQoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZnVsbFNjcmVlbjogZmFsc2UsXHJcbiAgICAgIHJlYWRPbmx5OiB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyXHJcbiAgICB9KS5keERpYWdyYW0oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXREaWFncmFtKCkge1xyXG4gICAgc2VuZFJlcXVlc3QoYCR7dGhpcy5kaWFncmFtQ29udHJvbGxlclVybH0/aWQ9JHt0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZH1gLCAnZ2V0JykudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICB0aGlzLmRpYWdyYW0uaW1wb3J0KEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgICAgdGhpcy5kaWFncmFtLm9wdGlvbignaGFzQ2hhbmdlcycsIGZhbHNlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICh0aGlzLmFkZFJlZnJlc2hCdXR0b24pIHtcclxuICAgICAgdGhpcy5yZWZyZXNoQnV0dG9uID0gbmV3IFJlZnJlc2hCdXR0b24oJCgnLnJlcG9ydC1yZWZyZXNoLWJ1dHRvbicpLCAoKSA9PiB0aGlzLnJlZnJlc2goKSk7XHJcbiAgICB9XHJcblxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIChlKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmRpYWdyYW0ub3B0aW9uKCdoYXNDaGFuZ2VzJykpIHtcclxuICAgICAgICBlLnJldHVyblZhbHVlID0gJ1RoZSBkb2N1bWVudCBpcyBub3Qgc2F2ZWQuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBsZWF2ZSB0aGUgcGFnZT8nO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdFN3aXRjaE1vZGVCdXR0b24oKSB7XHJcbiAgICBjb25zdCBidXR0b24gPSAkKCcuc3dpdGNoLW1vZGUtYnRuJykuZHhCdXR0b24oe1xyXG4gICAgICB0ZXh0OiB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gdGhpcy5TV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IHRoaXMuU1dJVENIX1RPX1ZJRVdFUl9URVhULFxyXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tb2RlID0gdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IE1vZGUuRGVzaWduZXIgOiBNb2RlLlZpZXdlcjtcclxuICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSwgdGhpcy5tb2RlKTtcclxuICAgICAgICB0aGlzLmRpYWdyYW0ub3B0aW9uKCdyZWFkT25seScsIHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIpO1xyXG4gICAgICAgIGJ1dHRvbi5vcHRpb24oJ3RleHQnLCB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gdGhpcy5TV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IHRoaXMuU1dJVENIX1RPX1ZJRVdFUl9URVhUKTtcclxuICAgICAgfVxyXG4gICAgfSkuYWRkQ2xhc3MoJ2lzem9sZWEtbWQnKS5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgc2F2ZVJlcG9ydChzb3VyY2U6IHN0cmluZykge1xyXG4gICAgY29uc3QgaWQgPSB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZDtcclxuICAgIGF3YWl0IHNlbmRSZXF1ZXN0KHRoaXMuZGlhZ3JhbUNvbnRyb2xsZXJVcmwsICdwb3N0JywgeyBpZCwgc291cmNlIH0sIHRydWUpO1xyXG4gICAgdGhpcy5kaWFncmFtLm9wdGlvbignaGFzQ2hhbmdlcycsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Vzc2lvbktleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuRElBR1JBTV9TVE9SQUdFX01PREVfS0VZICsgdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQ7XHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQge0lSZXBvcnRDb21wb25lbnR9IGZyb20gJy4uLy4uL0lSZXBvcnRDb21wb25lbnQnO1xyXG5pbXBvcnQge01lbnVJdGVtVHlwZX0gZnJvbSAnLi4vLi4vLi4vQnVzaW5lc3MnO1xyXG5pbXBvcnQge0lDZG1SZXBvcnRQYXJhbXMsIElHcmlkUmVwb3J0UGFyYW1zLCBJUmVwb3J0UGFyYW1zfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IFJlZnJlc2hUaW1lciBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlZnJlc2hUaW1lci9JbmRleCc7XHJcbmltcG9ydCBEYXNoYm9hcmRSZXBvcnRQYWdlIGZyb20gJy4uL0Rhc2hib2FyZC9JbmRleCc7XHJcbmltcG9ydCBHYW50dENoYXJ0IGZyb20gJy4uL0dhbm50Q2hhcnQvSW5kZXgnO1xyXG5pbXBvcnQgR3JpZFJlcG9ydFBhZ2UgZnJvbSAnLi4vR3JpZC9JbmRleCc7XHJcbmltcG9ydCBDRE1SZXBvcnRQYWdlIGZyb20gJy4uL0NETS9JbmRleCc7XHJcbmltcG9ydCBEWFJlcG9ydFBhZ2UgZnJvbSAnLi4vUmVwb3J0L0luZGV4JztcclxuaW1wb3J0IERpYWdyYW1SZXBvcnRQYWdlIGZyb20gJy4uL0RpYWdyYW0vSW5kZXgnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTmVzdGVkUmVwb3J0IGV4dGVuZHMgSVJlcG9ydFBhcmFtcyB7XHJcbiAgVHlwZTogTWVudUl0ZW1UeXBlO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElTbGlkZXNob3dSZXBvcnRQYXJhbXMgZXh0ZW5kcyBJUmVwb3J0UGFyYW1zIHtcclxuICBSZXBvcnRzOiBJTmVzdGVkUmVwb3J0W107XHJcbiAgRGVsYXlTZWM6IG51bWJlcjtcclxuICBSZWZyZXNoU2VjOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVNsaWRlc2hvd1JlcG9ydFBhZ2VPcHRpb25zIHtcclxuICAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcmVwb3J0UGFyYW1zOiBJU2xpZGVzaG93UmVwb3J0UGFyYW1zO1xyXG4gIGRlZmF1bHRSZXBvcnRTZXR0aW5nczogeyBba2V5IGluIE1lbnVJdGVtVHlwZV06IGFueTsgfTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2xpZGVzaG93UmVwb3J0UGFnZSBpbXBsZW1lbnRzIElSZXBvcnRDb21wb25lbnQge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogSVNsaWRlc2hvd1JlcG9ydFBhcmFtcztcclxuICBwcml2YXRlIHJlYWRvbmx5ICRyb290RWxlbWVudDogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFJlcG9ydFNldHRpbmdzOiB7IFtrZXkgaW4gTWVudUl0ZW1UeXBlXTogYW55OyB9O1xyXG4gIHByaXZhdGUgcmVwb3J0czogSVJlcG9ydENvbXBvbmVudFtdID0gW107XHJcbiAgcHJpdmF0ZSBkeEdhbGxlcnk6IERldkV4cHJlc3MudWkuZHhHYWxsZXJ5O1xyXG4gIHByaXZhdGUgcmVmcmVzaFRpbWVyOiBSZWZyZXNoVGltZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElTbGlkZXNob3dSZXBvcnRQYWdlT3B0aW9ucykge1xyXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucy5yZXBvcnRQYXJhbXM7XHJcbiAgICB0aGlzLiRyb290RWxlbWVudCA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZGVmYXVsdFJlcG9ydFNldHRpbmdzID0gb3B0aW9ucy5kZWZhdWx0UmVwb3J0U2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdCgpIHtcclxuICAgIHRoaXMucmVuZGVyQ29udGVudCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKSB7XHJcbiAgICBpZiAoISF0aGlzLnJlcG9ydHMpIHtcclxuICAgICAgdGhpcy5yZXBvcnRzLmZvckVhY2goKHJlcG9ydCkgPT4ge1xyXG4gICAgICAgIHJlcG9ydC5kaXNwb3NlKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB3aGlsZSAodGhpcy5yZXBvcnRzLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMucmVwb3J0cy5wb3AoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnJlcG9ydHMgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYgKCEhdGhpcy5yZWZyZXNoVGltZXIpIHtcclxuICAgICAgdGhpcy5yZWZyZXNoVGltZXIuZGlzcG9zZSgpO1xyXG4gICAgICB0aGlzLnJlZnJlc2hUaW1lciA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVwb3J0cyAmJiB0aGlzLnJlcG9ydHMuZm9yRWFjaCgocmVwb3J0KSA9PiB7XHJcbiAgICAgIHJlcG9ydC5yZWZyZXNoKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQ29udGVudCgpIHtcclxuICAgIGxldCBjdXJyZW50SW5kZXggPSAwO1xyXG4gICAgbGV0IGN1cnJlbnRUaW1lb3V0ID0gbnVsbDtcclxuICAgIGNvbnN0IG1heEluZGV4ID0gdGhpcy5vcHRpb25zLlJlcG9ydHMubGVuZ3RoO1xyXG5cclxuICAgIGNvbnN0IHNldHVwTmV4dEl0ZW1TZWxlY3QgPSAoKSA9PiB7XHJcbiAgICAgIGN1cnJlbnRUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGxldCBuZXh0SW5kZXggPSBjdXJyZW50SW5kZXggKyAxO1xyXG5cclxuICAgICAgICBpZihuZXh0SW5kZXggPj0gbWF4SW5kZXgpIHtcclxuICAgICAgICAgIG5leHRJbmRleCA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmR4R2FsbGVyeS5nb1RvSXRlbShuZXh0SW5kZXgsIHRydWUpO1xyXG4gICAgICB9LCB0aGlzLm9wdGlvbnMuRGVsYXlTZWMgKiAxMDAwKTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgJHZpZXcgPSAkKCc8ZGl2IC8+JykuYXR0cih7IGNsYXNzOiAnc2xpZGVzaG93LXJlcG9ydCcgfSkuYXBwZW5kVG8odGhpcy4kcm9vdEVsZW1lbnQpO1xyXG4gICAgY29uc3QgJGdhbGxlcnkgPSAkKCc8ZGl2IC8+JywgeyBjbGFzczogJ3NsaWRlc2hvdy1yZXBvcnRfX2dhbGxlcnknIH0pLmR4R2FsbGVyeSh7XHJcbiAgICAgIGxvb3A6IGZhbHNlLFxyXG4gICAgICBkYXRhU291cmNlOiB0aGlzLm9wdGlvbnMuUmVwb3J0cyxcclxuICAgICAgc2xpZGVzaG93RGVsYXk6IDAsXHJcbiAgICAgIHNob3dOYXZCdXR0b25zOiBmYWxzZSxcclxuICAgICAgc2hvd0luZGljYXRvcjogdHJ1ZSxcclxuICAgICAgc3RyZXRjaEltYWdlczogdHJ1ZSxcclxuICAgICAgaGVpZ2h0OiAnMTAwJScsXHJcbiAgICAgIG9uSW5pdGlhbGl6ZWQ6ICgpID0+IHNldHVwTmV4dEl0ZW1TZWxlY3QoKSxcclxuICAgICAgb25TZWxlY3Rpb25DaGFuZ2VkOiAoZSkgPT4ge1xyXG4gICAgICAgIGN1cnJlbnRJbmRleCA9IGUuY29tcG9uZW50Lm9wdGlvbignc2VsZWN0ZWRJbmRleCcpO1xyXG5cclxuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGN1cnJlbnRUaW1lb3V0KTtcclxuICAgICAgICBzZXR1cE5leHRJdGVtU2VsZWN0KCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGl0ZW1UZW1wbGF0ZTogKHJlcG9ydFBhcmFtczogSU5lc3RlZFJlcG9ydCwgaW5kZXgsIGl0ZW1FbGVtZW50KSA9PiB7XHJcbiAgICAgICAgaXRlbUVsZW1lbnQuYXR0cih7IGNsYXNzOiAnc2xpZGVzaG93LXJlcG9ydF9fZ2FsbGVyeS1pdGVtJyB9KS5oZWlnaHQoJzEwMCUnKTtcclxuXHJcbiAgICAgICAgY29uc3QgJHNsaWRlRWxlbWVudCA9ICQoJzxkaXYgLz4nLCB7IGNsYXNzOiAnc2xpZGVzaG93LXJlcG9ydF9fc2xpZGUtY29udGVudCcgfSkuaGVpZ2h0KCcxMDAlJyk7XHJcbiAgICAgICAgbGV0IHJlcG9ydFNsaWRlOiBJUmVwb3J0Q29tcG9uZW50O1xyXG5cclxuICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBzd2l0Y2ggKHJlcG9ydFBhcmFtcy5UeXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgTWVudUl0ZW1UeXBlLkRhc2hib2FyZDpcclxuICAgICAgICAgICAgICBjb25zdCAkZGFzaGJvYXJkUG9zaXRpb25FbGVtZW50ID0gJCgnPGRpdiAvPicsIHsgY2xhc3M6ICdyZXBvcnQtcG9zaXRpb24nIH0pO1xyXG4gICAgICAgICAgICAgICRkYXNoYm9hcmRQb3NpdGlvbkVsZW1lbnQuYXBwZW5kVG8oJHNsaWRlRWxlbWVudCk7XHJcblxyXG4gICAgICAgICAgICAgIHJlcG9ydFNsaWRlID0gbmV3IERhc2hib2FyZFJlcG9ydFBhZ2Uoe1xyXG4gICAgICAgICAgICAgICAgLi4uKHRoaXMuZGVmYXVsdFJlcG9ydFNldHRpbmdzW01lbnVJdGVtVHlwZS5EYXNoYm9hcmRdIHx8IHt9KSxcclxuICAgICAgICAgICAgICAgICRkYXNoYm9hcmRDb250YWluZXI6ICRkYXNoYm9hcmRQb3NpdGlvbkVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICByZXBvcnRQYXJhbXM6IHJlcG9ydFBhcmFtcyBhcyBJUmVwb3J0UGFyYW1zXHJcbiAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICRzbGlkZUVsZW1lbnQuZmluZCgnZGFzaGJvYXJkLXRpdGxlJykuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICRzbGlkZUVsZW1lbnQuZmluZCgnLmR4LWRhc2hib2FyZC1sYXlvdXQtY29udGFpbmVyJykuY3NzKHsgdG9wOiAwIH0pO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuR3JpZFZpZXc6XHJcbiAgICAgICAgICAgICAgY29uc3QgJGdyaWRQb3NpdGlvbkVsZW1lbnQgPSAkKCc8ZGl2IC8+JywgeyBjbGFzczogJ3NsaWRlc2hvdy1yZXBvcnRfX2dyaWQtcG9zaXRpb24nIH0pO1xyXG4gICAgICAgICAgICAgICRzbGlkZUVsZW1lbnQuYWRkQ2xhc3MoJ2lzem9sZWEtdGhlbWUnKS5hZGRDbGFzcygncGFuZWwtYm9keScpO1xyXG5cclxuICAgICAgICAgICAgICAkZ3JpZFBvc2l0aW9uRWxlbWVudC5hcHBlbmRUbygkc2xpZGVFbGVtZW50KTtcclxuICAgICAgICAgICAgICByZXBvcnRTbGlkZSA9IG5ldyBHcmlkUmVwb3J0UGFnZSh7XHJcbiAgICAgICAgICAgICAgICAuLi4odGhpcy5kZWZhdWx0UmVwb3J0U2V0dGluZ3NbTWVudUl0ZW1UeXBlLkdyaWRWaWV3XSB8fCB7fSksXHJcbiAgICAgICAgICAgICAgICBncmlkUG9zaXRpb25NYXJrZXI6ICRncmlkUG9zaXRpb25FbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgcmVwb3J0UGFyYW1zOiByZXBvcnRQYXJhbXMgYXMgYW55IGFzIElHcmlkUmVwb3J0UGFyYW1zLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIE1lbnVJdGVtVHlwZS5DRE06XHJcbiAgICAgICAgICAgICAgcmVwb3J0U2xpZGUgPSBuZXcgQ0RNUmVwb3J0UGFnZSh7XHJcbiAgICAgICAgICAgICAgICAuLi4odGhpcy5kZWZhdWx0UmVwb3J0U2V0dGluZ3NbTWVudUl0ZW1UeXBlLkNETV0gfHwge30pLFxyXG4gICAgICAgICAgICAgICAgJGNvbnRhaW5lcjogJHNsaWRlRWxlbWVudCxcclxuICAgICAgICAgICAgICAgIHJlcG9ydFBhcmFtczogcmVwb3J0UGFyYW1zIGFzIGFueSBhcyBJQ2RtUmVwb3J0UGFyYW1zLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIE1lbnVJdGVtVHlwZS5SZXBvcnQ6XHJcbiAgICAgICAgICAgICAgY29uc3QgJHJlcG9ydFBvc2l0aW9uRWxlbWVudCA9ICQoJzxkaXYgLz4nLCB7IGNsYXNzOiAncmVwb3J0LXBvc2l0aW9uJyB9KTtcclxuICAgICAgICAgICAgICAkcmVwb3J0UG9zaXRpb25FbGVtZW50LmFwcGVuZFRvKCRzbGlkZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgIHJlcG9ydFNsaWRlID0gbmV3IERYUmVwb3J0UGFnZSh7XHJcbiAgICAgICAgICAgICAgICAuLi4odGhpcy5kZWZhdWx0UmVwb3J0U2V0dGluZ3NbTWVudUl0ZW1UeXBlLlJlcG9ydF0gfHwge30pLFxyXG4gICAgICAgICAgICAgICAgJHJlcG9ydENvbnRhaW5lcjogJHJlcG9ydFBvc2l0aW9uRWxlbWVudCxcclxuICAgICAgICAgICAgICAgIHJlcG9ydFBhcmFtczogcmVwb3J0UGFyYW1zIGFzIElSZXBvcnRQYXJhbXMsXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgTWVudUl0ZW1UeXBlLkRpYWdyYW06XHJcbiAgICAgICAgICAgICAgY29uc3QgJGRpYWdyYW1Qb3NpdGlvbkVsZW1lbnQgPSAkKCc8ZGl2IC8+JywgeyBjbGFzczogJ3JlcG9ydC1wb3NpdGlvbicgfSk7XHJcbiAgICAgICAgICAgICAgJGRpYWdyYW1Qb3NpdGlvbkVsZW1lbnQuYXBwZW5kVG8oJHNsaWRlRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgcmVwb3J0U2xpZGUgPSBuZXcgRGlhZ3JhbVJlcG9ydFBhZ2Uoe1xyXG4gICAgICAgICAgICAgICAgLi4uKHRoaXMuZGVmYXVsdFJlcG9ydFNldHRpbmdzW01lbnVJdGVtVHlwZS5EaWFncmFtXSB8fCB7fSksXHJcbiAgICAgICAgICAgICAgICAkY29udGFpbmVyOiAkZGlhZ3JhbVBvc2l0aW9uRWxlbWVudCxcclxuICAgICAgICAgICAgICAgIHJlcG9ydFBhcmFtczogcmVwb3J0UGFyYW1zIGFzIElSZXBvcnRQYXJhbXMsXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgTWVudUl0ZW1UeXBlLkdhbnR0Q2hhcnQ6XHJcbiAgICAgICAgICAgICAgY29uc3QgJGdhbnR0UG9zaXRpb25FbGVtZW50ID0gJCgnPGRpdiAvPicsIHsgY2xhc3M6ICdzbGlkZXNob3ctcmVwb3J0X19ncmlkLXBvc2l0aW9uJyB9KTtcclxuICAgICAgICAgICAgICAkc2xpZGVFbGVtZW50LmFkZENsYXNzKCdpc3pvbGVhLXRoZW1lJykuYWRkQ2xhc3MoJ3BhbmVsLWJvZHknKTtcclxuXHJcbiAgICAgICAgICAgICAgJGdhbnR0UG9zaXRpb25FbGVtZW50LmFwcGVuZFRvKCRzbGlkZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgIHJlcG9ydFNsaWRlID0gbmV3IEdhbnR0Q2hhcnQoe1xyXG4gICAgICAgICAgICAgICAgLi4uKHRoaXMuZGVmYXVsdFJlcG9ydFNldHRpbmdzW01lbnVJdGVtVHlwZS5HYW50dENoYXJ0XSB8fCB7fSksXHJcbiAgICAgICAgICAgICAgICBjaGFydFBvc2l0aW9uTWFya2VyOiAkZ2FudHRQb3NpdGlvbkVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICByZXBvcnRQYXJhbXM6IHJlcG9ydFBhcmFtcyBhcyBhbnkgYXMgSUdyaWRSZXBvcnRQYXJhbXMsXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgTWVudUl0ZW1UeXBlLk1lbnVOb2RlOlxyXG4gICAgICAgICAgICBjYXNlIE1lbnVJdGVtVHlwZS5TbGlkZXNob3c6XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHJlcG9ydFNsaWRlKSB7XHJcbiAgICAgICAgICAgIHJlcG9ydFNsaWRlLmluaXQoKTtcclxuICAgICAgICAgICAgdGhpcy5yZXBvcnRzLnB1c2gocmVwb3J0U2xpZGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIDUwMCk7XHJcblxyXG4gICAgICAgICRzbGlkZUVsZW1lbnQuYXBwZW5kVG8oaXRlbUVsZW1lbnQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmR4R2FsbGVyeSA9ICRnYWxsZXJ5LmR4R2FsbGVyeSgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICAkZ2FsbGVyeS5hcHBlbmRUbygkdmlldyk7XHJcblxyXG4gICAgdGhpcy5yZWZyZXNoVGltZXIgPSBuZXcgUmVmcmVzaFRpbWVyKHtjYWxsYmFjazogKCkgPT4gdGhpcy5yZWZyZXNoKCksIGVsYXBzZWRDYWxsYmFjazogKGUpID0+IHt9fSk7XHJcbiAgICB0aGlzLnJlZnJlc2hUaW1lci5zdGFydCh0aGlzLm9wdGlvbnMuUmVmcmVzaFNlYyAqIDEwMDApO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1ZlbmRvci9EZXZFeHRyZW1lL2R4LmFsbC5kLnRzXCIgLz5cclxuXHJcbmV4cG9ydCB7IElMaWNlbmNlLCBNZW51SXRlbVR5cGUsIExpY2VuY2VTdGF0dXMgfSBmcm9tICcuL0J1c2luZXNzJztcclxuZXhwb3J0IHsgSUFwaVJlc3BvbnNlLCBJRHhEYXRhU291cmNlT3B0aW9ucywgSUVycm9ySW5mbywgSUxvZ29TZXR0aW5ncywgUmVxdWVzdFN0YXRlIH0gZnJvbSAnLi9EYXRhJztcclxuZXhwb3J0IHtcclxuICBIZWFkZXIsIE5hdmlnYXRpb25NZW51LCBVc2VyTWVudSwgTWVudVN3aXRjaGVyLFxyXG4gIEhlYWRlclRoZW1lcywgSUhlYWRlck9wdGlvbnMsIElBcHBNZW51TW9kZWwsIElNZW51U2V0dGluZ3MsIElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCxcclxuICBJVXNlck1lbnVJdGVtLCBJVXNlck1lbnVJdGVtTW9kZWwsXHJcbn0gZnJvbSAnLi9IZWFkZXInO1xyXG5leHBvcnQgeyBJSGllcmFyY2hpY2FsLCBJUmVwb3J0QmFzZSwgSUFwcE1lbnVJdGVtQmFzZU1vZGVsLCBncmlkQ29sdW1uVHlwZXMgfSBmcm9tICcuL1JlcG9ydHMvQnVzaW5lc3MnO1xyXG5leHBvcnQge1xyXG4gIElHcmlkRXh0ZW5kZWRDb2x1bW5TdGF0ZSwgR3JpZERhdGFDb2x1bW5EYXRhVHlwZSwgSUdyaWRTdGF0ZSxcclxuICBJR3JpZENvbHVtblN0YXRlLCBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZVxyXG59IGZyb20gJy4vV2lkZ2V0cy9JR3JpZFN0YXRlJztcclxuZXhwb3J0IHsgSUdyaWREYXRhLCBJVjJHcmlkQ29sdW1uU3RhdGUgfSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvR3JpZC9JR3JpZERhdGEnO1xyXG5leHBvcnQgeyBJQ29sdW1uTWV0YURhdGEgfSBmcm9tICcuL1JlcG9ydHMvQ29sdW1uTWV0YURhdGEnO1xyXG5leHBvcnQgeyBDZG1JbXBvcnRGaWxlTW9kZSB9IGZyb20gJy4vUmVwb3J0cy9CdXNpbmVzcyc7XHJcblxyXG5pbXBvcnQgeyBzaG93IGFzIGJhY2tncm91bmRJbWFnZVZpZXdlciB9IGZyb20gJy4vV2lkZ2V0cy9CYWNrZ3JvdW5kSW1hZ2VWaWV3ZXInO1xyXG5pbXBvcnQgeyBMaWNlbmNlU3RhdHVzLCBNZW51SXRlbVR5cGUgfSBmcm9tICcuL0J1c2luZXNzJztcclxuaW1wb3J0IHsgR3JpZERhdGFDb2x1bW5EYXRhVHlwZSB9IGZyb20gJy4vV2lkZ2V0cy9JR3JpZFN0YXRlJztcclxuaW1wb3J0IGRhdGEgZnJvbSAnLi9EYXRhJztcclxuaW1wb3J0IEZvb3RlciwgeyBGb290ZXJJbmRpY2F0b3JTdGF0dXMgfSBmcm9tICcuL0Zvb3Rlci9JbmRleCc7XHJcbmltcG9ydCB7XHJcbiAgSGVhZGVyLFxyXG4gIE5hdmlnYXRpb25NZW51LFxyXG4gIFVzZXJNZW51LFxyXG4gIE1lbnVTd2l0Y2hlclxyXG59IGZyb20gJy4vSGVhZGVyJztcclxuXHJcbmV4cG9ydCB7XHJcbiAgRm9vdGVyLFxyXG59O1xyXG5cclxuaW1wb3J0IG5vdGlmeSBmcm9tICcuL1dpZGdldHMvTm90aWZ5JztcclxuaW1wb3J0IGZ1bGxTY3JlZW4gZnJvbSAnLi9XaWRnZXRzL0Z1bGxTY3JlZW4nO1xyXG5pbXBvcnQgZGVmYXVsdFRvb2xiYXIgZnJvbSAnLi9XaWRnZXRzL0RlZmF1bHRUb29sYmFyJztcclxuaW1wb3J0IGRlZmF1bHRHcmlkT2Jzb2xldGUgZnJvbSAnLi9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWRPYnNvbGV0ZSc7XHJcbmltcG9ydCBkZWZhdWx0VHJlZUxpc3QgZnJvbSAnLi9XaWRnZXRzL0dyaWQvRGVmYXVsdFRyZWVMaXN0JztcclxuaW1wb3J0IGRlZmF1bHRHcmlkIGZyb20gJy4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkJztcclxuaW1wb3J0ICogYXMgaW1hZ2VDcm9wRGlhbG9nIGZyb20gJy4vV2lkZ2V0cy9JbWFnZUNyb3BEaWFsb2cnO1xyXG5pbXBvcnQgeyBBY2NvdW50U2V0dGluZ3NQYWdlIH0gZnJvbSAnLi9QYWdlcy9BY2NvdW50U2V0dGluZ3MnO1xyXG5pbXBvcnQgKiBhcyBzdHlsaW5nIGZyb20gJy4vU3R5bGluZy9JbmRleCc7XHJcbmltcG9ydCAqIGFzIHBvcHVwIGZyb20gJy4vV2lkZ2V0cy9Qb3B1cCc7XHJcbmltcG9ydCAqIGFzIGNvbmZpcm0gZnJvbSAnLi9XaWRnZXRzL0NvbmZpcm0nO1xyXG5pbXBvcnQgKiBhcyBsYW5kaW5nIGZyb20gJy4vV2lkZ2V0cy9MYW5kaW5nJztcclxuaW1wb3J0ICogYXMgaGVscGVycyBmcm9tICcuL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuL1V0aWxzL0luZGV4JztcclxuaW1wb3J0ICogYXMgYWNjZXNzRGVuaWVkIGZyb20gJy4vV2lkZ2V0cy9BY2Nlc3NEZW5pZWRUb1JlcG9ydCc7XHJcbmltcG9ydCBncmlkQ29sdW1uVHlwZXMgZnJvbSAnLi9SZXBvcnRzL0J1c2luZXNzL0dyaWRDb2x1bW5UeXBlcyc7XHJcbmltcG9ydCAqIGFzIENETSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvQ0RNL0luZGV4JztcclxuaW1wb3J0IHsgU2Vzc2lvbk5vdGlmaWVyIH0gZnJvbSAnLi9Db21wb25lbnRzL1Nlc3Npb25Ob3RpZmllcic7XHJcbmltcG9ydCB7IEZpbGVJbXBvcnRlciB9IGZyb20gJy4vQ29tcG9uZW50cy9GaWxlSW1wb3J0ZXIvSW5kZXgnO1xyXG5pbXBvcnQgeyBGaWxlVXBsb2FkZXIgfSBmcm9tICcuL0NvbXBvbmVudHMvRmlsZVVwbG9hZGVyL0luZGV4JztcclxuaW1wb3J0IHsgQ2RtSW1wb3J0RmlsZU1vZGUgfSBmcm9tICcuL1JlcG9ydHMvQnVzaW5lc3MnO1xyXG5cclxuaW1wb3J0IEdyaWRSZXBvcnRQYWdlIGZyb20gJy4vUmVwb3J0cy9QYWdlcy9HcmlkL0luZGV4JztcclxuaW1wb3J0IFNsaWRlc2hvd1JlcG9ydFBhZ2UgZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL1NsaWRlc2hvdy9JbmRleCc7XHJcbmltcG9ydCBEYXNoYm9hcmRSZXBvcnRQYWdlIGZyb20gJy4vUmVwb3J0cy9QYWdlcy9EYXNoYm9hcmQvSW5kZXgnO1xyXG5pbXBvcnQgRFhSZXBvcnRQYWdlIGZyb20gJy4vUmVwb3J0cy9QYWdlcy9SZXBvcnQvSW5kZXgnO1xyXG5pbXBvcnQgRGlhZ3JhbVJlcG9ydFBhZ2UgZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL0RpYWdyYW0vSW5kZXgnO1xyXG5pbXBvcnQgQ0RNUmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvQ0RNL0luZGV4JztcclxuaW1wb3J0IEdhbnR0Q2hhcnRSZXBvcnRQYWdlIGZyb20gJy4vUmVwb3J0cy9QYWdlcy9HYW5udENoYXJ0L0luZGV4JztcclxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi9Db25maWcvSW5kZXgnO1xyXG5cclxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB2YXJpYWJsZS1uYW1lXHJcbmNvbnN0IElzem9sZWFVSSA9IHtcclxuICBjb25maWcsXHJcblxyXG4gIEhlYWRlcixcclxuICBGb290ZXIsXHJcbiAgTmF2aWdhdGlvbk1lbnUsXHJcbiAgVXNlck1lbnUsXHJcbiAgTWVudVN3aXRjaGVyLFxyXG5cclxuICBkYXRhLFxyXG5cclxuICB3aWRnZXRzOiB7XHJcbiAgICBub3RpZnksXHJcbiAgICBmdWxsU2NyZWVuLFxyXG4gICAgcG9wdXAsXHJcbiAgICBjb25maXJtLFxyXG4gICAgbGFuZGluZyxcclxuICAgIGFjY2Vzc0RlbmllZCxcclxuICAgIGRlZmF1bHRHcmlkT2Jzb2xldGUsXHJcbiAgICBkZWZhdWx0VHJlZUxpc3QsXHJcbiAgICBkZWZhdWx0R3JpZCxcclxuICAgIGRlZmF1bHRUb29sYmFyLFxyXG4gICAgYmFja2dyb3VuZEltYWdlVmlld2VyLFxyXG4gICAgaW1hZ2VDcm9wRGlhbG9nXHJcbiAgfSxcclxuICBwYWdlczoge1xyXG4gICAgQWNjb3VudFNldHRpbmdzUGFnZVxyXG4gIH0sXHJcbiAgY29tcG9uZW50czoge1xyXG4gICAgQ0RNLFxyXG4gICAgU2Vzc2lvbk5vdGlmaWVyLFxyXG4gICAgRmlsZUltcG9ydGVyLFxyXG4gICAgRmlsZVVwbG9hZGVyLFxyXG4gIH0sXHJcblxyXG4gIHN0eWxpbmcsXHJcbiAgaGVscGVycyxcclxuICB1dGlscyxcclxuXHJcbiAgcmVwb3J0czoge1xyXG4gICAgQ0RNUmVwb3J0UGFnZSxcclxuICAgIERpYWdyYW1SZXBvcnRQYWdlLFxyXG4gICAgR3JpZFJlcG9ydFBhZ2UsXHJcbiAgICBEYXNoYm9hcmRSZXBvcnRQYWdlLFxyXG4gICAgRFhSZXBvcnRQYWdlLFxyXG4gICAgU2xpZGVzaG93UmVwb3J0UGFnZSxcclxuICAgIEdhbnR0Q2hhcnRSZXBvcnRQYWdlLFxyXG4gICAgZ3JpZENvbHVtblR5cGVzLFxyXG4gIH0sXHJcbiAgYnVzaW5lc3M6IHtcclxuICAgIExpY2VuY2VTdGF0dXMsXHJcbiAgICBNZW51SXRlbVR5cGUsXHJcbiAgICBDZG1JbXBvcnRGaWxlTW9kZSxcclxuICAgIEZvb3RlckluZGljYXRvclN0YXR1cyxcclxuICAgIEdyaWREYXRhQ29sdW1uRGF0YVR5cGVcclxuICB9XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBJc3pvbGVhVUk7XHJcblxyXG4od2luZG93IGFzIGFueSkuSXN6b2xlYVVJID0gSXN6b2xlYVVJO1xyXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBLG1CQUFjLElBQU0sSUFBTTtBQUFBLGlCQUNKLEFBQWhCLE9BQU8sTUFBUyxjQUFhLEtBQU8sRUFBRSxTQUFPLFVBQ3hCLEFBQWhCLE9BQU8sTUFBUyxZQUN2QixTQUFRLEtBQUssdURBQ2IsS0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUtqQixHQUFLLFdBQVcsNkVBQTZFLEtBQUssR0FBSyxRQUNsRyxJQUFJLEtBQUssQ0FBQSxVQUE4QixLQUFPLEVBQUUsTUFBTSxHQUFLLFVBRTdEOztBQUdULG1CQUFtQixJQUFLLElBQU0sSUFBTTtBQUNsQyxjQUFJLEtB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
|
|
10399
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzL2ZpbGUtc2F2ZXIvc3JjL0ZpbGVTYXZlci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY3JvcHByL2Rpc3QvY3JvcHByLmpzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0J1c2luZXNzL0xpY2VuY2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQnVzaW5lc3MvTWVudUl0ZW1UeXBlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvTm90aWZ5LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvQXBpUmVzcG9uc2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9SZXF1ZXN0U3RhdGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9Qb3B1cC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9TdHlsaW5nL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvRXJyb3JJbmZvUG9wdXAudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9FeGNlcHRpb25UeXBlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1V0aWxzL0dlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9SZXF1ZXN0LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvRHhEYXRhU291cmNlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvTG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0NvcmUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVscGVycy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWxwZXJzL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0NvbmZpZy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWFkZXIvVXNlck1lbnUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQ29tcG9uZW50cy9NZW51L01lbnUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQ29tcG9uZW50cy9NZW51L0Jvb3RzdHJhcENvbGxhcHNpbmdNZW51LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9OYXZpZ2F0aW9uTWVudS50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db25zdGFudHMvQ2FjaGVLZXlzLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9Mb2dvLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9NZW51U3dpdGNoZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVhZGVyL1NlYXJjaC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9VdGlscy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9VdGlscy9FdmVudEVtaXR0ZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvVXRpbHMvR3JpZEV4cG9ydC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWFkZXIvSGVhZGVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvQnVzaW5lc3MvR3JpZENvbHVtblR5cGVzLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvQnVzaW5lc3MvY2RtSW1wb3J0RmlsZU1vZGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9JR3JpZFN0YXRlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvQmFja2dyb3VuZEltYWdlVmlld2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0Zvb3Rlci9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0F1dG9SZXNpemUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9GdWxsU2NyZWVuLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlbHBlcnMvVGhlbWUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVscGVycy9Ub29sYmFyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvRGVmYXVsdFRvb2xiYXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9QYW5lbEhlaWdodC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0dyaWQvQ3JlYXRlRnVsbFNjcmVlbkdyaWQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkQmFzZS50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkT2Jzb2xldGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRUcmVlTGlzdC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0ltYWdlQ3JvcERpYWxvZy9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0ltYWdlQ3JvcERpYWxvZy9IZWxwZXJzLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1BhZ2VzL0FjY291bnRTZXR0aW5ncy9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0NvbmZpcm0udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9MYW5kaW5nLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvQWNjZXNzRGVuaWVkVG9SZXBvcnQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvR3JpZC9DcmVhdGVEZWZhdWx0R3JpZC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9Db250cm9sQ29uZmlndXJhdG9yLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1V0aWxzL01lbW9pemUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vR3JpZFZpZXdzTWFuYWdlci50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9HcmlkU3RhdGVNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vR3JpZEZpbHRlcnNNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0ZpbGVVcGxvYWRlci9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0ZpbGVJbXBvcnRlci9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9HcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWREaXNwbGF5c01hbmFnZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW4udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRTdW1tYXJ5SGVscGVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0NvbnRyb2xEaXNwbGF5LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0Rpc3BsYXlNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0NvbXBvbmVudHMvU2Vzc2lvbk5vdGlmaWVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvR3JpZC9HcmlkSW5kaWNhdG9yU3RhdGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL0dyaWRTdGF0ZU1hbmFnZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL01vZGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9EYXRhL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvQ29tcG9uZW50cy9SZWZyZXNoVGltZXIvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9Db21wb25lbnRzL1JlZnJlc2hUaW1lci9CdXR0b24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvRGFzaGJvYXJkL0V4dGVuc2lvbnMvR2F1Z2VTdWJ2YWx1ZXNFeHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9EYXNoYm9hcmQvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HYW5udENoYXJ0L0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvUmVwb3J0L0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvRGlhZ3JhbS9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL1NsaWRlc2hvdy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLypcbiogRmlsZVNhdmVyLmpzXG4qIEEgc2F2ZUFzKCkgRmlsZVNhdmVyIGltcGxlbWVudGF0aW9uLlxuKlxuKiBCeSBFbGkgR3JleSwgaHR0cDovL2VsaWdyZXkuY29tXG4qXG4qIExpY2Vuc2UgOiBodHRwczovL2dpdGh1Yi5jb20vZWxpZ3JleS9GaWxlU2F2ZXIuanMvYmxvYi9tYXN0ZXIvTElDRU5TRS5tZCAoTUlUKVxuKiBzb3VyY2UgIDogaHR0cDovL3B1cmwuZWxpZ3JleS5jb20vZ2l0aHViL0ZpbGVTYXZlci5qc1xuKi9cblxuLy8gVGhlIG9uZSBhbmQgb25seSB3YXkgb2YgZ2V0dGluZyBnbG9iYWwgc2NvcGUgaW4gYWxsIGVudmlyb25tZW50c1xuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xLzMyNzcxODIvMTAwODk5OVxudmFyIF9nbG9iYWwgPSB0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JyAmJiB3aW5kb3cud2luZG93ID09PSB3aW5kb3dcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCcgJiYgc2VsZi5zZWxmID09PSBzZWxmXG4gID8gc2VsZiA6IHR5cGVvZiBnbG9iYWwgPT09ICdvYmplY3QnICYmIGdsb2JhbC5nbG9iYWwgPT09IGdsb2JhbFxuICA/IGdsb2JhbFxuICA6IHRoaXNcblxuZnVuY3Rpb24gYm9tIChibG9iLCBvcHRzKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ3VuZGVmaW5lZCcpIG9wdHMgPSB7IGF1dG9Cb206IGZhbHNlIH1cbiAgZWxzZSBpZiAodHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgY29uc29sZS53YXJuKCdEZXByZWNhdGVkOiBFeHBlY3RlZCB0aGlyZCBhcmd1bWVudCB0byBiZSBhIG9iamVjdCcpXG4gICAgb3B0cyA9IHsgYXV0b0JvbTogIW9wdHMgfVxuICB9XG5cbiAgLy8gcHJlcGVuZCBCT00gZm9yIFVURi04IFhNTCBhbmQgdGV4dC8qIHR5cGVzIChpbmNsdWRpbmcgSFRNTClcbiAgLy8gbm90ZTogeW91ciBicm93c2VyIHdpbGwgYXV0b21hdGljYWxseSBjb252ZXJ0IFVURi0xNiBVK0ZFRkYgdG8gRUYgQkIgQkZcbiAgaWYgKG9wdHMuYXV0b0JvbSAmJiAvXlxccyooPzp0ZXh0XFwvXFxTKnxhcHBsaWNhdGlvblxcL3htbHxcXFMqXFwvXFxTKlxcK3htbClcXHMqOy4qY2hhcnNldFxccyo9XFxzKnV0Zi04L2kudGVzdChibG9iLnR5cGUpKSB7XG4gICAgcmV0dXJuIG5ldyBCbG9iKFtTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RkVGRiksIGJsb2JdLCB7IHR5cGU6IGJsb2IudHlwZSB9KVxuICB9XG4gIHJldHVybiBibG9iXG59XG5cbmZ1bmN0aW9uIGRvd25sb2FkICh1cmwsIG5hbWUsIG9wdHMpIHtcbiAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gIHhoci5vcGVuKCdHRVQnLCB1cmwpXG4gIHhoci5yZXNwb25zZVR5cGUgPSAnYmxvYidcbiAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBzYXZlQXMoeGhyLnJlc3BvbnNlLCBuYW1lLCBvcHRzKVxuICB9XG4gIHhoci5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ2NvdWxkIG5vdCBkb3dubG9hZCBmaWxlJylcbiAgfVxuICB4aHIuc2VuZCgpXG59XG5cbmZ1bmN0aW9uIGNvcnNFbmFibGVkICh1cmwpIHtcbiAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gIC8vIHVzZSBzeW5jIHRvIGF2b2lkIHBvcHVwIGJsb2NrZXJcbiAgeGhyLm9wZW4oJ0hFQUQnLCB1cmwsIGZhbHNlKVxuICB0cnkge1xuICAgIHhoci5zZW5kKClcbiAgfSBjYXRjaCAoZSkge31cbiAgcmV0dXJuIHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPD0gMjk5XG59XG5cbi8vIGBhLmNsaWNrKClgIGRvZXNuJ3Qgd29yayBmb3IgYWxsIGJyb3dzZXJzICgjNDY1KVxuZnVuY3Rpb24gY2xpY2sgKG5vZGUpIHtcbiAgdHJ5IHtcbiAgICBub2RlLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ2NsaWNrJykpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ01vdXNlRXZlbnRzJylcbiAgICBldnQuaW5pdE1vdXNlRXZlbnQoJ2NsaWNrJywgdHJ1ZSwgdHJ1ZSwgd2luZG93LCAwLCAwLCAwLCA4MCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgMjAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwLCBudWxsKVxuICAgIG5vZGUuZGlzcGF0Y2hFdmVudChldnQpXG4gIH1cbn1cblxuLy8gRGV0ZWN0IFdlYlZpZXcgaW5zaWRlIGEgbmF0aXZlIG1hY09TIGFwcCBieSBydWxpbmcgb3V0IGFsbCBicm93c2Vyc1xuLy8gV2UganVzdCBuZWVkIHRvIGNoZWNrIGZvciAnU2FmYXJpJyBiZWNhdXNlIGFsbCBvdGhlciBicm93c2VycyAoYmVzaWRlcyBGaXJlZm94KSBpbmNsdWRlIHRoYXQgdG9vXG4vLyBodHRwczovL3d3dy53aGF0aXNteWJyb3dzZXIuY29tL2d1aWRlcy90aGUtbGF0ZXN0LXVzZXItYWdlbnQvbWFjb3NcbnZhciBpc01hY09TV2ViVmlldyA9IF9nbG9iYWwubmF2aWdhdG9yICYmIC9NYWNpbnRvc2gvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgL0FwcGxlV2ViS2l0Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmICEvU2FmYXJpLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbnZhciBzYXZlQXMgPSBfZ2xvYmFsLnNhdmVBcyB8fCAoXG4gIC8vIHByb2JhYmx5IGluIHNvbWUgd2ViIHdvcmtlclxuICAodHlwZW9mIHdpbmRvdyAhPT0gJ29iamVjdCcgfHwgd2luZG93ICE9PSBfZ2xvYmFsKVxuICAgID8gZnVuY3Rpb24gc2F2ZUFzICgpIHsgLyogbm9vcCAqLyB9XG5cbiAgLy8gVXNlIGRvd25sb2FkIGF0dHJpYnV0ZSBmaXJzdCBpZiBwb3NzaWJsZSAoIzE5MyBMdW1pYSBtb2JpbGUpIHVubGVzcyB0aGlzIGlzIGEgbWFjT1MgV2ViVmlld1xuICA6ICgnZG93bmxvYWQnIGluIEhUTUxBbmNob3JFbGVtZW50LnByb3RvdHlwZSAmJiAhaXNNYWNPU1dlYlZpZXcpXG4gID8gZnVuY3Rpb24gc2F2ZUFzIChibG9iLCBuYW1lLCBvcHRzKSB7XG4gICAgdmFyIFVSTCA9IF9nbG9iYWwuVVJMIHx8IF9nbG9iYWwud2Via2l0VVJMXG4gICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcbiAgICBuYW1lID0gbmFtZSB8fCBibG9iLm5hbWUgfHwgJ2Rvd25sb2FkJ1xuXG4gICAgYS5kb3dubG9hZCA9IG5hbWVcbiAgICBhLnJlbCA9ICdub29wZW5lcicgLy8gdGFibmFiYmluZ1xuXG4gICAgLy8gVE9ETzogZGV0ZWN0IGNocm9tZSBleHRlbnNpb25zICYgcGFja2FnZWQgYXBwc1xuICAgIC8vIGEudGFyZ2V0ID0gJ19ibGFuaydcblxuICAgIGlmICh0eXBlb2YgYmxvYiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFN1cHBvcnQgcmVndWxhciBsaW5rc1xuICAgICAgYS5ocmVmID0gYmxvYlxuICAgICAgaWYgKGEub3JpZ2luICE9PSBsb2NhdGlvbi5vcmlnaW4pIHtcbiAgICAgICAgY29yc0VuYWJsZWQoYS5ocmVmKVxuICAgICAgICAgID8gZG93bmxvYWQoYmxvYiwgbmFtZSwgb3B0cylcbiAgICAgICAgICA6IGNsaWNrKGEsIGEudGFyZ2V0ID0gJ19ibGFuaycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGljayhhKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdXBwb3J0IGJsb2JzXG4gICAgICBhLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgVVJMLnJldm9rZU9iamVjdFVSTChhLmhyZWYpIH0sIDRFNCkgLy8gNDBzXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgY2xpY2soYSkgfSwgMClcbiAgICB9XG4gIH1cblxuICAvLyBVc2UgbXNTYXZlT3JPcGVuQmxvYiBhcyBhIHNlY29uZCBhcHByb2FjaFxuICA6ICdtc1NhdmVPck9wZW5CbG9iJyBpbiBuYXZpZ2F0b3JcbiAgPyBmdW5jdGlvbiBzYXZlQXMgKGJsb2IsIG5hbWUsIG9wdHMpIHtcbiAgICBuYW1lID0gbmFtZSB8fCBibG9iLm5hbWUgfHwgJ2Rvd25sb2FkJ1xuXG4gICAgaWYgKHR5cGVvZiBibG9iID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKGNvcnNFbmFibGVkKGJsb2IpKSB7XG4gICAgICAgIGRvd25sb2FkKGJsb2IsIG5hbWUsIG9wdHMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxuICAgICAgICBhLmhyZWYgPSBibG9iXG4gICAgICAgIGEudGFyZ2V0ID0gJ19ibGFuaydcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGNsaWNrKGEpIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGJvbShibG9iLCBvcHRzKSwgbmFtZSlcbiAgICB9XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byB1c2luZyBGaWxlUmVhZGVyIGFuZCBhIHBvcHVwXG4gIDogZnVuY3Rpb24gc2F2ZUFzIChibG9iLCBuYW1lLCBvcHRzLCBwb3B1cCkge1xuICAgIC8vIE9wZW4gYSBwb3B1cCBpbW1lZGlhdGVseSBkbyBnbyBhcm91bmQgcG9wdXAgYmxvY2tlclxuICAgIC8vIE1vc3RseSBvbmx5IGF2YWlsYWJsZSBvbiB1c2VyIGludGVyYWN0aW9uIGFuZCB0aGUgZmlsZVJlYWRlciBpcyBhc3luYyBzby4uLlxuICAgIHBvcHVwID0gcG9wdXAgfHwgb3BlbignJywgJ19ibGFuaycpXG4gICAgaWYgKHBvcHVwKSB7XG4gICAgICBwb3B1cC5kb2N1bWVudC50aXRsZSA9XG4gICAgICBwb3B1cC5kb2N1bWVudC5ib2R5LmlubmVyVGV4dCA9ICdkb3dubG9hZGluZy4uLidcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGJsb2IgPT09ICdzdHJpbmcnKSByZXR1cm4gZG93bmxvYWQoYmxvYiwgbmFtZSwgb3B0cylcblxuICAgIHZhciBmb3JjZSA9IGJsb2IudHlwZSA9PT0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbiAgICB2YXIgaXNTYWZhcmkgPSAvY29uc3RydWN0b3IvaS50ZXN0KF9nbG9iYWwuSFRNTEVsZW1lbnQpIHx8IF9nbG9iYWwuc2FmYXJpXG4gICAgdmFyIGlzQ2hyb21lSU9TID0gL0NyaU9TXFwvW1xcZF0rLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbiAgICBpZiAoKGlzQ2hyb21lSU9TIHx8IChmb3JjZSAmJiBpc1NhZmFyaSkgfHwgaXNNYWNPU1dlYlZpZXcpICYmIHR5cGVvZiBGaWxlUmVhZGVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gU2FmYXJpIGRvZXNuJ3QgYWxsb3cgZG93bmxvYWRpbmcgb2YgYmxvYiBVUkxzXG4gICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHVybCA9IHJlYWRlci5yZXN1bHRcbiAgICAgICAgdXJsID0gaXNDaHJvbWVJT1MgPyB1cmwgOiB1cmwucmVwbGFjZSgvXmRhdGE6W147XSo7LywgJ2RhdGE6YXR0YWNobWVudC9maWxlOycpXG4gICAgICAgIGlmIChwb3B1cCkgcG9wdXAubG9jYXRpb24uaHJlZiA9IHVybFxuICAgICAgICBlbHNlIGxvY2F0aW9uID0gdXJsXG4gICAgICAgIHBvcHVwID0gbnVsbCAvLyByZXZlcnNlLXRhYm5hYmJpbmcgIzQ2MFxuICAgICAgfVxuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYilcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIFVSTCA9IF9nbG9iYWwuVVJMIHx8IF9nbG9iYWwud2Via2l0VVJMXG4gICAgICB2YXIgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAgaWYgKHBvcHVwKSBwb3B1cC5sb2NhdGlvbiA9IHVybFxuICAgICAgZWxzZSBsb2NhdGlvbi5ocmVmID0gdXJsXG4gICAgICBwb3B1cCA9IG51bGwgLy8gcmV2ZXJzZS10YWJuYWJiaW5nICM0NjBcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCkgfSwgNEU0KSAvLyA0MHNcbiAgICB9XG4gIH1cbilcblxuX2dsb2JhbC5zYXZlQXMgPSBzYXZlQXMuc2F2ZUFzID0gc2F2ZUFzXG5cbmlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHNhdmVBcztcbn1cbiIsICIvKipcbiAqIENyb3Bwci5qc1xuICogaHR0cHM6Ly9naXRodWIuY29tL2phbWVzc3Nvb2kvQ3JvcHByLmpzXG4gKiBcbiAqIEEgSmF2YVNjcmlwdCBpbWFnZSBjcm9wcGVyIHRoYXQncyBsaWdodHdlaWdodCwgYXdlc29tZSwgYW5kIGhhc1xuICogemVybyBkZXBlbmRlbmNpZXMuXG4gKiBcbiAqIChDKSAyMDE3IEphbWVzIE9vaS4gUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG5cdHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcblx0dHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcblx0KGdsb2JhbC5Dcm9wcHIgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbihmdW5jdGlvbiAoKSB7XG4gIHZhciBsYXN0VGltZSA9IDA7XG4gIHZhciB2ZW5kb3JzID0gWydtcycsICdtb3onLCAnd2Via2l0JywgJ28nXTtcbiAgZm9yICh2YXIgeCA9IDA7IHggPCB2ZW5kb3JzLmxlbmd0aCAmJiAhd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZTsgKyt4KSB7XG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHdpbmRvd1t2ZW5kb3JzW3hdICsgJ1JlcXVlc3RBbmltYXRpb25GcmFtZSddO1xuICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSA9IHdpbmRvd1t2ZW5kb3JzW3hdICsgJ0NhbmNlbEFuaW1hdGlvbkZyYW1lJ10gfHwgd2luZG93W3ZlbmRvcnNbeF0gKyAnQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lJ107XG4gIH1cbiAgaWYgKCF3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBlbGVtZW50KSB7XG4gICAgdmFyIGN1cnJUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgdmFyIHRpbWVUb0NhbGwgPSBNYXRoLm1heCgwLCAxNiAtIChjdXJyVGltZSAtIGxhc3RUaW1lKSk7XG4gICAgdmFyIGlkID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGJhY2soY3VyclRpbWUgKyB0aW1lVG9DYWxsKTtcbiAgICB9LCB0aW1lVG9DYWxsKTtcbiAgICBsYXN0VGltZSA9IGN1cnJUaW1lICsgdGltZVRvQ2FsbDtcbiAgICByZXR1cm4gaWQ7XG4gIH07XG4gIGlmICghd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKSB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICBjbGVhclRpbWVvdXQoaWQpO1xuICB9O1xufSkoKTtcbihmdW5jdGlvbiAoKSB7XG4gIGlmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBmYWxzZTtcbiAgZnVuY3Rpb24gQ3VzdG9tRXZlbnQoZXZlbnQsIHBhcmFtcykge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiBmYWxzZSwgZGV0YWlsOiB1bmRlZmluZWQgfTtcbiAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7XG4gICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudCwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlLCBwYXJhbXMuZGV0YWlsKTtcbiAgICByZXR1cm4gZXZ0O1xuICB9XG4gIEN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IHdpbmRvdy5FdmVudC5wcm90b3R5cGU7XG4gIHdpbmRvdy5DdXN0b21FdmVudCA9IEN1c3RvbUV2ZW50O1xufSkoKTtcbihmdW5jdGlvbiAod2luZG93KSB7XG4gIHRyeSB7XG4gICAgbmV3IEN1c3RvbUV2ZW50KCd0ZXN0Jyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlKSB7fVxuICBmdW5jdGlvbiBNb3VzZUV2ZW50KGV2ZW50VHlwZSwgcGFyYW1zKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHsgYnViYmxlczogZmFsc2UsIGNhbmNlbGFibGU6IGZhbHNlIH07XG4gICAgdmFyIG1vdXNlRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnTW91c2VFdmVudCcpO1xuICAgIG1vdXNlRXZlbnQuaW5pdE1vdXNlRXZlbnQoZXZlbnRUeXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUsIHdpbmRvdywgMCwgMCwgMCwgMCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAsIG51bGwpO1xuICAgIHJldHVybiBtb3VzZUV2ZW50O1xuICB9XG4gIE1vdXNlRXZlbnQucHJvdG90eXBlID0gRXZlbnQucHJvdG90eXBlO1xuICB3aW5kb3cuTW91c2VFdmVudCA9IE1vdXNlRXZlbnQ7XG59KSh3aW5kb3cpO1xuXG52YXIgY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufTtcblxudmFyIGNyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gICAgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9O1xufSgpO1xuXG5cblxuXG5cblxuXG52YXIgZ2V0ID0gZnVuY3Rpb24gZ2V0KG9iamVjdCwgcHJvcGVydHksIHJlY2VpdmVyKSB7XG4gIGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbiAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpO1xuXG4gIGlmIChkZXNjID09PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7XG5cbiAgICBpZiAocGFyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0KHBhcmVudCwgcHJvcGVydHksIHJlY2VpdmVyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MpIHtcbiAgICByZXR1cm4gZGVzYy52YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7XG5cbiAgICBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTtcbiAgfVxufTtcblxudmFyIGluaGVyaXRzID0gZnVuY3Rpb24gKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xufTtcblxuXG5cblxuXG5cblxuXG5cblxuXG52YXIgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiA9IGZ1bmN0aW9uIChzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmO1xufTtcblxuXG5cblxuXG52YXIgc2xpY2VkVG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gc2xpY2VJdGVyYXRvcihhcnIsIGkpIHtcbiAgICB2YXIgX2FyciA9IFtdO1xuICAgIHZhciBfbiA9IHRydWU7XG4gICAgdmFyIF9kID0gZmFsc2U7XG4gICAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgICBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfZCA9IHRydWU7XG4gICAgICBfZSA9IGVycjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSkgX2lbXCJyZXR1cm5cIl0oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIF9hcnI7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGFyciwgaSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICAgIHJldHVybiBhcnI7XG4gICAgfSBlbHNlIGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpIHtcbiAgICAgIHJldHVybiBzbGljZUl0ZXJhdG9yKGFyciwgaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpO1xuICAgIH1cbiAgfTtcbn0oKTtcblxudmFyIEhhbmRsZSA9XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgSGFuZGxlIGluc3RhbmNlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBwb3NpdGlvbiBUaGUgeCBhbmQgeSByYXRpbyBwb3NpdGlvbiBvZiB0aGUgaGFuZGxlXG4gKiAgICAgIHdpdGhpbiB0aGUgY3JvcCByZWdpb24uIEFjY2VwdHMgYSB2YWx1ZSBiZXR3ZWVuIDAgdG8gMSBpbiB0aGUgb3JkZXJcbiAqICAgICAgb2YgW1gsIFldLlxuICogQHBhcmFtIHtBcnJheX0gY29uc3RyYWludHMgRGVmaW5lIHRoZSBzaWRlIG9mIHRoZSBjcm9wIHJlZ2lvbiB0aGF0XG4gKiAgICAgIGlzIHRvIGJlIGFmZmVjdGVkIGJ5IHRoaXMgaGFuZGxlLiBBY2NlcHRzIGEgdmFsdWUgb2YgMCBvciAxIGluIHRoZVxuICogICAgICBvcmRlciBvZiBbVE9QLCBSSUdIVCwgQk9UVE9NLCBMRUZUXS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBjdXJzb3IgVGhlIENTUyBjdXJzb3Igb2YgdGhpcyBoYW5kbGUuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGV2ZW50QnVzIFRoZSBlbGVtZW50IHRvIGRpc3BhdGNoIGV2ZW50cyB0by5cbiAqL1xuZnVuY3Rpb24gSGFuZGxlKHBvc2l0aW9uLCBjb25zdHJhaW50cywgY3Vyc29yLCBldmVudEJ1cykge1xuICBjbGFzc0NhbGxDaGVjayh0aGlzLCBIYW5kbGUpO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgdGhpcy5jb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzO1xuICB0aGlzLmN1cnNvciA9IGN1cnNvcjtcbiAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzO1xuICB0aGlzLmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHRoaXMuZWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1oYW5kbGUnO1xuICB0aGlzLmVsLnN0eWxlLmN1cnNvciA9IGN1cnNvcjtcbiAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gIGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICBzZWxmLmV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdoYW5kbGVzdGFydCcsIHtcbiAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYgfVxuICAgIH0pKTtcbiAgfVxuICBmdW5jdGlvbiBvbk1vdXNlVXAoZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZWVuZCcsIHtcbiAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYgfVxuICAgIH0pKTtcbiAgfVxuICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBzZWxmLmV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdoYW5kbGVtb3ZlJywge1xuICAgICAgZGV0YWlsOiB7IG1vdXNlWDogZS5jbGllbnRYLCBtb3VzZVk6IGUuY2xpZW50WSB9XG4gICAgfSkpO1xuICB9XG59O1xuXG52YXIgQm94ID0gZnVuY3Rpb24gKCkge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBCb3ggaW5zdGFuY2UuXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge051bWJlcn0geDFcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHkxXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB4MlxuICAgKiBAcGFyYW0ge051bWJlcn0geTJcbiAgICovXG4gIGZ1bmN0aW9uIEJveCh4MSwgeTEsIHgyLCB5Mikge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEJveCk7XG4gICAgdGhpcy54MSA9IHgxO1xuICAgIHRoaXMueTEgPSB5MTtcbiAgICB0aGlzLngyID0geDI7XG4gICAgdGhpcy55MiA9IHkyO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBuZXcgZGltZW5zaW9ucyBvZiB0aGUgYm94LlxuICAgKiBAcGFyYW0ge051bWJlcn0geDFcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHkxXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB4MlxuICAgKiBAcGFyYW0ge051bWJlcn0geTJcbiAgICovXG4gIGNyZWF0ZUNsYXNzKEJveCwgW3tcbiAgICBrZXk6ICdzZXQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQkJDEoKSB7XG4gICAgICB2YXIgeDEgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG4gICAgICB2YXIgeTEgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICB2YXIgeDIgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7XG4gICAgICB2YXIgeTIgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gICAgICB0aGlzLngxID0geDEgPT0gbnVsbCA/IHRoaXMueDEgOiB4MTtcbiAgICAgIHRoaXMueTEgPSB5MSA9PSBudWxsID8gdGhpcy55MSA6IHkxO1xuICAgICAgdGhpcy54MiA9IHgyID09IG51bGwgPyB0aGlzLngyIDogeDI7XG4gICAgICB0aGlzLnkyID0geTIgPT0gbnVsbCA/IHRoaXMueTIgOiB5MjtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSB3aWR0aCBvZiB0aGUgYm94LlxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICd3aWR0aCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHdpZHRoKCkge1xuICAgICAgcmV0dXJuIE1hdGguYWJzKHRoaXMueDIgLSB0aGlzLngxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgaGVpZ2h0IG9mIHRoZSBib3guXG4gICAgICogQHJldHVybnMge051bWJlcn1cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ2hlaWdodCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhlaWdodCgpIHtcbiAgICAgIHJldHVybiBNYXRoLmFicyh0aGlzLnkyIC0gdGhpcy55MSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2l6ZXMgdGhlIGJveCB0byBhIG5ldyBzaXplLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBuZXdXaWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBuZXdIZWlnaHRcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbb3JpZ2luXSBUaGUgb3JpZ2luIHBvaW50IHRvIHJlc2l6ZSBmcm9tLlxuICAgICAqICAgICAgRGVmYXVsdHMgdG8gWzAsIDBdICh0b3AgbGVmdCkuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdyZXNpemUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCkge1xuICAgICAgdmFyIG9yaWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogWzAsIDBdO1xuICAgICAgdmFyIGZyb21YID0gdGhpcy54MSArIHRoaXMud2lkdGgoKSAqIG9yaWdpblswXTtcbiAgICAgIHZhciBmcm9tWSA9IHRoaXMueTEgKyB0aGlzLmhlaWdodCgpICogb3JpZ2luWzFdO1xuICAgICAgdGhpcy54MSA9IGZyb21YIC0gbmV3V2lkdGggKiBvcmlnaW5bMF07XG4gICAgICB0aGlzLnkxID0gZnJvbVkgLSBuZXdIZWlnaHQgKiBvcmlnaW5bMV07XG4gICAgICB0aGlzLngyID0gdGhpcy54MSArIG5ld1dpZHRoO1xuICAgICAgdGhpcy55MiA9IHRoaXMueTEgKyBuZXdIZWlnaHQ7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2NhbGUgdGhlIGJveCBieSBhIGZhY3Rvci5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZmFjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW29yaWdpbl0gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnc2NhbGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzY2FsZShmYWN0b3IpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFswLCAwXTtcbiAgICAgIHZhciBuZXdXaWR0aCA9IHRoaXMud2lkdGgoKSAqIGZhY3RvcjtcbiAgICAgIHZhciBuZXdIZWlnaHQgPSB0aGlzLmhlaWdodCgpICogZmFjdG9yO1xuICAgICAgdGhpcy5yZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ21vdmUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtb3ZlKCkge1xuICAgICAgdmFyIHggPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG4gICAgICB2YXIgeSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgoKTtcbiAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodCgpO1xuICAgICAgeCA9IHggPT09IG51bGwgPyB0aGlzLngxIDogeDtcbiAgICAgIHkgPSB5ID09PSBudWxsID8gdGhpcy55MSA6IHk7XG4gICAgICB0aGlzLngxID0geDtcbiAgICAgIHRoaXMueTEgPSB5O1xuICAgICAgdGhpcy54MiA9IHggKyB3aWR0aDtcbiAgICAgIHRoaXMueTIgPSB5ICsgaGVpZ2h0O1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCByZWxhdGl2ZSB4IGFuZCB5IGNvb3JkaW5hdGVzIG9mIGEgZ2l2ZW4gcG9pbnQgd2l0aGluIHRoZSBib3guXG4gICAgICogQHBhcmFtIHtBcnJheX0gcG9pbnQgVGhlIHggYW5kIHkgcmF0aW8gcG9zaXRpb24gd2l0aGluIHRoZSBib3guXG4gICAgICogQHJldHVybnMge0FycmF5fSBUaGUgeCBhbmQgeSBjb29yZGluYXRlcyBbeCwgeV0uXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdnZXRSZWxhdGl2ZVBvaW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmVsYXRpdmVQb2ludCgpIHtcbiAgICAgIHZhciBwb2ludCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogWzAsIDBdO1xuICAgICAgdmFyIHggPSB0aGlzLndpZHRoKCkgKiBwb2ludFswXTtcbiAgICAgIHZhciB5ID0gdGhpcy5oZWlnaHQoKSAqIHBvaW50WzFdO1xuICAgICAgcmV0dXJuIFt4LCB5XTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGFic29sdXRlIHggYW5kIHkgY29vcmRpbmF0ZXMgb2YgYSBnaXZlbiBwb2ludCB3aXRoaW4gdGhlIGJveC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwb2ludCBUaGUgeCBhbmQgeSByYXRpbyBwb3NpdGlvbiB3aXRoaW4gdGhlIGJveC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFRoZSB4IGFuZCB5IGNvb3JkaW5hdGVzIFt4LCB5XS5cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ2dldEFic29sdXRlUG9pbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBYnNvbHV0ZVBvaW50KCkge1xuICAgICAgdmFyIHBvaW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbMCwgMF07XG4gICAgICB2YXIgeCA9IHRoaXMueDEgKyB0aGlzLndpZHRoKCkgKiBwb2ludFswXTtcbiAgICAgIHZhciB5ID0gdGhpcy55MSArIHRoaXMuaGVpZ2h0KCkgKiBwb2ludFsxXTtcbiAgICAgIHJldHVybiBbeCwgeV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cmFpbiB0aGUgYm94IHRvIGEgZml4ZWQgcmF0aW8uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHJhdGlvXG4gICAgICogQHBhcmFtIHtBcnJheX0gW29yaWdpbl0gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgRGVmYXVsdHMgdG8gWzAsIDBdICh0b3AgbGVmdCkuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtncm93XSBUaGUgYXhpcyB0byBncm93IHRvIG1haW50YWluIHRoZSByYXRpby5cbiAgICAgKiAgICAgRGVmYXVsdHMgdG8gJ2hlaWdodCcuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdjb25zdHJhaW5Ub1JhdGlvJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29uc3RyYWluVG9SYXRpbyhyYXRpbykge1xuICAgICAgdmFyIG9yaWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogWzAsIDBdO1xuICAgICAgdmFyIGdyb3cgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6ICdoZWlnaHQnO1xuICAgICAgaWYgKHJhdGlvID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgoKTtcbiAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodCgpO1xuICAgICAgc3dpdGNoIChncm93KSB7XG4gICAgICAgIGNhc2UgJ2hlaWdodCc6XG4gICAgICAgICAgdGhpcy5yZXNpemUodGhpcy53aWR0aCgpLCB0aGlzLndpZHRoKCkgKiByYXRpbywgb3JpZ2luKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnd2lkdGgnOlxuICAgICAgICAgIHRoaXMucmVzaXplKHRoaXMuaGVpZ2h0KCkgKiAxIC8gcmF0aW8sIHRoaXMuaGVpZ2h0KCksIG9yaWdpbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5yZXNpemUodGhpcy53aWR0aCgpLCB0aGlzLndpZHRoKCkgKiByYXRpbywgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJhaW4gdGhlIGJveCB3aXRoaW4gYSBib3VuZGFyeS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYm91bmRhcnlXaWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBib3VuZGFyeUhlaWdodFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtvcmlnaW5dIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnY29uc3RyYWluVG9Cb3VuZGFyeScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbnN0cmFpblRvQm91bmRhcnkoYm91bmRhcnlXaWR0aCwgYm91bmRhcnlIZWlnaHQpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IFswLCAwXTtcbiAgICAgIHZhciBfZ2V0QWJzb2x1dGVQb2ludCA9IHRoaXMuZ2V0QWJzb2x1dGVQb2ludChvcmlnaW4pLFxuICAgICAgICAgIF9nZXRBYnNvbHV0ZVBvaW50MiA9IHNsaWNlZFRvQXJyYXkoX2dldEFic29sdXRlUG9pbnQsIDIpLFxuICAgICAgICAgIG9yaWdpblggPSBfZ2V0QWJzb2x1dGVQb2ludDJbMF0sXG4gICAgICAgICAgb3JpZ2luWSA9IF9nZXRBYnNvbHV0ZVBvaW50MlsxXTtcbiAgICAgIHZhciBtYXhJZkxlZnQgPSBvcmlnaW5YO1xuICAgICAgdmFyIG1heElmVG9wID0gb3JpZ2luWTtcbiAgICAgIHZhciBtYXhJZlJpZ2h0ID0gYm91bmRhcnlXaWR0aCAtIG9yaWdpblg7XG4gICAgICB2YXIgbWF4SWZCb3R0b20gPSBib3VuZGFyeUhlaWdodCAtIG9yaWdpblk7XG4gICAgICB2YXIgZGlyZWN0aW9uWCA9IC0yICogb3JpZ2luWzBdICsgMTtcbiAgICAgIHZhciBkaXJlY3Rpb25ZID0gLTIgKiBvcmlnaW5bMV0gKyAxO1xuICAgICAgdmFyIG1heFdpZHRoID0gbnVsbCxcbiAgICAgICAgICBtYXhIZWlnaHQgPSBudWxsO1xuICAgICAgc3dpdGNoIChkaXJlY3Rpb25YKSB7XG4gICAgICAgIGNhc2UgLTE6XG4gICAgICAgICAgbWF4V2lkdGggPSBtYXhJZkxlZnQ7YnJlYWs7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWluKG1heElmTGVmdCwgbWF4SWZSaWdodCkgKiAyO2JyZWFrO1xuICAgICAgICBjYXNlICsxOlxuICAgICAgICAgIG1heFdpZHRoID0gbWF4SWZSaWdodDticmVhaztcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoZGlyZWN0aW9uWSkge1xuICAgICAgICBjYXNlIC0xOlxuICAgICAgICAgIG1heEhlaWdodCA9IG1heElmVG9wO2JyZWFrO1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5taW4obWF4SWZUb3AsIG1heElmQm90dG9tKSAqIDI7YnJlYWs7XG4gICAgICAgIGNhc2UgKzE6XG4gICAgICAgICAgbWF4SGVpZ2h0ID0gbWF4SWZCb3R0b207YnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy53aWR0aCgpID4gbWF4V2lkdGgpIHtcbiAgICAgICAgdmFyIGZhY3RvciA9IG1heFdpZHRoIC8gdGhpcy53aWR0aCgpO1xuICAgICAgICB0aGlzLnNjYWxlKGZhY3Rvciwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmhlaWdodCgpID4gbWF4SGVpZ2h0KSB7XG4gICAgICAgIHZhciBfZmFjdG9yID0gbWF4SGVpZ2h0IC8gdGhpcy5oZWlnaHQoKTtcbiAgICAgICAgdGhpcy5zY2FsZShfZmFjdG9yLCBvcmlnaW4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cmFpbiB0aGUgYm94IHRvIGEgbWF4aW11bS9taW5pbXVtIHNpemUuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFttYXhXaWR0aF1cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW21heEhlaWdodF1cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW21pbldpZHRoXVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbbWluSGVpZ2h0XVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtvcmlnaW5dIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbcmF0aW9dIFJhdGlvIHRvIG1haW50YWluLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnY29uc3RyYWluVG9TaXplJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29uc3RyYWluVG9TaXplKCkge1xuICAgICAgdmFyIG1heFdpZHRoID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBudWxsO1xuICAgICAgdmFyIG1heEhlaWdodCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgIHZhciBtaW5XaWR0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcbiAgICAgIHZhciBtaW5IZWlnaHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gICAgICB2YXIgb3JpZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiBbMCwgMF07XG4gICAgICB2YXIgcmF0aW8gPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IG51bGw7XG4gICAgICBpZiAocmF0aW8pIHtcbiAgICAgICAgaWYgKHJhdGlvID4gMSkge1xuICAgICAgICAgIG1heFdpZHRoID0gbWF4SGVpZ2h0ICogMSAvIHJhdGlvO1xuICAgICAgICAgIG1pbkhlaWdodCA9IG1pbkhlaWdodCAqIHJhdGlvO1xuICAgICAgICB9IGVsc2UgaWYgKHJhdGlvIDwgMSkge1xuICAgICAgICAgIG1heEhlaWdodCA9IG1heFdpZHRoICogcmF0aW87XG4gICAgICAgICAgbWluV2lkdGggPSBtaW5IZWlnaHQgKiAxIC8gcmF0aW87XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtYXhXaWR0aCAmJiB0aGlzLndpZHRoKCkgPiBtYXhXaWR0aCkge1xuICAgICAgICB2YXIgbmV3V2lkdGggPSBtYXhXaWR0aCxcbiAgICAgICAgICAgIG5ld0hlaWdodCA9IHJhdGlvID09PSBudWxsID8gdGhpcy5oZWlnaHQoKSA6IG1heEhlaWdodDtcbiAgICAgICAgdGhpcy5yZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhIZWlnaHQgJiYgdGhpcy5oZWlnaHQoKSA+IG1heEhlaWdodCkge1xuICAgICAgICB2YXIgX25ld1dpZHRoID0gcmF0aW8gPT09IG51bGwgPyB0aGlzLndpZHRoKCkgOiBtYXhXaWR0aCxcbiAgICAgICAgICAgIF9uZXdIZWlnaHQgPSBtYXhIZWlnaHQ7XG4gICAgICAgIHRoaXMucmVzaXplKF9uZXdXaWR0aCwgX25ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmIChtaW5XaWR0aCAmJiB0aGlzLndpZHRoKCkgPCBtaW5XaWR0aCkge1xuICAgICAgICB2YXIgX25ld1dpZHRoMiA9IG1pbldpZHRoLFxuICAgICAgICAgICAgX25ld0hlaWdodDIgPSByYXRpbyA9PT0gbnVsbCA/IHRoaXMuaGVpZ2h0KCkgOiBtaW5IZWlnaHQ7XG4gICAgICAgIHRoaXMucmVzaXplKF9uZXdXaWR0aDIsIF9uZXdIZWlnaHQyLCBvcmlnaW4pO1xuICAgICAgfVxuICAgICAgaWYgKG1pbkhlaWdodCAmJiB0aGlzLmhlaWdodCgpIDwgbWluSGVpZ2h0KSB7XG4gICAgICAgIHZhciBfbmV3V2lkdGgzID0gcmF0aW8gPT09IG51bGwgPyB0aGlzLndpZHRoKCkgOiBtaW5XaWR0aCxcbiAgICAgICAgICAgIF9uZXdIZWlnaHQzID0gbWluSGVpZ2h0O1xuICAgICAgICB0aGlzLnJlc2l6ZShfbmV3V2lkdGgzLCBfbmV3SGVpZ2h0Mywgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQm94O1xufSgpO1xuXG4vKipcbiAqIEJpbmRzIGFuIGVsZW1lbnQncyB0b3VjaCBldmVudHMgdG8gYmUgc2ltdWxhdGVkIGFzIG1vdXNlIGV2ZW50cy5cbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICovXG5mdW5jdGlvbiBlbmFibGVUb3VjaChlbGVtZW50KSB7XG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHNpbXVsYXRlTW91c2VFdmVudCk7XG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBzaW11bGF0ZU1vdXNlRXZlbnQpO1xuICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHNpbXVsYXRlTW91c2VFdmVudCk7XG59XG4vKipcbiAqIFRyYW5zbGF0ZXMgYSB0b3VjaCBldmVudCB0byBhIG1vdXNlIGV2ZW50LlxuICogQHBhcmFtIHtFdmVudH0gZVxuICovXG5mdW5jdGlvbiBzaW11bGF0ZU1vdXNlRXZlbnQoZSkge1xuICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIHZhciB0b3VjaCA9IGUuY2hhbmdlZFRvdWNoZXNbMF07XG4gIHZhciBldmVudE1hcCA9IHtcbiAgICAndG91Y2hzdGFydCc6ICdtb3VzZWRvd24nLFxuICAgICd0b3VjaG1vdmUnOiAnbW91c2Vtb3ZlJyxcbiAgICAndG91Y2hlbmQnOiAnbW91c2V1cCdcbiAgfTtcbiAgdG91Y2gudGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoZXZlbnRNYXBbZS50eXBlXSwge1xuICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICB2aWV3OiB3aW5kb3csXG4gICAgY2xpZW50WDogdG91Y2guY2xpZW50WCxcbiAgICBjbGllbnRZOiB0b3VjaC5jbGllbnRZLFxuICAgIHNjcmVlblg6IHRvdWNoLnNjcmVlblgsXG4gICAgc2NyZWVuWTogdG91Y2guc2NyZWVuWVxuICB9KSk7XG59XG5cbi8qKlxuICogRGVmaW5lIGEgbGlzdCBvZiBoYW5kbGVzIHRvIGNyZWF0ZS5cbiAqXG4gKiBAcHJvcGVydHkge0FycmF5fSBwb3NpdGlvbiAtIFRoZSB4IGFuZCB5IHJhdGlvIHBvc2l0aW9uIG9mIHRoZSBoYW5kbGUgd2l0aGluXG4gKiAgICAgIHRoZSBjcm9wIHJlZ2lvbi4gQWNjZXB0cyBhIHZhbHVlIGJldHdlZW4gMCB0byAxIGluIHRoZSBvcmRlciBvZiBbWCwgWV0uXG4gKiBAcHJvcGVydHkge0FycmF5fSBjb25zdHJhaW50cyAtIERlZmluZSB0aGUgc2lkZSBvZiB0aGUgY3JvcCByZWdpb24gdGhhdCBpcyB0b1xuICogICAgICBiZSBhZmZlY3RlZCBieSB0aGlzIGhhbmRsZS4gQWNjZXB0cyBhIHZhbHVlIG9mIDAgb3IgMSBpbiB0aGUgb3JkZXIgb2ZcbiAqICAgICAgW1RPUCwgUklHSFQsIEJPVFRPTSwgTEVGVF0uXG4gKiBAcHJvcGVydHkge1N0cmluZ30gY3Vyc29yIC0gVGhlIENTUyBjdXJzb3Igb2YgdGhpcyBoYW5kbGUuXG4gKi9cbnZhciBIQU5ETEVTID0gW3sgcG9zaXRpb246IFswLjAsIDAuMF0sIGNvbnN0cmFpbnRzOiBbMSwgMCwgMCwgMV0sIGN1cnNvcjogJ253LXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuNSwgMC4wXSwgY29uc3RyYWludHM6IFsxLCAwLCAwLCAwXSwgY3Vyc29yOiAnbi1yZXNpemUnIH0sIHsgcG9zaXRpb246IFsxLjAsIDAuMF0sIGNvbnN0cmFpbnRzOiBbMSwgMSwgMCwgMF0sIGN1cnNvcjogJ25lLXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzEuMCwgMC41XSwgY29uc3RyYWludHM6IFswLCAxLCAwLCAwXSwgY3Vyc29yOiAnZS1yZXNpemUnIH0sIHsgcG9zaXRpb246IFsxLjAsIDEuMF0sIGNvbnN0cmFpbnRzOiBbMCwgMSwgMSwgMF0sIGN1cnNvcjogJ3NlLXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuNSwgMS4wXSwgY29uc3RyYWludHM6IFswLCAwLCAxLCAwXSwgY3Vyc29yOiAncy1yZXNpemUnIH0sIHsgcG9zaXRpb246IFswLjAsIDEuMF0sIGNvbnN0cmFpbnRzOiBbMCwgMCwgMSwgMV0sIGN1cnNvcjogJ3N3LXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuMCwgMC41XSwgY29uc3RyYWludHM6IFswLCAwLCAwLCAxXSwgY3Vyc29yOiAndy1yZXNpemUnIH1dO1xudmFyIENyb3BwckNvcmUgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENyb3BwckNvcmUoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgdmFyIGRlZmVycmVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDcm9wcHJDb3JlKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBDcm9wcHJDb3JlLnBhcnNlT3B0aW9ucyhvcHRpb25zIHx8IHt9KTtcbiAgICBpZiAoIWVsZW1lbnQubm9kZU5hbWUpIHtcbiAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpO1xuICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyAnVW5hYmxlIHRvIGZpbmQgZWxlbWVudC4nO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzcmMnKSkge1xuICAgICAgdGhyb3cgJ0ltYWdlIHNyYyBub3QgcHJvdmlkZWQuJztcbiAgICB9XG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZXN0b3JlID0ge1xuICAgICAgcGFyZW50OiBlbGVtZW50LnBhcmVudE5vZGUsXG4gICAgICBlbGVtZW50OiBlbGVtZW50XG4gICAgfTtcbiAgICBpZiAoIWRlZmVycmVkKSB7XG4gICAgICBpZiAoZWxlbWVudC53aWR0aCA9PT0gMCB8fCBlbGVtZW50LmhlaWdodCA9PT0gMCkge1xuICAgICAgICBlbGVtZW50Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpcy5pbml0aWFsaXplKGVsZW1lbnQpO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjcmVhdGVDbGFzcyhDcm9wcHJDb3JlLCBbe1xuICAgIGtleTogJ2luaXRpYWxpemUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0aWFsaXplKGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuY3JlYXRlRE9NKGVsZW1lbnQpO1xuICAgICAgdGhpcy5vcHRpb25zLmNvbnZlcnRUb1BpeGVscyh0aGlzLmNyb3BwZXJFbCk7XG4gICAgICB0aGlzLmF0dGFjaEhhbmRsZXJFdmVudHMoKTtcbiAgICAgIHRoaXMuYXR0YWNoUmVnaW9uRXZlbnRzKCk7XG4gICAgICB0aGlzLmF0dGFjaE92ZXJsYXlFdmVudHMoKTtcbiAgICAgIHRoaXMuYm94ID0gdGhpcy5pbml0aWFsaXplQm94KHRoaXMub3B0aW9ucyk7XG4gICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkluaXRpYWxpemUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uSW5pdGlhbGl6ZSh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjcmVhdGVET00nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVET00odGFyZ2V0RWwpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMuY29udGFpbmVyRWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1jb250YWluZXInO1xuICAgICAgdGhpcy5ldmVudEJ1cyA9IHRoaXMuY29udGFpbmVyRWw7XG4gICAgICBlbmFibGVUb3VjaCh0aGlzLmNvbnRhaW5lckVsKTtcbiAgICAgIHRoaXMuY3JvcHBlckVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aGlzLmNyb3BwZXJFbC5jbGFzc05hbWUgPSAnY3JvcHByJztcbiAgICAgIHRoaXMuaW1hZ2VFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgdGhpcy5pbWFnZUVsLnNldEF0dHJpYnV0ZSgnc3JjJywgdGFyZ2V0RWwuZ2V0QXR0cmlidXRlKCdzcmMnKSk7XG4gICAgICB0aGlzLmltYWdlRWwuc2V0QXR0cmlidXRlKCdhbHQnLCB0YXJnZXRFbC5nZXRBdHRyaWJ1dGUoJ2FsdCcpKTtcbiAgICAgIHRoaXMuaW1hZ2VFbC5jbGFzc05hbWUgPSAnY3JvcHByLWltYWdlJztcbiAgICAgIHRoaXMuaW1hZ2VDbGlwcGVkRWwgPSB0aGlzLmltYWdlRWwuY2xvbmVOb2RlKCk7XG4gICAgICB0aGlzLmltYWdlQ2xpcHBlZEVsLmNsYXNzTmFtZSA9ICdjcm9wcHItaW1hZ2VDbGlwcGVkJztcbiAgICAgIHRoaXMucmVnaW9uRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMucmVnaW9uRWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1yZWdpb24nO1xuICAgICAgdGhpcy5vdmVybGF5RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMub3ZlcmxheUVsLmNsYXNzTmFtZSA9ICdjcm9wcHItb3ZlcmxheSc7XG4gICAgICB2YXIgaGFuZGxlQ29udGFpbmVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGhhbmRsZUNvbnRhaW5lckVsLmNsYXNzTmFtZSA9ICdjcm9wcHItaGFuZGxlQ29udGFpbmVyJztcbiAgICAgIHRoaXMuaGFuZGxlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBIQU5ETEVTLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBoYW5kbGUgPSBuZXcgSGFuZGxlKEhBTkRMRVNbaV0ucG9zaXRpb24sIEhBTkRMRVNbaV0uY29uc3RyYWludHMsIEhBTkRMRVNbaV0uY3Vyc29yLCB0aGlzLmV2ZW50QnVzKTtcbiAgICAgICAgdGhpcy5oYW5kbGVzLnB1c2goaGFuZGxlKTtcbiAgICAgICAgaGFuZGxlQ29udGFpbmVyRWwuYXBwZW5kQ2hpbGQoaGFuZGxlLmVsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3JvcHBlckVsLmFwcGVuZENoaWxkKHRoaXMuaW1hZ2VFbCk7XG4gICAgICB0aGlzLmNyb3BwZXJFbC5hcHBlbmRDaGlsZCh0aGlzLmltYWdlQ2xpcHBlZEVsKTtcbiAgICAgIHRoaXMuY3JvcHBlckVsLmFwcGVuZENoaWxkKHRoaXMucmVnaW9uRWwpO1xuICAgICAgdGhpcy5jcm9wcGVyRWwuYXBwZW5kQ2hpbGQodGhpcy5vdmVybGF5RWwpO1xuICAgICAgdGhpcy5jcm9wcGVyRWwuYXBwZW5kQ2hpbGQoaGFuZGxlQ29udGFpbmVyRWwpO1xuICAgICAgdGhpcy5jb250YWluZXJFbC5hcHBlbmRDaGlsZCh0aGlzLmNyb3BwZXJFbCk7XG4gICAgICB0YXJnZXRFbC5wYXJlbnRFbGVtZW50LnJlcGxhY2VDaGlsZCh0aGlzLmNvbnRhaW5lckVsLCB0YXJnZXRFbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIGltYWdlIHNyYy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3JjXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdzZXRJbWFnZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEltYWdlKHNyYykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG4gICAgICB0aGlzLmltYWdlRWwub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczIuYm94ID0gX3RoaXMyLmluaXRpYWxpemVCb3goX3RoaXMyLm9wdGlvbnMpO1xuICAgICAgICBfdGhpczIucmVkcmF3KCk7XG4gICAgICB9O1xuICAgICAgdGhpcy5pbWFnZUVsLnNyYyA9IHNyYztcbiAgICAgIHRoaXMuaW1hZ2VDbGlwcGVkRWwuc3JjID0gc3JjO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZGVzdHJveScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLl9yZXN0b3JlLnBhcmVudC5yZXBsYWNlQ2hpbGQodGhpcy5fcmVzdG9yZS5lbGVtZW50LCB0aGlzLmNvbnRhaW5lckVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGJveCByZWdpb24gd2l0aCBhIHNldCBvZiBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIFRoZSBvcHRpb25zLlxuICAgICAqIEByZXR1cm5zIHtCb3h9XG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdpbml0aWFsaXplQm94JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZUJveChvcHRzKSB7XG4gICAgICB2YXIgd2lkdGggPSBvcHRzLnN0YXJ0U2l6ZS53aWR0aDtcbiAgICAgIHZhciBoZWlnaHQgPSBvcHRzLnN0YXJ0U2l6ZS5oZWlnaHQ7XG4gICAgICB2YXIgYm94ID0gbmV3IEJveCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIGJveC5jb25zdHJhaW5Ub1JhdGlvKG9wdHMuYXNwZWN0UmF0aW8sIFswLjUsIDAuNV0pO1xuICAgICAgdmFyIG1pbiA9IG9wdHMubWluU2l6ZTtcbiAgICAgIHZhciBtYXggPSBvcHRzLm1heFNpemU7XG4gICAgICBib3guY29uc3RyYWluVG9TaXplKG1heC53aWR0aCwgbWF4LmhlaWdodCwgbWluLndpZHRoLCBtaW4uaGVpZ2h0LCBbMC41LCAwLjVdLCBvcHRzLmFzcGVjdFJhdGlvKTtcbiAgICAgIHZhciBwYXJlbnRXaWR0aCA9IHRoaXMuY3JvcHBlckVsLm9mZnNldFdpZHRoO1xuICAgICAgdmFyIHBhcmVudEhlaWdodCA9IHRoaXMuY3JvcHBlckVsLm9mZnNldEhlaWdodDtcbiAgICAgIGJveC5jb25zdHJhaW5Ub0JvdW5kYXJ5KHBhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHQsIFswLjUsIDAuNV0pO1xuICAgICAgdmFyIHggPSB0aGlzLmNyb3BwZXJFbC5vZmZzZXRXaWR0aCAvIDIgLSBib3gud2lkdGgoKSAvIDI7XG4gICAgICB2YXIgeSA9IHRoaXMuY3JvcHBlckVsLm9mZnNldEhlaWdodCAvIDIgLSBib3guaGVpZ2h0KCkgLyAyO1xuICAgICAgYm94Lm1vdmUoeCwgeSk7XG4gICAgICByZXR1cm4gYm94O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3JlZHJhdycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlZHJhdygpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuICAgICAgdmFyIHdpZHRoID0gTWF0aC5yb3VuZCh0aGlzLmJveC53aWR0aCgpKSxcbiAgICAgICAgICBoZWlnaHQgPSBNYXRoLnJvdW5kKHRoaXMuYm94LmhlaWdodCgpKSxcbiAgICAgICAgICB4MSA9IE1hdGgucm91bmQodGhpcy5ib3gueDEpLFxuICAgICAgICAgIHkxID0gTWF0aC5yb3VuZCh0aGlzLmJveC55MSksXG4gICAgICAgICAgeDIgPSBNYXRoLnJvdW5kKHRoaXMuYm94LngyKSxcbiAgICAgICAgICB5MiA9IE1hdGgucm91bmQodGhpcy5ib3gueTIpO1xuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMy5yZWdpb25FbC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKCcgKyB4MSArICdweCwgJyArIHkxICsgJ3B4KSc7XG4gICAgICAgIF90aGlzMy5yZWdpb25FbC5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICAgICAgX3RoaXMzLnJlZ2lvbkVsLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG4gICAgICAgIF90aGlzMy5pbWFnZUNsaXBwZWRFbC5zdHlsZS5jbGlwID0gJ3JlY3QoJyArIHkxICsgJ3B4LCAnICsgeDIgKyAncHgsICcgKyB5MiArICdweCwgJyArIHgxICsgJ3B4KSc7XG4gICAgICAgIHZhciBjZW50ZXIgPSBfdGhpczMuYm94LmdldEFic29sdXRlUG9pbnQoWy41LCAuNV0pO1xuICAgICAgICB2YXIgeFNpZ24gPSBjZW50ZXJbMF0gLSBfdGhpczMuY3JvcHBlckVsLm9mZnNldFdpZHRoIC8gMiA+PiAzMTtcbiAgICAgICAgdmFyIHlTaWduID0gY2VudGVyWzFdIC0gX3RoaXMzLmNyb3BwZXJFbC5vZmZzZXRIZWlnaHQgLyAyID4+IDMxO1xuICAgICAgICB2YXIgcXVhZHJhbnQgPSAoeFNpZ24gXiB5U2lnbikgKyB5U2lnbiArIHlTaWduICsgNDtcbiAgICAgICAgdmFyIGZvcmVncm91bmRIYW5kbGVJbmRleCA9IC0yICogcXVhZHJhbnQgKyA4O1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IF90aGlzMy5oYW5kbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGhhbmRsZSA9IF90aGlzMy5oYW5kbGVzW2ldO1xuICAgICAgICAgIHZhciBoYW5kbGVXaWR0aCA9IGhhbmRsZS5lbC5vZmZzZXRXaWR0aDtcbiAgICAgICAgICB2YXIgaGFuZGxlSGVpZ2h0ID0gaGFuZGxlLmVsLm9mZnNldEhlaWdodDtcbiAgICAgICAgICB2YXIgbGVmdCA9IHgxICsgd2lkdGggKiBoYW5kbGUucG9zaXRpb25bMF0gLSBoYW5kbGVXaWR0aCAvIDI7XG4gICAgICAgICAgdmFyIHRvcCA9IHkxICsgaGVpZ2h0ICogaGFuZGxlLnBvc2l0aW9uWzFdIC0gaGFuZGxlSGVpZ2h0IC8gMjtcbiAgICAgICAgICBoYW5kbGUuZWwuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgnICsgTWF0aC5yb3VuZChsZWZ0KSArICdweCwgJyArIE1hdGgucm91bmQodG9wKSArICdweCknO1xuICAgICAgICAgIGhhbmRsZS5lbC5zdHlsZS56SW5kZXggPSBmb3JlZ3JvdW5kSGFuZGxlSW5kZXggPT0gaSA/IDUgOiA0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdhdHRhY2hIYW5kbGVyRXZlbnRzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXR0YWNoSGFuZGxlckV2ZW50cygpIHtcbiAgICAgIHZhciBldmVudEJ1cyA9IHRoaXMuZXZlbnRCdXM7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVzdGFydCcsIHRoaXMub25IYW5kbGVNb3ZlU3RhcnQuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVtb3ZlJywgdGhpcy5vbkhhbmRsZU1vdmVNb3ZpbmcuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVlbmQnLCB0aGlzLm9uSGFuZGxlTW92ZUVuZC5iaW5kKHRoaXMpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdhdHRhY2hSZWdpb25FdmVudHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhdHRhY2hSZWdpb25FdmVudHMoKSB7XG4gICAgICB2YXIgZXZlbnRCdXMgPSB0aGlzLmV2ZW50QnVzO1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdGhpcy5yZWdpb25FbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25zdGFydCcsIHRoaXMub25SZWdpb25Nb3ZlU3RhcnQuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25tb3ZlJywgdGhpcy5vblJlZ2lvbk1vdmVNb3ZpbmcuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25lbmQnLCB0aGlzLm9uUmVnaW9uTW92ZUVuZC5iaW5kKHRoaXMpKTtcbiAgICAgIGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICAgICAgZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ3JlZ2lvbnN0YXJ0Jywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdyZWdpb25tb3ZlJywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlVXAoZSkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgICAgICBldmVudEJ1cy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgncmVnaW9uZW5kJywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnYXR0YWNoT3ZlcmxheUV2ZW50cycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGF0dGFjaE92ZXJsYXlFdmVudHMoKSB7XG4gICAgICB2YXIgU09VVEhFQVNUX0hBTkRMRV9JRFggPSA0O1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHRtcEJveCA9IG51bGw7XG4gICAgICB0aGlzLm92ZXJsYXlFbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICAgIHZhciBjb250YWluZXIgPSBzZWxmLmNyb3BwZXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdmFyIG1vdXNlWCA9IGUuY2xpZW50WCAtIGNvbnRhaW5lci5sZWZ0O1xuICAgICAgICB2YXIgbW91c2VZID0gZS5jbGllbnRZIC0gY29udGFpbmVyLnRvcDtcbiAgICAgICAgdG1wQm94ID0gc2VsZi5ib3g7XG4gICAgICAgIHNlbGYuYm94ID0gbmV3IEJveChtb3VzZVgsIG1vdXNlWSwgbW91c2VYICsgMSwgbW91c2VZICsgMSk7XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZXN0YXJ0Jywge1xuICAgICAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYuaGFuZGxlc1tTT1VUSEVBU1RfSEFORExFX0lEWF0gfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZW1vdmUnLCB7XG4gICAgICAgICAgZGV0YWlsOiB7IG1vdXNlWDogZS5jbGllbnRYLCBtb3VzZVk6IGUuY2xpZW50WSB9XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIG9uTW91c2VVcChlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICAgIGlmIChzZWxmLmJveC53aWR0aCgpID09PSAxICYmIHNlbGYuYm94LmhlaWdodCgpID09PSAxKSB7XG4gICAgICAgICAgc2VsZi5ib3ggPSB0bXBCb3g7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZWVuZCcsIHtcbiAgICAgICAgICBkZXRhaWw6IHsgbW91c2VYOiBlLmNsaWVudFgsIG1vdXNlWTogZS5jbGllbnRZIH1cbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uSGFuZGxlTW92ZVN0YXJ0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25IYW5kbGVNb3ZlU3RhcnQoZSkge1xuICAgICAgdmFyIGhhbmRsZSA9IGUuZGV0YWlsLmhhbmRsZTtcbiAgICAgIHZhciBvcmlnaW5Qb2ludCA9IFsxIC0gaGFuZGxlLnBvc2l0aW9uWzBdLCAxIC0gaGFuZGxlLnBvc2l0aW9uWzFdXTtcbiAgICAgIHZhciBfYm94JGdldEFic29sdXRlUG9pbnQgPSB0aGlzLmJveC5nZXRBYnNvbHV0ZVBvaW50KG9yaWdpblBvaW50KSxcbiAgICAgICAgICBfYm94JGdldEFic29sdXRlUG9pbnQyID0gc2xpY2VkVG9BcnJheShfYm94JGdldEFic29sdXRlUG9pbnQsIDIpLFxuICAgICAgICAgIG9yaWdpblggPSBfYm94JGdldEFic29sdXRlUG9pbnQyWzBdLFxuICAgICAgICAgIG9yaWdpblkgPSBfYm94JGdldEFic29sdXRlUG9pbnQyWzFdO1xuICAgICAgdGhpcy5hY3RpdmVIYW5kbGUgPSB7IGhhbmRsZTogaGFuZGxlLCBvcmlnaW5Qb2ludDogb3JpZ2luUG9pbnQsIG9yaWdpblg6IG9yaWdpblgsIG9yaWdpblk6IG9yaWdpblkgfTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wU3RhcnQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcFN0YXJ0KHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnb25IYW5kbGVNb3ZlTW92aW5nJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25IYW5kbGVNb3ZlTW92aW5nKGUpIHtcbiAgICAgIHZhciBfZSRkZXRhaWwgPSBlLmRldGFpbCxcbiAgICAgICAgICBtb3VzZVggPSBfZSRkZXRhaWwubW91c2VYLFxuICAgICAgICAgIG1vdXNlWSA9IF9lJGRldGFpbC5tb3VzZVk7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jcm9wcGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBtb3VzZVggPSBtb3VzZVggLSBjb250YWluZXIubGVmdDtcbiAgICAgIG1vdXNlWSA9IG1vdXNlWSAtIGNvbnRhaW5lci50b3A7XG4gICAgICBpZiAobW91c2VYIDwgMCkge1xuICAgICAgICBtb3VzZVggPSAwO1xuICAgICAgfSBlbHNlIGlmIChtb3VzZVggPiBjb250YWluZXIud2lkdGgpIHtcbiAgICAgICAgbW91c2VYID0gY29udGFpbmVyLndpZHRoO1xuICAgICAgfVxuICAgICAgaWYgKG1vdXNlWSA8IDApIHtcbiAgICAgICAgbW91c2VZID0gMDtcbiAgICAgIH0gZWxzZSBpZiAobW91c2VZID4gY29udGFpbmVyLmhlaWdodCkge1xuICAgICAgICBtb3VzZVkgPSBjb250YWluZXIuaGVpZ2h0O1xuICAgICAgfVxuICAgICAgdmFyIG9yaWdpbiA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblBvaW50LnNsaWNlKCk7XG4gICAgICB2YXIgb3JpZ2luWCA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblg7XG4gICAgICB2YXIgb3JpZ2luWSA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblk7XG4gICAgICB2YXIgaGFuZGxlID0gdGhpcy5hY3RpdmVIYW5kbGUuaGFuZGxlO1xuICAgICAgdmFyIFRPUF9NT1ZBQkxFID0gaGFuZGxlLmNvbnN0cmFpbnRzWzBdID09PSAxO1xuICAgICAgdmFyIFJJR0hUX01PVkFCTEUgPSBoYW5kbGUuY29uc3RyYWludHNbMV0gPT09IDE7XG4gICAgICB2YXIgQk9UVE9NX01PVkFCTEUgPSBoYW5kbGUuY29uc3RyYWludHNbMl0gPT09IDE7XG4gICAgICB2YXIgTEVGVF9NT1ZBQkxFID0gaGFuZGxlLmNvbnN0cmFpbnRzWzNdID09PSAxO1xuICAgICAgdmFyIE1VTFRJX0FYSVMgPSAoTEVGVF9NT1ZBQkxFIHx8IFJJR0hUX01PVkFCTEUpICYmIChUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSk7XG4gICAgICB2YXIgeDEgPSBMRUZUX01PVkFCTEUgfHwgUklHSFRfTU9WQUJMRSA/IG9yaWdpblggOiB0aGlzLmJveC54MTtcbiAgICAgIHZhciB4MiA9IExFRlRfTU9WQUJMRSB8fCBSSUdIVF9NT1ZBQkxFID8gb3JpZ2luWCA6IHRoaXMuYm94LngyO1xuICAgICAgdmFyIHkxID0gVE9QX01PVkFCTEUgfHwgQk9UVE9NX01PVkFCTEUgPyBvcmlnaW5ZIDogdGhpcy5ib3gueTE7XG4gICAgICB2YXIgeTIgPSBUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSA/IG9yaWdpblkgOiB0aGlzLmJveC55MjtcbiAgICAgIHgxID0gTEVGVF9NT1ZBQkxFID8gbW91c2VYIDogeDE7XG4gICAgICB4MiA9IFJJR0hUX01PVkFCTEUgPyBtb3VzZVggOiB4MjtcbiAgICAgIHkxID0gVE9QX01PVkFCTEUgPyBtb3VzZVkgOiB5MTtcbiAgICAgIHkyID0gQk9UVE9NX01PVkFCTEUgPyBtb3VzZVkgOiB5MjtcbiAgICAgIHZhciBpc0ZsaXBwZWRYID0gZmFsc2UsXG4gICAgICAgICAgaXNGbGlwcGVkWSA9IGZhbHNlO1xuICAgICAgaWYgKExFRlRfTU9WQUJMRSB8fCBSSUdIVF9NT1ZBQkxFKSB7XG4gICAgICAgIGlzRmxpcHBlZFggPSBMRUZUX01PVkFCTEUgPyBtb3VzZVggPiBvcmlnaW5YIDogbW91c2VYIDwgb3JpZ2luWDtcbiAgICAgIH1cbiAgICAgIGlmIChUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSkge1xuICAgICAgICBpc0ZsaXBwZWRZID0gVE9QX01PVkFCTEUgPyBtb3VzZVkgPiBvcmlnaW5ZIDogbW91c2VZIDwgb3JpZ2luWTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0ZsaXBwZWRYKSB7XG4gICAgICAgIHZhciB0bXAgPSB4MTt4MSA9IHgyO3gyID0gdG1wO1xuICAgICAgICBvcmlnaW5bMF0gPSAxIC0gb3JpZ2luWzBdO1xuICAgICAgfVxuICAgICAgaWYgKGlzRmxpcHBlZFkpIHtcbiAgICAgICAgdmFyIF90bXAgPSB5MTt5MSA9IHkyO3kyID0gX3RtcDtcbiAgICAgICAgb3JpZ2luWzFdID0gMSAtIG9yaWdpblsxXTtcbiAgICAgIH1cbiAgICAgIHZhciBib3ggPSBuZXcgQm94KHgxLCB5MSwgeDIsIHkyKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXNwZWN0UmF0aW8pIHtcbiAgICAgICAgdmFyIHJhdGlvID0gdGhpcy5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgICB2YXIgaXNWZXJ0aWNhbE1vdmVtZW50ID0gZmFsc2U7XG4gICAgICAgIGlmIChNVUxUSV9BWElTKSB7XG4gICAgICAgICAgaXNWZXJ0aWNhbE1vdmVtZW50ID0gbW91c2VZID4gYm94LnkxICsgcmF0aW8gKiBib3gud2lkdGgoKSB8fCBtb3VzZVkgPCBib3gueTIgLSByYXRpbyAqIGJveC53aWR0aCgpO1xuICAgICAgICB9IGVsc2UgaWYgKFRPUF9NT1ZBQkxFIHx8IEJPVFRPTV9NT1ZBQkxFKSB7XG4gICAgICAgICAgaXNWZXJ0aWNhbE1vdmVtZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmF0aW9Nb2RlID0gaXNWZXJ0aWNhbE1vdmVtZW50ID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgICAgICBib3guY29uc3RyYWluVG9SYXRpbyhyYXRpbywgb3JpZ2luLCByYXRpb01vZGUpO1xuICAgICAgfVxuICAgICAgdmFyIG1pbiA9IHRoaXMub3B0aW9ucy5taW5TaXplO1xuICAgICAgdmFyIG1heCA9IHRoaXMub3B0aW9ucy5tYXhTaXplO1xuICAgICAgYm94LmNvbnN0cmFpblRvU2l6ZShtYXgud2lkdGgsIG1heC5oZWlnaHQsIG1pbi53aWR0aCwgbWluLmhlaWdodCwgb3JpZ2luLCB0aGlzLm9wdGlvbnMuYXNwZWN0UmF0aW8pO1xuICAgICAgdmFyIHBhcmVudFdpZHRoID0gdGhpcy5jcm9wcGVyRWwub2Zmc2V0V2lkdGg7XG4gICAgICB2YXIgcGFyZW50SGVpZ2h0ID0gdGhpcy5jcm9wcGVyRWwub2Zmc2V0SGVpZ2h0O1xuICAgICAgYm94LmNvbnN0cmFpblRvQm91bmRhcnkocGFyZW50V2lkdGgsIHBhcmVudEhlaWdodCwgb3JpZ2luKTtcbiAgICAgIHRoaXMuYm94ID0gYm94O1xuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wTW92ZSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wTW92ZSh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uSGFuZGxlTW92ZUVuZCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uSGFuZGxlTW92ZUVuZChlKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnb25SZWdpb25Nb3ZlU3RhcnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVTdGFydChlKSB7XG4gICAgICB2YXIgX2UkZGV0YWlsMiA9IGUuZGV0YWlsLFxuICAgICAgICAgIG1vdXNlWCA9IF9lJGRldGFpbDIubW91c2VYLFxuICAgICAgICAgIG1vdXNlWSA9IF9lJGRldGFpbDIubW91c2VZO1xuICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY3JvcHBlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgbW91c2VYID0gbW91c2VYIC0gY29udGFpbmVyLmxlZnQ7XG4gICAgICBtb3VzZVkgPSBtb3VzZVkgLSBjb250YWluZXIudG9wO1xuICAgICAgdGhpcy5jdXJyZW50TW92ZSA9IHtcbiAgICAgICAgb2Zmc2V0WDogbW91c2VYIC0gdGhpcy5ib3gueDEsXG4gICAgICAgIG9mZnNldFk6IG1vdXNlWSAtIHRoaXMuYm94LnkxXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BTdGFydCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wU3RhcnQodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvblJlZ2lvbk1vdmVNb3ZpbmcnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVNb3ZpbmcoZSkge1xuICAgICAgdmFyIF9lJGRldGFpbDMgPSBlLmRldGFpbCxcbiAgICAgICAgICBtb3VzZVggPSBfZSRkZXRhaWwzLm1vdXNlWCxcbiAgICAgICAgICBtb3VzZVkgPSBfZSRkZXRhaWwzLm1vdXNlWTtcbiAgICAgIHZhciBfY3VycmVudE1vdmUgPSB0aGlzLmN1cnJlbnRNb3ZlLFxuICAgICAgICAgIG9mZnNldFggPSBfY3VycmVudE1vdmUub2Zmc2V0WCxcbiAgICAgICAgICBvZmZzZXRZID0gX2N1cnJlbnRNb3ZlLm9mZnNldFk7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jcm9wcGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBtb3VzZVggPSBtb3VzZVggLSBjb250YWluZXIubGVmdDtcbiAgICAgIG1vdXNlWSA9IG1vdXNlWSAtIGNvbnRhaW5lci50b3A7XG4gICAgICB0aGlzLmJveC5tb3ZlKG1vdXNlWCAtIG9mZnNldFgsIG1vdXNlWSAtIG9mZnNldFkpO1xuICAgICAgaWYgKHRoaXMuYm94LngxIDwgMCkge1xuICAgICAgICB0aGlzLmJveC5tb3ZlKDAsIG51bGwpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYm94LngyID4gY29udGFpbmVyLndpZHRoKSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUoY29udGFpbmVyLndpZHRoIC0gdGhpcy5ib3gud2lkdGgoKSwgbnVsbCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ib3gueTEgPCAwKSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUobnVsbCwgMCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ib3gueTIgPiBjb250YWluZXIuaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUobnVsbCwgY29udGFpbmVyLmhlaWdodCAtIHRoaXMuYm94LmhlaWdodCgpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcE1vdmUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcE1vdmUodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvblJlZ2lvbk1vdmVFbmQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVFbmQoZSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BFbmQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcEVuZCh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWUoKSB7XG4gICAgICB2YXIgbW9kZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbnVsbDtcbiAgICAgIGlmIChtb2RlID09PSBudWxsKSB7XG4gICAgICAgIG1vZGUgPSB0aGlzLm9wdGlvbnMucmV0dXJuTW9kZTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2RlID09ICdyZWFsJykge1xuICAgICAgICB2YXIgYWN0dWFsV2lkdGggPSB0aGlzLmltYWdlRWwubmF0dXJhbFdpZHRoO1xuICAgICAgICB2YXIgYWN0dWFsSGVpZ2h0ID0gdGhpcy5pbWFnZUVsLm5hdHVyYWxIZWlnaHQ7XG4gICAgICAgIHZhciBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MgPSB0aGlzLmltYWdlRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICBlbGVtZW50V2lkdGggPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0Mud2lkdGgsXG4gICAgICAgICAgICBlbGVtZW50SGVpZ2h0ID0gX2ltYWdlRWwkZ2V0Qm91bmRpbmdDLmhlaWdodDtcbiAgICAgICAgdmFyIGZhY3RvclggPSBhY3R1YWxXaWR0aCAvIGVsZW1lbnRXaWR0aDtcbiAgICAgICAgdmFyIGZhY3RvclkgPSBhY3R1YWxIZWlnaHQgLyBlbGVtZW50SGVpZ2h0O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IE1hdGgucm91bmQodGhpcy5ib3gueDEgKiBmYWN0b3JYKSxcbiAgICAgICAgICB5OiBNYXRoLnJvdW5kKHRoaXMuYm94LnkxICogZmFjdG9yWSksXG4gICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQodGhpcy5ib3gud2lkdGgoKSAqIGZhY3RvclgpLFxuICAgICAgICAgIGhlaWdodDogTWF0aC5yb3VuZCh0aGlzLmJveC5oZWlnaHQoKSAqIGZhY3RvclkpXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gJ3JhdGlvJykge1xuICAgICAgICB2YXIgX2ltYWdlRWwkZ2V0Qm91bmRpbmdDMiA9IHRoaXMuaW1hZ2VFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgICAgIF9lbGVtZW50V2lkdGggPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MyLndpZHRoLFxuICAgICAgICAgICAgX2VsZW1lbnRIZWlnaHQgPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MyLmhlaWdodDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiByb3VuZCh0aGlzLmJveC54MSAvIF9lbGVtZW50V2lkdGgsIDMpLFxuICAgICAgICAgIHk6IHJvdW5kKHRoaXMuYm94LnkxIC8gX2VsZW1lbnRIZWlnaHQsIDMpLFxuICAgICAgICAgIHdpZHRoOiByb3VuZCh0aGlzLmJveC53aWR0aCgpIC8gX2VsZW1lbnRXaWR0aCwgMyksXG4gICAgICAgICAgaGVpZ2h0OiByb3VuZCh0aGlzLmJveC5oZWlnaHQoKSAvIF9lbGVtZW50SGVpZ2h0LCAzKVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChtb2RlID09ICdyYXcnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogTWF0aC5yb3VuZCh0aGlzLmJveC54MSksXG4gICAgICAgICAgeTogTWF0aC5yb3VuZCh0aGlzLmJveC55MSksXG4gICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQodGhpcy5ib3gud2lkdGgoKSksXG4gICAgICAgICAgaGVpZ2h0OiBNYXRoLnJvdW5kKHRoaXMuYm94LmhlaWdodCgpKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiAncGFyc2VPcHRpb25zJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VPcHRpb25zKG9wdHMpIHtcbiAgICAgIHZhciBkZWZhdWx0cyQkMSA9IHtcbiAgICAgICAgYXNwZWN0UmF0aW86IG51bGwsXG4gICAgICAgIG1heFNpemU6IHsgd2lkdGg6IG51bGwsIGhlaWdodDogbnVsbCB9LFxuICAgICAgICBtaW5TaXplOiB7IHdpZHRoOiBudWxsLCBoZWlnaHQ6IG51bGwgfSxcbiAgICAgICAgc3RhcnRTaXplOiB7IHdpZHRoOiAxMDAsIGhlaWdodDogMTAwLCB1bml0OiAnJScgfSxcbiAgICAgICAgcmV0dXJuTW9kZTogJ3JlYWwnLFxuICAgICAgICBvbkluaXRpYWxpemU6IG51bGwsXG4gICAgICAgIG9uQ3JvcFN0YXJ0OiBudWxsLFxuICAgICAgICBvbkNyb3BNb3ZlOiBudWxsLFxuICAgICAgICBvbkNyb3BFbmQ6IG51bGxcbiAgICAgIH07XG4gICAgICB2YXIgYXNwZWN0UmF0aW8gPSBudWxsO1xuICAgICAgaWYgKG9wdHMuYXNwZWN0UmF0aW8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMuYXNwZWN0UmF0aW8gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgYXNwZWN0UmF0aW8gPSBvcHRzLmFzcGVjdFJhdGlvO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdHMuYXNwZWN0UmF0aW8gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIGFzcGVjdFJhdGlvID0gb3B0cy5hc3BlY3RSYXRpb1sxXSAvIG9wdHMuYXNwZWN0UmF0aW9bMF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBtYXhTaXplID0gbnVsbDtcbiAgICAgIGlmIChvcHRzLm1heFNpemUgIT09IHVuZGVmaW5lZCAmJiBvcHRzLm1heFNpemUgIT09IG51bGwpIHtcbiAgICAgICAgbWF4U2l6ZSA9IHtcbiAgICAgICAgICB3aWR0aDogb3B0cy5tYXhTaXplWzBdIHx8IG51bGwsXG4gICAgICAgICAgaGVpZ2h0OiBvcHRzLm1heFNpemVbMV0gfHwgbnVsbCxcbiAgICAgICAgICB1bml0OiBvcHRzLm1heFNpemVbMl0gfHwgJ3B4J1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdmFyIG1pblNpemUgPSBudWxsO1xuICAgICAgaWYgKG9wdHMubWluU2l6ZSAhPT0gdW5kZWZpbmVkICYmIG9wdHMubWluU2l6ZSAhPT0gbnVsbCkge1xuICAgICAgICBtaW5TaXplID0ge1xuICAgICAgICAgIHdpZHRoOiBvcHRzLm1pblNpemVbMF0gfHwgbnVsbCxcbiAgICAgICAgICBoZWlnaHQ6IG9wdHMubWluU2l6ZVsxXSB8fCBudWxsLFxuICAgICAgICAgIHVuaXQ6IG9wdHMubWluU2l6ZVsyXSB8fCAncHgnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YXIgc3RhcnRTaXplID0gbnVsbDtcbiAgICAgIGlmIChvcHRzLnN0YXJ0U2l6ZSAhPT0gdW5kZWZpbmVkICYmIG9wdHMuc3RhcnRTaXplICE9PSBudWxsKSB7XG4gICAgICAgIHN0YXJ0U2l6ZSA9IHtcbiAgICAgICAgICB3aWR0aDogb3B0cy5zdGFydFNpemVbMF0gfHwgbnVsbCxcbiAgICAgICAgICBoZWlnaHQ6IG9wdHMuc3RhcnRTaXplWzFdIHx8IG51bGwsXG4gICAgICAgICAgdW5pdDogb3B0cy5zdGFydFNpemVbMl0gfHwgJyUnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YXIgb25Jbml0aWFsaXplID0gbnVsbDtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5vbkluaXRpYWxpemUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb25Jbml0aWFsaXplID0gb3B0cy5vbkluaXRpYWxpemU7XG4gICAgICB9XG4gICAgICB2YXIgb25Dcm9wU3RhcnQgPSBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uQ3JvcFN0YXJ0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9uQ3JvcFN0YXJ0ID0gb3B0cy5vbkNyb3BTdGFydDtcbiAgICAgIH1cbiAgICAgIHZhciBvbkNyb3BFbmQgPSBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uQ3JvcEVuZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvbkNyb3BFbmQgPSBvcHRzLm9uQ3JvcEVuZDtcbiAgICAgIH1cbiAgICAgIHZhciBvbkNyb3BNb3ZlID0gbnVsbDtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5vblVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0Nyb3Bwci5qczogYG9uVXBkYXRlYCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS4gUGxlYXNlIHVzZSBgb25Dcm9wTW92ZWAgb3IgYG9uQ3JvcEVuZGAgaW5zdGVhZC4nKTtcbiAgICAgICAgb25Dcm9wTW92ZSA9IG9wdHMub25VcGRhdGU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG9wdHMub25Dcm9wTW92ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvbkNyb3BNb3ZlID0gb3B0cy5vbkNyb3BNb3ZlO1xuICAgICAgfVxuICAgICAgdmFyIHJldHVybk1vZGUgPSBudWxsO1xuICAgICAgaWYgKG9wdHMucmV0dXJuTW9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBzID0gb3B0cy5yZXR1cm5Nb2RlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChbJ3JlYWwnLCAncmF0aW8nLCAncmF3J10uaW5kZXhPZihzKSA9PT0gLTEpIHtcbiAgICAgICAgICB0aHJvdyBcIkludmFsaWQgcmV0dXJuIG1vZGUuXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuTW9kZSA9IHM7XG4gICAgICB9XG4gICAgICB2YXIgY29udmVydFRvUGl4ZWxzID0gZnVuY3Rpb24gY29udmVydFRvUGl4ZWxzKGNvbnRhaW5lcikge1xuICAgICAgICB2YXIgd2lkdGggPSBjb250YWluZXIub2Zmc2V0V2lkdGg7XG4gICAgICAgIHZhciBoZWlnaHQgPSBjb250YWluZXIub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB2YXIgc2l6ZUtleXMgPSBbJ21heFNpemUnLCAnbWluU2l6ZScsICdzdGFydFNpemUnXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBrZXkgPSBzaXplS2V5c1tpXTtcbiAgICAgICAgICBpZiAodGhpc1trZXldICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGhpc1trZXldLnVuaXQgPT0gJyUnKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzW2tleV0ud2lkdGggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzW2tleV0ud2lkdGggPSB0aGlzW2tleV0ud2lkdGggLyAxMDAgKiB3aWR0aDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodGhpc1trZXldLmhlaWdodCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXNba2V5XS5oZWlnaHQgPSB0aGlzW2tleV0uaGVpZ2h0IC8gMTAwICogaGVpZ2h0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgdGhpc1trZXldLnVuaXQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IGZ1bmN0aW9uIGRlZmF1bHRWYWx1ZSh2LCBkKSB7XG4gICAgICAgIHJldHVybiB2ICE9PSBudWxsID8gdiA6IGQ7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXNwZWN0UmF0aW86IGRlZmF1bHRWYWx1ZShhc3BlY3RSYXRpbywgZGVmYXVsdHMkJDEuYXNwZWN0UmF0aW8pLFxuICAgICAgICBtYXhTaXplOiBkZWZhdWx0VmFsdWUobWF4U2l6ZSwgZGVmYXVsdHMkJDEubWF4U2l6ZSksXG4gICAgICAgIG1pblNpemU6IGRlZmF1bHRWYWx1ZShtaW5TaXplLCBkZWZhdWx0cyQkMS5taW5TaXplKSxcbiAgICAgICAgc3RhcnRTaXplOiBkZWZhdWx0VmFsdWUoc3RhcnRTaXplLCBkZWZhdWx0cyQkMS5zdGFydFNpemUpLFxuICAgICAgICByZXR1cm5Nb2RlOiBkZWZhdWx0VmFsdWUocmV0dXJuTW9kZSwgZGVmYXVsdHMkJDEucmV0dXJuTW9kZSksXG4gICAgICAgIG9uSW5pdGlhbGl6ZTogZGVmYXVsdFZhbHVlKG9uSW5pdGlhbGl6ZSwgZGVmYXVsdHMkJDEub25Jbml0aWFsaXplKSxcbiAgICAgICAgb25Dcm9wU3RhcnQ6IGRlZmF1bHRWYWx1ZShvbkNyb3BTdGFydCwgZGVmYXVsdHMkJDEub25Dcm9wU3RhcnQpLFxuICAgICAgICBvbkNyb3BNb3ZlOiBkZWZhdWx0VmFsdWUob25Dcm9wTW92ZSwgZGVmYXVsdHMkJDEub25Dcm9wTW92ZSksXG4gICAgICAgIG9uQ3JvcEVuZDogZGVmYXVsdFZhbHVlKG9uQ3JvcEVuZCwgZGVmYXVsdHMkJDEub25Dcm9wRW5kKSxcbiAgICAgICAgY29udmVydFRvUGl4ZWxzOiBjb252ZXJ0VG9QaXhlbHNcbiAgICAgIH07XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBDcm9wcHJDb3JlO1xufSgpO1xuZnVuY3Rpb24gcm91bmQodmFsdWUsIGRlY2ltYWxzKSB7XG4gIHJldHVybiBOdW1iZXIoTWF0aC5yb3VuZCh2YWx1ZSArICdlJyArIGRlY2ltYWxzKSArICdlLScgKyBkZWNpbWFscyk7XG59XG5cbnZhciBDcm9wcHIkMSA9IGZ1bmN0aW9uIChfQ3JvcHByQ29yZSkge1xuICBpbmhlcml0cyhDcm9wcHIsIF9Dcm9wcHJDb3JlKTtcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBDYWxscyB0aGUgQ3JvcHByQ29yZSdzIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgZnVuY3Rpb24gQ3JvcHByKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB2YXIgX2RlZmVycmVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDcm9wcHIpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChDcm9wcHIuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihDcm9wcHIpKS5jYWxsKHRoaXMsIGVsZW1lbnQsIG9wdGlvbnMsIF9kZWZlcnJlZCkpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY3JvcCByZWdpb24uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbbW9kZV0gV2hpY2ggbW9kZSBvZiBjYWxjdWxhdGlvbiB0byB1c2U6ICdyZWFsJywgJ3JhdGlvJyBvclxuICAgKiAgICAgICdyYXcnLlxuICAgKi9cbiAgY3JlYXRlQ2xhc3MoQ3JvcHByLCBbe1xuICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWUobW9kZSkge1xuICAgICAgcmV0dXJuIGdldChDcm9wcHIucHJvdG90eXBlLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ3JvcHByLnByb3RvdHlwZSksICdnZXRWYWx1ZScsIHRoaXMpLmNhbGwodGhpcywgbW9kZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIGltYWdlIHNyYy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3JjXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdzZXRJbWFnZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEltYWdlKHNyYykge1xuICAgICAgcmV0dXJuIGdldChDcm9wcHIucHJvdG90eXBlLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ3JvcHByLnByb3RvdHlwZSksICdzZXRJbWFnZScsIHRoaXMpLmNhbGwodGhpcywgc3JjKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdkZXN0cm95JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHJldHVybiBnZXQoQ3JvcHByLnByb3RvdHlwZS5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKENyb3Bwci5wcm90b3R5cGUpLCAnZGVzdHJveScsIHRoaXMpLmNhbGwodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1vdmVzIHRoZSBjcm9wIHJlZ2lvbiB0byBhIHNwZWNpZmllZCBjb29yZGluYXRlLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ21vdmVUbycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1vdmVUbyh4LCB5KSB7XG4gICAgICB0aGlzLmJveC5tb3ZlKHgsIHkpO1xuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wRW5kICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5vbkNyb3BFbmQodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNpemVzIHRoZSBjcm9wIHJlZ2lvbiB0byBhIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0LlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHRcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBvcmlnaW4gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgIERlZmF1bHRzIHRvIFswLjUsIDAuNV0gKGNlbnRlcikuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdyZXNpemVUbycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2l6ZVRvKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IFsuNSwgLjVdO1xuICAgICAgdGhpcy5ib3gucmVzaXplKHdpZHRoLCBoZWlnaHQsIG9yaWdpbik7XG4gICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BFbmQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcEVuZCh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNjYWxlIHRoZSBjcm9wIHJlZ2lvbiBieSBhIGZhY3Rvci5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZmFjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gb3JpZ2luIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgICBEZWZhdWx0cyB0byBbMC41LCAwLjVdIChjZW50ZXIpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnc2NhbGVCeScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNjYWxlQnkoZmFjdG9yKSB7XG4gICAgICB2YXIgb3JpZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBbLjUsIC41XTtcbiAgICAgIHRoaXMuYm94LnNjYWxlKGZhY3Rvciwgb3JpZ2luKTtcbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdyZXNldCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgdGhpcy5ib3ggPSB0aGlzLmluaXRpYWxpemVCb3godGhpcy5vcHRpb25zKTtcbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIENyb3Bwcjtcbn0oQ3JvcHByQ29yZSk7XG5cbnJldHVybiBDcm9wcHIkMTtcblxufSkpKTtcbiIsICJleHBvcnQgZW51bSBMaWNlbmNlU3RhdHVzIHtcclxuICBJbnZhbGlkLFxyXG4gIFZhbGlkLFxyXG4gIEV4cGlyZVNvb24sXHJcbiAgRXhwaXJlZFxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElMaWNlbmNlIHtcclxuICByZWFkb25seSBTdGF0dXM/OiBMaWNlbmNlU3RhdHVzO1xyXG4gIHJlYWRvbmx5IE5hbWU6IHN0cmluZztcclxuICByZWFkb25seSBPd25lcjogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IEV4cGlyYXRpb25EYXRlOiBEYXRlIHwgc3RyaW5nO1xyXG4gIHJlYWRvbmx5IEFwcGxpY2F0aW9uczogUmVhZG9ubHlBcnJheTxzdHJpbmc+O1xyXG4gIHJlYWRvbmx5IFNvdXJjZUNvbnRlbnQ6IHN0cmluZztcclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGVudW0gTWVudUl0ZW1UeXBlIHtcclxuICBHcmlkVmlldyA9IDAsXHJcbiAgRGFzaGJvYXJkID0gMSxcclxuICBNZW51Tm9kZSA9IDIsXHJcbiAgUmVwb3J0ID0gMyxcclxuICBEaWFncmFtID0gNCxcclxuICBDRE0gPSA1LFxyXG4gIFNsaWRlc2hvdyA9IDYsXHJcbiAgR2FudHRDaGFydCA9IDdcclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbm90aWZ5KG1zZzogc3RyaW5nLCBzdWNjZWVkOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gIGNvbnN0IHN0YXR1cyA9IHN1Y2NlZWQgPyAnc3VjY2VzcycgOiAnZXJyb3InO1xyXG4gIGNvbnN0IGRpc3BsYXlUaW1lID0gc3VjY2VlZCA/IDIwMDAgOiA0MDAwO1xyXG5cclxuICBEZXZFeHByZXNzLnVpLm5vdGlmeSh7XHJcbiAgICBtZXNzYWdlOiBtc2csXHJcbiAgICB0eXBlOiBzdGF0dXMsXHJcbiAgICBvblNob3dpbmc6IChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1lc3NhZ2VFbGVtZW50ID0gZS5lbGVtZW50LmZpbmQoJy5keC10b2FzdC1tZXNzYWdlJyk7XHJcbiAgICAgIG1lc3NhZ2VFbGVtZW50Lmh0bWwoKG1lc3NhZ2VFbGVtZW50Lmh0bWwoKSB8fCAnJykucmVwbGFjZSgnXFxcXG4nLCAnPGJyIC8+JykpO1xyXG4gICAgfVxyXG4gIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvYXN0T3B0aW9ucywgc3RhdHVzLCBkaXNwbGF5VGltZSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcclxuXHJcbmV4cG9ydCBjb25zdCBpc0Vycm9ySW5mbyA9IChcclxuICByZXNwb25zZURhdGE6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBJRXJyb3JJbmZvIHwgSUVycm9ySW5mb1tdIHwgdW5kZWZpbmVkIHwgbnVsbFxyXG4pOiByZXNwb25zZURhdGEgaXMgSUVycm9ySW5mbyB8IElFcnJvckluZm9bXSA9PiB7XHJcbiAgaWYgKCFyZXNwb25zZURhdGEpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHJlc3BvbnNlRGF0YSlcclxuICAgID8gKHJlc3BvbnNlRGF0YVswXS5TdGFja1RyYWNlICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2VEYXRhWzBdLkVycm9yICE9PSB1bmRlZmluZWQpXHJcbiAgICA6IChyZXNwb25zZURhdGEuRXJyb3IgIT09IHVuZGVmaW5lZCk7XHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElFcnJvckluZm8ge1xyXG4gIEVycm9yOiBzdHJpbmc7XHJcbiAgU3RhY2tUcmFjZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElBcGlSZXNwb25zZTxUPiB7XHJcbiAgRGF0YTogVCB8IElFcnJvckluZm8gfCBJRXJyb3JJbmZvW10gfCB1bmRlZmluZWQ7XHJcbiAgTWVzc2FnZTogc3RyaW5nO1xyXG4gIFJlcXVlc3RTdGF0ZTogUmVxdWVzdFN0YXRlO1xyXG4gIFN0YXR1c0NvZGU6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTG9va3VwRHRvPFQ+IHtcclxuICBWYWx1ZTogVDtcclxuICBUZXh0OiBzdHJpbmc7XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBlbnVtIFJlcXVlc3RTdGF0ZSB7XHJcbiAgQ29tcGxldGVkID0gMSxcclxuICBFcnJvcmVkID0gMlxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBDU1NfQ0xBU1NFUyB9IGZyb20gJy4uL1N0eWxpbmcvSW5kZXgnO1xyXG5cclxuY29uc3QgUE9QVVBfQ09OVEVOVF9DTEFTUyA9ICdwb3B1cC1jb250ZW50JztcclxuY29uc3QgUE9QVVBfRk9PVEVSX0NMQVNTID0gJ3BvcHVwLWZvb3Rlcic7XHJcbmNvbnN0IEJVVFRPTlNfQ0xBU1MgPSAnYnV0dG9ucyc7XHJcbmNvbnN0IE9LX0JUTl9DTEFTUyA9ICdvay1idG4nO1xyXG5jb25zdCBDQU5DRUxfQlROX0NMQVNTID0gJ2NhbmNlbC1idG4nO1xyXG5cclxuaW50ZXJmYWNlIElQb3B1cCB7XHJcbiAgc2hvdzogKCkgPT4gdm9pZDtcclxuICBoaWRlOiAoKSA9PiB2b2lkO1xyXG4gIHJlbW92ZTogKCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUG9wdXBCdXR0b25PcHRpb25zIHtcclxuICB0ZXh0OiBzdHJpbmc7XHJcbiAgaWNvbj86IHN0cmluZztcclxuICBkaXNhYmxlZD86IGJvb2xlYW47XHJcbiAgb25DbGljazogKGNsb3NlUG9wdXApID0+IHZvaWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUxheW91dCgkY29udGFpbmVyLCBjb250ZW50Q2xhc3NOYW1lPykge1xyXG4gIHJldHVybiB7XHJcbiAgICAkY29udGVudDogJCgnPGRpdiAvPicpLmFkZENsYXNzKFBPUFVQX0NPTlRFTlRfQ0xBU1MpLmFkZENsYXNzKGNvbnRlbnRDbGFzc05hbWUpLmFwcGVuZFRvKCRjb250YWluZXIpLFxyXG4gICAgJGZvb3RlcjogJCgnPGRpdiAvPicpLmFkZENsYXNzKFBPUFVQX0ZPT1RFUl9DTEFTUykuYXBwZW5kVG8oJGNvbnRhaW5lcilcclxuICB9O1xyXG59XHJcblxyXG5jb25zdCBzaG93blBvcHVwcyA9IFtdO1xyXG5cclxuZnVuY3Rpb24gY3JlYXRlUG9wdXAoJGVsOiBKUXVlcnksIGR4UG9wdXBPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuUHJvcGVydGllcywgdXNlS2V5UHJlc3NCZWhhdmlvcjogYm9vbGVhbiA9IGZhbHNlKTogSVBvcHVwIHtcclxuICBjb25zdCBzYXZlZE9uU2hvd2luZyA9IGR4UG9wdXBPcHRpb25zLm9uU2hvd2luZztcclxuXHJcbiAgZHhQb3B1cE9wdGlvbnMub25TaG93biA9IChlKSA9PiB7XHJcbiAgICBpZiAoc2F2ZWRPblNob3dpbmcpIHtcclxuICAgICAgc2F2ZWRPblNob3dpbmcoZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYWxsSW5wdXRzID0gcG9wdXAuY29udGVudCgpLmZpbmQoJ2lucHV0W3R5cGU9dGV4dF0nKTtcclxuICAgIGNvbnN0IGZpcnN0SW5wdXQgPSBhbGxJbnB1dHMuZXEoMCk7XHJcblxyXG4gICAgZmlyc3RJbnB1dC5mb2N1cygpO1xyXG5cclxuICAgIGNvbnN0IGtleUhhbmRsZXJzID0ge1xyXG4gICAgICBrZXlkb3duOiAoZXY6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChzaG93blBvcHVwc1tzaG93blBvcHVwcy5sZW5ndGggLSAxXSAhPT0gcG9wdXApIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChldi5rZXlDb2RlID09PSAxMykge1xyXG4gICAgICAgICAgJChldi5jdXJyZW50VGFyZ2V0KS50cmlnZ2VyKCdjaGFuZ2UnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG9uS2V5RG93bihldik7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgaWYgKHVzZUtleVByZXNzQmVoYXZpb3IpIHtcclxuICAgICAgYWxsSW5wdXRzLm9uKGtleUhhbmRsZXJzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZpcnN0SW5wdXQub24oa2V5SGFuZGxlcnMpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XHJcbiAgICBpZiAoZS5rZXlDb2RlID09PSAxMykge1xyXG4gICAgICBwb3B1cC5jb250ZW50KCkuZmluZChgLiR7Q1NTX0NMQVNTRVMuZHhCdXR0b259LiR7T0tfQlROX0NMQVNTfWApLmNsaWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gMjcpIHtcclxuICAgICAgcG9wdXAuY29udGVudCgpLmZpbmQoYC4ke0NTU19DTEFTU0VTLmR4QnV0dG9ufS4ke0NBTkNFTF9CVE5fQ0xBU1N9YCkuY2xpY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IHBvcHVwID0gJGVsXHJcbiAgICAuZHhQb3B1cChkeFBvcHVwT3B0aW9ucylcclxuICAgIC5keFBvcHVwKCdpbnN0YW5jZScpO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc2hvdzogKCkgPT4ge1xyXG4gICAgICBwb3B1cC5zaG93KCk7XHJcbiAgICAgICQoZG9jdW1lbnQpLm9uKHsga2V5ZG93bjogb25LZXlEb3duIH0pO1xyXG4gICAgICBzaG93blBvcHVwcy5wdXNoKHBvcHVwKTtcclxuICAgIH0sXHJcbiAgICBoaWRlOiAoKSA9PiB7XHJcbiAgICAgICQoZG9jdW1lbnQpLm9mZih7IGtleWRvd246IG9uS2V5RG93biB9KTtcclxuICAgICAgcG9wdXAuaGlkZSgpO1xyXG4gICAgICBzaG93blBvcHVwcy5wb3AoKTtcclxuICAgIH0sXHJcbiAgICByZW1vdmU6ICgpID0+ICRlbC5yZW1vdmUoKVxyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCdXR0b25zKFxyXG4gIG9rT3B0aW9uczogRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnMsXHJcbiAgY2FuY2VsT3B0aW9uczogRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuKSB7XHJcbiAgY29uc3QgJHRhYmxlID0gJCgnPHRhYmxlIC8+JykuYWRkQ2xhc3MoQlVUVE9OU19DTEFTUyk7XHJcbiAgY29uc3QgJHRyID0gJCgnPHRyPicpLmFwcGVuZFRvKCR0YWJsZSk7XHJcblxyXG4gIGlmIChva09wdGlvbnMpIHtcclxuICAgICQoJzx0ZCAvPicpXHJcbiAgICAgIC5hdHRyKCd3aWR0aCcsICc1MCUnKVxyXG4gICAgICAuYXBwZW5kKCQoJzxkaXYgLz4nKS5hZGRDbGFzcyhDU1NfQ0xBU1NFUy5keEJ1dHRvbikuYWRkQ2xhc3MoT0tfQlROX0NMQVNTKS5keEJ1dHRvbihva09wdGlvbnMpKVxyXG4gICAgICAuYXBwZW5kVG8oJHRyKTtcclxuICB9XHJcblxyXG4gIGlmIChjYW5jZWxPcHRpb25zKSB7XHJcbiAgICAkKCc8dGQgLz4nKVxyXG4gICAgICAuYXR0cignd2lkdGgnLCAnNTAlJylcclxuICAgICAgLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoQ1NTX0NMQVNTRVMuZHhCdXR0b24pLmFkZENsYXNzKENBTkNFTF9CVE5fQ0xBU1MpLmR4QnV0dG9uKGNhbmNlbE9wdGlvbnMpKVxyXG4gICAgICAuYXBwZW5kVG8oJHRyKTtcclxuICB9XHJcblxyXG4gIHJldHVybiAkdGFibGU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJdGVtKGxhYmVsOiBzdHJpbmcsICR2YWx1ZTogSlF1ZXJ5KSB7XHJcbiAgcmV0dXJuICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnaXRlbScpXHJcbiAgICAuYXBwZW5kKFxyXG4gICAgICAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2Zvcm0tbGFiZWwnKS50ZXh0KGxhYmVsKSxcclxuICAgICAgJCgnPGRpdiAvPicpLmFkZENsYXNzKCd2YWx1ZScpLmFwcGVuZCgkdmFsdWUpXHJcbiAgICApO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElQb3B1cE9wdGlvbnMge1xyXG4gIHVzZUtleVByZXNzQmVoYXZpb3I6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEaWFsb2coXHJcbiAgb3B0aW9uczogRGV2RXhwcmVzcy51aS5keFBvcHVwLlByb3BlcnRpZXMsXHJcbiAgJHBvcHVwQ29udGVudDogSlF1ZXJ5LFxyXG4gIG9rQnRuT3B0aW9ucz86IElQb3B1cEJ1dHRvbk9wdGlvbnMsXHJcbiAgY2FuY2VsQnRuT3B0aW9ucz86IElQb3B1cEJ1dHRvbk9wdGlvbnMsXHJcbiAgYWRkaXRpb25hbE9wdGlvbnM/OiBJUG9wdXBPcHRpb25zXHJcbikge1xyXG4gIGNvbnN0ICRlbCA9ICQoJzxkaXY+JykuYXBwZW5kVG8oJ2JvZHknKTtcclxuICBsZXQgJGJ1dHRvbnM6IEpRdWVyeSA9IG51bGw7XHJcblxyXG4gIGxldCBwb3B1cDogSVBvcHVwID0gbnVsbDtcclxuXHJcbiAgY29uc3QgdXNlS2V5UHJlc3NCZWhhdmlvciA9IGFkZGl0aW9uYWxPcHRpb25zID8gYWRkaXRpb25hbE9wdGlvbnMudXNlS2V5UHJlc3NCZWhhdmlvciA6IGZhbHNlO1xyXG5cclxuICBmdW5jdGlvbiBjbG9zZVBvcHVwKCkge1xyXG4gICAgcG9wdXAuaGlkZSgpO1xyXG4gICAgcG9wdXAucmVtb3ZlKCk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBkeFBvcHVwT3B0aW9uczogRGV2RXhwcmVzcy51aS5keFBvcHVwLlByb3BlcnRpZXMgPSB7XHJcbiAgICBjb250ZW50VGVtcGxhdGU6ICgkcG9wdXBDb250YWluZXIpID0+IHtcclxuICAgICAgY29uc3QgeyAkY29udGVudCwgJGZvb3RlciB9ID0gY3JlYXRlTGF5b3V0KCRwb3B1cENvbnRhaW5lcik7XHJcblxyXG4gICAgICAkY29udGVudC5hcHBlbmQoJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgICBpZiAob2tCdG5PcHRpb25zICYmIGNhbmNlbEJ0bk9wdGlvbnMpIHtcclxuICAgICAgICAkYnV0dG9ucyA9IGNyZWF0ZUJ1dHRvbnMoXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRleHQ6IG9rQnRuT3B0aW9ucy50ZXh0LFxyXG4gICAgICAgICAgICBpY29uOiBva0J0bk9wdGlvbnMuaWNvbixcclxuICAgICAgICAgICAgZGlzYWJsZWQ6IG9rQnRuT3B0aW9ucy5kaXNhYmxlZCxcclxuICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxyXG4gICAgICAgICAgICBvbkNsaWNrOiAoZSkgPT4gb2tCdG5PcHRpb25zLm9uQ2xpY2soY2xvc2VQb3B1cClcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRleHQ6IGNhbmNlbEJ0bk9wdGlvbnMudGV4dCxcclxuICAgICAgICAgICAgaWNvbjogY2FuY2VsQnRuT3B0aW9ucy5pY29uLFxyXG4gICAgICAgICAgICBkaXNhYmxlZDogY2FuY2VsQnRuT3B0aW9ucy5kaXNhYmxlZCxcclxuICAgICAgICAgICAgb25DbGljazogKGUpID0+IGNhbmNlbEJ0bk9wdGlvbnMub25DbGljayhjbG9zZVBvcHVwKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgICRmb290ZXIuYXBwZW5kKCRidXR0b25zKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAkZm9vdGVyLnJlbW92ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgZWxlbWVudEF0dHI6IHsgY2xhc3M6ICdpc3pvbGVhLWR4LXBvcHVwJyB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgcG9wdXBPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuUHJvcGVydGllcyA9IHt9O1xyXG5cclxuICAkLmV4dGVuZCh0cnVlLCBwb3B1cE9wdGlvbnMsIG9wdGlvbnMsIGR4UG9wdXBPcHRpb25zKTtcclxuXHJcbiAgcG9wdXAgPSBjcmVhdGVQb3B1cCgkZWwsIHBvcHVwT3B0aW9ucywgdXNlS2V5UHJlc3NCZWhhdmlvcik7XHJcblxyXG4gIHBvcHVwLnNob3coKTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogcHJlZmVyLXRlbXBsYXRlXHJcbiAgICBva0J0bjogJGJ1dHRvbnMgPyAkYnV0dG9ucy5maW5kKGAuJHsgIE9LX0JUTl9DTEFTU31gKS5keEJ1dHRvbignaW5zdGFuY2UnKSA6IG51bGwsXHJcbiAgICBjbG9zZTogKCkgPT4gY2xvc2VQb3B1cCgpXHJcbiAgfTtcclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGNvbnN0IENTU19DTEFTU0VTID0ge1xyXG4gIGR4RGF0YUdyaWQ6ICdpc3pvbGVhLWR4LWRhdGFncmlkJyxcclxuICBkeEJ1dHRvbjogJ2lzem9sZWEtZHgtYnV0dG9uJyxcclxuICBkeFBvcHVwOiAnaXN6b2xlYS1keC1wb3B1cCdcclxufTtcclxuIiwgIlx1RkVGRmltcG9ydCB7IGNyZWF0ZURpYWxvZyB9IGZyb20gJy4vUG9wdXAnO1xyXG5pbXBvcnQgeyBJRXJyb3JJbmZvIH0gZnJvbSAnLi4vRGF0YS9BcGlSZXNwb25zZSc7XHJcblxyXG5jb25zdCBNQUlOX0VMRU1FTlRfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cCc7XHJcbmNvbnN0IFBPUFVQX0NPTlRFTlRfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fY29udGVudCc7XHJcbmNvbnN0IEVSUk9SX1BPUFVQX01FU1NBR0VfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fZXJyb3ItbWVzc2FnZSc7XHJcbmNvbnN0IEVSUk9SX1BPUFVQX0RFVEFJTFNfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fZXJyb3ItZGV0YWlscyc7XHJcblxyXG5jb25zdCBTSE9XX0RFVEFJTFNfVEVYVCA9ICdTaG93IGRldGFpbHMnO1xyXG5jb25zdCBISURFX0RFVEFJTFNfVEVYVCA9ICdIaWRlIGRldGFpbHMnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVycm9ySW5mb1BvcHVwKHRpdGxlTWVzc2FnZTogc3RyaW5nLCBlcnJvckluZm86IElFcnJvckluZm8gfCBJRXJyb3JJbmZvW10pOiB2b2lkIHtcclxuICBsZXQgcG9wdXA6IERldkV4cHJlc3MudWkuZHhQb3B1cDtcclxuICBjb25zdCBpbmZvQXJyYXkgPSBBcnJheS5pc0FycmF5KGVycm9ySW5mbykgPyBlcnJvckluZm8gOiBbZXJyb3JJbmZvXTtcclxuXHJcbiAgY29uc3QgJHBvcHVwQ29udGVudCA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcyhQT1BVUF9DT05URU5UX0NMQVNTKTtcclxuXHJcbiAgaW5mb0FycmF5LmZvckVhY2goKGksIGluZGV4KSA9PiB7XHJcbiAgICBjb25zdCAkZXJyb3JNZXNzYWdlRWxlbWVudCA9ICQoJzxwIC8+JykuYWRkQ2xhc3MoRVJST1JfUE9QVVBfTUVTU0FHRV9DTEFTUykudGV4dChpLkVycm9yKTtcclxuICAgIGNvbnN0ICRlcnJvckRldGFpbHNFbGVtZW50ID0gJCgnPHAgLz4nKS5hZGRDbGFzcyhFUlJPUl9QT1BVUF9ERVRBSUxTX0NMQVNTKS50ZXh0KGkuU3RhY2tUcmFjZSk7XHJcbiAgICAkcG9wdXBDb250ZW50LmFwcGVuZCgkZXJyb3JNZXNzYWdlRWxlbWVudCwgJGVycm9yRGV0YWlsc0VsZW1lbnQpLmhpZGUoKTtcclxuXHJcbiAgICBpZiAoaW5kZXggPCBpbmZvQXJyYXkubGVuZ3RoIC0gMSkge1xyXG4gICAgICAkcG9wdXBDb250ZW50LmFwcGVuZCgkKCc8aHIgLz4nKSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IHBvcHVwSW5mbyA9IGNyZWF0ZURpYWxvZyhcclxuICAgIHtcclxuICAgICAgdGl0bGU6IHRpdGxlTWVzc2FnZSxcclxuICAgICAgaGVpZ2h0OiAnYXV0bycsXHJcbiAgICAgIGFuaW1hdGlvbjoge1xyXG4gICAgICAgIHNob3c6IHsgZGlyZWN0aW9uOiAnYm90dG9tJywgdHlwZTogJ3NsaWRlSW4nIH0sXHJcbiAgICAgICAgaGlkZTogeyBkaXJlY3Rpb246ICdib3R0b20nLCB0eXBlOiAnc2xpZGVPdXQnIH1cclxuICAgICAgfSxcclxuICAgICAgcG9zaXRpb246IHsgbXk6ICdib3R0b20nLCBhdDogJ2JvdHRvbScsIG9mZnNldDogeyB5OiAtNTAgfSB9LFxyXG4gICAgICBzaGFkaW5nOiBmYWxzZSxcclxuICAgICAgZHJhZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4ge1xyXG4gICAgICAgIHBvcHVwID0gZS5jb21wb25lbnQ7XHJcbiAgICAgICAgZS5lbGVtZW50LmFkZENsYXNzKE1BSU5fRUxFTUVOVF9DTEFTUyk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAkcG9wdXBDb250ZW50LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiBTSE9XX0RFVEFJTFNfVEVYVCxcclxuICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGlzRnVsbFNjcmVlblJlcXVpcmVkOiBib29sZWFuID0gIXBvcHVwLm9wdGlvbignZnVsbFNjcmVlbicpO1xyXG4gICAgICAgIHRvZ2dsZUZ1bGxTY3JlZW4oaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xyXG4gICAgICAgIHBvcHVwSW5mby5va0J0bi5vcHRpb24oJ3RleHQnLCBpc0Z1bGxTY3JlZW5SZXF1aXJlZCA/IEhJREVfREVUQUlMU19URVhUIDogU0hPV19ERVRBSUxTX1RFWFQpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiAnQ2xvc2UnLFxyXG4gICAgICBvbkNsaWNrOiAoY2xvc2VQb3B1cCkgPT4gY2xvc2VQb3B1cCgpXHJcbiAgICB9KTtcclxuXHJcbiAgY29uc3QgdG9nZ2xlRnVsbFNjcmVlbiA9IChpc0Z1bGxTY3JlZW5SZXF1aXJlZDogYm9vbGVhbikgPT4ge1xyXG4gICAgJHBvcHVwQ29udGVudC50b2dnbGUoaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xyXG4gICAgcG9wdXAub3B0aW9uKCdmdWxsU2NyZWVuJywgaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xyXG4gICAgcG9wdXAucmVwYWludCgpO1xyXG4gIH07XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBlbnVtIEV4Y2VwdGlvblR5cGUge1xyXG4gIFVuZXhwZWN0ZWRFeGNlcHRpb24gPSAwLFxyXG4gIFNxbEV4Y2VwdGlvbiA9IDEsXHJcbiAgSXN6b2xlYUNvbmZpZ3VyYXRpb25FeGNlcHRpb24gPSAyXHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IEV4Y2VwdGlvblR5cGUgfSBmcm9tICcuLi9EYXRhL0V4Y2VwdGlvblR5cGUnO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgPSAoZXhjZXB0aW9uVHlwZTogRXhjZXB0aW9uVHlwZSkgPT4ge1xyXG4gIHN3aXRjaCAoZXhjZXB0aW9uVHlwZSkge1xyXG4gICAgY2FzZSBFeGNlcHRpb25UeXBlLlNxbEV4Y2VwdGlvbjpcclxuICAgICAgcmV0dXJuICdXZSBhdHRlbXB0ZWQgdG8gZXhlY3V0ZSB0aGUgZGF0YSBxdWVyeSBob3dldmVyIGl0IGFwcGVhcnMgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIGRhdGEgc291cmNlLic7XHJcblxyXG4gICAgY2FzZSBFeGNlcHRpb25UeXBlLklzem9sZWFDb25maWd1cmF0aW9uRXhjZXB0aW9uOlxyXG4gICAgICByZXR1cm4gJ1NvbWV0aGluZyB3cm9uZyB3aXRoIGlzem9sZWEgY29uZmlndXJhdGlvbi4gQ2hlY2sgQ2xpZW50SWQvQ2xpZW50U2VjcmV0IGZpZWxkcyBpbiB0aGUgYXBwc2V0dGluZ3MuanNvbiBmaWxlLic7XHJcblxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuICcnO1xyXG4gIH1cclxufTtcclxuIiwgIlx1RkVGRmltcG9ydCBub3RpZnkgZnJvbSAnLi4vV2lkZ2V0cy9Ob3RpZnknO1xyXG5pbXBvcnQgeyBJQXBpUmVzcG9uc2UsIGlzRXJyb3JJbmZvIH0gZnJvbSAnLi9BcGlSZXNwb25zZSc7XHJcbmltcG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcclxuaW1wb3J0IHsgY3JlYXRlRXJyb3JJbmZvUG9wdXAgfSBmcm9tICcuLi9XaWRnZXRzL0Vycm9ySW5mb1BvcHVwJztcclxuaW1wb3J0IHsgRXhjZXB0aW9uVHlwZSB9IGZyb20gJy4vRXhjZXB0aW9uVHlwZSc7XHJcbmltcG9ydCB7IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi9VdGlscy9HZW5lcmFsVXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlJztcclxuXHJcbmNvbnN0IERFRkFVTFRfRVJST1JfTUVTU0FHRSA9ICdVbmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLiBQbGVhc2UgY29udGFjdCB0byBkZXZlbG9wZXJzLic7XHJcbmNvbnN0IE5PVF9FU1NFTlRJQUxfU1RBVFVTRVMgPSBbNTA0XTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0RXJyb3JNZXNzYWdlID0gKCkgPT4gREVGQVVMVF9FUlJPUl9NRVNTQUdFO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZVN1Y2Nlc3MocmVzOiBJQXBpUmVzcG9uc2U8YW55Piwgbm90aWZ5U3VjY2VzcyA9IGZhbHNlKSB7XHJcbiAgaWYgKG5vdGlmeVN1Y2Nlc3MpIHtcclxuICAgIG5vdGlmeShyZXMuTWVzc2FnZSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVzLkRhdGEpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRXJyb3I8VD4oXHJcbiAgcmVzOiBJQXBpUmVzcG9uc2U8VD4sXHJcbiAgbm90aWZ5RXJyb3I6IGJvb2xlYW4sXHJcbiAgZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlPzogKGV4Y2VwdGlvblR5cGU6IEV4Y2VwdGlvblR5cGUpID0+IHN0cmluZ1xyXG4pOiB7IG1lc3NhZ2U6IHN0cmluZyB9IHtcclxuICBjb25zdCBtZXNzYWdlID0gcmVzLk1lc3NhZ2U7XHJcblxyXG4gIGNvbnN0IHJlc3VsdCA9IHsgbWVzc2FnZSB9O1xyXG5cclxuICBsZXQgbWVzc2FnZVRvU2hvdztcclxuICBjb25zdCBleGNlcHRpb25UeXBlID0gcGFyc2VFeGNlcHRpb25UeXBlKG1lc3NhZ2UpO1xyXG4gIGlmIChleGNlcHRpb25UeXBlICE9PSBudWxsKSB7XHJcbiAgICBjb25zdCBjdXN0b21FcnJvck1lc3NhZ2UgPSBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgPyBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UoZXhjZXB0aW9uVHlwZSkgOiAnJztcclxuICAgIG1lc3NhZ2VUb1Nob3cgPSBjdXN0b21FcnJvck1lc3NhZ2UgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBtZXNzYWdlVG9TaG93ID0gbWVzc2FnZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0U7XHJcbiAgfVxyXG5cclxuICBpZiAobm90aWZ5RXJyb3IpIHtcclxuICAgIGNvbnN0IGVycm9ySW5mbyA9IHJlcy5EYXRhO1xyXG4gICAgaWYgKGlzRXJyb3JJbmZvKGVycm9ySW5mbykpIHtcclxuICAgICAgY29uc3QgaXNFcnJvckluZm9Ob3RFbXB0eUFycmF5ID0gQXJyYXkuaXNBcnJheShlcnJvckluZm8pICYmIGVycm9ySW5mby5sZW5ndGg7XHJcbiAgICAgIGNvbnN0IGlzRXJyb3JJbmZvSGFzRGF0YSA9ICFBcnJheS5pc0FycmF5KGVycm9ySW5mbykgJiYgKGVycm9ySW5mby5TdGFja1RyYWNlIHx8IGVycm9ySW5mby5FcnJvcik7XHJcblxyXG4gICAgICBpZiAoaXNFcnJvckluZm9Ob3RFbXB0eUFycmF5IHx8IGlzRXJyb3JJbmZvSGFzRGF0YSkge1xyXG4gICAgICAgIGNyZWF0ZUVycm9ySW5mb1BvcHVwKG1lc3NhZ2VUb1Nob3csIGVycm9ySW5mbyk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBub3RpZnkobWVzc2FnZVRvU2hvdywgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VFeGNlcHRpb25UeXBlKG1lc3NhZ2U6IHN0cmluZyk6IEV4Y2VwdGlvblR5cGUgfCBudWxsIHtcclxuICByZXR1cm4gKCFpc05hTihtZXNzYWdlIGFzIGFueSkpICYmIEV4Y2VwdGlvblR5cGVbK21lc3NhZ2VdID8gK21lc3NhZ2UgOiBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlVXBsb2FkKGU6IHsgcmVxdWVzdDogeyByZXNwb25zZTogc3RyaW5nOyB9IH0pIHtcclxuICBjb25zdCByZXNwb25zZTogSUFwaVJlc3BvbnNlPGFueT4gPSBlLnJlcXVlc3QucmVzcG9uc2UgPyBKU09OLnBhcnNlKGUucmVxdWVzdC5yZXNwb25zZSkgOiB7fTtcclxuXHJcbiAgaWYgKHJlc3BvbnNlLlJlcXVlc3RTdGF0ZSA9PT0gUmVxdWVzdFN0YXRlLkNvbXBsZXRlZCkge1xyXG4gICAgaGFuZGxlU3VjY2VzcyhyZXNwb25zZSk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVFcnJvcihyZXNwb25zZSwgdHJ1ZSk7XHJcblxyXG4gIHJldHVybiBmYWxzZTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgSVNlbmRSZXF1ZXN0U2V0dGluZ3MgPSBKUXVlcnlBamF4U2V0dGluZ3MgJiB7XHJcbiAgbm90aWZ5RXJyb3I/OiBib29sZWFuO1xyXG4gIGdldFVzZXJGcmllbmRseUVycm9yTWVzc2FnZT86IChleGNlcHRpb25UeXBlOiBFeGNlcHRpb25UeXBlKSA9PiBzdHJpbmc7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2VuZFJlcXVlc3Q8VCA9IGFueT4oXHJcbiAgdXJsOiBzdHJpbmcsXHJcbiAgdHlwZTogc3RyaW5nID0gJ0dFVCcsXHJcbiAgZGF0YSA9IG51bGwsXHJcbiAgbm90aWZ5U3VjY2Vzcz86IGJvb2xlYW4sXHJcbiAgc2V0dGluZ3M/OiBJU2VuZFJlcXVlc3RTZXR0aW5ncyxcclxuKTogSlF1ZXJ5LkRlZmVycmVkPFQ+IHtcclxuICBjb25zdCBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcclxuXHJcbiAgY29uc3Qgbm90aWZ5RXJyb3IgPSBzZXR0aW5ncz8ubm90aWZ5RXJyb3IgPT09IHVuZGVmaW5lZCB8fCBzZXR0aW5ncy5ub3RpZnlFcnJvcjtcclxuXHJcbiAgY29uc3QgbWFuZGF0b3J5T3B0aW9ucyA9IHtcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbidcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBhamF4U2V0dGluZ3MgPSAkLmV4dGVuZCh7IHR5cGUsIHVybCwgZGF0YSB9LCBzZXR0aW5ncywgbWFuZGF0b3J5T3B0aW9ucyk7XHJcblxyXG4gICQuYWpheChhamF4U2V0dGluZ3MpXHJcbiAgICAuZG9uZSgocmVzKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBJQXBpUmVzcG9uc2U8YW55PiA9IHJlcztcclxuXHJcbiAgICAgIGlmIChyZXNwb25zZS5SZXF1ZXN0U3RhdGUgPT09IFJlcXVlc3RTdGF0ZS5Db21wbGV0ZWQpIHtcclxuICAgICAgICBoYW5kbGVTdWNjZXNzKHJlc3BvbnNlLCBub3RpZnlTdWNjZXNzKTtcclxuICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlLkRhdGEpO1xyXG5cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHsgbWVzc2FnZSB9ID0gaGFuZGxlRXJyb3IocmVzcG9uc2UsIG5vdGlmeUVycm9yLCBzZXR0aW5ncz8uZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlIHx8IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UpO1xyXG5cclxuICAgICAgZGVmZXJyZWQucmVqZWN0KG1lc3NhZ2UpO1xyXG4gICAgfSlcclxuICAgIC5mYWlsKChqcVhIUiwgdGV4dFN0YXR1cykgPT4ge1xyXG4gICAgICBpZiAoIU5PVF9FU1NFTlRJQUxfU1RBVFVTRVMuaW5jbHVkZXMoanFYSFIuc3RhdHVzKSAmJiBub3RpZnlFcnJvcikge1xyXG4gICAgICAgIG5vdGlmeShnZXREZWZhdWx0RXJyb3JNZXNzYWdlKCksIGZhbHNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZGVmZXJyZWQucmVqZWN0KHRleHRTdGF0dXMpO1xyXG4gICAgfSk7XHJcblxyXG4gIHJldHVybiBkZWZlcnJlZDtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUFwaVJlc3BvbnNlIH0gZnJvbSAnLi9BcGlSZXNwb25zZSc7XHJcbmltcG9ydCB7IGhhbmRsZUVycm9yLCBoYW5kbGVTdWNjZXNzLCBnZXREZWZhdWx0RXJyb3JNZXNzYWdlIH0gZnJvbSAnLi9SZXF1ZXN0JztcclxuaW1wb3J0IHsgUmVxdWVzdFN0YXRlIH0gZnJvbSAnLi9SZXF1ZXN0U3RhdGUnO1xyXG5pbXBvcnQgeyBFeGNlcHRpb25UeXBlIH0gZnJvbSAnLi9FeGNlcHRpb25UeXBlJztcclxuXHJcbmV4cG9ydCB0eXBlIElEeERhdGFTb3VyY2VPcHRpb25zID0gRGV2RXhwcmVzcy5kYXRhLkFzcE5ldC5PcHRpb25zICYge1xyXG4gIG5vdGlmeVN1Y2Nlc3M/OiBib29sZWFuO1xyXG4gIG5vdGlmeUVycm9yPzogYm9vbGVhbjtcclxuICBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2U/OiAoZXhjZXB0aW9uVHlwZTogRXhjZXB0aW9uVHlwZSkgPT4gc3RyaW5nO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUR4RGF0YVNvdXJjZShvcHRpb25zOiBJRHhEYXRhU291cmNlT3B0aW9ucykge1xyXG4gIGNvbnN0IHN0b3JlID0gRGV2RXhwcmVzcy5kYXRhLkFzcE5ldC5jcmVhdGVTdG9yZSh7XHJcbiAgICAuLi5vcHRpb25zLFxyXG4gICAgb25CZWZvcmVTZW5kOiAoanFYaHIsIHNldHRpbmdzKSA9PiB7XHJcbiAgICAgIGlmIChvcHRpb25zLm9uQmVmb3JlU2VuZCkge1xyXG4gICAgICAgIG9wdGlvbnMub25CZWZvcmVTZW5kKGpxWGhyLCBzZXR0aW5ncyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG5vdGlmeUVycm9yID0gb3B0aW9ucz8ubm90aWZ5RXJyb3IgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLm5vdGlmeUVycm9yO1xyXG5cclxuICAgICAgc2V0dGluZ3MuZGF0YUZpbHRlciA9IChyYXdSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlczogSUFwaVJlc3BvbnNlPGFueT4gPSBKU09OLnBhcnNlKHJhd1Jlc3BvbnNlKTtcclxuXHJcbiAgICAgICAgaWYgKHJlcy5SZXF1ZXN0U3RhdGUgPT09IFJlcXVlc3RTdGF0ZS5Db21wbGV0ZWQpIHtcclxuICAgICAgICAgIHJldHVybiBoYW5kbGVTdWNjZXNzKHJlcywgb3B0aW9ucy5ub3RpZnlTdWNjZXNzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShoYW5kbGVFcnJvcihyZXMsIG5vdGlmeUVycm9yLCBvcHRpb25zPy5nZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UpKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHNldHRpbmdzLmVycm9yID0gKHhocjogSlF1ZXJ5WEhSKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVzOiBJQXBpUmVzcG9uc2U8YW55PiA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCB8fCAne30nKTtcclxuXHJcbiAgICAgICAgLy8gTk9URTogZm9yIHVuaGFuZGxlZCBlcnJvcnMgb24gdGhlIHNlcnZlclxyXG4gICAgICAgIGlmICghcmVzLlJlcXVlc3RTdGF0ZSkge1xyXG4gICAgICAgICAgaGFuZGxlRXJyb3IocmVzLCBub3RpZnlFcnJvciwgb3B0aW9ucz8uZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIChzdG9yZSBhcyBhbnkpLl9lcnJvckhhbmRsZXIgPSAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgaWYgKGVycm9yICYmICFlcnJvci5tZXNzYWdlKSB7XHJcbiAgICAgIGVycm9yLm1lc3NhZ2UgPSBnZXREZWZhdWx0RXJyb3JNZXNzYWdlKCk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIHN0b3JlO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4vUmVxdWVzdCc7XHJcblxyXG5jb25zdCBsb2FkUHJvbWlzZXM6IHsgW3VybDogc3RyaW5nXTogSlF1ZXJ5RGVmZXJyZWQ8YW55PiB9ID0ge307XHJcblxyXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbjxUPih1cmw6IHN0cmluZykge1xyXG4gIGlmIChsb2FkUHJvbWlzZXNbdXJsXSkge1xyXG4gICAgcmV0dXJuIGF3YWl0IGxvYWRQcm9taXNlc1t1cmxdO1xyXG4gIH1cclxuXHJcbiAgbG9hZFByb21pc2VzW3VybF0gPSBzZW5kUmVxdWVzdDxUPih1cmwpO1xyXG4gIGxvYWRQcm9taXNlc1t1cmxdLmNhdGNoKChlcnIpID0+IHtcclxuICAgIGxvYWRQcm9taXNlc1t1cmxdID0gbnVsbDtcclxuXHJcbiAgICB0aHJvdyBlcnI7XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IHJlc3VsdDogVCA9IGF3YWl0IGxvYWRQcm9taXNlc1t1cmxdO1xyXG5cclxuICBsb2FkUHJvbWlzZXNbdXJsXSA9IG51bGw7XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IHNlbmRSZXF1ZXN0LCBoYW5kbGVFcnJvciwgaGFuZGxlU3VjY2VzcywgaGFuZGxlVXBsb2FkIH0gZnJvbSAnLi9SZXF1ZXN0JztcclxuaW1wb3J0IHsgaXNFcnJvckluZm8gfSBmcm9tICcuL0FwaVJlc3BvbnNlJztcclxuaW1wb3J0IHsgY3JlYXRlRHhEYXRhU291cmNlIH0gZnJvbSAnLi9EeERhdGFTb3VyY2UnO1xyXG5pbXBvcnQgKiBhcyBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbiBmcm9tICcuL0xvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uJztcclxuXHJcbi8vIFRPRE86IGV4cG9ydCB0eXBlXHJcbmV4cG9ydCB7IElBcGlSZXNwb25zZSwgSUVycm9ySW5mbyB9IGZyb20gJy4vQXBpUmVzcG9uc2UnO1xyXG5leHBvcnQgeyBJRHhEYXRhU291cmNlT3B0aW9ucyB9IGZyb20gJy4vRHhEYXRhU291cmNlJztcclxuZXhwb3J0IHsgSUxvZ29TZXR0aW5ncyB9IGZyb20gJy4vSUxvZ29TZXR0aW5ncyc7XHJcbmV4cG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICBzZW5kUmVxdWVzdCxcclxuICBoYW5kbGVFcnJvcixcclxuICBoYW5kbGVTdWNjZXNzLFxyXG4gIGhhbmRsZVVwbG9hZCxcclxuICBjcmVhdGVEeERhdGFTb3VyY2UsXHJcbiAgaXNFcnJvckluZm8sXHJcbiAgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb25cclxufTtcclxuIiwgImV4cG9ydCBpbnRlcmZhY2UgSVJlbmRlcmVkIHtcclxuICByZW5kZXIoKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGVzdHJveWFibGUge1xyXG4gIGRlc3Ryb3koKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGlzRGVzdHJveWFibGUgPSAob2JqOiBhbnkpOiBvYmogaXMgSURlc3Ryb3lhYmxlID0+IHtcclxuICByZXR1cm4gdHlwZW9mIG9iai5kZXN0cm95ID09PSAnZnVuY3Rpb24nO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IHRocm93UmVuZGVyRXJyb3IgPSAoZWxlbWVudE5hbWU/OiBzdHJpbmcpOiBuZXZlciA9PiB7XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBwcmVmZXItdGVtcGxhdGVcclxuICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByZXF1aXJlZCAke2VsZW1lbnROYW1lID8gKGAke2VsZW1lbnROYW1lICB9IGApIDogJyd9IGlzbid0IGNyZWF0ZWRgKTtcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIERlZXBSZWFkb25seTxUPiA9IHtcclxuICByZWFkb25seSBbUCBpbiBrZXlvZiBUXTogKFxyXG4gICAgVFtQXSBleHRlbmRzIEFycmF5PGluZmVyIFUxPiA/IFJlYWRvbmx5QXJyYXk8RGVlcFJlYWRvbmx5PFUxPj4gOiAoXHJcbiAgICAgIFRbUF0gZXh0ZW5kcyBNYXA8aW5mZXIgSywgaW5mZXIgVTI+ID8gUmVhZG9ubHlNYXA8SywgRGVlcFJlYWRvbmx5PFUyPj4gOiAoXHJcbiAgICAgICAgVFtQXSBleHRlbmRzIFNldDxpbmZlciBVMz4gPyBSZWFkb25seVNldDxEZWVwUmVhZG9ubHk8VTM+PiA6IChcclxuICAgICAgICAgIFRbUF0gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IFRbUF0gOiAoXHJcbiAgICAgICAgICAgIERlZXBSZWFkb25seTxUW1BdPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBEZWVwUGFydGlhbDxUPiA9IHtcclxuICBbUCBpbiBrZXlvZiBUXT86IChcclxuICAgIFRbUF0gZXh0ZW5kcyBBcnJheTxpbmZlciBVMT4gPyBBcnJheTxEZWVwUGFydGlhbDxVMT4+IDogKFxyXG4gICAgICBUW1BdIGV4dGVuZHMgTWFwPGluZmVyIEssIGluZmVyIFUyPiA/IE1hcDxLLCBEZWVwUGFydGlhbDxVMj4+IDogKFxyXG4gICAgICAgIFRbUF0gZXh0ZW5kcyBTZXQ8aW5mZXIgVTM+ID8gU2V0PERlZXBQYXJ0aWFsPFUzPj4gOiAoXHJcbiAgICAgICAgICBUW1BdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPyBUW1BdIDogKFxyXG4gICAgICAgICAgICBEZWVwUGFydGlhbDxUW1BdPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBEZWVwUmVxdWlyZWQ8VD4gPSB7XHJcbiAgW1AgaW4ga2V5b2YgVF0tPzogKFxyXG4gICAgVFtQXSBleHRlbmRzIEFycmF5PGluZmVyIFUxPiA/IEFycmF5PERlZXBSZXF1aXJlZDxVMT4+IDogKFxyXG4gICAgICBUW1BdIGV4dGVuZHMgTWFwPGluZmVyIEssIGluZmVyIFUyPiA/IE1hcDxLLCBEZWVwUmVxdWlyZWQ8VTI+PiA6IChcclxuICAgICAgICBUW1BdIGV4dGVuZHMgU2V0PGluZmVyIFUzPiA/IFNldDxEZWVwUmVxdWlyZWQ8VTM+PiA6IChcclxuICAgICAgICAgIFRbUF0gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IFRbUF0gOiAoXHJcbiAgICAgICAgICAgIERlZXBSZXF1aXJlZDxUW1BdPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBNdXRhYmxlPFQ+ID0ge1xyXG4gIC1yZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXTtcclxufTtcclxuIiwgIlx1RkVGRmltcG9ydCB7IERlZXBSZWFkb25seSB9IGZyb20gJy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4uL0hlYWRlci9JTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFVybEJ5TWVudUl0ZW1EYXRhKGl0ZW1EYXRhOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwgfCBEZWVwUmVhZG9ubHk8SU5hdmlnYXRpb25NZW51SXRlbU1vZGVsPikge1xyXG4gIGNvbnN0IHsgQXJlYSwgQ29udHJvbGxlciwgQWN0aW9uLCBJc0NsaWNrYWJsZSB9ID0gaXRlbURhdGE7XHJcblxyXG4gIGlmIChJc0NsaWNrYWJsZSAmJiBDb250cm9sbGVyKSB7XHJcbiAgICByZXR1cm4gQXJlYSA/IGVuY29kZVVSSShgLyR7QXJlYX0vJHtDb250cm9sbGVyfS8ke0FjdGlvbn1gKSA6IGVuY29kZVVSSShgLyR7Q29udHJvbGxlcn0vJHtBY3Rpb259YCk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdW5kZWZpbmVkO1xyXG59XHJcblxyXG5leHBvcnQgeyBXaW5kb3dSZXNpemVMaXN0ZW5lciwgYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHMgfSBmcm9tICcuL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyJztcclxuZXhwb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQgfSBmcm9tICcuL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyJztcclxuIiwgImltcG9ydCB7IElEZXN0cm95YWJsZSB9IGZyb20gJy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElMYXlvdXRCcmVha3BvaW50IHtcclxuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgbWluV2lkdGg6IG51bWJlcjtcclxuICByZWFkb25seSBtYXhXaWR0aDogbnVtYmVyO1xyXG59XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGludGVyZmFjZS1uYW1lXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0QnJlYWtwb2ludENoYW5nZWRFdmVudCB7XHJcbiAgcmVhZG9ubHkgcHJldmlvdXNCcmVha3BvaW50OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICByZWFkb25seSBjdXJyZW50QnJlYWtwb2ludDogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgcmVhZG9ubHkgb3JpZ2luYWxFdmVudDogVUlFdmVudDtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzID0ge1xyXG4gIHhzOiB7XHJcbiAgICBuYW1lOiAneHMnLFxyXG4gICAgbWluV2lkdGg6IDAsXHJcbiAgICBtYXhXaWR0aDogNTc1XHJcbiAgfSxcclxuICBzbToge1xyXG4gICAgbmFtZTogJ3NtJyxcclxuICAgIG1pbldpZHRoOiA1NzYsXHJcbiAgICBtYXhXaWR0aDogNzY3XHJcbiAgfSxcclxuICBtZDoge1xyXG4gICAgbmFtZTogJ21kJyxcclxuICAgIG1pbldpZHRoOiA3NjgsXHJcbiAgICBtYXhXaWR0aDogOTkxXHJcbiAgfSxcclxuICBsZzoge1xyXG4gICAgbmFtZTogJ2xnJyxcclxuICAgIG1pbldpZHRoOiA5OTIsXHJcbiAgICBtYXhXaWR0aDogMTE5OVxyXG4gIH0sXHJcbiAgeGw6IHtcclxuICAgIG5hbWU6ICd4bCcsXHJcbiAgICBtaW5XaWR0aDogMTIwMCxcclxuICAgIG1heFdpZHRoOiBJbmZpbml0eVxyXG4gIH1cclxufSBhcyBjb25zdDtcclxuXHJcbmNvbnN0IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzTGlzdDogcmVhZG9ubHkgSUxheW91dEJyZWFrcG9pbnRbXSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzKVxyXG4gIC5tYXAoKGJyZWFrcG9pbnROYW1lKSA9PiBib290c3RyYXBMYXlvdXRCcmVha3BvaW50c1ticmVha3BvaW50TmFtZV0pO1xyXG5cclxuZXhwb3J0IGNsYXNzIFdpbmRvd1Jlc2l6ZUxpc3RlbmVyIGltcGxlbWVudHMgSURlc3Ryb3lhYmxlIHtcclxuICBwdWJsaWMgY3VycmVudExheW91dEJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25XaW5kb3dSZXNpemVMaXN0ZW5lciA9IHRoaXMub25XaW5kb3dSZXNpemUuYmluZCh0aGlzKTtcclxuXHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxheW91dEJyZWFrcG9pbnRzOiByZWFkb25seSBJTGF5b3V0QnJlYWtwb2ludFtdO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSByZXNpemVEZWxheTogbnVtYmVyO1xyXG4gIC8vIFRPRE86IHVzZSBtdWx0aXBsZSBldmVudCBsaXN0ZW5lclxyXG4gIHByb3RlY3RlZCByZWFkb25seSBvblJlc2l6ZTogKChlOiBVSUV2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZDogKChlOiBMYXlvdXRCcmVha3BvaW50Q2hhbmdlZEV2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcm90ZWN0ZWQgbGFzdFdpbmRvd1Jlc2l6ZVRpbWVvdXRJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIG9uUmVzaXplPzogKGU6IFVJRXZlbnQpID0+IHZvaWQsXHJcbiAgICBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkPzogKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpID0+IHZvaWQsXHJcbiAgICByZXNpemVEZWxheSA9IDEwMCxcclxuICAgIGxheW91dEJyZWFrcG9pbnRzOiByZWFkb25seSBJTGF5b3V0QnJlYWtwb2ludFtdID0gYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHNMaXN0XHJcbiAgKSB7XHJcbiAgICB0aGlzLm9uUmVzaXplID0gb25SZXNpemU7XHJcbiAgICB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWQgPSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkO1xyXG4gICAgdGhpcy5yZXNpemVEZWxheSA9IHJlc2l6ZURlbGF5O1xyXG4gICAgdGhpcy5sYXlvdXRCcmVha3BvaW50cyA9IGxheW91dEJyZWFrcG9pbnRzO1xyXG5cclxuICAgIHRoaXMuY3VycmVudExheW91dEJyZWFrcG9pbnQgPSB0aGlzLmdldExheW91dEJyZWFrcG9pbnRCeVdpbmRvd1dpZHRoKHdpbmRvdy5pbm5lcldpZHRoKTtcclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGV0YWNoRXZlbnRzKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXR0YWNoRXZlbnRzKCkge1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMub25XaW5kb3dSZXNpemVMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZGV0YWNoRXZlbnRzKCkge1xyXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMub25XaW5kb3dSZXNpemVMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0TGF5b3V0QnJlYWtwb2ludEJ5V2luZG93V2lkdGgod2luZG93V2lkdGg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMubGF5b3V0QnJlYWtwb2ludHMuZmluZCgobGF5b3V0QnJlYWtwb2ludCkgPT4ge1xyXG4gICAgICByZXR1cm4gbGF5b3V0QnJlYWtwb2ludC5taW5XaWR0aCA8PSB3aW5kb3dXaWR0aCAmJiAoIWxheW91dEJyZWFrcG9pbnQubWF4V2lkdGggfHwgbGF5b3V0QnJlYWtwb2ludC5tYXhXaWR0aCA+PSB3aW5kb3dXaWR0aCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvbldpbmRvd1Jlc2l6ZShlOiBVSUV2ZW50KSB7XHJcbiAgICBjbGVhclRpbWVvdXQodGhpcy5sYXN0V2luZG93UmVzaXplVGltZW91dElkKTtcclxuICAgIHRoaXMubGFzdFdpbmRvd1Jlc2l6ZVRpbWVvdXRJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMub25XaW5kb3dSZXNpemVJbnRlcm5hbChlKSwgdGhpcy5yZXNpemVEZWxheSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25XaW5kb3dSZXNpemVJbnRlcm5hbChlOiBVSUV2ZW50KSB7XHJcbiAgICBjb25zdCBsYXlvdXRCcmVha3BvaW50ID0gdGhpcy5nZXRMYXlvdXRCcmVha3BvaW50QnlXaW5kb3dXaWR0aCh3aW5kb3cuaW5uZXJXaWR0aCk7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50TGF5b3V0QnJlYWtwb2ludCAhPT0gbGF5b3V0QnJlYWtwb2ludCkge1xyXG4gICAgICBjb25zdCBwcmV2aW91c0xheW91dEJyZWFrcG9pbnQgPSB0aGlzLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50O1xyXG4gICAgICB0aGlzLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50ID0gbGF5b3V0QnJlYWtwb2ludDtcclxuXHJcbiAgICAgIHRoaXMuZW1pdEJyZWFrcG9pbnRDaGFuZ2VkKHtcclxuICAgICAgICBwcmV2aW91c0JyZWFrcG9pbnQ6IHByZXZpb3VzTGF5b3V0QnJlYWtwb2ludCxcclxuICAgICAgICBjdXJyZW50QnJlYWtwb2ludDogdGhpcy5jdXJyZW50TGF5b3V0QnJlYWtwb2ludCxcclxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZW1pdFJlc2l6ZUV2ZW50KGUpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRSZXNpemVFdmVudChlOiBVSUV2ZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uUmVzaXplPy4oZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdEJyZWFrcG9pbnRDaGFuZ2VkKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMub25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZD8uKGUpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiZXhwb3J0IGludGVyZmFjZSBJQ29uZmlnIHtcclxuICBpc0xlZ2FjeVJlbmRlcj86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBjb25maWc6IElDb25maWcgPSB7XHJcbiAgaXNMZWdhY3lSZW5kZXI6IGZhbHNlXHJcbn07XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJVXNlck1lbnVJdGVtTW9kZWwsIElCYWRnZU1vZGVsIH0gZnJvbSAnLi9JVXNlck1lbnVJdGVtJztcclxuaW1wb3J0IHsgdGhyb3dSZW5kZXJFcnJvciwgRGVlcFJlYWRvbmx5IH0gZnJvbSAnLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIFdpbmRvd1Jlc2l6ZUxpc3RlbmVyLCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cywgTGF5b3V0QnJlYWtwb2ludENoYW5nZWRFdmVudCB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuLi9Db25maWcvSW5kZXgnO1xyXG5cclxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBpbnRlcmZhY2UtbmFtZVxyXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJNZW51SXRlbUNsaWNrRXZlbnQge1xyXG4gIHJlYWRvbmx5IGl0ZW06IERlZXBSZWFkb25seTxJVXNlck1lbnVJdGVtTW9kZWw+O1xyXG4gIHJlYWRvbmx5IG9yaWdpbmFsRXZlbnQ6IFVJRXZlbnQ7XHJcbiAgY2FuY2VsPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVXNlck1lbnVPcHRpb25zIHtcclxuICBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgdXNlckF2YXRhcjogc3RyaW5nO1xyXG4gIGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXTtcclxuICBjb2xsYXBzZUJyZWFrcG9pbnQ/OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBnZXREaXNwbGF5ZWRVc2VySW5mbz86ICh1c2VyTmFtZTogc3RyaW5nKSA9PiBzdHJpbmc7XHJcbiAgb25JdGVtQ2xpY2s/OiAoZTogVXNlck1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFVzZXJNZW51IHtcclxuICBwcm90ZWN0ZWQgc3RhdGljIGRlZmF1bHRHZXREaXNwbGF5ZWRVc2VySW5mbzogKHVzZXJOYW1lOiBzdHJpbmcpID0+IHN0cmluZyA9ICh1c2VyTmFtZSkgPT4gYFdlbGNvbWUgJHt1c2VyTmFtZX1gO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VyTmFtZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlckF2YXRhcjogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2V0RGlzcGxheWVkVXNlckluZm86ICh1c2VyTmFtZTogc3RyaW5nKSA9PiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb2xsYXBzZUJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgd2luZG93UmVzaXplTGlzdGVuZXI6IFdpbmRvd1Jlc2l6ZUxpc3RlbmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZExpc3RlbmVyID0gdGhpcy5vbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkLmJpbmQodGhpcyk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkl0ZW1DbGljazogKChlOiBVc2VyTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXTtcclxuICAvLyBFbGVtZW50c1xyXG4gIHByaXZhdGUgX3Jvb3Q6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgbW9iaWxlQ29udGVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBkZXNrdG9wUm9vdERyb3Bkb3duOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGRlc2t0b3BDb250ZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGRlc2t0b3BDb250ZW50VHJpZ2dlcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSB1c2VySW5mb0NvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSB1c2VySW5mb0RpdmlkZXI6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgaXRlbXNDb250YWluZXI6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwdWJsaWMgZ2V0IHJvb3QoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcm9vdDtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElVc2VyTWVudU9wdGlvbnMpIHtcclxuICAgIHRoaXMuY29udGFpbmVyID0gb3B0aW9ucy5jb250YWluZXI7XHJcbiAgICB0aGlzLnVzZXJBdmF0YXIgPSBvcHRpb25zLnVzZXJBdmF0YXI7XHJcbiAgICB0aGlzLnVzZXJOYW1lID0gb3B0aW9ucy51c2VyTmFtZTtcclxuICAgIHRoaXMuaXRlbXMgPSBvcHRpb25zLml0ZW1zO1xyXG4gICAgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQgPSBvcHRpb25zLmNvbGxhcHNlQnJlYWtwb2ludCB8fCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cy5tZDtcclxuICAgIHRoaXMuZ2V0RGlzcGxheWVkVXNlckluZm8gPSBvcHRpb25zLmdldERpc3BsYXllZFVzZXJJbmZvIHx8IFVzZXJNZW51LmRlZmF1bHRHZXREaXNwbGF5ZWRVc2VySW5mbztcclxuICAgIHRoaXMub25JdGVtQ2xpY2sgPSBvcHRpb25zLm9uSXRlbUNsaWNrO1xyXG5cclxuICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBuZXcgV2luZG93UmVzaXplTGlzdGVuZXIodW5kZWZpbmVkLCB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWRMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgaWYgKHRoaXMuX3Jvb3QpIHtcclxuICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy5fcm9vdCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW5kZXJNYWluRWxlbWVudHMoKTtcclxuICAgIHRoaXMucmVuZGVyVXNlckluZm8oKTtcclxuICAgIHRoaXMucmVuZGVySXRlbXMoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMucm9vdCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWRkSXRlbXMoaXRlbXM6IElVc2VyTWVudUl0ZW1Nb2RlbFtdKSB7XHJcbiAgICB0aGlzLml0ZW1zID0gdGhpcy5pdGVtcy5jb25jYXQoaXRlbXMpO1xyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbnNlcnRJdGVtcyhpdGVtczogSVVzZXJNZW51SXRlbU1vZGVsW10sIHBvc2l0aW9uOiBudW1iZXIpIHtcclxuICAgIHRoaXMuaXRlbXMuc3BsaWNlKHBvc2l0aW9uLCAwLCAuLi5pdGVtcyk7XHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZUl0ZW1zKGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXSkge1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgbWVudUl0ZW1zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXRlbXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0QmFkZ2UoaXRlbU5hbWU6IHN0cmluZyk6IElCYWRnZU1vZGVsIHwgbnVsbCB7XHJcbiAgICBjb25zdCBtZW51SXRlbSA9IHRoaXMuaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5UZXh0Py50b0xvd2VyQ2FzZSgpID09PSBpdGVtTmFtZSk7XHJcblxyXG4gICAgcmV0dXJuIG1lbnVJdGVtPy5CYWRnZSB8fCBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEJhZGdlKGl0ZW1OYW1lOiBzdHJpbmcsIGJhZGdlOiBJQmFkZ2VNb2RlbCkge1xyXG4gICAgY29uc3QgbWVudUl0ZW0gPSB0aGlzLml0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0uVGV4dD8udG9Mb3dlckNhc2UoKSA9PT0gaXRlbU5hbWUpO1xyXG5cclxuICAgIGlmIChtZW51SXRlbSkge1xyXG4gICAgICBtZW51SXRlbS5CYWRnZSA9IGJhZGdlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0IGlzTW9iaWxlVmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1heFdpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWF4V2lkdGg7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVuZGVyTWFpbkVsZW1lbnRzKCkge1xyXG4gICAgdGhpcy5fcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5fcm9vdC5jbGFzc0xpc3QuYWRkKCd1c2VyLW1lbnUnKTtcclxuXHJcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMubW9iaWxlQ29udGVudENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKC8qJ25hdmJhci1uYXYnLCAqL2BkLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX0tbm9uZWApO1xyXG5cclxuICAgIHRoaXMuZGVza3RvcFJvb3REcm9wZG93biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5kZXNrdG9wUm9vdERyb3Bkb3duLmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duJywgJ2Qtbm9uZScsIGBkLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX0tYmxvY2tgKTtcclxuXHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudFRyaWdnZXIuY2xhc3NMaXN0LmFkZCgnaGVhZGVyX19pY29uLWJ1dHRvbicsICdidG4nLCAnYnRuLW91dGxpbmUtbGlnaHQnKTtcclxuICAgIHRoaXMuZGVza3RvcENvbnRlbnRUcmlnZ2VyLnNldEF0dHJpYnV0ZSgndHlwZScsICdidXR0b24nKTtcclxuICAgIHRoaXMuZGVza3RvcENvbnRlbnRUcmlnZ2VyLnNldEF0dHJpYnV0ZSgnZGF0YS10b2dnbGUnLCAnZHJvcGRvd24nKTtcclxuXHJcbiAgICBsZXQgYXZhdGFyO1xyXG4gICAgaWYgKGNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICBpZiAodGhpcy51c2VyQXZhdGFyKSB7XHJcbiAgICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XHJcbiAgICAgICAgYXZhdGFyLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24taWNvbicsICdoZWFkZXJfX2ljb24tYnV0dG9uLWF2YXRhcicpO1xyXG4gICAgICAgIGF2YXRhci5zcmMgPSB0aGlzLnVzZXJBdmF0YXI7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xyXG4gICAgICAgIGF2YXRhci5jbGFzc0xpc3QuYWRkKCdoZWFkZXJfX2ljb24tYnV0dG9uLWljb24nLCAnZmFzJywgJ2ZhLXVzZXInKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xyXG4gICAgICBhdmF0YXIuY2xhc3NMaXN0LmFkZCgnaGVhZGVyX19pY29uLWJ1dHRvbi1pY29uJywgJ2lzb3otaWNvbi11c2VyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1tZW51JywgJ2Ryb3Bkb3duLW1lbnUtcmlnaHQnKTtcclxuXHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlci5hcHBlbmRDaGlsZChhdmF0YXIpO1xyXG5cclxuICAgIGlmICh0aGlzLml0ZW1zLnNvbWUoKGl0ZW0pID0+ICEhaXRlbS5CYWRnZSkpIHtcclxuICAgICAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgIGJhZGdlLmNsYXNzTGlzdC5hZGQoJ3VzZXItbWVudV9fYmFkZ2UnKTtcclxuICAgICAgdGhpcy5kZXNrdG9wQ29udGVudFRyaWdnZXIuYXBwZW5kQ2hpbGQoYmFkZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGVza3RvcFJvb3REcm9wZG93bi5hcHBlbmRDaGlsZCh0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlcik7XHJcbiAgICB0aGlzLmRlc2t0b3BSb290RHJvcGRvd24uYXBwZW5kQ2hpbGQodGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy5pdGVtc0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XHJcbiAgICB0aGlzLml0ZW1zQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3VzZXItbWVudV9faXRlbXMnKTtcclxuXHJcbiAgICBpZiAoY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICAgIHRoaXMudXNlckluZm9Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoNicpO1xyXG4gICAgICB0aGlzLnVzZXJJbmZvQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3VzZXItaW5mbycsICdoNicpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCd1c2VyLWluZm8nLCAnZHJvcGRvd24taXRlbScpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXNlckluZm9EaXZpZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLnVzZXJJbmZvRGl2aWRlci5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1kaXZpZGVyJywgJ2Qtbm9uZScsIGBkLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX0tYmxvY2tgKTtcclxuXHJcbiAgICBpZiAodGhpcy5pc01vYmlsZVZpZXcpIHtcclxuICAgICAgdGhpcy5tb2JpbGVDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9Db250YWluZXIpO1xyXG4gICAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy51c2VySW5mb0RpdmlkZXIpO1xyXG4gICAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5pdGVtc0NvbnRhaW5lcik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9Db250YWluZXIpO1xyXG4gICAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9EaXZpZGVyKTtcclxuICAgICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLml0ZW1zQ29udGFpbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9yb290LmFwcGVuZENoaWxkKHRoaXMubW9iaWxlQ29udGVudENvbnRhaW5lcik7XHJcbiAgICB0aGlzLl9yb290LmFwcGVuZENoaWxkKHRoaXMuZGVza3RvcFJvb3REcm9wZG93bik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVuZGVyVXNlckluZm8oKSB7XHJcbiAgICBpZiAoIXRoaXMudXNlckluZm9Db250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ3VzZXJJbmZvQ29udGFpbmVyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICBjb25zdCB1c2VySW5mb0NvbnRlbnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgICB1c2VySW5mb0NvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3VzZXItaW5mb19fY29udGVudCcpO1xyXG4gICAgICB1c2VySW5mb0NvbnRlbnRFbGVtZW50LmlubmVyVGV4dCA9IHRoaXMuZ2V0RGlzcGxheWVkVXNlckluZm8odGhpcy51c2VyTmFtZSk7XHJcblxyXG4gICAgICB0aGlzLnVzZXJJbmZvQ29udGFpbmVyLmFwcGVuZENoaWxkKHVzZXJJbmZvQ29udGVudEVsZW1lbnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lci5pbm5lclRleHQgPSB0aGlzLmdldERpc3BsYXllZFVzZXJJbmZvKHRoaXMudXNlck5hbWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlckl0ZW1zKCkge1xyXG4gICAgaWYgKCF0aGlzLml0ZW1zQ29udGFpbmVyKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdpdGVtc0NvbnRhaW5lcicpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2xlYXJJdGVtc0NvbnRhaW5lcigpO1xyXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtRWxlbWVudChpdGVtLCB0aGlzLmlzTW9iaWxlVmlldyk7XHJcbiAgICAgIHRoaXMuaXRlbXNDb250YWluZXIhLmFwcGVuZENoaWxkKGl0ZW1FbGVtZW50KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZUl0ZW1FbGVtZW50KGl0ZW06IElVc2VyTWVudUl0ZW1Nb2RlbCwgaXNNb2JpbGU6IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtRWxlbWVudEJhc2UoaXRlbSk7XHJcblxyXG4gICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICBsaW5rRWxlbWVudC5jbGFzc0xpc3QuYWRkKGlzTW9iaWxlID8gJ25hdi1saW5rJyA6ICdkcm9wZG93bi1pdGVtJyk7XHJcbiAgICBsaW5rRWxlbWVudC5ocmVmID0gaXRlbS5VcmwgfHwgJ2phdmFzY3JpcHQ6dm9pZCgwKSc7XHJcbiAgICBsaW5rRWxlbWVudC50ZXh0ID0gaXRlbS5UZXh0O1xyXG4gICAgaWYoaXRlbS5PcGVuSW5OZXdQYWdlKSB7XHJcbiAgICAgIGxpbmtFbGVtZW50LnRhcmdldCA9ICdfYmxhbmsnO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzVG9JdGVtKGxpbmtFbGVtZW50LCBpdGVtKTtcclxuICAgIGl0ZW1FbGVtZW50LmFwcGVuZENoaWxkKGxpbmtFbGVtZW50KTtcclxuXHJcbiAgICBpZiAoaXRlbS5CYWRnZSkge1xyXG4gICAgICBjb25zdCBiYWRnZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuICAgICAgYmFkZ2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaXNvei1iYWRnZScpO1xyXG4gICAgICBiYWRnZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdpc296LWJhZGdlLS1jaXJjbGUnKTtcclxuICAgICAgYmFkZ2VsZW1lbnQuY2xhc3NMaXN0LmFkZChgaXNvei1iYWRnZS0tJHtpdGVtLkJhZGdlLlR5cGUgfHwgJ2luZm9ybWF0aW9uJ31gKTtcclxuICAgICAgYmFkZ2VsZW1lbnQuaW5uZXJIVE1MID0gaXRlbS5CYWRnZS5UZXh0O1xyXG5cclxuICAgICAgbGlua0VsZW1lbnQuYXBwZW5kQ2hpbGQoYmFkZ2VsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpdGVtRWxlbWVudDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBjcmVhdGVJdGVtRWxlbWVudEJhc2UoaXRlbTogSVVzZXJNZW51SXRlbU1vZGVsKSB7XHJcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCduYXYtaXRlbScpO1xyXG5cclxuICAgIHJldHVybiBpdGVtRWxlbWVudDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhdHRhY2hFdmVudHNUb0l0ZW0oaXRlbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBpdGVtOiBJVXNlck1lbnVJdGVtTW9kZWwpIHtcclxuICAgIGl0ZW1FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHRoaXMub25NZW51SXRlbUNsaWNrKHtcclxuICAgICAgaXRlbSxcclxuICAgICAgb3JpZ2luYWxFdmVudDogZVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHN3aXRjaFZpZXcoaXNNb2JpbGU6IGJvb2xlYW4pIHtcclxuICAgIGlmIChpc01vYmlsZSkge1xyXG4gICAgICB0aGlzLmFwcGx5TW9iaWxlVmlld0ZvclVzZXJJbmZvKCk7XHJcbiAgICAgIHRoaXMuYXBwbHlNb2JpbGVWaWV3Rm9ySXRlbXMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYXBwbHlEZXNrdG9wVmlld0ZvclVzZXJJbmZvKCk7XHJcbiAgICAgIHRoaXMuYXBwbHlEZXNrdG9wVmlld0Zvckl0ZW1zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlNb2JpbGVWaWV3Rm9yVXNlckluZm8oKSB7XHJcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMudXNlckluZm9Db250YWluZXIsIG51bGwpO1xyXG4gICAgdGhpcy5tb2JpbGVDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLnVzZXJJbmZvRGl2aWRlciwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlEZXNrdG9wVmlld0ZvclVzZXJJbmZvKCkge1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy51c2VySW5mb0NvbnRhaW5lciwgbnVsbCk7XHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLnVzZXJJbmZvRGl2aWRlciwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlNb2JpbGVWaWV3Rm9ySXRlbXMoKSB7XHJcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMuaXRlbXNDb250YWluZXIsIG51bGwpO1xyXG5cclxuICAgIGZvciAoY29uc3QgaXRlbUVsZW1lbnQgb2YgdGhpcy5pdGVtc0NvbnRhaW5lci5jaGlsZHJlbikge1xyXG4gICAgICBpdGVtRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZD8uY2xhc3NMaXN0LnJlcGxhY2UoJ2Ryb3Bkb3duLWl0ZW0nLCAnbmF2LWxpbmsnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseURlc2t0b3BWaWV3Rm9ySXRlbXMoKSB7XHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLml0ZW1zQ29udGFpbmVyLCBudWxsKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGl0ZW1FbGVtZW50IG9mIHRoaXMuaXRlbXNDb250YWluZXIuY2hpbGRyZW4pIHtcclxuICAgICAgaXRlbUVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ/LmNsYXNzTGlzdC5yZXBsYWNlKCduYXYtbGluaycsICdkcm9wZG93bi1pdGVtJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY2xlYXJJdGVtc0NvbnRhaW5lcigpIHtcclxuICAgIHdoaWxlICh0aGlzLml0ZW1zQ29udGFpbmVyLmZpcnN0Q2hpbGQpIHtcclxuICAgICAgdGhpcy5pdGVtc0NvbnRhaW5lci5maXJzdENoaWxkLnJlbW92ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRJdGVtQ2xpY2soZTogVXNlck1lbnVJdGVtQ2xpY2tFdmVudCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5vbkl0ZW1DbGljaz8uKGUpO1xyXG4gICAgICBlLml0ZW0uT25DbGljaz8uKGUpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpIHtcclxuICAgIHRoaXMuc3dpdGNoVmlldyh0aGlzLmlzTW9iaWxlVmlldyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uTWVudUl0ZW1DbGljayhlOiBVc2VyTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0aGlzLmVtaXRJdGVtQ2xpY2soZSk7XHJcblxyXG4gICAgaWYgKGUuY2FuY2VsKSB7XHJcbiAgICAgIGUub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSVJlbmRlcmVkIH0gZnJvbSAnLi4vQ29yZSc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4uLy4uL0hlYWRlcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElNZW51SXRlbSB7XHJcbiAgdGV4dDogc3RyaW5nO1xyXG4gIGljb24/OiBzdHJpbmc7XHJcbiAgaXRlbXM/OiBJTWVudUl0ZW1bXTtcclxuICB1cmw/OiBzdHJpbmc7XHJcbiAgaGlkZGVuPzogYm9vbGVhbjtcclxuICBhY3RpdmU/OiBib29sZWFuO1xyXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcclxuICB0aXRsZT86IHN0cmluZztcclxuICBtZW51SXRlbUVsPzogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgb3JpZ2luYWxNb2RlbDogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsO1xyXG59XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGludGVyZmFjZS1uYW1lXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVudUl0ZW1DbGlja0V2ZW50IHtcclxuICByZWFkb25seSBpdGVtOiBJTWVudUl0ZW07XHJcbiAgcmVhZG9ubHkgb3JpZ2luYWxFdmVudDogVUlFdmVudDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTWVudU9wdGlvbnMge1xyXG4gIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgaXRlbXM6IElNZW51SXRlbVtdO1xyXG4gIG9uSXRlbUNsaWNrPzogKGU6IE1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1lbnUgaW1wbGVtZW50cyBJUmVuZGVyZWQge1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHByb3RlY3RlZCBpdGVtczogSU1lbnVJdGVtW107XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9uSXRlbUNsaWNrOiAoKGU6IE1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XHJcbiAgLy8gZWxlbWVudHNcclxuICBwcm90ZWN0ZWQgcm9vdDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElNZW51T3B0aW9ucykge1xyXG4gICAgdGhpcy5jb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcjtcclxuICAgIHRoaXMuaXRlbXMgPSBvcHRpb25zLml0ZW1zO1xyXG4gICAgdGhpcy5vbkl0ZW1DbGljayA9IG9wdGlvbnMub25JdGVtQ2xpY2s7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWJzdHJhY3QgcmVuZGVyKCk6IHZvaWQ7XHJcbiAgcHVibGljIHVwZGF0ZUl0ZW1zKGl0ZW1zOiBJTWVudUl0ZW1bXSkge1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRJdGVtQ2xpY2soZTogTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uSXRlbUNsaWNrPy4oZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBNZW51LCBJTWVudU9wdGlvbnMsIElNZW51SXRlbSB9IGZyb20gJy4vTWVudSc7XHJcbmltcG9ydCB7IHRocm93UmVuZGVyRXJyb3IgfSBmcm9tICcuLi9Db3JlJztcclxuaW1wb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIFdpbmRvd1Jlc2l6ZUxpc3RlbmVyLCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cyB9IGZyb20gJy4uLy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwsIGlzSXRlbUFjdGl2ZSB9IGZyb20gJy4uLy4uL0hlYWRlcic7XHJcblxyXG5leHBvcnQgZW51bSBDb2xsYXBzaW5nTW9kZSB7XHJcbiAgRGlzYWJsZWQsXHJcbiAgQ29sbGFwc2VkLFxyXG4gIEV4cGFuZGVkLFxyXG4gIEFkYXB0aXZlQ29sbGFwc2luZ1xyXG59XHJcblxyXG50eXBlIEl0ZW1BY3Rpb25Nb2RlID0gJ2hvdmVyJyB8ICdjbGljayc7XHJcbmV4cG9ydCBpbnRlcmZhY2UgSUJvb3RzdHJhcENvbGxhcHNpbmdNZW51T3B0aW9ucyBleHRlbmRzIElNZW51T3B0aW9ucyB7XHJcbiAgaXRlbUFjdGlvbj86IEl0ZW1BY3Rpb25Nb2RlO1xyXG4gIGNvbGxhcHNpbmdNb2RlPzogQ29sbGFwc2luZ01vZGU7XHJcbiAgY29sbGFwc2VCcmVha3BvaW50PzogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgY29sbGFwc2VJY29uPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUgZXh0ZW5kcyBNZW51IHtcclxuICBwcm90ZWN0ZWQgc3RhdGljIEhPVkVSX01PREVfQ1NTX0NMQVNTID0gJ25hdmJhci1uYXZfaG92ZXItYWN0aW9uJztcclxuICBwcm90ZWN0ZWQgc3RhdGljIGFkYXB0aXZpdHlDb2xsYXBzaW5nRGVsYXkgPSA1MDtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXRlbUFjdGlvbk1vZGU6IEl0ZW1BY3Rpb25Nb2RlO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBjb2xsYXBzaW5nTW9kZTogQ29sbGFwc2luZ01vZGU7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbGxhcHNlSWNvbk5hbWU6IHN0cmluZztcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29sbGFwc2VCcmVha3BvaW50OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgd2luZG93UmVzaXplTGlzdGVuZXI6IFdpbmRvd1Jlc2l6ZUxpc3RlbmVyO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBvbldpbmRvd1Jlc2l6ZUV2ZW50SGFuZGxlciA9IHRoaXMub25XaW5kb3dSZXNpemUuYmluZCh0aGlzKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25Ub2dnbGVEcm9wZG93bkJ1dHRvbkNsaWNrSGFuZGxlciA9IHRoaXMub25Ub2dnbGVEcm9wZG93bkJ1dHRvbkNsaWNrLmJpbmQodGhpcyk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9uVG9nZ2xlRHJvcGRvd25CdXR0b25Nb3VzZUVudGVySGFuZGxlciA9IHRoaXMub25Ub2dnbGVEcm9wZG93bkJ1dHRvbk1vdXNlRW50ZXIuYmluZCh0aGlzKTtcclxuICAvLyBlbGVtZW50c1xyXG4gIHByb3RlY3RlZCBjb2xsYXBzZVJvb3Q6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByb3RlY3RlZCBjb2xsYXBzZUJ1dHRvbjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJvdGVjdGVkIGNvbGxhcHNlRHJvcGRvd246IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByb3RlY3RlZCBjdXJyZW50T3BlbmluZ1N1Yk1lbnU6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJQm9vdHN0cmFwQ29sbGFwc2luZ01lbnVPcHRpb25zKSB7XHJcbiAgICBzdXBlcihvcHRpb25zKTtcclxuXHJcbiAgICB0aGlzLml0ZW1BY3Rpb25Nb2RlID0gb3B0aW9ucy5pdGVtQWN0aW9uIHx8ICdob3Zlcic7XHJcbiAgICB0aGlzLmNvbGxhcHNpbmdNb2RlID0gb3B0aW9ucy5jb2xsYXBzaW5nTW9kZSA/PyBDb2xsYXBzaW5nTW9kZS5BZGFwdGl2ZUNvbGxhcHNpbmc7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludCA9IG9wdGlvbnMuY29sbGFwc2VCcmVha3BvaW50IHx8IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzLm1kO1xyXG4gICAgdGhpcy5jb2xsYXBzZUljb25OYW1lID0gb3B0aW9ucy5jb2xsYXBzZUljb24gfHwgJ2ZhLWVsbGlwc2lzLXYnO1xyXG5cclxuICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBuZXcgV2luZG93UmVzaXplTGlzdGVuZXIoXHJcbiAgICAgIHRoaXMuY29sbGFwc2luZ01vZGUgPT09IENvbGxhcHNpbmdNb2RlLkFkYXB0aXZlQ29sbGFwc2luZyA/IHRoaXMub25XaW5kb3dSZXNpemVFdmVudEhhbmRsZXIgOiB1bmRlZmluZWQsXHJcbiAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuYWRhcHRpdml0eUNvbGxhcHNpbmdEZWxheVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBpZiAodGhpcy5yb290KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlclJvb3QoKTtcclxuICAgIHRoaXMucmVuZGVySXRlbXMoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5yb290KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVJdGVtcyhpdGVtczogSU1lbnVJdGVtW10pIHtcclxuICAgIHN1cGVyLnVwZGF0ZUl0ZW1zKGl0ZW1zKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucm9vdCkge1xyXG4gICAgICByZXR1cm4gbmV3IEVycm9yKCdUaGUgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUgaXNuXFwndCByZW5kZXJlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHdoaWxlICh0aGlzLnJvb3QuZmlyc3RDaGlsZCkge1xyXG4gICAgICB0aGlzLnJvb3QuZmlyc3RDaGlsZC5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlckl0ZW1zKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpIHtcclxuICAgIGlmICh0aGlzLmNvbGxhcHNpbmdNb2RlICE9PSBDb2xsYXBzaW5nTW9kZS5BZGFwdGl2ZUNvbGxhcHNpbmdcclxuICAgICAgfHwgIXRoaXMucm9vdCB8fCAhdGhpcy5pdGVtcy5sZW5ndGggfHwgIXRoaXMuY29sbGFwc2VSb290IHx8ICF0aGlzLmNvbGxhcHNlRHJvcGRvd24pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzTmVlZENvbGxhcHNlKCkpIHtcclxuICAgICAgdGhpcy5jb2xsYXBzZVJvb3QuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7XHJcblxyXG4gICAgICBkbyB7XHJcbiAgICAgICAgY29uc3QgbGFzdEl0ZW1FbGVtZW50ID0gdGhpcy5yb290LmNoaWxkcmVuW3RoaXMucm9vdC5jaGlsZHJlbi5sZW5ndGggLSAyXTtcclxuICAgICAgICBpZiAoIWxhc3RJdGVtRWxlbWVudCkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1vdmVSb290SXRlbXNUb0NvbGxhcHNlRHJvcGRvd24obGFzdEl0ZW1FbGVtZW50KTtcclxuICAgICAgfSB3aGlsZSAodGhpcy5pc05lZWRDb2xsYXBzZSgpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHdoaWxlICh0aGlzLmNvbGxhcHNlRHJvcGRvd24uY2hpbGRyZW4ubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5tb3ZlUm9vdEl0ZW1zVG9Sb290KHRoaXMuY29sbGFwc2VEcm9wZG93bi5maXJzdEVsZW1lbnRDaGlsZCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzTmVlZENvbGxhcHNlKCkpIHtcclxuICAgICAgICAgIGNvbnN0IGxhc3RJdGVtRWxlbWVudCA9IHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLnJvb3QuY2hpbGRyZW4ubGVuZ3RoIC0gMl07XHJcbiAgICAgICAgICBsYXN0SXRlbUVsZW1lbnQgJiYgdGhpcy5tb3ZlUm9vdEl0ZW1zVG9Db2xsYXBzZURyb3Bkb3duKGxhc3RJdGVtRWxlbWVudCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5jb2xsYXBzZURyb3Bkb3duLmNoaWxkcmVuLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuY29sbGFwc2VSb290LmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpIHtcclxuICAgIHRoaXMuZm9yRWFjaE1lbnVJdGVtUmVjdXJzaXZlKHRoaXMuaXRlbXMsIChpdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IG9sZEFjdGl2ZVZhbHVlID0gaXRlbS5hY3RpdmU7XHJcbiAgICAgIGl0ZW0uYWN0aXZlID0gaXNJdGVtQWN0aXZlKGl0ZW0ub3JpZ2luYWxNb2RlbCk7XHJcblxyXG4gICAgICBpZiAoaXRlbS5hY3RpdmUgIT09IG9sZEFjdGl2ZVZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5hcHBseVN0YXRlc1RvSXRlbUVsZW1lbnQoaXRlbS5tZW51SXRlbUVsLmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50LCBpdGVtKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2VPcGVuZWREcm9wZG93bih0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgaWYgKHRoaXMuaXRlbUFjdGlvbk1vZGUgPT09ICdob3ZlcicpIHtcclxuICAgICAgLy9OT1RFOiBGb3IgY2xvc2luZyBvcGVuZWQgZHJvcGRvd25cclxuICAgICAgdGhpcy5yb290LmNsYXNzTGlzdC5yZW1vdmUoQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuSE9WRVJfTU9ERV9DU1NfQ0xBU1MpO1xyXG4gICAgICAkKHRhcmdldEVsZW1lbnQpLm9uZSgnbW91c2VsZWF2ZScsICgpID0+IHtcclxuICAgICAgICB0aGlzLnJvb3QuY2xhc3NMaXN0LmFkZChCb290c3RyYXBDb2xsYXBzaW5nTWVudS5IT1ZFUl9NT0RFX0NTU19DTEFTUyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGZvckVhY2hNZW51SXRlbVJlY3Vyc2l2ZShyb290SXRlbXM6IElNZW51SXRlbVtdLCBhY3Rpb246IChpdGVtOiBJTWVudUl0ZW0pID0+IHZvaWQpIHtcclxuICAgIHJvb3RJdGVtcy5mb3JFYWNoKChpKSA9PiB7XHJcbiAgICAgIGFjdGlvbihpKTtcclxuICAgICAgaWYgKHRoaXMuaXNOZXN0ZWRJdGVtc093bmVySXRlbShpKSkge1xyXG4gICAgICAgIHRoaXMuZm9yRWFjaE1lbnVJdGVtUmVjdXJzaXZlKGkuaXRlbXMsIGFjdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlclJvb3QoKSB7XHJcbiAgICB0aGlzLnJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xyXG4gICAgdGhpcy5yb290LmNsYXNzTGlzdC5hZGQoJ25hdmJhci1uYXYnLCAnbXItYXV0bycpO1xyXG4gICAgaWYgKHRoaXMuaXRlbUFjdGlvbk1vZGUgPT09ICdob3ZlcicpIHtcclxuICAgICAgdGhpcy5yb290LmNsYXNzTGlzdC5hZGQoQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuSE9WRVJfTU9ERV9DU1NfQ0xBU1MpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlckl0ZW1zKCkge1xyXG4gICAgdGhpcy5yZW5kZXJSb290SXRlbXMoKTtcclxuXHJcbiAgICBpZiAodGhpcy5pdGVtcy5sZW5ndGggJiYgdGhpcy5jb2xsYXBzaW5nTW9kZSAhPT0gQ29sbGFwc2luZ01vZGUuRGlzYWJsZWQpIHtcclxuICAgICAgaWYgKCF0aGlzLnJvb3QpIHtcclxuICAgICAgICB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMucm9vdC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XHJcbiAgICAgIHRoaXMucmVuZGVyQ29sbGFwc2VFbGVtZW50cygpO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmFwcGx5QWRhcHRpdml0eUNvbGxhcHNpbmcoKTtcclxuICAgICAgICB0aGlzLnJvb3Quc3R5bGUudmlzaWJpbGl0eSA9ICcnO1xyXG4gICAgICB9LCAxMCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jaGFuZ2VEZWZhdWx0RHJvcGRvd25CZWhhdmlvckZvck5lc3RlZERyb3Bkb3duKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY2hhbmdlRGVmYXVsdERyb3Bkb3duQmVoYXZpb3JGb3JOZXN0ZWREcm9wZG93bigpIHtcclxuICAgICQodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wZG93bicpKS5vbignaGlkZS5icy5kcm9wZG93bicsIChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGUudGFyZ2V0ICE9PSB0aGlzLmN1cnJlbnRPcGVuaW5nU3ViTWVudSAmJiBlLnRhcmdldC5jb250YWlucyh0aGlzLmN1cnJlbnRPcGVuaW5nU3ViTWVudSk7XHJcblxyXG4gICAgICByZXR1cm4gIXJlc3VsdDtcclxuICAgIH0pO1xyXG5cclxuICAgICQodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wZG93bi1zdWJtZW51JykpLm9uKCdzaG93LmJzLmRyb3Bkb3duJywgKGUpID0+IHtcclxuICAgICAgdGhpcy5jdXJyZW50T3BlbmluZ1N1Yk1lbnUgPSB1bmRlZmluZWQ7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZW5kZXJDb2xsYXBzZUVsZW1lbnRzKCkge1xyXG4gICAgaWYgKCF0aGlzLnJvb3QpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ3Jvb3QnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNvbGxhcHNlUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlUm9vdC5jbGFzc0xpc3QuYWRkKCduYXYtaXRlbScsICdkcm9wZG93bicsICdjb2xsYXBzaW5nLW1lbnVfX2NvbGxhcHNlLXJvb3QnKTtcclxuXHJcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24nLCAnYnRuJywgJ2J0bi1vdXRsaW5lLWxpZ2h0Jyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uLnNldEF0dHJpYnV0ZSgndHlwZScsICdidXR0b24nKTtcclxuICAgIHRoaXMuY29sbGFwc2VCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLXRvZ2dsZScsICdkcm9wZG93bicpO1xyXG5cclxuICAgIGNvbnN0IGljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJyk7XHJcbiAgICBpY29uLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24taWNvbicsICdmYXMnLCB0aGlzLmNvbGxhcHNlSWNvbk5hbWUpO1xyXG5cclxuICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlRHJvcGRvd24uY2xhc3NMaXN0LmFkZCgnZHJvcGRvd24tbWVudScsICdkcm9wZG93bi1tZW51LXJpZ2h0Jyk7XHJcblxyXG4gICAgdGhpcy5jb2xsYXBzZUJ1dHRvbi5hcHBlbmRDaGlsZChpY29uKTtcclxuICAgIHRoaXMuY29sbGFwc2VSb290LmFwcGVuZENoaWxkKHRoaXMuY29sbGFwc2VCdXR0b24pO1xyXG4gICAgdGhpcy5jb2xsYXBzZVJvb3QuYXBwZW5kQ2hpbGQodGhpcy5jb2xsYXBzZURyb3Bkb3duKTtcclxuXHJcbiAgICB0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5jb2xsYXBzZVJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlclJvb3RJdGVtcygpIHtcclxuICAgIGlmICghdGhpcy5yb290KSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGxldCBjb250ZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmlzTmVzdGVkSXRlbXNPd25lckl0ZW0oaXRlbSkpIHtcclxuICAgICAgICBjb250ZW50ID0gdGhpcy5jcmVhdGVSb290SXRlbVdpdGhOZXN0ZWRJdGVtcyhpdGVtIGFzIElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnRlbnQgPSB0aGlzLmNyZWF0ZVJvb3RJdGVtRWxlbWVudChpdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5yb290IS5hcHBlbmRDaGlsZChjb250ZW50KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVJvb3RJdGVtV2l0aE5lc3RlZEl0ZW1zKGl0ZW06IElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pIHtcclxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVSb290SXRlbUVsZW1lbnQoaXRlbSk7XHJcbiAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bicpO1xyXG5cclxuICAgIGNvbnN0IGl0ZW1Db250ZW50ID0gaXRlbUVsZW1lbnQucXVlcnlTZWxlY3RvcignLm5hdi1saW5rJyk7XHJcbiAgICBpdGVtQ29udGVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRoaXMuc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudCk7XHJcblxyXG4gICAgY29uc3QgZHJvcGRvd25NZW51RWxlbWVudCA9IHRoaXMuY3JlYXRlRHJvcGRvd25NZW51KGl0ZW0pO1xyXG4gICAgaXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25NZW51RWxlbWVudCk7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVJvb3RJdGVtRWxlbWVudChpdGVtOiBJTWVudUl0ZW0pIHtcclxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcclxuICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ25hdi1pdGVtJyk7XHJcbiAgICBpdGVtLnRpdGxlICYmIGl0ZW1FbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCBpdGVtLnRpdGxlKTtcclxuXHJcbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGl0ZW1Db250ZW50LmNsYXNzTGlzdC5hZGQoJ25hdi1saW5rJyk7XHJcbiAgICBpdGVtQ29udGVudC5ocmVmID0gaXRlbS51cmwgfHwgJ2phdmFzY3JpcHQ6dm9pZCgwKSc7XHJcbiAgICBpdGVtQ29udGVudC50ZXh0ID0gaXRlbS50ZXh0O1xyXG5cclxuICAgIGNvbnN0IGljb25FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtSWNvbkVsZW1lbnQoaXRlbSk7XHJcbiAgICBpY29uRWxlbWVudCAmJiBpdGVtQ29udGVudC5pbnNlcnRCZWZvcmUoaWNvbkVsZW1lbnQsIGl0ZW1Db250ZW50LmZpcnN0Q2hpbGQpO1xyXG5cclxuICAgIHRoaXMuYXBwbHlTdGF0ZXNUb0l0ZW1FbGVtZW50KGl0ZW1Db250ZW50LCBpdGVtKTtcclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzVG9JdGVtKGl0ZW1Db250ZW50LCBpdGVtKTtcclxuXHJcbiAgICBpdGVtRWxlbWVudC5hcHBlbmRDaGlsZChpdGVtQ29udGVudCk7XHJcblxyXG4gICAgaXRlbS5tZW51SXRlbUVsID0gaXRlbUVsZW1lbnQ7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZU5lc3RlZFN1Yk1lbnVJdGVtRWxlbWVudChpdGVtOiBJTWVudUl0ZW0gJiB7IGl0ZW1zOiBJTWVudUl0ZW1bXSB9KSB7XHJcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IHRoaXMuY3JlYXRlTmVzdGVkSXRlbShpdGVtKTtcclxuICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duJywgJ2Ryb3Bkb3duLXN1Ym1lbnUnKTtcclxuXHJcbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGl0ZW1FbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kcm9wZG93bi1pdGVtJyk7XHJcbiAgICBpdGVtQ29udGVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRoaXMuc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudCk7XHJcblxyXG4gICAgY29uc3QgZHJvcGRvd25NZW51RWxlbWVudCA9IHRoaXMuY3JlYXRlRHJvcGRvd25NZW51KGl0ZW0pO1xyXG4gICAgaXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25NZW51RWxlbWVudCk7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZU5lc3RlZEl0ZW0oaXRlbTogSU1lbnVJdGVtKSB7XHJcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICBpdGVtLnRpdGxlICYmIGl0ZW1FbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCBpdGVtLnRpdGxlKTtcclxuXHJcbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGl0ZW1Db250ZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLWl0ZW0nKTtcclxuICAgIGl0ZW1Db250ZW50LmhyZWYgPSBpdGVtLnVybCB8fCAnamF2YXNjcmlwdDp2b2lkKDApJztcclxuICAgIGl0ZW1Db250ZW50LnRleHQgPSBpdGVtLnRleHQ7XHJcblxyXG4gICAgY29uc3QgaWNvbkVsZW1lbnQgPSB0aGlzLmNyZWF0ZUl0ZW1JY29uRWxlbWVudChpdGVtKTtcclxuICAgIGljb25FbGVtZW50ICYmIGl0ZW1Db250ZW50Lmluc2VydEJlZm9yZShpY29uRWxlbWVudCwgaXRlbUNvbnRlbnQuZmlyc3RDaGlsZCk7XHJcblxyXG4gICAgdGhpcy5hcHBseVN0YXRlc1RvSXRlbUVsZW1lbnQoaXRlbUNvbnRlbnQsIGl0ZW0pO1xyXG4gICAgdGhpcy5hdHRhY2hFdmVudHNUb0l0ZW0oaXRlbUNvbnRlbnQsIGl0ZW0pO1xyXG5cclxuICAgIGl0ZW1FbGVtZW50LmFwcGVuZENoaWxkKGl0ZW1Db250ZW50KTtcclxuXHJcbiAgICBpdGVtLm1lbnVJdGVtRWwgPSBpdGVtRWxlbWVudDtcclxuXHJcbiAgICByZXR1cm4gaXRlbUVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY3JlYXRlRHJvcGRvd25NZW51KGl0ZW06IElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pIHtcclxuICAgIGNvbnN0IGRyb3Bkb3duTWVudUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xyXG4gICAgZHJvcGRvd25NZW51RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1tZW51Jyk7XHJcblxyXG4gICAgaXRlbS5pdGVtcy5mb3JFYWNoKChuZXN0ZWRJdGVtKSA9PiB7XHJcbiAgICAgIGxldCBjb250ZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmlzTmVzdGVkSXRlbXNPd25lckl0ZW0obmVzdGVkSXRlbSkpIHtcclxuICAgICAgICBjb250ZW50ID0gdGhpcy5jcmVhdGVOZXN0ZWRTdWJNZW51SXRlbUVsZW1lbnQobmVzdGVkSXRlbSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29udGVudCA9IHRoaXMuY3JlYXRlTmVzdGVkSXRlbShuZXN0ZWRJdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZHJvcGRvd25NZW51RWxlbWVudC5hcHBlbmRDaGlsZChjb250ZW50KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBkcm9wZG93bk1lbnVFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZUl0ZW1JY29uRWxlbWVudChpdGVtOiBJTWVudUl0ZW0pIHtcclxuICAgIGlmICghaXRlbS5pY29uKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGl0ZW1JY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xyXG4gICAgaXRlbUljb24uc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYHVybCgke2l0ZW0uaWNvbn0pYDtcclxuXHJcbiAgICByZXR1cm4gaXRlbUljb247XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgIGl0ZW1Db250ZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLXRvZ2dsZScpO1xyXG4gICAgaXRlbUNvbnRlbnQuc2V0QXR0cmlidXRlKCdkYXRhLXRvZ2dsZScsICdkcm9wZG93bicpO1xyXG4gICAgaXRlbUNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uVG9nZ2xlRHJvcGRvd25CdXR0b25DbGlja0hhbmRsZXIpO1xyXG4gICAgaXRlbUNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHRoaXMub25Ub2dnbGVEcm9wZG93bkJ1dHRvbk1vdXNlRW50ZXJIYW5kbGVyKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseVN0YXRlc1RvSXRlbUVsZW1lbnQoaXRlbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBpdGVtOiBJTWVudUl0ZW0pIHtcclxuICAgIGlmIChpdGVtLmFjdGl2ZSkge1xyXG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpdGVtLmhpZGRlbikge1xyXG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkLW5vbmUnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpdGVtLmRpc2FibGVkKSB7XHJcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkaXNhYmxlZCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGF0dGFjaEV2ZW50c1RvSXRlbShpdGVtRWxlbWVudDogSFRNTEVsZW1lbnQsIGl0ZW06IElNZW51SXRlbSkge1xyXG4gICAgaXRlbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4gdGhpcy5lbWl0SXRlbUNsaWNrKHtcclxuICAgICAgaXRlbSxcclxuICAgICAgb3JpZ2luYWxFdmVudDogZVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGlzTmVzdGVkSXRlbXNPd25lckl0ZW0oaXRlbTogSU1lbnVJdGVtKTogaXRlbSBpcyBJTWVudUl0ZW0gJiB7IGl0ZW1zOiBJTWVudUl0ZW1bXSB9IHtcclxuICAgIHJldHVybiBpdGVtLml0ZW1zICYmIGl0ZW0uaXRlbXMubGVuZ3RoICYmIGl0ZW0uaXRlbXMuc29tZSgoaSkgPT4gIWkuaGlkZGVuKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBtb3ZlUm9vdEl0ZW1zVG9Db2xsYXBzZURyb3Bkb3duKHJvb3RJdGVtT3JJdGVtczogRWxlbWVudCB8IEl0ZXJhYmxlPEVsZW1lbnQ+KTogdm9pZCB7XHJcbiAgICBpZiAocm9vdEl0ZW1Pckl0ZW1zIGluc3RhbmNlb2YgRWxlbWVudCkge1xyXG4gICAgICB0aGlzLmFwcGx5Q29sbGFwc2luZ1ZpZXdGb3JSb290SXRlbShyb290SXRlbU9ySXRlbXMpO1xyXG4gICAgICB0aGlzLmNvbGxhcHNlRHJvcGRvd24uaW5zZXJ0QmVmb3JlKHJvb3RJdGVtT3JJdGVtcywgdGhpcy5jb2xsYXBzZURyb3Bkb3duLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRlbXBJdGVtRWxlbWVudHNTdG9yZSA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuXHJcbiAgICAgIGZvciAoY29uc3Qgcm9vdEl0ZW0gb2Ygcm9vdEl0ZW1Pckl0ZW1zKSB7XHJcbiAgICAgICAgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmluc2VydEJlZm9yZShyb290SXRlbSwgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgICAgICB0aGlzLmFwcGx5Q29sbGFwc2luZ1ZpZXdGb3JSb290SXRlbShyb290SXRlbSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY29sbGFwc2VEcm9wZG93bi5hcHBlbmRDaGlsZCh0ZW1wSXRlbUVsZW1lbnRzU3RvcmUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG1vdmVSb290SXRlbXNUb1Jvb3Qocm9vdEl0ZW1Pckl0ZW1zOiBFbGVtZW50IHwgSXRlcmFibGU8RWxlbWVudD4pOiB2b2lkIHtcclxuICAgIGlmIChyb290SXRlbU9ySXRlbXMgaW5zdGFuY2VvZiBFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuYXBwbHlFeHBhbmRlZFZpZXdGb3JSb290SXRlbShyb290SXRlbU9ySXRlbXMpO1xyXG4gICAgICB0aGlzLnJvb3QuaW5zZXJ0QmVmb3JlKHJvb3RJdGVtT3JJdGVtcywgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMucm9vdC5jaGlsZHJlbi5sZW5ndGggLSAxXSB8fCBudWxsKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRlbXBJdGVtRWxlbWVudHNTdG9yZSA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuXHJcbiAgICAgIGZvciAoY29uc3Qgcm9vdEl0ZW0gb2Ygcm9vdEl0ZW1Pckl0ZW1zKSB7XHJcbiAgICAgICAgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmluc2VydEJlZm9yZShyb290SXRlbSwgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgICAgICB0aGlzLmFwcGx5RXhwYW5kZWRWaWV3Rm9yUm9vdEl0ZW0ocm9vdEl0ZW0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGVtcEl0ZW1FbGVtZW50c1N0b3JlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseUNvbGxhcHNpbmdWaWV3Rm9yUm9vdEl0ZW0ocm9vdEl0ZW06IEVsZW1lbnQpIHtcclxuICAgIHJvb3RJdGVtLmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLXN1Ym1lbnUnKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHJvb3RJdGVtLmNoaWxkcmVuKSB7XHJcbiAgICAgIGNoaWxkLmNsYXNzTGlzdC5yZXBsYWNlKCduYXYtbGluaycsICdkcm9wZG93bi1pdGVtJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlFeHBhbmRlZFZpZXdGb3JSb290SXRlbShyb290SXRlbTogRWxlbWVudCkge1xyXG4gICAgcm9vdEl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgnZHJvcGRvd24tc3VibWVudScpO1xyXG5cclxuICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygcm9vdEl0ZW0uY2hpbGRyZW4pIHtcclxuICAgICAgY2hpbGQuY2xhc3NMaXN0LnJlcGxhY2UoJ2Ryb3Bkb3duLWl0ZW0nLCAnbmF2LWxpbmsnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBpc05lZWRDb2xsYXBzZSgpIHtcclxuICAgIGlmICh0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1pbldpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWluV2lkdGgpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucm9vdC5zdHlsZS5tYXhXaWR0aCA9ICdub25lJztcclxuICAgIGNvbnN0IGN1cnJlbnRSb290UmVjdCA9IHRoaXMucm9vdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIHRoaXMucm9vdC5jbGFzc0xpc3QuYWRkKCdjb2xsYXBzaW5nLW1lbnVfbm9ybWFsLXdoaXRlLXNwYWNlJyk7XHJcblxyXG4gICAgY29uc3Qgbm9ybWFsUm9vdFJlY3QgPSB0aGlzLnJvb3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICB0aGlzLnJvb3QuY2xhc3NMaXN0LnJlbW92ZSgnY29sbGFwc2luZy1tZW51X25vcm1hbC13aGl0ZS1zcGFjZScpO1xyXG4gICAgdGhpcy5yb290LnN0eWxlLm1heFdpZHRoID0gJyc7XHJcblxyXG4gICAgcmV0dXJuIGN1cnJlbnRSb290UmVjdC53aWR0aCA+IG5vcm1hbFJvb3RSZWN0LndpZHRoO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGlzRHJvcGRvd25SZWN0c0ludGVyc2VjdChkcm9wZG93blJlY3QxOiBDbGllbnRSZWN0LCBkcm9wZG93blJlY3QyOiBDbGllbnRSZWN0LCBkZWx0YSA9IDIpIHtcclxuICAgIHJldHVybiBkcm9wZG93blJlY3QxLmxlZnQgPCAoZHJvcGRvd25SZWN0Mi5yaWdodCAtIGRlbHRhKSAmJiAoZHJvcGRvd25SZWN0Mi5sZWZ0ICsgZGVsdGEpIDwgZHJvcGRvd25SZWN0MS5yaWdodFxyXG4gICAgICAmJiBkcm9wZG93blJlY3QxLnRvcCA8IChkcm9wZG93blJlY3QyLmJvdHRvbSAtIGRlbHRhKSAmJiAoZHJvcGRvd25SZWN0Mi50b3AgKyBkZWx0YSkgPCBkcm9wZG93blJlY3QxLmJvdHRvbTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseVNoYWRvd3NGb3JPdmVybGFwaW5nRHJvcGRvd25JZk5lZWRlZChvcGVuZWREcm9wZG93bkVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAvLyBSZXNldCB0aGUgc3R5bGUgYmVmb3JlIHRoZSByZWN0IGdldHRpbmcgdG8gZ2V0IHJlYWwgdmFsdWVzXHJcbiAgICBvcGVuZWREcm9wZG93bkVsZW1lbnQuc3R5bGUubGVmdCA9ICcnO1xyXG4gICAgb3BlbmVkRHJvcGRvd25FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Ryb3Bkb3duLW1lbnUtbGVmdC1zaGFkb3dlZCcpO1xyXG4gICAgbGV0IHJlY3QgPSBvcGVuZWREcm9wZG93bkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBpZiAocmVjdC5yaWdodCA+IHdpbmRvdy5pbm5lcldpZHRoKSB7XHJcbiAgICAgIG9wZW5lZERyb3Bkb3duRWxlbWVudC5zdHlsZS5sZWZ0ID0gYC0ke3JlY3Qud2lkdGh9cHhgO1xyXG4gICAgfVxyXG5cclxuICAgIHJlY3QgPSBvcGVuZWREcm9wZG93bkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCBkcm9wZG93bkVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRyb3Bkb3duLW1lbnUnKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGRyb3Bkb3duRWxlbWVudCBvZiBkcm9wZG93bkVsZW1lbnRzKSB7XHJcbiAgICAgIGlmIChkcm9wZG93bkVsZW1lbnQgPT09IG9wZW5lZERyb3Bkb3duRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5pc0Ryb3Bkb3duUmVjdHNJbnRlcnNlY3QoZHJvcGRvd25FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCByZWN0KSkge1xyXG4gICAgICAgIG9wZW5lZERyb3Bkb3duRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1tZW51LWxlZnQtc2hhZG93ZWQnKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uV2luZG93UmVzaXplKGU6IFVJRXZlbnQpIHtcclxuICAgIHRoaXMuYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uVG9nZ2xlRHJvcGRvd25CdXR0b25DbGljayhlOiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAoZS50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBlLnRhcmdldC5wYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuY3VycmVudE9wZW5pbmdTdWJNZW51ID0gZS50YXJnZXQucGFyZW50RWxlbWVudDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvblRvZ2dsZURyb3Bkb3duQnV0dG9uTW91c2VFbnRlcihlOiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy53aW5kb3dSZXNpemVMaXN0ZW5lci5jdXJyZW50TGF5b3V0QnJlYWtwb2ludC5tYXhXaWR0aCA+PSB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludC5tYXhXaWR0aCAmJlxyXG4gICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50XHJcbiAgICAgICYmIGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZy5jbGFzc0xpc3QuY29udGFpbnMoJ2Ryb3Bkb3duLW1lbnUnKSkge1xyXG4gICAgICB0aGlzLmFwcGx5U2hhZG93c0Zvck92ZXJsYXBpbmdEcm9wZG93bklmTmVlZGVkKGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwgfSBmcm9tICcuL0lOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCc7XHJcbmltcG9ydCB7IGdldFVybEJ5TWVudUl0ZW1EYXRhLCBJTGF5b3V0QnJlYWtwb2ludCB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBCb290c3RyYXBDb2xsYXBzaW5nTWVudSB9IGZyb20gJy4uL0NvbXBvbmVudHMvTWVudSc7XHJcbmltcG9ydCB7IElNZW51SXRlbSwgTWVudUl0ZW1DbGlja0V2ZW50IH0gZnJvbSAnLi4vQ29tcG9uZW50cy9NZW51L01lbnUnO1xyXG5pbXBvcnQgeyBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4vU2VhcmNoJztcclxuXHJcbmNvbnN0IGZpbmRJdGVtQnlOYW1lUmVjdXJzaXZlbHkgPSAoaXRlbXM6IHJlYWRvbmx5IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFtdLCBpdGVtTmFtZTogc3RyaW5nKTogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsIHwgdW5kZWZpbmVkID0+IHtcclxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgIGlmIChpdGVtLk5hbWUgPT09IGl0ZW1OYW1lKSB7XHJcbiAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgfSBlbHNlIGlmIChpdGVtLkl0ZW1zPy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgbmVzdGVkSXRlbSA9IGZpbmRJdGVtQnlOYW1lUmVjdXJzaXZlbHkoaXRlbS5JdGVtcywgaXRlbU5hbWUpO1xyXG5cclxuICAgICAgaWYgKG5lc3RlZEl0ZW0pIHtcclxuICAgICAgICByZXR1cm4gbmVzdGVkSXRlbTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IGdldEl0ZW1VcmxzUmVjdXJzaXZlbHkgPSAoaXRlbURhdGE6IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCk6IHN0cmluZ1tdID0+IHtcclxuICBjb25zdCBpdGVtcyA9IGl0ZW1EYXRhLkl0ZW1zO1xyXG5cclxuICBpZiAoIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcclxuICAgIGNvbnN0IG93blVybCA9IGdldFVybEJ5TWVudUl0ZW1EYXRhKGl0ZW1EYXRhKTtcclxuXHJcbiAgICByZXR1cm4gb3duVXJsID8gW293blVybF0gOiBbXTtcclxuICB9XHJcblxyXG4gIGxldCB1cmxzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGl0ZW1zKSB7XHJcbiAgICB1cmxzID0gdXJscy5jb25jYXQoZ2V0SXRlbVVybHNSZWN1cnNpdmVseShjaGlsZCkpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHVybHM7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaXNJdGVtQWN0aXZlID0gKGl0ZW1EYXRhOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwpID0+IHtcclxuICBjb25zdCBjdXJyZW50TG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoO1xyXG4gIGNvbnN0IGl0ZW1VcmxzID0gZ2V0SXRlbVVybHNSZWN1cnNpdmVseShpdGVtRGF0YSk7XHJcblxyXG4gIGZvciAoY29uc3QgdXJsIG9mIGl0ZW1VcmxzKSB7XHJcbiAgICBjb25zdCB1cmxSZSA9IG5ldyBSZWdFeHAoYF4uKiR7dXJsLnJlcGxhY2UoJz8nLCAnXFxcXD8nKX0kYCk7XHJcblxyXG4gICAgaWYgKHVybFJlLnRlc3QoY3VycmVudExvY2F0aW9uKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBmYWxzZTtcclxufTtcclxuXHJcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogaW50ZXJmYWNlLW5hbWVcclxuZXhwb3J0IGludGVyZmFjZSBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50IHtcclxuICByZWFkb25seSBpdGVtOiBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbDtcclxuICByZWFkb25seSBvcmlnaW5hbEV2ZW50OiBVSUV2ZW50O1xyXG4gIGNhbmNlbD86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOYXZpZ2F0aW9uTWVudSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25OYXZpZ2F0aW9uTWVudUl0ZW1DbGljazogKChlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbk1lbnVJdGVtQ2xpY2tIYW5kbGVyID0gdGhpcy5vbk1lbnVJdGVtQ2xpY2suYmluZCh0aGlzKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IG1lbnU6IEJvb3RzdHJhcENvbGxhcHNpbmdNZW51O1xyXG4gIHByaXZhdGUgaXNHbG9iYWxNZW51OiBib29sZWFuO1xyXG4gIHByaXZhdGUgaXRlbXM6IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXHJcbiAgICBpdGVtczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10sXHJcbiAgICBpc0dsb2JhbE1lbnU6IGJvb2xlYW4sXHJcbiAgICBjb2xsYXBzZUJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50LFxyXG4gICAgb25OYXZpZ2F0aW9uTWVudUl0ZW1DbGljazogKGU6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQpID0+IHZvaWRcclxuICApIHtcclxuICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xyXG4gICAgdGhpcy5pc0dsb2JhbE1lbnUgPSBpc0dsb2JhbE1lbnUsXHJcbiAgICB0aGlzLml0ZW1zID0gaXRlbXM7XHJcbiAgICB0aGlzLm9uTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2sgPSBvbk5hdmlnYXRpb25NZW51SXRlbUNsaWNrO1xyXG4gICAgdGhpcy5tZW51ID0gbmV3IEJvb3RzdHJhcENvbGxhcHNpbmdNZW51KHtcclxuICAgICAgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lcixcclxuICAgICAgaXRlbXM6IHRoaXMubWFwTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxUb01lbnVJdGVtcyhpdGVtcyksXHJcbiAgICAgIGNvbGxhcHNlQnJlYWtwb2ludCxcclxuICAgICAgb25JdGVtQ2xpY2s6IHRoaXMub25NZW51SXRlbUNsaWNrSGFuZGxlclxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlRGF0YShpdGVtczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10sIGlzR2xvYmFsTWVudTogYm9vbGVhbikge1xyXG4gICAgLyogZXNsaW50IEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtZXhwcmVzc2lvbnM6IG9mZiAqL1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gICAgdGhpcy5pc0dsb2JhbE1lbnUgPSBpc0dsb2JhbE1lbnU7XHJcbiAgICB0aGlzLm1lbnUudXBkYXRlSXRlbXModGhpcy5tYXBOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFRvTWVudUl0ZW1zKHRoaXMuaXRlbXMpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICB0aGlzLm1lbnUucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpIHtcclxuICAgIHRoaXMubWVudS5hcHBseUFkYXB0aXZpdHlDb2xsYXBzaW5nKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpIHtcclxuICAgIHRoaXMubWVudS51cGRhdGVBY3RpdmVJdGVtc1N0YXRlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uTWVudUl0ZW1DbGljayhlOiBNZW51SXRlbUNsaWNrRXZlbnQpIHtcclxuICAgIGNvbnN0IGV2ZW50QXJncyA9IHRoaXMubWFwTWVudUl0ZW1DbGlja0V2ZW50QXJnc1RvTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2tFdmVudEFyZ3MoZSk7XHJcbiAgICBpZiAoZXZlbnRBcmdzKSB7XHJcbiAgICAgIHRoaXMuZW1pdE5hdmlnYXRpb25NZW51SXRlbUNsaWNrKGV2ZW50QXJncyk7XHJcblxyXG4gICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xyXG4gICAgICAgIGUub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXRFbCA9IGUub3JpZ2luYWxFdmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5tZW51LmNsb3NlT3BlbmVkRHJvcGRvd24odGFyZ2V0RWwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVtaXROYXZpZ2F0aW9uTWVudUl0ZW1DbGljayhlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2s/LihlKTtcclxuICAgICAgZS5pdGVtLk9uQ2xpY2s/LihlKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxUb01lbnVJdGVtcyhtZW51SXRlbU1vZGVsczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10pIHtcclxuICAgIHJldHVybiBtZW51SXRlbU1vZGVscy5tYXA8SU1lbnVJdGVtPigobWVudUl0ZW1Nb2RlbCkgPT4ge1xyXG4gICAgICBjb25zdCBtZW51SXRlbSA9IHtcclxuICAgICAgICB0ZXh0OiBtZW51SXRlbU1vZGVsLk5hbWUsXHJcbiAgICAgICAgaWNvbjogbWVudUl0ZW1Nb2RlbC5JY29uLFxyXG4gICAgICAgIGl0ZW1zOiBtZW51SXRlbU1vZGVsLkl0ZW1zID8gdGhpcy5tYXBOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFRvTWVudUl0ZW1zKG1lbnVJdGVtTW9kZWwuSXRlbXMpIDogdW5kZWZpbmVkLFxyXG4gICAgICAgIHVybDogZ2V0VXJsQnlNZW51SXRlbURhdGEobWVudUl0ZW1Nb2RlbCksXHJcbiAgICAgICAgaGlkZGVuOiBtZW51SXRlbU1vZGVsLlZpc2libGUgPT09IGZhbHNlLFxyXG4gICAgICAgIGFjdGl2ZTogaXNJdGVtQWN0aXZlKG1lbnVJdGVtTW9kZWwpLFxyXG4gICAgICAgIGRpc2FibGVkOiBtZW51SXRlbU1vZGVsLkRpc2FibGVkLFxyXG4gICAgICAgIHRpdGxlOiBtZW51SXRlbU1vZGVsLkRlc2NyaXB0aW9uLFxyXG4gICAgICAgIG9yaWdpbmFsTW9kZWw6IG1lbnVJdGVtTW9kZWxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJldHVybiBtZW51SXRlbTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXBNZW51SXRlbUNsaWNrRXZlbnRBcmdzVG9OYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50QXJncyhlOiBNZW51SXRlbUNsaWNrRXZlbnQpOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50IHwgbnVsbCB7XHJcbiAgICBjb25zdCBpdGVtID0gZmluZEl0ZW1CeU5hbWVSZWN1cnNpdmVseSh0aGlzLml0ZW1zLCBlLml0ZW0udGV4dCk7XHJcblxyXG4gICAgcmV0dXJuICFpdGVtID8gbnVsbCA6IHtcclxuICAgICAgb3JpZ2luYWxFdmVudDogZS5vcmlnaW5hbEV2ZW50LFxyXG4gICAgICBjYW5jZWw6IGZhbHNlLFxyXG4gICAgICBpdGVtOiB7IC4uLml0ZW0sIGlzR2xvYmFsOiB0aGlzLmlzR2xvYmFsTWVudSB9XHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGNvbnN0IExPR09fU0VUVElOR1NfQ0FDSEVfS0VZID0gJ2lzem9sZWEtdWl8bG9nby1zZXR0aW5ncyc7XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTG9nb1NldHRpbmdzIH0gZnJvbSAnLi4vRGF0YSc7XHJcbmltcG9ydCB7IExPR09fU0VUVElOR1NfQ0FDSEVfS0VZIH0gZnJvbSAnLi4vQ29uc3RhbnRzL0NhY2hlS2V5cyc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vRGF0YS9SZXF1ZXN0JztcclxuXHJcbmV4cG9ydCBjbGFzcyBMb2dvIHtcclxuICBwcml2YXRlIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgcHJpdmF0ZSAkaW1hZ2VFbGVtZW50OiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gIHByaXZhdGUgJHRpdGxlQ29udGFpbmVyOiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YVNvdXJjZTogSUxvZ29TZXR0aW5ncyB8IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IoJGNvbnRhaW5lcjogSlF1ZXJ5LCBkYXRhU291cmNlOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSAkY29udGFpbmVyO1xyXG4gICAgdGhpcy5kYXRhU291cmNlID0gZGF0YVNvdXJjZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0V2lkZ2V0KCk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luaXRXaWRnZXQodGhpcy5kYXRhU291cmNlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVEYXRhKCk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xyXG4gICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVkpO1xyXG4gICAgdGhpcy4kaW1hZ2VFbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgdGhpcy4kdGl0bGVDb250YWluZXIucmVtb3ZlKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2luaXRXaWRnZXQodGhpcy5kYXRhU291cmNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRXaWRnZXQoZGF0YVNvdXJjZTogSUxvZ29TZXR0aW5ncyB8IHN0cmluZyk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xyXG4gICAgY29uc3QgY2FjaGVkU2V0dGluZ3NSYXcgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShMT0dPX1NFVFRJTkdTX0NBQ0hFX0tFWSk7XHJcblxyXG4gICAgaWYgKGNhY2hlZFNldHRpbmdzUmF3KSB7XHJcbiAgICAgIHRoaXMuX2NyZWF0ZUxvZ28oSlNPTi5wYXJzZShjYWNoZWRTZXR0aW5nc1JhdykgYXMgSUxvZ29TZXR0aW5ncyk7XHJcblxyXG4gICAgICByZXR1cm4gJC5EZWZlcnJlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVMb2dvKGRhdGFTb3VyY2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlTG9nbyhkYXRhU291cmNlOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nKTogSlF1ZXJ5RGVmZXJyZWQ8YW55PiB7XHJcbiAgICBpZiAodHlwZW9mIGRhdGFTb3VyY2UgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIGNvbnN0IGxvZ29TZXR0aW5ncyA9IGRhdGFTb3VyY2UgYXMgSUxvZ29TZXR0aW5ncztcclxuXHJcbiAgICAgIHRoaXMuX2NyZWF0ZUxvZ29NYXJrdXAobG9nb1NldHRpbmdzKTtcclxuXHJcbiAgICAgIHJldHVybiAkLkRlZmVycmVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHRoaXMuZGF0YVNvdXJjZSBhcyBzdHJpbmcsICdwb3N0JykuZG9uZSgoZGF0YSkgPT4ge1xyXG4gICAgICBjb25zdCBsb2dvU2V0dGluZ3M6IElMb2dvU2V0dGluZ3MgPSB7fTtcclxuICAgICAgbG9nb1NldHRpbmdzLmFwcGxpY2F0aW9uTmFtZSA9IGRhdGEuQXBwbGljYXRpb25OYW1lO1xyXG4gICAgICBsb2dvU2V0dGluZ3MuYnVzaW5lc3NOYW1lID0gZGF0YS5CdXNpbmVzc05hbWU7XHJcbiAgICAgIGxvZ29TZXR0aW5ncy5sb2dvSW1hZ2UgPSBkYXRhLkxvZ29JbWFnZTtcclxuICAgICAgbG9nb1NldHRpbmdzLmxhbmRpbmdQYWdlTG9nbyA9IGRhdGEuTGFuZGluZ1BhZ2VMb2dvO1xyXG4gICAgICBsb2dvU2V0dGluZ3MuZGVzY3JpcHRpb24gPSBkYXRhLkRlc2NyaXB0aW9uO1xyXG5cclxuICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVksIEpTT04uc3RyaW5naWZ5KGxvZ29TZXR0aW5ncykpO1xyXG5cclxuICAgICAgdGhpcy5fY3JlYXRlTG9nb01hcmt1cChsb2dvU2V0dGluZ3MpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVMb2dvTWFya3VwKGxvZ29TZXR0aW5nczogSUxvZ29TZXR0aW5ncykge1xyXG4gICAgdGhpcy4kaW1hZ2VFbGVtZW50ID0gJCgnPGltZyAvPicpLmF0dHIoJ3NyYycsIGxvZ29TZXR0aW5ncy5sb2dvSW1hZ2UpLmFwcGVuZFRvKHRoaXMuJGNvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy4kdGl0bGVDb250YWluZXIgPSAkKCc8c3BhbiAvPicpLmFkZENsYXNzKCd0aXRsZS1jb250YWluZXInKS5hcHBlbmRUbyh0aGlzLiRjb250YWluZXIpO1xyXG5cclxuICAgIHRoaXMuJHRpdGxlQ29udGFpbmVyLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2J1c2luZXNzLW5hbWUnKS50ZXh0KGxvZ29TZXR0aW5ncy5idXNpbmVzc05hbWUpKTtcclxuICAgIHRoaXMuJHRpdGxlQ29udGFpbmVyLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2FwcC1uYW1lJykudGV4dChsb2dvU2V0dGluZ3MuYXBwbGljYXRpb25OYW1lLnRvVXBwZXJDYXNlKCkpKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElEZXN0cm95YWJsZSwgSVJlbmRlcmVkIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHsgV2luZG93UmVzaXplTGlzdGVuZXIsIElMYXlvdXRCcmVha3BvaW50LCBMYXlvdXRCcmVha3BvaW50Q2hhbmdlZEV2ZW50LCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cyB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTWVudVN3aXRjaGVyT3B0aW9ucyB7XHJcbiAgZGVza3RvcENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgbW9iaWxlQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICBjb2xsYXBzZUJyZWFrcG9pbnQ/OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBzdGFydFZhbHVlPzogYm9vbGVhbjtcclxuICBvblN3aXRjaD86ICh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE1lbnVTd2l0Y2hlciBpbXBsZW1lbnRzIElSZW5kZXJlZCwgSURlc3Ryb3lhYmxlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc2t0b3BDb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbW9iaWxlQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbGxhcHNlQnJlYWtwb2ludDogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblN3aXRjaDogKCh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkTGlzdGVuZXIgPSB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWQuYmluZCh0aGlzKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHdpbmRvd1Jlc2l6ZUxpc3RlbmVyOiBXaW5kb3dSZXNpemVMaXN0ZW5lcjtcclxuICBwcml2YXRlIF92YWx1ZTogYm9vbGVhbjtcclxuICBwcml2YXRlIG1lbnVTd2l0Y2hlcjogRGV2RXhwcmVzcy51aS5keFN3aXRjaCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIG9uVmFsdWVDaGFuZ2VkOiAodmFsdWU6IGJvb2xlYW4pID0+IHZvaWQ7XHJcblxyXG4gIHB1YmxpYyBnZXQgdmFsdWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJTWVudVN3aXRjaGVyT3B0aW9ucykge1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGFpbmVyID0gb3B0aW9ucy5kZXNrdG9wQ29udGFpbmVyO1xyXG4gICAgdGhpcy5tb2JpbGVDb250YWluZXIgPSBvcHRpb25zLm1vYmlsZUNvbnRhaW5lcjtcclxuICAgIHRoaXMuY29sbGFwc2VCcmVha3BvaW50ID0gb3B0aW9ucy5jb2xsYXBzZUJyZWFrcG9pbnQgfHwgYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHMubWQ7XHJcbiAgICB0aGlzLm9uU3dpdGNoID0gb3B0aW9ucy5vblN3aXRjaDtcclxuICAgIHRoaXMuX3ZhbHVlID0gb3B0aW9ucy5zdGFydFZhbHVlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnN0YXJ0VmFsdWUgOiB0cnVlO1xyXG5cclxuICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBuZXcgV2luZG93UmVzaXplTGlzdGVuZXIodW5kZWZpbmVkLCB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWRMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBjb250YWluZXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pc01vYmlsZVZpZXcgPyB0aGlzLm1vYmlsZUNvbnRhaW5lciA6IHRoaXMuZGVza3RvcENvbnRhaW5lcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGlzTW9iaWxlVmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1heFdpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWF4V2lkdGg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VmlzaWJsZShpc1Zpc2libGU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMubWVudVN3aXRjaGVyPy5vcHRpb24oJ3Zpc2libGUnLCBpc1Zpc2libGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIHRoaXMucmVuZGVyU3dpdGNoKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVzdHJveSgpIHtcclxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLm1lbnVTd2l0Y2hlci5lbGVtZW50KCk7XHJcbiAgICB0aGlzLm1lbnVTd2l0Y2hlcj8uZGlzcG9zZSgpO1xyXG5cclxuICAgIHJvb3Q/LnJlbW92ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFZhbHVlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLm1lbnVTd2l0Y2hlci5vcHRpb24oJ3ZhbHVlJywgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZVZhbHVlQ2hhbmdlZChvblZhbHVlQ2hhbmdlZDogKHZhbHVlOiBib29sZWFuKSA9PiB2b2lkKSB7XHJcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkID0gb25WYWx1ZUNoYW5nZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclN3aXRjaCgpIHtcclxuICAgIHRoaXMubWVudVN3aXRjaGVyID0gJCgnPGRpdj4nKS5keFN3aXRjaCh7XHJcbiAgICAgIHN3aXRjaGVkT2ZmVGV4dDogJ1BlcnNvbmFsJyxcclxuICAgICAgc3dpdGNoZWRPblRleHQ6ICdHbG9iYWwnLFxyXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcclxuICAgICAgd2lkdGg6ICcxMDBweCcsXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoeyB2YWx1ZSB9KSA9PiB7XHJcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5vblN3aXRjaCkge1xyXG4gICAgICAgICAgdGhpcy5vblN3aXRjaCh0aGlzLnZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9uVmFsdWVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkKHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICB9KS5keFN3aXRjaCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLm1lbnVTd2l0Y2hlci5lbGVtZW50KClbMF0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzd2l0Y2hWaWV3KCkge1xyXG4gICAgdGhpcy5kZXN0cm95KCk7XHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpIHtcclxuICAgIHRoaXMuc3dpdGNoVmlldygpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2tFdmVudCB9IGZyb20gJy4nO1xyXG5pbXBvcnQgeyBNZW51SXRlbVR5cGUgfSBmcm9tICcuLi9CdXNpbmVzcyc7XHJcbmltcG9ydCB7IGdldFVybEJ5TWVudUl0ZW1EYXRhIH0gZnJvbSAnLi4vSGVscGVycy9JbmRleCc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4vSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVNlYXJjaE9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICBnZXRNZW51RGF0YVNvdXJjZTogKCkgPT4gSVNlYXJjaERhdGFTb3VyY2U7XHJcbiAgZ2V0SXNHbG9iYWxNZW51U2hvd246ICgpID0+IGJvb2xlYW47XHJcbiAgb25EaW1lbnNpb25zQ2hhbmdlZD86ICgpID0+IHZvaWQ7XHJcbiAgb25NZW51SXRlbUNsaWNrPzogKGU6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQpID0+IHZvaWQ7XHJcbiAgb25NZW51SXRlbU9wZW5lZD86IChlOiBJT3BlblJlcG9ydEV2ZW50QXJncykgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU2VhcmNoRGF0YVNvdXJjZSB7XHJcbiAgZ2xvYWJhbEl0ZW1zOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXTtcclxuICBwZXJzb25hbEl0ZW1zOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXSB8IHVuZGVmaW5lZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJT3BlblJlcG9ydEV2ZW50QXJncyB7XHJcbiAgbWVudUl0ZW06IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCA9IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCAmIHtcclxuICBpc0dsb2JhbDogYm9vbGVhbjtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlYXJjaCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBnZXRNZW51RGF0YVNvdXJjZTogKCkgPT4gSVNlYXJjaERhdGFTb3VyY2U7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBnZXRJc0dsb2JhbE1lbnVTaG93bjogKCkgPT4gYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uRGltZW5zaW9uc0NoYW5nZWQ6ICgpID0+IHZvaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbk1lbnVJdGVtQ2xpY2s6IChlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25NZW51SXRlbU9wZW5lZDogKGU6IElPcGVuUmVwb3J0RXZlbnRBcmdzKSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIHNlYXJjaERyb3BEb3duOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3ggfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBzZWFyY2hSZXN1bHRzVHJlZUxpc3Q6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVNlYXJjaE9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZ2V0TWVudURhdGFTb3VyY2UgPSBvcHRpb25zLmdldE1lbnVEYXRhU291cmNlO1xyXG4gICAgdGhpcy5nZXRJc0dsb2JhbE1lbnVTaG93biA9IG9wdGlvbnMuZ2V0SXNHbG9iYWxNZW51U2hvd247XHJcbiAgICB0aGlzLm9uRGltZW5zaW9uc0NoYW5nZWQgPSBvcHRpb25zLm9uRGltZW5zaW9uc0NoYW5nZWQ7XHJcbiAgICB0aGlzLm9uTWVudUl0ZW1PcGVuZWQgPSBvcHRpb25zLm9uTWVudUl0ZW1PcGVuZWQ7XHJcbiAgICB0aGlzLm9uTWVudUl0ZW1DbGljayA9IG9wdGlvbnMub25NZW51SXRlbUNsaWNrO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFZpc2libGUoaXNWaXNpYmxlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5vcHRpb24oJ3Zpc2libGUnLCBpc1Zpc2libGUpO1xyXG4gICAgdGhpcy5vbkRpbWVuc2lvbnNDaGFuZ2VkICYmIHRoaXMub25EaW1lbnNpb25zQ2hhbmdlZCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFNlYXJjaFRleHQodGV4dDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5vcHRpb24oJ3ZhbHVlJywgdGV4dCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVsb2FkTWVudUl0ZW1zKCkge1xyXG4gICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3Q/Lm9wdGlvbignZGF0YVNvdXJjZScsIHRoaXMuZ2V0RGF0YVNvdXJjZUZvclNlYXJjaCh0aGlzLmdldE1lbnVEYXRhU291cmNlKCkpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBjb25zdCBmb3JtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTtcclxuICAgIGZvcm1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Zvcm0taW5saW5lJyk7XHJcblxyXG4gICAgY29uc3QgJGlucHV0ID0gJCgnPGRpdiAvPicpLmR4RHJvcERvd25Cb3goe1xyXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlYXJjaCcsXHJcbiAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICBzaG93RHJvcERvd25CdXR0b246IGZhbHNlLFxyXG4gICAgICBhcHBseVZhbHVlTW9kZTogJ2luc3RhbnRseScsXHJcbiAgICAgIGFjY2VwdEN1c3RvbVZhbHVlOiB0cnVlLFxyXG4gICAgICBvcGVuT25GaWVsZENsaWNrOiBmYWxzZSxcclxuICAgICAgbW9kZTogJ3NlYXJjaCcsXHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7XHJcbiAgICAgICAgJ3R5cGUnOiAnc2VhcmNoJyxcclxuICAgICAgICAnYXJpYS1sYWJlbCc6ICdTZWFyY2gnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKGUsICRlbCkgPT4ge1xyXG4gICAgICAgICRlbC5hZGRDbGFzcygnaGVhZGVyLXNlYXJjaC1yZXN1bHRzLXRyZWUtbGlzdCcpO1xyXG4gICAgICAgIGNvbnN0ICR0cmVlTGlzdCA9ICQoJzxkaXY+JykuZHhUcmVlTGlzdCh7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiB0aGlzLmdldERhdGFTb3VyY2VGb3JTZWFyY2godGhpcy5nZXRNZW51RGF0YVNvdXJjZSgpKSxcclxuICAgICAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgICAgZm9jdXNlZFJvd0VuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgICAgIGFsbG93QWRkaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgYWxsb3dVcGRhdGluZzogZmFsc2UsXHJcbiAgICAgICAgICAgIGFsbG93RGVsZXRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG5vRGF0YVRleHQ6ICdObyByZXN1bHRzIGZvdW5kJyxcclxuICAgICAgICAgIGRhdGFTdHJ1Y3R1cmU6ICd0cmVlJyxcclxuICAgICAgICAgIGtleUV4cHI6ICdJZCcsXHJcbiAgICAgICAgICBpdGVtc0V4cHI6ICdJdGVtcycsXHJcbiAgICAgICAgICBmaWx0ZXJNb2RlOiAnZnVsbEJyYW5jaCcsXHJcbiAgICAgICAgICBzaG93Q29sdW1uSGVhZGVyczogZmFsc2UsXHJcbiAgICAgICAgICBjb2x1bW5zOiBbe1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdOYW1lJyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnXHJcbiAgICAgICAgICB9XSxcclxuICAgICAgICAgIG9uQ2VsbENsaWNrOiAoeyBkYXRhIH0pID0+IHtcclxuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvTWVudUl0ZW0oZGF0YSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb25LZXlEb3duOiAoYXJncykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBldmVudDogS2V5Ym9hcmRFdmVudCA9IGFyZ3MuZXZlbnQgYXMgYW55O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZm9jdXNlZFJvd0tleSA9IHRoaXMuc2VhcmNoUmVzdWx0c1RyZWVMaXN0Lm9wdGlvbignZm9jdXNlZFJvd0tleScpO1xyXG4gICAgICAgICAgICBpZiAoZm9jdXNlZFJvd0tleSAhPT0gbnVsbCAmJiBmb2N1c2VkUm93S2V5ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnRW50ZXInOlxyXG4gICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3QuZ2V0Tm9kZUJ5S2V5KGZvY3VzZWRSb3dLZXkpLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVUb01lbnVJdGVtKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJyAnOlxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdC5leHBhbmRSb3coZm9jdXNlZFJvd0tleSk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoUmVzdWx0c1RyZWVMaXN0LmNvbGxhcHNlUm93KGZvY3VzZWRSb3dLZXkpO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdFc2NhcGUnOlxyXG4gICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VhcmNoRHJvcERvd24uZm9jdXMoKSk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdCA9ICR0cmVlTGlzdC5keFRyZWVMaXN0KCdpbnN0YW5jZScpO1xyXG5cclxuICAgICAgICByZXR1cm4gJHRyZWVMaXN0O1xyXG4gICAgICB9LFxyXG4gICAgICBkcm9wRG93bk9wdGlvbnM6IHtcclxuICAgICAgICBwb3NpdGlvbjoge1xyXG4gICAgICAgICAgb2Y6ICcuc2VhcmNoLWRyb3Bkb3duJyxcclxuICAgICAgICAgIG15OiAndG9wJyxcclxuICAgICAgICAgIGF0OiAnYm90dG9tJyxcclxuICAgICAgICAgIG9mZnNldDogeyB4OiAxNDksIHk6IDQgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd2lkdGg6IDUxOCxcclxuICAgICAgICBhbmltYXRpb246IHtcclxuICAgICAgICAgIHNob3c6IHsgZHVyYXRpb246IDAgfSxcclxuICAgICAgICAgIGhpZGU6IHsgZHVyYXRpb246IDAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXHJcbiAgICAgICAgb25TaG93bjogKGUpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2VhcmNoRHJvcERvd24uZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRm9jdXNJbjogKGUpID0+IHtcclxuICAgICAgICBlLmNvbXBvbmVudC5lbGVtZW50KCkuYWRkQ2xhc3MoJ2ZvY3VzZWQnKTtcclxuICAgICAgICB0aGlzLm9uRGltZW5zaW9uc0NoYW5nZWQgJiYgdGhpcy5vbkRpbWVuc2lvbnNDaGFuZ2VkKCk7XHJcbiAgICAgICAgdGhpcy5jaGVja1NlYXJjaFJlc3V0UG9wdXBWaXNpYmlsaXR5KGUuY29tcG9uZW50LmVsZW1lbnQoKS5maW5kKCdpbnB1dC5keC10ZXh0ZWRpdG9yLWlucHV0JykudmFsKCkgYXMgc3RyaW5nKTtcclxuICAgICAgfSxcclxuICAgICAgb25Gb2N1c091dDogKGUpID0+IHtcclxuICAgICAgICBpZiAoIWUuY29tcG9uZW50LmVsZW1lbnQoKS5maW5kKCdpbnB1dC5keC10ZXh0ZWRpdG9yLWlucHV0JykudmFsKCkpIHtcclxuICAgICAgICAgIGUuY29tcG9uZW50LmVsZW1lbnQoKS5yZW1vdmVDbGFzcygnZm9jdXNlZCcpO1xyXG4gICAgICAgICAgdGhpcy5vbkRpbWVuc2lvbnNDaGFuZ2VkICYmIHRoaXMub25EaW1lbnNpb25zQ2hhbmdlZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgb25LZXlVcDogKGUpID0+IHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGV2ZW50OiBLZXlib2FyZEV2ZW50ID0gZS5ldmVudCBhcyBhbnk7XHJcblxyXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBlLmNvbXBvbmVudC5lbGVtZW50KCkuZmluZCgnaW5wdXQuZHgtdGV4dGVkaXRvci1pbnB1dCcpLnZhbCgpIGFzIHN0cmluZztcclxuXHJcbiAgICAgICAgICB0aGlzLmNoZWNrU2VhcmNoUmVzdXRQb3B1cFZpc2liaWxpdHkodmFsdWUpO1xyXG4gICAgICAgICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3Quc2VhcmNoQnlUZXh0KHZhbHVlKTtcclxuICAgICAgICAgIGNvbnN0IHRyaWdnZXJlZEZvY3VzQnV0dG9ucyA9IFsnVGFiJywgJ0VudGVyJywgJ0Fycm93RG93bicsICdBcnJvd1VwJ107XHJcbiAgICAgICAgICBpZiAodHJpZ2dlcmVkRm9jdXNCdXR0b25zLnNvbWUoKGIpID0+IGIgPT09IGV2ZW50LmtleSkpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3QuZm9jdXModGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3QuZ2V0Q2VsbEVsZW1lbnQoMCwgJ05hbWUnKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uS2V5RG93bjogKGUpID0+IHtcclxuICAgICAgICBjb25zdCBldmVudDogS2V5Ym9hcmRFdmVudCA9IGUuZXZlbnQgYXMgYW55O1xyXG5cclxuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xyXG4gICAgICAgICAgdGhpcy5jbG9zZVNlYXJjaERyb3BEb3duKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvblZhbHVlQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICB0aGlzLmNoZWNrU2VhcmNoUmVzdXRQb3B1cFZpc2liaWxpdHkoZS52YWx1ZSk7XHJcbiAgICAgIH0sXHJcbiAgICB9KS5hZGRDbGFzcyhbJ2Zvcm0tY29udHJvbCcsICdtci1zbS0yJywgJ3NlYXJjaC1kcm9wZG93biddKTtcclxuXHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duID0gJGlucHV0LmR4RHJvcERvd25Cb3goJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgZm9ybUVsZW1lbnQuYXBwZW5kQ2hpbGQoJGlucHV0WzBdKTtcclxuICAgIHRoaXMuJGNvbnRhaW5lci5hcHBlbmQoZm9ybUVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0ZVRvTWVudUl0ZW0obWVudUl0ZW06IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsKSB7XHJcbiAgICBjb25zdCB1cmwgPSBnZXRVcmxCeU1lbnVJdGVtRGF0YShtZW51SXRlbSk7XHJcblxyXG4gICAgaWYgKHVybCkge1xyXG4gICAgICB0aGlzLmNsb3NlU2VhcmNoRHJvcERvd24oKTtcclxuXHJcbiAgICAgIGNvbnN0IGFyZ3M6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQgPSB7XHJcbiAgICAgICAgaXRlbTogbWVudUl0ZW0sXHJcbiAgICAgICAgb3JpZ2luYWxFdmVudDogbnVsbCxcclxuICAgICAgICBjYW5jZWw6IGZhbHNlXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLm9uTWVudUl0ZW1DbGljaz8uKGFyZ3MpO1xyXG5cclxuICAgICAgaWYgKGFyZ3MuY2FuY2VsKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLm9uTWVudUl0ZW1PcGVuZWQgJiYgdGhpcy5vbk1lbnVJdGVtT3BlbmVkKHsgbWVudUl0ZW0gfSk7XHJcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbG9zZVNlYXJjaERyb3BEb3duKCkge1xyXG4gICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3Qub3B0aW9uKCdmb2N1c2VkUm93S2V5JywgdW5kZWZpbmVkKTtcclxuICAgIHRoaXMuc2VhcmNoRHJvcERvd24/Lm9wdGlvbigndmFsdWUnLCAnJyk7XHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5mb2N1cygpO1xyXG4gICAgdGhpcy5zZWFyY2hEcm9wRG93bj8uYmx1cigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja1NlYXJjaFJlc3V0UG9wdXBWaXNpYmlsaXR5KHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5vcGVuKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5jbG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREYXRhU291cmNlRm9yU2VhcmNoKGRzOiBJU2VhcmNoRGF0YVNvdXJjZSk6IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10gfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKCFkcykge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGdldFJlZHVjZXIgPSAoaXNHbG9iYWw6IGJvb2xlYW4pID0+IHtcclxuICAgICAgY29uc3QgcmVkdWNlciA9IChyZXM6IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10sIGl0ZW06IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCkgPT4ge1xyXG4gICAgICAgIGlmIChpdGVtLkl0ZW1zICYmIGl0ZW0uSXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBpdGVtLkl0ZW1zID0gaXRlbS5JdGVtcy5yZWR1Y2UocmVkdWNlciwgW10pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaXNWaXNpYmxlID0gaXRlbS5WaXNpYmxlID09PSB1bmRlZmluZWQgfHwgaXRlbS5WaXNpYmxlID09PSBudWxsIHx8IGl0ZW0uVmlzaWJsZSA9PT0gdHJ1ZTtcclxuICAgICAgICBjb25zdCBpc0Rpc2FibGVkID0gaXRlbS5EaXNhYmxlZCA9PT0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKGlzVmlzaWJsZSAmJiAhaXNEaXNhYmxlZCkge1xyXG4gICAgICAgICAgcmVzLnB1c2goeyAuLi5pdGVtLCBpc0dsb2JhbCB9IGFzIElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICByZXR1cm4gcmVkdWNlcjtcclxuICAgIH07XHJcblxyXG4gICAgaWYgKGRzLnBlcnNvbmFsSXRlbXMgJiYgZHMucGVyc29uYWxJdGVtcy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgZ2xvYmFsTWVudVJvb3QgPSB7XHJcbiAgICAgICAgTmFtZTogJ0dsb2JhbCBNZW51JywgSWQ6IC0xLCBpc0dsb2JhbDogdHJ1ZSwgVHlwZTogTWVudUl0ZW1UeXBlLk1lbnVOb2RlLFxyXG4gICAgICAgIEl0ZW1zOiBkcy5nbG9hYmFsSXRlbXMucmVkdWNlKGdldFJlZHVjZXIodHJ1ZSksIFtdKVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc3QgcGVyc29uYWxNZW51Um9vdCA9IHtcclxuICAgICAgICBOYW1lOiAnUGVyc29uYWwgTWVudScsIElkOiAtMiwgaXNHbG9iYWw6IGZhbHNlLCBUeXBlOiBNZW51SXRlbVR5cGUuTWVudU5vZGUsXHJcbiAgICAgICAgSXRlbXM6IGRzLnBlcnNvbmFsSXRlbXMucmVkdWNlKGdldFJlZHVjZXIoZmFsc2UpLCBbXSlcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmdldElzR2xvYmFsTWVudVNob3duKCkgPyBbZ2xvYmFsTWVudVJvb3QsIHBlcnNvbmFsTWVudVJvb3RdIDogW3BlcnNvbmFsTWVudVJvb3QsIGdsb2JhbE1lbnVSb290XTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBkcy5nbG9hYmFsSXRlbXMucmVkdWNlKGdldFJlZHVjZXIodHJ1ZSksIFtdKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCB7IERldkV4cHJlc3NFdmVudEFyZ3MgfSBmcm9tICcuL0RldkV4cHJlc3NFdmVudEFyZ3MnO1xyXG5leHBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuL0V2ZW50RW1pdHRlcic7XHJcbmV4cG9ydCB7IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgfSBmcm9tICcuL0dlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UnO1xyXG5leHBvcnQgeyBjcmVhdGVHcmlkRXhwb3J0RnVuY3Rpb24gfSBmcm9tICcuL0dyaWRFeHBvcnQnO1xyXG4iLCAiXHVGRUZGZXhwb3J0IGNsYXNzIEV2ZW50RW1pdHRlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudExpc3RlbmVyczogYW55W107XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5ldmVudExpc3RlbmVycyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uKGV2dCwgbGlzdGVuZXIpIHtcclxuICAgIGlmICghdGhpcy5ldmVudExpc3RlbmVyc1tldnRdKSB7XHJcbiAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnNbZXZ0XSA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnNbZXZ0XS5wdXNoKGxpc3RlbmVyKTtcclxuXHJcbiAgICByZXR1cm4gbGlzdGVuZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25jZShldnQsIGxpc3RlbmVyKSB7XHJcbiAgICB0aGlzLm9uKGV2dCwgKGUpID0+IHtcclxuICAgICAgbGlzdGVuZXIoZSk7XHJcbiAgICAgIHRoaXMub2ZmKGV2dCwgbGlzdGVuZXIpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdChldnQsIGUgPSBudWxsKSB7XHJcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2dF07XHJcblxyXG4gICAgaWYgKGxpc3RlbmVycykge1xyXG4gICAgICBmb3IgKGNvbnN0IGN1cnJlbnRMaXN0ZW5lciBvZiBsaXN0ZW5lcnMpIHtcclxuICAgICAgICBpZiAoY3VycmVudExpc3RlbmVyKSB7XHJcbiAgICAgICAgICBjdXJyZW50TGlzdGVuZXIuY2FsbCh0aGlzLCBlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvZmYoZXZ0LCBsaXN0ZW5lcikge1xyXG4gICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5ldmVudExpc3RlbmVyc1tldnRdO1xyXG5cclxuICAgIGlmIChsaXN0ZW5lcnMpIHtcclxuICAgICAgY29uc3QgZmlsdGVyZWQgPSBbXTtcclxuXHJcbiAgICAgIGZvciAoY29uc3QgY3VycmVudExpc3RlbmVyIG9mIGxpc3RlbmVycykge1xyXG4gICAgICAgIGlmIChjdXJyZW50TGlzdGVuZXIgIT09IGxpc3RlbmVyKSB7XHJcbiAgICAgICAgICBmaWx0ZXJlZC5wdXNoKGN1cnJlbnRMaXN0ZW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2dF0gPSBmaWx0ZXJlZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhZGRIYW5kbGVyKGV2ZW50OiBzdHJpbmcsIG9yaWdpbkhhbmRsZXIsIGdldEFyZ3VtZW50cykge1xyXG4gICAgY29uc3QgaW50ZXJuYWxIYW5kbGVyID0gKCkgPT4ge1xyXG4gICAgICBvcmlnaW5IYW5kbGVyKFxyXG4gICAgICAgIGdldEFyZ3VtZW50cygpLFxyXG4gICAgICAgICgpID0+IHRoaXMub2ZmKGV2ZW50LCBpbnRlcm5hbEhhbmRsZXIpXHJcbiAgICAgICk7XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMub24oZXZlbnQsIGludGVybmFsSGFuZGxlcik7XHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQgc2F2ZUFzIGZyb20gJ2ZpbGUtc2F2ZXInO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUdyaWRFeHBvcnRGdW5jdGlvbihyZXBvcnROYW1lOiBzdHJpbmcpOiAoZTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLkV4cG9ydGluZ0V2ZW50KSA9PiB2b2lkIHtcclxuICByZXR1cm4gKGU6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5FeHBvcnRpbmdFdmVudCkgPT4ge1xyXG4gICAgY29uc3Qgd29ya2Jvb2sgPSBuZXcgKHdpbmRvdyBhcyBhbnkpLkV4Y2VsSlMuV29ya2Jvb2soKTtcclxuICAgIGNvbnN0IHdvcmtzaGVldCA9IHdvcmtib29rLmFkZFdvcmtzaGVldChyZXBvcnROYW1lKTtcclxuXHJcbiAgICBEZXZFeHByZXNzLmV4Y2VsRXhwb3J0ZXIuZXhwb3J0RGF0YUdyaWQoe1xyXG4gICAgICB3b3Jrc2hlZXQsXHJcbiAgICAgIGNvbXBvbmVudDogZS5jb21wb25lbnQsXHJcbiAgICAgIGN1c3RvbWl6ZUNlbGw6IChvcHRpb25zKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZXhjZWxDZWxsID0gb3B0aW9ucy5leGNlbENlbGw7XHJcblxyXG4gICAgICAgIGV4Y2VsQ2VsbC5mb250ID0geyBuYW1lOiAnQXJpYWwnLCBzaXplOiAxMiB9O1xyXG4gICAgICAgIGV4Y2VsQ2VsbC5hbGlnbm1lbnQgPSB7IGhvcml6b250YWw6ICdsZWZ0JyB9O1xyXG4gICAgICB9XHJcbiAgICB9KS50aGVuKGZ1bmN0aW9uKCkge1xyXG4gICAgICB3b3JrYm9vay54bHN4LndyaXRlQnVmZmVyKCkudGhlbihmdW5jdGlvbihidWZmZXIpIHtcclxuICAgICAgICBzYXZlQXMobmV3IEJsb2IoW2J1ZmZlcl0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgfSksIGAke3JlcG9ydE5hbWV9Lnhsc3hgKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIGUuY2FuY2VsID0gdHJ1ZTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElMb2dvU2V0dGluZ3MgfSBmcm9tICcuLi9EYXRhJztcclxuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi9EYXRhL1JlcXVlc3QnO1xyXG5pbXBvcnQgeyB0aHJvd1JlbmRlckVycm9yLCBNdXRhYmxlIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzLCBnZXRVcmxCeU1lbnVJdGVtRGF0YSB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBVc2VyTWVudSwgVXNlck1lbnVJdGVtQ2xpY2tFdmVudCB9IGZyb20gJy4vVXNlck1lbnUnO1xyXG5pbXBvcnQgeyBOYXZpZ2F0aW9uTWVudSwgTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2tFdmVudCB9IGZyb20gJy4vTmF2aWdhdGlvbk1lbnUnO1xyXG5pbXBvcnQgeyBMb2dvIH0gZnJvbSAnLi9Mb2dvJztcclxuaW1wb3J0IHsgTWVudVN3aXRjaGVyIH0gZnJvbSAnLi9NZW51U3dpdGNoZXInO1xyXG5pbXBvcnQgeyBJVXNlck1lbnVJdGVtTW9kZWwgfSBmcm9tICcuL0lVc2VyTWVudUl0ZW0nO1xyXG5pbXBvcnQgeyBJTWVudVNldHRpbmdzIH0gZnJvbSAnLi9JTWVudVNldHRpbmdzJztcclxuaW1wb3J0IHsgSUFwcE1lbnVNb2RlbCB9IGZyb20gJy4vSUFwcE1lbnVNb2RlbCc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4vSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsJztcclxuaW1wb3J0IFNlYXJjaCwgeyBJT3BlblJlcG9ydEV2ZW50QXJncywgSVNlYXJjaERhdGFTb3VyY2UgfSBmcm9tICcuL1NlYXJjaCc7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL1V0aWxzL0luZGV4JztcclxuXHJcbmNvbnN0IEhFQURFUl9EQVRBX0NBQ0hFX0ZJRUxEID0gJ2lzem9sZWEtdWl8aGVhZGVyLWRhdGEtY2FjaGUnO1xyXG5jb25zdCBTSE9XX0dMT0JBTF9NRU5VX0tFWSA9ICdpc3pvbGVhLXVpfHNob3ctZ2xvYmFsLW1lbnUnO1xyXG5cclxuY29uc3QgZ2V0RGF0YVNvdXJjZUNhY2hlRmllbGQgPSAodXNlck5hbWU/OiBzdHJpbmcpID0+IHtcclxuICByZXR1cm4gYCR7SEVBREVSX0RBVEFfQ0FDSEVfRklFTER9JHt1c2VyTmFtZSA/IGB8JHt1c2VyTmFtZX1gIDogJyd9YDtcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIEhlYWRlclRoZW1lcyA9ICdpc3pvbGVhJztcclxuZXhwb3J0IGludGVyZmFjZSBJSGVhZGVyT3B0aW9ucyB7XHJcbiAgJGVsOiBKUXVlcnk7XHJcbiAgbWVudVNldHRpbmdzPzogSU1lbnVTZXR0aW5ncztcclxuICBsb2dvU2V0dGluZ3M/OiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nO1xyXG4gIGRpc3BsYXlTZWFyY2g/OiBib29sZWFuO1xyXG4gIGltbWVkaWF0ZVJlbmRlcj86IGJvb2xlYW47XHJcbiAgdGhlbWU/OiBIZWFkZXJUaGVtZXM7XHJcbiAgb25Jbml0PzogKCkgPT4gdm9pZDtcclxufVxyXG5cclxuaW50ZXJmYWNlIElIZWFkZXJFbGVtZW50cyB7XHJcbiAgcmVhZG9ubHkgcm9vdD86IEhUTUxFbGVtZW50O1xyXG4gIHJlYWRvbmx5IGxvZ29Db250YWluZXI/OiBIVE1MRWxlbWVudDtcclxuICByZWFkb25seSBjb250ZW50Q29udGFpbmVyPzogSFRNTEVsZW1lbnQ7XHJcbiAgcmVhZG9ubHkgdG9nZ2xlQnV0dG9uQ29udGFpbmVyPzogSFRNTEVsZW1lbnQ7XHJcbiAgcmVhZG9ubHkgdG9nZ2xlQnV0dG9uPzogSFRNTEVsZW1lbnQ7XHJcbiAgcmVhZG9ubHkgbWVudVN3aXRjaGVyRGVza3RvcENvbnRhaW5lcj86IEhUTUxFbGVtZW50O1xyXG4gIHJlYWRvbmx5IG1lbnVTd2l0Y2hlck1vYmlsZUNvbnRhaW5lcj86IEhUTUxFbGVtZW50O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUFqYXhQYWdlTWFya2VyIHtcclxuICBpc0xvYWRlZEJ5QWpheDogdHJ1ZTtcclxuICB1cmw6IHN0cmluZztcclxuICBpc01lbnVTd2l0Y2hlckdsb2JhbDogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEhlYWRlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBNRU5VX1NXSVRDSEVSX0lOSVRJQUxJWkVEX0VWRU5UID0gJ21lbnUtc3dpdGNoZXItaW5pdGlhbGl6ZWQtZXZlbnQnO1xyXG5cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBHTE9CQUxfVVJMX1JFR0VYID0gbmV3IFJlZ0V4cCgnXig/OlthLXpdKzopPy8vJywgJ2knKTtcclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBET0NUWVBFX01BUktFUl9SRUdFWCA9IG5ldyBSZWdFeHAoJyFET0NUWVBFIGh0bWw+JywgJ2knKTtcclxuXHJcbiAgcHVibGljIHVzZXJNZW51OiBVc2VyTWVudSB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgbmF2aWdhdGlvbk1lbnU6IE5hdmlnYXRpb25NZW51IHwgdW5kZWZpbmVkO1xyXG4gIHB1YmxpYyBtZW51U3dpdGNoZXI6IE1lbnVTd2l0Y2hlciB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgbG9nbzogTG9nbyB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgZGF0YTogSUFwcE1lbnVNb2RlbCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSB0aGVtZTogSGVhZGVyVGhlbWVzO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nb1NldHRpbmdzOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbWVudVNldHRpbmdzOiBJTWVudVNldHRpbmdzIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGxheVNlYXJjaDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbGxhcHNlQnJlYWtwb2ludDogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkUGFuZWw6IERldkV4cHJlc3MudWkuZHhMb2FkUGFuZWw7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkcGFydGlhbFZpZXdQbGFjZUhvbGRlcjogSlF1ZXJ5IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlVXJsQWZ0ZXJQYXJ0aWFsTG9hZGluZzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uUGFydGlhbFZpZXdMb2FkZWQ6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGJlZm9yZVBhcnRpYWxWaWV3TG9hZGluZzogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25OYXZpYWd0aW9uTWVudUl0ZW1DbGlja0hhbmRsZXIgPSB0aGlzLm9uTmF2aWFndGlvbk1lbnVJdGVtQ2xpY2suYmluZCh0aGlzKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uTmF2aWdhdGlvbk1lbnVJdGVtT3BlbmVkSGFuZGxlciA9IHRoaXMub25OYXZpZ2F0aW9uTWVudUl0ZW1PcGVuZWQuYmluZCh0aGlzKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uVXNlck1lbnVJdGVtQ2xpY2tIYW5kbGVyID0gdGhpcy5vblVzZXJNZW51SXRlbUNsaWNrLmJpbmQodGhpcyk7XHJcbiAgcHJpdmF0ZSBzZWFyY2g6IFNlYXJjaCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLy8gZWxlbWVudHNcclxuICBwcml2YXRlIHJlYWRvbmx5ICRlbDogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudHM6IE11dGFibGU8SUhlYWRlckVsZW1lbnRzPiA9IHt9O1xyXG4gIHByaXZhdGUgJGxvYWRCYXI6IEpRdWVyeSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUhlYWRlck9wdGlvbnMpIHtcclxuICAgIHN1cGVyKCk7XHJcblxyXG4gICAgdGhpcy4kZWwgPSBvcHRpb25zLiRlbDtcclxuICAgIHRoaXMubWVudVNldHRpbmdzID0gb3B0aW9ucy5tZW51U2V0dGluZ3M7XHJcbiAgICB0aGlzLmxvZ29TZXR0aW5ncyA9IG9wdGlvbnMubG9nb1NldHRpbmdzO1xyXG4gICAgdGhpcy50aGVtZSA9IG9wdGlvbnMudGhlbWUgfHwgJ2lzem9sZWEnO1xyXG4gICAgdGhpcy5kaXNwbGF5U2VhcmNoID0gb3B0aW9ucy5kaXNwbGF5U2VhcmNoO1xyXG4gICAgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQgPSBvcHRpb25zLm1lbnVTZXR0aW5ncz8uY29sbGFwc2VCcmVha3BvaW50IHx8IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzLm1kO1xyXG5cclxuICAgIHRoaXMuJHBhcnRpYWxWaWV3UGxhY2VIb2xkZXIgPSBvcHRpb25zLm1lbnVTZXR0aW5ncz8ucGFydGlhbFZpZXdQbGFjZUhvbGRlcjtcclxuICAgIHRoaXMudXBkYXRlVXJsQWZ0ZXJQYXJ0aWFsTG9hZGluZyA9IG9wdGlvbnMubWVudVNldHRpbmdzPy51cGRhdGVVcmxBZnRlclBhcnRpYWxMb2FkaW5nO1xyXG4gICAgdGhpcy5vblBhcnRpYWxWaWV3TG9hZGVkID0gb3B0aW9ucy5tZW51U2V0dGluZ3M/Lm9uUGFydGlhbFZpZXdMb2FkZWQ7XHJcbiAgICB0aGlzLmJlZm9yZVBhcnRpYWxWaWV3TG9hZGluZyA9IG9wdGlvbnMubWVudVNldHRpbmdzPy5iZWZvcmVQYXJ0aWFsVmlld0xvYWRpbmc7XHJcblxyXG4gICAgdGhpcy5sb2FkUGFuZWwgPSB0aGlzLmNyZWF0ZUxvYWRQYW5lbCgpO1xyXG5cclxuICAgIGlmIChvcHRpb25zLmltbWVkaWF0ZVJlbmRlciA9PT0gZmFsc2UpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUud2FybignVGhlIFxcJ2ltbWVkaWF0ZVJlbmRlciA9PT0gZmFsc2VcXCcgb3B0aW9uIGlzblxcJ3Qgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnQuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9OT1RFOiBUbyBvdmVycmlkZSBib290c3RyYXAgaGVhZGVyIHotaW5kZXggd2hpY2ggaXMgMTYwMFxyXG4gICAgRGV2RXhwcmVzcy51aS5keE92ZXJsYXkuYmFzZVpJbmRleCgxNzAwKTtcclxuXHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gICAgdGhpcy5pbml0KClcclxuICAgICAgLnRoZW4oKCkgPT4gb3B0aW9ucz8ub25Jbml0Py4oKSk7XHJcblxyXG4gICAgdGhpcy5zdWJzY3JpYmVPbkhpc3RvcnlQb3BTdGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHVwZGF0ZURhdGEoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNsZWFyQXBwTWVudU1vZGVsQ2FjaGUoKTtcclxuICAgIHRoaXMuZGF0YSA9IGF3YWl0IHRoaXMubG9hZERhdGEoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMucm9vdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZXJlbmRlck1lbnVzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgLyoqXHJcbiAgICAgKiA8Um9vdD5cclxuICAgICAqICA8QnJhbmQ+XHJcbiAgICAgKiAgICA8TG9nbyAvPlxyXG4gICAgICogIDwvQnJhbmQ+XHJcbiAgICAgKiAgPENvbnRlbnRUb2dnbGVyIC8+XHJcbiAgICAgKiAgPENvbnRlbnQ+XHJcbiAgICAgKiAgICA8U2VhcmNoIC8+XHJcbiAgICAgKiAgICA8TmF2aWdhdGlvbk1lbnUgLz5cclxuICAgICAqICAgIDxVc2VyTWVudSAvPlxyXG4gICAgICogIDwvQ29udGVudD5cclxuICAgICAqICA8TWVudVN3aXRjaGVyIC8+XHJcbiAgICAgKiA8L1Jvb3Q+XHJcbiAgICAgKiA8TG9hZEJhciAvPlxyXG4gICAgICovXHJcblxyXG4gICAgdGhpcy5yZW5kZXJSb290KCk7XHJcbiAgICB0aGlzLnJlbmRlckJyYW5kKCk7XHJcbiAgICB0aGlzLnJlbmRlckNvbnRlbnRUb2dnbGVyKCk7XHJcbiAgICB0aGlzLnJlbmRlckNvbnRlbnQoKTtcclxuICAgIHRoaXMucmVuZGVyTG9hZEJhcigpO1xyXG5cclxuICAgIHRoaXMudXBkYXRlQ29udGVudEFuZFRvZ2dsZXJWaXNpYmxlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN1YnNjcmliZU9uSGlzdG9yeVBvcFN0YXRlKCkge1xyXG4gICAgaWYgKHRoaXMuJHBhcnRpYWxWaWV3UGxhY2VIb2xkZXIpIHtcclxuICAgICAgJCh3aW5kb3cpLmJpbmQoJ3BvcHN0YXRlJywgKGUpID0+IHtcclxuICAgICAgICBjb25zdCBldmVudCA9IGUub3JpZ2luYWxFdmVudCBhcyBQb3BTdGF0ZUV2ZW50O1xyXG4gICAgICAgIGNvbnN0IHN0YXRlID0gZXZlbnQuc3RhdGUgYXMgSUFqYXhQYWdlTWFya2VyO1xyXG4gICAgICAgIGlmIChzdGF0ZSAmJiBzdGF0ZS5pc0xvYWRlZEJ5QWpheCkge1xyXG4gICAgICAgICAgdGhpcy5sb2FkUGFnZVZpYUFqYXhDb3JlKHN0YXRlLnVybCk7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZU1lbnVTd2l0Y2hlclN0YXRlKHN0YXRlLmlzTWVudVN3aXRjaGVyR2xvYmFsKTtcclxuICAgICAgICAgIHRoaXMubmF2aWdhdGlvbk1lbnUudXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVMb2FkUGFuZWwoKTogRGV2RXhwcmVzcy51aS5keExvYWRQYW5lbCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpLmR4TG9hZFBhbmVsKHtcclxuICAgICAgc2hhZGluZ0NvbG9yOiAncmdiYSgwLDAsMCwwLjQpJyxcclxuICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgIHNob3dJbmRpY2F0b3I6IHRydWUsXHJcbiAgICAgIHNob3dQYW5lOiB0cnVlLFxyXG4gICAgICBzaGFkaW5nOiB0cnVlLFxyXG4gICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiBmYWxzZSxcclxuICAgIH0pLmFwcGVuZFRvKHRoaXMuJGVsKS5keExvYWRQYW5lbCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyUm9vdCgpIHtcclxuICAgIHRoaXMuZWxlbWVudHMucm9vdCA9IHRoaXMuJGVsWzBdO1xyXG4gICAgdGhpcy5lbGVtZW50cy5yb290LmNsYXNzTGlzdC5hZGQoJ2hlYWRlcicsIHRoaXMudGhlbWUsICduYXZiYXInLCAnbmF2YmFyLWRhcmsnLCBgbmF2YmFyLWV4cGFuZC0ke3RoaXMuY29sbGFwc2VCcmVha3BvaW50Lm5hbWV9YCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckJyYW5kKCkge1xyXG4gICAgaWYgKHRoaXMubG9nbyB8fCAhdGhpcy5sb2dvU2V0dGluZ3MpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5yb290KSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYnJhbmRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgYnJhbmRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9fYnJhbmQnLCAnbmF2YmFyLWJyYW5kJyk7XHJcbiAgICBicmFuZEVsZW1lbnQuaHJlZiA9ICcvJztcclxuICAgIHRoaXMuZWxlbWVudHMucm9vdC5hcHBlbmRDaGlsZChicmFuZEVsZW1lbnQpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudHMubG9nb0NvbnRhaW5lciA9IGJyYW5kRWxlbWVudDtcclxuXHJcbiAgICB0aGlzLmxvZ28gPSBuZXcgTG9nbygkKHRoaXMuZWxlbWVudHMubG9nb0NvbnRhaW5lciksIHRoaXMubG9nb1NldHRpbmdzKTtcclxuICAgIHRoaXMubG9nby5pbml0V2lkZ2V0KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclNlYXJjaCgpIHtcclxuICAgIGlmICghdGhpcy5kaXNwbGF5U2VhcmNoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lcikge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcignY29udGVudENvbnRhaW5lcicpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VhcmNoID0gbmV3IFNlYXJjaCh7XHJcbiAgICAgICRjb250YWluZXI6ICQodGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyKSxcclxuICAgICAgZ2V0TWVudURhdGFTb3VyY2U6ICgpID0+IHRoaXMuZ2V0U2VhcmNoRGF0YVNvdXJjZSh0aGlzLmRhdGEpLFxyXG4gICAgICBnZXRJc0dsb2JhbE1lbnVTaG93bjogKCkgPT4gdGhpcy5nZXRJc0dsb2JhbE1lbnVTaG93bigpLFxyXG4gICAgICBvbkRpbWVuc2lvbnNDaGFuZ2VkOiAoKSA9PiB0aGlzLm5hdmlnYXRpb25NZW51Py5hcHBseUFkYXB0aXZpdHlDb2xsYXBzaW5nKCksXHJcbiAgICAgIG9uTWVudUl0ZW1DbGljazogdGhpcy5vbk5hdmlhZ3Rpb25NZW51SXRlbUNsaWNrSGFuZGxlcixcclxuICAgICAgb25NZW51SXRlbU9wZW5lZDogdGhpcy5vbk5hdmlnYXRpb25NZW51SXRlbU9wZW5lZEhhbmRsZXIsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuc2VhcmNoLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRJc0dsb2JhbE1lbnVTaG93bigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmlzU2hvd0dsb2JhbE1lbnUoKSB8fCAhdGhpcy5kYXRhPy5BZGRHbG9iYWxQZXJzb25hbFN3aXRjaGVyO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbk5hdmlnYXRpb25NZW51SXRlbU9wZW5lZChlOiBJT3BlblJlcG9ydEV2ZW50QXJncykge1xyXG4gICAgdGhpcy51cGRhdGVNZW51U3dpdGNoZXJTdGF0ZShlLm1lbnVJdGVtLmlzR2xvYmFsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlTWVudVN3aXRjaGVyU3RhdGUoaXNHbG9iYWw6IGJvb2xlYW4pIHtcclxuICAgIGlmICghdGhpcy5tZW51U3dpdGNoZXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm1lbnVTd2l0Y2hlci52YWx1ZSAhPT0gaXNHbG9iYWwpIHtcclxuICAgICAgdGhpcy5tZW51U3dpdGNoZXIuc2V0VmFsdWUoaXNHbG9iYWwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJDb250ZW50VG9nZ2xlcigpIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5yb290KSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcclxuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ25hdmJhci10b2dnbGVyJyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnYnV0dG9uJyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtdG9nZ2xlJywgJ2NvbGxhcHNlJyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGFyZ2V0JywgJy5oZWFkZXJfX2NvbnRlbnQnKTtcclxuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2VhcmNoPy5zZXRTZWFyY2hUZXh0KCcnKTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgaWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuICAgIGljb24uY2xhc3NMaXN0LmFkZCgnbmF2YmFyLXRvZ2dsZXItaWNvbicpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbkNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdoZWFkZXJfX3RvZ2dsZS1idXR0b24tY29udGFpbmVyJyk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uYXBwZW5kQ2hpbGQoaWNvbik7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbkNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbik7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b25Db250YWluZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJDb250ZW50KCkge1xyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLnJvb3QpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ3Jvb3QnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdjb2xsYXBzZScsICduYXZiYXItY29sbGFwc2UnLCAnaGVhZGVyX19jb250ZW50Jyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyKTtcclxuXHJcbiAgICB0aGlzLnJlbmRlclNlYXJjaCgpO1xyXG4gICAgdGhpcy5yZW5kZXJOYXZpZ2F0aW9uTWVudShbXSk7XHJcbiAgICB0aGlzLnJlbmRlck1lbnVTd2l0Y2hlcigpO1xyXG4gICAgdGhpcy5yZW5kZXJVc2VyTWVudShbXSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlck5hdmlnYXRpb25NZW51KG1lbnVJdGVtTW9kZWxzOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXSkge1xyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ2NvbnRlbnRDb250YWluZXInKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpc0dsb2JhbE1lbnUgPSB0aGlzLmdldElzR2xvYmFsTWVudVNob3duKCk7XHJcblxyXG4gICAgaWYgKHRoaXMubmF2aWdhdGlvbk1lbnUpIHtcclxuICAgICAgdGhpcy5uYXZpZ2F0aW9uTWVudS51cGRhdGVEYXRhKG1lbnVJdGVtTW9kZWxzLCBpc0dsb2JhbE1lbnUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5uYXZpZ2F0aW9uTWVudSA9IG5ldyBOYXZpZ2F0aW9uTWVudShcclxuICAgICAgICB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIsXHJcbiAgICAgICAgbWVudUl0ZW1Nb2RlbHMsXHJcbiAgICAgICAgaXNHbG9iYWxNZW51LFxyXG4gICAgICAgIHRoaXMuY29sbGFwc2VCcmVha3BvaW50LFxyXG4gICAgICAgIHRoaXMub25OYXZpYWd0aW9uTWVudUl0ZW1DbGlja0hhbmRsZXIsXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMubmF2aWdhdGlvbk1lbnUucmVuZGVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uVXNlck1lbnVJdGVtQ2xpY2soZTogVXNlck1lbnVJdGVtQ2xpY2tFdmVudCkge1xyXG4gICAgdGhpcy5tZW51U2V0dGluZ3Mub25Vc2VyTWVudUNsaWNrPy4oZSk7XHJcbiAgICBpZiAoZS5jYW5jZWwgfHwgdGhpcy5pc0tleVByZXNzZWQoZS5vcmlnaW5hbEV2ZW50IGFzIE1vdXNlRXZlbnQpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB1cmwgPSBlLml0ZW0uVXJsO1xyXG5cclxuICAgIGlmIChlLml0ZW0uQWx3YXlzUmVsb2FkUGFnZSkge1xyXG4gICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGUuY2FuY2VsID0gdGhpcy50cnlEb1BhcnRpYWxQYWdlTG9hZGluZyh1cmwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbk5hdmlhZ3Rpb25NZW51SXRlbUNsaWNrKGU6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQpIHtcclxuICAgIHRoaXMubWVudVNldHRpbmdzLm9uTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2s/LihlKTtcclxuICAgIGlmIChlLmNhbmNlbCB8fCB0aGlzLmlzS2V5UHJlc3NlZChlLm9yaWdpbmFsRXZlbnQgYXMgTW91c2VFdmVudCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlTWVudVN3aXRjaGVyU3RhdGUoZS5pdGVtLmlzR2xvYmFsKTtcclxuXHJcbiAgICBjb25zdCB1cmwgPSBnZXRVcmxCeU1lbnVJdGVtRGF0YShlLml0ZW0pO1xyXG4gICAgZS5jYW5jZWwgPSB0aGlzLnRyeURvUGFydGlhbFBhZ2VMb2FkaW5nKHVybCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzS2V5UHJlc3NlZChldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgcmV0dXJuIGV2ZW50ICYmIChldmVudC5hbHRLZXkgfHwgZXZlbnQuY3RybEtleSB8fCBldmVudC5zaGlmdEtleSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRyeURvUGFydGlhbFBhZ2VMb2FkaW5nKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy4kcGFydGlhbFZpZXdQbGFjZUhvbGRlciAmJiB1cmwgJiYgdGhpcy5jaGVja0lzTG9jYWxVcmwodXJsKSkge1xyXG4gICAgICBpZiAodGhpcy51cGRhdGVVcmxBZnRlclBhcnRpYWxMb2FkaW5nKSB7XHJcbiAgICAgICAgY29uc3Qgc3RhdGU6IElBamF4UGFnZU1hcmtlciA9IHtcclxuICAgICAgICAgIGlzTG9hZGVkQnlBamF4OiB0cnVlLFxyXG4gICAgICAgICAgaXNNZW51U3dpdGNoZXJHbG9iYWw6ICEhdGhpcy5tZW51U3dpdGNoZXI/LnZhbHVlLFxyXG4gICAgICAgICAgdXJsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKHN0YXRlLCBudWxsLCB1cmwpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmxvYWRQYWdlVmlhQWpheENvcmUodXJsKTtcclxuICAgICAgdGhpcy5uYXZpZ2F0aW9uTWVudS51cGRhdGVBY3RpdmVJdGVtc1N0YXRlKCk7XHJcblxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrSXNMb2NhbFVybCh1cmw6IHN0cmluZykge1xyXG4gICAgcmV0dXJuICFIZWFkZXIuR0xPQkFMX1VSTF9SRUdFWC50ZXN0KHVybCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrSXNQYXJ0aWFsUGFnZUNvbnRlbnQoY29udGVudDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gY29udGVudCAmJiAhSGVhZGVyLkRPQ1RZUEVfTUFSS0VSX1JFR0VYLnRlc3QoY29udGVudCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRQYWdlVmlhQWpheENvcmUodXJsOiBzdHJpbmcpIHtcclxuICAgIHdpbmRvdy5pc0lzb3pTZXJ2ZXJFeGNlcHRpb24gPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLmxvYWRQYW5lbC5zaG93KCk7XHJcblxyXG4gICAgY29uc3QgdXJsRm9yUGFydGlhbExvYWRpbmcgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyB1cmwpO1xyXG4gICAgdXJsRm9yUGFydGlhbExvYWRpbmcuc2VhcmNoUGFyYW1zLmFwcGVuZCgnaXNvelBhcnRpYWxMb2FkaW5nJywgJ3RydWUnKTtcclxuICAgIGNvbnN0IHBhcnRpYWxVcmwgPSB1cmxGb3JQYXJ0aWFsTG9hZGluZy50b1N0cmluZygpO1xyXG5cclxuICAgIHRoaXMuYmVmb3JlUGFydGlhbFZpZXdMb2FkaW5nPy4oKTtcclxuXHJcbiAgICAkLmFqYXgocGFydGlhbFVybCwgeyBkYXRhVHlwZTogJ2h0bWwnIH0pLmFsd2F5cygoZGF0YSwgdGV4dFN0YXR1cykgPT4ge1xyXG4gICAgICBpZiAodGV4dFN0YXR1cyAhPT0gJ3N1Y2Nlc3MnIHx8ICF0aGlzLmNoZWNrSXNQYXJ0aWFsUGFnZUNvbnRlbnQoZGF0YSkpIHtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLiRwYXJ0aWFsVmlld1BsYWNlSG9sZGVyLmh0bWwoZGF0YSk7XHJcbiAgICAgICAgdGhpcy5vblBhcnRpYWxWaWV3TG9hZGVkPy4oKTtcclxuICAgICAgICB0aGlzLmxvYWRQYW5lbC5oaWRlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJVc2VyTWVudShpdGVtczogSVVzZXJNZW51SXRlbU1vZGVsW10pIHtcclxuICAgIGlmICghdGhpcy5tZW51U2V0dGluZ3M/LnVzZXJOYW1lKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lcikge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcignY29udGVudENvbnRhaW5lcicpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy51c2VyTWVudSkge1xyXG4gICAgICBjb25zdCBkaXZpZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgIGRpdmlkZXIuY2xhc3NMaXN0LmFkZCgnZHJvcGRvd24tZGl2aWRlcicpO1xyXG4gICAgICB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIuYXBwZW5kQ2hpbGQoZGl2aWRlcik7XHJcblxyXG4gICAgICB0aGlzLnVzZXJNZW51ID0gbmV3IFVzZXJNZW51KHtcclxuICAgICAgICBjb250YWluZXI6IHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lcixcclxuICAgICAgICB1c2VyTmFtZTogdGhpcy5tZW51U2V0dGluZ3MudXNlck5hbWUsXHJcbiAgICAgICAgdXNlckF2YXRhcjogdGhpcy5tZW51U2V0dGluZ3MudXNlckF2YXRhcixcclxuICAgICAgICBpdGVtcyxcclxuICAgICAgICBjb2xsYXBzZUJyZWFrcG9pbnQ6IHRoaXMuY29sbGFwc2VCcmVha3BvaW50LFxyXG4gICAgICAgIG9uSXRlbUNsaWNrOiB0aGlzLm9uVXNlck1lbnVJdGVtQ2xpY2tIYW5kbGVyLFxyXG4gICAgICAgIGdldERpc3BsYXllZFVzZXJJbmZvOiB0aGlzLm1lbnVTZXR0aW5ncy5nZXREaXNwbGF5ZWRVc2VySW5mb1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy51c2VyTWVudS5yZW5kZXIoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudXNlck1lbnUudXBkYXRlSXRlbXMoaXRlbXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJNZW51U3dpdGNoZXIoKSB7XHJcbiAgICBpZiAoIXRoaXMuZGF0YT8uQWRkR2xvYmFsUGVyc29uYWxTd2l0Y2hlcikge1xyXG4gICAgICBpZiAodGhpcy5tZW51U3dpdGNoZXIpIHtcclxuICAgICAgICB0aGlzLm1lbnVTd2l0Y2hlci5kZXN0cm95KCk7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJEZXNrdG9wQ29udGFpbmVyPy5yZW1vdmUoKTtcclxuICAgICAgICB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlck1vYmlsZUNvbnRhaW5lcj8ucmVtb3ZlKCk7XHJcblxyXG4gICAgICAgIHRoaXMubWVudVN3aXRjaGVyID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyRGVza3RvcENvbnRhaW5lciA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlck1vYmlsZUNvbnRhaW5lciA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLm1lbnVTd2l0Y2hlcikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ2NvbnRlbnRDb250YWluZXInKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b25Db250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ3RvZ2dsZUJ1dHRvbkNvbnRhaW5lcicpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyRGVza3RvcENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJEZXNrdG9wQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21lbnUtc3dpdGNoZXInKTtcclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlck1vYmlsZUNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWVudS1zd2l0Y2hlcicpO1xyXG5cclxuICAgIHRoaXMubWVudVN3aXRjaGVyID0gbmV3IE1lbnVTd2l0Y2hlcih7XHJcbiAgICAgIGRlc2t0b3BDb250YWluZXI6IHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyRGVza3RvcENvbnRhaW5lcixcclxuICAgICAgbW9iaWxlQ29udGFpbmVyOiB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlck1vYmlsZUNvbnRhaW5lcixcclxuICAgICAgY29sbGFwc2VCcmVha3BvaW50OiB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludCxcclxuICAgICAgc3RhcnRWYWx1ZTogdGhpcy5pc1Nob3dHbG9iYWxNZW51KCksXHJcbiAgICAgIG9uU3dpdGNoOiAodmFsdWUpID0+IHtcclxuICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oU0hPV19HTE9CQUxfTUVOVV9LRVksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IG5hdmlnYXRpb25JdGVtcyA9IHRoaXMuZ2V0TmF2aWdhdGlvbkl0ZW1zKHRoaXMuZGF0YSk7XHJcbiAgICAgICAgdGhpcy5zZWFyY2g/LnNldFNlYXJjaFRleHQoJycpO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoPy5yZWxvYWRNZW51SXRlbXMoKTtcclxuICAgICAgICB0aGlzLnJlbmRlck5hdmlnYXRpb25NZW51KG5hdmlnYXRpb25JdGVtcyB8fCBbXSk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVDb250ZW50QW5kVG9nZ2xlclZpc2libGUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLm1lbnVTd2l0Y2hlci5yZW5kZXIoKTtcclxuICAgIHRoaXMuZW1pdChIZWFkZXIuTUVOVV9TV0lUQ0hFUl9JTklUSUFMSVpFRF9FVkVOVCk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXIsIHRoaXMudXNlck1lbnU/LnJvb3QpO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b25Db250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyTW9iaWxlQ29udGFpbmVyLCB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckxvYWRCYXIoKSB7XHJcbiAgICB0aGlzLiRsb2FkQmFyID0gJCgnPGRpdiAvPicpLmFkZENsYXNzKCdsb2FkLWJhcicpLmhpZGUoKS5hcHBlbmRUbyh0aGlzLiRlbCk7XHJcblxyXG4gICAgY29uc3QgJGxvYWQgPSAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2xvYWQnKS5hcHBlbmRUbyh0aGlzLiRsb2FkQmFyKTtcclxuICAgICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnYmFyJykuYXBwZW5kVG8oJGxvYWQpO1xyXG5cclxuICAgIGZ1bmN0aW9uIHJvdGF0ZShzZWxlY3Rvcjogc3RyaW5nKSB7XHJcbiAgICAgICQoc2VsZWN0b3IpLmFuaW1hdGUoeyBsZWZ0OiAkKCcubG9hZCcpLndpZHRoKCkgfSwgMjAwMCwgKCkgPT4ge1xyXG4gICAgICAgICQoc2VsZWN0b3IpLmNzcygnbGVmdCcsIGAkey0kKHNlbGVjdG9yKS53aWR0aCgpIX1weGApO1xyXG4gICAgICAgIHJvdGF0ZShzZWxlY3Rvcik7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJvdGF0ZSgnLmJhcicpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXJlbmRlck1lbnVzKCkge1xyXG4gICAgY29uc3QgbmF2aWdhdGlvbkl0ZW1zID0gdGhpcy5nZXROYXZpZ2F0aW9uSXRlbXModGhpcy5kYXRhKTtcclxuICAgIGNvbnN0IHVzZXJJdGVtcyA9IHRoaXMuZ2V0VXNlckl0ZW1zKHRoaXMuZGF0YSk7XHJcbiAgICAvLyBJZiBpdGVtcyBhcmUgdW5kZWZpbmVkIHdlIGRvbid0IHVwZGF0ZSBtZW51c1xyXG4gICAgbmF2aWdhdGlvbkl0ZW1zICYmIHRoaXMucmVuZGVyTmF2aWdhdGlvbk1lbnUobmF2aWdhdGlvbkl0ZW1zKTtcclxuICAgIHVzZXJJdGVtcyAmJiB0aGlzLnJlbmRlclVzZXJNZW51KHVzZXJJdGVtcyk7XHJcbiAgICB0aGlzLnJlbmRlck1lbnVTd2l0Y2hlcigpO1xyXG4gICAgdGhpcy51cGRhdGVDb250ZW50QW5kVG9nZ2xlclZpc2libGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlQ29udGVudEFuZFRvZ2dsZXJWaXNpYmxlKCkge1xyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIgJiYgIXRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBuYXZpZ2F0aW9uSXRlbXMgPSB0aGlzLmdldE5hdmlnYXRpb25JdGVtcyh0aGlzLmRhdGEpO1xyXG4gICAgY29uc3QgdXNlckl0ZW1zID0gdGhpcy5nZXRVc2VySXRlbXModGhpcy5kYXRhKTtcclxuICAgIGNvbnN0IGlzVmlzaWJsZSA9IChuYXZpZ2F0aW9uSXRlbXMgJiYgbmF2aWdhdGlvbkl0ZW1zLmxlbmd0aCA+IDApXHJcbiAgICAgIHx8IHRoaXMubWVudVNldHRpbmdzPy51c2VyTmFtZVxyXG4gICAgICB8fCAodXNlckl0ZW1zICYmIHVzZXJJdGVtcy5sZW5ndGggPiAwKTtcclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnLCAhaXNWaXNpYmxlKTtcclxuICAgIHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnLCAhaXNWaXNpYmxlKTtcclxuXHJcbiAgICB0aGlzLnNlYXJjaD8uc2V0VmlzaWJsZSghIWlzVmlzaWJsZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRhdGEgPSBhd2FpdCB0aGlzLmxvYWREYXRhKCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLnJvb3QpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVyZW5kZXJNZW51cygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBsb2FkRGF0YSgpOiBQcm9taXNlPElBcHBNZW51TW9kZWwgfCB1bmRlZmluZWQ+IHtcclxuICAgIGlmICghdGhpcy5tZW51U2V0dGluZ3MpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgaGVhZGVyIGRvZXNuXFwndCBoYXZlIG1lbnUgc2V0dGluZ3MnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIHRoaXMubWVudVNldHRpbmdzLmRhdGEgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLm1lbnVTZXR0aW5ncy5kYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBkYXRhID0gdGhpcy5nZXRDYWNoZWRBcHBNZW51TW9kZWwoKTtcclxuICAgIGlmIChkYXRhKSB7XHJcbiAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoPy5zZXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgdGhpcy4kbG9hZEJhcj8uc2hvdygpO1xyXG4gICAgICBkYXRhID0gYXdhaXQgc2VuZFJlcXVlc3Q8SUFwcE1lbnVNb2RlbD4odGhpcy5tZW51U2V0dGluZ3MuZGF0YSk7XHJcbiAgICAgIHRoaXMuY2FjaGVBcHBNZW51TW9kZWwoZGF0YSk7XHJcbiAgICAgIHRoaXMuc2VhcmNoPy5yZWxvYWRNZW51SXRlbXMoKTtcclxuXHJcbiAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5zZWFyY2g/LnNldFZpc2libGUodHJ1ZSk7XHJcbiAgICAgIHRoaXMuJGxvYWRCYXI/LmhpZGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0TmF2aWdhdGlvbkl0ZW1zKGFwcE1lbnVNb2RlbDogSUFwcE1lbnVNb2RlbCB8IHVuZGVmaW5lZCkge1xyXG4gICAgaWYgKCFhcHBNZW51TW9kZWwpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzaG93R2xvYmFsTWVudSA9IHRoaXMuaXNTaG93R2xvYmFsTWVudSgpO1xyXG5cclxuICAgIHJldHVybiBzaG93R2xvYmFsTWVudSB8fCAhYXBwTWVudU1vZGVsLkFkZEdsb2JhbFBlcnNvbmFsU3dpdGNoZXJcclxuICAgICAgPyBhcHBNZW51TW9kZWwuTmF2aWdhdGlvbkl0ZW1zXHJcbiAgICAgIDogYXBwTWVudU1vZGVsLlBlcnNvbmFsTmF2aWdhdGlvbkl0ZW1zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTZWFyY2hEYXRhU291cmNlKGFwcE1lbnVNb2RlbDogSUFwcE1lbnVNb2RlbCB8IHVuZGVmaW5lZCk6IElTZWFyY2hEYXRhU291cmNlIHtcclxuICAgIGlmICghYXBwTWVudU1vZGVsKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZ2xvYWJhbEl0ZW1zOiBhcHBNZW51TW9kZWwuTmF2aWdhdGlvbkl0ZW1zLFxyXG4gICAgICBwZXJzb25hbEl0ZW1zOiBhcHBNZW51TW9kZWwuQWRkR2xvYmFsUGVyc29uYWxTd2l0Y2hlciA/IGFwcE1lbnVNb2RlbC5QZXJzb25hbE5hdmlnYXRpb25JdGVtcyA6IHVuZGVmaW5lZFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0VXNlckl0ZW1zKGFwcE1lbnVNb2RlbDogSUFwcE1lbnVNb2RlbCB8IHVuZGVmaW5lZCkge1xyXG4gICAgaWYgKCFhcHBNZW51TW9kZWwpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYXBwTWVudU1vZGVsLlVzZXJJdGVtcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q2FjaGVkQXBwTWVudU1vZGVsKCk6IElBcHBNZW51TW9kZWwgfCBudWxsIHtcclxuICAgIGlmICghdGhpcy5tZW51U2V0dGluZ3MpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmF3VmFsdWUgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShnZXREYXRhU291cmNlQ2FjaGVGaWVsZCh0aGlzLm1lbnVTZXR0aW5ncy51c2VyTmFtZSkpO1xyXG5cclxuICAgIHJldHVybiByYXdWYWx1ZSA9PT0gbnVsbCA/IHJhd1ZhbHVlIDogSlNPTi5wYXJzZShyYXdWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhY2hlQXBwTWVudU1vZGVsKGRhdGE6IElBcHBNZW51TW9kZWwpIHtcclxuICAgIGlmICghdGhpcy5tZW51U2V0dGluZ3MpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGdldERhdGFTb3VyY2VDYWNoZUZpZWxkKHRoaXMubWVudVNldHRpbmdzLnVzZXJOYW1lKSwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGVhckFwcE1lbnVNb2RlbENhY2hlKCkge1xyXG4gICAgaWYgKCF0aGlzLm1lbnVTZXR0aW5ncykge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oZ2V0RGF0YVNvdXJjZUNhY2hlRmllbGQodGhpcy5tZW51U2V0dGluZ3MudXNlck5hbWUpKTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNTaG93R2xvYmFsTWVudSgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHJhd0lzR2xvYmFsID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFNIT1dfR0xPQkFMX01FTlVfS0VZKTtcclxuICAgIGNvbnN0IGlzR2xvYmFsID0gcmF3SXNHbG9iYWwgPT09IG51bGwgPyByYXdJc0dsb2JhbCBhcyBudWxsIDogSlNPTi5wYXJzZShyYXdJc0dsb2JhbCkgYXMgYm9vbGVhbjtcclxuXHJcbiAgICByZXR1cm4gaXNHbG9iYWwgPT09IG51bGwgfHwgaXNHbG9iYWw7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZjb25zdCBncmlkQ29sdW1uVHlwZXMgPSBbJ2RlZmF1bHQnLCAnc3RyaW5nJywgJ251bWJlcicsICdkYXRlJywgJ2Jvb2xlYW4nLCAnb2JqZWN0JywgJ2RhdGV0aW1lJ107XHJcblxyXG5leHBvcnQgZGVmYXVsdCBncmlkQ29sdW1uVHlwZXM7XHJcbiIsICJcdUZFRkZleHBvcnQgZW51bSBDZG1JbXBvcnRGaWxlTW9kZSB7XHJcbiAgTm9uZSA9IDAsXHJcbiAgQWRkTmV3Um93cyA9IDEsXHJcbiAgUmVwbGFjZUFsbFJvd3MgPSAyLFxyXG59XHJcbiIsICJcdUZFRkZcclxuZXhwb3J0IGVudW0gR3JpZERhdGFDb2x1bW5EYXRhVHlwZSB7XHJcbiAgRGVmYXVsdCA9ICdkZWZhdWx0JyxcclxuICBTdHJpbmcgPSAnc3RyaW5nJyxcclxuICBOdW1iZXIgPSAnbnVtYmVyJyxcclxuICBEYXRlID0gJ2RhdGUnLFxyXG4gIEJvb2xlYW4gPSAnYm9vbGVhbicsXHJcbiAgT2JqZWN0ID0gJ29iamVjdCcsXHJcbiAgRGF0ZXRpbWUgPSAnZGF0ZXRpbWUnXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRDb2x1bW5TdGF0ZSB7XHJcbiAgZGF0YUZpZWxkOiBzdHJpbmc7XHJcbiAgZGF0YVR5cGU6IEdyaWREYXRhQ29sdW1uRGF0YVR5cGU7XHJcbiAgd2lkdGg/OiBzdHJpbmcgfCBudW1iZXI7XHJcbiAgZ3JvdXBJbmRleD86IG51bWJlcjtcclxuICBzb3J0SW5kZXg/OiBudW1iZXI7XHJcbiAgc29ydE9yZGVyPzogbnVtYmVyO1xyXG4gIHZpc2libGU/OiBib29sZWFuO1xyXG4gIHZpc2libGVJbmRleD86IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZSB7XHJcbiAgY2FwdGlvbj86IHN0cmluZztcclxuICB0b29sdGlwPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRXh0ZW5kZWRDb2x1bW5TdGF0ZSBleHRlbmRzIElHcmlkQ29sdW1uU3RhdGUsIElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlIHtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZFN0YXRlIHtcclxuICBjb2x1bW5zOiBJR3JpZEV4dGVuZGVkQ29sdW1uU3RhdGVbXTtcclxufVxyXG4iLCAiY29uc3QgbG9hZGVkVXJsczogc3RyaW5nW10gPSBbXVxyXG5cclxuZnVuY3Rpb24gcmFuZG9tSW50ZWdlcihtaW46IG51bWJlciwgbWF4OiBudW1iZXIpIHtcclxuICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKSArIG1pbjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNob3cgKCRjb250YWluZXI6IEpRdWVyeSwgaW1hZ2VVcmxzOiBzdHJpbmdbXSwgaW1nQ2hhbmdlSW50ZXJ2YWxTZWM6IG51bWJlciA9IDUsIHRyYW5zaXRpb25UaW1lU2VjOiBudW1iZXIgPSAyKSB7XHJcbiAgLy8gU2h1ZmZsZSB1cmxzXHJcbiAgY29uc3Qgc2h1ZmZsZWRVcmxzID0gaW1hZ2VVcmxzLnNvcnQoKGEsIGIpID0+IDAuNSAtIE1hdGgucmFuZG9tKCkpO1xyXG5cclxuICAkY29udGFpbmVyLmFkZENsYXNzKCdpc3pvbGVhLWJhY2tncm91bmQtaW1hZ2Utdmlld2VyJykuY3NzKHtcclxuICAgICd0cmFuc2l0aW9uJzogYGJhY2tncm91bmQtaW1hZ2UgJHt0cmFuc2l0aW9uVGltZVNlY31zIGVhc2UtaW4tb3V0IDBzYCxcclxuICB9KTtcclxuXHJcbiAgc2h1ZmZsZWRVcmxzLmZvckVhY2goKHVybCwgaW5kZXgpID0+IHtcclxuICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xyXG5cclxuICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xyXG4gICAgICBsb2FkZWRVcmxzLnB1c2godXJsKTtcclxuXHJcbiAgICAgIGlmKGxvYWRlZFVybHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgaW5pdEltYWdlc0NoYW5naW5nKCRjb250YWluZXIsIGltZ0NoYW5nZUludGVydmFsU2VjKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpbWcuc3JjID0gdXJsO1xyXG4gICAgfSwgaW5kZXggKiAxMDApO1xyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXROZXh0SW5kZXhUb1Nob3cgKGN1cnJlbnRJbmRleDogbnVtYmVyKSB7XHJcbiAgaWYobG9hZGVkVXJscy5sZW5ndGggPT09IDEpIHtcclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuXHJcbiAgaWYobG9hZGVkVXJscy5sZW5ndGggPT09IDIpIHtcclxuICAgIHJldHVybiBjdXJyZW50SW5kZXggPT09IDAgPyAxIDogMDtcclxuICB9XHJcblxyXG4gIGNvbnN0IG5leHRJbmRleCA9IHJhbmRvbUludGVnZXIoMCwgbG9hZGVkVXJscy5sZW5ndGggLSAxKTtcclxuXHJcbiAgaWYobmV4dEluZGV4ID09PSBjdXJyZW50SW5kZXgpIHtcclxuICAgIHJldHVybiBuZXh0SW5kZXggPT09IGxvYWRlZFVybHMubGVuZ3RoIC0gMSA/IDAgOiBuZXh0SW5kZXggKyAxO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG5leHRJbmRleDtcclxufVxyXG5cclxuZnVuY3Rpb24gaW5pdEltYWdlc0NoYW5naW5nICgkY29udGFpbmVyOiBKUXVlcnksIGltZ0NoYW5nZUludGVydmFsU2VjOiBudW1iZXIpIHtcclxuICBsZXQgY3VycmVudFNob3duSW5kZXggPSAwO1xyXG5cclxuICBzaG93SW1hZ2UoJGNvbnRhaW5lciwgY3VycmVudFNob3duSW5kZXgpO1xyXG5cclxuICB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgaWYobG9hZGVkVXJscy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGN1cnJlbnRTaG93bkluZGV4ID0gZ2V0TmV4dEluZGV4VG9TaG93KGN1cnJlbnRTaG93bkluZGV4KTtcclxuICAgIHNob3dJbWFnZSgkY29udGFpbmVyLCBjdXJyZW50U2hvd25JbmRleCk7XHJcbiAgfSwgaW1nQ2hhbmdlSW50ZXJ2YWxTZWMgKiAxMDAwKTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd0ltYWdlICgkY29udGFpbmVyOiBKUXVlcnksIGluZGV4OiBudW1iZXIpIHtcclxuICAkY29udGFpbmVyLmNzcygnYmFja2dyb3VuZC1pbWFnZScsIGB1cmwoXCIke2xvYWRlZFVybHNbaW5kZXhdfVwiKWApO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTGljZW5jZSB9IGZyb20gJy4uL0J1c2luZXNzJztcclxuXHJcbmV4cG9ydCBlbnVtIEZvb3RlckluZGljYXRvclN0YXR1cyB7XHJcbiAgU3VjY2VzcyxcclxuICBXYXJuaW5nLFxyXG4gIEVycm9yXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZvb3RlckluZGljYXRvclZhbHVlIHtcclxuICBzdGF0dXM6IEZvb3RlckluZGljYXRvclN0YXR1cztcclxuICB0aXRsZT86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRm9vdGVySW5kaWNhdG9yT3B0aW9ucyB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIHRleHQ6IHN0cmluZztcclxuICB2YWx1ZTogSUZvb3RlckluZGljYXRvclZhbHVlO1xyXG4gIGdldFZhbHVlPzogKCkgPT4gUHJvbWlzZTxJRm9vdGVySW5kaWNhdG9yVmFsdWU+O1xyXG4gIGdldFZhbHVlSW50ZXJ2YWxNcz86IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRm9vdGVyT3B0aW9ucyB7XHJcbiAgJHJvb3Q6IEpRdWVyeTtcclxuICBuYW1lOiBzdHJpbmcgfCBmYWxzZTtcclxuICBsaWNlbmNlOiBJTGljZW5jZSB8IGZhbHNlO1xyXG4gIHllYXI/OiBudW1iZXIgfCAnbG9jYWwnIHwgZmFsc2U7XHJcbiAgdmVyc2lvbj86IHN0cmluZztcclxuICBzZXJ2ZXJOYW1lPzogc3RyaW5nO1xyXG4gIGRhdGFiYXNlPzogc3RyaW5nO1xyXG4gIGluZGljYXRvcnM/OiBJRm9vdGVySW5kaWNhdG9yT3B0aW9uc1tdO1xyXG59XHJcblxyXG5jb25zdCBkZWZhdWx0T3B0aW9uczogUGFydGlhbDxJRm9vdGVyT3B0aW9ucz4gPSB7XHJcbiAgeWVhcjogJ2xvY2FsJ1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRm9vdGVyIHtcclxuICBwcml2YXRlIHN0YXRpYyBnZXRDdXJyZW50WWVhcihjdXJyZW50WWVhcjogbnVtYmVyIHwgJ2xvY2FsJyB8IGZhbHNlKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBjdXJyZW50WWVhciA9PT0gJ2xvY2FsJyB8fCBjdXJyZW50WWVhciA9PT0gZmFsc2VcclxuICAgICAgPyBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKClcclxuICAgICAgOiBjdXJyZW50WWVhcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgJHJvb3Q6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbm5lY3RlZFRvOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93TmFtZTogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxpY2VuY2U6IElMaWNlbmNlIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd0xpY2VuY2U6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSB5ZWFyOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93WWVhcjogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IHNob3dDb25uZWN0ZWRUbzogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGluZGljYXRvcnNPcHRpb25zOiBJRm9vdGVySW5kaWNhdG9yT3B0aW9uc1tdO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5kaWNhdG9yc0J5TmFtZTogTWFwPHN0cmluZywgSlF1ZXJ5PjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGluZGljYXRvckNsYXNzQnlTdGF0dXMgPSBuZXcgTWFwPEZvb3RlckluZGljYXRvclN0YXR1cywgc3RyaW5nPihbXHJcbiAgICBbRm9vdGVySW5kaWNhdG9yU3RhdHVzLlN1Y2Nlc3MsICdmb290ZXJfX2luZGljYXRvcl90eXBlX3N1Y2Nlc3MnXSxcclxuICAgIFtGb290ZXJJbmRpY2F0b3JTdGF0dXMuV2FybmluZywgJ2Zvb3Rlcl9faW5kaWNhdG9yX3R5cGVfd2FybmluZyddLFxyXG4gICAgW0Zvb3RlckluZGljYXRvclN0YXR1cy5FcnJvciwgJ2Zvb3Rlcl9faW5kaWNhdG9yX3R5cGVfZXJyb3InXVxyXG4gIF0pO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJRm9vdGVyT3B0aW9ucykge1xyXG4gICAgY29uc3QgbWVyZ2VkT3B0aW9ucyA9IHsgLi4ub3B0aW9ucywgLi4uZGVmYXVsdE9wdGlvbnMgfSBhcyBSZXF1aXJlZDxJRm9vdGVyT3B0aW9ucz47XHJcblxyXG4gICAgdGhpcy4kcm9vdCA9IG1lcmdlZE9wdGlvbnMuJHJvb3Q7XHJcbiAgICB0aGlzLm5hbWUgPSBtZXJnZWRPcHRpb25zLm5hbWUgIT09IGZhbHNlID8gbWVyZ2VkT3B0aW9ucy5uYW1lIDogdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5saWNlbmNlID0gbWVyZ2VkT3B0aW9ucy5saWNlbmNlICE9PSBmYWxzZSA/IG1lcmdlZE9wdGlvbnMubGljZW5jZSA6IHVuZGVmaW5lZDtcclxuICAgIHRoaXMueWVhciA9IEZvb3Rlci5nZXRDdXJyZW50WWVhcihtZXJnZWRPcHRpb25zLnllYXIpO1xyXG4gICAgdGhpcy52ZXJzaW9uID0gb3B0aW9ucy52ZXJzaW9uIHx8IHVuZGVmaW5lZDtcclxuXHJcbiAgICB0aGlzLnNob3dOYW1lID0gbWVyZ2VkT3B0aW9ucy5uYW1lICE9PSBmYWxzZTtcclxuICAgIHRoaXMuc2hvd0xpY2VuY2UgPSBtZXJnZWRPcHRpb25zLmxpY2VuY2UgIT09IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93WWVhciA9IG1lcmdlZE9wdGlvbnMueWVhciAhPT0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dDb25uZWN0ZWRUbyA9ICEhbWVyZ2VkT3B0aW9ucy5zZXJ2ZXJOYW1lICYmICEhbWVyZ2VkT3B0aW9ucy5kYXRhYmFzZTtcclxuICAgIHRoaXMuaW5kaWNhdG9yc09wdGlvbnMgPSBvcHRpb25zLmluZGljYXRvcnMgfHwgW107XHJcbiAgICB0aGlzLmluZGljYXRvcnNCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgSlF1ZXJ5PigpO1xyXG5cclxuICAgIHRoaXMuY29ubmVjdGVkVG8gPSB0aGlzLnNob3dDb25uZWN0ZWRUbyA/IGAke21lcmdlZE9wdGlvbnMuc2VydmVyTmFtZX0gLSAke21lcmdlZE9wdGlvbnMuZGF0YWJhc2V9YCA6IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0KCkge1xyXG4gICAgdGhpcy4kcm9vdC5hZGRDbGFzcygnZm9vdGVyJyk7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJJbmRpY2F0b3JzKCk7XHJcbiAgICB0aGlzLnJlbmRlckNvcHlyaWdodCgpO1xyXG4gICAgdGhpcy5zaG93WWVhciAmJiB0aGlzLnJlbmRlclllYXIoKTtcclxuICAgIHRoaXMuc2hvd05hbWUgJiYgdGhpcy5yZW5kZXJOYW1lKCk7XHJcbiAgICB0aGlzLnNob3dDb25uZWN0ZWRUbyAmJiB0aGlzLnJlbmRlckNvbm5lY3RlZFRvKCk7XHJcbiAgICB0aGlzLnNob3dMaWNlbmNlICYmIHRoaXMucmVuZGVyTGljZW5jZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEluZGljYXRvclZhbHVlKGluZGljYXRvck5hbWU6IHN0cmluZywgdmFsdWU6IElGb290ZXJJbmRpY2F0b3JWYWx1ZSkge1xyXG4gICAgY29uc3QgJGluZGljYXRvckVsID0gdGhpcy5pbmRpY2F0b3JzQnlOYW1lLmdldChpbmRpY2F0b3JOYW1lKTtcclxuICAgIGlmICgkaW5kaWNhdG9yRWwpIHtcclxuICAgICAgdGhpcy5zZXRJbmRpY2F0b3JWYWx1ZUNvcmUoJGluZGljYXRvckVsLCB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckluZGljYXRvcnMoKSB7XHJcbiAgICB0aGlzLmluZGljYXRvcnNPcHRpb25zPy5mb3JFYWNoKChvKSA9PiB7XHJcbiAgICAgIGlmIChvLnRleHQpIHtcclxuICAgICAgICAkKCc8c3Bhbj4nKVxyXG4gICAgICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2luZGljYXRvci10ZXh0JylcclxuICAgICAgICAgIC5odG1sKGAke28udGV4dH06YClcclxuICAgICAgICAgIC5hcHBlbmRUbyh0aGlzLiRyb290KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgJGluZGljYXRvckVsID0gJCgnPHNwYW4+JylcclxuICAgICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9faW5kaWNhdG9yJylcclxuICAgICAgICAuYXBwZW5kVG8odGhpcy4kcm9vdCk7XHJcblxyXG4gICAgICB0aGlzLnNldEluZGljYXRvclZhbHVlQ29yZSgkaW5kaWNhdG9yRWwsIG8udmFsdWUpO1xyXG4gICAgICB0aGlzLmluZGljYXRvcnNCeU5hbWUuc2V0KG8ubmFtZSwgJGluZGljYXRvckVsKTtcclxuXHJcbiAgICAgIGlmIChvLmdldFZhbHVlICYmIG8uZ2V0VmFsdWVJbnRlcnZhbE1zKSB7XHJcbiAgICAgICAgc2V0SW50ZXJ2YWwoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBvLmdldFZhbHVlKCk7XHJcbiAgICAgICAgICB0aGlzLnNldEluZGljYXRvclZhbHVlQ29yZSgkaW5kaWNhdG9yRWwsIHZhbHVlKTtcclxuICAgICAgICB9LCBvLmdldFZhbHVlSW50ZXJ2YWxNcyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRJbmRpY2F0b3JWYWx1ZUNvcmUoJGluZGljYXRvckVsOiBKUXVlcnksIHZhbHVlOiBJRm9vdGVySW5kaWNhdG9yVmFsdWUpIHtcclxuICAgICRpbmRpY2F0b3JFbC5hdHRyKCd0aXRsZScsIHZhbHVlLnRpdGxlKTtcclxuICAgICRpbmRpY2F0b3JFbC5yZW1vdmVDbGFzcyhbLi4udGhpcy5pbmRpY2F0b3JDbGFzc0J5U3RhdHVzLnZhbHVlcygpXSk7XHJcbiAgICAkaW5kaWNhdG9yRWwuYWRkQ2xhc3ModGhpcy5pbmRpY2F0b3JDbGFzc0J5U3RhdHVzLmdldCh2YWx1ZS5zdGF0dXMpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQ29weXJpZ2h0KCkge1xyXG4gICAgJCgnPHNwYW4+JylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2NvcHlyaWdodCcpXHJcbiAgICAgIC5odG1sKCcmY29weTsnKVxyXG4gICAgICAuYXBwZW5kVG8odGhpcy4kcm9vdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlck5hbWUoKSB7XHJcbiAgICB0aGlzLm5hbWUgJiYgJCgnPHNwYW4+JylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2l0ZW0nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9fYXBwLW5hbWUnKVxyXG4gICAgICAudGV4dCh0aGlzLm5hbWUgKyAoISF0aGlzLnZlcnNpb24gPyBgOiAke3RoaXMudmVyc2lvbn1gIDogJycpKVxyXG4gICAgICAuYXBwZW5kVG8odGhpcy4kcm9vdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckNvbm5lY3RlZFRvKCkge1xyXG4gICAgdGhpcy5uYW1lICYmICQoJzxzcGFuPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pdGVtJylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2Nvbm5lY3RlZC10bycpXHJcbiAgICAgIC50ZXh0KGBDb25uZWN0ZWQgdG86ICR7dGhpcy5jb25uZWN0ZWRUb30uYClcclxuICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJZZWFyKCkge1xyXG4gICAgJCgnPHNwYW4+JylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2l0ZW0nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9fY3VycmVudC15ZWFyJylcclxuICAgICAgLnRleHQodGhpcy55ZWFyKVxyXG4gICAgICAuYXBwZW5kVG8odGhpcy4kcm9vdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckxpY2VuY2UoKSB7XHJcbiAgICB0aGlzLmxpY2VuY2UgJiYgJCgnPHNwYW4+JylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2l0ZW0nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9fbGljZW5jZS1pbmZvJylcclxuICAgICAgLmFwcGVuZChcclxuICAgICAgICAkKCc8c3Bhbj4nKVxyXG4gICAgICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2xpY2VuY2Utb3duZXInKVxyXG4gICAgICAgICAgLnRleHQoYCR7dGhpcy5nZXRMaWNlbmNlT3duZXJEaXNwbGF5VGV4dCh0aGlzLmxpY2VuY2UpfS4gYClcclxuICAgICAgKVxyXG4gICAgICAuYXBwZW5kKFxyXG4gICAgICAgICQoJzxzcGFuPicpXHJcbiAgICAgICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9fbGljZW5jZS1kYXRlJylcclxuICAgICAgICAgIC50ZXh0KHRoaXMuZ2V0TGljZW5jZUV4cGlyYXRpb25EYXRlRGlzcGxheVRleHQodGhpcy5saWNlbmNlKSlcclxuICAgICAgKVxyXG4gICAgICAuYXBwZW5kVG8odGhpcy4kcm9vdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldExpY2VuY2VPd25lckRpc3BsYXlUZXh0KGxpY2VuY2U6IElMaWNlbmNlKSB7XHJcbiAgICByZXR1cm4gYExpY2VuY2VkIHRvOiAke2xpY2VuY2UuT3duZXJ9YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0TGljZW5jZUV4cGlyYXRpb25EYXRlRGlzcGxheVRleHQobGljZW5jZTogSUxpY2VuY2UpIHtcclxuICAgIGNvbnN0IGRhdGUgPSB0eXBlb2YgbGljZW5jZS5FeHBpcmF0aW9uRGF0ZSA9PT0gJ3N0cmluZycgPyBuZXcgRGF0ZShsaWNlbmNlLkV4cGlyYXRpb25EYXRlKSA6IGxpY2VuY2UuRXhwaXJhdGlvbkRhdGU7XHJcblxyXG4gICAgcmV0dXJuIGBMaWNlbmNlIEV4cGlyeTogJHtkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpfWA7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZsZXQgcmVwYWludFRpbWVvdXQgPSBudWxsO1xyXG5jb25zdCByZXNpemVIYW5kbGVycyA9IFtdO1xyXG5cclxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHtcclxuICBpZiAocmVwYWludFRpbWVvdXQpIHtcclxuICAgIHdpbmRvdy5jbGVhclRpbWVvdXQocmVwYWludFRpbWVvdXQpO1xyXG4gIH1cclxuXHJcbiAgcmVwYWludFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICByZXNpemVIYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiBoYW5kbGVyKCkpO1xyXG4gICAgcmVwYWludFRpbWVvdXQgPSBudWxsO1xyXG4gIH0sIDEwMCk7XHJcbn0pO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ob25SZXNpemU6ICgpID0+IHZvaWQpIHtcclxuICByZXNpemVIYW5kbGVycy5wdXNoKG9uUmVzaXplKTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IGF1dG9SZXNpemUgZnJvbSAnLi9BdXRvUmVzaXplJztcclxuXHJcbmNvbnN0IENTUyA9IHtcclxuICBtYWluOiAnLm1haW4nLFxyXG4gIGhlYWRlcjogJy5tYWluIC5oZWFkZXInLFxyXG4gIGNvbnRlbnQ6ICcuY29udGVudC1hcmVhJyxcclxuICBwYW5lbDogJy5wYW5lbCcsXHJcbiAgZm9vdGVyOiAnZm9vdGVyJ1xyXG59O1xyXG5cclxubGV0IGxhc3RXaW5kb3dIZWlnaHQgPSBudWxsO1xyXG5sZXQgbGFzdENvbnRlbnRIZWlnaHQgPSBudWxsO1xyXG5sZXQgbGFzdFdpZGdldEhlaWdodCA9IG51bGw7XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVIZWlnaHQod2lkZ2V0KSB7XHJcbiAgY29uc3QgJGNvbnRlbnQgPSAkKENTUy5jb250ZW50KTtcclxuXHJcbiAgJGNvbnRlbnQuaGVpZ2h0KGxhc3RDb250ZW50SGVpZ2h0KTtcclxuICB3aWRnZXQub3B0aW9uKCdoZWlnaHQnLCBsYXN0V2lkZ2V0SGVpZ2h0KTtcclxufVxyXG5cclxuZnVuY3Rpb24gY2FsY3VsYXRlSGVpZ2h0KHdpZGdldDogRGV2RXhwcmVzcy51aS5XaWRnZXQ8YW55PiwgaWdub3JlU2libGluZ3M6IGJvb2xlYW4gPSBmYWxzZSwgYWRkT3duU2l6ZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgY29uc3QgJG1haW4gPSAkKENTUy5tYWluKTtcclxuICBjb25zdCAkaGVhZGVyID0gJChDU1MuaGVhZGVyKTtcclxuICBjb25zdCAkY29udGVudCA9ICQoQ1NTLmNvbnRlbnQpO1xyXG4gIGNvbnN0ICRmb290ZXIgPSAkKENTUy5mb290ZXIpO1xyXG5cclxuICBjb25zdCBwYWRkaW5ncyA9ICRjb250ZW50Lm91dGVySGVpZ2h0KCkgLSAkY29udGVudC5oZWlnaHQoKTtcclxuXHJcbiAgbGFzdENvbnRlbnRIZWlnaHQgPSAkbWFpbi5oZWlnaHQoKSAtICRoZWFkZXIuaGVpZ2h0KCkgLSAkZm9vdGVyLm91dGVySGVpZ2h0KCkgLSBwYWRkaW5ncztcclxuICBsYXN0V2luZG93SGVpZ2h0ID0gJCh3aW5kb3cpLmhlaWdodCgpO1xyXG5cclxuICBjb25zdCAkY29udGVudEVsZW1lbnRzID0gJGNvbnRlbnQuY2hpbGRyZW4oKTtcclxuICBsZXQgY29udGVudEVsZW1lbnRzSGVpZ2h0ID0gMDtcclxuXHJcbiAgaWYgKCFpZ25vcmVTaWJsaW5ncykge1xyXG4gICAgY29uc3QgJHdpZGdldEVsZW1lbnQgPSB3aWRnZXQuZWxlbWVudCgpO1xyXG4gICAgJGNvbnRlbnRFbGVtZW50cy5lYWNoKChpbmRleCwgZWwpID0+IHtcclxuICAgICAgY29uc3QgJGNoaWxkID0gJChlbCk7XHJcblxyXG4gICAgICBpZiAoJGNoaWxkLmlzKCR3aWRnZXRFbGVtZW50KSB8fCAkY2hpbGQuaGFzKCR3aWRnZXRFbGVtZW50WzBdKS5sZW5ndGgpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnRlbnRFbGVtZW50c0hlaWdodCArPSAoJGNoaWxkLmlzKCc6dmlzaWJsZScpICYmICRjaGlsZC5jc3MoJ3Bvc2l0aW9uJykgIT09ICdhYnNvbHV0ZScpID8gJGNoaWxkLm91dGVySGVpZ2h0KHRydWUpIDogMDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbGFzdFdpZGdldEhlaWdodCA9IGxhc3RDb250ZW50SGVpZ2h0IC0gY29udGVudEVsZW1lbnRzSGVpZ2h0O1xyXG5cclxuICBpZiAoYWRkT3duU2l6ZSkge1xyXG4gICAgbGFzdFdpZGdldEhlaWdodCArPSB3aWRnZXQuZWxlbWVudCgpLm91dGVySGVpZ2h0KCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVIZWlnaHQod2lkZ2V0KTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVjYWxjdWxhdGVIZWlnaHQod2lkZ2V0OiBEZXZFeHByZXNzLnVpLldpZGdldDxhbnk+KSB7XHJcbiAgY29uc3Qgd2luZG93SGVpZ2h0ID0gJCh3aW5kb3cpLmhlaWdodCgpO1xyXG4gIGNvbnN0IGRpZmYgPSB3aW5kb3dIZWlnaHQgLSBsYXN0V2luZG93SGVpZ2h0O1xyXG5cclxuICBsYXN0Q29udGVudEhlaWdodCArPSBkaWZmO1xyXG4gIGxhc3RXaWRnZXRIZWlnaHQgKz0gZGlmZjtcclxuICBsYXN0V2luZG93SGVpZ2h0ID0gd2luZG93SGVpZ2h0O1xyXG5cclxuICB1cGRhdGVIZWlnaHQod2lkZ2V0KTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24od2lkZ2V0OiBEZXZFeHByZXNzLnVpLldpZGdldDxhbnk+LCBpZ25vcmVTaWJsaW5nczogYm9vbGVhbiA9IGZhbHNlLCBhZGRPd25TaXplOiBib29sZWFuID0gZmFsc2UpIHtcclxuICBjYWxjdWxhdGVIZWlnaHQod2lkZ2V0LCBpZ25vcmVTaWJsaW5ncywgYWRkT3duU2l6ZSk7XHJcblxyXG4gIGF1dG9SZXNpemUoKCkgPT4gcmVjYWxjdWxhdGVIZWlnaHQod2lkZ2V0KSk7XHJcbn1cclxuIiwgIlx1RkVGRmNvbnN0IERJU0FCTEVEX0NMQVNTID0gJ2lzb3otaWNvbi1kaXNhYmxlZCc7XHJcblxyXG5leHBvcnQgY29uc3QgVEhFTUVfQ0xBU1NFUyA9IHtcclxuICBsZzogJ2lzem9sZWEtbGcnLFxyXG4gIG1kOiAnaXN6b2xlYS1tZCcsXHJcbiAgc206ICdpc3pvbGVhLXNtJ1xyXG59O1xyXG5cclxuZXhwb3J0IGNsYXNzIFRoZW1lSGVscGVyIHtcclxuICBwdWJsaWMgc3RhdGljIHNldEVsZW1lbnRNaWRkbGVTaXplKGVsZW1lbnQ6IEpRdWVyeTxIVE1MRWxlbWVudD4pIHtcclxuICAgIGVsZW1lbnQuYWRkQ2xhc3MoVEhFTUVfQ0xBU1NFUy5tZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHNldEVsZW1lbnRTbWFsbFNpemUoZWxlbWVudDogSlF1ZXJ5PEhUTUxFbGVtZW50Pikge1xyXG4gICAgZWxlbWVudC5hZGRDbGFzcyhUSEVNRV9DTEFTU0VTLnNtKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgc2V0V2lkZ2V0TWlkZGxlU2l6ZShpbnN0YW5jZTogYW55KSB7XHJcbiAgICBUaGVtZUhlbHBlci5zZXRXaWRnZXRTaXplKGluc3RhbmNlLCBUSEVNRV9DTEFTU0VTLm1kKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgc2V0V2lkZ2V0U21hbGxTaXplKGluc3RhbmNlOiBhbnkpIHtcclxuICAgIFRoZW1lSGVscGVyLnNldFdpZGdldFNpemUoaW5zdGFuY2UsIFRIRU1FX0NMQVNTRVMuc20pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBnZXRJY29uQ2xhc3MoaWNvbjogc3RyaW5nLCBkaXNhYmxlZD86IGJvb2xlYW4sIHNpemU6IDE2IHwgMjQgPSAxNikge1xyXG4gICAgY29uc3QgaWNvbkNsYXNzID0gYGlzb3ogaXNvei1pY29uLSR7aWNvbn0tJHtzaXplfWA7XHJcblxyXG4gICAgcmV0dXJuICFkaXNhYmxlZFxyXG4gICAgICA/IGljb25DbGFzc1xyXG4gICAgICA6IGAke2ljb25DbGFzc30gJHtESVNBQkxFRF9DTEFTU31gO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgc2V0V2lkZ2V0U2l6ZShpbnN0YW5jZTogYW55LCBzaXplQ2xhc3M6IHN0cmluZykge1xyXG4gICAgaWYgKGluc3RhbmNlKSB7XHJcbiAgICAgIGluc3RhbmNlLm9wdGlvbignZWxlbWVudEF0dHInLCB7IGNsYXNzOiBzaXplQ2xhc3MgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZjb25zdCBDTEFTU0VTID0ge1xyXG4gIHRpdGxlOiAnaXNvei10aXRsZSdcclxufTtcclxuXHJcbmV4cG9ydCBjbGFzcyBUb29sYmFySGVscGVyIHtcclxuICBwdWJsaWMgc3RhdGljIGdldFRvb2xiYXJUaXRsZVRlbXBsYXRlSXRlbSh0aXRsZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBkZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgIHRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgJGVsID0gJChgPHNwYW4gY2xhc3M9XCIke0NMQVNTRVMudGl0bGV9XCI+JHt0aXRsZX08L3NwYW4+YCk7XHJcblxyXG4gICAgICAgIGlmIChkZXNjcmlwdGlvbikge1xyXG4gICAgICAgICAgJGVsLmFwcGVuZCgkKCc8aSAvPicpLmFkZENsYXNzKCdmYXMnKS5hZGRDbGFzcygnZmEtaW5mby1jaXJjbGUnKS5hZGRDbGFzcygncmVwb3J0LWRldGFpbHMtbGluaycpLmF0dHIoJ3RpdGxlJywgJ1JlcG9ydCBkZXRhaWxzJykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuICRlbDtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IFRIRU1FX0NMQVNTRVMgfSBmcm9tICcuLi9IZWxwZXJzL1RoZW1lJztcclxuaW1wb3J0IHsgVG9vbGJhckhlbHBlciB9IGZyb20gJy4uL0hlbHBlcnMvVG9vbGJhcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElUb29sYmFyU2V0dGluZyB7XHJcbiAgb3B0aW9ucz86IERldkV4cHJlc3MudWkuZHhUb29sYmFyT3B0aW9ucztcclxuICB0aXRsZT86IHN0cmluZztcclxuICBkZXNjcmlwdGlvbj86IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgQ0xBU1NFUyA9IHtcclxuICB0aXRsZTogJ2lzb3otdGl0bGUnLFxyXG4gIGhlYWRlcjogJ2lzb3otdG9vbGJhci1oZWFkZXInLFxyXG4gIGRyb3BEb3duQnV0dG9uOiAnZHgtZHJvcGRvd25tZW51LWJ1dHRvbidcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yOiBzdHJpbmcsIHNldHRpbmdzOiBJVG9vbGJhclNldHRpbmcgPSB7IHRpdGxlOiAnJywgZGVzY3JpcHRpb246ICcnLCBvcHRpb25zOiB7fSB9KTpcclxuICBEZXZFeHByZXNzLnVpLmR4VG9vbGJhciB7XHJcbiAgY29uc3Qge1xyXG4gICAgdGl0bGUgPSAnJyxcclxuICAgIGRlc2NyaXB0aW9uID0gJycsXHJcbiAgICBvcHRpb25zID0ge30sXHJcbiAgfSA9IHNldHRpbmdzO1xyXG4gIGNvbnN0IHtcclxuICAgIGl0ZW1zID0gW10sXHJcbiAgICBlbGVtZW50QXR0ciA9IHt9XHJcbiAgfSA9IG9wdGlvbnM7XHJcblxyXG4gIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgIGNvbnN0IG1pZGxkZVNpemVFbGVtZW50QXR0ciA9IHsgY2xhc3M6IFRIRU1FX0NMQVNTRVMubWQgfTtcclxuXHJcbiAgICBpZiAoaXRlbS5vcHRpb25zKSB7XHJcbiAgICAgIGxldCB7IGVkaXRvck9wdGlvbnMgfSA9IGl0ZW0ub3B0aW9ucztcclxuXHJcbiAgICAgIGlmICghZWRpdG9yT3B0aW9ucykge1xyXG4gICAgICAgIGVkaXRvck9wdGlvbnMgPSB7fTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZWRpdG9yT3B0aW9ucy5lbGVtZW50QXR0ciA9IG1pZGxkZVNpemVFbGVtZW50QXR0cjtcclxuICAgICAgaXRlbS5vcHRpb25zLmVsZW1lbnRBdHRyID0gbWlkbGRlU2l6ZUVsZW1lbnRBdHRyO1xyXG4gICAgICBpdGVtLm9wdGlvbnMuZWRpdG9yT3Rpb25zID0gZWRpdG9yT3B0aW9ucztcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgY29uc3Qgb25Db250ZW50UmVhZHkgPSAoZSkgPT4ge1xyXG4gICAgZS5lbGVtZW50XHJcbiAgICAgIC5maW5kKGAuJHtDTEFTU0VTLmRyb3BEb3duQnV0dG9ufWApXHJcbiAgICAgIC5hZGRDbGFzcyhUSEVNRV9DTEFTU0VTLm1kKTtcclxuXHJcbiAgICBpZiAob3B0aW9ucz8ub25Db250ZW50UmVhZHkpIHtcclxuICAgICAgb3B0aW9ucy5vbkNvbnRlbnRSZWFkeShlKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICByZXR1cm4gJChgJHtzZWxlY3Rvcn1gKVxyXG4gICAgLmR4VG9vbGJhcih7XHJcbiAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgVG9vbGJhckhlbHBlci5nZXRUb29sYmFyVGl0bGVUZW1wbGF0ZUl0ZW0odGl0bGUsIGRlc2NyaXB0aW9uKSxcclxuICAgICAgICAuLi5pdGVtc1xyXG4gICAgICBdLFxyXG4gICAgICBvbkNvbnRlbnRSZWFkeSxcclxuICAgICAgZWxlbWVudEF0dHI6IHtcclxuICAgICAgICAuLi5lbGVtZW50QXR0cixcclxuICAgICAgICBjbGFzczogQ0xBU1NFUy5oZWFkZXJcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIC5keFRvb2xiYXIoJ2luc3RhbmNlJyk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCBhdXRvUmVzaXplIGZyb20gJy4vQXV0b1Jlc2l6ZSc7XHJcblxyXG5jb25zdCBDU1MgPSB7XHJcbiAgcGFuZWw6ICcucGFuZWwtYm9keSdcclxufTtcclxuXHJcbmxldCBsYXN0V2luZG93SGVpZ2h0ID0gbnVsbDtcclxubGV0IGxhc3RDb250ZW50SGVpZ2h0ID0gbnVsbDtcclxubGV0IGxhc3RXaWRnZXRIZWlnaHQgPSBudWxsO1xyXG5cclxuZnVuY3Rpb24gdXBkYXRlSGVpZ2h0KHdpZGdldCkge1xyXG4gIGNvbnN0ICR3aWRnZXQgPSB3aWRnZXQuZWxlbWVudCgpO1xyXG4gIGNvbnN0ICRwYW5lbCA9ICR3aWRnZXQucGFyZW50cyhDU1MucGFuZWwpLmVxKDApO1xyXG5cclxuICAkcGFuZWwuaGVpZ2h0KGxhc3RDb250ZW50SGVpZ2h0KTtcclxuICB3aWRnZXQub3B0aW9uKCdoZWlnaHQnLCBsYXN0V2lkZ2V0SGVpZ2h0KTtcclxufVxyXG5cclxuZnVuY3Rpb24gY2FsY3VsYXRlSGVpZ2h0KHdpZGdldDogRGV2RXhwcmVzcy51aS5XaWRnZXQ8YW55Pikge1xyXG4gIGNvbnN0ICR3aWRnZXQgPSB3aWRnZXQuZWxlbWVudCgpO1xyXG4gIGNvbnN0ICRwYW5lbCA9IHdpZGdldC5lbGVtZW50KCkucGFyZW50cyhDU1MucGFuZWwpLmVxKDApO1xyXG5cclxuICBjb25zdCBwYW5lbFRvcCA9ICRwYW5lbC5wb3NpdGlvbigpLnRvcDtcclxuICBjb25zdCBwYW5lbEhlaWdodCA9ICRwYW5lbC5oZWlnaHQoKTtcclxuICBjb25zdCBwYW5lbFBhZGRpbmcgPSAkcGFuZWwub3V0ZXJIZWlnaHQoKSAtICRwYW5lbC5oZWlnaHQoKTtcclxuICBjb25zdCB3aWRnZXRUb3AgPSAkd2lkZ2V0LnBvc2l0aW9uKCkudG9wO1xyXG5cclxuICBjb25zdCB3aWRnZXRIZWlnaHQgPSBwYW5lbEhlaWdodCAtICh3aWRnZXRUb3AgLSBwYW5lbFRvcCkgKyBwYW5lbFBhZGRpbmcgLyAyO1xyXG5cclxuICB3aWRnZXQub3B0aW9uKCdoZWlnaHQnLCB3aWRnZXRIZWlnaHQpO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZWNhbGN1bGF0ZUhlaWdodCh3aWRnZXQ6IERldkV4cHJlc3MudWkuV2lkZ2V0PGFueT4pIHtcclxuICBjb25zdCB3aW5kb3dIZWlnaHQgPSAkKHdpbmRvdykuaGVpZ2h0KCk7XHJcbiAgY29uc3QgZGlmZiA9IHdpbmRvd0hlaWdodCAtIGxhc3RXaW5kb3dIZWlnaHQ7XHJcblxyXG4gIGxhc3RDb250ZW50SGVpZ2h0ICs9IGRpZmY7XHJcbiAgbGFzdFdpZGdldEhlaWdodCArPSBkaWZmO1xyXG4gIGxhc3RXaW5kb3dIZWlnaHQgPSB3aW5kb3dIZWlnaHQ7XHJcblxyXG4gIHVwZGF0ZUhlaWdodCh3aWRnZXQpO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih3aWRnZXQ6IERldkV4cHJlc3MudWkuV2lkZ2V0PGFueT4pIHtcclxuICBjYWxjdWxhdGVIZWlnaHQod2lkZ2V0KTtcclxuXHJcbiAgYXV0b1Jlc2l6ZSgoKSA9PiBjYWxjdWxhdGVIZWlnaHQod2lkZ2V0KSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCBmdWxsU2NyZWVuIGZyb20gJy4uL0Z1bGxTY3JlZW4nO1xyXG5pbXBvcnQgcGFuZWxIZWlnaHQgZnJvbSAnLi4vUGFuZWxIZWlnaHQnO1xyXG5pbXBvcnQgeyBDU1NfQ0xBU1NFUyB9IGZyb20gJy4uLy4uL1N0eWxpbmcvSW5kZXgnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZEFkZGl0aW9uYWxPcHRpb25zIHtcclxuICBleHBvcnRGaWxlTmFtZT86IHN0cmluZztcclxuICBzdW1tYXJ5Q29sdW1uPzogc3RyaW5nO1xyXG4gIHNob3dTdW1tYXJ5SW5Db2x1bW4/OiBzdHJpbmc7XHJcbiAgaW5QYW5lbEdyaWQ/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkKGlkOiBKUXVlcnksIG9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMsIGlzSW5QYW5lbEdyaWQgPSBmYWxzZSk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgY29uc3QgZ3JpZCA9IGNyZWF0ZURhdGFHcmlkKGlkLCBvcHRpb25zKTtcclxuXHJcbiAgaWYgKCFvcHRpb25zLmhlaWdodCkge1xyXG4gICAgaWYgKGlzSW5QYW5lbEdyaWQpIHtcclxuICAgICAgcGFuZWxIZWlnaHQoZ3JpZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmdWxsU2NyZWVuKGdyaWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGdyaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEYXRhR3JpZChlbDogSlF1ZXJ5LCBvcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICBjb25zdCBncmlkID0gZWwuZHhEYXRhR3JpZChvcHRpb25zKS5keERhdGFHcmlkKCdpbnN0YW5jZScpO1xyXG5cclxuICBncmlkLmVsZW1lbnQoKS5hZGRDbGFzcyhDU1NfQ0xBU1NFUy5keERhdGFHcmlkKTtcclxuXHJcbiAgcmV0dXJuIGdyaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGdWxsU2NyZWVuVHJlZUxpc3QoXHJcbiAgZWw6IHN0cmluZyB8IEpRdWVyeSwgb3B0aW9uczogRGV2RXhwcmVzcy51aS5keFRyZWVMaXN0LlByb3BlcnRpZXMsIGlzSW5QYW5lbCA9IGZhbHNlXHJcbik6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdCB7XHJcbiAgY29uc3QgdHJlZUxpc3QgPSAodHlwZW9mIGVsID09PSAnc3RyaW5nJyA/ICQoZWwpIDogZWwpLmR4VHJlZUxpc3Qob3B0aW9ucykuZHhUcmVlTGlzdCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgdHJlZUxpc3QuZWxlbWVudCgpLmFkZENsYXNzKENTU19DTEFTU0VTLmR4RGF0YUdyaWQpO1xyXG5cclxuICBpZiAoIW9wdGlvbnMuaGVpZ2h0KSB7XHJcbiAgICBpZiAoaXNJblBhbmVsKSB7XHJcbiAgICAgIHBhbmVsSGVpZ2h0KHRyZWVMaXN0KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZ1bGxTY3JlZW4odHJlZUxpc3QpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHRyZWVMaXN0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKHRleHQsIHRpdGxlKSB7XHJcbiAgcmV0dXJuICQoJzxzcGFuPicpXHJcbiAgICAuYXR0cigndGl0bGUnLCB0aXRsZSlcclxuICAgIC50ZXh0KHRleHQpO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBUb29sYmFySGVscGVyIH0gZnJvbSAnLi4vLi4vSGVscGVycy9Ub29sYmFyJztcclxuaW1wb3J0IHsgVGhlbWVIZWxwZXIsIFRIRU1FX0NMQVNTRVMgfSBmcm9tICcuLi8uLi9IZWxwZXJzL1RoZW1lJztcclxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi4vLi4vQ29uZmlnL0luZGV4JztcclxuaW1wb3J0IHsgY3JlYXRlR3JpZEV4cG9ydEZ1bmN0aW9uIH0gZnJvbSAnLi4vLi4vVXRpbHMvR3JpZEV4cG9ydCc7XHJcblxyXG5pbnRlcmZhY2UgSUdyaWRTZXR0aW5nc0Jhc2U8VD4ge1xyXG4gIG9wdGlvbnM/OiBUO1xyXG5cclxuICBleHBvcnRGaWxlTmFtZT86IHN0cmluZztcclxuICBoZWFkZXJEZXNjcmlwdGlvbj86IHN0cmluZztcclxuICBpblBhbmVsR3JpZD86IGJvb2xlYW47XHJcbiAgaXNGdWxsU2NyZWVuPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcclxuICBzZXREZWZhdWx0Q29sdW1uV2lkdGg/OiBib29sZWFuO1xyXG4gIHNob3dTdW1tYXJ5SW5Db2x1bW4/OiBzdHJpbmc7XHJcbiAgc3VtbWFyeUNvbHVtbj86IHN0cmluZztcclxuICBkaXNhYmxlU3VtbWFyeUNvbHVtbkRldGVjdGlvbj86IGJvb2xlYW47XHJcbiAgdGl0bGU/OiBzdHJpbmc7XHJcbiAgdG9vbGJhckFjY2VudEJ1dHRvbk5hbWU/OiBzdHJpbmc7XHJcbiAgdG9vbGJhckl0ZW1zPzogYW55W107XHJcbiAgYnV0dG9uc1NpemU/OiAnc20nIHwgJ21kJztcclxufVxyXG5cclxuY29uc3QgZ2V0V2lkZ2V0TmFtZSA9ICh3aWRnZXQ6IHN0cmluZykgPT4ge1xyXG4gIHJldHVybiB3aWRnZXRcclxuICAgIC5zbGljZSgnZHgnLmxlbmd0aClcclxuICAgIC50b0xvd2VyQ2FzZSgpO1xyXG59O1xyXG5cclxuY29uc3QgZ2V0U2VsZWN0b3JzID0gKHdpZGdldDogc3RyaW5nKSA9PiB7XHJcbiAgY29uc3QgZ3JpZE5hbWUgPSBnZXRXaWRnZXROYW1lKHdpZGdldCk7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBzZWFyY2hQYW5lbDogYC5keC0ke2dyaWROYW1lfS1zZWFyY2gtcGFuZWxgLFxyXG4gICAgdG9vbGJhckVkaXRCdXR0b246IGAuZHgtJHtncmlkTmFtZX0tdG9vbGJhci1idXR0b24uZHgtZWRpdC1idXR0b25gLFxyXG4gICAgdG9vbGJhckV4cG9ydEJ1dHRvbjogYC5keC0ke2dyaWROYW1lfS1leHBvcnQtYnV0dG9uIC5keC1idXR0b25gLFxyXG4gICAgc2VsZWN0Q2hlY2tCb3g6ICcuZHgtc2VsZWN0LWNoZWNrYm94J1xyXG4gIH07XHJcbn07XHJcbmV4cG9ydCBpbnRlcmZhY2UgSURhdGFHcmlkU2V0dGluZ3MgZXh0ZW5kcyBJR3JpZFNldHRpbmdzQmFzZTxEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zPiB7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVRyZWVMaXN0U2V0dGluZ3MgZXh0ZW5kcyBJR3JpZFNldHRpbmdzQmFzZTxEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zPiB7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRHcmlkRGVmYXVsdE9wdGlvbnMoc2V0dGluZ3M6IElEYXRhR3JpZFNldHRpbmdzKSB7XHJcbiAgY29uc3QgcmVzdWx0OiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuUHJvcGVydGllcyA9IGNvbmZpZy5pc0xlZ2FjeVJlbmRlciA/IGdldExlZ2FjeURlZmF1bHRPcHRpb25zKHNldHRpbmdzKSA6IGdldERlZmF1bHRPcHRpb25zKHNldHRpbmdzKTtcclxuXHJcbiAgaWYgKHNldHRpbmdzLnN1bW1hcnlDb2x1bW4gfHwgc2V0dGluZ3Muc2hvd1N1bW1hcnlJbkNvbHVtbikge1xyXG4gICAgKHJlc3VsdCBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuUHJvcGVydGllcykuc3VtbWFyeSA9IHtcclxuICAgICAgdG90YWxJdGVtczogW3tcclxuICAgICAgICBjb2x1bW46IHNldHRpbmdzLnN1bW1hcnlDb2x1bW4gfHwgc2V0dGluZ3Muc2hvd1N1bW1hcnlJbkNvbHVtbixcclxuICAgICAgICBzaG93SW5Db2x1bW46IHNldHRpbmdzLnNob3dTdW1tYXJ5SW5Db2x1bW4gfHwgc2V0dGluZ3Muc3VtbWFyeUNvbHVtbixcclxuICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xyXG4gICAgICB9XVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHJlc3VsdC5leHBvcnQgPSB7XHJcbiAgICBlbmFibGVkOiAhIXNldHRpbmdzLmV4cG9ydEZpbGVOYW1lLFxyXG4gICAgYWxsb3dFeHBvcnRTZWxlY3RlZERhdGE6IHRydWUsXHJcbiAgfTtcclxuXHJcbiAgaWYgKCFjb25maWcuaXNMZWdhY3lSZW5kZXIpIHtcclxuICAgIHJlc3VsdC5ncm91cFBhbmVsID0geyB2aXNpYmxlOiB0cnVlIH07XHJcbiAgfVxyXG5cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJlZUxpc3REZWZhdWx0T3B0aW9ucyhzZXR0aW5nczogSVRyZWVMaXN0U2V0dGluZ3MpIHtcclxuICBjb25zdCByZXN1bHQ6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdE9wdGlvbnMgPSBnZXREZWZhdWx0T3B0aW9ucyhzZXR0aW5ncyk7XHJcblxyXG4gIHJlc3VsdC5zZWxlY3Rpb24gPSB7IG1vZGU6ICdub25lJyB9O1xyXG5cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXREZWZhdWx0T3B0aW9uc1xyXG4gIDxUIGV4dGVuZHMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyB8IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdE9wdGlvbnM+KHNldHRpbmdzOiBJRGF0YUdyaWRTZXR0aW5ncyB8IElUcmVlTGlzdFNldHRpbmdzKTogVCB7XHJcbiAgcmV0dXJuIHtcclxuICAgIGFsbG93Q29sdW1uUmVzaXppbmc6IHRydWUsXHJcbiAgICBjYWNoZUVuYWJsZWQ6IHRydWUsXHJcbiAgICBjb2x1bW5BdXRvV2lkdGg6IHRydWUsXHJcbiAgICBmaWx0ZXJSb3c6IHsgdmlzaWJsZTogdHJ1ZSwgYXBwbHlGaWx0ZXI6ICdvbkNsaWNrJyB9LFxyXG4gICAgaGVhZGVyRmlsdGVyOiB7IHZpc2libGU6IHRydWUgfSxcclxuICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgcGFnaW5nOiB7IHBhZ2VTaXplOiA4MCB9LFxyXG4gICAgcGFnZXI6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgIHJlbW90ZU9wZXJhdGlvbnM6IHRydWUsXHJcbiAgICBzY3JvbGxpbmc6IHtcclxuICAgICAgbW9kZTogJ3ZpcnR1YWwnLFxyXG4gICAgICByb3dSZW5kZXJpbmdNb2RlOiAndmlydHVhbCdcclxuICAgIH0sXHJcbiAgICBzZWFyY2hQYW5lbDoge1xyXG4gICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICB3aWR0aDogMjQwLFxyXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlYXJjaC4uLidcclxuICAgIH0sXHJcbiAgICBzaG93Um93TGluZXM6IHRydWUsXHJcbiAgICBzaG93Qm9yZGVyczogdHJ1ZSxcclxuICAgIHNlbGVjdGlvbjogeyBtb2RlOiAnbXVsdGlwbGUnIH0sXHJcbiAgICB3b3JkV3JhcEVuYWJsZWQ6IHRydWVcclxuICB9IGFzIFQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldExlZ2FjeURlZmF1bHRPcHRpb25zXHJcbiAgPFQgZXh0ZW5kcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zIHwgRGV2RXhwcmVzcy51aS5keFRyZWVMaXN0T3B0aW9ucz4oc2V0dGluZ3M6IElEYXRhR3JpZFNldHRpbmdzIHwgSVRyZWVMaXN0U2V0dGluZ3MpOiBUIHtcclxuICByZXR1cm4ge1xyXG4gICAgYWxsb3dDb2x1bW5SZXNpemluZzogdHJ1ZSxcclxuICAgIHJlbW90ZU9wZXJhdGlvbnM6IHRydWUsXHJcbiAgICBjb2x1bW5BdXRvV2lkdGg6IHRydWUsXHJcbiAgICBzaG93Qm9yZGVyczogdHJ1ZSxcclxuICAgIGZpbHRlclJvdzogeyB2aXNpYmxlOiB0cnVlLCBhcHBseUZpbHRlcjogJ29uQ2xpY2snIH0sXHJcblxyXG4gICAgc2VsZWN0aW9uOiB7IG1vZGU6ICdtdWx0aXBsZScgfSxcclxuICAgIHBhZ2luZzogeyBwYWdlU2l6ZTogNTAgfSxcclxuICAgIHNlYXJjaFBhbmVsOiB7IHZpc2libGU6IHRydWUgfSxcclxuICAgIGhlYWRlckZpbHRlcjogeyB2aXNpYmxlOiB0cnVlIH0sXHJcbiAgICBzY3JvbGxpbmc6IHsgbW9kZTogJ3ZpcnR1YWwnIH0sXHJcbiAgfSBhcyBUO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwcmVwYXJlRGVmYXVsdFRvb2xiYXJCdXR0b25zKHRvb2xiYXJPcHRpb25zOiBhbnksIHRvb2xiYXJBY2NlbnRCdXR0b25OYW1lPzogc3RyaW5nKSB7XHJcbiAgY29uc3QgZmluZFRvb2xiYXJJdGVtID0gKGl0ZW1zOiBhbnlbXSwgbmFtZTogc3RyaW5nKSA9PiBpdGVtcy5maW5kKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09IG5hbWUpO1xyXG5cclxuICBpZiAodG9vbGJhck9wdGlvbnM/Lml0ZW1zKSB7XHJcbiAgICBjb25zdCB7IGl0ZW1zIH0gPSB0b29sYmFyT3B0aW9ucztcclxuXHJcbiAgICBpZiAodG9vbGJhckFjY2VudEJ1dHRvbk5hbWUpIHtcclxuICAgICAgY29uc3QgYWNjZW50QnV0dG9uSXRlbSA9IGZpbmRUb29sYmFySXRlbShpdGVtcywgdG9vbGJhckFjY2VudEJ1dHRvbk5hbWUpO1xyXG4gICAgICBpZiAoYWNjZW50QnV0dG9uSXRlbSkge1xyXG4gICAgICAgIGFjY2VudEJ1dHRvbkl0ZW0ub3B0aW9ucy50eXBlID0gJ2RlZmF1bHQnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2F2ZUJ1dHRvbkl0ZW0gPSBmaW5kVG9vbGJhckl0ZW0oaXRlbXMsICdzYXZlQnV0dG9uJyk7XHJcbiAgICBpZiAoc2F2ZUJ1dHRvbkl0ZW0pIHtcclxuICAgICAgc2F2ZUJ1dHRvbkl0ZW0uc2hvd1RleHQgPSAnYWx3YXlzJztcclxuICAgICAgc2F2ZUJ1dHRvbkl0ZW0ub3B0aW9ucy50ZXh0ID0gJ1NhdmUnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJldmVydEJ1dHRvbkl0ZW0gPSBmaW5kVG9vbGJhckl0ZW0oaXRlbXMsICdyZXZlcnRCdXR0b24nKTtcclxuICAgIGlmIChyZXZlcnRCdXR0b25JdGVtKSB7XHJcbiAgICAgIHJldmVydEJ1dHRvbkl0ZW0uc2hvd1RleHQgPSAnYWx3YXlzJztcclxuICAgICAgcmV2ZXJ0QnV0dG9uSXRlbS5vcHRpb25zLnRleHQgPSAnRGlzY2FyZCc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVmcmVzaEJ1dHRvbkl0ZW0gPSBmaW5kVG9vbGJhckl0ZW0oaXRlbXMsICdyZWZyZXNoJyk7XHJcbiAgICBpZiAocmVmcmVzaEJ1dHRvbkl0ZW0pIHtcclxuICAgICAgcmVmcmVzaEJ1dHRvbkl0ZW0uc2hvd1RleHQgPSAnYWx3YXlzJztcclxuICAgICAgcmVmcmVzaEJ1dHRvbkl0ZW0ub3B0aW9ucy50ZXh0ID0gJ1JlZnJlc2gnO1xyXG4gICAgICByZWZyZXNoQnV0dG9uSXRlbS5vcHRpb25zLmhpbnQgPSAnUmVsb2FkIERhdGEnO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlU3VtbWFyeUNvbHVtbklmUmVxdWlyZWQoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XHJcbiAgY29uc3QgdG90YWxJdGVtcyA9IGdyaWQub3B0aW9uKCdzdW1tYXJ5LnRvdGFsSXRlbXMnKSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydzdW1tYXJ5J11bJ3RvdGFsSXRlbXMnXTtcclxuICBjb25zdCBjdXJyZW50U3VtbWFyeUNvbHVtbiA9IHRvdGFsSXRlbXM/LmZpbHRlcigoaSkgPT4gaS5zdW1tYXJ5VHlwZSA9PT0gJ2NvdW50JylbMF0/LmNvbHVtbjtcclxuXHJcbiAgbGV0IHN1bW1hcnlDb2x1bW5JbmRleCA9IGN1cnJlbnRTdW1tYXJ5Q29sdW1uICYmIGdyaWQuZ2V0VmlzaWJsZUNvbHVtbnMoKS5maW5kSW5kZXgoKGVsKSA9PiBlbC5kYXRhRmllbGQgPT09IGN1cnJlbnRTdW1tYXJ5Q29sdW1uKTtcclxuICBpZiAoIXN1bW1hcnlDb2x1bW5JbmRleCkge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gZ3JpZC5vcHRpb24oJ3NlbGVjdGlvbicpO1xyXG4gICAgY29uc3QgaGFzU2VsZWN0aW9uID0gc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5tb2RlICE9PSAnbm9uZSc7XHJcbiAgICBzdW1tYXJ5Q29sdW1uSW5kZXggPSBoYXNTZWxlY3Rpb24gPyBncmlkLmdldFZpc2libGVDb2x1bW5zKCkuZmluZEluZGV4KChlbCkgPT4gISFlbC5kYXRhRmllbGQpIDogMDtcclxuICB9XHJcblxyXG4gIGNvbnN0IG5ld1N1bW1hcnlDb2x1bW4gPSBncmlkLmdldFZpc2libGVDb2x1bW5zKClbc3VtbWFyeUNvbHVtbkluZGV4XT8uZGF0YUZpZWxkO1xyXG5cclxuICBpZiAobmV3U3VtbWFyeUNvbHVtbiAmJiBjdXJyZW50U3VtbWFyeUNvbHVtbiAhPT0gbmV3U3VtbWFyeUNvbHVtbikge1xyXG4gICAgZ3JpZC5vcHRpb24oJ3N1bW1hcnknLCB7XHJcbiAgICAgIHRvdGFsSXRlbXM6IFt7XHJcbiAgICAgICAgY29sdW1uOiBncmlkLmdldFZpc2libGVDb2x1bW5zKClbc3VtbWFyeUNvbHVtbkluZGV4XT8uZGF0YUZpZWxkLFxyXG4gICAgICAgIHN1bW1hcnlUeXBlOiAnY291bnQnXHJcbiAgICAgIH1dXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRIYW5kbGVyczxUIGV4dGVuZHMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyB8IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdE9wdGlvbnM+KFxyXG4gIHdpZGdldDogJ2R4RGF0YUdyaWQnIHwgJ2R4VHJlZUxpc3QnLFxyXG4gIHNldHRpbmdzOiBJRGF0YUdyaWRTZXR0aW5ncyB8IElUcmVlTGlzdFNldHRpbmdzXHJcbik6IFQge1xyXG4gIGNvbnN0IHNlbGVjdG9ycyA9IGdldFNlbGVjdG9ycyh3aWRnZXQpO1xyXG4gIGxldCBpc0dyaWRJbml0aWFsaXphZWQgPSBmYWxzZTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIG9uQ2VsbFByZXBhcmVkOiAoZSkgPT4ge1xyXG4gICAgICBpZiAoIWNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICAgIGlmIChlLnJvd1R5cGUgPT09ICdoZWFkZXInKSB7XHJcbiAgICAgICAgICBlLmNlbGxFbGVtZW50LmNzcygndGV4dC1hbGlnbicsICdjZW50ZXInKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChzZXR0aW5ncy5vcHRpb25zPy5vbkNlbGxQcmVwYXJlZCkge1xyXG4gICAgICAgIHNldHRpbmdzLm9wdGlvbnM/Lm9uQ2VsbFByZXBhcmVkKGUpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgb25Db250ZW50UmVhZHk6IChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IGRhdGFHcmlkID0gZS5jb21wb25lbnQ7XHJcblxyXG4gICAgICBpZiAoIXNldHRpbmdzLmRpc2FibGVTdW1tYXJ5Q29sdW1uRGV0ZWN0aW9uKSB7XHJcbiAgICAgICAgdXBkYXRlU3VtbWFyeUNvbHVtbklmUmVxdWlyZWQoZGF0YUdyaWQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWlzR3JpZEluaXRpYWxpemFlZCkge1xyXG4gICAgICAgIGlzR3JpZEluaXRpYWxpemFlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8vdG8gZml4IGF1dG9zY3JvbGxcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHNjcm9sbGFibGUgPSBkYXRhR3JpZC5nZXRTY3JvbGxhYmxlKCk7XHJcblxyXG4gICAgICAgICAgaWYgKHNjcm9sbGFibGUpIHtcclxuICAgICAgICAgICAgc2Nyb2xsYWJsZS5zY3JvbGxUbyh7IHRvcDogMCB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhR3JpZC5jb2x1bW5Db3VudCgpOyBpKyspIHtcclxuICAgICAgICBjb25zdCBkYXRhVHlwZSA9IGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnZGF0YVR5cGUnKTtcclxuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzLnNldERlZmF1bHRDb2x1bW5XaWR0aCB8fCBzZXR0aW5ncy5zZXREZWZhdWx0Q29sdW1uV2lkdGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgaWYgKCFkYXRhR3JpZC5jb2x1bW5PcHRpb24oaSwgJ3dpZHRoJykpIHtcclxuICAgICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgICAgICAgICBkYXRhR3JpZC5jb2x1bW5PcHRpb24oaSwgJ3dpZHRoJywgJzQ1cHgnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnZGF0ZXRpbWUnKSB7XHJcbiAgICAgICAgICAgICAgZGF0YUdyaWQuY29sdW1uT3B0aW9uKGksICd3aWR0aCcsICcxMzVweCcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdkYXRlJykge1xyXG4gICAgICAgICAgICAgIGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnd2lkdGgnLCAnMTQwcHgnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFjb25maWcuaXNMZWdhY3lSZW5kZXIpIHtcclxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2RhdGV0aW1lJyB8fCBkYXRhVHlwZSA9PT0gJ2RhdGUnKSB7XHJcbiAgICAgICAgICAgIGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnYWxpZ25tZW50JywgJ3JpZ2h0Jyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnZGF0ZScpIHtcclxuICAgICAgICAgICAgZGF0YUdyaWQuY29sdW1uT3B0aW9uKGksICdmb3JtYXQnLCAnZGQgTU1NIHl5eXknKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdkYXRldGltZScpIHtcclxuICAgICAgICAgICAgZGF0YUdyaWQuY29sdW1uT3B0aW9uKGksICdmb3JtYXQnLCAnSEg6bW0sIGRkIE1NTSB5eXl5Jyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICAgIGlmIChzZXR0aW5ncy5idXR0b25zU2l6ZSA9PT0gJ3NtJykge1xyXG4gICAgICAgICAgVGhlbWVIZWxwZXIuc2V0V2lkZ2V0U21hbGxTaXplKCQoc2VsZWN0b3JzLnNlYXJjaFBhbmVsKS5keFRleHRCb3goJ2luc3RhbmNlJykpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBUaGVtZUhlbHBlci5zZXRXaWRnZXRNaWRkbGVTaXplKCQoc2VsZWN0b3JzLnNlYXJjaFBhbmVsKS5keFRleHRCb3goJ2luc3RhbmNlJykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgVGhlbWVIZWxwZXIuc2V0RWxlbWVudFNtYWxsU2l6ZShlLmNvbXBvbmVudC5lbGVtZW50KCkuZmluZChzZWxlY3RvcnMuc2VsZWN0Q2hlY2tCb3gpKTtcclxuXHJcbiAgICAgICAgaWYgKCQoc2VsZWN0b3JzLnRvb2xiYXJFeHBvcnRCdXR0b24pLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGlmIChzZXR0aW5ncy5idXR0b25zU2l6ZSA9PT0gJ3NtJykge1xyXG4gICAgICAgICAgICBUaGVtZUhlbHBlci5zZXRXaWRnZXRTbWFsbFNpemUoJChzZWxlY3RvcnMudG9vbGJhckV4cG9ydEJ1dHRvbikuZHhCdXR0b24oJ2luc3RhbmNlJykpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgVGhlbWVIZWxwZXIuc2V0V2lkZ2V0TWlkZGxlU2l6ZSgkKHNlbGVjdG9ycy50b29sYmFyRXhwb3J0QnV0dG9uKS5keEJ1dHRvbignaW5zdGFuY2UnKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc2V0dGluZ3Mub3B0aW9ucz8ub25Db250ZW50UmVhZHkpIHtcclxuICAgICAgICBzZXR0aW5ncy5vcHRpb25zLm9uQ29udGVudFJlYWR5KGUpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgb25Ub29sYmFyUHJlcGFyaW5nOiAoZSkgPT4ge1xyXG4gICAgICBjb25zdCB7XHJcbiAgICAgICAgdG9vbGJhck9wdGlvbnMgPSB7fVxyXG4gICAgICB9ID0gZTtcclxuXHJcbiAgICAgIGNvbnN0IGRhdGFHcmlkID0gZS5jb21wb25lbnQ7XHJcblxyXG4gICAgICBjb25zdCB7XHJcbiAgICAgICAgaXRlbXMgPSBbXVxyXG4gICAgICB9ID0gdG9vbGJhck9wdGlvbnM7XHJcblxyXG4gICAgICBpZiAoY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzLnRpdGxlKSB7XHJcbiAgICAgICAgICBlLnRvb2xiYXJPcHRpb25zLml0ZW1zLnVuc2hpZnQoe1xyXG4gICAgICAgICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlKCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGhlYWRlckVsID0gJCgnPGgyIC8+JykuYWRkQ2xhc3MoJ2dyaWQtaGVhZGVyJykudGV4dChzZXR0aW5ncy50aXRsZSk7XHJcbiAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLmhlYWRlckRlc2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBoZWFkZXJFbC5hcHBlbmQoJCgnPGkgLz4nKS5hZGRDbGFzcygnZmFzJykuYWRkQ2xhc3MoJ2ZhLWluZm8tY2lyY2xlJykuYWRkQ2xhc3MoJ3JlcG9ydC1kZXRhaWxzLWxpbmsnKS5hdHRyKCd0aXRsZScsICdDbGljayB0byBzZWUgZnVydGhlciBkZXRhaWxzJykpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuIGhlYWRlckVsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgIGlmIChpdGVtLndpZGdldCA9PT0gJ2R4QnV0dG9uJyAmJiBpdGVtLm5hbWUgPT09ICdhcHBseUZpbHRlckJ1dHRvbicpIHtcclxuICAgICAgICAgICAgaXRlbS5vcHRpb25zLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3MudGl0bGUpIHtcclxuICAgICAgICAgIGl0ZW1zLnVuc2hpZnQoVG9vbGJhckhlbHBlci5nZXRUb29sYmFyVGl0bGVUZW1wbGF0ZUl0ZW0oc2V0dGluZ3MudGl0bGUsIHNldHRpbmdzLmhlYWRlckRlc2NyaXB0aW9uKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpdGVtcy5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGl0ZW0ud2lkZ2V0ID09PSAnZHhCdXR0b24nKSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLm5hbWUgPT09ICdhcHBseUZpbHRlckJ1dHRvbicpIHtcclxuICAgICAgICAgICAgICBpdGVtLm9wdGlvbnMudmlzaWJsZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGljb25TaXplID0gc2V0dGluZ3MuYnV0dG9uc1NpemUgPT09ICdzbScgPyAxNiA6IDI0O1xyXG5cclxuICAgICAgICAgICAgc3dpdGNoIChpdGVtLm5hbWUpIHtcclxuICAgICAgICAgICAgICBjYXNlICdhZGRSb3dCdXR0b24nOlxyXG4gICAgICAgICAgICAgICAgaXRlbS5vcHRpb25zLmljb24gPSBUaGVtZUhlbHBlci5nZXRJY29uQ2xhc3MoJ3BsdXMnLCBmYWxzZSwgaWNvblNpemUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgIGNhc2UgJ3NhdmVCdXR0b24nOlxyXG4gICAgICAgICAgICAgICAgaXRlbS5vcHRpb25zLmljb24gPSBUaGVtZUhlbHBlci5nZXRJY29uQ2xhc3MoJ3NhdmUnLCBmYWxzZSwgaWNvblNpemUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgIGNhc2UgJ3JldmVydEJ1dHRvbic6XHJcbiAgICAgICAgICAgICAgICBpdGVtLm9wdGlvbnMuaWNvbiA9IFRoZW1lSGVscGVyLmdldEljb25DbGFzcygnY2xvc2UnLCBmYWxzZSwgaWNvblNpemUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBpdGVtLm9wdGlvbnMuaWNvbiA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWl0ZW0ub3B0aW9ucy5lbGVtZW50QXR0cikge1xyXG4gICAgICAgICAgICAgIGl0ZW0ub3B0aW9ucy5lbGVtZW50QXR0ciA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpdGVtLm9wdGlvbnMuZWxlbWVudEF0dHIuY2xhc3MgPSBzZXR0aW5ncy5idXR0b25zU2l6ZSA9PT0gJ3NtJyA/IFRIRU1FX0NMQVNTRVMuc20gOiBUSEVNRV9DTEFTU0VTLm1kO1xyXG4gICAgICAgICAgICBpdGVtLnNob3dUZXh0ID0gJ2Fsd2F5cyc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHByZXBhcmVEZWZhdWx0VG9vbGJhckJ1dHRvbnModG9vbGJhck9wdGlvbnMsIHNldHRpbmdzLnRvb2xiYXJBY2NlbnRCdXR0b25OYW1lKTtcclxuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzLnRvb2xiYXJJdGVtcykge1xyXG4gICAgICAgICAgaXRlbXMucHVzaCguLi5zZXR0aW5ncy50b29sYmFySXRlbXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdG9vbGJhck9wdGlvbnMuZWxlbWVudEF0dHIgPSB7XHJcbiAgICAgICAgICBjbGFzczogJ2lzb3otdG9vbGJhci1oZWFkZXInXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3Qgc2F2ZUJ1dHRvbkluZGV4ID0gZS50b29sYmFyT3B0aW9ucy5pdGVtcy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gJ3NhdmVCdXR0b24nKTtcclxuICAgICAgY29uc3Qgc2VhcmNoUGFuZWxJbmRleCA9IGUudG9vbGJhck9wdGlvbnMuaXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdzZWFyY2hQYW5lbCcpO1xyXG4gICAgICBsZXQgaW5kZXhGb3JVcGRhdGUgPSAtMTtcclxuXHJcbiAgICAgIGlmIChzYXZlQnV0dG9uSW5kZXggPiAtMSkge1xyXG4gICAgICAgIGluZGV4Rm9yVXBkYXRlID0gc2F2ZUJ1dHRvbkluZGV4O1xyXG4gICAgICB9IGVsc2UgaWYgKHNlYXJjaFBhbmVsSW5kZXggPiAtMSkge1xyXG4gICAgICAgIGluZGV4Rm9yVXBkYXRlID0gc2VhcmNoUGFuZWxJbmRleDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpbmRleEZvclVwZGF0ZSA9IGUudG9vbGJhck9wdGlvbnMuaXRlbXMubGVuZ3RoO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBlLnRvb2xiYXJPcHRpb25zLml0ZW1zLnNwbGljZShpbmRleEZvclVwZGF0ZSwgMCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgICAgIG5hbWU6ICdyZWZyZXNoJyxcclxuICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgaWNvbjogJ3JlZnJlc2gnLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IGNvbmZpZy5pc0xlZ2FjeVJlbmRlciA/IDMwIDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBlbGVtZW50QXR0cjogeyBjbGFzczogYGR4LWRhdGFncmlkLXRvb2xiYXItYnV0dG9uICR7c2V0dGluZ3MuYnV0dG9uc1NpemUgPT09ICdzbScgPyBUSEVNRV9DTEFTU0VTLnNtIDogVEhFTUVfQ0xBU1NFUy5tZH1gIH0sXHJcbiAgICAgICAgICAgIHN0eWxpbmdNb2RlOiBjb25maWcuaXNMZWdhY3lSZW5kZXIgPyAndGV4dCcgOiAnY29udGFpbmVkJyxcclxuICAgICAgICAgICAgb25DbGljazogKCkgPT4gZGF0YUdyaWQ/LnJlZnJlc2goKSxcclxuICAgICAgICAgICAgb25Db250ZW50UmVhZHk6IGNvbmZpZy5pc0xlZ2FjeVJlbmRlciA/IChjb250ZW50UmVhZHlFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnRlbnRSZWFkeUV2ZW50LmVsZW1lbnQuZmluZCgnLmR4LWJ1dHRvbi1jb250ZW50JykuY3NzKHtcclxuICAgICAgICAgICAgICAgIHBhZGRpbmdUb3A6IDYsXHJcbiAgICAgICAgICAgICAgICBwYWRkaW5nQm90dG9tOiA2XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gOiB1bmRlZmluZWRcclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbi5Qcm9wZXJ0aWVzXHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKHNldHRpbmdzLm9wdGlvbnM/Lm9uVG9vbGJhclByZXBhcmluZykge1xyXG4gICAgICAgIHNldHRpbmdzLm9wdGlvbnMub25Ub29sYmFyUHJlcGFyaW5nKGUpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgb25FZGl0b3JQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgIGlmICghY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICAgICAgZS5lZGl0b3JPcHRpb25zID0ge1xyXG4gICAgICAgICAgLi4uZS5lZGl0b3JPcHRpb25zLFxyXG4gICAgICAgICAgZWxlbWVudEF0dHI6IHtcclxuICAgICAgICAgICAgY2xhc3M6IFRIRU1FX0NMQVNTRVMubWRcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAoZS5lZGl0b3JOYW1lID09PSAnZHhTZWxlY3RCb3gnKSB7XHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMuZHJvcERvd25PcHRpb25zID0ge1xyXG4gICAgICAgICAgICAuLi5lLmVkaXRvck9wdGlvbnMuZHJvcERvd25PcHRpb25zLFxyXG4gICAgICAgICAgICBvblNob3dpbmc6IChhcmdzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCB3aWRnZXROYW1lID0gZ2V0V2lkZ2V0TmFtZSh3aWRnZXQpO1xyXG4gICAgICAgICAgICAgIGFyZ3MuY29tcG9uZW50Ll8kcG9wdXBDb250ZW50LmFkZENsYXNzKGBpc296LSR7d2lkZ2V0TmFtZX0tc2VsZWN0Ym94LXBvcHVwYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZS5lZGl0b3JOYW1lID09PSAnZHhDaGVja0JveCcpIHtcclxuICAgICAgICAgIFRoZW1lSGVscGVyLnNldEVsZW1lbnRTbWFsbFNpemUoZS5lZGl0b3JFbGVtZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHN3aXRjaCAoZS5wYXJlbnRUeXBlKSB7XHJcbiAgICAgICAgY2FzZSAnZmlsdGVyUm93JzpcclxuICAgICAgICAgIGNvbnN0IGFwcGx5RmlsdGVyOiBEZXZFeHByZXNzLnVpLmR4VGV4dEVkaXRvci5Qcm9wZXJ0aWVzWydvbkVudGVyS2V5J10gPSAoYXJncykgPT4ge1xyXG4gICAgICAgICAgICBlLmVsZW1lbnQgJiYgZS5lbGVtZW50LmZpbmQoJy5keC1hcHBseS1idXR0b24nKS50cmlnZ2VyKCdkeGNsaWNrJyk7XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vbkVudGVyS2V5ID0gYXBwbHlGaWx0ZXI7XHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25Gb2N1c091dCA9IGFwcGx5RmlsdGVyO1xyXG5cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdzZWFyY2hQYW5lbCc6XHJcbiAgICAgICAgICBjb25zdCBhcHBseVNlYXJjaDogRGV2RXhwcmVzcy51aS5keFRleHRFZGl0b3IuUHJvcGVydGllc1snb25FbnRlcktleSddID0gKGFyZ3MpID0+IHtcclxuICAgICAgICAgICAgZS5jb21wb25lbnQuc2VhcmNoQnlUZXh0KGFyZ3MuY29tcG9uZW50Lm9wdGlvbigndmFsdWUnKSk7XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZCA9ICgpID0+IHsgfTtcclxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vbkVudGVyS2V5ID0gYXBwbHlTZWFyY2g7XHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25Gb2N1c091dCA9IGFwcGx5U2VhcmNoO1xyXG5cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc2V0dGluZ3Mub3B0aW9ucz8ub25FZGl0b3JQcmVwYXJpbmcpIHtcclxuICAgICAgICBzZXR0aW5ncy5vcHRpb25zLm9uRWRpdG9yUHJlcGFyaW5nKGUpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgb25Db250ZXh0TWVudVByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgaWYgKCFjb25maWcuaXNMZWdhY3lSZW5kZXIpIHtcclxuICAgICAgICBpZiAoZS50YXJnZXQgPT09ICdjb250ZW50JyAmJiAhIXNldHRpbmdzLmV4cG9ydEZpbGVOYW1lKSB7XHJcbiAgICAgICAgICBpZiAoIWUuaXRlbXMpIHtcclxuICAgICAgICAgICAgZS5pdGVtcyA9IFtdO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGUuaXRlbXMucHVzaCh7XHJcbiAgICAgICAgICAgIHRleHQ6ICdFeHBvcnQgYWxsIGRhdGEnLFxyXG4gICAgICAgICAgICBvbkl0ZW1DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGUuY29tcG9uZW50LmV4cG9ydFRvRXhjZWwoZmFsc2UpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBpY29uOiAneGxzeGZpbGUnXHJcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhDb250ZXh0TWVudUl0ZW0pO1xyXG5cclxuICAgICAgICAgIGlmIChzZXR0aW5ncy5vcHRpb25zLnNlbGVjdGlvbj8ubW9kZSAhPT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkUm93cyA9IGUuY29tcG9uZW50LmdldFNlbGVjdGVkUm93S2V5cygpO1xyXG5cclxuICAgICAgICAgICAgZS5pdGVtcy5wdXNoKHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnRXhwb3J0IHNlbGVjdGVkIHJvd3MnLFxyXG4gICAgICAgICAgICAgIG9uSXRlbUNsaWNrOiAoKSA9PiBlLmNvbXBvbmVudC5leHBvcnRUb0V4Y2VsKHRydWUpLFxyXG4gICAgICAgICAgICAgIGljb246ICdleHBvcnRzZWxlY3RlZCcsXHJcbiAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFzZWxlY3RlZFJvd3MgfHwgIXNlbGVjdGVkUm93cy5sZW5ndGhcclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4Q29udGV4dE1lbnVJdGVtKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChzZXR0aW5ncy5vcHRpb25zPy5vbkNvbnRleHRNZW51UHJlcGFyaW5nKSB7XHJcbiAgICAgICAgc2V0dGluZ3Mub3B0aW9ucz8ub25Db250ZXh0TWVudVByZXBhcmluZyhlKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uRXhwb3J0aW5nOiAhIXNldHRpbmdzLmV4cG9ydEZpbGVOYW1lID8gY3JlYXRlR3JpZEV4cG9ydEZ1bmN0aW9uKHNldHRpbmdzLmV4cG9ydEZpbGVOYW1lKSA6IHZvaWQgMCxcclxuICB9IGFzIFQ7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IGNyZWF0ZURhdGFHcmlkLCBjcmVhdGVGdWxsU2NyZWVuRGF0YUdyaWQgfSBmcm9tICcuL0NyZWF0ZUZ1bGxTY3JlZW5HcmlkJztcclxuaW1wb3J0IHsgZ2V0R3JpZERlZmF1bHRPcHRpb25zLCBnZXRIYW5kbGVycywgSURhdGFHcmlkU2V0dGluZ3MgfSBmcm9tICcuL0RlZmF1bHRHcmlkQmFzZSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihlbDogSlF1ZXJ5LCBzZXR0aW5nczogSURhdGFHcmlkU2V0dGluZ3MpOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gZ2V0R3JpZERlZmF1bHRPcHRpb25zKHNldHRpbmdzKTtcclxuICBsZXQgbWVyZ2VkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBkZWZhdWx0T3B0aW9ucywgc2V0dGluZ3Mub3B0aW9ucyk7XHJcbiAgY29uc3QgaGFuZGxlcnMgPSBnZXRIYW5kbGVyczxEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zPignZHhEYXRhR3JpZCcsICQuZXh0ZW5kKHRydWUsIHt9LCBzZXR0aW5ncywgeyBvcHRpb25zOiBtZXJnZWRPcHRpb25zIH0pKTtcclxuXHJcbiAgbWVyZ2VkT3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBtZXJnZWRPcHRpb25zLCBoYW5kbGVycyk7XHJcblxyXG4gIGlmIChzZXR0aW5ncy5pc0Z1bGxTY3JlZW4gfHwgc2V0dGluZ3MuaXNGdWxsU2NyZWVuID09PSB1bmRlZmluZWQpIHtcclxuICAgIHJldHVybiBjcmVhdGVGdWxsU2NyZWVuRGF0YUdyaWQoZWwsIG1lcmdlZE9wdGlvbnMsIHNldHRpbmdzLmluUGFuZWxHcmlkKTtcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIGNyZWF0ZURhdGFHcmlkKGVsLCBtZXJnZWRPcHRpb25zKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElHcmlkQWRkaXRpb25hbE9wdGlvbnMgfSBmcm9tICcuL0NyZWF0ZUZ1bGxTY3JlZW5HcmlkJztcclxuaW1wb3J0IGRlZmF1bHRHcmlkIGZyb20gJy4vRGVmYXVsdEdyaWQnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oXHJcbiAgaWQ6IHN0cmluZywgZGF0YUdyaWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9uczogSUdyaWRBZGRpdGlvbmFsT3B0aW9ucyA9IHt9LFxyXG4gIGhlYWRlclRleHQ/OiBzdHJpbmcsIGhlYWRlckRlc2NyaXB0aW9uPzogc3RyaW5nXHJcbik6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgcmV0dXJuIGRlZmF1bHRHcmlkKCQoYCMke2lkfWApLCB7XHJcbiAgICBvcHRpb25zOiBkYXRhR3JpZE9wdGlvbnMsXHJcbiAgICBleHBvcnRGaWxlTmFtZTogYWRkaXRpb25hbE9wdGlvbnMuZXhwb3J0RmlsZU5hbWUsXHJcbiAgICBpblBhbmVsR3JpZDogYWRkaXRpb25hbE9wdGlvbnMuaW5QYW5lbEdyaWQsXHJcbiAgICBzaG93U3VtbWFyeUluQ29sdW1uOiBhZGRpdGlvbmFsT3B0aW9ucy5zaG93U3VtbWFyeUluQ29sdW1uLFxyXG4gICAgc3VtbWFyeUNvbHVtbjogYWRkaXRpb25hbE9wdGlvbnMuc3VtbWFyeUNvbHVtbixcclxuICAgIGhlYWRlckRlc2NyaXB0aW9uLFxyXG4gICAgdGl0bGU6IGhlYWRlclRleHRcclxuICB9KTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSVRyZWVMaXN0U2V0dGluZ3MsIGdldFRyZWVMaXN0RGVmYXVsdE9wdGlvbnMsIGdldEhhbmRsZXJzIH0gZnJvbSAnLi9EZWZhdWx0R3JpZEJhc2UnO1xyXG5pbXBvcnQgeyBjcmVhdGVGdWxsU2NyZWVuVHJlZUxpc3QgfSBmcm9tICcuL0NyZWF0ZUZ1bGxTY3JlZW5HcmlkJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKFxyXG4gIGlkOiBzdHJpbmcgfCBKUXVlcnksXHJcbiAgc2V0dGluZ3M6IElUcmVlTGlzdFNldHRpbmdzID0ge31cclxuKTogRGV2RXhwcmVzcy51aS5keFRyZWVMaXN0IHtcclxuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IGdldFRyZWVMaXN0RGVmYXVsdE9wdGlvbnMoc2V0dGluZ3MpO1xyXG4gIGxldCBtZXJnZWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zID0gJC5leHRlbmQoe30sIGRlZmF1bHRPcHRpb25zLCBzZXR0aW5ncy5vcHRpb25zKTtcclxuICBjb25zdCBoYW5kbGVycyA9IGdldEhhbmRsZXJzPERldkV4cHJlc3MudWkuZHhUcmVlTGlzdE9wdGlvbnM+KCdkeFRyZWVMaXN0JywgJC5leHRlbmQodHJ1ZSwge30sIHNldHRpbmdzLCB7IG9wdGlvbnM6IG1lcmdlZE9wdGlvbnMgfSkpO1xyXG5cclxuICBtZXJnZWRPcHRpb25zID0gJC5leHRlbmQodHJ1ZSwge30sIG1lcmdlZE9wdGlvbnMsIGhhbmRsZXJzKTtcclxuXHJcbiAgcmV0dXJuIGNyZWF0ZUZ1bGxTY3JlZW5UcmVlTGlzdChpZCwgbWVyZ2VkT3B0aW9ucywgc2V0dGluZ3MuaW5QYW5lbEdyaWQpO1xyXG59XHJcbiIsICJpbXBvcnQgQ3JvcHByIGZyb20gJ2Nyb3Bwcic7XHJcbmltcG9ydCB7IGNyZWF0ZURpYWxvZyB9IGZyb20gJy4uL1BvcHVwJztcclxuXHJcbmltcG9ydCBJbml0aWFsaXplZEV2ZW50SW5mbyA9IERldkV4cHJlc3MuZXZlbnRzLkluaXRpYWxpemVkRXZlbnRJbmZvO1xyXG5cclxuY29uc3QgYXZhdGFyU2l6ZSA9IHtcclxuICBoZWlnaHQ6IDMwMCxcclxuICB3aWR0aDogMzAwLFxyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRJbWFnZVRvUHJldmlldyAocHJldmlldzogSlF1ZXJ5LCBiYXNlNjRJbWc6IHN0cmluZyB8IG51bGwpIHtcclxuICBwcmV2aWV3LmF0dHIoJ3NyYycsIGJhc2U2NEltZyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUNvbnRlbnRNYXJrdXAgKGltYWdlQmFzZTY0OiBzdHJpbmcgfCBudWxsKSB7XHJcbiAgY29uc3QgJGF2YXRhclBvcHVwQ29udGVudCA9ICQoJzxkaXY+JylcclxuICAgIC5hZGRDbGFzcygnYXZhdGFyLXBvcHVwX19kcm9wem9uZScpO1xyXG4gIC8vLm9uKCdkcm9wJyAsIGV2ID0+IGV2LmRhdGFUcmFuc2Zlci5maWxlcylcclxuXHJcbiAgY29uc3QgJGNyb3BwZXJDb250YWluZXIgPSAkKCc8ZGl2PicpXHJcbiAgICAuYWRkQ2xhc3MoJ2F2YXRhci1wb3B1cF9fY3JvcC1jb250YWluZXInKVxyXG4gICAgLmFwcGVuZFRvKCRhdmF0YXJQb3B1cENvbnRlbnQpO1xyXG5cclxuICBjb25zdCAkY3JvcEltYWdlID0gJCgnPGltZyAvPicpLnByZXBlbmRUbygkY3JvcHBlckNvbnRhaW5lcik7XHJcblxyXG4gIHNldEltYWdlVG9QcmV2aWV3KCRjcm9wSW1hZ2UsIGltYWdlQmFzZTY0KTtcclxuXHJcbiAgY29uc3QgY3JvcHBlciA9IG5ldyBDcm9wcHIoJGNyb3BJbWFnZVswXSwge1xyXG4gICAgYXNwZWN0UmF0aW86IDEsXHJcbiAgICBzdGFydFNpemU6IFs5MCwgOTBdLFxyXG4gIH0pO1xyXG5cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgICRjb250ZW50OiAkYXZhdGFyUG9wdXBDb250ZW50LFxyXG4gICAgY3JvcHBlclxyXG4gIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNob3dQb3B1cCAoJGNvbnRlbnQ6IEpRdWVyeSwgY3JvcHBlcjogQ3JvcHByLCBvbkF2YXRhclVwZGF0ZWQ6IChwaG90b0Jhc2U2NDogc3RyaW5nKSA9PiB2b2lkKSB7XHJcbiAgY3JlYXRlRGlhbG9nKFxyXG4gICAge1xyXG4gICAgICB0aXRsZTogJ1VwZGF0ZSBwcm9maWxlIHBpY3R1cmUnLFxyXG4gICAgICBzaG93VGl0bGU6IHRydWUsXHJcbiAgICAgIGRyYWdFbmFibGVkOiBmYWxzZSxcclxuICAgICAgcmVzaXplRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSxcclxuICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXHJcbiAgICAgIG1heFdpZHRoOiAxMDI0LFxyXG4gICAgICBvbkluaXRpYWxpemVkOiAoZTogSW5pdGlhbGl6ZWRFdmVudEluZm88RGV2RXhwcmVzcy51aS5keFBvcHVwPikgPT4ge1xyXG4gICAgICAgIGUuY29tcG9uZW50ICYmIGUuY29tcG9uZW50Lm9wdGlvbignZnVsbFNjcmVlbicsIHdpbmRvdy5pbm5lcldpZHRoIDw9IDEwMjQpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgJGNvbnRlbnQsXHJcbiAgICB7XHJcbiAgICAgIHRleHQ6ICdVcGRhdGUnLFxyXG4gICAgICBvbkNsaWNrOiAoY2xvc2UpID0+IHtcclxuICAgICAgICBjb25zdCBjcm9wT3B0aW9ucyA9IGNyb3BwZXIuZ2V0VmFsdWUoKTtcclxuICAgICAgICBjb25zdCAkY2FudmFzOiBKUXVlcnk8SFRNTENhbnZhc0VsZW1lbnQ+ID0gJCgnPGNhbnZhcz4nKS5hdHRyKCdoZWlnaHQnLCBhdmF0YXJTaXplLmhlaWdodCkuYXR0cignd2lkdGgnLCBhdmF0YXJTaXplLndpZHRoKSBhcyBKUXVlcnk8SFRNTENhbnZhc0VsZW1lbnQ+O1xyXG4gICAgICAgIGNvbnN0IGN0eCA9ICgkY2FudmFzWzBdIGFzIGFueSkuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgICAgICBjb25zdCAkaW1hZ2UgPSAkY29udGVudC5maW5kKCdpbWcuY3JvcHByLWltYWdlJylbMF07XHJcblxyXG4gICAgICAgIGN0eC5kcmF3SW1hZ2UoJGltYWdlLCBjcm9wT3B0aW9ucy54LCBjcm9wT3B0aW9ucy55LCBjcm9wT3B0aW9ucy53aWR0aCwgY3JvcE9wdGlvbnMuaGVpZ2h0LCAwLCAwLCBhdmF0YXJTaXplLndpZHRoLCBhdmF0YXJTaXplLmhlaWdodCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNyb3BwZWQgPSAkY2FudmFzWzBdLnRvRGF0YVVSTCgnaW1hZ2UvanBlZycsIDAuOSk7XHJcblxyXG4gICAgICAgIG9uQXZhdGFyVXBkYXRlZChjcm9wcGVkKTtcclxuICAgICAgICBjbG9zZSgpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiAnQ2FuY2VsJyxcclxuICAgICAgb25DbGljazogKGNsb3NlKSA9PiBjbG9zZSgpXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNob3cgKGltYWdlQmFzZTY0OiBzdHJpbmcgfCBudWxsLCBvbkF2YXRhclVwZGF0ZWQ6IChwaG90b0Jhc2U2NDogc3RyaW5nKSA9PiB2b2lkKSB7XHJcbiAgY29uc3QgY29udGVudCA9IGNyZWF0ZUNvbnRlbnRNYXJrdXAoaW1hZ2VCYXNlNjQpO1xyXG5cclxuICBzaG93UG9wdXAoY29udGVudC4kY29udGVudCwgY29udGVudC5jcm9wcGVyLCBvbkF2YXRhclVwZGF0ZWQpO1xyXG59XHJcbiIsICJleHBvcnQgY29uc3QgZ2V0QmFzZTY0ID0gKGZpbGU6IEZpbGUpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+ID0+IHtcclxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcblxyXG4gICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBmaWxlUmVhZGVyLnJlc3VsdDtcclxuICAgICAgICByZXNvbHZlKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnID8gcmVzdWx0IDogbnVsbCk7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBmaWxlUmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcblxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgIH1cclxuICB9KTtcclxufTtcclxuIiwgImltcG9ydCB7SVJlbmRlcmVkfSBmcm9tICcuLi8uLi9Db21wb25lbnRzL0NvcmUnO1xyXG5pbXBvcnQge0RldkV4cHJlc3NFdmVudEFyZ3N9IGZyb20gJy4uLy4uL1V0aWxzL0RldkV4cHJlc3NFdmVudEFyZ3MnO1xyXG5pbXBvcnQgeyBzaG93IH0gZnJvbSAnLi4vLi4vV2lkZ2V0cy9JbWFnZUNyb3BEaWFsb2cnO1xyXG5pbXBvcnQge2dldEJhc2U2NH0gZnJvbSAnLi4vLi4vV2lkZ2V0cy9JbWFnZUNyb3BEaWFsb2cvSGVscGVycyc7XHJcbmltcG9ydCBkeFRleHRCb3hPcHRpb25zID0gRGV2RXhwcmVzcy51aS5keFRleHRCb3hPcHRpb25zO1xyXG5pbXBvcnQgZHhUZXh0Qm94ID0gRGV2RXhwcmVzcy51aS5keFRleHRCb3g7XHJcbmltcG9ydCBJc3pvbGVhVUkgZnJvbSAnLi4vLi4vaW5kZXgnO1xyXG5cclxuY29uc3QgbWF4RmlsZU1iU2l6ZSA9IDEwO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQWNjb3VudFNldHRpbmdzRGF0YSB7XHJcbiAgVXNlck5hbWU6IHN0cmluZztcclxuICBGaXJzdE5hbWU6IHN0cmluZztcclxuICBMYXN0TmFtZTogc3RyaW5nO1xyXG4gIFBob25lTnVtYmVyOiBzdHJpbmc7XHJcbiAgRW1haWw6IHN0cmluZztcclxuICBPbGRQYXNzd29yZDogc3RyaW5nO1xyXG4gIE5ld1Bhc3N3b3JkOiBzdHJpbmc7XHJcbiAgTmV3UGFzc3dvcmRSZXBlYXQ6IHN0cmluZztcclxuICBBdmF0YXI6IHN0cmluZztcclxuICBIYXNDaGFuZ2VzOiBib29sZWFuO1xyXG4gIEVycm9yTWVzc2FnZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyIHtcclxuICBJZDogc3RyaW5nO1xyXG4gIFVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgRmlyc3ROYW1lOiBzdHJpbmc7XHJcbiAgTGFzdE5hbWU6IHN0cmluZztcclxuICBVc2VyQXZhdGFyOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBBY2NvdW50U2V0dGluZ3NQYWdlIGltcGxlbWVudHMgSVJlbmRlcmVkIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRVc2VySW5mbzogSVVzZXIgfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIHJlYWRvbmx5IGFjY291bnRTZXR0aW5nc0RhdGE6IElBY2NvdW50U2V0dGluZ3NEYXRhIHwgdW5kZWZpbmVkO1xyXG4gIHB1YmxpYyByZWFkb25seSBmb3JtQWN0aW9uOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBhdmF0YXJVcGxvYWRlcjogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlciB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGFjY291bnRTZXR0aW5nc0Zvcm06IERldkV4cHJlc3MudWkuZHhGb3JtIHwgdW5kZWZpbmVkO1xyXG5cclxuICAvLyBlbGVtZW50c1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgXyRyb290RWxlbWVudDogSlF1ZXJ5PEhUTUxEaXZFbGVtZW50PiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICAkY29udGFpbmVyOiBKUXVlcnk8SFRNTERpdkVsZW1lbnQ+LFxyXG4gICAgZm9ybUFjdGlvbjogc3RyaW5nLFxyXG4gICAgYWNjb3VudFNldHRpbmdzRGF0YTogSUFjY291bnRTZXR0aW5nc0RhdGEgfCB1bmRlZmluZWQsXHJcbiAgICB1c2VySW5mbzogSVVzZXIgfCB1bmRlZmluZWRcclxuICApIHtcclxuICAgIHRoaXMuYWNjb3VudFNldHRpbmdzRGF0YSA9IGFjY291bnRTZXR0aW5nc0RhdGE7XHJcbiAgICB0aGlzLmN1cnJlbnRVc2VySW5mbyA9IHVzZXJJbmZvO1xyXG4gICAgdGhpcy5fJHJvb3RFbGVtZW50ID0gJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZm9ybUFjdGlvbiA9IGZvcm1BY3Rpb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgdGhpcy5yZW5kZXJVcGxvYWRlcih0aGlzLiRyb290RWxlbWVudCk7XHJcbiAgICB0aGlzLnJlbmRlckFjY291bnRTZXR0aW5nc0Zvcm0odGhpcy4kcm9vdEVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgJHJvb3RFbGVtZW50KCkge1xyXG4gICAgaWYgKCF0aGlzLl8kcm9vdEVsZW1lbnQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgcm9vdCBlbGVtZW50IGlzIHVuZGVmaW5lZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl8kcm9vdEVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclVwbG9hZGVyKCRjb250YWluZXI6IEpRdWVyeSkge1xyXG4gICAgdGhpcy5hdmF0YXJVcGxvYWRlciA9ICQoJzxkaXY+JylcclxuICAgICAgLmFkZENsYXNzKCdhdmF0YXItcG9wdXBfX3VwbG9hZGVyJylcclxuICAgICAgLmR4RmlsZVVwbG9hZGVyKHtcclxuICAgICAgICBtdWx0aXBsZTogZmFsc2UsXHJcbiAgICAgICAgdXBsb2FkTW9kZTogJ3VzZUZvcm0nLFxyXG4gICAgICAgIGFjY2VwdDogJ2ltYWdlLyonLFxyXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICAgIG1heEZpbGVTaXplOiBtYXhGaWxlTWJTaXplICogMTAwMDAwMCxcclxuXHJcbiAgICAgICAgb25WYWx1ZUNoYW5nZWQ6IChlOiBEZXZFeHByZXNzRXZlbnRBcmdzPERldkV4cHJlc3MudWkuZHhGaWxlVXBsb2FkZXJPcHRpb25zLCAnb25WYWx1ZUNoYW5nZWQnPikgPT4ge1xyXG4gICAgICAgICAgaWYgKCFlLmNvbXBvbmVudCB8fCAhZS52YWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb25zdCBmaWxlID0gZS52YWx1ZVswXTtcclxuICAgICAgICAgIGNvbnN0IG1heFNpemUgPSBlLmNvbXBvbmVudC5vcHRpb24oJ21heEZpbGVTaXplJykgfHwgbWF4RmlsZU1iU2l6ZTtcclxuXHJcbiAgICAgICAgICBpZiAoIWZpbGUgfHwgZmlsZS5zaXplID4gbWF4U2l6ZSkge1xyXG4gICAgICAgICAgICBEZXZFeHByZXNzLnVpLm5vdGlmeShgRmlsZSBzaXplIHNob3VsZCBiZSBsZXNzIHRoYW4gJHttYXhGaWxlTWJTaXplfSBNQi4gUGxlYXNlIHNlbGVjdCBhbm90aGVyIGZpbGVgLCAnZXJyb3InLCA1MDAwKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBnZXRCYXNlNjQoZmlsZSlcclxuICAgICAgICAgICAgLnRoZW4oKGltYWdlQmFzZTY0KSA9PiB7XHJcbiAgICAgICAgICAgICAgc2hvdyhpbWFnZUJhc2U2NCwgKG5ld0ltZ1NvdXJjZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY2NvdW50U2V0dGluZ3NGb3JtPy51cGRhdGVEYXRhKCdBdmF0YXInLCBuZXdJbWdTb3VyY2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY2NvdW50U2V0dGluZ3NGb3JtPy5yZXBhaW50KCk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IERldkV4cHJlc3MudWkubm90aWZ5KGVycm9yLCAnZXJyb3InLCAzMDAwKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSlcclxuICAgICAgLmFwcGVuZFRvKCRjb250YWluZXIpXHJcbiAgICAgIC5keEZpbGVVcGxvYWRlcignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQWNjb3VudFNldHRpbmdzRm9ybSgkY29udGFpbmVyOiBKUXVlcnkpIHtcclxuICAgIGlmICh0aGlzLmFjY291bnRTZXR0aW5nc0Zvcm0pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWNjb3VudFNldHRpbmdzRm9ybSA9ICQoJzxmb3JtIC8+JylcclxuICAgICAgLmF0dHIoJ2FjdGlvbicsIHRoaXMuZm9ybUFjdGlvbilcclxuICAgICAgLmF0dHIoJ21ldGhvZCcsICdwb3N0JylcclxuICAgICAgLmFkZENsYXNzKCdhY2NvdW50LXNldHRpbmdzX19mb3JtJylcclxuICAgICAgLmFkZENsYXNzKCdmb3JtLWNvbnRlbnQnKVxyXG4gICAgICAuYXBwZW5kVG8oJGNvbnRhaW5lcilcclxuICAgICAgLmR4Rm9ybSh0aGlzLmdldEZvcm1PcHRpb25zKCkpXHJcbiAgICAgIC5keEZvcm0oJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgaWYgKHRoaXMuYWNjb3VudFNldHRpbmdzRGF0YT8uSGFzQ2hhbmdlcyAmJiAhdGhpcy5hY2NvdW50U2V0dGluZ3NEYXRhLkVycm9yTWVzc2FnZSkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IElzem9sZWFVSS53aWRnZXRzLm5vdGlmeSgnQ2hhbmdlcyBoYXZlIGJlZW4gc2F2ZWQnLCB0cnVlKSwgNTAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Rm9ybU9wdGlvbnMoKSA6IERldkV4cHJlc3MudWkuZHhGb3JtT3B0aW9ucyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBmb3JtRGF0YTogdGhpcy5hY2NvdW50U2V0dGluZ3NEYXRhLFxyXG4gICAgICBtaW5Db2xXaWR0aDogMjAwLFxyXG4gICAgICBsYWJlbExvY2F0aW9uOiAndG9wJyxcclxuICAgICAgYWxpZ25JdGVtTGFiZWxzOiB0cnVlLFxyXG4gICAgICBzaG93VmFsaWRhdGlvblN1bW1hcnk6IHRydWUsXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgICAgICBjb2xDb3VudDogMTYsXHJcbiAgICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgY29sU3BhbjogNixcclxuICAgICAgICAgICAgICBjYXB0aW9uOiAnUHJvZmlsZSBQaWN0dXJlJyxcclxuICAgICAgICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ0F2YXRhcicsXHJcbiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgJGF2YXRhclZpZXdDb250YWluZXIgPSAkKCc8ZGl2PicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2FjY291bnQtc2V0dGluZ3NfX2F2YXRhci12aWV3LWNvbnRhaW5lcicpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCAkYXZhdGFyQ29udGFpbmVyID0gJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdhY2NvdW50LXNldHRpbmdzX19hdmF0YXInKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgLmFkZCgkYXZhdGFyVmlld0NvbnRhaW5lcilcclxuICAgICAgICAgICAgICAgICAgICAgIC5hZGQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQoJzxkaXY+JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2FjY291bnQtc2V0dGluZ3NfX2F2YXRhci1idXR0b24nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5keEJ1dHRvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMjAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2RlZmF1bHQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ3Bob3RvJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICdVcGxvYWQgbmV3IGltYWdlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB0aGlzLmF2YXRhclVwbG9hZGVyICYmIHRoaXMuYXZhdGFyVXBsb2FkZXIub3B0aW9uKCdkaWFsb2dUcmlnZ2VyJywgZS5lbGVtZW50KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICApLmFwcGVuZFRvKCRhdmF0YXJDb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdmF0YXJCYXNlNjQgPSBkYXRhLmVkaXRvck9wdGlvbnMudmFsdWUgfHwgdGhpcy5jdXJyZW50VXNlckluZm8/LlVzZXJBdmF0YXI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhdmF0YXJCYXNlNjQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICQoJzxpbWc+JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdhY2NvdW50LXNldHRpbmdzX19hdmF0YXItdmlldycpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdzcmMnLCBhdmF0YXJCYXNlNjQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkYXZhdGFyVmlld0NvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZWRpdG9yT3B0aW9ucy52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKCc8aW5wdXQ+JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2FjY291bnQtc2V0dGluZ3NfX2F2YXRhci1pbnB1dCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3R5cGUnLCAndGV4dCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ25hbWUnLCAnQXZhdGFyJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJGF2YXRhckNvbnRhaW5lcilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsKGRhdGEuZWRpdG9yT3B0aW9ucy52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICQoJzxpPicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcyhbJ2FjY291bnQtc2V0dGluZ3NfX2F2YXRhci12aWV3LWRlZmF1bHQnLCAnZmFzJywgJ2ZhLXVzZXInXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRhdmF0YXJWaWV3Q29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmKHRoaXMuYXZhdGFyVXBsb2FkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgIHRoaXMuYXZhdGFyVXBsb2FkZXIub3B0aW9uKCdkcm9wWm9uZScsICRhdmF0YXJDb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgdGhpcy5hdmF0YXJVcGxvYWRlci5vcHRpb24oJ29uRHJvcFpvbmVFbnRlcicsICgpID0+ICRhdmF0YXJDb250YWluZXIuYWRkQ2xhc3MoJ2Ryb3AnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICB0aGlzLmF2YXRhclVwbG9hZGVyLm9wdGlvbignb25Ecm9wWm9uZUxlYXZlJywgKCkgPT4gJGF2YXRhckNvbnRhaW5lci5yZW1vdmVDbGFzcygnZHJvcCcpKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkYXZhdGFyQ29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgaXRlbVR5cGU6ICdlbXB0eScsXHJcbiAgICAgICAgICAgICAgY29sU3BhbjogMVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgY29sU3BhbjogOSxcclxuICAgICAgICAgICAgICBjYXB0aW9uOiAnQWNjb3VudCBEZXRhaWxzJyxcclxuICAgICAgICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ0Vycm9yTWVzc2FnZScsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZGF0YSAmJiBkYXRhLmVkaXRvck9wdGlvbnMgJiYgZGF0YS5lZGl0b3JPcHRpb25zLnZhbHVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3JNZXNzYWdlICYmICQoJzxkaXYgLz4nKS50ZXh0KGVycm9yTWVzc2FnZSkuYWRkQ2xhc3MoJ2Vycm9yLW1lc3NhZ2UnKTtcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAvLyB7XHJcbiAgICAgICAgICAgICAgICAvLyAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgIC8vICAgZGF0YUZpZWxkOiAnSGFzQ2hhbmdlcycsXHJcbiAgICAgICAgICAgICAgICAvLyAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgdmlzaWJsZTogZmFsc2VcclxuICAgICAgICAgICAgICAgIC8vICAgfSxcclxuICAgICAgICAgICAgICAgIC8vICAgdmlzaWJsZTogdGhpcy5hY2NvdW50U2V0dGluZ3NEYXRhPy5IYXNDaGFuZ2VzICYmICF0aGlzLmFjY291bnRTZXR0aW5nc0RhdGEuRXJyb3JNZXNzYWdlLFxyXG4gICAgICAgICAgICAgICAgLy8gICB0ZW1wbGF0ZTogKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybiAkKCc8ZGl2IC8+JykudGV4dCgnQ2hhbmdlcyBoYXZlIGJlZW4gc2F2ZWQnKS5hZGRDbGFzcygnc3VjY2Vzcy1tZXNzYWdlJyk7XHJcbiAgICAgICAgICAgICAgICAvLyAgIH0sXHJcbiAgICAgICAgICAgICAgICAvLyB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ1VzZXJOYW1lJyxcclxuICAgICAgICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnVXNlcm5hbWUnXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ3JlcXVpcmVkJywgbWVzc2FnZTogJ1VzZXJuYW1lIGlzIHJlcXVpcmVkJyB9LFxyXG4gICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgICAgICAgICAgICAgY29sQ291bnQ6IDIsXHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnRmlyc3ROYW1lJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICdGaXJzdCBOYW1lJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdyZXF1aXJlZCcsIG1lc3NhZ2U6ICdGaXJzdCBOYW1lIGlzIHJlcXVpcmVkJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnTGFzdE5hbWUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJ0xhc3QgTmFtZSdcclxuICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAncmVxdWlyZWQnLCBtZXNzYWdlOiAnTGFzdCBOYW1lIGlzIHJlcXVpcmVkJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdQaG9uZU51bWJlcicsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1Bob25lIE51bWJlcidcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdFbWFpbCcsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ0VtYWlsJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdyZXF1aXJlZCcsIG1lc3NhZ2U6ICdFbWFpbCBpcyByZXF1aXJlZCcgfSxcclxuICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdlbWFpbCcsIG1lc3NhZ2U6ICdQbGVhc2UgdXNlIGEgdmFsaWQgZW1haWwgYWRkcmVzcycgfVxyXG4gICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGNzc0NsYXNzOiAnYWNjb3VudC1zZXR0aW5nc19fcGFzc3dvcmQtYXJlYScsXHJcbiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiAkKCc8ZGl2IC8+JykuY3NzKCdmb250LXdlaWdodCcsICdib2xkJykudGV4dCgnQ2hhbmdlIFBhc3N3b3JkJylcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnT2xkUGFzc3dvcmQnLFxyXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdDdXJyZW50IHBhc3N3b3JkJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogJ3Bhc3N3b3JkJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgICAgICAgICAgICAgICAgIHJlZXZhbHVhdGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2FsbGJhY2s6IChwYXJhbXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoISF0aGlzLmFjY291bnRTZXR0aW5nc0Zvcm0/LmdldEVkaXRvcignTmV3UGFzc3dvcmQnKT8ub3B0aW9uKCd2YWx1ZScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhcGFyYW1zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnT2xkIHBhc3N3b3JkIGlzIHJlcXVpcmVkJ1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnTmV3UGFzc3dvcmQnLFxyXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdOZXcgcGFzc3dvcmQnXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBtb2RlOiAncGFzc3dvcmQnLFxyXG4gICAgICAgICAgICAgICAgICAgIGlucHV0QXR0cjogeyBhdXRvY29tcGxldGU6ICduZXctcGFzc3dvcmQnIH1cclxuICAgICAgICAgICAgICAgICAgfSBhcyBkeFRleHRCb3hPcHRpb25zPGR4VGV4dEJveD4sXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ05ld1Bhc3N3b3JkUmVwZWF0JyxcclxuICAgICAgICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnQ29uZmlybSBuZXcgcGFzc3dvcmQnXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBtb2RlOiAncGFzc3dvcmQnXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcmVldmFsdWF0ZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25DYWxsYmFjazogKHBhcmFtcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuYWNjb3VudFNldHRpbmdzRm9ybT8uZ2V0RWRpdG9yKCdOZXdQYXNzd29yZCcpPy5vcHRpb24oJ3ZhbHVlJykgfHwgJycpID09PSBwYXJhbXMudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1Bhc3N3b3JkIG1pc21hdGNoJyxcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ2J1dHRvbicsXHJcbiAgICAgICAgICAgICAgICAgIGhvcml6b250YWxBbGlnbm1lbnQ6ICdyaWdodCcsXHJcbiAgICAgICAgICAgICAgICAgIGNzc0NsYXNzOiAnYWNjb3VudC1zZXR0aW5nc19fc3VibWl0LWJ0bicsXHJcbiAgICAgICAgICAgICAgICAgIGJ1dHRvbk9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnU2F2ZSBDaGFuZ2VzJyxcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlU3VibWl0QmVoYXZpb3I6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDIwMCxcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb25maXJtKHRleHQ6IHN0cmluZyk6IEpRdWVyeURlZmVycmVkPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0ICRkZWZmZXJlZDogSlF1ZXJ5RGVmZXJyZWQ8Ym9vbGVhbj4gPSAkLkRlZmVycmVkKCk7XHJcbiAgICBjb25zdCAkZWxlbWVudCA9ICQoJzxkaXYvPicpLmFwcGVuZFRvKHdpbmRvdy5kb2N1bWVudC5ib2R5KTtcclxuXHJcbiAgICBjb25zdCBwb3B1cCA9ICRlbGVtZW50LmR4UG9wdXAoe1xyXG4gICAgICAgIHNob3dUaXRsZTogZmFsc2UsXHJcbiAgICAgICAgaGVpZ2h0OiAxNDAsXHJcbiAgICAgICAgd2lkdGg6IDM3MCxcclxuICAgICAgICBjb250ZW50VGVtcGxhdGU6ICgkY29udGVudCkgPT4ge1xyXG4gICAgICAgICAgICAkY29udGVudC5hZGRDbGFzcygnaXN6b2xlYS1keC1jb25maXJtJyk7XHJcblxyXG4gICAgICAgICAgICAkKCc8Yi8+JykuYWRkQ2xhc3MoJ21lc3NhZ2UnKS50ZXh0KHRleHQpLmFwcGVuZFRvKCRjb250ZW50KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0ICRidXR0b25zU2VjdGlvbiA9ICQoJzxkaXYvPicpLmFkZENsYXNzKCdidXR0b25zJykuYXBwZW5kVG8oJGNvbnRlbnQpO1xyXG5cclxuICAgICAgICAgICAgJCgnPGRpdi8+JykuZHhCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgdGV4dDogJ0RlbGV0ZScsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnZGFuZ2VyJyxcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBwb3B1cC5oaWRlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICRkZWZmZXJlZC5yZXNvbHZlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KS5hcHBlbmRUbygkYnV0dG9uc1NlY3Rpb24pO1xyXG5cclxuICAgICAgICAgICAgJCgnPGRpdi8+JykuZHhCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgdGV4dDogJ0NhbmNlbCcsXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9wdXAuaGlkZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAkZGVmZmVyZWQucmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLmFwcGVuZFRvKCRidXR0b25zU2VjdGlvbik7XHJcbiAgICAgICAgfSxcclxuICAgICAgb25IaWRkZW46ICgpID0+IHtcclxuICAgICAgICBwb3B1cC5kaXNwb3NlKCk7XHJcbiAgICAgICAgcG9wdXAuZWxlbWVudCgpLnJlbW92ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KS5keFBvcHVwKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHBvcHVwLnNob3coKTtcclxuXHJcbiAgICByZXR1cm4gJGRlZmZlcmVkO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTG9nb1NldHRpbmdzIH0gZnJvbSAnLi4vRGF0YSc7XHJcbmltcG9ydCB7IExPR09fU0VUVElOR1NfQ0FDSEVfS0VZIH0gZnJvbSAnLi4vQ29uc3RhbnRzL0NhY2hlS2V5cyc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi4vQ29uZmlnL0luZGV4JztcclxuaW1wb3J0IHsgSUJhY2tncm91bmRQaG90b1ZpZXdlclNldHRpbmdzIH0gZnJvbSAnLi4vRGF0YS9JQmFja2dyb3VuZFBob3RvVmlld2VyU2V0dGluZ3MnO1xyXG5pbXBvcnQgeyBzaG93IGFzIHNob3dJbWFnZVZpZXdlciB9IGZyb20gJy4uL1dpZGdldHMvQmFja2dyb3VuZEltYWdlVmlld2VyJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYW5kaW5nKCRjb250YWluZXI6IEpRdWVyeSwgbG9nb1NldHRpbmdzOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nLCBzaG93U2lnbkluQnV0dG9uOiBib29sZWFuLCBwaG90b0dhbGxlcnlTZXR0aW5nczogSUJhY2tncm91bmRQaG90b1ZpZXdlclNldHRpbmdzID0geyBlbmFibGVkOiBmYWxzZSB9KSB7XHJcbiAgZ2V0TG9nb1NldHRpbmdzKGxvZ29TZXR0aW5ncykudGhlbigoc2V0dGluZ3MpID0+IHtcclxuICAgIGNyZWF0ZUxhbmRpbmdNYXJrdXAoJGNvbnRhaW5lciwgc2V0dGluZ3MsIHNob3dTaWduSW5CdXR0b24sIHBob3RvR2FsbGVyeVNldHRpbmdzKTtcclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0TG9nb1NldHRpbmdzKGxvZ29TZXR0aW5nczogSUxvZ29TZXR0aW5ncyB8IHN0cmluZyk6IEpRdWVyeURlZmVycmVkPElMb2dvU2V0dGluZ3M+IHtcclxuICBjb25zdCAkZGVmZmVyZWQ6IEpRdWVyeURlZmVycmVkPElMb2dvU2V0dGluZ3M+ID0gJC5EZWZlcnJlZCgpO1xyXG5cclxuICBpZiAodHlwZW9mIGxvZ29TZXR0aW5ncyA9PT0gJ3N0cmluZycpIHtcclxuICAgIGNvbnN0IGNhY2hlZFNldHRpbmdzUmF3ID0gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVkpO1xyXG4gICAgaWYgKGNhY2hlZFNldHRpbmdzUmF3KSB7XHJcbiAgICAgICRkZWZmZXJlZC5yZXNvbHZlKEpTT04ucGFyc2UoY2FjaGVkU2V0dGluZ3NSYXcpIGFzIElMb2dvU2V0dGluZ3MpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2VuZFJlcXVlc3QobG9nb1NldHRpbmdzLCAncG9zdCcpLmRvbmUoKGRhdGEpID0+IHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSB7XHJcbiAgICAgICAgICBhcHBsaWNhdGlvbk5hbWU6IGRhdGEuQXBwbGljYXRpb25OYW1lLFxyXG4gICAgICAgICAgYnVzaW5lc3NOYW1lOiBkYXRhLkJ1c2luZXNzTmFtZSxcclxuICAgICAgICAgIGxhbmRpbmdQYWdlTG9nbzogZGF0YS5MYW5kaW5nUGFnZUxvZ28sXHJcbiAgICAgICAgICBsb2dvSW1hZ2U6IGRhdGEuTG9nb0ltYWdlLFxyXG4gICAgICAgICAgZGVzY3JpcHRpb246IGRhdGEuRGVzY3JpcHRpb25cclxuICAgICAgICB9IGFzIElMb2dvU2V0dGluZ3M7XHJcbiAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVksIEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpO1xyXG4gICAgICAgICRkZWZmZXJlZC5yZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICAkZGVmZmVyZWQucmVzb2x2ZShsb2dvU2V0dGluZ3MpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuICRkZWZmZXJlZDtcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlTGFuZGluZ01hcmt1cCgkY29udGFpbmVyOiBKUXVlcnksIGxvZ29TZXR0aW5nczogSUxvZ29TZXR0aW5ncywgc2hvd1NpZ25JbkJ1dHRvbjogYm9vbGVhbiwgcGhvdG9HYWxsZXJ5U2V0dGluZ3M6IElCYWNrZ3JvdW5kUGhvdG9WaWV3ZXJTZXR0aW5ncykge1xyXG4gIGNvbnN0ICRsYW5kaW5nUGFnZSA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnaXN6b2xlYS1sYW5kaW5nLXBhZ2UnKS5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuICBsZXQgJGxhbmRpbmdDb250YWluZXIgPSAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2xhbmRpbmctY29udGFpbmVyJykuYXBwZW5kVG8oJGxhbmRpbmdQYWdlKTtcclxuXHJcbiAgaWYocGhvdG9HYWxsZXJ5U2V0dGluZ3MuZW5hYmxlZCkge1xyXG4gICAgJGxhbmRpbmdQYWdlLmFkZENsYXNzKCdwaG90by1nYWxsZXJ5LW1vZGUnKTtcclxuICB9IGVsc2Uge1xyXG4gICAgJGxhbmRpbmdQYWdlLmFkZENsYXNzKCdkZWZhdWx0LW1vZGUnKTtcclxuICAgICRsYW5kaW5nQ29udGFpbmVyID0gJGxhbmRpbmdQYWdlO1xyXG4gIH1cclxuXHJcbiAgJCgnPGRpdiAvPicpLmFkZENsYXNzKCdsb2dvLWNvbnRhaW5lcicpXHJcbiAgICAuYXBwZW5kVG8oJGxhbmRpbmdDb250YWluZXIpXHJcbiAgICAuYXBwZW5kKFxyXG4gICAgICAkKCc8aW1nIC8+JykuYXR0cignc3JjJywgbG9nb1NldHRpbmdzLmxhbmRpbmdQYWdlTG9nbykuYWRkQ2xhc3MoJ2xvZ28tbGFyZ2UnKS5hcHBlbmRUbygkbGFuZGluZ0NvbnRhaW5lciksXHJcbiAgICAgICQoJzxzcGFuIC8+JykuYWRkQ2xhc3MoJ2J1c2luZXNzLW5hbWUnKS50ZXh0KGxvZ29TZXR0aW5ncy5idXNpbmVzc05hbWUpLmFwcGVuZFRvKCRsYW5kaW5nQ29udGFpbmVyKVxyXG4gICk7XHJcblxyXG4gICQoJzxoMiAvPicpLnRleHQoYFdlbGNvbWUgdG8gJHtsb2dvU2V0dGluZ3MuZGVzY3JpcHRpb259YCkuYXBwZW5kVG8oJGxhbmRpbmdDb250YWluZXIpO1xyXG5cclxuICBpZiAoc2hvd1NpZ25JbkJ1dHRvbikge1xyXG4gICAgJCgnPGRpdiAvPicpLmFkZENsYXNzKCdzaWduLWluLWJ1dHRvbicpLmFwcGVuZCgkKCc8ZGl2IC8+JykuZHhCdXR0b24oe1xyXG4gICAgICB0ZXh0OiAnU2lnbiBJbicsXHJcbiAgICAgIHdpZHRoOiBjb25maWcuaXNMZWdhY3lSZW5kZXIgPyB1bmRlZmluZWQgOiAnMjAwcHgnLFxyXG4gICAgICB0eXBlOiAnZGVmYXVsdCcsXHJcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuY2xlYXIoKTtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGAvSG9tZS9Mb2dpbj9yZXR1cm5Vcmw9JHtlbmNvZGVVUklDb21wb25lbnQod2luZG93LmxvY2F0aW9uLmhyZWYudG9TdHJpbmcoKSl9YDtcclxuICAgICAgfVxyXG4gICAgfSkpLmFwcGVuZFRvKCRsYW5kaW5nQ29udGFpbmVyKTtcclxuICB9XHJcblxyXG4gIGlmKHBob3RvR2FsbGVyeVNldHRpbmdzLmVuYWJsZWQpIHtcclxuICAgIHNob3dJbWFnZVZpZXdlcihcclxuICAgICAgcGhvdG9HYWxsZXJ5U2V0dGluZ3MuJGNvbnRhaW5lciB8fCAkbGFuZGluZ1BhZ2UsXHJcbiAgICAgIHBob3RvR2FsbGVyeVNldHRpbmdzLmltYWdlVXJscyB8fCBbXSxcclxuICAgICAgcGhvdG9HYWxsZXJ5U2V0dGluZ3MuaW1nQ2hhbmdlSW50ZXJ2YWxTZWMgfHwgOCxcclxuICAgICAgcGhvdG9HYWxsZXJ5U2V0dGluZ3MudHJhbnNpdGlvblRpbWVTZWMgfHwgMlxyXG4gICAgKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBY2Nlc3NEZW5pZWRUb1JlcG9ydCgkY29udGFpbmVyOiBKUXVlcnksIGFsbG93ZWRSZXBvcnRSb2xlczogc3RyaW5nW10sIGFsbG93ZWRDb25uZWN0aW9uUm9sZXM6IHN0cmluZ1tdKSB7XHJcbiAgY29uc3QgJGlzem9sZWFDb250YWluZXIgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdhY2Nlc3MtZGVuaWVkLXRvLXJlcG9ydC1wYWdlJykuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcbiAgJCgnPGgyPicpLmFkZENsYXNzKCdlcnJvci10ZXh0JykudGV4dCgnQWNjZXNzIGRlbmllZCB0byB0aGUgcmVwb3J0JykuYXBwZW5kVG8oJGlzem9sZWFDb250YWluZXIpO1xyXG5cclxuICBpZiAoYWxsb3dlZFJlcG9ydFJvbGVzICYmIGFsbG93ZWRSZXBvcnRSb2xlcy5sZW5ndGgpIHtcclxuICAgIGNvbnN0IHJlcG9ydFJvbGVzID0gYWxsb3dlZFJlcG9ydFJvbGVzLm1hcCgocikgPT4gJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ3JvbGUnKS50ZXh0KHIpKTtcclxuICAgICQoJzxwPicpLnRleHQoJ1JlcXVpcmVkIHJvbGVzIGZvciByZXBvcnQ6ICcpLmFwcGVuZChyZXBvcnRSb2xlcykuYXBwZW5kVG8oJGlzem9sZWFDb250YWluZXIpO1xyXG4gIH1cclxuXHJcbiAgaWYgKGFsbG93ZWRDb25uZWN0aW9uUm9sZXMgJiYgYWxsb3dlZENvbm5lY3Rpb25Sb2xlcy5sZW5ndGgpIHtcclxuICAgIGNvbnN0IGNvbm5lY3Rpb25zUm9sZXMgPSBhbGxvd2VkQ29ubmVjdGlvblJvbGVzLm1hcCgocikgPT4gJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ3JvbGUnKS50ZXh0KHIpKTtcclxuICAgICQoJzxwPicpLnRleHQoJ1JlcXVpcmVkIHJvbGVzIGZvciBkYiBjb25uZWN0aW9uOiAnKS5hcHBlbmQoY29ubmVjdGlvbnNSb2xlcykuYXBwZW5kVG8oJGlzem9sZWFDb250YWluZXIpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IGZ1bGxTY3JlZW4gZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9GdWxsU2NyZWVuJztcclxuaW1wb3J0IHsgaW5pdFBvcG92ZXIgfSBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyJztcclxuaW1wb3J0IHsgSUNkbVJlcG9ydFBhcmFtcywgTW9kZSB9IGZyb20gJy4uLy4uL0lSZXBvcnRQYXJhbXMnO1xyXG5pbXBvcnQgeyBDb250cm9sQ29uZmlndXJhdG9yLCBJQ29udHJvbENvbmZpZ3VyYXRvck9wdGlvbnMgfSBmcm9tICcuL0NvbnRyb2xDb25maWd1cmF0b3InO1xyXG5pbXBvcnQgeyBDb250cm9sRGlzcGxheSwgSUNvbnRyb2xEaXNwbGF5T3B0aW9ucyB9IGZyb20gJy4vQ29udHJvbERpc3BsYXknO1xyXG5pbXBvcnQgeyBEaXNwbGF5TWFuYWdlciwgSURpc3BsYXlNYW5hZ2VyT3B0aW9ucyB9IGZyb20gJy4vRGlzcGxheU1hbmFnZXInO1xyXG5pbXBvcnQge0lSZXBvcnRDb21wb25lbnR9IGZyb20gJy4uLy4uL0lSZXBvcnRDb21wb25lbnQnO1xyXG5cclxuZXhwb3J0IHsgQ29udHJvbENvbmZpZ3VyYXRvciB9IGZyb20gJy4vQ29udHJvbENvbmZpZ3VyYXRvcic7XHJcbmV4cG9ydCB7IENvbnRyb2xEaXNwbGF5IH0gZnJvbSAnLi9Db250cm9sRGlzcGxheSc7XHJcbmV4cG9ydCB7IERpc3BsYXlNYW5hZ2VyIH0gZnJvbSAnLi9EaXNwbGF5TWFuYWdlcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDRE1SZXBvcnRQYWdlT3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHJlcG9ydFBhcmFtczogSUNkbVJlcG9ydFBhcmFtcztcclxuICB1c2VyTmFtZTogc3RyaW5nO1xyXG4gIGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBjZG1SZXBvcnRDb250cm9sbGVyVXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENETVJlcG9ydFBhZ2UgaW1wbGVtZW50cyBJUmVwb3J0Q29tcG9uZW50IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IFNXSVRDSF9UT19ERVNJR05FUl9URVhUID0gJ1N3aXRjaCB0byBTZXR0aW5ncyc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBTV0lUQ0hfVE9fVklFV0VSX1RFWFQgPSAnU3dpdGNoIHRvIERpc3BsYXknO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgU1RPUkFHRV9NT0RFX0tFWSA9ICdDRE1fU1RPUkFHRV9NT0RFX0tFWSc7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgJHJvb3RFbGVtZW50OiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0UGFyYW1zOiBJQ2RtUmVwb3J0UGFyYW1zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY29udHJvbENvbmZpZ3VyYXRvck9wdGlvbnM6IElDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucztcclxuICBwcml2YXRlIHJlYWRvbmx5IGRpc3BsYXlNYW5hZ2VyT3B0aW9uczogSURpc3BsYXlNYW5hZ2VyT3B0aW9ucztcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRyb2xEaXNwbGF5T3B0aW9uczogSUNvbnRyb2xEaXNwbGF5T3B0aW9ucztcclxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBwcml2YXRlIG11bHRpVmlldzogRGV2RXhwcmVzcy51aS5keE11bHRpVmlldztcclxuICBwcml2YXRlIHRhYlBhbmVsOiBEZXZFeHByZXNzLnVpLmR4VGFiUGFuZWw7XHJcbiAgcHJpdmF0ZSBwb3BvdmVyOiBEZXZFeHByZXNzLnVpLmR4UG9wb3ZlcjtcclxuXHJcbiAgcHJpdmF0ZSBtb2RlOiBNb2RlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJQ0RNUmVwb3J0UGFnZU9wdGlvbnMpIHtcclxuICAgIGNvbnN0IGJhc2VVcmwgPSBgLyR7b3B0aW9ucy5jZG1SZXBvcnRDb250cm9sbGVyVXJsfS8ke29wdGlvbnMucmVwb3J0UGFyYW1zLlJlcG9ydElkfWA7XHJcbiAgICB0aGlzLiRyb290RWxlbWVudCA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMucmVwb3J0UGFyYW1zID0gb3B0aW9ucy5yZXBvcnRQYXJhbXM7XHJcbiAgICB0aGlzLmFsbG93RWRpdGluZyA9IG9wdGlvbnMuYWxsb3dFZGl0aW5nO1xyXG4gICAgdGhpcy5tb2RlID0gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCkpIGFzIE1vZGUgfHwgTW9kZS5WaWV3ZXI7XHJcblxyXG4gICAgdGhpcy5jb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucyA9IHRoaXMuZ2V0Q29udHJvbENvbmZpZ3VyYXRvck9wdGlvbnMoYmFzZVVybCwgb3B0aW9ucy5jZG1SZXBvcnRDb250cm9sbGVyVXJsKTtcclxuICAgIHRoaXMuZGlzcGxheU1hbmFnZXJPcHRpb25zID0gdGhpcy5nZXREaXNwbGF5TWFuYWdlck9wdGlvbnMoYmFzZVVybCk7XHJcbiAgICB0aGlzLmNvbnRyb2xEaXNwbGF5T3B0aW9ucyA9IHRoaXMuZ2V0Q29udHJvbERpc3BsYXlPcHRpb25zKGJhc2VVcmwsIG9wdGlvbnMudXNlck5hbWUsIG9wdGlvbnMucmVwb3J0UGFyYW1zKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0KCkge1xyXG4gICAgaWYgKHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpIHtcclxuICAgICAgdGhpcy5wb3BvdmVyID0gaW5pdFBvcG92ZXIoJy5yZXBvcnQtZGV0YWlscy1saW5rJywgdGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYWxsb3dFZGl0aW5nKSB7XHJcbiAgICAgIHRoaXMuaW5pdFN3aXRjaE1vZGVCdXR0b24oKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlckNvbnRlbnQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwb3NlKCkge1xyXG4gICAgdGhpcy5tdWx0aVZpZXc/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMudGFiUGFuZWw/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMucG9wb3Zlcj8uZGlzcG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgcmVmcmVzaCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQ29udGVudCgpIHtcclxuICAgIGlmICh0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyRGlzcGxheSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZW5kZXJUYWJQYW5lbCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucyhiYXNlVXJsOiBzdHJpbmcsIGNkbVJlcG9ydENvbnRyb2xsZXJVcmw6IHN0cmluZyk6IElDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAkY29udGFpbmVyOiBudWxsLFxyXG4gICAgICBpc1N0YW5kYWxvbmVQYWdlOiBmYWxzZSxcclxuICAgICAgcGFnZVRpdGxlOiAnJyxcclxuICAgICAgYXZhaWxhYmxlUm9sZXNVcmw6IGAvJHtjZG1SZXBvcnRDb250cm9sbGVyVXJsfS9BdmFpbGFibGVSb2xlc2AsXHJcbiAgICAgIGdyb3VwRmllbGRzVXJsOiBgJHtiYXNlVXJsfS9BbGxDb250cm9sRmllbGRzYCxcclxuICAgICAgbG9hZERhdGFVcmw6IGAke2Jhc2VVcmx9L0NvbmZpZ3VyYXRvckRhdGFgLFxyXG4gICAgICB1cGRhdGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9Db25maWd1cmF0b3JEYXRhYFxyXG4gICAgfSBhcyBJQ29udHJvbENvbmZpZ3VyYXRvck9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldERpc3BsYXlNYW5hZ2VyT3B0aW9ucyhiYXNlVXJsOiBzdHJpbmcpOiBJRGlzcGxheU1hbmFnZXJPcHRpb25zIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICRjb250YWluZXI6IG51bGwsXHJcbiAgICAgIGlzU3RhbmRhbG9uZVBhZ2U6IGZhbHNlLFxyXG4gICAgICBwYWdlVGl0bGU6ICcnLFxyXG4gICAgICBsb2FkRGF0YVVybDogYCR7YmFzZVVybH0vQ29udHJvbERpc3BsYXlVc2VyQXNzaWdubWVudHNgLFxyXG4gICAgICB1cGRhdGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9VcGRhdGVDb250cm9sRGlzcGxheVVzZXJBc3NpZ25tZW50c2BcclxuICAgIH0gYXMgSURpc3BsYXlNYW5hZ2VyT3B0aW9ucztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q29udHJvbERpc3BsYXlPcHRpb25zKFxyXG4gICAgYmFzZVVybDogc3RyaW5nLFxyXG4gICAgdXNlck5hbWU6IHN0cmluZyxcclxuICAgIHJlcG9ydFBhcmFtczogSUNkbVJlcG9ydFBhcmFtc1xyXG4gICk6IElDb250cm9sRGlzcGxheU9wdGlvbnMge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgJGNvbnRhaW5lcjogbnVsbCxcclxuICAgICAgaXNTdGFuZGFsb25lUGFnZTogZmFsc2UsXHJcbiAgICAgIHBhZ2VUaXRsZTogJycsXHJcbiAgICAgIGV4cG9ydEZpbGVOYW1lOiByZXBvcnRQYXJhbXMuTmFtZSxcclxuICAgICAgdXNlckNvbmZpZ1VybDogYCR7YmFzZVVybH0vRmllbGRzUGVybWlzc2lvbnNgLFxyXG4gICAgICBjb250cm9sTG9nc1VybDogYCR7YmFzZVVybH0vR2V0Q29udHJvbExvZ3NgLFxyXG4gICAgICBsb2FkRGF0YVVybDogYCR7YmFzZVVybH0vQ29udHJvbERpc3BsYXlEYXRhYCxcclxuICAgICAgdXBkYXRlRGF0YVVybDogYCR7YmFzZVVybH0vVXBkYXRlQ29udHJvbERpc3BsYXlEYXRhYCxcclxuICAgICAgdXNlck5hbWUsXHJcbiAgICAgIGltcG9ydEZpbGVPcHRpb25zOiByZXBvcnRQYXJhbXMuQWxsb3dJbXBvcnRpbmcgPyB7XHJcbiAgICAgICAgbW9kZTogcmVwb3J0UGFyYW1zLkltcG9ydEZpbGVNb2RlLFxyXG4gICAgICAgIGNyZWF0ZVRhYmxlVXJsOiBgJHtiYXNlVXJsfS9jcmVhdGUtdGFibGVgLFxyXG4gICAgICAgIGFkZFJvd3NVcmw6IGAke2Jhc2VVcmx9L2FkZC1yb3dzYCxcclxuICAgICAgICBmaWxlVXBsb2FkVXJsOiBgJHtiYXNlVXJsfS9nZXQtY29sdW1uc2AsXHJcbiAgICAgICAgcHJlZGVmaW5lZFRhYmxlOiByZXBvcnRQYXJhbXMuRmlsZUltcG9ydGVyVGFibGVJbmZvXHJcbiAgICAgIH0gOiB1bmRlZmluZWQsXHJcbiAgICAgIGdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnM6IHtcclxuICAgICAgICBsb2FkRGF0YVVybDogYCR7YmFzZVVybH0vR2V0Q29udHJvbEZpbHRlcnNgLFxyXG4gICAgICAgIGluc2VydERhdGFVcmw6IGAke2Jhc2VVcmx9L0FkZENvbnRyb2xGaWx0ZXJgLFxyXG4gICAgICAgIHVwZGF0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L1VwZGF0ZUNvbnRyb2xGaWx0ZXJgLFxyXG4gICAgICAgIGRlbGV0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L1JlbW92ZUNvbnRyb2xGaWx0ZXJgXHJcbiAgICAgIH0sXHJcbiAgICAgIGdyaWRWaWV3c01hbmFnZXJPcHRpb25zOiB7XHJcbiAgICAgICAgbG9hZERhdGFVcmw6IGAke2Jhc2VVcmx9L0dldENvbnRyb2xWaWV3c2AsXHJcbiAgICAgICAgaW5zZXJ0RGF0YVVybDogYCR7YmFzZVVybH0vQWRkQ29udHJvbFZpZXdgLFxyXG4gICAgICAgIHVwZGF0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L1VwZGF0ZUNvbnRyb2xWaWV3YCxcclxuICAgICAgICBkZWxldGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9SZW1vdmVDb250cm9sVmlld2BcclxuICAgICAgfSxcclxuICAgICAgZ3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnM6IHtcclxuICAgICAgICBsb2FkRGF0YVVybDogYCR7YmFzZVVybH0vR2V0Q29udHJvbERpc3BsYXlzYCxcclxuICAgICAgICBpbnNlcnREYXRhVXJsOiBgJHtiYXNlVXJsfS9BZGRDb250cm9sRGlzcGxheWAsXHJcbiAgICAgICAgdXBkYXRlRGF0YVVybDogYCR7YmFzZVVybH0vVXBkYXRlQ29udHJvbERpc3BsYXlgLFxyXG4gICAgICAgIGRlbGV0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L1JlbW92ZUNvbnRyb2xEaXNwbGF5YFxyXG4gICAgICB9LFxyXG4gICAgICByZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9uczoge1xyXG4gICAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9HZXRDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc2AsXHJcbiAgICAgICAgdXBkYXRlRGF0YVVybDogYCR7YmFzZVVybH0vVXBkYXRlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NgLFxyXG4gICAgICB9XHJcbiAgICB9IGFzIElDb250cm9sRGlzcGxheU9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRTd2l0Y2hNb2RlQnV0dG9uKCkge1xyXG4gICAgY29uc3QgYnV0dG9uID0gJCgnLnN3aXRjaC1tb2RlLWJ0bicpLmR4QnV0dG9uKHtcclxuICAgICAgdGV4dDogdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IHRoaXMuU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgOiB0aGlzLlNXSVRDSF9UT19WSUVXRVJfVEVYVCxcclxuICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubW9kZSA9IHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyBNb2RlLkRlc2lnbmVyIDogTW9kZS5WaWV3ZXI7XHJcbiAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCksIHRoaXMubW9kZSk7XHJcbiAgICAgICAgYnV0dG9uLm9wdGlvbigndGV4dCcsIHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyB0aGlzLlNXSVRDSF9UT19ERVNJR05FUl9URVhUIDogdGhpcy5TV0lUQ0hfVE9fVklFV0VSX1RFWFQpO1xyXG5cclxuICAgICAgICB0aGlzLnJlbmRlckNvbnRlbnQoKTtcclxuICAgICAgfVxyXG4gICAgfSkuYWRkQ2xhc3MoJ2lzem9sZWEtbWQnKS5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyRGlzcGxheSgpIHtcclxuICAgIHRoaXMuJHJvb3RFbGVtZW50Lmh0bWwoJycpO1xyXG4gICAgY29uc3QgJHZpZXcgPSAkKCc8ZGl2IC8+JykuYXBwZW5kVG8odGhpcy4kcm9vdEVsZW1lbnQpO1xyXG5cclxuICAgIHRoaXMubXVsdGlWaWV3ID0gJHZpZXcuZHhNdWx0aVZpZXcoe1xyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBDb250cm9sRGlzcGxheSh7IC4uLnRoaXMuY29udHJvbERpc3BsYXlPcHRpb25zLCAkY29udGFpbmVyOiAkKCc8ZGl2IC8+JykgfSk7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudC5yZW5kZXIoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQuJGNvbnRhaW5lcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgIH0pLmFkZENsYXNzKCdjZG0tcmVwb3J0X19kaXNwbHktZ3JpZCcpLmR4TXVsdGlWaWV3KCdpbnN0YW5jZScpO1xyXG4gICAgZnVsbFNjcmVlbih0aGlzLm11bHRpVmlldywgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJUYWJQYW5lbCgpIHtcclxuICAgIHRoaXMuJHJvb3RFbGVtZW50Lmh0bWwoJycpO1xyXG5cclxuICAgIGNvbnN0ICRtYWluVGFiUGFuZWwgPSAkKCc8ZGl2IC8+JykuYXBwZW5kVG8odGhpcy4kcm9vdEVsZW1lbnQpO1xyXG5cclxuICAgIHRoaXMudGFiUGFuZWwgPSB0aGlzLmNyZWF0ZVRhYlBhbmVsKCRtYWluVGFiUGFuZWwpO1xyXG4gICAgZnVsbFNjcmVlbih0aGlzLnRhYlBhbmVsLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVRhYlBhbmVsKGVsZW1lbnQ6IEpRdWVyeTxIVE1MRWxlbWVudD4pOiBEZXZFeHByZXNzLnVpLmR4VGFiUGFuZWwge1xyXG4gICAgcmV0dXJuIGVsZW1lbnQuZHhUYWJQYW5lbCh7XHJcbiAgICAgIHN3aXBlRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIHNob3dOYXZCdXR0b25zOiB0cnVlLFxyXG4gICAgICBmb2N1c1N0YXRlRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIGFjdGl2ZVN0YXRlRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiBmYWxzZSxcclxuICAgICAgb25TZWxlY3Rpb25DaGFuZ2VkOiAoZSkgPT4ge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgZS5jb21wb25lbnQucmVwYWludCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9LFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRpdGxlOiAnQ29uZmlndXJhdG9yJyxcclxuICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBDb250cm9sQ29uZmlndXJhdG9yKHsgLi4udGhpcy5jb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucywgJGNvbnRhaW5lcjogJCgnPGRpdiAvPicpIH0pO1xyXG4gICAgICAgICAgICBjb21wb25lbnQucmVuZGVyKCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50LiRjb250YWluZXI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICB0aXRsZTogJ0Rpc3BsYXkgTWFuYWdlcicsXHJcbiAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgRGlzcGxheU1hbmFnZXIoeyAuLi50aGlzLmRpc3BsYXlNYW5hZ2VyT3B0aW9ucywgJGNvbnRhaW5lcjogJCgnPGRpdiAvPicpIH0pO1xyXG4gICAgICAgICAgICBjb21wb25lbnQucmVuZGVyKCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50LiRjb250YWluZXI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgXVxyXG4gICAgfSkuYWRkQ2xhc3MoJ2NkbS1yZXBvcnRfX2NvbmZpZ3VyYXRpb24tdGFiLXBhbmVsJylcclxuICAgICAgLmR4VGFiUGFuZWwoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNlc3Npb25LZXkoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLlNUT1JBR0VfTU9ERV9LRVkgKyB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZDtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBmdW5jdGlvbiBpbml0UG9wb3ZlcihsaW5rOiBzdHJpbmcsIGRldGFpbHM6IHN0cmluZyk6IERldkV4cHJlc3MudWkuZHhQb3BvdmVyIHtcclxuICBjb25zdCBodG1sID0gJCgnPHAvPicpLmh0bWwoZGV0YWlscykudGV4dCgpO1xyXG5cclxuICBjb25zdCBwb3BvdmVyID0gJCgnPGRpdj4nLCB7IGNsYXNzOiAncmVwb3J0LWRldGFpbHMtcG9wb3ZlcicgfSlcclxuICAgIC5odG1sKGh0bWwpXHJcbiAgICAuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSk7XHJcblxyXG4gIHJldHVybiAkKHBvcG92ZXIpLmR4UG9wb3Zlcih7XHJcbiAgICB0YXJnZXQ6IGxpbmssXHJcbiAgICBzaG93RXZlbnQ6ICdkeGNsaWNrJyxcclxuICAgIHBvc2l0aW9uOiAnYm90dG9tJyxcclxuICAgIHdpZHRoOiA1MDBcclxuICB9KS5keFBvcG92ZXIoJ2luc3RhbmNlJyk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCBmdWxsU2NyZWVuIGZyb20gJy4uLy4uLy4uL1dpZGdldHMvRnVsbFNjcmVlbic7XHJcbmltcG9ydCB7Q1NTX0NMQVNTRVN9IGZyb20gJy4uLy4uLy4uL1N0eWxpbmcvSW5kZXgnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZEFkZGl0aW9uYWxPcHRpb25zIHtcclxuICBleHBvcnRGaWxlTmFtZT86IHN0cmluZztcclxuICBzdW1tYXJ5Q29sdW1uPzogc3RyaW5nO1xyXG4gIHNob3dTdW1tYXJ5SW5Db2x1bW4/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0RGF0YUdyaWQoXHJcbiAgJHRhcmdldCwgZGF0YUdyaWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9uczogSUdyaWRBZGRpdGlvbmFsT3B0aW9ucyA9IHt9LFxyXG4gIGhlYWRlclRleHQ/OiBzdHJpbmcsIGhlYWRlckRlc2NyaXB0aW9uPzogc3RyaW5nLCBkZWZhdWx0Q29sdW1uV2lkdGggPSBmYWxzZVxyXG4pOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gIGxldCBpc0dyaWRJbml0aWFsaXphZWQgPSBmYWxzZTtcclxuICBjb25zdCBkZWZhdWx0T3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyA9IHtcclxuICAgIGV4cG9ydDoge1xyXG4gICAgICBlbmFibGVkOiAhIWFkZGl0aW9uYWxPcHRpb25zLmV4cG9ydEZpbGVOYW1lLFxyXG4gICAgICBhbGxvd0V4cG9ydFNlbGVjdGVkRGF0YTogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHJlbW90ZU9wZXJhdGlvbnM6IHRydWUsXHJcblxyXG4gICAgY29sdW1uQXV0b1dpZHRoOiB0cnVlLFxyXG4gICAgc2hvd0JvcmRlcnM6IHRydWUsXHJcblxyXG4gICAgc2VsZWN0aW9uOiB7bW9kZTogJ211bHRpcGxlJ30sXHJcbiAgICBrZXlib2FyZE5hdmlnYXRpb246IHtlbmFibGVkOiBmYWxzZX0sXHJcbiAgICBwYWdpbmc6IHtwYWdlU2l6ZTogNTB9LFxyXG4gICAgc2VhcmNoUGFuZWw6IHt2aXNpYmxlOiB0cnVlfSxcclxuICAgIGZpbHRlclJvdzoge3Zpc2libGU6IHRydWV9LFxyXG4gICAgaGVhZGVyRmlsdGVyOiB7dmlzaWJsZTogdHJ1ZX0sXHJcbiAgICBzY3JvbGxpbmc6IHttb2RlOiAndmlydHVhbCd9LFxyXG4gICAgb25Db250ZW50UmVhZHk6IChlKSA9PiB7XHJcbiAgICAgIHVwZGF0ZVN1bW1hcnlDb2x1bW5JZlJlcXVpcmVkKGUuY29tcG9uZW50KTtcclxuXHJcbiAgICAgIGlmIChpc0dyaWRJbml0aWFsaXphZWQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlzR3JpZEluaXRpYWxpemFlZCA9IHRydWU7XHJcblxyXG4gICAgICBpZiAoIWRlZmF1bHRDb2x1bW5XaWR0aCkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZS5jb21wb25lbnQuY29sdW1uQ291bnQoKTsgaSsrKSB7XHJcbiAgICAgICAgICBjb25zdCBkYXRhVHlwZSA9IGUuY29tcG9uZW50LmNvbHVtbk9wdGlvbihpLCAnZGF0YVR5cGUnKTtcclxuXHJcbiAgICAgICAgICBpZiAoIWUuY29tcG9uZW50LmNvbHVtbk9wdGlvbihpLCAnd2lkdGgnKSkge1xyXG4gICAgICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdib29sZWFuJykge1xyXG4gICAgICAgICAgICAgIGUuY29tcG9uZW50LmNvbHVtbk9wdGlvbihpLCAnd2lkdGgnLCAnMTAwcHgnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdkYXRldGltZScpIHtcclxuICAgICAgICAgICAgICBlLmNvbXBvbmVudC5jb2x1bW5PcHRpb24oaSwgJ3dpZHRoJywgJzE1MHB4Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vdG8gZml4IGF1dG9zY3JvbGxcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsYWJsZSA9IGUuY29tcG9uZW50LmdldFNjcm9sbGFibGUoKTtcclxuXHJcbiAgICAgICAgaWYgKHNjcm9sbGFibGUpIHtcclxuICAgICAgICAgIHNjcm9sbGFibGUuc2Nyb2xsVG8oe3RvcDogMH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9LFxyXG4gICAgb25Ub29sYmFyUHJlcGFyaW5nOiAoZSkgPT4ge1xyXG4gICAgICBpZiAoaGVhZGVyVGV4dCkge1xyXG4gICAgICAgIGUudG9vbGJhck9wdGlvbnMuaXRlbXMudW5zaGlmdCh7XHJcbiAgICAgICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgICAgICB0ZW1wbGF0ZSgpIHtcclxuICAgICAgICAgICAgY29uc3QgaGVhZGVyRWwgPSAkKCc8aDIgLz4nKS5hZGRDbGFzcygnZ3JpZC1oZWFkZXInKS50ZXh0KGhlYWRlclRleHQpO1xyXG4gICAgICAgICAgICBpZiAoaGVhZGVyRGVzY3JpcHRpb24pIHtcclxuICAgICAgICAgICAgICBoZWFkZXJFbC5hcHBlbmQoJCgnPGkgLz4nKS5hZGRDbGFzcygnZmFzJykuYWRkQ2xhc3MoJ2ZhLWluZm8tY2lyY2xlJykuYWRkQ2xhc3MoJ3JlcG9ydC1kZXRhaWxzLWxpbmsnKS5hdHRyKCd0aXRsZScsICdDbGljayB0byBzZWUgZnVydGhlciBkZXRhaWxzJykpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gaGVhZGVyRWw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBvbkNvbnRlbnRSZWFkeSA9IGRhdGFHcmlkT3B0aW9ucy5vbkNvbnRlbnRSZWFkeVxyXG4gICAgPyAoZSkgPT4ge1xyXG4gICAgICBkZWZhdWx0T3B0aW9ucy5vbkNvbnRlbnRSZWFkeShlKTtcclxuICAgICAgZGF0YUdyaWRPcHRpb25zLm9uQ29udGVudFJlYWR5KGUpO1xyXG4gICAgfVxyXG4gICAgOiBkZWZhdWx0T3B0aW9ucy5vbkNvbnRlbnRSZWFkeTtcclxuXHJcbiAgdHJ5U2V0VG90YWxTdW1tYXJ5KGRhdGFHcmlkT3B0aW9ucywgYWRkaXRpb25hbE9wdGlvbnMpO1xyXG5cclxuICBjb25zdCBtZXJnZWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zID0gJC5leHRlbmQoe30sIGRlZmF1bHRPcHRpb25zLCBkYXRhR3JpZE9wdGlvbnMsIHtvbkNvbnRlbnRSZWFkeX0pO1xyXG5cclxuICBjb25zdCBncmlkID0gJHRhcmdldC5keERhdGFHcmlkKG1lcmdlZE9wdGlvbnMpLmR4RGF0YUdyaWQoJ2luc3RhbmNlJyk7XHJcblxyXG4gIGdyaWQuZWxlbWVudCgpLmFkZENsYXNzKENTU19DTEFTU0VTLmR4RGF0YUdyaWQpO1xyXG5cclxuICByZXR1cm4gZ3JpZDtcclxufVxyXG5cclxuZnVuY3Rpb24gdHJ5U2V0VG90YWxTdW1tYXJ5KGRhdGFHcmlkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucywgYWRkaXRpb25hbE9wdGlvbnM6IElHcmlkQWRkaXRpb25hbE9wdGlvbnMpIHtcclxuICBpZiAoZGF0YUdyaWRPcHRpb25zPy5zdW1tYXJ5Py50b3RhbEl0ZW1zPy5zb21lKChpKSA9PiBpLnN1bW1hcnlUeXBlID09PSAnY291bnQnKSkge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgbGV0IHN1bW1hcnlDb2x1bW4gPSBhZGRpdGlvbmFsT3B0aW9ucz8uc3VtbWFyeUNvbHVtbjtcclxuICBpZiAoIXN1bW1hcnlDb2x1bW4gJiYgZGF0YUdyaWRPcHRpb25zPy5jb2x1bW5zPy5sZW5ndGgpIHtcclxuICAgIHN1bW1hcnlDb2x1bW4gPSB0eXBlb2YgZGF0YUdyaWRPcHRpb25zLmNvbHVtbnNbMF0gPT09ICdzdHJpbmcnXHJcbiAgICAgID8gZGF0YUdyaWRPcHRpb25zLmNvbHVtbnNbMF1cclxuICAgICAgOiBkYXRhR3JpZE9wdGlvbnMuY29sdW1uc1swXS5kYXRhRmllbGQ7XHJcbiAgfVxyXG5cclxuICBpZiAoc3VtbWFyeUNvbHVtbikge1xyXG4gICAgaWYgKCFkYXRhR3JpZE9wdGlvbnMuc3VtbWFyeSkge1xyXG4gICAgICBkYXRhR3JpZE9wdGlvbnMuc3VtbWFyeSA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZGF0YUdyaWRPcHRpb25zLnN1bW1hcnkudG90YWxJdGVtcykge1xyXG4gICAgICBkYXRhR3JpZE9wdGlvbnMuc3VtbWFyeS50b3RhbEl0ZW1zID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgZGF0YUdyaWRPcHRpb25zLnN1bW1hcnkudG90YWxJdGVtcy5wdXNoKHtcclxuICAgICAgY29sdW1uOiBzdW1tYXJ5Q29sdW1uLFxyXG4gICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVTdW1tYXJ5Q29sdW1uSWZSZXF1aXJlZChncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQpIHtcclxuICBjb25zdCB0b3RhbEl0ZW1zID0gZ3JpZC5vcHRpb24oJ3N1bW1hcnkudG90YWxJdGVtcycpIGFzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnNbJ3N1bW1hcnknXVsndG90YWxJdGVtcyddO1xyXG4gIGNvbnN0IGN1cnJlbnRTdW1tYXJ5Q29sdW1uID0gdG90YWxJdGVtcz8uZmlsdGVyKChpKSA9PiBpLnN1bW1hcnlUeXBlID09PSAnY291bnQnKVswXT8uY29sdW1uO1xyXG5cclxuICBsZXQgc3VtbWFyeUNvbHVtbkluZGV4ID0gY3VycmVudFN1bW1hcnlDb2x1bW4gJiYgZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpLmZpbmRJbmRleCgoZWwpID0+IGVsLmRhdGFGaWVsZCA9PT0gY3VycmVudFN1bW1hcnlDb2x1bW4pO1xyXG4gIGlmICghc3VtbWFyeUNvbHVtbkluZGV4KSB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBncmlkLm9wdGlvbignc2VsZWN0aW9uJyk7XHJcbiAgICBjb25zdCBoYXNTZWxlY3Rpb24gPSBzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLm1vZGUgIT09ICdub25lJztcclxuICAgIHN1bW1hcnlDb2x1bW5JbmRleCA9IGhhc1NlbGVjdGlvbiA/IGdyaWQuZ2V0VmlzaWJsZUNvbHVtbnMoKS5maW5kSW5kZXgoKGVsKSA9PiAhIWVsLmRhdGFGaWVsZCkgOiAwO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgbmV3U3VtbWFyeUNvbHVtbiA9IGdyaWQuZ2V0VmlzaWJsZUNvbHVtbnMoKVtzdW1tYXJ5Q29sdW1uSW5kZXhdPy5kYXRhRmllbGQ7XHJcblxyXG4gIGlmIChuZXdTdW1tYXJ5Q29sdW1uICYmIGN1cnJlbnRTdW1tYXJ5Q29sdW1uICE9PSBuZXdTdW1tYXJ5Q29sdW1uKSB7XHJcbiAgICBncmlkLm9wdGlvbignc3VtbWFyeScsIHtcclxuICAgICAgdG90YWxJdGVtczogW3tcclxuICAgICAgICBjb2x1bW46IGdyaWQuZ2V0VmlzaWJsZUNvbHVtbnMoKVtzdW1tYXJ5Q29sdW1uSW5kZXhdPy5kYXRhRmllbGQsXHJcbiAgICAgICAgc3VtbWFyeVR5cGU6ICdjb3VudCdcclxuICAgICAgfV1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZ1bGxTY3JlZW5EYXRhR3JpZChcclxuICAkdGFyZ2V0LCBkYXRhR3JpZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMsIGFkZGl0aW9uYWxPcHRpb25zOiBJR3JpZEFkZGl0aW9uYWxPcHRpb25zID0ge30sXHJcbiAgaGVhZGVyVGV4dD86IHN0cmluZywgaGVhZGVyRGVzY3JpcHRpb24/OiBzdHJpbmcsIGRlZmF1bHRDb2x1bW5XaWR0aCA9IGZhbHNlLCBza2lwRnVsbFNjcmVlbiA9IGZhbHNlXHJcbik6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgY29uc3QgZ3JpZCA9IGNyZWF0ZURlZmF1bHREYXRhR3JpZCgkdGFyZ2V0LCBkYXRhR3JpZE9wdGlvbnMsIGFkZGl0aW9uYWxPcHRpb25zLCBoZWFkZXJUZXh0LCBoZWFkZXJEZXNjcmlwdGlvbiwgZGVmYXVsdENvbHVtbldpZHRoKTtcclxuXHJcbiAgaWYgKCFza2lwRnVsbFNjcmVlbikge1xyXG4gICAgZnVsbFNjcmVlbihncmlkKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBncmlkO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKHRleHQsIHRpdGxlKSB7XHJcbiAgcmV0dXJuICQoJzxzcGFuPicpXHJcbiAgICAuYXR0cigndGl0bGUnLCB0aXRsZSlcclxuICAgIC50ZXh0KHRleHQpO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBjcmVhdGVEeERhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi8uLi9EYXRhL0R4RGF0YVNvdXJjZSc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHsgY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkLCBjcmVhdGVIZWFkZXJDZWxsVGVtcGxhdGUgfSBmcm9tICcuLi9HcmlkL0NyZWF0ZURlZmF1bHRHcmlkJztcclxuaW1wb3J0IGNyZWF0ZURlZmF1bHRHcmlkIGZyb20gJy4uLy4uLy4uL1dpZGdldHMvR3JpZC9EZWZhdWx0R3JpZCc7XHJcbmltcG9ydCB7SUxvb2t1cER0b30gZnJvbSAnLi4vLi4vLi4vRGF0YS9BcGlSZXNwb25zZSc7XHJcblxyXG4vLyBOT1RFOiBjb25zdCBkZWZhdWx0U2hvd2VkUm9sZXMgPSBbJ1Byb2R1Y3Rpb24nLCAnU2FsZXMnLCAnRmxvb3InXTtcclxuY29uc3Qgcm9sZXNPcmRlciA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XHJcblxyXG5leHBvcnQgY29uc3QgZW51bSBEaXNwbGF5VHlwZSB7XHJcbiAgSWNvbnMgPSAxLFxyXG4gIFByZWRlZmluZWRWYWx1ZXMgPSAyLFxyXG4gIFJhYmJpdEFjdGlvbiA9IDNcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtIHtcclxuICB2YWx1ZTogc3RyaW5nO1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgaW1hZ2U6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUHJlZGVmaW5lZFZhbHVlc0VkaXRvckl0ZW0ge1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVJhYmJpdEFjdGlvbkVkaXRvckRhdGEge1xyXG4gIGFjdGlvblR5cGU6IHN0cmluZztcclxuICBmaWVsZHM6IHN0cmluZ1tdO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBJRGlzcGxheVR5cGVTZXR0aW5ncyA9IElEaXNwbGF5SWNvbnNUeXBlU2V0dGluZ3MgfCBJRGlzcGxheUlQcmVkZWZpbmVkVmFsdWVzVHlwZVNldHRpbmdzIHwgSURpc3BsYXlJUmFiYml0QWN0aW9uVHlwZVNldHRpbmdzO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGlzcGxheUljb25zVHlwZVNldHRpbmdzIHtcclxuICB0eXBlOiBEaXNwbGF5VHlwZS5JY29ucztcclxuICBkYXRhOiBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtW107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSURpc3BsYXlJUHJlZGVmaW5lZFZhbHVlc1R5cGVTZXR0aW5ncyB7XHJcbiAgdHlwZTogRGlzcGxheVR5cGUuUHJlZGVmaW5lZFZhbHVlcztcclxuICBkYXRhOiBJUHJlZGVmaW5lZFZhbHVlc0VkaXRvckl0ZW1bXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGlzcGxheUlSYWJiaXRBY3Rpb25UeXBlU2V0dGluZ3Mge1xyXG4gIHR5cGU6IERpc3BsYXlUeXBlLlJhYmJpdEFjdGlvbjtcclxuICBkYXRhOiBJUmFiYml0QWN0aW9uRWRpdG9yRGF0YTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbENvbmZpZ3VyYXRvck9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICBpc1N0YW5kYWxvbmVQYWdlOiBib29sZWFuO1xyXG4gIHBhZ2VUaXRsZTogc3RyaW5nO1xyXG4gIGF2YWlsYWJsZVJvbGVzVXJsOiBzdHJpbmc7XHJcbiAgZ3JvdXBGaWVsZHNVcmw6IHN0cmluZztcclxuICBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIElSYWJiaXRBY3Rpb25FZGl0b3JJbml0RGF0YSB7XHJcbiAgZmllbGRzOiBJTG9va3VwRHRvPHN0cmluZz5bXTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIENvbnRyb2xDb25maWd1cmF0b3Ige1xyXG4gIHB1YmxpYyByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpc1N0YW5kYWxvbmVQYWdlOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFnZVRpdGxlOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhdmFpbGFibGVSb2xlc1VybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JvdXBGaWVsZHNVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGxheVR5cGVzOiBhbnlbXSA9IFtcclxuICAgIHsga2V5OiBEaXNwbGF5VHlwZS5JY29ucywgdmFsdWU6ICdJY29ucycgfSxcclxuICAgIHsga2V5OiBEaXNwbGF5VHlwZS5QcmVkZWZpbmVkVmFsdWVzLCB2YWx1ZTogJ1ByZWRlZmluZWRWYWx1ZXMnIH0sXHJcbiAgICB7IGtleTogRGlzcGxheVR5cGUuUmFiYml0QWN0aW9uLCB2YWx1ZTogJ1JhYmJpdEFjdGlvbicgfVxyXG4gIF07XHJcbiAgcHJpdmF0ZSByZWFkb25seSBlZGl0b3JzID0ge1xyXG4gICAgW0Rpc3BsYXlUeXBlLkljb25zXTogSWNvbnNDb2x1bW5FZGl0b3IsXHJcbiAgICBbRGlzcGxheVR5cGUuUHJlZGVmaW5lZFZhbHVlc106IFByZWRlZmluZWRWYWx1ZXNDb2x1bW5FZGl0b3IsXHJcbiAgICBbRGlzcGxheVR5cGUuUmFiYml0QWN0aW9uXTogUmFiYml0QWN0aW9uQ29sdW1uRWRpdG9yLFxyXG4gIH07XHJcbiAgcHJpdmF0ZSByZWFkb25seSBlZGl0b3JzSW5pdERhdGEgOiB7W2lkOiBudW1iZXJdIDogb2JqZWN0O30gPSB7fTtcclxuICBwcml2YXRlIHJvbGVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHByaXZhdGUgZmllbGRzOiBJTG9va3VwRHRvPHN0cmluZz5bXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJQ29udHJvbENvbmZpZ3VyYXRvck9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuaXNTdGFuZGFsb25lUGFnZSA9IG9wdGlvbnMuaXNTdGFuZGFsb25lUGFnZTtcclxuICAgIHRoaXMuYXZhaWxhYmxlUm9sZXNVcmwgPSBvcHRpb25zLmF2YWlsYWJsZVJvbGVzVXJsO1xyXG4gICAgdGhpcy5ncm91cEZpZWxkc1VybCA9IG9wdGlvbnMuZ3JvdXBGaWVsZHNVcmw7XHJcbiAgICB0aGlzLmxvYWREYXRhVXJsID0gb3B0aW9ucy5sb2FkRGF0YVVybDtcclxuICAgIHRoaXMudXBkYXRlRGF0YVVybCA9IG9wdGlvbnMudXBkYXRlRGF0YVVybDtcclxuICAgIHRoaXMucGFnZVRpdGxlID0gb3B0aW9ucy5wYWdlVGl0bGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgdGhpcy4kY29udGFpbmVyLmFkZENsYXNzKCdhcHMtZ3JpZCcpO1xyXG5cclxuICAgIFByb21pc2UuYWxsKFtcclxuICAgICAgdGhpcy5nZXRBdmFpbGFibGVSb2xlcygpLFxyXG4gICAgICB0aGlzLmdldEF2YWlsYWJsZUZpZWxkcygpXHJcbiAgICBdKS50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgdGhpcy5yb2xlcyA9IHJlc3VsdFswXTtcclxuICAgICAgdGhpcy5maWVsZHMgPSByZXN1bHRbMV07XHJcbiAgICAgIHRoaXMuZWRpdG9yc0luaXREYXRhW0Rpc3BsYXlUeXBlLlJhYmJpdEFjdGlvbl0gPSB7IGZpZWxkczogdGhpcy5maWVsZHMgfTtcclxuICAgICAgdGhpcy5jcmVhdGVNYWluR3JpZCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldEF2YWlsYWJsZVJvbGVzKCkge1xyXG4gICAgcmV0dXJuIHNlbmRSZXF1ZXN0PEFycmF5PHsgTmFtZTogc3RyaW5nIH0+Pih0aGlzLmF2YWlsYWJsZVJvbGVzVXJsKVxyXG4gICAgICAudGhlbigocmVzKSA9PiByZXMubWFwKChyKSA9PiByLk5hbWUpLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICBjb25zdCBhT3JkZXIgPSByb2xlc09yZGVyLmdldChhKSB8fCA5OTk5O1xyXG4gICAgICAgIGNvbnN0IGJPcmRlciA9IHJvbGVzT3JkZXIuZ2V0KGIpIHx8IDk5OTk7XHJcblxyXG4gICAgICAgIHJldHVybiBhT3JkZXIgLSBiT3JkZXI7XHJcbiAgICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0QXZhaWxhYmxlRmllbGRzKCk6IFByb21pc2U8SUxvb2t1cER0bzxzdHJpbmc+W10+IHtcclxuICAgIHJldHVybiBzZW5kUmVxdWVzdCh0aGlzLmdyb3VwRmllbGRzVXJsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RGlzcGxheVR5cGVFZGl0b3IoJGNvbnRhaW5lciwgdHlwZSwgZGF0YSkge1xyXG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3JzW3R5cGVdO1xyXG4gICAgY29uc3QgaW5pdERhdGEgPSB0aGlzLmVkaXRvcnNJbml0RGF0YVt0eXBlXTtcclxuXHJcbiAgICByZXR1cm4gZWRpdG9yXHJcbiAgICAgID8gbmV3IGVkaXRvcigkY29udGFpbmVyLCBkYXRhLCBpbml0RGF0YSlcclxuICAgICAgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVNYWluR3JpZCgpIHtcclxuICAgIGxldCBncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XHJcblxyXG4gICAgY29uc3QgZ3JpZE9wdGlvbnMgPSB7XHJcbiAgICAgIGRhdGFTb3VyY2U6IHRoaXMuY3JlYXRlTWFpbkdyaWREYXRhU291cmNlKCksXHJcbiAgICAgIGNvbHVtbkNob29zZXI6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGFsbG93U2VhcmNoOiB0cnVlLFxyXG4gICAgICAgIG1vZGU6ICdzZWxlY3QnXHJcbiAgICAgIH0sXHJcbiAgICAgIGhlaWdodDogJzEwMCUnLFxyXG4gICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgbW9kZTogJ2NlbGwnLFxyXG4gICAgICAgIGFsbG93VXBkYXRpbmc6IHRydWUsXHJcbiAgICAgICAgcmVmcmVzaE1vZGU6ICdyZXBhaW50J1xyXG4gICAgICB9LFxyXG4gICAgICByZXBhaW50Q2hhbmdlc09ubHk6IHRydWUsXHJcbiAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IHtcclxuICAgICAgICBzdW1tYXJ5OiB0cnVlLFxyXG4gICAgICAgIHBhZ2luZzogdHJ1ZSxcclxuICAgICAgICBncm91cGluZzogZmFsc2UsXHJcbiAgICAgICAgc29ydGluZzogZmFsc2UsXHJcbiAgICAgICAgZmlsdGVyaW5nOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBncm91cGluZzoge1xyXG4gICAgICAgIGFsbG93Q29sbGFwc2luZzogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgZ3JvdXBQYW5lbDoge1xyXG4gICAgICAgIHZpc2libGU6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIHNlbGVjdGlvbjoge1xyXG4gICAgICAgIG1vZGU6ICdtdWx0aXBsZSdcclxuICAgICAgfSxcclxuICAgICAgYWxsb3dDb2x1bW5SZW9yZGVyaW5nOiBmYWxzZSxcclxuICAgICAgY29sdW1uSGlkaW5nRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICBjb2x1bW5BdXRvV2lkdGg6IGZhbHNlLFxyXG4gICAgICByb3dBbHRlcm5hdGlvbkVuYWJsZWQ6IHRydWUsXHJcbiAgICAgIGNvbHVtbk1pbldpZHRoOiA4MCxcclxuICAgICAgb25Sb3dVcGRhdGluZzogKGUpID0+IHtcclxuICAgICAgICBpZiAoIWUubmV3RGF0YSB8fCAhZS5vbGREYXRhKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlLmNvbXBvbmVudC5iZWdpbkN1c3RvbUxvYWRpbmcoJ1VwZGF0aW5nJyk7XHJcblxyXG4gICAgICAgIGNvbnN0IHVwZGF0ZWRSb2xlcyA9IGUubmV3RGF0YS5Sb2xlcztcclxuICAgICAgICBjb25zdCBjdXJyZW50Um9sZXMgPSBlLm9sZERhdGEuUm9sZXM7XHJcblxyXG4gICAgICAgIGNvbnN0IGFkZE9sZERhdGFUb05ld0RhdGEgPSAoZmllbGROYW1lOiBzdHJpbmcsIG5ld0RhdGFTZWN0aW9uID0gZS5uZXdEYXRhLCBvbGREYXRhU2VjdGlvbiA9IGUub2xkRGF0YSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFuZXdEYXRhU2VjdGlvbi5oYXNPd25Qcm9wZXJ0eShmaWVsZE5hbWUpKSB7XHJcbiAgICAgICAgICAgIG5ld0RhdGFTZWN0aW9uW2ZpZWxkTmFtZV0gPSBvbGREYXRhU2VjdGlvbltmaWVsZE5hbWVdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmICh1cGRhdGVkUm9sZXMgJiYgY3VycmVudFJvbGVzKSB7XHJcbiAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh1cGRhdGVkUm9sZXMpXHJcbiAgICAgICAgICAgIC5mb3JFYWNoKChyb2xlTmFtZSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRSb2xlID0gdXBkYXRlZFJvbGVzW3JvbGVOYW1lXTtcclxuICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Um9sZSA9IGN1cnJlbnRSb2xlc1tyb2xlTmFtZV07XHJcblxyXG4gICAgICAgICAgICAgIHVwZGF0ZWRSb2xlLklkID0gY3VycmVudFJvbGUuSWQ7XHJcblxyXG4gICAgICAgICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0NhbkJlQ3JlYXRlZCcsIHVwZGF0ZWRSb2xlLCBjdXJyZW50Um9sZSk7XHJcbiAgICAgICAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnQ2FuQmVSZWFkJywgdXBkYXRlZFJvbGUsIGN1cnJlbnRSb2xlKTtcclxuICAgICAgICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdDYW5CZVVwZGF0ZWQnLCB1cGRhdGVkUm9sZSwgY3VycmVudFJvbGUpO1xyXG4gICAgICAgICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0NhbkJlRGVsZXRlZCcsIHVwZGF0ZWRSb2xlLCBjdXJyZW50Um9sZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnTGFiZWwnKTtcclxuICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdPcmRlcicpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ1Rvb2xUaXAnKTtcclxuICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdJc0RlZmF1bHRWaWV3RmllbGQnKTtcclxuICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdJc0tleUNvbHVtbicpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0dyb3VwRmllbGQnKTtcclxuICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdEaXNwbGF5VHlwZScpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0RhdGFPd25lcicpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ1hMU1NjaGVkdWxlTGFiZWwnKTtcclxuICAgICAgfSxcclxuICAgICAgb25Sb3dVcGRhdGVkOiAoZSkgPT4ge1xyXG4gICAgICAgIGUuY29tcG9uZW50LmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuICAgICAgICBlLmNvbXBvbmVudC5yZXBhaW50KCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbHVtbnM6IHRoaXMucHJlcGFyZU1haW5HcmlkQ29sdW1ucyhbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnTmFtZScsXHJcbiAgICAgICAgICBjYXB0aW9uOiAnRmllbGQnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiBmYWxzZSxcclxuICAgICAgICAgIGZpeGVkOiB0cnVlLFxyXG4gICAgICAgICAgZml4ZWRQb3NpdGlvbjogJ2xlZnQnLFxyXG4gICAgICAgICAgc29ydE9yZGVyOiAnYXNjJyxcclxuICAgICAgICAgIHdpZHRoOiAxODAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdHcm91cEZpZWxkJyxcclxuICAgICAgICAgIGNhcHRpb246ICdHcm91cCcsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICB3aWR0aDogMjAwLFxyXG4gICAgICAgICAgZWRpdENlbGxUZW1wbGF0ZTogKF8sIGNlbGxJbmZvKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAkKCc8ZGl2IC8+JykuZHhTZWxlY3RCb3goe1xyXG4gICAgICAgICAgICAgIHZhbHVlOiBjZWxsSW5mby52YWx1ZSxcclxuICAgICAgICAgICAgICBkYXRhU291cmNlOiBbLi4ubmV3IFNldChncmlkLmdldERhdGFTb3VyY2UoKS5pdGVtcygpLmZpbHRlcigoaSkgPT4gaS5Hcm91cEZpZWxkKS5tYXAoKGkpID0+IGkuR3JvdXBGaWVsZCkuc29ydCgpKV0sXHJcbiAgICAgICAgICAgICAgYWNjZXB0Q3VzdG9tVmFsdWU6IHRydWUsXHJcbiAgICAgICAgICAgICAgc2hvd0NsZWFyQnV0dG9uOiB0cnVlLFxyXG4gICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2VsbEluZm8uc2V0VmFsdWUoZS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ0xhYmVsJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIHdpZHRoOiAxODAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdUeXBlJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogZmFsc2UsXHJcbiAgICAgICAgICB3aWR0aDogODAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdEYXRhT3duZXInLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgd2lkdGg6IDgwLFxyXG4gICAgICAgICAgaGVhZGVyQ2VsbFRlbXBsYXRlOiBjcmVhdGVIZWFkZXJDZWxsVGVtcGxhdGUoJ0RPJywgJ0RhdGEgT3duZXInKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnWExTU2NoZWR1bGVMYWJlbCcsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICB3aWR0aDogODAsXHJcbiAgICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSgnWExTJywgJ1hMUyBTY2hlZHVsZSBMYWJlbCcpXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdEaXNwbGF5VHlwZScsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICB3aWR0aDogMTYwLFxyXG4gICAgICAgICAgY3VzdG9taXplVGV4dDogKGNlbGxJbmZvKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghY2VsbEluZm8udmFsdWUpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGNlbGxJbmZvLnZhbHVlIGFzIHN0cmluZyk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmRpc3BsYXlUeXBlc1xyXG4gICAgICAgICAgICAgIC5maW5kKChpdGVtKSA9PiBpdGVtLmtleSA9PT0gc2V0dGluZ3MudHlwZSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVkaXRDZWxsVGVtcGxhdGU6IChfLCBjZWxsSW5mbykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoY2VsbEluZm8udmFsdWUpO1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gc2V0dGluZ3MgPyBzZXR0aW5ncy50eXBlIDogbnVsbDtcclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHNldHRpbmdzID8gc2V0dGluZ3MuZGF0YSA6IFtdO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuICQoJzxkaXYgLz4nKS5keERyb3BEb3duQm94KHtcclxuICAgICAgICAgICAgICBkcm9wRG93bk9wdGlvbnM6IHsgd2lkdGg6IDQwMCB9LFxyXG4gICAgICAgICAgICAgIGRhdGFTb3VyY2U6IHRoaXMuZGlzcGxheVR5cGVzLFxyXG4gICAgICAgICAgICAgIHZhbHVlRXhwcjogJ2tleScsXHJcbiAgICAgICAgICAgICAgZGlzcGxheUV4cHI6ICd2YWx1ZScsXHJcbiAgICAgICAgICAgICAgdmFsdWU6IHR5cGUsXHJcbiAgICAgICAgICAgICAgc2hvd0NsZWFyQnV0dG9uOiB0cnVlLFxyXG4gICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2VsbEluZm8uc2V0VmFsdWUoZS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBjb250ZW50VGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICRjb250YWl0ZXIgPSAkKCc8ZGl2IC8+Jyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCAkc2VsZWN0b3IgPSAkKCc8ZGl2IC8+JykuYXBwZW5kVG8oJGNvbnRhaXRlcik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCAkYm9keSA9ICQoJzxkaXYgc3R5bGU9XCJtYXJnaW46IDhweCAwO1wiIC8+JykuYXBwZW5kVG8oJGNvbnRhaXRlcik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCAkYnV0dG9ucyA9ICQoJzxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOiByaWdodDtcIiAvPicpLmFwcGVuZFRvKCRjb250YWl0ZXIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgJHNhdmVCdXR0b24gPSAkKCc8ZGl2IHN0eWxlPVwibWFyZ2luLXJpZ2h0OiA4cHg7XCIgLz4nKS5hcHBlbmRUbygkYnV0dG9ucyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCAkY2FuY2VsQnV0dG9uID0gJCgnPGRpdiBzdHlsZT1cIm1hcmdpbi1yaWdodDogOHB4O1wiIC8+JykuYXBwZW5kVG8oJGJ1dHRvbnMpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBlZGl0b3IgPSB0eXBlXHJcbiAgICAgICAgICAgICAgICAgID8gdGhpcy5nZXREaXNwbGF5VHlwZUVkaXRvcigkYm9keSwgdHlwZSwgZGF0YSlcclxuICAgICAgICAgICAgICAgICAgOiBudWxsO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlZGl0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgJGJvZHkuaHRtbCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgIGVkaXRvci5yZW5kZXIoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAkc2VsZWN0b3IuZHhTZWxlY3RCb3goe1xyXG4gICAgICAgICAgICAgICAgICBpdGVtczogdGhpcy5kaXNwbGF5VHlwZXMsXHJcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiB0eXBlLFxyXG4gICAgICAgICAgICAgICAgICB2YWx1ZUV4cHI6ICdrZXknLFxyXG4gICAgICAgICAgICAgICAgICBkaXNwbGF5RXhwcjogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdG9yID0gdGhpcy5nZXREaXNwbGF5VHlwZUVkaXRvcigkYm9keSwgZS52YWx1ZSwgZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgJGJvZHkuaHRtbCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnJlbmRlcigpO1xyXG4gICAgICAgICAgICAgICAgICAgICRzYXZlQnV0dG9uLmR4QnV0dG9uKCdpbnN0YW5jZScpLm9wdGlvbignZGlzYWJsZWQnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICRzYXZlQnV0dG9uLmR4QnV0dG9uKHtcclxuICAgICAgICAgICAgICAgICAgdGV4dDogJ1NhdmUnLFxyXG4gICAgICAgICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsXHJcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhZWRpdG9yLFxyXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWRpdG9yRGF0YSA9IGVkaXRvci5nZXREYXRhKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZWRpdG9yRGF0YSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1NldHRpbmdzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogJHNlbGVjdG9yLmR4U2VsZWN0Qm94KCdpbnN0YW5jZScpLm9wdGlvbigndmFsdWUnKSxcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGVkaXRvckRhdGFcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjZWxsSW5mby5zZXRWYWx1ZShKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncykpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxJbmZvLmNvbXBvbmVudC5jbG9zZUVkaXRDZWxsKCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pLmFwcGVuZFRvKCRidXR0b25zKTtcclxuXHJcbiAgICAgICAgICAgICAgICAkY2FuY2VsQnV0dG9uLmR4QnV0dG9uKHtcclxuICAgICAgICAgICAgICAgICAgdGV4dDogJ0NhbmNlbCcsXHJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjZWxsSW5mby5jb21wb25lbnQuY2xvc2VFZGl0Q2VsbCgpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KS5hcHBlbmRUbygkYnV0dG9ucyk7XHJcblxyXG4gICAgICAgICAgICAgICAgJGNvbnRhaXRlci5keFNjcm9sbFZpZXcoe1xyXG4gICAgICAgICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxyXG4gICAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxMDAlJ1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICRjb250YWl0ZXI7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ0lzRGVmYXVsdFZpZXdGaWVsZCcsXHJcbiAgICAgICAgICBjYXB0aW9uOiAnRGlzcGxheSBpbiBkZWZhdWx0IHZpZXcnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgd2lkdGg6IDEwMCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ0lzS2V5Q29sdW1uJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIHdpZHRoOiAxNTAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdPcmRlcicsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7IGZvcm1hdDogJyMnIH0sXHJcbiAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHR5cGU6ICdyYW5nZScsXHJcbiAgICAgICAgICAgICAgbWluOiAwLFxyXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdPcmRlciBjYW5cXCd0IGJlIG5lZ2F0aXZlJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgICAgd2lkdGg6IDgwLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnV2lkdGgnLFxyXG4gICAgICAgICAgZGF0YVR5cGU6ICdudW1iZXInLFxyXG4gICAgICAgICAgaGVhZGVyQ2VsbFRlbXBsYXRlOiBjcmVhdGVIZWFkZXJDZWxsVGVtcGxhdGUoJ1dpZHRoJywgJ1dpZHRoIChpbiBwaXhlbHMpJyksXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7IGZvcm1hdDogJyMnIH0sXHJcbiAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHR5cGU6ICdyYW5nZScsXHJcbiAgICAgICAgICAgICAgbWluOiAxLFxyXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdXaWR0aCBjYW5cXCd0IGJlIGxlc3MgdGhlbiAxcHgnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgICB3aWR0aDogODAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdIaWRpbmdPcmRlcicsXHJcbiAgICAgICAgICBkYXRhVHlwZTogJ251bWJlcicsXHJcbiAgICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSgnSGlkZScsICdIaWRpbmcgT3JkZXInKSxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHsgZm9ybWF0OiAnIycgfSxcclxuICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogJ3JhbmdlJyxcclxuICAgICAgICAgICAgICBtaW46IDEsXHJcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ0hpZGluZyBvcmRlciBjYW5cXCd0IGJlIGxlc3MgdGhlbiAxJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgICAgd2lkdGg6IDcwLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnVG9vbFRpcCcsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICBtaW5XaWR0aDogMTgwXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAnUm9sZXMnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgYWxsb3dIaWRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgc2hvd0luQ29sdW1uQ2hvb3NlcjogdHJ1ZSxcclxuICAgICAgICAgIGNvbHVtbnM6IHRoaXMuY3JlYXRlUm9sZXNDb2x1bW5zKHRoaXMucm9sZXMpXHJcbiAgICAgICAgfVxyXG4gICAgICBdKSxcclxuICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucztcclxuXHJcbiAgICBjb25zdCBhZGRpdGlvbmFsT3B0aW9ucyA9IHtcclxuICAgICAgc3VtbWFyeUNvbHVtbjogJ05hbWUnXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh0aGlzLmlzU3RhbmRhbG9uZVBhZ2UpIHtcclxuICAgICAgZ3JpZCA9IGNyZWF0ZUZ1bGxTY3JlZW5EYXRhR3JpZCh0aGlzLiRjb250YWluZXIsIGdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9ucywgdGhpcy5wYWdlVGl0bGUsICcnLCB0cnVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGdyaWQgPSBjcmVhdGVEZWZhdWx0R3JpZCh0aGlzLiRjb250YWluZXIsIHtcclxuICAgICAgICBvcHRpb25zOiBncmlkT3B0aW9ucyxcclxuICAgICAgICBzdW1tYXJ5Q29sdW1uOiBhZGRpdGlvbmFsT3B0aW9ucy5zdW1tYXJ5Q29sdW1uLFxyXG4gICAgICAgIHRpdGxlOiB0aGlzLnBhZ2VUaXRsZSxcclxuICAgICAgICBpc0Z1bGxTY3JlZW46IGZhbHNlLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZ3JpZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlcGFyZU1haW5HcmlkQ29sdW1ucyhjb2x1bW5zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW5bXSkge1xyXG4gICAgY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgaWYgKGNvbHVtbi5hbGxvd0hpZGluZyA9PT0gdW5kZWZpbmVkIHx8IGNvbHVtbi5hbGxvd0hpZGluZyA9PT0gbnVsbCkge1xyXG4gICAgICAgIGNvbHVtbi5hbGxvd0hpZGluZyA9IGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY29sdW1uLnNob3dJbkNvbHVtbkNob29zZXIgPT09IHVuZGVmaW5lZCB8fCBjb2x1bW4uc2hvd0luQ29sdW1uQ2hvb3NlciA9PT0gbnVsbCkge1xyXG4gICAgICAgIGNvbHVtbi5zaG93SW5Db2x1bW5DaG9vc2VyID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBjb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVSb2xlc0NvbHVtbnMocm9sZXM6IHN0cmluZ1tdKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uW10ge1xyXG4gICAgcmV0dXJuIHJvbGVzXHJcbiAgICAgIC5tYXAoKHJvbGUpID0+ICh7XHJcbiAgICAgICAgbmFtZTogcm9sZSxcclxuICAgICAgICBjYXB0aW9uOiByb2xlLFxyXG4gICAgICAgIGFsbG93SGlkaW5nOiB0cnVlLFxyXG4gICAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgICAgc2hvd0luQ29sdW1uQ2hvb3NlcjogdHJ1ZSxcclxuICAgICAgICBjb2x1bW5zOiBbXHJcbiAgICAgICAgICB0aGlzLmNyZWF0ZVJvbGVzUGVybWlzc2lvbkNvbHVtbihyb2xlLCAnQ2FuQmVSZWFkJywge1xyXG4gICAgICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSgnUmVhZCcsICdSZWFkJylcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgdGhpcy5jcmVhdGVSb2xlc1Blcm1pc3Npb25Db2x1bW4ocm9sZSwgJ0NhbkJlVXBkYXRlZCcsIHtcclxuICAgICAgICAgICAgaGVhZGVyQ2VsbFRlbXBsYXRlOiBjcmVhdGVIZWFkZXJDZWxsVGVtcGxhdGUoJ0VkaXQnLCAnRWRpdCcpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIF1cclxuICAgICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVSb2xlc1Blcm1pc3Npb25Db2x1bW4oXHJcbiAgICByb2xlOiBzdHJpbmcsIHBlcm1pc3Npb25OYW1lOiBzdHJpbmcsIGJhc2VDb2x1bW5PcHRpb25zPzogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uXHJcbiAgKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIC4uLmJhc2VDb2x1bW5PcHRpb25zLFxyXG4gICAgICBuYW1lOiBgJHtyb2xlfV8ke3Blcm1pc3Npb25OYW1lfWAsXHJcbiAgICAgIGRhdGFGaWVsZDogYFJvbGVzLiR7cm9sZX0uJHtwZXJtaXNzaW9uTmFtZX1gLFxyXG4gICAgICBhbGxvd0hpZGluZzogZmFsc2UsXHJcbiAgICAgIHNob3dJbkNvbHVtbkNob29zZXI6IGZhbHNlLFxyXG4gICAgICBhbGxvd0hlYWRlckZpbHRlcmluZzogZmFsc2UsXHJcbiAgICAgIGFsbG93RmlsdGVyaW5nOiBmYWxzZSxcclxuICAgICAgbWluV2lkdGg6IDYwXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVNYWluR3JpZERhdGFTb3VyY2UoKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snZGF0YVNvdXJjZSddIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHN0b3JlOiBjcmVhdGVEeERhdGFTb3VyY2Uoe1xyXG4gICAgICAgIGxvYWRVcmw6IHRoaXMubG9hZERhdGFVcmwsXHJcbiAgICAgICAgdXBkYXRlVXJsOiB0aGlzLnVwZGF0ZURhdGFVcmwsXHJcbiAgICAgICAga2V5OiAnTmFtZScsXHJcbiAgICAgIH0pXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG5cclxuY2xhc3MgSWNvbnNDb2x1bW5FZGl0b3Ige1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YTogSUljb25zQ29sdW1uRWRpdG9ySXRlbVtdO1xyXG4gIHByaXZhdGUgZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG5cclxuICBjb25zdHJ1Y3RvcigkY29udGFpbmVyOiBKUXVlcnksIGRhdGE6IElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXSkge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgY29uc3Qgb3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXMgPSB7XHJcbiAgICAgIGRhdGFTb3VyY2U6IHRoaXMuZGF0YSxcclxuICAgICAgZWRpdGluZzoge1xyXG4gICAgICAgIG1vZGU6ICdyb3cnLFxyXG4gICAgICAgIGFsbG93QWRkaW5nOiB0cnVlLFxyXG4gICAgICAgIGFsbG93RGVsZXRpbmc6IHRydWUsXHJcbiAgICAgICAgYWxsb3dVcGRhdGluZzogdHJ1ZSxcclxuICAgICAgICB1c2VJY29uczogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBoZWFkZXJGaWx0ZXI6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgZ3JvdXBpbmc6IHsgY29udGV4dE1lbnVFbmFibGVkOiBmYWxzZSB9LFxyXG4gICAgICBncm91cFBhbmVsOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIHNlYXJjaFBhbmVsOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIGZpbHRlclJvdzogeyB2aXNpYmxlOiBmYWxzZSB9LFxyXG4gICAgICByZW1vdGVPcGVyYXRpb25zOiBmYWxzZSxcclxuICAgICAgc2VsZWN0aW9uOiB7XHJcbiAgICAgICAgbW9kZTogJ25vbmUnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICd2YWx1ZScsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICd0aXRsZScsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdpbWFnZScsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICBjZWxsVGVtcGxhdGU6IChjb250YWluZXIsIGNlbGxEYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICQoJzxkaXY+JylcclxuICAgICAgICAgICAgICAuY3NzKHsgJ3RleHQtYWxpZ24nOiAnY2VudGVyJyB9KVxyXG4gICAgICAgICAgICAgIC5hcHBlbmQoJCgnPGltZz4nLCB7IHNyYzogY2VsbERhdGEuZGF0YS5pbWFnZSB9KSlcclxuICAgICAgICAgICAgICAuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlZGl0Q2VsbFRlbXBsYXRlOiAoXywgY2VsbEluZm8pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaW1nID0gY2VsbEluZm8udmFsdWUgfHwgJyc7XHJcblxyXG4gICAgICAgICAgICBjb25zdCAkY29udGFpbmVyID0gJCgnPGRpdiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XCIgLz4nKTtcclxuICAgICAgICAgICAgY29uc3QgJGltZyA9ICQoYDxpbWcgc3JjPVwiJHtpbWd9XCIgLz5gKTtcclxuICAgICAgICAgICAgY29uc3QgJGxpbmsgPSAkKCc8YSBjbGFzcz1cImR4LWxpbmsgZHgtaWNvbi11cGxvYWRcIiBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgcmlnaHQ6IDhweDsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXNpemU6IDE4cHg7XCIgLz4nKTtcclxuICAgICAgICAgICAgY29uc3QgJGZpbGVJbnB1dCA9ICQoJzxpbnB1dCB0eXBlPVwiZmlsZVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIC8+Jyk7XHJcblxyXG4gICAgICAgICAgICAkbGluay5vbignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgJGZpbGVJbnB1dC5jbGljaygpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICRmaWxlSW5wdXQub24oJ2NoYW5nZScsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKChlLnRhcmdldCBhcyBhbnkpLmZpbGVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICAgICAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICRpbWcuYXR0cignc3JjJywgKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKSk7XHJcbiAgICAgICAgICAgICAgICAgIGNlbGxJbmZvLnNldFZhbHVlKChyZWFkZXIucmVzdWx0IGFzIHN0cmluZykpO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gKGUudGFyZ2V0IGFzIGFueSkuZmlsZXNbMF07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGZpbGUpIHtcclxuICAgICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAkaW1nLmF0dHIoJ3NyYycsICcnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgJGltZy5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuICAgICAgICAgICAgJGxpbmsuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICRmaWxlSW5wdXQuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gJGNvbnRhaW5lcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICB0eXBlOiAnYnV0dG9ucycsXHJcbiAgICAgICAgICB3aWR0aDogMTAwLFxyXG4gICAgICAgICAgYnV0dG9uczogW1xyXG4gICAgICAgICAgICAnZWRpdCcsXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBoaW50OiAnRGVsZXRlJyxcclxuICAgICAgICAgICAgICBpY29uOiAndHJhc2gnLFxyXG4gICAgICAgICAgICAgIG9uQ2xpY2s6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByb3dzID0gdGhpcy5ncmlkLm9wdGlvbignZGF0YVNvdXJjZScpO1xyXG5cclxuICAgICAgICAgICAgICAgIChyb3dzIGFzIGFueVtdKS5zcGxpY2UoZS5yb3cucm93SW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkLm9wdGlvbignZGF0YVNvdXJjZScsIHJvd3MpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgXVxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCAkZ3JpZCA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbyh0aGlzLiRjb250YWluZXIpO1xyXG5cclxuICAgIHRoaXMuZ3JpZCA9IGNyZWF0ZURlZmF1bHRHcmlkKFxyXG4gICAgICAkZ3JpZCxcclxuICAgICAge1xyXG4gICAgICAgIG9wdGlvbnMsXHJcbiAgICAgICAgaXNGdWxsU2NyZWVuOiBmYWxzZVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldERhdGEoKTogSUljb25zQ29sdW1uRWRpdG9ySXRlbVtdIHtcclxuICAgIHJldHVybiB0aGlzLmdyaWQub3B0aW9uKCdkYXRhU291cmNlJykgYXMgSUljb25zQ29sdW1uRWRpdG9ySXRlbVtdO1xyXG4gIH1cclxufVxyXG5cclxuY2xhc3MgUHJlZGVmaW5lZFZhbHVlc0NvbHVtbkVkaXRvciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhOiBJUHJlZGVmaW5lZFZhbHVlc0VkaXRvckl0ZW1bXTtcclxuICBwcml2YXRlIGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuXHJcbiAgY29uc3RydWN0b3IoJGNvbnRhaW5lcjogSlF1ZXJ5LCBkYXRhOiBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtW10pIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9ICRjb250YWluZXI7XHJcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIGNvbnN0IG9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5Qcm9wZXJ0aWVzID0ge1xyXG4gICAgICBkYXRhU291cmNlOiB0aGlzLmRhdGEsXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBtb2RlOiAncm93JyxcclxuICAgICAgICBhbGxvd0FkZGluZzogdHJ1ZSxcclxuICAgICAgICBhbGxvd0RlbGV0aW5nOiB0cnVlLFxyXG4gICAgICAgIGFsbG93VXBkYXRpbmc6IHRydWUsXHJcbiAgICAgICAgdXNlSWNvbnM6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgaGVhZGVyRmlsdGVyOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIGdyb3VwaW5nOiB7IGNvbnRleHRNZW51RW5hYmxlZDogZmFsc2UgfSxcclxuICAgICAgZ3JvdXBQYW5lbDogeyB2aXNpYmxlOiBmYWxzZSB9LFxyXG4gICAgICBzZWFyY2hQYW5lbDogeyB2aXNpYmxlOiBmYWxzZSB9LFxyXG4gICAgICBmaWx0ZXJSb3c6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgcmVtb3RlT3BlcmF0aW9uczogZmFsc2UsXHJcbiAgICAgIHNlbGVjdGlvbjoge1xyXG4gICAgICAgIG1vZGU6ICdub25lJ1xyXG4gICAgICB9LFxyXG4gICAgICBjb2x1bW5zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAndmFsdWUnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgIHR5cGU6ICdidXR0b25zJyxcclxuICAgICAgICAgIHdpZHRoOiAxMDAsXHJcbiAgICAgICAgICBidXR0b25zOiBbXHJcbiAgICAgICAgICAgICdlZGl0JyxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGhpbnQ6ICdEZWxldGUnLFxyXG4gICAgICAgICAgICAgIGljb246ICd0cmFzaCcsXHJcbiAgICAgICAgICAgICAgb25DbGljazogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJvd3MgPSB0aGlzLmdyaWQub3B0aW9uKCdkYXRhU291cmNlJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgKHJvd3MgYXMgYW55W10pLnNwbGljZShlLnJvdy5yb3dJbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWQub3B0aW9uKCdkYXRhU291cmNlJywgcm93cyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0ICRncmlkID0gJCgnPGRpdiAvPicpLmFwcGVuZFRvKHRoaXMuJGNvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy5ncmlkID0gY3JlYXRlRGVmYXVsdEdyaWQoJGdyaWQsIHtcclxuICAgICAgb3B0aW9ucyxcclxuICAgICAgaXNGdWxsU2NyZWVuOiBmYWxzZVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGF0YSgpOiBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnKSBhcyBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtW107XHJcbiAgfVxyXG59XHJcblxyXG5jbGFzcyBSYWJiaXRBY3Rpb25Db2x1bW5FZGl0b3Ige1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YTogSVJhYmJpdEFjdGlvbkVkaXRvckRhdGE7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbml0RGF0YTogSVJhYmJpdEFjdGlvbkVkaXRvckluaXREYXRhO1xyXG4gIHByaXZhdGUgZm9ybTogRGV2RXhwcmVzcy51aS5keEZvcm07XHJcblxyXG4gIGNvbnN0cnVjdG9yKCRjb250YWluZXI6IEpRdWVyeSwgZGF0YTogSVJhYmJpdEFjdGlvbkVkaXRvckRhdGEsIGluaXREYXRhOiBJUmFiYml0QWN0aW9uRWRpdG9ySW5pdERhdGEpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9ICRjb250YWluZXI7XHJcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgdGhpcy5pbml0RGF0YSA9IGluaXREYXRhO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIHRoaXMuZm9ybSA9ICQoJzxkaXYgLz4nKS5keEZvcm0oe1xyXG4gICAgICBmb3JtRGF0YTogdGhpcy5kYXRhLFxyXG4gICAgICBsYWJlbExvY2F0aW9uOiAndG9wJyxcclxuICAgICAgaXRlbXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdhY3Rpb25UeXBlJyxcclxuICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW3tcclxuICAgICAgICAgICAgdHlwZTogJ3JlcXVpcmVkJ1xyXG4gICAgICAgICAgfV1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ2ZpZWxkcycsXHJcbiAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFt7XHJcbiAgICAgICAgICAgIHR5cGU6ICdyZXF1aXJlZCdcclxuICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgdHlwZTogJ2N1c3RvbScsXHJcbiAgICAgICAgICAgIHZhbGlkYXRpb25DYWxsYmFjazogKGUpID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4gKGUudmFsdWUgYXMgYW55KS5sZW5ndGggPiAwO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBtZXNzYWdlOiAnUmVxdWlyZWQnXHJcbiAgICAgICAgICB9XSxcclxuICAgICAgICAgIGVkaXRvclR5cGU6ICdkeFRhZ0JveCcsXHJcbiAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgIGRhdGFTb3VyY2U6IHRoaXMuaW5pdERhdGEuZmllbGRzLFxyXG4gICAgICAgICAgICBkaXNwbGF5RXhwcjogJ1RleHQnLFxyXG4gICAgICAgICAgICB2YWx1ZUV4cHI6ICdWYWx1ZScsXHJcbiAgICAgICAgICAgIHNlYXJjaEVuYWJsZWQ6IHRydWVcclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRhZ0JveE9wdGlvbnNcclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgIH0pLmFwcGVuZFRvKHRoaXMuJGNvbnRhaW5lcikuZHhGb3JtKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldERhdGEoKTogSVJhYmJpdEFjdGlvbkVkaXRvckRhdGEge1xyXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMuZm9ybS52YWxpZGF0ZSgpO1xyXG5cclxuICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBhY3Rpb25UeXBlID0gdGhpcy5mb3JtLmdldEVkaXRvcignYWN0aW9uVHlwZScpLm9wdGlvbigndmFsdWUnKSBhcyBzdHJpbmc7XHJcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmZvcm0uZ2V0RWRpdG9yKCdmaWVsZHMnKS5vcHRpb24oJ3ZhbHVlJykgYXMgc3RyaW5nW107XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgZmllbGRzXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG5cclxuKERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCBhcyBhbnkpLnJlZ2lzdGVyTW9kdWxlKCdjb2x1bW5DaG9vc2VyU29ydGluZycsIHtcclxuICBleHRlbmRlcnM6IHtcclxuICAgIGNvbnRyb2xsZXJzOiB7XHJcbiAgICAgIGNvbHVtbnM6IHtcclxuICAgICAgICBnZXRDaG9vc2VyQ29sdW1ucyhsb2FkQWxsQ29sdW1ucykge1xyXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gKHRoaXMgYXMgYW55KS5jYWxsQmFzZShsb2FkQWxsQ29sdW1ucyk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5zb3J0KChjb2x1bW4xLCBjb2x1bW4yKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhcHRpb24xID0gY29sdW1uMT8uY2FwdGlvbiB8fCAnJztcclxuICAgICAgICAgICAgY29uc3QgY2FwdGlvbjIgPSBjb2x1bW4yPy5jYXB0aW9uIHx8ICcnO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGNhcHRpb24xLmxvY2FsZUNvbXBhcmUoY2FwdGlvbjIpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59KTtcclxuIiwgIlx1RkVGRmNvbnN0IGFyZUFyZ3VtZW50c1NoYWxsb3dseUVxdWFsID0gKHByZXY6IGFueVtdIHwgbnVsbCwgbmV4dDogYW55W10gfCBudWxsKSA9PiB7XHJcbiAgaWYgKHByZXYgPT09IG51bGwgfHwgbmV4dCA9PT0gbnVsbCB8fCBwcmV2Lmxlbmd0aCAhPT0gbmV4dC5sZW5ndGgpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldi5sZW5ndGg7IGkrKykge1xyXG4gICAgaWYgKHByZXZbaV0gIT09IG5leHRbaV0pIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHRydWU7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgbWVtb2l6ZSA9IDxUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk+KGZ1bmM6IFQpOiBUID0+IHtcclxuICBsZXQgbGFzdEFyZ3M6IGFueVtdIHwgbnVsbCA9IG51bGw7XHJcbiAgbGV0IGxhc3RSZXN1bHQ6IHVua25vd24gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBvbmx5LWFycm93LWZ1bmN0aW9uc1xyXG4gIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XHJcbiAgICBpZiAoIWFyZUFyZ3VtZW50c1NoYWxsb3dseUVxdWFsKGxhc3RBcmdzLCBhcmdzKSkge1xyXG4gICAgICBsYXN0UmVzdWx0ID0gZnVuYyguLi5hcmdzIGFzIGFueSk7XHJcbiAgICB9XHJcblxyXG4gICAgbGFzdEFyZ3MgPSBhcmdzO1xyXG5cclxuICAgIHJldHVybiBsYXN0UmVzdWx0O1xyXG4gIH0gYXMgVDtcclxufTtcclxuIiwgIlx1RkVGRi8vIHRzbGludDpkaXNhYmxlOiBtZW1iZXItb3JkZXJpbmdcclxuaW1wb3J0IHsgSUdyaWRTdGF0ZSB9IGZyb20gJy4vR3JpZFN0YXRlJztcclxuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi9EYXRhL1JlcXVlc3QnO1xyXG5pbXBvcnQgeyBtZW1vaXplIH0gZnJvbSAnLi4vLi4vLi4vVXRpbHMvTWVtb2l6ZSc7XHJcbmltcG9ydCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbiBmcm9tICcuLi8uLi8uLi9EYXRhL0xvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5VmlldyB7XHJcbiAgcmVhZG9ubHkgaWQ6IG51bWJlcjtcclxuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgZ3JpZFN0YXRlOiBJR3JpZFN0YXRlIHwgbnVsbDtcclxuICBpc0dsb2JhbDogYm9vbGVhbjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElDb250cm9sRGlzcGxheVZpZXdEdG8ge1xyXG4gIElkOiBudW1iZXI7XHJcbiAgTmFtZTogc3RyaW5nO1xyXG4gIEdyaWRTdGF0ZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcclxuICBJc0dsb2JhbDogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZFZpZXdzTWFuYWdlck9wdGlvbnMge1xyXG4gIC8vIHJlYWRvbmx5IGRlZmF1bHRPcGVuZWRWaWV3SWQ6IG51bWJlcjtcclxuICBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIGluc2VydERhdGFVcmw6IHN0cmluZztcclxuICB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbiAgZGVsZXRlRGF0YVVybDogc3RyaW5nO1xyXG59XHJcblxyXG50eXBlIENvbnRyb2xEaXNwbGF5Vmlld1VwZGF0ZXMgPSBQYXJ0aWFsPFBpY2s8SUNvbnRyb2xEaXNwbGF5VmlldywgJ25hbWUnIHwgJ2dyaWRTdGF0ZScgfCAnaXNHbG9iYWwnPj47XHJcblxyXG5leHBvcnQgY2xhc3MgR3JpZFZpZXdzTWFuYWdlciB7XHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBkZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3OiBJQ29udHJvbERpc3BsYXlWaWV3ID0ge1xyXG4gICAgaWQ6IDAsXHJcbiAgICBuYW1lOiAnRGVmYXVsdCcsXHJcbiAgICBncmlkU3RhdGU6IG51bGwsXHJcbiAgICBpc0dsb2JhbDogZmFsc2VcclxuICB9O1xyXG5cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBkZWZhdWx0Vmlld3MgPSBbR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3XTtcclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfY3VycmVudFZpZXdJZDogbnVtYmVyID0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkO1xyXG4gIHByaXZhdGUgdmlld3M6IElDb250cm9sRGlzcGxheVZpZXdbXSA9IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdFZpZXdzO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGluc2VydERhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlbGV0ZURhdGFVcmw6IHN0cmluZztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBnZXRWaWV3QnlJZEludGVybmFsID0gKHZpZXdJZDogbnVtYmVyKSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy52aWV3cyAmJiB0aGlzLnZpZXdzLmZpbmQoKHYpID0+IHYuaWQgPT09IHZpZXdJZCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgZ2V0Vmlld0J5SWQgPSBtZW1vaXplKHRoaXMuZ2V0Vmlld0J5SWRJbnRlcm5hbCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElHcmlkVmlld3NNYW5hZ2VyT3B0aW9ucykge1xyXG4gICAgdGhpcy5sb2FkRGF0YVVybCA9IG9wdGlvbnMubG9hZERhdGFVcmw7XHJcbiAgICB0aGlzLmluc2VydERhdGFVcmwgPSBvcHRpb25zLmluc2VydERhdGFVcmw7XHJcbiAgICB0aGlzLnVwZGF0ZURhdGFVcmwgPSBvcHRpb25zLnVwZGF0ZURhdGFVcmw7XHJcbiAgICB0aGlzLmRlbGV0ZURhdGFVcmwgPSBvcHRpb25zLmRlbGV0ZURhdGFVcmw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1cnJlbnRWaWV3KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0Vmlld0J5SWQodGhpcy5fY3VycmVudFZpZXdJZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1cnJlbnRWaWV3SWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFZpZXdJZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgY3VycmVudFZpZXdJZChpZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9jdXJyZW50Vmlld0lkID0gaWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0Vmlld3MoKTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlWaWV3W10+IHtcclxuICAgIGlmICh0aGlzLnZpZXdzID09PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRWaWV3cykge1xyXG4gICAgICBhd2FpdCB0aGlzLmxvYWRWaWV3cygpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLnZpZXdzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZUN1cnJlbnRWaWV3KHZpZXdVcGRhdGVzOiBDb250cm9sRGlzcGxheVZpZXdVcGRhdGVzKSB7XHJcbiAgICByZXR1cm4gdGhpcy51cGRhdGVWaWV3KHRoaXMuY3VycmVudFZpZXcuaWQsIHZpZXdVcGRhdGVzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVOZXdWaWV3KHZpZXdOYW1lOiBzdHJpbmcsIGdyaWRTdGF0ZTogSUdyaWRTdGF0ZSwgaXNHbG9iYWwpOiBQcm9taXNlPElDb250cm9sRGlzcGxheVZpZXc+IHtcclxuICAgIGxldCBuZXdWaWV3RHRvOiBJQ29udHJvbERpc3BsYXlWaWV3RHRvID0gdGhpcy5tYXBWaWV3TW9kZWxUb0R0byh7XHJcbiAgICAgIGlkOiAtMSxcclxuICAgICAgbmFtZTogdmlld05hbWUsXHJcbiAgICAgIGdyaWRTdGF0ZSxcclxuICAgICAgaXNHbG9iYWxcclxuICAgIH0pO1xyXG5cclxuICAgIG5ld1ZpZXdEdG8gPSBhd2FpdCBzZW5kUmVxdWVzdDxJQ29udHJvbERpc3BsYXlWaWV3RHRvPih0aGlzLmluc2VydERhdGFVcmwsICdQT1NUJywgbmV3Vmlld0R0byk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRWaWV3cygpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLm1hcFZpZXdEdG9Ub01vZGVsKG5ld1ZpZXdEdG8pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHVwZGF0ZVZpZXcodmlld0lkOiBudW1iZXIsIHVwZGF0ZXM6IENvbnRyb2xEaXNwbGF5Vmlld1VwZGF0ZXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICh2aWV3SWQgPT09IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdmlldyA9IHRoaXMuZ2V0Vmlld0J5SWQodmlld0lkKTtcclxuICAgIGlmICghdmlldykge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdXBkYXRlZFZpZXc6IElDb250cm9sRGlzcGxheVZpZXcgPSB7XHJcbiAgICAgIC4uLnZpZXcsXHJcbiAgICAgIC4uLnVwZGF0ZXNcclxuICAgIH07XHJcbiAgICBsZXQgdXBkYXRlZFZpZXdEdG86IElDb250cm9sRGlzcGxheVZpZXdEdG8gPSB0aGlzLm1hcFZpZXdNb2RlbFRvRHRvKHVwZGF0ZWRWaWV3KTtcclxuXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gICAgdXBkYXRlZFZpZXdEdG8gPSBhd2FpdCBzZW5kUmVxdWVzdDxJQ29udHJvbERpc3BsYXlWaWV3RHRvPih0aGlzLnVwZGF0ZURhdGFVcmwsICdQVVQnLCB1cGRhdGVkVmlld0R0byk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRWaWV3cygpO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGRlbGV0ZVZpZXcodmlld0lkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICh2aWV3SWQgPT09IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdmlldyA9IHRoaXMuZ2V0Vmlld0J5SWQodmlld0lkKTtcclxuICAgIGlmICghdmlldykge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgYXdhaXQgc2VuZFJlcXVlc3QodGhpcy5kZWxldGVEYXRhVXJsLCAnREVMRVRFJywgeyB2aWV3SWQgfSk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRWaWV3cygpO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBsb2FkVmlld3MoKSB7XHJcbiAgICBjb25zdCB2aWV3cyA9IGF3YWl0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uPElDb250cm9sRGlzcGxheVZpZXdEdG9bXT4odGhpcy5sb2FkRGF0YVVybCk7XHJcblxyXG4gICAgdGhpcy52aWV3cyA9IHZpZXdzLm1hcCgoZHRvKSA9PiB0aGlzLm1hcFZpZXdEdG9Ub01vZGVsKGR0bykpO1xyXG4gICAgdGhpcy52aWV3cy51bnNoaWZ0KEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldyk7XHJcbiAgICAvLyBOT1RFOiByZXNldCBtZW1vaXplXHJcbiAgICB0aGlzLnJlc2V0Q2FjaGVkUmVzdWx0T2ZHZXRWaWV3QnlJZEZ1bmN0aW9uKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMudmlld3M7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hcFZpZXdNb2RlbFRvRHRvKG1vZGVsOiBJQ29udHJvbERpc3BsYXlWaWV3KTogSUNvbnRyb2xEaXNwbGF5Vmlld0R0byB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBJZDogbW9kZWwuaWQsXHJcbiAgICAgIE5hbWU6IG1vZGVsLm5hbWUsXHJcbiAgICAgIEdyaWRTdGF0ZTogSlNPTi5zdHJpbmdpZnkobW9kZWwuZ3JpZFN0YXRlKSxcclxuICAgICAgSXNHbG9iYWw6IG1vZGVsLmlzR2xvYmFsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXBWaWV3RHRvVG9Nb2RlbChkdG86IElDb250cm9sRGlzcGxheVZpZXdEdG8pOiBJQ29udHJvbERpc3BsYXlWaWV3IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGlkOiBkdG8uSWQsXHJcbiAgICAgIG5hbWU6IGR0by5OYW1lLFxyXG4gICAgICBncmlkU3RhdGU6IEpTT04ucGFyc2UoZHRvLkdyaWRTdGF0ZSksXHJcbiAgICAgIGlzR2xvYmFsOiBkdG8uSXNHbG9iYWxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0Q2FjaGVkUmVzdWx0T2ZHZXRWaWV3QnlJZEZ1bmN0aW9uKCkge1xyXG4gICAgdGhpcy5nZXRWaWV3QnlJZCA9IG1lbW9pemUodGhpcy5nZXRWaWV3QnlJZEludGVybmFsKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElHcmlkU3RhdGUgfSBmcm9tICcuL0dyaWRTdGF0ZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElPbmVUaW1lR3JpZFN0YXRlTWFuYWdlck9wdGlvbnMge1xyXG4gIHJlYWRvbmx5IG93bmVyOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XHJcbiAgcmVhZG9ubHkgaW5pdGlhbFN0YXRlOiBJR3JpZFN0YXRlIHwgbnVsbDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyIHtcclxuICBwdWJsaWMgY3VycmVudFNhdmVkR3JpZFN0YXRlOiBJR3JpZFN0YXRlO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IElPbmVUaW1lR3JpZFN0YXRlTWFuYWdlck9wdGlvbnM7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElPbmVUaW1lR3JpZFN0YXRlTWFuYWdlck9wdGlvbnMpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICB0aGlzLmN1cnJlbnRTYXZlZEdyaWRTdGF0ZSA9IG9wdGlvbnMuaW5pdGlhbFN0YXRlO1xyXG5cclxuICAgIHRoaXMub3B0aW9ucy5vd25lci5vcHRpb24oJ3N0YXRlU3RvcmluZycsIHtcclxuICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgdHlwZTogJ2N1c3RvbScsXHJcbiAgICAgIGN1c3RvbUxvYWQ6ICgpID0+IFByb21pc2UucmVzb2x2ZSh0aGlzLmN1cnJlbnRTYXZlZEdyaWRTdGF0ZSlcclxuICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snc3RhdGVTdG9yaW5nJ10pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBoYXNDaGFuZ2VzKCkge1xyXG4gICAgLy8gVE9ETzogdXNlIGRlZXAgZXF1YWxcclxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTYXZlZEdyaWRTdGF0ZSAhPT0gbnVsbCAmJiBKU09OLnN0cmluZ2lmeSh0aGlzLmN1cnJlbnRVbnNhdmVkR3JpZFN0YXRlKSAhPT0gSlNPTi5zdHJpbmdpZnkoXHJcbiAgICAgIHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudFVuc2F2ZWRHcmlkU3RhdGUoKTogSUdyaWRTdGF0ZSB7XHJcbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlVW5zYXZlZEdyaWRTdGF0ZSh0aGlzLm9wdGlvbnMub3duZXIuc3RhdGUoKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgYXBwbHkoZ3JpZFN0YXRlOiBJR3JpZFN0YXRlIHwgbnVsbCwgcmVzZXRGaWx0ZXIgPSB0cnVlKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBjdXJyZW50RmlsdGVyID0gcmVzZXRGaWx0ZXIgPyB1bmRlZmluZWQgOiB0aGlzLm9wdGlvbnMub3duZXIuZmlsdGVyKCk7XHJcblxyXG4gICAgICAvKiBOT1RFOiBTb21ldGltZXMgYSBncmlkIGNhbiByZXR1cm4gYSBuZXcgc3RhdGUgd2l0aCBvbGQgZmlsdGVyVmFsdWUsXHJcbiAgICAgICAgc28gd2Ugc2hvdWxkIHJlc2V0IHRoZSBmaWx0ZXJWYWx1ZSBiZWZvcmUgc3RhdGUgYXBwbHlpbmdcclxuICAgICAgICBpZiB0aGlzIGJ1ZyB3aWxsIGJlIGZpeGVkIG9uIHRoZSBEZXZFeHRyZW1lIHNpZGUgd2UgY2FuIHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmVcclxuICAgICAgKi9cclxuICAgICAgdGhpcy5vcHRpb25zLm93bmVyLmJlZ2luVXBkYXRlKCk7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5vd25lci5jbGVhckZpbHRlcignZmlsdGVyVmFsdWUnKTtcclxuXHJcbiAgICAgIHRoaXMub3B0aW9ucy5vd25lci5zdGF0ZShncmlkU3RhdGUpO1xyXG5cclxuICAgICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSB0aGlzLm9wdGlvbnMub3duZXIuZ2V0VmlzaWJsZUNvbHVtbnMoKS5maWx0ZXIoKGMpID0+ICFjLnR5cGUpO1xyXG5cclxuICAgICAgaWYgKHZpc2libGVDb2x1bW5zWzBdICYmIHZpc2libGVDb2x1bW5zWzBdLmRhdGFGaWVsZCkge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5vd25lci5vcHRpb24oJ3N1bW1hcnknLCB7XHJcbiAgICAgICAgICB0b3RhbEl0ZW1zOiBbe1xyXG4gICAgICAgICAgICBjb2x1bW46IHZpc2libGVDb2x1bW5zWzBdLmRhdGFGaWVsZCxcclxuICAgICAgICAgICAgc3VtbWFyeVR5cGU6ICdjb3VudCdcclxuICAgICAgICAgIH1dXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGN1cnJlbnRGaWx0ZXIgJiYgdGhpcy5vcHRpb25zLm93bmVyLmZpbHRlcihjdXJyZW50RmlsdGVyKTtcclxuICAgICAgdGhpcy5vcHRpb25zLm93bmVyLmVuZFVwZGF0ZSgpO1xyXG5cclxuICAgICAgY29uc3Qgb25Db250ZW50UmVhZHkgPSAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zYXZlKCk7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5vd25lci5vZmYoJ2NvbnRlbnRSZWFkeScsIG9uQ29udGVudFJlYWR5KTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMub3B0aW9ucy5vd25lci5vbignY29udGVudFJlYWR5Jywgb25Db250ZW50UmVhZHkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2F2ZSgpIHtcclxuICAgIHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlID0gdGhpcy5jdXJyZW50VW5zYXZlZEdyaWRTdGF0ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXNldCgpIHtcclxuICAgIHRoaXMub3B0aW9ucy5vd25lci5zdGF0ZSh0aGlzLmN1cnJlbnRTYXZlZEdyaWRTdGF0ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHByZXBhcmVVbnNhdmVkR3JpZFN0YXRlKHVuc2F2ZWRHcmlkU3RhdGU6IElHcmlkU3RhdGUpOiBJR3JpZFN0YXRlIHtcclxuICAgIGlmICh1bnNhdmVkR3JpZFN0YXRlLmNvbHVtbnMpIHtcclxuICAgICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSB1bnNhdmVkR3JpZFN0YXRlLmNvbHVtbnNcclxuICAgICAgICAuZmlsdGVyKChjKSA9PiBjLnZpc2libGUpO1xyXG4gICAgICBjb25zdCBsYXN0Q29sdW1uID0gdmlzaWJsZUNvbHVtbnNbdmlzaWJsZUNvbHVtbnMubGVuZ3RoIC0gMV07XHJcbiAgICAgIGxhc3RDb2x1bW4ud2lkdGggPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHVuc2F2ZWRHcmlkU3RhdGU7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBHcmlkVmlld3NNYW5hZ2VyLCBJR3JpZFZpZXdzTWFuYWdlck9wdGlvbnMgfSBmcm9tICcuL0dyaWRWaWV3c01hbmFnZXInO1xyXG5pbXBvcnQgeyBPbmVUaW1lR3JpZFN0YXRlTWFuYWdlciB9IGZyb20gJy4vR3JpZFN0YXRlTWFuYWdlcic7XHJcbmltcG9ydCB7IE11dGFibGUgfSBmcm9tICcuLi8uLi8uLi9Db21wb25lbnRzL0NvcmUnO1xyXG5pbXBvcnQgeyBjcmVhdGVEaWFsb2cgfSBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL1BvcHVwJztcclxuaW1wb3J0IG5vdGlmeSBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL05vdGlmeSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50T3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgb3duZXI6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICByZWFkb25seSBncmlkVmlld3NNYW5hZ2VyOiBHcmlkVmlld3NNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGdyaWRTdGF0ZU1hbmFnZXI6IE9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGF1dG9JbnRlZ3JhdGlvbjogYm9vbGVhbjtcclxuICByZWFkb25seSBvblZpZXdBcHBsaWVkPzogKHZpZXdJZDogbnVtYmVyKSA9PiB2b2lkO1xyXG4gIHJlYWRvbmx5IG9uVmlld0RlbGV0ZWQ/OiAodmlld0lkOiBudW1iZXIpID0+IHZvaWQ7XHJcbiAgcmVhZG9ubHkgY2FuQ3JlYXRlR2xvYmFsVmlld3M6IGJvb2xlYW47XHJcbiAgcmVhZG9ubHkgdmlzaWJsZTogYm9vbGVhbjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50RGVmYXVsdE9wdGlvbnMge1xyXG4gIHJlYWRvbmx5IGdyaWRWaWV3c01hbmFnZXI6IEdyaWRWaWV3c01hbmFnZXI7XHJcbiAgcmVhZG9ubHkgZ3JpZFZpZXdzTWFuYWdlck9wdGlvbnM6IElHcmlkVmlld3NNYW5hZ2VyT3B0aW9ucztcclxuICByZWFkb25seSBncmlkU3RhdGVNYW5hZ2VyOiBPbmVUaW1lR3JpZFN0YXRlTWFuYWdlcjtcclxuICByZWFkb25seSBhdXRvSW50ZWdyYXRpb246IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIEdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnRPcHRpb25zID1cclxuICBNdXRhYmxlPE9taXQ8SUdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnRPcHRpb25zLCBrZXlvZiBJR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudERlZmF1bHRPcHRpb25zPj4gJlxyXG4gIE11dGFibGU8UGFydGlhbDxJR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudERlZmF1bHRPcHRpb25zPj47XHJcblxyXG5leHBvcnQgY2xhc3MgR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudCB7XHJcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IElHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50T3B0aW9ucztcclxuICAvLyB0b29sYmFyIGl0ZW1zXHJcbiAgLy8gdHNsaW50OmRpc2FibGUgdmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgX3ZpZXdzVG9vbGJhckl0ZW06IERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbSB8IHVuZGVmaW5lZDtcclxuICAvLyB0c2xpbnQ6ZW5hYmxlIHZhcmlhYmxlLW5hbWVcclxuXHJcbiAgLy8gdG9vbGJhciB3aWRnZXRzXHJcbiAgcHJpdmF0ZSB2aWV3c0Ryb3Bkb3duQm94OiBEZXZFeHByZXNzLnVpLmR4U2VsZWN0Qm94IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgdmlld3NEYXRhR3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgY3VycmVudFZpZXdUaXRsZTogRGV2RXhwcmVzcy51aS5keFRleHRCb3ggfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBzYXZlVmlld0J1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHNhdmVWaWV3QXNCdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b24gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBjb2x1bW5DaG9vc2VyQnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50T3B0aW9ucykge1xyXG4gICAgdGhpcy5vcHRpb25zID0ge1xyXG4gICAgICAuLi5vcHRpb25zLFxyXG4gICAgICBncmlkU3RhdGVNYW5hZ2VyOiBvcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIgPyBvcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIgOiBuZXcgT25lVGltZUdyaWRTdGF0ZU1hbmFnZXIoe1xyXG4gICAgICAgIG93bmVyOiBvcHRpb25zLm93bmVyLFxyXG4gICAgICAgIGluaXRpYWxTdGF0ZTogbnVsbFxyXG4gICAgICB9KSxcclxuICAgICAgZ3JpZFZpZXdzTWFuYWdlcjogb3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyID8gb3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyIDogbmV3IEdyaWRWaWV3c01hbmFnZXIob3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyT3B0aW9ucyksXHJcbiAgICAgIGF1dG9JbnRlZ3JhdGlvbjogKG9wdGlvbnMuYXV0b0ludGVncmF0aW9uICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gIT09IG51bGwpXHJcbiAgICAgICAgPyBvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiA6IHRydWVcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5vcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAmJiB0aGlzLmludGVncmF0ZVRvR3JpZCh0aGlzLm9wdGlvbnMub3duZXIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHRyeUFwcGx5Vmlldyh2aWV3SWQ6IG51bWJlciB8IHVuZGVmaW5lZCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgaXNDYW5CZVZpZXdBcHBsaWVkID0gYXdhaXQgdGhpcy5jb25maXJtQ2hhbmdlc0xvc3MoKTtcclxuXHJcbiAgICBpZiAoaXNDYW5CZVZpZXdBcHBsaWVkKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuYXBwbHlWaWV3KHZpZXdJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlzQ2FuQmVWaWV3QXBwbGllZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBhcHBseVZpZXcodmlld0lkOiBudW1iZXIpIHtcclxuICAgIHRoaXMuYmVnaW5WaWV3QXBwbHlpbmdMb2FkaW5nKCk7XHJcblxyXG4gICAgdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXdJZCA9IHZpZXdJZDtcclxuICAgIGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyLmFwcGx5KHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3LmdyaWRTdGF0ZSwgZmFsc2UpO1xyXG5cclxuICAgIHRoaXMuZW5kVmlld0FwcGx5aW5nTG9hZGluZygpO1xyXG4gICAgdGhpcy5zeW5jVUlXaXRoQ3VycmVudFZpZXcoKTtcclxuXHJcbiAgICB0aGlzLm9wdGlvbnMub25WaWV3QXBwbGllZCAmJiB0aGlzLm9wdGlvbnMub25WaWV3QXBwbGllZCh2aWV3SWQpO1xyXG5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW50ZWdyYXRlVG9HcmlkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gICAgY29uc3QgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcgPSBncmlkLm9wdGlvbignb25Ub29sYmFyUHJlcGFyaW5nJyk7XHJcblxyXG4gICAgZ3JpZC5vcHRpb24oJ29uVG9vbGJhclByZXBhcmluZycsIChlOiBhbnkpID0+IHtcclxuICAgICAgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcgJiYgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcoZSk7XHJcbiAgICAgIHRoaXMub25HcmlkVG9vbGJhclByZXBhcmluZyhlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkdyaWRUb29sYmFyUHJlcGFyaW5nOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydvblRvb2xiYXJQcmVwYXJpbmcnXSA9IChlKSA9PiB7XHJcbiAgICBjb25zdCB0b29sYmFySXRlbXMgPSBlLnRvb2xiYXJPcHRpb25zICYmIGUudG9vbGJhck9wdGlvbnMuaXRlbXM7XHJcbiAgICBpZiAoIXRvb2xiYXJJdGVtcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW1vdmVEZWZhdWx0Q29sdW1uQ2hvb3NlckJ1dHRvbih0b29sYmFySXRlbXMpO1xyXG5cclxuICAgIHRvb2xiYXJJdGVtcy5zcGxpY2UoMSwgMCxcclxuICAgICAgdGhpcy52aWV3c1Rvb2xiYXJJdGVtLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlRGVmYXVsdENvbHVtbkNob29zZXJCdXR0b24odG9vbGJhckl0ZW1zOiBBcnJheTx7IG5hbWU/OiBzdHJpbmcgfT4pIHtcclxuICAgIHRvb2xiYXJJdGVtcy5zcGxpY2UodG9vbGJhckl0ZW1zLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSAnY29sdW1uQ2hvb3NlckJ1dHRvbicpLCAxKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IHZpZXdzVG9vbGJhckl0ZW0oKSB7XHJcbiAgICBpZiAoIXRoaXMuX3ZpZXdzVG9vbGJhckl0ZW0pIHtcclxuICAgICAgdGhpcy5fdmlld3NUb29sYmFySXRlbSA9IHRoaXMuY3JlYXRlVmlld3NUb29sYmFySXRlbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl92aWV3c1Rvb2xiYXJJdGVtO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgaXNEZWZhdWx0VmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkID09PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBoYXNDaGFuZ2VzKCkge1xyXG4gICAgY29uc3QgY3VycmVudFZpZXcgPSB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50VmlldztcclxuICAgIGlmICghdGhpcy5jdXJyZW50Vmlld1RpdGxlKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50Vmlld1RpdGxlLm9wdGlvbigndmFsdWUnKSAhPT0gY3VycmVudFZpZXcubmFtZSB8fCB0aGlzLm9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlci5oYXNDaGFuZ2VzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVWaWV3c1Rvb2xiYXJJdGVtKCk6IERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbSB7XHJcbiAgICBsZXQgaXNOZWVkSGFuZGxlVmFsdWVDaGFuZ2VkID0gdHJ1ZTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB3aWRnZXQ6ICdkeERyb3BEb3duQm94JyBhcyBhbnksXHJcbiAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICB0ZXh0OiAnVmlld3MnLFxyXG4gICAgICB2aXNpYmxlOiB0aGlzLm9wdGlvbnMudmlzaWJsZSxcclxuICAgICAgY3NzQ2xhc3M6ICdhcHMtdmlld3NfX3Rvb2xiYXItaXRlbScsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICBlbGVtZW50QXR0cjoge2NsYXNzOiAnaXN6b2xlYS1tZCd9LFxyXG4gICAgICAgIGl0ZW1zOiBbR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3XSxcclxuICAgICAgICB2YWx1ZTogR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkLFxyXG4gICAgICAgIHZhbHVlRXhwcjogJ2lkJyxcclxuICAgICAgICBkaXNwbGF5RXhwcjogJ25hbWUnLFxyXG4gICAgICAgIHdpZHRoOiAyMDAsXHJcbiAgICAgICAgZHJvcERvd25PcHRpb25zOiB7XHJcbiAgICAgICAgICB3aWR0aDogNTUwXHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy52aWV3c0Ryb3Bkb3duQm94ID0gZS5jb21wb25lbnQ7XHJcbiAgICAgICAgICB0aGlzLmxvYWRWaWV3RHJvcGRvd25Cb3hEYXRhKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvblZhbHVlQ2hhbmdlZDogYXN5bmMgKGUpID0+IHtcclxuICAgICAgICAgIGlmIChlLnZhbHVlID09PSB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkIHx8ICFpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQpIHtcclxuICAgICAgICAgICAgaXNOZWVkSGFuZGxlVmFsdWVDaGFuZ2VkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBpc1ZpZXdBcHBsaWVkID0gYXdhaXQgdGhpcy50cnlBcHBseVZpZXcoZS52YWx1ZSk7XHJcbiAgICAgICAgICBpZiAoaXNWaWV3QXBwbGllZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaXNOZWVkSGFuZGxlVmFsdWVDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLnN5bmNVSVdpdGhDdXJyZW50Vmlldyh0cnVlKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKGUpID0+IHtcclxuICAgICAgICAgIGlmICghZS5jb21wb25lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMudmlld3NEYXRhR3JpZCA9IHRoaXMuY3JlYXRlVmlld3NEYXRhR3JpZChlLmNvbXBvbmVudCk7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRWaWV3VGl0bGUgPSB0aGlzLmNyZWF0ZUN1cnJlbnRWaWV3VGl0bGUoZS5jb21wb25lbnQpO1xyXG4gICAgICAgICAgdGhpcy5zYXZlVmlld0J1dHRvbiA9IHRoaXMuY3JlYXRlU2F2ZVZpZXdCdXR0b24oKTtcclxuICAgICAgICAgIHRoaXMuc2F2ZVZpZXdBc0J1dHRvbiA9IHRoaXMuY3JlYXRlU2F2ZVZpZXdBc0J1dHRvbigpO1xyXG4gICAgICAgICAgdGhpcy5jb2x1bW5DaG9vc2VyQnV0dG9uID0gdGhpcy5jcmVhdGVDb2x1bW5DaG9vc2VyQnV0dG9uKCk7XHJcblxyXG4gICAgICAgICAgY29uc3QgZHJvcGRvd25Db250ZW50SGVhZGVyID0gJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAgIC5hZGRDbGFzcygnYXBzLXZpZXdzX19oZWFkZXInKVxyXG4gICAgICAgICAgICAuYXBwZW5kKHRoaXMuY3VycmVudFZpZXdUaXRsZS5lbGVtZW50KCkpXHJcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy5zYXZlVmlld0J1dHRvbi5lbGVtZW50KCkpXHJcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy5zYXZlVmlld0FzQnV0dG9uLmVsZW1lbnQoKSlcclxuICAgICAgICAgICAgLmFwcGVuZCh0aGlzLmNvbHVtbkNob29zZXJCdXR0b24uZWxlbWVudCgpKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRlbnQgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgLmhlaWdodCgnMTAwJScpXHJcbiAgICAgICAgICAgIC5hcHBlbmQoZHJvcGRvd25Db250ZW50SGVhZGVyKVxyXG4gICAgICAgICAgICAuYXBwZW5kKHRoaXMudmlld3NEYXRhR3JpZC5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICAgIHJldHVybiBkcm9wZG93bkNvbnRlbnQ7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3hPcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVWaWV3c0RhdGFHcmlkKGRyb3Bkb3duQm94T3duZXI6IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveCk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5keERhdGFHcmlkKHtcclxuICAgICAgICBkYXRhU291cmNlOiBkcm9wZG93bkJveE93bmVyLmdldERhdGFTb3VyY2UoKSxcclxuICAgICAgICByZW1vdGVPcGVyYXRpb25zOiBmYWxzZSxcclxuICAgICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgICBhbGxvd0FkZGluZzogZmFsc2UsXHJcbiAgICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgYWxsb3dEZWxldGluZzogdHJ1ZSxcclxuICAgICAgICAgIG1vZGU6ICdjZWxsJyxcclxuICAgICAgICAgIHVzZUljb25zOiB0cnVlLFxyXG4gICAgICAgICAgdGV4dHM6IHtcclxuICAgICAgICAgICAgY29uZmlybURlbGV0ZU1lc3NhZ2U6ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgdmlldz8nXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB3b3JkV3JhcEVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgbG9hZFBhbmVsOiB7XHJcbiAgICAgICAgICBzaGFkaW5nOiB0cnVlXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb2x1bW5zOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ25hbWUnLFxyXG4gICAgICAgICAgICBhbGxvd0VkaXRpbmc6IGZhbHNlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdpc0dsb2JhbCcsXHJcbiAgICAgICAgICAgIGNhcHRpb246ICdJcyBHbG9iYWwnLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2Jvb2xlYW4nLFxyXG4gICAgICAgICAgICB3aWR0aDogNzBcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdidXR0b25zJyxcclxuICAgICAgICAgICAgYnV0dG9uczogW1xyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6ICdkZWxldGUnLFxyXG4gICAgICAgICAgICAgICAgdmlzaWJsZTogKGUpID0+IGUucm93ICYmIGUucm93LmtleSAhPT0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXSxcclxuICAgICAgICBrZXlib2FyZE5hdmlnYXRpb246IHtcclxuICAgICAgICAgIGVkaXRPbktleVByZXNzOiBmYWxzZSxcclxuICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzaG93Q29sdW1uSGVhZGVyczogdHJ1ZSxcclxuICAgICAgICBob3ZlclN0YXRlRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBmb2N1c2VkUm93RW5hYmxlZDogZmFsc2UsXHJcbiAgICAgICAgc2hvd0JvcmRlcnM6IGZhbHNlLFxyXG4gICAgICAgIHNob3dDb2x1bW5MaW5lczogZmFsc2UsXHJcbiAgICAgICAgc2VsZWN0aW9uOiB7IG1vZGU6ICdzaW5nbGUnIH0sXHJcbiAgICAgICAgaGVpZ2h0OiAnY2FsYygxMDAlIC0gNTFweCknLFxyXG4gICAgICAgIHNjcm9sbGluZzogeyBtb2RlOiAnc3RhbmRhcmQnIH0sXHJcbiAgICAgICAgcGFnaW5nOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXHJcbiAgICAgICAgbm9EYXRhVGV4dDogJ05vIHZpZXdzJyxcclxuICAgICAgICBvblNlbGVjdGlvbkNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICBkcm9wZG93bkJveE93bmVyLm9wdGlvbigndmFsdWUnLCBlLnNlbGVjdGVkUm93S2V5cyAmJiBlLnNlbGVjdGVkUm93S2V5cy5sZW5ndGggPyBlLnNlbGVjdGVkUm93S2V5c1swXSA6IDApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25FZGl0b3JQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZS5kYXRhRmllbGQgPT09ICdpc0dsb2JhbCcpIHtcclxuICAgICAgICAgICAgZS5lZGl0b3JPcHRpb25zLmRpc2FibGVkID0gIXRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxWaWV3cztcclxuICAgICAgICAgICAgZS5lZGl0b3JPcHRpb25zLnZpc2libGUgPSBlLnJvdy5kYXRhLmlkICE9PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBvblZhbHVlQ2hhbmdlZCA9IGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZDtcclxuICAgICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uVmFsdWVDaGFuZ2VkID0gYXN5bmMgKG9wdCkgPT4ge1xyXG4gICAgICAgICAgICAgIGUuY29tcG9uZW50LmJlZ2luQ3VzdG9tTG9hZGluZygnVXBkYXRpbmcnKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci51cGRhdGVWaWV3KGUucm93LmRhdGEuaWQsIHsgaXNHbG9iYWw6IG9wdC52YWx1ZSB9KTtcclxuICAgICAgICAgICAgICBlLmNvbXBvbmVudC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcblxyXG4gICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkKG9wdCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkNlbGxQcmVwYXJlZDogKGUpID0+IHtcclxuICAgICAgICAgIGlmIChlLmNvbHVtbi50eXBlICE9PSAnYnV0dG9ucycgfHwgIWUuZGF0YSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgZW5hYmxlZCA9ICFlLmRhdGEuaXNHbG9iYWxcclxuICAgICAgICAgICAgfHwgKGUuZGF0YS5pc0dsb2JhbCAmJiB0aGlzLm9wdGlvbnMuY2FuQ3JlYXRlR2xvYmFsVmlld3MpO1xyXG5cclxuICAgICAgICAgIGlmICghZW5hYmxlZCkge1xyXG4gICAgICAgICAgICBBcnJheS5mcm9tKGUuY2VsbEVsZW1lbnQuY2hpbGRyZW4oKSkuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgICAgICAgICQoYykuY3NzKHtcclxuICAgICAgICAgICAgICAgIGNvbG9yOiAnI2RkZCAhaW1wb3J0YW50JyxcclxuICAgICAgICAgICAgICAgIGN1cnNvcjogJ2RlZmF1bHQnXHJcbiAgICAgICAgICAgICAgfSkub2ZmKCdjbGljaycpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uUm93UmVtb3Zpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWUua2V5KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmRlbGV0ZVZpZXcoZS5rZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmR4RGF0YUdyaWQoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUN1cnJlbnRWaWV3VGl0bGUoZHJvcGRvd25Cb3hPd25lcjogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94KTogRGV2RXhwcmVzcy51aS5keFRleHRCb3gge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy12aWV3c19fY3VycmVudC12aWV3IGlzem9sZWEtbWQnKVxyXG4gICAgICAuZHhUZXh0Qm94KHtcclxuICAgICAgICB2YWx1ZTogZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3RleHQnKSB8fCBkcm9wZG93bkJveE93bmVyLm9wdGlvbigncGxhY2Vob2xkZXInKSxcclxuICAgICAgICByZWFkT25seTogdGhpcy5pc0RlZmF1bHRWaWV3XHJcbiAgICAgIH0pXHJcbiAgICAgIC5keFRleHRCb3goJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVNhdmVWaWV3QnV0dG9uKCk6IERldkV4cHJlc3MudWkuZHhCdXR0b24ge1xyXG4gICAgcmV0dXJuICQoJzxidXR0b24gLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy12aWV3c19fc2F2ZS12aWV3IGlzem9sZWEtbWQnKVxyXG4gICAgICAuZHhCdXR0b24oe1xyXG4gICAgICAgIHRleHQ6ICdTYXZlJyxcclxuICAgICAgICB0eXBlOiAnbm9ybWFsJyxcclxuICAgICAgICBkaXNhYmxlZDogdGhpcy5pc0RlZmF1bHRWaWV3LFxyXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuc2F2ZS5iaW5kKHRoaXMpLFxyXG4gICAgICAgIGljb246ICdzYXZlJyxcclxuICAgICAgICB3aWR0aDogODdcclxuICAgICAgfSlcclxuICAgICAgLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlVmlld0FzQnV0dG9uKCk6IERldkV4cHJlc3MudWkuZHhCdXR0b24ge1xyXG4gICAgcmV0dXJuICQoJzxidXR0b24gLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy12aWV3c19fc2F2ZS12aWV3LWFzIGlzem9sZWEtbWQnKVxyXG4gICAgICAuZHhCdXR0b24oe1xyXG4gICAgICAgIHRleHQ6ICdTYXZlIEFzJyxcclxuICAgICAgICB0eXBlOiAnbm9ybWFsJyxcclxuICAgICAgICBvbkNsaWNrOiB0aGlzLmNyZWF0ZVNhdmVBc0RpYWxvZy5iaW5kKHRoaXMpLFxyXG4gICAgICAgIGljb246ICdzYXZlJyxcclxuICAgICAgICB3aWR0aDogMTE4XHJcbiAgICAgIH0pXHJcbiAgICAgIC5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlQ29sdW1uQ2hvb3NlckJ1dHRvbigpOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHtcclxuICAgIHJldHVybiAkKCc8YnV0dG9uIC8+JylcclxuICAgICAgLmFkZENsYXNzKCdhcHMtdmlld3NfX2NvbHVtbi1jaG9vc2VyIGlzem9sZWEtbWQnKVxyXG4gICAgICAuZHhCdXR0b24oe1xyXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMub3BlbkNvbHVtbkNob29zZXIuYmluZCh0aGlzKSxcclxuICAgICAgICBpY29uOiAnY29sdW1uLWNob29zZXInXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2F2ZUFzRGlhbG9nKCkge1xyXG4gICAgY29uc3QgJHBvcHVwQ29udGVudCA9ICQoJzxkaXYgLz4nKTtcclxuXHJcbiAgICBjb25zdCBkaWFsb2dDb250ZW50RWxlbWVudCA9ICQoJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjhweDtcIiAvPicpLmR4VGV4dEJveCh7XHJcbiAgICAgIHBsYWNlaG9sZGVyOiAnVmlldyBOYW1lJyxcclxuICAgICAgc2hvd0NsZWFyQnV0dG9uOiB0cnVlLFxyXG4gICAgfSkuZHhWYWxpZGF0b3Ioe1xyXG4gICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICB7IHR5cGU6ICdyZXF1aXJlZCcgfSxcclxuICAgICAgXVxyXG4gICAgfSk7XHJcbiAgICBjb25zdCB2aWV3TmFtZVRleHRCb3ggPSBkaWFsb2dDb250ZW50RWxlbWVudC5keFRleHRCb3goJ2luc3RhbmNlJyk7XHJcbiAgICBjb25zdCB2aWV3TmFtZVRleHRCb3hWYWxpZGF0b3IgPSBkaWFsb2dDb250ZW50RWxlbWVudC5keFZhbGlkYXRvcignaW5zdGFuY2UnKTtcclxuXHJcbiAgICB2aWV3TmFtZVRleHRCb3guZWxlbWVudCgpLmFwcGVuZFRvKCRwb3B1cENvbnRlbnQpO1xyXG5cclxuICAgIGNvbnN0IHZpZXdJc0dsb2JhbENoZWNrYm94ID0gJCgnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTZweDtcIiAvPicpXHJcbiAgICAgIC5keENoZWNrQm94KHtcclxuICAgICAgICB0ZXh0OiAnR2xvYmFsIHZpZXcnLFxyXG4gICAgICAgIGRpc2FibGVkOiAhdGhpcy5vcHRpb25zLmNhbkNyZWF0ZUdsb2JhbFZpZXdzXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keENoZWNrQm94KCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHZpZXdJc0dsb2JhbENoZWNrYm94LmVsZW1lbnQoKS5hcHBlbmRUbygkcG9wdXBDb250ZW50KTtcclxuXHJcbiAgICByZXR1cm4gY3JlYXRlRGlhbG9nKFxyXG4gICAgICB7XHJcbiAgICAgICAgdGl0bGU6ICdDcmVhdGUgTmV3IFZpZXcnLFxyXG4gICAgICAgIGhlaWdodDogJ2F1dG8nLFxyXG4gICAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgICAgbWF4V2lkdGg6ICczMDBweCcsXHJcbiAgICAgIH0sXHJcbiAgICAgICRwb3B1cENvbnRlbnQsXHJcbiAgICAgIHtcclxuICAgICAgICB0ZXh0OiAnT2snLFxyXG4gICAgICAgIG9uQ2xpY2s6IGFzeW5jIChjbG9zZVBvcHVwKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXZpZXdOYW1lVGV4dEJveFZhbGlkYXRvci52YWxpZGF0ZSgpLmlzVmFsaWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGF3YWl0IHRoaXMuc2F2ZUFzKHZpZXdOYW1lVGV4dEJveC5vcHRpb24oJ3ZhbHVlJyksIHZpZXdJc0dsb2JhbENoZWNrYm94Lm9wdGlvbigndmFsdWUnKSk7XHJcbiAgICAgICAgICBjbG9zZVBvcHVwKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHRleHQ6ICdDYW5jZWwnLFxyXG4gICAgICAgIG9uQ2xpY2s6IChjbG9zZVBvcHVwKSA9PiBjbG9zZVBvcHVwKClcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9wZW5Db2x1bW5DaG9vc2VyKCkge1xyXG4gICAgdGhpcy5vcHRpb25zLm93bmVyLnNob3dDb2x1bW5DaG9vc2VyKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGxvYWRWaWV3RHJvcGRvd25Cb3hEYXRhKCkge1xyXG4gICAgaWYgKCF0aGlzLnZpZXdzRHJvcGRvd25Cb3gpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHZpZXdzID0gYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuZ2V0Vmlld3MoKTtcclxuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGV2RXhwcmVzcy5kYXRhLkFycmF5U3RvcmUoe1xyXG4gICAgICBrZXk6ICdpZCcsXHJcbiAgICAgIGRhdGE6IHZpZXdzXHJcbiAgICB9KTtcclxuICAgIHRoaXMudmlld3NEcm9wZG93bkJveC5vcHRpb24oJ2RhdGFTb3VyY2UnLCBkYXRhU291cmNlKTtcclxuICAgIHRoaXMudmlld3NEcm9wZG93bkJveC5vcHRpb24oJ3ZhbHVlJywgdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXdJZCk7XHJcbiAgICB0aGlzLnZpZXdzRGF0YUdyaWQgJiYgdGhpcy52aWV3c0RhdGFHcmlkLm9wdGlvbignZGF0YVNvdXJjZScsIGRhdGFTb3VyY2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBzYXZlKCkge1xyXG4gICAgaWYgKCF0aGlzLmhhc0NoYW5nZXMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyLnNhdmUoKTtcclxuICAgIGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLnVwZGF0ZUN1cnJlbnRWaWV3KHtcclxuICAgICAgbmFtZTogdGhpcy5jdXJyZW50Vmlld1RpdGxlLm9wdGlvbigndmFsdWUnKSxcclxuICAgICAgZ3JpZFN0YXRlOiB0aGlzLm9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlci5jdXJyZW50U2F2ZWRHcmlkU3RhdGVcclxuICAgIH0pO1xyXG5cclxuICAgIG5vdGlmeSgnU2F2ZWQnLCB0cnVlKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLmxvYWRWaWV3RHJvcGRvd25Cb3hEYXRhKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHNhdmVBcyh2aWV3TmFtZTogc3RyaW5nLCBpc0dsb2JhbDogYm9vbGVhbikge1xyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlcikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5vcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIuc2F2ZSgpO1xyXG4gICAgY29uc3QgdXBkYXRlZFZpZXcgPSBhd2FpdCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jcmVhdGVOZXdWaWV3KFxyXG4gICAgICB2aWV3TmFtZSxcclxuICAgICAgdGhpcy5vcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIuY3VycmVudFNhdmVkR3JpZFN0YXRlLFxyXG4gICAgICBpc0dsb2JhbFxyXG4gICAgKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdEcm9wZG93bkJveERhdGEoKTtcclxuICAgIGF3YWl0IHRoaXMuYXBwbHlWaWV3KHVwZGF0ZWRWaWV3LmlkKTtcclxuXHJcbiAgICBub3RpZnkoJ1ZpZXcgaXMgY3JlYXRlZCcsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBkZWxldGVWaWV3KHZpZXdJZDogbnVtYmVyKSB7XHJcbiAgICBhd2FpdCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5kZWxldGVWaWV3KHZpZXdJZCk7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLm9uVmlld0RlbGV0ZWQpIHtcclxuICAgICAgdGhpcy5vcHRpb25zLm9uVmlld0RlbGV0ZWQodmlld0lkKTtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCB0aGlzLmxvYWRWaWV3RHJvcGRvd25Cb3hEYXRhKCk7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXdJZCAhPT0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuYXBwbHlWaWV3KEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJlZ2luVmlld0FwcGx5aW5nTG9hZGluZygpIHtcclxuICAgIHRoaXMuY3VycmVudFZpZXdUaXRsZSAmJiB0aGlzLmN1cnJlbnRWaWV3VGl0bGUub3B0aW9uKCdyZWFkT25seScsIHRydWUpO1xyXG4gICAgdGhpcy5zYXZlVmlld0J1dHRvbiAmJiB0aGlzLnNhdmVWaWV3QnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCB0cnVlKTtcclxuICAgIHRoaXMuc2F2ZVZpZXdBc0J1dHRvbiAmJiB0aGlzLnNhdmVWaWV3QXNCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsIHRydWUpO1xyXG4gICAgdGhpcy52aWV3c0RhdGFHcmlkICYmIHRoaXMudmlld3NEYXRhR3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ0FwcGx5aW5nLi4uJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVuZFZpZXdBcHBseWluZ0xvYWRpbmcoKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRWaWV3VGl0bGUgJiYgdGhpcy5jdXJyZW50Vmlld1RpdGxlLm9wdGlvbigncmVhZE9ubHknLCBmYWxzZSk7XHJcbiAgICB0aGlzLnNhdmVWaWV3QnV0dG9uICYmIHRoaXMuc2F2ZVZpZXdCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsIGZhbHNlKTtcclxuICAgIHRoaXMuc2F2ZVZpZXdBc0J1dHRvbiAmJiB0aGlzLnNhdmVWaWV3QXNCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsIGZhbHNlKTtcclxuICAgIHRoaXMudmlld3NEYXRhR3JpZCAmJiB0aGlzLnZpZXdzRGF0YUdyaWQuZW5kQ3VzdG9tTG9hZGluZygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzeW5jVUlXaXRoQ3VycmVudFZpZXcoaWdub3JlQ3VycmVudFZpZXdUaXRsZSA9IGZhbHNlKSB7XHJcbiAgICBpZiAoIWlnbm9yZUN1cnJlbnRWaWV3VGl0bGUgJiYgdGhpcy5jdXJyZW50Vmlld1RpdGxlKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudFZpZXdUaXRsZS5vcHRpb24oJ3ZhbHVlJywgdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXcubmFtZSk7XHJcbiAgICAgIHRoaXMuY3VycmVudFZpZXdUaXRsZS5vcHRpb24oJ3JlYWRPbmx5JywgdGhpcy5pc0RlZmF1bHRWaWV3KTtcclxuICAgIH1cclxuICAgIHRoaXMudmlld3NEcm9wZG93bkJveC5vcHRpb24oJ3ZhbHVlJywgdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXdJZCk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnZpZXdzRGF0YUdyaWQpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXdJZCA9PT0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkKSB7XHJcbiAgICAgICAgICB0aGlzLnZpZXdzRGF0YUdyaWQuc2VsZWN0Um93c0J5SW5kZXhlcyhbMF0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnZpZXdzRGF0YUdyaWQuc2VsZWN0Um93cyhbdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXdJZF0sIGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sIDApO1xyXG5cclxuICAgIGNvbnN0IGlzR2xvYmFsVmlldyA9IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3LmlzR2xvYmFsXHJcbiAgICAgICYmICF0aGlzLm9wdGlvbnMuY2FuQ3JlYXRlR2xvYmFsVmlld3M7XHJcblxyXG4gICAgdGhpcy5zYXZlVmlld0J1dHRvbiAmJiB0aGlzLnNhdmVWaWV3QnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCB0aGlzLmlzRGVmYXVsdFZpZXcgfHwgaXNHbG9iYWxWaWV3KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY29uZmlybUNoYW5nZXNMb3NzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKCF0aGlzLmhhc0NoYW5nZXMpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oXHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgICdZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMgdGhhdCB3aWxsIGJlIGxvc3QgaWYgeW91IGNsb3NlIHRoaXMgcG9wdXAuIERvIHlvdSB3YW50IHRvIGNsb3NlIHRoZSBwb3B1cCBhbmQgbm90IHNhdmUgY2hhbmdlcz8nLFxyXG4gICAgICAnVW5zYXZlZCBjaGFuZ2VzJ1xyXG4gICAgKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRi8vIHRzbGludDpkaXNhYmxlOiBtZW1iZXItb3JkZXJpbmdcclxuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi9EYXRhL1JlcXVlc3QnO1xyXG5pbXBvcnQgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24gZnJvbSAnLi4vLi4vLi4vRGF0YS9Mb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbic7XHJcbmltcG9ydCB7IG1lbW9pemUgfSBmcm9tICcuLi8uLi8uLi9VdGlscy9NZW1vaXplJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5RmlsdGVyIHtcclxuICByZWFkb25seSBpZDogbnVtYmVyO1xyXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcclxuICByZWFkb25seSBpc0RlZmF1bHQ6IGJvb2xlYW47XHJcbiAgcmVhZG9ubHkgaXNHbG9iYWw6IGJvb2xlYW47XHJcbiAgcmVhZG9ubHkgZmlsdGVyU3RhdGU6IGFueSB8IG51bGw7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG8ge1xyXG4gIElkOiBudW1iZXI7XHJcbiAgTmFtZTogc3RyaW5nO1xyXG4gIElzRGVmYXVsdDogYm9vbGVhbjtcclxuICBJc0dsb2JhbDogYm9vbGVhbjtcclxuICBGaWx0ZXJTdGF0ZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgLy8gcmVhZG9ubHkgZGVmYXVsdE9wZW5lZEZpbHRlcklkOiBudW1iZXI7XHJcbiAgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbiAgaW5zZXJ0RGF0YVVybDogc3RyaW5nO1xyXG4gIGRlbGV0ZURhdGFVcmw6IHN0cmluZztcclxufVxyXG5cclxudHlwZSBDb250cm9sRGlzcGxheUZpbHRlclVwZGF0ZXMgPSBQYXJ0aWFsPFBpY2s8SUNvbnRyb2xEaXNwbGF5RmlsdGVyLCAnbmFtZScgfCAnZmlsdGVyU3RhdGUnIHwgJ2lzR2xvYmFsJz4+O1xyXG5cclxuZXhwb3J0IGNsYXNzIEdyaWRGaWx0ZXJzTWFuYWdlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zZXJ0RGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlRGF0YVVybDogc3RyaW5nO1xyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcclxuICBwcml2YXRlIF9jdXJyZW50RmlsdGVySWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGZpbHRlcnM6IElDb250cm9sRGlzcGxheUZpbHRlcltdIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGdldEZpbHRlckJ5SWRJbnRlcm5hbCA9IChmaWx0ZXJJZDogbnVtYmVyKSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJzICYmIHRoaXMuZmlsdGVycy5maW5kKCh2KSA9PiB2LmlkID09PSBmaWx0ZXJJZCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgZ2V0RmlsdGVyQnlJZCA9IG1lbW9pemUodGhpcy5nZXRGaWx0ZXJCeUlkSW50ZXJuYWwpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJR3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucykge1xyXG4gICAgdGhpcy5sb2FkRGF0YVVybCA9IG9wdGlvbnMubG9hZERhdGFVcmw7XHJcbiAgICB0aGlzLmluc2VydERhdGFVcmwgPSBvcHRpb25zLmluc2VydERhdGFVcmw7XHJcbiAgICB0aGlzLnVwZGF0ZURhdGFVcmwgPSBvcHRpb25zLnVwZGF0ZURhdGFVcmw7XHJcbiAgICB0aGlzLmRlbGV0ZURhdGFVcmwgPSBvcHRpb25zLmRlbGV0ZURhdGFVcmw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1cnJlbnRGaWx0ZXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRGaWx0ZXJCeUlkKHRoaXMuX2N1cnJlbnRGaWx0ZXJJZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1cnJlbnRGaWx0ZXJJZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50RmlsdGVySWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGN1cnJlbnRGaWx0ZXJJZChpZDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLl9jdXJyZW50RmlsdGVySWQgPSBpZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRGaWx0ZXJzKCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5RmlsdGVyW10+IHtcclxuICAgIGlmICghdGhpcy5maWx0ZXJzKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMubG9hZEZpbHRlcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZUN1cnJlbnRGaWx0ZXIoZmlsdGVyVXBkYXRlczogQ29udHJvbERpc3BsYXlGaWx0ZXJVcGRhdGVzKSB7XHJcbiAgICByZXR1cm4gISF0aGlzLmN1cnJlbnRGaWx0ZXIgJiYgdGhpcy51cGRhdGVGaWx0ZXIodGhpcy5jdXJyZW50RmlsdGVyLmlkLCBmaWx0ZXJVcGRhdGVzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVOZXdGaWx0ZXIoZmlsdGVyTmFtZTogc3RyaW5nLCBmaWx0ZXJTdGF0ZTogYW55LCBpc0RlZmF1bHQ6IGJvb2xlYW4sIGlzR2xvYmFsOiBib29sZWFuKVxyXG4gICAgOiBQcm9taXNlPElDb250cm9sRGlzcGxheUZpbHRlcj4ge1xyXG4gICAgbGV0IG5ld0ZpbHRlckR0bzogSUNvbnRyb2xEaXNwbGF5RmlsdGVyRHRvID0gdGhpcy5tYXBGaWx0ZXJNb2RlbFRvRHRvKHtcclxuICAgICAgaWQ6IC0xLFxyXG4gICAgICBuYW1lOiBmaWx0ZXJOYW1lLFxyXG4gICAgICBpc0RlZmF1bHQsXHJcbiAgICAgIGlzR2xvYmFsLFxyXG4gICAgICBmaWx0ZXJTdGF0ZVxyXG4gICAgfSk7XHJcblxyXG4gICAgbmV3RmlsdGVyRHRvID0gYXdhaXQgc2VuZFJlcXVlc3Q8SUNvbnRyb2xEaXNwbGF5RmlsdGVyRHRvPih0aGlzLmluc2VydERhdGFVcmwsXHJcbiAgICAgICdQT1NUJywgbmV3RmlsdGVyRHRvKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZEZpbHRlcnMoKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5tYXBGaWx0ZXJEdG9Ub01vZGVsKG5ld0ZpbHRlckR0byk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgdXBkYXRlRmlsdGVyKGZpbHRlcklkOiBudW1iZXIsIHVwZGF0ZXM6IENvbnRyb2xEaXNwbGF5RmlsdGVyVXBkYXRlcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy5nZXRGaWx0ZXJCeUlkKGZpbHRlcklkKTtcclxuICAgIGlmICghZmlsdGVyKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB1cGRhdGVkRmlsdGVyOiBJQ29udHJvbERpc3BsYXlGaWx0ZXIgPSB7XHJcbiAgICAgIC4uLmZpbHRlcixcclxuICAgICAgLi4udXBkYXRlc1xyXG4gICAgfTtcclxuICAgIGxldCB1cGRhdGVkRmlsdGVyRHRvOiBJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG8gPSB0aGlzLm1hcEZpbHRlck1vZGVsVG9EdG8odXBkYXRlZEZpbHRlcik7XHJcblxyXG4gICAgdXBkYXRlZEZpbHRlckR0byA9IGF3YWl0IHNlbmRSZXF1ZXN0PElDb250cm9sRGlzcGxheUZpbHRlckR0bz4odGhpcy51cGRhdGVEYXRhVXJsLFxyXG4gICAgICAnUFVUJywgdXBkYXRlZEZpbHRlckR0byk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRGaWx0ZXJzKCk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZGVsZXRlRmlsdGVyKGZpbHRlcklkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZ2V0RmlsdGVyQnlJZChmaWx0ZXJJZCk7XHJcbiAgICBpZiAoIWZpbHRlcikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgYXdhaXQgc2VuZFJlcXVlc3QodGhpcy5kZWxldGVEYXRhVXJsLCAnREVMRVRFJywgeyBmaWx0ZXJJZCB9KTtcclxuICAgIGF3YWl0IHRoaXMubG9hZEZpbHRlcnMoKTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbG9hZEZpbHRlcnMoKSB7XHJcbiAgICBjb25zdCBmaWx0ZXJzID0gYXdhaXQgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb248SUNvbnRyb2xEaXNwbGF5RmlsdGVyRHRvW10+KHRoaXMubG9hZERhdGFVcmwpO1xyXG5cclxuICAgIHRoaXMuZmlsdGVycyA9IGZpbHRlcnMubWFwKChkdG8pID0+IHRoaXMubWFwRmlsdGVyRHRvVG9Nb2RlbChkdG8pKTtcclxuICAgIC8vIE5PVEU6IHJlc2V0IG1lbW9pemVcclxuICAgIHRoaXMucmVzZXRDYWNoZWRSZXN1bHRPZkdldEZpbHRlckJ5SWRGdW5jdGlvbigpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmZpbHRlcnM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hcEZpbHRlck1vZGVsVG9EdG8obW9kZWw6IElDb250cm9sRGlzcGxheUZpbHRlcik6IElDb250cm9sRGlzcGxheUZpbHRlckR0byB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBJZDogbW9kZWwuaWQsXHJcbiAgICAgIE5hbWU6IG1vZGVsLm5hbWUsXHJcbiAgICAgIElzRGVmYXVsdDogbW9kZWwuaXNEZWZhdWx0LFxyXG4gICAgICBJc0dsb2JhbDogbW9kZWwuaXNHbG9iYWwsXHJcbiAgICAgIEZpbHRlclN0YXRlOiBKU09OLnN0cmluZ2lmeShtb2RlbC5maWx0ZXJTdGF0ZSlcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hcEZpbHRlckR0b1RvTW9kZWwoZHRvOiBJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG8pOiBJQ29udHJvbERpc3BsYXlGaWx0ZXIge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaWQ6IGR0by5JZCxcclxuICAgICAgbmFtZTogZHRvLk5hbWUsXHJcbiAgICAgIGlzRGVmYXVsdDogZHRvLklzRGVmYXVsdCB8fCBmYWxzZSxcclxuICAgICAgaXNHbG9iYWw6IGR0by5Jc0dsb2JhbCB8fCBmYWxzZSxcclxuICAgICAgZmlsdGVyU3RhdGU6IEpTT04ucGFyc2UoZHRvLkZpbHRlclN0YXRlKVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzZXRDYWNoZWRSZXN1bHRPZkdldEZpbHRlckJ5SWRGdW5jdGlvbigpIHtcclxuICAgIHRoaXMuZ2V0RmlsdGVyQnlJZCA9IG1lbW9pemUodGhpcy5nZXRGaWx0ZXJCeUlkSW50ZXJuYWwpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgR3JpZEZpbHRlcnNNYW5hZ2VyLCBJQ29udHJvbERpc3BsYXlGaWx0ZXIsIElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zIH0gZnJvbSAnLi9HcmlkRmlsdGVyc01hbmFnZXInO1xyXG5pbXBvcnQgeyBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIgfSBmcm9tICcuL0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlcic7XHJcbmltcG9ydCBub3RpZnkgZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9Ob3RpZnknO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50T3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgb3duZXI6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICByZWFkb25seSBncmlkRmlsdGVyc01hbmFnZXI6IEdyaWRGaWx0ZXJzTWFuYWdlcjtcclxuICByZWFkb25seSBhcHNDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXI6IENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlcjtcclxuICByZWFkb25seSBhdXRvSW50ZWdyYXRpb246IGJvb2xlYW47XHJcbiAgcmVhZG9ubHkgb25GaWx0ZXJBcHBsaWVkPzogKGZpbHRlcklkOiBudW1iZXIgfCB1bmRlZmluZWQpID0+IHZvaWQ7XHJcbiAgcmVhZG9ubHkgb25GaWx0ZXJEZWxldGVkPzogKGZpbHRlcklkOiBudW1iZXIgfCB1bmRlZmluZWQpID0+IHZvaWQ7XHJcbiAgcmVhZG9ubHkgY2FuQ3JlYXRlR2xvYmFsRmlsdGVyczogYm9vbGVhbjtcclxuICByZWFkb25seSB2aXNpYmxlOiBib29sZWFuO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudERlZmF1bHRPcHRpb25zIHtcclxuICByZWFkb25seSBncmlkRmlsdGVyc01hbmFnZXI6IEdyaWRGaWx0ZXJzTWFuYWdlcjtcclxuICByZWFkb25seSBncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zOiBJR3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucztcclxuICByZWFkb25seSBhdXRvSW50ZWdyYXRpb246IGJvb2xlYW47XHJcbn1cclxuXHJcbnR5cGUgTXV0YWJsZTxUPiA9IHtcclxuICAtcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IFRbUF07XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnRPcHRpb25zID1cclxuICBNdXRhYmxlPE9taXQ8SUdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMsIGtleW9mIElHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnREZWZhdWx0T3B0aW9ucz4+ICZcclxuICBNdXRhYmxlPFBhcnRpYWw8SUdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudERlZmF1bHRPcHRpb25zPj47XHJcblxyXG5leHBvcnQgY2xhc3MgR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50IHtcclxuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogSUdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudE9wdGlvbnM7XHJcbiAgLy8gdG9vbGJhciBpdGVtc1xyXG4gIC8vIHRzbGludDpkaXNhYmxlIHZhcmlhYmxlLW5hbWVcclxuICBwcml2YXRlIF9maWx0ZXJzVG9vbGJhckl0ZW06IERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbSB8IHVuZGVmaW5lZDtcclxuICAvLyB0c2xpbnQ6ZW5hYmxlIHZhcmlhYmxlLW5hbWVcclxuXHJcbiAgLy8gdG9vbGJhciB3aWRnZXRzXHJcbiAgcHJpdmF0ZSBmaWx0ZXJzRHJvcGRvd25Cb3g6IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGZpbHRlcnNEYXRhR3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgY3VycmVudEZpbHRlclRpdGxlOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIG5ld0ZpbHRlckJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB8IHVuZGVmaW5lZDtcclxuICAvLyB3aWRnZXRzXHJcbiAgLy8gdHNsaW50OmRpc2FibGUgdmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgX2ZpbHRlclBvcHVwOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBmaWx0ZXJOYW1lVGV4dEJveDogRGV2RXhwcmVzcy51aS5keFRleHRCb3ggfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBmaWx0ZXJCdWlsZGVyOiBEZXZFeHByZXNzLnVpLmR4RmlsdGVyQnVpbGRlciB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGZpbHRlckV4cHJlc3Npb25DYWxjdWxhdG9yOiBEZXZFeHByZXNzLnVpLmR4RmlsdGVyQnVpbGRlcjtcclxuICBwcml2YXRlIGZpbHRlcklzR2xvYmFsQ2hlY2tib3g6IERldkV4cHJlc3MudWkuZHhDaGVja0JveCB8IHVuZGVmaW5lZDtcclxuICAvLyB0c2xpbnQ6ZW5hYmxlIHZhcmlhYmxlLW5hbWVcclxuICBwcml2YXRlIGlzSW5GaWx0ZXJBcHBseWluZyA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnRPcHRpb25zKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSB7XHJcbiAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICAgIGdyaWRGaWx0ZXJzTWFuYWdlcjogb3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXJcclxuICAgICAgICA/IG9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyXHJcbiAgICAgICAgOiBuZXcgR3JpZEZpbHRlcnNNYW5hZ2VyKG9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucyksXHJcbiAgICAgIGF1dG9JbnRlZ3JhdGlvbjogKG9wdGlvbnMuYXV0b0ludGVncmF0aW9uICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gIT09IG51bGwpXHJcbiAgICAgICAgPyBvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiA6IHRydWVcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5vcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAmJiB0aGlzLmludGVncmF0ZVRvR3JpZCh0aGlzLm9wdGlvbnMub3duZXIpO1xyXG4gICAgdGhpcy5maWx0ZXJFeHByZXNzaW9uQ2FsY3VsYXRvciA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAuZHhGaWx0ZXJCdWlsZGVyKHtcclxuICAgICAgICBmaWVsZHM6IHRoaXMuZ2V0RmxhdENvbHVtbnNMaXN0KHRoaXMub3B0aW9ucy5vd25lci5vcHRpb24oJ2NvbHVtbnMnKSlcclxuICAgICAgfSlcclxuICAgICAgLmR4RmlsdGVyQnVpbGRlcignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyB0cnlBcHBseUZpbHRlcihmaWx0ZXJJZDogbnVtYmVyIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBpc0NhbkJlRmlsdGVyQXBwbGllZCA9IGF3YWl0IHRoaXMuY29uZmlybUNoYW5nZXNMb3NzKCk7XHJcblxyXG4gICAgaWYgKGlzQ2FuQmVGaWx0ZXJBcHBsaWVkKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuYXBwbHlGaWx0ZXIoZmlsdGVySWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpc0NhbkJlRmlsdGVyQXBwbGllZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBhcHBseUZpbHRlcihmaWx0ZXJJZDogbnVtYmVyIHwgdW5kZWZpbmVkLCBkZWZlcnJlZExvYWRpbmcgPSBmYWxzZSkge1xyXG4gICAgLy8gTk9URTogSWYgd2UgY2hhbmdlIHRoZSBmaWx0ZXIsIHRoZSBncmlkIHdpbGwgYmUgcmVsb2FkZWQgaW4gdGhlIGZpbHRlcnNEcm9wZG93bkJveC5vblZhbHVlQ2hhbmdlZFxyXG4gICAgLy8gY29uc3QgZmlsdGVyQ2hhbmdlZCA9IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkICE9PSBmaWx0ZXJJZDtcclxuICAgIHRoaXMuaXNJbkZpbHRlckFwcGx5aW5nID0gdHJ1ZTtcclxuICAgIHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkID0gZmlsdGVySWQ7XHJcbiAgICB0aGlzLnVwZGF0ZUZpbHRlclBvcHVwQ29udGVudCh0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIpO1xyXG5cclxuICAgIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94Lm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZCk7XHJcblxyXG4gICAgbGV0IGdyaWREYXRhU291cmNlID0gdGhpcy5vcHRpb25zLm93bmVyLmdldERhdGFTb3VyY2UoKTtcclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyKSB7XHJcbiAgICAgIC8vIE5PVEU6IG5lZWQgdG8gcHJvY2VzcyBmaWx0ZXIgdmFsdWUgYnkgdGhlIGdldEZpbHRlckV4cHJlc3Npb24gbWV0aG9kXHJcbiAgICAgIC8vIHRvIGJlIHN1cmUgaXQgd2lsbCB3b3JrIGluIGRhdGFzb3VyY2UgKGZvciBleGFtcGxlLCB0aGUgJ2JldHdlZW4nIGNvbmRpdGlvbilcclxuICAgICAgLy8gd2lsbCBiZSBtb2RpZmllZCB0byBcIj49IGFuZCA8PVwiIGJlY2F1c2UgZGF0YSBzb3VyY2UgZG9lc24ndCBzdXBwb3J0ICdiZXR3ZWVuJy5cclxuXHJcbiAgICAgIHRoaXMuZmlsdGVyRXhwcmVzc2lvbkNhbGN1bGF0b3Iub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5maWx0ZXJTdGF0ZSk7XHJcbiAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZmlsdGVyRXhwcmVzc2lvbkNhbGN1bGF0b3IuZ2V0RmlsdGVyRXhwcmVzc2lvbigpO1xyXG5cclxuICAgICAgaWYgKGdyaWREYXRhU291cmNlLmlzTG9hZGluZygpKSB7XHJcbiAgICAgICAgY29uc3QgYXBwbHlWYWx1ZSA9ICgpID0+IHtcclxuICAgICAgICAgIGdyaWREYXRhU291cmNlLm9mZignbG9hZGluZ0NoYW5nZWQnLCBhcHBseVZhbHVlKTtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBncmlkRGF0YVNvdXJjZSA9IHRoaXMub3B0aW9ucy5vd25lci5nZXREYXRhU291cmNlKCk7XHJcbiAgICAgICAgICAgIGdyaWREYXRhU291cmNlLmZpbHRlcih2YWwpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZ3JpZERhdGFTb3VyY2Uub24oJ2xvYWRpbmdDaGFuZ2VkJywgYXBwbHlWYWx1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZ3JpZERhdGFTb3VyY2UuZmlsdGVyKHZhbCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBncmlkRGF0YVNvdXJjZS5maWx0ZXIobnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaWYgKCFmaWx0ZXJDaGFuZ2VkKSB7XHJcbiAgICBpZiAoIWRlZmVycmVkTG9hZGluZykge1xyXG4gICAgICBhd2FpdCBncmlkRGF0YVNvdXJjZS5sb2FkKCk7XHJcbiAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgdGhpcy5vcHRpb25zLm9uRmlsdGVyQXBwbGllZCAmJiB0aGlzLm9wdGlvbnMub25GaWx0ZXJBcHBsaWVkKGZpbHRlcklkKTtcclxuICAgIHRoaXMuaXNJbkZpbHRlckFwcGx5aW5nID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGludGVncmF0ZVRvR3JpZChncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQpIHtcclxuICAgIGNvbnN0IGN1cnJlbnRUb29sYmFyUHJlcGFyaW5nID0gZ3JpZC5vcHRpb24oJ29uVG9vbGJhclByZXBhcmluZycpO1xyXG5cclxuICAgIGdyaWQub3B0aW9uKCdvblRvb2xiYXJQcmVwYXJpbmcnLCAoZTogYW55KSA9PiB7XHJcbiAgICAgIGN1cnJlbnRUb29sYmFyUHJlcGFyaW5nICYmIGN1cnJlbnRUb29sYmFyUHJlcGFyaW5nKGUpO1xyXG4gICAgICB0aGlzLm9uR3JpZFRvb2xiYXJQcmVwYXJpbmcoZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25HcmlkVG9vbGJhclByZXBhcmluZzogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snb25Ub29sYmFyUHJlcGFyaW5nJ10gPSAoZSkgPT4ge1xyXG4gICAgY29uc3QgdG9vbGJhckl0ZW1zID0gZS50b29sYmFyT3B0aW9ucyAmJiBlLnRvb2xiYXJPcHRpb25zLml0ZW1zO1xyXG4gICAgaWYgKCF0b29sYmFySXRlbXMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRvb2xiYXJJdGVtcy5zcGxpY2UoMSwgMCxcclxuICAgICAgdGhpcy5maWx0ZXJzVG9vbGJhckl0ZW1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBmaWx0ZXJzVG9vbGJhckl0ZW0oKSB7XHJcbiAgICBpZiAoIXRoaXMuX2ZpbHRlcnNUb29sYmFySXRlbSkge1xyXG4gICAgICB0aGlzLl9maWx0ZXJzVG9vbGJhckl0ZW0gPSB0aGlzLmNyZWF0ZUZpbHRlcnNUb29sYmFySXRlbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9maWx0ZXJzVG9vbGJhckl0ZW07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBmaWx0ZXJQb3B1cCgpIHtcclxuICAgIGlmICghdGhpcy5fZmlsdGVyUG9wdXApIHtcclxuICAgICAgdGhpcy5fZmlsdGVyUG9wdXAgPSB0aGlzLmNyZWF0ZUZpbHRlclBvcHVwKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlclBvcHVwO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgaGFzQ2hhbmdlcygpIHtcclxuICAgIGNvbnN0IGN1cnJlbnRGaWx0ZXIgPSB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXI7XHJcblxyXG4gICAgY29uc3QgbmV3TmFtZSA9IHRoaXMuZmlsdGVyTmFtZVRleHRCb3ggJiYgdGhpcy5maWx0ZXJOYW1lVGV4dEJveC5vcHRpb24oJ3ZhbHVlJyk7XHJcbiAgICBjb25zdCBvbGROYW1lID0gY3VycmVudEZpbHRlciAmJiBjdXJyZW50RmlsdGVyLm5hbWU7XHJcblxyXG4gICAgY29uc3QgbmV3RmlsdGVyID0gdGhpcy5maWx0ZXJCdWlsZGVyICYmIHRoaXMuZmlsdGVyQnVpbGRlci5vcHRpb24oJ3ZhbHVlJyk7XHJcbiAgICBjb25zdCBvbGRGaWx0ZXIgPSBjdXJyZW50RmlsdGVyICYmIGN1cnJlbnRGaWx0ZXIuZmlsdGVyU3RhdGU7XHJcblxyXG4gICAgY29uc3QgbmV3SXNHbG9iYWwgPSB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3ggJiYgdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94Lm9wdGlvbigndmFsdWUnKTtcclxuICAgIGNvbnN0IG9sZElzR2xvYmFsID0gY3VycmVudEZpbHRlciAmJiBjdXJyZW50RmlsdGVyLmlzR2xvYmFsO1xyXG5cclxuICAgIHJldHVybiBuZXdOYW1lICE9PSBvbGROYW1lIHx8IG5ld0ZpbHRlciAhPT0gb2xkRmlsdGVyIHx8IG5ld0lzR2xvYmFsICE9PSBvbGRJc0dsb2JhbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyc1Rvb2xiYXJJdGVtKCk6IERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbSB7XHJcbiAgICBsZXQgaXNOZWVkSGFuZGxlVmFsdWVDaGFuZ2VkID0gdHJ1ZTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB3aWRnZXQ6ICdkeERyb3BEb3duQm94JyBhcyBhbnksXHJcbiAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICB0ZXh0OiAnRGF0YSBTZXRzJyxcclxuICAgICAgdmlzaWJsZTogdGhpcy5vcHRpb25zLnZpc2libGUsXHJcbiAgICAgIGNzc0NsYXNzOiAnYXBzLWZpbHRlcnNfX3Rvb2xiYXItaXRlbScsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICBlbGVtZW50QXR0cjoge2NsYXNzOiAnaXN6b2xlYS1tZCd9LFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZCxcclxuICAgICAgICB2YWx1ZUV4cHI6ICdpZCcsXHJcbiAgICAgICAgZGlzcGxheUV4cHI6ICduYW1lJyxcclxuICAgICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICAgICAgcGxhY2Vob2xkZXI6ICdOb25lJyxcclxuICAgICAgICB3aWR0aDogMjAwLFxyXG4gICAgICAgIGRyb3BEb3duT3B0aW9uczoge1xyXG4gICAgICAgICAgd2lkdGg6IDUwMFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25Jbml0aWFsaXplZDogYXN5bmMgKGUpID0+IHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94ID0gZS5jb21wb25lbnQ7XHJcbiAgICAgICAgICBjb25zdCBbLCB1c2VyU2V0dGluZ3NdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRGaWx0ZXJEcm9wZG93bkJveERhdGEoKSxcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFwc0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlci5nZXRVc2VyU2V0dGluZ3MoKVxyXG4gICAgICAgICAgXSk7XHJcblxyXG4gICAgICAgICAgdXNlclNldHRpbmdzLmRlZmF1bHRGaWx0ZXJJZCAmJiBlLmNvbXBvbmVudC5vcHRpb24oJ3ZhbHVlJywgdXNlclNldHRpbmdzLmRlZmF1bHRGaWx0ZXJJZCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvblZhbHVlQ2hhbmdlZDogYXN5bmMgKGUpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLmlzSW5GaWx0ZXJBcHBseWluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKCFpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQpIHtcclxuICAgICAgICAgICAgaXNOZWVkSGFuZGxlVmFsdWVDaGFuZ2VkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsZXQgdmFsdWUgPSBlLnZhbHVlO1xyXG4gICAgICAgICAgY29uc3QgaXNGaWx0ZXJBcHBsaWVkID0gYXdhaXQgdGhpcy50cnlBcHBseUZpbHRlcih2YWx1ZSk7XHJcblxyXG4gICAgICAgICAgaWYgKCFpc0ZpbHRlckFwcGxpZWQpIHtcclxuICAgICAgICAgICAgaXNOZWVkSGFuZGxlVmFsdWVDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHZhbHVlID0gZS5wcmV2aW91c1ZhbHVlO1xyXG4gICAgICAgICAgICBlLmNvbXBvbmVudC5vcHRpb24oJ3ZhbHVlJywgdmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuZmlsdGVyc0RhdGFHcmlkICYmIHRoaXMuZmlsdGVyc0RhdGFHcmlkLnNlbGVjdFJvd3ModmFsdWUsIGZhbHNlKTtcclxuICAgICAgICAgIHRoaXMuY3VycmVudEZpbHRlclRpdGxlICYmIHRoaXMuY3VycmVudEZpbHRlclRpdGxlLm9wdGlvbigndmFsdWUnLFxyXG4gICAgICAgICAgICBlLmNvbXBvbmVudC5vcHRpb24oJ3RleHQnKSB8fCBlLmNvbXBvbmVudC5vcHRpb24oJ3BsYWNlaG9sZGVyJykpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25PcGVuZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWUuY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmZpbHRlcnNEYXRhR3JpZCAmJiB0aGlzLmZpbHRlcnNEYXRhR3JpZC5zZWxlY3RSb3dzKGUuY29tcG9uZW50Lm9wdGlvbigndmFsdWUnKSwgZmFsc2UpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29udGVudFRlbXBsYXRlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFlLmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5maWx0ZXJzRGF0YUdyaWQgPSB0aGlzLmNyZWF0ZUZpbHRlcnNEYXRhR3JpZChlLmNvbXBvbmVudCk7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRGaWx0ZXJUaXRsZSA9IHRoaXMuY3JlYXRlQ3VycmVudEZpbHRlclRpdGxlKGUuY29tcG9uZW50KTtcclxuICAgICAgICAgIHRoaXMubmV3RmlsdGVyQnV0dG9uID0gdGhpcy5jcmVhdGVOZXdGaWx0ZXJCdXR0b24oKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRlbnRIZWFkZXIgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgLmFkZENsYXNzKCdhcHMtZmlsdGVyc19faGVhZGVyJylcclxuICAgICAgICAgICAgLmFwcGVuZCh0aGlzLmN1cnJlbnRGaWx0ZXJUaXRsZS5lbGVtZW50KCkpXHJcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy5uZXdGaWx0ZXJCdXR0b24uZWxlbWVudCgpKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRlbnQgPSAkKCc8ZGl2IC8+JykuY3NzKCdoZWlnaHQnLCAnMTAwJScpXHJcbiAgICAgICAgICAgIC5hcHBlbmQoZHJvcGRvd25Db250ZW50SGVhZGVyKVxyXG4gICAgICAgICAgICAuYXBwZW5kKHRoaXMuZmlsdGVyc0RhdGFHcmlkLmVsZW1lbnQoKSk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIGRyb3Bkb3duQ29udGVudDtcclxuICAgICAgICB9LFxyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveE9wdGlvbnNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZpbHRlcnNEYXRhR3JpZChkcm9wZG93bkJveE93bmVyOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3gpOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKVxyXG4gICAgICAuZHhEYXRhR3JpZCh7XHJcbiAgICAgICAgZGF0YVNvdXJjZTogZHJvcGRvd25Cb3hPd25lci5nZXREYXRhU291cmNlKCksXHJcbiAgICAgICAgcmVtb3RlT3BlcmF0aW9uczogZmFsc2UsXHJcbiAgICAgICAgZWRpdGluZzoge1xyXG4gICAgICAgICAgYWxsb3dBZGRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgYWxsb3dVcGRhdGluZzogdHJ1ZSxcclxuICAgICAgICAgIGFsbG93RGVsZXRpbmc6IHRydWUsXHJcbiAgICAgICAgICBtb2RlOiAnY2VsbCcsXHJcbiAgICAgICAgICB1c2VJY29uczogdHJ1ZSxcclxuICAgICAgICAgIHRleHRzOiB7XHJcbiAgICAgICAgICAgIGNvbmZpcm1EZWxldGVNZXNzYWdlOiAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGRhdGEgc2V0PydcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHdvcmRXcmFwRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBjb2x1bW5zOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ25hbWUnLFxyXG4gICAgICAgICAgICBhbGxvd0VkaXRpbmc6IGZhbHNlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdpc0RlZmF1bHQnLFxyXG4gICAgICAgICAgICBjYXB0aW9uOiAnSXMgRGVmYXVsdCcsXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnYm9vbGVhbicsXHJcbiAgICAgICAgICAgIHdpZHRoOiA4MCxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ2lzR2xvYmFsJyxcclxuICAgICAgICAgICAgY2FwdGlvbjogJ0lzIEdsb2JhbCcsXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnYm9vbGVhbicsXHJcbiAgICAgICAgICAgIHdpZHRoOiA3MFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgdHlwZTogJ2J1dHRvbnMnLFxyXG4gICAgICAgICAgICBidXR0b25zOiBbXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWNvbjogJ2VkaXQnLFxyXG4gICAgICAgICAgICAgICAgaGludDogJ0VkaXQnLFxyXG4gICAgICAgICAgICAgICAgb25DbGljazogYXN5bmMgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYgKCFlLnJvdyB8fCAhZS5yb3cua2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICBjb25zdCBpc0ZpbHRlckFwcGxpZWQgPSBhd2FpdCB0aGlzLnRyeUFwcGx5RmlsdGVyKGUucm93LmtleSk7XHJcbiAgICAgICAgICAgICAgICAgIGlzRmlsdGVyQXBwbGllZCAmJiAhdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ3Zpc2libGUnKVxyXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMub3BlbkVkaXRGaWx0ZXJQb3B1cCh0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgJ2RlbGV0ZSdcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIF0sXHJcbiAgICAgICAga2V5Ym9hcmROYXZpZ2F0aW9uOiB7XHJcbiAgICAgICAgICBlZGl0T25LZXlQcmVzczogZmFsc2UsXHJcbiAgICAgICAgICBlbmFibGVkOiBmYWxzZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2hvd0NvbHVtbkhlYWRlcnM6IHRydWUsXHJcbiAgICAgICAgaG92ZXJTdGF0ZUVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgZm9jdXNlZFJvd0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIHNob3dCb3JkZXJzOiBmYWxzZSxcclxuICAgICAgICBzaG93Q29sdW1uTGluZXM6IGZhbHNlLFxyXG4gICAgICAgIHNlbGVjdGlvbjogeyBtb2RlOiAnc2luZ2xlJyB9LFxyXG4gICAgICAgIGhlaWdodDogJ2NhbGMoMTAwJSAtIDUxcHgpJyxcclxuICAgICAgICBzY3JvbGxpbmc6IHsgbW9kZTogJ3N0YW5kYXJkJyB9LFxyXG4gICAgICAgIHBhZ2luZzogeyBlbmFibGVkOiBmYWxzZSB9LFxyXG4gICAgICAgIG5vRGF0YVRleHQ6ICdObyBkYXRhIHNldHMnLFxyXG4gICAgICAgIG9uU2VsZWN0aW9uQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICAgIGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCd2YWx1ZScsIGUuc2VsZWN0ZWRSb3dLZXlzID8gZS5zZWxlY3RlZFJvd0tleXNbMF0gOiBudWxsKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uRWRpdG9yUHJlcGFyaW5nOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGUuZGF0YUZpZWxkID09PSAnaXNHbG9iYWwnKSB7XHJcbiAgICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5kaXNhYmxlZCA9ICF0aGlzLm9wdGlvbnMuY2FuQ3JlYXRlR2xvYmFsRmlsdGVycztcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG9uVmFsdWVDaGFuZ2VkID0gZS5lZGl0b3JPcHRpb25zLm9uVmFsdWVDaGFuZ2VkO1xyXG4gICAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25WYWx1ZUNoYW5nZWQgPSBhc3luYyAob3B0KSA9PiB7XHJcbiAgICAgICAgICAgICAgZS5jb21wb25lbnQuYmVnaW5DdXN0b21Mb2FkaW5nKCdVcGRhdGluZycpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIudXBkYXRlRmlsdGVyKGUucm93LmRhdGEuaWQsIHsgaXNHbG9iYWw6IG9wdC52YWx1ZSB9KTtcclxuICAgICAgICAgICAgICBlLmNvbXBvbmVudC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcblxyXG4gICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkKG9wdCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkNlbGxQcmVwYXJlZDogKGUpID0+IHtcclxuICAgICAgICAgIGlmIChlLmNvbHVtbi50eXBlICE9PSAnYnV0dG9ucycgfHwgIWUuZGF0YSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZS5jb2x1bW4udHlwZSA9PT0gJ2J1dHRvbnMnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuYWJsZWQgPSAhZS5kYXRhLmlzR2xvYmFsXHJcbiAgICAgICAgICAgICAgfHwgKGUuZGF0YS5pc0dsb2JhbCAmJiB0aGlzLm9wdGlvbnMuY2FuQ3JlYXRlR2xvYmFsRmlsdGVycyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWVuYWJsZWQpIHtcclxuICAgICAgICAgICAgICBBcnJheS5mcm9tKGUuY2VsbEVsZW1lbnQuY2hpbGRyZW4oKSkuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgICAgICAgICAgJChjKS5jc3Moe1xyXG4gICAgICAgICAgICAgICAgICBjb2xvcjogJyNkZGQgIWltcG9ydGFudCcsXHJcbiAgICAgICAgICAgICAgICAgIGN1cnNvcjogJ2RlZmF1bHQnXHJcbiAgICAgICAgICAgICAgICB9KS5vZmYoJ2NsaWNrJyk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uUm93VXBkYXRpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWUua2V5IHx8IGUubmV3RGF0YS5pc0RlZmF1bHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgZGVmYXVsdEZpbHRlciA9IGUuY29tcG9uZW50LmdldERhdGFTb3VyY2UoKS5pdGVtcygpLmZpbmQoKGZpbHRlcikgPT4gZmlsdGVyLmlzRGVmYXVsdCk7XHJcbiAgICAgICAgICBpZiAoZGVmYXVsdEZpbHRlcikge1xyXG4gICAgICAgICAgICBkZWZhdWx0RmlsdGVyLmlzRGVmYXVsdCA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5hcHNDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIudXBkYXRlVXNlclNldHRpbmdzKHtcclxuICAgICAgICAgICAgZGVmYXVsdEZpbHRlcklkOiBlLm5ld0RhdGEuaXNEZWZhdWx0ID8gZS5rZXkgOiB1bmRlZmluZWRcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25Sb3dSZW1vdmluZzogKGUpID0+IHtcclxuICAgICAgICAgIGlmICghZS5rZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuZGVsZXRlRmlsdGVyKGUua2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5keERhdGFHcmlkKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVDdXJyZW50RmlsdGVyVGl0bGUoZHJvcGRvd25Cb3hPd25lcjogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94KTogRGV2RXhwcmVzcy51aS5keFRleHRCb3gge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy1maWx0ZXJzX19jdXJyZW50LWZpbHRlcicpXHJcbiAgICAgIC5keFRleHRCb3goe1xyXG4gICAgICAgIHZhbHVlOiBkcm9wZG93bkJveE93bmVyLm9wdGlvbigndGV4dCcpIHx8IGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCdwbGFjZWhvbGRlcicpLFxyXG4gICAgICAgIHJlYWRPbmx5OiB0cnVlXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keFRleHRCb3goJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZU5ld0ZpbHRlckJ1dHRvbigpOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHtcclxuICAgIHJldHVybiAkKCc8YnV0dG9uIC8+JylcclxuICAgICAgLmFkZENsYXNzKCdhcHMtZmlsdGVyc19fYWRkLW5ldy1maWx0ZXIgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keEJ1dHRvbih7XHJcbiAgICAgICAgdGV4dDogJ05ldyBEYXRhIFNldCcsXHJcbiAgICAgICAgdHlwZTogJ25vcm1hbCcsXHJcbiAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5vcGVuTmV3RmlsdGVyUG9wdXAoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGljb246ICdwbHVzJ1xyXG4gICAgICB9KVxyXG4gICAgICAuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZpbHRlclBvcHVwKCkge1xyXG4gICAgY29uc3QgJHBvcHVwUm9vdCA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbygnYm9keScpO1xyXG4gICAgbGV0IGlzUG9wdXBIaWRpbmdDb25maXJtZWQgPSBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gJHBvcHVwUm9vdC5keFBvcHVwKHtcclxuICAgICAgY29udGFpbmVyOiB0aGlzLm9wdGlvbnMub3duZXIuZWxlbWVudCgpLFxyXG4gICAgICBzaGFkaW5nOiBmYWxzZSxcclxuICAgICAgcmVzaXplRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgd2lkdGg6IDY1MCxcclxuICAgICAgaGVpZ2h0OiA1MDAsXHJcbiAgICAgIG9uU2hvd2luZzogKGUpID0+IHtcclxuICAgICAgICB0aGlzLmZpbHRlcnNEcm9wZG93bkJveCAmJiB0aGlzLmZpbHRlcnNEcm9wZG93bkJveC5jbG9zZSgpO1xyXG4gICAgICB9LFxyXG4gICAgICBvbkhpZGluZzogYXN5bmMgKGUpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuaGFzQ2hhbmdlcyB8fCBpc1BvcHVwSGlkaW5nQ29uZmlybWVkKSB7XHJcbiAgICAgICAgICBpc1BvcHVwSGlkaW5nQ29uZmlybWVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZS5jYW5jZWwgPSB0cnVlO1xyXG4gICAgICAgIGlzUG9wdXBIaWRpbmdDb25maXJtZWQgPSBhd2FpdCB0aGlzLmNvbmZpcm1DaGFuZ2VzTG9zcygpO1xyXG4gICAgICAgIGlmIChpc1BvcHVwSGlkaW5nQ29uZmlybWVkKSB7XHJcbiAgICAgICAgICBlLmNvbXBvbmVudC5oaWRlKCk7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcnNEcm9wZG93bkJveCAmJiB0aGlzLmZpbHRlcnNEcm9wZG93bkJveC5vcGVuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KS5keFBvcHVwKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJOYW1lVGV4dEJveCgpIHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JylcclxuICAgICAgLmR4VGV4dEJveCh7XHJcbiAgICAgICAgcGxhY2Vob2xkZXI6ICdFbnRlciBEYXRhIFNldCBOYW1lLi4uJyxcclxuICAgICAgfSlcclxuICAgICAgLmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVySXNHbG9iYWxDaGVja2JveCgpIHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JylcclxuICAgICAgLmR4Q2hlY2tCb3goe1xyXG4gICAgICAgIHRleHQ6ICdHbG9iYWwgZGF0YSBzZXQnLFxyXG4gICAgICB9KVxyXG4gICAgICAuZHhDaGVja0JveCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RmxhdENvbHVtbnNMaXN0KHNvdXJjZUNvbHVtbnMsIC4uLnJlc3QpIHtcclxuICAgIGxldCByZXN1bHQgPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHNvdXJjZUNvbHVtbiBvZiBzb3VyY2VDb2x1bW5zKSB7XHJcbiAgICAgIGlmIChzb3VyY2VDb2x1bW4uY29sdW1ucyAmJiBzb3VyY2VDb2x1bW4uY29sdW1ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3QgbmVzdGVkQ29sdW1ucyA9IHRoaXMuZ2V0RmxhdENvbHVtbnNMaXN0KHNvdXJjZUNvbHVtbi5jb2x1bW5zKTtcclxuXHJcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdChuZXN0ZWRDb2x1bW5zKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBjb2x1bW4gPSAkLmV4dGVuZCh7fSwgc291cmNlQ29sdW1uKTtcclxuXHJcbiAgICAgICAgaWYgKGNvbHVtbi5kYXRhVHlwZSA9PT0gJ2RhdGUnIHx8IGNvbHVtbi5kYXRhVHlwZSA9PT0gJ2RhdGV0aW1lJykge1xyXG4gICAgICAgICAgY29uc3QgaXNEYXRlVGltZSA9IGNvbHVtbi5kYXRhVHlwZSA9PT0gJ2RhdGV0aW1lJztcclxuICAgICAgICAgIGNvbnN0IGRhdGVGb3JtYXQgPSAnZGQgTU1NIHl5JztcclxuICAgICAgICAgIGNvbnN0IGRhdGVUaW1lRm9ybWF0ID0gJ2hoOm1tLCBkZCBNTU0geXknO1xyXG4gICAgICAgICAgY29uc3QgZGlzcGxheUZvcm1hdCA9IGlzRGF0ZVRpbWUgPyBkYXRlVGltZUZvcm1hdCA6IGRhdGVGb3JtYXQ7XHJcblxyXG4gICAgICAgICAgY29uc3QgcGFyc2VEYXRlVGltZSA9IChkYXRlU3RyOiBzdHJpbmcpOiBEYXRlID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZVRpbWVQYXJ0cyA9IGRhdGVTdHIuc3BsaXQoJywgJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBEZXZFeHByZXNzLmxvY2FsaXphdGlvbi5wYXJzZURhdGUoZGF0ZVRpbWVQYXJ0c1sxXSwgZGF0ZUZvcm1hdCkgfHwgbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGlmIChkYXRlKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdGltZVBhcnRzID0gZGF0ZVRpbWVQYXJ0c1swXS5zcGxpdCgnOicpO1xyXG5cclxuICAgICAgICAgICAgICBkYXRlLnNldEhvdXJzKHBhcnNlSW50KHRpbWVQYXJ0c1swXSkpO1xyXG4gICAgICAgICAgICAgIGRhdGUuc2V0TWludXRlcyhwYXJzZUludCh0aW1lUGFydHNbMV0pKTtcclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuIGRhdGU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgY29sdW1uLmZvcm1hdCA9IGRpc3BsYXlGb3JtYXQ7XHJcbiAgICAgICAgICBjb2x1bW4uZWRpdG9yVGVtcGxhdGUgPSAoZSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gJCgnPGRpdiAvPicpLmR4RGF0ZUJveCh7XHJcbiAgICAgICAgICAgICAgZGlzcGxheUZvcm1hdCxcclxuICAgICAgICAgICAgICB0eXBlOiBpc0RhdGVUaW1lID8gJ2RhdGV0aW1lJyA6ICdkYXRlJyxcclxuICAgICAgICAgICAgICB3aWR0aDogMTUwLFxyXG4gICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoeyB2YWx1ZSB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBlLnNldFZhbHVlKERldkV4cHJlc3MubG9jYWxpemF0aW9uLmZvcm1hdERhdGUodmFsdWUsIGRpc3BsYXlGb3JtYXQpKTtcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIHZhbHVlOiAoaXNEYXRlVGltZSA/IHBhcnNlRGF0ZVRpbWUoZS52YWx1ZSkgOiBEZXZFeHByZXNzLmxvY2FsaXphdGlvbi5wYXJzZURhdGUoZS52YWx1ZSwgZGlzcGxheUZvcm1hdCkpXHJcbiAgICAgICAgICAgICAgICB8fCBudWxsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIGNvbHVtbi5maWx0ZXJPcGVyYXRpb25zID0gWyc9JywgJzw+JywgJzwnLCAnPicsICc8PScsICc+PScsICdpc2JsYW5rJywgJ2lzbm90YmxhbmsnXTtcclxuICAgICAgICAgIGNvbHVtbi5jYWxjdWxhdGVGaWx0ZXJFeHByZXNzaW9uID0gZnVuY3Rpb24oZmlsdGVyVmFsdWUpIHtcclxuICAgICAgICAgICAgY29uc3QgYXJncyA9IFtzb3VyY2VDb2x1bW5zLCAuLi5yZXN0XTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhcmdzWzBdKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGlzRGF0ZVRpbWUpIHtcclxuICAgICAgICAgICAgICAgIGFyZ3NbMF0gPSBwYXJzZURhdGVUaW1lKGFyZ3NbMF0pO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhcmdzWzBdID0gRGV2RXhwcmVzcy5sb2NhbGl6YXRpb24ucGFyc2VEYXRlKGZpbHRlclZhbHVlLCBkaXNwbGF5Rm9ybWF0KSB8fCBudWxsO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdENhbGN1bGF0ZUZpbHRlckV4cHJlc3Npb24oLi4uYXJncyk7XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVzdWx0LnB1c2goY29sdW1uKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQuc29ydCgoY29sMSwgY29sMikgPT4ge1xyXG4gICAgICBjb25zdCBjYXB0aW9uMSA9IChjb2wxLmNhcHRpb24gfHwgJycpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIGNvbnN0IGNhcHRpb24yID0gKGNvbDIuY2FwdGlvbiB8fCAnJykudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICAgIGlmIChjYXB0aW9uMSA8IGNhcHRpb24yKSB7XHJcbiAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY2FwdGlvbjEgPiBjYXB0aW9uMikge1xyXG4gICAgICAgIHJldHVybiAxO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJCdWlsZGVyKCkge1xyXG4gICAgY29uc3QgZmlsdGVyQnVpbGRlciA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAuZHhGaWx0ZXJCdWlsZGVyKHtcclxuICAgICAgICBmaWVsZHM6IHRoaXMuZ2V0RmxhdENvbHVtbnNMaXN0KHRoaXMub3B0aW9ucy5vd25lci5vcHRpb24oJ2NvbHVtbnMnKSlcclxuICAgICAgfSlcclxuICAgICAgLmR4RmlsdGVyQnVpbGRlcignaW5zdGFuY2UnKTtcclxuXHJcbiAgICByZXR1cm4gZmlsdGVyQnVpbGRlcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyUG9wdXBDb250ZW50KGZpbHRlcj86IElDb250cm9sRGlzcGxheUZpbHRlcikge1xyXG4gICAgY29uc3QgJHBvcHVwQ29udGVudCA9ICQoJzxkaXYgLz4nKS5oZWlnaHQoJzEwMCUnKTtcclxuXHJcbiAgICBjb25zdCAkbmFtZUNvbnRhaW5lciA9ICQoJzxkaXYgY2xhc3M9XCJhcHMtZmlsdGVyc19fbmFtZS1jb250YWluZXJcIiAvPicpLmhlaWdodCgnMzZweCcpO1xyXG5cclxuICAgIC8vIE5PVEU6IFJlY3JlYXRlIHdpZGdldHNcclxuICAgIHRoaXMuZmlsdGVyTmFtZVRleHRCb3ggPSB0aGlzLmNyZWF0ZUZpbHRlck5hbWVUZXh0Qm94KCk7XHJcbiAgICB0aGlzLmZpbHRlckJ1aWxkZXIgPSB0aGlzLmNyZWF0ZUZpbHRlckJ1aWxkZXIoKTtcclxuICAgIHRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveCA9IHRoaXMuY3JlYXRlRmlsdGVySXNHbG9iYWxDaGVja2JveCgpO1xyXG5cclxuICAgIHRoaXMuZmlsdGVyTmFtZVRleHRCb3gub3B0aW9uKCd2YWx1ZScsIGZpbHRlciAmJiBmaWx0ZXIubmFtZSk7XHJcbiAgICB0aGlzLmZpbHRlck5hbWVUZXh0Qm94LmVsZW1lbnQoKS5hcHBlbmRUbygkbmFtZUNvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94Lm9wdGlvbigndmFsdWUnLCBmaWx0ZXIgJiYgZmlsdGVyLmlzR2xvYmFsKTtcclxuICAgIHRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveC5lbGVtZW50KCkuYXBwZW5kVG8oJG5hbWVDb250YWluZXIpO1xyXG4gICAgdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94Lm9wdGlvbignZGlzYWJsZWQnLCAhdGhpcy5vcHRpb25zLmNhbkNyZWF0ZUdsb2JhbEZpbHRlcnMpO1xyXG5cclxuICAgICRuYW1lQ29udGFpbmVyLmFwcGVuZFRvKCRwb3B1cENvbnRlbnQpO1xyXG5cclxuICAgIHRoaXMuZmlsdGVyQnVpbGRlci5vcHRpb24oJ3ZhbHVlJywgZmlsdGVyICYmIGZpbHRlci5maWx0ZXJTdGF0ZSk7XHJcblxyXG4gICAgY29uc3QgJGZpbHRlckJ1aWxkZXJDb250YWluZXIgPSAkKCc8ZGl2IC8+JykuaGVpZ2h0KCdjYWxjKDEwMCUgLSAzNnB4KScpLmFwcGVuZFRvKCRwb3B1cENvbnRlbnQpO1xyXG5cclxuICAgIHRoaXMuZmlsdGVyQnVpbGRlci5lbGVtZW50KCkuYXBwZW5kVG8oJGZpbHRlckJ1aWxkZXJDb250YWluZXIpO1xyXG5cclxuICAgICRmaWx0ZXJCdWlsZGVyQ29udGFpbmVyLmR4U2Nyb2xsVmlldyh7XHJcbiAgICAgIHNjcm9sbEJ5Q29udGVudDogdHJ1ZVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuICRwb3B1cENvbnRlbnQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZpbHRlclBvcHVwVG9vbGJhckl0ZW1zKGZpbHRlcj86IElDb250cm9sRGlzcGxheUZpbHRlcik6IERldkV4cHJlc3MudWkuZHhQb3B1cC5Ub29sYmFySXRlbVtdIHtcclxuICAgIHJldHVybiBmaWx0ZXIgPyBbXHJcbiAgICAgIHRoaXMuY3JlYXRlVXBkYXRlRmlsdGVyUG9wdXBUb29sYmFySXRlbSgpLFxyXG4gICAgICB0aGlzLmNyZWF0ZVNhdmVGaWx0ZXJBc05ld1BvcHVwVG9vbGJhckl0ZW0oKSxcclxuICAgICAgdGhpcy5jcmVhdGVSZXNldEZpbHRlclBvcHVwVG9vbGJhckl0ZW0oKSxcclxuICAgICAgdGhpcy5jcmVhdGVEZWxldGVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKClcclxuICAgIF0gOiBbdGhpcy5jcmVhdGVTYXZlRmlsdGVyUG9wdXBUb29sYmFySXRlbSgpXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2F2ZUZpbHRlclBvcHVwVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFBvcHVwLlRvb2xiYXJJdGVtIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIHRleHQ6ICdBcHBseSBhbmQgU2F2ZScsXHJcbiAgICAgICAgb25DbGljazogdGhpcy5jcmVhdGVOZXdGaWx0ZXIuYmluZCh0aGlzKSxcclxuICAgICAgICBpY29uOiAnc2F2ZSdcclxuICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlVXBkYXRlRmlsdGVyUG9wdXBUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuVG9vbGJhckl0ZW0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgdGV4dDogJ0FwcGx5IGFuZCBVcGRhdGUnLFxyXG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcih0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaWNvbjogJ3NhdmUnXHJcbiAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVNhdmVGaWx0ZXJBc05ld1BvcHVwVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFBvcHVwLlRvb2xiYXJJdGVtIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIHRleHQ6ICdTYXZlIEFzIE5ldycsXHJcbiAgICAgICAgb25DbGljazogdGhpcy5jcmVhdGVOZXdGaWx0ZXIuYmluZCh0aGlzKSxcclxuICAgICAgICBpY29uOiAnc2F2ZSdcclxuICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlUmVzZXRGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCk6IERldkV4cHJlc3MudWkuZHhQb3B1cC5Ub29sYmFySXRlbSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICB0ZXh0OiAnUmVzZXQnLFxyXG4gICAgICAgIG9uQ2xpY2s6IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIGlmICghdGhpcy5oYXNDaGFuZ2VzIHx8ICF0aGlzLmZpbHRlckJ1aWxkZXIgfHwgIXRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgaXNDb25maXJtZWQgPSBhd2FpdCBEZXZFeHByZXNzLnVpLmRpYWxvZy5jb25maXJtKFxyXG4gICAgICAgICAgICAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlc2V0IHVuc2F2ZWQgY2hhbmdlcz8nLFxyXG4gICAgICAgICAgICAnUmVzZXQgdGhlIGRhdGEgc2V0J1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGlmICghaXNDb25maXJtZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMucmVzZXRDaGFuZ2VzKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBpY29uOiAndW5kbydcclxuICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRGVsZXRlRmlsdGVyUG9wdXBUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuVG9vbGJhckl0ZW0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgdGV4dDogJ0RlbGV0ZSBEYXRhIFNldCcsXHJcbiAgICAgICAgb25DbGljazogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGlzQ29uZmlybWVkID0gYXdhaXQgRGV2RXhwcmVzcy51aS5kaWFsb2cuY29uZmlybShcclxuICAgICAgICAgICAgYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhlIFwiJHt0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIubmFtZX1cIiBkYXRhIHNldD9gLFxyXG4gICAgICAgICAgICAnRGVsZXRlIHRoZSBkYXRhIHNldCdcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpZiAoIWlzQ29uZmlybWVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZUZpbHRlcih0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZCk7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlclBvcHVwLmhpZGUoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGljb246ICd0cmFzaCdcclxuICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgb3Blbk5ld0ZpbHRlclBvcHVwKCkge1xyXG4gICAgY29uc3QgaXNGaWx0ZXJBcHBsaWVkID0gYXdhaXQgdGhpcy50cnlBcHBseUZpbHRlcih1bmRlZmluZWQpO1xyXG4gICAgaWYgKCFpc0ZpbHRlckFwcGxpZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlRmlsdGVyUG9wdXBDb250ZW50KCk7XHJcbiAgICB0aGlzLmZpbHRlclBvcHVwLnNob3coKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb3BlbkVkaXRGaWx0ZXJQb3B1cChmaWx0ZXI6IElDb250cm9sRGlzcGxheUZpbHRlcikge1xyXG4gICAgdGhpcy51cGRhdGVGaWx0ZXJQb3B1cENvbnRlbnQoZmlsdGVyKTtcclxuICAgIHRoaXMuZmlsdGVyUG9wdXAuc2hvdygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVGaWx0ZXJQb3B1cENvbnRlbnQoZmlsdGVyPzogSUNvbnRyb2xEaXNwbGF5RmlsdGVyKSB7XHJcbiAgICBjb25zdCBjdXJyZW50QW5pbWF0aW9uID0gdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ2FuaW1hdGlvbicpO1xyXG5cclxuICAgIHRoaXMuZmlsdGVyUG9wdXAub3B0aW9uKCdhbmltYXRpb24nLCB1bmRlZmluZWQpO1xyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ3RpdGxlJywgZmlsdGVyID8gYEVkaXQgdGhlIFwiJHtmaWx0ZXIubmFtZX1cIiBkYXRhIHNldGAgOiAnQ3JlYXRlIGEgbmV3IGRhdGEgc2V0Jyk7XHJcbiAgICB0aGlzLmZpbHRlclBvcHVwLm9wdGlvbignY29udGVudFRlbXBsYXRlJywgKCkgPT4gdGhpcy5jcmVhdGVGaWx0ZXJQb3B1cENvbnRlbnQoZmlsdGVyKSk7XHJcbiAgICB0aGlzLmZpbHRlclBvcHVwLm9wdGlvbigndG9vbGJhckl0ZW1zJywgdGhpcy5jcmVhdGVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtcyhmaWx0ZXIpKTtcclxuICAgIHRoaXMuZmlsdGVyUG9wdXAucmVwYWludCgpO1xyXG5cclxuICAgIHRoaXMuZmlsdGVyUG9wdXAub3B0aW9uKCdhbmltYXRpb24nLCBjdXJyZW50QW5pbWF0aW9uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlTmV3RmlsdGVyKCkge1xyXG4gICAgaWYgKCF0aGlzLmZpbHRlck5hbWVUZXh0Qm94IHx8ICF0aGlzLmZpbHRlckJ1aWxkZXIgfHwgIXRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZmlsdGVyTmFtZSA9IHRoaXMuZmlsdGVyTmFtZVRleHRCb3gub3B0aW9uKCd2YWx1ZScpO1xyXG4gICAgY29uc3QgZmlsdGVyQnVpbGRlclN0YXRlID0gdGhpcy5maWx0ZXJCdWlsZGVyLm9wdGlvbigndmFsdWUnKTtcclxuICAgIGNvbnN0IGlzRGVmYXVsdCA9IGZhbHNlO1xyXG4gICAgY29uc3QgaXNHbG9iYWwgPSB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCd2YWx1ZScpO1xyXG5cclxuICAgIGlmICghZmlsdGVyTmFtZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY29udHJvbERpc3BsYXlGaWx0ZXIgPSBhd2FpdCB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmNyZWF0ZU5ld0ZpbHRlcihcclxuICAgICAgZmlsdGVyTmFtZSwgZmlsdGVyQnVpbGRlclN0YXRlLCBpc0RlZmF1bHQsIGlzR2xvYmFsXHJcbiAgICApO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkRmlsdGVyRHJvcGRvd25Cb3hEYXRhKCk7XHJcbiAgICBhd2FpdCB0aGlzLmFwcGx5RmlsdGVyKGNvbnRyb2xEaXNwbGF5RmlsdGVyLmlkKTtcclxuXHJcbiAgICBub3RpZnkoJ0NyZWF0ZWQnLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlRmlsdGVyKGZpbHRlcjogSUNvbnRyb2xEaXNwbGF5RmlsdGVyKSB7XHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyTmFtZVRleHRCb3ggfHwgIXRoaXMuZmlsdGVyQnVpbGRlciB8fCAhdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmaWx0ZXJOYW1lID0gdGhpcy5maWx0ZXJOYW1lVGV4dEJveC5vcHRpb24oJ3ZhbHVlJyk7XHJcbiAgICBjb25zdCBmaWx0ZXJTdGF0ZSA9IHRoaXMuZmlsdGVyQnVpbGRlci5vcHRpb24oJ3ZhbHVlJyk7XHJcbiAgICBjb25zdCBpc0dsb2JhbCA9IHRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveC5vcHRpb24oJ3ZhbHVlJyk7XHJcblxyXG4gICAgaWYgKCFmaWx0ZXJOYW1lKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpc1VwZGF0ZWQgPSBhd2FpdCB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLnVwZGF0ZUZpbHRlcihmaWx0ZXIuaWQsIHtcclxuICAgICAgbmFtZTogZmlsdGVyTmFtZSxcclxuICAgICAgZmlsdGVyU3RhdGUsXHJcbiAgICAgIGlzR2xvYmFsXHJcbiAgICB9KTtcclxuICAgIGlmICghaXNVcGRhdGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBUT0RPOiB1cGRhdGUgdGl0bGVcclxuICAgIG5vdGlmeSgnVXBkYXRlZCcsIHRydWUpO1xyXG4gICAgYXdhaXQgdGhpcy5hcHBseUZpbHRlcih0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIuaWQpO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkRmlsdGVyRHJvcGRvd25Cb3hEYXRhKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGRlbGV0ZUZpbHRlcihmaWx0ZXJJZDogbnVtYmVyKSB7XHJcbiAgICBhd2FpdCB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmRlbGV0ZUZpbHRlcihmaWx0ZXJJZCk7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLm9uRmlsdGVyRGVsZXRlZCkge1xyXG4gICAgICB0aGlzLm9wdGlvbnMub25GaWx0ZXJEZWxldGVkKGZpbHRlcklkKTtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCB0aGlzLmFwcGx5RmlsdGVyKHVuZGVmaW5lZCk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRGaWx0ZXJEcm9wZG93bkJveERhdGEoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzZXRDaGFuZ2VzKCkge1xyXG4gICAgdGhpcy5maWx0ZXJOYW1lVGV4dEJveC5vcHRpb24oJ3ZhbHVlJywgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyLm5hbWUpO1xyXG4gICAgdGhpcy5maWx0ZXJCdWlsZGVyLm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIuZmlsdGVyU3RhdGUpO1xyXG4gICAgdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94Lm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIuaXNHbG9iYWwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBsb2FkRmlsdGVyRHJvcGRvd25Cb3hEYXRhKCkge1xyXG4gICAgaWYgKCF0aGlzLmZpbHRlcnNEcm9wZG93bkJveCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgW3VzZXJTZXR0aW5ncywgZmlsdGVyc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXHJcbiAgICAgIHRoaXMub3B0aW9ucy5hcHNDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIuZ2V0VXNlclNldHRpbmdzKCksXHJcbiAgICAgIHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuZ2V0RmlsdGVycygpXHJcbiAgICBdKTtcclxuXHJcbiAgICBpZiAodXNlclNldHRpbmdzLmRlZmF1bHRGaWx0ZXJJZCkge1xyXG4gICAgICBjb25zdCBkZWZhdWx0RmlsdGVyID0gZmlsdGVycy5maW5kKChmKSA9PiBmLmlkID09PSB1c2VyU2V0dGluZ3MuZGVmYXVsdEZpbHRlcklkKTtcclxuICAgICAgaWYgKGRlZmF1bHRGaWx0ZXIpIHtcclxuICAgICAgICAoZGVmYXVsdEZpbHRlciBhcyBhbnkpLmlzRGVmYXVsdCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkYXRhU291cmNlID0gbmV3IERldkV4cHJlc3MuZGF0YS5BcnJheVN0b3JlKHtcclxuICAgICAga2V5OiAnaWQnLFxyXG4gICAgICBkYXRhOiBmaWx0ZXJzXHJcbiAgICB9KTtcclxuICAgIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94Lm9wdGlvbignZGF0YVNvdXJjZScsIGRhdGFTb3VyY2UpO1xyXG4gICAgdGhpcy5maWx0ZXJzRGF0YUdyaWQgJiYgdGhpcy5maWx0ZXJzRGF0YUdyaWQub3B0aW9uKCdkYXRhU291cmNlJywgZGF0YVNvdXJjZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGNvbmZpcm1DaGFuZ2VzTG9zcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIC8vIE5PVEU6IERlbGF5IGZvciBwb3B1cCB2aXNpYmlsaXR5IGNoZWNraW5nXHJcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIDApKTtcclxuICAgIGlmICghdGhpcy5oYXNDaGFuZ2VzIHx8ICF0aGlzLmZpbHRlclBvcHVwLm9wdGlvbigndmlzaWJsZScpKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBEZXZFeHByZXNzLnVpLmRpYWxvZy5jb25maXJtKFxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gICAgICAnWW91IGhhdmUgdW5zYXZlZCBjaGFuZ2VzIHRoYXQgd2lsbCBiZSBsb3N0IGlmIHlvdSBjbG9zZSB0aGlzIHBvcHVwLiBEbyB5b3Ugd2FudCB0byBjbG9zZSB0aGUgcG9wdXAgYW5kIG5vdCBzYXZlIGNoYW5nZXM/JyxcclxuICAgICAgJ1Vuc2F2ZWQgY2hhbmdlcydcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJQXBpUmVzcG9uc2UsIFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4uLy4uL0RhdGEnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRmlsZVVwbG9hZGVyT3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIG1heEZpbGVTaXplOiBudW1iZXI7XHJcbiAgYWNjZXB0ZWRGaWxlVHlwZXM6IHN0cmluZztcclxuICBhbGxvd2VkRmlsZUV4dGVuc2lvbnM6IHN0cmluZ1tdO1xyXG4gIG9uVmFsdWVDaGFuZ2VkPzogKGU6IERldkV4cHJlc3MudWkuZHhGaWxlVXBsb2FkZXIuVmFsdWVDaGFuZ2VkRXZlbnQpID0+IHZvaWQ7XHJcbiAgb25VcGxvYWRTdGFydGVkPzogKGU6IERldkV4cHJlc3MudWkuZHhGaWxlVXBsb2FkZXIuVXBsb2FkU3RhcnRlZEV2ZW50KSA9PiB2b2lkO1xyXG4gIG9uVXBsb2FkZWQ/OiAoZTogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlci5VcGxvYWRlZEV2ZW50KSA9PiB2b2lkO1xyXG4gIHNlbGVjdEJ1dHRvblRleHQ/OiBzdHJpbmc7XHJcbiAgY3NzQ2xhc3M/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBGaWxlVXBsb2FkZXIge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4RmlsZVNpemU6IG51bWJlcjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGFjY2VwdGVkRmlsZVR5cGVzOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhbGxvd2VkRmlsZUV4dGVuc2lvbnM6IHN0cmluZ1tdO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25WYWx1ZUNoYW5nZWQ6IChlOiBEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyLlZhbHVlQ2hhbmdlZEV2ZW50KSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25VcGxvYWRTdGFydGVkOiAoZTogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlci5VcGxvYWRTdGFydGVkRXZlbnQpID0+IHZvaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblVwbG9hZGVkOiAoZTogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlci5VcGxvYWRlZEV2ZW50KSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3NzQ2xhc3M6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IHNlbGVjdEJ1dHRvblRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSBmaWxlVXBsb2FkZXI6IERldkV4cHJlc3MudWkuZHhGaWxlVXBsb2FkZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElGaWxlVXBsb2FkZXJPcHRpb25zKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSBvcHRpb25zLiRjb250YWluZXI7XHJcbiAgICB0aGlzLmNzc0NsYXNzID0gb3B0aW9ucy5jc3NDbGFzcztcclxuICAgIHRoaXMubWF4RmlsZVNpemUgPSBvcHRpb25zLm1heEZpbGVTaXplO1xyXG4gICAgdGhpcy5hY2NlcHRlZEZpbGVUeXBlcyA9IG9wdGlvbnMuYWNjZXB0ZWRGaWxlVHlwZXM7XHJcbiAgICB0aGlzLnNlbGVjdEJ1dHRvblRleHQgPSBvcHRpb25zLnNlbGVjdEJ1dHRvblRleHQ7XHJcbiAgICB0aGlzLmFsbG93ZWRGaWxlRXh0ZW5zaW9ucyA9IG9wdGlvbnMuYWxsb3dlZEZpbGVFeHRlbnNpb25zO1xyXG4gICAgdGhpcy5vblZhbHVlQ2hhbmdlZCA9IG9wdGlvbnMub25WYWx1ZUNoYW5nZWQ7XHJcbiAgICB0aGlzLm9uVXBsb2FkU3RhcnRlZCA9IG9wdGlvbnMub25VcGxvYWRTdGFydGVkO1xyXG4gICAgdGhpcy5vblVwbG9hZGVkID0gb3B0aW9ucy5vblVwbG9hZGVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIGNvbnN0ICRmaWxlVXBsb2FkZXIgPSAkKCc8ZGl2IC8+Jyk7XHJcbiAgICBpZiAodGhpcy5jc3NDbGFzcykge1xyXG4gICAgICAkZmlsZVVwbG9hZGVyLmFkZENsYXNzKHRoaXMuY3NzQ2xhc3MpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZmlsZVVwbG9hZGVyID0gJGZpbGVVcGxvYWRlci5keEZpbGVVcGxvYWRlcih7XHJcbiAgICAgIHNlbGVjdEJ1dHRvblRleHQ6IHRoaXMuc2VsZWN0QnV0dG9uVGV4dCxcclxuICAgICAgbGFiZWxUZXh0OiAnJyxcclxuICAgICAgYWxsb3dlZEZpbGVFeHRlbnNpb25zOiB0aGlzLmFsbG93ZWRGaWxlRXh0ZW5zaW9ucyxcclxuICAgICAgYWNjZXB0OiB0aGlzLmFjY2VwdGVkRmlsZVR5cGVzLFxyXG4gICAgICB1cGxvYWRNb2RlOiAndXNlRm9ybScsXHJcbiAgICAgIG1heEZpbGVTaXplOiB0aGlzLm1heEZpbGVTaXplLFxyXG4gICAgICBzaG93RmlsZUxpc3Q6IGZhbHNlLFxyXG4gICAgICBvblZhbHVlQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICBlLmNvbXBvbmVudC5vcHRpb24oJ2xhYmVsVGV4dCcsIGUudmFsdWVbMF0gPyBlLnZhbHVlWzBdLm5hbWUgOiAnJyk7XHJcbiAgICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlZD8uKGUpO1xyXG4gICAgICB9LFxyXG4gICAgICBvblVwbG9hZFN0YXJ0ZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgZS5lbGVtZW50LmZpbmQoJy5keC1maWxldXBsb2FkZXItdXBsb2FkLWJ1dHRvbicpLmhpZGUoKTtcclxuICAgICAgICB0aGlzLm9uVXBsb2FkU3RhcnRlZD8uKGUpO1xyXG4gICAgICB9LFxyXG4gICAgICBvblVwbG9hZGVkOiAoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMub25VcGxvYWRlZD8uKGUpO1xyXG4gICAgICB9LFxyXG4gICAgfSkuZHhGaWxlVXBsb2FkZXIoJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgdGhpcy4kY29udGFpbmVyLmFwcGVuZCh0aGlzLmZpbGVVcGxvYWRlci5lbGVtZW50KCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwbG9hZDxUPih1cGxvYWRVcmw6IHN0cmluZywgcGFyYW1zPzogYW55KTogUHJvbWlzZTxUPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBmZCA9IG5ldyBGb3JtRGF0YSgpO1xyXG4gICAgICBjb25zdCBmaWxlID0gKHRoaXMuZmlsZVVwbG9hZGVyLmVsZW1lbnQoKS5maW5kKCdpbnB1dCcpWzBdIGFzIEhUTUxJbnB1dEVsZW1lbnQpLmZpbGVzWzBdO1xyXG5cclxuICAgICAgZmQuYXBwZW5kKCdmaWxlJywgZmlsZSk7XHJcblxyXG4gICAgICAvKiBlc2xpbnQgZ3VhcmQtZm9yLWluOiBvZmYgKi9cclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBmb3JpblxyXG4gICAgICBmb3IgKGNvbnN0IHByb3AgaW4gcGFyYW1zKSB7XHJcbiAgICAgICAgZmQuYXBwZW5kKHByb3AsIHBhcmFtc1twcm9wXSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICQuYWpheCh7XHJcbiAgICAgICAgdXJsOiB1cGxvYWRVcmwsXHJcbiAgICAgICAgdHlwZTogJ3Bvc3QnLFxyXG4gICAgICAgIGRhdGE6IGZkLFxyXG4gICAgICAgIGNvbnRlbnRUeXBlOiBmYWxzZSxcclxuICAgICAgICBwcm9jZXNzRGF0YTogZmFsc2UsXHJcbiAgICAgICAgc3VjY2VzczogKHJlc3BvbnNlOiBJQXBpUmVzcG9uc2U8VD4pID0+IHtcclxuICAgICAgICAgIGlmIChyZXNwb25zZS5SZXF1ZXN0U3RhdGUgPT09IFJlcXVlc3RTdGF0ZS5Db21wbGV0ZWQpIHtcclxuICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS5EYXRhIGFzIGFueSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZWplY3QocmVzcG9uc2UuTWVzc2FnZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGUpID0+IHJlamVjdCgnVW5rbm93biBlcnJvcicpXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBjcmVhdGVEeERhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi9EYXRhL0R4RGF0YVNvdXJjZSc7XHJcbmltcG9ydCBub3RpZnkgZnJvbSAnLi4vLi4vV2lkZ2V0cy9Ob3RpZnknO1xyXG5pbXBvcnQgeyBGaWxlVXBsb2FkZXIgfSBmcm9tICcuLi9GaWxlVXBsb2FkZXIvSW5kZXgnO1xyXG5pbXBvcnQgeyBJRmlsZUltcG9ydGVyQ29sdW1uSW5mbywgSUZpbGVJbXBvcnRlclRhYmxlTWV0YWRhdGEgfSBmcm9tICcuL0lGaWxlSW1wb3J0ZXJUYWJsZU1ldGFkYXRhJztcclxuaW1wb3J0IGRlZmF1bHRHcmlkIGZyb20gJy4uLy4uL1dpZGdldHMvR3JpZC9EZWZhdWx0R3JpZCc7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uLy4uL1V0aWxzL0V2ZW50RW1pdHRlcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElGaWxlSW1wb3J0ZXJUYWJsZUluZm8ge1xyXG4gIHNjaGVtYTogc3RyaW5nO1xyXG4gIHRhYmxlOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZpbGVJbXBvcnRlck9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIGZpbGVVcGxvYWRVcmw6IHN0cmluZztcclxuICBjcmVhdGVUYWJsZVVybDogc3RyaW5nO1xyXG4gIGFkZFJvd3NVcmw6IHN0cmluZztcclxuICBnZXRUYWJsZXNMaXN0VXJsPzogc3RyaW5nO1xyXG4gIHByZWRlZmluZWRUYWJsZT86IElGaWxlSW1wb3J0ZXJUYWJsZUluZm87XHJcbiAgcHJlZGVmaW5lZEltcG9ydEZpbGVNb2RlPzogSW1wb3J0RmlsZU1vZGU7XHJcbiAgY3JlYXRlVGFibGVCdXR0b25UZXh0Pzogc3RyaW5nO1xyXG4gIHVwZGF0ZVRhYmxlQnV0dG9uVGV4dD86IHN0cmluZztcclxuICBjcmVhdGVUYWJsZU1vZGVUZXh0Pzogc3RyaW5nO1xyXG4gIHVwZGF0ZVRhYmxlTW9kZVRleHQ/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIEltcG9ydEZpbGVNb2RlIHtcclxuICBDcmVhdGVOZXdUYWJsZSA9IDAsXHJcbiAgQWRkTmV3Um93cyA9IDFcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEZpbGVJbXBvcnRlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUQUJMRV9VUERBVEVEX0VWRU5UID0gJ2ZpbGUtaW1wb3J0ZXItdGFibGUtdXBkYXRlZC1ldmVudCc7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZVVwbG9hZFVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGNyZWF0ZVRhYmxlVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhZGRSb3dzVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwcmVkZWZpbmVkVGFibGU6IElGaWxlSW1wb3J0ZXJUYWJsZUluZm8gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBnZXRUYWJsZXNMaXN0VXJsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjYW5DaGFuZ2VNb2RlOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3JlYXRlVGFibGVCdXR0b25UZXh0OiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVUYWJsZUJ1dHRvblRleHQ6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGNyZWF0ZVRhYmxlTW9kZVRleHQ6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZVRhYmxlTW9kZVRleHQ6IHN0cmluZztcclxuXHJcbiAgcHJpdmF0ZSBwb3B1cDogRGV2RXhwcmVzcy51aS5keFBvcHVwO1xyXG4gIHByaXZhdGUgZm9ybTogRGV2RXhwcmVzcy51aS5keEZvcm07XHJcbiAgcHJpdmF0ZSBmaWxlVXBsb2FkZXI6IEZpbGVVcGxvYWRlcjtcclxuICBwcml2YXRlIGRhdGFHcmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XHJcbiAgcHJpdmF0ZSBhY3Rpb25CdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b247XHJcbiAgcHJpdmF0ZSByb3dzQ291bnRlckNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcm93c0NvdW50ZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIG1vZGU6IEltcG9ydEZpbGVNb2RlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJRmlsZUltcG9ydGVyT3B0aW9ucykge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMuZmlsZVVwbG9hZFVybCA9IG9wdGlvbnMuZmlsZVVwbG9hZFVybDtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMudGl0bGUgPSBvcHRpb25zLnRpdGxlO1xyXG4gICAgdGhpcy5nZXRUYWJsZXNMaXN0VXJsID0gb3B0aW9ucy5nZXRUYWJsZXNMaXN0VXJsO1xyXG4gICAgdGhpcy5jcmVhdGVUYWJsZVVybCA9IG9wdGlvbnMuY3JlYXRlVGFibGVVcmw7XHJcbiAgICB0aGlzLmFkZFJvd3NVcmwgPSBvcHRpb25zLmFkZFJvd3NVcmw7XHJcbiAgICB0aGlzLnByZWRlZmluZWRUYWJsZSA9IG9wdGlvbnMucHJlZGVmaW5lZFRhYmxlO1xyXG4gICAgdGhpcy5jYW5DaGFuZ2VNb2RlID0gb3B0aW9ucy5wcmVkZWZpbmVkSW1wb3J0RmlsZU1vZGUgPT09IHVuZGVmaW5lZDtcclxuICAgIHRoaXMubW9kZSA9IG9wdGlvbnMucHJlZGVmaW5lZEltcG9ydEZpbGVNb2RlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnByZWRlZmluZWRJbXBvcnRGaWxlTW9kZSA6IEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlO1xyXG4gICAgdGhpcy5jcmVhdGVUYWJsZUJ1dHRvblRleHQgPSBvcHRpb25zLmNyZWF0ZVRhYmxlQnV0dG9uVGV4dCB8fCAnQ3JlYXRlIFRhYmxlJztcclxuICAgIHRoaXMudXBkYXRlVGFibGVCdXR0b25UZXh0ID0gb3B0aW9ucy51cGRhdGVUYWJsZUJ1dHRvblRleHQgfHwgJ0FkZCBOZXcgUm93cyc7XHJcbiAgICB0aGlzLmNyZWF0ZVRhYmxlTW9kZVRleHQgPSBvcHRpb25zLmNyZWF0ZVRhYmxlTW9kZVRleHQgfHwgJ0NyZWF0ZSBUYWJsZSc7XHJcbiAgICB0aGlzLnVwZGF0ZVRhYmxlTW9kZVRleHQgPSBvcHRpb25zLnVwZGF0ZVRhYmxlTW9kZVRleHQgfHwgJ0FkZCBOZXcgUm93cyc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2hvdygpIHtcclxuICAgIHRoaXMucG9wdXAgPSAkKCc8ZGl2IC8+JykuYXBwZW5kVG8odGhpcy4kY29udGFpbmVyKVxyXG4gICAgICAuZHhQb3B1cCh7XHJcbiAgICAgICAgc2hvd1RpdGxlOiB0cnVlLFxyXG4gICAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxyXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICAgIGRyYWdFbmFibGVkOiBmYWxzZSxcclxuICAgICAgICByZXNpemVFbmFibGVkOiBmYWxzZSxcclxuICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsXHJcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXHJcbiAgICAgICAgZnVsbFNjcmVlbjogdHJ1ZSxcclxuICAgICAgICBtYXhXaWR0aDogMTMwMCxcclxuICAgICAgICBtYXhIZWlnaHQ6IDgwMCxcclxuICAgICAgICBjb250ZW50VGVtcGxhdGU6ICgkY29udGFpbmVyKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCAkc2Nyb2xsVmlldyA9ICQoJzxkaXYgLz4nKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmZvcm0gPSB0aGlzLmNyZWF0ZUZvcm0oKTtcclxuICAgICAgICAgICRzY3JvbGxWaWV3LmFwcGVuZCh0aGlzLmZvcm0uZWxlbWVudCgpKTtcclxuXHJcbiAgICAgICAgICAkc2Nyb2xsVmlldy5keFNjcm9sbFZpZXcoe1xyXG4gICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxyXG4gICAgICAgICAgICBoZWlnaHQ6ICcxMDAlJ1xyXG4gICAgICAgICAgfSkuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcbiAgICAgICAgfSxcclxuICAgICAgICB0b29sYmFySXRlbXM6IFt7XHJcbiAgICAgICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICB0ZXh0OiB0aGlzLmdldEFjdGlvbkJ1dHRvblRleHQoKSxcclxuICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxyXG4gICAgICAgICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuYWN0aW9uQnV0dG9uID0gZS5jb21wb25lbnQ7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG9uQ2xpY2s6IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5tb2RlID09PSBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVUYWJsZSgpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFJvd3NUb1RhYmxlKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgdGV4dDogJ0NhbmNlbCcsXHJcbiAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHRoaXMucG9wdXAuaGlkZSgpXHJcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICAgICAgfV1cclxuICAgICAgfSlcclxuICAgICAgLmR4UG9wdXAoJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgdGhpcy5wb3B1cC5zaG93KCk7XHJcbiAgICB0aGlzLm9uTW9kZVN3aXRjaGluZygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKSB7XHJcbiAgICBpZiAodGhpcy5wb3B1cCkge1xyXG4gICAgICB0aGlzLnBvcHVwLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRm9ybSgpOiBEZXZFeHByZXNzLnVpLmR4Rm9ybSB7XHJcbiAgICBjb25zdCBmb3JtID0gJCgnPGRpdj4nKS5keEZvcm0oe1xyXG4gICAgICBzaG93Q29sb25BZnRlckxhYmVsOiB0cnVlLFxyXG4gICAgICBsYWJlbExvY2F0aW9uOiAndG9wJyxcclxuICAgICAgY29sQ291bnRCeVNjcmVlbjogeyBtZDogNCwgc206IDEgfSxcclxuICAgICAgc2NyZWVuQnlXaWR0aDogKHdpZHRoKSA9PiB3aWR0aCA8IDEyNTYgPyAnc20nIDogJ21kJyxcclxuICAgICAgaXRlbXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnTW9kZScsXHJcbiAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgIHRlbXBsYXRlOiAoX2RhdGEsICRjb250YWluZXIpID0+IHtcclxuICAgICAgICAgIHRoaXMuY3JlYXRlTW9kZVN3aXRjaGVyKCRjb250YWluZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGRhdGFGaWVsZDogJ1NjaGVtYScsXHJcbiAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLmNhbkNoYW5nZU1vZGVcclxuICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUZXh0Qm94LlByb3BlcnRpZXMsXHJcbiAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbe1xyXG4gICAgICAgICAgdHlwZTogJ3JlcXVpcmVkJyxcclxuICAgICAgICB9XVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnVGFibGUnLFxyXG4gICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgIGRpc2FibGVkOiAhdGhpcy5jYW5DaGFuZ2VNb2RlXHJcbiAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VGV4dEJveC5Qcm9wZXJ0aWVzLFxyXG4gICAgICAgIHZhbGlkYXRpb25SdWxlczogW3tcclxuICAgICAgICAgIHR5cGU6ICdyZXF1aXJlZCcsXHJcbiAgICAgICAgfV1cclxuICAgICAgfSwge1xyXG4gICAgICAgIGRhdGFGaWVsZDogJ1RhYmxlU2VsZWN0b3InLFxyXG4gICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICB0ZXh0OiAnVGFibGUnXHJcbiAgICAgICAgfSxcclxuICAgICAgICBlZGl0b3JUeXBlOiAnZHhTZWxlY3RCb3gnLFxyXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICAgIGNvbFNwYW46IDIsXHJcbiAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgZGF0YVNvdXJjZTogbmV3IERldkV4cHJlc3MuZGF0YS5EYXRhU291cmNlKHtcclxuICAgICAgICAgICAgc3RvcmU6IGNyZWF0ZUR4RGF0YVNvdXJjZSh7XHJcbiAgICAgICAgICAgICAgbG9hZFVybDogdGhpcy5nZXRUYWJsZXNMaXN0VXJsLFxyXG4gICAgICAgICAgICAgIGxvYWRQYXJhbXM6IHsgY29udGV4dE5hbWU6ICcnLCB0YWJsZXNPbmx5OiB0cnVlLCBpc1dhcmVob3VzZUNvbnRleHQ6IHRydWUgfSxcclxuICAgICAgICAgICAgICBsb2FkTWV0aG9kOiAncG9zdCcsXHJcbiAgICAgICAgICAgICAgbm90aWZ5RXJyb3I6IGZhbHNlXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBwYWdpbmF0ZTogZmFsc2UsXHJcbiAgICAgICAgICAgIHNvcnQ6ICd0aGlzJyxcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgc2VhcmNoRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUZXh0Qm94LlByb3BlcnRpZXMsXHJcbiAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbe1xyXG4gICAgICAgICAgdHlwZTogJ3JlcXVpcmVkJyxcclxuICAgICAgICB9XVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnU291cmNlIEZpbGUnLFxyXG4gICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICB0ZW1wbGF0ZTogKF9kYXRhLCAkY29udGFpbmVyKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNyZWF0ZUZpbGVzVXBsb2FkZXIoJGNvbnRhaW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnQ29sdW1ucyBTZWxlY3RvcicsXHJcbiAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgIHZpc2libGU6IGZhbHNlXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb2xTcGFuOiA0LFxyXG4gICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICB0ZW1wbGF0ZTogKF9kYXRhLCAkY29udGFpbmVyKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNyZWF0ZURhdGFHcmlkKCRjb250YWluZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfV1cclxuICAgIH0pLmR4Rm9ybSgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICByZXR1cm4gZm9ybTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTW9kZVN3aXRjaGVyKCRjb250YWluZXI6IEpRdWVyeSkge1xyXG4gICAgJCgnPGRpdiAvPicpLmR4QnV0dG9uR3JvdXAoe1xyXG4gICAgICBpdGVtczogW3tcclxuICAgICAgICB0ZXh0OiB0aGlzLmNyZWF0ZVRhYmxlTW9kZVRleHQsXHJcbiAgICAgICAgaWNvbjogJ2luc2VydHRhYmxlJyxcclxuICAgICAgICB2YWx1ZTogSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGVcclxuICAgICAgfSwge1xyXG4gICAgICAgIHRleHQ6IHRoaXMudXBkYXRlVGFibGVNb2RlVGV4dCxcclxuICAgICAgICBpY29uOiAnaW5zZXJ0cm93YmVsb3cnLFxyXG4gICAgICAgIHZhbHVlOiBJbXBvcnRGaWxlTW9kZS5BZGROZXdSb3dzXHJcbiAgICAgIH1dIGFzIGFueSxcclxuICAgICAga2V5RXhwcjogJ3ZhbHVlJyxcclxuICAgICAgZGlzYWJsZWQ6ICF0aGlzLmNhbkNoYW5nZU1vZGUsXHJcbiAgICAgIHN0eWxpbmdNb2RlOiAnb3V0bGluZWQnLFxyXG4gICAgICBzZWxlY3Rpb25Nb2RlOiAnc2luZ2xlJyxcclxuICAgICAgc2VsZWN0ZWRJdGVtS2V5czogW3RoaXMubW9kZV0sXHJcbiAgICAgIG9uSXRlbUNsaWNrOiAoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMubW9kZSA9IGUuaXRlbURhdGEudmFsdWU7XHJcbiAgICAgICAgdGhpcy5vbk1vZGVTd2l0Y2hpbmcoKTtcclxuICAgICAgfSxcclxuICAgIH0pLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWxlc1VwbG9hZGVyKCRjb250YWluZXI6IEpRdWVyeSkge1xyXG4gICAgdGhpcy5maWxlVXBsb2FkZXIgPSBuZXcgRmlsZVVwbG9hZGVyKHtcclxuICAgICAgJGNvbnRhaW5lcixcclxuICAgICAgY3NzQ2xhc3M6ICd0YWJsZS1jcmVhdG9yX191cGxvYWQnLFxyXG4gICAgICBtYXhGaWxlU2l6ZTogMTAgKiAxMDAwMDAwLFxyXG4gICAgICBhY2NlcHRlZEZpbGVUeXBlczogJy54bHMsIC54bHN4JyxcclxuICAgICAgYWxsb3dlZEZpbGVFeHRlbnNpb25zOiBbJy54bHMnLCAnLnhsc3gnXSxcclxuICAgICAgc2VsZWN0QnV0dG9uVGV4dDogJ1NlbGVjdCBFeGNlbCBmaWxlJyxcclxuICAgICAgb25WYWx1ZUNoYW5nZWQ6IGFzeW5jICgpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFHcmlkLmJlZ2luQ3VzdG9tTG9hZGluZygnUGFyc2luZyBzZWxlY3RlZCBmaWxlLi4uJyk7XHJcbiAgICAgICAgdGhpcy5maWxlVXBsb2FkZXIudXBsb2FkPElGaWxlSW1wb3J0ZXJUYWJsZU1ldGFkYXRhPih0aGlzLmZpbGVVcGxvYWRVcmwpLnRoZW4oKHRhYmxlTWV0YSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRhYmxlTWV0YSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldFJvd3NDb3VudCh0YWJsZU1ldGEuUm93c0NvdW50KTtcclxuICAgICAgICAgICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBEZXZFeHByZXNzLmRhdGEuRGF0YVNvdXJjZSh7XHJcbiAgICAgICAgICAgICAgc3RvcmU6IHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdhcnJheScsXHJcbiAgICAgICAgICAgICAgICBrZXk6ICdJZCcsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiB0YWJsZU1ldGEuQ29sdW1uc1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgcGFnaW5hdGU6IGZhbHNlXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5kYXRhR3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnLCBkYXRhU291cmNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgbm90aWZ5KGBQYXJzaW5nIEVycm9yIDogJHtlfWAsIGZhbHNlKTtcclxuICAgICAgICB9KS5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZGF0YUdyaWQuZW5kQ3VzdG9tTG9hZGluZygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZmlsZVVwbG9hZGVyLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVEYXRhR3JpZCgkY29udGFpbmVyOiBKUXVlcnkpIHtcclxuICAgIGNvbnN0IGdyaWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zID0ge1xyXG4gICAgICBub0RhdGFUZXh0OiAnU2VsZWN0IEV4Y2VsIEZpbGUnLFxyXG4gICAgICBob3ZlclN0YXRlRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgc2VhcmNoUGFuZWw6IHtcclxuICAgICAgICB2aXNpYmxlOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBncm91cFBhbmVsOiB7XHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgaGVhZGVyRmlsdGVyOiB7XHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgIH0sXHJcbiAgICAgIGZpbHRlclJvdzoge1xyXG4gICAgICAgIHZpc2libGU6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIHNvcnRpbmc6IHtcclxuICAgICAgICBtb2RlOiAnbm9uZSdcclxuICAgICAgfSxcclxuICAgICAgcGFnaW5nOiB7XHJcbiAgICAgICAgcGFnZVNpemU6IDEwMDAwLFxyXG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICB9LFxyXG4gICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgYWxsb3dVcGRhdGluZzogdHJ1ZSxcclxuICAgICAgICBtb2RlOiAnY2VsbCcsXHJcbiAgICAgIH0sXHJcbiAgICAgIHNlbGVjdGlvbjoge1xyXG4gICAgICAgIG1vZGU6ICdub25lJ1xyXG4gICAgICB9LFxyXG4gICAgICBjb2x1bW5zOiBbe1xyXG4gICAgICAgIGRhdGFGaWVsZDogJ0lkJyxcclxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcclxuICAgICAgfSwge1xyXG4gICAgICAgIGRhdGFGaWVsZDogJ1NlbGVjdGVkJyxcclxuICAgICAgICBkYXRhVHlwZTogJ2Jvb2xlYW4nLFxyXG4gICAgICAgIHZpc2libGU6IHRoaXMubW9kZSA9PT0gSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGVcclxuICAgICAgfSwge1xyXG4gICAgICAgIGRhdGFGaWVsZDogJ0lzS2V5Q29sdW1uJyxcclxuICAgICAgICBkYXRhVHlwZTogJ2Jvb2xlYW4nLFxyXG4gICAgICAgIHZpc2libGU6IHRoaXMubW9kZSA9PT0gSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGVcclxuICAgICAgfSwge1xyXG4gICAgICAgIGRhdGFGaWVsZDogJ05hbWUnLFxyXG4gICAgICAgIGNhcHRpb246ICdDb2x1bW4gTmFtZSdcclxuICAgICAgfSwge1xyXG4gICAgICAgIGRhdGFGaWVsZDogJ1R5cGUnLFxyXG4gICAgICAgIGFsbG93RWRpdGluZzogZmFsc2VcclxuICAgICAgfSwge1xyXG4gICAgICAgIGRhdGFGaWVsZDogJ0lzTnVsbGFibGUnLFxyXG4gICAgICAgIGFsbG93RWRpdGluZzogdGhpcy5tb2RlID09PSBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZSAmJiB0aGlzLmNhbkNoYW5nZU1vZGUsXHJcbiAgICAgICAgc2V0Q2VsbFZhbHVlOiAobmV3RGF0YSwgdmFsdWUpID0+IHtcclxuICAgICAgICAgIG5ld0RhdGEuSXNOdWxsYWJsZSA9IHZhbHVlO1xyXG4gICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIG5ld0RhdGEuSXNLZXlDb2x1bW4gPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1dLFxyXG4gICAgICByZW1vdGVPcGVyYXRpb25zOiBmYWxzZSxcclxuICAgICAgb25Ub29sYmFyUHJlcGFyaW5nOiAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHRvb2xiYXJJdGVtcyA9IGUudG9vbGJhck9wdGlvbnMuaXRlbXM7XHJcbiAgICAgICAgdG9vbGJhckl0ZW1zLnB1c2goe1xyXG4gICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuICQoJzxkaXY+JylcclxuICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxzcGFuPicpXHJcbiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ3RhYmxlLWNyZWF0b3JfX3RhYmxlLWhlYWRlcicpXHJcbiAgICAgICAgICAgICAgICAudGV4dCgnUGFyc2VkIEZpbGUgTWV0YWRhdGEnKSxcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJ1xyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucm93c0NvdW50ZXIgPSAkKCc8c3Bhbj4nKS50ZXh0KCcxMDAwJyk7XHJcbiAgICAgICAgICAgIHRoaXMucm93c0NvdW50ZXJDb250YWluZXIgPSAkKCc8ZGl2PicpXHJcbiAgICAgICAgICAgICAgLmFwcGVuZCgkKCc8c3Bhbj4nKS50ZXh0KCdSb3dzIENvdW50OiAnKSwgdGhpcy5yb3dzQ291bnRlcikuaGlkZSgpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm93c0NvdW50ZXJDb250YWluZXI7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgbG9jYXRpb246ICdhZnRlcidcclxuICAgICAgICB9KTtcclxuICAgICAgfSxcclxuICAgICAgb25FZGl0b3JQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgaWYgKGUucGFyZW50VHlwZSA9PT0gJ2RhdGFSb3cnICYmIGUuZGF0YUZpZWxkID09PSAnSXNLZXlDb2x1bW4nKSB7XHJcbiAgICAgICAgICBjb25zdCBlZGl0b3JPcHRpb25zID0gZS5lZGl0b3JPcHRpb25zIGFzIERldkV4cHJlc3MudWkuZHhDaGVja0JveE9wdGlvbnM7XHJcbiAgICAgICAgICBlZGl0b3JPcHRpb25zLmRpc2FibGVkID0gZS5yb3cuZGF0YS5Jc051bGxhYmxlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmRhdGFHcmlkID0gZGVmYXVsdEdyaWQoJCgnPGRpdiAvPicpLCB7XHJcbiAgICAgIG9wdGlvbnM6IGdyaWRPcHRpb25zLFxyXG4gICAgICBzdW1tYXJ5Q29sdW1uOiAnTmFtZScsXHJcbiAgICAgIGlzRnVsbFNjcmVlbjogZmFsc2UsXHJcbiAgICAgIHNldERlZmF1bHRDb2x1bW5XaWR0aDogZmFsc2VcclxuICAgIH0pO1xyXG5cclxuICAgICRjb250YWluZXIuYXBwZW5kKHRoaXMuZGF0YUdyaWQuZWxlbWVudCgpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlVGFibGUoKSB7XHJcbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdGhpcy5mb3JtLnZhbGlkYXRlKCk7XHJcbiAgICBpZiAodmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XHJcbiAgICAgIGNvbnN0IGRzID0gdGhpcy5kYXRhR3JpZC5nZXREYXRhU291cmNlKCk7XHJcbiAgICAgIGlmICghZHMpIHtcclxuICAgICAgICBub3RpZnkoJ1NlbGVjdCBmaWxlIHdpdGggZGF0YScsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBjb2x1bW5zID0gZHMuaXRlbXMoKTtcclxuICAgICAgaWYgKCF0aGlzLmFyZUNvbHVtbnNWYWxpZChjb2x1bW5zKSkge1xyXG4gICAgICAgIG5vdGlmeSgnQXQgbGVhc3QgMSBrZXkgY29sdW1uIG11c3QgYmUgc2V0JywgZmFsc2UpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgICAgIHNjaGVtYTogdGhpcy5mb3JtLm9wdGlvbignZm9ybURhdGEnKS5TY2hlbWEsXHJcbiAgICAgICAgICB0YWJsZTogdGhpcy5mb3JtLm9wdGlvbignZm9ybURhdGEnKS5UYWJsZSxcclxuICAgICAgICAgIGNvbHVtbnM6IEpTT04uc3RyaW5naWZ5KGNvbHVtbnMpXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmRhdGFHcmlkLmJlZ2luQ3VzdG9tTG9hZGluZygnQ3JlYXRpbmcgYW5kIGZpbGxpbmcgREIgdGFibGUuLi4nKTtcclxuICAgICAgICB0aGlzLmZpbGVVcGxvYWRlci51cGxvYWQ8Ym9vbGVhbj4odGhpcy5jcmVhdGVUYWJsZVVybCwgcGFyYW1zKS50aGVuKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3BvbnNlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9wdXAuaGlkZSgpO1xyXG4gICAgICAgICAgICBub3RpZnkoYFRoZSB0YWJsZSBbJHtwYXJhbXMuc2NoZW1hfV0uWyR7cGFyYW1zLnRhYmxlfV0gaGFzIGJlZW4gY3JlYXRlZGAsIHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQoRmlsZUltcG9ydGVyLlRBQkxFX1VQREFURURfRVZFTlQpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbm90aWZ5KCdUaGUgdGFibGUgaGFzIG5vdCBiZWVuIGNyZWF0ZWQnLCBmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICAgIG5vdGlmeShgVGFibGUgY3JlYXRpbmcgZXJyb3I6ICR7ZX1gLCBmYWxzZSk7XHJcbiAgICAgICAgfSkuZmluYWxseSgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFHcmlkLmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGRSb3dzVG9UYWJsZSgpIHtcclxuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB0aGlzLmZvcm0udmFsaWRhdGUoKTtcclxuICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcclxuICAgICAgY29uc3QgZHMgPSB0aGlzLmRhdGFHcmlkLmdldERhdGFTb3VyY2UoKTtcclxuICAgICAgaWYgKCFkcykge1xyXG4gICAgICAgIG5vdGlmeSgnU2VsZWN0IGZpbGUgd2l0aCBkYXRhJywgZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSBkcy5pdGVtcygpO1xyXG4gICAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICAgdGFibGU6IHRoaXMuZm9ybS5vcHRpb24oJ2Zvcm1EYXRhJykuVGFibGVTZWxlY3RvcixcclxuICAgICAgICBjb2x1bW5zOiBKU09OLnN0cmluZ2lmeShjb2x1bW5zKVxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLmRhdGFHcmlkLmJlZ2luQ3VzdG9tTG9hZGluZygnQWRkaW5nIHJvd3MgdG8gREIgdGFibGUuLi4nKTtcclxuICAgICAgdGhpcy5maWxlVXBsb2FkZXIudXBsb2FkPGJvb2xlYW4+KHRoaXMuYWRkUm93c1VybCwgcGFyYW1zKS50aGVuKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXNwb25zZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgdGhpcy5wb3B1cC5oaWRlKCk7XHJcbiAgICAgICAgICBub3RpZnkoYFRoZSB0YWJsZSAke3BhcmFtcy50YWJsZX0gaGFzIGJlZW4gdXBkYXRlZGAsIHRydWUpO1xyXG4gICAgICAgICAgdGhpcy5lbWl0KEZpbGVJbXBvcnRlci5UQUJMRV9VUERBVEVEX0VWRU5UKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbm90aWZ5KCdUaGUgdGFibGUgaGFzIG5vdCBiZWVuIHVwZGF0ZWQnLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KS5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgIG5vdGlmeShgVGFibGUgdXBkYXRpbmcgZXJyb3I6ICR7ZX1gLCBmYWxzZSk7XHJcbiAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YUdyaWQuZW5kQ3VzdG9tTG9hZGluZygpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25Nb2RlU3dpdGNoaW5nKCkge1xyXG4gICAgY29uc3QgaXNDcmVhdGVUYWJsZU1vZGUgPSB0aGlzLm1vZGUgPT09IEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlO1xyXG5cclxuICAgIHRoaXMuYWN0aW9uQnV0dG9uLm9wdGlvbigndGV4dCcsIHRoaXMuZ2V0QWN0aW9uQnV0dG9uVGV4dCgpKTtcclxuICAgIHRoaXMuZGF0YUdyaWQuY29sdW1uT3B0aW9uKCdJc0tleUNvbHVtbicsICd2aXNpYmxlJywgaXNDcmVhdGVUYWJsZU1vZGUpO1xyXG4gICAgdGhpcy5kYXRhR3JpZC5jb2x1bW5PcHRpb24oJ0lzTnVsbGFibGUnLCAndmlzaWJsZScsIGlzQ3JlYXRlVGFibGVNb2RlKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuY2FuQ2hhbmdlTW9kZSkge1xyXG4gICAgICB0aGlzLmZvcm0uaXRlbU9wdGlvbignU2NoZW1hJywgJ3Zpc2libGUnLCB0cnVlKTtcclxuICAgICAgdGhpcy5mb3JtLnVwZGF0ZURhdGEoJ1NjaGVtYScsIHRoaXMucHJlZGVmaW5lZFRhYmxlLnNjaGVtYSk7XHJcblxyXG4gICAgICB0aGlzLmZvcm0uaXRlbU9wdGlvbignVGFibGUnLCAndmlzaWJsZScsIHRydWUpO1xyXG4gICAgICB0aGlzLmZvcm0udXBkYXRlRGF0YSgnVGFibGUnLCB0aGlzLnByZWRlZmluZWRUYWJsZS50YWJsZSk7XHJcblxyXG4gICAgICB0aGlzLmZvcm0uaXRlbU9wdGlvbignVGFibGVTZWxlY3RvcicsICd2aXNpYmxlJywgZmFsc2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mb3JtLml0ZW1PcHRpb24oJ1NjaGVtYScsICd2aXNpYmxlJywgaXNDcmVhdGVUYWJsZU1vZGUpO1xyXG4gICAgICB0aGlzLmZvcm0uaXRlbU9wdGlvbignVGFibGUnLCAndmlzaWJsZScsIGlzQ3JlYXRlVGFibGVNb2RlKTtcclxuICAgICAgdGhpcy5mb3JtLml0ZW1PcHRpb24oJ1RhYmxlU2VsZWN0b3InLCAndmlzaWJsZScsICFpc0NyZWF0ZVRhYmxlTW9kZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEFjdGlvbkJ1dHRvblRleHQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLm1vZGUgPT09IEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlID8gdGhpcy5jcmVhdGVUYWJsZUJ1dHRvblRleHQgOiB0aGlzLnVwZGF0ZVRhYmxlQnV0dG9uVGV4dDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXJlQ29sdW1uc1ZhbGlkKGNvbHVtbnM6IElGaWxlSW1wb3J0ZXJDb2x1bW5JbmZvW10pIHtcclxuICAgIHJldHVybiBjb2x1bW5zLmZpbHRlcigoYykgPT4gYy5TZWxlY3RlZCkuc29tZSgocykgPT4gcy5Jc0tleUNvbHVtbik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFJvd3NDb3VudChjb3VudDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnJvd3NDb3VudGVyQ29udGFpbmVyLnNob3coKTtcclxuICAgIHRoaXMucm93c0NvdW50ZXIudGV4dChjb3VudCk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBHcmlkRGlzcGxheXNNYW5hZ2VyIH0gZnJvbSAnLi9HcmlkRGlzcGxheXNNYW5hZ2VyJztcclxuaW1wb3J0IHsgR3JpZFZpZXdzTWFuYWdlciB9IGZyb20gJy4vR3JpZFZpZXdzTWFuYWdlcic7XHJcbmltcG9ydCB7IEdyaWRGaWx0ZXJzTWFuYWdlciB9IGZyb20gJy4vR3JpZEZpbHRlcnNNYW5hZ2VyJztcclxuaW1wb3J0IHsgY3JlYXRlRGlhbG9nIH0gZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9Qb3B1cCc7XHJcbmltcG9ydCB7IENkbUltcG9ydEZpbGVNb2RlIH0gZnJvbSAnLi4vLi4vQnVzaW5lc3MnO1xyXG5pbXBvcnQgeyBGaWxlSW1wb3J0ZXIsIElGaWxlSW1wb3J0ZXJUYWJsZUluZm8sIEltcG9ydEZpbGVNb2RlIH0gZnJvbSAnLi4vLi4vLi4vQ29tcG9uZW50cy9GaWxlSW1wb3J0ZXIvSW5kZXgnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRmlsZUltcG9ydGVyT3B0aW9ucyB7XHJcbiAgbW9kZTogQ2RtSW1wb3J0RmlsZU1vZGU7XHJcbiAgY3JlYXRlVGFibGVVcmw6IHN0cmluZztcclxuICBhZGRSb3dzVXJsOiBzdHJpbmc7XHJcbiAgZmlsZVVwbG9hZFVybDogc3RyaW5nO1xyXG4gIHByZWRlZmluZWRUYWJsZTogSUZpbGVJbXBvcnRlclRhYmxlSW5mbztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZERpc3BsYXlzVG9vbGJhckNvbXBvbmVudCB7XHJcbiAgcmVhZG9ubHkgb3duZXI6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICByZWFkb25seSBlZGl0TW9kZTogYm9vbGVhbjtcclxuICByZWFkb25seSBncmlkRGlzcGxheXNNYW5hZ2VyOiBHcmlkRGlzcGxheXNNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGdyaWRWaWV3c01hbmFnZXI6IEdyaWRWaWV3c01hbmFnZXI7XHJcbiAgcmVhZG9ubHkgZ3JpZEZpbHRlcnNNYW5hZ2VyOiBHcmlkRmlsdGVyc01hbmFnZXI7XHJcbiAgcmVhZG9ubHkgaW1wb3J0RmlsZU9wdGlvbnM/OiBJRmlsZUltcG9ydGVyT3B0aW9ucztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQge1xyXG4gIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBJR3JpZERpc3BsYXlzVG9vbGJhckNvbXBvbmVudDtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBncmlkRGlzcGxheXNNYW5hZ2VyOiBHcmlkRGlzcGxheXNNYW5hZ2VyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JpZFZpZXdzTWFuYWdlcjogR3JpZFZpZXdzTWFuYWdlcjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWRGaWx0ZXJzTWFuYWdlcjogR3JpZEZpbHRlcnNNYW5hZ2VyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW1wb3J0RmlsZU9wdGlvbnM6IElGaWxlSW1wb3J0ZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIGRpc3BsYXlzRHJvcGRvd25Cb3g6IERldkV4cHJlc3MudWkuZHhTZWxlY3RCb3ggfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBjdXJyZW50RGlzcGxheVRpdGxlOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHNhdmVCdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b24gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBzYXZlQXNCdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b24gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBkYXRhR3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgZmlsZUltcG9ydGVyOiBGaWxlSW1wb3J0ZXIgfCB1bmRlZmluZWQ7XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlIHZhcmlhYmxlLW5hbWVcclxuICBwcml2YXRlIF9kaXNwbGF5c1Rvb2xiYXJJdGVtOiBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW0gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfaW1wb3J0RmlsZVRvb2xiYXJJdGVtOiBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW0gfCB1bmRlZmluZWQ7XHJcbiAgLy8gdHNsaW50OmVuYWJsZSB2YXJpYWJsZS1uYW1lXHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElHcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyID0gb3B0aW9ucy5ncmlkRGlzcGxheXNNYW5hZ2VyO1xyXG4gICAgdGhpcy5ncmlkVmlld3NNYW5hZ2VyID0gb3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyO1xyXG4gICAgdGhpcy5ncmlkRmlsdGVyc01hbmFnZXIgPSBvcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlcjtcclxuICAgIHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMgPSBvcHRpb25zLmltcG9ydEZpbGVPcHRpb25zO1xyXG5cclxuICAgIHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci5vbkRpc3BsYWlzTG9hZGVkID0gKGRpc3BsYXlzKSA9PiB7XHJcbiAgICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGV2RXhwcmVzcy5kYXRhLkFycmF5U3RvcmUoe1xyXG4gICAgICAgIGtleTogJ0lkJyxcclxuICAgICAgICBkYXRhOiBkaXNwbGF5c1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMuZGlzcGxheXNEcm9wZG93bkJveCAmJiB0aGlzLmRpc3BsYXlzRHJvcGRvd25Cb3gub3B0aW9uKCdkYXRhU291cmNlJywgZGF0YVNvdXJjZSk7XHJcblxyXG4gICAgICB0aGlzLmRhdGFHcmlkICYmIHRoaXMuZGF0YUdyaWQub3B0aW9uKCdkYXRhU291cmNlJywgZGF0YVNvdXJjZSk7XHJcbiAgICAgIHRoaXMuZGF0YUdyaWQgJiYgdGhpcy5kYXRhR3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci5vbkRpc3BsYXlDaGFuZ2VkID0gKGRpc3BsYXkpID0+IHtcclxuICAgICAgdGhpcy5kaXNwbGF5c0Ryb3Bkb3duQm94ICYmIHRoaXMuZGlzcGxheXNEcm9wZG93bkJveC5vcHRpb24oJ3ZhbHVlJywgZGlzcGxheSA/IGRpc3BsYXkuSWQgOiBudWxsKTtcclxuICAgICAgdGhpcy5jdXJyZW50RGlzcGxheVRpdGxlICYmIHRoaXMuY3VycmVudERpc3BsYXlUaXRsZS5vcHRpb24oJ3ZhbHVlJywgZGlzcGxheSA/IGRpc3BsYXkuTmFtZSA6IG51bGwpO1xyXG4gICAgICB0aGlzLmN1cnJlbnREaXNwbGF5VGl0bGUgJiYgdGhpcy5jdXJyZW50RGlzcGxheVRpdGxlLm9wdGlvbignZGlzYWJsZWQnLCAhZGlzcGxheSk7XHJcbiAgICAgIHRoaXMuc2F2ZUFzQnV0dG9uICYmIHRoaXMuc2F2ZUFzQnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCAhZGlzcGxheSk7XHJcbiAgICAgIHRoaXMuc2F2ZUJ1dHRvbiAmJiB0aGlzLnNhdmVCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsICFkaXNwbGF5KTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmRhdGFHcmlkKSB7XHJcbiAgICAgICAgZGlzcGxheVxyXG4gICAgICAgICAgPyB0aGlzLmRhdGFHcmlkLnNlbGVjdFJvd3MoW2Rpc3BsYXkuSWRdLCBmYWxzZSlcclxuICAgICAgICAgIDogdGhpcy5kYXRhR3JpZC5kZXNlbGVjdEFsbCgpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuaW50ZWdyYXRlVG9HcmlkKHRoaXMub3B0aW9ucy5vd25lcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGludGVncmF0ZVRvR3JpZChncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQpIHtcclxuICAgIGNvbnN0IGN1cnJlbnRUb29sYmFyUHJlcGFyaW5nID0gZ3JpZC5vcHRpb24oJ29uVG9vbGJhclByZXBhcmluZycpO1xyXG5cclxuICAgIGdyaWQub3B0aW9uKCdvblRvb2xiYXJQcmVwYXJpbmcnLCAoZTogYW55KSA9PiB7XHJcbiAgICAgIGN1cnJlbnRUb29sYmFyUHJlcGFyaW5nICYmIGN1cnJlbnRUb29sYmFyUHJlcGFyaW5nKGUpO1xyXG4gICAgICB0aGlzLm9uR3JpZFRvb2xiYXJQcmVwYXJpbmcoZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25HcmlkVG9vbGJhclByZXBhcmluZzogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snb25Ub29sYmFyUHJlcGFyaW5nJ10gPSAoZSkgPT4ge1xyXG4gICAgY29uc3QgdG9vbGJhckl0ZW1zID0gZS50b29sYmFyT3B0aW9ucyAmJiBlLnRvb2xiYXJPcHRpb25zLml0ZW1zO1xyXG4gICAgaWYgKCF0b29sYmFySXRlbXMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5ld0l0ZW1zID0gW3RoaXMuZGlzcGxheXNUb29sYmFySXRlbV07XHJcblxyXG4gICAgaWYgKHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMgJiYgdGhpcy5pbXBvcnRGaWxlT3B0aW9ucy5tb2RlICE9PSBDZG1JbXBvcnRGaWxlTW9kZS5Ob25lKSB7XHJcbiAgICAgIG5ld0l0ZW1zLnB1c2godGhpcy5pbXBvcnRGaWxlVG9vbGJhckl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRvb2xiYXJJdGVtcy5zcGxpY2UoMSwgMCwgLi4ubmV3SXRlbXMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVEYXRhR3JpZChkcm9wZG93bkJveE93bmVyOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3gpOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKVxyXG4gICAgICAuZHhEYXRhR3JpZCh7XHJcbiAgICAgICAgZGF0YVNvdXJjZTogZHJvcGRvd25Cb3hPd25lci5nZXREYXRhU291cmNlKCksXHJcbiAgICAgICAgcmVtb3RlT3BlcmF0aW9uczogZmFsc2UsXHJcbiAgICAgICAgZWRpdGluZzoge1xyXG4gICAgICAgICAgYWxsb3dBZGRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgYWxsb3dVcGRhdGluZzogZmFsc2UsXHJcbiAgICAgICAgICBhbGxvd0RlbGV0aW5nOiB0aGlzLm9wdGlvbnMuZWRpdE1vZGUsXHJcbiAgICAgICAgICBtb2RlOiAncm93JyxcclxuICAgICAgICAgIHVzZUljb25zOiB0cnVlLFxyXG4gICAgICAgICAgdGV4dHM6IHtcclxuICAgICAgICAgICAgY29uZmlybURlbGV0ZU1lc3NhZ2U6ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgZGlzcGxheT8nXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBsb2FkUGFuZWw6IHtcclxuICAgICAgICAgIHNoYWRpbmc6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgIGFsbG93Q29sdW1uUmVzaXppbmc6IHRydWUsXHJcbiAgICAgICAgY29sdW1uQXV0b1dpZHRoOiB0cnVlLFxyXG4gICAgICAgIHdvcmRXcmFwRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBjb2x1bW5zOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ05hbWUnLFxyXG4gICAgICAgICAgICBjYXB0aW9uOiAnRGlzcGxheSdcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ0ZpbHRlcklkJyxcclxuICAgICAgICAgICAgY2FwdGlvbjogJ0RhdGEgU2V0JyxcclxuICAgICAgICAgICAgbG9va3VwOiB7XHJcbiAgICAgICAgICAgICAgdmFsdWVFeHByOiAnaWQnLFxyXG4gICAgICAgICAgICAgIGRpc3BsYXlFeHByOiAnbmFtZSdcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnVmlld0lkJyxcclxuICAgICAgICAgICAgY2FwdGlvbjogJ1ZpZXcnLFxyXG4gICAgICAgICAgICBsb29rdXA6IHtcclxuICAgICAgICAgICAgICB2YWx1ZUV4cHI6ICdpZCcsXHJcbiAgICAgICAgICAgICAgZGlzcGxheUV4cHI6ICduYW1lJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXSxcclxuICAgICAgICBrZXlib2FyZE5hdmlnYXRpb246IHtcclxuICAgICAgICAgIGVkaXRPbktleVByZXNzOiBmYWxzZSxcclxuICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzaG93Q29sdW1uSGVhZGVyczogdHJ1ZSxcclxuICAgICAgICBob3ZlclN0YXRlRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBmb2N1c2VkUm93RW5hYmxlZDogZmFsc2UsXHJcbiAgICAgICAgc2hvd0JvcmRlcnM6IGZhbHNlLFxyXG4gICAgICAgIGhlaWdodDogdGhpcy5vcHRpb25zLmVkaXRNb2RlID8gJ2NhbGMoMTAwJSAtIDUxcHgpJyA6ICcxMDAlJyxcclxuICAgICAgICBzY3JvbGxpbmc6IHsgbW9kZTogJ3N0YW5kYXJkJyB9LFxyXG4gICAgICAgIHBhZ2luZzogeyBlbmFibGVkOiBmYWxzZSB9LFxyXG4gICAgICAgIG5vRGF0YVRleHQ6ICdObyBkaXNwbGF5cycsXHJcbiAgICAgICAgb25Jbml0aWFsaXplZDogYXN5bmMgKGUpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGZpbHRlcnMgPSBhd2FpdCB0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlci5nZXRGaWx0ZXJzKCk7XHJcbiAgICAgICAgICBjb25zdCB2aWV3cyA9IGF3YWl0IHRoaXMuZ3JpZFZpZXdzTWFuYWdlci5nZXRWaWV3cygpO1xyXG5cclxuICAgICAgICAgIGUuY29tcG9uZW50LmNvbHVtbk9wdGlvbignRmlsdGVySWQnLCAnbG9va3VwLmRhdGFTb3VyY2UnLCBmaWx0ZXJzKTtcclxuICAgICAgICAgIGUuY29tcG9uZW50LmNvbHVtbk9wdGlvbignVmlld0lkJywgJ2xvb2t1cC5kYXRhU291cmNlJywgdmlld3MpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25DZWxsQ2xpY2s6IGFzeW5jIChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZS5yb3dUeXBlICE9PSAnZGF0YScpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCd2YWx1ZScsIGUuZGF0YS5JZCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvblJvd1JlbW92aW5nOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRhR3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ0xvYWRpbmcnKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci5kZWxldGVEaXNwbGF5KGUua2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5keERhdGFHcmlkKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVEaXNwbGF5c1Rvb2xiYXJJdGVtKCk6IERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbSB7XHJcbiAgICBjb25zdCBiYXNpY09wdGlvbnM6IERldkV4cHJlc3MudWkuZHhTZWxlY3RCb3guUHJvcGVydGllcyB8IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveC5Qcm9wZXJ0aWVzID0ge1xyXG4gICAgICB2YWx1ZUV4cHI6ICdJZCcsXHJcbiAgICAgIGRpc3BsYXlFeHByOiAnTmFtZScsXHJcbiAgICAgIHNob3dDbGVhckJ1dHRvbjogdHJ1ZSxcclxuICAgICAgcGxhY2Vob2xkZXI6ICdOb25lJyxcclxuICAgICAgd2lkdGg6IDIwMCxcclxuICAgICAgb25Jbml0aWFsaXplZDogKGUpID0+IHtcclxuICAgICAgICB0aGlzLmRpc3BsYXlzRHJvcGRvd25Cb3ggPSBlLmNvbXBvbmVudDtcclxuICAgICAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuZ2V0RGlzcGxheXMoKTtcclxuICAgICAgfSxcclxuICAgICAgb25WYWx1ZUNoYW5nZWQ6IGFzeW5jIChlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZGlzcGxheSA9IHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci5jdXJyZW50RGlzcGxheTtcclxuXHJcbiAgICAgICAgY29uc3QgZmlsdGVyQ2hhbmdlZCA9IGRpc3BsYXkgJiYgZGlzcGxheS5GaWx0ZXJJZCAhPT0gdGhpcy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkO1xyXG4gICAgICAgIGNvbnN0IHZpZXdDaGFuZ2VkID0gZGlzcGxheSAmJiBkaXNwbGF5LlZpZXdJZCAhPT0gdGhpcy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWQ7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IChmaWx0ZXJDaGFuZ2VkIHx8IHZpZXdDaGFuZ2VkXHJcbiAgICAgICAgICA/IHRoaXMuY29uZmlybUNoYW5nZXNMb3NzKClcclxuICAgICAgICAgIDogUHJvbWlzZS5yZXNvbHZlKHRydWUpKTtcclxuXHJcbiAgICAgICAgaWYgKGNvbmZpcm1lZCkge1xyXG4gICAgICAgICAgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmN1cnJlbnREaXNwbGF5SWQgPSBlLnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBkcm9wRG93bkJveE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveE9wdGlvbnMgPSB7XHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7Y2xhc3M6ICdpc3pvbGVhLW1kJ30sXHJcbiAgICAgIGRyb3BEb3duT3B0aW9uczoge1xyXG4gICAgICAgIHdpZHRoOiA4MDBcclxuICAgICAgfSxcclxuICAgICAgY29udGVudFRlbXBsYXRlOiAhdGhpcy5vcHRpb25zLmVkaXRNb2RlID8gdm9pZCAwIDogKGUpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFHcmlkID0gdGhpcy5jcmVhdGVEYXRhR3JpZChlLmNvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50RGlzcGxheVRpdGxlID0gdGhpcy5jcmVhdGVDdXJyZW50RGlzcGxheVRpdGxlKGUuY29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLnNhdmVCdXR0b24gPSB0aGlzLmNyZWF0ZVNhdmVWaWV3QnV0dG9uKCk7XHJcbiAgICAgICAgdGhpcy5zYXZlQXNCdXR0b24gPSB0aGlzLmNyZWF0ZVNhdmVWaWV3QXNCdXR0b24oKTtcclxuXHJcbiAgICAgICAgY29uc3QgZHJvcGRvd25Db250ZW50SGVhZGVyID0gJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAuYWRkQ2xhc3MoJ2Fwcy1kaXNwbGF5c19faGVhZGVyJylcclxuICAgICAgICAgIC5hcHBlbmQodGhpcy5jdXJyZW50RGlzcGxheVRpdGxlLmVsZW1lbnQoKSlcclxuICAgICAgICAgIC5hcHBlbmQodGhpcy5zYXZlQnV0dG9uLmVsZW1lbnQoKSlcclxuICAgICAgICAgIC5hcHBlbmQodGhpcy5zYXZlQXNCdXR0b24uZWxlbWVudCgpKTtcclxuXHJcbiAgICAgICAgY29uc3QgZHJvcGRvd25Db250ZW50ID0gJCgnPGRpdiAvPicpLmhlaWdodCgnMTAwJScpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVkaXRNb2RlKSB7XHJcbiAgICAgICAgICBkcm9wZG93bkNvbnRlbnQuYXBwZW5kKGRyb3Bkb3duQ29udGVudEhlYWRlcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkcm9wZG93bkNvbnRlbnQuYXBwZW5kKHRoaXMuZGF0YUdyaWQuZWxlbWVudCgpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRyb3Bkb3duQ29udGVudDtcclxuICAgICAgfSxcclxuICAgICAgb25PcGVuZWQ6ICgpID0+IHtcclxuICAgICAgICB0aGlzLnNhdmVBc0J1dHRvbiAmJiB0aGlzLnNhdmVBc0J1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgIXRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZCk7XHJcbiAgICAgICAgdGhpcy5zYXZlQnV0dG9uICYmIHRoaXMuc2F2ZUJ1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgIXRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci5jdXJyZW50RGlzcGxheSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgd2lkZ2V0OiB0aGlzLm9wdGlvbnMuZWRpdE1vZGUgPyAoJ2R4RHJvcERvd25Cb3gnIGFzIGFueSkgOiAnZHhTZWxlY3RCb3gnLFxyXG4gICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgdGV4dDogJ0Rpc3BsYXlzJyxcclxuICAgICAgY3NzQ2xhc3M6ICdhcHMtZGlzcGxheXNfX3Rvb2xiYXItaXRlbScsXHJcbiAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucy5lZGl0TW9kZSA/ICQuZXh0ZW5kKGJhc2ljT3B0aW9ucywgZHJvcERvd25Cb3hPcHRpb25zKSA6IGJhc2ljT3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlSW1wb3J0RmlsZVRvb2xiYXJJdGVtKCk6IERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgaWNvbjogJ3VwbG9hZCcsXHJcbiAgICAgICAgaGludDogJ0ltcG9ydCBmaWxlJyxcclxuICAgICAgICBoZWlnaHQ6IDMwLFxyXG4gICAgICAgIHN0eWxpbmdNb2RlOiAndGV4dCcsXHJcbiAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuZmlsZUltcG9ydGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsZUltcG9ydGVyLmRpc3Bvc2UoKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmZpbGVJbXBvcnRlciA9IG5ldyBGaWxlSW1wb3J0ZXIoe1xyXG4gICAgICAgICAgICAkY29udGFpbmVyOiB0aGlzLm9wdGlvbnMub3duZXIuZWxlbWVudCgpLnBhcmVudCgpLFxyXG4gICAgICAgICAgICB0aXRsZTogJ0ltcG9ydCBGaWxlIHRvIENETScsXHJcbiAgICAgICAgICAgIGNyZWF0ZVRhYmxlVXJsOiB0aGlzLmltcG9ydEZpbGVPcHRpb25zLmNyZWF0ZVRhYmxlVXJsLFxyXG4gICAgICAgICAgICBhZGRSb3dzVXJsOiB0aGlzLmltcG9ydEZpbGVPcHRpb25zLmFkZFJvd3NVcmwsXHJcbiAgICAgICAgICAgIGZpbGVVcGxvYWRVcmw6IHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMuZmlsZVVwbG9hZFVybCxcclxuICAgICAgICAgICAgcHJlZGVmaW5lZEltcG9ydEZpbGVNb2RlOiB0aGlzLmdldFByZWRlZmluZWRJbXBvcnRGaWxlTW9kZSh0aGlzLmltcG9ydEZpbGVPcHRpb25zLm1vZGUpLFxyXG4gICAgICAgICAgICBwcmVkZWZpbmVkVGFibGU6IHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMucHJlZGVmaW5lZFRhYmxlLFxyXG4gICAgICAgICAgICBjcmVhdGVUYWJsZUJ1dHRvblRleHQ6ICdSZXBsYWNlIEFsbCBSb3dzJyxcclxuICAgICAgICAgICAgY3JlYXRlVGFibGVNb2RlVGV4dDogJ1JlcGxhY2UgUm93cycsXHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB0aGlzLmZpbGVJbXBvcnRlci5vbihGaWxlSW1wb3J0ZXIuVEFCTEVfVVBEQVRFRF9FVkVOVCwgKCkgPT4gdGhpcy5vcHRpb25zLm93bmVyLnJlZnJlc2goKSk7XHJcbiAgICAgICAgICB0aGlzLmZpbGVJbXBvcnRlci5zaG93KCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkNvbnRlbnRSZWFkeTogKGUpID0+IHtcclxuICAgICAgICAgIGUuZWxlbWVudC5maW5kKCcuZHgtYnV0dG9uLWNvbnRlbnQnKS5jc3Moe1xyXG4gICAgICAgICAgICBwYWRkaW5nVG9wOiA1LFxyXG4gICAgICAgICAgICBwYWRkaW5nQm90dG9tOiA1XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFByZWRlZmluZWRJbXBvcnRGaWxlTW9kZShtb2RlOiBDZG1JbXBvcnRGaWxlTW9kZSk6IEltcG9ydEZpbGVNb2RlIHtcclxuICAgIHN3aXRjaCAobW9kZSkge1xyXG4gICAgICBjYXNlIENkbUltcG9ydEZpbGVNb2RlLkFkZE5ld1Jvd3M6XHJcbiAgICAgICAgcmV0dXJuIEltcG9ydEZpbGVNb2RlLkFkZE5ld1Jvd3M7XHJcblxyXG4gICAgICBjYXNlIENkbUltcG9ydEZpbGVNb2RlLlJlcGxhY2VBbGxSb3dzOlxyXG4gICAgICAgIHJldHVybiBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZTtcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBtb2RlJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUN1cnJlbnREaXNwbGF5VGl0bGUoZHJvcGRvd25Cb3hPd25lcjogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94KTogRGV2RXhwcmVzcy51aS5keFRleHRCb3gge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy1kaXNwbGF5c19fY3VycmVudC1kaXNwbGF5IGlzem9sZWEtbWQnKVxyXG4gICAgICAuZHhUZXh0Qm94KHtcclxuICAgICAgICB2YWx1ZTogZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3RleHQnKSB8fCBkcm9wZG93bkJveE93bmVyLm9wdGlvbigncGxhY2Vob2xkZXInKSxcclxuICAgICAgICBkaXNhYmxlZDogIXRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci5jdXJyZW50RGlzcGxheSxcclxuICAgICAgfSlcclxuICAgICAgLmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2F2ZVZpZXdCdXR0b24oKTogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB7XHJcbiAgICByZXR1cm4gJCgnPGJ1dHRvbiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLWRpc3BsYXlzX19zYXZlLWRpc3BsYXkgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keEJ1dHRvbih7XHJcbiAgICAgICAgdGV4dDogJ1NhdmUnLFxyXG4gICAgICAgIHR5cGU6ICdub3JtYWwnLFxyXG4gICAgICAgIGRpc2FibGVkOiAhdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmN1cnJlbnREaXNwbGF5LFxyXG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZGF0YUdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdMb2FkaW5nJyk7XHJcblxyXG4gICAgICAgICAgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLnVwZGF0ZUN1cnJlbnREaXNwbGF5KFxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnREaXNwbGF5VGl0bGUub3B0aW9uKCd2YWx1ZScpLFxyXG4gICAgICAgICAgICB0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQsXHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaWNvbjogJ3NhdmUnLFxyXG4gICAgICAgIHdpZHRoOiAxMjVcclxuICAgICAgfSlcclxuICAgICAgLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlVmlld0FzQnV0dG9uKCk6IERldkV4cHJlc3MudWkuZHhCdXR0b24ge1xyXG4gICAgcmV0dXJuICQoJzxidXR0b24gLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy1kaXNwbGF5X19zYXZlLWRpc3BsYXktYXMgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keEJ1dHRvbih7XHJcbiAgICAgICAgdGV4dDogJ1NhdmUgQXMnLFxyXG4gICAgICAgIHR5cGU6ICdub3JtYWwnLFxyXG4gICAgICAgIGRpc2FibGVkOiAhdGhpcy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkLFxyXG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IChcclxuICAgICAgICAgIHRoaXMuY3JlYXRlU2F2ZUFzRGlhbG9nKClcclxuICAgICAgICApLFxyXG4gICAgICAgIGljb246ICdzYXZlJyxcclxuICAgICAgICB3aWR0aDogMTYwXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2F2ZUFzRGlhbG9nKCkge1xyXG4gICAgY29uc3QgJHBvcHVwQ29udGVudCA9ICQoJzxkaXYgLz4nKTtcclxuXHJcbiAgICBjb25zdCBkaWFsb2dDb250ZW50RWxlbWVudCA9ICQoJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjhweDtcIiAvPicpLmR4VGV4dEJveCh7XHJcbiAgICAgIHBsYWNlaG9sZGVyOiAnRGlzcGxheSBOYW1lJyxcclxuICAgICAgc2hvd0NsZWFyQnV0dG9uOiB0cnVlLFxyXG4gICAgfSkuZHhWYWxpZGF0b3Ioe1xyXG4gICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICB7IHR5cGU6ICdyZXF1aXJlZCcgfSxcclxuICAgICAgXVxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBuYW1lVGV4dEJveCA9IGRpYWxvZ0NvbnRlbnRFbGVtZW50LmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuICAgIGNvbnN0IHZhbGlkYXRvciA9IGRpYWxvZ0NvbnRlbnRFbGVtZW50LmR4VmFsaWRhdG9yKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIG5hbWVUZXh0Qm94LmVsZW1lbnQoKS5hcHBlbmRUbygkcG9wdXBDb250ZW50KTtcclxuXHJcbiAgICByZXR1cm4gY3JlYXRlRGlhbG9nKFxyXG4gICAgICB7XHJcbiAgICAgICAgdGl0bGU6ICdDcmVhdGUgTmV3IERpc3BsYXknLFxyXG4gICAgICAgIGhlaWdodDogJ2F1dG8nLFxyXG4gICAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgICAgbWF4V2lkdGg6ICczMDBweCcsXHJcbiAgICAgIH0sXHJcbiAgICAgICRwb3B1cENvbnRlbnQsXHJcbiAgICAgIHtcclxuICAgICAgICB0ZXh0OiAnT2snLFxyXG4gICAgICAgIG9uQ2xpY2s6IGFzeW5jIChjbG9zZVBvcHVwKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXZhbGlkYXRvci52YWxpZGF0ZSgpLmlzVmFsaWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuZGF0YUdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdMb2FkaW5nJyk7XHJcblxyXG4gICAgICAgICAgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmNyZWF0ZU5ld0Rpc3BsYXkoXHJcbiAgICAgICAgICAgIG5hbWVUZXh0Qm94Lm9wdGlvbigndmFsdWUnKSxcclxuICAgICAgICAgICAgdGhpcy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkLFxyXG4gICAgICAgICAgICB0aGlzLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXdJZFxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBjbG9zZVBvcHVwKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHRleHQ6ICdDYW5jZWwnLFxyXG4gICAgICAgIG9uQ2xpY2s6IChjbG9zZVBvcHVwKSA9PiBjbG9zZVBvcHVwKClcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGNvbmZpcm1DaGFuZ2VzTG9zcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBEZXZFeHByZXNzLnVpLmRpYWxvZy5jb25maXJtKFxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gICAgICAnWW91IGhhdmUgdW5zYXZlZCBjaGFuZ2VzIHRoYXQgd2lsbCBiZSBsb3N0IGlmIHlvdSBjbG9zZSB0aGlzIHBvcHVwLiBEbyB5b3Ugd2FudCB0byBjbG9zZSB0aGUgcG9wdXAgYW5kIG5vdCBzYXZlIGNoYW5nZXM/JyxcclxuICAgICAgJ1Vuc2F2ZWQgY2hhbmdlcydcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBkaXNwbGF5c1Rvb2xiYXJJdGVtKCkge1xyXG4gICAgaWYgKCF0aGlzLl9kaXNwbGF5c1Rvb2xiYXJJdGVtKSB7XHJcbiAgICAgIHRoaXMuX2Rpc3BsYXlzVG9vbGJhckl0ZW0gPSB0aGlzLmNyZWF0ZURpc3BsYXlzVG9vbGJhckl0ZW0oKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fZGlzcGxheXNUb29sYmFySXRlbTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGltcG9ydEZpbGVUb29sYmFySXRlbSgpIHtcclxuICAgIGlmICghdGhpcy5faW1wb3J0RmlsZVRvb2xiYXJJdGVtKSB7XHJcbiAgICAgIHRoaXMuX2ltcG9ydEZpbGVUb29sYmFySXRlbSA9IHRoaXMuY3JlYXRlSW1wb3J0RmlsZVRvb2xiYXJJdGVtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2ltcG9ydEZpbGVUb29sYmFySXRlbTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbiBmcm9tICcuLi8uLi8uLi9EYXRhL0xvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uJztcclxuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi9EYXRhL1JlcXVlc3QnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnMge1xyXG4gIGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgaW5zZXJ0RGF0YVVybDogc3RyaW5nO1xyXG4gIHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuICBkZWxldGVEYXRhVXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5IHtcclxuICByZWFkb25seSBJZDogbnVtYmVyO1xyXG4gIHJlYWRvbmx5IE5hbWU6IHN0cmluZztcclxuICByZWFkb25seSBGaWx0ZXJJZDogbnVtYmVyO1xyXG4gIHJlYWRvbmx5IFZpZXdJZDogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgR3JpZERpc3BsYXlzTWFuYWdlciB7XHJcbiAgcHJpdmF0ZSBkaXNwbGF5czogSUNvbnRyb2xEaXNwbGF5W10gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudEhhbmRsZXJzOiB7XHJcbiAgICBjaGFuZ2VkOiBBcnJheTwoZGlzcGxheTogSUNvbnRyb2xEaXNwbGF5KSA9PiB2b2lkPixcclxuICAgIGxvYWRlZDogQXJyYXk8KGRpc3BsYWlzOiBJQ29udHJvbERpc3BsYXlbXSkgPT4gdm9pZD5cclxuICB9O1xyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgX2N1cnJlbnREaXNwbGF5SWQ6IG51bWJlciA9IDA7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGluc2VydERhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlbGV0ZURhdGFVcmw6IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zKSB7XHJcbiAgICB0aGlzLmxvYWREYXRhVXJsID0gb3B0aW9ucy5sb2FkRGF0YVVybDtcclxuICAgIHRoaXMuaW5zZXJ0RGF0YVVybCA9IG9wdGlvbnMuaW5zZXJ0RGF0YVVybDtcclxuICAgIHRoaXMudXBkYXRlRGF0YVVybCA9IG9wdGlvbnMudXBkYXRlRGF0YVVybDtcclxuICAgIHRoaXMuZGVsZXRlRGF0YVVybCA9IG9wdGlvbnMuZGVsZXRlRGF0YVVybDtcclxuXHJcbiAgICB0aGlzLmV2ZW50SGFuZGxlcnMgPSB7XHJcbiAgICAgIGNoYW5nZWQ6IFtdLFxyXG4gICAgICBsb2FkZWQ6IFtdXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGxvYWREaXNwbGF5cygpIHtcclxuICAgIHRoaXMuZGlzcGxheXMgPSBhd2FpdCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbjxJQ29udHJvbERpc3BsYXlbXT4odGhpcy5sb2FkRGF0YVVybCk7XHJcbiAgICB0aGlzLm9uRGlzcGxhaXNMb2FkZWRQcml2YXRlKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0RGlzcGxheXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5cyB8fCBhd2FpdCB0aGlzLmxvYWREaXNwbGF5cygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldERpc3BsYXlCeUlkID0gKGlkOiBudW1iZXIpID0+IHtcclxuICAgIGlmICghaWQgfHwgIXRoaXMuZGlzcGxheXMpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheXMuZmluZCgodikgPT4gdi5JZCA9PT0gaWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGNyZWF0ZU5ld0Rpc3BsYXkobmFtZTogc3RyaW5nLCBmaWx0ZXJJZDogbnVtYmVyLCB2aWV3SWQ6IG51bWJlcikge1xyXG4gICAgY29uc3QgbmV3Vmlld0R0byA9IHtcclxuICAgICAgSWQ6IDAsXHJcbiAgICAgIE5hbWU6IG5hbWUsXHJcbiAgICAgIEZpbHRlcklkOiBmaWx0ZXJJZCxcclxuICAgICAgVmlld0lkOiB2aWV3SWRcclxuICAgIH07XHJcblxyXG4gICAgYXdhaXQgc2VuZFJlcXVlc3QodGhpcy5pbnNlcnREYXRhVXJsLCAnUE9TVCcsIG5ld1ZpZXdEdG8pO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkRGlzcGxheXMoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBkZWxldGVEaXNwbGF5KGlkOiBudW1iZXIpIHtcclxuICAgIGF3YWl0IHNlbmRSZXF1ZXN0KHRoaXMuZGVsZXRlRGF0YVVybCwgJ0RFTEVURScsIHsgaWQgfSk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWREaXNwbGF5cygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZUN1cnJlbnREaXNwbGF5KG5hbWU6IHN0cmluZywgZmlsdGVySWQ6IG51bWJlciwgdmlld0lkOiBudW1iZXIpIHtcclxuICAgIHJldHVybiB0aGlzLnVwZGF0ZURpc3BsYXkodGhpcy5jdXJyZW50RGlzcGxheS5JZCwgbmFtZSwgZmlsdGVySWQsIHZpZXdJZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgdXBkYXRlRGlzcGxheShpZDogbnVtYmVyLCBuYW1lOiBzdHJpbmcsIGZpbHRlcklkOiBudW1iZXIsIHZpZXdJZDogbnVtYmVyKSB7XHJcbiAgICBhd2FpdCBzZW5kUmVxdWVzdCh0aGlzLnVwZGF0ZURhdGFVcmwsICdQVVQnLCB7XHJcbiAgICAgIGlkLCBuYW1lLCBmaWx0ZXJJZCwgdmlld0lkXHJcbiAgICB9KTtcclxuICAgIGF3YWl0IHRoaXMubG9hZERpc3BsYXlzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uRGlzcGxheUNoYW5nZWRQcml2YXRlKCkge1xyXG4gICAgdGhpcy5ldmVudEhhbmRsZXJzLmNoYW5nZWQuZm9yRWFjaCgoaGFuZGxlcnMpID0+IChcclxuICAgICAgaGFuZGxlcnModGhpcy5jdXJyZW50RGlzcGxheSlcclxuICAgICkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkRpc3BsYWlzTG9hZGVkUHJpdmF0ZSgpIHtcclxuICAgIHRoaXMuZXZlbnRIYW5kbGVycy5sb2FkZWQuZm9yRWFjaCgoaGFuZGxlcnMpID0+IChcclxuICAgICAgaGFuZGxlcnModGhpcy5kaXNwbGF5cylcclxuICAgICkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXJyZW50RGlzcGxheUlkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnREaXNwbGF5SWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGN1cnJlbnREaXNwbGF5SWQoaWQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5fY3VycmVudERpc3BsYXlJZCA9IGlkO1xyXG4gICAgdGhpcy5vbkRpc3BsYXlDaGFuZ2VkUHJpdmF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXJyZW50RGlzcGxheSgpIHtcclxuICAgIHJldHVybiB0aGlzLmdldERpc3BsYXlCeUlkKHRoaXMuX2N1cnJlbnREaXNwbGF5SWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBvbkRpc3BsYXlDaGFuZ2VkKGhhbmRsZXI6IChkaXNwbGF5OiBJQ29udHJvbERpc3BsYXkpID0+IHZvaWQpIHtcclxuICAgIHRoaXMuZXZlbnRIYW5kbGVycy5jaGFuZ2VkLnB1c2goaGFuZGxlcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IG9uRGlzcGxhaXNMb2FkZWQoaGFuZGxlcjogKGRpc3BsYWlzOiBJQ29udHJvbERpc3BsYXlbXSkgPT4gdm9pZCkge1xyXG4gICAgdGhpcy5ldmVudEhhbmRsZXJzLmxvYWRlZC5wdXNoKGhhbmRsZXIpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgTXV0YWJsZSB9IGZyb20gJy4uLy4uLy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbk9wdGlvbnMge1xyXG4gIHJlYWRvbmx5IG93bmVyOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XHJcbiAgcmVhZG9ubHkgYXV0b0ludGVncmF0aW9uOiBib29sZWFuO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSU11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luRGVmYXVsdE9wdGlvbnMge1xyXG4gIHJlYWRvbmx5IGF1dG9JbnRlZ3JhdGlvbjogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW5PcHRpb25zID1cclxuICBNdXRhYmxlPE9taXQ8SU11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luT3B0aW9ucywga2V5b2YgSU11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luRGVmYXVsdE9wdGlvbnM+PiAmXHJcbiAgTXV0YWJsZTxQYXJ0aWFsPElNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbkRlZmF1bHRPcHRpb25zPj47XHJcblxyXG5leHBvcnQgY2xhc3MgTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW4ge1xyXG4gIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBJTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW5PcHRpb25zO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbk9wdGlvbnMpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IHtcclxuICAgICAgLi4ub3B0aW9ucyxcclxuICAgICAgYXV0b0ludGVncmF0aW9uOiAob3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAhPT0gbnVsbClcclxuICAgICAgICA/IG9wdGlvbnMuYXV0b0ludGVncmF0aW9uIDogdHJ1ZVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLm9wdGlvbnMuYXV0b0ludGVncmF0aW9uICYmIHRoaXMuaW50ZWdyYXRlVG9HcmlkKHRoaXMub3B0aW9ucy5vd25lcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGludGVncmF0ZVRvR3JpZChncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQpIHtcclxuICAgIGdyaWQub3B0aW9uKCdzZWxlY3Rpb24nLCB7XHJcbiAgICAgIG1vZGU6ICdtdWx0aXBsZSdcclxuICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snc2VsZWN0aW9uJ10pO1xyXG4gICAgZ3JpZC5vbignZWRpdG9yUHJlcGFyaW5nJywgdGhpcy5vbkdyaWRFZGl0b3JQcmVwYXJpbmcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkdyaWRFZGl0b3JQcmVwYXJpbmc6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnNbJ29uRWRpdG9yUHJlcGFyaW5nJ10gPSAoZSkgPT4ge1xyXG4gICAgaWYgKCFlLmNvbXBvbmVudCB8fCAhZS5lZGl0b3JPcHRpb25zIHx8IGUucGFyZW50VHlwZSAhPT0gJ2RhdGFSb3cnIHx8ICFlLmRhdGFGaWVsZCB8fCAhZS5yb3cgfHwgIWUucm93LmtleSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZGF0YUZpZWxkID0gZS5kYXRhRmllbGQ7XHJcbiAgICBjb25zdCBlZGl0b3JLZXkgPSBlLnJvdy5rZXk7XHJcbiAgICBjb25zdCBkZWZhdWx0TGlzdGVuZXIgPSBlLmVkaXRvck9wdGlvbnMub25WYWx1ZUNoYW5nZWQ7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXNoYWRvd2VkLXZhcmlhYmxlXHJcbiAgICBlLmVkaXRvck9wdGlvbnMub25WYWx1ZUNoYW5nZWQgPSAoZXZlbnQ6IHsgdmFsdWU6IGFueSB9KSA9PiB7XHJcbiAgICAgIGRlZmF1bHRMaXN0ZW5lcihldmVudCk7XHJcblxyXG4gICAgICB0aGlzLnVwZGF0ZU11bHRpcGxlUm93cyhkYXRhRmllbGQsIGVkaXRvcktleSwgZXZlbnQudmFsdWUpO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlTXVsdGlwbGVSb3dzPFQ+KGRhdGFGaWVsZDogc3RyaW5nLCBlZGl0b3JLZXk6IHN0cmluZywgdmFsdWU6IFQpIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkUm93S2V5czogc3RyaW5nW10gPSBhd2FpdCB0aGlzLm9wdGlvbnMub3duZXIuZ2V0U2VsZWN0ZWRSb3dLZXlzKCk7XHJcbiAgICBpZiAoIXNlbGVjdGVkUm93S2V5cy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGVkaXRvcktleVNlbGVjdGVkSW5kZXggPSBzZWxlY3RlZFJvd0tleXMuZmluZEluZGV4KChrKSA9PiBrID09PSBlZGl0b3JLZXkpO1xyXG4gICAgaWYgKGVkaXRvcktleVNlbGVjdGVkSW5kZXggPCAwIHx8IHNlbGVjdGVkUm93S2V5cy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdGVkUm93S2V5cy5zcGxpY2UoZWRpdG9yS2V5U2VsZWN0ZWRJbmRleCwgMSk7XHJcbiAgICBzZWxlY3RlZFJvd0tleXMuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5vd25lci5jZWxsVmFsdWUodGhpcy5vcHRpb25zLm93bmVyLmdldFJvd0luZGV4QnlLZXkoa2V5KSwgZGF0YUZpZWxkLCB2YWx1ZSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IEdyaWRWaWV3c01hbmFnZXIgfSBmcm9tICcuL0dyaWRWaWV3c01hbmFnZXInO1xyXG5pbXBvcnQgeyBNdXRhYmxlIH0gZnJvbSAnLi4vLi4vLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi9EYXRhL1JlcXVlc3QnO1xyXG5pbXBvcnQgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24gZnJvbSAnLi4vLi4vLi4vRGF0YS9Mb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncyB7XHJcbiAgcmVhZG9ubHkgZGVmYXVsdEZpbHRlcklkOiBudW1iZXIgfCB1bmRlZmluZWQ7XHJcbiAgcmVhZG9ubHkgZGVmYXVsdFZpZXdJZDogbnVtYmVyO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzRHRvIHtcclxuICBEZWZhdWx0RmlsdGVySWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICBEZWZhdWx0Vmlld0lkOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlck9wdGlvbnMge1xyXG4gIHJlYWRvbmx5IHVzZXJJZDogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IGxvYWRlZFVzZXJTZXR0aW5ncz86IElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncztcclxufVxyXG5cclxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1lbXB0eS1pbnRlcmZhY2VcclxuaW50ZXJmYWNlIElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJEZWZhdWx0T3B0aW9ucyB7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIEFQU0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlck9wdGlvbnMgPVxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgTXV0YWJsZTxPbWl0PElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJPcHRpb25zLCBrZXlvZiBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyRGVmYXVsdE9wdGlvbnM+PiAmXHJcbiAgTXV0YWJsZTxQYXJ0aWFsPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJEZWZhdWx0T3B0aW9ucz4+O1xyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlciB7XHJcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJPcHRpb25zO1xyXG5cclxuICBwdWJsaWMgcmVhZG9ubHkgZGVmYXVsdFVzZXJTZXR0aW5nczogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzID0ge1xyXG4gICAgZGVmYXVsdEZpbHRlcklkOiB1bmRlZmluZWQsXHJcbiAgICBkZWZhdWx0Vmlld0lkOiBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWRcclxuICB9O1xyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdmFyaWFibGUtbmFtZVxyXG4gIHByb3RlY3RlZCBfbGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzOiBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3MgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBpc0xhdGVzdExvYWRlZFVzZXJTZXR0aW5nc0V4cGlyZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByaXZhdGUgYXV0b1Jlc2V0dGluZ0NhY2hlVGltZXJJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBBUFNDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJPcHRpb25zKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSB7XHJcbiAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMubG9hZGVkVXNlclNldHRpbmdzKSB7XHJcbiAgICAgIHRoaXMubGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzID0gdGhpcy5vcHRpb25zLmxvYWRlZFVzZXJTZXR0aW5ncztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnN0YXJ0QXV0b0NhY2hlUmVzZXR0aW5nVGltZXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgbGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xhdGVzdExvYWRlZFVzZXJTZXR0aW5ncztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgbGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzKHZhbHVlOiBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3MpIHtcclxuICAgIHRoaXMuX2xhdGVzdExvYWRlZFVzZXJTZXR0aW5ncyA9IHZhbHVlO1xyXG4gICAgdGhpcy5pc0xhdGVzdExvYWRlZFVzZXJTZXR0aW5nc0V4cGlyZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRVc2VyU2V0dGluZ3MoKTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+IHtcclxuICAgIGlmICghdGhpcy5pc0xhdGVzdExvYWRlZFVzZXJTZXR0aW5nc0V4cGlyZWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMubGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMubGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzID0gYXdhaXQgdGhpcy5sb2FkVXNlclNldHRpbmdzKCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzO1xyXG4gIH1cclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICBwdWJsaWMgYXN5bmMgdXBkYXRlVXNlclNldHRpbmdzKHVwZGF0ZXM6IFBhcnRpYWw8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPik6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmxhdGVzdExvYWRlZFVzZXJTZXR0aW5ncyA9IGF3YWl0IHRoaXMudXBkYXRlVXNlclNldHRpbmdzSW50ZXJuYWwodXBkYXRlcyk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGxvYWRVc2VyU2V0dGluZ3MoKTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+O1xyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHVwZGF0ZVVzZXJTZXR0aW5nc0ludGVybmFsKHVwZGF0ZXM6IFBhcnRpYWw8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPik6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPjtcclxuXHJcbiAgcHJvdGVjdGVkIHN0YXJ0QXV0b0NhY2hlUmVzZXR0aW5nVGltZXIoKSB7XHJcbiAgICB0aGlzLmF1dG9SZXNldHRpbmdDYWNoZVRpbWVySWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICB0aGlzLmlzTGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzRXhwaXJlZCA9IHRydWU7XHJcbiAgICB9LCA1MDAwKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzdG9wQXV0b0NhY2hlUmVzZXR0aW5nVGltZXIoKSB7XHJcbiAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmF1dG9SZXNldHRpbmdDYWNoZVRpbWVySWQpO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIExvY2FsQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyIGV4dGVuZHMgQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyIHtcclxuICBwcm90ZWN0ZWQgc3RhdGljIHJlYWRvbmx5IHVzZXJTZXR0aW5nc1N0b3JhZ2VLZXkgPSAnYXBzOmNvbnRyb2wtZGlzcGxheTp1c2VyLXNldHRpbmdzJztcclxuXHJcbiAgcHJvdGVjdGVkIGFzeW5jIGxvYWRVc2VyU2V0dGluZ3MoKTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+IHtcclxuICAgIGNvbnN0IHJhd1VzZXJTZXR0aW5ncyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKExvY2FsQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyLnVzZXJTZXR0aW5nc1N0b3JhZ2VLZXkpO1xyXG4gICAgaWYgKCFyYXdVc2VyU2V0dGluZ3MpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdFVzZXJTZXR0aW5ncztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB1c2VyU2V0dGluZ3M6IElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncyA9IEpTT04ucGFyc2UocmF3VXNlclNldHRpbmdzKTtcclxuXHJcbiAgICByZXR1cm4gdXNlclNldHRpbmdzO1xyXG4gIH1cclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlVXNlclNldHRpbmdzSW50ZXJuYWwodXBkYXRlczogUGFydGlhbDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+KTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+IHtcclxuICAgIGNvbnN0IGN1cnJlbnRVc2VyU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmdldFVzZXJTZXR0aW5ncygpO1xyXG4gICAgY29uc3QgdXBkYXRlZFVzZXJTZXR0aW5ncyA9IHsgLi4uY3VycmVudFVzZXJTZXR0aW5ncywgLi4udXBkYXRlcyB9O1xyXG5cclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKExvY2FsQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyLnVzZXJTZXR0aW5nc1N0b3JhZ2VLZXksXHJcbiAgICAgIEpTT04uc3RyaW5naWZ5KHVwZGF0ZWRVc2VyU2V0dGluZ3MpKTtcclxuXHJcbiAgICByZXR1cm4gdXBkYXRlZFVzZXJTZXR0aW5ncztcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zIHtcclxuICBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgSVJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlck9wdGlvbnMgPVxyXG4gIElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJPcHRpb25zICYgSVJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zO1xyXG5cclxuZXhwb3J0IGNsYXNzIFJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlciBleHRlbmRzIENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucykge1xyXG4gICAgc3VwZXIob3B0aW9ucyk7XHJcblxyXG4gICAgdGhpcy5sb2FkRGF0YVVybCA9IG9wdGlvbnMubG9hZERhdGFVcmw7XHJcbiAgICB0aGlzLnVwZGF0ZURhdGFVcmwgPSBvcHRpb25zLnVwZGF0ZURhdGFVcmw7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXN5bmMgbG9hZFVzZXJTZXR0aW5ncygpOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4ge1xyXG4gICAgY29uc3QgdXNlclNldHRpbmdzRHRvID0gYXdhaXQgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb248SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzRHRvPih0aGlzLmxvYWREYXRhVXJsKTtcclxuXHJcbiAgICByZXR1cm4gdXNlclNldHRpbmdzRHRvID8gdGhpcy5tYXBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc0R0b1RvTW9kZWwodXNlclNldHRpbmdzRHRvKSA6IHRoaXMuZGVmYXVsdFVzZXJTZXR0aW5ncztcclxuICB9XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgcHJvdGVjdGVkIGFzeW5jIHVwZGF0ZVVzZXJTZXR0aW5nc0ludGVybmFsKHVwZGF0ZXM6IFBhcnRpYWw8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPik6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPiB7XHJcbiAgICBjb25zdCBjdXJyZW50VXNlclNldHRpbmdzID0gYXdhaXQgdGhpcy5nZXRVc2VyU2V0dGluZ3MoKTtcclxuICAgIGNvbnN0IHVwZGF0ZWRVc2VyU2V0dGluZ3MgPSB7IC4uLmN1cnJlbnRVc2VyU2V0dGluZ3MsIC4uLnVwZGF0ZXMgfTtcclxuXHJcbiAgICBjb25zdCB1cGRhdGVkVXNlclNldHRpbmdzRHRvID0gYXdhaXQgc2VuZFJlcXVlc3Q8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzRHRvPihcclxuICAgICAgdGhpcy51cGRhdGVEYXRhVXJsLCAnUFVUJyxcclxuICAgICAgdGhpcy5tYXBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01vZGVsVG9EdG8odXBkYXRlZFVzZXJTZXR0aW5ncylcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubWFwQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG9Ub01vZGVsKHVwZGF0ZWRVc2VyU2V0dGluZ3NEdG8pO1xyXG4gIH1cclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICBwcml2YXRlIG1hcENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTW9kZWxUb0R0byhtb2RlbDogUGFydGlhbDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+KTogUGFydGlhbDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG8+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIERlZmF1bHRGaWx0ZXJJZDogbW9kZWwuZGVmYXVsdEZpbHRlcklkLFxyXG4gICAgICBEZWZhdWx0Vmlld0lkOiBtb2RlbC5kZWZhdWx0Vmlld0lkXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICBwcml2YXRlIG1hcENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzRHRvVG9Nb2RlbChkdG86IElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc0R0byk6IElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBkZWZhdWx0RmlsdGVySWQ6IGR0by5EZWZhdWx0RmlsdGVySWQsXHJcbiAgICAgIGRlZmF1bHRWaWV3SWQ6IGR0by5EZWZhdWx0Vmlld0lkXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGZ1bmN0aW9uIGdldFN1bW1hcnlDb2x1bW4oY29sdW1uczogQXJyYXk8eyB2aXNpYmxlSW5kZXg6IG51bWJlciwgdmlzaWJsZTogYm9vbGVhbiwgZGF0YUZpZWxkOiBzdHJpbmcgfT4gfFxyXG4gIFJlYWRvbmx5QXJyYXk8UGljazxEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW4sICd2aXNpYmxlSW5kZXgnIHwgJ3Zpc2libGUnIHwgJ2RhdGFGaWVsZCc+Pikge1xyXG4gIGxldCBjb2x1bW5Gb3JTdW1tYXJ5ID0gJyc7XHJcblxyXG4gIGNvbnN0IHZpc2libGVDb2x1bW5zID0gY29sdW1ucy5maWx0ZXIoKGMpID0+IGMudmlzaWJsZSk7XHJcbiAgY29uc3QgY29sdW1uc1dpdGhJbmRleCA9IHZpc2libGVDb2x1bW5zLmZpbHRlcigoYykgPT4gYy52aXNpYmxlSW5kZXggIT09IG51bGwgJiYgYy52aXNpYmxlSW5kZXggIT09IHZvaWQgMCk7XHJcblxyXG4gIGlmICghIWNvbHVtbnNXaXRoSW5kZXgubGVuZ3RoKSB7XHJcbiAgICBjb2x1bW5Gb3JTdW1tYXJ5ID0gY29sdW1uc1dpdGhJbmRleC5zb3J0KChhLCBiKSA9PiBhLnZpc2libGVJbmRleCAtIGIudmlzaWJsZUluZGV4KVswXS5kYXRhRmllbGQ7XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbHVtbkZvclN1bW1hcnkgPSAodmlzaWJsZUNvbHVtbnNbMF0gJiYgdmlzaWJsZUNvbHVtbnNbMF0uZGF0YUZpZWxkKSB8fCAnJztcclxuICB9XHJcblxyXG4gIHJldHVybiBjb2x1bW5Gb3JTdW1tYXJ5O1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50IH0gZnJvbSAnLi9HcmlkVmlld3NUb29sYmFyQ29tcG9uZW50JztcclxuaW1wb3J0IHsgR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50IH0gZnJvbSAnLi9HcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQnO1xyXG5pbXBvcnQgeyBHcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50LCBJRmlsZUltcG9ydGVyT3B0aW9ucyB9IGZyb20gJy4vR3JpZERpc3BsYXlzVG9vbGJhckNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEdyaWREaXNwbGF5c01hbmFnZXIsIElHcmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9ucyB9IGZyb20gJy4vR3JpZERpc3BsYXlzTWFuYWdlcic7XHJcbmltcG9ydCB7IEdyaWRWaWV3c01hbmFnZXIsIElHcmlkVmlld3NNYW5hZ2VyT3B0aW9ucyB9IGZyb20gJy4vR3JpZFZpZXdzTWFuYWdlcic7XHJcbmltcG9ydCB7IEdyaWRGaWx0ZXJzTWFuYWdlciwgSUdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnMgfSBmcm9tICcuL0dyaWRGaWx0ZXJzTWFuYWdlcic7XHJcbmltcG9ydCB7IE11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luIH0gZnJvbSAnLi9NdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbic7XHJcbmltcG9ydCB7IElSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9ucywgUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyIH0gZnJvbSAnLi9Db250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXInO1xyXG5pbXBvcnQgeyBEaXNwbGF5VHlwZSwgSURpc3BsYXlUeXBlU2V0dGluZ3MsIElJY29uc0NvbHVtbkVkaXRvckl0ZW0gfSBmcm9tICcuL0NvbnRyb2xDb25maWd1cmF0b3InO1xyXG5pbXBvcnQgeyBjcmVhdGVIZWFkZXJDZWxsVGVtcGxhdGUsIElHcmlkQWRkaXRpb25hbE9wdGlvbnMgfSBmcm9tICcuLi9HcmlkL0NyZWF0ZURlZmF1bHRHcmlkJztcclxuaW1wb3J0IGNyZWF0ZURlZmF1bHRHcmlkIGZyb20gJy4uLy4uLy4uL1dpZGdldHMvR3JpZC9EZWZhdWx0R3JpZCc7XHJcbmltcG9ydCB7IGNyZWF0ZUR4RGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uLy4uL0RhdGEvRHhEYXRhU291cmNlJztcclxuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi9EYXRhL1JlcXVlc3QnO1xyXG5pbXBvcnQgeyBnZXRTdW1tYXJ5Q29sdW1uIH0gZnJvbSAnLi9HcmlkU3VtbWFyeUhlbHBlcic7XHJcbmltcG9ydCB7IENkbUltcG9ydEZpbGVNb2RlIH0gZnJvbSAnLi4vLi4vQnVzaW5lc3MnO1xyXG5cclxuaW50ZXJmYWNlIElBUFNDb250cm9sRmllbGRDb25maWd1cmF0aW9uIHtcclxuICBQZXJtaXNzaW9uczogQ29udHJvbFJvbGVQZXJtaXNzaW9ucztcclxuICBOYW1lOiBzdHJpbmc7XHJcbiAgVHlwZTogJ3N0cmluZycgfCAnbnVtYmVyJyB8ICdib29sZWFuJyB8ICdvYmplY3QnIHwgJ2RhdGUnIHwgJ2RhdGV0aW1lJztcclxuICBMYWJlbDogc3RyaW5nO1xyXG4gIE9yZGVyOiBudW1iZXI7XHJcbiAgVG9vbFRpcDogc3RyaW5nO1xyXG4gIElzRGVmYXVsdFZpZXdGaWVsZDogYm9vbGVhbjtcclxuICBJc0tleUNvbHVtbjogYm9vbGVhbjtcclxuICBHcm91cEZpZWxkOiBzdHJpbmc7XHJcbiAgRGlzcGxheVR5cGU6IHN0cmluZztcclxuICBXaWR0aD86IG51bWJlcjtcclxuICBIaWRpbmdPcmRlcj86IG51bWJlcjtcclxuICBDb2x1bW5zPzogSUFQU0NvbnRyb2xGaWVsZENvbmZpZ3VyYXRpb25bXTtcclxufVxyXG5cclxuaW50ZXJmYWNlIElVc2VyQ29uZmlndXJhdGlvblJlc3BvbnNlIHtcclxuICBGaWVsZHNDb25maWd1cmF0aW9uOiBJQVBTQ29udHJvbEZpZWxkQ29uZmlndXJhdGlvbltdO1xyXG4gIENhbkNyZWF0ZUdsb2JhbFZpZXdzOiBib29sZWFuO1xyXG4gIENhbkNyZWF0ZUdsb2JhbEZpbHRlcnM6IGJvb2xlYW47XHJcbiAgQ2FuQ3JlYXRlRmlsdGVyczogYm9vbGVhbjtcclxuICBDYW5DcmVhdGVWaWV3czogYm9vbGVhbjtcclxuICBDYW5DcmVhdGVEaXNwbGF5czogYm9vbGVhbjtcclxuICBDYW5BcHBsYXlEaXNwbGF5czogYm9vbGVhbjtcclxufVxyXG5cclxuLyogZXNsaW50IG5vLWJpdHdpc2U6IG9mZiAqL1xyXG4vKiB0c2xpbnQ6ZGlzYWJsZTogbm8tYml0d2lzZSAqL1xyXG5jb25zdCBlbnVtIENvbnRyb2xSb2xlUGVybWlzc2lvbnMge1xyXG4gIE5vbmUgPSAwLFxyXG4gIFJlYWQgPSAxIDw8IDAsXHJcbiAgQ3JlYXRlID0gMSA8PCAxLFxyXG4gIFVwZGF0ZSA9IDEgPDwgMixcclxuICBEZWxldGUgPSAxIDw8IDMsXHJcbn1cclxuLyogdHNsaW50OmVuYWJsZTogbm8tYml0d2lzZSAqL1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXlPcHRpb25zIHtcclxuICAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgaXNTdGFuZGFsb25lUGFnZTogYm9vbGVhbjtcclxuICBwYWdlVGl0bGU6IHN0cmluZztcclxuICBleHBvcnRGaWxlTmFtZTogc3RyaW5nO1xyXG4gIHVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgdXNlckNvbmZpZ1VybDogc3RyaW5nO1xyXG4gIGNvbnRyb2xMb2dzVXJsOiBzdHJpbmc7XHJcbiAgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbiAgZ3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9uczogSUdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnM7XHJcbiAgZ3JpZFZpZXdzTWFuYWdlck9wdGlvbnM6IElHcmlkVmlld3NNYW5hZ2VyT3B0aW9ucztcclxuICBncmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9uczogSUdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zO1xyXG4gIHJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zOiBJUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnM7XHJcbiAgaW1wb3J0RmlsZU9wdGlvbnM/OiBJRmlsZUltcG9ydGVyT3B0aW9ucztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIENvbnRyb2xEaXNwbGF5IHtcclxuICBwdWJsaWMgcmVhZG9ubHkgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGlzU3RhbmRhbG9uZVBhZ2U6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwYWdlVGl0bGU6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGV4cG9ydEZpbGVOYW1lOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VyTmFtZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlckNvbmZpZ1VybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY29udHJvbExvZ3NVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zOiBJR3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucztcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWRWaWV3c01hbmFnZXJPcHRpb25zOiBJR3JpZFZpZXdzTWFuYWdlck9wdGlvbnM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9uczogSUdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnM6IElSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9ucztcclxuICBwcml2YXRlIHJlYWRvbmx5IGltcG9ydEZpbGVPcHRpb25zOiBJRmlsZUltcG9ydGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSBtYWluR3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIGdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQ6IEdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgZ3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50OiBHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgZ3JpZERpc3BsYXlzVG9vbGJhckNvbXBvbmVudDogR3JpZERpc3BsYXlzVG9vbGJhckNvbXBvbmVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSBtdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbjogTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElDb250cm9sRGlzcGxheU9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuaXNTdGFuZGFsb25lUGFnZSA9IG9wdGlvbnMuaXNTdGFuZGFsb25lUGFnZTtcclxuICAgIHRoaXMucGFnZVRpdGxlID0gb3B0aW9ucy5wYWdlVGl0bGU7XHJcbiAgICB0aGlzLmV4cG9ydEZpbGVOYW1lID0gb3B0aW9ucy5leHBvcnRGaWxlTmFtZTtcclxuICAgIHRoaXMudXNlck5hbWUgPSBvcHRpb25zLnVzZXJOYW1lO1xyXG4gICAgdGhpcy51c2VyQ29uZmlnVXJsID0gb3B0aW9ucy51c2VyQ29uZmlnVXJsO1xyXG4gICAgdGhpcy5jb250cm9sTG9nc1VybCA9IG9wdGlvbnMuY29udHJvbExvZ3NVcmw7XHJcbiAgICB0aGlzLmxvYWREYXRhVXJsID0gb3B0aW9ucy5sb2FkRGF0YVVybDtcclxuICAgIHRoaXMudXBkYXRlRGF0YVVybCA9IG9wdGlvbnMudXBkYXRlRGF0YVVybDtcclxuICAgIHRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucyA9IG9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucztcclxuICAgIHRoaXMuZ3JpZFZpZXdzTWFuYWdlck9wdGlvbnMgPSBvcHRpb25zLmdyaWRWaWV3c01hbmFnZXJPcHRpb25zO1xyXG4gICAgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9ucyA9IG9wdGlvbnMuZ3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnM7XHJcbiAgICB0aGlzLnJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zID0gb3B0aW9ucy5yZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9ucztcclxuICAgIHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMgPSBvcHRpb25zLmltcG9ydEZpbGVPcHRpb25zO1xyXG5cclxuICAgIHRoaXMuJGNvbnRhaW5lci5hZGRDbGFzcyhbJ2Fwcy1ncmlkJywgJ2NvbnRyb2wtZGlzcGxheS1ncmlkJ10pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIHNlbmRSZXF1ZXN0PElVc2VyQ29uZmlndXJhdGlvblJlc3BvbnNlPih0aGlzLnVzZXJDb25maWdVcmwpXHJcbiAgICAgIC50aGVuKChyZXMpID0+IHtcclxuICAgICAgICBjb25zdCBncmlkRmlsdGVyc01hbmFnZXIgPSBuZXcgR3JpZEZpbHRlcnNNYW5hZ2VyKHRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucyk7XHJcbiAgICAgICAgY29uc3QgZ3JpZFZpZXdzTWFuYWdlciA9IG5ldyBHcmlkVmlld3NNYW5hZ2VyKHRoaXMuZ3JpZFZpZXdzTWFuYWdlck9wdGlvbnMpO1xyXG4gICAgICAgIGNvbnN0IGdyaWREaXNwbGF5c01hbmFnZXIgPSBuZXcgR3JpZERpc3BsYXlzTWFuYWdlcih0aGlzLmdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zKTtcclxuXHJcbiAgICAgICAgdGhpcy5tYWluR3JpZCA9IHRoaXMuY3JlYXRlTWFpbkdyaWQocmVzLkZpZWxkc0NvbmZpZ3VyYXRpb24pO1xyXG5cclxuICAgICAgICBjb25zdCBjYW5DcmVhdGVEaXNwbGF5cyA9IHJlcy5DYW5DcmVhdGVEaXNwbGF5cyAmJiByZXMuQ2FuQ3JlYXRlVmlld3MgJiYgcmVzLkNhbkNyZWF0ZUZpbHRlcnM7XHJcblxyXG4gICAgICAgIGlmIChjYW5DcmVhdGVEaXNwbGF5cyB8fCByZXMuQ2FuQXBwbGF5RGlzcGxheXMpIHtcclxuICAgICAgICAgIHRoaXMuZ3JpZERpc3BsYXlzVG9vbGJhckNvbXBvbmVudCA9IG5ldyBHcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50KHtcclxuICAgICAgICAgICAgb3duZXI6IHRoaXMubWFpbkdyaWQsXHJcbiAgICAgICAgICAgIGVkaXRNb2RlOiBjYW5DcmVhdGVEaXNwbGF5cyxcclxuICAgICAgICAgICAgZ3JpZEZpbHRlcnNNYW5hZ2VyLFxyXG4gICAgICAgICAgICBncmlkVmlld3NNYW5hZ2VyLFxyXG4gICAgICAgICAgICBncmlkRGlzcGxheXNNYW5hZ2VyLFxyXG4gICAgICAgICAgICBpbXBvcnRGaWxlT3B0aW9uczogdGhpcy5pbXBvcnRGaWxlT3B0aW9uc1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQgPSBuZXcgR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudCh7XHJcbiAgICAgICAgICBvd25lcjogdGhpcy5tYWluR3JpZCxcclxuICAgICAgICAgIG9uVmlld0FwcGxpZWQ6IHRoaXMub25WaWV3QXBwbGllZCxcclxuICAgICAgICAgIG9uVmlld0RlbGV0ZWQ6IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgYXdhaXQgZ3JpZERpc3BsYXlzTWFuYWdlci5sb2FkRGlzcGxheXMoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBhdXRvSW50ZWdyYXRpb246IHRydWUsXHJcbiAgICAgICAgICBncmlkVmlld3NNYW5hZ2VyLFxyXG4gICAgICAgICAgY2FuQ3JlYXRlR2xvYmFsVmlld3M6IHJlcy5DYW5DcmVhdGVHbG9iYWxWaWV3cyxcclxuICAgICAgICAgIHZpc2libGU6IHJlcy5DYW5DcmVhdGVWaWV3c1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudCA9IG5ldyBHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQoe1xyXG4gICAgICAgICAgYXBzQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyOiBuZXcgUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyKHtcclxuICAgICAgICAgICAgdXNlcklkOiB0aGlzLnVzZXJOYW1lLFxyXG4gICAgICAgICAgICBsb2FkRGF0YVVybDogdGhpcy5yZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9ucy5sb2FkRGF0YVVybCxcclxuICAgICAgICAgICAgdXBkYXRlRGF0YVVybDogdGhpcy5yZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9ucy51cGRhdGVEYXRhVXJsXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIG93bmVyOiB0aGlzLm1haW5HcmlkLFxyXG4gICAgICAgICAgb25GaWx0ZXJEZWxldGVkOiBhc3luYyAoZmlsdGVySWQpID0+IHtcclxuICAgICAgICAgICAgYXdhaXQgZ3JpZERpc3BsYXlzTWFuYWdlci5sb2FkRGlzcGxheXMoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBhdXRvSW50ZWdyYXRpb246IHRydWUsXHJcbiAgICAgICAgICBncmlkRmlsdGVyc01hbmFnZXIsXHJcbiAgICAgICAgICBjYW5DcmVhdGVHbG9iYWxGaWx0ZXJzOiByZXMuQ2FuQ3JlYXRlR2xvYmFsRmlsdGVycyxcclxuICAgICAgICAgIHZpc2libGU6IHJlcy5DYW5DcmVhdGVGaWx0ZXJzXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMubXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW4gPSBuZXcgTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW4oe1xyXG4gICAgICAgICAgb3duZXI6IHRoaXMubWFpbkdyaWRcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZ3JpZERpc3BsYXlzTWFuYWdlci5vbkRpc3BsYXlDaGFuZ2VkID0gYXN5bmMgKGRpc3BsYXkpID0+IHtcclxuICAgICAgICAgIGlmIChkaXNwbGF5KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50LmFwcGx5RmlsdGVyKGRpc3BsYXkuRmlsdGVySWQsIHRydWUpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQuYXBwbHlWaWV3KGRpc3BsYXkuVmlld0lkKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50LmFwcGx5RmlsdGVyKHZvaWQgMCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudC5hcHBseVZpZXcoR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qIHRzbGludDpkaXNhYmxlOiBuby1iaXR3aXNlICovXHJcbiAgcHJpdmF0ZSBoYXNQZXJtaXNzb24ocnVsZXMsIHBlcm1pc3Nvbikge1xyXG4gICAgcmV0dXJuIHJ1bGVzICYgcGVybWlzc29uO1xyXG4gIH1cclxuICAvKiB0c2xpbnQ6ZW5hYmxlOiBuby1iaXR3aXNlICovXHJcblxyXG4gIHByaXZhdGUgYnVpbGRUcmVlKGNvbHVtbnMpIHtcclxuICAgIGNvbnN0IGdyb3VwUHJlZml4ID0gJ19fR1JPVVBfXyc7XHJcblxyXG4gICAgbGV0IGNvbHVtbnNNYXAgPSBjb2x1bW5zLnJlZHVjZSgoYWNjLCBjb2x1bW4pID0+IHtcclxuICAgICAgY29sdW1uLkNvbHVtbnMgPSBbXTtcclxuICAgICAgY29sdW1uLkdyb3VwRmllbGQgPSBjb2x1bW4uR3JvdXBGaWVsZFxyXG4gICAgICAgID8gYCR7Z3JvdXBQcmVmaXh9JHtjb2x1bW4uR3JvdXBGaWVsZH1gXHJcbiAgICAgICAgOiBudWxsO1xyXG4gICAgICBhY2NbY29sdW1uLk5hbWVdID0gY29sdW1uO1xyXG5cclxuICAgICAgcmV0dXJuIGFjYztcclxuICAgIH0sIHt9KTtcclxuXHJcbiAgICBjb2x1bW5zTWFwID0gY29sdW1uc1xyXG4gICAgICAuZmlsdGVyKChjb2x1bW4pID0+IGNvbHVtbi5Hcm91cEZpZWxkKVxyXG4gICAgICAubWFwKChjb2x1bW4pID0+IGNvbHVtbi5Hcm91cEZpZWxkKVxyXG4gICAgICAuZmlsdGVyKCh2YWx1ZSwgaW5kZXgsIHNlbGYpID0+IHNlbGYuaW5kZXhPZih2YWx1ZSkgPT09IGluZGV4KVxyXG4gICAgICAucmVkdWNlKChhY2MsIGdyb3VwRmllbGQpID0+IHtcclxuICAgICAgICBjb25zdCBjb2x1bW5OYW1lID0gZ3JvdXBGaWVsZC5yZXBsYWNlKGdyb3VwUHJlZml4LCAnJyk7XHJcblxyXG4gICAgICAgIGNvbnN0IGdyb3VwQ29sdW1uID0ge1xyXG4gICAgICAgICAgTmFtZTogZ3JvdXBGaWVsZCxcclxuICAgICAgICAgIExhYmVsOiBjb2x1bW5OYW1lLFxyXG4gICAgICAgICAgQ29sdW1uczogW10sXHJcbiAgICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZTogbWF4LWxpbmUtbGVuZ3RoICovXHJcbiAgICAgICAgICBHcm91cEZpZWxkOiBjb2x1bW5zTWFwW2NvbHVtbk5hbWVdICYmIGNvbHVtbnNNYXBbY29sdW1uTmFtZV0uR3JvdXBGaWVsZCAmJiBjb2x1bW5zTWFwW2NvbHVtbk5hbWVdLkdyb3VwRmllbGQgIT09IGdyb3VwRmllbGRcclxuICAgICAgICAgICAgPyBjb2x1bW5zTWFwW2NvbHVtbk5hbWVdLkdyb3VwRmllbGRcclxuICAgICAgICAgICAgOiBudWxsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgYWNjW2dyb3VwRmllbGRdID0gZ3JvdXBDb2x1bW47XHJcblxyXG4gICAgICAgIHJldHVybiBhY2M7XHJcbiAgICAgIH0sIGNvbHVtbnNNYXApO1xyXG5cclxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3QgY29sdW1uTmFtZSBpbiBjb2x1bW5zTWFwKSB7XHJcbiAgICAgIGlmIChjb2x1bW5zTWFwLmhhc093blByb3BlcnR5KGNvbHVtbk5hbWUpKSB7XHJcbiAgICAgICAgY29uc3QgY29sdW1uID0gY29sdW1uc01hcFtjb2x1bW5OYW1lXTtcclxuXHJcbiAgICAgICAgaWYgKGNvbHVtbi5Hcm91cEZpZWxkKSB7XHJcbiAgICAgICAgICBjb2x1bW5zTWFwW2NvbHVtbi5Hcm91cEZpZWxkXS5Db2x1bW5zLnB1c2goY29sdW1uKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzdWx0LnB1c2goY29sdW1uKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJEaXNwbGF5VHlwZShzZXR0aW5nczogSURpc3BsYXlUeXBlU2V0dGluZ3MsIGNvbHVtbjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uLCBwZXJtaXNzaW9uczogQ29udHJvbFJvbGVQZXJtaXNzaW9ucykge1xyXG4gICAgaWYgKHNldHRpbmdzLnR5cGUgPT09IERpc3BsYXlUeXBlLkljb25zKSB7XHJcbiAgICAgIGNvbHVtbi5jZWxsVGVtcGxhdGUgPSAoY29udGFpbmVyLCBvcHRpb25zKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc3RyaW5nVmFsdWUgPSBTdHJpbmcob3B0aW9ucy52YWx1ZSk7XHJcbiAgICAgICAgY29uc3QgY2VsbFNldHRpbmdzID0gc2V0dGluZ3MuZGF0YS5maW5kKChpdGVtKSA9PiBTdHJpbmcoaXRlbS52YWx1ZSkgPT09IHN0cmluZ1ZhbHVlKTtcclxuXHJcbiAgICAgICAgaWYgKGNlbGxTZXR0aW5ncykge1xyXG4gICAgICAgICAgJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAuY3NzKHsgJ3RleHQtYWxpZ24nOiAnY2VudGVyJyB9KVxyXG4gICAgICAgICAgICAuYXR0cigndGl0bGUnLCBjZWxsU2V0dGluZ3MudGl0bGUpXHJcbiAgICAgICAgICAgIC5hcHBlbmQoJCgnPGltZz4nLCB7IHNyYzogY2VsbFNldHRpbmdzLmltYWdlIH0pKVxyXG4gICAgICAgICAgICAuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAgIC5jc3MoeyAndGV4dC1hbGlnbic6ICdjZW50ZXInIH0pXHJcbiAgICAgICAgICAgIC50ZXh0KG9wdGlvbnMudmFsdWUpXHJcbiAgICAgICAgICAgIC5hcHBlbmRUbyhjb250YWluZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbHVtbi5lZGl0Q2VsbFRlbXBsYXRlID0gKGNvbnRhaW5lciwgY2VsbEluZm8pID0+IHtcclxuICAgICAgICAkKCc8ZGl2IC8+JykuZHhTZWxlY3RCb3goe1xyXG4gICAgICAgICAgZGF0YVNvdXJjZTogc2V0dGluZ3MuZGF0YSxcclxuICAgICAgICAgIGRpc3BsYXlWYWx1ZTogJ3RpdGxlJyxcclxuICAgICAgICAgIGl0ZW1UZW1wbGF0ZTogKGRhdGE6IElJY29uc0NvbHVtbkVkaXRvckl0ZW0pID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAgIC5jc3MoeyAndGV4dC1hbGlnbic6ICdjZW50ZXInIH0pXHJcbiAgICAgICAgICAgICAgLmF0dHIoJ3RpdGxlJywgZGF0YS50aXRsZSlcclxuICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxpbWc+JywgeyBzcmM6IGRhdGEuaW1hZ2UgfSkpXHJcbiAgICAgICAgICAgICAgLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgICAgICB9LFxyXG5cclxuICAgICAgICAgIGZpZWxkVGVtcGxhdGU6IChkYXRhLCBlbCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50SXRlbSA9IHNldHRpbmdzLmRhdGEuZmluZCgoaXRlbSkgPT4gcGFyc2VJbnQoaXRlbS52YWx1ZSkgPT09IGNlbGxJbmZvLnZhbHVlKTtcclxuICAgICAgICAgICAgY29uc3QgJGl0ZW1OYW1lID0gJCgnPGRpdiAvPicpLmFkZENsYXNzKCdpdGVtLW5hbWUnKTtcclxuICAgICAgICAgICAgY29uc3QgJHJlc3VsdCA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAgIC5hZGRDbGFzcygnYXBzLWljb24tZWRpdG9yX19jdXN0b20taXRlbScpXHJcbiAgICAgICAgICAgICAgLmFwcGVuZCgkKCc8aW1nPicsIHsgc3JjOiBjdXJyZW50SXRlbSA/IGN1cnJlbnRJdGVtLmltYWdlIDogJycgfSkuYXR0cigndGl0bGUnLCBjdXJyZW50SXRlbSA/IGN1cnJlbnRJdGVtLnRpdGxlIDogJycpKVxyXG4gICAgICAgICAgICAgIC5hcHBlbmQoJGl0ZW1OYW1lKTtcclxuXHJcbiAgICAgICAgICAgICRpdGVtTmFtZVxyXG4gICAgICAgICAgICAgIC5keFRleHRCb3goe1xyXG4gICAgICAgICAgICAgICAgdmFsdWU6ICcnLFxyXG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWVcclxuICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGVsLmFwcGVuZCgkcmVzdWx0KTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKHsgdmFsdWUsIGNvbXBvbmVudCB9KSA9PiB7XHJcbiAgICAgICAgICAgIGNlbGxJbmZvLnNldFZhbHVlKHBhcnNlSW50KHZhbHVlLnZhbHVlKSk7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudC5ibHVyKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgdmFsdWU6IChjZWxsSW5mby52YWx1ZSAhPT0gbnVsbCAmJiBjZWxsSW5mbyAhPT0gdm9pZCAwKSAmJiBjZWxsSW5mby52YWx1ZS50b1N0cmluZygpLFxyXG4gICAgICAgICAgc2VsZWN0ZWRJdGVtOiBzZXR0aW5ncy5kYXRhLmZpbmQoKGl0ZW0pID0+IHBhcnNlSW50KGl0ZW0udmFsdWUpID09PSBjZWxsSW5mby52YWx1ZSlcclxuICAgICAgICB9KS5hcHBlbmRUbyhjb250YWluZXIpO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29sdW1uLmFsbG93U2VhcmNoID0gZmFsc2U7XHJcbiAgICAgIGNvbHVtbi5hbGxvd0ZpbHRlcmluZyA9IGZhbHNlO1xyXG4gICAgICBjb2x1bW4uYWxsb3dIZWFkZXJGaWx0ZXJpbmcgPSB0cnVlO1xyXG4gICAgICBjb2x1bW4uYWxsb3dHcm91cGluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZXR0aW5ncy50eXBlID09PSBEaXNwbGF5VHlwZS5QcmVkZWZpbmVkVmFsdWVzKSB7XHJcbiAgICAgIGNvbHVtbi5lZGl0Q2VsbFRlbXBsYXRlID0gKGNvbnRhaW5lciwgY2VsbEluZm8pID0+IHtcclxuICAgICAgICAkKCc8ZGl2IC8+JykuZHhTZWxlY3RCb3goe1xyXG4gICAgICAgICAgZGF0YVNvdXJjZTogc2V0dGluZ3MuZGF0YS5tYXAoKGkpID0+IGkudmFsdWUpLnNvcnQoKSxcclxuICAgICAgICAgIGFjY2VwdEN1c3RvbVZhbHVlOiB0cnVlLFxyXG4gICAgICAgICAgc2hvd0NsZWFyQnV0dG9uOiB0cnVlLFxyXG4gICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6ICh7IHZhbHVlLCBjb21wb25lbnQgfSkgPT4ge1xyXG4gICAgICAgICAgICBjZWxsSW5mby5zZXRWYWx1ZSh2YWx1ZSB8fCAnJyk7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudC5ibHVyKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgdmFsdWU6IGNlbGxJbmZvLnZhbHVlLFxyXG4gICAgICAgIH0pLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNldHRpbmdzLnR5cGUgPT09IERpc3BsYXlUeXBlLlJhYmJpdEFjdGlvbikge1xyXG4gICAgICBjb2x1bW4uZWRpdENlbGxUZW1wbGF0ZSA9IChjb250YWluZXIsIGNlbGxJbmZvKSA9PiB7XHJcbiAgICAgICAgJCgnPGRpdiAvPicpLmR4Q2hlY2tCb3goe1xyXG4gICAgICAgICAgdmFsdWU6IGNlbGxJbmZvLnZhbHVlIHx8IGZhbHNlLFxyXG4gICAgICAgICAgcmVhZE9ubHk6ICF0aGlzLmhhc1Blcm1pc3NvbihwZXJtaXNzaW9ucywgQ29udHJvbFJvbGVQZXJtaXNzaW9ucy5VcGRhdGUpLFxyXG4gICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICAgIGNlbGxJbmZvLmNvbXBvbmVudC5jZWxsVmFsdWUoY2VsbEluZm8ucm93SW5kZXgsIGNlbGxJbmZvLmNvbHVtbi5kYXRhRmllbGQsIGUudmFsdWUpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KS5hcHBlbmRUbyhjb250YWluZXIpO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25maWd1cmVDb2x1bW4oY29sdW1uQ29uZmlnOiBJQVBTQ29udHJvbEZpZWxkQ29uZmlndXJhdGlvbik6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbiB7XHJcbiAgICBjb25zdCB0aXRsZSA9IGNvbHVtbkNvbmZpZy5MYWJlbCB8fCBjb2x1bW5Db25maWcuTmFtZTtcclxuICAgIGNvbnN0IHRvb2x0aXAgPSBjb2x1bW5Db25maWcuVG9vbFRpcCB8fCB0aXRsZTtcclxuXHJcbiAgICBjb25zdCBjb2x1bW46IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbiA9ICFjb2x1bW5Db25maWcuQ29sdW1ucy5sZW5ndGhcclxuICAgICAgPyB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiBjb2x1bW5Db25maWcuTmFtZSxcclxuICAgICAgICBkYXRhVHlwZTogY29sdW1uQ29uZmlnLlR5cGUsXHJcbiAgICAgICAgY2FwdGlvbjogdGl0bGUsXHJcbiAgICAgICAgaGVhZGVyQ2VsbFRlbXBsYXRlOiBjcmVhdGVIZWFkZXJDZWxsVGVtcGxhdGUodGl0bGUsIHRvb2x0aXApLFxyXG4gICAgICAgIHZpc2libGU6IGNvbHVtbkNvbmZpZy5Jc0RlZmF1bHRWaWV3RmllbGQsXHJcbiAgICAgICAgdmlzaWJsZUluZGV4OiBjb2x1bW5Db25maWcuT3JkZXIsXHJcbiAgICAgICAgYWxsb3dGaXhpbmc6IGZhbHNlLFxyXG4gICAgICAgIGFsbG93RWRpdGluZzogISF0aGlzLmhhc1Blcm1pc3Nvbihjb2x1bW5Db25maWcuUGVybWlzc2lvbnMsIENvbnRyb2xSb2xlUGVybWlzc2lvbnMuVXBkYXRlKSxcclxuICAgICAgICB3aWR0aDogY29sdW1uQ29uZmlnLldpZHRoLFxyXG4gICAgICAgIGhpZGluZ1ByaW9yaXR5OiBjb2x1bW5Db25maWcuSGlkaW5nT3JkZXJcclxuICAgICAgfSA6IHtcclxuICAgICAgICBjYXB0aW9uOiB0aXRsZSxcclxuICAgICAgICBjb2x1bW5zOiBjb2x1bW5Db25maWcuQ29sdW1ucy5tYXAoKGMpID0+IHRoaXMuY29uZmlndXJlQ29sdW1uKGMpKVxyXG4gICAgICB9O1xyXG5cclxuICAgIGlmIChjb2x1bW5Db25maWcuRGlzcGxheVR5cGUpIHtcclxuICAgICAgY29uc3QgZGlzcGxheVNldHRpbmdzOiBJRGlzcGxheVR5cGVTZXR0aW5ncyA9IEpTT04ucGFyc2UoY29sdW1uQ29uZmlnLkRpc3BsYXlUeXBlKTtcclxuXHJcbiAgICAgIGlmIChkaXNwbGF5U2V0dGluZ3MudHlwZSA9PT0gRGlzcGxheVR5cGUuSWNvbnMpIHtcclxuICAgICAgICBjb25zdCBpdGVtcyA9IGRpc3BsYXlTZXR0aW5ncy5kYXRhLm1hcCgoaXRlbSkgPT4gKHtcclxuICAgICAgICAgIHRleHQ6IGl0ZW0udGl0bGUsXHJcbiAgICAgICAgICB2YWx1ZTogaXRlbS52YWx1ZVxyXG4gICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgaXRlbXMuc3BsaWNlKDAsIDAsIHtcclxuICAgICAgICAgIHRleHQ6ICdCbGFuaycsXHJcbiAgICAgICAgICB2YWx1ZTogbnVsbFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAoY29sdW1uIGFzIGFueSkuaGVhZGVyRmlsdGVyID0ge1xyXG4gICAgICAgICAgZGF0YVNvdXJjZTogaXRlbXNcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnJlbmRlckRpc3BsYXlUeXBlKGRpc3BsYXlTZXR0aW5ncywgY29sdW1uLCBjb2x1bW5Db25maWcuUGVybWlzc2lvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjb2x1bW47XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbmZpZ3VyZUNvbHVtbnMoY29uZmlndXJhdGlvbjogSUFQU0NvbnRyb2xGaWVsZENvbmZpZ3VyYXRpb25bXSkge1xyXG4gICAgY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb24uZmlsdGVyKFxyXG4gICAgICAoYykgPT4gdGhpcy5oYXNQZXJtaXNzb24oYy5QZXJtaXNzaW9ucywgQ29udHJvbFJvbGVQZXJtaXNzaW9ucy5SZWFkKVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25maWd1cmF0aW9uID0gdGhpcy5idWlsZFRyZWUoY29uZmlndXJhdGlvbik7XHJcbiAgICBjb25zdCBjb2x1bW5zID0gY29uZmlndXJhdGlvbi5tYXAoKGMpID0+IHRoaXMuY29uZmlndXJlQ29sdW1uKGMpKTtcclxuXHJcbiAgICByZXR1cm4gY29sdW1ucztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTWFpbkdyaWQoY29uZmlndXJhdGlvbjogSUFQU0NvbnRyb2xGaWVsZENvbmZpZ3VyYXRpb25bXSkge1xyXG4gICAgY29uc3QgaGFzS2V5cyA9IGNvbmZpZ3VyYXRpb24uc29tZSgoYykgPT4gYy5Jc0tleUNvbHVtbik7XHJcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb25maWd1cmVDb2x1bW5zKGNvbmZpZ3VyYXRpb24pO1xyXG5cclxuICAgIGNvbnN0IGNvbHVtbkZvclN1bW1hcnkgPSBnZXRTdW1tYXJ5Q29sdW1uKGNvbHVtbnMpO1xyXG4gICAgY29uc3QgZ3JpZE9wdGlvbnMgPSB7XHJcbiAgICAgIGRhdGFTb3VyY2U6IHRoaXMuY3JlYXRlTWFpbkdyaWREYXRhU291cmNlKGNvbmZpZ3VyYXRpb24pLFxyXG4gICAgICBjb2x1bW5SZXNpemluZ01vZGU6ICd3aWRnZXQnLFxyXG4gICAgICB3aWR0aDogJzEwMCUnLFxyXG4gICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgYWxsb3dVcGRhdGluZzogaGFzS2V5cyxcclxuICAgICAgICBhbGxvd0FkZGluZzogZmFsc2UsXHJcbiAgICAgICAgYWxsb3dEZWxldGluZzogZmFsc2UsXHJcbiAgICAgICAgbW9kZTogJ2JhdGNoJ1xyXG4gICAgICB9LFxyXG4gICAgICBzY3JvbGxpbmc6IHsgbW9kZTogJ3ZpcnR1YWwnLCBwcmVsb2FkRW5hYmxlZDogdHJ1ZSB9LFxyXG4gICAgICByZW1vdGVPcGVyYXRpb25zOiB0cnVlLFxyXG4gICAgICBwYWdlcjogeyB2aXNpYmxlOiBmYWxzZSB9LFxyXG4gICAgICBoZWlnaHQ6IHRoaXMuaXNTdGFuZGFsb25lUGFnZSA/IHVuZGVmaW5lZCA6ICcxMDAlJyxcclxuICAgICAgY29sdW1uQ2hvb3Nlcjoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgbW9kZTogJ2RyYWdBbmREcm9wJ1xyXG4gICAgICB9LFxyXG4gICAgICBjb2x1bW5GaXhpbmc6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIGZpbHRlclBhbmVsOiB7XHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICB0ZXh0czoge1xyXG4gICAgICAgICAgY3JlYXRlRmlsdGVyOiAnTm9uZScsXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBzdW1tYXJ5OiB7XHJcbiAgICAgICAgdG90YWxJdGVtczogW3sgc3VtbWFyeVR5cGU6ICdjb3VudCcsIGNvbHVtbjogY29sdW1uRm9yU3VtbWFyeSB9XVxyXG4gICAgICB9LFxyXG4gICAgICBhbGxvd0NvbHVtblJlc2l6aW5nOiB0cnVlLFxyXG4gICAgICBjb2x1bW5IaWRpbmdFbmFibGVkOiBmYWxzZSxcclxuICAgICAgaG92ZXJTdGF0ZUVuYWJsZWQ6IHRydWUsXHJcbiAgICAgIGNvbHVtbnMsXHJcbiAgICAgIGFsbG93Q29sdW1uUmVvcmRlcmluZzogdHJ1ZSxcclxuICAgICAgZ3JvdXBpbmc6IHtcclxuICAgICAgICBjb250ZXh0TWVudUVuYWJsZWQ6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgZ3JvdXBQYW5lbDoge1xyXG4gICAgICAgIHZpc2libGU6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgbWFzdGVyRGV0YWlsOiAhaGFzS2V5cyA/IHVuZGVmaW5lZCA6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIHRlbXBsYXRlOiAoY29udGFpbmVyLCBvcHRpb25zKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBrZXlzID0ge307XHJcbiAgICAgICAgICBjb25maWd1cmF0aW9uLmZpbHRlcigoYykgPT4gYy5Jc0tleUNvbHVtbikuZm9yRWFjaCgoYykgPT4ga2V5c1tjLk5hbWVdID0gb3B0aW9ucy5kYXRhW2MuTmFtZV0pO1xyXG5cclxuICAgICAgICAgICQoJzxkaXY+JylcclxuICAgICAgICAgICAgLmR4RGF0YUdyaWQoe1xyXG4gICAgICAgICAgICAgIGRhdGFTb3VyY2U6IHtcclxuICAgICAgICAgICAgICAgIHN0b3JlOiBjcmVhdGVEeERhdGFTb3VyY2Uoe1xyXG4gICAgICAgICAgICAgICAgICBsb2FkVXJsOiBgJHt0aGlzLmNvbnRyb2xMb2dzVXJsfT9rZXk9JHtKU09OLnN0cmluZ2lmeShrZXlzKX1gLFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIHNob3dCb3JkZXJzOiB0cnVlLFxyXG4gICAgICAgICAgICAgIGNvbHVtbnM6IFt7XHJcbiAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdVc2VyJyxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiAyMDBcclxuICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdDcmVhdGVkQXQnLFxyXG4gICAgICAgICAgICAgICAgY2FwdGlvbjogJ0RhdGUnLFxyXG4gICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdkYXRlJyxcclxuICAgICAgICAgICAgICAgIGZvcm1hdDogJ3Nob3J0RGF0ZVNob3J0VGltZScsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogMjAwXHJcbiAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnQ2hhbmdlcycsXHJcbiAgICAgICAgICAgICAgICBjZWxsVGVtcGxhdGU6IChjLCBvKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBvLmRhdGEuQ2hhbmdlc1xyXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAoaXRlbSkgPT4gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgPGRpdiBjbGFzcz0nYXBzLWNvbnRyb2wtbG9nJz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSdhcHMtY29udHJvbC1sb2dfX2ZpZWxkJz4ke2l0ZW0uRmllbGR9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9J2Fwcy1jb250cm9sLWxvZ19fb2xkLXZhbHVlJz4ke2l0ZW0uT2xkVmFsdWV9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXHUyMTkyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0nYXBzLWNvbnRyb2wtbG9nX19uZXctdmFsdWUnPiR7aXRlbS5OZXdWYWx1ZX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+YFxyXG4gICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAuam9pbignJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAkKGA8ZGl2IGNsYXNzPSdhcHMtY29udHJvbC1sb2dzJz4ke2NvbnRlbnR9PC9kaXY+YCkuYXBwZW5kVG8oYyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfV0sXHJcbiAgICAgICAgICAgIH0pLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvbkNvbnRlbnRSZWFkeTogKGUpID0+IHtcclxuICAgICAgICBpZiAoIWUuY29tcG9uZW50KSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnByZXBhcmVGaWx0ZXJQYW5lbChlLmNvbXBvbmVudCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRWRpdG9yUHJlcGFyaW5nOiAoZSkgPT4ge1xyXG4gICAgICAgIGlmIChlLnBhcmVudFR5cGUgIT09ICdkYXRhUm93Jykge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZmllbGRDb25maWcgPSBjb25maWd1cmF0aW9uLmZpbmQoKGMpID0+IGMuTmFtZSA9PT0gZS5kYXRhRmllbGQpO1xyXG5cclxuICAgICAgICBpZiAoIWZpZWxkQ29uZmlnKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkaXNhYmxlRWRpdGluZyA9ICF0aGlzLmhhc1Blcm1pc3NvbihmaWVsZENvbmZpZy5QZXJtaXNzaW9ucywgQ29udHJvbFJvbGVQZXJtaXNzaW9ucy5VcGRhdGUpO1xyXG5cclxuICAgICAgICBlLmVkaXRvck9wdGlvbnMucmVhZE9ubHkgPSBkaXNhYmxlRWRpdGluZztcclxuXHJcbiAgICAgICAgaWYgKCFkaXNhYmxlRWRpdGluZyAmJiBmaWVsZENvbmZpZy5UeXBlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgY29uc3QgYmFzZVNldFZhbHVlID0gZS5zZXRWYWx1ZTtcclxuXHJcbiAgICAgICAgICAoZSBhcyBhbnkpLnNldFZhbHVlID0gKG5ld1ZhbHVlOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgYmFzZVNldFZhbHVlKG5ld1ZhbHVlLnRyaW0oKSk7XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgb25DZWxsUHJlcGFyZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgaWYgKGUucm93VHlwZSA9PT0gJ2RhdGEnKSB7XHJcbiAgICAgICAgICBjb25zdCBmaWVsZENvbmZpZyA9IGNvbmZpZ3VyYXRpb24uZmluZCgoYykgPT4gYy5OYW1lID09PSBlLmNvbHVtbi5kYXRhRmllbGQpO1xyXG5cclxuICAgICAgICAgIGlmIChmaWVsZENvbmZpZyAmJiAhdGhpcy5oYXNQZXJtaXNzb24oZmllbGRDb25maWcuUGVybWlzc2lvbnMsIENvbnRyb2xSb2xlUGVybWlzc2lvbnMuVXBkYXRlKSkge1xyXG4gICAgICAgICAgICAkKGUuY2VsbEVsZW1lbnQpLmFkZENsYXNzKCdhcHMtZ3JpZF9fZGlzYWJsZWQtY2VsbCcpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgb25Sb3dFeHBhbmRlZDogKGUpID0+IHtcclxuICAgICAgICBjb25zdCBkZXRhaWxSb3dJbmRleCA9IGUuY29tcG9uZW50LmdldFJvd0luZGV4QnlLZXkoZS5rZXkpICsgMTtcclxuICAgICAgICBjb25zdCAkZGV0YWlsQ2VsbCA9IGUuY29tcG9uZW50LmdldENlbGxFbGVtZW50KGRldGFpbFJvd0luZGV4LCAwKS5wYXJlbnQoKS5maW5kKCcuZHgtbWFzdGVyLWRldGFpbC1jZWxsJyk7XHJcbiAgICAgICAgY29uc3QgZGF0YUdyaWQgPSAkZGV0YWlsQ2VsbC5maW5kKCcuZHgtZGF0YWdyaWQnKS5maXJzdCgpLnBhcmVudCgpLmR4RGF0YUdyaWQoJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgICAgIGRhdGFHcmlkLnJlZnJlc2goKTtcclxuICAgICAgfSxcclxuICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucztcclxuXHJcbiAgICByZXR1cm4gY3JlYXRlRGVmYXVsdEdyaWQodGhpcy4kY29udGFpbmVyLCB7XHJcbiAgICAgIG9wdGlvbnM6IGdyaWRPcHRpb25zLFxyXG4gICAgICBpc0Z1bGxTY3JlZW46IHRoaXMuaXNTdGFuZGFsb25lUGFnZSxcclxuICAgICAgc2V0RGVmYXVsdENvbHVtbldpZHRoOiB0cnVlLFxyXG4gICAgICBleHBvcnRGaWxlTmFtZTogdGhpcy5leHBvcnRGaWxlTmFtZSxcclxuICAgICAgdGl0bGU6IHRoaXMucGFnZVRpdGxlLFxyXG4gICAgICBkaXNhYmxlU3VtbWFyeUNvbHVtbkRldGVjdGlvbjogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZU1haW5HcmlkRGF0YVNvdXJjZShjb25maWd1cmF0aW9uOiBJQVBTQ29udHJvbEZpZWxkQ29uZmlndXJhdGlvbltdKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snZGF0YVNvdXJjZSddIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHN0b3JlOiBjcmVhdGVEeERhdGFTb3VyY2Uoe1xyXG4gICAgICAgIGtleTogY29uZmlndXJhdGlvbi5maWx0ZXIoKGMpID0+IGMuSXNLZXlDb2x1bW4pLm1hcCgoYykgPT4gYy5OYW1lKSxcclxuICAgICAgICBsb2FkVXJsOiB0aGlzLmxvYWREYXRhVXJsLFxyXG4gICAgICAgIHVwZGF0ZVVybDogdGhpcy51cGRhdGVEYXRhVXJsXHJcbiAgICAgIH0pXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblZpZXdBcHBsaWVkID0gKHZpZXdJZDogbnVtYmVyKSA9PiB7XHJcbiAgICB0aGlzLmNsZWFyRmlsdGVyUm93QWZ0ZXJWaWV3U3dpdGNoaW5nKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHByZXBhcmVGaWx0ZXJQYW5lbChncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQpIHtcclxuICAgIGNvbnN0ICRmaWx0ZXJQYW5lbEVsZW1lbnQgPSBncmlkLmVsZW1lbnQoKVxyXG4gICAgICAuZmluZCgnLmR4LWRhdGFncmlkLWZpbHRlci1wYW5lbCcpO1xyXG4gICAgY29uc3QgJGZpbHRlckljb25GaWx0ZXIgPSAkZmlsdGVyUGFuZWxFbGVtZW50LmZpbmQoJy5keC1pY29uLWZpbHRlcicpO1xyXG4gICAgY29uc3QgJGZpbHRlclBhbmVsVGV4dCA9ICRmaWx0ZXJQYW5lbEVsZW1lbnQuZmluZCgnLmR4LWRhdGFncmlkLWZpbHRlci1wYW5lbC10ZXh0Jyk7XHJcblxyXG4gICAgJGZpbHRlckljb25GaWx0ZXIub2ZmKCdjbGljaycpO1xyXG4gICAgJGZpbHRlclBhbmVsVGV4dC5vZmYoJ2NsaWNrJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRSb3dzQ291bnRTdW1tYXJ5KGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gICAgY29uc3QgZmlyc3RWaXNpYmxlRGF0YUNvbHVtbiA9IGdyaWQuZ2V0VmlzaWJsZUNvbHVtbnMoKS5maW5kKChjKSA9PiAhIWMuZGF0YUZpZWxkKTtcclxuICAgIGlmICghZmlyc3RWaXNpYmxlRGF0YUNvbHVtbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgcm93c0NvdW50U3VtbWFyeU5hbWUgPSAnUm93c0NvdW50JztcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgICBjb25zdCB0b3RhbEl0ZW1zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuUHJvcGVydGllc1snc3VtbWFyeSddWyd0b3RhbEl0ZW1zJ10gPSAoZ3JpZC5vcHRpb24oJ3N1bW1hcnkudG90YWxJdGVtcycpIGFzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5Qcm9wZXJ0aWVzWydzdW1tYXJ5J11bJ3RvdGFsSXRlbXMnXSApIHx8IFtdO1xyXG4gICAgY29uc3Qgcm93c0NvdW50U3VtbWFyeUl0ZW0gPSB0b3RhbEl0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0gJiYgaXRlbS5uYW1lID09PSByb3dzQ291bnRTdW1tYXJ5TmFtZSk7XHJcbiAgICBpZiAocm93c0NvdW50U3VtbWFyeUl0ZW0gJiYgcm93c0NvdW50U3VtbWFyeUl0ZW0uY29sdW1uID09PSBmaXJzdFZpc2libGVEYXRhQ29sdW1uLmRhdGFGaWVsZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJvd3NDb3VudFN1bW1hcnlJdGVtKSB7XHJcbiAgICAgIHJvd3NDb3VudFN1bW1hcnlJdGVtLmNvbHVtbiA9IGZpcnN0VmlzaWJsZURhdGFDb2x1bW4uZGF0YUZpZWxkO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdG90YWxJdGVtcy5wdXNoKHtcclxuICAgICAgICBuYW1lOiByb3dzQ291bnRTdW1tYXJ5TmFtZSxcclxuICAgICAgICBjb2x1bW46IGZpcnN0VmlzaWJsZURhdGFDb2x1bW4uZGF0YUZpZWxkLFxyXG4gICAgICAgIHN1bW1hcnlUeXBlOiAnY291bnQnLFxyXG4gICAgICAgIGFsaWdubWVudDogJ2xlZnQnLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm1haW5HcmlkLm9wdGlvbignc3VtbWFyeS50b3RhbEl0ZW1zJywgdG90YWxJdGVtcyk7XHJcbiAgfVxyXG5cclxuICAvLyBOT1RFOiBXb3JrYXJvdW5kLiBUaGUgZ3JpZCBjYW4ndCBjbGVhciB0aGUgZmlsdGVyIHJvdywgc28gd2UgY2xlYXIgdGhhdCBtYW51YWxseVxyXG4gIHByaXZhdGUgY2xlYXJGaWx0ZXJSb3dBZnRlclZpZXdTd2l0Y2hpbmcoKSB7XHJcbiAgICBjb25zdCBjbGVhckhlYWRlciA9ICgpID0+IHtcclxuICAgICAgY29uc3QgY29sdW1uc1dpdGhGaWx0ZXJlZFZhbHVlczogeyBbdmlzaWJsZUluZGV4OiBudW1iZXJdOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW4gfSA9IHt9O1xyXG5cclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgY29uc3QgY29sdW1ucyA9IHRoaXMuZ3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudC5vcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIuY3VycmVudFNhdmVkR3JpZFN0YXRlLmNvbHVtbnNcclxuICAgICAgICB8fCB0aGlzLmdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQub3B0aW9ucy5vd25lci5vcHRpb24oJ2NvbHVtbnMnKSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuQ29sdW1uW107XHJcblxyXG4gICAgICBjb2x1bW5zXHJcbiAgICAgICAgLmZpbHRlcigoYykgPT4gYy52aXNpYmxlSW5kZXggJiYgKGMuZmlsdGVyVmFsdWUgfHwgYy5maWx0ZXJWYWx1ZXMpKVxyXG4gICAgICAgIC5mb3JFYWNoKChjKSA9PiBjb2x1bW5zV2l0aEZpbHRlcmVkVmFsdWVzW2MudmlzaWJsZUluZGV4XSA9IGMpO1xyXG5cclxuICAgICAgJCgndGQgW2FyaWEtbGFiZWwqPVwiRmlsdGVyIGNlbGxcIl0nKVxyXG4gICAgICAgIC5maWx0ZXIoKGluZGV4KSA9PiAhY29sdW1uc1dpdGhGaWx0ZXJlZFZhbHVlc1tpbmRleF0pXHJcbiAgICAgICAgLnZhbCgnJyk7XHJcbiAgICAgIHRoaXMubWFpbkdyaWQub2ZmKCdjb250ZW50UmVhZHknLCBjbGVhckhlYWRlcik7XHJcbiAgICB9O1xyXG4gICAgdGhpcy5tYWluR3JpZC5vbignY29udGVudFJlYWR5JywgY2xlYXJIZWFkZXIpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi9EYXRhL1JlcXVlc3QnO1xyXG5pbXBvcnQgeyBjcmVhdGVEZWZhdWx0RGF0YUdyaWQsIGNyZWF0ZUZ1bGxTY3JlZW5EYXRhR3JpZCwgSUdyaWRBZGRpdGlvbmFsT3B0aW9ucyB9IGZyb20gJy4uL0dyaWQvQ3JlYXRlRGVmYXVsdEdyaWQnO1xyXG5pbXBvcnQgY3JlYXRlRGVmYXVsdEdyaWQgZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkJztcclxuXHJcbmludGVyZmFjZSBJQXBwVXNlciB7XHJcbiAgSWQ6IHN0cmluZztcclxuICBVc2VyTmFtZTogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSURpc3BsYXkge1xyXG4gIElkOiBudW1iZXI7XHJcbiAgTmFtZTogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5c1VzZXJBc3NpZ25tZW50IHtcclxuICBEaXNwbGF5SWQ6IG51bWJlcjtcclxuICBVc2VySWQ6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIElHcmlkQ29sdW1uIHtcclxuICBJZDogc3RyaW5nO1xyXG4gIENhcHRpb246IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIElBUFNDb250cm9sRGlzcGxheUFzc2lnbm1lbnRzRGF0YSB7XHJcbiAgVXNlcnM6IElBcHBVc2VyW107XHJcbiAgRGlzcGxheXM6IElEaXNwbGF5W107XHJcbiAgQXNzaWdubWVudHM6IElDb250cm9sRGlzcGxheXNVc2VyQXNzaWdubWVudFtdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEaXNwbGF5TWFuYWdlck9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICBpc1N0YW5kYWxvbmVQYWdlOiBib29sZWFuO1xyXG4gIHBhZ2VUaXRsZTogc3RyaW5nO1xyXG4gIGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRGlzcGxheU1hbmFnZXIge1xyXG4gIHB1YmxpYyByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpc1N0YW5kYWxvbmVQYWdlOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFnZVRpdGxlOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJRGlzcGxheU1hbmFnZXJPcHRpb25zKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSBvcHRpb25zLiRjb250YWluZXI7XHJcbiAgICB0aGlzLmlzU3RhbmRhbG9uZVBhZ2UgPSBvcHRpb25zLmlzU3RhbmRhbG9uZVBhZ2U7XHJcbiAgICB0aGlzLmxvYWREYXRhVXJsID0gb3B0aW9ucy5sb2FkRGF0YVVybDtcclxuICAgIHRoaXMudXBkYXRlRGF0YVVybCA9IG9wdGlvbnMudXBkYXRlRGF0YVVybDtcclxuICAgIHRoaXMucGFnZVRpdGxlID0gb3B0aW9ucy5wYWdlVGl0bGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgbGV0IGNvbHVtbnM6IElHcmlkQ29sdW1uW10gPSBbXTtcclxuXHJcbiAgICBjb25zdCBsb2FkRGF0YVByb21pc2UgPSBzZW5kUmVxdWVzdDxJQVBTQ29udHJvbERpc3BsYXlBc3NpZ25tZW50c0RhdGE+KHRoaXMubG9hZERhdGFVcmwsICdnZXQnKVxyXG4gICAgICAudGhlbigocmVzKSA9PiB7XHJcbiAgICAgICAgY29sdW1ucyA9IHJlcy5EaXNwbGF5cy5tYXAoKGQpID0+ICh7IElkOiBkLklkLnRvU3RyaW5nKCksIENhcHRpb246IGQuTmFtZSB9KSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRhdGEgPSBbXTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCB1c2VyIG9mIHJlcy5Vc2Vycykge1xyXG4gICAgICAgICAgY29uc3QgaXRlbSA9IHsgVXNlck5hbWU6IHVzZXIuVXNlck5hbWUsIFVzZXJJZDogdXNlci5JZCB9O1xyXG4gICAgICAgICAgY29uc3QgdXNlckFzc2lnbm1lbnRzID0gcmVzLkFzc2lnbm1lbnRzLmZpbHRlcigoYSkgPT4gYS5Vc2VySWQgPT09IHVzZXIuSWQpO1xyXG5cclxuICAgICAgICAgIHVzZXJBc3NpZ25tZW50cy5mb3JFYWNoKChhc3NpZ25tZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGl0ZW1bYXNzaWdubWVudC5EaXNwbGF5SWRdID0gdHJ1ZTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIGRhdGEucHVzaChpdGVtKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGdyaWRDb2x1bW5zID0gW1xyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6ICdVc2VyTmFtZScsIHdpZHRoOiAzMDAsIGZpeGVkOiB0cnVlLCBmaXhlZFBvc2l0aW9uOiAnbGVmdCcsIGFsbG93RWRpdGluZzogZmFsc2UgfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiAnVXNlcklkJywgdmlzaWJsZTogZmFsc2UgfVxyXG4gICAgICAgIF0gYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLkNvbHVtbltdO1xyXG5cclxuICAgICAgICBncmlkLm9wdGlvbignY29sdW1ucycsIGdyaWRDb2x1bW5zLmNvbmNhdChjb2x1bW5zLm1hcCgoY29sKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6IGNvbC5JZCxcclxuICAgICAgICAgICAgY2FwdGlvbjogY29sLkNhcHRpb24sXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnYm9vbGVhbicsXHJcbiAgICAgICAgICAgIGNhbGN1bGF0ZUNlbGxWYWx1ZTogKHJvd0RhdGEpID0+ICEhcm93RGF0YVtjb2wuSWRdXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0pKSk7XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBsZXQgdXBkYXRpbmdJc0luUHJvZ3Jlc3MgPSBmYWxzZTtcclxuICAgIGNvbnN0IGdyaWRPcHRpb25zID0ge1xyXG4gICAgICBlbGVtZW50QXR0cjoge2NsYXNzOiAnYXBzLWRpc3BsYXktbWFuYWdlcid9LFxyXG4gICAgICBkYXRhU291cmNlOiB7XHJcbiAgICAgICAgc3RvcmU6IG5ldyBEZXZFeHByZXNzLmRhdGEuQ3VzdG9tU3RvcmUoe1xyXG4gICAgICAgICAga2V5OiAnVXNlcklkJyxcclxuICAgICAgICAgIGxvYWRNb2RlOiAncmF3JyxcclxuICAgICAgICAgIGxvYWQ6ICgpID0+IGxvYWREYXRhUHJvbWlzZSxcclxuICAgICAgICAgIHVwZGF0ZTogKGtleSwgdmFsdWVzOiB7IFtkaXNwbGF5SWQ6IG51bWJlcl06IGJvb2xlYW4gfSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB0b1JlbW92ZTogbnVtYmVyW10gPSBbXTtcclxuICAgICAgICAgICAgY29uc3QgdG9BZGQ6IG51bWJlcltdID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IHRoZXJlSXNDdXJyZW50VXBkYXRpbmcgPSB1cGRhdGluZ0lzSW5Qcm9ncmVzcztcclxuXHJcbiAgICAgICAgICAgIHVwZGF0aW5nSXNJblByb2dyZXNzID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGRpc3BsYXlJZHMgPSBPYmplY3Qua2V5cyh2YWx1ZXMpO1xyXG5cclxuICAgICAgICAgICAgZGlzcGxheUlkcy5mb3JFYWNoKChpZCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICh2YWx1ZXNbaWRdKSB7XHJcbiAgICAgICAgICAgICAgICB0b0FkZC5wdXNoKHBhcnNlSW50KGlkKSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRvUmVtb3ZlLnB1c2gocGFyc2VJbnQoaWQpKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gTk9URTogbm90aWZ5IGFib3V0IHN1Y2Nlc3NmdWwgcmVxdWVzdCBvbmx5IGZvciB0aGUgZmlyc3QgcmVxdWVzdCBpbiB0aGUgcXVldWVcclxuICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4geyB1cGRhdGluZ0lzSW5Qcm9ncmVzcyA9IGZhbHNlOyB9LCAwKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBzZW5kUmVxdWVzdCh0aGlzLnVwZGF0ZURhdGFVcmwsICdwdXQnLCB7XHJcbiAgICAgICAgICAgICAgdXNlcklkOiBrZXksXHJcbiAgICAgICAgICAgICAgZGlzcGxheXNUb1JlbW92ZTogdG9SZW1vdmUsXHJcbiAgICAgICAgICAgICAgZGlzcGxheXNUb0FkZDogdG9BZGRcclxuICAgICAgICAgICAgfSwgIXRoZXJlSXNDdXJyZW50VXBkYXRpbmcpLnByb21pc2UoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9LFxyXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcclxuICAgICAgc2VsZWN0aW9uOiB7XHJcbiAgICAgICAgbW9kZTogJ25vbmUnXHJcbiAgICAgIH0sXHJcbiAgICAgIGFsbG93Q29sdW1uUmVzaXppbmc6IHRydWUsXHJcbiAgICAgIGdyb3VwaW5nOiB7XHJcbiAgICAgICAgY29udGV4dE1lbnVFbmFibGVkOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIGdyb3VwUGFuZWw6IHtcclxuICAgICAgICB2aXNpYmxlOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IGZhbHNlLFxyXG4gICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgYWxsb3dVcGRhdGluZzogdHJ1ZSxcclxuICAgICAgICBtb2RlOiAnY2VsbCcsXHJcbiAgICAgICAgcmVmcmVzaE1vZGU6ICdyZXBhaW50J1xyXG4gICAgICB9XHJcbiAgICB9IGFzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5Qcm9wZXJ0aWVzO1xyXG5cclxuICAgIGNvbnN0IGFkZGl0aW9uYWxPcHRpb25zID0ge1xyXG4gICAgICBleHBvcnRGaWxlTmFtZTogJ0Rpc3BsYXlNYW5hZ2VtZW50JyxcclxuICAgICAgc3VtbWFyeUNvbHVtbjogJ1VzZXJOYW1lJ1xyXG4gICAgfSBhcyBJR3JpZEFkZGl0aW9uYWxPcHRpb25zO1xyXG5cclxuICAgIGxldCBncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XHJcbiAgICBpZiAodGhpcy5pc1N0YW5kYWxvbmVQYWdlKSB7XHJcbiAgICAgIGdyaWQgPSBjcmVhdGVGdWxsU2NyZWVuRGF0YUdyaWQodGhpcy4kY29udGFpbmVyLCBncmlkT3B0aW9ucywgYWRkaXRpb25hbE9wdGlvbnMsIHRoaXMucGFnZVRpdGxlLCAnJywgdHJ1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBncmlkID0gY3JlYXRlRGVmYXVsdEdyaWQodGhpcy4kY29udGFpbmVyLCB7XHJcbiAgICAgICAgb3B0aW9uczogZ3JpZE9wdGlvbnMsXHJcbiAgICAgICAgc3VtbWFyeUNvbHVtbjogYWRkaXRpb25hbE9wdGlvbnMuc3VtbWFyeUNvbHVtbixcclxuICAgICAgICB0aXRsZTogdGhpcy5wYWdlVGl0bGUsXHJcbiAgICAgICAgaXNGdWxsU2NyZWVuOiBmYWxzZSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uL0RhdGEvUmVxdWVzdCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElQaW5nUmVzdWx0IHtcclxuICBpc0F1dGhlbnRpY2F0ZWQ6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVNlc3Npb25Ob3RpZmllck9wdGlvbnMge1xyXG4gIHNlc3Npb25FeHBpcmVUaW1lTXM6IG51bWJlcjtcclxuICBkaXNwbGF5RHVyYXRpb25NczogbnVtYmVyO1xyXG4gIHNlc3Npb25QaW5nVXJsOiBzdHJpbmc7XHJcbiAgbG9nb3V0VXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTZXNzaW9uTm90aWZpZXIge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2Vzc2lvbkV4cGlyZVRpbWVNczogbnVtYmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGxheUR1cmF0aW9uTXM6IG51bWJlcjtcclxuICBwcml2YXRlIHJlYWRvbmx5IHNlc3Npb25QaW5nVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dvdXRVcmw6IHN0cmluZztcclxuXHJcbiAgcHJpdmF0ZSB3YXRpbmdUaW1lb3V0SWQ6IG51bWJlcjtcclxuICBwcml2YXRlIGNvdW50ZXJJbnRlcnZhbElkOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBwaW5nSW50ZXJ2YWxJZDogbnVtYmVyO1xyXG4gIHByaXZhdGUgZXhwaXJhdGlvblRpbWU6IERhdGU7XHJcbiAgcHJpdmF0ZSAkdGV4dENvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgY29udGludWVyQnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uO1xyXG4gIHByaXZhdGUgb2tCdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b247XHJcbiAgcHJpdmF0ZSBsb2dvdXRCdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b247XHJcblxyXG4gIHByaXZhdGUgX3BvcHVwOiBEZXZFeHByZXNzLnVpLmR4UG9wdXA7XHJcbiAgcHJpdmF0ZSBnZXQgcG9wdXAoKTogRGV2RXhwcmVzcy51aS5keFBvcHVwIHtcclxuICAgIGlmICghdGhpcy5fcG9wdXApIHtcclxuICAgICAgdGhpcy5fcG9wdXAgPSB0aGlzLmNyZWF0ZVBvcHVwKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX3BvcHVwO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVNlc3Npb25Ob3RpZmllck9wdGlvbnMpIHtcclxuICAgIHRoaXMuc2Vzc2lvbkV4cGlyZVRpbWVNcyA9IG9wdGlvbnMuc2Vzc2lvbkV4cGlyZVRpbWVNcztcclxuICAgIHRoaXMuZGlzcGxheUR1cmF0aW9uTXMgPSBvcHRpb25zLmRpc3BsYXlEdXJhdGlvbk1zO1xyXG4gICAgdGhpcy5zZXNzaW9uUGluZ1VybCA9IG9wdGlvbnMuc2Vzc2lvblBpbmdVcmw7XHJcbiAgICB0aGlzLmxvZ291dFVybCA9IG9wdGlvbnMubG9nb3V0VXJsO1xyXG5cclxuICAgIHRoaXMucGluZ1Nlc3Npb25JZlRhYklzQWN0aXZlID0gdGhpcy5waW5nU2Vzc2lvbklmVGFiSXNBY3RpdmUuYmluZCh0aGlzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXNldCgpIHtcclxuICAgIHRoaXMuY2xlYXJUaW1lb3V0c0FuZEludGVydmFscygpO1xyXG5cclxuICAgIHRoaXMucG9wdXA/LmhpZGUoKTtcclxuXHJcbiAgICB0aGlzLmV4cGlyYXRpb25UaW1lID0gdGhpcy5nZXRFeHBpcmF0aW9uVGltZSgpO1xyXG5cclxuICAgIHRoaXMud2F0aW5nVGltZW91dElkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnNob3dOb3RpZmljYXRpb24oKTtcclxuICAgIH0sIE1hdGgubWF4KHRoaXMuc2Vzc2lvbkV4cGlyZVRpbWVNcyAtIHRoaXMuZGlzcGxheUR1cmF0aW9uTXMsIDApKTtcclxuXHJcbiAgICB0aGlzLnBpbmdJbnRlcnZhbElkID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgdGhpcy5waW5nU2Vzc2lvbklmVGFiSXNBY3RpdmUoKTtcclxuICAgIH0sIDYwICogMTAwMCk7XHJcblxyXG4gICAgJChkb2N1bWVudCkub24oJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLnBpbmdTZXNzaW9uSWZUYWJJc0FjdGl2ZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzcG9zZSgpIHtcclxuICAgIHRoaXMuY2xlYXJUaW1lb3V0c0FuZEludGVydmFscygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzaG93Tm90aWZpY2F0aW9uKCkge1xyXG4gICAgdGhpcy5wb3B1cD8uc2hvdygpO1xyXG5cclxuICAgIHRoaXMuY2xlYXJUaW1lb3V0c0FuZEludGVydmFscygpO1xyXG5cclxuICAgIHRoaXMudXBkYXRlUG9wdXBDb250ZW50KCk7XHJcbiAgICB0aGlzLmNvdW50ZXJJbnRlcnZhbElkID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgdGhpcy51cGRhdGVQb3B1cENvbnRlbnQoKTtcclxuICAgIH0sIDEwMDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGVhclRpbWVvdXRzQW5kSW50ZXJ2YWxzKCkge1xyXG4gICAgaWYgKHRoaXMud2F0aW5nVGltZW91dElkKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLndhdGluZ1RpbWVvdXRJZCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jb3VudGVySW50ZXJ2YWxJZCkge1xyXG4gICAgICBjbGVhckludGVydmFsKHRoaXMuY291bnRlckludGVydmFsSWQpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucGluZ0ludGVydmFsSWQpIHtcclxuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnBpbmdJbnRlcnZhbElkKTtcclxuICAgIH1cclxuXHJcbiAgICAkKGRvY3VtZW50KS5vZmYoJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLnBpbmdTZXNzaW9uSWZUYWJJc0FjdGl2ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEV4cGlyYXRpb25UaW1lKCk6IERhdGUge1xyXG4gICAgY29uc3QgZXhwaXJhdGlvblRpbWUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgZXhwaXJhdGlvblRpbWUuc2V0TWlsbGlzZWNvbmRzKGV4cGlyYXRpb25UaW1lLmdldE1pbGxpc2Vjb25kcygpICsgdGhpcy5zZXNzaW9uRXhwaXJlVGltZU1zKTtcclxuXHJcbiAgICByZXR1cm4gZXhwaXJhdGlvblRpbWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVBvcHVwKCk6IERldkV4cHJlc3MudWkuZHhQb3B1cCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpLmR4UG9wdXAoe1xyXG4gICAgICB0aXRsZTogJ1Nlc3Npb24gRXhwaXJpbmcnLFxyXG4gICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiBmYWxzZSxcclxuICAgICAgcmVzaXplRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIHNob3dDbG9zZUJ1dHRvbjogZmFsc2UsXHJcbiAgICAgIGRyYWdFbmFibGVkOiBmYWxzZSxcclxuICAgICAgbWF4SGVpZ2h0OiAxOTAsXHJcbiAgICAgIG1heFdpZHRoOiAzNzAsXHJcbiAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICBjb250ZW50VGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICB0aGlzLiR0ZXh0Q29udGFpbmVyID0gJCgnPHNwYW4gLz4nKTtcclxuICAgICAgICB0aGlzLiR0ZXh0Q29udGFpbmVyLmFwcGVuZCh0aGlzLmdldENvdW50ZXJUZXh0KCkpO1xyXG4gICAgICAgIGNvbnN0ICRjb250YWluZXIgPSAkKCc8ZGl2IC8+JykuYXBwZW5kKHRoaXMuJHRleHRDb250YWluZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gJGNvbnRhaW5lcjtcclxuICAgICAgfSxcclxuICAgICAgdG9vbGJhckl0ZW1zOiBbe1xyXG4gICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgdHlwZTogJ2RlZmF1bHQnLFxyXG4gICAgICAgICAgdGV4dDogJ0NvbnRpbnVlIHNlc3Npb24nLFxyXG4gICAgICAgICAgb25Jbml0aWFsaXplZDogKGUpID0+IHRoaXMuY29udGludWVyQnV0dG9uID0gZS5jb21wb25lbnQsXHJcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFNlc3Npb24oKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgICB9LCB7XHJcbiAgICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICB0eXBlOiAnZGVmYXVsdCcsXHJcbiAgICAgICAgICB0ZXh0OiAnUmVsb2FkIHBhZ2UnLFxyXG4gICAgICAgICAgb25Jbml0aWFsaXplZDogKGUpID0+IHRoaXMub2tCdXR0b24gPSBlLmNvbXBvbmVudCxcclxuICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9XHJcbiAgICAgIH0sIHtcclxuICAgICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgdGV4dDogJ0xvZyBPdXQnLFxyXG4gICAgICAgICAgb25Jbml0aWFsaXplZDogKGUpID0+IHRoaXMubG9nb3V0QnV0dG9uID0gZS5jb21wb25lbnQsXHJcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nT3V0KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XSxcclxuICAgIH0pLmFwcGVuZFRvKCQoZG9jdW1lbnQuYm9keSkpLmR4UG9wdXAoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENvdW50ZXJUZXh0KCk6IEpRdWVyeSB7XHJcbiAgICBjb25zdCByZW1haW5lZFNlY29uZHMgPSBNYXRoLm1heCh0aGlzLmdldFNlY29uZHNUb0V4cGlyYXRpb24oKSwgMCk7XHJcbiAgICBpZiAocmVtYWluZWRTZWNvbmRzID09PSAwKSB7XHJcbiAgICAgIHJldHVybiAkKCc8c3BhbiAvPicpLnRleHQoJ1lvdXIgc2Vzc2lvbiBoYXMgYmVlbiBleHBpcmVkJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCAkc3RhcnRUZXh0ID0gJCgnPHNwYW4gLz4nKS50ZXh0KCdZb3VyIHNlc3Npb24gd2lsbCBleHBpcmUgaW4gJyk7XHJcbiAgICAgIGNvbnN0ICRjb3VudGVyID0gJCgnPHNwYW4gLz4nKS5hZGRDbGFzcygnc2Vzc2lvbi1ub3RpZmllcl9fY291bnRlcicpLnRleHQocmVtYWluZWRTZWNvbmRzLnRvRml4ZWQoMCkpO1xyXG4gICAgICBjb25zdCAkZmluaXNoVGV4dCA9ICQoJzxzcGFuIC8+JykudGV4dCgnIHNlY29uZHMnKTtcclxuXHJcbiAgICAgIHJldHVybiAkKCc8c3BhbiAvPicpLmFwcGVuZCgkc3RhcnRUZXh0LCAkY291bnRlciwgJGZpbmlzaFRleHQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTZWNvbmRzVG9FeHBpcmF0aW9uKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKHRoaXMuZXhwaXJhdGlvblRpbWUuZ2V0VGltZSgpIC0gbmV3IERhdGUoKS5nZXRUaW1lKCkpIC8gMTAwMDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVmcmVzaFNlc3Npb24oKSB7XHJcbiAgICB0aGlzLnJlc2V0KCk7XHJcblxyXG4gICAgc2VuZFJlcXVlc3Q8SVBpbmdSZXN1bHQ+KHRoaXMuc2Vzc2lvblBpbmdVcmwsICdHRVQnLCBudWxsLCBmYWxzZSwgeyBub3RpZnlFcnJvcjogZmFsc2UgfSkudGhlbigocmVzKSA9PiB7XHJcbiAgICAgIGlmICghcmVzLmlzQXV0aGVudGljYXRlZCkge1xyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgICAgfVxyXG4gICAgfSkuY2F0Y2goKCkgPT4gd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGluZ1Nlc3Npb25JZlRhYklzQWN0aXZlKCkge1xyXG4gICAgaWYgKGRvY3VtZW50LmhpZGRlbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgc2VuZFJlcXVlc3Q8SVBpbmdSZXN1bHQ+KHRoaXMuc2Vzc2lvblBpbmdVcmwsICdHRVQnLCBudWxsLCBmYWxzZSwgeyBub3RpZnlFcnJvcjogZmFsc2UgfSkudGhlbigocmVzKSA9PiB7XHJcbiAgICAgIGlmICghcmVzLmlzQXV0aGVudGljYXRlZCkge1xyXG4gICAgICAgIHRoaXMuc2V0RXhwaXJlZCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0RXhwaXJlZCgpIHtcclxuICAgIHRoaXMuZXhwaXJhdGlvblRpbWUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgdGhpcy5zaG93Tm90aWZpY2F0aW9uKCk7XHJcbiAgICBpZiAodGhpcy5waW5nSW50ZXJ2YWxJZCkge1xyXG4gICAgICBjbGVhckludGVydmFsKHRoaXMucGluZ0ludGVydmFsSWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2dPdXQoKSB7XHJcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHRoaXMubG9nb3V0VXJsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVQb3B1cENvbnRlbnQoKSB7XHJcbiAgICBjb25zdCBpc0FscmVhZHlFeHBpcmVkID0gdGhpcy5nZXRTZWNvbmRzVG9FeHBpcmF0aW9uKCkgPD0gMDtcclxuXHJcbiAgICB0aGlzLiR0ZXh0Q29udGFpbmVyPy5odG1sKCcnKS5hcHBlbmQodGhpcy5nZXRDb3VudGVyVGV4dCgpKTtcclxuICAgIHRoaXMub2tCdXR0b24ub3B0aW9uKCd2aXNpYmxlJywgaXNBbHJlYWR5RXhwaXJlZCk7XHJcbiAgICB0aGlzLmNvbnRpbnVlckJ1dHRvbi5vcHRpb24oJ3Zpc2libGUnLCAhaXNBbHJlYWR5RXhwaXJlZCk7XHJcbiAgICB0aGlzLmxvZ291dEJ1dHRvbi5vcHRpb24oJ3Zpc2libGUnLCAhaXNBbHJlYWR5RXhwaXJlZCk7XHJcbiAgfVxyXG59XHJcbiIsICJjb25zdCBHUklEX0lORElDQVRPUl9TVEFURSA9IHtcclxuICBlZGl0OiAnZWRpdCcsXHJcbiAgc2F2aW5nOiAnc2F2aW5nJyxcclxuICBzYXZlZDogJ3NhdmVkJ1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgR1JJRF9JTkRJQ0FUT1JfU1RBVEU7XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJR3JpZERhdGFMYXllciB9IGZyb20gJy4uLy4uL0RhdGEvSW5kZXgnO1xyXG5pbXBvcnQgeyBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZSwgSUdyaWRTdGF0ZSwgSUdyaWRFeHRlbmRlZENvbHVtblN0YXRlLCBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlIH0gZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9JR3JpZFN0YXRlJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vLi4vLi4vVXRpbHMvSW5kZXgnO1xyXG5cclxuaW50ZXJmYWNlIElMb2FkZWRDb2x1bW5zIHsgW2RhdGFGaWVsZDogc3RyaW5nXTogYm9vbGVhbjsgfVxyXG5pbnRlcmZhY2UgSUdyaWRBZGRpdGlvbmFsQ29sdW1uU2V0dGluZ3MgeyBbZGF0YUZpZWxkOiBzdHJpbmddOiBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZTsgfVxyXG5pbnRlcmZhY2UgSUNvbHVtbldpZHRocyB7IFt2aXNpYmxlSW5kZXg6IG51bWJlcl06IG51bWJlciB8IHN0cmluZzsgfVxyXG5cclxuaW50ZXJmYWNlIElDb2x1bW5DYXB0aW9uIHtcclxuICBkYXRhRmllbGQ6IHN0cmluZztcclxuICBjYXB0aW9uOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdyaWRTdGF0ZU1hbmFnZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gIHB1YmxpYyBPVVREQVRFX0NPTFVNTlNfRk9VTkRfRVZFTlQgPSAnb3V0ZGF0ZWQtY29sdW1ucy1mb3VuZC1ldmVudCc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpZDogbnVtYmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JpZERhdGFMYXllcjogSUdyaWREYXRhTGF5ZXI7XHJcblxyXG4gIHByaXZhdGUgc3RhdGVMb2FkZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIGxvYWRlZENvbHVtbnM6IElMb2FkZWRDb2x1bW5zID0ge307XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzOiBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TZXR0aW5ncyA9IHt9O1xyXG5cclxuICBwcml2YXRlIGxhc3RDb2x1bW5TZXR0aW5nc1N0cjogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3RvcihncmlkSWQ6IG51bWJlciwgZ3JpZERhdGFMYXllcjogSUdyaWREYXRhTGF5ZXIpIHtcclxuICAgIHN1cGVyKCk7XHJcblxyXG4gICAgdGhpcy5pZCA9IGdyaWRJZDtcclxuICAgIHRoaXMuZ3JpZERhdGFMYXllciA9IGdyaWREYXRhTGF5ZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9hZChjaGVja091dGRhdGVkQ29sdW1uczogYm9vbGVhbiwgb3V0ZGF0ZWRDb2x1bW5zQ2FsbGJhY2s6IChjb2x1bW5zKSA9PiB2b2lkKTogSlF1ZXJ5UHJvbWlzZTxJR3JpZFN0YXRlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmlkRGF0YUxheWVyLmdldEdyaWRWaWV3U2V0dGluZ3ModGhpcy5pZClcclxuICAgICAgLnRoZW4oKGRhdGE6IElHcmlkU3RhdGUpID0+IHtcclxuICAgICAgICB0aGlzLm9uRGF0YUxvYWRlZChkYXRhKTtcclxuXHJcbiAgICAgICAgaWYgKGNoZWNrT3V0ZGF0ZWRDb2x1bW5zKSB7XHJcbiAgICAgICAgICB0aGlzLmNoZWNrQ29sdW1uc1JlbGV2YW5jZShkYXRhLmNvbHVtbnMsIG91dGRhdGVkQ29sdW1uc0NhbGxiYWNrKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzYXZlKHN0YXRlOiBJR3JpZFN0YXRlLCBzYXZpbmdDYWxsYmFjaz86ICgpID0+IHZvaWQsIHNhdmVkQ2FsbGJhY2s/OiAoKSA9PiB2b2lkKTogSUNvbHVtbldpZHRocyB7XHJcbiAgICBjb25zdCBjb2x1bW5XaWR0aHM6IElDb2x1bW5XaWR0aHMgPSB7fTtcclxuXHJcbiAgICBpZiAoIXN0YXRlLmNvbHVtbnMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRlLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgIGNvbnN0IGFkZFNldHRpbmdzID0gdGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzW2NvbHVtbi5kYXRhRmllbGRdO1xyXG5cclxuICAgICAgaWYgKGFkZFNldHRpbmdzKSB7XHJcbiAgICAgICAgY29sdW1uLmNhcHRpb24gPSBhZGRTZXR0aW5ncy5jYXB0aW9uO1xyXG4gICAgICAgIGNvbHVtbi50b29sdGlwID0gYWRkU2V0dGluZ3MudG9vbHRpcDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy9OT1RFOiBpZiBEQiB0YWJsZSBoYXMgbm8gZGF0YSBpbiBhIGNvbHVtbiwgZGF0YSBncmlkIGNhbid0IGluZmVyIGRhdGEgdHlwZSBhbmQgZG9lc24ndCBzZXQgdGhlIGRhdGFUeXBlIGZpZWxkXHJcbiAgICAgIGlmICghY29sdW1uLmRhdGFUeXBlKSB7XHJcbiAgICAgICAgY29sdW1uLmRhdGFUeXBlID0gR3JpZERhdGFDb2x1bW5EYXRhVHlwZS5EZWZhdWx0O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoISFjb2x1bW4ud2lkdGggJiYgY29sdW1uLnZpc2libGUpIHtcclxuICAgICAgICBjb2x1bW5XaWR0aHNbY29sdW1uLnZpc2libGVJbmRleF0gPSBjb2x1bW4ud2lkdGg7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGNvbHVtblNldHRpbmdzU3RyID0gSlNPTi5zdHJpbmdpZnkoc3RhdGUuY29sdW1ucyk7XHJcblxyXG4gICAgaWYgKCF0aGlzLnN0YXRlTG9hZGVkIHx8IGNvbHVtblNldHRpbmdzU3RyID09PSB0aGlzLmxhc3RDb2x1bW5TZXR0aW5nc1N0cikge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxhc3RDb2x1bW5TZXR0aW5nc1N0ciA9IGNvbHVtblNldHRpbmdzU3RyO1xyXG5cclxuICAgIGlmIChzYXZpbmdDYWxsYmFjaykge1xyXG4gICAgICBzYXZpbmdDYWxsYmFjaygpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZ3JpZERhdGFMYXllci51cGRhdGVHcmlkVmlld1NldHRpbmdzKHRoaXMuaWQsIHN0YXRlKVxyXG4gICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgaWYgKHNhdmVkQ2FsbGJhY2spIHtcclxuICAgICAgICAgIHNhdmVkQ2FsbGJhY2soKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBjb2x1bW5XaWR0aHM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2hlY2tOZXdDb2x1bW5zKHN0YXRlOiBJR3JpZFN0YXRlKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgbmV3Q29sdW1uRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgIGlmIChzdGF0ZS5jb2x1bW5zKSB7XHJcbiAgICAgIGNvbnN0IG5ld0NvbHVtbnMgPSBzdGF0ZS5jb2x1bW5zLmZpbHRlcigoY29sdW1uKSA9PiAhdGhpcy5sb2FkZWRDb2x1bW5zW2NvbHVtbi5kYXRhRmllbGRdICYmIGNvbHVtbi52aXNpYmxlKTtcclxuXHJcbiAgICAgIGlmIChuZXdDb2x1bW5zLmxlbmd0aCkge1xyXG4gICAgICAgIG5ld0NvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgICBuZXdDb2x1bW5GaWVsZHMucHVzaChjb2x1bW4uZGF0YUZpZWxkKTtcclxuICAgICAgICAgIHRoaXMubG9hZGVkQ29sdW1uc1tjb2x1bW4uZGF0YUZpZWxkXSA9IHRydWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3Q29sdW1uRmllbGRzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENvbHVtbkNhcHRpb25zKCk6IElDb2x1bW5DYXB0aW9uW10ge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5ncykubWFwKChkYXRhRmllbGQpID0+IHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBkYXRhRmllbGQsXHJcbiAgICAgICAgY2FwdGlvbjogdGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzW2RhdGFGaWVsZF0uY2FwdGlvblxyXG4gICAgICB9IGFzIElDb2x1bW5DYXB0aW9uO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0Q29sdW1uQ2FwdGlvbihkYXRhRmllbGQ6IHN0cmluZywgY2FwdGlvbjogc3RyaW5nKSB7XHJcbiAgICBpZiAoIXRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tkYXRhRmllbGRdKSB7XHJcbiAgICAgIHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tkYXRhRmllbGRdID0geyBjYXB0aW9uOiAnJywgdG9vbHRpcDogJycgfTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3NbZGF0YUZpZWxkXS5jYXB0aW9uID0gY2FwdGlvbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDb2x1bW5BZGRpdGlvbmFsU2V0dGluZ3MoZGF0YUZpZWxkOiBzdHJpbmcpOiBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZSB7XHJcbiAgICByZXR1cm4gdGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzW2RhdGFGaWVsZF07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2hlY2tDb2x1bW5zUmVsZXZhbmNlKGNvbHVtbnM6IElHcmlkRXh0ZW5kZWRDb2x1bW5TdGF0ZVtdLCBjYWxsYmFjazogKG91dGRhdGVkQ29sdW1uczogc3RyaW5nW10pID0+IHZvaWQpIHtcclxuICAgIHRoaXMuZ3JpZERhdGFMYXllci5nZXRDb2x1bW5zQnlSZXBvcnRJZCh0aGlzLmlkKVxyXG4gICAgICAudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGFjdHVhbENvbHVtbnMgPSB7fTtcclxuXHJcbiAgICAgICAgZGF0YS5mb3JFYWNoKChjKSA9PiBhY3R1YWxDb2x1bW5zW2MuTmFtZV0gPSB0cnVlKTtcclxuXHJcbiAgICAgICAgY29uc3Qgb3V0ZGF0ZWRDb2x1bW5zID0gY29sdW1ucy5maWx0ZXIoKGMpID0+ICFhY3R1YWxDb2x1bW5zW2MuZGF0YUZpZWxkXSkubWFwKChjKSA9PiBjLmRhdGFGaWVsZCk7XHJcblxyXG4gICAgICAgIGlmIChvdXRkYXRlZENvbHVtbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBEZXZFeHByZXNzLnVpLmRpYWxvZy5jb25maXJtKGBHcmlkIHNldHRpbmdzIGNvbnRhaW4gc29tZSBjb2x1bm1zIHdoaWNoIGRvbid0IGV4aXN0IGluIHRoZSBkYXRhYmFzZSB0YWJsZSBhbnltb3JlOlxyXG5cclxuICAgICAgICAgICcke291dGRhdGVkQ29sdW1ucy5qb2luKCcsICcpfScuXHJcblxyXG4gICAgICAgICAgRG8geW91IHdhbnQgdG8gcmVtb3ZlIHRoZXNlIGNvbHVtbnMgZnJvbSBncmlkIHNldHRpbmdzP1xyXG4gICAgICAgICAgYCwgJ1JlbW92ZSByZWR1bmRhbnQgY29sdW1ucz8nKVxyXG4gICAgICAgICAgICAudGhlbigocmVzKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKCFyZXMpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGNhbGxiYWNrKG91dGRhdGVkQ29sdW1ucyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzZXRTZXR0aW5ncygpOiBKUXVlcnlQcm9taXNlPElHcmlkU3RhdGU+IHtcclxuICAgIHJldHVybiB0aGlzLmdyaWREYXRhTGF5ZXIucmVzZXRTZXR0aW5ncyh0aGlzLmlkKVxyXG4gICAgICAudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICAgIHRoaXMub25EYXRhTG9hZGVkKGRhdGEpO1xyXG5cclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uRGF0YUxvYWRlZChkYXRhOiBJR3JpZFN0YXRlKSB7XHJcbiAgICBjb25zdCBsb2FkZWRHcmlkU3RhdGVDb2x1bW5zID0gZGF0YSAmJiBkYXRhLmNvbHVtbnM7XHJcbiAgICBsZXQgdmlzaWJsZUluZGV4Q291bnRlciA9IDA7XHJcblxyXG4gICAgdGhpcy5zdGF0ZUxvYWRlZCA9IHRydWU7XHJcblxyXG4gICAgaWYgKGxvYWRlZEdyaWRTdGF0ZUNvbHVtbnMpIHtcclxuICAgICAgdGhpcy5sb2FkZWRDb2x1bW5zID0ge307XHJcblxyXG4gICAgICBsb2FkZWRHcmlkU3RhdGVDb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGVkQ29sdW1uc1tjb2x1bW4uZGF0YUZpZWxkXSA9IHRydWU7XHJcblxyXG4gICAgICAgIC8vIE5PVEU6IHNldCB2aXNpYmxlIGluZGV4ZXMgaWYgdGhleSBoYXZlIG5vdCBiZWVuIHNldC4gSXQncyByZXF1aXJlZCBmb3IgcHJvcGVyIGR4RGF0YUdyaWQgYXBwZWFyYW5jZS5cclxuICAgICAgICBpZiAoY29sdW1uLnZpc2libGUgJiYgY29sdW1uLnZpc2libGVJbmRleCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgY29sdW1uLnZpc2libGVJbmRleCA9IHZpc2libGVJbmRleENvdW50ZXIrKztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIE5PVEU6IHJlbW92ZSBlbXB0eSB2YWx1ZXMgYmVjYXVzZSB0aGV5IGxlYWQgdG8gd3JvbmcgZHhEYXRhR3JpZCBiZWhhdmlvclxyXG4gICAgICAgIE9iamVjdC5rZXlzKGNvbHVtbikuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgICBpZiAoY29sdW1uW2tleV0gPT09IG51bGwgfHwgY29sdW1uW2tleV0gPT09IHZvaWQgMCB8fCBjb2x1bW5ba2V5XSA9PT0gJycpIHtcclxuICAgICAgICAgICAgZGVsZXRlIGNvbHVtbltrZXldO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsU2V0dGluZ3MgPSB0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3NbY29sdW1uLmRhdGFGaWVsZF07XHJcblxyXG4gICAgICAgIGlmICghYWRkaXRpb25hbFNldHRpbmdzKSB7XHJcbiAgICAgICAgICB0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3NbY29sdW1uLmRhdGFGaWVsZF0gPSB7XHJcbiAgICAgICAgICAgIGNhcHRpb246IGNvbHVtbi5jYXB0aW9uLFxyXG4gICAgICAgICAgICB0b29sdGlwOiBjb2x1bW4udG9vbHRpcFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgYWRkaXRpb25hbFNldHRpbmdzLmNhcHRpb24gPSBjb2x1bW4uY2FwdGlvbjtcclxuICAgICAgICAgIGFkZGl0aW9uYWxTZXR0aW5ncy50b29sdGlwID0gY29sdW1uLnRvb2x0aXA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBOT1RFOiByZW1vdmUgY29sdW1ucyB3aGljaCBkeERhdGFHcmlkIGRvZXNuJ3QgZXhwZWN0LlxyXG4gICAgICAgIGRlbGV0ZSBjb2x1bW4uY2FwdGlvbjtcclxuICAgICAgICBkZWxldGUgY29sdW1uLnRvb2x0aXA7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubGFzdENvbHVtblNldHRpbmdzU3RyID0gSlNPTi5zdHJpbmdpZnkoZGF0YS5jb2x1bW5zKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmVudW0gR3JpZE1vZGUge1xyXG4gIFZpZXcgPSAxLFxyXG4gIEVkaXQgPSAyXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEdyaWRNb2RlO1xyXG4iLCAiXHVGRUZGaW1wb3J0IEdyaWRNb2RlIGZyb20gJy4uL1BhZ2VzL0dyaWQvTW9kZSc7XHJcbmltcG9ydCB7IElSZXBvcnRQYXJhbXMgfSBmcm9tICcuLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IHsgSUdyaWRTdGF0ZSB9IGZyb20gJy4uLy4uL1dpZGdldHMvSUdyaWRTdGF0ZSc7XHJcbmltcG9ydCB7IElDb2x1bW5NZXRhRGF0YSB9IGZyb20gJy4uL0NvbHVtbk1ldGFEYXRhJztcclxuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi8uLi9EYXRhL1JlcXVlc3QnO1xyXG5pbXBvcnQgeyBjcmVhdGVEeERhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi9EYXRhL0R4RGF0YVNvdXJjZSc7XHJcbmltcG9ydCB7IEV4Y2VwdGlvblR5cGUgfSBmcm9tICcuLi8uLi9EYXRhL0V4Y2VwdGlvblR5cGUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZERhdGFMYXllciB7XHJcbiAgZ2V0Q29sdW1uc0J5UmVwb3J0SWQocmVwb3J0SWQ6IG51bWJlcik6IEpRdWVyeURlZmVycmVkPElDb2x1bW5NZXRhRGF0YVtdPjtcclxuICBnZXRHcmlkRGF0YVNvdXJjZShyZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXMsIGdyaWRNb2RlOiBHcmlkTW9kZSwgc2hvd0FsbERhdGFJbkVkaXQ6IGJvb2xlYW4pOiBEZXZFeHByZXNzLmRhdGEuQ3VzdG9tU3RvcmU8YW55LCBhbnk+O1xyXG4gIHJlc2V0U2V0dGluZ3MocmVwb3J0SWQ6IG51bWJlcik6IEpRdWVyeURlZmVycmVkPElHcmlkU3RhdGU+O1xyXG4gIHVwZGF0ZUdyaWRWaWV3U2V0dGluZ3MocmVwb3J0SWQ6IG51bWJlciwgc3RhdGU6IElHcmlkU3RhdGUpOiBKUXVlcnlEZWZlcnJlZDxhbnk+O1xyXG4gIGdldEdyaWRWaWV3U2V0dGluZ3MocmVwb3J0SWQ6IG51bWJlcik6IEpRdWVyeURlZmVycmVkPElHcmlkU3RhdGU+O1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgY3JlYXRlR3JpZERhdGFMYXllcjogKGdyaWRSZXBvcnRDb250cm9sbGVyVXJsOiBzdHJpbmcpID0+IElHcmlkRGF0YUxheWVyID0gKGdyaWRSZXBvcnRDb250cm9sbGVyVXJsOiBzdHJpbmcpID0+IHtcclxuICBjb25zdCB1cmxzID0ge1xyXG4gICAgZ3JpZFJlc3VsdDogYCR7Z3JpZFJlcG9ydENvbnRyb2xsZXJVcmx9L0dyaWRWaWV3UmVzdWx0YCxcclxuICAgIGdldENvbHVtbnNCeVJlcG9ydElkOiBgJHtncmlkUmVwb3J0Q29udHJvbGxlclVybH0vR2V0RGJUYWJsZUZpZWxkc2AsXHJcbiAgICByZXNldEdyaWRTZXR0aW5nczogYCR7Z3JpZFJlcG9ydENvbnRyb2xsZXJVcmx9L1Jlc2V0R3JpZFZpZXdTZXR0aW5nc2AsXHJcbiAgICB1cGRhdGVHcmlkVmlld1NldHRpbmdzOiBgJHtncmlkUmVwb3J0Q29udHJvbGxlclVybH0vVXBkYXRlR3JpZFZpZXdTZXR0aW5nc2AsXHJcbiAgICBnZXRHcmlkVmlld1NldHRpbmdzOiBgJHtncmlkUmVwb3J0Q29udHJvbGxlclVybH0vR2V0R3JpZFZpZXdTZXR0aW5nc2BcclxuICB9O1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgZ2V0R3JpZERhdGFTb3VyY2UocmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zLCBncmlkTW9kZTogR3JpZE1vZGUsIHNob3dBbGxEYXRhSW5FZGl0KSB7XHJcbiAgICAgIHJldHVybiBjcmVhdGVEeERhdGFTb3VyY2Uoe1xyXG4gICAgICAgIGxvYWRQYXJhbXM6IHtcclxuICAgICAgICAgIGlkOiByZXBvcnRQYXJhbXMuUmVwb3J0SWQsXHJcbiAgICAgICAgICBhcHBOYW1lOiByZXBvcnRQYXJhbXMuQXBwTmFtZSxcclxuICAgICAgICAgIGdyaWRNb2RlLFxyXG4gICAgICAgICAgcm93c0xpbWl0OiBncmlkTW9kZSA9PT0gR3JpZE1vZGUuRWRpdCAmJiAhc2hvd0FsbERhdGFJbkVkaXQgPyAxNSA6IG51bGxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGxvYWRVcmw6IHVybHMuZ3JpZFJlc3VsdCxcclxuICAgICAgICBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2VcclxuICAgICAgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldENvbHVtbnNCeVJlcG9ydElkOiAocmVwb3J0SWQ6IG51bWJlcikgPT4ge1xyXG4gICAgICByZXR1cm4gc2VuZFJlcXVlc3QodXJscy5nZXRDb2x1bW5zQnlSZXBvcnRJZCwgJ3Bvc3QnLCB7IGlkOiByZXBvcnRJZCB9LCBmYWxzZSwge1xyXG4gICAgICAgIGRhdGFUeXBlOiAnanNvbidcclxuICAgICAgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIHJlc2V0U2V0dGluZ3M6IChyZXBvcnRJZDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIHJldHVybiBzZW5kUmVxdWVzdCh1cmxzLnJlc2V0R3JpZFNldHRpbmdzLCAncG9zdCcsIHsgaWQ6IHJlcG9ydElkIH0sIGZhbHNlLCB7IGRhdGFUeXBlOiAnanNvbicgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIHVwZGF0ZUdyaWRWaWV3U2V0dGluZ3M6IChyZXBvcnRJZDogbnVtYmVyLCBzdGF0ZTogSUdyaWRTdGF0ZSkgPT4ge1xyXG4gICAgICByZXR1cm4gc2VuZFJlcXVlc3QodXJscy51cGRhdGVHcmlkVmlld1NldHRpbmdzLCAncG9zdCcsIHtcclxuICAgICAgICBpZDogcmVwb3J0SWQsIGNvbHVtbnNTZXR0aW5nczogSlNPTi5zdHJpbmdpZnkoc3RhdGUuY29sdW1ucylcclxuICAgICAgfSwgZmFsc2UsIHtcclxuICAgICAgICBkYXRhVHlwZTogJ2pzb24nXHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRHcmlkVmlld1NldHRpbmdzOiAocmVwb3J0SWQ6IG51bWJlcikgPT4ge1xyXG4gICAgICByZXR1cm4gc2VuZFJlcXVlc3QodXJscy5nZXRHcmlkVmlld1NldHRpbmdzLCAncG9zdCcsIHsgaWQ6IHJlcG9ydElkIH0sIGZhbHNlLCB7XHJcbiAgICAgICAgZGF0YVR5cGU6ICdqc29uJ1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9O1xyXG59O1xyXG5cclxuY29uc3QgZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlID0gKGV4Y2VwdGlvblR5cGU6IEV4Y2VwdGlvblR5cGUpOiBzdHJpbmcgPT4ge1xyXG4gIHN3aXRjaCAoZXhjZXB0aW9uVHlwZSkge1xyXG4gICAgY2FzZSBFeGNlcHRpb25UeXBlLlNxbEV4Y2VwdGlvbjpcclxuICAgICAgcmV0dXJuICdXZSBhdHRlbXB0ZWQgdG8gZXhlY3V0ZSB0aGUgZGF0YSBxdWVyeSBob3dldmVyIGl0IGFwcGVhcnMgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIGRhdGEgc291cmNlLiBQbGVhc2UgY29udGFjdCB0aGUgcmVwb3J0IGF1dGhvciB0byBjb25maXJtIHRoZSBkYXRhIHJlcXVpcmVtZW50cy4nO1xyXG5cclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIHJldHVybiAnJztcclxuICB9XHJcbn07XHJcbiIsICJleHBvcnQgaW50ZXJmYWNlIElSZWZyZXNoT3B0aW9ucyB7XHJcbiAgY2FsbGJhY2s6ICgpID0+IHZvaWQ7XHJcbiAgZWxhcHNlZENhbGxiYWNrOiAodGltZTogbnVtYmVyKSA9PiB2b2lkO1xyXG59XHJcblxyXG5jb25zdCB1cGRhdGVUaW1lb3V0ID0gMTAwO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVmcmVzaFRpbWVyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNhbGxiYWNrOiAoKSA9PiB2b2lkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZWxhcHNlZENhbGxiYWNrOiAodGltZTogbnVtYmVyKSA9PiB2b2lkO1xyXG4gIHByaXZhdGUgYWN0aXZlVGltZXJJZDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIGN1cnJlbnRJbnRlcnZhbDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIGxhc3RTdGF0ZUNoZWNrZWQ6IERhdGU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElSZWZyZXNoT3B0aW9ucykge1xyXG4gICAgdGhpcy5lbGFwc2VkQ2FsbGJhY2sgPSBvcHRpb25zLmVsYXBzZWRDYWxsYmFjaztcclxuICAgIHRoaXMuY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXJ0KGludGVydmFsOiBudW1iZXIpIHtcclxuICAgIGlmIChpbnRlcnZhbCA8PSAwKSB7XHJcbiAgICAgIHRoaXMuY2FsbGJhY2soKTtcclxuXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxhc3RTdGF0ZUNoZWNrZWQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgdGhpcy5jdXJyZW50SW50ZXJ2YWwgPSBpbnRlcnZhbDtcclxuXHJcbiAgICBjb25zdCB0aW1lcklkID0gdGhpcy5hY3RpdmVUaW1lcklkID0gTWF0aC5yYW5kb20oKTtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRJbnRlcnZhbCA8IDApIHtcclxuICAgICAgdGhpcy5lbGFwc2VkQ2FsbGJhY2sodGhpcy5jdXJyZW50SW50ZXJ2YWwpO1xyXG5cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudGlja1RpbWVyRnVuY3Rpb24odGltZXJJZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdHJpZ2dlckNoYW5nZSgpOiB2b2lkIHtcclxuICAgIHRoaXMubGFzdFN0YXRlQ2hlY2tlZCA9IG5ldyBEYXRlKCk7XHJcbiAgICB0aGlzLmNhbGxiYWNrKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzcG9zZSgpIHtcclxuICAgIC8vQ2hhbmdlIHRpbWVySWQgZm9yIGJyZWFraW5nIHJlZnJlc2ggcHJvY2VzcyBpbiBuZXh0IHNldFRpbWVvdXQgY2FsbC4gZGtsaW1hbm92XHJcbiAgICB0aGlzLmFjdGl2ZVRpbWVySWQtLTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdGlja1RpbWVyRnVuY3Rpb24odGltZXJJZDogbnVtYmVyKSB7XHJcbiAgICBpZiAodGltZXJJZCAhPT0gdGhpcy5hY3RpdmVUaW1lcklkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG4gICAgLy9AdHMtaWdub3JlXHJcbiAgICBsZXQgdGltZVRvVXBkYXRlOiBudW1iZXIgPSB0aGlzLmN1cnJlbnRJbnRlcnZhbCAtIChuZXcgRGF0ZSgpIC0gdGhpcy5sYXN0U3RhdGVDaGVja2VkKTtcclxuICAgIGlmICh0aW1lVG9VcGRhdGUgPD0gMCkge1xyXG4gICAgICB0aW1lVG9VcGRhdGUgPSB0aGlzLmN1cnJlbnRJbnRlcnZhbCArIDk5OTtcclxuICAgICAgdGhpcy5jYWxsYmFjaygpO1xyXG4gICAgICB0aGlzLmxhc3RTdGF0ZUNoZWNrZWQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZWxhcHNlZENhbGxiYWNrKHRpbWVUb1VwZGF0ZSk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnRpY2tUaW1lckZ1bmN0aW9uKHRpbWVySWQpLCB1cGRhdGVUaW1lb3V0KTtcclxuICB9XHJcbn1cclxuIiwgImltcG9ydCBSZWZyZXNoQ29tcG9uZW50IGZyb20gJy4vSW5kZXgnO1xyXG5cclxuY29uc3QgZGVmYXVsdFJlZnJlc2hFbnRyaWVzOiBJUmVmcmVzaEVudHJ5W10gPSBbe1xyXG4gIHRpbWVvdXQ6IDAsXHJcbiAgdGV4dDogJ3JlZnJlc2ggbm93JyxcclxuICByZWZyZXNoVGVtcGxhdGU6ICcnLFxyXG59LCB7XHJcbiAgdGltZW91dDogMTUgKiAxMDAwLFxyXG4gIHRleHQ6ICcxNSBzZWMnLFxyXG4gIHJlZnJlc2hUZW1wbGF0ZTogJ0F1dG8gVXBkYXRlICglKScsXHJcbn0sIHtcclxuICB0aW1lb3V0OiAzMCAqIDEwMDAsXHJcbiAgdGV4dDogJzMwIHNlYycsXHJcbiAgcmVmcmVzaFRlbXBsYXRlOiAnQXV0byBVcGRhdGUgKCUpJyxcclxufSwge1xyXG4gIHRpbWVvdXQ6IDYwICogMTAwMCxcclxuICB0ZXh0OiAnMSBtaW4nLFxyXG4gIHJlZnJlc2hUZW1wbGF0ZTogJ0F1dG8gVXBkYXRlICglKScsXHJcbn0sIHtcclxuICB0aW1lb3V0OiAxODAgKiAxMDAwLFxyXG4gIHRleHQ6ICczIG1pbicsXHJcbiAgcmVmcmVzaFRlbXBsYXRlOiAnQXV0byBVcGRhdGUgKCUpJyxcclxufSwge1xyXG4gIHRpbWVvdXQ6IDMwMCAqIDEwMDAsXHJcbiAgdGV4dDogJzUgbWluJyxcclxuICByZWZyZXNoVGVtcGxhdGU6ICdBdXRvIFVwZGF0ZSAoJSknLFxyXG59LCB7XHJcbiAgdGltZW91dDogNjAwICogMTAwMCxcclxuICB0ZXh0OiAnMTAgbWluJyxcclxuICByZWZyZXNoVGVtcGxhdGU6ICdBdXRvIFVwZGF0ZSAoJSknLFxyXG59LCB7XHJcbiAgdGltZW91dDogLTEsXHJcbiAgdGV4dDogJ29mZicsXHJcbiAgcmVmcmVzaFRlbXBsYXRlOiAnQXV0byBVcGRhdGU6IG9mZicsXHJcbiAgaXNEZWZhdWx0OiB0cnVlXHJcbn1dO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUmVmcmVzaEVudHJ5IHtcclxuICB0aW1lb3V0OiBudW1iZXIsXHJcbiAgdGV4dDogc3RyaW5nLFxyXG4gIHJlZnJlc2hUZW1wbGF0ZTogc3RyaW5nLFxyXG4gIGlzRGVmYXVsdD86IGJvb2xlYW5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVmcmVzaEJ1dHRvbiB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkcm9wRG93bkJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRleHRNZW51OiBEZXZFeHByZXNzLnVpLmR4Q29udGV4dE1lbnU7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZWZyZXNoQ29tcG9uZW50OiBSZWZyZXNoQ29tcG9uZW50O1xyXG4gIHByaXZhdGUgbWVudUlzT3BlbmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBzZWxlY3RlZEVudHJ5OiBJUmVmcmVzaEVudHJ5O1xyXG5cclxuICBjb25zdHJ1Y3RvcigkdGFyZ2V0OiBKUXVlcnksIGNhbGxiYWNrOiAoKSA9PiB2b2lkLCByZWZyZXNoRW50cmllczogSVJlZnJlc2hFbnRyeVtdIHwgbnVsbCA9IGRlZmF1bHRSZWZyZXNoRW50cmllcykge1xyXG4gICAgdGhpcy5yZWZyZXNoQ29tcG9uZW50ID0gbmV3IFJlZnJlc2hDb21wb25lbnQoeyBjYWxsYmFjaywgZWxhcHNlZENhbGxiYWNrOiAoZSkgPT4gdGhpcy5lbGFwc2VkQ2FsbGJhY2soZSkgfSk7XHJcbiAgICB0aGlzLnNlbGVjdGVkRW50cnkgPSByZWZyZXNoRW50cmllcy5maW5kKChlKSA9PiBlLmlzRGVmYXVsdCkgfHwgcmVmcmVzaEVudHJpZXMuZmlsdGVyKChlKSA9PiAhIWUudGltZW91dClbMF07XHJcblxyXG4gICAgdGhpcy5jb250ZXh0TWVudSA9ICQoJzxkaXYgLz4nKS5keENvbnRleHRNZW51KHtcclxuICAgICAgZGF0YVNvdXJjZTogcmVmcmVzaEVudHJpZXMsXHJcbiAgICAgIHRhcmdldDogJHRhcmdldCxcclxuICAgICAgcG9zaXRpb246IHsgbXk6ICdyaWdodCB0b3AnLCBhdDogJ3JpZ2h0IGJvdHRvbScgfSxcclxuICAgICAgb25JdGVtQ2xpY2s6IChlKSA9PiB7XHJcbiAgICAgICAgaWYoIShlLml0ZW1EYXRhIGFzIGFueSkudGltZW91dCkge1xyXG4gICAgICAgICAgZS5jb21wb25lbnQuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFbnRyeSA9IGUuaXRlbURhdGEgYXMgSVJlZnJlc2hFbnRyeTtcclxuICAgICAgICAgIGUuY29tcG9uZW50LnNlbGVjdEl0ZW0odGhpcy5zZWxlY3RlZEVudHJ5IGFzIGFueSk7XHJcbiAgICAgICAgICB0aGlzLnJlZnJlc2hDb21wb25lbnQuc3RhcnQoKGUuaXRlbURhdGEgYXMgYW55KS50aW1lb3V0KTtcclxuICAgICAgICAgIGUuY29tcG9uZW50LmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uSGlkZGVuOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tZW51SXNPcGVuZWQgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgICAgb25TaG93bjogKGUpID0+IHtcclxuICAgICAgICB0aGlzLm1lbnVJc09wZW5lZCA9IHRydWU7XHJcbiAgICAgICAgKGUuY29tcG9uZW50IGFzIGFueSkuaXRlbXNDb250YWluZXIoKVswXS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2lzem9sZWEtdGhlbWUnKTtcclxuICAgICAgfSxcclxuICAgICAgaXRlbVRlbXBsYXRlOiAoZW50cnkpID0+IGVudHJ5LnRleHQsXHJcblxyXG4gICAgICBjc3NDbGFzczogJ2lzem9sZWEtdGhlbWUnXHJcbiAgICB9KS5hcHBlbmRUbygnYm9keScpLmR4Q29udGV4dE1lbnUoJ2luc3RhbmNlJyk7XHJcbiAgICB0aGlzLmNvbnRleHRNZW51LnNlbGVjdEl0ZW0odGhpcy5zZWxlY3RlZEVudHJ5IGFzIGFueSk7XHJcblxyXG4gICAgdGhpcy5kcm9wRG93bkJ1dHRvbiA9ICR0YXJnZXQuZHhCdXR0b24oe1xyXG4gICAgICB0ZXh0OiB0aGlzLnNlbGVjdGVkRW50cnkudGV4dCxcclxuICAgICAgdGVtcGxhdGU6IChidXR0b25EYXRhLCBjb250ZW50KSA9PiB7XHJcbiAgICAgICAgJCgnPGkgLz4nKS5hZGRDbGFzcygnZHgtaWNvbiBkeC1pY29uLXJlZnJlc2gnKS5hcHBlbmRUbyhjb250ZW50KTtcclxuICAgICAgICAkKCc8c3Bhbj4nKS5hZGRDbGFzcygnYnV0dG9uLXdpdGgtZXhwYW5kLXRleHQnKS50ZXh0KGJ1dHRvbkRhdGEudGV4dCkuYXBwZW5kVG8oY29udGVudCk7XHJcbiAgICAgICAgJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ2J1dHRvbi13aXRoLWV4cGFuZC1pY29uIGlzb3otaWNvbi0xNiBpc296LWljb24tYXJyb3ctZG93bi0xNicpLmFwcGVuZFRvKGNvbnRlbnQpO1xyXG5cclxuICAgICAgICByZXR1cm4gY29udGVudDtcclxuICAgICAgfSxcclxuICAgICAgZWxlbWVudEF0dHI6IHtcclxuICAgICAgICBjbGFzczogJ2lzem9sZWEtbWQgYnV0dG9uLXdpdGgtZXhwYW5kJ1xyXG4gICAgICB9LFxyXG5cclxuICAgICAgb25DbGljazogKGUpID0+IHtcclxuICAgICAgICB0aGlzLmNvbnRleHRNZW51LmVsZW1lbnQoKS53aWR0aCgkdGFyZ2V0Lm91dGVyV2lkdGgoKSk7XHJcbiAgICAgICAgaWYgKHRoaXMubWVudUlzT3BlbmVkKSB7XHJcbiAgICAgICAgICB0aGlzLmNvbnRleHRNZW51LmhpZGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5jb250ZXh0TWVudS5zaG93KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KS5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuXHJcbiAgICAodGhpcy5zZWxlY3RlZEVudHJ5LnRpbWVvdXQgPiAwKSAmJiB0aGlzLnJlZnJlc2hDb21wb25lbnQuc3RhcnQodGhpcy5zZWxlY3RlZEVudHJ5LnRpbWVvdXQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlZnJlc2hDb21wb25lbnQudHJpZ2dlckNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbGFwc2VkQ2FsbGJhY2sodGltZVRvVXBkYXRlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuZHJvcERvd25CdXR0b24ub3B0aW9uKCd0ZXh0JywgdGhpcy5zZWxlY3RlZEVudHJ5LnJlZnJlc2hUZW1wbGF0ZS5yZXBsYWNlKCclJywgTWF0aC5mbG9vcih0aW1lVG9VcGRhdGUgLyAxMDAwKS50b1N0cmluZygpKSk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgZ3JpZENvbHVtblR5cGVzIGZyb20gJy4uLy4uL0J1c2luZXNzL0dyaWRDb2x1bW5UeXBlcyc7XHJcbmltcG9ydCB7aW5pdFBvcG92ZXJ9IGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVwb3J0RGV0YWlsc1BvcG92ZXInO1xyXG5pbXBvcnQge0lHcmlkUmVwb3J0UGFyYW1zLCBJUmVwb3J0UGFyYW1zfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IEdSSURfSU5ESUNBVE9SX1NUQVRFIGZyb20gJy4vR3JpZEluZGljYXRvclN0YXRlJztcclxuaW1wb3J0IGRlZmF1bHRHcmlkIGZyb20gJy4uLy4uLy4uL1dpZGdldHMvR3JpZC9EZWZhdWx0R3JpZCc7XHJcbmltcG9ydCBHcmlkU3RhdGVNYW5hZ2VyIGZyb20gJy4vR3JpZFN0YXRlTWFuYWdlcic7XHJcbmltcG9ydCBHcmlkTW9kZSBmcm9tICcuL01vZGUnO1xyXG5pbXBvcnQge2NyZWF0ZUdyaWREYXRhTGF5ZXIsIElHcmlkRGF0YUxheWVyfSBmcm9tICcuLi8uLi9EYXRhL0luZGV4JztcclxuaW1wb3J0IHtHcmlkRGF0YUNvbHVtbkRhdGFUeXBlLCBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZSwgSUdyaWRTdGF0ZX0gZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9JR3JpZFN0YXRlJztcclxuaW1wb3J0IHtJUmVwb3J0Q29tcG9uZW50fSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcclxuaW1wb3J0IFJlZnJlc2hCdXR0b24gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZWZyZXNoVGltZXIvQnV0dG9uJztcclxuXHJcbmNvbnN0IFJFU0VUX1NBVkVEX0lORElDQVRPUl9USU1FT1VUID0gMzAwMDtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRPcHRpb25zIHtcclxuICBncmlkUG9zaXRpb25NYXJrZXI6IEpRdWVyeTtcclxuICByZXBvcnRQYXJhbXM6IElHcmlkUmVwb3J0UGFyYW1zO1xyXG4gIGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBhZGRSZWZyZXNoQnV0dG9uOiBib29sZWFuO1xyXG4gIGdyaWRSZXBvcnRDb250cm9sbGVyVXJsOiBzdHJpbmc7XHJcbiAgc2hvd0hlYWRlcj86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdyaWQgaW1wbGVtZW50cyBJUmVwb3J0Q29tcG9uZW50IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWRQb3NpdGlvbk1hcmtlcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVwb3J0UGFyYW1zOiBJR3JpZFJlcG9ydFBhcmFtcztcclxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWRSZXBvcnRDb250cm9sbGVyVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93SGVhZGVyOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxuXHJcbiAgcHJpdmF0ZSBjdXJyZW50R3JpZE1vZGU6IEdyaWRNb2RlIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzaG93QWxsRGF0YUluRWRpdCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgbG9hZGluZ1RpbWVvdXQgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgcG9wb3ZlcjogRGV2RXhwcmVzcy51aS5keFBvcG92ZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBncmlkU3RhdGVNYW5hZ2VyOiBHcmlkU3RhdGVNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSAkZ3JpZFN0YXRlSW5kaWNhdG9yOiBKUXVlcnkgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlICRncmlkRXJyb3JQbGFjZWhvbGRlcjogSlF1ZXJ5IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSAkZ3JpZFRhcmdldEVsZW1lbnQ6IEpRdWVyeSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgJHJlc2V0U2V0dGluZ1RhcmdldEVsZW1lbnQ6IEpRdWVyeSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgZ3JpZFN0YXRlSW5kaWNhdG9yVGltZW91dDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBkYXRhTGF5ZXI6IElHcmlkRGF0YUxheWVyO1xyXG4gIHByaXZhdGUgZWRpdFdpZHRoRWRpdEJveGVzOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveFtdIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgZ3JpZFJlcGFpbnRRdWV1ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIGNvbHVtbk5hbWVzVXBkYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcmVmcmVzaEJ1dHRvbjogUmVmcmVzaEJ1dHRvbiB8IG51bGwgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJR3JpZE9wdGlvbnMpIHtcclxuICAgIHRoaXMuZ3JpZFBvc2l0aW9uTWFya2VyID0gb3B0aW9ucy5ncmlkUG9zaXRpb25NYXJrZXI7XHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy5hbGxvd0VkaXRpbmcgPSBvcHRpb25zLmFsbG93RWRpdGluZztcclxuICAgIHRoaXMuYWRkUmVmcmVzaEJ1dHRvbiA9IG9wdGlvbnMuYWRkUmVmcmVzaEJ1dHRvbjtcclxuICAgIHRoaXMuZ3JpZFJlcG9ydENvbnRyb2xsZXJVcmwgPSBvcHRpb25zLmdyaWRSZXBvcnRDb250cm9sbGVyVXJsO1xyXG4gICAgdGhpcy5zaG93SGVhZGVyID0gb3B0aW9ucy5zaG93SGVhZGVyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuY3VycmVudEdyaWRNb2RlKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudEdyaWRNb2RlID0gR3JpZE1vZGUuVmlldztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmluaXRJbnRlcm5hbCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgICB0aGlzLmdyaWQ/LnJlZnJlc2goKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncmlkPy5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLmdyaWQgPSBudWxsO1xyXG5cclxuICAgIHRoaXMuY3VycmVudEdyaWRNb2RlID0gbnVsbDtcclxuICAgIHRoaXMuJHJlc2V0U2V0dGluZ1RhcmdldEVsZW1lbnQ/LnJlbW92ZSgpO1xyXG4gICAgdGhpcy4kZ3JpZFRhcmdldEVsZW1lbnQ/LnJlbW92ZSgpO1xyXG5cclxuICAgIHRoaXMucG9wb3Zlcj8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5wb3BvdmVyID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdEludGVybmFsKCk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgICB0aGlzLmRhdGFMYXllciA9IGNyZWF0ZUdyaWREYXRhTGF5ZXIodGhpcy5ncmlkUmVwb3J0Q29udHJvbGxlclVybCk7XHJcblxyXG4gICAgaWYgKHRoaXMuJGdyaWRUYXJnZXRFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuJGdyaWRUYXJnZXRFbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuJGdyaWRUYXJnZXRFbGVtZW50ID0gJCgnPGRpdiAvPicpLmluc2VydEFmdGVyKHRoaXMuZ3JpZFBvc2l0aW9uTWFya2VyKTtcclxuXHJcbiAgICB0aGlzLmdyaWRTdGF0ZU1hbmFnZXIgPSBuZXcgR3JpZFN0YXRlTWFuYWdlcih0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZCwgdGhpcy5kYXRhTGF5ZXIpO1xyXG5cclxuICAgIHRoaXMuJGdyaWRFcnJvclBsYWNlaG9sZGVyID0gJCgnPGRpdiAvPicpLnRleHQoJ0RhdGEgbG9hZGluZyBmYWlsZWQuJykuYWRkQ2xhc3MoJ2R4LWRhdGFncmlkLW5vZGF0YScpLmNzcyh7IHpJbmRleDogMSB9KTtcclxuICAgIHRoaXMuJGdyaWRFcnJvclBsYWNlaG9sZGVyLmFwcGVuZFRvKHRoaXMuZ3JpZFBvc2l0aW9uTWFya2VyKTtcclxuICAgIHRoaXMuJGdyaWRFcnJvclBsYWNlaG9sZGVyLmhpZGUoKTtcclxuXHJcbiAgICBpZiAodGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscykge1xyXG4gICAgICAvLyBUT0RPOiBlbGVtZW50IHNlbGVjdG9yIGFzIGEgcGFyYW1cclxuICAgICAgdGhpcy5wb3BvdmVyID0gaW5pdFBvcG92ZXIoJy5yZXBvcnQtZGV0YWlscy1saW5rJywgdGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lZGl0V2lkdGhFZGl0Qm94ZXMgPSBbXTtcclxuICAgIGNvbnN0IGdyaWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zID0ge1xyXG4gICAgICBkYXRhU291cmNlOiB0aGlzLmNyZWF0ZURhdGFTb3VyY2UodGhpcy5yZXBvcnRQYXJhbXMsIHRoaXMuY3VycmVudEdyaWRNb2RlLCB0aGlzLnNob3dBbGxEYXRhSW5FZGl0KSxcclxuICAgICAgZWxlbWVudEF0dHI6IHsgY2xhc3M6IHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5FZGl0ID8gJ2VkaXQtbW9kZScgOiAndmlldy1tb2RlJyB9LFxyXG4gICAgICByZXBhaW50Q2hhbmdlc09ubHk6IHRydWUsXHJcbiAgICAgIG9uVG9vbGJhclByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgICBjb25zdCBpdGVtcyA9IGUudG9vbGJhck9wdGlvbnMuaXRlbXM7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuVmlldyAmJiB0aGlzLmFsbG93RWRpdGluZykge1xyXG4gICAgICAgICAgY29uc3Qgc2VhcmNoUGFuZWwgPSBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gJ3NlYXJjaFBhbmVsJylbMF07XHJcbiAgICAgICAgICBjb25zdCBzZWFyY2hQYW5lbEluZGV4ID0gaXRlbXMuaW5kZXhPZihzZWFyY2hQYW5lbCk7XHJcblxyXG4gICAgICAgICAgY29uc3Qgc3dpdGNoVG9FZGl0QnRuID0ge1xyXG4gICAgICAgICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgICAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ1N3aXRjaCB0byBFZGl0IE1vZGUnLFxyXG4gICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHRoaXMuc3dpdGNoVG9Nb2RlKEdyaWRNb2RlLkVkaXQpLFxyXG4gICAgICAgICAgICAgIGljb246ICdzd2l0Y2gtdG8tZWRpdC1tb2RlJyxcclxuICAgICAgICAgICAgICBlbGVtZW50QXR0cjoge2NsYXNzOiAnaXN6b2xlYS1tZCd9XHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtO1xyXG5cclxuICAgICAgICAgIGl0ZW1zLnNwbGljZShzZWFyY2hQYW5lbEluZGV4LCAxKTtcclxuICAgICAgICAgIGl0ZW1zLnB1c2goc3dpdGNoVG9FZGl0QnRuKTtcclxuICAgICAgICAgIGl0ZW1zLnB1c2goc2VhcmNoUGFuZWwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5FZGl0KSB7XHJcbiAgICAgICAgICBjb25zdCBjb2x1bW5DaG9vc2VyQnRuID0gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdjb2x1bW5DaG9vc2VyQnV0dG9uJylbMF07XHJcbiAgICAgICAgICBjb25zdCBjb2x1bW50Q2hvb3NlckJ0bkluZGV4ID0gaXRlbXMuaW5kZXhPZihjb2x1bW5DaG9vc2VyQnRuKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBzaG93RGF0YUl0ZW0gPSB7XHJcbiAgICAgICAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0ICRjb250YWluZXIgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgICAgIC5jc3Moe1xyXG4gICAgICAgICAgICAgICAgICBib3JkZXI6ICcxcHggI2UwZTBlMCBzb2xpZCcsXHJcbiAgICAgICAgICAgICAgICAgIHBhZGRpbmc6ICczcHggNnB4JyxcclxuICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnNHB4JyxcclxuICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJ3doaXRlJyxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAkKCc8c3BhbiAvPicpXHJcbiAgICAgICAgICAgICAgICAuY3NzKHsgbWFyZ2luOiAnMCA1cHggMCAwJywgd2lkdGg6ICc1NHB4JyB9KVxyXG4gICAgICAgICAgICAgICAgLmR4U3dpdGNoKHtcclxuICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuc2hvd0FsbERhdGFJbkVkaXQsXHJcbiAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoeyB2YWx1ZSB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93QWxsRGF0YUluRWRpdCA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnLCB0aGlzLmNyZWF0ZURhdGFTb3VyY2UodGhpcy5yZXBvcnRQYXJhbXMsIHRoaXMuY3VycmVudEdyaWRNb2RlLCB0aGlzLnNob3dBbGxEYXRhSW5FZGl0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkLnJlZnJlc2goKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgJCgnPHNwYW4gLz4nKS50ZXh0KCdTaG93IGFsbCBkYXRhICcpLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgICBjb25zdCAkaGludFRhcmdldCA9ICQoJzxhIC8+JylcclxuICAgICAgICAgICAgICAgIC5jc3MoeyB0ZXh0RGVjb3JhdGlvbjogJ3VuZGVybGluZScsIGNvbG9yOiAnYmx1ZScgfSlcclxuICAgICAgICAgICAgICAgIC50ZXh0KCcoPyknKVxyXG4gICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgICAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgICAgIC50ZXh0KGBJZiB0aGUgdGFibGUgY29udGFpbnMgYSBsb3Qgb2YgY29sdW1ucyBzaG93aW5nIGFsbCBkYXRhIGNhbiBsZWFkIHRvIHNsb3cgcGFnZSBwZXJmb3JtYW5jZSB3aGVuIHlvdSdyZSBlZGl0aW5nIHRoZSBncmlkLlxyXG5CeSBkZWZhdWx0IGdyaWQgc2hvd3Mgb25seSBmaXJzdCAxMCByb3dzIGluIHRoZSBFZGl0IG1vZGUuYClcclxuICAgICAgICAgICAgICAgIC5keFBvcG92ZXIoe1xyXG4gICAgICAgICAgICAgICAgICB0YXJnZXQ6ICRoaW50VGFyZ2V0LFxyXG4gICAgICAgICAgICAgICAgICBzaG93RXZlbnQ6ICdtb3VzZWVudGVyJyxcclxuICAgICAgICAgICAgICAgICAgaGlkZUV2ZW50OiAnbW91c2VsZWF2ZScsXHJcbiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAndG9wJyxcclxuICAgICAgICAgICAgICAgICAgd2lkdGg6IDUwMFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuICRjb250YWluZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtO1xyXG5cclxuICAgICAgICAgIGNvbnN0IHN3aXRjaFRvVmlld0J0biA9IHtcclxuICAgICAgICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdTd2l0Y2ggdG8gVmlldyBNb2RlJyxcclxuICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB0aGlzLnN3aXRjaFRvTW9kZShHcmlkTW9kZS5WaWV3KSxcclxuICAgICAgICAgICAgICBpY29uOiAnc3dpdGNoLXRvLXZpZXctbW9kZScsXHJcbiAgICAgICAgICAgICAgZWxlbWVudEF0dHI6IHtjbGFzczogJ2lzem9sZWEtbWQnfVxyXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbTtcclxuXHJcbiAgICAgICAgICBpdGVtcy5zcGxpY2UoY29sdW1udENob29zZXJCdG5JbmRleCwgMSk7XHJcblxyXG4gICAgICAgICAgY29uc3QgZXhwb3J0QnRuID0gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdleHBvcnRCdXR0b24nKVswXTtcclxuICAgICAgICAgIGNvbnN0IGV4cG9ydEJ0bkluZGV4ID0gaXRlbXMuaW5kZXhPZihleHBvcnRCdG4pO1xyXG5cclxuICAgICAgICAgIGl0ZW1zLnNwbGljZShleHBvcnRCdG5JbmRleCwgMSk7XHJcblxyXG4gICAgICAgICAgaXRlbXMucHVzaChzaG93RGF0YUl0ZW0pO1xyXG4gICAgICAgICAgaXRlbXMucHVzaChzd2l0Y2hUb1ZpZXdCdG4pO1xyXG4gICAgICAgICAgaXRlbXMucHVzaChjb2x1bW5DaG9vc2VyQnRuKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBlZGl0U3RhdHVzID0ge1xyXG4gICAgICAgICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy4kZ3JpZFN0YXRlSW5kaWNhdG9yID0gJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2VkaXQtZ3JpZC1zdGF0ZScpO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUdyaWRTdGF0ZUluZGljYXRvcihHUklEX0lORElDQVRPUl9TVEFURS5lZGl0KTtcclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGdyaWRTdGF0ZUluZGljYXRvcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW07XHJcblxyXG4gICAgICAgICAgaXRlbXMudW5zaGlmdChlZGl0U3RhdHVzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFkZFJlZnJlc2hCdXR0b24pIHtcclxuICAgICAgICAgIGNvbnN0IHJlZnJlc2hCdG4gPSBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gJ3JlZnJlc2gnKVswXTtcclxuICAgICAgICAgIGNvbnN0IHJlZnJlc2hCdG5JbmRleCA9IGl0ZW1zLmluZGV4T2YocmVmcmVzaEJ0bik7XHJcblxyXG4gICAgICAgICAgaXRlbXNbcmVmcmVzaEJ0bkluZGV4XSA9IHtcclxuICAgICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgJGNvbnRhaW5lciA9ICQoJzxkaXYgLz4nKTtcclxuICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hCdXR0b24gPSBuZXcgUmVmcmVzaEJ1dHRvbigkY29udGFpbmVyLCAoKSA9PiB0aGlzLnJlZnJlc2goKSk7XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiAkY29udGFpbmVyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uQ2VsbFByZXBhcmVkOiAoeyByb3dUeXBlLCBjb2x1bW4sIGNlbGxFbGVtZW50IH0pID0+IHtcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIGlmIChyb3dUeXBlID09PSAnaGVhZGVyJyAmJiAhY29sdW1uLmNvbW1hbmQpIHtcclxuICAgICAgICAgIGNvbnN0IGRhdGFGaWVsZCA9IGNvbHVtbi5kYXRhRmllbGQ7XHJcbiAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsU2V0dGluZ3MgPSB0aGlzLmdyaWRTdGF0ZU1hbmFnZXIuZ2V0Q29sdW1uQWRkaXRpb25hbFNldHRpbmdzKGRhdGFGaWVsZCk7XHJcblxyXG4gICAgICAgICAgdGhpcy5pbml0R3JpZEhlYWRlckNlbGwoY2VsbEVsZW1lbnQsIGFkZGl0aW9uYWxTZXR0aW5ncyk7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5FZGl0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdEdyaWRIZWFkZXJDZWxsRWRpdFBhbmVsKGNvbHVtbiwgY2VsbEVsZW1lbnQsIGFkZGl0aW9uYWxTZXR0aW5ncyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG5cclxuICAgICAgb25Db250ZW50UmVhZHk6IChlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY3VycmVudEdyaWQgPSBlLmNvbXBvbmVudDtcclxuICAgICAgICBjb25zdCBjdXJyZW50U3RhdGU6IElHcmlkU3RhdGUgPSBjdXJyZW50R3JpZC5zdGF0ZSgpO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuY29sdW1uTmFtZXNVcGRhdGVkKSB7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbk5hbWluZyhjdXJyZW50U3RhdGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBOT1RFOiBjb2x1bW4gbmFtZSB1cGRhdGluZyB0cmlnZ2VycyBvbkNvbnRlbnRSZWFkeSBldmVudCByYWlzaW5nIGFnYWluLlxyXG4gICAgICAgICAgLy8gV2UgbmVlZCBub3QgdG8gZXhldWN1dGUgdGhlIHNhbWUgb25lIG1vcmUgdGltZS5cclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IGN1cnJlbnRHcmlkLmVuZEN1c3RvbUxvYWRpbmcoKSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRHcmlkTW9kZSAhPT0gR3JpZE1vZGUuRWRpdCkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbmV3Q29sdW1ucyA9IHRoaXMuZ3JpZFN0YXRlTWFuYWdlci5jaGVja05ld0NvbHVtbnMoY3VycmVudFN0YXRlKTtcclxuXHJcbiAgICAgICAgbmV3Q29sdW1ucy5mb3JFYWNoKChjb2x1bW5OYW1lKSA9PiBlLmNvbXBvbmVudC5jb2x1bW5PcHRpb24oY29sdW1uTmFtZSwgJ3Zpc2libGUnLCBmYWxzZSkpO1xyXG5cclxuICAgICAgICBjb25zdCBjb2x1bW5DYXB0aW9ucyA9IHRoaXMuZ3JpZFN0YXRlTWFuYWdlci5nZXRDb2x1bW5DYXB0aW9ucygpO1xyXG5cclxuICAgICAgICBjb2x1bW5DYXB0aW9ucy5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgICBpZiAoYy5jYXB0aW9uICYmIGN1cnJlbnRHcmlkLmNvbHVtbk9wdGlvbihjLmRhdGFGaWVsZCwgJ2NhcHRpb24nKSAhPT0gYy5jYXB0aW9uKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRHcmlkLmNvbHVtbk9wdGlvbihjLmRhdGFGaWVsZCwgJ2NhcHRpb24nLCBjLmNhcHRpb24pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9LFxyXG4gICAgICBzdGF0ZVN0b3Jpbmc6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIHR5cGU6ICdjdXN0b20nLFxyXG4gICAgICAgIGN1c3RvbUxvYWQ6ICgpID0+IHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmdyaWRTdGF0ZU1hbmFnZXIubG9hZCh0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuRWRpdCwgKG91dGRhdGVkQ29sdW1ucykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ3JpZC5zdGF0ZSgpO1xyXG5cclxuICAgICAgICAgICAgc3RhdGUuY29sdW1ucyA9IChzdGF0ZS5jb2x1bW5zIGFzIGFueVtdKS5maWx0ZXIoKGNvbHVtbikgPT4gb3V0ZGF0ZWRDb2x1bW5zLmluZGV4T2YoY29sdW1uLmRhdGFGaWVsZCkgPCAwKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZC5zdGF0ZShzdGF0ZSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGN1c3RvbVNhdmU6IChzdGF0ZSkgPT4gdGhpcy5zYXZlR3JpZFN0YXRlKHN0YXRlKVxyXG4gICAgICB9LFxyXG5cclxuICAgICAgZmlsdGVyUm93OiB7IHZpc2libGU6IHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5WaWV3LCBhcHBseUZpbHRlcjogJ29uQ2xpY2snIH0sXHJcbiAgICAgIGhlYWRlckZpbHRlcjogeyB2aXNpYmxlOiB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuVmlldyB9LFxyXG4gICAgICBzZWFyY2hQYW5lbDogeyB2aXNpYmxlOiB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuVmlldyB9LFxyXG4gICAgICBlcnJvclJvd0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBhbGxvd0NvbHVtblJlc2l6aW5nOiB0cnVlLFxyXG4gICAgICBzb3J0aW5nOiB7IG1vZGU6ICdtdWx0aXBsZScgfSxcclxuICAgICAgZ3JvdXBQYW5lbDogeyB2aXNpYmxlOiB0cnVlIH0sXHJcbiAgICAgIGdyb3VwaW5nOiB7IGF1dG9FeHBhbmRBbGw6IGZhbHNlIH0sXHJcbiAgICAgIGFsbG93Q29sdW1uUmVvcmRlcmluZzogdGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQsXHJcbiAgICAgIGNvbHVtbkNob29zZXI6IHsgZW5hYmxlZDogdGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQgfSxcclxuICAgICAgc2hvd0NvbHVtbkhlYWRlcnM6IHRydWUsXHJcbiAgICAgIGtleWJvYXJkTmF2aWdhdGlvbjoge2VuYWJsZWQ6IGZhbHNlfSxcclxuXHJcbiAgICAgIHNob3dCb3JkZXJzOiB0cnVlLFxyXG4gICAgICBwYWdpbmc6IHsgcGFnZVNpemU6IDUwLCBlbmFibGVkOiB0cnVlIH0sXHJcbiAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IHRydWUsXHJcblxyXG4gICAgICBzdW1tYXJ5OiB0aGlzLnJlcG9ydFBhcmFtcy5Ub3RhbFN1bW1hcnlDb2x1bW4gPyB7XHJcbiAgICAgICAgdG90YWxJdGVtczogW3tcclxuICAgICAgICAgIGNvbHVtbjogdGhpcy5yZXBvcnRQYXJhbXMuVG90YWxTdW1tYXJ5Q29sdW1uLFxyXG4gICAgICAgICAgc3VtbWFyeVR5cGU6ICdjb3VudCdcclxuICAgICAgICB9XVxyXG4gICAgICB9IDogdW5kZWZpbmVkLFxyXG5cclxuICAgICAgb25FZGl0b3JQcmVwYXJpbmcoZSkge1xyXG4gICAgICAgIGlmIChlLnBhcmVudFR5cGUgPT09ICdmaWx0ZXJSb3cnKSB7XHJcbiAgICAgICAgICBjb25zdCBhcHBseSA9ICgpID0+IGUuZWxlbWVudC5maW5kKCcuZHgtYXBwbHktYnV0dG9uJykudHJpZ2dlcignZHhjbGljaycpO1xyXG5cclxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vbkVudGVyS2V5ID0gYXBwbHk7XHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25Gb2N1c091dCA9IGFwcGx5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZS5wYXJlbnRUeXBlID09PSAnc2VhcmNoUGFuZWwnKSB7XHJcbiAgICAgICAgICBjb25zdCBhcHBseVNlYXJjaDogRGV2RXhwcmVzcy51aS5keFRleHRFZGl0b3IuUHJvcGVydGllc1snb25FbnRlcktleSddID0gKGFyZ3MpID0+IHtcclxuICAgICAgICAgICAgZS5jb21wb25lbnQuc2VhcmNoQnlUZXh0KGFyZ3MuY29tcG9uZW50Lm9wdGlvbigndmFsdWUnKSk7XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vbkVudGVyS2V5ID0gYXBwbHlTZWFyY2g7XHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25Gb2N1c091dCA9IGFwcGx5U2VhcmNoO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmdyaWQgPSBkZWZhdWx0R3JpZCh0aGlzLiRncmlkVGFyZ2V0RWxlbWVudCwge1xyXG4gICAgICBvcHRpb25zOiBncmlkT3B0aW9ucyxcclxuICAgICAgZXhwb3J0RmlsZU5hbWU6IHRoaXMucmVwb3J0UGFyYW1zLk5hbWUsXHJcbiAgICAgIHRpdGxlOiB0aGlzLnNob3dIZWFkZXIgPyB0aGlzLnJlcG9ydFBhcmFtcy5OYW1lIDogbnVsbCxcclxuICAgICAgaGVhZGVyRGVzY3JpcHRpb246IHRoaXMuc2hvd0hlYWRlciA/IHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMgOiBudWxsXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLiRyZXNldFNldHRpbmdUYXJnZXRFbGVtZW50Py5yZW1vdmUoKTtcclxuXHJcbiAgICBpZiAodGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQpIHtcclxuICAgICAgdGhpcy4kcmVzZXRTZXR0aW5nVGFyZ2V0RWxlbWVudCA9ICQoJzxzcGFuIC8+JylcclxuICAgICAgICAuY3NzKHtcclxuICAgICAgICAgIGZsb2F0OiAncmlnaHQnLFxyXG4gICAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXHJcbiAgICAgICAgICBib3R0b206ICc4cHgnXHJcbiAgICAgICAgfSlcclxuICAgICAgICAuYWRkQ2xhc3MoJ2lzem9sZWEtbWQnKVxyXG4gICAgICAgIC5keEJ1dHRvbih7XHJcbiAgICAgICAgICB0ZXh0OiAnUmVzZXQgc2V0dGluZ3MnLFxyXG4gICAgICAgICAgb25DbGljazogKCkgPT4gdGhpcy5yZXNldFNldHRpbmdzKCksXHJcbiAgICAgICAgICBpY29uOiAncmVzZXQtZ3JpZC1zZXR0aW5ncydcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5hcHBlbmRUbygnZm9vdGVyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlR3JpZFN0YXRlSW5kaWNhdG9yKHN0YXRlOiBzdHJpbmcpIHtcclxuICAgIE9iamVjdC5rZXlzKEdSSURfSU5ESUNBVE9SX1NUQVRFKS5mb3JFYWNoKChzKSA9PiB0aGlzLiRncmlkU3RhdGVJbmRpY2F0b3IucmVtb3ZlQ2xhc3MoR1JJRF9JTkRJQ0FUT1JfU1RBVEVbc10pKTtcclxuXHJcbiAgICB0aGlzLiRncmlkU3RhdGVJbmRpY2F0b3IuYWRkQ2xhc3Moc3RhdGUpO1xyXG5cclxuICAgIGlmICh0aGlzLmdyaWRTdGF0ZUluZGljYXRvclRpbWVvdXQpIHtcclxuICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLmdyaWRTdGF0ZUluZGljYXRvclRpbWVvdXQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdGF0ZSA9PT0gR1JJRF9JTkRJQ0FUT1JfU1RBVEUuc2F2ZWQpIHtcclxuICAgICAgdGhpcy5ncmlkU3RhdGVJbmRpY2F0b3JUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMudXBkYXRlR3JpZFN0YXRlSW5kaWNhdG9yKEdSSURfSU5ESUNBVE9SX1NUQVRFLmVkaXQpO1xyXG4gICAgICB9LCBSRVNFVF9TQVZFRF9JTkRJQ0FUT1JfVElNRU9VVCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHRpdGxlID0gJyc7XHJcblxyXG4gICAgc3dpdGNoIChzdGF0ZSkge1xyXG4gICAgICBjYXNlIEdSSURfSU5ESUNBVE9SX1NUQVRFLmVkaXQ6XHJcbiAgICAgICAgdGl0bGUgPSAnRWRpdCBtb2RlJztcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgR1JJRF9JTkRJQ0FUT1JfU1RBVEUuc2F2ZWQ6XHJcbiAgICAgICAgdGl0bGUgPSAnU2F2ZWQnO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBHUklEX0lORElDQVRPUl9TVEFURS5zYXZpbmc6XHJcbiAgICAgICAgdGl0bGUgPSAnU2F2aW5nJztcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLiRncmlkU3RhdGVJbmRpY2F0b3IuYXR0cigndGl0bGUnLCB0aXRsZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUNvbHVtbk5hbWluZyhzdGF0ZTogSUdyaWRTdGF0ZSkge1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAvLyBIQUNLOiBEZXZFeHRyZW1lIGdyaWQgZG9lc24ndCBzaG93IGNvbHVtbnMgZGF0YSBpZiBhIGRhdGFGaWVsZCBoYXMgc3BlY2lhbCBzeW1ib2xzLlxyXG4gICAgLy8gU2VlIGh0dHBzOi8vd3d3LmRldmV4cHJlc3MuY29tL1N1cHBvcnQvQ2VudGVyL1F1ZXN0aW9uL0RldGFpbHMvVDYyMTgzOC9keGRhdGFncmlkLWEtY29sdW1uLWlzLWVtcHR5LWlmLWRhdGFmaWVsZC1jb250YWlucy1zcGVjaWFsLWNoYXJhY3RlcnNcclxuICAgIC8vIHRzbGludDplbmFibGU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICBpZiAoc3RhdGUuY29sdW1ucykge1xyXG4gICAgICBzdGF0ZS5jb2x1bW5zLmZvckVhY2goKGMpID0+IHtcclxuICAgICAgICBpZiAoL1teYS16QS1aMC05X10vLnRlc3QoYy5kYXRhRmllbGQpKSB7XHJcbiAgICAgICAgICB0aGlzLmdyaWQuY29sdW1uT3B0aW9uKGMuZGF0YUZpZWxkLCAnY2FsY3VsYXRlQ2VsbFZhbHVlJywgKHJvd0RhdGEpID0+IHJvd0RhdGFbYy5kYXRhRmllbGRdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29sdW1uTmFtZXNVcGRhdGVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tc2hhZG93ZWQtdmFyaWFibGVcclxuICBwcml2YXRlIGNyZWF0ZURhdGFTb3VyY2UocmVwb3J0UGFyYW1zRGF0YVNvdXJjZTogSVJlcG9ydFBhcmFtcywgZ3JpZE1vZGU6IEdyaWRNb2RlLCBzaG93QWxsRGF0YUluRWRpdERhdGFTb3VyY2U6IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5kYXRhTGF5ZXIuZ2V0R3JpZERhdGFTb3VyY2UocmVwb3J0UGFyYW1zRGF0YVNvdXJjZSwgZ3JpZE1vZGUsIHNob3dBbGxEYXRhSW5FZGl0RGF0YVNvdXJjZSk7XHJcbiAgICBjb25zdCBkcyA9IG5ldyBEZXZFeHByZXNzLmRhdGEuRGF0YVNvdXJjZSh7XHJcbiAgICAgIHN0b3JlLFxyXG4gICAgICBvbkNoYW5nZWQ6IGdyaWRNb2RlID09PSBHcmlkTW9kZS5WaWV3ID8gdm9pZCAwIDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY29sdW1uTmFtZXNVcGRhdGVkID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uTG9hZEVycm9yOiAoZSkgPT4ge1xyXG4gICAgICAgIGlmICghZHMuaXNMb2FkZWQoKSkge1xyXG4gICAgICAgICAgdGhpcy4kZ3JpZEVycm9yUGxhY2Vob2xkZXIuc2hvdygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5ncmlkLmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuICAgICAgfSxcclxuICAgICAgb25Mb2FkaW5nQ2hhbmdlZDogKGlzTG9hZGluZykgPT4ge1xyXG4gICAgICAgIGlmIChpc0xvYWRpbmcpIHtcclxuICAgICAgICAgIHRoaXMuJGdyaWRFcnJvclBsYWNlaG9sZGVyLmhpZGUoKTtcclxuICAgICAgICAgIHRoaXMubG9hZGluZ1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLmdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdQbGVhc2Ugd2FpdCwgZGF0YSBsb2FkaW5nIGluIHByb2dyZXNzLicpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAxMDAwMCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmICh0aGlzLmxvYWRpbmdUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRpbmdUaW1lb3V0KTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nVGltZW91dCA9IG51bGw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmdyaWQuZW5kQ3VzdG9tTG9hZGluZygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGRzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldFNldHRpbmdzKCkge1xyXG4gICAgRGV2RXhwcmVzcy51aS5kaWFsb2cuY29uZmlybSgnUmVzZXQgZ3JpZCBzZXR0aW5ncyB0byBkZWZhdWx0IHZhbHVlcz8nLCAnUmVzZXQgdG8gZGVmYXVsdD8nKVxyXG4gICAgICAudGhlbigocmVzKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgICAgdGhpcy5ncmlkLmJlZ2luQ3VzdG9tTG9hZGluZygnTG9hZGluZycpO1xyXG4gICAgICAgICAgdGhpcy5ncmlkU3RhdGVNYW5hZ2VyXHJcbiAgICAgICAgICAgIC5yZXNldFNldHRpbmdzKClcclxuICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLmdyaWQuc3RhdGUoZGF0YSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncmlkLm9wdGlvbignZGF0YVNvdXJjZScsIHRoaXMuY3JlYXRlRGF0YVNvdXJjZSh0aGlzLnJlcG9ydFBhcmFtcywgdGhpcy5jdXJyZW50R3JpZE1vZGUsIHRoaXMuc2hvd0FsbERhdGFJbkVkaXQpKTtcclxuICAgICAgICAgICAgICB0aGlzLmdyaWQucmVmcmVzaCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzd2l0Y2hUb01vZGUobW9kZTogR3JpZE1vZGUpIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gbW9kZSB8fCBtb2RlID09PSBHcmlkTW9kZS5FZGl0ICYmICF0aGlzLmFsbG93RWRpdGluZykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jdXJyZW50R3JpZE1vZGUgPSBtb2RlO1xyXG5cclxuICAgIGNvbnN0IGN1cnJlbnRTdW1tYXJ5Q29sdW1uID0gdGhpcy5ncmlkLm9wdGlvbignc3VtbWFyeS50b3RhbEl0ZW1zWzBdLmNvbHVtbicpIGFzIHN0cmluZztcclxuXHJcbiAgICBjb25zdCBuZXdSZXBvcnRQYXJhbXMgPSB7XHJcbiAgICAgIC4uLnRoaXMucmVwb3J0UGFyYW1zLFxyXG4gICAgICBUb3RhbFN1bW1hcnlDb2x1bW46IGN1cnJlbnRTdW1tYXJ5Q29sdW1uID8gY3VycmVudFN1bW1hcnlDb2x1bW4gOiB0aGlzLnJlcG9ydFBhcmFtcy5Ub3RhbFN1bW1hcnlDb2x1bW5cclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5yZXBvcnRQYXJhbXMgPSBuZXdSZXBvcnRQYXJhbXM7XHJcblxyXG4gICAgdGhpcy5ncmlkLmRpc3Bvc2UoKTtcclxuICAgIHRoaXMuJGdyaWRUYXJnZXRFbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgdGhpcy5ncmlkID0gdGhpcy5pbml0SW50ZXJuYWwoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2F2ZUdyaWRTdGF0ZShzdGF0ZSkge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudEdyaWRNb2RlICE9PSBHcmlkTW9kZS5FZGl0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNvbHVtbk5hbWVzVXBkYXRlZCA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0IHdpZHRocyA9IHRoaXMuZ3JpZFN0YXRlTWFuYWdlci5zYXZlKHN0YXRlLFxyXG4gICAgICAoKSA9PiB0aGlzLnVwZGF0ZUdyaWRTdGF0ZUluZGljYXRvcihHUklEX0lORElDQVRPUl9TVEFURS5zYXZpbmcpLFxyXG4gICAgICAoKSA9PiB0aGlzLnVwZGF0ZUdyaWRTdGF0ZUluZGljYXRvcihHUklEX0lORElDQVRPUl9TVEFURS5zYXZlZCkpO1xyXG5cclxuICAgIGlmICh3aWR0aHMpIHtcclxuICAgICAgT2JqZWN0LmtleXMod2lkdGhzKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICBjb25zdCBlZGl0V2lkdGhCb3ggPSB0aGlzLmVkaXRXaWR0aEVkaXRCb3hlc1trZXldO1xyXG5cclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHdpZHRoc1trZXldID09PSAnaW5oZXJpdCcgPyAnJyA6IHdpZHRoc1trZXldO1xyXG5cclxuICAgICAgICBpZiAoZWRpdFdpZHRoQm94ICYmIGVkaXRXaWR0aEJveC5vcHRpb24oJ3ZhbHVlJykgIT09IHZhbHVlKSB7XHJcbiAgICAgICAgICBlZGl0V2lkdGhCb3gub3B0aW9uKCd2YWx1ZScsIHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0R3JpZEhlYWRlckNlbGxFZGl0UGFuZWwoXHJcbiAgICBjb2x1bW46IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbixcclxuICAgICRjZWxsOiBKUXVlcnksXHJcbiAgICBhZGRpdGlvbmFsU2V0dGluZ3M6IElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlXHJcbiAgKSB7XHJcbiAgICBjb25zdCBkYXRhRmllbGQgPSBjb2x1bW4uZGF0YUZpZWxkO1xyXG4gICAgY29uc3QgJGNvbHVtbkNhcHRpb25FbCA9ICRjZWxsLmZpbmQoJy5keC1kYXRhZ3JpZC10ZXh0LWNvbnRlbnQnKTtcclxuICAgIGNvbnN0ICRlZGl0b3JBcmVhID0gJCgnPHNwYW4gLz4nKS5hZGRDbGFzcygnY29sdW1uLWVkaXRvci1hcmVhJykuaW5zZXJ0QWZ0ZXIoJGNvbHVtbkNhcHRpb25FbCk7XHJcblxyXG4gICAgJGNvbHVtbkNhcHRpb25FbC5jc3MoJ21heFdpZHRoJywgJzU1JScpO1xyXG5cclxuICAgIGNvbnN0ICRlZGl0VHlwZVBhbmVsID0gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZWRpdC10eXBlLXBhbmVsJylcclxuICAgICAgLndpZHRoKCcxMDAlJylcclxuICAgICAgLmFwcGVuZFRvKCRjZWxsKTtcclxuXHJcbiAgICBjb25zdCAkZWRpdFdpZHRoUGFuZWwgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgLmFkZENsYXNzKCdlZGl0LXdpZHRoLXBhbmVsJylcclxuICAgICAgLndpZHRoKCcxMDAlJylcclxuICAgICAgLmFwcGVuZFRvKCRjZWxsKTtcclxuXHJcbiAgICAkZWRpdFR5cGVQYW5lbFswXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgIGNvbnN0IHNlbGVjdEJveCA9ICRlZGl0VHlwZUJveC5keFNlbGVjdEJveCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICAgIGlmIChzZWxlY3RCb3gub3B0aW9uKCdvcGVuZWQnKSkge1xyXG4gICAgICAgIHNlbGVjdEJveC5jbG9zZSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNlbGVjdEJveC5vcGVuKCk7XHJcbiAgICAgIH1cclxuICAgIH0sIHRydWUpO1xyXG5cclxuICAgIGxldCBsYXN0Q2FwdGlvblZhbHVlID0gY29sdW1uLmNhcHRpb247XHJcblxyXG4gICAgY29uc3QgJGVkaXRDYXB0aW9uQnRuID0gJCgnPHNwYW4gLz4nKS5keEJ1dHRvbih7XHJcbiAgICAgIGhpbnQ6ICdFZGl0IGNvbHVtbiBjYXB0aW9uJyxcclxuICAgICAgdGVtcGxhdGU6IChkYXRhLCAkY29udGVudCkgPT4gJGNvbnRlbnQuYXBwZW5kKCQoJzxzcGFuIC8+JykuYWRkQ2xhc3MoJ2VkaXQtY2FwdGlvbi1idG4nKSksXHJcbiAgICAgIG9uQ2xpY2s6ICh7IGV2ZW50IH0pID0+IHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAkY29sdW1uQ2FwdGlvbkVsLmhpZGUoKTtcclxuICAgICAgICAkZWRpdENhcHRpb25CdG4uaGlkZSgpO1xyXG4gICAgICAgICRlZGl0VG9vbHRpcEJ0bi5oaWRlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0ICRlZGl0ID0gJCgnPHNwYW4gLz4nKS5keFRleHRCb3goe1xyXG4gICAgICAgICAgdmFsdWU6IGxhc3RDYXB0aW9uVmFsdWUsXHJcbiAgICAgICAgICBlbGVtZW50QXR0cjogeyBjbGFzczogJ2NhcHRpb24tZWRpdG9yJyB9LFxyXG4gICAgICAgICAgb25FbnRlcktleTogKGUpID0+IHtcclxuICAgICAgICAgICAgZWRpdEJ0bi5ibHVyKCk7XHJcbiAgICAgICAgICAgIGUuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb25LZXlEb3duOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICBlLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9uRm9jdXNPdXQ6IChlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gZWRpdEJ0bi5vcHRpb24oJ3ZhbHVlJyk7XHJcblxyXG4gICAgICAgICAgICAkZWRpdC5yZW1vdmUoKTtcclxuICAgICAgICAgICAgJGNvbHVtbkNhcHRpb25FbC50ZXh0KG5ld1ZhbHVlKS5zaG93KCk7XHJcbiAgICAgICAgICAgICRlZGl0Q2FwdGlvbkJ0bi5zaG93KCk7XHJcbiAgICAgICAgICAgICRlZGl0VG9vbHRpcEJ0bi5zaG93KCk7XHJcblxyXG4gICAgICAgICAgICBsYXN0Q2FwdGlvblZhbHVlID0gbmV3VmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZFN0YXRlTWFuYWdlci5zZXRDb2x1bW5DYXB0aW9uKGRhdGFGaWVsZCwgbmV3VmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLnNhdmVHcmlkU3RhdGUodGhpcy5ncmlkLnN0YXRlKCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLXNtJylcclxuICAgICAgICAgIC5hcHBlbmRUbygkZWRpdG9yQXJlYSlcclxuICAgICAgICAgIC5vbignY2xpY2snLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgZWRpdEJ0biA9ICRlZGl0LmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICAgICAgZWRpdEJ0bi5mb2N1cygpO1xyXG4gICAgICB9XHJcbiAgICB9KS5pbnNlcnRBZnRlcigkY29sdW1uQ2FwdGlvbkVsKTtcclxuXHJcbiAgICBjb25zdCAkZWRpdFRvb2x0aXBCdG4gPSAkKCc8c3BhbiAvPicpLmR4QnV0dG9uKHtcclxuICAgICAgaGludDogJ0VkaXQgY29sdW1uIHRvb2x0aXAnLFxyXG4gICAgICB0ZW1wbGF0ZTogKGRhdGEsICRjb250ZW50KSA9PiAkY29udGVudC5hcHBlbmQoJCgnPHNwYW4gLz4nKS5hZGRDbGFzcygnZWRpdC10b29sdGlwLWJ0bicpKSxcclxuICAgICAgb25DbGljazogKHsgZXZlbnQgfSkgPT4ge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICRjb2x1bW5DYXB0aW9uRWwuaGlkZSgpO1xyXG4gICAgICAgICRlZGl0Q2FwdGlvbkJ0bi5oaWRlKCk7XHJcbiAgICAgICAgJGVkaXRUb29sdGlwQnRuLmhpZGUoKTtcclxuXHJcbiAgICAgICAgY29uc3QgJGVkaXQgPSAkKCc8c3BhbiAvPicpLmR4VGV4dEJveCh7XHJcbiAgICAgICAgICB2YWx1ZTogYWRkaXRpb25hbFNldHRpbmdzICYmIGFkZGl0aW9uYWxTZXR0aW5ncy50b29sdGlwLFxyXG4gICAgICAgICAgdGV4dDogYWRkaXRpb25hbFNldHRpbmdzICYmIGFkZGl0aW9uYWxTZXR0aW5ncy50b29sdGlwLFxyXG4gICAgICAgICAgcGxhY2Vob2xkZXI6ICdFbnRlciBjb2x1bW4gdG9vbHRpcC4uLicsXHJcbiAgICAgICAgICBvbkVudGVyS2V5OiAoZSkgPT4ge1xyXG4gICAgICAgICAgICBlZGl0QnRuLmJsdXIoKTtcclxuICAgICAgICAgICAgZS5ldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBvbktleURvd246IChlKSA9PiB7XHJcbiAgICAgICAgICAgIGUuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb25Gb2N1c091dDogKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGVkaXRCdG4ub3B0aW9uKCd2YWx1ZScpO1xyXG5cclxuICAgICAgICAgICAgJGVkaXQucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICRjb2x1bW5DYXB0aW9uRWwuc2hvdygpO1xyXG4gICAgICAgICAgICAkZWRpdENhcHRpb25CdG4uc2hvdygpO1xyXG4gICAgICAgICAgICAkZWRpdFRvb2x0aXBCdG4uc2hvdygpO1xyXG5cclxuICAgICAgICAgICAgYWRkaXRpb25hbFNldHRpbmdzLnRvb2x0aXAgPSBuZXdWYWx1ZTtcclxuICAgICAgICAgICAgJGNlbGwuYXR0cigndGl0bGUnLCBuZXdWYWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZUdyaWRTdGF0ZSh0aGlzLmdyaWQuc3RhdGUoKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkuYWRkQ2xhc3MoJ2lzem9sZWEtc20nKVxyXG4gICAgICAgICAgLmFwcGVuZFRvKCRlZGl0b3JBcmVhKVxyXG4gICAgICAgICAgLm9uKCdjbGljaycsIChlKSA9PiB7XHJcbiAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBlZGl0QnRuID0gJGVkaXQuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG5cclxuICAgICAgICBlZGl0QnRuLmZvY3VzKCk7XHJcbiAgICAgIH1cclxuICAgIH0pLmluc2VydEFmdGVyKCRlZGl0Q2FwdGlvbkJ0bik7XHJcblxyXG4gICAgY29uc3QgJGVkaXRUeXBlQm94ID0gJCgnPHNwYW4gLz4nKS5keFNlbGVjdEJveCh7XHJcbiAgICAgIGRhdGFTb3VyY2U6IGdyaWRDb2x1bW5UeXBlcyxcclxuICAgICAgdmFsdWU6IGNvbHVtbi5kYXRhVHlwZSB8fCBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlLkRlZmF1bHQsXHJcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IGNvbHVtbiB0eXBlLi4uJyxcclxuICAgICAgb25WYWx1ZUNoYW5nZWQ6ICh7IHZhbHVlIH0pID0+IHtcclxuICAgICAgICB0aGlzLmdyaWQuY29sdW1uT3B0aW9uKGRhdGFGaWVsZCwgJ2RhdGFUeXBlJywgdmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1zbScpLmFwcGVuZFRvKCRlZGl0VHlwZVBhbmVsKTtcclxuXHJcbiAgICBsZXQgcHJldlZhbHVlID0gISFjb2x1bW4ud2lkdGggPyBjb2x1bW4ud2lkdGgudG9TdHJpbmcoKSA6ICcnO1xyXG5cclxuICAgIGNvbnN0IG9uV2lkdGhWYWx1ZUNoYW5nZWQgPSAoZSkgPT4ge1xyXG4gICAgICBsZXQgbmV3VmFsdWUgPSBlLmNvbXBvbmVudC5vcHRpb24oJ3ZhbHVlJyk7XHJcblxyXG4gICAgICBpZiAoIW5ld1ZhbHVlIHx8IG5ld1ZhbHVlID09PSAnaW5oZXJpdCcpIHtcclxuICAgICAgICBuZXdWYWx1ZSA9ICcnO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIXByZXZWYWx1ZSB8fCBwcmV2VmFsdWUgPT09ICdpbmhlcml0Jykge1xyXG4gICAgICAgIHByZXZWYWx1ZSA9ICcnO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAobmV3VmFsdWUgIT09IHByZXZWYWx1ZSkge1xyXG4gICAgICAgIHByZXZWYWx1ZSA9IG5ld1ZhbHVlO1xyXG4gICAgICAgIHRoaXMuZ3JpZC5jb2x1bW5PcHRpb24oZGF0YUZpZWxkLCAnd2lkdGgnLCBuZXdWYWx1ZSB8fCAnaW5oZXJpdCcpO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuZ3JpZFJlcGFpbnRRdWV1ZWQpIHtcclxuICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5ncmlkLnJlcGFpbnQoKTtcclxuICAgICAgICAgICAgdGhpcy5ncmlkUmVwYWludFF1ZXVlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgfSwgMTAwKTtcclxuICAgICAgICAgIHRoaXMuZ3JpZFJlcGFpbnRRdWV1ZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0ICRlZGl0V2lkdGhCb3ggPSAkKCc8c3BhbiAvPicpLmR4VGV4dEJveCh7XHJcbiAgICAgIHRleHQ6IHByZXZWYWx1ZSA9PT0gJ2luaGVyaXQnID8gJycgOiBwcmV2VmFsdWUsXHJcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2V0IHdpZHRoLi4uJyxcclxuICAgICAgb25FbnRlcktleTogKCkgPT4gJGVkaXRXaWR0aEJveC5keFRleHRCb3goJ2luc3RhbmNlJykuYmx1cigpLFxyXG4gICAgICBvbkZvY3VzT3V0OiBvbldpZHRoVmFsdWVDaGFuZ2VkLFxyXG4gICAgICBvblZhbHVlQ2hhbmdlZDogb25XaWR0aFZhbHVlQ2hhbmdlZFxyXG4gICAgfSkuYWRkQ2xhc3MoJ2lzem9sZWEtc20nKVxyXG4gICAgICAuYXBwZW5kVG8oJGVkaXRXaWR0aFBhbmVsKVxyXG4gICAgICAub24oJ2NsaWNrJywgKGUpID0+IHtcclxuICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5lZGl0V2lkdGhFZGl0Qm94ZXNbY29sdW1uLnZpc2libGVJbmRleF0gPSAkZWRpdFdpZHRoQm94LmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdEdyaWRIZWFkZXJDZWxsKCRjZWxsRWw6IEpRdWVyeSwgYWRkaXRpb25hbFNldHRpbmdzOiBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZSkge1xyXG4gICAgY29uc3QgJGNvbHVtbkNhcHRpb25FbCA9ICRjZWxsRWwuZmluZCgnLmR4LWRhdGFncmlkLXRleHQtY29udGVudCcpO1xyXG4gICAgY29uc3QgdG9vbHRpcCA9IGFkZGl0aW9uYWxTZXR0aW5ncyAmJiBhZGRpdGlvbmFsU2V0dGluZ3MudG9vbHRpcDtcclxuICAgIGNvbnN0IGNhcHRpb24gPSBhZGRpdGlvbmFsU2V0dGluZ3MgJiYgYWRkaXRpb25hbFNldHRpbmdzLmNhcHRpb247XHJcblxyXG4gICAgJGNlbGxFbC5hdHRyKCd0aXRsZScsIHRvb2x0aXAgfHwgdm9pZCAwKTtcclxuXHJcbiAgICBpZiAoY2FwdGlvbikge1xyXG4gICAgICAkY29sdW1uQ2FwdGlvbkVsLnRleHQoY2FwdGlvbik7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbnRlcmZhY2UgSUdhdWdlU3VidmFsdWVzT3B0aW9ucyB7XHJcbiAgc3VidmFsdWVzOiBJU3VidmFsdWVPcHRpb25zW107XHJcbiAgdHlwZTogc3RyaW5nO1xyXG4gIHdpZHRoOiBudW1iZXI7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJU3VidmFsdWVPcHRpb25zIHtcclxuICBrZXk6IG51bWJlcjtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgaXNCb3VuZDogYm9vbGVhbjtcclxuICBtZWFzdXJlSWQ6IHN0cmluZztcclxuICB2YWx1ZTogbnVtYmVyO1xyXG4gIGNvbG9yOiBzdHJpbmc7XHJcbn1cclxuXHJcbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xyXG4gIHN1YnZhbHVlczogW10sXHJcbiAgdHlwZTogJ3RyaWFuZ2xlTWFya2VyJyxcclxuICBjb2xvcjogJyM4Nzk4YTUnLFxyXG4gIHNlY29uZENvbG9yOiAnI2UxOGU5MicsXHJcbiAgd2lkdGg6IDEwLFxyXG4gIGlzQ3VzdG9tUGFsZXR0ZTogZmFsc2UsXHJcbiAgcGFsZXR0ZTogbnVsbCxcclxuICBjdXN0b21QYWxldHRlOiBbJyM2MWE1OTUnLCAnR3JleScsICdyZ2IoMTUzLCAxMDIsIDI1NSknLCAnTmF2eSddXHJcbn0gYXMgSUdhdWdlU3VidmFsdWVzT3B0aW9ucztcclxuXHJcbmNvbnN0IENTU19DTEFTUyA9ICdpc296LXN1YnZhbHVlRWRpdG9yRm9ybUdyb3VwJztcclxuY29uc3QgTkFNRV9JVEVNX0NTU19DTEFTUyA9IGAke0NTU19DTEFTU31fX25hbWVgO1xyXG5jb25zdCBJU19CT1VORF9JVEVNX0NTU19DTEFTUyA9IGAke0NTU19DTEFTU31fX2lzLWJvdW5kYDtcclxuY29uc3QgVkFMVUVfSVRFTV9DU1NfQ0xBU1MgPSBgJHtDU1NfQ0xBU1N9X192YWx1ZWA7XHJcbmNvbnN0IE1FQVNVUkVfSURfSVRFTV9DU1NfQ0xBU1MgPSBgJHtDU1NfQ0xBU1N9X19tZWFzdXJlLWlkYDtcclxuY29uc3QgQ09MT1JfSVRFTV9DU1NfQ0xBU1MgPSBgJHtDU1NfQ0xBU1N9X19jb2xvcmA7XHJcblxyXG5jb25zdCBDSVJDTFVBUl9JTkRJQ0FUT1JfVFlQRVMgPSBbJ3JlY3RhbmdsZU5lZWRsZScsICd0cmlhbmdsZU5lZWRsZScsICdyYW5nZUJhcicsICd0cmlhbmdsZU1hcmtlcicsICd0ZXh0Q2xvdWQnXTtcclxuY29uc3QgTElORUFSX0lORElDQVRPUl9UWVBFUyA9IFsncmVjdGFuZ2xlJywgJ2NpcmNsZScsICdyaG9tYnVzJywgJ3JhbmdlQmFyJywgJ3RyaWFuZ2xlTWFya2VyJywgJ3RleHRDbG91ZCddO1xyXG5cclxuY29uc3QgQ0lSQ1VMQVJfVklFV19UWVBFUzogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VWaWV3VHlwZVtdID0gWydDaXJjdWxhckZ1bGwnLCAnQ2lyY3VsYXJIYWxmJywgJ0NpcmN1bGFyUXVhcnRlckxlZnQnLCAnQ2lyY3VsYXJRdWFydGVyUmlnaHQnLCAnQ2lyY3VsYXJUaHJlZUZvdXJ0aCddO1xyXG5jb25zdCBMSU5FQVJfVklFV19UWVBFUzogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VWaWV3VHlwZVtdID0gWydMaW5lYXJIb3Jpem9udGFsJywgJ0xpbmVhclZlcnRpY2FsJ107XHJcblxyXG5jb25zdCBERUZBVUxUX1BBTEVUVEUgPSBbJyMxZGIyZjUnLCAnI2Y1NTY0YScsICcjOTdjOTVjJywgJyNmZmM3MjAnLCAnI2ViMzU3MycsICcjYTYzZGI4JywgJyM2NTkzYmMnLCAnI2ZhYTMzNScsICcjZmY4ODdjJ107XHJcblxyXG5jb25zdCBQUkVERUZJTkVEX1BBTEVUVEVTID0gWydCcmlnaHQnLCAnSGFybW9ueSBMaWdodCcsICdPY2VhbicsICdQYXN0ZWwnLCAnU29mdCcsICdTb2Z0IFBhc3RlbCcsICdWaW50YWdlJyxcclxuICAnVmlvbGV0JywgJ0Nhcm1pbmUnLCAnRGFyayBNb29uJywgJ0RhcmsgVmlvbGV0JywgJ0dyZWVuIE1pc3QnLCAnU29mdCBCbHVlJywgJ01hdGVyaWFsJywgJ09mZmljZSddO1xyXG5cclxuLy8gMS4gTW9kZWxcclxuY29uc3QgcHJvcGVydHkgPSB7XHJcbiAgb3duZXJUeXBlOiBEZXZFeHByZXNzPy5EYXNoYm9hcmQ/Lk1vZGVsPy5HYXVnZUl0ZW0sXHJcbiAgcHJvcGVydHlOYW1lOiAnR2F1Z2VTdWJ2YWx1ZXNTZXR0aW5ncycsXHJcbiAgZGVmYXVsdFZhbHVlOiBKU09OLnN0cmluZ2lmeShkZWZhdWx0T3B0aW9ucyksXHJcbiAgdmFsdWVUeXBlOiAnc3RyaW5nJ1xyXG59IGFzIERldkV4cHJlc3MuRGFzaGJvYXJkLk1vZGVsLkN1c3RvbVByb3BlcnR5TWV0YWRhdGE7XHJcblxyXG5EZXZFeHByZXNzPy5EYXNoYm9hcmQ/Lk1vZGVsPy5yZWdpc3RlckN1c3RvbVByb3BlcnR5KHByb3BlcnR5KTtcclxuXHJcbi8vIDIuIFZpZXdlclxyXG5mdW5jdGlvbiBvbkl0ZW1XaWRnZXRPcHRpb25zUHJlcGFyZWQoYXJnczogRGV2RXhwcmVzcy5EYXNoYm9hcmQuSXRlbVdpZGdldE9wdGlvbkV2ZW50QXJncykge1xyXG4gIGlmIChhcmdzLmRhc2hib2FyZEl0ZW0gaW5zdGFuY2VvZiBEZXZFeHByZXNzPy5EYXNoYm9hcmQ/Lk1vZGVsPy5HYXVnZUl0ZW0pIHtcclxuICAgIGNvbnN0IHN0b3JlZE9wdGlvbnMgPSBnZXRPcHRpb25zKGFyZ3MuZGFzaGJvYXJkSXRlbSk7XHJcblxyXG4gICAgY29uc3QgZ2F1Z2VPcHRpb25zID0gYXJncy5vcHRpb25zIGFzIERldkV4cHJlc3Mudml6LmR4TGluZWFyR2F1Z2VPcHRpb25zIHwgRGV2RXhwcmVzcy52aXouZHhDaXJjdWxhckdhdWdlT3B0aW9ucztcclxuICAgIGdhdWdlT3B0aW9ucy5zdWJ2YWx1ZXMgPSBnYXVnZU9wdGlvbnMuc3VidmFsdWVzIHx8IFtdO1xyXG4gICAgZ2F1Z2VPcHRpb25zLnN1YnZhbHVlSW5kaWNhdG9yID0gZ2F1Z2VPcHRpb25zLnN1YnZhbHVlSW5kaWNhdG9yIHx8IHt9O1xyXG5cclxuICAgIGdhdWdlT3B0aW9ucy5zdWJ2YWx1ZUluZGljYXRvci50eXBlID0gc3RvcmVkT3B0aW9ucy50eXBlIGFzIGFueTtcclxuICAgIGdhdWdlT3B0aW9ucy5zdWJ2YWx1ZUluZGljYXRvci53aWR0aCA9IHN0b3JlZE9wdGlvbnMud2lkdGg7XHJcblxyXG4gICAgY29uc3QgaGFzVGFyZ2V0VmFsdWUgPSAhIWFyZ3MuZGFzaGJvYXJkSXRlbS5nYXVnZXMoKVswXT8udGFyZ2V0VmFsdWUoKTtcclxuICAgIGdhdWdlT3B0aW9ucy5zdWJ2YWx1ZUluZGljYXRvci5wYWxldHRlID0gc3RvcmVkT3B0aW9ucy5zdWJ2YWx1ZXMuZmlsdGVyKChzKSA9PiBoYXNUYXJnZXRWYWx1ZSB8fCBzLmtleSA+IC0xKS5tYXAoKHMpID0+IHMuY29sb3IpO1xyXG5cclxuICAgIHN0b3JlZE9wdGlvbnMuc3VidmFsdWVzLmZvckVhY2goKHN1YnZhbHVlKSA9PiB7XHJcbiAgICAgIGlmIChzdWJ2YWx1ZS5rZXkgPT09IC0xKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCB2YWx1ZSA9IHN1YnZhbHVlLmlzQm91bmQgPyBhcmdzLml0ZW1EYXRhLmdldE1lYXN1cmVWYWx1ZShzdWJ2YWx1ZS5tZWFzdXJlSWQpLmdldFZhbHVlKCkgOiBzdWJ2YWx1ZS52YWx1ZTtcclxuICAgICAgZ2F1Z2VPcHRpb25zLnN1YnZhbHVlcy5wdXNoKHZhbHVlKTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuLy8gMy4gRGVzaWduZXJcclxuZnVuY3Rpb24gb25DdXN0b21pemVTZWN0aW9ucyhhcmdzOiBEZXZFeHByZXNzLkRhc2hib2FyZC5EZXNpZ25lci5DdXN0b21pemVTZWN0aW9uc0V2ZW50QXJncykge1xyXG4gIGNvbnN0IGdhdWdlSXRlbSA9IGFyZ3MuZGFzaGJvYXJkSXRlbTtcclxuICBpZiAoZ2F1Z2VJdGVtIGluc3RhbmNlb2YgRGV2RXhwcmVzcz8uRGFzaGJvYXJkPy5Nb2RlbD8uR2F1Z2VJdGVtKSB7XHJcbiAgICBhcmdzLmFkZFNlY3Rpb24oe1xyXG4gICAgICB0aXRsZTogJ1N1YnZhbHVlcycsXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiBwcm9wZXJ0eS5wcm9wZXJ0eU5hbWUsXHJcbiAgICAgICAgICB0ZW1wbGF0ZShhLCBlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbkNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgICAgICBuZXcgRGV2RXhwcmVzcy51aS5keEJ1dHRvbihidXR0b25Db250YWluZXIsIHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnRWRpdCBpbiBXaXphcmQnLFxyXG4gICAgICAgICAgICAgIG9uQ2xpY2soKSB7XHJcbiAgICAgICAgICAgICAgICBzaG93UG9wdXAoZ2F1Z2VJdGVtKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGJ1dHRvbkNvbnRhaW5lcjtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICB2aXNpYmxlOiBmYWxzZSxcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd1BvcHVwKGdhdWdlSXRlbTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VJdGVtKSB7XHJcbiAgY29uc3QgcG9wdXBDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHBvcHVwQ29udGFpbmVyKTtcclxuICBjb25zdCBwb3B1cE9wdGlvbnMgPSB7XHJcbiAgICB3aWR0aDogJzgwMHB4JyxcclxuICAgIGhlaWdodDogJ2F1dG8nLFxyXG4gICAgbWF4SGVpZ2h0OiAnMTAwJScsXHJcbiAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiBmYWxzZSxcclxuICAgIGNvbnRlbnRUZW1wbGF0ZSh0aGlzOiBhbnksIGNvbnRlbnRDb250YWluZXIpIHtcclxuICAgICAgY29uc3Qgc3VidmFsdWVzRm9ybUNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICBjb25zdCBzdWJ2YWx1ZXNmb3JtT3B0aW9ucyA9IGdldFN1YnZhbHVlRm9ybU9wdGlvbnMoZ2F1Z2VJdGVtKTtcclxuICAgICAgdGhpcy5fc3VidmFsdWVzRm9ybSA9IG5ldyBEZXZFeHByZXNzLnVpLmR4Rm9ybShzdWJ2YWx1ZXNGb3JtQ29udGFpbmVyLCBzdWJ2YWx1ZXNmb3JtT3B0aW9ucyk7XHJcblxyXG4gICAgICBjb25zdCBpbmRpY2F0b3JGb3JtQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgIGNvbnN0IGluZGljYXRvcmZvcm1PcHRpb25zID0gZ2V0SW5kaWNhdG9yRm9ybU9wdGlvbnMoZ2F1Z2VJdGVtKTtcclxuICAgICAgdGhpcy5faW5kaWNhdG9yRm9ybSA9IG5ldyBEZXZFeHByZXNzLnVpLmR4Rm9ybShpbmRpY2F0b3JGb3JtQ29udGFpbmVyLCBpbmRpY2F0b3Jmb3JtT3B0aW9ucyk7XHJcblxyXG4gICAgICBjb25zdCBjb250ZW50ID0gJCgnPGRpdiAvPicpLmFwcGVuZChzdWJ2YWx1ZXNGb3JtQ29udGFpbmVyLCBpbmRpY2F0b3JGb3JtQ29udGFpbmVyKTtcclxuXHJcbiAgICAgIGNvbnN0IHNjcm9sbFZpZXcgPSAkKCc8ZGl2IC8+Jyk7XHJcbiAgICAgIHNjcm9sbFZpZXcuYXBwZW5kKGNvbnRlbnQpO1xyXG4gICAgICBzY3JvbGxWaWV3LmR4U2Nyb2xsVmlldyh7XHJcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgICBoZWlnaHQ6ICcxMDAlJ1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHJldHVybiBzY3JvbGxWaWV3O1xyXG4gICAgfSxcclxuICAgIG9uSGlkZGVuKCkge1xyXG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHBvcHVwQ29udGFpbmVyKTtcclxuICAgIH0sXHJcbiAgICB0aXRsZTogJ1N1YnZhbHVlcyBXaXphcmQnLFxyXG4gIH0gYXMgRGV2RXhwcmVzcy51aS5keFBvcHVwLlByb3BlcnRpZXM7XHJcbiAgY29uc3QgcG9wdXAgPSBuZXcgRGV2RXhwcmVzcy51aS5keFBvcHVwKHBvcHVwQ29udGFpbmVyLCBwb3B1cE9wdGlvbnMpO1xyXG4gIHBvcHVwLnNob3coKTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0T3B0aW9ucyhnYWd1ZUl0ZW06IERldkV4cHJlc3MuRGFzaGJvYXJkLk1vZGVsLkdhdWdlSXRlbSk6IElHYXVnZVN1YnZhbHVlc09wdGlvbnMge1xyXG4gIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGdhZ3VlSXRlbS5jdXN0b21Qcm9wZXJ0aWVzLmdldFZhbHVlKHByb3BlcnR5LnByb3BlcnR5TmFtZSkgYXMgc3RyaW5nKSBhcyBJR2F1Z2VTdWJ2YWx1ZXNPcHRpb25zO1xyXG4gIGNvbnN0IGhhc1RhcmdldFZhbHVlID0gISFnYWd1ZUl0ZW0uZ2F1Z2VzKClbMF0/LnRhcmdldFZhbHVlKCk7XHJcblxyXG4gIGlmIChoYXNUYXJnZXRWYWx1ZSAmJiAoIWRhdGEuc3VidmFsdWVzIHx8ICFkYXRhLnN1YnZhbHVlcy5zb21lKChzKSA9PiBzLmtleSA9PT0gLTEpKSkge1xyXG4gICAgZGF0YS5zdWJ2YWx1ZXMuc3BsaWNlKDAsIDAsIHtcclxuICAgICAga2V5OiAtMSxcclxuICAgICAgbmFtZTogJ1RhcmdldCBWYWx1ZScsXHJcbiAgICAgIGlzQm91bmQ6IGZhbHNlLFxyXG4gICAgICBtZWFzdXJlSWQ6ICcnLFxyXG4gICAgICB2YWx1ZTogMCxcclxuICAgICAgY29sb3I6IERFRkFVTFRfUEFMRVRURVsoZGF0YS5zdWJ2YWx1ZXM/Lmxlbmd0aCB8fCAwKSAlIChERUZBVUxUX1BBTEVUVEUubGVuZ3RoIC0gMSldLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZGF0YTtcclxufVxyXG5mdW5jdGlvbiBzZXRPcHRpb25zKGdhdWdlSXRlbTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VJdGVtLCB2YWx1ZTogSUdhdWdlU3VidmFsdWVzT3B0aW9ucykge1xyXG4gIHJldHVybiBnYXVnZUl0ZW0uY3VzdG9tUHJvcGVydGllcy5zZXRWYWx1ZShwcm9wZXJ0eS5wcm9wZXJ0eU5hbWUsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XHJcbn1cclxuXHJcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbmZ1bmN0aW9uIGNyZWF0ZUxpc3RBbmRUb29sYmFyKGZvcm06IERldkV4cHJlc3MudWkuZHhGb3JtLCBnYXVnZUl0ZW06IERldkV4cHJlc3MuRGFzaGJvYXJkLk1vZGVsLkdhdWdlSXRlbSk6IFtKUXVlcnksIERldkV4cHJlc3MudWkuZHhMaXN0LCBEZXZFeHByZXNzLnVpLmR4VG9vbGJhcl0ge1xyXG4gIGNvbnN0ICRlbGVtZW50ID0gJCgnPGRpdiAvPicpO1xyXG4gIGNvbnN0ICR0b29sYmFyQ29udGFpbmVyID0gJCgnPGRpdiAvPicpO1xyXG4gICRlbGVtZW50LmFwcGVuZCgkdG9vbGJhckNvbnRhaW5lcik7XHJcbiAgY29uc3QgZWRpdEJ1dHRvbiA9IG51bGw7XHJcbiAgbGV0IGxpc3Q6IERldkV4cHJlc3MudWkuZHhMaXN0ID0gbnVsbDtcclxuXHJcbiAgY29uc3QgdG9vbGJhck9wdGlvbnMgPSB7XHJcbiAgICBpdGVtczogW3tcclxuICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICBpY29uOiAnYWRkJyxcclxuICAgICAgICBzdHlsaW5nTW9kZTogJ3RleHQnLFxyXG4gICAgICAgIG9uQ2xpY2soZSkge1xyXG4gICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGdldE9wdGlvbnMoZ2F1Z2VJdGVtKTtcclxuICAgICAgICAgIGNvbnN0IGtleSA9IG9wdGlvbnMuc3VidmFsdWVzLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiBhY2MgPCBpdGVtLmtleSA/IGl0ZW0ua2V5IDogYWNjLCAwKSArIDE7XHJcbiAgICAgICAgICBjb25zdCBuZXdTdWJ2YWx1ZTogSVN1YnZhbHVlT3B0aW9ucyA9IHtcclxuICAgICAgICAgICAga2V5LFxyXG4gICAgICAgICAgICBuYW1lOiBgU3VidmFsdWUgJHtrZXl9YCxcclxuICAgICAgICAgICAgaXNCb3VuZDogZmFsc2UsXHJcbiAgICAgICAgICAgIG1lYXN1cmVJZDogJycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAwLFxyXG4gICAgICAgICAgICBjb2xvcjogREVGQVVMVF9QQUxFVFRFW29wdGlvbnMuc3VidmFsdWVzLmxlbmd0aCAlIChERUZBVUxUX1BBTEVUVEUubGVuZ3RoIC0gMSldLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIGZvcm0ub3B0aW9uKCdmb3JtRGF0YScsIG5ld1N1YnZhbHVlKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBpdGVtSW5EYXRhU291cmNlID0gb3B0aW9ucy5zdWJ2YWx1ZXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmtleSA9PT0gbmV3U3VidmFsdWUua2V5KVswXTtcclxuICAgICAgICAgIGlmICghaXRlbUluRGF0YVNvdXJjZSkge1xyXG4gICAgICAgICAgICBvcHRpb25zLnN1YnZhbHVlcy5wdXNoKG5ld1N1YnZhbHVlKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gb3B0aW9ucy5zdWJ2YWx1ZXMuaW5kZXhPZihpdGVtSW5EYXRhU291cmNlKTtcclxuICAgICAgICAgICAgb3B0aW9uc1tpbmRleF0gPSBuZXdTdWJ2YWx1ZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBzZXRPcHRpb25zKGdhdWdlSXRlbSwgb3B0aW9ucyk7XHJcbiAgICAgICAgICBsaXN0LnJlbG9hZCgpO1xyXG4gICAgICAgICAgbGlzdC5vcHRpb24oJ3NlbGVjdGVkSXRlbScsIG9wdGlvbnMuc3VidmFsdWVzW29wdGlvbnMuc3VidmFsdWVzLmxlbmd0aCAtIDFdKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9XHJcbiAgICB9XVxyXG4gIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvb2xiYXJPcHRpb25zO1xyXG5cclxuICBjb25zdCB1cGRhdGVUb29sYmFyU3RhdGUgPSAoaGFzU2VsZWN0ZWRJdGVtOiBib29sZWFuKSA9PiB7XHJcbiAgICBlZGl0QnV0dG9uICYmIGVkaXRCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsICFoYXNTZWxlY3RlZEl0ZW0pO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IHRvb2xiYXIgPSBuZXcgRGV2RXhwcmVzcy51aS5keFRvb2xiYXIoJHRvb2xiYXJDb250YWluZXIsIHRvb2xiYXJPcHRpb25zKTtcclxuICBmb3JtLmVsZW1lbnQoKS5maW5kKGAuJHtDU1NfQ0xBU1N9YCkuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcclxuXHJcbiAgY29uc3QgbGlzdE9wdGlvbnMgPSB7XHJcbiAgICBkYXRhU291cmNlOiBuZXcgRGV2RXhwcmVzcy5kYXRhLkRhdGFTb3VyY2Uoe1xyXG4gICAgICBsb2FkOiAoKSA9PiBnZXRPcHRpb25zKGdhdWdlSXRlbSkuc3VidmFsdWVzLFxyXG4gICAgICByZW1vdmU6ICgpID0+IHsgfVxyXG4gICAgfSBhcyBhbnkpLFxyXG4gICAgZGlzcGxheUV4cHI6ICduYW1lJyxcclxuICAgIGhlaWdodDogJzIwMHB4JyxcclxuICAgIGtleUV4cHI6ICdrZXknLFxyXG4gICAgbm9EYXRhVGV4dDogJ0FkZCBhIFN1YnZhbHVlJyxcclxuICAgIGFsbG93SXRlbURlbGV0aW5nOiB0cnVlLFxyXG4gICAgaXRlbURlbGV0ZU1vZGU6ICdzdGF0aWMnLFxyXG4gICAgc2VsZWN0aW9uTW9kZTogJ3NpbmdsZScsXHJcbiAgICBvbkNvbnRlbnRSZWFkeShlKSB7IHVwZGF0ZVRvb2xiYXJTdGF0ZSghIWUuY29tcG9uZW50Lm9wdGlvbignc2VsZWN0ZWRJdGVtJykpOyB9LFxyXG4gICAgb25JdGVtUmVuZGVyZWQoZSkge1xyXG4gICAgICBjb25zdCBpdGVtRGF0YSA9IGUuaXRlbURhdGEgYXMgSVN1YnZhbHVlT3B0aW9ucztcclxuICAgICAgaWYgKGl0ZW1EYXRhLmtleSA9PT0gLTEpIHtcclxuICAgICAgICBjb25zdCBkZWxldGVFbGVtZW50ID0gZS5pdGVtRWxlbWVudFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdkeC1saXN0LXN0YXRpYy1kZWxldGUtYnV0dG9uLWNvbnRhaW5lcicpWzBdIGFzIEhUTUxEaXZFbGVtZW50O1xyXG4gICAgICAgIGRlbGV0ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uU2VsZWN0aW9uQ2hhbmdlZChlKSB7XHJcbiAgICAgIHVwZGF0ZVRvb2xiYXJTdGF0ZSghIWUuY29tcG9uZW50Lm9wdGlvbignc2VsZWN0ZWRJdGVtJykpO1xyXG4gICAgICBjb25zdCBzZWxlY3RlZEl0ZW0gPSBlLmNvbXBvbmVudC5vcHRpb24oJ3NlbGVjdGVkSXRlbScpO1xyXG4gICAgICBmb3JtLm9wdGlvbignZm9ybURhdGEnLCBzZWxlY3RlZEl0ZW0pO1xyXG4gICAgICBjb25zdCB3YXNmb3JtVmlzaWJsZSA9IGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke0NTU19DTEFTU31gKS5jc3MoJ2Rpc3BsYXknKSA9PT0gJ2Jsb2NrJztcclxuICAgICAgY29uc3Qgc2hvdWxkRm9ybUJlVmlzaWJsZSA9ICEhc2VsZWN0ZWRJdGVtO1xyXG4gICAgICBpZiAoIXdhc2Zvcm1WaXNpYmxlICYmIHNob3VsZEZvcm1CZVZpc2libGUgfHwgd2FzZm9ybVZpc2libGUgJiYgIXNob3VsZEZvcm1CZVZpc2libGUpIHtcclxuICAgICAgICBmb3JtLmVsZW1lbnQoKS5maW5kKGAuJHtDU1NfQ0xBU1N9YCkuY3NzKCdkaXNwbGF5Jywgc2hvdWxkRm9ybUJlVmlzaWJsZSA/ICdibG9jaycgOiAnbm9uZScpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgb25JdGVtRGVsZXRlZDogKGUpID0+IHtcclxuICAgICAgY29uc3Qgb3B0aW9ucyA9IGdldE9wdGlvbnMoZ2F1Z2VJdGVtKTtcclxuICAgICAgY29uc3Qga2V5ID0gZS5pdGVtRGF0YS5rZXk7XHJcbiAgICAgIGNvbnN0IGluZGV4ID0gb3B0aW9ucy5zdWJ2YWx1ZXMuaW5kZXhPZihvcHRpb25zLnN1YnZhbHVlcy5maWx0ZXIoKHN1YnZhbHVlKSA9PiBzdWJ2YWx1ZS5rZXkgPT09IGtleSlbMF0pO1xyXG4gICAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICAgIG9wdGlvbnMuc3VidmFsdWVzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgc2V0T3B0aW9ucyhnYXVnZUl0ZW0sIG9wdGlvbnMpO1xyXG4gICAgICB9XHJcbiAgICAgIGxpc3QucmVsb2FkKCk7XHJcbiAgICAgIGxpc3Qub3B0aW9uKCdzZWxlY3RlZEl0ZW0nLCBvcHRpb25zLnN1YnZhbHVlc1tvcHRpb25zLnN1YnZhbHVlcy5sZW5ndGggLSAxXSk7XHJcbiAgICB9XHJcbiAgfSBhcyBEZXZFeHByZXNzLnVpLmR4TGlzdE9wdGlvbnM7XHJcblxyXG4gIGNvbnN0ICRsaXN0Q29udGFpbmVyID0gJCgnPGRpdiAvPicpO1xyXG4gICRlbGVtZW50LmFwcGVuZCgkbGlzdENvbnRhaW5lcik7XHJcblxyXG4gIGxpc3QgPSBuZXcgRGV2RXhwcmVzcy51aS5keExpc3QoJGxpc3RDb250YWluZXIsIGxpc3RPcHRpb25zKTtcclxuXHJcbiAgcmV0dXJuIFskZWxlbWVudCwgbGlzdCwgdG9vbGJhcl07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFN1YnZhbHVlRm9ybU9wdGlvbnMoZ2F1Z2VJdGVtOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5HYXVnZUl0ZW0pOiBEZXZFeHByZXNzLnVpLmR4Rm9ybU9wdGlvbnMge1xyXG4gIGxldCBpdGVtc0xpc3Q6IERldkV4cHJlc3MudWkuZHhMaXN0IHwgbnVsbCA9IG51bGw7XHJcbiAgY29uc3QgdXBkYXRlRm9ybVN0YXRlID0gKGZvcm06IERldkV4cHJlc3MudWkuZHhGb3JtKSA9PiB7XHJcbiAgICBjb25zdCB2YWx1ZUVkaXRvciA9IGZvcm0uZ2V0RWRpdG9yKCd2YWx1ZScpO1xyXG4gICAgY29uc3QgbWVhc3VyZUlkRWRpdG9yID0gZm9ybS5nZXRFZGl0b3IoJ21lYXN1cmVJZCcpO1xyXG4gICAgY29uc3QgbmFtZUVkaXRvciA9IGZvcm0uZ2V0RWRpdG9yKCduYW1lJyk7XHJcbiAgICBjb25zdCBpc0JvdW5kID0gZm9ybS5vcHRpb24oJ2Zvcm1EYXRhJykuaXNCb3VuZDtcclxuICAgIGNvbnN0IGlzVGFyZ2V0VmFsdWUgPSBmb3JtLm9wdGlvbignZm9ybURhdGEnKS5rZXkgPT09IC0xO1xyXG5cclxuICAgIHZhbHVlRWRpdG9yICYmIHZhbHVlRWRpdG9yLm9wdGlvbignZGlzYWJsZWQnLCBpc0JvdW5kKTtcclxuICAgIG1lYXN1cmVJZEVkaXRvciAmJiBtZWFzdXJlSWRFZGl0b3Iub3B0aW9uKCdkaXNhYmxlZCcsICFpc0JvdW5kKTtcclxuXHJcbiAgICBmb3JtLmVsZW1lbnQoKS5maW5kKGAuJHtJU19CT1VORF9JVEVNX0NTU19DTEFTU31gKS5jc3MoJ2Rpc3BsYXknLCAhaXNUYXJnZXRWYWx1ZSA/ICdmbGV4JyA6ICdub25lJyk7XHJcbiAgICBmb3JtLmVsZW1lbnQoKS5maW5kKGAuJHtWQUxVRV9JVEVNX0NTU19DTEFTU31gKS5jc3MoJ2Rpc3BsYXknLCAhaXNUYXJnZXRWYWx1ZSA/ICdmbGV4JyA6ICdub25lJyk7XHJcbiAgICBmb3JtLmVsZW1lbnQoKS5maW5kKGAuJHtNRUFTVVJFX0lEX0lURU1fQ1NTX0NMQVNTfWApLmNzcygnZGlzcGxheScsICFpc1RhcmdldFZhbHVlID8gJ2ZsZXgnIDogJ25vbmUnKTtcclxuXHJcbiAgICBuYW1lRWRpdG9yICYmIG5hbWVFZGl0b3Iub3B0aW9uKCdkaXNhYmxlZCcsIGlzVGFyZ2V0VmFsdWUpO1xyXG4gIH07XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBmb3JtRGF0YTogbnVsbCxcclxuICAgIGNvbENvdW50OiAyLFxyXG4gICAgaXRlbXM6IFtcclxuICAgICAge1xyXG4gICAgICAgIGl0ZW1UeXBlOiAnZ3JvdXAnLFxyXG4gICAgICAgIGNhcHRpb246ICdTdWJ2YWx1ZXMgaXRlbXMnLFxyXG4gICAgICAgIHRlbXBsYXRlOiAoYXJncykgPT4ge1xyXG4gICAgICAgICAgY29uc3QgWyRjb250YWluZXIsIGxpc3RdID0gY3JlYXRlTGlzdEFuZFRvb2xiYXIoYXJncy5jb21wb25lbnQsIGdhdWdlSXRlbSk7XHJcbiAgICAgICAgICBpdGVtc0xpc3QgPSBsaXN0O1xyXG5cclxuICAgICAgICAgIHJldHVybiAkY29udGFpbmVyO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnc3VidmFsdWVFZGl0b3InLFxyXG4gICAgICAgIGNzc0NsYXNzOiBDU1NfQ0xBU1MsXHJcbiAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgICAgY2FwdGlvbjogJ0l0ZW0gb3B0aW9ucycsXHJcbiAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnbmFtZScsXHJcbiAgICAgICAgICAgIGNzc0NsYXNzOiBOQU1FX0lURU1fQ1NTX0NMQVNTLFxyXG4gICAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhUZXh0Qm94JyxcclxuICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIHZhbHVlQ2hhbmdlRXZlbnQ6ICdrZXl1cCdcclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VGV4dEJveC5Qcm9wZXJ0aWVzXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdpc0JvdW5kJyxcclxuICAgICAgICAgICAgY3NzQ2xhc3M6IElTX0JPVU5EX0lURU1fQ1NTX0NMQVNTLFxyXG4gICAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhSYWRpb0dyb3VwJyxcclxuICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIGRpc3BsYXlFeHByOiAndGV4dCcsXHJcbiAgICAgICAgICAgICAgdmFsdWVFeHByOiAndmFsdWUnLFxyXG4gICAgICAgICAgICAgIGxheW91dDogJ2hvcml6b250YWwnLFxyXG4gICAgICAgICAgICAgIGl0ZW1zOiBbe1xyXG4gICAgICAgICAgICAgICAgdGV4dDogJ1VuYm91bmQnLCB2YWx1ZTogZmFsc2VcclxuICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiAnQm91bmQnLCB2YWx1ZTogdHJ1ZVxyXG4gICAgICAgICAgICAgIH1dXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFJhZGlvR3JvdXAuUHJvcGVydGllcyxcclxuICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnVHlwZScsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICd2YWx1ZScsXHJcbiAgICAgICAgICAgIGNzc0NsYXNzOiBWQUxVRV9JVEVNX0NTU19DTEFTUyxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4TnVtYmVyQm94JyxcclxuICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnVmFsdWUnLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgc2hvd1NwaW5CdXR0b25zOiB0cnVlLFxyXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhOdW1iZXJCb3guUHJvcGVydGllc1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnbWVhc3VyZUlkJyxcclxuICAgICAgICAgICAgY3NzQ2xhc3M6IE1FQVNVUkVfSURfSVRFTV9DU1NfQ0xBU1MsXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeFNlbGVjdEJveCcsXHJcbiAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ0hpZGRlbiBtZWFzdXJlcycsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBkaXNwbGF5RXhwcjogJ3RleHQnLFxyXG4gICAgICAgICAgICAgIHZhbHVlRXhwcjogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICBpdGVtczogZ2F1Z2VJdGVtLmhpZGRlbk1lYXN1cmVzKCkubWFwKChtZWFzdXJlKSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgdGV4dDogZ2V0TWVhc3VyZURpc2FwbGF5VGV4dChtZWFzdXJlKSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBtZWFzdXJlLnVuaXF1ZU5hbWUoKVxyXG4gICAgICAgICAgICAgIH0pKSxcclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4U2VsZWN0Qm94LlByb3BlcnRpZXNcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICdjb2xvcicsXHJcbiAgICAgICAgICAgIGNzc0NsYXNzOiBDT0xPUl9JVEVNX0NTU19DTEFTUyxcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnY29sb3InLFxyXG4gICAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhDb2xvckJveCcsXHJcbiAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ0NvbG9yJyxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICBdXHJcbiAgICAgIH1cclxuICAgIF0sXHJcbiAgICBvbkNvbnRlbnRSZWFkeShlKSB7IHVwZGF0ZUZvcm1TdGF0ZShlLmNvbXBvbmVudCk7IH0sXHJcbiAgICBvbkZpZWxkRGF0YUNoYW5nZWQoZSkge1xyXG4gICAgICBjb25zdCBmb3JtRGF0YSA9IGUuY29tcG9uZW50Lm9wdGlvbignZm9ybURhdGEnKSBhcyBJU3VidmFsdWVPcHRpb25zO1xyXG4gICAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhnYXVnZUl0ZW0pO1xyXG4gICAgICBjb25zdCBlZGl0ZWRTdWJ2YWx1ZSA9IG9wdGlvbnMuc3VidmFsdWVzLmZpbHRlcigoc3VidmFsdWUpID0+IHN1YnZhbHVlLmtleSA9PT0gZm9ybURhdGEua2V5KVswXTtcclxuXHJcbiAgICAgIG9wdGlvbnMuc3VidmFsdWVzW29wdGlvbnMuc3VidmFsdWVzLmluZGV4T2YoZWRpdGVkU3VidmFsdWUpXSA9IGZvcm1EYXRhO1xyXG4gICAgICBzZXRPcHRpb25zKGdhdWdlSXRlbSwgb3B0aW9ucyk7XHJcblxyXG4gICAgICBpZiAoZWRpdGVkU3VidmFsdWUgJiYgZWRpdGVkU3VidmFsdWUubmFtZSAhPT0gZm9ybURhdGEubmFtZSAmJiBpdGVtc0xpc3QpIHtcclxuICAgICAgICBpdGVtc0xpc3QucmVwYWludCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHVwZGF0ZUZvcm1TdGF0ZShlLmNvbXBvbmVudCk7XHJcbiAgICB9LFxyXG4gIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldE1lYXN1cmVEaXNhcGxheVRleHQobWVhc3VyZTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuTWVhc3VyZSk6IHN0cmluZyB7XHJcbiAgaWYgKG1lYXN1cmUubmFtZSgpKSB7XHJcbiAgICByZXR1cm4gbWVhc3VyZS5uYW1lKCk7XHJcbiAgfVxyXG5cclxuICBsZXQgcmVzdWx0ID0gbWVhc3VyZS5kYXRhTWVtYmVyKCk7XHJcbiAgaWYgKG1lYXN1cmUuc3VtbWFyeVR5cGUgJiYgbWVhc3VyZS5zdW1tYXJ5VHlwZSgpKSB7XHJcbiAgICByZXN1bHQgKz0gYCAoJHttZWFzdXJlLnN1bW1hcnlUeXBlKCl9KWA7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRJbmRpY2F0b3JGb3JtT3B0aW9ucyhnYXVnZUl0ZW06IERldkV4cHJlc3MuRGFzaGJvYXJkLk1vZGVsLkdhdWdlSXRlbSk6IERldkV4cHJlc3MudWkuZHhGb3JtT3B0aW9ucyB7XHJcbiAgY29uc3QgY3VycmVudFZpZXdUeXBlID0gZ2F1Z2VJdGVtLnZpZXdUeXBlKCk7XHJcbiAgY29uc3QgaW5kaWNhdG9yVHlwZXMgPSBMSU5FQVJfVklFV19UWVBFUy5zb21lKCh0KSA9PiB0ID09PSBjdXJyZW50Vmlld1R5cGUpXHJcbiAgICA/IExJTkVBUl9JTkRJQ0FUT1JfVFlQRVNcclxuICAgIDogQ0lSQ0xVQVJfSU5ESUNBVE9SX1RZUEVTO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgZm9ybURhdGE6IGdldE9wdGlvbnMoZ2F1Z2VJdGVtKSB8fCBudWxsLFxyXG4gICAgaXRlbXM6IFtcclxuICAgICAge1xyXG4gICAgICAgIGNhcHRpb246ICdJbmRpY2F0b3Igb3B0aW9ucycsXHJcbiAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAndHlwZScsXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeFNlbGVjdEJveCcsXHJcbiAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ1R5cGUnLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgZGlzcGxheUV4cHI6ICd0ZXh0JyxcclxuICAgICAgICAgICAgICB2YWx1ZUV4cHI6ICd2YWx1ZScsXHJcbiAgICAgICAgICAgICAgaXRlbXM6IGluZGljYXRvclR5cGVzLm1hcCgodCkgPT4gKHsgdGV4dDogdCwgdmFsdWU6IHQgfSkpLFxyXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhTZWxlY3RCb3guUHJvcGVydGllc1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnd2lkdGgnLFxyXG4gICAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhOdW1iZXJCb3gnLFxyXG4gICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgc2hvd1NwaW5CdXR0b25zOiB0cnVlLFxyXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhOdW1iZXJCb3hPcHRpb25zLFxyXG4gICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdXaWR0aCcsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICAgIH1cclxuICAgIF0sXHJcbiAgICBvbkZpZWxkRGF0YUNoYW5nZWQoZSkge1xyXG4gICAgICBjb25zdCBmb3JtRGF0YSA9IGUuY29tcG9uZW50Lm9wdGlvbignZm9ybURhdGEnKSBhcyBJR2F1Z2VTdWJ2YWx1ZXNPcHRpb25zO1xyXG4gICAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhnYXVnZUl0ZW0pO1xyXG5cclxuICAgICAgb3B0aW9ucy53aWR0aCA9IGZvcm1EYXRhLndpZHRoO1xyXG4gICAgICBvcHRpb25zLnR5cGUgPSBmb3JtRGF0YS50eXBlO1xyXG5cclxuICAgICAgc2V0T3B0aW9ucyhnYXVnZUl0ZW0sIG9wdGlvbnMpO1xyXG4gICAgfVxyXG4gIH07XHJcbn1cclxuXHJcbi8vIDQuIEV2ZW50IFN1YnNjcmlwdGlvblxyXG5leHBvcnQgZnVuY3Rpb24gZ2F1Z2VTdWJ2YWx1ZXNFeHRlbnNpb24odGhpczogYW55LCBkYXNoYm9hcmRDb250cm9sOiBEZXZFeHByZXNzLkRhc2hib2FyZC5EYXNoYm9hcmRDb250cm9sKSB7XHJcbiAgdGhpcy5uYW1lID0gJ0dhdWdlU3VidmFsdWVzJztcclxuICB0aGlzLnN0YXJ0ID0gKCkgPT4ge1xyXG4gICAgY29uc3Qgdmlld2VyQXBpRXh0ZW5zaW9uID0gZGFzaGJvYXJkQ29udHJvbC5maW5kRXh0ZW5zaW9uKCd2aWV3ZXItYXBpJykgYXMgRGV2RXhwcmVzcy5EYXNoYm9hcmQuVmlld2VyQXBpRXh0ZW5zaW9uO1xyXG4gICAgaWYgKHZpZXdlckFwaUV4dGVuc2lvbikge1xyXG4gICAgICB2aWV3ZXJBcGlFeHRlbnNpb24ub24oJ2l0ZW1XaWRnZXRPcHRpb25zUHJlcGFyZWQnLCBvbkl0ZW1XaWRnZXRPcHRpb25zUHJlcGFyZWQpO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgb3B0aW9uc1BhbmVsRXh0ZW5zaW9uID0gZGFzaGJvYXJkQ29udHJvbC5maW5kRXh0ZW5zaW9uKCdpdGVtLW9wdGlvbnMtcGFuZWwnKSBhcyBhbnk7XHJcbiAgICBpZiAob3B0aW9uc1BhbmVsRXh0ZW5zaW9uKSB7XHJcbiAgICAgIG9wdGlvbnNQYW5lbEV4dGVuc2lvbi5vbignY3VzdG9taXplU2VjdGlvbnMnLCBvbkN1c3RvbWl6ZVNlY3Rpb25zKTtcclxuICAgIH1cclxuICB9O1xyXG4gIHRoaXMuc3RvcCA9ICgpID0+IHtcclxuICAgIGNvbnN0IHZpZXdlckFwaUV4dGVuc2lvbiA9IGRhc2hib2FyZENvbnRyb2wuZmluZEV4dGVuc2lvbigndmlld2VyLWFwaScpIGFzIERldkV4cHJlc3MuRGFzaGJvYXJkLlZpZXdlckFwaUV4dGVuc2lvbjtcclxuICAgIGlmICh2aWV3ZXJBcGlFeHRlbnNpb24pIHtcclxuICAgICAgdmlld2VyQXBpRXh0ZW5zaW9uLm9mZignaXRlbVdpZGdldE9wdGlvbnNQcmVwYXJlZCcsIG9uSXRlbVdpZGdldE9wdGlvbnNQcmVwYXJlZCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBvcHRpb25zUGFuZWxFeHRlbnNpb24gPSBkYXNoYm9hcmRDb250cm9sLmZpbmRFeHRlbnNpb24oJ2l0ZW0tb3B0aW9ucy1wYW5lbCcpIGFzIGFueTtcclxuICAgIGlmIChvcHRpb25zUGFuZWxFeHRlbnNpb24pIHtcclxuICAgICAgb3B0aW9uc1BhbmVsRXh0ZW5zaW9uLm9mZignY3VzdG9taXplU2VjdGlvbnMnLCBvbkN1c3RvbWl6ZVNlY3Rpb25zKTtcclxuICAgIH1cclxuICB9O1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBpbml0UG9wb3ZlciB9IGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVwb3J0RGV0YWlsc1BvcG92ZXInO1xyXG5pbXBvcnQgeyBJRGFzaGJvYXJkUGVybWlzc2lvbnMsIElEYXNoYm9hcmRVcmxzLCBJUmVwb3J0UGFyYW1zIH0gZnJvbSAnLi4vLi4vSVJlcG9ydFBhcmFtcyc7XHJcbmltcG9ydCB7IGdhdWdlU3VidmFsdWVzRXh0ZW5zaW9uIH0gZnJvbSAnLi9FeHRlbnNpb25zL0dhdWdlU3VidmFsdWVzRXh0ZW5zaW9uJztcclxuaW1wb3J0IFJlZnJlc2hCdXR0b24gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZWZyZXNoVGltZXIvQnV0dG9uJztcclxuaW1wb3J0IHtJUmVwb3J0Q29tcG9uZW50fSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcclxuXHJcbmNvbnN0IERBU0hCT0FSRF9NT0RFX0tFWSA9ICdEQVNIQk9BUkRfTU9ERV9LRVknO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGFzaGJvYXJkT3B0aW9ucyB7XHJcbiAgJGRhc2hib2FyZENvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcztcclxuICBwZXJtaXNzaW9uczogSURhc2hib2FyZFBlcm1pc3Npb25zO1xyXG4gIHVybHM6IElEYXNoYm9hcmRVcmxzO1xyXG4gIGFkZFJlZnJlc2hCdXR0b246IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhc2hib2FyZCBpbXBsZW1lbnRzIElSZXBvcnRDb21wb25lbnQge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgJGRhc2hib2FyZENvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcGVybWlzc2lvbnM6IElEYXNoYm9hcmRQZXJtaXNzaW9ucztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVybHM6IElEYXNoYm9hcmRVcmxzO1xyXG4gIHByaXZhdGUgcmVmcmVzaEJ1dHRvbjogUmVmcmVzaEJ1dHRvbiB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIGRhc2hib2FyZDogRGV2RXhwcmVzcy5EYXNoYm9hcmQuRGFzaGJvYXJkQ29udHJvbCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgcG9wb3ZlcjogRGV2RXhwcmVzcy51aS5keFBvcG92ZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlcG9ydElkOiBudW1iZXIgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhZGRSZWZyZXNoQnV0dG9uOiBib29sZWFuO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJRGFzaGJvYXJkT3B0aW9ucykge1xyXG4gICAgdGhpcy4kZGFzaGJvYXJkQ29udGFpbmVyID0gb3B0aW9ucy4kZGFzaGJvYXJkQ29udGFpbmVyO1xyXG4gICAgdGhpcy5hZGRSZWZyZXNoQnV0dG9uID0gb3B0aW9ucy5hZGRSZWZyZXNoQnV0dG9uO1xyXG4gICAgdGhpcy5yZXBvcnRQYXJhbXMgPSBvcHRpb25zLnJlcG9ydFBhcmFtcztcclxuICAgIHRoaXMucmVwb3J0SWQgPSBvcHRpb25zLnJlcG9ydFBhcmFtcy5SZXBvcnRJZDtcclxuICAgIHRoaXMucGVybWlzc2lvbnMgPSBvcHRpb25zLnBlcm1pc3Npb25zO1xyXG4gICAgdGhpcy51cmxzID0gb3B0aW9ucy51cmxzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoKTogdm9pZCB7XHJcbiAgICBsZXQgcmVwb3J0SWRTdHIgPSB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZCAmJiB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZC50b1N0cmluZygpO1xyXG5cclxuICAgIERldkV4cHJlc3MuRGFzaGJvYXJkLlJlc291cmNlTWFuYWdlci5lbWJlZEJ1bmRsZWRSZXNvdXJjZXMoKTtcclxuXHJcbiAgICBsZXQgbW9kZTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuV29ya2luZ01vZGUgPSB0aGlzLnBlcm1pc3Npb25zLkFsbG93RWRpdGluZ1xyXG4gICAgICA/IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpKSBhcyBEZXZFeHByZXNzLkRhc2hib2FyZC5Xb3JraW5nTW9kZSB8fCAnVmlld2VyJ1xyXG4gICAgICA6ICdWaWV3ZXInO1xyXG5cclxuICAgIGlmICh0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMucG9wb3ZlciA9IGluaXRQb3BvdmVyKCcucmVwb3J0LWRldGFpbHMtbGluaycsIHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE5PVEU6IERhc2hib2FyZCAxOC4xIGRvZXNuJ3Qgc3VwcG9ydCBleHBvcnQuIFdlIGhpZGUgdGhlIGV4cG9ydCBidXR0b24gdmlhIHN0eWxlc1xyXG4gICAgdGhpcy5kYXNoYm9hcmQgPSBuZXcgRGV2RXhwcmVzcy5EYXNoYm9hcmQuRGFzaGJvYXJkQ29udHJvbCh0aGlzLiRkYXNoYm9hcmRDb250YWluZXJbMF0sIHtcclxuICAgICAgd29ya2luZ01vZGU6IG1vZGUsXHJcbiAgICAgIGluaXRpYWxEYXNoYm9hcmRJZDogcmVwb3J0SWRTdHIsXHJcbiAgICAgIGVuZHBvaW50OiB0aGlzLnVybHMuRW5kUG9pbnQsXHJcbiAgICAgIGFqYXhSZW1vdGVTZXJ2aWNlOiB7XHJcbiAgICAgICAgaGVhZGVyczogIXRoaXMucmVwb3J0UGFyYW1zLlRva2VuID8gdW5kZWZpbmVkIDoge1xyXG4gICAgICAgICAgdG9rZW46IHRoaXMucmVwb3J0UGFyYW1zLlRva2VuXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvbkRhc2hib2FyZEluaXRpYWxpemluZzogKGUpID0+IHtcclxuICAgICAgICBlLmNvbXBvbmVudC5yZWdpc3RlckV4dGVuc2lvbihuZXcgZ2F1Z2VTdWJ2YWx1ZXNFeHRlbnNpb24oZS5jb21wb25lbnQpKTtcclxuXHJcbiAgICAgICAgaWYgKHJlcG9ydElkU3RyICE9PSBlLmRhc2hib2FyZElkKSB7XHJcbiAgICAgICAgICByZXBvcnRJZFN0ciA9IGUuZGFzaGJvYXJkSWQ7XHJcbiAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGVuY29kZVVSSSh0aGlzLnVybHMuUHJldmlld1VybCArIGUuZGFzaGJvYXJkSWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgb25CZWZvcmVSZW5kZXI6IChlKSA9PiB7XHJcbiAgICAgICAgZS5jb21wb25lbnQucmVnaXN0ZXJFeHRlbnNpb24obmV3IERldkV4cHJlc3MuRGFzaGJvYXJkLkRlc2lnbmVyLlRleHRCb3hJdGVtRWRpdG9yRXh0ZW5zaW9uKGUuY29tcG9uZW50KSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGV4dGVuc2lvbnM6IHtcclxuICAgICAgICAnZGF0YS1zb3VyY2Utd2l6YXJkJzoge1xyXG4gICAgICAgICAgZW5hYmxlQ3VzdG9tU3FsOiB0cnVlXHJcbiAgICAgICAgfSxcclxuICAgICAgICAnZGFzaGJvYXJkLWV4cG9ydCc6IHtcclxuICAgICAgICAgIGFsbG93RXhwb3J0RGFzaGJvYXJkSXRlbXM6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgICdkYXRhLWluc3BlY3Rvcic6IHtcclxuICAgICAgICAgIGFsbG93SW5zcGVjdEFnZ3JlZ2F0ZWREYXRhOiB0cnVlLFxyXG4gICAgICAgICAgYWxsb3dJbnNwZWN0UmF3RGF0YTogdHJ1ZSxcclxuICAgICAgICAgIG9uR3JpZEluaXRpYWxpemVkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBncmlkID0gZS5jb21wb25lbnQgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG4gICAgICAgICAgICBncmlkLm9wdGlvbignZXhwb3J0LmVuYWJsZWQnLCB0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZGFzaGJvYXJkLnJlbmRlcigpO1xyXG5cclxuICAgIGlmICh0aGlzLnBlcm1pc3Npb25zLkFsbG93RWRpdGluZykge1xyXG4gICAgICBjb25zdCBidXR0b24gPSAkKCcuc3dpdGNoLW1vZGUtYnRuJykuZHhCdXR0b24oe1xyXG4gICAgICAgIHRleHQ6IG1vZGUgPT09ICdWaWV3ZXInID8gJ1N3aXRjaCB0byBEZXNpZ25lcicgOiAnU3dpdGNoIHRvIFZpZXdlcicsXHJcbiAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgbW9kZSA9IG1vZGUgPT09ICdWaWV3ZXInID8gJ0Rlc2lnbmVyJyA6ICdWaWV3ZXInO1xyXG5cclxuICAgICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpLCBtb2RlKTtcclxuXHJcbiAgICAgICAgICBpZiAobW9kZSA9PT0gJ1ZpZXdlcicpIHtcclxuICAgICAgICAgICAgdGhpcy5kYXNoYm9hcmQuc3dpdGNoVG9WaWV3ZXIoKTtcclxuICAgICAgICAgICAgYnV0dG9uLm9wdGlvbigndGV4dCcsICdTd2l0Y2ggdG8gRGVzaWduZXInKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGFzaGJvYXJkLnN3aXRjaFRvRGVzaWduZXIoKTtcclxuICAgICAgICAgICAgYnV0dG9uLm9wdGlvbigndGV4dCcsICdTd2l0Y2ggdG8gVmlld2VyJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1tZCcpLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG5cclxuICAgICAgcmVtb3ZlUmVkdW5kYW50VG9vbGJveEl0ZW1zKHRoaXMuZGFzaGJvYXJkKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFkZFJlZnJlc2hCdXR0b24gJiYgKHRoaXMucmVmcmVzaEJ1dHRvbiA9IG5ldyBSZWZyZXNoQnV0dG9uKCQoJy5yZXBvcnQtcmVmcmVzaC1idXR0b24nKSwgKCkgPT4gdGhpcy5yZWZyZXNoKCkpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYXNoYm9hcmQ/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMuZGFzaGJvYXJkID0gbnVsbDtcclxuXHJcbiAgICB0aGlzLnBvcG92ZXI/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMucG9wb3ZlciA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNlc3Npb25LZXkoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBEQVNIQk9BUkRfTU9ERV9LRVkgKyB0aGlzLnJlcG9ydElkO1xyXG4gIH1cclxuXHJcbiAgcmVmcmVzaCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGFzaGJvYXJkPy5yZWZyZXNoKCk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiByZW1vdmVSZWR1bmRhbnRUb29sYm94SXRlbXMoY29udHJvbDogRGV2RXhwcmVzcy5EYXNoYm9hcmQuRGFzaGJvYXJkQ29udHJvbCkge1xyXG4gIGNvbnN0IGl0ZW1zVG9SZW1vdmUgPSBbJ2NyZWF0ZS1kYXNoYm9hcmQnLCAnb3Blbi1kYXNoYm9hcmQnXTtcclxuICBjb25zdCB0b29sYm94ID0gY29udHJvbC5maW5kRXh0ZW5zaW9uKCd0b29sYm94JykgYXMgRGV2RXhwcmVzcy5EYXNoYm9hcmQuRGVzaWduZXIuVG9vbGJveEV4dGVuc2lvbjtcclxuICBpdGVtc1RvUmVtb3ZlLmZvckVhY2goKGl0ZW1JZCkgPT4ge1xyXG4gICAgY29uc3QgaXRlbSA9IHRvb2xib3gubWVudUl0ZW1zKCkuZmlsdGVyKChpKSA9PiBpLmlkID09PSBpdGVtSWQpWzBdO1xyXG5cclxuICAgIGlmIChpdGVtKSB7XHJcbiAgICAgIHRvb2xib3gucmVtb3ZlTWVudUl0ZW0oaXRlbUlkKTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSVJlcG9ydFBhcmFtcywgTW9kZSB9IGZyb20gJy4uLy4uL0lSZXBvcnRQYXJhbXMnO1xyXG5pbXBvcnQgeyBJUmVwb3J0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vSVJlcG9ydENvbXBvbmVudCc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHsgR3JpZERhdGFDb2x1bW5EYXRhVHlwZSB9IGZyb20gJy4uLy4uLy4uL1dpZGdldHMvSUdyaWRTdGF0ZSc7XHJcbmltcG9ydCB7IGluaXRQb3BvdmVyIH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZXBvcnREZXRhaWxzUG9wb3Zlcic7XHJcbmltcG9ydCBSZWZyZXNoQnV0dG9uIGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVmcmVzaFRpbWVyL0J1dHRvbic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHYW50dENoYXJ0T3B0aW9ucyB7XHJcbiAgY2hhcnRQb3NpdGlvbk1hcmtlcjogSlF1ZXJ5O1xyXG4gIGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XHJcbiAgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxuICBnYW50dFJlcG9ydENvbnRyb2xsZXJVcmw6IHN0cmluZztcclxuICBzaG93SGVhZGVyOiBib29sZWFuO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdhbnR0VGFzayB7XHJcbiAgSWQ6IG51bWJlcjtcclxuICBQYXJlbnRJZDogbnVtYmVyO1xyXG4gIFRpdGxlOiBzdHJpbmc7XHJcbiAgU3RhcnQ6IERhdGU7XHJcbiAgRW5kOiBEYXRlO1xyXG4gIFByb2dyZXNzOiBudW1iZXI7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR2FudHREZXBlbmRlbmN5XHJcbntcclxuICBJZDogbnVtYmVyO1xyXG4gIFByZWRlY2Vzc29ySWQ6IG51bWJlcjtcclxuICBTdWNjZXNzb3JJZDogbnVtYmVyO1xyXG4gIFR5cGU6IG51bWJlcjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElHYW50dFJlc291cmNlIHtcclxuICBJZDogbnVtYmVyO1xyXG4gIFRleHQ6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIElHYW50dFJlc291cmNlQXNzaWdubWVudCB7XHJcbiAgSWQ6IG51bWJlcjtcclxuICBUYXNrSWQ6IG51bWJlcjtcclxuICBSZXNvdXJjZUlkOiBudW1iZXI7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR2FudHRDaGFydERhdGFNb2RlbCB7XHJcbiAgVGFza3M6IElHYW50dFRhc2tbXTtcclxuICBEZXBlbmRlbmNpZXM6IElHYW50dERlcGVuZGVuY3lbXTtcclxuICBSZXNvdXJjZXM6IElHYW50dFJlc291cmNlW107XHJcbiAgUmVzb3VyY2VBc3NpZ25tZW50czogSUdhbnR0UmVzb3VyY2VBc3NpZ25tZW50W107XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR2FudHRDb2x1bW5TdGF0ZSB7XHJcbiAgZGF0YUZpZWxkPzogc3RyaW5nO1xyXG4gIGRhdGFUeXBlPzogR3JpZERhdGFDb2x1bW5EYXRhVHlwZTtcclxuICB3aWR0aD86IHN0cmluZztcclxuICBzb3J0SW5kZXg/OiBudW1iZXI7XHJcbiAgc29ydE9yZGVyPzogc3RyaW5nO1xyXG4gIGNhcHRpb24/OiBzdHJpbmc7XHJcbiAgdmlzaWJsZT86IGJvb2xlYW47XHJcbiAgdmlzaWJsZUluZGV4PzogbnVtYmVyO1xyXG4gIHRhc2tDb2x1bW5UeXBlOiBHYW50dFRhc2tzQ29sdW1uVHlwZTtcclxufVxyXG5cclxuaW50ZXJmYWNlIElHYW50dFNldHRpbmdzIHtcclxuICBUYXNrQ29sdW1uczogSUdhbnR0Q29sdW1uU3RhdGVbXSxcclxuICBEYkNvbm5lY3Rpb25OYW1lOiBzdHJpbmcsXHJcbiAgVGFibGVOYW1lOiBzdHJpbmcsXHJcbiAgUmVzb3VyY2VzVGFibGVOYW1lOiBzdHJpbmcsXHJcbiAgUmVzb3VyY2VzS2V5RmllbGQ6IHN0cmluZyxcclxuICBSZXNvdXJjZXNUZXh0RmllbGQ6IHN0cmluZyxcclxuICBSZXNvdXJjZUFzc2lnbm1lbnRUYWJsZU5hbWU6IHN0cmluZztcclxuICBSZXNvdXJjZUFzc2lnbm1lbnRLZXlGaWVsZDogc3RyaW5nO1xyXG4gIFJlc291cmNlQXNzaWdubWVudFRhc2tJZEZpZWxkOiBzdHJpbmc7XHJcbiAgUmVzb3VyY2VBc3NpZ25tZW50UmVzb3VyY2VJZEZpZWxkOiBzdHJpbmc7XHJcbiAgRGVwZW5kZW5jaWVzVGFibGVOYW1lOiBzdHJpbmc7XHJcbiAgRGVwZW5kZW5jaWVzS2V5RmllbGQ6IHN0cmluZztcclxuICBEZXBlbmRlbmNpZXNQcmVkZWNlc3NvcklkRmllbGQ6IHN0cmluZztcclxuICBEZXBlbmRlbmNpZXNTdWNjZXNzb3JJZEZpZWxkOiBzdHJpbmc7XHJcbiAgRGVwZW5kZW5jaWVzVHlwZUZpZWxkOiBzdHJpbmc7XHJcblxyXG4gIFRhc2tUaXRsZVBvc2l0aW9uOiBEZXZFeHByZXNzLnVpLmR4R2FudHQuR2FudHRUYXNrVGl0bGVQb3NpdGlvbjtcclxuICBTY2FsZVR5cGU6IERldkV4cHJlc3MudWkuZHhHYW50dC5HYW50dFNjYWxlVHlwZTtcclxuICBTdGFydERhdGVSYW5nZTogc3RyaW5nO1xyXG4gIEVuZERhdGVSYW5nZTogc3RyaW5nO1xyXG59XHJcblxyXG5lbnVtIEdhbnR0VGFza3NDb2x1bW5UeXBlXHJcbntcclxuICBLZXkgPSAxLFxyXG4gIFRpdGxlID0gMixcclxuICBTdGFydCA9IDMsXHJcbiAgRW5kID0gNCxcclxuICBQYXJlbnRJZCA9IDUsXHJcbiAgUHJvZ3Jlc3MgPSA2XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhbm50Q2hhcnQgaW1wbGVtZW50cyBJUmVwb3J0Q29tcG9uZW50IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IFNXSVRDSF9UT19ERVNJR05FUl9URVhUID0gJ1N3aXRjaCB0byBEZXNpZ25lcic7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBTV0lUQ0hfVE9fVklFV0VSX1RFWFQgPSAnU3dpdGNoIHRvIFZpZXdlcic7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBDSEFSVF9TVE9SQUdFX01PREVfS0VZID0gJ0NIQVJUX1NUT1JBR0VfTU9ERV9LRVknO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGNoYXJ0UG9zaXRpb25NYXJrZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGFkZFJlZnJlc2hCdXR0b246IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBnYW50dFJlcG9ydENvbnRyb2xsZXJVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHNob3dIZWFkZXI6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBwb3BvdmVyOiBEZXZFeHByZXNzLnVpLmR4UG9wb3ZlciB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIG1vZGU6IE1vZGU7XHJcbiAgcHJpdmF0ZSBoYXNGb3JtID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgY2hhcnQ6IERldkV4cHJlc3MudWkuZHhHYW50dCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJR2FudHRDaGFydE9wdGlvbnMpIHtcclxuICAgIHRoaXMuY2hhcnRQb3NpdGlvbk1hcmtlciA9IG9wdGlvbnMuY2hhcnRQb3NpdGlvbk1hcmtlcjtcclxuICAgIHRoaXMucmVwb3J0UGFyYW1zID0gb3B0aW9ucy5yZXBvcnRQYXJhbXM7XHJcbiAgICB0aGlzLmFkZFJlZnJlc2hCdXR0b24gPSBvcHRpb25zLmFkZFJlZnJlc2hCdXR0b247XHJcbiAgICB0aGlzLmFsbG93RWRpdGluZyA9IG9wdGlvbnMuYWxsb3dFZGl0aW5nO1xyXG4gICAgdGhpcy5nYW50dFJlcG9ydENvbnRyb2xsZXJVcmwgPSBvcHRpb25zLmdhbnR0UmVwb3J0Q29udHJvbGxlclVybDtcclxuICAgIHRoaXMuc2hvd0hlYWRlciA9IG9wdGlvbnMuc2hvd0hlYWRlcjtcclxuICAgIHRoaXMubW9kZSA9IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpKSBhcyBNb2RlIHx8IE1vZGUuVmlld2VyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoKTogdm9pZCB7XHJcbiAgICBsZXQgZ2FudHRTZXR0aW5nczogSUdhbnR0U2V0dGluZ3MgPSB7XHJcbiAgICAgIERiQ29ubmVjdGlvbk5hbWU6ICcnLCBUYWJsZU5hbWU6ICcnLCBUYXNrQ29sdW1uczogW10sXHJcbiAgICAgIFJlc291cmNlc1RhYmxlTmFtZTogJycsIFJlc291cmNlc1RleHRGaWVsZDogJycsIFJlc291cmNlc0tleUZpZWxkOiAnJyxcclxuICAgICAgUmVzb3VyY2VBc3NpZ25tZW50VGFza0lkRmllbGQ6ICcnLCBSZXNvdXJjZUFzc2lnbm1lbnRSZXNvdXJjZUlkRmllbGQ6ICcnLCBSZXNvdXJjZUFzc2lnbm1lbnRLZXlGaWVsZDogJycsIFJlc291cmNlQXNzaWdubWVudFRhYmxlTmFtZTogJycsXHJcbiAgICAgIERlcGVuZGVuY2llc0tleUZpZWxkOiAnJywgRGVwZW5kZW5jaWVzUHJlZGVjZXNzb3JJZEZpZWxkOiAnJywgRGVwZW5kZW5jaWVzU3VjY2Vzc29ySWRGaWVsZDogJycsIERlcGVuZGVuY2llc1RhYmxlTmFtZTogJycsIERlcGVuZGVuY2llc1R5cGVGaWVsZDogJycsXHJcbiAgICAgIEVuZERhdGVSYW5nZTogdm9pZCAwLCBTdGFydERhdGVSYW5nZTogdm9pZCAwLCBUYXNrVGl0bGVQb3NpdGlvbjogJ291dHNpZGUnLCBTY2FsZVR5cGU6ICdhdXRvJ1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBjb2x1bW5zOiBJR2FudHRDb2x1bW5TdGF0ZVtdID0gW107XHJcbiAgICBsZXQgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG5cclxuICAgIHNlbmRSZXF1ZXN0KGAke3RoaXMuZ2FudHRSZXBvcnRDb250cm9sbGVyVXJsfS9HZXRHYW50dENoYXJ0U2V0dGluZ3NgLCAncG9zdCcsIHsgaWQ6IHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkIH0sIGZhbHNlLCB7IGRhdGFUeXBlOiAnanNvbicgfSlcclxuICAgICAgLnRoZW4oKGRhdGE6IElHYW50dFNldHRpbmdzKSA9PiB7XHJcbiAgICAgICAgZ2FudHRTZXR0aW5ncyA9IGRhdGE7XHJcblxyXG4gICAgICAgIGlmKCFnYW50dFNldHRpbmdzLkRiQ29ubmVjdGlvbk5hbWUgfHwgIWdhbnR0U2V0dGluZ3MuVGFibGVOYW1lIHx8ICFnYW50dFNldHRpbmdzLlRhc2tDb2x1bW5zIHx8ICFnYW50dFNldHRpbmdzLlRhc2tDb2x1bW5zLmxlbmd0aCkge1xyXG4gICAgICAgICAgZ2FudHRTZXR0aW5ncy5UYXNrQ29sdW1ucyA9IFtdO1xyXG5cclxuICAgICAgICAgIGZvciAobGV0IGl0ZW0gPSAwOyBpdGVtIDwgNjsgaXRlbSsrKSB7XHJcbiAgICAgICAgICAgIGdhbnR0U2V0dGluZ3MuVGFza0NvbHVtbnMucHVzaCh7IHRhc2tDb2x1bW5UeXBlOiBHYW50dFRhc2tzQ29sdW1uVHlwZVtHYW50dFRhc2tzQ29sdW1uVHlwZVtpdGVtKzFdXSB9KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnNldHVwRm9ybShnYW50dFNldHRpbmdzLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkYXRhLlRhc2tDb2x1bW5zLmZvckVhY2goKGMpID0+IHtcclxuICAgICAgICAgIGNvbHVtbnNbYy50YXNrQ29sdW1uVHlwZS0xXSA9IGM7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGdhbnR0U2V0dGluZ3MuVGFza0NvbHVtbnMgPSBjb2x1bW5zO1xyXG5cclxuICAgICAgICBpc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hEYXRhKCk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC50aGVuKChkYXRhOiB7IERhdGE6IElHYW50dENoYXJ0RGF0YU1vZGVsIH0pID0+IHtcclxuICAgICAgICBpZighaXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYodGhpcy5tb2RlID09PSBNb2RlLkRlc2lnbmVyKSB7XHJcbiAgICAgICAgICB0aGlzLnNldHVwRm9ybShnYW50dFNldHRpbmdzLCAhaXNJbml0aWFsaXplZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldHVwQ2hhcnQoY29sdW1ucywgZ2FudHRTZXR0aW5ncyk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVEYXRhKGRhdGEuRGF0YSk7XHJcbiAgICAgIH0pLmNhdGNoKCgpID0+IHtcclxuICAgICAgICB0aGlzLnNldHVwRm9ybShnYW50dFNldHRpbmdzLCB0cnVlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICh0aGlzLmFsbG93RWRpdGluZykge1xyXG4gICAgICB0aGlzLmluaXRTd2l0Y2hNb2RlQnV0dG9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpIHtcclxuICAgICAgdGhpcy5wb3BvdmVyID0gaW5pdFBvcG92ZXIoJy5kaWFncmFtLWRldGFpbHMtbGluaycsIHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmZXRjaERhdGEoKSB7XHJcbiAgICByZXR1cm4gc2VuZFJlcXVlc3QoYCR7dGhpcy5nYW50dFJlcG9ydENvbnRyb2xsZXJVcmx9L0dldEdhbnR0Q2hhcnREYXRhYCwgJ3Bvc3QnLCB7IGlkOiB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZCB9LCBmYWxzZSwge1xyXG4gICAgICBkYXRhVHlwZTogJ2pzb24nXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdFN3aXRjaE1vZGVCdXR0b24oKSB7XHJcbiAgICBjb25zdCBidXR0b24gPSAkKCcuc3dpdGNoLW1vZGUtYnRuJykuZHhCdXR0b24oe1xyXG4gICAgICB0ZXh0OiB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gdGhpcy5TV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IHRoaXMuU1dJVENIX1RPX1ZJRVdFUl9URVhULFxyXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tb2RlID0gdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IE1vZGUuRGVzaWduZXIgOiBNb2RlLlZpZXdlcjtcclxuICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSwgdGhpcy5tb2RlKTtcclxuICAgICAgICBidXR0b24ub3B0aW9uKCd0ZXh0JywgdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IHRoaXMuU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgOiB0aGlzLlNXSVRDSF9UT19WSUVXRVJfVEVYVCk7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gICAgICB9XHJcbiAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1tZCcpLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEZvcm0oZ2FudHRTZXR0aW5nczogSUdhbnR0U2V0dGluZ3MsIGluaXRpYWxTZXR1cDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5oYXNGb3JtID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCBmb3JtSXRlbXM6IERldkV4cHJlc3MudWkuZHhGb3JtLkl0ZW1bXSA9IFtcclxuICAgICAgeyBkYXRhRmllbGQ6ICdEYkNvbm5lY3Rpb25OYW1lJywgY2FwdGlvbjogJ0Nvbm5lY3Rpb24gTmFtZScgfSxcclxuICAgICAgeyBkYXRhRmllbGQ6ICdUYWJsZU5hbWUnLCBjYXB0aW9uOiAnVGFibGUnIH0sXHJcbiAgICBdO1xyXG5cclxuICAgIGZvciAobGV0IGl0ZW0gPSAxOyBpdGVtIDwgNzsgaXRlbSsrKSB7XHJcbiAgICAgIGZvcm1JdGVtcy5wdXNoKHsgaXRlbVR5cGU6ICdncm91cCcsIGNvbENvdW50OiA4LCBpdGVtczogW1xyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLnRhc2tDb2x1bW5UeXBlYCwgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS5kYXRhRmllbGRgLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6IGAke0dhbnR0VGFza3NDb2x1bW5UeXBlW2l0ZW1dfSBEYXRhIEZpZWxkYCB9IH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0uY2FwdGlvbmAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ0NhcHRpb24nIH0gfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS5kYXRhVHlwZWAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ0RhdGFUeXBlJyB9IH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0ud2lkdGhgLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdXaWR0aCcgfSwgZWRpdG9yVHlwZTogJ2R4TnVtYmVyQm94JyB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLnNvcnRJbmRleGAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1NvcnRJbmRleCcgfSwgZWRpdG9yVHlwZTogJ2R4TnVtYmVyQm94JyB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLnNvcnRPcmRlcmAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1NvcnRPcmRlcicgfSwgZWRpdG9yVHlwZTogJ2R4U2VsZWN0Qm94JywgZWRpdG9yT3B0aW9uczogeyBpdGVtczogWydhc2MnLCAnZGVzYyddLCBzaG93Q2xlYXJCdXR0b246IHRydWUgfSBhcyBEZXZFeHByZXNzLnVpLmR4U2VsZWN0Qm94LlByb3BlcnRpZXMgfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS52aXNpYmxlYCwgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnVmlzaWJsZScgfSwgZWRpdG9yVHlwZTogJ2R4Q2hlY2tCb3gnIH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0udmlzaWJsZUluZGV4YCwgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnVmlzaWJsZUluZGV4JyB9IH0sXHJcbiAgICAgICAgXVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmb3JtSXRlbXMucHVzaCh7XHJcbiAgICAgIGl0ZW1UeXBlOiAnZ3JvdXAnLFxyXG4gICAgICBjYXB0aW9uOiAnUmVzb3VyY2VzJyxcclxuICAgICAgY29sQ291bnQ6IDQsXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdSZXNvdXJjZXNUYWJsZU5hbWUnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcgLHRleHQ6ICdUYWJsZScgfSwgY29sU3BhbjogMiB9LFxyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnUmVzb3VyY2VzS2V5RmllbGQnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdLZXkgRmllbGQnIH0gfSxcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ1Jlc291cmNlc1RleHRGaWVsZCcsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1RleHQgRmllbGQnIH0gfSxcclxuICAgICAgXVxyXG4gICAgfSk7XHJcblxyXG4gICAgZm9ybUl0ZW1zLnB1c2goe1xyXG4gICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgY2FwdGlvbjogJ1Jlc291cmNlIEFzc2lnbm1lbnRzJyxcclxuICAgICAgY29sQ291bnQ6IDUsXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdSZXNvdXJjZUFzc2lnbm1lbnRUYWJsZU5hbWUnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdUYWJsZScgfSwgY29sU3BhbjogMiB9LFxyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnUmVzb3VyY2VBc3NpZ25tZW50S2V5RmllbGQnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdLZXkgRmllbGQnIH0gfSxcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ1Jlc291cmNlQXNzaWdubWVudFRhc2tJZEZpZWxkJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnVGFzayBJZCBGaWVsZCcgfSB9LFxyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnUmVzb3VyY2VBc3NpZ25tZW50UmVzb3VyY2VJZEZpZWxkJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnUmVzb3VyY2UgSWQgRmllbGQnIH0gfSxcclxuICAgICAgXVxyXG4gICAgfSk7XHJcblxyXG4gICAgZm9ybUl0ZW1zLnB1c2goe1xyXG4gICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgY2FwdGlvbjogJ0RlcGVuZGVuY2llcycsXHJcbiAgICAgIGNvbENvdW50OiA2LFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnRGVwZW5kZW5jaWVzVGFibGVOYW1lJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnVGFibGUnIH0sIGNvbFNwYW46IDIgfSxcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ0RlcGVuZGVuY2llc0tleUZpZWxkJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnS2V5IEZpZWxkJyB9IH0sXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdEZXBlbmRlbmNpZXNQcmVkZWNlc3NvcklkRmllbGQnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdQcmVkZWNlc3NvciBJZCBGaWVsZCcgfSB9LFxyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnRGVwZW5kZW5jaWVzU3VjY2Vzc29ySWRGaWVsZCcsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1N1Y2Nlc3NvciBJZCBGaWVsZCcgfSB9LFxyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnRGVwZW5kZW5jaWVzVHlwZUZpZWxkJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnRGVwZW5kZW5jeSBUeXBlIEZpZWxkJyB9IH1cclxuICAgICAgXVxyXG4gICAgfSk7XHJcblxyXG4gICAgZm9ybUl0ZW1zLnB1c2goe1xyXG4gICAgICBpdGVtVHlwZTogJ2J1dHRvbicsXHJcbiAgICAgIGJ1dHRvbk9wdGlvbnM6IHtcclxuICAgICAgICB0ZXh0OiAnU2F2ZScsXHJcbiAgICAgICAgb25DbGljazogKCkgPT4gdGhpcy5zYXZlRm9ybURhdGEoZm9ybSkudGhlbigoKSA9PiB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCkpXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGZvcm1JdGVtcy5wdXNoKFxyXG4gICAgICB7XHJcbiAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgICAgY2FwdGlvbjogJ0FwcGVhcmFuY2UnLFxyXG4gICAgICAgIGNvbENvdW50OiA1LFxyXG4gICAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogJ1Rhc2tUaXRsZVBvc2l0aW9uJyxcclxuICAgICAgICAgICAgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnIH0sXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeFNlbGVjdEJveCcsXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBpdGVtczogWydpbnNpZGUnLCAnb3V0c2lkZScsICdub25lJ11cclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4U2VsZWN0Qm94LlByb3BlcnRpZXNcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogJ1NjYWxlVHlwZScsXHJcbiAgICAgICAgICAgIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJyB9LFxyXG4gICAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhTZWxlY3RCb3gnLFxyXG4gICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgaXRlbXM6IFsnYXV0bycsICdtaW51dGVzJywgJ2hvdXJzJywgJ2RheXMnLCAnd2Vla3MnLCAnbW9udGhzJywgJ3F1YXJ0ZXJzJywgJ3llYXJzJ11cclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4U2VsZWN0Qm94LlByb3BlcnRpZXNcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogJ1N0YXJ0RGF0ZVJhbmdlJyxcclxuICAgICAgICAgICAgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnIH0sXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeERhdGVCb3gnLFxyXG4gICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7IHNob3dDbGVhckJ1dHRvbjogdHJ1ZSB9IGFzIERldkV4cHJlc3MudWkuZHhEYXRlQm94LlByb3BlcnRpZXNcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogJ0VuZERhdGVSYW5nZScsXHJcbiAgICAgICAgICAgIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJyB9LFxyXG4gICAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhEYXRlQm94JyxcclxuICAgICAgICAgICAgZWRpdG9yT3B0aW9uczogeyBzaG93Q2xlYXJCdXR0b246IHRydWUgfSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0ZUJveC5Qcm9wZXJ0aWVzXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtVHlwZTogJ2J1dHRvbicsXHJcbiAgICAgICAgICAgIGJ1dHRvbk9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnVXBkYXRlJyxcclxuICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZighdGhpcy5jaGFydCkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gZm9ybS5vcHRpb24oJ2Zvcm1EYXRhJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFydC5iZWdpblVwZGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFydC5vcHRpb24oe1xyXG4gICAgICAgICAgICAgICAgICBzY2FsZVR5cGU6IGRhdGEuU2NhbGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICB0YXNrVGl0bGVQb3NpdGlvbjogZGF0YS5UYXNrVGl0bGVQb3NpdGlvbixcclxuICAgICAgICAgICAgICAgICAgc3RhcnREYXRlUmFuZ2U6IGRhdGEuU3RhcnREYXRlUmFuZ2UgPyBuZXcgRGF0ZShkYXRhLlN0YXJ0RGF0ZVJhbmdlKSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgIGVuZERhdGVSYW5nZTogZGF0YS5FbmREYXRlUmFuZ2UgPyBuZXcgRGF0ZShkYXRhLkVuZERhdGVSYW5nZSkgOiBudWxsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0LmVuZFVwZGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFydC5yZXBhaW50KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlRm9ybURhdGEoZm9ybSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGZvcm0gPSAkKCc8ZGl2IC8+JykuY3NzKCdwYWRkaW5nJywgMjApLmluc2VydEFmdGVyKHRoaXMuY2hhcnRQb3NpdGlvbk1hcmtlcikuZHhGb3JtKHtcclxuICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgaGVpZ2h0OiBpbml0aWFsU2V0dXAgPyAnY2FsYygxMDAlIC0gNTBweCknIDogJ2NhbGMoNTAlIC0gNTBweCknLFxyXG4gICAgICBmb3JtRGF0YTogZ2FudHRTZXR0aW5ncyxcclxuICAgICAgc2Nyb2xsaW5nRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgaXRlbXM6IGZvcm1JdGVtc1xyXG4gICAgfSkuZHhGb3JtKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzYXZlRm9ybURhdGEoZm9ybTogRGV2RXhwcmVzcy51aS5keEZvcm0pIHtcclxuICAgIGNvbnN0IGRhdGEgPSBmb3JtLm9wdGlvbignZm9ybURhdGEnKSBhcyBJR2FudHRTZXR0aW5ncztcclxuXHJcbiAgICBpZiAoZGF0YS5UYXNrQ29sdW1ucykge1xyXG4gICAgICBkYXRhLlRhc2tDb2x1bW5zID0gZGF0YS5UYXNrQ29sdW1ucy5maWx0ZXIoKGMpID0+ICEhYy5kYXRhRmllbGQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzZW5kUmVxdWVzdChgJHt0aGlzLmdhbnR0UmVwb3J0Q29udHJvbGxlclVybH0vVXBkYXRlR2FudHRDaGFydFNldHRpbmdzYCwgJ3Bvc3QnLCB7XHJcbiAgICAgIGlkOiB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZCxcclxuICAgICAgc2V0dGluZ3M6IEpTT04uc3RyaW5naWZ5KGZvcm0ub3B0aW9uKCdmb3JtRGF0YScpKVxyXG4gICAgfSwgdHJ1ZSwgeyBkYXRhVHlwZTogJ2pzb24nIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cENoYXJ0IChjb2x1bW5zOiBJR2FudHRDb2x1bW5TdGF0ZVtdLCBnYW50dFNldHRpbmdzOiBJR2FudHRTZXR0aW5ncykge1xyXG4gICAgbGV0IHRvdGFsV2lkdGggPSAwO1xyXG4gICAgbGV0IHVzZUF1dG9XaWR0aCA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0IGNvbHVtbnNNYXBwaW5nID0ge307XHJcblxyXG4gICAgY29sdW1ucy5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgIGlmIChjLnRhc2tDb2x1bW5UeXBlKSB7XHJcbiAgICAgICAgY29sdW1uc01hcHBpbmdbYy50YXNrQ29sdW1uVHlwZV0gPSBjLmRhdGFGaWVsZDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgY29sdW1ucy5maWx0ZXIoKGMpID0+IGMudmlzaWJsZSkuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICBjb25zdCB3ID0gcGFyc2VJbnQoYy53aWR0aCk7XHJcblxyXG4gICAgICBpZighaXNOYU4odykpIHtcclxuICAgICAgICB0b3RhbFdpZHRoICs9IHc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdXNlQXV0b1dpZHRoID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jaGFydCA9IHRoaXMuY2hhcnRQb3NpdGlvbk1hcmtlci5keEdhbnR0KHtcclxuICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgaGVpZ2h0OiB0aGlzLmhhc0Zvcm0gPyAnNTAlJyA6ICdjYWxjKDEwMCUgLSA2MHB4KScsXHJcbiAgICAgIGZpcnN0RGF5T2ZXZWVrOiA2LFxyXG4gICAgICB0YXNrTGlzdFdpZHRoOiAoIXVzZUF1dG9XaWR0aCAmJiB0b3RhbFdpZHRoID4gMCkgPyB0b3RhbFdpZHRoIDogdm9pZCAwLFxyXG4gICAgICB0b29sYmFyOiB7XHJcbiAgICAgICAgaXRlbXM6IFsnem9vbUluJywgJ3pvb21PdXQnLCAnc2VwYXJhdG9yJywgJ3Rhc2tEZXRhaWxzJ11cclxuICAgICAgfSxcclxuICAgICAgZWRpdGluZzoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgc3RhcnREYXRlUmFuZ2U6IGdhbnR0U2V0dGluZ3MuU3RhcnREYXRlUmFuZ2UgPyBuZXcgRGF0ZShnYW50dFNldHRpbmdzLlN0YXJ0RGF0ZVJhbmdlKSA6IHZvaWQgMCxcclxuICAgICAgZW5kRGF0ZVJhbmdlOiBnYW50dFNldHRpbmdzLkVuZERhdGVSYW5nZSA/IG5ldyBEYXRlKGdhbnR0U2V0dGluZ3MuRW5kRGF0ZVJhbmdlKSA6IHZvaWQgMCxcclxuICAgICAgc2NhbGVUeXBlOiBnYW50dFNldHRpbmdzLlNjYWxlVHlwZSxcclxuICAgICAgdGFza1RpdGxlUG9zaXRpb246IGdhbnR0U2V0dGluZ3MuVGFza1RpdGxlUG9zaXRpb24sXHJcbiAgICAgIGNvbHVtbnM6IGNvbHVtbnMuZmlsdGVyKChjKSA9PiBjLnZpc2libGUpLm1hcCgoYykgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6IGMuZGF0YUZpZWxkLFxyXG4gICAgICAgICAgZGF0YVR5cGU6IGMuZGF0YVR5cGUsXHJcbiAgICAgICAgICB3aWR0aDogYy53aWR0aCxcclxuICAgICAgICAgIHZpc2libGVJbmRleDogYy52aXNpYmxlSW5kZXgsXHJcbiAgICAgICAgICBzb3J0SW5kZXg6IGMuc29ydEluZGV4LFxyXG4gICAgICAgICAgc29ydE9yZGVyOiBjLnNvcnRPcmRlciAmJiAoYy5zb3J0T3JkZXIgPT09ICdhc2MnID8gJ2FzYycgOiAnZGVzYycpLFxyXG4gICAgICAgICAgY2FwdGlvbjogYy5jYXB0aW9uIHx8IHZvaWQgMFxyXG4gICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRyZWVMaXN0Q29sdW1uXHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXNrczoge1xyXG4gICAgICAgIGtleUV4cHI6IGNvbHVtbnNNYXBwaW5nW0dhbnR0VGFza3NDb2x1bW5UeXBlLktleV0sXHJcbiAgICAgICAgc3RhcnRFeHByOiBjb2x1bW5zTWFwcGluZ1tHYW50dFRhc2tzQ29sdW1uVHlwZS5TdGFydF0sXHJcbiAgICAgICAgZW5kRXhwcjogY29sdW1uc01hcHBpbmdbR2FudHRUYXNrc0NvbHVtblR5cGUuRW5kXSxcclxuICAgICAgICBwYXJlbnRJZEV4cHI6IGNvbHVtbnNNYXBwaW5nW0dhbnR0VGFza3NDb2x1bW5UeXBlLlBhcmVudElkXSxcclxuICAgICAgICBwcm9ncmVzc0V4cHI6IGNvbHVtbnNNYXBwaW5nW0dhbnR0VGFza3NDb2x1bW5UeXBlLlByb2dyZXNzXSxcclxuICAgICAgICB0aXRsZUV4cHI6IGNvbHVtbnNNYXBwaW5nW0dhbnR0VGFza3NDb2x1bW5UeXBlLlRpdGxlXVxyXG4gICAgICB9LFxyXG4gICAgICBkZXBlbmRlbmNpZXM6IHtcclxuICAgICAgICBrZXlFeHByOiBnYW50dFNldHRpbmdzLkRlcGVuZGVuY2llc0tleUZpZWxkLFxyXG4gICAgICAgIHByZWRlY2Vzc29ySWRFeHByOiBnYW50dFNldHRpbmdzLkRlcGVuZGVuY2llc1ByZWRlY2Vzc29ySWRGaWVsZCxcclxuICAgICAgICBzdWNjZXNzb3JJZEV4cHI6IGdhbnR0U2V0dGluZ3MuRGVwZW5kZW5jaWVzU3VjY2Vzc29ySWRGaWVsZCxcclxuICAgICAgICB0eXBlRXhwcjogZ2FudHRTZXR0aW5ncy5EZXBlbmRlbmNpZXNUeXBlRmllbGRcclxuICAgICAgfSxcclxuICAgICAgcmVzb3VyY2VzOiB7XHJcbiAgICAgICAga2V5RXhwcjogZ2FudHRTZXR0aW5ncy5SZXNvdXJjZXNLZXlGaWVsZCxcclxuICAgICAgICB0ZXh0RXhwcjogZ2FudHRTZXR0aW5ncy5SZXNvdXJjZXNUZXh0RmllbGRcclxuICAgICAgfSxcclxuICAgICAgcmVzb3VyY2VBc3NpZ25tZW50czoge1xyXG4gICAgICAgIGtleUV4cHI6IGdhbnR0U2V0dGluZ3MuUmVzb3VyY2VBc3NpZ25tZW50S2V5RmllbGQsXHJcbiAgICAgICAgcmVzb3VyY2VJZEV4cHI6IGdhbnR0U2V0dGluZ3MuUmVzb3VyY2VBc3NpZ25tZW50UmVzb3VyY2VJZEZpZWxkLFxyXG4gICAgICAgIHRhc2tJZEV4cHI6IGdhbnR0U2V0dGluZ3MuUmVzb3VyY2VBc3NpZ25tZW50VGFza0lkRmllbGRcclxuICAgICAgfSxcclxuICAgIH0pLmR4R2FudHQoJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgdGhpcy5hZGRSZWZyZXNoQnV0dG9uICYmIG5ldyBSZWZyZXNoQnV0dG9uKCQoJy5yZXBvcnQtcmVmcmVzaC1idXR0b24nKSwgKCkgPT4gdGhpcy5yZWZyZXNoKCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVEYXRhKGRhdGE6IElHYW50dENoYXJ0RGF0YU1vZGVsKTogdm9pZCB7XHJcbiAgICBpZighdGhpcy5jaGFydCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jaGFydC5vcHRpb24oJ3Rhc2tzLmRhdGFTb3VyY2UnLCBkYXRhLlRhc2tzKTtcclxuICAgIHRoaXMuY2hhcnQub3B0aW9uKCdkZXBlbmRlbmNpZXMuZGF0YVNvdXJjZScsIGRhdGEuRGVwZW5kZW5jaWVzKTtcclxuICAgIHRoaXMuY2hhcnQub3B0aW9uKCdyZXNvdXJjZXMuZGF0YVNvdXJjZScsIGRhdGEuUmVzb3VyY2VzKTtcclxuICAgIHRoaXMuY2hhcnQub3B0aW9uKCdyZXNvdXJjZUFzc2lnbm1lbnRzLmRhdGFTb3VyY2UnLCBkYXRhLlJlc291cmNlQXNzaWdubWVudHMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgICB0aGlzLmZldGNoRGF0YSgpLnRoZW4oKGRhdGEpID0+IHtcclxuICAgICAgdGhpcy51cGRhdGVEYXRhKGRhdGEuRGF0YSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jaGFydD8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5jaGFydCA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNlc3Npb25LZXkoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLkNIQVJUX1NUT1JBR0VfTU9ERV9LRVkgKyB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZDtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IGluaXRQb3BvdmVyIH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZXBvcnREZXRhaWxzUG9wb3Zlcic7XHJcbmltcG9ydCB7IElSZXBvcnRQYXJhbXMsIE1vZGUgfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IHtJUmVwb3J0Q29tcG9uZW50fSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcclxuXHJcbmNvbnN0IFNXSVRDSF9UT19ERVNJR05FUl9URVhUID0gJ1N3aXRjaCB0byBEZXNpZ25lcic7XHJcbmNvbnN0IFNXSVRDSF9UT19WSUVXRVJfVEVYVCA9ICdTd2l0Y2ggdG8gVmlld2VyJztcclxuY29uc3QgU0VTU0lPTl9TVE9SQUdFX01PREVfS0VZID0gJ3JlcG9ydE1vZGUnO1xyXG5jb25zdCBDVVJSRU5UX1VSTF9LRVkgPSAnY3VzdG9tQ3VycmVudFVybCc7XHJcblxyXG5kZWNsYXJlIGNvbnN0IGR4UmVwb3J0RGVzaWduZXI6IGFueTtcclxuY29uc3Qga28gPSAod2luZG93IGFzIGFueSkua287XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElSZXBvcnRPcHRpb25zIHtcclxuICAkcmVwb3J0Q29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xyXG4gIGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBkZXNpZ25lck1vZGVsVXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlcG9ydCBpbXBsZW1lbnRzIElSZXBvcnRDb21wb25lbnQge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgJHJlcG9ydENvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzaWduZXJNb2RlbFVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0SWQ6IG51bWJlcjtcclxuXHJcbiAgcHJpdmF0ZSBwb3BvdmVyOiBEZXZFeHByZXNzLnVpLmR4UG9wb3ZlciA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElSZXBvcnRPcHRpb25zKSB7XHJcbiAgICB0aGlzLiRyZXBvcnRDb250YWluZXIgPSBvcHRpb25zLiRyZXBvcnRDb250YWluZXI7XHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy5hbGxvd0VkaXRpbmcgPSBvcHRpb25zLmFsbG93RWRpdGluZztcclxuICAgIHRoaXMuZGVzaWduZXJNb2RlbFVybCA9IG9wdGlvbnMuZGVzaWduZXJNb2RlbFVybDtcclxuICAgIHRoaXMucmVwb3J0SWQgPSBvcHRpb25zLnJlcG9ydFBhcmFtcy5SZXBvcnRJZDtcclxuICB9XHJcblxyXG4gIGluaXQoKTogdm9pZCB7XHJcbiAgICBsZXQgbW9kZSA9IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpKSBhcyBNb2RlIHx8IE1vZGUuVmlld2VyO1xyXG4gICAgbGV0IGJ1dHRvbiA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpIHtcclxuICAgICAgdGhpcy5wb3BvdmVyID0gaW5pdFBvcG92ZXIoJy5yZXBvcnQtZGV0YWlscy1saW5rJywgdGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYWxsb3dFZGl0aW5nKSB7XHJcbiAgICAgIGJ1dHRvbiA9ICQoJy5zd2l0Y2gtbW9kZS1idG4nKS5keEJ1dHRvbih7XHJcbiAgICAgICAgdGV4dDogbW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyBTV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IFNXSVRDSF9UT19WSUVXRVJfVEVYVCxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICBtb2RlID0gbW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyBNb2RlLkRlc2lnbmVyIDogTW9kZS5WaWV3ZXI7XHJcbiAgICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSwgbW9kZSk7XHJcbiAgICAgICAgICB0aGlzLnN3aXRjaE1vZGUobW9kZSwgYnV0dG9uKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLW1kJykuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jcmVhdGVSZXBvcnREZXNpZ25lcih0aGlzLiRyZXBvcnRDb250YWluZXIsIHRoaXMuZGVzaWduZXJNb2RlbFVybCwgJ2R4UmVwb3J0RGVzaWduZXInLCB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZC50b1N0cmluZygpLCAocykgPT4ge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVN3aXRjaE1vZGVCdXR0b24obW9kZSwgYnV0dG9uKTtcclxuICAgICAgfSk7XHJcbiAgICB9LCBtb2RlID09PSBNb2RlLlZpZXdlcik7XHJcblxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlzTm90U2F2ZWRSZXBvcnQgPSBkeFJlcG9ydERlc2lnbmVyICYmIGR4UmVwb3J0RGVzaWduZXIuR2V0RGVzaWduZXJNb2RlbCgpICYmIGR4UmVwb3J0RGVzaWduZXIuR2V0RGVzaWduZXJNb2RlbCgpLmlzRGlydHk7XHJcblxyXG4gICAgICBpZiAoaXNOb3RTYXZlZFJlcG9ydCkge1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBlLnJldHVyblZhbHVlID0gJ1RoZSByZXBvcnQgZG9jdW1lbnQgaXMgbm90IHNhdmVkLiBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gbGVhdmUgdGhlIHBhZ2U/JztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5wb3BvdmVyPy5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnBvcG92ZXIgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcmVmcmVzaCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVByZXZpZXcoZGVzaWduZXIpIHtcclxuICAgIGNvbnN0IHJlcG9ydFByZXZpZXcgPSBkZXNpZ25lci5kZXNpZ25lck1vZGVsLnJlcG9ydFByZXZpZXdNb2RlbC5yZXBvcnRQcmV2aWV3O1xyXG4gICAgY29uc3QgUmVwb3J0UHJldmlld1NlcnZpY2UgPSAoRGV2RXhwcmVzcyBhcyBhbnkpLlJlcG9ydGluZy5EZXNpZ25lci5JbnRlcm5hbC5SZXBvcnRQcmV2aWV3U2VydmljZTtcclxuXHJcbiAgICByZXBvcnRQcmV2aWV3LmluaXRpYWxpemUoUmVwb3J0UHJldmlld1NlcnZpY2UuaW5pdGlhbGl6ZVByZXZpZXcoZGVzaWduZXIuZGVzaWduZXJNb2RlbC5tb2RlbCgpKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN3aXRjaE1vZGUobW9kZTogTW9kZSwgYnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uKSB7XHJcbiAgICBpZiAobW9kZSA9PT0gTW9kZS5WaWV3ZXIpIHtcclxuICAgICAgZHhSZXBvcnREZXNpZ25lci5kZXNpZ25lck1vZGVsLnJlcG9ydFByZXZpZXdNb2RlbC5yZXBvcnRQcmV2aWV3LnByZXZpZXdWaXNpYmxlID0gdHJ1ZTtcclxuICAgICAgdGhpcy5pbml0aWFsaXplUHJldmlldyhkeFJlcG9ydERlc2lnbmVyKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGR4UmVwb3J0RGVzaWduZXIuZGVzaWduZXJNb2RlbC5yZXBvcnRQcmV2aWV3TW9kZWwucmVwb3J0UHJldmlldy5wcmV2aWV3VmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICBkeFJlcG9ydERlc2lnbmVyLmRlc2lnbmVyTW9kZWwucmVwb3J0UHJldmlld01vZGVsLnJlcG9ydFByZXZpZXcuZGVhY3RpdmF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlU3dpdGNoTW9kZUJ1dHRvbihtb2RlLCBidXR0b24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVTd2l0Y2hNb2RlQnV0dG9uKG1vZGU6IE1vZGUsIGJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbikge1xyXG4gICAgaWYgKGJ1dHRvbikge1xyXG4gICAgICBidXR0b24ub3B0aW9uKCd0ZXh0JywgbW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyBTV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IFNXSVRDSF9UT19WSUVXRVJfVEVYVCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVJlcG9ydERlc2lnbmVyKFxyXG4gICAgJHJlcG9ydENvbnRhaW5lcjogSlF1ZXJ5LFxyXG4gICAgZGVzaWduZXJNb2RlbFVybDogc3RyaW5nLFxyXG4gICAgZ2xvYmFsTmFtZTogc3RyaW5nLFxyXG4gICAgcmVwb3J0SWRTdHI6IHN0cmluZyxcclxuICAgIG9uSW5pdEhhbmRsZXI6IChzZW5kZXI6IGFueSkgPT4gdm9pZCxcclxuICAgIGlzUHJldmlld01vZGU6IGJvb2xlYW5cclxuICApOiBKUXVlcnk8SFRNTEVsZW1lbnQ+IHtcclxuICAgIGNvbnN0IGRlc2lnbmVyID0gJHJlcG9ydENvbnRhaW5lclxyXG4gICAgICAuYXR0cignZGF0YS1iaW5kJywgJ2R4UmVwb3J0RGVzaWduZXI6IGRlc2lnbmVyT3B0aW9ucycpXHJcbiAgICAgIC5hZGRDbGFzcygncmVwb3J0LWRlc2lnbmVyJyk7XHJcblxyXG4gICAgY29uc3QgZGVzaWduZXJPcHRpb25zID0ge1xyXG4gICAgICByZXBvcnRVcmw6IHJlcG9ydElkU3RyLFxyXG4gICAgICByZXF1ZXN0T3B0aW9uczoge1xyXG4gICAgICAgIGdldERlc2lnbmVyTW9kZWxBY3Rpb246IGRlc2lnbmVyTW9kZWxVcmxcclxuICAgICAgfSxcclxuICAgICAgY2FsbGJhY2tzOiB7XHJcbiAgICAgICAgQmVmb3JlUmVuZGVyOiAocykgPT4ge1xyXG4gICAgICAgICAgKHdpbmRvdyBhcyBhbnkpW2dsb2JhbE5hbWVdID0gcztcclxuXHJcbiAgICAgICAgICBpZiAoaXNQcmV2aWV3TW9kZSkge1xyXG4gICAgICAgICAgICBzLmRlc2lnbmVyTW9kZWwucmVwb3J0UHJldmlld01vZGVsLnJlcG9ydFByZXZpZXcucHJldmlld1Zpc2libGUgPSB0cnVlIDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBvbkluaXRIYW5kbGVyKHMpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgQ3VzdG9taXplTWVudUFjdGlvbnM6IHRoaXMuQ3VzdG9taXplTWVudUFjdGlvbnMsXHJcbiAgICAgICAgUHJldmlld0N1c3RvbWl6ZU1lbnVBY3Rpb25zOiB0aGlzLlByZXZpZXdDdXN0b21pemVNZW51QWN0aW9ucyxcclxuICAgICAgICBSZXBvcnRPcGVuZWQ6IChzLCBlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXNQcmV2aWV3TW9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVQcmV2aWV3KHMpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuUmVwb3J0T3BlbmVkKHMsIGUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgUmVwb3J0VGFiQ2xvc2VkOiB0aGlzLlJlcG9ydFRhYkNsb3NlZFxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGtvLmFwcGx5QmluZGluZ3MoeyBkZXNpZ25lck9wdGlvbnMgfSwgZGVzaWduZXJbMF0pO1xyXG5cclxuICAgIHJldHVybiBkZXNpZ25lcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgUHJldmlld0N1c3RvbWl6ZU1lbnVBY3Rpb25zKHMsIGUpIHtcclxuICAgIGNvbnN0IHNob3dEZXNpZ25lckl0ZW0gPSBlLkdldEJ5SWQoKERldkV4cHJlc3MgYXMgYW55KS5SZXBvcnRpbmcuVmlld2VyLkFjdGlvbklkLkRlc2lnbik7XHJcblxyXG4gICAgaWYgKHNob3dEZXNpZ25lckl0ZW0pIHtcclxuICAgICAgc2hvd0Rlc2lnbmVySXRlbS52aXNpYmxlID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIEN1c3RvbWl6ZU1lbnVBY3Rpb25zKHMsIGUpIHtcclxuICAgIGNvbnN0IEFjdGlvbklkID0gKERldkV4cHJlc3MgYXMgYW55KS5SZXBvcnRpbmcuRGVzaWduZXIuQWN0aW9ucy5BY3Rpb25JZDtcclxuICAgIGNvbnN0IGFjdGlvbklkc1RvTW92ZUluVG9vbGJhcjogc3RyaW5nW10gPSBbQWN0aW9uSWQuU2F2ZV07XHJcbiAgICBjb25zdCBhY3Rpb25JZHNUb0hpZGU6IHN0cmluZ1tdID0gW0FjdGlvbklkLk5ld1JlcG9ydCwgQWN0aW9uSWQuTmV3UmVwb3J0VmlhV2l6YXJkLCBBY3Rpb25JZC5PcGVuUmVwb3J0LFxyXG4gICAgICBBY3Rpb25JZC5QcmV2aWV3LCBBY3Rpb25JZC5TYXZlQXMsIEFjdGlvbklkLkV4aXRdO1xyXG5cclxuICAgIGFjdGlvbklkc1RvTW92ZUluVG9vbGJhci5mb3JFYWNoKChpZCkgPT4ge1xyXG4gICAgICBjb25zdCBpdGVtID0gZS5HZXRCeUlkKGlkKTtcclxuXHJcbiAgICAgIGlmIChpdGVtICYmIChpdGVtLmNvbnRhaW5lciA9PT0gJ21lbnUnKSkge1xyXG4gICAgICAgIGl0ZW0uY29udGFpbmVyID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBhY3Rpb25JZHNUb0hpZGUuZm9yRWFjaCgoaWQpID0+IHtcclxuICAgICAgY29uc3QgaXRlbSA9IGUuR2V0QnlJZChpZCk7XHJcblxyXG4gICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgIGl0ZW0udmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBzYXZlQWN0aW9uID0gZS5HZXRCeUlkKChEZXZFeHByZXNzIGFzIGFueSkuUmVwb3J0aW5nLkRlc2lnbmVyLkFjdGlvbnMuQWN0aW9uSWQuU2F2ZSk7XHJcbiAgICBjb25zdCBvcmlnQ2xpY2tBY3Rpb24gPSBzYXZlQWN0aW9uLmNsaWNrQWN0aW9uO1xyXG4gICAgc2F2ZUFjdGlvbi5jbGlja0FjdGlvbiA9ICgpID0+IHtcclxuICAgICAgY29uc3QgdGFiID0gcy5HZXRDdXJyZW50VGFiKCk7XHJcbiAgICAgIHRhYi51cmwoa28udW53cmFwKHNbQ1VSUkVOVF9VUkxfS0VZXSkpO1xyXG4gICAgICBvcmlnQ2xpY2tBY3Rpb24oKTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIFJlcG9ydE9wZW5lZChzLCBlKSB7XHJcbiAgICBzW0NVUlJFTlRfVVJMX0tFWV0gPSBzW0NVUlJFTlRfVVJMX0tFWV0gfHwga28ub2JzZXJ2YWJsZSgpO1xyXG4gICAgc1tDVVJSRU5UX1VSTF9LRVldKGUuVXJsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgUmVwb3J0VGFiQ2xvc2VkKHMsIGUpIHtcclxuICAgIHNbQ1VSUkVOVF9VUkxfS0VZXSA9IHNbQ1VSUkVOVF9VUkxfS0VZXSB8fCBrby5vYnNlcnZhYmxlKCk7XHJcbiAgICBzW0NVUlJFTlRfVVJMX0tFWV0obnVsbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNlc3Npb25LZXkoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBTRVNTSU9OX1NUT1JBR0VfTU9ERV9LRVkgKyB0aGlzLnJlcG9ydElkO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgaW5pdFBvcG92ZXIgfSBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyJztcclxuaW1wb3J0IHsgSVJlcG9ydFBhcmFtcywgTW9kZSB9IGZyb20gJy4uLy4uL0lSZXBvcnRQYXJhbXMnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7SVJlcG9ydENvbXBvbmVudH0gZnJvbSAnLi4vLi4vSVJlcG9ydENvbXBvbmVudCc7XHJcbmltcG9ydCBSZWZyZXNoQnV0dG9uIGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVmcmVzaFRpbWVyL0J1dHRvbic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEaWFncmFtUGFnZU9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XHJcbiAgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIGRpYWdyYW1Db250cm9sbGVyVXJsOiBzdHJpbmc7XHJcbiAgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGlhZ3JhbVBhZ2UgaW1wbGVtZW50cyBJUmVwb3J0Q29tcG9uZW50IHtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBTV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA9ICdTd2l0Y2ggdG8gRGVzaWduZXInO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgU1dJVENIX1RPX1ZJRVdFUl9URVhUID0gJ1N3aXRjaCB0byBWaWV3ZXInO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgRElBR1JBTV9TVE9SQUdFX01PREVfS0VZID0gJ0RJQUdSQU1fU1RPUkFHRV9NT0RFX0tFWSc7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlhZ3JhbUNvbnRyb2xsZXJVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGFkZFJlZnJlc2hCdXR0b246IGJvb2xlYW47XHJcblxyXG4gIHByaXZhdGUgbW9kZTogTW9kZTtcclxuICBwcml2YXRlIGRpYWdyYW06IERldkV4cHJlc3MudWkuZHhEaWFncmFtO1xyXG4gIHByaXZhdGUgcG9wb3ZlcjogRGV2RXhwcmVzcy51aS5keFBvcG92ZXIgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWZyZXNoQnV0dG9uOiBSZWZyZXNoQnV0dG9uO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJRGlhZ3JhbVBhZ2VPcHRpb25zKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSBvcHRpb25zLiRjb250YWluZXI7XHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy5hbGxvd0VkaXRpbmcgPSBvcHRpb25zLmFsbG93RWRpdGluZztcclxuICAgIHRoaXMuYWRkUmVmcmVzaEJ1dHRvbiA9IG9wdGlvbnMuYWRkUmVmcmVzaEJ1dHRvbjtcclxuICAgIHRoaXMuZGlhZ3JhbUNvbnRyb2xsZXJVcmwgPSBvcHRpb25zLmRpYWdyYW1Db250cm9sbGVyVXJsO1xyXG5cclxuICAgIHRoaXMubW9kZSA9IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpKSBhcyBNb2RlIHx8IE1vZGUuVmlld2VyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoKSB7XHJcbiAgICB0aGlzLmNyZWF0ZURpYWdyYW1Db250cm9sKCk7XHJcbiAgICB0aGlzLmluaXREaWFncmFtKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuYWxsb3dFZGl0aW5nKSB7XHJcbiAgICAgIHRoaXMuaW5pdFN3aXRjaE1vZGVCdXR0b24oKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscykge1xyXG4gICAgICB0aGlzLnBvcG92ZXIgPSBpbml0UG9wb3ZlcignLmRpYWdyYW0tZGV0YWlscy1saW5rJywgdGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzcG9zZSgpIHtcclxuICAgIHRoaXMuZGlhZ3JhbS5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnBvcG92ZXI/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMuZGlhZ3JhbSA9IG51bGw7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kaWFncmFtICYmIHNlbmRSZXF1ZXN0KGAke3RoaXMuZGlhZ3JhbUNvbnRyb2xsZXJVcmx9P2lkPSR7dGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWR9YCwgJ2dldCcpLnRoZW4oKGRhdGEpID0+IHtcclxuICAgICAgdGhpcy5kaWFncmFtLmltcG9ydChKU09OLnN0cmluZ2lmeShkYXRhKSwgZmFsc2UpO1xyXG4gICAgICB0aGlzLmRpYWdyYW0ub3B0aW9uKCdoYXNDaGFuZ2VzJywgZmFsc2UpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZURpYWdyYW1Db250cm9sKCkge1xyXG4gICAgdGhpcy5kaWFncmFtID0gdGhpcy4kY29udGFpbmVyLmR4RGlhZ3JhbSh7XHJcbiAgICAgIGhpc3RvcnlUb29sYmFyOiB7XHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICBjb21tYW5kczogWydzZXBhcmF0b3InLCAndW5kbycsICdyZWRvJywgJ3NlcGFyYXRvcicsIHsgbmFtZTogJ3NhdmUnLCB0ZXh0OiAnU2F2ZScsIGljb246ICdzYXZlJyB9XSBhcyBhbnlcclxuICAgICAgfSxcclxuICAgICAgb25DdXN0b21Db21tYW5kOiAoZSkgPT4ge1xyXG4gICAgICAgIHN3aXRjaCAoZS5uYW1lKSB7XHJcbiAgICAgICAgICBjYXNlICdzYXZlJzpcclxuICAgICAgICAgICAgdGhpcy5zYXZlUmVwb3J0KGUuY29tcG9uZW50LmV4cG9ydCgpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBmdWxsU2NyZWVuOiBmYWxzZSxcclxuICAgICAgcmVhZE9ubHk6IHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXJcclxuICAgIH0pLmR4RGlhZ3JhbSgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdERpYWdyYW0oKSB7XHJcbiAgICBzZW5kUmVxdWVzdChgJHt0aGlzLmRpYWdyYW1Db250cm9sbGVyVXJsfT9pZD0ke3RoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkfWAsICdnZXQnKS50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgIHRoaXMuZGlhZ3JhbS5pbXBvcnQoSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICB0aGlzLmRpYWdyYW0ub3B0aW9uKCdoYXNDaGFuZ2VzJywgZmFsc2UpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMuYWRkUmVmcmVzaEJ1dHRvbikge1xyXG4gICAgICB0aGlzLnJlZnJlc2hCdXR0b24gPSBuZXcgUmVmcmVzaEJ1dHRvbigkKCcucmVwb3J0LXJlZnJlc2gtYnV0dG9uJyksICgpID0+IHRoaXMucmVmcmVzaCgpKTtcclxuICAgIH1cclxuXHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgKGUpID0+IHtcclxuICAgICAgaWYgKHRoaXMuZGlhZ3JhbS5vcHRpb24oJ2hhc0NoYW5nZXMnKSkge1xyXG4gICAgICAgIGUucmV0dXJuVmFsdWUgPSAnVGhlIGRvY3VtZW50IGlzIG5vdCBzYXZlZC4gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGxlYXZlIHRoZSBwYWdlPyc7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0U3dpdGNoTW9kZUJ1dHRvbigpIHtcclxuICAgIGNvbnN0IGJ1dHRvbiA9ICQoJy5zd2l0Y2gtbW9kZS1idG4nKS5keEJ1dHRvbih7XHJcbiAgICAgIHRleHQ6IHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyB0aGlzLlNXSVRDSF9UT19ERVNJR05FUl9URVhUIDogdGhpcy5TV0lUQ0hfVE9fVklFV0VSX1RFWFQsXHJcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICB0aGlzLm1vZGUgPSB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gTW9kZS5EZXNpZ25lciA6IE1vZGUuVmlld2VyO1xyXG4gICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpLCB0aGlzLm1vZGUpO1xyXG4gICAgICAgIHRoaXMuZGlhZ3JhbS5vcHRpb24oJ3JlYWRPbmx5JywgdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlcik7XHJcbiAgICAgICAgYnV0dG9uLm9wdGlvbigndGV4dCcsIHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyB0aGlzLlNXSVRDSF9UT19ERVNJR05FUl9URVhUIDogdGhpcy5TV0lUQ0hfVE9fVklFV0VSX1RFWFQpO1xyXG4gICAgICB9XHJcbiAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1tZCcpLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBzYXZlUmVwb3J0KHNvdXJjZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBpZCA9IHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkO1xyXG4gICAgYXdhaXQgc2VuZFJlcXVlc3QodGhpcy5kaWFncmFtQ29udHJvbGxlclVybCwgJ3Bvc3QnLCB7IGlkLCBzb3VyY2UgfSwgdHJ1ZSk7XHJcbiAgICB0aGlzLmRpYWdyYW0ub3B0aW9uKCdoYXNDaGFuZ2VzJywgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTZXNzaW9uS2V5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5ESUFHUkFNX1NUT1JBR0VfTU9ERV9LRVkgKyB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZDtcclxuICB9XHJcbn1cclxuIiwgImltcG9ydCB7SVJlcG9ydENvbXBvbmVudH0gZnJvbSAnLi4vLi4vSVJlcG9ydENvbXBvbmVudCc7XHJcbmltcG9ydCB7TWVudUl0ZW1UeXBlfSBmcm9tICcuLi8uLi8uLi9CdXNpbmVzcyc7XHJcbmltcG9ydCB7SUNkbVJlcG9ydFBhcmFtcywgSUdyaWRSZXBvcnRQYXJhbXMsIElSZXBvcnRQYXJhbXN9IGZyb20gJy4uLy4uL0lSZXBvcnRQYXJhbXMnO1xyXG5pbXBvcnQgUmVmcmVzaFRpbWVyIGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVmcmVzaFRpbWVyL0luZGV4JztcclxuaW1wb3J0IERhc2hib2FyZFJlcG9ydFBhZ2UgZnJvbSAnLi4vRGFzaGJvYXJkL0luZGV4JztcclxuaW1wb3J0IEdhbnR0Q2hhcnQgZnJvbSAnLi4vR2FubnRDaGFydC9JbmRleCc7XHJcbmltcG9ydCBHcmlkUmVwb3J0UGFnZSBmcm9tICcuLi9HcmlkL0luZGV4JztcclxuaW1wb3J0IENETVJlcG9ydFBhZ2UgZnJvbSAnLi4vQ0RNL0luZGV4JztcclxuaW1wb3J0IERYUmVwb3J0UGFnZSBmcm9tICcuLi9SZXBvcnQvSW5kZXgnO1xyXG5pbXBvcnQgRGlhZ3JhbVJlcG9ydFBhZ2UgZnJvbSAnLi4vRGlhZ3JhbS9JbmRleCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElOZXN0ZWRSZXBvcnQgZXh0ZW5kcyBJUmVwb3J0UGFyYW1zIHtcclxuICBUeXBlOiBNZW51SXRlbVR5cGU7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVNsaWRlc2hvd1JlcG9ydFBhcmFtcyBleHRlbmRzIElSZXBvcnRQYXJhbXMge1xyXG4gIFJlcG9ydHM6IElOZXN0ZWRSZXBvcnRbXTtcclxuICBEZWxheVNlYzogbnVtYmVyO1xyXG4gIFJlZnJlc2hTZWM6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU2xpZGVzaG93UmVwb3J0UGFnZU9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICByZXBvcnRQYXJhbXM6IElTbGlkZXNob3dSZXBvcnRQYXJhbXM7XHJcbiAgZGVmYXVsdFJlcG9ydFNldHRpbmdzOiB7IFtrZXkgaW4gTWVudUl0ZW1UeXBlXTogYW55OyB9O1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTbGlkZXNob3dSZXBvcnRQYWdlIGltcGxlbWVudHMgSVJlcG9ydENvbXBvbmVudCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBJU2xpZGVzaG93UmVwb3J0UGFyYW1zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgJHJvb3RFbGVtZW50OiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0UmVwb3J0U2V0dGluZ3M6IHsgW2tleSBpbiBNZW51SXRlbVR5cGVdOiBhbnk7IH07XHJcbiAgcHJpdmF0ZSByZXBvcnRzOiBJUmVwb3J0Q29tcG9uZW50W10gPSBbXTtcclxuICBwcml2YXRlIGR4R2FsbGVyeTogRGV2RXhwcmVzcy51aS5keEdhbGxlcnk7XHJcbiAgcHJpdmF0ZSByZWZyZXNoVGltZXI6IFJlZnJlc2hUaW1lcjtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVNsaWRlc2hvd1JlcG9ydFBhZ2VPcHRpb25zKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zLnJlcG9ydFBhcmFtcztcclxuICAgIHRoaXMuJHJvb3RFbGVtZW50ID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy5kZWZhdWx0UmVwb3J0U2V0dGluZ3MgPSBvcHRpb25zLmRlZmF1bHRSZXBvcnRTZXR0aW5ncztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0KCkge1xyXG4gICAgdGhpcy5yZW5kZXJDb250ZW50KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzcG9zZSgpIHtcclxuICAgIGlmICghIXRoaXMucmVwb3J0cykge1xyXG4gICAgICB0aGlzLnJlcG9ydHMuZm9yRWFjaCgocmVwb3J0KSA9PiB7XHJcbiAgICAgICAgcmVwb3J0LmRpc3Bvc2UoKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHdoaWxlICh0aGlzLnJlcG9ydHMubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRzLnBvcCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucmVwb3J0cyA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAoISF0aGlzLnJlZnJlc2hUaW1lcikge1xyXG4gICAgICB0aGlzLnJlZnJlc2hUaW1lci5kaXNwb3NlKCk7XHJcbiAgICAgIHRoaXMucmVmcmVzaFRpbWVyID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZXBvcnRzICYmIHRoaXMucmVwb3J0cy5mb3JFYWNoKChyZXBvcnQpID0+IHtcclxuICAgICAgcmVwb3J0LnJlZnJlc2goKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJDb250ZW50KCkge1xyXG4gICAgbGV0IGN1cnJlbnRJbmRleCA9IDA7XHJcbiAgICBsZXQgY3VycmVudFRpbWVvdXQgPSBudWxsO1xyXG4gICAgY29uc3QgbWF4SW5kZXggPSB0aGlzLm9wdGlvbnMuUmVwb3J0cy5sZW5ndGg7XHJcblxyXG4gICAgY29uc3Qgc2V0dXBOZXh0SXRlbVNlbGVjdCA9ICgpID0+IHtcclxuICAgICAgY3VycmVudFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgbGV0IG5leHRJbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XHJcblxyXG4gICAgICAgIGlmKG5leHRJbmRleCA+PSBtYXhJbmRleCkge1xyXG4gICAgICAgICAgbmV4dEluZGV4ID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZHhHYWxsZXJ5LmdvVG9JdGVtKG5leHRJbmRleCwgdHJ1ZSk7XHJcbiAgICAgIH0sIHRoaXMub3B0aW9ucy5EZWxheVNlYyAqIDEwMDApO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCAkdmlldyA9ICQoJzxkaXYgLz4nKS5hdHRyKHsgY2xhc3M6ICdzbGlkZXNob3ctcmVwb3J0JyB9KS5hcHBlbmRUbyh0aGlzLiRyb290RWxlbWVudCk7XHJcbiAgICBjb25zdCAkZ2FsbGVyeSA9ICQoJzxkaXYgLz4nLCB7IGNsYXNzOiAnc2xpZGVzaG93LXJlcG9ydF9fZ2FsbGVyeScgfSkuZHhHYWxsZXJ5KHtcclxuICAgICAgbG9vcDogZmFsc2UsXHJcbiAgICAgIGRhdGFTb3VyY2U6IHRoaXMub3B0aW9ucy5SZXBvcnRzLFxyXG4gICAgICBzbGlkZXNob3dEZWxheTogMCxcclxuICAgICAgc2hvd05hdkJ1dHRvbnM6IGZhbHNlLFxyXG4gICAgICBzaG93SW5kaWNhdG9yOiB0cnVlLFxyXG4gICAgICBzdHJldGNoSW1hZ2VzOiB0cnVlLFxyXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcclxuICAgICAgb25Jbml0aWFsaXplZDogKCkgPT4gc2V0dXBOZXh0SXRlbVNlbGVjdCgpLFxyXG4gICAgICBvblNlbGVjdGlvbkNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgY3VycmVudEluZGV4ID0gZS5jb21wb25lbnQub3B0aW9uKCdzZWxlY3RlZEluZGV4Jyk7XHJcblxyXG4gICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoY3VycmVudFRpbWVvdXQpO1xyXG4gICAgICAgIHNldHVwTmV4dEl0ZW1TZWxlY3QoKTtcclxuICAgICAgfSxcclxuICAgICAgaXRlbVRlbXBsYXRlOiAocmVwb3J0UGFyYW1zOiBJTmVzdGVkUmVwb3J0LCBpbmRleCwgaXRlbUVsZW1lbnQpID0+IHtcclxuICAgICAgICBpdGVtRWxlbWVudC5hdHRyKHsgY2xhc3M6ICdzbGlkZXNob3ctcmVwb3J0X19nYWxsZXJ5LWl0ZW0nIH0pLmhlaWdodCgnMTAwJScpO1xyXG5cclxuICAgICAgICBjb25zdCAkc2xpZGVFbGVtZW50ID0gJCgnPGRpdiAvPicsIHsgY2xhc3M6ICdzbGlkZXNob3ctcmVwb3J0X19zbGlkZS1jb250ZW50JyB9KS5oZWlnaHQoJzEwMCUnKTtcclxuICAgICAgICBsZXQgcmVwb3J0U2xpZGU6IElSZXBvcnRDb21wb25lbnQ7XHJcblxyXG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHN3aXRjaCAocmVwb3J0UGFyYW1zLlR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuRGFzaGJvYXJkOlxyXG4gICAgICAgICAgICAgIGNvbnN0ICRkYXNoYm9hcmRQb3NpdGlvbkVsZW1lbnQgPSAkKCc8ZGl2IC8+JywgeyBjbGFzczogJ3JlcG9ydC1wb3NpdGlvbicgfSk7XHJcbiAgICAgICAgICAgICAgJGRhc2hib2FyZFBvc2l0aW9uRWxlbWVudC5hcHBlbmRUbygkc2xpZGVFbGVtZW50KTtcclxuXHJcbiAgICAgICAgICAgICAgcmVwb3J0U2xpZGUgPSBuZXcgRGFzaGJvYXJkUmVwb3J0UGFnZSh7XHJcbiAgICAgICAgICAgICAgICAuLi4odGhpcy5kZWZhdWx0UmVwb3J0U2V0dGluZ3NbTWVudUl0ZW1UeXBlLkRhc2hib2FyZF0gfHwge30pLFxyXG4gICAgICAgICAgICAgICAgJGRhc2hib2FyZENvbnRhaW5lcjogJGRhc2hib2FyZFBvc2l0aW9uRWxlbWVudCxcclxuICAgICAgICAgICAgICAgIHJlcG9ydFBhcmFtczogcmVwb3J0UGFyYW1zIGFzIElSZXBvcnRQYXJhbXNcclxuICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgJHNsaWRlRWxlbWVudC5maW5kKCdkYXNoYm9hcmQtdGl0bGUnKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgJHNsaWRlRWxlbWVudC5maW5kKCcuZHgtZGFzaGJvYXJkLWxheW91dC1jb250YWluZXInKS5jc3MoeyB0b3A6IDAgfSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIE1lbnVJdGVtVHlwZS5HcmlkVmlldzpcclxuICAgICAgICAgICAgICBjb25zdCAkZ3JpZFBvc2l0aW9uRWxlbWVudCA9ICQoJzxkaXYgLz4nLCB7IGNsYXNzOiAnc2xpZGVzaG93LXJlcG9ydF9fZ3JpZC1wb3NpdGlvbicgfSk7XHJcbiAgICAgICAgICAgICAgJHNsaWRlRWxlbWVudC5hZGRDbGFzcygnaXN6b2xlYS10aGVtZScpLmFkZENsYXNzKCdwYW5lbC1ib2R5Jyk7XHJcblxyXG4gICAgICAgICAgICAgICRncmlkUG9zaXRpb25FbGVtZW50LmFwcGVuZFRvKCRzbGlkZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgIHJlcG9ydFNsaWRlID0gbmV3IEdyaWRSZXBvcnRQYWdlKHtcclxuICAgICAgICAgICAgICAgIC4uLih0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5nc1tNZW51SXRlbVR5cGUuR3JpZFZpZXddIHx8IHt9KSxcclxuICAgICAgICAgICAgICAgIGdyaWRQb3NpdGlvbk1hcmtlcjogJGdyaWRQb3NpdGlvbkVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICByZXBvcnRQYXJhbXM6IHJlcG9ydFBhcmFtcyBhcyBhbnkgYXMgSUdyaWRSZXBvcnRQYXJhbXMsXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgTWVudUl0ZW1UeXBlLkNETTpcclxuICAgICAgICAgICAgICByZXBvcnRTbGlkZSA9IG5ldyBDRE1SZXBvcnRQYWdlKHtcclxuICAgICAgICAgICAgICAgIC4uLih0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5nc1tNZW51SXRlbVR5cGUuQ0RNXSB8fCB7fSksXHJcbiAgICAgICAgICAgICAgICAkY29udGFpbmVyOiAkc2xpZGVFbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgcmVwb3J0UGFyYW1zOiByZXBvcnRQYXJhbXMgYXMgYW55IGFzIElDZG1SZXBvcnRQYXJhbXMsXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgTWVudUl0ZW1UeXBlLlJlcG9ydDpcclxuICAgICAgICAgICAgICBjb25zdCAkcmVwb3J0UG9zaXRpb25FbGVtZW50ID0gJCgnPGRpdiAvPicsIHsgY2xhc3M6ICdyZXBvcnQtcG9zaXRpb24nIH0pO1xyXG4gICAgICAgICAgICAgICRyZXBvcnRQb3NpdGlvbkVsZW1lbnQuYXBwZW5kVG8oJHNsaWRlRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgcmVwb3J0U2xpZGUgPSBuZXcgRFhSZXBvcnRQYWdlKHtcclxuICAgICAgICAgICAgICAgIC4uLih0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5nc1tNZW51SXRlbVR5cGUuUmVwb3J0XSB8fCB7fSksXHJcbiAgICAgICAgICAgICAgICAkcmVwb3J0Q29udGFpbmVyOiAkcmVwb3J0UG9zaXRpb25FbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgcmVwb3J0UGFyYW1zOiByZXBvcnRQYXJhbXMgYXMgSVJlcG9ydFBhcmFtcyxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuRGlhZ3JhbTpcclxuICAgICAgICAgICAgICBjb25zdCAkZGlhZ3JhbVBvc2l0aW9uRWxlbWVudCA9ICQoJzxkaXYgLz4nLCB7IGNsYXNzOiAncmVwb3J0LXBvc2l0aW9uJyB9KTtcclxuICAgICAgICAgICAgICAkZGlhZ3JhbVBvc2l0aW9uRWxlbWVudC5hcHBlbmRUbygkc2xpZGVFbGVtZW50KTtcclxuICAgICAgICAgICAgICByZXBvcnRTbGlkZSA9IG5ldyBEaWFncmFtUmVwb3J0UGFnZSh7XHJcbiAgICAgICAgICAgICAgICAuLi4odGhpcy5kZWZhdWx0UmVwb3J0U2V0dGluZ3NbTWVudUl0ZW1UeXBlLkRpYWdyYW1dIHx8IHt9KSxcclxuICAgICAgICAgICAgICAgICRjb250YWluZXI6ICRkaWFncmFtUG9zaXRpb25FbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgcmVwb3J0UGFyYW1zOiByZXBvcnRQYXJhbXMgYXMgSVJlcG9ydFBhcmFtcyxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuR2FudHRDaGFydDpcclxuICAgICAgICAgICAgICBjb25zdCAkZ2FudHRQb3NpdGlvbkVsZW1lbnQgPSAkKCc8ZGl2IC8+JywgeyBjbGFzczogJ3NsaWRlc2hvdy1yZXBvcnRfX2dyaWQtcG9zaXRpb24nIH0pO1xyXG4gICAgICAgICAgICAgICRzbGlkZUVsZW1lbnQuYWRkQ2xhc3MoJ2lzem9sZWEtdGhlbWUnKS5hZGRDbGFzcygncGFuZWwtYm9keScpO1xyXG5cclxuICAgICAgICAgICAgICAkZ2FudHRQb3NpdGlvbkVsZW1lbnQuYXBwZW5kVG8oJHNsaWRlRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgcmVwb3J0U2xpZGUgPSBuZXcgR2FudHRDaGFydCh7XHJcbiAgICAgICAgICAgICAgICAuLi4odGhpcy5kZWZhdWx0UmVwb3J0U2V0dGluZ3NbTWVudUl0ZW1UeXBlLkdhbnR0Q2hhcnRdIHx8IHt9KSxcclxuICAgICAgICAgICAgICAgIGNoYXJ0UG9zaXRpb25NYXJrZXI6ICRnYW50dFBvc2l0aW9uRWxlbWVudCxcclxuICAgICAgICAgICAgICAgIHJlcG9ydFBhcmFtczogcmVwb3J0UGFyYW1zIGFzIGFueSBhcyBJR3JpZFJlcG9ydFBhcmFtcyxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuTWVudU5vZGU6XHJcbiAgICAgICAgICAgIGNhc2UgTWVudUl0ZW1UeXBlLlNsaWRlc2hvdzpcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAocmVwb3J0U2xpZGUpIHtcclxuICAgICAgICAgICAgcmVwb3J0U2xpZGUuaW5pdCgpO1xyXG4gICAgICAgICAgICB0aGlzLnJlcG9ydHMucHVzaChyZXBvcnRTbGlkZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSwgNTAwKTtcclxuXHJcbiAgICAgICAgJHNsaWRlRWxlbWVudC5hcHBlbmRUbyhpdGVtRWxlbWVudCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZHhHYWxsZXJ5ID0gJGdhbGxlcnkuZHhHYWxsZXJ5KCdpbnN0YW5jZScpO1xyXG5cclxuICAgICRnYWxsZXJ5LmFwcGVuZFRvKCR2aWV3KTtcclxuXHJcbiAgICB0aGlzLnJlZnJlc2hUaW1lciA9IG5ldyBSZWZyZXNoVGltZXIoe2NhbGxiYWNrOiAoKSA9PiB0aGlzLnJlZnJlc2goKSwgZWxhcHNlZENhbGxiYWNrOiAoZSkgPT4ge319KTtcclxuICAgIHRoaXMucmVmcmVzaFRpbWVyLnN0YXJ0KHRoaXMub3B0aW9ucy5SZWZyZXNoU2VjICogMTAwMCk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkYvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vVmVuZG9yL0RldkV4dHJlbWUvZHguYWxsLmQudHNcIiAvPlxyXG5cclxuZXhwb3J0IHsgSUxpY2VuY2UsIE1lbnVJdGVtVHlwZSwgTGljZW5jZVN0YXR1cyB9IGZyb20gJy4vQnVzaW5lc3MnO1xyXG5leHBvcnQgeyBJQXBpUmVzcG9uc2UsIElEeERhdGFTb3VyY2VPcHRpb25zLCBJRXJyb3JJbmZvLCBJTG9nb1NldHRpbmdzLCBSZXF1ZXN0U3RhdGUgfSBmcm9tICcuL0RhdGEnO1xyXG5leHBvcnQge1xyXG4gIEhlYWRlciwgTmF2aWdhdGlvbk1lbnUsIFVzZXJNZW51LCBNZW51U3dpdGNoZXIsXHJcbiAgSGVhZGVyVGhlbWVzLCBJSGVhZGVyT3B0aW9ucywgSUFwcE1lbnVNb2RlbCwgSU1lbnVTZXR0aW5ncywgSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsLFxyXG4gIElVc2VyTWVudUl0ZW0sIElVc2VyTWVudUl0ZW1Nb2RlbCxcclxufSBmcm9tICcuL0hlYWRlcic7XHJcbmV4cG9ydCB7IElIaWVyYXJjaGljYWwsIElSZXBvcnRCYXNlLCBJQXBwTWVudUl0ZW1CYXNlTW9kZWwsIGdyaWRDb2x1bW5UeXBlcyB9IGZyb20gJy4vUmVwb3J0cy9CdXNpbmVzcyc7XHJcbmV4cG9ydCB7XHJcbiAgSUdyaWRFeHRlbmRlZENvbHVtblN0YXRlLCBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlLCBJR3JpZFN0YXRlLFxyXG4gIElHcmlkQ29sdW1uU3RhdGUsIElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlXHJcbn0gZnJvbSAnLi9XaWRnZXRzL0lHcmlkU3RhdGUnO1xyXG5leHBvcnQgeyBJR3JpZERhdGEsIElWMkdyaWRDb2x1bW5TdGF0ZSB9IGZyb20gJy4vUmVwb3J0cy9QYWdlcy9HcmlkL0lHcmlkRGF0YSc7XHJcbmV4cG9ydCB7IElDb2x1bW5NZXRhRGF0YSB9IGZyb20gJy4vUmVwb3J0cy9Db2x1bW5NZXRhRGF0YSc7XHJcbmV4cG9ydCB7IENkbUltcG9ydEZpbGVNb2RlIH0gZnJvbSAnLi9SZXBvcnRzL0J1c2luZXNzJztcclxuXHJcbmltcG9ydCB7IHNob3cgYXMgYmFja2dyb3VuZEltYWdlVmlld2VyIH0gZnJvbSAnLi9XaWRnZXRzL0JhY2tncm91bmRJbWFnZVZpZXdlcic7XHJcbmltcG9ydCB7IExpY2VuY2VTdGF0dXMsIE1lbnVJdGVtVHlwZSB9IGZyb20gJy4vQnVzaW5lc3MnO1xyXG5pbXBvcnQgeyBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlIH0gZnJvbSAnLi9XaWRnZXRzL0lHcmlkU3RhdGUnO1xyXG5pbXBvcnQgZGF0YSBmcm9tICcuL0RhdGEnO1xyXG5pbXBvcnQgRm9vdGVyLCB7IEZvb3RlckluZGljYXRvclN0YXR1cyB9IGZyb20gJy4vRm9vdGVyL0luZGV4JztcclxuaW1wb3J0IHtcclxuICBIZWFkZXIsXHJcbiAgTmF2aWdhdGlvbk1lbnUsXHJcbiAgVXNlck1lbnUsXHJcbiAgTWVudVN3aXRjaGVyXHJcbn0gZnJvbSAnLi9IZWFkZXInO1xyXG5cclxuZXhwb3J0IHtcclxuICBGb290ZXIsXHJcbn07XHJcblxyXG5pbXBvcnQgbm90aWZ5IGZyb20gJy4vV2lkZ2V0cy9Ob3RpZnknO1xyXG5pbXBvcnQgZnVsbFNjcmVlbiBmcm9tICcuL1dpZGdldHMvRnVsbFNjcmVlbic7XHJcbmltcG9ydCBkZWZhdWx0VG9vbGJhciBmcm9tICcuL1dpZGdldHMvRGVmYXVsdFRvb2xiYXInO1xyXG5pbXBvcnQgZGVmYXVsdEdyaWRPYnNvbGV0ZSBmcm9tICcuL1dpZGdldHMvR3JpZC9EZWZhdWx0R3JpZE9ic29sZXRlJztcclxuaW1wb3J0IGRlZmF1bHRUcmVlTGlzdCBmcm9tICcuL1dpZGdldHMvR3JpZC9EZWZhdWx0VHJlZUxpc3QnO1xyXG5pbXBvcnQgZGVmYXVsdEdyaWQgZnJvbSAnLi9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQnO1xyXG5pbXBvcnQgKiBhcyBpbWFnZUNyb3BEaWFsb2cgZnJvbSAnLi9XaWRnZXRzL0ltYWdlQ3JvcERpYWxvZyc7XHJcbmltcG9ydCB7IEFjY291bnRTZXR0aW5nc1BhZ2UgfSBmcm9tICcuL1BhZ2VzL0FjY291bnRTZXR0aW5ncyc7XHJcbmltcG9ydCAqIGFzIHN0eWxpbmcgZnJvbSAnLi9TdHlsaW5nL0luZGV4JztcclxuaW1wb3J0ICogYXMgcG9wdXAgZnJvbSAnLi9XaWRnZXRzL1BvcHVwJztcclxuaW1wb3J0ICogYXMgY29uZmlybSBmcm9tICcuL1dpZGdldHMvQ29uZmlybSc7XHJcbmltcG9ydCAqIGFzIGxhbmRpbmcgZnJvbSAnLi9XaWRnZXRzL0xhbmRpbmcnO1xyXG5pbXBvcnQgKiBhcyBoZWxwZXJzIGZyb20gJy4vSGVscGVycy9JbmRleCc7XHJcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4vVXRpbHMvSW5kZXgnO1xyXG5pbXBvcnQgKiBhcyBhY2Nlc3NEZW5pZWQgZnJvbSAnLi9XaWRnZXRzL0FjY2Vzc0RlbmllZFRvUmVwb3J0JztcclxuaW1wb3J0IGdyaWRDb2x1bW5UeXBlcyBmcm9tICcuL1JlcG9ydHMvQnVzaW5lc3MvR3JpZENvbHVtblR5cGVzJztcclxuaW1wb3J0ICogYXMgQ0RNIGZyb20gJy4vUmVwb3J0cy9QYWdlcy9DRE0vSW5kZXgnO1xyXG5pbXBvcnQgeyBTZXNzaW9uTm90aWZpZXIgfSBmcm9tICcuL0NvbXBvbmVudHMvU2Vzc2lvbk5vdGlmaWVyJztcclxuaW1wb3J0IHsgRmlsZUltcG9ydGVyIH0gZnJvbSAnLi9Db21wb25lbnRzL0ZpbGVJbXBvcnRlci9JbmRleCc7XHJcbmltcG9ydCB7IEZpbGVVcGxvYWRlciB9IGZyb20gJy4vQ29tcG9uZW50cy9GaWxlVXBsb2FkZXIvSW5kZXgnO1xyXG5pbXBvcnQgeyBDZG1JbXBvcnRGaWxlTW9kZSB9IGZyb20gJy4vUmVwb3J0cy9CdXNpbmVzcyc7XHJcblxyXG5pbXBvcnQgR3JpZFJlcG9ydFBhZ2UgZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL0dyaWQvSW5kZXgnO1xyXG5pbXBvcnQgU2xpZGVzaG93UmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvU2xpZGVzaG93L0luZGV4JztcclxuaW1wb3J0IERhc2hib2FyZFJlcG9ydFBhZ2UgZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL0Rhc2hib2FyZC9JbmRleCc7XHJcbmltcG9ydCBEWFJlcG9ydFBhZ2UgZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL1JlcG9ydC9JbmRleCc7XHJcbmltcG9ydCBEaWFncmFtUmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvRGlhZ3JhbS9JbmRleCc7XHJcbmltcG9ydCBDRE1SZXBvcnRQYWdlIGZyb20gJy4vUmVwb3J0cy9QYWdlcy9DRE0vSW5kZXgnO1xyXG5pbXBvcnQgR2FudHRDaGFydFJlcG9ydFBhZ2UgZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL0dhbm50Q2hhcnQvSW5kZXgnO1xyXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuL0NvbmZpZy9JbmRleCc7XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcclxuY29uc3QgSXN6b2xlYVVJID0ge1xyXG4gIGNvbmZpZyxcclxuXHJcbiAgSGVhZGVyLFxyXG4gIEZvb3RlcixcclxuICBOYXZpZ2F0aW9uTWVudSxcclxuICBVc2VyTWVudSxcclxuICBNZW51U3dpdGNoZXIsXHJcblxyXG4gIGRhdGEsXHJcblxyXG4gIHdpZGdldHM6IHtcclxuICAgIG5vdGlmeSxcclxuICAgIGZ1bGxTY3JlZW4sXHJcbiAgICBwb3B1cCxcclxuICAgIGNvbmZpcm0sXHJcbiAgICBsYW5kaW5nLFxyXG4gICAgYWNjZXNzRGVuaWVkLFxyXG4gICAgZGVmYXVsdEdyaWRPYnNvbGV0ZSxcclxuICAgIGRlZmF1bHRUcmVlTGlzdCxcclxuICAgIGRlZmF1bHRHcmlkLFxyXG4gICAgZGVmYXVsdFRvb2xiYXIsXHJcbiAgICBiYWNrZ3JvdW5kSW1hZ2VWaWV3ZXIsXHJcbiAgICBpbWFnZUNyb3BEaWFsb2dcclxuICB9LFxyXG4gIHBhZ2VzOiB7XHJcbiAgICBBY2NvdW50U2V0dGluZ3NQYWdlXHJcbiAgfSxcclxuICBjb21wb25lbnRzOiB7XHJcbiAgICBDRE0sXHJcbiAgICBTZXNzaW9uTm90aWZpZXIsXHJcbiAgICBGaWxlSW1wb3J0ZXIsXHJcbiAgICBGaWxlVXBsb2FkZXIsXHJcbiAgfSxcclxuXHJcbiAgc3R5bGluZyxcclxuICBoZWxwZXJzLFxyXG4gIHV0aWxzLFxyXG5cclxuICByZXBvcnRzOiB7XHJcbiAgICBDRE1SZXBvcnRQYWdlLFxyXG4gICAgRGlhZ3JhbVJlcG9ydFBhZ2UsXHJcbiAgICBHcmlkUmVwb3J0UGFnZSxcclxuICAgIERhc2hib2FyZFJlcG9ydFBhZ2UsXHJcbiAgICBEWFJlcG9ydFBhZ2UsXHJcbiAgICBTbGlkZXNob3dSZXBvcnRQYWdlLFxyXG4gICAgR2FudHRDaGFydFJlcG9ydFBhZ2UsXHJcbiAgICBncmlkQ29sdW1uVHlwZXMsXHJcbiAgfSxcclxuICBidXNpbmVzczoge1xyXG4gICAgTGljZW5jZVN0YXR1cyxcclxuICAgIE1lbnVJdGVtVHlwZSxcclxuICAgIENkbUltcG9ydEZpbGVNb2RlLFxyXG4gICAgRm9vdGVySW5kaWNhdG9yU3RhdHVzLFxyXG4gICAgR3JpZERhdGFDb2x1bW5EYXRhVHlwZVxyXG4gIH1cclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IElzem9sZWFVSTtcclxuXHJcbih3aW5kb3cgYXMgYW55KS5Jc3pvbGVhVUkgPSBJc3pvbGVhVUk7XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsbUJBQWMsSUFBTSxJQUFNO0FBQUEsaUJBQ0osQUFBaEIsT0FBTyxNQUFTLGNBQWEsS0FBTyxFQUFFLFNBQU8sVUFDeEIsQUFBaEIsT0FB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QjtBQUFBLGtCQUVsQyxZQUFZO0FBQUEsa0JBQ1o7QUFBQTtBQUVGO0FBQUEsbUJBQ0c7QUFDSCxzQkFBTSx3QkFBd0IsRUFBRSxXQUFXLEVBQUUsT0FBTztBQUNwRCw4QkFBYyxTQUFTLGlCQUFpQixTQUFTO0FBRWpELHNDQUFzQixTQUFTO0FBQy9CLDhCQUFjLElBQUksV0FBVyxpQ0FDdkIsS0FBSyxzQkFBc0IsdUJBQTRCLEtBRGhDO0FBQUEsa0JBRTNCLHFCQUFxQjtBQUFBLGtCQUNyQjtBQUFBO0FBRUY7QUFBQSxtQkFDRztBQUFBLG1CQUNBO0FBQ0g7QUFBQTtBQUdKLGdCQUFJLGFBQWE7QUFDZiwwQkFBWTtBQUNaLG1CQUFLLFFBQVEsS0FBSztBQUFBO0FBQUEsYUFFbkI7QUFFSCx3QkFBYyxTQUFTO0FBQUE7QUFBQTtBQUkzQixXQUFLLFlBQVksU0FBUyxVQUFVO0FBRXBDLGVBQVMsU0FBUztBQUVsQixXQUFLLGVBQWUsSUFBSSxhQUFhLEVBQUMsVUFBVSxNQUFNLEtBQUssV0FBVyxpQkFBaUIsQ0FBQyxNQUFNO0FBQUE7QUFDOUYsV0FBSyxhQUFhLE1BQU0sS0FBSyxRQUFRLGFBQWE7QUFBQTtBQUFBOzs7QUMzSHRELE1BQU0sWUFBWTtBQUFBLElBQ2hCO0FBQUEsSUFFQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUVBO0FBQUEsSUFFQSxTQUFTO0FBQUEsTUFDUDtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUE7QUFBQSxJQUVGLE9BQU87QUFBQSxNQUNMO0FBQUE7QUFBQSxJQUVGLFlBQVk7QUFBQSxNQUNWO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUE7QUFBQSxJQUdGO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUVBLFNBQVM7QUFBQSxNQUNQO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBO0FBQUEsSUFFRixVQUFVO0FBQUEsTUFDUjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQTtBQUFBO0FBSUosTUFBTyxrQkFBUTtBQUVmLEVBQUMsT0FBZSxZQUFZOyIsCiAgIm5hbWVzIjogW10KfQo=
|