mtrl-addons 0.4.0 → 0.4.2
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.
- package/dist/components/form/features/submit.d.ts +1 -0
- package/dist/index.js +11 -2
- package/dist/index.mjs +11 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -6567,6 +6567,10 @@ var withData = (config) => {
|
|
|
6567
6567
|
state.currentData = { ...state.initialData };
|
|
6568
6568
|
state.modified = false;
|
|
6569
6569
|
updateBeforeUnloadState(false);
|
|
6570
|
+
component2.emit?.(FORM_EVENTS.STATE_CHANGE, {
|
|
6571
|
+
modified: false,
|
|
6572
|
+
state: DATA_STATE.PRISTINE
|
|
6573
|
+
});
|
|
6570
6574
|
},
|
|
6571
6575
|
reset(force = false) {
|
|
6572
6576
|
performReset();
|
|
@@ -6807,6 +6811,7 @@ var withSubmit = (config) => {
|
|
|
6807
6811
|
}
|
|
6808
6812
|
}
|
|
6809
6813
|
component2.state.submitting = true;
|
|
6814
|
+
component2.disableControls();
|
|
6810
6815
|
if (component2.element) {
|
|
6811
6816
|
const prefix = config.prefix || "mtrl";
|
|
6812
6817
|
const componentName = config.componentName || "form";
|
|
@@ -6844,6 +6849,7 @@ var withSubmit = (config) => {
|
|
|
6844
6849
|
const componentName = config.componentName || "form";
|
|
6845
6850
|
component2.element.classList.remove(`${prefix}-${componentName}--${FORM_CLASSES.SUBMITTING}`);
|
|
6846
6851
|
}
|
|
6852
|
+
component2.enableControls();
|
|
6847
6853
|
component2.emit?.(FORM_EVENTS.SUBMIT_ERROR, error);
|
|
6848
6854
|
throw error;
|
|
6849
6855
|
}
|
|
@@ -7156,6 +7162,9 @@ var withAPI2 = (config) => {
|
|
|
7156
7162
|
clear(force) {
|
|
7157
7163
|
return component2.clear(force);
|
|
7158
7164
|
},
|
|
7165
|
+
snapshot() {
|
|
7166
|
+
component2.snapshot();
|
|
7167
|
+
},
|
|
7159
7168
|
enable() {
|
|
7160
7169
|
component2.enableFields();
|
|
7161
7170
|
return api;
|
|
@@ -7222,5 +7231,5 @@ var createForm = (config = {}) => {
|
|
|
7222
7231
|
}
|
|
7223
7232
|
};
|
|
7224
7233
|
|
|
7225
|
-
//# debugId=
|
|
7226
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvdXRpbHMudHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvdGFwLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL3N3aXBlLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL2xvbmdwcmVzcy50cyIsICIuLi9zcmMvY29yZS9nZXN0dXJlcy9wYW4udHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvcGluY2gudHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvcm90YXRlLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL21hbmFnZXIudHMiLCAiLi4vc3JjL2NvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlcy9pbmRleC50cyIsICIuLi9zcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3RhcC50cyIsICIuLi9zcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3N3aXBlLnRzIiwgIi4uL3NyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvbG9uZ3ByZXNzLnRzIiwgIi4uL3NyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvcGFuLnRzIiwgIi4uL3NyYy9jb3JlL2xheW91dC9zY2hlbWEudHMiLCAiLi4vc3JjL2NvcmUvbGF5b3V0L2NvbmZpZy50cyIsICIuLi9zcmMvY29yZS9sYXlvdXQvanN4LnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L3ZpZXdwb3J0LnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3V0aWxzLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2Jhc2UudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvY29uc3RhbnRzLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3ZpcnR1YWwudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvc2Nyb2xsaW5nLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL21vbWVudHVtLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3Njcm9sbGJhci50cyIsICIuLi9zcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9jb2xsZWN0aW9uLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3BsYWNlaG9sZGVycy50cyIsICIuLi9zcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9yZW5kZXJpbmcudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvZXZlbnRzLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L3ZsaXN0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL3ZpZXdwb3J0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL2FwaS50cyIsICIuLi9zcmMvY29tcG9uZW50cy92bGlzdC9jb25zdGFudHMudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvdmxpc3QvZmVhdHVyZXMvc2VsZWN0aW9uLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL2tleWJvYXJkLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZm9ybS50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2xheW91dC50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2NvbnN0YW50cy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2NvbmZpZy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2ZpZWxkcy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2RhdGEudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9jb250cm9sbGVyLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZmVhdHVyZXMvc3VibWl0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZmVhdHVyZXMvcHJvdGVjdGlvbi50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2FwaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy91dGlscy50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgZ2VzdHVyZSBkZXRlY3Rpb25cbiAqL1xuXG5pbXBvcnQgeyBHZXN0dXJlRXZlbnQsIEdlc3R1cmVTdGF0ZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQ2FsY3VsYXRlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50c1xuICpcbiAqIEBwYXJhbSB4MSAtIFggY29vcmRpbmF0ZSBvZiBmaXJzdCBwb2ludFxuICogQHBhcmFtIHkxIC0gWSBjb29yZGluYXRlIG9mIGZpcnN0IHBvaW50XG4gKiBAcGFyYW0geDIgLSBYIGNvb3JkaW5hdGUgb2Ygc2Vjb25kIHBvaW50XG4gKiBAcGFyYW0geTIgLSBZIGNvb3JkaW5hdGUgb2Ygc2Vjb25kIHBvaW50XG4gKiBAcmV0dXJucyBEaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpc3RhbmNlKFxuICB4MTogbnVtYmVyLFxuICB5MTogbnVtYmVyLFxuICB4MjogbnVtYmVyLFxuICB5MjogbnVtYmVyXG4pOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHgyIC0geDEsIDIpICsgTWF0aC5wb3coeTIgLSB5MSwgMikpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBhbmdsZSBiZXR3ZWVuIHR3byBwb2ludHMgaW4gZGVncmVlcyAoMC0zNjApXG4gKlxuICogQHBhcmFtIHgxIC0gWCBjb29yZGluYXRlIG9mIGZpcnN0IHBvaW50XG4gKiBAcGFyYW0geTEgLSBZIGNvb3JkaW5hdGUgb2YgZmlyc3QgcG9pbnRcbiAqIEBwYXJhbSB4MiAtIFggY29vcmRpbmF0ZSBvZiBzZWNvbmQgcG9pbnRcbiAqIEBwYXJhbSB5MiAtIFkgY29vcmRpbmF0ZSBvZiBzZWNvbmQgcG9pbnRcbiAqIEByZXR1cm5zIEFuZ2xlIGluIGRlZ3JlZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFuZ2xlKFxuICB4MTogbnVtYmVyLFxuICB5MTogbnVtYmVyLFxuICB4MjogbnVtYmVyLFxuICB5MjogbnVtYmVyXG4pOiBudW1iZXIge1xuICBjb25zdCBhbmdsZSA9IChNYXRoLmF0YW4yKHkyIC0geTEsIHgyIC0geDEpICogMTgwKSAvIE1hdGguUEk7XG4gIHJldHVybiBhbmdsZSA8IDAgPyBhbmdsZSArIDM2MCA6IGFuZ2xlO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGJhc2UgZ2VzdHVyZSBldmVudFxuICpcbiAqIEBwYXJhbSB0eXBlIC0gVHlwZSBvZiBnZXN0dXJlXG4gKiBAcGFyYW0gb3JpZ2luYWxFdmVudCAtIE9yaWdpbmFsIERPTSBldmVudFxuICogQHBhcmFtIHN0YXRlIC0gQ3VycmVudCBnZXN0dXJlIHN0YXRlXG4gKiBAcmV0dXJucyBCYXNlIGdlc3R1cmUgZXZlbnQgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHZXN0dXJlRXZlbnQoXG4gIHR5cGU6IHN0cmluZyxcbiAgb3JpZ2luYWxFdmVudDogRXZlbnQsXG4gIHN0YXRlOiBHZXN0dXJlU3RhdGVcbik6IEdlc3R1cmVFdmVudCB7XG4gIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICBsZXQgZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlO1xuXG4gIGNvbnN0IGV2ZW50OiBHZXN0dXJlRXZlbnQgPSB7XG4gICAgdHlwZSxcbiAgICBvcmlnaW5hbEV2ZW50LFxuICAgIHRhcmdldDpcbiAgICAgIChzdGF0ZS50YXJnZXQgYXMgRXZlbnRUYXJnZXQpIHx8IChvcmlnaW5hbEV2ZW50LnRhcmdldCBhcyBFdmVudFRhcmdldCksXG4gICAgc3RhcnRUaW1lOiBzdGF0ZS5zdGFydFRpbWUsXG4gICAgZW5kVGltZSxcbiAgICBkdXJhdGlvbjogZW5kVGltZSAtIHN0YXRlLnN0YXJ0VGltZSxcbiAgICBkZWZhdWx0UHJldmVudGVkLFxuICAgIHByZXZlbnREZWZhdWx0OiAoKSA9PiB7XG4gICAgICBkZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgIGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgaWYgKG9yaWdpbmFsRXZlbnQuY2FuY2VsYWJsZSkge1xuICAgICAgICBvcmlnaW5hbEV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBzdG9wUHJvcGFnYXRpb246ICgpID0+IHtcbiAgICAgIG9yaWdpbmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gZXZlbnQ7XG59XG5cbi8qKlxuICogRGV0ZWN0IGlmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgdG91Y2ggZXZlbnRzXG4gKlxuICogQHJldHVybnMgV2hldGhlciB0b3VjaCBpcyBzdXBwb3J0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1RvdWNoU3VwcG9ydCgpOiBib29sZWFuIHtcbiAgY29uc3QgbWF4UG9pbnRzID0gKG5hdmlnYXRvciBhcyBhbnkpLm1heFRvdWNoUG9pbnRzO1xuICByZXR1cm4gKFxuICAgIFwib250b3VjaHN0YXJ0XCIgaW4gd2luZG93IHx8ICh0eXBlb2YgbWF4UG9pbnRzID09PSBcIm51bWJlclwiICYmIG1heFBvaW50cyA+IDApXG4gICk7XG59XG5cbi8qKlxuICogRGV0ZWN0IGlmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgcG9pbnRlciBldmVudHNcbiAqXG4gKiBAcmV0dXJucyBXaGV0aGVyIHBvaW50ZXIgZXZlbnRzIGFyZSBzdXBwb3J0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1BvaW50ZXJTdXBwb3J0KCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISF3aW5kb3cuUG9pbnRlckV2ZW50O1xufVxuXG4vKipcbiAqIEV4dHJhY3Qgbm9ybWFsaXplZCB0b3VjaCBjb29yZGluYXRlcyBmcm9tIGFuIGV2ZW50XG4gKiBXb3JrcyB3aXRoIG1vdXNlIGV2ZW50cywgdG91Y2ggZXZlbnRzIGFuZCBwb2ludGVyIGV2ZW50c1xuICpcbiAqIEBwYXJhbSBlIC0gRE9NIGV2ZW50XG4gKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBjbGllbnRYIGFuZCBjbGllbnRZIGNvb3JkaW5hdGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUb3VjaENvb3JkaW5hdGVzKFxuICBlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCB8IFBvaW50ZXJFdmVudFxuKTogeyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9IHtcbiAgaWYgKFwidG91Y2hlc1wiIGluIGUgJiYgQXJyYXkuaXNBcnJheShlLnRvdWNoZXMpICYmIGUudG91Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsaWVudFg6IGUudG91Y2hlc1swXS5jbGllbnRYLFxuICAgICAgY2xpZW50WTogZS50b3VjaGVzWzBdLmNsaWVudFksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2xpZW50WDogKGUgYXMgTW91c2VFdmVudCB8IFBvaW50ZXJFdmVudCkuY2xpZW50WCxcbiAgICBjbGllbnRZOiAoZSBhcyBNb3VzZUV2ZW50IHwgUG9pbnRlckV2ZW50KS5jbGllbnRZLFxuICB9O1xufVxuIiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy90YXAudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gVGFwIGdlc3R1cmUgZGV0ZWN0aW9uXG4gKi9cblxuaW1wb3J0IHsgVGFwRXZlbnQsIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0IH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVHZXN0dXJlRXZlbnQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBEZXRlY3QgdGFwIGdlc3R1cmVcbiAqIFxuICogQHBhcmFtIGNvbnRleHQgLSBHZXN0dXJlIGRldGVjdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBUYXAgZXZlbnQgb3IgbnVsbCBpZiBubyB0YXAgZGV0ZWN0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFRhcChjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCk6IFRhcEV2ZW50IHwgbnVsbCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9wdGlvbnMsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG4gIFxuICAvLyBDYWxjdWxhdGUgZGlzdGFuY2UgYmV0d2VlbiBzdGFydCBhbmQgY3VycmVudCBwb3NpdGlvblxuICBjb25zdCBkZWx0YVggPSBzdGF0ZS5jdXJyZW50WCAtIHN0YXRlLnN0YXJ0WDtcbiAgY29uc3QgZGVsdGFZID0gc3RhdGUuY3VycmVudFkgLSBzdGF0ZS5zdGFydFk7XG4gIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG4gIFxuICAvLyBDaGVjayBpZiBtb3ZlbWVudCBpcyB3aXRoaW4gdGhyZXNob2xkXG4gIGlmIChkaXN0YW5jZSA8IG9wdGlvbnMudGFwRGlzdGFuY2VUaHJlc2hvbGQpIHtcbiAgICAvLyBDaGVjayBmb3IgZG91YmxlIHRhcFxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgaXNEb3VibGVUYXAgPSBub3cgLSBzdGF0ZS5sYXN0VGFwVGltZSA8IDMwMDtcbiAgICBcbiAgICBjb25zdCB0YXBDb3VudCA9IGlzRG91YmxlVGFwID8gc3RhdGUudGFwQ291bnQgKyAxIDogMTtcbiAgICBcbiAgICAvLyBDcmVhdGUgdGFwIGV2ZW50XG4gICAgY29uc3QgdGFwRXZlbnQ6IFRhcEV2ZW50ID0ge1xuICAgICAgLi4uY3JlYXRlR2VzdHVyZUV2ZW50KCd0YXAnLCBvcmlnaW5hbEV2ZW50LCBzdGF0ZSksXG4gICAgICB0eXBlOiAndGFwJyxcbiAgICAgIGNvdW50OiB0YXBDb3VudCxcbiAgICAgIHg6IHN0YXRlLmN1cnJlbnRYLFxuICAgICAgeTogc3RhdGUuY3VycmVudFlcbiAgICB9O1xuICAgIFxuICAgIHJldHVybiB0YXBFdmVudDtcbiAgfVxuICBcbiAgcmV0dXJuIG51bGw7XG59IiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy9zd2lwZS50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBTd2lwZSBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IFN3aXBlRXZlbnQsIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0LCBTV0lQRV9ESVJFQ1RJT05TIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVHZXN0dXJlRXZlbnQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBEZXRlcm1pbmUgc3dpcGUgZGlyZWN0aW9uIGJhc2VkIG9uIGRlbHRhIFggYW5kIFlcbiAqIFxuICogQHBhcmFtIGRlbHRhWCAtIERpc3RhbmNlIG1vdmVkIGluIFggZGlyZWN0aW9uXG4gKiBAcGFyYW0gZGVsdGFZIC0gRGlzdGFuY2UgbW92ZWQgaW4gWSBkaXJlY3Rpb25cbiAqIEByZXR1cm5zIERpcmVjdGlvbiBvZiB0aGUgc3dpcGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN3aXBlRGlyZWN0aW9uKGRlbHRhWDogbnVtYmVyLCBkZWx0YVk6IG51bWJlcik6IFNXSVBFX0RJUkVDVElPTlMge1xuICBpZiAoTWF0aC5hYnMoZGVsdGFYKSA+IE1hdGguYWJzKGRlbHRhWSkpIHtcbiAgICByZXR1cm4gZGVsdGFYID4gMCA/IFNXSVBFX0RJUkVDVElPTlMuUklHSFQgOiBTV0lQRV9ESVJFQ1RJT05TLkxFRlQ7XG4gIH1cbiAgcmV0dXJuIGRlbHRhWSA+IDAgPyBTV0lQRV9ESVJFQ1RJT05TLkRPV04gOiBTV0lQRV9ESVJFQ1RJT05TLlVQO1xufVxuXG4vKipcbiAqIERldGVjdCBzd2lwZSBnZXN0dXJlXG4gKiBcbiAqIEBwYXJhbSBjb250ZXh0IC0gR2VzdHVyZSBkZXRlY3Rpb24gY29udGV4dFxuICogQHJldHVybnMgU3dpcGUgZXZlbnQgb3IgbnVsbCBpZiBubyBzd2lwZSBkZXRlY3RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0U3dpcGUoY29udGV4dDogR2VzdHVyZURldGVjdGlvbkNvbnRleHQpOiBTd2lwZUV2ZW50IHwgbnVsbCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9wdGlvbnMsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG4gIFxuICAvLyBDYWxjdWxhdGUgZGVsdGFzIGFuZCBkaXN0YW5jZVxuICBjb25zdCBkZWx0YVggPSBzdGF0ZS5jdXJyZW50WCAtIHN0YXRlLnN0YXJ0WDtcbiAgY29uc3QgZGVsdGFZID0gc3RhdGUuY3VycmVudFkgLSBzdGF0ZS5zdGFydFk7XG4gIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG4gIFxuICAvLyBDYWxjdWxhdGUgdGltZSBhbmQgdmVsb2NpdHlcbiAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gIGNvbnN0IGRlbHRhVGltZSA9IGVuZFRpbWUgLSBzdGF0ZS5zdGFydFRpbWU7XG4gIGNvbnN0IHZlbG9jaXR5ID0gZGlzdGFuY2UgLyBkZWx0YVRpbWU7XG4gIFxuICAvLyBDaGVjayBpZiBpdCdzIGEgc3dpcGVcbiAgaWYgKGRpc3RhbmNlID49IG9wdGlvbnMuc3dpcGVUaHJlc2hvbGQgJiYgZGVsdGFUaW1lIDw9IG9wdGlvbnMuc3dpcGVUaW1lVGhyZXNob2xkKSB7XG4gICAgY29uc3QgZGlyZWN0aW9uID0gZ2V0U3dpcGVEaXJlY3Rpb24oZGVsdGFYLCBkZWx0YVkpO1xuICAgIFxuICAgIC8vIENyZWF0ZSBzd2lwZSBldmVudFxuICAgIGNvbnN0IHN3aXBlRXZlbnQ6IFN3aXBlRXZlbnQgPSB7XG4gICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoJ3N3aXBlJywgb3JpZ2luYWxFdmVudCwgc3RhdGUpLFxuICAgICAgdHlwZTogJ3N3aXBlJyxcbiAgICAgIGRpcmVjdGlvbixcbiAgICAgIGRlbHRhWCxcbiAgICAgIGRlbHRhWSxcbiAgICAgIGRpc3RhbmNlLFxuICAgICAgdmVsb2NpdHksXG4gICAgICBzdGFydFg6IHN0YXRlLnN0YXJ0WCxcbiAgICAgIHN0YXJ0WTogc3RhdGUuc3RhcnRZLFxuICAgICAgZW5kWDogc3RhdGUuY3VycmVudFgsXG4gICAgICBlbmRZOiBzdGF0ZS5jdXJyZW50WVxuICAgIH07XG4gICAgXG4gICAgcmV0dXJuIHN3aXBlRXZlbnQ7XG4gIH1cbiAgXG4gIHJldHVybiBudWxsO1xufSIsCiAgICAiLy8gc3JjL2NvcmUvZ2VzdHVyZXMvbG9uZ3ByZXNzLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIExvbmcgcHJlc3MgZ2VzdHVyZSBkZXRlY3Rpb25cbiAqL1xuXG5pbXBvcnQgeyBMb25nUHJlc3NFdmVudCwgR2VzdHVyZURldGVjdGlvbkNvbnRleHQgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUdlc3R1cmVFdmVudCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIERldGVjdCBsb25nIHByZXNzIGdlc3R1cmVcbiAqIFxuICogVGhpcyBpcyBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSBvdGhlciBnZXN0dXJlIGRldGVjdG9ycyBhcyBpdCBzZXRzIHVwIGEgdGltZXJcbiAqIGFuZCByZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSB0aW1lciBjb21wbGV0ZXMuXG4gKiBcbiAqIEBwYXJhbSBjb250ZXh0IC0gR2VzdHVyZSBkZXRlY3Rpb24gY29udGV4dFxuICogQHBhcmFtIGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gY2FsbCB3aGVuIGxvbmcgcHJlc3MgaXMgZGV0ZWN0ZWRcbiAqIEByZXR1cm5zIENsZWFudXAgZnVuY3Rpb24gdG8gY2FuY2VsIHRoZSBsb25nIHByZXNzIGRldGVjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0TG9uZ1ByZXNzKFxuICBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCxcbiAgY2FsbGJhY2s6IChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWRcbik6ICgpID0+IHZvaWQge1xuICBjb25zdCB7IHN0YXRlLCBvcHRpb25zLCBvcmlnaW5hbEV2ZW50IH0gPSBjb250ZXh0O1xuICBcbiAgLy8gU2V0IGEgdGltZXIgZm9yIGxvbmcgcHJlc3MgZGV0ZWN0aW9uXG4gIGNvbnN0IHRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgIC8vIE9ubHkgdHJpZ2dlciBpZiBnZXN0dXJlIGlzIHN0aWxsIGFjdGl2ZVxuICAgIGlmIChzdGF0ZS5hY3RpdmUpIHtcbiAgICAgIC8vIENoZWNrIGlmIG1vdmVtZW50IGlzIHdpdGhpbiB0aHJlc2hvbGRcbiAgICAgIGNvbnN0IGRpZmZYID0gTWF0aC5hYnMoc3RhdGUuY3VycmVudFggLSBzdGF0ZS5zdGFydFgpO1xuICAgICAgY29uc3QgZGlmZlkgPSBNYXRoLmFicyhzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLnN0YXJ0WSk7XG4gICAgICBcbiAgICAgIGlmIChkaWZmWCA8IG9wdGlvbnMudGFwRGlzdGFuY2VUaHJlc2hvbGQgJiYgZGlmZlkgPCBvcHRpb25zLnRhcERpc3RhbmNlVGhyZXNob2xkKSB7XG4gICAgICAgIC8vIENyZWF0ZSBsb25nIHByZXNzIGV2ZW50XG4gICAgICAgIGNvbnN0IGxvbmdQcmVzc0V2ZW50OiBMb25nUHJlc3NFdmVudCA9IHtcbiAgICAgICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoJ2xvbmdwcmVzcycsIG9yaWdpbmFsRXZlbnQsIHN0YXRlKSxcbiAgICAgICAgICB0eXBlOiAnbG9uZ3ByZXNzJyxcbiAgICAgICAgICB4OiBzdGF0ZS5jdXJyZW50WCxcbiAgICAgICAgICB5OiBzdGF0ZS5jdXJyZW50WVxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgLy8gVHJpZ2dlciBjYWxsYmFja1xuICAgICAgICBjYWxsYmFjayhsb25nUHJlc3NFdmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBvcHRpb25zLmxvbmdQcmVzc1RpbWUpO1xuICBcbiAgLy8gUmV0dXJuIGNsZWFudXAgZnVuY3Rpb25cbiAgcmV0dXJuICgpID0+IHtcbiAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICB9O1xufVxuXG4vKipcbiAqIENoZWNrIGlmIG1vdmVtZW50IHdvdWxkIGNhbmNlbCBhIGxvbmcgcHJlc3NcbiAqIFxuICogQHBhcmFtIGNvbnRleHQgLSBHZXN0dXJlIGRldGVjdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsb25nIHByZXNzIHNob3VsZCBiZSBjYW5jZWxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkQ2FuY2VsTG9uZ1ByZXNzKGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0KTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgc3RhdGUsIG9wdGlvbnMgfSA9IGNvbnRleHQ7XG4gIFxuICBjb25zdCBkaWZmWCA9IE1hdGguYWJzKHN0YXRlLmN1cnJlbnRYIC0gc3RhdGUuc3RhcnRYKTtcbiAgY29uc3QgZGlmZlkgPSBNYXRoLmFicyhzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLnN0YXJ0WSk7XG4gIFxuICByZXR1cm4gZGlmZlggPiBvcHRpb25zLnRhcERpc3RhbmNlVGhyZXNob2xkIHx8IGRpZmZZID4gb3B0aW9ucy50YXBEaXN0YW5jZVRocmVzaG9sZDtcbn0iLAogICAgIi8vIHNyYy9jb3JlL2dlc3R1cmVzL3Bhbi50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBQYW4gZ2VzdHVyZSBkZXRlY3Rpb25cbiAqL1xuXG5pbXBvcnQgeyBQYW5FdmVudCwgR2VzdHVyZURldGVjdGlvbkNvbnRleHQgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlR2VzdHVyZUV2ZW50IH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBEZXRlY3QgcGFuIGdlc3R1cmVcbiAqXG4gKiBAcGFyYW0gY29udGV4dCAtIEdlc3R1cmUgZGV0ZWN0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIFBhbiBldmVudCBvciBudWxsIGlmIG5vIHNpZ25pZmljYW50IG1vdmVtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RQYW4oY29udGV4dDogR2VzdHVyZURldGVjdGlvbkNvbnRleHQpOiBQYW5FdmVudCB8IG51bGwge1xuICBjb25zdCB7IHN0YXRlLCBvcmlnaW5hbEV2ZW50IH0gPSBjb250ZXh0O1xuXG4gIC8vIENhbGN1bGF0ZSBkZWx0YSBmcm9tIHN0YXJ0IHBvc2l0aW9uXG4gIGNvbnN0IGRlbHRhWCA9IHN0YXRlLmN1cnJlbnRYIC0gc3RhdGUuc3RhcnRYO1xuICBjb25zdCBkZWx0YVkgPSBzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLnN0YXJ0WTtcblxuICAvLyBDYWxjdWxhdGUgZGVsdGEgZnJvbSBsYXN0IHBvc2l0aW9uIHRvIGRldGVybWluZSBpZiB0aGVyZSdzIHNpZ25pZmljYW50IG1vdmVtZW50XG4gIGNvbnN0IG1vdmVEZWx0YVggPSBzdGF0ZS5jdXJyZW50WCAtIHN0YXRlLmxhc3RYO1xuICBjb25zdCBtb3ZlRGVsdGFZID0gc3RhdGUuY3VycmVudFkgLSBzdGF0ZS5sYXN0WTtcbiAgY29uc3QgbW92ZURlbHRhID0gTWF0aC5zcXJ0KFxuICAgIG1vdmVEZWx0YVggKiBtb3ZlRGVsdGFYICsgbW92ZURlbHRhWSAqIG1vdmVEZWx0YVlcbiAgKTtcblxuICAvLyBDaGVjayBpZiBtb3ZlbWVudCBpcyBzaWduaWZpY2FudFxuICBpZiAobW92ZURlbHRhID4gMCkge1xuICAgIC8vIENyZWF0ZSBwYW4gZXZlbnRcbiAgICBjb25zdCBwYW5FdmVudDogUGFuRXZlbnQgPSB7XG4gICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoXCJwYW5cIiwgb3JpZ2luYWxFdmVudCwgc3RhdGUpLFxuICAgICAgdHlwZTogXCJwYW5cIixcbiAgICAgIGRlbHRhWCxcbiAgICAgIGRlbHRhWSxcbiAgICAgIHN0YXJ0WDogc3RhdGUuc3RhcnRYLFxuICAgICAgc3RhcnRZOiBzdGF0ZS5zdGFydFksXG4gICAgICBjdXJyZW50WDogc3RhdGUuY3VycmVudFgsXG4gICAgICBjdXJyZW50WTogc3RhdGUuY3VycmVudFksXG4gICAgfTtcblxuICAgIHJldHVybiBwYW5FdmVudDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy9waW5jaC50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBQaW5jaCBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IFBpbmNoRXZlbnQsIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUdlc3R1cmVFdmVudCwgZ2V0RGlzdGFuY2UgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIERldGVjdCBwaW5jaCBnZXN0dXJlXG4gKlxuICogQHBhcmFtIGNvbnRleHQgLSBHZXN0dXJlIGRldGVjdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gdG91Y2gxIC0gRmlyc3QgdG91Y2ggcG9pbnRcbiAqIEBwYXJhbSB0b3VjaDIgLSBTZWNvbmQgdG91Y2ggcG9pbnRcbiAqIEByZXR1cm5zIFBpbmNoIGV2ZW50IG9yIG51bGwgaWYgbm8gcGluY2ggZGV0ZWN0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFBpbmNoKFxuICBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCxcbiAgdG91Y2gxOiBUb3VjaCxcbiAgdG91Y2gyOiBUb3VjaFxuKTogUGluY2hFdmVudCB8IG51bGwge1xuICBjb25zdCB7IHN0YXRlLCBvcmlnaW5hbEV2ZW50IH0gPSBjb250ZXh0O1xuXG4gIC8vIENhbGN1bGF0ZSBjdXJyZW50IGRpc3RhbmNlIGJldHdlZW4gdG91Y2ggcG9pbnRzXG4gIGNvbnN0IGN1cnJlbnREaXN0YW5jZSA9IGdldERpc3RhbmNlKFxuICAgIHRvdWNoMS5jbGllbnRYLFxuICAgIHRvdWNoMS5jbGllbnRZLFxuICAgIHRvdWNoMi5jbGllbnRYLFxuICAgIHRvdWNoMi5jbGllbnRZXG4gICk7XG5cbiAgLy8gTWluaW11bSBtb3ZlbWVudCB0aHJlc2hvbGQgZm9yIHBpbmNoIGRldGVjdGlvblxuICBjb25zdCBQSU5DSF9USFJFU0hPTEQgPSAxMDtcblxuICAvLyBDaGVjayBpZiB0aGUgZGlzdGFuY2UgY2hhbmdlIGlzIHNpZ25pZmljYW50XG4gIGlmIChNYXRoLmFicyhjdXJyZW50RGlzdGFuY2UgLSBzdGF0ZS5zdGFydERpc3RhbmNlKSA+IFBJTkNIX1RIUkVTSE9MRCkge1xuICAgIC8vIENhbGN1bGF0ZSBzY2FsZSBmYWN0b3JcbiAgICBjb25zdCBzY2FsZSA9IGN1cnJlbnREaXN0YW5jZSAvIHN0YXRlLnN0YXJ0RGlzdGFuY2U7XG5cbiAgICAvLyBDYWxjdWxhdGUgY2VudGVyIHBvaW50XG4gICAgY29uc3QgY2VudGVyWCA9ICh0b3VjaDEuY2xpZW50WCArIHRvdWNoMi5jbGllbnRYKSAvIDI7XG4gICAgY29uc3QgY2VudGVyWSA9ICh0b3VjaDEuY2xpZW50WSArIHRvdWNoMi5jbGllbnRZKSAvIDI7XG5cbiAgICAvLyBDcmVhdGUgcGluY2ggZXZlbnRcbiAgICBjb25zdCBwaW5jaEV2ZW50OiBQaW5jaEV2ZW50ID0ge1xuICAgICAgLi4uY3JlYXRlR2VzdHVyZUV2ZW50KFwicGluY2hcIiwgb3JpZ2luYWxFdmVudCwgc3RhdGUpLFxuICAgICAgdHlwZTogXCJwaW5jaFwiLFxuICAgICAgc2NhbGUsXG4gICAgICBjZW50ZXJYLFxuICAgICAgY2VudGVyWSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHBpbmNoRXZlbnQ7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsCiAgICAiLy8gc3JjL2NvcmUvZ2VzdHVyZXMvcm90YXRlLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIFJvdGF0ZSBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IFJvdGF0ZUV2ZW50LCBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBjcmVhdGVHZXN0dXJlRXZlbnQsIGdldEFuZ2xlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBEZXRlY3Qgcm90YXRlIGdlc3R1cmVcbiAqXG4gKiBAcGFyYW0gY29udGV4dCAtIEdlc3R1cmUgZGV0ZWN0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB0b3VjaDEgLSBGaXJzdCB0b3VjaCBwb2ludFxuICogQHBhcmFtIHRvdWNoMiAtIFNlY29uZCB0b3VjaCBwb2ludFxuICogQHJldHVybnMgUm90YXRlIGV2ZW50IG9yIG51bGwgaWYgbm8gcm90YXRpb24gZGV0ZWN0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFJvdGF0ZShcbiAgY29udGV4dDogR2VzdHVyZURldGVjdGlvbkNvbnRleHQsXG4gIHRvdWNoMTogVG91Y2gsXG4gIHRvdWNoMjogVG91Y2hcbik6IFJvdGF0ZUV2ZW50IHwgbnVsbCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG5cbiAgLy8gQ2FsY3VsYXRlIGN1cnJlbnQgYW5nbGUgYmV0d2VlbiB0b3VjaCBwb2ludHNcbiAgY29uc3QgY3VycmVudEFuZ2xlID0gZ2V0QW5nbGUoXG4gICAgdG91Y2gxLmNsaWVudFgsXG4gICAgdG91Y2gxLmNsaWVudFksXG4gICAgdG91Y2gyLmNsaWVudFgsXG4gICAgdG91Y2gyLmNsaWVudFlcbiAgKTtcblxuICAvLyBNaW5pbXVtIHJvdGF0aW9uIHRocmVzaG9sZCBmb3IgZGV0ZWN0aW9uXG4gIGNvbnN0IFJPVEFUSU9OX1RIUkVTSE9MRCA9IDEwO1xuXG4gIC8vIENhbGN1bGF0ZSByb3RhdGlvbiBkaWZmZXJlbmNlXG4gIGNvbnN0IHJvdGF0aW9uRGlmZiA9IGN1cnJlbnRBbmdsZSAtIHN0YXRlLnN0YXJ0QW5nbGU7XG5cbiAgLy8gQ2hlY2sgaWYgcm90YXRpb24gaXMgc2lnbmlmaWNhbnRcbiAgaWYgKE1hdGguYWJzKHJvdGF0aW9uRGlmZikgPiBST1RBVElPTl9USFJFU0hPTEQpIHtcbiAgICAvLyBDYWxjdWxhdGUgY2VudGVyIHBvaW50XG4gICAgY29uc3QgY2VudGVyWCA9ICh0b3VjaDEuY2xpZW50WCArIHRvdWNoMi5jbGllbnRYKSAvIDI7XG4gICAgY29uc3QgY2VudGVyWSA9ICh0b3VjaDEuY2xpZW50WSArIHRvdWNoMi5jbGllbnRZKSAvIDI7XG5cbiAgICAvLyBDcmVhdGUgcm90YXRlIGV2ZW50XG4gICAgY29uc3Qgcm90YXRlRXZlbnQ6IFJvdGF0ZUV2ZW50ID0ge1xuICAgICAgLi4uY3JlYXRlR2VzdHVyZUV2ZW50KFwicm90YXRlXCIsIG9yaWdpbmFsRXZlbnQsIHN0YXRlKSxcbiAgICAgIHR5cGU6IFwicm90YXRlXCIsXG4gICAgICByb3RhdGlvbjogcm90YXRpb25EaWZmLFxuICAgICAgY2VudGVyWCxcbiAgICAgIGNlbnRlclksXG4gICAgfTtcblxuICAgIHJldHVybiByb3RhdGVFdmVudDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy9tYW5hZ2VyLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIEdlc3R1cmUgbWFuYWdlbWVudCBzeXN0ZW0gZm9yIGhhbmRsaW5nIHRvdWNoIGFuZCBtb3VzZSBpbnRlcmFjdGlvbnNcbiAqL1xuXG5pbXBvcnQgeyBcbiAgR2VzdHVyZUNvbmZpZyxcbiAgR2VzdHVyZU1hbmFnZXIsXG4gIEdlc3R1cmVTdGF0ZSxcbiAgR2VzdHVyZUhhbmRsZXIsXG4gIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0LFxuICBBbnlHZXN0dXJlRXZlbnQsXG4gIEdFU1RVUkVfVFlQRVMsXG4gIFNXSVBFX0RJUkVDVElPTlNcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmltcG9ydCB7IGRldGVjdFRhcCB9IGZyb20gJy4vdGFwJztcbmltcG9ydCB7IGRldGVjdFN3aXBlIH0gZnJvbSAnLi9zd2lwZSc7XG5pbXBvcnQgeyBkZXRlY3RMb25nUHJlc3MsIHNob3VsZENhbmNlbExvbmdQcmVzcyB9IGZyb20gJy4vbG9uZ3ByZXNzJztcbmltcG9ydCB7IGRldGVjdFBhbiB9IGZyb20gJy4vcGFuJztcbmltcG9ydCB7IGRldGVjdFBpbmNoIH0gZnJvbSAnLi9waW5jaCc7XG5pbXBvcnQgeyBkZXRlY3RSb3RhdGUgfSBmcm9tICcuL3JvdGF0ZSc7XG5pbXBvcnQgeyBoYXNUb3VjaFN1cHBvcnQsIGhhc1BvaW50ZXJTdXBwb3J0LCBnZXRUb3VjaENvb3JkaW5hdGVzIH0gZnJvbSAnLi91dGlscyc7XG5cbi8vIFJlLWV4cG9ydCB0eXBlcyBhbmQgY29uc3RhbnRzXG5leHBvcnQgeyBHRVNUVVJFX1RZUEVTLCBTV0lQRV9ESVJFQ1RJT05TIH07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGdlc3R1cmUgbWFuYWdlciBmb3IgaGFuZGxpbmcgdG91Y2ggYW5kIG1vdXNlIGludGVyYWN0aW9uc1xuICogXG4gKiBAcGFyYW0gZWxlbWVudCAtIERPTSBlbGVtZW50IHRvIGF0dGFjaCBnZXN0dXJlIHJlY29nbml0aW9uIHRvXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyBHZXN0dXJlIG1hbmFnZXIgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUdlc3R1cmVNYW5hZ2VyID0gKFxuICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgY29uZmlnOiBHZXN0dXJlQ29uZmlnID0ge31cbik6IEdlc3R1cmVNYW5hZ2VyID0+IHtcbiAgLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uXG4gIGNvbnN0IG9wdGlvbnM6IFJlcXVpcmVkPEdlc3R1cmVDb25maWc+ID0ge1xuICAgIHN3aXBlVGhyZXNob2xkOiAzMCxcbiAgICBzd2lwZVRpbWVUaHJlc2hvbGQ6IDMwMCxcbiAgICBsb25nUHJlc3NUaW1lOiA1MDAsXG4gICAgdGFwRGlzdGFuY2VUaHJlc2hvbGQ6IDEwLFxuICAgIHByZXZlbnREZWZhdWx0OiB0cnVlLFxuICAgIHN0b3BQcm9wYWdhdGlvbjogZmFsc2UsXG4gICAgLi4uY29uZmlnXG4gIH07XG4gIFxuICAvLyBFdmVudCBoYW5kbGVycyBzdG9yYWdlXG4gIGNvbnN0IGhhbmRsZXJzOiBNYXA8c3RyaW5nLCBTZXQ8R2VzdHVyZUhhbmRsZXI+PiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIEdlc3R1cmUgc3RhdGVcbiAgY29uc3Qgc3RhdGU6IEdlc3R1cmVTdGF0ZSA9IHtcbiAgICBhY3RpdmU6IGZhbHNlLFxuICAgIHN0YXJ0VGltZTogMCxcbiAgICBzdGFydFg6IDAsXG4gICAgc3RhcnRZOiAwLFxuICAgIGxhc3RYOiAwLFxuICAgIGxhc3RZOiAwLFxuICAgIGN1cnJlbnRYOiAwLFxuICAgIGN1cnJlbnRZOiAwLFxuICAgIHRvdWNoQ291bnQ6IDAsXG4gICAgbG9uZ1ByZXNzVGltZXI6IG51bGwsXG4gICAgc3RhcnREaXN0YW5jZTogMCxcbiAgICBzdGFydEFuZ2xlOiAwLFxuICAgIGxhc3RUYXBUaW1lOiAwLFxuICAgIHRhcENvdW50OiAwLFxuICAgIHRhcmdldDogbnVsbFxuICB9O1xuICBcbiAgLy8gRGV0ZWN0IGZlYXR1cmUgc3VwcG9ydFxuICBjb25zdCBzdXBwb3J0VG91Y2ggPSBoYXNUb3VjaFN1cHBvcnQoKTtcbiAgY29uc3Qgc3VwcG9ydFBvaW50ZXIgPSBoYXNQb2ludGVyU3VwcG9ydCgpO1xuICAgIFxuICBjb25zdCBnZXN0dXJlU3VwcG9ydCA9IHtcbiAgICB0YXA6IHRydWUsXG4gICAgc3dpcGU6IHRydWUsXG4gICAgc3dpcGVsZWZ0OiB0cnVlLFxuICAgIHN3aXBlcmlnaHQ6IHRydWUsXG4gICAgc3dpcGV1cDogdHJ1ZSxcbiAgICBzd2lwZWRvd246IHRydWUsXG4gICAgbG9uZ3ByZXNzOiB0cnVlLFxuICAgIHBhbjogdHJ1ZSxcbiAgICBwaW5jaDogc3VwcG9ydFRvdWNoIHx8IHN1cHBvcnRQb2ludGVyLFxuICAgIHJvdGF0ZTogc3VwcG9ydFRvdWNoIHx8IHN1cHBvcnRQb2ludGVyXG4gIH07XG4gIFxuICAvKipcbiAgICogRGlzcGF0Y2ggYSBnZXN0dXJlIGV2ZW50XG4gICAqL1xuICBjb25zdCBkaXNwYXRjaEdlc3R1cmUgPSAoZXZlbnQ6IEFueUdlc3R1cmVFdmVudCk6IHZvaWQgPT4ge1xuICAgIC8vIEdldCBoYW5kbGVycyBmb3IgdGhpcyBldmVudCB0eXBlXG4gICAgY29uc3QgZXZlbnRIYW5kbGVycyA9IGhhbmRsZXJzLmdldChldmVudC50eXBlKTtcbiAgICBpZiAoIWV2ZW50SGFuZGxlcnMpIHJldHVybjtcbiAgICBcbiAgICAvLyBDYWxsIGVhY2ggaGFuZGxlclxuICAgIGV2ZW50SGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhbmRsZXIoZXZlbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgaW4gZ2VzdHVyZSBoYW5kbGVyIGZvciAke2V2ZW50LnR5cGV9OmAsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvLyBGb3Igc3dpcGUsIGFsc28gZGlzcGF0Y2ggZGlyZWN0aW9uLXNwZWNpZmljIGV2ZW50c1xuICAgIGlmIChldmVudC50eXBlID09PSAnc3dpcGUnICYmICdkaXJlY3Rpb24nIGluIGV2ZW50KSB7XG4gICAgICBjb25zdCBkaXJlY3Rpb25FdmVudCA9IHsgLi4uZXZlbnQsIHR5cGU6IGBzd2lwZSR7ZXZlbnQuZGlyZWN0aW9ufWAgYXMgYW55IH07XG4gICAgICBkaXNwYXRjaEdlc3R1cmUoZGlyZWN0aW9uRXZlbnQgYXMgYW55KTtcbiAgICB9XG4gICAgXG4gICAgLy8gQXBwbHkgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciBwcmV2ZW50RGVmYXVsdCBhbmQgc3RvcFByb3BhZ2F0aW9uXG4gICAgaWYgKG9wdGlvbnMucHJldmVudERlZmF1bHQgJiYgIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIFxuICAgIGlmIChvcHRpb25zLnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9O1xuICBcbiAgLy8gUmVmZXJlbmNlIHRvIHRoZSBsb25ncHJlc3MgY2xlYW51cCBmdW5jdGlvblxuICBsZXQgbG9uZ1ByZXNzQ2xlYW51cDogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHRvdWNoL21vdXNlIHN0YXJ0XG4gICAqL1xuICBjb25zdCBoYW5kbGVTdGFydCA9IChlOiBUb3VjaEV2ZW50IHwgTW91c2VFdmVudCB8IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHRvdWNoID0gZ2V0VG91Y2hDb29yZGluYXRlcyhlKTtcbiAgICBjb25zdCB0b3VjaENvdW50ID0gJ3RvdWNoZXMnIGluIGUgPyBlLnRvdWNoZXMubGVuZ3RoIDogMTtcbiAgICBcbiAgICAvLyBTdG9yZSBnZXN0dXJlIHN0YXRlXG4gICAgc3RhdGUuYWN0aXZlID0gdHJ1ZTtcbiAgICBzdGF0ZS5zdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHN0YXRlLnN0YXJ0WCA9IHN0YXRlLmxhc3RYID0gc3RhdGUuY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgIHN0YXRlLnN0YXJ0WSA9IHN0YXRlLmxhc3RZID0gc3RhdGUuY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuICAgIHN0YXRlLnRvdWNoQ291bnQgPSB0b3VjaENvdW50O1xuICAgIHN0YXRlLnRhcmdldCA9IGUudGFyZ2V0O1xuICAgIFxuICAgIC8vIEhhbmRsZSBtdWx0aS10b3VjaCBnZXN0dXJlc1xuICAgIGlmICh0b3VjaENvdW50ID09PSAyICYmICd0b3VjaGVzJyBpbiBlKSB7XG4gICAgICBjb25zdCB0b3VjaDEgPSBlLnRvdWNoZXNbMF07XG4gICAgICBjb25zdCB0b3VjaDIgPSBlLnRvdWNoZXNbMV07XG4gICAgICBcbiAgICAgIC8vIFNldCBpbml0aWFsIHZhbHVlcyBmb3IgcGluY2ggYW5kIHJvdGF0ZVxuICAgICAgc3RhdGUuc3RhcnREaXN0YW5jZSA9IE1hdGguc3FydChcbiAgICAgICAgTWF0aC5wb3codG91Y2gyLmNsaWVudFggLSB0b3VjaDEuY2xpZW50WCwgMikgKyBcbiAgICAgICAgTWF0aC5wb3codG91Y2gyLmNsaWVudFkgLSB0b3VjaDEuY2xpZW50WSwgMilcbiAgICAgICk7XG4gICAgICBcbiAgICAgIHN0YXRlLnN0YXJ0QW5nbGUgPSBNYXRoLmF0YW4yKFxuICAgICAgICB0b3VjaDIuY2xpZW50WSAtIHRvdWNoMS5jbGllbnRZLFxuICAgICAgICB0b3VjaDIuY2xpZW50WCAtIHRvdWNoMS5jbGllbnRYXG4gICAgICApICogMTgwIC8gTWF0aC5QSTtcbiAgICAgIFxuICAgICAgaWYgKHN0YXRlLnN0YXJ0QW5nbGUgPCAwKSBzdGF0ZS5zdGFydEFuZ2xlICs9IDM2MDtcbiAgICB9XG4gICAgXG4gICAgLy8gU2V0dXAgY29udGV4dCBmb3IgZ2VzdHVyZSBkZXRlY3Rpb25cbiAgICBjb25zdCBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCA9IHtcbiAgICAgIHN0YXRlLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGVcbiAgICB9O1xuICAgIFxuICAgIC8vIFN0YXJ0IGxvbmcgcHJlc3MgZGV0ZWN0aW9uXG4gICAgaWYgKGxvbmdQcmVzc0NsZWFudXApIHtcbiAgICAgIGxvbmdQcmVzc0NsZWFudXAoKTtcbiAgICB9XG4gICAgXG4gICAgbG9uZ1ByZXNzQ2xlYW51cCA9IGRldGVjdExvbmdQcmVzcyhjb250ZXh0LCAobG9uZ1ByZXNzRXZlbnQpID0+IHtcbiAgICAgIGRpc3BhdGNoR2VzdHVyZShsb25nUHJlc3NFdmVudCk7XG4gICAgfSk7XG4gIH07XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHRvdWNoL21vdXNlIG1vdmVcbiAgICovXG4gIGNvbnN0IGhhbmRsZU1vdmUgPSAoZTogVG91Y2hFdmVudCB8IE1vdXNlRXZlbnQgfCBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoIXN0YXRlLmFjdGl2ZSkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IHRvdWNoID0gZ2V0VG91Y2hDb29yZGluYXRlcyhlKTtcbiAgICBjb25zdCB0b3VjaENvdW50ID0gJ3RvdWNoZXMnIGluIGUgPyBlLnRvdWNoZXMubGVuZ3RoIDogMTtcbiAgICBcbiAgICAvLyBVcGRhdGUgcG9zaXRpb25zXG4gICAgc3RhdGUubGFzdFggPSBzdGF0ZS5jdXJyZW50WDtcbiAgICBzdGF0ZS5sYXN0WSA9IHN0YXRlLmN1cnJlbnRZO1xuICAgIHN0YXRlLmN1cnJlbnRYID0gdG91Y2guY2xpZW50WDtcbiAgICBzdGF0ZS5jdXJyZW50WSA9IHRvdWNoLmNsaWVudFk7XG4gICAgXG4gICAgLy8gU2V0dXAgY29udGV4dCBmb3IgZ2VzdHVyZSBkZXRlY3Rpb25cbiAgICBjb25zdCBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCA9IHtcbiAgICAgIHN0YXRlLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGVcbiAgICB9O1xuICAgIFxuICAgIC8vIENoZWNrIGlmIHdlIHNob3VsZCBjYW5jZWwgbG9uZ3ByZXNzXG4gICAgaWYgKHNob3VsZENhbmNlbExvbmdQcmVzcyhjb250ZXh0KSAmJiBsb25nUHJlc3NDbGVhbnVwKSB7XG4gICAgICBsb25nUHJlc3NDbGVhbnVwKCk7XG4gICAgICBsb25nUHJlc3NDbGVhbnVwID0gbnVsbDtcbiAgICB9XG4gICAgXG4gICAgLy8gRGV0ZWN0IHBhbiBnZXN0dXJlXG4gICAgY29uc3QgcGFuRXZlbnQgPSBkZXRlY3RQYW4oY29udGV4dCk7XG4gICAgaWYgKHBhbkV2ZW50KSB7XG4gICAgICBkaXNwYXRjaEdlc3R1cmUocGFuRXZlbnQpO1xuICAgIH1cbiAgICBcbiAgICAvLyBNdWx0aS10b3VjaCBnZXN0dXJlc1xuICAgIGlmICh0b3VjaENvdW50ID09PSAyICYmICd0b3VjaGVzJyBpbiBlKSB7XG4gICAgICBjb25zdCB0b3VjaDEgPSBlLnRvdWNoZXNbMF07XG4gICAgICBjb25zdCB0b3VjaDIgPSBlLnRvdWNoZXNbMV07XG4gICAgICBcbiAgICAgIC8vIERldGVjdCBwaW5jaFxuICAgICAgY29uc3QgcGluY2hFdmVudCA9IGRldGVjdFBpbmNoKGNvbnRleHQsIHRvdWNoMSwgdG91Y2gyKTtcbiAgICAgIGlmIChwaW5jaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoR2VzdHVyZShwaW5jaEV2ZW50KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRGV0ZWN0IHJvdGF0ZVxuICAgICAgY29uc3Qgcm90YXRlRXZlbnQgPSBkZXRlY3RSb3RhdGUoY29udGV4dCwgdG91Y2gxLCB0b3VjaDIpO1xuICAgICAgaWYgKHJvdGF0ZUV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoR2VzdHVyZShyb3RhdGVFdmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBcbiAgLyoqXG4gICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBlbmRcbiAgICovXG4gIGNvbnN0IGhhbmRsZUVuZCA9IChlOiBUb3VjaEV2ZW50IHwgTW91c2VFdmVudCB8IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIGlmICghc3RhdGUuYWN0aXZlKSByZXR1cm47XG4gICAgXG4gICAgLy8gQ2FuY2VsIGFueSBvbmdvaW5nIGxvbmcgcHJlc3MgZGV0ZWN0aW9uXG4gICAgaWYgKGxvbmdQcmVzc0NsZWFudXApIHtcbiAgICAgIGxvbmdQcmVzc0NsZWFudXAoKTtcbiAgICAgIGxvbmdQcmVzc0NsZWFudXAgPSBudWxsO1xuICAgIH1cbiAgICBcbiAgICAvLyBTZXR1cCBjb250ZXh0IGZvciBnZXN0dXJlIGRldGVjdGlvblxuICAgIGNvbnN0IGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0ID0ge1xuICAgICAgc3RhdGUsXG4gICAgICBvcHRpb25zLFxuICAgICAgb3JpZ2luYWxFdmVudDogZVxuICAgIH07XG4gICAgXG4gICAgLy8gRGV0ZWN0IHRhcFxuICAgIGNvbnN0IHRhcEV2ZW50ID0gZGV0ZWN0VGFwKGNvbnRleHQpO1xuICAgIGlmICh0YXBFdmVudCkge1xuICAgICAgLy8gVXBkYXRlIHRhcCBjb3VudCBmb3IgbmV4dCB0YXBcbiAgICAgIHN0YXRlLmxhc3RUYXBUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIHN0YXRlLnRhcENvdW50ID0gdGFwRXZlbnQuY291bnQ7XG4gICAgICBcbiAgICAgIGRpc3BhdGNoR2VzdHVyZSh0YXBFdmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERldGVjdCBzd2lwZVxuICAgICAgY29uc3Qgc3dpcGVFdmVudCA9IGRldGVjdFN3aXBlKGNvbnRleHQpO1xuICAgICAgaWYgKHN3aXBlRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hHZXN0dXJlKHN3aXBlRXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBSZXNldCBzdGF0ZVxuICAgIHN0YXRlLmFjdGl2ZSA9IGZhbHNlO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBjYW5jZWxcbiAgICovXG4gIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpOiB2b2lkID0+IHtcbiAgICAvLyBDYW5jZWwgbG9uZyBwcmVzcyBkZXRlY3Rpb25cbiAgICBpZiAobG9uZ1ByZXNzQ2xlYW51cCkge1xuICAgICAgbG9uZ1ByZXNzQ2xlYW51cCgpO1xuICAgICAgbG9uZ1ByZXNzQ2xlYW51cCA9IG51bGw7XG4gICAgfVxuICAgIFxuICAgIC8vIFJlc2V0IHN0YXRlXG4gICAgc3RhdGUuYWN0aXZlID0gZmFsc2U7XG4gIH07XG4gIFxuICAvLyBFdmVudCBsaXN0ZW5lciByZWZlcmVuY2VzXG4gIGxldCBldmVudExpc3RlbmVyczogeyBcbiAgICBbZXZlbnQ6IHN0cmluZ106IEV2ZW50TGlzdGVuZXIgXG4gIH0gPSB7fTtcbiAgXG4gIC8qKlxuICAgKiBTZXQgdXAgZXZlbnQgbGlzdGVuZXJzIGJhc2VkIG9uIGF2YWlsYWJsZSBBUElzXG4gICAqL1xuICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChzdXBwb3J0UG9pbnRlcikge1xuICAgICAgLy8gVXNlIFBvaW50ZXIgRXZlbnRzIEFQSVxuICAgICAgZXZlbnRMaXN0ZW5lcnMgPSB7XG4gICAgICAgIHBvaW50ZXJkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBwb2ludGVybW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBwb2ludGVydXA6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBwb2ludGVyY2FuY2VsOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lclxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnRUb3VjaCkge1xuICAgICAgLy8gVXNlIFRvdWNoIEV2ZW50cyBBUElcbiAgICAgIGV2ZW50TGlzdGVuZXJzID0ge1xuICAgICAgICB0b3VjaHN0YXJ0OiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICB0b3VjaG1vdmU6IGhhbmRsZU1vdmUgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICB0b3VjaGNhbmNlbDogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXJcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZhbGwgYmFjayB0byBNb3VzZSBFdmVudHMgQVBJXG4gICAgICBldmVudExpc3RlbmVycyA9IHtcbiAgICAgICAgbW91c2Vkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBtb3VzZW1vdmU6IGhhbmRsZU1vdmUgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgICAgbW91c2V1cDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIG1vdXNlbGVhdmU6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyXG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIHsgcGFzc2l2ZTogIW9wdGlvbnMucHJldmVudERlZmF1bHQgfSk7XG4gICAgfSk7XG4gIH07XG4gIFxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBldmVudCBsaXN0ZW5lcnNcbiAgICovXG4gIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgIC8vIFJlbW92ZSBhbGwgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgIE9iamVjdC5lbnRyaWVzKGV2ZW50TGlzdGVuZXJzKS5mb3JFYWNoKChbZXZlbnQsIGxpc3RlbmVyXSkgPT4ge1xuICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgfSk7XG4gICAgXG4gICAgLy8gQ2xlYXIgZXZlbnRMaXN0ZW5lcnMgb2JqZWN0XG4gICAgZXZlbnRMaXN0ZW5lcnMgPSB7fTtcbiAgfTtcbiAgXG4gIC8vIEluaXRpYWxpemUgZXZlbnQgbGlzdGVuZXJzXG4gIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgXG4gIHJldHVybiB7XG4gICAgLyoqXG4gICAgICogQWRkIGEgZ2VzdHVyZSBldmVudCBsaXN0ZW5lclxuICAgICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgdG8gbGlzdGVuIGZvclxuICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAqIEByZXR1cm5zIEdlc3R1cmUgbWFuYWdlciBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBvbihldmVudFR5cGU6IHN0cmluZywgaGFuZGxlcjogR2VzdHVyZUhhbmRsZXIpOiBHZXN0dXJlTWFuYWdlciB7XG4gICAgICBpZiAoIWhhbmRsZXJzLmhhcyhldmVudFR5cGUpKSB7XG4gICAgICAgIGhhbmRsZXJzLnNldChldmVudFR5cGUsIG5ldyBTZXQoKSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGhhbmRsZXJzLmdldChldmVudFR5cGUpIS5hZGQoaGFuZGxlcik7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIFxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGdlc3R1cmUgZXZlbnQgbGlzdGVuZXJcbiAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVHlwZSBvZiBnZXN0dXJlXG4gICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIHRvIHJlbW92ZVxuICAgICAqIEByZXR1cm5zIEdlc3R1cmUgbWFuYWdlciBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBvZmYoZXZlbnRUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IEdlc3R1cmVIYW5kbGVyKTogR2VzdHVyZU1hbmFnZXIge1xuICAgICAgY29uc3QgZXZlbnRIYW5kbGVycyA9IGhhbmRsZXJzLmdldChldmVudFR5cGUpO1xuICAgICAgaWYgKGV2ZW50SGFuZGxlcnMpIHtcbiAgICAgICAgZXZlbnRIYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIFxuICAgICAgICBpZiAoZXZlbnRIYW5kbGVycy5zaXplID09PSAwKSB7XG4gICAgICAgICAgaGFuZGxlcnMuZGVsZXRlKGV2ZW50VHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBnZXN0dXJlIGlzIHN1cHBvcnRlZCBvbiB0aGUgY3VycmVudCBkZXZpY2VcbiAgICAgKiBAcGFyYW0gZ2VzdHVyZVR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBnZXN0dXJlIGlzIHN1cHBvcnRlZFxuICAgICAqL1xuICAgIGlzU3VwcG9ydGVkKGdlc3R1cmVUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBnZXN0dXJlVHlwZSBpbiBnZXN0dXJlU3VwcG9ydCAmJiBnZXN0dXJlU3VwcG9ydFtnZXN0dXJlVHlwZSBhcyBrZXlvZiB0eXBlb2YgZ2VzdHVyZVN1cHBvcnRdO1xuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogRW5hYmxlIGdlc3R1cmUgcmVjb2duaXRpb24gYnkgYWRkaW5nIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqIEByZXR1cm5zIEdlc3R1cmUgbWFuYWdlciBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBlbmFibGUoKTogR2VzdHVyZU1hbmFnZXIge1xuICAgICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBcbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIGdlc3R1cmUgcmVjb2duaXRpb24gYnkgcmVtb3ZpbmcgZXZlbnQgbGlzdGVuZXJzXG4gICAgICogQHJldHVybnMgR2VzdHVyZSBtYW5hZ2VyIGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIGRpc2FibGUoKTogR2VzdHVyZU1hbmFnZXIge1xuICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogQ2xlYW4gdXAgZXZlbnQgbGlzdGVuZXJzIGFuZCB0aW1lcnNcbiAgICAgKi9cbiAgICBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgLy8gQ2xlYW4gdXAgbGlzdGVuZXJzXG4gICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgXG4gICAgICAvLyBDbGVhciBsb25nIHByZXNzIHRpbWVyXG4gICAgICBpZiAobG9uZ1ByZXNzQ2xlYW51cCkge1xuICAgICAgICBsb25nUHJlc3NDbGVhbnVwKCk7XG4gICAgICAgIGxvbmdQcmVzc0NsZWFudXAgPSBudWxsO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDbGVhciBoYW5kbGVyIHJlZmVyZW5jZXNcbiAgICAgIGhhbmRsZXJzLmNsZWFyKCk7XG4gICAgfVxuICB9O1xufTsiLAogICAgIi8vIHNyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2NvbXBvc2UvZmVhdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBBZGRzIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzIHRvIGNvbXBvbmVudHNcbiAqL1xuXG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50LCBFbGVtZW50Q29tcG9uZW50IH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZUdlc3R1cmVNYW5hZ2VyLFxuICBHZXN0dXJlTWFuYWdlcixcbiAgR2VzdHVyZUNvbmZpZyxcbiAgR2VzdHVyZUhhbmRsZXIsXG4gIEFueUdlc3R1cmVFdmVudCxcbn0gZnJvbSBcIi4uLy4uLy4uL2dlc3R1cmVzXCI7XG5pbXBvcnQgeyBoYXNMaWZlY3ljbGUsIGhhc0VtaXQgfSBmcm9tIFwibXRybFwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGdlc3R1cmVzIGZlYXR1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXN0dXJlc0ZlYXR1cmVDb25maWcgZXh0ZW5kcyBHZXN0dXJlQ29uZmlnIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIGdlc3R1cmUgcmVjb2duaXRpb24gaW1tZWRpYXRlbHlcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlR2VzdHVyZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsIGdlc3R1cmUgZXZlbnQgaGFuZGxlcnNcbiAgICovXG4gIGdlc3R1cmVIYW5kbGVycz86IFJlY29yZDxzdHJpbmcsIEdlc3R1cmVIYW5kbGVyPjtcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IHdpdGggZ2VzdHVyZSByZWNvZ25pdGlvbiBjYXBhYmlsaXRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXN0dXJlc0NvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvKipcbiAgICogR2VzdHVyZSBtYW5hZ2VyIGluc3RhbmNlXG4gICAqL1xuICBnZXN0dXJlczogR2VzdHVyZU1hbmFnZXI7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGdlc3R1cmUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIGV2ZW50XG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uR2VzdHVyZTogKGV2ZW50VHlwZTogc3RyaW5nLCBoYW5kbGVyOiBHZXN0dXJlSGFuZGxlcikgPT4gR2VzdHVyZXNDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGdlc3R1cmUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIGV2ZW50XG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZkdlc3R1cmU6IChldmVudFR5cGU6IHN0cmluZywgaGFuZGxlcjogR2VzdHVyZUhhbmRsZXIpID0+IEdlc3R1cmVzQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGdlc3R1cmUgdHlwZSBpcyBzdXBwb3J0ZWQgb24gdGhlIGN1cnJlbnQgZGV2aWNlXG4gICAqIEBwYXJhbSBnZXN0dXJlVHlwZSAtIFR5cGUgb2YgZ2VzdHVyZSB0byBjaGVja1xuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBnZXN0dXJlIGlzIHN1cHBvcnRlZFxuICAgKi9cbiAgaXNHZXN0dXJlU3VwcG9ydGVkOiAoZ2VzdHVyZVR5cGU6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlIGdlc3R1cmUgcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBlbmFibGVHZXN0dXJlczogKCkgPT4gR2VzdHVyZXNDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIERpc2FibGUgZ2VzdHVyZSByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGRpc2FibGVHZXN0dXJlczogKCkgPT4gR2VzdHVyZXNDb21wb25lbnQ7XG59XG5cbi8qKlxuICogQWRkcyBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllcyB0byBhIGNvbXBvbmVudC5cbiAqIFRoaXMgaXMgYSBjb21wcmVoZW5zaXZlIGdlc3R1cmUgZmVhdHVyZSB0aGF0IGFkZHMgc3VwcG9ydCBmb3IgYWxsIGdlc3R1cmUgdHlwZXMuXG4gKiBGb3IgbW9yZSBsaWdodHdlaWdodCwgc3BlY2lmaWMgZ2VzdHVyZXMsIHVzZSB0aGUgaW5kaXZpZHVhbCBnZXN0dXJlIGZlYXR1cmVzLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9iamVjdCBjb250YWluaW5nIGdlc3R1cmUgc2V0dGluZ3NcbiAqIEByZXR1cm5zIEZ1bmN0aW9uIHRoYXQgZW5oYW5jZXMgYSBjb21wb25lbnQgd2l0aCBnZXN0dXJlIGNhcGFiaWxpdGllc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQWRkIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnRcbiAqIGNvbnN0IGNvbXBvbmVudCA9IHBpcGUoXG4gKiAgIGNyZWF0ZUJhc2UsXG4gKiAgIHdpdGhFbGVtZW50KC4uLiksXG4gKiAgIHdpdGhHZXN0dXJlcyh7XG4gKiAgICAgc3dpcGVUaHJlc2hvbGQ6IDUwLFxuICogICAgIGdlc3R1cmVIYW5kbGVyczoge1xuICogICAgICAgJ3RhcCc6IChlKSA9PiBoYW5kbGVUYXAoZSksXG4gKiAgICAgICAnc3dpcGVsZWZ0JzogKGUpID0+IG5hdmlnYXRlRm9yd2FyZChlKSxcbiAqICAgICAgICdzd2lwZXJpZ2h0JzogKGUpID0+IG5hdmlnYXRlQmFjayhlKVxuICogICAgIH1cbiAqICAgfSlcbiAqICkoY29uZmlnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgd2l0aEdlc3R1cmVzID1cbiAgKGNvbmZpZzogR2VzdHVyZXNGZWF0dXJlQ29uZmlnID0ge30pID0+XG4gIDxDIGV4dGVuZHMgRWxlbWVudENvbXBvbmVudD4oY29tcG9uZW50OiBDKTogQyAmIEdlc3R1cmVzQ29tcG9uZW50ID0+IHtcbiAgICBpZiAoIWNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJDYW5ub3QgYWRkIGdlc3R1cmUgcmVjb2duaXRpb246IG1pc3NpbmcgZWxlbWVudFwiKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQgYXMgQyAmIEdlc3R1cmVzQ29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIGVuYWJsZUdlc3R1cmVzID0gdHJ1ZSxcbiAgICAgIGdlc3R1cmVIYW5kbGVycyA9IHt9LFxuICAgICAgLi4uZ2VzdHVyZUNvbmZpZ1xuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBDcmVhdGUgZ2VzdHVyZSBtYW5hZ2VyXG4gICAgY29uc3QgZ2VzdHVyZU1hbmFnZXIgPSBjcmVhdGVHZXN0dXJlTWFuYWdlcihcbiAgICAgIGNvbXBvbmVudC5lbGVtZW50LFxuICAgICAgZ2VzdHVyZUNvbmZpZ1xuICAgICk7XG5cbiAgICAvLyBBZGQgaW5pdGlhbCBnZXN0dXJlIGhhbmRsZXJzXG4gICAgT2JqZWN0LmVudHJpZXMoZ2VzdHVyZUhhbmRsZXJzKS5mb3JFYWNoKChbZXZlbnRUeXBlLCBoYW5kbGVyXSkgPT4ge1xuICAgICAgZ2VzdHVyZU1hbmFnZXIub24oZXZlbnRUeXBlLCBoYW5kbGVyKTtcbiAgICB9KTtcblxuICAgIC8vIEVuYWJsZS9kaXNhYmxlIGJhc2VkIG9uIGNvbmZpZ1xuICAgIGlmICghZW5hYmxlR2VzdHVyZXMpIHtcbiAgICAgIGdlc3R1cmVNYW5hZ2VyLmRpc2FibGUoKTtcbiAgICB9XG5cbiAgICAvLyBDb25uZWN0IHdpdGggZXhpc3RpbmcgZXZlbnQgc3lzdGVtIGlmIGF2YWlsYWJsZVxuICAgIGlmIChoYXNFbWl0KGNvbXBvbmVudCkpIHtcbiAgICAgIC8vIEZvcndhcmQgZ2VzdHVyZSBldmVudHMgdG8gdGhlIGNvbXBvbmVudCdzIGV2ZW50IHN5c3RlbVxuICAgICAgY29uc3QgZm9yd2FyZEdlc3R1cmVFdmVudHMgPSAoZXZlbnQ6IEFueUdlc3R1cmVFdmVudCkgPT4ge1xuICAgICAgICBjb21wb25lbnQuZW1pdChldmVudC50eXBlLCBldmVudCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBSZWdpc3RlciBmb3J3YXJkZXIgZm9yIGNvbW1vbiBnZXN0dXJlIHR5cGVzXG4gICAgICBbXG4gICAgICAgIFwidGFwXCIsXG4gICAgICAgIFwic3dpcGVcIixcbiAgICAgICAgXCJzd2lwZWxlZnRcIixcbiAgICAgICAgXCJzd2lwZXJpZ2h0XCIsXG4gICAgICAgIFwic3dpcGV1cFwiLFxuICAgICAgICBcInN3aXBlZG93blwiLFxuICAgICAgICBcImxvbmdwcmVzc1wiLFxuICAgICAgICBcInBpbmNoXCIsXG4gICAgICAgIFwicm90YXRlXCIsXG4gICAgICAgIFwicGFuXCIsXG4gICAgICBdLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICAgICAgZ2VzdHVyZU1hbmFnZXIub24odHlwZSwgZm9yd2FyZEdlc3R1cmVFdmVudHMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGdlc3R1cmUgbWFuYWdlclxuICAgICAgICBnZXN0dXJlTWFuYWdlci5kZXN0cm95KCk7XG5cbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBvcmlnaW5hbERlc3Ryb3kuY2FsbChjb21wb25lbnQubGlmZWN5Y2xlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBnZXN0dXJlczogZ2VzdHVyZU1hbmFnZXIsXG5cbiAgICAgIC8qKlxuICAgICAgICogQWRkIGEgZ2VzdHVyZSBldmVudCBoYW5kbGVyXG4gICAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIGV2ZW50XG4gICAgICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgICAqIEByZXR1cm5zIEdlc3R1cmVzQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBvbkdlc3R1cmUoZXZlbnRUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IEdlc3R1cmVIYW5kbGVyKSB7XG4gICAgICAgIGdlc3R1cmVNYW5hZ2VyLm9uKGV2ZW50VHlwZSwgaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmUgYSBnZXN0dXJlIGV2ZW50IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgZXZlbnRcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIG9mZkdlc3R1cmUoZXZlbnRUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IEdlc3R1cmVIYW5kbGVyKSB7XG4gICAgICAgIGdlc3R1cmVNYW5hZ2VyLm9mZihldmVudFR5cGUsIGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgYSBnZXN0dXJlIHR5cGUgaXMgc3VwcG9ydGVkIG9uIHRoZSBjdXJyZW50IGRldmljZVxuICAgICAgICogQHBhcmFtIGdlc3R1cmVUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIHRvIGNoZWNrXG4gICAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBnZXN0dXJlIGlzIHN1cHBvcnRlZFxuICAgICAgICovXG4gICAgICBpc0dlc3R1cmVTdXBwb3J0ZWQoZ2VzdHVyZVR5cGU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gZ2VzdHVyZU1hbmFnZXIuaXNTdXBwb3J0ZWQoZ2VzdHVyZVR5cGUpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBFbmFibGUgZ2VzdHVyZSByZWNvZ25pdGlvblxuICAgICAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZUdlc3R1cmVzKCkge1xuICAgICAgICBnZXN0dXJlTWFuYWdlci5lbmFibGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgZ2VzdHVyZSByZWNvZ25pdGlvblxuICAgICAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVHZXN0dXJlcygpIHtcbiAgICAgICAgZ2VzdHVyZU1hbmFnZXIuZGlzYWJsZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbiIsCiAgICAiLy8gc3JjL2NvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlcy90YXAudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBBZGRzIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGNvbXBvbmVudHNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEJhc2VDb21wb25lbnQsIEVsZW1lbnRDb21wb25lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgVGFwRXZlbnQsIEdlc3R1cmVIYW5kbGVyIH0gZnJvbSBcIi4uLy4uLy4uL2dlc3R1cmVzXCI7XG5pbXBvcnQgeyBoYXNMaWZlY3ljbGUsIGhhc0VtaXQgfSBmcm9tIFwibXRybFwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRhcCBnZXN0dXJlIGZlYXR1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXBHZXN0dXJlQ29uZmlnIHtcbiAgLyoqXG4gICAqIERpc3RhbmNlIHRocmVzaG9sZCAoaW4gcGl4ZWxzKSBmb3IgdGFwIHJlY29nbml0aW9uXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuICB0YXBEaXN0YW5jZVRocmVzaG9sZD86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBwcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3JzIG9uIHRvdWNoIGV2ZW50c1xuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBwcmV2ZW50RGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIHRhcCBnZXN0dXJlXG4gICAqL1xuICBvblRhcD86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSB0YXAgcmVjb2duaXRpb24gaW1tZWRpYXRlbHlcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKipcbiAqIENvbXBvbmVudCB3aXRoIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhcEdlc3R1cmVDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIEFkZCBhIHRhcCBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblRhcDogKGhhbmRsZXI6IChldmVudDogVGFwRXZlbnQpID0+IHZvaWQpID0+IFRhcEdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHRhcCBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZUYXA6IChoYW5kbGVyOiAoZXZlbnQ6IFRhcEV2ZW50KSA9PiB2b2lkKSA9PiBUYXBHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgdGFwIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGVuYWJsZVRhcDogKCkgPT4gVGFwR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogRGlzYWJsZSB0YXAgcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZGlzYWJsZVRhcDogKCkgPT4gVGFwR2VzdHVyZUNvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBBZGRzIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50LlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IGFsdGVybmF0aXZlIHRvIHRoZSBmdWxsIGdlc3R1cmUgc3lzdGVtLFxuICogZm9jdXNlZCBvbmx5IG9uIHRhcCBkZXRlY3Rpb24uXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgdGFwIHNldHRpbmdzXG4gKiBAcmV0dXJucyBGdW5jdGlvbiB0aGF0IGVuaGFuY2VzIGEgY29tcG9uZW50IHdpdGggdGFwIGNhcGFiaWxpdGllc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQWRkIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50XG4gKiBjb25zdCBjb21wb25lbnQgPSBwaXBlKFxuICogICBjcmVhdGVCYXNlLFxuICogICB3aXRoRWxlbWVudCguLi4pLFxuICogICB3aXRoVGFwR2VzdHVyZSh7XG4gKiAgICAgb25UYXA6IChlKSA9PiBjb25zb2xlLmxvZygnVGFwcGVkIGF0JywgZS54LCBlLnkpXG4gKiAgIH0pXG4gKiApKGNvbmZpZyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhUYXBHZXN0dXJlID1cbiAgKGNvbmZpZzogVGFwR2VzdHVyZUNvbmZpZyA9IHt9KSA9PlxuICA8QyBleHRlbmRzIEVsZW1lbnRDb21wb25lbnQ+KGNvbXBvbmVudDogQyk6IEMgJiBUYXBHZXN0dXJlQ29tcG9uZW50ID0+IHtcbiAgICBpZiAoIWNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJDYW5ub3QgYWRkIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uOiBtaXNzaW5nIGVsZW1lbnRcIik7XG4gICAgICByZXR1cm4gY29tcG9uZW50IGFzIEMgJiBUYXBHZXN0dXJlQ29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIHRhcERpc3RhbmNlVGhyZXNob2xkID0gMTAsXG4gICAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWUsXG4gICAgICBvblRhcCxcbiAgICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBFdmVudCBoYW5kbGVycyBzdG9yYWdlXG4gICAgY29uc3QgaGFuZGxlcnM6IFNldDwoZXZlbnQ6IFRhcEV2ZW50KSA9PiB2b2lkPiA9IG5ldyBTZXQoKTtcblxuICAgIC8vIElmIGluaXRpYWwgaGFuZGxlciBwcm92aWRlZCwgYWRkIGl0XG4gICAgaWYgKG9uVGFwKSB7XG4gICAgICBoYW5kbGVycy5hZGQob25UYXAgYXMgKGV2ZW50OiBUYXBFdmVudCkgPT4gdm9pZCk7XG4gICAgfVxuXG4gICAgLy8gR2VzdHVyZSBzdGF0ZSBmb3IgdHJhY2tpbmdcbiAgICBsZXQgc3RhcnRYID0gMDtcbiAgICBsZXQgc3RhcnRZID0gMDtcbiAgICBsZXQgYWN0aXZlID0gZmFsc2U7XG4gICAgbGV0IHN0YXJ0VGltZSA9IDA7XG4gICAgbGV0IGxhc3RUYXBUaW1lID0gMDtcbiAgICBsZXQgdGFwQ291bnQgPSAwO1xuICAgIGxldCBpc0VuYWJsZWQgPSBlbmFibGVkO1xuXG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2ggYSB0YXAgZXZlbnQgdG8gYWxsIGhhbmRsZXJzXG4gICAgICovXG4gICAgY29uc3QgZGlzcGF0Y2hUYXAgPSAoXG4gICAgICBlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCxcbiAgICAgIHg6IG51bWJlcixcbiAgICAgIHk6IG51bWJlclxuICAgICk6IHZvaWQgPT4ge1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGlzRG91YmxlVGFwID0gbm93IC0gbGFzdFRhcFRpbWUgPCAzMDA7XG5cbiAgICAgIGlmIChpc0RvdWJsZVRhcCkge1xuICAgICAgICB0YXBDb3VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFwQ291bnQgPSAxO1xuICAgICAgfVxuXG4gICAgICBsYXN0VGFwVGltZSA9IG5vdztcblxuICAgICAgLy8gQ3JlYXRlIHRoZSB0YXAgZXZlbnRcbiAgICAgIGNvbnN0IHRhcEV2ZW50OiBUYXBFdmVudCA9IHtcbiAgICAgICAgdHlwZTogXCJ0YXBcIixcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgdGFyZ2V0OiBlLnRhcmdldCEsXG4gICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgZW5kVGltZTogbm93LFxuICAgICAgICBkdXJhdGlvbjogbm93IC0gc3RhcnRUaW1lLFxuICAgICAgICBkZWZhdWx0UHJldmVudGVkOiBmYWxzZSxcbiAgICAgICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgICB0YXBFdmVudC5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzdG9wUHJvcGFnYXRpb246ICgpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9LFxuICAgICAgICBjb3VudDogdGFwQ291bnQsXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICB9O1xuXG4gICAgICAvLyBDYWxsIGVhY2ggaGFuZGxlclxuICAgICAgaGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhhbmRsZXIodGFwRXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbiB0YXAgaGFuZGxlcjpcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gRm9yd2FyZCB0byBjb21wb25lbnQncyBldmVudCBzeXN0ZW0gaWYgYXZhaWxhYmxlXG4gICAgICBpZiAoaGFzRW1pdChjb21wb25lbnQpKSB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0KFwidGFwXCIsIHRhcEV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgcHJldmVudERlZmF1bHQgaWYgY29uZmlndXJlZFxuICAgICAgaWYgKHByZXZlbnREZWZhdWx0ICYmICF0YXBFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgIHRhcEV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBzdGFydFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVN0YXJ0ID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9IFwidG91Y2hlc1wiIGluIGUgPyBlLnRvdWNoZXNbMF0gOiBlO1xuXG4gICAgICBzdGFydFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgc3RhcnRZID0gdG91Y2guY2xpZW50WTtcbiAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBhY3RpdmUgPSB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgZW5kXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlRW5kID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWFjdGl2ZSB8fCAhaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRvdWNoID1cbiAgICAgICAgXCJjaGFuZ2VkVG91Y2hlc1wiIGluIGUgJiYgZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggPiAwXG4gICAgICAgICAgPyBlLmNoYW5nZWRUb3VjaGVzWzBdXG4gICAgICAgICAgOiAoZSBhcyBNb3VzZUV2ZW50KTtcblxuICAgICAgY29uc3QgZW5kWCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBjb25zdCBlbmRZID0gdG91Y2guY2xpZW50WTtcblxuICAgICAgLy8gQ2FsY3VsYXRlIGRpc3RhbmNlIG1vdmVkXG4gICAgICBjb25zdCBkZWx0YVggPSBlbmRYIC0gc3RhcnRYO1xuICAgICAgY29uc3QgZGVsdGFZID0gZW5kWSAtIHN0YXJ0WTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIG1vdmVtZW50IGlzIHdpdGhpbiB0aHJlc2hvbGRcbiAgICAgIGlmIChkaXN0YW5jZSA8IHRhcERpc3RhbmNlVGhyZXNob2xkKSB7XG4gICAgICAgIGRpc3BhdGNoVGFwKGUsIGVuZFgsIGVuZFkpO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIGNhbmNlbFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnMgZGljdGlvbmFyeVxuICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzOiBSZWNvcmQ8c3RyaW5nLCBFdmVudExpc3RlbmVyPiA9IHtcbiAgICAgIG1vdXNlZG93bjogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNldXA6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2VsZWF2ZTogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaHN0YXJ0OiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hjYW5jZWw6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGQgZXZlbnQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCB7XG4gICAgICAgICAgcGFzc2l2ZTogIXByZXZlbnREZWZhdWx0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBTZXR1cCBsaXN0ZW5lcnMgaWYgaW5pdGlhbGx5IGVuYWJsZWRcbiAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgIC8vIENsZWFyIGhhbmRsZXJzXG4gICAgICAgIGhhbmRsZXJzLmNsZWFyKCk7XG5cbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBvcmlnaW5hbERlc3Ryb3kuY2FsbChjb21wb25lbnQubGlmZWN5Y2xlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIC8qKlxuICAgICAgICogQWRkIGEgdGFwIGV2ZW50IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBvblRhcChoYW5kbGVyOiAoZXZlbnQ6IFRhcEV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBhIHRhcCBldmVudCBoYW5kbGVyXG4gICAgICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgb2ZmVGFwKGhhbmRsZXI6IChldmVudDogVGFwRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRW5hYmxlIHRhcCByZWNvZ25pdGlvblxuICAgICAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBlbmFibGVUYXAoKSB7XG4gICAgICAgIGlmICghaXNFbmFibGVkKSB7XG4gICAgICAgICAgaXNFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgdGFwIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVUYXAoKSB7XG4gICAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3N3aXBlLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gQWRkcyBzd2lwZSBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGNvbXBvbmVudHNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEJhc2VDb21wb25lbnQsIEVsZW1lbnRDb21wb25lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHtcbiAgU3dpcGVFdmVudCxcbiAgU1dJUEVfRElSRUNUSU9OUyxcbiAgR2VzdHVyZUhhbmRsZXIsXG59IGZyb20gXCIuLi8uLi8uLi9nZXN0dXJlc1wiO1xuaW1wb3J0IHsgaGFzTGlmZWN5Y2xlLCBoYXNFbWl0IH0gZnJvbSBcIm10cmxcIjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBzd2lwZSBnZXN0dXJlIGZlYXR1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTd2lwZUdlc3R1cmVDb25maWcge1xuICAvKipcbiAgICogTWluaW11bSBkaXN0YW5jZSAoaW4gcGl4ZWxzKSB0byByZWNvZ25pemUgYSBzd2lwZVxuICAgKiBAZGVmYXVsdCAzMFxuICAgKi9cbiAgc3dpcGVUaHJlc2hvbGQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gdGltZSAoaW4gbXMpIGluIHdoaWNoIGEgc3dpcGUgbXVzdCBiZSBjb21wbGV0ZWRcbiAgICogQGRlZmF1bHQgMzAwXG4gICAqL1xuICBzd2lwZVRpbWVUaHJlc2hvbGQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHJldmVudCBkZWZhdWx0IGJlaGF2aW9ycyBvbiB0b3VjaCBldmVudHNcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcHJldmVudERlZmF1bHQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIGZvciBhbnkgc3dpcGUgZGlyZWN0aW9uXG4gICAqL1xuICBvblN3aXBlPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciBsZWZ0IHN3aXBlc1xuICAgKi9cbiAgb25Td2lwZUxlZnQ/OiBHZXN0dXJlSGFuZGxlcjtcblxuICAvKipcbiAgICogSGFuZGxlciBzcGVjaWZpY2FsbHkgZm9yIHJpZ2h0IHN3aXBlc1xuICAgKi9cbiAgb25Td2lwZVJpZ2h0PzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciB1cCBzd2lwZXNcbiAgICovXG4gIG9uU3dpcGVVcD86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIHNwZWNpZmljYWxseSBmb3IgZG93biBzd2lwZXNcbiAgICovXG4gIG9uU3dpcGVEb3duPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIHN3aXBlIHJlY29nbml0aW9uIGltbWVkaWF0ZWx5XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgd2l0aCBzd2lwZSBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFN3aXBlR2VzdHVyZUNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBmb3IgYW55IHN3aXBlIGRpcmVjdGlvblxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25Td2lwZTogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBoYW5kbGVyIHNwZWNpZmljYWxseSBmb3IgbGVmdCBzd2lwZXNcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uU3dpcGVMZWZ0OiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciByaWdodCBzd2lwZXNcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uU3dpcGVSaWdodDogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBoYW5kbGVyIHNwZWNpZmljYWxseSBmb3IgdXAgc3dpcGVzXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblN3aXBlVXA6IChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpID0+IFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBzcGVjaWZpY2FsbHkgZm9yIGRvd24gc3dpcGVzXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblN3aXBlRG93bjogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBzd2lwZSBldmVudCBoYW5kbGVyIGZvciBhbnkgZGlyZWN0aW9uXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZTd2lwZTogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBsZWZ0IHN3aXBlIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlN3aXBlTGVmdDogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSByaWdodCBzd2lwZSBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZTd2lwZVJpZ2h0OiAoXG4gICAgaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkXG4gICkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gdXAgc3dpcGUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmU3dpcGVVcDogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBkb3duIHN3aXBlIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlN3aXBlRG93bjogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgc3dpcGUgcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZW5hYmxlU3dpcGU6ICgpID0+IFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogRGlzYWJsZSBzd2lwZSByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBkaXNhYmxlU3dpcGU6ICgpID0+IFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgc3dpcGUgZGlyZWN0aW9uIGJhc2VkIG9uIGRlbHRhIFggYW5kIFlcbiAqXG4gKiBAcGFyYW0gZGVsdGFYIC0gRGlzdGFuY2UgbW92ZWQgaW4gWCBkaXJlY3Rpb25cbiAqIEBwYXJhbSBkZWx0YVkgLSBEaXN0YW5jZSBtb3ZlZCBpbiBZIGRpcmVjdGlvblxuICogQHJldHVybnMgRGlyZWN0aW9uIG9mIHRoZSBzd2lwZVxuICovXG5mdW5jdGlvbiBnZXRTd2lwZURpcmVjdGlvbihkZWx0YVg6IG51bWJlciwgZGVsdGFZOiBudW1iZXIpOiBTV0lQRV9ESVJFQ1RJT05TIHtcbiAgaWYgKE1hdGguYWJzKGRlbHRhWCkgPiBNYXRoLmFicyhkZWx0YVkpKSB7XG4gICAgcmV0dXJuIGRlbHRhWCA+IDAgPyBTV0lQRV9ESVJFQ1RJT05TLlJJR0hUIDogU1dJUEVfRElSRUNUSU9OUy5MRUZUO1xuICB9XG4gIHJldHVybiBkZWx0YVkgPiAwID8gU1dJUEVfRElSRUNUSU9OUy5ET1dOIDogU1dJUEVfRElSRUNUSU9OUy5VUDtcbn1cblxuLyoqXG4gKiBBZGRzIHN3aXBlIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnQuXG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQgYWx0ZXJuYXRpdmUgdG8gdGhlIGZ1bGwgZ2VzdHVyZSBzeXN0ZW0sXG4gKiBmb2N1c2VkIG9ubHkgb24gc3dpcGUgZGV0ZWN0aW9uLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9iamVjdCBjb250YWluaW5nIHN3aXBlIHNldHRpbmdzXG4gKiBAcmV0dXJucyBGdW5jdGlvbiB0aGF0IGVuaGFuY2VzIGEgY29tcG9uZW50IHdpdGggc3dpcGUgY2FwYWJpbGl0aWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBBZGQgc3dpcGUgZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBhIGNvbXBvbmVudFxuICogY29uc3QgY29tcG9uZW50ID0gcGlwZShcbiAqICAgY3JlYXRlQmFzZSxcbiAqICAgd2l0aEVsZW1lbnQoLi4uKSxcbiAqICAgd2l0aFN3aXBlR2VzdHVyZSh7XG4gKiAgICAgb25Td2lwZUxlZnQ6ICgpID0+IHNob3dOZXh0UGFnZSgpLFxuICogICAgIG9uU3dpcGVSaWdodDogKCkgPT4gc2hvd1ByZXZpb3VzUGFnZSgpXG4gKiAgIH0pXG4gKiApKGNvbmZpZyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhTd2lwZUdlc3R1cmUgPVxuICAoY29uZmlnOiBTd2lwZUdlc3R1cmVDb25maWcgPSB7fSkgPT5cbiAgPEMgZXh0ZW5kcyBFbGVtZW50Q29tcG9uZW50Pihjb21wb25lbnQ6IEMpOiBDICYgU3dpcGVHZXN0dXJlQ29tcG9uZW50ID0+IHtcbiAgICBpZiAoIWNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJDYW5ub3QgYWRkIHN3aXBlIGdlc3R1cmUgcmVjb2duaXRpb246IG1pc3NpbmcgZWxlbWVudFwiKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQgYXMgQyAmIFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCB7XG4gICAgICBzd2lwZVRocmVzaG9sZCA9IDMwLFxuICAgICAgc3dpcGVUaW1lVGhyZXNob2xkID0gMzAwLFxuICAgICAgcHJldmVudERlZmF1bHQgPSB0cnVlLFxuICAgICAgb25Td2lwZSxcbiAgICAgIG9uU3dpcGVMZWZ0LFxuICAgICAgb25Td2lwZVJpZ2h0LFxuICAgICAgb25Td2lwZVVwLFxuICAgICAgb25Td2lwZURvd24sXG4gICAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gRXZlbnQgaGFuZGxlcnMgc3RvcmFnZSBieSBkaXJlY3Rpb25cbiAgICBjb25zdCBoYW5kbGVycyA9IHtcbiAgICAgIHN3aXBlOiBuZXcgU2V0PChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZD4oKSxcbiAgICAgIHN3aXBlbGVmdDogbmV3IFNldDwoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQ+KCksXG4gICAgICBzd2lwZXJpZ2h0OiBuZXcgU2V0PChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZD4oKSxcbiAgICAgIHN3aXBldXA6IG5ldyBTZXQ8KGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkPigpLFxuICAgICAgc3dpcGVkb3duOiBuZXcgU2V0PChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZD4oKSxcbiAgICB9O1xuXG4gICAgLy8gQWRkIGluaXRpYWwgaGFuZGxlcnMgaWYgcHJvdmlkZWRcbiAgICBpZiAob25Td2lwZSkgaGFuZGxlcnMuc3dpcGUuYWRkKG9uU3dpcGUgYXMgKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKTtcbiAgICBpZiAob25Td2lwZUxlZnQpXG4gICAgICBoYW5kbGVycy5zd2lwZWxlZnQuYWRkKG9uU3dpcGVMZWZ0IGFzIChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCk7XG4gICAgaWYgKG9uU3dpcGVSaWdodClcbiAgICAgIGhhbmRsZXJzLnN3aXBlcmlnaHQuYWRkKG9uU3dpcGVSaWdodCBhcyAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpO1xuICAgIGlmIChvblN3aXBlVXApXG4gICAgICBoYW5kbGVycy5zd2lwZXVwLmFkZChvblN3aXBlVXAgYXMgKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKTtcbiAgICBpZiAob25Td2lwZURvd24pXG4gICAgICBoYW5kbGVycy5zd2lwZWRvd24uYWRkKG9uU3dpcGVEb3duIGFzIChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCk7XG5cbiAgICAvLyBHZXN0dXJlIHN0YXRlIGZvciB0cmFja2luZ1xuICAgIGxldCBzdGFydFggPSAwO1xuICAgIGxldCBzdGFydFkgPSAwO1xuICAgIGxldCBhY3RpdmUgPSBmYWxzZTtcbiAgICBsZXQgc3RhcnRUaW1lID0gMDtcbiAgICBsZXQgaXNFbmFibGVkID0gZW5hYmxlZDtcblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoIGEgc3dpcGUgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgaGFuZGxlcnNcbiAgICAgKi9cbiAgICBjb25zdCBkaXNwYXRjaFN3aXBlID0gKFxuICAgICAgZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQsXG4gICAgICBlbmRYOiBudW1iZXIsXG4gICAgICBlbmRZOiBudW1iZXJcbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGRlbHRhWCA9IGVuZFggLSBzdGFydFg7XG4gICAgICBjb25zdCBkZWx0YVkgPSBlbmRZIC0gc3RhcnRZO1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcbiAgICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgZHVyYXRpb24gPSBlbmRUaW1lIC0gc3RhcnRUaW1lO1xuICAgICAgY29uc3QgdmVsb2NpdHkgPSBkaXN0YW5jZSAvIGR1cmF0aW9uO1xuICAgICAgY29uc3QgZGlyZWN0aW9uID0gZ2V0U3dpcGVEaXJlY3Rpb24oZGVsdGFYLCBkZWx0YVkpO1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIHN3aXBlIGV2ZW50XG4gICAgICBjb25zdCBzd2lwZUV2ZW50OiBTd2lwZUV2ZW50ID0ge1xuICAgICAgICB0eXBlOiBcInN3aXBlXCIsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHRhcmdldDogZS50YXJnZXQhLFxuICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgIGVuZFRpbWUsXG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgICBkZWZhdWx0UHJldmVudGVkOiBmYWxzZSxcbiAgICAgICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgICBzd2lwZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHN0b3BQcm9wYWdhdGlvbjogKCkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgZGVsdGFYLFxuICAgICAgICBkZWx0YVksXG4gICAgICAgIGRpc3RhbmNlLFxuICAgICAgICB2ZWxvY2l0eSxcbiAgICAgICAgc3RhcnRYLFxuICAgICAgICBzdGFydFksXG4gICAgICAgIGVuZFgsXG4gICAgICAgIGVuZFksXG4gICAgICB9O1xuXG4gICAgICAvLyBGaXJzdCB0cmlnZ2VyIGdlbmVyaWMgc3dpcGUgaGFuZGxlcnNcbiAgICAgIGhhbmRsZXJzLnN3aXBlLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBoYW5kbGVyKHN3aXBlRXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbiBzd2lwZSBoYW5kbGVyOlwiLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBUaGVuIHRyaWdnZXIgZGlyZWN0aW9uLXNwZWNpZmljIGhhbmRsZXJzXG4gICAgICBjb25zdCBkaXJlY3Rpb25LZXkgPSBgc3dpcGUke2RpcmVjdGlvbn1gIGFzIGtleW9mIHR5cGVvZiBoYW5kbGVycztcbiAgICAgIGhhbmRsZXJzW2RpcmVjdGlvbktleV0uZm9yRWFjaCgoaGFuZGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhhbmRsZXIoeyAuLi5zd2lwZUV2ZW50LCB0eXBlOiBkaXJlY3Rpb25LZXkgfSBhcyBTd2lwZUV2ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBpbiAke2RpcmVjdGlvbktleX0gaGFuZGxlcjpgLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBGb3J3YXJkIHRvIGNvbXBvbmVudCdzIGV2ZW50IHN5c3RlbSBpZiBhdmFpbGFibGVcbiAgICAgIGlmIChoYXNFbWl0KGNvbXBvbmVudCkpIHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQoXCJzd2lwZVwiLCBzd2lwZUV2ZW50KTtcbiAgICAgICAgY29tcG9uZW50LmVtaXQoZGlyZWN0aW9uS2V5LCBzd2lwZUV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgcHJldmVudERlZmF1bHQgaWYgY29uZmlndXJlZFxuICAgICAgaWYgKHByZXZlbnREZWZhdWx0ICYmICFzd2lwZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgc3dpcGVFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2Ugc3RhcnRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVTdGFydCA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdG91Y2ggPSBcInRvdWNoZXNcIiBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcblxuICAgICAgc3RhcnRYID0gdG91Y2guY2xpZW50WDtcbiAgICAgIHN0YXJ0WSA9IHRvdWNoLmNsaWVudFk7XG4gICAgICBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgYWN0aXZlID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIGVuZFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUVuZCA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFhY3RpdmUgfHwgIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9XG4gICAgICAgIFwiY2hhbmdlZFRvdWNoZXNcIiBpbiBlICYmIGUuY2hhbmdlZFRvdWNoZXMubGVuZ3RoID4gMFxuICAgICAgICAgID8gZS5jaGFuZ2VkVG91Y2hlc1swXVxuICAgICAgICAgIDogKGUgYXMgTW91c2VFdmVudCk7XG5cbiAgICAgIGNvbnN0IGVuZFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgY29uc3QgZW5kWSA9IHRvdWNoLmNsaWVudFk7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBzd2lwZSBwcm9wZXJ0aWVzXG4gICAgICBjb25zdCBkZWx0YVggPSBlbmRYIC0gc3RhcnRYO1xuICAgICAgY29uc3QgZGVsdGFZID0gZW5kWSAtIHN0YXJ0WTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG5cbiAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSBzd2lwZVxuICAgICAgaWYgKGRpc3RhbmNlID49IHN3aXBlVGhyZXNob2xkICYmIGR1cmF0aW9uIDw9IHN3aXBlVGltZVRocmVzaG9sZCkge1xuICAgICAgICBkaXNwYXRjaFN3aXBlKGUsIGVuZFgsIGVuZFkpO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIGNhbmNlbFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnMgZGljdGlvbmFyeVxuICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzOiBSZWNvcmQ8c3RyaW5nLCBFdmVudExpc3RlbmVyPiA9IHtcbiAgICAgIG1vdXNlZG93bjogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNldXA6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2VsZWF2ZTogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaHN0YXJ0OiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hjYW5jZWw6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGQgZXZlbnQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCB7XG4gICAgICAgICAgcGFzc2l2ZTogIXByZXZlbnREZWZhdWx0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBTZXR1cCBsaXN0ZW5lcnMgaWYgaW5pdGlhbGx5IGVuYWJsZWRcbiAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgIC8vIENsZWFyIGhhbmRsZXJzXG4gICAgICAgIE9iamVjdC52YWx1ZXMoaGFuZGxlcnMpLmZvckVhY2goKGhhbmRsZXJTZXQpID0+IGhhbmRsZXJTZXQuY2xlYXIoKSk7XG5cbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBvcmlnaW5hbERlc3Ryb3kuY2FsbChjb21wb25lbnQubGlmZWN5Y2xlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIC8vIEFkZCBoYW5kbGVyIG1ldGhvZHNcbiAgICAgIG9uU3dpcGUoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvblN3aXBlTGVmdChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGVsZWZ0LmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvblN3aXBlUmlnaHQoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlcmlnaHQuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9uU3dpcGVVcChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGV1cC5hZGQoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb25Td2lwZURvd24oaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlZG93bi5hZGQoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLy8gUmVtb3ZlIGhhbmRsZXIgbWV0aG9kc1xuICAgICAgb2ZmU3dpcGUoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZTd2lwZUxlZnQoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlbGVmdC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb2ZmU3dpcGVSaWdodChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGVyaWdodC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb2ZmU3dpcGVVcChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGV1cC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb2ZmU3dpcGVEb3duKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5zd2lwZWRvd24uZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8vIEVuYWJsZS9kaXNhYmxlIG1ldGhvZHNcbiAgICAgIGVuYWJsZVN3aXBlKCkge1xuICAgICAgICBpZiAoIWlzRW5hYmxlZCkge1xuICAgICAgICAgIGlzRW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgZGlzYWJsZVN3aXBlKCkge1xuICAgICAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICAgICAgaXNFbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbiIsCiAgICAiLy8gc3JjL2NvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlcy9sb25ncHJlc3MudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBBZGRzIGxvbmcgcHJlc3MgZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBjb21wb25lbnRzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBCYXNlQ29tcG9uZW50LCBFbGVtZW50Q29tcG9uZW50IH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IExvbmdQcmVzc0V2ZW50LCBHZXN0dXJlSGFuZGxlciB9IGZyb20gXCIuLi8uLi8uLi9nZXN0dXJlc1wiO1xuaW1wb3J0IHsgaGFzTGlmZWN5Y2xlLCBoYXNFbWl0IH0gZnJvbSBcIm10cmxcIjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBsb25nIHByZXNzIGdlc3R1cmUgZmVhdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvbmdQcmVzc0dlc3R1cmVDb25maWcge1xuICAvKipcbiAgICogVGltZSAoaW4gbXMpIHRvIHJlY29nbml6ZSBhIGxvbmcgcHJlc3NcbiAgICogQGRlZmF1bHQgNTAwXG4gICAqL1xuICBsb25nUHJlc3NUaW1lPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEaXN0YW5jZSB0aHJlc2hvbGQgKGluIHBpeGVscykgZm9yIG1vdmVtZW50IHRoYXQgY2FuY2VscyBsb25nIHByZXNzXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuICBtb3ZlVGhyZXNob2xkPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHByZXZlbnQgZGVmYXVsdCBiZWhhdmlvcnMgb24gdG91Y2ggZXZlbnRzXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHByZXZlbnREZWZhdWx0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgbG9uZyBwcmVzcyBnZXN0dXJlXG4gICAqL1xuICBvbkxvbmdQcmVzcz86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBsb25nIHByZXNzIHJlY29nbml0aW9uIGltbWVkaWF0ZWx5XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgd2l0aCBsb25nIHByZXNzIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9uZ1ByZXNzR2VzdHVyZUNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvKipcbiAgICogQWRkIGEgbG9uZyBwcmVzcyBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvbkxvbmdQcmVzczogKFxuICAgIGhhbmRsZXI6IChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWRcbiAgKSA9PiBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBsb25nIHByZXNzIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZkxvbmdQcmVzczogKFxuICAgIGhhbmRsZXI6IChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWRcbiAgKSA9PiBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgbG9uZyBwcmVzcyByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBlbmFibGVMb25nUHJlc3M6ICgpID0+IExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIERpc2FibGUgbG9uZyBwcmVzcyByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBkaXNhYmxlTG9uZ1ByZXNzOiAoKSA9PiBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50O1xufVxuXG4vKipcbiAqIEFkZHMgbG9uZyBwcmVzcyBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50LlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IGFsdGVybmF0aXZlIHRvIHRoZSBmdWxsIGdlc3R1cmUgc3lzdGVtLFxuICogZm9jdXNlZCBvbmx5IG9uIGxvbmcgcHJlc3MgZGV0ZWN0aW9uLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9iamVjdCBjb250YWluaW5nIGxvbmcgcHJlc3Mgc2V0dGluZ3NcbiAqIEByZXR1cm5zIEZ1bmN0aW9uIHRoYXQgZW5oYW5jZXMgYSBjb21wb25lbnQgd2l0aCBsb25nIHByZXNzIGNhcGFiaWxpdGllc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQWRkIGxvbmcgcHJlc3MgZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBhIGNvbXBvbmVudFxuICogY29uc3QgY29tcG9uZW50ID0gcGlwZShcbiAqICAgY3JlYXRlQmFzZSxcbiAqICAgd2l0aEVsZW1lbnQoLi4uKSxcbiAqICAgd2l0aExvbmdQcmVzc0dlc3R1cmUoe1xuICogICAgIGxvbmdQcmVzc1RpbWU6IDgwMCxcbiAqICAgICBvbkxvbmdQcmVzczogKGUpID0+IHNob3dDb250ZXh0TWVudShlLngsIGUueSlcbiAqICAgfSlcbiAqICkoY29uZmlnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgd2l0aExvbmdQcmVzc0dlc3R1cmUgPVxuICAoY29uZmlnOiBMb25nUHJlc3NHZXN0dXJlQ29uZmlnID0ge30pID0+XG4gIDxDIGV4dGVuZHMgRWxlbWVudENvbXBvbmVudD4oY29tcG9uZW50OiBDKTogQyAmIExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQgPT4ge1xuICAgIGlmICghY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJDYW5ub3QgYWRkIGxvbmcgcHJlc3MgZ2VzdHVyZSByZWNvZ25pdGlvbjogbWlzc2luZyBlbGVtZW50XCJcbiAgICAgICk7XG4gICAgICByZXR1cm4gY29tcG9uZW50IGFzIEMgJiBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIGxvbmdQcmVzc1RpbWUgPSA1MDAsXG4gICAgICBtb3ZlVGhyZXNob2xkID0gMTAsXG4gICAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWUsXG4gICAgICBvbkxvbmdQcmVzcyxcbiAgICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBFdmVudCBoYW5kbGVycyBzdG9yYWdlXG4gICAgY29uc3QgaGFuZGxlcnM6IFNldDwoZXZlbnQ6IExvbmdQcmVzc0V2ZW50KSA9PiB2b2lkPiA9IG5ldyBTZXQoKTtcblxuICAgIC8vIElmIGluaXRpYWwgaGFuZGxlciBwcm92aWRlZCwgYWRkIGl0XG4gICAgaWYgKG9uTG9uZ1ByZXNzKSB7XG4gICAgICBoYW5kbGVycy5hZGQob25Mb25nUHJlc3MgYXMgKGV2ZW50OiBMb25nUHJlc3NFdmVudCkgPT4gdm9pZCk7XG4gICAgfVxuXG4gICAgLy8gR2VzdHVyZSBzdGF0ZSBmb3IgdHJhY2tpbmdcbiAgICBsZXQgc3RhcnRYID0gMDtcbiAgICBsZXQgc3RhcnRZID0gMDtcbiAgICBsZXQgY3VycmVudFggPSAwO1xuICAgIGxldCBjdXJyZW50WSA9IDA7XG4gICAgbGV0IGFjdGl2ZSA9IGZhbHNlO1xuICAgIGxldCBzdGFydFRpbWUgPSAwO1xuICAgIGxldCBsb25nUHJlc3NUaW1lcjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGlzRW5hYmxlZCA9IGVuYWJsZWQ7XG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBhIGxvbmcgcHJlc3MgZXZlbnQgdG8gYWxsIGhhbmRsZXJzXG4gICAgICovXG4gICAgY29uc3QgZGlzcGF0Y2hMb25nUHJlc3MgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIC8vIENyZWF0ZSB0aGUgbG9uZyBwcmVzcyBldmVudFxuICAgICAgY29uc3QgbG9uZ1ByZXNzRXZlbnQ6IExvbmdQcmVzc0V2ZW50ID0ge1xuICAgICAgICB0eXBlOiBcImxvbmdwcmVzc1wiLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0YXJnZXQ6IGUudGFyZ2V0ISxcbiAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICBlbmRUaW1lOiBEYXRlLm5vdygpLFxuICAgICAgICBkdXJhdGlvbjogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSxcbiAgICAgICAgZGVmYXVsdFByZXZlbnRlZDogZmFsc2UsXG4gICAgICAgIHByZXZlbnREZWZhdWx0OiAoKSA9PiB7XG4gICAgICAgICAgbG9uZ1ByZXNzRXZlbnQuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSxcbiAgICAgICAgeDogY3VycmVudFgsXG4gICAgICAgIHk6IGN1cnJlbnRZLFxuICAgICAgfTtcblxuICAgICAgLy8gQ2FsbCBlYWNoIGhhbmRsZXJcbiAgICAgIGhhbmRsZXJzLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBoYW5kbGVyKGxvbmdQcmVzc0V2ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgaW4gbG9uZyBwcmVzcyBoYW5kbGVyOlwiLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBGb3J3YXJkIHRvIGNvbXBvbmVudCdzIGV2ZW50IHN5c3RlbSBpZiBhdmFpbGFibGVcbiAgICAgIGlmIChoYXNFbWl0KGNvbXBvbmVudCkpIHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQoXCJsb25ncHJlc3NcIiwgbG9uZ1ByZXNzRXZlbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBwcmV2ZW50RGVmYXVsdCBpZiBjb25maWd1cmVkXG4gICAgICBpZiAocHJldmVudERlZmF1bHQgJiYgIWxvbmdQcmVzc0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgbG9uZ1ByZXNzRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIHN0YXJ0XG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlU3RhcnQgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRvdWNoID0gXCJ0b3VjaGVzXCIgaW4gZSA/IGUudG91Y2hlc1swXSA6IGU7XG5cbiAgICAgIHN0YXJ0WCA9IGN1cnJlbnRYID0gdG91Y2guY2xpZW50WDtcbiAgICAgIHN0YXJ0WSA9IGN1cnJlbnRZID0gdG91Y2guY2xpZW50WTtcbiAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBhY3RpdmUgPSB0cnVlO1xuXG4gICAgICAvLyBDYW5jZWwgYW55IGV4aXN0aW5nIHRpbWVyXG4gICAgICBpZiAobG9uZ1ByZXNzVGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB1cCBsb25nIHByZXNzIHRpbWVyXG4gICAgICBsb25nUHJlc3NUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICAgIC8vIENoZWNrIGlmIG1vdmVtZW50IHdhcyB3aXRoaW4gdGhyZXNob2xkXG4gICAgICAgICAgY29uc3QgZGVsdGFYID0gY3VycmVudFggLSBzdGFydFg7XG4gICAgICAgICAgY29uc3QgZGVsdGFZID0gY3VycmVudFkgLSBzdGFydFk7XG4gICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcblxuICAgICAgICAgIGlmIChkaXN0YW5jZSA8IG1vdmVUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoTG9uZ1ByZXNzKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxvbmdQcmVzc1RpbWVyID0gbnVsbDtcbiAgICAgIH0sIGxvbmdQcmVzc1RpbWUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgbW92ZVxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZU1vdmUgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghYWN0aXZlIHx8ICFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdG91Y2ggPSBcInRvdWNoZXNcIiBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcblxuICAgICAgY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuXG4gICAgICAvLyBDaGVjayBpZiBtb3ZlbWVudCBleGNlZWRzIHRocmVzaG9sZFxuICAgICAgY29uc3QgZGVsdGFYID0gY3VycmVudFggLSBzdGFydFg7XG4gICAgICBjb25zdCBkZWx0YVkgPSBjdXJyZW50WSAtIHN0YXJ0WTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG5cbiAgICAgIGlmIChkaXN0YW5jZSA+IG1vdmVUaHJlc2hvbGQpIHtcbiAgICAgICAgLy8gQ2FuY2VsIGxvbmcgcHJlc3MgaWYgbW92ZWQgdG9vIG11Y2hcbiAgICAgICAgaWYgKGxvbmdQcmVzc1RpbWVyICE9PSBudWxsKSB7XG4gICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgICAgbG9uZ1ByZXNzVGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBlbmRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVFbmQgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAobG9uZ1ByZXNzVGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgIGxvbmdQcmVzc1RpbWVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBjYW5jZWxcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVDYW5jZWwgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAobG9uZ1ByZXNzVGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgIGxvbmdQcmVzc1RpbWVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8vIEV2ZW50IGxpc3RlbmVycyBkaWN0aW9uYXJ5XG4gICAgY29uc3QgZXZlbnRMaXN0ZW5lcnM6IFJlY29yZDxzdHJpbmcsIEV2ZW50TGlzdGVuZXI+ID0ge1xuICAgICAgbW91c2Vkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2Vtb3ZlOiBoYW5kbGVNb3ZlIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZXVwOiBoYW5kbGVFbmQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNlbGVhdmU6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hzdGFydDogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNobW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hjYW5jZWw6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGQgZXZlbnQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCB7XG4gICAgICAgICAgcGFzc2l2ZTogIXByZXZlbnREZWZhdWx0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBTZXR1cCBsaXN0ZW5lcnMgaWYgaW5pdGlhbGx5IGVuYWJsZWRcbiAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgIC8vIENsZWFyIGFueSB0aW1lcnNcbiAgICAgICAgaWYgKGxvbmdQcmVzc1RpbWVyICE9PSBudWxsKSB7XG4gICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgICAgbG9uZ1ByZXNzVGltZXIgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgaGFuZGxlcnNcbiAgICAgICAgaGFuZGxlcnMuY2xlYXIoKTtcblxuICAgICAgICAvLyBDYWxsIG9yaWdpbmFsIGRlc3Ryb3kgbWV0aG9kXG4gICAgICAgIG9yaWdpbmFsRGVzdHJveS5jYWxsKGNvbXBvbmVudC5saWZlY3ljbGUpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgLyoqXG4gICAgICAgKiBBZGQgYSBsb25nIHByZXNzIGV2ZW50IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBvbkxvbmdQcmVzcyhoYW5kbGVyOiAoZXZlbnQ6IExvbmdQcmVzc0V2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBhIGxvbmcgcHJlc3MgZXZlbnQgaGFuZGxlclxuICAgICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIG9mZkxvbmdQcmVzcyhoYW5kbGVyOiAoZXZlbnQ6IExvbmdQcmVzc0V2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVuYWJsZSBsb25nIHByZXNzIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZUxvbmdQcmVzcygpIHtcbiAgICAgICAgaWYgKCFpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZSBsb25nIHByZXNzIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVMb25nUHJlc3MoKSB7XG4gICAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgYW55IHRpbWVyc1xuICAgICAgICAgIGlmIChsb25nUHJlc3NUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgICAgICBsb25nUHJlc3NUaW1lciA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3Bhbi50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIEFkZHMgcGFuIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gY29tcG9uZW50c1xuICovXG5cbmltcG9ydCB0eXBlIHsgQmFzZUNvbXBvbmVudCwgRWxlbWVudENvbXBvbmVudCB9IGZyb20gXCJtdHJsXCI7XG5pbXBvcnQgeyBQYW5FdmVudCwgR2VzdHVyZUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vLi4vZ2VzdHVyZXNcIjtcbmltcG9ydCB7IGhhc0xpZmVjeWNsZSwgaGFzRW1pdCB9IGZyb20gXCJtdHJsXCI7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgcGFuIGdlc3R1cmUgZmVhdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhbkdlc3R1cmVDb25maWcge1xuICAvKipcbiAgICogV2hldGhlciB0byBwcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3JzIG9uIHRvdWNoIGV2ZW50c1xuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBwcmV2ZW50RGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIHBhbiBzdGFydCAoZmlyc3QgbW92ZW1lbnQpXG4gICAqL1xuICBvblBhblN0YXJ0PzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIHBhbiBtb3ZlIChjb250aW51b3VzIHVwZGF0ZXMgZHVyaW5nIHBhbilcbiAgICovXG4gIG9uUGFuPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIHBhbiBlbmQgKHRvdWNoL21vdXNlIHJlbGVhc2UpXG4gICAqL1xuICBvblBhbkVuZD86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBwYW4gcmVjb2duaXRpb24gaW1tZWRpYXRlbHlcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKipcbiAqIEV4dGVuZCB0aGUgUGFuRXZlbnQgaW50ZXJmYWNlIHRvIHN1cHBvcnQgb3VyIGN1c3RvbSBldmVudCB0eXBlc1xuICovXG5pbnRlcmZhY2UgRXh0ZW5kZWRQYW5FdmVudCBleHRlbmRzIE9taXQ8UGFuRXZlbnQsIFwidHlwZVwiPiB7XG4gIHR5cGU6IFwicGFuXCIgfCBcInBhbnN0YXJ0XCIgfCBcInBhbmVuZFwiO1xufVxuXG4vKipcbiAqIENvbXBvbmVudCB3aXRoIHBhbiBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhbkdlc3R1cmVDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgZm9yIHBhbiBzdGFydFxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25QYW5TdGFydDogKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpID0+IFBhbkdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgZm9yIHBhbiBtb3ZlIChjb250aW51b3VzIHVwZGF0ZXMpXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblBhbjogKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpID0+IFBhbkdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgZm9yIHBhbiBlbmRcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uUGFuRW5kOiAoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgcGFuIHN0YXJ0IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlBhblN0YXJ0OiAoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgcGFuIG1vdmUgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmUGFuOiAoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgcGFuIGVuZCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZQYW5FbmQ6IChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSA9PiBQYW5HZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgcGFuIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGVuYWJsZVBhbjogKCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogRGlzYWJsZSBwYW4gcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZGlzYWJsZVBhbjogKCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBBZGRzIHBhbiBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50LlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IGFsdGVybmF0aXZlIHRvIHRoZSBmdWxsIGdlc3R1cmUgc3lzdGVtLFxuICogZm9jdXNlZCBvbmx5IG9uIHBhbiBkZXRlY3Rpb24uXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgcGFuIHNldHRpbmdzXG4gKiBAcmV0dXJucyBGdW5jdGlvbiB0aGF0IGVuaGFuY2VzIGEgY29tcG9uZW50IHdpdGggcGFuIGNhcGFiaWxpdGllc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQWRkIHBhbiBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50XG4gKiBjb25zdCBjb21wb25lbnQgPSBwaXBlKFxuICogICBjcmVhdGVCYXNlLFxuICogICB3aXRoRWxlbWVudCguLi4pLFxuICogICB3aXRoUGFuR2VzdHVyZSh7XG4gKiAgICAgb25QYW5TdGFydDogKGUpID0+IHN0YXJ0RHJhZyhlKSxcbiAqICAgICBvblBhbjogKGUpID0+IHVwZGF0ZURyYWdQb3NpdGlvbihlKSxcbiAqICAgICBvblBhbkVuZDogKGUpID0+IGVuZERyYWcoZSlcbiAqICAgfSlcbiAqICkoY29uZmlnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFBhbkdlc3R1cmUgPVxuICAoY29uZmlnOiBQYW5HZXN0dXJlQ29uZmlnID0ge30pID0+XG4gIDxDIGV4dGVuZHMgRWxlbWVudENvbXBvbmVudD4oY29tcG9uZW50OiBDKTogQyAmIFBhbkdlc3R1cmVDb21wb25lbnQgPT4ge1xuICAgIGlmICghY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkNhbm5vdCBhZGQgcGFuIGdlc3R1cmUgcmVjb2duaXRpb246IG1pc3NpbmcgZWxlbWVudFwiKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQgYXMgQyAmIFBhbkdlc3R1cmVDb21wb25lbnQ7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uXG4gICAgY29uc3Qge1xuICAgICAgcHJldmVudERlZmF1bHQgPSB0cnVlLFxuICAgICAgb25QYW5TdGFydCxcbiAgICAgIG9uUGFuLFxuICAgICAgb25QYW5FbmQsXG4gICAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gRXZlbnQgaGFuZGxlcnMgc3RvcmFnZSBieSBwYW4gcGhhc2VcbiAgICBjb25zdCBoYW5kbGVycyA9IHtcbiAgICAgIHBhbnN0YXJ0OiBuZXcgU2V0PChldmVudDogUGFuRXZlbnQpID0+IHZvaWQ+KCksXG4gICAgICBwYW46IG5ldyBTZXQ8KGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZD4oKSxcbiAgICAgIHBhbmVuZDogbmV3IFNldDwoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkPigpLFxuICAgIH07XG5cbiAgICAvLyBBZGQgaW5pdGlhbCBoYW5kbGVycyBpZiBwcm92aWRlZFxuICAgIGlmIChvblBhblN0YXJ0KVxuICAgICAgaGFuZGxlcnMucGFuc3RhcnQuYWRkKG9uUGFuU3RhcnQgYXMgKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCk7XG4gICAgaWYgKG9uUGFuKSBoYW5kbGVycy5wYW4uYWRkKG9uUGFuIGFzIChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpO1xuICAgIGlmIChvblBhbkVuZCkgaGFuZGxlcnMucGFuZW5kLmFkZChvblBhbkVuZCBhcyAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKTtcblxuICAgIC8vIEdlc3R1cmUgc3RhdGUgZm9yIHRyYWNraW5nXG4gICAgbGV0IHN0YXJ0WCA9IDA7XG4gICAgbGV0IHN0YXJ0WSA9IDA7XG4gICAgbGV0IGxhc3RYID0gMDtcbiAgICBsZXQgbGFzdFkgPSAwO1xuICAgIGxldCBjdXJyZW50WCA9IDA7XG4gICAgbGV0IGN1cnJlbnRZID0gMDtcbiAgICBsZXQgYWN0aXZlID0gZmFsc2U7XG4gICAgbGV0IGlzUGFubmluZyA9IGZhbHNlO1xuICAgIGxldCBzdGFydFRpbWUgPSAwO1xuICAgIGxldCBpc0VuYWJsZWQgPSBlbmFibGVkO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgcGFuIGV2ZW50IHdpdGggdGhlIGN1cnJlbnQgc3RhdGVcbiAgICAgKi9cbiAgICBjb25zdCBjcmVhdGVQYW5FdmVudCA9IChcbiAgICAgIGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50LFxuICAgICAgdHlwZTogXCJwYW5zdGFydFwiIHwgXCJwYW5cIiB8IFwicGFuZW5kXCJcbiAgICApOiBFeHRlbmRlZFBhbkV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50OiBFeHRlbmRlZFBhbkV2ZW50ID0ge1xuICAgICAgICB0eXBlLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0YXJnZXQ6IGUudGFyZ2V0ISxcbiAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICBlbmRUaW1lOiBEYXRlLm5vdygpLFxuICAgICAgICBkdXJhdGlvbjogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSxcbiAgICAgICAgZGVmYXVsdFByZXZlbnRlZDogZmFsc2UsXG4gICAgICAgIHByZXZlbnREZWZhdWx0OiAoKSA9PiB7XG4gICAgICAgICAgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGVsdGFYOiBjdXJyZW50WCAtIHN0YXJ0WCxcbiAgICAgICAgZGVsdGFZOiBjdXJyZW50WSAtIHN0YXJ0WSxcbiAgICAgICAgc3RhcnRYLFxuICAgICAgICBzdGFydFksXG4gICAgICAgIGN1cnJlbnRYLFxuICAgICAgICBjdXJyZW50WSxcbiAgICAgIH07XG4gICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoIGEgcGFuIGV2ZW50IHRvIGFsbCByZWdpc3RlcmVkIGhhbmRsZXJzXG4gICAgICovXG4gICAgY29uc3QgZGlzcGF0Y2hQYW4gPSAoXG4gICAgICBlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCxcbiAgICAgIHR5cGU6IFwicGFuc3RhcnRcIiB8IFwicGFuXCIgfCBcInBhbmVuZFwiXG4gICAgKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBleHRlbmRlZFBhbkV2ZW50ID0gY3JlYXRlUGFuRXZlbnQoZSwgdHlwZSk7XG5cbiAgICAgIC8vIENhbGwgZWFjaCBoYW5kbGVyIGZvciB0aGlzIHBoYXNlXG4gICAgICBoYW5kbGVyc1t0eXBlXS5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVHlwZSBhc3NlcnRpb24gZm9yIHRoZSBoYW5kbGVyIGNhbGwgLSB3ZSdyZSBkZWxpYmVyYXRlbHkgcGFzc2luZyBvdXIgZXh0ZW5kZWQgZXZlbnRcbiAgICAgICAgICBoYW5kbGVyKGV4dGVuZGVkUGFuRXZlbnQgYXMgdW5rbm93biBhcyBQYW5FdmVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgaW4gJHt0eXBlfSBoYW5kbGVyOmAsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZvcndhcmQgdG8gY29tcG9uZW50J3MgZXZlbnQgc3lzdGVtIGlmIGF2YWlsYWJsZVxuICAgICAgaWYgKGhhc0VtaXQoY29tcG9uZW50KSkge1xuICAgICAgICBjb21wb25lbnQuZW1pdCh0eXBlLCBleHRlbmRlZFBhbkV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgcHJldmVudERlZmF1bHQgaWYgY29uZmlndXJlZFxuICAgICAgaWYgKHByZXZlbnREZWZhdWx0ICYmICFleHRlbmRlZFBhbkV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgZXh0ZW5kZWRQYW5FdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2Ugc3RhcnRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVTdGFydCA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdG91Y2ggPSBcInRvdWNoZXNcIiBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcblxuICAgICAgc3RhcnRYID0gbGFzdFggPSBjdXJyZW50WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBzdGFydFkgPSBsYXN0WSA9IGN1cnJlbnRZID0gdG91Y2guY2xpZW50WTtcbiAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBhY3RpdmUgPSB0cnVlO1xuICAgICAgaXNQYW5uaW5nID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBtb3ZlXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlTW92ZSA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFhY3RpdmUgfHwgIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9IFwidG91Y2hlc1wiIGluIGUgPyBlLnRvdWNoZXNbMF0gOiBlO1xuXG4gICAgICAvLyBVcGRhdGUgcG9zaXRpb25cbiAgICAgIGxhc3RYID0gY3VycmVudFg7XG4gICAgICBsYXN0WSA9IGN1cnJlbnRZO1xuICAgICAgY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgbW92ZW1lbnQgZGVsdGFcbiAgICAgIGNvbnN0IG1vdmVEZWx0YVggPSBjdXJyZW50WCAtIGxhc3RYO1xuICAgICAgY29uc3QgbW92ZURlbHRhWSA9IGN1cnJlbnRZIC0gbGFzdFk7XG4gICAgICBjb25zdCBtb3ZlRGVsdGEgPSBNYXRoLnNxcnQoXG4gICAgICAgIG1vdmVEZWx0YVggKiBtb3ZlRGVsdGFYICsgbW92ZURlbHRhWSAqIG1vdmVEZWx0YVlcbiAgICAgICk7XG5cbiAgICAgIC8vIERldGVjdCBzaWduaWZpY2FudCBtb3ZlbWVudFxuICAgICAgaWYgKG1vdmVEZWx0YSA+IDApIHtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3Qgc2lnbmlmaWNhbnQgbW92ZW1lbnQsIHRyaWdnZXIgcGFuc3RhcnRcbiAgICAgICAgaWYgKCFpc1Bhbm5pbmcpIHtcbiAgICAgICAgICBpc1Bhbm5pbmcgPSB0cnVlO1xuICAgICAgICAgIGRpc3BhdGNoUGFuKGUsIFwicGFuc3RhcnRcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGVuIHRyaWdnZXIgdGhlIGNvbnRpbnVvdXMgcGFuIGV2ZW50XG4gICAgICAgIGRpc3BhdGNoUGFuKGUsIFwicGFuXCIpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgZW5kXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlRW5kID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWFjdGl2ZSB8fCAhaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIC8vIElmIHdlIHdlcmUgcGFubmluZywgdHJpZ2dlciB0aGUgcGFuZW5kIGV2ZW50XG4gICAgICBpZiAoaXNQYW5uaW5nKSB7XG4gICAgICAgIGRpc3BhdGNoUGFuKGUsIFwicGFuZW5kXCIpO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICAgIGlzUGFubmluZyA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgY2FuY2VsXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWFjdGl2ZSB8fCAhaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIC8vIElmIHdlIHdlcmUgcGFubmluZywgdHJpZ2dlciB0aGUgcGFuZW5kIGV2ZW50XG4gICAgICBpZiAoaXNQYW5uaW5nKSB7XG4gICAgICAgIGRpc3BhdGNoUGFuKGUsIFwicGFuZW5kXCIpO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICAgIGlzUGFubmluZyA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnMgZGljdGlvbmFyeVxuICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzOiBSZWNvcmQ8c3RyaW5nLCBFdmVudExpc3RlbmVyPiA9IHtcbiAgICAgIG1vdXNlZG93bjogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNlbW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2V1cDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZWxlYXZlOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNoc3RhcnQ6IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaG1vdmU6IGhhbmRsZU1vdmUgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNoZW5kOiBoYW5kbGVFbmQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNoY2FuY2VsOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQWRkIGV2ZW50IGxpc3RlbmVycyB0byBlbGVtZW50XG4gICAgICovXG4gICAgY29uc3Qgc2V0dXBFdmVudExpc3RlbmVycyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKGV2ZW50TGlzdGVuZXJzKS5mb3JFYWNoKChbZXZlbnQsIGxpc3RlbmVyXSkgPT4ge1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lciwge1xuICAgICAgICAgIHBhc3NpdmU6ICFwcmV2ZW50RGVmYXVsdCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGV2ZW50IGxpc3RlbmVycyBmcm9tIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCByZW1vdmVFdmVudExpc3RlbmVycyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKGV2ZW50TGlzdGVuZXJzKS5mb3JFYWNoKChbZXZlbnQsIGxpc3RlbmVyXSkgPT4ge1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gU2V0dXAgbGlzdGVuZXJzIGlmIGluaXRpYWxseSBlbmFibGVkXG4gICAgaWYgKGlzRW5hYmxlZCkge1xuICAgICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBsaWZlY3ljbGUgaW50ZWdyYXRpb25cbiAgICBpZiAoaGFzTGlmZWN5Y2xlKGNvbXBvbmVudCkpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGNvbXBvbmVudC5saWZlY3ljbGUuZGVzdHJveTtcblxuICAgICAgY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAvLyBDbGVhbiB1cCBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcblxuICAgICAgICAvLyBDbGVhciBoYW5kbGVyc1xuICAgICAgICBPYmplY3QudmFsdWVzKGhhbmRsZXJzKS5mb3JFYWNoKChoYW5kbGVyU2V0KSA9PiBoYW5kbGVyU2V0LmNsZWFyKCkpO1xuXG4gICAgICAgIC8vIENhbGwgb3JpZ2luYWwgZGVzdHJveSBtZXRob2RcbiAgICAgICAgb3JpZ2luYWxEZXN0cm95LmNhbGwoY29tcG9uZW50LmxpZmVjeWNsZSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBlbmhhbmNlZCBjb21wb25lbnRcbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuXG4gICAgICAvLyBBZGQgaGFuZGxlciBtZXRob2RzXG4gICAgICBvblBhblN0YXJ0KGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMucGFuc3RhcnQuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9uUGFuKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMucGFuLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvblBhbkVuZChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnBhbmVuZC5hZGQoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLy8gUmVtb3ZlIGhhbmRsZXIgbWV0aG9kc1xuICAgICAgb2ZmUGFuU3RhcnQoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5wYW5zdGFydC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb2ZmUGFuKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMucGFuLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZQYW5FbmQoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5wYW5lbmQuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8vIEVuYWJsZS9kaXNhYmxlIG1ldGhvZHNcbiAgICAgIGVuYWJsZVBhbigpIHtcbiAgICAgICAgaWYgKCFpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIGRpc2FibGVQYW4oKSB7XG4gICAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvKipcbiAqIEBtb2R1bGUgY29yZS9sYXlvdXQvc2NoZW1hXG4gKiBAZGVzY3JpcHRpb24gVW5pZmllZCBsYXlvdXQgc2NoZW1hIHByb2Nlc3NvciB3aXRoIGludGVncmF0ZWQgb3B0aW1pemF0aW9uc1xuICogQ29uc29saWRhdGVzIGFycmF5LCBvYmplY3QsIEpTWCwgYW5kIHRlbXBsYXRlIHByb2Nlc3Npbmcgd2l0aCBidWlsdC1pbiBwZXJmb3JtYW5jZSBlbmhhbmNlbWVudHNcbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUWVBFUyAoRXNzZW50aWFsIG9ubHkpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0Q29uZmlnIHtcbiAgLyoqIEJhc2UgbGF5b3V0IHR5cGUgKi9cbiAgdHlwZT86IFwic3RhY2tcIiB8IFwicm93XCIgfCBcImdyaWRcIiB8IHN0cmluZztcbiAgLyoqIFNwYWNpbmcgYmV0d2VlbiBlbGVtZW50cyAqL1xuICBnYXA/OiBudW1iZXIgfCBzdHJpbmc7XG4gIC8qKiBBZGRpdGlvbmFsIENTUyBjbGFzc2VzICovXG4gIGNsYXNzPzogc3RyaW5nO1xuICAvKiogQWxpZ25tZW50IG9mIGl0ZW1zIGFsb25nIHRoZSBjcm9zcyBheGlzICovXG4gIGFsaWduPzogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgfCBcInN0cmV0Y2hcIjtcbiAgLyoqIEFsaWdubWVudCBvZiBpdGVtcyBhbG9uZyB0aGUgbWFpbiBheGlzICovXG4gIGp1c3RpZnk/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiB8IFwiYmV0d2VlblwiIHwgXCJhcm91bmRcIiB8IFwiZXZlbmx5XCI7XG4gIC8qKiBXaGV0aGVyIGFuZCBob3cgaXRlbXMgc2hvdWxkIHdyYXAgKi9cbiAgd3JhcD86IGJvb2xlYW4gfCBcInJldmVyc2VcIiB8IFwibm93cmFwXCI7XG4gIC8qKiBXaGV0aGVyIHJvdyBpdGVtcyBzaG91bGQgc3RhY2sgdmVydGljYWxseSBvbiBtb2JpbGUgKi9cbiAgbW9iaWxlU3RhY2s/OiBib29sZWFuO1xuICAvKiogV2hldGhlciByb3cgaXRlbXMgc2hvdWxkIHNjcm9sbCBob3Jpem9udGFsbHkgb24gbW9iaWxlICovXG4gIG1vYmlsZVNjcm9sbD86IGJvb2xlYW47XG4gIC8qKiBOdW1iZXIgb2YgY29sdW1ucyBvciBhdXRvbWF0aWMgc2l6aW5nIG1ldGhvZCAqL1xuICBjb2x1bW5zPzogbnVtYmVyIHwgXCJhdXRvLWZpdFwiIHwgXCJhdXRvLWZpbGxcIjtcbiAgLyoqIFdoZXRoZXIgdG8gdXNlIGRlbnNlIHBhY2tpbmcgYWxnb3JpdGhtIGZvciBncmlkICovXG4gIGRlbnNlPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgZ3JpZCBpdGVtcyBzaG91bGQgYWRqdXN0IGhlaWdodCBhdXRvbWF0aWNhbGx5ICovXG4gIGF1dG9IZWlnaHQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExheW91dEl0ZW1Db25maWcge1xuICAvKiogQ29sdW1uIHdpZHRoIGluIGEgMTItY29sdW1uIGdyaWQgKi9cbiAgd2lkdGg/OiBudW1iZXI7XG4gIC8qKiBXaWR0aCBvbiBzbWFsbCBzY3JlZW5zICovXG4gIHNtPzogbnVtYmVyO1xuICAvKiogV2lkdGggb24gbWVkaXVtIHNjcmVlbnMgKi9cbiAgbWQ/OiBudW1iZXI7XG4gIC8qKiBXaWR0aCBvbiBsYXJnZSBzY3JlZW5zICovXG4gIGxnPzogbnVtYmVyO1xuICAvKiogV2lkdGggb24gZXh0cmEtbGFyZ2Ugc2NyZWVucyAqL1xuICB4bD86IG51bWJlcjtcbiAgLyoqIE51bWJlciBvZiBncmlkIGNvbHVtbnMgdG8gc3BhbiAqL1xuICBzcGFuPzogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIGdyaWQgcm93cyB0byBzcGFuICovXG4gIHJvd1NwYW4/OiBudW1iZXI7XG4gIC8qKiBEaXNwbGF5IG9yZGVyICovXG4gIG9yZGVyPzogbnVtYmVyIHwgXCJmaXJzdFwiIHwgXCJsYXN0XCI7XG4gIC8qKiBTZWxmLWFsaWdubWVudCB3aXRoaW4gY29udGFpbmVyICovXG4gIGFsaWduPzogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgfCBcInN0cmV0Y2hcIjtcbiAgLyoqIFdoZXRoZXIgaXRlbSBzaG91bGQgYXV0b21hdGljYWxseSBzaXplICovXG4gIGF1dG8/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExheW91dE9wdGlvbnMge1xuICAvKiogRGVmYXVsdCBjcmVhdG9yIGZ1bmN0aW9uIHRvIHVzZSBpZiBub3Qgc3BlY2lmaWVkIGluIHNjaGVtYSAqL1xuICBjcmVhdG9yPzogRnVuY3Rpb247XG4gIC8qKiBXaGV0aGVyIHRvIGFwcGx5IENTUyBjbGFzcyBwcmVmaXggQGRlZmF1bHQgdHJ1ZSAqL1xuICBwcmVmaXg/OiBib29sZWFuO1xuICAvKiogQWRkaXRpb25hbCBvcHRpb25zICovXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMYXlvdXRSZXN1bHQge1xuICAvKiogVGhlIHJhdyBsYXlvdXQgb2JqZWN0IHdpdGggYWxsIGNvbXBvbmVudHMgKi9cbiAgbGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAvKiogUmVmZXJlbmNlIHRvIHRoZSByb290IGVsZW1lbnQgZm9yIGNvbnZlbmllbmNlICovXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgYW55O1xuICAvKiogRmxhdHRlbmVkIGNvbXBvbmVudCBtYXAgKi9cbiAgY29tcG9uZW50OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAvKiogR2V0cyBhIGNvbXBvbmVudCBieSBuYW1lICovXG4gIGdldChuYW1lOiBzdHJpbmcpOiBhbnk7XG4gIC8qKiBHZXRzIGFsbCBjb21wb25lbnRzIGluIGEgZmxhdHRlbmVkIG1hcCAqL1xuICBnZXRBbGwoKTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgLyoqIERlc3Ryb3lzIHRoZSBsYXlvdXQsIGNsZWFuaW5nIHVwIGFsbCBjb21wb25lbnRzICovXG4gIGRlc3Ryb3koKTogdm9pZDtcbn1cblxudHlwZSBDb21wb25lbnRMaWtlID0geyBlbGVtZW50OiBIVE1MRWxlbWVudDsgW2tleTogc3RyaW5nXTogYW55IH07XG50eXBlIFNjaGVtYUl0ZW0gPSBGdW5jdGlvbiB8IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIGFueT4gfCBTY2hlbWFJdGVtW107XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJVSUxULUlOIE9QVElNSVpBVElPTlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBGcmFnbWVudCBQb29sIGZvciBlZmZpY2llbnQgRG9jdW1lbnRGcmFnbWVudCByZXVzZVxuICogUmVkdWNlcyBHQyBwcmVzc3VyZSBpbiBoaWdoLWZyZXF1ZW5jeSBsYXlvdXQgY3JlYXRpb24gc2NlbmFyaW9zXG4gKi9cbmNsYXNzIEZyYWdtZW50UG9vbCB7XG4gIHByaXZhdGUgcG9vbDogRG9jdW1lbnRGcmFnbWVudFtdID0gW107XG4gIHByaXZhdGUgbWF4U2l6ZSA9IDg7IC8vIE9wdGltaXplZCBzaXplIGZvciBtZW1vcnkgZWZmaWNpZW5jeVxuXG4gIGdldCgpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICByZXR1cm4gdGhpcy5wb29sLnBvcCgpIHx8IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgfVxuXG4gIHJlbGVhc2UoZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb29sLmxlbmd0aCA8IHRoaXMubWF4U2l6ZSAmJiBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5wb29sLnB1c2goZnJhZ21lbnQpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMucG9vbC5sZW5ndGggPSAwO1xuICB9XG59XG5cbmNvbnN0IGZyYWdtZW50UG9vbCA9IG5ldyBGcmFnbWVudFBvb2woKTtcblxuLyoqXG4gKiBDbGFzcyBuYW1lIGNhY2hlIGZvciBsYXlvdXQgY29uZmlndXJhdGlvbnNcbiAqIFJlZHVjZXMgc3RyaW5nIG9wZXJhdGlvbnMgYnkgY2FjaGluZyBnZW5lcmF0ZWQgY2xhc3MgbmFtZXNcbiAqL1xuY29uc3QgY2xhc3NDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbi8vIENvbmZpZ3VyYXRpb24gY29uc3RhbnRzXG5jb25zdCBQUkVGSVggPSBcIm10cmxcIjsgLy8gVE9ETzogTWFrZSB0aGlzIGNvbmZpZ3VyYWJsZVxuY29uc3QgUFJFRklYX1dJVEhfREFTSCA9IGAke1BSRUZJWH0tYDtcblxuLyoqXG4gKiBHZXRzIGEgY2FjaGVkIGNsYXNzIG5hbWUgZm9yIGxheW91dCBjb25maWd1cmF0aW9uXG4gKiBPcHRpbWl6ZWQgZm9yIGRpZmZlcmVudCBjbGFzcyBuYW1pbmcgcGF0dGVybnNcbiAqL1xuZnVuY3Rpb24gZ2V0Q2FjaGVkQ2xhc3NOYW1lKFxuICB0eXBlOiBzdHJpbmcsXG4gIHByb3BlcnR5OiBzdHJpbmcsXG4gIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIsXG4pOiBzdHJpbmcge1xuICBjb25zdCBrZXkgPSBgJHt0eXBlfS0ke3Byb3BlcnR5fS0ke3ZhbHVlfWA7XG4gIGlmICghY2xhc3NDYWNoZS5oYXMoa2V5KSkge1xuICAgIGlmICh0eXBlID09PSBcIml0ZW1cIikge1xuICAgICAgY2xhc3NDYWNoZS5zZXQoXG4gICAgICAgIGtleSxcbiAgICAgICAgcHJvcGVydHkgPT09IFwiXCJcbiAgICAgICAgICA/IGBsYXlvdXRfX2l0ZW0tLSR7dmFsdWV9YFxuICAgICAgICAgIDogYGxheW91dF9faXRlbS0tJHtwcm9wZXJ0eX0tJHt2YWx1ZX1gLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIGxheW91dCBjbGFzc2VzLCBhbGlnbiB1c2VzIGxheW91dC0te3R5cGV9LXt2YWx1ZX1cbiAgICAgIC8vIGJ1dCBqdXN0aWZ5IGFuZCBvdGhlcnMgdXNlIGxheW91dC0te3R5cGV9LXtwcm9wZXJ0eX0te3ZhbHVlfVxuICAgICAgaWYgKHByb3BlcnR5ID09PSBcImFsaWduXCIpIHtcbiAgICAgICAgY2xhc3NDYWNoZS5zZXQoa2V5LCBgbGF5b3V0LS0ke3R5cGV9LSR7dmFsdWV9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGFzc0NhY2hlLnNldChrZXksIGBsYXlvdXQtLSR7dHlwZX0tJHtwcm9wZXJ0eX0tJHt2YWx1ZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNsYXNzQ2FjaGUuZ2V0KGtleSkhO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBPUFRJTUlaRUQgVVRJTElUSUVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgYSBjb21wb25lbnQgb2JqZWN0IChoYXMgYW4gZWxlbWVudCBwcm9wZXJ0eSlcbiAqL1xuZnVuY3Rpb24gaXNDb21wb25lbnQodmFsdWU6IGFueSk6IHZhbHVlIGlzIENvbXBvbmVudExpa2Uge1xuICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIFwiZWxlbWVudFwiIGluIHZhbHVlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkb2N1bWVudCBmcmFnbWVudCB1c2luZyBwb29saW5nIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRnJhZ21lbnQoKTogRG9jdW1lbnRGcmFnbWVudCB7XG4gIHJldHVybiBmcmFnbWVudFBvb2wuZ2V0KCk7XG59XG5cbi8qKlxuICogUmVsZWFzZXMgYSBmcmFnbWVudCBiYWNrIHRvIHRoZSBwb29sIGZvciByZXVzZVxuICovXG5mdW5jdGlvbiByZWxlYXNlRnJhZ21lbnQoZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpOiB2b2lkIHtcbiAgZnJhZ21lbnRQb29sLnJlbGVhc2UoZnJhZ21lbnQpO1xufVxuXG4vKipcbiAqIE9wdGltaXplZCBjbGFzcyBwcm9jZXNzaW5nIHdpdGggbWluaW1hbCBzdHJpbmcgb3BlcmF0aW9uc1xuICogSGFuZGxlcyBhcnJheXMsIHN0cmluZ3MsIGNsYXNzTmFtZSBhbGlhc2VzLCBhbmQgcmF3Q2xhc3MgZWZmaWNpZW50bHlcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0NsYXNzTmFtZXMoXG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHNraXBQcmVmaXggPSBmYWxzZSxcbik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICBpZiAoIW9wdGlvbnMpIHJldHVybiBvcHRpb25zO1xuXG4gIGNvbnN0IGhhc1Jhd0NsYXNzID0gb3B0aW9ucy5yYXdDbGFzcztcbiAgY29uc3QgaGFzUmVndWxhckNsYXNzID0gb3B0aW9ucy5jbGFzcyB8fCBvcHRpb25zLmNsYXNzTmFtZTtcblxuICAvLyBGYXN0IHBhdGg6IG5vIGNsYXNzIHByb3BlcnRpZXMgYXQgYWxsXG4gIGlmICghaGFzUmF3Q2xhc3MgJiYgIWhhc1JlZ3VsYXJDbGFzcykgcmV0dXJuIG9wdGlvbnM7XG5cbiAgLy8gRmFzdCBwYXRoOiBvbmx5IHJhd0NsYXNzIGFuZCBza2lwcGluZyBwcmVmaXggKG1vc3QgY29tbW9uIHJhd0NsYXNzIHNjZW5hcmlvKVxuICBpZiAoaGFzUmF3Q2xhc3MgJiYgIWhhc1JlZ3VsYXJDbGFzcyAmJiBza2lwUHJlZml4KSB7XG4gICAgY29uc3QgcHJvY2Vzc2VkID0geyAuLi5vcHRpb25zIH07XG4gICAgZGVsZXRlIHByb2Nlc3NlZC5yYXdDbGFzcztcblxuICAgIC8vIERpcmVjdCBhc3NpZ25tZW50IGZvciBzaW1wbGUgc3RyaW5nXG4gICAgaWYgKHR5cGVvZiBoYXNSYXdDbGFzcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcHJvY2Vzc2VkLmNsYXNzID0gaGFzUmF3Q2xhc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEhhbmRsZSBhcnJheSBjYXNlXG4gICAgICBwcm9jZXNzZWQuY2xhc3MgPSBoYXNSYXdDbGFzcy5qb2luKFwiIFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2Nlc3NlZDtcbiAgfVxuXG4gIC8vIEZ1bGwgcHJvY2Vzc2luZyBwYXRoIChvbmx5IHdoZW4gbmVlZGVkKVxuICBjb25zdCBwcm9jZXNzZWQgPSB7IC4uLm9wdGlvbnMgfTtcbiAgbGV0IGZpbmFsQ2xhc3NlcyA9IFwiXCI7XG5cbiAgLy8gSGFuZGxlIHByZWZpeGVkIGNsYXNzZXMgb25seSBpZiBub3Qgc2tpcHBpbmcgcHJlZml4XG4gIGlmICghc2tpcFByZWZpeCAmJiBoYXNSZWd1bGFyQ2xhc3MpIHtcbiAgICBsZXQgcHJlZml4ZWRTdHJpbmcgPSBcIlwiO1xuXG4gICAgaWYgKHByb2Nlc3NlZC5jbGFzcykge1xuICAgICAgcHJlZml4ZWRTdHJpbmcgKz0gQXJyYXkuaXNBcnJheShwcm9jZXNzZWQuY2xhc3MpXG4gICAgICAgID8gcHJvY2Vzc2VkLmNsYXNzLmpvaW4oXCIgXCIpXG4gICAgICAgIDogcHJvY2Vzc2VkLmNsYXNzO1xuICAgIH1cbiAgICBpZiAocHJvY2Vzc2VkLmNsYXNzTmFtZSkge1xuICAgICAgcHJlZml4ZWRTdHJpbmcgKz0gKHByZWZpeGVkU3RyaW5nID8gXCIgXCIgOiBcIlwiKSArIHByb2Nlc3NlZC5jbGFzc05hbWU7XG4gICAgfVxuXG4gICAgaWYgKHByZWZpeGVkU3RyaW5nKSB7XG4gICAgICBmaW5hbENsYXNzZXMgPSBwcmVmaXhlZFN0cmluZ1xuICAgICAgICAuc3BsaXQoL1xccysvKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5tYXAoKGNscykgPT5cbiAgICAgICAgICBjbHMuc3RhcnRzV2l0aChQUkVGSVhfV0lUSF9EQVNIKSA/IGNscyA6IFBSRUZJWF9XSVRIX0RBU0ggKyBjbHMsXG4gICAgICAgIClcbiAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSByYXdDbGFzcyAoYWx3YXlzIHByb2Nlc3NlZCB3aGVuIHByZXNlbnQpXG4gIGlmIChoYXNSYXdDbGFzcykge1xuICAgIGNvbnN0IHJhd1N0cmluZyA9IEFycmF5LmlzQXJyYXkoaGFzUmF3Q2xhc3MpXG4gICAgICA/IGhhc1Jhd0NsYXNzLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKVxuICAgICAgOiBoYXNSYXdDbGFzcztcblxuICAgIGZpbmFsQ2xhc3NlcyArPSAoZmluYWxDbGFzc2VzID8gXCIgXCIgOiBcIlwiKSArIHJhd1N0cmluZztcbiAgfVxuXG4gIGlmIChmaW5hbENsYXNzZXMpIHtcbiAgICBwcm9jZXNzZWQuY2xhc3MgPSBmaW5hbENsYXNzZXM7XG4gIH1cblxuICAvLyBDbGVhbiB1cCBpbiBvbmUgb3BlcmF0aW9uXG4gIGRlbGV0ZSBwcm9jZXNzZWQuY2xhc3NOYW1lO1xuICBkZWxldGUgcHJvY2Vzc2VkLnJhd0NsYXNzO1xuXG4gIHJldHVybiBwcm9jZXNzZWQ7XG59XG5cbi8qKlxuICogT3B0aW1pemVkIHBhcmFtZXRlciBleHRyYWN0aW9uIGZvciBhcnJheSBzY2hlbWFzXG4gKiBSZWR1Y2VzIG11bHRpcGxlIGFycmF5IGxvb2t1cHMgd2l0aCBiYXRjaCBwcm9jZXNzaW5nXG4gKi9cbmludGVyZmFjZSBFeHRyYWN0ZWRQYXJhbWV0ZXJzIHtcbiAgY3JlYXRvcjogRnVuY3Rpb247XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIGNvbnN1bWVkOiBudW1iZXI7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RQYXJhbWV0ZXJzKFxuICBzY2hlbWE6IFNjaGVtYUl0ZW1bXSxcbiAgc3RhcnRJbmRleDogbnVtYmVyLFxuICBkZWZhdWx0Q3JlYXRvcjogRnVuY3Rpb24sXG4pOiBFeHRyYWN0ZWRQYXJhbWV0ZXJzIHtcbiAgY29uc3QgaXRlbXMgPSBzY2hlbWEuc2xpY2Uoc3RhcnRJbmRleCwgc3RhcnRJbmRleCArIDMpO1xuICBsZXQgY3JlYXRvciwgbmFtZSwgb3B0aW9ucztcbiAgbGV0IGNvbnN1bWVkID0gMTtcblxuICBjb25zdCBbZmlyc3QsIHNlY29uZCwgdGhpcmRdID0gaXRlbXM7XG5cbiAgaWYgKHR5cGVvZiBmaXJzdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY3JlYXRvciA9IGZpcnN0O1xuICAgIGlmICh0eXBlb2Ygc2Vjb25kID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBuYW1lID0gc2Vjb25kO1xuICAgICAgY29uc3VtZWQgPSAyO1xuICAgICAgaWYgKGlzT2JqZWN0KHRoaXJkKSkge1xuICAgICAgICBvcHRpb25zID0gdGhpcmQ7XG4gICAgICAgIGNvbnN1bWVkID0gMztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHNlY29uZCkpIHtcbiAgICAgIG9wdGlvbnMgPSBzZWNvbmQ7XG4gICAgICBjb25zdW1lZCA9IDI7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBmaXJzdCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNyZWF0b3IgPSBkZWZhdWx0Q3JlYXRvcjtcbiAgICBuYW1lID0gZmlyc3Q7XG4gICAgaWYgKGlzT2JqZWN0KHNlY29uZCkpIHtcbiAgICAgIG9wdGlvbnMgPSBzZWNvbmQ7XG4gICAgICBjb25zdW1lZCA9IDI7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGZpcnN0KSkge1xuICAgIGNyZWF0b3IgPSBkZWZhdWx0Q3JlYXRvcjtcbiAgICBvcHRpb25zID0gZmlyc3Q7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNyZWF0b3I6IGNyZWF0b3IgfHwgZGVmYXVsdENyZWF0b3IsXG4gICAgbmFtZSxcbiAgICBvcHRpb25zOiAob3B0aW9ucyB8fCB7fSkgYXMgUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjb25zdW1lZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBTaW1wbGUgb2JqZWN0IHR5cGUgY2hlY2tcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRE9NIFVUSUxJVElFUyAoU2ltcGxpZmllZClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBTaW1wbGUgRE9NIGVsZW1lbnQgY3JlYXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRWxlbWVudChvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30pOiBIVE1MRWxlbWVudCB7XG4gIGNvbnN0IHRhZyA9IG9wdGlvbnMudGFnIHx8IFwiZGl2XCI7XG4gIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XG5cbiAgaWYgKG9wdGlvbnMuY2xhc3MpIHtcbiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IG9wdGlvbnMuY2xhc3M7XG4gIH1cblxuICBpZiAob3B0aW9ucy5zdHlsZSkge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zdHlsZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBvcHRpb25zLnN0eWxlKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zLnN0eWxlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIG9wdGlvbnMuc3R5bGUpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRpb25zLnRleHRDb250ZW50KSB7XG4gICAgZWxlbWVudC50ZXh0Q29udGVudCA9IG9wdGlvbnMudGV4dENvbnRlbnQ7XG4gIH1cblxuICBpZiAob3B0aW9ucy50ZXh0KSB7XG4gICAgZWxlbWVudC50ZXh0Q29udGVudCA9IG9wdGlvbnMudGV4dDtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxuXG4vKipcbiAqIEFkZHMgYSBDU1MgY2xhc3MgdG8gYW4gZWxlbWVudFxuICovXG5mdW5jdGlvbiBhZGRDbGFzcyhlbGVtZW50OiBIVE1MRWxlbWVudCwgY2xhc3NOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGVsZW1lbnQgJiYgY2xhc3NOYW1lKSB7XG4gICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgZWxlbWVudCBoYXMgYSBDU1MgY2xhc3NcbiAqL1xuZnVuY3Rpb24gaGFzQ2xhc3MoZWxlbWVudDogSFRNTEVsZW1lbnQsIGNsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBlbGVtZW50ICYmIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFVOSUZJRUQgQ09NUE9ORU5UIENSRUFUSU9OICh3aXRoIGRlc3RydWN0dXJpbmcgb3B0aW1pemF0aW9uKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENyZWF0ZXMgYSBjb21wb25lbnQgaW5zdGFuY2Ugd2l0aCBvcHRpbWl6ZWQgb3B0aW9uIHByb2Nlc3NpbmdcbiAqIFVzZXMgZGVzdHJ1Y3R1cmluZyBmb3IgY2xlYW5lciBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKFxuICBDb21wb25lbnQ6IGFueSxcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuKTogYW55IHtcbiAgdHJ5IHtcbiAgICAvLyBEZXN0cnVjdHVyZSBzcGVjaWFsIGNvbmZpZ3MgaW4gb25lIG9wZXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIGxheW91dDogbGF5b3V0Q29uZmlnLFxuICAgICAgbGF5b3V0SXRlbTogbGF5b3V0SXRlbUNvbmZpZyxcbiAgICAgIHN0eWxlOiBzdHlsZUNvbmZpZyxcbiAgICAgIGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXNDb25maWcsXG4gICAgICBldmVudHM6IGV2ZW50c0NvbmZpZyxcbiAgICAgIGV2ZW50LCAvLyBMZWdhY3kgc3VwcG9ydFxuICAgICAgLi4uY2xlYW5PcHRpb25zXG4gICAgfSA9IG9wdGlvbnM7XG5cbiAgICAvLyBVc2UgZXZlbnRzIG92ZXIgZXZlbnQgKGV2ZW50cyBpcyBwcmVmZXJyZWQpXG4gICAgY29uc3QgZmluYWxFdmVudHNDb25maWcgPSBldmVudHNDb25maWcgfHwgZXZlbnQ7XG5cbiAgICAvLyBJZiBzdHlsZSBpcyBhIHN0cmluZywgYWx3YXlzIHBhc3MgaXQgdGhyb3VnaCB0byB0aGUgY29tcG9uZW50XG4gICAgaWYgKHN0eWxlQ29uZmlnICYmIHR5cGVvZiBzdHlsZUNvbmZpZyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY2xlYW5PcHRpb25zLnN0eWxlID0gc3R5bGVDb25maWc7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGNvbXBvbmVudFxuICAgIGNvbnN0IGlzQ2xhc3MgPVxuICAgICAgdHlwZW9mIENvbXBvbmVudCA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKENvbXBvbmVudCwgXCJwcm90b3R5cGVcIik/LndyaXRhYmxlID09PVxuICAgICAgICBmYWxzZTtcblxuICAgIGNvbnN0IGNvbXBvbmVudCA9IGlzQ2xhc3NcbiAgICAgID8gbmV3IENvbXBvbmVudChjbGVhbk9wdGlvbnMpXG4gICAgICA6IENvbXBvbmVudChjbGVhbk9wdGlvbnMpO1xuXG4gICAgLy8gQXBwbHkgY29uZmlndXJhdGlvbnMgaWYgY29tcG9uZW50IGhhcyBlbGVtZW50XG4gICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgY29uc3QgZWxlbWVudCA9XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50IHx8XG4gICAgICAgIChjb21wb25lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IGNvbXBvbmVudCA6IG51bGwpO1xuICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgLy8gQXBwbHkgbGF5b3V0IGNsYXNzZXNcbiAgICAgICAgaWYgKGxheW91dENvbmZpZykgYXBwbHlMYXlvdXRDbGFzc2VzKGVsZW1lbnQsIGxheW91dENvbmZpZyk7XG5cbiAgICAgICAgLy8gQXBwbHkgbGF5b3V0IGl0ZW0gY2xhc3Nlc1xuICAgICAgICBpZiAobGF5b3V0SXRlbUNvbmZpZykgYXBwbHlMYXlvdXRJdGVtQ2xhc3NlcyhlbGVtZW50LCBsYXlvdXRJdGVtQ29uZmlnKTtcblxuICAgICAgICAvLyBBcHBseSBzdHlsZVxuICAgICAgICBpZiAoc3R5bGVDb25maWcgJiYgdHlwZW9mIHN0eWxlQ29uZmlnID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCBzdHlsZUNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBhdHRyaWJ1dGVzXG4gICAgICAgIGlmIChhdHRyaWJ1dGVzQ29uZmlnICYmIHR5cGVvZiBhdHRyaWJ1dGVzQ29uZmlnID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlc0NvbmZpZykpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwbHkgZXZlbnRzXG4gICAgICAgIGlmIChmaW5hbEV2ZW50c0NvbmZpZyAmJiB0eXBlb2YgZmluYWxFdmVudHNDb25maWcgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaW5hbEV2ZW50c0NvbmZpZykpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZXZlbnREZWYgb2YgZmluYWxFdmVudHNDb25maWcpIHtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnREZWYpICYmIGV2ZW50RGVmLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2V2ZW50TmFtZSwgaGFuZGxlcl0gPSBldmVudERlZjtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnROYW1lID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgICB0eXBlb2YgaGFuZGxlciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbZXZlbnROYW1lLCBoYW5kbGVyXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgICAgICAgICAgZmluYWxFdmVudHNDb25maWcsXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBjcmVhdGluZyBjb21wb25lbnQgaW5zdGFuY2U6XCIsIGVycm9yKTtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBJTlRFR1JBVEVEIExBWU9VVCBDT05GSUdVUkFUSU9OICh3aXRoIGNhY2hpbmcpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQXBwbGllcyBsYXlvdXQgY2xhc3NlcyBiYXNlZCBvbiBjb25maWd1cmF0aW9uXG4gKiBVc2VzIGludGVncmF0ZWQgY2FjaGluZyBmb3Igb3B0aW1hbCBwZXJmb3JtYW5jZVxuICovXG5mdW5jdGlvbiBhcHBseUxheW91dENsYXNzZXMoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICBsYXlvdXRDb25maWc6IExheW91dENvbmZpZyxcbik6IHZvaWQge1xuICBpZiAoIWVsZW1lbnQgfHwgIWxheW91dENvbmZpZykgcmV0dXJuO1xuXG4gIC8vIEFwcGx5IGJhc2UgbGF5b3V0IHR5cGVcbiAgaWYgKGxheW91dENvbmZpZy50eXBlKSB7XG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLSR7bGF5b3V0Q29uZmlnLnR5cGV9YCk7XG4gIH1cblxuICAvLyBBcHBseSBwcm9wZXJ0aWVzIHdpdGggY2FjaGluZ1xuICBjb25zdCBsYXlvdXRUeXBlID0gbGF5b3V0Q29uZmlnLnR5cGUgfHwgZ2V0TGF5b3V0VHlwZShlbGVtZW50KTtcbiAgaWYgKGxheW91dFR5cGUpIHtcbiAgICBpZiAobGF5b3V0Q29uZmlnLmdhcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArXG4gICAgICAgICAgZ2V0Q2FjaGVkQ2xhc3NOYW1lKGxheW91dFR5cGUsIFwiZ2FwXCIsIGxheW91dENvbmZpZy5nYXApLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGxheW91dENvbmZpZy5hbGlnbikge1xuICAgICAgYWRkQ2xhc3MoXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIFBSRUZJWF9XSVRIX0RBU0ggK1xuICAgICAgICAgIGdldENhY2hlZENsYXNzTmFtZShsYXlvdXRUeXBlLCBcImFsaWduXCIsIGxheW91dENvbmZpZy5hbGlnbiksXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobGF5b3V0Q29uZmlnLmp1c3RpZnkpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICtcbiAgICAgICAgICBnZXRDYWNoZWRDbGFzc05hbWUobGF5b3V0VHlwZSwgXCJqdXN0aWZ5XCIsIGxheW91dENvbmZpZy5qdXN0aWZ5KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gR3JpZC1zcGVjaWZpYyBwcm9wZXJ0aWVzXG4gIGlmIChsYXlvdXRDb25maWcudHlwZSA9PT0gXCJncmlkXCIgfHwgZ2V0TGF5b3V0VHlwZShlbGVtZW50KSA9PT0gXCJncmlkXCIpIHtcbiAgICBpZiAodHlwZW9mIGxheW91dENvbmZpZy5jb2x1bW5zID09PSBcIm51bWJlclwiKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArXG4gICAgICAgICAgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiZ3JpZFwiLCBcImNvbHNcIiwgbGF5b3V0Q29uZmlnLmNvbHVtbnMpLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGxheW91dENvbmZpZy5jb2x1bW5zID09PSBcImF1dG8tZmlsbFwiKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcImdyaWRcIiwgXCJmaWxsXCIsIFwiYXV0b1wiKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChsYXlvdXRDb25maWcuY29sdW1ucyA9PT0gXCJhdXRvLWZpdFwiKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcImdyaWRcIiwgXCJjb2xzXCIsIFwiYXV0by1maXRcIiksXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobGF5b3V0Q29uZmlnLmRlbnNlKVxuICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLWdyaWQtZGVuc2VgKTtcbiAgICBpZiAobGF5b3V0Q29uZmlnLmF1dG9IZWlnaHQpXG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tZ3JpZC1hdXRvLWhlaWdodGApO1xuICB9XG5cbiAgLy8gUm93LXNwZWNpZmljIHByb3BlcnRpZXNcbiAgaWYgKGxheW91dENvbmZpZy50eXBlID09PSBcInJvd1wiIHx8IGdldExheW91dFR5cGUoZWxlbWVudCkgPT09IFwicm93XCIpIHtcbiAgICBpZiAobGF5b3V0Q29uZmlnLndyYXAgPT09IGZhbHNlIHx8IGxheW91dENvbmZpZy53cmFwID09PSBcIm5vd3JhcFwiKSB7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93LW5vd3JhcGApO1xuICAgIH0gZWxzZSBpZiAobGF5b3V0Q29uZmlnLndyYXAgPT09IFwicmV2ZXJzZVwiKSB7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93LXdyYXAtcmV2ZXJzZWApO1xuICAgIH1cbiAgICBpZiAobGF5b3V0Q29uZmlnLm1vYmlsZVN0YWNrKVxuICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLXJvdy1tb2JpbGUtc3RhY2tgKTtcbiAgICBpZiAobGF5b3V0Q29uZmlnLm1vYmlsZVNjcm9sbClcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3ctbW9iaWxlLXNjcm9sbGApO1xuICB9XG5cbiAgLy8gQ3VzdG9tIGNsYXNzZXNcbiAgaWYgKGxheW91dENvbmZpZy5jbGFzcykge1xuICAgIGxheW91dENvbmZpZy5jbGFzc1xuICAgICAgLnNwbGl0KFwiIFwiKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmZvckVhY2goKGNscykgPT4gZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNscykpO1xuICB9XG59XG5cbi8qKlxuICogQXBwbGllcyBsYXlvdXQgaXRlbSBjbGFzc2VzIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb25cbiAqIFVzZXMgaW50ZWdyYXRlZCBjYWNoaW5nIGZvciBvcHRpbWFsIHBlcmZvcm1hbmNlXG4gKi9cbmZ1bmN0aW9uIGFwcGx5TGF5b3V0SXRlbUNsYXNzZXMoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICBpdGVtQ29uZmlnOiBMYXlvdXRJdGVtQ29uZmlnLFxuKTogdm9pZCB7XG4gIGlmICghZWxlbWVudCB8fCAhaXRlbUNvbmZpZykgcmV0dXJuO1xuXG4gIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0X19pdGVtYCk7XG5cbiAgLy8gV2lkdGggYW5kIHJlc3BvbnNpdmUgY2xhc3NlcyB3aXRoIGNhY2hpbmdcbiAgaWYgKGl0ZW1Db25maWcud2lkdGggJiYgaXRlbUNvbmZpZy53aWR0aCA+PSAxICYmIGl0ZW1Db25maWcud2lkdGggPD0gMTIpIHtcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcIlwiLCBpdGVtQ29uZmlnLndpZHRoKSxcbiAgICApO1xuICB9XG4gIGlmIChpdGVtQ29uZmlnLnNtKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwic21cIiwgaXRlbUNvbmZpZy5zbSksXG4gICAgKTtcbiAgaWYgKGl0ZW1Db25maWcubWQpXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJtZFwiLCBpdGVtQ29uZmlnLm1kKSxcbiAgICApO1xuICBpZiAoaXRlbUNvbmZpZy5sZylcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcImxnXCIsIGl0ZW1Db25maWcubGcpLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLnhsKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwieGxcIiwgaXRlbUNvbmZpZy54bCksXG4gICAgKTtcblxuICAvLyBHcmlkIHNwYW4gY2xhc3Nlc1xuICBpZiAoaXRlbUNvbmZpZy5zcGFuKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwic3BhblwiLCBpdGVtQ29uZmlnLnNwYW4pLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLnJvd1NwYW4pXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArXG4gICAgICAgIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJyb3ctc3BhblwiLCBpdGVtQ29uZmlnLnJvd1NwYW4pLFxuICAgICk7XG5cbiAgLy8gT3JkZXIgYW5kIGFsaWdubWVudFxuICBpZiAoaXRlbUNvbmZpZy5vcmRlcilcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcIm9yZGVyXCIsIGl0ZW1Db25maWcub3JkZXIpLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLmFsaWduKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwic2VsZlwiLCBpdGVtQ29uZmlnLmFsaWduKSxcbiAgICApO1xuICBpZiAoaXRlbUNvbmZpZy5hdXRvKVxuICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0X19pdGVtLS1hdXRvYCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgbGF5b3V0IHR5cGUgZnJvbSBlbGVtZW50IGNsYXNzZXNcbiAqL1xuZnVuY3Rpb24gZ2V0TGF5b3V0VHlwZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IHN0cmluZyB7XG4gIHJldHVybiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tc3RhY2tgKVxuICAgID8gXCJzdGFja1wiXG4gICAgOiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93YClcbiAgICAgID8gXCJyb3dcIlxuICAgICAgOiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tZ3JpZGApXG4gICAgICAgID8gXCJncmlkXCJcbiAgICAgICAgOiBcIlwiO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBVTklGSUVEIFNDSEVNQSBQUk9DRVNTT1JTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUHJvY2Vzc2VzIGFycmF5LWJhc2VkIHNjaGVtYSBkZWZpbml0aW9uc1xuICogT3B0aW1pemVkIHdpdGggcGFyYW1ldGVyIGV4dHJhY3Rpb24gYW5kIGludGVncmF0ZWQgY29uZmlndXJhdGlvblxuICovXG5mdW5jdGlvbiBwcm9jZXNzQXJyYXlTY2hlbWEoXG4gIHNjaGVtYTogU2NoZW1hSXRlbVtdIHwgYW55LFxuICBwYXJlbnRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsLFxuICBsZXZlbDogbnVtYmVyID0gMCxcbiAgb3B0aW9uczogTGF5b3V0T3B0aW9ucyA9IHt9LFxuKTogTGF5b3V0UmVzdWx0IHtcbiAgbGV2ZWwrKztcbiAgY29uc3QgbGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGNvbnN0IGNvbXBvbmVudHM6IEFycmF5PFtzdHJpbmcsIGFueV0+ID0gW107XG4gIGNvbnN0IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnQoKTtcbiAgbGV0IGNvbXBvbmVudCA9IG51bGw7XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KHNjaGVtYSkpIHtcbiAgICByZXR1cm4gY3JlYXRlTGF5b3V0UmVzdWx0KGxheW91dCk7XG4gIH1cblxuICBjb25zdCBkZWZhdWx0Q3JlYXRvciA9IChvcHRpb25zIGFzIGFueSkuY3JlYXRvciB8fCBjcmVhdGVFbGVtZW50O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaXRlbSA9IHNjaGVtYVtpXTtcbiAgICBpZiAoIWl0ZW0pIGNvbnRpbnVlO1xuXG4gICAgLy8gSGFuZGxlIG5lc3RlZCBhcnJheXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gY29tcG9uZW50IHx8IHBhcmVudEVsZW1lbnQ7XG4gICAgICBjb25zdCByZXN1bHQgPSBwcm9jZXNzQXJyYXlTY2hlbWEoaXRlbSwgY29udGFpbmVyLCBsZXZlbCwgb3B0aW9ucyk7XG4gICAgICAvLyBNZXJnZSBuZXN0ZWQgY29tcG9uZW50cyBhcnJheSBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQubGF5b3V0LmNvbXBvbmVudHMpKSB7XG4gICAgICAgIGNvbXBvbmVudHMucHVzaCguLi5yZXN1bHQubGF5b3V0LmNvbXBvbmVudHMpO1xuICAgICAgICBkZWxldGUgcmVzdWx0LmxheW91dC5jb21wb25lbnRzO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmFzc2lnbihsYXlvdXQsIHJlc3VsdC5sYXlvdXQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gVXNlIG9wdGltaXplZCBwYXJhbWV0ZXIgZXh0cmFjdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIGNyZWF0b3IsXG4gICAgICBuYW1lLFxuICAgICAgb3B0aW9uczogaXRlbU9wdGlvbnMsXG4gICAgICBjb25zdW1lZCxcbiAgICB9ID0gZXh0cmFjdFBhcmFtZXRlcnMoc2NoZW1hLCBpLCBkZWZhdWx0Q3JlYXRvcik7XG5cbiAgICBpZiAoIWNyZWF0b3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIlNraXBwaW5nIHVuc3VwcG9ydGVkIGl0ZW0gdHlwZTpcIiwgaXRlbSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IHRvIGRpdiBmb3IgY3JlYXRlRWxlbWVudFxuICAgIGlmIChjcmVhdG9yID09PSBjcmVhdGVFbGVtZW50ICYmICEoXCJ0YWdcIiBpbiBpdGVtT3B0aW9ucykpIHtcbiAgICAgIGl0ZW1PcHRpb25zLnRhZyA9IFwiZGl2XCI7XG4gICAgfVxuXG4gICAgLy8gQWR2YW5jZSBpbmRleCBieSBjb25zdW1lZCBpdGVtcyBtaW51cyAxIChsb29wIGluY3JlbWVudCBoYW5kbGVzIHRoZSArMSlcbiAgICBpICs9IGNvbnN1bWVkIC0gMTtcblxuICAgIC8vIFByb2Nlc3Mgb3B0aW9ucyB3aXRoIHByZWZpeCAtIG9wdGltaXplZCBkZWNpc2lvbiBsb2dpY1xuICAgIGNvbnN0IHNob3VsZEFwcGx5UHJlZml4ID1cbiAgICAgIFwicHJlZml4XCIgaW4gaXRlbU9wdGlvbnMgPyBpdGVtT3B0aW9ucy5wcmVmaXggOiBvcHRpb25zLnByZWZpeCAhPT0gZmFsc2U7XG5cbiAgICAvLyBGYXN0IHBhdGg6IHByb2Nlc3Mgb25seSB3aGVuIG5lZWRlZFxuICAgIGNvbnN0IHByb2Nlc3NlZE9wdGlvbnMgPVxuICAgICAgc2hvdWxkQXBwbHlQcmVmaXggfHwgaXRlbU9wdGlvbnMucmF3Q2xhc3NcbiAgICAgICAgPyBwcm9jZXNzQ2xhc3NOYW1lcyhpdGVtT3B0aW9ucywgIXNob3VsZEFwcGx5UHJlZml4KVxuICAgICAgICA6IGl0ZW1PcHRpb25zOyAvLyBObyBjb3B5IG5lZWRlZCBpZiBubyBwcm9jZXNzaW5nXG5cbiAgICAvLyBBZGQgbmFtZSB0byBvcHRpb25zIGlmIG5lZWRlZFxuICAgIGlmIChcbiAgICAgIG5hbWUgJiZcbiAgICAgICEoXCJuYW1lXCIgaW4gcHJvY2Vzc2VkT3B0aW9ucykgJiZcbiAgICAgICEoY3JlYXRvciA9PT0gY3JlYXRlRWxlbWVudCB8fCAoY3JlYXRvciBhcyBhbnkpLmlzRWxlbWVudClcbiAgICApIHtcbiAgICAgIHByb2Nlc3NlZE9wdGlvbnMubmFtZSA9IG5hbWU7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGNvbXBvbmVudFxuICAgIGNvbXBvbmVudCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGNyZWF0b3IsIHByb2Nlc3NlZE9wdGlvbnMpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSBpc0NvbXBvbmVudChjb21wb25lbnQpID8gY29tcG9uZW50LmVsZW1lbnQgOiBjb21wb25lbnQ7XG5cbiAgICBpZiAobGV2ZWwgPT09IDEpIGxheW91dC5lbGVtZW50ID0gZWxlbWVudDtcbiAgICBpZiAobmFtZSkge1xuICAgICAgbGF5b3V0W25hbWVdID0gY29tcG9uZW50O1xuICAgICAgY29tcG9uZW50cy5wdXNoKFtuYW1lLCBjb21wb25lbnRdKTtcbiAgICB9XG5cbiAgICAvLyBBcHBlbmQgdG8gRE9NXG4gICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgaWYgKFwiaW5zZXJ0XCIgaW4gY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQuaW5zZXJ0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29tcG9uZW50Lmluc2VydChmcmFnbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgY29tcG9uZW50Ll9jb250YWluZXIgPSBwYXJlbnRFbGVtZW50O1xuICAgICAgICBpZiAoXG4gICAgICAgICAgXCJvbkluc2VydGVkXCIgaW4gY29tcG9uZW50ICYmXG4gICAgICAgICAgdHlwZW9mIGNvbXBvbmVudC5vbkluc2VydGVkID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29tcG9uZW50Lm9uSW5zZXJ0ZWQocGFyZW50RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBBcHBlbmQgZnJhZ21lbnQgdG8gcGFyZW50XG4gIGlmIChwYXJlbnRFbGVtZW50ICYmIGZyYWdtZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBpc0NvbXBvbmVudChwYXJlbnRFbGVtZW50KVxuICAgICAgPyBwYXJlbnRFbGVtZW50LmVsZW1lbnRcbiAgICAgIDogcGFyZW50RWxlbWVudDtcbiAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGZyYWdtZW50KTtcbiAgfVxuXG4gIC8vIFJlbGVhc2UgZnJhZ21lbnQgYmFjayB0byBwb29sXG4gIHJlbGVhc2VGcmFnbWVudChmcmFnbWVudCk7XG5cbiAgbGF5b3V0LmNvbXBvbmVudHMgPSBjb21wb25lbnRzO1xuICByZXR1cm4gY3JlYXRlTGF5b3V0UmVzdWx0KGxheW91dCk7XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIG9iamVjdC1iYXNlZCBzY2hlbWEgZGVmaW5pdGlvbnNcbiAqIFNpbXBsaWZpZWQgYW5kIG9wdGltaXplZCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NPYmplY3RTY2hlbWEoXG4gIHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB8IHN0cmluZyxcbiAgcGFyZW50RWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbCxcbiAgb3B0aW9uczogTGF5b3V0T3B0aW9ucyA9IHt9LFxuKTogTGF5b3V0UmVzdWx0IHtcbiAgY29uc3QgbGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGNvbnN0IGRlZmF1bHRDcmVhdG9yID0gb3B0aW9ucy5jcmVhdG9yIHx8IGNyZWF0ZUVsZW1lbnQ7XG5cbiAgLy8gSGFuZGxlIHJvb3QgZWxlbWVudCBjcmVhdGlvblxuICBpZiAoKHNjaGVtYSBhcyBhbnkpLmVsZW1lbnQgJiYgIXBhcmVudEVsZW1lbnQpIHtcbiAgICBjb25zdCBlbGVtZW50RGVmID0gKHNjaGVtYSBhcyBhbnkpLmVsZW1lbnQ7XG4gICAgY29uc3QgY3JlYXRlRWxlbWVudEZuID0gZWxlbWVudERlZi5jcmVhdG9yIHx8IGRlZmF1bHRDcmVhdG9yO1xuXG4gICAgY29uc3QgZWxlbWVudE9wdGlvbnMgPSBlbGVtZW50RGVmLm9wdGlvbnMgfHwge307XG4gICAgY29uc3QgcHJvY2Vzc2VkT3B0aW9ucyA9XG4gICAgICBvcHRpb25zLnByZWZpeCAhPT0gZmFsc2VcbiAgICAgICAgPyBwcm9jZXNzQ2xhc3NOYW1lcyhlbGVtZW50T3B0aW9ucylcbiAgICAgICAgOiB7IC4uLmVsZW1lbnRPcHRpb25zIH07XG5cbiAgICBjb25zdCByb290Q29tcG9uZW50ID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoXG4gICAgICBjcmVhdGVFbGVtZW50Rm4sXG4gICAgICBwcm9jZXNzZWRPcHRpb25zLFxuICAgICk7XG4gICAgbGF5b3V0LmVsZW1lbnQgPSByb290Q29tcG9uZW50O1xuICAgIGlmIChlbGVtZW50RGVmLm5hbWUpIGxheW91dFtlbGVtZW50RGVmLm5hbWVdID0gcm9vdENvbXBvbmVudDtcblxuICAgIC8vIFByb2Nlc3MgY2hpbGRyZW5cbiAgICBpZiAoZWxlbWVudERlZi5jaGlsZHJlbikge1xuICAgICAgY29uc3Qgcm9vdEVsZW1lbnQgPSBpc0NvbXBvbmVudChyb290Q29tcG9uZW50KVxuICAgICAgICA/IHJvb3RDb21wb25lbnQuZWxlbWVudFxuICAgICAgICA6IHJvb3RDb21wb25lbnQ7XG4gICAgICBjb25zdCBjaGlsZFJlc3VsdCA9IHByb2Nlc3NPYmplY3RTY2hlbWEoXG4gICAgICAgIGVsZW1lbnREZWYuY2hpbGRyZW4sXG4gICAgICAgIHJvb3RFbGVtZW50LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5hc3NpZ24obGF5b3V0LCBjaGlsZFJlc3VsdC5sYXlvdXQpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbiAgfVxuXG4gIC8vIFByb2Nlc3Mgbm9ybWFsIHNjaGVtYSBlbGVtZW50c1xuICBjb25zdCBmcmFnbWVudCA9IHBhcmVudEVsZW1lbnQgPyBjcmVhdGVGcmFnbWVudCgpIDogbnVsbDtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIGNvbnN0IGRlZiA9IChzY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XTtcbiAgICBpZiAoIWRlZikgY29udGludWU7XG5cbiAgICBjb25zdCBlbGVtZW50Q3JlYXRvciA9IGRlZi5jcmVhdG9yIHx8IGRlZmF1bHRDcmVhdG9yO1xuICAgIGNvbnN0IGVsZW1lbnRPcHRpb25zID0gZGVmLm9wdGlvbnMgfHwge307XG4gICAgY29uc3Qgc2hvdWxkQXBwbHlQcmVmaXggPVxuICAgICAgXCJwcmVmaXhcIiBpbiBlbGVtZW50T3B0aW9uc1xuICAgICAgICA/IGVsZW1lbnRPcHRpb25zLnByZWZpeFxuICAgICAgICA6IG9wdGlvbnMucHJlZml4ICE9PSBmYWxzZTtcbiAgICBjb25zdCBwcm9jZXNzZWRPcHRpb25zID0gc2hvdWxkQXBwbHlQcmVmaXhcbiAgICAgID8gcHJvY2Vzc0NsYXNzTmFtZXMoZWxlbWVudE9wdGlvbnMpXG4gICAgICA6IHsgLi4uZWxlbWVudE9wdGlvbnMgfTtcblxuICAgIGlmICghZGVmLm5hbWUgJiYga2V5ICE9PSBcImVsZW1lbnRcIikge1xuICAgICAgZGVmLm5hbWUgPSBrZXk7XG4gICAgfVxuXG4gICAgY29uc3QgY3JlYXRlZCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGVsZW1lbnRDcmVhdG9yLCBwcm9jZXNzZWRPcHRpb25zKTtcbiAgICBsYXlvdXRba2V5XSA9IGNyZWF0ZWQ7XG4gICAgaWYgKGRlZi5uYW1lICYmIGRlZi5uYW1lICE9PSBrZXkpIGxheW91dFtkZWYubmFtZV0gPSBjcmVhdGVkO1xuXG4gICAgY29uc3QgZWxlbWVudCA9IGlzQ29tcG9uZW50KGNyZWF0ZWQpID8gY3JlYXRlZC5lbGVtZW50IDogY3JlYXRlZDtcbiAgICBpZiAoZnJhZ21lbnQpIGZyYWdtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuXG4gICAgLy8gUHJvY2VzcyBjaGlsZHJlblxuICAgIGlmIChkZWYuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGNoaWxkUmVzdWx0ID0gcHJvY2Vzc09iamVjdFNjaGVtYShkZWYuY2hpbGRyZW4sIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgT2JqZWN0LmFzc2lnbihsYXlvdXQsIGNoaWxkUmVzdWx0LmxheW91dCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQXBwZW5kIHRvIHBhcmVudFxuICBpZiAocGFyZW50RWxlbWVudCAmJiBmcmFnbWVudCkge1xuICAgIGNvbnN0IHBhcmVudERvbSA9IGlzQ29tcG9uZW50KHBhcmVudEVsZW1lbnQpXG4gICAgICA/IHBhcmVudEVsZW1lbnQuZWxlbWVudFxuICAgICAgOiBwYXJlbnRFbGVtZW50O1xuICAgIHBhcmVudERvbS5hcHBlbmRDaGlsZChmcmFnbWVudCk7XG4gICAgcmVsZWFzZUZyYWdtZW50KGZyYWdtZW50KTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTEFZT1VUIFJFU1VMVCBDUkVBVElPTlxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEZsYXR0ZW5zIGEgbmVzdGVkIGxheW91dCBpbnRvIGEgc2ltcGxlIG9iamVjdCB3aXRoIGVsZW1lbnQgYW5kIGNvbXBvbmVudCByZWZlcmVuY2VzXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5MYXlvdXQobGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGNvbnN0IGZsYXR0ZW5lZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIGlmICghbGF5b3V0IHx8IHR5cGVvZiBsYXlvdXQgIT09IFwib2JqZWN0XCIpIHJldHVybiBmbGF0dGVuZWQ7XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gbGF5b3V0KSB7XG4gICAgY29uc3QgdmFsdWUgPSBsYXlvdXRba2V5XTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSAmJlxuICAgICAgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICh2YWx1ZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8XG4gICAgICAgICh0eXBlb2YgU1ZHRWxlbWVudCAhPT0gXCJ1bmRlZmluZWRcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHx8XG4gICAgICAgIGlzQ29tcG9uZW50KHZhbHVlKSlcbiAgICApIHtcbiAgICAgIGZsYXR0ZW5lZFtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZsYXR0ZW5lZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGF5b3V0IHJlc3VsdCBvYmplY3Qgd2l0aCB1dGlsaXR5IGZ1bmN0aW9uc1xuICovXG5mdW5jdGlvbiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogTGF5b3V0UmVzdWx0IHtcbiAgY29uc3QgZmxhdHRlbmVkQ29tcG9uZW50cyA9IGZsYXR0ZW5MYXlvdXQobGF5b3V0KTtcblxuICByZXR1cm4ge1xuICAgIGxheW91dCxcbiAgICBlbGVtZW50OiBsYXlvdXQuZWxlbWVudCxcbiAgICBjb21wb25lbnQ6IGZsYXR0ZW5lZENvbXBvbmVudHMsXG5cbiAgICBnZXQobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICAgIHJldHVybiBsYXlvdXRbbmFtZV0gPz8gbnVsbDtcbiAgICB9LFxuXG4gICAgZ2V0QWxsKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgcmV0dXJuIGZsYXR0ZW5lZENvbXBvbmVudHM7XG4gICAgfSxcblxuICAgIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAvLyBUcmFjayBkZXN0cm95ZWQgY29tcG9uZW50cyB0byBhdm9pZCBkb3VibGUtZGVzdHJveVxuICAgICAgY29uc3QgZGVzdHJveWVkID0gbmV3IFNldDxhbnk+KCk7XG5cbiAgICAgIC8vIEhlbHBlciB0byBzYWZlbHkgZGVzdHJveSBhIGNvbXBvbmVudFxuICAgICAgY29uc3QgZGVzdHJveUNvbXBvbmVudCA9IChjb21wb25lbnQ6IGFueSk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoIWNvbXBvbmVudCB8fCBkZXN0cm95ZWQuaGFzKGNvbXBvbmVudCkpIHJldHVybjtcblxuICAgICAgICAvLyBTa2lwIHBsYWluIEhUTUwgZWxlbWVudHMgYW5kIG5vbi1vYmplY3RzXG4gICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCB0eXBlb2YgY29tcG9uZW50ICE9PSBcIm9iamVjdFwiKVxuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGEgY29tcG9uZW50IHdpdGggZGVzdHJveSBtZXRob2RcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgZGVzdHJveWVkLmFkZChjb21wb25lbnQpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21wb25lbnQuZGVzdHJveSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBkZXN0cm95IGVycm9ycyAtIGNvbXBvbmVudCBtYXkgYWxyZWFkeSBiZSBjbGVhbmVkIHVwXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBGaXJzdCBkZXN0cm95IGNvbXBvbmVudHMgZnJvbSB0aGUgY29tcG9uZW50cyBhcnJheSAoaWYgcHJlc2VudClcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBhbGwgbmFtZWQgY29tcG9uZW50cyBhcmUgZGVzdHJveWVkIGV2ZW4gaWYgbmVzdGVkXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShsYXlvdXQuY29tcG9uZW50cykpIHtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgY29tcG9uZW50XSBvZiBsYXlvdXQuY29tcG9uZW50cykge1xuICAgICAgICAgIGRlc3Ryb3lDb21wb25lbnQoY29tcG9uZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGVuIGl0ZXJhdGUgb3ZlciBhbGwgbGF5b3V0IGtleXMgZm9yIGFueSBtaXNzZWQgY29tcG9uZW50c1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbGF5b3V0KSB7XG4gICAgICAgIGlmIChrZXkgPT09IFwiZWxlbWVudFwiIHx8IGtleSA9PT0gXCJjb21wb25lbnRzXCIpIGNvbnRpbnVlO1xuICAgICAgICBkZXN0cm95Q29tcG9uZW50KGxheW91dFtrZXldKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYXIgdGhlIGNvbXBvbmVudHMgYXJyYXlcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGxheW91dC5jb21wb25lbnRzKSkge1xuICAgICAgICBsYXlvdXQuY29tcG9uZW50cy5sZW5ndGggPSAwO1xuICAgICAgfVxuXG4gICAgICAvLyBSZW1vdmUgcm9vdCBlbGVtZW50IGZyb20gRE9NXG4gICAgICBpZiAobGF5b3V0LmVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGlzQ29tcG9uZW50KGxheW91dC5lbGVtZW50KVxuICAgICAgICAgID8gbGF5b3V0LmVsZW1lbnQuZWxlbWVudFxuICAgICAgICAgIDogbGF5b3V0LmVsZW1lbnQ7XG4gICAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDbGVhciByZWZlcmVuY2VzIHRvIGhlbHAgR0NcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGxheW91dCkge1xuICAgICAgICBkZWxldGUgbGF5b3V0W2tleV07XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVU5JRklFRCBFTlRSWSBQT0lOVFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsYXlvdXQgZnJvbSB2YXJpb3VzIHNjaGVtYSBmb3JtYXRzXG4gKiBVbmlmaWVkIHByb2Nlc3NvciBmb3IgYXJyYXlzLCBvYmplY3RzLCBKU1gsIGFuZCBIVE1MIHN0cmluZ3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxheW91dChcbiAgc2NoZW1hOiBhbnksXG4gIHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGwsXG4gIG9wdGlvbnM6IExheW91dE9wdGlvbnMgPSB7fSxcbik6IExheW91dFJlc3VsdCB7XG4gIC8vIEhhbmRsZSBmdW5jdGlvbiBzY2hlbWFzXG4gIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBzY2hlbWEgPSBzY2hlbWEoKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBIVE1MIHN0cmluZyBzY2hlbWFzXG4gIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gc2NoZW1hLnRyaW0oKTtcbiAgICBjb25zdCBmcmFnbWVudCA9IHRlbXBsYXRlLmNvbnRlbnQ7XG5cbiAgICBpZiAocGFyZW50RWxlbWVudCAmJiBmcmFnbWVudC5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IGxheW91dCA9IHsgZWxlbWVudDogZnJhZ21lbnQuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQgfTtcbiAgICByZXR1cm4gY3JlYXRlTGF5b3V0UmVzdWx0KGxheW91dCk7XG4gIH1cblxuICAvLyBIYW5kbGUgSlNYLWxpa2Ugc2NoZW1hcyAoYXJyYXkgd2l0aCBmdW5jdGlvbiwgc3RyaW5nLCBvYmplY3QgcGF0dGVybilcbiAgaWYgKFxuICAgIEFycmF5LmlzQXJyYXkoc2NoZW1hKSAmJlxuICAgIHNjaGVtYS5sZW5ndGggPj0gMyAmJlxuICAgIHR5cGVvZiBzY2hlbWFbMF0gPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHR5cGVvZiBzY2hlbWFbMV0gPT09IFwic3RyaW5nXCIgJiZcbiAgICBpc09iamVjdChzY2hlbWFbMl0pXG4gICkge1xuICAgIHJldHVybiBwcm9jZXNzQXJyYXlTY2hlbWEoc2NoZW1hLCBwYXJlbnRFbGVtZW50LCAwLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8vIFJvdXRlIHRvIGFwcHJvcHJpYXRlIHByb2Nlc3NvclxuICByZXR1cm4gQXJyYXkuaXNBcnJheShzY2hlbWEpXG4gICAgPyBwcm9jZXNzQXJyYXlTY2hlbWEoc2NoZW1hLCBwYXJlbnRFbGVtZW50LCAwLCBvcHRpb25zKVxuICAgIDogcHJvY2Vzc09iamVjdFNjaGVtYShzY2hlbWEsIHBhcmVudEVsZW1lbnQsIG9wdGlvbnMpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFWFBPUlRTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIENsZWFyIGZ1bmN0aW9ucyBmb3IgdGhlIHVuaWZpZWQgc3lzdGVtXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDbGFzc0NhY2hlKCk6IHZvaWQge1xuICBjbGFzc0NhY2hlLmNsZWFyKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckZyYWdtZW50UG9vbCgpOiB2b2lkIHtcbiAgZnJhZ21lbnRQb29sLmNsZWFyKCk7XG59XG5cbmV4cG9ydCB7XG4gIHByb2Nlc3NDbGFzc05hbWVzLFxuICBpc0NvbXBvbmVudCxcbiAgZmxhdHRlbkxheW91dCxcbiAgYXBwbHlMYXlvdXRDbGFzc2VzLFxuICBhcHBseUxheW91dEl0ZW1DbGFzc2VzLFxuICBjcmVhdGVMYXlvdXRSZXN1bHQsXG59O1xuIiwKICAgICIvKipcbiAqIEBtb2R1bGUgY29yZS9sYXlvdXQvY29uZmlnXG4gKiBAZGVzY3JpcHRpb24gRXNzZW50aWFsIGxheW91dCBjb25maWd1cmF0aW9uIHV0aWxpdGllc1xuICogQ29yZSBmdW5jdGlvbmFsaXR5IGlzIGludGVncmF0ZWQgaW50byBzY2hlbWEudHMgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICovXG5cbi8vIENvbmZpZ3VyYXRpb24gY29uc3RhbnRzXG5jb25zdCBQUkVGSVggPSBcIm10cmxcIjsgLy8gVE9ETzogTWFrZSB0aGlzIGNvbmZpZ3VyYWJsZSBmcm9tIG1haW4gbXRybCBjb25maWdcbmNvbnN0IFBSRUZJWF9XSVRIX0RBU0ggPSBgJHtQUkVGSVh9LWA7XG5cbi8qKlxuICogU2ltcGxlIERPTSB1dGlsaXRpZXNcbiAqL1xuZnVuY3Rpb24gYWRkQ2xhc3MoZWxlbWVudDogYW55LCBjbGFzc05hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZWxlbWVudCAmJiBjbGFzc05hbWUgJiYgZWxlbWVudC5jbGFzc0xpc3QpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNDbGFzcyhlbGVtZW50OiBhbnksIGNsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBlbGVtZW50ICYmIGVsZW1lbnQuY2xhc3NMaXN0ICYmIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGNsZWFuIHVwIHByZXZpb3VzIGxheW91dCBjbGFzc2VzIGZyb20gYW4gZWxlbWVudFxuICogVXNlZnVsIGZvciBkeW5hbWljIGNsYXNzIG1hbmFnZW1lbnRcbiAqXG4gKiBAcGFyYW0gZWxlbWVudCAtIEVsZW1lbnQgdG8gY2xlYW4gbGF5b3V0IGNsYXNzZXMgZnJvbVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYW51cExheW91dENsYXNzZXMoZWxlbWVudDogYW55KTogdm9pZCB7XG4gIGlmICghZWxlbWVudCB8fCAhZWxlbWVudC5jbGFzc0xpc3QpIHJldHVybjtcblxuICAvLyBHZXQgYWxsIGNsYXNzZXMgZnJvbSB0aGUgZWxlbWVudFxuICBjb25zdCBjbGFzc0xpc3QgPSBBcnJheS5mcm9tKGVsZW1lbnQuY2xhc3NMaXN0KSBhcyBzdHJpbmdbXTtcblxuICAvLyBGaW5kIGFuZCByZW1vdmUgbGF5b3V0LXJlbGF0ZWQgY2xhc3Nlc1xuICBjb25zdCBsYXlvdXRDbGFzc2VzID0gY2xhc3NMaXN0LmZpbHRlcihcbiAgICAoY2xzOiBzdHJpbmcpID0+XG4gICAgICBjbHMuc3RhcnRzV2l0aChgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tYCkgfHxcbiAgICAgIGNscy5pbmNsdWRlcyhgLSR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLWApXG4gICk7XG5cbiAgLy8gUmVtb3ZlIGVhY2ggbGF5b3V0IGNsYXNzXG4gIGxheW91dENsYXNzZXMuZm9yRWFjaCgoY2xzOiBzdHJpbmcpID0+IHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY2xzKTtcbiAgfSk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgbGF5b3V0IHR5cGUgZnJvbSBlbGVtZW50IGNsYXNzZXNcbiAqXG4gKiBAcGFyYW0gZWxlbWVudCAtIEVsZW1lbnQgdG8gY2hlY2tcbiAqIEByZXR1cm5zIExheW91dCB0eXBlIGlmIGZvdW5kLCBlbXB0eSBzdHJpbmcgb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXlvdXRUeXBlKGVsZW1lbnQ6IGFueSk6IHN0cmluZyB7XG4gIHJldHVybiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tc3RhY2tgKVxuICAgID8gXCJzdGFja1wiXG4gICAgOiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93YClcbiAgICA/IFwicm93XCJcbiAgICA6IGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1ncmlkYClcbiAgICA/IFwiZ3JpZFwiXG4gICAgOiBcIlwiO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGNvbmZpZ3VyZWQgcHJlZml4IGZvciB0aGUgbGF5b3V0IHN5c3RlbVxuICogQHJldHVybnMgQ3VycmVudCBwcmVmaXggd2l0aCBkYXNoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXlvdXRQcmVmaXgoKTogc3RyaW5nIHtcbiAgcmV0dXJuIFBSRUZJWF9XSVRIX0RBU0g7XG59XG5cbi8qKlxuICogU2V0cyBsYXlvdXQgY2xhc3NlcyBvbiBhbiBlbGVtZW50IGR5bmFtaWNhbGx5XG4gKiBVc2VmdWwgZm9yIHByb2dyYW1tYXRpYyBsYXlvdXQgdXBkYXRlc1xuICpcbiAqIEBwYXJhbSBlbGVtZW50IC0gVGFyZ2V0IGVsZW1lbnRcbiAqIEBwYXJhbSBsYXlvdXRUeXBlIC0gTGF5b3V0IHR5cGUgdG8gYXBwbHlcbiAqIEBwYXJhbSBjbGFzc2VzIC0gQWRkaXRpb25hbCBjbGFzc2VzIHRvIGFwcGx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRMYXlvdXRDbGFzc2VzKFxuICBlbGVtZW50OiBhbnksXG4gIGxheW91dFR5cGU6IHN0cmluZyxcbiAgY2xhc3Nlczogc3RyaW5nW10gPSBbXVxuKTogdm9pZCB7XG4gIGlmICghZWxlbWVudCB8fCAhbGF5b3V0VHlwZSkgcmV0dXJuO1xuXG4gIC8vIENsZWFuIHVwIGV4aXN0aW5nIGxheW91dCBjbGFzc2VzIGZpcnN0XG4gIGNsZWFudXBMYXlvdXRDbGFzc2VzKGVsZW1lbnQpO1xuXG4gIC8vIEFwcGx5IGJhc2UgbGF5b3V0IHR5cGVcbiAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLSR7bGF5b3V0VHlwZX1gKTtcblxuICAvLyBBcHBseSBhZGRpdGlvbmFsIGNsYXNzZXNcbiAgY2xhc3Nlcy5mb3JFYWNoKChjbHMpID0+IHtcbiAgICBpZiAoY2xzLnN0YXJ0c1dpdGgoXCJsYXlvdXQtLVwiKSB8fCBjbHMuc3RhcnRzV2l0aChcImxheW91dF9fXCIpKSB7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfSR7Y2xzfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBjbHMpO1xuICAgIH1cbiAgfSk7XG59XG4iLAogICAgIi8qKlxuICogQG1vZHVsZSBjb3JlL2xheW91dC9qc3hcbiAqIEBkZXNjcmlwdGlvbiBKU1gtbGlrZSBzeW50YXggc3VwcG9ydCBmb3IgbGF5b3V0IGNyZWF0aW9uXG4gKiBQcm92aWRlcyBhIHNpbXBsZSBoKCkgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGVsZW1lbnRzIHdpdGhvdXQgUmVhY3QgZGVwZW5kZW5jeVxuICovXG5cbmltcG9ydCB0eXBlIHsgTGF5b3V0UmVzdWx0IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUxheW91dCB9IGZyb20gXCIuL3NjaGVtYVwiO1xuXG4vKipcbiAqIEZyYWdtZW50IHN5bWJvbCBmb3IgSlNYIGZyYWdtZW50c1xuICovXG5leHBvcnQgY29uc3QgRnJhZ21lbnQgPSBTeW1ib2woXCJGcmFnbWVudFwiKTtcblxuLyoqXG4gKiBKU1gtbGlrZSBoeXBlcnNjcmlwdCBmdW5jdGlvblxuICogQ3JlYXRlcyBlbGVtZW50cyBpbiBhIFJlYWN0LWxpa2Ugc3ludGF4IHdpdGhvdXQgUmVhY3QgZGVwZW5kZW5jeVxuICpcbiAqIEBwYXJhbSB0YWcgLSBIVE1MIHRhZyBuYW1lLCBjb21wb25lbnQgZnVuY3Rpb24sIG9yIEZyYWdtZW50XG4gKiBAcGFyYW0gcHJvcHMgLSBFbGVtZW50IHByb3BlcnRpZXMgYW5kIGF0dHJpYnV0ZXNcbiAqIEBwYXJhbSBjaGlsZHJlbiAtIENoaWxkIGVsZW1lbnRzXG4gKiBAcmV0dXJucyBET00gZWxlbWVudCBvciBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGgoXG4gIHRhZzogc3RyaW5nIHwgRnVuY3Rpb24gfCB0eXBlb2YgRnJhZ21lbnQsXG4gIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwsXG4gIC4uLmNoaWxkcmVuOiBhbnlbXVxuKTogYW55IHtcbiAgLy8gSGFuZGxlIEZyYWdtZW50XG4gIGlmICh0YWcgPT09IEZyYWdtZW50KSB7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgIGlmIChjaGlsZCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPVxuICAgICAgICAgIHR5cGVvZiBjaGlsZCA9PT0gXCJzdHJpbmdcIiA/IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNoaWxkKSA6IGNoaWxkO1xuICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZnJhZ21lbnQ7XG4gIH1cblxuICAvLyBIYW5kbGUgc3RyaW5nIHRhZ3MgKEhUTUwgZWxlbWVudHMpXG4gIGlmICh0eXBlb2YgdGFnID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcblxuICAgIC8vIEFwcGx5IHByb3BzXG4gICAgaWYgKHByb3BzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9wcykpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJjbGFzc05hbWVcIiB8fCBrZXkgPT09IFwiY2xhc3NcIikge1xuICAgICAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5LnN0YXJ0c1dpdGgoXCJvblwiKSAmJiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIEV2ZW50IGhhbmRsZXJcbiAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBrZXkuc2xpY2UoMikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcInN0eWxlXCIgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgLy8gU3R5bGUgb2JqZWN0XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCIpIHtcbiAgICAgICAgICAvLyBIVE1MIGNvbnRlbnRcbiAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IHZhbHVlLl9faHRtbCB8fCBcIlwiO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBSZWd1bGFyIGF0dHJpYnV0ZVxuICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHBlbmQgY2hpbGRyZW5cbiAgICBjaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgaWYgKGNoaWxkICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjaGlsZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY2hpbGQpKTtcbiAgICAgICAgfSBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIE5vZGUpIHtcbiAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZyhjaGlsZCkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICAvLyBIYW5kbGUgY29tcG9uZW50IGZ1bmN0aW9uc1xuICBpZiAodHlwZW9mIHRhZyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc3QgYWxsUHJvcHMgPSBwcm9wcyB8fCB7fTtcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgYWxsUHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICB9XG4gICAgcmV0dXJuIHRhZyhhbGxQcm9wcyk7XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byBkaXZcbiAgcmV0dXJuIGgoXCJkaXZcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGF5b3V0IHVzaW5nIEpTWC1saWtlIHN5bnRheFxuICogUHJvdmlkZXMgYSBicmlkZ2UgYmV0d2VlbiBKU1ggYW5kIHRoZSBsYXlvdXQgc3lzdGVtXG4gKlxuICogQHBhcmFtIGpzeEVsZW1lbnQgLSBKU1ggZWxlbWVudCBjcmVhdGVkIHdpdGggaCgpXG4gKiBAcGFyYW0gcGFyZW50RWxlbWVudCAtIFBhcmVudCBlbGVtZW50IHRvIGF0dGFjaCB0b1xuICogQHJldHVybnMgTGF5b3V0IHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSnN4TGF5b3V0KFxuICBqc3hFbGVtZW50OiBhbnksXG4gIHBhcmVudEVsZW1lbnQ/OiBhbnlcbik6IExheW91dFJlc3VsdCB7XG4gIC8vIENvbnZlcnQgSlNYIGVsZW1lbnQgdG8gbGF5b3V0IHNjaGVtYVxuICBjb25zdCBzY2hlbWEgPSBqc3hFbGVtZW50O1xuXG4gIC8vIENyZWF0ZSBsYXlvdXQgdXNpbmcgdGhlIHN0YW5kYXJkIGNyZWF0ZUxheW91dCBmdW5jdGlvblxuICByZXR1cm4gY3JlYXRlTGF5b3V0KHNjaGVtYSwgcGFyZW50RWxlbWVudCk7XG59XG5cbi8qKlxuICogVXRpbGl0eSB0byBjcmVhdGUgYSBzaW1wbGUgY29tcG9uZW50IGZyb20gYSBmdW5jdGlvblxuICogVXNlZnVsIGZvciBjcmVhdGluZyByZXVzYWJsZSBKU1ggY29tcG9uZW50c1xuICpcbiAqIEBwYXJhbSBmbiAtIENvbXBvbmVudCBmdW5jdGlvblxuICogQHJldHVybnMgQ29tcG9uZW50IHRoYXQgY2FuIGJlIHVzZWQgaW4gSlNYXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb25lbnQoZm46IChwcm9wczogUmVjb3JkPHN0cmluZywgYW55PikgPT4gYW55KTogRnVuY3Rpb24ge1xuICByZXR1cm4gZnVuY3Rpb24gKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogYW55IHtcbiAgICByZXR1cm4gZm4ocHJvcHMgfHwge30pO1xuICB9O1xufVxuXG4vKipcbiAqIFV0aWxpdHkgdG8gcmVuZGVyIG11bHRpcGxlIEpTWCBlbGVtZW50c1xuICogVXNlZnVsIGZvciBjcmVhdGluZyBsaXN0cyBvciBjb2xsZWN0aW9uc1xuICpcbiAqIEBwYXJhbSBlbGVtZW50cyAtIEFycmF5IG9mIEpTWCBlbGVtZW50c1xuICogQHBhcmFtIHBhcmVudEVsZW1lbnQgLSBQYXJlbnQgZWxlbWVudCB0byBhdHRhY2ggdG9cbiAqIEByZXR1cm5zIEFycmF5IG9mIGxheW91dCByZXN1bHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJFbGVtZW50cyhcbiAgZWxlbWVudHM6IGFueVtdLFxuICBwYXJlbnRFbGVtZW50PzogYW55XG4pOiBMYXlvdXRSZXN1bHRbXSB7XG4gIHJldHVybiBlbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IGNyZWF0ZUpzeExheW91dChlbGVtZW50LCBwYXJlbnRFbGVtZW50KSk7XG59XG5cbi8qKlxuICogQ29tbW9uIEpTWCBlbGVtZW50IGNyZWF0b3JzIGZvciBjb252ZW5pZW5jZVxuICovXG5leHBvcnQgY29uc3QganN4ID0ge1xuICBkaXY6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwiZGl2XCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIHNwYW46IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwic3BhblwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBwOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcInBcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgYnV0dG9uOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcImJ1dHRvblwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBpbnB1dDogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gaChcImlucHV0XCIsIHByb3BzKSxcbiAgaW1nOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBoKFwiaW1nXCIsIHByb3BzKSxcbiAgYTogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJhXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIHVsOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcInVsXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGxpOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcImxpXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIHNlY3Rpb246IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwic2VjdGlvblwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBoZWFkZXI6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwiaGVhZGVyXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGZvb3RlcjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJmb290ZXJcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgbWFpbjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJtYWluXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGFydGljbGU6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwiYXJ0aWNsZVwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxufTtcbiIsCiAgICAiLyoqXG4gKiBWaWV3cG9ydCAtIENvcmUgdmlydHVhbCBzY3JvbGxpbmcgZW5naW5lXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBWaWV3cG9ydENvbmZpZyxcbiAgVmlld3BvcnRDb250ZXh0LFxuICBWaWV3cG9ydENvbXBvbmVudCxcbiAgSXRlbVJhbmdlLFxuICBWaWV3cG9ydEluZm8sXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBwaXBlIH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IHdpdGhCYXNlIH0gZnJvbSBcIi4vZmVhdHVyZXMvYmFzZVwiO1xuaW1wb3J0IHsgd2l0aFZpcnR1YWwgfSBmcm9tIFwiLi9mZWF0dXJlcy92aXJ0dWFsXCI7XG5pbXBvcnQgeyB3aXRoU2Nyb2xsaW5nIH0gZnJvbSBcIi4vZmVhdHVyZXMvc2Nyb2xsaW5nXCI7XG5pbXBvcnQgeyB3aXRoTW9tZW50dW0gfSBmcm9tIFwiLi9mZWF0dXJlcy9tb21lbnR1bVwiO1xuaW1wb3J0IHsgd2l0aFNjcm9sbGJhciB9IGZyb20gXCIuL2ZlYXR1cmVzL3Njcm9sbGJhclwiO1xuaW1wb3J0IHsgd2l0aENvbGxlY3Rpb24gfSBmcm9tIFwiLi9mZWF0dXJlcy9jb2xsZWN0aW9uXCI7XG5pbXBvcnQgeyB3aXRoUGxhY2Vob2xkZXJzIH0gZnJvbSBcIi4vZmVhdHVyZXMvcGxhY2Vob2xkZXJzXCI7XG5pbXBvcnQgeyB3aXRoUmVuZGVyaW5nIH0gZnJvbSBcIi4vZmVhdHVyZXMvcmVuZGVyaW5nXCI7XG5pbXBvcnQgeyB3aXRoRXZlbnRzIH0gZnJvbSBcIi4vZmVhdHVyZXMvZXZlbnRzXCI7XG5cbi8vIEludGVybmFsIHZpZXdwb3J0IHN0YXRlXG5pbnRlcmZhY2UgVmlld3BvcnRTdGF0ZSB7XG4gIHNjcm9sbFBvc2l0aW9uOiBudW1iZXI7XG4gIHRvdGFsSXRlbXM6IG51bWJlcjtcbiAgaXRlbVNpemU6IG51bWJlcjtcbiAgY29udGFpbmVyU2l6ZTogbnVtYmVyO1xuICB2aXJ0dWFsVG90YWxTaXplOiBudW1iZXI7XG4gIHZpc2libGVSYW5nZTogSXRlbVJhbmdlO1xuICBpdGVtc0NvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsO1xuICB2ZWxvY2l0eTogbnVtYmVyO1xuICBzY3JvbGxEaXJlY3Rpb246IFwiZm9yd2FyZFwiIHwgXCJiYWNrd2FyZFwiO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB2aWV3cG9ydC1lbmhhbmNlZCBjb21wb25lbnQgdXNpbmcgY29tcG9zaXRpb25cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gVmlld3BvcnQgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgRnVuY3Rpb24gdGhhdCBlbmhhbmNlcyBhIGNvbXBvbmVudCB3aXRoIHZpZXdwb3J0IGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgY29uc3QgY3JlYXRlVmlld3BvcnQgPSAoY29uZmlnOiBWaWV3cG9ydENvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dD4oY29tcG9uZW50OiBUKTogVCAmIFZpZXdwb3J0Q29tcG9uZW50ID0+IHtcbiAgICAvLyBUcmFjayBpZiB2aWV3cG9ydCBoYXMgYmVlbiBpbml0aWFsaXplZCB0byBwcmV2ZW50IG11bHRpcGxlIGluaXRpYWxpemF0aW9uc1xuICAgIGxldCBpc0luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgICAvLyBObyBub3JtYWxpemF0aW9uIG5lZWRlZCAtIHdlJ2xsIHVzZSB0aGUgbmVzdGVkIHN0cnVjdHVyZSBkaXJlY3RseVxuXG4gICAgLy8gQ3JlYXRlIHNoYXJlZCB2aWV3cG9ydCBzdGF0ZVxuICAgIGNvbnN0IHN0YXRlOiBWaWV3cG9ydFN0YXRlID0ge1xuICAgICAgc2Nyb2xsUG9zaXRpb246IDAsXG4gICAgICB0b3RhbEl0ZW1zOiBjb21wb25lbnQudG90YWxJdGVtcyB8fCAwLFxuICAgICAgaXRlbVNpemU6IGNvbmZpZy52aXJ0dWFsPy5pdGVtU2l6ZSB8fCA1MCxcbiAgICAgIGNvbnRhaW5lclNpemU6IDAsXG4gICAgICB2aXJ0dWFsVG90YWxTaXplOiAwLFxuICAgICAgdmlzaWJsZVJhbmdlOiB7IHN0YXJ0OiAwLCBlbmQ6IDAgfSxcbiAgICAgIGl0ZW1zQ29udGFpbmVyOiBudWxsLFxuICAgICAgdmVsb2NpdHk6IDAsXG4gICAgICBzY3JvbGxEaXJlY3Rpb246IFwiZm9yd2FyZFwiLFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgYmFzZSB2aWV3cG9ydCBBUElcbiAgICBjb25zdCB2aWV3cG9ydEFQSSA9IHtcbiAgICAgIC8vIENvcmUgQVBJXG4gICAgICBpbml0aWFsaXplOiAoKSA9PiB7XG4gICAgICAgIC8vIFByZXZlbnQgbXVsdGlwbGUgaW5pdGlhbGl6YXRpb25zXG4gICAgICAgIGlmIChpc0luaXRpYWxpemVkKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1ZpZXdwb3J0XSBJbml0aWFsaXppbmcgd2l0aCBzdGF0ZTpcIiwge1xuICAgICAgICAvLyAgIGVsZW1lbnQ6ICEhY29tcG9uZW50LmVsZW1lbnQsXG4gICAgICAgIC8vICAgdG90YWxJdGVtczogY29tcG9uZW50LnRvdGFsSXRlbXMsXG4gICAgICAgIC8vICAgaXRlbVNpemU6IGNvbmZpZy52aXJ0dWFsPy5pdGVtU2l6ZSxcbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBjb250YWluZXIgc2l6ZVxuICAgICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgICBzdGF0ZS5jb250YWluZXJTaXplID1cbiAgICAgICAgICAgIGNvbmZpZy5zY3JvbGxpbmc/Lm9yaWVudGF0aW9uID09PSBcImhvcml6b250YWxcIlxuICAgICAgICAgICAgICA/IGNvbXBvbmVudC5lbGVtZW50Lm9mZnNldFdpZHRoXG4gICAgICAgICAgICAgIDogY29tcG9uZW50LmVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJbVmlld3BvcnRdIENvbnRhaW5lciBzaXplOlwiLCBzdGF0ZS5jb250YWluZXJTaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBpbml0aWFsIHZpcnR1YWwgc2l6ZVxuICAgICAgICBzdGF0ZS52aXJ0dWFsVG90YWxTaXplID0gc3RhdGUudG90YWxJdGVtcyAqIHN0YXRlLml0ZW1TaXplO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBpbml0aWFsIHZpc2libGUgcmFuZ2VcbiAgICAgICAgc3RhdGUudmlzaWJsZVJhbmdlID0gY2FsY3VsYXRlVmlzaWJsZVJhbmdlKHN0YXRlLnNjcm9sbFBvc2l0aW9uKTtcblxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltWaWV3cG9ydF0gSW5pdGlhbCBzdGF0ZTpcIiwge1xuICAgICAgICAvLyAgIGNvbnRhaW5lclNpemU6IHN0YXRlLmNvbnRhaW5lclNpemUsXG4gICAgICAgIC8vICAgdmlydHVhbFRvdGFsU2l6ZTogc3RhdGUudmlydHVhbFRvdGFsU2l6ZSxcbiAgICAgICAgLy8gICB2aXNpYmxlUmFuZ2U6IHN0YXRlLnZpc2libGVSYW5nZSxcbiAgICAgICAgLy8gfSk7XG4gICAgICB9LFxuXG4gICAgICBkZXN0cm95OiAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFudXAgd2lsbCBiZSBoYW5kbGVkIGJ5IGZlYXR1cmVzXG4gICAgICB9LFxuXG4gICAgICB1cGRhdGVWaWV3cG9ydDogKCkgPT4ge1xuICAgICAgICAvLyBXaWxsIGJlIGltcGxlbWVudGVkIGJ5IHJlbmRlcmluZyBmZWF0dXJlXG4gICAgICB9LFxuXG4gICAgICAvLyBDaGVjayBpZiBhbHJlYWR5IGluaXRpYWxpemVkXG4gICAgICBpc0luaXRpYWxpemVkOiAoKSA9PiBpc0luaXRpYWxpemVkLFxuXG4gICAgICAvLyBSZXNldCBpbml0aWFsaXphdGlvbiBzdGF0ZSAoZm9yIHJlbG9hZCBmdW5jdGlvbmFsaXR5KVxuICAgICAgcmVzZXRJbml0aWFsaXphdGlvbjogKCkgPT4ge1xuICAgICAgICBpc0luaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICB9LFxuXG4gICAgICAvLyBBbGxvdyBmZWF0dXJlcyB0byBjaGVjayBpZiBpbml0IHNob3VsZCBwcm9jZWVkXG4gICAgICBfc2hvdWxkSW5pdDogKCkgPT4gIWlzSW5pdGlhbGl6ZWQsXG5cbiAgICAgIC8vIFNjcm9sbGluZyBBUEkgKHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBzY3JvbGxpbmcgZmVhdHVyZSlcbiAgICAgIHNjcm9sbFRvSW5kZXg6IChcbiAgICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgICAgYWxpZ25tZW50PzogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIsXG4gICAgICApID0+IHtcbiAgICAgICAgLy8gUGxhY2Vob2xkZXIgLSB3aWxsIGJlIGltcGxlbWVudGVkIGJ5IHNjcm9sbGluZyBmZWF0dXJlXG4gICAgICB9LFxuXG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uOiAocG9zaXRpb246IG51bWJlcikgPT4ge1xuICAgICAgICAvLyBXaWxsIGJlIGltcGxlbWVudGVkIGJ5IHNjcm9sbGluZyBmZWF0dXJlXG4gICAgICB9LFxuXG4gICAgICBnZXRTY3JvbGxQb3NpdGlvbjogKCkgPT4gc3RhdGUuc2Nyb2xsUG9zaXRpb24sXG5cbiAgICAgIC8vIEluZm8gQVBJXG4gICAgICBnZXRWaXNpYmxlUmFuZ2U6ICgpID0+IHN0YXRlLnZpc2libGVSYW5nZSxcblxuICAgICAgZ2V0Vmlld3BvcnRJbmZvOiAoKTogVmlld3BvcnRJbmZvID0+ICh7XG4gICAgICAgIGNvbnRhaW5lclNpemU6IHN0YXRlLmNvbnRhaW5lclNpemUsXG4gICAgICAgIHRvdGFsVmlydHVhbFNpemU6IHN0YXRlLnZpcnR1YWxUb3RhbFNpemUsXG4gICAgICAgIHZpc2libGVSYW5nZTogc3RhdGUudmlzaWJsZVJhbmdlLFxuICAgICAgICB2aXJ0dWFsU2Nyb2xsUG9zaXRpb246IHN0YXRlLnNjcm9sbFBvc2l0aW9uLFxuICAgICAgfSksXG5cbiAgICAgIC8vIFJlbmRlcmluZyBBUElcbiAgICAgIHJlbmRlckl0ZW1zOiAoKSA9PiB7XG4gICAgICAgIC8vIFdpbGwgYmUgaW1wbGVtZW50ZWQgYnkgcmVuZGVyaW5nIGZlYXR1cmVcbiAgICAgIH0sXG5cbiAgICAgIC8vIEludGVybmFsIHN0YXRlIChmb3IgZmVhdHVyZXMgdG8gYWNjZXNzKVxuICAgICAgc3RhdGUsXG4gICAgfTtcblxuICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjYWxjdWxhdGUgdmlzaWJsZSByYW5nZVxuICAgIGNvbnN0IGNhbGN1bGF0ZVZpc2libGVSYW5nZSA9IChzY3JvbGxQb3M6IG51bWJlcik6IEl0ZW1SYW5nZSA9PiB7XG4gICAgICBjb25zdCBpdGVtU2l6ZSA9IHN0YXRlLml0ZW1TaXplO1xuICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLmZsb29yKHNjcm9sbFBvcyAvIGl0ZW1TaXplKTtcbiAgICAgIGNvbnN0IHZpc2libGVDb3VudCA9IE1hdGguY2VpbChzdGF0ZS5jb250YWluZXJTaXplIC8gaXRlbVNpemUpO1xuICAgICAgY29uc3QgZW5kID0gTWF0aC5taW4oc3RhcnQgKyB2aXNpYmxlQ291bnQsIHN0YXRlLnRvdGFsSXRlbXMgLSAxKTtcblxuICAgICAgcmV0dXJuIHsgc3RhcnQ6IE1hdGgubWF4KDAsIHN0YXJ0KSwgZW5kOiBNYXRoLm1heCgwLCBlbmQpIH07XG4gICAgfTtcblxuICAgIC8vIEFkZCB2aWV3cG9ydCBBUEkgdG8gY29tcG9uZW50XG4gICAgY29uc3QgYmFzZUNvbXBvbmVudCA9IHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIHZpZXdwb3J0OiB2aWV3cG9ydEFQSSxcbiAgICB9O1xuXG4gICAgLy8gQnVpbGQgdGhlIGVuaGFuY2VtZW50IHBpcGVsaW5lXG4gICAgY29uc3QgZW5oYW5jZXJzOiBBcnJheTwoYzogYW55KSA9PiBhbnk+ID0gW107XG5cbiAgICAvLyBFdmVudHMgc3lzdGVtIChhbHdheXMgZmlyc3QgLSBwcm92aWRlcyBjb21tdW5pY2F0aW9uIGZvciBvdGhlciBmZWF0dXJlcylcbiAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgIHdpdGhFdmVudHMoe1xuICAgICAgICBkZWJ1ZzogY29uZmlnLmRlYnVnLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIEJhc2Ugc2V0dXAgKGNyZWF0ZXMgRE9NIHN0cnVjdHVyZSlcbiAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgIHdpdGhCYXNlKHtcbiAgICAgICAgY2xhc3NOYW1lOiBjb25maWcuY2xhc3NOYW1lLFxuICAgICAgICBvcmllbnRhdGlvbjogY29uZmlnLnNjcm9sbGluZz8ub3JpZW50YXRpb24sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gVmlydHVhbCBzY3JvbGxpbmcgKHJlcXVpcmVkIGZvciBtb3N0IGZlYXR1cmVzKVxuICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgd2l0aFZpcnR1YWwoe1xuICAgICAgICBpdGVtU2l6ZTogY29uZmlnLnZpcnR1YWw/Lml0ZW1TaXplLFxuICAgICAgICBvdmVyc2NhbjogY29uZmlnLnZpcnR1YWw/Lm92ZXJzY2FuLFxuICAgICAgICBvcmllbnRhdGlvbjogY29uZmlnLnNjcm9sbGluZz8ub3JpZW50YXRpb24sXG4gICAgICAgIGF1dG9EZXRlY3RJdGVtU2l6ZTogY29uZmlnLnZpcnR1YWw/LmF1dG9EZXRlY3RJdGVtU2l6ZSxcbiAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4OiAoY29uZmlnIGFzIGFueSkuaW5pdGlhbFNjcm9sbEluZGV4LFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIFNjcm9sbGluZyBiZWhhdmlvclxuICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgd2l0aFNjcm9sbGluZyh7XG4gICAgICAgIG9yaWVudGF0aW9uOiBjb25maWcuc2Nyb2xsaW5nPy5vcmllbnRhdGlvbixcbiAgICAgICAgc2Vuc2l0aXZpdHk6IGNvbmZpZy5zY3JvbGxpbmc/LnNlbnNpdGl2aXR5LFxuICAgICAgICBzbW9vdGhpbmc6IGNvbmZpZy5zY3JvbGxpbmc/LmFuaW1hdGlvbixcbiAgICAgICAgc3RvcE9uQ2xpY2s6IGNvbmZpZy5zY3JvbGxpbmc/LnN0b3BPbkNsaWNrLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIE1vbWVudHVtIHNjcm9sbGluZyAodG91Y2gvZHJhZyBzdXBwb3J0IGZvciBtb2JpbGUpXG4gICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICB3aXRoTW9tZW50dW0oe1xuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICBzdG9wT25DbGljazogY29uZmlnLnNjcm9sbGluZz8uc3RvcE9uQ2xpY2ssXG4gICAgICAgIGRlY2VsZXJhdGlvbjogY29uZmlnLnNjcm9sbGluZz8ubW9tZW50dW0/LmRlY2VsZXJhdGlvbixcbiAgICAgICAgbWluVmVsb2NpdHk6IGNvbmZpZy5zY3JvbGxpbmc/Lm1vbWVudHVtPy5taW5WZWxvY2l0eSxcbiAgICAgICAgbWluRHVyYXRpb246IGNvbmZpZy5zY3JvbGxpbmc/Lm1vbWVudHVtPy5tYXhEdXJhdGlvbixcbiAgICAgICAgbWluVmVsb2NpdHlUaHJlc2hvbGQ6IGNvbmZpZy5zY3JvbGxpbmc/Lm1vbWVudHVtPy52ZWxvY2l0eVRocmVzaG9sZCxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBTY3JvbGxiYXIgKG9wdGlvbmFsKVxuICAgIGlmIChjb25maWcuc2Nyb2xsYmFyPy5lbmFibGVkICE9PSBmYWxzZSkge1xuICAgICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICAgIHdpdGhTY3JvbGxiYXIoe1xuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgYXV0b0hpZGU6IGNvbmZpZy5zY3JvbGxiYXI/LmF1dG9IaWRlLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGNvbGxlY3Rpb24gaWYgY29uZmlndXJlZFxuICAgIGlmIChjb25maWcuY29sbGVjdGlvbj8uYWRhcHRlcikge1xuICAgICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICAgIHdpdGhDb2xsZWN0aW9uKHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiBjb25maWcuY29sbGVjdGlvbi5hZGFwdGVyLFxuICAgICAgICAgIHJhbmdlU2l6ZTogY29uZmlnLnBhZ2luYXRpb24/LmxpbWl0LFxuICAgICAgICAgIHN0cmF0ZWd5OiBjb25maWcucGFnaW5hdGlvbj8uc3RyYXRlZ3kgYXNcbiAgICAgICAgICAgIHwgXCJvZmZzZXRcIlxuICAgICAgICAgICAgfCBcInBhZ2VcIlxuICAgICAgICAgICAgfCBcImN1cnNvclwiXG4gICAgICAgICAgICB8IHVuZGVmaW5lZCxcbiAgICAgICAgICB0cmFuc2Zvcm06IGNvbmZpZy5jb2xsZWN0aW9uPy50cmFuc2Zvcm0sXG4gICAgICAgICAgY2FuY2VsTG9hZFRocmVzaG9sZDogY29uZmlnLnBlcmZvcm1hbmNlPy5jYW5jZWxMb2FkVGhyZXNob2xkLFxuICAgICAgICAgIG1heENvbmN1cnJlbnRSZXF1ZXN0czogY29uZmlnLnBlcmZvcm1hbmNlPy5tYXhDb25jdXJyZW50UmVxdWVzdHMsXG4gICAgICAgICAgZW5hYmxlUmVxdWVzdFF1ZXVlOiBjb25maWcucGVyZm9ybWFuY2U/LmVuYWJsZVJlcXVlc3RRdWV1ZSAhPT0gZmFsc2UsXG4gICAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4OiAoY29uZmlnIGFzIGFueSkuaW5pdGlhbFNjcm9sbEluZGV4LFxuICAgICAgICAgIHNlbGVjdElkOiAoY29uZmlnIGFzIGFueSkuc2VsZWN0SWQsXG4gICAgICAgICAgYXV0b0xvYWQ6IChjb25maWcgYXMgYW55KS5hdXRvTG9hZCAhPT0gZmFsc2UsXG4gICAgICAgICAgYXV0b1NlbGVjdEZpcnN0OiAoY29uZmlnIGFzIGFueSkuYXV0b1NlbGVjdEZpcnN0LFxuICAgICAgICAgIG1heENhY2hlZEl0ZW1zOiBjb25maWcuY2FjaGU/Lm1heEl0ZW1zLFxuICAgICAgICAgIGV2aWN0aW9uQnVmZmVyOiBjb25maWcuY2FjaGU/LmV2aWN0aW9uQnVmZmVyLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUGxhY2Vob2xkZXJzIChvcHRpb25hbCwgcmVxdWlyZXMgY29sbGVjdGlvbilcbiAgICBpZiAoY29uZmlnLmNvbGxlY3Rpb24/LmFkYXB0ZXIgJiYgY29uZmlnLnBsYWNlaG9sZGVycz8uZW5hYmxlZCAhPT0gZmFsc2UpIHtcbiAgICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgICB3aXRoUGxhY2Vob2xkZXJzKHtcbiAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgIGFuYWx5emVGaXJzdExvYWQ6IGNvbmZpZy5wbGFjZWhvbGRlcnM/LmFuYWx5emVGaXJzdExvYWQgPz8gdHJ1ZSxcbiAgICAgICAgICBtYXNrQ2hhcmFjdGVyOiBjb25maWcucGxhY2Vob2xkZXJzPy5tYXNrQ2hhcmFjdGVyLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUmVuZGVyaW5nIChhbHdheXMgbGFzdCB0byBoYXZlIGFjY2VzcyB0byBhbGwgZmVhdHVyZXMpXG4gICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICB3aXRoUmVuZGVyaW5nKHtcbiAgICAgICAgdGVtcGxhdGU6IGNvbmZpZy50ZW1wbGF0ZSxcbiAgICAgICAgb3ZlcnNjYW46IGNvbmZpZy52aXJ0dWFsPy5vdmVyc2NhbixcbiAgICAgICAgbWFpbnRhaW5Eb21PcmRlcjogY29uZmlnLnJlbmRlcmluZz8ubWFpbnRhaW5Eb21PcmRlcixcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBDb21wb3NlIGFsbCBlbmhhbmNlcnNcbiAgICBjb25zdCBlbmhhbmNlID0gcGlwZSguLi5lbmhhbmNlcnMpO1xuXG4gICAgLy8gQXBwbHkgZW5oYW5jZW1lbnRzXG4gICAgY29uc3QgZW5oYW5jZWQgPSBlbmhhbmNlKGJhc2VDb21wb25lbnQpO1xuXG4gICAgLy8gQXV0by1pbml0aWFsaXplIGlmIGVsZW1lbnQgaXMgcHJvdmlkZWRcbiAgICBpZiAoZW5oYW5jZWQuZWxlbWVudCkge1xuICAgICAgZW5oYW5jZWQudmlld3BvcnQuaW5pdGlhbGl6ZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlZCBhcyBUICYgVmlld3BvcnRDb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy91dGlscy50c1xuXG4vKipcbiAqIFNoYXJlZCB1dGlsaXRpZXMgZm9yIHZpZXdwb3J0IGZlYXR1cmVzXG4gKiBFbGltaW5hdGVzIGNvZGUgZHVwbGljYXRpb24gYWNyb3NzIGZlYXR1cmVzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogV3JhcHMgdmlld3BvcnQgaW5pdGlhbGl6YXRpb24gd2l0aCBmZWF0dXJlLXNwZWNpZmljIGxvZ2ljXG4gKiBFbGltaW5hdGVzIHRoZSByZXBlYXRlZCBpbml0aWFsaXphdGlvbiBob29rIHBhdHRlcm5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBJbml0aWFsaXplPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBWaWV3cG9ydENvbXBvbmVudD4oXG4gIGNvbXBvbmVudDogVCxcbiAgZmVhdHVyZUluaXQ6ICgpID0+IHZvaWQsXG4pOiB2b2lkIHtcbiAgY29uc3Qgb3JpZ2luYWxJbml0aWFsaXplID0gY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemU7XG4gIGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplID0gKCkgPT4ge1xuICAgIC8vIENoZWNrIGlmIGFscmVhZHkgaW5pdGlhbGl6ZWQgKHJldHVybnMgZmFsc2UgaWYgYWxyZWFkeSBkb25lKVxuICAgIGNvbnN0IHJlc3VsdCA9IG9yaWdpbmFsSW5pdGlhbGl6ZSgpO1xuICAgIC8vIE9ubHkgcnVuIGZlYXR1cmUgaW5pdCBpZiBiYXNlIGluaXQgYWN0dWFsbHkgcmFuIChkaWRuJ3QgcmV0dXJuIGZhbHNlKVxuICAgIGlmIChyZXN1bHQgIT09IGZhbHNlKSB7XG4gICAgICBmZWF0dXJlSW5pdCgpO1xuICAgIH1cbiAgICAvLyBQcm9wYWdhdGUgdGhlIHJlc3VsdCB0aHJvdWdoIHRoZSBjaGFpbiBzbyBvdXRlciB3cmFwcGVycyBrbm93IHRvIHNraXBcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG4vKipcbiAqIFdyYXBzIGNvbXBvbmVudCBkZXN0cm95IHdpdGggY2xlYW51cCBsb2dpY1xuICogRWxpbWluYXRlcyB0aGUgcmVwZWF0ZWQgZGVzdHJveSBob29rIHBhdHRlcm5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBEZXN0cm95PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgY29tcG9uZW50OiBULFxuICBjbGVhbnVwOiAoKSA9PiB2b2lkLFxuKTogdm9pZCB7XG4gIGlmIChcImRlc3Ryb3lcIiBpbiBjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQuZGVzdHJveTtcbiAgICAoY29tcG9uZW50IGFzIGFueSkuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgdmlld3BvcnQgc3RhdGUgd2l0aCBwcm9wZXIgdHlwaW5nXG4gKiBFbGltaW5hdGVzIHJlcGVhdGVkIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vmlld3BvcnRTdGF0ZShjb21wb25lbnQ6IFZpZXdwb3J0Q29tcG9uZW50KTogYW55IHtcbiAgcmV0dXJuIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gaXRlbSBpcyBhIHBsYWNlaG9sZGVyXG4gKiBFbGltaW5hdGVzIGR1cGxpY2F0ZWQgcGxhY2Vob2xkZXIgZGV0ZWN0aW9uIGxvZ2ljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BsYWNlaG9sZGVyKGl0ZW06IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGl0ZW0gJiZcbiAgICB0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIChpdGVtLl9wbGFjZWhvbGRlciA9PT0gdHJ1ZSB8fCBpdGVtW1wiX3BsYWNlaG9sZGVyXCJdID09PSB0cnVlKSAvLyBTdXBwb3J0IGJvdGggYWNjZXNzIHBhdHRlcm5zXG4gICk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJhbmdlIGtleSBmb3IgZGVkdXBsaWNhdGlvblxuICogVXNlZCBieSBtdWx0aXBsZSBmZWF0dXJlcyBmb3IgdHJhY2tpbmcgcmFuZ2VzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSYW5nZUtleShyYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZH1gO1xufVxuXG4vKipcbiAqIENsYW1wcyBhIHZhbHVlIGJldHdlZW4gbWluIGFuZCBtYXhcbiAqIFVzZWQgYnkgbXVsdGlwbGUgZmVhdHVyZXMgZm9yIGJvdW5kYXJ5IGNoZWNraW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFtcCh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihtYXgsIHZhbHVlKSk7XG59XG5cbi8qKlxuICogU3RvcmVzIGEgZnVuY3Rpb24gcmVmZXJlbmNlIG9uIHRoZSBjb21wb25lbnQgZm9yIGxhdGVyIGFjY2Vzc1xuICogRWxpbWluYXRlcyBwYXR0ZXJuIGxpa2UgKGNvbXBvbmVudCBhcyBhbnkpLl9mZWF0dXJlRnVuY3Rpb24gPSBmblxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RvcmVGZWF0dXJlRnVuY3Rpb248VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICBjb21wb25lbnQ6IFQsXG4gIG5hbWU6IHN0cmluZyxcbiAgZm46IEZ1bmN0aW9uLFxuKTogdm9pZCB7XG4gIChjb21wb25lbnQgYXMgYW55KVtuYW1lXSA9IGZuO1xufVxuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9iYXNlLnRzXG5cbi8qKlxuICogQmFzZSBWaWV3cG9ydCBGZWF0dXJlIC0gU2V0cyB1cCBjb3JlIHZpZXdwb3J0IHN0cnVjdHVyZVxuICogUHJvdmlkZXMgdGhlIGZvdW5kYXRpb24gZm9yIG90aGVyIHZpZXdwb3J0IGZlYXR1cmVzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyB3cmFwSW5pdGlhbGl6ZSwgZ2V0Vmlld3BvcnRTdGF0ZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZUNvbmZpZyB7XG4gIGNsYXNzTmFtZT86IHN0cmluZztcbiAgb3JpZW50YXRpb24/OiBcInZlcnRpY2FsXCIgfCBcImhvcml6b250YWxcIjtcbn1cblxuLyoqXG4gKiBCYXNlIGZlYXR1cmUgZm9yIHZpZXdwb3J0XG4gKiBTZXRzIHVwIHRoZSBET00gc3RydWN0dXJlIGFuZCBjb3JlIHN0eWxlc1xuICovXG5leHBvcnQgY29uc3Qgd2l0aEJhc2UgPSAoY29uZmlnOiBCYXNlQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHsgY2xhc3NOYW1lID0gXCJtdHJsLXZpZXdwb3J0XCIsIG9yaWVudGF0aW9uID0gXCJ2ZXJ0aWNhbFwiIH0gPSBjb25maWc7XG5cbiAgICAvLyBVc2UgdGhlIHNoYXJlZCB3cmFwcGVyIHV0aWxpdHlcbiAgICB3cmFwSW5pdGlhbGl6ZShjb21wb25lbnQsICgpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBjb21wb25lbnQuZWxlbWVudDtcbiAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuO1xuXG4gICAgICAvLyBDcmVhdGUgdmlld3BvcnQgc3RydWN0dXJlXG4gICAgICBsZXQgdmlld3BvcnRFbGVtZW50ID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBcIi5tdHJsLXZpZXdwb3J0XCJcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgIGlmICghdmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gYFxuICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgYDtcblxuICAgICAgICAvLyBTZXQgb3JpZW50YXRpb25cbiAgICAgICAgdmlld3BvcnRFbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtb3JpZW50YXRpb25cIiwgb3JpZW50YXRpb24pO1xuXG4gICAgICAgIC8vIENyZWF0ZSBpdGVtcyBjb250YWluZXJcbiAgICAgICAgY29uc3QgaXRlbXNDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBpdGVtc0NvbnRhaW5lci5jbGFzc05hbWUgPSBcIm10cmwtdmlld3BvcnQtaXRlbXNcIjtcbiAgICAgICAgaXRlbXNDb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGA7XG5cbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFwcGVuZENoaWxkKGl0ZW1zQ29udGFpbmVyKTtcbiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZCh2aWV3cG9ydEVsZW1lbnQpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB2aWV3cG9ydCBzdGF0ZSB3aXRoIGNvbnRhaW5lcnMgdXNpbmcgdXRpbGl0eVxuICAgICAgICBjb25zdCBzdGF0ZSA9IGdldFZpZXdwb3J0U3RhdGUoY29tcG9uZW50KTtcbiAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgc3RhdGUudmlld3BvcnRFbGVtZW50ID0gdmlld3BvcnRFbGVtZW50O1xuICAgICAgICAgIHN0YXRlLml0ZW1zQ29udGFpbmVyID0gaXRlbXNDb250YWluZXI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdG9yZSByZWZlcmVuY2VzIG9uIGNvbXBvbmVudFxuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkudmlld3BvcnRFbGVtZW50ID0gdmlld3BvcnRFbGVtZW50O1xuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuaXRlbXNDb250YWluZXIgPSBpdGVtc0NvbnRhaW5lcjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9jb25zdGFudHMudHNcblxuLyoqXG4gKiBWaWV3cG9ydCBDb25zdGFudHNcbiAqIENlbnRyYWxpemVkIGNvbnN0YW50cyBmb3IgYWxsIHZpZXdwb3J0IGZ1bmN0aW9uYWxpdHlcbiAqIENvbnNvbGlkYXRlZCBmcm9tIHZpZXdwb3J0LCB2aWV3cG9ydC9mZWF0dXJlcywgYW5kIGxpc3QtbWFuYWdlciBjb25zdGFudHNcbiAqL1xuXG5leHBvcnQgY29uc3QgVklFV1BPUlRfQ09OU1RBTlRTID0ge1xuICAvLyBWaXJ0dWFsIHNjcm9sbGluZyBkZWZhdWx0c1xuICBWSVJUVUFMX1NDUk9MTDoge1xuICAgIERFRkFVTFRfSVRFTV9TSVpFOiA0OCxcbiAgICBPVkVSU0NBTl9CVUZGRVI6IDIsXG4gICAgU0NST0xMX1NFTlNJVElWSVRZOiAwLjcsXG4gICAgTUFYX1ZJUlRVQUxfU0laRTogMTAwICogMTAwMCAqIDEwMDAsIC8vIDEwME0gcGl4ZWxzIC0gbW9kZXJuIGJyb3dzZXJzIGNhbiBoYW5kbGUgdGhpc1xuICAgIEFVVE9fREVURUNUX0lURU1fU0laRTogdHJ1ZSwgLy8gRW5hYmxlIGF1dG9tYXRpYyBpdGVtIHNpemUgZGV0ZWN0aW9uXG4gIH0sXG5cbiAgLy8gU2Nyb2xsaW5nIHNldHRpbmdzXG4gIFNDUk9MTElORzoge1xuICAgIE9WRVJTQ0FOOiAxLCAvLyBGcm9tIGZlYXR1cmVzL2NvbnN0YW50c1xuICB9LFxuXG4gIC8vIFJlbmRlcmluZyBzZXR0aW5nc1xuICBSRU5ERVJJTkc6IHtcbiAgICAvLyBFbGVtZW50IHJlY3ljbGluZ1xuICAgIERFRkFVTFRfTUFYX1BPT0xfU0laRTogMTAwLFxuICAgIENMQVNTRVM6IHtcbiAgICAgIElURU06IFwidmlld3BvcnQtaXRlbVwiLFxuICAgIH0sXG4gIH0sXG5cbiAgLy8gTG9hZGluZyBzZXR0aW5nc1xuICBMT0FESU5HOiB7XG4gICAgQ0FOQ0VMX1RIUkVTSE9MRDogMjUsIC8vIHB4L21zIC0gdmVsb2NpdHkgYWJvdmUgd2hpY2ggbG9hZHMgY2FuY2VsXG4gICAgTUFYX0NPTkNVUlJFTlRfUkVRVUVTVFM6IDEsIC8vIFBhcmFsbGVsIHJlcXVlc3RzIGFsbG93ZWRcbiAgICBERUZBVUxUX1JBTkdFX1NJWkU6IDIwLCAvLyBJdGVtcyBwZXIgcmVxdWVzdFxuICAgIERFQk9VTkNFX0xPQURJTkc6IDE1MCwgLy8gRGVib3VuY2UgZGVsYXkgKG1zKVxuICAgIE1JTl9SQU5HRV9TSVpFOiAxMCwgLy8gTWluaW11bSBpdGVtcyBwZXIgbG9hZFxuICAgIE1BWF9SQU5HRV9TSVpFOiAxMDAsIC8vIE1heGltdW0gaXRlbXMgcGVyIGxvYWRcbiAgICBSRVFVRVNUX1RJTUVPVVQ6IDUwMDAsIC8vIFJlcXVlc3QgdGltZW91dCAobXMpXG4gICAgUkVUUllfQVRURU1QVFM6IDIsIC8vIEZhaWxlZCByZXF1ZXN0IHJldHJpZXNcbiAgICBSRVRSWV9ERUxBWTogMTAwMCwgLy8gRGVsYXkgYmV0d2VlbiByZXRyaWVzIChtcylcbiAgfSxcblxuICAvLyBSZXF1ZXN0IHF1ZXVlIGNvbmZpZ3VyYXRpb24gKGZyb20gZmVhdHVyZXMvY29uc3RhbnRzKVxuICBSRVFVRVNUX1FVRVVFOiB7XG4gICAgRU5BQkxFRDogdHJ1ZSwgLy8gRW5hYmxlIHJlcXVlc3QgcXVldWluZ1xuICAgIE1BWF9RVUVVRV9TSVpFOiAxLCAvLyBNYXggcXVldWVkIHJlcXVlc3RzXG4gICAgTUFYX0FDVElWRV9SRVFVRVNUUzogMiwgLy8gTWF4IGNvbmN1cnJlbnQgYWN0aXZlIHJlcXVlc3RzXG4gIH0sXG5cbiAgLy8gUGxhY2Vob2xkZXIgc2V0dGluZ3NcbiAgUExBQ0VIT0xERVI6IHtcbiAgICBNQVNLX0NIQVJBQ1RFUjogXCJYXCIsIC8vIFVwZGF0ZWQgZnJvbSBsaXN0LW1hbmFnZXJcbiAgICBDTEFTUzogXCJ2aWV3cG9ydC1pdGVtLS1wbGFjZWhvbGRlclwiLFxuICAgIE1BWF9TQU1QTEVfU0laRTogMjAsXG4gICAgUExBQ0VIT0xERVJfRkxBRzogXCJfcGxhY2Vob2xkZXJcIixcbiAgICBSQU5ET01fTEVOR1RIX1ZBUklBTkNFOiB0cnVlLFxuICB9LFxuXG4gIC8vIFNwZWVkIHRyYWNraW5nIChmcm9tIGxpc3QtbWFuYWdlcilcbiAgU1BFRURfVFJBQ0tJTkc6IHtcbiAgICAvLyBWZWxvY2l0eSBjYWxjdWxhdGlvblxuICAgIERFQ0VMRVJBVElPTl9GQUNUT1I6IDAuODUsIC8vIHZlbG9jaXR5IGRlY2F5IHBlciBmcmFtZVxuICB9LFxuXG4gIC8vIE1vbWVudHVtIHNldHRpbmdzXG4gIE1PTUVOVFVNOiB7XG4gICAgRU5BQkxFRDogZmFsc2UsIC8vIEVuYWJsZSBtb21lbnR1bSBieSBkZWZhdWx0XG4gICAgREVDRUxFUkFUSU9OX0ZBQ1RPUjogMC45NSwgLy8gSG93IHF1aWNrbHkgdmVsb2NpdHkgZGVjcmVhc2VzIHBlciBmcmFtZSAoaGlnaGVyID0gbG9uZ2VyIGNvYXN0KVxuICAgIE1JTl9WRUxPQ0lUWTogMC4xLCAvLyBNaW5pbXVtIHZlbG9jaXR5IGJlZm9yZSBzdG9wcGluZyAocHgvbXMpXG4gICAgTUlOX0RVUkFUSU9OOiA3NTAsIC8vIE1heGltdW0gZ2VzdHVyZSBkdXJhdGlvbiB0byB0cmlnZ2VyIG1vbWVudHVtIChtcylcbiAgICBNSU5fVkVMT0NJVFlfVEhSRVNIT0xEOiAwLjQsIC8vIE1pbmltdW0gdmVsb2NpdHkgdG8gdHJpZ2dlciBtb21lbnR1bSAocHgvbXMpXG4gICAgRlJBTUVfVElNRTogMTYsIC8vIEFzc3VtZWQgZnJhbWUgdGltZSBmb3IgY2FsY3VsYXRpb25zIChtcylcbiAgfSxcblxuICAvLyBJbml0aWFsIGxvYWQgY29uZmlndXJhdGlvbiAoZnJvbSBsaXN0LW1hbmFnZXIpXG4gIElOSVRJQUxfTE9BRDoge1xuICAgIFNUUkFURUdZOiBcInBsYWNlaG9sZGVyc1wiLCAvLyBcInBsYWNlaG9sZGVyc1wiIHwgXCJkaXJlY3RcIiB8IFwicHJvZ3Jlc3NpdmVcIlxuICAgIFZJRVdQT1JUX01VTFRJUExJRVI6IDEuNSwgLy8gbG9hZCAxLjV4IHZpZXdwb3J0IGNhcGFjaXR5XG4gICAgTUlOX0lURU1TOiAxMCxcbiAgICBNQVhfSVRFTVM6IDEwMCxcbiAgICBQTEFDRUhPTERFUl9DT1VOVDogMjAsIC8vIGRlZmF1bHQgcGxhY2Vob2xkZXIgY291bnRcbiAgICBTSE9XX0xPQURJTkdfU1RBVEU6IHRydWUsXG4gICAgTE9BRElOR19ERUxBWTogMTAwLCAvLyBtcyAtIGRlbGF5IGJlZm9yZSBzaG93aW5nIGxvYWRpbmcgc3RhdGVcbiAgfSxcblxuICAvLyBTZWxlY3Rpb24gc2V0dGluZ3NcbiAgU0VMRUNUSU9OOiB7XG4gICAgU0VMRUNURURfQ0xBU1M6IFwidmlld3BvcnQtaXRlbS0tc2VsZWN0ZWRcIixcbiAgfSxcblxuICAvLyBTY3JvbGxiYXIgc2V0dGluZ3MgKGZyb20gbGlzdC1tYW5hZ2VyKVxuICBTQ1JPTExCQVI6IHtcbiAgICAvLyBDU1MgY2xhc3Nlc1xuICAgIENMQVNTRVM6IHtcbiAgICAgIFNDUk9MTEJBUjogXCJ2aWV3cG9ydF9fc2Nyb2xsYmFyXCIsXG4gICAgICBTQ1JPTExCQVJfVFJBQ0s6IFwidmlld3BvcnRfX3Njcm9sbGJhci10cmFja1wiLFxuICAgICAgU0NST0xMQkFSX1RIVU1COiBcInZpZXdwb3J0X19zY3JvbGxiYXItdGh1bWJcIixcbiAgICAgIFNDUk9MTEJBUl9WSVNJQkxFOiBcInZpZXdwb3J0X19zY3JvbGxiYXItLXZpc2libGVcIixcbiAgICAgIFNDUk9MTEJBUl9EUkFHR0lORzogXCJ2aWV3cG9ydF9fc2Nyb2xsYmFyLS1kcmFnZ2luZ1wiLFxuICAgICAgU0NST0xMQkFSX1RIVU1CX0RSQUdHSU5HOiBcInZpZXdwb3J0X19zY3JvbGxiYXItdGh1bWItLWRyYWdnaW5nXCIsXG4gICAgfSxcbiAgfSxcblxuICAvLyBPcmllbnRhdGlvbiAoZnJvbSBsaXN0LW1hbmFnZXIpXG4gIE9SSUVOVEFUSU9OOiB7XG4gICAgREVGQVVMVF9PUklFTlRBVElPTjogXCJ2ZXJ0aWNhbFwiLFxuICAgIERFRkFVTFRfQ1JPU1NfQVhJU19BTElHTk1FTlQ6IFwic3RyZXRjaFwiLFxuICAgIFJFVkVSU0VfRElSRUNUSU9OOiBmYWxzZSxcbiAgfSxcblxuICBQQUdJTkFUSU9OOiB7XG4gICAgREVGQVVMVF9TVFJBVEVHWTogXCJvZmZzZXRcIiBhcyBcIm9mZnNldFwiIHwgXCJwYWdlXCIgfCBcImN1cnNvclwiLFxuICAgIERFRkFVTFRfTElNSVQ6IDIwLFxuICAgIFNUUkFURUdJRVM6IHtcbiAgICAgIFBBR0U6IFwicGFnZVwiIGFzIGNvbnN0LFxuICAgICAgT0ZGU0VUOiBcIm9mZnNldFwiIGFzIGNvbnN0LFxuICAgICAgQ1VSU09SOiBcImN1cnNvclwiIGFzIGNvbnN0LFxuICAgIH0sXG4gICAgQ1VSU09SX0NMRUFOVVBfSU5URVJWQUw6IDYwMDAwLCAvLyBDbGVhbiB1cCBvbGQgY3Vyc29ycyBldmVyeSBtaW51dGVcbiAgICBNQVhfQ1VSU09SX01BUF9TSVpFOiAxMDAwLCAvLyBNYXhpbXVtIG51bWJlciBvZiBjdXJzb3JzIHRvIGtlZXAgaW4gbWVtb3J5XG4gICAgLy8gQ3Vyc29yLXNwZWNpZmljIHZpcnR1YWwgc2l6aW5nXG4gICAgQ1VSU09SX1NDUk9MTF9NQVJHSU5fTVVMVElQTElFUjogMywgLy8gTXVsdGlwbHkgcmFuZ2VTaXplIGJ5IHRoaXMgZm9yIHNjcm9sbCBtYXJnaW5cbiAgICBDVVJTT1JfTUlOX1ZJUlRVQUxfU0laRV9NVUxUSVBMSUVSOiAzLCAvLyBNaW5pbXVtIHZpcnR1YWwgc2l6ZSBhcyBtdWx0aXBsaWVyIG9mIHJhbmdlU2l6ZVxuICB9LFxufTtcblxuLyoqXG4gKiBUeXBlIGZvciBvdmVycmlkaW5nIGNvbnN0YW50cyBhdCBydW50aW1lXG4gKi9cbmV4cG9ydCB0eXBlIFZpZXdwb3J0Q29uc3RhbnRzID0gdHlwZW9mIFZJRVdQT1JUX0NPTlNUQU5UUztcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gbWVyZ2UgdXNlciBjb25zdGFudHMgd2l0aCBkZWZhdWx0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VDb25zdGFudHMoXG4gIHVzZXJDb25zdGFudHM6IFBhcnRpYWw8Vmlld3BvcnRDb25zdGFudHM+ID0ge30sXG4pOiBWaWV3cG9ydENvbnN0YW50cyB7XG4gIHJldHVybiB7XG4gICAgLi4uVklFV1BPUlRfQ09OU1RBTlRTLFxuICAgIC4uLnVzZXJDb25zdGFudHMsXG4gIH07XG59XG4iLAogICAgIi8qKlxuICogVmlydHVhbCBGZWF0dXJlIC0gQ29yZSB2aXJ0dWFsIHNjcm9sbGluZyBjYWxjdWxhdGlvbnNcbiAqIEhhbmRsZXMgdmlzaWJsZSByYW5nZSBjYWxjdWxhdGlvbiBhbmQgdG90YWwgdmlydHVhbCBzaXplIG1hbmFnZW1lbnRcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHdyYXBJbml0aWFsaXplLCBnZXRWaWV3cG9ydFN0YXRlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBWaXJ0dWFsQ29uZmlnIHtcbiAgaXRlbVNpemU/OiBudW1iZXI7XG4gIG92ZXJzY2FuPzogbnVtYmVyO1xuICBvcmllbnRhdGlvbj86IFwidmVydGljYWxcIiB8IFwiaG9yaXpvbnRhbFwiO1xuICBhdXRvRGV0ZWN0SXRlbVNpemU/OiBib29sZWFuO1xuICBkZWJ1Zz86IGJvb2xlYW47XG4gIGluaXRpYWxTY3JvbGxJbmRleD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBWaXJ0dWFsIHNjcm9sbGluZyBmZWF0dXJlIGZvciB2aWV3cG9ydFxuICogSGFuZGxlcyB2aXNpYmxlIHJhbmdlIGNhbGN1bGF0aW9ucyB3aXRoIGNvbXByZXNzaW9uIGZvciBsYXJnZSBkYXRhc2V0c1xuICovXG5leHBvcnQgY29uc3Qgd2l0aFZpcnR1YWwgPSAoY29uZmlnOiBWaXJ0dWFsQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGl0ZW1TaXplLFxuICAgICAgb3ZlcnNjYW4gPSBWSUVXUE9SVF9DT05TVEFOVFMuVklSVFVBTF9TQ1JPTEwuT1ZFUlNDQU5fQlVGRkVSLFxuICAgICAgb3JpZW50YXRpb24gPSBcInZlcnRpY2FsXCIsXG4gICAgICBhdXRvRGV0ZWN0SXRlbVNpemUgPSBpdGVtU2l6ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLkFVVE9fREVURUNUX0lURU1fU0laRVxuICAgICAgICA6IGZhbHNlLFxuICAgICAgZGVidWcgPSBmYWxzZSxcbiAgICAgIGluaXRpYWxTY3JvbGxJbmRleCA9IDAsXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIFVzZSBwcm92aWRlZCBpdGVtU2l6ZSBvciBkZWZhdWx0LCBidXQgbWFyayBpZiB3ZSBzaG91bGQgYXV0by1kZXRlY3RcbiAgICBjb25zdCBpbml0aWFsSXRlbVNpemUgPVxuICAgICAgaXRlbVNpemUgfHwgVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLkRFRkFVTFRfSVRFTV9TSVpFO1xuXG4gICAgY29uc3QgTUFYX1ZJUlRVQUxfU0laRSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5WSVJUVUFMX1NDUk9MTC5NQVhfVklSVFVBTF9TSVpFO1xuICAgIGxldCB2aWV3cG9ydFN0YXRlOiBhbnk7XG4gICAgbGV0IGhhc0NhbGN1bGF0ZWRJdGVtU2l6ZSA9IGZhbHNlO1xuICAgIGxldCBoYXNSZWNhbGN1bGF0ZWRTY3JvbGxGb3JDb21wcmVzc2lvbiA9IGZhbHNlOyAvLyBUcmFjayBpZiB3ZSd2ZSByZWNhbGN1bGF0ZWQgc2Nyb2xsIHBvc2l0aW9uIGZvciBjb21wcmVzc2lvblxuXG4gICAgLy8gSW5pdGlhbGl6ZSB1c2luZyBzaGFyZWQgd3JhcHBlclxuICAgIHdyYXBJbml0aWFsaXplKGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgdmlld3BvcnRTdGF0ZSA9IGdldFZpZXdwb3J0U3RhdGUoY29tcG9uZW50KTtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkgcmV0dXJuO1xuXG4gICAgICBPYmplY3QuYXNzaWduKHZpZXdwb3J0U3RhdGUsIHtcbiAgICAgICAgaXRlbVNpemU6IGluaXRpYWxJdGVtU2l6ZSxcbiAgICAgICAgb3ZlcnNjYW4sXG4gICAgICAgIGNvbnRhaW5lclNpemU6XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS52aWV3cG9ydEVsZW1lbnQ/LltcbiAgICAgICAgICAgIG9yaWVudGF0aW9uID09PSBcImhvcml6b250YWxcIiA/IFwib2Zmc2V0V2lkdGhcIiA6IFwib2Zmc2V0SGVpZ2h0XCJcbiAgICAgICAgICBdIHx8IDYwMCxcbiAgICAgIH0pO1xuXG4gICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyk7XG5cbiAgICAgIC8vIElmIHdlIGhhdmUgYW4gaW5pdGlhbCBzY3JvbGwgaW5kZXgsIGNhbGN1bGF0ZSBpbml0aWFsIHNjcm9sbCBwb3NpdGlvblxuICAgICAgLy8gTm90ZTogV2Ugc3RvcmUgdGhlIGluaXRpYWxTY3JvbGxJbmRleCB0byB1c2UgZGlyZWN0bHkgaW4gcmFuZ2UgY2FsY3VsYXRpb25zXG4gICAgICAvLyBiZWNhdXNlIHNjcm9sbCBwb3NpdGlvbiBtYXkgYmUgY29tcHJlc3NlZCBmb3IgbGFyZ2UgbGlzdHNcbiAgICAgIGxldCBpbml0aWFsU2Nyb2xsUG9zaXRpb24gPSB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uIHx8IDA7XG5cbiAgICAgIGlmIChpbml0aWFsU2Nyb2xsSW5kZXggPiAwKSB7XG4gICAgICAgIC8vIFN0b3JlIHRoZSB0YXJnZXQgaW5kZXggZm9yIHVzZSBpbiByYW5nZSBjYWxjdWxhdGlvbnNcbiAgICAgICAgKHZpZXdwb3J0U3RhdGUgYXMgYW55KS50YXJnZXRTY3JvbGxJbmRleCA9IGluaXRpYWxTY3JvbGxJbmRleDtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgc2Nyb2xsIHBvc2l0aW9uIChtYXkgYmUgY29tcHJlc3NlZCBmb3IgbGFyZ2UgbGlzdHMpXG4gICAgICAgIGluaXRpYWxTY3JvbGxQb3NpdGlvbiA9XG4gICAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4ICogKHZpZXdwb3J0U3RhdGUuaXRlbVNpemUgfHwgaW5pdGlhbEl0ZW1TaXplKTtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IGluaXRpYWxTY3JvbGxQb3NpdGlvbjtcblxuICAgICAgICAvLyBOb3RpZnkgc2Nyb2xsaW5nIGZlYXR1cmUgdG8gc3luYyBpdHMgbG9jYWwgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgIC8vIFVzZSBzZXRUaW1lb3V0IHRvIGVuc3VyZSBzY3JvbGxpbmcgZmVhdHVyZSBoYXMgaW5pdGlhbGl6ZWRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnNjcm9sbC1wb3NpdGlvbi1zeW5jXCIsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBpbml0aWFsU2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgICBzb3VyY2U6IFwiaW5pdGlhbC1zY3JvbGwtaW5kZXhcIixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZVZpc2libGVSYW5nZShpbml0aWFsU2Nyb2xsUG9zaXRpb24pO1xuXG4gICAgICAvLyBFbnN1cmUgY29udGFpbmVyIHNpemUgaXMgbWVhc3VyZWQgYWZ0ZXIgRE9NIGlzIHJlYWR5XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICB1cGRhdGVDb250YWluZXJTaXplKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEhlbHBlciBmdW5jdGlvbnNcbiAgICBjb25zdCBnZXRDb21wcmVzc2lvblJhdGlvID0gKCk6IG51bWJlciA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGU/LnZpcnR1YWxUb3RhbFNpemUpIHJldHVybiAxO1xuICAgICAgY29uc3QgYWN0dWFsU2l6ZSA9IHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyAqIHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG4gICAgICByZXR1cm4gYWN0dWFsU2l6ZSA8PSBNQVhfVklSVFVBTF9TSVpFID8gMSA6IE1BWF9WSVJUVUFMX1NJWkUgLyBhY3R1YWxTaXplO1xuICAgIH07XG5cbiAgICBjb25zdCBsb2cgPSAobWVzc2FnZTogc3RyaW5nLCBkYXRhPzogYW55KSA9PiB7XG4gICAgICBpZiAoZGVidWcpIGNvbnNvbGUubG9nKGBbVmlydHVhbF0gJHttZXNzYWdlfWAsIGRhdGEpO1xuICAgIH07XG5cbiAgICAvLyBDYWxjdWxhdGUgdmlzaWJsZSByYW5nZVxuICAgIGNvbnN0IGNhbGN1bGF0ZVZpc2libGVSYW5nZSA9IChcbiAgICAgIHNjcm9sbFBvc2l0aW9uOiBudW1iZXIsXG4gICAgKTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9ID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbVmlydHVhbF0gTm8gdmlld3BvcnQgc3RhdGUsIHJldHVybmluZyBlbXB0eSByYW5nZVwiKTtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lclNpemUsIHRvdGFsSXRlbXMgfSA9IHZpZXdwb3J0U3RhdGU7XG5cbiAgICAgIC8vIEVhcmx5IHJldHVybnMgZm9yIGludmFsaWQgc3RhdGVzXG4gICAgICBpZiAoXG4gICAgICAgICFjb250YWluZXJTaXplIHx8XG4gICAgICAgIGNvbnRhaW5lclNpemUgPD0gMCB8fFxuICAgICAgICAhdG90YWxJdGVtcyB8fFxuICAgICAgICB0b3RhbEl0ZW1zIDw9IDBcbiAgICAgICkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIGluaXRpYWxTY3JvbGxJbmRleCwgdXNlIGl0IHRvIGNhbGN1bGF0ZSB0aGUgcmFuZ2VcbiAgICAgICAgLy8gZXZlbiB3aGVuIHRvdGFsSXRlbXMgaXMgMCAobm90IHlldCBsb2FkZWQgZnJvbSBBUEkpXG4gICAgICAgIGlmIChpbml0aWFsU2Nyb2xsSW5kZXggPiAwKSB7XG4gICAgICAgICAgY29uc3QgdmlzaWJsZUNvdW50ID0gTWF0aC5jZWlsKFxuICAgICAgICAgICAgKGNvbnRhaW5lclNpemUgfHwgNjAwKSAvXG4gICAgICAgICAgICAgICh2aWV3cG9ydFN0YXRlLml0ZW1TaXplIHx8IGluaXRpYWxJdGVtU2l6ZSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KDAsIGluaXRpYWxTY3JvbGxJbmRleCAtIG92ZXJzY2FuKTtcbiAgICAgICAgICBjb25zdCBlbmQgPSBpbml0aWFsU2Nyb2xsSW5kZXggKyB2aXNpYmxlQ291bnQgKyBvdmVyc2NhbjtcbiAgICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICAgIH1cbiAgICAgICAgbG9nKGBJbnZhbGlkIHN0YXRlOiBjb250YWluZXI9JHtjb250YWluZXJTaXplfSwgaXRlbXM9JHt0b3RhbEl0ZW1zfWApO1xuICAgICAgICByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZpcnR1YWxTaXplID1cbiAgICAgICAgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplIHx8IHRvdGFsSXRlbXMgKiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplO1xuICAgICAgY29uc3QgdmlzaWJsZUNvdW50ID0gTWF0aC5jZWlsKGNvbnRhaW5lclNpemUgLyB2aWV3cG9ydFN0YXRlLml0ZW1TaXplKTtcbiAgICAgIGNvbnN0IGNvbXByZXNzaW9uUmF0aW8gPSBnZXRDb21wcmVzc2lvblJhdGlvKCk7XG5cbiAgICAgIGxldCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcjtcblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIHRhcmdldCBzY3JvbGwgaW5kZXggKGZvciBpbml0aWFsU2Nyb2xsSW5kZXggd2l0aCBjb21wcmVzc2lvbilcbiAgICAgIGNvbnN0IHRhcmdldFNjcm9sbEluZGV4ID0gKHZpZXdwb3J0U3RhdGUgYXMgYW55KS50YXJnZXRTY3JvbGxJbmRleDtcblxuICAgICAgaWYgKGNvbXByZXNzaW9uUmF0aW8gPCAxKSB7XG4gICAgICAgIC8vIENvbXByZXNzZWQgc3BhY2UgY2FsY3VsYXRpb25cbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHRhcmdldFNjcm9sbEluZGV4LCB1c2UgaXQgZGlyZWN0bHkgaW5zdGVhZCBvZiBjYWxjdWxhdGluZyBmcm9tIHNjcm9sbCBwb3NpdGlvblxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgd2Ugc2hvdyB0aGUgY29ycmVjdCBpdGVtcyBldmVuIHdoZW4gdmlydHVhbCBzcGFjZSBpcyBjb21wcmVzc2VkXG4gICAgICAgIGlmICh0YXJnZXRTY3JvbGxJbmRleCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldFNjcm9sbEluZGV4ID4gMCkge1xuICAgICAgICAgIHN0YXJ0ID0gTWF0aC5tYXgoMCwgdGFyZ2V0U2Nyb2xsSW5kZXggLSBvdmVyc2Nhbik7XG4gICAgICAgICAgZW5kID0gTWF0aC5taW4oXG4gICAgICAgICAgICB0b3RhbEl0ZW1zIC0gMSxcbiAgICAgICAgICAgIHRhcmdldFNjcm9sbEluZGV4ICsgdmlzaWJsZUNvdW50ICsgb3ZlcnNjYW4sXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBDbGVhciB0YXJnZXRTY3JvbGxJbmRleCBhZnRlciBmaXJzdCB1c2Ugc28gbm9ybWFsIHNjcm9sbGluZyB3b3Jrc1xuICAgICAgICAgIGRlbGV0ZSAodmlld3BvcnRTdGF0ZSBhcyBhbnkpLnRhcmdldFNjcm9sbEluZGV4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsU2l6ZTtcbiAgICAgICAgICBjb25zdCBleGFjdEluZGV4ID0gc2Nyb2xsUmF0aW8gKiB0b3RhbEl0ZW1zO1xuICAgICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihleGFjdEluZGV4KTtcbiAgICAgICAgICBlbmQgPSBNYXRoLmNlaWwoZXhhY3RJbmRleCkgKyB2aXNpYmxlQ291bnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOZWFyLWJvdHRvbSBoYW5kbGluZ1xuICAgICAgICBjb25zdCBtYXhTY3JvbGwgPSB2aXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemU7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlRnJvbUJvdHRvbSA9IG1heFNjcm9sbCAtIHNjcm9sbFBvc2l0aW9uO1xuXG4gICAgICAgIGlmIChkaXN0YW5jZUZyb21Cb3R0b20gPD0gY29udGFpbmVyU2l6ZSAmJiBkaXN0YW5jZUZyb21Cb3R0b20gPj0gLTEpIHtcbiAgICAgICAgICBjb25zdCBpdGVtc0F0Qm90dG9tID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgIGNvbnRhaW5lclNpemUgLyB2aWV3cG9ydFN0YXRlLml0ZW1TaXplLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgZmlyc3RWaXNpYmxlQXRCb3R0b20gPSBNYXRoLm1heCgwLCB0b3RhbEl0ZW1zIC0gaXRlbXNBdEJvdHRvbSk7XG4gICAgICAgICAgY29uc3QgaW50ZXJwb2xhdGlvbiA9IE1hdGgubWF4KFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIE1hdGgubWluKDEsIDEgLSBkaXN0YW5jZUZyb21Cb3R0b20gLyBjb250YWluZXJTaXplKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKFxuICAgICAgICAgICAgc3RhcnQgKyAoZmlyc3RWaXNpYmxlQXRCb3R0b20gLSBzdGFydCkgKiBpbnRlcnBvbGF0aW9uLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZW5kID1cbiAgICAgICAgICAgIGRpc3RhbmNlRnJvbUJvdHRvbSA8PSAxXG4gICAgICAgICAgICAgID8gdG90YWxJdGVtcyAtIDFcbiAgICAgICAgICAgICAgOiBNYXRoLm1pbih0b3RhbEl0ZW1zIC0gMSwgc3RhcnQgKyB2aXNpYmxlQ291bnQgKyBvdmVyc2Nhbik7XG5cbiAgICAgICAgICBsb2coXCJOZWFyIGJvdHRvbSBjYWxjdWxhdGlvbjpcIiwge1xuICAgICAgICAgICAgZGlzdGFuY2VGcm9tQm90dG9tLFxuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbixcbiAgICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgICAgZW5kLFxuICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwbHkgb3ZlcnNjYW5cbiAgICAgICAgc3RhcnQgPSBNYXRoLm1heCgwLCBzdGFydCAtIG92ZXJzY2FuKTtcbiAgICAgICAgZW5kID0gTWF0aC5taW4odG90YWxJdGVtcyAtIDEsIGVuZCArIG92ZXJzY2FuKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpcmVjdCBjYWxjdWxhdGlvblxuICAgICAgICBzdGFydCA9IE1hdGgubWF4KFxuICAgICAgICAgIDAsXG4gICAgICAgICAgTWF0aC5mbG9vcihzY3JvbGxQb3NpdGlvbiAvIHZpZXdwb3J0U3RhdGUuaXRlbVNpemUpIC0gb3ZlcnNjYW4sXG4gICAgICAgICk7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRvdGFsSXRlbXMgLSAxLCBzdGFydCArIHZpc2libGVDb3VudCArIG92ZXJzY2FuICogMik7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIG91dHB1dFxuICAgICAgaWYgKGlzTmFOKHN0YXJ0KSB8fCBpc05hTihlbmQpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbVmlydHVhbF0gTmFOIGluIHJhbmdlIGNhbGN1bGF0aW9uOlwiLCB7XG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgY29udGFpbmVyU2l6ZSxcbiAgICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICAgIGl0ZW1TaXplOiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplLFxuICAgICAgICAgIGNvbXByZXNzaW9uUmF0aW8sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgICB9XG5cbiAgICAgIC8vIGxvZyhgUmFuZ2U6ICR7c3RhcnR9LSR7ZW5kfSAoc2Nyb2xsOiAke3Njcm9sbFBvc2l0aW9ufSlgKTtcblxuICAgICAgLy8gU3RyYXRlZ2ljIGxvZyBmb3IgbGFzdCByYW5nZVxuICAgICAgLy8gaWYgKGVuZCA+PSB0b3RhbEl0ZW1zIC0gMTApIHtcbiAgICAgIC8vICAgY29uc29sZS5sb2coXG4gICAgICAvLyAgICAgYFtWaXJ0dWFsXSBOZWFyIGVuZCByYW5nZTogJHtzdGFydH0tJHtlbmR9LCB0b3RhbEl0ZW1zPSR7dG90YWxJdGVtc30sIGxhc3RJdGVtUG9zPSR7XG4gICAgICAvLyAgICAgICBlbmQgKiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplXG4gICAgICAvLyAgICAgfXB4LCB2aXJ0dWFsU2l6ZT0ke3ZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZX1weGBcbiAgICAgIC8vICAgKTtcbiAgICAgIC8vIH1cblxuICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgIH07XG5cbiAgICAvLyBDYWxjdWxhdGUgYWN0dWFsIHZpc2libGUgcmFuZ2UgKHdpdGhvdXQgb3ZlcnNjYW4gYnVmZmVyKVxuICAgIGNvbnN0IGNhbGN1bGF0ZUFjdHVhbFZpc2libGVSYW5nZSA9IChzY3JvbGxQb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHJldHVybiB7IHN0YXJ0OiAwLCBlbmQ6IDAgfTtcblxuICAgICAgY29uc3QgeyBjb250YWluZXJTaXplLCB0b3RhbEl0ZW1zIH0gPSB2aWV3cG9ydFN0YXRlO1xuICAgICAgaWYgKCFjb250YWluZXJTaXplIHx8ICF0b3RhbEl0ZW1zKSByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG5cbiAgICAgIGNvbnN0IGl0ZW1TaXplID0gdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZTtcbiAgICAgIGNvbnN0IHZpc2libGVDb3VudCA9IE1hdGguY2VpbChjb250YWluZXJTaXplIC8gaXRlbVNpemUpO1xuICAgICAgY29uc3QgY29tcHJlc3Npb25SYXRpbyA9IHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZVxuICAgICAgICA/ICh0b3RhbEl0ZW1zICogaXRlbVNpemUpIC8gdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplXG4gICAgICAgIDogMTtcblxuICAgICAgbGV0IHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyO1xuXG4gICAgICBpZiAoY29tcHJlc3Npb25SYXRpbyA8IDEpIHtcbiAgICAgICAgLy8gQ29tcHJlc3NlZCBzcGFjZSAtIGNhbGN1bGF0ZSBiYXNlZCBvbiBzY3JvbGwgcmF0aW9cbiAgICAgICAgY29uc3QgdmlydHVhbFNpemUgPVxuICAgICAgICAgIHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSB8fCB0b3RhbEl0ZW1zICogaXRlbVNpemU7XG4gICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsU2l6ZTtcbiAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKHNjcm9sbFJhdGlvICogdG90YWxJdGVtcyk7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRvdGFsSXRlbXMgLSAxLCBzdGFydCArIHZpc2libGVDb3VudCAtIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGlyZWN0IGNhbGN1bGF0aW9uXG4gICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihzY3JvbGxQb3NpdGlvbiAvIGl0ZW1TaXplKTtcbiAgICAgICAgZW5kID0gTWF0aC5taW4odG90YWxJdGVtcyAtIDEsIHN0YXJ0ICsgdmlzaWJsZUNvdW50IC0gMSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVuc3VyZSB2YWxpZCByYW5nZVxuICAgICAgc3RhcnQgPSBNYXRoLm1heCgwLCBzdGFydCk7XG4gICAgICBlbmQgPSBNYXRoLm1heChzdGFydCwgZW5kKTtcblxuICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgIH07XG5cbiAgICAvLyBVcGRhdGUgZnVuY3Rpb25zXG4gICAgY29uc3QgdXBkYXRlVmlzaWJsZVJhbmdlID0gKHNjcm9sbFBvc2l0aW9uOiBudW1iZXIpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkgcmV0dXJuO1xuICAgICAgdmlld3BvcnRTdGF0ZS52aXNpYmxlUmFuZ2UgPSBjYWxjdWxhdGVWaXNpYmxlUmFuZ2Uoc2Nyb2xsUG9zaXRpb24pO1xuXG4gICAgICAvLyBERUJVRzogTG9nIHdobyBjYWxscyB1cGRhdGVWaXNpYmxlUmFuZ2Ugd2l0aCAwIHdoZW4gaXQgc2hvdWxkIGJlIG5vbi16ZXJvXG5cbiAgICAgIC8vIENhbGN1bGF0ZSBhY3R1YWwgdmlzaWJsZSByYW5nZSAod2l0aG91dCBvdmVyc2NhbikgZm9yIFVJIGRpc3BsYXlcbiAgICAgIGNvbnN0IGFjdHVhbFZpc2libGVSYW5nZSA9IGNhbGN1bGF0ZUFjdHVhbFZpc2libGVSYW5nZShzY3JvbGxQb3NpdGlvbik7XG5cbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgcmFuZ2U6IHZpZXdwb3J0U3RhdGUudmlzaWJsZVJhbmdlLFxuICAgICAgICB2aXNpYmxlUmFuZ2U6IGFjdHVhbFZpc2libGVSYW5nZSxcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHRvdGFsIHZpcnR1YWwgc2l6ZVxuICAgIGNvbnN0IHVwZGF0ZVRvdGFsVmlydHVhbFNpemUgPSAodG90YWxJdGVtczogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHJldHVybjtcblxuICAgICAgY29uc3Qgb2xkU2l6ZSA9IHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZTtcbiAgICAgIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyA9IHRvdGFsSXRlbXM7XG4gICAgICBjb25zdCBhY3R1YWxTaXplID0gdG90YWxJdGVtcyAqIHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG5cbiAgICAgIC8vIEdldCBwYWRkaW5nIGZyb20gdGhlIGl0ZW1zIGNvbnRhaW5lciBpZiBhdmFpbGFibGVcbiAgICAgIGxldCB0b3RhbFBhZGRpbmcgPSAwO1xuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUuaXRlbXNDb250YWluZXIpIHtcbiAgICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKFxuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuaXRlbXNDb250YWluZXIsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdUb3AgPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUucGFkZGluZ1RvcCkgfHwgMDtcbiAgICAgICAgY29uc3QgcGFkZGluZ0JvdHRvbSA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5wYWRkaW5nQm90dG9tKSB8fCAwO1xuICAgICAgICB0b3RhbFBhZGRpbmcgPSBwYWRkaW5nVG9wICsgcGFkZGluZ0JvdHRvbTtcbiAgICAgIH1cblxuICAgICAgLy8gSW5jbHVkZSBwYWRkaW5nIGluIHRoZSB2aXJ0dWFsIHNpemVcbiAgICAgIHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSA9IE1hdGgubWluKFxuICAgICAgICBhY3R1YWxTaXplICsgdG90YWxQYWRkaW5nLFxuICAgICAgICBNQVhfVklSVFVBTF9TSVpFLFxuICAgICAgKTtcblxuICAgICAgLy8gU3RyYXRlZ2ljIGxvZyBmb3IgZGVidWdnaW5nIGdhcCBpc3N1ZVxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbVmlydHVhbF0gVG90YWwgc2l6ZSB1cGRhdGU6IGl0ZW1zPSR7dG90YWxJdGVtc30sIGl0ZW1TaXplPSR7dmlld3BvcnRTdGF0ZS5pdGVtU2l6ZX1weCwgcGFkZGluZz0ke3RvdGFsUGFkZGluZ31weCwgdmlydHVhbFNpemU9JHt2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemV9cHggKHdhcyAke29sZFNpemV9cHgpYFxuICAgICAgLy8gKTtcblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnZpcnR1YWwtc2l6ZS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZTogdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplLFxuICAgICAgICB0b3RhbEl0ZW1zOiB0b3RhbEl0ZW1zLFxuICAgICAgICBjb21wcmVzc2lvblJhdGlvOiBnZXRDb21wcmVzc2lvblJhdGlvKCksXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIGNvbnRhaW5lciBzaXplXG4gICAgY29uc3QgdXBkYXRlQ29udGFpbmVyU2l6ZSA9ICgpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSB8fCAhdmlld3BvcnRTdGF0ZS52aWV3cG9ydEVsZW1lbnQpIHJldHVybjtcblxuICAgICAgY29uc3Qgc2l6ZSA9XG4gICAgICAgIHZpZXdwb3J0U3RhdGUudmlld3BvcnRFbGVtZW50W1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUub3JpZW50YXRpb24gPT09IFwiaG9yaXpvbnRhbFwiXG4gICAgICAgICAgICA/IFwib2Zmc2V0V2lkdGhcIlxuICAgICAgICAgICAgOiBcIm9mZnNldEhlaWdodFwiXG4gICAgICAgIF07XG5cbiAgICAgIC8vIExvZyB0aGUgYWN0dWFsIG1lYXN1cmVtZW50XG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtWaXJ0dWFsXSBDb250YWluZXIgc2l6ZSBtZWFzdXJlZDogJHtzaXplfXB4IGZyb20gdmlld3BvcnQgZWxlbWVudGBcbiAgICAgIC8vICk7XG5cbiAgICAgIGlmIChzaXplICE9PSB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUpIHtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplID0gc2l6ZTtcbiAgICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG4gICAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUodmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zKTsgLy8gQWxzbyB1cGRhdGUgdmlydHVhbCBzaXplXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpjb250YWluZXItc2l6ZS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgICBjb250YWluZXJTaXplOiBzaXplLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gT3ZlcnJpZGUgdmlld3BvcnQgbWV0aG9kc1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5nZXRWaXNpYmxlUmFuZ2UgPSAoKSA9PlxuICAgICAgdmlld3BvcnRTdGF0ZT8udmlzaWJsZVJhbmdlIHx8XG4gICAgICBjYWxjdWxhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZT8uc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG5cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnNjcm9sbFwiLCAoZGF0YTogYW55KSA9PlxuICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKGRhdGEucG9zaXRpb24pLFxuICAgICk7XG5cbiAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0Oml0ZW1zLWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKGRhdGEudG90YWxJdGVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUoZGF0YS50b3RhbEl0ZW1zKTtcbiAgICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGU/LnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTGlzdGVuIGZvciB0b3RhbCBpdGVtcyBjaGFuZ2VzIChpbXBvcnRhbnQgZm9yIGN1cnNvciBwYWdpbmF0aW9uKVxuICAgIC8vIE5vdGU6IHNldFRvdGFsSXRlbXMoKSB1cGRhdGVzIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyBCRUZPUkUgZW1pdHRpbmcgdGhpcyBldmVudCxcbiAgICAvLyBzbyB3ZSBjYW4ndCByZWx5IG9uIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyB0byBkZXRlY3QgdGhlIGZpcnN0IHRvdGFsLlxuICAgIC8vIEluc3RlYWQgd2UgdXNlIHRoZSBoYXNSZWNhbGN1bGF0ZWRTY3JvbGxGb3JDb21wcmVzc2lvbiBmbGFnLlxuICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICBpZiAoZGF0YS50b3RhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAgIC8vIEZJWDogV2hlbiB3ZSBmaXJzdCByZWNlaXZlIHRvdGFsSXRlbXMgd2l0aCBpbml0aWFsU2Nyb2xsSW5kZXggYW5kIGNvbXByZXNzaW9uLFxuICAgICAgLy8gcmVjYWxjdWxhdGUgc2Nyb2xsIHBvc2l0aW9uIHRvIGFjY291bnQgZm9yIGNvbXByZXNzaW9uLlxuICAgICAgLy8gV2l0aG91dCB0aGlzLCBpbml0aWFsU2Nyb2xsSW5kZXggY2FsY3VsYXRlcyBwb3NpdGlvbiBhcyBpbmRleCAqIGl0ZW1TaXplLFxuICAgICAgLy8gYnV0IHJlbmRlcmluZyB1c2VzIGNvbXByZXNzZWQgc3BhY2UsIGNhdXNpbmcgaXRlbXMgdG8gYXBwZWFyIG9mZi1zY3JlZW4uXG4gICAgICAvL1xuICAgICAgLy8gV2UgY2hlY2sgdGhpcyBCRUZPUkUgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSBiZWNhdXNlIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGVcbiAgICAgIC8vIHNjcm9sbCBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgbmV3IHRvdGFsLCBhbmQgdGhlIGZsYWcgZW5zdXJlcyB3ZSBvbmx5IGRvIHRoaXMgb25jZS5cbiAgICAgIGlmIChcbiAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4ID4gMCAmJlxuICAgICAgICAhaGFzUmVjYWxjdWxhdGVkU2Nyb2xsRm9yQ29tcHJlc3Npb24gJiZcbiAgICAgICAgZGF0YS50b3RhbCA+IDBcbiAgICAgICkge1xuICAgICAgICBjb25zdCBhY3R1YWxUb3RhbFNpemUgPSBkYXRhLnRvdGFsICogdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZTtcbiAgICAgICAgY29uc3QgaXNDb21wcmVzc2VkID0gYWN0dWFsVG90YWxTaXplID4gTUFYX1ZJUlRVQUxfU0laRTtcblxuICAgICAgICBpZiAoaXNDb21wcmVzc2VkKSB7XG4gICAgICAgICAgLy8gUmVjYWxjdWxhdGUgc2Nyb2xsIHBvc2l0aW9uIHVzaW5nIGNvbXByZXNzaW9uLWF3YXJlIGZvcm11bGFcbiAgICAgICAgICAvLyBTYW1lIGZvcm11bGEgdXNlZCBpbiBzY3JvbGxUb0luZGV4XG4gICAgICAgICAgY29uc3QgcmF0aW8gPSBpbml0aWFsU2Nyb2xsSW5kZXggLyBkYXRhLnRvdGFsO1xuICAgICAgICAgIGNvbnN0IGNvbXByZXNzZWRQb3NpdGlvbiA9IHJhdGlvICogTUFYX1ZJUlRVQUxfU0laRTtcblxuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPSBjb21wcmVzc2VkUG9zaXRpb247XG5cbiAgICAgICAgICAvLyBOb3RpZnkgc2Nyb2xsaW5nIGZlYXR1cmUgdG8gc3luYyBpdHMgbG9jYWwgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnNjcm9sbC1wb3NpdGlvbi1zeW5jXCIsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBjb21wcmVzc2VkUG9zaXRpb24sXG4gICAgICAgICAgICBzb3VyY2U6IFwiY29tcHJlc3Npb24tcmVjYWxjdWxhdGlvblwiLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgdGFyZ2V0U2Nyb2xsSW5kZXggc2luY2Ugd2UndmUgbm93IGNvcnJlY3RseSBjYWxjdWxhdGVkIHRoZSBzY3JvbGwgcG9zaXRpb25cbiAgICAgICAgICAvLyBUaGUgbm9ybWFsIGNvbXByZXNzZWQgc2Nyb2xsaW5nIGZvcm11bGEgd2lsbCBub3cgd29yayBjb3JyZWN0bHlcbiAgICAgICAgICBkZWxldGUgKHZpZXdwb3J0U3RhdGUgYXMgYW55KS50YXJnZXRTY3JvbGxJbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hcmsgYXMgZG9uZSBldmVuIGlmIG5vdCBjb21wcmVzc2VkIC0gd2Ugb25seSB3YW50IHRvIGRvIHRoaXMgY2hlY2sgb25jZVxuICAgICAgICBoYXNSZWNhbGN1bGF0ZWRTY3JvbGxGb3JDb21wcmVzc2lvbiA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUoZGF0YS50b3RhbCk7XG4gICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZT8uc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG5cbiAgICAgIC8vIFRyaWdnZXIgYSByZW5kZXIgdG8gdXBkYXRlIHRoZSB2aWV3XG4gICAgICBjb21wb25lbnQudmlld3BvcnQ/LnJlbmRlckl0ZW1zPy4oKTtcbiAgICB9KTtcblxuICAgIC8vIExpc3RlbiBmb3IgY29udGFpbmVyIHNpemUgY2hhbmdlcyB0byByZWNhbGN1bGF0ZSB2aXJ0dWFsIHNpemVcbiAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OmNvbnRhaW5lci1zaXplLWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUgJiYgZGF0YS5jb250YWluZXJTaXplICE9PSB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUpIHtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplID0gZGF0YS5jb250YWluZXJTaXplO1xuICAgICAgICAvLyBSZWNhbGN1bGF0ZSB2aXJ0dWFsIHNpemUgd2l0aCBuZXcgY29udGFpbmVyIHNpemVcbiAgICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSh2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMpO1xuICAgICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiB8fCAwKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjpyYW5nZS1sb2FkZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBkYXRhLnRvdGFsICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgZGF0YS50b3RhbCAhPT0gdmlld3BvcnRTdGF0ZT8udG90YWxJdGVtc1xuICAgICAgKSB7XG4gICAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUoZGF0YS50b3RhbCk7XG4gICAgICB9XG4gICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZT8uc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG4gICAgICBjb21wb25lbnQudmlld3BvcnQ/LnJlbmRlckl0ZW1zPy4oKTtcbiAgICB9KTtcblxuICAgIC8vIExpc3RlbiBmb3IgZmlyc3QgaXRlbXMgcmVuZGVyZWQgdG8gY2FsY3VsYXRlIGl0ZW0gc2l6ZSAoaWYgYXV0by1kZXRlY3Rpb24gaXMgZW5hYmxlZClcbiAgICBpZiAoYXV0b0RldGVjdEl0ZW1TaXplKSB7XG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0Oml0ZW1zLXJlbmRlcmVkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFoYXNDYWxjdWxhdGVkSXRlbVNpemUgJiZcbiAgICAgICAgICBkYXRhLmVsZW1lbnRzPy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgdmlld3BvcnRTdGF0ZVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBDYWxjdWxhdGUgYXZlcmFnZSBpdGVtIHNpemUgZnJvbSBmaXJzdCByZW5kZXJlZCBiYXRjaFxuICAgICAgICAgIGNvbnN0IHNpemVzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IHNpemVQcm9wZXJ0eSA9XG4gICAgICAgICAgICBvcmllbnRhdGlvbiA9PT0gXCJob3Jpem9udGFsXCIgPyBcIm9mZnNldFdpZHRoXCIgOiBcIm9mZnNldEhlaWdodFwiO1xuXG4gICAgICAgICAgZGF0YS5lbGVtZW50cy5mb3JFYWNoKChlbGVtZW50OiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IGVsZW1lbnRbc2l6ZVByb3BlcnR5XTtcbiAgICAgICAgICAgIGlmIChzaXplID4gMCkge1xuICAgICAgICAgICAgICBzaXplcy5wdXNoKHNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHNpemVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGF2Z1NpemUgPSBNYXRoLnJvdW5kKFxuICAgICAgICAgICAgICBzaXplcy5yZWR1Y2UoKHN1bSwgc2l6ZSkgPT4gc3VtICsgc2l6ZSwgMCkgLyBzaXplcy5sZW5ndGgsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNJdGVtU2l6ZSA9IHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG4gICAgICAgICAgICB2aWV3cG9ydFN0YXRlLml0ZW1TaXplID0gYXZnU2l6ZTtcblxuICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBpbml0aWFsU2Nyb2xsSW5kZXgsIHJlY2FsY3VsYXRlIHNjcm9sbCBwb3NpdGlvblxuICAgICAgICAgICAgLy8gYmFzZWQgb24gdGhlIG5ld2x5IGRldGVjdGVkIGl0ZW0gc2l6ZVxuICAgICAgICAgICAgaWYgKGluaXRpYWxTY3JvbGxJbmRleCA+IDAgJiYgYXZnU2l6ZSAhPT0gcHJldmlvdXNJdGVtU2l6ZSkge1xuICAgICAgICAgICAgICBjb25zdCBuZXdTY3JvbGxQb3NpdGlvbiA9IGluaXRpYWxTY3JvbGxJbmRleCAqIGF2Z1NpemU7XG4gICAgICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPSBuZXdTY3JvbGxQb3NpdGlvbjtcblxuICAgICAgICAgICAgICAvLyBOb3RpZnkgc2Nyb2xsaW5nIGZlYXR1cmUgdG8gc3luYyBpdHMgbG9jYWwgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpzY3JvbGwtcG9zaXRpb24tc3luY1wiLCB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IG5ld1Njcm9sbFBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogXCJpdGVtLXNpemUtZGV0ZWN0ZWRcIixcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlY2FsY3VsYXRlIGV2ZXJ5dGhpbmcgd2l0aCBuZXcgc2l6ZVxuICAgICAgICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSh2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMpO1xuICAgICAgICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG5cbiAgICAgICAgICAgIC8vIFJlLXJlbmRlciB0byBhZGp1c3QgcG9zaXRpb25zXG4gICAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQ/LnJlbmRlckl0ZW1zPy4oKTtcblxuICAgICAgICAgICAgLy8gRW1pdCBldmVudCBmb3Igc2l6ZSBjaGFuZ2VcbiAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDppdGVtLXNpemUtZGV0ZWN0ZWRcIiwge1xuICAgICAgICAgICAgICBwcmV2aW91c1NpemU6IGluaXRpYWxJdGVtU2l6ZSxcbiAgICAgICAgICAgICAgZGV0ZWN0ZWRTaXplOiBhdmdTaXplLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGhhc0NhbGN1bGF0ZWRJdGVtU2l6ZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBFeHBvc2UgdmlydHVhbCBBUElcbiAgICBjb25zdCBjb21wcmVzc2lvblJhdGlvID0gZ2V0Q29tcHJlc3Npb25SYXRpbygpO1xuICAgIChjb21wb25lbnQgYXMgYW55KS52aXJ0dWFsID0ge1xuICAgICAgY2FsY3VsYXRlVmlzaWJsZVJhbmdlLFxuICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSxcbiAgICAgIGdldFRvdGFsVmlydHVhbFNpemU6ICgpID0+IHZpZXdwb3J0U3RhdGU/LnZpcnR1YWxUb3RhbFNpemUgfHwgMCxcbiAgICAgIGdldENvbnRhaW5lclNpemU6ICgpID0+IHZpZXdwb3J0U3RhdGU/LmNvbnRhaW5lclNpemUgfHwgMCxcbiAgICAgIHVwZGF0ZUNvbnRhaW5lclNpemU6IChzaXplOiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUgPSBzaXplO1xuICAgICAgICAgIHVwZGF0ZVZpc2libGVSYW5nZSh2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZ2V0SXRlbVNpemU6ICgpID0+IHZpZXdwb3J0U3RhdGU/Lml0ZW1TaXplIHx8IGluaXRpYWxJdGVtU2l6ZSxcbiAgICAgIGNhbGN1bGF0ZUluZGV4RnJvbVBvc2l0aW9uOiAocG9zaXRpb246IG51bWJlcikgPT5cbiAgICAgICAgTWF0aC5mbG9vcihcbiAgICAgICAgICBwb3NpdGlvbiAvXG4gICAgICAgICAgICAoKHZpZXdwb3J0U3RhdGU/Lml0ZW1TaXplIHx8IGluaXRpYWxJdGVtU2l6ZSkgKiBjb21wcmVzc2lvblJhdGlvKSxcbiAgICAgICAgKSxcbiAgICAgIGNhbGN1bGF0ZVBvc2l0aW9uRm9ySW5kZXg6IChpbmRleDogbnVtYmVyKSA9PlxuICAgICAgICBpbmRleCAqICh2aWV3cG9ydFN0YXRlPy5pdGVtU2l6ZSB8fCBpbml0aWFsSXRlbVNpemUpICogY29tcHJlc3Npb25SYXRpbyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8qKlxuICogU2Nyb2xsaW5nIEZlYXR1cmUgLSBWaXJ0dWFsIHNjcm9sbGluZyB3aXRoIGludGVncmF0ZWQgdmVsb2NpdHkgdHJhY2tpbmdcbiAqIEhhbmRsZXMgd2hlZWwgZXZlbnRzLCB0b3VjaC9tb3VzZSBldmVudHMsIHNjcm9sbCBwb3NpdGlvbiBtYW5hZ2VtZW50LCB2ZWxvY2l0eSBtZWFzdXJlbWVudCwgYW5kIG1vbWVudHVtIHNjcm9sbGluZ1xuICovXG5cbmltcG9ydCB0eXBlIHsgVmlld3BvcnRDb250ZXh0LCBWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgd3JhcEluaXRpYWxpemUsIGdldFZpZXdwb3J0U3RhdGUsIGNsYW1wIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTY3JvbGxpbmdDb25maWcge1xuICBvcmllbnRhdGlvbj86IFwidmVydGljYWxcIiB8IFwiaG9yaXpvbnRhbFwiO1xuICBzZW5zaXRpdml0eT86IG51bWJlcjtcbiAgc21vb3RoaW5nPzogYm9vbGVhbjtcbiAgaWRsZVRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKiBTdG9wIHNjcm9sbGluZyB3aGVuIGNsaWNraW5nIG9uIHRoZSB2aWV3cG9ydCAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgc3RvcE9uQ2xpY2s/OiBib29sZWFuO1xufVxuXG4vLyBTcGVlZCB0cmFja2VyIGludGVyZmFjZVxuaW50ZXJmYWNlIFNwZWVkVHJhY2tlciB7XG4gIHZlbG9jaXR5OiBudW1iZXI7XG4gIGxhc3RQb3NpdGlvbjogbnVtYmVyO1xuICBsYXN0VGltZTogbnVtYmVyO1xuICBkaXJlY3Rpb246IFwiZm9yd2FyZFwiIHwgXCJiYWNrd2FyZFwiO1xuICBzYW1wbGVzOiBBcnJheTx7IHBvc2l0aW9uOiBudW1iZXI7IHRpbWU6IG51bWJlciB9Pjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHNwZWVkIHRyYWNrZXJcbiAqL1xuY29uc3QgY3JlYXRlU3BlZWRUcmFja2VyID0gKCk6IFNwZWVkVHJhY2tlciA9PiAoe1xuICB2ZWxvY2l0eTogMCxcbiAgbGFzdFBvc2l0aW9uOiAwLFxuICBsYXN0VGltZTogRGF0ZS5ub3coKSxcbiAgZGlyZWN0aW9uOiBcImZvcndhcmRcIixcbiAgc2FtcGxlczogW10sXG59KTtcblxuLyoqXG4gKiBVcGRhdGVzIHNwZWVkIHRyYWNrZXIgd2l0aCBuZXcgcG9zaXRpb25cbiAqL1xuY29uc3QgdXBkYXRlU3BlZWRUcmFja2VyID0gKFxuICB0cmFja2VyOiBTcGVlZFRyYWNrZXIsXG4gIG5ld1Bvc2l0aW9uOiBudW1iZXIsXG4gIHByZXZpb3VzUG9zaXRpb246IG51bWJlcixcbik6IFNwZWVkVHJhY2tlciA9PiB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IHRpbWVEZWx0YSA9IG5vdyAtIHRyYWNrZXIubGFzdFRpbWU7XG5cbiAgaWYgKHRpbWVEZWx0YSA9PT0gMCkgcmV0dXJuIHRyYWNrZXI7XG5cbiAgY29uc3QgcG9zaXRpb25EZWx0YSA9IG5ld1Bvc2l0aW9uIC0gcHJldmlvdXNQb3NpdGlvbjtcbiAgLy8gS2VlcCB2ZWxvY2l0eSBzaWduZWQgKHBvc2l0aXZlID0gZm9yd2FyZC9kb3duLCBuZWdhdGl2ZSA9IGJhY2t3YXJkL3VwKVxuICBjb25zdCBpbnN0YW50VmVsb2NpdHkgPSBwb3NpdGlvbkRlbHRhIC8gdGltZURlbHRhO1xuXG4gIC8vIEFkZCBuZXcgc2FtcGxlXG4gIGNvbnN0IHNhbXBsZXMgPSBbLi4udHJhY2tlci5zYW1wbGVzLCB7IHBvc2l0aW9uOiBuZXdQb3NpdGlvbiwgdGltZTogbm93IH1dO1xuXG4gIC8vIEtlZXAgb25seSByZWNlbnQgc2FtcGxlcyAobGFzdCAxMDBtcylcbiAgY29uc3QgcmVjZW50U2FtcGxlcyA9IHNhbXBsZXMuZmlsdGVyKChzKSA9PiBub3cgLSBzLnRpbWUgPCAxMDApO1xuXG4gIC8vIENhbGN1bGF0ZSBhdmVyYWdlIHZlbG9jaXR5IGZyb20gcmVjZW50IHNhbXBsZXMgKHByZXNlcnZpbmcgc2lnbi9kaXJlY3Rpb24pXG4gIGxldCBhdmdWZWxvY2l0eSA9IGluc3RhbnRWZWxvY2l0eTtcbiAgaWYgKHJlY2VudFNhbXBsZXMubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IG9sZGVzdFNhbXBsZSA9IHJlY2VudFNhbXBsZXNbMF07XG4gICAgY29uc3QgdG90YWxEaXN0YW5jZSA9IG5ld1Bvc2l0aW9uIC0gb2xkZXN0U2FtcGxlLnBvc2l0aW9uOyAvLyBTaWduZWQgZGlzdGFuY2VcbiAgICBjb25zdCB0b3RhbFRpbWUgPSBub3cgLSBvbGRlc3RTYW1wbGUudGltZTtcbiAgICBhdmdWZWxvY2l0eSA9IHRvdGFsVGltZSA+IDAgPyB0b3RhbERpc3RhbmNlIC8gdG90YWxUaW1lIDogaW5zdGFudFZlbG9jaXR5O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB2ZWxvY2l0eTogYXZnVmVsb2NpdHksXG4gICAgbGFzdFBvc2l0aW9uOiBuZXdQb3NpdGlvbixcbiAgICBsYXN0VGltZTogbm93LFxuICAgIGRpcmVjdGlvbjogcG9zaXRpb25EZWx0YSA+PSAwID8gXCJmb3J3YXJkXCIgOiBcImJhY2t3YXJkXCIsXG4gICAgc2FtcGxlczogcmVjZW50U2FtcGxlcyxcbiAgfTtcbn07XG5cbi8qKlxuICogU2Nyb2xsaW5nIGZlYXR1cmUgZm9yIHZpZXdwb3J0XG4gKiBIYW5kbGVzIHdoZWVsIGV2ZW50cywgdmVsb2NpdHkgdHJhY2tpbmcsIGFuZCBpZGxlIGRldGVjdGlvblxuICovXG5leHBvcnQgY29uc3Qgd2l0aFNjcm9sbGluZyA9IChjb25maWc6IFNjcm9sbGluZ0NvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50Pihjb21wb25lbnQ6IFQpOiBUID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBvcmllbnRhdGlvbiA9IFwidmVydGljYWxcIixcbiAgICAgIHNlbnNpdGl2aXR5ID0gVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLlNDUk9MTF9TRU5TSVRJVklUWSxcbiAgICAgIHNtb290aGluZyA9IGZhbHNlLFxuICAgICAgaWRsZVRpbWVvdXQgPSAxMDAsIC8vIERlZmF1bHQgaWRsZSB0aW1lb3V0IGluIG1zXG4gICAgICBzdG9wT25DbGljayA9IHRydWUsIC8vIFN0b3Agc2Nyb2xsaW5nIG9uIGNsaWNrIGJ5IGRlZmF1bHRcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gU3RhdGVcbiAgICBsZXQgc2Nyb2xsUG9zaXRpb24gPSAwO1xuICAgIGxldCB0b3RhbFZpcnR1YWxTaXplID0gMDtcbiAgICBsZXQgY29udGFpbmVyU2l6ZSA9IDA7XG4gICAgbGV0IGlzU2Nyb2xsaW5nID0gZmFsc2U7XG4gICAgbGV0IGlzU2Nyb2xsZWRGcm9tVG9wID0gZmFsc2U7IC8vIFRyYWNrIGlmIHNjcm9sbGVkIGF3YXkgZnJvbSB0b3BcbiAgICBsZXQgbGFzdFNjcm9sbFRpbWUgPSAwO1xuICAgIGxldCBzcGVlZFRyYWNrZXIgPSBjcmVhdGVTcGVlZFRyYWNrZXIoKTtcbiAgICBsZXQgaWRsZVRpbWVvdXRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGlkbGVDaGVja0ZyYW1lOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgbGFzdElkbGVDaGVja1Bvc2l0aW9uID0gMDtcbiAgICBsZXQgaGFzRW1pdHRlZElkbGUgPSBmYWxzZTsgLy8gVHJhY2sgaWYgd2UndmUgYWxyZWFkeSBlbWl0dGVkIGlkbGVcbiAgICBsZXQgYW5jaG9yUG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsOyAvLyBBbmNob3IgcG9zaXRpb24gdG8gbWFpbnRhaW4gb24gY2xpY2sgKGZvciBzdG9wT25DbGljaylcbiAgICBsZXQgYW5jaG9yVGltZSA9IDA7IC8vIFRpbWVzdGFtcCB3aGVuIGFuY2hvciB3YXMgc2V0XG4gICAgbGV0IGxhc3RXaGVlbFRpbWUgPSAwOyAvLyBUaW1lc3RhbXAgb2YgbGFzdCB3aGVlbCBldmVudCAoZm9yIGRldGVjdGluZyBnYXBzKVxuICAgIGxldCBhbmNob3JJbml0aWFsRGVsdGEgPSAwOyAvLyBJbml0aWFsIHdoZWVsIGRlbHRhIHdoZW4gYW5jaG9yIHdhcyBzZXQgKHRvIGRldGVjdCBkZWNheSlcbiAgICBsZXQgYW5jaG9yTGFzdERlbHRhID0gMDsgLy8gUHJldmlvdXMgd2hlZWwgZGVsdGEgKHRvIGRldGVjdCBpbmNyZWFzaW5nIGRlbHRhID0gbmV3IHNjcm9sbClcbiAgICBsZXQgYW5jaG9yTWluRGVsdGEgPSBJbmZpbml0eTsgLy8gTWluaW11bSBkZWx0YSBzZWVuIHNpbmNlIGFuY2hvciAodG8gZGV0ZWN0IHJlYWNjZWxlcmF0aW9uKVxuICAgIGxldCBjb25zZWN1dGl2ZUluY3JlYXNlcyA9IDA7IC8vIENvdW50IG9mIGNvbnNlY3V0aXZlIGRlbHRhIGluY3JlYXNlcyAodG8gZGV0ZWN0IHN1c3RhaW5lZCBuZXcgc2Nyb2xsaW5nKVxuICAgIGxldCBzdXN0YWluZWRIaWdoQ291bnQgPSAwOyAvLyBDb3VudCBvZiBldmVudHMgd2hlcmUgZGVsdGEgaXMgc2lnbmlmaWNhbnRseSBhYm92ZSBtaW5pbXVtIChzdXN0YWluZWQgbmV3IHNjcm9sbGluZylcblxuICAgIC8vIGNvbnNvbGUubG9nKGBbU2Nyb2xsaW5nXSBJbml0aWFsIHN0YXRlIC0gcG9zaXRpb246ICR7c2Nyb2xsUG9zaXRpb259YCk7XG5cbiAgICAvLyBUaHJlc2hvbGQgZm9yIGNvbnNpZGVyaW5nIHRoZSBsaXN0IFwic2Nyb2xsZWRcIiAoaW4gcGl4ZWxzKVxuICAgIGNvbnN0IFNDUk9MTEVEX1RIUkVTSE9MRCA9IDE7XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBzY3JvbGxlZCBzdGF0ZSBjbGFzcyBvbiB0aGUgdmxpc3QgY29udGFpbmVyXG4gICAgICogQWRkcyAtLXNjcm9sbGVkIG1vZGlmaWVyIHdoZW4gbGlzdCBpcyBub3QgYXQgdGhlIHRvcFxuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZVNjcm9sbGVkU3RhdGUgPSAoXG4gICAgICB2aWV3cG9ydEVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgICAgcG9zaXRpb246IG51bWJlcixcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHNob3VsZEJlU2Nyb2xsZWQgPSBwb3NpdGlvbiA+IFNDUk9MTEVEX1RIUkVTSE9MRDtcbiAgICAgIGlmIChzaG91bGRCZVNjcm9sbGVkICE9PSBpc1Njcm9sbGVkRnJvbVRvcCkge1xuICAgICAgICBpc1Njcm9sbGVkRnJvbVRvcCA9IHNob3VsZEJlU2Nyb2xsZWQ7XG4gICAgICAgIC8vIEZpbmQgdGhlIHZsaXN0IGNvbnRhaW5lciAocGFyZW50IG9mIHZpZXdwb3J0KVxuICAgICAgICBjb25zdCB2bGlzdENvbnRhaW5lciA9IHZpZXdwb3J0RWxlbWVudC5jbG9zZXN0KFwiLm10cmwtdmxpc3RcIik7XG4gICAgICAgIGlmICh2bGlzdENvbnRhaW5lcikge1xuICAgICAgICAgIHZsaXN0Q29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUoXG4gICAgICAgICAgICBcIm10cmwtdmxpc3QtLXNjcm9sbGVkXCIsXG4gICAgICAgICAgICBzaG91bGRCZVNjcm9sbGVkLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gR2V0IHZpZXdwb3J0IHN0YXRlXG4gICAgbGV0IHZpZXdwb3J0U3RhdGU6IGFueTtcblxuICAgIC8vIFVzZSBzaGFyZWQgaW5pdGlhbGl6YXRpb24gd3JhcHBlclxuICAgIHdyYXBJbml0aWFsaXplKGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgdmlld3BvcnRTdGF0ZSA9IGdldFZpZXdwb3J0U3RhdGUoY29tcG9uZW50KTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBzdGF0ZSB2YWx1ZXNcbiAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgIHRvdGFsVmlydHVhbFNpemUgPSB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemUgfHwgMDtcbiAgICAgICAgY29udGFpbmVyU2l6ZSA9IHZpZXdwb3J0U3RhdGUuY29udGFpbmVyU2l6ZSB8fCAwO1xuICAgICAgICAvLyBTeW5jIHNjcm9sbFBvc2l0aW9uIGZyb20gdmlld3BvcnRTdGF0ZSAoaW1wb3J0YW50IGZvciBpbml0aWFsU2Nyb2xsSW5kZXgpXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID4gMCkge1xuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uID0gdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBMaXN0ZW4gZm9yIHZpcnR1YWwgc2l6ZSBjaGFuZ2VzXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnZpcnR1YWwtc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJbU2Nyb2xsaW5nXSBWaXJ0dWFsIHNpemUgY2hhbmdlZDpcIiwgZGF0YSk7XG4gICAgICAgIHVwZGF0ZVNjcm9sbEJvdW5kcyhkYXRhLnRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3Igc2Nyb2xsIHBvc2l0aW9uIGNoYW5nZXMgZnJvbSBvdGhlciBmZWF0dXJlcyAoZS5nLiwgdmlydHVhbC50cyBhZnRlciBpdGVtIHNpemUgZGV0ZWN0aW9uKVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpzY3JvbGwtcG9zaXRpb24tc3luY1wiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChkYXRhLnBvc2l0aW9uICE9PSB1bmRlZmluZWQgJiYgZGF0YS5wb3NpdGlvbiAhPT0gc2Nyb2xsUG9zaXRpb24pIHtcbiAgICAgICAgICBzY3JvbGxQb3NpdGlvbiA9IGRhdGEucG9zaXRpb247XG4gICAgICAgICAgLy8gQWxzbyB1cGRhdGUgbG9jYWwgdHJhY2tpbmcgdmFyc1xuICAgICAgICAgIHRvdGFsVmlydHVhbFNpemUgPVxuICAgICAgICAgICAgdmlld3BvcnRTdGF0ZT8udmlydHVhbFRvdGFsU2l6ZSB8fCB0b3RhbFZpcnR1YWxTaXplO1xuICAgICAgICAgIGNvbnRhaW5lclNpemUgPSB2aWV3cG9ydFN0YXRlPy5jb250YWluZXJTaXplIHx8IGNvbnRhaW5lclNpemU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGNvbnRhaW5lciBzaXplIGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6Y29udGFpbmVyLXNpemUtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChkYXRhLmNvbnRhaW5lclNpemUpIHtcbiAgICAgICAgICBjb250YWluZXJTaXplID0gZGF0YS5jb250YWluZXJTaXplO1xuICAgICAgICAgIHVwZGF0ZVNjcm9sbEJvdW5kcyh0b3RhbFZpcnR1YWxTaXplLCBjb250YWluZXJTaXplKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEF0dGFjaCB3aGVlbCBldmVudCBsaXN0ZW5lciB0byB2aWV3cG9ydCBlbGVtZW50XG4gICAgICBjb25zdCB2aWV3cG9ydEVsZW1lbnQgPVxuICAgICAgICB2aWV3cG9ydFN0YXRlPy52aWV3cG9ydEVsZW1lbnQgfHwgKGNvbXBvbmVudCBhcyBhbnkpLnZpZXdwb3J0RWxlbWVudDtcbiAgICAgIGlmICh2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtTY3JvbGxpbmddIEF0dGFjaGluZyB3aGVlbCBldmVudCB0byB2aWV3cG9ydCBlbGVtZW50YCk7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwid2hlZWxcIiwgaGFuZGxlV2hlZWwsIHtcbiAgICAgICAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBzY3JvbGxlZCBzdGF0ZSBiYXNlZCBvbiBjdXJyZW50IHNjcm9sbCBwb3NpdGlvblxuICAgICAgICB1cGRhdGVTY3JvbGxlZFN0YXRlKHZpZXdwb3J0RWxlbWVudCwgc2Nyb2xsUG9zaXRpb24pO1xuXG4gICAgICAgIC8vIEFkZCBtb3VzZWRvd24gbGlzdGVuZXIgdG8gc3RvcCBzY3JvbGxpbmcgb24gY2xpY2tcbiAgICAgICAgaWYgKHN0b3BPbkNsaWNrKSB7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgaGFuZGxlTW91c2VEb3duKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0b3JlIHJlZmVyZW5jZSBmb3IgY2xlYW51cFxuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuX3Njcm9sbGluZ1ZpZXdwb3J0RWxlbWVudCA9IHZpZXdwb3J0RWxlbWVudDtcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLl9zY3JvbGxpbmdTdG9wT25DbGljayA9IHN0b3BPbkNsaWNrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbU2Nyb2xsaW5nXSBObyB2aWV3cG9ydCBlbGVtZW50IGZvdW5kIGZvciB3aGVlbCBldmVudHNgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFVzZSBjbGFtcCBmcm9tIHV0aWxzXG5cbiAgICAvLyBTdGFydCBpZGxlIGRldGVjdGlvblxuICAgIGNvbnN0IHN0YXJ0SWRsZURldGVjdGlvbiA9ICgpID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1Njcm9sbGluZ10gU3RhcnRpbmcgaWRsZSBkZXRlY3Rpb25cIik7XG5cbiAgICAgIC8vIFN0b3AgYW55IGV4aXN0aW5nIGlkbGUgZGV0ZWN0aW9uIGZpcnN0XG4gICAgICBpZiAoaWRsZUNoZWNrRnJhbWUgIT09IG51bGwpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWRsZUNoZWNrRnJhbWUpO1xuICAgICAgICBpZGxlQ2hlY2tGcmFtZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGhhc0VtaXR0ZWRJZGxlID0gZmFsc2U7IC8vIFJlc2V0IGlkbGUgZW1pc3Npb24gZmxhZ1xuICAgICAgY29uc3QgY2hlY2tJZGxlID0gKCkgPT4ge1xuICAgICAgICBpZiAoc2Nyb2xsUG9zaXRpb24gPT09IGxhc3RJZGxlQ2hlY2tQb3NpdGlvbikge1xuICAgICAgICAgIC8vIFBvc2l0aW9uIGhhc24ndCBjaGFuZ2VkIC0gd2UncmUgaWRsZVxuICAgICAgICAgIGlmICghaGFzRW1pdHRlZElkbGUgJiYgKHNwZWVkVHJhY2tlci52ZWxvY2l0eSA+IDAgfHwgaXNTY3JvbGxpbmcpKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgXCJbU2Nyb2xsaW5nXSBJZGxlIGRldGVjdGVkIC0gcG9zaXRpb24gc3RhYmxlLCBzZXR0aW5nIHZlbG9jaXR5IHRvIHplcm9cIlxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgIGhhc0VtaXR0ZWRJZGxlID0gdHJ1ZTsgLy8gTWFyayB0aGF0IHdlJ3ZlIGVtaXR0ZWQgaWRsZVxuICAgICAgICAgICAgc2V0VmVsb2NpdHlUb1plcm8oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUG9zaXRpb24gY2hhbmdlZCwgcmVzZXQgdGhlIGZsYWdcbiAgICAgICAgICBoYXNFbWl0dGVkSWRsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RJZGxlQ2hlY2tQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgICBpZGxlQ2hlY2tGcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShjaGVja0lkbGUpO1xuICAgICAgfTtcbiAgICAgIGlkbGVDaGVja0ZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNoZWNrSWRsZSk7XG4gICAgfTtcblxuICAgIC8vIFN0b3AgaWRsZSBkZXRlY3Rpb25cbiAgICBjb25zdCBzdG9wSWRsZURldGVjdGlvbiA9ICgpID0+IHtcbiAgICAgIGlmIChpZGxlQ2hlY2tGcmFtZSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltTY3JvbGxpbmddIFN0b3BwaW5nIGlkbGUgZGV0ZWN0aW9uXCIpO1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShpZGxlQ2hlY2tGcmFtZSk7XG4gICAgICAgIGlkbGVDaGVja0ZyYW1lID0gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gU2V0IHZlbG9jaXR5IHRvIHplcm8gYW5kIGVtaXQgaWRsZSBldmVudFxuICAgIGNvbnN0IHNldFZlbG9jaXR5VG9aZXJvID0gKCkgPT4ge1xuICAgICAgLy8gU3RvcCBpZGxlIGRldGVjdGlvbiBzaW5jZSB3ZSdyZSBub3cgaWRsZVxuICAgICAgc3RvcElkbGVEZXRlY3Rpb24oKTtcblxuICAgICAgc3BlZWRUcmFja2VyID0gY3JlYXRlU3BlZWRUcmFja2VyKCk7XG4gICAgICBpc1Njcm9sbGluZyA9IGZhbHNlOyAvLyBSZXNldCBzY3JvbGxpbmcgc3RhdGVcblxuICAgICAgLy8gRW1pdCB2ZWxvY2l0eSBjaGFuZ2VcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDp2ZWxvY2l0eS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgdmVsb2NpdHk6IDAsXG4gICAgICAgIGRpcmVjdGlvbjogc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgIH0pO1xuXG4gICAgICAvLyBFbWl0IGlkbGUgc3RhdGVcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDppZGxlXCIsIHtcbiAgICAgICAgcG9zaXRpb246IHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICBsYXN0U2Nyb2xsVGltZSxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gVXBkYXRlIGNvbnRhaW5lciBwb3NpdGlvblxuICAgIGNvbnN0IHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uID0gKCkgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlIHx8ICF2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyKSByZXR1cm47XG5cbiAgICAgIC8vIEl0ZW1zIGNvbnRhaW5lciBkb2Vzbid0IG1vdmUgLSBpdGVtcyBpbnNpZGUgaXQgYXJlIHBvc2l0aW9uZWRcbiAgICAgIC8vIFRoaXMgaXMgaGFuZGxlZCBieSB0aGUgcmVuZGVyaW5nIGZlYXR1cmVcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIG1vdXNlZG93biB0byBzdG9wIHNjcm9sbGluZyBvbiBjbGlja1xuICAgIGNvbnN0IGhhbmRsZU1vdXNlRG93biA9IChfZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgLy8gQW5jaG9yIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbiAtIGFueSB3aGVlbCBldmVudHMgd2lsbCBiZSBmb3JjZWQgYmFjayB0byB0aGlzIHBvc2l0aW9uXG4gICAgICAvLyBUaGlzIGVsZWdhbnRseSBoYW5kbGVzIG1vdXNlIHdoZWVscyB3aXRoIHBoeXNpY2FsIGluZXJ0aWEgKGxpa2UgTG9naXRlY2ggZnJlZS1zcGluKVxuICAgICAgYW5jaG9yUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgIGFuY2hvclRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgYW5jaG9ySW5pdGlhbERlbHRhID0gMDsgLy8gV2lsbCBiZSBzZXQgYnkgZmlyc3Qgd2hlZWwgZXZlbnRcbiAgICAgIGFuY2hvckxhc3REZWx0YSA9IDA7XG4gICAgICBhbmNob3JNaW5EZWx0YSA9IEluZmluaXR5O1xuICAgICAgY29uc2VjdXRpdmVJbmNyZWFzZXMgPSAwO1xuICAgICAgc3VzdGFpbmVkSGlnaENvdW50ID0gMDtcblxuICAgICAgLy8gT25seSBzdG9wIGlmIHdlJ3JlIGN1cnJlbnRseSBzY3JvbGxpbmdcbiAgICAgIGlmIChpc1Njcm9sbGluZyB8fCBzcGVlZFRyYWNrZXIudmVsb2NpdHkgPiAwKSB7XG4gICAgICAgIHNldFZlbG9jaXR5VG9aZXJvKCk7XG4gICAgICB9XG4gICAgICAvLyBBbHNvIHN0b3AgbW9tZW50dW0gYW5pbWF0aW9uIGlmIGFjdGl2ZVxuICAgICAgY29uc3QgbW9tZW50dW1TdGF0ZSA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5tb21lbnR1bVN0YXRlO1xuICAgICAgaWYgKG1vbWVudHVtU3RhdGU/LnN0b3BNb21lbnR1bSkge1xuICAgICAgICBtb21lbnR1bVN0YXRlLnN0b3BNb21lbnR1bSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgd2hlZWwgZXZlbnRcbiAgICBjb25zdCBoYW5kbGVXaGVlbCA9IChldmVudDogV2hlZWxFdmVudCkgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgY29uc3QgZGVsdGEgPSBvcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiID8gZXZlbnQuZGVsdGFZIDogZXZlbnQuZGVsdGFYO1xuICAgICAgY29uc3Qgc2Nyb2xsRGVsdGEgPSBkZWx0YSAqIHNlbnNpdGl2aXR5O1xuXG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgdGltZVNpbmNlTGFzdFdoZWVsID0gbm93IC0gbGFzdFdoZWVsVGltZTtcbiAgICAgIGxhc3RXaGVlbFRpbWUgPSBub3c7XG5cbiAgICAgIC8vIElmIHdlIGhhdmUgYW4gYW5jaG9yIHBvc2l0aW9uICh1c2VyIGNsaWNrZWQgdG8gc3RvcCBzY3JvbGxpbmcpLFxuICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyBpbnRlbnRpb25hbCBuZXcgc2Nyb2xsaW5nIG9yIHJlc2lkdWFsIHdoZWVsIGluZXJ0aWFcbiAgICAgIGlmIChhbmNob3JQb3NpdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCB0aW1lU2luY2VBbmNob3IgPSBub3cgLSBhbmNob3JUaW1lO1xuICAgICAgICBjb25zdCB3aGVlbERlbHRhTWFnbml0dWRlID0gTWF0aC5hYnMoc2Nyb2xsRGVsdGEpO1xuXG4gICAgICAgIC8vIFRyYWNrIGluaXRpYWwgZGVsdGEgdG8gZGV0ZWN0IHdoZW4gaW5lcnRpYSBoYXMgZGVjYXllZFxuICAgICAgICBpZiAoYW5jaG9ySW5pdGlhbERlbHRhID09PSAwKSB7XG4gICAgICAgICAgYW5jaG9ySW5pdGlhbERlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZTtcbiAgICAgICAgICBhbmNob3JMYXN0RGVsdGEgPSB3aGVlbERlbHRhTWFnbml0dWRlO1xuICAgICAgICAgIGFuY2hvck1pbkRlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyYWNrIG1pbmltdW0gZGVsdGEgdG8gZGV0ZWN0IHJlYWNjZWxlcmF0aW9uICh1c2VyIHN0YXJ0ZWQgc2Nyb2xsaW5nIGFnYWluKVxuICAgICAgICBhbmNob3JNaW5EZWx0YSA9IE1hdGgubWluKGFuY2hvck1pbkRlbHRhLCB3aGVlbERlbHRhTWFnbml0dWRlKTtcblxuICAgICAgICAvLyBEZXRlY3QgaWYgZGVsdGEgaXMgaW5jcmVhc2luZyAodXNlciBzdGFydGVkIG5ldyBzY3JvbGwpXG4gICAgICAgIC8vIEluZXJ0aWEgb25seSBkZWNheXMsIHNvIGluY3JlYXNpbmcgZGVsdGEgPSBpbnRlbnRpb25hbCBuZXcgc2Nyb2xsaW5nXG4gICAgICAgIC8vIEJVVDogZmlsdGVyIG91dCBiYXRjaGVkIGV2ZW50cyB3aGVyZSBkZWx0YSBpcyB+MnggdGhlIGxhc3QgKGJyb3dzZXIgYmF0Y2hpbmcsIG5vdCByZWFsIGluY3JlYXNlKVxuICAgICAgICBjb25zdCBpc0JhdGNoZWRFdmVudCA9XG4gICAgICAgICAgd2hlZWxEZWx0YU1hZ25pdHVkZSA+IGFuY2hvckxhc3REZWx0YSAqIDEuOCAmJlxuICAgICAgICAgIHdoZWVsRGVsdGFNYWduaXR1ZGUgPCBhbmNob3JMYXN0RGVsdGEgKiAyLjI7XG5cbiAgICAgICAgLy8gVHJhY2sgY29uc2VjdXRpdmUgaW5jcmVhc2VzIC0gc3VzdGFpbmVkIGluY3JlYXNlcyBpbmRpY2F0ZSBuZXcgc2Nyb2xsaW5nXG4gICAgICAgIC8vIFVzZSAxJSB0aHJlc2hvbGQgdG8gY2F0Y2ggZ3JhZHVhbCBhY2NlbGVyYXRpb25cbiAgICAgICAgaWYgKCFpc0JhdGNoZWRFdmVudCAmJiB3aGVlbERlbHRhTWFnbml0dWRlID4gYW5jaG9yTGFzdERlbHRhICogMS4wMSkge1xuICAgICAgICAgIGNvbnNlY3V0aXZlSW5jcmVhc2VzKys7XG4gICAgICAgIH0gZWxzZSBpZiAod2hlZWxEZWx0YU1hZ25pdHVkZSA8IGFuY2hvckxhc3REZWx0YSAqIDAuOTkpIHtcbiAgICAgICAgICAvLyBEZWx0YSBkZWNyZWFzaW5nIC0gcmVzZXQgY291bnRlclxuICAgICAgICAgIGNvbnNlY3V0aXZlSW5jcmVhc2VzID0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBkZWx0YSBpcyByb3VnaGx5IHRoZSBzYW1lICh3aXRoaW4gMSUpLCBkb24ndCBjaGFuZ2UgdGhlIGNvdW50ZXJcblxuICAgICAgICAvLyBUcmFjayBzdXN0YWluZWQgaGlnaCBkZWx0YSAoZGVsdGEgc2lnbmlmaWNhbnRseSBhYm92ZSBtaW5pbXVtIGZvciBtdWx0aXBsZSBldmVudHMpXG4gICAgICAgIC8vIFRoaXMgY2F0Y2hlcyB3aGVuIHVzZXIgc3RhcnRzIHNjcm9sbGluZyBidXQgZGVsdGEgcGxhdGVhdXMgaW5zdGVhZCBvZiBzdHJpY3RseSBpbmNyZWFzaW5nXG4gICAgICAgIGlmICghaXNCYXRjaGVkRXZlbnQgJiYgd2hlZWxEZWx0YU1hZ25pdHVkZSA+IGFuY2hvck1pbkRlbHRhICogMS4wNSkge1xuICAgICAgICAgIHN1c3RhaW5lZEhpZ2hDb3VudCsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN1c3RhaW5lZEhpZ2hDb3VudCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWxlYXNlIGlmOiAzKyBjb25zZWN1dGl2ZSBpbmNyZWFzZXMsIE9SIHN1c3RhaW5lZCBoaWdoIGRlbHRhLCBPUiBzaWduaWZpY2FudCBzaW5nbGUgaW5jcmVhc2VcbiAgICAgICAgY29uc3Qgc3VzdGFpbmVkSW5jcmVhc2UgPSBjb25zZWN1dGl2ZUluY3JlYXNlcyA+PSAzO1xuICAgICAgICBjb25zdCBzdXN0YWluZWRIaWdoID0gc3VzdGFpbmVkSGlnaENvdW50ID49IDU7IC8vIDUrIGV2ZW50cyBhdCA1JSsgYWJvdmUgbWluaW11bVxuICAgICAgICBjb25zdCBzaWduaWZpY2FudEluY3JlYXNlID1cbiAgICAgICAgICAhaXNCYXRjaGVkRXZlbnQgJiZcbiAgICAgICAgICB3aGVlbERlbHRhTWFnbml0dWRlID4gYW5jaG9yTWluRGVsdGEgKiAxLjE1ICYmIC8vIDE1JSBpbmNyZWFzZSBmcm9tIG1pbmltdW1cbiAgICAgICAgICB3aGVlbERlbHRhTWFnbml0dWRlID4gYW5jaG9yTGFzdERlbHRhICogMS4wODsgLy8gYW5kIDglIGluY3JlYXNpbmcgZnJvbSBsYXN0XG4gICAgICAgIGNvbnN0IGRlbHRhSW5jcmVhc2luZyA9XG4gICAgICAgICAgc3VzdGFpbmVkSW5jcmVhc2UgfHwgc3VzdGFpbmVkSGlnaCB8fCBzaWduaWZpY2FudEluY3JlYXNlO1xuXG4gICAgICAgIC8vIFJlbGVhc2UgYW5jaG9yIGlmOlxuICAgICAgICAvLyAxLiBUaGVyZSB3YXMgYSBnYXAgaW4gd2hlZWwgZXZlbnRzICg+IDIwMG1zKSAtIHVzZXIgc3RvcHBlZCBhbmQgc3RhcnRlZCBuZXcgc2Nyb2xsXG4gICAgICAgIC8vIDIuIERlbHRhIGlzIGluY3JlYXNpbmcgZnJvbSBtaW5pbXVtIC0gdXNlciBzdGFydGVkIHNjcm9sbGluZyBhZ2FpbiBkdXJpbmcgaW5lcnRpYVxuICAgICAgICAvLyAzLiBEZWx0YSBoYXMgZGVjYXllZCBzaWduaWZpY2FudGx5ICg8IDMwJSBvZiBpbml0aWFsKSAtIGluZXJ0aWEgaXMgd2luZGluZyBkb3duXG4gICAgICAgIC8vIDQuIExvdyBhYnNvbHV0ZSBkZWx0YSAoPCAzMCkgLSBnZW50bGUgaW50ZW50aW9uYWwgc2Nyb2xsXG4gICAgICAgIGNvbnN0IGhhc1doZWVsR2FwID0gdGltZVNpbmNlTGFzdFdoZWVsID4gMjAwO1xuICAgICAgICBjb25zdCBkZWx0YURlY2F5ZWQgPSB3aGVlbERlbHRhTWFnbml0dWRlIDwgYW5jaG9ySW5pdGlhbERlbHRhICogMC4zO1xuICAgICAgICBjb25zdCBpc0xvd0RlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZSA8IDMwO1xuXG4gICAgICAgIGlmIChoYXNXaGVlbEdhcCkge1xuICAgICAgICAgIC8vIFRpbWUgZ2FwIC0gdXNlciBzdG9wcGVkIGFuZCBzdGFydGVkIG5ldyBzY3JvbGxcbiAgICAgICAgICBhbmNob3JQb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoZGVsdGFJbmNyZWFzaW5nICYmIHRpbWVTaW5jZUFuY2hvciA+IDEwMCkge1xuICAgICAgICAgIC8vIERlbHRhIGluY3JlYXNpbmcgLSB1c2VyIHN0YXJ0ZWQgc2Nyb2xsaW5nIGFnYWluXG4gICAgICAgICAgYW5jaG9yUG9zaXRpb24gPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTG93RGVsdGEpIHtcbiAgICAgICAgICAvLyBWZXJ5IGxvdyBkZWx0YSAtIGdlbnRsZSBpbnRlbnRpb25hbCBzY3JvbGxcbiAgICAgICAgICBhbmNob3JQb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoZGVsdGFEZWNheWVkICYmIHRpbWVTaW5jZUFuY2hvciA+IDMwMCkge1xuICAgICAgICAgIC8vIERlbHRhIGhhcyBkZWNheWVkIGFuZCBzb21lIHRpbWUgcGFzc2VkIC0gaW5lcnRpYSBpcyBkb25lXG4gICAgICAgICAgYW5jaG9yUG9zaXRpb24gPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFN0aWxsIGluIGluZXJ0aWEgcGhhc2UgLSBzdGF5IGFuY2hvcmVkXG4gICAgICAgICAgaWYgKHNjcm9sbFBvc2l0aW9uICE9PSBhbmNob3JQb3NpdGlvbikge1xuICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSBhbmNob3JQb3NpdGlvbjtcbiAgICAgICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBVcGRhdGUgbGFzdCBkZWx0YSBmb3IgbmV4dCBjb21wYXJpc29uXG4gICAgICAgICAgYW5jaG9yTGFzdERlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgbGFzdCBkZWx0YSBmb3IgbmV4dCBjb21wYXJpc29uXG4gICAgICAgIGFuY2hvckxhc3REZWx0YSA9IHdoZWVsRGVsdGFNYWduaXR1ZGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByZXZpb3VzUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgIGNvbnN0IG1heFNjcm9sbCA9IE1hdGgubWF4KDAsIHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplKTtcblxuICAgICAgbGV0IG5ld1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb24gKyBzY3JvbGxEZWx0YTtcblxuICAgICAgLy8gQXBwbHkgc21vb3RoaW5nIGlmIGVuYWJsZWRcbiAgICAgIGlmIChzbW9vdGhpbmcpIHtcbiAgICAgICAgY29uc3Qgc21vb3RoaW5nRmFjdG9yID0gMC4zO1xuICAgICAgICBuZXdQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uICsgc2Nyb2xsRGVsdGEgKiBzbW9vdGhpbmdGYWN0b3I7XG4gICAgICB9XG5cbiAgICAgIG5ld1Bvc2l0aW9uID0gY2xhbXAobmV3UG9zaXRpb24sIDAsIG1heFNjcm9sbCk7XG5cbiAgICAgIGlmIChuZXdQb3NpdGlvbiAhPT0gc2Nyb2xsUG9zaXRpb24pIHtcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSBuZXdQb3NpdGlvbjtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICAgICAgICAvLyBVcGRhdGUgc2Nyb2xsIHN0YXRlXG4gICAgICAgIGlmICghaXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICBpc1Njcm9sbGluZyA9IHRydWU7XG4gICAgICAgICAgLy8gU3RvcCBhbnkgZXhpc3RpbmcgaWRsZSBkZXRlY3Rpb24gYmVmb3JlIHN0YXJ0aW5nIG5ldyBvbmVcbiAgICAgICAgICBzdG9wSWRsZURldGVjdGlvbigpO1xuICAgICAgICAgIHN0YXJ0SWRsZURldGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RTY3JvbGxUaW1lID0gbm93O1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzcGVlZCB0cmFja2VyXG4gICAgICAgIHNwZWVkVHJhY2tlciA9IHVwZGF0ZVNwZWVkVHJhY2tlcihcbiAgICAgICAgICBzcGVlZFRyYWNrZXIsXG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgcHJldmlvdXNQb3NpdGlvbixcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBVcGRhdGUgdmlld3BvcnQgc3RhdGVcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS52ZWxvY2l0eSA9IHNwZWVkVHJhY2tlci52ZWxvY2l0eTtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbERpcmVjdGlvbiA9IHNwZWVkVHJhY2tlci5kaXJlY3Rpb247XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgc2Nyb2xsZWQgc3RhdGUgY2xhc3NcbiAgICAgICAgY29uc3Qgdmlld3BvcnRFbCA9XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZT8udmlld3BvcnRFbGVtZW50IHx8IChjb21wb25lbnQgYXMgYW55KS52aWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydEVsKSB7XG4gICAgICAgICAgdXBkYXRlU2Nyb2xsZWRTdGF0ZSh2aWV3cG9ydEVsLCBzY3JvbGxQb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IGV2ZW50c1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6c2Nyb2xsXCIsIHtcbiAgICAgICAgICBwb3NpdGlvbjogc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgZGlyZWN0aW9uOiBzcGVlZFRyYWNrZXIuZGlyZWN0aW9uLFxuICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDp2ZWxvY2l0eS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgICB2ZWxvY2l0eTogc3BlZWRUcmFja2VyLnZlbG9jaXR5LFxuICAgICAgICAgIGRpcmVjdGlvbjogc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciByZW5kZXJcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFNjcm9sbCB0byBwb3NpdGlvblxuICAgIGNvbnN0IHNjcm9sbFRvUG9zaXRpb24gPSAocG9zaXRpb246IG51bWJlciwgc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBtYXhTY3JvbGwgPSBNYXRoLm1heCgwLCB0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZSk7XG4gICAgICBjb25zdCBjbGFtcGVkUG9zaXRpb24gPSBjbGFtcChwb3NpdGlvbiwgMCwgbWF4U2Nyb2xsKTtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbU2Nyb2xsaW5nXSBzY3JvbGxUb1Bvc2l0aW9uOiBwb3M9JHtwb3NpdGlvbn0gLT4gJHtjbGFtcGVkUG9zaXRpb259LCBzb3VyY2U9JHtzb3VyY2V9LCBjdXJyZW50UG9zPSR7c2Nyb2xsUG9zaXRpb259LCB2ZWxvY2l0eT0ke3NwZWVkVHJhY2tlci52ZWxvY2l0eS50b0ZpeGVkKFxuICAgICAgLy8gICAgIDNcbiAgICAgIC8vICAgKX1gXG4gICAgICAvLyApO1xuXG4gICAgICBpZiAoY2xhbXBlZFBvc2l0aW9uICE9PSBzY3JvbGxQb3NpdGlvbikge1xuICAgICAgICBjb25zdCBwcmV2aW91c1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgIHNjcm9sbFBvc2l0aW9uID0gY2xhbXBlZFBvc2l0aW9uO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzcGVlZCB0cmFja2VyIHRvIGNhbGN1bGF0ZSB2ZWxvY2l0eVxuICAgICAgICBzcGVlZFRyYWNrZXIgPSB1cGRhdGVTcGVlZFRyYWNrZXIoXG4gICAgICAgICAgc3BlZWRUcmFja2VyLFxuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24sXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHZpZXdwb3J0IHN0YXRlXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUudmVsb2NpdHkgPSBzcGVlZFRyYWNrZXIudmVsb2NpdHk7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxEaXJlY3Rpb24gPSBzcGVlZFRyYWNrZXIuZGlyZWN0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID1cbiAgICAgICAgICBjbGFtcGVkUG9zaXRpb24gPiBwcmV2aW91c1Bvc2l0aW9uID8gXCJmb3J3YXJkXCIgOiBcImJhY2t3YXJkXCI7XG5cbiAgICAgICAgLy8gVXBkYXRlIHNjcm9sbGVkIHN0YXRlIGNsYXNzXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0RWwgPVxuICAgICAgICAgIHZpZXdwb3J0U3RhdGU/LnZpZXdwb3J0RWxlbWVudCB8fCAoY29tcG9uZW50IGFzIGFueSkudmlld3BvcnRFbGVtZW50O1xuICAgICAgICBpZiAodmlld3BvcnRFbCkge1xuICAgICAgICAgIHVwZGF0ZVNjcm9sbGVkU3RhdGUodmlld3BvcnRFbCwgc2Nyb2xsUG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBzY3JvbGwgZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnNjcm9sbFwiLCB7XG4gICAgICAgICAgcG9zaXRpb246IHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgICBwcmV2aW91c1Bvc2l0aW9uLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFbWl0IHZlbG9jaXR5IGNoYW5nZSBldmVudCBzbyBjb2xsZWN0aW9uIGNhbiB0cmFjayBpdFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6dmVsb2NpdHktY2hhbmdlZFwiLCB7XG4gICAgICAgICAgdmVsb2NpdHk6IHNwZWVkVHJhY2tlci52ZWxvY2l0eSxcbiAgICAgICAgICBkaXJlY3Rpb246IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzY3JvbGwgc3RhdGUgYW5kIGlkbGUgZGV0ZWN0aW9uXG4gICAgICAgIGlmICghaXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICBpc1Njcm9sbGluZyA9IHRydWU7XG4gICAgICAgICAgc3RhcnRJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFNjcm9sbFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgcmVuZGVyXG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtTY3JvbGxpbmddIFBvc2l0aW9uIHVuY2hhbmdlZDogJHtzY3JvbGxQb3NpdGlvbn1gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtTY3JvbGxpbmddIFBvc2l0aW9uIHVuY2hhbmdlZDogJHtzY3JvbGxQb3NpdGlvbn0sIG5vdCByZXNldHRpbmcgaWRsZSB0aW1lb3V0YFxuICAgICAgICAvLyApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTY3JvbGwgdG8gaW5kZXhcbiAgICBjb25zdCBzY3JvbGxUb0luZGV4ID0gKFxuICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgIGFsaWdubWVudDogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIsXG4gICAgKSA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtTY3JvbGxpbmddIHNjcm9sbFRvSW5kZXggY2FsbGVkOiBpbmRleD0ke2luZGV4fSwgYWxpZ25tZW50PSR7YWxpZ25tZW50fWBcbiAgICAgIC8vICk7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW1Njcm9sbGluZ10gc2Nyb2xsVG9JbmRleCBhYm9ydGVkOiBubyB2aWV3cG9ydCBzdGF0ZWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGl0ZW1TaXplID0gdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZSB8fCA1MDtcbiAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgfHwgMDtcbiAgICAgIGNvbnN0IGFjdHVhbFRvdGFsU2l6ZSA9IHRvdGFsSXRlbXMgKiBpdGVtU2l6ZTtcbiAgICAgIGNvbnN0IE1BWF9WSVJUVUFMX1NJWkUgPVxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuVklSVFVBTF9TQ1JPTEwuTUFYX1ZJUlRVQUxfU0laRTtcbiAgICAgIGNvbnN0IGlzQ29tcHJlc3NlZCA9IGFjdHVhbFRvdGFsU2l6ZSA+IE1BWF9WSVJUVUFMX1NJWkU7XG5cbiAgICAgIGxldCB0YXJnZXRQb3NpdGlvbjogbnVtYmVyO1xuXG4gICAgICBpZiAoaXNDb21wcmVzc2VkKSB7XG4gICAgICAgIC8vIEluIGNvbXByZXNzZWQgc3BhY2UsIG1hcCBpbmRleCB0byB2aXJ0dWFsIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IHJhdGlvID0gaW5kZXggLyB0b3RhbEl0ZW1zO1xuICAgICAgICB0YXJnZXRQb3NpdGlvbiA9IHJhdGlvICogTWF0aC5taW4oYWN0dWFsVG90YWxTaXplLCBNQVhfVklSVFVBTF9TSVpFKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpcmVjdCBjYWxjdWxhdGlvbiB3aGVuIG5vdCBjb21wcmVzc2VkXG4gICAgICAgIHRhcmdldFBvc2l0aW9uID0gaW5kZXggKiBpdGVtU2l6ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRqdXN0IHBvc2l0aW9uIGJhc2VkIG9uIGFsaWdubWVudFxuICAgICAgc3dpdGNoIChhbGlnbm1lbnQpIHtcbiAgICAgICAgY2FzZSBcImNlbnRlclwiOlxuICAgICAgICAgIHRhcmdldFBvc2l0aW9uIC09IGNvbnRhaW5lclNpemUgLyAyIC0gaXRlbVNpemUgLyAyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgdGFyZ2V0UG9zaXRpb24gLT0gY29udGFpbmVyU2l6ZSAtIGl0ZW1TaXplO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtTY3JvbGxpbmddIFRhcmdldCBwb3NpdGlvbjogJHt0YXJnZXRQb3NpdGlvbn0sIGlzQ29tcHJlc3NlZDogJHtpc0NvbXByZXNzZWR9YFxuICAgICAgLy8gKTtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbU2Nyb2xsaW5nXSBTY3JvbGxUb0luZGV4OiBpbmRleD0ke2luZGV4fSwgcG9zaXRpb249JHt0YXJnZXRQb3NpdGlvbn0sIGFsaWdubWVudD0ke2FsaWdubWVudH1gXG4gICAgICAvLyApO1xuXG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uKHRhcmdldFBvc2l0aW9uLCBcInNjcm9sbFRvSW5kZXhcIik7XG4gICAgfTtcblxuICAgIC8vIFNjcm9sbCB0byBhIHNwZWNpZmljIHBhZ2VcbiAgICBjb25zdCBzY3JvbGxUb1BhZ2UgPSAoXG4gICAgICBwYWdlOiBudW1iZXIsXG4gICAgICBsaW1pdDogbnVtYmVyID0gMjAsXG4gICAgICBhbGlnbm1lbnQ6IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiID0gXCJzdGFydFwiLFxuICAgICkgPT4ge1xuICAgICAgLy8gVmFsaWRhdGUgYWxpZ25tZW50IHBhcmFtZXRlclxuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgYWxpZ25tZW50ICE9PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICFbXCJzdGFydFwiLCBcImNlbnRlclwiLCBcImVuZFwiXS5pbmNsdWRlcyhhbGlnbm1lbnQpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbU2Nyb2xsaW5nXSBJbnZhbGlkIGFsaWdubWVudCBcIiR7YWxpZ25tZW50fVwiLCB1c2luZyBcInN0YXJ0XCJgLFxuICAgICAgICApO1xuICAgICAgICBhbGlnbm1lbnQgPSBcInN0YXJ0XCI7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGN1cnNvciBtb2RlXG4gICAgICBjb25zdCB2aWV3cG9ydENvbmZpZyA9IChjb21wb25lbnQgYXMgYW55KS5jb25maWc7XG4gICAgICBjb25zdCBpc0N1cnNvck1vZGUgPSB2aWV3cG9ydENvbmZpZz8ucGFnaW5hdGlvbj8uc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCI7XG5cbiAgICAgIGlmIChpc0N1cnNvck1vZGUpIHtcbiAgICAgICAgLy8gSW4gY3Vyc29yIG1vZGUsIGNoZWNrIGlmIHdlIGNhbiBzY3JvbGwgdG8gdGhpcyBwYWdlXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuY29sbGVjdGlvbjtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBjb25zdCBoaWdoZXN0TG9hZGVkUGFnZSA9IE1hdGguZmxvb3IoXG4gICAgICAgICAgICBjb2xsZWN0aW9uLmdldExvYWRlZFJhbmdlcygpLnNpemUsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChwYWdlID4gaGlnaGVzdExvYWRlZFBhZ2UgKyAxKSB7XG4gICAgICAgICAgICAvLyBMaW1pdCBob3cgbWFueSBwYWdlcyB3ZSdsbCBsb2FkIGF0IG9uY2UgdG8gcHJldmVudCBleGNlc3NpdmUgQVBJIGNhbGxzXG4gICAgICAgICAgICBjb25zdCBtYXhQYWdlc1RvTG9hZCA9IDEwOyAvLyBSZWFzb25hYmxlIGxpbWl0XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRQYWdlID0gTWF0aC5taW4oXG4gICAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICAgIGhpZ2hlc3RMb2FkZWRQYWdlICsgbWF4UGFnZXNUb0xvYWQsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGBbU2Nyb2xsaW5nXSBDYW5ub3QganVtcCBkaXJlY3RseSB0byBwYWdlICR7cGFnZX0gaW4gY3Vyc29yIG1vZGUuIGAgK1xuICAgICAgICAgICAgICAgIGBQYWdlcyBtdXN0IGJlIGxvYWRlZCBzZXF1ZW50aWFsbHkuIEN1cnJlbnQgaGlnaGVzdCBwYWdlOiAke2hpZ2hlc3RMb2FkZWRQYWdlfS4gYCArXG4gICAgICAgICAgICAgICAgYFdpbGwgbG9hZCB1cCB0byBwYWdlICR7dGFyZ2V0UGFnZX1gLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gVHJpZ2dlciBzZXF1ZW50aWFsIGxvYWRpbmcgdG8gdGhlIHRhcmdldCBwYWdlIChsaW1pdGVkKVxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0T2Zmc2V0ID0gKHRhcmdldFBhZ2UgLSAxKSAqIGxpbWl0O1xuICAgICAgICAgICAgY29uc3QgY3VycmVudE9mZnNldCA9IGhpZ2hlc3RMb2FkZWRQYWdlICogbGltaXQ7XG5cbiAgICAgICAgICAgIC8vIExvYWQgcGFnZXMgc2VxdWVudGlhbGx5IHVwIHRvIHRoZSBsaW1pdGVkIHRhcmdldFxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBbU2Nyb2xsaW5nXSBJbml0aWF0aW5nIHNlcXVlbnRpYWwgbG9hZCBmcm9tIHBhZ2UgJHtcbiAgICAgICAgICAgIC8vICAgICBoaWdoZXN0TG9hZGVkUGFnZSArIDFcbiAgICAgICAgICAgIC8vICAgfSB0byAke3RhcmdldFBhZ2V9YCxcbiAgICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICAgIC8vIFNjcm9sbCB0byB0aGUgbGFzdCBsb2FkZWQgcG9zaXRpb24gZmlyc3RcbiAgICAgICAgICAgIGNvbnN0IGxhc3RMb2FkZWRJbmRleCA9IGhpZ2hlc3RMb2FkZWRQYWdlICogbGltaXQ7XG4gICAgICAgICAgICBzY3JvbGxUb0luZGV4KGxhc3RMb2FkZWRJbmRleCwgYWxpZ25tZW50KTtcblxuICAgICAgICAgICAgLy8gVGhlIGNvbGxlY3Rpb24gZmVhdHVyZSB3aWxsIGhhbmRsZSBzZXF1ZW50aWFsIGxvYWRpbmdcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ29udmVydCBwYWdlIHRvIGluZGV4IChwYWdlIDEgPSBpbmRleCAwKVxuICAgICAgY29uc3QgaW5kZXggPSAocGFnZSAtIDEpICogbGltaXQ7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGluZ10gU2Nyb2xsVG9QYWdlOiBwYWdlPSR7cGFnZX0sIGxpbWl0PSR7bGltaXR9LCB0YXJnZXRJbmRleD0ke2luZGV4fSwgYWxpZ25tZW50PSR7YWxpZ25tZW50fWBcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIEp1c3Qgc2Nyb2xsIHRvIHRoZSBpbmRleCAtIGxldCB0aGUgbm9ybWFsIHJlbmRlcmluZyBmbG93IGhhbmRsZSBkYXRhIGxvYWRpbmcgYW5kIHBsYWNlaG9sZGVyc1xuICAgICAgc2Nyb2xsVG9JbmRleChpbmRleCwgYWxpZ25tZW50KTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHNjcm9sbCBib3VuZHNcbiAgICBjb25zdCB1cGRhdGVTY3JvbGxCb3VuZHMgPSAoXG4gICAgICBuZXdUb3RhbFNpemU6IG51bWJlcixcbiAgICAgIG5ld0NvbnRhaW5lclNpemU6IG51bWJlcixcbiAgICApID0+IHtcbiAgICAgIHRvdGFsVmlydHVhbFNpemUgPSBuZXdUb3RhbFNpemU7XG4gICAgICBjb250YWluZXJTaXplID0gbmV3Q29udGFpbmVyU2l6ZTtcblxuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplID0gbmV3VG90YWxTaXplO1xuICAgICAgICB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUgPSBuZXdDb250YWluZXJTaXplO1xuICAgICAgfVxuXG4gICAgICAvLyBEb24ndCBjbGFtcCBzY3JvbGwgcG9zaXRpb24gdW50aWwgd2UgaGF2ZSByZWFsIGRhdGEgbG9hZGVkXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIHJlc2V0dGluZyBpbml0aWFsU2Nyb2xsSW5kZXggcG9zaXRpb24gYmVmb3JlIGRhdGEgYXJyaXZlc1xuICAgICAgLy8gQ2hlY2sgdG90YWxJdGVtcyBpbnN0ZWFkIG9mIHRvdGFsVmlydHVhbFNpemUgc2luY2UgdmlydHVhbFNpemUgY2FuIGJlIG5vbi16ZXJvIGZyb20gcGFkZGluZ1xuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IHZpZXdwb3J0U3RhdGU/LnRvdGFsSXRlbXMgfHwgMDtcbiAgICAgIGlmICh0b3RhbEl0ZW1zIDw9IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGFtcCBjdXJyZW50IHBvc2l0aW9uIHRvIG5ldyBib3VuZHNcbiAgICAgIGNvbnN0IG1heFNjcm9sbCA9IE1hdGgubWF4KDAsIHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplKTtcbiAgICAgIGlmIChzY3JvbGxQb3NpdGlvbiA+IG1heFNjcm9sbCkge1xuICAgICAgICBzY3JvbGxUb1Bvc2l0aW9uKG1heFNjcm9sbCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEV4dGVuZCB2aWV3cG9ydCBBUElcbiAgICBjb25zdCBvcmlnaW5hbFNjcm9sbFRvSW5kZXggPSBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9JbmRleDtcbiAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9JbmRleCA9IChcbiAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICBhbGlnbm1lbnQ/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIixcbiAgICApID0+IHtcbiAgICAgIHNjcm9sbFRvSW5kZXgoaW5kZXgsIGFsaWdubWVudCk7XG4gICAgICBvcmlnaW5hbFNjcm9sbFRvSW5kZXg/LihpbmRleCwgYWxpZ25tZW50KTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHNjcm9sbFRvUGFnZSB0byB2aWV3cG9ydCBBUEkgKG5ldyBtZXRob2QsIG5vIG9yaWdpbmFsIHRvIHByZXNlcnZlKVxuICAgIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zY3JvbGxUb1BhZ2UgPSAoXG4gICAgICBwYWdlOiBudW1iZXIsXG4gICAgICBsaW1pdD86IG51bWJlcixcbiAgICAgIGFsaWdubWVudD86IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiLFxuICAgICkgPT4ge1xuICAgICAgc2Nyb2xsVG9QYWdlKHBhZ2UsIGxpbWl0LCBhbGlnbm1lbnQpO1xuICAgIH07XG5cbiAgICBjb25zdCBvcmlnaW5hbFNjcm9sbFRvUG9zaXRpb24gPSBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9Qb3NpdGlvbjtcbiAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9Qb3NpdGlvbiA9IChwb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uKHBvc2l0aW9uLCBcImFwaVwiKTtcbiAgICAgIG9yaWdpbmFsU2Nyb2xsVG9Qb3NpdGlvbj8uKHBvc2l0aW9uKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb3JpZ2luYWxHZXRTY3JvbGxQb3NpdGlvbiA9IGNvbXBvbmVudC52aWV3cG9ydC5nZXRTY3JvbGxQb3NpdGlvbjtcbiAgICBjb21wb25lbnQudmlld3BvcnQuZ2V0U2Nyb2xsUG9zaXRpb24gPSAoKSA9PiB7XG4gICAgICByZXR1cm4gc2Nyb2xsUG9zaXRpb247XG4gICAgfTtcblxuICAgIC8vIEFkZCB3aGVlbCBldmVudCBsaXN0ZW5lciBvbiBpbml0aWFsaXphdGlvblxuICAgIC8vIFRoaXMgYmxvY2sgaXMgcmVtb3ZlZCBhcyBwZXIgdGhlIGVkaXQgaGludC5cblxuICAgIC8vIENsZWFuIHVwIG9uIGRlc3Ryb3lcbiAgICBpZiAoXCJkZXN0cm95XCIgaW4gY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQuZGVzdHJveTtcbiAgICAgIGNvbXBvbmVudC5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAvLyBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0RWxlbWVudCA9IChjb21wb25lbnQgYXMgYW55KS5fc2Nyb2xsaW5nVmlld3BvcnRFbGVtZW50O1xuICAgICAgICBpZiAodmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCBoYW5kbGVXaGVlbCk7XG4gICAgICAgICAgaWYgKChjb21wb25lbnQgYXMgYW55KS5fc2Nyb2xsaW5nU3RvcE9uQ2xpY2spIHtcbiAgICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGhhbmRsZU1vdXNlRG93bik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgdGltZW91dHNcbiAgICAgICAgaWYgKGlkbGVUaW1lb3V0SWQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoaWRsZVRpbWVvdXRJZCk7XG4gICAgICAgIH1cblxuICAgICAgICBzdG9wSWRsZURldGVjdGlvbigpO1xuICAgICAgICBvcmlnaW5hbERlc3Ryb3k/LigpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBBZGQgc2Nyb2xsQnkgbWV0aG9kXG4gICAgY29uc3Qgc2Nyb2xsQnkgPSAoZGVsdGE6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgcHJldmlvdXNQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgY29uc3QgbWF4U2Nyb2xsID0gTWF0aC5tYXgoMCwgdG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuICAgICAgY29uc3QgbmV3UG9zaXRpb24gPSBjbGFtcChzY3JvbGxQb3NpdGlvbiArIGRlbHRhLCAwLCBtYXhTY3JvbGwpO1xuXG4gICAgICBpZiAobmV3UG9zaXRpb24gIT09IHByZXZpb3VzUG9zaXRpb24pIHtcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSBuZXdQb3NpdGlvbjtcblxuICAgICAgICAvLyBVcGRhdGUgc3BlZWQgdHJhY2tlclxuICAgICAgICBzcGVlZFRyYWNrZXIgPSB1cGRhdGVTcGVlZFRyYWNrZXIoXG4gICAgICAgICAgc3BlZWRUcmFja2VyLFxuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24sXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHZpZXdwb3J0IHN0YXRlXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUudmVsb2NpdHkgPSBzcGVlZFRyYWNrZXIudmVsb2NpdHk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgc2Nyb2xsZWQgc3RhdGUgY2xhc3NcbiAgICAgICAgY29uc3Qgdmlld3BvcnRFbCA9XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZT8udmlld3BvcnRFbGVtZW50IHx8IChjb21wb25lbnQgYXMgYW55KS52aWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydEVsKSB7XG4gICAgICAgICAgdXBkYXRlU2Nyb2xsZWRTdGF0ZSh2aWV3cG9ydEVsLCBzY3JvbGxQb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IHNjcm9sbCBldmVudFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6c2Nyb2xsXCIsIHtcbiAgICAgICAgICBwb3NpdGlvbjogc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgdmVsb2NpdHk6IHNwZWVkVHJhY2tlci52ZWxvY2l0eSxcbiAgICAgICAgICBkaXJlY3Rpb246IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgcmVuZGVyXG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcz8uKCk7XG5cbiAgICAgICAgLy8gU3RhcnQgaWRsZSBkZXRlY3Rpb24gaWYgbm90IHNjcm9sbGluZ1xuICAgICAgICBpZiAoIWlzU2Nyb2xsaW5nKSB7XG4gICAgICAgICAgaXNTY3JvbGxpbmcgPSB0cnVlO1xuICAgICAgICAgIHN0YXJ0SWRsZURldGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RTY3JvbGxUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gRXhwb3NlIHNjcm9sbGluZyBzdGF0ZSBmb3Igb3RoZXIgZmVhdHVyZXNcbiAgICAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc2Nyb2xsaW5nU3RhdGUgPSB7XG4gICAgICBzZXRWZWxvY2l0eVRvWmVybyxcbiAgICB9O1xuXG4gICAgLy8gQWRkIHNjcm9sbEJ5IHRvIHZpZXdwb3J0IEFQSVxuICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxCeSA9IHNjcm9sbEJ5O1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5nZXRWZWxvY2l0eSA9ICgpID0+IHNwZWVkVHJhY2tlci52ZWxvY2l0eTtcblxuICAgIC8vIEV4cG9zZSBzY3JvbGxpbmcgQVBJXG4gICAgKGNvbXBvbmVudCBhcyBhbnkpLnNjcm9sbGluZyA9IHtcbiAgICAgIGhhbmRsZVdoZWVsLFxuICAgICAgc2Nyb2xsVG9Qb3NpdGlvbixcbiAgICAgIHNjcm9sbFRvSW5kZXgsXG4gICAgICBzY3JvbGxUb1BhZ2UsXG4gICAgICBzY3JvbGxCeSxcbiAgICAgIGdldFNjcm9sbFBvc2l0aW9uOiAoKSA9PiBzY3JvbGxQb3NpdGlvbixcbiAgICAgIHVwZGF0ZVNjcm9sbEJvdW5kcyxcbiAgICAgIGdldFZlbG9jaXR5OiAoKSA9PiBzcGVlZFRyYWNrZXIudmVsb2NpdHksXG4gICAgICBnZXREaXJlY3Rpb246ICgpID0+IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICBpc1Njcm9sbGluZzogKCkgPT4gaXNTY3JvbGxpbmcsXG4gICAgfTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9tb21lbnR1bS50c1xuXG4vKipcbiAqIE1vbWVudHVtIEZlYXR1cmUgLSBBZGRzIGluZXJ0aWFsIHNjcm9sbGluZyB0byB2aWV3cG9ydFxuICogUHJvdmlkZXMgc21vb3RoIGRlY2VsZXJhdGlvbiBhZnRlciB0b3VjaC9tb3VzZSBkcmFnIGdlc3R1cmVzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbXBvbmVudCwgVmlld3BvcnRDb250ZXh0IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBWSUVXUE9SVF9DT05TVEFOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbmludGVyZmFjZSBNb21lbnR1bUNvbmZpZyB7XG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuICBkZWNlbGVyYXRpb24/OiBudW1iZXI7XG4gIG1pblZlbG9jaXR5PzogbnVtYmVyO1xuICBtaW5EdXJhdGlvbj86IG51bWJlcjtcbiAgbWluVmVsb2NpdHlUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIC8qKiBTdG9wIG1vbWVudHVtIHdoZW4gY2xpY2tpbmcgb24gdGhlIHZpZXdwb3J0IChkZWZhdWx0OiB0cnVlKSAqL1xuICBzdG9wT25DbGljaz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQWRkcyBtb21lbnR1bSBzY3JvbGxpbmcgdG8gdmlld3BvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhNb21lbnR1bSA9IChjb25maWc6IE1vbWVudHVtQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGVuYWJsZWQgPSBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uRU5BQkxFRCxcbiAgICAgIGRlY2VsZXJhdGlvbiA9IFZJRVdQT1JUX0NPTlNUQU5UUy5NT01FTlRVTS5ERUNFTEVSQVRJT05fRkFDVE9SLFxuICAgICAgbWluVmVsb2NpdHkgPSBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uTUlOX1ZFTE9DSVRZLFxuICAgICAgbWluRHVyYXRpb24gPSBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uTUlOX0RVUkFUSU9OLFxuICAgICAgbWluVmVsb2NpdHlUaHJlc2hvbGQgPSBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uTUlOX1ZFTE9DSVRZX1RIUkVTSE9MRCxcbiAgICAgIHN0b3BPbkNsaWNrID0gdHJ1ZSwgLy8gU3RvcCBtb21lbnR1bSBvbiBjbGljayBieSBkZWZhdWx0XG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIEFsd2F5cyBhcHBseSB0aGUgZmVhdHVyZSwgYnV0IGNoZWNrIGlzRW5hYmxlZCBhdCBydW50aW1lXG5cbiAgICAvLyBNb21lbnR1bSBzdGF0ZVxuICAgIGxldCBtb21lbnR1bUFuaW1hdGlvbklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaXNUb3VjaGluZyA9IGZhbHNlO1xuICAgIGxldCBpc01vdXNlRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICBsZXQgbGFzdFRvdWNoUG9zaXRpb24gPSAwO1xuICAgIGxldCBsYXN0TW91c2VQb3NpdGlvbiA9IDA7XG4gICAgbGV0IHRvdWNoU3RhcnRUaW1lID0gMDtcbiAgICBsZXQgdmlld3BvcnRTdGF0ZTogYW55O1xuICAgIGxldCBzY3JvbGxpbmdTdGF0ZTogYW55O1xuICAgIGxldCBpc0VuYWJsZWQgPSBlbmFibGVkOyAvLyBUcmFjayBjdXJyZW50IGVuYWJsZWQgc3RhdGVcblxuICAgIC8vIEdldCByZWZlcmVuY2VzIGFmdGVyIGluaXRpYWxpemF0aW9uXG4gICAgY29uc3Qgb3JpZ2luYWxJbml0aWFsaXplID0gY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemU7XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbEluaXRpYWxpemUoKTtcbiAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBpbml0aWFsaXplZFxuICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdmlld3BvcnQgYW5kIHNjcm9sbGluZyBzdGF0ZXNcbiAgICAgIHZpZXdwb3J0U3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG4gICAgICBzY3JvbGxpbmdTdGF0ZSA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zY3JvbGxpbmdTdGF0ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIC8vIFN0b3AgbW9tZW50dW0gYW5pbWF0aW9uIChjYW4gYmUgY2FsbGVkIGV4dGVybmFsbHkpXG4gICAgY29uc3Qgc3RvcE1vbWVudHVtID0gKCkgPT4ge1xuICAgICAgaWYgKG1vbWVudHVtQW5pbWF0aW9uSWQpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUobW9tZW50dW1BbmltYXRpb25JZCk7XG4gICAgICAgIG1vbWVudHVtQW5pbWF0aW9uSWQgPSBudWxsO1xuICAgICAgICAvLyBSZXNldCB2ZWxvY2l0eSBpbiBzY3JvbGxpbmcgZmVhdHVyZVxuICAgICAgICBpZiAoc2Nyb2xsaW5nU3RhdGUpIHtcbiAgICAgICAgICBzY3JvbGxpbmdTdGF0ZS5zZXRWZWxvY2l0eVRvWmVybz8uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gU3RhcnQgbW9tZW50dW0gYW5pbWF0aW9uXG4gICAgY29uc3Qgc3RhcnRNb21lbnR1bSA9IChpbml0aWFsVmVsb2NpdHk6IG51bWJlcikgPT4ge1xuICAgICAgLy8gQ2FuY2VsIGFueSBleGlzdGluZyBtb21lbnR1bVxuICAgICAgaWYgKG1vbWVudHVtQW5pbWF0aW9uSWQpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUobW9tZW50dW1BbmltYXRpb25JZCk7XG4gICAgICB9XG5cbiAgICAgIGxldCB2ZWxvY2l0eSA9IGluaXRpYWxWZWxvY2l0eTtcblxuICAgICAgY29uc3QgYW5pbWF0ZSA9ICgpID0+IHtcbiAgICAgICAgLy8gQXBwbHkgZGVjZWxlcmF0aW9uXG4gICAgICAgIHZlbG9jaXR5ICo9IGRlY2VsZXJhdGlvbjtcblxuICAgICAgICAvLyBTdG9wIGlmIHZlbG9jaXR5IGlzIHRvbyBzbWFsbFxuICAgICAgICBpZiAoTWF0aC5hYnModmVsb2NpdHkpIDwgbWluVmVsb2NpdHkpIHtcbiAgICAgICAgICBtb21lbnR1bUFuaW1hdGlvbklkID0gbnVsbDtcbiAgICAgICAgICAvLyBSZXNldCB2ZWxvY2l0eSBpbiBzY3JvbGxpbmcgZmVhdHVyZVxuICAgICAgICAgIGlmIChzY3JvbGxpbmdTdGF0ZSkge1xuICAgICAgICAgICAgc2Nyb2xsaW5nU3RhdGUuc2V0VmVsb2NpdHlUb1plcm8/LigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxjdWxhdGUgc2Nyb2xsIGRlbHRhICh2ZWxvY2l0eSBpcyBpbiBweC9tcywgc28gbXVsdGlwbHkgYnkgZnJhbWUgdGltZSlcbiAgICAgICAgY29uc3QgZnJhbWVEZWx0YSA9IHZlbG9jaXR5ICogVklFV1BPUlRfQ09OU1RBTlRTLk1PTUVOVFVNLkZSQU1FX1RJTUU7XG5cbiAgICAgICAgLy8gVXNlIHNjcm9sbGluZyBmZWF0dXJlJ3MgQVBJIHRvIHVwZGF0ZSBwb3NpdGlvblxuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5KSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5KGZyYW1lRGVsdGEpO1xuXG4gICAgICAgICAgLy8gQ29udGludWUgYW5pbWF0aW9uXG4gICAgICAgICAgbW9tZW50dW1BbmltYXRpb25JZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBObyBzY3JvbGxCeSBtZXRob2QsIHN0b3AgbW9tZW50dW1cbiAgICAgICAgICBtb21lbnR1bUFuaW1hdGlvbklkID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgbW9tZW50dW1BbmltYXRpb25JZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTtcbiAgICB9O1xuXG4gICAgLy8gVG91Y2ggZXZlbnQgaGFuZGxlcnNcbiAgICBjb25zdCBoYW5kbGVUb3VjaFN0YXJ0ID0gKGU6IFRvdWNoRXZlbnQpID0+IHtcbiAgICAgIGlzVG91Y2hpbmcgPSB0cnVlO1xuICAgICAgY29uc3QgdG91Y2ggPSBlLnRvdWNoZXNbMF07XG4gICAgICBjb25zdCBvcmllbnRhdGlvbiA9IHZpZXdwb3J0U3RhdGU/Lm9yaWVudGF0aW9uIHx8IFwidmVydGljYWxcIjtcbiAgICAgIGxhc3RUb3VjaFBvc2l0aW9uID1cbiAgICAgICAgb3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIiA/IHRvdWNoLmNsaWVudFkgOiB0b3VjaC5jbGllbnRYO1xuICAgICAgdG91Y2hTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAvLyBDYW5jZWwgYW55IG9uZ29pbmcgbW9tZW50dW1cbiAgICAgIGlmIChtb21lbnR1bUFuaW1hdGlvbklkKSB7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKG1vbWVudHVtQW5pbWF0aW9uSWQpO1xuICAgICAgICBtb21lbnR1bUFuaW1hdGlvbklkID0gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlVG91Y2hNb3ZlID0gKGU6IFRvdWNoRXZlbnQpID0+IHtcbiAgICAgIGlmICghaXNUb3VjaGluZykgcmV0dXJuO1xuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7IC8vIFByZXZlbnQgbmF0aXZlIHNjcm9sbGluZ1xuXG4gICAgICBjb25zdCB0b3VjaCA9IGUudG91Y2hlc1swXTtcbiAgICAgIGNvbnN0IG9yaWVudGF0aW9uID0gdmlld3BvcnRTdGF0ZT8ub3JpZW50YXRpb24gfHwgXCJ2ZXJ0aWNhbFwiO1xuICAgICAgY29uc3QgY3VycmVudFBvc2l0aW9uID1cbiAgICAgICAgb3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIiA/IHRvdWNoLmNsaWVudFkgOiB0b3VjaC5jbGllbnRYO1xuICAgICAgY29uc3QgZGVsdGEgPSBsYXN0VG91Y2hQb3NpdGlvbiAtIGN1cnJlbnRQb3NpdGlvbjsgLy8gSW52ZXJ0ZWQgZm9yIG5hdHVyYWwgc2Nyb2xsaW5nXG4gICAgICBsYXN0VG91Y2hQb3NpdGlvbiA9IGN1cnJlbnRQb3NpdGlvbjtcblxuICAgICAgLy8gVXNlIHNjcm9sbGluZyBmZWF0dXJlJ3MgQVBJICgxOjEgdG91Y2gtdG8tc2Nyb2xsIGZvciBuYXR1cmFsIGZlZWwpXG4gICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5KSB7XG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxCeShkZWx0YSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZVRvdWNoRW5kID0gKCkgPT4ge1xuICAgICAgaWYgKCFpc1RvdWNoaW5nKSByZXR1cm47XG4gICAgICBpc1RvdWNoaW5nID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IHRvdWNoRW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB0b3VjaER1cmF0aW9uID0gdG91Y2hFbmRUaW1lIC0gdG91Y2hTdGFydFRpbWU7XG5cbiAgICAgIC8vIEdldCBjdXJyZW50IHZlbG9jaXR5IGZyb20gc2Nyb2xsaW5nIGZlYXR1cmVcbiAgICAgIGNvbnN0IHZlbG9jaXR5ID0gY29tcG9uZW50LnZpZXdwb3J0LmdldFZlbG9jaXR5Py4oKSB8fCAwO1xuXG4gICAgICAvLyBPbmx5IHN0YXJ0IG1vbWVudHVtIGlmIHRoZSB0b3VjaCB3YXMgcXVpY2sgZW5vdWdoIGFuZCB3ZSBoYXZlIHZlbG9jaXR5XG4gICAgICBpZiAoXG4gICAgICAgIHRvdWNoRHVyYXRpb24gPCBtaW5EdXJhdGlvbiAmJlxuICAgICAgICBNYXRoLmFicyh2ZWxvY2l0eSkgPiBtaW5WZWxvY2l0eVRocmVzaG9sZFxuICAgICAgKSB7XG4gICAgICAgIHN0YXJ0TW9tZW50dW0odmVsb2NpdHkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgY2xpY2sgdG8gc3RvcCBtb21lbnR1bSAod2l0aG91dCBwcmV2ZW50aW5nIHNlbGVjdGlvbilcbiAgICBjb25zdCBoYW5kbGVDbGljayA9IChfZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgc3RvcE1vbWVudHVtKCk7XG4gICAgfTtcblxuICAgIC8vIE1vdXNlIGV2ZW50IGhhbmRsZXJzIGZvciBkZXNrdG9wXG4gICAgY29uc3QgaGFuZGxlTW91c2VEb3duID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlzTW91c2VEcmFnZ2luZyA9IHRydWU7XG4gICAgICBjb25zdCBvcmllbnRhdGlvbiA9IHZpZXdwb3J0U3RhdGU/Lm9yaWVudGF0aW9uIHx8IFwidmVydGljYWxcIjtcbiAgICAgIGxhc3RNb3VzZVBvc2l0aW9uID0gb3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIiA/IGUuY2xpZW50WSA6IGUuY2xpZW50WDtcbiAgICAgIHRvdWNoU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgICAgLy8gQ2FuY2VsIGFueSBvbmdvaW5nIG1vbWVudHVtXG4gICAgICBzdG9wTW9tZW50dW0oKTtcblxuICAgICAgLy8gUHJldmVudCB0ZXh0IHNlbGVjdGlvblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZU1vdmUgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaWYgKCFpc01vdXNlRHJhZ2dpbmcpIHJldHVybjtcblxuICAgICAgY29uc3Qgb3JpZW50YXRpb24gPSB2aWV3cG9ydFN0YXRlPy5vcmllbnRhdGlvbiB8fCBcInZlcnRpY2FsXCI7XG4gICAgICBjb25zdCBjdXJyZW50UG9zaXRpb24gPVxuICAgICAgICBvcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiID8gZS5jbGllbnRZIDogZS5jbGllbnRYO1xuICAgICAgY29uc3QgZGVsdGEgPSBsYXN0TW91c2VQb3NpdGlvbiAtIGN1cnJlbnRQb3NpdGlvbjtcbiAgICAgIGxhc3RNb3VzZVBvc2l0aW9uID0gY3VycmVudFBvc2l0aW9uO1xuXG4gICAgICAvLyBVc2Ugc2Nyb2xsaW5nIGZlYXR1cmUncyBBUEkgKDE6MSBkcmFnLXRvLXNjcm9sbCBmb3IgbmF0dXJhbCBmZWVsKVxuICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxCeSkge1xuICAgICAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsQnkoZGVsdGEpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZVVwID0gKCkgPT4ge1xuICAgICAgaWYgKCFpc01vdXNlRHJhZ2dpbmcpIHJldHVybjtcbiAgICAgIGlzTW91c2VEcmFnZ2luZyA9IGZhbHNlO1xuXG4gICAgICBjb25zdCBtb3VzZVVwVGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBkcmFnRHVyYXRpb24gPSBtb3VzZVVwVGltZSAtIHRvdWNoU3RhcnRUaW1lO1xuXG4gICAgICAvLyBHZXQgY3VycmVudCB2ZWxvY2l0eSBmcm9tIHNjcm9sbGluZyBmZWF0dXJlXG4gICAgICBjb25zdCB2ZWxvY2l0eSA9IGNvbXBvbmVudC52aWV3cG9ydC5nZXRWZWxvY2l0eT8uKCkgfHwgMDtcblxuICAgICAgLy8gU3RhcnQgbW9tZW50dW0gZm9yIHF1aWNrIGRyYWdzXG4gICAgICBpZiAoXG4gICAgICAgIGRyYWdEdXJhdGlvbiA8IG1pbkR1cmF0aW9uICYmXG4gICAgICAgIE1hdGguYWJzKHZlbG9jaXR5KSA+IG1pblZlbG9jaXR5VGhyZXNob2xkXG4gICAgICApIHtcbiAgICAgICAgc3RhcnRNb21lbnR1bSh2ZWxvY2l0eSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIE92ZXJyaWRlIGluaXRpYWxpemUgdG8gYWRkIGV2ZW50IGxpc3RlbmVyc1xuICAgIGNvbnN0IG9yaWdpbmFsSW5pdCA9IGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplO1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplID0gKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gb3JpZ2luYWxJbml0KCk7XG4gICAgICAvLyBTa2lwIGlmIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgdmlld3BvcnRFbGVtZW50ID1cbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLnZpZXdwb3J0RWxlbWVudCB8fFxuICAgICAgICAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU/LnZpZXdwb3J0RWxlbWVudDtcblxuICAgICAgaWYgKHZpZXdwb3J0RWxlbWVudCkge1xuICAgICAgICAvLyBUb3VjaCBldmVudHNcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsIGhhbmRsZVRvdWNoU3RhcnQsIHtcbiAgICAgICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgaGFuZGxlVG91Y2hNb3ZlLCB7XG4gICAgICAgICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIGhhbmRsZVRvdWNoRW5kLCB7XG4gICAgICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTW91c2UgZXZlbnRzIGZvciBkZXNrdG9wIGRyYWdnaW5nXG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGhhbmRsZU1vdXNlRG93bik7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBoYW5kbGVNb3VzZVVwKTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIGhhbmRsZU1vdXNlVXApO1xuXG4gICAgICAgIC8vIEFkZCBjbGljayBsaXN0ZW5lciB0byBzdG9wIG1vbWVudHVtIG9uIGNsaWNrICh3aXRob3V0IGJsb2NraW5nIHNlbGVjdGlvbilcbiAgICAgICAgaWYgKHN0b3BPbkNsaWNrKSB7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVDbGljayk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdG9yZSByZWZlcmVuY2UgZm9yIGNsZWFudXBcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLl9tb21lbnR1bVZpZXdwb3J0RWxlbWVudCA9IHZpZXdwb3J0RWxlbWVudDtcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLl9tb21lbnR1bVN0b3BPbkNsaWNrID0gc3RvcE9uQ2xpY2s7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIENsZWFuIHVwIG9uIGRlc3Ryb3lcbiAgICBpZiAoXCJkZXN0cm95XCIgaW4gY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQuZGVzdHJveTtcbiAgICAgIGNvbXBvbmVudC5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAvLyBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0RWxlbWVudCA9IChjb21wb25lbnQgYXMgYW55KS5fbW9tZW50dW1WaWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgaGFuZGxlVG91Y2hTdGFydCk7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgaGFuZGxlVG91Y2hNb3ZlKTtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIGhhbmRsZVRvdWNoRW5kKTtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBoYW5kbGVNb3VzZURvd24pO1xuICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCBoYW5kbGVNb3VzZVVwKTtcbiAgICAgICAgICBpZiAoKGNvbXBvbmVudCBhcyBhbnkpLl9tb21lbnR1bVN0b3BPbkNsaWNrKSB7XG4gICAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNsaWNrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYW5jZWwgbW9tZW50dW0gYW5pbWF0aW9uXG4gICAgICAgIHN0b3BNb21lbnR1bSgpO1xuXG4gICAgICAgIG9yaWdpbmFsRGVzdHJveSgpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBFeHBvc2UgbW9tZW50dW0gc3RhdGUgZm9yIG90aGVyIGZlYXR1cmVzXG4gICAgKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLm1vbWVudHVtU3RhdGUgPSB7XG4gICAgICBzdG9wTW9tZW50dW0sXG4gICAgfTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9zY3JvbGxiYXIudHNcblxuLyoqXG4gKiBTY3JvbGxiYXIgRmVhdHVyZSAtIEN1c3RvbSBzY3JvbGxiYXIgaW1wbGVtZW50YXRpb25cbiAqIFByb3ZpZGVzIHZpc3VhbCBzY3JvbGwgaW5kaWNhdGlvbiBhbmQgZHJhZy10by1zY3JvbGwgZnVuY3Rpb25hbGl0eVxuICovXG5cbmltcG9ydCB0eXBlIHsgVmlld3BvcnRDb250ZXh0LCBWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgd3JhcEluaXRpYWxpemUsIHdyYXBEZXN0cm95LCBzdG9yZUZlYXR1cmVGdW5jdGlvbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBQUkVGSVgsIGFkZENsYXNzLCByZW1vdmVDbGFzcyB9IGZyb20gXCJtdHJsXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Nyb2xsYmFyQ29uZmlnIHtcbiAgZW5hYmxlZD86IGJvb2xlYW47XG4gIGF1dG9IaWRlPzogYm9vbGVhbjtcbiAgdGh1bWJNaW5IZWlnaHQ/OiBudW1iZXI7XG4gIHRodW1iQ29sb3I/OiBzdHJpbmc7XG4gIHRyYWNrQ29sb3I/OiBzdHJpbmc7XG4gIGJvcmRlclJhZGl1cz86IG51bWJlcjtcbiAgZmFkZVRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Nyb2xsYmFyQ29tcG9uZW50IHtcbiAgc2Nyb2xsYmFyOiB7XG4gICAgc2hvdzogKCkgPT4gdm9pZDtcbiAgICBoaWRlOiAoKSA9PiB2b2lkO1xuICAgIHVwZGF0ZUJvdW5kczogKHRvdGFsVmlydHVhbFNpemU6IG51bWJlciwgY29udGFpbmVyU2l6ZTogbnVtYmVyKSA9PiB2b2lkO1xuICAgIHVwZGF0ZVBvc2l0aW9uOiAoc2Nyb2xsUG9zaXRpb246IG51bWJlcikgPT4gdm9pZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBBZGRzIHNjcm9sbGJhciBmdW5jdGlvbmFsaXR5IHRvIHZpZXdwb3J0IGNvbXBvbmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFNjcm9sbGJhcihjb25maWc6IFNjcm9sbGJhckNvbmZpZyA9IHt9KSB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50PihcbiAgICBjb21wb25lbnQ6IFRcbiAgKTogVCAmIFNjcm9sbGJhckNvbXBvbmVudCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZW5hYmxlZCA9IHRydWUsXG4gICAgICBhdXRvSGlkZSA9IHRydWUsXG4gICAgICB0aHVtYk1pbkhlaWdodCA9IDI1LFxuICAgICAgYm9yZGVyUmFkaXVzID0gNCxcbiAgICAgIGZhZGVUaW1lb3V0ID0gMTAwMCxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gUmV0dXJuIG5vLW9wIGlmIGRpc2FibGVkXG4gICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jb21wb25lbnQsXG4gICAgICAgIHNjcm9sbGJhcjoge1xuICAgICAgICAgIHNob3c6ICgpID0+IHt9LFxuICAgICAgICAgIGhpZGU6ICgpID0+IHt9LFxuICAgICAgICAgIHVwZGF0ZUJvdW5kczogKCkgPT4ge30sXG4gICAgICAgICAgdXBkYXRlUG9zaXRpb246ICgpID0+IHt9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBTdGF0ZVxuICAgIGxldCB2aWV3cG9ydEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHNjcm9sbGJhclRyYWNrOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGxldCBzY3JvbGxiYXJUaHVtYjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIGxldCBpc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgbGV0IGRyYWdTdGFydFkgPSAwO1xuICAgIGxldCBkcmFnU3RhcnRTY3JvbGxQb3NpdGlvbiA9IDA7XG4gICAgbGV0IGhpZGVUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICAgIGxldCB0b3RhbFZpcnR1YWxTaXplID0gMDtcbiAgICBsZXQgY29udGFpbmVyU2l6ZSA9IDA7XG4gICAgbGV0IHRodW1iSGVpZ2h0ID0gMDtcbiAgICBsZXQgYW5pbWF0aW9uRnJhbWVJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGlzQ3Vyc29yTW9kZSA9IGZhbHNlO1xuICAgIGxldCBsb2FkZWRJdGVtc0NvdW50ID0gMDtcblxuICAgIC8vIENyZWF0ZSBzY3JvbGxiYXIgZWxlbWVudHNcbiAgICBjb25zdCBjcmVhdGVTY3JvbGxiYXJFbGVtZW50cyA9ICgpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRFbGVtZW50KSByZXR1cm47XG5cbiAgICAgIHNjcm9sbGJhclRyYWNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGFkZENsYXNzKHNjcm9sbGJhclRyYWNrLCBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSKTtcbiAgICAgIHNjcm9sbGJhclRyYWNrLnN0eWxlLmNzc1RleHQgPSBgXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICB6LWluZGV4OiAxMDtcbiAgICAgIGA7XG5cbiAgICAgIHNjcm9sbGJhclRodW1iID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgICAgYWRkQ2xhc3MoXG4gICAgICAgIHNjcm9sbGJhclRodW1iLFxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX1RIVU1CXG4gICAgICApO1xuXG4gICAgICBzY3JvbGxiYXJUcmFjay5hcHBlbmRDaGlsZChzY3JvbGxiYXJUaHVtYik7XG4gICAgICB2aWV3cG9ydEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2Nyb2xsYmFyVHJhY2spO1xuICAgIH07XG5cbiAgICAvLyBTaG93L2hpZGUgZnVuY3Rpb25zXG4gICAgY29uc3Qgc2hvdyA9ICgpID0+IHtcbiAgICAgIGlmICghc2Nyb2xsYmFyVHJhY2sgfHwgdG90YWxWaXJ0dWFsU2l6ZSA8PSBjb250YWluZXJTaXplKSByZXR1cm47XG5cbiAgICAgIGlmIChoaWRlVGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQoaGlkZVRpbWVvdXQpO1xuICAgICAgICBoaWRlVGltZW91dCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBzY3JvbGxiYXJUcmFjayxcbiAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlNDUk9MTEJBUi5DTEFTU0VTLlNDUk9MTEJBUl9WSVNJQkxFXG4gICAgICApO1xuXG4gICAgICBpZiAoYXV0b0hpZGUgJiYgIWlzRHJhZ2dpbmcpIHtcbiAgICAgICAgaGlkZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGhpZGUsIGZhZGVUaW1lb3V0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGlkZSA9ICgpID0+IHtcbiAgICAgIGlmICghc2Nyb2xsYmFyVHJhY2sgfHwgaXNEcmFnZ2luZykgcmV0dXJuO1xuICAgICAgcmVtb3ZlQ2xhc3MoXG4gICAgICAgIHNjcm9sbGJhclRyYWNrLFxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX1ZJU0lCTEVcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSBzY3JvbGxiYXIgYm91bmRzXG4gICAgY29uc3QgdXBkYXRlQm91bmRzID0gKG5ld1RvdGFsU2l6ZTogbnVtYmVyLCBuZXdDb250YWluZXJTaXplOiBudW1iZXIpID0+IHtcbiAgICAgIHRvdGFsVmlydHVhbFNpemUgPSBuZXdUb3RhbFNpemU7XG4gICAgICBjb250YWluZXJTaXplID0gbmV3Q29udGFpbmVyU2l6ZTtcblxuICAgICAgaWYgKCFzY3JvbGxiYXJUcmFjayB8fCAhc2Nyb2xsYmFyVGh1bWIpIHJldHVybjtcblxuICAgICAgY29uc3QgbmVlZHNTY3JvbGxiYXIgPSB0b3RhbFZpcnR1YWxTaXplID4gY29udGFpbmVyU2l6ZTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGJhcl0gdXBkYXRlQm91bmRzOiB0b3RhbFNpemU9JHt0b3RhbFZpcnR1YWxTaXplfSwgY29udGFpbmVyU2l6ZT0ke2NvbnRhaW5lclNpemV9LCBuZWVkc1Njcm9sbGJhcj0ke25lZWRzU2Nyb2xsYmFyfWBcbiAgICAgIC8vICk7XG4gICAgICBzY3JvbGxiYXJUcmFjay5zdHlsZS5kaXNwbGF5ID0gbmVlZHNTY3JvbGxiYXIgPyBcImJsb2NrXCIgOiBcIm5vbmVcIjtcblxuICAgICAgaWYgKG5lZWRzU2Nyb2xsYmFyKSB7XG4gICAgICAgIGxldCBzY3JvbGxSYXRpbzogbnVtYmVyO1xuXG4gICAgICAgIGlmIChpc0N1cnNvck1vZGUgJiYgbG9hZGVkSXRlbXNDb3VudCA+IDApIHtcbiAgICAgICAgICAvLyBGb3IgY3Vyc29yIG1vZGUsIHRodW1iIHNpemUgcmVwcmVzZW50cyBsb2FkZWQgY29udGVudCB2cyBlc3RpbWF0ZWQgdG90YWxcbiAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBrbm93IHRvdGFsLCB1c2UgbG9hZGVkIGl0ZW1zICogMiBhcyBlc3RpbWF0ZVxuICAgICAgICAgIGNvbnN0IGVzdGltYXRlZFRvdGFsID1cbiAgICAgICAgICAgIHRvdGFsVmlydHVhbFNpemUgPiAwID8gdG90YWxWaXJ0dWFsU2l6ZSA6IGxvYWRlZEl0ZW1zQ291bnQgKiAyO1xuICAgICAgICAgIHNjcm9sbFJhdGlvID1cbiAgICAgICAgICAgIGNvbnRhaW5lclNpemUgL1xuICAgICAgICAgICAgTWF0aC5tYXgoZXN0aW1hdGVkVG90YWwsIGxvYWRlZEl0ZW1zQ291bnQgKyBjb250YWluZXJTaXplKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBOb3JtYWwgY2FsY3VsYXRpb24gZm9yIG9mZnNldC9wYWdlIHN0cmF0ZWdpZXNcbiAgICAgICAgICBzY3JvbGxSYXRpbyA9IGNvbnRhaW5lclNpemUgLyB0b3RhbFZpcnR1YWxTaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgdGh1bWJIZWlnaHQgPSBNYXRoLm1heCh0aHVtYk1pbkhlaWdodCwgc2Nyb2xsUmF0aW8gKiBjb250YWluZXJTaXplKTtcbiAgICAgICAgc2Nyb2xsYmFyVGh1bWIuc3R5bGUuaGVpZ2h0ID0gYCR7dGh1bWJIZWlnaHR9cHhgO1xuICAgICAgICB1cGRhdGVQb3NpdGlvbihjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSB0aHVtYiBwb3NpdGlvblxuICAgIGNvbnN0IHVwZGF0ZVBvc2l0aW9uID0gKHNjcm9sbFBvczogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoIXNjcm9sbGJhclRodW1iIHx8ICFzY3JvbGxiYXJUcmFjaykgcmV0dXJuO1xuXG4gICAgICBjb25zdCBzY3JvbGxhYmxlRGlzdGFuY2UgPSB0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZTtcbiAgICAgIGlmIChzY3JvbGxhYmxlRGlzdGFuY2UgPD0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IE1hdGgubWluKFxuICAgICAgICAxLFxuICAgICAgICBNYXRoLm1heCgwLCBzY3JvbGxQb3MgLyBzY3JvbGxhYmxlRGlzdGFuY2UpXG4gICAgICApO1xuICAgICAgY29uc3QgbWF4VGh1bWJQb3NpdGlvbiA9XG4gICAgICAgIHNjcm9sbGJhclRyYWNrLmNsaWVudEhlaWdodCAtIHNjcm9sbGJhclRodW1iLmNsaWVudEhlaWdodDtcbiAgICAgIGNvbnN0IHRodW1iUG9zaXRpb24gPSBzY3JvbGxSYXRpbyAqIG1heFRodW1iUG9zaXRpb247XG5cbiAgICAgIHNjcm9sbGJhclRodW1iLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7dGh1bWJQb3NpdGlvbn1weClgO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgdHJhY2sgY2xpY2tcbiAgICBjb25zdCBoYW5kbGVUcmFja0NsaWNrID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICghc2Nyb2xsYmFyVHJhY2sgfHwgIXNjcm9sbGJhclRodW1iIHx8IGUudGFyZ2V0ID09PSBzY3JvbGxiYXJUaHVtYilcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0cmFja1JlY3QgPSBzY3JvbGxiYXJUcmFjay5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IGNsaWNrWSA9IGUuY2xpZW50WSAtIHRyYWNrUmVjdC50b3A7XG4gICAgICBjb25zdCB0aHVtYkNlbnRlclkgPSBjbGlja1kgLSB0aHVtYkhlaWdodCAvIDI7XG4gICAgICBjb25zdCBtYXhUaHVtYlBvc2l0aW9uID0gY29udGFpbmVyU2l6ZSAtIHRodW1iSGVpZ2h0O1xuICAgICAgY29uc3QgdGh1bWJQb3NpdGlvbiA9IE1hdGgubWF4KFxuICAgICAgICAwLFxuICAgICAgICBNYXRoLm1pbih0aHVtYkNlbnRlclksIG1heFRodW1iUG9zaXRpb24pXG4gICAgICApO1xuICAgICAgY29uc3Qgc2Nyb2xsUmF0aW8gPSB0aHVtYlBvc2l0aW9uIC8gbWF4VGh1bWJQb3NpdGlvbjtcbiAgICAgIGNvbnN0IHRhcmdldFNjcm9sbFBvc2l0aW9uID1cbiAgICAgICAgc2Nyb2xsUmF0aW8gKiAodG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuXG4gICAgICBjb21wb25lbnQudmlld3BvcnQ/LnNjcm9sbFRvUG9zaXRpb24odGFyZ2V0U2Nyb2xsUG9zaXRpb24pO1xuICAgIH07XG5cbiAgICAvLyBNb3VzZSBldmVudCBoYW5kbGVyc1xuICAgIGNvbnN0IGhhbmRsZVRodW1iTW91c2VEb3duID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgZHJhZ1N0YXJ0WSA9IGUuY2xpZW50WTtcbiAgICAgIGRyYWdTdGFydFNjcm9sbFBvc2l0aW9uID0gY29tcG9uZW50LnZpZXdwb3J0Py5nZXRTY3JvbGxQb3NpdGlvbigpIHx8IDA7XG5cbiAgICAgIGlmIChzY3JvbGxiYXJUcmFjaykge1xuICAgICAgICBhZGRDbGFzcyhcbiAgICAgICAgICBzY3JvbGxiYXJUcmFjayxcbiAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX0RSQUdHSU5HXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQgZHJhZyBzdGFydCBldmVudCB0byBub3RpZnkgdmlld3BvcnRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpkcmFnLXN0YXJ0XCIsIHtcbiAgICAgICAgc291cmNlOiBcInNjcm9sbGJhclwiLFxuICAgICAgICBzdGFydFBvc2l0aW9uOiBkcmFnU3RhcnRTY3JvbGxQb3NpdGlvbixcbiAgICAgIH0pO1xuXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBoYW5kbGVNb3VzZVVwKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlTW91c2VNb3ZlID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICghaXNEcmFnZ2luZyB8fCAhc2Nyb2xsYmFyVHJhY2sgfHwgIXNjcm9sbGJhclRodW1iKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGRlbHRhWSA9IGUuY2xpZW50WSAtIGRyYWdTdGFydFk7XG4gICAgICBjb25zdCB0cmFja0hlaWdodCA9IHNjcm9sbGJhclRyYWNrLmNsaWVudEhlaWdodDtcbiAgICAgIGNvbnN0IHRodW1iSGVpZ2h0ID0gc2Nyb2xsYmFyVGh1bWIuY2xpZW50SGVpZ2h0O1xuICAgICAgY29uc3QgbWF4VGh1bWJUcmF2ZWwgPSB0cmFja0hlaWdodCAtIHRodW1iSGVpZ2h0O1xuXG4gICAgICBpZiAobWF4VGh1bWJUcmF2ZWwgPD0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBkZWx0YVJhdGlvID0gZGVsdGFZIC8gbWF4VGh1bWJUcmF2ZWw7XG4gICAgICBjb25zdCBkcmFnU3RhcnRTY3JvbGxSYXRpbyA9XG4gICAgICAgIGRyYWdTdGFydFNjcm9sbFBvc2l0aW9uIC8gKHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplKTtcbiAgICAgIGNvbnN0IG5ld1Njcm9sbFJhdGlvID0gTWF0aC5tYXgoXG4gICAgICAgIDAsXG4gICAgICAgIE1hdGgubWluKDEsIGRyYWdTdGFydFNjcm9sbFJhdGlvICsgZGVsdGFSYXRpbylcbiAgICAgICk7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aHVtYiBwb3NpdGlvbiBpbW1lZGlhdGVseVxuICAgICAgY29uc3QgdGh1bWJQb3NpdGlvbiA9IG5ld1Njcm9sbFJhdGlvICogbWF4VGh1bWJUcmF2ZWw7XG4gICAgICBzY3JvbGxiYXJUaHVtYi5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke3RodW1iUG9zaXRpb259cHgpYDtcblxuICAgICAgLy8gQ2FsY3VsYXRlIG5ldyBzY3JvbGwgcG9zaXRpb25cbiAgICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gbmV3U2Nyb2xsUmF0aW8gKiAodG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuICAgICAgbGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uID0gbmV3UG9zaXRpb247XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGJhcl0gTW91c2UgbW92ZTogbmV3UG9zPSR7bmV3UG9zaXRpb24udG9GaXhlZChcbiAgICAgIC8vICAgICAwXG4gICAgICAvLyAgICl9LCBhbmltYXRpb25GcmFtZUlkPSR7YW5pbWF0aW9uRnJhbWVJZH1gXG4gICAgICAvLyApO1xuXG4gICAgICAvLyBUaHJvdHRsZSB2aWV3cG9ydCB1cGRhdGVzXG4gICAgICBpZiAoYW5pbWF0aW9uRnJhbWVJZCA9PT0gbnVsbCAmJiBjb21wb25lbnQudmlld3BvcnQpIHtcbiAgICAgICAgYW5pbWF0aW9uRnJhbWVJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW1Njcm9sbGJhcl0gUkFGIGNhbGxiYWNrOiBzY3JvbGxpbmcgdG8gJHtsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb259YFxuICAgICAgICAgIC8vICk7XG4gICAgICAgICAgaWYgKGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbiAhPT0gbnVsbCAmJiBjb21wb25lbnQudmlld3BvcnQpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb1Bvc2l0aW9uKGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFuaW1hdGlvbkZyYW1lSWQgPSBudWxsO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlTW91c2VVcCA9ICgpID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1Njcm9sbGJhcl0gTW91c2UgdXAgLSBlbmRpbmcgZHJhZ1wiKTtcbiAgICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcblxuICAgICAgaWYgKGFuaW1hdGlvbkZyYW1lSWQgIT09IG51bGwpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoYW5pbWF0aW9uRnJhbWVJZCk7XG4gICAgICAgIGFuaW1hdGlvbkZyYW1lSWQgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAobGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uICE9PSBudWxsICYmIGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9Qb3NpdGlvbihsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb24pO1xuICAgICAgICBsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb24gPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2Nyb2xsYmFyVHJhY2spIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3MoXG4gICAgICAgICAgc2Nyb2xsYmFyVHJhY2ssXG4gICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlNDUk9MTEJBUi5DTEFTU0VTLlNDUk9MTEJBUl9EUkFHR0lOR1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBFbWl0IGRyYWcgZW5kIGV2ZW50XG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6ZHJhZy1lbmRcIiwge1xuICAgICAgICBzb3VyY2U6IFwic2Nyb2xsYmFyXCIsXG4gICAgICAgIGVuZFBvc2l0aW9uOiBjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMCxcbiAgICAgIH0pO1xuXG4gICAgICBoaWRlKCk7XG5cbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXplIGZ1bmN0aW9uXG4gICAgY29uc3QgaW5pdGlhbGl6ZSA9ICgpID0+IHtcbiAgICAgIGlmIChpc0luaXRpYWxpemVkKSByZXR1cm47XG5cbiAgICAgIHZpZXdwb3J0RWxlbWVudCA9IGNvbXBvbmVudC5lbGVtZW50Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBgLiR7UFJFRklYfS12aWV3cG9ydGBcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgIGlmICghdmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIltTY3JvbGxiYXJdIE5vIHZpZXdwb3J0IGVsZW1lbnQgZm91bmRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICB2aWV3cG9ydEVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBgLiR7UFJFRklYfS0ke1ZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJ9YFxuICAgICAgICApXG4gICAgICApXG4gICAgICAgIHJldHVybjtcblxuICAgICAgY3JlYXRlU2Nyb2xsYmFyRWxlbWVudHMoKTtcbiAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgICBpZiAoc2Nyb2xsYmFyVHJhY2sgJiYgdmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgIHNjcm9sbGJhclRyYWNrLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVUcmFja0NsaWNrKTtcblxuICAgICAgICBpZiAoc2Nyb2xsYmFyVGh1bWIpIHtcbiAgICAgICAgICBzY3JvbGxiYXJUaHVtYi5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGhhbmRsZVRodW1iTW91c2VEb3duKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VlbnRlclwiLCBzaG93LCB7IHBhc3NpdmU6IHRydWUgfSk7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgIFwibW91c2VsZWF2ZVwiLFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIGlmICghaXNEcmFnZ2luZykgaGlkZSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBwYXNzaXZlOiB0cnVlIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIGN1cnJlbnQgdmlld3BvcnQgc3RhdGVcbiAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQpIHtcbiAgICAgICAgY29uc3QgaW5mbyA9IGNvbXBvbmVudC52aWV3cG9ydC5nZXRWaWV3cG9ydEluZm8oKTtcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9IGluZm8udG90YWxWaXJ0dWFsU2l6ZTtcbiAgICAgICAgY29udGFpbmVyU2l6ZSA9IGluZm8uY29udGFpbmVyU2l6ZTtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBpbiBjdXJzb3IgbW9kZVxuICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb247XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0Q29uZmlnID0gKGNvbXBvbmVudCBhcyBhbnkpLmNvbmZpZztcbiAgICAgICAgaXNDdXJzb3JNb2RlID0gdmlld3BvcnRDb25maWc/LnBhZ2luYXRpb24/LnN0cmF0ZWd5ID09PSBcImN1cnNvclwiO1xuXG4gICAgICAgIHVwZGF0ZUJvdW5kcyh0b3RhbFZpcnR1YWxTaXplLCBjb250YWluZXJTaXplKTtcbiAgICAgICAgdXBkYXRlUG9zaXRpb24oY29tcG9uZW50LnZpZXdwb3J0LmdldFNjcm9sbFBvc2l0aW9uKCkpO1xuICAgICAgfVxuXG4gICAgICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6c2Nyb2xsXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFpc0RyYWdnaW5nKSB7XG4gICAgICAgICAgdXBkYXRlUG9zaXRpb24oZGF0YS5wb3NpdGlvbik7XG4gICAgICAgICAgc2hvdygpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDp2aXJ0dWFsLXNpemUtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRvdGFsVmlydHVhbFNpemUgPSBkYXRhLnRvdGFsVmlydHVhbFNpemU7XG4gICAgICAgIHVwZGF0ZUJvdW5kcyhkYXRhLnRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6Y29udGFpbmVyLXNpemUtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnRhaW5lclNpemUgPSBkYXRhLmNvbnRhaW5lclNpemU7XG4gICAgICAgIHVwZGF0ZUJvdW5kcyh0b3RhbFZpcnR1YWxTaXplLCBkYXRhLmNvbnRhaW5lclNpemUpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgaXRlbXMgbG9hZGVkIHRvIHVwZGF0ZSBzY3JvbGxiYXIgaW4gY3Vyc29yIG1vZGVcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6aXRlbXMtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChpc0N1cnNvck1vZGUpIHtcbiAgICAgICAgICBsb2FkZWRJdGVtc0NvdW50ID0gZGF0YS5sb2FkZWRDb3VudCB8fCAwO1xuICAgICAgICAgIHVwZGF0ZUJvdW5kcyh0b3RhbFZpcnR1YWxTaXplLCBjb250YWluZXJTaXplKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgdG90YWwgaXRlbXMgY2hhbmdlcyAoaW1wb3J0YW50IGZvciBjdXJzb3IgbW9kZSlcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChpc0N1cnNvck1vZGUgJiYgZGF0YS50b3RhbCkge1xuICAgICAgICAgIC8vIEluIGN1cnNvciBtb2RlLCB0aGUgdG90YWwgaXMgZHluYW1pY1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYFtTY3JvbGxiYXJdIEN1cnNvciBtb2RlOiB1cGRhdGluZyBib3VuZHMgZm9yIG5ldyB0b3RhbCAke2RhdGEudG90YWx9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgdXBkYXRlQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gU3RvcmUgaW5pdGlhbGl6ZSBmdW5jdGlvblxuICAgIHN0b3JlRmVhdHVyZUZ1bmN0aW9uKGNvbXBvbmVudCwgXCJfc2Nyb2xsYmFySW5pdGlhbGl6ZVwiLCBpbml0aWFsaXplKTtcblxuICAgIC8vIEhvb2sgaW50byB2aWV3cG9ydCBpbml0aWFsaXphdGlvblxuICAgIHdyYXBJbml0aWFsaXplKGNvbXBvbmVudCwgaW5pdGlhbGl6ZSk7XG5cbiAgICAvLyBDbGVhbnVwXG4gICAgY29uc3QgZGVzdHJveSA9ICgpID0+IHtcbiAgICAgIGlmIChzY3JvbGxiYXJUcmFjaykge1xuICAgICAgICBzY3JvbGxiYXJUcmFjay5yZW1vdmUoKTtcbiAgICAgICAgc2Nyb2xsYmFyVHJhY2sgPSBudWxsO1xuICAgICAgfVxuICAgICAgc2Nyb2xsYmFyVGh1bWIgPSBudWxsO1xuICAgICAgdmlld3BvcnRFbGVtZW50ID0gbnVsbDtcbiAgICAgIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAgICAgaWYgKGhpZGVUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dChoaWRlVGltZW91dCk7XG4gICAgICAgIGhpZGVUaW1lb3V0ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgaGFuZGxlTW91c2VVcCk7XG4gICAgfTtcblxuICAgIHN0b3JlRmVhdHVyZUZ1bmN0aW9uKGNvbXBvbmVudCwgXCJfc2Nyb2xsYmFyRGVzdHJveVwiLCBkZXN0cm95KTtcbiAgICB3cmFwRGVzdHJveShjb21wb25lbnQsIGRlc3Ryb3kpO1xuXG4gICAgLy8gUmV0dXJuIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBzY3JvbGxiYXI6IHsgc2hvdywgaGlkZSwgdXBkYXRlQm91bmRzLCB1cGRhdGVQb3NpdGlvbiB9LFxuICAgIH07XG4gIH07XG59XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2NvbGxlY3Rpb24udHNcblxuLyoqXG4gKiBDb2xsZWN0aW9uIEZlYXR1cmUgLSBEYXRhIG1hbmFnZW1lbnQgYW5kIHJhbmdlIGxvYWRpbmdcbiAqIEhhbmRsZXMgY29sbGVjdGlvbiBpbnRlZ3JhdGlvbiwgcGFnaW5hdGlvbiwgYW5kIGRhdGEgZmV0Y2hpbmdcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHdyYXBEZXN0cm95IH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0aW9uQ29uZmlnIHtcbiAgY29sbGVjdGlvbj86IGFueTsgLy8gQ29sbGVjdGlvbiBhZGFwdGVyXG4gIHJhbmdlU2l6ZT86IG51bWJlcjsgLy8gRGVmYXVsdCByYW5nZSBzaXplIGZvciBsb2FkaW5nXG4gIHN0cmF0ZWd5PzogXCJvZmZzZXRcIiB8IFwicGFnZVwiIHwgXCJjdXJzb3JcIjsgLy8gTG9hZGluZyBzdHJhdGVneVxuICB0cmFuc2Zvcm0/OiAoaXRlbTogYW55KSA9PiBhbnk7IC8vIEl0ZW0gdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25cbiAgY2FuY2VsTG9hZFRocmVzaG9sZD86IG51bWJlcjsgLy8gVmVsb2NpdHkgdGhyZXNob2xkIGZvciBjYW5jZWxsaW5nIGxvYWRzXG4gIG1heENvbmN1cnJlbnRSZXF1ZXN0cz86IG51bWJlcjtcbiAgZW5hYmxlUmVxdWVzdFF1ZXVlPzogYm9vbGVhbjtcbiAgbWF4UXVldWVTaXplPzogbnVtYmVyO1xuICBsb2FkT25EcmFnRW5kPzogYm9vbGVhbjsgLy8gRW5hYmxlIGxvYWRpbmcgd2hlbiBkcmFnIGVuZHMgKHNhZmV0eSBtZWFzdXJlKVxuICBpbml0aWFsU2Nyb2xsSW5kZXg/OiBudW1iZXI7IC8vIEluaXRpYWwgc2Nyb2xsIHBvc2l0aW9uICgwLWJhc2VkIGluZGV4KVxuICBzZWxlY3RJZD86IHN0cmluZyB8IG51bWJlcjsgLy8gSUQgb2YgaXRlbSB0byBzZWxlY3QgYWZ0ZXIgaW5pdGlhbCBsb2FkIGNvbXBsZXRlc1xuICBhdXRvTG9hZD86IGJvb2xlYW47IC8vIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBsb2FkIGRhdGEgb24gaW5pdGlhbGl6YXRpb24gKGRlZmF1bHQ6IHRydWUpXG4gIGF1dG9TZWxlY3RGaXJzdD86IGJvb2xlYW47IC8vIEF1dG9tYXRpY2FsbHkgc2VsZWN0IGZpcnN0IGl0ZW0gYWZ0ZXIgaW5pdGlhbCBsb2FkIChkZWZhdWx0OiBmYWxzZSlcbiAgLyoqIE1heGltdW0gaXRlbXMgdG8ga2VlcCBpbiBtZW1vcnkgKGRlZmF1bHQ6IDEwMDApICovXG4gIG1heENhY2hlZEl0ZW1zPzogbnVtYmVyO1xuICAvKiogRXh0cmEgaXRlbXMgdG8ga2VlcCBhcm91bmQgdmlzaWJsZSByYW5nZSBkdXJpbmcgZXZpY3Rpb24gKGRlZmF1bHQ6IDE1MCkgKi9cbiAgZXZpY3Rpb25CdWZmZXI/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGlvbkNvbXBvbmVudCB7XG4gIGNvbGxlY3Rpb246IHtcbiAgICBsb2FkUmFuZ2U6IChvZmZzZXQ6IG51bWJlciwgbGltaXQ6IG51bWJlcikgPT4gUHJvbWlzZTxhbnlbXT47XG4gICAgbG9hZE1pc3NpbmdSYW5nZXM6IChcbiAgICAgIHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sXG4gICAgICBjYWxsZXI/OiBzdHJpbmcsXG4gICAgKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIGdldExvYWRlZFJhbmdlczogKCkgPT4gU2V0PG51bWJlcj47XG4gICAgZ2V0UGVuZGluZ1JhbmdlczogKCkgPT4gU2V0PG51bWJlcj47XG4gICAgY2xlYXJGYWlsZWRSYW5nZXM6ICgpID0+IHZvaWQ7XG4gICAgcmV0cnlGYWlsZWRSYW5nZTogKHJhbmdlSWQ6IG51bWJlcikgPT4gUHJvbWlzZTxhbnlbXT47XG4gICAgc2V0VG90YWxJdGVtczogKHRvdGFsOiBudW1iZXIpID0+IHZvaWQ7XG4gICAgZ2V0VG90YWxJdGVtczogKCkgPT4gbnVtYmVyO1xuICAgIC8vIEN1cnNvci1zcGVjaWZpYyBtZXRob2RzXG4gICAgZ2V0Q3VycmVudEN1cnNvcjogKCkgPT4gc3RyaW5nIHwgbnVsbDtcbiAgICBnZXRDdXJzb3JGb3JQYWdlOiAocGFnZTogbnVtYmVyKSA9PiBzdHJpbmcgfCBudWxsO1xuICAgIC8vIFJlc2V0IG1ldGhvZCBmb3IgcmVsb2FkIGZ1bmN0aW9uYWxpdHlcbiAgICByZXNldDogKCkgPT4gdm9pZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBBZGRzIGNvbGxlY3Rpb24gZnVuY3Rpb25hbGl0eSB0byB2aWV3cG9ydCBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhDb2xsZWN0aW9uKGNvbmZpZzogQ29sbGVjdGlvbkNvbmZpZyA9IHt9KSB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50PihcbiAgICBjb21wb25lbnQ6IFQsXG4gICk6IFQgJiBDb2xsZWN0aW9uQ29tcG9uZW50ID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBjb2xsZWN0aW9uLFxuICAgICAgcmFuZ2VTaXplID0gVklFV1BPUlRfQ09OU1RBTlRTLkxPQURJTkcuREVGQVVMVF9SQU5HRV9TSVpFLFxuICAgICAgc3RyYXRlZ3kgPSBcIm9mZnNldFwiLFxuICAgICAgdHJhbnNmb3JtLFxuICAgICAgY2FuY2VsTG9hZFRocmVzaG9sZCA9IFZJRVdQT1JUX0NPTlNUQU5UUy5MT0FESU5HLkNBTkNFTF9USFJFU0hPTEQsXG4gICAgICBtYXhDb25jdXJyZW50UmVxdWVzdHMgPSBWSUVXUE9SVF9DT05TVEFOVFMuTE9BRElOR1xuICAgICAgICAuTUFYX0NPTkNVUlJFTlRfUkVRVUVTVFMsXG4gICAgICBlbmFibGVSZXF1ZXN0UXVldWUgPSBWSUVXUE9SVF9DT05TVEFOVFMuUkVRVUVTVF9RVUVVRS5FTkFCTEVELFxuICAgICAgbWF4UXVldWVTaXplID0gVklFV1BPUlRfQ09OU1RBTlRTLlJFUVVFU1RfUVVFVUUuTUFYX1FVRVVFX1NJWkUsXG4gICAgICBsb2FkT25EcmFnRW5kID0gdHJ1ZSwgLy8gRGVmYXVsdCB0byB0cnVlIGFzIHNhZmV0eSBtZWFzdXJlXG4gICAgICBpbml0aWFsU2Nyb2xsSW5kZXggPSAwLCAvLyBTdGFydCBmcm9tIGJlZ2lubmluZyBieSBkZWZhdWx0XG4gICAgICBzZWxlY3RJZCwgLy8gSUQgb2YgaXRlbSB0byBzZWxlY3QgYWZ0ZXIgaW5pdGlhbCBsb2FkXG4gICAgICBhdXRvTG9hZCA9IHRydWUsIC8vIEF1dG8tbG9hZCBpbml0aWFsIGRhdGEgYnkgZGVmYXVsdFxuICAgICAgYXV0b1NlbGVjdEZpcnN0ID0gZmFsc2UsIC8vIEF1dG9tYXRpY2FsbHkgc2VsZWN0IGZpcnN0IGl0ZW0gYWZ0ZXIgaW5pdGlhbCBsb2FkXG4gICAgICBtYXhDYWNoZWRJdGVtcyA9IDEwMDAsIC8vIE1heGltdW0gaXRlbXMgdG8ga2VlcCBpbiBtZW1vcnlcbiAgICAgIGV2aWN0aW9uQnVmZmVyID0gMTUwLCAvLyBFeHRyYSBpdGVtcyB0byBrZWVwIGFyb3VuZCB2aXNpYmxlIHJhbmdlXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIFRyYWNrIGlmIHdlJ3ZlIGNvbXBsZXRlZCB0aGUgaW5pdGlhbCBsb2FkIGZvciBpbml0aWFsU2Nyb2xsSW5kZXhcbiAgICAvLyBUaGlzIHByZXZlbnRzIHRoZSB2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkIGxpc3RlbmVyIGZyb20gbG9hZGluZyBwYWdlIDFcbiAgICBsZXQgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IGZhbHNlO1xuICAgIGNvbnN0IGhhc0luaXRpYWxTY3JvbGxJbmRleCA9IGluaXRpYWxTY3JvbGxJbmRleCA+IDA7XG5cbiAgICAvLyBjb25zb2xlLmxvZyhcIltWaWV3cG9ydCBDb2xsZWN0aW9uXSBJbml0aWFsaXplZCB3aXRoIGNvbmZpZzpcIiwge1xuICAgIC8vICAgc3RyYXRlZ3ksXG4gICAgLy8gICByYW5nZVNpemUsXG4gICAgLy8gICBpbml0aWFsU2Nyb2xsSW5kZXgsXG4gICAgLy8gfSk7XG5cbiAgICAvLyBMb2FkaW5nIG1hbmFnZXIgc3RhdGVcbiAgICBpbnRlcmZhY2UgUXVldWVkUmVxdWVzdCB7XG4gICAgICByYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9O1xuICAgICAgcHJpb3JpdHk6IFwiaGlnaFwiIHwgXCJub3JtYWxcIiB8IFwibG93XCI7XG4gICAgICB0aW1lc3RhbXA6IG51bWJlcjtcbiAgICAgIHJlc29sdmU6ICgpID0+IHZvaWQ7XG4gICAgICByZWplY3Q6IChlcnJvcjogYW55KSA9PiB2b2lkO1xuICAgICAgY2FsbGVyPzogc3RyaW5nO1xuICAgIH1cblxuICAgIC8vIFN0YXRlIHRyYWNraW5nXG4gICAgbGV0IGN1cnJlbnRWZWxvY2l0eSA9IDA7XG4gICAgbGV0IGFjdGl2ZUxvYWRDb3VudCA9IDA7XG4gICAgbGV0IGNvbXBsZXRlZExvYWRzID0gMDtcbiAgICBsZXQgZmFpbGVkTG9hZHMgPSAwO1xuICAgIGxldCBjYW5jZWxsZWRMb2FkcyA9IDA7XG4gICAgbGV0IGlzRHJhZ2dpbmcgPSBmYWxzZTsgLy8gVHJhY2sgZHJhZyBzdGF0ZVxuXG4gICAgLy8gQ2FjaGUgZXZpY3Rpb24gY29uZmlndXJhdGlvbiAoZnJvbSBjb25maWcpXG4gICAgY29uc3QgTUFYX0NBQ0hFRF9JVEVNUyA9IG1heENhY2hlZEl0ZW1zO1xuICAgIGNvbnN0IEVWSUNUSU9OX0JVRkZFUiA9IGV2aWN0aW9uQnVmZmVyO1xuXG4gICAgLy8gTWVtb3J5IGRpYWdub3N0aWNzXG4gICAgY29uc3QgbG9nTWVtb3J5U3RhdHMgPSAoY2FsbGVyOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1Db3VudCA9IGl0ZW1zLmZpbHRlcihCb29sZWFuKS5sZW5ndGg7XG4gICAgICBjb25zdCBsb2FkZWRSYW5nZUNvdW50ID0gbG9hZGVkUmFuZ2VzLnNpemU7XG4gICAgICBjb25zdCBwZW5kaW5nUmFuZ2VDb3VudCA9IHBlbmRpbmdSYW5nZXMuc2l6ZTtcbiAgICAgIGNvbnN0IGFib3J0Q29udHJvbGxlckNvdW50ID0gYWJvcnRDb250cm9sbGVycy5zaXplO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBFdmljdCBpdGVtcyBmYXIgZnJvbSB0aGUgY3VycmVudCB2aXNpYmxlIHJhbmdlIHRvIHByZXZlbnQgbWVtb3J5IGJsb2F0XG4gICAgICogS2VlcHMgaXRlbXMgd2l0aGluIEVWSUNUSU9OX0JVRkZFUiBvZiB0aGUgdmlzaWJsZSByYW5nZVxuICAgICAqL1xuICAgIGNvbnN0IGV2aWN0RGlzdGFudEl0ZW1zID0gKHZpc2libGVTdGFydDogbnVtYmVyLCB2aXNpYmxlRW5kOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1Db3VudCA9IGl0ZW1zLmZpbHRlcihCb29sZWFuKS5sZW5ndGg7XG5cbiAgICAgIC8vIE9ubHkgZXZpY3QgaWYgd2UgaGF2ZSBtb3JlIHRoYW4gTUFYX0NBQ0hFRF9JVEVNU1xuICAgICAgaWYgKGl0ZW1Db3VudCA8PSBNQVhfQ0FDSEVEX0lURU1TKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2VlcFN0YXJ0ID0gTWF0aC5tYXgoMCwgdmlzaWJsZVN0YXJ0IC0gRVZJQ1RJT05fQlVGRkVSKTtcbiAgICAgIGNvbnN0IGtlZXBFbmQgPSB2aXNpYmxlRW5kICsgRVZJQ1RJT05fQlVGRkVSO1xuXG4gICAgICBsZXQgZXZpY3RlZENvdW50ID0gMDtcbiAgICAgIGNvbnN0IHJhbmdlc1RvUmVtb3ZlID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgICAgIC8vIEZpbmQgaXRlbXMgdG8gZXZpY3QgYW5kIHRyYWNrIHdoaWNoIHJhbmdlcyBhcmUgYWZmZWN0ZWRcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGl0ZW1zW2ldICE9PSB1bmRlZmluZWQgJiYgKGkgPCBrZWVwU3RhcnQgfHwgaSA+IGtlZXBFbmQpKSB7XG4gICAgICAgICAgZGVsZXRlIGl0ZW1zW2ldO1xuICAgICAgICAgIGV2aWN0ZWRDb3VudCsrO1xuICAgICAgICAgIC8vIE1hcmsgdGhlIHJhbmdlIGNvbnRhaW5pbmcgdGhpcyBpdGVtIGZvciByZW1vdmFsIGZyb20gbG9hZGVkUmFuZ2VzXG4gICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoZSByYW5nZSB3aWxsIGJlIHJlbG9hZGVkIHdoZW4gc2Nyb2xsaW5nIGJhY2tcbiAgICAgICAgICBjb25zdCBhZmZlY3RlZFJhbmdlSWQgPSBNYXRoLmZsb29yKGkgLyByYW5nZVNpemUpO1xuICAgICAgICAgIHJhbmdlc1RvUmVtb3ZlLmFkZChhZmZlY3RlZFJhbmdlSWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSBhbGwgcmFuZ2VzIHRoYXQgaGFkIGFueSBpdGVtcyBldmljdGVkXG4gICAgICAvLyBUaGlzIGlzIGNyaXRpY2FsOiBldmVuIGlmIG9ubHkgcGFydCBvZiBhIHJhbmdlIHdhcyBldmljdGVkLFxuICAgICAgLy8gd2UgbXVzdCByZW1vdmUgaXQgZnJvbSBsb2FkZWRSYW5nZXMgc28gaXQgZ2V0cyByZWxvYWRlZFxuICAgICAgLy8gQWxzbyByZW1vdmUgZnJvbSBwZW5kaW5nUmFuZ2VzIC0gaWYgYSBzbG93IHJlcXVlc3QgY29tcGxldGVzIGZvciBhbiBldmljdGVkIHJhbmdlLFxuICAgICAgLy8gd2UgZG9uJ3Qgd2FudCBpdCB0byBibG9jayBmdXR1cmUgbG9hZHMgd2hlbiB1c2VyIHNjcm9sbHMgYmFja1xuICAgICAgcmFuZ2VzVG9SZW1vdmUuZm9yRWFjaCgocmFuZ2VJZCkgPT4ge1xuICAgICAgICBsb2FkZWRSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICBwZW5kaW5nUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgLy8gQ2xlYW4gdXAgYWN0aXZlIHJlcXVlc3RzIHRyYWNraW5nXG4gICAgICAgIGFjdGl2ZVJlcXVlc3RzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgLy8gQWxzbyBhYm9ydCBhbnkgaW4tZmxpZ2h0IHJlcXVlc3QgZm9yIHRoaXMgcmFuZ2UgdG8gZnJlZSB1cCBuZXR3b3JrIHJlc291cmNlc1xuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gYWJvcnRDb250cm9sbGVycy5nZXQocmFuZ2VJZCk7XG4gICAgICAgIGlmIChjb250cm9sbGVyKSB7XG4gICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgIGFib3J0Q29udHJvbGxlcnMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGV2aWN0ZWRDb3VudCA+IDApIHtcbiAgICAgICAgLy8gRW1pdCBldmVudCBmb3IgcmVuZGVyaW5nIHRvIGFsc28gY2xlYW4gdXBcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImNvbGxlY3Rpb246aXRlbXMtZXZpY3RlZFwiLCB7XG4gICAgICAgICAga2VlcFN0YXJ0LFxuICAgICAgICAgIGtlZXBFbmQsXG4gICAgICAgICAgZXZpY3RlZENvdW50LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgYWN0aXZlTG9hZFJhbmdlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGxldCBsb2FkUmVxdWVzdFF1ZXVlOiBRdWV1ZWRSZXF1ZXN0W10gPSBbXTtcblxuICAgIC8vIEFib3J0Q29udHJvbGxlciBtYXAgZm9yIGNhbmNlbGxpbmcgaW4tZmxpZ2h0IHJlcXVlc3RzXG4gICAgY29uc3QgYWJvcnRDb250cm9sbGVycyA9IG5ldyBNYXA8bnVtYmVyLCBBYm9ydENvbnRyb2xsZXI+KCk7XG5cbiAgICAvLyBTdGF0ZVxuICAgIGxldCBpdGVtczogYW55W10gPSBbXTtcbiAgICBsZXQgdG90YWxJdGVtcyA9IDA7XG4gICAgbGV0IGxvYWRlZFJhbmdlcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgIGxldCBwZW5kaW5nUmFuZ2VzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgbGV0IGZhaWxlZFJhbmdlcyA9IG5ldyBNYXA8XG4gICAgICBudW1iZXIsXG4gICAgICB7XG4gICAgICAgIGF0dGVtcHRzOiBudW1iZXI7XG4gICAgICAgIGxhc3RFcnJvcjogRXJyb3I7XG4gICAgICAgIHRpbWVzdGFtcDogbnVtYmVyO1xuICAgICAgfVxuICAgID4oKTtcbiAgICBsZXQgYWN0aXZlUmVxdWVzdHMgPSBuZXcgTWFwPG51bWJlciwgUHJvbWlzZTxhbnlbXT4+KCk7XG5cbiAgICAvLyBDdXJzb3IgcGFnaW5hdGlvbiBzdGF0ZVxuICAgIGxldCBjdXJyZW50Q3Vyc29yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgY3Vyc29yTWFwID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTsgLy8gTWFwIHBhZ2UgbnVtYmVyIHRvIGN1cnNvclxuICAgIGxldCBwYWdlVG9PZmZzZXRNYXAgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpOyAvLyBNYXAgcGFnZSB0byBhY3R1YWwgb2Zmc2V0XG4gICAgbGV0IGhpZ2hlc3RMb2FkZWRQYWdlID0gMDtcbiAgICBsZXQgZGlzY292ZXJlZFRvdGFsOiBudW1iZXIgfCBudWxsID0gbnVsbDsgLy8gVHJhY2sgZGlzY292ZXJlZCB0b3RhbCBmcm9tIEFQSVxuICAgIGxldCBoYXNSZWFjaGVkRW5kID0gZmFsc2U7IC8vIFRyYWNrIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiBkYXRhXG5cbiAgICAvLyBTaGFyZSBpdGVtcyBhcnJheSB3aXRoIGNvbXBvbmVudFxuICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuXG4gICAgLyoqXG4gICAgICogR2V0IGEgdW5pcXVlIElEIGZvciBhIHJhbmdlIGJhc2VkIG9uIG9mZnNldCBhbmQgdGhlIGJhc2UgcmFuZ2Ugc2l6ZVxuICAgICAqL1xuICAgIGNvbnN0IGdldFJhbmdlSWQgPSAob2Zmc2V0OiBudW1iZXIsIGxpbWl0OiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgICAgLy8gQWx3YXlzIHVzZSB0aGUgYmFzZSByYW5nZVNpemUgZm9yIGNvbnNpc3RlbnQgSURzXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgbWVyZ2VkIHJhbmdlcyBjYW4gYmUgdHJhY2tlZCBwcm9wZXJseVxuICAgICAgcmV0dXJuIE1hdGguZmxvb3Iob2Zmc2V0IC8gcmFuZ2VTaXplKTtcbiAgICB9O1xuXG4gICAgLy8gTG9hZGluZyBtYW5hZ2VyIGhlbHBlcnNcbiAgICBjb25zdCBnZXRSYW5nZUtleSA9IChyYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9KTogc3RyaW5nID0+IHtcbiAgICAgIHJldHVybiBgJHtyYW5nZS5zdGFydH0tJHtyYW5nZS5lbmR9YDtcbiAgICB9O1xuXG4gICAgY29uc3QgY2FuTG9hZCA9ICgpOiBib29sZWFuID0+IHtcbiAgICAgIHJldHVybiBjdXJyZW50VmVsb2NpdHkgPD0gY2FuY2VsTG9hZFRocmVzaG9sZDtcbiAgICB9O1xuXG4gICAgY29uc3QgcHJvY2Vzc1F1ZXVlID0gKCkgPT4ge1xuICAgICAgaWYgKCFlbmFibGVSZXF1ZXN0UXVldWUgfHwgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgLy8gU29ydCBxdWV1ZSBieSBwcmlvcml0eSBhbmQgdGltZXN0YW1wXG4gICAgICBsb2FkUmVxdWVzdFF1ZXVlLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgcHJpb3JpdHlPcmRlciA9IHsgaGlnaDogMCwgbm9ybWFsOiAxLCBsb3c6IDIgfTtcbiAgICAgICAgY29uc3QgcHJpb3JpdHlEaWZmID1cbiAgICAgICAgICBwcmlvcml0eU9yZGVyW2EucHJpb3JpdHldIC0gcHJpb3JpdHlPcmRlcltiLnByaW9yaXR5XTtcbiAgICAgICAgcmV0dXJuIHByaW9yaXR5RGlmZiAhPT0gMCA/IHByaW9yaXR5RGlmZiA6IGEudGltZXN0YW1wIC0gYi50aW1lc3RhbXA7XG4gICAgICB9KTtcblxuICAgICAgLy8gUHJvY2VzcyByZXF1ZXN0cyB1cCB0byBjYXBhY2l0eVxuICAgICAgd2hpbGUgKFxuICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgYWN0aXZlTG9hZENvdW50IDwgbWF4Q29uY3VycmVudFJlcXVlc3RzXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGxvYWRSZXF1ZXN0UXVldWUuc2hpZnQoKTtcbiAgICAgICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgICAgICBleGVjdXRlUXVldWVkTG9hZChyZXF1ZXN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBleGVjdXRlUXVldWVkTG9hZCA9IChyZXF1ZXN0OiBRdWV1ZWRSZXF1ZXN0KSA9PiB7XG4gICAgICBhY3RpdmVMb2FkQ291bnQrKztcbiAgICAgIGFjdGl2ZUxvYWRSYW5nZXMuYWRkKGdldFJhbmdlS2V5KHJlcXVlc3QucmFuZ2UpKTtcblxuICAgICAgLy8gQ2FsbCB0aGUgYWN0dWFsIGxvYWRNaXNzaW5nUmFuZ2VzIGZ1bmN0aW9uXG4gICAgICBsb2FkTWlzc2luZ1Jhbmdlc0ludGVybmFsKHJlcXVlc3QucmFuZ2UsIHJlcXVlc3QuY2FsbGVyKVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmVxdWVzdC5yZXNvbHZlKCk7XG4gICAgICAgICAgY29tcGxldGVkTG9hZHMrKztcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICByZXF1ZXN0LnJlamVjdChlcnJvcik7XG4gICAgICAgICAgZmFpbGVkTG9hZHMrKztcbiAgICAgICAgfSlcbiAgICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgIGFjdGl2ZUxvYWRDb3VudC0tO1xuICAgICAgICAgIGFjdGl2ZUxvYWRSYW5nZXMuZGVsZXRlKGdldFJhbmdlS2V5KHJlcXVlc3QucmFuZ2UpKTtcbiAgICAgICAgICBwcm9jZXNzUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybSBpdGVtcyBpZiB0cmFuc2Zvcm0gZnVuY3Rpb24gcHJvdmlkZWRcbiAgICAgKi9cbiAgICBjb25zdCB0cmFuc2Zvcm1JdGVtcyA9IChyYXdJdGVtczogYW55W10pOiBhbnlbXSA9PiB7XG4gICAgICBpZiAoIXRyYW5zZm9ybSkgcmV0dXJuIHJhd0l0ZW1zO1xuICAgICAgcmV0dXJuIHJhd0l0ZW1zLm1hcCh0cmFuc2Zvcm0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGEgcmFuZ2Ugb2YgZGF0YVxuICAgICAqL1xuICAgIGNvbnN0IGxvYWRSYW5nZSA9IGFzeW5jIChvZmZzZXQ6IG51bWJlciwgbGltaXQ6IG51bWJlcik6IFByb21pc2U8YW55W10+ID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIGxvYWRSYW5nZSBjYWxsZWQ6IG9mZnNldD0ke29mZnNldH0sIGxpbWl0PSR7bGltaXR9YCxcbiAgICAgIC8vICk7XG5cbiAgICAgIGlmICghY29sbGVjdGlvbikge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbQ29sbGVjdGlvbl0gTm8gY29sbGVjdGlvbiBhZGFwdGVyIGNvbmZpZ3VyZWRcIik7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmFuZ2VJZCA9IGdldFJhbmdlSWQob2Zmc2V0LCBsaW1pdCk7XG4gICAgICAvLyBjb25zb2xlLmxvZyhgW0NvbGxlY3Rpb25dIFJhbmdlIElEOiAke3JhbmdlSWR9YCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgbG9hZGVkXG4gICAgICBpZiAobG9hZGVkUmFuZ2VzLmhhcyhyYW5nZUlkKSkge1xuICAgICAgICByZXR1cm4gaXRlbXMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBsaW1pdCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgcGVuZGluZ1xuICAgICAgaWYgKHBlbmRpbmdSYW5nZXMuaGFzKHJhbmdlSWQpKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nUmVxdWVzdCA9IGFjdGl2ZVJlcXVlc3RzLmdldChyYW5nZUlkKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nUmVxdWVzdCkge1xuICAgICAgICAgIHJldHVybiBleGlzdGluZ1JlcXVlc3Q7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTWFyayBhcyBwZW5kaW5nXG4gICAgICBwZW5kaW5nUmFuZ2VzLmFkZChyYW5nZUlkKTtcblxuICAgICAgLy8gQ3JlYXRlIEFib3J0Q29udHJvbGxlciBmb3IgdGhpcyByZXF1ZXN0XG4gICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBhYm9ydENvbnRyb2xsZXJzLnNldChyYW5nZUlkLCBhYm9ydENvbnRyb2xsZXIpO1xuXG4gICAgICAvLyBDcmVhdGUgcmVxdWVzdCBwcm9taXNlXG4gICAgICBjb25zdCByZXF1ZXN0UHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQ2FsbCBjb2xsZWN0aW9uIGFkYXB0ZXIgd2l0aCBhcHByb3ByaWF0ZSBwYXJhbWV0ZXJzXG4gICAgICAgICAgY29uc3QgcGFnZSA9IE1hdGguZmxvb3Iob2Zmc2V0IC8gbGltaXQpICsgMTtcbiAgICAgICAgICBsZXQgcGFyYW1zOiBhbnk7XG5cbiAgICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIpIHtcbiAgICAgICAgICAgIC8vIEZvciBjdXJzb3IgcGFnaW5hdGlvblxuICAgICAgICAgICAgaWYgKHBhZ2UgPT09IDEpIHtcbiAgICAgICAgICAgICAgLy8gRmlyc3QgcGFnZSAtIG5vIGN1cnNvclxuICAgICAgICAgICAgICBwYXJhbXMgPSB7IGxpbWl0IH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGN1cnNvciBmb3IgcHJldmlvdXMgcGFnZVxuICAgICAgICAgICAgICBjb25zdCBwcmV2UGFnZUN1cnNvciA9IGN1cnNvck1hcC5nZXQocGFnZSAtIDEpO1xuICAgICAgICAgICAgICBpZiAoIXByZXZQYWdlQ3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2FuJ3QgbG9hZCB0aGlzIHBhZ2Ugd2l0aG91dCBwcmV2aW91cyBjdXJzb3JcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICBgW0NvbGxlY3Rpb25dIENhbm5vdCBsb2FkIHBhZ2UgJHtwYWdlfSB3aXRob3V0IGN1cnNvciBmb3IgcGFnZSAke1xuICAgICAgICAgICAgICAgICAgICBwYWdlIC0gMVxuICAgICAgICAgICAgICAgICAgfWAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgU2VxdWVudGlhbCBsb2FkaW5nIHJlcXVpcmVkIC0gbWlzc2luZyBjdXJzb3IgZm9yIHBhZ2UgJHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZSAtIDFcbiAgICAgICAgICAgICAgICAgIH1gLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcGFyYW1zID0geyBjdXJzb3I6IHByZXZQYWdlQ3Vyc29yLCBsaW1pdCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RyYXRlZ3kgPT09IFwicGFnZVwiKSB7XG4gICAgICAgICAgICBwYXJhbXMgPSB7IHBhZ2UsIGxpbWl0IH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG9mZnNldCBzdHJhdGVneVxuICAgICAgICAgICAgcGFyYW1zID0geyBvZmZzZXQsIGxpbWl0IH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW1ZpZXdwb3J0IENvbGxlY3Rpb25dIExvYWRpbmcgcmFuZ2Ugb2Zmc2V0PSR7b2Zmc2V0fSwgbGltaXQ9JHtsaW1pdH0sIHN0cmF0ZWd5PSR7c3RyYXRlZ3l9LCBjYWxjdWxhdGVkIHBhZ2U9JHtwYWdlfSwgcGFyYW1zOmAsXG4gICAgICAgICAgLy8gICBKU09OLnN0cmluZ2lmeShwYXJhbXMpXG4gICAgICAgICAgLy8gKTtcblxuICAgICAgICAgIC8vIFBhc3MgYWJvcnQgc2lnbmFsIHRvIHRoZSBhZGFwdGVyIGlmIGl0IHN1cHBvcnRzIGl0XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjb2xsZWN0aW9uLnJlYWQoe1xuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRXh0cmFjdCBpdGVtcyBhbmQgdG90YWxcbiAgICAgICAgICBjb25zdCByYXdJdGVtcyA9IHJlc3BvbnNlLmRhdGEgfHwgcmVzcG9uc2UuaXRlbXMgfHwgcmVzcG9uc2U7XG4gICAgICAgICAgY29uc3QgbWV0YSA9IHJlc3BvbnNlLm1ldGEgfHwge307XG5cbiAgICAgICAgICAvLyBGb3IgY3Vyc29yIHBhZ2luYXRpb24sIHRyYWNrIHRoZSBjdXJzb3IgKGNoZWNrIGJvdGggY3Vyc29yIGFuZCBuZXh0Q3Vyc29yKVxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQ3Vyc29yID0gbWV0YS5jdXJzb3IgfHwgbWV0YS5uZXh0Q3Vyc29yO1xuICAgICAgICAgIGlmIChzdHJhdGVneSA9PT0gXCJjdXJzb3JcIiAmJiByZXNwb25zZUN1cnNvcikge1xuICAgICAgICAgICAgY3VycmVudEN1cnNvciA9IHJlc3BvbnNlQ3Vyc29yO1xuICAgICAgICAgICAgY3Vyc29yTWFwLnNldChwYWdlLCByZXNwb25zZUN1cnNvcik7XG4gICAgICAgICAgICBwYWdlVG9PZmZzZXRNYXAuc2V0KHBhZ2UsIG9mZnNldCk7XG4gICAgICAgICAgICBoaWdoZXN0TG9hZGVkUGFnZSA9IE1hdGgubWF4KGhpZ2hlc3RMb2FkZWRQYWdlLCBwYWdlKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFN0b3JlZCBjdXJzb3IgZm9yIHBhZ2UgJHtwYWdlfTogJHtyZXNwb25zZUN1cnNvcn1gLFxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB3ZSd2ZSByZWFjaGVkIHRoZSBlbmRcbiAgICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIgJiYgbWV0YS5oYXNOZXh0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaGFzUmVhY2hlZEVuZCA9IHRydWU7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBSZWFjaGVkIGVuZCBvZiBjdXJzb3IgcGFnaW5hdGlvbiBhdCBwYWdlICR7cGFnZX1gLFxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVcGRhdGUgZGlzY292ZXJlZCB0b3RhbCBpZiBwcm92aWRlZFxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBtZXRhLnRvdGFsOiAke21ldGEudG90YWx9LCBkaXNjb3ZlcmVkVG90YWwgYmVmb3JlOiAke2Rpc2NvdmVyZWRUb3RhbH1gLFxuICAgICAgICAgIC8vICk7XG4gICAgICAgICAgaWYgKG1ldGEudG90YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGlzY292ZXJlZFRvdGFsID0gbWV0YS50b3RhbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coYFtDb2xsZWN0aW9uXSBkaXNjb3ZlcmVkVG90YWwgYWZ0ZXI6ICR7ZGlzY292ZXJlZFRvdGFsfWApO1xuXG4gICAgICAgICAgLy8gVHJhbnNmb3JtIGl0ZW1zXG4gICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRJdGVtcyA9IHRyYW5zZm9ybUl0ZW1zKHJhd0l0ZW1zKTtcblxuICAgICAgICAgIC8vIEFkZCBpdGVtcyB0byBhcnJheVxuICAgICAgICAgIHRyYW5zZm9ybWVkSXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGl0ZW1zW29mZnNldCArIGluZGV4XSA9IGl0ZW07XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBGb3IgY3Vyc29yIHN0cmF0ZWd5LCBjYWxjdWxhdGUgZHluYW1pYyB0b3RhbCBiYXNlZCBvbiBsb2FkZWQgZGF0YVxuICAgICAgICAgIC8vIFVzZSBudWxsaXNoIGNvYWxlc2NpbmcgKD8/KSBpbnN0ZWFkIG9mIHx8IHRvIGhhbmRsZSBkaXNjb3ZlcmVkVG90YWwgPSAwIGNvcnJlY3RseVxuICAgICAgICAgIGxldCBuZXdUb3RhbCA9IGRpc2NvdmVyZWRUb3RhbCA/PyB0b3RhbEl0ZW1zO1xuXG4gICAgICAgICAgLy8gQ1JJVElDQUwgRklYOiBXaGVuIEFQSSByZXR1cm5zIDAgaXRlbXMgb24gcGFnZSAxIChvZmZzZXQgMCksIHRoZSBsaXN0IGlzIGVtcHR5LlxuICAgICAgICAgIC8vIFdlIG11c3Qgc2V0IHRvdGFsSXRlbXMgdG8gMCByZWdhcmRsZXNzIG9mIG1ldGEudG90YWwgYmVpbmcgdW5kZWZpbmVkLlxuICAgICAgICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBjb3VudD1mYWxzZSBpcyBzZW50IGJ1dCB0aGUgbGlzdCBpcyBhY3R1YWxseSBlbXB0eS5cbiAgICAgICAgICBpZiAob2Zmc2V0ID09PSAwICYmIHRyYW5zZm9ybWVkSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBFbXB0eSByZXN1bHQgb24gcGFnZSAxIC0gZm9yY2luZyB0b3RhbEl0ZW1zIHRvIDBgLFxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgIG5ld1RvdGFsID0gMDtcbiAgICAgICAgICAgIGRpc2NvdmVyZWRUb3RhbCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBuZXdUb3RhbCBpbml0aWFsOiAke25ld1RvdGFsfSwgdG90YWxJdGVtczogJHt0b3RhbEl0ZW1zfSwgc3RyYXRlZ3k6ICR7c3RyYXRlZ3l9YCxcbiAgICAgICAgICAvLyApO1xuXG4gICAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImN1cnNvclwiKSB7XG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdG90YWwgYmFzZWQgb24gbG9hZGVkIGl0ZW1zICsgbWFyZ2luXG4gICAgICAgICAgICBjb25zdCBsb2FkZWRJdGVtc0NvdW50ID0gaXRlbXMuZmlsdGVyKFxuICAgICAgICAgICAgICAoaXRlbSkgPT4gaXRlbSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgKS5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBtYXJnaW5JdGVtcyA9IGhhc1JlYWNoZWRFbmRcbiAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgIDogcmFuZ2VTaXplICpcbiAgICAgICAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUEFHSU5BVElPTi5DVVJTT1JfU0NST0xMX01BUkdJTl9NVUxUSVBMSUVSO1xuICAgICAgICAgICAgY29uc3QgbWluVmlydHVhbEl0ZW1zID1cbiAgICAgICAgICAgICAgcmFuZ2VTaXplICpcbiAgICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBBR0lOQVRJT04uQ1VSU09SX01JTl9WSVJUVUFMX1NJWkVfTVVMVElQTElFUjtcblxuICAgICAgICAgICAgLy8gRHluYW1pYyB0b3RhbDogbG9hZGVkIGl0ZW1zICsgbWFyZ2luICh1bmxlc3Mgd2UndmUgcmVhY2hlZCB0aGUgZW5kKVxuICAgICAgICAgICAgbmV3VG90YWwgPSBNYXRoLm1heChcbiAgICAgICAgICAgICAgbG9hZGVkSXRlbXNDb3VudCArIG1hcmdpbkl0ZW1zLFxuICAgICAgICAgICAgICBtaW5WaXJ0dWFsSXRlbXMsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBDdXJzb3IgbW9kZSB2aXJ0dWFsIHNpemU6IGxvYWRlZD0ke2xvYWRlZEl0ZW1zQ291bnR9LCBtYXJnaW49JHttYXJnaW5JdGVtc30sIHRvdGFsPSR7bmV3VG90YWx9LCBoYXNSZWFjaGVkRW5kPSR7aGFzUmVhY2hlZEVuZH1gLFxuICAgICAgICAgICAgLy8gKTtcblxuICAgICAgICAgICAgLy8gVXBkYXRlIHRvdGFsIGlmIGl0IGhhcyBncm93blxuICAgICAgICAgICAgaWYgKG5ld1RvdGFsID4gdG90YWxJdGVtcykge1xuICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFVwZGF0aW5nIGN1cnNvciB2aXJ0dWFsIHNpemUgZnJvbSAke3RvdGFsSXRlbXN9IHRvICR7bmV3VG90YWx9YCxcbiAgICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgICAgdG90YWxJdGVtcyA9IG5ld1RvdGFsO1xuICAgICAgICAgICAgICBzZXRUb3RhbEl0ZW1zKG5ld1RvdGFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRm9yIG90aGVyIHN0cmF0ZWdpZXMsIHVzZSBkaXNjb3ZlcmVkIHRvdGFsIG9yIGN1cnJlbnQgdG90YWxcbiAgICAgICAgICAgIC8vIFVzZSBudWxsaXNoIGNvYWxlc2NpbmcgKD8/KSBpbnN0ZWFkIG9mIHx8IHRvIGhhbmRsZSBkaXNjb3ZlcmVkVG90YWwgPSAwIGNvcnJlY3RseVxuICAgICAgICAgICAgbmV3VG90YWwgPSBkaXNjb3ZlcmVkVG90YWwgPz8gdG90YWxJdGVtcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVcGRhdGUgc3RhdGVcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gQmVmb3JlIHN0YXRlIHVwZGF0ZTogbmV3VG90YWw9JHtuZXdUb3RhbH0sIHRvdGFsSXRlbXM9JHt0b3RhbEl0ZW1zfSwgd2lsbCB1cGRhdGU6ICR7bmV3VG90YWwgIT09IHRvdGFsSXRlbXN9YCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICAgIGlmIChuZXdUb3RhbCAhPT0gdG90YWxJdGVtcykge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYFtDb2xsZWN0aW9uXSBDYWxsaW5nIHNldFRvdGFsSXRlbXMoJHtuZXdUb3RhbH0pYCk7XG4gICAgICAgICAgICB0b3RhbEl0ZW1zID0gbmV3VG90YWw7XG4gICAgICAgICAgICBzZXRUb3RhbEl0ZW1zKG5ld1RvdGFsKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVcGRhdGUgY29tcG9uZW50IGl0ZW1zIHJlZmVyZW5jZVxuICAgICAgICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuXG4gICAgICAgICAgLy8gRW1pdCBpdGVtcyBjaGFuZ2VkIGV2ZW50XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0Oml0ZW1zLWNoYW5nZWRcIiwge1xuICAgICAgICAgICAgdG90YWxJdGVtczogbmV3VG90YWwsXG4gICAgICAgICAgICBsb2FkZWRDb3VudDogaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSB1bmRlZmluZWQpLmxlbmd0aCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIFVwZGF0ZSB2aWV3cG9ydCBzdGF0ZVxuICAgICAgICAgIGNvbnN0IHZpZXdwb3J0U3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG4gICAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICAgIC8vIFVzZSBudWxsaXNoIGNvYWxlc2NpbmcgKD8/KSBpbnN0ZWFkIG9mIHx8IHRvIGhhbmRsZSBuZXdUb3RhbCA9IDAgY29ycmVjdGx5XG4gICAgICAgICAgICB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgPSBuZXdUb3RhbCA/PyBpdGVtcy5sZW5ndGg7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVmVyaWZ5IGl0ZW1zIGFyZSBhY3R1YWxseSBzdGlsbCBpbiB0aGUgYXJyYXkgYmVmb3JlIG1hcmtpbmcgYXMgbG9hZGVkXG4gICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBhIHJhY2UgY29uZGl0aW9uIHdoZXJlIGV2aWN0aW9uIGhhcHBlbnMgZHVyaW5nIGFzeW5jIGxvYWQ6XG4gICAgICAgICAgLy8gMS4gTG9hZCBzdGFydHMgZm9yIHJhbmdlIEFcbiAgICAgICAgICAvLyAyLiBVc2VyIHNjcm9sbHMgdG8gcmFuZ2UgQlxuICAgICAgICAgIC8vIDMuIEV2aWN0aW9uIHJlbW92ZXMgaXRlbXMgZnJvbSByYW5nZSBBIGFuZCByZW1vdmVzIGZyb20gbG9hZGVkUmFuZ2VzXG4gICAgICAgICAgLy8gNC4gTG9hZCBmb3IgcmFuZ2UgQSBjb21wbGV0ZXMsIHdvdWxkIHJlLWFkZCB0byBsb2FkZWRSYW5nZXNcbiAgICAgICAgICAvLyA1LiBVc2VyIHNjcm9sbHMgYmFjayB0byBBLCBsb2FkZWRSYW5nZXMgc2F5cyBsb2FkZWQgYnV0IGl0ZW1zIGFyZSBnb25lXG4gICAgICAgICAgY29uc3QgaXRlbXNBY3R1YWxseVN0b3JlZCA9XG4gICAgICAgICAgICB0cmFuc2Zvcm1lZEl0ZW1zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgIHRyYW5zZm9ybWVkSXRlbXMuZXZlcnkoXG4gICAgICAgICAgICAgIChfLCBpZHgpID0+IGl0ZW1zW29mZnNldCArIGlkeF0gIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoaXRlbXNBY3R1YWxseVN0b3JlZCkge1xuICAgICAgICAgICAgLy8gTWFyayBhcyBsb2FkZWQgb25seSBpZiBpdGVtcyBhcmUgYWN0dWFsbHkgcHJlc2VudFxuICAgICAgICAgICAgbG9hZGVkUmFuZ2VzLmFkZChyYW5nZUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQWx3YXlzIGNsZWFuIHVwIHBlbmRpbmcvZmFpbGVkIHN0YXRlXG4gICAgICAgICAgcGVuZGluZ1Jhbmdlcy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgICAgZmFpbGVkUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcblxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBSYW5nZSAke3JhbmdlSWR9IGxvYWRlZCBzdWNjZXNzZnVsbHkgd2l0aCAke3RyYW5zZm9ybWVkSXRlbXMubGVuZ3RofSBpdGVtc2BcbiAgICAgICAgICAvLyApO1xuXG4gICAgICAgICAgLy8gTG9nIG1lbW9yeSBzdGF0cyBwZXJpb2RpY2FsbHkgKGV2ZXJ5IDUgbG9hZHMpXG4gICAgICAgICAgaWYgKGNvbXBsZXRlZExvYWRzICUgNSA9PT0gMCkge1xuICAgICAgICAgICAgbG9nTWVtb3J5U3RhdHMoYGxvYWQ6JHtjb21wbGV0ZWRMb2Fkc31gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBFbWl0IGV2ZW50c1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpyYW5nZS1sb2FkZWRcIiwge1xuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgICAgICBpdGVtczogdHJhbnNmb3JtZWRJdGVtcyxcbiAgICAgICAgICAgIHRvdGFsOiBuZXdUb3RhbCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEVtaXQgY29sbGVjdGlvbiBsb2FkZWQgZXZlbnQgd2l0aCBtb3JlIGRldGFpbHNcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY29sbGVjdGlvbjpyYW5nZS1sb2FkZWRcIiwge1xuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgICAgICBpdGVtczogdHJhbnNmb3JtZWRJdGVtcyxcbiAgICAgICAgICAgIHRvdGFsOiBuZXdUb3RhbCxcbiAgICAgICAgICAgIHJhbmdlSWQsXG4gICAgICAgICAgICBpdGVtc0luTWVtb3J5OiBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09IHVuZGVmaW5lZCkubGVuZ3RoLFxuICAgICAgICAgICAgY3Vyc29yOiBzdHJhdGVneSA9PT0gXCJjdXJzb3JcIiA/IGN1cnJlbnRDdXJzb3IgOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBUcmlnZ2VyIHZpZXdwb3J0IHVwZGF0ZVxuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydD8udXBkYXRlVmlld3BvcnQ/LigpO1xuXG4gICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkSXRlbXM7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gSGFuZGxlIEFib3J0RXJyb3IgYW5kIFwiRmFpbGVkIHRvIGZldGNoXCIgKHdoaWNoIGNhbiBvY2N1ciBvbiBhYm9ydCkgZ3JhY2VmdWxseVxuICAgICAgICAgIGNvbnN0IGlzQWJvcnRFcnJvciA9XG4gICAgICAgICAgICAoZXJyb3IgYXMgRXJyb3IpLm5hbWUgPT09IFwiQWJvcnRFcnJvclwiIHx8XG4gICAgICAgICAgICAoKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlID09PSBcIkZhaWxlZCB0byBmZXRjaFwiICYmXG4gICAgICAgICAgICAgIGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCk7XG5cbiAgICAgICAgICBpZiAoaXNBYm9ydEVycm9yKSB7XG4gICAgICAgICAgICBwZW5kaW5nUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgICAgIGNhbmNlbGxlZExvYWRzKys7XG4gICAgICAgICAgICAvLyBEb24ndCB0aHJvdywganVzdCByZXR1cm4gZW1wdHkgYXJyYXlcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBIYW5kbGUgb3RoZXIgZXJyb3JzXG4gICAgICAgICAgcGVuZGluZ1Jhbmdlcy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgICAgZmFpbGVkTG9hZHMrKztcblxuICAgICAgICAgIGNvbnN0IGF0dGVtcHRzID0gKGZhaWxlZFJhbmdlcy5nZXQocmFuZ2VJZCk/LmF0dGVtcHRzIHx8IDApICsgMTtcbiAgICAgICAgICBmYWlsZWRSYW5nZXMuc2V0KHJhbmdlSWQsIHtcbiAgICAgICAgICAgIGF0dGVtcHRzLFxuICAgICAgICAgICAgbGFzdEVycm9yOiBlcnJvciBhcyBFcnJvcixcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEVtaXQgZXJyb3IgZXZlbnRcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6cmFuZ2UtZXJyb3JcIiwge1xuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgIGF0dGVtcHRzLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgYWN0aXZlUmVxdWVzdHMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICAgIGFib3J0Q29udHJvbGxlcnMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuXG4gICAgICBhY3RpdmVSZXF1ZXN0cy5zZXQocmFuZ2VJZCwgcmVxdWVzdFByb21pc2UpO1xuICAgICAgcmV0dXJuIHJlcXVlc3RQcm9taXNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIG1pc3NpbmcgcmFuZ2VzIGZyb20gY29sbGVjdGlvblxuICAgICAqL1xuICAgIGNvbnN0IGxvYWRNaXNzaW5nUmFuZ2VzSW50ZXJuYWwgPSBhc3luYyAoXG4gICAgICByYW5nZToge1xuICAgICAgICBzdGFydDogbnVtYmVyO1xuICAgICAgICBlbmQ6IG51bWJlcjtcbiAgICAgIH0sXG4gICAgICBjYWxsZXI/OiBzdHJpbmcsXG4gICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBpZiAoIWNvbGxlY3Rpb24pIHJldHVybjtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gbG9hZE1pc3NpbmdSYW5nZXNJbnRlcm5hbCAtIHJhbmdlOiAke3N0YXJ0fS0ke2VuZH0sIHN0cmF0ZWd5OiAke3N0cmF0ZWd5fWAsXG4gICAgICAvLyApO1xuXG4gICAgICAvLyBGb3IgY3Vyc29yIHBhZ2luYXRpb24sIHdlIG5lZWQgdG8gbG9hZCBzZXF1ZW50aWFsbHlcbiAgICAgIGlmIChzdHJhdGVneSA9PT0gXCJjdXJzb3JcIikge1xuICAgICAgICBjb25zdCBzdGFydFBhZ2UgPSBNYXRoLmZsb29yKHJhbmdlLnN0YXJ0IC8gcmFuZ2VTaXplKSArIDE7XG4gICAgICAgIGNvbnN0IGVuZFBhZ2UgPSBNYXRoLmZsb29yKHJhbmdlLmVuZCAvIHJhbmdlU2l6ZSkgKyAxO1xuXG4gICAgICAgIC8vIExpbWl0IGhvdyBtYW55IHBhZ2VzIHdlJ2xsIGxvYWQgYXQgb25jZVxuICAgICAgICBjb25zdCBtYXhQYWdlc1RvTG9hZCA9IDEwO1xuICAgICAgICBjb25zdCBjdXJyZW50SGlnaGVzdFBhZ2UgPSBoaWdoZXN0TG9hZGVkUGFnZSB8fCAwO1xuICAgICAgICBjb25zdCBsaW1pdGVkRW5kUGFnZSA9IE1hdGgubWluKFxuICAgICAgICAgIGVuZFBhZ2UsXG4gICAgICAgICAgY3VycmVudEhpZ2hlc3RQYWdlICsgbWF4UGFnZXNUb0xvYWQsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBDdXJzb3IgbW9kZTogbmVlZCB0byBsb2FkIHBhZ2VzICR7c3RhcnRQYWdlfSB0byAke2VuZFBhZ2V9LCBsaW1pdGVkIHRvICR7bGltaXRlZEVuZFBhZ2V9YCxcbiAgICAgICAgLy8gKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIGxvYWQgcGFnZXMgc2VxdWVudGlhbGx5XG4gICAgICAgIGZvciAobGV0IHBhZ2UgPSBzdGFydFBhZ2U7IHBhZ2UgPD0gbGltaXRlZEVuZFBhZ2U7IHBhZ2UrKykge1xuICAgICAgICAgIGNvbnN0IHJhbmdlSWQgPSBwYWdlIC0gMTsgLy8gQ29udmVydCB0byAwLWJhc2VkIHJhbmdlSWRcbiAgICAgICAgICBjb25zdCBvZmZzZXQgPSByYW5nZUlkICogcmFuZ2VTaXplO1xuXG4gICAgICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IGJlaW5nIGxvYWRlZFxuICAgICAgICAgIGlmIChwZW5kaW5nUmFuZ2VzLmhhcyhyYW5nZUlkKSkge1xuICAgICAgICAgICAgLy8gUmFuZ2UgYWxyZWFkeSBiZWluZyBsb2FkZWRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWxvYWRlZFJhbmdlcy5oYXMocmFuZ2VJZCkgJiYgIXBlbmRpbmdSYW5nZXMuaGFzKHJhbmdlSWQpKSB7XG4gICAgICAgICAgICAvLyBGb3IgY3Vyc29yIHBhZ2luYXRpb24sIHdlIG11c3QgbG9hZCBzZXF1ZW50aWFsbHlcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYWxsIHByZXZpb3VzIHBhZ2VzIGxvYWRlZFxuICAgICAgICAgICAgaWYgKHBhZ2UgPiAxKSB7XG4gICAgICAgICAgICAgIGxldCBjYW5Mb2FkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgcHJldlBhZ2UgPSAxOyBwcmV2UGFnZSA8IHBhZ2U7IHByZXZQYWdlKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2UmFuZ2VJZCA9IHByZXZQYWdlIC0gMTtcbiAgICAgICAgICAgICAgICBpZiAoIWxvYWRlZFJhbmdlcy5oYXMocHJldlJhbmdlSWQpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBDYW5ub3QgbG9hZCBwYWdlICR7cGFnZX0gLSBuZWVkIHRvIGxvYWQgcGFnZSAke3ByZXZQYWdlfSBmaXJzdGAsXG4gICAgICAgICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgICAgICAgY2FuTG9hZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAvLyBUcnkgdG8gbG9hZCB0aGUgbWlzc2luZyBwYWdlXG4gICAgICAgICAgICAgICAgICBpZiAoIXBlbmRpbmdSYW5nZXMuaGFzKHByZXZSYW5nZUlkKSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGxvYWRSYW5nZShwcmV2UmFuZ2VJZCAqIHJhbmdlU2l6ZSwgcmFuZ2VTaXplKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgYFtDb2xsZWN0aW9uXSBGYWlsZWQgdG8gbG9hZCBwcmVyZXF1aXNpdGUgcGFnZSAke3ByZXZQYWdlfTpgLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIFN0b3AgdHJ5aW5nIHRvIGxvYWQgZnVydGhlciBwYWdlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoIWNhbkxvYWQpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gU2tpcCB0aGlzIHBhZ2UgZm9yIG5vd1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGF3YWl0IGxvYWRSYW5nZShvZmZzZXQsIHJhbmdlU2l6ZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBbQ29sbGVjdGlvbl0gRmFpbGVkIHRvIGxvYWQgcGFnZSAke3BhZ2V9OmAsIGVycm9yKTtcbiAgICAgICAgICAgICAgYnJlYWs7IC8vIFN0b3Agc2VxdWVudGlhbCBsb2FkaW5nIG9uIGVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVuZFBhZ2UgPiBsaW1pdGVkRW5kUGFnZSkge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBTdG9wcGVkIGF0IHBhZ2UgJHtsaW1pdGVkRW5kUGFnZX0gdG8gcHJldmVudCBleGNlc3NpdmUgbG9hZGluZyAocmVxdWVzdGVkIHVwIHRvICR7ZW5kUGFnZX0pYCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBPcmlnaW5hbCBsb2dpYyBmb3Igb2Zmc2V0L3BhZ2Ugc3RyYXRlZ2llc1xuICAgICAgLy8gQ2FsY3VsYXRlIHJhbmdlIGJvdW5kYXJpZXNcbiAgICAgIGNvbnN0IHN0YXJ0UmFuZ2UgPSBNYXRoLmZsb29yKHJhbmdlLnN0YXJ0IC8gcmFuZ2VTaXplKTtcbiAgICAgIGNvbnN0IGVuZFJhbmdlID0gTWF0aC5mbG9vcihyYW5nZS5lbmQgLyByYW5nZVNpemUpO1xuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBwYWdlIHN0cmF0ZWd5IC0gc3RhcnRSYW5nZTogJHtzdGFydFJhbmdlfSwgZW5kUmFuZ2U6ICR7ZW5kUmFuZ2V9LCBsb2FkZWRSYW5nZXM6IFske0FycmF5LmZyb20obG9hZGVkUmFuZ2VzKS5qb2luKFwiLCBcIil9XWAsXG4gICAgICAvLyApO1xuXG4gICAgICAvLyBDb2xsZWN0IHJhbmdlcyB0aGF0IG5lZWQgbG9hZGluZ1xuICAgICAgY29uc3QgcmFuZ2VzVG9Mb2FkOiBudW1iZXJbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgcmFuZ2VJZCA9IHN0YXJ0UmFuZ2U7IHJhbmdlSWQgPD0gZW5kUmFuZ2U7IHJhbmdlSWQrKykge1xuICAgICAgICBpZiAoIWxvYWRlZFJhbmdlcy5oYXMocmFuZ2VJZCkgJiYgIXBlbmRpbmdSYW5nZXMuaGFzKHJhbmdlSWQpKSB7XG4gICAgICAgICAgcmFuZ2VzVG9Mb2FkLnB1c2gocmFuZ2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJhbmdlc1RvTG9hZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gQWxsIHJhbmdlcyBhcmUgYWxyZWFkeSBsb2FkZWQgb3IgcGVuZGluZ1xuICAgICAgICAvLyBCdXQgdmVyaWZ5IHRoZSBkYXRhIGFjdHVhbGx5IGV4aXN0cyBpbiBpdGVtcyBhcnJheSAoZGVmZW5zaXZlIGNoZWNrKVxuICAgICAgICBmb3IgKGxldCByYW5nZUlkID0gc3RhcnRSYW5nZTsgcmFuZ2VJZCA8PSBlbmRSYW5nZTsgcmFuZ2VJZCsrKSB7XG4gICAgICAgICAgaWYgKGxvYWRlZFJhbmdlcy5oYXMocmFuZ2VJZCkpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgcmFuZ2UgYWN0dWFsbHkgaGFzIGRhdGFcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlU3RhcnQgPSByYW5nZUlkICogcmFuZ2VTaXplO1xuICAgICAgICAgICAgY29uc3QgaGFzRGF0YSA9IGl0ZW1zXG4gICAgICAgICAgICAgIC5zbGljZShyYW5nZVN0YXJ0LCByYW5nZVN0YXJ0ICsgcmFuZ2VTaXplKVxuICAgICAgICAgICAgICAuc29tZSgoaXRlbSkgPT4gaXRlbSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGlmICghaGFzRGF0YSkge1xuICAgICAgICAgICAgICAvLyBSYW5nZSBtYXJrZWQgbG9hZGVkIGJ1dCBubyBkYXRhIC0gZm9yY2UgcmVsb2FkXG4gICAgICAgICAgICAgIGxvYWRlZFJhbmdlcy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgICAgICAgIHJhbmdlc1RvTG9hZC5wdXNoKHJhbmdlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgcXVldWVkIHJlcXVlc3RzIHdlIHNob3VsZCBwcm9jZXNzXG4gICAgICAgIGlmIChcbiAgICAgICAgICByYW5nZXNUb0xvYWQubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggPiAwICYmXG4gICAgICAgICAgYWN0aXZlTG9hZENvdW50IDwgbWF4Q29uY3VycmVudFJlcXVlc3RzXG4gICAgICAgICkge1xuICAgICAgICAgIHByb2Nlc3NRdWV1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyYW5nZXNUb0xvYWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIExvYWRpbmcgJHtyYW5nZXNUb0xvYWQubGVuZ3RofSByYW5nZXM6IFske3Jhbmdlc1RvTG9hZC5qb2luKFwiLCBcIil9XWAsXG4gICAgICAvLyApO1xuXG4gICAgICAvLyBMb2FkIHJhbmdlcyBpbmRpdmlkdWFsbHkgLSBubyBtZXJnaW5nIHRvIGF2b2lkIGxvYWRpbmcgb2xkIHJhbmdlc1xuICAgICAgY29uc3QgcHJvbWlzZXMgPSByYW5nZXNUb0xvYWQubWFwKChyYW5nZUlkKSA9PlxuICAgICAgICBsb2FkUmFuZ2UocmFuZ2VJZCAqIHJhbmdlU2l6ZSwgcmFuZ2VTaXplKSxcbiAgICAgICk7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocHJvbWlzZXMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBWZWxvY2l0eS1hd2FyZSB3cmFwcGVyIGZvciBsb2FkTWlzc2luZ1Jhbmdlc1xuICAgICAqL1xuICAgIGNvbnN0IGxvYWRNaXNzaW5nUmFuZ2VzID0gKFxuICAgICAgcmFuZ2U6IHtcbiAgICAgICAgc3RhcnQ6IG51bWJlcjtcbiAgICAgICAgZW5kOiBudW1iZXI7XG4gICAgICB9LFxuICAgICAgY2FsbGVyPzogc3RyaW5nLFxuICAgICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcmFuZ2VLZXkgPSBnZXRSYW5nZUtleShyYW5nZSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBsb2FkaW5nXG4gICAgICAgIGlmIChhY3RpdmVMb2FkUmFuZ2VzLmhhcyhyYW5nZUtleSkpIHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCBpZiBkcmFnZ2luZyB3aXRoIGxvdyB2ZWxvY2l0eSAoYnV0IG5vdCBpZiB3ZSdyZSBpZGxlKVxuICAgICAgICBpZiAoaXNEcmFnZ2luZyAmJiBjdXJyZW50VmVsb2NpdHkgPCAwLjUgJiYgY3VycmVudFZlbG9jaXR5ID4gMCkge1xuICAgICAgICAgIGNhbmNlbGxlZExvYWRzKys7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHZlbG9jaXR5IC0gaWYgdG9vIGhpZ2gsIGNhbmNlbCB0aGUgcmVxdWVzdCBlbnRpcmVseVxuICAgICAgICBpZiAoIWNhbkxvYWQoKSkge1xuICAgICAgICAgIGNhbmNlbGxlZExvYWRzKys7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGNhcGFjaXR5XG4gICAgICAgIGlmIChhY3RpdmVMb2FkQ291bnQgPCBtYXhDb25jdXJyZW50UmVxdWVzdHMpIHtcbiAgICAgICAgICAvLyBFeGVjdXRlIGltbWVkaWF0ZWx5XG4gICAgICAgICAgZXhlY3V0ZVF1ZXVlZExvYWQoe1xuICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICBwcmlvcml0eTogXCJub3JtYWxcIixcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgICBjYWxsZXIsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgZW5hYmxlUmVxdWVzdFF1ZXVlICYmXG4gICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggPCBtYXhRdWV1ZVNpemVcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gUXVldWUgdGhlIHJlcXVlc3RcbiAgICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICBwcmlvcml0eTogXCJub3JtYWxcIixcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgICBjYWxsZXIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0xvYWRpbmdNYW5hZ2VyXSBRdWV1ZWQgcmVxdWVzdCAoYXQgY2FwYWNpdHkpLCBxdWV1ZSBzaXplOiAke2xvYWRSZXF1ZXN0UXVldWUubGVuZ3RofWBcbiAgICAgICAgICAvLyApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFF1ZXVlIGlzIGZ1bGwgLSBidXQgZG9uJ3QgZHJvcCBpZGxlL3JhbmdlLWNoYW5nZWQgcmVxdWVzdHMsIHRoZXkncmUgY3JpdGljYWwhXG4gICAgICAgICAgLy8gSW5zdGVhZCwgY2xlYXIgb2xkIHF1ZXVlZCByZXF1ZXN0cyBhbmQgYWRkIHRoZSBuZXcgb25lXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgY2FsbGVyID09PSBcInZpZXdwb3J0OmlkbGVcIiB8fFxuICAgICAgICAgICAgY2FsbGVyID09PSBcInZpZXdwb3J0OnJhbmdlLWNoYW5nZWRcIlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gQ2xlYXIgb2xkIHF1ZXVlZCByZXF1ZXN0cyAtIHRoZXkncmUgZm9yIHJhbmdlcyB1c2VyIHNjcm9sbGVkIHBhc3RcbiAgICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUuZm9yRWFjaCgocikgPT4ge1xuICAgICAgICAgICAgICBjYW5jZWxsZWRMb2FkcysrO1xuICAgICAgICAgICAgICByLnJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggPSAwO1xuICAgICAgICAgICAgLy8gUXVldWUgdGhpcyBwcmlvcml0eSByZXF1ZXN0XG4gICAgICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgICAgcHJpb3JpdHk6IFwiaGlnaFwiLFxuICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICAgICAgY2FsbGVyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFF1ZXVlIG92ZXJmbG93IC0gcmVzb2x2ZSB0byBhdm9pZCBlcnJvcnNcbiAgICAgICAgICAgIGlmIChsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA+PSBtYXhRdWV1ZVNpemUpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGxvYWRSZXF1ZXN0UXVldWUuc3BsaWNlKFxuICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggLSBtYXhRdWV1ZVNpemUsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJlbW92ZWQuZm9yRWFjaCgocikgPT4ge1xuICAgICAgICAgICAgICAgIGNhbmNlbGxlZExvYWRzKys7XG4gICAgICAgICAgICAgICAgci5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHJ5IGEgZmFpbGVkIHJhbmdlXG4gICAgICovXG4gICAgY29uc3QgcmV0cnlGYWlsZWRSYW5nZSA9IGFzeW5jIChyYW5nZUlkOiBudW1iZXIpOiBQcm9taXNlPGFueVtdPiA9PiB7XG4gICAgICBmYWlsZWRSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gcmFuZ2VJZCAqIHJhbmdlU2l6ZTtcbiAgICAgIHJldHVybiBsb2FkUmFuZ2Uob2Zmc2V0LCByYW5nZVNpemUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdG90YWwgaXRlbXMgY291bnRcbiAgICAgKi9cbiAgICBjb25zdCBzZXRUb3RhbEl0ZW1zID0gKHRvdGFsOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgIHRvdGFsSXRlbXMgPSB0b3RhbDtcblxuICAgICAgLy8gVXBkYXRlIHZpZXdwb3J0IHN0YXRlJ3MgdG90YWwgaXRlbXNcbiAgICAgIGNvbnN0IHZpZXdwb3J0U3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG4gICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgPSB0b3RhbDtcbiAgICAgIH1cblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnRvdGFsLWl0ZW1zLWNoYW5nZWRcIiwgeyB0b3RhbCB9KTtcbiAgICB9O1xuXG4gICAgLy8gSG9vayBpbnRvIHZpZXdwb3J0IGluaXRpYWxpemF0aW9uXG4gICAgY29uc3Qgb3JpZ2luYWxJbml0aWFsaXplID0gY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemU7XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbEluaXRpYWxpemUoKTtcbiAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBpbml0aWFsaXplZFxuICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgaW5pdGlhbCB0b3RhbCBpZiBwcm92aWRlZFxuICAgICAgaWYgKGNvbXBvbmVudC50b3RhbEl0ZW1zKSB7XG4gICAgICAgIHRvdGFsSXRlbXMgPSBjb21wb25lbnQudG90YWxJdGVtcztcbiAgICAgIH1cblxuICAgICAgLy8gTGlzdGVuIGZvciBkcmFnIGV2ZW50c1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpkcmFnLXN0YXJ0XCIsICgpID0+IHtcbiAgICAgICAgaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpkcmFnLWVuZFwiLCAoKSA9PiB7XG4gICAgICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgLy8gUHJvY2VzcyBhbnkgcXVldWVkIHJlcXVlc3RzIGFmdGVyIGRyYWcgZW5kcyAoc2FmZXR5IG1lYXN1cmUpXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyBwbGFjZWhvbGRlcnMgYXJlIHJlcGxhY2VkIGV2ZW4gaWYgaWRsZSBkZXRlY3Rpb24gZmFpbHNcbiAgICAgICAgaWYgKGxvYWRPbkRyYWdFbmQpIHtcbiAgICAgICAgICBwcm9jZXNzUXVldWUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgcmFuZ2UgY2hhbmdlc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkXCIsIGFzeW5jIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgLy8gRG9uJ3QgbG9hZCBkdXJpbmcgZmFzdCBzY3JvbGxpbmcgLSBsb2FkTWlzc2luZ1JhbmdlcyB3aWxsIGhhbmRsZSB2ZWxvY2l0eSBjaGVja1xuXG4gICAgICAgIC8vIEV4dHJhY3QgcmFuZ2UgZnJvbSBldmVudCBkYXRhIC0gdmlydHVhbCBmZWF0dXJlIGVtaXRzIHsgcmFuZ2U6IHsgc3RhcnQsIGVuZCB9LCBzY3JvbGxQb3NpdGlvbiB9XG4gICAgICAgIGNvbnN0IHJhbmdlID0gZGF0YS5yYW5nZSB8fCBkYXRhO1xuICAgICAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHJhbmdlO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHJhbmdlIGJlZm9yZSBsb2FkaW5nXG4gICAgICAgIGlmICh0eXBlb2Ygc3RhcnQgIT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIGVuZCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIFwiW0NvbGxlY3Rpb25dIEludmFsaWQgcmFuZ2UgaW4gdmlld3BvcnQ6cmFuZ2UtY2hhbmdlZCBldmVudDpcIixcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTa2lwIGxvYWRpbmcgcGFnZSAxIGlmIHdlIGhhdmUgYW4gaW5pdGlhbFNjcm9sbEluZGV4IGFuZCBoYXZlbid0IGNvbXBsZXRlZCBpbml0aWFsIGxvYWQgeWV0XG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgdGhlIHJlcXVlc3RBbmltYXRpb25GcmFtZSBpbiB2aXJ0dWFsLnRzIGZyb20gdHJpZ2dlcmluZyBhIHBhZ2UgMSBsb2FkXG4gICAgICAgIC8vIGFmdGVyIHdlJ3ZlIGFscmVhZHkgc3RhcnRlZCBsb2FkaW5nIHRoZSBjb3JyZWN0IGluaXRpYWwgcGFnZVxuICAgICAgICBpZiAoaGFzSW5pdGlhbFNjcm9sbEluZGV4ICYmICFoYXNDb21wbGV0ZWRJbml0aWFsUG9zaXRpb25Mb2FkKSB7XG4gICAgICAgICAgY29uc3QgcGFnZTFFbmRJbmRleCA9IHJhbmdlU2l6ZSAtIDE7IC8vIGUuZy4sIDI5IGZvciByYW5nZVNpemU9MzBcbiAgICAgICAgICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kIDw9IHBhZ2UxRW5kSW5kZXgpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSByZXF1ZXN0IGZvciBwYWdlIDEsIHNraXAgaXRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2FkIG1pc3NpbmcgcmFuZ2VzIGlmIG5lZWRlZFxuICAgICAgICBhd2FpdCBsb2FkTWlzc2luZ1Jhbmdlcyh7IHN0YXJ0LCBlbmQgfSwgXCJ2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkXCIpO1xuXG4gICAgICAgIC8vIEV2aWN0IGRpc3RhbnQgaXRlbXMgdG8gcHJldmVudCBtZW1vcnkgYmxvYXRcbiAgICAgICAgZXZpY3REaXN0YW50SXRlbXMoc3RhcnQsIGVuZCk7XG5cbiAgICAgICAgLy8gRm9yIGN1cnNvciBtb2RlLCBjaGVjayBpZiB3ZSBuZWVkIHRvIHVwZGF0ZSB2aXJ0dWFsIHNpemVcbiAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImN1cnNvclwiICYmICFoYXNSZWFjaGVkRW5kKSB7XG4gICAgICAgICAgY29uc3QgbG9hZGVkSXRlbXNDb3VudCA9IGl0ZW1zLmZpbHRlcihcbiAgICAgICAgICAgIChpdGVtKSA9PiBpdGVtICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgKS5sZW5ndGg7XG4gICAgICAgICAgY29uc3QgbWFyZ2luSXRlbXMgPVxuICAgICAgICAgICAgcmFuZ2VTaXplICpcbiAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QQUdJTkFUSU9OLkNVUlNPUl9TQ1JPTExfTUFSR0lOX01VTFRJUExJRVI7XG4gICAgICAgICAgY29uc3QgbWluVmlydHVhbEl0ZW1zID1cbiAgICAgICAgICAgIHJhbmdlU2l6ZSAqXG4gICAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUEFHSU5BVElPTi5DVVJTT1JfTUlOX1ZJUlRVQUxfU0laRV9NVUxUSVBMSUVSO1xuICAgICAgICAgIGNvbnN0IGR5bmFtaWNUb3RhbCA9IE1hdGgubWF4KFxuICAgICAgICAgICAgbG9hZGVkSXRlbXNDb3VudCArIG1hcmdpbkl0ZW1zLFxuICAgICAgICAgICAgbWluVmlydHVhbEl0ZW1zLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoZHluYW1pY1RvdGFsICE9PSB0b3RhbEl0ZW1zKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBVcGRhdGluZyBjdXJzb3IgdmlydHVhbCBzaXplIGZyb20gJHt0b3RhbEl0ZW1zfSB0byAke2R5bmFtaWNUb3RhbH1gLFxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgIHNldFRvdGFsSXRlbXMoZHluYW1pY1RvdGFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIHZlbG9jaXR5IGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dmVsb2NpdHktY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmVsb2NpdHkgPSBjdXJyZW50VmVsb2NpdHk7XG4gICAgICAgIGN1cnJlbnRWZWxvY2l0eSA9IE1hdGguYWJzKGRhdGEudmVsb2NpdHkgfHwgMCk7XG5cbiAgICAgICAgLy8gV2hlbiB2ZWxvY2l0eSBkcm9wcyBiZWxvdyB0aHJlc2hvbGQsIHByb2Nlc3MgcXVldWVcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByZXZpb3VzVmVsb2NpdHkgPiBjYW5jZWxMb2FkVGhyZXNob2xkICYmXG4gICAgICAgICAgY3VycmVudFZlbG9jaXR5IDw9IGNhbmNlbExvYWRUaHJlc2hvbGRcbiAgICAgICAgKSB7XG4gICAgICAgICAgcHJvY2Vzc1F1ZXVlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGlkbGUgc3RhdGUgdG8gcHJvY2VzcyBxdWV1ZVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDppZGxlXCIsIGFzeW5jIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY3VycmVudFZlbG9jaXR5ID0gMDtcblxuICAgICAgICAvLyBSZXNldCBkcmFnZ2luZyBzdGF0ZSBvbiBpZGxlIHNpbmNlIHVzZXIgaGFzIHN0b3BwZWQgbW92aW5nXG4gICAgICAgIGlmIChpc0RyYWdnaW5nKSB7XG4gICAgICAgICAgaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGN1cnJlbnQgdmlzaWJsZSByYW5nZSBmcm9tIHZpZXdwb3J0XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0U3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG4gICAgICAgIGNvbnN0IHZpc2libGVSYW5nZSA9IHZpZXdwb3J0U3RhdGU/LnZpc2libGVSYW5nZTtcblxuICAgICAgICBpZiAodmlzaWJsZVJhbmdlKSB7XG4gICAgICAgICAgLy8gQ2xlYXIgc3RhbGUgcmVxdWVzdHMgZnJvbSBxdWV1ZSB0aGF0IGFyZSBmYXIgZnJvbSBjdXJyZW50IHZpc2libGUgcmFuZ2VcbiAgICAgICAgICBjb25zdCBidWZmZXIgPSByYW5nZVNpemUgKiAyOyAvLyBBbGxvdyBzb21lIGJ1ZmZlclxuICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUgPSBsb2FkUmVxdWVzdFF1ZXVlLmZpbHRlcigocmVxdWVzdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdEVuZCA9IHJlcXVlc3QucmFuZ2UuZW5kO1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdFN0YXJ0ID0gcmVxdWVzdC5yYW5nZS5zdGFydDtcbiAgICAgICAgICAgIGNvbnN0IGlzUmVsZXZhbnQgPVxuICAgICAgICAgICAgICByZXF1ZXN0RW5kID49IHZpc2libGVSYW5nZS5zdGFydCAtIGJ1ZmZlciAmJlxuICAgICAgICAgICAgICByZXF1ZXN0U3RhcnQgPD0gdmlzaWJsZVJhbmdlLmVuZCArIGJ1ZmZlcjtcblxuICAgICAgICAgICAgaWYgKCFpc1JlbGV2YW50KSB7XG4gICAgICAgICAgICAgIHJlcXVlc3QucmVzb2x2ZSgpOyAvLyBSZXNvbHZlIHRvIGF2b2lkIGhhbmdpbmcgcHJvbWlzZXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpc1JlbGV2YW50O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gTG9hZCB0aGUgY3VycmVudCB2aXNpYmxlIHJhbmdlIGlmIG5lZWRlZFxuICAgICAgICAgIGF3YWl0IGxvYWRNaXNzaW5nUmFuZ2VzKHZpc2libGVSYW5nZSwgXCJ2aWV3cG9ydDppZGxlXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxzbyBwcm9jZXNzIGFueSBxdWV1ZWQgcmVxdWVzdHNcbiAgICAgICAgcHJvY2Vzc1F1ZXVlKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtIHJlbW92YWwgLSBET04nVCBjbGVhciBsb2FkZWRSYW5nZXMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZWxvYWRcbiAgICAgIC8vIFRoZSBkYXRhIGlzIGFscmVhZHkgc2hpZnRlZCBsb2NhbGx5IGluIGFwaS50cyBhbmQgcmVuZGVyaW5nLnRzXG4gICAgICAvLyBSZWxvYWRpbmcgd291bGQgY2F1c2UgcmFjZSBjb25kaXRpb25zIGFuZCBvdmVyd3JpdGUgdGhlIGNvcnJlY3QgdG90YWxJdGVtc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJpdGVtOnJlbW92ZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW0NvbGxlY3Rpb25dIGl0ZW06cmVtb3ZlZCBldmVudCAtIGluZGV4OiAke2RhdGEuaW5kZXh9YCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBbQ29sbGVjdGlvbl0gaXRlbXMubGVuZ3RoOiAke2l0ZW1zLmxlbmd0aH1gKTtcblxuICAgICAgICAvLyBVcGRhdGUgZGlzY292ZXJlZFRvdGFsIHRvIG1hdGNoIHRoZSBuZXcgY291bnRcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBzdGFsZSBkaXNjb3ZlcmVkVG90YWwgZnJvbSBiZWluZyB1c2VkIG9uIG5leHQgbG9hZFxuICAgICAgICBpZiAoZGlzY292ZXJlZFRvdGFsICE9PSBudWxsICYmIGRpc2NvdmVyZWRUb3RhbCA+IDApIHtcbiAgICAgICAgICBkaXNjb3ZlcmVkVG90YWwgPSBkaXNjb3ZlcmVkVG90YWwgLSAxO1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBVcGRhdGVkIGRpc2NvdmVyZWRUb3RhbCB0bzogJHtkaXNjb3ZlcmVkVG90YWx9YCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTk9URTogRG8gTk9UIGRlY3JlbWVudCB0b3RhbEl0ZW1zIGhlcmUhXG4gICAgICAgIC8vIGFwaS50cyBhbHJlYWR5IGNhbGxzIHNldFRvdGFsSXRlbXMoKSBhZnRlciBlbWl0dGluZyBpdGVtOnJlbW92ZS1yZXF1ZXN0LFxuICAgICAgICAvLyB3aGljaCBwcm9wZXJseSB1cGRhdGVzIHRvdGFsSXRlbXMuIERlY3JlbWVudGluZyBoZXJlIHdvdWxkIGNhdXNlIGEgZG91YmxlLWRlY3JlbWVudC5cblxuICAgICAgICAvLyBET04nVCBjbGVhciBsb2FkZWRSYW5nZXMgLSB3ZSB3YW50IHRvIGtlZXAgdXNpbmcgdGhlIGxvY2FsIGRhdGFcbiAgICAgICAgLy8gVGhlIGRhdGEgaGFzIGJlZW4gc2hpZnRlZCBsb2NhbGx5IGFuZCBpcyBzdGlsbCB2YWxpZFxuICAgICAgICAvLyBDbGVhcmluZyB3b3VsZCB0cmlnZ2VyIGEgcmVsb2FkIHdoaWNoIGNhdXNlcyByYWNlIGNvbmRpdGlvbnNcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBLZWVwaW5nIGxvYWRlZFJhbmdlcyBpbnRhY3Q6YCxcbiAgICAgICAgLy8gICBBcnJheS5mcm9tKGxvYWRlZFJhbmdlcyksXG4gICAgICAgIC8vICk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTG9hZCBpbml0aWFsIGRhdGEgaWYgY29sbGVjdGlvbiBpcyBhdmFpbGFibGUgYW5kIGF1dG9Mb2FkIGlzIGVuYWJsZWRcbiAgICAgIGlmIChjb2xsZWN0aW9uICYmIGF1dG9Mb2FkKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgYW4gaW5pdGlhbCBzY3JvbGwgaW5kZXggT1IgYSBzZWxlY3RJZCwgbG9hZCBkYXRhIGZvciB0aGF0IHBvc2l0aW9uIGRpcmVjdGx5XG4gICAgICAgIC8vIERvbid0IHVzZSBzY3JvbGxUb0luZGV4KCkgYXMgaXQgdHJpZ2dlcnMgYW5pbWF0aW9uL3ZlbG9jaXR5IHRyYWNraW5nXG4gICAgICAgIC8vIHZpcnR1YWwudHMgaGFzIGFscmVhZHkgc2V0IHRoZSBzY3JvbGwgcG9zaXRpb24gYW5kIGNhbGN1bGF0ZWQgdGhlIHZpc2libGUgcmFuZ2VcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGluaXRpYWxTY3JvbGxJbmRleCA+IDAgfHxcbiAgICAgICAgICAoc2VsZWN0SWQgIT09IHVuZGVmaW5lZCAmJiBzZWxlY3RJZCAhPT0gbnVsbClcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gR2V0IHRoZSB2aXNpYmxlIHJhbmdlIHRoYXQgd2FzIGFscmVhZHkgY2FsY3VsYXRlZCBieSB2aXJ0dWFsLnRzXG4gICAgICAgICAgLy8gV2UgbWlzc2VkIHRoZSBpbml0aWFsIHZpZXdwb3J0OnJhbmdlLWNoYW5nZWQgZXZlbnQgYmVjYXVzZSBvdXIgbGlzdGVuZXIgd2Fzbid0IHJlYWR5IHlldFxuICAgICAgICAgIGNvbnN0IHZpc2libGVSYW5nZSA9IGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0VmlzaWJsZVJhbmdlPy4oKTtcblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHZpc2libGVSYW5nZSAmJlxuICAgICAgICAgICAgKHZpc2libGVSYW5nZS5zdGFydCA+IDAgfHwgdmlzaWJsZVJhbmdlLmVuZCA+IDApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBVc2UgdGhlIHByZS1jYWxjdWxhdGVkIHZpc2libGUgcmFuZ2UgZnJvbSB2aXJ0dWFsLnRzXG4gICAgICAgICAgICBsb2FkTWlzc2luZ1Jhbmdlcyh2aXNpYmxlUmFuZ2UsIFwiaW5pdGlhbC1wb3NpdGlvblwiKVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgLy8gRW1pdCBldmVudCB0byBzZWxlY3QgaXRlbSBhZnRlciBpbml0aWFsIGxvYWQgaWYgc2VsZWN0SWQgaXMgcHJvdmlkZWRcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImNvbGxlY3Rpb246aW5pdGlhbC1sb2FkLWNvbXBsZXRlXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0SWQsXG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxTY3JvbGxJbmRleCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICBcIltDb2xsZWN0aW9uXSBGYWlsZWQgdG8gbG9hZCBpbml0aWFsIHBvc2l0aW9uIGRhdGE6XCIsXG4gICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQgPSB0cnVlOyAvLyBBbGxvdyBub3JtYWwgbG9hZGluZyBldmVuIG9uIGVycm9yXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFjazogY2FsY3VsYXRlIHJhbmdlIGZyb20gaW5pdGlhbFNjcm9sbEluZGV4XG4gICAgICAgICAgICAvLyBUaGlzIGhhbmRsZXMgZWRnZSBjYXNlcyB3aGVyZSB2aXNpYmxlUmFuZ2Ugd2Fzbid0IHJlYWR5XG4gICAgICAgICAgICBjb25zdCBvdmVyc2NhbiA9IDI7XG4gICAgICAgICAgICBjb25zdCBlc3RpbWF0ZWRWaXNpYmxlQ291bnQgPSBNYXRoLmNlaWwoNjAwIC8gNTApOyAvLyB+MTIgaXRlbXNcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoMCwgaW5pdGlhbFNjcm9sbEluZGV4IC0gb3ZlcnNjYW4pO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gaW5pdGlhbFNjcm9sbEluZGV4ICsgZXN0aW1hdGVkVmlzaWJsZUNvdW50ICsgb3ZlcnNjYW47XG5cbiAgICAgICAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzKHsgc3RhcnQsIGVuZCB9LCBcImluaXRpYWwtcG9zaXRpb24tZmFsbGJhY2tcIilcbiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vIEVtaXQgZXZlbnQgdG8gc2VsZWN0IGl0ZW0gYWZ0ZXIgaW5pdGlhbCBsb2FkIGlmIHNlbGVjdElkIGlzIHByb3ZpZGVkXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJjb2xsZWN0aW9uOmluaXRpYWwtbG9hZC1jb21wbGV0ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdElkLFxuICAgICAgICAgICAgICAgICAgICBpbml0aWFsU2Nyb2xsSW5kZXgsXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgXCJbQ29sbGVjdGlvbl0gRmFpbGVkIHRvIGxvYWQgaW5pdGlhbCBwb3NpdGlvbiBkYXRhIChmYWxsYmFjayk6XCIsXG4gICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQgPSB0cnVlOyAvLyBBbGxvdyBub3JtYWwgbG9hZGluZyBldmVuIG9uIGVycm9yXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBpbml0aWFsIHNjcm9sbCBpbmRleCAtIGxvYWQgZnJvbSBiZWdpbm5pbmcgYXMgbm9ybWFsXG4gICAgICAgIGxvYWRSYW5nZSgwLCByYW5nZVNpemUpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGF1dG9TZWxlY3RGaXJzdCAtIGdldCBmaXJzdCBpdGVtIElEIGFuZCBlbWl0IHNlbGVjdGlvbiBldmVudFxuICAgICAgICAgICAgaWYgKGF1dG9TZWxlY3RGaXJzdCAmJiBpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZpcnN0SXRlbSA9IGl0ZW1zWzBdO1xuICAgICAgICAgICAgICBjb25zdCBmaXJzdElkID0gZmlyc3RJdGVtPy5faWQgfHwgZmlyc3RJdGVtPy5pZDtcbiAgICAgICAgICAgICAgaWYgKGZpcnN0SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJjb2xsZWN0aW9uOmluaXRpYWwtbG9hZC1jb21wbGV0ZVwiLCB7XG4gICAgICAgICAgICAgICAgICBzZWxlY3RJZDogZmlyc3RJZCxcbiAgICAgICAgICAgICAgICAgIGluaXRpYWxTY3JvbGxJbmRleDogMCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIltDb2xsZWN0aW9uXSBGYWlsZWQgdG8gbG9hZCBpbml0aWFsIGRhdGE6XCIsIGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVzZXQgY29sbGVjdGlvbiBzdGF0ZSB3aXRob3V0IGRlc3Ryb3lpbmcgdGhlIGNvbXBvbmVudFxuICAgICAqIENsZWFycyBhbGwgbG9hZGVkIGRhdGEgYW5kIHByZXBhcmVzIGZvciBmcmVzaCBsb2FkXG4gICAgICovXG4gICAgY29uc3QgcmVzZXQgPSAoKSA9PiB7XG4gICAgICBsb2dNZW1vcnlTdGF0cyhcInJlc2V0OmJlZm9yZVwiKTtcblxuICAgICAgLy8gQWJvcnQgYWxsIGluLWZsaWdodCByZXF1ZXN0c1xuICAgICAgYWJvcnRDb250cm9sbGVycy5mb3JFYWNoKChjb250cm9sbGVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gSWdub3JlIGFib3J0IGVycm9yc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGFib3J0Q29udHJvbGxlcnMuY2xlYXIoKTtcblxuICAgICAgLy8gQ2xlYXIgYWxsIGRhdGEgc3RydWN0dXJlc1xuICAgICAgaXRlbXMubGVuZ3RoID0gMDtcbiAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID0gMDtcbiAgICAgIGxvYWRlZFJhbmdlcy5jbGVhcigpO1xuICAgICAgcGVuZGluZ1Jhbmdlcy5jbGVhcigpO1xuICAgICAgZmFpbGVkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICBhY3RpdmVMb2FkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICBhY3RpdmVSZXF1ZXN0cy5jbGVhcigpO1xuICAgICAgY3Vyc29yTWFwLmNsZWFyKCk7XG4gICAgICBwYWdlVG9PZmZzZXRNYXAuY2xlYXIoKTtcblxuICAgICAgLy8gUmVzZXQgc3RhdGVcbiAgICAgIHRvdGFsSXRlbXMgPSAwO1xuICAgICAgY3VycmVudEN1cnNvciA9IG51bGw7XG4gICAgICBoaWdoZXN0TG9hZGVkUGFnZSA9IDA7XG4gICAgICBkaXNjb3ZlcmVkVG90YWwgPSBudWxsO1xuICAgICAgaGFzUmVhY2hlZEVuZCA9IGZhbHNlO1xuICAgICAgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IGZhbHNlO1xuXG4gICAgICAvLyBSZXNldCBjb3VudGVyc1xuICAgICAgYWN0aXZlTG9hZENvdW50ID0gMDtcbiAgICAgIGNvbXBsZXRlZExvYWRzID0gMDtcbiAgICAgIGZhaWxlZExvYWRzID0gMDtcbiAgICAgIGNhbmNlbGxlZExvYWRzID0gMDtcblxuICAgICAgLy8gVXBkYXRlIGNvbXBvbmVudCByZWZlcmVuY2VcbiAgICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuICAgICAgY29tcG9uZW50LnRvdGFsSXRlbXMgPSAwO1xuXG4gICAgICBsb2dNZW1vcnlTdGF0cyhcInJlc2V0OmFmdGVyXCIpO1xuXG4gICAgICAvLyBFbWl0IHJlc2V0IGV2ZW50XG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwiY29sbGVjdGlvbjpyZXNldFwiKTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIGNvbGxlY3Rpb24gQVBJIHRvIHZpZXdwb3J0XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24gPSB7XG4gICAgICBsb2FkUmFuZ2U6IChvZmZzZXQ6IG51bWJlciwgbGltaXQ6IG51bWJlcikgPT4gbG9hZFJhbmdlKG9mZnNldCwgbGltaXQpLFxuICAgICAgbG9hZE1pc3NpbmdSYW5nZXM6IChcbiAgICAgICAgcmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSxcbiAgICAgICAgY2FsbGVyPzogc3RyaW5nLFxuICAgICAgKSA9PiBsb2FkTWlzc2luZ1JhbmdlcyhyYW5nZSwgY2FsbGVyIHx8IFwidmlld3BvcnQuY29sbGVjdGlvblwiKSxcbiAgICAgIGdldExvYWRlZFJhbmdlczogKCkgPT4gbG9hZGVkUmFuZ2VzLFxuICAgICAgZ2V0UGVuZGluZ1JhbmdlczogKCkgPT4gcGVuZGluZ1JhbmdlcyxcbiAgICAgIGNsZWFyRmFpbGVkUmFuZ2VzOiAoKSA9PiBmYWlsZWRSYW5nZXMuY2xlYXIoKSxcbiAgICAgIHJldHJ5RmFpbGVkUmFuZ2UsXG4gICAgICBzZXRUb3RhbEl0ZW1zLFxuICAgICAgZ2V0VG90YWxJdGVtczogKCkgPT4gdG90YWxJdGVtcyxcbiAgICAgIC8vIEN1cnNvci1zcGVjaWZpYyBtZXRob2RzXG4gICAgICBnZXRDdXJyZW50Q3Vyc29yOiAoKSA9PiBjdXJyZW50Q3Vyc29yLFxuICAgICAgZ2V0Q3Vyc29yRm9yUGFnZTogKHBhZ2U6IG51bWJlcikgPT4gY3Vyc29yTWFwLmdldChwYWdlKSB8fCBudWxsLFxuICAgICAgLy8gUmVzZXQgbWV0aG9kIGZvciByZWxvYWQgZnVuY3Rpb25hbGl0eVxuICAgICAgcmVzZXQsXG4gICAgfTtcblxuICAgIC8vIEFkZCBjb2xsZWN0aW9uIGRhdGEgYWNjZXNzIHdpdGggZGlyZWN0IGFzc2lnbm1lbnRcbiAgICAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbiA9IHtcbiAgICAgIGl0ZW1zLFxuICAgICAgZ2V0SXRlbXM6ICgpID0+IGl0ZW1zLFxuICAgICAgZ2V0SXRlbTogKGluZGV4OiBudW1iZXIpID0+IGl0ZW1zW2luZGV4XSxcbiAgICAgIGxvYWRSYW5nZSxcbiAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzOiAoXG4gICAgICAgIHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sXG4gICAgICAgIGNhbGxlcj86IHN0cmluZyxcbiAgICAgICkgPT4gbG9hZE1pc3NpbmdSYW5nZXMocmFuZ2UsIGNhbGxlciB8fCBcImNvbXBvbmVudC5jb2xsZWN0aW9uXCIpLFxuICAgICAgZ2V0TG9hZGluZ1N0YXRzOiAoKSA9PiAoe1xuICAgICAgICBwZW5kaW5nUmVxdWVzdHM6IGFjdGl2ZUxvYWRDb3VudCxcbiAgICAgICAgY29tcGxldGVkUmVxdWVzdHM6IGNvbXBsZXRlZExvYWRzLFxuICAgICAgICBmYWlsZWRSZXF1ZXN0czogZmFpbGVkTG9hZHMsXG4gICAgICAgIGNhbmNlbGxlZFJlcXVlc3RzOiBjYW5jZWxsZWRMb2FkcyxcbiAgICAgICAgY3VycmVudFZlbG9jaXR5LFxuICAgICAgICBjYW5Mb2FkOiBjYW5Mb2FkKCksXG4gICAgICAgIHF1ZXVlZFJlcXVlc3RzOiBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCxcbiAgICAgIH0pLFxuICAgICAgLy8gVG90YWwgaXRlbXMgbWFuYWdlbWVudFxuICAgICAgZ2V0VG90YWxJdGVtczogKCkgPT4gdG90YWxJdGVtcyxcbiAgICAgIHNldFRvdGFsSXRlbXMsXG4gICAgICAvLyBDdXJzb3IgbWV0aG9kc1xuICAgICAgZ2V0Q3VycmVudEN1cnNvcjogKCkgPT4gY3VycmVudEN1cnNvcixcbiAgICAgIGdldEN1cnNvckZvclBhZ2U6IChwYWdlOiBudW1iZXIpID0+IGN1cnNvck1hcC5nZXQocGFnZSkgfHwgbnVsbCxcbiAgICAgIC8vIFJlc2V0IG1ldGhvZCBmb3IgcmVsb2FkIGZ1bmN0aW9uYWxpdHlcbiAgICAgIHJlc2V0LFxuICAgIH07XG5cbiAgICAvLyBBbHNvIGVuc3VyZSBjb21wb25lbnQuaXRlbXMgaXMgdXBkYXRlZFxuICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuXG4gICAgLy8gQ2xlYW51cCBmdW5jdGlvbiAtIGNvbXByZWhlbnNpdmUgbWVtb3J5IGNsZWFudXBcbiAgICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgbG9nTWVtb3J5U3RhdHMoXCJkZXN0cm95OmJlZm9yZVwiKTtcblxuICAgICAgLy8gQWJvcnQgYWxsIGluLWZsaWdodCByZXF1ZXN0c1xuICAgICAgYWJvcnRDb250cm9sbGVycy5mb3JFYWNoKChjb250cm9sbGVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gSWdub3JlIGFib3J0IGVycm9yc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGFib3J0Q29udHJvbGxlcnMuY2xlYXIoKTtcblxuICAgICAgLy8gQ2xlYXIgYWxsIGRhdGEgc3RydWN0dXJlc1xuICAgICAgaXRlbXMubGVuZ3RoID0gMDtcbiAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID0gMDtcbiAgICAgIGxvYWRlZFJhbmdlcy5jbGVhcigpO1xuICAgICAgcGVuZGluZ1Jhbmdlcy5jbGVhcigpO1xuICAgICAgZmFpbGVkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICBhY3RpdmVMb2FkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICBhY3RpdmVSZXF1ZXN0cy5jbGVhcigpO1xuICAgICAgY3Vyc29yTWFwLmNsZWFyKCk7XG4gICAgICBwYWdlVG9PZmZzZXRNYXAuY2xlYXIoKTtcblxuICAgICAgLy8gUmVzZXQgc3RhdGVcbiAgICAgIHRvdGFsSXRlbXMgPSAwO1xuICAgICAgY3VycmVudEN1cnNvciA9IG51bGw7XG4gICAgICBoaWdoZXN0TG9hZGVkUGFnZSA9IDA7XG4gICAgICBkaXNjb3ZlcmVkVG90YWwgPSBudWxsO1xuICAgICAgaGFzUmVhY2hlZEVuZCA9IGZhbHNlO1xuXG4gICAgICAvLyBDbGVhciBjb21wb25lbnQgcmVmZXJlbmNlXG4gICAgICBpZiAoY29tcG9uZW50Lml0ZW1zID09PSBpdGVtcykge1xuICAgICAgICBjb21wb25lbnQuaXRlbXMgPSBbXTtcbiAgICAgIH1cblxuICAgICAgbG9nTWVtb3J5U3RhdHMoXCJkZXN0cm95OmFmdGVyXCIpO1xuICAgIH07XG5cbiAgICAvLyBXaXJlIGRlc3Ryb3kgaW50byB0aGUgY29tcG9uZW50J3MgZGVzdHJveSBjaGFpblxuICAgIHdyYXBEZXN0cm95KGNvbXBvbmVudCwgZGVzdHJveSk7XG5cbiAgICAvLyBSZXR1cm4gZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIGNvbGxlY3Rpb246IHtcbiAgICAgICAgLy8gRGF0YSBhY2Nlc3MgbWV0aG9kc1xuICAgICAgICBpdGVtcyxcbiAgICAgICAgZ2V0SXRlbXM6ICgpID0+IGl0ZW1zLFxuICAgICAgICBnZXRJdGVtOiAoaW5kZXg6IG51bWJlcikgPT4gaXRlbXNbaW5kZXhdLFxuICAgICAgICAvLyBMb2FkaW5nIG1ldGhvZHNcbiAgICAgICAgbG9hZFJhbmdlLFxuICAgICAgICBsb2FkTWlzc2luZ1JhbmdlczogKFxuICAgICAgICAgIHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sXG4gICAgICAgICAgY2FsbGVyPzogc3RyaW5nLFxuICAgICAgICApID0+IGxvYWRNaXNzaW5nUmFuZ2VzKHJhbmdlLCBjYWxsZXIgfHwgXCJyZXR1cm4uY29sbGVjdGlvblwiKSxcbiAgICAgICAgZ2V0TG9hZGVkUmFuZ2VzOiAoKSA9PiBsb2FkZWRSYW5nZXMsXG4gICAgICAgIGdldFBlbmRpbmdSYW5nZXM6ICgpID0+IHBlbmRpbmdSYW5nZXMsXG4gICAgICAgIGNsZWFyRmFpbGVkUmFuZ2VzOiAoKSA9PiBmYWlsZWRSYW5nZXMuY2xlYXIoKSxcbiAgICAgICAgcmV0cnlGYWlsZWRSYW5nZSxcbiAgICAgICAgc2V0VG90YWxJdGVtcyxcbiAgICAgICAgZ2V0VG90YWxJdGVtczogKCkgPT4gdG90YWxJdGVtcyxcbiAgICAgICAgLy8gQ3Vyc29yLXNwZWNpZmljIG1ldGhvZHNcbiAgICAgICAgZ2V0Q3VycmVudEN1cnNvcjogKCkgPT4gY3VycmVudEN1cnNvcixcbiAgICAgICAgZ2V0Q3Vyc29yRm9yUGFnZTogKHBhZ2U6IG51bWJlcikgPT4gY3Vyc29yTWFwLmdldChwYWdlKSB8fCBudWxsLFxuICAgICAgICAvLyBSZXNldCBtZXRob2QgZm9yIHJlbG9hZCBmdW5jdGlvbmFsaXR5XG4gICAgICAgIHJlc2V0LFxuICAgICAgfSxcbiAgICB9O1xuICB9O1xufVxuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9wbGFjZWhvbGRlcnMudHNcblxuLyoqXG4gKiBQbGFjZWhvbGRlciBGZWF0dXJlIC0gU21hcnQgcGxhY2Vob2xkZXIgZ2VuZXJhdGlvblxuICogQW5hbHl6ZXMgZmlyc3QgbG9hZGVkIGRhdGEgdG8gZ2VuZXJhdGUgcmVhbGlzdGljIG1hc2tlZCBwbGFjZWhvbGRlcnNcbiAqIFNob3dzIHBsYWNlaG9sZGVycyB3aGlsZSBkYXRhIGlzIGxvYWRpbmdcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2xsZWN0aW9uQ29tcG9uZW50IH0gZnJvbSBcIi4vY29sbGVjdGlvblwiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHBsYWNlaG9sZGVyIGZlYXR1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGFjZWhvbGRlckNvbmZpZyB7XG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuICBhbmFseXplRmlyc3RMb2FkPzogYm9vbGVhbjtcbiAgbWFza0NoYXJhY3Rlcj86IHN0cmluZztcbiAgcmFuZG9tTGVuZ3RoVmFyaWFuY2U/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEZpZWxkIHN0cnVjdHVyZSBmb3IgcGxhY2Vob2xkZXIgZ2VuZXJhdGlvblxuICovXG5pbnRlcmZhY2UgRmllbGRTdHJ1Y3R1cmUge1xuICBtaW5MZW5ndGg6IG51bWJlcjtcbiAgbWF4TGVuZ3RoOiBudW1iZXI7XG4gIGF2Z0xlbmd0aDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYWNlaG9sZGVyQ29tcG9uZW50IHtcbiAgcGxhY2Vob2xkZXJzOiB7XG4gICAgYW5hbHl6ZURhdGFTdHJ1Y3R1cmU6IChpdGVtczogYW55W10pID0+IHZvaWQ7XG4gICAgaGFzQW5hbHl6ZWRTdHJ1Y3R1cmU6ICgpID0+IGJvb2xlYW47XG4gICAgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW06IChpbmRleDogbnVtYmVyKSA9PiBhbnk7XG4gICAgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW1zOiAocmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSkgPT4gYW55W107XG4gICAgc2hvd1BsYWNlaG9sZGVyczogKHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pID0+IHZvaWQ7XG4gICAgaXNQbGFjZWhvbGRlcjogKGl0ZW06IGFueSkgPT4gYm9vbGVhbjtcbiAgICByZXBsYWNlUGxhY2Vob2xkZXJzOiAoaXRlbXM6IGFueVtdLCBvZmZzZXQ6IG51bWJlcikgPT4gdm9pZDtcbiAgICBjbGVhcjogKCkgPT4gdm9pZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBBZGRzIHBsYWNlaG9sZGVyIGZ1bmN0aW9uYWxpdHkgdG8gdmlld3BvcnQgY29tcG9uZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUGxhY2Vob2xkZXJzKGNvbmZpZzogUGxhY2Vob2xkZXJDb25maWcgPSB7fSkge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBDb2xsZWN0aW9uQ29tcG9uZW50PihcbiAgICBjb21wb25lbnQ6IFRcbiAgKTogVCAmIFBsYWNlaG9sZGVyQ29tcG9uZW50ID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICAgIGFuYWx5emVGaXJzdExvYWQgPSB0cnVlLFxuICAgICAgbWFza0NoYXJhY3RlciA9IFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVNLX0NIQVJBQ1RFUixcbiAgICAgIHJhbmRvbUxlbmd0aFZhcmlhbmNlID0gVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSXG4gICAgICAgIC5SQU5ET01fTEVOR1RIX1ZBUklBTkNFLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBTdGF0ZVxuICAgIGxldCBmaWVsZFN0cnVjdHVyZXM6IE1hcDxzdHJpbmcsIEZpZWxkU3RydWN0dXJlPiB8IG51bGwgPSBudWxsO1xuICAgIGxldCBoYXNBbmFseXplZCA9IGZhbHNlO1xuICAgIGxldCBwbGFjZWhvbGRlcklkQ291bnRlciA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBBbmFseXplIGRhdGEgc3RydWN0dXJlIGZyb20gZmlyc3QgbG9hZGVkIGl0ZW1zXG4gICAgICovXG4gICAgY29uc3QgYW5hbHl6ZURhdGFTdHJ1Y3R1cmUgPSAoaXRlbXM6IGFueVtdKTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWVuYWJsZWQgfHwgaGFzQW5hbHl6ZWQgfHwgIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBg8J+UjSBbUExBQ0VIT0xERVJTXSBBbmFseXppbmcgZGF0YSBzdHJ1Y3R1cmUgZnJvbSAke2l0ZW1zLmxlbmd0aH0gaXRlbXNgXG4gICAgICAvLyApO1xuXG4gICAgICBjb25zdCBzdHJ1Y3R1cmVzID0gbmV3IE1hcDxzdHJpbmcsIEZpZWxkU3RydWN0dXJlPigpO1xuICAgICAgY29uc3Qgc2FtcGxlU2l6ZSA9IE1hdGgubWluKFxuICAgICAgICBpdGVtcy5sZW5ndGgsXG4gICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVhfU0FNUExFX1NJWkVcbiAgICAgICk7XG5cbiAgICAgIC8vIEFuYWx5emUgZWFjaCBmaWVsZCBhY3Jvc3MgYWxsIHNhbXBsZSBpdGVtc1xuICAgICAgY29uc3QgZmllbGRTdGF0cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzYW1wbGVTaXplOyBpKyspIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgICBpZiAoIWl0ZW0gfHwgdHlwZW9mIGl0ZW0gIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKGl0ZW0pLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgLy8gU2tpcCBpbnRlcm5hbCBmaWVsZHNcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBmaWVsZC5zdGFydHNXaXRoKFwiX1wiKSB8fFxuICAgICAgICAgICAgZmllbGQgPT09IFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5QTEFDRUhPTERFUl9GTEFHXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBTdHJpbmcoaXRlbVtmaWVsZF0gfHwgXCJcIik7XG4gICAgICAgICAgY29uc3QgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuXG4gICAgICAgICAgaWYgKCFmaWVsZFN0YXRzLmhhcyhmaWVsZCkpIHtcbiAgICAgICAgICAgIGZpZWxkU3RhdHMuc2V0KGZpZWxkLCBbXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZpZWxkU3RhdHMuZ2V0KGZpZWxkKSEucHVzaChsZW5ndGgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsY3VsYXRlIHN0YXRpc3RpY3MgZm9yIGVhY2ggZmllbGRcbiAgICAgIGZpZWxkU3RhdHMuZm9yRWFjaCgobGVuZ3RocywgZmllbGQpID0+IHtcbiAgICAgICAgaWYgKGxlbmd0aHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgbWluTGVuZ3RoID0gTWF0aC5taW4oLi4ubGVuZ3Rocyk7XG4gICAgICAgIGNvbnN0IG1heExlbmd0aCA9IE1hdGgubWF4KC4uLmxlbmd0aHMpO1xuICAgICAgICBjb25zdCBhdmdMZW5ndGggPSBNYXRoLnJvdW5kKFxuICAgICAgICAgIGxlbmd0aHMucmVkdWNlKChzdW0sIGxlbikgPT4gc3VtICsgbGVuLCAwKSAvIGxlbmd0aHMubGVuZ3RoXG4gICAgICAgICk7XG5cbiAgICAgICAgc3RydWN0dXJlcy5zZXQoZmllbGQsIHtcbiAgICAgICAgICBtaW5MZW5ndGgsXG4gICAgICAgICAgbWF4TGVuZ3RoLFxuICAgICAgICAgIGF2Z0xlbmd0aCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZmllbGRTdHJ1Y3R1cmVzID0gc3RydWN0dXJlcztcbiAgICAgIGhhc0FuYWx5emVkID0gdHJ1ZTtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGDinIUgW1BMQUNFSE9MREVSU10gU3RydWN0dXJlIGFuYWx5emVkOmAsXG4gICAgICAvLyAgIE9iamVjdC5mcm9tRW50cmllcyhzdHJ1Y3R1cmVzKVxuICAgICAgLy8gKTtcblxuICAgICAgLy8gRW1pdCBldmVudFxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnBsYWNlaG9sZGVycy1zdHJ1Y3R1cmUtYW5hbHl6ZWRcIiwge1xuICAgICAgICBzdHJ1Y3R1cmU6IE9iamVjdC5mcm9tRW50cmllcyhzdHJ1Y3R1cmVzKSxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBhIHNpbmdsZSBwbGFjZWhvbGRlciBpdGVtXG4gICAgICovXG4gICAgY29uc3QgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW0gPSAoaW5kZXg6IG51bWJlcik6IGFueSA9PiB7XG4gICAgICBjb25zdCBwbGFjZWhvbGRlcjogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgICAgaWQ6IGBwbGFjZWhvbGRlci0ke3BsYWNlaG9sZGVySWRDb3VudGVyKyt9YCxcbiAgICAgICAgW1ZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5QTEFDRUhPTERFUl9GTEFHXTogdHJ1ZSxcbiAgICAgICAgX2luZGV4OiBpbmRleCxcbiAgICAgIH07XG5cbiAgICAgIGlmICghZmllbGRTdHJ1Y3R1cmVzIHx8IGZpZWxkU3RydWN0dXJlcy5zaXplID09PSAwKSB7XG4gICAgICAgIC8vIE5vIHN0cnVjdHVyZSBhbmFseXplZCB5ZXQgLSByZXR1cm4gYmFzaWMgcGxhY2Vob2xkZXJcbiAgICAgICAgcGxhY2Vob2xkZXIubGFiZWwgPSBtYXNrQ2hhcmFjdGVyLnJlcGVhdCgxMCk7XG4gICAgICAgIHJldHVybiBwbGFjZWhvbGRlcjtcbiAgICAgIH1cblxuICAgICAgLy8gR2VuZXJhdGUgZmllbGRzIGJhc2VkIG9uIGFuYWx5emVkIHN0cnVjdHVyZVxuICAgICAgZmllbGRTdHJ1Y3R1cmVzLmZvckVhY2goKHN0cnVjdHVyZSwgZmllbGQpID0+IHtcbiAgICAgICAgbGV0IGxlbmd0aDogbnVtYmVyO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICByYW5kb21MZW5ndGhWYXJpYW5jZSAmJlxuICAgICAgICAgIHN0cnVjdHVyZS5taW5MZW5ndGggIT09IHN0cnVjdHVyZS5tYXhMZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gUmFuZG9tIGxlbmd0aCB3aXRoaW4gcmFuZ2VcbiAgICAgICAgICBsZW5ndGggPSBNYXRoLmZsb29yKFxuICAgICAgICAgICAgTWF0aC5yYW5kb20oKSAqIChzdHJ1Y3R1cmUubWF4TGVuZ3RoIC0gc3RydWN0dXJlLm1pbkxlbmd0aCArIDEpICtcbiAgICAgICAgICAgICAgc3RydWN0dXJlLm1pbkxlbmd0aFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVXNlIGF2ZXJhZ2UgbGVuZ3RoXG4gICAgICAgICAgbGVuZ3RoID0gc3RydWN0dXJlLmF2Z0xlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGx5IHNvbWUgdmFyaWF0aW9uIHRvIG1ha2UgaXQgbG9vayBtb3JlIG5hdHVyYWxcbiAgICAgICAgaWYgKHJhbmRvbUxlbmd0aFZhcmlhbmNlICYmIE1hdGgucmFuZG9tKCkgPCAwLjMpIHtcbiAgICAgICAgICBsZW5ndGggPSBNYXRoLm1heCgxLCBsZW5ndGggKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAzKSAtIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcGxhY2Vob2xkZXJbZmllbGRdID0gbWFza0NoYXJhY3Rlci5yZXBlYXQobGVuZ3RoKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcGxhY2Vob2xkZXI7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIG11bHRpcGxlIHBsYWNlaG9sZGVyIGl0ZW1zXG4gICAgICovXG4gICAgY29uc3QgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW1zID0gKHJhbmdlOiB7XG4gICAgICBzdGFydDogbnVtYmVyO1xuICAgICAgZW5kOiBudW1iZXI7XG4gICAgfSk6IGFueVtdID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1zOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IHJhbmdlLnN0YXJ0OyBpIDw9IHJhbmdlLmVuZDsgaSsrKSB7XG4gICAgICAgIGl0ZW1zLnB1c2goZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW0oaSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTaG93IHBsYWNlaG9sZGVycyBmb3IgYSByYW5nZVxuICAgICAqL1xuICAgIGNvbnN0IHNob3dQbGFjZWhvbGRlcnMgPSAocmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFlbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtcyhyYW5nZSk7XG5cbiAgICAgIC8vIFVwZGF0ZSBpdGVtcyBhcnJheVxuICAgICAgaWYgKGNvbXBvbmVudC5pdGVtcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsYWNlaG9sZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gcmFuZ2Uuc3RhcnQgKyBpO1xuICAgICAgICAgIGlmICghY29tcG9uZW50Lml0ZW1zW2luZGV4XSkge1xuICAgICAgICAgICAgY29tcG9uZW50Lml0ZW1zW2luZGV4XSA9IHBsYWNlaG9sZGVyc1tpXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGDwn5SEIFtQTEFDRUhPTERFUlNdIFNob3dpbmcgJHtwbGFjZWhvbGRlcnMubGVuZ3RofSBwbGFjZWhvbGRlcnMgZm9yIHJhbmdlICR7cmFuZ2Uuc3RhcnR9LSR7cmFuZ2UuZW5kfWBcbiAgICAgICk7XG5cbiAgICAgIC8vIEVtaXQgZXZlbnRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpwbGFjZWhvbGRlcnMtc2hvd25cIiwge1xuICAgICAgICByYW5nZSxcbiAgICAgICAgY291bnQ6IHBsYWNlaG9sZGVycy5sZW5ndGgsXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYW4gaXRlbSBpcyBhIHBsYWNlaG9sZGVyXG4gICAgICovXG4gICAgY29uc3QgaXNQbGFjZWhvbGRlciA9IChpdGVtOiBhbnkpOiBib29sZWFuID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGl0ZW0gJiZcbiAgICAgICAgdHlwZW9mIGl0ZW0gPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgaXRlbVtWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuUExBQ0VIT0xERVJfRkxBR10gPT09IHRydWVcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlcGxhY2UgcGxhY2Vob2xkZXJzIHdpdGggcmVhbCBkYXRhXG4gICAgICovXG4gICAgY29uc3QgcmVwbGFjZVBsYWNlaG9sZGVycyA9IChpdGVtczogYW55W10sIG9mZnNldDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWNvbXBvbmVudC5pdGVtcykgcmV0dXJuO1xuXG4gICAgICBsZXQgcmVwbGFjZWRDb3VudCA9IDA7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBvZmZzZXQgKyBpO1xuICAgICAgICBjb25zdCBjdXJyZW50SXRlbSA9IGNvbXBvbmVudC5pdGVtc1tpbmRleF07XG5cbiAgICAgICAgaWYgKGlzUGxhY2Vob2xkZXIoY3VycmVudEl0ZW0pKSB7XG4gICAgICAgICAgY29tcG9uZW50Lml0ZW1zW2luZGV4XSA9IGl0ZW1zW2ldO1xuICAgICAgICAgIHJlcGxhY2VkQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocmVwbGFjZWRDb3VudCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYOKcqCBbUExBQ0VIT0xERVJTXSBSZXBsYWNlZCAke3JlcGxhY2VkQ291bnR9IHBsYWNlaG9sZGVycyBhdCBvZmZzZXQgJHtvZmZzZXR9YFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEVtaXQgZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnBsYWNlaG9sZGVycy1yZXBsYWNlZFwiLCB7XG4gICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgIGNvdW50OiByZXBsYWNlZENvdW50LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIHBsYWNlaG9sZGVyIHN0YXRlXG4gICAgICovXG4gICAgY29uc3QgY2xlYXIgPSAoKTogdm9pZCA9PiB7XG4gICAgICBmaWVsZFN0cnVjdHVyZXMgPSBudWxsO1xuICAgICAgaGFzQW5hbHl6ZWQgPSBmYWxzZTtcbiAgICAgIHBsYWNlaG9sZGVySWRDb3VudGVyID0gMDtcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBmdW5jdGlvblxuICAgIGNvbnN0IGluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgICBpZiAoIWVuYWJsZWQpIHJldHVybjtcblxuICAgICAgLy8gTGlzdGVuIGZvciBmaXJzdCBkYXRhIGxvYWQgdG8gYW5hbHl6ZSBzdHJ1Y3R1cmVcbiAgICAgIGlmIChhbmFseXplRmlyc3RMb2FkKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZVJhbmdlTG9hZGVkID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgIGlmICghaGFzQW5hbHl6ZWQgJiYgZGF0YS5pdGVtcyAmJiBkYXRhLml0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFuYWx5emVEYXRhU3RydWN0dXJlKGRhdGEuaXRlbXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJlcGxhY2UgYW55IHBsYWNlaG9sZGVycyB3aXRoIHJlYWwgZGF0YVxuICAgICAgICAgIHJlcGxhY2VQbGFjZWhvbGRlcnMoZGF0YS5pdGVtcywgZGF0YS5vZmZzZXQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6cmFuZ2UtbG9hZGVkXCIsIGhhbmRsZVJhbmdlTG9hZGVkKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2hvdyBpbml0aWFsIHBsYWNlaG9sZGVycyBpZiBjb25maWd1cmVkXG4gICAgICBjb25zdCB0b3RhbEl0ZW1zID0gY29tcG9uZW50LmNvbGxlY3Rpb24/LmdldFRvdGFsSXRlbXMoKSB8fCAwO1xuICAgICAgaWYgKHRvdGFsSXRlbXMgPiAwKSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxSYW5nZSA9IHtcbiAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICBlbmQ6IE1hdGgubWluKFxuICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLk1BWF9TQU1QTEVfU0laRSAtIDEsXG4gICAgICAgICAgICB0b3RhbEl0ZW1zIC0gMVxuICAgICAgICAgICksXG4gICAgICAgIH07XG4gICAgICAgIHNob3dQbGFjZWhvbGRlcnMoaW5pdGlhbFJhbmdlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ2xlYW51cCBmdW5jdGlvblxuICAgIGNvbnN0IGRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICBjbGVhcigpO1xuICAgIH07XG5cbiAgICAvLyBTdG9yZSBmdW5jdGlvbnMgZm9yIHZpZXdwb3J0IHRvIGNhbGxcbiAgICAoY29tcG9uZW50IGFzIGFueSkuX3BsYWNlaG9sZGVyc0luaXRpYWxpemUgPSBpbml0aWFsaXplO1xuICAgIChjb21wb25lbnQgYXMgYW55KS5fcGxhY2Vob2xkZXJzRGVzdHJveSA9IGRlc3Ryb3k7XG5cbiAgICAvLyBSZXR1cm4gZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIHBsYWNlaG9sZGVyczoge1xuICAgICAgICBhbmFseXplRGF0YVN0cnVjdHVyZSxcbiAgICAgICAgaGFzQW5hbHl6ZWRTdHJ1Y3R1cmU6ICgpID0+IGhhc0FuYWx5emVkLFxuICAgICAgICBnZW5lcmF0ZVBsYWNlaG9sZGVySXRlbSxcbiAgICAgICAgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW1zLFxuICAgICAgICBzaG93UGxhY2Vob2xkZXJzLFxuICAgICAgICBpc1BsYWNlaG9sZGVyLFxuICAgICAgICByZXBsYWNlUGxhY2Vob2xkZXJzLFxuICAgICAgICBjbGVhcixcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn1cbiIsCiAgICAiLyoqXG4gKiBSZW5kZXJpbmcgRmVhdHVyZSAtIEl0ZW0gcmVuZGVyaW5nIGFuZCBwb3NpdGlvbmluZyBmb3Igdmlld3BvcnRcbiAqIEhhbmRsZXMgRE9NIGVsZW1lbnQgY3JlYXRpb24sIHBvc2l0aW9uaW5nLCByZWN5Y2xpbmcsIGFuZCB1cGRhdGVzXG4gKi9cblxuaW1wb3J0IHsgYWRkQ2xhc3MsIHJlbW92ZUNsYXNzLCBoYXNDbGFzcyB9IGZyb20gXCJtdHJsXCI7XG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIGlzUGxhY2Vob2xkZXIsXG4gIGdldFZpZXdwb3J0U3RhdGUsXG4gIHdyYXBJbml0aWFsaXplLFxuICB3cmFwRGVzdHJveSxcbn0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IGNyZWF0ZUxheW91dCB9IGZyb20gXCIuLi8uLi9sYXlvdXRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJpbmdDb25maWcge1xuICB0ZW1wbGF0ZT86IChcbiAgICBpdGVtOiBhbnksXG4gICAgaW5kZXg6IG51bWJlcixcbiAgKSA9PiBzdHJpbmcgfCBIVE1MRWxlbWVudCB8IGFueVtdIHwgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgb3ZlcnNjYW4/OiBudW1iZXI7XG4gIG1lYXN1cmVJdGVtcz86IGJvb2xlYW47XG4gIGVuYWJsZVJlY3ljbGluZz86IGJvb2xlYW47XG4gIG1heFBvb2xTaXplPzogbnVtYmVyO1xuICAvKipcbiAgICogTWFpbnRhaW4gRE9NIG9yZGVyIHRvIG1hdGNoIHZpc3VhbCBpbmRleCBvcmRlci5cbiAgICogRW5hYmxlcyBDU1Mgc2VsZWN0b3JzIGxpa2UgOmZpcnN0LWNoaWxkLCA6bnRoLWNoaWxkKCkgdG8gd29yayBjb3JyZWN0bHkuXG4gICAqIERlZmF1bHQ6IHRydWVcbiAgICovXG4gIG1haW50YWluRG9tT3JkZXI/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgVmlld3BvcnRTdGF0ZSB7XG4gIHNjcm9sbFBvc2l0aW9uOiBudW1iZXI7XG4gIHRvdGFsSXRlbXM6IG51bWJlcjtcbiAgaXRlbVNpemU6IG51bWJlcjtcbiAgY29udGFpbmVyU2l6ZTogbnVtYmVyO1xuICB2aXJ0dWFsVG90YWxTaXplOiBudW1iZXI7XG4gIHZpc2libGVSYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9O1xuICBpdGVtc0NvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsO1xufVxuXG4vKipcbiAqIFJlbmRlcmluZyBmZWF0dXJlIGZvciB2aWV3cG9ydFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFJlbmRlcmluZyA9IChjb25maWc6IFJlbmRlcmluZ0NvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50Pihjb21wb25lbnQ6IFQpOiBUID0+IHtcbiAgICBjb25zdCB7XG4gICAgICB0ZW1wbGF0ZSxcbiAgICAgIG92ZXJzY2FuID0gNSxcbiAgICAgIG1lYXN1cmVJdGVtcyA9IGZhbHNlLFxuICAgICAgZW5hYmxlUmVjeWNsaW5nID0gdHJ1ZSxcbiAgICAgIG1heFBvb2xTaXplID0gVklFV1BPUlRfQ09OU1RBTlRTLlJFTkRFUklORy5ERUZBVUxUX01BWF9QT09MX1NJWkUsXG4gICAgICBtYWludGFpbkRvbU9yZGVyID0gdHJ1ZSxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gSGVscGVyIHRvIGdldCBpdGVtcyBmcm9tIGNvbGxlY3Rpb24gKHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGgpXG4gICAgY29uc3QgZ2V0Q29sbGVjdGlvbkl0ZW1zID0gKCk6IGFueVtdID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uPy5pdGVtcyB8fCAoY29tcG9uZW50IGFzIGFueSkuaXRlbXMgfHwgW11cbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIFN0YXRlXG4gICAgY29uc3QgcmVuZGVyZWRFbGVtZW50cyA9IG5ldyBNYXA8bnVtYmVyLCBIVE1MRWxlbWVudD4oKTtcbiAgICBjb25zdCBlbGVtZW50UG9vbDogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICAgIGNvbnN0IHBvb2xTdGF0cyA9IHsgY3JlYXRlZDogMCwgcmVjeWNsZWQ6IDAsIHBvb2xTaXplOiAwLCByZWxlYXNlZDogMCB9O1xuXG4gICAgLy8gU3RvcmUgbGF5b3V0IHJlc3VsdHMgZm9yIHByb3BlciBjbGVhbnVwIChwcmV2ZW50cyBtZW1vcnkgbGVhaylcbiAgICBjb25zdCBsYXlvdXRSZXN1bHRzID0gbmV3IFdlYWtNYXA8SFRNTEVsZW1lbnQsIHsgZGVzdHJveTogKCkgPT4gdm9pZCB9PigpO1xuXG4gICAgLy8gUmV1c2FibGUgdGVtcGxhdGUgZWxlbWVudCBmb3IgSFRNTCBzdHJpbmcgcGFyc2luZyAobW9yZSBlZmZpY2llbnQgdGhhbiBkaXYpXG4gICAgY29uc3QgdGVtcGxhdGVQYXJzZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG5cbiAgICBsZXQgdmlld3BvcnRTdGF0ZTogVmlld3BvcnRTdGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjdXJyZW50VmlzaWJsZVJhbmdlID0geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgbGV0IGxhc3RSZW5kZXJUaW1lID0gMDtcbiAgICBsZXQgaXNSZW1vdmluZ0l0ZW0gPSBmYWxzZTtcblxuICAgIC8vIEVsZW1lbnQgcG9vbCBtYW5hZ2VtZW50XG4gICAgY29uc3QgZ2V0UG9vbGVkRWxlbWVudCA9ICgpOiBIVE1MRWxlbWVudCA9PiB7XG4gICAgICBpZiAoZW5hYmxlUmVjeWNsaW5nICYmIGVsZW1lbnRQb29sLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcG9vbFN0YXRzLnJlY3ljbGVkKys7XG4gICAgICAgIHJldHVybiBlbGVtZW50UG9vbC5wb3AoKSE7XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gXCJtdHJsLXZpZXdwb3J0LWl0ZW1cIjtcbiAgICAgIHBvb2xTdGF0cy5jcmVhdGVkKys7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVsZWFzZUVsZW1lbnQgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkID0+IHtcbiAgICAgIHBvb2xTdGF0cy5yZWxlYXNlZCsrO1xuXG4gICAgICAvLyBDUklUSUNBTDogQ2FsbCBkZXN0cm95IG9uIGxheW91dFJlc3VsdCB0byBjbGVhbiB1cCBjb21wb25lbnRzIGFuZCBldmVudCBsaXN0ZW5lcnNcbiAgICAgIC8vIFRoaXMgZml4ZXMgdGhlIG1lbW9yeSBsZWFrIHdoZW4gdXNpbmcgbGF5b3V0IHRlbXBsYXRlc1xuICAgICAgY29uc3QgbGF5b3V0UmVzdWx0ID0gbGF5b3V0UmVzdWx0cy5nZXQoZWxlbWVudCk7XG4gICAgICBpZiAobGF5b3V0UmVzdWx0ICYmIHR5cGVvZiBsYXlvdXRSZXN1bHQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGF5b3V0UmVzdWx0LmRlc3Ryb3koKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIElnbm9yZSBkZXN0cm95IGVycm9ycyAtIGVsZW1lbnQgbWF5IGFscmVhZHkgYmUgY2xlYW5lZCB1cFxuICAgICAgICB9XG4gICAgICAgIGxheW91dFJlc3VsdHMuZGVsZXRlKGVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVuYWJsZVJlY3ljbGluZykge1xuICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBDbGVhbiBlbGVtZW50IGZvciByZXVzZSAobm8gY2xvbmluZyAtIHJldXNlIHRoZSBhY3R1YWwgZWxlbWVudClcbiAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gXCJtdHJsLXZpZXdwb3J0LWl0ZW1cIjtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1pbmRleFwiKTtcbiAgICAgIGVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IFwiXCI7XG4gICAgICBlbGVtZW50LmlubmVySFRNTCA9IFwiXCI7XG5cbiAgICAgIC8vIFJlbW92ZSBmcm9tIERPTSBmaXJzdFxuICAgICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCB0byBwb29sIGlmIG5vdCBmdWxsXG4gICAgICBpZiAoZWxlbWVudFBvb2wubGVuZ3RoIDwgbWF4UG9vbFNpemUpIHtcbiAgICAgICAgZWxlbWVudFBvb2wucHVzaChlbGVtZW50KTtcbiAgICAgICAgcG9vbFN0YXRzLnBvb2xTaXplID0gZWxlbWVudFBvb2wubGVuZ3RoO1xuICAgICAgfVxuICAgICAgLy8gSWYgcG9vbCBpcyBmdWxsLCBlbGVtZW50IGlzIGp1c3QgZGVyZWZlcmVuY2VkIGFuZCBHQydkXG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemVcbiAgICB3cmFwSW5pdGlhbGl6ZShjb21wb25lbnQsICgpID0+IHtcbiAgICAgIHZpZXdwb3J0U3RhdGUgPSBnZXRWaWV3cG9ydFN0YXRlKGNvbXBvbmVudCkgYXMgVmlld3BvcnRTdGF0ZTtcblxuICAgICAgLy8gU2V0IGluaXRpYWwgaXRlbXMgY29udGFpbmVyIGhlaWdodCBmcm9tIGN1cnJlbnQgdmlydHVhbCBzaXplXG4gICAgICBpZiAodmlld3BvcnRTdGF0ZT8uaXRlbXNDb250YWluZXIgJiYgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplID4gMCkge1xuICAgICAgICB2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyLnN0eWxlLmhlaWdodCA9IGAke3ZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZX1weGA7XG4gICAgICB9XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgaXRlbSB1cGRhdGUgcmVxdWVzdHMgZnJvbSBBUElcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiaXRlbTp1cGRhdGUtcmVxdWVzdFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIGl0ZW0sIHByZXZpb3VzSXRlbSB9ID0gZGF0YTtcblxuICAgICAgICAvLyBJdGVtIGlzIGFscmVhZHkgdXBkYXRlZCBpbiBjb2xsZWN0aW9uLml0ZW1zIGJ5IGFwaS50c1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXRlbSBpcyBjdXJyZW50bHkgcmVuZGVyZWRcbiAgICAgICAgY29uc3QgZXhpc3RpbmdFbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5nZXQoaW5kZXgpO1xuICAgICAgICBjb25zdCB3YXNWaXNpYmxlID0gISFleGlzdGluZ0VsZW1lbnQ7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgaXRlbSB3YXMgc2VsZWN0ZWQgYmVmb3JlIHVwZGF0ZVxuICAgICAgICBjb25zdCB3YXNTZWxlY3RlZCA9IGV4aXN0aW5nRWxlbWVudFxuICAgICAgICAgID8gaGFzQ2xhc3MoXG4gICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudCxcbiAgICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlNFTEVDVElPTi5TRUxFQ1RFRF9DTEFTUyxcbiAgICAgICAgICAgICkgfHwgaGFzQ2xhc3MoZXhpc3RpbmdFbGVtZW50LCBcIm10cmwtdmlld3BvcnQtaXRlbS0tc2VsZWN0ZWRcIilcbiAgICAgICAgICA6IGZhbHNlO1xuXG4gICAgICAgIGlmIChleGlzdGluZ0VsZW1lbnQgJiYgZXhpc3RpbmdFbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAvLyBSZS1yZW5kZXIgdGhlIGl0ZW1cbiAgICAgICAgICBjb25zdCBuZXdFbGVtZW50ID0gcmVuZGVySXRlbShpdGVtLCBpbmRleCk7XG5cbiAgICAgICAgICBpZiAobmV3RWxlbWVudCkge1xuICAgICAgICAgICAgLy8gQ29weSBwb3NpdGlvbiBzdHlsZXMgZnJvbSBleGlzdGluZyBlbGVtZW50XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG5ld0VsZW1lbnQuc3R5bGUsIHtcbiAgICAgICAgICAgICAgcG9zaXRpb246IGV4aXN0aW5nRWxlbWVudC5zdHlsZS5wb3NpdGlvbixcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiBleGlzdGluZ0VsZW1lbnQuc3R5bGUudHJhbnNmb3JtLFxuICAgICAgICAgICAgICB3aWR0aDogZXhpc3RpbmdFbGVtZW50LnN0eWxlLndpZHRoLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIFByZXNlcnZlIHNlbGVjdGVkIHN0YXRlXG4gICAgICAgICAgICBpZiAod2FzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgYWRkQ2xhc3MobmV3RWxlbWVudCwgVklFV1BPUlRfQ09OU1RBTlRTLlNFTEVDVElPTi5TRUxFQ1RFRF9DTEFTUyk7XG4gICAgICAgICAgICAgIGFkZENsYXNzKG5ld0VsZW1lbnQsIFwibXRybC12aWV3cG9ydC1pdGVtLS1zZWxlY3RlZFwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIHVwZGF0ZSBhbmltYXRpb24gY2xhc3MgdG8gaW5uZXIgY29udGVudCBmb3IgdmlzaWJpbGl0eVxuICAgICAgICAgICAgYWRkQ2xhc3MobmV3RWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtLS11cGRhdGVkXCIpO1xuICAgICAgICAgICAgLy8gQWxzbyB0cnkgdG8gYWRkIHRvIGZpcnN0IGNoaWxkIGlmIGl0IGV4aXN0cyAodGhlIGFjdHVhbCBpdGVtIGNvbnRlbnQpXG4gICAgICAgICAgICBjb25zdCBpbm5lckl0ZW0gPSBuZXdFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgaWYgKGlubmVySXRlbSkge1xuICAgICAgICAgICAgICBhZGRDbGFzcyhpbm5lckl0ZW0sIFwiaXRlbS0tdXBkYXRlZFwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVwbGFjZSBpbiBET01cbiAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChcbiAgICAgICAgICAgICAgbmV3RWxlbWVudCxcbiAgICAgICAgICAgICAgZXhpc3RpbmdFbGVtZW50LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2V0KGluZGV4LCBuZXdFbGVtZW50KTtcbiAgICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGV4aXN0aW5nRWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYW5pbWF0aW9uIGNsYXNzIGFmdGVyIHRyYW5zaXRpb25cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICByZW1vdmVDbGFzcyhuZXdFbGVtZW50LCBcInZpZXdwb3J0LWl0ZW0tLXVwZGF0ZWRcIik7XG4gICAgICAgICAgICAgIGlmIChpbm5lckl0ZW0pIHtcbiAgICAgICAgICAgICAgICByZW1vdmVDbGFzcyhpbm5lckl0ZW0sIFwiaXRlbS0tdXBkYXRlZFwiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IGNvbXBsZXRpb24gZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW06dXBkYXRlZFwiLCB7XG4gICAgICAgICAgaXRlbSxcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBwcmV2aW91c0l0ZW0sXG4gICAgICAgICAgd2FzVmlzaWJsZSxcbiAgICAgICAgICB3YXNTZWxlY3RlZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtIHJlbW92ZSByZXF1ZXN0cyBmcm9tIEFQSVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJpdGVtOnJlbW92ZS1yZXF1ZXN0XCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgeyBpbmRleCwgaXRlbSB9ID0gZGF0YTtcbiAgICAgICAgaXNSZW1vdmluZ0l0ZW0gPSB0cnVlO1xuXG4gICAgICAgIC8vIEl0ZW0gaXMgYWxyZWFkeSByZW1vdmVkIGZyb20gY29sbGVjdGlvbi5pdGVtcyBieSBhcGkudHNcbiAgICAgICAgLy8gV2UganVzdCBuZWVkIHRvIHVwZGF0ZSByZW5kZXJlZCBlbGVtZW50c1xuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgcmVuZGVyZWQgZWxlbWVudCBhdCB0aGlzIGluZGV4XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGluZGV4KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nRWxlbWVudCAmJiBleGlzdGluZ0VsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGV4aXN0aW5nRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5kZWxldGUoaW5kZXgpO1xuXG4gICAgICAgIC8vIFNoaWZ0IHJlbmRlcmVkIGVsZW1lbnRzIGluZGljZXMgZG93blxuICAgICAgICBjb25zdCByZW5kZXJlZEtleXMgPSBBcnJheS5mcm9tKHJlbmRlcmVkRWxlbWVudHMua2V5cygpKS5zb3J0KFxuICAgICAgICAgIChhLCBiKSA9PiBhIC0gYixcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgbmV3UmVuZGVyZWRFbGVtZW50cyA9IG5ldyBNYXA8bnVtYmVyLCBIVE1MRWxlbWVudD4oKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgcmVuZGVyZWRLZXlzKSB7XG4gICAgICAgICAgaWYgKGtleSA+IGluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgIC8vIFVwZGF0ZSBkYXRhLWluZGV4IGF0dHJpYnV0ZVxuICAgICAgICAgICAgICBlbGVtZW50LmRhdGFzZXQuaW5kZXggPSBTdHJpbmcoa2V5IC0gMSk7XG4gICAgICAgICAgICAgIG5ld1JlbmRlcmVkRWxlbWVudHMuc2V0KGtleSAtIDEsIGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoa2V5IDwgaW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnRzLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgbmV3UmVuZGVyZWRFbGVtZW50cy5zZXQoa2V5LCBlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGVsZW1lbnRdIG9mIG5ld1JlbmRlcmVkRWxlbWVudHMpIHtcbiAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNldChrZXksIGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVjcmVtZW50IHRvdGFsSXRlbXMgTk9XIHNvIHJlbmRlckl0ZW1zKCkgdXNlcyB0aGUgY29ycmVjdCBjb3VudFxuICAgICAgICAvLyBzZXRUb3RhbEl0ZW1zKCkgd2lsbCBiZSBjYWxsZWQgbGF0ZXIgYnkgdGhlIEFQSSwgd2hpY2ggd2lsbCBlbWl0XG4gICAgICAgIC8vIHZpZXdwb3J0OnRvdGFsLWl0ZW1zLWNoYW5nZWQgZm9yIHZpcnR1YWwgc2l6ZSByZWNhbGN1bGF0aW9uXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlICYmIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyA+IDApIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMtLTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2V0IHZpc2libGUgcmFuZ2UgdG8gZm9yY2UgcmUtcmVuZGVyXG4gICAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB7IHN0YXJ0OiAtMSwgZW5kOiAtMSB9O1xuXG4gICAgICAgIC8vIEVtaXQgY29tcGxldGlvbiBldmVudFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbTpyZW1vdmVkXCIsIHtcbiAgICAgICAgICBpdGVtLFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBZnRlciBpdGVtIHJlbW92YWwsIGNsZWFyIEFMTCBsb2FkZWRSYW5nZXNcbiAgICAgICAgLy8gVGhpcyBmb3JjZXMgYSBjb21wbGV0ZSByZWxvYWQgd2hpY2ggaXMgbW9yZSByZWxpYWJsZSB0aGFuIHRyeWluZyB0b1xuICAgICAgICAvLyB0cmFjayBzaGlmdGVkIGluZGljZXMuIFRoZSBpdGVtcyBhcnJheSBoYXMgYmVlbiBzcGxpY2VkIGFuZCBhbGwgaW5kaWNlc1xuICAgICAgICAvLyBhcmUgbm93IGRpZmZlcmVudCBmcm9tIHdoYXQgbG9hZGVkUmFuZ2VzIHRoaW5rcyB0aGV5IGFyZS5cbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KT8uY29sbGVjdGlvbjtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24/LmdldExvYWRlZFJhbmdlcykge1xuICAgICAgICAgIGNvbnN0IGxvYWRlZFJhbmdlcyA9IGNvbGxlY3Rpb24uZ2V0TG9hZGVkUmFuZ2VzKCk7XG4gICAgICAgICAgbG9hZGVkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmlnZ2VyIHJlbG9hZCBvZiB2aXNpYmxlIHJhbmdlXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25JdGVtc0FyciA9IGdldENvbGxlY3Rpb25JdGVtcygpO1xuICAgICAgICBjb25zdCBsb2FkZWRJdGVtc0NvdW50ID0gY29sbGVjdGlvbkl0ZW1zQXJyLmxlbmd0aDtcbiAgICAgICAgY29uc3QgdmlzaWJsZVJhbmdlID0gY29tcG9uZW50LnZpZXdwb3J0Py5nZXRWaXNpYmxlUmFuZ2U/LigpO1xuICAgICAgICBpZiAodmlzaWJsZVJhbmdlICYmIGNvbGxlY3Rpb24/LmxvYWRNaXNzaW5nUmFuZ2VzKSB7XG4gICAgICAgICAgY29sbGVjdGlvbi5sb2FkTWlzc2luZ1JhbmdlcyhcbiAgICAgICAgICAgIHsgc3RhcnQ6IDAsIGVuZDogTWF0aC5tYXgodmlzaWJsZVJhbmdlLmVuZCwgbG9hZGVkSXRlbXNDb3VudCkgfSxcbiAgICAgICAgICAgIFwiaXRlbS1yZW1vdmFsXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyaWdnZXIgcmUtcmVuZGVyXG4gICAgICAgIHJlbmRlckl0ZW1zKCk7XG4gICAgICAgIGlzUmVtb3ZpbmdJdGVtID0gZmFsc2U7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtcyBhZGQgcmVxdWVzdHMgZnJvbSBBUElcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiaXRlbXM6YWRkLXJlcXVlc3RcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB7IGl0ZW1zOiBuZXdJdGVtcywgcG9zaXRpb24sIHByZXZpb3VzQ291bnQgfSA9IGRhdGE7XG5cbiAgICAgICAgaWYgKCFuZXdJdGVtcyB8fCBuZXdJdGVtcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICAvLyBJdGVtcyBhcmUgYWxyZWFkeSBhZGRlZCB0byBjb2xsZWN0aW9uLml0ZW1zIGJ5IGFwaS50c1xuICAgICAgICAvLyBXZSBqdXN0IG5lZWQgdG8gdXBkYXRlIHJlbmRlcmVkIGVsZW1lbnRzIGluZGljZXMgaWYgcHJlcGVuZGluZ1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zQWRkZWQgPSBuZXdJdGVtcy5sZW5ndGg7XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSBcInN0YXJ0XCIpIHtcbiAgICAgICAgICAvLyBJdGVtcyB3ZXJlIHByZXBlbmRlZCAtIHNoaWZ0IHJlbmRlcmVkIGVsZW1lbnQgaW5kaWNlc1xuICAgICAgICAgIGNvbnN0IHJlbmRlcmVkS2V5cyA9IEFycmF5LmZyb20ocmVuZGVyZWRFbGVtZW50cy5rZXlzKCkpLnNvcnQoXG4gICAgICAgICAgICAoYSwgYikgPT4gYiAtIGEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBuZXdSZW5kZXJlZEVsZW1lbnRzID0gbmV3IE1hcDxudW1iZXIsIEhUTUxFbGVtZW50PigpO1xuICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHJlbmRlcmVkS2V5cykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGtleSkhO1xuICAgICAgICAgICAgY29uc3QgbmV3SW5kZXggPSBrZXkgKyBpdGVtc0FkZGVkO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWluZGV4XCIsIFN0cmluZyhuZXdJbmRleCkpO1xuICAgICAgICAgICAgbmV3UmVuZGVyZWRFbGVtZW50cy5zZXQobmV3SW5kZXgsIGVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmNsZWFyKCk7XG4gICAgICAgICAgbmV3UmVuZGVyZWRFbGVtZW50cy5mb3JFYWNoKChlbCwgaWR4KSA9PlxuICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5zZXQoaWR4LCBlbCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgYXBwZW5kLCBubyBpbmRleCBzaGlmdGluZyBuZWVkZWRcblxuICAgICAgICAvLyBVcGRhdGUgdG90YWxJdGVtcyBpbiB2aWV3cG9ydFN0YXRlXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zID1cbiAgICAgICAgICAgICh2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgfHwgMCkgKyBpdGVtc0FkZGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzZXQgdmlzaWJsZSByYW5nZSB0byBmb3JjZSByZS1yZW5kZXJcbiAgICAgICAgY3VycmVudFZpc2libGVSYW5nZSA9IHsgc3RhcnQ6IC0xLCBlbmQ6IC0xIH07XG5cbiAgICAgICAgLy8gQ2xlYXIgbG9hZGVkUmFuZ2VzIHRvIGVuc3VyZSBwcm9wZXIgcmVsb2FkIHRyYWNraW5nXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSk/LmNvbGxlY3Rpb247XG4gICAgICAgIGlmIChjb2xsZWN0aW9uPy5nZXRMb2FkZWRSYW5nZXMpIHtcbiAgICAgICAgICBjb25zdCBsb2FkZWRSYW5nZXMgPSBjb2xsZWN0aW9uLmdldExvYWRlZFJhbmdlcygpO1xuICAgICAgICAgIGxvYWRlZFJhbmdlcy5jbGVhcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJpZ2dlciByZS1yZW5kZXJcbiAgICAgICAgcmVuZGVySXRlbXMoKTtcblxuICAgICAgICAvLyBFbWl0IGNvbXBsZXRpb24gZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW1zOnJlbmRlci1jb21wbGV0ZVwiLCB7XG4gICAgICAgICAgaXRlbXM6IG5ld0l0ZW1zLFxuICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgIHRvdGFsOiB2aWV3cG9ydFN0YXRlPy50b3RhbEl0ZW1zIHx8IDAsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgY29sbGVjdGlvbiBpdGVtcyBldmljdGVkIC0gY2xlYW4gdXAgcmVuZGVyZWQgZWxlbWVudHNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjppdGVtcy1ldmljdGVkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgeyBrZWVwU3RhcnQsIGtlZXBFbmQgfSA9IGRhdGE7XG5cbiAgICAgICAgLy8gUmVsZWFzZSByZW5kZXJlZCBlbGVtZW50cyBvdXRzaWRlIHRoZSBrZWVwIHJhbmdlXG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAoaW5kZXggPCBrZWVwU3RhcnQgfHwgaW5kZXggPiBrZWVwRW5kKSB7XG4gICAgICAgICAgICByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZGVsZXRlKGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgY29sbGVjdGlvbiByZXNldCB0byBjbGVhciByZW5kZXJpbmcgc3RhdGVcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjpyZXNldFwiLCAoKSA9PiB7XG4gICAgICAgIC8vIFJlbGVhc2UgYW5kIGNsZWFyIGFsbCByZW5kZXJlZCBlbGVtZW50c1xuICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuY2xlYXIoKTtcblxuICAgICAgICAvLyBSZXNldCB2aXNpYmxlIHJhbmdlIHRyYWNraW5nXG4gICAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB7IHN0YXJ0OiAtMSwgZW5kOiAtMSB9O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgY29sbGVjdGlvbiBkYXRhIGxvYWRlZFxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJjb2xsZWN0aW9uOnJhbmdlLWxvYWRlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmICghZGF0YS5pdGVtcz8ubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgICAgLy8gQW5hbHl6ZSBkYXRhIHN0cnVjdHVyZSBvbiBmaXJzdCBsb2FkXG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IChjb21wb25lbnQgYXMgYW55KS5wbGFjZWhvbGRlcnM7XG4gICAgICAgIGlmIChwbGFjZWhvbGRlcnMgJiYgIXBsYWNlaG9sZGVycy5oYXNBbmFseXplZFN0cnVjdHVyZSgpKSB7XG4gICAgICAgICAgcGxhY2Vob2xkZXJzLmFuYWx5emVEYXRhU3RydWN0dXJlKGRhdGEuaXRlbXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXRlbXMgYXJlIGFscmVhZHkgaW4gY29sbGVjdGlvbi5pdGVtcyAtIHJlcGxhY2UgYW55IHBsYWNlaG9sZGVyIERPTSBlbGVtZW50c1xuICAgICAgICBkYXRhLml0ZW1zLmZvckVhY2goKGl0ZW06IGFueSwgaTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBkYXRhLm9mZnNldCArIGk7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGluZGV4KTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIGN1cnJlbnQgcmVuZGVyZWQgZWxlbWVudCBpcyBhIHBsYWNlaG9sZGVyIHRoYXQgbmVlZHMgcmVwbGFjaW5nXG4gICAgICAgICAgLy8gTm90ZTogVGhlIGFjdHVhbCBjbGFzcyBoYXMgJ210cmwtJyBwcmVmaXgsIHNvIGNoZWNrIGZvciBib3RoXG4gICAgICAgICAgY29uc3QgaXNQbGFjZWhvbGRlckVsZW1lbnQgPVxuICAgICAgICAgICAgZWxlbWVudD8uY2xhc3NMaXN0LmNvbnRhaW5zKFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5DTEFTUykgfHxcbiAgICAgICAgICAgIGVsZW1lbnQ/LmNsYXNzTGlzdC5jb250YWlucyhcbiAgICAgICAgICAgICAgYG10cmwtJHtWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuQ0xBU1N9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGlzUGxhY2Vob2xkZXJFbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50ID0gcmVuZGVySXRlbShpdGVtLCBpbmRleCk7XG4gICAgICAgICAgICBpZiAobmV3RWxlbWVudCkge1xuICAgICAgICAgICAgICAvLyBSZW1vdmUgcGxhY2Vob2xkZXIgY2xhc3NlcyBmcm9tIHdyYXBwZXJcbiAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MobmV3RWxlbWVudCwgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLkNMQVNTKTtcbiAgICAgICAgICAgICAgLy8gQWxzbyByZW1vdmUgZnJvbSBpbm5lciBlbGVtZW50IChmb3Igc3RyaW5nIHRlbXBsYXRlcylcbiAgICAgICAgICAgICAgaWYgKG5ld0VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICByZW1vdmVDbGFzcyhcbiAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuQ0xBU1MsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIEFkZCByZXBsYWNlZCBjbGFzcyBmb3IgZmFkZS1pbiBhbmltYXRpb25cbiAgICAgICAgICAgICAgYWRkQ2xhc3MobmV3RWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtLS1yZXBsYWNlZFwiKTtcblxuICAgICAgICAgICAgICAvLyBDb3B5IHBvc2l0aW9uIGFuZCByZXBsYWNlXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obmV3RWxlbWVudC5zdHlsZSwge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBlbGVtZW50LnN0eWxlLnBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgd2lkdGg6IGVsZW1lbnQuc3R5bGUud2lkdGgsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBlbGVtZW50LnBhcmVudE5vZGU/LnJlcGxhY2VDaGlsZChuZXdFbGVtZW50LCBlbGVtZW50KTtcbiAgICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5zZXQoaW5kZXgsIG5ld0VsZW1lbnQpO1xuICAgICAgICAgICAgICByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHJlcGxhY2VkIGNsYXNzIGFmdGVyIGFuaW1hdGlvbiBjb21wbGV0ZXNcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MobmV3RWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtLS1yZXBsYWNlZFwiKTtcbiAgICAgICAgICAgICAgfSwgMzAwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIHJlbmRlckl0ZW0gcmV0dXJuZWQgbnVsbCAtIHN0aWxsIHJlbGVhc2UgdGhlIG9sZCBlbGVtZW50XG4gICAgICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmRlbGV0ZShpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHJlbmRlciBuZXcgaXRlbXMgKGl0ZW1zIHRoYXQgd2VyZW4ndCByZW5kZXJlZCBhdCBhbGwpXG4gICAgICAgIGNvbnN0IHsgdmlzaWJsZVJhbmdlIH0gPSB2aWV3cG9ydFN0YXRlIHx8IHt9O1xuICAgICAgICBpZiAodmlzaWJsZVJhbmdlKSB7XG4gICAgICAgICAgY29uc3QgcmVuZGVyU3RhcnQgPSBNYXRoLm1heCgwLCB2aXNpYmxlUmFuZ2Uuc3RhcnQgLSBvdmVyc2Nhbik7XG4gICAgICAgICAgY29uc3QgcmVuZGVyRW5kID0gTWF0aC5taW4oXG4gICAgICAgICAgICB2aWV3cG9ydFN0YXRlPy50b3RhbEl0ZW1zID8/IDAgLSAxLFxuICAgICAgICAgICAgdmlzaWJsZVJhbmdlLmVuZCArIG92ZXJzY2FuLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgbG9hZGVkU3RhcnQgPSBkYXRhLm9mZnNldDtcbiAgICAgICAgICBjb25zdCBsb2FkZWRFbmQgPSBkYXRhLm9mZnNldCArIGRhdGEuaXRlbXMubGVuZ3RoIC0gMTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIGxvYWRlZCBkYXRhIG92ZXJsYXBzIHdpdGggcmVuZGVyIHJhbmdlIGFuZCB3ZSdyZSBtaXNzaW5nIHJlbmRlcmVkIGVsZW1lbnRzXG4gICAgICAgICAgY29uc3QgbmVlZHNSZW5kZXIgPVxuICAgICAgICAgICAgbG9hZGVkU3RhcnQgPD0gcmVuZGVyRW5kICYmXG4gICAgICAgICAgICBsb2FkZWRFbmQgPj0gcmVuZGVyU3RhcnQgJiZcbiAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2l6ZSA8IHJlbmRlckVuZCAtIHJlbmRlclN0YXJ0ICsgMTtcblxuICAgICAgICAgIGlmIChuZWVkc1JlbmRlcikgcmVuZGVySXRlbXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgZXZlbnRzXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnJhbmdlLWNoYW5nZWRcIiwgcmVuZGVySXRlbXMpO1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpzY3JvbGxcIiwgdXBkYXRlSXRlbVBvc2l0aW9ucyk7XG5cbiAgICAgIC8vIFVwZGF0ZSBpdGVtcyBjb250YWluZXIgaGVpZ2h0IHdoZW4gdmlydHVhbCBzaXplIGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dmlydHVhbC1zaXplLWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdmlld3BvcnRTdGF0ZT8uaXRlbXNDb250YWluZXIgJiZcbiAgICAgICAgICBkYXRhLnRvdGFsVmlydHVhbFNpemUgIT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyLnN0eWxlLmhlaWdodCA9IGAke2RhdGEudG90YWxWaXJ0dWFsU2l6ZX1weGA7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVtcGxhdGUgaGVscGVyc1xuICAgIGNvbnN0IGdldERlZmF1bHRUZW1wbGF0ZSA9ICgpID0+IChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIC8vIFVzZSBsYXlvdXQgc3lzdGVtIGZvciBkZWZhdWx0IHRlbXBsYXRlXG4gICAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgdGFnOiBcImRpdlwiLFxuICAgICAgICAgIGNsYXNzOiBcInZpZXdwb3J0LWl0ZW1cIixcbiAgICAgICAgICB0ZXh0OlxuICAgICAgICAgICAgdHlwZW9mIGl0ZW0gPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgPyBpdGVtLm5hbWUgfHwgaXRlbS5sYWJlbCB8fCBpdGVtLnRleHQgfHwgYEl0ZW0gJHtpbmRleH1gXG4gICAgICAgICAgICAgIDogU3RyaW5nKGl0ZW0pLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9O1xuXG4gICAgLy8gUHJvY2VzcyBsYXlvdXQgc2NoZW1hIHdpdGggaXRlbSBkYXRhIHN1YnN0aXR1dGlvblxuICAgIGNvbnN0IHByb2Nlc3NMYXlvdXRTY2hlbWEgPSAoXG4gICAgICBzY2hlbWE6IGFueSxcbiAgICAgIGl0ZW06IGFueSxcbiAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgKTogYW55ID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIC8vIEhhbmRsZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24gbGlrZSB7e25hbWV9fSwge3tpbmRleH19XG4gICAgICAgIHJldHVybiBzY2hlbWEucmVwbGFjZSgvXFx7XFx7KFtefV0rKVxcfVxcfS9nLCAobWF0Y2gsIGtleSkgPT4ge1xuICAgICAgICAgIGlmIChrZXkgPT09IFwiaW5kZXhcIikgcmV0dXJuIFN0cmluZyhpbmRleCk7XG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJpdGVtXCIpIHJldHVybiBTdHJpbmcoaXRlbSk7XG5cbiAgICAgICAgICAvLyBIYW5kbGUgbmVzdGVkIHByb3BlcnRpZXMgbGlrZSB7e3VzZXIubmFtZX19XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBrZXkuc3BsaXQoXCIuXCIpLnJlZHVjZSgob2JqOiBhbnksIHByb3A6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG9iaj8uW3Byb3AudHJpbSgpXTtcbiAgICAgICAgICB9LCBpdGVtKTtcblxuICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKHZhbHVlKSA6IG1hdGNoO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hKSkge1xuICAgICAgICByZXR1cm4gc2NoZW1hLm1hcCgoY2hpbGQpID0+IHByb2Nlc3NMYXlvdXRTY2hlbWEoY2hpbGQsIGl0ZW0sIGluZGV4KSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcIm9iamVjdFwiICYmIHNjaGVtYSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBwcm9jZXNzZWQ6IGFueSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzY2hlbWEpKSB7XG4gICAgICAgICAgcHJvY2Vzc2VkW2tleV0gPSBwcm9jZXNzTGF5b3V0U2NoZW1hKHZhbHVlLCBpdGVtLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb2Nlc3NlZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNjaGVtYTtcbiAgICB9O1xuXG4gICAgLy8gUG9zaXRpb24gY2FsY3VsYXRpb25cbiAgICBjb25zdCBjYWxjdWxhdGVJdGVtUG9zaXRpb24gPSAoXG4gICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgc2Nyb2xsUG9zaXRpb246IG51bWJlcixcbiAgICAgIHRvdGFsSXRlbXM6IG51bWJlcixcbiAgICAgIGl0ZW1TaXplOiBudW1iZXIsXG4gICAgICB2aXJ0dWFsVG90YWxTaXplOiBudW1iZXIsXG4gICAgICBjb250YWluZXJTaXplOiBudW1iZXIsXG4gICAgICB0YXJnZXRTY3JvbGxJbmRleD86IG51bWJlcixcbiAgICApOiBudW1iZXIgPT4ge1xuICAgICAgY29uc3QgYWN0dWFsVG90YWxTaXplID0gdG90YWxJdGVtcyAqIGl0ZW1TaXplO1xuICAgICAgY29uc3QgaXNDb21wcmVzc2VkID1cbiAgICAgICAgYWN0dWFsVG90YWxTaXplID4gdmlydHVhbFRvdGFsU2l6ZSAmJiB2aXJ0dWFsVG90YWxTaXplID4gMDtcblxuICAgICAgLy8gSWYgd2UgaGF2ZSBhIHRhcmdldFNjcm9sbEluZGV4IChmcm9tIGluaXRpYWxTY3JvbGxJbmRleCksIHVzZSBpdCBkaXJlY3RseVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIGl0ZW1zIGFyZSBwb3NpdGlvbmVkIGNvcnJlY3RseSBldmVuIHdpdGggY29tcHJlc3Npb25cbiAgICAgIGlmICh0YXJnZXRTY3JvbGxJbmRleCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldFNjcm9sbEluZGV4ID4gMCkge1xuICAgICAgICAvLyBQb3NpdGlvbiBpdGVtcyByZWxhdGl2ZSB0byB0aGUgdGFyZ2V0IGluZGV4XG4gICAgICAgIC8vIFRoZSB0YXJnZXQgaW5kZXggc2hvdWxkIGFwcGVhciBhdCB0aGUgdG9wIG9mIHRoZSB2aWV3cG9ydFxuICAgICAgICByZXR1cm4gKGluZGV4IC0gdGFyZ2V0U2Nyb2xsSW5kZXgpICogaXRlbVNpemU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNDb21wcmVzc2VkIHx8IHRvdGFsSXRlbXMgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGluZGV4ICogaXRlbVNpemUgLSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgIH1cblxuICAgICAgLy8gQ29tcHJlc3NlZCBzcGFjZSBoYW5kbGluZ1xuICAgICAgY29uc3QgbWF4U2Nyb2xsUG9zaXRpb24gPSB2aXJ0dWFsVG90YWxTaXplIC0gY29udGFpbmVyU2l6ZTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlRnJvbUJvdHRvbSA9IG1heFNjcm9sbFBvc2l0aW9uIC0gc2Nyb2xsUG9zaXRpb247XG4gICAgICBjb25zdCBuZWFyQm90dG9tVGhyZXNob2xkID0gY29udGFpbmVyU2l6ZTtcblxuICAgICAgaWYgKFxuICAgICAgICBkaXN0YW5jZUZyb21Cb3R0b20gPD0gbmVhckJvdHRvbVRocmVzaG9sZCAmJlxuICAgICAgICBkaXN0YW5jZUZyb21Cb3R0b20gPj0gLTFcbiAgICAgICkge1xuICAgICAgICAvLyBOZWFyIGJvdHRvbSBpbnRlcnBvbGF0aW9uXG4gICAgICAgIGNvbnN0IGl0ZW1zQXRCb3R0b20gPSBNYXRoLmZsb29yKGNvbnRhaW5lclNpemUgLyBpdGVtU2l6ZSk7XG4gICAgICAgIGNvbnN0IGZpcnN0VmlzaWJsZUF0Qm90dG9tID0gTWF0aC5tYXgoMCwgdG90YWxJdGVtcyAtIGl0ZW1zQXRCb3R0b20pO1xuICAgICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHNjcm9sbFBvc2l0aW9uIC8gdmlydHVhbFRvdGFsU2l6ZTtcbiAgICAgICAgY29uc3QgZXhhY3RTY3JvbGxJbmRleCA9IHNjcm9sbFJhdGlvICogdG90YWxJdGVtcztcbiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGlvbiA9IE1hdGgubWF4KFxuICAgICAgICAgIDAsXG4gICAgICAgICAgTWF0aC5taW4oMSwgMSAtIGRpc3RhbmNlRnJvbUJvdHRvbSAvIG5lYXJCb3R0b21UaHJlc2hvbGQpLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGJvdHRvbVBvc2l0aW9uID0gKGluZGV4IC0gZmlyc3RWaXNpYmxlQXRCb3R0b20pICogaXRlbVNpemU7XG4gICAgICAgIGNvbnN0IG5vcm1hbFBvc2l0aW9uID0gKGluZGV4IC0gZXhhY3RTY3JvbGxJbmRleCkgKiBpdGVtU2l6ZTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBub3JtYWxQb3NpdGlvbiArIChib3R0b21Qb3NpdGlvbiAtIG5vcm1hbFBvc2l0aW9uKSAqIGludGVycG9sYXRpb25cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gTm9ybWFsIGNvbXByZXNzZWQgc2Nyb2xsaW5nXG4gICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHNjcm9sbFBvc2l0aW9uIC8gdmlydHVhbFRvdGFsU2l6ZTtcbiAgICAgIHJldHVybiAoaW5kZXggLSBzY3JvbGxSYXRpbyAqIHRvdGFsSXRlbXMpICogaXRlbVNpemU7XG4gICAgfTtcblxuICAgIC8vIFJlbmRlciBzaW5nbGUgaXRlbVxuICAgIGNvbnN0IHJlbmRlckl0ZW0gPSAoaXRlbTogYW55LCBpbmRleDogbnVtYmVyKTogSFRNTEVsZW1lbnQgfCBudWxsID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1UZW1wbGF0ZSA9IHRlbXBsYXRlIHx8IGdldERlZmF1bHRUZW1wbGF0ZSgpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBpdGVtVGVtcGxhdGUoaXRlbSwgaW5kZXgpO1xuICAgICAgICBsZXQgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgcmVzdWx0IGlzIGEgbGF5b3V0IHNjaGVtYSAoYXJyYXkgb3Igb2JqZWN0KVxuICAgICAgICBpZiAoXG4gICAgICAgICAgQXJyYXkuaXNBcnJheShyZXN1bHQpIHx8XG4gICAgICAgICAgKHR5cGVvZiByZXN1bHQgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIHJlc3VsdCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgIShyZXN1bHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFByb2Nlc3Mgc2NoZW1hIHRvIHN1YnN0aXR1dGUgdmFyaWFibGVzXG4gICAgICAgICAgY29uc3QgcHJvY2Vzc2VkU2NoZW1hID0gcHJvY2Vzc0xheW91dFNjaGVtYShyZXN1bHQsIGl0ZW0sIGluZGV4KTtcblxuICAgICAgICAgIC8vIFVzZSBsYXlvdXQgc3lzdGVtIHRvIGNyZWF0ZSBlbGVtZW50XG4gICAgICAgICAgY29uc3QgbGF5b3V0UmVzdWx0ID0gY3JlYXRlTGF5b3V0KHByb2Nlc3NlZFNjaGVtYSk7XG4gICAgICAgICAgZWxlbWVudCA9IGxheW91dFJlc3VsdC5lbGVtZW50O1xuXG4gICAgICAgICAgLy8gSWYgdGhlIGxheW91dCBjcmVhdGVkIGEgd3JhcHBlciwgdXNlIGl0IGRpcmVjdGx5XG4gICAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgLy8gRWxlbWVudCBpcyBhbHJlYWR5IGNyZWF0ZWQgYnkgbGF5b3V0IHN5c3RlbVxuICAgICAgICAgICAgLy8gU3RvcmUgbGF5b3V0UmVzdWx0IGZvciBjbGVhbnVwIHdoZW4gZWxlbWVudCBpcyByZWxlYXNlZCAocHJldmVudHMgbWVtb3J5IGxlYWspXG4gICAgICAgICAgICBsYXlvdXRSZXN1bHRzLnNldChlbGVtZW50LCBsYXlvdXRSZXN1bHQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFjayBpZiBsYXlvdXQgZGlkbid0IGNyZWF0ZSBhIHByb3BlciBlbGVtZW50XG4gICAgICAgICAgICBlbGVtZW50ID0gZ2V0UG9vbGVkRWxlbWVudCgpO1xuICAgICAgICAgICAgaWYgKGxheW91dFJlc3VsdC5lbGVtZW50KSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQobGF5b3V0UmVzdWx0LmVsZW1lbnQpO1xuICAgICAgICAgICAgICAvLyBTdG9yZSBsYXlvdXRSZXN1bHQgb24gd3JhcHBlciBlbGVtZW50IGZvciBjbGVhbnVwXG4gICAgICAgICAgICAgIGxheW91dFJlc3VsdHMuc2V0KGVsZW1lbnQsIGxheW91dFJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAvLyBQYXJzZSBIVE1MIHVzaW5nIHRlbXBsYXRlIGVsZW1lbnQgLSBvcHRpbWl6ZWQgcGF0aFxuICAgICAgICAgIC8vIE1vdmUgbm9kZXMgZGlyZWN0bHkgaW5zdGVhZCBvZiBjbG9uaW5nIC0gbXVjaCBmYXN0ZXIsIG5vIG1lbW9yeSBvdmVyaGVhZFxuICAgICAgICAgIHRlbXBsYXRlUGFyc2VyLmlubmVySFRNTCA9IHJlc3VsdDtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gdGVtcGxhdGVQYXJzZXIuY29udGVudDtcblxuICAgICAgICAgIGlmIChjb250ZW50LmNoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgLy8gU2luZ2xlIHJvb3QgZWxlbWVudCAtIG1vdmUgZGlyZWN0bHkgKGZhc3RlciB0aGFuIGNsb25lTm9kZSlcbiAgICAgICAgICAgIGVsZW1lbnQgPSBjb250ZW50LmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgY29udGVudC5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICAgICAgICAgIGFkZENsYXNzKGVsZW1lbnQsIFwibXRybC12aWV3cG9ydC1pdGVtXCIpO1xuICAgICAgICAgICAgaWYgKGlzUGxhY2Vob2xkZXIoaXRlbSkpIHtcbiAgICAgICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLkNMQVNTKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTXVsdGlwbGUgY2hpbGRyZW4gLSBtb3ZlIGFsbCBpbnRvIHBvb2xlZCBlbGVtZW50XG4gICAgICAgICAgICBlbGVtZW50ID0gZ2V0UG9vbGVkRWxlbWVudCgpO1xuICAgICAgICAgICAgd2hpbGUgKGNvbnRlbnQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNvbnRlbnQuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgZWxlbWVudCA9IGdldFBvb2xlZEVsZW1lbnQoKTtcbiAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbUmVuZGVyaW5nXSBJbnZhbGlkIHRlbXBsYXRlIHJlc3VsdCBmb3IgaXRlbSAke2luZGV4fWApO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIGNsYXNzZXNcbiAgICAgICAgaWYgKCFoYXNDbGFzcyhlbGVtZW50LCBcInZpZXdwb3J0LWl0ZW1cIikpXG4gICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtXCIpO1xuICAgICAgICBpZiAoaXNQbGFjZWhvbGRlcihpdGVtKSkge1xuICAgICAgICAgIGFkZENsYXNzKGVsZW1lbnQsIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5DTEFTUyk7XG4gICAgICAgIH1cblxuICAgICAgICBlbGVtZW50LmRhdGFzZXQuaW5kZXggPSBTdHJpbmcoaW5kZXgpO1xuXG4gICAgICAgIC8vIENvcHkgZGF0YS1pZCBmcm9tIGl0ZW0gdG8gdmlld3BvcnQgZWxlbWVudCBmb3Igc2VsZWN0aW9uIHN1cHBvcnRcbiAgICAgICAgY29uc3QgaXRlbUlkID0gaXRlbT8uX2lkIHx8IGl0ZW0/LmlkO1xuICAgICAgICBpZiAoaXRlbUlkICE9PSB1bmRlZmluZWQgJiYgaXRlbUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgZWxlbWVudC5kYXRhc2V0LmlkID0gU3RyaW5nKGl0ZW1JZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBbUmVuZGVyaW5nXSBFcnJvciByZW5kZXJpbmcgaXRlbSAke2luZGV4fTpgLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBVcGRhdGUgcG9zaXRpb25zXG4gICAgY29uc3QgdXBkYXRlSXRlbVBvc2l0aW9ucyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSB8fCByZW5kZXJlZEVsZW1lbnRzLnNpemUgPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3Qge1xuICAgICAgICBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgaXRlbVNpemU6IGl0ZW1TaXplLFxuICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICB2aXJ0dWFsVG90YWxTaXplLFxuICAgICAgICBjb250YWluZXJTaXplLFxuICAgICAgfSA9IHZpZXdwb3J0U3RhdGU7XG4gICAgICBjb25zdCBhY3R1YWxUb3RhbFNpemUgPSB0b3RhbEl0ZW1zICogaXRlbVNpemU7XG4gICAgICBjb25zdCBpc0NvbXByZXNzZWQgPVxuICAgICAgICBhY3R1YWxUb3RhbFNpemUgPiB2aXJ0dWFsVG90YWxTaXplICYmIHZpcnR1YWxUb3RhbFNpemUgPiAwO1xuXG4gICAgICBjb25zdCBzb3J0ZWRJbmRpY2VzID0gQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLmtleXMoKSkuc29ydChcbiAgICAgICAgKGEsIGIpID0+IGEgLSBiLFxuICAgICAgKTtcbiAgICAgIGlmICghc29ydGVkSW5kaWNlcy5sZW5ndGgpIHJldHVybjtcblxuICAgICAgY29uc3QgZmlyc3RJbmRleCA9IHNvcnRlZEluZGljZXNbMF07XG4gICAgICBsZXQgY3VycmVudFBvc2l0aW9uID0gMDtcblxuICAgICAgaWYgKGlzQ29tcHJlc3NlZCkge1xuICAgICAgICBjb25zdCBtYXhTY3JvbGwgPSB2aXJ0dWFsVG90YWxTaXplIC0gY29udGFpbmVyU2l6ZTtcbiAgICAgICAgY29uc3QgZGlzdGFuY2VGcm9tQm90dG9tID0gbWF4U2Nyb2xsIC0gc2Nyb2xsUG9zaXRpb247XG5cbiAgICAgICAgaWYgKGRpc3RhbmNlRnJvbUJvdHRvbSA8PSBjb250YWluZXJTaXplICYmIGRpc3RhbmNlRnJvbUJvdHRvbSA+PSAtMSkge1xuICAgICAgICAgIC8vIE5lYXIgYm90dG9tIGludGVycG9sYXRpb25cbiAgICAgICAgICBjb25zdCBpdGVtc0F0Qm90dG9tID0gTWF0aC5mbG9vcihjb250YWluZXJTaXplIC8gaXRlbVNpemUpO1xuICAgICAgICAgIGNvbnN0IGZpcnN0VmlzaWJsZUF0Qm90dG9tID0gTWF0aC5tYXgoMCwgdG90YWxJdGVtcyAtIGl0ZW1zQXRCb3R0b20pO1xuICAgICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsVG90YWxTaXplO1xuICAgICAgICAgIGNvbnN0IGV4YWN0U2Nyb2xsSW5kZXggPSBzY3JvbGxSYXRpbyAqIHRvdGFsSXRlbXM7XG4gICAgICAgICAgY29uc3QgaW50ZXJwb2xhdGlvbiA9IE1hdGgubWF4KFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIE1hdGgubWluKDEsIDEgLSBkaXN0YW5jZUZyb21Cb3R0b20gLyBjb250YWluZXJTaXplKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3QgYm90dG9tUG9zID0gKGZpcnN0SW5kZXggLSBmaXJzdFZpc2libGVBdEJvdHRvbSkgKiBpdGVtU2l6ZTtcbiAgICAgICAgICBjb25zdCBub3JtYWxQb3MgPSAoZmlyc3RJbmRleCAtIGV4YWN0U2Nyb2xsSW5kZXgpICogaXRlbVNpemU7XG4gICAgICAgICAgY3VycmVudFBvc2l0aW9uID0gbm9ybWFsUG9zICsgKGJvdHRvbVBvcyAtIG5vcm1hbFBvcykgKiBpbnRlcnBvbGF0aW9uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsVG90YWxTaXplO1xuICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbiA9IChmaXJzdEluZGV4IC0gc2Nyb2xsUmF0aW8gKiB0b3RhbEl0ZW1zKSAqIGl0ZW1TaXplO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50UG9zaXRpb24gPSBmaXJzdEluZGV4ICogaXRlbVNpemUgLSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgIH1cblxuICAgICAgLy8gUG9zaXRpb24gZWFjaCBpdGVtXG4gICAgICBzb3J0ZWRJbmRpY2VzLmZvckVhY2goKGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnRzLmdldChpbmRleCk7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke01hdGgucm91bmQoXG4gICAgICAgICAgICBjdXJyZW50UG9zaXRpb24sXG4gICAgICAgICAgKX1weClgO1xuXG4gICAgICAgICAgLy8gU3RyYXRlZ2ljIGxvZyBmb3IgbGFzdCBpdGVtc1xuICAgICAgICAgIC8vIGlmIChpbmRleCA+PSB0b3RhbEl0ZW1zIC0gNSkge1xuICAgICAgICAgIC8vICAgY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICAgIGBbUmVuZGVyaW5nXSBMYXN0IGl0ZW0gcG9zaXRpb25lZDogaW5kZXg9JHtpbmRleH0sIHBvc2l0aW9uPSR7TWF0aC5yb3VuZChcbiAgICAgICAgICAvLyAgICAgICBjdXJyZW50UG9zaXRpb25cbiAgICAgICAgICAvLyAgICAgKX1weCwgaXRlbVNpemU9JHtpdGVtU2l6ZX1weCwgdG90YWxJdGVtcz0ke3RvdGFsSXRlbXN9YFxuICAgICAgICAgIC8vICAgKTtcbiAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICBjdXJyZW50UG9zaXRpb24gKz0gaXRlbVNpemU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBNYWluIHJlbmRlciBmdW5jdGlvblxuICAgIGNvbnN0IHJlbmRlckl0ZW1zID0gKCkgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlPy5pdGVtc0NvbnRhaW5lcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdmlzaWJsZVJhbmdlLFxuICAgICAgICBpdGVtc0NvbnRhaW5lcixcbiAgICAgICAgdG90YWxJdGVtcyxcbiAgICAgICAgaXRlbVNpemUsXG4gICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICBjb250YWluZXJTaXplLFxuICAgICAgICB2aXJ0dWFsVG90YWxTaXplLFxuICAgICAgfSA9IHZpZXdwb3J0U3RhdGU7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHJhbmdlIC0gc2tpcCByZW5kZXJpbmcgaWYgbm8gaXRlbXMgb3IgcmFuZ2UgaXMgaW52YWxpZFxuICAgICAgaWYgKFxuICAgICAgICAhdmlzaWJsZVJhbmdlIHx8XG4gICAgICAgIHRvdGFsSXRlbXMgPD0gMCB8fFxuICAgICAgICB2aXNpYmxlUmFuZ2Uuc3RhcnQgPCAwIHx8XG4gICAgICAgIHZpc2libGVSYW5nZS5zdGFydCA+PSB0b3RhbEl0ZW1zIHx8XG4gICAgICAgIHZpc2libGVSYW5nZS5lbmQgPCB2aXNpYmxlUmFuZ2Uuc3RhcnQgfHxcbiAgICAgICAgaXNOYU4odmlzaWJsZVJhbmdlLnN0YXJ0KSB8fFxuICAgICAgICBpc05hTih2aXNpYmxlUmFuZ2UuZW5kKVxuICAgICAgKSB7XG4gICAgICAgIC8vIElmIHRvdGFsSXRlbXMgaXMgMCwgY2xlYXIgYWxsIHJlbmRlcmVkIGVsZW1lbnRzIHRvIHJlbW92ZSBzdGFsZSBwbGFjZWhvbGRlcnNcbiAgICAgICAgaWYgKHRvdGFsSXRlbXMgPD0gMCAmJiByZW5kZXJlZEVsZW1lbnRzLnNpemUgPiAwKSB7XG4gICAgICAgICAgQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLmVudHJpZXMoKSkuZm9yRWFjaCgoW2luZGV4LCBlbGVtZW50XSkgPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSkgcmVsZWFzZUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmRlbGV0ZShpbmRleCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY3VycmVudFZpc2libGVSYW5nZSA9IHsgc3RhcnQ6IC0xLCBlbmQ6IC0xIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiByYW5nZSBjaGFuZ2VkXG4gICAgICBpZiAoXG4gICAgICAgIHZpc2libGVSYW5nZS5zdGFydCA9PT0gY3VycmVudFZpc2libGVSYW5nZS5zdGFydCAmJlxuICAgICAgICB2aXNpYmxlUmFuZ2UuZW5kID09PSBjdXJyZW50VmlzaWJsZVJhbmdlLmVuZCAmJlxuICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNpemUgPiAwXG4gICAgICApIHtcbiAgICAgICAgdXBkYXRlSXRlbVBvc2l0aW9ucygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxhc3RSZW5kZXJUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHJlbmRlclN0YXJ0ID0gTWF0aC5tYXgoMCwgdmlzaWJsZVJhbmdlLnN0YXJ0IC0gb3ZlcnNjYW4pO1xuICAgICAgY29uc3QgcmVuZGVyRW5kID0gTWF0aC5taW4odG90YWxJdGVtcyAtIDEsIHZpc2libGVSYW5nZS5lbmQgKyBvdmVyc2Nhbik7XG5cbiAgICAgIC8vIGlmIChpc1JlbW92aW5nSXRlbSkge1xuICAgICAgLy8gICBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgICBgW1JFTkRFUi1GSVhdIHJlbmRlckl0ZW1zIGNhbGM6IHZpc2libGVSYW5nZT0ke0pTT04uc3RyaW5naWZ5KHZpc2libGVSYW5nZSl9LCBvdmVyc2Nhbj0ke292ZXJzY2FufSwgdG90YWxJdGVtcz0ke3RvdGFsSXRlbXN9YCxcbiAgICAgIC8vICAgKTtcbiAgICAgIC8vICAgY29uc29sZS5sb2coXG4gICAgICAvLyAgICAgYFtSRU5ERVItRklYXSByZW5kZXJJdGVtcyBjYWxjOiByZW5kZXJTdGFydD0ke3JlbmRlclN0YXJ0fSwgcmVuZGVyRW5kPSR7cmVuZGVyRW5kfWAsXG4gICAgICAvLyAgICk7XG4gICAgICAvLyB9XG5cbiAgICAgIC8vIFJlbW92ZSBpdGVtcyBvdXRzaWRlIHJhbmdlXG4gICAgICBBcnJheS5mcm9tKHJlbmRlcmVkRWxlbWVudHMuZW50cmllcygpKVxuICAgICAgICAuZmlsdGVyKChbaW5kZXhdKSA9PiBpbmRleCA8IHJlbmRlclN0YXJ0IHx8IGluZGV4ID4gcmVuZGVyRW5kKVxuICAgICAgICAuZm9yRWFjaCgoW2luZGV4LCBlbGVtZW50XSkgPT4ge1xuICAgICAgICAgIGlmIChlbGVtZW50LnBhcmVudE5vZGUpIHJlbGVhc2VFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZGVsZXRlKGluZGV4KTtcbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIEdldCBpdGVtcyBmcm9tIGNvbGxlY3Rpb24gKHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGgpXG4gICAgICBjb25zdCBpdGVtcyA9IGdldENvbGxlY3Rpb25JdGVtcygpO1xuICAgICAgY29uc3QgbWlzc2luZ0l0ZW1zOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgICAvLyBDb2xsZWN0IG5ldyBlbGVtZW50cyB0byBpbnNlcnQgKGluZGV4IC0+IGVsZW1lbnQpXG4gICAgICBjb25zdCBuZXdFbGVtZW50czogQXJyYXk8W251bWJlciwgSFRNTEVsZW1lbnRdPiA9IFtdO1xuXG4gICAgICAvLyBSZW5kZXIgaXRlbXMgaW4gcmFuZ2VcbiAgICAgIGZvciAobGV0IGkgPSByZW5kZXJTdGFydDsgaSA8PSByZW5kZXJFbmQ7IGkrKykge1xuICAgICAgICBpZiAoaSA8IDAgfHwgaSA+PSB0b3RhbEl0ZW1zIHx8IHJlbmRlcmVkRWxlbWVudHMuaGFzKGkpKSBjb250aW51ZTtcblxuICAgICAgICBsZXQgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICBtaXNzaW5nSXRlbXMucHVzaChpKTtcbiAgICAgICAgICAvLyBHZW5lcmF0ZSBwbGFjZWhvbGRlciAocmVuZGVyZWQgZHluYW1pY2FsbHksIG5vdCBzdG9yZWQpXG4gICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJzID0gKGNvbXBvbmVudCBhcyBhbnkpLnBsYWNlaG9sZGVycztcbiAgICAgICAgICBpdGVtID0gcGxhY2Vob2xkZXJzPy5nZW5lcmF0ZVBsYWNlaG9sZGVySXRlbShpKSB8fCB7XG4gICAgICAgICAgICBfcGxhY2Vob2xkZXI6IHRydWUsXG4gICAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICAgIGlkOiBgcGxhY2Vob2xkZXItJHtpfWAsXG4gICAgICAgICAgICBuYW1lOiBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuTUFTS19DSEFSQUNURVIucmVwZWF0KDE1KSxcbiAgICAgICAgICAgIHRleHQ6IFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVNLX0NIQVJBQ1RFUi5yZXBlYXQoMjUpLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVNLX0NIQVJBQ1RFUi5yZXBlYXQoNDApLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVuZGVySXRlbShpdGVtLCBpKTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAvLyBHZXQgdGFyZ2V0U2Nyb2xsSW5kZXggZnJvbSB2aWV3cG9ydFN0YXRlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIGNvbnN0IHRhcmdldFNjcm9sbEluZGV4ID0gKHZpZXdwb3J0U3RhdGUgYXMgYW55KT8udGFyZ2V0U2Nyb2xsSW5kZXg7XG4gICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBjYWxjdWxhdGVJdGVtUG9zaXRpb24oXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICAgICAgaXRlbVNpemUsXG4gICAgICAgICAgICB2aXJ0dWFsVG90YWxTaXplLFxuICAgICAgICAgICAgY29udGFpbmVyU2l6ZSxcbiAgICAgICAgICAgIHRhcmdldFNjcm9sbEluZGV4LFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGVZKCR7cG9zaXRpb259cHgpYCxcbiAgICAgICAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIENvbGxlY3QgZm9yIGJhdGNoIGluc2VydGlvbiAoaWYgbWFpbnRhaW5pbmcgb3JkZXIpIG9yIGp1c3QgYXBwZW5kXG4gICAgICAgICAgaWYgKG1haW50YWluRG9tT3JkZXIpIHtcbiAgICAgICAgICAgIG5ld0VsZW1lbnRzLnB1c2goW2ksIGVsZW1lbnRdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaXRlbXNDb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2V0KGksIGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEJhdGNoIGluc2VydCBuZXcgZWxlbWVudHMgaW4gY29ycmVjdCBET00gb3JkZXIgKG9ubHkgd2hlbiBtYWludGFpbkRvbU9yZGVyIGlzIGVuYWJsZWQpXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgQ1NTIHNlbGVjdG9ycyBsaWtlIDpmaXJzdC1jaGlsZCwgOm50aC1jaGlsZCgpIHdvcmsgY29ycmVjdGx5XG4gICAgICBpZiAobWFpbnRhaW5Eb21PcmRlciAmJiBuZXdFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFNvcnQgbmV3IGVsZW1lbnRzIGJ5IGluZGV4XG4gICAgICAgIG5ld0VsZW1lbnRzLnNvcnQoKFthXSwgW2JdKSA9PiBhIC0gYik7XG5cbiAgICAgICAgLy8gR2V0IGV4aXN0aW5nIERPTSBjaGlsZHJlbiBzb3J0ZWQgYnkgdGhlaXIgZGF0YS1pbmRleFxuICAgICAgICBjb25zdCBleGlzdGluZ0NoaWxkcmVuID0gQXJyYXkuZnJvbShcbiAgICAgICAgICBpdGVtc0NvbnRhaW5lci5jaGlsZHJlbixcbiAgICAgICAgKSBhcyBIVE1MRWxlbWVudFtdO1xuXG4gICAgICAgIC8vIE1lcmdlIG5ldyBlbGVtZW50cyBpbnRvIGNvcnJlY3QgcG9zaXRpb25zXG4gICAgICAgIGxldCBuZXdJZHggPSAwO1xuICAgICAgICBsZXQgZXhpc3RpbmdJZHggPSAwO1xuXG4gICAgICAgIHdoaWxlIChuZXdJZHggPCBuZXdFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBbbmV3SW5kZXgsIG5ld0VsZW1lbnRdID0gbmV3RWxlbWVudHNbbmV3SWR4XTtcblxuICAgICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IGV4aXN0aW5nIGNoaWxkIHdpdGggaW5kZXggPiBuZXdJbmRleFxuICAgICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgIGV4aXN0aW5nSWR4IDwgZXhpc3RpbmdDaGlsZHJlbi5sZW5ndGggJiZcbiAgICAgICAgICAgIHBhcnNlSW50KGV4aXN0aW5nQ2hpbGRyZW5bZXhpc3RpbmdJZHhdLmRhdGFzZXQuaW5kZXggfHwgXCItMVwiLCAxMCkgPFxuICAgICAgICAgICAgICBuZXdJbmRleFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZXhpc3RpbmdJZHgrKztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZXhpc3RpbmdJZHggPCBleGlzdGluZ0NoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gSW5zZXJ0IGJlZm9yZSB0aGUgZXhpc3RpbmcgY2hpbGRcbiAgICAgICAgICAgIGl0ZW1zQ29udGFpbmVyLmluc2VydEJlZm9yZShcbiAgICAgICAgICAgICAgbmV3RWxlbWVudCxcbiAgICAgICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbltleGlzdGluZ0lkeF0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBcHBlbmQgYXQgdGhlIGVuZFxuICAgICAgICAgICAgaXRlbXNDb250YWluZXIuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5ld0lkeCsrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlcXVlc3QgbWlzc2luZyBpdGVtc1xuICAgICAgaWYgKFxuICAgICAgICBtaXNzaW5nSXRlbXMubGVuZ3RoID4gMCAmJlxuICAgICAgICBjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24/LmxvYWRNaXNzaW5nUmFuZ2VzXG4gICAgICApIHtcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24ubG9hZE1pc3NpbmdSYW5nZXMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3RhcnQ6IE1hdGgubWluKC4uLm1pc3NpbmdJdGVtcyksXG4gICAgICAgICAgICBlbmQ6IE1hdGgubWF4KC4uLm1pc3NpbmdJdGVtcyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlbmRlcmluZzptaXNzaW5nLWl0ZW1zXCIsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB2aXNpYmxlUmFuZ2U7XG5cbiAgICAgIC8vIEVtaXQgaXRlbXMgcmVuZGVyZWQgZXZlbnQgd2l0aCBlbGVtZW50cyBmb3Igc2l6ZSBjYWxjdWxhdGlvblxuICAgICAgY29uc3QgcmVuZGVyZWRFbGVtZW50c0FycmF5ID0gQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLnZhbHVlcygpKTtcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDppdGVtcy1yZW5kZXJlZFwiLCB7XG4gICAgICAgIGVsZW1lbnRzOiByZW5kZXJlZEVsZW1lbnRzQXJyYXksXG4gICAgICAgIHJhbmdlOiB2aXNpYmxlUmFuZ2UsXG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnJlbmRlcmVkXCIsIHtcbiAgICAgICAgcmFuZ2U6IHZpc2libGVSYW5nZSxcbiAgICAgICAgcmVuZGVyZWRDb3VudDogcmVuZGVyZWRFbGVtZW50cy5zaXplLFxuICAgICAgfSk7XG4gICAgICB1cGRhdGVJdGVtUG9zaXRpb25zKCk7XG5cbiAgICAgIC8vIExvYWQgZGF0YSBpZiBubyBpdGVtcyByZW5kZXJlZFxuICAgICAgaWYgKFxuICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNpemUgPT09IDAgJiZcbiAgICAgICAgdG90YWxJdGVtcyA+IDAgJiZcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uXG4gICAgICApIHtcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24ubG9hZE1pc3NpbmdSYW5nZXMoXG4gICAgICAgICAgdmlzaWJsZVJhbmdlLFxuICAgICAgICAgIFwicmVuZGVyaW5nOm5vLWl0ZW1zXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEV4dGVuZCB2aWV3cG9ydCBBUElcbiAgICBjb25zdCBvcmlnaW5hbFJlbmRlckl0ZW1zID0gY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zO1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcyA9ICgpID0+IHtcbiAgICAgIHJlbmRlckl0ZW1zKCk7XG4gICAgICBvcmlnaW5hbFJlbmRlckl0ZW1zPy4oKTtcbiAgICB9O1xuXG4gICAgLy8gQ2xlYW51cFxuICAgIHdyYXBEZXN0cm95KGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgLy8gUmVsZWFzZSBhbGwgcmVuZGVyZWQgZWxlbWVudHMgLSB1c2UgcmVsZWFzZUVsZW1lbnQgdG8gcHJvcGVybHkgZGVzdHJveSBsYXlvdXRSZXN1bHRzXG4gICAgICByZW5kZXJlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgcmVsZWFzZUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICB9KTtcbiAgICAgIHJlbmRlcmVkRWxlbWVudHMuY2xlYXIoKTtcblxuICAgICAgLy8gQ2xlYXIgZWxlbWVudCBwb29sXG4gICAgICBlbGVtZW50UG9vbC5sZW5ndGggPSAwO1xuXG4gICAgICAvLyBSZXNldCBzdGF0ZVxuICAgICAgY3VycmVudFZpc2libGVSYW5nZSA9IHsgc3RhcnQ6IC0xLCBlbmQ6IC0xIH07XG4gICAgICB2aWV3cG9ydFN0YXRlID0gbnVsbDtcbiAgICAgIGxhc3RSZW5kZXJUaW1lID0gMDtcblxuICAgICAgLy8gUmVzZXQgcG9vbCBzdGF0c1xuICAgICAgcG9vbFN0YXRzLmNyZWF0ZWQgPSAwO1xuICAgICAgcG9vbFN0YXRzLnJlY3ljbGVkID0gMDtcbiAgICAgIHBvb2xTdGF0cy5wb29sU2l6ZSA9IDA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9O1xufTtcbiIsCiAgICAiLy8gc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvZXZlbnRzLnRzXG5cbi8qKlxuICogRXZlbnRzIEZlYXR1cmUgLSBDZW50cmFsaXplZCBldmVudCBzeXN0ZW0gZm9yIHZpZXdwb3J0XG4gKiBQcm92aWRlcyBldmVudCBlbWlzc2lvbiBhbmQgc3Vic2NyaXB0aW9uIGZvciBpbnRlci1mZWF0dXJlIGNvbW11bmljYXRpb25cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBFdmVudHNDb25maWcge1xuICBkZWJ1Zz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRXZlbnRzIGZlYXR1cmUgZm9yIHZpZXdwb3J0XG4gKiBDZW50cmFsaXplcyBhbGwgZXZlbnQgaGFuZGxpbmcgZm9yIHZpZXdwb3J0IGZlYXR1cmVzXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoRXZlbnRzID0gKGNvbmZpZzogRXZlbnRzQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHsgZGVidWcgPSBmYWxzZSB9ID0gY29uZmlnO1xuXG4gICAgLy8gRXZlbnQgbGlzdGVuZXJzIG1hcFxuICAgIGNvbnN0IGxpc3RlbmVycyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8RnVuY3Rpb24+PigpO1xuXG4gICAgLy8gRW1pdCBhbiBldmVudFxuICAgIGNvbnN0IGVtaXQgPSAoZXZlbnQ6IHN0cmluZywgZGF0YT86IGFueSkgPT4ge1xuICAgICAgLy8gaWYgKGRlYnVnKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKGBbRXZlbnRzXSBFbWl0OiAke2V2ZW50fWAsIGRhdGEpO1xuICAgICAgLy8gfVxuXG4gICAgICBjb25zdCBldmVudExpc3RlbmVycyA9IGxpc3RlbmVycy5nZXQoZXZlbnQpO1xuICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzKSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxpc3RlbmVyKGRhdGEpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBbRXZlbnRzXSBFcnJvciBpbiBsaXN0ZW5lciBmb3IgJHtldmVudH06YCwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFN1YnNjcmliZSB0byBhbiBldmVudFxuICAgIGNvbnN0IG9uID0gKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKTogKCgpID0+IHZvaWQpID0+IHtcbiAgICAgIGlmICghbGlzdGVuZXJzLmhhcyhldmVudCkpIHtcbiAgICAgICAgbGlzdGVuZXJzLnNldChldmVudCwgbmV3IFNldCgpKTtcbiAgICAgIH1cblxuICAgICAgbGlzdGVuZXJzLmdldChldmVudCkhLmFkZChoYW5kbGVyKTtcblxuICAgICAgLy8gaWYgKGRlYnVnKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKGBbRXZlbnRzXSBTdWJzY3JpYmVkIHRvOiAke2V2ZW50fWApO1xuICAgICAgLy8gfVxuXG4gICAgICAvLyBSZXR1cm4gdW5zdWJzY3JpYmUgZnVuY3Rpb25cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzID0gbGlzdGVuZXJzLmdldChldmVudCk7XG4gICAgICAgIGlmIChldmVudExpc3RlbmVycykge1xuICAgICAgICAgIGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgICBpZiAoZXZlbnRMaXN0ZW5lcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG5cbiAgICAvLyBTdWJzY3JpYmUgdG8gYW4gZXZlbnQgb25jZVxuICAgIGNvbnN0IG9uY2UgPSAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pOiAoKCkgPT4gdm9pZCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlZEhhbmRsZXIgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGhhbmRsZXIoZGF0YSk7XG4gICAgICAgIG9mZihldmVudCwgd3JhcHBlZEhhbmRsZXIpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBvbihldmVudCwgd3JhcHBlZEhhbmRsZXIpO1xuICAgIH07XG5cbiAgICAvLyBVbnN1YnNjcmliZSBmcm9tIGFuIGV2ZW50XG4gICAgY29uc3Qgb2ZmID0gKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICBjb25zdCBldmVudExpc3RlbmVycyA9IGxpc3RlbmVycy5nZXQoZXZlbnQpO1xuICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzKSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzLnNpemUgPT09IDApIHtcbiAgICAgICAgICBsaXN0ZW5lcnMuZGVsZXRlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBDbGVhciBhbGwgbGlzdGVuZXJzIGZvciBhbiBldmVudFxuICAgIGNvbnN0IGNsZWFyID0gKGV2ZW50Pzogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0ZW5lcnMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQWRkIGV2ZW50IG1ldGhvZHMgdG8gY29tcG9uZW50XG4gICAgY29tcG9uZW50LmVtaXQgPSBlbWl0O1xuICAgIGNvbXBvbmVudC5vbiA9IG9uO1xuICAgIGNvbXBvbmVudC5vbmNlID0gb25jZTtcbiAgICBjb21wb25lbnQub2ZmID0gb2ZmO1xuXG4gICAgLy8gQWRkIGV2ZW50cyBBUEkgdG8gdmlld3BvcnRcbiAgICAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuZXZlbnRzID0ge1xuICAgICAgZW1pdCxcbiAgICAgIG9uLFxuICAgICAgb25jZSxcbiAgICAgIG9mZixcbiAgICAgIGNsZWFyLFxuICAgICAgZ2V0TGlzdGVuZXJDb3VudDogKGV2ZW50Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBsaXN0ZW5lcnMuZ2V0KGV2ZW50KT8uc2l6ZSB8fCAwO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0b3RhbCA9IDA7XG4gICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKChzZXQpID0+ICh0b3RhbCArPSBzZXQuc2l6ZSkpO1xuICAgICAgICByZXR1cm4gdG90YWw7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBDbGVhbiB1cCBvbiBkZXN0cm95XG4gICAgaWYgKFwiZGVzdHJveVwiIGluIGNvbXBvbmVudCAmJiB0eXBlb2YgY29tcG9uZW50LmRlc3Ryb3kgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmRlc3Ryb3k7XG4gICAgICBjb21wb25lbnQuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgY2xlYXIoKTtcbiAgICAgICAgb3JpZ2luYWxEZXN0cm95Py4oKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL3ZsaXN0L3ZsaXN0LnRzXG5cbi8qKlxuICogVkxpc3QgQ29tcG9uZW50IC0gVmlydHVhbCBMaXN0IHdpdGggZGlyZWN0IHZpZXdwb3J0IGludGVncmF0aW9uXG4gKlxuICogQSBzaW1wbGlmaWVkIHZpcnR1YWwgbGlzdCB0aGF0IHVzZXMgdGhlIHZpZXdwb3J0IGZlYXR1cmUgZGlyZWN0bHlcbiAqIHdpdGhvdXQgdGhlIGxpc3QtbWFuYWdlciBhYnN0cmFjdGlvbiBsYXllci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZMaXN0Q29uZmlnLCBWTGlzdENvbXBvbmVudCwgVkxpc3RJdGVtIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLy8gSW1wb3J0IG10cmwgY29tcG9zZSBzeXN0ZW1cbmltcG9ydCB7IHBpcGUgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgY3JlYXRlQmFzZSwgd2l0aEVsZW1lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgd2l0aEV2ZW50cywgd2l0aExpZmVjeWNsZSB9IGZyb20gXCJtdHJsXCI7XG5cbi8vIEltcG9ydCB2aWV3cG9ydCBmZWF0dXJlXG5pbXBvcnQgeyB3aXRoVmlld3BvcnQgfSBmcm9tIFwiLi9mZWF0dXJlcy92aWV3cG9ydFwiO1xuaW1wb3J0IHsgd2l0aEFQSSB9IGZyb20gXCIuL2ZlYXR1cmVzL2FwaVwiO1xuaW1wb3J0IHsgd2l0aFNlbGVjdGlvbiB9IGZyb20gXCIuL2ZlYXR1cmVzL3NlbGVjdGlvblwiO1xuaW1wb3J0IHsgd2l0aEtleWJvYXJkIH0gZnJvbSBcIi4vZmVhdHVyZXMva2V5Ym9hcmRcIjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFZMaXN0IGNvbXBvbmVudCB1c2luZyBkaXJlY3Qgdmlld3BvcnQgaW50ZWdyYXRpb25cbiAqXG4gKiBAcGFyYW0ge1ZMaXN0Q29uZmlnfSBjb25maWcgLSBMaXN0IGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMge1ZMaXN0Q29tcG9uZW50fSBBIGZ1bGx5IGNvbmZpZ3VyZWQgdmlydHVhbCBsaXN0IGNvbXBvbmVudFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB2bGlzdCA9IGNyZWF0ZVZMaXN0KHtcbiAqICAgY29udGFpbmVyOiAnI215LWxpc3QnLFxuICogICBjb2xsZWN0aW9uOiBteUFkYXB0ZXIsXG4gKiAgIHJhbmdlU2l6ZTogMjAsXG4gKiAgIHBhZ2luYXRpb25TdHJhdGVneTogJ3BhZ2UnLFxuICogICB0ZW1wbGF0ZTogKGl0ZW0sIGluZGV4KSA9PiBbXG4gKiAgICAgeyBjbGFzczogJ3ZpZXdwb3J0LWl0ZW0nLCBhdHRyaWJ1dGVzOiB7ICdkYXRhLWlkJzogaXRlbS5pZCB9fSxcbiAqICAgICBbeyBjbGFzczogJ3ZpZXdwb3J0LWl0ZW1fX25hbWUnLCB0ZXh0OiBpdGVtLm5hbWUgfV0sXG4gKiAgICAgW3sgY2xhc3M6ICd2aWV3cG9ydC1pdGVtX192YWx1ZScsIHRleHQ6IGl0ZW0udmFsdWUgfV1cbiAqICAgXVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVZMaXN0ID0gPFQgZXh0ZW5kcyBWTGlzdEl0ZW0gPSBWTGlzdEl0ZW0+KFxuICBjb25maWc6IFZMaXN0Q29uZmlnPFQ+ID0ge30sXG4pOiBWTGlzdENvbXBvbmVudDxUPiA9PiB7XG4gIHRyeSB7XG4gICAgLy8gY29uc29sZS5sb2coYPCfk4sgQ3JlYXRpbmcgVkxpc3QgY29tcG9uZW50IHdpdGggZGlyZWN0IHZpZXdwb3J0IGludGVncmF0aW9uYCk7XG5cbiAgICAvLyBOb3RlOiBUcmFuc2Zvcm0gc2hvdWxkIGJlIGFwcGxpZWQgYnkgdGhlIGNvbGxlY3Rpb24gZmVhdHVyZSBpbiB2aWV3cG9ydFxuICAgIC8vIFZMaXN0IHNob3VsZCBub3QgaW50ZXJjZXB0IGNvbGxlY3Rpb24gcmVhZHMgYXMgaXQgYnlwYXNzZXMgdGhlIGxvYWRpbmcgbWFuYWdlclxuXG4gICAgLy8gQ3JlYXRlIHRoZSBjb21wb25lbnQgdGhyb3VnaCBmdW5jdGlvbmFsIGNvbXBvc2l0aW9uXG4gICAgY29uc3QgZW5oYW5jZXJzID0gW1xuICAgICAgLy8gMS4gRm91bmRhdGlvbiBsYXllclxuICAgICAgY3JlYXRlQmFzZSxcbiAgICAgIHdpdGhFdmVudHMoKSxcbiAgICAgIHdpdGhFbGVtZW50KHtcbiAgICAgICAgdGFnOiBcImRpdlwiLFxuICAgICAgICBjbGFzc05hbWU6IGNvbmZpZy5jbGFzc05hbWUgfHwgXCJtdHJsLXZsaXN0XCIsXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICByb2xlOiBcImxpc3RcIixcbiAgICAgICAgICBcImFyaWEtbGFiZWxcIjogY29uZmlnLmFyaWFMYWJlbCB8fCBcIlZpcnR1YWwgTGlzdFwiLFxuICAgICAgICB9LFxuICAgICAgfSksXG5cbiAgICAgIC8vIDIuIFZpZXdwb3J0IGludGVncmF0aW9uXG4gICAgICAvLyBQYXNzIGF1dG9TZWxlY3RGaXJzdCBmcm9tIHNlbGVjdGlvbiBjb25maWcgdG8gdmlld3BvcnQgbGV2ZWxcbiAgICAgIHdpdGhWaWV3cG9ydCh7XG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgYXV0b1NlbGVjdEZpcnN0OiBjb25maWcuc2VsZWN0aW9uPy5hdXRvU2VsZWN0Rmlyc3QsXG4gICAgICB9KSxcblxuICAgICAgLy8gMy4gQ29tcG9uZW50IGxpZmVjeWNsZVxuICAgICAgd2l0aExpZmVjeWNsZSgpLFxuXG4gICAgICAvLyA0LiBQdWJsaWMgQVBJIGxheWVyXG4gICAgICB3aXRoQVBJKGNvbmZpZyksXG4gICAgXTtcblxuICAgIC8vIDQuNS4gU2VsZWN0aW9uIGNhcGFiaWxpdGllcyAoaWYgZW5hYmxlZCkgLSBtdXN0IGJlIGFmdGVyIEFQSVxuICAgIGlmIChjb25maWcuc2VsZWN0aW9uPy5lbmFibGVkKSB7XG4gICAgICBlbmhhbmNlcnMucHVzaCh3aXRoU2VsZWN0aW9uKGNvbmZpZykpO1xuICAgIH1cblxuICAgIC8vIDUuIEtleWJvYXJkIG5hdmlnYXRpb24gKGlmIHNlbGVjdGlvbiBlbmFibGVkIG9yIGV4cGxpY2l0bHkgY29uZmlndXJlZClcbiAgICBpZiAoY29uZmlnLnNlbGVjdGlvbj8uZW5hYmxlZCB8fCBjb25maWcua2V5Ym9hcmQ/LmVuYWJsZWQpIHtcbiAgICAgIGVuaGFuY2Vycy5wdXNoKHdpdGhLZXlib2FyZChjb25maWcpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wb25lbnQgPSBwaXBlKC4uLmVuaGFuY2Vycykoe1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgY29tcG9uZW50TmFtZTogXCJ2bGlzdFwiLFxuICAgICAgcHJlZml4OiBjb25maWcucHJlZml4IHx8IFwibXRybFwiLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudCBhcyBWTGlzdENvbXBvbmVudDxUPjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwi4p2MIFtWTElTVF0gRmFpbGVkIHRvIGNyZWF0ZSBWTGlzdCBjb21wb25lbnQ6XCIsIGVycm9yKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvdmxpc3QvZmVhdHVyZXMvdmlld3BvcnQudHNcblxuLyoqXG4gKiBWaWV3cG9ydCBmZWF0dXJlIGZvciBWTGlzdFxuICogSW50ZWdyYXRlcyB0aGUgY29yZSB2aWV3cG9ydCBmdW5jdGlvbmFsaXR5IHdpdGggVkxpc3QgY29tcG9uZW50XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWTGlzdENvbmZpZywgVkxpc3RJdGVtIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBjcmVhdGVWaWV3cG9ydCB9IGZyb20gXCIuLi8uLi8uLi9jb3JlL3ZpZXdwb3J0XCI7XG5cbi8qKlxuICogQWRkcyB2aWV3cG9ydCBmdW5jdGlvbmFsaXR5IHRvIFZMaXN0XG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoVmlld3BvcnQgPSA8VCBleHRlbmRzIFZMaXN0SXRlbSA9IFZMaXN0SXRlbT4oXG4gIGNvbmZpZzogVkxpc3RDb25maWc8VD4sXG4pID0+IHtcbiAgcmV0dXJuIChjb21wb25lbnQ6IGFueSkgPT4ge1xuICAgIC8vIFNldCBpbml0aWFsIGl0ZW1zIGlmIHByb3ZpZGVkXG4gICAgaWYgKGNvbmZpZy5pdGVtcykge1xuICAgICAgY29tcG9uZW50Lml0ZW1zID0gY29uZmlnLml0ZW1zO1xuICAgICAgY29tcG9uZW50LnRvdGFsSXRlbXMgPSBjb25maWcuaXRlbXMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIFNldCB0ZW1wbGF0ZSBpZiBwcm92aWRlZFxuICAgIGlmIChjb25maWcudGVtcGxhdGUpIHtcbiAgICAgIGNvbXBvbmVudC50ZW1wbGF0ZSA9IGNvbmZpZy50ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgdGhlIGVsZW1lbnQgaGFzIGJvdGggdmxpc3QgYW5kIHZpZXdwb3J0IGNsYXNzZXNcbiAgICBjb25zdCB2aWV3cG9ydENvbmZpZyA9IHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGNsYXNzTmFtZTogXCJtdHJsLXZpZXdwb3J0XCIsIC8vIFRoaXMgd2lsbCBiZSBhZGRlZCBieSB2aWV3cG9ydCBiYXNlIGZlYXR1cmVcbiAgICB9O1xuXG4gICAgLy8gUGFzcyBWTGlzdCBjb25maWcgZGlyZWN0bHkgdG8gdmlld3BvcnRcbiAgICBjb25zdCB2aWV3cG9ydEVuaGFuY2VkID0gY3JlYXRlVmlld3BvcnQodmlld3BvcnRDb25maWcgYXMgYW55KShjb21wb25lbnQpO1xuXG4gICAgLy8gSGFuZGxlIHBhcmVudCBlbGVtZW50IGlmIHByb3ZpZGVkXG4gICAgaWYgKGNvbmZpZy5wYXJlbnQgfHwgY29uZmlnLmNvbnRhaW5lcikge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gY29uZmlnLnBhcmVudCB8fCBjb25maWcuY29udGFpbmVyO1xuICAgICAgY29uc3QgZWxlbWVudCA9XG4gICAgICAgIHR5cGVvZiBjb250YWluZXIgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY29udGFpbmVyKVxuICAgICAgICAgIDogY29udGFpbmVyO1xuXG4gICAgICBpZiAoZWxlbWVudCAmJiB2aWV3cG9ydEVuaGFuY2VkLmVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZCh2aWV3cG9ydEVuaGFuY2VkLmVsZW1lbnQpO1xuXG4gICAgICAgIC8vIEVuc3VyZSB2aWV3cG9ydCBpcyBpbml0aWFsaXplZCBhZnRlciBET00gYXR0YWNobWVudFxuICAgICAgICBpZiAodmlld3BvcnRFbmhhbmNlZC52aWV3cG9ydCAmJiB2aWV3cG9ydEVuaGFuY2VkLnZpZXdwb3J0LmluaXRpYWxpemUpIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIvCfk4sgW1ZMaXN0XSBJbml0aWFsaXppbmcgdmlld3BvcnQgYWZ0ZXIgRE9NIGF0dGFjaG1lbnRcIik7XG4gICAgICAgICAgdmlld3BvcnRFbmhhbmNlZC52aWV3cG9ydC5pbml0aWFsaXplKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmlld3BvcnRFbmhhbmNlZDtcbiAgfTtcbn07XG4iLAogICAgIi8qKlxuICogQVBJIGZlYXR1cmUgZm9yIFZMaXN0XG4gKiBQcm92aWRlcyBhIGNsZWFuIHB1YmxpYyBBUEkgZm9yIHRoZSBWTGlzdCBjb21wb25lbnRcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZMaXN0Q29uZmlnLCBWTGlzdEl0ZW0sIFJlbW92ZUl0ZW1PcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8vIFJlLWV4cG9ydCBmb3IgY29udmVuaWVuY2VcbmV4cG9ydCB0eXBlIHsgUmVtb3ZlSXRlbU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IHdpdGhBUEkgPSA8VCBleHRlbmRzIFZMaXN0SXRlbSA9IFZMaXN0SXRlbT4oXG4gIGNvbmZpZzogVkxpc3RDb25maWc8VD4sXG4pID0+IHtcbiAgcmV0dXJuIChjb21wb25lbnQ6IGFueSkgPT4ge1xuICAgIC8vIEluaXRpYWxpemUgdmlld3BvcnQgb24gY3JlYXRpb25cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQgJiYgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUpIHtcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUoKTtcbiAgICAgIH1cbiAgICB9LCAwKTtcblxuICAgIC8vIFRyYWNrIGxvYWRpbmcgc3RhdGVcbiAgICBsZXQgaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgbGV0IHNlbGVjdGVkSWRzID0gbmV3IFNldDxzdHJpbmcgfCBudW1iZXI+KCk7XG5cbiAgICAvLyBUcmFjayBwZW5kaW5nIHJlbW92YWxzIHRvIGZpbHRlciBvdXQgaXRlbXMgZnJvbSBzdGFsZSBzZXJ2ZXIgcmVzcG9uc2VzXG4gICAgLy8gVGhpcyBwcmV2ZW50cyByYWNlIGNvbmRpdGlvbnMgd2hlcmUgc2VydmVyIHJldHVybnMgb2xkIGRhdGEgYmVmb3JlIHVwZGF0ZXMgYXJlIGNvbW1pdHRlZFxuICAgIGNvbnN0IHBlbmRpbmdSZW1vdmFscyA9IG5ldyBTZXQ8c3RyaW5nIHwgbnVtYmVyPigpO1xuXG4gICAgLy8gTGlzdGVuIGZvciBjb2xsZWN0aW9uIGV2ZW50c1xuICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjpyYW5nZS1sb2FkZWRcIiwgKCkgPT4ge1xuICAgICAgaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgfSk7XG4gICAgY29tcG9uZW50Lm9uPy4oXCJjb2xsZWN0aW9uOnJhbmdlLWZhaWxlZFwiLCAoKSA9PiB7XG4gICAgICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIC8vIERhdGEgb3BlcmF0aW9uc1xuXG4gICAgICAvKipcbiAgICAgICAqIFJlbG9hZCB0aGUgbGlzdCAtIGNsZWFycyBhbGwgZGF0YSBhbmQgZmV0Y2hlcyBmcmVzaCBmcm9tIHRoZSBhZGFwdGVyXG4gICAgICAgKiBUaGlzIGlzIG11Y2ggbW9yZSBlZmZpY2llbnQgdGhhbiBkZXN0cm95aW5nIGFuZCByZWNyZWF0aW5nIHRoZSBWTGlzdFxuICAgICAgICovXG4gICAgICBhc3luYyByZWxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIFJlc2V0IHRoZSBjb2xsZWN0aW9uIHN0YXRlXG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24/LnJlc2V0KSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24ucmVzZXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2V0IHNjcm9sbCBwb3NpdGlvbiB0byB0b3BcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uc2Nyb2xsVG8pIHtcbiAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG8oMCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciByZW5kZXJlZCBET00gY29udGVudCAoaXRlbXMgY29udGFpbmVyKVxuICAgICAgICBjb25zdCBpdGVtc0NvbnRhaW5lciA9IGNvbXBvbmVudC5lbGVtZW50Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgIFwiLm10cmwtdmlld3BvcnQtaXRlbXNcIixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGl0ZW1zQ29udGFpbmVyKSB7XG4gICAgICAgICAgaXRlbXNDb250YWluZXIuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2V0IGluaXRpYWxpemF0aW9uIHN0YXRlIHNvIGluaXRpYWxpemUoKSB3aWxsIHJ1biBhZ2FpblxuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5yZXNldEluaXRpYWxpemF0aW9uKSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnJlc2V0SW5pdGlhbGl6YXRpb24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlLWluaXRpYWxpemUgdG8gdHJpZ2dlciBmcmVzaCBkYXRhIGxvYWRcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uaW5pdGlhbGl6ZSkge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwicmVsb2FkZWRcIik7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGFsbCBkYXRhIHdpdGhvdXQgcmVsb2FkaW5nXG4gICAgICAgKi9cbiAgICAgIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICAvLyBSZXNldCB0aGUgY29sbGVjdGlvbiBzdGF0ZVxuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uPy5yZXNldCkge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLnJlc2V0KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNldCBzY3JvbGwgcG9zaXRpb24gdG8gdG9wXG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LnNjcm9sbFRvKSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbFRvKDApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgcmVuZGVyZWQgRE9NIGNvbnRlbnQgKGl0ZW1zIGNvbnRhaW5lcilcbiAgICAgICAgY29uc3QgaXRlbXNDb250YWluZXIgPSBjb21wb25lbnQuZWxlbWVudD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBcIi5tdHJsLXZpZXdwb3J0LWl0ZW1zXCIsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpdGVtc0NvbnRhaW5lcikge1xuICAgICAgICAgIGl0ZW1zQ29udGFpbmVyLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY2xlYXJlZFwiKTtcbiAgICAgIH0sXG5cbiAgICAgIHNldEl0ZW1zKGl0ZW1zOiBUW10pIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uY29sbGVjdGlvbikge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLnNldEl0ZW1zKGl0ZW1zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21wb25lbnQuaXRlbXMgPSBpdGVtcztcbiAgICAgICAgICBjb21wb25lbnQudG90YWxJdGVtcyA9IGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbXM6c2V0XCIsIHsgaXRlbXMsIHRvdGFsOiBpdGVtcy5sZW5ndGggfSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEFkZCBpdGVtcyB0byB0aGUgY29sbGVjdGlvbiBhdCB0aGUgc3RhcnQgb3IgZW5kXG4gICAgICAgKiBVcGRhdGVzIHRvdGFsSXRlbXMgYW5kIHRyaWdnZXJzIHJlLXJlbmRlciBvZiB2aXNpYmxlIGl0ZW1zXG4gICAgICAgKiBAcGFyYW0gbmV3SXRlbXMgLSBBcnJheSBvZiBpdGVtcyB0byBhZGRcbiAgICAgICAqIEBwYXJhbSBwb3NpdGlvbiAtIFdoZXJlIHRvIGFkZCBpdGVtczogXCJzdGFydFwiIChkZWZhdWx0KSBvciBcImVuZFwiXG4gICAgICAgKi9cbiAgICAgIGFkZEl0ZW1zKG5ld0l0ZW1zOiBUW10sIHBvc2l0aW9uOiBcInN0YXJ0XCIgfCBcImVuZFwiID0gXCJzdGFydFwiKTogdm9pZCB7XG4gICAgICAgIGlmICghbmV3SXRlbXMgfHwgbmV3SXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiW1ZMaXN0XSBhZGRJdGVtczogbm8gaXRlbXMgcHJvdmlkZWRcIik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uO1xuICAgICAgICBjb25zdCBjdXJyZW50SXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG5cbiAgICAgICAgLy8gQWRkIGl0ZW1zIHRvIHRoZSBjb2xsZWN0aW9uIGl0ZW1zIGFycmF5XG4gICAgICAgIGlmIChjb2xsZWN0aW9uPy5pdGVtcykge1xuICAgICAgICAgIGlmIChwb3NpdGlvbiA9PT0gXCJzdGFydFwiKSB7XG4gICAgICAgICAgICAvLyBQcmVwZW5kIGl0ZW1zIChuZXdlc3QgZmlyc3QpXG4gICAgICAgICAgICBjb2xsZWN0aW9uLml0ZW1zLnVuc2hpZnQoLi4ubmV3SXRlbXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBcHBlbmQgaXRlbXNcbiAgICAgICAgICAgIGNvbGxlY3Rpb24uaXRlbXMucHVzaCguLi5uZXdJdGVtcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBldmVudCBGSVJTVCBzbyByZW5kZXJpbmcgZmVhdHVyZSBjYW4gcmVidWlsZCBjb2xsZWN0aW9uSXRlbXNcbiAgICAgICAgLy8gQkVGT1JFIHNldFRvdGFsSXRlbXMgdHJpZ2dlcnMgYSByZW5kZXJcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW1zOmFkZC1yZXF1ZXN0XCIsIHtcbiAgICAgICAgICBpdGVtczogbmV3SXRlbXMsXG4gICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgcHJldmlvdXNDb3VudDogY3VycmVudEl0ZW1zLmxlbmd0aCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHRvdGFsSXRlbXMgLSB0aGlzIHRyaWdnZXJzIHZpZXdwb3J0OnRvdGFsLWl0ZW1zLWNoYW5nZWQgd2hpY2ggY2FsbHMgcmVuZGVySXRlbXNcbiAgICAgICAgY29uc3QgaXRlbXNBZGRlZCA9IG5ld0l0ZW1zLmxlbmd0aDtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24/LmdldFRvdGFsSXRlbXMgJiYgY29sbGVjdGlvbj8uc2V0VG90YWxJdGVtcykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRUb3RhbCA9IGNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpO1xuICAgICAgICAgIGNvbGxlY3Rpb24uc2V0VG90YWxJdGVtcyhjdXJyZW50VG90YWwgKyBpdGVtc0FkZGVkKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24/LnNldFRvdGFsSXRlbXMpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VG90YWwgPSBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5nZXRUb3RhbEl0ZW1zKCk7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uc2V0VG90YWxJdGVtcyhcbiAgICAgICAgICAgIGN1cnJlbnRUb3RhbCArIGl0ZW1zQWRkZWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoY29tcG9uZW50LnRvdGFsSXRlbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29tcG9uZW50LnRvdGFsSXRlbXMgPSBjb21wb25lbnQudG90YWxJdGVtcyArIGl0ZW1zQWRkZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBjb21wbGV0aW9uIGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtczphZGRlZFwiLCB7XG4gICAgICAgICAgaXRlbXM6IG5ld0l0ZW1zLFxuICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgIHRvdGFsOiB0aGlzLmdldEl0ZW1Db3VudCgpLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQWRkIGEgc2luZ2xlIGl0ZW0gdG8gdGhlIGNvbGxlY3Rpb24gYXQgdGhlIHN0YXJ0IG9yIGVuZFxuICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgd3JhcHMgYWRkSXRlbXMgZm9yIHNpbmdsZSBpdGVtIHVzZSBjYXNlXG4gICAgICAgKiBAcGFyYW0gaXRlbSAtIEl0ZW0gdG8gYWRkXG4gICAgICAgKiBAcGFyYW0gcG9zaXRpb24gLSBXaGVyZSB0byBhZGQgaXRlbTogXCJzdGFydFwiIChkZWZhdWx0KSBvciBcImVuZFwiXG4gICAgICAgKi9cbiAgICAgIGFkZEl0ZW0oaXRlbTogVCwgcG9zaXRpb246IFwic3RhcnRcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiW1ZMaXN0XSBhZGRJdGVtOiBubyBpdGVtIHByb3ZpZGVkXCIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZEl0ZW1zKFtpdGVtXSwgcG9zaXRpb24pO1xuICAgICAgfSxcblxuICAgICAgZ2V0SXRlbXMoKTogVFtdIHtcbiAgICAgICAgLy8gQ29sbGVjdGlvbiBpcyBhZGRlZCBkaXJlY3RseSB0byBjb21wb25lbnQsIG5vdCB0byB2aWV3cG9ydC5jb2xsZWN0aW9uXG4gICAgICAgIGlmICgoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbj8uZ2V0SXRlbXMpIHtcbiAgICAgICAgICByZXR1cm4gKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24uZ2V0SXRlbXMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50Lml0ZW1zIHx8IFtdO1xuICAgICAgfSxcblxuICAgICAgZ2V0VmlzaWJsZUl0ZW1zKCk6IFRbXSB7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gY29tcG9uZW50LnZpZXdwb3J0Py5nZXRWaXNpYmxlUmFuZ2UoKSB8fCB7XG4gICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgZW5kOiAwLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zLnNsaWNlKHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpO1xuICAgICAgfSxcblxuICAgICAgZ2V0SXRlbUNvdW50KCk6IG51bWJlciB7XG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICByZXR1cm4gY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb25lbnQudG90YWxJdGVtcyB8fCBjb21wb25lbnQuaXRlbXM/Lmxlbmd0aCB8fCAwO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgaXRlbSBhdCBhIHNwZWNpZmljIGluZGV4XG4gICAgICAgKiBAcGFyYW0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmV0cmlldmVcbiAgICAgICAqIEByZXR1cm5zIFRoZSBpdGVtIGF0IHRoZSBpbmRleCwgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICAgICAgICovXG4gICAgICBnZXRJdGVtKGluZGV4OiBudW1iZXIpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uPy5nZXRJdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uLmdldEl0ZW0oaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgICAgICByZXR1cm4gaXRlbXNbaW5kZXhdO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBVcGRhdGUgaXRlbSBhdCBhIHNwZWNpZmljIGluZGV4XG4gICAgICAgKiBAcGFyYW0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gdXBkYXRlXG4gICAgICAgKiBAcGFyYW0gaXRlbSAtIFRoZSBuZXcgaXRlbSBkYXRhIChmdWxsIHJlcGxhY2VtZW50KVxuICAgICAgICovXG4gICAgICB1cGRhdGVJdGVtKGluZGV4OiBudW1iZXIsIGl0ZW06IFQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG5cbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtWTGlzdF0gdXBkYXRlSXRlbTogaW5kZXggJHtpbmRleH0gb3V0IG9mIGJvdW5kc2ApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXZpb3VzSXRlbSA9IGl0ZW1zW2luZGV4XTtcblxuICAgICAgICAvLyBVcGRhdGUgaW4gY29sbGVjdGlvbiBpdGVtcyBhcnJheVxuICAgICAgICBpZiAoKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24/Lml0ZW1zKSB7XG4gICAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24uaXRlbXNbaW5kZXhdID0gaXRlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgZXZlbnQgZm9yIHJlbmRlcmluZyBmZWF0dXJlIHRvIGhhbmRsZSBET00gdXBkYXRlXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtOnVwZGF0ZS1yZXF1ZXN0XCIsIHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBpdGVtLFxuICAgICAgICAgIHByZXZpb3VzSXRlbSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFVwZGF0ZSBpdGVtIGJ5IElEXG4gICAgICAgKiBGaW5kcyB0aGUgaXRlbSBpbiB0aGUgY29sbGVjdGlvbiBieSBpdHMgSUQgYW5kIHVwZGF0ZXMgaXQgd2l0aCBuZXcgZGF0YVxuICAgICAgICogUmUtcmVuZGVycyB0aGUgaXRlbSBpZiBjdXJyZW50bHkgdmlzaWJsZSBpbiB0aGUgdmlld3BvcnRcbiAgICAgICAqIEBwYXJhbSBpZCAtIFRoZSBpdGVtIElEIHRvIGZpbmRcbiAgICAgICAqIEBwYXJhbSBkYXRhIC0gUGFydGlhbCBkYXRhIHRvIG1lcmdlIHdpdGggZXhpc3RpbmcgaXRlbSwgb3IgZnVsbCBpdGVtIHJlcGxhY2VtZW50XG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFVwZGF0ZSBvcHRpb25zXG4gICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGl0ZW0gd2FzIGZvdW5kIGFuZCB1cGRhdGVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgICAqL1xuICAgICAgdXBkYXRlSXRlbUJ5SWQoXG4gICAgICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgICAgIGRhdGE6IFBhcnRpYWw8VD4sXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAvKiogSWYgdHJ1ZSwgcmVwbGFjZSB0aGUgZW50aXJlIGl0ZW0gaW5zdGVhZCBvZiBtZXJnaW5nIChkZWZhdWx0OiBmYWxzZSkgKi9cbiAgICAgICAgICByZXBsYWNlPzogYm9vbGVhbjtcbiAgICAgICAgICAvKiogSWYgdHJ1ZSwgcmUtcmVuZGVyIGV2ZW4gaWYgbm90IHZpc2libGUgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICAgICAgICAgIGZvcmNlUmVuZGVyPzogYm9vbGVhbjtcbiAgICAgICAgfSA9IHt9LFxuICAgICAgKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHsgcmVwbGFjZSA9IGZhbHNlIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcblxuICAgICAgICAvLyBGaW5kIHRoZSBpdGVtIGJ5IElEIChoYW5kbGUgc3BhcnNlIGFycmF5cyBmcm9tIHBhZ2luYXRpb24pXG4gICAgICAgIC8vIENoZWNrIGFsbCBwb3NzaWJsZSBJRCBmaWVsZHMgc2luY2UgaXRlbXMgbWF5IGhhdmUgZGlmZmVyZW50IElEIHN0cnVjdHVyZXNcbiAgICAgICAgY29uc3QgaW5kZXggPSBpdGVtcy5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgIGlmICghaXRlbSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIC8vIENoZWNrIGFsbCBwb3NzaWJsZSBJRCBmaWVsZHMgLSB1c2VyX2lkIGlzIGltcG9ydGFudCBmb3IgcHJvZmlsZS9jb250YWN0IGl0ZW1zXG4gICAgICAgICAgY29uc3QgaWRzVG9DaGVjayA9IFtpdGVtLmlkLCBpdGVtLl9pZCwgaXRlbS51c2VyX2lkXS5maWx0ZXIoXG4gICAgICAgICAgICAodikgPT4gdiAhPT0gdW5kZWZpbmVkICYmIHYgIT09IG51bGwsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gaWRzVG9DaGVjay5zb21lKFxuICAgICAgICAgICAgKGl0ZW1JZCkgPT4gaXRlbUlkID09PSBpZCB8fCBTdHJpbmcoaXRlbUlkKSA9PT0gU3RyaW5nKGlkKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbVkxpc3RdIHVwZGF0ZUl0ZW1CeUlkOiBpdGVtIHdpdGggaWQgJHtpZH0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJldmlvdXNJdGVtID0gaXRlbXNbaW5kZXhdO1xuXG4gICAgICAgIC8vIENyZWF0ZSB1cGRhdGVkIGl0ZW0gLSBlaXRoZXIgcmVwbGFjZSBlbnRpcmVseSBvciBtZXJnZVxuICAgICAgICBsZXQgdXBkYXRlZEl0ZW06IFQ7XG4gICAgICAgIGlmIChyZXBsYWNlKSB7XG4gICAgICAgICAgdXBkYXRlZEl0ZW0gPSB7IC4uLmRhdGEsIGlkOiBwcmV2aW91c0l0ZW0uaWQgPz8gaWQgfSBhcyBUO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE9ubHkgbWVyZ2UgcHJvcGVydGllcyB0aGF0IGhhdmUgYWN0dWFsIHZhbHVlcyAobm90IHVuZGVmaW5lZClcbiAgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHBhcnRpYWwgdXBkYXRlcyBmcm9tIG92ZXJ3cml0aW5nIGV4aXN0aW5nIGRhdGFcbiAgICAgICAgICB1cGRhdGVkSXRlbSA9IHsgLi4ucHJldmlvdXNJdGVtIH0gYXMgVDtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgKHVwZGF0ZWRJdGVtIGFzIGFueSlba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBpbiBjb2xsZWN0aW9uIGl0ZW1zIGFycmF5XG4gICAgICAgIGlmICgoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbj8uaXRlbXMpIHtcbiAgICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbi5pdGVtc1tpbmRleF0gPSB1cGRhdGVkSXRlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgZXZlbnQgZm9yIHJlbmRlcmluZyBmZWF0dXJlIHRvIGhhbmRsZSBET00gdXBkYXRlXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtOnVwZGF0ZS1yZXF1ZXN0XCIsIHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBpdGVtOiB1cGRhdGVkSXRlbSxcbiAgICAgICAgICBwcmV2aW91c0l0ZW0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmUgaXRlbSBhdCBhIHNwZWNpZmljIGluZGV4XG4gICAgICAgKiBSZW1vdmVzIHRoZSBpdGVtIGZyb20gdGhlIGNvbGxlY3Rpb24sIHVwZGF0ZXMgdG90YWxJdGVtcywgYW5kIHRyaWdnZXJzIHJlLXJlbmRlclxuICAgICAgICogQHBhcmFtIGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJlbW92ZVxuICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiBpdGVtIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICAgKi9cbiAgICAgIHJlbW92ZUl0ZW0oaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uO1xuXG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbVkxpc3RdIHJlbW92ZUl0ZW06IGluZGV4ICR7aW5kZXh9IG91dCBvZiBib3VuZHNgKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZW1vdmVkSXRlbSA9IGl0ZW1zW2luZGV4XTtcblxuICAgICAgICAvLyBSZW1vdmUgZnJvbSBjb2xsZWN0aW9uIGl0ZW1zIGFycmF5IChjb21wb25lbnQuY29sbGVjdGlvbi5pdGVtcyBpcyB0aGUgYWN0dWFsIGFycmF5KVxuICAgICAgICBpZiAoKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24/Lml0ZW1zKSB7XG4gICAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24uaXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElNUE9SVEFOVDogRW1pdCBpdGVtOnJlbW92ZS1yZXF1ZXN0IEZJUlNUIHNvIHJlbmRlcmluZyBmZWF0dXJlIHJlYnVpbGRzIGNvbGxlY3Rpb25JdGVtc1xuICAgICAgICAvLyBCRUZPUkUgc2V0VG90YWxJdGVtcyB0cmlnZ2VycyBhIHJlbmRlciB2aWEgdmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbTpyZW1vdmUtcmVxdWVzdFwiLCB7XG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgaXRlbTogcmVtb3ZlZEl0ZW0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0b3RhbEl0ZW1zIC0gdGhpcyB3aWxsIHRyaWdnZXIgdmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZCB3aGljaCBjYWxscyByZW5kZXJJdGVtc1xuICAgICAgICAvLyBCeSBub3csIGNvbGxlY3Rpb25JdGVtcyBoYXMgYmVlbiByZWJ1aWx0IGJ5IHRoZSBpdGVtOnJlbW92ZS1yZXF1ZXN0IGhhbmRsZXJcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24/LmdldFRvdGFsSXRlbXMgJiYgY29sbGVjdGlvbj8uc2V0VG90YWxJdGVtcykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRUb3RhbCA9IGNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpO1xuICAgICAgICAgIGNvbGxlY3Rpb24uc2V0VG90YWxJdGVtcyhNYXRoLm1heCgwLCBjdXJyZW50VG90YWwgLSAxKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uPy5zZXRUb3RhbEl0ZW1zKSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gdmlld3BvcnQuY29sbGVjdGlvbiBpZiBhdmFpbGFibGVcbiAgICAgICAgICBjb25zdCBjdXJyZW50VG90YWwgPSBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5nZXRUb3RhbEl0ZW1zKCk7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uc2V0VG90YWxJdGVtcyhcbiAgICAgICAgICAgIE1hdGgubWF4KDAsIGN1cnJlbnRUb3RhbCAtIDEpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTGFzdCByZXNvcnQ6IHVwZGF0ZSBjb21wb25lbnQudG90YWxJdGVtcyBkaXJlY3RseVxuICAgICAgICAgIGlmIChjb21wb25lbnQudG90YWxJdGVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb21wb25lbnQudG90YWxJdGVtcyA9IE1hdGgubWF4KDAsIGNvbXBvbmVudC50b3RhbEl0ZW1zIC0gMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBpdGVtIGJ5IElEXG4gICAgICAgKiBGaW5kcyB0aGUgaXRlbSBpbiB0aGUgY29sbGVjdGlvbiBieSBpdHMgSUQgYW5kIHJlbW92ZXMgaXRcbiAgICAgICAqIFVwZGF0ZXMgdG90YWxJdGVtcyBhbmQgdHJpZ2dlcnMgcmUtcmVuZGVyIG9mIHZpc2libGUgaXRlbXNcbiAgICAgICAqIE9wdGlvbmFsbHkgdHJhY2tzIGFzIHBlbmRpbmcgcmVtb3ZhbCB0byBmaWx0ZXIgZnJvbSBmdXR1cmUgZmV0Y2hlc1xuICAgICAgICogQHBhcmFtIGlkIC0gVGhlIGl0ZW0gSUQgdG8gZmluZCBhbmQgcmVtb3ZlXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFJlbW92ZSBvcHRpb25zICh0cmFja1BlbmRpbmcsIHBlbmRpbmdUaW1lb3V0KVxuICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiBpdGVtIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICAgKi9cbiAgICAgIHJlbW92ZUl0ZW1CeUlkKFxuICAgICAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgICAgICBvcHRpb25zOiBSZW1vdmVJdGVtT3B0aW9ucyA9IHt9LFxuICAgICAgKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHsgdHJhY2tQZW5kaW5nID0gdHJ1ZSwgcGVuZGluZ1RpbWVvdXQgPSA1MDAwIH0gPSBvcHRpb25zO1xuXG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbVkxpc3RdIHJlbW92ZUl0ZW1CeUlkOiBpbnZhbGlkIGlkYCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHRvIHBlbmRpbmcgcmVtb3ZhbHMgdG8gZmlsdGVyIGZyb20gZnV0dXJlIHNlcnZlciByZXNwb25zZXNcbiAgICAgICAgaWYgKHRyYWNrUGVuZGluZykge1xuICAgICAgICAgIHBlbmRpbmdSZW1vdmFscy5hZGQoaWQpO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgZnJvbSBwZW5kaW5nIHJlbW92YWxzIGFmdGVyIHRpbWVvdXQgKHNlcnZlciBzaG91bGQgaGF2ZSB1cGRhdGVkIGJ5IHRoZW4pXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBwZW5kaW5nUmVtb3ZhbHMuZGVsZXRlKGlkKTtcbiAgICAgICAgICB9LCBwZW5kaW5nVGltZW91dCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcblxuICAgICAgICAvLyBGaW5kIHRoZSBpdGVtIGJ5IElEIChoYW5kbGUgc3BhcnNlIGFycmF5cyBmcm9tIHBhZ2luYXRpb24pXG4gICAgICAgIC8vIENoZWNrIGFsbCBwb3NzaWJsZSBJRCBmaWVsZHMgc2luY2UgaXRlbXMgbWF5IGhhdmUgZGlmZmVyZW50IElEIHN0cnVjdHVyZXNcbiAgICAgICAgY29uc3QgaW5kZXggPSBpdGVtcy5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgIGlmICghaXRlbSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIC8vIENoZWNrIGFsbCBwb3NzaWJsZSBJRCBmaWVsZHNcbiAgICAgICAgICBjb25zdCBpZHNUb0NoZWNrID0gW2l0ZW0uaWQsIGl0ZW0uX2lkLCBpdGVtLnVzZXJfaWRdLmZpbHRlcihcbiAgICAgICAgICAgICh2KSA9PiB2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gbnVsbCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBpZHNUb0NoZWNrLnNvbWUoXG4gICAgICAgICAgICAoaXRlbUlkKSA9PiBpdGVtSWQgPT09IGlkIHx8IFN0cmluZyhpdGVtSWQpID09PSBTdHJpbmcoaWQpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVJdGVtKGluZGV4KTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgYW4gaXRlbSBJRCBpcyBwZW5kaW5nIHJlbW92YWxcbiAgICAgICAqIEBwYXJhbSBpZCAtIFRoZSBpdGVtIElEIHRvIGNoZWNrXG4gICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpdGVtIGlzIHBlbmRpbmcgcmVtb3ZhbFxuICAgICAgICovXG4gICAgICBpc1BlbmRpbmdSZW1vdmFsKGlkOiBzdHJpbmcgfCBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmdSZW1vdmFscy5oYXMoaWQpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYWxsIHBlbmRpbmcgcmVtb3ZhbCBJRHNcbiAgICAgICAqIEByZXR1cm5zIFNldCBvZiBwZW5kaW5nIHJlbW92YWwgSURzXG4gICAgICAgKi9cbiAgICAgIGdldFBlbmRpbmdSZW1vdmFscygpOiBTZXQ8c3RyaW5nIHwgbnVtYmVyPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2V0KHBlbmRpbmdSZW1vdmFscyk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGEgc3BlY2lmaWMgcGVuZGluZyByZW1vdmFsXG4gICAgICAgKiBAcGFyYW0gaWQgLSBUaGUgaXRlbSBJRCB0byBjbGVhciBmcm9tIHBlbmRpbmcgcmVtb3ZhbHNcbiAgICAgICAqL1xuICAgICAgY2xlYXJQZW5kaW5nUmVtb3ZhbChpZDogc3RyaW5nIHwgbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHBlbmRpbmdSZW1vdmFscy5kZWxldGUoaWQpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDbGVhciBhbGwgcGVuZGluZyByZW1vdmFsc1xuICAgICAgICovXG4gICAgICBjbGVhckFsbFBlbmRpbmdSZW1vdmFscygpOiB2b2lkIHtcbiAgICAgICAgcGVuZGluZ1JlbW92YWxzLmNsZWFyKCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEZpbHRlciBpdGVtcyBhcnJheSB0byBleGNsdWRlIHBlbmRpbmcgcmVtb3ZhbHNcbiAgICAgICAqIFV0aWxpdHkgbWV0aG9kIGZvciB1c2UgaW4gY29sbGVjdGlvbiBhZGFwdGVyc1xuICAgICAgICogQHBhcmFtIGl0ZW1zIC0gQXJyYXkgb2YgaXRlbXMgdG8gZmlsdGVyXG4gICAgICAgKiBAcmV0dXJucyBGaWx0ZXJlZCBhcnJheSB3aXRob3V0IHBlbmRpbmcgcmVtb3ZhbCBpdGVtc1xuICAgICAgICovXG4gICAgICBmaWx0ZXJQZW5kaW5nUmVtb3ZhbHM8SSBleHRlbmRzIHsgaWQ/OiBhbnk7IF9pZD86IGFueSB9PihcbiAgICAgICAgaXRlbXM6IElbXSxcbiAgICAgICk6IElbXSB7XG4gICAgICAgIGlmIChwZW5kaW5nUmVtb3ZhbHMuc2l6ZSA9PT0gMCkgcmV0dXJuIGl0ZW1zO1xuXG4gICAgICAgIHJldHVybiBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICBjb25zdCBpZCA9IGl0ZW0uX2lkIHx8IGl0ZW0uaWQ7XG4gICAgICAgICAgcmV0dXJuICFwZW5kaW5nUmVtb3ZhbHMuaGFzKGlkKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICAvLyBMb2FkaW5nIG9wZXJhdGlvbnNcbiAgICAgIGFzeW5jIGxvYWRSYW5nZShcbiAgICAgICAgcGFnZTogbnVtYmVyLFxuICAgICAgICBsaW1pdDogbnVtYmVyLFxuICAgICAgICBzdHJhdGVneTogc3RyaW5nID0gXCJwYWdlXCIsXG4gICAgICAgIGFsaWdubWVudD86IHN0cmluZyxcbiAgICAgICkge1xuICAgICAgICBpc0xvYWRpbmcgPSB0cnVlO1xuXG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBjb25zdCBvZmZzZXQgPSBzdHJhdGVneSA9PT0gXCJwYWdlXCIgPyAocGFnZSAtIDEpICogbGltaXQgOiBwYWdlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5sb2FkUmFuZ2Uob2Zmc2V0LCBsaW1pdCk7XG4gICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwibG9hZFwiLCB7IHBhZ2UsIGxpbWl0LCBzdHJhdGVneSB9KTtcblxuICAgICAgICAgICAgLy8gU2Nyb2xsIHRvIHRoZSBsb2FkZWQgcmFuZ2UgaWYgYWxpZ25tZW50IGlzIHNwZWNpZmllZFxuICAgICAgICAgICAgaWYgKGFsaWdubWVudCkge1xuICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IG9mZnNldDtcbiAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0luZGV4KGluZGV4LCBhbGlnbm1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiZXJyb3JcIiwgeyBlcnJvciB9KTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8vIERhdGEgbG9hZGluZ1xuICAgICAgbG9hZE5leHQ6IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFtWTGlzdF0gbG9hZE5leHQoKWApO1xuXG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpO1xuICAgICAgICAgIGNvbnN0IGxvYWRlZFJhbmdlcyA9IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldExvYWRlZFJhbmdlcygpO1xuXG4gICAgICAgICAgLy8gRmluZCB0aGUgbmV4dCB1bmxvYWRlZCByYW5nZVxuICAgICAgICAgIGxldCBuZXh0T2Zmc2V0ID0gMDtcbiAgICAgICAgICBmb3IgKGNvbnN0IHJhbmdlSWQgb2YgbG9hZGVkUmFuZ2VzKSB7XG4gICAgICAgICAgICBjb25zdCByYW5nZUVuZCA9IChyYW5nZUlkICsgMSkgKiAoY29uZmlnLnBhZ2luYXRpb24/LmxpbWl0IHx8IDIwKTtcbiAgICAgICAgICAgIGlmIChyYW5nZUVuZCA+IG5leHRPZmZzZXQpIHtcbiAgICAgICAgICAgICAgbmV4dE9mZnNldCA9IHJhbmdlRW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChuZXh0T2Zmc2V0IDwgdG90YWxJdGVtcykge1xuICAgICAgICAgICAgYXdhaXQgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24ubG9hZFJhbmdlKFxuICAgICAgICAgICAgICBuZXh0T2Zmc2V0LFxuICAgICAgICAgICAgICBjb25maWcucGFnaW5hdGlvbj8ubGltaXQgfHwgMjAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0sXG5cbiAgICAgIGlzTG9hZGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGlzTG9hZGluZztcbiAgICAgIH0sXG5cbiAgICAgIGhhc05leHQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBjb25zdCB0b3RhbCA9IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldFRvdGFsSXRlbXMoKTtcbiAgICAgICAgICBjb25zdCBpdGVtcyA9IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldEl0ZW1zKCk7XG4gICAgICAgICAgcmV0dXJuIGl0ZW1zLmxlbmd0aCA8IHRvdGFsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIE5vdGU6IFNlbGVjdGlvbiBvcGVyYXRpb25zIGFyZSBoYW5kbGVkIGJ5IHRoZSB3aXRoU2VsZWN0aW9uIGZlYXR1cmVcbiAgICAgIC8vIFRoZXNlIGFyZSBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGJ1dCBkZWxlZ2F0ZSB0byBzZWxlY3Rpb24gZmVhdHVyZSBpZiBhdmFpbGFibGVcbiAgICAgIGdldFNlbGVjdGVkSWRzKCk6IChzdHJpbmcgfCBudW1iZXIpW10ge1xuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5nZXRTZWxlY3RlZEluZGljZXMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIFVzZSBzZWxlY3Rpb24gZmVhdHVyZSBpZiBhdmFpbGFibGVcbiAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICAgICAgICBjb25zdCBpbmRpY2VzID0gY29tcG9uZW50LmdldFNlbGVjdGVkSW5kaWNlcygpO1xuICAgICAgICAgIHJldHVybiBpbmRpY2VzLm1hcCgoaWR4OiBudW1iZXIpID0+IChpdGVtc1tpZHhdIGFzIGFueSk/LmlkIHx8IGlkeCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmFsbGJhY2sgdG8gbG9jYWwgdHJhY2tpbmdcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oc2VsZWN0ZWRJZHMpO1xuICAgICAgfSxcblxuICAgICAgc2VsZWN0SXRlbShpZDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LnNlbGVjdEl0ZW1zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAvLyBVc2Ugc2VsZWN0aW9uIGZlYXR1cmUgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBpdGVtcy5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4gaXRlbS5pZCA9PT0gaWQpO1xuICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuc2VsZWN0SXRlbXMoW2luZGV4XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIGxvY2FsIHRyYWNraW5nXG4gICAgICAgICAgc2VsZWN0ZWRJZHMuYWRkKGlkKTtcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwic2VsZWN0aW9uOmNoYW5nZVwiLCB7XG4gICAgICAgICAgICBzZWxlY3RlZDogdGhpcy5nZXRTZWxlY3RlZElkcygpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBkZXNlbGVjdEl0ZW0oaWQ6IHN0cmluZyB8IG51bWJlcikge1xuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5kZXNlbGVjdEl0ZW1zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAvLyBVc2Ugc2VsZWN0aW9uIGZlYXR1cmUgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBpdGVtcy5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4gaXRlbS5pZCA9PT0gaWQpO1xuICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuZGVzZWxlY3RJdGVtcyhbaW5kZXhdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gbG9jYWwgdHJhY2tpbmdcbiAgICAgICAgICBzZWxlY3RlZElkcy5kZWxldGUoaWQpO1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJzZWxlY3Rpb246Y2hhbmdlXCIsIHtcbiAgICAgICAgICAgIHNlbGVjdGVkOiB0aGlzLmdldFNlbGVjdGVkSWRzKCksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGNsZWFyU2VsZWN0aW9uKCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5jbGVhclNlbGVjdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gVXNlIHNlbGVjdGlvbiBmZWF0dXJlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIGNvbXBvbmVudC5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIGxvY2FsIHRyYWNraW5nXG4gICAgICAgICAgc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwic2VsZWN0aW9uOmNoYW5nZVwiLCB7IHNlbGVjdGVkOiBbXSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLy8gU2Nyb2xsaW5nIG1ldGhvZHNcbiAgICAgIHNjcm9sbFRvSW5kZXg6IChcbiAgICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgICAgYWxpZ25tZW50OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiA9IFwic3RhcnRcIixcbiAgICAgICAgYW5pbWF0ZT86IGJvb2xlYW4sXG4gICAgICApID0+IHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb0luZGV4KGluZGV4LCBhbGlnbm1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIHRvIGluZGV4IGFuZCBzZWxlY3QgaXRlbSBhZnRlciBkYXRhIGxvYWRzXG4gICAgICAgKiBVc2VmdWwgZm9yIHJ1bnRpbWUgc2Nyb2xsK3NlbGVjdCB3aGVuIFZMaXN0IGlzIGFscmVhZHkgY3JlYXRlZFxuICAgICAgICovXG4gICAgICBzY3JvbGxUb0luZGV4QW5kU2VsZWN0OiBhc3luYyBmdW5jdGlvbiAoXG4gICAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICAgIHNlbGVjdElkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgICAgIGFsaWdubWVudDogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIsXG4gICAgICApIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb0luZGV4KGluZGV4LCBhbGlnbm1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTGlzdGVuIGZvciByYW5nZSBsb2FkIHRvIGNvbXBsZXRlLCB0aGVuIHNlbGVjdFxuICAgICAgICBjb25zdCBvblJhbmdlTG9hZGVkID0gKCkgPT4ge1xuICAgICAgICAgIGNvbXBvbmVudC5vZmY/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBvblJhbmdlTG9hZGVkKTtcbiAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5zZWxlY3RCeUlkKSB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudC5zZWxlY3RCeUlkKHNlbGVjdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBvblJhbmdlTG9hZGVkKTtcblxuICAgICAgICAvLyBGYWxsYmFjayB0aW1lb3V0IGluIGNhc2UgZXZlbnQgZG9lc24ndCBmaXJlIChkYXRhIGFscmVhZHkgbG9hZGVkKVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb21wb25lbnQub2ZmPy4oXCJ2aWV3cG9ydDpyYW5nZS1sb2FkZWRcIiwgb25SYW5nZUxvYWRlZCk7XG4gICAgICAgICAgaWYgKGNvbXBvbmVudC5zZWxlY3RCeUlkKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuc2VsZWN0QnlJZChzZWxlY3RJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAzMDApO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0sXG5cbiAgICAgIHNjcm9sbFRvSXRlbTogYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgICBpdGVtSWQ6IHN0cmluZyxcbiAgICAgICAgYWxpZ25tZW50OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiA9IFwic3RhcnRcIixcbiAgICAgICAgYW5pbWF0ZT86IGJvb2xlYW4sXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gaXRlbXMuZmluZEluZGV4KFxuICAgICAgICAgIChpdGVtOiBhbnkpID0+IFN0cmluZyhpdGVtLmlkKSA9PT0gU3RyaW5nKGl0ZW1JZCksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxUb0luZGV4KGluZGV4LCBhbGlnbm1lbnQsIGFuaW1hdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS53YXJuKGBJdGVtICR7aXRlbUlkfSBub3QgZm91bmRgKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfSxcblxuICAgICAgc2Nyb2xsVG9Ub3A6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsVG9JbmRleCgwLCBcInN0YXJ0XCIpO1xuICAgICAgfSxcblxuICAgICAgc2Nyb2xsVG9Cb3R0b206IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9IHRoaXMuZ2V0SXRlbUNvdW50KCk7XG4gICAgICAgIGlmICh0b3RhbEl0ZW1zID4gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNjcm9sbFRvSW5kZXgodG90YWxJdGVtcyAtIDEsIFwiZW5kXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0sXG5cbiAgICAgIHNjcm9sbFRvUGFnZTogYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgICBwYWdlTnVtOiBudW1iZXIsXG4gICAgICAgIGFsaWdubWVudDogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIsXG4gICAgICAgIGFuaW1hdGU/OiBib29sZWFuLFxuICAgICAgKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBbVkxpc3RdIHNjcm9sbFRvUGFnZSgke3BhZ2VOdW19KWApO1xuXG4gICAgICAgIC8vIEdldCBsaW1pdCBmcm9tIGNvbmZpZyAocmFuZ2VTaXplKSBvciBkZWZhdWx0XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gY29uZmlnLnBhZ2luYXRpb24/LmxpbWl0IHx8IDIwO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGN1cnNvciBtb2RlXG4gICAgICAgIGlmIChjb25maWcucGFnaW5hdGlvbj8uc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIpIHtcbiAgICAgICAgICAvLyBJbiBjdXJzb3IgbW9kZSwgd2UgbmVlZCB0byBoYW5kbGUgc2VxdWVudGlhbCBsb2FkaW5nXG4gICAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KT8uY29sbGVjdGlvbjtcbiAgICAgICAgICBpZiAoY29sbGVjdGlvbikge1xuICAgICAgICAgICAgY29uc3QgbG9hZGVkUmFuZ2VzID0gY29sbGVjdGlvbi5nZXRMb2FkZWRSYW5nZXMoKTtcbiAgICAgICAgICAgIGNvbnN0IGhpZ2hlc3RMb2FkZWRQYWdlID0gbG9hZGVkUmFuZ2VzLnNpemU7XG5cbiAgICAgICAgICAgIGlmIChwYWdlTnVtID4gaGlnaGVzdExvYWRlZFBhZ2UgKyAxKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICBgW1ZMaXN0XSBDYW5ub3QganVtcCB0byBwYWdlICR7cGFnZU51bX0gaW4gY3Vyc29yIG1vZGUuIGAgK1xuICAgICAgICAgICAgICAgICAgYExvYWRpbmcgcGFnZXMgc2VxdWVudGlhbGx5IGZyb20gJHtcbiAgICAgICAgICAgICAgICAgICAgaGlnaGVzdExvYWRlZFBhZ2UgKyAxXG4gICAgICAgICAgICAgICAgICB9IHRvICR7cGFnZU51bX1gLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzZSB2aWV3cG9ydCdzIHNjcm9sbFRvUGFnZSBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KT8uc2Nyb2xsVG9QYWdlKSB7XG4gICAgICAgICAgKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnNjcm9sbFRvUGFnZShwYWdlTnVtLCBsaW1pdCwgYWxpZ25tZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBzY3JvbGxUb0luZGV4XG4gICAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSAocGFnZU51bSAtIDEpICogbGltaXQ7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxUb0luZGV4KHRhcmdldEluZGV4LCBhbGlnbm1lbnQpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBnZXRTY3JvbGxQb3NpdGlvbjogKCkgPT4ge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LnZpZXdwb3J0Py5nZXRTY3JvbGxQb3NpdGlvbigpIHx8IDA7XG4gICAgICB9LFxuXG4gICAgICBnZXRDdXJyZW50Q3Vyc29yOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSk/LmNvbGxlY3Rpb247XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uPy5nZXRDdXJyZW50Q3Vyc29yPy4oKSB8fCBudWxsO1xuICAgICAgfSxcblxuICAgICAgc2V0U2Nyb2xsQW5pbWF0aW9uKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgLy8gU3RvcmUgYW5pbWF0aW9uIHByZWZlcmVuY2UgKHdvdWxkIGJlIHVzZWQgYnkgdmlld3BvcnQgc2Nyb2xsaW5nIGZlYXR1cmUpXG4gICAgICAgIGNvbXBvbmVudC5zY3JvbGxBbmltYXRpb24gPSBlbmFibGVkO1xuICAgICAgfSxcblxuICAgICAgLy8gU3RhdGVcbiAgICAgIGdldFN0YXRlKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGl0ZW1zOiB0aGlzLmdldEl0ZW1zKCksXG4gICAgICAgICAgdG90YWxJdGVtczogY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uXG4gICAgICAgICAgICA/IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldFRvdGFsSXRlbXMoKVxuICAgICAgICAgICAgOiBjb21wb25lbnQudG90YWxJdGVtcyB8fCAwLFxuICAgICAgICAgIHZpc2libGVSYW5nZTogY29tcG9uZW50LnZpZXdwb3J0Py5nZXRWaXNpYmxlUmFuZ2UoKSB8fCB7XG4gICAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICAgIGVuZDogMCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uOiBjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMCxcbiAgICAgICAgICBzZWxlY3RlZElkczogdGhpcy5nZXRTZWxlY3RlZElkcygpLFxuICAgICAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmcoKSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIExpZmVjeWNsZVxuICAgICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uZGVzdHJveSkge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImRlc3Ryb3llZFwiKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn07XG4iLAogICAgIi8qKlxuICogbXRybC1hZGRvbnMgTGlzdCBDb21wb25lbnQgQ29uc3RhbnRzXG4gKlxuICogQ29uc3RhbnRzIGZvciB0aGUgYWRkb25zIGxpc3QgY29tcG9uZW50LlxuICogTm90ZTogQmFzZSBtdHJsIGxpc3QgZnVuY3Rpb25hbGl0eSBpcyBoYW5kbGVkIGJ5IG10cmwgY29yZS5cbiAqIFRoZXNlIGNvbnN0YW50cyBhcmUgZm9yIGFkZG9ucy1zcGVjaWZpYyBmZWF0dXJlcyBvbmx5LlxuICovXG5cbi8qKlxuICogQ1NTIGNsYXNzIG5hbWVzIGZvciBWTGlzdCBjb21wb25lbnRcbiAqIEZvbGxvd2luZyBCRU0gY29udmVudGlvbjogY29tcG9uZW50X19lbGVtZW50LS1tb2RpZmllclxuICogTm90ZTogbXRybCBwcmVmaXggaXMgYWRkZWQgYXV0b21hdGljYWxseSBieSBjb3JlIERPTSBjbGFzc2VzIHN5c3RlbVxuICovXG5leHBvcnQgY29uc3QgVkxJU1RfQ0xBU1NFUyA9IHtcbiAgLyoqIExpc3QgZWxlbWVudCAqL1xuICBMSVNUOiBcInZsaXN0XCIsXG4gIC8qKiBMaXN0IGl0ZW0gKi9cbiAgSVRFTTogXCJ2aWV3cG9ydC1pdGVtXCIsXG4gIC8qKiBTZWxlY3RlZCBsaXN0IGl0ZW0gKi9cbiAgU0VMRUNURUQ6IFwidmlld3BvcnQtaXRlbS0tc2VsZWN0ZWRcIixcbiAgLyoqIEVtcHR5IHN0YXRlICovXG4gIEVNUFRZOiBcInZsaXN0LS1lbXB0eVwiLFxuICAvKiogU2Nyb2xsZWQgc3RhdGUgLSBsaXN0IGlzIG5vdCBhdCB0aGUgdG9wICovXG4gIFNDUk9MTEVEOiBcInZsaXN0LS1zY3JvbGxlZFwiLFxufSBhcyBjb25zdDtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvdmxpc3QvZmVhdHVyZXMvc2VsZWN0aW9uLnRzXG5cbmltcG9ydCB0eXBlIHsgVkxpc3RDb25maWcsIFZMaXN0Q29tcG9uZW50LCBWTGlzdEl0ZW0gfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZMSVNUX0NMQVNTRVMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBQUkVGSVgsIGFkZENsYXNzLCByZW1vdmVDbGFzcyB9IGZyb20gXCJtdHJsXCI7XG5cbi8qKlxuICogU2VsZWN0aW9uIHN0YXRlIGludGVyZmFjZVxuICovXG5pbnRlcmZhY2UgU2VsZWN0aW9uU3RhdGUge1xuICBzZWxlY3RlZElkczogU2V0PHN0cmluZyB8IG51bWJlcj47XG4gIG1vZGU6IFwibm9uZVwiIHwgXCJzaW5nbGVcIiB8IFwibXVsdGlwbGVcIjtcbiAgbGFzdFNlbGVjdGVkSW5kZXg/OiBudW1iZXI7XG59XG5cbi8qKlxuICogR2V0IGl0ZW0gSUQgZnJvbSBlbGVtZW50IG9yIGl0ZW0gZGF0YVxuICovXG5jb25zdCBnZXRJdGVtSWQgPSAoaXRlbTogYW55KTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKGl0ZW0/LmlkICE9PSB1bmRlZmluZWQpIHJldHVybiBpdGVtLmlkO1xuICBpZiAoaXRlbT8uX2lkICE9PSB1bmRlZmluZWQpIHJldHVybiBpdGVtLl9pZDtcbiAgaWYgKHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBpdGVtID09PSBcIm51bWJlclwiKSByZXR1cm4gaXRlbTtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogQWRkcyBzZWxlY3Rpb24gbWFuYWdlbWVudCBjYXBhYmlsaXRpZXMgdG8gVkxpc3QgY29tcG9uZW50XG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoU2VsZWN0aW9uID0gPFQgZXh0ZW5kcyBWTGlzdEl0ZW0gPSBWTGlzdEl0ZW0+KFxuICBjb25maWc6IFZMaXN0Q29uZmlnPFQ+LFxuKSA9PiB7XG4gIHJldHVybiAoY29tcG9uZW50OiBWTGlzdENvbXBvbmVudDxUPik6IFZMaXN0Q29tcG9uZW50PFQ+ID0+IHtcbiAgICBpZiAoIWNvbmZpZy5zZWxlY3Rpb24/LmVuYWJsZWQgfHwgY29uZmlnLnNlbGVjdGlvbj8ubW9kZSA9PT0gXCJub25lXCIpIHtcbiAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdGU6IFNlbGVjdGlvblN0YXRlID0ge1xuICAgICAgc2VsZWN0ZWRJZHM6IG5ldyBTZXQoKSxcbiAgICAgIG1vZGU6IGNvbmZpZy5zZWxlY3Rpb24/Lm1vZGUgfHwgXCJzaW5nbGVcIixcbiAgICAgIGxhc3RTZWxlY3RlZEluZGV4OiB1bmRlZmluZWQsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlcXVpcmVNb2RpZmllcnMgPSBjb25maWcuc2VsZWN0aW9uPy5yZXF1aXJlTW9kaWZpZXJzID8/IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQXBwbHkgc2VsZWN0aW9uIGNsYXNzIHRvIHJlbmRlcmVkIGVsZW1lbnRzIG1hdGNoaW5nIHNlbGVjdGVkIElEc1xuICAgICAqL1xuICAgIGNvbnN0IGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cyA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGNvbXBvbmVudC5lbGVtZW50Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBgLiR7UFJFRklYfS12aWV3cG9ydC1pdGVtc2AsXG4gICAgICApO1xuICAgICAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICAgICAgY29uc3QgaXRlbXMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgYC4ke1BSRUZJWH0tdmlld3BvcnQtaXRlbVtkYXRhLWlkXWAsXG4gICAgICApO1xuXG4gICAgICBpdGVtcy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gZWwgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGlkID0gZWxlbWVudC5kYXRhc2V0LmlkO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIENoZWNrIGJvdGggc3RyaW5nIGFuZCBudW1iZXIgdmVyc2lvbnMgb2YgdGhlIElEXG4gICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaWQpIHx8IHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhOdW1iZXIoaWQpKTtcbiAgICAgICAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgVkxJU1RfQ0xBU1NFUy5TRUxFQ1RFRCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIFZMSVNUX0NMQVNTRVMuU0VMRUNURUQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBpdGVtIGNsaWNrIGZvciBzZWxlY3Rpb25cbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVJdGVtQ2xpY2sgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgY29uc3Qgdmlld3BvcnRJdGVtID0gKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFxuICAgICAgICBgLiR7UFJFRklYfS12aWV3cG9ydC1pdGVtW2RhdGEtaW5kZXhdYCxcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBpZiAoIXZpZXdwb3J0SXRlbSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KHZpZXdwb3J0SXRlbS5kYXRhc2V0LmluZGV4IHx8IFwiLTFcIik7XG4gICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGVuaGFuY2VkQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIGFueTtcbiAgICAgIGNvbnN0IGl0ZW1zID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0SXRlbXM/LigpO1xuICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zPy5baW5kZXhdO1xuICAgICAgaWYgKCFpdGVtKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldEl0ZW1JZChpdGVtKTtcbiAgICAgIGlmIChpdGVtSWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB3YXNTZWxlY3RlZCA9IHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhpdGVtSWQpO1xuXG4gICAgICBpZiAoc3RhdGUubW9kZSA9PT0gXCJzaW5nbGVcIikge1xuICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICBpZiAoIXdhc1NlbGVjdGVkKSB7XG4gICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKGl0ZW1JZCk7XG4gICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPSBpbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5tb2RlID09PSBcIm11bHRpcGxlXCIpIHtcbiAgICAgICAgaWYgKGUuc2hpZnRLZXkgJiYgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5taW4oc3RhdGUubGFzdFNlbGVjdGVkSW5kZXgsIGluZGV4KTtcbiAgICAgICAgICBjb25zdCBlbmQgPSBNYXRoLm1heChzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCwgaW5kZXgpO1xuXG4gICAgICAgICAgaWYgKCFlLmN0cmxLZXkgJiYgIWUubWV0YUtleSkge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlSXRlbSA9IGl0ZW1zPy5baV07XG4gICAgICAgICAgICBjb25zdCByYW5nZUl0ZW1JZCA9IGdldEl0ZW1JZChyYW5nZUl0ZW0pO1xuICAgICAgICAgICAgaWYgKHJhbmdlSXRlbUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKHJhbmdlSXRlbUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZS5jdHJsS2V5IHx8IGUubWV0YUtleSkge1xuICAgICAgICAgIGlmICh3YXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuZGVsZXRlKGl0ZW1JZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmFkZChpdGVtSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IGluZGV4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChyZXF1aXJlTW9kaWZpZXJzKSB7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKGl0ZW1JZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh3YXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5kZWxldGUoaXRlbUlkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmFkZChpdGVtSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cygpO1xuICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBFbWl0IHNlbGVjdGlvbiBjaGFuZ2UgZXZlbnRcbiAgICAgKi9cbiAgICBjb25zdCBlbWl0U2VsZWN0aW9uQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgY29uc3QgaXRlbXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRJdGVtcz8uKCkgfHwgW107XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSBpdGVtcy5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IGdldEl0ZW1JZChpdGVtKTtcbiAgICAgICAgcmV0dXJuIGlkICE9PSB1bmRlZmluZWQgJiYgc3RhdGUuc2VsZWN0ZWRJZHMuaGFzKGlkKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSBpdGVtcy5yZWR1Y2UoXG4gICAgICAgIChhY2M6IG51bWJlcltdLCBpdGVtOiBhbnksIGlkeDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWQgPSBnZXRJdGVtSWQoaXRlbSk7XG4gICAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQgJiYgc3RhdGUuc2VsZWN0ZWRJZHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgYWNjLnB1c2goaWR4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSxcbiAgICAgICAgW10gYXMgbnVtYmVyW10sXG4gICAgICApO1xuXG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwic2VsZWN0aW9uOmNoYW5nZVwiLCB7IHNlbGVjdGVkSXRlbXMsIHNlbGVjdGVkSW5kaWNlcyB9KTtcblxuICAgICAgaWYgKGNvbmZpZy5zZWxlY3Rpb24/Lm9uU2VsZWN0aW9uQ2hhbmdlKSB7XG4gICAgICAgIGNvbmZpZy5zZWxlY3Rpb24ub25TZWxlY3Rpb25DaGFuZ2Uoc2VsZWN0ZWRJdGVtcywgc2VsZWN0ZWRJbmRpY2VzKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gU2V0dXA6IGxpc3RlbiBmb3IgcmVuZGVycyBhbmQgY2xpY2tzXG4gICAgY29uc3Qgc2V0dXAgPSAoKSA9PiB7XG4gICAgICAvLyBBZGQgbW9kZSBjbGFzcyB0byBjb250YWluZXJcbiAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICBhZGRDbGFzcyhjb21wb25lbnQuZWxlbWVudCwgXCJ2bGlzdC0tc2VsZWN0aW9uXCIpO1xuICAgICAgICBhZGRDbGFzcyhjb21wb25lbnQuZWxlbWVudCwgYHZsaXN0LS1zZWxlY3Rpb24tJHtzdGF0ZS5tb2RlfWApO1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlSXRlbUNsaWNrLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgc2VsZWN0aW9uIGFmdGVyIGVhY2ggcmVuZGVyXG4gICAgICAoY29tcG9uZW50IGFzIGFueSkub24/LihcbiAgICAgICAgXCJ2aWV3cG9ydDppdGVtcy1yZW5kZXJlZFwiLFxuICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMsXG4gICAgICApO1xuICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLm9uPy4oXCJ2aWV3cG9ydDpyZW5kZXJlZFwiLCBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMpO1xuXG4gICAgICAvLyBDbGVhbiB1cCBzZWxlY3Rpb24gd2hlbiBpdGVtIGlzIHJlbW92ZWRcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5vbj8uKFxuICAgICAgICBcIml0ZW06cmVtb3ZlZFwiLFxuICAgICAgICAoZGF0YTogeyBpdGVtOiBhbnk7IGluZGV4OiBudW1iZXIgfSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldEl0ZW1JZChkYXRhLml0ZW0pO1xuICAgICAgICAgIGlmIChpdGVtSWQgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaXRlbUlkKSkge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuZGVsZXRlKGl0ZW1JZCk7XG4gICAgICAgICAgICAvLyBJZiB0aGUgcmVtb3ZlZCBpdGVtIHdhcyB0aGUgbGFzdCBzZWxlY3RlZCBpbmRleCwgY2xlYXIgaXRcbiAgICAgICAgICAgIGlmIChzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9PT0gZGF0YS5pbmRleCkge1xuICAgICAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPiBkYXRhLmluZGV4XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gQWRqdXN0IGxhc3RTZWxlY3RlZEluZGV4IHNpbmNlIGl0ZW1zIHNoaWZ0ZWQgZG93blxuICAgICAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleC0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgYWZ0ZXIgY29tcG9uZW50IGlzIHJlYWR5XG4gICAgc2V0VGltZW91dChzZXR1cCwgMCk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIGluaXRpYWwgbG9hZCBjb21wbGV0ZSB0byBhdXRvLXNlbGVjdCBpdGVtXG4gICAgLy8gVGhpcyBtdXN0IGJlIGluIHdpdGhTZWxlY3Rpb24gYmVjYXVzZSBzZWxlY3RCeUlkIGlzIGRlZmluZWQgaGVyZVxuICAgIChjb21wb25lbnQgYXMgYW55KS5vbj8uKFxuICAgICAgXCJjb2xsZWN0aW9uOmluaXRpYWwtbG9hZC1jb21wbGV0ZVwiLFxuICAgICAgKGRhdGE6IHsgc2VsZWN0SWQ6IHN0cmluZyB8IG51bWJlciB9KSA9PiB7XG4gICAgICAgIGlmIChkYXRhPy5zZWxlY3RJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gVXNlIHJlcXVlc3RBbmltYXRpb25GcmFtZSB0byBlbnN1cmUgcmVuZGVyaW5nIGlzIGNvbXBsZXRlXG4gICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBcInNpbmdsZVwiKSB7XG4gICAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5hZGQoZGF0YS5zZWxlY3RJZCk7XG4gICAgICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMoKTtcbiAgICAgICAgICAgIGVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gQ2xlYW51cCBvbiBkZXN0cm95XG4gICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmRlc3Ryb3k7XG4gICAgY29tcG9uZW50LmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICBjb21wb25lbnQuZWxlbWVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUl0ZW1DbGljaywgdHJ1ZSk7XG4gICAgICBvcmlnaW5hbERlc3Ryb3k/LigpO1xuICAgIH07XG5cbiAgICAvLyBFbmhhbmNlZCBjb21wb25lbnQgd2l0aCBzZWxlY3Rpb24gQVBJXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgc2VsZWN0SXRlbXMoaW5kaWNlczogbnVtYmVyW10pIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSAodGhpcyBhcyBhbnkpLmdldEl0ZW1zPy4oKTtcbiAgICAgICAgaWYgKCFpdGVtcykgcmV0dXJuO1xuXG4gICAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBcInNpbmdsZVwiKSB7XG4gICAgICAgICAgLy8gSW4gc2luZ2xlIG1vZGUsIGNsZWFyIHByZXZpb3VzIHNlbGVjdGlvbiBiZWZvcmUgYWRkaW5nIG5ldyBvbmVcbiAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICAgIGlmIChpbmRpY2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGluZGljZXMgPSBbaW5kaWNlc1swXV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaW5kaWNlcy5mb3JFYWNoKChpbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldEl0ZW1JZChpdGVtc1tpbmRleF0pO1xuICAgICAgICAgIGlmIChpdGVtSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKGl0ZW1JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaW5kaWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPSBpbmRpY2VzW2luZGljZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIH1cblxuICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMoKTtcbiAgICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgfSxcblxuICAgICAgZGVzZWxlY3RJdGVtcyhpbmRpY2VzOiBudW1iZXJbXSkge1xuICAgICAgICBjb25zdCBpdGVtcyA9ICh0aGlzIGFzIGFueSkuZ2V0SXRlbXM/LigpO1xuICAgICAgICBpZiAoIWl0ZW1zKSByZXR1cm47XG5cbiAgICAgICAgaW5kaWNlcy5mb3JFYWNoKChpbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldEl0ZW1JZChpdGVtc1tpbmRleF0pO1xuICAgICAgICAgIGlmIChpdGVtSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuZGVsZXRlKGl0ZW1JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMoKTtcbiAgICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgfSxcblxuICAgICAgY2xlYXJTZWxlY3Rpb24oKSB7XG4gICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ID0gdW5kZWZpbmVkO1xuICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMoKTtcbiAgICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgfSxcblxuICAgICAgZ2V0U2VsZWN0ZWRJdGVtcygpOiBUW10ge1xuICAgICAgICBjb25zdCBpdGVtcyA9ICh0aGlzIGFzIGFueSkuZ2V0SXRlbXM/LigpIHx8IFtdO1xuICAgICAgICByZXR1cm4gaXRlbXMuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBpZCA9IGdldEl0ZW1JZChpdGVtKTtcbiAgICAgICAgICByZXR1cm4gaWQgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaWQpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIGdldFNlbGVjdGVkSW5kaWNlcygpOiBudW1iZXJbXSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gKHRoaXMgYXMgYW55KS5nZXRJdGVtcz8uKCkgfHwgW107XG4gICAgICAgIHJldHVybiBpdGVtcy5yZWR1Y2UoKGFjYzogbnVtYmVyW10sIGl0ZW06IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkID0gZ2V0SXRlbUlkKGl0ZW0pO1xuICAgICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwgW10gYXMgbnVtYmVyW10pO1xuICAgICAgfSxcblxuICAgICAgaXNTZWxlY3RlZChpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gKHRoaXMgYXMgYW55KS5nZXRJdGVtcz8uKCk7XG4gICAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldEl0ZW1JZChpdGVtcz8uW2luZGV4XSk7XG4gICAgICAgIHJldHVybiBpdGVtSWQgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaXRlbUlkKTtcbiAgICAgIH0sXG5cbiAgICAgIHNlbGVjdEJ5SWQoaWQ6IHN0cmluZyB8IG51bWJlciwgc2lsZW50OiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAoc3RhdGUubW9kZSA9PT0gXCJzaW5nbGVcIikge1xuICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5hZGQoaWQpO1xuICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMoKTtcbiAgICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgICBlbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENoZWNrIGlmIGFuIGl0ZW0gYXQgaW5kZXggaXMgZnVsbHkgdmlzaWJsZSBpbiB0aGUgdmlld3BvcnRcbiAgICAgICAqIFVzZXMgRE9NIGVsZW1lbnQgcG9zaXRpb24gZm9yIHByZWNpc2UgY2hlY2tpbmdcbiAgICAgICAqL1xuICAgICAgaXNJdGVtRnVsbHlWaXNpYmxlKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gY29tcG9uZW50LmVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgYC4ke1BSRUZJWH0tdmlld3BvcnQtaXRlbXNgLFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0ID0gY29tcG9uZW50LmVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgYC4ke1BSRUZJWH0tdmlld3BvcnRgLFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXZpZXdwb3J0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgaXRlbUVsZW1lbnQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBgLiR7UFJFRklYfS12aWV3cG9ydC1pdGVtW2RhdGEtaW5kZXg9XCIke2luZGV4fVwiXWAsXG4gICAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghaXRlbUVsZW1lbnQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCB2aWV3cG9ydFJlY3QgPSB2aWV3cG9ydC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgaXRlbVJlY3QgPSBpdGVtRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBpdGVtIGlzIGZ1bGx5IHdpdGhpbiB2aWV3cG9ydCBib3VuZHNcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBpdGVtUmVjdC50b3AgPj0gdmlld3BvcnRSZWN0LnRvcCAmJlxuICAgICAgICAgIGl0ZW1SZWN0LmJvdHRvbSA8PSB2aWV3cG9ydFJlY3QuYm90dG9tXG4gICAgICAgICk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNlbGVjdCBpdGVtIGF0IGluZGV4LCBzY3JvbGxpbmcgYW5kIHdhaXRpbmcgZm9yIGRhdGEgaWYgbmVlZGVkXG4gICAgICAgKiBIYW5kbGVzIHZpcnR1YWwgc2Nyb2xsaW5nIGJ5IGxvYWRpbmcgZGF0YSBiZWZvcmUgc2VsZWN0aW5nXG4gICAgICAgKiBVc2VzIHByZWNpc2UgRE9NLWJhc2VkIHZpc2liaWxpdHkgY2hlY2tcbiAgICAgICAqL1xuICAgICAgYXN5bmMgc2VsZWN0QXRJbmRleChpbmRleDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGVuaGFuY2VkQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIGFueTtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcblxuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgY3VycmVudCBzZWxlY3Rpb24gdG8gZGV0ZXJtaW5lIG5hdmlnYXRpb24gZGlyZWN0aW9uXG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRpY2VzID0gdGhpcy5nZXRTZWxlY3RlZEluZGljZXMoKTtcbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gY3VycmVudEluZGljZXMubGVuZ3RoID4gMCA/IGN1cnJlbnRJbmRpY2VzWzBdIDogLTE7XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGluZGV4ID4gY3VycmVudEluZGV4ID8gXCJkb3duXCIgOiBcInVwXCI7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgaXRlbSBpcyBmdWxseSB2aXNpYmxlIHVzaW5nIHByZWNpc2UgRE9NIGNoZWNrXG4gICAgICAgIGNvbnN0IGlzRnVsbHlWaXNpYmxlID0gdGhpcy5pc0l0ZW1GdWxseVZpc2libGUoaW5kZXgpO1xuXG4gICAgICAgIGlmICghaXNGdWxseVZpc2libGUgJiYgZW5oYW5jZWRDb21wb25lbnQudmlld3BvcnQ/LnNjcm9sbFRvSW5kZXgpIHtcbiAgICAgICAgICAvLyBTY3JvbGwgd2l0aCBhbGlnbm1lbnQgYmFzZWQgb24gbmF2aWdhdGlvbiBkaXJlY3Rpb25cbiAgICAgICAgICAvLyBEb3duIG5hdmlnYXRpb246IGFsaWduIHRvIGVuZCAoaXRlbSBhdCBib3R0b20pXG4gICAgICAgICAgLy8gVXAgbmF2aWdhdGlvbjogYWxpZ24gdG8gc3RhcnQgKGl0ZW0gYXQgdG9wKVxuICAgICAgICAgIGNvbnN0IGFsaWdubWVudCA9IGRpcmVjdGlvbiA9PT0gXCJkb3duXCIgPyBcImVuZFwiIDogXCJzdGFydFwiO1xuICAgICAgICAgIGVuaGFuY2VkQ29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbFRvSW5kZXgoaW5kZXgsIGFsaWdubWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcnkgdG8gc2VsZWN0IGltbWVkaWF0ZWx5IC0gd29ya3MgaWYgaXRlbSBpcyBhbHJlYWR5IGxvYWRlZFxuICAgICAgICBjb25zdCBpdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1zPy4oKSB8fCBbXTtcbiAgICAgICAgaWYgKGl0ZW1zW2luZGV4XSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbXMoW2luZGV4XSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJdGVtIG5vdCBsb2FkZWQgeWV0IC0gd2FpdCBmb3IgZGF0YSB0byBsb2FkIHRoZW4gc2VsZWN0XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIGxldCByZXNvbHZlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgY29uc3Qgb25SYW5nZUxvYWRlZCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuO1xuICAgICAgICAgICAgcmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgICAgY29tcG9uZW50Lm9mZj8uKFwidmlld3BvcnQ6cmFuZ2UtbG9hZGVkXCIsIG9uUmFuZ2VMb2FkZWQpO1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtcyhbaW5kZXhdKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBvblJhbmdlTG9hZGVkKTtcblxuICAgICAgICAgIC8vIEZhbGxiYWNrIHRpbWVvdXQgaW4gY2FzZSBldmVudCBkb2Vzbid0IGZpcmUgKGRhdGEgYWxyZWFkeSBsb2FkZWQpXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybjtcbiAgICAgICAgICAgIHJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5vZmY/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBvblJhbmdlTG9hZGVkKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbXMoW2luZGV4XSk7XG4gICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZWxlY3QgbmV4dCBpdGVtIHJlbGF0aXZlIHRvIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAgICAgKiBIYW5kbGVzIHZpcnR1YWwgc2Nyb2xsaW5nIGJ5IGxvYWRpbmcgZGF0YSBiZWZvcmUgc2VsZWN0aW5nXG4gICAgICAgKiBSZXNwZWN0cyBrZXlib2FyZC53cmFwIG9wdGlvbiBmb3Igd3JhcHBpbmcgYXQgbGlzdCBib3VuZGFyaWVzXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIHNlbGVjdE5leHQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGVuaGFuY2VkQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIGFueTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJbmRpY2VzID0gdGhpcy5nZXRTZWxlY3RlZEluZGljZXMoKTtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcbiAgICAgICAgY29uc3Qgd3JhcCA9IGNvbmZpZy5rZXlib2FyZD8ud3JhcCA/PyB0cnVlOyAvLyBNRDMgZGVmYXVsdCBpcyB0cnVlXG5cbiAgICAgICAgaWYgKHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAvLyBTZWxlY3QgZmlyc3QgaXRlbVxuICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEF0SW5kZXgoMCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBzZWxlY3RlZEluZGljZXNbMF07XG4gICAgICAgIGNvbnN0IG5leHRJbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG5cbiAgICAgICAgaWYgKG5leHRJbmRleCA8IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBdEluZGV4KG5leHRJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBdCB0aGUgZW5kIC0gd3JhcCB0byBiZWdpbm5pbmcgaWYgZW5hYmxlZFxuICAgICAgICBpZiAod3JhcCAmJiB0b3RhbEl0ZW1zID4gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEF0SW5kZXgoMCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNlbGVjdCBwcmV2aW91cyBpdGVtIHJlbGF0aXZlIHRvIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAgICAgKiBIYW5kbGVzIHZpcnR1YWwgc2Nyb2xsaW5nIGJ5IGxvYWRpbmcgZGF0YSBiZWZvcmUgc2VsZWN0aW5nXG4gICAgICAgKiBSZXNwZWN0cyBrZXlib2FyZC53cmFwIG9wdGlvbiBmb3Igd3JhcHBpbmcgYXQgbGlzdCBib3VuZGFyaWVzXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIHNlbGVjdFByZXZpb3VzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBlbmhhbmNlZENvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBhbnk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSW5kaWNlcyA9IHRoaXMuZ2V0U2VsZWN0ZWRJbmRpY2VzKCk7XG4gICAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRJdGVtQ291bnQ/LigpIHx8IDA7XG4gICAgICAgIGNvbnN0IHdyYXAgPSBjb25maWcua2V5Ym9hcmQ/LndyYXAgPz8gdHJ1ZTsgLy8gTUQzIGRlZmF1bHQgaXMgdHJ1ZVxuXG4gICAgICAgIGlmIChzZWxlY3RlZEluZGljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgLy8gSWYgd3JhcCBlbmFibGVkLCBzZWxlY3QgbGFzdCBpdGVtOyBvdGhlcndpc2UgZG8gbm90aGluZ1xuICAgICAgICAgIGlmICh3cmFwICYmIHRvdGFsSXRlbXMgPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBdEluZGV4KHRvdGFsSXRlbXMgLSAxKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzWzBdO1xuICAgICAgICBjb25zdCBwcmV2SW5kZXggPSBjdXJyZW50SW5kZXggLSAxO1xuXG4gICAgICAgIGlmIChwcmV2SW5kZXggPj0gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEF0SW5kZXgocHJldkluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEF0IHRoZSBzdGFydCAtIHdyYXAgdG8gZW5kIGlmIGVuYWJsZWRcbiAgICAgICAgaWYgKHdyYXAgJiYgdG90YWxJdGVtcyA+IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBdEluZGV4KHRvdGFsSXRlbXMgLSAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhTZWxlY3Rpb247XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL2tleWJvYXJkLnRzXG5cbi8qKlxuICogS2V5Ym9hcmQgTmF2aWdhdGlvbiBGZWF0dXJlIGZvciBWTGlzdFxuICpcbiAqIEltcGxlbWVudHMgTWF0ZXJpYWwgRGVzaWduIDMgYWNjZXNzaWJpbGl0eSBndWlkZWxpbmVzIGZvciBsaXN0czpcbiAqIC0gQXJyb3cga2V5cyAoVXAvRG93bi9MZWZ0L1JpZ2h0KSBuYXZpZ2F0ZSBiZXR3ZWVuIGl0ZW1zIHdpdGggd3JhcHBpbmdcbiAqIC0gU3BhY2UvRW50ZXIgYWN0aXZhdGVzL3NlbGVjdHMgdGhlIGZvY3VzZWQgaXRlbVxuICogLSBUYWIgbW92ZXMgZm9jdXMgdG8vZnJvbSB0aGUgbGlzdFxuICogLSBIb21lL0VuZCBqdW1wIHRvIGZpcnN0L2xhc3QgaXRlbVxuICogLSBQYWdlIFVwL0Rvd24gc2tpcCBtdWx0aXBsZSBpdGVtc1xuICpcbiAqIEBzZWUgaHR0cHM6Ly9tMy5tYXRlcmlhbC5pby9jb21wb25lbnRzL2xpc3RzL2FjY2Vzc2liaWxpdHlcbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIFZMaXN0Q29uZmlnLFxuICBWTGlzdENvbXBvbmVudCxcbiAgVkxpc3RJdGVtLFxuICBMaXN0S2V5Ym9hcmRDb25maWcsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUFJFRklYLCBhZGRDbGFzcywgcmVtb3ZlQ2xhc3MgfSBmcm9tIFwibXRybFwiO1xuXG4vKipcbiAqIENsYXNzIG5hbWUgZm9yIGtleWJvYXJkIGZvY3VzIHN0eWxpbmdcbiAqL1xuY29uc3QgS0VZQk9BUkRfRk9DVVNfQ0xBU1MgPSBcIm10cmwtdmxpc3QtLWtleWJvYXJkLWZvY3VzXCI7XG5cbi8qKlxuICogQVJJQSByb2xlcyBhbmQgYXR0cmlidXRlcyBmb3IgYWNjZXNzaWJpbGl0eVxuICogRm9sbG93aW5nIE1EMyBXZWIgaW1wbGVtZW50YXRpb246XG4gKiAtIENvbnRhaW5lciByb2xlOiBsaXN0Ym94XG4gKiAtIExpc3QgaXRlbSByb2xlOiBvcHRpb25cbiAqIC0gU3RhdGU6IGFyaWEtc2VsZWN0ZWRcbiAqL1xuY29uc3QgQVJJQSA9IHtcbiAgUk9MRV9MSVNUQk9YOiBcImxpc3Rib3hcIixcbiAgUk9MRV9PUFRJT046IFwib3B0aW9uXCIsXG4gIEFSSUFfQUNUSVZFREVTQ0VOREFOVDogXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIixcbiAgQVJJQV9TRUxFQ1RFRDogXCJhcmlhLXNlbGVjdGVkXCIsXG4gIEFSSUFfTEFCRUw6IFwiYXJpYS1sYWJlbFwiLFxuICBBUklBX01VTFRJU0VMRUNUQUJMRTogXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLFxufTtcblxuLyoqXG4gKiBHZXQgdGhlIHZpZXdwb3J0IGl0ZW1zIGNvbnRhaW5lclxuICovXG5jb25zdCBnZXRJdGVtc0NvbnRhaW5lciA9IChcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsXG4pOiBIVE1MRWxlbWVudCB8IG51bGwgPT4ge1xuICByZXR1cm4gZWxlbWVudD8ucXVlcnlTZWxlY3RvcihgLiR7UFJFRklYfS12aWV3cG9ydC1pdGVtc2ApIHx8IG51bGw7XG59O1xuXG4vKipcbiAqIEdldCBhbGwgcmVuZGVyZWQgaXRlbSBlbGVtZW50c1xuICovXG5jb25zdCBnZXRSZW5kZXJlZEl0ZW1zID0gKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsKTogSFRNTEVsZW1lbnRbXSA9PiB7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm4gW107XG4gIHJldHVybiBBcnJheS5mcm9tKFxuICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKGAuJHtQUkVGSVh9LXZpZXdwb3J0LWl0ZW1bZGF0YS1pbmRleF1gKSxcbiAgKTtcbn07XG5cbi8qKlxuICogQWRkcyBrZXlib2FyZCBuYXZpZ2F0aW9uIGFuZCBhY2Nlc3NpYmlsaXR5IHRvIFZMaXN0IGNvbXBvbmVudFxuICovXG5leHBvcnQgY29uc3Qgd2l0aEtleWJvYXJkID0gPFQgZXh0ZW5kcyBWTGlzdEl0ZW0gPSBWTGlzdEl0ZW0+KFxuICBjb25maWc6IFZMaXN0Q29uZmlnPFQ+LFxuKSA9PiB7XG4gIHJldHVybiAoY29tcG9uZW50OiBWTGlzdENvbXBvbmVudDxUPik6IFZMaXN0Q29tcG9uZW50PFQ+ID0+IHtcbiAgICAvLyBPbmx5IGVuYWJsZSBrZXlib2FyZCBpZiBzZWxlY3Rpb24gaXMgZW5hYmxlZFxuICAgIGNvbnN0IHNlbGVjdGlvbkVuYWJsZWQgPVxuICAgICAgY29uZmlnLnNlbGVjdGlvbj8uZW5hYmxlZCAmJiBjb25maWcuc2VsZWN0aW9uPy5tb2RlICE9PSBcIm5vbmVcIjtcbiAgICBjb25zdCBrZXlib2FyZENvbmZpZyA9IGNvbmZpZy5rZXlib2FyZCB8fCB7fTtcbiAgICBjb25zdCBlbmFibGVkID0ga2V5Ym9hcmRDb25maWcuZW5hYmxlZCA/PyBzZWxlY3Rpb25FbmFibGVkO1xuXG4gICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIE1EMyBzcGVjaWZpZXMgdGhhdCBhcnJvdyBrZXlzIHNob3VsZCB3cmFwIGJ5IGRlZmF1bHRcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgaG9tZUVuZDoga2V5Ym9hcmRDb25maWcuaG9tZUVuZCA/PyB0cnVlLFxuICAgICAgcGFnZVVwRG93bjoga2V5Ym9hcmRDb25maWcucGFnZVVwRG93biA/PyB0cnVlLFxuICAgICAgcGFnZVNpemU6IGtleWJvYXJkQ29uZmlnLnBhZ2VTaXplID8/IDEwLFxuICAgICAgdHlwZUFoZWFkOiBrZXlib2FyZENvbmZpZy50eXBlQWhlYWQgPz8gZmFsc2UsXG4gICAgICB0eXBlQWhlYWRUaW1lb3V0OiBrZXlib2FyZENvbmZpZy50eXBlQWhlYWRUaW1lb3V0ID8/IDUwMCxcbiAgICAgIHdyYXA6IGtleWJvYXJkQ29uZmlnLndyYXAgPz8gdHJ1ZSwgLy8gTUQzOiB3cmFwcyB0byB0b3AvYm90dG9tXG4gICAgICBvbk5hdmlnYXRlOiBrZXlib2FyZENvbmZpZy5vbk5hdmlnYXRlLFxuICAgIH07XG5cbiAgICAvLyBUeXBlLWFoZWFkIHN0YXRlXG4gICAgbGV0IHR5cGVBaGVhZEJ1ZmZlciA9IFwiXCI7XG4gICAgbGV0IHR5cGVBaGVhZFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gVHJhY2sgaWYgbGFzdCBpbnRlcmFjdGlvbiB3YXMgbW91c2UgKGZvciBmb2N1cyBzdHlsaW5nKVxuICAgIGxldCBsYXN0TW91c2VEb3duVGltZSA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBTZXR1cCBBUklBIGF0dHJpYnV0ZXMgZm9yIGFjY2Vzc2liaWxpdHlcbiAgICAgKi9cbiAgICBjb25zdCBzZXR1cEFjY2Vzc2liaWxpdHkgPSAoKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gY29tcG9uZW50LmVsZW1lbnQ7XG4gICAgICBpZiAoIWVsZW1lbnQpIHJldHVybjtcblxuICAgICAgLy8gU2V0IGxpc3Rib3ggcm9sZSBvbiB0aGUgY29tcG9uZW50XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcInJvbGVcIiwgQVJJQS5ST0xFX0xJU1RCT1gpO1xuXG4gICAgICAvLyBTZXQgbXVsdGlzZWxlY3RhYmxlIGlmIGluIG11bHRpcGxlIHNlbGVjdGlvbiBtb2RlXG4gICAgICBpZiAoY29uZmlnLnNlbGVjdGlvbj8ubW9kZSA9PT0gXCJtdWx0aXBsZVwiKSB7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKEFSSUEuQVJJQV9NVUxUSVNFTEVDVEFCTEUsIFwidHJ1ZVwiKTtcbiAgICAgIH1cblxuICAgICAgLy8gTWFrZSBmb2N1c2FibGVcbiAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiMFwiKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IGFyaWEtbGFiZWwgaWYgbm90IHByZXNlbnRcbiAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoQVJJQS5BUklBX0xBQkVMKSkge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShBUklBLkFSSUFfTEFCRUwsIFwiTGlzdFwiKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIEFSSUEgYXR0cmlidXRlcyBvbiByZW5kZXJlZCBpdGVtc1xuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZUl0ZW1BY2Nlc3NpYmlsaXR5ID0gKCkgPT4ge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZ2V0SXRlbXNDb250YWluZXIoY29tcG9uZW50LmVsZW1lbnQpO1xuICAgICAgY29uc3QgaXRlbXMgPSBnZXRSZW5kZXJlZEl0ZW1zKGNvbnRhaW5lcik7XG4gICAgICBjb25zdCBlbmhhbmNlZENvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBhbnk7XG4gICAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRTZWxlY3RlZEluZGljZXM/LigpIHx8IFtdO1xuXG4gICAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoaXRlbS5kYXRhc2V0LmluZGV4IHx8IFwiLTFcIiwgMTApO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm47XG5cbiAgICAgICAgLy8gU2V0IG9wdGlvbiByb2xlXG4gICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKFwicm9sZVwiLCBBUklBLlJPTEVfT1BUSU9OKTtcblxuICAgICAgICAvLyBTZXQgdW5pcXVlIElEIGZvciBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcbiAgICAgICAgY29uc3QgaXRlbUlkID0gYCR7UFJFRklYfS12bGlzdC1pdGVtLSR7aW5kZXh9YDtcbiAgICAgICAgaXRlbS5pZCA9IGl0ZW1JZDtcblxuICAgICAgICAvLyBTZXQgc2VsZWN0ZWQgc3RhdGVcbiAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHNlbGVjdGVkSW5kaWNlcy5pbmNsdWRlcyhpbmRleCk7XG4gICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKEFSSUEuQVJJQV9TRUxFQ1RFRCwgU3RyaW5nKGlzU2VsZWN0ZWQpKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBVcGRhdGUgYXJpYS1hY3RpdmVkZXNjZW5kYW50IG9uIGNvbnRhaW5lclxuICAgICAgaWYgKHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPiAwICYmIGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZUlkID0gYCR7UFJFRklYfS12bGlzdC1pdGVtLSR7c2VsZWN0ZWRJbmRpY2VzWzBdfWA7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnNldEF0dHJpYnV0ZShBUklBLkFSSUFfQUNUSVZFREVTQ0VOREFOVCwgYWN0aXZlSWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQ/LnJlbW92ZUF0dHJpYnV0ZShBUklBLkFSSUFfQUNUSVZFREVTQ0VOREFOVCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0eXBlLWFoZWFkIHNlYXJjaFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVR5cGVBaGVhZCA9IChjaGFyOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghb3B0aW9ucy50eXBlQWhlYWQpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gQ2xlYXIgcHJldmlvdXMgdGltZXJcbiAgICAgIGlmICh0eXBlQWhlYWRUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQodHlwZUFoZWFkVGltZXIpO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgY2hhcmFjdGVyIHRvIGJ1ZmZlclxuICAgICAgdHlwZUFoZWFkQnVmZmVyICs9IGNoYXIudG9Mb3dlckNhc2UoKTtcblxuICAgICAgLy8gU2V0IHRpbWVyIHRvIGNsZWFyIGJ1ZmZlclxuICAgICAgdHlwZUFoZWFkVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdHlwZUFoZWFkQnVmZmVyID0gXCJcIjtcbiAgICAgIH0sIG9wdGlvbnMudHlwZUFoZWFkVGltZW91dCk7XG5cbiAgICAgIC8vIFNlYXJjaCBmb3IgbWF0Y2hpbmcgaXRlbVxuICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgY29uc3QgaXRlbXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRJdGVtcz8uKCkgfHwgW107XG4gICAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRTZWxlY3RlZEluZGljZXM/LigpIHx8IFtdO1xuICAgICAgY29uc3Qgc3RhcnRJbmRleCA9XG4gICAgICAgIHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPiAwID8gc2VsZWN0ZWRJbmRpY2VzWzBdICsgMSA6IDA7XG5cbiAgICAgIC8vIFNlYXJjaCBmcm9tIGN1cnJlbnQgcG9zaXRpb24gdG8gZW5kLCB0aGVuIHdyYXAgdG8gYmVnaW5uaW5nXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gKHN0YXJ0SW5kZXggKyBpKSAlIGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zW2luZGV4XTtcbiAgICAgICAgaWYgKCFpdGVtKSBjb250aW51ZTtcblxuICAgICAgICAvLyBHZXQgc2VhcmNoYWJsZSB0ZXh0IGZyb20gaXRlbVxuICAgICAgICBjb25zdCB0ZXh0ID0gZ2V0SXRlbVRleHQoaXRlbSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHRleHQuc3RhcnRzV2l0aCh0eXBlQWhlYWRCdWZmZXIpKSB7XG4gICAgICAgICAgZW5oYW5jZWRDb21wb25lbnQuc2VsZWN0QXRJbmRleD8uKGluZGV4KTtcbiAgICAgICAgICBvcHRpb25zLm9uTmF2aWdhdGU/LihpbmRleCwgXCJ0eXBlYWhlYWRcIik7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc2VhcmNoYWJsZSB0ZXh0IGZyb20gYW4gaXRlbVxuICAgICAqL1xuICAgIGNvbnN0IGdldEl0ZW1UZXh0ID0gKGl0ZW06IGFueSk6IHN0cmluZyA9PiB7XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIpIHJldHVybiBpdGVtO1xuICAgICAgcmV0dXJuIGl0ZW0udGl0bGUgfHwgaXRlbS5uYW1lIHx8IGl0ZW0ubGFiZWwgfHwgaXRlbS50ZXh0IHx8IFwiXCI7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBrZXlib2FyZCBldmVudHNcbiAgICAgKlxuICAgICAqIE1EMyBLZXlib2FyZCBOYXZpZ2F0aW9uOlxuICAgICAqIC0gVGFiOiBNb3ZlIGZvY3VzIHRvIGZpcnN0L2xhc3QgbGlzdCBpdGVtIG9yIG91dHNpZGVcbiAgICAgKiAtIERvd24vUmlnaHQ6IE1vdmUgdG8gbmV4dCBlbGVtZW50OyB3cmFwcyB0byB0b3AgaWYgYXQgZW5kXG4gICAgICogLSBVcC9MZWZ0OiBNb3ZlIHRvIHByZXZpb3VzIGVsZW1lbnQ7IHdyYXBzIHRvIGJvdHRvbSBpZiBhdCBzdGFydFxuICAgICAqIC0gU3BhY2UvRW50ZXI6IFNlbGVjdCBhIGxpc3QgaXRlbVxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUtleURvd24gPSBhc3luYyAoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcblxuICAgICAgaWYgKHRvdGFsSXRlbXMgPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3Qgc2VsZWN0ZWRJbmRpY2VzID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0U2VsZWN0ZWRJbmRpY2VzPy4oKSB8fCBbXTtcbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPiAwID8gc2VsZWN0ZWRJbmRpY2VzWzBdIDogLTE7XG5cbiAgICAgIGxldCB0YXJnZXRJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgICBsZXQgaGFuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAvLyBIZWxwZXIgdG8gbWFyayBldmVudCBhcyBoYW5kbGVkIGFuZCBzdG9wIHByb3BhZ2F0aW9uXG4gICAgICBjb25zdCBtYXJrSGFuZGxlZCA9ICgpID0+IHtcbiAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgIH07XG5cbiAgICAgIHN3aXRjaCAoZS5rZXkpIHtcbiAgICAgICAgLy8gTUQzOiBEb3duL1JpZ2h0IG1vdmUgdG8gbmV4dCBlbGVtZW50XG4gICAgICAgIGNhc2UgXCJBcnJvd0Rvd25cIjpcbiAgICAgICAgY2FzZSBcIkFycm93UmlnaHRcIjpcbiAgICAgICAgICBtYXJrSGFuZGxlZCgpO1xuICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPCAwKSB7XG4gICAgICAgICAgICB0YXJnZXRJbmRleCA9IDA7XG4gICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50SW5kZXggPCB0b3RhbEl0ZW1zIC0gMSkge1xuICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBjdXJyZW50SW5kZXggKyAxO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy53cmFwKSB7XG4gICAgICAgICAgICAvLyBNRDM6IHdyYXBzIHRvIHRvcCBpZiBhdCBlbmRcbiAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgLy8gTUQzOiBVcC9MZWZ0IG1vdmUgdG8gcHJldmlvdXMgZWxlbWVudFxuICAgICAgICBjYXNlIFwiQXJyb3dVcFwiOlxuICAgICAgICBjYXNlIFwiQXJyb3dMZWZ0XCI6XG4gICAgICAgICAgbWFya0hhbmRsZWQoKTtcbiAgICAgICAgICBpZiAoY3VycmVudEluZGV4IDwgMCkge1xuICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSB0b3RhbEl0ZW1zIC0gMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRJbmRleCA+IDApIHtcbiAgICAgICAgICAgIHRhcmdldEluZGV4ID0gY3VycmVudEluZGV4IC0gMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMud3JhcCkge1xuICAgICAgICAgICAgLy8gTUQzOiB3cmFwcyB0byBib3R0b20gaWYgYXQgc3RhcnRcbiAgICAgICAgICAgIHRhcmdldEluZGV4ID0gdG90YWxJdGVtcyAtIDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJIb21lXCI6XG4gICAgICAgICAgaWYgKG9wdGlvbnMuaG9tZUVuZCkge1xuICAgICAgICAgICAgbWFya0hhbmRsZWQoKTtcbiAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcIkVuZFwiOlxuICAgICAgICAgIGlmIChvcHRpb25zLmhvbWVFbmQpIHtcbiAgICAgICAgICAgIG1hcmtIYW5kbGVkKCk7XG4gICAgICAgICAgICB0YXJnZXRJbmRleCA9IHRvdGFsSXRlbXMgLSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiUGFnZURvd25cIjpcbiAgICAgICAgICBpZiAob3B0aW9ucy5wYWdlVXBEb3duKSB7XG4gICAgICAgICAgICBtYXJrSGFuZGxlZCgpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBNYXRoLm1pbihvcHRpb25zLnBhZ2VTaXplIC0gMSwgdG90YWxJdGVtcyAtIDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBNYXRoLm1pbihcbiAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggKyBvcHRpb25zLnBhZ2VTaXplLFxuICAgICAgICAgICAgICAgIHRvdGFsSXRlbXMgLSAxLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiUGFnZVVwXCI6XG4gICAgICAgICAgaWYgKG9wdGlvbnMucGFnZVVwRG93bikge1xuICAgICAgICAgICAgbWFya0hhbmRsZWQoKTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPCAwKSB7XG4gICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gTWF0aC5tYXgoY3VycmVudEluZGV4IC0gb3B0aW9ucy5wYWdlU2l6ZSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIC8vIE1EMzogU3BhY2UvRW50ZXIgc2VsZWN0IGEgbGlzdCBpdGVtXG4gICAgICAgIGNhc2UgXCIgXCI6XG4gICAgICAgIGNhc2UgXCJFbnRlclwiOlxuICAgICAgICAgIG1hcmtIYW5kbGVkKCk7XG4gICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBpZiAoY29uZmlnLnNlbGVjdGlvbj8ubW9kZSA9PT0gXCJtdWx0aXBsZVwiKSB7XG4gICAgICAgICAgICAgIC8vIEluIG11bHRpcGxlIG1vZGUsIHRvZ2dsZSBzZWxlY3Rpb25cbiAgICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IGVuaGFuY2VkQ29tcG9uZW50LmlzU2VsZWN0ZWQ/LihjdXJyZW50SW5kZXgpO1xuICAgICAgICAgICAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIGVuaGFuY2VkQ29tcG9uZW50LmRlc2VsZWN0SXRlbXM/LihbY3VycmVudEluZGV4XSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZW5oYW5jZWRDb21wb25lbnQuc2VsZWN0SXRlbXM/LihbY3VycmVudEluZGV4XSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIEluIHNpbmdsZSBtb2RlLCBlbnN1cmUgaXRlbSBpcyBzZWxlY3RlZCBhbmQgZW1pdCBhY3RpdmF0aW9uIGV2ZW50XG4gICAgICAgICAgICAgIGVuaGFuY2VkQ29tcG9uZW50LnNlbGVjdEl0ZW1zPy4oW2N1cnJlbnRJbmRleF0pO1xuICAgICAgICAgICAgICAvLyBFbWl0IGFjdGl2YXRlIGV2ZW50IGZvciBzaW5nbGUtYWN0aW9uIGxpc3RzXG4gICAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtOmFjdGl2YXRlXCIsIHtcbiAgICAgICAgICAgICAgICBpbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICAgICAgICAgIGl0ZW06IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1zPy4oKT8uW2N1cnJlbnRJbmRleF0sXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiYVwiOlxuICAgICAgICBjYXNlIFwiQVwiOlxuICAgICAgICAgIC8vIEN0cmwrQSAvIENtZCtBIC0gc2VsZWN0IGFsbCBpbiBtdWx0aXBsZSBtb2RlXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgKGUuY3RybEtleSB8fCBlLm1ldGFLZXkpICYmXG4gICAgICAgICAgICBjb25maWcuc2VsZWN0aW9uPy5tb2RlID09PSBcIm11bHRpcGxlXCJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG1hcmtIYW5kbGVkKCk7XG4gICAgICAgICAgICBjb25zdCBhbGxJbmRpY2VzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdG90YWxJdGVtcyB9LCAoXywgaSkgPT4gaSk7XG4gICAgICAgICAgICBlbmhhbmNlZENvbXBvbmVudC5zZWxlY3RJdGVtcz8uKGFsbEluZGljZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiRXNjYXBlXCI6XG4gICAgICAgICAgLy8gQ2xlYXIgc2VsZWN0aW9uXG4gICAgICAgICAgbWFya0hhbmRsZWQoKTtcbiAgICAgICAgICBlbmhhbmNlZENvbXBvbmVudC5jbGVhclNlbGVjdGlvbj8uKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBUeXBlLWFoZWFkIGZvciBwcmludGFibGUgY2hhcmFjdGVyc1xuICAgICAgICAgIGlmIChlLmtleS5sZW5ndGggPT09IDEgJiYgIWUuY3RybEtleSAmJiAhZS5tZXRhS2V5ICYmICFlLmFsdEtleSkge1xuICAgICAgICAgICAgaGFuZGxlZCA9IGhhbmRsZVR5cGVBaGVhZChlLmtleSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBOYXZpZ2F0ZSB0byB0YXJnZXQgaW5kZXhcbiAgICAgIGlmICh0YXJnZXRJbmRleCAhPT0gbnVsbCAmJiB0YXJnZXRJbmRleCAhPT0gY3VycmVudEluZGV4KSB7XG4gICAgICAgIC8vIEhhbmRsZSBzaGlmdCthcnJvdyBmb3IgcmFuZ2Ugc2VsZWN0aW9uIGluIG11bHRpcGxlIG1vZGVcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGUuc2hpZnRLZXkgJiZcbiAgICAgICAgICBjb25maWcuc2VsZWN0aW9uPy5tb2RlID09PSBcIm11bHRpcGxlXCIgJiZcbiAgICAgICAgICBjdXJyZW50SW5kZXggPj0gMFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBzdGFydCA9IE1hdGgubWluKGN1cnJlbnRJbmRleCwgdGFyZ2V0SW5kZXgpO1xuICAgICAgICAgIGNvbnN0IGVuZCA9IE1hdGgubWF4KGN1cnJlbnRJbmRleCwgdGFyZ2V0SW5kZXgpO1xuICAgICAgICAgIGNvbnN0IHJhbmdlSW5kaWNlcyA9IEFycmF5LmZyb20oXG4gICAgICAgICAgICB7IGxlbmd0aDogZW5kIC0gc3RhcnQgKyAxIH0sXG4gICAgICAgICAgICAoXywgaSkgPT4gc3RhcnQgKyBpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZW5oYW5jZWRDb21wb25lbnQuc2VsZWN0SXRlbXM/LihyYW5nZUluZGljZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEF3YWl0IHNlbGVjdEF0SW5kZXggZm9yIHByb3BlciBzY3JvbGxpbmcgYW5kIGRhdGEgbG9hZGluZ1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGZvciBIb21lL0VuZC9QYWdlVXAvUGFnZURvd24gd2hpY2ggbWF5IGp1bXAgdG8gdW5sb2FkZWQgaXRlbXNcbiAgICAgICAgICBhd2FpdCBlbmhhbmNlZENvbXBvbmVudC5zZWxlY3RBdEluZGV4Py4odGFyZ2V0SW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnMub25OYXZpZ2F0ZT8uKHRhcmdldEluZGV4LCBlLmtleSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQga2V5Ym9hcmQgZXZlbnQgZm9yIGV4dGVybmFsIGhhbmRsaW5nXG4gICAgICBpZiAoaGFuZGxlZCkge1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwia2V5Ym9hcmQ6bmF2aWdhdGVcIiwge1xuICAgICAgICAgIGtleTogZS5rZXksXG4gICAgICAgICAgaW5kZXg6IHRhcmdldEluZGV4ID8/IGN1cnJlbnRJbmRleCxcbiAgICAgICAgICBzaGlmdEtleTogZS5zaGlmdEtleSxcbiAgICAgICAgICBjdHJsS2V5OiBlLmN0cmxLZXksXG4gICAgICAgICAgbWV0YUtleTogZS5tZXRhS2V5LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGZvY3VzIGV2ZW50XG4gICAgICpcbiAgICAgKiBNRDMgRm9jdXMgQmVoYXZpb3IgZm9yIFNpbmdsZS1BY3Rpb24gTGlzdHM6XG4gICAgICogLSBUaGUgZmlyc3QgZWxlbWVudCBpbiBhIGxpc3Qgc2hvdWxkIHJlY2VpdmUgZm9jdXMgYnkgZGVmYXVsdFxuICAgICAqIC0gSWYgdGhlIGxpc3QgaGFzIGEgc2VsZWN0ZWQgZWxlbWVudCwgZm9jdXMgZ29lcyB0byB0aGUgc2VsZWN0ZWQgaXRlbSBpbnN0ZWFkXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlRm9jdXMgPSAoKSA9PiB7XG4gICAgICBjb25zdCBlbmhhbmNlZENvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBhbnk7XG4gICAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRTZWxlY3RlZEluZGljZXM/LigpIHx8IFtdO1xuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcblxuICAgICAgLy8gQWRkIGtleWJvYXJkIGZvY3VzIGNsYXNzIG9ubHkgaWYgZm9jdXMgd2FzIE5PVCBmcm9tIGEgcmVjZW50IG1vdXNlIGNsaWNrXG4gICAgICAvLyAxMDBtcyB0aHJlc2hvbGQgYWNjb3VudHMgZm9yIHRoZSBkZWxheSBiZXR3ZWVuIG1vdXNlZG93biBhbmQgZm9jdXNcbiAgICAgIGNvbnN0IHdhc01vdXNlQ2xpY2sgPSBEYXRlLm5vdygpIC0gbGFzdE1vdXNlRG93blRpbWUgPCAxMDA7XG4gICAgICBpZiAoIXdhc01vdXNlQ2xpY2sgJiYgY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgYWRkQ2xhc3MoY29tcG9uZW50LmVsZW1lbnQsIEtFWUJPQVJEX0ZPQ1VTX0NMQVNTKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRvdGFsSXRlbXMgPT09IDApIHJldHVybjtcblxuICAgICAgLy8gTUQzOiBJZiBsaXN0IGhhcyBzZWxlY3RlZCBlbGVtZW50LCBmb2N1cyBnb2VzIHRvIHNlbGVjdGVkIGl0ZW1cbiAgICAgIC8vIE90aGVyd2lzZSwgZmlyc3QgZWxlbWVudCByZWNlaXZlcyBmb2N1c1xuICAgICAgaWYgKHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZW5oYW5jZWRDb21wb25lbnQuc2VsZWN0QXRJbmRleD8uKDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gT25seSBzY3JvbGwgdG8gc2VsZWN0ZWQgaXRlbSBpZiBpdCdzIG5vdCBhbHJlYWR5IGZ1bGx5IHZpc2libGVcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyB1bndhbnRlZCBzY3JvbGxpbmcgd2hlbiBjbGlja2luZyBvbiBhIHZpc2libGUgaXRlbVxuICAgICAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzWzBdO1xuICAgICAgICBjb25zdCBpc1Zpc2libGUgPSBlbmhhbmNlZENvbXBvbmVudC5pc0l0ZW1GdWxseVZpc2libGU/LihzZWxlY3RlZEluZGV4KTtcbiAgICAgICAgaWYgKCFpc1Zpc2libGUgJiYgZW5oYW5jZWRDb21wb25lbnQudmlld3BvcnQ/LnNjcm9sbFRvSW5kZXgpIHtcbiAgICAgICAgICBlbmhhbmNlZENvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb0luZGV4KHNlbGVjdGVkSW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJrZXlib2FyZDpmb2N1c1wiKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGJsdXIgZXZlbnRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVCbHVyID0gKCkgPT4ge1xuICAgICAgLy8gUmVtb3ZlIGtleWJvYXJkIGZvY3VzIGNsYXNzXG4gICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3MoY29tcG9uZW50LmVsZW1lbnQsIEtFWUJPQVJEX0ZPQ1VTX0NMQVNTKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYXIgdHlwZS1haGVhZCBvbiBibHVyXG4gICAgICB0eXBlQWhlYWRCdWZmZXIgPSBcIlwiO1xuICAgICAgaWYgKHR5cGVBaGVhZFRpbWVyKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0eXBlQWhlYWRUaW1lcik7XG4gICAgICAgIHR5cGVBaGVhZFRpbWVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcImtleWJvYXJkOmJsdXJcIik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqL1xuICAgIGNvbnN0IHNldHVwID0gKCkgPT4ge1xuICAgICAgc2V0dXBBY2Nlc3NpYmlsaXR5KCk7XG5cbiAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlEb3duKTtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIGhhbmRsZUZvY3VzKTtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgaGFuZGxlQmx1cik7XG5cbiAgICAgICAgLy8gVHJhY2sgbW91c2UgY2xpY2tzIHRvIGRpc3Rpbmd1aXNoIGZyb20ga2V5Ym9hcmQgZm9jdXNcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCAoKSA9PiB7XG4gICAgICAgICAgbGFzdE1vdXNlRG93blRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBZGQgY2xpY2sgaGFuZGxlciB0byBmb2N1cyB0aGUgbGlzdCB3aGVuIGNsaWNrZWRcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICBjb21wb25lbnQuZWxlbWVudD8uZm9jdXMoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBBUklBIGF0dHJpYnV0ZXMgd2hlbiBpdGVtcyBhcmUgcmVuZGVyZWRcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5vbj8uKFxuICAgICAgICBcInZpZXdwb3J0Oml0ZW1zLXJlbmRlcmVkXCIsXG4gICAgICAgIHVwZGF0ZUl0ZW1BY2Nlc3NpYmlsaXR5LFxuICAgICAgKTtcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5vbj8uKFwidmlld3BvcnQ6cmVuZGVyZWRcIiwgdXBkYXRlSXRlbUFjY2Vzc2liaWxpdHkpO1xuXG4gICAgICAvLyBVcGRhdGUgQVJJQSB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzXG4gICAgICAoY29tcG9uZW50IGFzIGFueSkub24/LihcInNlbGVjdGlvbjpjaGFuZ2VcIiwgdXBkYXRlSXRlbUFjY2Vzc2liaWxpdHkpO1xuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXplIGFmdGVyIGNvbXBvbmVudCBpcyByZWFkeVxuICAgIHNldFRpbWVvdXQoc2V0dXAsIDApO1xuXG4gICAgLy8gQ2xlYW51cCBvbiBkZXN0cm95XG4gICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmRlc3Ryb3k7XG4gICAgY29tcG9uZW50LmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgaGFuZGxlS2V5RG93bik7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCBoYW5kbGVGb2N1cyk7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGhhbmRsZUJsdXIpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVBaGVhZFRpbWVyKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0eXBlQWhlYWRUaW1lcik7XG4gICAgICB9XG4gICAgICBvcmlnaW5hbERlc3Ryb3k/LigpO1xuICAgIH07XG5cbiAgICAvLyBSZXR1cm4gZW5oYW5jZWQgY29tcG9uZW50IHdpdGgga2V5Ym9hcmQgQVBJXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgLyoqXG4gICAgICAgKiBGb2N1cyB0aGUgbGlzdCBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvblxuICAgICAgICovXG4gICAgICBmb2N1cygpOiB2b2lkIHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQ/LmZvY3VzKCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEJsdXIgdGhlIGxpc3RcbiAgICAgICAqL1xuICAgICAgYmx1cigpOiB2b2lkIHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQ/LmJsdXIoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgbGlzdCBoYXMgZm9jdXNcbiAgICAgICAqL1xuICAgICAgaGFzRm9jdXMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBjb21wb25lbnQuZWxlbWVudDtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2VsZWN0IGZpcnN0IGl0ZW1cbiAgICAgICAqL1xuICAgICAgYXN5bmMgc2VsZWN0Rmlyc3QoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGVuaGFuY2VkQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIGFueTtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcbiAgICAgICAgaWYgKHRvdGFsSXRlbXMgPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIGVuaGFuY2VkQ29tcG9uZW50LnNlbGVjdEF0SW5kZXg/LigwKSA/PyBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNlbGVjdCBsYXN0IGl0ZW1cbiAgICAgICAqL1xuICAgICAgYXN5bmMgc2VsZWN0TGFzdCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0SXRlbUNvdW50Py4oKSB8fCAwO1xuICAgICAgICBpZiAodG90YWxJdGVtcyA+IDApIHtcbiAgICAgICAgICByZXR1cm4gZW5oYW5jZWRDb21wb25lbnQuc2VsZWN0QXRJbmRleD8uKHRvdGFsSXRlbXMgLSAxKSA/PyBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoS2V5Ym9hcmQ7XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL2Zvcm0vZm9ybS50c1xuXG4vKipcbiAqIEZvcm0gQ29tcG9uZW50IC0gRnVuY3Rpb25hbCBmb3JtIGJ1aWxkZXIgd2l0aCBtdHJsIGNvbXBvc2l0aW9uXG4gKlxuICogQSBmb3JtIGNvbXBvbmVudCB0aGF0IHVzZXMgdGhlIG10cmwtYWRkb25zIGxheW91dCBzeXN0ZW0gdG8gYnVpbGRcbiAqIGZvcm1zIGZyb20gc2NoZW1hIGRlZmluaXRpb25zLCB3aXRoIGJ1aWx0LWluIGRhdGEgbWFuYWdlbWVudCxcbiAqIHZhbGlkYXRpb24sIGFuZCBzdWJtaXNzaW9uIGhhbmRsaW5nLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRm9ybUNvbmZpZywgRm9ybUNvbXBvbmVudCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8vIEltcG9ydCBtdHJsIGNvbXBvc2Ugc3lzdGVtXG5pbXBvcnQgeyBwaXBlIH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IGNyZWF0ZUJhc2UsIHdpdGhFbGVtZW50IH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IHdpdGhFdmVudHMsIHdpdGhMaWZlY3ljbGUgfSBmcm9tIFwibXRybFwiO1xuXG4vLyBJbXBvcnQgZm9ybSBmZWF0dXJlc1xuaW1wb3J0IHtcbiAgd2l0aExheW91dCxcbiAgd2l0aEZpZWxkcyxcbiAgd2l0aERhdGEsXG4gIHdpdGhDb250cm9sbGVyLFxuICB3aXRoU3VibWl0LFxuICB3aXRoUHJvdGVjdGlvbixcbiAgd2l0aEFQSSxcbn0gZnJvbSBcIi4vZmVhdHVyZXNcIjtcblxuLy8gSW1wb3J0IGNvbmZpZ3VyYXRpb25cbmltcG9ydCB7IGNyZWF0ZUJhc2VDb25maWcsIGdldEVsZW1lbnRDb25maWcgfSBmcm9tIFwiLi9jb25maWdcIjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEZvcm0gY29tcG9uZW50IHVzaW5nIGZ1bmN0aW9uYWwgY29tcG9zaXRpb25cbiAqXG4gKiBAcGFyYW0ge0Zvcm1Db25maWd9IGNvbmZpZyAtIEZvcm0gY29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyB7Rm9ybUNvbXBvbmVudH0gQSBmdWxseSBjb25maWd1cmVkIGZvcm0gY29tcG9uZW50XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGNyZWF0ZUZvcm0gfSBmcm9tICdtdHJsLWFkZG9ucydcbiAqIGltcG9ydCB7IGNyZWF0ZVRleHRmaWVsZCwgY3JlYXRlU3dpdGNoLCBjcmVhdGVDaGlwcyB9IGZyb20gJ210cmwnXG4gKlxuICogY29uc3QgZm9ybSA9IGNyZWF0ZUZvcm0oe1xuICogICBjbGFzczogJ2FjY291bnQtZm9ybScsXG4gKiAgIGFjdGlvbjogJy9hcGkvdXNlcnMvJyxcbiAqICAgbGF5b3V0OiBbXG4gKiAgICAgWydzZWN0aW9uJywgeyBjbGFzczogJ3VzZXItc2VjdGlvbicgfSxcbiAqICAgICAgIFsnZGl2JywgeyBjbGFzczogJ3NlY3Rpb24tdGl0bGUnLCB0ZXh0OiAnVXNlcicgfV0sXG4gKiAgICAgICBbY3JlYXRlVGV4dGZpZWxkLCAnaW5mby51c2VybmFtZScsIHsgbGFiZWw6ICdVc2VybmFtZScgfV0sXG4gKiAgICAgICBbY3JlYXRlQ2hpcHMsICdpbmZvLnJvbGUnLCB7XG4gKiAgICAgICAgIGxhYmVsOiAnUm9sZScsXG4gKiAgICAgICAgIGNoaXBzOiBbXG4gKiAgICAgICAgICAgeyB0ZXh0OiAncmVnaXN0ZXJlZCcsIHZhbHVlOiAncmVnaXN0ZXJlZCcgfSxcbiAqICAgICAgICAgICB7IHRleHQ6ICdhZG1pbicsIHZhbHVlOiAnYWRtaW4nIH0sXG4gKiAgICAgICAgICAgeyB0ZXh0OiAncHJlbWl1bScsIHZhbHVlOiAncHJlbWl1bScgfVxuICogICAgICAgICBdXG4gKiAgICAgICB9XSxcbiAqICAgICAgIFtjcmVhdGVTd2l0Y2gsICdpbmZvLmVuYWJsZWQnLCB7IGxhYmVsOiAnRW5hYmxlZCcgfV1cbiAqICAgICBdXG4gKiAgIF0sXG4gKiAgIG9uOiB7XG4gKiAgICAgY2hhbmdlOiAoZGF0YSkgPT4gY29uc29sZS5sb2coJ0Zvcm0gY2hhbmdlZDonLCBkYXRhKSxcbiAqICAgICBzdWJtaXQ6IChkYXRhKSA9PiBjb25zb2xlLmxvZygnRm9ybSBzdWJtaXR0ZWQ6JywgZGF0YSlcbiAqICAgfVxuICogfSlcbiAqXG4gKiAvLyBBcHBlbmQgdG8gRE9NXG4gKiBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGZvcm0uZWxlbWVudClcbiAqXG4gKiAvLyBTZXQgZGF0YVxuICogZm9ybS5zZXREYXRhKHtcbiAqICAgdXNlcm5hbWU6ICdqb2huX2RvZScsXG4gKiAgIHJvbGU6ICdhZG1pbicsXG4gKiAgIGVuYWJsZWQ6IHRydWVcbiAqIH0pXG4gKlxuICogLy8gR2V0IGRhdGFcbiAqIGNvbnN0IGRhdGEgPSBmb3JtLmdldERhdGEoKVxuICpcbiAqIC8vIENoZWNrIGlmIG1vZGlmaWVkXG4gKiBpZiAoZm9ybS5pc01vZGlmaWVkKCkpIHtcbiAqICAgYXdhaXQgZm9ybS5zdWJtaXQoKVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVGb3JtID0gKGNvbmZpZzogRm9ybUNvbmZpZyA9IHt9KTogRm9ybUNvbXBvbmVudCA9PiB7XG4gIHRyeSB7XG4gICAgLy8gUHJvY2VzcyBjb25maWd1cmF0aW9uIHdpdGggZGVmYXVsdHNcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gY3JlYXRlQmFzZUNvbmZpZyhjb25maWcpO1xuXG4gICAgLy8gQnVpbGQgdGhlIGZvcm0gdGhyb3VnaCBmdW5jdGlvbmFsIGNvbXBvc2l0aW9uXG4gICAgLy8gRWFjaCBmdW5jdGlvbiBpbiB0aGUgcGlwZSBhZGRzIHNwZWNpZmljIGNhcGFiaWxpdGllc1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHBpcGUoXG4gICAgICAvLyAxLiBGb3VuZGF0aW9uIGxheWVyIC0gQmFzZSBjb21wb25lbnQgd2l0aCBjb25maWdcbiAgICAgIGNyZWF0ZUJhc2UsXG5cbiAgICAgIC8vIDIuIEV2ZW50IHN5c3RlbSAtIEFkZHMgb24vb2ZmL2VtaXQgbWV0aG9kc1xuICAgICAgd2l0aEV2ZW50cygpLFxuXG4gICAgICAvLyAzLiBET00gZWxlbWVudCAtIENyZWF0ZXMgdGhlIHJvb3QgY29udGFpbmVyIGVsZW1lbnRcbiAgICAgIHdpdGhFbGVtZW50KGdldEVsZW1lbnRDb25maWcoYmFzZUNvbmZpZykpLFxuXG4gICAgICAvLyA0LiBMYXlvdXQgLSBDcmVhdGVzIGZvcm0gZWxlbWVudCBhbmQgcHJvY2Vzc2VzIGxheW91dCBzY2hlbWFcbiAgICAgIHdpdGhMYXlvdXQoYmFzZUNvbmZpZyksXG5cbiAgICAgIC8vIDUuIEZpZWxkcyAtIEV4dHJhY3RzIGZpZWxkcyBmcm9tIGxheW91dCBhbmQgY3JlYXRlcyByZWdpc3RyeVxuICAgICAgd2l0aEZpZWxkcyhiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gNi4gRGF0YSAtIEFkZHMgZGF0YSBtYW5hZ2VtZW50IChnZXQvc2V0LCBjaGFuZ2UgdHJhY2tpbmcpXG4gICAgICB3aXRoRGF0YShiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gNy4gQ29udHJvbGxlciAtIEFkZHMgbW9kZSBtYW5hZ2VtZW50IChyZWFkL2NyZWF0ZS91cGRhdGUpXG4gICAgICB3aXRoQ29udHJvbGxlcihiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gOC4gU3VibWl0IC0gQWRkcyB2YWxpZGF0aW9uIGFuZCBzdWJtaXNzaW9uIGhhbmRsaW5nXG4gICAgICB3aXRoU3VibWl0KGJhc2VDb25maWcpLFxuXG4gICAgICAvLyA5LiBQcm90ZWN0aW9uIC0gQWRkcyBibG9ja2luZyBvdmVybGF5IHdoZW4gZm9ybSBoYXMgdW5zYXZlZCBjaGFuZ2VzXG4gICAgICB3aXRoUHJvdGVjdGlvbihiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gMTAuIExpZmVjeWNsZSAtIEFkZHMgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgKGRlc3Ryb3kpXG4gICAgICB3aXRoTGlmZWN5Y2xlKCksXG5cbiAgICAgIC8vIDExLiBBUEkgLSBDcmVhdGVzIGNsZWFuIHB1YmxpYyBBUElcbiAgICAgIHdpdGhBUEkoYmFzZUNvbmZpZyksXG4gICAgKShiYXNlQ29uZmlnKTtcblxuICAgIC8vIEFwcGVuZCB0byBjb250YWluZXIgaWYgcHJvdmlkZWRcbiAgICBpZiAoY29uZmlnLmNvbnRhaW5lciAmJiBjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgY29uZmlnLmNvbnRhaW5lci5hcHBlbmRDaGlsZChjb21wb25lbnQuZWxlbWVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvbmVudCBhcyBGb3JtQ29tcG9uZW50O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJGb3JtIGNyZWF0aW9uIGVycm9yOlwiLCBlcnJvcik7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGZvcm06ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVGb3JtO1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2xheW91dC50c1xuXG4vKipcbiAqIExheW91dCBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogQnVpbGRzIHRoZSBmb3JtIHN0cnVjdHVyZSBmcm9tIGEgbGF5b3V0IHNjaGVtYSB1c2luZyBtdHJsLWFkZG9ucyBsYXlvdXQgc3lzdGVtXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTGF5b3V0IH0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvbGF5b3V0XCI7XG5pbXBvcnQgdHlwZSB7IEZvcm1Db25maWcsIEJhc2VGb3JtQ29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBGT1JNX0RFRkFVTFRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG4vLyBTY3JvbGwgdGhyZXNob2xkIGluIHBpeGVsc1xuY29uc3QgU0NST0xMRURfVEhSRVNIT0xEID0gMTtcblxuLy8gQ1NTIGNsYXNzIG5hbWVzXG5jb25zdCBTQ1JPTExFRF9DTEFTUyA9IFwibXRybC1mb3JtLS1zY3JvbGxlZFwiO1xuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGZvcm0gZWxlbWVudFxuICovXG5jb25zdCBjcmVhdGVGb3JtRWxlbWVudCA9IChjb25maWc6IEZvcm1Db25maWcpOiBIVE1MRm9ybUVsZW1lbnQgPT4ge1xuICBjb25zdCBmb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImZvcm1cIik7XG5cbiAgaWYgKGNvbmZpZy5tZXRob2QpIHtcbiAgICBmb3JtLnNldEF0dHJpYnV0ZShcIm1ldGhvZFwiLCBjb25maWcubWV0aG9kKTtcbiAgfVxuXG4gIGlmIChjb25maWcuYWN0aW9uKSB7XG4gICAgZm9ybS5zZXRBdHRyaWJ1dGUoXCJhY3Rpb25cIiwgY29uZmlnLmFjdGlvbik7XG4gIH1cblxuICBpZiAoY29uZmlnLmF1dG9jb21wbGV0ZSkge1xuICAgIGZvcm0uc2V0QXR0cmlidXRlKFwiYXV0b2NvbXBsZXRlXCIsIGNvbmZpZy5hdXRvY29tcGxldGUpO1xuICB9XG5cbiAgLy8gUHJldmVudCBkZWZhdWx0IGZvcm0gc3VibWlzc2lvbiAtIHdlIGhhbmRsZSBpdCBwcm9ncmFtbWF0aWNhbGx5XG4gIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGZvcm07XG59O1xuXG4vKipcbiAqIFByb2Nlc3NlcyBsYXlvdXQgc2NoZW1hIGFuZCBleHRyYWN0cyBuYW1lZCBjb21wb25lbnRzXG4gKi9cbmNvbnN0IHByb2Nlc3NMYXlvdXRTY2hlbWEgPSAoXG4gIHNjaGVtYTogdW5rbm93bltdLFxuICBmb3JtOiBIVE1MRm9ybUVsZW1lbnQsXG4gIGNvbmZpZzogRm9ybUNvbmZpZyxcbik6IHsgdWk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBsYXlvdXRSZXN1bHQ6IHVua25vd24gfSA9PiB7XG4gIGlmICghc2NoZW1hIHx8ICFBcnJheS5pc0FycmF5KHNjaGVtYSkgfHwgc2NoZW1hLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB7IHVpOiB7fSwgbGF5b3V0UmVzdWx0OiBudWxsIH07XG4gIH1cblxuICAvLyBVc2UgbXRybC1hZGRvbnMgY3JlYXRlTGF5b3V0IHRvIHByb2Nlc3MgdGhlIHNjaGVtYVxuICBjb25zdCBsYXlvdXRSZXN1bHQgPSBjcmVhdGVMYXlvdXQoc2NoZW1hLCBmb3JtLCB7fSk7XG5cbiAgLy8gRXh0cmFjdCBuYW1lZCBjb21wb25lbnRzIGZyb20gbGF5b3V0IHJlc3VsdFxuICBjb25zdCB1aTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICBpZiAobGF5b3V0UmVzdWx0ICYmIHR5cGVvZiBsYXlvdXRSZXN1bHQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAvLyBUaGUgbGF5b3V0IHJlc3VsdCBjb250YWlucyBjb21wb25lbnQgcmVmZXJlbmNlc1xuICAgIGNvbnN0IHJlc3VsdCA9IGxheW91dFJlc3VsdCBhcyB7IGNvbXBvbmVudD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH07XG4gICAgaWYgKHJlc3VsdC5jb21wb25lbnQpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odWksIHJlc3VsdC5jb21wb25lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHVpLCBsYXlvdXRSZXN1bHQgfTtcbn07XG5cbi8qKlxuICogU2V0cyB1cCBzY3JvbGwgZGV0ZWN0aW9uIG9uIGJvZHkgZWxlbWVudHMgdG8gdG9nZ2xlIC0tc2Nyb2xsZWQgY2xhc3Mgb24gZm9ybSBjb250YWluZXJcbiAqL1xuY29uc3Qgc2V0dXBTY3JvbGxJbmRpY2F0b3IgPSAoXG4gIGZvcm06IEhUTUxGb3JtRWxlbWVudCxcbiAgZm9ybUNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4pOiAoKCkgPT4gdm9pZCkgPT4ge1xuICBjb25zdCBjbGVhbnVwRm5zOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdO1xuXG4gIC8vIEZpbmQgYm9keSBlbGVtZW50IHRvIGNhbGN1bGF0ZSBzaGFkb3cgcG9zaXRpb25cbiAgY29uc3QgYm9keUVsZW1lbnQgPSBmb3JtLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFwiLm10cmwtYm9keVwiKTtcbiAgaWYgKGJvZHlFbGVtZW50KSB7XG4gICAgLy8gU2V0IENTUyB2YXJpYWJsZSBmb3Igc2hhZG93IHBvc2l0aW9uaW5nIGF0IHRvcCBvZiBib2R5XG4gICAgY29uc3QgdXBkYXRlQm9keVRvcCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGJvZHlUb3AgPSBib2R5RWxlbWVudC5vZmZzZXRUb3A7XG4gICAgICBmb3JtQ29udGFpbmVyLnN0eWxlLnNldFByb3BlcnR5KFwiLS1tdHJsLWZvcm0tYm9keS10b3BcIiwgYCR7Ym9keVRvcH1weGApO1xuICAgIH07XG4gICAgdXBkYXRlQm9keVRvcCgpO1xuXG4gICAgLy8gVXBkYXRlIG9uIHJlc2l6ZVxuICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKHVwZGF0ZUJvZHlUb3ApO1xuICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZm9ybSk7XG5cbiAgICBjbGVhbnVwRm5zLnB1c2goKCkgPT4ge1xuICAgICAgcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgZm9ybUNvbnRhaW5lci5zdHlsZS5yZW1vdmVQcm9wZXJ0eShcIi0tbXRybC1mb3JtLWJvZHktdG9wXCIpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gRmluZCBib2R5IGVsZW1lbnRzIChtdHJsLWJvZHkgY2xhc3MgYWRkZWQgYnkgbGF5b3V0IHN5c3RlbSlcbiAgY29uc3QgYm9keUVsZW1lbnRzID0gZm9ybS5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihcIi5tdHJsLWJvZHlcIik7XG5cbiAgYm9keUVsZW1lbnRzLmZvckVhY2goKGJvZHlFbGVtZW50KSA9PiB7XG4gICAgbGV0IGlzU2Nyb2xsZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IGhhbmRsZVNjcm9sbCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHNob3VsZEJlU2Nyb2xsZWQgPSBib2R5RWxlbWVudC5zY3JvbGxUb3AgPiBTQ1JPTExFRF9USFJFU0hPTEQ7XG4gICAgICBpZiAoc2hvdWxkQmVTY3JvbGxlZCAhPT0gaXNTY3JvbGxlZCkge1xuICAgICAgICBpc1Njcm9sbGVkID0gc2hvdWxkQmVTY3JvbGxlZDtcbiAgICAgICAgZm9ybUNvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKFNDUk9MTEVEX0NMQVNTLCBzaG91bGRCZVNjcm9sbGVkKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbCBjaGVja1xuICAgIGhhbmRsZVNjcm9sbCgpO1xuXG4gICAgLy8gTGlzdGVuIGZvciBzY3JvbGwgZXZlbnRzXG4gICAgYm9keUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBoYW5kbGVTY3JvbGwsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNsZWFudXBGbnMucHVzaCgoKSA9PiB7XG4gICAgICBib2R5RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIGhhbmRsZVNjcm9sbCk7XG4gICAgICBmb3JtQ29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoU0NST0xMRURfQ0xBU1MpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBSZXR1cm4gY2xlYW51cCBmdW5jdGlvblxuICByZXR1cm4gKCkgPT4ge1xuICAgIGNsZWFudXBGbnMuZm9yRWFjaCgoZm4pID0+IGZuKCkpO1xuICB9O1xufTtcblxuLyoqXG4gKiB3aXRoTGF5b3V0IGZlYXR1cmVcbiAqIEFkZHMgZm9ybSBlbGVtZW50IGNyZWF0aW9uIGFuZCBsYXlvdXQgcHJvY2Vzc2luZ1xuICovXG5leHBvcnQgY29uc3Qgd2l0aExheW91dCA9IChjb25maWc6IEZvcm1Db25maWcpID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgQmFzZUZvcm1Db21wb25lbnQ+KFxuICAgIGNvbXBvbmVudDogVCxcbiAgKTogVCAmIHtcbiAgICBmb3JtOiBIVE1MRm9ybUVsZW1lbnQ7XG4gICAgdWk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGxheW91dFJlc3VsdDogdW5rbm93bjtcbiAgICBfY2xlYW51cFNjcm9sbEluZGljYXRvcj86ICgpID0+IHZvaWQ7XG4gIH0gPT4ge1xuICAgIC8vIENyZWF0ZSB0aGUgZm9ybSBlbGVtZW50XG4gICAgY29uc3QgZm9ybSA9IGNyZWF0ZUZvcm1FbGVtZW50KGNvbmZpZyk7XG5cbiAgICAvLyBBcHBlbmQgZm9ybSB0byBjb21wb25lbnQncyByb290IGVsZW1lbnRcbiAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFwcGVuZENoaWxkKGZvcm0pO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgbGF5b3V0IHNjaGVtYSBpZiBwcm92aWRlZFxuICAgIGNvbnN0IHsgdWksIGxheW91dFJlc3VsdCB9ID0gY29uZmlnLmxheW91dFxuICAgICAgPyBwcm9jZXNzTGF5b3V0U2NoZW1hKGNvbmZpZy5sYXlvdXQsIGZvcm0sIGNvbmZpZylcbiAgICAgIDogeyB1aToge30sIGxheW91dFJlc3VsdDogbnVsbCB9O1xuXG4gICAgLy8gU2V0dXAgc2Nyb2xsIGluZGljYXRvciBvbiBib2R5IGVsZW1lbnRzXG4gICAgY29uc3QgY2xlYW51cFNjcm9sbEluZGljYXRvciA9IHNldHVwU2Nyb2xsSW5kaWNhdG9yKFxuICAgICAgZm9ybSxcbiAgICAgIGNvbXBvbmVudC5lbGVtZW50LFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgZm9ybSxcbiAgICAgIHVpLFxuICAgICAgbGF5b3V0UmVzdWx0LFxuICAgICAgX2NsZWFudXBTY3JvbGxJbmRpY2F0b3I6IGNsZWFudXBTY3JvbGxJbmRpY2F0b3IsXG4gICAgfTtcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhMYXlvdXQ7XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL2Zvcm0vY29uc3RhbnRzLnRzXG5cbi8qKlxuICogRGF0YSBzdGF0ZSBjb25zdGFudHNcbiAqIFRyYWNrcyB3aGV0aGVyIGZvcm0gZGF0YSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwgc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IERBVEFfU1RBVEUgPSB7XG4gIC8qKiBEYXRhIG1hdGNoZXMgaW5pdGlhbCBzdGF0ZSAtIG5vIGNoYW5nZXMgbWFkZSAqL1xuICBQUklTVElORTogXCJwcmlzdGluZVwiLFxuICAvKiogRGF0YSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwgc3RhdGUgKi9cbiAgRElSVFk6IFwiZGlydHlcIixcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogRm9ybSBldmVudCBjb25zdGFudHNcbiAqL1xuZXhwb3J0IGNvbnN0IEZPUk1fRVZFTlRTID0ge1xuICAvKiogRmlyZWQgd2hlbiBhbnkgZmllbGQgdmFsdWUgY2hhbmdlcyAqL1xuICBDSEFOR0U6IFwiY2hhbmdlXCIsXG4gIC8qKiBGaXJlZCB3aGVuIGZvcm0gaXMgc3VibWl0dGVkICovXG4gIFNVQk1JVDogXCJzdWJtaXRcIixcbiAgLyoqIEZpcmVkIHdoZW4gZGF0YSBzdGF0ZSBjaGFuZ2VzIChwcmlzdGluZSA8LT4gZGlydHkpICovXG4gIFNUQVRFX0NIQU5HRTogXCJzdGF0ZTpjaGFuZ2VcIixcbiAgLyoqIEZpcmVkIHdoZW4gZGF0YSBpcyBzZXQgb24gdGhlIGZvcm0gKi9cbiAgREFUQV9TRVQ6IFwiZGF0YTpzZXRcIixcbiAgLyoqIEZpcmVkIHdoZW4gZGF0YSBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgZm9ybSAqL1xuICBEQVRBX0dFVDogXCJkYXRhOmdldFwiLFxuICAvKiogRmlyZWQgd2hlbiBhIHNwZWNpZmljIGZpZWxkIGNoYW5nZXMgKi9cbiAgRklFTERfQ0hBTkdFOiBcImZpZWxkOmNoYW5nZVwiLFxuICAvKiogRmlyZWQgd2hlbiB2YWxpZGF0aW9uIGZhaWxzICovXG4gIFZBTElEQVRJT05fRVJST1I6IFwidmFsaWRhdGlvbjplcnJvclwiLFxuICAvKiogRmlyZWQgd2hlbiBzdWJtaXQgc3VjY2VlZHMgKi9cbiAgU1VCTUlUX1NVQ0NFU1M6IFwic3VibWl0OnN1Y2Nlc3NcIixcbiAgLyoqIEZpcmVkIHdoZW4gc3VibWl0IGZhaWxzICovXG4gIFNVQk1JVF9FUlJPUjogXCJzdWJtaXQ6ZXJyb3JcIixcbiAgLyoqIEZpcmVkIHdoZW4gZm9ybSBpcyByZXNldCB0byBpbml0aWFsIHN0YXRlICovXG4gIFJFU0VUOiBcInJlc2V0XCIsXG4gIC8qKiBGaXJlZCB3aGVuIHNldERhdGEgaXMgY2FsbGVkIHdpdGggdW5zYXZlZCBjaGFuZ2VzIChwcm90ZWN0aW9uIGVuYWJsZWQpICovXG4gIERBVEFfQ09ORkxJQ1Q6IFwiZGF0YTpjb25mbGljdFwiLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBGb3JtIENTUyBjbGFzcyBtb2RpZmllcnNcbiAqL1xuZXhwb3J0IGNvbnN0IEZPUk1fQ0xBU1NFUyA9IHtcbiAgLyoqIEFwcGxpZWQgd2hlbiBkYXRhIGhhcyBiZWVuIG1vZGlmaWVkICovXG4gIE1PRElGSUVEOiBcIm1vZGlmaWVkXCIsXG4gIC8qKiBBcHBsaWVkIHdoZW4gZm9ybSBpcyBzdWJtaXR0aW5nICovXG4gIFNVQk1JVFRJTkc6IFwic3VibWl0dGluZ1wiLFxuICAvKiogQXBwbGllZCB3aGVuIGZvcm0gaXMgZGlzYWJsZWQgKi9cbiAgRElTQUJMRUQ6IFwiZGlzYWJsZWRcIixcbiAgLyoqIEFwcGxpZWQgd2hlbiBmb3JtIGJvZHkgaXMgc2Nyb2xsZWQgYXdheSBmcm9tIHRvcCAqL1xuICBTQ1JPTExFRDogXCJtdHJsLWZvcm0tLXNjcm9sbGVkXCIsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIERlZmF1bHQgZm9ybSBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBGT1JNX0RFRkFVTFRTID0ge1xuICBwcmVmaXg6IFwibXRybFwiLFxuICBjb21wb25lbnROYW1lOiBcImZvcm1cIixcbiAgdGFnOiBcImRpdlwiLFxuICBmb3JtVGFnOiBcImZvcm1cIixcbiAgbWV0aG9kOiBcIlBPU1RcIixcbiAgYXV0b2NvbXBsZXRlOiBcIm9mZlwiLFxuICB1c2VDaGFuZ2VzOiB0cnVlLFxuICBjb250cm9sczogW1wic3VibWl0XCIsIFwiY2FuY2VsXCJdLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBGaWVsZCBuYW1lIHByZWZpeGVzIHVzZWQgZm9yIGV4dHJhY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IEZJRUxEX1BSRUZJWEVTID0ge1xuICBJTkZPOiBcImluZm8uXCIsXG4gIEZJTEU6IFwiZmlsZS5cIixcbiAgREFUQTogXCJkYXRhLlwiLFxufSBhcyBjb25zdDtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9jb25maWcudHNcblxuaW1wb3J0IHR5cGUgeyBGb3JtQ29uZmlnLCBGb3JtU3RhdGUsIEZvcm1EYXRhIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IEZPUk1fREVGQVVMVFMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLy8gUmUtZXhwb3J0IEZPUk1fREVGQVVMVFMgZm9yIHVzZSBpbiBvdGhlciBtb2R1bGVzXG5leHBvcnQgeyBGT1JNX0RFRkFVTFRTIH07XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgYmFzZSBjb25maWd1cmF0aW9uIHdpdGggZGVmYXVsdHMgYXBwbGllZFxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlQmFzZUNvbmZpZyA9IChjb25maWc6IEZvcm1Db25maWcgPSB7fSk6IEZvcm1Db25maWcgPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLkZPUk1fREVGQVVMVFMsXG4gICAgLi4uY29uZmlnLFxuICAgIHByZWZpeDogY29uZmlnLnByZWZpeCB8fCBGT1JNX0RFRkFVTFRTLnByZWZpeCxcbiAgICBjb21wb25lbnROYW1lOiBjb25maWcuY29tcG9uZW50TmFtZSB8fCBGT1JNX0RFRkFVTFRTLmNvbXBvbmVudE5hbWUsXG4gICAgY29udHJvbHM6XG4gICAgICBjb25maWcuY29udHJvbHMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IGNvbmZpZy5jb250cm9sc1xuICAgICAgICA6IFsuLi5GT1JNX0RFRkFVTFRTLmNvbnRyb2xzXSxcbiAgICBzeXNpbmZvOiBjb25maWcuc3lzaW5mbyB8fCBbXSxcbiAgICB2YWxpZGF0aW9uOiBjb25maWcudmFsaWRhdGlvbiB8fCBbXSxcbiAgICBvbjogY29uZmlnLm9uIHx8IHt9LFxuICB9O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBpbml0aWFsIGZvcm0gc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUluaXRpYWxTdGF0ZSA9IChjb25maWc6IEZvcm1Db25maWcpOiBGb3JtU3RhdGUgPT4ge1xuICBjb25zdCBpbml0aWFsRGF0YSA9IGNvbmZpZy5kYXRhID8geyAuLi5jb25maWcuZGF0YSB9IDoge307XG5cbiAgcmV0dXJuIHtcbiAgICBtb2RpZmllZDogZmFsc2UsXG4gICAgc3VibWl0dGluZzogZmFsc2UsXG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgIGluaXRpYWxEYXRhLFxuICAgIGN1cnJlbnREYXRhOiB7IC4uLmluaXRpYWxEYXRhIH0sXG4gICAgZXJyb3JzOiB7fSxcbiAgfTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgZWxlbWVudCBjb25maWd1cmF0aW9uIGZvciB3aXRoRWxlbWVudFxuICovXG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudENvbmZpZyA9IChjb25maWc6IEZvcm1Db25maWcpID0+IHtcbiAgY29uc3QgcHJlZml4ID0gY29uZmlnLnByZWZpeCB8fCBGT1JNX0RFRkFVTFRTLnByZWZpeDtcbiAgY29uc3QgY29tcG9uZW50TmFtZSA9IGNvbmZpZy5jb21wb25lbnROYW1lIHx8IEZPUk1fREVGQVVMVFMuY29tcG9uZW50TmFtZTtcblxuICBjb25zdCBjbGFzc05hbWVzID0gW2Ake3ByZWZpeH0tJHtjb21wb25lbnROYW1lfWBdO1xuXG4gIGlmIChjb25maWcuY2xhc3MpIHtcbiAgICBjbGFzc05hbWVzLnB1c2goY29uZmlnLmNsYXNzKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdGFnOiBcImRpdlwiLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5qb2luKFwiIFwiKSxcbiAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICBcImRhdGEtY29tcG9uZW50XCI6IGNvbXBvbmVudE5hbWUsXG4gICAgfSxcbiAgfTtcbn07XG5cbi8qKlxuICogRXh0cmFjdHMgZmllbGQgbmFtZSBmcm9tIGEgcHJlZml4ZWQgbmFtZSAoZS5nLiwgJ2luZm8udXNlcm5hbWUnIC0+ICd1c2VybmFtZScpXG4gKi9cbmV4cG9ydCBjb25zdCBleHRyYWN0RmllbGROYW1lID0gKHByZWZpeGVkTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgcGFydHMgPSBwcmVmaXhlZE5hbWUuc3BsaXQoXCIuXCIpO1xuICByZXR1cm4gcGFydHMubGVuZ3RoID4gMSA/IHBhcnRzLnNsaWNlKDEpLmpvaW4oXCIuXCIpIDogcHJlZml4ZWROYW1lO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBmdWxsIGZpZWxkIHBhdGggaW5jbHVkaW5nIHByZWZpeFxuICovXG5leHBvcnQgY29uc3QgZ2V0RmllbGRQYXRoID0gKG5hbWU6IHN0cmluZywgcHJlZml4OiBzdHJpbmcgPSBcImluZm9cIik6IHN0cmluZyA9PiB7XG4gIGlmIChuYW1lLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgIHJldHVybiBuYW1lO1xuICB9XG4gIHJldHVybiBgJHtwcmVmaXh9LiR7bmFtZX1gO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBuYW1lIGlzIGEgZmllbGQgbmFtZSAoc3RhcnRzIHdpdGggaW5mby4gb3IgZGF0YS4pXG4gKi9cbmV4cG9ydCBjb25zdCBpc0ZpZWxkTmFtZSA9IChuYW1lOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIG5hbWUuc3RhcnRzV2l0aChcImluZm8uXCIpIHx8IG5hbWUuc3RhcnRzV2l0aChcImRhdGEuXCIpO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBuYW1lIGlzIGEgZmlsZSBmaWVsZCBuYW1lXG4gKi9cbmV4cG9ydCBjb25zdCBpc0ZpbGVOYW1lID0gKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gbmFtZS5zdGFydHNXaXRoKFwiZmlsZS5cIik7XG59O1xuXG4vKipcbiAqIERlZXAgY29tcGFyaXNvbiBvZiB0d28gdmFsdWVzIGZvciBjaGFuZ2UgZGV0ZWN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBpc1ZhbHVlRXF1YWwgPSAoYTogdW5rbm93biwgYjogdW5rbm93bik6IGJvb2xlYW4gPT4ge1xuICAvLyBIYW5kbGUgbnVsbC91bmRlZmluZWRcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgcmV0dXJuIGEgPT0gYjtcblxuICAvLyBIYW5kbGUgYXJyYXlzXG4gIGlmIChBcnJheS5pc0FycmF5KGEpICYmIEFycmF5LmlzQXJyYXkoYikpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGEuZXZlcnkoKHZhbCwgaWR4KSA9PiBpc1ZhbHVlRXF1YWwodmFsLCBiW2lkeF0pKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBvYmplY3RzXG4gIGlmICh0eXBlb2YgYSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgYiA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IGtleXNBID0gT2JqZWN0LmtleXMoYSBhcyBvYmplY3QpO1xuICAgIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMoYiBhcyBvYmplY3QpO1xuICAgIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBrZXlzQS5ldmVyeSgoa2V5KSA9PlxuICAgICAgaXNWYWx1ZUVxdWFsKFxuICAgICAgICAoYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSxcbiAgICAgICAgKGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvLyBIYW5kbGUgcHJpbWl0aXZlcyAod2l0aCB0eXBlIGNvZXJjaW9uIGZvciBzdHJpbmcvbnVtYmVyIGNvbXBhcmlzb24pXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcbiAgcmV0dXJuIGEgPT0gYjtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIGZvcm0gZGF0YSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwgc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IGhhc0RhdGFDaGFuZ2VkID0gKFxuICBpbml0aWFsOiBGb3JtRGF0YSxcbiAgY3VycmVudDogRm9ybURhdGEsXG4pOiBib29sZWFuID0+IHtcbiAgY29uc3QgYWxsS2V5cyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGluaXRpYWwpLCAuLi5PYmplY3Qua2V5cyhjdXJyZW50KV0pO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIGFsbEtleXMpIHtcbiAgICBpZiAoIWlzVmFsdWVFcXVhbChpbml0aWFsW2tleV0sIGN1cnJlbnRba2V5XSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogR2V0cyBvbmx5IHRoZSBtb2RpZmllZCBmaWVsZHMgYmV0d2VlbiBpbml0aWFsIGFuZCBjdXJyZW50IGRhdGFcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE1vZGlmaWVkRmllbGRzID0gKFxuICBpbml0aWFsOiBGb3JtRGF0YSxcbiAgY3VycmVudDogRm9ybURhdGEsXG4pOiBGb3JtRGF0YSA9PiB7XG4gIGNvbnN0IG1vZGlmaWVkOiBGb3JtRGF0YSA9IHt9O1xuICBjb25zdCBhbGxLZXlzID0gbmV3IFNldChbLi4uT2JqZWN0LmtleXMoaW5pdGlhbCksIC4uLk9iamVjdC5rZXlzKGN1cnJlbnQpXSk7XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgYWxsS2V5cykge1xuICAgIGlmICghaXNWYWx1ZUVxdWFsKGluaXRpYWxba2V5XSwgY3VycmVudFtrZXldKSkge1xuICAgICAgbW9kaWZpZWRba2V5XSA9IGN1cnJlbnRba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbW9kaWZpZWQ7XG59O1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2ZpZWxkcy50c1xuXG4vKipcbiAqIEZpZWxkcyBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogRXh0cmFjdHMgZmllbGRzIGZyb20gbGF5b3V0IGFuZCBtYW5hZ2VzIHRoZSBmaWVsZCByZWdpc3RyeVxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRm9ybUNvbmZpZyxcbiAgQmFzZUZvcm1Db21wb25lbnQsXG4gIEZvcm1GaWVsZCxcbiAgRm9ybUZpZWxkUmVnaXN0cnksXG4gIEZpZWxkVmFsdWUsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgaXNGaWVsZE5hbWUsIGlzRmlsZU5hbWUsIGV4dHJhY3RGaWVsZE5hbWUgfSBmcm9tIFwiLi4vY29uZmlnXCI7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIG9iamVjdCBpcyBhIHZhbGlkIGZvcm0gZmllbGQgY29tcG9uZW50XG4gKiBBIGZvcm0gZmllbGQgbXVzdCBoYXZlIGF0IGxlYXN0IGdldFZhbHVlIG9yIHNldFZhbHVlIG1ldGhvZFxuICovXG5jb25zdCBpc0Zvcm1GaWVsZCA9IChvYmo6IHVua25vd24pOiBvYmogaXMgRm9ybUZpZWxkID0+IHtcbiAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGNhbmRpZGF0ZSA9IG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvLyBNdXN0IGhhdmUgZWxlbWVudCBwcm9wZXJ0eVxuICBpZiAoIWNhbmRpZGF0ZS5lbGVtZW50IHx8ICEoY2FuZGlkYXRlLmVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBNdXN0IGhhdmUgZ2V0VmFsdWUgb3Igc2V0VmFsdWVcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgY2FuZGlkYXRlLmdldFZhbHVlID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICB0eXBlb2YgY2FuZGlkYXRlLnNldFZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgKTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgdmFsdWUgZnJvbSBhIGZpZWxkIGNvbXBvbmVudFxuICogQWxsIG10cmwgY29tcG9uZW50cyBub3cgaGF2ZSB1bmlmaWVkIGdldFZhbHVlKCkgQVBJOlxuICogLSBUZXh0ZmllbGQ6IHJldHVybnMgc3RyaW5nXG4gKiAtIFNlbGVjdDogcmV0dXJucyBzdHJpbmcgb3Igc3RyaW5nW11cbiAqIC0gQ2hpcHM6IHJldHVybnMgc3RyaW5nW11cbiAqIC0gU3dpdGNoL0NoZWNrYm94OiByZXR1cm5zIGJvb2xlYW4gKHVwZGF0ZWQgaW4gbXRybCBjb3JlKVxuICovXG5leHBvcnQgY29uc3QgZ2V0RmllbGRWYWx1ZSA9IChmaWVsZDogRm9ybUZpZWxkKTogRmllbGRWYWx1ZSA9PiB7XG4gIGlmICh0eXBlb2YgZmllbGQuZ2V0VmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBmaWVsZC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLy8gRmFsbGJhY2s6IGNoZWNrIGZvciB2YWx1ZSBwcm9wZXJ0eVxuICBjb25zdCBmaWVsZEFueSA9IGZpZWxkIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmIChcInZhbHVlXCIgaW4gZmllbGRBbnkpIHtcbiAgICByZXR1cm4gZmllbGRBbnkudmFsdWUgYXMgRmllbGRWYWx1ZTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIG9uIGEgZmllbGQgY29tcG9uZW50XG4gKiBBbGwgbXRybCBjb21wb25lbnRzIG5vdyBoYXZlIHVuaWZpZWQgc2V0VmFsdWUoKSBBUEk6XG4gKiAtIFRleHRmaWVsZDogYWNjZXB0cyBzdHJpbmdcbiAqIC0gU2VsZWN0OiBhY2NlcHRzIHN0cmluZyBvciBzdHJpbmdbXVxuICogLSBDaGlwczogYWNjZXB0cyBzdHJpbmdbXVxuICogLSBTd2l0Y2gvQ2hlY2tib3g6IGFjY2VwdHMgYm9vbGVhbiBvciBzdHJpbmcgKFwidHJ1ZVwiL1wiZmFsc2VcIikgKHVwZGF0ZWQgaW4gbXRybCBjb3JlKVxuICpcbiAqIEZvciBzaWxlbnQgdXBkYXRlcyAobm8gY2hhbmdlIGV2ZW50cyksIHdlIHNldCBkaXJlY3RseSBvbiB0aGUgaW5wdXQgZWxlbWVudFxuICovXG5leHBvcnQgY29uc3Qgc2V0RmllbGRWYWx1ZSA9IChcbiAgZmllbGQ6IEZvcm1GaWVsZCxcbiAgdmFsdWU6IEZpZWxkVmFsdWUsXG4gIHNpbGVudDogYm9vbGVhbiA9IGZhbHNlLFxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IGZpZWxkQW55ID0gZmllbGQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgc2VsZWN0IGNvbXBvbmVudCAoaGFzIHRleHRmaWVsZCBwcm9wZXJ0eSlcbiAgLy8gU2VsZWN0IGNvbXBvbmVudHMgbXVzdCBhbHdheXMgdXNlIHNldFZhbHVlIHRvIHVwZGF0ZSBpbnRlcm5hbCBzdGF0ZVxuICBjb25zdCBpc1NlbGVjdENvbXBvbmVudCA9IFwidGV4dGZpZWxkXCIgaW4gZmllbGRBbnkgJiYgXCJtZW51XCIgaW4gZmllbGRBbnk7XG5cbiAgaWYgKHNpbGVudCAmJiAhaXNTZWxlY3RDb21wb25lbnQpIHtcbiAgICAvLyBTaWxlbnQgdXBkYXRlOiBzZXQgZGlyZWN0bHkgb24gaW5wdXQgdG8gYXZvaWQgdHJpZ2dlcmluZyBjaGFuZ2UgZXZlbnRzXG4gICAgLy8gU2tpcCB0aGlzIGZvciBzZWxlY3QgY29tcG9uZW50cyAtIHRoZXkgbmVlZCBzZXRWYWx1ZSB0byB1cGRhdGUgaW50ZXJuYWwgc3RhdGVcbiAgICBjb25zdCBpbnB1dCA9IGZpZWxkQW55LmlucHV0IGFzXG4gICAgICB8IEhUTUxJbnB1dEVsZW1lbnRcbiAgICAgIHwgSFRNTFRleHRBcmVhRWxlbWVudFxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlucHV0KSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgY2hlY2tib3gvc3dpdGNoIChoYXMgY2hlY2tlZCBwcm9wZXJ0eSlcbiAgICAgIC8vIE5lZWQgdG8gbmFycm93IHR5cGUgdG8gSFRNTElucHV0RWxlbWVudCBiZWZvcmUgYWNjZXNzaW5nIGNoZWNrZWRcbiAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgaW5wdXQudHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XG4gICAgICAgIGNvbnN0IHNob3VsZEJlQ2hlY2tlZCA9XG4gICAgICAgICAgdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IFwidHJ1ZVwiIHx8IHZhbHVlID09PSAxO1xuICAgICAgICBpbnB1dC5jaGVja2VkID0gc2hvdWxkQmVDaGVja2VkO1xuICAgICAgICAvLyBVcGRhdGUgdmlzdWFsIHN0YXRlIGJ5IHRvZ2dsaW5nIHRoZSBjaGVja2VkIGNsYXNzXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBmaWVsZEFueS5lbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IEFycmF5LmZyb20oZWxlbWVudC5jbGFzc0xpc3QpO1xuICAgICAgICAgIGNvbnN0IGJhc2VDbGFzcyA9IGNsYXNzTGlzdC5maW5kKFxuICAgICAgICAgICAgKGMpID0+IGMuc3RhcnRzV2l0aChcIm10cmwtXCIpICYmICFjLmluY2x1ZGVzKFwiLS1cIiksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoYmFzZUNsYXNzKSB7XG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoYCR7YmFzZUNsYXNzfS0tY2hlY2tlZGAsIHNob3VsZEJlQ2hlY2tlZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUZXh0IGlucHV0IC0gc2V0IHZhbHVlIGRpcmVjdGx5XG4gICAgICAgIGlucHV0LnZhbHVlID0gKHZhbHVlIGFzIHN0cmluZykgPz8gXCJcIjtcbiAgICAgICAgLy8gVXBkYXRlIHZpc3VhbCBzdGF0ZSAtIHRvZ2dsZSAtLWVtcHR5IGNsYXNzIGJhc2VkIG9uIHZhbHVlXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBmaWVsZEFueS5lbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IEFycmF5LmZyb20oZWxlbWVudC5jbGFzc0xpc3QpO1xuICAgICAgICAgIGNvbnN0IGJhc2VDbGFzcyA9IGNsYXNzTGlzdC5maW5kKFxuICAgICAgICAgICAgKGMpID0+IGMuc3RhcnRzV2l0aChcIm10cmwtXCIpICYmICFjLmluY2x1ZGVzKFwiLS1cIiksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoYmFzZUNsYXNzKSB7XG4gICAgICAgICAgICBjb25zdCBpc0VtcHR5ID0gIWlucHV0LnZhbHVlO1xuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKGAke2Jhc2VDbGFzc30tLWVtcHR5YCwgaXNFbXB0eSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZvciBjb21wb25lbnRzIHdpdGhvdXQgaW5wdXQgKGxpa2UgY2hpcHMsIHNlbGVjdCksIGZhbGwgdGhyb3VnaCB0byBzZXRWYWx1ZVxuICAgIC8vIGJ1dCBzdGlsbCB1c2Ugc2lsZW50IG1vZGUgYmVoYXZpb3IgKG5vIGV2ZW50cyB0cmlnZ2VyZWQpXG4gIH1cblxuICAvLyBOb3JtYWwgdXBkYXRlOiB1c2UgY29tcG9uZW50J3Mgc2V0VmFsdWUgbWV0aG9kXG4gIGlmICh0eXBlb2YgZmllbGQuc2V0VmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGZpZWxkLnNldFZhbHVlKHZhbHVlKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBGYWxsYmFjazogc2V0IHZhbHVlIHByb3BlcnR5IGRpcmVjdGx5XG4gIGlmIChcInZhbHVlXCIgaW4gZmllbGRBbnkpIHtcbiAgICBmaWVsZEFueS52YWx1ZSA9IHZhbHVlO1xuICB9XG59O1xuXG4vKipcbiAqIEV4dHJhY3RzIGZpZWxkcyBmcm9tIHRoZSBVSSBjb21wb25lbnQgcmVnaXN0cnlcbiAqIExvb2tzIGZvciBjb21wb25lbnRzIHdpdGggbmFtZXMgc3RhcnRpbmcgd2l0aCAnaW5mby4nIG9yICdkYXRhLidcbiAqL1xuY29uc3QgZXh0cmFjdEZpZWxkcyA9IChcbiAgdWk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBjb25maWc6IEZvcm1Db25maWcsXG4pOiB7IGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnk7IGZpbGVzOiBGb3JtRmllbGRSZWdpc3RyeSB9ID0+IHtcbiAgY29uc3QgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeSA9IG5ldyBNYXAoKTtcbiAgY29uc3QgZmlsZXM6IEZvcm1GaWVsZFJlZ2lzdHJ5ID0gbmV3IE1hcCgpO1xuXG4gIGlmICghdWkpIHJldHVybiB7IGZpZWxkcywgZmlsZXMgfTtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBjb21wb25lbnRdIG9mIE9iamVjdC5lbnRyaWVzKHVpKSkge1xuICAgIC8vIFNraXAgbm9uLWZpZWxkIGNvbXBvbmVudHNcbiAgICBpZiAoIWlzRm9ybUZpZWxkKGNvbXBvbmVudCkpIGNvbnRpbnVlO1xuXG4gICAgaWYgKGlzRmllbGROYW1lKG5hbWUpKSB7XG4gICAgICAvLyBFeHRyYWN0IGZpZWxkIG5hbWUgd2l0aG91dCBwcmVmaXggKGluZm8udXNlcm5hbWUgLT4gdXNlcm5hbWUpXG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSBleHRyYWN0RmllbGROYW1lKG5hbWUpO1xuICAgICAgZmllbGRzLnNldChmaWVsZE5hbWUsIGNvbXBvbmVudCk7XG4gICAgfSBlbHNlIGlmIChpc0ZpbGVOYW1lKG5hbWUpKSB7XG4gICAgICAvLyBFeHRyYWN0IGZpbGUgbmFtZSB3aXRob3V0IHByZWZpeCAoZmlsZS5hdmF0YXIgLT4gYXZhdGFyKVxuICAgICAgY29uc3QgZmlsZU5hbWUgPSBleHRyYWN0RmllbGROYW1lKG5hbWUpO1xuICAgICAgZmlsZXMuc2V0KGZpbGVOYW1lLCBjb21wb25lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGZpZWxkcywgZmlsZXMgfTtcbn07XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIGZpZWxkIHZhbHVlcyBmb3IgZXF1YWxpdHlcbiAqIEhhbmRsZXMgYXJyYXlzIChmb3IgY2hpcHMvbXVsdGktc2VsZWN0KSBhbmQgcHJpbWl0aXZlIHZhbHVlc1xuICovXG5jb25zdCB2YWx1ZXNFcXVhbCA9IChhOiBGaWVsZFZhbHVlLCBiOiBGaWVsZFZhbHVlKTogYm9vbGVhbiA9PiB7XG4gIC8vIEhhbmRsZSBudWxsL3VuZGVmaW5lZFxuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gSGFuZGxlIGFycmF5cyAoY2hpcHMsIG11bHRpLXNlbGVjdClcbiAgaWYgKEFycmF5LmlzQXJyYXkoYSkgJiYgQXJyYXkuaXNBcnJheShiKSkge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gYS5ldmVyeSgodmFsLCBpKSA9PiB2YWwgPT09IGJbaV0pO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBCaW5kcyBjaGFuZ2UgYW5kIGlucHV0IGV2ZW50cyB0byBmaWVsZHNcbiAqIENhbGxzIHRoZSBwcm92aWRlZCBjYWxsYmFjayB3aGVuIGFueSBmaWVsZCBjaGFuZ2VzXG4gKlxuICogTGlzdGVucyB0byBib3RoICdpbnB1dCcgKGZvciBpbW1lZGlhdGUgZmVlZGJhY2sgd2hpbGUgdHlwaW5nKVxuICogYW5kICdjaGFuZ2UnIChmb3IgY29tcG9uZW50cyB0aGF0IG9ubHkgZW1pdCBvbiBibHVyL3NlbGVjdGlvbilcbiAqXG4gKiBEZWR1cGxpY2F0ZXMgZXZlbnRzIHRvIHByZXZlbnQgZG91YmxlLWZpcmluZyB3aGVuIGJvdGggaW5wdXQgYW5kIGNoYW5nZVxuICogZW1pdCBmb3IgdGhlIHNhbWUgdmFsdWUgKGUuZy4sIHRleHRmaWVsZCBpbnB1dCBmb2xsb3dlZCBieSBibHVyKVxuICovXG4vKipcbiAqIFRyYWNrcyBsYXN0IGVtaXR0ZWQgdmFsdWVzIHBlciBmaWVsZCBmb3IgZGVkdXBsaWNhdGlvblxuICogRXhwb3NlZCBzbyB0aGF0IHNldERhdGEgY2FuIHVwZGF0ZSBpdCB3aGVuIHNldHRpbmcgdmFsdWVzIHNpbGVudGx5XG4gKi9cbmxldCBmaWVsZFZhbHVlVHJhY2tlcjogTWFwPHN0cmluZywgRmllbGRWYWx1ZT4gfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBVcGRhdGVzIHRoZSB0cmFja2VkIHZhbHVlIGZvciBhIGZpZWxkXG4gKiBDYWxsZWQgd2hlbiBzZXREYXRhIGlzIHVzZWQgd2l0aCBzaWxlbnQ9dHJ1ZSB0byBrZWVwIGRlZHVwbGljYXRpb24gaW4gc3luY1xuICovXG5leHBvcnQgY29uc3QgdXBkYXRlVHJhY2tlZEZpZWxkVmFsdWUgPSAoXG4gIG5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IEZpZWxkVmFsdWUsXG4pOiB2b2lkID0+IHtcbiAgaWYgKGZpZWxkVmFsdWVUcmFja2VyKSB7XG4gICAgZmllbGRWYWx1ZVRyYWNrZXIuc2V0KG5hbWUsIHZhbHVlKTtcbiAgfVxufTtcblxuLyoqXG4gKiBVcGRhdGVzIGFsbCB0cmFja2VkIGZpZWxkIHZhbHVlcyBmcm9tIGEgZmllbGRzIHJlZ2lzdHJ5XG4gKiBDYWxsZWQgYWZ0ZXIgc2lsZW50IHNldERhdGEgdG8gc3luYyBkZWR1cGxpY2F0aW9uIHN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBzeW5jVHJhY2tlZEZpZWxkVmFsdWVzID0gKGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnkpOiB2b2lkID0+IHtcbiAgaWYgKGZpZWxkVmFsdWVUcmFja2VyKSB7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgZmllbGRdIG9mIGZpZWxkcykge1xuICAgICAgZmllbGRWYWx1ZVRyYWNrZXIuc2V0KG5hbWUsIGdldEZpZWxkVmFsdWUoZmllbGQpKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUmVzZXRzIHRoZSBmaWVsZCB2YWx1ZSB0cmFja2VyIGZvciBhIG5ldyBmb3JtXG4gKiBTaG91bGQgYmUgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiB3aXRoRmllbGRzIGJlZm9yZSBiaW5kRmllbGRFdmVudHNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlc2V0RmllbGRWYWx1ZVRyYWNrZXIgPSAoKTogdm9pZCA9PiB7XG4gIGZpZWxkVmFsdWVUcmFja2VyID0gbmV3IE1hcDxzdHJpbmcsIEZpZWxkVmFsdWU+KCk7XG59O1xuXG5jb25zdCBiaW5kRmllbGRFdmVudHMgPSAoXG4gIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnksXG4gIG9uRmllbGRDaGFuZ2U6IChuYW1lOiBzdHJpbmcsIHZhbHVlOiBGaWVsZFZhbHVlKSA9PiB2b2lkLFxuKTogdm9pZCA9PiB7XG4gIC8vIFVzZSB0aGUgc2hhcmVkIHRyYWNrZXIgKHNob3VsZCBiZSBpbml0aWFsaXplZCBieSByZXNldEZpZWxkVmFsdWVUcmFja2VyIGJlZm9yZSB0aGlzKVxuICBpZiAoIWZpZWxkVmFsdWVUcmFja2VyKSB7XG4gICAgZmllbGRWYWx1ZVRyYWNrZXIgPSBuZXcgTWFwPHN0cmluZywgRmllbGRWYWx1ZT4oKTtcbiAgfVxuXG4gIGNvbnN0IGxhc3RFbWl0dGVkVmFsdWVzID0gZmllbGRWYWx1ZVRyYWNrZXI7XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgZmllbGRdIG9mIGZpZWxkcykge1xuICAgIGlmICh0eXBlb2YgZmllbGQub24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIGN1cnJlbnQgdmFsdWVcbiAgICAgIGxhc3RFbWl0dGVkVmFsdWVzLnNldChuYW1lLCBnZXRGaWVsZFZhbHVlKGZpZWxkKSk7XG5cbiAgICAgIC8vIEhhbmRsZXIgdGhhdCBkZWR1cGVzIGJhc2VkIG9uIHZhbHVlXG4gICAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0RmllbGRWYWx1ZShmaWVsZCk7XG4gICAgICAgIGNvbnN0IGxhc3RWYWx1ZSA9IGxhc3RFbWl0dGVkVmFsdWVzLmdldChuYW1lKTtcblxuICAgICAgICAvLyBPbmx5IGVtaXQgaWYgdmFsdWUgYWN0dWFsbHkgY2hhbmdlZFxuICAgICAgICBpZiAoIXZhbHVlc0VxdWFsKHZhbHVlLCBsYXN0VmFsdWUpKSB7XG4gICAgICAgICAgbGFzdEVtaXR0ZWRWYWx1ZXMuc2V0KG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICBvbkZpZWxkQ2hhbmdlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gTGlzdGVuIHRvICdpbnB1dCcgZm9yIGltbWVkaWF0ZSBmZWVkYmFjayAodGV4dGZpZWxkcyBlbWl0IHRoaXMgb24gZXZlcnkga2V5c3Ryb2tlKVxuICAgICAgZmllbGQub24oXCJpbnB1dFwiLCBoYW5kbGVDaGFuZ2UpO1xuXG4gICAgICAvLyBBbHNvIGxpc3RlbiB0byAnY2hhbmdlJyBmb3IgY29tcG9uZW50cyB0aGF0IG9ubHkgZW1pdCBvbiBibHVyL3NlbGVjdGlvblxuICAgICAgLy8gKGUuZy4sIHNlbGVjdCwgY2hpcHMsIHN3aXRjaClcbiAgICAgIGZpZWxkLm9uKFwiY2hhbmdlXCIsIGhhbmRsZUNoYW5nZSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIHdpdGhGaWVsZHMgZmVhdHVyZVxuICogQWRkcyBmaWVsZCBleHRyYWN0aW9uIGFuZCByZWdpc3RyeSBtYW5hZ2VtZW50IHRvIHRoZSBmb3JtXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoRmllbGRzID0gKGNvbmZpZzogRm9ybUNvbmZpZykgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBCYXNlRm9ybUNvbXBvbmVudD4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUICYge1xuICAgIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnk7XG4gICAgZmlsZXM6IEZvcm1GaWVsZFJlZ2lzdHJ5O1xuICAgIGdldEZpZWxkOiAobmFtZTogc3RyaW5nKSA9PiBGb3JtRmllbGQgfCB1bmRlZmluZWQ7XG4gICAgZ2V0RmllbGROYW1lczogKCkgPT4gc3RyaW5nW107XG4gICAgaGFzRmllbGQ6IChuYW1lOiBzdHJpbmcpID0+IGJvb2xlYW47XG4gIH0gPT4ge1xuICAgIC8vIEV4dHJhY3QgZmllbGRzIGZyb20gVUkgcmVnaXN0cnlcbiAgICBjb25zdCB7IGZpZWxkcywgZmlsZXMgfSA9IGV4dHJhY3RGaWVsZHMoY29tcG9uZW50LnVpIHx8IHt9LCBjb25maWcpO1xuXG4gICAgLy8gUmVzZXQgdHJhY2tlciBmb3IgdGhpcyBuZXcgZm9ybSBpbnN0YW5jZVxuICAgIC8vIFRoaXMgZW5zdXJlcyBlYWNoIGZvcm0gaGFzIGl0cyBvd24gdHJhY2tlciBhbmQgcHJldmVudHMgY3Jvc3MtZm9ybSBpbnRlcmZlcmVuY2VcbiAgICByZXNldEZpZWxkVmFsdWVUcmFja2VyKCk7XG5cbiAgICAvLyBCaW5kIGNoYW5nZSBldmVudHMgaWYgY29tcG9uZW50IGhhcyBlbWl0XG4gICAgaWYgKGNvbXBvbmVudC5lbWl0KSB7XG4gICAgICBiaW5kRmllbGRFdmVudHMoZmllbGRzLCAobmFtZSwgdmFsdWUpID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImZpZWxkOmNoYW5nZVwiLCB7IG5hbWUsIHZhbHVlIH0pO1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY2hhbmdlXCIsIHsgbmFtZSwgdmFsdWUgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gQWxzbyBiaW5kIGNoYW5nZSBldmVudHMgdG8gZmlsZSBmaWVsZHNcbiAgICAgIGJpbmRGaWVsZEV2ZW50cyhmaWxlcywgKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJmaWxlOmNoYW5nZVwiLCB7IG5hbWUsIHZhbHVlIH0pO1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY2hhbmdlXCIsIHsgbmFtZSwgdmFsdWUgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgZmllbGRzLFxuICAgICAgZmlsZXMsXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGEgZmllbGQgY29tcG9uZW50IGJ5IG5hbWVcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGQobmFtZTogc3RyaW5nKTogRm9ybUZpZWxkIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkcy5nZXQobmFtZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhbGwgZmllbGQgbmFtZXNcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGROYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGZpZWxkcy5rZXlzKCkpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDaGVjayBpZiBhIGZpZWxkIGV4aXN0c1xuICAgICAgICovXG4gICAgICBoYXNGaWVsZChuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkcy5oYXMobmFtZSk7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoRmllbGRzO1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2RhdGEudHNcblxuLyoqXG4gKiBEYXRhIGZlYXR1cmUgZm9yIEZvcm0gY29tcG9uZW50XG4gKiBIYW5kbGVzIGZvcm0gZGF0YSBvcGVyYXRpb25zOiBnZXQvc2V0IGRhdGEsIGNoYW5nZSB0cmFja2luZywgc25hcHNob3RzLFxuICogYW5kIGNoYW5nZSBwcm90ZWN0aW9uIChiZWZvcmV1bmxvYWQgd2FybmluZywgZGF0YSBjb25mbGljdCBkZXRlY3Rpb24pXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGb3JtQ29uZmlnLFxuICBCYXNlRm9ybUNvbXBvbmVudCxcbiAgRm9ybURhdGEsXG4gIEZvcm1TdGF0ZSxcbiAgRmllbGRWYWx1ZSxcbiAgRm9ybUZpZWxkUmVnaXN0cnksXG4gIFByb3RlY3RDaGFuZ2VzQ29uZmlnLFxuICBEYXRhQ29uZmxpY3RFdmVudCxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVJbml0aWFsU3RhdGUsXG4gIGhhc0RhdGFDaGFuZ2VkLFxuICBnZXRNb2RpZmllZEZpZWxkcyxcbn0gZnJvbSBcIi4uL2NvbmZpZ1wiO1xuaW1wb3J0IHsgZ2V0RmllbGRWYWx1ZSwgc2V0RmllbGRWYWx1ZSwgc3luY1RyYWNrZWRGaWVsZFZhbHVlcyB9IGZyb20gXCIuL2ZpZWxkc1wiO1xuaW1wb3J0IHsgRk9STV9FVkVOVFMsIERBVEFfU1RBVEUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQ29sbGVjdHMgY3VycmVudCB2YWx1ZXMgZnJvbSBhbGwgZmllbGRzXG4gKi9cbmNvbnN0IGNvbGxlY3RGaWVsZERhdGEgPSAoZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeSk6IEZvcm1EYXRhID0+IHtcbiAgY29uc3QgZGF0YTogRm9ybURhdGEgPSB7fTtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBmaWVsZF0gb2YgZmllbGRzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBnZXRGaWVsZFZhbHVlKGZpZWxkKTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZGF0YVtuYW1lXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufTtcblxuLyoqXG4gKiBTZXRzIHZhbHVlcyBvbiBmaWVsZHMgZnJvbSBhIGRhdGEgb2JqZWN0XG4gKiBTdXBwb3J0cyBkb3Qgbm90YXRpb24gZm9yIG5lc3RlZCB2YWx1ZXMgKGUuZy4sIHsgJ3VzZXIubmFtZSc6ICdKb2huJyB9KVxuICovXG5jb25zdCBzZXRGaWVsZHNEYXRhID0gKFxuICBmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5LFxuICBkYXRhOiBGb3JtRGF0YSxcbiAgc2lsZW50OiBib29sZWFuID0gZmFsc2UsXG4pOiB2b2lkID0+IHtcbiAgZm9yIChjb25zdCBbbmFtZSwgZmllbGRdIG9mIGZpZWxkcykge1xuICAgIC8vIENoZWNrIGZvciBleGFjdCBtYXRjaCBmaXJzdFxuICAgIGlmIChuYW1lIGluIGRhdGEpIHtcbiAgICAgIHNldEZpZWxkVmFsdWUoZmllbGQsIGRhdGFbbmFtZV0sIHNpbGVudCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgbmVzdGVkIHZhbHVlIHVzaW5nIGRvdCBub3RhdGlvblxuICAgIC8vIGUuZy4sIGZpZWxkIG5hbWUgJ3VzZXJuYW1lJyBtaWdodCBiZSBpbiBkYXRhIGFzIG5lc3RlZCB7IGluZm86IHsgdXNlcm5hbWU6ICd2YWx1ZScgfSB9XG4gICAgY29uc3QgdmFsdWUgPSBnZXROZXN0ZWRWYWx1ZShkYXRhLCBuYW1lKTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2V0RmllbGRWYWx1ZShmaWVsZCwgdmFsdWUgYXMgRmllbGRWYWx1ZSwgc2lsZW50KTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogR2V0cyBhIG5lc3RlZCB2YWx1ZSBmcm9tIGFuIG9iamVjdCB1c2luZyBkb3Qgbm90YXRpb25cbiAqL1xuY29uc3QgZ2V0TmVzdGVkVmFsdWUgPSAoXG4gIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHBhdGg6IHN0cmluZyxcbik6IHVua25vd24gPT4ge1xuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIuXCIpO1xuICBsZXQgY3VycmVudDogdW5rbm93biA9IG9iajtcblxuICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY3VycmVudCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY3VycmVudCA9IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtwYXJ0XTtcbiAgfVxuXG4gIHJldHVybiBjdXJyZW50O1xufTtcblxuLyoqXG4gKiBTZXRzIGEgbmVzdGVkIHZhbHVlIGluIGFuIG9iamVjdCB1c2luZyBkb3Qgbm90YXRpb25cbiAqL1xuY29uc3Qgc2V0TmVzdGVkVmFsdWUgPSAoXG4gIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHBhdGg6IHN0cmluZyxcbiAgdmFsdWU6IHVua25vd24sXG4pOiB2b2lkID0+IHtcbiAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcbiAgbGV0IGN1cnJlbnQgPSBvYmo7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XG4gICAgaWYgKCEocGFydCBpbiBjdXJyZW50KSB8fCB0eXBlb2YgY3VycmVudFtwYXJ0XSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgY3VycmVudFtwYXJ0XSA9IHt9O1xuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0XSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIGN1cnJlbnRbcGFydHNbcGFydHMubGVuZ3RoIC0gMV1dID0gdmFsdWU7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGZsYXQgZmllbGQgZGF0YSB0byBuZXN0ZWQgb2JqZWN0IHN0cnVjdHVyZVxuICogZS5nLiwgeyAndXNlci5uYW1lJzogJ0pvaG4nIH0gLT4geyB1c2VyOiB7IG5hbWU6ICdKb2huJyB9IH1cbiAqL1xuY29uc3QgZmxhdFRvTmVzdGVkID0gKGRhdGE6IEZvcm1EYXRhKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGF0YSkpIHtcbiAgICBpZiAoa2V5LmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgc2V0TmVzdGVkVmFsdWUocmVzdWx0LCBrZXksIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBOb3JtYWxpemVzIHByb3RlY3Rpb24gY29uZmlnIHRvIGEgY29uc2lzdGVudCBvYmplY3QgZm9ybWF0XG4gKi9cbmNvbnN0IG5vcm1hbGl6ZVByb3RlY3RDb25maWcgPSAoXG4gIGNvbmZpZzogYm9vbGVhbiB8IFByb3RlY3RDaGFuZ2VzQ29uZmlnIHwgdW5kZWZpbmVkLFxuKTogUHJvdGVjdENoYW5nZXNDb25maWcgPT4ge1xuICBpZiAoIWNvbmZpZykge1xuICAgIHJldHVybiB7IGJlZm9yZVVubG9hZDogZmFsc2UsIG9uRGF0YU92ZXJ3cml0ZTogZmFsc2UgfTtcbiAgfVxuICBpZiAoY29uZmlnID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHsgYmVmb3JlVW5sb2FkOiB0cnVlLCBvbkRhdGFPdmVyd3JpdGU6IHRydWUgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGJlZm9yZVVubG9hZDogY29uZmlnLmJlZm9yZVVubG9hZCA/PyBmYWxzZSxcbiAgICBvbkRhdGFPdmVyd3JpdGU6IGNvbmZpZy5vbkRhdGFPdmVyd3JpdGUgPz8gZmFsc2UsXG4gIH07XG59O1xuXG4vKipcbiAqIHdpdGhEYXRhIGZlYXR1cmVcbiAqIEFkZHMgZGF0YSBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyB0byB0aGUgZm9ybVxuICovXG5leHBvcnQgY29uc3Qgd2l0aERhdGEgPSAoY29uZmlnOiBGb3JtQ29uZmlnKSA9PiB7XG4gIHJldHVybiA8XG4gICAgVCBleHRlbmRzIEJhc2VGb3JtQ29tcG9uZW50ICYge1xuICAgICAgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeTtcbiAgICAgIGVtaXQ/OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgfSxcbiAgPihcbiAgICBjb21wb25lbnQ6IFQsXG4gICk6IFQgJiB7XG4gICAgc3RhdGU6IEZvcm1TdGF0ZTtcbiAgICBnZXREYXRhOiAoKSA9PiBGb3JtRGF0YTtcbiAgICBzZXREYXRhOiAoZGF0YTogRm9ybURhdGEsIHNpbGVudD86IGJvb2xlYW4pID0+IHZvaWQ7XG4gICAgZ2V0RmllbGRWYWx1ZTogKG5hbWU6IHN0cmluZykgPT4gRmllbGRWYWx1ZTtcbiAgICBzZXRGaWVsZFZhbHVlOiAobmFtZTogc3RyaW5nLCB2YWx1ZTogRmllbGRWYWx1ZSwgc2lsZW50PzogYm9vbGVhbikgPT4gdm9pZDtcbiAgICBpc01vZGlmaWVkOiAoKSA9PiBib29sZWFuO1xuICAgIGdldE1vZGlmaWVkRGF0YTogKCkgPT4gRm9ybURhdGE7XG4gICAgc25hcHNob3Q6ICgpID0+IHZvaWQ7XG4gICAgcmVzZXQ6IChmb3JjZT86IGJvb2xlYW4pID0+IGJvb2xlYW47XG4gICAgY2xlYXI6IChmb3JjZT86IGJvb2xlYW4pID0+IGJvb2xlYW47XG4gIH0gPT4ge1xuICAgIC8vIEluaXRpYWxpemUgc3RhdGVcbiAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUluaXRpYWxTdGF0ZShjb25maWcpO1xuXG4gICAgLy8gTm9ybWFsaXplIHByb3RlY3Rpb24gY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHByb3RlY3RDb25maWcgPSBub3JtYWxpemVQcm90ZWN0Q29uZmlnKGNvbmZpZy5wcm90ZWN0Q2hhbmdlcyk7XG5cbiAgICAvLyBUcmFjayB0aGUgYmVmb3JldW5sb2FkIGhhbmRsZXIgc28gd2UgY2FuIHJlbW92ZSBpdFxuICAgIGxldCBiZWZvcmVVbmxvYWRIYW5kbGVyOiAoKGU6IEJlZm9yZVVubG9hZEV2ZW50KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogQmVmb3JldW5sb2FkIGhhbmRsZXIgLSB3YXJucyB1c2VyIHdoZW4gbGVhdmluZyB3aXRoIHVuc2F2ZWQgY2hhbmdlc1xuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUJlZm9yZVVubG9hZCA9IChlOiBCZWZvcmVVbmxvYWRFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHN0YXRlLm1vZGlmaWVkKSB7XG4gICAgICAgIC8vIFN0YW5kYXJkIHdheSB0byB0cmlnZ2VyIHRoZSBicm93c2VyJ3MgXCJ1bnNhdmVkIGNoYW5nZXNcIiBkaWFsb2dcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAvLyBGb3Igb2xkZXIgYnJvd3NlcnMgLSByZXR1cm5WYWx1ZSBtdXN0IGJlIHNldFxuICAgICAgICBlLnJldHVyblZhbHVlID0gXCJcIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIHRoZSBiZWZvcmV1bmxvYWQgaGFuZGxlciBpZiBwcm90ZWN0aW9uIGlzIGVuYWJsZWRcbiAgICAgKi9cbiAgICBjb25zdCByZWdpc3RlckJlZm9yZVVubG9hZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChwcm90ZWN0Q29uZmlnLmJlZm9yZVVubG9hZCAmJiAhYmVmb3JlVW5sb2FkSGFuZGxlcikge1xuICAgICAgICBiZWZvcmVVbmxvYWRIYW5kbGVyID0gaGFuZGxlQmVmb3JlVW5sb2FkO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZXVubG9hZFwiLCBiZWZvcmVVbmxvYWRIYW5kbGVyKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVW5yZWdpc3RlcnMgdGhlIGJlZm9yZXVubG9hZCBoYW5kbGVyXG4gICAgICovXG4gICAgY29uc3QgdW5yZWdpc3RlckJlZm9yZVVubG9hZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChiZWZvcmVVbmxvYWRIYW5kbGVyKSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsIGJlZm9yZVVubG9hZEhhbmRsZXIpO1xuICAgICAgICBiZWZvcmVVbmxvYWRIYW5kbGVyID0gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBiZWZvcmV1bmxvYWQgcmVnaXN0cmF0aW9uIGJhc2VkIG9uIG1vZGlmaWVkIHN0YXRlXG4gICAgICovXG4gICAgY29uc3QgdXBkYXRlQmVmb3JlVW5sb2FkU3RhdGUgPSAobW9kaWZpZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICAgIGlmIChwcm90ZWN0Q29uZmlnLmJlZm9yZVVubG9hZCkge1xuICAgICAgICBpZiAobW9kaWZpZWQpIHtcbiAgICAgICAgICByZWdpc3RlckJlZm9yZVVubG9hZCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIGtlZXAgdGhlIGhhbmRsZXIgcmVnaXN0ZXJlZCBidXQgaXQgb25seSBwcmV2ZW50cyB1bmxvYWQgd2hlbiBtb2RpZmllZFxuICAgICAgICAvLyBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gY29uc3RhbnRseSBhZGRpbmcvcmVtb3ZpbmcgdGhlIGxpc3RlbmVyXG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIElmIGluaXRpYWwgZGF0YSB3YXMgcHJvdmlkZWQsIHNldCBpdCBvbiBmaWVsZHNcbiAgICBpZiAoY29uZmlnLmRhdGEgJiYgY29tcG9uZW50LmZpZWxkcykge1xuICAgICAgc2V0RmllbGRzRGF0YShjb21wb25lbnQuZmllbGRzLCBjb25maWcuZGF0YSwgdHJ1ZSk7XG4gICAgICBzdGF0ZS5jdXJyZW50RGF0YSA9IGNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcyk7XG4gICAgICBzdGF0ZS5pbml0aWFsRGF0YSA9IHsgLi4uc3RhdGUuY3VycmVudERhdGEgfTtcbiAgICAgIC8vIFN5bmMgdGhlIGZpZWxkIHZhbHVlIHRyYWNrZXIgZm9yIGV2ZW50IGRlZHVwbGljYXRpb25cbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBjaGFuZ2UgZGV0ZWN0aW9uIHdvcmtzIGNvcnJlY3RseSB3aGVuIGZpZWxkcyBhcmUgbW9kaWZpZWRcbiAgICAgIHN5bmNUcmFja2VkRmllbGRWYWx1ZXMoY29tcG9uZW50LmZpZWxkcyk7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBiZWZvcmV1bmxvYWQgcHJvdGVjdGlvbiBpZiBlbmFibGVkXG4gICAgaWYgKHByb3RlY3RDb25maWcuYmVmb3JlVW5sb2FkKSB7XG4gICAgICByZWdpc3RlckJlZm9yZVVubG9hZCgpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZXIgZm9yIGZpZWxkL2ZpbGUgY2hhbmdlcyB0byB1cGRhdGUgc3RhdGVcbiAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoZXZlbnQ6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogRmllbGRWYWx1ZSB9KSA9PiB7XG4gICAgICBzdGF0ZS5jdXJyZW50RGF0YVtldmVudC5uYW1lXSA9IGV2ZW50LnZhbHVlO1xuICAgICAgY29uc3Qgd2FzTW9kaWZpZWQgPSBzdGF0ZS5tb2RpZmllZDtcbiAgICAgIHN0YXRlLm1vZGlmaWVkID0gaGFzRGF0YUNoYW5nZWQoc3RhdGUuaW5pdGlhbERhdGEsIHN0YXRlLmN1cnJlbnREYXRhKTtcblxuICAgICAgLy8gVXBkYXRlIGJlZm9yZXVubG9hZCBzdGF0ZSB3aGVuIG1vZGlmaWVkIGNoYW5nZXNcbiAgICAgIGlmICh3YXNNb2RpZmllZCAhPT0gc3RhdGUubW9kaWZpZWQpIHtcbiAgICAgICAgdXBkYXRlQmVmb3JlVW5sb2FkU3RhdGUoc3RhdGUubW9kaWZpZWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBFbWl0IHN0YXRlOmNoYW5nZSBldmVudCB3aGVuIG1vZGlmaWVkIHN0YXRlIGNoYW5nZXNcbiAgICAgIC8vIFRoaXMgYWxsb3dzIHRoZSBjb250cm9sbGVyIHRvIGVuYWJsZS9kaXNhYmxlIGNvbnRyb2xzIGFjY29yZGluZ2x5XG4gICAgICBpZiAod2FzTW9kaWZpZWQgIT09IHN0YXRlLm1vZGlmaWVkKSB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuU1RBVEVfQ0hBTkdFLCB7XG4gICAgICAgICAgbW9kaWZpZWQ6IHN0YXRlLm1vZGlmaWVkLFxuICAgICAgICAgIHN0YXRlOiBzdGF0ZS5tb2RpZmllZCA/IERBVEFfU1RBVEUuRElSVFkgOiBEQVRBX1NUQVRFLlBSSVNUSU5FLFxuICAgICAgICAgIG5hbWU6IGV2ZW50Lm5hbWUsXG4gICAgICAgICAgdmFsdWU6IGV2ZW50LnZhbHVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gTGlzdGVuIGZvciBmaWVsZCBjaGFuZ2VzIHRvIHVwZGF0ZSBzdGF0ZVxuICAgIGlmIChjb21wb25lbnQub24pIHtcbiAgICAgIGNvbXBvbmVudC5vbihcImZpZWxkOmNoYW5nZVwiLCBoYW5kbGVDaGFuZ2UpO1xuICAgICAgLy8gQWxzbyBsaXN0ZW4gZm9yIGZpbGUgY2hhbmdlc1xuICAgICAgY29tcG9uZW50Lm9uKFwiZmlsZTpjaGFuZ2VcIiwgaGFuZGxlQ2hhbmdlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBwZXJmb3JtIHRoZSBhY3R1YWwgc2V0RGF0YSBvcGVyYXRpb25cbiAgICAgKi9cbiAgICBjb25zdCBwZXJmb3JtU2V0RGF0YSA9IChkYXRhOiBGb3JtRGF0YSwgc2lsZW50OiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgICBzZXRGaWVsZHNEYXRhKGNvbXBvbmVudC5maWVsZHMsIGRhdGEsIHNpbGVudCk7XG4gICAgICBzdGF0ZS5jdXJyZW50RGF0YSA9IGNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcyk7XG5cbiAgICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgLy8gV2hlbiBzZXR0aW5nIGRhdGEgc2lsZW50bHksIGFsc28gdXBkYXRlIGluaXRpYWwgZGF0YSBzbmFwc2hvdFxuICAgICAgICAvLyBUaGlzIGlzIHR5cGljYWxseSB1c2VkIHdoZW4gbG9hZGluZyBkYXRhIGZyb20gc2VydmVyXG4gICAgICAgIHN0YXRlLmluaXRpYWxEYXRhID0geyAuLi5zdGF0ZS5jdXJyZW50RGF0YSB9O1xuICAgICAgICBzdGF0ZS5tb2RpZmllZCA9IGZhbHNlO1xuICAgICAgICAvLyBTeW5jIHRoZSBmaWVsZCB2YWx1ZSB0cmFja2VyIGZvciBldmVudCBkZWR1cGxpY2F0aW9uXG4gICAgICAgIHN5bmNUcmFja2VkRmllbGRWYWx1ZXMoY29tcG9uZW50LmZpZWxkcyk7XG4gICAgICAgIC8vIFVwZGF0ZSBiZWZvcmV1bmxvYWQgc3RhdGUgc2luY2Ugd2UncmUgbm8gbG9uZ2VyIG1vZGlmaWVkXG4gICAgICAgIHVwZGF0ZUJlZm9yZVVubG9hZFN0YXRlKGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuREFUQV9TRVQsIHN0YXRlLmN1cnJlbnREYXRhKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgYWN0dWFsIHJlc2V0IG9wZXJhdGlvblxuICAgICAqL1xuICAgIGNvbnN0IHBlcmZvcm1SZXNldCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHNldEZpZWxkc0RhdGEoY29tcG9uZW50LmZpZWxkcywgc3RhdGUuaW5pdGlhbERhdGEsIHRydWUpO1xuICAgICAgc3RhdGUuY3VycmVudERhdGEgPSB7IC4uLnN0YXRlLmluaXRpYWxEYXRhIH07XG4gICAgICBzdGF0ZS5tb2RpZmllZCA9IGZhbHNlO1xuICAgICAgc3RhdGUuZXJyb3JzID0ge307XG4gICAgICAvLyBVcGRhdGUgYmVmb3JldW5sb2FkIHN0YXRlIHNpbmNlIHdlJ3JlIG5vIGxvbmdlciBtb2RpZmllZFxuICAgICAgdXBkYXRlQmVmb3JlVW5sb2FkU3RhdGUoZmFsc2UpO1xuICAgICAgLy8gRW1pdCBzdGF0ZTpjaGFuZ2Ugc28gcHJvdGVjdGlvbiBvdmVybGF5IGdldHMgcmVtb3ZlZFxuICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5TVEFURV9DSEFOR0UsIHtcbiAgICAgICAgbW9kaWZpZWQ6IGZhbHNlLFxuICAgICAgICBzdGF0ZTogREFUQV9TVEFURS5QUklTVElORSxcbiAgICAgIH0pO1xuICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5SRVNFVCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEludGVybmFsIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIGFjdHVhbCBjbGVhciBvcGVyYXRpb25cbiAgICAgKi9cbiAgICBjb25zdCBwZXJmb3JtQ2xlYXIgPSAoKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBlbXB0eURhdGE6IEZvcm1EYXRhID0ge307XG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgY29tcG9uZW50LmZpZWxkcy5rZXlzKCkpIHtcbiAgICAgICAgZW1wdHlEYXRhW25hbWVdID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHNldEZpZWxkc0RhdGEoY29tcG9uZW50LmZpZWxkcywgZW1wdHlEYXRhLCB0cnVlKTtcbiAgICAgIHN0YXRlLmN1cnJlbnREYXRhID0ge307XG4gICAgICBzdGF0ZS5pbml0aWFsRGF0YSA9IHt9O1xuICAgICAgc3RhdGUubW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgIC8vIFVwZGF0ZSBiZWZvcmV1bmxvYWQgc3RhdGVcbiAgICAgIHVwZGF0ZUJlZm9yZVVubG9hZFN0YXRlKGZhbHNlKTtcbiAgICAgIC8vIEVtaXQgc3RhdGU6Y2hhbmdlIHNvIHByb3RlY3Rpb24gb3ZlcmxheSBnZXRzIHJlbW92ZWRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuU1RBVEVfQ0hBTkdFLCB7XG4gICAgICAgIG1vZGlmaWVkOiBmYWxzZSxcbiAgICAgICAgc3RhdGU6IERBVEFfU1RBVEUuUFJJU1RJTkUsXG4gICAgICB9KTtcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuUkVTRVQpO1xuICAgIH07XG5cbiAgICBjb25zdCBlbmhhbmNlZCA9IHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIHN0YXRlLFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhbGwgZm9ybSBkYXRhXG4gICAgICAgKi9cbiAgICAgIGdldERhdGEoKTogRm9ybURhdGEge1xuICAgICAgICAvLyBBbHdheXMgY29sbGVjdCBmcmVzaCBkYXRhIGZyb20gZmllbGRzXG4gICAgICAgIGNvbnN0IGRhdGEgPSBjb2xsZWN0RmllbGREYXRhKGNvbXBvbmVudC5maWVsZHMpO1xuICAgICAgICBzdGF0ZS5jdXJyZW50RGF0YSA9IGRhdGE7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuREFUQV9HRVQsIGRhdGEpO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IGZvcm0gZGF0YVxuICAgICAgICogQHBhcmFtIGRhdGEgLSBEYXRhIG9iamVjdCB0byBzZXRcbiAgICAgICAqIEBwYXJhbSBzaWxlbnQgLSBJZiB0cnVlLCBkb24ndCBlbWl0IGNoYW5nZSBldmVudHMgYW5kIHVwZGF0ZSBpbml0aWFsIHN0YXRlXG4gICAgICAgKlxuICAgICAgICogV2hlbiBwcm90ZWN0Q2hhbmdlcy5vbkRhdGFPdmVyd3JpdGUgaXMgZW5hYmxlZCBhbmQgdGhlIGZvcm0gaGFzIHVuc2F2ZWQgY2hhbmdlcyxcbiAgICAgICAqIHRoaXMgd2lsbCBlbWl0IGEgJ2RhdGE6Y29uZmxpY3QnIGV2ZW50LiBUaGUgZXZlbnQgaGFuZGxlciBjYW4gY2FsbCBjYW5jZWwoKVxuICAgICAgICogdG8gcHJldmVudCB0aGUgZGF0YSBmcm9tIGJlaW5nIHNldCwgb3IgbGV0IGl0IHByb2NlZWQgYnkgZGVmYXVsdC5cbiAgICAgICAqL1xuICAgICAgc2V0RGF0YShkYXRhOiBGb3JtRGF0YSwgc2lsZW50OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGRhdGEgY29uZmxpY3QgcHJvdGVjdGlvblxuICAgICAgICAvLyBPbmx5IGFwcGxpZXMgd2hlbjpcbiAgICAgICAgLy8gLSBQcm90ZWN0aW9uIGlzIGVuYWJsZWRcbiAgICAgICAgLy8gLSBGb3JtIGhhcyBiZWVuIG1vZGlmaWVkXG4gICAgICAgIC8vIC0gTm90IGEgc2lsZW50IG9wZXJhdGlvbiAoc2lsZW50IGlzIGZvciBsb2FkaW5nIGRhdGEpXG4gICAgICAgIGlmIChwcm90ZWN0Q29uZmlnLm9uRGF0YU92ZXJ3cml0ZSAmJiBzdGF0ZS5tb2RpZmllZCAmJiAhc2lsZW50KSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGNvbmZsaWN0IGV2ZW50XG4gICAgICAgICAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlO1xuICAgICAgICAgIGxldCBwcm9jZWVkZWQgPSBmYWxzZTtcblxuICAgICAgICAgIGNvbnN0IGNvbmZsaWN0RXZlbnQ6IERhdGFDb25mbGljdEV2ZW50ID0ge1xuICAgICAgICAgICAgY3VycmVudERhdGE6IHsgLi4uc3RhdGUuY3VycmVudERhdGEgfSxcbiAgICAgICAgICAgIG5ld0RhdGE6IGRhdGEsXG4gICAgICAgICAgICBjYW5jZWxsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgY2FuY2VsOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGNvbmZsaWN0RXZlbnQuY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcm9jZWVkOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHByb2NlZWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgIHBlcmZvcm1TZXREYXRhKGRhdGEsIHNpbGVudCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBFbWl0IHRoZSBjb25mbGljdCBldmVudFxuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuREFUQV9DT05GTElDVCwgY29uZmxpY3RFdmVudCk7XG5cbiAgICAgICAgICAvLyBJZiBjYW5jZWxsZWQsIGRvbid0IHNldCB0aGUgZGF0YVxuICAgICAgICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiBwcm9jZWVkKCkgd2FzIGNhbGxlZCBpbiB0aGUgaGFuZGxlciwgZGF0YSBpcyBhbHJlYWR5IHNldFxuICAgICAgICAgIGlmIChwcm9jZWVkZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiBuZWl0aGVyIGNhbmNlbCgpIG5vciBwcm9jZWVkKCkgd2FzIGNhbGxlZCwgcHJvY2VlZCBieSBkZWZhdWx0XG4gICAgICAgICAgLy8gVGhpcyBtYWludGFpbnMgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGVyZm9ybSB0aGUgYWN0dWFsIHNldERhdGEgb3BlcmF0aW9uXG4gICAgICAgIHBlcmZvcm1TZXREYXRhKGRhdGEsIHNpbGVudCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhIHNwZWNpZmljIGZpZWxkJ3MgdmFsdWVcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGRWYWx1ZShuYW1lOiBzdHJpbmcpOiBGaWVsZFZhbHVlIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBjb21wb25lbnQuZmllbGRzLmdldChuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgcmV0dXJuIGdldEZpZWxkVmFsdWUoZmllbGQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0ZS5jdXJyZW50RGF0YVtuYW1lXTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IGEgc3BlY2lmaWMgZmllbGQncyB2YWx1ZVxuICAgICAgICovXG4gICAgICBzZXRGaWVsZFZhbHVlKFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHZhbHVlOiBGaWVsZFZhbHVlLFxuICAgICAgICBzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAgICk6IHZvaWQge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGNvbXBvbmVudC5maWVsZHMuZ2V0KG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICBzZXRGaWVsZFZhbHVlKGZpZWxkLCB2YWx1ZSwgc2lsZW50KTtcbiAgICAgICAgICBzdGF0ZS5jdXJyZW50RGF0YVtuYW1lXSA9IHZhbHVlO1xuICAgICAgICAgIHN0YXRlLm1vZGlmaWVkID0gaGFzRGF0YUNoYW5nZWQoc3RhdGUuaW5pdGlhbERhdGEsIHN0YXRlLmN1cnJlbnREYXRhKTtcblxuICAgICAgICAgIC8vIFVwZGF0ZSBiZWZvcmV1bmxvYWQgc3RhdGVcbiAgICAgICAgICB1cGRhdGVCZWZvcmVVbmxvYWRTdGF0ZShzdGF0ZS5tb2RpZmllZCk7XG5cbiAgICAgICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5GSUVMRF9DSEFOR0UsIHsgbmFtZSwgdmFsdWUgfSk7XG4gICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLkNIQU5HRSwgeyBuYW1lLCB2YWx1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgZm9ybSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwgc3RhdGVcbiAgICAgICAqL1xuICAgICAgaXNNb2RpZmllZCgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY3VycmVudERhdGEgPSBjb2xsZWN0RmllbGREYXRhKGNvbXBvbmVudC5maWVsZHMpO1xuICAgICAgICBzdGF0ZS5tb2RpZmllZCA9IGhhc0RhdGFDaGFuZ2VkKHN0YXRlLmluaXRpYWxEYXRhLCBjdXJyZW50RGF0YSk7XG4gICAgICAgIHJldHVybiBzdGF0ZS5tb2RpZmllZDtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IG9ubHkgdGhlIGZpZWxkcyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZFxuICAgICAgICovXG4gICAgICBnZXRNb2RpZmllZERhdGEoKTogRm9ybURhdGEge1xuICAgICAgICBjb25zdCBjdXJyZW50RGF0YSA9IGNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcyk7XG4gICAgICAgIHJldHVybiBnZXRNb2RpZmllZEZpZWxkcyhzdGF0ZS5pbml0aWFsRGF0YSwgY3VycmVudERhdGEpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBUYWtlIGEgc25hcHNob3Qgb2YgY3VycmVudCBkYXRhIGFzIHRoZSBuZXcgYmFzZWxpbmVcbiAgICAgICAqIEZ1dHVyZSBpc01vZGlmaWVkKCkgY2FsbHMgd2lsbCBjb21wYXJlIGFnYWluc3QgdGhpcyBzbmFwc2hvdFxuICAgICAgICovXG4gICAgICBzbmFwc2hvdCgpOiB2b2lkIHtcbiAgICAgICAgc3RhdGUuaW5pdGlhbERhdGEgPSB7IC4uLmNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcykgfTtcbiAgICAgICAgc3RhdGUuY3VycmVudERhdGEgPSB7IC4uLnN0YXRlLmluaXRpYWxEYXRhIH07XG4gICAgICAgIHN0YXRlLm1vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIC8vIFVwZGF0ZSBiZWZvcmV1bmxvYWQgc3RhdGUgc2luY2Ugd2UncmUgbm8gbG9uZ2VyIG1vZGlmaWVkXG4gICAgICAgIHVwZGF0ZUJlZm9yZVVubG9hZFN0YXRlKGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogUmVzZXQgZm9ybSB0byBpbml0aWFsIGRhdGEgc3RhdGVcbiAgICAgICAqXG4gICAgICAgKiBOb3RlOiBQcm90ZWN0aW9uIGlzIGhhbmRsZWQgYnkgdGhlIGJsb2NraW5nIG92ZXJsYXkgaW4gdGhlIHByb3RlY3Rpb24gZmVhdHVyZS5cbiAgICAgICAqIHJlc2V0KCkgbm8gbG9uZ2VyIGVtaXRzIGRhdGE6Y29uZmxpY3QgZXZlbnRzIC0gaXQganVzdCByZXNldHMgdGhlIGZvcm0uXG4gICAgICAgKiBVc2UgZm9yY2UgcGFyYW1ldGVyIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAoaWdub3JlZCkuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtib29sZWFufSBmb3JjZSAtIElnbm9yZWQgKGtlcHQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KVxuICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IEFsd2F5cyByZXR1cm5zIHRydWVcbiAgICAgICAqL1xuICAgICAgcmVzZXQoZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgICAgICBwZXJmb3JtUmVzZXQoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGFsbCBmb3JtIGZpZWxkc1xuICAgICAgICpcbiAgICAgICAqIE5vdGU6IFByb3RlY3Rpb24gaXMgaGFuZGxlZCBieSB0aGUgYmxvY2tpbmcgb3ZlcmxheSBpbiB0aGUgcHJvdGVjdGlvbiBmZWF0dXJlLlxuICAgICAgICogY2xlYXIoKSBubyBsb25nZXIgZW1pdHMgZGF0YTpjb25mbGljdCBldmVudHMgLSBpdCBqdXN0IGNsZWFycyB0aGUgZm9ybS5cbiAgICAgICAqIFVzZSBmb3JjZSBwYXJhbWV0ZXIgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IChpZ25vcmVkKS5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlIC0gSWdub3JlZCAoa2VwdCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpXG4gICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gQWx3YXlzIHJldHVybnMgdHJ1ZVxuICAgICAgICovXG4gICAgICBjbGVhcihmb3JjZTogYm9vbGVhbiA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgICAgIHBlcmZvcm1DbGVhcigpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIFJlZ2lzdGVyIGNsZWFudXAgZm9yIGJlZm9yZXVubG9hZCBoYW5kbGVyIHdoZW4gY29tcG9uZW50IGlzIGRlc3Ryb3llZFxuICAgIC8vIFdlIG5lZWQgdG8gaG9vayBpbnRvIHRoZSBsaWZlY3ljbGUgZGVzdHJveSBtZWNoYW5pc21cbiAgICBjb25zdCBvcmlnaW5hbExpZmVjeWNsZSA9IGNvbXBvbmVudC5saWZlY3ljbGU7XG4gICAgaWYgKG9yaWdpbmFsTGlmZWN5Y2xlKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBvcmlnaW5hbExpZmVjeWNsZS5kZXN0cm95O1xuICAgICAgb3JpZ2luYWxMaWZlY3ljbGUuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgYmVmb3JldW5sb2FkIGhhbmRsZXJcbiAgICAgICAgdW5yZWdpc3RlckJlZm9yZVVubG9hZCgpO1xuICAgICAgICAvLyBDYWxsIG9yaWdpbmFsIGRlc3Ryb3lcbiAgICAgICAgb3JpZ2luYWxEZXN0cm95Py4oKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuaGFuY2VkO1xuICB9O1xufTtcblxuZXhwb3J0IHsgZmxhdFRvTmVzdGVkLCBnZXROZXN0ZWRWYWx1ZSwgc2V0TmVzdGVkVmFsdWUgfTtcbmV4cG9ydCBkZWZhdWx0IHdpdGhEYXRhO1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2NvbnRyb2xsZXIudHNcblxuLyoqXG4gKiBDb250cm9sbGVyIGZlYXR1cmUgZm9yIEZvcm0gY29tcG9uZW50XG4gKiBNYW5hZ2VzIGNvbnRyb2wgYnV0dG9ucyAoc3VibWl0L2NhbmNlbCkgYmFzZWQgb24gZGF0YSBzdGF0ZSAocHJpc3RpbmUvZGlydHkpXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGb3JtQ29uZmlnLFxuICBCYXNlRm9ybUNvbXBvbmVudCxcbiAgRm9ybVN0YXRlLFxuICBGb3JtRmllbGRSZWdpc3RyeSxcbiAgRm9ybUZpZWxkLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERBVEFfU1RBVEUsIEZPUk1fRVZFTlRTLCBGT1JNX0NMQVNTRVMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBGT1JNX0RFRkFVTFRTIH0gZnJvbSBcIi4uL2NvbmZpZ1wiO1xuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGZvcm0ncyBzdGF0ZSBDU1MgY2xhc3NcbiAqL1xuY29uc3QgdXBkYXRlU3RhdGVDbGFzcyA9IChcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIG1vZGlmaWVkOiBib29sZWFuLFxuICBwcmVmaXg6IHN0cmluZyxcbiAgY29tcG9uZW50TmFtZTogc3RyaW5nLFxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IG1vZGlmaWVkQ2xhc3MgPSBgJHtwcmVmaXh9LSR7Y29tcG9uZW50TmFtZX0tLSR7Rk9STV9DTEFTU0VTLk1PRElGSUVEfWA7XG4gIGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShtb2RpZmllZENsYXNzLCBtb2RpZmllZCk7XG59O1xuXG4vKipcbiAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgYWxsIGZvcm0gZmllbGRzXG4gKi9cbmNvbnN0IHNldEZpZWxkc0VuYWJsZWQgPSAoXG4gIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnksXG4gIGVuYWJsZWQ6IGJvb2xlYW4sXG4pOiB2b2lkID0+IHtcbiAgZm9yIChjb25zdCBbLCBmaWVsZF0gb2YgZmllbGRzKSB7XG4gICAgaWYgKGVuYWJsZWQgJiYgdHlwZW9mIGZpZWxkLmVuYWJsZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBmaWVsZC5lbmFibGUoKTtcbiAgICB9IGVsc2UgaWYgKCFlbmFibGVkICYmIHR5cGVvZiBmaWVsZC5kaXNhYmxlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGZpZWxkLmRpc2FibGUoKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogR2V0cyBjb250cm9sIGJ1dHRvbiBjb21wb25lbnRzIGZyb20gdGhlIFVJIHJlZ2lzdHJ5XG4gKi9cbmNvbnN0IGdldENvbnRyb2xCdXR0b25zID0gKFxuICB1aTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGNvbnRyb2xOYW1lczogc3RyaW5nW10sXG4pOiBNYXA8c3RyaW5nLCBGb3JtRmllbGQ+ID0+IHtcbiAgY29uc3QgY29udHJvbHMgPSBuZXcgTWFwPHN0cmluZywgRm9ybUZpZWxkPigpO1xuXG4gIGZvciAoY29uc3QgbmFtZSBvZiBjb250cm9sTmFtZXMpIHtcbiAgICBjb25zdCBjb250cm9sID0gdWlbbmFtZV07XG4gICAgaWYgKGNvbnRyb2wgJiYgdHlwZW9mIGNvbnRyb2wgPT09IFwib2JqZWN0XCIgJiYgXCJlbGVtZW50XCIgaW4gY29udHJvbCkge1xuICAgICAgY29udHJvbHMuc2V0KG5hbWUsIGNvbnRyb2wgYXMgRm9ybUZpZWxkKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29udHJvbHM7XG59O1xuXG4vKipcbiAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgY29udHJvbCBidXR0b25zXG4gKi9cbmNvbnN0IHNldENvbnRyb2xzRW5hYmxlZCA9IChcbiAgY29udHJvbHM6IE1hcDxzdHJpbmcsIEZvcm1GaWVsZD4sXG4gIGVuYWJsZWQ6IGJvb2xlYW4sXG4pOiB2b2lkID0+IHtcbiAgZm9yIChjb25zdCBbLCBjb250cm9sXSBvZiBjb250cm9scykge1xuICAgIGlmIChlbmFibGVkICYmIHR5cGVvZiBjb250cm9sLmVuYWJsZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb250cm9sLmVuYWJsZSgpO1xuICAgIH0gZWxzZSBpZiAoIWVuYWJsZWQgJiYgdHlwZW9mIGNvbnRyb2wuZGlzYWJsZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb250cm9sLmRpc2FibGUoKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogd2l0aENvbnRyb2xsZXIgZmVhdHVyZVxuICogQWRkcyBjb250cm9sIGJ1dHRvbiBoYW5kbGluZyBiYXNlZCBvbiBkYXRhIHN0YXRlIChwcmlzdGluZS9kaXJ0eSlcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhDb250cm9sbGVyID0gKGNvbmZpZzogRm9ybUNvbmZpZykgPT4ge1xuICByZXR1cm4gPFxuICAgIFQgZXh0ZW5kcyBCYXNlRm9ybUNvbXBvbmVudCAmIHtcbiAgICAgIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnk7XG4gICAgICBzdGF0ZTogRm9ybVN0YXRlO1xuICAgICAgZW1pdD86IChldmVudDogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gdm9pZDtcbiAgICAgIG9uPzogKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKSA9PiB2b2lkO1xuICAgIH0sXG4gID4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUICYge1xuICAgIGNvbnRyb2xzOiBNYXA8c3RyaW5nLCBGb3JtRmllbGQ+O1xuICAgIGdldERhdGFTdGF0ZTogKCkgPT4gc3RyaW5nO1xuICAgIGVuYWJsZUNvbnRyb2xzOiAoKSA9PiB2b2lkO1xuICAgIGRpc2FibGVDb250cm9sczogKCkgPT4gdm9pZDtcbiAgICBlbmFibGVGaWVsZHM6ICgpID0+IHZvaWQ7XG4gICAgZGlzYWJsZUZpZWxkczogKCkgPT4gdm9pZDtcbiAgfSA9PiB7XG4gICAgY29uc3QgcHJlZml4ID0gY29uZmlnLnByZWZpeCB8fCBGT1JNX0RFRkFVTFRTLnByZWZpeDtcbiAgICBjb25zdCBjb21wb25lbnROYW1lID0gY29uZmlnLmNvbXBvbmVudE5hbWUgfHwgRk9STV9ERUZBVUxUUy5jb21wb25lbnROYW1lO1xuICAgIGNvbnN0IGNvbnRyb2xOYW1lcyA9IGNvbmZpZy5jb250cm9sc1xuICAgICAgPyBbLi4uY29uZmlnLmNvbnRyb2xzXVxuICAgICAgOiBbLi4uRk9STV9ERUZBVUxUUy5jb250cm9sc107XG5cbiAgICAvLyBHZXQgY29udHJvbCBidXR0b25zIGZyb20gVUlcbiAgICBjb25zdCBjb250cm9scyA9IGNvbnRyb2xOYW1lc1xuICAgICAgPyBnZXRDb250cm9sQnV0dG9ucyhjb21wb25lbnQudWkgfHwge30sIGNvbnRyb2xOYW1lcylcbiAgICAgIDogbmV3IE1hcDxzdHJpbmcsIEZvcm1GaWVsZD4oKTtcblxuICAgIC8vIEluaXRpYWxpemUgY29udHJvbHMgYXMgZGlzYWJsZWQgKHByaXN0aW5lIHN0YXRlKVxuICAgIGlmIChjb250cm9scy5zaXplID4gMCkge1xuICAgICAgc2V0Q29udHJvbHNFbmFibGVkKGNvbnRyb2xzLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5oYW5jZWQgPSB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBjb250cm9scyxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgY3VycmVudCBkYXRhIHN0YXRlIChwcmlzdGluZSBvciBkaXJ0eSlcbiAgICAgICAqL1xuICAgICAgZ2V0RGF0YVN0YXRlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuc3RhdGUubW9kaWZpZWRcbiAgICAgICAgICA/IERBVEFfU1RBVEUuRElSVFlcbiAgICAgICAgICA6IERBVEFfU1RBVEUuUFJJU1RJTkU7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVuYWJsZSBjb250cm9sIGJ1dHRvbnNcbiAgICAgICAqL1xuICAgICAgZW5hYmxlQ29udHJvbHMoKTogdm9pZCB7XG4gICAgICAgIHNldENvbnRyb2xzRW5hYmxlZChjb250cm9scywgdHJ1ZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgY29udHJvbCBidXR0b25zXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVDb250cm9scygpOiB2b2lkIHtcbiAgICAgICAgc2V0Q29udHJvbHNFbmFibGVkKGNvbnRyb2xzLCBmYWxzZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVuYWJsZSBhbGwgZm9ybSBmaWVsZHNcbiAgICAgICAqL1xuICAgICAgZW5hYmxlRmllbGRzKCk6IHZvaWQge1xuICAgICAgICBzZXRGaWVsZHNFbmFibGVkKGNvbXBvbmVudC5maWVsZHMsIHRydWUpO1xuICAgICAgICBjb21wb25lbnQuc3RhdGUuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZSBhbGwgZm9ybSBmaWVsZHNcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZUZpZWxkcygpOiB2b2lkIHtcbiAgICAgICAgc2V0RmllbGRzRW5hYmxlZChjb21wb25lbnQuZmllbGRzLCBmYWxzZSk7XG4gICAgICAgIGNvbXBvbmVudC5zdGF0ZS5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBMaXN0ZW4gZm9yIHN0YXRlIGNoYW5nZXMgdG8gZW5hYmxlL2Rpc2FibGUgY29udHJvbHNcbiAgICBpZiAoY29uZmlnLnVzZUNoYW5nZXMgIT09IGZhbHNlICYmIGNvbXBvbmVudC5vbikge1xuICAgICAgY29tcG9uZW50Lm9uKFxuICAgICAgICBGT1JNX0VWRU5UUy5TVEFURV9DSEFOR0UsXG4gICAgICAgIChldmVudDogeyBtb2RpZmllZDogYm9vbGVhbjsgc3RhdGU6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50Lm1vZGlmaWVkKSB7XG4gICAgICAgICAgICAvLyBEYXRhIGlzIGRpcnR5IC0gZW5hYmxlIGNvbnRyb2xzXG4gICAgICAgICAgICBzZXRDb250cm9sc0VuYWJsZWQoY29udHJvbHMsIHRydWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBEYXRhIGlzIHByaXN0aW5lIC0gZGlzYWJsZSBjb250cm9sc1xuICAgICAgICAgICAgc2V0Q29udHJvbHNFbmFibGVkKGNvbnRyb2xzLCBmYWxzZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVXBkYXRlIENTUyBjbGFzc1xuICAgICAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICAgICAgdXBkYXRlU3RhdGVDbGFzcyhcbiAgICAgICAgICAgICAgY29tcG9uZW50LmVsZW1lbnQsXG4gICAgICAgICAgICAgIGV2ZW50Lm1vZGlmaWVkLFxuICAgICAgICAgICAgICBwcmVmaXgsXG4gICAgICAgICAgICAgIGNvbXBvbmVudE5hbWUsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuaGFuY2VkO1xuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgd2l0aENvbnRyb2xsZXI7XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL2Zvcm0vZmVhdHVyZXMvc3VibWl0LnRzXG5cbi8qKlxuICogU3VibWl0IGZlYXR1cmUgZm9yIEZvcm0gY29tcG9uZW50XG4gKiBIYW5kbGVzIGZvcm0gdmFsaWRhdGlvbiBhbmQgc3VibWlzc2lvbiB3aXRoIGF1dG9tYXRpYyBmaWVsZCBlcnJvciBkaXNwbGF5XG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGb3JtQ29uZmlnLFxuICBCYXNlRm9ybUNvbXBvbmVudCxcbiAgRm9ybURhdGEsXG4gIEZvcm1TdGF0ZSxcbiAgRm9ybUZpZWxkUmVnaXN0cnksXG4gIEZvcm1GaWVsZCxcbiAgRm9ybVZhbGlkYXRpb25SdWxlLFxuICBGb3JtVmFsaWRhdGlvblJlc3VsdCxcbiAgRm9ybVN1Ym1pdE9wdGlvbnMsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgRk9STV9FVkVOVFMsIEZPUk1fQ0xBU1NFUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBEZWZhdWx0IGhlYWRlcnMgZm9yIEpTT04gcmVxdWVzdHNcbiAqL1xuY29uc3QgREVGQVVMVF9IRUFERVJTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIGZvcm0gZGF0YSBhZ2FpbnN0IHZhbGlkYXRpb24gcnVsZXNcbiAqL1xuY29uc3QgdmFsaWRhdGVEYXRhID0gKFxuICBkYXRhOiBGb3JtRGF0YSxcbiAgcnVsZXM6IEZvcm1WYWxpZGF0aW9uUnVsZVtdLFxuKTogRm9ybVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBjb25zdCBlcnJvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgbGV0IHZhbGlkID0gdHJ1ZTtcblxuICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGRhdGFbcnVsZS5maWVsZF07XG4gICAgY29uc3QgcmVzdWx0ID0gcnVsZS52YWxpZGF0ZSh2YWx1ZSwgZGF0YSk7XG5cbiAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIGVycm9yc1tydWxlLmZpZWxkXSA9IHJ1bGUubWVzc2FnZSB8fCBgJHtydWxlLmZpZWxkfSBpcyBpbnZhbGlkYDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICBlcnJvcnNbcnVsZS5maWVsZF0gPSByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgdmFsaWQsIGVycm9ycyB9O1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBzaW5nbGUgZmllbGQgYWdhaW5zdCBpdHMgdmFsaWRhdGlvbiBydWxlc1xuICovXG5jb25zdCB2YWxpZGF0ZUZpZWxkID0gKFxuICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgZGF0YTogRm9ybURhdGEsXG4gIHJ1bGVzOiBGb3JtVmFsaWRhdGlvblJ1bGVbXSxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IGZpZWxkUnVsZXMgPSBydWxlcy5maWx0ZXIoKHJ1bGUpID0+IHJ1bGUuZmllbGQgPT09IGZpZWxkTmFtZSk7XG5cbiAgZm9yIChjb25zdCBydWxlIG9mIGZpZWxkUnVsZXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGRhdGFbcnVsZS5maWVsZF07XG4gICAgY29uc3QgcmVzdWx0ID0gcnVsZS52YWxpZGF0ZSh2YWx1ZSwgZGF0YSk7XG5cbiAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHJ1bGUubWVzc2FnZSB8fCBgJHtydWxlLmZpZWxkfSBpcyBpbnZhbGlkYDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgdGhlIGFjdHVhbCBIVFRQIHJlcXVlc3RcbiAqL1xuY29uc3QgcGVyZm9ybVJlcXVlc3QgPSBhc3luYyAoXG4gIHVybDogc3RyaW5nLFxuICBkYXRhOiBGb3JtRGF0YSxcbiAgb3B0aW9uczogRm9ybVN1Ym1pdE9wdGlvbnMsXG4pOiBQcm9taXNlPHVua25vd24+ID0+IHtcbiAgY29uc3QgbWV0aG9kID0gb3B0aW9ucy5tZXRob2QgfHwgXCJQT1NUXCI7XG4gIGNvbnN0IGhlYWRlcnMgPSB7IC4uLkRFRkFVTFRfSEVBREVSUywgLi4ub3B0aW9ucy5oZWFkZXJzIH07XG5cbiAgY29uc3QgZmV0Y2hPcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHtcbiAgICBtZXRob2QsXG4gICAgaGVhZGVycyxcbiAgfTtcblxuICAvLyBBZGQgYm9keSBmb3Igbm9uLUdFVCByZXF1ZXN0c1xuICBpZiAobWV0aG9kICE9PSBcIkdFVFwiKSB7XG4gICAgZmV0Y2hPcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCBmZXRjaE9wdGlvbnMpO1xuXG4gIC8vIFBhcnNlIHJlc3BvbnNlXG4gIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIik7XG4gIGxldCByZXN1bHQ6IHVua25vd247XG5cbiAgaWYgKGNvbnRlbnRUeXBlICYmIGNvbnRlbnRUeXBlLmluY2x1ZGVzKFwiYXBwbGljYXRpb24vanNvblwiKSkge1xuICAgIHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gIH1cblxuICAvLyBDaGVjayBmb3IgSFRUUCBlcnJvcnNcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIC8vIFRyeSB0byBleHRyYWN0IGVycm9yIG1lc3NhZ2UgZnJvbSBzZXJ2ZXIgcmVzcG9uc2VcbiAgICBsZXQgZXJyb3JNZXNzYWdlID0gYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YDtcbiAgICBpZiAocmVzdWx0ICYmIHR5cGVvZiByZXN1bHQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGNvbnN0IHNlcnZlckVycm9yID0gKHJlc3VsdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuZXJyb3I7XG4gICAgICBpZiAodHlwZW9mIHNlcnZlckVycm9yID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGVycm9yTWVzc2FnZSA9IHNlcnZlckVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgIChlcnJvciBhcyBFcnJvciAmIHsgcmVzcG9uc2U6IHVua25vd24gfSkucmVzcG9uc2UgPSByZXN1bHQ7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiB3aXRoU3VibWl0IGZlYXR1cmVcbiAqIEFkZHMgdmFsaWRhdGlvbiBhbmQgc3VibWlzc2lvbiBjYXBhYmlsaXRpZXMgdG8gdGhlIGZvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhTdWJtaXQgPSAoY29uZmlnOiBGb3JtQ29uZmlnKSA9PiB7XG4gIHJldHVybiA8XG4gICAgVCBleHRlbmRzIEJhc2VGb3JtQ29tcG9uZW50ICYge1xuICAgICAgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeTtcbiAgICAgIHN0YXRlOiBGb3JtU3RhdGU7XG4gICAgICBnZXREYXRhOiAoKSA9PiBGb3JtRGF0YTtcbiAgICAgIGdldE1vZGlmaWVkRGF0YTogKCkgPT4gRm9ybURhdGE7XG4gICAgICBkaXNhYmxlQ29udHJvbHM6ICgpID0+IHZvaWQ7XG4gICAgICBzbmFwc2hvdDogKCkgPT4gdm9pZDtcbiAgICAgIGVtaXQ/OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgICBvbj86IChldmVudDogc3RyaW5nLCBoYW5kbGVyOiAoZGF0YTogdW5rbm93bikgPT4gdm9pZCkgPT4gdm9pZDtcbiAgICB9LFxuICA+KFxuICAgIGNvbXBvbmVudDogVCxcbiAgKTogVCAmIHtcbiAgICB2YWxpZGF0ZTogKCkgPT4gRm9ybVZhbGlkYXRpb25SZXN1bHQ7XG4gICAgdmFsaWRhdGVGaWVsZDogKGZpZWxkTmFtZTogc3RyaW5nKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgc3VibWl0OiAob3B0aW9ucz86IEZvcm1TdWJtaXRPcHRpb25zKSA9PiBQcm9taXNlPHVua25vd24+O1xuICAgIHNldFZhbGlkYXRpb25SdWxlczogKHJ1bGVzOiBGb3JtVmFsaWRhdGlvblJ1bGVbXSkgPT4gdm9pZDtcbiAgICBjbGVhckVycm9yczogKCkgPT4gdm9pZDtcbiAgICBjbGVhckZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nKSA9PiB2b2lkO1xuICAgIHNldEZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nLCBlcnJvcjogc3RyaW5nKSA9PiB2b2lkO1xuICAgIGdldEZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIH0gPT4ge1xuICAgIC8vIFZhbGlkYXRpb24gcnVsZXMgY2FuIGJlIHVwZGF0ZWQgYXQgcnVudGltZVxuICAgIGxldCB2YWxpZGF0aW9uUnVsZXMgPSBjb25maWcudmFsaWRhdGlvbiB8fCBbXTtcblxuICAgIC8vIFdoZXRoZXIgdG8gc2hvdyBlcnJvciBtZXNzYWdlcyBpbiBmaWVsZCBoZWxwZXIgdGV4dCAoZGVmYXVsdDogdHJ1ZSlcbiAgICBjb25zdCBzaG93TWVzc2FnZXMgPSBjb25maWcuc2hvd0ZpZWxkRXJyb3JNZXNzYWdlcyAhPT0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyBvciBjbGVhcnMgZXJyb3Igb24gYSBmaWVsZCBjb21wb25lbnRcbiAgICAgKi9cbiAgICBjb25zdCBzaG93RmllbGRFcnJvciA9IChcbiAgICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgICAgZXJyb3I6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkID0gY29tcG9uZW50LmZpZWxkcy5nZXQoZmllbGROYW1lKSBhcyBGb3JtRmllbGQgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoZmllbGQgJiYgdHlwZW9mIGZpZWxkLnNldEVycm9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgLy8gT25seSBwYXNzIG1lc3NhZ2UgaWYgc2hvd0ZpZWxkRXJyb3JNZXNzYWdlcyBpcyBlbmFibGVkXG4gICAgICAgICAgZmllbGQuc2V0RXJyb3IodHJ1ZSwgc2hvd01lc3NhZ2VzID8gZXJyb3IgOiB1bmRlZmluZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFBhc3MgZW1wdHkgc3RyaW5nIHRvIGFsc28gY2xlYXIgdGhlIGhlbHBlci9zdXBwb3J0aW5nIHRleHQgbWVzc2FnZVxuICAgICAgICAgIGZpZWxkLnNldEVycm9yKGZhbHNlLCBcIlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyBlcnJvcnMgb24gYWxsIGZpZWxkIGNvbXBvbmVudHNcbiAgICAgKi9cbiAgICBjb25zdCBzaG93QWxsRmllbGRFcnJvcnMgPSAoZXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogdm9pZCA9PiB7XG4gICAgICAvLyBDbGVhciBhbGwgZmllbGQgZXJyb3JzIGZpcnN0XG4gICAgICBmb3IgKGNvbnN0IFtmaWVsZE5hbWVdIG9mIGNvbXBvbmVudC5maWVsZHMpIHtcbiAgICAgICAgc2hvd0ZpZWxkRXJyb3IoZmllbGROYW1lLCB1bmRlZmluZWQpO1xuICAgICAgfVxuICAgICAgLy8gU2hvdyBuZXcgZXJyb3JzXG4gICAgICBmb3IgKGNvbnN0IFtmaWVsZE5hbWUsIGVycm9yXSBvZiBPYmplY3QuZW50cmllcyhlcnJvcnMpKSB7XG4gICAgICAgIHNob3dGaWVsZEVycm9yKGZpZWxkTmFtZSwgZXJyb3IpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBMaXN0ZW4gZm9yIGZpZWxkIGNoYW5nZXMgdG8gYXV0by1jbGVhci9yZXZhbGlkYXRlIGVycm9yc1xuICAgIGlmIChjb21wb25lbnQub24pIHtcbiAgICAgIC8vIENsZWFyIHZpc3VhbCBlcnJvcnMgd2hlbiBmb3JtIGlzIHJlc2V0XG4gICAgICBjb21wb25lbnQub24oXCJyZXNldFwiLCAoKSA9PiB7XG4gICAgICAgIHNob3dBbGxGaWVsZEVycm9ycyh7fSk7XG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50Lm9uKFwiZmllbGQ6Y2hhbmdlXCIsIChldmVudDogdW5rbm93bikgPT4ge1xuICAgICAgICBjb25zdCB7IG5hbWUgfSA9IGV2ZW50IGFzIHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9O1xuXG4gICAgICAgIC8vIElmIHRoaXMgZmllbGQgaGFkIGFuIGVycm9yLCByZS12YWxpZGF0ZSBpdFxuICAgICAgICBpZiAoY29tcG9uZW50LnN0YXRlLmVycm9yc1tuYW1lXSkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBjb21wb25lbnQuZ2V0RGF0YSgpO1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdGVGaWVsZChuYW1lLCBkYXRhLCB2YWxpZGF0aW9uUnVsZXMpO1xuXG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBTdGlsbCBoYXMgZXJyb3IgLSB1cGRhdGUgbWVzc2FnZVxuICAgICAgICAgICAgY29tcG9uZW50LnN0YXRlLmVycm9yc1tuYW1lXSA9IGVycm9yO1xuICAgICAgICAgICAgc2hvd0ZpZWxkRXJyb3IobmFtZSwgZXJyb3IpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGaWVsZCBpcyBub3cgdmFsaWQgLSBjbGVhciBlcnJvclxuICAgICAgICAgICAgZGVsZXRlIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnNbbmFtZV07XG4gICAgICAgICAgICBzaG93RmllbGRFcnJvcihuYW1lLCB1bmRlZmluZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5oYW5jZWQgPSB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIC8qKlxuICAgICAgICogVmFsaWRhdGUgZm9ybSBkYXRhIGFnYWluc3QgY29uZmlndXJlZCBydWxlc1xuICAgICAgICogQXV0b21hdGljYWxseSBzaG93cyBlcnJvcnMgb24gZmllbGQgY29tcG9uZW50c1xuICAgICAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCB2YWxpZCBmbGFnIGFuZCBlcnJvcnMgb2JqZWN0XG4gICAgICAgKi9cbiAgICAgIHZhbGlkYXRlKCk6IEZvcm1WYWxpZGF0aW9uUmVzdWx0IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbGlkYXRlRGF0YShkYXRhLCB2YWxpZGF0aW9uUnVsZXMpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzdGF0ZSB3aXRoIHZhbGlkYXRpb24gZXJyb3JzXG4gICAgICAgIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnMgPSByZXN1bHQuZXJyb3JzO1xuXG4gICAgICAgIC8vIFNob3cgZXJyb3JzIG9uIGZpZWxkIGNvbXBvbmVudHNcbiAgICAgICAgc2hvd0FsbEZpZWxkRXJyb3JzKHJlc3VsdC5lcnJvcnMpO1xuXG4gICAgICAgIC8vIEVtaXQgdmFsaWRhdGlvbiBldmVudCBpZiB0aGVyZSBhcmUgZXJyb3JzXG4gICAgICAgIGlmICghcmVzdWx0LnZhbGlkKSB7XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5WQUxJREFUSU9OX0VSUk9SLCByZXN1bHQuZXJyb3JzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFZhbGlkYXRlIGEgc2luZ2xlIGZpZWxkXG4gICAgICAgKiBAcmV0dXJucyBFcnJvciBtZXNzYWdlIGlmIGludmFsaWQsIHVuZGVmaW5lZCBpZiB2YWxpZFxuICAgICAgICovXG4gICAgICB2YWxpZGF0ZUZpZWxkKGZpZWxkTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdGVGaWVsZChmaWVsZE5hbWUsIGRhdGEsIHZhbGlkYXRpb25SdWxlcyk7XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgY29tcG9uZW50LnN0YXRlLmVycm9yc1tmaWVsZE5hbWVdID0gZXJyb3I7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnNbZmllbGROYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNob3dGaWVsZEVycm9yKGZpZWxkTmFtZSwgZXJyb3IpO1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFN1Ym1pdCB0aGUgZm9ybVxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBzdWJtaXQgY29uZmlndXJhdGlvblxuICAgICAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHNlcnZlciByZXNwb25zZVxuICAgICAgICovXG4gICAgICBhc3luYyBzdWJtaXQob3B0aW9uczogRm9ybVN1Ym1pdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICAvLyBQcmV2ZW50IGRvdWJsZSBzdWJtaXNzaW9uXG4gICAgICAgIGlmIChjb21wb25lbnQuc3RhdGUuc3VibWl0dGluZykge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJGb3JtIGlzIGFscmVhZHkgc3VibWl0dGluZ1wiKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSBpZiByZXF1ZXN0ZWQgKGRlZmF1bHQ6IHRydWUpXG4gICAgICAgIGlmIChvcHRpb25zLnZhbGlkYXRlICE9PSBmYWxzZSAmJiB2YWxpZGF0aW9uUnVsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICAgICAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVmFsaWRhdGlvbiBmYWlsZWRcIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hcmsgYXMgc3VibWl0dGluZ1xuICAgICAgICBjb21wb25lbnQuc3RhdGUuc3VibWl0dGluZyA9IHRydWU7XG5cbiAgICAgICAgLy8gQWRkIHN1Ym1pdHRpbmcgY2xhc3MgdG8gZWxlbWVudFxuICAgICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWcucHJlZml4IHx8IFwibXRybFwiO1xuICAgICAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBjb25maWcuY29tcG9uZW50TmFtZSB8fCBcImZvcm1cIjtcbiAgICAgICAgICBjb21wb25lbnQuZWxlbWVudC5jbGFzc0xpc3QuYWRkKFxuICAgICAgICAgICAgYCR7cHJlZml4fS0ke2NvbXBvbmVudE5hbWV9LS0ke0ZPUk1fQ0xBU1NFUy5TVUJNSVRUSU5HfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgc3VibWl0IGV2ZW50XG4gICAgICAgIGNvbnN0IGRhdGEgPSBjb21wb25lbnQuZ2V0RGF0YSgpO1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLlNVQk1JVCwgZGF0YSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsZXQgcmVzdWx0OiB1bmtub3duO1xuXG4gICAgICAgICAgLy8gVXNlIGN1c3RvbSBoYW5kbGVyIGlmIHByb3ZpZGVkXG4gICAgICAgICAgaWYgKG9wdGlvbnMuaGFuZGxlcikge1xuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgb3B0aW9ucy5oYW5kbGVyKFxuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICBjb21wb25lbnQgYXMgdW5rbm93biBhcyBpbXBvcnQoXCIuLi90eXBlc1wiKS5Gb3JtQ29tcG9uZW50LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5hY3Rpb24pIHtcbiAgICAgICAgICAgIC8vIFVzZSBkZWZhdWx0IGZldGNoXG4gICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBwZXJmb3JtUmVxdWVzdChjb25maWcuYWN0aW9uLCBkYXRhLCB7XG4gICAgICAgICAgICAgIG1ldGhvZDogb3B0aW9ucy5tZXRob2QgfHwgY29uZmlnLm1ldGhvZCB8fCBcIlBPU1RcIixcbiAgICAgICAgICAgICAgaGVhZGVyczogb3B0aW9ucy5oZWFkZXJzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vIGFjdGlvbiBVUkwsIGp1c3QgcmV0dXJuIHRoZSBkYXRhXG4gICAgICAgICAgICByZXN1bHQgPSBkYXRhO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFN1Y2Nlc3MhXG4gICAgICAgICAgY29tcG9uZW50LnN0YXRlLnN1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgICAgICAgICBjb21wb25lbnQuc3RhdGUuZXJyb3JzID0ge307XG5cbiAgICAgICAgICAvLyBSZW1vdmUgc3VibWl0dGluZyBjbGFzc1xuICAgICAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlnLnByZWZpeCB8fCBcIm10cmxcIjtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBjb25maWcuY29tcG9uZW50TmFtZSB8fCBcImZvcm1cIjtcbiAgICAgICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXG4gICAgICAgICAgICAgIGAke3ByZWZpeH0tJHtjb21wb25lbnROYW1lfS0tJHtGT1JNX0NMQVNTRVMuU1VCTUlUVElOR31gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUYWtlIHNuYXBzaG90IG9mIGN1cnJlbnQgZGF0YSBhcyBuZXcgYmFzZWxpbmVcbiAgICAgICAgICAvLyBUaGlzIHJlc2V0cyBtb2RpZmllZCBzdGF0ZSB0byBmYWxzZSwgd2hpY2ggd2lsbCB0cmlnZ2VyIHN0YXRlOmNoYW5nZVxuICAgICAgICAgIGNvbXBvbmVudC5zbmFwc2hvdCgpO1xuXG4gICAgICAgICAgLy8gRGlzYWJsZSBjb250cm9scyAoZm9ybSBpcyBub3cgcHJpc3RpbmUpXG4gICAgICAgICAgY29tcG9uZW50LmRpc2FibGVDb250cm9scygpO1xuXG4gICAgICAgICAgLy8gRW1pdCBzdWNjZXNzIGV2ZW50XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5TVUJNSVRfU1VDQ0VTUywgcmVzdWx0KTtcblxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gRXJyb3IhXG4gICAgICAgICAgY29tcG9uZW50LnN0YXRlLnN1Ym1pdHRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgIC8vIFJlbW92ZSBzdWJtaXR0aW5nIGNsYXNzXG4gICAgICAgICAgaWYgKGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWcucHJlZml4IHx8IFwibXRybFwiO1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGNvbmZpZy5jb21wb25lbnROYW1lIHx8IFwiZm9ybVwiO1xuICAgICAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcbiAgICAgICAgICAgICAgYCR7cHJlZml4fS0ke2NvbXBvbmVudE5hbWV9LS0ke0ZPUk1fQ0xBU1NFUy5TVUJNSVRUSU5HfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEVtaXQgZXJyb3IgZXZlbnRcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLlNVQk1JVF9FUlJPUiwgZXJyb3IpO1xuXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IHZhbGlkYXRpb24gcnVsZXMgYXQgcnVudGltZVxuICAgICAgICovXG4gICAgICBzZXRWYWxpZGF0aW9uUnVsZXMocnVsZXM6IEZvcm1WYWxpZGF0aW9uUnVsZVtdKTogdm9pZCB7XG4gICAgICAgIHZhbGlkYXRpb25SdWxlcyA9IHJ1bGVzO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDbGVhciBhbGwgdmFsaWRhdGlvbiBlcnJvcnMgYW5kIHZpc3VhbCBlcnJvciBzdGF0ZXNcbiAgICAgICAqL1xuICAgICAgY2xlYXJFcnJvcnMoKTogdm9pZCB7XG4gICAgICAgIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnMgPSB7fTtcbiAgICAgICAgc2hvd0FsbEZpZWxkRXJyb3JzKHt9KTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2xlYXIgZXJyb3IgZm9yIGEgc3BlY2lmaWMgZmllbGRcbiAgICAgICAqL1xuICAgICAgY2xlYXJGaWVsZEVycm9yKGZpZWxkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgZGVsZXRlIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnNbZmllbGRdO1xuICAgICAgICBzaG93RmllbGRFcnJvcihmaWVsZCwgdW5kZWZpbmVkKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IGFuIGVycm9yIGZvciBhIHNwZWNpZmljIGZpZWxkIChhbHNvIHNob3dzIG9uIGNvbXBvbmVudClcbiAgICAgICAqL1xuICAgICAgc2V0RmllbGRFcnJvcihmaWVsZDogc3RyaW5nLCBlcnJvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnNbZmllbGRdID0gZXJyb3I7XG4gICAgICAgIHNob3dGaWVsZEVycm9yKGZpZWxkLCBlcnJvcik7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCB0aGUgZXJyb3IgZm9yIGEgc3BlY2lmaWMgZmllbGRcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGRFcnJvcihmaWVsZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnNbZmllbGRdO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGVuaGFuY2VkO1xuICB9O1xufTtcblxuZXhwb3J0IHsgdmFsaWRhdGVEYXRhLCB2YWxpZGF0ZUZpZWxkLCBwZXJmb3JtUmVxdWVzdCB9O1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN1Ym1pdDtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9wcm90ZWN0aW9uLnRzXG5cbi8qKlxuICogUHJvdGVjdGlvbiBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogSGFuZGxlcyBibG9ja2luZyBvdmVybGF5IHRvIHByZXZlbnQgY2xpY2tzIG91dHNpZGUgdGhlIGZvcm0gd2hlbiBpdCBoYXMgdW5zYXZlZCBjaGFuZ2VzXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGb3JtQ29uZmlnLFxuICBCYXNlRm9ybUNvbXBvbmVudCxcbiAgRm9ybURhdGEsXG4gIEZvcm1TdGF0ZSxcbiAgRm9ybUZpZWxkUmVnaXN0cnksXG4gIFByb3RlY3RDaGFuZ2VzQ29uZmlnLFxuICBEYXRhQ29uZmxpY3RFdmVudCxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBGT1JNX0VWRU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBOb3JtYWxpemVzIHByb3RlY3Rpb24gY29uZmlnIHRvIGEgY29uc2lzdGVudCBvYmplY3QgZm9ybWF0XG4gKi9cbmNvbnN0IG5vcm1hbGl6ZVByb3RlY3RDb25maWcgPSAoXG4gIGNvbmZpZzogYm9vbGVhbiB8IFByb3RlY3RDaGFuZ2VzQ29uZmlnIHwgdW5kZWZpbmVkLFxuKTogUHJvdGVjdENoYW5nZXNDb25maWcgPT4ge1xuICBpZiAoIWNvbmZpZykge1xuICAgIHJldHVybiB7IGJlZm9yZVVubG9hZDogZmFsc2UsIG9uRGF0YU92ZXJ3cml0ZTogZmFsc2UgfTtcbiAgfVxuICBpZiAoY29uZmlnID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHsgYmVmb3JlVW5sb2FkOiB0cnVlLCBvbkRhdGFPdmVyd3JpdGU6IHRydWUgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGJlZm9yZVVubG9hZDogY29uZmlnLmJlZm9yZVVubG9hZCA/PyBmYWxzZSxcbiAgICBvbkRhdGFPdmVyd3JpdGU6IGNvbmZpZy5vbkRhdGFPdmVyd3JpdGUgPz8gZmFsc2UsXG4gIH07XG59O1xuXG4vKipcbiAqIHdpdGhQcm90ZWN0aW9uIGZlYXR1cmVcbiAqIEFkZHMgYmxvY2tpbmcgb3ZlcmxheSBwcm90ZWN0aW9uIHRvIHByZXZlbnQgY2xpY2tzIG91dHNpZGUgdGhlIGZvcm0gd2hlbiBtb2RpZmllZFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFByb3RlY3Rpb24gPSAoY29uZmlnOiBGb3JtQ29uZmlnKSA9PiB7XG4gIHJldHVybiA8XG4gICAgVCBleHRlbmRzIEJhc2VGb3JtQ29tcG9uZW50ICYge1xuICAgICAgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeTtcbiAgICAgIHN0YXRlOiBGb3JtU3RhdGU7XG4gICAgICBlbWl0PzogKGV2ZW50OiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiB2b2lkO1xuICAgICAgb24/OiAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pID0+IHZvaWQ7XG4gICAgICByZXNldD86IChmb3JjZT86IGJvb2xlYW4pID0+IGJvb2xlYW47XG4gICAgICBjbGVhckVycm9ycz86ICgpID0+IHZvaWQ7XG4gICAgICBkaXNhYmxlQ29udHJvbHM/OiAoKSA9PiB2b2lkO1xuICAgIH0sXG4gID4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUID0+IHtcbiAgICAvLyBOb3JtYWxpemUgcHJvdGVjdGlvbiBjb25maWd1cmF0aW9uXG4gICAgY29uc3QgcHJvdGVjdENvbmZpZyA9IG5vcm1hbGl6ZVByb3RlY3RDb25maWcoY29uZmlnLnByb3RlY3RDaGFuZ2VzKTtcblxuICAgIC8vIElmIG92ZXJsYXkgcHJvdGVjdGlvbiBpcyBub3QgZW5hYmxlZCwgcmV0dXJuIGNvbXBvbmVudCB1bmNoYW5nZWRcbiAgICBpZiAoIXByb3RlY3RDb25maWcub25EYXRhT3ZlcndyaXRlKSB7XG4gICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIFRyYWNrIGJsb2NraW5nIG92ZXJsYXkgZWxlbWVudHMgKHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodClcbiAgICBsZXQgYmxvY2tpbmdPdmVybGF5czogSFRNTEVsZW1lbnRbXSA9IFtdO1xuXG4gICAgLy8gUmVzaXplL3Njcm9sbCBoYW5kbGVyIGZvciB1cGRhdGluZyBvdmVybGF5IHBvc2l0aW9uc1xuICAgIGxldCByZXNpemVIYW5kbGVyOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICAgIC8vIFRyYWNrIGlmIHVzZXIgaGFzIGludGVyYWN0ZWQgd2l0aCB0aGUgZm9ybSAobWFkZSBhY3R1YWwgY2hhbmdlcylcbiAgICAvLyBUaGlzIHByZXZlbnRzIG92ZXJsYXlzIGZyb20gc2hvd2luZyBvbiBpbml0aWFsIGxvYWRcbiAgICBsZXQgaGFzVXNlckludGVyYWN0ZWQgPSBmYWxzZTtcblxuICAgIC8vIFRyYWNrIGlmIGRhdGEgaGFzIGJlZW4gbG9hZGVkIGF0IGxlYXN0IG9uY2VcbiAgICAvLyBUaGlzIGhlbHBzIGRpc3Rpbmd1aXNoIGJldHdlZW4gaW5pdGlhbCBsb2FkIGFuZCB1c2VyIGVkaXRzXG4gICAgbGV0IGRhdGFIYXNCZWVuTG9hZGVkID0gZmFsc2U7XG5cbiAgICAvLyBUcmFjayBpZiB3ZSdyZSBjdXJyZW50bHkgbG9hZGluZyBkYXRhIChpZ25vcmUgZmllbGQ6Y2hhbmdlIGV2ZW50cyBkdXJpbmcgdGhpcyB0aW1lKVxuICAgIGxldCBpc0xvYWRpbmdEYXRhID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGJsb2NraW5nIG92ZXJsYXkgZWxlbWVudHMgYXJvdW5kIHRoZSBmb3JtXG4gICAgICogVGhlc2Ugb3ZlcmxheXMgcHJldmVudCBjbGlja3Mgb3V0c2lkZSB0aGUgZm9ybSB3aGVuIGl0IGhhcyB1bnNhdmVkIGNoYW5nZXNcbiAgICAgKi9cbiAgICBjb25zdCBjcmVhdGVCbG9ja2luZ092ZXJsYXlzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGJsb2NraW5nT3ZlcmxheXMubGVuZ3RoID4gMCkgcmV0dXJuOyAvLyBBbHJlYWR5IGNyZWF0ZWRcblxuICAgICAgY29uc3QgZm9ybUVsZW1lbnQgPSBjb21wb25lbnQuZWxlbWVudDtcbiAgICAgIGlmICghZm9ybUVsZW1lbnQpIHJldHVybjtcblxuICAgICAgLy8gR2V0IGZvcm0gcG9zaXRpb24gYW5kIGRpbWVuc2lvbnMgKHJlbGF0aXZlIHRvIHZpZXdwb3J0IGZvciBmaXhlZCBwb3NpdGlvbmluZylcbiAgICAgIGNvbnN0IHJlY3QgPSBmb3JtRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgLy8gQ29tbW9uIG92ZXJsYXkgc3R5bGVzIC0gdXNpbmcgZml4ZWQgcG9zaXRpb25pbmcgZm9yIHZpZXdwb3J0LXJlbGF0aXZlIHBsYWNlbWVudFxuICAgICAgLy8gei1pbmRleDogOTk5IGlzIGJlbG93IGRpYWxvZydzIG1vZGFsIHotaW5kZXggKDEwMDApIHNvIGRpYWxvZ3MgYXBwZWFyIGFib3ZlXG4gICAgICBjb25zdCBiYXNlU3R5bGVzID0gYFxuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgICB6LWluZGV4OiA5OTk7XG4gICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gICAgICBgO1xuXG4gICAgICAvLyBDcmVhdGUgdG9wIG92ZXJsYXkgKGZyb20gdG9wIG9mIHZpZXdwb3J0IHRvIHRvcCBvZiBmb3JtKVxuICAgICAgY29uc3QgdG9wT3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICB0b3BPdmVybGF5LmNsYXNzTmFtZSA9XG4gICAgICAgIFwibXRybC1mb3JtLWJsb2NraW5nLW92ZXJsYXkgbXRybC1mb3JtLWJsb2NraW5nLW92ZXJsYXktLXRvcFwiO1xuICAgICAgdG9wT3ZlcmxheS5zdHlsZS5jc3NUZXh0ID0gYCR7YmFzZVN0eWxlc31cbiAgICAgICAgdG9wOiAwO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgaGVpZ2h0OiAke3JlY3QudG9wfXB4O1xuICAgICAgYDtcblxuICAgICAgLy8gQ3JlYXRlIGJvdHRvbSBvdmVybGF5IChmcm9tIGJvdHRvbSBvZiBmb3JtIHRvIGJvdHRvbSBvZiB2aWV3cG9ydClcbiAgICAgIGNvbnN0IGJvdHRvbU92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgYm90dG9tT3ZlcmxheS5jbGFzc05hbWUgPVxuICAgICAgICBcIm10cmwtZm9ybS1ibG9ja2luZy1vdmVybGF5IG10cmwtZm9ybS1ibG9ja2luZy1vdmVybGF5LS1ib3R0b21cIjtcbiAgICAgIGJvdHRvbU92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9IGAke2Jhc2VTdHlsZXN9XG4gICAgICAgIHRvcDogJHtyZWN0LmJvdHRvbX1weDtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgIGJvdHRvbTogMDtcbiAgICAgIGA7XG5cbiAgICAgIC8vIENyZWF0ZSBsZWZ0IG92ZXJsYXkgKGZyb20gbGVmdCBvZiB2aWV3cG9ydCB0byBsZWZ0IG9mIGZvcm0sIGJldHdlZW4gdG9wIGFuZCBib3R0b20pXG4gICAgICBjb25zdCBsZWZ0T3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBsZWZ0T3ZlcmxheS5jbGFzc05hbWUgPVxuICAgICAgICBcIm10cmwtZm9ybS1ibG9ja2luZy1vdmVybGF5IG10cmwtZm9ybS1ibG9ja2luZy1vdmVybGF5LS1sZWZ0XCI7XG4gICAgICBsZWZ0T3ZlcmxheS5zdHlsZS5jc3NUZXh0ID0gYCR7YmFzZVN0eWxlc31cbiAgICAgICAgdG9wOiAke3JlY3QudG9wfXB4O1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICB3aWR0aDogJHtyZWN0LmxlZnR9cHg7XG4gICAgICAgIGhlaWdodDogJHtyZWN0LmhlaWdodH1weDtcbiAgICAgIGA7XG5cbiAgICAgIC8vIENyZWF0ZSByaWdodCBvdmVybGF5IChmcm9tIHJpZ2h0IG9mIGZvcm0gdG8gcmlnaHQgb2Ygdmlld3BvcnQsIGJldHdlZW4gdG9wIGFuZCBib3R0b20pXG4gICAgICBjb25zdCByaWdodE92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgcmlnaHRPdmVybGF5LmNsYXNzTmFtZSA9XG4gICAgICAgIFwibXRybC1mb3JtLWJsb2NraW5nLW92ZXJsYXkgbXRybC1mb3JtLWJsb2NraW5nLW92ZXJsYXktLXJpZ2h0XCI7XG4gICAgICByaWdodE92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9IGAke2Jhc2VTdHlsZXN9XG4gICAgICAgIHRvcDogJHtyZWN0LnRvcH1weDtcbiAgICAgICAgbGVmdDogJHtyZWN0LnJpZ2h0fXB4O1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgaGVpZ2h0OiAke3JlY3QuaGVpZ2h0fXB4O1xuICAgICAgYDtcblxuICAgICAgLy8gQWRkIGNsaWNrIGhhbmRsZXIgdG8gc2hvdyBkaWFsb2cgd2hlbiBjbGlja2luZyBvbiBvdmVybGF5XG4gICAgICBjb25zdCBoYW5kbGVPdmVybGF5Q2xpY2sgPSAoZTogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgLy8gRW1pdCBkYXRhOmNvbmZsaWN0IGV2ZW50IHRvIHNob3cgZGlhbG9nXG4gICAgICAgIGNvbnN0IGNvbmZsaWN0RXZlbnQ6IERhdGFDb25mbGljdEV2ZW50ID0ge1xuICAgICAgICAgIGN1cnJlbnREYXRhOiB7IC4uLmNvbXBvbmVudC5zdGF0ZS5jdXJyZW50RGF0YSB9LFxuICAgICAgICAgIG5ld0RhdGE6IHt9LFxuICAgICAgICAgIGNhbmNlbGxlZDogZmFsc2UsXG4gICAgICAgICAgY2FuY2VsOiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBVc2VyIGNob3NlIHRvIGtlZXAgZWRpdGluZyAtIGRvIG5vdGhpbmcsIG92ZXJsYXlzIHN0YXlcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb2NlZWQ6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIFVzZXIgY2hvc2UgdG8gZGlzY2FyZCAtIHJlc2V0IGZvcm0gdG8gaW5pdGlhbCBzdGF0ZVxuICAgICAgICAgICAgLy8gU2FtZSBhcyBjYW5jZWwgYnV0dG9uIGJlaGF2aW9yXG4gICAgICAgICAgICBoYXNVc2VySW50ZXJhY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gUmVzZXQgZm9ybSB0byBpbml0aWFsIGRhdGEgKGZvcmNlPXRydWUgYnlwYXNzZXMgcHJvdGVjdGlvbilcbiAgICAgICAgICAgIGNvbXBvbmVudC5yZXNldD8uKHRydWUpO1xuICAgICAgICAgICAgLy8gQ2xlYXIgYW55IHZhbGlkYXRpb24gZXJyb3JzXG4gICAgICAgICAgICBjb21wb25lbnQuY2xlYXJFcnJvcnM/LigpO1xuICAgICAgICAgICAgLy8gRGlzYWJsZSBjb250cm9scyAoZm9ybSBpcyBub3cgcHJpc3RpbmUpXG4gICAgICAgICAgICBjb21wb25lbnQuZGlzYWJsZUNvbnRyb2xzPy4oKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuREFUQV9DT05GTElDVCwgY29uZmxpY3RFdmVudCk7XG4gICAgICB9O1xuXG4gICAgICBbdG9wT3ZlcmxheSwgYm90dG9tT3ZlcmxheSwgbGVmdE92ZXJsYXksIHJpZ2h0T3ZlcmxheV0uZm9yRWFjaChcbiAgICAgICAgKG92ZXJsYXkpID0+IHtcbiAgICAgICAgICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVPdmVybGF5Q2xpY2spO1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3ZlcmxheSk7XG4gICAgICAgICAgYmxvY2tpbmdPdmVybGF5cy5wdXNoKG92ZXJsYXkpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBibG9ja2luZyBvdmVybGF5IGVsZW1lbnRzXG4gICAgICovXG4gICAgY29uc3QgcmVtb3ZlQmxvY2tpbmdPdmVybGF5cyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChibG9ja2luZ092ZXJsYXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBibG9ja2luZ092ZXJsYXlzLmZvckVhY2goKG92ZXJsYXkpID0+IHtcbiAgICAgICAgb3ZlcmxheS5yZW1vdmUoKTtcbiAgICAgIH0pO1xuICAgICAgYmxvY2tpbmdPdmVybGF5cyA9IFtdO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGJsb2NraW5nIG92ZXJsYXlzIHBvc2l0aW9uIChlLmcuLCBvbiB3aW5kb3cgcmVzaXplKVxuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZUJsb2NraW5nT3ZlcmxheXMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAoYmxvY2tpbmdPdmVybGF5cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgZm9ybUVsZW1lbnQgPSBjb21wb25lbnQuZWxlbWVudDtcbiAgICAgIGlmICghZm9ybUVsZW1lbnQpIHJldHVybjtcblxuICAgICAgY29uc3QgcmVjdCA9IGZvcm1FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAvLyBVcGRhdGUgZWFjaCBvdmVybGF5IHBvc2l0aW9uICh1c2luZyBmaXhlZCBwb3NpdGlvbmluZywgbm8gc2Nyb2xsIG9mZnNldCBuZWVkZWQpXG4gICAgICBjb25zdCBbdG9wT3ZlcmxheSwgYm90dG9tT3ZlcmxheSwgbGVmdE92ZXJsYXksIHJpZ2h0T3ZlcmxheV0gPVxuICAgICAgICBibG9ja2luZ092ZXJsYXlzO1xuXG4gICAgICBpZiAodG9wT3ZlcmxheSkge1xuICAgICAgICB0b3BPdmVybGF5LnN0eWxlLmhlaWdodCA9IGAke3JlY3QudG9wfXB4YDtcbiAgICAgIH1cbiAgICAgIGlmIChib3R0b21PdmVybGF5KSB7XG4gICAgICAgIGJvdHRvbU92ZXJsYXkuc3R5bGUudG9wID0gYCR7cmVjdC5ib3R0b219cHhgO1xuICAgICAgfVxuICAgICAgaWYgKGxlZnRPdmVybGF5KSB7XG4gICAgICAgIGxlZnRPdmVybGF5LnN0eWxlLnRvcCA9IGAke3JlY3QudG9wfXB4YDtcbiAgICAgICAgbGVmdE92ZXJsYXkuc3R5bGUud2lkdGggPSBgJHtyZWN0LmxlZnR9cHhgO1xuICAgICAgICBsZWZ0T3ZlcmxheS5zdHlsZS5oZWlnaHQgPSBgJHtyZWN0LmhlaWdodH1weGA7XG4gICAgICB9XG4gICAgICBpZiAocmlnaHRPdmVybGF5KSB7XG4gICAgICAgIHJpZ2h0T3ZlcmxheS5zdHlsZS50b3AgPSBgJHtyZWN0LnRvcH1weGA7XG4gICAgICAgIHJpZ2h0T3ZlcmxheS5zdHlsZS5sZWZ0ID0gYCR7cmVjdC5yaWdodH1weGA7XG4gICAgICAgIHJpZ2h0T3ZlcmxheS5zdHlsZS5oZWlnaHQgPSBgJHtyZWN0LmhlaWdodH1weGA7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgYmxvY2tpbmcgb3ZlcmxheXMgYmFzZWQgb24gbW9kaWZpZWQgc3RhdGVcbiAgICAgKi9cbiAgICBjb25zdCB1cGRhdGVQcm90ZWN0aW9uU3RhdGUgPSAobW9kaWZpZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICAgIGlmIChtb2RpZmllZCAmJiBoYXNVc2VySW50ZXJhY3RlZCkge1xuICAgICAgICBjcmVhdGVCbG9ja2luZ092ZXJsYXlzKCk7XG4gICAgICAgIC8vIEFkZCByZXNpemUvc2Nyb2xsIGxpc3RlbmVycyB0byB1cGRhdGUgb3ZlcmxheSBwb3NpdGlvbnNcbiAgICAgICAgaWYgKCFyZXNpemVIYW5kbGVyKSB7XG4gICAgICAgICAgcmVzaXplSGFuZGxlciA9IHVwZGF0ZUJsb2NraW5nT3ZlcmxheXM7XG4gICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbW92ZUJsb2NraW5nT3ZlcmxheXMoKTtcbiAgICAgICAgLy8gUmVtb3ZlIHJlc2l6ZS9zY3JvbGwgbGlzdGVuZXJzXG4gICAgICAgIGlmIChyZXNpemVIYW5kbGVyKSB7XG4gICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgICAgcmVzaXplSGFuZGxlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gTGlzdGVuIGZvciBmaWVsZDpjaGFuZ2UgZXZlbnRzIHRvIGRldGVjdCBhY3R1YWwgdXNlciBlZGl0c1xuICAgIC8vIFRoaXMgaXMgbW9yZSByZWxpYWJsZSB0aGFuIFNUQVRFX0NIQU5HRSBiZWNhdXNlIGl0IGZpcmVzIG9uIGV2ZXJ5IGZpZWxkIGVkaXRcbiAgICBjb21wb25lbnQub24/LihcImZpZWxkOmNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICAvLyBJZ25vcmUgZmllbGQ6Y2hhbmdlIGV2ZW50cyBkdXJpbmcgZGF0YSBsb2FkaW5nXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBmcm9tIHByb2dyYW1tYXRpYyBmaWVsZCB1cGRhdGVzXG4gICAgICBpZiAoaXNMb2FkaW5nRGF0YSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIE9ubHkgc2V0IGhhc1VzZXJJbnRlcmFjdGVkIGlmIGRhdGEgaGFzIGJlZW4gbG9hZGVkXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBkdXJpbmcgaW5pdGlhbCBmb3JtIHNldHVwXG4gICAgICBpZiAoZGF0YUhhc0JlZW5Mb2FkZWQgJiYgIWhhc1VzZXJJbnRlcmFjdGVkKSB7XG4gICAgICAgIGhhc1VzZXJJbnRlcmFjdGVkID0gdHJ1ZTtcbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byBzaG93IG92ZXJsYXlzIG5vd1xuICAgICAgICBpZiAoY29tcG9uZW50LnN0YXRlLm1vZGlmaWVkKSB7XG4gICAgICAgICAgdXBkYXRlUHJvdGVjdGlvblN0YXRlKHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIHN0YXRlIGNoYW5nZXMgdG8gc2hvdy9oaWRlIG92ZXJsYXlzXG4gICAgY29tcG9uZW50Lm9uPy4oRk9STV9FVkVOVFMuU1RBVEVfQ0hBTkdFLCAoZXZlbnQ6IHsgbW9kaWZpZWQ6IGJvb2xlYW4gfSkgPT4ge1xuICAgICAgLy8gV2hlbiBmb3JtIGJlY29tZXMgcHJpc3RpbmUgKGRhdGEgbG9hZGVkKSwgcmVzZXQgdGhlIGludGVyYWN0aW9uIGZsYWdcbiAgICAgIC8vIGFuZCBtYXJrIHRoYXQgZGF0YSBoYXMgYmVlbiBsb2FkZWRcbiAgICAgIGlmICghZXZlbnQubW9kaWZpZWQpIHtcbiAgICAgICAgaGFzVXNlckludGVyYWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgZGF0YUhhc0JlZW5Mb2FkZWQgPSB0cnVlO1xuICAgICAgICBpc0xvYWRpbmdEYXRhID0gdHJ1ZTtcblxuICAgICAgICAvLyBDbGVhciB0aGUgbG9hZGluZyBmbGFnIGFmdGVyIGEgc2hvcnQgZGVsYXkgdG8gYWxsb3cgYWxsIHByb2dyYW1tYXRpY1xuICAgICAgICAvLyBmaWVsZCB1cGRhdGVzIHRvIGNvbXBsZXRlIChjdXN0b20gZmllbGRzIG1heSB1cGRhdGUgYXN5bmMpXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlzTG9hZGluZ0RhdGEgPSBmYWxzZTtcbiAgICAgICAgfSwgMTAwKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIHByb3RlY3Rpb24gc3RhdGVcbiAgICAgIHVwZGF0ZVByb3RlY3Rpb25TdGF0ZShldmVudC5tb2RpZmllZCk7XG4gICAgfSk7XG5cbiAgICAvLyBBbHNvIGxpc3RlbiBmb3IgcmVzZXQgZXZlbnQgdG8gcmVtb3ZlIG92ZXJsYXlzXG4gICAgY29tcG9uZW50Lm9uPy4oRk9STV9FVkVOVFMuUkVTRVQsICgpID0+IHtcbiAgICAgIHVwZGF0ZVByb3RlY3Rpb25TdGF0ZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBSZWdpc3RlciBjbGVhbnVwIHdoZW4gY29tcG9uZW50IGlzIGRlc3Ryb3llZFxuICAgIGNvbnN0IG9yaWdpbmFsTGlmZWN5Y2xlID0gY29tcG9uZW50LmxpZmVjeWNsZTtcbiAgICBpZiAob3JpZ2luYWxMaWZlY3ljbGUpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IG9yaWdpbmFsTGlmZWN5Y2xlLmRlc3Ryb3k7XG4gICAgICBvcmlnaW5hbExpZmVjeWNsZS5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAvLyBDbGVhbiB1cCBibG9ja2luZyBvdmVybGF5c1xuICAgICAgICByZW1vdmVCbG9ja2luZ092ZXJsYXlzKCk7XG4gICAgICAgIGlmIChyZXNpemVIYW5kbGVyKSB7XG4gICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgICAgcmVzaXplSGFuZGxlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95XG4gICAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoUHJvdGVjdGlvbjtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9hcGkudHNcblxuLyoqXG4gKiBBUEkgZmVhdHVyZSBmb3IgRm9ybSBjb21wb25lbnRcbiAqIFByb3ZpZGVzIGEgY2xlYW4sIHVuaWZpZWQgcHVibGljIEFQSSBmb3IgdGhlIGZvcm1cbiAqIEFsc28gd2lyZXMgdXAgY29udHJvbCBidXR0b24gY2xpY2sgaGFuZGxlcnMgKHN1Ym1pdC9jYW5jZWwpXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGb3JtQ29uZmlnLFxuICBCYXNlRm9ybUNvbXBvbmVudCxcbiAgRm9ybUNvbXBvbmVudCxcbiAgRm9ybURhdGEsXG4gIERhdGFTdGF0ZSxcbiAgRm9ybVN0YXRlLFxuICBGb3JtRmllbGQsXG4gIEZvcm1GaWVsZFJlZ2lzdHJ5LFxuICBGb3JtVmFsaWRhdGlvblJlc3VsdCxcbiAgRm9ybVN1Ym1pdE9wdGlvbnMsXG4gIEZpZWxkVmFsdWUsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgRk9STV9FVkVOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogV2lyZXMgdXAgY2xpY2sgaGFuZGxlcnMgZm9yIGNvbnRyb2wgYnV0dG9ucyAoc3VibWl0LCBjYW5jZWwpXG4gKi9cbmNvbnN0IHdpcmVDb250cm9sQnV0dG9ucyA9IChcbiAgY29udHJvbHM6IE1hcDxzdHJpbmcsIEZvcm1GaWVsZD4sXG4gIGFwaTogRm9ybUNvbXBvbmVudCxcbiAgY29uZmlnOiBGb3JtQ29uZmlnLFxuKTogdm9pZCA9PiB7XG4gIC8vIFdpcmUgc3VibWl0IGJ1dHRvblxuICBjb25zdCBzdWJtaXRCdXR0b24gPSBjb250cm9scy5nZXQoXCJzdWJtaXRcIik7XG4gIGlmIChzdWJtaXRCdXR0b24/LmVsZW1lbnQpIHtcbiAgICBzdWJtaXRCdXR0b24uZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGNvbmZpZy5vblN1Ym1pdCkge1xuICAgICAgICAvLyBVc2UgY3VzdG9tIHN1Ym1pdCBoYW5kbGVyXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGFwaS5nZXREYXRhKCk7XG4gICAgICAgICAgYXdhaXQgY29uZmlnLm9uU3VibWl0KGRhdGEsIGFwaSk7XG4gICAgICAgICAgLy8gQWZ0ZXIgc3VjY2Vzc2Z1bCBzdWJtaXQsIGRpc2FibGUgY29udHJvbHMgKGZvcm0gaXMgbm93IHByaXN0aW5lKVxuICAgICAgICAgIGFwaS5kaXNhYmxlQ29udHJvbHMoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRm9ybSBzdWJtaXQgZXJyb3I6XCIsIGVycm9yKTtcbiAgICAgICAgICAvLyBPbiBlcnJvciwgYWxzbyBkaXNhYmxlIGNvbnRyb2xzIHRvIHByZXZlbnQgcmVwZWF0ZWQgY2xpY2tzXG4gICAgICAgICAgYXBpLmRpc2FibGVDb250cm9scygpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVc2UgZGVmYXVsdCBmb3JtIHN1Ym1pdCAoaGFuZGxlcyBkaXNhYmxpbmcgaW50ZXJuYWxseSlcbiAgICAgICAgYXdhaXQgYXBpLnN1Ym1pdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gV2lyZSBjYW5jZWwgYnV0dG9uXG4gIGNvbnN0IGNhbmNlbEJ1dHRvbiA9IGNvbnRyb2xzLmdldChcImNhbmNlbFwiKTtcbiAgaWYgKGNhbmNlbEJ1dHRvbj8uZWxlbWVudCkge1xuICAgIGNhbmNlbEJ1dHRvbi5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICBpZiAoY29uZmlnLm9uQ2FuY2VsKSB7XG4gICAgICAgIC8vIFVzZSBjdXN0b20gY2FuY2VsIGhhbmRsZXJcbiAgICAgICAgY29uZmlnLm9uQ2FuY2VsKGFwaSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEZWZhdWx0OiByZXNldCBmb3JtIHRvIGluaXRpYWwgc3RhdGVcbiAgICAgICAgLy8gVXNlIGZvcmNlPXRydWUgdG8gYnlwYXNzIHByb3RlY3Rpb24gc2luY2UgdGhpcyBpcyBhbiBpbnRlbnRpb25hbCB1c2VyIGFjdGlvblxuICAgICAgICBhcGkucmVzZXQodHJ1ZSk7XG4gICAgICB9XG4gICAgICAvLyBDbGVhciBhbnkgdmFsaWRhdGlvbiBlcnJvcnMgKHZpc3VhbCBzdGF0ZSBvbiBmaWVsZHMpXG4gICAgICBhcGkuY2xlYXJFcnJvcnMoKTtcbiAgICAgIC8vIEFmdGVyIGNhbmNlbCwgZGlzYWJsZSBjb250cm9scyAoZm9ybSBpcyBub3cgcHJpc3RpbmUpXG4gICAgICBhcGkuZGlzYWJsZUNvbnRyb2xzKCk7XG4gICAgfSk7XG4gIH1cbn07XG5cbi8qKlxuICogRXh0ZW5kZWQgY29tcG9uZW50IGludGVyZmFjZSBiZWZvcmUgQVBJIGlzIGFwcGxpZWRcbiAqL1xuaW50ZXJmYWNlIEVuaGFuY2VkRm9ybUNvbXBvbmVudCBleHRlbmRzIEJhc2VGb3JtQ29tcG9uZW50IHtcbiAgZm9ybTogSFRNTEZvcm1FbGVtZW50O1xuICB1aTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnk7XG4gIGZpbGVzOiBGb3JtRmllbGRSZWdpc3RyeTtcbiAgc3RhdGU6IEZvcm1TdGF0ZTtcbiAgY29udHJvbHM6IE1hcDxzdHJpbmcsIEZvcm1GaWVsZD47XG5cbiAgLy8gRGF0YSBtZXRob2RzXG4gIGdldERhdGE6ICgpID0+IEZvcm1EYXRhO1xuICBzZXREYXRhOiAoZGF0YTogRm9ybURhdGEsIHNpbGVudD86IGJvb2xlYW4pID0+IHZvaWQ7XG4gIGdldEZpZWxkVmFsdWU6IChuYW1lOiBzdHJpbmcpID0+IEZpZWxkVmFsdWU7XG4gIHNldEZpZWxkVmFsdWU6IChuYW1lOiBzdHJpbmcsIHZhbHVlOiBGaWVsZFZhbHVlLCBzaWxlbnQ/OiBib29sZWFuKSA9PiB2b2lkO1xuICBpc01vZGlmaWVkOiAoKSA9PiBib29sZWFuO1xuICBnZXRNb2RpZmllZERhdGE6ICgpID0+IEZvcm1EYXRhO1xuICBzbmFwc2hvdDogKCkgPT4gdm9pZDtcbiAgcmVzZXQ6IChmb3JjZT86IGJvb2xlYW4pID0+IGJvb2xlYW47XG4gIGNsZWFyOiAoZm9yY2U/OiBib29sZWFuKSA9PiBib29sZWFuO1xuXG4gIC8vIEZpZWxkIG1ldGhvZHNcbiAgZ2V0RmllbGQ6IChuYW1lOiBzdHJpbmcpID0+IEZvcm1GaWVsZCB8IHVuZGVmaW5lZDtcbiAgZ2V0RmllbGROYW1lczogKCkgPT4gc3RyaW5nW107XG4gIGhhc0ZpZWxkOiAobmFtZTogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIC8vIENvbnRyb2xsZXIgbWV0aG9kc1xuICBnZXREYXRhU3RhdGU6ICgpID0+IERhdGFTdGF0ZTtcbiAgZW5hYmxlQ29udHJvbHM6ICgpID0+IHZvaWQ7XG4gIGRpc2FibGVDb250cm9sczogKCkgPT4gdm9pZDtcbiAgZW5hYmxlRmllbGRzOiAoKSA9PiB2b2lkO1xuICBkaXNhYmxlRmllbGRzOiAoKSA9PiB2b2lkO1xuXG4gIC8vIFN1Ym1pdC9WYWxpZGF0aW9uIG1ldGhvZHNcbiAgdmFsaWRhdGU6ICgpID0+IEZvcm1WYWxpZGF0aW9uUmVzdWx0O1xuICB2YWxpZGF0ZUZpZWxkOiAoZmllbGROYW1lOiBzdHJpbmcpID0+IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgc3VibWl0OiAob3B0aW9ucz86IEZvcm1TdWJtaXRPcHRpb25zKSA9PiBQcm9taXNlPHVua25vd24+O1xuICBzZXRWYWxpZGF0aW9uUnVsZXM6IChydWxlczogaW1wb3J0KFwiLi4vdHlwZXNcIikuRm9ybVZhbGlkYXRpb25SdWxlW10pID0+IHZvaWQ7XG4gIGNsZWFyRXJyb3JzOiAoKSA9PiB2b2lkO1xuICBjbGVhckZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nKSA9PiB2b2lkO1xuICBzZXRGaWVsZEVycm9yOiAoZmllbGQ6IHN0cmluZywgZXJyb3I6IHN0cmluZykgPT4gdm9pZDtcbiAgZ2V0RmllbGRFcnJvcjogKGZpZWxkOiBzdHJpbmcpID0+IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvLyBFdmVudCBtZXRob2RzXG4gIG9uPzogKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKSA9PiB2b2lkO1xuICBvZmY/OiAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pID0+IHZvaWQ7XG4gIGVtaXQ/OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG5cbiAgLy8gTGlmZWN5Y2xlXG4gIGxpZmVjeWNsZT86IHtcbiAgICBkZXN0cm95OiAoKSA9PiB2b2lkO1xuICB9O1xufVxuXG4vKipcbiAqIHdpdGhBUEkgZmVhdHVyZVxuICogQ3JlYXRlcyBhIGNsZWFuIHB1YmxpYyBBUEkgZm9yIHRoZSBmb3JtIGNvbXBvbmVudFxuICovXG5leHBvcnQgY29uc3Qgd2l0aEFQSSA9IChjb25maWc6IEZvcm1Db25maWcpID0+IHtcbiAgcmV0dXJuIChjb21wb25lbnQ6IEVuaGFuY2VkRm9ybUNvbXBvbmVudCk6IEZvcm1Db21wb25lbnQgPT4ge1xuICAgIC8vIFJlZ2lzdGVyIGV2ZW50IGhhbmRsZXJzIGZyb20gY29uZmlnXG4gICAgaWYgKGNvbmZpZy5vbiAmJiBjb21wb25lbnQub24pIHtcbiAgICAgIGZvciAoY29uc3QgW2V2ZW50LCBoYW5kbGVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWcub24pKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgY29tcG9uZW50Lm9uKGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgcHVibGljIEFQSVxuICAgIGNvbnN0IGFwaTogRm9ybUNvbXBvbmVudCA9IHtcbiAgICAgIC8vIENvcmUgcHJvcGVydGllc1xuICAgICAgZWxlbWVudDogY29tcG9uZW50LmVsZW1lbnQsXG4gICAgICBmb3JtOiBjb21wb25lbnQuZm9ybSxcbiAgICAgIHVpOiBjb21wb25lbnQudWksXG4gICAgICBmaWVsZHM6IGNvbXBvbmVudC5maWVsZHMsXG4gICAgICBzdGF0ZTogY29tcG9uZW50LnN0YXRlLFxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIERhdGEgQVBJXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYWxsIGZvcm0gZGF0YSBhcyBhIGtleS12YWx1ZSBvYmplY3RcbiAgICAgICAqL1xuICAgICAgZ2V0RGF0YSgpOiBGb3JtRGF0YSB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuZ2V0RGF0YSgpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZXQgZm9ybSBkYXRhIGZyb20gYSBrZXktdmFsdWUgb2JqZWN0XG4gICAgICAgKiBAcGFyYW0gZGF0YSAtIERhdGEgdG8gc2V0XG4gICAgICAgKiBAcGFyYW0gc2lsZW50IC0gSWYgdHJ1ZSwgZG9uJ3QgZW1pdCBjaGFuZ2UgZXZlbnRzXG4gICAgICAgKi9cbiAgICAgIHNldERhdGEoZGF0YTogRm9ybURhdGEsIHNpbGVudD86IGJvb2xlYW4pOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50LnNldERhdGEoZGF0YSwgc2lsZW50KTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGEgc3BlY2lmaWMgZmllbGQncyB2YWx1ZVxuICAgICAgICogQHBhcmFtIG5hbWUgLSBGaWVsZCBuYW1lXG4gICAgICAgKi9cbiAgICAgIGdldEZpZWxkVmFsdWUobmFtZTogc3RyaW5nKTogRmllbGRWYWx1ZSB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuZ2V0RmllbGRWYWx1ZShuYW1lKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IGEgc3BlY2lmaWMgZmllbGQncyB2YWx1ZVxuICAgICAgICogQHBhcmFtIG5hbWUgLSBGaWVsZCBuYW1lXG4gICAgICAgKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBzZXRcbiAgICAgICAqIEBwYXJhbSBzaWxlbnQgLSBJZiB0cnVlLCBkb24ndCBlbWl0IGNoYW5nZSBldmVudHNcbiAgICAgICAqL1xuICAgICAgc2V0RmllbGRWYWx1ZShcbiAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICB2YWx1ZTogRmllbGRWYWx1ZSxcbiAgICAgICAgc2lsZW50PzogYm9vbGVhbixcbiAgICAgICk6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQuc2V0RmllbGRWYWx1ZShuYW1lLCB2YWx1ZSwgc2lsZW50KTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGEgZmllbGQgY29tcG9uZW50IGJ5IG5hbWVcbiAgICAgICAqIEBwYXJhbSBuYW1lIC0gRmllbGQgbmFtZVxuICAgICAgICovXG4gICAgICBnZXRGaWVsZChuYW1lOiBzdHJpbmcpOiBGb3JtRmllbGQgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LmdldEZpZWxkKG5hbWUpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYWxsIGZpZWxkIG5hbWVzXG4gICAgICAgKi9cbiAgICAgIGdldEZpZWxkTmFtZXMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LmdldEZpZWxkTmFtZXMoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgZm9ybSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwvc25hcHNob3Qgc3RhdGVcbiAgICAgICAqL1xuICAgICAgaXNNb2RpZmllZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5pc01vZGlmaWVkKCk7XG4gICAgICB9LFxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIFN0YXRlIEFQSVxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IHRoZSBjdXJyZW50IGRhdGEgc3RhdGUgKHByaXN0aW5lIG9yIGRpcnR5KVxuICAgICAgICovXG4gICAgICBnZXREYXRhU3RhdGUoKTogRGF0YVN0YXRlIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5nZXREYXRhU3RhdGUoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gVmFsaWRhdGlvbiBBUElcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICAvKipcbiAgICAgICAqIFZhbGlkYXRlIHRoZSBmb3JtIGFnYWluc3QgY29uZmlndXJlZCBydWxlc1xuICAgICAgICogQXV0b21hdGljYWxseSBzaG93cyBlcnJvcnMgb24gZmllbGQgY29tcG9uZW50c1xuICAgICAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCB2YWxpZCBmbGFnIGFuZCBlcnJvcnNcbiAgICAgICAqL1xuICAgICAgdmFsaWRhdGUoKTogRm9ybVZhbGlkYXRpb25SZXN1bHQge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LnZhbGlkYXRlKCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFZhbGlkYXRlIGEgc2luZ2xlIGZpZWxkXG4gICAgICAgKiBAcGFyYW0gZmllbGROYW1lIC0gRmllbGQgbmFtZSB0byB2YWxpZGF0ZVxuICAgICAgICogQHJldHVybnMgRXJyb3IgbWVzc2FnZSBpZiBpbnZhbGlkLCB1bmRlZmluZWQgaWYgdmFsaWRcbiAgICAgICAqL1xuICAgICAgdmFsaWRhdGVGaWVsZChmaWVsZE5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQudmFsaWRhdGVGaWVsZChmaWVsZE5hbWUpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDbGVhciBhbGwgdmFsaWRhdGlvbiBlcnJvcnNcbiAgICAgICAqL1xuICAgICAgY2xlYXJFcnJvcnMoKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5jbGVhckVycm9ycygpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDbGVhciBlcnJvciBmb3IgYSBzcGVjaWZpYyBmaWVsZFxuICAgICAgICogQHBhcmFtIGZpZWxkIC0gRmllbGQgbmFtZVxuICAgICAgICovXG4gICAgICBjbGVhckZpZWxkRXJyb3IoZmllbGQ6IHN0cmluZyk6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQuY2xlYXJGaWVsZEVycm9yKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IGVycm9yIGZvciBhIHNwZWNpZmljIGZpZWxkXG4gICAgICAgKiBAcGFyYW0gZmllbGQgLSBGaWVsZCBuYW1lXG4gICAgICAgKiBAcGFyYW0gZXJyb3IgLSBFcnJvciBtZXNzYWdlXG4gICAgICAgKi9cbiAgICAgIHNldEZpZWxkRXJyb3IoZmllbGQ6IHN0cmluZywgZXJyb3I6IHN0cmluZyk6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQuc2V0RmllbGRFcnJvcihmaWVsZCwgZXJyb3IpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgZXJyb3IgZm9yIGEgc3BlY2lmaWMgZmllbGRcbiAgICAgICAqIEBwYXJhbSBmaWVsZCAtIEZpZWxkIG5hbWVcbiAgICAgICAqIEByZXR1cm5zIEVycm9yIG1lc3NhZ2Ugb3IgdW5kZWZpbmVkXG4gICAgICAgKi9cbiAgICAgIGdldEZpZWxkRXJyb3IoZmllbGQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuZ2V0RmllbGRFcnJvcihmaWVsZCk7XG4gICAgICB9LFxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIFN1Ym1pdCBBUElcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICAvKipcbiAgICAgICAqIFN1Ym1pdCB0aGUgZm9ybVxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBzdWJtaXQgY29uZmlndXJhdGlvblxuICAgICAgICovXG4gICAgICBhc3luYyBzdWJtaXQob3B0aW9ucz86IEZvcm1TdWJtaXRPcHRpb25zKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuc3VibWl0KG9wdGlvbnMpO1xuICAgICAgfSxcblxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBTdGF0ZSBNYW5hZ2VtZW50IEFQSVxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgIC8qKlxuICAgICAgICogUmVzZXQgZm9ybSB0byBpbml0aWFsL3NuYXBzaG90IHN0YXRlXG4gICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlIC0gSWYgdHJ1ZSwgYnlwYXNzIHByb3RlY3Rpb24gYW5kIHJlc2V0IGltbWVkaWF0ZWx5XG4gICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiByZXNldCB3YXMgcGVyZm9ybWVkLCBmYWxzZSBpZiBjYW5jZWxsZWQgYnkgcHJvdGVjdGlvblxuICAgICAgICovXG4gICAgICByZXNldChmb3JjZT86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5yZXNldChmb3JjZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGFsbCBmb3JtIGZpZWxkc1xuICAgICAgICogQHBhcmFtIHtib29sZWFufSBmb3JjZSAtIElmIHRydWUsIGJ5cGFzcyBwcm90ZWN0aW9uIGFuZCBjbGVhciBpbW1lZGlhdGVseVxuICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgY2xlYXIgd2FzIHBlcmZvcm1lZCwgZmFsc2UgaWYgY2FuY2VsbGVkIGJ5IHByb3RlY3Rpb25cbiAgICAgICAqL1xuICAgICAgY2xlYXIoZm9yY2U/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuY2xlYXIoZm9yY2UpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBFbmFibGUgYWxsIGZvcm0gZmllbGRzXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZSgpOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50LmVuYWJsZUZpZWxkcygpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBEaXNhYmxlIGFsbCBmb3JtIGZpZWxkc1xuICAgICAgICovXG4gICAgICBkaXNhYmxlKCk6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQuZGlzYWJsZUZpZWxkcygpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBFbmFibGUgY29udHJvbCBidXR0b25zIChzdWJtaXQsIGNhbmNlbCwgZXRjLilcbiAgICAgICAqL1xuICAgICAgZW5hYmxlQ29udHJvbHMoKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5lbmFibGVDb250cm9scygpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBEaXNhYmxlIGNvbnRyb2wgYnV0dG9uc1xuICAgICAgICovXG4gICAgICBkaXNhYmxlQ29udHJvbHMoKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5kaXNhYmxlQ29udHJvbHMoKTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gRXZlbnQgQVBJXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgICAgLyoqXG4gICAgICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXJcbiAgICAgICAqIEBwYXJhbSBldmVudCAtIEV2ZW50IG5hbWVcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICovXG4gICAgICBvbihldmVudDogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbik6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQub24/LihldmVudCwgaGFuZGxlcik7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBhbiBldmVudCBsaXN0ZW5lclxuICAgICAgICogQHBhcmFtIGV2ZW50IC0gRXZlbnQgbmFtZVxuICAgICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICAgKi9cbiAgICAgIG9mZihldmVudDogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbik6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQub2ZmPy4oZXZlbnQsIGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBFbWl0IGFuIGV2ZW50XG4gICAgICAgKiBAcGFyYW0gZXZlbnQgLSBFdmVudCBuYW1lXG4gICAgICAgKiBAcGFyYW0gZGF0YSAtIEV2ZW50IGRhdGFcbiAgICAgICAqL1xuICAgICAgZW1pdChldmVudDogc3RyaW5nLCBkYXRhPzogdW5rbm93bik6IHZvaWQge1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKGV2ZW50LCBkYXRhKTtcbiAgICAgIH0sXG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gTGlmZWN5Y2xlIEFQSVxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgIC8qKlxuICAgICAgICogRGVzdHJveSB0aGUgZm9ybSBhbmQgY2xlYW4gdXAgcmVzb3VyY2VzXG4gICAgICAgKi9cbiAgICAgIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIC8vIENsZWFyIGFsbCBmaWVsZCBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgZm9yIChjb25zdCBbLCBmaWVsZF0gb2YgY29tcG9uZW50LmZpZWxkcykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZmllbGQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBmaWVsZC5kZXN0cm95KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgY29udHJvbCBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgZm9yIChjb25zdCBbLCBjb250cm9sXSBvZiBjb21wb25lbnQuY29udHJvbHMpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNvbnRyb2wuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBjb250cm9sLmRlc3Ryb3koKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsIGxpZmVjeWNsZSBkZXN0cm95IGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAoY29tcG9uZW50LmxpZmVjeWNsZT8uZGVzdHJveSkge1xuICAgICAgICAgIGNvbXBvbmVudC5saWZlY3ljbGUuZGVzdHJveSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIGZvcm0gZWxlbWVudCBmcm9tIERPTVxuICAgICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQ/LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICBjb21wb25lbnQuZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNvbXBvbmVudC5lbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgZGVzdHJveSBldmVudFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLlJFU0VUKTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIFdpcmUgdXAgY29udHJvbCBidXR0b24gY2xpY2sgaGFuZGxlcnNcbiAgICB3aXJlQ29udHJvbEJ1dHRvbnMoY29tcG9uZW50LmNvbnRyb2xzLCBhcGksIGNvbmZpZyk7XG5cbiAgICByZXR1cm4gYXBpO1xuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgd2l0aEFQSTtcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlCTyxTQUFTLFdBQVcsQ0FDekIsSUFDQSxJQUNBLElBQ0EsSUFDUTtBQUFBLEVBQ1IsT0FBTyxLQUFLLEtBQUssS0FBSyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7QUFBQTtBQVl2RCxTQUFTLFFBQVEsQ0FDdEIsSUFDQSxJQUNBLElBQ0EsSUFDUTtBQUFBLEVBQ1IsTUFBTSxRQUFTLEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxFQUFFLElBQUksTUFBTyxLQUFLO0FBQUEsRUFDMUQsT0FBTyxRQUFRLElBQUksUUFBUSxNQUFNO0FBQUE7QUFXNUIsU0FBUyxrQkFBa0IsQ0FDaEMsTUFDQSxlQUNBLE9BQ2M7QUFBQSxFQUNkLE1BQU0sVUFBVSxLQUFLLElBQUk7QUFBQSxFQUN6QixJQUFJLG1CQUFtQjtBQUFBLEVBRXZCLE1BQU0sUUFBc0I7QUFBQSxJQUMxQjtBQUFBLElBQ0E7QUFBQSxJQUNBLFFBQ0csTUFBTSxVQUEyQixjQUFjO0FBQUEsSUFDbEQsV0FBVyxNQUFNO0FBQUEsSUFDakI7QUFBQSxJ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
|
|
7234
|
+
//# debugId=BFBF5E4EB122DD5D64756E2164756E21
|
|
7235
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvdXRpbHMudHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvdGFwLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL3N3aXBlLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL2xvbmdwcmVzcy50cyIsICIuLi9zcmMvY29yZS9nZXN0dXJlcy9wYW4udHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvcGluY2gudHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvcm90YXRlLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL21hbmFnZXIudHMiLCAiLi4vc3JjL2NvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlcy9pbmRleC50cyIsICIuLi9zcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3RhcC50cyIsICIuLi9zcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3N3aXBlLnRzIiwgIi4uL3NyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvbG9uZ3ByZXNzLnRzIiwgIi4uL3NyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvcGFuLnRzIiwgIi4uL3NyYy9jb3JlL2xheW91dC9zY2hlbWEudHMiLCAiLi4vc3JjL2NvcmUvbGF5b3V0L2NvbmZpZy50cyIsICIuLi9zcmMvY29yZS9sYXlvdXQvanN4LnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L3ZpZXdwb3J0LnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3V0aWxzLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2Jhc2UudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvY29uc3RhbnRzLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3ZpcnR1YWwudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvc2Nyb2xsaW5nLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL21vbWVudHVtLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3Njcm9sbGJhci50cyIsICIuLi9zcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9jb2xsZWN0aW9uLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3BsYWNlaG9sZGVycy50cyIsICIuLi9zcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9yZW5kZXJpbmcudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvZXZlbnRzLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L3ZsaXN0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL3ZpZXdwb3J0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL2FwaS50cyIsICIuLi9zcmMvY29tcG9uZW50cy92bGlzdC9jb25zdGFudHMudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvdmxpc3QvZmVhdHVyZXMvc2VsZWN0aW9uLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL2tleWJvYXJkLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZm9ybS50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2xheW91dC50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2NvbnN0YW50cy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2NvbmZpZy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2ZpZWxkcy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2RhdGEudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9jb250cm9sbGVyLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZmVhdHVyZXMvc3VibWl0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZmVhdHVyZXMvcHJvdGVjdGlvbi50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2FwaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy91dGlscy50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgZ2VzdHVyZSBkZXRlY3Rpb25cbiAqL1xuXG5pbXBvcnQgeyBHZXN0dXJlRXZlbnQsIEdlc3R1cmVTdGF0ZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQ2FsY3VsYXRlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50c1xuICpcbiAqIEBwYXJhbSB4MSAtIFggY29vcmRpbmF0ZSBvZiBmaXJzdCBwb2ludFxuICogQHBhcmFtIHkxIC0gWSBjb29yZGluYXRlIG9mIGZpcnN0IHBvaW50XG4gKiBAcGFyYW0geDIgLSBYIGNvb3JkaW5hdGUgb2Ygc2Vjb25kIHBvaW50XG4gKiBAcGFyYW0geTIgLSBZIGNvb3JkaW5hdGUgb2Ygc2Vjb25kIHBvaW50XG4gKiBAcmV0dXJucyBEaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpc3RhbmNlKFxuICB4MTogbnVtYmVyLFxuICB5MTogbnVtYmVyLFxuICB4MjogbnVtYmVyLFxuICB5MjogbnVtYmVyXG4pOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHgyIC0geDEsIDIpICsgTWF0aC5wb3coeTIgLSB5MSwgMikpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBhbmdsZSBiZXR3ZWVuIHR3byBwb2ludHMgaW4gZGVncmVlcyAoMC0zNjApXG4gKlxuICogQHBhcmFtIHgxIC0gWCBjb29yZGluYXRlIG9mIGZpcnN0IHBvaW50XG4gKiBAcGFyYW0geTEgLSBZIGNvb3JkaW5hdGUgb2YgZmlyc3QgcG9pbnRcbiAqIEBwYXJhbSB4MiAtIFggY29vcmRpbmF0ZSBvZiBzZWNvbmQgcG9pbnRcbiAqIEBwYXJhbSB5MiAtIFkgY29vcmRpbmF0ZSBvZiBzZWNvbmQgcG9pbnRcbiAqIEByZXR1cm5zIEFuZ2xlIGluIGRlZ3JlZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFuZ2xlKFxuICB4MTogbnVtYmVyLFxuICB5MTogbnVtYmVyLFxuICB4MjogbnVtYmVyLFxuICB5MjogbnVtYmVyXG4pOiBudW1iZXIge1xuICBjb25zdCBhbmdsZSA9IChNYXRoLmF0YW4yKHkyIC0geTEsIHgyIC0geDEpICogMTgwKSAvIE1hdGguUEk7XG4gIHJldHVybiBhbmdsZSA8IDAgPyBhbmdsZSArIDM2MCA6IGFuZ2xlO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGJhc2UgZ2VzdHVyZSBldmVudFxuICpcbiAqIEBwYXJhbSB0eXBlIC0gVHlwZSBvZiBnZXN0dXJlXG4gKiBAcGFyYW0gb3JpZ2luYWxFdmVudCAtIE9yaWdpbmFsIERPTSBldmVudFxuICogQHBhcmFtIHN0YXRlIC0gQ3VycmVudCBnZXN0dXJlIHN0YXRlXG4gKiBAcmV0dXJucyBCYXNlIGdlc3R1cmUgZXZlbnQgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHZXN0dXJlRXZlbnQoXG4gIHR5cGU6IHN0cmluZyxcbiAgb3JpZ2luYWxFdmVudDogRXZlbnQsXG4gIHN0YXRlOiBHZXN0dXJlU3RhdGVcbik6IEdlc3R1cmVFdmVudCB7XG4gIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICBsZXQgZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlO1xuXG4gIGNvbnN0IGV2ZW50OiBHZXN0dXJlRXZlbnQgPSB7XG4gICAgdHlwZSxcbiAgICBvcmlnaW5hbEV2ZW50LFxuICAgIHRhcmdldDpcbiAgICAgIChzdGF0ZS50YXJnZXQgYXMgRXZlbnRUYXJnZXQpIHx8IChvcmlnaW5hbEV2ZW50LnRhcmdldCBhcyBFdmVudFRhcmdldCksXG4gICAgc3RhcnRUaW1lOiBzdGF0ZS5zdGFydFRpbWUsXG4gICAgZW5kVGltZSxcbiAgICBkdXJhdGlvbjogZW5kVGltZSAtIHN0YXRlLnN0YXJ0VGltZSxcbiAgICBkZWZhdWx0UHJldmVudGVkLFxuICAgIHByZXZlbnREZWZhdWx0OiAoKSA9PiB7XG4gICAgICBkZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgIGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgaWYgKG9yaWdpbmFsRXZlbnQuY2FuY2VsYWJsZSkge1xuICAgICAgICBvcmlnaW5hbEV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBzdG9wUHJvcGFnYXRpb246ICgpID0+IHtcbiAgICAgIG9yaWdpbmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gZXZlbnQ7XG59XG5cbi8qKlxuICogRGV0ZWN0IGlmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgdG91Y2ggZXZlbnRzXG4gKlxuICogQHJldHVybnMgV2hldGhlciB0b3VjaCBpcyBzdXBwb3J0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1RvdWNoU3VwcG9ydCgpOiBib29sZWFuIHtcbiAgY29uc3QgbWF4UG9pbnRzID0gKG5hdmlnYXRvciBhcyBhbnkpLm1heFRvdWNoUG9pbnRzO1xuICByZXR1cm4gKFxuICAgIFwib250b3VjaHN0YXJ0XCIgaW4gd2luZG93IHx8ICh0eXBlb2YgbWF4UG9pbnRzID09PSBcIm51bWJlclwiICYmIG1heFBvaW50cyA+IDApXG4gICk7XG59XG5cbi8qKlxuICogRGV0ZWN0IGlmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgcG9pbnRlciBldmVudHNcbiAqXG4gKiBAcmV0dXJucyBXaGV0aGVyIHBvaW50ZXIgZXZlbnRzIGFyZSBzdXBwb3J0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1BvaW50ZXJTdXBwb3J0KCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISF3aW5kb3cuUG9pbnRlckV2ZW50O1xufVxuXG4vKipcbiAqIEV4dHJhY3Qgbm9ybWFsaXplZCB0b3VjaCBjb29yZGluYXRlcyBmcm9tIGFuIGV2ZW50XG4gKiBXb3JrcyB3aXRoIG1vdXNlIGV2ZW50cywgdG91Y2ggZXZlbnRzIGFuZCBwb2ludGVyIGV2ZW50c1xuICpcbiAqIEBwYXJhbSBlIC0gRE9NIGV2ZW50XG4gKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBjbGllbnRYIGFuZCBjbGllbnRZIGNvb3JkaW5hdGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUb3VjaENvb3JkaW5hdGVzKFxuICBlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCB8IFBvaW50ZXJFdmVudFxuKTogeyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9IHtcbiAgaWYgKFwidG91Y2hlc1wiIGluIGUgJiYgQXJyYXkuaXNBcnJheShlLnRvdWNoZXMpICYmIGUudG91Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsaWVudFg6IGUudG91Y2hlc1swXS5jbGllbnRYLFxuICAgICAgY2xpZW50WTogZS50b3VjaGVzWzBdLmNsaWVudFksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2xpZW50WDogKGUgYXMgTW91c2VFdmVudCB8IFBvaW50ZXJFdmVudCkuY2xpZW50WCxcbiAgICBjbGllbnRZOiAoZSBhcyBNb3VzZUV2ZW50IHwgUG9pbnRlckV2ZW50KS5jbGllbnRZLFxuICB9O1xufVxuIiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy90YXAudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gVGFwIGdlc3R1cmUgZGV0ZWN0aW9uXG4gKi9cblxuaW1wb3J0IHsgVGFwRXZlbnQsIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0IH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVHZXN0dXJlRXZlbnQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBEZXRlY3QgdGFwIGdlc3R1cmVcbiAqIFxuICogQHBhcmFtIGNvbnRleHQgLSBHZXN0dXJlIGRldGVjdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBUYXAgZXZlbnQgb3IgbnVsbCBpZiBubyB0YXAgZGV0ZWN0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFRhcChjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCk6IFRhcEV2ZW50IHwgbnVsbCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9wdGlvbnMsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG4gIFxuICAvLyBDYWxjdWxhdGUgZGlzdGFuY2UgYmV0d2VlbiBzdGFydCBhbmQgY3VycmVudCBwb3NpdGlvblxuICBjb25zdCBkZWx0YVggPSBzdGF0ZS5jdXJyZW50WCAtIHN0YXRlLnN0YXJ0WDtcbiAgY29uc3QgZGVsdGFZID0gc3RhdGUuY3VycmVudFkgLSBzdGF0ZS5zdGFydFk7XG4gIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG4gIFxuICAvLyBDaGVjayBpZiBtb3ZlbWVudCBpcyB3aXRoaW4gdGhyZXNob2xkXG4gIGlmIChkaXN0YW5jZSA8IG9wdGlvbnMudGFwRGlzdGFuY2VUaHJlc2hvbGQpIHtcbiAgICAvLyBDaGVjayBmb3IgZG91YmxlIHRhcFxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgaXNEb3VibGVUYXAgPSBub3cgLSBzdGF0ZS5sYXN0VGFwVGltZSA8IDMwMDtcbiAgICBcbiAgICBjb25zdCB0YXBDb3VudCA9IGlzRG91YmxlVGFwID8gc3RhdGUudGFwQ291bnQgKyAxIDogMTtcbiAgICBcbiAgICAvLyBDcmVhdGUgdGFwIGV2ZW50XG4gICAgY29uc3QgdGFwRXZlbnQ6IFRhcEV2ZW50ID0ge1xuICAgICAgLi4uY3JlYXRlR2VzdHVyZUV2ZW50KCd0YXAnLCBvcmlnaW5hbEV2ZW50LCBzdGF0ZSksXG4gICAgICB0eXBlOiAndGFwJyxcbiAgICAgIGNvdW50OiB0YXBDb3VudCxcbiAgICAgIHg6IHN0YXRlLmN1cnJlbnRYLFxuICAgICAgeTogc3RhdGUuY3VycmVudFlcbiAgICB9O1xuICAgIFxuICAgIHJldHVybiB0YXBFdmVudDtcbiAgfVxuICBcbiAgcmV0dXJuIG51bGw7XG59IiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy9zd2lwZS50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBTd2lwZSBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IFN3aXBlRXZlbnQsIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0LCBTV0lQRV9ESVJFQ1RJT05TIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVHZXN0dXJlRXZlbnQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBEZXRlcm1pbmUgc3dpcGUgZGlyZWN0aW9uIGJhc2VkIG9uIGRlbHRhIFggYW5kIFlcbiAqIFxuICogQHBhcmFtIGRlbHRhWCAtIERpc3RhbmNlIG1vdmVkIGluIFggZGlyZWN0aW9uXG4gKiBAcGFyYW0gZGVsdGFZIC0gRGlzdGFuY2UgbW92ZWQgaW4gWSBkaXJlY3Rpb25cbiAqIEByZXR1cm5zIERpcmVjdGlvbiBvZiB0aGUgc3dpcGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN3aXBlRGlyZWN0aW9uKGRlbHRhWDogbnVtYmVyLCBkZWx0YVk6IG51bWJlcik6IFNXSVBFX0RJUkVDVElPTlMge1xuICBpZiAoTWF0aC5hYnMoZGVsdGFYKSA+IE1hdGguYWJzKGRlbHRhWSkpIHtcbiAgICByZXR1cm4gZGVsdGFYID4gMCA/IFNXSVBFX0RJUkVDVElPTlMuUklHSFQgOiBTV0lQRV9ESVJFQ1RJT05TLkxFRlQ7XG4gIH1cbiAgcmV0dXJuIGRlbHRhWSA+IDAgPyBTV0lQRV9ESVJFQ1RJT05TLkRPV04gOiBTV0lQRV9ESVJFQ1RJT05TLlVQO1xufVxuXG4vKipcbiAqIERldGVjdCBzd2lwZSBnZXN0dXJlXG4gKiBcbiAqIEBwYXJhbSBjb250ZXh0IC0gR2VzdHVyZSBkZXRlY3Rpb24gY29udGV4dFxuICogQHJldHVybnMgU3dpcGUgZXZlbnQgb3IgbnVsbCBpZiBubyBzd2lwZSBkZXRlY3RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0U3dpcGUoY29udGV4dDogR2VzdHVyZURldGVjdGlvbkNvbnRleHQpOiBTd2lwZUV2ZW50IHwgbnVsbCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9wdGlvbnMsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG4gIFxuICAvLyBDYWxjdWxhdGUgZGVsdGFzIGFuZCBkaXN0YW5jZVxuICBjb25zdCBkZWx0YVggPSBzdGF0ZS5jdXJyZW50WCAtIHN0YXRlLnN0YXJ0WDtcbiAgY29uc3QgZGVsdGFZID0gc3RhdGUuY3VycmVudFkgLSBzdGF0ZS5zdGFydFk7XG4gIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG4gIFxuICAvLyBDYWxjdWxhdGUgdGltZSBhbmQgdmVsb2NpdHlcbiAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gIGNvbnN0IGRlbHRhVGltZSA9IGVuZFRpbWUgLSBzdGF0ZS5zdGFydFRpbWU7XG4gIGNvbnN0IHZlbG9jaXR5ID0gZGlzdGFuY2UgLyBkZWx0YVRpbWU7XG4gIFxuICAvLyBDaGVjayBpZiBpdCdzIGEgc3dpcGVcbiAgaWYgKGRpc3RhbmNlID49IG9wdGlvbnMuc3dpcGVUaHJlc2hvbGQgJiYgZGVsdGFUaW1lIDw9IG9wdGlvbnMuc3dpcGVUaW1lVGhyZXNob2xkKSB7XG4gICAgY29uc3QgZGlyZWN0aW9uID0gZ2V0U3dpcGVEaXJlY3Rpb24oZGVsdGFYLCBkZWx0YVkpO1xuICAgIFxuICAgIC8vIENyZWF0ZSBzd2lwZSBldmVudFxuICAgIGNvbnN0IHN3aXBlRXZlbnQ6IFN3aXBlRXZlbnQgPSB7XG4gICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoJ3N3aXBlJywgb3JpZ2luYWxFdmVudCwgc3RhdGUpLFxuICAgICAgdHlwZTogJ3N3aXBlJyxcbiAgICAgIGRpcmVjdGlvbixcbiAgICAgIGRlbHRhWCxcbiAgICAgIGRlbHRhWSxcbiAgICAgIGRpc3RhbmNlLFxuICAgICAgdmVsb2NpdHksXG4gICAgICBzdGFydFg6IHN0YXRlLnN0YXJ0WCxcbiAgICAgIHN0YXJ0WTogc3RhdGUuc3RhcnRZLFxuICAgICAgZW5kWDogc3RhdGUuY3VycmVudFgsXG4gICAgICBlbmRZOiBzdGF0ZS5jdXJyZW50WVxuICAgIH07XG4gICAgXG4gICAgcmV0dXJuIHN3aXBlRXZlbnQ7XG4gIH1cbiAgXG4gIHJldHVybiBudWxsO1xufSIsCiAgICAiLy8gc3JjL2NvcmUvZ2VzdHVyZXMvbG9uZ3ByZXNzLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIExvbmcgcHJlc3MgZ2VzdHVyZSBkZXRlY3Rpb25cbiAqL1xuXG5pbXBvcnQgeyBMb25nUHJlc3NFdmVudCwgR2VzdHVyZURldGVjdGlvbkNvbnRleHQgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUdlc3R1cmVFdmVudCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIERldGVjdCBsb25nIHByZXNzIGdlc3R1cmVcbiAqIFxuICogVGhpcyBpcyBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSBvdGhlciBnZXN0dXJlIGRldGVjdG9ycyBhcyBpdCBzZXRzIHVwIGEgdGltZXJcbiAqIGFuZCByZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSB0aW1lciBjb21wbGV0ZXMuXG4gKiBcbiAqIEBwYXJhbSBjb250ZXh0IC0gR2VzdHVyZSBkZXRlY3Rpb24gY29udGV4dFxuICogQHBhcmFtIGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gY2FsbCB3aGVuIGxvbmcgcHJlc3MgaXMgZGV0ZWN0ZWRcbiAqIEByZXR1cm5zIENsZWFudXAgZnVuY3Rpb24gdG8gY2FuY2VsIHRoZSBsb25nIHByZXNzIGRldGVjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0TG9uZ1ByZXNzKFxuICBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCxcbiAgY2FsbGJhY2s6IChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWRcbik6ICgpID0+IHZvaWQge1xuICBjb25zdCB7IHN0YXRlLCBvcHRpb25zLCBvcmlnaW5hbEV2ZW50IH0gPSBjb250ZXh0O1xuICBcbiAgLy8gU2V0IGEgdGltZXIgZm9yIGxvbmcgcHJlc3MgZGV0ZWN0aW9uXG4gIGNvbnN0IHRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgIC8vIE9ubHkgdHJpZ2dlciBpZiBnZXN0dXJlIGlzIHN0aWxsIGFjdGl2ZVxuICAgIGlmIChzdGF0ZS5hY3RpdmUpIHtcbiAgICAgIC8vIENoZWNrIGlmIG1vdmVtZW50IGlzIHdpdGhpbiB0aHJlc2hvbGRcbiAgICAgIGNvbnN0IGRpZmZYID0gTWF0aC5hYnMoc3RhdGUuY3VycmVudFggLSBzdGF0ZS5zdGFydFgpO1xuICAgICAgY29uc3QgZGlmZlkgPSBNYXRoLmFicyhzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLnN0YXJ0WSk7XG4gICAgICBcbiAgICAgIGlmIChkaWZmWCA8IG9wdGlvbnMudGFwRGlzdGFuY2VUaHJlc2hvbGQgJiYgZGlmZlkgPCBvcHRpb25zLnRhcERpc3RhbmNlVGhyZXNob2xkKSB7XG4gICAgICAgIC8vIENyZWF0ZSBsb25nIHByZXNzIGV2ZW50XG4gICAgICAgIGNvbnN0IGxvbmdQcmVzc0V2ZW50OiBMb25nUHJlc3NFdmVudCA9IHtcbiAgICAgICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoJ2xvbmdwcmVzcycsIG9yaWdpbmFsRXZlbnQsIHN0YXRlKSxcbiAgICAgICAgICB0eXBlOiAnbG9uZ3ByZXNzJyxcbiAgICAgICAgICB4OiBzdGF0ZS5jdXJyZW50WCxcbiAgICAgICAgICB5OiBzdGF0ZS5jdXJyZW50WVxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgLy8gVHJpZ2dlciBjYWxsYmFja1xuICAgICAgICBjYWxsYmFjayhsb25nUHJlc3NFdmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBvcHRpb25zLmxvbmdQcmVzc1RpbWUpO1xuICBcbiAgLy8gUmV0dXJuIGNsZWFudXAgZnVuY3Rpb25cbiAgcmV0dXJuICgpID0+IHtcbiAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICB9O1xufVxuXG4vKipcbiAqIENoZWNrIGlmIG1vdmVtZW50IHdvdWxkIGNhbmNlbCBhIGxvbmcgcHJlc3NcbiAqIFxuICogQHBhcmFtIGNvbnRleHQgLSBHZXN0dXJlIGRldGVjdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsb25nIHByZXNzIHNob3VsZCBiZSBjYW5jZWxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkQ2FuY2VsTG9uZ1ByZXNzKGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0KTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgc3RhdGUsIG9wdGlvbnMgfSA9IGNvbnRleHQ7XG4gIFxuICBjb25zdCBkaWZmWCA9IE1hdGguYWJzKHN0YXRlLmN1cnJlbnRYIC0gc3RhdGUuc3RhcnRYKTtcbiAgY29uc3QgZGlmZlkgPSBNYXRoLmFicyhzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLnN0YXJ0WSk7XG4gIFxuICByZXR1cm4gZGlmZlggPiBvcHRpb25zLnRhcERpc3RhbmNlVGhyZXNob2xkIHx8IGRpZmZZID4gb3B0aW9ucy50YXBEaXN0YW5jZVRocmVzaG9sZDtcbn0iLAogICAgIi8vIHNyYy9jb3JlL2dlc3R1cmVzL3Bhbi50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBQYW4gZ2VzdHVyZSBkZXRlY3Rpb25cbiAqL1xuXG5pbXBvcnQgeyBQYW5FdmVudCwgR2VzdHVyZURldGVjdGlvbkNvbnRleHQgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlR2VzdHVyZUV2ZW50IH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBEZXRlY3QgcGFuIGdlc3R1cmVcbiAqXG4gKiBAcGFyYW0gY29udGV4dCAtIEdlc3R1cmUgZGV0ZWN0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIFBhbiBldmVudCBvciBudWxsIGlmIG5vIHNpZ25pZmljYW50IG1vdmVtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RQYW4oY29udGV4dDogR2VzdHVyZURldGVjdGlvbkNvbnRleHQpOiBQYW5FdmVudCB8IG51bGwge1xuICBjb25zdCB7IHN0YXRlLCBvcmlnaW5hbEV2ZW50IH0gPSBjb250ZXh0O1xuXG4gIC8vIENhbGN1bGF0ZSBkZWx0YSBmcm9tIHN0YXJ0IHBvc2l0aW9uXG4gIGNvbnN0IGRlbHRhWCA9IHN0YXRlLmN1cnJlbnRYIC0gc3RhdGUuc3RhcnRYO1xuICBjb25zdCBkZWx0YVkgPSBzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLnN0YXJ0WTtcblxuICAvLyBDYWxjdWxhdGUgZGVsdGEgZnJvbSBsYXN0IHBvc2l0aW9uIHRvIGRldGVybWluZSBpZiB0aGVyZSdzIHNpZ25pZmljYW50IG1vdmVtZW50XG4gIGNvbnN0IG1vdmVEZWx0YVggPSBzdGF0ZS5jdXJyZW50WCAtIHN0YXRlLmxhc3RYO1xuICBjb25zdCBtb3ZlRGVsdGFZID0gc3RhdGUuY3VycmVudFkgLSBzdGF0ZS5sYXN0WTtcbiAgY29uc3QgbW92ZURlbHRhID0gTWF0aC5zcXJ0KFxuICAgIG1vdmVEZWx0YVggKiBtb3ZlRGVsdGFYICsgbW92ZURlbHRhWSAqIG1vdmVEZWx0YVlcbiAgKTtcblxuICAvLyBDaGVjayBpZiBtb3ZlbWVudCBpcyBzaWduaWZpY2FudFxuICBpZiAobW92ZURlbHRhID4gMCkge1xuICAgIC8vIENyZWF0ZSBwYW4gZXZlbnRcbiAgICBjb25zdCBwYW5FdmVudDogUGFuRXZlbnQgPSB7XG4gICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoXCJwYW5cIiwgb3JpZ2luYWxFdmVudCwgc3RhdGUpLFxuICAgICAgdHlwZTogXCJwYW5cIixcbiAgICAgIGRlbHRhWCxcbiAgICAgIGRlbHRhWSxcbiAgICAgIHN0YXJ0WDogc3RhdGUuc3RhcnRYLFxuICAgICAgc3RhcnRZOiBzdGF0ZS5zdGFydFksXG4gICAgICBjdXJyZW50WDogc3RhdGUuY3VycmVudFgsXG4gICAgICBjdXJyZW50WTogc3RhdGUuY3VycmVudFksXG4gICAgfTtcblxuICAgIHJldHVybiBwYW5FdmVudDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy9waW5jaC50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBQaW5jaCBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IFBpbmNoRXZlbnQsIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUdlc3R1cmVFdmVudCwgZ2V0RGlzdGFuY2UgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIERldGVjdCBwaW5jaCBnZXN0dXJlXG4gKlxuICogQHBhcmFtIGNvbnRleHQgLSBHZXN0dXJlIGRldGVjdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gdG91Y2gxIC0gRmlyc3QgdG91Y2ggcG9pbnRcbiAqIEBwYXJhbSB0b3VjaDIgLSBTZWNvbmQgdG91Y2ggcG9pbnRcbiAqIEByZXR1cm5zIFBpbmNoIGV2ZW50IG9yIG51bGwgaWYgbm8gcGluY2ggZGV0ZWN0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFBpbmNoKFxuICBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCxcbiAgdG91Y2gxOiBUb3VjaCxcbiAgdG91Y2gyOiBUb3VjaFxuKTogUGluY2hFdmVudCB8IG51bGwge1xuICBjb25zdCB7IHN0YXRlLCBvcmlnaW5hbEV2ZW50IH0gPSBjb250ZXh0O1xuXG4gIC8vIENhbGN1bGF0ZSBjdXJyZW50IGRpc3RhbmNlIGJldHdlZW4gdG91Y2ggcG9pbnRzXG4gIGNvbnN0IGN1cnJlbnREaXN0YW5jZSA9IGdldERpc3RhbmNlKFxuICAgIHRvdWNoMS5jbGllbnRYLFxuICAgIHRvdWNoMS5jbGllbnRZLFxuICAgIHRvdWNoMi5jbGllbnRYLFxuICAgIHRvdWNoMi5jbGllbnRZXG4gICk7XG5cbiAgLy8gTWluaW11bSBtb3ZlbWVudCB0aHJlc2hvbGQgZm9yIHBpbmNoIGRldGVjdGlvblxuICBjb25zdCBQSU5DSF9USFJFU0hPTEQgPSAxMDtcblxuICAvLyBDaGVjayBpZiB0aGUgZGlzdGFuY2UgY2hhbmdlIGlzIHNpZ25pZmljYW50XG4gIGlmIChNYXRoLmFicyhjdXJyZW50RGlzdGFuY2UgLSBzdGF0ZS5zdGFydERpc3RhbmNlKSA+IFBJTkNIX1RIUkVTSE9MRCkge1xuICAgIC8vIENhbGN1bGF0ZSBzY2FsZSBmYWN0b3JcbiAgICBjb25zdCBzY2FsZSA9IGN1cnJlbnREaXN0YW5jZSAvIHN0YXRlLnN0YXJ0RGlzdGFuY2U7XG5cbiAgICAvLyBDYWxjdWxhdGUgY2VudGVyIHBvaW50XG4gICAgY29uc3QgY2VudGVyWCA9ICh0b3VjaDEuY2xpZW50WCArIHRvdWNoMi5jbGllbnRYKSAvIDI7XG4gICAgY29uc3QgY2VudGVyWSA9ICh0b3VjaDEuY2xpZW50WSArIHRvdWNoMi5jbGllbnRZKSAvIDI7XG5cbiAgICAvLyBDcmVhdGUgcGluY2ggZXZlbnRcbiAgICBjb25zdCBwaW5jaEV2ZW50OiBQaW5jaEV2ZW50ID0ge1xuICAgICAgLi4uY3JlYXRlR2VzdHVyZUV2ZW50KFwicGluY2hcIiwgb3JpZ2luYWxFdmVudCwgc3RhdGUpLFxuICAgICAgdHlwZTogXCJwaW5jaFwiLFxuICAgICAgc2NhbGUsXG4gICAgICBjZW50ZXJYLFxuICAgICAgY2VudGVyWSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHBpbmNoRXZlbnQ7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsCiAgICAiLy8gc3JjL2NvcmUvZ2VzdHVyZXMvcm90YXRlLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIFJvdGF0ZSBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IFJvdGF0ZUV2ZW50LCBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBjcmVhdGVHZXN0dXJlRXZlbnQsIGdldEFuZ2xlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBEZXRlY3Qgcm90YXRlIGdlc3R1cmVcbiAqXG4gKiBAcGFyYW0gY29udGV4dCAtIEdlc3R1cmUgZGV0ZWN0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB0b3VjaDEgLSBGaXJzdCB0b3VjaCBwb2ludFxuICogQHBhcmFtIHRvdWNoMiAtIFNlY29uZCB0b3VjaCBwb2ludFxuICogQHJldHVybnMgUm90YXRlIGV2ZW50IG9yIG51bGwgaWYgbm8gcm90YXRpb24gZGV0ZWN0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFJvdGF0ZShcbiAgY29udGV4dDogR2VzdHVyZURldGVjdGlvbkNvbnRleHQsXG4gIHRvdWNoMTogVG91Y2gsXG4gIHRvdWNoMjogVG91Y2hcbik6IFJvdGF0ZUV2ZW50IHwgbnVsbCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG5cbiAgLy8gQ2FsY3VsYXRlIGN1cnJlbnQgYW5nbGUgYmV0d2VlbiB0b3VjaCBwb2ludHNcbiAgY29uc3QgY3VycmVudEFuZ2xlID0gZ2V0QW5nbGUoXG4gICAgdG91Y2gxLmNsaWVudFgsXG4gICAgdG91Y2gxLmNsaWVudFksXG4gICAgdG91Y2gyLmNsaWVudFgsXG4gICAgdG91Y2gyLmNsaWVudFlcbiAgKTtcblxuICAvLyBNaW5pbXVtIHJvdGF0aW9uIHRocmVzaG9sZCBmb3IgZGV0ZWN0aW9uXG4gIGNvbnN0IFJPVEFUSU9OX1RIUkVTSE9MRCA9IDEwO1xuXG4gIC8vIENhbGN1bGF0ZSByb3RhdGlvbiBkaWZmZXJlbmNlXG4gIGNvbnN0IHJvdGF0aW9uRGlmZiA9IGN1cnJlbnRBbmdsZSAtIHN0YXRlLnN0YXJ0QW5nbGU7XG5cbiAgLy8gQ2hlY2sgaWYgcm90YXRpb24gaXMgc2lnbmlmaWNhbnRcbiAgaWYgKE1hdGguYWJzKHJvdGF0aW9uRGlmZikgPiBST1RBVElPTl9USFJFU0hPTEQpIHtcbiAgICAvLyBDYWxjdWxhdGUgY2VudGVyIHBvaW50XG4gICAgY29uc3QgY2VudGVyWCA9ICh0b3VjaDEuY2xpZW50WCArIHRvdWNoMi5jbGllbnRYKSAvIDI7XG4gICAgY29uc3QgY2VudGVyWSA9ICh0b3VjaDEuY2xpZW50WSArIHRvdWNoMi5jbGllbnRZKSAvIDI7XG5cbiAgICAvLyBDcmVhdGUgcm90YXRlIGV2ZW50XG4gICAgY29uc3Qgcm90YXRlRXZlbnQ6IFJvdGF0ZUV2ZW50ID0ge1xuICAgICAgLi4uY3JlYXRlR2VzdHVyZUV2ZW50KFwicm90YXRlXCIsIG9yaWdpbmFsRXZlbnQsIHN0YXRlKSxcbiAgICAgIHR5cGU6IFwicm90YXRlXCIsXG4gICAgICByb3RhdGlvbjogcm90YXRpb25EaWZmLFxuICAgICAgY2VudGVyWCxcbiAgICAgIGNlbnRlclksXG4gICAgfTtcblxuICAgIHJldHVybiByb3RhdGVFdmVudDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy9tYW5hZ2VyLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIEdlc3R1cmUgbWFuYWdlbWVudCBzeXN0ZW0gZm9yIGhhbmRsaW5nIHRvdWNoIGFuZCBtb3VzZSBpbnRlcmFjdGlvbnNcbiAqL1xuXG5pbXBvcnQgeyBcbiAgR2VzdHVyZUNvbmZpZyxcbiAgR2VzdHVyZU1hbmFnZXIsXG4gIEdlc3R1cmVTdGF0ZSxcbiAgR2VzdHVyZUhhbmRsZXIsXG4gIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0LFxuICBBbnlHZXN0dXJlRXZlbnQsXG4gIEdFU1RVUkVfVFlQRVMsXG4gIFNXSVBFX0RJUkVDVElPTlNcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmltcG9ydCB7IGRldGVjdFRhcCB9IGZyb20gJy4vdGFwJztcbmltcG9ydCB7IGRldGVjdFN3aXBlIH0gZnJvbSAnLi9zd2lwZSc7XG5pbXBvcnQgeyBkZXRlY3RMb25nUHJlc3MsIHNob3VsZENhbmNlbExvbmdQcmVzcyB9IGZyb20gJy4vbG9uZ3ByZXNzJztcbmltcG9ydCB7IGRldGVjdFBhbiB9IGZyb20gJy4vcGFuJztcbmltcG9ydCB7IGRldGVjdFBpbmNoIH0gZnJvbSAnLi9waW5jaCc7XG5pbXBvcnQgeyBkZXRlY3RSb3RhdGUgfSBmcm9tICcuL3JvdGF0ZSc7XG5pbXBvcnQgeyBoYXNUb3VjaFN1cHBvcnQsIGhhc1BvaW50ZXJTdXBwb3J0LCBnZXRUb3VjaENvb3JkaW5hdGVzIH0gZnJvbSAnLi91dGlscyc7XG5cbi8vIFJlLWV4cG9ydCB0eXBlcyBhbmQgY29uc3RhbnRzXG5leHBvcnQgeyBHRVNUVVJFX1RZUEVTLCBTV0lQRV9ESVJFQ1RJT05TIH07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGdlc3R1cmUgbWFuYWdlciBmb3IgaGFuZGxpbmcgdG91Y2ggYW5kIG1vdXNlIGludGVyYWN0aW9uc1xuICogXG4gKiBAcGFyYW0gZWxlbWVudCAtIERPTSBlbGVtZW50IHRvIGF0dGFjaCBnZXN0dXJlIHJlY29nbml0aW9uIHRvXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyBHZXN0dXJlIG1hbmFnZXIgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUdlc3R1cmVNYW5hZ2VyID0gKFxuICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgY29uZmlnOiBHZXN0dXJlQ29uZmlnID0ge31cbik6IEdlc3R1cmVNYW5hZ2VyID0+IHtcbiAgLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uXG4gIGNvbnN0IG9wdGlvbnM6IFJlcXVpcmVkPEdlc3R1cmVDb25maWc+ID0ge1xuICAgIHN3aXBlVGhyZXNob2xkOiAzMCxcbiAgICBzd2lwZVRpbWVUaHJlc2hvbGQ6IDMwMCxcbiAgICBsb25nUHJlc3NUaW1lOiA1MDAsXG4gICAgdGFwRGlzdGFuY2VUaHJlc2hvbGQ6IDEwLFxuICAgIHByZXZlbnREZWZhdWx0OiB0cnVlLFxuICAgIHN0b3BQcm9wYWdhdGlvbjogZmFsc2UsXG4gICAgLi4uY29uZmlnXG4gIH07XG4gIFxuICAvLyBFdmVudCBoYW5kbGVycyBzdG9yYWdlXG4gIGNvbnN0IGhhbmRsZXJzOiBNYXA8c3RyaW5nLCBTZXQ8R2VzdHVyZUhhbmRsZXI+PiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIEdlc3R1cmUgc3RhdGVcbiAgY29uc3Qgc3RhdGU6IEdlc3R1cmVTdGF0ZSA9IHtcbiAgICBhY3RpdmU6IGZhbHNlLFxuICAgIHN0YXJ0VGltZTogMCxcbiAgICBzdGFydFg6IDAsXG4gICAgc3RhcnRZOiAwLFxuICAgIGxhc3RYOiAwLFxuICAgIGxhc3RZOiAwLFxuICAgIGN1cnJlbnRYOiAwLFxuICAgIGN1cnJlbnRZOiAwLFxuICAgIHRvdWNoQ291bnQ6IDAsXG4gICAgbG9uZ1ByZXNzVGltZXI6IG51bGwsXG4gICAgc3RhcnREaXN0YW5jZTogMCxcbiAgICBzdGFydEFuZ2xlOiAwLFxuICAgIGxhc3RUYXBUaW1lOiAwLFxuICAgIHRhcENvdW50OiAwLFxuICAgIHRhcmdldDogbnVsbFxuICB9O1xuICBcbiAgLy8gRGV0ZWN0IGZlYXR1cmUgc3VwcG9ydFxuICBjb25zdCBzdXBwb3J0VG91Y2ggPSBoYXNUb3VjaFN1cHBvcnQoKTtcbiAgY29uc3Qgc3VwcG9ydFBvaW50ZXIgPSBoYXNQb2ludGVyU3VwcG9ydCgpO1xuICAgIFxuICBjb25zdCBnZXN0dXJlU3VwcG9ydCA9IHtcbiAgICB0YXA6IHRydWUsXG4gICAgc3dpcGU6IHRydWUsXG4gICAgc3dpcGVsZWZ0OiB0cnVlLFxuICAgIHN3aXBlcmlnaHQ6IHRydWUsXG4gICAgc3dpcGV1cDogdHJ1ZSxcbiAgICBzd2lwZWRvd246IHRydWUsXG4gICAgbG9uZ3ByZXNzOiB0cnVlLFxuICAgIHBhbjogdHJ1ZSxcbiAgICBwaW5jaDogc3VwcG9ydFRvdWNoIHx8IHN1cHBvcnRQb2ludGVyLFxuICAgIHJvdGF0ZTogc3VwcG9ydFRvdWNoIHx8IHN1cHBvcnRQb2ludGVyXG4gIH07XG4gIFxuICAvKipcbiAgICogRGlzcGF0Y2ggYSBnZXN0dXJlIGV2ZW50XG4gICAqL1xuICBjb25zdCBkaXNwYXRjaEdlc3R1cmUgPSAoZXZlbnQ6IEFueUdlc3R1cmVFdmVudCk6IHZvaWQgPT4ge1xuICAgIC8vIEdldCBoYW5kbGVycyBmb3IgdGhpcyBldmVudCB0eXBlXG4gICAgY29uc3QgZXZlbnRIYW5kbGVycyA9IGhhbmRsZXJzLmdldChldmVudC50eXBlKTtcbiAgICBpZiAoIWV2ZW50SGFuZGxlcnMpIHJldHVybjtcbiAgICBcbiAgICAvLyBDYWxsIGVhY2ggaGFuZGxlclxuICAgIGV2ZW50SGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhbmRsZXIoZXZlbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgaW4gZ2VzdHVyZSBoYW5kbGVyIGZvciAke2V2ZW50LnR5cGV9OmAsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvLyBGb3Igc3dpcGUsIGFsc28gZGlzcGF0Y2ggZGlyZWN0aW9uLXNwZWNpZmljIGV2ZW50c1xuICAgIGlmIChldmVudC50eXBlID09PSAnc3dpcGUnICYmICdkaXJlY3Rpb24nIGluIGV2ZW50KSB7XG4gICAgICBjb25zdCBkaXJlY3Rpb25FdmVudCA9IHsgLi4uZXZlbnQsIHR5cGU6IGBzd2lwZSR7ZXZlbnQuZGlyZWN0aW9ufWAgYXMgYW55IH07XG4gICAgICBkaXNwYXRjaEdlc3R1cmUoZGlyZWN0aW9uRXZlbnQgYXMgYW55KTtcbiAgICB9XG4gICAgXG4gICAgLy8gQXBwbHkgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciBwcmV2ZW50RGVmYXVsdCBhbmQgc3RvcFByb3BhZ2F0aW9uXG4gICAgaWYgKG9wdGlvbnMucHJldmVudERlZmF1bHQgJiYgIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIFxuICAgIGlmIChvcHRpb25zLnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9O1xuICBcbiAgLy8gUmVmZXJlbmNlIHRvIHRoZSBsb25ncHJlc3MgY2xlYW51cCBmdW5jdGlvblxuICBsZXQgbG9uZ1ByZXNzQ2xlYW51cDogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHRvdWNoL21vdXNlIHN0YXJ0XG4gICAqL1xuICBjb25zdCBoYW5kbGVTdGFydCA9IChlOiBUb3VjaEV2ZW50IHwgTW91c2VFdmVudCB8IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHRvdWNoID0gZ2V0VG91Y2hDb29yZGluYXRlcyhlKTtcbiAgICBjb25zdCB0b3VjaENvdW50ID0gJ3RvdWNoZXMnIGluIGUgPyBlLnRvdWNoZXMubGVuZ3RoIDogMTtcbiAgICBcbiAgICAvLyBTdG9yZSBnZXN0dXJlIHN0YXRlXG4gICAgc3RhdGUuYWN0aXZlID0gdHJ1ZTtcbiAgICBzdGF0ZS5zdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHN0YXRlLnN0YXJ0WCA9IHN0YXRlLmxhc3RYID0gc3RhdGUuY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgIHN0YXRlLnN0YXJ0WSA9IHN0YXRlLmxhc3RZID0gc3RhdGUuY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuICAgIHN0YXRlLnRvdWNoQ291bnQgPSB0b3VjaENvdW50O1xuICAgIHN0YXRlLnRhcmdldCA9IGUudGFyZ2V0O1xuICAgIFxuICAgIC8vIEhhbmRsZSBtdWx0aS10b3VjaCBnZXN0dXJlc1xuICAgIGlmICh0b3VjaENvdW50ID09PSAyICYmICd0b3VjaGVzJyBpbiBlKSB7XG4gICAgICBjb25zdCB0b3VjaDEgPSBlLnRvdWNoZXNbMF07XG4gICAgICBjb25zdCB0b3VjaDIgPSBlLnRvdWNoZXNbMV07XG4gICAgICBcbiAgICAgIC8vIFNldCBpbml0aWFsIHZhbHVlcyBmb3IgcGluY2ggYW5kIHJvdGF0ZVxuICAgICAgc3RhdGUuc3RhcnREaXN0YW5jZSA9IE1hdGguc3FydChcbiAgICAgICAgTWF0aC5wb3codG91Y2gyLmNsaWVudFggLSB0b3VjaDEuY2xpZW50WCwgMikgKyBcbiAgICAgICAgTWF0aC5wb3codG91Y2gyLmNsaWVudFkgLSB0b3VjaDEuY2xpZW50WSwgMilcbiAgICAgICk7XG4gICAgICBcbiAgICAgIHN0YXRlLnN0YXJ0QW5nbGUgPSBNYXRoLmF0YW4yKFxuICAgICAgICB0b3VjaDIuY2xpZW50WSAtIHRvdWNoMS5jbGllbnRZLFxuICAgICAgICB0b3VjaDIuY2xpZW50WCAtIHRvdWNoMS5jbGllbnRYXG4gICAgICApICogMTgwIC8gTWF0aC5QSTtcbiAgICAgIFxuICAgICAgaWYgKHN0YXRlLnN0YXJ0QW5nbGUgPCAwKSBzdGF0ZS5zdGFydEFuZ2xlICs9IDM2MDtcbiAgICB9XG4gICAgXG4gICAgLy8gU2V0dXAgY29udGV4dCBmb3IgZ2VzdHVyZSBkZXRlY3Rpb25cbiAgICBjb25zdCBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCA9IHtcbiAgICAgIHN0YXRlLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGVcbiAgICB9O1xuICAgIFxuICAgIC8vIFN0YXJ0IGxvbmcgcHJlc3MgZGV0ZWN0aW9uXG4gICAgaWYgKGxvbmdQcmVzc0NsZWFudXApIHtcbiAgICAgIGxvbmdQcmVzc0NsZWFudXAoKTtcbiAgICB9XG4gICAgXG4gICAgbG9uZ1ByZXNzQ2xlYW51cCA9IGRldGVjdExvbmdQcmVzcyhjb250ZXh0LCAobG9uZ1ByZXNzRXZlbnQpID0+IHtcbiAgICAgIGRpc3BhdGNoR2VzdHVyZShsb25nUHJlc3NFdmVudCk7XG4gICAgfSk7XG4gIH07XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHRvdWNoL21vdXNlIG1vdmVcbiAgICovXG4gIGNvbnN0IGhhbmRsZU1vdmUgPSAoZTogVG91Y2hFdmVudCB8IE1vdXNlRXZlbnQgfCBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoIXN0YXRlLmFjdGl2ZSkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IHRvdWNoID0gZ2V0VG91Y2hDb29yZGluYXRlcyhlKTtcbiAgICBjb25zdCB0b3VjaENvdW50ID0gJ3RvdWNoZXMnIGluIGUgPyBlLnRvdWNoZXMubGVuZ3RoIDogMTtcbiAgICBcbiAgICAvLyBVcGRhdGUgcG9zaXRpb25zXG4gICAgc3RhdGUubGFzdFggPSBzdGF0ZS5jdXJyZW50WDtcbiAgICBzdGF0ZS5sYXN0WSA9IHN0YXRlLmN1cnJlbnRZO1xuICAgIHN0YXRlLmN1cnJlbnRYID0gdG91Y2guY2xpZW50WDtcbiAgICBzdGF0ZS5jdXJyZW50WSA9IHRvdWNoLmNsaWVudFk7XG4gICAgXG4gICAgLy8gU2V0dXAgY29udGV4dCBmb3IgZ2VzdHVyZSBkZXRlY3Rpb25cbiAgICBjb25zdCBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCA9IHtcbiAgICAgIHN0YXRlLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGVcbiAgICB9O1xuICAgIFxuICAgIC8vIENoZWNrIGlmIHdlIHNob3VsZCBjYW5jZWwgbG9uZ3ByZXNzXG4gICAgaWYgKHNob3VsZENhbmNlbExvbmdQcmVzcyhjb250ZXh0KSAmJiBsb25nUHJlc3NDbGVhbnVwKSB7XG4gICAgICBsb25nUHJlc3NDbGVhbnVwKCk7XG4gICAgICBsb25nUHJlc3NDbGVhbnVwID0gbnVsbDtcbiAgICB9XG4gICAgXG4gICAgLy8gRGV0ZWN0IHBhbiBnZXN0dXJlXG4gICAgY29uc3QgcGFuRXZlbnQgPSBkZXRlY3RQYW4oY29udGV4dCk7XG4gICAgaWYgKHBhbkV2ZW50KSB7XG4gICAgICBkaXNwYXRjaEdlc3R1cmUocGFuRXZlbnQpO1xuICAgIH1cbiAgICBcbiAgICAvLyBNdWx0aS10b3VjaCBnZXN0dXJlc1xuICAgIGlmICh0b3VjaENvdW50ID09PSAyICYmICd0b3VjaGVzJyBpbiBlKSB7XG4gICAgICBjb25zdCB0b3VjaDEgPSBlLnRvdWNoZXNbMF07XG4gICAgICBjb25zdCB0b3VjaDIgPSBlLnRvdWNoZXNbMV07XG4gICAgICBcbiAgICAgIC8vIERldGVjdCBwaW5jaFxuICAgICAgY29uc3QgcGluY2hFdmVudCA9IGRldGVjdFBpbmNoKGNvbnRleHQsIHRvdWNoMSwgdG91Y2gyKTtcbiAgICAgIGlmIChwaW5jaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoR2VzdHVyZShwaW5jaEV2ZW50KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRGV0ZWN0IHJvdGF0ZVxuICAgICAgY29uc3Qgcm90YXRlRXZlbnQgPSBkZXRlY3RSb3RhdGUoY29udGV4dCwgdG91Y2gxLCB0b3VjaDIpO1xuICAgICAgaWYgKHJvdGF0ZUV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoR2VzdHVyZShyb3RhdGVFdmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBcbiAgLyoqXG4gICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBlbmRcbiAgICovXG4gIGNvbnN0IGhhbmRsZUVuZCA9IChlOiBUb3VjaEV2ZW50IHwgTW91c2VFdmVudCB8IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIGlmICghc3RhdGUuYWN0aXZlKSByZXR1cm47XG4gICAgXG4gICAgLy8gQ2FuY2VsIGFueSBvbmdvaW5nIGxvbmcgcHJlc3MgZGV0ZWN0aW9uXG4gICAgaWYgKGxvbmdQcmVzc0NsZWFudXApIHtcbiAgICAgIGxvbmdQcmVzc0NsZWFudXAoKTtcbiAgICAgIGxvbmdQcmVzc0NsZWFudXAgPSBudWxsO1xuICAgIH1cbiAgICBcbiAgICAvLyBTZXR1cCBjb250ZXh0IGZvciBnZXN0dXJlIGRldGVjdGlvblxuICAgIGNvbnN0IGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0ID0ge1xuICAgICAgc3RhdGUsXG4gICAgICBvcHRpb25zLFxuICAgICAgb3JpZ2luYWxFdmVudDogZVxuICAgIH07XG4gICAgXG4gICAgLy8gRGV0ZWN0IHRhcFxuICAgIGNvbnN0IHRhcEV2ZW50ID0gZGV0ZWN0VGFwKGNvbnRleHQpO1xuICAgIGlmICh0YXBFdmVudCkge1xuICAgICAgLy8gVXBkYXRlIHRhcCBjb3VudCBmb3IgbmV4dCB0YXBcbiAgICAgIHN0YXRlLmxhc3RUYXBUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIHN0YXRlLnRhcENvdW50ID0gdGFwRXZlbnQuY291bnQ7XG4gICAgICBcbiAgICAgIGRpc3BhdGNoR2VzdHVyZSh0YXBFdmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERldGVjdCBzd2lwZVxuICAgICAgY29uc3Qgc3dpcGVFdmVudCA9IGRldGVjdFN3aXBlKGNvbnRleHQpO1xuICAgICAgaWYgKHN3aXBlRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hHZXN0dXJlKHN3aXBlRXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBSZXNldCBzdGF0ZVxuICAgIHN0YXRlLmFjdGl2ZSA9IGZhbHNlO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBjYW5jZWxcbiAgICovXG4gIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpOiB2b2lkID0+IHtcbiAgICAvLyBDYW5jZWwgbG9uZyBwcmVzcyBkZXRlY3Rpb25cbiAgICBpZiAobG9uZ1ByZXNzQ2xlYW51cCkge1xuICAgICAgbG9uZ1ByZXNzQ2xlYW51cCgpO1xuICAgICAgbG9uZ1ByZXNzQ2xlYW51cCA9IG51bGw7XG4gICAgfVxuICAgIFxuICAgIC8vIFJlc2V0IHN0YXRlXG4gICAgc3RhdGUuYWN0aXZlID0gZmFsc2U7XG4gIH07XG4gIFxuICAvLyBFdmVudCBsaXN0ZW5lciByZWZlcmVuY2VzXG4gIGxldCBldmVudExpc3RlbmVyczogeyBcbiAgICBbZXZlbnQ6IHN0cmluZ106IEV2ZW50TGlzdGVuZXIgXG4gIH0gPSB7fTtcbiAgXG4gIC8qKlxuICAgKiBTZXQgdXAgZXZlbnQgbGlzdGVuZXJzIGJhc2VkIG9uIGF2YWlsYWJsZSBBUElzXG4gICAqL1xuICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChzdXBwb3J0UG9pbnRlcikge1xuICAgICAgLy8gVXNlIFBvaW50ZXIgRXZlbnRzIEFQSVxuICAgICAgZXZlbnRMaXN0ZW5lcnMgPSB7XG4gICAgICAgIHBvaW50ZXJkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBwb2ludGVybW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBwb2ludGVydXA6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBwb2ludGVyY2FuY2VsOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lclxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnRUb3VjaCkge1xuICAgICAgLy8gVXNlIFRvdWNoIEV2ZW50cyBBUElcbiAgICAgIGV2ZW50TGlzdGVuZXJzID0ge1xuICAgICAgICB0b3VjaHN0YXJ0OiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICB0b3VjaG1vdmU6IGhhbmRsZU1vdmUgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICB0b3VjaGNhbmNlbDogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXJcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZhbGwgYmFjayB0byBNb3VzZSBFdmVudHMgQVBJXG4gICAgICBldmVudExpc3RlbmVycyA9IHtcbiAgICAgICAgbW91c2Vkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBtb3VzZW1vdmU6IGhhbmRsZU1vdmUgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgICAgbW91c2V1cDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIG1vdXNlbGVhdmU6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyXG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIHsgcGFzc2l2ZTogIW9wdGlvbnMucHJldmVudERlZmF1bHQgfSk7XG4gICAgfSk7XG4gIH07XG4gIFxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBldmVudCBsaXN0ZW5lcnNcbiAgICovXG4gIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgIC8vIFJlbW92ZSBhbGwgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgIE9iamVjdC5lbnRyaWVzKGV2ZW50TGlzdGVuZXJzKS5mb3JFYWNoKChbZXZlbnQsIGxpc3RlbmVyXSkgPT4ge1xuICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgfSk7XG4gICAgXG4gICAgLy8gQ2xlYXIgZXZlbnRMaXN0ZW5lcnMgb2JqZWN0XG4gICAgZXZlbnRMaXN0ZW5lcnMgPSB7fTtcbiAgfTtcbiAgXG4gIC8vIEluaXRpYWxpemUgZXZlbnQgbGlzdGVuZXJzXG4gIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgXG4gIHJldHVybiB7XG4gICAgLyoqXG4gICAgICogQWRkIGEgZ2VzdHVyZSBldmVudCBsaXN0ZW5lclxuICAgICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgdG8gbGlzdGVuIGZvclxuICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAqIEByZXR1cm5zIEdlc3R1cmUgbWFuYWdlciBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBvbihldmVudFR5cGU6IHN0cmluZywgaGFuZGxlcjogR2VzdHVyZUhhbmRsZXIpOiBHZXN0dXJlTWFuYWdlciB7XG4gICAgICBpZiAoIWhhbmRsZXJzLmhhcyhldmVudFR5cGUpKSB7XG4gICAgICAgIGhhbmRsZXJzLnNldChldmVudFR5cGUsIG5ldyBTZXQoKSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGhhbmRsZXJzLmdldChldmVudFR5cGUpIS5hZGQoaGFuZGxlcik7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIFxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGdlc3R1cmUgZXZlbnQgbGlzdGVuZXJcbiAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVHlwZSBvZiBnZXN0dXJlXG4gICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIHRvIHJlbW92ZVxuICAgICAqIEByZXR1cm5zIEdlc3R1cmUgbWFuYWdlciBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBvZmYoZXZlbnRUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IEdlc3R1cmVIYW5kbGVyKTogR2VzdHVyZU1hbmFnZXIge1xuICAgICAgY29uc3QgZXZlbnRIYW5kbGVycyA9IGhhbmRsZXJzLmdldChldmVudFR5cGUpO1xuICAgICAgaWYgKGV2ZW50SGFuZGxlcnMpIHtcbiAgICAgICAgZXZlbnRIYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIFxuICAgICAgICBpZiAoZXZlbnRIYW5kbGVycy5zaXplID09PSAwKSB7XG4gICAgICAgICAgaGFuZGxlcnMuZGVsZXRlKGV2ZW50VHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBnZXN0dXJlIGlzIHN1cHBvcnRlZCBvbiB0aGUgY3VycmVudCBkZXZpY2VcbiAgICAgKiBAcGFyYW0gZ2VzdHVyZVR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBnZXN0dXJlIGlzIHN1cHBvcnRlZFxuICAgICAqL1xuICAgIGlzU3VwcG9ydGVkKGdlc3R1cmVUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBnZXN0dXJlVHlwZSBpbiBnZXN0dXJlU3VwcG9ydCAmJiBnZXN0dXJlU3VwcG9ydFtnZXN0dXJlVHlwZSBhcyBrZXlvZiB0eXBlb2YgZ2VzdHVyZVN1cHBvcnRdO1xuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogRW5hYmxlIGdlc3R1cmUgcmVjb2duaXRpb24gYnkgYWRkaW5nIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqIEByZXR1cm5zIEdlc3R1cmUgbWFuYWdlciBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBlbmFibGUoKTogR2VzdHVyZU1hbmFnZXIge1xuICAgICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBcbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIGdlc3R1cmUgcmVjb2duaXRpb24gYnkgcmVtb3ZpbmcgZXZlbnQgbGlzdGVuZXJzXG4gICAgICogQHJldHVybnMgR2VzdHVyZSBtYW5hZ2VyIGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIGRpc2FibGUoKTogR2VzdHVyZU1hbmFnZXIge1xuICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogQ2xlYW4gdXAgZXZlbnQgbGlzdGVuZXJzIGFuZCB0aW1lcnNcbiAgICAgKi9cbiAgICBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgLy8gQ2xlYW4gdXAgbGlzdGVuZXJzXG4gICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgXG4gICAgICAvLyBDbGVhciBsb25nIHByZXNzIHRpbWVyXG4gICAgICBpZiAobG9uZ1ByZXNzQ2xlYW51cCkge1xuICAgICAgICBsb25nUHJlc3NDbGVhbnVwKCk7XG4gICAgICAgIGxvbmdQcmVzc0NsZWFudXAgPSBudWxsO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDbGVhciBoYW5kbGVyIHJlZmVyZW5jZXNcbiAgICAgIGhhbmRsZXJzLmNsZWFyKCk7XG4gICAgfVxuICB9O1xufTsiLAogICAgIi8vIHNyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2NvbXBvc2UvZmVhdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBBZGRzIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzIHRvIGNvbXBvbmVudHNcbiAqL1xuXG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50LCBFbGVtZW50Q29tcG9uZW50IH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZUdlc3R1cmVNYW5hZ2VyLFxuICBHZXN0dXJlTWFuYWdlcixcbiAgR2VzdHVyZUNvbmZpZyxcbiAgR2VzdHVyZUhhbmRsZXIsXG4gIEFueUdlc3R1cmVFdmVudCxcbn0gZnJvbSBcIi4uLy4uLy4uL2dlc3R1cmVzXCI7XG5pbXBvcnQgeyBoYXNMaWZlY3ljbGUsIGhhc0VtaXQgfSBmcm9tIFwibXRybFwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGdlc3R1cmVzIGZlYXR1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXN0dXJlc0ZlYXR1cmVDb25maWcgZXh0ZW5kcyBHZXN0dXJlQ29uZmlnIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIGdlc3R1cmUgcmVjb2duaXRpb24gaW1tZWRpYXRlbHlcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlR2VzdHVyZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsIGdlc3R1cmUgZXZlbnQgaGFuZGxlcnNcbiAgICovXG4gIGdlc3R1cmVIYW5kbGVycz86IFJlY29yZDxzdHJpbmcsIEdlc3R1cmVIYW5kbGVyPjtcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IHdpdGggZ2VzdHVyZSByZWNvZ25pdGlvbiBjYXBhYmlsaXRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXN0dXJlc0NvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvKipcbiAgICogR2VzdHVyZSBtYW5hZ2VyIGluc3RhbmNlXG4gICAqL1xuICBnZXN0dXJlczogR2VzdHVyZU1hbmFnZXI7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGdlc3R1cmUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIGV2ZW50XG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uR2VzdHVyZTogKGV2ZW50VHlwZTogc3RyaW5nLCBoYW5kbGVyOiBHZXN0dXJlSGFuZGxlcikgPT4gR2VzdHVyZXNDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGdlc3R1cmUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIGV2ZW50XG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZkdlc3R1cmU6IChldmVudFR5cGU6IHN0cmluZywgaGFuZGxlcjogR2VzdHVyZUhhbmRsZXIpID0+IEdlc3R1cmVzQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGdlc3R1cmUgdHlwZSBpcyBzdXBwb3J0ZWQgb24gdGhlIGN1cnJlbnQgZGV2aWNlXG4gICAqIEBwYXJhbSBnZXN0dXJlVHlwZSAtIFR5cGUgb2YgZ2VzdHVyZSB0byBjaGVja1xuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBnZXN0dXJlIGlzIHN1cHBvcnRlZFxuICAgKi9cbiAgaXNHZXN0dXJlU3VwcG9ydGVkOiAoZ2VzdHVyZVR5cGU6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlIGdlc3R1cmUgcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBlbmFibGVHZXN0dXJlczogKCkgPT4gR2VzdHVyZXNDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIERpc2FibGUgZ2VzdHVyZSByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGRpc2FibGVHZXN0dXJlczogKCkgPT4gR2VzdHVyZXNDb21wb25lbnQ7XG59XG5cbi8qKlxuICogQWRkcyBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllcyB0byBhIGNvbXBvbmVudC5cbiAqIFRoaXMgaXMgYSBjb21wcmVoZW5zaXZlIGdlc3R1cmUgZmVhdHVyZSB0aGF0IGFkZHMgc3VwcG9ydCBmb3IgYWxsIGdlc3R1cmUgdHlwZXMuXG4gKiBGb3IgbW9yZSBsaWdodHdlaWdodCwgc3BlY2lmaWMgZ2VzdHVyZXMsIHVzZSB0aGUgaW5kaXZpZHVhbCBnZXN0dXJlIGZlYXR1cmVzLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9iamVjdCBjb250YWluaW5nIGdlc3R1cmUgc2V0dGluZ3NcbiAqIEByZXR1cm5zIEZ1bmN0aW9uIHRoYXQgZW5oYW5jZXMgYSBjb21wb25lbnQgd2l0aCBnZXN0dXJlIGNhcGFiaWxpdGllc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQWRkIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnRcbiAqIGNvbnN0IGNvbXBvbmVudCA9IHBpcGUoXG4gKiAgIGNyZWF0ZUJhc2UsXG4gKiAgIHdpdGhFbGVtZW50KC4uLiksXG4gKiAgIHdpdGhHZXN0dXJlcyh7XG4gKiAgICAgc3dpcGVUaHJlc2hvbGQ6IDUwLFxuICogICAgIGdlc3R1cmVIYW5kbGVyczoge1xuICogICAgICAgJ3RhcCc6IChlKSA9PiBoYW5kbGVUYXAoZSksXG4gKiAgICAgICAnc3dpcGVsZWZ0JzogKGUpID0+IG5hdmlnYXRlRm9yd2FyZChlKSxcbiAqICAgICAgICdzd2lwZXJpZ2h0JzogKGUpID0+IG5hdmlnYXRlQmFjayhlKVxuICogICAgIH1cbiAqICAgfSlcbiAqICkoY29uZmlnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgd2l0aEdlc3R1cmVzID1cbiAgKGNvbmZpZzogR2VzdHVyZXNGZWF0dXJlQ29uZmlnID0ge30pID0+XG4gIDxDIGV4dGVuZHMgRWxlbWVudENvbXBvbmVudD4oY29tcG9uZW50OiBDKTogQyAmIEdlc3R1cmVzQ29tcG9uZW50ID0+IHtcbiAgICBpZiAoIWNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJDYW5ub3QgYWRkIGdlc3R1cmUgcmVjb2duaXRpb246IG1pc3NpbmcgZWxlbWVudFwiKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQgYXMgQyAmIEdlc3R1cmVzQ29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIGVuYWJsZUdlc3R1cmVzID0gdHJ1ZSxcbiAgICAgIGdlc3R1cmVIYW5kbGVycyA9IHt9LFxuICAgICAgLi4uZ2VzdHVyZUNvbmZpZ1xuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBDcmVhdGUgZ2VzdHVyZSBtYW5hZ2VyXG4gICAgY29uc3QgZ2VzdHVyZU1hbmFnZXIgPSBjcmVhdGVHZXN0dXJlTWFuYWdlcihcbiAgICAgIGNvbXBvbmVudC5lbGVtZW50LFxuICAgICAgZ2VzdHVyZUNvbmZpZ1xuICAgICk7XG5cbiAgICAvLyBBZGQgaW5pdGlhbCBnZXN0dXJlIGhhbmRsZXJzXG4gICAgT2JqZWN0LmVudHJpZXMoZ2VzdHVyZUhhbmRsZXJzKS5mb3JFYWNoKChbZXZlbnRUeXBlLCBoYW5kbGVyXSkgPT4ge1xuICAgICAgZ2VzdHVyZU1hbmFnZXIub24oZXZlbnRUeXBlLCBoYW5kbGVyKTtcbiAgICB9KTtcblxuICAgIC8vIEVuYWJsZS9kaXNhYmxlIGJhc2VkIG9uIGNvbmZpZ1xuICAgIGlmICghZW5hYmxlR2VzdHVyZXMpIHtcbiAgICAgIGdlc3R1cmVNYW5hZ2VyLmRpc2FibGUoKTtcbiAgICB9XG5cbiAgICAvLyBDb25uZWN0IHdpdGggZXhpc3RpbmcgZXZlbnQgc3lzdGVtIGlmIGF2YWlsYWJsZVxuICAgIGlmIChoYXNFbWl0KGNvbXBvbmVudCkpIHtcbiAgICAgIC8vIEZvcndhcmQgZ2VzdHVyZSBldmVudHMgdG8gdGhlIGNvbXBvbmVudCdzIGV2ZW50IHN5c3RlbVxuICAgICAgY29uc3QgZm9yd2FyZEdlc3R1cmVFdmVudHMgPSAoZXZlbnQ6IEFueUdlc3R1cmVFdmVudCkgPT4ge1xuICAgICAgICBjb21wb25lbnQuZW1pdChldmVudC50eXBlLCBldmVudCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBSZWdpc3RlciBmb3J3YXJkZXIgZm9yIGNvbW1vbiBnZXN0dXJlIHR5cGVzXG4gICAgICBbXG4gICAgICAgIFwidGFwXCIsXG4gICAgICAgIFwic3dpcGVcIixcbiAgICAgICAgXCJzd2lwZWxlZnRcIixcbiAgICAgICAgXCJzd2lwZXJpZ2h0XCIsXG4gICAgICAgIFwic3dpcGV1cFwiLFxuICAgICAgICBcInN3aXBlZG93blwiLFxuICAgICAgICBcImxvbmdwcmVzc1wiLFxuICAgICAgICBcInBpbmNoXCIsXG4gICAgICAgIFwicm90YXRlXCIsXG4gICAgICAgIFwicGFuXCIsXG4gICAgICBdLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICAgICAgZ2VzdHVyZU1hbmFnZXIub24odHlwZSwgZm9yd2FyZEdlc3R1cmVFdmVudHMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGdlc3R1cmUgbWFuYWdlclxuICAgICAgICBnZXN0dXJlTWFuYWdlci5kZXN0cm95KCk7XG5cbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBvcmlnaW5hbERlc3Ryb3kuY2FsbChjb21wb25lbnQubGlmZWN5Y2xlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBnZXN0dXJlczogZ2VzdHVyZU1hbmFnZXIsXG5cbiAgICAgIC8qKlxuICAgICAgICogQWRkIGEgZ2VzdHVyZSBldmVudCBoYW5kbGVyXG4gICAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIGV2ZW50XG4gICAgICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgICAqIEByZXR1cm5zIEdlc3R1cmVzQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBvbkdlc3R1cmUoZXZlbnRUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IEdlc3R1cmVIYW5kbGVyKSB7XG4gICAgICAgIGdlc3R1cmVNYW5hZ2VyLm9uKGV2ZW50VHlwZSwgaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmUgYSBnZXN0dXJlIGV2ZW50IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgZXZlbnRcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIG9mZkdlc3R1cmUoZXZlbnRUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IEdlc3R1cmVIYW5kbGVyKSB7XG4gICAgICAgIGdlc3R1cmVNYW5hZ2VyLm9mZihldmVudFR5cGUsIGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgYSBnZXN0dXJlIHR5cGUgaXMgc3VwcG9ydGVkIG9uIHRoZSBjdXJyZW50IGRldmljZVxuICAgICAgICogQHBhcmFtIGdlc3R1cmVUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIHRvIGNoZWNrXG4gICAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBnZXN0dXJlIGlzIHN1cHBvcnRlZFxuICAgICAgICovXG4gICAgICBpc0dlc3R1cmVTdXBwb3J0ZWQoZ2VzdHVyZVR5cGU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gZ2VzdHVyZU1hbmFnZXIuaXNTdXBwb3J0ZWQoZ2VzdHVyZVR5cGUpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBFbmFibGUgZ2VzdHVyZSByZWNvZ25pdGlvblxuICAgICAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZUdlc3R1cmVzKCkge1xuICAgICAgICBnZXN0dXJlTWFuYWdlci5lbmFibGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgZ2VzdHVyZSByZWNvZ25pdGlvblxuICAgICAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVHZXN0dXJlcygpIHtcbiAgICAgICAgZ2VzdHVyZU1hbmFnZXIuZGlzYWJsZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbiIsCiAgICAiLy8gc3JjL2NvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlcy90YXAudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBBZGRzIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGNvbXBvbmVudHNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEJhc2VDb21wb25lbnQsIEVsZW1lbnRDb21wb25lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgVGFwRXZlbnQsIEdlc3R1cmVIYW5kbGVyIH0gZnJvbSBcIi4uLy4uLy4uL2dlc3R1cmVzXCI7XG5pbXBvcnQgeyBoYXNMaWZlY3ljbGUsIGhhc0VtaXQgfSBmcm9tIFwibXRybFwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRhcCBnZXN0dXJlIGZlYXR1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXBHZXN0dXJlQ29uZmlnIHtcbiAgLyoqXG4gICAqIERpc3RhbmNlIHRocmVzaG9sZCAoaW4gcGl4ZWxzKSBmb3IgdGFwIHJlY29nbml0aW9uXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuICB0YXBEaXN0YW5jZVRocmVzaG9sZD86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBwcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3JzIG9uIHRvdWNoIGV2ZW50c1xuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBwcmV2ZW50RGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIHRhcCBnZXN0dXJlXG4gICAqL1xuICBvblRhcD86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSB0YXAgcmVjb2duaXRpb24gaW1tZWRpYXRlbHlcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKipcbiAqIENvbXBvbmVudCB3aXRoIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhcEdlc3R1cmVDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIEFkZCBhIHRhcCBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblRhcDogKGhhbmRsZXI6IChldmVudDogVGFwRXZlbnQpID0+IHZvaWQpID0+IFRhcEdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHRhcCBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZUYXA6IChoYW5kbGVyOiAoZXZlbnQ6IFRhcEV2ZW50KSA9PiB2b2lkKSA9PiBUYXBHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgdGFwIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGVuYWJsZVRhcDogKCkgPT4gVGFwR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogRGlzYWJsZSB0YXAgcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZGlzYWJsZVRhcDogKCkgPT4gVGFwR2VzdHVyZUNvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBBZGRzIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50LlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IGFsdGVybmF0aXZlIHRvIHRoZSBmdWxsIGdlc3R1cmUgc3lzdGVtLFxuICogZm9jdXNlZCBvbmx5IG9uIHRhcCBkZXRlY3Rpb24uXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgdGFwIHNldHRpbmdzXG4gKiBAcmV0dXJucyBGdW5jdGlvbiB0aGF0IGVuaGFuY2VzIGEgY29tcG9uZW50IHdpdGggdGFwIGNhcGFiaWxpdGllc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQWRkIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50XG4gKiBjb25zdCBjb21wb25lbnQgPSBwaXBlKFxuICogICBjcmVhdGVCYXNlLFxuICogICB3aXRoRWxlbWVudCguLi4pLFxuICogICB3aXRoVGFwR2VzdHVyZSh7XG4gKiAgICAgb25UYXA6IChlKSA9PiBjb25zb2xlLmxvZygnVGFwcGVkIGF0JywgZS54LCBlLnkpXG4gKiAgIH0pXG4gKiApKGNvbmZpZyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhUYXBHZXN0dXJlID1cbiAgKGNvbmZpZzogVGFwR2VzdHVyZUNvbmZpZyA9IHt9KSA9PlxuICA8QyBleHRlbmRzIEVsZW1lbnRDb21wb25lbnQ+KGNvbXBvbmVudDogQyk6IEMgJiBUYXBHZXN0dXJlQ29tcG9uZW50ID0+IHtcbiAgICBpZiAoIWNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJDYW5ub3QgYWRkIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uOiBtaXNzaW5nIGVsZW1lbnRcIik7XG4gICAgICByZXR1cm4gY29tcG9uZW50IGFzIEMgJiBUYXBHZXN0dXJlQ29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIHRhcERpc3RhbmNlVGhyZXNob2xkID0gMTAsXG4gICAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWUsXG4gICAgICBvblRhcCxcbiAgICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBFdmVudCBoYW5kbGVycyBzdG9yYWdlXG4gICAgY29uc3QgaGFuZGxlcnM6IFNldDwoZXZlbnQ6IFRhcEV2ZW50KSA9PiB2b2lkPiA9IG5ldyBTZXQoKTtcblxuICAgIC8vIElmIGluaXRpYWwgaGFuZGxlciBwcm92aWRlZCwgYWRkIGl0XG4gICAgaWYgKG9uVGFwKSB7XG4gICAgICBoYW5kbGVycy5hZGQob25UYXAgYXMgKGV2ZW50OiBUYXBFdmVudCkgPT4gdm9pZCk7XG4gICAgfVxuXG4gICAgLy8gR2VzdHVyZSBzdGF0ZSBmb3IgdHJhY2tpbmdcbiAgICBsZXQgc3RhcnRYID0gMDtcbiAgICBsZXQgc3RhcnRZID0gMDtcbiAgICBsZXQgYWN0aXZlID0gZmFsc2U7XG4gICAgbGV0IHN0YXJ0VGltZSA9IDA7XG4gICAgbGV0IGxhc3RUYXBUaW1lID0gMDtcbiAgICBsZXQgdGFwQ291bnQgPSAwO1xuICAgIGxldCBpc0VuYWJsZWQgPSBlbmFibGVkO1xuXG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2ggYSB0YXAgZXZlbnQgdG8gYWxsIGhhbmRsZXJzXG4gICAgICovXG4gICAgY29uc3QgZGlzcGF0Y2hUYXAgPSAoXG4gICAgICBlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCxcbiAgICAgIHg6IG51bWJlcixcbiAgICAgIHk6IG51bWJlclxuICAgICk6IHZvaWQgPT4ge1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGlzRG91YmxlVGFwID0gbm93IC0gbGFzdFRhcFRpbWUgPCAzMDA7XG5cbiAgICAgIGlmIChpc0RvdWJsZVRhcCkge1xuICAgICAgICB0YXBDb3VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFwQ291bnQgPSAxO1xuICAgICAgfVxuXG4gICAgICBsYXN0VGFwVGltZSA9IG5vdztcblxuICAgICAgLy8gQ3JlYXRlIHRoZSB0YXAgZXZlbnRcbiAgICAgIGNvbnN0IHRhcEV2ZW50OiBUYXBFdmVudCA9IHtcbiAgICAgICAgdHlwZTogXCJ0YXBcIixcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgdGFyZ2V0OiBlLnRhcmdldCEsXG4gICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgZW5kVGltZTogbm93LFxuICAgICAgICBkdXJhdGlvbjogbm93IC0gc3RhcnRUaW1lLFxuICAgICAgICBkZWZhdWx0UHJldmVudGVkOiBmYWxzZSxcbiAgICAgICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgICB0YXBFdmVudC5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzdG9wUHJvcGFnYXRpb246ICgpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9LFxuICAgICAgICBjb3VudDogdGFwQ291bnQsXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICB9O1xuXG4gICAgICAvLyBDYWxsIGVhY2ggaGFuZGxlclxuICAgICAgaGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhhbmRsZXIodGFwRXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbiB0YXAgaGFuZGxlcjpcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gRm9yd2FyZCB0byBjb21wb25lbnQncyBldmVudCBzeXN0ZW0gaWYgYXZhaWxhYmxlXG4gICAgICBpZiAoaGFzRW1pdChjb21wb25lbnQpKSB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0KFwidGFwXCIsIHRhcEV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgcHJldmVudERlZmF1bHQgaWYgY29uZmlndXJlZFxuICAgICAgaWYgKHByZXZlbnREZWZhdWx0ICYmICF0YXBFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgIHRhcEV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBzdGFydFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVN0YXJ0ID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9IFwidG91Y2hlc1wiIGluIGUgPyBlLnRvdWNoZXNbMF0gOiBlO1xuXG4gICAgICBzdGFydFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgc3RhcnRZID0gdG91Y2guY2xpZW50WTtcbiAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBhY3RpdmUgPSB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgZW5kXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlRW5kID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWFjdGl2ZSB8fCAhaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRvdWNoID1cbiAgICAgICAgXCJjaGFuZ2VkVG91Y2hlc1wiIGluIGUgJiYgZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggPiAwXG4gICAgICAgICAgPyBlLmNoYW5nZWRUb3VjaGVzWzBdXG4gICAgICAgICAgOiAoZSBhcyBNb3VzZUV2ZW50KTtcblxuICAgICAgY29uc3QgZW5kWCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBjb25zdCBlbmRZID0gdG91Y2guY2xpZW50WTtcblxuICAgICAgLy8gQ2FsY3VsYXRlIGRpc3RhbmNlIG1vdmVkXG4gICAgICBjb25zdCBkZWx0YVggPSBlbmRYIC0gc3RhcnRYO1xuICAgICAgY29uc3QgZGVsdGFZID0gZW5kWSAtIHN0YXJ0WTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIG1vdmVtZW50IGlzIHdpdGhpbiB0aHJlc2hvbGRcbiAgICAgIGlmIChkaXN0YW5jZSA8IHRhcERpc3RhbmNlVGhyZXNob2xkKSB7XG4gICAgICAgIGRpc3BhdGNoVGFwKGUsIGVuZFgsIGVuZFkpO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIGNhbmNlbFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnMgZGljdGlvbmFyeVxuICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzOiBSZWNvcmQ8c3RyaW5nLCBFdmVudExpc3RlbmVyPiA9IHtcbiAgICAgIG1vdXNlZG93bjogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNldXA6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2VsZWF2ZTogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaHN0YXJ0OiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hjYW5jZWw6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGQgZXZlbnQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCB7XG4gICAgICAgICAgcGFzc2l2ZTogIXByZXZlbnREZWZhdWx0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBTZXR1cCBsaXN0ZW5lcnMgaWYgaW5pdGlhbGx5IGVuYWJsZWRcbiAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgIC8vIENsZWFyIGhhbmRsZXJzXG4gICAgICAgIGhhbmRsZXJzLmNsZWFyKCk7XG5cbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBvcmlnaW5hbERlc3Ryb3kuY2FsbChjb21wb25lbnQubGlmZWN5Y2xlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIC8qKlxuICAgICAgICogQWRkIGEgdGFwIGV2ZW50IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBvblRhcChoYW5kbGVyOiAoZXZlbnQ6IFRhcEV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBhIHRhcCBldmVudCBoYW5kbGVyXG4gICAgICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgb2ZmVGFwKGhhbmRsZXI6IChldmVudDogVGFwRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRW5hYmxlIHRhcCByZWNvZ25pdGlvblxuICAgICAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBlbmFibGVUYXAoKSB7XG4gICAgICAgIGlmICghaXNFbmFibGVkKSB7XG4gICAgICAgICAgaXNFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgdGFwIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVUYXAoKSB7XG4gICAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3N3aXBlLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gQWRkcyBzd2lwZSBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGNvbXBvbmVudHNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEJhc2VDb21wb25lbnQsIEVsZW1lbnRDb21wb25lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHtcbiAgU3dpcGVFdmVudCxcbiAgU1dJUEVfRElSRUNUSU9OUyxcbiAgR2VzdHVyZUhhbmRsZXIsXG59IGZyb20gXCIuLi8uLi8uLi9nZXN0dXJlc1wiO1xuaW1wb3J0IHsgaGFzTGlmZWN5Y2xlLCBoYXNFbWl0IH0gZnJvbSBcIm10cmxcIjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBzd2lwZSBnZXN0dXJlIGZlYXR1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTd2lwZUdlc3R1cmVDb25maWcge1xuICAvKipcbiAgICogTWluaW11bSBkaXN0YW5jZSAoaW4gcGl4ZWxzKSB0byByZWNvZ25pemUgYSBzd2lwZVxuICAgKiBAZGVmYXVsdCAzMFxuICAgKi9cbiAgc3dpcGVUaHJlc2hvbGQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gdGltZSAoaW4gbXMpIGluIHdoaWNoIGEgc3dpcGUgbXVzdCBiZSBjb21wbGV0ZWRcbiAgICogQGRlZmF1bHQgMzAwXG4gICAqL1xuICBzd2lwZVRpbWVUaHJlc2hvbGQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHJldmVudCBkZWZhdWx0IGJlaGF2aW9ycyBvbiB0b3VjaCBldmVudHNcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcHJldmVudERlZmF1bHQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIGZvciBhbnkgc3dpcGUgZGlyZWN0aW9uXG4gICAqL1xuICBvblN3aXBlPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciBsZWZ0IHN3aXBlc1xuICAgKi9cbiAgb25Td2lwZUxlZnQ/OiBHZXN0dXJlSGFuZGxlcjtcblxuICAvKipcbiAgICogSGFuZGxlciBzcGVjaWZpY2FsbHkgZm9yIHJpZ2h0IHN3aXBlc1xuICAgKi9cbiAgb25Td2lwZVJpZ2h0PzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciB1cCBzd2lwZXNcbiAgICovXG4gIG9uU3dpcGVVcD86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIHNwZWNpZmljYWxseSBmb3IgZG93biBzd2lwZXNcbiAgICovXG4gIG9uU3dpcGVEb3duPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIHN3aXBlIHJlY29nbml0aW9uIGltbWVkaWF0ZWx5XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgd2l0aCBzd2lwZSBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFN3aXBlR2VzdHVyZUNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBmb3IgYW55IHN3aXBlIGRpcmVjdGlvblxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25Td2lwZTogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBoYW5kbGVyIHNwZWNpZmljYWxseSBmb3IgbGVmdCBzd2lwZXNcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uU3dpcGVMZWZ0OiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciByaWdodCBzd2lwZXNcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uU3dpcGVSaWdodDogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBoYW5kbGVyIHNwZWNpZmljYWxseSBmb3IgdXAgc3dpcGVzXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblN3aXBlVXA6IChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpID0+IFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBzcGVjaWZpY2FsbHkgZm9yIGRvd24gc3dpcGVzXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblN3aXBlRG93bjogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBzd2lwZSBldmVudCBoYW5kbGVyIGZvciBhbnkgZGlyZWN0aW9uXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZTd2lwZTogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBsZWZ0IHN3aXBlIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlN3aXBlTGVmdDogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSByaWdodCBzd2lwZSBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZTd2lwZVJpZ2h0OiAoXG4gICAgaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkXG4gICkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gdXAgc3dpcGUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmU3dpcGVVcDogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBkb3duIHN3aXBlIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlN3aXBlRG93bjogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgc3dpcGUgcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZW5hYmxlU3dpcGU6ICgpID0+IFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogRGlzYWJsZSBzd2lwZSByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBkaXNhYmxlU3dpcGU6ICgpID0+IFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgc3dpcGUgZGlyZWN0aW9uIGJhc2VkIG9uIGRlbHRhIFggYW5kIFlcbiAqXG4gKiBAcGFyYW0gZGVsdGFYIC0gRGlzdGFuY2UgbW92ZWQgaW4gWCBkaXJlY3Rpb25cbiAqIEBwYXJhbSBkZWx0YVkgLSBEaXN0YW5jZSBtb3ZlZCBpbiBZIGRpcmVjdGlvblxuICogQHJldHVybnMgRGlyZWN0aW9uIG9mIHRoZSBzd2lwZVxuICovXG5mdW5jdGlvbiBnZXRTd2lwZURpcmVjdGlvbihkZWx0YVg6IG51bWJlciwgZGVsdGFZOiBudW1iZXIpOiBTV0lQRV9ESVJFQ1RJT05TIHtcbiAgaWYgKE1hdGguYWJzKGRlbHRhWCkgPiBNYXRoLmFicyhkZWx0YVkpKSB7XG4gICAgcmV0dXJuIGRlbHRhWCA+IDAgPyBTV0lQRV9ESVJFQ1RJT05TLlJJR0hUIDogU1dJUEVfRElSRUNUSU9OUy5MRUZUO1xuICB9XG4gIHJldHVybiBkZWx0YVkgPiAwID8gU1dJUEVfRElSRUNUSU9OUy5ET1dOIDogU1dJUEVfRElSRUNUSU9OUy5VUDtcbn1cblxuLyoqXG4gKiBBZGRzIHN3aXBlIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnQuXG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQgYWx0ZXJuYXRpdmUgdG8gdGhlIGZ1bGwgZ2VzdHVyZSBzeXN0ZW0sXG4gKiBmb2N1c2VkIG9ubHkgb24gc3dpcGUgZGV0ZWN0aW9uLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9iamVjdCBjb250YWluaW5nIHN3aXBlIHNldHRpbmdzXG4gKiBAcmV0dXJucyBGdW5jdGlvbiB0aGF0IGVuaGFuY2VzIGEgY29tcG9uZW50IHdpdGggc3dpcGUgY2FwYWJpbGl0aWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBBZGQgc3dpcGUgZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBhIGNvbXBvbmVudFxuICogY29uc3QgY29tcG9uZW50ID0gcGlwZShcbiAqICAgY3JlYXRlQmFzZSxcbiAqICAgd2l0aEVsZW1lbnQoLi4uKSxcbiAqICAgd2l0aFN3aXBlR2VzdHVyZSh7XG4gKiAgICAgb25Td2lwZUxlZnQ6ICgpID0+IHNob3dOZXh0UGFnZSgpLFxuICogICAgIG9uU3dpcGVSaWdodDogKCkgPT4gc2hvd1ByZXZpb3VzUGFnZSgpXG4gKiAgIH0pXG4gKiApKGNvbmZpZyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhTd2lwZUdlc3R1cmUgPVxuICAoY29uZmlnOiBTd2lwZUdlc3R1cmVDb25maWcgPSB7fSkgPT5cbiAgPEMgZXh0ZW5kcyBFbGVtZW50Q29tcG9uZW50Pihjb21wb25lbnQ6IEMpOiBDICYgU3dpcGVHZXN0dXJlQ29tcG9uZW50ID0+IHtcbiAgICBpZiAoIWNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJDYW5ub3QgYWRkIHN3aXBlIGdlc3R1cmUgcmVjb2duaXRpb246IG1pc3NpbmcgZWxlbWVudFwiKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQgYXMgQyAmIFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCB7XG4gICAgICBzd2lwZVRocmVzaG9sZCA9IDMwLFxuICAgICAgc3dpcGVUaW1lVGhyZXNob2xkID0gMzAwLFxuICAgICAgcHJldmVudERlZmF1bHQgPSB0cnVlLFxuICAgICAgb25Td2lwZSxcbiAgICAgIG9uU3dpcGVMZWZ0LFxuICAgICAgb25Td2lwZVJpZ2h0LFxuICAgICAgb25Td2lwZVVwLFxuICAgICAgb25Td2lwZURvd24sXG4gICAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gRXZlbnQgaGFuZGxlcnMgc3RvcmFnZSBieSBkaXJlY3Rpb25cbiAgICBjb25zdCBoYW5kbGVycyA9IHtcbiAgICAgIHN3aXBlOiBuZXcgU2V0PChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZD4oKSxcbiAgICAgIHN3aXBlbGVmdDogbmV3IFNldDwoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQ+KCksXG4gICAgICBzd2lwZXJpZ2h0OiBuZXcgU2V0PChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZD4oKSxcbiAgICAgIHN3aXBldXA6IG5ldyBTZXQ8KGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkPigpLFxuICAgICAgc3dpcGVkb3duOiBuZXcgU2V0PChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZD4oKSxcbiAgICB9O1xuXG4gICAgLy8gQWRkIGluaXRpYWwgaGFuZGxlcnMgaWYgcHJvdmlkZWRcbiAgICBpZiAob25Td2lwZSkgaGFuZGxlcnMuc3dpcGUuYWRkKG9uU3dpcGUgYXMgKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKTtcbiAgICBpZiAob25Td2lwZUxlZnQpXG4gICAgICBoYW5kbGVycy5zd2lwZWxlZnQuYWRkKG9uU3dpcGVMZWZ0IGFzIChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCk7XG4gICAgaWYgKG9uU3dpcGVSaWdodClcbiAgICAgIGhhbmRsZXJzLnN3aXBlcmlnaHQuYWRkKG9uU3dpcGVSaWdodCBhcyAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpO1xuICAgIGlmIChvblN3aXBlVXApXG4gICAgICBoYW5kbGVycy5zd2lwZXVwLmFkZChvblN3aXBlVXAgYXMgKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKTtcbiAgICBpZiAob25Td2lwZURvd24pXG4gICAgICBoYW5kbGVycy5zd2lwZWRvd24uYWRkKG9uU3dpcGVEb3duIGFzIChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCk7XG5cbiAgICAvLyBHZXN0dXJlIHN0YXRlIGZvciB0cmFja2luZ1xuICAgIGxldCBzdGFydFggPSAwO1xuICAgIGxldCBzdGFydFkgPSAwO1xuICAgIGxldCBhY3RpdmUgPSBmYWxzZTtcbiAgICBsZXQgc3RhcnRUaW1lID0gMDtcbiAgICBsZXQgaXNFbmFibGVkID0gZW5hYmxlZDtcblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoIGEgc3dpcGUgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgaGFuZGxlcnNcbiAgICAgKi9cbiAgICBjb25zdCBkaXNwYXRjaFN3aXBlID0gKFxuICAgICAgZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQsXG4gICAgICBlbmRYOiBudW1iZXIsXG4gICAgICBlbmRZOiBudW1iZXJcbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGRlbHRhWCA9IGVuZFggLSBzdGFydFg7XG4gICAgICBjb25zdCBkZWx0YVkgPSBlbmRZIC0gc3RhcnRZO1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcbiAgICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgZHVyYXRpb24gPSBlbmRUaW1lIC0gc3RhcnRUaW1lO1xuICAgICAgY29uc3QgdmVsb2NpdHkgPSBkaXN0YW5jZSAvIGR1cmF0aW9uO1xuICAgICAgY29uc3QgZGlyZWN0aW9uID0gZ2V0U3dpcGVEaXJlY3Rpb24oZGVsdGFYLCBkZWx0YVkpO1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIHN3aXBlIGV2ZW50XG4gICAgICBjb25zdCBzd2lwZUV2ZW50OiBTd2lwZUV2ZW50ID0ge1xuICAgICAgICB0eXBlOiBcInN3aXBlXCIsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHRhcmdldDogZS50YXJnZXQhLFxuICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgIGVuZFRpbWUsXG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgICBkZWZhdWx0UHJldmVudGVkOiBmYWxzZSxcbiAgICAgICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgICBzd2lwZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHN0b3BQcm9wYWdhdGlvbjogKCkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgZGVsdGFYLFxuICAgICAgICBkZWx0YVksXG4gICAgICAgIGRpc3RhbmNlLFxuICAgICAgICB2ZWxvY2l0eSxcbiAgICAgICAgc3RhcnRYLFxuICAgICAgICBzdGFydFksXG4gICAgICAgIGVuZFgsXG4gICAgICAgIGVuZFksXG4gICAgICB9O1xuXG4gICAgICAvLyBGaXJzdCB0cmlnZ2VyIGdlbmVyaWMgc3dpcGUgaGFuZGxlcnNcbiAgICAgIGhhbmRsZXJzLnN3aXBlLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBoYW5kbGVyKHN3aXBlRXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbiBzd2lwZSBoYW5kbGVyOlwiLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBUaGVuIHRyaWdnZXIgZGlyZWN0aW9uLXNwZWNpZmljIGhhbmRsZXJzXG4gICAgICBjb25zdCBkaXJlY3Rpb25LZXkgPSBgc3dpcGUke2RpcmVjdGlvbn1gIGFzIGtleW9mIHR5cGVvZiBoYW5kbGVycztcbiAgICAgIGhhbmRsZXJzW2RpcmVjdGlvbktleV0uZm9yRWFjaCgoaGFuZGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhhbmRsZXIoeyAuLi5zd2lwZUV2ZW50LCB0eXBlOiBkaXJlY3Rpb25LZXkgfSBhcyBTd2lwZUV2ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBpbiAke2RpcmVjdGlvbktleX0gaGFuZGxlcjpgLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBGb3J3YXJkIHRvIGNvbXBvbmVudCdzIGV2ZW50IHN5c3RlbSBpZiBhdmFpbGFibGVcbiAgICAgIGlmIChoYXNFbWl0KGNvbXBvbmVudCkpIHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQoXCJzd2lwZVwiLCBzd2lwZUV2ZW50KTtcbiAgICAgICAgY29tcG9uZW50LmVtaXQoZGlyZWN0aW9uS2V5LCBzd2lwZUV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgcHJldmVudERlZmF1bHQgaWYgY29uZmlndXJlZFxuICAgICAgaWYgKHByZXZlbnREZWZhdWx0ICYmICFzd2lwZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgc3dpcGVFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2Ugc3RhcnRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVTdGFydCA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdG91Y2ggPSBcInRvdWNoZXNcIiBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcblxuICAgICAgc3RhcnRYID0gdG91Y2guY2xpZW50WDtcbiAgICAgIHN0YXJ0WSA9IHRvdWNoLmNsaWVudFk7XG4gICAgICBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgYWN0aXZlID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIGVuZFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUVuZCA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFhY3RpdmUgfHwgIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9XG4gICAgICAgIFwiY2hhbmdlZFRvdWNoZXNcIiBpbiBlICYmIGUuY2hhbmdlZFRvdWNoZXMubGVuZ3RoID4gMFxuICAgICAgICAgID8gZS5jaGFuZ2VkVG91Y2hlc1swXVxuICAgICAgICAgIDogKGUgYXMgTW91c2VFdmVudCk7XG5cbiAgICAgIGNvbnN0IGVuZFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgY29uc3QgZW5kWSA9IHRvdWNoLmNsaWVudFk7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBzd2lwZSBwcm9wZXJ0aWVzXG4gICAgICBjb25zdCBkZWx0YVggPSBlbmRYIC0gc3RhcnRYO1xuICAgICAgY29uc3QgZGVsdGFZID0gZW5kWSAtIHN0YXJ0WTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG5cbiAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSBzd2lwZVxuICAgICAgaWYgKGRpc3RhbmNlID49IHN3aXBlVGhyZXNob2xkICYmIGR1cmF0aW9uIDw9IHN3aXBlVGltZVRocmVzaG9sZCkge1xuICAgICAgICBkaXNwYXRjaFN3aXBlKGUsIGVuZFgsIGVuZFkpO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIGNhbmNlbFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnMgZGljdGlvbmFyeVxuICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzOiBSZWNvcmQ8c3RyaW5nLCBFdmVudExpc3RlbmVyPiA9IHtcbiAgICAgIG1vdXNlZG93bjogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNldXA6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2VsZWF2ZTogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaHN0YXJ0OiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hjYW5jZWw6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGQgZXZlbnQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCB7XG4gICAgICAgICAgcGFzc2l2ZTogIXByZXZlbnREZWZhdWx0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBTZXR1cCBsaXN0ZW5lcnMgaWYgaW5pdGlhbGx5IGVuYWJsZWRcbiAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgIC8vIENsZWFyIGhhbmRsZXJzXG4gICAgICAgIE9iamVjdC52YWx1ZXMoaGFuZGxlcnMpLmZvckVhY2goKGhhbmRsZXJTZXQpID0+IGhhbmRsZXJTZXQuY2xlYXIoKSk7XG5cbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBvcmlnaW5hbERlc3Ryb3kuY2FsbChjb21wb25lbnQubGlmZWN5Y2xlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIC8vIEFkZCBoYW5kbGVyIG1ldGhvZHNcbiAgICAgIG9uU3dpcGUoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvblN3aXBlTGVmdChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGVsZWZ0LmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvblN3aXBlUmlnaHQoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlcmlnaHQuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9uU3dpcGVVcChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGV1cC5hZGQoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb25Td2lwZURvd24oaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlZG93bi5hZGQoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLy8gUmVtb3ZlIGhhbmRsZXIgbWV0aG9kc1xuICAgICAgb2ZmU3dpcGUoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZTd2lwZUxlZnQoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlbGVmdC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb2ZmU3dpcGVSaWdodChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGVyaWdodC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb2ZmU3dpcGVVcChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGV1cC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb2ZmU3dpcGVEb3duKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5zd2lwZWRvd24uZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8vIEVuYWJsZS9kaXNhYmxlIG1ldGhvZHNcbiAgICAgIGVuYWJsZVN3aXBlKCkge1xuICAgICAgICBpZiAoIWlzRW5hYmxlZCkge1xuICAgICAgICAgIGlzRW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgZGlzYWJsZVN3aXBlKCkge1xuICAgICAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICAgICAgaXNFbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbiIsCiAgICAiLy8gc3JjL2NvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlcy9sb25ncHJlc3MudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBBZGRzIGxvbmcgcHJlc3MgZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBjb21wb25lbnRzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBCYXNlQ29tcG9uZW50LCBFbGVtZW50Q29tcG9uZW50IH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IExvbmdQcmVzc0V2ZW50LCBHZXN0dXJlSGFuZGxlciB9IGZyb20gXCIuLi8uLi8uLi9nZXN0dXJlc1wiO1xuaW1wb3J0IHsgaGFzTGlmZWN5Y2xlLCBoYXNFbWl0IH0gZnJvbSBcIm10cmxcIjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBsb25nIHByZXNzIGdlc3R1cmUgZmVhdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvbmdQcmVzc0dlc3R1cmVDb25maWcge1xuICAvKipcbiAgICogVGltZSAoaW4gbXMpIHRvIHJlY29nbml6ZSBhIGxvbmcgcHJlc3NcbiAgICogQGRlZmF1bHQgNTAwXG4gICAqL1xuICBsb25nUHJlc3NUaW1lPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEaXN0YW5jZSB0aHJlc2hvbGQgKGluIHBpeGVscykgZm9yIG1vdmVtZW50IHRoYXQgY2FuY2VscyBsb25nIHByZXNzXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuICBtb3ZlVGhyZXNob2xkPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHByZXZlbnQgZGVmYXVsdCBiZWhhdmlvcnMgb24gdG91Y2ggZXZlbnRzXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHByZXZlbnREZWZhdWx0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgbG9uZyBwcmVzcyBnZXN0dXJlXG4gICAqL1xuICBvbkxvbmdQcmVzcz86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBsb25nIHByZXNzIHJlY29nbml0aW9uIGltbWVkaWF0ZWx5XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgd2l0aCBsb25nIHByZXNzIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9uZ1ByZXNzR2VzdHVyZUNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvKipcbiAgICogQWRkIGEgbG9uZyBwcmVzcyBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvbkxvbmdQcmVzczogKFxuICAgIGhhbmRsZXI6IChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWRcbiAgKSA9PiBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBsb25nIHByZXNzIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZkxvbmdQcmVzczogKFxuICAgIGhhbmRsZXI6IChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWRcbiAgKSA9PiBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgbG9uZyBwcmVzcyByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBlbmFibGVMb25nUHJlc3M6ICgpID0+IExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIERpc2FibGUgbG9uZyBwcmVzcyByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBkaXNhYmxlTG9uZ1ByZXNzOiAoKSA9PiBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50O1xufVxuXG4vKipcbiAqIEFkZHMgbG9uZyBwcmVzcyBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50LlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IGFsdGVybmF0aXZlIHRvIHRoZSBmdWxsIGdlc3R1cmUgc3lzdGVtLFxuICogZm9jdXNlZCBvbmx5IG9uIGxvbmcgcHJlc3MgZGV0ZWN0aW9uLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9iamVjdCBjb250YWluaW5nIGxvbmcgcHJlc3Mgc2V0dGluZ3NcbiAqIEByZXR1cm5zIEZ1bmN0aW9uIHRoYXQgZW5oYW5jZXMgYSBjb21wb25lbnQgd2l0aCBsb25nIHByZXNzIGNhcGFiaWxpdGllc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQWRkIGxvbmcgcHJlc3MgZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBhIGNvbXBvbmVudFxuICogY29uc3QgY29tcG9uZW50ID0gcGlwZShcbiAqICAgY3JlYXRlQmFzZSxcbiAqICAgd2l0aEVsZW1lbnQoLi4uKSxcbiAqICAgd2l0aExvbmdQcmVzc0dlc3R1cmUoe1xuICogICAgIGxvbmdQcmVzc1RpbWU6IDgwMCxcbiAqICAgICBvbkxvbmdQcmVzczogKGUpID0+IHNob3dDb250ZXh0TWVudShlLngsIGUueSlcbiAqICAgfSlcbiAqICkoY29uZmlnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgd2l0aExvbmdQcmVzc0dlc3R1cmUgPVxuICAoY29uZmlnOiBMb25nUHJlc3NHZXN0dXJlQ29uZmlnID0ge30pID0+XG4gIDxDIGV4dGVuZHMgRWxlbWVudENvbXBvbmVudD4oY29tcG9uZW50OiBDKTogQyAmIExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQgPT4ge1xuICAgIGlmICghY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJDYW5ub3QgYWRkIGxvbmcgcHJlc3MgZ2VzdHVyZSByZWNvZ25pdGlvbjogbWlzc2luZyBlbGVtZW50XCJcbiAgICAgICk7XG4gICAgICByZXR1cm4gY29tcG9uZW50IGFzIEMgJiBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIGxvbmdQcmVzc1RpbWUgPSA1MDAsXG4gICAgICBtb3ZlVGhyZXNob2xkID0gMTAsXG4gICAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWUsXG4gICAgICBvbkxvbmdQcmVzcyxcbiAgICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBFdmVudCBoYW5kbGVycyBzdG9yYWdlXG4gICAgY29uc3QgaGFuZGxlcnM6IFNldDwoZXZlbnQ6IExvbmdQcmVzc0V2ZW50KSA9PiB2b2lkPiA9IG5ldyBTZXQoKTtcblxuICAgIC8vIElmIGluaXRpYWwgaGFuZGxlciBwcm92aWRlZCwgYWRkIGl0XG4gICAgaWYgKG9uTG9uZ1ByZXNzKSB7XG4gICAgICBoYW5kbGVycy5hZGQob25Mb25nUHJlc3MgYXMgKGV2ZW50OiBMb25nUHJlc3NFdmVudCkgPT4gdm9pZCk7XG4gICAgfVxuXG4gICAgLy8gR2VzdHVyZSBzdGF0ZSBmb3IgdHJhY2tpbmdcbiAgICBsZXQgc3RhcnRYID0gMDtcbiAgICBsZXQgc3RhcnRZID0gMDtcbiAgICBsZXQgY3VycmVudFggPSAwO1xuICAgIGxldCBjdXJyZW50WSA9IDA7XG4gICAgbGV0IGFjdGl2ZSA9IGZhbHNlO1xuICAgIGxldCBzdGFydFRpbWUgPSAwO1xuICAgIGxldCBsb25nUHJlc3NUaW1lcjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGlzRW5hYmxlZCA9IGVuYWJsZWQ7XG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBhIGxvbmcgcHJlc3MgZXZlbnQgdG8gYWxsIGhhbmRsZXJzXG4gICAgICovXG4gICAgY29uc3QgZGlzcGF0Y2hMb25nUHJlc3MgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIC8vIENyZWF0ZSB0aGUgbG9uZyBwcmVzcyBldmVudFxuICAgICAgY29uc3QgbG9uZ1ByZXNzRXZlbnQ6IExvbmdQcmVzc0V2ZW50ID0ge1xuICAgICAgICB0eXBlOiBcImxvbmdwcmVzc1wiLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0YXJnZXQ6IGUudGFyZ2V0ISxcbiAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICBlbmRUaW1lOiBEYXRlLm5vdygpLFxuICAgICAgICBkdXJhdGlvbjogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSxcbiAgICAgICAgZGVmYXVsdFByZXZlbnRlZDogZmFsc2UsXG4gICAgICAgIHByZXZlbnREZWZhdWx0OiAoKSA9PiB7XG4gICAgICAgICAgbG9uZ1ByZXNzRXZlbnQuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSxcbiAgICAgICAgeDogY3VycmVudFgsXG4gICAgICAgIHk6IGN1cnJlbnRZLFxuICAgICAgfTtcblxuICAgICAgLy8gQ2FsbCBlYWNoIGhhbmRsZXJcbiAgICAgIGhhbmRsZXJzLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBoYW5kbGVyKGxvbmdQcmVzc0V2ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgaW4gbG9uZyBwcmVzcyBoYW5kbGVyOlwiLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBGb3J3YXJkIHRvIGNvbXBvbmVudCdzIGV2ZW50IHN5c3RlbSBpZiBhdmFpbGFibGVcbiAgICAgIGlmIChoYXNFbWl0KGNvbXBvbmVudCkpIHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQoXCJsb25ncHJlc3NcIiwgbG9uZ1ByZXNzRXZlbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBwcmV2ZW50RGVmYXVsdCBpZiBjb25maWd1cmVkXG4gICAgICBpZiAocHJldmVudERlZmF1bHQgJiYgIWxvbmdQcmVzc0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgbG9uZ1ByZXNzRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIHN0YXJ0XG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlU3RhcnQgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRvdWNoID0gXCJ0b3VjaGVzXCIgaW4gZSA/IGUudG91Y2hlc1swXSA6IGU7XG5cbiAgICAgIHN0YXJ0WCA9IGN1cnJlbnRYID0gdG91Y2guY2xpZW50WDtcbiAgICAgIHN0YXJ0WSA9IGN1cnJlbnRZID0gdG91Y2guY2xpZW50WTtcbiAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBhY3RpdmUgPSB0cnVlO1xuXG4gICAgICAvLyBDYW5jZWwgYW55IGV4aXN0aW5nIHRpbWVyXG4gICAgICBpZiAobG9uZ1ByZXNzVGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB1cCBsb25nIHByZXNzIHRpbWVyXG4gICAgICBsb25nUHJlc3NUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICAgIC8vIENoZWNrIGlmIG1vdmVtZW50IHdhcyB3aXRoaW4gdGhyZXNob2xkXG4gICAgICAgICAgY29uc3QgZGVsdGFYID0gY3VycmVudFggLSBzdGFydFg7XG4gICAgICAgICAgY29uc3QgZGVsdGFZID0gY3VycmVudFkgLSBzdGFydFk7XG4gICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcblxuICAgICAgICAgIGlmIChkaXN0YW5jZSA8IG1vdmVUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoTG9uZ1ByZXNzKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxvbmdQcmVzc1RpbWVyID0gbnVsbDtcbiAgICAgIH0sIGxvbmdQcmVzc1RpbWUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgbW92ZVxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZU1vdmUgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghYWN0aXZlIHx8ICFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdG91Y2ggPSBcInRvdWNoZXNcIiBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcblxuICAgICAgY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuXG4gICAgICAvLyBDaGVjayBpZiBtb3ZlbWVudCBleGNlZWRzIHRocmVzaG9sZFxuICAgICAgY29uc3QgZGVsdGFYID0gY3VycmVudFggLSBzdGFydFg7XG4gICAgICBjb25zdCBkZWx0YVkgPSBjdXJyZW50WSAtIHN0YXJ0WTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG5cbiAgICAgIGlmIChkaXN0YW5jZSA+IG1vdmVUaHJlc2hvbGQpIHtcbiAgICAgICAgLy8gQ2FuY2VsIGxvbmcgcHJlc3MgaWYgbW92ZWQgdG9vIG11Y2hcbiAgICAgICAgaWYgKGxvbmdQcmVzc1RpbWVyICE9PSBudWxsKSB7XG4gICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgICAgbG9uZ1ByZXNzVGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBlbmRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVFbmQgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAobG9uZ1ByZXNzVGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgIGxvbmdQcmVzc1RpbWVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBjYW5jZWxcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVDYW5jZWwgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAobG9uZ1ByZXNzVGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgIGxvbmdQcmVzc1RpbWVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8vIEV2ZW50IGxpc3RlbmVycyBkaWN0aW9uYXJ5XG4gICAgY29uc3QgZXZlbnRMaXN0ZW5lcnM6IFJlY29yZDxzdHJpbmcsIEV2ZW50TGlzdGVuZXI+ID0ge1xuICAgICAgbW91c2Vkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2Vtb3ZlOiBoYW5kbGVNb3ZlIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZXVwOiBoYW5kbGVFbmQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNlbGVhdmU6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hzdGFydDogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNobW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hjYW5jZWw6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGQgZXZlbnQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCB7XG4gICAgICAgICAgcGFzc2l2ZTogIXByZXZlbnREZWZhdWx0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBTZXR1cCBsaXN0ZW5lcnMgaWYgaW5pdGlhbGx5IGVuYWJsZWRcbiAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgIC8vIENsZWFyIGFueSB0aW1lcnNcbiAgICAgICAgaWYgKGxvbmdQcmVzc1RpbWVyICE9PSBudWxsKSB7XG4gICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgICAgbG9uZ1ByZXNzVGltZXIgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgaGFuZGxlcnNcbiAgICAgICAgaGFuZGxlcnMuY2xlYXIoKTtcblxuICAgICAgICAvLyBDYWxsIG9yaWdpbmFsIGRlc3Ryb3kgbWV0aG9kXG4gICAgICAgIG9yaWdpbmFsRGVzdHJveS5jYWxsKGNvbXBvbmVudC5saWZlY3ljbGUpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgLyoqXG4gICAgICAgKiBBZGQgYSBsb25nIHByZXNzIGV2ZW50IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBvbkxvbmdQcmVzcyhoYW5kbGVyOiAoZXZlbnQ6IExvbmdQcmVzc0V2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBhIGxvbmcgcHJlc3MgZXZlbnQgaGFuZGxlclxuICAgICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIG9mZkxvbmdQcmVzcyhoYW5kbGVyOiAoZXZlbnQ6IExvbmdQcmVzc0V2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVuYWJsZSBsb25nIHByZXNzIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZUxvbmdQcmVzcygpIHtcbiAgICAgICAgaWYgKCFpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZSBsb25nIHByZXNzIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVMb25nUHJlc3MoKSB7XG4gICAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgYW55IHRpbWVyc1xuICAgICAgICAgIGlmIChsb25nUHJlc3NUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgICAgICBsb25nUHJlc3NUaW1lciA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3Bhbi50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIEFkZHMgcGFuIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gY29tcG9uZW50c1xuICovXG5cbmltcG9ydCB0eXBlIHsgQmFzZUNvbXBvbmVudCwgRWxlbWVudENvbXBvbmVudCB9IGZyb20gXCJtdHJsXCI7XG5pbXBvcnQgeyBQYW5FdmVudCwgR2VzdHVyZUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vLi4vZ2VzdHVyZXNcIjtcbmltcG9ydCB7IGhhc0xpZmVjeWNsZSwgaGFzRW1pdCB9IGZyb20gXCJtdHJsXCI7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgcGFuIGdlc3R1cmUgZmVhdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhbkdlc3R1cmVDb25maWcge1xuICAvKipcbiAgICogV2hldGhlciB0byBwcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3JzIG9uIHRvdWNoIGV2ZW50c1xuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBwcmV2ZW50RGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIHBhbiBzdGFydCAoZmlyc3QgbW92ZW1lbnQpXG4gICAqL1xuICBvblBhblN0YXJ0PzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIHBhbiBtb3ZlIChjb250aW51b3VzIHVwZGF0ZXMgZHVyaW5nIHBhbilcbiAgICovXG4gIG9uUGFuPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIHBhbiBlbmQgKHRvdWNoL21vdXNlIHJlbGVhc2UpXG4gICAqL1xuICBvblBhbkVuZD86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBwYW4gcmVjb2duaXRpb24gaW1tZWRpYXRlbHlcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKipcbiAqIEV4dGVuZCB0aGUgUGFuRXZlbnQgaW50ZXJmYWNlIHRvIHN1cHBvcnQgb3VyIGN1c3RvbSBldmVudCB0eXBlc1xuICovXG5pbnRlcmZhY2UgRXh0ZW5kZWRQYW5FdmVudCBleHRlbmRzIE9taXQ8UGFuRXZlbnQsIFwidHlwZVwiPiB7XG4gIHR5cGU6IFwicGFuXCIgfCBcInBhbnN0YXJ0XCIgfCBcInBhbmVuZFwiO1xufVxuXG4vKipcbiAqIENvbXBvbmVudCB3aXRoIHBhbiBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhbkdlc3R1cmVDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgZm9yIHBhbiBzdGFydFxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25QYW5TdGFydDogKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpID0+IFBhbkdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgZm9yIHBhbiBtb3ZlIChjb250aW51b3VzIHVwZGF0ZXMpXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblBhbjogKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpID0+IFBhbkdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgZm9yIHBhbiBlbmRcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uUGFuRW5kOiAoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgcGFuIHN0YXJ0IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlBhblN0YXJ0OiAoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgcGFuIG1vdmUgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmUGFuOiAoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgcGFuIGVuZCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZQYW5FbmQ6IChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSA9PiBQYW5HZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgcGFuIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGVuYWJsZVBhbjogKCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogRGlzYWJsZSBwYW4gcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZGlzYWJsZVBhbjogKCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBBZGRzIHBhbiBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50LlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IGFsdGVybmF0aXZlIHRvIHRoZSBmdWxsIGdlc3R1cmUgc3lzdGVtLFxuICogZm9jdXNlZCBvbmx5IG9uIHBhbiBkZXRlY3Rpb24uXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgcGFuIHNldHRpbmdzXG4gKiBAcmV0dXJucyBGdW5jdGlvbiB0aGF0IGVuaGFuY2VzIGEgY29tcG9uZW50IHdpdGggcGFuIGNhcGFiaWxpdGllc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQWRkIHBhbiBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50XG4gKiBjb25zdCBjb21wb25lbnQgPSBwaXBlKFxuICogICBjcmVhdGVCYXNlLFxuICogICB3aXRoRWxlbWVudCguLi4pLFxuICogICB3aXRoUGFuR2VzdHVyZSh7XG4gKiAgICAgb25QYW5TdGFydDogKGUpID0+IHN0YXJ0RHJhZyhlKSxcbiAqICAgICBvblBhbjogKGUpID0+IHVwZGF0ZURyYWdQb3NpdGlvbihlKSxcbiAqICAgICBvblBhbkVuZDogKGUpID0+IGVuZERyYWcoZSlcbiAqICAgfSlcbiAqICkoY29uZmlnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFBhbkdlc3R1cmUgPVxuICAoY29uZmlnOiBQYW5HZXN0dXJlQ29uZmlnID0ge30pID0+XG4gIDxDIGV4dGVuZHMgRWxlbWVudENvbXBvbmVudD4oY29tcG9uZW50OiBDKTogQyAmIFBhbkdlc3R1cmVDb21wb25lbnQgPT4ge1xuICAgIGlmICghY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkNhbm5vdCBhZGQgcGFuIGdlc3R1cmUgcmVjb2duaXRpb246IG1pc3NpbmcgZWxlbWVudFwiKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQgYXMgQyAmIFBhbkdlc3R1cmVDb21wb25lbnQ7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uXG4gICAgY29uc3Qge1xuICAgICAgcHJldmVudERlZmF1bHQgPSB0cnVlLFxuICAgICAgb25QYW5TdGFydCxcbiAgICAgIG9uUGFuLFxuICAgICAgb25QYW5FbmQsXG4gICAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gRXZlbnQgaGFuZGxlcnMgc3RvcmFnZSBieSBwYW4gcGhhc2VcbiAgICBjb25zdCBoYW5kbGVycyA9IHtcbiAgICAgIHBhbnN0YXJ0OiBuZXcgU2V0PChldmVudDogUGFuRXZlbnQpID0+IHZvaWQ+KCksXG4gICAgICBwYW46IG5ldyBTZXQ8KGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZD4oKSxcbiAgICAgIHBhbmVuZDogbmV3IFNldDwoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkPigpLFxuICAgIH07XG5cbiAgICAvLyBBZGQgaW5pdGlhbCBoYW5kbGVycyBpZiBwcm92aWRlZFxuICAgIGlmIChvblBhblN0YXJ0KVxuICAgICAgaGFuZGxlcnMucGFuc3RhcnQuYWRkKG9uUGFuU3RhcnQgYXMgKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCk7XG4gICAgaWYgKG9uUGFuKSBoYW5kbGVycy5wYW4uYWRkKG9uUGFuIGFzIChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpO1xuICAgIGlmIChvblBhbkVuZCkgaGFuZGxlcnMucGFuZW5kLmFkZChvblBhbkVuZCBhcyAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKTtcblxuICAgIC8vIEdlc3R1cmUgc3RhdGUgZm9yIHRyYWNraW5nXG4gICAgbGV0IHN0YXJ0WCA9IDA7XG4gICAgbGV0IHN0YXJ0WSA9IDA7XG4gICAgbGV0IGxhc3RYID0gMDtcbiAgICBsZXQgbGFzdFkgPSAwO1xuICAgIGxldCBjdXJyZW50WCA9IDA7XG4gICAgbGV0IGN1cnJlbnRZID0gMDtcbiAgICBsZXQgYWN0aXZlID0gZmFsc2U7XG4gICAgbGV0IGlzUGFubmluZyA9IGZhbHNlO1xuICAgIGxldCBzdGFydFRpbWUgPSAwO1xuICAgIGxldCBpc0VuYWJsZWQgPSBlbmFibGVkO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgcGFuIGV2ZW50IHdpdGggdGhlIGN1cnJlbnQgc3RhdGVcbiAgICAgKi9cbiAgICBjb25zdCBjcmVhdGVQYW5FdmVudCA9IChcbiAgICAgIGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50LFxuICAgICAgdHlwZTogXCJwYW5zdGFydFwiIHwgXCJwYW5cIiB8IFwicGFuZW5kXCJcbiAgICApOiBFeHRlbmRlZFBhbkV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50OiBFeHRlbmRlZFBhbkV2ZW50ID0ge1xuICAgICAgICB0eXBlLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0YXJnZXQ6IGUudGFyZ2V0ISxcbiAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICBlbmRUaW1lOiBEYXRlLm5vdygpLFxuICAgICAgICBkdXJhdGlvbjogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSxcbiAgICAgICAgZGVmYXVsdFByZXZlbnRlZDogZmFsc2UsXG4gICAgICAgIHByZXZlbnREZWZhdWx0OiAoKSA9PiB7XG4gICAgICAgICAgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGVsdGFYOiBjdXJyZW50WCAtIHN0YXJ0WCxcbiAgICAgICAgZGVsdGFZOiBjdXJyZW50WSAtIHN0YXJ0WSxcbiAgICAgICAgc3RhcnRYLFxuICAgICAgICBzdGFydFksXG4gICAgICAgIGN1cnJlbnRYLFxuICAgICAgICBjdXJyZW50WSxcbiAgICAgIH07XG4gICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoIGEgcGFuIGV2ZW50IHRvIGFsbCByZWdpc3RlcmVkIGhhbmRsZXJzXG4gICAgICovXG4gICAgY29uc3QgZGlzcGF0Y2hQYW4gPSAoXG4gICAgICBlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCxcbiAgICAgIHR5cGU6IFwicGFuc3RhcnRcIiB8IFwicGFuXCIgfCBcInBhbmVuZFwiXG4gICAgKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBleHRlbmRlZFBhbkV2ZW50ID0gY3JlYXRlUGFuRXZlbnQoZSwgdHlwZSk7XG5cbiAgICAgIC8vIENhbGwgZWFjaCBoYW5kbGVyIGZvciB0aGlzIHBoYXNlXG4gICAgICBoYW5kbGVyc1t0eXBlXS5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVHlwZSBhc3NlcnRpb24gZm9yIHRoZSBoYW5kbGVyIGNhbGwgLSB3ZSdyZSBkZWxpYmVyYXRlbHkgcGFzc2luZyBvdXIgZXh0ZW5kZWQgZXZlbnRcbiAgICAgICAgICBoYW5kbGVyKGV4dGVuZGVkUGFuRXZlbnQgYXMgdW5rbm93biBhcyBQYW5FdmVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgaW4gJHt0eXBlfSBoYW5kbGVyOmAsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZvcndhcmQgdG8gY29tcG9uZW50J3MgZXZlbnQgc3lzdGVtIGlmIGF2YWlsYWJsZVxuICAgICAgaWYgKGhhc0VtaXQoY29tcG9uZW50KSkge1xuICAgICAgICBjb21wb25lbnQuZW1pdCh0eXBlLCBleHRlbmRlZFBhbkV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgcHJldmVudERlZmF1bHQgaWYgY29uZmlndXJlZFxuICAgICAgaWYgKHByZXZlbnREZWZhdWx0ICYmICFleHRlbmRlZFBhbkV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgZXh0ZW5kZWRQYW5FdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2Ugc3RhcnRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVTdGFydCA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdG91Y2ggPSBcInRvdWNoZXNcIiBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcblxuICAgICAgc3RhcnRYID0gbGFzdFggPSBjdXJyZW50WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBzdGFydFkgPSBsYXN0WSA9IGN1cnJlbnRZID0gdG91Y2guY2xpZW50WTtcbiAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBhY3RpdmUgPSB0cnVlO1xuICAgICAgaXNQYW5uaW5nID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBtb3ZlXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlTW92ZSA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFhY3RpdmUgfHwgIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9IFwidG91Y2hlc1wiIGluIGUgPyBlLnRvdWNoZXNbMF0gOiBlO1xuXG4gICAgICAvLyBVcGRhdGUgcG9zaXRpb25cbiAgICAgIGxhc3RYID0gY3VycmVudFg7XG4gICAgICBsYXN0WSA9IGN1cnJlbnRZO1xuICAgICAgY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgbW92ZW1lbnQgZGVsdGFcbiAgICAgIGNvbnN0IG1vdmVEZWx0YVggPSBjdXJyZW50WCAtIGxhc3RYO1xuICAgICAgY29uc3QgbW92ZURlbHRhWSA9IGN1cnJlbnRZIC0gbGFzdFk7XG4gICAgICBjb25zdCBtb3ZlRGVsdGEgPSBNYXRoLnNxcnQoXG4gICAgICAgIG1vdmVEZWx0YVggKiBtb3ZlRGVsdGFYICsgbW92ZURlbHRhWSAqIG1vdmVEZWx0YVlcbiAgICAgICk7XG5cbiAgICAgIC8vIERldGVjdCBzaWduaWZpY2FudCBtb3ZlbWVudFxuICAgICAgaWYgKG1vdmVEZWx0YSA+IDApIHtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3Qgc2lnbmlmaWNhbnQgbW92ZW1lbnQsIHRyaWdnZXIgcGFuc3RhcnRcbiAgICAgICAgaWYgKCFpc1Bhbm5pbmcpIHtcbiAgICAgICAgICBpc1Bhbm5pbmcgPSB0cnVlO1xuICAgICAgICAgIGRpc3BhdGNoUGFuKGUsIFwicGFuc3RhcnRcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGVuIHRyaWdnZXIgdGhlIGNvbnRpbnVvdXMgcGFuIGV2ZW50XG4gICAgICAgIGRpc3BhdGNoUGFuKGUsIFwicGFuXCIpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgZW5kXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlRW5kID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWFjdGl2ZSB8fCAhaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIC8vIElmIHdlIHdlcmUgcGFubmluZywgdHJpZ2dlciB0aGUgcGFuZW5kIGV2ZW50XG4gICAgICBpZiAoaXNQYW5uaW5nKSB7XG4gICAgICAgIGRpc3BhdGNoUGFuKGUsIFwicGFuZW5kXCIpO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICAgIGlzUGFubmluZyA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgY2FuY2VsXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWFjdGl2ZSB8fCAhaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIC8vIElmIHdlIHdlcmUgcGFubmluZywgdHJpZ2dlciB0aGUgcGFuZW5kIGV2ZW50XG4gICAgICBpZiAoaXNQYW5uaW5nKSB7XG4gICAgICAgIGRpc3BhdGNoUGFuKGUsIFwicGFuZW5kXCIpO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICAgIGlzUGFubmluZyA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnMgZGljdGlvbmFyeVxuICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzOiBSZWNvcmQ8c3RyaW5nLCBFdmVudExpc3RlbmVyPiA9IHtcbiAgICAgIG1vdXNlZG93bjogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNlbW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2V1cDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZWxlYXZlOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNoc3RhcnQ6IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaG1vdmU6IGhhbmRsZU1vdmUgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNoZW5kOiBoYW5kbGVFbmQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNoY2FuY2VsOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQWRkIGV2ZW50IGxpc3RlbmVycyB0byBlbGVtZW50XG4gICAgICovXG4gICAgY29uc3Qgc2V0dXBFdmVudExpc3RlbmVycyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKGV2ZW50TGlzdGVuZXJzKS5mb3JFYWNoKChbZXZlbnQsIGxpc3RlbmVyXSkgPT4ge1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lciwge1xuICAgICAgICAgIHBhc3NpdmU6ICFwcmV2ZW50RGVmYXVsdCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGV2ZW50IGxpc3RlbmVycyBmcm9tIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCByZW1vdmVFdmVudExpc3RlbmVycyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKGV2ZW50TGlzdGVuZXJzKS5mb3JFYWNoKChbZXZlbnQsIGxpc3RlbmVyXSkgPT4ge1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gU2V0dXAgbGlzdGVuZXJzIGlmIGluaXRpYWxseSBlbmFibGVkXG4gICAgaWYgKGlzRW5hYmxlZCkge1xuICAgICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBsaWZlY3ljbGUgaW50ZWdyYXRpb25cbiAgICBpZiAoaGFzTGlmZWN5Y2xlKGNvbXBvbmVudCkpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGNvbXBvbmVudC5saWZlY3ljbGUuZGVzdHJveTtcblxuICAgICAgY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAvLyBDbGVhbiB1cCBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcblxuICAgICAgICAvLyBDbGVhciBoYW5kbGVyc1xuICAgICAgICBPYmplY3QudmFsdWVzKGhhbmRsZXJzKS5mb3JFYWNoKChoYW5kbGVyU2V0KSA9PiBoYW5kbGVyU2V0LmNsZWFyKCkpO1xuXG4gICAgICAgIC8vIENhbGwgb3JpZ2luYWwgZGVzdHJveSBtZXRob2RcbiAgICAgICAgb3JpZ2luYWxEZXN0cm95LmNhbGwoY29tcG9uZW50LmxpZmVjeWNsZSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBlbmhhbmNlZCBjb21wb25lbnRcbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuXG4gICAgICAvLyBBZGQgaGFuZGxlciBtZXRob2RzXG4gICAgICBvblBhblN0YXJ0KGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMucGFuc3RhcnQuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9uUGFuKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMucGFuLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvblBhbkVuZChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnBhbmVuZC5hZGQoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLy8gUmVtb3ZlIGhhbmRsZXIgbWV0aG9kc1xuICAgICAgb2ZmUGFuU3RhcnQoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5wYW5zdGFydC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb2ZmUGFuKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMucGFuLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZQYW5FbmQoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5wYW5lbmQuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8vIEVuYWJsZS9kaXNhYmxlIG1ldGhvZHNcbiAgICAgIGVuYWJsZVBhbigpIHtcbiAgICAgICAgaWYgKCFpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIGRpc2FibGVQYW4oKSB7XG4gICAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvKipcbiAqIEBtb2R1bGUgY29yZS9sYXlvdXQvc2NoZW1hXG4gKiBAZGVzY3JpcHRpb24gVW5pZmllZCBsYXlvdXQgc2NoZW1hIHByb2Nlc3NvciB3aXRoIGludGVncmF0ZWQgb3B0aW1pemF0aW9uc1xuICogQ29uc29saWRhdGVzIGFycmF5LCBvYmplY3QsIEpTWCwgYW5kIHRlbXBsYXRlIHByb2Nlc3Npbmcgd2l0aCBidWlsdC1pbiBwZXJmb3JtYW5jZSBlbmhhbmNlbWVudHNcbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUWVBFUyAoRXNzZW50aWFsIG9ubHkpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0Q29uZmlnIHtcbiAgLyoqIEJhc2UgbGF5b3V0IHR5cGUgKi9cbiAgdHlwZT86IFwic3RhY2tcIiB8IFwicm93XCIgfCBcImdyaWRcIiB8IHN0cmluZztcbiAgLyoqIFNwYWNpbmcgYmV0d2VlbiBlbGVtZW50cyAqL1xuICBnYXA/OiBudW1iZXIgfCBzdHJpbmc7XG4gIC8qKiBBZGRpdGlvbmFsIENTUyBjbGFzc2VzICovXG4gIGNsYXNzPzogc3RyaW5nO1xuICAvKiogQWxpZ25tZW50IG9mIGl0ZW1zIGFsb25nIHRoZSBjcm9zcyBheGlzICovXG4gIGFsaWduPzogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgfCBcInN0cmV0Y2hcIjtcbiAgLyoqIEFsaWdubWVudCBvZiBpdGVtcyBhbG9uZyB0aGUgbWFpbiBheGlzICovXG4gIGp1c3RpZnk/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiB8IFwiYmV0d2VlblwiIHwgXCJhcm91bmRcIiB8IFwiZXZlbmx5XCI7XG4gIC8qKiBXaGV0aGVyIGFuZCBob3cgaXRlbXMgc2hvdWxkIHdyYXAgKi9cbiAgd3JhcD86IGJvb2xlYW4gfCBcInJldmVyc2VcIiB8IFwibm93cmFwXCI7XG4gIC8qKiBXaGV0aGVyIHJvdyBpdGVtcyBzaG91bGQgc3RhY2sgdmVydGljYWxseSBvbiBtb2JpbGUgKi9cbiAgbW9iaWxlU3RhY2s/OiBib29sZWFuO1xuICAvKiogV2hldGhlciByb3cgaXRlbXMgc2hvdWxkIHNjcm9sbCBob3Jpem9udGFsbHkgb24gbW9iaWxlICovXG4gIG1vYmlsZVNjcm9sbD86IGJvb2xlYW47XG4gIC8qKiBOdW1iZXIgb2YgY29sdW1ucyBvciBhdXRvbWF0aWMgc2l6aW5nIG1ldGhvZCAqL1xuICBjb2x1bW5zPzogbnVtYmVyIHwgXCJhdXRvLWZpdFwiIHwgXCJhdXRvLWZpbGxcIjtcbiAgLyoqIFdoZXRoZXIgdG8gdXNlIGRlbnNlIHBhY2tpbmcgYWxnb3JpdGhtIGZvciBncmlkICovXG4gIGRlbnNlPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgZ3JpZCBpdGVtcyBzaG91bGQgYWRqdXN0IGhlaWdodCBhdXRvbWF0aWNhbGx5ICovXG4gIGF1dG9IZWlnaHQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExheW91dEl0ZW1Db25maWcge1xuICAvKiogQ29sdW1uIHdpZHRoIGluIGEgMTItY29sdW1uIGdyaWQgKi9cbiAgd2lkdGg/OiBudW1iZXI7XG4gIC8qKiBXaWR0aCBvbiBzbWFsbCBzY3JlZW5zICovXG4gIHNtPzogbnVtYmVyO1xuICAvKiogV2lkdGggb24gbWVkaXVtIHNjcmVlbnMgKi9cbiAgbWQ/OiBudW1iZXI7XG4gIC8qKiBXaWR0aCBvbiBsYXJnZSBzY3JlZW5zICovXG4gIGxnPzogbnVtYmVyO1xuICAvKiogV2lkdGggb24gZXh0cmEtbGFyZ2Ugc2NyZWVucyAqL1xuICB4bD86IG51bWJlcjtcbiAgLyoqIE51bWJlciBvZiBncmlkIGNvbHVtbnMgdG8gc3BhbiAqL1xuICBzcGFuPzogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIGdyaWQgcm93cyB0byBzcGFuICovXG4gIHJvd1NwYW4/OiBudW1iZXI7XG4gIC8qKiBEaXNwbGF5IG9yZGVyICovXG4gIG9yZGVyPzogbnVtYmVyIHwgXCJmaXJzdFwiIHwgXCJsYXN0XCI7XG4gIC8qKiBTZWxmLWFsaWdubWVudCB3aXRoaW4gY29udGFpbmVyICovXG4gIGFsaWduPzogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgfCBcInN0cmV0Y2hcIjtcbiAgLyoqIFdoZXRoZXIgaXRlbSBzaG91bGQgYXV0b21hdGljYWxseSBzaXplICovXG4gIGF1dG8/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExheW91dE9wdGlvbnMge1xuICAvKiogRGVmYXVsdCBjcmVhdG9yIGZ1bmN0aW9uIHRvIHVzZSBpZiBub3Qgc3BlY2lmaWVkIGluIHNjaGVtYSAqL1xuICBjcmVhdG9yPzogRnVuY3Rpb247XG4gIC8qKiBXaGV0aGVyIHRvIGFwcGx5IENTUyBjbGFzcyBwcmVmaXggQGRlZmF1bHQgdHJ1ZSAqL1xuICBwcmVmaXg/OiBib29sZWFuO1xuICAvKiogQWRkaXRpb25hbCBvcHRpb25zICovXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMYXlvdXRSZXN1bHQge1xuICAvKiogVGhlIHJhdyBsYXlvdXQgb2JqZWN0IHdpdGggYWxsIGNvbXBvbmVudHMgKi9cbiAgbGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAvKiogUmVmZXJlbmNlIHRvIHRoZSByb290IGVsZW1lbnQgZm9yIGNvbnZlbmllbmNlICovXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgYW55O1xuICAvKiogRmxhdHRlbmVkIGNvbXBvbmVudCBtYXAgKi9cbiAgY29tcG9uZW50OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAvKiogR2V0cyBhIGNvbXBvbmVudCBieSBuYW1lICovXG4gIGdldChuYW1lOiBzdHJpbmcpOiBhbnk7XG4gIC8qKiBHZXRzIGFsbCBjb21wb25lbnRzIGluIGEgZmxhdHRlbmVkIG1hcCAqL1xuICBnZXRBbGwoKTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgLyoqIERlc3Ryb3lzIHRoZSBsYXlvdXQsIGNsZWFuaW5nIHVwIGFsbCBjb21wb25lbnRzICovXG4gIGRlc3Ryb3koKTogdm9pZDtcbn1cblxudHlwZSBDb21wb25lbnRMaWtlID0geyBlbGVtZW50OiBIVE1MRWxlbWVudDsgW2tleTogc3RyaW5nXTogYW55IH07XG50eXBlIFNjaGVtYUl0ZW0gPSBGdW5jdGlvbiB8IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIGFueT4gfCBTY2hlbWFJdGVtW107XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJVSUxULUlOIE9QVElNSVpBVElPTlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBGcmFnbWVudCBQb29sIGZvciBlZmZpY2llbnQgRG9jdW1lbnRGcmFnbWVudCByZXVzZVxuICogUmVkdWNlcyBHQyBwcmVzc3VyZSBpbiBoaWdoLWZyZXF1ZW5jeSBsYXlvdXQgY3JlYXRpb24gc2NlbmFyaW9zXG4gKi9cbmNsYXNzIEZyYWdtZW50UG9vbCB7XG4gIHByaXZhdGUgcG9vbDogRG9jdW1lbnRGcmFnbWVudFtdID0gW107XG4gIHByaXZhdGUgbWF4U2l6ZSA9IDg7IC8vIE9wdGltaXplZCBzaXplIGZvciBtZW1vcnkgZWZmaWNpZW5jeVxuXG4gIGdldCgpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICByZXR1cm4gdGhpcy5wb29sLnBvcCgpIHx8IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgfVxuXG4gIHJlbGVhc2UoZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb29sLmxlbmd0aCA8IHRoaXMubWF4U2l6ZSAmJiBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5wb29sLnB1c2goZnJhZ21lbnQpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMucG9vbC5sZW5ndGggPSAwO1xuICB9XG59XG5cbmNvbnN0IGZyYWdtZW50UG9vbCA9IG5ldyBGcmFnbWVudFBvb2woKTtcblxuLyoqXG4gKiBDbGFzcyBuYW1lIGNhY2hlIGZvciBsYXlvdXQgY29uZmlndXJhdGlvbnNcbiAqIFJlZHVjZXMgc3RyaW5nIG9wZXJhdGlvbnMgYnkgY2FjaGluZyBnZW5lcmF0ZWQgY2xhc3MgbmFtZXNcbiAqL1xuY29uc3QgY2xhc3NDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbi8vIENvbmZpZ3VyYXRpb24gY29uc3RhbnRzXG5jb25zdCBQUkVGSVggPSBcIm10cmxcIjsgLy8gVE9ETzogTWFrZSB0aGlzIGNvbmZpZ3VyYWJsZVxuY29uc3QgUFJFRklYX1dJVEhfREFTSCA9IGAke1BSRUZJWH0tYDtcblxuLyoqXG4gKiBHZXRzIGEgY2FjaGVkIGNsYXNzIG5hbWUgZm9yIGxheW91dCBjb25maWd1cmF0aW9uXG4gKiBPcHRpbWl6ZWQgZm9yIGRpZmZlcmVudCBjbGFzcyBuYW1pbmcgcGF0dGVybnNcbiAqL1xuZnVuY3Rpb24gZ2V0Q2FjaGVkQ2xhc3NOYW1lKFxuICB0eXBlOiBzdHJpbmcsXG4gIHByb3BlcnR5OiBzdHJpbmcsXG4gIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIsXG4pOiBzdHJpbmcge1xuICBjb25zdCBrZXkgPSBgJHt0eXBlfS0ke3Byb3BlcnR5fS0ke3ZhbHVlfWA7XG4gIGlmICghY2xhc3NDYWNoZS5oYXMoa2V5KSkge1xuICAgIGlmICh0eXBlID09PSBcIml0ZW1cIikge1xuICAgICAgY2xhc3NDYWNoZS5zZXQoXG4gICAgICAgIGtleSxcbiAgICAgICAgcHJvcGVydHkgPT09IFwiXCJcbiAgICAgICAgICA/IGBsYXlvdXRfX2l0ZW0tLSR7dmFsdWV9YFxuICAgICAgICAgIDogYGxheW91dF9faXRlbS0tJHtwcm9wZXJ0eX0tJHt2YWx1ZX1gLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIGxheW91dCBjbGFzc2VzLCBhbGlnbiB1c2VzIGxheW91dC0te3R5cGV9LXt2YWx1ZX1cbiAgICAgIC8vIGJ1dCBqdXN0aWZ5IGFuZCBvdGhlcnMgdXNlIGxheW91dC0te3R5cGV9LXtwcm9wZXJ0eX0te3ZhbHVlfVxuICAgICAgaWYgKHByb3BlcnR5ID09PSBcImFsaWduXCIpIHtcbiAgICAgICAgY2xhc3NDYWNoZS5zZXQoa2V5LCBgbGF5b3V0LS0ke3R5cGV9LSR7dmFsdWV9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGFzc0NhY2hlLnNldChrZXksIGBsYXlvdXQtLSR7dHlwZX0tJHtwcm9wZXJ0eX0tJHt2YWx1ZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNsYXNzQ2FjaGUuZ2V0KGtleSkhO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBPUFRJTUlaRUQgVVRJTElUSUVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgYSBjb21wb25lbnQgb2JqZWN0IChoYXMgYW4gZWxlbWVudCBwcm9wZXJ0eSlcbiAqL1xuZnVuY3Rpb24gaXNDb21wb25lbnQodmFsdWU6IGFueSk6IHZhbHVlIGlzIENvbXBvbmVudExpa2Uge1xuICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIFwiZWxlbWVudFwiIGluIHZhbHVlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkb2N1bWVudCBmcmFnbWVudCB1c2luZyBwb29saW5nIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRnJhZ21lbnQoKTogRG9jdW1lbnRGcmFnbWVudCB7XG4gIHJldHVybiBmcmFnbWVudFBvb2wuZ2V0KCk7XG59XG5cbi8qKlxuICogUmVsZWFzZXMgYSBmcmFnbWVudCBiYWNrIHRvIHRoZSBwb29sIGZvciByZXVzZVxuICovXG5mdW5jdGlvbiByZWxlYXNlRnJhZ21lbnQoZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpOiB2b2lkIHtcbiAgZnJhZ21lbnRQb29sLnJlbGVhc2UoZnJhZ21lbnQpO1xufVxuXG4vKipcbiAqIE9wdGltaXplZCBjbGFzcyBwcm9jZXNzaW5nIHdpdGggbWluaW1hbCBzdHJpbmcgb3BlcmF0aW9uc1xuICogSGFuZGxlcyBhcnJheXMsIHN0cmluZ3MsIGNsYXNzTmFtZSBhbGlhc2VzLCBhbmQgcmF3Q2xhc3MgZWZmaWNpZW50bHlcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0NsYXNzTmFtZXMoXG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHNraXBQcmVmaXggPSBmYWxzZSxcbik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICBpZiAoIW9wdGlvbnMpIHJldHVybiBvcHRpb25zO1xuXG4gIGNvbnN0IGhhc1Jhd0NsYXNzID0gb3B0aW9ucy5yYXdDbGFzcztcbiAgY29uc3QgaGFzUmVndWxhckNsYXNzID0gb3B0aW9ucy5jbGFzcyB8fCBvcHRpb25zLmNsYXNzTmFtZTtcblxuICAvLyBGYXN0IHBhdGg6IG5vIGNsYXNzIHByb3BlcnRpZXMgYXQgYWxsXG4gIGlmICghaGFzUmF3Q2xhc3MgJiYgIWhhc1JlZ3VsYXJDbGFzcykgcmV0dXJuIG9wdGlvbnM7XG5cbiAgLy8gRmFzdCBwYXRoOiBvbmx5IHJhd0NsYXNzIGFuZCBza2lwcGluZyBwcmVmaXggKG1vc3QgY29tbW9uIHJhd0NsYXNzIHNjZW5hcmlvKVxuICBpZiAoaGFzUmF3Q2xhc3MgJiYgIWhhc1JlZ3VsYXJDbGFzcyAmJiBza2lwUHJlZml4KSB7XG4gICAgY29uc3QgcHJvY2Vzc2VkID0geyAuLi5vcHRpb25zIH07XG4gICAgZGVsZXRlIHByb2Nlc3NlZC5yYXdDbGFzcztcblxuICAgIC8vIERpcmVjdCBhc3NpZ25tZW50IGZvciBzaW1wbGUgc3RyaW5nXG4gICAgaWYgKHR5cGVvZiBoYXNSYXdDbGFzcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcHJvY2Vzc2VkLmNsYXNzID0gaGFzUmF3Q2xhc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEhhbmRsZSBhcnJheSBjYXNlXG4gICAgICBwcm9jZXNzZWQuY2xhc3MgPSBoYXNSYXdDbGFzcy5qb2luKFwiIFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2Nlc3NlZDtcbiAgfVxuXG4gIC8vIEZ1bGwgcHJvY2Vzc2luZyBwYXRoIChvbmx5IHdoZW4gbmVlZGVkKVxuICBjb25zdCBwcm9jZXNzZWQgPSB7IC4uLm9wdGlvbnMgfTtcbiAgbGV0IGZpbmFsQ2xhc3NlcyA9IFwiXCI7XG5cbiAgLy8gSGFuZGxlIHByZWZpeGVkIGNsYXNzZXMgb25seSBpZiBub3Qgc2tpcHBpbmcgcHJlZml4XG4gIGlmICghc2tpcFByZWZpeCAmJiBoYXNSZWd1bGFyQ2xhc3MpIHtcbiAgICBsZXQgcHJlZml4ZWRTdHJpbmcgPSBcIlwiO1xuXG4gICAgaWYgKHByb2Nlc3NlZC5jbGFzcykge1xuICAgICAgcHJlZml4ZWRTdHJpbmcgKz0gQXJyYXkuaXNBcnJheShwcm9jZXNzZWQuY2xhc3MpXG4gICAgICAgID8gcHJvY2Vzc2VkLmNsYXNzLmpvaW4oXCIgXCIpXG4gICAgICAgIDogcHJvY2Vzc2VkLmNsYXNzO1xuICAgIH1cbiAgICBpZiAocHJvY2Vzc2VkLmNsYXNzTmFtZSkge1xuICAgICAgcHJlZml4ZWRTdHJpbmcgKz0gKHByZWZpeGVkU3RyaW5nID8gXCIgXCIgOiBcIlwiKSArIHByb2Nlc3NlZC5jbGFzc05hbWU7XG4gICAgfVxuXG4gICAgaWYgKHByZWZpeGVkU3RyaW5nKSB7XG4gICAgICBmaW5hbENsYXNzZXMgPSBwcmVmaXhlZFN0cmluZ1xuICAgICAgICAuc3BsaXQoL1xccysvKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5tYXAoKGNscykgPT5cbiAgICAgICAgICBjbHMuc3RhcnRzV2l0aChQUkVGSVhfV0lUSF9EQVNIKSA/IGNscyA6IFBSRUZJWF9XSVRIX0RBU0ggKyBjbHMsXG4gICAgICAgIClcbiAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSByYXdDbGFzcyAoYWx3YXlzIHByb2Nlc3NlZCB3aGVuIHByZXNlbnQpXG4gIGlmIChoYXNSYXdDbGFzcykge1xuICAgIGNvbnN0IHJhd1N0cmluZyA9IEFycmF5LmlzQXJyYXkoaGFzUmF3Q2xhc3MpXG4gICAgICA/IGhhc1Jhd0NsYXNzLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKVxuICAgICAgOiBoYXNSYXdDbGFzcztcblxuICAgIGZpbmFsQ2xhc3NlcyArPSAoZmluYWxDbGFzc2VzID8gXCIgXCIgOiBcIlwiKSArIHJhd1N0cmluZztcbiAgfVxuXG4gIGlmIChmaW5hbENsYXNzZXMpIHtcbiAgICBwcm9jZXNzZWQuY2xhc3MgPSBmaW5hbENsYXNzZXM7XG4gIH1cblxuICAvLyBDbGVhbiB1cCBpbiBvbmUgb3BlcmF0aW9uXG4gIGRlbGV0ZSBwcm9jZXNzZWQuY2xhc3NOYW1lO1xuICBkZWxldGUgcHJvY2Vzc2VkLnJhd0NsYXNzO1xuXG4gIHJldHVybiBwcm9jZXNzZWQ7XG59XG5cbi8qKlxuICogT3B0aW1pemVkIHBhcmFtZXRlciBleHRyYWN0aW9uIGZvciBhcnJheSBzY2hlbWFzXG4gKiBSZWR1Y2VzIG11bHRpcGxlIGFycmF5IGxvb2t1cHMgd2l0aCBiYXRjaCBwcm9jZXNzaW5nXG4gKi9cbmludGVyZmFjZSBFeHRyYWN0ZWRQYXJhbWV0ZXJzIHtcbiAgY3JlYXRvcjogRnVuY3Rpb247XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIGNvbnN1bWVkOiBudW1iZXI7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RQYXJhbWV0ZXJzKFxuICBzY2hlbWE6IFNjaGVtYUl0ZW1bXSxcbiAgc3RhcnRJbmRleDogbnVtYmVyLFxuICBkZWZhdWx0Q3JlYXRvcjogRnVuY3Rpb24sXG4pOiBFeHRyYWN0ZWRQYXJhbWV0ZXJzIHtcbiAgY29uc3QgaXRlbXMgPSBzY2hlbWEuc2xpY2Uoc3RhcnRJbmRleCwgc3RhcnRJbmRleCArIDMpO1xuICBsZXQgY3JlYXRvciwgbmFtZSwgb3B0aW9ucztcbiAgbGV0IGNvbnN1bWVkID0gMTtcblxuICBjb25zdCBbZmlyc3QsIHNlY29uZCwgdGhpcmRdID0gaXRlbXM7XG5cbiAgaWYgKHR5cGVvZiBmaXJzdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY3JlYXRvciA9IGZpcnN0O1xuICAgIGlmICh0eXBlb2Ygc2Vjb25kID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBuYW1lID0gc2Vjb25kO1xuICAgICAgY29uc3VtZWQgPSAyO1xuICAgICAgaWYgKGlzT2JqZWN0KHRoaXJkKSkge1xuICAgICAgICBvcHRpb25zID0gdGhpcmQ7XG4gICAgICAgIGNvbnN1bWVkID0gMztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHNlY29uZCkpIHtcbiAgICAgIG9wdGlvbnMgPSBzZWNvbmQ7XG4gICAgICBjb25zdW1lZCA9IDI7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBmaXJzdCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNyZWF0b3IgPSBkZWZhdWx0Q3JlYXRvcjtcbiAgICBuYW1lID0gZmlyc3Q7XG4gICAgaWYgKGlzT2JqZWN0KHNlY29uZCkpIHtcbiAgICAgIG9wdGlvbnMgPSBzZWNvbmQ7XG4gICAgICBjb25zdW1lZCA9IDI7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGZpcnN0KSkge1xuICAgIGNyZWF0b3IgPSBkZWZhdWx0Q3JlYXRvcjtcbiAgICBvcHRpb25zID0gZmlyc3Q7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNyZWF0b3I6IGNyZWF0b3IgfHwgZGVmYXVsdENyZWF0b3IsXG4gICAgbmFtZSxcbiAgICBvcHRpb25zOiAob3B0aW9ucyB8fCB7fSkgYXMgUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjb25zdW1lZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBTaW1wbGUgb2JqZWN0IHR5cGUgY2hlY2tcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRE9NIFVUSUxJVElFUyAoU2ltcGxpZmllZClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBTaW1wbGUgRE9NIGVsZW1lbnQgY3JlYXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRWxlbWVudChvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30pOiBIVE1MRWxlbWVudCB7XG4gIGNvbnN0IHRhZyA9IG9wdGlvbnMudGFnIHx8IFwiZGl2XCI7XG4gIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XG5cbiAgaWYgKG9wdGlvbnMuY2xhc3MpIHtcbiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IG9wdGlvbnMuY2xhc3M7XG4gIH1cblxuICBpZiAob3B0aW9ucy5zdHlsZSkge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zdHlsZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBvcHRpb25zLnN0eWxlKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zLnN0eWxlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIG9wdGlvbnMuc3R5bGUpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRpb25zLnRleHRDb250ZW50KSB7XG4gICAgZWxlbWVudC50ZXh0Q29udGVudCA9IG9wdGlvbnMudGV4dENvbnRlbnQ7XG4gIH1cblxuICBpZiAob3B0aW9ucy50ZXh0KSB7XG4gICAgZWxlbWVudC50ZXh0Q29udGVudCA9IG9wdGlvbnMudGV4dDtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxuXG4vKipcbiAqIEFkZHMgYSBDU1MgY2xhc3MgdG8gYW4gZWxlbWVudFxuICovXG5mdW5jdGlvbiBhZGRDbGFzcyhlbGVtZW50OiBIVE1MRWxlbWVudCwgY2xhc3NOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGVsZW1lbnQgJiYgY2xhc3NOYW1lKSB7XG4gICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgZWxlbWVudCBoYXMgYSBDU1MgY2xhc3NcbiAqL1xuZnVuY3Rpb24gaGFzQ2xhc3MoZWxlbWVudDogSFRNTEVsZW1lbnQsIGNsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBlbGVtZW50ICYmIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFVOSUZJRUQgQ09NUE9ORU5UIENSRUFUSU9OICh3aXRoIGRlc3RydWN0dXJpbmcgb3B0aW1pemF0aW9uKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENyZWF0ZXMgYSBjb21wb25lbnQgaW5zdGFuY2Ugd2l0aCBvcHRpbWl6ZWQgb3B0aW9uIHByb2Nlc3NpbmdcbiAqIFVzZXMgZGVzdHJ1Y3R1cmluZyBmb3IgY2xlYW5lciBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKFxuICBDb21wb25lbnQ6IGFueSxcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuKTogYW55IHtcbiAgdHJ5IHtcbiAgICAvLyBEZXN0cnVjdHVyZSBzcGVjaWFsIGNvbmZpZ3MgaW4gb25lIG9wZXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIGxheW91dDogbGF5b3V0Q29uZmlnLFxuICAgICAgbGF5b3V0SXRlbTogbGF5b3V0SXRlbUNvbmZpZyxcbiAgICAgIHN0eWxlOiBzdHlsZUNvbmZpZyxcbiAgICAgIGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXNDb25maWcsXG4gICAgICBldmVudHM6IGV2ZW50c0NvbmZpZyxcbiAgICAgIGV2ZW50LCAvLyBMZWdhY3kgc3VwcG9ydFxuICAgICAgLi4uY2xlYW5PcHRpb25zXG4gICAgfSA9IG9wdGlvbnM7XG5cbiAgICAvLyBVc2UgZXZlbnRzIG92ZXIgZXZlbnQgKGV2ZW50cyBpcyBwcmVmZXJyZWQpXG4gICAgY29uc3QgZmluYWxFdmVudHNDb25maWcgPSBldmVudHNDb25maWcgfHwgZXZlbnQ7XG5cbiAgICAvLyBJZiBzdHlsZSBpcyBhIHN0cmluZywgYWx3YXlzIHBhc3MgaXQgdGhyb3VnaCB0byB0aGUgY29tcG9uZW50XG4gICAgaWYgKHN0eWxlQ29uZmlnICYmIHR5cGVvZiBzdHlsZUNvbmZpZyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY2xlYW5PcHRpb25zLnN0eWxlID0gc3R5bGVDb25maWc7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGNvbXBvbmVudFxuICAgIGNvbnN0IGlzQ2xhc3MgPVxuICAgICAgdHlwZW9mIENvbXBvbmVudCA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKENvbXBvbmVudCwgXCJwcm90b3R5cGVcIik/LndyaXRhYmxlID09PVxuICAgICAgICBmYWxzZTtcblxuICAgIGNvbnN0IGNvbXBvbmVudCA9IGlzQ2xhc3NcbiAgICAgID8gbmV3IENvbXBvbmVudChjbGVhbk9wdGlvbnMpXG4gICAgICA6IENvbXBvbmVudChjbGVhbk9wdGlvbnMpO1xuXG4gICAgLy8gQXBwbHkgY29uZmlndXJhdGlvbnMgaWYgY29tcG9uZW50IGhhcyBlbGVtZW50XG4gICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgY29uc3QgZWxlbWVudCA9XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50IHx8XG4gICAgICAgIChjb21wb25lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IGNvbXBvbmVudCA6IG51bGwpO1xuICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgLy8gQXBwbHkgbGF5b3V0IGNsYXNzZXNcbiAgICAgICAgaWYgKGxheW91dENvbmZpZykgYXBwbHlMYXlvdXRDbGFzc2VzKGVsZW1lbnQsIGxheW91dENvbmZpZyk7XG5cbiAgICAgICAgLy8gQXBwbHkgbGF5b3V0IGl0ZW0gY2xhc3Nlc1xuICAgICAgICBpZiAobGF5b3V0SXRlbUNvbmZpZykgYXBwbHlMYXlvdXRJdGVtQ2xhc3NlcyhlbGVtZW50LCBsYXlvdXRJdGVtQ29uZmlnKTtcblxuICAgICAgICAvLyBBcHBseSBzdHlsZVxuICAgICAgICBpZiAoc3R5bGVDb25maWcgJiYgdHlwZW9mIHN0eWxlQ29uZmlnID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCBzdHlsZUNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBhdHRyaWJ1dGVzXG4gICAgICAgIGlmIChhdHRyaWJ1dGVzQ29uZmlnICYmIHR5cGVvZiBhdHRyaWJ1dGVzQ29uZmlnID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlc0NvbmZpZykpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwbHkgZXZlbnRzXG4gICAgICAgIGlmIChmaW5hbEV2ZW50c0NvbmZpZyAmJiB0eXBlb2YgZmluYWxFdmVudHNDb25maWcgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaW5hbEV2ZW50c0NvbmZpZykpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZXZlbnREZWYgb2YgZmluYWxFdmVudHNDb25maWcpIHtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnREZWYpICYmIGV2ZW50RGVmLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2V2ZW50TmFtZSwgaGFuZGxlcl0gPSBldmVudERlZjtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnROYW1lID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgICB0eXBlb2YgaGFuZGxlciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbZXZlbnROYW1lLCBoYW5kbGVyXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgICAgICAgICAgZmluYWxFdmVudHNDb25maWcsXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBjcmVhdGluZyBjb21wb25lbnQgaW5zdGFuY2U6XCIsIGVycm9yKTtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBJTlRFR1JBVEVEIExBWU9VVCBDT05GSUdVUkFUSU9OICh3aXRoIGNhY2hpbmcpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQXBwbGllcyBsYXlvdXQgY2xhc3NlcyBiYXNlZCBvbiBjb25maWd1cmF0aW9uXG4gKiBVc2VzIGludGVncmF0ZWQgY2FjaGluZyBmb3Igb3B0aW1hbCBwZXJmb3JtYW5jZVxuICovXG5mdW5jdGlvbiBhcHBseUxheW91dENsYXNzZXMoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICBsYXlvdXRDb25maWc6IExheW91dENvbmZpZyxcbik6IHZvaWQge1xuICBpZiAoIWVsZW1lbnQgfHwgIWxheW91dENvbmZpZykgcmV0dXJuO1xuXG4gIC8vIEFwcGx5IGJhc2UgbGF5b3V0IHR5cGVcbiAgaWYgKGxheW91dENvbmZpZy50eXBlKSB7XG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLSR7bGF5b3V0Q29uZmlnLnR5cGV9YCk7XG4gIH1cblxuICAvLyBBcHBseSBwcm9wZXJ0aWVzIHdpdGggY2FjaGluZ1xuICBjb25zdCBsYXlvdXRUeXBlID0gbGF5b3V0Q29uZmlnLnR5cGUgfHwgZ2V0TGF5b3V0VHlwZShlbGVtZW50KTtcbiAgaWYgKGxheW91dFR5cGUpIHtcbiAgICBpZiAobGF5b3V0Q29uZmlnLmdhcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArXG4gICAgICAgICAgZ2V0Q2FjaGVkQ2xhc3NOYW1lKGxheW91dFR5cGUsIFwiZ2FwXCIsIGxheW91dENvbmZpZy5nYXApLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGxheW91dENvbmZpZy5hbGlnbikge1xuICAgICAgYWRkQ2xhc3MoXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIFBSRUZJWF9XSVRIX0RBU0ggK1xuICAgICAgICAgIGdldENhY2hlZENsYXNzTmFtZShsYXlvdXRUeXBlLCBcImFsaWduXCIsIGxheW91dENvbmZpZy5hbGlnbiksXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobGF5b3V0Q29uZmlnLmp1c3RpZnkpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICtcbiAgICAgICAgICBnZXRDYWNoZWRDbGFzc05hbWUobGF5b3V0VHlwZSwgXCJqdXN0aWZ5XCIsIGxheW91dENvbmZpZy5qdXN0aWZ5KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gR3JpZC1zcGVjaWZpYyBwcm9wZXJ0aWVzXG4gIGlmIChsYXlvdXRDb25maWcudHlwZSA9PT0gXCJncmlkXCIgfHwgZ2V0TGF5b3V0VHlwZShlbGVtZW50KSA9PT0gXCJncmlkXCIpIHtcbiAgICBpZiAodHlwZW9mIGxheW91dENvbmZpZy5jb2x1bW5zID09PSBcIm51bWJlclwiKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArXG4gICAgICAgICAgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiZ3JpZFwiLCBcImNvbHNcIiwgbGF5b3V0Q29uZmlnLmNvbHVtbnMpLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGxheW91dENvbmZpZy5jb2x1bW5zID09PSBcImF1dG8tZmlsbFwiKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcImdyaWRcIiwgXCJmaWxsXCIsIFwiYXV0b1wiKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChsYXlvdXRDb25maWcuY29sdW1ucyA9PT0gXCJhdXRvLWZpdFwiKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcImdyaWRcIiwgXCJjb2xzXCIsIFwiYXV0by1maXRcIiksXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobGF5b3V0Q29uZmlnLmRlbnNlKVxuICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLWdyaWQtZGVuc2VgKTtcbiAgICBpZiAobGF5b3V0Q29uZmlnLmF1dG9IZWlnaHQpXG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tZ3JpZC1hdXRvLWhlaWdodGApO1xuICB9XG5cbiAgLy8gUm93LXNwZWNpZmljIHByb3BlcnRpZXNcbiAgaWYgKGxheW91dENvbmZpZy50eXBlID09PSBcInJvd1wiIHx8IGdldExheW91dFR5cGUoZWxlbWVudCkgPT09IFwicm93XCIpIHtcbiAgICBpZiAobGF5b3V0Q29uZmlnLndyYXAgPT09IGZhbHNlIHx8IGxheW91dENvbmZpZy53cmFwID09PSBcIm5vd3JhcFwiKSB7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93LW5vd3JhcGApO1xuICAgIH0gZWxzZSBpZiAobGF5b3V0Q29uZmlnLndyYXAgPT09IFwicmV2ZXJzZVwiKSB7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93LXdyYXAtcmV2ZXJzZWApO1xuICAgIH1cbiAgICBpZiAobGF5b3V0Q29uZmlnLm1vYmlsZVN0YWNrKVxuICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLXJvdy1tb2JpbGUtc3RhY2tgKTtcbiAgICBpZiAobGF5b3V0Q29uZmlnLm1vYmlsZVNjcm9sbClcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3ctbW9iaWxlLXNjcm9sbGApO1xuICB9XG5cbiAgLy8gQ3VzdG9tIGNsYXNzZXNcbiAgaWYgKGxheW91dENvbmZpZy5jbGFzcykge1xuICAgIGxheW91dENvbmZpZy5jbGFzc1xuICAgICAgLnNwbGl0KFwiIFwiKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmZvckVhY2goKGNscykgPT4gZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNscykpO1xuICB9XG59XG5cbi8qKlxuICogQXBwbGllcyBsYXlvdXQgaXRlbSBjbGFzc2VzIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb25cbiAqIFVzZXMgaW50ZWdyYXRlZCBjYWNoaW5nIGZvciBvcHRpbWFsIHBlcmZvcm1hbmNlXG4gKi9cbmZ1bmN0aW9uIGFwcGx5TGF5b3V0SXRlbUNsYXNzZXMoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICBpdGVtQ29uZmlnOiBMYXlvdXRJdGVtQ29uZmlnLFxuKTogdm9pZCB7XG4gIGlmICghZWxlbWVudCB8fCAhaXRlbUNvbmZpZykgcmV0dXJuO1xuXG4gIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0X19pdGVtYCk7XG5cbiAgLy8gV2lkdGggYW5kIHJlc3BvbnNpdmUgY2xhc3NlcyB3aXRoIGNhY2hpbmdcbiAgaWYgKGl0ZW1Db25maWcud2lkdGggJiYgaXRlbUNvbmZpZy53aWR0aCA+PSAxICYmIGl0ZW1Db25maWcud2lkdGggPD0gMTIpIHtcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcIlwiLCBpdGVtQ29uZmlnLndpZHRoKSxcbiAgICApO1xuICB9XG4gIGlmIChpdGVtQ29uZmlnLnNtKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwic21cIiwgaXRlbUNvbmZpZy5zbSksXG4gICAgKTtcbiAgaWYgKGl0ZW1Db25maWcubWQpXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJtZFwiLCBpdGVtQ29uZmlnLm1kKSxcbiAgICApO1xuICBpZiAoaXRlbUNvbmZpZy5sZylcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcImxnXCIsIGl0ZW1Db25maWcubGcpLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLnhsKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwieGxcIiwgaXRlbUNvbmZpZy54bCksXG4gICAgKTtcblxuICAvLyBHcmlkIHNwYW4gY2xhc3Nlc1xuICBpZiAoaXRlbUNvbmZpZy5zcGFuKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwic3BhblwiLCBpdGVtQ29uZmlnLnNwYW4pLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLnJvd1NwYW4pXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArXG4gICAgICAgIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJyb3ctc3BhblwiLCBpdGVtQ29uZmlnLnJvd1NwYW4pLFxuICAgICk7XG5cbiAgLy8gT3JkZXIgYW5kIGFsaWdubWVudFxuICBpZiAoaXRlbUNvbmZpZy5vcmRlcilcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcIm9yZGVyXCIsIGl0ZW1Db25maWcub3JkZXIpLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLmFsaWduKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwic2VsZlwiLCBpdGVtQ29uZmlnLmFsaWduKSxcbiAgICApO1xuICBpZiAoaXRlbUNvbmZpZy5hdXRvKVxuICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0X19pdGVtLS1hdXRvYCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgbGF5b3V0IHR5cGUgZnJvbSBlbGVtZW50IGNsYXNzZXNcbiAqL1xuZnVuY3Rpb24gZ2V0TGF5b3V0VHlwZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IHN0cmluZyB7XG4gIHJldHVybiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tc3RhY2tgKVxuICAgID8gXCJzdGFja1wiXG4gICAgOiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93YClcbiAgICAgID8gXCJyb3dcIlxuICAgICAgOiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tZ3JpZGApXG4gICAgICAgID8gXCJncmlkXCJcbiAgICAgICAgOiBcIlwiO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBVTklGSUVEIFNDSEVNQSBQUk9DRVNTT1JTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUHJvY2Vzc2VzIGFycmF5LWJhc2VkIHNjaGVtYSBkZWZpbml0aW9uc1xuICogT3B0aW1pemVkIHdpdGggcGFyYW1ldGVyIGV4dHJhY3Rpb24gYW5kIGludGVncmF0ZWQgY29uZmlndXJhdGlvblxuICovXG5mdW5jdGlvbiBwcm9jZXNzQXJyYXlTY2hlbWEoXG4gIHNjaGVtYTogU2NoZW1hSXRlbVtdIHwgYW55LFxuICBwYXJlbnRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsLFxuICBsZXZlbDogbnVtYmVyID0gMCxcbiAgb3B0aW9uczogTGF5b3V0T3B0aW9ucyA9IHt9LFxuKTogTGF5b3V0UmVzdWx0IHtcbiAgbGV2ZWwrKztcbiAgY29uc3QgbGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGNvbnN0IGNvbXBvbmVudHM6IEFycmF5PFtzdHJpbmcsIGFueV0+ID0gW107XG4gIGNvbnN0IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnQoKTtcbiAgbGV0IGNvbXBvbmVudCA9IG51bGw7XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KHNjaGVtYSkpIHtcbiAgICByZXR1cm4gY3JlYXRlTGF5b3V0UmVzdWx0KGxheW91dCk7XG4gIH1cblxuICBjb25zdCBkZWZhdWx0Q3JlYXRvciA9IChvcHRpb25zIGFzIGFueSkuY3JlYXRvciB8fCBjcmVhdGVFbGVtZW50O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaXRlbSA9IHNjaGVtYVtpXTtcbiAgICBpZiAoIWl0ZW0pIGNvbnRpbnVlO1xuXG4gICAgLy8gSGFuZGxlIG5lc3RlZCBhcnJheXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gY29tcG9uZW50IHx8IHBhcmVudEVsZW1lbnQ7XG4gICAgICBjb25zdCByZXN1bHQgPSBwcm9jZXNzQXJyYXlTY2hlbWEoaXRlbSwgY29udGFpbmVyLCBsZXZlbCwgb3B0aW9ucyk7XG4gICAgICAvLyBNZXJnZSBuZXN0ZWQgY29tcG9uZW50cyBhcnJheSBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQubGF5b3V0LmNvbXBvbmVudHMpKSB7XG4gICAgICAgIGNvbXBvbmVudHMucHVzaCguLi5yZXN1bHQubGF5b3V0LmNvbXBvbmVudHMpO1xuICAgICAgICBkZWxldGUgcmVzdWx0LmxheW91dC5jb21wb25lbnRzO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmFzc2lnbihsYXlvdXQsIHJlc3VsdC5sYXlvdXQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gVXNlIG9wdGltaXplZCBwYXJhbWV0ZXIgZXh0cmFjdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIGNyZWF0b3IsXG4gICAgICBuYW1lLFxuICAgICAgb3B0aW9uczogaXRlbU9wdGlvbnMsXG4gICAgICBjb25zdW1lZCxcbiAgICB9ID0gZXh0cmFjdFBhcmFtZXRlcnMoc2NoZW1hLCBpLCBkZWZhdWx0Q3JlYXRvcik7XG5cbiAgICBpZiAoIWNyZWF0b3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIlNraXBwaW5nIHVuc3VwcG9ydGVkIGl0ZW0gdHlwZTpcIiwgaXRlbSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IHRvIGRpdiBmb3IgY3JlYXRlRWxlbWVudFxuICAgIGlmIChjcmVhdG9yID09PSBjcmVhdGVFbGVtZW50ICYmICEoXCJ0YWdcIiBpbiBpdGVtT3B0aW9ucykpIHtcbiAgICAgIGl0ZW1PcHRpb25zLnRhZyA9IFwiZGl2XCI7XG4gICAgfVxuXG4gICAgLy8gQWR2YW5jZSBpbmRleCBieSBjb25zdW1lZCBpdGVtcyBtaW51cyAxIChsb29wIGluY3JlbWVudCBoYW5kbGVzIHRoZSArMSlcbiAgICBpICs9IGNvbnN1bWVkIC0gMTtcblxuICAgIC8vIFByb2Nlc3Mgb3B0aW9ucyB3aXRoIHByZWZpeCAtIG9wdGltaXplZCBkZWNpc2lvbiBsb2dpY1xuICAgIGNvbnN0IHNob3VsZEFwcGx5UHJlZml4ID1cbiAgICAgIFwicHJlZml4XCIgaW4gaXRlbU9wdGlvbnMgPyBpdGVtT3B0aW9ucy5wcmVmaXggOiBvcHRpb25zLnByZWZpeCAhPT0gZmFsc2U7XG5cbiAgICAvLyBGYXN0IHBhdGg6IHByb2Nlc3Mgb25seSB3aGVuIG5lZWRlZFxuICAgIGNvbnN0IHByb2Nlc3NlZE9wdGlvbnMgPVxuICAgICAgc2hvdWxkQXBwbHlQcmVmaXggfHwgaXRlbU9wdGlvbnMucmF3Q2xhc3NcbiAgICAgICAgPyBwcm9jZXNzQ2xhc3NOYW1lcyhpdGVtT3B0aW9ucywgIXNob3VsZEFwcGx5UHJlZml4KVxuICAgICAgICA6IGl0ZW1PcHRpb25zOyAvLyBObyBjb3B5IG5lZWRlZCBpZiBubyBwcm9jZXNzaW5nXG5cbiAgICAvLyBBZGQgbmFtZSB0byBvcHRpb25zIGlmIG5lZWRlZFxuICAgIGlmIChcbiAgICAgIG5hbWUgJiZcbiAgICAgICEoXCJuYW1lXCIgaW4gcHJvY2Vzc2VkT3B0aW9ucykgJiZcbiAgICAgICEoY3JlYXRvciA9PT0gY3JlYXRlRWxlbWVudCB8fCAoY3JlYXRvciBhcyBhbnkpLmlzRWxlbWVudClcbiAgICApIHtcbiAgICAgIHByb2Nlc3NlZE9wdGlvbnMubmFtZSA9IG5hbWU7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGNvbXBvbmVudFxuICAgIGNvbXBvbmVudCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGNyZWF0b3IsIHByb2Nlc3NlZE9wdGlvbnMpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSBpc0NvbXBvbmVudChjb21wb25lbnQpID8gY29tcG9uZW50LmVsZW1lbnQgOiBjb21wb25lbnQ7XG5cbiAgICBpZiAobGV2ZWwgPT09IDEpIGxheW91dC5lbGVtZW50ID0gZWxlbWVudDtcbiAgICBpZiAobmFtZSkge1xuICAgICAgbGF5b3V0W25hbWVdID0gY29tcG9uZW50O1xuICAgICAgY29tcG9uZW50cy5wdXNoKFtuYW1lLCBjb21wb25lbnRdKTtcbiAgICB9XG5cbiAgICAvLyBBcHBlbmQgdG8gRE9NXG4gICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgaWYgKFwiaW5zZXJ0XCIgaW4gY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQuaW5zZXJ0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29tcG9uZW50Lmluc2VydChmcmFnbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgY29tcG9uZW50Ll9jb250YWluZXIgPSBwYXJlbnRFbGVtZW50O1xuICAgICAgICBpZiAoXG4gICAgICAgICAgXCJvbkluc2VydGVkXCIgaW4gY29tcG9uZW50ICYmXG4gICAgICAgICAgdHlwZW9mIGNvbXBvbmVudC5vbkluc2VydGVkID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29tcG9uZW50Lm9uSW5zZXJ0ZWQocGFyZW50RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBBcHBlbmQgZnJhZ21lbnQgdG8gcGFyZW50XG4gIGlmIChwYXJlbnRFbGVtZW50ICYmIGZyYWdtZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBpc0NvbXBvbmVudChwYXJlbnRFbGVtZW50KVxuICAgICAgPyBwYXJlbnRFbGVtZW50LmVsZW1lbnRcbiAgICAgIDogcGFyZW50RWxlbWVudDtcbiAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGZyYWdtZW50KTtcbiAgfVxuXG4gIC8vIFJlbGVhc2UgZnJhZ21lbnQgYmFjayB0byBwb29sXG4gIHJlbGVhc2VGcmFnbWVudChmcmFnbWVudCk7XG5cbiAgbGF5b3V0LmNvbXBvbmVudHMgPSBjb21wb25lbnRzO1xuICByZXR1cm4gY3JlYXRlTGF5b3V0UmVzdWx0KGxheW91dCk7XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIG9iamVjdC1iYXNlZCBzY2hlbWEgZGVmaW5pdGlvbnNcbiAqIFNpbXBsaWZpZWQgYW5kIG9wdGltaXplZCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NPYmplY3RTY2hlbWEoXG4gIHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB8IHN0cmluZyxcbiAgcGFyZW50RWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbCxcbiAgb3B0aW9uczogTGF5b3V0T3B0aW9ucyA9IHt9LFxuKTogTGF5b3V0UmVzdWx0IHtcbiAgY29uc3QgbGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGNvbnN0IGRlZmF1bHRDcmVhdG9yID0gb3B0aW9ucy5jcmVhdG9yIHx8IGNyZWF0ZUVsZW1lbnQ7XG5cbiAgLy8gSGFuZGxlIHJvb3QgZWxlbWVudCBjcmVhdGlvblxuICBpZiAoKHNjaGVtYSBhcyBhbnkpLmVsZW1lbnQgJiYgIXBhcmVudEVsZW1lbnQpIHtcbiAgICBjb25zdCBlbGVtZW50RGVmID0gKHNjaGVtYSBhcyBhbnkpLmVsZW1lbnQ7XG4gICAgY29uc3QgY3JlYXRlRWxlbWVudEZuID0gZWxlbWVudERlZi5jcmVhdG9yIHx8IGRlZmF1bHRDcmVhdG9yO1xuXG4gICAgY29uc3QgZWxlbWVudE9wdGlvbnMgPSBlbGVtZW50RGVmLm9wdGlvbnMgfHwge307XG4gICAgY29uc3QgcHJvY2Vzc2VkT3B0aW9ucyA9XG4gICAgICBvcHRpb25zLnByZWZpeCAhPT0gZmFsc2VcbiAgICAgICAgPyBwcm9jZXNzQ2xhc3NOYW1lcyhlbGVtZW50T3B0aW9ucylcbiAgICAgICAgOiB7IC4uLmVsZW1lbnRPcHRpb25zIH07XG5cbiAgICBjb25zdCByb290Q29tcG9uZW50ID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoXG4gICAgICBjcmVhdGVFbGVtZW50Rm4sXG4gICAgICBwcm9jZXNzZWRPcHRpb25zLFxuICAgICk7XG4gICAgbGF5b3V0LmVsZW1lbnQgPSByb290Q29tcG9uZW50O1xuICAgIGlmIChlbGVtZW50RGVmLm5hbWUpIGxheW91dFtlbGVtZW50RGVmLm5hbWVdID0gcm9vdENvbXBvbmVudDtcblxuICAgIC8vIFByb2Nlc3MgY2hpbGRyZW5cbiAgICBpZiAoZWxlbWVudERlZi5jaGlsZHJlbikge1xuICAgICAgY29uc3Qgcm9vdEVsZW1lbnQgPSBpc0NvbXBvbmVudChyb290Q29tcG9uZW50KVxuICAgICAgICA/IHJvb3RDb21wb25lbnQuZWxlbWVudFxuICAgICAgICA6IHJvb3RDb21wb25lbnQ7XG4gICAgICBjb25zdCBjaGlsZFJlc3VsdCA9IHByb2Nlc3NPYmplY3RTY2hlbWEoXG4gICAgICAgIGVsZW1lbnREZWYuY2hpbGRyZW4sXG4gICAgICAgIHJvb3RFbGVtZW50LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5hc3NpZ24obGF5b3V0LCBjaGlsZFJlc3VsdC5sYXlvdXQpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbiAgfVxuXG4gIC8vIFByb2Nlc3Mgbm9ybWFsIHNjaGVtYSBlbGVtZW50c1xuICBjb25zdCBmcmFnbWVudCA9IHBhcmVudEVsZW1lbnQgPyBjcmVhdGVGcmFnbWVudCgpIDogbnVsbDtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIGNvbnN0IGRlZiA9IChzY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XTtcbiAgICBpZiAoIWRlZikgY29udGludWU7XG5cbiAgICBjb25zdCBlbGVtZW50Q3JlYXRvciA9IGRlZi5jcmVhdG9yIHx8IGRlZmF1bHRDcmVhdG9yO1xuICAgIGNvbnN0IGVsZW1lbnRPcHRpb25zID0gZGVmLm9wdGlvbnMgfHwge307XG4gICAgY29uc3Qgc2hvdWxkQXBwbHlQcmVmaXggPVxuICAgICAgXCJwcmVmaXhcIiBpbiBlbGVtZW50T3B0aW9uc1xuICAgICAgICA/IGVsZW1lbnRPcHRpb25zLnByZWZpeFxuICAgICAgICA6IG9wdGlvbnMucHJlZml4ICE9PSBmYWxzZTtcbiAgICBjb25zdCBwcm9jZXNzZWRPcHRpb25zID0gc2hvdWxkQXBwbHlQcmVmaXhcbiAgICAgID8gcHJvY2Vzc0NsYXNzTmFtZXMoZWxlbWVudE9wdGlvbnMpXG4gICAgICA6IHsgLi4uZWxlbWVudE9wdGlvbnMgfTtcblxuICAgIGlmICghZGVmLm5hbWUgJiYga2V5ICE9PSBcImVsZW1lbnRcIikge1xuICAgICAgZGVmLm5hbWUgPSBrZXk7XG4gICAgfVxuXG4gICAgY29uc3QgY3JlYXRlZCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGVsZW1lbnRDcmVhdG9yLCBwcm9jZXNzZWRPcHRpb25zKTtcbiAgICBsYXlvdXRba2V5XSA9IGNyZWF0ZWQ7XG4gICAgaWYgKGRlZi5uYW1lICYmIGRlZi5uYW1lICE9PSBrZXkpIGxheW91dFtkZWYubmFtZV0gPSBjcmVhdGVkO1xuXG4gICAgY29uc3QgZWxlbWVudCA9IGlzQ29tcG9uZW50KGNyZWF0ZWQpID8gY3JlYXRlZC5lbGVtZW50IDogY3JlYXRlZDtcbiAgICBpZiAoZnJhZ21lbnQpIGZyYWdtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuXG4gICAgLy8gUHJvY2VzcyBjaGlsZHJlblxuICAgIGlmIChkZWYuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGNoaWxkUmVzdWx0ID0gcHJvY2Vzc09iamVjdFNjaGVtYShkZWYuY2hpbGRyZW4sIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgT2JqZWN0LmFzc2lnbihsYXlvdXQsIGNoaWxkUmVzdWx0LmxheW91dCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQXBwZW5kIHRvIHBhcmVudFxuICBpZiAocGFyZW50RWxlbWVudCAmJiBmcmFnbWVudCkge1xuICAgIGNvbnN0IHBhcmVudERvbSA9IGlzQ29tcG9uZW50KHBhcmVudEVsZW1lbnQpXG4gICAgICA/IHBhcmVudEVsZW1lbnQuZWxlbWVudFxuICAgICAgOiBwYXJlbnRFbGVtZW50O1xuICAgIHBhcmVudERvbS5hcHBlbmRDaGlsZChmcmFnbWVudCk7XG4gICAgcmVsZWFzZUZyYWdtZW50KGZyYWdtZW50KTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTEFZT1VUIFJFU1VMVCBDUkVBVElPTlxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEZsYXR0ZW5zIGEgbmVzdGVkIGxheW91dCBpbnRvIGEgc2ltcGxlIG9iamVjdCB3aXRoIGVsZW1lbnQgYW5kIGNvbXBvbmVudCByZWZlcmVuY2VzXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5MYXlvdXQobGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGNvbnN0IGZsYXR0ZW5lZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIGlmICghbGF5b3V0IHx8IHR5cGVvZiBsYXlvdXQgIT09IFwib2JqZWN0XCIpIHJldHVybiBmbGF0dGVuZWQ7XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gbGF5b3V0KSB7XG4gICAgY29uc3QgdmFsdWUgPSBsYXlvdXRba2V5XTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSAmJlxuICAgICAgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICh2YWx1ZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8XG4gICAgICAgICh0eXBlb2YgU1ZHRWxlbWVudCAhPT0gXCJ1bmRlZmluZWRcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHx8XG4gICAgICAgIGlzQ29tcG9uZW50KHZhbHVlKSlcbiAgICApIHtcbiAgICAgIGZsYXR0ZW5lZFtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZsYXR0ZW5lZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGF5b3V0IHJlc3VsdCBvYmplY3Qgd2l0aCB1dGlsaXR5IGZ1bmN0aW9uc1xuICovXG5mdW5jdGlvbiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogTGF5b3V0UmVzdWx0IHtcbiAgY29uc3QgZmxhdHRlbmVkQ29tcG9uZW50cyA9IGZsYXR0ZW5MYXlvdXQobGF5b3V0KTtcblxuICByZXR1cm4ge1xuICAgIGxheW91dCxcbiAgICBlbGVtZW50OiBsYXlvdXQuZWxlbWVudCxcbiAgICBjb21wb25lbnQ6IGZsYXR0ZW5lZENvbXBvbmVudHMsXG5cbiAgICBnZXQobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICAgIHJldHVybiBsYXlvdXRbbmFtZV0gPz8gbnVsbDtcbiAgICB9LFxuXG4gICAgZ2V0QWxsKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgcmV0dXJuIGZsYXR0ZW5lZENvbXBvbmVudHM7XG4gICAgfSxcblxuICAgIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAvLyBUcmFjayBkZXN0cm95ZWQgY29tcG9uZW50cyB0byBhdm9pZCBkb3VibGUtZGVzdHJveVxuICAgICAgY29uc3QgZGVzdHJveWVkID0gbmV3IFNldDxhbnk+KCk7XG5cbiAgICAgIC8vIEhlbHBlciB0byBzYWZlbHkgZGVzdHJveSBhIGNvbXBvbmVudFxuICAgICAgY29uc3QgZGVzdHJveUNvbXBvbmVudCA9IChjb21wb25lbnQ6IGFueSk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoIWNvbXBvbmVudCB8fCBkZXN0cm95ZWQuaGFzKGNvbXBvbmVudCkpIHJldHVybjtcblxuICAgICAgICAvLyBTa2lwIHBsYWluIEhUTUwgZWxlbWVudHMgYW5kIG5vbi1vYmplY3RzXG4gICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCB0eXBlb2YgY29tcG9uZW50ICE9PSBcIm9iamVjdFwiKVxuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGEgY29tcG9uZW50IHdpdGggZGVzdHJveSBtZXRob2RcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgZGVzdHJveWVkLmFkZChjb21wb25lbnQpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21wb25lbnQuZGVzdHJveSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBkZXN0cm95IGVycm9ycyAtIGNvbXBvbmVudCBtYXkgYWxyZWFkeSBiZSBjbGVhbmVkIHVwXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBGaXJzdCBkZXN0cm95IGNvbXBvbmVudHMgZnJvbSB0aGUgY29tcG9uZW50cyBhcnJheSAoaWYgcHJlc2VudClcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBhbGwgbmFtZWQgY29tcG9uZW50cyBhcmUgZGVzdHJveWVkIGV2ZW4gaWYgbmVzdGVkXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShsYXlvdXQuY29tcG9uZW50cykpIHtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgY29tcG9uZW50XSBvZiBsYXlvdXQuY29tcG9uZW50cykge1xuICAgICAgICAgIGRlc3Ryb3lDb21wb25lbnQoY29tcG9uZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGVuIGl0ZXJhdGUgb3ZlciBhbGwgbGF5b3V0IGtleXMgZm9yIGFueSBtaXNzZWQgY29tcG9uZW50c1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbGF5b3V0KSB7XG4gICAgICAgIGlmIChrZXkgPT09IFwiZWxlbWVudFwiIHx8IGtleSA9PT0gXCJjb21wb25lbnRzXCIpIGNvbnRpbnVlO1xuICAgICAgICBkZXN0cm95Q29tcG9uZW50KGxheW91dFtrZXldKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYXIgdGhlIGNvbXBvbmVudHMgYXJyYXlcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGxheW91dC5jb21wb25lbnRzKSkge1xuICAgICAgICBsYXlvdXQuY29tcG9uZW50cy5sZW5ndGggPSAwO1xuICAgICAgfVxuXG4gICAgICAvLyBSZW1vdmUgcm9vdCBlbGVtZW50IGZyb20gRE9NXG4gICAgICBpZiAobGF5b3V0LmVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGlzQ29tcG9uZW50KGxheW91dC5lbGVtZW50KVxuICAgICAgICAgID8gbGF5b3V0LmVsZW1lbnQuZWxlbWVudFxuICAgICAgICAgIDogbGF5b3V0LmVsZW1lbnQ7XG4gICAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDbGVhciByZWZlcmVuY2VzIHRvIGhlbHAgR0NcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGxheW91dCkge1xuICAgICAgICBkZWxldGUgbGF5b3V0W2tleV07XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVU5JRklFRCBFTlRSWSBQT0lOVFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsYXlvdXQgZnJvbSB2YXJpb3VzIHNjaGVtYSBmb3JtYXRzXG4gKiBVbmlmaWVkIHByb2Nlc3NvciBmb3IgYXJyYXlzLCBvYmplY3RzLCBKU1gsIGFuZCBIVE1MIHN0cmluZ3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxheW91dChcbiAgc2NoZW1hOiBhbnksXG4gIHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGwsXG4gIG9wdGlvbnM6IExheW91dE9wdGlvbnMgPSB7fSxcbik6IExheW91dFJlc3VsdCB7XG4gIC8vIEhhbmRsZSBmdW5jdGlvbiBzY2hlbWFzXG4gIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBzY2hlbWEgPSBzY2hlbWEoKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBIVE1MIHN0cmluZyBzY2hlbWFzXG4gIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gc2NoZW1hLnRyaW0oKTtcbiAgICBjb25zdCBmcmFnbWVudCA9IHRlbXBsYXRlLmNvbnRlbnQ7XG5cbiAgICBpZiAocGFyZW50RWxlbWVudCAmJiBmcmFnbWVudC5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IGxheW91dCA9IHsgZWxlbWVudDogZnJhZ21lbnQuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQgfTtcbiAgICByZXR1cm4gY3JlYXRlTGF5b3V0UmVzdWx0KGxheW91dCk7XG4gIH1cblxuICAvLyBIYW5kbGUgSlNYLWxpa2Ugc2NoZW1hcyAoYXJyYXkgd2l0aCBmdW5jdGlvbiwgc3RyaW5nLCBvYmplY3QgcGF0dGVybilcbiAgaWYgKFxuICAgIEFycmF5LmlzQXJyYXkoc2NoZW1hKSAmJlxuICAgIHNjaGVtYS5sZW5ndGggPj0gMyAmJlxuICAgIHR5cGVvZiBzY2hlbWFbMF0gPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHR5cGVvZiBzY2hlbWFbMV0gPT09IFwic3RyaW5nXCIgJiZcbiAgICBpc09iamVjdChzY2hlbWFbMl0pXG4gICkge1xuICAgIHJldHVybiBwcm9jZXNzQXJyYXlTY2hlbWEoc2NoZW1hLCBwYXJlbnRFbGVtZW50LCAwLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8vIFJvdXRlIHRvIGFwcHJvcHJpYXRlIHByb2Nlc3NvclxuICByZXR1cm4gQXJyYXkuaXNBcnJheShzY2hlbWEpXG4gICAgPyBwcm9jZXNzQXJyYXlTY2hlbWEoc2NoZW1hLCBwYXJlbnRFbGVtZW50LCAwLCBvcHRpb25zKVxuICAgIDogcHJvY2Vzc09iamVjdFNjaGVtYShzY2hlbWEsIHBhcmVudEVsZW1lbnQsIG9wdGlvbnMpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFWFBPUlRTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIENsZWFyIGZ1bmN0aW9ucyBmb3IgdGhlIHVuaWZpZWQgc3lzdGVtXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDbGFzc0NhY2hlKCk6IHZvaWQge1xuICBjbGFzc0NhY2hlLmNsZWFyKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckZyYWdtZW50UG9vbCgpOiB2b2lkIHtcbiAgZnJhZ21lbnRQb29sLmNsZWFyKCk7XG59XG5cbmV4cG9ydCB7XG4gIHByb2Nlc3NDbGFzc05hbWVzLFxuICBpc0NvbXBvbmVudCxcbiAgZmxhdHRlbkxheW91dCxcbiAgYXBwbHlMYXlvdXRDbGFzc2VzLFxuICBhcHBseUxheW91dEl0ZW1DbGFzc2VzLFxuICBjcmVhdGVMYXlvdXRSZXN1bHQsXG59O1xuIiwKICAgICIvKipcbiAqIEBtb2R1bGUgY29yZS9sYXlvdXQvY29uZmlnXG4gKiBAZGVzY3JpcHRpb24gRXNzZW50aWFsIGxheW91dCBjb25maWd1cmF0aW9uIHV0aWxpdGllc1xuICogQ29yZSBmdW5jdGlvbmFsaXR5IGlzIGludGVncmF0ZWQgaW50byBzY2hlbWEudHMgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICovXG5cbi8vIENvbmZpZ3VyYXRpb24gY29uc3RhbnRzXG5jb25zdCBQUkVGSVggPSBcIm10cmxcIjsgLy8gVE9ETzogTWFrZSB0aGlzIGNvbmZpZ3VyYWJsZSBmcm9tIG1haW4gbXRybCBjb25maWdcbmNvbnN0IFBSRUZJWF9XSVRIX0RBU0ggPSBgJHtQUkVGSVh9LWA7XG5cbi8qKlxuICogU2ltcGxlIERPTSB1dGlsaXRpZXNcbiAqL1xuZnVuY3Rpb24gYWRkQ2xhc3MoZWxlbWVudDogYW55LCBjbGFzc05hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZWxlbWVudCAmJiBjbGFzc05hbWUgJiYgZWxlbWVudC5jbGFzc0xpc3QpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNDbGFzcyhlbGVtZW50OiBhbnksIGNsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBlbGVtZW50ICYmIGVsZW1lbnQuY2xhc3NMaXN0ICYmIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGNsZWFuIHVwIHByZXZpb3VzIGxheW91dCBjbGFzc2VzIGZyb20gYW4gZWxlbWVudFxuICogVXNlZnVsIGZvciBkeW5hbWljIGNsYXNzIG1hbmFnZW1lbnRcbiAqXG4gKiBAcGFyYW0gZWxlbWVudCAtIEVsZW1lbnQgdG8gY2xlYW4gbGF5b3V0IGNsYXNzZXMgZnJvbVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYW51cExheW91dENsYXNzZXMoZWxlbWVudDogYW55KTogdm9pZCB7XG4gIGlmICghZWxlbWVudCB8fCAhZWxlbWVudC5jbGFzc0xpc3QpIHJldHVybjtcblxuICAvLyBHZXQgYWxsIGNsYXNzZXMgZnJvbSB0aGUgZWxlbWVudFxuICBjb25zdCBjbGFzc0xpc3QgPSBBcnJheS5mcm9tKGVsZW1lbnQuY2xhc3NMaXN0KSBhcyBzdHJpbmdbXTtcblxuICAvLyBGaW5kIGFuZCByZW1vdmUgbGF5b3V0LXJlbGF0ZWQgY2xhc3Nlc1xuICBjb25zdCBsYXlvdXRDbGFzc2VzID0gY2xhc3NMaXN0LmZpbHRlcihcbiAgICAoY2xzOiBzdHJpbmcpID0+XG4gICAgICBjbHMuc3RhcnRzV2l0aChgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tYCkgfHxcbiAgICAgIGNscy5pbmNsdWRlcyhgLSR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLWApXG4gICk7XG5cbiAgLy8gUmVtb3ZlIGVhY2ggbGF5b3V0IGNsYXNzXG4gIGxheW91dENsYXNzZXMuZm9yRWFjaCgoY2xzOiBzdHJpbmcpID0+IHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY2xzKTtcbiAgfSk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgbGF5b3V0IHR5cGUgZnJvbSBlbGVtZW50IGNsYXNzZXNcbiAqXG4gKiBAcGFyYW0gZWxlbWVudCAtIEVsZW1lbnQgdG8gY2hlY2tcbiAqIEByZXR1cm5zIExheW91dCB0eXBlIGlmIGZvdW5kLCBlbXB0eSBzdHJpbmcgb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXlvdXRUeXBlKGVsZW1lbnQ6IGFueSk6IHN0cmluZyB7XG4gIHJldHVybiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tc3RhY2tgKVxuICAgID8gXCJzdGFja1wiXG4gICAgOiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93YClcbiAgICA/IFwicm93XCJcbiAgICA6IGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1ncmlkYClcbiAgICA/IFwiZ3JpZFwiXG4gICAgOiBcIlwiO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGNvbmZpZ3VyZWQgcHJlZml4IGZvciB0aGUgbGF5b3V0IHN5c3RlbVxuICogQHJldHVybnMgQ3VycmVudCBwcmVmaXggd2l0aCBkYXNoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXlvdXRQcmVmaXgoKTogc3RyaW5nIHtcbiAgcmV0dXJuIFBSRUZJWF9XSVRIX0RBU0g7XG59XG5cbi8qKlxuICogU2V0cyBsYXlvdXQgY2xhc3NlcyBvbiBhbiBlbGVtZW50IGR5bmFtaWNhbGx5XG4gKiBVc2VmdWwgZm9yIHByb2dyYW1tYXRpYyBsYXlvdXQgdXBkYXRlc1xuICpcbiAqIEBwYXJhbSBlbGVtZW50IC0gVGFyZ2V0IGVsZW1lbnRcbiAqIEBwYXJhbSBsYXlvdXRUeXBlIC0gTGF5b3V0IHR5cGUgdG8gYXBwbHlcbiAqIEBwYXJhbSBjbGFzc2VzIC0gQWRkaXRpb25hbCBjbGFzc2VzIHRvIGFwcGx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRMYXlvdXRDbGFzc2VzKFxuICBlbGVtZW50OiBhbnksXG4gIGxheW91dFR5cGU6IHN0cmluZyxcbiAgY2xhc3Nlczogc3RyaW5nW10gPSBbXVxuKTogdm9pZCB7XG4gIGlmICghZWxlbWVudCB8fCAhbGF5b3V0VHlwZSkgcmV0dXJuO1xuXG4gIC8vIENsZWFuIHVwIGV4aXN0aW5nIGxheW91dCBjbGFzc2VzIGZpcnN0XG4gIGNsZWFudXBMYXlvdXRDbGFzc2VzKGVsZW1lbnQpO1xuXG4gIC8vIEFwcGx5IGJhc2UgbGF5b3V0IHR5cGVcbiAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLSR7bGF5b3V0VHlwZX1gKTtcblxuICAvLyBBcHBseSBhZGRpdGlvbmFsIGNsYXNzZXNcbiAgY2xhc3Nlcy5mb3JFYWNoKChjbHMpID0+IHtcbiAgICBpZiAoY2xzLnN0YXJ0c1dpdGgoXCJsYXlvdXQtLVwiKSB8fCBjbHMuc3RhcnRzV2l0aChcImxheW91dF9fXCIpKSB7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfSR7Y2xzfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBjbHMpO1xuICAgIH1cbiAgfSk7XG59XG4iLAogICAgIi8qKlxuICogQG1vZHVsZSBjb3JlL2xheW91dC9qc3hcbiAqIEBkZXNjcmlwdGlvbiBKU1gtbGlrZSBzeW50YXggc3VwcG9ydCBmb3IgbGF5b3V0IGNyZWF0aW9uXG4gKiBQcm92aWRlcyBhIHNpbXBsZSBoKCkgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGVsZW1lbnRzIHdpdGhvdXQgUmVhY3QgZGVwZW5kZW5jeVxuICovXG5cbmltcG9ydCB0eXBlIHsgTGF5b3V0UmVzdWx0IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUxheW91dCB9IGZyb20gXCIuL3NjaGVtYVwiO1xuXG4vKipcbiAqIEZyYWdtZW50IHN5bWJvbCBmb3IgSlNYIGZyYWdtZW50c1xuICovXG5leHBvcnQgY29uc3QgRnJhZ21lbnQgPSBTeW1ib2woXCJGcmFnbWVudFwiKTtcblxuLyoqXG4gKiBKU1gtbGlrZSBoeXBlcnNjcmlwdCBmdW5jdGlvblxuICogQ3JlYXRlcyBlbGVtZW50cyBpbiBhIFJlYWN0LWxpa2Ugc3ludGF4IHdpdGhvdXQgUmVhY3QgZGVwZW5kZW5jeVxuICpcbiAqIEBwYXJhbSB0YWcgLSBIVE1MIHRhZyBuYW1lLCBjb21wb25lbnQgZnVuY3Rpb24sIG9yIEZyYWdtZW50XG4gKiBAcGFyYW0gcHJvcHMgLSBFbGVtZW50IHByb3BlcnRpZXMgYW5kIGF0dHJpYnV0ZXNcbiAqIEBwYXJhbSBjaGlsZHJlbiAtIENoaWxkIGVsZW1lbnRzXG4gKiBAcmV0dXJucyBET00gZWxlbWVudCBvciBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGgoXG4gIHRhZzogc3RyaW5nIHwgRnVuY3Rpb24gfCB0eXBlb2YgRnJhZ21lbnQsXG4gIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwsXG4gIC4uLmNoaWxkcmVuOiBhbnlbXVxuKTogYW55IHtcbiAgLy8gSGFuZGxlIEZyYWdtZW50XG4gIGlmICh0YWcgPT09IEZyYWdtZW50KSB7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgIGlmIChjaGlsZCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPVxuICAgICAgICAgIHR5cGVvZiBjaGlsZCA9PT0gXCJzdHJpbmdcIiA/IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNoaWxkKSA6IGNoaWxkO1xuICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZnJhZ21lbnQ7XG4gIH1cblxuICAvLyBIYW5kbGUgc3RyaW5nIHRhZ3MgKEhUTUwgZWxlbWVudHMpXG4gIGlmICh0eXBlb2YgdGFnID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcblxuICAgIC8vIEFwcGx5IHByb3BzXG4gICAgaWYgKHByb3BzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9wcykpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJjbGFzc05hbWVcIiB8fCBrZXkgPT09IFwiY2xhc3NcIikge1xuICAgICAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5LnN0YXJ0c1dpdGgoXCJvblwiKSAmJiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIEV2ZW50IGhhbmRsZXJcbiAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBrZXkuc2xpY2UoMikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcInN0eWxlXCIgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgLy8gU3R5bGUgb2JqZWN0XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCIpIHtcbiAgICAgICAgICAvLyBIVE1MIGNvbnRlbnRcbiAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IHZhbHVlLl9faHRtbCB8fCBcIlwiO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBSZWd1bGFyIGF0dHJpYnV0ZVxuICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHBlbmQgY2hpbGRyZW5cbiAgICBjaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgaWYgKGNoaWxkICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjaGlsZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY2hpbGQpKTtcbiAgICAgICAgfSBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIE5vZGUpIHtcbiAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZyhjaGlsZCkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICAvLyBIYW5kbGUgY29tcG9uZW50IGZ1bmN0aW9uc1xuICBpZiAodHlwZW9mIHRhZyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc3QgYWxsUHJvcHMgPSBwcm9wcyB8fCB7fTtcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgYWxsUHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICB9XG4gICAgcmV0dXJuIHRhZyhhbGxQcm9wcyk7XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byBkaXZcbiAgcmV0dXJuIGgoXCJkaXZcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGF5b3V0IHVzaW5nIEpTWC1saWtlIHN5bnRheFxuICogUHJvdmlkZXMgYSBicmlkZ2UgYmV0d2VlbiBKU1ggYW5kIHRoZSBsYXlvdXQgc3lzdGVtXG4gKlxuICogQHBhcmFtIGpzeEVsZW1lbnQgLSBKU1ggZWxlbWVudCBjcmVhdGVkIHdpdGggaCgpXG4gKiBAcGFyYW0gcGFyZW50RWxlbWVudCAtIFBhcmVudCBlbGVtZW50IHRvIGF0dGFjaCB0b1xuICogQHJldHVybnMgTGF5b3V0IHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSnN4TGF5b3V0KFxuICBqc3hFbGVtZW50OiBhbnksXG4gIHBhcmVudEVsZW1lbnQ/OiBhbnlcbik6IExheW91dFJlc3VsdCB7XG4gIC8vIENvbnZlcnQgSlNYIGVsZW1lbnQgdG8gbGF5b3V0IHNjaGVtYVxuICBjb25zdCBzY2hlbWEgPSBqc3hFbGVtZW50O1xuXG4gIC8vIENyZWF0ZSBsYXlvdXQgdXNpbmcgdGhlIHN0YW5kYXJkIGNyZWF0ZUxheW91dCBmdW5jdGlvblxuICByZXR1cm4gY3JlYXRlTGF5b3V0KHNjaGVtYSwgcGFyZW50RWxlbWVudCk7XG59XG5cbi8qKlxuICogVXRpbGl0eSB0byBjcmVhdGUgYSBzaW1wbGUgY29tcG9uZW50IGZyb20gYSBmdW5jdGlvblxuICogVXNlZnVsIGZvciBjcmVhdGluZyByZXVzYWJsZSBKU1ggY29tcG9uZW50c1xuICpcbiAqIEBwYXJhbSBmbiAtIENvbXBvbmVudCBmdW5jdGlvblxuICogQHJldHVybnMgQ29tcG9uZW50IHRoYXQgY2FuIGJlIHVzZWQgaW4gSlNYXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb25lbnQoZm46IChwcm9wczogUmVjb3JkPHN0cmluZywgYW55PikgPT4gYW55KTogRnVuY3Rpb24ge1xuICByZXR1cm4gZnVuY3Rpb24gKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogYW55IHtcbiAgICByZXR1cm4gZm4ocHJvcHMgfHwge30pO1xuICB9O1xufVxuXG4vKipcbiAqIFV0aWxpdHkgdG8gcmVuZGVyIG11bHRpcGxlIEpTWCBlbGVtZW50c1xuICogVXNlZnVsIGZvciBjcmVhdGluZyBsaXN0cyBvciBjb2xsZWN0aW9uc1xuICpcbiAqIEBwYXJhbSBlbGVtZW50cyAtIEFycmF5IG9mIEpTWCBlbGVtZW50c1xuICogQHBhcmFtIHBhcmVudEVsZW1lbnQgLSBQYXJlbnQgZWxlbWVudCB0byBhdHRhY2ggdG9cbiAqIEByZXR1cm5zIEFycmF5IG9mIGxheW91dCByZXN1bHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJFbGVtZW50cyhcbiAgZWxlbWVudHM6IGFueVtdLFxuICBwYXJlbnRFbGVtZW50PzogYW55XG4pOiBMYXlvdXRSZXN1bHRbXSB7XG4gIHJldHVybiBlbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IGNyZWF0ZUpzeExheW91dChlbGVtZW50LCBwYXJlbnRFbGVtZW50KSk7XG59XG5cbi8qKlxuICogQ29tbW9uIEpTWCBlbGVtZW50IGNyZWF0b3JzIGZvciBjb252ZW5pZW5jZVxuICovXG5leHBvcnQgY29uc3QganN4ID0ge1xuICBkaXY6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwiZGl2XCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIHNwYW46IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwic3BhblwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBwOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcInBcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgYnV0dG9uOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcImJ1dHRvblwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBpbnB1dDogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gaChcImlucHV0XCIsIHByb3BzKSxcbiAgaW1nOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBoKFwiaW1nXCIsIHByb3BzKSxcbiAgYTogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJhXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIHVsOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcInVsXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGxpOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcImxpXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIHNlY3Rpb246IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwic2VjdGlvblwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBoZWFkZXI6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwiaGVhZGVyXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGZvb3RlcjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJmb290ZXJcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgbWFpbjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJtYWluXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGFydGljbGU6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwiYXJ0aWNsZVwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxufTtcbiIsCiAgICAiLyoqXG4gKiBWaWV3cG9ydCAtIENvcmUgdmlydHVhbCBzY3JvbGxpbmcgZW5naW5lXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBWaWV3cG9ydENvbmZpZyxcbiAgVmlld3BvcnRDb250ZXh0LFxuICBWaWV3cG9ydENvbXBvbmVudCxcbiAgSXRlbVJhbmdlLFxuICBWaWV3cG9ydEluZm8sXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBwaXBlIH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IHdpdGhCYXNlIH0gZnJvbSBcIi4vZmVhdHVyZXMvYmFzZVwiO1xuaW1wb3J0IHsgd2l0aFZpcnR1YWwgfSBmcm9tIFwiLi9mZWF0dXJlcy92aXJ0dWFsXCI7XG5pbXBvcnQgeyB3aXRoU2Nyb2xsaW5nIH0gZnJvbSBcIi4vZmVhdHVyZXMvc2Nyb2xsaW5nXCI7XG5pbXBvcnQgeyB3aXRoTW9tZW50dW0gfSBmcm9tIFwiLi9mZWF0dXJlcy9tb21lbnR1bVwiO1xuaW1wb3J0IHsgd2l0aFNjcm9sbGJhciB9IGZyb20gXCIuL2ZlYXR1cmVzL3Njcm9sbGJhclwiO1xuaW1wb3J0IHsgd2l0aENvbGxlY3Rpb24gfSBmcm9tIFwiLi9mZWF0dXJlcy9jb2xsZWN0aW9uXCI7XG5pbXBvcnQgeyB3aXRoUGxhY2Vob2xkZXJzIH0gZnJvbSBcIi4vZmVhdHVyZXMvcGxhY2Vob2xkZXJzXCI7XG5pbXBvcnQgeyB3aXRoUmVuZGVyaW5nIH0gZnJvbSBcIi4vZmVhdHVyZXMvcmVuZGVyaW5nXCI7XG5pbXBvcnQgeyB3aXRoRXZlbnRzIH0gZnJvbSBcIi4vZmVhdHVyZXMvZXZlbnRzXCI7XG5cbi8vIEludGVybmFsIHZpZXdwb3J0IHN0YXRlXG5pbnRlcmZhY2UgVmlld3BvcnRTdGF0ZSB7XG4gIHNjcm9sbFBvc2l0aW9uOiBudW1iZXI7XG4gIHRvdGFsSXRlbXM6IG51bWJlcjtcbiAgaXRlbVNpemU6IG51bWJlcjtcbiAgY29udGFpbmVyU2l6ZTogbnVtYmVyO1xuICB2aXJ0dWFsVG90YWxTaXplOiBudW1iZXI7XG4gIHZpc2libGVSYW5nZTogSXRlbVJhbmdlO1xuICBpdGVtc0NvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsO1xuICB2ZWxvY2l0eTogbnVtYmVyO1xuICBzY3JvbGxEaXJlY3Rpb246IFwiZm9yd2FyZFwiIHwgXCJiYWNrd2FyZFwiO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB2aWV3cG9ydC1lbmhhbmNlZCBjb21wb25lbnQgdXNpbmcgY29tcG9zaXRpb25cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gVmlld3BvcnQgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgRnVuY3Rpb24gdGhhdCBlbmhhbmNlcyBhIGNvbXBvbmVudCB3aXRoIHZpZXdwb3J0IGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgY29uc3QgY3JlYXRlVmlld3BvcnQgPSAoY29uZmlnOiBWaWV3cG9ydENvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dD4oY29tcG9uZW50OiBUKTogVCAmIFZpZXdwb3J0Q29tcG9uZW50ID0+IHtcbiAgICAvLyBUcmFjayBpZiB2aWV3cG9ydCBoYXMgYmVlbiBpbml0aWFsaXplZCB0byBwcmV2ZW50IG11bHRpcGxlIGluaXRpYWxpemF0aW9uc1xuICAgIGxldCBpc0luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgICAvLyBObyBub3JtYWxpemF0aW9uIG5lZWRlZCAtIHdlJ2xsIHVzZSB0aGUgbmVzdGVkIHN0cnVjdHVyZSBkaXJlY3RseVxuXG4gICAgLy8gQ3JlYXRlIHNoYXJlZCB2aWV3cG9ydCBzdGF0ZVxuICAgIGNvbnN0IHN0YXRlOiBWaWV3cG9ydFN0YXRlID0ge1xuICAgICAgc2Nyb2xsUG9zaXRpb246IDAsXG4gICAgICB0b3RhbEl0ZW1zOiBjb21wb25lbnQudG90YWxJdGVtcyB8fCAwLFxuICAgICAgaXRlbVNpemU6IGNvbmZpZy52aXJ0dWFsPy5pdGVtU2l6ZSB8fCA1MCxcbiAgICAgIGNvbnRhaW5lclNpemU6IDAsXG4gICAgICB2aXJ0dWFsVG90YWxTaXplOiAwLFxuICAgICAgdmlzaWJsZVJhbmdlOiB7IHN0YXJ0OiAwLCBlbmQ6IDAgfSxcbiAgICAgIGl0ZW1zQ29udGFpbmVyOiBudWxsLFxuICAgICAgdmVsb2NpdHk6IDAsXG4gICAgICBzY3JvbGxEaXJlY3Rpb246IFwiZm9yd2FyZFwiLFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgYmFzZSB2aWV3cG9ydCBBUElcbiAgICBjb25zdCB2aWV3cG9ydEFQSSA9IHtcbiAgICAgIC8vIENvcmUgQVBJXG4gICAgICBpbml0aWFsaXplOiAoKSA9PiB7XG4gICAgICAgIC8vIFByZXZlbnQgbXVsdGlwbGUgaW5pdGlhbGl6YXRpb25zXG4gICAgICAgIGlmIChpc0luaXRpYWxpemVkKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1ZpZXdwb3J0XSBJbml0aWFsaXppbmcgd2l0aCBzdGF0ZTpcIiwge1xuICAgICAgICAvLyAgIGVsZW1lbnQ6ICEhY29tcG9uZW50LmVsZW1lbnQsXG4gICAgICAgIC8vICAgdG90YWxJdGVtczogY29tcG9uZW50LnRvdGFsSXRlbXMsXG4gICAgICAgIC8vICAgaXRlbVNpemU6IGNvbmZpZy52aXJ0dWFsPy5pdGVtU2l6ZSxcbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBjb250YWluZXIgc2l6ZVxuICAgICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgICBzdGF0ZS5jb250YWluZXJTaXplID1cbiAgICAgICAgICAgIGNvbmZpZy5zY3JvbGxpbmc/Lm9yaWVudGF0aW9uID09PSBcImhvcml6b250YWxcIlxuICAgICAgICAgICAgICA/IGNvbXBvbmVudC5lbGVtZW50Lm9mZnNldFdpZHRoXG4gICAgICAgICAgICAgIDogY29tcG9uZW50LmVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJbVmlld3BvcnRdIENvbnRhaW5lciBzaXplOlwiLCBzdGF0ZS5jb250YWluZXJTaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBpbml0aWFsIHZpcnR1YWwgc2l6ZVxuICAgICAgICBzdGF0ZS52aXJ0dWFsVG90YWxTaXplID0gc3RhdGUudG90YWxJdGVtcyAqIHN0YXRlLml0ZW1TaXplO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBpbml0aWFsIHZpc2libGUgcmFuZ2VcbiAgICAgICAgc3RhdGUudmlzaWJsZVJhbmdlID0gY2FsY3VsYXRlVmlzaWJsZVJhbmdlKHN0YXRlLnNjcm9sbFBvc2l0aW9uKTtcblxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltWaWV3cG9ydF0gSW5pdGlhbCBzdGF0ZTpcIiwge1xuICAgICAgICAvLyAgIGNvbnRhaW5lclNpemU6IHN0YXRlLmNvbnRhaW5lclNpemUsXG4gICAgICAgIC8vICAgdmlydHVhbFRvdGFsU2l6ZTogc3RhdGUudmlydHVhbFRvdGFsU2l6ZSxcbiAgICAgICAgLy8gICB2aXNpYmxlUmFuZ2U6IHN0YXRlLnZpc2libGVSYW5nZSxcbiAgICAgICAgLy8gfSk7XG4gICAgICB9LFxuXG4gICAgICBkZXN0cm95OiAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFudXAgd2lsbCBiZSBoYW5kbGVkIGJ5IGZlYXR1cmVzXG4gICAgICB9LFxuXG4gICAgICB1cGRhdGVWaWV3cG9ydDogKCkgPT4ge1xuICAgICAgICAvLyBXaWxsIGJlIGltcGxlbWVudGVkIGJ5IHJlbmRlcmluZyBmZWF0dXJlXG4gICAgICB9LFxuXG4gICAgICAvLyBDaGVjayBpZiBhbHJlYWR5IGluaXRpYWxpemVkXG4gICAgICBpc0luaXRpYWxpemVkOiAoKSA9PiBpc0luaXRpYWxpemVkLFxuXG4gICAgICAvLyBSZXNldCBpbml0aWFsaXphdGlvbiBzdGF0ZSAoZm9yIHJlbG9hZCBmdW5jdGlvbmFsaXR5KVxuICAgICAgcmVzZXRJbml0aWFsaXphdGlvbjogKCkgPT4ge1xuICAgICAgICBpc0luaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICB9LFxuXG4gICAgICAvLyBBbGxvdyBmZWF0dXJlcyB0byBjaGVjayBpZiBpbml0IHNob3VsZCBwcm9jZWVkXG4gICAgICBfc2hvdWxkSW5pdDogKCkgPT4gIWlzSW5pdGlhbGl6ZWQsXG5cbiAgICAgIC8vIFNjcm9sbGluZyBBUEkgKHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBzY3JvbGxpbmcgZmVhdHVyZSlcbiAgICAgIHNjcm9sbFRvSW5kZXg6IChcbiAgICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgICAgYWxpZ25tZW50PzogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIsXG4gICAgICApID0+IHtcbiAgICAgICAgLy8gUGxhY2Vob2xkZXIgLSB3aWxsIGJlIGltcGxlbWVudGVkIGJ5IHNjcm9sbGluZyBmZWF0dXJlXG4gICAgICB9LFxuXG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uOiAocG9zaXRpb246IG51bWJlcikgPT4ge1xuICAgICAgICAvLyBXaWxsIGJlIGltcGxlbWVudGVkIGJ5IHNjcm9sbGluZyBmZWF0dXJlXG4gICAgICB9LFxuXG4gICAgICBnZXRTY3JvbGxQb3NpdGlvbjogKCkgPT4gc3RhdGUuc2Nyb2xsUG9zaXRpb24sXG5cbiAgICAgIC8vIEluZm8gQVBJXG4gICAgICBnZXRWaXNpYmxlUmFuZ2U6ICgpID0+IHN0YXRlLnZpc2libGVSYW5nZSxcblxuICAgICAgZ2V0Vmlld3BvcnRJbmZvOiAoKTogVmlld3BvcnRJbmZvID0+ICh7XG4gICAgICAgIGNvbnRhaW5lclNpemU6IHN0YXRlLmNvbnRhaW5lclNpemUsXG4gICAgICAgIHRvdGFsVmlydHVhbFNpemU6IHN0YXRlLnZpcnR1YWxUb3RhbFNpemUsXG4gICAgICAgIHZpc2libGVSYW5nZTogc3RhdGUudmlzaWJsZVJhbmdlLFxuICAgICAgICB2aXJ0dWFsU2Nyb2xsUG9zaXRpb246IHN0YXRlLnNjcm9sbFBvc2l0aW9uLFxuICAgICAgfSksXG5cbiAgICAgIC8vIFJlbmRlcmluZyBBUElcbiAgICAgIHJlbmRlckl0ZW1zOiAoKSA9PiB7XG4gICAgICAgIC8vIFdpbGwgYmUgaW1wbGVtZW50ZWQgYnkgcmVuZGVyaW5nIGZlYXR1cmVcbiAgICAgIH0sXG5cbiAgICAgIC8vIEludGVybmFsIHN0YXRlIChmb3IgZmVhdHVyZXMgdG8gYWNjZXNzKVxuICAgICAgc3RhdGUsXG4gICAgfTtcblxuICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjYWxjdWxhdGUgdmlzaWJsZSByYW5nZVxuICAgIGNvbnN0IGNhbGN1bGF0ZVZpc2libGVSYW5nZSA9IChzY3JvbGxQb3M6IG51bWJlcik6IEl0ZW1SYW5nZSA9PiB7XG4gICAgICBjb25zdCBpdGVtU2l6ZSA9IHN0YXRlLml0ZW1TaXplO1xuICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLmZsb29yKHNjcm9sbFBvcyAvIGl0ZW1TaXplKTtcbiAgICAgIGNvbnN0IHZpc2libGVDb3VudCA9IE1hdGguY2VpbChzdGF0ZS5jb250YWluZXJTaXplIC8gaXRlbVNpemUpO1xuICAgICAgY29uc3QgZW5kID0gTWF0aC5taW4oc3RhcnQgKyB2aXNpYmxlQ291bnQsIHN0YXRlLnRvdGFsSXRlbXMgLSAxKTtcblxuICAgICAgcmV0dXJuIHsgc3RhcnQ6IE1hdGgubWF4KDAsIHN0YXJ0KSwgZW5kOiBNYXRoLm1heCgwLCBlbmQpIH07XG4gICAgfTtcblxuICAgIC8vIEFkZCB2aWV3cG9ydCBBUEkgdG8gY29tcG9uZW50XG4gICAgY29uc3QgYmFzZUNvbXBvbmVudCA9IHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIHZpZXdwb3J0OiB2aWV3cG9ydEFQSSxcbiAgICB9O1xuXG4gICAgLy8gQnVpbGQgdGhlIGVuaGFuY2VtZW50IHBpcGVsaW5lXG4gICAgY29uc3QgZW5oYW5jZXJzOiBBcnJheTwoYzogYW55KSA9PiBhbnk+ID0gW107XG5cbiAgICAvLyBFdmVudHMgc3lzdGVtIChhbHdheXMgZmlyc3QgLSBwcm92aWRlcyBjb21tdW5pY2F0aW9uIGZvciBvdGhlciBmZWF0dXJlcylcbiAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgIHdpdGhFdmVudHMoe1xuICAgICAgICBkZWJ1ZzogY29uZmlnLmRlYnVnLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIEJhc2Ugc2V0dXAgKGNyZWF0ZXMgRE9NIHN0cnVjdHVyZSlcbiAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgIHdpdGhCYXNlKHtcbiAgICAgICAgY2xhc3NOYW1lOiBjb25maWcuY2xhc3NOYW1lLFxuICAgICAgICBvcmllbnRhdGlvbjogY29uZmlnLnNjcm9sbGluZz8ub3JpZW50YXRpb24sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gVmlydHVhbCBzY3JvbGxpbmcgKHJlcXVpcmVkIGZvciBtb3N0IGZlYXR1cmVzKVxuICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgd2l0aFZpcnR1YWwoe1xuICAgICAgICBpdGVtU2l6ZTogY29uZmlnLnZpcnR1YWw/Lml0ZW1TaXplLFxuICAgICAgICBvdmVyc2NhbjogY29uZmlnLnZpcnR1YWw/Lm92ZXJzY2FuLFxuICAgICAgICBvcmllbnRhdGlvbjogY29uZmlnLnNjcm9sbGluZz8ub3JpZW50YXRpb24sXG4gICAgICAgIGF1dG9EZXRlY3RJdGVtU2l6ZTogY29uZmlnLnZpcnR1YWw/LmF1dG9EZXRlY3RJdGVtU2l6ZSxcbiAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4OiAoY29uZmlnIGFzIGFueSkuaW5pdGlhbFNjcm9sbEluZGV4LFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIFNjcm9sbGluZyBiZWhhdmlvclxuICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgd2l0aFNjcm9sbGluZyh7XG4gICAgICAgIG9yaWVudGF0aW9uOiBjb25maWcuc2Nyb2xsaW5nPy5vcmllbnRhdGlvbixcbiAgICAgICAgc2Vuc2l0aXZpdHk6IGNvbmZpZy5zY3JvbGxpbmc/LnNlbnNpdGl2aXR5LFxuICAgICAgICBzbW9vdGhpbmc6IGNvbmZpZy5zY3JvbGxpbmc/LmFuaW1hdGlvbixcbiAgICAgICAgc3RvcE9uQ2xpY2s6IGNvbmZpZy5zY3JvbGxpbmc/LnN0b3BPbkNsaWNrLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIE1vbWVudHVtIHNjcm9sbGluZyAodG91Y2gvZHJhZyBzdXBwb3J0IGZvciBtb2JpbGUpXG4gICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICB3aXRoTW9tZW50dW0oe1xuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICBzdG9wT25DbGljazogY29uZmlnLnNjcm9sbGluZz8uc3RvcE9uQ2xpY2ssXG4gICAgICAgIGRlY2VsZXJhdGlvbjogY29uZmlnLnNjcm9sbGluZz8ubW9tZW50dW0/LmRlY2VsZXJhdGlvbixcbiAgICAgICAgbWluVmVsb2NpdHk6IGNvbmZpZy5zY3JvbGxpbmc/Lm1vbWVudHVtPy5taW5WZWxvY2l0eSxcbiAgICAgICAgbWluRHVyYXRpb246IGNvbmZpZy5zY3JvbGxpbmc/Lm1vbWVudHVtPy5tYXhEdXJhdGlvbixcbiAgICAgICAgbWluVmVsb2NpdHlUaHJlc2hvbGQ6IGNvbmZpZy5zY3JvbGxpbmc/Lm1vbWVudHVtPy52ZWxvY2l0eVRocmVzaG9sZCxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBTY3JvbGxiYXIgKG9wdGlvbmFsKVxuICAgIGlmIChjb25maWcuc2Nyb2xsYmFyPy5lbmFibGVkICE9PSBmYWxzZSkge1xuICAgICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICAgIHdpdGhTY3JvbGxiYXIoe1xuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgYXV0b0hpZGU6IGNvbmZpZy5zY3JvbGxiYXI/LmF1dG9IaWRlLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGNvbGxlY3Rpb24gaWYgY29uZmlndXJlZFxuICAgIGlmIChjb25maWcuY29sbGVjdGlvbj8uYWRhcHRlcikge1xuICAgICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICAgIHdpdGhDb2xsZWN0aW9uKHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiBjb25maWcuY29sbGVjdGlvbi5hZGFwdGVyLFxuICAgICAgICAgIHJhbmdlU2l6ZTogY29uZmlnLnBhZ2luYXRpb24/LmxpbWl0LFxuICAgICAgICAgIHN0cmF0ZWd5OiBjb25maWcucGFnaW5hdGlvbj8uc3RyYXRlZ3kgYXNcbiAgICAgICAgICAgIHwgXCJvZmZzZXRcIlxuICAgICAgICAgICAgfCBcInBhZ2VcIlxuICAgICAgICAgICAgfCBcImN1cnNvclwiXG4gICAgICAgICAgICB8IHVuZGVmaW5lZCxcbiAgICAgICAgICB0cmFuc2Zvcm06IGNvbmZpZy5jb2xsZWN0aW9uPy50cmFuc2Zvcm0sXG4gICAgICAgICAgY2FuY2VsTG9hZFRocmVzaG9sZDogY29uZmlnLnBlcmZvcm1hbmNlPy5jYW5jZWxMb2FkVGhyZXNob2xkLFxuICAgICAgICAgIG1heENvbmN1cnJlbnRSZXF1ZXN0czogY29uZmlnLnBlcmZvcm1hbmNlPy5tYXhDb25jdXJyZW50UmVxdWVzdHMsXG4gICAgICAgICAgZW5hYmxlUmVxdWVzdFF1ZXVlOiBjb25maWcucGVyZm9ybWFuY2U/LmVuYWJsZVJlcXVlc3RRdWV1ZSAhPT0gZmFsc2UsXG4gICAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4OiAoY29uZmlnIGFzIGFueSkuaW5pdGlhbFNjcm9sbEluZGV4LFxuICAgICAgICAgIHNlbGVjdElkOiAoY29uZmlnIGFzIGFueSkuc2VsZWN0SWQsXG4gICAgICAgICAgYXV0b0xvYWQ6IChjb25maWcgYXMgYW55KS5hdXRvTG9hZCAhPT0gZmFsc2UsXG4gICAgICAgICAgYXV0b1NlbGVjdEZpcnN0OiAoY29uZmlnIGFzIGFueSkuYXV0b1NlbGVjdEZpcnN0LFxuICAgICAgICAgIG1heENhY2hlZEl0ZW1zOiBjb25maWcuY2FjaGU/Lm1heEl0ZW1zLFxuICAgICAgICAgIGV2aWN0aW9uQnVmZmVyOiBjb25maWcuY2FjaGU/LmV2aWN0aW9uQnVmZmVyLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUGxhY2Vob2xkZXJzIChvcHRpb25hbCwgcmVxdWlyZXMgY29sbGVjdGlvbilcbiAgICBpZiAoY29uZmlnLmNvbGxlY3Rpb24/LmFkYXB0ZXIgJiYgY29uZmlnLnBsYWNlaG9sZGVycz8uZW5hYmxlZCAhPT0gZmFsc2UpIHtcbiAgICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgICB3aXRoUGxhY2Vob2xkZXJzKHtcbiAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgIGFuYWx5emVGaXJzdExvYWQ6IGNvbmZpZy5wbGFjZWhvbGRlcnM/LmFuYWx5emVGaXJzdExvYWQgPz8gdHJ1ZSxcbiAgICAgICAgICBtYXNrQ2hhcmFjdGVyOiBjb25maWcucGxhY2Vob2xkZXJzPy5tYXNrQ2hhcmFjdGVyLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUmVuZGVyaW5nIChhbHdheXMgbGFzdCB0byBoYXZlIGFjY2VzcyB0byBhbGwgZmVhdHVyZXMpXG4gICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICB3aXRoUmVuZGVyaW5nKHtcbiAgICAgICAgdGVtcGxhdGU6IGNvbmZpZy50ZW1wbGF0ZSxcbiAgICAgICAgb3ZlcnNjYW46IGNvbmZpZy52aXJ0dWFsPy5vdmVyc2NhbixcbiAgICAgICAgbWFpbnRhaW5Eb21PcmRlcjogY29uZmlnLnJlbmRlcmluZz8ubWFpbnRhaW5Eb21PcmRlcixcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBDb21wb3NlIGFsbCBlbmhhbmNlcnNcbiAgICBjb25zdCBlbmhhbmNlID0gcGlwZSguLi5lbmhhbmNlcnMpO1xuXG4gICAgLy8gQXBwbHkgZW5oYW5jZW1lbnRzXG4gICAgY29uc3QgZW5oYW5jZWQgPSBlbmhhbmNlKGJhc2VDb21wb25lbnQpO1xuXG4gICAgLy8gQXV0by1pbml0aWFsaXplIGlmIGVsZW1lbnQgaXMgcHJvdmlkZWRcbiAgICBpZiAoZW5oYW5jZWQuZWxlbWVudCkge1xuICAgICAgZW5oYW5jZWQudmlld3BvcnQuaW5pdGlhbGl6ZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlZCBhcyBUICYgVmlld3BvcnRDb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy91dGlscy50c1xuXG4vKipcbiAqIFNoYXJlZCB1dGlsaXRpZXMgZm9yIHZpZXdwb3J0IGZlYXR1cmVzXG4gKiBFbGltaW5hdGVzIGNvZGUgZHVwbGljYXRpb24gYWNyb3NzIGZlYXR1cmVzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogV3JhcHMgdmlld3BvcnQgaW5pdGlhbGl6YXRpb24gd2l0aCBmZWF0dXJlLXNwZWNpZmljIGxvZ2ljXG4gKiBFbGltaW5hdGVzIHRoZSByZXBlYXRlZCBpbml0aWFsaXphdGlvbiBob29rIHBhdHRlcm5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBJbml0aWFsaXplPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBWaWV3cG9ydENvbXBvbmVudD4oXG4gIGNvbXBvbmVudDogVCxcbiAgZmVhdHVyZUluaXQ6ICgpID0+IHZvaWQsXG4pOiB2b2lkIHtcbiAgY29uc3Qgb3JpZ2luYWxJbml0aWFsaXplID0gY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemU7XG4gIGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplID0gKCkgPT4ge1xuICAgIC8vIENoZWNrIGlmIGFscmVhZHkgaW5pdGlhbGl6ZWQgKHJldHVybnMgZmFsc2UgaWYgYWxyZWFkeSBkb25lKVxuICAgIGNvbnN0IHJlc3VsdCA9IG9yaWdpbmFsSW5pdGlhbGl6ZSgpO1xuICAgIC8vIE9ubHkgcnVuIGZlYXR1cmUgaW5pdCBpZiBiYXNlIGluaXQgYWN0dWFsbHkgcmFuIChkaWRuJ3QgcmV0dXJuIGZhbHNlKVxuICAgIGlmIChyZXN1bHQgIT09IGZhbHNlKSB7XG4gICAgICBmZWF0dXJlSW5pdCgpO1xuICAgIH1cbiAgICAvLyBQcm9wYWdhdGUgdGhlIHJlc3VsdCB0aHJvdWdoIHRoZSBjaGFpbiBzbyBvdXRlciB3cmFwcGVycyBrbm93IHRvIHNraXBcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG4vKipcbiAqIFdyYXBzIGNvbXBvbmVudCBkZXN0cm95IHdpdGggY2xlYW51cCBsb2dpY1xuICogRWxpbWluYXRlcyB0aGUgcmVwZWF0ZWQgZGVzdHJveSBob29rIHBhdHRlcm5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBEZXN0cm95PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgY29tcG9uZW50OiBULFxuICBjbGVhbnVwOiAoKSA9PiB2b2lkLFxuKTogdm9pZCB7XG4gIGlmIChcImRlc3Ryb3lcIiBpbiBjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQuZGVzdHJveTtcbiAgICAoY29tcG9uZW50IGFzIGFueSkuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgdmlld3BvcnQgc3RhdGUgd2l0aCBwcm9wZXIgdHlwaW5nXG4gKiBFbGltaW5hdGVzIHJlcGVhdGVkIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vmlld3BvcnRTdGF0ZShjb21wb25lbnQ6IFZpZXdwb3J0Q29tcG9uZW50KTogYW55IHtcbiAgcmV0dXJuIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gaXRlbSBpcyBhIHBsYWNlaG9sZGVyXG4gKiBFbGltaW5hdGVzIGR1cGxpY2F0ZWQgcGxhY2Vob2xkZXIgZGV0ZWN0aW9uIGxvZ2ljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BsYWNlaG9sZGVyKGl0ZW06IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGl0ZW0gJiZcbiAgICB0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIChpdGVtLl9wbGFjZWhvbGRlciA9PT0gdHJ1ZSB8fCBpdGVtW1wiX3BsYWNlaG9sZGVyXCJdID09PSB0cnVlKSAvLyBTdXBwb3J0IGJvdGggYWNjZXNzIHBhdHRlcm5zXG4gICk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJhbmdlIGtleSBmb3IgZGVkdXBsaWNhdGlvblxuICogVXNlZCBieSBtdWx0aXBsZSBmZWF0dXJlcyBmb3IgdHJhY2tpbmcgcmFuZ2VzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSYW5nZUtleShyYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZH1gO1xufVxuXG4vKipcbiAqIENsYW1wcyBhIHZhbHVlIGJldHdlZW4gbWluIGFuZCBtYXhcbiAqIFVzZWQgYnkgbXVsdGlwbGUgZmVhdHVyZXMgZm9yIGJvdW5kYXJ5IGNoZWNraW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFtcCh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihtYXgsIHZhbHVlKSk7XG59XG5cbi8qKlxuICogU3RvcmVzIGEgZnVuY3Rpb24gcmVmZXJlbmNlIG9uIHRoZSBjb21wb25lbnQgZm9yIGxhdGVyIGFjY2Vzc1xuICogRWxpbWluYXRlcyBwYXR0ZXJuIGxpa2UgKGNvbXBvbmVudCBhcyBhbnkpLl9mZWF0dXJlRnVuY3Rpb24gPSBmblxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RvcmVGZWF0dXJlRnVuY3Rpb248VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICBjb21wb25lbnQ6IFQsXG4gIG5hbWU6IHN0cmluZyxcbiAgZm46IEZ1bmN0aW9uLFxuKTogdm9pZCB7XG4gIChjb21wb25lbnQgYXMgYW55KVtuYW1lXSA9IGZuO1xufVxuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9iYXNlLnRzXG5cbi8qKlxuICogQmFzZSBWaWV3cG9ydCBGZWF0dXJlIC0gU2V0cyB1cCBjb3JlIHZpZXdwb3J0IHN0cnVjdHVyZVxuICogUHJvdmlkZXMgdGhlIGZvdW5kYXRpb24gZm9yIG90aGVyIHZpZXdwb3J0IGZlYXR1cmVzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyB3cmFwSW5pdGlhbGl6ZSwgZ2V0Vmlld3BvcnRTdGF0ZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZUNvbmZpZyB7XG4gIGNsYXNzTmFtZT86IHN0cmluZztcbiAgb3JpZW50YXRpb24/OiBcInZlcnRpY2FsXCIgfCBcImhvcml6b250YWxcIjtcbn1cblxuLyoqXG4gKiBCYXNlIGZlYXR1cmUgZm9yIHZpZXdwb3J0XG4gKiBTZXRzIHVwIHRoZSBET00gc3RydWN0dXJlIGFuZCBjb3JlIHN0eWxlc1xuICovXG5leHBvcnQgY29uc3Qgd2l0aEJhc2UgPSAoY29uZmlnOiBCYXNlQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHsgY2xhc3NOYW1lID0gXCJtdHJsLXZpZXdwb3J0XCIsIG9yaWVudGF0aW9uID0gXCJ2ZXJ0aWNhbFwiIH0gPSBjb25maWc7XG5cbiAgICAvLyBVc2UgdGhlIHNoYXJlZCB3cmFwcGVyIHV0aWxpdHlcbiAgICB3cmFwSW5pdGlhbGl6ZShjb21wb25lbnQsICgpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBjb21wb25lbnQuZWxlbWVudDtcbiAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuO1xuXG4gICAgICAvLyBDcmVhdGUgdmlld3BvcnQgc3RydWN0dXJlXG4gICAgICBsZXQgdmlld3BvcnRFbGVtZW50ID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBcIi5tdHJsLXZpZXdwb3J0XCJcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgIGlmICghdmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gYFxuICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgYDtcblxuICAgICAgICAvLyBTZXQgb3JpZW50YXRpb25cbiAgICAgICAgdmlld3BvcnRFbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtb3JpZW50YXRpb25cIiwgb3JpZW50YXRpb24pO1xuXG4gICAgICAgIC8vIENyZWF0ZSBpdGVtcyBjb250YWluZXJcbiAgICAgICAgY29uc3QgaXRlbXNDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBpdGVtc0NvbnRhaW5lci5jbGFzc05hbWUgPSBcIm10cmwtdmlld3BvcnQtaXRlbXNcIjtcbiAgICAgICAgaXRlbXNDb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGA7XG5cbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFwcGVuZENoaWxkKGl0ZW1zQ29udGFpbmVyKTtcbiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZCh2aWV3cG9ydEVsZW1lbnQpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB2aWV3cG9ydCBzdGF0ZSB3aXRoIGNvbnRhaW5lcnMgdXNpbmcgdXRpbGl0eVxuICAgICAgICBjb25zdCBzdGF0ZSA9IGdldFZpZXdwb3J0U3RhdGUoY29tcG9uZW50KTtcbiAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgc3RhdGUudmlld3BvcnRFbGVtZW50ID0gdmlld3BvcnRFbGVtZW50O1xuICAgICAgICAgIHN0YXRlLml0ZW1zQ29udGFpbmVyID0gaXRlbXNDb250YWluZXI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdG9yZSByZWZlcmVuY2VzIG9uIGNvbXBvbmVudFxuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkudmlld3BvcnRFbGVtZW50ID0gdmlld3BvcnRFbGVtZW50O1xuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuaXRlbXNDb250YWluZXIgPSBpdGVtc0NvbnRhaW5lcjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9jb25zdGFudHMudHNcblxuLyoqXG4gKiBWaWV3cG9ydCBDb25zdGFudHNcbiAqIENlbnRyYWxpemVkIGNvbnN0YW50cyBmb3IgYWxsIHZpZXdwb3J0IGZ1bmN0aW9uYWxpdHlcbiAqIENvbnNvbGlkYXRlZCBmcm9tIHZpZXdwb3J0LCB2aWV3cG9ydC9mZWF0dXJlcywgYW5kIGxpc3QtbWFuYWdlciBjb25zdGFudHNcbiAqL1xuXG5leHBvcnQgY29uc3QgVklFV1BPUlRfQ09OU1RBTlRTID0ge1xuICAvLyBWaXJ0dWFsIHNjcm9sbGluZyBkZWZhdWx0c1xuICBWSVJUVUFMX1NDUk9MTDoge1xuICAgIERFRkFVTFRfSVRFTV9TSVpFOiA0OCxcbiAgICBPVkVSU0NBTl9CVUZGRVI6IDIsXG4gICAgU0NST0xMX1NFTlNJVElWSVRZOiAwLjcsXG4gICAgTUFYX1ZJUlRVQUxfU0laRTogMTAwICogMTAwMCAqIDEwMDAsIC8vIDEwME0gcGl4ZWxzIC0gbW9kZXJuIGJyb3dzZXJzIGNhbiBoYW5kbGUgdGhpc1xuICAgIEFVVE9fREVURUNUX0lURU1fU0laRTogdHJ1ZSwgLy8gRW5hYmxlIGF1dG9tYXRpYyBpdGVtIHNpemUgZGV0ZWN0aW9uXG4gIH0sXG5cbiAgLy8gU2Nyb2xsaW5nIHNldHRpbmdzXG4gIFNDUk9MTElORzoge1xuICAgIE9WRVJTQ0FOOiAxLCAvLyBGcm9tIGZlYXR1cmVzL2NvbnN0YW50c1xuICB9LFxuXG4gIC8vIFJlbmRlcmluZyBzZXR0aW5nc1xuICBSRU5ERVJJTkc6IHtcbiAgICAvLyBFbGVtZW50IHJlY3ljbGluZ1xuICAgIERFRkFVTFRfTUFYX1BPT0xfU0laRTogMTAwLFxuICAgIENMQVNTRVM6IHtcbiAgICAgIElURU06IFwidmlld3BvcnQtaXRlbVwiLFxuICAgIH0sXG4gIH0sXG5cbiAgLy8gTG9hZGluZyBzZXR0aW5nc1xuICBMT0FESU5HOiB7XG4gICAgQ0FOQ0VMX1RIUkVTSE9MRDogMjUsIC8vIHB4L21zIC0gdmVsb2NpdHkgYWJvdmUgd2hpY2ggbG9hZHMgY2FuY2VsXG4gICAgTUFYX0NPTkNVUlJFTlRfUkVRVUVTVFM6IDEsIC8vIFBhcmFsbGVsIHJlcXVlc3RzIGFsbG93ZWRcbiAgICBERUZBVUxUX1JBTkdFX1NJWkU6IDIwLCAvLyBJdGVtcyBwZXIgcmVxdWVzdFxuICAgIERFQk9VTkNFX0xPQURJTkc6IDE1MCwgLy8gRGVib3VuY2UgZGVsYXkgKG1zKVxuICAgIE1JTl9SQU5HRV9TSVpFOiAxMCwgLy8gTWluaW11bSBpdGVtcyBwZXIgbG9hZFxuICAgIE1BWF9SQU5HRV9TSVpFOiAxMDAsIC8vIE1heGltdW0gaXRlbXMgcGVyIGxvYWRcbiAgICBSRVFVRVNUX1RJTUVPVVQ6IDUwMDAsIC8vIFJlcXVlc3QgdGltZW91dCAobXMpXG4gICAgUkVUUllfQVRURU1QVFM6IDIsIC8vIEZhaWxlZCByZXF1ZXN0IHJldHJpZXNcbiAgICBSRVRSWV9ERUxBWTogMTAwMCwgLy8gRGVsYXkgYmV0d2VlbiByZXRyaWVzIChtcylcbiAgfSxcblxuICAvLyBSZXF1ZXN0IHF1ZXVlIGNvbmZpZ3VyYXRpb24gKGZyb20gZmVhdHVyZXMvY29uc3RhbnRzKVxuICBSRVFVRVNUX1FVRVVFOiB7XG4gICAgRU5BQkxFRDogdHJ1ZSwgLy8gRW5hYmxlIHJlcXVlc3QgcXVldWluZ1xuICAgIE1BWF9RVUVVRV9TSVpFOiAxLCAvLyBNYXggcXVldWVkIHJlcXVlc3RzXG4gICAgTUFYX0FDVElWRV9SRVFVRVNUUzogMiwgLy8gTWF4IGNvbmN1cnJlbnQgYWN0aXZlIHJlcXVlc3RzXG4gIH0sXG5cbiAgLy8gUGxhY2Vob2xkZXIgc2V0dGluZ3NcbiAgUExBQ0VIT0xERVI6IHtcbiAgICBNQVNLX0NIQVJBQ1RFUjogXCJYXCIsIC8vIFVwZGF0ZWQgZnJvbSBsaXN0LW1hbmFnZXJcbiAgICBDTEFTUzogXCJ2aWV3cG9ydC1pdGVtLS1wbGFjZWhvbGRlclwiLFxuICAgIE1BWF9TQU1QTEVfU0laRTogMjAsXG4gICAgUExBQ0VIT0xERVJfRkxBRzogXCJfcGxhY2Vob2xkZXJcIixcbiAgICBSQU5ET01fTEVOR1RIX1ZBUklBTkNFOiB0cnVlLFxuICB9LFxuXG4gIC8vIFNwZWVkIHRyYWNraW5nIChmcm9tIGxpc3QtbWFuYWdlcilcbiAgU1BFRURfVFJBQ0tJTkc6IHtcbiAgICAvLyBWZWxvY2l0eSBjYWxjdWxhdGlvblxuICAgIERFQ0VMRVJBVElPTl9GQUNUT1I6IDAuODUsIC8vIHZlbG9jaXR5IGRlY2F5IHBlciBmcmFtZVxuICB9LFxuXG4gIC8vIE1vbWVudHVtIHNldHRpbmdzXG4gIE1PTUVOVFVNOiB7XG4gICAgRU5BQkxFRDogZmFsc2UsIC8vIEVuYWJsZSBtb21lbnR1bSBieSBkZWZhdWx0XG4gICAgREVDRUxFUkFUSU9OX0ZBQ1RPUjogMC45NSwgLy8gSG93IHF1aWNrbHkgdmVsb2NpdHkgZGVjcmVhc2VzIHBlciBmcmFtZSAoaGlnaGVyID0gbG9uZ2VyIGNvYXN0KVxuICAgIE1JTl9WRUxPQ0lUWTogMC4xLCAvLyBNaW5pbXVtIHZlbG9jaXR5IGJlZm9yZSBzdG9wcGluZyAocHgvbXMpXG4gICAgTUlOX0RVUkFUSU9OOiA3NTAsIC8vIE1heGltdW0gZ2VzdHVyZSBkdXJhdGlvbiB0byB0cmlnZ2VyIG1vbWVudHVtIChtcylcbiAgICBNSU5fVkVMT0NJVFlfVEhSRVNIT0xEOiAwLjQsIC8vIE1pbmltdW0gdmVsb2NpdHkgdG8gdHJpZ2dlciBtb21lbnR1bSAocHgvbXMpXG4gICAgRlJBTUVfVElNRTogMTYsIC8vIEFzc3VtZWQgZnJhbWUgdGltZSBmb3IgY2FsY3VsYXRpb25zIChtcylcbiAgfSxcblxuICAvLyBJbml0aWFsIGxvYWQgY29uZmlndXJhdGlvbiAoZnJvbSBsaXN0LW1hbmFnZXIpXG4gIElOSVRJQUxfTE9BRDoge1xuICAgIFNUUkFURUdZOiBcInBsYWNlaG9sZGVyc1wiLCAvLyBcInBsYWNlaG9sZGVyc1wiIHwgXCJkaXJlY3RcIiB8IFwicHJvZ3Jlc3NpdmVcIlxuICAgIFZJRVdQT1JUX01VTFRJUExJRVI6IDEuNSwgLy8gbG9hZCAxLjV4IHZpZXdwb3J0IGNhcGFjaXR5XG4gICAgTUlOX0lURU1TOiAxMCxcbiAgICBNQVhfSVRFTVM6IDEwMCxcbiAgICBQTEFDRUhPTERFUl9DT1VOVDogMjAsIC8vIGRlZmF1bHQgcGxhY2Vob2xkZXIgY291bnRcbiAgICBTSE9XX0xPQURJTkdfU1RBVEU6IHRydWUsXG4gICAgTE9BRElOR19ERUxBWTogMTAwLCAvLyBtcyAtIGRlbGF5IGJlZm9yZSBzaG93aW5nIGxvYWRpbmcgc3RhdGVcbiAgfSxcblxuICAvLyBTZWxlY3Rpb24gc2V0dGluZ3NcbiAgU0VMRUNUSU9OOiB7XG4gICAgU0VMRUNURURfQ0xBU1M6IFwidmlld3BvcnQtaXRlbS0tc2VsZWN0ZWRcIixcbiAgfSxcblxuICAvLyBTY3JvbGxiYXIgc2V0dGluZ3MgKGZyb20gbGlzdC1tYW5hZ2VyKVxuICBTQ1JPTExCQVI6IHtcbiAgICAvLyBDU1MgY2xhc3Nlc1xuICAgIENMQVNTRVM6IHtcbiAgICAgIFNDUk9MTEJBUjogXCJ2aWV3cG9ydF9fc2Nyb2xsYmFyXCIsXG4gICAgICBTQ1JPTExCQVJfVFJBQ0s6IFwidmlld3BvcnRfX3Njcm9sbGJhci10cmFja1wiLFxuICAgICAgU0NST0xMQkFSX1RIVU1COiBcInZpZXdwb3J0X19zY3JvbGxiYXItdGh1bWJcIixcbiAgICAgIFNDUk9MTEJBUl9WSVNJQkxFOiBcInZpZXdwb3J0X19zY3JvbGxiYXItLXZpc2libGVcIixcbiAgICAgIFNDUk9MTEJBUl9EUkFHR0lORzogXCJ2aWV3cG9ydF9fc2Nyb2xsYmFyLS1kcmFnZ2luZ1wiLFxuICAgICAgU0NST0xMQkFSX1RIVU1CX0RSQUdHSU5HOiBcInZpZXdwb3J0X19zY3JvbGxiYXItdGh1bWItLWRyYWdnaW5nXCIsXG4gICAgfSxcbiAgfSxcblxuICAvLyBPcmllbnRhdGlvbiAoZnJvbSBsaXN0LW1hbmFnZXIpXG4gIE9SSUVOVEFUSU9OOiB7XG4gICAgREVGQVVMVF9PUklFTlRBVElPTjogXCJ2ZXJ0aWNhbFwiLFxuICAgIERFRkFVTFRfQ1JPU1NfQVhJU19BTElHTk1FTlQ6IFwic3RyZXRjaFwiLFxuICAgIFJFVkVSU0VfRElSRUNUSU9OOiBmYWxzZSxcbiAgfSxcblxuICBQQUdJTkFUSU9OOiB7XG4gICAgREVGQVVMVF9TVFJBVEVHWTogXCJvZmZzZXRcIiBhcyBcIm9mZnNldFwiIHwgXCJwYWdlXCIgfCBcImN1cnNvclwiLFxuICAgIERFRkFVTFRfTElNSVQ6IDIwLFxuICAgIFNUUkFURUdJRVM6IHtcbiAgICAgIFBBR0U6IFwicGFnZVwiIGFzIGNvbnN0LFxuICAgICAgT0ZGU0VUOiBcIm9mZnNldFwiIGFzIGNvbnN0LFxuICAgICAgQ1VSU09SOiBcImN1cnNvclwiIGFzIGNvbnN0LFxuICAgIH0sXG4gICAgQ1VSU09SX0NMRUFOVVBfSU5URVJWQUw6IDYwMDAwLCAvLyBDbGVhbiB1cCBvbGQgY3Vyc29ycyBldmVyeSBtaW51dGVcbiAgICBNQVhfQ1VSU09SX01BUF9TSVpFOiAxMDAwLCAvLyBNYXhpbXVtIG51bWJlciBvZiBjdXJzb3JzIHRvIGtlZXAgaW4gbWVtb3J5XG4gICAgLy8gQ3Vyc29yLXNwZWNpZmljIHZpcnR1YWwgc2l6aW5nXG4gICAgQ1VSU09SX1NDUk9MTF9NQVJHSU5fTVVMVElQTElFUjogMywgLy8gTXVsdGlwbHkgcmFuZ2VTaXplIGJ5IHRoaXMgZm9yIHNjcm9sbCBtYXJnaW5cbiAgICBDVVJTT1JfTUlOX1ZJUlRVQUxfU0laRV9NVUxUSVBMSUVSOiAzLCAvLyBNaW5pbXVtIHZpcnR1YWwgc2l6ZSBhcyBtdWx0aXBsaWVyIG9mIHJhbmdlU2l6ZVxuICB9LFxufTtcblxuLyoqXG4gKiBUeXBlIGZvciBvdmVycmlkaW5nIGNvbnN0YW50cyBhdCBydW50aW1lXG4gKi9cbmV4cG9ydCB0eXBlIFZpZXdwb3J0Q29uc3RhbnRzID0gdHlwZW9mIFZJRVdQT1JUX0NPTlNUQU5UUztcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gbWVyZ2UgdXNlciBjb25zdGFudHMgd2l0aCBkZWZhdWx0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VDb25zdGFudHMoXG4gIHVzZXJDb25zdGFudHM6IFBhcnRpYWw8Vmlld3BvcnRDb25zdGFudHM+ID0ge30sXG4pOiBWaWV3cG9ydENvbnN0YW50cyB7XG4gIHJldHVybiB7XG4gICAgLi4uVklFV1BPUlRfQ09OU1RBTlRTLFxuICAgIC4uLnVzZXJDb25zdGFudHMsXG4gIH07XG59XG4iLAogICAgIi8qKlxuICogVmlydHVhbCBGZWF0dXJlIC0gQ29yZSB2aXJ0dWFsIHNjcm9sbGluZyBjYWxjdWxhdGlvbnNcbiAqIEhhbmRsZXMgdmlzaWJsZSByYW5nZSBjYWxjdWxhdGlvbiBhbmQgdG90YWwgdmlydHVhbCBzaXplIG1hbmFnZW1lbnRcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHdyYXBJbml0aWFsaXplLCBnZXRWaWV3cG9ydFN0YXRlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBWaXJ0dWFsQ29uZmlnIHtcbiAgaXRlbVNpemU/OiBudW1iZXI7XG4gIG92ZXJzY2FuPzogbnVtYmVyO1xuICBvcmllbnRhdGlvbj86IFwidmVydGljYWxcIiB8IFwiaG9yaXpvbnRhbFwiO1xuICBhdXRvRGV0ZWN0SXRlbVNpemU/OiBib29sZWFuO1xuICBkZWJ1Zz86IGJvb2xlYW47XG4gIGluaXRpYWxTY3JvbGxJbmRleD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBWaXJ0dWFsIHNjcm9sbGluZyBmZWF0dXJlIGZvciB2aWV3cG9ydFxuICogSGFuZGxlcyB2aXNpYmxlIHJhbmdlIGNhbGN1bGF0aW9ucyB3aXRoIGNvbXByZXNzaW9uIGZvciBsYXJnZSBkYXRhc2V0c1xuICovXG5leHBvcnQgY29uc3Qgd2l0aFZpcnR1YWwgPSAoY29uZmlnOiBWaXJ0dWFsQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGl0ZW1TaXplLFxuICAgICAgb3ZlcnNjYW4gPSBWSUVXUE9SVF9DT05TVEFOVFMuVklSVFVBTF9TQ1JPTEwuT1ZFUlNDQU5fQlVGRkVSLFxuICAgICAgb3JpZW50YXRpb24gPSBcInZlcnRpY2FsXCIsXG4gICAgICBhdXRvRGV0ZWN0SXRlbVNpemUgPSBpdGVtU2l6ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLkFVVE9fREVURUNUX0lURU1fU0laRVxuICAgICAgICA6IGZhbHNlLFxuICAgICAgZGVidWcgPSBmYWxzZSxcbiAgICAgIGluaXRpYWxTY3JvbGxJbmRleCA9IDAsXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIFVzZSBwcm92aWRlZCBpdGVtU2l6ZSBvciBkZWZhdWx0LCBidXQgbWFyayBpZiB3ZSBzaG91bGQgYXV0by1kZXRlY3RcbiAgICBjb25zdCBpbml0aWFsSXRlbVNpemUgPVxuICAgICAgaXRlbVNpemUgfHwgVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLkRFRkFVTFRfSVRFTV9TSVpFO1xuXG4gICAgY29uc3QgTUFYX1ZJUlRVQUxfU0laRSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5WSVJUVUFMX1NDUk9MTC5NQVhfVklSVFVBTF9TSVpFO1xuICAgIGxldCB2aWV3cG9ydFN0YXRlOiBhbnk7XG4gICAgbGV0IGhhc0NhbGN1bGF0ZWRJdGVtU2l6ZSA9IGZhbHNlO1xuICAgIGxldCBoYXNSZWNhbGN1bGF0ZWRTY3JvbGxGb3JDb21wcmVzc2lvbiA9IGZhbHNlOyAvLyBUcmFjayBpZiB3ZSd2ZSByZWNhbGN1bGF0ZWQgc2Nyb2xsIHBvc2l0aW9uIGZvciBjb21wcmVzc2lvblxuXG4gICAgLy8gSW5pdGlhbGl6ZSB1c2luZyBzaGFyZWQgd3JhcHBlclxuICAgIHdyYXBJbml0aWFsaXplKGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgdmlld3BvcnRTdGF0ZSA9IGdldFZpZXdwb3J0U3RhdGUoY29tcG9uZW50KTtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkgcmV0dXJuO1xuXG4gICAgICBPYmplY3QuYXNzaWduKHZpZXdwb3J0U3RhdGUsIHtcbiAgICAgICAgaXRlbVNpemU6IGluaXRpYWxJdGVtU2l6ZSxcbiAgICAgICAgb3ZlcnNjYW4sXG4gICAgICAgIGNvbnRhaW5lclNpemU6XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS52aWV3cG9ydEVsZW1lbnQ/LltcbiAgICAgICAgICAgIG9yaWVudGF0aW9uID09PSBcImhvcml6b250YWxcIiA/IFwib2Zmc2V0V2lkdGhcIiA6IFwib2Zmc2V0SGVpZ2h0XCJcbiAgICAgICAgICBdIHx8IDYwMCxcbiAgICAgIH0pO1xuXG4gICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyk7XG5cbiAgICAgIC8vIElmIHdlIGhhdmUgYW4gaW5pdGlhbCBzY3JvbGwgaW5kZXgsIGNhbGN1bGF0ZSBpbml0aWFsIHNjcm9sbCBwb3NpdGlvblxuICAgICAgLy8gTm90ZTogV2Ugc3RvcmUgdGhlIGluaXRpYWxTY3JvbGxJbmRleCB0byB1c2UgZGlyZWN0bHkgaW4gcmFuZ2UgY2FsY3VsYXRpb25zXG4gICAgICAvLyBiZWNhdXNlIHNjcm9sbCBwb3NpdGlvbiBtYXkgYmUgY29tcHJlc3NlZCBmb3IgbGFyZ2UgbGlzdHNcbiAgICAgIGxldCBpbml0aWFsU2Nyb2xsUG9zaXRpb24gPSB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uIHx8IDA7XG5cbiAgICAgIGlmIChpbml0aWFsU2Nyb2xsSW5kZXggPiAwKSB7XG4gICAgICAgIC8vIFN0b3JlIHRoZSB0YXJnZXQgaW5kZXggZm9yIHVzZSBpbiByYW5nZSBjYWxjdWxhdGlvbnNcbiAgICAgICAgKHZpZXdwb3J0U3RhdGUgYXMgYW55KS50YXJnZXRTY3JvbGxJbmRleCA9IGluaXRpYWxTY3JvbGxJbmRleDtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgc2Nyb2xsIHBvc2l0aW9uIChtYXkgYmUgY29tcHJlc3NlZCBmb3IgbGFyZ2UgbGlzdHMpXG4gICAgICAgIGluaXRpYWxTY3JvbGxQb3NpdGlvbiA9XG4gICAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4ICogKHZpZXdwb3J0U3RhdGUuaXRlbVNpemUgfHwgaW5pdGlhbEl0ZW1TaXplKTtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IGluaXRpYWxTY3JvbGxQb3NpdGlvbjtcblxuICAgICAgICAvLyBOb3RpZnkgc2Nyb2xsaW5nIGZlYXR1cmUgdG8gc3luYyBpdHMgbG9jYWwgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgIC8vIFVzZSBzZXRUaW1lb3V0IHRvIGVuc3VyZSBzY3JvbGxpbmcgZmVhdHVyZSBoYXMgaW5pdGlhbGl6ZWRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnNjcm9sbC1wb3NpdGlvbi1zeW5jXCIsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBpbml0aWFsU2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgICBzb3VyY2U6IFwiaW5pdGlhbC1zY3JvbGwtaW5kZXhcIixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZVZpc2libGVSYW5nZShpbml0aWFsU2Nyb2xsUG9zaXRpb24pO1xuXG4gICAgICAvLyBFbnN1cmUgY29udGFpbmVyIHNpemUgaXMgbWVhc3VyZWQgYWZ0ZXIgRE9NIGlzIHJlYWR5XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICB1cGRhdGVDb250YWluZXJTaXplKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEhlbHBlciBmdW5jdGlvbnNcbiAgICBjb25zdCBnZXRDb21wcmVzc2lvblJhdGlvID0gKCk6IG51bWJlciA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGU/LnZpcnR1YWxUb3RhbFNpemUpIHJldHVybiAxO1xuICAgICAgY29uc3QgYWN0dWFsU2l6ZSA9IHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyAqIHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG4gICAgICByZXR1cm4gYWN0dWFsU2l6ZSA8PSBNQVhfVklSVFVBTF9TSVpFID8gMSA6IE1BWF9WSVJUVUFMX1NJWkUgLyBhY3R1YWxTaXplO1xuICAgIH07XG5cbiAgICBjb25zdCBsb2cgPSAobWVzc2FnZTogc3RyaW5nLCBkYXRhPzogYW55KSA9PiB7XG4gICAgICBpZiAoZGVidWcpIGNvbnNvbGUubG9nKGBbVmlydHVhbF0gJHttZXNzYWdlfWAsIGRhdGEpO1xuICAgIH07XG5cbiAgICAvLyBDYWxjdWxhdGUgdmlzaWJsZSByYW5nZVxuICAgIGNvbnN0IGNhbGN1bGF0ZVZpc2libGVSYW5nZSA9IChcbiAgICAgIHNjcm9sbFBvc2l0aW9uOiBudW1iZXIsXG4gICAgKTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9ID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbVmlydHVhbF0gTm8gdmlld3BvcnQgc3RhdGUsIHJldHVybmluZyBlbXB0eSByYW5nZVwiKTtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lclNpemUsIHRvdGFsSXRlbXMgfSA9IHZpZXdwb3J0U3RhdGU7XG5cbiAgICAgIC8vIEVhcmx5IHJldHVybnMgZm9yIGludmFsaWQgc3RhdGVzXG4gICAgICBpZiAoXG4gICAgICAgICFjb250YWluZXJTaXplIHx8XG4gICAgICAgIGNvbnRhaW5lclNpemUgPD0gMCB8fFxuICAgICAgICAhdG90YWxJdGVtcyB8fFxuICAgICAgICB0b3RhbEl0ZW1zIDw9IDBcbiAgICAgICkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIGluaXRpYWxTY3JvbGxJbmRleCwgdXNlIGl0IHRvIGNhbGN1bGF0ZSB0aGUgcmFuZ2VcbiAgICAgICAgLy8gZXZlbiB3aGVuIHRvdGFsSXRlbXMgaXMgMCAobm90IHlldCBsb2FkZWQgZnJvbSBBUEkpXG4gICAgICAgIGlmIChpbml0aWFsU2Nyb2xsSW5kZXggPiAwKSB7XG4gICAgICAgICAgY29uc3QgdmlzaWJsZUNvdW50ID0gTWF0aC5jZWlsKFxuICAgICAgICAgICAgKGNvbnRhaW5lclNpemUgfHwgNjAwKSAvXG4gICAgICAgICAgICAgICh2aWV3cG9ydFN0YXRlLml0ZW1TaXplIHx8IGluaXRpYWxJdGVtU2l6ZSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KDAsIGluaXRpYWxTY3JvbGxJbmRleCAtIG92ZXJzY2FuKTtcbiAgICAgICAgICBjb25zdCBlbmQgPSBpbml0aWFsU2Nyb2xsSW5kZXggKyB2aXNpYmxlQ291bnQgKyBvdmVyc2NhbjtcbiAgICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICAgIH1cbiAgICAgICAgbG9nKGBJbnZhbGlkIHN0YXRlOiBjb250YWluZXI9JHtjb250YWluZXJTaXplfSwgaXRlbXM9JHt0b3RhbEl0ZW1zfWApO1xuICAgICAgICByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZpcnR1YWxTaXplID1cbiAgICAgICAgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplIHx8IHRvdGFsSXRlbXMgKiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplO1xuICAgICAgY29uc3QgdmlzaWJsZUNvdW50ID0gTWF0aC5jZWlsKGNvbnRhaW5lclNpemUgLyB2aWV3cG9ydFN0YXRlLml0ZW1TaXplKTtcbiAgICAgIGNvbnN0IGNvbXByZXNzaW9uUmF0aW8gPSBnZXRDb21wcmVzc2lvblJhdGlvKCk7XG5cbiAgICAgIGxldCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcjtcblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIHRhcmdldCBzY3JvbGwgaW5kZXggKGZvciBpbml0aWFsU2Nyb2xsSW5kZXggd2l0aCBjb21wcmVzc2lvbilcbiAgICAgIGNvbnN0IHRhcmdldFNjcm9sbEluZGV4ID0gKHZpZXdwb3J0U3RhdGUgYXMgYW55KS50YXJnZXRTY3JvbGxJbmRleDtcblxuICAgICAgaWYgKGNvbXByZXNzaW9uUmF0aW8gPCAxKSB7XG4gICAgICAgIC8vIENvbXByZXNzZWQgc3BhY2UgY2FsY3VsYXRpb25cbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHRhcmdldFNjcm9sbEluZGV4LCB1c2UgaXQgZGlyZWN0bHkgaW5zdGVhZCBvZiBjYWxjdWxhdGluZyBmcm9tIHNjcm9sbCBwb3NpdGlvblxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgd2Ugc2hvdyB0aGUgY29ycmVjdCBpdGVtcyBldmVuIHdoZW4gdmlydHVhbCBzcGFjZSBpcyBjb21wcmVzc2VkXG4gICAgICAgIGlmICh0YXJnZXRTY3JvbGxJbmRleCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldFNjcm9sbEluZGV4ID4gMCkge1xuICAgICAgICAgIHN0YXJ0ID0gTWF0aC5tYXgoMCwgdGFyZ2V0U2Nyb2xsSW5kZXggLSBvdmVyc2Nhbik7XG4gICAgICAgICAgZW5kID0gTWF0aC5taW4oXG4gICAgICAgICAgICB0b3RhbEl0ZW1zIC0gMSxcbiAgICAgICAgICAgIHRhcmdldFNjcm9sbEluZGV4ICsgdmlzaWJsZUNvdW50ICsgb3ZlcnNjYW4sXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBDbGVhciB0YXJnZXRTY3JvbGxJbmRleCBhZnRlciBmaXJzdCB1c2Ugc28gbm9ybWFsIHNjcm9sbGluZyB3b3Jrc1xuICAgICAgICAgIGRlbGV0ZSAodmlld3BvcnRTdGF0ZSBhcyBhbnkpLnRhcmdldFNjcm9sbEluZGV4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsU2l6ZTtcbiAgICAgICAgICBjb25zdCBleGFjdEluZGV4ID0gc2Nyb2xsUmF0aW8gKiB0b3RhbEl0ZW1zO1xuICAgICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihleGFjdEluZGV4KTtcbiAgICAgICAgICBlbmQgPSBNYXRoLmNlaWwoZXhhY3RJbmRleCkgKyB2aXNpYmxlQ291bnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOZWFyLWJvdHRvbSBoYW5kbGluZ1xuICAgICAgICBjb25zdCBtYXhTY3JvbGwgPSB2aXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemU7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlRnJvbUJvdHRvbSA9IG1heFNjcm9sbCAtIHNjcm9sbFBvc2l0aW9uO1xuXG4gICAgICAgIGlmIChkaXN0YW5jZUZyb21Cb3R0b20gPD0gY29udGFpbmVyU2l6ZSAmJiBkaXN0YW5jZUZyb21Cb3R0b20gPj0gLTEpIHtcbiAgICAgICAgICBjb25zdCBpdGVtc0F0Qm90dG9tID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgIGNvbnRhaW5lclNpemUgLyB2aWV3cG9ydFN0YXRlLml0ZW1TaXplLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgZmlyc3RWaXNpYmxlQXRCb3R0b20gPSBNYXRoLm1heCgwLCB0b3RhbEl0ZW1zIC0gaXRlbXNBdEJvdHRvbSk7XG4gICAgICAgICAgY29uc3QgaW50ZXJwb2xhdGlvbiA9IE1hdGgubWF4KFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIE1hdGgubWluKDEsIDEgLSBkaXN0YW5jZUZyb21Cb3R0b20gLyBjb250YWluZXJTaXplKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKFxuICAgICAgICAgICAgc3RhcnQgKyAoZmlyc3RWaXNpYmxlQXRCb3R0b20gLSBzdGFydCkgKiBpbnRlcnBvbGF0aW9uLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZW5kID1cbiAgICAgICAgICAgIGRpc3RhbmNlRnJvbUJvdHRvbSA8PSAxXG4gICAgICAgICAgICAgID8gdG90YWxJdGVtcyAtIDFcbiAgICAgICAgICAgICAgOiBNYXRoLm1pbih0b3RhbEl0ZW1zIC0gMSwgc3RhcnQgKyB2aXNpYmxlQ291bnQgKyBvdmVyc2Nhbik7XG5cbiAgICAgICAgICBsb2coXCJOZWFyIGJvdHRvbSBjYWxjdWxhdGlvbjpcIiwge1xuICAgICAgICAgICAgZGlzdGFuY2VGcm9tQm90dG9tLFxuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbixcbiAgICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgICAgZW5kLFxuICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwbHkgb3ZlcnNjYW5cbiAgICAgICAgc3RhcnQgPSBNYXRoLm1heCgwLCBzdGFydCAtIG92ZXJzY2FuKTtcbiAgICAgICAgZW5kID0gTWF0aC5taW4odG90YWxJdGVtcyAtIDEsIGVuZCArIG92ZXJzY2FuKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpcmVjdCBjYWxjdWxhdGlvblxuICAgICAgICBzdGFydCA9IE1hdGgubWF4KFxuICAgICAgICAgIDAsXG4gICAgICAgICAgTWF0aC5mbG9vcihzY3JvbGxQb3NpdGlvbiAvIHZpZXdwb3J0U3RhdGUuaXRlbVNpemUpIC0gb3ZlcnNjYW4sXG4gICAgICAgICk7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRvdGFsSXRlbXMgLSAxLCBzdGFydCArIHZpc2libGVDb3VudCArIG92ZXJzY2FuICogMik7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIG91dHB1dFxuICAgICAgaWYgKGlzTmFOKHN0YXJ0KSB8fCBpc05hTihlbmQpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbVmlydHVhbF0gTmFOIGluIHJhbmdlIGNhbGN1bGF0aW9uOlwiLCB7XG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgY29udGFpbmVyU2l6ZSxcbiAgICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICAgIGl0ZW1TaXplOiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplLFxuICAgICAgICAgIGNvbXByZXNzaW9uUmF0aW8sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgICB9XG5cbiAgICAgIC8vIGxvZyhgUmFuZ2U6ICR7c3RhcnR9LSR7ZW5kfSAoc2Nyb2xsOiAke3Njcm9sbFBvc2l0aW9ufSlgKTtcblxuICAgICAgLy8gU3RyYXRlZ2ljIGxvZyBmb3IgbGFzdCByYW5nZVxuICAgICAgLy8gaWYgKGVuZCA+PSB0b3RhbEl0ZW1zIC0gMTApIHtcbiAgICAgIC8vICAgY29uc29sZS5sb2coXG4gICAgICAvLyAgICAgYFtWaXJ0dWFsXSBOZWFyIGVuZCByYW5nZTogJHtzdGFydH0tJHtlbmR9LCB0b3RhbEl0ZW1zPSR7dG90YWxJdGVtc30sIGxhc3RJdGVtUG9zPSR7XG4gICAgICAvLyAgICAgICBlbmQgKiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplXG4gICAgICAvLyAgICAgfXB4LCB2aXJ0dWFsU2l6ZT0ke3ZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZX1weGBcbiAgICAgIC8vICAgKTtcbiAgICAgIC8vIH1cblxuICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgIH07XG5cbiAgICAvLyBDYWxjdWxhdGUgYWN0dWFsIHZpc2libGUgcmFuZ2UgKHdpdGhvdXQgb3ZlcnNjYW4gYnVmZmVyKVxuICAgIGNvbnN0IGNhbGN1bGF0ZUFjdHVhbFZpc2libGVSYW5nZSA9IChzY3JvbGxQb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHJldHVybiB7IHN0YXJ0OiAwLCBlbmQ6IDAgfTtcblxuICAgICAgY29uc3QgeyBjb250YWluZXJTaXplLCB0b3RhbEl0ZW1zIH0gPSB2aWV3cG9ydFN0YXRlO1xuICAgICAgaWYgKCFjb250YWluZXJTaXplIHx8ICF0b3RhbEl0ZW1zKSByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG5cbiAgICAgIGNvbnN0IGl0ZW1TaXplID0gdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZTtcbiAgICAgIGNvbnN0IHZpc2libGVDb3VudCA9IE1hdGguY2VpbChjb250YWluZXJTaXplIC8gaXRlbVNpemUpO1xuICAgICAgY29uc3QgY29tcHJlc3Npb25SYXRpbyA9IHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZVxuICAgICAgICA/ICh0b3RhbEl0ZW1zICogaXRlbVNpemUpIC8gdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplXG4gICAgICAgIDogMTtcblxuICAgICAgbGV0IHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyO1xuXG4gICAgICBpZiAoY29tcHJlc3Npb25SYXRpbyA8IDEpIHtcbiAgICAgICAgLy8gQ29tcHJlc3NlZCBzcGFjZSAtIGNhbGN1bGF0ZSBiYXNlZCBvbiBzY3JvbGwgcmF0aW9cbiAgICAgICAgY29uc3QgdmlydHVhbFNpemUgPVxuICAgICAgICAgIHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSB8fCB0b3RhbEl0ZW1zICogaXRlbVNpemU7XG4gICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsU2l6ZTtcbiAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKHNjcm9sbFJhdGlvICogdG90YWxJdGVtcyk7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRvdGFsSXRlbXMgLSAxLCBzdGFydCArIHZpc2libGVDb3VudCAtIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGlyZWN0IGNhbGN1bGF0aW9uXG4gICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihzY3JvbGxQb3NpdGlvbiAvIGl0ZW1TaXplKTtcbiAgICAgICAgZW5kID0gTWF0aC5taW4odG90YWxJdGVtcyAtIDEsIHN0YXJ0ICsgdmlzaWJsZUNvdW50IC0gMSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVuc3VyZSB2YWxpZCByYW5nZVxuICAgICAgc3RhcnQgPSBNYXRoLm1heCgwLCBzdGFydCk7XG4gICAgICBlbmQgPSBNYXRoLm1heChzdGFydCwgZW5kKTtcblxuICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgIH07XG5cbiAgICAvLyBVcGRhdGUgZnVuY3Rpb25zXG4gICAgY29uc3QgdXBkYXRlVmlzaWJsZVJhbmdlID0gKHNjcm9sbFBvc2l0aW9uOiBudW1iZXIpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkgcmV0dXJuO1xuICAgICAgdmlld3BvcnRTdGF0ZS52aXNpYmxlUmFuZ2UgPSBjYWxjdWxhdGVWaXNpYmxlUmFuZ2Uoc2Nyb2xsUG9zaXRpb24pO1xuXG4gICAgICAvLyBERUJVRzogTG9nIHdobyBjYWxscyB1cGRhdGVWaXNpYmxlUmFuZ2Ugd2l0aCAwIHdoZW4gaXQgc2hvdWxkIGJlIG5vbi16ZXJvXG5cbiAgICAgIC8vIENhbGN1bGF0ZSBhY3R1YWwgdmlzaWJsZSByYW5nZSAod2l0aG91dCBvdmVyc2NhbikgZm9yIFVJIGRpc3BsYXlcbiAgICAgIGNvbnN0IGFjdHVhbFZpc2libGVSYW5nZSA9IGNhbGN1bGF0ZUFjdHVhbFZpc2libGVSYW5nZShzY3JvbGxQb3NpdGlvbik7XG5cbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgcmFuZ2U6IHZpZXdwb3J0U3RhdGUudmlzaWJsZVJhbmdlLFxuICAgICAgICB2aXNpYmxlUmFuZ2U6IGFjdHVhbFZpc2libGVSYW5nZSxcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHRvdGFsIHZpcnR1YWwgc2l6ZVxuICAgIGNvbnN0IHVwZGF0ZVRvdGFsVmlydHVhbFNpemUgPSAodG90YWxJdGVtczogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHJldHVybjtcblxuICAgICAgY29uc3Qgb2xkU2l6ZSA9IHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZTtcbiAgICAgIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyA9IHRvdGFsSXRlbXM7XG4gICAgICBjb25zdCBhY3R1YWxTaXplID0gdG90YWxJdGVtcyAqIHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG5cbiAgICAgIC8vIEdldCBwYWRkaW5nIGZyb20gdGhlIGl0ZW1zIGNvbnRhaW5lciBpZiBhdmFpbGFibGVcbiAgICAgIGxldCB0b3RhbFBhZGRpbmcgPSAwO1xuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUuaXRlbXNDb250YWluZXIpIHtcbiAgICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKFxuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuaXRlbXNDb250YWluZXIsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdUb3AgPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUucGFkZGluZ1RvcCkgfHwgMDtcbiAgICAgICAgY29uc3QgcGFkZGluZ0JvdHRvbSA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5wYWRkaW5nQm90dG9tKSB8fCAwO1xuICAgICAgICB0b3RhbFBhZGRpbmcgPSBwYWRkaW5nVG9wICsgcGFkZGluZ0JvdHRvbTtcbiAgICAgIH1cblxuICAgICAgLy8gSW5jbHVkZSBwYWRkaW5nIGluIHRoZSB2aXJ0dWFsIHNpemVcbiAgICAgIHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSA9IE1hdGgubWluKFxuICAgICAgICBhY3R1YWxTaXplICsgdG90YWxQYWRkaW5nLFxuICAgICAgICBNQVhfVklSVFVBTF9TSVpFLFxuICAgICAgKTtcblxuICAgICAgLy8gU3RyYXRlZ2ljIGxvZyBmb3IgZGVidWdnaW5nIGdhcCBpc3N1ZVxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbVmlydHVhbF0gVG90YWwgc2l6ZSB1cGRhdGU6IGl0ZW1zPSR7dG90YWxJdGVtc30sIGl0ZW1TaXplPSR7dmlld3BvcnRTdGF0ZS5pdGVtU2l6ZX1weCwgcGFkZGluZz0ke3RvdGFsUGFkZGluZ31weCwgdmlydHVhbFNpemU9JHt2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemV9cHggKHdhcyAke29sZFNpemV9cHgpYFxuICAgICAgLy8gKTtcblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnZpcnR1YWwtc2l6ZS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZTogdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplLFxuICAgICAgICB0b3RhbEl0ZW1zOiB0b3RhbEl0ZW1zLFxuICAgICAgICBjb21wcmVzc2lvblJhdGlvOiBnZXRDb21wcmVzc2lvblJhdGlvKCksXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIGNvbnRhaW5lciBzaXplXG4gICAgY29uc3QgdXBkYXRlQ29udGFpbmVyU2l6ZSA9ICgpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSB8fCAhdmlld3BvcnRTdGF0ZS52aWV3cG9ydEVsZW1lbnQpIHJldHVybjtcblxuICAgICAgY29uc3Qgc2l6ZSA9XG4gICAgICAgIHZpZXdwb3J0U3RhdGUudmlld3BvcnRFbGVtZW50W1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUub3JpZW50YXRpb24gPT09IFwiaG9yaXpvbnRhbFwiXG4gICAgICAgICAgICA/IFwib2Zmc2V0V2lkdGhcIlxuICAgICAgICAgICAgOiBcIm9mZnNldEhlaWdodFwiXG4gICAgICAgIF07XG5cbiAgICAgIC8vIExvZyB0aGUgYWN0dWFsIG1lYXN1cmVtZW50XG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtWaXJ0dWFsXSBDb250YWluZXIgc2l6ZSBtZWFzdXJlZDogJHtzaXplfXB4IGZyb20gdmlld3BvcnQgZWxlbWVudGBcbiAgICAgIC8vICk7XG5cbiAgICAgIGlmIChzaXplICE9PSB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUpIHtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplID0gc2l6ZTtcbiAgICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG4gICAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUodmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zKTsgLy8gQWxzbyB1cGRhdGUgdmlydHVhbCBzaXplXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpjb250YWluZXItc2l6ZS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgICBjb250YWluZXJTaXplOiBzaXplLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gT3ZlcnJpZGUgdmlld3BvcnQgbWV0aG9kc1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5nZXRWaXNpYmxlUmFuZ2UgPSAoKSA9PlxuICAgICAgdmlld3BvcnRTdGF0ZT8udmlzaWJsZVJhbmdlIHx8XG4gICAgICBjYWxjdWxhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZT8uc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG5cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnNjcm9sbFwiLCAoZGF0YTogYW55KSA9PlxuICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKGRhdGEucG9zaXRpb24pLFxuICAgICk7XG5cbiAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0Oml0ZW1zLWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKGRhdGEudG90YWxJdGVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUoZGF0YS50b3RhbEl0ZW1zKTtcbiAgICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGU/LnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTGlzdGVuIGZvciB0b3RhbCBpdGVtcyBjaGFuZ2VzIChpbXBvcnRhbnQgZm9yIGN1cnNvciBwYWdpbmF0aW9uKVxuICAgIC8vIE5vdGU6IHNldFRvdGFsSXRlbXMoKSB1cGRhdGVzIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyBCRUZPUkUgZW1pdHRpbmcgdGhpcyBldmVudCxcbiAgICAvLyBzbyB3ZSBjYW4ndCByZWx5IG9uIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyB0byBkZXRlY3QgdGhlIGZpcnN0IHRvdGFsLlxuICAgIC8vIEluc3RlYWQgd2UgdXNlIHRoZSBoYXNSZWNhbGN1bGF0ZWRTY3JvbGxGb3JDb21wcmVzc2lvbiBmbGFnLlxuICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICBpZiAoZGF0YS50b3RhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAgIC8vIEZJWDogV2hlbiB3ZSBmaXJzdCByZWNlaXZlIHRvdGFsSXRlbXMgd2l0aCBpbml0aWFsU2Nyb2xsSW5kZXggYW5kIGNvbXByZXNzaW9uLFxuICAgICAgLy8gcmVjYWxjdWxhdGUgc2Nyb2xsIHBvc2l0aW9uIHRvIGFjY291bnQgZm9yIGNvbXByZXNzaW9uLlxuICAgICAgLy8gV2l0aG91dCB0aGlzLCBpbml0aWFsU2Nyb2xsSW5kZXggY2FsY3VsYXRlcyBwb3NpdGlvbiBhcyBpbmRleCAqIGl0ZW1TaXplLFxuICAgICAgLy8gYnV0IHJlbmRlcmluZyB1c2VzIGNvbXByZXNzZWQgc3BhY2UsIGNhdXNpbmcgaXRlbXMgdG8gYXBwZWFyIG9mZi1zY3JlZW4uXG4gICAgICAvL1xuICAgICAgLy8gV2UgY2hlY2sgdGhpcyBCRUZPUkUgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSBiZWNhdXNlIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGVcbiAgICAgIC8vIHNjcm9sbCBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgbmV3IHRvdGFsLCBhbmQgdGhlIGZsYWcgZW5zdXJlcyB3ZSBvbmx5IGRvIHRoaXMgb25jZS5cbiAgICAgIGlmIChcbiAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4ID4gMCAmJlxuICAgICAgICAhaGFzUmVjYWxjdWxhdGVkU2Nyb2xsRm9yQ29tcHJlc3Npb24gJiZcbiAgICAgICAgZGF0YS50b3RhbCA+IDBcbiAgICAgICkge1xuICAgICAgICBjb25zdCBhY3R1YWxUb3RhbFNpemUgPSBkYXRhLnRvdGFsICogdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZTtcbiAgICAgICAgY29uc3QgaXNDb21wcmVzc2VkID0gYWN0dWFsVG90YWxTaXplID4gTUFYX1ZJUlRVQUxfU0laRTtcblxuICAgICAgICBpZiAoaXNDb21wcmVzc2VkKSB7XG4gICAgICAgICAgLy8gUmVjYWxjdWxhdGUgc2Nyb2xsIHBvc2l0aW9uIHVzaW5nIGNvbXByZXNzaW9uLWF3YXJlIGZvcm11bGFcbiAgICAgICAgICAvLyBTYW1lIGZvcm11bGEgdXNlZCBpbiBzY3JvbGxUb0luZGV4XG4gICAgICAgICAgY29uc3QgcmF0aW8gPSBpbml0aWFsU2Nyb2xsSW5kZXggLyBkYXRhLnRvdGFsO1xuICAgICAgICAgIGNvbnN0IGNvbXByZXNzZWRQb3NpdGlvbiA9IHJhdGlvICogTUFYX1ZJUlRVQUxfU0laRTtcblxuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPSBjb21wcmVzc2VkUG9zaXRpb247XG5cbiAgICAgICAgICAvLyBOb3RpZnkgc2Nyb2xsaW5nIGZlYXR1cmUgdG8gc3luYyBpdHMgbG9jYWwgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnNjcm9sbC1wb3NpdGlvbi1zeW5jXCIsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBjb21wcmVzc2VkUG9zaXRpb24sXG4gICAgICAgICAgICBzb3VyY2U6IFwiY29tcHJlc3Npb24tcmVjYWxjdWxhdGlvblwiLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgdGFyZ2V0U2Nyb2xsSW5kZXggc2luY2Ugd2UndmUgbm93IGNvcnJlY3RseSBjYWxjdWxhdGVkIHRoZSBzY3JvbGwgcG9zaXRpb25cbiAgICAgICAgICAvLyBUaGUgbm9ybWFsIGNvbXByZXNzZWQgc2Nyb2xsaW5nIGZvcm11bGEgd2lsbCBub3cgd29yayBjb3JyZWN0bHlcbiAgICAgICAgICBkZWxldGUgKHZpZXdwb3J0U3RhdGUgYXMgYW55KS50YXJnZXRTY3JvbGxJbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hcmsgYXMgZG9uZSBldmVuIGlmIG5vdCBjb21wcmVzc2VkIC0gd2Ugb25seSB3YW50IHRvIGRvIHRoaXMgY2hlY2sgb25jZVxuICAgICAgICBoYXNSZWNhbGN1bGF0ZWRTY3JvbGxGb3JDb21wcmVzc2lvbiA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUoZGF0YS50b3RhbCk7XG4gICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZT8uc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG5cbiAgICAgIC8vIFRyaWdnZXIgYSByZW5kZXIgdG8gdXBkYXRlIHRoZSB2aWV3XG4gICAgICBjb21wb25lbnQudmlld3BvcnQ/LnJlbmRlckl0ZW1zPy4oKTtcbiAgICB9KTtcblxuICAgIC8vIExpc3RlbiBmb3IgY29udGFpbmVyIHNpemUgY2hhbmdlcyB0byByZWNhbGN1bGF0ZSB2aXJ0dWFsIHNpemVcbiAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OmNvbnRhaW5lci1zaXplLWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUgJiYgZGF0YS5jb250YWluZXJTaXplICE9PSB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUpIHtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplID0gZGF0YS5jb250YWluZXJTaXplO1xuICAgICAgICAvLyBSZWNhbGN1bGF0ZSB2aXJ0dWFsIHNpemUgd2l0aCBuZXcgY29udGFpbmVyIHNpemVcbiAgICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSh2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMpO1xuICAgICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiB8fCAwKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjpyYW5nZS1sb2FkZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBkYXRhLnRvdGFsICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgZGF0YS50b3RhbCAhPT0gdmlld3BvcnRTdGF0ZT8udG90YWxJdGVtc1xuICAgICAgKSB7XG4gICAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUoZGF0YS50b3RhbCk7XG4gICAgICB9XG4gICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZT8uc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG4gICAgICBjb21wb25lbnQudmlld3BvcnQ/LnJlbmRlckl0ZW1zPy4oKTtcbiAgICB9KTtcblxuICAgIC8vIExpc3RlbiBmb3IgZmlyc3QgaXRlbXMgcmVuZGVyZWQgdG8gY2FsY3VsYXRlIGl0ZW0gc2l6ZSAoaWYgYXV0by1kZXRlY3Rpb24gaXMgZW5hYmxlZClcbiAgICBpZiAoYXV0b0RldGVjdEl0ZW1TaXplKSB7XG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0Oml0ZW1zLXJlbmRlcmVkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFoYXNDYWxjdWxhdGVkSXRlbVNpemUgJiZcbiAgICAgICAgICBkYXRhLmVsZW1lbnRzPy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgdmlld3BvcnRTdGF0ZVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBDYWxjdWxhdGUgYXZlcmFnZSBpdGVtIHNpemUgZnJvbSBmaXJzdCByZW5kZXJlZCBiYXRjaFxuICAgICAgICAgIGNvbnN0IHNpemVzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IHNpemVQcm9wZXJ0eSA9XG4gICAgICAgICAgICBvcmllbnRhdGlvbiA9PT0gXCJob3Jpem9udGFsXCIgPyBcIm9mZnNldFdpZHRoXCIgOiBcIm9mZnNldEhlaWdodFwiO1xuXG4gICAgICAgICAgZGF0YS5lbGVtZW50cy5mb3JFYWNoKChlbGVtZW50OiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IGVsZW1lbnRbc2l6ZVByb3BlcnR5XTtcbiAgICAgICAgICAgIGlmIChzaXplID4gMCkge1xuICAgICAgICAgICAgICBzaXplcy5wdXNoKHNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHNpemVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGF2Z1NpemUgPSBNYXRoLnJvdW5kKFxuICAgICAgICAgICAgICBzaXplcy5yZWR1Y2UoKHN1bSwgc2l6ZSkgPT4gc3VtICsgc2l6ZSwgMCkgLyBzaXplcy5sZW5ndGgsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNJdGVtU2l6ZSA9IHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG4gICAgICAgICAgICB2aWV3cG9ydFN0YXRlLml0ZW1TaXplID0gYXZnU2l6ZTtcblxuICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBpbml0aWFsU2Nyb2xsSW5kZXgsIHJlY2FsY3VsYXRlIHNjcm9sbCBwb3NpdGlvblxuICAgICAgICAgICAgLy8gYmFzZWQgb24gdGhlIG5ld2x5IGRldGVjdGVkIGl0ZW0gc2l6ZVxuICAgICAgICAgICAgaWYgKGluaXRpYWxTY3JvbGxJbmRleCA+IDAgJiYgYXZnU2l6ZSAhPT0gcHJldmlvdXNJdGVtU2l6ZSkge1xuICAgICAgICAgICAgICBjb25zdCBuZXdTY3JvbGxQb3NpdGlvbiA9IGluaXRpYWxTY3JvbGxJbmRleCAqIGF2Z1NpemU7XG4gICAgICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPSBuZXdTY3JvbGxQb3NpdGlvbjtcblxuICAgICAgICAgICAgICAvLyBOb3RpZnkgc2Nyb2xsaW5nIGZlYXR1cmUgdG8gc3luYyBpdHMgbG9jYWwgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpzY3JvbGwtcG9zaXRpb24tc3luY1wiLCB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IG5ld1Njcm9sbFBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogXCJpdGVtLXNpemUtZGV0ZWN0ZWRcIixcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlY2FsY3VsYXRlIGV2ZXJ5dGhpbmcgd2l0aCBuZXcgc2l6ZVxuICAgICAgICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSh2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMpO1xuICAgICAgICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG5cbiAgICAgICAgICAgIC8vIFJlLXJlbmRlciB0byBhZGp1c3QgcG9zaXRpb25zXG4gICAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQ/LnJlbmRlckl0ZW1zPy4oKTtcblxuICAgICAgICAgICAgLy8gRW1pdCBldmVudCBmb3Igc2l6ZSBjaGFuZ2VcbiAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDppdGVtLXNpemUtZGV0ZWN0ZWRcIiwge1xuICAgICAgICAgICAgICBwcmV2aW91c1NpemU6IGluaXRpYWxJdGVtU2l6ZSxcbiAgICAgICAgICAgICAgZGV0ZWN0ZWRTaXplOiBhdmdTaXplLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGhhc0NhbGN1bGF0ZWRJdGVtU2l6ZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBFeHBvc2UgdmlydHVhbCBBUElcbiAgICBjb25zdCBjb21wcmVzc2lvblJhdGlvID0gZ2V0Q29tcHJlc3Npb25SYXRpbygpO1xuICAgIChjb21wb25lbnQgYXMgYW55KS52aXJ0dWFsID0ge1xuICAgICAgY2FsY3VsYXRlVmlzaWJsZVJhbmdlLFxuICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSxcbiAgICAgIGdldFRvdGFsVmlydHVhbFNpemU6ICgpID0+IHZpZXdwb3J0U3RhdGU/LnZpcnR1YWxUb3RhbFNpemUgfHwgMCxcbiAgICAgIGdldENvbnRhaW5lclNpemU6ICgpID0+IHZpZXdwb3J0U3RhdGU/LmNvbnRhaW5lclNpemUgfHwgMCxcbiAgICAgIHVwZGF0ZUNvbnRhaW5lclNpemU6IChzaXplOiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUgPSBzaXplO1xuICAgICAgICAgIHVwZGF0ZVZpc2libGVSYW5nZSh2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZ2V0SXRlbVNpemU6ICgpID0+IHZpZXdwb3J0U3RhdGU/Lml0ZW1TaXplIHx8IGluaXRpYWxJdGVtU2l6ZSxcbiAgICAgIGNhbGN1bGF0ZUluZGV4RnJvbVBvc2l0aW9uOiAocG9zaXRpb246IG51bWJlcikgPT5cbiAgICAgICAgTWF0aC5mbG9vcihcbiAgICAgICAgICBwb3NpdGlvbiAvXG4gICAgICAgICAgICAoKHZpZXdwb3J0U3RhdGU/Lml0ZW1TaXplIHx8IGluaXRpYWxJdGVtU2l6ZSkgKiBjb21wcmVzc2lvblJhdGlvKSxcbiAgICAgICAgKSxcbiAgICAgIGNhbGN1bGF0ZVBvc2l0aW9uRm9ySW5kZXg6IChpbmRleDogbnVtYmVyKSA9PlxuICAgICAgICBpbmRleCAqICh2aWV3cG9ydFN0YXRlPy5pdGVtU2l6ZSB8fCBpbml0aWFsSXRlbVNpemUpICogY29tcHJlc3Npb25SYXRpbyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8qKlxuICogU2Nyb2xsaW5nIEZlYXR1cmUgLSBWaXJ0dWFsIHNjcm9sbGluZyB3aXRoIGludGVncmF0ZWQgdmVsb2NpdHkgdHJhY2tpbmdcbiAqIEhhbmRsZXMgd2hlZWwgZXZlbnRzLCB0b3VjaC9tb3VzZSBldmVudHMsIHNjcm9sbCBwb3NpdGlvbiBtYW5hZ2VtZW50LCB2ZWxvY2l0eSBtZWFzdXJlbWVudCwgYW5kIG1vbWVudHVtIHNjcm9sbGluZ1xuICovXG5cbmltcG9ydCB0eXBlIHsgVmlld3BvcnRDb250ZXh0LCBWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgd3JhcEluaXRpYWxpemUsIGdldFZpZXdwb3J0U3RhdGUsIGNsYW1wIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTY3JvbGxpbmdDb25maWcge1xuICBvcmllbnRhdGlvbj86IFwidmVydGljYWxcIiB8IFwiaG9yaXpvbnRhbFwiO1xuICBzZW5zaXRpdml0eT86IG51bWJlcjtcbiAgc21vb3RoaW5nPzogYm9vbGVhbjtcbiAgaWRsZVRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKiBTdG9wIHNjcm9sbGluZyB3aGVuIGNsaWNraW5nIG9uIHRoZSB2aWV3cG9ydCAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgc3RvcE9uQ2xpY2s/OiBib29sZWFuO1xufVxuXG4vLyBTcGVlZCB0cmFja2VyIGludGVyZmFjZVxuaW50ZXJmYWNlIFNwZWVkVHJhY2tlciB7XG4gIHZlbG9jaXR5OiBudW1iZXI7XG4gIGxhc3RQb3NpdGlvbjogbnVtYmVyO1xuICBsYXN0VGltZTogbnVtYmVyO1xuICBkaXJlY3Rpb246IFwiZm9yd2FyZFwiIHwgXCJiYWNrd2FyZFwiO1xuICBzYW1wbGVzOiBBcnJheTx7IHBvc2l0aW9uOiBudW1iZXI7IHRpbWU6IG51bWJlciB9Pjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHNwZWVkIHRyYWNrZXJcbiAqL1xuY29uc3QgY3JlYXRlU3BlZWRUcmFja2VyID0gKCk6IFNwZWVkVHJhY2tlciA9PiAoe1xuICB2ZWxvY2l0eTogMCxcbiAgbGFzdFBvc2l0aW9uOiAwLFxuICBsYXN0VGltZTogRGF0ZS5ub3coKSxcbiAgZGlyZWN0aW9uOiBcImZvcndhcmRcIixcbiAgc2FtcGxlczogW10sXG59KTtcblxuLyoqXG4gKiBVcGRhdGVzIHNwZWVkIHRyYWNrZXIgd2l0aCBuZXcgcG9zaXRpb25cbiAqL1xuY29uc3QgdXBkYXRlU3BlZWRUcmFja2VyID0gKFxuICB0cmFja2VyOiBTcGVlZFRyYWNrZXIsXG4gIG5ld1Bvc2l0aW9uOiBudW1iZXIsXG4gIHByZXZpb3VzUG9zaXRpb246IG51bWJlcixcbik6IFNwZWVkVHJhY2tlciA9PiB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IHRpbWVEZWx0YSA9IG5vdyAtIHRyYWNrZXIubGFzdFRpbWU7XG5cbiAgaWYgKHRpbWVEZWx0YSA9PT0gMCkgcmV0dXJuIHRyYWNrZXI7XG5cbiAgY29uc3QgcG9zaXRpb25EZWx0YSA9IG5ld1Bvc2l0aW9uIC0gcHJldmlvdXNQb3NpdGlvbjtcbiAgLy8gS2VlcCB2ZWxvY2l0eSBzaWduZWQgKHBvc2l0aXZlID0gZm9yd2FyZC9kb3duLCBuZWdhdGl2ZSA9IGJhY2t3YXJkL3VwKVxuICBjb25zdCBpbnN0YW50VmVsb2NpdHkgPSBwb3NpdGlvbkRlbHRhIC8gdGltZURlbHRhO1xuXG4gIC8vIEFkZCBuZXcgc2FtcGxlXG4gIGNvbnN0IHNhbXBsZXMgPSBbLi4udHJhY2tlci5zYW1wbGVzLCB7IHBvc2l0aW9uOiBuZXdQb3NpdGlvbiwgdGltZTogbm93IH1dO1xuXG4gIC8vIEtlZXAgb25seSByZWNlbnQgc2FtcGxlcyAobGFzdCAxMDBtcylcbiAgY29uc3QgcmVjZW50U2FtcGxlcyA9IHNhbXBsZXMuZmlsdGVyKChzKSA9PiBub3cgLSBzLnRpbWUgPCAxMDApO1xuXG4gIC8vIENhbGN1bGF0ZSBhdmVyYWdlIHZlbG9jaXR5IGZyb20gcmVjZW50IHNhbXBsZXMgKHByZXNlcnZpbmcgc2lnbi9kaXJlY3Rpb24pXG4gIGxldCBhdmdWZWxvY2l0eSA9IGluc3RhbnRWZWxvY2l0eTtcbiAgaWYgKHJlY2VudFNhbXBsZXMubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IG9sZGVzdFNhbXBsZSA9IHJlY2VudFNhbXBsZXNbMF07XG4gICAgY29uc3QgdG90YWxEaXN0YW5jZSA9IG5ld1Bvc2l0aW9uIC0gb2xkZXN0U2FtcGxlLnBvc2l0aW9uOyAvLyBTaWduZWQgZGlzdGFuY2VcbiAgICBjb25zdCB0b3RhbFRpbWUgPSBub3cgLSBvbGRlc3RTYW1wbGUudGltZTtcbiAgICBhdmdWZWxvY2l0eSA9IHRvdGFsVGltZSA+IDAgPyB0b3RhbERpc3RhbmNlIC8gdG90YWxUaW1lIDogaW5zdGFudFZlbG9jaXR5O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB2ZWxvY2l0eTogYXZnVmVsb2NpdHksXG4gICAgbGFzdFBvc2l0aW9uOiBuZXdQb3NpdGlvbixcbiAgICBsYXN0VGltZTogbm93LFxuICAgIGRpcmVjdGlvbjogcG9zaXRpb25EZWx0YSA+PSAwID8gXCJmb3J3YXJkXCIgOiBcImJhY2t3YXJkXCIsXG4gICAgc2FtcGxlczogcmVjZW50U2FtcGxlcyxcbiAgfTtcbn07XG5cbi8qKlxuICogU2Nyb2xsaW5nIGZlYXR1cmUgZm9yIHZpZXdwb3J0XG4gKiBIYW5kbGVzIHdoZWVsIGV2ZW50cywgdmVsb2NpdHkgdHJhY2tpbmcsIGFuZCBpZGxlIGRldGVjdGlvblxuICovXG5leHBvcnQgY29uc3Qgd2l0aFNjcm9sbGluZyA9IChjb25maWc6IFNjcm9sbGluZ0NvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50Pihjb21wb25lbnQ6IFQpOiBUID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBvcmllbnRhdGlvbiA9IFwidmVydGljYWxcIixcbiAgICAgIHNlbnNpdGl2aXR5ID0gVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLlNDUk9MTF9TRU5TSVRJVklUWSxcbiAgICAgIHNtb290aGluZyA9IGZhbHNlLFxuICAgICAgaWRsZVRpbWVvdXQgPSAxMDAsIC8vIERlZmF1bHQgaWRsZSB0aW1lb3V0IGluIG1zXG4gICAgICBzdG9wT25DbGljayA9IHRydWUsIC8vIFN0b3Agc2Nyb2xsaW5nIG9uIGNsaWNrIGJ5IGRlZmF1bHRcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gU3RhdGVcbiAgICBsZXQgc2Nyb2xsUG9zaXRpb24gPSAwO1xuICAgIGxldCB0b3RhbFZpcnR1YWxTaXplID0gMDtcbiAgICBsZXQgY29udGFpbmVyU2l6ZSA9IDA7XG4gICAgbGV0IGlzU2Nyb2xsaW5nID0gZmFsc2U7XG4gICAgbGV0IGlzU2Nyb2xsZWRGcm9tVG9wID0gZmFsc2U7IC8vIFRyYWNrIGlmIHNjcm9sbGVkIGF3YXkgZnJvbSB0b3BcbiAgICBsZXQgbGFzdFNjcm9sbFRpbWUgPSAwO1xuICAgIGxldCBzcGVlZFRyYWNrZXIgPSBjcmVhdGVTcGVlZFRyYWNrZXIoKTtcbiAgICBsZXQgaWRsZVRpbWVvdXRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGlkbGVDaGVja0ZyYW1lOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgbGFzdElkbGVDaGVja1Bvc2l0aW9uID0gMDtcbiAgICBsZXQgaGFzRW1pdHRlZElkbGUgPSBmYWxzZTsgLy8gVHJhY2sgaWYgd2UndmUgYWxyZWFkeSBlbWl0dGVkIGlkbGVcbiAgICBsZXQgYW5jaG9yUG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsOyAvLyBBbmNob3IgcG9zaXRpb24gdG8gbWFpbnRhaW4gb24gY2xpY2sgKGZvciBzdG9wT25DbGljaylcbiAgICBsZXQgYW5jaG9yVGltZSA9IDA7IC8vIFRpbWVzdGFtcCB3aGVuIGFuY2hvciB3YXMgc2V0XG4gICAgbGV0IGxhc3RXaGVlbFRpbWUgPSAwOyAvLyBUaW1lc3RhbXAgb2YgbGFzdCB3aGVlbCBldmVudCAoZm9yIGRldGVjdGluZyBnYXBzKVxuICAgIGxldCBhbmNob3JJbml0aWFsRGVsdGEgPSAwOyAvLyBJbml0aWFsIHdoZWVsIGRlbHRhIHdoZW4gYW5jaG9yIHdhcyBzZXQgKHRvIGRldGVjdCBkZWNheSlcbiAgICBsZXQgYW5jaG9yTGFzdERlbHRhID0gMDsgLy8gUHJldmlvdXMgd2hlZWwgZGVsdGEgKHRvIGRldGVjdCBpbmNyZWFzaW5nIGRlbHRhID0gbmV3IHNjcm9sbClcbiAgICBsZXQgYW5jaG9yTWluRGVsdGEgPSBJbmZpbml0eTsgLy8gTWluaW11bSBkZWx0YSBzZWVuIHNpbmNlIGFuY2hvciAodG8gZGV0ZWN0IHJlYWNjZWxlcmF0aW9uKVxuICAgIGxldCBjb25zZWN1dGl2ZUluY3JlYXNlcyA9IDA7IC8vIENvdW50IG9mIGNvbnNlY3V0aXZlIGRlbHRhIGluY3JlYXNlcyAodG8gZGV0ZWN0IHN1c3RhaW5lZCBuZXcgc2Nyb2xsaW5nKVxuICAgIGxldCBzdXN0YWluZWRIaWdoQ291bnQgPSAwOyAvLyBDb3VudCBvZiBldmVudHMgd2hlcmUgZGVsdGEgaXMgc2lnbmlmaWNhbnRseSBhYm92ZSBtaW5pbXVtIChzdXN0YWluZWQgbmV3IHNjcm9sbGluZylcblxuICAgIC8vIGNvbnNvbGUubG9nKGBbU2Nyb2xsaW5nXSBJbml0aWFsIHN0YXRlIC0gcG9zaXRpb246ICR7c2Nyb2xsUG9zaXRpb259YCk7XG5cbiAgICAvLyBUaHJlc2hvbGQgZm9yIGNvbnNpZGVyaW5nIHRoZSBsaXN0IFwic2Nyb2xsZWRcIiAoaW4gcGl4ZWxzKVxuICAgIGNvbnN0IFNDUk9MTEVEX1RIUkVTSE9MRCA9IDE7XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBzY3JvbGxlZCBzdGF0ZSBjbGFzcyBvbiB0aGUgdmxpc3QgY29udGFpbmVyXG4gICAgICogQWRkcyAtLXNjcm9sbGVkIG1vZGlmaWVyIHdoZW4gbGlzdCBpcyBub3QgYXQgdGhlIHRvcFxuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZVNjcm9sbGVkU3RhdGUgPSAoXG4gICAgICB2aWV3cG9ydEVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgICAgcG9zaXRpb246IG51bWJlcixcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHNob3VsZEJlU2Nyb2xsZWQgPSBwb3NpdGlvbiA+IFNDUk9MTEVEX1RIUkVTSE9MRDtcbiAgICAgIGlmIChzaG91bGRCZVNjcm9sbGVkICE9PSBpc1Njcm9sbGVkRnJvbVRvcCkge1xuICAgICAgICBpc1Njcm9sbGVkRnJvbVRvcCA9IHNob3VsZEJlU2Nyb2xsZWQ7XG4gICAgICAgIC8vIEZpbmQgdGhlIHZsaXN0IGNvbnRhaW5lciAocGFyZW50IG9mIHZpZXdwb3J0KVxuICAgICAgICBjb25zdCB2bGlzdENvbnRhaW5lciA9IHZpZXdwb3J0RWxlbWVudC5jbG9zZXN0KFwiLm10cmwtdmxpc3RcIik7XG4gICAgICAgIGlmICh2bGlzdENvbnRhaW5lcikge1xuICAgICAgICAgIHZsaXN0Q29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUoXG4gICAgICAgICAgICBcIm10cmwtdmxpc3QtLXNjcm9sbGVkXCIsXG4gICAgICAgICAgICBzaG91bGRCZVNjcm9sbGVkLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gR2V0IHZpZXdwb3J0IHN0YXRlXG4gICAgbGV0IHZpZXdwb3J0U3RhdGU6IGFueTtcblxuICAgIC8vIFVzZSBzaGFyZWQgaW5pdGlhbGl6YXRpb24gd3JhcHBlclxuICAgIHdyYXBJbml0aWFsaXplKGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgdmlld3BvcnRTdGF0ZSA9IGdldFZpZXdwb3J0U3RhdGUoY29tcG9uZW50KTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBzdGF0ZSB2YWx1ZXNcbiAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgIHRvdGFsVmlydHVhbFNpemUgPSB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemUgfHwgMDtcbiAgICAgICAgY29udGFpbmVyU2l6ZSA9IHZpZXdwb3J0U3RhdGUuY29udGFpbmVyU2l6ZSB8fCAwO1xuICAgICAgICAvLyBTeW5jIHNjcm9sbFBvc2l0aW9uIGZyb20gdmlld3BvcnRTdGF0ZSAoaW1wb3J0YW50IGZvciBpbml0aWFsU2Nyb2xsSW5kZXgpXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID4gMCkge1xuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uID0gdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBMaXN0ZW4gZm9yIHZpcnR1YWwgc2l6ZSBjaGFuZ2VzXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnZpcnR1YWwtc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJbU2Nyb2xsaW5nXSBWaXJ0dWFsIHNpemUgY2hhbmdlZDpcIiwgZGF0YSk7XG4gICAgICAgIHVwZGF0ZVNjcm9sbEJvdW5kcyhkYXRhLnRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3Igc2Nyb2xsIHBvc2l0aW9uIGNoYW5nZXMgZnJvbSBvdGhlciBmZWF0dXJlcyAoZS5nLiwgdmlydHVhbC50cyBhZnRlciBpdGVtIHNpemUgZGV0ZWN0aW9uKVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpzY3JvbGwtcG9zaXRpb24tc3luY1wiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChkYXRhLnBvc2l0aW9uICE9PSB1bmRlZmluZWQgJiYgZGF0YS5wb3NpdGlvbiAhPT0gc2Nyb2xsUG9zaXRpb24pIHtcbiAgICAgICAgICBzY3JvbGxQb3NpdGlvbiA9IGRhdGEucG9zaXRpb247XG4gICAgICAgICAgLy8gQWxzbyB1cGRhdGUgbG9jYWwgdHJhY2tpbmcgdmFyc1xuICAgICAgICAgIHRvdGFsVmlydHVhbFNpemUgPVxuICAgICAgICAgICAgdmlld3BvcnRTdGF0ZT8udmlydHVhbFRvdGFsU2l6ZSB8fCB0b3RhbFZpcnR1YWxTaXplO1xuICAgICAgICAgIGNvbnRhaW5lclNpemUgPSB2aWV3cG9ydFN0YXRlPy5jb250YWluZXJTaXplIHx8IGNvbnRhaW5lclNpemU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGNvbnRhaW5lciBzaXplIGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6Y29udGFpbmVyLXNpemUtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChkYXRhLmNvbnRhaW5lclNpemUpIHtcbiAgICAgICAgICBjb250YWluZXJTaXplID0gZGF0YS5jb250YWluZXJTaXplO1xuICAgICAgICAgIHVwZGF0ZVNjcm9sbEJvdW5kcyh0b3RhbFZpcnR1YWxTaXplLCBjb250YWluZXJTaXplKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEF0dGFjaCB3aGVlbCBldmVudCBsaXN0ZW5lciB0byB2aWV3cG9ydCBlbGVtZW50XG4gICAgICBjb25zdCB2aWV3cG9ydEVsZW1lbnQgPVxuICAgICAgICB2aWV3cG9ydFN0YXRlPy52aWV3cG9ydEVsZW1lbnQgfHwgKGNvbXBvbmVudCBhcyBhbnkpLnZpZXdwb3J0RWxlbWVudDtcbiAgICAgIGlmICh2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtTY3JvbGxpbmddIEF0dGFjaGluZyB3aGVlbCBldmVudCB0byB2aWV3cG9ydCBlbGVtZW50YCk7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwid2hlZWxcIiwgaGFuZGxlV2hlZWwsIHtcbiAgICAgICAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBzY3JvbGxlZCBzdGF0ZSBiYXNlZCBvbiBjdXJyZW50IHNjcm9sbCBwb3NpdGlvblxuICAgICAgICB1cGRhdGVTY3JvbGxlZFN0YXRlKHZpZXdwb3J0RWxlbWVudCwgc2Nyb2xsUG9zaXRpb24pO1xuXG4gICAgICAgIC8vIEFkZCBtb3VzZWRvd24gbGlzdGVuZXIgdG8gc3RvcCBzY3JvbGxpbmcgb24gY2xpY2tcbiAgICAgICAgaWYgKHN0b3BPbkNsaWNrKSB7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgaGFuZGxlTW91c2VEb3duKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0b3JlIHJlZmVyZW5jZSBmb3IgY2xlYW51cFxuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuX3Njcm9sbGluZ1ZpZXdwb3J0RWxlbWVudCA9IHZpZXdwb3J0RWxlbWVudDtcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLl9zY3JvbGxpbmdTdG9wT25DbGljayA9IHN0b3BPbkNsaWNrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbU2Nyb2xsaW5nXSBObyB2aWV3cG9ydCBlbGVtZW50IGZvdW5kIGZvciB3aGVlbCBldmVudHNgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFVzZSBjbGFtcCBmcm9tIHV0aWxzXG5cbiAgICAvLyBTdGFydCBpZGxlIGRldGVjdGlvblxuICAgIGNvbnN0IHN0YXJ0SWRsZURldGVjdGlvbiA9ICgpID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1Njcm9sbGluZ10gU3RhcnRpbmcgaWRsZSBkZXRlY3Rpb25cIik7XG5cbiAgICAgIC8vIFN0b3AgYW55IGV4aXN0aW5nIGlkbGUgZGV0ZWN0aW9uIGZpcnN0XG4gICAgICBpZiAoaWRsZUNoZWNrRnJhbWUgIT09IG51bGwpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWRsZUNoZWNrRnJhbWUpO1xuICAgICAgICBpZGxlQ2hlY2tGcmFtZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGhhc0VtaXR0ZWRJZGxlID0gZmFsc2U7IC8vIFJlc2V0IGlkbGUgZW1pc3Npb24gZmxhZ1xuICAgICAgY29uc3QgY2hlY2tJZGxlID0gKCkgPT4ge1xuICAgICAgICBpZiAoc2Nyb2xsUG9zaXRpb24gPT09IGxhc3RJZGxlQ2hlY2tQb3NpdGlvbikge1xuICAgICAgICAgIC8vIFBvc2l0aW9uIGhhc24ndCBjaGFuZ2VkIC0gd2UncmUgaWRsZVxuICAgICAgICAgIGlmICghaGFzRW1pdHRlZElkbGUgJiYgKHNwZWVkVHJhY2tlci52ZWxvY2l0eSA+IDAgfHwgaXNTY3JvbGxpbmcpKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgXCJbU2Nyb2xsaW5nXSBJZGxlIGRldGVjdGVkIC0gcG9zaXRpb24gc3RhYmxlLCBzZXR0aW5nIHZlbG9jaXR5IHRvIHplcm9cIlxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgIGhhc0VtaXR0ZWRJZGxlID0gdHJ1ZTsgLy8gTWFyayB0aGF0IHdlJ3ZlIGVtaXR0ZWQgaWRsZVxuICAgICAgICAgICAgc2V0VmVsb2NpdHlUb1plcm8oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUG9zaXRpb24gY2hhbmdlZCwgcmVzZXQgdGhlIGZsYWdcbiAgICAgICAgICBoYXNFbWl0dGVkSWRsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RJZGxlQ2hlY2tQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgICBpZGxlQ2hlY2tGcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShjaGVja0lkbGUpO1xuICAgICAgfTtcbiAgICAgIGlkbGVDaGVja0ZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNoZWNrSWRsZSk7XG4gICAgfTtcblxuICAgIC8vIFN0b3AgaWRsZSBkZXRlY3Rpb25cbiAgICBjb25zdCBzdG9wSWRsZURldGVjdGlvbiA9ICgpID0+IHtcbiAgICAgIGlmIChpZGxlQ2hlY2tGcmFtZSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltTY3JvbGxpbmddIFN0b3BwaW5nIGlkbGUgZGV0ZWN0aW9uXCIpO1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShpZGxlQ2hlY2tGcmFtZSk7XG4gICAgICAgIGlkbGVDaGVja0ZyYW1lID0gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gU2V0IHZlbG9jaXR5IHRvIHplcm8gYW5kIGVtaXQgaWRsZSBldmVudFxuICAgIGNvbnN0IHNldFZlbG9jaXR5VG9aZXJvID0gKCkgPT4ge1xuICAgICAgLy8gU3RvcCBpZGxlIGRldGVjdGlvbiBzaW5jZSB3ZSdyZSBub3cgaWRsZVxuICAgICAgc3RvcElkbGVEZXRlY3Rpb24oKTtcblxuICAgICAgc3BlZWRUcmFja2VyID0gY3JlYXRlU3BlZWRUcmFja2VyKCk7XG4gICAgICBpc1Njcm9sbGluZyA9IGZhbHNlOyAvLyBSZXNldCBzY3JvbGxpbmcgc3RhdGVcblxuICAgICAgLy8gRW1pdCB2ZWxvY2l0eSBjaGFuZ2VcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDp2ZWxvY2l0eS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgdmVsb2NpdHk6IDAsXG4gICAgICAgIGRpcmVjdGlvbjogc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgIH0pO1xuXG4gICAgICAvLyBFbWl0IGlkbGUgc3RhdGVcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDppZGxlXCIsIHtcbiAgICAgICAgcG9zaXRpb246IHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICBsYXN0U2Nyb2xsVGltZSxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gVXBkYXRlIGNvbnRhaW5lciBwb3NpdGlvblxuICAgIGNvbnN0IHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uID0gKCkgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlIHx8ICF2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyKSByZXR1cm47XG5cbiAgICAgIC8vIEl0ZW1zIGNvbnRhaW5lciBkb2Vzbid0IG1vdmUgLSBpdGVtcyBpbnNpZGUgaXQgYXJlIHBvc2l0aW9uZWRcbiAgICAgIC8vIFRoaXMgaXMgaGFuZGxlZCBieSB0aGUgcmVuZGVyaW5nIGZlYXR1cmVcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIG1vdXNlZG93biB0byBzdG9wIHNjcm9sbGluZyBvbiBjbGlja1xuICAgIGNvbnN0IGhhbmRsZU1vdXNlRG93biA9IChfZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgLy8gQW5jaG9yIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbiAtIGFueSB3aGVlbCBldmVudHMgd2lsbCBiZSBmb3JjZWQgYmFjayB0byB0aGlzIHBvc2l0aW9uXG4gICAgICAvLyBUaGlzIGVsZWdhbnRseSBoYW5kbGVzIG1vdXNlIHdoZWVscyB3aXRoIHBoeXNpY2FsIGluZXJ0aWEgKGxpa2UgTG9naXRlY2ggZnJlZS1zcGluKVxuICAgICAgYW5jaG9yUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgIGFuY2hvclRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgYW5jaG9ySW5pdGlhbERlbHRhID0gMDsgLy8gV2lsbCBiZSBzZXQgYnkgZmlyc3Qgd2hlZWwgZXZlbnRcbiAgICAgIGFuY2hvckxhc3REZWx0YSA9IDA7XG4gICAgICBhbmNob3JNaW5EZWx0YSA9IEluZmluaXR5O1xuICAgICAgY29uc2VjdXRpdmVJbmNyZWFzZXMgPSAwO1xuICAgICAgc3VzdGFpbmVkSGlnaENvdW50ID0gMDtcblxuICAgICAgLy8gT25seSBzdG9wIGlmIHdlJ3JlIGN1cnJlbnRseSBzY3JvbGxpbmdcbiAgICAgIGlmIChpc1Njcm9sbGluZyB8fCBzcGVlZFRyYWNrZXIudmVsb2NpdHkgPiAwKSB7XG4gICAgICAgIHNldFZlbG9jaXR5VG9aZXJvKCk7XG4gICAgICB9XG4gICAgICAvLyBBbHNvIHN0b3AgbW9tZW50dW0gYW5pbWF0aW9uIGlmIGFjdGl2ZVxuICAgICAgY29uc3QgbW9tZW50dW1TdGF0ZSA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5tb21lbnR1bVN0YXRlO1xuICAgICAgaWYgKG1vbWVudHVtU3RhdGU/LnN0b3BNb21lbnR1bSkge1xuICAgICAgICBtb21lbnR1bVN0YXRlLnN0b3BNb21lbnR1bSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgd2hlZWwgZXZlbnRcbiAgICBjb25zdCBoYW5kbGVXaGVlbCA9IChldmVudDogV2hlZWxFdmVudCkgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgY29uc3QgZGVsdGEgPSBvcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiID8gZXZlbnQuZGVsdGFZIDogZXZlbnQuZGVsdGFYO1xuICAgICAgY29uc3Qgc2Nyb2xsRGVsdGEgPSBkZWx0YSAqIHNlbnNpdGl2aXR5O1xuXG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgdGltZVNpbmNlTGFzdFdoZWVsID0gbm93IC0gbGFzdFdoZWVsVGltZTtcbiAgICAgIGxhc3RXaGVlbFRpbWUgPSBub3c7XG5cbiAgICAgIC8vIElmIHdlIGhhdmUgYW4gYW5jaG9yIHBvc2l0aW9uICh1c2VyIGNsaWNrZWQgdG8gc3RvcCBzY3JvbGxpbmcpLFxuICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyBpbnRlbnRpb25hbCBuZXcgc2Nyb2xsaW5nIG9yIHJlc2lkdWFsIHdoZWVsIGluZXJ0aWFcbiAgICAgIGlmIChhbmNob3JQb3NpdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCB0aW1lU2luY2VBbmNob3IgPSBub3cgLSBhbmNob3JUaW1lO1xuICAgICAgICBjb25zdCB3aGVlbERlbHRhTWFnbml0dWRlID0gTWF0aC5hYnMoc2Nyb2xsRGVsdGEpO1xuXG4gICAgICAgIC8vIFRyYWNrIGluaXRpYWwgZGVsdGEgdG8gZGV0ZWN0IHdoZW4gaW5lcnRpYSBoYXMgZGVjYXllZFxuICAgICAgICBpZiAoYW5jaG9ySW5pdGlhbERlbHRhID09PSAwKSB7XG4gICAgICAgICAgYW5jaG9ySW5pdGlhbERlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZTtcbiAgICAgICAgICBhbmNob3JMYXN0RGVsdGEgPSB3aGVlbERlbHRhTWFnbml0dWRlO1xuICAgICAgICAgIGFuY2hvck1pbkRlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyYWNrIG1pbmltdW0gZGVsdGEgdG8gZGV0ZWN0IHJlYWNjZWxlcmF0aW9uICh1c2VyIHN0YXJ0ZWQgc2Nyb2xsaW5nIGFnYWluKVxuICAgICAgICBhbmNob3JNaW5EZWx0YSA9IE1hdGgubWluKGFuY2hvck1pbkRlbHRhLCB3aGVlbERlbHRhTWFnbml0dWRlKTtcblxuICAgICAgICAvLyBEZXRlY3QgaWYgZGVsdGEgaXMgaW5jcmVhc2luZyAodXNlciBzdGFydGVkIG5ldyBzY3JvbGwpXG4gICAgICAgIC8vIEluZXJ0aWEgb25seSBkZWNheXMsIHNvIGluY3JlYXNpbmcgZGVsdGEgPSBpbnRlbnRpb25hbCBuZXcgc2Nyb2xsaW5nXG4gICAgICAgIC8vIEJVVDogZmlsdGVyIG91dCBiYXRjaGVkIGV2ZW50cyB3aGVyZSBkZWx0YSBpcyB+MnggdGhlIGxhc3QgKGJyb3dzZXIgYmF0Y2hpbmcsIG5vdCByZWFsIGluY3JlYXNlKVxuICAgICAgICBjb25zdCBpc0JhdGNoZWRFdmVudCA9XG4gICAgICAgICAgd2hlZWxEZWx0YU1hZ25pdHVkZSA+IGFuY2hvckxhc3REZWx0YSAqIDEuOCAmJlxuICAgICAgICAgIHdoZWVsRGVsdGFNYWduaXR1ZGUgPCBhbmNob3JMYXN0RGVsdGEgKiAyLjI7XG5cbiAgICAgICAgLy8gVHJhY2sgY29uc2VjdXRpdmUgaW5jcmVhc2VzIC0gc3VzdGFpbmVkIGluY3JlYXNlcyBpbmRpY2F0ZSBuZXcgc2Nyb2xsaW5nXG4gICAgICAgIC8vIFVzZSAxJSB0aHJlc2hvbGQgdG8gY2F0Y2ggZ3JhZHVhbCBhY2NlbGVyYXRpb25cbiAgICAgICAgaWYgKCFpc0JhdGNoZWRFdmVudCAmJiB3aGVlbERlbHRhTWFnbml0dWRlID4gYW5jaG9yTGFzdERlbHRhICogMS4wMSkge1xuICAgICAgICAgIGNvbnNlY3V0aXZlSW5jcmVhc2VzKys7XG4gICAgICAgIH0gZWxzZSBpZiAod2hlZWxEZWx0YU1hZ25pdHVkZSA8IGFuY2hvckxhc3REZWx0YSAqIDAuOTkpIHtcbiAgICAgICAgICAvLyBEZWx0YSBkZWNyZWFzaW5nIC0gcmVzZXQgY291bnRlclxuICAgICAgICAgIGNvbnNlY3V0aXZlSW5jcmVhc2VzID0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBkZWx0YSBpcyByb3VnaGx5IHRoZSBzYW1lICh3aXRoaW4gMSUpLCBkb24ndCBjaGFuZ2UgdGhlIGNvdW50ZXJcblxuICAgICAgICAvLyBUcmFjayBzdXN0YWluZWQgaGlnaCBkZWx0YSAoZGVsdGEgc2lnbmlmaWNhbnRseSBhYm92ZSBtaW5pbXVtIGZvciBtdWx0aXBsZSBldmVudHMpXG4gICAgICAgIC8vIFRoaXMgY2F0Y2hlcyB3aGVuIHVzZXIgc3RhcnRzIHNjcm9sbGluZyBidXQgZGVsdGEgcGxhdGVhdXMgaW5zdGVhZCBvZiBzdHJpY3RseSBpbmNyZWFzaW5nXG4gICAgICAgIGlmICghaXNCYXRjaGVkRXZlbnQgJiYgd2hlZWxEZWx0YU1hZ25pdHVkZSA+IGFuY2hvck1pbkRlbHRhICogMS4wNSkge1xuICAgICAgICAgIHN1c3RhaW5lZEhpZ2hDb3VudCsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN1c3RhaW5lZEhpZ2hDb3VudCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWxlYXNlIGlmOiAzKyBjb25zZWN1dGl2ZSBpbmNyZWFzZXMsIE9SIHN1c3RhaW5lZCBoaWdoIGRlbHRhLCBPUiBzaWduaWZpY2FudCBzaW5nbGUgaW5jcmVhc2VcbiAgICAgICAgY29uc3Qgc3VzdGFpbmVkSW5jcmVhc2UgPSBjb25zZWN1dGl2ZUluY3JlYXNlcyA+PSAzO1xuICAgICAgICBjb25zdCBzdXN0YWluZWRIaWdoID0gc3VzdGFpbmVkSGlnaENvdW50ID49IDU7IC8vIDUrIGV2ZW50cyBhdCA1JSsgYWJvdmUgbWluaW11bVxuICAgICAgICBjb25zdCBzaWduaWZpY2FudEluY3JlYXNlID1cbiAgICAgICAgICAhaXNCYXRjaGVkRXZlbnQgJiZcbiAgICAgICAgICB3aGVlbERlbHRhTWFnbml0dWRlID4gYW5jaG9yTWluRGVsdGEgKiAxLjE1ICYmIC8vIDE1JSBpbmNyZWFzZSBmcm9tIG1pbmltdW1cbiAgICAgICAgICB3aGVlbERlbHRhTWFnbml0dWRlID4gYW5jaG9yTGFzdERlbHRhICogMS4wODsgLy8gYW5kIDglIGluY3JlYXNpbmcgZnJvbSBsYXN0XG4gICAgICAgIGNvbnN0IGRlbHRhSW5jcmVhc2luZyA9XG4gICAgICAgICAgc3VzdGFpbmVkSW5jcmVhc2UgfHwgc3VzdGFpbmVkSGlnaCB8fCBzaWduaWZpY2FudEluY3JlYXNlO1xuXG4gICAgICAgIC8vIFJlbGVhc2UgYW5jaG9yIGlmOlxuICAgICAgICAvLyAxLiBUaGVyZSB3YXMgYSBnYXAgaW4gd2hlZWwgZXZlbnRzICg+IDIwMG1zKSAtIHVzZXIgc3RvcHBlZCBhbmQgc3RhcnRlZCBuZXcgc2Nyb2xsXG4gICAgICAgIC8vIDIuIERlbHRhIGlzIGluY3JlYXNpbmcgZnJvbSBtaW5pbXVtIC0gdXNlciBzdGFydGVkIHNjcm9sbGluZyBhZ2FpbiBkdXJpbmcgaW5lcnRpYVxuICAgICAgICAvLyAzLiBEZWx0YSBoYXMgZGVjYXllZCBzaWduaWZpY2FudGx5ICg8IDMwJSBvZiBpbml0aWFsKSAtIGluZXJ0aWEgaXMgd2luZGluZyBkb3duXG4gICAgICAgIC8vIDQuIExvdyBhYnNvbHV0ZSBkZWx0YSAoPCAzMCkgLSBnZW50bGUgaW50ZW50aW9uYWwgc2Nyb2xsXG4gICAgICAgIGNvbnN0IGhhc1doZWVsR2FwID0gdGltZVNpbmNlTGFzdFdoZWVsID4gMjAwO1xuICAgICAgICBjb25zdCBkZWx0YURlY2F5ZWQgPSB3aGVlbERlbHRhTWFnbml0dWRlIDwgYW5jaG9ySW5pdGlhbERlbHRhICogMC4zO1xuICAgICAgICBjb25zdCBpc0xvd0RlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZSA8IDMwO1xuXG4gICAgICAgIGlmIChoYXNXaGVlbEdhcCkge1xuICAgICAgICAgIC8vIFRpbWUgZ2FwIC0gdXNlciBzdG9wcGVkIGFuZCBzdGFydGVkIG5ldyBzY3JvbGxcbiAgICAgICAgICBhbmNob3JQb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoZGVsdGFJbmNyZWFzaW5nICYmIHRpbWVTaW5jZUFuY2hvciA+IDEwMCkge1xuICAgICAgICAgIC8vIERlbHRhIGluY3JlYXNpbmcgLSB1c2VyIHN0YXJ0ZWQgc2Nyb2xsaW5nIGFnYWluXG4gICAgICAgICAgYW5jaG9yUG9zaXRpb24gPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTG93RGVsdGEpIHtcbiAgICAgICAgICAvLyBWZXJ5IGxvdyBkZWx0YSAtIGdlbnRsZSBpbnRlbnRpb25hbCBzY3JvbGxcbiAgICAgICAgICBhbmNob3JQb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoZGVsdGFEZWNheWVkICYmIHRpbWVTaW5jZUFuY2hvciA+IDMwMCkge1xuICAgICAgICAgIC8vIERlbHRhIGhhcyBkZWNheWVkIGFuZCBzb21lIHRpbWUgcGFzc2VkIC0gaW5lcnRpYSBpcyBkb25lXG4gICAgICAgICAgYW5jaG9yUG9zaXRpb24gPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFN0aWxsIGluIGluZXJ0aWEgcGhhc2UgLSBzdGF5IGFuY2hvcmVkXG4gICAgICAgICAgaWYgKHNjcm9sbFBvc2l0aW9uICE9PSBhbmNob3JQb3NpdGlvbikge1xuICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSBhbmNob3JQb3NpdGlvbjtcbiAgICAgICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBVcGRhdGUgbGFzdCBkZWx0YSBmb3IgbmV4dCBjb21wYXJpc29uXG4gICAgICAgICAgYW5jaG9yTGFzdERlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgbGFzdCBkZWx0YSBmb3IgbmV4dCBjb21wYXJpc29uXG4gICAgICAgIGFuY2hvckxhc3REZWx0YSA9IHdoZWVsRGVsdGFNYWduaXR1ZGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByZXZpb3VzUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgIGNvbnN0IG1heFNjcm9sbCA9IE1hdGgubWF4KDAsIHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplKTtcblxuICAgICAgbGV0IG5ld1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb24gKyBzY3JvbGxEZWx0YTtcblxuICAgICAgLy8gQXBwbHkgc21vb3RoaW5nIGlmIGVuYWJsZWRcbiAgICAgIGlmIChzbW9vdGhpbmcpIHtcbiAgICAgICAgY29uc3Qgc21vb3RoaW5nRmFjdG9yID0gMC4zO1xuICAgICAgICBuZXdQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uICsgc2Nyb2xsRGVsdGEgKiBzbW9vdGhpbmdGYWN0b3I7XG4gICAgICB9XG5cbiAgICAgIG5ld1Bvc2l0aW9uID0gY2xhbXAobmV3UG9zaXRpb24sIDAsIG1heFNjcm9sbCk7XG5cbiAgICAgIGlmIChuZXdQb3NpdGlvbiAhPT0gc2Nyb2xsUG9zaXRpb24pIHtcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSBuZXdQb3NpdGlvbjtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICAgICAgICAvLyBVcGRhdGUgc2Nyb2xsIHN0YXRlXG4gICAgICAgIGlmICghaXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICBpc1Njcm9sbGluZyA9IHRydWU7XG4gICAgICAgICAgLy8gU3RvcCBhbnkgZXhpc3RpbmcgaWRsZSBkZXRlY3Rpb24gYmVmb3JlIHN0YXJ0aW5nIG5ldyBvbmVcbiAgICAgICAgICBzdG9wSWRsZURldGVjdGlvbigpO1xuICAgICAgICAgIHN0YXJ0SWRsZURldGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RTY3JvbGxUaW1lID0gbm93O1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzcGVlZCB0cmFja2VyXG4gICAgICAgIHNwZWVkVHJhY2tlciA9IHVwZGF0ZVNwZWVkVHJhY2tlcihcbiAgICAgICAgICBzcGVlZFRyYWNrZXIsXG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgcHJldmlvdXNQb3NpdGlvbixcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBVcGRhdGUgdmlld3BvcnQgc3RhdGVcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS52ZWxvY2l0eSA9IHNwZWVkVHJhY2tlci52ZWxvY2l0eTtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbERpcmVjdGlvbiA9IHNwZWVkVHJhY2tlci5kaXJlY3Rpb247XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgc2Nyb2xsZWQgc3RhdGUgY2xhc3NcbiAgICAgICAgY29uc3Qgdmlld3BvcnRFbCA9XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZT8udmlld3BvcnRFbGVtZW50IHx8IChjb21wb25lbnQgYXMgYW55KS52aWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydEVsKSB7XG4gICAgICAgICAgdXBkYXRlU2Nyb2xsZWRTdGF0ZSh2aWV3cG9ydEVsLCBzY3JvbGxQb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IGV2ZW50c1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6c2Nyb2xsXCIsIHtcbiAgICAgICAgICBwb3NpdGlvbjogc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgZGlyZWN0aW9uOiBzcGVlZFRyYWNrZXIuZGlyZWN0aW9uLFxuICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDp2ZWxvY2l0eS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgICB2ZWxvY2l0eTogc3BlZWRUcmFja2VyLnZlbG9jaXR5LFxuICAgICAgICAgIGRpcmVjdGlvbjogc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciByZW5kZXJcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFNjcm9sbCB0byBwb3NpdGlvblxuICAgIGNvbnN0IHNjcm9sbFRvUG9zaXRpb24gPSAocG9zaXRpb246IG51bWJlciwgc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBtYXhTY3JvbGwgPSBNYXRoLm1heCgwLCB0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZSk7XG4gICAgICBjb25zdCBjbGFtcGVkUG9zaXRpb24gPSBjbGFtcChwb3NpdGlvbiwgMCwgbWF4U2Nyb2xsKTtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbU2Nyb2xsaW5nXSBzY3JvbGxUb1Bvc2l0aW9uOiBwb3M9JHtwb3NpdGlvbn0gLT4gJHtjbGFtcGVkUG9zaXRpb259LCBzb3VyY2U9JHtzb3VyY2V9LCBjdXJyZW50UG9zPSR7c2Nyb2xsUG9zaXRpb259LCB2ZWxvY2l0eT0ke3NwZWVkVHJhY2tlci52ZWxvY2l0eS50b0ZpeGVkKFxuICAgICAgLy8gICAgIDNcbiAgICAgIC8vICAgKX1gXG4gICAgICAvLyApO1xuXG4gICAgICBpZiAoY2xhbXBlZFBvc2l0aW9uICE9PSBzY3JvbGxQb3NpdGlvbikge1xuICAgICAgICBjb25zdCBwcmV2aW91c1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgIHNjcm9sbFBvc2l0aW9uID0gY2xhbXBlZFBvc2l0aW9uO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzcGVlZCB0cmFja2VyIHRvIGNhbGN1bGF0ZSB2ZWxvY2l0eVxuICAgICAgICBzcGVlZFRyYWNrZXIgPSB1cGRhdGVTcGVlZFRyYWNrZXIoXG4gICAgICAgICAgc3BlZWRUcmFja2VyLFxuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24sXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHZpZXdwb3J0IHN0YXRlXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUudmVsb2NpdHkgPSBzcGVlZFRyYWNrZXIudmVsb2NpdHk7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxEaXJlY3Rpb24gPSBzcGVlZFRyYWNrZXIuZGlyZWN0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID1cbiAgICAgICAgICBjbGFtcGVkUG9zaXRpb24gPiBwcmV2aW91c1Bvc2l0aW9uID8gXCJmb3J3YXJkXCIgOiBcImJhY2t3YXJkXCI7XG5cbiAgICAgICAgLy8gVXBkYXRlIHNjcm9sbGVkIHN0YXRlIGNsYXNzXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0RWwgPVxuICAgICAgICAgIHZpZXdwb3J0U3RhdGU/LnZpZXdwb3J0RWxlbWVudCB8fCAoY29tcG9uZW50IGFzIGFueSkudmlld3BvcnRFbGVtZW50O1xuICAgICAgICBpZiAodmlld3BvcnRFbCkge1xuICAgICAgICAgIHVwZGF0ZVNjcm9sbGVkU3RhdGUodmlld3BvcnRFbCwgc2Nyb2xsUG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBzY3JvbGwgZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnNjcm9sbFwiLCB7XG4gICAgICAgICAgcG9zaXRpb246IHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgICBwcmV2aW91c1Bvc2l0aW9uLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFbWl0IHZlbG9jaXR5IGNoYW5nZSBldmVudCBzbyBjb2xsZWN0aW9uIGNhbiB0cmFjayBpdFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6dmVsb2NpdHktY2hhbmdlZFwiLCB7XG4gICAgICAgICAgdmVsb2NpdHk6IHNwZWVkVHJhY2tlci52ZWxvY2l0eSxcbiAgICAgICAgICBkaXJlY3Rpb246IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzY3JvbGwgc3RhdGUgYW5kIGlkbGUgZGV0ZWN0aW9uXG4gICAgICAgIGlmICghaXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICBpc1Njcm9sbGluZyA9IHRydWU7XG4gICAgICAgICAgc3RhcnRJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFNjcm9sbFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgcmVuZGVyXG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtTY3JvbGxpbmddIFBvc2l0aW9uIHVuY2hhbmdlZDogJHtzY3JvbGxQb3NpdGlvbn1gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtTY3JvbGxpbmddIFBvc2l0aW9uIHVuY2hhbmdlZDogJHtzY3JvbGxQb3NpdGlvbn0sIG5vdCByZXNldHRpbmcgaWRsZSB0aW1lb3V0YFxuICAgICAgICAvLyApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTY3JvbGwgdG8gaW5kZXhcbiAgICBjb25zdCBzY3JvbGxUb0luZGV4ID0gKFxuICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgIGFsaWdubWVudDogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIsXG4gICAgKSA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtTY3JvbGxpbmddIHNjcm9sbFRvSW5kZXggY2FsbGVkOiBpbmRleD0ke2luZGV4fSwgYWxpZ25tZW50PSR7YWxpZ25tZW50fWBcbiAgICAgIC8vICk7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW1Njcm9sbGluZ10gc2Nyb2xsVG9JbmRleCBhYm9ydGVkOiBubyB2aWV3cG9ydCBzdGF0ZWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGl0ZW1TaXplID0gdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZSB8fCA1MDtcbiAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgfHwgMDtcbiAgICAgIGNvbnN0IGFjdHVhbFRvdGFsU2l6ZSA9IHRvdGFsSXRlbXMgKiBpdGVtU2l6ZTtcbiAgICAgIGNvbnN0IE1BWF9WSVJUVUFMX1NJWkUgPVxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuVklSVFVBTF9TQ1JPTEwuTUFYX1ZJUlRVQUxfU0laRTtcbiAgICAgIGNvbnN0IGlzQ29tcHJlc3NlZCA9IGFjdHVhbFRvdGFsU2l6ZSA+IE1BWF9WSVJUVUFMX1NJWkU7XG5cbiAgICAgIGxldCB0YXJnZXRQb3NpdGlvbjogbnVtYmVyO1xuXG4gICAgICBpZiAoaXNDb21wcmVzc2VkKSB7XG4gICAgICAgIC8vIEluIGNvbXByZXNzZWQgc3BhY2UsIG1hcCBpbmRleCB0byB2aXJ0dWFsIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IHJhdGlvID0gaW5kZXggLyB0b3RhbEl0ZW1zO1xuICAgICAgICB0YXJnZXRQb3NpdGlvbiA9IHJhdGlvICogTWF0aC5taW4oYWN0dWFsVG90YWxTaXplLCBNQVhfVklSVFVBTF9TSVpFKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpcmVjdCBjYWxjdWxhdGlvbiB3aGVuIG5vdCBjb21wcmVzc2VkXG4gICAgICAgIHRhcmdldFBvc2l0aW9uID0gaW5kZXggKiBpdGVtU2l6ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRqdXN0IHBvc2l0aW9uIGJhc2VkIG9uIGFsaWdubWVudFxuICAgICAgc3dpdGNoIChhbGlnbm1lbnQpIHtcbiAgICAgICAgY2FzZSBcImNlbnRlclwiOlxuICAgICAgICAgIHRhcmdldFBvc2l0aW9uIC09IGNvbnRhaW5lclNpemUgLyAyIC0gaXRlbVNpemUgLyAyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgdGFyZ2V0UG9zaXRpb24gLT0gY29udGFpbmVyU2l6ZSAtIGl0ZW1TaXplO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtTY3JvbGxpbmddIFRhcmdldCBwb3NpdGlvbjogJHt0YXJnZXRQb3NpdGlvbn0sIGlzQ29tcHJlc3NlZDogJHtpc0NvbXByZXNzZWR9YFxuICAgICAgLy8gKTtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbU2Nyb2xsaW5nXSBTY3JvbGxUb0luZGV4OiBpbmRleD0ke2luZGV4fSwgcG9zaXRpb249JHt0YXJnZXRQb3NpdGlvbn0sIGFsaWdubWVudD0ke2FsaWdubWVudH1gXG4gICAgICAvLyApO1xuXG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uKHRhcmdldFBvc2l0aW9uLCBcInNjcm9sbFRvSW5kZXhcIik7XG4gICAgfTtcblxuICAgIC8vIFNjcm9sbCB0byBhIHNwZWNpZmljIHBhZ2VcbiAgICBjb25zdCBzY3JvbGxUb1BhZ2UgPSAoXG4gICAgICBwYWdlOiBudW1iZXIsXG4gICAgICBsaW1pdDogbnVtYmVyID0gMjAsXG4gICAgICBhbGlnbm1lbnQ6IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiID0gXCJzdGFydFwiLFxuICAgICkgPT4ge1xuICAgICAgLy8gVmFsaWRhdGUgYWxpZ25tZW50IHBhcmFtZXRlclxuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgYWxpZ25tZW50ICE9PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICFbXCJzdGFydFwiLCBcImNlbnRlclwiLCBcImVuZFwiXS5pbmNsdWRlcyhhbGlnbm1lbnQpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbU2Nyb2xsaW5nXSBJbnZhbGlkIGFsaWdubWVudCBcIiR7YWxpZ25tZW50fVwiLCB1c2luZyBcInN0YXJ0XCJgLFxuICAgICAgICApO1xuICAgICAgICBhbGlnbm1lbnQgPSBcInN0YXJ0XCI7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGN1cnNvciBtb2RlXG4gICAgICBjb25zdCB2aWV3cG9ydENvbmZpZyA9IChjb21wb25lbnQgYXMgYW55KS5jb25maWc7XG4gICAgICBjb25zdCBpc0N1cnNvck1vZGUgPSB2aWV3cG9ydENvbmZpZz8ucGFnaW5hdGlvbj8uc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCI7XG5cbiAgICAgIGlmIChpc0N1cnNvck1vZGUpIHtcbiAgICAgICAgLy8gSW4gY3Vyc29yIG1vZGUsIGNoZWNrIGlmIHdlIGNhbiBzY3JvbGwgdG8gdGhpcyBwYWdlXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuY29sbGVjdGlvbjtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBjb25zdCBoaWdoZXN0TG9hZGVkUGFnZSA9IE1hdGguZmxvb3IoXG4gICAgICAgICAgICBjb2xsZWN0aW9uLmdldExvYWRlZFJhbmdlcygpLnNpemUsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChwYWdlID4gaGlnaGVzdExvYWRlZFBhZ2UgKyAxKSB7XG4gICAgICAgICAgICAvLyBMaW1pdCBob3cgbWFueSBwYWdlcyB3ZSdsbCBsb2FkIGF0IG9uY2UgdG8gcHJldmVudCBleGNlc3NpdmUgQVBJIGNhbGxzXG4gICAgICAgICAgICBjb25zdCBtYXhQYWdlc1RvTG9hZCA9IDEwOyAvLyBSZWFzb25hYmxlIGxpbWl0XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRQYWdlID0gTWF0aC5taW4oXG4gICAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICAgIGhpZ2hlc3RMb2FkZWRQYWdlICsgbWF4UGFnZXNUb0xvYWQsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGBbU2Nyb2xsaW5nXSBDYW5ub3QganVtcCBkaXJlY3RseSB0byBwYWdlICR7cGFnZX0gaW4gY3Vyc29yIG1vZGUuIGAgK1xuICAgICAgICAgICAgICAgIGBQYWdlcyBtdXN0IGJlIGxvYWRlZCBzZXF1ZW50aWFsbHkuIEN1cnJlbnQgaGlnaGVzdCBwYWdlOiAke2hpZ2hlc3RMb2FkZWRQYWdlfS4gYCArXG4gICAgICAgICAgICAgICAgYFdpbGwgbG9hZCB1cCB0byBwYWdlICR7dGFyZ2V0UGFnZX1gLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gVHJpZ2dlciBzZXF1ZW50aWFsIGxvYWRpbmcgdG8gdGhlIHRhcmdldCBwYWdlIChsaW1pdGVkKVxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0T2Zmc2V0ID0gKHRhcmdldFBhZ2UgLSAxKSAqIGxpbWl0O1xuICAgICAgICAgICAgY29uc3QgY3VycmVudE9mZnNldCA9IGhpZ2hlc3RMb2FkZWRQYWdlICogbGltaXQ7XG5cbiAgICAgICAgICAgIC8vIExvYWQgcGFnZXMgc2VxdWVudGlhbGx5IHVwIHRvIHRoZSBsaW1pdGVkIHRhcmdldFxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBbU2Nyb2xsaW5nXSBJbml0aWF0aW5nIHNlcXVlbnRpYWwgbG9hZCBmcm9tIHBhZ2UgJHtcbiAgICAgICAgICAgIC8vICAgICBoaWdoZXN0TG9hZGVkUGFnZSArIDFcbiAgICAgICAgICAgIC8vICAgfSB0byAke3RhcmdldFBhZ2V9YCxcbiAgICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICAgIC8vIFNjcm9sbCB0byB0aGUgbGFzdCBsb2FkZWQgcG9zaXRpb24gZmlyc3RcbiAgICAgICAgICAgIGNvbnN0IGxhc3RMb2FkZWRJbmRleCA9IGhpZ2hlc3RMb2FkZWRQYWdlICogbGltaXQ7XG4gICAgICAgICAgICBzY3JvbGxUb0luZGV4KGxhc3RMb2FkZWRJbmRleCwgYWxpZ25tZW50KTtcblxuICAgICAgICAgICAgLy8gVGhlIGNvbGxlY3Rpb24gZmVhdHVyZSB3aWxsIGhhbmRsZSBzZXF1ZW50aWFsIGxvYWRpbmdcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ29udmVydCBwYWdlIHRvIGluZGV4IChwYWdlIDEgPSBpbmRleCAwKVxuICAgICAgY29uc3QgaW5kZXggPSAocGFnZSAtIDEpICogbGltaXQ7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGluZ10gU2Nyb2xsVG9QYWdlOiBwYWdlPSR7cGFnZX0sIGxpbWl0PSR7bGltaXR9LCB0YXJnZXRJbmRleD0ke2luZGV4fSwgYWxpZ25tZW50PSR7YWxpZ25tZW50fWBcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIEp1c3Qgc2Nyb2xsIHRvIHRoZSBpbmRleCAtIGxldCB0aGUgbm9ybWFsIHJlbmRlcmluZyBmbG93IGhhbmRsZSBkYXRhIGxvYWRpbmcgYW5kIHBsYWNlaG9sZGVyc1xuICAgICAgc2Nyb2xsVG9JbmRleChpbmRleCwgYWxpZ25tZW50KTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHNjcm9sbCBib3VuZHNcbiAgICBjb25zdCB1cGRhdGVTY3JvbGxCb3VuZHMgPSAoXG4gICAgICBuZXdUb3RhbFNpemU6IG51bWJlcixcbiAgICAgIG5ld0NvbnRhaW5lclNpemU6IG51bWJlcixcbiAgICApID0+IHtcbiAgICAgIHRvdGFsVmlydHVhbFNpemUgPSBuZXdUb3RhbFNpemU7XG4gICAgICBjb250YWluZXJTaXplID0gbmV3Q29udGFpbmVyU2l6ZTtcblxuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplID0gbmV3VG90YWxTaXplO1xuICAgICAgICB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUgPSBuZXdDb250YWluZXJTaXplO1xuICAgICAgfVxuXG4gICAgICAvLyBEb24ndCBjbGFtcCBzY3JvbGwgcG9zaXRpb24gdW50aWwgd2UgaGF2ZSByZWFsIGRhdGEgbG9hZGVkXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIHJlc2V0dGluZyBpbml0aWFsU2Nyb2xsSW5kZXggcG9zaXRpb24gYmVmb3JlIGRhdGEgYXJyaXZlc1xuICAgICAgLy8gQ2hlY2sgdG90YWxJdGVtcyBpbnN0ZWFkIG9mIHRvdGFsVmlydHVhbFNpemUgc2luY2UgdmlydHVhbFNpemUgY2FuIGJlIG5vbi16ZXJvIGZyb20gcGFkZGluZ1xuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IHZpZXdwb3J0U3RhdGU/LnRvdGFsSXRlbXMgfHwgMDtcbiAgICAgIGlmICh0b3RhbEl0ZW1zIDw9IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGFtcCBjdXJyZW50IHBvc2l0aW9uIHRvIG5ldyBib3VuZHNcbiAgICAgIGNvbnN0IG1heFNjcm9sbCA9IE1hdGgubWF4KDAsIHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplKTtcbiAgICAgIGlmIChzY3JvbGxQb3NpdGlvbiA+IG1heFNjcm9sbCkge1xuICAgICAgICBzY3JvbGxUb1Bvc2l0aW9uKG1heFNjcm9sbCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEV4dGVuZCB2aWV3cG9ydCBBUElcbiAgICBjb25zdCBvcmlnaW5hbFNjcm9sbFRvSW5kZXggPSBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9JbmRleDtcbiAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9JbmRleCA9IChcbiAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICBhbGlnbm1lbnQ/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIixcbiAgICApID0+IHtcbiAgICAgIHNjcm9sbFRvSW5kZXgoaW5kZXgsIGFsaWdubWVudCk7XG4gICAgICBvcmlnaW5hbFNjcm9sbFRvSW5kZXg/LihpbmRleCwgYWxpZ25tZW50KTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHNjcm9sbFRvUGFnZSB0byB2aWV3cG9ydCBBUEkgKG5ldyBtZXRob2QsIG5vIG9yaWdpbmFsIHRvIHByZXNlcnZlKVxuICAgIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zY3JvbGxUb1BhZ2UgPSAoXG4gICAgICBwYWdlOiBudW1iZXIsXG4gICAgICBsaW1pdD86IG51bWJlcixcbiAgICAgIGFsaWdubWVudD86IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiLFxuICAgICkgPT4ge1xuICAgICAgc2Nyb2xsVG9QYWdlKHBhZ2UsIGxpbWl0LCBhbGlnbm1lbnQpO1xuICAgIH07XG5cbiAgICBjb25zdCBvcmlnaW5hbFNjcm9sbFRvUG9zaXRpb24gPSBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9Qb3NpdGlvbjtcbiAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9Qb3NpdGlvbiA9IChwb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uKHBvc2l0aW9uLCBcImFwaVwiKTtcbiAgICAgIG9yaWdpbmFsU2Nyb2xsVG9Qb3NpdGlvbj8uKHBvc2l0aW9uKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb3JpZ2luYWxHZXRTY3JvbGxQb3NpdGlvbiA9IGNvbXBvbmVudC52aWV3cG9ydC5nZXRTY3JvbGxQb3NpdGlvbjtcbiAgICBjb21wb25lbnQudmlld3BvcnQuZ2V0U2Nyb2xsUG9zaXRpb24gPSAoKSA9PiB7XG4gICAgICByZXR1cm4gc2Nyb2xsUG9zaXRpb247XG4gICAgfTtcblxuICAgIC8vIEFkZCB3aGVlbCBldmVudCBsaXN0ZW5lciBvbiBpbml0aWFsaXphdGlvblxuICAgIC8vIFRoaXMgYmxvY2sgaXMgcmVtb3ZlZCBhcyBwZXIgdGhlIGVkaXQgaGludC5cblxuICAgIC8vIENsZWFuIHVwIG9uIGRlc3Ryb3lcbiAgICBpZiAoXCJkZXN0cm95XCIgaW4gY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQuZGVzdHJveTtcbiAgICAgIGNvbXBvbmVudC5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAvLyBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0RWxlbWVudCA9IChjb21wb25lbnQgYXMgYW55KS5fc2Nyb2xsaW5nVmlld3BvcnRFbGVtZW50O1xuICAgICAgICBpZiAodmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCBoYW5kbGVXaGVlbCk7XG4gICAgICAgICAgaWYgKChjb21wb25lbnQgYXMgYW55KS5fc2Nyb2xsaW5nU3RvcE9uQ2xpY2spIHtcbiAgICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGhhbmRsZU1vdXNlRG93bik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgdGltZW91dHNcbiAgICAgICAgaWYgKGlkbGVUaW1lb3V0SWQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoaWRsZVRpbWVvdXRJZCk7XG4gICAgICAgIH1cblxuICAgICAgICBzdG9wSWRsZURldGVjdGlvbigpO1xuICAgICAgICBvcmlnaW5hbERlc3Ryb3k/LigpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBBZGQgc2Nyb2xsQnkgbWV0aG9kXG4gICAgY29uc3Qgc2Nyb2xsQnkgPSAoZGVsdGE6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgcHJldmlvdXNQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgY29uc3QgbWF4U2Nyb2xsID0gTWF0aC5tYXgoMCwgdG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuICAgICAgY29uc3QgbmV3UG9zaXRpb24gPSBjbGFtcChzY3JvbGxQb3NpdGlvbiArIGRlbHRhLCAwLCBtYXhTY3JvbGwpO1xuXG4gICAgICBpZiAobmV3UG9zaXRpb24gIT09IHByZXZpb3VzUG9zaXRpb24pIHtcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSBuZXdQb3NpdGlvbjtcblxuICAgICAgICAvLyBVcGRhdGUgc3BlZWQgdHJhY2tlclxuICAgICAgICBzcGVlZFRyYWNrZXIgPSB1cGRhdGVTcGVlZFRyYWNrZXIoXG4gICAgICAgICAgc3BlZWRUcmFja2VyLFxuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24sXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHZpZXdwb3J0IHN0YXRlXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUudmVsb2NpdHkgPSBzcGVlZFRyYWNrZXIudmVsb2NpdHk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgc2Nyb2xsZWQgc3RhdGUgY2xhc3NcbiAgICAgICAgY29uc3Qgdmlld3BvcnRFbCA9XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZT8udmlld3BvcnRFbGVtZW50IHx8IChjb21wb25lbnQgYXMgYW55KS52aWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydEVsKSB7XG4gICAgICAgICAgdXBkYXRlU2Nyb2xsZWRTdGF0ZSh2aWV3cG9ydEVsLCBzY3JvbGxQb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IHNjcm9sbCBldmVudFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6c2Nyb2xsXCIsIHtcbiAgICAgICAgICBwb3NpdGlvbjogc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgdmVsb2NpdHk6IHNwZWVkVHJhY2tlci52ZWxvY2l0eSxcbiAgICAgICAgICBkaXJlY3Rpb246IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgcmVuZGVyXG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcz8uKCk7XG5cbiAgICAgICAgLy8gU3RhcnQgaWRsZSBkZXRlY3Rpb24gaWYgbm90IHNjcm9sbGluZ1xuICAgICAgICBpZiAoIWlzU2Nyb2xsaW5nKSB7XG4gICAgICAgICAgaXNTY3JvbGxpbmcgPSB0cnVlO1xuICAgICAgICAgIHN0YXJ0SWRsZURldGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RTY3JvbGxUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gRXhwb3NlIHNjcm9sbGluZyBzdGF0ZSBmb3Igb3RoZXIgZmVhdHVyZXNcbiAgICAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc2Nyb2xsaW5nU3RhdGUgPSB7XG4gICAgICBzZXRWZWxvY2l0eVRvWmVybyxcbiAgICB9O1xuXG4gICAgLy8gQWRkIHNjcm9sbEJ5IHRvIHZpZXdwb3J0IEFQSVxuICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxCeSA9IHNjcm9sbEJ5O1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5nZXRWZWxvY2l0eSA9ICgpID0+IHNwZWVkVHJhY2tlci52ZWxvY2l0eTtcblxuICAgIC8vIEV4cG9zZSBzY3JvbGxpbmcgQVBJXG4gICAgKGNvbXBvbmVudCBhcyBhbnkpLnNjcm9sbGluZyA9IHtcbiAgICAgIGhhbmRsZVdoZWVsLFxuICAgICAgc2Nyb2xsVG9Qb3NpdGlvbixcbiAgICAgIHNjcm9sbFRvSW5kZXgsXG4gICAgICBzY3JvbGxUb1BhZ2UsXG4gICAgICBzY3JvbGxCeSxcbiAgICAgIGdldFNjcm9sbFBvc2l0aW9uOiAoKSA9PiBzY3JvbGxQb3NpdGlvbixcbiAgICAgIHVwZGF0ZVNjcm9sbEJvdW5kcyxcbiAgICAgIGdldFZlbG9jaXR5OiAoKSA9PiBzcGVlZFRyYWNrZXIudmVsb2NpdHksXG4gICAgICBnZXREaXJlY3Rpb246ICgpID0+IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICBpc1Njcm9sbGluZzogKCkgPT4gaXNTY3JvbGxpbmcsXG4gICAgfTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9tb21lbnR1bS50c1xuXG4vKipcbiAqIE1vbWVudHVtIEZlYXR1cmUgLSBBZGRzIGluZXJ0aWFsIHNjcm9sbGluZyB0byB2aWV3cG9ydFxuICogUHJvdmlkZXMgc21vb3RoIGRlY2VsZXJhdGlvbiBhZnRlciB0b3VjaC9tb3VzZSBkcmFnIGdlc3R1cmVzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbXBvbmVudCwgVmlld3BvcnRDb250ZXh0IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBWSUVXUE9SVF9DT05TVEFOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbmludGVyZmFjZSBNb21lbnR1bUNvbmZpZyB7XG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuICBkZWNlbGVyYXRpb24/OiBudW1iZXI7XG4gIG1pblZlbG9jaXR5PzogbnVtYmVyO1xuICBtaW5EdXJhdGlvbj86IG51bWJlcjtcbiAgbWluVmVsb2NpdHlUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIC8qKiBTdG9wIG1vbWVudHVtIHdoZW4gY2xpY2tpbmcgb24gdGhlIHZpZXdwb3J0IChkZWZhdWx0OiB0cnVlKSAqL1xuICBzdG9wT25DbGljaz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQWRkcyBtb21lbnR1bSBzY3JvbGxpbmcgdG8gdmlld3BvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhNb21lbnR1bSA9IChjb25maWc6IE1vbWVudHVtQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGVuYWJsZWQgPSBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uRU5BQkxFRCxcbiAgICAgIGRlY2VsZXJhdGlvbiA9IFZJRVdQT1JUX0NPTlNUQU5UUy5NT01FTlRVTS5ERUNFTEVSQVRJT05fRkFDVE9SLFxuICAgICAgbWluVmVsb2NpdHkgPSBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uTUlOX1ZFTE9DSVRZLFxuICAgICAgbWluRHVyYXRpb24gPSBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uTUlOX0RVUkFUSU9OLFxuICAgICAgbWluVmVsb2NpdHlUaHJlc2hvbGQgPSBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uTUlOX1ZFTE9DSVRZX1RIUkVTSE9MRCxcbiAgICAgIHN0b3BPbkNsaWNrID0gdHJ1ZSwgLy8gU3RvcCBtb21lbnR1bSBvbiBjbGljayBieSBkZWZhdWx0XG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIEFsd2F5cyBhcHBseSB0aGUgZmVhdHVyZSwgYnV0IGNoZWNrIGlzRW5hYmxlZCBhdCBydW50aW1lXG5cbiAgICAvLyBNb21lbnR1bSBzdGF0ZVxuICAgIGxldCBtb21lbnR1bUFuaW1hdGlvbklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaXNUb3VjaGluZyA9IGZhbHNlO1xuICAgIGxldCBpc01vdXNlRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICBsZXQgbGFzdFRvdWNoUG9zaXRpb24gPSAwO1xuICAgIGxldCBsYXN0TW91c2VQb3NpdGlvbiA9IDA7XG4gICAgbGV0IHRvdWNoU3RhcnRUaW1lID0gMDtcbiAgICBsZXQgdmlld3BvcnRTdGF0ZTogYW55O1xuICAgIGxldCBzY3JvbGxpbmdTdGF0ZTogYW55O1xuICAgIGxldCBpc0VuYWJsZWQgPSBlbmFibGVkOyAvLyBUcmFjayBjdXJyZW50IGVuYWJsZWQgc3RhdGVcblxuICAgIC8vIEdldCByZWZlcmVuY2VzIGFmdGVyIGluaXRpYWxpemF0aW9uXG4gICAgY29uc3Qgb3JpZ2luYWxJbml0aWFsaXplID0gY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemU7XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbEluaXRpYWxpemUoKTtcbiAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBpbml0aWFsaXplZFxuICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdmlld3BvcnQgYW5kIHNjcm9sbGluZyBzdGF0ZXNcbiAgICAgIHZpZXdwb3J0U3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG4gICAgICBzY3JvbGxpbmdTdGF0ZSA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zY3JvbGxpbmdTdGF0ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIC8vIFN0b3AgbW9tZW50dW0gYW5pbWF0aW9uIChjYW4gYmUgY2FsbGVkIGV4dGVybmFsbHkpXG4gICAgY29uc3Qgc3RvcE1vbWVudHVtID0gKCkgPT4ge1xuICAgICAgaWYgKG1vbWVudHVtQW5pbWF0aW9uSWQpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUobW9tZW50dW1BbmltYXRpb25JZCk7XG4gICAgICAgIG1vbWVudHVtQW5pbWF0aW9uSWQgPSBudWxsO1xuICAgICAgICAvLyBSZXNldCB2ZWxvY2l0eSBpbiBzY3JvbGxpbmcgZmVhdHVyZVxuICAgICAgICBpZiAoc2Nyb2xsaW5nU3RhdGUpIHtcbiAgICAgICAgICBzY3JvbGxpbmdTdGF0ZS5zZXRWZWxvY2l0eVRvWmVybz8uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gU3RhcnQgbW9tZW50dW0gYW5pbWF0aW9uXG4gICAgY29uc3Qgc3RhcnRNb21lbnR1bSA9IChpbml0aWFsVmVsb2NpdHk6IG51bWJlcikgPT4ge1xuICAgICAgLy8gQ2FuY2VsIGFueSBleGlzdGluZyBtb21lbnR1bVxuICAgICAgaWYgKG1vbWVudHVtQW5pbWF0aW9uSWQpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUobW9tZW50dW1BbmltYXRpb25JZCk7XG4gICAgICB9XG5cbiAgICAgIGxldCB2ZWxvY2l0eSA9IGluaXRpYWxWZWxvY2l0eTtcblxuICAgICAgY29uc3QgYW5pbWF0ZSA9ICgpID0+IHtcbiAgICAgICAgLy8gQXBwbHkgZGVjZWxlcmF0aW9uXG4gICAgICAgIHZlbG9jaXR5ICo9IGRlY2VsZXJhdGlvbjtcblxuICAgICAgICAvLyBTdG9wIGlmIHZlbG9jaXR5IGlzIHRvbyBzbWFsbFxuICAgICAgICBpZiAoTWF0aC5hYnModmVsb2NpdHkpIDwgbWluVmVsb2NpdHkpIHtcbiAgICAgICAgICBtb21lbnR1bUFuaW1hdGlvbklkID0gbnVsbDtcbiAgICAgICAgICAvLyBSZXNldCB2ZWxvY2l0eSBpbiBzY3JvbGxpbmcgZmVhdHVyZVxuICAgICAgICAgIGlmIChzY3JvbGxpbmdTdGF0ZSkge1xuICAgICAgICAgICAgc2Nyb2xsaW5nU3RhdGUuc2V0VmVsb2NpdHlUb1plcm8/LigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxjdWxhdGUgc2Nyb2xsIGRlbHRhICh2ZWxvY2l0eSBpcyBpbiBweC9tcywgc28gbXVsdGlwbHkgYnkgZnJhbWUgdGltZSlcbiAgICAgICAgY29uc3QgZnJhbWVEZWx0YSA9IHZlbG9jaXR5ICogVklFV1BPUlRfQ09OU1RBTlRTLk1PTUVOVFVNLkZSQU1FX1RJTUU7XG5cbiAgICAgICAgLy8gVXNlIHNjcm9sbGluZyBmZWF0dXJlJ3MgQVBJIHRvIHVwZGF0ZSBwb3NpdGlvblxuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5KSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5KGZyYW1lRGVsdGEpO1xuXG4gICAgICAgICAgLy8gQ29udGludWUgYW5pbWF0aW9uXG4gICAgICAgICAgbW9tZW50dW1BbmltYXRpb25JZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBObyBzY3JvbGxCeSBtZXRob2QsIHN0b3AgbW9tZW50dW1cbiAgICAgICAgICBtb21lbnR1bUFuaW1hdGlvbklkID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgbW9tZW50dW1BbmltYXRpb25JZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTtcbiAgICB9O1xuXG4gICAgLy8gVG91Y2ggZXZlbnQgaGFuZGxlcnNcbiAgICBjb25zdCBoYW5kbGVUb3VjaFN0YXJ0ID0gKGU6IFRvdWNoRXZlbnQpID0+IHtcbiAgICAgIGlzVG91Y2hpbmcgPSB0cnVlO1xuICAgICAgY29uc3QgdG91Y2ggPSBlLnRvdWNoZXNbMF07XG4gICAgICBjb25zdCBvcmllbnRhdGlvbiA9IHZpZXdwb3J0U3RhdGU/Lm9yaWVudGF0aW9uIHx8IFwidmVydGljYWxcIjtcbiAgICAgIGxhc3RUb3VjaFBvc2l0aW9uID1cbiAgICAgICAgb3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIiA/IHRvdWNoLmNsaWVudFkgOiB0b3VjaC5jbGllbnRYO1xuICAgICAgdG91Y2hTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAvLyBDYW5jZWwgYW55IG9uZ29pbmcgbW9tZW50dW1cbiAgICAgIGlmIChtb21lbnR1bUFuaW1hdGlvbklkKSB7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKG1vbWVudHVtQW5pbWF0aW9uSWQpO1xuICAgICAgICBtb21lbnR1bUFuaW1hdGlvbklkID0gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlVG91Y2hNb3ZlID0gKGU6IFRvdWNoRXZlbnQpID0+IHtcbiAgICAgIGlmICghaXNUb3VjaGluZykgcmV0dXJuO1xuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7IC8vIFByZXZlbnQgbmF0aXZlIHNjcm9sbGluZ1xuXG4gICAgICBjb25zdCB0b3VjaCA9IGUudG91Y2hlc1swXTtcbiAgICAgIGNvbnN0IG9yaWVudGF0aW9uID0gdmlld3BvcnRTdGF0ZT8ub3JpZW50YXRpb24gfHwgXCJ2ZXJ0aWNhbFwiO1xuICAgICAgY29uc3QgY3VycmVudFBvc2l0aW9uID1cbiAgICAgICAgb3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIiA/IHRvdWNoLmNsaWVudFkgOiB0b3VjaC5jbGllbnRYO1xuICAgICAgY29uc3QgZGVsdGEgPSBsYXN0VG91Y2hQb3NpdGlvbiAtIGN1cnJlbnRQb3NpdGlvbjsgLy8gSW52ZXJ0ZWQgZm9yIG5hdHVyYWwgc2Nyb2xsaW5nXG4gICAgICBsYXN0VG91Y2hQb3NpdGlvbiA9IGN1cnJlbnRQb3NpdGlvbjtcblxuICAgICAgLy8gVXNlIHNjcm9sbGluZyBmZWF0dXJlJ3MgQVBJICgxOjEgdG91Y2gtdG8tc2Nyb2xsIGZvciBuYXR1cmFsIGZlZWwpXG4gICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5KSB7XG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxCeShkZWx0YSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZVRvdWNoRW5kID0gKCkgPT4ge1xuICAgICAgaWYgKCFpc1RvdWNoaW5nKSByZXR1cm47XG4gICAgICBpc1RvdWNoaW5nID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IHRvdWNoRW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB0b3VjaER1cmF0aW9uID0gdG91Y2hFbmRUaW1lIC0gdG91Y2hTdGFydFRpbWU7XG5cbiAgICAgIC8vIEdldCBjdXJyZW50IHZlbG9jaXR5IGZyb20gc2Nyb2xsaW5nIGZlYXR1cmVcbiAgICAgIGNvbnN0IHZlbG9jaXR5ID0gY29tcG9uZW50LnZpZXdwb3J0LmdldFZlbG9jaXR5Py4oKSB8fCAwO1xuXG4gICAgICAvLyBPbmx5IHN0YXJ0IG1vbWVudHVtIGlmIHRoZSB0b3VjaCB3YXMgcXVpY2sgZW5vdWdoIGFuZCB3ZSBoYXZlIHZlbG9jaXR5XG4gICAgICBpZiAoXG4gICAgICAgIHRvdWNoRHVyYXRpb24gPCBtaW5EdXJhdGlvbiAmJlxuICAgICAgICBNYXRoLmFicyh2ZWxvY2l0eSkgPiBtaW5WZWxvY2l0eVRocmVzaG9sZFxuICAgICAgKSB7XG4gICAgICAgIHN0YXJ0TW9tZW50dW0odmVsb2NpdHkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgY2xpY2sgdG8gc3RvcCBtb21lbnR1bSAod2l0aG91dCBwcmV2ZW50aW5nIHNlbGVjdGlvbilcbiAgICBjb25zdCBoYW5kbGVDbGljayA9IChfZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgc3RvcE1vbWVudHVtKCk7XG4gICAgfTtcblxuICAgIC8vIE1vdXNlIGV2ZW50IGhhbmRsZXJzIGZvciBkZXNrdG9wXG4gICAgY29uc3QgaGFuZGxlTW91c2VEb3duID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlzTW91c2VEcmFnZ2luZyA9IHRydWU7XG4gICAgICBjb25zdCBvcmllbnRhdGlvbiA9IHZpZXdwb3J0U3RhdGU/Lm9yaWVudGF0aW9uIHx8IFwidmVydGljYWxcIjtcbiAgICAgIGxhc3RNb3VzZVBvc2l0aW9uID0gb3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIiA/IGUuY2xpZW50WSA6IGUuY2xpZW50WDtcbiAgICAgIHRvdWNoU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgICAgLy8gQ2FuY2VsIGFueSBvbmdvaW5nIG1vbWVudHVtXG4gICAgICBzdG9wTW9tZW50dW0oKTtcblxuICAgICAgLy8gUHJldmVudCB0ZXh0IHNlbGVjdGlvblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZU1vdmUgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaWYgKCFpc01vdXNlRHJhZ2dpbmcpIHJldHVybjtcblxuICAgICAgY29uc3Qgb3JpZW50YXRpb24gPSB2aWV3cG9ydFN0YXRlPy5vcmllbnRhdGlvbiB8fCBcInZlcnRpY2FsXCI7XG4gICAgICBjb25zdCBjdXJyZW50UG9zaXRpb24gPVxuICAgICAgICBvcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiID8gZS5jbGllbnRZIDogZS5jbGllbnRYO1xuICAgICAgY29uc3QgZGVsdGEgPSBsYXN0TW91c2VQb3NpdGlvbiAtIGN1cnJlbnRQb3NpdGlvbjtcbiAgICAgIGxhc3RNb3VzZVBvc2l0aW9uID0gY3VycmVudFBvc2l0aW9uO1xuXG4gICAgICAvLyBVc2Ugc2Nyb2xsaW5nIGZlYXR1cmUncyBBUEkgKDE6MSBkcmFnLXRvLXNjcm9sbCBmb3IgbmF0dXJhbCBmZWVsKVxuICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxCeSkge1xuICAgICAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsQnkoZGVsdGEpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZVVwID0gKCkgPT4ge1xuICAgICAgaWYgKCFpc01vdXNlRHJhZ2dpbmcpIHJldHVybjtcbiAgICAgIGlzTW91c2VEcmFnZ2luZyA9IGZhbHNlO1xuXG4gICAgICBjb25zdCBtb3VzZVVwVGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBkcmFnRHVyYXRpb24gPSBtb3VzZVVwVGltZSAtIHRvdWNoU3RhcnRUaW1lO1xuXG4gICAgICAvLyBHZXQgY3VycmVudCB2ZWxvY2l0eSBmcm9tIHNjcm9sbGluZyBmZWF0dXJlXG4gICAgICBjb25zdCB2ZWxvY2l0eSA9IGNvbXBvbmVudC52aWV3cG9ydC5nZXRWZWxvY2l0eT8uKCkgfHwgMDtcblxuICAgICAgLy8gU3RhcnQgbW9tZW50dW0gZm9yIHF1aWNrIGRyYWdzXG4gICAgICBpZiAoXG4gICAgICAgIGRyYWdEdXJhdGlvbiA8IG1pbkR1cmF0aW9uICYmXG4gICAgICAgIE1hdGguYWJzKHZlbG9jaXR5KSA+IG1pblZlbG9jaXR5VGhyZXNob2xkXG4gICAgICApIHtcbiAgICAgICAgc3RhcnRNb21lbnR1bSh2ZWxvY2l0eSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIE92ZXJyaWRlIGluaXRpYWxpemUgdG8gYWRkIGV2ZW50IGxpc3RlbmVyc1xuICAgIGNvbnN0IG9yaWdpbmFsSW5pdCA9IGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplO1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplID0gKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gb3JpZ2luYWxJbml0KCk7XG4gICAgICAvLyBTa2lwIGlmIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgdmlld3BvcnRFbGVtZW50ID1cbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLnZpZXdwb3J0RWxlbWVudCB8fFxuICAgICAgICAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU/LnZpZXdwb3J0RWxlbWVudDtcblxuICAgICAgaWYgKHZpZXdwb3J0RWxlbWVudCkge1xuICAgICAgICAvLyBUb3VjaCBldmVudHNcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsIGhhbmRsZVRvdWNoU3RhcnQsIHtcbiAgICAgICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgaGFuZGxlVG91Y2hNb3ZlLCB7XG4gICAgICAgICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIGhhbmRsZVRvdWNoRW5kLCB7XG4gICAgICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTW91c2UgZXZlbnRzIGZvciBkZXNrdG9wIGRyYWdnaW5nXG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGhhbmRsZU1vdXNlRG93bik7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBoYW5kbGVNb3VzZVVwKTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIGhhbmRsZU1vdXNlVXApO1xuXG4gICAgICAgIC8vIEFkZCBjbGljayBsaXN0ZW5lciB0byBzdG9wIG1vbWVudHVtIG9uIGNsaWNrICh3aXRob3V0IGJsb2NraW5nIHNlbGVjdGlvbilcbiAgICAgICAgaWYgKHN0b3BPbkNsaWNrKSB7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVDbGljayk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdG9yZSByZWZlcmVuY2UgZm9yIGNsZWFudXBcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLl9tb21lbnR1bVZpZXdwb3J0RWxlbWVudCA9IHZpZXdwb3J0RWxlbWVudDtcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLl9tb21lbnR1bVN0b3BPbkNsaWNrID0gc3RvcE9uQ2xpY2s7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIENsZWFuIHVwIG9uIGRlc3Ryb3lcbiAgICBpZiAoXCJkZXN0cm95XCIgaW4gY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQuZGVzdHJveTtcbiAgICAgIGNvbXBvbmVudC5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAvLyBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0RWxlbWVudCA9IChjb21wb25lbnQgYXMgYW55KS5fbW9tZW50dW1WaWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgaGFuZGxlVG91Y2hTdGFydCk7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgaGFuZGxlVG91Y2hNb3ZlKTtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIGhhbmRsZVRvdWNoRW5kKTtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBoYW5kbGVNb3VzZURvd24pO1xuICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCBoYW5kbGVNb3VzZVVwKTtcbiAgICAgICAgICBpZiAoKGNvbXBvbmVudCBhcyBhbnkpLl9tb21lbnR1bVN0b3BPbkNsaWNrKSB7XG4gICAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNsaWNrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYW5jZWwgbW9tZW50dW0gYW5pbWF0aW9uXG4gICAgICAgIHN0b3BNb21lbnR1bSgpO1xuXG4gICAgICAgIG9yaWdpbmFsRGVzdHJveSgpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBFeHBvc2UgbW9tZW50dW0gc3RhdGUgZm9yIG90aGVyIGZlYXR1cmVzXG4gICAgKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLm1vbWVudHVtU3RhdGUgPSB7XG4gICAgICBzdG9wTW9tZW50dW0sXG4gICAgfTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9zY3JvbGxiYXIudHNcblxuLyoqXG4gKiBTY3JvbGxiYXIgRmVhdHVyZSAtIEN1c3RvbSBzY3JvbGxiYXIgaW1wbGVtZW50YXRpb25cbiAqIFByb3ZpZGVzIHZpc3VhbCBzY3JvbGwgaW5kaWNhdGlvbiBhbmQgZHJhZy10by1zY3JvbGwgZnVuY3Rpb25hbGl0eVxuICovXG5cbmltcG9ydCB0eXBlIHsgVmlld3BvcnRDb250ZXh0LCBWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgd3JhcEluaXRpYWxpemUsIHdyYXBEZXN0cm95LCBzdG9yZUZlYXR1cmVGdW5jdGlvbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBQUkVGSVgsIGFkZENsYXNzLCByZW1vdmVDbGFzcyB9IGZyb20gXCJtdHJsXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Nyb2xsYmFyQ29uZmlnIHtcbiAgZW5hYmxlZD86IGJvb2xlYW47XG4gIGF1dG9IaWRlPzogYm9vbGVhbjtcbiAgdGh1bWJNaW5IZWlnaHQ/OiBudW1iZXI7XG4gIHRodW1iQ29sb3I/OiBzdHJpbmc7XG4gIHRyYWNrQ29sb3I/OiBzdHJpbmc7XG4gIGJvcmRlclJhZGl1cz86IG51bWJlcjtcbiAgZmFkZVRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Nyb2xsYmFyQ29tcG9uZW50IHtcbiAgc2Nyb2xsYmFyOiB7XG4gICAgc2hvdzogKCkgPT4gdm9pZDtcbiAgICBoaWRlOiAoKSA9PiB2b2lkO1xuICAgIHVwZGF0ZUJvdW5kczogKHRvdGFsVmlydHVhbFNpemU6IG51bWJlciwgY29udGFpbmVyU2l6ZTogbnVtYmVyKSA9PiB2b2lkO1xuICAgIHVwZGF0ZVBvc2l0aW9uOiAoc2Nyb2xsUG9zaXRpb246IG51bWJlcikgPT4gdm9pZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBBZGRzIHNjcm9sbGJhciBmdW5jdGlvbmFsaXR5IHRvIHZpZXdwb3J0IGNvbXBvbmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFNjcm9sbGJhcihjb25maWc6IFNjcm9sbGJhckNvbmZpZyA9IHt9KSB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50PihcbiAgICBjb21wb25lbnQ6IFRcbiAgKTogVCAmIFNjcm9sbGJhckNvbXBvbmVudCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZW5hYmxlZCA9IHRydWUsXG4gICAgICBhdXRvSGlkZSA9IHRydWUsXG4gICAgICB0aHVtYk1pbkhlaWdodCA9IDI1LFxuICAgICAgYm9yZGVyUmFkaXVzID0gNCxcbiAgICAgIGZhZGVUaW1lb3V0ID0gMTAwMCxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gUmV0dXJuIG5vLW9wIGlmIGRpc2FibGVkXG4gICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jb21wb25lbnQsXG4gICAgICAgIHNjcm9sbGJhcjoge1xuICAgICAgICAgIHNob3c6ICgpID0+IHt9LFxuICAgICAgICAgIGhpZGU6ICgpID0+IHt9LFxuICAgICAgICAgIHVwZGF0ZUJvdW5kczogKCkgPT4ge30sXG4gICAgICAgICAgdXBkYXRlUG9zaXRpb246ICgpID0+IHt9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBTdGF0ZVxuICAgIGxldCB2aWV3cG9ydEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHNjcm9sbGJhclRyYWNrOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGxldCBzY3JvbGxiYXJUaHVtYjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIGxldCBpc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgbGV0IGRyYWdTdGFydFkgPSAwO1xuICAgIGxldCBkcmFnU3RhcnRTY3JvbGxQb3NpdGlvbiA9IDA7XG4gICAgbGV0IGhpZGVUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICAgIGxldCB0b3RhbFZpcnR1YWxTaXplID0gMDtcbiAgICBsZXQgY29udGFpbmVyU2l6ZSA9IDA7XG4gICAgbGV0IHRodW1iSGVpZ2h0ID0gMDtcbiAgICBsZXQgYW5pbWF0aW9uRnJhbWVJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGlzQ3Vyc29yTW9kZSA9IGZhbHNlO1xuICAgIGxldCBsb2FkZWRJdGVtc0NvdW50ID0gMDtcblxuICAgIC8vIENyZWF0ZSBzY3JvbGxiYXIgZWxlbWVudHNcbiAgICBjb25zdCBjcmVhdGVTY3JvbGxiYXJFbGVtZW50cyA9ICgpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRFbGVtZW50KSByZXR1cm47XG5cbiAgICAgIHNjcm9sbGJhclRyYWNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGFkZENsYXNzKHNjcm9sbGJhclRyYWNrLCBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSKTtcbiAgICAgIHNjcm9sbGJhclRyYWNrLnN0eWxlLmNzc1RleHQgPSBgXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICB6LWluZGV4OiAxMDtcbiAgICAgIGA7XG5cbiAgICAgIHNjcm9sbGJhclRodW1iID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgICAgYWRkQ2xhc3MoXG4gICAgICAgIHNjcm9sbGJhclRodW1iLFxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX1RIVU1CXG4gICAgICApO1xuXG4gICAgICBzY3JvbGxiYXJUcmFjay5hcHBlbmRDaGlsZChzY3JvbGxiYXJUaHVtYik7XG4gICAgICB2aWV3cG9ydEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2Nyb2xsYmFyVHJhY2spO1xuICAgIH07XG5cbiAgICAvLyBTaG93L2hpZGUgZnVuY3Rpb25zXG4gICAgY29uc3Qgc2hvdyA9ICgpID0+IHtcbiAgICAgIGlmICghc2Nyb2xsYmFyVHJhY2sgfHwgdG90YWxWaXJ0dWFsU2l6ZSA8PSBjb250YWluZXJTaXplKSByZXR1cm47XG5cbiAgICAgIGlmIChoaWRlVGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQoaGlkZVRpbWVvdXQpO1xuICAgICAgICBoaWRlVGltZW91dCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBzY3JvbGxiYXJUcmFjayxcbiAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlNDUk9MTEJBUi5DTEFTU0VTLlNDUk9MTEJBUl9WSVNJQkxFXG4gICAgICApO1xuXG4gICAgICBpZiAoYXV0b0hpZGUgJiYgIWlzRHJhZ2dpbmcpIHtcbiAgICAgICAgaGlkZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGhpZGUsIGZhZGVUaW1lb3V0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGlkZSA9ICgpID0+IHtcbiAgICAgIGlmICghc2Nyb2xsYmFyVHJhY2sgfHwgaXNEcmFnZ2luZykgcmV0dXJuO1xuICAgICAgcmVtb3ZlQ2xhc3MoXG4gICAgICAgIHNjcm9sbGJhclRyYWNrLFxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX1ZJU0lCTEVcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSBzY3JvbGxiYXIgYm91bmRzXG4gICAgY29uc3QgdXBkYXRlQm91bmRzID0gKG5ld1RvdGFsU2l6ZTogbnVtYmVyLCBuZXdDb250YWluZXJTaXplOiBudW1iZXIpID0+IHtcbiAgICAgIHRvdGFsVmlydHVhbFNpemUgPSBuZXdUb3RhbFNpemU7XG4gICAgICBjb250YWluZXJTaXplID0gbmV3Q29udGFpbmVyU2l6ZTtcblxuICAgICAgaWYgKCFzY3JvbGxiYXJUcmFjayB8fCAhc2Nyb2xsYmFyVGh1bWIpIHJldHVybjtcblxuICAgICAgY29uc3QgbmVlZHNTY3JvbGxiYXIgPSB0b3RhbFZpcnR1YWxTaXplID4gY29udGFpbmVyU2l6ZTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGJhcl0gdXBkYXRlQm91bmRzOiB0b3RhbFNpemU9JHt0b3RhbFZpcnR1YWxTaXplfSwgY29udGFpbmVyU2l6ZT0ke2NvbnRhaW5lclNpemV9LCBuZWVkc1Njcm9sbGJhcj0ke25lZWRzU2Nyb2xsYmFyfWBcbiAgICAgIC8vICk7XG4gICAgICBzY3JvbGxiYXJUcmFjay5zdHlsZS5kaXNwbGF5ID0gbmVlZHNTY3JvbGxiYXIgPyBcImJsb2NrXCIgOiBcIm5vbmVcIjtcblxuICAgICAgaWYgKG5lZWRzU2Nyb2xsYmFyKSB7XG4gICAgICAgIGxldCBzY3JvbGxSYXRpbzogbnVtYmVyO1xuXG4gICAgICAgIGlmIChpc0N1cnNvck1vZGUgJiYgbG9hZGVkSXRlbXNDb3VudCA+IDApIHtcbiAgICAgICAgICAvLyBGb3IgY3Vyc29yIG1vZGUsIHRodW1iIHNpemUgcmVwcmVzZW50cyBsb2FkZWQgY29udGVudCB2cyBlc3RpbWF0ZWQgdG90YWxcbiAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBrbm93IHRvdGFsLCB1c2UgbG9hZGVkIGl0ZW1zICogMiBhcyBlc3RpbWF0ZVxuICAgICAgICAgIGNvbnN0IGVzdGltYXRlZFRvdGFsID1cbiAgICAgICAgICAgIHRvdGFsVmlydHVhbFNpemUgPiAwID8gdG90YWxWaXJ0dWFsU2l6ZSA6IGxvYWRlZEl0ZW1zQ291bnQgKiAyO1xuICAgICAgICAgIHNjcm9sbFJhdGlvID1cbiAgICAgICAgICAgIGNvbnRhaW5lclNpemUgL1xuICAgICAgICAgICAgTWF0aC5tYXgoZXN0aW1hdGVkVG90YWwsIGxvYWRlZEl0ZW1zQ291bnQgKyBjb250YWluZXJTaXplKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBOb3JtYWwgY2FsY3VsYXRpb24gZm9yIG9mZnNldC9wYWdlIHN0cmF0ZWdpZXNcbiAgICAgICAgICBzY3JvbGxSYXRpbyA9IGNvbnRhaW5lclNpemUgLyB0b3RhbFZpcnR1YWxTaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgdGh1bWJIZWlnaHQgPSBNYXRoLm1heCh0aHVtYk1pbkhlaWdodCwgc2Nyb2xsUmF0aW8gKiBjb250YWluZXJTaXplKTtcbiAgICAgICAgc2Nyb2xsYmFyVGh1bWIuc3R5bGUuaGVpZ2h0ID0gYCR7dGh1bWJIZWlnaHR9cHhgO1xuICAgICAgICB1cGRhdGVQb3NpdGlvbihjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSB0aHVtYiBwb3NpdGlvblxuICAgIGNvbnN0IHVwZGF0ZVBvc2l0aW9uID0gKHNjcm9sbFBvczogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoIXNjcm9sbGJhclRodW1iIHx8ICFzY3JvbGxiYXJUcmFjaykgcmV0dXJuO1xuXG4gICAgICBjb25zdCBzY3JvbGxhYmxlRGlzdGFuY2UgPSB0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZTtcbiAgICAgIGlmIChzY3JvbGxhYmxlRGlzdGFuY2UgPD0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IE1hdGgubWluKFxuICAgICAgICAxLFxuICAgICAgICBNYXRoLm1heCgwLCBzY3JvbGxQb3MgLyBzY3JvbGxhYmxlRGlzdGFuY2UpXG4gICAgICApO1xuICAgICAgY29uc3QgbWF4VGh1bWJQb3NpdGlvbiA9XG4gICAgICAgIHNjcm9sbGJhclRyYWNrLmNsaWVudEhlaWdodCAtIHNjcm9sbGJhclRodW1iLmNsaWVudEhlaWdodDtcbiAgICAgIGNvbnN0IHRodW1iUG9zaXRpb24gPSBzY3JvbGxSYXRpbyAqIG1heFRodW1iUG9zaXRpb247XG5cbiAgICAgIHNjcm9sbGJhclRodW1iLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7dGh1bWJQb3NpdGlvbn1weClgO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgdHJhY2sgY2xpY2tcbiAgICBjb25zdCBoYW5kbGVUcmFja0NsaWNrID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICghc2Nyb2xsYmFyVHJhY2sgfHwgIXNjcm9sbGJhclRodW1iIHx8IGUudGFyZ2V0ID09PSBzY3JvbGxiYXJUaHVtYilcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0cmFja1JlY3QgPSBzY3JvbGxiYXJUcmFjay5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IGNsaWNrWSA9IGUuY2xpZW50WSAtIHRyYWNrUmVjdC50b3A7XG4gICAgICBjb25zdCB0aHVtYkNlbnRlclkgPSBjbGlja1kgLSB0aHVtYkhlaWdodCAvIDI7XG4gICAgICBjb25zdCBtYXhUaHVtYlBvc2l0aW9uID0gY29udGFpbmVyU2l6ZSAtIHRodW1iSGVpZ2h0O1xuICAgICAgY29uc3QgdGh1bWJQb3NpdGlvbiA9IE1hdGgubWF4KFxuICAgICAgICAwLFxuICAgICAgICBNYXRoLm1pbih0aHVtYkNlbnRlclksIG1heFRodW1iUG9zaXRpb24pXG4gICAgICApO1xuICAgICAgY29uc3Qgc2Nyb2xsUmF0aW8gPSB0aHVtYlBvc2l0aW9uIC8gbWF4VGh1bWJQb3NpdGlvbjtcbiAgICAgIGNvbnN0IHRhcmdldFNjcm9sbFBvc2l0aW9uID1cbiAgICAgICAgc2Nyb2xsUmF0aW8gKiAodG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuXG4gICAgICBjb21wb25lbnQudmlld3BvcnQ/LnNjcm9sbFRvUG9zaXRpb24odGFyZ2V0U2Nyb2xsUG9zaXRpb24pO1xuICAgIH07XG5cbiAgICAvLyBNb3VzZSBldmVudCBoYW5kbGVyc1xuICAgIGNvbnN0IGhhbmRsZVRodW1iTW91c2VEb3duID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgZHJhZ1N0YXJ0WSA9IGUuY2xpZW50WTtcbiAgICAgIGRyYWdTdGFydFNjcm9sbFBvc2l0aW9uID0gY29tcG9uZW50LnZpZXdwb3J0Py5nZXRTY3JvbGxQb3NpdGlvbigpIHx8IDA7XG5cbiAgICAgIGlmIChzY3JvbGxiYXJUcmFjaykge1xuICAgICAgICBhZGRDbGFzcyhcbiAgICAgICAgICBzY3JvbGxiYXJUcmFjayxcbiAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX0RSQUdHSU5HXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQgZHJhZyBzdGFydCBldmVudCB0byBub3RpZnkgdmlld3BvcnRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpkcmFnLXN0YXJ0XCIsIHtcbiAgICAgICAgc291cmNlOiBcInNjcm9sbGJhclwiLFxuICAgICAgICBzdGFydFBvc2l0aW9uOiBkcmFnU3RhcnRTY3JvbGxQb3NpdGlvbixcbiAgICAgIH0pO1xuXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBoYW5kbGVNb3VzZVVwKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlTW91c2VNb3ZlID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICghaXNEcmFnZ2luZyB8fCAhc2Nyb2xsYmFyVHJhY2sgfHwgIXNjcm9sbGJhclRodW1iKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGRlbHRhWSA9IGUuY2xpZW50WSAtIGRyYWdTdGFydFk7XG4gICAgICBjb25zdCB0cmFja0hlaWdodCA9IHNjcm9sbGJhclRyYWNrLmNsaWVudEhlaWdodDtcbiAgICAgIGNvbnN0IHRodW1iSGVpZ2h0ID0gc2Nyb2xsYmFyVGh1bWIuY2xpZW50SGVpZ2h0O1xuICAgICAgY29uc3QgbWF4VGh1bWJUcmF2ZWwgPSB0cmFja0hlaWdodCAtIHRodW1iSGVpZ2h0O1xuXG4gICAgICBpZiAobWF4VGh1bWJUcmF2ZWwgPD0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBkZWx0YVJhdGlvID0gZGVsdGFZIC8gbWF4VGh1bWJUcmF2ZWw7XG4gICAgICBjb25zdCBkcmFnU3RhcnRTY3JvbGxSYXRpbyA9XG4gICAgICAgIGRyYWdTdGFydFNjcm9sbFBvc2l0aW9uIC8gKHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplKTtcbiAgICAgIGNvbnN0IG5ld1Njcm9sbFJhdGlvID0gTWF0aC5tYXgoXG4gICAgICAgIDAsXG4gICAgICAgIE1hdGgubWluKDEsIGRyYWdTdGFydFNjcm9sbFJhdGlvICsgZGVsdGFSYXRpbylcbiAgICAgICk7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aHVtYiBwb3NpdGlvbiBpbW1lZGlhdGVseVxuICAgICAgY29uc3QgdGh1bWJQb3NpdGlvbiA9IG5ld1Njcm9sbFJhdGlvICogbWF4VGh1bWJUcmF2ZWw7XG4gICAgICBzY3JvbGxiYXJUaHVtYi5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke3RodW1iUG9zaXRpb259cHgpYDtcblxuICAgICAgLy8gQ2FsY3VsYXRlIG5ldyBzY3JvbGwgcG9zaXRpb25cbiAgICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gbmV3U2Nyb2xsUmF0aW8gKiAodG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuICAgICAgbGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uID0gbmV3UG9zaXRpb247XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGJhcl0gTW91c2UgbW92ZTogbmV3UG9zPSR7bmV3UG9zaXRpb24udG9GaXhlZChcbiAgICAgIC8vICAgICAwXG4gICAgICAvLyAgICl9LCBhbmltYXRpb25GcmFtZUlkPSR7YW5pbWF0aW9uRnJhbWVJZH1gXG4gICAgICAvLyApO1xuXG4gICAgICAvLyBUaHJvdHRsZSB2aWV3cG9ydCB1cGRhdGVzXG4gICAgICBpZiAoYW5pbWF0aW9uRnJhbWVJZCA9PT0gbnVsbCAmJiBjb21wb25lbnQudmlld3BvcnQpIHtcbiAgICAgICAgYW5pbWF0aW9uRnJhbWVJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW1Njcm9sbGJhcl0gUkFGIGNhbGxiYWNrOiBzY3JvbGxpbmcgdG8gJHtsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb259YFxuICAgICAgICAgIC8vICk7XG4gICAgICAgICAgaWYgKGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbiAhPT0gbnVsbCAmJiBjb21wb25lbnQudmlld3BvcnQpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb1Bvc2l0aW9uKGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFuaW1hdGlvbkZyYW1lSWQgPSBudWxsO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlTW91c2VVcCA9ICgpID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1Njcm9sbGJhcl0gTW91c2UgdXAgLSBlbmRpbmcgZHJhZ1wiKTtcbiAgICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcblxuICAgICAgaWYgKGFuaW1hdGlvbkZyYW1lSWQgIT09IG51bGwpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoYW5pbWF0aW9uRnJhbWVJZCk7XG4gICAgICAgIGFuaW1hdGlvbkZyYW1lSWQgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAobGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uICE9PSBudWxsICYmIGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9Qb3NpdGlvbihsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb24pO1xuICAgICAgICBsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb24gPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2Nyb2xsYmFyVHJhY2spIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3MoXG4gICAgICAgICAgc2Nyb2xsYmFyVHJhY2ssXG4gICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlNDUk9MTEJBUi5DTEFTU0VTLlNDUk9MTEJBUl9EUkFHR0lOR1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBFbWl0IGRyYWcgZW5kIGV2ZW50XG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6ZHJhZy1lbmRcIiwge1xuICAgICAgICBzb3VyY2U6IFwic2Nyb2xsYmFyXCIsXG4gICAgICAgIGVuZFBvc2l0aW9uOiBjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMCxcbiAgICAgIH0pO1xuXG4gICAgICBoaWRlKCk7XG5cbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXplIGZ1bmN0aW9uXG4gICAgY29uc3QgaW5pdGlhbGl6ZSA9ICgpID0+IHtcbiAgICAgIGlmIChpc0luaXRpYWxpemVkKSByZXR1cm47XG5cbiAgICAgIHZpZXdwb3J0RWxlbWVudCA9IGNvbXBvbmVudC5lbGVtZW50Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBgLiR7UFJFRklYfS12aWV3cG9ydGBcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgIGlmICghdmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIltTY3JvbGxiYXJdIE5vIHZpZXdwb3J0IGVsZW1lbnQgZm91bmRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICB2aWV3cG9ydEVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBgLiR7UFJFRklYfS0ke1ZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJ9YFxuICAgICAgICApXG4gICAgICApXG4gICAgICAgIHJldHVybjtcblxuICAgICAgY3JlYXRlU2Nyb2xsYmFyRWxlbWVudHMoKTtcbiAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgICBpZiAoc2Nyb2xsYmFyVHJhY2sgJiYgdmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgIHNjcm9sbGJhclRyYWNrLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVUcmFja0NsaWNrKTtcblxuICAgICAgICBpZiAoc2Nyb2xsYmFyVGh1bWIpIHtcbiAgICAgICAgICBzY3JvbGxiYXJUaHVtYi5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGhhbmRsZVRodW1iTW91c2VEb3duKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VlbnRlclwiLCBzaG93LCB7IHBhc3NpdmU6IHRydWUgfSk7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgIFwibW91c2VsZWF2ZVwiLFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIGlmICghaXNEcmFnZ2luZykgaGlkZSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBwYXNzaXZlOiB0cnVlIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIGN1cnJlbnQgdmlld3BvcnQgc3RhdGVcbiAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQpIHtcbiAgICAgICAgY29uc3QgaW5mbyA9IGNvbXBvbmVudC52aWV3cG9ydC5nZXRWaWV3cG9ydEluZm8oKTtcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9IGluZm8udG90YWxWaXJ0dWFsU2l6ZTtcbiAgICAgICAgY29udGFpbmVyU2l6ZSA9IGluZm8uY29udGFpbmVyU2l6ZTtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBpbiBjdXJzb3IgbW9kZVxuICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb247XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0Q29uZmlnID0gKGNvbXBvbmVudCBhcyBhbnkpLmNvbmZpZztcbiAgICAgICAgaXNDdXJzb3JNb2RlID0gdmlld3BvcnRDb25maWc/LnBhZ2luYXRpb24/LnN0cmF0ZWd5ID09PSBcImN1cnNvclwiO1xuXG4gICAgICAgIHVwZGF0ZUJvdW5kcyh0b3RhbFZpcnR1YWxTaXplLCBjb250YWluZXJTaXplKTtcbiAgICAgICAgdXBkYXRlUG9zaXRpb24oY29tcG9uZW50LnZpZXdwb3J0LmdldFNjcm9sbFBvc2l0aW9uKCkpO1xuICAgICAgfVxuXG4gICAgICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6c2Nyb2xsXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFpc0RyYWdnaW5nKSB7XG4gICAgICAgICAgdXBkYXRlUG9zaXRpb24oZGF0YS5wb3NpdGlvbik7XG4gICAgICAgICAgc2hvdygpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDp2aXJ0dWFsLXNpemUtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRvdGFsVmlydHVhbFNpemUgPSBkYXRhLnRvdGFsVmlydHVhbFNpemU7XG4gICAgICAgIHVwZGF0ZUJvdW5kcyhkYXRhLnRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6Y29udGFpbmVyLXNpemUtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnRhaW5lclNpemUgPSBkYXRhLmNvbnRhaW5lclNpemU7XG4gICAgICAgIHVwZGF0ZUJvdW5kcyh0b3RhbFZpcnR1YWxTaXplLCBkYXRhLmNvbnRhaW5lclNpemUpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgaXRlbXMgbG9hZGVkIHRvIHVwZGF0ZSBzY3JvbGxiYXIgaW4gY3Vyc29yIG1vZGVcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6aXRlbXMtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChpc0N1cnNvck1vZGUpIHtcbiAgICAgICAgICBsb2FkZWRJdGVtc0NvdW50ID0gZGF0YS5sb2FkZWRDb3VudCB8fCAwO1xuICAgICAgICAgIHVwZGF0ZUJvdW5kcyh0b3RhbFZpcnR1YWxTaXplLCBjb250YWluZXJTaXplKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgdG90YWwgaXRlbXMgY2hhbmdlcyAoaW1wb3J0YW50IGZvciBjdXJzb3IgbW9kZSlcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChpc0N1cnNvck1vZGUgJiYgZGF0YS50b3RhbCkge1xuICAgICAgICAgIC8vIEluIGN1cnNvciBtb2RlLCB0aGUgdG90YWwgaXMgZHluYW1pY1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYFtTY3JvbGxiYXJdIEN1cnNvciBtb2RlOiB1cGRhdGluZyBib3VuZHMgZm9yIG5ldyB0b3RhbCAke2RhdGEudG90YWx9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgdXBkYXRlQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gU3RvcmUgaW5pdGlhbGl6ZSBmdW5jdGlvblxuICAgIHN0b3JlRmVhdHVyZUZ1bmN0aW9uKGNvbXBvbmVudCwgXCJfc2Nyb2xsYmFySW5pdGlhbGl6ZVwiLCBpbml0aWFsaXplKTtcblxuICAgIC8vIEhvb2sgaW50byB2aWV3cG9ydCBpbml0aWFsaXphdGlvblxuICAgIHdyYXBJbml0aWFsaXplKGNvbXBvbmVudCwgaW5pdGlhbGl6ZSk7XG5cbiAgICAvLyBDbGVhbnVwXG4gICAgY29uc3QgZGVzdHJveSA9ICgpID0+IHtcbiAgICAgIGlmIChzY3JvbGxiYXJUcmFjaykge1xuICAgICAgICBzY3JvbGxiYXJUcmFjay5yZW1vdmUoKTtcbiAgICAgICAgc2Nyb2xsYmFyVHJhY2sgPSBudWxsO1xuICAgICAgfVxuICAgICAgc2Nyb2xsYmFyVGh1bWIgPSBudWxsO1xuICAgICAgdmlld3BvcnRFbGVtZW50ID0gbnVsbDtcbiAgICAgIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAgICAgaWYgKGhpZGVUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dChoaWRlVGltZW91dCk7XG4gICAgICAgIGhpZGVUaW1lb3V0ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgaGFuZGxlTW91c2VVcCk7XG4gICAgfTtcblxuICAgIHN0b3JlRmVhdHVyZUZ1bmN0aW9uKGNvbXBvbmVudCwgXCJfc2Nyb2xsYmFyRGVzdHJveVwiLCBkZXN0cm95KTtcbiAgICB3cmFwRGVzdHJveShjb21wb25lbnQsIGRlc3Ryb3kpO1xuXG4gICAgLy8gUmV0dXJuIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBzY3JvbGxiYXI6IHsgc2hvdywgaGlkZSwgdXBkYXRlQm91bmRzLCB1cGRhdGVQb3NpdGlvbiB9LFxuICAgIH07XG4gIH07XG59XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2NvbGxlY3Rpb24udHNcblxuLyoqXG4gKiBDb2xsZWN0aW9uIEZlYXR1cmUgLSBEYXRhIG1hbmFnZW1lbnQgYW5kIHJhbmdlIGxvYWRpbmdcbiAqIEhhbmRsZXMgY29sbGVjdGlvbiBpbnRlZ3JhdGlvbiwgcGFnaW5hdGlvbiwgYW5kIGRhdGEgZmV0Y2hpbmdcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHdyYXBEZXN0cm95IH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0aW9uQ29uZmlnIHtcbiAgY29sbGVjdGlvbj86IGFueTsgLy8gQ29sbGVjdGlvbiBhZGFwdGVyXG4gIHJhbmdlU2l6ZT86IG51bWJlcjsgLy8gRGVmYXVsdCByYW5nZSBzaXplIGZvciBsb2FkaW5nXG4gIHN0cmF0ZWd5PzogXCJvZmZzZXRcIiB8IFwicGFnZVwiIHwgXCJjdXJzb3JcIjsgLy8gTG9hZGluZyBzdHJhdGVneVxuICB0cmFuc2Zvcm0/OiAoaXRlbTogYW55KSA9PiBhbnk7IC8vIEl0ZW0gdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25cbiAgY2FuY2VsTG9hZFRocmVzaG9sZD86IG51bWJlcjsgLy8gVmVsb2NpdHkgdGhyZXNob2xkIGZvciBjYW5jZWxsaW5nIGxvYWRzXG4gIG1heENvbmN1cnJlbnRSZXF1ZXN0cz86IG51bWJlcjtcbiAgZW5hYmxlUmVxdWVzdFF1ZXVlPzogYm9vbGVhbjtcbiAgbWF4UXVldWVTaXplPzogbnVtYmVyO1xuICBsb2FkT25EcmFnRW5kPzogYm9vbGVhbjsgLy8gRW5hYmxlIGxvYWRpbmcgd2hlbiBkcmFnIGVuZHMgKHNhZmV0eSBtZWFzdXJlKVxuICBpbml0aWFsU2Nyb2xsSW5kZXg/OiBudW1iZXI7IC8vIEluaXRpYWwgc2Nyb2xsIHBvc2l0aW9uICgwLWJhc2VkIGluZGV4KVxuICBzZWxlY3RJZD86IHN0cmluZyB8IG51bWJlcjsgLy8gSUQgb2YgaXRlbSB0byBzZWxlY3QgYWZ0ZXIgaW5pdGlhbCBsb2FkIGNvbXBsZXRlc1xuICBhdXRvTG9hZD86IGJvb2xlYW47IC8vIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBsb2FkIGRhdGEgb24gaW5pdGlhbGl6YXRpb24gKGRlZmF1bHQ6IHRydWUpXG4gIGF1dG9TZWxlY3RGaXJzdD86IGJvb2xlYW47IC8vIEF1dG9tYXRpY2FsbHkgc2VsZWN0IGZpcnN0IGl0ZW0gYWZ0ZXIgaW5pdGlhbCBsb2FkIChkZWZhdWx0OiBmYWxzZSlcbiAgLyoqIE1heGltdW0gaXRlbXMgdG8ga2VlcCBpbiBtZW1vcnkgKGRlZmF1bHQ6IDEwMDApICovXG4gIG1heENhY2hlZEl0ZW1zPzogbnVtYmVyO1xuICAvKiogRXh0cmEgaXRlbXMgdG8ga2VlcCBhcm91bmQgdmlzaWJsZSByYW5nZSBkdXJpbmcgZXZpY3Rpb24gKGRlZmF1bHQ6IDE1MCkgKi9cbiAgZXZpY3Rpb25CdWZmZXI/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGlvbkNvbXBvbmVudCB7XG4gIGNvbGxlY3Rpb246IHtcbiAgICBsb2FkUmFuZ2U6IChvZmZzZXQ6IG51bWJlciwgbGltaXQ6IG51bWJlcikgPT4gUHJvbWlzZTxhbnlbXT47XG4gICAgbG9hZE1pc3NpbmdSYW5nZXM6IChcbiAgICAgIHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sXG4gICAgICBjYWxsZXI/OiBzdHJpbmcsXG4gICAgKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIGdldExvYWRlZFJhbmdlczogKCkgPT4gU2V0PG51bWJlcj47XG4gICAgZ2V0UGVuZGluZ1JhbmdlczogKCkgPT4gU2V0PG51bWJlcj47XG4gICAgY2xlYXJGYWlsZWRSYW5nZXM6ICgpID0+IHZvaWQ7XG4gICAgcmV0cnlGYWlsZWRSYW5nZTogKHJhbmdlSWQ6IG51bWJlcikgPT4gUHJvbWlzZTxhbnlbXT47XG4gICAgc2V0VG90YWxJdGVtczogKHRvdGFsOiBudW1iZXIpID0+IHZvaWQ7XG4gICAgZ2V0VG90YWxJdGVtczogKCkgPT4gbnVtYmVyO1xuICAgIC8vIEN1cnNvci1zcGVjaWZpYyBtZXRob2RzXG4gICAgZ2V0Q3VycmVudEN1cnNvcjogKCkgPT4gc3RyaW5nIHwgbnVsbDtcbiAgICBnZXRDdXJzb3JGb3JQYWdlOiAocGFnZTogbnVtYmVyKSA9PiBzdHJpbmcgfCBudWxsO1xuICAgIC8vIFJlc2V0IG1ldGhvZCBmb3IgcmVsb2FkIGZ1bmN0aW9uYWxpdHlcbiAgICByZXNldDogKCkgPT4gdm9pZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBBZGRzIGNvbGxlY3Rpb24gZnVuY3Rpb25hbGl0eSB0byB2aWV3cG9ydCBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhDb2xsZWN0aW9uKGNvbmZpZzogQ29sbGVjdGlvbkNvbmZpZyA9IHt9KSB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50PihcbiAgICBjb21wb25lbnQ6IFQsXG4gICk6IFQgJiBDb2xsZWN0aW9uQ29tcG9uZW50ID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBjb2xsZWN0aW9uLFxuICAgICAgcmFuZ2VTaXplID0gVklFV1BPUlRfQ09OU1RBTlRTLkxPQURJTkcuREVGQVVMVF9SQU5HRV9TSVpFLFxuICAgICAgc3RyYXRlZ3kgPSBcIm9mZnNldFwiLFxuICAgICAgdHJhbnNmb3JtLFxuICAgICAgY2FuY2VsTG9hZFRocmVzaG9sZCA9IFZJRVdQT1JUX0NPTlNUQU5UUy5MT0FESU5HLkNBTkNFTF9USFJFU0hPTEQsXG4gICAgICBtYXhDb25jdXJyZW50UmVxdWVzdHMgPSBWSUVXUE9SVF9DT05TVEFOVFMuTE9BRElOR1xuICAgICAgICAuTUFYX0NPTkNVUlJFTlRfUkVRVUVTVFMsXG4gICAgICBlbmFibGVSZXF1ZXN0UXVldWUgPSBWSUVXUE9SVF9DT05TVEFOVFMuUkVRVUVTVF9RVUVVRS5FTkFCTEVELFxuICAgICAgbWF4UXVldWVTaXplID0gVklFV1BPUlRfQ09OU1RBTlRTLlJFUVVFU1RfUVVFVUUuTUFYX1FVRVVFX1NJWkUsXG4gICAgICBsb2FkT25EcmFnRW5kID0gdHJ1ZSwgLy8gRGVmYXVsdCB0byB0cnVlIGFzIHNhZmV0eSBtZWFzdXJlXG4gICAgICBpbml0aWFsU2Nyb2xsSW5kZXggPSAwLCAvLyBTdGFydCBmcm9tIGJlZ2lubmluZyBieSBkZWZhdWx0XG4gICAgICBzZWxlY3RJZCwgLy8gSUQgb2YgaXRlbSB0byBzZWxlY3QgYWZ0ZXIgaW5pdGlhbCBsb2FkXG4gICAgICBhdXRvTG9hZCA9IHRydWUsIC8vIEF1dG8tbG9hZCBpbml0aWFsIGRhdGEgYnkgZGVmYXVsdFxuICAgICAgYXV0b1NlbGVjdEZpcnN0ID0gZmFsc2UsIC8vIEF1dG9tYXRpY2FsbHkgc2VsZWN0IGZpcnN0IGl0ZW0gYWZ0ZXIgaW5pdGlhbCBsb2FkXG4gICAgICBtYXhDYWNoZWRJdGVtcyA9IDEwMDAsIC8vIE1heGltdW0gaXRlbXMgdG8ga2VlcCBpbiBtZW1vcnlcbiAgICAgIGV2aWN0aW9uQnVmZmVyID0gMTUwLCAvLyBFeHRyYSBpdGVtcyB0byBrZWVwIGFyb3VuZCB2aXNpYmxlIHJhbmdlXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIFRyYWNrIGlmIHdlJ3ZlIGNvbXBsZXRlZCB0aGUgaW5pdGlhbCBsb2FkIGZvciBpbml0aWFsU2Nyb2xsSW5kZXhcbiAgICAvLyBUaGlzIHByZXZlbnRzIHRoZSB2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkIGxpc3RlbmVyIGZyb20gbG9hZGluZyBwYWdlIDFcbiAgICBsZXQgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IGZhbHNlO1xuICAgIGNvbnN0IGhhc0luaXRpYWxTY3JvbGxJbmRleCA9IGluaXRpYWxTY3JvbGxJbmRleCA+IDA7XG5cbiAgICAvLyBjb25zb2xlLmxvZyhcIltWaWV3cG9ydCBDb2xsZWN0aW9uXSBJbml0aWFsaXplZCB3aXRoIGNvbmZpZzpcIiwge1xuICAgIC8vICAgc3RyYXRlZ3ksXG4gICAgLy8gICByYW5nZVNpemUsXG4gICAgLy8gICBpbml0aWFsU2Nyb2xsSW5kZXgsXG4gICAgLy8gfSk7XG5cbiAgICAvLyBMb2FkaW5nIG1hbmFnZXIgc3RhdGVcbiAgICBpbnRlcmZhY2UgUXVldWVkUmVxdWVzdCB7XG4gICAgICByYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9O1xuICAgICAgcHJpb3JpdHk6IFwiaGlnaFwiIHwgXCJub3JtYWxcIiB8IFwibG93XCI7XG4gICAgICB0aW1lc3RhbXA6IG51bWJlcjtcbiAgICAgIHJlc29sdmU6ICgpID0+IHZvaWQ7XG4gICAgICByZWplY3Q6IChlcnJvcjogYW55KSA9PiB2b2lkO1xuICAgICAgY2FsbGVyPzogc3RyaW5nO1xuICAgIH1cblxuICAgIC8vIFN0YXRlIHRyYWNraW5nXG4gICAgbGV0IGN1cnJlbnRWZWxvY2l0eSA9IDA7XG4gICAgbGV0IGFjdGl2ZUxvYWRDb3VudCA9IDA7XG4gICAgbGV0IGNvbXBsZXRlZExvYWRzID0gMDtcbiAgICBsZXQgZmFpbGVkTG9hZHMgPSAwO1xuICAgIGxldCBjYW5jZWxsZWRMb2FkcyA9IDA7XG4gICAgbGV0IGlzRHJhZ2dpbmcgPSBmYWxzZTsgLy8gVHJhY2sgZHJhZyBzdGF0ZVxuXG4gICAgLy8gQ2FjaGUgZXZpY3Rpb24gY29uZmlndXJhdGlvbiAoZnJvbSBjb25maWcpXG4gICAgY29uc3QgTUFYX0NBQ0hFRF9JVEVNUyA9IG1heENhY2hlZEl0ZW1zO1xuICAgIGNvbnN0IEVWSUNUSU9OX0JVRkZFUiA9IGV2aWN0aW9uQnVmZmVyO1xuXG4gICAgLy8gTWVtb3J5IGRpYWdub3N0aWNzXG4gICAgY29uc3QgbG9nTWVtb3J5U3RhdHMgPSAoY2FsbGVyOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1Db3VudCA9IGl0ZW1zLmZpbHRlcihCb29sZWFuKS5sZW5ndGg7XG4gICAgICBjb25zdCBsb2FkZWRSYW5nZUNvdW50ID0gbG9hZGVkUmFuZ2VzLnNpemU7XG4gICAgICBjb25zdCBwZW5kaW5nUmFuZ2VDb3VudCA9IHBlbmRpbmdSYW5nZXMuc2l6ZTtcbiAgICAgIGNvbnN0IGFib3J0Q29udHJvbGxlckNvdW50ID0gYWJvcnRDb250cm9sbGVycy5zaXplO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBFdmljdCBpdGVtcyBmYXIgZnJvbSB0aGUgY3VycmVudCB2aXNpYmxlIHJhbmdlIHRvIHByZXZlbnQgbWVtb3J5IGJsb2F0XG4gICAgICogS2VlcHMgaXRlbXMgd2l0aGluIEVWSUNUSU9OX0JVRkZFUiBvZiB0aGUgdmlzaWJsZSByYW5nZVxuICAgICAqL1xuICAgIGNvbnN0IGV2aWN0RGlzdGFudEl0ZW1zID0gKHZpc2libGVTdGFydDogbnVtYmVyLCB2aXNpYmxlRW5kOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1Db3VudCA9IGl0ZW1zLmZpbHRlcihCb29sZWFuKS5sZW5ndGg7XG5cbiAgICAgIC8vIE9ubHkgZXZpY3QgaWYgd2UgaGF2ZSBtb3JlIHRoYW4gTUFYX0NBQ0hFRF9JVEVNU1xuICAgICAgaWYgKGl0ZW1Db3VudCA8PSBNQVhfQ0FDSEVEX0lURU1TKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2VlcFN0YXJ0ID0gTWF0aC5tYXgoMCwgdmlzaWJsZVN0YXJ0IC0gRVZJQ1RJT05fQlVGRkVSKTtcbiAgICAgIGNvbnN0IGtlZXBFbmQgPSB2aXNpYmxlRW5kICsgRVZJQ1RJT05fQlVGRkVSO1xuXG4gICAgICBsZXQgZXZpY3RlZENvdW50ID0gMDtcbiAgICAgIGNvbnN0IHJhbmdlc1RvUmVtb3ZlID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgICAgIC8vIEZpbmQgaXRlbXMgdG8gZXZpY3QgYW5kIHRyYWNrIHdoaWNoIHJhbmdlcyBhcmUgYWZmZWN0ZWRcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGl0ZW1zW2ldICE9PSB1bmRlZmluZWQgJiYgKGkgPCBrZWVwU3RhcnQgfHwgaSA+IGtlZXBFbmQpKSB7XG4gICAgICAgICAgZGVsZXRlIGl0ZW1zW2ldO1xuICAgICAgICAgIGV2aWN0ZWRDb3VudCsrO1xuICAgICAgICAgIC8vIE1hcmsgdGhlIHJhbmdlIGNvbnRhaW5pbmcgdGhpcyBpdGVtIGZvciByZW1vdmFsIGZyb20gbG9hZGVkUmFuZ2VzXG4gICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoZSByYW5nZSB3aWxsIGJlIHJlbG9hZGVkIHdoZW4gc2Nyb2xsaW5nIGJhY2tcbiAgICAgICAgICBjb25zdCBhZmZlY3RlZFJhbmdlSWQgPSBNYXRoLmZsb29yKGkgLyByYW5nZVNpemUpO1xuICAgICAgICAgIHJhbmdlc1RvUmVtb3ZlLmFkZChhZmZlY3RlZFJhbmdlSWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSBhbGwgcmFuZ2VzIHRoYXQgaGFkIGFueSBpdGVtcyBldmljdGVkXG4gICAgICAvLyBUaGlzIGlzIGNyaXRpY2FsOiBldmVuIGlmIG9ubHkgcGFydCBvZiBhIHJhbmdlIHdhcyBldmljdGVkLFxuICAgICAgLy8gd2UgbXVzdCByZW1vdmUgaXQgZnJvbSBsb2FkZWRSYW5nZXMgc28gaXQgZ2V0cyByZWxvYWRlZFxuICAgICAgLy8gQWxzbyByZW1vdmUgZnJvbSBwZW5kaW5nUmFuZ2VzIC0gaWYgYSBzbG93IHJlcXVlc3QgY29tcGxldGVzIGZvciBhbiBldmljdGVkIHJhbmdlLFxuICAgICAgLy8gd2UgZG9uJ3Qgd2FudCBpdCB0byBibG9jayBmdXR1cmUgbG9hZHMgd2hlbiB1c2VyIHNjcm9sbHMgYmFja1xuICAgICAgcmFuZ2VzVG9SZW1vdmUuZm9yRWFjaCgocmFuZ2VJZCkgPT4ge1xuICAgICAgICBsb2FkZWRSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICBwZW5kaW5nUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgLy8gQ2xlYW4gdXAgYWN0aXZlIHJlcXVlc3RzIHRyYWNraW5nXG4gICAgICAgIGFjdGl2ZVJlcXVlc3RzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgLy8gQWxzbyBhYm9ydCBhbnkgaW4tZmxpZ2h0IHJlcXVlc3QgZm9yIHRoaXMgcmFuZ2UgdG8gZnJlZSB1cCBuZXR3b3JrIHJlc291cmNlc1xuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gYWJvcnRDb250cm9sbGVycy5nZXQocmFuZ2VJZCk7XG4gICAgICAgIGlmIChjb250cm9sbGVyKSB7XG4gICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgIGFib3J0Q29udHJvbGxlcnMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGV2aWN0ZWRDb3VudCA+IDApIHtcbiAgICAgICAgLy8gRW1pdCBldmVudCBmb3IgcmVuZGVyaW5nIHRvIGFsc28gY2xlYW4gdXBcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImNvbGxlY3Rpb246aXRlbXMtZXZpY3RlZFwiLCB7XG4gICAgICAgICAga2VlcFN0YXJ0LFxuICAgICAgICAgIGtlZXBFbmQsXG4gICAgICAgICAgZXZpY3RlZENvdW50LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgYWN0aXZlTG9hZFJhbmdlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGxldCBsb2FkUmVxdWVzdFF1ZXVlOiBRdWV1ZWRSZXF1ZXN0W10gPSBbXTtcblxuICAgIC8vIEFib3J0Q29udHJvbGxlciBtYXAgZm9yIGNhbmNlbGxpbmcgaW4tZmxpZ2h0IHJlcXVlc3RzXG4gICAgY29uc3QgYWJvcnRDb250cm9sbGVycyA9IG5ldyBNYXA8bnVtYmVyLCBBYm9ydENvbnRyb2xsZXI+KCk7XG5cbiAgICAvLyBTdGF0ZVxuICAgIGxldCBpdGVtczogYW55W10gPSBbXTtcbiAgICBsZXQgdG90YWxJdGVtcyA9IDA7XG4gICAgbGV0IGxvYWRlZFJhbmdlcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgIGxldCBwZW5kaW5nUmFuZ2VzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgbGV0IGZhaWxlZFJhbmdlcyA9IG5ldyBNYXA8XG4gICAgICBudW1iZXIsXG4gICAgICB7XG4gICAgICAgIGF0dGVtcHRzOiBudW1iZXI7XG4gICAgICAgIGxhc3RFcnJvcjogRXJyb3I7XG4gICAgICAgIHRpbWVzdGFtcDogbnVtYmVyO1xuICAgICAgfVxuICAgID4oKTtcbiAgICBsZXQgYWN0aXZlUmVxdWVzdHMgPSBuZXcgTWFwPG51bWJlciwgUHJvbWlzZTxhbnlbXT4+KCk7XG5cbiAgICAvLyBDdXJzb3IgcGFnaW5hdGlvbiBzdGF0ZVxuICAgIGxldCBjdXJyZW50Q3Vyc29yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgY3Vyc29yTWFwID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTsgLy8gTWFwIHBhZ2UgbnVtYmVyIHRvIGN1cnNvclxuICAgIGxldCBwYWdlVG9PZmZzZXRNYXAgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpOyAvLyBNYXAgcGFnZSB0byBhY3R1YWwgb2Zmc2V0XG4gICAgbGV0IGhpZ2hlc3RMb2FkZWRQYWdlID0gMDtcbiAgICBsZXQgZGlzY292ZXJlZFRvdGFsOiBudW1iZXIgfCBudWxsID0gbnVsbDsgLy8gVHJhY2sgZGlzY292ZXJlZCB0b3RhbCBmcm9tIEFQSVxuICAgIGxldCBoYXNSZWFjaGVkRW5kID0gZmFsc2U7IC8vIFRyYWNrIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiBkYXRhXG5cbiAgICAvLyBTaGFyZSBpdGVtcyBhcnJheSB3aXRoIGNvbXBvbmVudFxuICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuXG4gICAgLyoqXG4gICAgICogR2V0IGEgdW5pcXVlIElEIGZvciBhIHJhbmdlIGJhc2VkIG9uIG9mZnNldCBhbmQgdGhlIGJhc2UgcmFuZ2Ugc2l6ZVxuICAgICAqL1xuICAgIGNvbnN0IGdldFJhbmdlSWQgPSAob2Zmc2V0OiBudW1iZXIsIGxpbWl0OiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgICAgLy8gQWx3YXlzIHVzZSB0aGUgYmFzZSByYW5nZVNpemUgZm9yIGNvbnNpc3RlbnQgSURzXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgbWVyZ2VkIHJhbmdlcyBjYW4gYmUgdHJhY2tlZCBwcm9wZXJseVxuICAgICAgcmV0dXJuIE1hdGguZmxvb3Iob2Zmc2V0IC8gcmFuZ2VTaXplKTtcbiAgICB9O1xuXG4gICAgLy8gTG9hZGluZyBtYW5hZ2VyIGhlbHBlcnNcbiAgICBjb25zdCBnZXRSYW5nZUtleSA9IChyYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9KTogc3RyaW5nID0+IHtcbiAgICAgIHJldHVybiBgJHtyYW5nZS5zdGFydH0tJHtyYW5nZS5lbmR9YDtcbiAgICB9O1xuXG4gICAgY29uc3QgY2FuTG9hZCA9ICgpOiBib29sZWFuID0+IHtcbiAgICAgIHJldHVybiBjdXJyZW50VmVsb2NpdHkgPD0gY2FuY2VsTG9hZFRocmVzaG9sZDtcbiAgICB9O1xuXG4gICAgY29uc3QgcHJvY2Vzc1F1ZXVlID0gKCkgPT4ge1xuICAgICAgaWYgKCFlbmFibGVSZXF1ZXN0UXVldWUgfHwgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgLy8gU29ydCBxdWV1ZSBieSBwcmlvcml0eSBhbmQgdGltZXN0YW1wXG4gICAgICBsb2FkUmVxdWVzdFF1ZXVlLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgcHJpb3JpdHlPcmRlciA9IHsgaGlnaDogMCwgbm9ybWFsOiAxLCBsb3c6IDIgfTtcbiAgICAgICAgY29uc3QgcHJpb3JpdHlEaWZmID1cbiAgICAgICAgICBwcmlvcml0eU9yZGVyW2EucHJpb3JpdHldIC0gcHJpb3JpdHlPcmRlcltiLnByaW9yaXR5XTtcbiAgICAgICAgcmV0dXJuIHByaW9yaXR5RGlmZiAhPT0gMCA/IHByaW9yaXR5RGlmZiA6IGEudGltZXN0YW1wIC0gYi50aW1lc3RhbXA7XG4gICAgICB9KTtcblxuICAgICAgLy8gUHJvY2VzcyByZXF1ZXN0cyB1cCB0byBjYXBhY2l0eVxuICAgICAgd2hpbGUgKFxuICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgYWN0aXZlTG9hZENvdW50IDwgbWF4Q29uY3VycmVudFJlcXVlc3RzXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGxvYWRSZXF1ZXN0UXVldWUuc2hpZnQoKTtcbiAgICAgICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgICAgICBleGVjdXRlUXVldWVkTG9hZChyZXF1ZXN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBleGVjdXRlUXVldWVkTG9hZCA9IChyZXF1ZXN0OiBRdWV1ZWRSZXF1ZXN0KSA9PiB7XG4gICAgICBhY3RpdmVMb2FkQ291bnQrKztcbiAgICAgIGFjdGl2ZUxvYWRSYW5nZXMuYWRkKGdldFJhbmdlS2V5KHJlcXVlc3QucmFuZ2UpKTtcblxuICAgICAgLy8gQ2FsbCB0aGUgYWN0dWFsIGxvYWRNaXNzaW5nUmFuZ2VzIGZ1bmN0aW9uXG4gICAgICBsb2FkTWlzc2luZ1Jhbmdlc0ludGVybmFsKHJlcXVlc3QucmFuZ2UsIHJlcXVlc3QuY2FsbGVyKVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmVxdWVzdC5yZXNvbHZlKCk7XG4gICAgICAgICAgY29tcGxldGVkTG9hZHMrKztcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICByZXF1ZXN0LnJlamVjdChlcnJvcik7XG4gICAgICAgICAgZmFpbGVkTG9hZHMrKztcbiAgICAgICAgfSlcbiAgICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgIGFjdGl2ZUxvYWRDb3VudC0tO1xuICAgICAgICAgIGFjdGl2ZUxvYWRSYW5nZXMuZGVsZXRlKGdldFJhbmdlS2V5KHJlcXVlc3QucmFuZ2UpKTtcbiAgICAgICAgICBwcm9jZXNzUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybSBpdGVtcyBpZiB0cmFuc2Zvcm0gZnVuY3Rpb24gcHJvdmlkZWRcbiAgICAgKi9cbiAgICBjb25zdCB0cmFuc2Zvcm1JdGVtcyA9IChyYXdJdGVtczogYW55W10pOiBhbnlbXSA9PiB7XG4gICAgICBpZiAoIXRyYW5zZm9ybSkgcmV0dXJuIHJhd0l0ZW1zO1xuICAgICAgcmV0dXJuIHJhd0l0ZW1zLm1hcCh0cmFuc2Zvcm0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGEgcmFuZ2Ugb2YgZGF0YVxuICAgICAqL1xuICAgIGNvbnN0IGxvYWRSYW5nZSA9IGFzeW5jIChvZmZzZXQ6IG51bWJlciwgbGltaXQ6IG51bWJlcik6IFByb21pc2U8YW55W10+ID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIGxvYWRSYW5nZSBjYWxsZWQ6IG9mZnNldD0ke29mZnNldH0sIGxpbWl0PSR7bGltaXR9YCxcbiAgICAgIC8vICk7XG5cbiAgICAgIGlmICghY29sbGVjdGlvbikge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbQ29sbGVjdGlvbl0gTm8gY29sbGVjdGlvbiBhZGFwdGVyIGNvbmZpZ3VyZWRcIik7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmFuZ2VJZCA9IGdldFJhbmdlSWQob2Zmc2V0LCBsaW1pdCk7XG4gICAgICAvLyBjb25zb2xlLmxvZyhgW0NvbGxlY3Rpb25dIFJhbmdlIElEOiAke3JhbmdlSWR9YCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgbG9hZGVkXG4gICAgICBpZiAobG9hZGVkUmFuZ2VzLmhhcyhyYW5nZUlkKSkge1xuICAgICAgICByZXR1cm4gaXRlbXMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBsaW1pdCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgcGVuZGluZ1xuICAgICAgaWYgKHBlbmRpbmdSYW5nZXMuaGFzKHJhbmdlSWQpKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nUmVxdWVzdCA9IGFjdGl2ZVJlcXVlc3RzLmdldChyYW5nZUlkKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nUmVxdWVzdCkge1xuICAgICAgICAgIHJldHVybiBleGlzdGluZ1JlcXVlc3Q7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTWFyayBhcyBwZW5kaW5nXG4gICAgICBwZW5kaW5nUmFuZ2VzLmFkZChyYW5nZUlkKTtcblxuICAgICAgLy8gQ3JlYXRlIEFib3J0Q29udHJvbGxlciBmb3IgdGhpcyByZXF1ZXN0XG4gICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBhYm9ydENvbnRyb2xsZXJzLnNldChyYW5nZUlkLCBhYm9ydENvbnRyb2xsZXIpO1xuXG4gICAgICAvLyBDcmVhdGUgcmVxdWVzdCBwcm9taXNlXG4gICAgICBjb25zdCByZXF1ZXN0UHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQ2FsbCBjb2xsZWN0aW9uIGFkYXB0ZXIgd2l0aCBhcHByb3ByaWF0ZSBwYXJhbWV0ZXJzXG4gICAgICAgICAgY29uc3QgcGFnZSA9IE1hdGguZmxvb3Iob2Zmc2V0IC8gbGltaXQpICsgMTtcbiAgICAgICAgICBsZXQgcGFyYW1zOiBhbnk7XG5cbiAgICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIpIHtcbiAgICAgICAgICAgIC8vIEZvciBjdXJzb3IgcGFnaW5hdGlvblxuICAgICAgICAgICAgaWYgKHBhZ2UgPT09IDEpIHtcbiAgICAgICAgICAgICAgLy8gRmlyc3QgcGFnZSAtIG5vIGN1cnNvclxuICAgICAgICAgICAgICBwYXJhbXMgPSB7IGxpbWl0IH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGN1cnNvciBmb3IgcHJldmlvdXMgcGFnZVxuICAgICAgICAgICAgICBjb25zdCBwcmV2UGFnZUN1cnNvciA9IGN1cnNvck1hcC5nZXQocGFnZSAtIDEpO1xuICAgICAgICAgICAgICBpZiAoIXByZXZQYWdlQ3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2FuJ3QgbG9hZCB0aGlzIHBhZ2Ugd2l0aG91dCBwcmV2aW91cyBjdXJzb3JcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICBgW0NvbGxlY3Rpb25dIENhbm5vdCBsb2FkIHBhZ2UgJHtwYWdlfSB3aXRob3V0IGN1cnNvciBmb3IgcGFnZSAke1xuICAgICAgICAgICAgICAgICAgICBwYWdlIC0gMVxuICAgICAgICAgICAgICAgICAgfWAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgU2VxdWVudGlhbCBsb2FkaW5nIHJlcXVpcmVkIC0gbWlzc2luZyBjdXJzb3IgZm9yIHBhZ2UgJHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZSAtIDFcbiAgICAgICAgICAgICAgICAgIH1gLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcGFyYW1zID0geyBjdXJzb3I6IHByZXZQYWdlQ3Vyc29yLCBsaW1pdCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RyYXRlZ3kgPT09IFwicGFnZVwiKSB7XG4gICAgICAgICAgICBwYXJhbXMgPSB7IHBhZ2UsIGxpbWl0IH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG9mZnNldCBzdHJhdGVneVxuICAgICAgICAgICAgcGFyYW1zID0geyBvZmZzZXQsIGxpbWl0IH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW1ZpZXdwb3J0IENvbGxlY3Rpb25dIExvYWRpbmcgcmFuZ2Ugb2Zmc2V0PSR7b2Zmc2V0fSwgbGltaXQ9JHtsaW1pdH0sIHN0cmF0ZWd5PSR7c3RyYXRlZ3l9LCBjYWxjdWxhdGVkIHBhZ2U9JHtwYWdlfSwgcGFyYW1zOmAsXG4gICAgICAgICAgLy8gICBKU09OLnN0cmluZ2lmeShwYXJhbXMpXG4gICAgICAgICAgLy8gKTtcblxuICAgICAgICAgIC8vIFBhc3MgYWJvcnQgc2lnbmFsIHRvIHRoZSBhZGFwdGVyIGlmIGl0IHN1cHBvcnRzIGl0XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjb2xsZWN0aW9uLnJlYWQoe1xuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRXh0cmFjdCBpdGVtcyBhbmQgdG90YWxcbiAgICAgICAgICBjb25zdCByYXdJdGVtcyA9IHJlc3BvbnNlLmRhdGEgfHwgcmVzcG9uc2UuaXRlbXMgfHwgcmVzcG9uc2U7XG4gICAgICAgICAgY29uc3QgbWV0YSA9IHJlc3BvbnNlLm1ldGEgfHwge307XG5cbiAgICAgICAgICAvLyBGb3IgY3Vyc29yIHBhZ2luYXRpb24sIHRyYWNrIHRoZSBjdXJzb3IgKGNoZWNrIGJvdGggY3Vyc29yIGFuZCBuZXh0Q3Vyc29yKVxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQ3Vyc29yID0gbWV0YS5jdXJzb3IgfHwgbWV0YS5uZXh0Q3Vyc29yO1xuICAgICAgICAgIGlmIChzdHJhdGVneSA9PT0gXCJjdXJzb3JcIiAmJiByZXNwb25zZUN1cnNvcikge1xuICAgICAgICAgICAgY3VycmVudEN1cnNvciA9IHJlc3BvbnNlQ3Vyc29yO1xuICAgICAgICAgICAgY3Vyc29yTWFwLnNldChwYWdlLCByZXNwb25zZUN1cnNvcik7XG4gICAgICAgICAgICBwYWdlVG9PZmZzZXRNYXAuc2V0KHBhZ2UsIG9mZnNldCk7XG4gICAgICAgICAgICBoaWdoZXN0TG9hZGVkUGFnZSA9IE1hdGgubWF4KGhpZ2hlc3RMb2FkZWRQYWdlLCBwYWdlKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFN0b3JlZCBjdXJzb3IgZm9yIHBhZ2UgJHtwYWdlfTogJHtyZXNwb25zZUN1cnNvcn1gLFxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB3ZSd2ZSByZWFjaGVkIHRoZSBlbmRcbiAgICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIgJiYgbWV0YS5oYXNOZXh0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaGFzUmVhY2hlZEVuZCA9IHRydWU7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBSZWFjaGVkIGVuZCBvZiBjdXJzb3IgcGFnaW5hdGlvbiBhdCBwYWdlICR7cGFnZX1gLFxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVcGRhdGUgZGlzY292ZXJlZCB0b3RhbCBpZiBwcm92aWRlZFxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBtZXRhLnRvdGFsOiAke21ldGEudG90YWx9LCBkaXNjb3ZlcmVkVG90YWwgYmVmb3JlOiAke2Rpc2NvdmVyZWRUb3RhbH1gLFxuICAgICAgICAgIC8vICk7XG4gICAgICAgICAgaWYgKG1ldGEudG90YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGlzY292ZXJlZFRvdGFsID0gbWV0YS50b3RhbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coYFtDb2xsZWN0aW9uXSBkaXNjb3ZlcmVkVG90YWwgYWZ0ZXI6ICR7ZGlzY292ZXJlZFRvdGFsfWApO1xuXG4gICAgICAgICAgLy8gVHJhbnNmb3JtIGl0ZW1zXG4gICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRJdGVtcyA9IHRyYW5zZm9ybUl0ZW1zKHJhd0l0ZW1zKTtcblxuICAgICAgICAgIC8vIEFkZCBpdGVtcyB0byBhcnJheVxuICAgICAgICAgIHRyYW5zZm9ybWVkSXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGl0ZW1zW29mZnNldCArIGluZGV4XSA9IGl0ZW07XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBGb3IgY3Vyc29yIHN0cmF0ZWd5LCBjYWxjdWxhdGUgZHluYW1pYyB0b3RhbCBiYXNlZCBvbiBsb2FkZWQgZGF0YVxuICAgICAgICAgIC8vIFVzZSBudWxsaXNoIGNvYWxlc2NpbmcgKD8/KSBpbnN0ZWFkIG9mIHx8IHRvIGhhbmRsZSBkaXNjb3ZlcmVkVG90YWwgPSAwIGNvcnJlY3RseVxuICAgICAgICAgIGxldCBuZXdUb3RhbCA9IGRpc2NvdmVyZWRUb3RhbCA/PyB0b3RhbEl0ZW1zO1xuXG4gICAgICAgICAgLy8gQ1JJVElDQUwgRklYOiBXaGVuIEFQSSByZXR1cm5zIDAgaXRlbXMgb24gcGFnZSAxIChvZmZzZXQgMCksIHRoZSBsaXN0IGlzIGVtcHR5LlxuICAgICAgICAgIC8vIFdlIG11c3Qgc2V0IHRvdGFsSXRlbXMgdG8gMCByZWdhcmRsZXNzIG9mIG1ldGEudG90YWwgYmVpbmcgdW5kZWZpbmVkLlxuICAgICAgICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBjb3VudD1mYWxzZSBpcyBzZW50IGJ1dCB0aGUgbGlzdCBpcyBhY3R1YWxseSBlbXB0eS5cbiAgICAgICAgICBpZiAob2Zmc2V0ID09PSAwICYmIHRyYW5zZm9ybWVkSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBFbXB0eSByZXN1bHQgb24gcGFnZSAxIC0gZm9yY2luZyB0b3RhbEl0ZW1zIHRvIDBgLFxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgIG5ld1RvdGFsID0gMDtcbiAgICAgICAgICAgIGRpc2NvdmVyZWRUb3RhbCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBuZXdUb3RhbCBpbml0aWFsOiAke25ld1RvdGFsfSwgdG90YWxJdGVtczogJHt0b3RhbEl0ZW1zfSwgc3RyYXRlZ3k6ICR7c3RyYXRlZ3l9YCxcbiAgICAgICAgICAvLyApO1xuXG4gICAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImN1cnNvclwiKSB7XG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdG90YWwgYmFzZWQgb24gbG9hZGVkIGl0ZW1zICsgbWFyZ2luXG4gICAgICAgICAgICBjb25zdCBsb2FkZWRJdGVtc0NvdW50ID0gaXRlbXMuZmlsdGVyKFxuICAgICAgICAgICAgICAoaXRlbSkgPT4gaXRlbSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgKS5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBtYXJnaW5JdGVtcyA9IGhhc1JlYWNoZWRFbmRcbiAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgIDogcmFuZ2VTaXplICpcbiAgICAgICAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUEFHSU5BVElPTi5DVVJTT1JfU0NST0xMX01BUkdJTl9NVUxUSVBMSUVSO1xuICAgICAgICAgICAgY29uc3QgbWluVmlydHVhbEl0ZW1zID1cbiAgICAgICAgICAgICAgcmFuZ2VTaXplICpcbiAgICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBBR0lOQVRJT04uQ1VSU09SX01JTl9WSVJUVUFMX1NJWkVfTVVMVElQTElFUjtcblxuICAgICAgICAgICAgLy8gRHluYW1pYyB0b3RhbDogbG9hZGVkIGl0ZW1zICsgbWFyZ2luICh1bmxlc3Mgd2UndmUgcmVhY2hlZCB0aGUgZW5kKVxuICAgICAgICAgICAgbmV3VG90YWwgPSBNYXRoLm1heChcbiAgICAgICAgICAgICAgbG9hZGVkSXRlbXNDb3VudCArIG1hcmdpbkl0ZW1zLFxuICAgICAgICAgICAgICBtaW5WaXJ0dWFsSXRlbXMsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBDdXJzb3IgbW9kZSB2aXJ0dWFsIHNpemU6IGxvYWRlZD0ke2xvYWRlZEl0ZW1zQ291bnR9LCBtYXJnaW49JHttYXJnaW5JdGVtc30sIHRvdGFsPSR7bmV3VG90YWx9LCBoYXNSZWFjaGVkRW5kPSR7aGFzUmVhY2hlZEVuZH1gLFxuICAgICAgICAgICAgLy8gKTtcblxuICAgICAgICAgICAgLy8gVXBkYXRlIHRvdGFsIGlmIGl0IGhhcyBncm93blxuICAgICAgICAgICAgaWYgKG5ld1RvdGFsID4gdG90YWxJdGVtcykge1xuICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFVwZGF0aW5nIGN1cnNvciB2aXJ0dWFsIHNpemUgZnJvbSAke3RvdGFsSXRlbXN9IHRvICR7bmV3VG90YWx9YCxcbiAgICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgICAgdG90YWxJdGVtcyA9IG5ld1RvdGFsO1xuICAgICAgICAgICAgICBzZXRUb3RhbEl0ZW1zKG5ld1RvdGFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRm9yIG90aGVyIHN0cmF0ZWdpZXMsIHVzZSBkaXNjb3ZlcmVkIHRvdGFsIG9yIGN1cnJlbnQgdG90YWxcbiAgICAgICAgICAgIC8vIFVzZSBudWxsaXNoIGNvYWxlc2NpbmcgKD8/KSBpbnN0ZWFkIG9mIHx8IHRvIGhhbmRsZSBkaXNjb3ZlcmVkVG90YWwgPSAwIGNvcnJlY3RseVxuICAgICAgICAgICAgbmV3VG90YWwgPSBkaXNjb3ZlcmVkVG90YWwgPz8gdG90YWxJdGVtcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVcGRhdGUgc3RhdGVcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gQmVmb3JlIHN0YXRlIHVwZGF0ZTogbmV3VG90YWw9JHtuZXdUb3RhbH0sIHRvdGFsSXRlbXM9JHt0b3RhbEl0ZW1zfSwgd2lsbCB1cGRhdGU6ICR7bmV3VG90YWwgIT09IHRvdGFsSXRlbXN9YCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICAgIGlmIChuZXdUb3RhbCAhPT0gdG90YWxJdGVtcykge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYFtDb2xsZWN0aW9uXSBDYWxsaW5nIHNldFRvdGFsSXRlbXMoJHtuZXdUb3RhbH0pYCk7XG4gICAgICAgICAgICB0b3RhbEl0ZW1zID0gbmV3VG90YWw7XG4gICAgICAgICAgICBzZXRUb3RhbEl0ZW1zKG5ld1RvdGFsKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVcGRhdGUgY29tcG9uZW50IGl0ZW1zIHJlZmVyZW5jZVxuICAgICAgICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuXG4gICAgICAgICAgLy8gRW1pdCBpdGVtcyBjaGFuZ2VkIGV2ZW50XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0Oml0ZW1zLWNoYW5nZWRcIiwge1xuICAgICAgICAgICAgdG90YWxJdGVtczogbmV3VG90YWwsXG4gICAgICAgICAgICBsb2FkZWRDb3VudDogaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSB1bmRlZmluZWQpLmxlbmd0aCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIFVwZGF0ZSB2aWV3cG9ydCBzdGF0ZVxuICAgICAgICAgIGNvbnN0IHZpZXdwb3J0U3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG4gICAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICAgIC8vIFVzZSBudWxsaXNoIGNvYWxlc2NpbmcgKD8/KSBpbnN0ZWFkIG9mIHx8IHRvIGhhbmRsZSBuZXdUb3RhbCA9IDAgY29ycmVjdGx5XG4gICAgICAgICAgICB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgPSBuZXdUb3RhbCA/PyBpdGVtcy5sZW5ndGg7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVmVyaWZ5IGl0ZW1zIGFyZSBhY3R1YWxseSBzdGlsbCBpbiB0aGUgYXJyYXkgYmVmb3JlIG1hcmtpbmcgYXMgbG9hZGVkXG4gICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBhIHJhY2UgY29uZGl0aW9uIHdoZXJlIGV2aWN0aW9uIGhhcHBlbnMgZHVyaW5nIGFzeW5jIGxvYWQ6XG4gICAgICAgICAgLy8gMS4gTG9hZCBzdGFydHMgZm9yIHJhbmdlIEFcbiAgICAgICAgICAvLyAyLiBVc2VyIHNjcm9sbHMgdG8gcmFuZ2UgQlxuICAgICAgICAgIC8vIDMuIEV2aWN0aW9uIHJlbW92ZXMgaXRlbXMgZnJvbSByYW5nZSBBIGFuZCByZW1vdmVzIGZyb20gbG9hZGVkUmFuZ2VzXG4gICAgICAgICAgLy8gNC4gTG9hZCBmb3IgcmFuZ2UgQSBjb21wbGV0ZXMsIHdvdWxkIHJlLWFkZCB0byBsb2FkZWRSYW5nZXNcbiAgICAgICAgICAvLyA1LiBVc2VyIHNjcm9sbHMgYmFjayB0byBBLCBsb2FkZWRSYW5nZXMgc2F5cyBsb2FkZWQgYnV0IGl0ZW1zIGFyZSBnb25lXG4gICAgICAgICAgY29uc3QgaXRlbXNBY3R1YWxseVN0b3JlZCA9XG4gICAgICAgICAgICB0cmFuc2Zvcm1lZEl0ZW1zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgIHRyYW5zZm9ybWVkSXRlbXMuZXZlcnkoXG4gICAgICAgICAgICAgIChfLCBpZHgpID0+IGl0ZW1zW29mZnNldCArIGlkeF0gIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoaXRlbXNBY3R1YWxseVN0b3JlZCkge1xuICAgICAgICAgICAgLy8gTWFyayBhcyBsb2FkZWQgb25seSBpZiBpdGVtcyBhcmUgYWN0dWFsbHkgcHJlc2VudFxuICAgICAgICAgICAgbG9hZGVkUmFuZ2VzLmFkZChyYW5nZUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQWx3YXlzIGNsZWFuIHVwIHBlbmRpbmcvZmFpbGVkIHN0YXRlXG4gICAgICAgICAgcGVuZGluZ1Jhbmdlcy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgICAgZmFpbGVkUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcblxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBSYW5nZSAke3JhbmdlSWR9IGxvYWRlZCBzdWNjZXNzZnVsbHkgd2l0aCAke3RyYW5zZm9ybWVkSXRlbXMubGVuZ3RofSBpdGVtc2BcbiAgICAgICAgICAvLyApO1xuXG4gICAgICAgICAgLy8gTG9nIG1lbW9yeSBzdGF0cyBwZXJpb2RpY2FsbHkgKGV2ZXJ5IDUgbG9hZHMpXG4gICAgICAgICAgaWYgKGNvbXBsZXRlZExvYWRzICUgNSA9PT0gMCkge1xuICAgICAgICAgICAgbG9nTWVtb3J5U3RhdHMoYGxvYWQ6JHtjb21wbGV0ZWRMb2Fkc31gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBFbWl0IGV2ZW50c1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpyYW5nZS1sb2FkZWRcIiwge1xuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgICAgICBpdGVtczogdHJhbnNmb3JtZWRJdGVtcyxcbiAgICAgICAgICAgIHRvdGFsOiBuZXdUb3RhbCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEVtaXQgY29sbGVjdGlvbiBsb2FkZWQgZXZlbnQgd2l0aCBtb3JlIGRldGFpbHNcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY29sbGVjdGlvbjpyYW5nZS1sb2FkZWRcIiwge1xuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgICAgICBpdGVtczogdHJhbnNmb3JtZWRJdGVtcyxcbiAgICAgICAgICAgIHRvdGFsOiBuZXdUb3RhbCxcbiAgICAgICAgICAgIHJhbmdlSWQsXG4gICAgICAgICAgICBpdGVtc0luTWVtb3J5OiBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09IHVuZGVmaW5lZCkubGVuZ3RoLFxuICAgICAgICAgICAgY3Vyc29yOiBzdHJhdGVneSA9PT0gXCJjdXJzb3JcIiA/IGN1cnJlbnRDdXJzb3IgOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBUcmlnZ2VyIHZpZXdwb3J0IHVwZGF0ZVxuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydD8udXBkYXRlVmlld3BvcnQ/LigpO1xuXG4gICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkSXRlbXM7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gSGFuZGxlIEFib3J0RXJyb3IgYW5kIFwiRmFpbGVkIHRvIGZldGNoXCIgKHdoaWNoIGNhbiBvY2N1ciBvbiBhYm9ydCkgZ3JhY2VmdWxseVxuICAgICAgICAgIGNvbnN0IGlzQWJvcnRFcnJvciA9XG4gICAgICAgICAgICAoZXJyb3IgYXMgRXJyb3IpLm5hbWUgPT09IFwiQWJvcnRFcnJvclwiIHx8XG4gICAgICAgICAgICAoKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlID09PSBcIkZhaWxlZCB0byBmZXRjaFwiICYmXG4gICAgICAgICAgICAgIGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCk7XG5cbiAgICAgICAgICBpZiAoaXNBYm9ydEVycm9yKSB7XG4gICAgICAgICAgICBwZW5kaW5nUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgICAgIGNhbmNlbGxlZExvYWRzKys7XG4gICAgICAgICAgICAvLyBEb24ndCB0aHJvdywganVzdCByZXR1cm4gZW1wdHkgYXJyYXlcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBIYW5kbGUgb3RoZXIgZXJyb3JzXG4gICAgICAgICAgcGVuZGluZ1Jhbmdlcy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgICAgZmFpbGVkTG9hZHMrKztcblxuICAgICAgICAgIGNvbnN0IGF0dGVtcHRzID0gKGZhaWxlZFJhbmdlcy5nZXQocmFuZ2VJZCk/LmF0dGVtcHRzIHx8IDApICsgMTtcbiAgICAgICAgICBmYWlsZWRSYW5nZXMuc2V0KHJhbmdlSWQsIHtcbiAgICAgICAgICAgIGF0dGVtcHRzLFxuICAgICAgICAgICAgbGFzdEVycm9yOiBlcnJvciBhcyBFcnJvcixcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEVtaXQgZXJyb3IgZXZlbnRcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6cmFuZ2UtZXJyb3JcIiwge1xuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgIGF0dGVtcHRzLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgYWN0aXZlUmVxdWVzdHMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICAgIGFib3J0Q29udHJvbGxlcnMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuXG4gICAgICBhY3RpdmVSZXF1ZXN0cy5zZXQocmFuZ2VJZCwgcmVxdWVzdFByb21pc2UpO1xuICAgICAgcmV0dXJuIHJlcXVlc3RQcm9taXNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIG1pc3NpbmcgcmFuZ2VzIGZyb20gY29sbGVjdGlvblxuICAgICAqL1xuICAgIGNvbnN0IGxvYWRNaXNzaW5nUmFuZ2VzSW50ZXJuYWwgPSBhc3luYyAoXG4gICAgICByYW5nZToge1xuICAgICAgICBzdGFydDogbnVtYmVyO1xuICAgICAgICBlbmQ6IG51bWJlcjtcbiAgICAgIH0sXG4gICAgICBjYWxsZXI/OiBzdHJpbmcsXG4gICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBpZiAoIWNvbGxlY3Rpb24pIHJldHVybjtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gbG9hZE1pc3NpbmdSYW5nZXNJbnRlcm5hbCAtIHJhbmdlOiAke3N0YXJ0fS0ke2VuZH0sIHN0cmF0ZWd5OiAke3N0cmF0ZWd5fWAsXG4gICAgICAvLyApO1xuXG4gICAgICAvLyBGb3IgY3Vyc29yIHBhZ2luYXRpb24sIHdlIG5lZWQgdG8gbG9hZCBzZXF1ZW50aWFsbHlcbiAgICAgIGlmIChzdHJhdGVneSA9PT0gXCJjdXJzb3JcIikge1xuICAgICAgICBjb25zdCBzdGFydFBhZ2UgPSBNYXRoLmZsb29yKHJhbmdlLnN0YXJ0IC8gcmFuZ2VTaXplKSArIDE7XG4gICAgICAgIGNvbnN0IGVuZFBhZ2UgPSBNYXRoLmZsb29yKHJhbmdlLmVuZCAvIHJhbmdlU2l6ZSkgKyAxO1xuXG4gICAgICAgIC8vIExpbWl0IGhvdyBtYW55IHBhZ2VzIHdlJ2xsIGxvYWQgYXQgb25jZVxuICAgICAgICBjb25zdCBtYXhQYWdlc1RvTG9hZCA9IDEwO1xuICAgICAgICBjb25zdCBjdXJyZW50SGlnaGVzdFBhZ2UgPSBoaWdoZXN0TG9hZGVkUGFnZSB8fCAwO1xuICAgICAgICBjb25zdCBsaW1pdGVkRW5kUGFnZSA9IE1hdGgubWluKFxuICAgICAgICAgIGVuZFBhZ2UsXG4gICAgICAgICAgY3VycmVudEhpZ2hlc3RQYWdlICsgbWF4UGFnZXNUb0xvYWQsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBDdXJzb3IgbW9kZTogbmVlZCB0byBsb2FkIHBhZ2VzICR7c3RhcnRQYWdlfSB0byAke2VuZFBhZ2V9LCBsaW1pdGVkIHRvICR7bGltaXRlZEVuZFBhZ2V9YCxcbiAgICAgICAgLy8gKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIGxvYWQgcGFnZXMgc2VxdWVudGlhbGx5XG4gICAgICAgIGZvciAobGV0IHBhZ2UgPSBzdGFydFBhZ2U7IHBhZ2UgPD0gbGltaXRlZEVuZFBhZ2U7IHBhZ2UrKykge1xuICAgICAgICAgIGNvbnN0IHJhbmdlSWQgPSBwYWdlIC0gMTsgLy8gQ29udmVydCB0byAwLWJhc2VkIHJhbmdlSWRcbiAgICAgICAgICBjb25zdCBvZmZzZXQgPSByYW5nZUlkICogcmFuZ2VTaXplO1xuXG4gICAgICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IGJlaW5nIGxvYWRlZFxuICAgICAgICAgIGlmIChwZW5kaW5nUmFuZ2VzLmhhcyhyYW5nZUlkKSkge1xuICAgICAgICAgICAgLy8gUmFuZ2UgYWxyZWFkeSBiZWluZyBsb2FkZWRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWxvYWRlZFJhbmdlcy5oYXMocmFuZ2VJZCkgJiYgIXBlbmRpbmdSYW5nZXMuaGFzKHJhbmdlSWQpKSB7XG4gICAgICAgICAgICAvLyBGb3IgY3Vyc29yIHBhZ2luYXRpb24sIHdlIG11c3QgbG9hZCBzZXF1ZW50aWFsbHlcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYWxsIHByZXZpb3VzIHBhZ2VzIGxvYWRlZFxuICAgICAgICAgICAgaWYgKHBhZ2UgPiAxKSB7XG4gICAgICAgICAgICAgIGxldCBjYW5Mb2FkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgcHJldlBhZ2UgPSAxOyBwcmV2UGFnZSA8IHBhZ2U7IHByZXZQYWdlKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2UmFuZ2VJZCA9IHByZXZQYWdlIC0gMTtcbiAgICAgICAgICAgICAgICBpZiAoIWxvYWRlZFJhbmdlcy5oYXMocHJldlJhbmdlSWQpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBDYW5ub3QgbG9hZCBwYWdlICR7cGFnZX0gLSBuZWVkIHRvIGxvYWQgcGFnZSAke3ByZXZQYWdlfSBmaXJzdGAsXG4gICAgICAgICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgICAgICAgY2FuTG9hZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAvLyBUcnkgdG8gbG9hZCB0aGUgbWlzc2luZyBwYWdlXG4gICAgICAgICAgICAgICAgICBpZiAoIXBlbmRpbmdSYW5nZXMuaGFzKHByZXZSYW5nZUlkKSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGxvYWRSYW5nZShwcmV2UmFuZ2VJZCAqIHJhbmdlU2l6ZSwgcmFuZ2VTaXplKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgYFtDb2xsZWN0aW9uXSBGYWlsZWQgdG8gbG9hZCBwcmVyZXF1aXNpdGUgcGFnZSAke3ByZXZQYWdlfTpgLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIFN0b3AgdHJ5aW5nIHRvIGxvYWQgZnVydGhlciBwYWdlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoIWNhbkxvYWQpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gU2tpcCB0aGlzIHBhZ2UgZm9yIG5vd1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGF3YWl0IGxvYWRSYW5nZShvZmZzZXQsIHJhbmdlU2l6ZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBbQ29sbGVjdGlvbl0gRmFpbGVkIHRvIGxvYWQgcGFnZSAke3BhZ2V9OmAsIGVycm9yKTtcbiAgICAgICAgICAgICAgYnJlYWs7IC8vIFN0b3Agc2VxdWVudGlhbCBsb2FkaW5nIG9uIGVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVuZFBhZ2UgPiBsaW1pdGVkRW5kUGFnZSkge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBTdG9wcGVkIGF0IHBhZ2UgJHtsaW1pdGVkRW5kUGFnZX0gdG8gcHJldmVudCBleGNlc3NpdmUgbG9hZGluZyAocmVxdWVzdGVkIHVwIHRvICR7ZW5kUGFnZX0pYCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBPcmlnaW5hbCBsb2dpYyBmb3Igb2Zmc2V0L3BhZ2Ugc3RyYXRlZ2llc1xuICAgICAgLy8gQ2FsY3VsYXRlIHJhbmdlIGJvdW5kYXJpZXNcbiAgICAgIGNvbnN0IHN0YXJ0UmFuZ2UgPSBNYXRoLmZsb29yKHJhbmdlLnN0YXJ0IC8gcmFuZ2VTaXplKTtcbiAgICAgIGNvbnN0IGVuZFJhbmdlID0gTWF0aC5mbG9vcihyYW5nZS5lbmQgLyByYW5nZVNpemUpO1xuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBwYWdlIHN0cmF0ZWd5IC0gc3RhcnRSYW5nZTogJHtzdGFydFJhbmdlfSwgZW5kUmFuZ2U6ICR7ZW5kUmFuZ2V9LCBsb2FkZWRSYW5nZXM6IFske0FycmF5LmZyb20obG9hZGVkUmFuZ2VzKS5qb2luKFwiLCBcIil9XWAsXG4gICAgICAvLyApO1xuXG4gICAgICAvLyBDb2xsZWN0IHJhbmdlcyB0aGF0IG5lZWQgbG9hZGluZ1xuICAgICAgY29uc3QgcmFuZ2VzVG9Mb2FkOiBudW1iZXJbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgcmFuZ2VJZCA9IHN0YXJ0UmFuZ2U7IHJhbmdlSWQgPD0gZW5kUmFuZ2U7IHJhbmdlSWQrKykge1xuICAgICAgICBpZiAoIWxvYWRlZFJhbmdlcy5oYXMocmFuZ2VJZCkgJiYgIXBlbmRpbmdSYW5nZXMuaGFzKHJhbmdlSWQpKSB7XG4gICAgICAgICAgcmFuZ2VzVG9Mb2FkLnB1c2gocmFuZ2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJhbmdlc1RvTG9hZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gQWxsIHJhbmdlcyBhcmUgYWxyZWFkeSBsb2FkZWQgb3IgcGVuZGluZ1xuICAgICAgICAvLyBCdXQgdmVyaWZ5IHRoZSBkYXRhIGFjdHVhbGx5IGV4aXN0cyBpbiBpdGVtcyBhcnJheSAoZGVmZW5zaXZlIGNoZWNrKVxuICAgICAgICBmb3IgKGxldCByYW5nZUlkID0gc3RhcnRSYW5nZTsgcmFuZ2VJZCA8PSBlbmRSYW5nZTsgcmFuZ2VJZCsrKSB7XG4gICAgICAgICAgaWYgKGxvYWRlZFJhbmdlcy5oYXMocmFuZ2VJZCkpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgcmFuZ2UgYWN0dWFsbHkgaGFzIGRhdGFcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlU3RhcnQgPSByYW5nZUlkICogcmFuZ2VTaXplO1xuICAgICAgICAgICAgY29uc3QgaGFzRGF0YSA9IGl0ZW1zXG4gICAgICAgICAgICAgIC5zbGljZShyYW5nZVN0YXJ0LCByYW5nZVN0YXJ0ICsgcmFuZ2VTaXplKVxuICAgICAgICAgICAgICAuc29tZSgoaXRlbSkgPT4gaXRlbSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGlmICghaGFzRGF0YSkge1xuICAgICAgICAgICAgICAvLyBSYW5nZSBtYXJrZWQgbG9hZGVkIGJ1dCBubyBkYXRhIC0gZm9yY2UgcmVsb2FkXG4gICAgICAgICAgICAgIGxvYWRlZFJhbmdlcy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgICAgICAgIHJhbmdlc1RvTG9hZC5wdXNoKHJhbmdlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgcXVldWVkIHJlcXVlc3RzIHdlIHNob3VsZCBwcm9jZXNzXG4gICAgICAgIGlmIChcbiAgICAgICAgICByYW5nZXNUb0xvYWQubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggPiAwICYmXG4gICAgICAgICAgYWN0aXZlTG9hZENvdW50IDwgbWF4Q29uY3VycmVudFJlcXVlc3RzXG4gICAgICAgICkge1xuICAgICAgICAgIHByb2Nlc3NRdWV1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyYW5nZXNUb0xvYWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIExvYWRpbmcgJHtyYW5nZXNUb0xvYWQubGVuZ3RofSByYW5nZXM6IFske3Jhbmdlc1RvTG9hZC5qb2luKFwiLCBcIil9XWAsXG4gICAgICAvLyApO1xuXG4gICAgICAvLyBMb2FkIHJhbmdlcyBpbmRpdmlkdWFsbHkgLSBubyBtZXJnaW5nIHRvIGF2b2lkIGxvYWRpbmcgb2xkIHJhbmdlc1xuICAgICAgY29uc3QgcHJvbWlzZXMgPSByYW5nZXNUb0xvYWQubWFwKChyYW5nZUlkKSA9PlxuICAgICAgICBsb2FkUmFuZ2UocmFuZ2VJZCAqIHJhbmdlU2l6ZSwgcmFuZ2VTaXplKSxcbiAgICAgICk7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocHJvbWlzZXMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBWZWxvY2l0eS1hd2FyZSB3cmFwcGVyIGZvciBsb2FkTWlzc2luZ1Jhbmdlc1xuICAgICAqL1xuICAgIGNvbnN0IGxvYWRNaXNzaW5nUmFuZ2VzID0gKFxuICAgICAgcmFuZ2U6IHtcbiAgICAgICAgc3RhcnQ6IG51bWJlcjtcbiAgICAgICAgZW5kOiBudW1iZXI7XG4gICAgICB9LFxuICAgICAgY2FsbGVyPzogc3RyaW5nLFxuICAgICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcmFuZ2VLZXkgPSBnZXRSYW5nZUtleShyYW5nZSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBsb2FkaW5nXG4gICAgICAgIGlmIChhY3RpdmVMb2FkUmFuZ2VzLmhhcyhyYW5nZUtleSkpIHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCBpZiBkcmFnZ2luZyB3aXRoIGxvdyB2ZWxvY2l0eSAoYnV0IG5vdCBpZiB3ZSdyZSBpZGxlKVxuICAgICAgICBpZiAoaXNEcmFnZ2luZyAmJiBjdXJyZW50VmVsb2NpdHkgPCAwLjUgJiYgY3VycmVudFZlbG9jaXR5ID4gMCkge1xuICAgICAgICAgIGNhbmNlbGxlZExvYWRzKys7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHZlbG9jaXR5IC0gaWYgdG9vIGhpZ2gsIGNhbmNlbCB0aGUgcmVxdWVzdCBlbnRpcmVseVxuICAgICAgICBpZiAoIWNhbkxvYWQoKSkge1xuICAgICAgICAgIGNhbmNlbGxlZExvYWRzKys7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGNhcGFjaXR5XG4gICAgICAgIGlmIChhY3RpdmVMb2FkQ291bnQgPCBtYXhDb25jdXJyZW50UmVxdWVzdHMpIHtcbiAgICAgICAgICAvLyBFeGVjdXRlIGltbWVkaWF0ZWx5XG4gICAgICAgICAgZXhlY3V0ZVF1ZXVlZExvYWQoe1xuICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICBwcmlvcml0eTogXCJub3JtYWxcIixcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgICBjYWxsZXIsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgZW5hYmxlUmVxdWVzdFF1ZXVlICYmXG4gICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggPCBtYXhRdWV1ZVNpemVcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gUXVldWUgdGhlIHJlcXVlc3RcbiAgICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICBwcmlvcml0eTogXCJub3JtYWxcIixcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgICBjYWxsZXIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0xvYWRpbmdNYW5hZ2VyXSBRdWV1ZWQgcmVxdWVzdCAoYXQgY2FwYWNpdHkpLCBxdWV1ZSBzaXplOiAke2xvYWRSZXF1ZXN0UXVldWUubGVuZ3RofWBcbiAgICAgICAgICAvLyApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFF1ZXVlIGlzIGZ1bGwgLSBidXQgZG9uJ3QgZHJvcCBpZGxlL3JhbmdlLWNoYW5nZWQgcmVxdWVzdHMsIHRoZXkncmUgY3JpdGljYWwhXG4gICAgICAgICAgLy8gSW5zdGVhZCwgY2xlYXIgb2xkIHF1ZXVlZCByZXF1ZXN0cyBhbmQgYWRkIHRoZSBuZXcgb25lXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgY2FsbGVyID09PSBcInZpZXdwb3J0OmlkbGVcIiB8fFxuICAgICAgICAgICAgY2FsbGVyID09PSBcInZpZXdwb3J0OnJhbmdlLWNoYW5nZWRcIlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gQ2xlYXIgb2xkIHF1ZXVlZCByZXF1ZXN0cyAtIHRoZXkncmUgZm9yIHJhbmdlcyB1c2VyIHNjcm9sbGVkIHBhc3RcbiAgICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUuZm9yRWFjaCgocikgPT4ge1xuICAgICAgICAgICAgICBjYW5jZWxsZWRMb2FkcysrO1xuICAgICAgICAgICAgICByLnJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggPSAwO1xuICAgICAgICAgICAgLy8gUXVldWUgdGhpcyBwcmlvcml0eSByZXF1ZXN0XG4gICAgICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgICAgcHJpb3JpdHk6IFwiaGlnaFwiLFxuICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICAgICAgY2FsbGVyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFF1ZXVlIG92ZXJmbG93IC0gcmVzb2x2ZSB0byBhdm9pZCBlcnJvcnNcbiAgICAgICAgICAgIGlmIChsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA+PSBtYXhRdWV1ZVNpemUpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGxvYWRSZXF1ZXN0UXVldWUuc3BsaWNlKFxuICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggLSBtYXhRdWV1ZVNpemUsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJlbW92ZWQuZm9yRWFjaCgocikgPT4ge1xuICAgICAgICAgICAgICAgIGNhbmNlbGxlZExvYWRzKys7XG4gICAgICAgICAgICAgICAgci5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHJ5IGEgZmFpbGVkIHJhbmdlXG4gICAgICovXG4gICAgY29uc3QgcmV0cnlGYWlsZWRSYW5nZSA9IGFzeW5jIChyYW5nZUlkOiBudW1iZXIpOiBQcm9taXNlPGFueVtdPiA9PiB7XG4gICAgICBmYWlsZWRSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gcmFuZ2VJZCAqIHJhbmdlU2l6ZTtcbiAgICAgIHJldHVybiBsb2FkUmFuZ2Uob2Zmc2V0LCByYW5nZVNpemUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdG90YWwgaXRlbXMgY291bnRcbiAgICAgKi9cbiAgICBjb25zdCBzZXRUb3RhbEl0ZW1zID0gKHRvdGFsOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgIHRvdGFsSXRlbXMgPSB0b3RhbDtcblxuICAgICAgLy8gVXBkYXRlIHZpZXdwb3J0IHN0YXRlJ3MgdG90YWwgaXRlbXNcbiAgICAgIGNvbnN0IHZpZXdwb3J0U3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG4gICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgPSB0b3RhbDtcbiAgICAgIH1cblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnRvdGFsLWl0ZW1zLWNoYW5nZWRcIiwgeyB0b3RhbCB9KTtcbiAgICB9O1xuXG4gICAgLy8gSG9vayBpbnRvIHZpZXdwb3J0IGluaXRpYWxpemF0aW9uXG4gICAgY29uc3Qgb3JpZ2luYWxJbml0aWFsaXplID0gY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemU7XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbEluaXRpYWxpemUoKTtcbiAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBpbml0aWFsaXplZFxuICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgaW5pdGlhbCB0b3RhbCBpZiBwcm92aWRlZFxuICAgICAgaWYgKGNvbXBvbmVudC50b3RhbEl0ZW1zKSB7XG4gICAgICAgIHRvdGFsSXRlbXMgPSBjb21wb25lbnQudG90YWxJdGVtcztcbiAgICAgIH1cblxuICAgICAgLy8gTGlzdGVuIGZvciBkcmFnIGV2ZW50c1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpkcmFnLXN0YXJ0XCIsICgpID0+IHtcbiAgICAgICAgaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpkcmFnLWVuZFwiLCAoKSA9PiB7XG4gICAgICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgLy8gUHJvY2VzcyBhbnkgcXVldWVkIHJlcXVlc3RzIGFmdGVyIGRyYWcgZW5kcyAoc2FmZXR5IG1lYXN1cmUpXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyBwbGFjZWhvbGRlcnMgYXJlIHJlcGxhY2VkIGV2ZW4gaWYgaWRsZSBkZXRlY3Rpb24gZmFpbHNcbiAgICAgICAgaWYgKGxvYWRPbkRyYWdFbmQpIHtcbiAgICAgICAgICBwcm9jZXNzUXVldWUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgcmFuZ2UgY2hhbmdlc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkXCIsIGFzeW5jIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgLy8gRG9uJ3QgbG9hZCBkdXJpbmcgZmFzdCBzY3JvbGxpbmcgLSBsb2FkTWlzc2luZ1JhbmdlcyB3aWxsIGhhbmRsZSB2ZWxvY2l0eSBjaGVja1xuXG4gICAgICAgIC8vIEV4dHJhY3QgcmFuZ2UgZnJvbSBldmVudCBkYXRhIC0gdmlydHVhbCBmZWF0dXJlIGVtaXRzIHsgcmFuZ2U6IHsgc3RhcnQsIGVuZCB9LCBzY3JvbGxQb3NpdGlvbiB9XG4gICAgICAgIGNvbnN0IHJhbmdlID0gZGF0YS5yYW5nZSB8fCBkYXRhO1xuICAgICAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHJhbmdlO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHJhbmdlIGJlZm9yZSBsb2FkaW5nXG4gICAgICAgIGlmICh0eXBlb2Ygc3RhcnQgIT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIGVuZCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIFwiW0NvbGxlY3Rpb25dIEludmFsaWQgcmFuZ2UgaW4gdmlld3BvcnQ6cmFuZ2UtY2hhbmdlZCBldmVudDpcIixcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTa2lwIGxvYWRpbmcgcGFnZSAxIGlmIHdlIGhhdmUgYW4gaW5pdGlhbFNjcm9sbEluZGV4IGFuZCBoYXZlbid0IGNvbXBsZXRlZCBpbml0aWFsIGxvYWQgeWV0XG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgdGhlIHJlcXVlc3RBbmltYXRpb25GcmFtZSBpbiB2aXJ0dWFsLnRzIGZyb20gdHJpZ2dlcmluZyBhIHBhZ2UgMSBsb2FkXG4gICAgICAgIC8vIGFmdGVyIHdlJ3ZlIGFscmVhZHkgc3RhcnRlZCBsb2FkaW5nIHRoZSBjb3JyZWN0IGluaXRpYWwgcGFnZVxuICAgICAgICBpZiAoaGFzSW5pdGlhbFNjcm9sbEluZGV4ICYmICFoYXNDb21wbGV0ZWRJbml0aWFsUG9zaXRpb25Mb2FkKSB7XG4gICAgICAgICAgY29uc3QgcGFnZTFFbmRJbmRleCA9IHJhbmdlU2l6ZSAtIDE7IC8vIGUuZy4sIDI5IGZvciByYW5nZVNpemU9MzBcbiAgICAgICAgICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kIDw9IHBhZ2UxRW5kSW5kZXgpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSByZXF1ZXN0IGZvciBwYWdlIDEsIHNraXAgaXRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2FkIG1pc3NpbmcgcmFuZ2VzIGlmIG5lZWRlZFxuICAgICAgICBhd2FpdCBsb2FkTWlzc2luZ1Jhbmdlcyh7IHN0YXJ0LCBlbmQgfSwgXCJ2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkXCIpO1xuXG4gICAgICAgIC8vIEV2aWN0IGRpc3RhbnQgaXRlbXMgdG8gcHJldmVudCBtZW1vcnkgYmxvYXRcbiAgICAgICAgZXZpY3REaXN0YW50SXRlbXMoc3RhcnQsIGVuZCk7XG5cbiAgICAgICAgLy8gRm9yIGN1cnNvciBtb2RlLCBjaGVjayBpZiB3ZSBuZWVkIHRvIHVwZGF0ZSB2aXJ0dWFsIHNpemVcbiAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImN1cnNvclwiICYmICFoYXNSZWFjaGVkRW5kKSB7XG4gICAgICAgICAgY29uc3QgbG9hZGVkSXRlbXNDb3VudCA9IGl0ZW1zLmZpbHRlcihcbiAgICAgICAgICAgIChpdGVtKSA9PiBpdGVtICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgKS5sZW5ndGg7XG4gICAgICAgICAgY29uc3QgbWFyZ2luSXRlbXMgPVxuICAgICAgICAgICAgcmFuZ2VTaXplICpcbiAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QQUdJTkFUSU9OLkNVUlNPUl9TQ1JPTExfTUFSR0lOX01VTFRJUExJRVI7XG4gICAgICAgICAgY29uc3QgbWluVmlydHVhbEl0ZW1zID1cbiAgICAgICAgICAgIHJhbmdlU2l6ZSAqXG4gICAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUEFHSU5BVElPTi5DVVJTT1JfTUlOX1ZJUlRVQUxfU0laRV9NVUxUSVBMSUVSO1xuICAgICAgICAgIGNvbnN0IGR5bmFtaWNUb3RhbCA9IE1hdGgubWF4KFxuICAgICAgICAgICAgbG9hZGVkSXRlbXNDb3VudCArIG1hcmdpbkl0ZW1zLFxuICAgICAgICAgICAgbWluVmlydHVhbEl0ZW1zLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoZHluYW1pY1RvdGFsICE9PSB0b3RhbEl0ZW1zKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBVcGRhdGluZyBjdXJzb3IgdmlydHVhbCBzaXplIGZyb20gJHt0b3RhbEl0ZW1zfSB0byAke2R5bmFtaWNUb3RhbH1gLFxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgIHNldFRvdGFsSXRlbXMoZHluYW1pY1RvdGFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIHZlbG9jaXR5IGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dmVsb2NpdHktY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmVsb2NpdHkgPSBjdXJyZW50VmVsb2NpdHk7XG4gICAgICAgIGN1cnJlbnRWZWxvY2l0eSA9IE1hdGguYWJzKGRhdGEudmVsb2NpdHkgfHwgMCk7XG5cbiAgICAgICAgLy8gV2hlbiB2ZWxvY2l0eSBkcm9wcyBiZWxvdyB0aHJlc2hvbGQsIHByb2Nlc3MgcXVldWVcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByZXZpb3VzVmVsb2NpdHkgPiBjYW5jZWxMb2FkVGhyZXNob2xkICYmXG4gICAgICAgICAgY3VycmVudFZlbG9jaXR5IDw9IGNhbmNlbExvYWRUaHJlc2hvbGRcbiAgICAgICAgKSB7XG4gICAgICAgICAgcHJvY2Vzc1F1ZXVlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGlkbGUgc3RhdGUgdG8gcHJvY2VzcyBxdWV1ZVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDppZGxlXCIsIGFzeW5jIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY3VycmVudFZlbG9jaXR5ID0gMDtcblxuICAgICAgICAvLyBSZXNldCBkcmFnZ2luZyBzdGF0ZSBvbiBpZGxlIHNpbmNlIHVzZXIgaGFzIHN0b3BwZWQgbW92aW5nXG4gICAgICAgIGlmIChpc0RyYWdnaW5nKSB7XG4gICAgICAgICAgaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGN1cnJlbnQgdmlzaWJsZSByYW5nZSBmcm9tIHZpZXdwb3J0XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0U3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG4gICAgICAgIGNvbnN0IHZpc2libGVSYW5nZSA9IHZpZXdwb3J0U3RhdGU/LnZpc2libGVSYW5nZTtcblxuICAgICAgICBpZiAodmlzaWJsZVJhbmdlKSB7XG4gICAgICAgICAgLy8gQ2xlYXIgc3RhbGUgcmVxdWVzdHMgZnJvbSBxdWV1ZSB0aGF0IGFyZSBmYXIgZnJvbSBjdXJyZW50IHZpc2libGUgcmFuZ2VcbiAgICAgICAgICBjb25zdCBidWZmZXIgPSByYW5nZVNpemUgKiAyOyAvLyBBbGxvdyBzb21lIGJ1ZmZlclxuICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUgPSBsb2FkUmVxdWVzdFF1ZXVlLmZpbHRlcigocmVxdWVzdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdEVuZCA9IHJlcXVlc3QucmFuZ2UuZW5kO1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdFN0YXJ0ID0gcmVxdWVzdC5yYW5nZS5zdGFydDtcbiAgICAgICAgICAgIGNvbnN0IGlzUmVsZXZhbnQgPVxuICAgICAgICAgICAgICByZXF1ZXN0RW5kID49IHZpc2libGVSYW5nZS5zdGFydCAtIGJ1ZmZlciAmJlxuICAgICAgICAgICAgICByZXF1ZXN0U3RhcnQgPD0gdmlzaWJsZVJhbmdlLmVuZCArIGJ1ZmZlcjtcblxuICAgICAgICAgICAgaWYgKCFpc1JlbGV2YW50KSB7XG4gICAgICAgICAgICAgIHJlcXVlc3QucmVzb2x2ZSgpOyAvLyBSZXNvbHZlIHRvIGF2b2lkIGhhbmdpbmcgcHJvbWlzZXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpc1JlbGV2YW50O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gTG9hZCB0aGUgY3VycmVudCB2aXNpYmxlIHJhbmdlIGlmIG5lZWRlZFxuICAgICAgICAgIGF3YWl0IGxvYWRNaXNzaW5nUmFuZ2VzKHZpc2libGVSYW5nZSwgXCJ2aWV3cG9ydDppZGxlXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxzbyBwcm9jZXNzIGFueSBxdWV1ZWQgcmVxdWVzdHNcbiAgICAgICAgcHJvY2Vzc1F1ZXVlKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtIHJlbW92YWwgLSBET04nVCBjbGVhciBsb2FkZWRSYW5nZXMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZWxvYWRcbiAgICAgIC8vIFRoZSBkYXRhIGlzIGFscmVhZHkgc2hpZnRlZCBsb2NhbGx5IGluIGFwaS50cyBhbmQgcmVuZGVyaW5nLnRzXG4gICAgICAvLyBSZWxvYWRpbmcgd291bGQgY2F1c2UgcmFjZSBjb25kaXRpb25zIGFuZCBvdmVyd3JpdGUgdGhlIGNvcnJlY3QgdG90YWxJdGVtc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJpdGVtOnJlbW92ZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW0NvbGxlY3Rpb25dIGl0ZW06cmVtb3ZlZCBldmVudCAtIGluZGV4OiAke2RhdGEuaW5kZXh9YCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBbQ29sbGVjdGlvbl0gaXRlbXMubGVuZ3RoOiAke2l0ZW1zLmxlbmd0aH1gKTtcblxuICAgICAgICAvLyBVcGRhdGUgZGlzY292ZXJlZFRvdGFsIHRvIG1hdGNoIHRoZSBuZXcgY291bnRcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBzdGFsZSBkaXNjb3ZlcmVkVG90YWwgZnJvbSBiZWluZyB1c2VkIG9uIG5leHQgbG9hZFxuICAgICAgICBpZiAoZGlzY292ZXJlZFRvdGFsICE9PSBudWxsICYmIGRpc2NvdmVyZWRUb3RhbCA+IDApIHtcbiAgICAgICAgICBkaXNjb3ZlcmVkVG90YWwgPSBkaXNjb3ZlcmVkVG90YWwgLSAxO1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBVcGRhdGVkIGRpc2NvdmVyZWRUb3RhbCB0bzogJHtkaXNjb3ZlcmVkVG90YWx9YCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTk9URTogRG8gTk9UIGRlY3JlbWVudCB0b3RhbEl0ZW1zIGhlcmUhXG4gICAgICAgIC8vIGFwaS50cyBhbHJlYWR5IGNhbGxzIHNldFRvdGFsSXRlbXMoKSBhZnRlciBlbWl0dGluZyBpdGVtOnJlbW92ZS1yZXF1ZXN0LFxuICAgICAgICAvLyB3aGljaCBwcm9wZXJseSB1cGRhdGVzIHRvdGFsSXRlbXMuIERlY3JlbWVudGluZyBoZXJlIHdvdWxkIGNhdXNlIGEgZG91YmxlLWRlY3JlbWVudC5cblxuICAgICAgICAvLyBET04nVCBjbGVhciBsb2FkZWRSYW5nZXMgLSB3ZSB3YW50IHRvIGtlZXAgdXNpbmcgdGhlIGxvY2FsIGRhdGFcbiAgICAgICAgLy8gVGhlIGRhdGEgaGFzIGJlZW4gc2hpZnRlZCBsb2NhbGx5IGFuZCBpcyBzdGlsbCB2YWxpZFxuICAgICAgICAvLyBDbGVhcmluZyB3b3VsZCB0cmlnZ2VyIGEgcmVsb2FkIHdoaWNoIGNhdXNlcyByYWNlIGNvbmRpdGlvbnNcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBLZWVwaW5nIGxvYWRlZFJhbmdlcyBpbnRhY3Q6YCxcbiAgICAgICAgLy8gICBBcnJheS5mcm9tKGxvYWRlZFJhbmdlcyksXG4gICAgICAgIC8vICk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTG9hZCBpbml0aWFsIGRhdGEgaWYgY29sbGVjdGlvbiBpcyBhdmFpbGFibGUgYW5kIGF1dG9Mb2FkIGlzIGVuYWJsZWRcbiAgICAgIGlmIChjb2xsZWN0aW9uICYmIGF1dG9Mb2FkKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgYW4gaW5pdGlhbCBzY3JvbGwgaW5kZXggT1IgYSBzZWxlY3RJZCwgbG9hZCBkYXRhIGZvciB0aGF0IHBvc2l0aW9uIGRpcmVjdGx5XG4gICAgICAgIC8vIERvbid0IHVzZSBzY3JvbGxUb0luZGV4KCkgYXMgaXQgdHJpZ2dlcnMgYW5pbWF0aW9uL3ZlbG9jaXR5IHRyYWNraW5nXG4gICAgICAgIC8vIHZpcnR1YWwudHMgaGFzIGFscmVhZHkgc2V0IHRoZSBzY3JvbGwgcG9zaXRpb24gYW5kIGNhbGN1bGF0ZWQgdGhlIHZpc2libGUgcmFuZ2VcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGluaXRpYWxTY3JvbGxJbmRleCA+IDAgfHxcbiAgICAgICAgICAoc2VsZWN0SWQgIT09IHVuZGVmaW5lZCAmJiBzZWxlY3RJZCAhPT0gbnVsbClcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gR2V0IHRoZSB2aXNpYmxlIHJhbmdlIHRoYXQgd2FzIGFscmVhZHkgY2FsY3VsYXRlZCBieSB2aXJ0dWFsLnRzXG4gICAgICAgICAgLy8gV2UgbWlzc2VkIHRoZSBpbml0aWFsIHZpZXdwb3J0OnJhbmdlLWNoYW5nZWQgZXZlbnQgYmVjYXVzZSBvdXIgbGlzdGVuZXIgd2Fzbid0IHJlYWR5IHlldFxuICAgICAgICAgIGNvbnN0IHZpc2libGVSYW5nZSA9IGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0VmlzaWJsZVJhbmdlPy4oKTtcblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHZpc2libGVSYW5nZSAmJlxuICAgICAgICAgICAgKHZpc2libGVSYW5nZS5zdGFydCA+IDAgfHwgdmlzaWJsZVJhbmdlLmVuZCA+IDApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBVc2UgdGhlIHByZS1jYWxjdWxhdGVkIHZpc2libGUgcmFuZ2UgZnJvbSB2aXJ0dWFsLnRzXG4gICAgICAgICAgICBsb2FkTWlzc2luZ1Jhbmdlcyh2aXNpYmxlUmFuZ2UsIFwiaW5pdGlhbC1wb3NpdGlvblwiKVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgLy8gRW1pdCBldmVudCB0byBzZWxlY3QgaXRlbSBhZnRlciBpbml0aWFsIGxvYWQgaWYgc2VsZWN0SWQgaXMgcHJvdmlkZWRcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImNvbGxlY3Rpb246aW5pdGlhbC1sb2FkLWNvbXBsZXRlXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0SWQsXG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxTY3JvbGxJbmRleCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICBcIltDb2xsZWN0aW9uXSBGYWlsZWQgdG8gbG9hZCBpbml0aWFsIHBvc2l0aW9uIGRhdGE6XCIsXG4gICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQgPSB0cnVlOyAvLyBBbGxvdyBub3JtYWwgbG9hZGluZyBldmVuIG9uIGVycm9yXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFjazogY2FsY3VsYXRlIHJhbmdlIGZyb20gaW5pdGlhbFNjcm9sbEluZGV4XG4gICAgICAgICAgICAvLyBUaGlzIGhhbmRsZXMgZWRnZSBjYXNlcyB3aGVyZSB2aXNpYmxlUmFuZ2Ugd2Fzbid0IHJlYWR5XG4gICAgICAgICAgICBjb25zdCBvdmVyc2NhbiA9IDI7XG4gICAgICAgICAgICBjb25zdCBlc3RpbWF0ZWRWaXNpYmxlQ291bnQgPSBNYXRoLmNlaWwoNjAwIC8gNTApOyAvLyB+MTIgaXRlbXNcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoMCwgaW5pdGlhbFNjcm9sbEluZGV4IC0gb3ZlcnNjYW4pO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gaW5pdGlhbFNjcm9sbEluZGV4ICsgZXN0aW1hdGVkVmlzaWJsZUNvdW50ICsgb3ZlcnNjYW47XG5cbiAgICAgICAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzKHsgc3RhcnQsIGVuZCB9LCBcImluaXRpYWwtcG9zaXRpb24tZmFsbGJhY2tcIilcbiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vIEVtaXQgZXZlbnQgdG8gc2VsZWN0IGl0ZW0gYWZ0ZXIgaW5pdGlhbCBsb2FkIGlmIHNlbGVjdElkIGlzIHByb3ZpZGVkXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJjb2xsZWN0aW9uOmluaXRpYWwtbG9hZC1jb21wbGV0ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdElkLFxuICAgICAgICAgICAgICAgICAgICBpbml0aWFsU2Nyb2xsSW5kZXgsXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgXCJbQ29sbGVjdGlvbl0gRmFpbGVkIHRvIGxvYWQgaW5pdGlhbCBwb3NpdGlvbiBkYXRhIChmYWxsYmFjayk6XCIsXG4gICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQgPSB0cnVlOyAvLyBBbGxvdyBub3JtYWwgbG9hZGluZyBldmVuIG9uIGVycm9yXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBpbml0aWFsIHNjcm9sbCBpbmRleCAtIGxvYWQgZnJvbSBiZWdpbm5pbmcgYXMgbm9ybWFsXG4gICAgICAgIGxvYWRSYW5nZSgwLCByYW5nZVNpemUpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGF1dG9TZWxlY3RGaXJzdCAtIGdldCBmaXJzdCBpdGVtIElEIGFuZCBlbWl0IHNlbGVjdGlvbiBldmVudFxuICAgICAgICAgICAgaWYgKGF1dG9TZWxlY3RGaXJzdCAmJiBpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZpcnN0SXRlbSA9IGl0ZW1zWzBdO1xuICAgICAgICAgICAgICBjb25zdCBmaXJzdElkID0gZmlyc3RJdGVtPy5faWQgfHwgZmlyc3RJdGVtPy5pZDtcbiAgICAgICAgICAgICAgaWYgKGZpcnN0SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJjb2xsZWN0aW9uOmluaXRpYWwtbG9hZC1jb21wbGV0ZVwiLCB7XG4gICAgICAgICAgICAgICAgICBzZWxlY3RJZDogZmlyc3RJZCxcbiAgICAgICAgICAgICAgICAgIGluaXRpYWxTY3JvbGxJbmRleDogMCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIltDb2xsZWN0aW9uXSBGYWlsZWQgdG8gbG9hZCBpbml0aWFsIGRhdGE6XCIsIGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVzZXQgY29sbGVjdGlvbiBzdGF0ZSB3aXRob3V0IGRlc3Ryb3lpbmcgdGhlIGNvbXBvbmVudFxuICAgICAqIENsZWFycyBhbGwgbG9hZGVkIGRhdGEgYW5kIHByZXBhcmVzIGZvciBmcmVzaCBsb2FkXG4gICAgICovXG4gICAgY29uc3QgcmVzZXQgPSAoKSA9PiB7XG4gICAgICBsb2dNZW1vcnlTdGF0cyhcInJlc2V0OmJlZm9yZVwiKTtcblxuICAgICAgLy8gQWJvcnQgYWxsIGluLWZsaWdodCByZXF1ZXN0c1xuICAgICAgYWJvcnRDb250cm9sbGVycy5mb3JFYWNoKChjb250cm9sbGVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gSWdub3JlIGFib3J0IGVycm9yc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGFib3J0Q29udHJvbGxlcnMuY2xlYXIoKTtcblxuICAgICAgLy8gQ2xlYXIgYWxsIGRhdGEgc3RydWN0dXJlc1xuICAgICAgaXRlbXMubGVuZ3RoID0gMDtcbiAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID0gMDtcbiAgICAgIGxvYWRlZFJhbmdlcy5jbGVhcigpO1xuICAgICAgcGVuZGluZ1Jhbmdlcy5jbGVhcigpO1xuICAgICAgZmFpbGVkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICBhY3RpdmVMb2FkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICBhY3RpdmVSZXF1ZXN0cy5jbGVhcigpO1xuICAgICAgY3Vyc29yTWFwLmNsZWFyKCk7XG4gICAgICBwYWdlVG9PZmZzZXRNYXAuY2xlYXIoKTtcblxuICAgICAgLy8gUmVzZXQgc3RhdGVcbiAgICAgIHRvdGFsSXRlbXMgPSAwO1xuICAgICAgY3VycmVudEN1cnNvciA9IG51bGw7XG4gICAgICBoaWdoZXN0TG9hZGVkUGFnZSA9IDA7XG4gICAgICBkaXNjb3ZlcmVkVG90YWwgPSBudWxsO1xuICAgICAgaGFzUmVhY2hlZEVuZCA9IGZhbHNlO1xuICAgICAgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IGZhbHNlO1xuXG4gICAgICAvLyBSZXNldCBjb3VudGVyc1xuICAgICAgYWN0aXZlTG9hZENvdW50ID0gMDtcbiAgICAgIGNvbXBsZXRlZExvYWRzID0gMDtcbiAgICAgIGZhaWxlZExvYWRzID0gMDtcbiAgICAgIGNhbmNlbGxlZExvYWRzID0gMDtcblxuICAgICAgLy8gVXBkYXRlIGNvbXBvbmVudCByZWZlcmVuY2VcbiAgICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuICAgICAgY29tcG9uZW50LnRvdGFsSXRlbXMgPSAwO1xuXG4gICAgICBsb2dNZW1vcnlTdGF0cyhcInJlc2V0OmFmdGVyXCIpO1xuXG4gICAgICAvLyBFbWl0IHJlc2V0IGV2ZW50XG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwiY29sbGVjdGlvbjpyZXNldFwiKTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIGNvbGxlY3Rpb24gQVBJIHRvIHZpZXdwb3J0XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24gPSB7XG4gICAgICBsb2FkUmFuZ2U6IChvZmZzZXQ6IG51bWJlciwgbGltaXQ6IG51bWJlcikgPT4gbG9hZFJhbmdlKG9mZnNldCwgbGltaXQpLFxuICAgICAgbG9hZE1pc3NpbmdSYW5nZXM6IChcbiAgICAgICAgcmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSxcbiAgICAgICAgY2FsbGVyPzogc3RyaW5nLFxuICAgICAgKSA9PiBsb2FkTWlzc2luZ1JhbmdlcyhyYW5nZSwgY2FsbGVyIHx8IFwidmlld3BvcnQuY29sbGVjdGlvblwiKSxcbiAgICAgIGdldExvYWRlZFJhbmdlczogKCkgPT4gbG9hZGVkUmFuZ2VzLFxuICAgICAgZ2V0UGVuZGluZ1JhbmdlczogKCkgPT4gcGVuZGluZ1JhbmdlcyxcbiAgICAgIGNsZWFyRmFpbGVkUmFuZ2VzOiAoKSA9PiBmYWlsZWRSYW5nZXMuY2xlYXIoKSxcbiAgICAgIHJldHJ5RmFpbGVkUmFuZ2UsXG4gICAgICBzZXRUb3RhbEl0ZW1zLFxuICAgICAgZ2V0VG90YWxJdGVtczogKCkgPT4gdG90YWxJdGVtcyxcbiAgICAgIC8vIEN1cnNvci1zcGVjaWZpYyBtZXRob2RzXG4gICAgICBnZXRDdXJyZW50Q3Vyc29yOiAoKSA9PiBjdXJyZW50Q3Vyc29yLFxuICAgICAgZ2V0Q3Vyc29yRm9yUGFnZTogKHBhZ2U6IG51bWJlcikgPT4gY3Vyc29yTWFwLmdldChwYWdlKSB8fCBudWxsLFxuICAgICAgLy8gUmVzZXQgbWV0aG9kIGZvciByZWxvYWQgZnVuY3Rpb25hbGl0eVxuICAgICAgcmVzZXQsXG4gICAgfTtcblxuICAgIC8vIEFkZCBjb2xsZWN0aW9uIGRhdGEgYWNjZXNzIHdpdGggZGlyZWN0IGFzc2lnbm1lbnRcbiAgICAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbiA9IHtcbiAgICAgIGl0ZW1zLFxuICAgICAgZ2V0SXRlbXM6ICgpID0+IGl0ZW1zLFxuICAgICAgZ2V0SXRlbTogKGluZGV4OiBudW1iZXIpID0+IGl0ZW1zW2luZGV4XSxcbiAgICAgIGxvYWRSYW5nZSxcbiAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzOiAoXG4gICAgICAgIHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sXG4gICAgICAgIGNhbGxlcj86IHN0cmluZyxcbiAgICAgICkgPT4gbG9hZE1pc3NpbmdSYW5nZXMocmFuZ2UsIGNhbGxlciB8fCBcImNvbXBvbmVudC5jb2xsZWN0aW9uXCIpLFxuICAgICAgZ2V0TG9hZGluZ1N0YXRzOiAoKSA9PiAoe1xuICAgICAgICBwZW5kaW5nUmVxdWVzdHM6IGFjdGl2ZUxvYWRDb3VudCxcbiAgICAgICAgY29tcGxldGVkUmVxdWVzdHM6IGNvbXBsZXRlZExvYWRzLFxuICAgICAgICBmYWlsZWRSZXF1ZXN0czogZmFpbGVkTG9hZHMsXG4gICAgICAgIGNhbmNlbGxlZFJlcXVlc3RzOiBjYW5jZWxsZWRMb2FkcyxcbiAgICAgICAgY3VycmVudFZlbG9jaXR5LFxuICAgICAgICBjYW5Mb2FkOiBjYW5Mb2FkKCksXG4gICAgICAgIHF1ZXVlZFJlcXVlc3RzOiBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCxcbiAgICAgIH0pLFxuICAgICAgLy8gVG90YWwgaXRlbXMgbWFuYWdlbWVudFxuICAgICAgZ2V0VG90YWxJdGVtczogKCkgPT4gdG90YWxJdGVtcyxcbiAgICAgIHNldFRvdGFsSXRlbXMsXG4gICAgICAvLyBDdXJzb3IgbWV0aG9kc1xuICAgICAgZ2V0Q3VycmVudEN1cnNvcjogKCkgPT4gY3VycmVudEN1cnNvcixcbiAgICAgIGdldEN1cnNvckZvclBhZ2U6IChwYWdlOiBudW1iZXIpID0+IGN1cnNvck1hcC5nZXQocGFnZSkgfHwgbnVsbCxcbiAgICAgIC8vIFJlc2V0IG1ldGhvZCBmb3IgcmVsb2FkIGZ1bmN0aW9uYWxpdHlcbiAgICAgIHJlc2V0LFxuICAgIH07XG5cbiAgICAvLyBBbHNvIGVuc3VyZSBjb21wb25lbnQuaXRlbXMgaXMgdXBkYXRlZFxuICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuXG4gICAgLy8gQ2xlYW51cCBmdW5jdGlvbiAtIGNvbXByZWhlbnNpdmUgbWVtb3J5IGNsZWFudXBcbiAgICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgbG9nTWVtb3J5U3RhdHMoXCJkZXN0cm95OmJlZm9yZVwiKTtcblxuICAgICAgLy8gQWJvcnQgYWxsIGluLWZsaWdodCByZXF1ZXN0c1xuICAgICAgYWJvcnRDb250cm9sbGVycy5mb3JFYWNoKChjb250cm9sbGVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gSWdub3JlIGFib3J0IGVycm9yc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGFib3J0Q29udHJvbGxlcnMuY2xlYXIoKTtcblxuICAgICAgLy8gQ2xlYXIgYWxsIGRhdGEgc3RydWN0dXJlc1xuICAgICAgaXRlbXMubGVuZ3RoID0gMDtcbiAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID0gMDtcbiAgICAgIGxvYWRlZFJhbmdlcy5jbGVhcigpO1xuICAgICAgcGVuZGluZ1Jhbmdlcy5jbGVhcigpO1xuICAgICAgZmFpbGVkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICBhY3RpdmVMb2FkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICBhY3RpdmVSZXF1ZXN0cy5jbGVhcigpO1xuICAgICAgY3Vyc29yTWFwLmNsZWFyKCk7XG4gICAgICBwYWdlVG9PZmZzZXRNYXAuY2xlYXIoKTtcblxuICAgICAgLy8gUmVzZXQgc3RhdGVcbiAgICAgIHRvdGFsSXRlbXMgPSAwO1xuICAgICAgY3VycmVudEN1cnNvciA9IG51bGw7XG4gICAgICBoaWdoZXN0TG9hZGVkUGFnZSA9IDA7XG4gICAgICBkaXNjb3ZlcmVkVG90YWwgPSBudWxsO1xuICAgICAgaGFzUmVhY2hlZEVuZCA9IGZhbHNlO1xuXG4gICAgICAvLyBDbGVhciBjb21wb25lbnQgcmVmZXJlbmNlXG4gICAgICBpZiAoY29tcG9uZW50Lml0ZW1zID09PSBpdGVtcykge1xuICAgICAgICBjb21wb25lbnQuaXRlbXMgPSBbXTtcbiAgICAgIH1cblxuICAgICAgbG9nTWVtb3J5U3RhdHMoXCJkZXN0cm95OmFmdGVyXCIpO1xuICAgIH07XG5cbiAgICAvLyBXaXJlIGRlc3Ryb3kgaW50byB0aGUgY29tcG9uZW50J3MgZGVzdHJveSBjaGFpblxuICAgIHdyYXBEZXN0cm95KGNvbXBvbmVudCwgZGVzdHJveSk7XG5cbiAgICAvLyBSZXR1cm4gZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIGNvbGxlY3Rpb246IHtcbiAgICAgICAgLy8gRGF0YSBhY2Nlc3MgbWV0aG9kc1xuICAgICAgICBpdGVtcyxcbiAgICAgICAgZ2V0SXRlbXM6ICgpID0+IGl0ZW1zLFxuICAgICAgICBnZXRJdGVtOiAoaW5kZXg6IG51bWJlcikgPT4gaXRlbXNbaW5kZXhdLFxuICAgICAgICAvLyBMb2FkaW5nIG1ldGhvZHNcbiAgICAgICAgbG9hZFJhbmdlLFxuICAgICAgICBsb2FkTWlzc2luZ1JhbmdlczogKFxuICAgICAgICAgIHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sXG4gICAgICAgICAgY2FsbGVyPzogc3RyaW5nLFxuICAgICAgICApID0+IGxvYWRNaXNzaW5nUmFuZ2VzKHJhbmdlLCBjYWxsZXIgfHwgXCJyZXR1cm4uY29sbGVjdGlvblwiKSxcbiAgICAgICAgZ2V0TG9hZGVkUmFuZ2VzOiAoKSA9PiBsb2FkZWRSYW5nZXMsXG4gICAgICAgIGdldFBlbmRpbmdSYW5nZXM6ICgpID0+IHBlbmRpbmdSYW5nZXMsXG4gICAgICAgIGNsZWFyRmFpbGVkUmFuZ2VzOiAoKSA9PiBmYWlsZWRSYW5nZXMuY2xlYXIoKSxcbiAgICAgICAgcmV0cnlGYWlsZWRSYW5nZSxcbiAgICAgICAgc2V0VG90YWxJdGVtcyxcbiAgICAgICAgZ2V0VG90YWxJdGVtczogKCkgPT4gdG90YWxJdGVtcyxcbiAgICAgICAgLy8gQ3Vyc29yLXNwZWNpZmljIG1ldGhvZHNcbiAgICAgICAgZ2V0Q3VycmVudEN1cnNvcjogKCkgPT4gY3VycmVudEN1cnNvcixcbiAgICAgICAgZ2V0Q3Vyc29yRm9yUGFnZTogKHBhZ2U6IG51bWJlcikgPT4gY3Vyc29yTWFwLmdldChwYWdlKSB8fCBudWxsLFxuICAgICAgICAvLyBSZXNldCBtZXRob2QgZm9yIHJlbG9hZCBmdW5jdGlvbmFsaXR5XG4gICAgICAgIHJlc2V0LFxuICAgICAgfSxcbiAgICB9O1xuICB9O1xufVxuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9wbGFjZWhvbGRlcnMudHNcblxuLyoqXG4gKiBQbGFjZWhvbGRlciBGZWF0dXJlIC0gU21hcnQgcGxhY2Vob2xkZXIgZ2VuZXJhdGlvblxuICogQW5hbHl6ZXMgZmlyc3QgbG9hZGVkIGRhdGEgdG8gZ2VuZXJhdGUgcmVhbGlzdGljIG1hc2tlZCBwbGFjZWhvbGRlcnNcbiAqIFNob3dzIHBsYWNlaG9sZGVycyB3aGlsZSBkYXRhIGlzIGxvYWRpbmdcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2xsZWN0aW9uQ29tcG9uZW50IH0gZnJvbSBcIi4vY29sbGVjdGlvblwiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHBsYWNlaG9sZGVyIGZlYXR1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGFjZWhvbGRlckNvbmZpZyB7XG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuICBhbmFseXplRmlyc3RMb2FkPzogYm9vbGVhbjtcbiAgbWFza0NoYXJhY3Rlcj86IHN0cmluZztcbiAgcmFuZG9tTGVuZ3RoVmFyaWFuY2U/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEZpZWxkIHN0cnVjdHVyZSBmb3IgcGxhY2Vob2xkZXIgZ2VuZXJhdGlvblxuICovXG5pbnRlcmZhY2UgRmllbGRTdHJ1Y3R1cmUge1xuICBtaW5MZW5ndGg6IG51bWJlcjtcbiAgbWF4TGVuZ3RoOiBudW1iZXI7XG4gIGF2Z0xlbmd0aDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYWNlaG9sZGVyQ29tcG9uZW50IHtcbiAgcGxhY2Vob2xkZXJzOiB7XG4gICAgYW5hbHl6ZURhdGFTdHJ1Y3R1cmU6IChpdGVtczogYW55W10pID0+IHZvaWQ7XG4gICAgaGFzQW5hbHl6ZWRTdHJ1Y3R1cmU6ICgpID0+IGJvb2xlYW47XG4gICAgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW06IChpbmRleDogbnVtYmVyKSA9PiBhbnk7XG4gICAgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW1zOiAocmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSkgPT4gYW55W107XG4gICAgc2hvd1BsYWNlaG9sZGVyczogKHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pID0+IHZvaWQ7XG4gICAgaXNQbGFjZWhvbGRlcjogKGl0ZW06IGFueSkgPT4gYm9vbGVhbjtcbiAgICByZXBsYWNlUGxhY2Vob2xkZXJzOiAoaXRlbXM6IGFueVtdLCBvZmZzZXQ6IG51bWJlcikgPT4gdm9pZDtcbiAgICBjbGVhcjogKCkgPT4gdm9pZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBBZGRzIHBsYWNlaG9sZGVyIGZ1bmN0aW9uYWxpdHkgdG8gdmlld3BvcnQgY29tcG9uZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUGxhY2Vob2xkZXJzKGNvbmZpZzogUGxhY2Vob2xkZXJDb25maWcgPSB7fSkge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBDb2xsZWN0aW9uQ29tcG9uZW50PihcbiAgICBjb21wb25lbnQ6IFRcbiAgKTogVCAmIFBsYWNlaG9sZGVyQ29tcG9uZW50ID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICAgIGFuYWx5emVGaXJzdExvYWQgPSB0cnVlLFxuICAgICAgbWFza0NoYXJhY3RlciA9IFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVNLX0NIQVJBQ1RFUixcbiAgICAgIHJhbmRvbUxlbmd0aFZhcmlhbmNlID0gVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSXG4gICAgICAgIC5SQU5ET01fTEVOR1RIX1ZBUklBTkNFLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBTdGF0ZVxuICAgIGxldCBmaWVsZFN0cnVjdHVyZXM6IE1hcDxzdHJpbmcsIEZpZWxkU3RydWN0dXJlPiB8IG51bGwgPSBudWxsO1xuICAgIGxldCBoYXNBbmFseXplZCA9IGZhbHNlO1xuICAgIGxldCBwbGFjZWhvbGRlcklkQ291bnRlciA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBBbmFseXplIGRhdGEgc3RydWN0dXJlIGZyb20gZmlyc3QgbG9hZGVkIGl0ZW1zXG4gICAgICovXG4gICAgY29uc3QgYW5hbHl6ZURhdGFTdHJ1Y3R1cmUgPSAoaXRlbXM6IGFueVtdKTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWVuYWJsZWQgfHwgaGFzQW5hbHl6ZWQgfHwgIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBg8J+UjSBbUExBQ0VIT0xERVJTXSBBbmFseXppbmcgZGF0YSBzdHJ1Y3R1cmUgZnJvbSAke2l0ZW1zLmxlbmd0aH0gaXRlbXNgXG4gICAgICAvLyApO1xuXG4gICAgICBjb25zdCBzdHJ1Y3R1cmVzID0gbmV3IE1hcDxzdHJpbmcsIEZpZWxkU3RydWN0dXJlPigpO1xuICAgICAgY29uc3Qgc2FtcGxlU2l6ZSA9IE1hdGgubWluKFxuICAgICAgICBpdGVtcy5sZW5ndGgsXG4gICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVhfU0FNUExFX1NJWkVcbiAgICAgICk7XG5cbiAgICAgIC8vIEFuYWx5emUgZWFjaCBmaWVsZCBhY3Jvc3MgYWxsIHNhbXBsZSBpdGVtc1xuICAgICAgY29uc3QgZmllbGRTdGF0cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzYW1wbGVTaXplOyBpKyspIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgICBpZiAoIWl0ZW0gfHwgdHlwZW9mIGl0ZW0gIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKGl0ZW0pLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgLy8gU2tpcCBpbnRlcm5hbCBmaWVsZHNcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBmaWVsZC5zdGFydHNXaXRoKFwiX1wiKSB8fFxuICAgICAgICAgICAgZmllbGQgPT09IFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5QTEFDRUhPTERFUl9GTEFHXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBTdHJpbmcoaXRlbVtmaWVsZF0gfHwgXCJcIik7XG4gICAgICAgICAgY29uc3QgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuXG4gICAgICAgICAgaWYgKCFmaWVsZFN0YXRzLmhhcyhmaWVsZCkpIHtcbiAgICAgICAgICAgIGZpZWxkU3RhdHMuc2V0KGZpZWxkLCBbXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZpZWxkU3RhdHMuZ2V0KGZpZWxkKSEucHVzaChsZW5ndGgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsY3VsYXRlIHN0YXRpc3RpY3MgZm9yIGVhY2ggZmllbGRcbiAgICAgIGZpZWxkU3RhdHMuZm9yRWFjaCgobGVuZ3RocywgZmllbGQpID0+IHtcbiAgICAgICAgaWYgKGxlbmd0aHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgbWluTGVuZ3RoID0gTWF0aC5taW4oLi4ubGVuZ3Rocyk7XG4gICAgICAgIGNvbnN0IG1heExlbmd0aCA9IE1hdGgubWF4KC4uLmxlbmd0aHMpO1xuICAgICAgICBjb25zdCBhdmdMZW5ndGggPSBNYXRoLnJvdW5kKFxuICAgICAgICAgIGxlbmd0aHMucmVkdWNlKChzdW0sIGxlbikgPT4gc3VtICsgbGVuLCAwKSAvIGxlbmd0aHMubGVuZ3RoXG4gICAgICAgICk7XG5cbiAgICAgICAgc3RydWN0dXJlcy5zZXQoZmllbGQsIHtcbiAgICAgICAgICBtaW5MZW5ndGgsXG4gICAgICAgICAgbWF4TGVuZ3RoLFxuICAgICAgICAgIGF2Z0xlbmd0aCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZmllbGRTdHJ1Y3R1cmVzID0gc3RydWN0dXJlcztcbiAgICAgIGhhc0FuYWx5emVkID0gdHJ1ZTtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGDinIUgW1BMQUNFSE9MREVSU10gU3RydWN0dXJlIGFuYWx5emVkOmAsXG4gICAgICAvLyAgIE9iamVjdC5mcm9tRW50cmllcyhzdHJ1Y3R1cmVzKVxuICAgICAgLy8gKTtcblxuICAgICAgLy8gRW1pdCBldmVudFxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnBsYWNlaG9sZGVycy1zdHJ1Y3R1cmUtYW5hbHl6ZWRcIiwge1xuICAgICAgICBzdHJ1Y3R1cmU6IE9iamVjdC5mcm9tRW50cmllcyhzdHJ1Y3R1cmVzKSxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBhIHNpbmdsZSBwbGFjZWhvbGRlciBpdGVtXG4gICAgICovXG4gICAgY29uc3QgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW0gPSAoaW5kZXg6IG51bWJlcik6IGFueSA9PiB7XG4gICAgICBjb25zdCBwbGFjZWhvbGRlcjogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgICAgaWQ6IGBwbGFjZWhvbGRlci0ke3BsYWNlaG9sZGVySWRDb3VudGVyKyt9YCxcbiAgICAgICAgW1ZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5QTEFDRUhPTERFUl9GTEFHXTogdHJ1ZSxcbiAgICAgICAgX2luZGV4OiBpbmRleCxcbiAgICAgIH07XG5cbiAgICAgIGlmICghZmllbGRTdHJ1Y3R1cmVzIHx8IGZpZWxkU3RydWN0dXJlcy5zaXplID09PSAwKSB7XG4gICAgICAgIC8vIE5vIHN0cnVjdHVyZSBhbmFseXplZCB5ZXQgLSByZXR1cm4gYmFzaWMgcGxhY2Vob2xkZXJcbiAgICAgICAgcGxhY2Vob2xkZXIubGFiZWwgPSBtYXNrQ2hhcmFjdGVyLnJlcGVhdCgxMCk7XG4gICAgICAgIHJldHVybiBwbGFjZWhvbGRlcjtcbiAgICAgIH1cblxuICAgICAgLy8gR2VuZXJhdGUgZmllbGRzIGJhc2VkIG9uIGFuYWx5emVkIHN0cnVjdHVyZVxuICAgICAgZmllbGRTdHJ1Y3R1cmVzLmZvckVhY2goKHN0cnVjdHVyZSwgZmllbGQpID0+IHtcbiAgICAgICAgbGV0IGxlbmd0aDogbnVtYmVyO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICByYW5kb21MZW5ndGhWYXJpYW5jZSAmJlxuICAgICAgICAgIHN0cnVjdHVyZS5taW5MZW5ndGggIT09IHN0cnVjdHVyZS5tYXhMZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gUmFuZG9tIGxlbmd0aCB3aXRoaW4gcmFuZ2VcbiAgICAgICAgICBsZW5ndGggPSBNYXRoLmZsb29yKFxuICAgICAgICAgICAgTWF0aC5yYW5kb20oKSAqIChzdHJ1Y3R1cmUubWF4TGVuZ3RoIC0gc3RydWN0dXJlLm1pbkxlbmd0aCArIDEpICtcbiAgICAgICAgICAgICAgc3RydWN0dXJlLm1pbkxlbmd0aFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVXNlIGF2ZXJhZ2UgbGVuZ3RoXG4gICAgICAgICAgbGVuZ3RoID0gc3RydWN0dXJlLmF2Z0xlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGx5IHNvbWUgdmFyaWF0aW9uIHRvIG1ha2UgaXQgbG9vayBtb3JlIG5hdHVyYWxcbiAgICAgICAgaWYgKHJhbmRvbUxlbmd0aFZhcmlhbmNlICYmIE1hdGgucmFuZG9tKCkgPCAwLjMpIHtcbiAgICAgICAgICBsZW5ndGggPSBNYXRoLm1heCgxLCBsZW5ndGggKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAzKSAtIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcGxhY2Vob2xkZXJbZmllbGRdID0gbWFza0NoYXJhY3Rlci5yZXBlYXQobGVuZ3RoKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcGxhY2Vob2xkZXI7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIG11bHRpcGxlIHBsYWNlaG9sZGVyIGl0ZW1zXG4gICAgICovXG4gICAgY29uc3QgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW1zID0gKHJhbmdlOiB7XG4gICAgICBzdGFydDogbnVtYmVyO1xuICAgICAgZW5kOiBudW1iZXI7XG4gICAgfSk6IGFueVtdID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1zOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IHJhbmdlLnN0YXJ0OyBpIDw9IHJhbmdlLmVuZDsgaSsrKSB7XG4gICAgICAgIGl0ZW1zLnB1c2goZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW0oaSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTaG93IHBsYWNlaG9sZGVycyBmb3IgYSByYW5nZVxuICAgICAqL1xuICAgIGNvbnN0IHNob3dQbGFjZWhvbGRlcnMgPSAocmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFlbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtcyhyYW5nZSk7XG5cbiAgICAgIC8vIFVwZGF0ZSBpdGVtcyBhcnJheVxuICAgICAgaWYgKGNvbXBvbmVudC5pdGVtcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsYWNlaG9sZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gcmFuZ2Uuc3RhcnQgKyBpO1xuICAgICAgICAgIGlmICghY29tcG9uZW50Lml0ZW1zW2luZGV4XSkge1xuICAgICAgICAgICAgY29tcG9uZW50Lml0ZW1zW2luZGV4XSA9IHBsYWNlaG9sZGVyc1tpXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGDwn5SEIFtQTEFDRUhPTERFUlNdIFNob3dpbmcgJHtwbGFjZWhvbGRlcnMubGVuZ3RofSBwbGFjZWhvbGRlcnMgZm9yIHJhbmdlICR7cmFuZ2Uuc3RhcnR9LSR7cmFuZ2UuZW5kfWBcbiAgICAgICk7XG5cbiAgICAgIC8vIEVtaXQgZXZlbnRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpwbGFjZWhvbGRlcnMtc2hvd25cIiwge1xuICAgICAgICByYW5nZSxcbiAgICAgICAgY291bnQ6IHBsYWNlaG9sZGVycy5sZW5ndGgsXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYW4gaXRlbSBpcyBhIHBsYWNlaG9sZGVyXG4gICAgICovXG4gICAgY29uc3QgaXNQbGFjZWhvbGRlciA9IChpdGVtOiBhbnkpOiBib29sZWFuID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGl0ZW0gJiZcbiAgICAgICAgdHlwZW9mIGl0ZW0gPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgaXRlbVtWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuUExBQ0VIT0xERVJfRkxBR10gPT09IHRydWVcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlcGxhY2UgcGxhY2Vob2xkZXJzIHdpdGggcmVhbCBkYXRhXG4gICAgICovXG4gICAgY29uc3QgcmVwbGFjZVBsYWNlaG9sZGVycyA9IChpdGVtczogYW55W10sIG9mZnNldDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWNvbXBvbmVudC5pdGVtcykgcmV0dXJuO1xuXG4gICAgICBsZXQgcmVwbGFjZWRDb3VudCA9IDA7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBvZmZzZXQgKyBpO1xuICAgICAgICBjb25zdCBjdXJyZW50SXRlbSA9IGNvbXBvbmVudC5pdGVtc1tpbmRleF07XG5cbiAgICAgICAgaWYgKGlzUGxhY2Vob2xkZXIoY3VycmVudEl0ZW0pKSB7XG4gICAgICAgICAgY29tcG9uZW50Lml0ZW1zW2luZGV4XSA9IGl0ZW1zW2ldO1xuICAgICAgICAgIHJlcGxhY2VkQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocmVwbGFjZWRDb3VudCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYOKcqCBbUExBQ0VIT0xERVJTXSBSZXBsYWNlZCAke3JlcGxhY2VkQ291bnR9IHBsYWNlaG9sZGVycyBhdCBvZmZzZXQgJHtvZmZzZXR9YFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEVtaXQgZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnBsYWNlaG9sZGVycy1yZXBsYWNlZFwiLCB7XG4gICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgIGNvdW50OiByZXBsYWNlZENvdW50LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIHBsYWNlaG9sZGVyIHN0YXRlXG4gICAgICovXG4gICAgY29uc3QgY2xlYXIgPSAoKTogdm9pZCA9PiB7XG4gICAgICBmaWVsZFN0cnVjdHVyZXMgPSBudWxsO1xuICAgICAgaGFzQW5hbHl6ZWQgPSBmYWxzZTtcbiAgICAgIHBsYWNlaG9sZGVySWRDb3VudGVyID0gMDtcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBmdW5jdGlvblxuICAgIGNvbnN0IGluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgICBpZiAoIWVuYWJsZWQpIHJldHVybjtcblxuICAgICAgLy8gTGlzdGVuIGZvciBmaXJzdCBkYXRhIGxvYWQgdG8gYW5hbHl6ZSBzdHJ1Y3R1cmVcbiAgICAgIGlmIChhbmFseXplRmlyc3RMb2FkKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZVJhbmdlTG9hZGVkID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgIGlmICghaGFzQW5hbHl6ZWQgJiYgZGF0YS5pdGVtcyAmJiBkYXRhLml0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFuYWx5emVEYXRhU3RydWN0dXJlKGRhdGEuaXRlbXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJlcGxhY2UgYW55IHBsYWNlaG9sZGVycyB3aXRoIHJlYWwgZGF0YVxuICAgICAgICAgIHJlcGxhY2VQbGFjZWhvbGRlcnMoZGF0YS5pdGVtcywgZGF0YS5vZmZzZXQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6cmFuZ2UtbG9hZGVkXCIsIGhhbmRsZVJhbmdlTG9hZGVkKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2hvdyBpbml0aWFsIHBsYWNlaG9sZGVycyBpZiBjb25maWd1cmVkXG4gICAgICBjb25zdCB0b3RhbEl0ZW1zID0gY29tcG9uZW50LmNvbGxlY3Rpb24/LmdldFRvdGFsSXRlbXMoKSB8fCAwO1xuICAgICAgaWYgKHRvdGFsSXRlbXMgPiAwKSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxSYW5nZSA9IHtcbiAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICBlbmQ6IE1hdGgubWluKFxuICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLk1BWF9TQU1QTEVfU0laRSAtIDEsXG4gICAgICAgICAgICB0b3RhbEl0ZW1zIC0gMVxuICAgICAgICAgICksXG4gICAgICAgIH07XG4gICAgICAgIHNob3dQbGFjZWhvbGRlcnMoaW5pdGlhbFJhbmdlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ2xlYW51cCBmdW5jdGlvblxuICAgIGNvbnN0IGRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICBjbGVhcigpO1xuICAgIH07XG5cbiAgICAvLyBTdG9yZSBmdW5jdGlvbnMgZm9yIHZpZXdwb3J0IHRvIGNhbGxcbiAgICAoY29tcG9uZW50IGFzIGFueSkuX3BsYWNlaG9sZGVyc0luaXRpYWxpemUgPSBpbml0aWFsaXplO1xuICAgIChjb21wb25lbnQgYXMgYW55KS5fcGxhY2Vob2xkZXJzRGVzdHJveSA9IGRlc3Ryb3k7XG5cbiAgICAvLyBSZXR1cm4gZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIHBsYWNlaG9sZGVyczoge1xuICAgICAgICBhbmFseXplRGF0YVN0cnVjdHVyZSxcbiAgICAgICAgaGFzQW5hbHl6ZWRTdHJ1Y3R1cmU6ICgpID0+IGhhc0FuYWx5emVkLFxuICAgICAgICBnZW5lcmF0ZVBsYWNlaG9sZGVySXRlbSxcbiAgICAgICAgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW1zLFxuICAgICAgICBzaG93UGxhY2Vob2xkZXJzLFxuICAgICAgICBpc1BsYWNlaG9sZGVyLFxuICAgICAgICByZXBsYWNlUGxhY2Vob2xkZXJzLFxuICAgICAgICBjbGVhcixcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn1cbiIsCiAgICAiLyoqXG4gKiBSZW5kZXJpbmcgRmVhdHVyZSAtIEl0ZW0gcmVuZGVyaW5nIGFuZCBwb3NpdGlvbmluZyBmb3Igdmlld3BvcnRcbiAqIEhhbmRsZXMgRE9NIGVsZW1lbnQgY3JlYXRpb24sIHBvc2l0aW9uaW5nLCByZWN5Y2xpbmcsIGFuZCB1cGRhdGVzXG4gKi9cblxuaW1wb3J0IHsgYWRkQ2xhc3MsIHJlbW92ZUNsYXNzLCBoYXNDbGFzcyB9IGZyb20gXCJtdHJsXCI7XG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIGlzUGxhY2Vob2xkZXIsXG4gIGdldFZpZXdwb3J0U3RhdGUsXG4gIHdyYXBJbml0aWFsaXplLFxuICB3cmFwRGVzdHJveSxcbn0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IGNyZWF0ZUxheW91dCB9IGZyb20gXCIuLi8uLi9sYXlvdXRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJpbmdDb25maWcge1xuICB0ZW1wbGF0ZT86IChcbiAgICBpdGVtOiBhbnksXG4gICAgaW5kZXg6IG51bWJlcixcbiAgKSA9PiBzdHJpbmcgfCBIVE1MRWxlbWVudCB8IGFueVtdIHwgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgb3ZlcnNjYW4/OiBudW1iZXI7XG4gIG1lYXN1cmVJdGVtcz86IGJvb2xlYW47XG4gIGVuYWJsZVJlY3ljbGluZz86IGJvb2xlYW47XG4gIG1heFBvb2xTaXplPzogbnVtYmVyO1xuICAvKipcbiAgICogTWFpbnRhaW4gRE9NIG9yZGVyIHRvIG1hdGNoIHZpc3VhbCBpbmRleCBvcmRlci5cbiAgICogRW5hYmxlcyBDU1Mgc2VsZWN0b3JzIGxpa2UgOmZpcnN0LWNoaWxkLCA6bnRoLWNoaWxkKCkgdG8gd29yayBjb3JyZWN0bHkuXG4gICAqIERlZmF1bHQ6IHRydWVcbiAgICovXG4gIG1haW50YWluRG9tT3JkZXI/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgVmlld3BvcnRTdGF0ZSB7XG4gIHNjcm9sbFBvc2l0aW9uOiBudW1iZXI7XG4gIHRvdGFsSXRlbXM6IG51bWJlcjtcbiAgaXRlbVNpemU6IG51bWJlcjtcbiAgY29udGFpbmVyU2l6ZTogbnVtYmVyO1xuICB2aXJ0dWFsVG90YWxTaXplOiBudW1iZXI7XG4gIHZpc2libGVSYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9O1xuICBpdGVtc0NvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsO1xufVxuXG4vKipcbiAqIFJlbmRlcmluZyBmZWF0dXJlIGZvciB2aWV3cG9ydFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFJlbmRlcmluZyA9IChjb25maWc6IFJlbmRlcmluZ0NvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50Pihjb21wb25lbnQ6IFQpOiBUID0+IHtcbiAgICBjb25zdCB7XG4gICAgICB0ZW1wbGF0ZSxcbiAgICAgIG92ZXJzY2FuID0gNSxcbiAgICAgIG1lYXN1cmVJdGVtcyA9IGZhbHNlLFxuICAgICAgZW5hYmxlUmVjeWNsaW5nID0gdHJ1ZSxcbiAgICAgIG1heFBvb2xTaXplID0gVklFV1BPUlRfQ09OU1RBTlRTLlJFTkRFUklORy5ERUZBVUxUX01BWF9QT09MX1NJWkUsXG4gICAgICBtYWludGFpbkRvbU9yZGVyID0gdHJ1ZSxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gSGVscGVyIHRvIGdldCBpdGVtcyBmcm9tIGNvbGxlY3Rpb24gKHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGgpXG4gICAgY29uc3QgZ2V0Q29sbGVjdGlvbkl0ZW1zID0gKCk6IGFueVtdID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uPy5pdGVtcyB8fCAoY29tcG9uZW50IGFzIGFueSkuaXRlbXMgfHwgW11cbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIFN0YXRlXG4gICAgY29uc3QgcmVuZGVyZWRFbGVtZW50cyA9IG5ldyBNYXA8bnVtYmVyLCBIVE1MRWxlbWVudD4oKTtcbiAgICBjb25zdCBlbGVtZW50UG9vbDogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICAgIGNvbnN0IHBvb2xTdGF0cyA9IHsgY3JlYXRlZDogMCwgcmVjeWNsZWQ6IDAsIHBvb2xTaXplOiAwLCByZWxlYXNlZDogMCB9O1xuXG4gICAgLy8gU3RvcmUgbGF5b3V0IHJlc3VsdHMgZm9yIHByb3BlciBjbGVhbnVwIChwcmV2ZW50cyBtZW1vcnkgbGVhaylcbiAgICBjb25zdCBsYXlvdXRSZXN1bHRzID0gbmV3IFdlYWtNYXA8SFRNTEVsZW1lbnQsIHsgZGVzdHJveTogKCkgPT4gdm9pZCB9PigpO1xuXG4gICAgLy8gUmV1c2FibGUgdGVtcGxhdGUgZWxlbWVudCBmb3IgSFRNTCBzdHJpbmcgcGFyc2luZyAobW9yZSBlZmZpY2llbnQgdGhhbiBkaXYpXG4gICAgY29uc3QgdGVtcGxhdGVQYXJzZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG5cbiAgICBsZXQgdmlld3BvcnRTdGF0ZTogVmlld3BvcnRTdGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjdXJyZW50VmlzaWJsZVJhbmdlID0geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgbGV0IGxhc3RSZW5kZXJUaW1lID0gMDtcbiAgICBsZXQgaXNSZW1vdmluZ0l0ZW0gPSBmYWxzZTtcblxuICAgIC8vIEVsZW1lbnQgcG9vbCBtYW5hZ2VtZW50XG4gICAgY29uc3QgZ2V0UG9vbGVkRWxlbWVudCA9ICgpOiBIVE1MRWxlbWVudCA9PiB7XG4gICAgICBpZiAoZW5hYmxlUmVjeWNsaW5nICYmIGVsZW1lbnRQb29sLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcG9vbFN0YXRzLnJlY3ljbGVkKys7XG4gICAgICAgIHJldHVybiBlbGVtZW50UG9vbC5wb3AoKSE7XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gXCJtdHJsLXZpZXdwb3J0LWl0ZW1cIjtcbiAgICAgIHBvb2xTdGF0cy5jcmVhdGVkKys7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVsZWFzZUVsZW1lbnQgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkID0+IHtcbiAgICAgIHBvb2xTdGF0cy5yZWxlYXNlZCsrO1xuXG4gICAgICAvLyBDUklUSUNBTDogQ2FsbCBkZXN0cm95IG9uIGxheW91dFJlc3VsdCB0byBjbGVhbiB1cCBjb21wb25lbnRzIGFuZCBldmVudCBsaXN0ZW5lcnNcbiAgICAgIC8vIFRoaXMgZml4ZXMgdGhlIG1lbW9yeSBsZWFrIHdoZW4gdXNpbmcgbGF5b3V0IHRlbXBsYXRlc1xuICAgICAgY29uc3QgbGF5b3V0UmVzdWx0ID0gbGF5b3V0UmVzdWx0cy5nZXQoZWxlbWVudCk7XG4gICAgICBpZiAobGF5b3V0UmVzdWx0ICYmIHR5cGVvZiBsYXlvdXRSZXN1bHQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGF5b3V0UmVzdWx0LmRlc3Ryb3koKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIElnbm9yZSBkZXN0cm95IGVycm9ycyAtIGVsZW1lbnQgbWF5IGFscmVhZHkgYmUgY2xlYW5lZCB1cFxuICAgICAgICB9XG4gICAgICAgIGxheW91dFJlc3VsdHMuZGVsZXRlKGVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVuYWJsZVJlY3ljbGluZykge1xuICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBDbGVhbiBlbGVtZW50IGZvciByZXVzZSAobm8gY2xvbmluZyAtIHJldXNlIHRoZSBhY3R1YWwgZWxlbWVudClcbiAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gXCJtdHJsLXZpZXdwb3J0LWl0ZW1cIjtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1pbmRleFwiKTtcbiAgICAgIGVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IFwiXCI7XG4gICAgICBlbGVtZW50LmlubmVySFRNTCA9IFwiXCI7XG5cbiAgICAgIC8vIFJlbW92ZSBmcm9tIERPTSBmaXJzdFxuICAgICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCB0byBwb29sIGlmIG5vdCBmdWxsXG4gICAgICBpZiAoZWxlbWVudFBvb2wubGVuZ3RoIDwgbWF4UG9vbFNpemUpIHtcbiAgICAgICAgZWxlbWVudFBvb2wucHVzaChlbGVtZW50KTtcbiAgICAgICAgcG9vbFN0YXRzLnBvb2xTaXplID0gZWxlbWVudFBvb2wubGVuZ3RoO1xuICAgICAgfVxuICAgICAgLy8gSWYgcG9vbCBpcyBmdWxsLCBlbGVtZW50IGlzIGp1c3QgZGVyZWZlcmVuY2VkIGFuZCBHQydkXG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemVcbiAgICB3cmFwSW5pdGlhbGl6ZShjb21wb25lbnQsICgpID0+IHtcbiAgICAgIHZpZXdwb3J0U3RhdGUgPSBnZXRWaWV3cG9ydFN0YXRlKGNvbXBvbmVudCkgYXMgVmlld3BvcnRTdGF0ZTtcblxuICAgICAgLy8gU2V0IGluaXRpYWwgaXRlbXMgY29udGFpbmVyIGhlaWdodCBmcm9tIGN1cnJlbnQgdmlydHVhbCBzaXplXG4gICAgICBpZiAodmlld3BvcnRTdGF0ZT8uaXRlbXNDb250YWluZXIgJiYgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplID4gMCkge1xuICAgICAgICB2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyLnN0eWxlLmhlaWdodCA9IGAke3ZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZX1weGA7XG4gICAgICB9XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgaXRlbSB1cGRhdGUgcmVxdWVzdHMgZnJvbSBBUElcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiaXRlbTp1cGRhdGUtcmVxdWVzdFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIGl0ZW0sIHByZXZpb3VzSXRlbSB9ID0gZGF0YTtcblxuICAgICAgICAvLyBJdGVtIGlzIGFscmVhZHkgdXBkYXRlZCBpbiBjb2xsZWN0aW9uLml0ZW1zIGJ5IGFwaS50c1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXRlbSBpcyBjdXJyZW50bHkgcmVuZGVyZWRcbiAgICAgICAgY29uc3QgZXhpc3RpbmdFbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5nZXQoaW5kZXgpO1xuICAgICAgICBjb25zdCB3YXNWaXNpYmxlID0gISFleGlzdGluZ0VsZW1lbnQ7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgaXRlbSB3YXMgc2VsZWN0ZWQgYmVmb3JlIHVwZGF0ZVxuICAgICAgICBjb25zdCB3YXNTZWxlY3RlZCA9IGV4aXN0aW5nRWxlbWVudFxuICAgICAgICAgID8gaGFzQ2xhc3MoXG4gICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudCxcbiAgICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlNFTEVDVElPTi5TRUxFQ1RFRF9DTEFTUyxcbiAgICAgICAgICAgICkgfHwgaGFzQ2xhc3MoZXhpc3RpbmdFbGVtZW50LCBcIm10cmwtdmlld3BvcnQtaXRlbS0tc2VsZWN0ZWRcIilcbiAgICAgICAgICA6IGZhbHNlO1xuXG4gICAgICAgIGlmIChleGlzdGluZ0VsZW1lbnQgJiYgZXhpc3RpbmdFbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAvLyBSZS1yZW5kZXIgdGhlIGl0ZW1cbiAgICAgICAgICBjb25zdCBuZXdFbGVtZW50ID0gcmVuZGVySXRlbShpdGVtLCBpbmRleCk7XG5cbiAgICAgICAgICBpZiAobmV3RWxlbWVudCkge1xuICAgICAgICAgICAgLy8gQ29weSBwb3NpdGlvbiBzdHlsZXMgZnJvbSBleGlzdGluZyBlbGVtZW50XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG5ld0VsZW1lbnQuc3R5bGUsIHtcbiAgICAgICAgICAgICAgcG9zaXRpb246IGV4aXN0aW5nRWxlbWVudC5zdHlsZS5wb3NpdGlvbixcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiBleGlzdGluZ0VsZW1lbnQuc3R5bGUudHJhbnNmb3JtLFxuICAgICAgICAgICAgICB3aWR0aDogZXhpc3RpbmdFbGVtZW50LnN0eWxlLndpZHRoLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIFByZXNlcnZlIHNlbGVjdGVkIHN0YXRlXG4gICAgICAgICAgICBpZiAod2FzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgYWRkQ2xhc3MobmV3RWxlbWVudCwgVklFV1BPUlRfQ09OU1RBTlRTLlNFTEVDVElPTi5TRUxFQ1RFRF9DTEFTUyk7XG4gICAgICAgICAgICAgIGFkZENsYXNzKG5ld0VsZW1lbnQsIFwibXRybC12aWV3cG9ydC1pdGVtLS1zZWxlY3RlZFwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIHVwZGF0ZSBhbmltYXRpb24gY2xhc3MgdG8gaW5uZXIgY29udGVudCBmb3IgdmlzaWJpbGl0eVxuICAgICAgICAgICAgYWRkQ2xhc3MobmV3RWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtLS11cGRhdGVkXCIpO1xuICAgICAgICAgICAgLy8gQWxzbyB0cnkgdG8gYWRkIHRvIGZpcnN0IGNoaWxkIGlmIGl0IGV4aXN0cyAodGhlIGFjdHVhbCBpdGVtIGNvbnRlbnQpXG4gICAgICAgICAgICBjb25zdCBpbm5lckl0ZW0gPSBuZXdFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgaWYgKGlubmVySXRlbSkge1xuICAgICAgICAgICAgICBhZGRDbGFzcyhpbm5lckl0ZW0sIFwiaXRlbS0tdXBkYXRlZFwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVwbGFjZSBpbiBET01cbiAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChcbiAgICAgICAgICAgICAgbmV3RWxlbWVudCxcbiAgICAgICAgICAgICAgZXhpc3RpbmdFbGVtZW50LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2V0KGluZGV4LCBuZXdFbGVtZW50KTtcbiAgICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGV4aXN0aW5nRWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYW5pbWF0aW9uIGNsYXNzIGFmdGVyIHRyYW5zaXRpb25cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICByZW1vdmVDbGFzcyhuZXdFbGVtZW50LCBcInZpZXdwb3J0LWl0ZW0tLXVwZGF0ZWRcIik7XG4gICAgICAgICAgICAgIGlmIChpbm5lckl0ZW0pIHtcbiAgICAgICAgICAgICAgICByZW1vdmVDbGFzcyhpbm5lckl0ZW0sIFwiaXRlbS0tdXBkYXRlZFwiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IGNvbXBsZXRpb24gZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW06dXBkYXRlZFwiLCB7XG4gICAgICAgICAgaXRlbSxcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBwcmV2aW91c0l0ZW0sXG4gICAgICAgICAgd2FzVmlzaWJsZSxcbiAgICAgICAgICB3YXNTZWxlY3RlZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtIHJlbW92ZSByZXF1ZXN0cyBmcm9tIEFQSVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJpdGVtOnJlbW92ZS1yZXF1ZXN0XCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgeyBpbmRleCwgaXRlbSB9ID0gZGF0YTtcbiAgICAgICAgaXNSZW1vdmluZ0l0ZW0gPSB0cnVlO1xuXG4gICAgICAgIC8vIEl0ZW0gaXMgYWxyZWFkeSByZW1vdmVkIGZyb20gY29sbGVjdGlvbi5pdGVtcyBieSBhcGkudHNcbiAgICAgICAgLy8gV2UganVzdCBuZWVkIHRvIHVwZGF0ZSByZW5kZXJlZCBlbGVtZW50c1xuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgcmVuZGVyZWQgZWxlbWVudCBhdCB0aGlzIGluZGV4XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGluZGV4KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nRWxlbWVudCAmJiBleGlzdGluZ0VsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGV4aXN0aW5nRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5kZWxldGUoaW5kZXgpO1xuXG4gICAgICAgIC8vIFNoaWZ0IHJlbmRlcmVkIGVsZW1lbnRzIGluZGljZXMgZG93blxuICAgICAgICBjb25zdCByZW5kZXJlZEtleXMgPSBBcnJheS5mcm9tKHJlbmRlcmVkRWxlbWVudHMua2V5cygpKS5zb3J0KFxuICAgICAgICAgIChhLCBiKSA9PiBhIC0gYixcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgbmV3UmVuZGVyZWRFbGVtZW50cyA9IG5ldyBNYXA8bnVtYmVyLCBIVE1MRWxlbWVudD4oKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgcmVuZGVyZWRLZXlzKSB7XG4gICAgICAgICAgaWYgKGtleSA+IGluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgIC8vIFVwZGF0ZSBkYXRhLWluZGV4IGF0dHJpYnV0ZVxuICAgICAgICAgICAgICBlbGVtZW50LmRhdGFzZXQuaW5kZXggPSBTdHJpbmcoa2V5IC0gMSk7XG4gICAgICAgICAgICAgIG5ld1JlbmRlcmVkRWxlbWVudHMuc2V0KGtleSAtIDEsIGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoa2V5IDwgaW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnRzLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgbmV3UmVuZGVyZWRFbGVtZW50cy5zZXQoa2V5LCBlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGVsZW1lbnRdIG9mIG5ld1JlbmRlcmVkRWxlbWVudHMpIHtcbiAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNldChrZXksIGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVjcmVtZW50IHRvdGFsSXRlbXMgTk9XIHNvIHJlbmRlckl0ZW1zKCkgdXNlcyB0aGUgY29ycmVjdCBjb3VudFxuICAgICAgICAvLyBzZXRUb3RhbEl0ZW1zKCkgd2lsbCBiZSBjYWxsZWQgbGF0ZXIgYnkgdGhlIEFQSSwgd2hpY2ggd2lsbCBlbWl0XG4gICAgICAgIC8vIHZpZXdwb3J0OnRvdGFsLWl0ZW1zLWNoYW5nZWQgZm9yIHZpcnR1YWwgc2l6ZSByZWNhbGN1bGF0aW9uXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlICYmIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyA+IDApIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMtLTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2V0IHZpc2libGUgcmFuZ2UgdG8gZm9yY2UgcmUtcmVuZGVyXG4gICAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB7IHN0YXJ0OiAtMSwgZW5kOiAtMSB9O1xuXG4gICAgICAgIC8vIEVtaXQgY29tcGxldGlvbiBldmVudFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbTpyZW1vdmVkXCIsIHtcbiAgICAgICAgICBpdGVtLFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBZnRlciBpdGVtIHJlbW92YWwsIGNsZWFyIEFMTCBsb2FkZWRSYW5nZXNcbiAgICAgICAgLy8gVGhpcyBmb3JjZXMgYSBjb21wbGV0ZSByZWxvYWQgd2hpY2ggaXMgbW9yZSByZWxpYWJsZSB0aGFuIHRyeWluZyB0b1xuICAgICAgICAvLyB0cmFjayBzaGlmdGVkIGluZGljZXMuIFRoZSBpdGVtcyBhcnJheSBoYXMgYmVlbiBzcGxpY2VkIGFuZCBhbGwgaW5kaWNlc1xuICAgICAgICAvLyBhcmUgbm93IGRpZmZlcmVudCBmcm9tIHdoYXQgbG9hZGVkUmFuZ2VzIHRoaW5rcyB0aGV5IGFyZS5cbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KT8uY29sbGVjdGlvbjtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24/LmdldExvYWRlZFJhbmdlcykge1xuICAgICAgICAgIGNvbnN0IGxvYWRlZFJhbmdlcyA9IGNvbGxlY3Rpb24uZ2V0TG9hZGVkUmFuZ2VzKCk7XG4gICAgICAgICAgbG9hZGVkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmlnZ2VyIHJlbG9hZCBvZiB2aXNpYmxlIHJhbmdlXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25JdGVtc0FyciA9IGdldENvbGxlY3Rpb25JdGVtcygpO1xuICAgICAgICBjb25zdCBsb2FkZWRJdGVtc0NvdW50ID0gY29sbGVjdGlvbkl0ZW1zQXJyLmxlbmd0aDtcbiAgICAgICAgY29uc3QgdmlzaWJsZVJhbmdlID0gY29tcG9uZW50LnZpZXdwb3J0Py5nZXRWaXNpYmxlUmFuZ2U/LigpO1xuICAgICAgICBpZiAodmlzaWJsZVJhbmdlICYmIGNvbGxlY3Rpb24/LmxvYWRNaXNzaW5nUmFuZ2VzKSB7XG4gICAgICAgICAgY29sbGVjdGlvbi5sb2FkTWlzc2luZ1JhbmdlcyhcbiAgICAgICAgICAgIHsgc3RhcnQ6IDAsIGVuZDogTWF0aC5tYXgodmlzaWJsZVJhbmdlLmVuZCwgbG9hZGVkSXRlbXNDb3VudCkgfSxcbiAgICAgICAgICAgIFwiaXRlbS1yZW1vdmFsXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyaWdnZXIgcmUtcmVuZGVyXG4gICAgICAgIHJlbmRlckl0ZW1zKCk7XG4gICAgICAgIGlzUmVtb3ZpbmdJdGVtID0gZmFsc2U7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtcyBhZGQgcmVxdWVzdHMgZnJvbSBBUElcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiaXRlbXM6YWRkLXJlcXVlc3RcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB7IGl0ZW1zOiBuZXdJdGVtcywgcG9zaXRpb24sIHByZXZpb3VzQ291bnQgfSA9IGRhdGE7XG5cbiAgICAgICAgaWYgKCFuZXdJdGVtcyB8fCBuZXdJdGVtcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICAvLyBJdGVtcyBhcmUgYWxyZWFkeSBhZGRlZCB0byBjb2xsZWN0aW9uLml0ZW1zIGJ5IGFwaS50c1xuICAgICAgICAvLyBXZSBqdXN0IG5lZWQgdG8gdXBkYXRlIHJlbmRlcmVkIGVsZW1lbnRzIGluZGljZXMgaWYgcHJlcGVuZGluZ1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zQWRkZWQgPSBuZXdJdGVtcy5sZW5ndGg7XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSBcInN0YXJ0XCIpIHtcbiAgICAgICAgICAvLyBJdGVtcyB3ZXJlIHByZXBlbmRlZCAtIHNoaWZ0IHJlbmRlcmVkIGVsZW1lbnQgaW5kaWNlc1xuICAgICAgICAgIGNvbnN0IHJlbmRlcmVkS2V5cyA9IEFycmF5LmZyb20ocmVuZGVyZWRFbGVtZW50cy5rZXlzKCkpLnNvcnQoXG4gICAgICAgICAgICAoYSwgYikgPT4gYiAtIGEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBuZXdSZW5kZXJlZEVsZW1lbnRzID0gbmV3IE1hcDxudW1iZXIsIEhUTUxFbGVtZW50PigpO1xuICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHJlbmRlcmVkS2V5cykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGtleSkhO1xuICAgICAgICAgICAgY29uc3QgbmV3SW5kZXggPSBrZXkgKyBpdGVtc0FkZGVkO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWluZGV4XCIsIFN0cmluZyhuZXdJbmRleCkpO1xuICAgICAgICAgICAgbmV3UmVuZGVyZWRFbGVtZW50cy5zZXQobmV3SW5kZXgsIGVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmNsZWFyKCk7XG4gICAgICAgICAgbmV3UmVuZGVyZWRFbGVtZW50cy5mb3JFYWNoKChlbCwgaWR4KSA9PlxuICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5zZXQoaWR4LCBlbCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgYXBwZW5kLCBubyBpbmRleCBzaGlmdGluZyBuZWVkZWRcblxuICAgICAgICAvLyBVcGRhdGUgdG90YWxJdGVtcyBpbiB2aWV3cG9ydFN0YXRlXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zID1cbiAgICAgICAgICAgICh2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgfHwgMCkgKyBpdGVtc0FkZGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzZXQgdmlzaWJsZSByYW5nZSB0byBmb3JjZSByZS1yZW5kZXJcbiAgICAgICAgY3VycmVudFZpc2libGVSYW5nZSA9IHsgc3RhcnQ6IC0xLCBlbmQ6IC0xIH07XG5cbiAgICAgICAgLy8gQ2xlYXIgbG9hZGVkUmFuZ2VzIHRvIGVuc3VyZSBwcm9wZXIgcmVsb2FkIHRyYWNraW5nXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSk/LmNvbGxlY3Rpb247XG4gICAgICAgIGlmIChjb2xsZWN0aW9uPy5nZXRMb2FkZWRSYW5nZXMpIHtcbiAgICAgICAgICBjb25zdCBsb2FkZWRSYW5nZXMgPSBjb2xsZWN0aW9uLmdldExvYWRlZFJhbmdlcygpO1xuICAgICAgICAgIGxvYWRlZFJhbmdlcy5jbGVhcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJpZ2dlciByZS1yZW5kZXJcbiAgICAgICAgcmVuZGVySXRlbXMoKTtcblxuICAgICAgICAvLyBFbWl0IGNvbXBsZXRpb24gZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW1zOnJlbmRlci1jb21wbGV0ZVwiLCB7XG4gICAgICAgICAgaXRlbXM6IG5ld0l0ZW1zLFxuICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgIHRvdGFsOiB2aWV3cG9ydFN0YXRlPy50b3RhbEl0ZW1zIHx8IDAsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgY29sbGVjdGlvbiBpdGVtcyBldmljdGVkIC0gY2xlYW4gdXAgcmVuZGVyZWQgZWxlbWVudHNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjppdGVtcy1ldmljdGVkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgeyBrZWVwU3RhcnQsIGtlZXBFbmQgfSA9IGRhdGE7XG5cbiAgICAgICAgLy8gUmVsZWFzZSByZW5kZXJlZCBlbGVtZW50cyBvdXRzaWRlIHRoZSBrZWVwIHJhbmdlXG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAoaW5kZXggPCBrZWVwU3RhcnQgfHwgaW5kZXggPiBrZWVwRW5kKSB7XG4gICAgICAgICAgICByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZGVsZXRlKGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgY29sbGVjdGlvbiByZXNldCB0byBjbGVhciByZW5kZXJpbmcgc3RhdGVcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjpyZXNldFwiLCAoKSA9PiB7XG4gICAgICAgIC8vIFJlbGVhc2UgYW5kIGNsZWFyIGFsbCByZW5kZXJlZCBlbGVtZW50c1xuICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuY2xlYXIoKTtcblxuICAgICAgICAvLyBSZXNldCB2aXNpYmxlIHJhbmdlIHRyYWNraW5nXG4gICAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB7IHN0YXJ0OiAtMSwgZW5kOiAtMSB9O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgY29sbGVjdGlvbiBkYXRhIGxvYWRlZFxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJjb2xsZWN0aW9uOnJhbmdlLWxvYWRlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmICghZGF0YS5pdGVtcz8ubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgICAgLy8gQW5hbHl6ZSBkYXRhIHN0cnVjdHVyZSBvbiBmaXJzdCBsb2FkXG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IChjb21wb25lbnQgYXMgYW55KS5wbGFjZWhvbGRlcnM7XG4gICAgICAgIGlmIChwbGFjZWhvbGRlcnMgJiYgIXBsYWNlaG9sZGVycy5oYXNBbmFseXplZFN0cnVjdHVyZSgpKSB7XG4gICAgICAgICAgcGxhY2Vob2xkZXJzLmFuYWx5emVEYXRhU3RydWN0dXJlKGRhdGEuaXRlbXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXRlbXMgYXJlIGFscmVhZHkgaW4gY29sbGVjdGlvbi5pdGVtcyAtIHJlcGxhY2UgYW55IHBsYWNlaG9sZGVyIERPTSBlbGVtZW50c1xuICAgICAgICBkYXRhLml0ZW1zLmZvckVhY2goKGl0ZW06IGFueSwgaTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBkYXRhLm9mZnNldCArIGk7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGluZGV4KTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIGN1cnJlbnQgcmVuZGVyZWQgZWxlbWVudCBpcyBhIHBsYWNlaG9sZGVyIHRoYXQgbmVlZHMgcmVwbGFjaW5nXG4gICAgICAgICAgLy8gTm90ZTogVGhlIGFjdHVhbCBjbGFzcyBoYXMgJ210cmwtJyBwcmVmaXgsIHNvIGNoZWNrIGZvciBib3RoXG4gICAgICAgICAgY29uc3QgaXNQbGFjZWhvbGRlckVsZW1lbnQgPVxuICAgICAgICAgICAgZWxlbWVudD8uY2xhc3NMaXN0LmNvbnRhaW5zKFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5DTEFTUykgfHxcbiAgICAgICAgICAgIGVsZW1lbnQ/LmNsYXNzTGlzdC5jb250YWlucyhcbiAgICAgICAgICAgICAgYG10cmwtJHtWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuQ0xBU1N9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGlzUGxhY2Vob2xkZXJFbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50ID0gcmVuZGVySXRlbShpdGVtLCBpbmRleCk7XG4gICAgICAgICAgICBpZiAobmV3RWxlbWVudCkge1xuICAgICAgICAgICAgICAvLyBSZW1vdmUgcGxhY2Vob2xkZXIgY2xhc3NlcyBmcm9tIHdyYXBwZXJcbiAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MobmV3RWxlbWVudCwgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLkNMQVNTKTtcbiAgICAgICAgICAgICAgLy8gQWxzbyByZW1vdmUgZnJvbSBpbm5lciBlbGVtZW50IChmb3Igc3RyaW5nIHRlbXBsYXRlcylcbiAgICAgICAgICAgICAgaWYgKG5ld0VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICByZW1vdmVDbGFzcyhcbiAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuQ0xBU1MsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIEFkZCByZXBsYWNlZCBjbGFzcyBmb3IgZmFkZS1pbiBhbmltYXRpb25cbiAgICAgICAgICAgICAgYWRkQ2xhc3MobmV3RWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtLS1yZXBsYWNlZFwiKTtcblxuICAgICAgICAgICAgICAvLyBDb3B5IHBvc2l0aW9uIGFuZCByZXBsYWNlXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obmV3RWxlbWVudC5zdHlsZSwge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBlbGVtZW50LnN0eWxlLnBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgd2lkdGg6IGVsZW1lbnQuc3R5bGUud2lkdGgsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBlbGVtZW50LnBhcmVudE5vZGU/LnJlcGxhY2VDaGlsZChuZXdFbGVtZW50LCBlbGVtZW50KTtcbiAgICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5zZXQoaW5kZXgsIG5ld0VsZW1lbnQpO1xuICAgICAgICAgICAgICByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHJlcGxhY2VkIGNsYXNzIGFmdGVyIGFuaW1hdGlvbiBjb21wbGV0ZXNcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MobmV3RWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtLS1yZXBsYWNlZFwiKTtcbiAgICAgICAgICAgICAgfSwgMzAwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIHJlbmRlckl0ZW0gcmV0dXJuZWQgbnVsbCAtIHN0aWxsIHJlbGVhc2UgdGhlIG9sZCBlbGVtZW50XG4gICAgICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmRlbGV0ZShpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHJlbmRlciBuZXcgaXRlbXMgKGl0ZW1zIHRoYXQgd2VyZW4ndCByZW5kZXJlZCBhdCBhbGwpXG4gICAgICAgIGNvbnN0IHsgdmlzaWJsZVJhbmdlIH0gPSB2aWV3cG9ydFN0YXRlIHx8IHt9O1xuICAgICAgICBpZiAodmlzaWJsZVJhbmdlKSB7XG4gICAgICAgICAgY29uc3QgcmVuZGVyU3RhcnQgPSBNYXRoLm1heCgwLCB2aXNpYmxlUmFuZ2Uuc3RhcnQgLSBvdmVyc2Nhbik7XG4gICAgICAgICAgY29uc3QgcmVuZGVyRW5kID0gTWF0aC5taW4oXG4gICAgICAgICAgICB2aWV3cG9ydFN0YXRlPy50b3RhbEl0ZW1zID8/IDAgLSAxLFxuICAgICAgICAgICAgdmlzaWJsZVJhbmdlLmVuZCArIG92ZXJzY2FuLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgbG9hZGVkU3RhcnQgPSBkYXRhLm9mZnNldDtcbiAgICAgICAgICBjb25zdCBsb2FkZWRFbmQgPSBkYXRhLm9mZnNldCArIGRhdGEuaXRlbXMubGVuZ3RoIC0gMTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIGxvYWRlZCBkYXRhIG92ZXJsYXBzIHdpdGggcmVuZGVyIHJhbmdlIGFuZCB3ZSdyZSBtaXNzaW5nIHJlbmRlcmVkIGVsZW1lbnRzXG4gICAgICAgICAgY29uc3QgbmVlZHNSZW5kZXIgPVxuICAgICAgICAgICAgbG9hZGVkU3RhcnQgPD0gcmVuZGVyRW5kICYmXG4gICAgICAgICAgICBsb2FkZWRFbmQgPj0gcmVuZGVyU3RhcnQgJiZcbiAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2l6ZSA8IHJlbmRlckVuZCAtIHJlbmRlclN0YXJ0ICsgMTtcblxuICAgICAgICAgIGlmIChuZWVkc1JlbmRlcikgcmVuZGVySXRlbXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgZXZlbnRzXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnJhbmdlLWNoYW5nZWRcIiwgcmVuZGVySXRlbXMpO1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpzY3JvbGxcIiwgdXBkYXRlSXRlbVBvc2l0aW9ucyk7XG5cbiAgICAgIC8vIFVwZGF0ZSBpdGVtcyBjb250YWluZXIgaGVpZ2h0IHdoZW4gdmlydHVhbCBzaXplIGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dmlydHVhbC1zaXplLWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdmlld3BvcnRTdGF0ZT8uaXRlbXNDb250YWluZXIgJiZcbiAgICAgICAgICBkYXRhLnRvdGFsVmlydHVhbFNpemUgIT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyLnN0eWxlLmhlaWdodCA9IGAke2RhdGEudG90YWxWaXJ0dWFsU2l6ZX1weGA7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVtcGxhdGUgaGVscGVyc1xuICAgIGNvbnN0IGdldERlZmF1bHRUZW1wbGF0ZSA9ICgpID0+IChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIC8vIFVzZSBsYXlvdXQgc3lzdGVtIGZvciBkZWZhdWx0IHRlbXBsYXRlXG4gICAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgdGFnOiBcImRpdlwiLFxuICAgICAgICAgIGNsYXNzOiBcInZpZXdwb3J0LWl0ZW1cIixcbiAgICAgICAgICB0ZXh0OlxuICAgICAgICAgICAgdHlwZW9mIGl0ZW0gPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgPyBpdGVtLm5hbWUgfHwgaXRlbS5sYWJlbCB8fCBpdGVtLnRleHQgfHwgYEl0ZW0gJHtpbmRleH1gXG4gICAgICAgICAgICAgIDogU3RyaW5nKGl0ZW0pLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9O1xuXG4gICAgLy8gUHJvY2VzcyBsYXlvdXQgc2NoZW1hIHdpdGggaXRlbSBkYXRhIHN1YnN0aXR1dGlvblxuICAgIGNvbnN0IHByb2Nlc3NMYXlvdXRTY2hlbWEgPSAoXG4gICAgICBzY2hlbWE6IGFueSxcbiAgICAgIGl0ZW06IGFueSxcbiAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgKTogYW55ID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIC8vIEhhbmRsZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24gbGlrZSB7e25hbWV9fSwge3tpbmRleH19XG4gICAgICAgIHJldHVybiBzY2hlbWEucmVwbGFjZSgvXFx7XFx7KFtefV0rKVxcfVxcfS9nLCAobWF0Y2gsIGtleSkgPT4ge1xuICAgICAgICAgIGlmIChrZXkgPT09IFwiaW5kZXhcIikgcmV0dXJuIFN0cmluZyhpbmRleCk7XG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJpdGVtXCIpIHJldHVybiBTdHJpbmcoaXRlbSk7XG5cbiAgICAgICAgICAvLyBIYW5kbGUgbmVzdGVkIHByb3BlcnRpZXMgbGlrZSB7e3VzZXIubmFtZX19XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBrZXkuc3BsaXQoXCIuXCIpLnJlZHVjZSgob2JqOiBhbnksIHByb3A6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG9iaj8uW3Byb3AudHJpbSgpXTtcbiAgICAgICAgICB9LCBpdGVtKTtcblxuICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKHZhbHVlKSA6IG1hdGNoO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hKSkge1xuICAgICAgICByZXR1cm4gc2NoZW1hLm1hcCgoY2hpbGQpID0+IHByb2Nlc3NMYXlvdXRTY2hlbWEoY2hpbGQsIGl0ZW0sIGluZGV4KSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcIm9iamVjdFwiICYmIHNjaGVtYSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBwcm9jZXNzZWQ6IGFueSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzY2hlbWEpKSB7XG4gICAgICAgICAgcHJvY2Vzc2VkW2tleV0gPSBwcm9jZXNzTGF5b3V0U2NoZW1hKHZhbHVlLCBpdGVtLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb2Nlc3NlZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNjaGVtYTtcbiAgICB9O1xuXG4gICAgLy8gUG9zaXRpb24gY2FsY3VsYXRpb25cbiAgICBjb25zdCBjYWxjdWxhdGVJdGVtUG9zaXRpb24gPSAoXG4gICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgc2Nyb2xsUG9zaXRpb246IG51bWJlcixcbiAgICAgIHRvdGFsSXRlbXM6IG51bWJlcixcbiAgICAgIGl0ZW1TaXplOiBudW1iZXIsXG4gICAgICB2aXJ0dWFsVG90YWxTaXplOiBudW1iZXIsXG4gICAgICBjb250YWluZXJTaXplOiBudW1iZXIsXG4gICAgICB0YXJnZXRTY3JvbGxJbmRleD86IG51bWJlcixcbiAgICApOiBudW1iZXIgPT4ge1xuICAgICAgY29uc3QgYWN0dWFsVG90YWxTaXplID0gdG90YWxJdGVtcyAqIGl0ZW1TaXplO1xuICAgICAgY29uc3QgaXNDb21wcmVzc2VkID1cbiAgICAgICAgYWN0dWFsVG90YWxTaXplID4gdmlydHVhbFRvdGFsU2l6ZSAmJiB2aXJ0dWFsVG90YWxTaXplID4gMDtcblxuICAgICAgLy8gSWYgd2UgaGF2ZSBhIHRhcmdldFNjcm9sbEluZGV4IChmcm9tIGluaXRpYWxTY3JvbGxJbmRleCksIHVzZSBpdCBkaXJlY3RseVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIGl0ZW1zIGFyZSBwb3NpdGlvbmVkIGNvcnJlY3RseSBldmVuIHdpdGggY29tcHJlc3Npb25cbiAgICAgIGlmICh0YXJnZXRTY3JvbGxJbmRleCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldFNjcm9sbEluZGV4ID4gMCkge1xuICAgICAgICAvLyBQb3NpdGlvbiBpdGVtcyByZWxhdGl2ZSB0byB0aGUgdGFyZ2V0IGluZGV4XG4gICAgICAgIC8vIFRoZSB0YXJnZXQgaW5kZXggc2hvdWxkIGFwcGVhciBhdCB0aGUgdG9wIG9mIHRoZSB2aWV3cG9ydFxuICAgICAgICByZXR1cm4gKGluZGV4IC0gdGFyZ2V0U2Nyb2xsSW5kZXgpICogaXRlbVNpemU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNDb21wcmVzc2VkIHx8IHRvdGFsSXRlbXMgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGluZGV4ICogaXRlbVNpemUgLSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgIH1cblxuICAgICAgLy8gQ29tcHJlc3NlZCBzcGFjZSBoYW5kbGluZ1xuICAgICAgY29uc3QgbWF4U2Nyb2xsUG9zaXRpb24gPSB2aXJ0dWFsVG90YWxTaXplIC0gY29udGFpbmVyU2l6ZTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlRnJvbUJvdHRvbSA9IG1heFNjcm9sbFBvc2l0aW9uIC0gc2Nyb2xsUG9zaXRpb247XG4gICAgICBjb25zdCBuZWFyQm90dG9tVGhyZXNob2xkID0gY29udGFpbmVyU2l6ZTtcblxuICAgICAgaWYgKFxuICAgICAgICBkaXN0YW5jZUZyb21Cb3R0b20gPD0gbmVhckJvdHRvbVRocmVzaG9sZCAmJlxuICAgICAgICBkaXN0YW5jZUZyb21Cb3R0b20gPj0gLTFcbiAgICAgICkge1xuICAgICAgICAvLyBOZWFyIGJvdHRvbSBpbnRlcnBvbGF0aW9uXG4gICAgICAgIGNvbnN0IGl0ZW1zQXRCb3R0b20gPSBNYXRoLmZsb29yKGNvbnRhaW5lclNpemUgLyBpdGVtU2l6ZSk7XG4gICAgICAgIGNvbnN0IGZpcnN0VmlzaWJsZUF0Qm90dG9tID0gTWF0aC5tYXgoMCwgdG90YWxJdGVtcyAtIGl0ZW1zQXRCb3R0b20pO1xuICAgICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHNjcm9sbFBvc2l0aW9uIC8gdmlydHVhbFRvdGFsU2l6ZTtcbiAgICAgICAgY29uc3QgZXhhY3RTY3JvbGxJbmRleCA9IHNjcm9sbFJhdGlvICogdG90YWxJdGVtcztcbiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGlvbiA9IE1hdGgubWF4KFxuICAgICAgICAgIDAsXG4gICAgICAgICAgTWF0aC5taW4oMSwgMSAtIGRpc3RhbmNlRnJvbUJvdHRvbSAvIG5lYXJCb3R0b21UaHJlc2hvbGQpLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGJvdHRvbVBvc2l0aW9uID0gKGluZGV4IC0gZmlyc3RWaXNpYmxlQXRCb3R0b20pICogaXRlbVNpemU7XG4gICAgICAgIGNvbnN0IG5vcm1hbFBvc2l0aW9uID0gKGluZGV4IC0gZXhhY3RTY3JvbGxJbmRleCkgKiBpdGVtU2l6ZTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBub3JtYWxQb3NpdGlvbiArIChib3R0b21Qb3NpdGlvbiAtIG5vcm1hbFBvc2l0aW9uKSAqIGludGVycG9sYXRpb25cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gTm9ybWFsIGNvbXByZXNzZWQgc2Nyb2xsaW5nXG4gICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHNjcm9sbFBvc2l0aW9uIC8gdmlydHVhbFRvdGFsU2l6ZTtcbiAgICAgIHJldHVybiAoaW5kZXggLSBzY3JvbGxSYXRpbyAqIHRvdGFsSXRlbXMpICogaXRlbVNpemU7XG4gICAgfTtcblxuICAgIC8vIFJlbmRlciBzaW5nbGUgaXRlbVxuICAgIGNvbnN0IHJlbmRlckl0ZW0gPSAoaXRlbTogYW55LCBpbmRleDogbnVtYmVyKTogSFRNTEVsZW1lbnQgfCBudWxsID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1UZW1wbGF0ZSA9IHRlbXBsYXRlIHx8IGdldERlZmF1bHRUZW1wbGF0ZSgpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBpdGVtVGVtcGxhdGUoaXRlbSwgaW5kZXgpO1xuICAgICAgICBsZXQgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgcmVzdWx0IGlzIGEgbGF5b3V0IHNjaGVtYSAoYXJyYXkgb3Igb2JqZWN0KVxuICAgICAgICBpZiAoXG4gICAgICAgICAgQXJyYXkuaXNBcnJheShyZXN1bHQpIHx8XG4gICAgICAgICAgKHR5cGVvZiByZXN1bHQgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIHJlc3VsdCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgIShyZXN1bHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFByb2Nlc3Mgc2NoZW1hIHRvIHN1YnN0aXR1dGUgdmFyaWFibGVzXG4gICAgICAgICAgY29uc3QgcHJvY2Vzc2VkU2NoZW1hID0gcHJvY2Vzc0xheW91dFNjaGVtYShyZXN1bHQsIGl0ZW0sIGluZGV4KTtcblxuICAgICAgICAgIC8vIFVzZSBsYXlvdXQgc3lzdGVtIHRvIGNyZWF0ZSBlbGVtZW50XG4gICAgICAgICAgY29uc3QgbGF5b3V0UmVzdWx0ID0gY3JlYXRlTGF5b3V0KHByb2Nlc3NlZFNjaGVtYSk7XG4gICAgICAgICAgZWxlbWVudCA9IGxheW91dFJlc3VsdC5lbGVtZW50O1xuXG4gICAgICAgICAgLy8gSWYgdGhlIGxheW91dCBjcmVhdGVkIGEgd3JhcHBlciwgdXNlIGl0IGRpcmVjdGx5XG4gICAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgLy8gRWxlbWVudCBpcyBhbHJlYWR5IGNyZWF0ZWQgYnkgbGF5b3V0IHN5c3RlbVxuICAgICAgICAgICAgLy8gU3RvcmUgbGF5b3V0UmVzdWx0IGZvciBjbGVhbnVwIHdoZW4gZWxlbWVudCBpcyByZWxlYXNlZCAocHJldmVudHMgbWVtb3J5IGxlYWspXG4gICAgICAgICAgICBsYXlvdXRSZXN1bHRzLnNldChlbGVtZW50LCBsYXlvdXRSZXN1bHQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFjayBpZiBsYXlvdXQgZGlkbid0IGNyZWF0ZSBhIHByb3BlciBlbGVtZW50XG4gICAgICAgICAgICBlbGVtZW50ID0gZ2V0UG9vbGVkRWxlbWVudCgpO1xuICAgICAgICAgICAgaWYgKGxheW91dFJlc3VsdC5lbGVtZW50KSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQobGF5b3V0UmVzdWx0LmVsZW1lbnQpO1xuICAgICAgICAgICAgICAvLyBTdG9yZSBsYXlvdXRSZXN1bHQgb24gd3JhcHBlciBlbGVtZW50IGZvciBjbGVhbnVwXG4gICAgICAgICAgICAgIGxheW91dFJlc3VsdHMuc2V0KGVsZW1lbnQsIGxheW91dFJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAvLyBQYXJzZSBIVE1MIHVzaW5nIHRlbXBsYXRlIGVsZW1lbnQgLSBvcHRpbWl6ZWQgcGF0aFxuICAgICAgICAgIC8vIE1vdmUgbm9kZXMgZGlyZWN0bHkgaW5zdGVhZCBvZiBjbG9uaW5nIC0gbXVjaCBmYXN0ZXIsIG5vIG1lbW9yeSBvdmVyaGVhZFxuICAgICAgICAgIHRlbXBsYXRlUGFyc2VyLmlubmVySFRNTCA9IHJlc3VsdDtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gdGVtcGxhdGVQYXJzZXIuY29udGVudDtcblxuICAgICAgICAgIGlmIChjb250ZW50LmNoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgLy8gU2luZ2xlIHJvb3QgZWxlbWVudCAtIG1vdmUgZGlyZWN0bHkgKGZhc3RlciB0aGFuIGNsb25lTm9kZSlcbiAgICAgICAgICAgIGVsZW1lbnQgPSBjb250ZW50LmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgY29udGVudC5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICAgICAgICAgIGFkZENsYXNzKGVsZW1lbnQsIFwibXRybC12aWV3cG9ydC1pdGVtXCIpO1xuICAgICAgICAgICAgaWYgKGlzUGxhY2Vob2xkZXIoaXRlbSkpIHtcbiAgICAgICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLkNMQVNTKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTXVsdGlwbGUgY2hpbGRyZW4gLSBtb3ZlIGFsbCBpbnRvIHBvb2xlZCBlbGVtZW50XG4gICAgICAgICAgICBlbGVtZW50ID0gZ2V0UG9vbGVkRWxlbWVudCgpO1xuICAgICAgICAgICAgd2hpbGUgKGNvbnRlbnQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNvbnRlbnQuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgZWxlbWVudCA9IGdldFBvb2xlZEVsZW1lbnQoKTtcbiAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbUmVuZGVyaW5nXSBJbnZhbGlkIHRlbXBsYXRlIHJlc3VsdCBmb3IgaXRlbSAke2luZGV4fWApO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIGNsYXNzZXNcbiAgICAgICAgaWYgKCFoYXNDbGFzcyhlbGVtZW50LCBcInZpZXdwb3J0LWl0ZW1cIikpXG4gICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtXCIpO1xuICAgICAgICBpZiAoaXNQbGFjZWhvbGRlcihpdGVtKSkge1xuICAgICAgICAgIGFkZENsYXNzKGVsZW1lbnQsIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5DTEFTUyk7XG4gICAgICAgIH1cblxuICAgICAgICBlbGVtZW50LmRhdGFzZXQuaW5kZXggPSBTdHJpbmcoaW5kZXgpO1xuXG4gICAgICAgIC8vIENvcHkgZGF0YS1pZCBmcm9tIGl0ZW0gdG8gdmlld3BvcnQgZWxlbWVudCBmb3Igc2VsZWN0aW9uIHN1cHBvcnRcbiAgICAgICAgY29uc3QgaXRlbUlkID0gaXRlbT8uX2lkIHx8IGl0ZW0/LmlkO1xuICAgICAgICBpZiAoaXRlbUlkICE9PSB1bmRlZmluZWQgJiYgaXRlbUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgZWxlbWVudC5kYXRhc2V0LmlkID0gU3RyaW5nKGl0ZW1JZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBbUmVuZGVyaW5nXSBFcnJvciByZW5kZXJpbmcgaXRlbSAke2luZGV4fTpgLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBVcGRhdGUgcG9zaXRpb25zXG4gICAgY29uc3QgdXBkYXRlSXRlbVBvc2l0aW9ucyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSB8fCByZW5kZXJlZEVsZW1lbnRzLnNpemUgPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3Qge1xuICAgICAgICBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgaXRlbVNpemU6IGl0ZW1TaXplLFxuICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICB2aXJ0dWFsVG90YWxTaXplLFxuICAgICAgICBjb250YWluZXJTaXplLFxuICAgICAgfSA9IHZpZXdwb3J0U3RhdGU7XG4gICAgICBjb25zdCBhY3R1YWxUb3RhbFNpemUgPSB0b3RhbEl0ZW1zICogaXRlbVNpemU7XG4gICAgICBjb25zdCBpc0NvbXByZXNzZWQgPVxuICAgICAgICBhY3R1YWxUb3RhbFNpemUgPiB2aXJ0dWFsVG90YWxTaXplICYmIHZpcnR1YWxUb3RhbFNpemUgPiAwO1xuXG4gICAgICBjb25zdCBzb3J0ZWRJbmRpY2VzID0gQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLmtleXMoKSkuc29ydChcbiAgICAgICAgKGEsIGIpID0+IGEgLSBiLFxuICAgICAgKTtcbiAgICAgIGlmICghc29ydGVkSW5kaWNlcy5sZW5ndGgpIHJldHVybjtcblxuICAgICAgY29uc3QgZmlyc3RJbmRleCA9IHNvcnRlZEluZGljZXNbMF07XG4gICAgICBsZXQgY3VycmVudFBvc2l0aW9uID0gMDtcblxuICAgICAgaWYgKGlzQ29tcHJlc3NlZCkge1xuICAgICAgICBjb25zdCBtYXhTY3JvbGwgPSB2aXJ0dWFsVG90YWxTaXplIC0gY29udGFpbmVyU2l6ZTtcbiAgICAgICAgY29uc3QgZGlzdGFuY2VGcm9tQm90dG9tID0gbWF4U2Nyb2xsIC0gc2Nyb2xsUG9zaXRpb247XG5cbiAgICAgICAgaWYgKGRpc3RhbmNlRnJvbUJvdHRvbSA8PSBjb250YWluZXJTaXplICYmIGRpc3RhbmNlRnJvbUJvdHRvbSA+PSAtMSkge1xuICAgICAgICAgIC8vIE5lYXIgYm90dG9tIGludGVycG9sYXRpb25cbiAgICAgICAgICBjb25zdCBpdGVtc0F0Qm90dG9tID0gTWF0aC5mbG9vcihjb250YWluZXJTaXplIC8gaXRlbVNpemUpO1xuICAgICAgICAgIGNvbnN0IGZpcnN0VmlzaWJsZUF0Qm90dG9tID0gTWF0aC5tYXgoMCwgdG90YWxJdGVtcyAtIGl0ZW1zQXRCb3R0b20pO1xuICAgICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsVG90YWxTaXplO1xuICAgICAgICAgIGNvbnN0IGV4YWN0U2Nyb2xsSW5kZXggPSBzY3JvbGxSYXRpbyAqIHRvdGFsSXRlbXM7XG4gICAgICAgICAgY29uc3QgaW50ZXJwb2xhdGlvbiA9IE1hdGgubWF4KFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIE1hdGgubWluKDEsIDEgLSBkaXN0YW5jZUZyb21Cb3R0b20gLyBjb250YWluZXJTaXplKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3QgYm90dG9tUG9zID0gKGZpcnN0SW5kZXggLSBmaXJzdFZpc2libGVBdEJvdHRvbSkgKiBpdGVtU2l6ZTtcbiAgICAgICAgICBjb25zdCBub3JtYWxQb3MgPSAoZmlyc3RJbmRleCAtIGV4YWN0U2Nyb2xsSW5kZXgpICogaXRlbVNpemU7XG4gICAgICAgICAgY3VycmVudFBvc2l0aW9uID0gbm9ybWFsUG9zICsgKGJvdHRvbVBvcyAtIG5vcm1hbFBvcykgKiBpbnRlcnBvbGF0aW9uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsVG90YWxTaXplO1xuICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbiA9IChmaXJzdEluZGV4IC0gc2Nyb2xsUmF0aW8gKiB0b3RhbEl0ZW1zKSAqIGl0ZW1TaXplO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50UG9zaXRpb24gPSBmaXJzdEluZGV4ICogaXRlbVNpemUgLSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgIH1cblxuICAgICAgLy8gUG9zaXRpb24gZWFjaCBpdGVtXG4gICAgICBzb3J0ZWRJbmRpY2VzLmZvckVhY2goKGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnRzLmdldChpbmRleCk7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke01hdGgucm91bmQoXG4gICAgICAgICAgICBjdXJyZW50UG9zaXRpb24sXG4gICAgICAgICAgKX1weClgO1xuXG4gICAgICAgICAgLy8gU3RyYXRlZ2ljIGxvZyBmb3IgbGFzdCBpdGVtc1xuICAgICAgICAgIC8vIGlmIChpbmRleCA+PSB0b3RhbEl0ZW1zIC0gNSkge1xuICAgICAgICAgIC8vICAgY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICAgIGBbUmVuZGVyaW5nXSBMYXN0IGl0ZW0gcG9zaXRpb25lZDogaW5kZXg9JHtpbmRleH0sIHBvc2l0aW9uPSR7TWF0aC5yb3VuZChcbiAgICAgICAgICAvLyAgICAgICBjdXJyZW50UG9zaXRpb25cbiAgICAgICAgICAvLyAgICAgKX1weCwgaXRlbVNpemU9JHtpdGVtU2l6ZX1weCwgdG90YWxJdGVtcz0ke3RvdGFsSXRlbXN9YFxuICAgICAgICAgIC8vICAgKTtcbiAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICBjdXJyZW50UG9zaXRpb24gKz0gaXRlbVNpemU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBNYWluIHJlbmRlciBmdW5jdGlvblxuICAgIGNvbnN0IHJlbmRlckl0ZW1zID0gKCkgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlPy5pdGVtc0NvbnRhaW5lcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdmlzaWJsZVJhbmdlLFxuICAgICAgICBpdGVtc0NvbnRhaW5lcixcbiAgICAgICAgdG90YWxJdGVtcyxcbiAgICAgICAgaXRlbVNpemUsXG4gICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICBjb250YWluZXJTaXplLFxuICAgICAgICB2aXJ0dWFsVG90YWxTaXplLFxuICAgICAgfSA9IHZpZXdwb3J0U3RhdGU7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHJhbmdlIC0gc2tpcCByZW5kZXJpbmcgaWYgbm8gaXRlbXMgb3IgcmFuZ2UgaXMgaW52YWxpZFxuICAgICAgaWYgKFxuICAgICAgICAhdmlzaWJsZVJhbmdlIHx8XG4gICAgICAgIHRvdGFsSXRlbXMgPD0gMCB8fFxuICAgICAgICB2aXNpYmxlUmFuZ2Uuc3RhcnQgPCAwIHx8XG4gICAgICAgIHZpc2libGVSYW5nZS5zdGFydCA+PSB0b3RhbEl0ZW1zIHx8XG4gICAgICAgIHZpc2libGVSYW5nZS5lbmQgPCB2aXNpYmxlUmFuZ2Uuc3RhcnQgfHxcbiAgICAgICAgaXNOYU4odmlzaWJsZVJhbmdlLnN0YXJ0KSB8fFxuICAgICAgICBpc05hTih2aXNpYmxlUmFuZ2UuZW5kKVxuICAgICAgKSB7XG4gICAgICAgIC8vIElmIHRvdGFsSXRlbXMgaXMgMCwgY2xlYXIgYWxsIHJlbmRlcmVkIGVsZW1lbnRzIHRvIHJlbW92ZSBzdGFsZSBwbGFjZWhvbGRlcnNcbiAgICAgICAgaWYgKHRvdGFsSXRlbXMgPD0gMCAmJiByZW5kZXJlZEVsZW1lbnRzLnNpemUgPiAwKSB7XG4gICAgICAgICAgQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLmVudHJpZXMoKSkuZm9yRWFjaCgoW2luZGV4LCBlbGVtZW50XSkgPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSkgcmVsZWFzZUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmRlbGV0ZShpbmRleCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY3VycmVudFZpc2libGVSYW5nZSA9IHsgc3RhcnQ6IC0xLCBlbmQ6IC0xIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiByYW5nZSBjaGFuZ2VkXG4gICAgICBpZiAoXG4gICAgICAgIHZpc2libGVSYW5nZS5zdGFydCA9PT0gY3VycmVudFZpc2libGVSYW5nZS5zdGFydCAmJlxuICAgICAgICB2aXNpYmxlUmFuZ2UuZW5kID09PSBjdXJyZW50VmlzaWJsZVJhbmdlLmVuZCAmJlxuICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNpemUgPiAwXG4gICAgICApIHtcbiAgICAgICAgdXBkYXRlSXRlbVBvc2l0aW9ucygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxhc3RSZW5kZXJUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHJlbmRlclN0YXJ0ID0gTWF0aC5tYXgoMCwgdmlzaWJsZVJhbmdlLnN0YXJ0IC0gb3ZlcnNjYW4pO1xuICAgICAgY29uc3QgcmVuZGVyRW5kID0gTWF0aC5taW4odG90YWxJdGVtcyAtIDEsIHZpc2libGVSYW5nZS5lbmQgKyBvdmVyc2Nhbik7XG5cbiAgICAgIC8vIGlmIChpc1JlbW92aW5nSXRlbSkge1xuICAgICAgLy8gICBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgICBgW1JFTkRFUi1GSVhdIHJlbmRlckl0ZW1zIGNhbGM6IHZpc2libGVSYW5nZT0ke0pTT04uc3RyaW5naWZ5KHZpc2libGVSYW5nZSl9LCBvdmVyc2Nhbj0ke292ZXJzY2FufSwgdG90YWxJdGVtcz0ke3RvdGFsSXRlbXN9YCxcbiAgICAgIC8vICAgKTtcbiAgICAgIC8vICAgY29uc29sZS5sb2coXG4gICAgICAvLyAgICAgYFtSRU5ERVItRklYXSByZW5kZXJJdGVtcyBjYWxjOiByZW5kZXJTdGFydD0ke3JlbmRlclN0YXJ0fSwgcmVuZGVyRW5kPSR7cmVuZGVyRW5kfWAsXG4gICAgICAvLyAgICk7XG4gICAgICAvLyB9XG5cbiAgICAgIC8vIFJlbW92ZSBpdGVtcyBvdXRzaWRlIHJhbmdlXG4gICAgICBBcnJheS5mcm9tKHJlbmRlcmVkRWxlbWVudHMuZW50cmllcygpKVxuICAgICAgICAuZmlsdGVyKChbaW5kZXhdKSA9PiBpbmRleCA8IHJlbmRlclN0YXJ0IHx8IGluZGV4ID4gcmVuZGVyRW5kKVxuICAgICAgICAuZm9yRWFjaCgoW2luZGV4LCBlbGVtZW50XSkgPT4ge1xuICAgICAgICAgIGlmIChlbGVtZW50LnBhcmVudE5vZGUpIHJlbGVhc2VFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZGVsZXRlKGluZGV4KTtcbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIEdldCBpdGVtcyBmcm9tIGNvbGxlY3Rpb24gKHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGgpXG4gICAgICBjb25zdCBpdGVtcyA9IGdldENvbGxlY3Rpb25JdGVtcygpO1xuICAgICAgY29uc3QgbWlzc2luZ0l0ZW1zOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgICAvLyBDb2xsZWN0IG5ldyBlbGVtZW50cyB0byBpbnNlcnQgKGluZGV4IC0+IGVsZW1lbnQpXG4gICAgICBjb25zdCBuZXdFbGVtZW50czogQXJyYXk8W251bWJlciwgSFRNTEVsZW1lbnRdPiA9IFtdO1xuXG4gICAgICAvLyBSZW5kZXIgaXRlbXMgaW4gcmFuZ2VcbiAgICAgIGZvciAobGV0IGkgPSByZW5kZXJTdGFydDsgaSA8PSByZW5kZXJFbmQ7IGkrKykge1xuICAgICAgICBpZiAoaSA8IDAgfHwgaSA+PSB0b3RhbEl0ZW1zIHx8IHJlbmRlcmVkRWxlbWVudHMuaGFzKGkpKSBjb250aW51ZTtcblxuICAgICAgICBsZXQgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICBtaXNzaW5nSXRlbXMucHVzaChpKTtcbiAgICAgICAgICAvLyBHZW5lcmF0ZSBwbGFjZWhvbGRlciAocmVuZGVyZWQgZHluYW1pY2FsbHksIG5vdCBzdG9yZWQpXG4gICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJzID0gKGNvbXBvbmVudCBhcyBhbnkpLnBsYWNlaG9sZGVycztcbiAgICAgICAgICBpdGVtID0gcGxhY2Vob2xkZXJzPy5nZW5lcmF0ZVBsYWNlaG9sZGVySXRlbShpKSB8fCB7XG4gICAgICAgICAgICBfcGxhY2Vob2xkZXI6IHRydWUsXG4gICAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICAgIGlkOiBgcGxhY2Vob2xkZXItJHtpfWAsXG4gICAgICAgICAgICBuYW1lOiBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuTUFTS19DSEFSQUNURVIucmVwZWF0KDE1KSxcbiAgICAgICAgICAgIHRleHQ6IFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVNLX0NIQVJBQ1RFUi5yZXBlYXQoMjUpLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVNLX0NIQVJBQ1RFUi5yZXBlYXQoNDApLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVuZGVySXRlbShpdGVtLCBpKTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAvLyBHZXQgdGFyZ2V0U2Nyb2xsSW5kZXggZnJvbSB2aWV3cG9ydFN0YXRlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIGNvbnN0IHRhcmdldFNjcm9sbEluZGV4ID0gKHZpZXdwb3J0U3RhdGUgYXMgYW55KT8udGFyZ2V0U2Nyb2xsSW5kZXg7XG4gICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBjYWxjdWxhdGVJdGVtUG9zaXRpb24oXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICAgICAgaXRlbVNpemUsXG4gICAgICAgICAgICB2aXJ0dWFsVG90YWxTaXplLFxuICAgICAgICAgICAgY29udGFpbmVyU2l6ZSxcbiAgICAgICAgICAgIHRhcmdldFNjcm9sbEluZGV4LFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGVZKCR7cG9zaXRpb259cHgpYCxcbiAgICAgICAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIENvbGxlY3QgZm9yIGJhdGNoIGluc2VydGlvbiAoaWYgbWFpbnRhaW5pbmcgb3JkZXIpIG9yIGp1c3QgYXBwZW5kXG4gICAgICAgICAgaWYgKG1haW50YWluRG9tT3JkZXIpIHtcbiAgICAgICAgICAgIG5ld0VsZW1lbnRzLnB1c2goW2ksIGVsZW1lbnRdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaXRlbXNDb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2V0KGksIGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEJhdGNoIGluc2VydCBuZXcgZWxlbWVudHMgaW4gY29ycmVjdCBET00gb3JkZXIgKG9ubHkgd2hlbiBtYWludGFpbkRvbU9yZGVyIGlzIGVuYWJsZWQpXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgQ1NTIHNlbGVjdG9ycyBsaWtlIDpmaXJzdC1jaGlsZCwgOm50aC1jaGlsZCgpIHdvcmsgY29ycmVjdGx5XG4gICAgICBpZiAobWFpbnRhaW5Eb21PcmRlciAmJiBuZXdFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFNvcnQgbmV3IGVsZW1lbnRzIGJ5IGluZGV4XG4gICAgICAgIG5ld0VsZW1lbnRzLnNvcnQoKFthXSwgW2JdKSA9PiBhIC0gYik7XG5cbiAgICAgICAgLy8gR2V0IGV4aXN0aW5nIERPTSBjaGlsZHJlbiBzb3J0ZWQgYnkgdGhlaXIgZGF0YS1pbmRleFxuICAgICAgICBjb25zdCBleGlzdGluZ0NoaWxkcmVuID0gQXJyYXkuZnJvbShcbiAgICAgICAgICBpdGVtc0NvbnRhaW5lci5jaGlsZHJlbixcbiAgICAgICAgKSBhcyBIVE1MRWxlbWVudFtdO1xuXG4gICAgICAgIC8vIE1lcmdlIG5ldyBlbGVtZW50cyBpbnRvIGNvcnJlY3QgcG9zaXRpb25zXG4gICAgICAgIGxldCBuZXdJZHggPSAwO1xuICAgICAgICBsZXQgZXhpc3RpbmdJZHggPSAwO1xuXG4gICAgICAgIHdoaWxlIChuZXdJZHggPCBuZXdFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBbbmV3SW5kZXgsIG5ld0VsZW1lbnRdID0gbmV3RWxlbWVudHNbbmV3SWR4XTtcblxuICAgICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IGV4aXN0aW5nIGNoaWxkIHdpdGggaW5kZXggPiBuZXdJbmRleFxuICAgICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgIGV4aXN0aW5nSWR4IDwgZXhpc3RpbmdDaGlsZHJlbi5sZW5ndGggJiZcbiAgICAgICAgICAgIHBhcnNlSW50KGV4aXN0aW5nQ2hpbGRyZW5bZXhpc3RpbmdJZHhdLmRhdGFzZXQuaW5kZXggfHwgXCItMVwiLCAxMCkgPFxuICAgICAgICAgICAgICBuZXdJbmRleFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZXhpc3RpbmdJZHgrKztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZXhpc3RpbmdJZHggPCBleGlzdGluZ0NoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gSW5zZXJ0IGJlZm9yZSB0aGUgZXhpc3RpbmcgY2hpbGRcbiAgICAgICAgICAgIGl0ZW1zQ29udGFpbmVyLmluc2VydEJlZm9yZShcbiAgICAgICAgICAgICAgbmV3RWxlbWVudCxcbiAgICAgICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbltleGlzdGluZ0lkeF0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBcHBlbmQgYXQgdGhlIGVuZFxuICAgICAgICAgICAgaXRlbXNDb250YWluZXIuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5ld0lkeCsrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlcXVlc3QgbWlzc2luZyBpdGVtc1xuICAgICAgaWYgKFxuICAgICAgICBtaXNzaW5nSXRlbXMubGVuZ3RoID4gMCAmJlxuICAgICAgICBjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24/LmxvYWRNaXNzaW5nUmFuZ2VzXG4gICAgICApIHtcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24ubG9hZE1pc3NpbmdSYW5nZXMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3RhcnQ6IE1hdGgubWluKC4uLm1pc3NpbmdJdGVtcyksXG4gICAgICAgICAgICBlbmQ6IE1hdGgubWF4KC4uLm1pc3NpbmdJdGVtcyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlbmRlcmluZzptaXNzaW5nLWl0ZW1zXCIsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB2aXNpYmxlUmFuZ2U7XG5cbiAgICAgIC8vIEVtaXQgaXRlbXMgcmVuZGVyZWQgZXZlbnQgd2l0aCBlbGVtZW50cyBmb3Igc2l6ZSBjYWxjdWxhdGlvblxuICAgICAgY29uc3QgcmVuZGVyZWRFbGVtZW50c0FycmF5ID0gQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLnZhbHVlcygpKTtcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDppdGVtcy1yZW5kZXJlZFwiLCB7XG4gICAgICAgIGVsZW1lbnRzOiByZW5kZXJlZEVsZW1lbnRzQXJyYXksXG4gICAgICAgIHJhbmdlOiB2aXNpYmxlUmFuZ2UsXG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnJlbmRlcmVkXCIsIHtcbiAgICAgICAgcmFuZ2U6IHZpc2libGVSYW5nZSxcbiAgICAgICAgcmVuZGVyZWRDb3VudDogcmVuZGVyZWRFbGVtZW50cy5zaXplLFxuICAgICAgfSk7XG4gICAgICB1cGRhdGVJdGVtUG9zaXRpb25zKCk7XG5cbiAgICAgIC8vIExvYWQgZGF0YSBpZiBubyBpdGVtcyByZW5kZXJlZFxuICAgICAgaWYgKFxuICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNpemUgPT09IDAgJiZcbiAgICAgICAgdG90YWxJdGVtcyA+IDAgJiZcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uXG4gICAgICApIHtcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24ubG9hZE1pc3NpbmdSYW5nZXMoXG4gICAgICAgICAgdmlzaWJsZVJhbmdlLFxuICAgICAgICAgIFwicmVuZGVyaW5nOm5vLWl0ZW1zXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEV4dGVuZCB2aWV3cG9ydCBBUElcbiAgICBjb25zdCBvcmlnaW5hbFJlbmRlckl0ZW1zID0gY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zO1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcyA9ICgpID0+IHtcbiAgICAgIHJlbmRlckl0ZW1zKCk7XG4gICAgICBvcmlnaW5hbFJlbmRlckl0ZW1zPy4oKTtcbiAgICB9O1xuXG4gICAgLy8gQ2xlYW51cFxuICAgIHdyYXBEZXN0cm95KGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgLy8gUmVsZWFzZSBhbGwgcmVuZGVyZWQgZWxlbWVudHMgLSB1c2UgcmVsZWFzZUVsZW1lbnQgdG8gcHJvcGVybHkgZGVzdHJveSBsYXlvdXRSZXN1bHRzXG4gICAgICByZW5kZXJlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgcmVsZWFzZUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICB9KTtcbiAgICAgIHJlbmRlcmVkRWxlbWVudHMuY2xlYXIoKTtcblxuICAgICAgLy8gQ2xlYXIgZWxlbWVudCBwb29sXG4gICAgICBlbGVtZW50UG9vbC5sZW5ndGggPSAwO1xuXG4gICAgICAvLyBSZXNldCBzdGF0ZVxuICAgICAgY3VycmVudFZpc2libGVSYW5nZSA9IHsgc3RhcnQ6IC0xLCBlbmQ6IC0xIH07XG4gICAgICB2aWV3cG9ydFN0YXRlID0gbnVsbDtcbiAgICAgIGxhc3RSZW5kZXJUaW1lID0gMDtcblxuICAgICAgLy8gUmVzZXQgcG9vbCBzdGF0c1xuICAgICAgcG9vbFN0YXRzLmNyZWF0ZWQgPSAwO1xuICAgICAgcG9vbFN0YXRzLnJlY3ljbGVkID0gMDtcbiAgICAgIHBvb2xTdGF0cy5wb29sU2l6ZSA9IDA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9O1xufTtcbiIsCiAgICAiLy8gc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvZXZlbnRzLnRzXG5cbi8qKlxuICogRXZlbnRzIEZlYXR1cmUgLSBDZW50cmFsaXplZCBldmVudCBzeXN0ZW0gZm9yIHZpZXdwb3J0XG4gKiBQcm92aWRlcyBldmVudCBlbWlzc2lvbiBhbmQgc3Vic2NyaXB0aW9uIGZvciBpbnRlci1mZWF0dXJlIGNvbW11bmljYXRpb25cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBFdmVudHNDb25maWcge1xuICBkZWJ1Zz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRXZlbnRzIGZlYXR1cmUgZm9yIHZpZXdwb3J0XG4gKiBDZW50cmFsaXplcyBhbGwgZXZlbnQgaGFuZGxpbmcgZm9yIHZpZXdwb3J0IGZlYXR1cmVzXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoRXZlbnRzID0gKGNvbmZpZzogRXZlbnRzQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHsgZGVidWcgPSBmYWxzZSB9ID0gY29uZmlnO1xuXG4gICAgLy8gRXZlbnQgbGlzdGVuZXJzIG1hcFxuICAgIGNvbnN0IGxpc3RlbmVycyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8RnVuY3Rpb24+PigpO1xuXG4gICAgLy8gRW1pdCBhbiBldmVudFxuICAgIGNvbnN0IGVtaXQgPSAoZXZlbnQ6IHN0cmluZywgZGF0YT86IGFueSkgPT4ge1xuICAgICAgLy8gaWYgKGRlYnVnKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKGBbRXZlbnRzXSBFbWl0OiAke2V2ZW50fWAsIGRhdGEpO1xuICAgICAgLy8gfVxuXG4gICAgICBjb25zdCBldmVudExpc3RlbmVycyA9IGxpc3RlbmVycy5nZXQoZXZlbnQpO1xuICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzKSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxpc3RlbmVyKGRhdGEpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBbRXZlbnRzXSBFcnJvciBpbiBsaXN0ZW5lciBmb3IgJHtldmVudH06YCwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFN1YnNjcmliZSB0byBhbiBldmVudFxuICAgIGNvbnN0IG9uID0gKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKTogKCgpID0+IHZvaWQpID0+IHtcbiAgICAgIGlmICghbGlzdGVuZXJzLmhhcyhldmVudCkpIHtcbiAgICAgICAgbGlzdGVuZXJzLnNldChldmVudCwgbmV3IFNldCgpKTtcbiAgICAgIH1cblxuICAgICAgbGlzdGVuZXJzLmdldChldmVudCkhLmFkZChoYW5kbGVyKTtcblxuICAgICAgLy8gaWYgKGRlYnVnKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKGBbRXZlbnRzXSBTdWJzY3JpYmVkIHRvOiAke2V2ZW50fWApO1xuICAgICAgLy8gfVxuXG4gICAgICAvLyBSZXR1cm4gdW5zdWJzY3JpYmUgZnVuY3Rpb25cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzID0gbGlzdGVuZXJzLmdldChldmVudCk7XG4gICAgICAgIGlmIChldmVudExpc3RlbmVycykge1xuICAgICAgICAgIGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgICBpZiAoZXZlbnRMaXN0ZW5lcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG5cbiAgICAvLyBTdWJzY3JpYmUgdG8gYW4gZXZlbnQgb25jZVxuICAgIGNvbnN0IG9uY2UgPSAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pOiAoKCkgPT4gdm9pZCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlZEhhbmRsZXIgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGhhbmRsZXIoZGF0YSk7XG4gICAgICAgIG9mZihldmVudCwgd3JhcHBlZEhhbmRsZXIpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBvbihldmVudCwgd3JhcHBlZEhhbmRsZXIpO1xuICAgIH07XG5cbiAgICAvLyBVbnN1YnNjcmliZSBmcm9tIGFuIGV2ZW50XG4gICAgY29uc3Qgb2ZmID0gKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICBjb25zdCBldmVudExpc3RlbmVycyA9IGxpc3RlbmVycy5nZXQoZXZlbnQpO1xuICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzKSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzLnNpemUgPT09IDApIHtcbiAgICAgICAgICBsaXN0ZW5lcnMuZGVsZXRlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBDbGVhciBhbGwgbGlzdGVuZXJzIGZvciBhbiBldmVudFxuICAgIGNvbnN0IGNsZWFyID0gKGV2ZW50Pzogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0ZW5lcnMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQWRkIGV2ZW50IG1ldGhvZHMgdG8gY29tcG9uZW50XG4gICAgY29tcG9uZW50LmVtaXQgPSBlbWl0O1xuICAgIGNvbXBvbmVudC5vbiA9IG9uO1xuICAgIGNvbXBvbmVudC5vbmNlID0gb25jZTtcbiAgICBjb21wb25lbnQub2ZmID0gb2ZmO1xuXG4gICAgLy8gQWRkIGV2ZW50cyBBUEkgdG8gdmlld3BvcnRcbiAgICAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuZXZlbnRzID0ge1xuICAgICAgZW1pdCxcbiAgICAgIG9uLFxuICAgICAgb25jZSxcbiAgICAgIG9mZixcbiAgICAgIGNsZWFyLFxuICAgICAgZ2V0TGlzdGVuZXJDb3VudDogKGV2ZW50Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBsaXN0ZW5lcnMuZ2V0KGV2ZW50KT8uc2l6ZSB8fCAwO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0b3RhbCA9IDA7XG4gICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKChzZXQpID0+ICh0b3RhbCArPSBzZXQuc2l6ZSkpO1xuICAgICAgICByZXR1cm4gdG90YWw7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBDbGVhbiB1cCBvbiBkZXN0cm95XG4gICAgaWYgKFwiZGVzdHJveVwiIGluIGNvbXBvbmVudCAmJiB0eXBlb2YgY29tcG9uZW50LmRlc3Ryb3kgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmRlc3Ryb3k7XG4gICAgICBjb21wb25lbnQuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgY2xlYXIoKTtcbiAgICAgICAgb3JpZ2luYWxEZXN0cm95Py4oKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL3ZsaXN0L3ZsaXN0LnRzXG5cbi8qKlxuICogVkxpc3QgQ29tcG9uZW50IC0gVmlydHVhbCBMaXN0IHdpdGggZGlyZWN0IHZpZXdwb3J0IGludGVncmF0aW9uXG4gKlxuICogQSBzaW1wbGlmaWVkIHZpcnR1YWwgbGlzdCB0aGF0IHVzZXMgdGhlIHZpZXdwb3J0IGZlYXR1cmUgZGlyZWN0bHlcbiAqIHdpdGhvdXQgdGhlIGxpc3QtbWFuYWdlciBhYnN0cmFjdGlvbiBsYXllci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZMaXN0Q29uZmlnLCBWTGlzdENvbXBvbmVudCwgVkxpc3RJdGVtIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLy8gSW1wb3J0IG10cmwgY29tcG9zZSBzeXN0ZW1cbmltcG9ydCB7IHBpcGUgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgY3JlYXRlQmFzZSwgd2l0aEVsZW1lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgd2l0aEV2ZW50cywgd2l0aExpZmVjeWNsZSB9IGZyb20gXCJtdHJsXCI7XG5cbi8vIEltcG9ydCB2aWV3cG9ydCBmZWF0dXJlXG5pbXBvcnQgeyB3aXRoVmlld3BvcnQgfSBmcm9tIFwiLi9mZWF0dXJlcy92aWV3cG9ydFwiO1xuaW1wb3J0IHsgd2l0aEFQSSB9IGZyb20gXCIuL2ZlYXR1cmVzL2FwaVwiO1xuaW1wb3J0IHsgd2l0aFNlbGVjdGlvbiB9IGZyb20gXCIuL2ZlYXR1cmVzL3NlbGVjdGlvblwiO1xuaW1wb3J0IHsgd2l0aEtleWJvYXJkIH0gZnJvbSBcIi4vZmVhdHVyZXMva2V5Ym9hcmRcIjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFZMaXN0IGNvbXBvbmVudCB1c2luZyBkaXJlY3Qgdmlld3BvcnQgaW50ZWdyYXRpb25cbiAqXG4gKiBAcGFyYW0ge1ZMaXN0Q29uZmlnfSBjb25maWcgLSBMaXN0IGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMge1ZMaXN0Q29tcG9uZW50fSBBIGZ1bGx5IGNvbmZpZ3VyZWQgdmlydHVhbCBsaXN0IGNvbXBvbmVudFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB2bGlzdCA9IGNyZWF0ZVZMaXN0KHtcbiAqICAgY29udGFpbmVyOiAnI215LWxpc3QnLFxuICogICBjb2xsZWN0aW9uOiBteUFkYXB0ZXIsXG4gKiAgIHJhbmdlU2l6ZTogMjAsXG4gKiAgIHBhZ2luYXRpb25TdHJhdGVneTogJ3BhZ2UnLFxuICogICB0ZW1wbGF0ZTogKGl0ZW0sIGluZGV4KSA9PiBbXG4gKiAgICAgeyBjbGFzczogJ3ZpZXdwb3J0LWl0ZW0nLCBhdHRyaWJ1dGVzOiB7ICdkYXRhLWlkJzogaXRlbS5pZCB9fSxcbiAqICAgICBbeyBjbGFzczogJ3ZpZXdwb3J0LWl0ZW1fX25hbWUnLCB0ZXh0OiBpdGVtLm5hbWUgfV0sXG4gKiAgICAgW3sgY2xhc3M6ICd2aWV3cG9ydC1pdGVtX192YWx1ZScsIHRleHQ6IGl0ZW0udmFsdWUgfV1cbiAqICAgXVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVZMaXN0ID0gPFQgZXh0ZW5kcyBWTGlzdEl0ZW0gPSBWTGlzdEl0ZW0+KFxuICBjb25maWc6IFZMaXN0Q29uZmlnPFQ+ID0ge30sXG4pOiBWTGlzdENvbXBvbmVudDxUPiA9PiB7XG4gIHRyeSB7XG4gICAgLy8gY29uc29sZS5sb2coYPCfk4sgQ3JlYXRpbmcgVkxpc3QgY29tcG9uZW50IHdpdGggZGlyZWN0IHZpZXdwb3J0IGludGVncmF0aW9uYCk7XG5cbiAgICAvLyBOb3RlOiBUcmFuc2Zvcm0gc2hvdWxkIGJlIGFwcGxpZWQgYnkgdGhlIGNvbGxlY3Rpb24gZmVhdHVyZSBpbiB2aWV3cG9ydFxuICAgIC8vIFZMaXN0IHNob3VsZCBub3QgaW50ZXJjZXB0IGNvbGxlY3Rpb24gcmVhZHMgYXMgaXQgYnlwYXNzZXMgdGhlIGxvYWRpbmcgbWFuYWdlclxuXG4gICAgLy8gQ3JlYXRlIHRoZSBjb21wb25lbnQgdGhyb3VnaCBmdW5jdGlvbmFsIGNvbXBvc2l0aW9uXG4gICAgY29uc3QgZW5oYW5jZXJzID0gW1xuICAgICAgLy8gMS4gRm91bmRhdGlvbiBsYXllclxuICAgICAgY3JlYXRlQmFzZSxcbiAgICAgIHdpdGhFdmVudHMoKSxcbiAgICAgIHdpdGhFbGVtZW50KHtcbiAgICAgICAgdGFnOiBcImRpdlwiLFxuICAgICAgICBjbGFzc05hbWU6IGNvbmZpZy5jbGFzc05hbWUgfHwgXCJtdHJsLXZsaXN0XCIsXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICByb2xlOiBcImxpc3RcIixcbiAgICAgICAgICBcImFyaWEtbGFiZWxcIjogY29uZmlnLmFyaWFMYWJlbCB8fCBcIlZpcnR1YWwgTGlzdFwiLFxuICAgICAgICB9LFxuICAgICAgfSksXG5cbiAgICAgIC8vIDIuIFZpZXdwb3J0IGludGVncmF0aW9uXG4gICAgICAvLyBQYXNzIGF1dG9TZWxlY3RGaXJzdCBmcm9tIHNlbGVjdGlvbiBjb25maWcgdG8gdmlld3BvcnQgbGV2ZWxcbiAgICAgIHdpdGhWaWV3cG9ydCh7XG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgYXV0b1NlbGVjdEZpcnN0OiBjb25maWcuc2VsZWN0aW9uPy5hdXRvU2VsZWN0Rmlyc3QsXG4gICAgICB9KSxcblxuICAgICAgLy8gMy4gQ29tcG9uZW50IGxpZmVjeWNsZVxuICAgICAgd2l0aExpZmVjeWNsZSgpLFxuXG4gICAgICAvLyA0LiBQdWJsaWMgQVBJIGxheWVyXG4gICAgICB3aXRoQVBJKGNvbmZpZyksXG4gICAgXTtcblxuICAgIC8vIDQuNS4gU2VsZWN0aW9uIGNhcGFiaWxpdGllcyAoaWYgZW5hYmxlZCkgLSBtdXN0IGJlIGFmdGVyIEFQSVxuICAgIGlmIChjb25maWcuc2VsZWN0aW9uPy5lbmFibGVkKSB7XG4gICAgICBlbmhhbmNlcnMucHVzaCh3aXRoU2VsZWN0aW9uKGNvbmZpZykpO1xuICAgIH1cblxuICAgIC8vIDUuIEtleWJvYXJkIG5hdmlnYXRpb24gKGlmIHNlbGVjdGlvbiBlbmFibGVkIG9yIGV4cGxpY2l0bHkgY29uZmlndXJlZClcbiAgICBpZiAoY29uZmlnLnNlbGVjdGlvbj8uZW5hYmxlZCB8fCBjb25maWcua2V5Ym9hcmQ/LmVuYWJsZWQpIHtcbiAgICAgIGVuaGFuY2Vycy5wdXNoKHdpdGhLZXlib2FyZChjb25maWcpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wb25lbnQgPSBwaXBlKC4uLmVuaGFuY2Vycykoe1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgY29tcG9uZW50TmFtZTogXCJ2bGlzdFwiLFxuICAgICAgcHJlZml4OiBjb25maWcucHJlZml4IHx8IFwibXRybFwiLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudCBhcyBWTGlzdENvbXBvbmVudDxUPjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwi4p2MIFtWTElTVF0gRmFpbGVkIHRvIGNyZWF0ZSBWTGlzdCBjb21wb25lbnQ6XCIsIGVycm9yKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvdmxpc3QvZmVhdHVyZXMvdmlld3BvcnQudHNcblxuLyoqXG4gKiBWaWV3cG9ydCBmZWF0dXJlIGZvciBWTGlzdFxuICogSW50ZWdyYXRlcyB0aGUgY29yZSB2aWV3cG9ydCBmdW5jdGlvbmFsaXR5IHdpdGggVkxpc3QgY29tcG9uZW50XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWTGlzdENvbmZpZywgVkxpc3RJdGVtIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBjcmVhdGVWaWV3cG9ydCB9IGZyb20gXCIuLi8uLi8uLi9jb3JlL3ZpZXdwb3J0XCI7XG5cbi8qKlxuICogQWRkcyB2aWV3cG9ydCBmdW5jdGlvbmFsaXR5IHRvIFZMaXN0XG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoVmlld3BvcnQgPSA8VCBleHRlbmRzIFZMaXN0SXRlbSA9IFZMaXN0SXRlbT4oXG4gIGNvbmZpZzogVkxpc3RDb25maWc8VD4sXG4pID0+IHtcbiAgcmV0dXJuIChjb21wb25lbnQ6IGFueSkgPT4ge1xuICAgIC8vIFNldCBpbml0aWFsIGl0ZW1zIGlmIHByb3ZpZGVkXG4gICAgaWYgKGNvbmZpZy5pdGVtcykge1xuICAgICAgY29tcG9uZW50Lml0ZW1zID0gY29uZmlnLml0ZW1zO1xuICAgICAgY29tcG9uZW50LnRvdGFsSXRlbXMgPSBjb25maWcuaXRlbXMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIFNldCB0ZW1wbGF0ZSBpZiBwcm92aWRlZFxuICAgIGlmIChjb25maWcudGVtcGxhdGUpIHtcbiAgICAgIGNvbXBvbmVudC50ZW1wbGF0ZSA9IGNvbmZpZy50ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgdGhlIGVsZW1lbnQgaGFzIGJvdGggdmxpc3QgYW5kIHZpZXdwb3J0IGNsYXNzZXNcbiAgICBjb25zdCB2aWV3cG9ydENvbmZpZyA9IHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGNsYXNzTmFtZTogXCJtdHJsLXZpZXdwb3J0XCIsIC8vIFRoaXMgd2lsbCBiZSBhZGRlZCBieSB2aWV3cG9ydCBiYXNlIGZlYXR1cmVcbiAgICB9O1xuXG4gICAgLy8gUGFzcyBWTGlzdCBjb25maWcgZGlyZWN0bHkgdG8gdmlld3BvcnRcbiAgICBjb25zdCB2aWV3cG9ydEVuaGFuY2VkID0gY3JlYXRlVmlld3BvcnQodmlld3BvcnRDb25maWcgYXMgYW55KShjb21wb25lbnQpO1xuXG4gICAgLy8gSGFuZGxlIHBhcmVudCBlbGVtZW50IGlmIHByb3ZpZGVkXG4gICAgaWYgKGNvbmZpZy5wYXJlbnQgfHwgY29uZmlnLmNvbnRhaW5lcikge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gY29uZmlnLnBhcmVudCB8fCBjb25maWcuY29udGFpbmVyO1xuICAgICAgY29uc3QgZWxlbWVudCA9XG4gICAgICAgIHR5cGVvZiBjb250YWluZXIgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY29udGFpbmVyKVxuICAgICAgICAgIDogY29udGFpbmVyO1xuXG4gICAgICBpZiAoZWxlbWVudCAmJiB2aWV3cG9ydEVuaGFuY2VkLmVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZCh2aWV3cG9ydEVuaGFuY2VkLmVsZW1lbnQpO1xuXG4gICAgICAgIC8vIEVuc3VyZSB2aWV3cG9ydCBpcyBpbml0aWFsaXplZCBhZnRlciBET00gYXR0YWNobWVudFxuICAgICAgICBpZiAodmlld3BvcnRFbmhhbmNlZC52aWV3cG9ydCAmJiB2aWV3cG9ydEVuaGFuY2VkLnZpZXdwb3J0LmluaXRpYWxpemUpIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIvCfk4sgW1ZMaXN0XSBJbml0aWFsaXppbmcgdmlld3BvcnQgYWZ0ZXIgRE9NIGF0dGFjaG1lbnRcIik7XG4gICAgICAgICAgdmlld3BvcnRFbmhhbmNlZC52aWV3cG9ydC5pbml0aWFsaXplKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmlld3BvcnRFbmhhbmNlZDtcbiAgfTtcbn07XG4iLAogICAgIi8qKlxuICogQVBJIGZlYXR1cmUgZm9yIFZMaXN0XG4gKiBQcm92aWRlcyBhIGNsZWFuIHB1YmxpYyBBUEkgZm9yIHRoZSBWTGlzdCBjb21wb25lbnRcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZMaXN0Q29uZmlnLCBWTGlzdEl0ZW0sIFJlbW92ZUl0ZW1PcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8vIFJlLWV4cG9ydCBmb3IgY29udmVuaWVuY2VcbmV4cG9ydCB0eXBlIHsgUmVtb3ZlSXRlbU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IHdpdGhBUEkgPSA8VCBleHRlbmRzIFZMaXN0SXRlbSA9IFZMaXN0SXRlbT4oXG4gIGNvbmZpZzogVkxpc3RDb25maWc8VD4sXG4pID0+IHtcbiAgcmV0dXJuIChjb21wb25lbnQ6IGFueSkgPT4ge1xuICAgIC8vIEluaXRpYWxpemUgdmlld3BvcnQgb24gY3JlYXRpb25cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQgJiYgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUpIHtcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUoKTtcbiAgICAgIH1cbiAgICB9LCAwKTtcblxuICAgIC8vIFRyYWNrIGxvYWRpbmcgc3RhdGVcbiAgICBsZXQgaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgbGV0IHNlbGVjdGVkSWRzID0gbmV3IFNldDxzdHJpbmcgfCBudW1iZXI+KCk7XG5cbiAgICAvLyBUcmFjayBwZW5kaW5nIHJlbW92YWxzIHRvIGZpbHRlciBvdXQgaXRlbXMgZnJvbSBzdGFsZSBzZXJ2ZXIgcmVzcG9uc2VzXG4gICAgLy8gVGhpcyBwcmV2ZW50cyByYWNlIGNvbmRpdGlvbnMgd2hlcmUgc2VydmVyIHJldHVybnMgb2xkIGRhdGEgYmVmb3JlIHVwZGF0ZXMgYXJlIGNvbW1pdHRlZFxuICAgIGNvbnN0IHBlbmRpbmdSZW1vdmFscyA9IG5ldyBTZXQ8c3RyaW5nIHwgbnVtYmVyPigpO1xuXG4gICAgLy8gTGlzdGVuIGZvciBjb2xsZWN0aW9uIGV2ZW50c1xuICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjpyYW5nZS1sb2FkZWRcIiwgKCkgPT4ge1xuICAgICAgaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgfSk7XG4gICAgY29tcG9uZW50Lm9uPy4oXCJjb2xsZWN0aW9uOnJhbmdlLWZhaWxlZFwiLCAoKSA9PiB7XG4gICAgICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIC8vIERhdGEgb3BlcmF0aW9uc1xuXG4gICAgICAvKipcbiAgICAgICAqIFJlbG9hZCB0aGUgbGlzdCAtIGNsZWFycyBhbGwgZGF0YSBhbmQgZmV0Y2hlcyBmcmVzaCBmcm9tIHRoZSBhZGFwdGVyXG4gICAgICAgKiBUaGlzIGlzIG11Y2ggbW9yZSBlZmZpY2llbnQgdGhhbiBkZXN0cm95aW5nIGFuZCByZWNyZWF0aW5nIHRoZSBWTGlzdFxuICAgICAgICovXG4gICAgICBhc3luYyByZWxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIFJlc2V0IHRoZSBjb2xsZWN0aW9uIHN0YXRlXG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24/LnJlc2V0KSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24ucmVzZXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2V0IHNjcm9sbCBwb3NpdGlvbiB0byB0b3BcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uc2Nyb2xsVG8pIHtcbiAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG8oMCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciByZW5kZXJlZCBET00gY29udGVudCAoaXRlbXMgY29udGFpbmVyKVxuICAgICAgICBjb25zdCBpdGVtc0NvbnRhaW5lciA9IGNvbXBvbmVudC5lbGVtZW50Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgIFwiLm10cmwtdmlld3BvcnQtaXRlbXNcIixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGl0ZW1zQ29udGFpbmVyKSB7XG4gICAgICAgICAgaXRlbXNDb250YWluZXIuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2V0IGluaXRpYWxpemF0aW9uIHN0YXRlIHNvIGluaXRpYWxpemUoKSB3aWxsIHJ1biBhZ2FpblxuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5yZXNldEluaXRpYWxpemF0aW9uKSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnJlc2V0SW5pdGlhbGl6YXRpb24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlLWluaXRpYWxpemUgdG8gdHJpZ2dlciBmcmVzaCBkYXRhIGxvYWRcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uaW5pdGlhbGl6ZSkge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwicmVsb2FkZWRcIik7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGFsbCBkYXRhIHdpdGhvdXQgcmVsb2FkaW5nXG4gICAgICAgKi9cbiAgICAgIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICAvLyBSZXNldCB0aGUgY29sbGVjdGlvbiBzdGF0ZVxuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uPy5yZXNldCkge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLnJlc2V0KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNldCBzY3JvbGwgcG9zaXRpb24gdG8gdG9wXG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LnNjcm9sbFRvKSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbFRvKDApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgcmVuZGVyZWQgRE9NIGNvbnRlbnQgKGl0ZW1zIGNvbnRhaW5lcilcbiAgICAgICAgY29uc3QgaXRlbXNDb250YWluZXIgPSBjb21wb25lbnQuZWxlbWVudD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBcIi5tdHJsLXZpZXdwb3J0LWl0ZW1zXCIsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpdGVtc0NvbnRhaW5lcikge1xuICAgICAgICAgIGl0ZW1zQ29udGFpbmVyLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY2xlYXJlZFwiKTtcbiAgICAgIH0sXG5cbiAgICAgIHNldEl0ZW1zKGl0ZW1zOiBUW10pIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uY29sbGVjdGlvbikge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLnNldEl0ZW1zKGl0ZW1zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21wb25lbnQuaXRlbXMgPSBpdGVtcztcbiAgICAgICAgICBjb21wb25lbnQudG90YWxJdGVtcyA9IGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbXM6c2V0XCIsIHsgaXRlbXMsIHRvdGFsOiBpdGVtcy5sZW5ndGggfSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEFkZCBpdGVtcyB0byB0aGUgY29sbGVjdGlvbiBhdCB0aGUgc3RhcnQgb3IgZW5kXG4gICAgICAgKiBVcGRhdGVzIHRvdGFsSXRlbXMgYW5kIHRyaWdnZXJzIHJlLXJlbmRlciBvZiB2aXNpYmxlIGl0ZW1zXG4gICAgICAgKiBAcGFyYW0gbmV3SXRlbXMgLSBBcnJheSBvZiBpdGVtcyB0byBhZGRcbiAgICAgICAqIEBwYXJhbSBwb3NpdGlvbiAtIFdoZXJlIHRvIGFkZCBpdGVtczogXCJzdGFydFwiIChkZWZhdWx0KSBvciBcImVuZFwiXG4gICAgICAgKi9cbiAgICAgIGFkZEl0ZW1zKG5ld0l0ZW1zOiBUW10sIHBvc2l0aW9uOiBcInN0YXJ0XCIgfCBcImVuZFwiID0gXCJzdGFydFwiKTogdm9pZCB7XG4gICAgICAgIGlmICghbmV3SXRlbXMgfHwgbmV3SXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiW1ZMaXN0XSBhZGRJdGVtczogbm8gaXRlbXMgcHJvdmlkZWRcIik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uO1xuICAgICAgICBjb25zdCBjdXJyZW50SXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG5cbiAgICAgICAgLy8gQWRkIGl0ZW1zIHRvIHRoZSBjb2xsZWN0aW9uIGl0ZW1zIGFycmF5XG4gICAgICAgIGlmIChjb2xsZWN0aW9uPy5pdGVtcykge1xuICAgICAgICAgIGlmIChwb3NpdGlvbiA9PT0gXCJzdGFydFwiKSB7XG4gICAgICAgICAgICAvLyBQcmVwZW5kIGl0ZW1zIChuZXdlc3QgZmlyc3QpXG4gICAgICAgICAgICBjb2xsZWN0aW9uLml0ZW1zLnVuc2hpZnQoLi4ubmV3SXRlbXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBcHBlbmQgaXRlbXNcbiAgICAgICAgICAgIGNvbGxlY3Rpb24uaXRlbXMucHVzaCguLi5uZXdJdGVtcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBldmVudCBGSVJTVCBzbyByZW5kZXJpbmcgZmVhdHVyZSBjYW4gcmVidWlsZCBjb2xsZWN0aW9uSXRlbXNcbiAgICAgICAgLy8gQkVGT1JFIHNldFRvdGFsSXRlbXMgdHJpZ2dlcnMgYSByZW5kZXJcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW1zOmFkZC1yZXF1ZXN0XCIsIHtcbiAgICAgICAgICBpdGVtczogbmV3SXRlbXMsXG4gICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgcHJldmlvdXNDb3VudDogY3VycmVudEl0ZW1zLmxlbmd0aCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHRvdGFsSXRlbXMgLSB0aGlzIHRyaWdnZXJzIHZpZXdwb3J0OnRvdGFsLWl0ZW1zLWNoYW5nZWQgd2hpY2ggY2FsbHMgcmVuZGVySXRlbXNcbiAgICAgICAgY29uc3QgaXRlbXNBZGRlZCA9IG5ld0l0ZW1zLmxlbmd0aDtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24/LmdldFRvdGFsSXRlbXMgJiYgY29sbGVjdGlvbj8uc2V0VG90YWxJdGVtcykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRUb3RhbCA9IGNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpO1xuICAgICAgICAgIGNvbGxlY3Rpb24uc2V0VG90YWxJdGVtcyhjdXJyZW50VG90YWwgKyBpdGVtc0FkZGVkKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24/LnNldFRvdGFsSXRlbXMpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VG90YWwgPSBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5nZXRUb3RhbEl0ZW1zKCk7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uc2V0VG90YWxJdGVtcyhcbiAgICAgICAgICAgIGN1cnJlbnRUb3RhbCArIGl0ZW1zQWRkZWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoY29tcG9uZW50LnRvdGFsSXRlbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29tcG9uZW50LnRvdGFsSXRlbXMgPSBjb21wb25lbnQudG90YWxJdGVtcyArIGl0ZW1zQWRkZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBjb21wbGV0aW9uIGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtczphZGRlZFwiLCB7XG4gICAgICAgICAgaXRlbXM6IG5ld0l0ZW1zLFxuICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgIHRvdGFsOiB0aGlzLmdldEl0ZW1Db3VudCgpLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQWRkIGEgc2luZ2xlIGl0ZW0gdG8gdGhlIGNvbGxlY3Rpb24gYXQgdGhlIHN0YXJ0IG9yIGVuZFxuICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgd3JhcHMgYWRkSXRlbXMgZm9yIHNpbmdsZSBpdGVtIHVzZSBjYXNlXG4gICAgICAgKiBAcGFyYW0gaXRlbSAtIEl0ZW0gdG8gYWRkXG4gICAgICAgKiBAcGFyYW0gcG9zaXRpb24gLSBXaGVyZSB0byBhZGQgaXRlbTogXCJzdGFydFwiIChkZWZhdWx0KSBvciBcImVuZFwiXG4gICAgICAgKi9cbiAgICAgIGFkZEl0ZW0oaXRlbTogVCwgcG9zaXRpb246IFwic3RhcnRcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiW1ZMaXN0XSBhZGRJdGVtOiBubyBpdGVtIHByb3ZpZGVkXCIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZEl0ZW1zKFtpdGVtXSwgcG9zaXRpb24pO1xuICAgICAgfSxcblxuICAgICAgZ2V0SXRlbXMoKTogVFtdIHtcbiAgICAgICAgLy8gQ29sbGVjdGlvbiBpcyBhZGRlZCBkaXJlY3RseSB0byBjb21wb25lbnQsIG5vdCB0byB2aWV3cG9ydC5jb2xsZWN0aW9uXG4gICAgICAgIGlmICgoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbj8uZ2V0SXRlbXMpIHtcbiAgICAgICAgICByZXR1cm4gKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24uZ2V0SXRlbXMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50Lml0ZW1zIHx8IFtdO1xuICAgICAgfSxcblxuICAgICAgZ2V0VmlzaWJsZUl0ZW1zKCk6IFRbXSB7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gY29tcG9uZW50LnZpZXdwb3J0Py5nZXRWaXNpYmxlUmFuZ2UoKSB8fCB7XG4gICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgZW5kOiAwLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zLnNsaWNlKHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpO1xuICAgICAgfSxcblxuICAgICAgZ2V0SXRlbUNvdW50KCk6IG51bWJlciB7XG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICByZXR1cm4gY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb25lbnQudG90YWxJdGVtcyB8fCBjb21wb25lbnQuaXRlbXM/Lmxlbmd0aCB8fCAwO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgaXRlbSBhdCBhIHNwZWNpZmljIGluZGV4XG4gICAgICAgKiBAcGFyYW0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmV0cmlldmVcbiAgICAgICAqIEByZXR1cm5zIFRoZSBpdGVtIGF0IHRoZSBpbmRleCwgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICAgICAgICovXG4gICAgICBnZXRJdGVtKGluZGV4OiBudW1iZXIpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uPy5nZXRJdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uLmdldEl0ZW0oaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgICAgICByZXR1cm4gaXRlbXNbaW5kZXhdO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBVcGRhdGUgaXRlbSBhdCBhIHNwZWNpZmljIGluZGV4XG4gICAgICAgKiBAcGFyYW0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gdXBkYXRlXG4gICAgICAgKiBAcGFyYW0gaXRlbSAtIFRoZSBuZXcgaXRlbSBkYXRhIChmdWxsIHJlcGxhY2VtZW50KVxuICAgICAgICovXG4gICAgICB1cGRhdGVJdGVtKGluZGV4OiBudW1iZXIsIGl0ZW06IFQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG5cbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtWTGlzdF0gdXBkYXRlSXRlbTogaW5kZXggJHtpbmRleH0gb3V0IG9mIGJvdW5kc2ApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXZpb3VzSXRlbSA9IGl0ZW1zW2luZGV4XTtcblxuICAgICAgICAvLyBVcGRhdGUgaW4gY29sbGVjdGlvbiBpdGVtcyBhcnJheVxuICAgICAgICBpZiAoKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24/Lml0ZW1zKSB7XG4gICAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24uaXRlbXNbaW5kZXhdID0gaXRlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgZXZlbnQgZm9yIHJlbmRlcmluZyBmZWF0dXJlIHRvIGhhbmRsZSBET00gdXBkYXRlXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtOnVwZGF0ZS1yZXF1ZXN0XCIsIHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBpdGVtLFxuICAgICAgICAgIHByZXZpb3VzSXRlbSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFVwZGF0ZSBpdGVtIGJ5IElEXG4gICAgICAgKiBGaW5kcyB0aGUgaXRlbSBpbiB0aGUgY29sbGVjdGlvbiBieSBpdHMgSUQgYW5kIHVwZGF0ZXMgaXQgd2l0aCBuZXcgZGF0YVxuICAgICAgICogUmUtcmVuZGVycyB0aGUgaXRlbSBpZiBjdXJyZW50bHkgdmlzaWJsZSBpbiB0aGUgdmlld3BvcnRcbiAgICAgICAqIEBwYXJhbSBpZCAtIFRoZSBpdGVtIElEIHRvIGZpbmRcbiAgICAgICAqIEBwYXJhbSBkYXRhIC0gUGFydGlhbCBkYXRhIHRvIG1lcmdlIHdpdGggZXhpc3RpbmcgaXRlbSwgb3IgZnVsbCBpdGVtIHJlcGxhY2VtZW50XG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFVwZGF0ZSBvcHRpb25zXG4gICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGl0ZW0gd2FzIGZvdW5kIGFuZCB1cGRhdGVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgICAqL1xuICAgICAgdXBkYXRlSXRlbUJ5SWQoXG4gICAgICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgICAgIGRhdGE6IFBhcnRpYWw8VD4sXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAvKiogSWYgdHJ1ZSwgcmVwbGFjZSB0aGUgZW50aXJlIGl0ZW0gaW5zdGVhZCBvZiBtZXJnaW5nIChkZWZhdWx0OiBmYWxzZSkgKi9cbiAgICAgICAgICByZXBsYWNlPzogYm9vbGVhbjtcbiAgICAgICAgICAvKiogSWYgdHJ1ZSwgcmUtcmVuZGVyIGV2ZW4gaWYgbm90IHZpc2libGUgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICAgICAgICAgIGZvcmNlUmVuZGVyPzogYm9vbGVhbjtcbiAgICAgICAgfSA9IHt9LFxuICAgICAgKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHsgcmVwbGFjZSA9IGZhbHNlIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcblxuICAgICAgICAvLyBGaW5kIHRoZSBpdGVtIGJ5IElEIChoYW5kbGUgc3BhcnNlIGFycmF5cyBmcm9tIHBhZ2luYXRpb24pXG4gICAgICAgIC8vIENoZWNrIGFsbCBwb3NzaWJsZSBJRCBmaWVsZHMgc2luY2UgaXRlbXMgbWF5IGhhdmUgZGlmZmVyZW50IElEIHN0cnVjdHVyZXNcbiAgICAgICAgY29uc3QgaW5kZXggPSBpdGVtcy5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgIGlmICghaXRlbSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIC8vIENoZWNrIGFsbCBwb3NzaWJsZSBJRCBmaWVsZHMgLSB1c2VyX2lkIGlzIGltcG9ydGFudCBmb3IgcHJvZmlsZS9jb250YWN0IGl0ZW1zXG4gICAgICAgICAgY29uc3QgaWRzVG9DaGVjayA9IFtpdGVtLmlkLCBpdGVtLl9pZCwgaXRlbS51c2VyX2lkXS5maWx0ZXIoXG4gICAgICAgICAgICAodikgPT4gdiAhPT0gdW5kZWZpbmVkICYmIHYgIT09IG51bGwsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gaWRzVG9DaGVjay5zb21lKFxuICAgICAgICAgICAgKGl0ZW1JZCkgPT4gaXRlbUlkID09PSBpZCB8fCBTdHJpbmcoaXRlbUlkKSA9PT0gU3RyaW5nKGlkKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbVkxpc3RdIHVwZGF0ZUl0ZW1CeUlkOiBpdGVtIHdpdGggaWQgJHtpZH0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJldmlvdXNJdGVtID0gaXRlbXNbaW5kZXhdO1xuXG4gICAgICAgIC8vIENyZWF0ZSB1cGRhdGVkIGl0ZW0gLSBlaXRoZXIgcmVwbGFjZSBlbnRpcmVseSBvciBtZXJnZVxuICAgICAgICBsZXQgdXBkYXRlZEl0ZW06IFQ7XG4gICAgICAgIGlmIChyZXBsYWNlKSB7XG4gICAgICAgICAgdXBkYXRlZEl0ZW0gPSB7IC4uLmRhdGEsIGlkOiBwcmV2aW91c0l0ZW0uaWQgPz8gaWQgfSBhcyBUO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE9ubHkgbWVyZ2UgcHJvcGVydGllcyB0aGF0IGhhdmUgYWN0dWFsIHZhbHVlcyAobm90IHVuZGVmaW5lZClcbiAgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHBhcnRpYWwgdXBkYXRlcyBmcm9tIG92ZXJ3cml0aW5nIGV4aXN0aW5nIGRhdGFcbiAgICAgICAgICB1cGRhdGVkSXRlbSA9IHsgLi4ucHJldmlvdXNJdGVtIH0gYXMgVDtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgKHVwZGF0ZWRJdGVtIGFzIGFueSlba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBpbiBjb2xsZWN0aW9uIGl0ZW1zIGFycmF5XG4gICAgICAgIGlmICgoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbj8uaXRlbXMpIHtcbiAgICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbi5pdGVtc1tpbmRleF0gPSB1cGRhdGVkSXRlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgZXZlbnQgZm9yIHJlbmRlcmluZyBmZWF0dXJlIHRvIGhhbmRsZSBET00gdXBkYXRlXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtOnVwZGF0ZS1yZXF1ZXN0XCIsIHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBpdGVtOiB1cGRhdGVkSXRlbSxcbiAgICAgICAgICBwcmV2aW91c0l0ZW0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmUgaXRlbSBhdCBhIHNwZWNpZmljIGluZGV4XG4gICAgICAgKiBSZW1vdmVzIHRoZSBpdGVtIGZyb20gdGhlIGNvbGxlY3Rpb24sIHVwZGF0ZXMgdG90YWxJdGVtcywgYW5kIHRyaWdnZXJzIHJlLXJlbmRlclxuICAgICAgICogQHBhcmFtIGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJlbW92ZVxuICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiBpdGVtIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICAgKi9cbiAgICAgIHJlbW92ZUl0ZW0oaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uO1xuXG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbVkxpc3RdIHJlbW92ZUl0ZW06IGluZGV4ICR7aW5kZXh9IG91dCBvZiBib3VuZHNgKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZW1vdmVkSXRlbSA9IGl0ZW1zW2luZGV4XTtcblxuICAgICAgICAvLyBSZW1vdmUgZnJvbSBjb2xsZWN0aW9uIGl0ZW1zIGFycmF5IChjb21wb25lbnQuY29sbGVjdGlvbi5pdGVtcyBpcyB0aGUgYWN0dWFsIGFycmF5KVxuICAgICAgICBpZiAoKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24/Lml0ZW1zKSB7XG4gICAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24uaXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElNUE9SVEFOVDogRW1pdCBpdGVtOnJlbW92ZS1yZXF1ZXN0IEZJUlNUIHNvIHJlbmRlcmluZyBmZWF0dXJlIHJlYnVpbGRzIGNvbGxlY3Rpb25JdGVtc1xuICAgICAgICAvLyBCRUZPUkUgc2V0VG90YWxJdGVtcyB0cmlnZ2VycyBhIHJlbmRlciB2aWEgdmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbTpyZW1vdmUtcmVxdWVzdFwiLCB7XG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgaXRlbTogcmVtb3ZlZEl0ZW0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0b3RhbEl0ZW1zIC0gdGhpcyB3aWxsIHRyaWdnZXIgdmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZCB3aGljaCBjYWxscyByZW5kZXJJdGVtc1xuICAgICAgICAvLyBCeSBub3csIGNvbGxlY3Rpb25JdGVtcyBoYXMgYmVlbiByZWJ1aWx0IGJ5IHRoZSBpdGVtOnJlbW92ZS1yZXF1ZXN0IGhhbmRsZXJcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24/LmdldFRvdGFsSXRlbXMgJiYgY29sbGVjdGlvbj8uc2V0VG90YWxJdGVtcykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRUb3RhbCA9IGNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpO1xuICAgICAgICAgIGNvbGxlY3Rpb24uc2V0VG90YWxJdGVtcyhNYXRoLm1heCgwLCBjdXJyZW50VG90YWwgLSAxKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uPy5zZXRUb3RhbEl0ZW1zKSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gdmlld3BvcnQuY29sbGVjdGlvbiBpZiBhdmFpbGFibGVcbiAgICAgICAgICBjb25zdCBjdXJyZW50VG90YWwgPSBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5nZXRUb3RhbEl0ZW1zKCk7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uc2V0VG90YWxJdGVtcyhcbiAgICAgICAgICAgIE1hdGgubWF4KDAsIGN1cnJlbnRUb3RhbCAtIDEpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTGFzdCByZXNvcnQ6IHVwZGF0ZSBjb21wb25lbnQudG90YWxJdGVtcyBkaXJlY3RseVxuICAgICAgICAgIGlmIChjb21wb25lbnQudG90YWxJdGVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb21wb25lbnQudG90YWxJdGVtcyA9IE1hdGgubWF4KDAsIGNvbXBvbmVudC50b3RhbEl0ZW1zIC0gMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBpdGVtIGJ5IElEXG4gICAgICAgKiBGaW5kcyB0aGUgaXRlbSBpbiB0aGUgY29sbGVjdGlvbiBieSBpdHMgSUQgYW5kIHJlbW92ZXMgaXRcbiAgICAgICAqIFVwZGF0ZXMgdG90YWxJdGVtcyBhbmQgdHJpZ2dlcnMgcmUtcmVuZGVyIG9mIHZpc2libGUgaXRlbXNcbiAgICAgICAqIE9wdGlvbmFsbHkgdHJhY2tzIGFzIHBlbmRpbmcgcmVtb3ZhbCB0byBmaWx0ZXIgZnJvbSBmdXR1cmUgZmV0Y2hlc1xuICAgICAgICogQHBhcmFtIGlkIC0gVGhlIGl0ZW0gSUQgdG8gZmluZCBhbmQgcmVtb3ZlXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFJlbW92ZSBvcHRpb25zICh0cmFja1BlbmRpbmcsIHBlbmRpbmdUaW1lb3V0KVxuICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiBpdGVtIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICAgKi9cbiAgICAgIHJlbW92ZUl0ZW1CeUlkKFxuICAgICAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgICAgICBvcHRpb25zOiBSZW1vdmVJdGVtT3B0aW9ucyA9IHt9LFxuICAgICAgKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHsgdHJhY2tQZW5kaW5nID0gdHJ1ZSwgcGVuZGluZ1RpbWVvdXQgPSA1MDAwIH0gPSBvcHRpb25zO1xuXG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbVkxpc3RdIHJlbW92ZUl0ZW1CeUlkOiBpbnZhbGlkIGlkYCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHRvIHBlbmRpbmcgcmVtb3ZhbHMgdG8gZmlsdGVyIGZyb20gZnV0dXJlIHNlcnZlciByZXNwb25zZXNcbiAgICAgICAgaWYgKHRyYWNrUGVuZGluZykge1xuICAgICAgICAgIHBlbmRpbmdSZW1vdmFscy5hZGQoaWQpO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgZnJvbSBwZW5kaW5nIHJlbW92YWxzIGFmdGVyIHRpbWVvdXQgKHNlcnZlciBzaG91bGQgaGF2ZSB1cGRhdGVkIGJ5IHRoZW4pXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBwZW5kaW5nUmVtb3ZhbHMuZGVsZXRlKGlkKTtcbiAgICAgICAgICB9LCBwZW5kaW5nVGltZW91dCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcblxuICAgICAgICAvLyBGaW5kIHRoZSBpdGVtIGJ5IElEIChoYW5kbGUgc3BhcnNlIGFycmF5cyBmcm9tIHBhZ2luYXRpb24pXG4gICAgICAgIC8vIENoZWNrIGFsbCBwb3NzaWJsZSBJRCBmaWVsZHMgc2luY2UgaXRlbXMgbWF5IGhhdmUgZGlmZmVyZW50IElEIHN0cnVjdHVyZXNcbiAgICAgICAgY29uc3QgaW5kZXggPSBpdGVtcy5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgIGlmICghaXRlbSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIC8vIENoZWNrIGFsbCBwb3NzaWJsZSBJRCBmaWVsZHNcbiAgICAgICAgICBjb25zdCBpZHNUb0NoZWNrID0gW2l0ZW0uaWQsIGl0ZW0uX2lkLCBpdGVtLnVzZXJfaWRdLmZpbHRlcihcbiAgICAgICAgICAgICh2KSA9PiB2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gbnVsbCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBpZHNUb0NoZWNrLnNvbWUoXG4gICAgICAgICAgICAoaXRlbUlkKSA9PiBpdGVtSWQgPT09IGlkIHx8IFN0cmluZyhpdGVtSWQpID09PSBTdHJpbmcoaWQpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVJdGVtKGluZGV4KTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgYW4gaXRlbSBJRCBpcyBwZW5kaW5nIHJlbW92YWxcbiAgICAgICAqIEBwYXJhbSBpZCAtIFRoZSBpdGVtIElEIHRvIGNoZWNrXG4gICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpdGVtIGlzIHBlbmRpbmcgcmVtb3ZhbFxuICAgICAgICovXG4gICAgICBpc1BlbmRpbmdSZW1vdmFsKGlkOiBzdHJpbmcgfCBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmdSZW1vdmFscy5oYXMoaWQpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYWxsIHBlbmRpbmcgcmVtb3ZhbCBJRHNcbiAgICAgICAqIEByZXR1cm5zIFNldCBvZiBwZW5kaW5nIHJlbW92YWwgSURzXG4gICAgICAgKi9cbiAgICAgIGdldFBlbmRpbmdSZW1vdmFscygpOiBTZXQ8c3RyaW5nIHwgbnVtYmVyPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2V0KHBlbmRpbmdSZW1vdmFscyk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGEgc3BlY2lmaWMgcGVuZGluZyByZW1vdmFsXG4gICAgICAgKiBAcGFyYW0gaWQgLSBUaGUgaXRlbSBJRCB0byBjbGVhciBmcm9tIHBlbmRpbmcgcmVtb3ZhbHNcbiAgICAgICAqL1xuICAgICAgY2xlYXJQZW5kaW5nUmVtb3ZhbChpZDogc3RyaW5nIHwgbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHBlbmRpbmdSZW1vdmFscy5kZWxldGUoaWQpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDbGVhciBhbGwgcGVuZGluZyByZW1vdmFsc1xuICAgICAgICovXG4gICAgICBjbGVhckFsbFBlbmRpbmdSZW1vdmFscygpOiB2b2lkIHtcbiAgICAgICAgcGVuZGluZ1JlbW92YWxzLmNsZWFyKCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEZpbHRlciBpdGVtcyBhcnJheSB0byBleGNsdWRlIHBlbmRpbmcgcmVtb3ZhbHNcbiAgICAgICAqIFV0aWxpdHkgbWV0aG9kIGZvciB1c2UgaW4gY29sbGVjdGlvbiBhZGFwdGVyc1xuICAgICAgICogQHBhcmFtIGl0ZW1zIC0gQXJyYXkgb2YgaXRlbXMgdG8gZmlsdGVyXG4gICAgICAgKiBAcmV0dXJucyBGaWx0ZXJlZCBhcnJheSB3aXRob3V0IHBlbmRpbmcgcmVtb3ZhbCBpdGVtc1xuICAgICAgICovXG4gICAgICBmaWx0ZXJQZW5kaW5nUmVtb3ZhbHM8SSBleHRlbmRzIHsgaWQ/OiBhbnk7IF9pZD86IGFueSB9PihcbiAgICAgICAgaXRlbXM6IElbXSxcbiAgICAgICk6IElbXSB7XG4gICAgICAgIGlmIChwZW5kaW5nUmVtb3ZhbHMuc2l6ZSA9PT0gMCkgcmV0dXJuIGl0ZW1zO1xuXG4gICAgICAgIHJldHVybiBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICBjb25zdCBpZCA9IGl0ZW0uX2lkIHx8IGl0ZW0uaWQ7XG4gICAgICAgICAgcmV0dXJuICFwZW5kaW5nUmVtb3ZhbHMuaGFzKGlkKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICAvLyBMb2FkaW5nIG9wZXJhdGlvbnNcbiAgICAgIGFzeW5jIGxvYWRSYW5nZShcbiAgICAgICAgcGFnZTogbnVtYmVyLFxuICAgICAgICBsaW1pdDogbnVtYmVyLFxuICAgICAgICBzdHJhdGVneTogc3RyaW5nID0gXCJwYWdlXCIsXG4gICAgICAgIGFsaWdubWVudD86IHN0cmluZyxcbiAgICAgICkge1xuICAgICAgICBpc0xvYWRpbmcgPSB0cnVlO1xuXG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBjb25zdCBvZmZzZXQgPSBzdHJhdGVneSA9PT0gXCJwYWdlXCIgPyAocGFnZSAtIDEpICogbGltaXQgOiBwYWdlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5sb2FkUmFuZ2Uob2Zmc2V0LCBsaW1pdCk7XG4gICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwibG9hZFwiLCB7IHBhZ2UsIGxpbWl0LCBzdHJhdGVneSB9KTtcblxuICAgICAgICAgICAgLy8gU2Nyb2xsIHRvIHRoZSBsb2FkZWQgcmFuZ2UgaWYgYWxpZ25tZW50IGlzIHNwZWNpZmllZFxuICAgICAgICAgICAgaWYgKGFsaWdubWVudCkge1xuICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IG9mZnNldDtcbiAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0luZGV4KGluZGV4LCBhbGlnbm1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiZXJyb3JcIiwgeyBlcnJvciB9KTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8vIERhdGEgbG9hZGluZ1xuICAgICAgbG9hZE5leHQ6IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFtWTGlzdF0gbG9hZE5leHQoKWApO1xuXG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpO1xuICAgICAgICAgIGNvbnN0IGxvYWRlZFJhbmdlcyA9IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldExvYWRlZFJhbmdlcygpO1xuXG4gICAgICAgICAgLy8gRmluZCB0aGUgbmV4dCB1bmxvYWRlZCByYW5nZVxuICAgICAgICAgIGxldCBuZXh0T2Zmc2V0ID0gMDtcbiAgICAgICAgICBmb3IgKGNvbnN0IHJhbmdlSWQgb2YgbG9hZGVkUmFuZ2VzKSB7XG4gICAgICAgICAgICBjb25zdCByYW5nZUVuZCA9IChyYW5nZUlkICsgMSkgKiAoY29uZmlnLnBhZ2luYXRpb24/LmxpbWl0IHx8IDIwKTtcbiAgICAgICAgICAgIGlmIChyYW5nZUVuZCA+IG5leHRPZmZzZXQpIHtcbiAgICAgICAgICAgICAgbmV4dE9mZnNldCA9IHJhbmdlRW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChuZXh0T2Zmc2V0IDwgdG90YWxJdGVtcykge1xuICAgICAgICAgICAgYXdhaXQgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24ubG9hZFJhbmdlKFxuICAgICAgICAgICAgICBuZXh0T2Zmc2V0LFxuICAgICAgICAgICAgICBjb25maWcucGFnaW5hdGlvbj8ubGltaXQgfHwgMjAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0sXG5cbiAgICAgIGlzTG9hZGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGlzTG9hZGluZztcbiAgICAgIH0sXG5cbiAgICAgIGhhc05leHQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBjb25zdCB0b3RhbCA9IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldFRvdGFsSXRlbXMoKTtcbiAgICAgICAgICBjb25zdCBpdGVtcyA9IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldEl0ZW1zKCk7XG4gICAgICAgICAgcmV0dXJuIGl0ZW1zLmxlbmd0aCA8IHRvdGFsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIE5vdGU6IFNlbGVjdGlvbiBvcGVyYXRpb25zIGFyZSBoYW5kbGVkIGJ5IHRoZSB3aXRoU2VsZWN0aW9uIGZlYXR1cmVcbiAgICAgIC8vIFRoZXNlIGFyZSBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGJ1dCBkZWxlZ2F0ZSB0byBzZWxlY3Rpb24gZmVhdHVyZSBpZiBhdmFpbGFibGVcbiAgICAgIGdldFNlbGVjdGVkSWRzKCk6IChzdHJpbmcgfCBudW1iZXIpW10ge1xuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5nZXRTZWxlY3RlZEluZGljZXMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIFVzZSBzZWxlY3Rpb24gZmVhdHVyZSBpZiBhdmFpbGFibGVcbiAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICAgICAgICBjb25zdCBpbmRpY2VzID0gY29tcG9uZW50LmdldFNlbGVjdGVkSW5kaWNlcygpO1xuICAgICAgICAgIHJldHVybiBpbmRpY2VzLm1hcCgoaWR4OiBudW1iZXIpID0+IChpdGVtc1tpZHhdIGFzIGFueSk/LmlkIHx8IGlkeCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmFsbGJhY2sgdG8gbG9jYWwgdHJhY2tpbmdcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oc2VsZWN0ZWRJZHMpO1xuICAgICAgfSxcblxuICAgICAgc2VsZWN0SXRlbShpZDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LnNlbGVjdEl0ZW1zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAvLyBVc2Ugc2VsZWN0aW9uIGZlYXR1cmUgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBpdGVtcy5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4gaXRlbS5pZCA9PT0gaWQpO1xuICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuc2VsZWN0SXRlbXMoW2luZGV4XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIGxvY2FsIHRyYWNraW5nXG4gICAgICAgICAgc2VsZWN0ZWRJZHMuYWRkKGlkKTtcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwic2VsZWN0aW9uOmNoYW5nZVwiLCB7XG4gICAgICAgICAgICBzZWxlY3RlZDogdGhpcy5nZXRTZWxlY3RlZElkcygpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBkZXNlbGVjdEl0ZW0oaWQ6IHN0cmluZyB8IG51bWJlcikge1xuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5kZXNlbGVjdEl0ZW1zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAvLyBVc2Ugc2VsZWN0aW9uIGZlYXR1cmUgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBpdGVtcy5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4gaXRlbS5pZCA9PT0gaWQpO1xuICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuZGVzZWxlY3RJdGVtcyhbaW5kZXhdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gbG9jYWwgdHJhY2tpbmdcbiAgICAgICAgICBzZWxlY3RlZElkcy5kZWxldGUoaWQpO1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJzZWxlY3Rpb246Y2hhbmdlXCIsIHtcbiAgICAgICAgICAgIHNlbGVjdGVkOiB0aGlzLmdldFNlbGVjdGVkSWRzKCksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGNsZWFyU2VsZWN0aW9uKCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5jbGVhclNlbGVjdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gVXNlIHNlbGVjdGlvbiBmZWF0dXJlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIGNvbXBvbmVudC5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIGxvY2FsIHRyYWNraW5nXG4gICAgICAgICAgc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwic2VsZWN0aW9uOmNoYW5nZVwiLCB7IHNlbGVjdGVkOiBbXSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLy8gU2Nyb2xsaW5nIG1ldGhvZHNcbiAgICAgIHNjcm9sbFRvSW5kZXg6IChcbiAgICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgICAgYWxpZ25tZW50OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiA9IFwic3RhcnRcIixcbiAgICAgICAgYW5pbWF0ZT86IGJvb2xlYW4sXG4gICAgICApID0+IHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb0luZGV4KGluZGV4LCBhbGlnbm1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIHRvIGluZGV4IGFuZCBzZWxlY3QgaXRlbSBhZnRlciBkYXRhIGxvYWRzXG4gICAgICAgKiBVc2VmdWwgZm9yIHJ1bnRpbWUgc2Nyb2xsK3NlbGVjdCB3aGVuIFZMaXN0IGlzIGFscmVhZHkgY3JlYXRlZFxuICAgICAgICovXG4gICAgICBzY3JvbGxUb0luZGV4QW5kU2VsZWN0OiBhc3luYyBmdW5jdGlvbiAoXG4gICAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICAgIHNlbGVjdElkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgICAgIGFsaWdubWVudDogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIsXG4gICAgICApIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb0luZGV4KGluZGV4LCBhbGlnbm1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTGlzdGVuIGZvciByYW5nZSBsb2FkIHRvIGNvbXBsZXRlLCB0aGVuIHNlbGVjdFxuICAgICAgICBjb25zdCBvblJhbmdlTG9hZGVkID0gKCkgPT4ge1xuICAgICAgICAgIGNvbXBvbmVudC5vZmY/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBvblJhbmdlTG9hZGVkKTtcbiAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5zZWxlY3RCeUlkKSB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudC5zZWxlY3RCeUlkKHNlbGVjdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBvblJhbmdlTG9hZGVkKTtcblxuICAgICAgICAvLyBGYWxsYmFjayB0aW1lb3V0IGluIGNhc2UgZXZlbnQgZG9lc24ndCBmaXJlIChkYXRhIGFscmVhZHkgbG9hZGVkKVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb21wb25lbnQub2ZmPy4oXCJ2aWV3cG9ydDpyYW5nZS1sb2FkZWRcIiwgb25SYW5nZUxvYWRlZCk7XG4gICAgICAgICAgaWYgKGNvbXBvbmVudC5zZWxlY3RCeUlkKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuc2VsZWN0QnlJZChzZWxlY3RJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAzMDApO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0sXG5cbiAgICAgIHNjcm9sbFRvSXRlbTogYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgICBpdGVtSWQ6IHN0cmluZyxcbiAgICAgICAgYWxpZ25tZW50OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiA9IFwic3RhcnRcIixcbiAgICAgICAgYW5pbWF0ZT86IGJvb2xlYW4sXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gaXRlbXMuZmluZEluZGV4KFxuICAgICAgICAgIChpdGVtOiBhbnkpID0+IFN0cmluZyhpdGVtLmlkKSA9PT0gU3RyaW5nKGl0ZW1JZCksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxUb0luZGV4KGluZGV4LCBhbGlnbm1lbnQsIGFuaW1hdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS53YXJuKGBJdGVtICR7aXRlbUlkfSBub3QgZm91bmRgKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfSxcblxuICAgICAgc2Nyb2xsVG9Ub3A6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsVG9JbmRleCgwLCBcInN0YXJ0XCIpO1xuICAgICAgfSxcblxuICAgICAgc2Nyb2xsVG9Cb3R0b206IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9IHRoaXMuZ2V0SXRlbUNvdW50KCk7XG4gICAgICAgIGlmICh0b3RhbEl0ZW1zID4gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNjcm9sbFRvSW5kZXgodG90YWxJdGVtcyAtIDEsIFwiZW5kXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0sXG5cbiAgICAgIHNjcm9sbFRvUGFnZTogYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgICBwYWdlTnVtOiBudW1iZXIsXG4gICAgICAgIGFsaWdubWVudDogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIsXG4gICAgICAgIGFuaW1hdGU/OiBib29sZWFuLFxuICAgICAgKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBbVkxpc3RdIHNjcm9sbFRvUGFnZSgke3BhZ2VOdW19KWApO1xuXG4gICAgICAgIC8vIEdldCBsaW1pdCBmcm9tIGNvbmZpZyAocmFuZ2VTaXplKSBvciBkZWZhdWx0XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gY29uZmlnLnBhZ2luYXRpb24/LmxpbWl0IHx8IDIwO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGN1cnNvciBtb2RlXG4gICAgICAgIGlmIChjb25maWcucGFnaW5hdGlvbj8uc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIpIHtcbiAgICAgICAgICAvLyBJbiBjdXJzb3IgbW9kZSwgd2UgbmVlZCB0byBoYW5kbGUgc2VxdWVudGlhbCBsb2FkaW5nXG4gICAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KT8uY29sbGVjdGlvbjtcbiAgICAgICAgICBpZiAoY29sbGVjdGlvbikge1xuICAgICAgICAgICAgY29uc3QgbG9hZGVkUmFuZ2VzID0gY29sbGVjdGlvbi5nZXRMb2FkZWRSYW5nZXMoKTtcbiAgICAgICAgICAgIGNvbnN0IGhpZ2hlc3RMb2FkZWRQYWdlID0gbG9hZGVkUmFuZ2VzLnNpemU7XG5cbiAgICAgICAgICAgIGlmIChwYWdlTnVtID4gaGlnaGVzdExvYWRlZFBhZ2UgKyAxKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICBgW1ZMaXN0XSBDYW5ub3QganVtcCB0byBwYWdlICR7cGFnZU51bX0gaW4gY3Vyc29yIG1vZGUuIGAgK1xuICAgICAgICAgICAgICAgICAgYExvYWRpbmcgcGFnZXMgc2VxdWVudGlhbGx5IGZyb20gJHtcbiAgICAgICAgICAgICAgICAgICAgaGlnaGVzdExvYWRlZFBhZ2UgKyAxXG4gICAgICAgICAgICAgICAgICB9IHRvICR7cGFnZU51bX1gLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzZSB2aWV3cG9ydCdzIHNjcm9sbFRvUGFnZSBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KT8uc2Nyb2xsVG9QYWdlKSB7XG4gICAgICAgICAgKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnNjcm9sbFRvUGFnZShwYWdlTnVtLCBsaW1pdCwgYWxpZ25tZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBzY3JvbGxUb0luZGV4XG4gICAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSAocGFnZU51bSAtIDEpICogbGltaXQ7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxUb0luZGV4KHRhcmdldEluZGV4LCBhbGlnbm1lbnQpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBnZXRTY3JvbGxQb3NpdGlvbjogKCkgPT4ge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LnZpZXdwb3J0Py5nZXRTY3JvbGxQb3NpdGlvbigpIHx8IDA7XG4gICAgICB9LFxuXG4gICAgICBnZXRDdXJyZW50Q3Vyc29yOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSk/LmNvbGxlY3Rpb247XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uPy5nZXRDdXJyZW50Q3Vyc29yPy4oKSB8fCBudWxsO1xuICAgICAgfSxcblxuICAgICAgc2V0U2Nyb2xsQW5pbWF0aW9uKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgLy8gU3RvcmUgYW5pbWF0aW9uIHByZWZlcmVuY2UgKHdvdWxkIGJlIHVzZWQgYnkgdmlld3BvcnQgc2Nyb2xsaW5nIGZlYXR1cmUpXG4gICAgICAgIGNvbXBvbmVudC5zY3JvbGxBbmltYXRpb24gPSBlbmFibGVkO1xuICAgICAgfSxcblxuICAgICAgLy8gU3RhdGVcbiAgICAgIGdldFN0YXRlKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGl0ZW1zOiB0aGlzLmdldEl0ZW1zKCksXG4gICAgICAgICAgdG90YWxJdGVtczogY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uXG4gICAgICAgICAgICA/IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldFRvdGFsSXRlbXMoKVxuICAgICAgICAgICAgOiBjb21wb25lbnQudG90YWxJdGVtcyB8fCAwLFxuICAgICAgICAgIHZpc2libGVSYW5nZTogY29tcG9uZW50LnZpZXdwb3J0Py5nZXRWaXNpYmxlUmFuZ2UoKSB8fCB7XG4gICAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICAgIGVuZDogMCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uOiBjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMCxcbiAgICAgICAgICBzZWxlY3RlZElkczogdGhpcy5nZXRTZWxlY3RlZElkcygpLFxuICAgICAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmcoKSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIExpZmVjeWNsZVxuICAgICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uZGVzdHJveSkge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImRlc3Ryb3llZFwiKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn07XG4iLAogICAgIi8qKlxuICogbXRybC1hZGRvbnMgTGlzdCBDb21wb25lbnQgQ29uc3RhbnRzXG4gKlxuICogQ29uc3RhbnRzIGZvciB0aGUgYWRkb25zIGxpc3QgY29tcG9uZW50LlxuICogTm90ZTogQmFzZSBtdHJsIGxpc3QgZnVuY3Rpb25hbGl0eSBpcyBoYW5kbGVkIGJ5IG10cmwgY29yZS5cbiAqIFRoZXNlIGNvbnN0YW50cyBhcmUgZm9yIGFkZG9ucy1zcGVjaWZpYyBmZWF0dXJlcyBvbmx5LlxuICovXG5cbi8qKlxuICogQ1NTIGNsYXNzIG5hbWVzIGZvciBWTGlzdCBjb21wb25lbnRcbiAqIEZvbGxvd2luZyBCRU0gY29udmVudGlvbjogY29tcG9uZW50X19lbGVtZW50LS1tb2RpZmllclxuICogTm90ZTogbXRybCBwcmVmaXggaXMgYWRkZWQgYXV0b21hdGljYWxseSBieSBjb3JlIERPTSBjbGFzc2VzIHN5c3RlbVxuICovXG5leHBvcnQgY29uc3QgVkxJU1RfQ0xBU1NFUyA9IHtcbiAgLyoqIExpc3QgZWxlbWVudCAqL1xuICBMSVNUOiBcInZsaXN0XCIsXG4gIC8qKiBMaXN0IGl0ZW0gKi9cbiAgSVRFTTogXCJ2aWV3cG9ydC1pdGVtXCIsXG4gIC8qKiBTZWxlY3RlZCBsaXN0IGl0ZW0gKi9cbiAgU0VMRUNURUQ6IFwidmlld3BvcnQtaXRlbS0tc2VsZWN0ZWRcIixcbiAgLyoqIEVtcHR5IHN0YXRlICovXG4gIEVNUFRZOiBcInZsaXN0LS1lbXB0eVwiLFxuICAvKiogU2Nyb2xsZWQgc3RhdGUgLSBsaXN0IGlzIG5vdCBhdCB0aGUgdG9wICovXG4gIFNDUk9MTEVEOiBcInZsaXN0LS1zY3JvbGxlZFwiLFxufSBhcyBjb25zdDtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvdmxpc3QvZmVhdHVyZXMvc2VsZWN0aW9uLnRzXG5cbmltcG9ydCB0eXBlIHsgVkxpc3RDb25maWcsIFZMaXN0Q29tcG9uZW50LCBWTGlzdEl0ZW0gfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZMSVNUX0NMQVNTRVMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBQUkVGSVgsIGFkZENsYXNzLCByZW1vdmVDbGFzcyB9IGZyb20gXCJtdHJsXCI7XG5cbi8qKlxuICogU2VsZWN0aW9uIHN0YXRlIGludGVyZmFjZVxuICovXG5pbnRlcmZhY2UgU2VsZWN0aW9uU3RhdGUge1xuICBzZWxlY3RlZElkczogU2V0PHN0cmluZyB8IG51bWJlcj47XG4gIG1vZGU6IFwibm9uZVwiIHwgXCJzaW5nbGVcIiB8IFwibXVsdGlwbGVcIjtcbiAgbGFzdFNlbGVjdGVkSW5kZXg/OiBudW1iZXI7XG59XG5cbi8qKlxuICogR2V0IGl0ZW0gSUQgZnJvbSBlbGVtZW50IG9yIGl0ZW0gZGF0YVxuICovXG5jb25zdCBnZXRJdGVtSWQgPSAoaXRlbTogYW55KTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKGl0ZW0/LmlkICE9PSB1bmRlZmluZWQpIHJldHVybiBpdGVtLmlkO1xuICBpZiAoaXRlbT8uX2lkICE9PSB1bmRlZmluZWQpIHJldHVybiBpdGVtLl9pZDtcbiAgaWYgKHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBpdGVtID09PSBcIm51bWJlclwiKSByZXR1cm4gaXRlbTtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogQWRkcyBzZWxlY3Rpb24gbWFuYWdlbWVudCBjYXBhYmlsaXRpZXMgdG8gVkxpc3QgY29tcG9uZW50XG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoU2VsZWN0aW9uID0gPFQgZXh0ZW5kcyBWTGlzdEl0ZW0gPSBWTGlzdEl0ZW0+KFxuICBjb25maWc6IFZMaXN0Q29uZmlnPFQ+LFxuKSA9PiB7XG4gIHJldHVybiAoY29tcG9uZW50OiBWTGlzdENvbXBvbmVudDxUPik6IFZMaXN0Q29tcG9uZW50PFQ+ID0+IHtcbiAgICBpZiAoIWNvbmZpZy5zZWxlY3Rpb24/LmVuYWJsZWQgfHwgY29uZmlnLnNlbGVjdGlvbj8ubW9kZSA9PT0gXCJub25lXCIpIHtcbiAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdGU6IFNlbGVjdGlvblN0YXRlID0ge1xuICAgICAgc2VsZWN0ZWRJZHM6IG5ldyBTZXQoKSxcbiAgICAgIG1vZGU6IGNvbmZpZy5zZWxlY3Rpb24/Lm1vZGUgfHwgXCJzaW5nbGVcIixcbiAgICAgIGxhc3RTZWxlY3RlZEluZGV4OiB1bmRlZmluZWQsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlcXVpcmVNb2RpZmllcnMgPSBjb25maWcuc2VsZWN0aW9uPy5yZXF1aXJlTW9kaWZpZXJzID8/IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQXBwbHkgc2VsZWN0aW9uIGNsYXNzIHRvIHJlbmRlcmVkIGVsZW1lbnRzIG1hdGNoaW5nIHNlbGVjdGVkIElEc1xuICAgICAqL1xuICAgIGNvbnN0IGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cyA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGNvbXBvbmVudC5lbGVtZW50Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBgLiR7UFJFRklYfS12aWV3cG9ydC1pdGVtc2AsXG4gICAgICApO1xuICAgICAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICAgICAgY29uc3QgaXRlbXMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgYC4ke1BSRUZJWH0tdmlld3BvcnQtaXRlbVtkYXRhLWlkXWAsXG4gICAgICApO1xuXG4gICAgICBpdGVtcy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gZWwgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGlkID0gZWxlbWVudC5kYXRhc2V0LmlkO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIENoZWNrIGJvdGggc3RyaW5nIGFuZCBudW1iZXIgdmVyc2lvbnMgb2YgdGhlIElEXG4gICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaWQpIHx8IHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhOdW1iZXIoaWQpKTtcbiAgICAgICAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgVkxJU1RfQ0xBU1NFUy5TRUxFQ1RFRCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIFZMSVNUX0NMQVNTRVMuU0VMRUNURUQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBpdGVtIGNsaWNrIGZvciBzZWxlY3Rpb25cbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVJdGVtQ2xpY2sgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgY29uc3Qgdmlld3BvcnRJdGVtID0gKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFxuICAgICAgICBgLiR7UFJFRklYfS12aWV3cG9ydC1pdGVtW2RhdGEtaW5kZXhdYCxcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBpZiAoIXZpZXdwb3J0SXRlbSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KHZpZXdwb3J0SXRlbS5kYXRhc2V0LmluZGV4IHx8IFwiLTFcIik7XG4gICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGVuaGFuY2VkQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIGFueTtcbiAgICAgIGNvbnN0IGl0ZW1zID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0SXRlbXM/LigpO1xuICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zPy5baW5kZXhdO1xuICAgICAgaWYgKCFpdGVtKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldEl0ZW1JZChpdGVtKTtcbiAgICAgIGlmIChpdGVtSWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB3YXNTZWxlY3RlZCA9IHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhpdGVtSWQpO1xuXG4gICAgICBpZiAoc3RhdGUubW9kZSA9PT0gXCJzaW5nbGVcIikge1xuICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICBpZiAoIXdhc1NlbGVjdGVkKSB7XG4gICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKGl0ZW1JZCk7XG4gICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPSBpbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5tb2RlID09PSBcIm11bHRpcGxlXCIpIHtcbiAgICAgICAgaWYgKGUuc2hpZnRLZXkgJiYgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5taW4oc3RhdGUubGFzdFNlbGVjdGVkSW5kZXgsIGluZGV4KTtcbiAgICAgICAgICBjb25zdCBlbmQgPSBNYXRoLm1heChzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCwgaW5kZXgpO1xuXG4gICAgICAgICAgaWYgKCFlLmN0cmxLZXkgJiYgIWUubWV0YUtleSkge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlSXRlbSA9IGl0ZW1zPy5baV07XG4gICAgICAgICAgICBjb25zdCByYW5nZUl0ZW1JZCA9IGdldEl0ZW1JZChyYW5nZUl0ZW0pO1xuICAgICAgICAgICAgaWYgKHJhbmdlSXRlbUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKHJhbmdlSXRlbUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZS5jdHJsS2V5IHx8IGUubWV0YUtleSkge1xuICAgICAgICAgIGlmICh3YXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuZGVsZXRlKGl0ZW1JZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmFkZChpdGVtSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IGluZGV4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChyZXF1aXJlTW9kaWZpZXJzKSB7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKGl0ZW1JZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh3YXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5kZWxldGUoaXRlbUlkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmFkZChpdGVtSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cygpO1xuICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBFbWl0IHNlbGVjdGlvbiBjaGFuZ2UgZXZlbnRcbiAgICAgKi9cbiAgICBjb25zdCBlbWl0U2VsZWN0aW9uQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgY29uc3QgaXRlbXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRJdGVtcz8uKCkgfHwgW107XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSBpdGVtcy5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IGdldEl0ZW1JZChpdGVtKTtcbiAgICAgICAgcmV0dXJuIGlkICE9PSB1bmRlZmluZWQgJiYgc3RhdGUuc2VsZWN0ZWRJZHMuaGFzKGlkKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSBpdGVtcy5yZWR1Y2UoXG4gICAgICAgIChhY2M6IG51bWJlcltdLCBpdGVtOiBhbnksIGlkeDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWQgPSBnZXRJdGVtSWQoaXRlbSk7XG4gICAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQgJiYgc3RhdGUuc2VsZWN0ZWRJZHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgYWNjLnB1c2goaWR4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSxcbiAgICAgICAgW10gYXMgbnVtYmVyW10sXG4gICAgICApO1xuXG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwic2VsZWN0aW9uOmNoYW5nZVwiLCB7IHNlbGVjdGVkSXRlbXMsIHNlbGVjdGVkSW5kaWNlcyB9KTtcblxuICAgICAgaWYgKGNvbmZpZy5zZWxlY3Rpb24/Lm9uU2VsZWN0aW9uQ2hhbmdlKSB7XG4gICAgICAgIGNvbmZpZy5zZWxlY3Rpb24ub25TZWxlY3Rpb25DaGFuZ2Uoc2VsZWN0ZWRJdGVtcywgc2VsZWN0ZWRJbmRpY2VzKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gU2V0dXA6IGxpc3RlbiBmb3IgcmVuZGVycyBhbmQgY2xpY2tzXG4gICAgY29uc3Qgc2V0dXAgPSAoKSA9PiB7XG4gICAgICAvLyBBZGQgbW9kZSBjbGFzcyB0byBjb250YWluZXJcbiAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICBhZGRDbGFzcyhjb21wb25lbnQuZWxlbWVudCwgXCJ2bGlzdC0tc2VsZWN0aW9uXCIpO1xuICAgICAgICBhZGRDbGFzcyhjb21wb25lbnQuZWxlbWVudCwgYHZsaXN0LS1zZWxlY3Rpb24tJHtzdGF0ZS5tb2RlfWApO1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlSXRlbUNsaWNrLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgc2VsZWN0aW9uIGFmdGVyIGVhY2ggcmVuZGVyXG4gICAgICAoY29tcG9uZW50IGFzIGFueSkub24/LihcbiAgICAgICAgXCJ2aWV3cG9ydDppdGVtcy1yZW5kZXJlZFwiLFxuICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMsXG4gICAgICApO1xuICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLm9uPy4oXCJ2aWV3cG9ydDpyZW5kZXJlZFwiLCBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMpO1xuXG4gICAgICAvLyBDbGVhbiB1cCBzZWxlY3Rpb24gd2hlbiBpdGVtIGlzIHJlbW92ZWRcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5vbj8uKFxuICAgICAgICBcIml0ZW06cmVtb3ZlZFwiLFxuICAgICAgICAoZGF0YTogeyBpdGVtOiBhbnk7IGluZGV4OiBudW1iZXIgfSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldEl0ZW1JZChkYXRhLml0ZW0pO1xuICAgICAgICAgIGlmIChpdGVtSWQgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaXRlbUlkKSkge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuZGVsZXRlKGl0ZW1JZCk7XG4gICAgICAgICAgICAvLyBJZiB0aGUgcmVtb3ZlZCBpdGVtIHdhcyB0aGUgbGFzdCBzZWxlY3RlZCBpbmRleCwgY2xlYXIgaXRcbiAgICAgICAgICAgIGlmIChzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9PT0gZGF0YS5pbmRleCkge1xuICAgICAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPiBkYXRhLmluZGV4XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gQWRqdXN0IGxhc3RTZWxlY3RlZEluZGV4IHNpbmNlIGl0ZW1zIHNoaWZ0ZWQgZG93blxuICAgICAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleC0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgYWZ0ZXIgY29tcG9uZW50IGlzIHJlYWR5XG4gICAgc2V0VGltZW91dChzZXR1cCwgMCk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIGluaXRpYWwgbG9hZCBjb21wbGV0ZSB0byBhdXRvLXNlbGVjdCBpdGVtXG4gICAgLy8gVGhpcyBtdXN0IGJlIGluIHdpdGhTZWxlY3Rpb24gYmVjYXVzZSBzZWxlY3RCeUlkIGlzIGRlZmluZWQgaGVyZVxuICAgIChjb21wb25lbnQgYXMgYW55KS5vbj8uKFxuICAgICAgXCJjb2xsZWN0aW9uOmluaXRpYWwtbG9hZC1jb21wbGV0ZVwiLFxuICAgICAgKGRhdGE6IHsgc2VsZWN0SWQ6IHN0cmluZyB8IG51bWJlciB9KSA9PiB7XG4gICAgICAgIGlmIChkYXRhPy5zZWxlY3RJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gVXNlIHJlcXVlc3RBbmltYXRpb25GcmFtZSB0byBlbnN1cmUgcmVuZGVyaW5nIGlzIGNvbXBsZXRlXG4gICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBcInNpbmdsZVwiKSB7XG4gICAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5hZGQoZGF0YS5zZWxlY3RJZCk7XG4gICAgICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMoKTtcbiAgICAgICAgICAgIGVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gQ2xlYW51cCBvbiBkZXN0cm95XG4gICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmRlc3Ryb3k7XG4gICAgY29tcG9uZW50LmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICBjb21wb25lbnQuZWxlbWVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUl0ZW1DbGljaywgdHJ1ZSk7XG4gICAgICBvcmlnaW5hbERlc3Ryb3k/LigpO1xuICAgIH07XG5cbiAgICAvLyBFbmhhbmNlZCBjb21wb25lbnQgd2l0aCBzZWxlY3Rpb24gQVBJXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgc2VsZWN0SXRlbXMoaW5kaWNlczogbnVtYmVyW10pIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSAodGhpcyBhcyBhbnkpLmdldEl0ZW1zPy4oKTtcbiAgICAgICAgaWYgKCFpdGVtcykgcmV0dXJuO1xuXG4gICAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBcInNpbmdsZVwiKSB7XG4gICAgICAgICAgLy8gSW4gc2luZ2xlIG1vZGUsIGNsZWFyIHByZXZpb3VzIHNlbGVjdGlvbiBiZWZvcmUgYWRkaW5nIG5ldyBvbmVcbiAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICAgIGlmIChpbmRpY2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGluZGljZXMgPSBbaW5kaWNlc1swXV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaW5kaWNlcy5mb3JFYWNoKChpbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldEl0ZW1JZChpdGVtc1tpbmRleF0pO1xuICAgICAgICAgIGlmIChpdGVtSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKGl0ZW1JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaW5kaWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPSBpbmRpY2VzW2luZGljZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIH1cblxuICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMoKTtcbiAgICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgfSxcblxuICAgICAgZGVzZWxlY3RJdGVtcyhpbmRpY2VzOiBudW1iZXJbXSkge1xuICAgICAgICBjb25zdCBpdGVtcyA9ICh0aGlzIGFzIGFueSkuZ2V0SXRlbXM/LigpO1xuICAgICAgICBpZiAoIWl0ZW1zKSByZXR1cm47XG5cbiAgICAgICAgaW5kaWNlcy5mb3JFYWNoKChpbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldEl0ZW1JZChpdGVtc1tpbmRleF0pO1xuICAgICAgICAgIGlmIChpdGVtSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuZGVsZXRlKGl0ZW1JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMoKTtcbiAgICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgfSxcblxuICAgICAgY2xlYXJTZWxlY3Rpb24oKSB7XG4gICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ID0gdW5kZWZpbmVkO1xuICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMoKTtcbiAgICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgfSxcblxuICAgICAgZ2V0U2VsZWN0ZWRJdGVtcygpOiBUW10ge1xuICAgICAgICBjb25zdCBpdGVtcyA9ICh0aGlzIGFzIGFueSkuZ2V0SXRlbXM/LigpIHx8IFtdO1xuICAgICAgICByZXR1cm4gaXRlbXMuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBpZCA9IGdldEl0ZW1JZChpdGVtKTtcbiAgICAgICAgICByZXR1cm4gaWQgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaWQpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIGdldFNlbGVjdGVkSW5kaWNlcygpOiBudW1iZXJbXSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gKHRoaXMgYXMgYW55KS5nZXRJdGVtcz8uKCkgfHwgW107XG4gICAgICAgIHJldHVybiBpdGVtcy5yZWR1Y2UoKGFjYzogbnVtYmVyW10sIGl0ZW06IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkID0gZ2V0SXRlbUlkKGl0ZW0pO1xuICAgICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwgW10gYXMgbnVtYmVyW10pO1xuICAgICAgfSxcblxuICAgICAgaXNTZWxlY3RlZChpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gKHRoaXMgYXMgYW55KS5nZXRJdGVtcz8uKCk7XG4gICAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldEl0ZW1JZChpdGVtcz8uW2luZGV4XSk7XG4gICAgICAgIHJldHVybiBpdGVtSWQgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaXRlbUlkKTtcbiAgICAgIH0sXG5cbiAgICAgIHNlbGVjdEJ5SWQoaWQ6IHN0cmluZyB8IG51bWJlciwgc2lsZW50OiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAoc3RhdGUubW9kZSA9PT0gXCJzaW5nbGVcIikge1xuICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5hZGQoaWQpO1xuICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMoKTtcbiAgICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgICBlbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENoZWNrIGlmIGFuIGl0ZW0gYXQgaW5kZXggaXMgZnVsbHkgdmlzaWJsZSBpbiB0aGUgdmlld3BvcnRcbiAgICAgICAqIFVzZXMgRE9NIGVsZW1lbnQgcG9zaXRpb24gZm9yIHByZWNpc2UgY2hlY2tpbmdcbiAgICAgICAqL1xuICAgICAgaXNJdGVtRnVsbHlWaXNpYmxlKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gY29tcG9uZW50LmVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgYC4ke1BSRUZJWH0tdmlld3BvcnQtaXRlbXNgLFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0ID0gY29tcG9uZW50LmVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgYC4ke1BSRUZJWH0tdmlld3BvcnRgLFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXZpZXdwb3J0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgaXRlbUVsZW1lbnQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBgLiR7UFJFRklYfS12aWV3cG9ydC1pdGVtW2RhdGEtaW5kZXg9XCIke2luZGV4fVwiXWAsXG4gICAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghaXRlbUVsZW1lbnQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCB2aWV3cG9ydFJlY3QgPSB2aWV3cG9ydC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgaXRlbVJlY3QgPSBpdGVtRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBpdGVtIGlzIGZ1bGx5IHdpdGhpbiB2aWV3cG9ydCBib3VuZHNcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBpdGVtUmVjdC50b3AgPj0gdmlld3BvcnRSZWN0LnRvcCAmJlxuICAgICAgICAgIGl0ZW1SZWN0LmJvdHRvbSA8PSB2aWV3cG9ydFJlY3QuYm90dG9tXG4gICAgICAgICk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNlbGVjdCBpdGVtIGF0IGluZGV4LCBzY3JvbGxpbmcgYW5kIHdhaXRpbmcgZm9yIGRhdGEgaWYgbmVlZGVkXG4gICAgICAgKiBIYW5kbGVzIHZpcnR1YWwgc2Nyb2xsaW5nIGJ5IGxvYWRpbmcgZGF0YSBiZWZvcmUgc2VsZWN0aW5nXG4gICAgICAgKiBVc2VzIHByZWNpc2UgRE9NLWJhc2VkIHZpc2liaWxpdHkgY2hlY2tcbiAgICAgICAqL1xuICAgICAgYXN5bmMgc2VsZWN0QXRJbmRleChpbmRleDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGVuaGFuY2VkQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIGFueTtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcblxuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgY3VycmVudCBzZWxlY3Rpb24gdG8gZGV0ZXJtaW5lIG5hdmlnYXRpb24gZGlyZWN0aW9uXG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRpY2VzID0gdGhpcy5nZXRTZWxlY3RlZEluZGljZXMoKTtcbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gY3VycmVudEluZGljZXMubGVuZ3RoID4gMCA/IGN1cnJlbnRJbmRpY2VzWzBdIDogLTE7XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGluZGV4ID4gY3VycmVudEluZGV4ID8gXCJkb3duXCIgOiBcInVwXCI7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgaXRlbSBpcyBmdWxseSB2aXNpYmxlIHVzaW5nIHByZWNpc2UgRE9NIGNoZWNrXG4gICAgICAgIGNvbnN0IGlzRnVsbHlWaXNpYmxlID0gdGhpcy5pc0l0ZW1GdWxseVZpc2libGUoaW5kZXgpO1xuXG4gICAgICAgIGlmICghaXNGdWxseVZpc2libGUgJiYgZW5oYW5jZWRDb21wb25lbnQudmlld3BvcnQ/LnNjcm9sbFRvSW5kZXgpIHtcbiAgICAgICAgICAvLyBTY3JvbGwgd2l0aCBhbGlnbm1lbnQgYmFzZWQgb24gbmF2aWdhdGlvbiBkaXJlY3Rpb25cbiAgICAgICAgICAvLyBEb3duIG5hdmlnYXRpb246IGFsaWduIHRvIGVuZCAoaXRlbSBhdCBib3R0b20pXG4gICAgICAgICAgLy8gVXAgbmF2aWdhdGlvbjogYWxpZ24gdG8gc3RhcnQgKGl0ZW0gYXQgdG9wKVxuICAgICAgICAgIGNvbnN0IGFsaWdubWVudCA9IGRpcmVjdGlvbiA9PT0gXCJkb3duXCIgPyBcImVuZFwiIDogXCJzdGFydFwiO1xuICAgICAgICAgIGVuaGFuY2VkQ29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbFRvSW5kZXgoaW5kZXgsIGFsaWdubWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcnkgdG8gc2VsZWN0IGltbWVkaWF0ZWx5IC0gd29ya3MgaWYgaXRlbSBpcyBhbHJlYWR5IGxvYWRlZFxuICAgICAgICBjb25zdCBpdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1zPy4oKSB8fCBbXTtcbiAgICAgICAgaWYgKGl0ZW1zW2luZGV4XSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbXMoW2luZGV4XSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJdGVtIG5vdCBsb2FkZWQgeWV0IC0gd2FpdCBmb3IgZGF0YSB0byBsb2FkIHRoZW4gc2VsZWN0XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIGxldCByZXNvbHZlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgY29uc3Qgb25SYW5nZUxvYWRlZCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuO1xuICAgICAgICAgICAgcmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgICAgY29tcG9uZW50Lm9mZj8uKFwidmlld3BvcnQ6cmFuZ2UtbG9hZGVkXCIsIG9uUmFuZ2VMb2FkZWQpO1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtcyhbaW5kZXhdKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBvblJhbmdlTG9hZGVkKTtcblxuICAgICAgICAgIC8vIEZhbGxiYWNrIHRpbWVvdXQgaW4gY2FzZSBldmVudCBkb2Vzbid0IGZpcmUgKGRhdGEgYWxyZWFkeSBsb2FkZWQpXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybjtcbiAgICAgICAgICAgIHJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5vZmY/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBvblJhbmdlTG9hZGVkKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbXMoW2luZGV4XSk7XG4gICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZWxlY3QgbmV4dCBpdGVtIHJlbGF0aXZlIHRvIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAgICAgKiBIYW5kbGVzIHZpcnR1YWwgc2Nyb2xsaW5nIGJ5IGxvYWRpbmcgZGF0YSBiZWZvcmUgc2VsZWN0aW5nXG4gICAgICAgKiBSZXNwZWN0cyBrZXlib2FyZC53cmFwIG9wdGlvbiBmb3Igd3JhcHBpbmcgYXQgbGlzdCBib3VuZGFyaWVzXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIHNlbGVjdE5leHQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGVuaGFuY2VkQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIGFueTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJbmRpY2VzID0gdGhpcy5nZXRTZWxlY3RlZEluZGljZXMoKTtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcbiAgICAgICAgY29uc3Qgd3JhcCA9IGNvbmZpZy5rZXlib2FyZD8ud3JhcCA/PyB0cnVlOyAvLyBNRDMgZGVmYXVsdCBpcyB0cnVlXG5cbiAgICAgICAgaWYgKHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAvLyBTZWxlY3QgZmlyc3QgaXRlbVxuICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEF0SW5kZXgoMCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBzZWxlY3RlZEluZGljZXNbMF07XG4gICAgICAgIGNvbnN0IG5leHRJbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG5cbiAgICAgICAgaWYgKG5leHRJbmRleCA8IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBdEluZGV4KG5leHRJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBdCB0aGUgZW5kIC0gd3JhcCB0byBiZWdpbm5pbmcgaWYgZW5hYmxlZFxuICAgICAgICBpZiAod3JhcCAmJiB0b3RhbEl0ZW1zID4gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEF0SW5kZXgoMCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNlbGVjdCBwcmV2aW91cyBpdGVtIHJlbGF0aXZlIHRvIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAgICAgKiBIYW5kbGVzIHZpcnR1YWwgc2Nyb2xsaW5nIGJ5IGxvYWRpbmcgZGF0YSBiZWZvcmUgc2VsZWN0aW5nXG4gICAgICAgKiBSZXNwZWN0cyBrZXlib2FyZC53cmFwIG9wdGlvbiBmb3Igd3JhcHBpbmcgYXQgbGlzdCBib3VuZGFyaWVzXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIHNlbGVjdFByZXZpb3VzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBlbmhhbmNlZENvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBhbnk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSW5kaWNlcyA9IHRoaXMuZ2V0U2VsZWN0ZWRJbmRpY2VzKCk7XG4gICAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRJdGVtQ291bnQ/LigpIHx8IDA7XG4gICAgICAgIGNvbnN0IHdyYXAgPSBjb25maWcua2V5Ym9hcmQ/LndyYXAgPz8gdHJ1ZTsgLy8gTUQzIGRlZmF1bHQgaXMgdHJ1ZVxuXG4gICAgICAgIGlmIChzZWxlY3RlZEluZGljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgLy8gSWYgd3JhcCBlbmFibGVkLCBzZWxlY3QgbGFzdCBpdGVtOyBvdGhlcndpc2UgZG8gbm90aGluZ1xuICAgICAgICAgIGlmICh3cmFwICYmIHRvdGFsSXRlbXMgPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBdEluZGV4KHRvdGFsSXRlbXMgLSAxKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzWzBdO1xuICAgICAgICBjb25zdCBwcmV2SW5kZXggPSBjdXJyZW50SW5kZXggLSAxO1xuXG4gICAgICAgIGlmIChwcmV2SW5kZXggPj0gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEF0SW5kZXgocHJldkluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEF0IHRoZSBzdGFydCAtIHdyYXAgdG8gZW5kIGlmIGVuYWJsZWRcbiAgICAgICAgaWYgKHdyYXAgJiYgdG90YWxJdGVtcyA+IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBdEluZGV4KHRvdGFsSXRlbXMgLSAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhTZWxlY3Rpb247XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL2tleWJvYXJkLnRzXG5cbi8qKlxuICogS2V5Ym9hcmQgTmF2aWdhdGlvbiBGZWF0dXJlIGZvciBWTGlzdFxuICpcbiAqIEltcGxlbWVudHMgTWF0ZXJpYWwgRGVzaWduIDMgYWNjZXNzaWJpbGl0eSBndWlkZWxpbmVzIGZvciBsaXN0czpcbiAqIC0gQXJyb3cga2V5cyAoVXAvRG93bi9MZWZ0L1JpZ2h0KSBuYXZpZ2F0ZSBiZXR3ZWVuIGl0ZW1zIHdpdGggd3JhcHBpbmdcbiAqIC0gU3BhY2UvRW50ZXIgYWN0aXZhdGVzL3NlbGVjdHMgdGhlIGZvY3VzZWQgaXRlbVxuICogLSBUYWIgbW92ZXMgZm9jdXMgdG8vZnJvbSB0aGUgbGlzdFxuICogLSBIb21lL0VuZCBqdW1wIHRvIGZpcnN0L2xhc3QgaXRlbVxuICogLSBQYWdlIFVwL0Rvd24gc2tpcCBtdWx0aXBsZSBpdGVtc1xuICpcbiAqIEBzZWUgaHR0cHM6Ly9tMy5tYXRlcmlhbC5pby9jb21wb25lbnRzL2xpc3RzL2FjY2Vzc2liaWxpdHlcbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIFZMaXN0Q29uZmlnLFxuICBWTGlzdENvbXBvbmVudCxcbiAgVkxpc3RJdGVtLFxuICBMaXN0S2V5Ym9hcmRDb25maWcsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUFJFRklYLCBhZGRDbGFzcywgcmVtb3ZlQ2xhc3MgfSBmcm9tIFwibXRybFwiO1xuXG4vKipcbiAqIENsYXNzIG5hbWUgZm9yIGtleWJvYXJkIGZvY3VzIHN0eWxpbmdcbiAqL1xuY29uc3QgS0VZQk9BUkRfRk9DVVNfQ0xBU1MgPSBcIm10cmwtdmxpc3QtLWtleWJvYXJkLWZvY3VzXCI7XG5cbi8qKlxuICogQVJJQSByb2xlcyBhbmQgYXR0cmlidXRlcyBmb3IgYWNjZXNzaWJpbGl0eVxuICogRm9sbG93aW5nIE1EMyBXZWIgaW1wbGVtZW50YXRpb246XG4gKiAtIENvbnRhaW5lciByb2xlOiBsaXN0Ym94XG4gKiAtIExpc3QgaXRlbSByb2xlOiBvcHRpb25cbiAqIC0gU3RhdGU6IGFyaWEtc2VsZWN0ZWRcbiAqL1xuY29uc3QgQVJJQSA9IHtcbiAgUk9MRV9MSVNUQk9YOiBcImxpc3Rib3hcIixcbiAgUk9MRV9PUFRJT046IFwib3B0aW9uXCIsXG4gIEFSSUFfQUNUSVZFREVTQ0VOREFOVDogXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIixcbiAgQVJJQV9TRUxFQ1RFRDogXCJhcmlhLXNlbGVjdGVkXCIsXG4gIEFSSUFfTEFCRUw6IFwiYXJpYS1sYWJlbFwiLFxuICBBUklBX01VTFRJU0VMRUNUQUJMRTogXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLFxufTtcblxuLyoqXG4gKiBHZXQgdGhlIHZpZXdwb3J0IGl0ZW1zIGNvbnRhaW5lclxuICovXG5jb25zdCBnZXRJdGVtc0NvbnRhaW5lciA9IChcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsXG4pOiBIVE1MRWxlbWVudCB8IG51bGwgPT4ge1xuICByZXR1cm4gZWxlbWVudD8ucXVlcnlTZWxlY3RvcihgLiR7UFJFRklYfS12aWV3cG9ydC1pdGVtc2ApIHx8IG51bGw7XG59O1xuXG4vKipcbiAqIEdldCBhbGwgcmVuZGVyZWQgaXRlbSBlbGVtZW50c1xuICovXG5jb25zdCBnZXRSZW5kZXJlZEl0ZW1zID0gKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsKTogSFRNTEVsZW1lbnRbXSA9PiB7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm4gW107XG4gIHJldHVybiBBcnJheS5mcm9tKFxuICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKGAuJHtQUkVGSVh9LXZpZXdwb3J0LWl0ZW1bZGF0YS1pbmRleF1gKSxcbiAgKTtcbn07XG5cbi8qKlxuICogQWRkcyBrZXlib2FyZCBuYXZpZ2F0aW9uIGFuZCBhY2Nlc3NpYmlsaXR5IHRvIFZMaXN0IGNvbXBvbmVudFxuICovXG5leHBvcnQgY29uc3Qgd2l0aEtleWJvYXJkID0gPFQgZXh0ZW5kcyBWTGlzdEl0ZW0gPSBWTGlzdEl0ZW0+KFxuICBjb25maWc6IFZMaXN0Q29uZmlnPFQ+LFxuKSA9PiB7XG4gIHJldHVybiAoY29tcG9uZW50OiBWTGlzdENvbXBvbmVudDxUPik6IFZMaXN0Q29tcG9uZW50PFQ+ID0+IHtcbiAgICAvLyBPbmx5IGVuYWJsZSBrZXlib2FyZCBpZiBzZWxlY3Rpb24gaXMgZW5hYmxlZFxuICAgIGNvbnN0IHNlbGVjdGlvbkVuYWJsZWQgPVxuICAgICAgY29uZmlnLnNlbGVjdGlvbj8uZW5hYmxlZCAmJiBjb25maWcuc2VsZWN0aW9uPy5tb2RlICE9PSBcIm5vbmVcIjtcbiAgICBjb25zdCBrZXlib2FyZENvbmZpZyA9IGNvbmZpZy5rZXlib2FyZCB8fCB7fTtcbiAgICBjb25zdCBlbmFibGVkID0ga2V5Ym9hcmRDb25maWcuZW5hYmxlZCA/PyBzZWxlY3Rpb25FbmFibGVkO1xuXG4gICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIE1EMyBzcGVjaWZpZXMgdGhhdCBhcnJvdyBrZXlzIHNob3VsZCB3cmFwIGJ5IGRlZmF1bHRcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgaG9tZUVuZDoga2V5Ym9hcmRDb25maWcuaG9tZUVuZCA/PyB0cnVlLFxuICAgICAgcGFnZVVwRG93bjoga2V5Ym9hcmRDb25maWcucGFnZVVwRG93biA/PyB0cnVlLFxuICAgICAgcGFnZVNpemU6IGtleWJvYXJkQ29uZmlnLnBhZ2VTaXplID8/IDEwLFxuICAgICAgdHlwZUFoZWFkOiBrZXlib2FyZENvbmZpZy50eXBlQWhlYWQgPz8gZmFsc2UsXG4gICAgICB0eXBlQWhlYWRUaW1lb3V0OiBrZXlib2FyZENvbmZpZy50eXBlQWhlYWRUaW1lb3V0ID8/IDUwMCxcbiAgICAgIHdyYXA6IGtleWJvYXJkQ29uZmlnLndyYXAgPz8gdHJ1ZSwgLy8gTUQzOiB3cmFwcyB0byB0b3AvYm90dG9tXG4gICAgICBvbk5hdmlnYXRlOiBrZXlib2FyZENvbmZpZy5vbk5hdmlnYXRlLFxuICAgIH07XG5cbiAgICAvLyBUeXBlLWFoZWFkIHN0YXRlXG4gICAgbGV0IHR5cGVBaGVhZEJ1ZmZlciA9IFwiXCI7XG4gICAgbGV0IHR5cGVBaGVhZFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gVHJhY2sgaWYgbGFzdCBpbnRlcmFjdGlvbiB3YXMgbW91c2UgKGZvciBmb2N1cyBzdHlsaW5nKVxuICAgIGxldCBsYXN0TW91c2VEb3duVGltZSA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBTZXR1cCBBUklBIGF0dHJpYnV0ZXMgZm9yIGFjY2Vzc2liaWxpdHlcbiAgICAgKi9cbiAgICBjb25zdCBzZXR1cEFjY2Vzc2liaWxpdHkgPSAoKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gY29tcG9uZW50LmVsZW1lbnQ7XG4gICAgICBpZiAoIWVsZW1lbnQpIHJldHVybjtcblxuICAgICAgLy8gU2V0IGxpc3Rib3ggcm9sZSBvbiB0aGUgY29tcG9uZW50XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcInJvbGVcIiwgQVJJQS5ST0xFX0xJU1RCT1gpO1xuXG4gICAgICAvLyBTZXQgbXVsdGlzZWxlY3RhYmxlIGlmIGluIG11bHRpcGxlIHNlbGVjdGlvbiBtb2RlXG4gICAgICBpZiAoY29uZmlnLnNlbGVjdGlvbj8ubW9kZSA9PT0gXCJtdWx0aXBsZVwiKSB7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKEFSSUEuQVJJQV9NVUxUSVNFTEVDVEFCTEUsIFwidHJ1ZVwiKTtcbiAgICAgIH1cblxuICAgICAgLy8gTWFrZSBmb2N1c2FibGVcbiAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiMFwiKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IGFyaWEtbGFiZWwgaWYgbm90IHByZXNlbnRcbiAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoQVJJQS5BUklBX0xBQkVMKSkge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShBUklBLkFSSUFfTEFCRUwsIFwiTGlzdFwiKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIEFSSUEgYXR0cmlidXRlcyBvbiByZW5kZXJlZCBpdGVtc1xuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZUl0ZW1BY2Nlc3NpYmlsaXR5ID0gKCkgPT4ge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZ2V0SXRlbXNDb250YWluZXIoY29tcG9uZW50LmVsZW1lbnQpO1xuICAgICAgY29uc3QgaXRlbXMgPSBnZXRSZW5kZXJlZEl0ZW1zKGNvbnRhaW5lcik7XG4gICAgICBjb25zdCBlbmhhbmNlZENvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBhbnk7XG4gICAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRTZWxlY3RlZEluZGljZXM/LigpIHx8IFtdO1xuXG4gICAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoaXRlbS5kYXRhc2V0LmluZGV4IHx8IFwiLTFcIiwgMTApO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm47XG5cbiAgICAgICAgLy8gU2V0IG9wdGlvbiByb2xlXG4gICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKFwicm9sZVwiLCBBUklBLlJPTEVfT1BUSU9OKTtcblxuICAgICAgICAvLyBTZXQgdW5pcXVlIElEIGZvciBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcbiAgICAgICAgY29uc3QgaXRlbUlkID0gYCR7UFJFRklYfS12bGlzdC1pdGVtLSR7aW5kZXh9YDtcbiAgICAgICAgaXRlbS5pZCA9IGl0ZW1JZDtcblxuICAgICAgICAvLyBTZXQgc2VsZWN0ZWQgc3RhdGVcbiAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHNlbGVjdGVkSW5kaWNlcy5pbmNsdWRlcyhpbmRleCk7XG4gICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKEFSSUEuQVJJQV9TRUxFQ1RFRCwgU3RyaW5nKGlzU2VsZWN0ZWQpKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBVcGRhdGUgYXJpYS1hY3RpdmVkZXNjZW5kYW50IG9uIGNvbnRhaW5lclxuICAgICAgaWYgKHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPiAwICYmIGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZUlkID0gYCR7UFJFRklYfS12bGlzdC1pdGVtLSR7c2VsZWN0ZWRJbmRpY2VzWzBdfWA7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnNldEF0dHJpYnV0ZShBUklBLkFSSUFfQUNUSVZFREVTQ0VOREFOVCwgYWN0aXZlSWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQ/LnJlbW92ZUF0dHJpYnV0ZShBUklBLkFSSUFfQUNUSVZFREVTQ0VOREFOVCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0eXBlLWFoZWFkIHNlYXJjaFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVR5cGVBaGVhZCA9IChjaGFyOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghb3B0aW9ucy50eXBlQWhlYWQpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gQ2xlYXIgcHJldmlvdXMgdGltZXJcbiAgICAgIGlmICh0eXBlQWhlYWRUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQodHlwZUFoZWFkVGltZXIpO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgY2hhcmFjdGVyIHRvIGJ1ZmZlclxuICAgICAgdHlwZUFoZWFkQnVmZmVyICs9IGNoYXIudG9Mb3dlckNhc2UoKTtcblxuICAgICAgLy8gU2V0IHRpbWVyIHRvIGNsZWFyIGJ1ZmZlclxuICAgICAgdHlwZUFoZWFkVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdHlwZUFoZWFkQnVmZmVyID0gXCJcIjtcbiAgICAgIH0sIG9wdGlvbnMudHlwZUFoZWFkVGltZW91dCk7XG5cbiAgICAgIC8vIFNlYXJjaCBmb3IgbWF0Y2hpbmcgaXRlbVxuICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgY29uc3QgaXRlbXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRJdGVtcz8uKCkgfHwgW107XG4gICAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRTZWxlY3RlZEluZGljZXM/LigpIHx8IFtdO1xuICAgICAgY29uc3Qgc3RhcnRJbmRleCA9XG4gICAgICAgIHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPiAwID8gc2VsZWN0ZWRJbmRpY2VzWzBdICsgMSA6IDA7XG5cbiAgICAgIC8vIFNlYXJjaCBmcm9tIGN1cnJlbnQgcG9zaXRpb24gdG8gZW5kLCB0aGVuIHdyYXAgdG8gYmVnaW5uaW5nXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gKHN0YXJ0SW5kZXggKyBpKSAlIGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zW2luZGV4XTtcbiAgICAgICAgaWYgKCFpdGVtKSBjb250aW51ZTtcblxuICAgICAgICAvLyBHZXQgc2VhcmNoYWJsZSB0ZXh0IGZyb20gaXRlbVxuICAgICAgICBjb25zdCB0ZXh0ID0gZ2V0SXRlbVRleHQoaXRlbSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHRleHQuc3RhcnRzV2l0aCh0eXBlQWhlYWRCdWZmZXIpKSB7XG4gICAgICAgICAgZW5oYW5jZWRDb21wb25lbnQuc2VsZWN0QXRJbmRleD8uKGluZGV4KTtcbiAgICAgICAgICBvcHRpb25zLm9uTmF2aWdhdGU/LihpbmRleCwgXCJ0eXBlYWhlYWRcIik7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc2VhcmNoYWJsZSB0ZXh0IGZyb20gYW4gaXRlbVxuICAgICAqL1xuICAgIGNvbnN0IGdldEl0ZW1UZXh0ID0gKGl0ZW06IGFueSk6IHN0cmluZyA9PiB7XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIpIHJldHVybiBpdGVtO1xuICAgICAgcmV0dXJuIGl0ZW0udGl0bGUgfHwgaXRlbS5uYW1lIHx8IGl0ZW0ubGFiZWwgfHwgaXRlbS50ZXh0IHx8IFwiXCI7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBrZXlib2FyZCBldmVudHNcbiAgICAgKlxuICAgICAqIE1EMyBLZXlib2FyZCBOYXZpZ2F0aW9uOlxuICAgICAqIC0gVGFiOiBNb3ZlIGZvY3VzIHRvIGZpcnN0L2xhc3QgbGlzdCBpdGVtIG9yIG91dHNpZGVcbiAgICAgKiAtIERvd24vUmlnaHQ6IE1vdmUgdG8gbmV4dCBlbGVtZW50OyB3cmFwcyB0byB0b3AgaWYgYXQgZW5kXG4gICAgICogLSBVcC9MZWZ0OiBNb3ZlIHRvIHByZXZpb3VzIGVsZW1lbnQ7IHdyYXBzIHRvIGJvdHRvbSBpZiBhdCBzdGFydFxuICAgICAqIC0gU3BhY2UvRW50ZXI6IFNlbGVjdCBhIGxpc3QgaXRlbVxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUtleURvd24gPSBhc3luYyAoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcblxuICAgICAgaWYgKHRvdGFsSXRlbXMgPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3Qgc2VsZWN0ZWRJbmRpY2VzID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0U2VsZWN0ZWRJbmRpY2VzPy4oKSB8fCBbXTtcbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPiAwID8gc2VsZWN0ZWRJbmRpY2VzWzBdIDogLTE7XG5cbiAgICAgIGxldCB0YXJnZXRJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgICBsZXQgaGFuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAvLyBIZWxwZXIgdG8gbWFyayBldmVudCBhcyBoYW5kbGVkIGFuZCBzdG9wIHByb3BhZ2F0aW9uXG4gICAgICBjb25zdCBtYXJrSGFuZGxlZCA9ICgpID0+IHtcbiAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgIH07XG5cbiAgICAgIHN3aXRjaCAoZS5rZXkpIHtcbiAgICAgICAgLy8gTUQzOiBEb3duL1JpZ2h0IG1vdmUgdG8gbmV4dCBlbGVtZW50XG4gICAgICAgIGNhc2UgXCJBcnJvd0Rvd25cIjpcbiAgICAgICAgY2FzZSBcIkFycm93UmlnaHRcIjpcbiAgICAgICAgICBtYXJrSGFuZGxlZCgpO1xuICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPCAwKSB7XG4gICAgICAgICAgICB0YXJnZXRJbmRleCA9IDA7XG4gICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50SW5kZXggPCB0b3RhbEl0ZW1zIC0gMSkge1xuICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBjdXJyZW50SW5kZXggKyAxO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy53cmFwKSB7XG4gICAgICAgICAgICAvLyBNRDM6IHdyYXBzIHRvIHRvcCBpZiBhdCBlbmRcbiAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgLy8gTUQzOiBVcC9MZWZ0IG1vdmUgdG8gcHJldmlvdXMgZWxlbWVudFxuICAgICAgICBjYXNlIFwiQXJyb3dVcFwiOlxuICAgICAgICBjYXNlIFwiQXJyb3dMZWZ0XCI6XG4gICAgICAgICAgbWFya0hhbmRsZWQoKTtcbiAgICAgICAgICBpZiAoY3VycmVudEluZGV4IDwgMCkge1xuICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSB0b3RhbEl0ZW1zIC0gMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRJbmRleCA+IDApIHtcbiAgICAgICAgICAgIHRhcmdldEluZGV4ID0gY3VycmVudEluZGV4IC0gMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMud3JhcCkge1xuICAgICAgICAgICAgLy8gTUQzOiB3cmFwcyB0byBib3R0b20gaWYgYXQgc3RhcnRcbiAgICAgICAgICAgIHRhcmdldEluZGV4ID0gdG90YWxJdGVtcyAtIDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJIb21lXCI6XG4gICAgICAgICAgaWYgKG9wdGlvbnMuaG9tZUVuZCkge1xuICAgICAgICAgICAgbWFya0hhbmRsZWQoKTtcbiAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcIkVuZFwiOlxuICAgICAgICAgIGlmIChvcHRpb25zLmhvbWVFbmQpIHtcbiAgICAgICAgICAgIG1hcmtIYW5kbGVkKCk7XG4gICAgICAgICAgICB0YXJnZXRJbmRleCA9IHRvdGFsSXRlbXMgLSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiUGFnZURvd25cIjpcbiAgICAgICAgICBpZiAob3B0aW9ucy5wYWdlVXBEb3duKSB7XG4gICAgICAgICAgICBtYXJrSGFuZGxlZCgpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBNYXRoLm1pbihvcHRpb25zLnBhZ2VTaXplIC0gMSwgdG90YWxJdGVtcyAtIDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBNYXRoLm1pbihcbiAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggKyBvcHRpb25zLnBhZ2VTaXplLFxuICAgICAgICAgICAgICAgIHRvdGFsSXRlbXMgLSAxLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiUGFnZVVwXCI6XG4gICAgICAgICAgaWYgKG9wdGlvbnMucGFnZVVwRG93bikge1xuICAgICAgICAgICAgbWFya0hhbmRsZWQoKTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPCAwKSB7XG4gICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gTWF0aC5tYXgoY3VycmVudEluZGV4IC0gb3B0aW9ucy5wYWdlU2l6ZSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIC8vIE1EMzogU3BhY2UvRW50ZXIgc2VsZWN0IGEgbGlzdCBpdGVtXG4gICAgICAgIGNhc2UgXCIgXCI6XG4gICAgICAgIGNhc2UgXCJFbnRlclwiOlxuICAgICAgICAgIG1hcmtIYW5kbGVkKCk7XG4gICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBpZiAoY29uZmlnLnNlbGVjdGlvbj8ubW9kZSA9PT0gXCJtdWx0aXBsZVwiKSB7XG4gICAgICAgICAgICAgIC8vIEluIG11bHRpcGxlIG1vZGUsIHRvZ2dsZSBzZWxlY3Rpb25cbiAgICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IGVuaGFuY2VkQ29tcG9uZW50LmlzU2VsZWN0ZWQ/LihjdXJyZW50SW5kZXgpO1xuICAgICAgICAgICAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIGVuaGFuY2VkQ29tcG9uZW50LmRlc2VsZWN0SXRlbXM/LihbY3VycmVudEluZGV4XSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZW5oYW5jZWRDb21wb25lbnQuc2VsZWN0SXRlbXM/LihbY3VycmVudEluZGV4XSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIEluIHNpbmdsZSBtb2RlLCBlbnN1cmUgaXRlbSBpcyBzZWxlY3RlZCBhbmQgZW1pdCBhY3RpdmF0aW9uIGV2ZW50XG4gICAgICAgICAgICAgIGVuaGFuY2VkQ29tcG9uZW50LnNlbGVjdEl0ZW1zPy4oW2N1cnJlbnRJbmRleF0pO1xuICAgICAgICAgICAgICAvLyBFbWl0IGFjdGl2YXRlIGV2ZW50IGZvciBzaW5nbGUtYWN0aW9uIGxpc3RzXG4gICAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtOmFjdGl2YXRlXCIsIHtcbiAgICAgICAgICAgICAgICBpbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICAgICAgICAgIGl0ZW06IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1zPy4oKT8uW2N1cnJlbnRJbmRleF0sXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiYVwiOlxuICAgICAgICBjYXNlIFwiQVwiOlxuICAgICAgICAgIC8vIEN0cmwrQSAvIENtZCtBIC0gc2VsZWN0IGFsbCBpbiBtdWx0aXBsZSBtb2RlXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgKGUuY3RybEtleSB8fCBlLm1ldGFLZXkpICYmXG4gICAgICAgICAgICBjb25maWcuc2VsZWN0aW9uPy5tb2RlID09PSBcIm11bHRpcGxlXCJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG1hcmtIYW5kbGVkKCk7XG4gICAgICAgICAgICBjb25zdCBhbGxJbmRpY2VzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdG90YWxJdGVtcyB9LCAoXywgaSkgPT4gaSk7XG4gICAgICAgICAgICBlbmhhbmNlZENvbXBvbmVudC5zZWxlY3RJdGVtcz8uKGFsbEluZGljZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiRXNjYXBlXCI6XG4gICAgICAgICAgLy8gQ2xlYXIgc2VsZWN0aW9uXG4gICAgICAgICAgbWFya0hhbmRsZWQoKTtcbiAgICAgICAgICBlbmhhbmNlZENvbXBvbmVudC5jbGVhclNlbGVjdGlvbj8uKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBUeXBlLWFoZWFkIGZvciBwcmludGFibGUgY2hhcmFjdGVyc1xuICAgICAgICAgIGlmIChlLmtleS5sZW5ndGggPT09IDEgJiYgIWUuY3RybEtleSAmJiAhZS5tZXRhS2V5ICYmICFlLmFsdEtleSkge1xuICAgICAgICAgICAgaGFuZGxlZCA9IGhhbmRsZVR5cGVBaGVhZChlLmtleSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBOYXZpZ2F0ZSB0byB0YXJnZXQgaW5kZXhcbiAgICAgIGlmICh0YXJnZXRJbmRleCAhPT0gbnVsbCAmJiB0YXJnZXRJbmRleCAhPT0gY3VycmVudEluZGV4KSB7XG4gICAgICAgIC8vIEhhbmRsZSBzaGlmdCthcnJvdyBmb3IgcmFuZ2Ugc2VsZWN0aW9uIGluIG11bHRpcGxlIG1vZGVcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGUuc2hpZnRLZXkgJiZcbiAgICAgICAgICBjb25maWcuc2VsZWN0aW9uPy5tb2RlID09PSBcIm11bHRpcGxlXCIgJiZcbiAgICAgICAgICBjdXJyZW50SW5kZXggPj0gMFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBzdGFydCA9IE1hdGgubWluKGN1cnJlbnRJbmRleCwgdGFyZ2V0SW5kZXgpO1xuICAgICAgICAgIGNvbnN0IGVuZCA9IE1hdGgubWF4KGN1cnJlbnRJbmRleCwgdGFyZ2V0SW5kZXgpO1xuICAgICAgICAgIGNvbnN0IHJhbmdlSW5kaWNlcyA9IEFycmF5LmZyb20oXG4gICAgICAgICAgICB7IGxlbmd0aDogZW5kIC0gc3RhcnQgKyAxIH0sXG4gICAgICAgICAgICAoXywgaSkgPT4gc3RhcnQgKyBpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZW5oYW5jZWRDb21wb25lbnQuc2VsZWN0SXRlbXM/LihyYW5nZUluZGljZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEF3YWl0IHNlbGVjdEF0SW5kZXggZm9yIHByb3BlciBzY3JvbGxpbmcgYW5kIGRhdGEgbG9hZGluZ1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGZvciBIb21lL0VuZC9QYWdlVXAvUGFnZURvd24gd2hpY2ggbWF5IGp1bXAgdG8gdW5sb2FkZWQgaXRlbXNcbiAgICAgICAgICBhd2FpdCBlbmhhbmNlZENvbXBvbmVudC5zZWxlY3RBdEluZGV4Py4odGFyZ2V0SW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnMub25OYXZpZ2F0ZT8uKHRhcmdldEluZGV4LCBlLmtleSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQga2V5Ym9hcmQgZXZlbnQgZm9yIGV4dGVybmFsIGhhbmRsaW5nXG4gICAgICBpZiAoaGFuZGxlZCkge1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwia2V5Ym9hcmQ6bmF2aWdhdGVcIiwge1xuICAgICAgICAgIGtleTogZS5rZXksXG4gICAgICAgICAgaW5kZXg6IHRhcmdldEluZGV4ID8/IGN1cnJlbnRJbmRleCxcbiAgICAgICAgICBzaGlmdEtleTogZS5zaGlmdEtleSxcbiAgICAgICAgICBjdHJsS2V5OiBlLmN0cmxLZXksXG4gICAgICAgICAgbWV0YUtleTogZS5tZXRhS2V5LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGZvY3VzIGV2ZW50XG4gICAgICpcbiAgICAgKiBNRDMgRm9jdXMgQmVoYXZpb3IgZm9yIFNpbmdsZS1BY3Rpb24gTGlzdHM6XG4gICAgICogLSBUaGUgZmlyc3QgZWxlbWVudCBpbiBhIGxpc3Qgc2hvdWxkIHJlY2VpdmUgZm9jdXMgYnkgZGVmYXVsdFxuICAgICAqIC0gSWYgdGhlIGxpc3QgaGFzIGEgc2VsZWN0ZWQgZWxlbWVudCwgZm9jdXMgZ29lcyB0byB0aGUgc2VsZWN0ZWQgaXRlbSBpbnN0ZWFkXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlRm9jdXMgPSAoKSA9PiB7XG4gICAgICBjb25zdCBlbmhhbmNlZENvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBhbnk7XG4gICAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRTZWxlY3RlZEluZGljZXM/LigpIHx8IFtdO1xuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcblxuICAgICAgLy8gQWRkIGtleWJvYXJkIGZvY3VzIGNsYXNzIG9ubHkgaWYgZm9jdXMgd2FzIE5PVCBmcm9tIGEgcmVjZW50IG1vdXNlIGNsaWNrXG4gICAgICAvLyAxMDBtcyB0aHJlc2hvbGQgYWNjb3VudHMgZm9yIHRoZSBkZWxheSBiZXR3ZWVuIG1vdXNlZG93biBhbmQgZm9jdXNcbiAgICAgIGNvbnN0IHdhc01vdXNlQ2xpY2sgPSBEYXRlLm5vdygpIC0gbGFzdE1vdXNlRG93blRpbWUgPCAxMDA7XG4gICAgICBpZiAoIXdhc01vdXNlQ2xpY2sgJiYgY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgYWRkQ2xhc3MoY29tcG9uZW50LmVsZW1lbnQsIEtFWUJPQVJEX0ZPQ1VTX0NMQVNTKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRvdGFsSXRlbXMgPT09IDApIHJldHVybjtcblxuICAgICAgLy8gTUQzOiBJZiBsaXN0IGhhcyBzZWxlY3RlZCBlbGVtZW50LCBmb2N1cyBnb2VzIHRvIHNlbGVjdGVkIGl0ZW1cbiAgICAgIC8vIE90aGVyd2lzZSwgZmlyc3QgZWxlbWVudCByZWNlaXZlcyBmb2N1c1xuICAgICAgaWYgKHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZW5oYW5jZWRDb21wb25lbnQuc2VsZWN0QXRJbmRleD8uKDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gT25seSBzY3JvbGwgdG8gc2VsZWN0ZWQgaXRlbSBpZiBpdCdzIG5vdCBhbHJlYWR5IGZ1bGx5IHZpc2libGVcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyB1bndhbnRlZCBzY3JvbGxpbmcgd2hlbiBjbGlja2luZyBvbiBhIHZpc2libGUgaXRlbVxuICAgICAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzWzBdO1xuICAgICAgICBjb25zdCBpc1Zpc2libGUgPSBlbmhhbmNlZENvbXBvbmVudC5pc0l0ZW1GdWxseVZpc2libGU/LihzZWxlY3RlZEluZGV4KTtcbiAgICAgICAgaWYgKCFpc1Zpc2libGUgJiYgZW5oYW5jZWRDb21wb25lbnQudmlld3BvcnQ/LnNjcm9sbFRvSW5kZXgpIHtcbiAgICAgICAgICBlbmhhbmNlZENvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb0luZGV4KHNlbGVjdGVkSW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJrZXlib2FyZDpmb2N1c1wiKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGJsdXIgZXZlbnRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVCbHVyID0gKCkgPT4ge1xuICAgICAgLy8gUmVtb3ZlIGtleWJvYXJkIGZvY3VzIGNsYXNzXG4gICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3MoY29tcG9uZW50LmVsZW1lbnQsIEtFWUJPQVJEX0ZPQ1VTX0NMQVNTKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYXIgdHlwZS1haGVhZCBvbiBibHVyXG4gICAgICB0eXBlQWhlYWRCdWZmZXIgPSBcIlwiO1xuICAgICAgaWYgKHR5cGVBaGVhZFRpbWVyKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0eXBlQWhlYWRUaW1lcik7XG4gICAgICAgIHR5cGVBaGVhZFRpbWVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcImtleWJvYXJkOmJsdXJcIik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqL1xuICAgIGNvbnN0IHNldHVwID0gKCkgPT4ge1xuICAgICAgc2V0dXBBY2Nlc3NpYmlsaXR5KCk7XG5cbiAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlEb3duKTtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIGhhbmRsZUZvY3VzKTtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgaGFuZGxlQmx1cik7XG5cbiAgICAgICAgLy8gVHJhY2sgbW91c2UgY2xpY2tzIHRvIGRpc3Rpbmd1aXNoIGZyb20ga2V5Ym9hcmQgZm9jdXNcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCAoKSA9PiB7XG4gICAgICAgICAgbGFzdE1vdXNlRG93blRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBZGQgY2xpY2sgaGFuZGxlciB0byBmb2N1cyB0aGUgbGlzdCB3aGVuIGNsaWNrZWRcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICBjb21wb25lbnQuZWxlbWVudD8uZm9jdXMoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBBUklBIGF0dHJpYnV0ZXMgd2hlbiBpdGVtcyBhcmUgcmVuZGVyZWRcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5vbj8uKFxuICAgICAgICBcInZpZXdwb3J0Oml0ZW1zLXJlbmRlcmVkXCIsXG4gICAgICAgIHVwZGF0ZUl0ZW1BY2Nlc3NpYmlsaXR5LFxuICAgICAgKTtcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5vbj8uKFwidmlld3BvcnQ6cmVuZGVyZWRcIiwgdXBkYXRlSXRlbUFjY2Vzc2liaWxpdHkpO1xuXG4gICAgICAvLyBVcGRhdGUgQVJJQSB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzXG4gICAgICAoY29tcG9uZW50IGFzIGFueSkub24/LihcInNlbGVjdGlvbjpjaGFuZ2VcIiwgdXBkYXRlSXRlbUFjY2Vzc2liaWxpdHkpO1xuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXplIGFmdGVyIGNvbXBvbmVudCBpcyByZWFkeVxuICAgIHNldFRpbWVvdXQoc2V0dXAsIDApO1xuXG4gICAgLy8gQ2xlYW51cCBvbiBkZXN0cm95XG4gICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmRlc3Ryb3k7XG4gICAgY29tcG9uZW50LmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgaGFuZGxlS2V5RG93bik7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCBoYW5kbGVGb2N1cyk7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGhhbmRsZUJsdXIpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVBaGVhZFRpbWVyKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0eXBlQWhlYWRUaW1lcik7XG4gICAgICB9XG4gICAgICBvcmlnaW5hbERlc3Ryb3k/LigpO1xuICAgIH07XG5cbiAgICAvLyBSZXR1cm4gZW5oYW5jZWQgY29tcG9uZW50IHdpdGgga2V5Ym9hcmQgQVBJXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgLyoqXG4gICAgICAgKiBGb2N1cyB0aGUgbGlzdCBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvblxuICAgICAgICovXG4gICAgICBmb2N1cygpOiB2b2lkIHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQ/LmZvY3VzKCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEJsdXIgdGhlIGxpc3RcbiAgICAgICAqL1xuICAgICAgYmx1cigpOiB2b2lkIHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQ/LmJsdXIoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgbGlzdCBoYXMgZm9jdXNcbiAgICAgICAqL1xuICAgICAgaGFzRm9jdXMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBjb21wb25lbnQuZWxlbWVudDtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2VsZWN0IGZpcnN0IGl0ZW1cbiAgICAgICAqL1xuICAgICAgYXN5bmMgc2VsZWN0Rmlyc3QoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGVuaGFuY2VkQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIGFueTtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcbiAgICAgICAgaWYgKHRvdGFsSXRlbXMgPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIGVuaGFuY2VkQ29tcG9uZW50LnNlbGVjdEF0SW5kZXg/LigwKSA/PyBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNlbGVjdCBsYXN0IGl0ZW1cbiAgICAgICAqL1xuICAgICAgYXN5bmMgc2VsZWN0TGFzdCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0SXRlbUNvdW50Py4oKSB8fCAwO1xuICAgICAgICBpZiAodG90YWxJdGVtcyA+IDApIHtcbiAgICAgICAgICByZXR1cm4gZW5oYW5jZWRDb21wb25lbnQuc2VsZWN0QXRJbmRleD8uKHRvdGFsSXRlbXMgLSAxKSA/PyBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoS2V5Ym9hcmQ7XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL2Zvcm0vZm9ybS50c1xuXG4vKipcbiAqIEZvcm0gQ29tcG9uZW50IC0gRnVuY3Rpb25hbCBmb3JtIGJ1aWxkZXIgd2l0aCBtdHJsIGNvbXBvc2l0aW9uXG4gKlxuICogQSBmb3JtIGNvbXBvbmVudCB0aGF0IHVzZXMgdGhlIG10cmwtYWRkb25zIGxheW91dCBzeXN0ZW0gdG8gYnVpbGRcbiAqIGZvcm1zIGZyb20gc2NoZW1hIGRlZmluaXRpb25zLCB3aXRoIGJ1aWx0LWluIGRhdGEgbWFuYWdlbWVudCxcbiAqIHZhbGlkYXRpb24sIGFuZCBzdWJtaXNzaW9uIGhhbmRsaW5nLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRm9ybUNvbmZpZywgRm9ybUNvbXBvbmVudCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8vIEltcG9ydCBtdHJsIGNvbXBvc2Ugc3lzdGVtXG5pbXBvcnQgeyBwaXBlIH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IGNyZWF0ZUJhc2UsIHdpdGhFbGVtZW50IH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IHdpdGhFdmVudHMsIHdpdGhMaWZlY3ljbGUgfSBmcm9tIFwibXRybFwiO1xuXG4vLyBJbXBvcnQgZm9ybSBmZWF0dXJlc1xuaW1wb3J0IHtcbiAgd2l0aExheW91dCxcbiAgd2l0aEZpZWxkcyxcbiAgd2l0aERhdGEsXG4gIHdpdGhDb250cm9sbGVyLFxuICB3aXRoU3VibWl0LFxuICB3aXRoUHJvdGVjdGlvbixcbiAgd2l0aEFQSSxcbn0gZnJvbSBcIi4vZmVhdHVyZXNcIjtcblxuLy8gSW1wb3J0IGNvbmZpZ3VyYXRpb25cbmltcG9ydCB7IGNyZWF0ZUJhc2VDb25maWcsIGdldEVsZW1lbnRDb25maWcgfSBmcm9tIFwiLi9jb25maWdcIjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEZvcm0gY29tcG9uZW50IHVzaW5nIGZ1bmN0aW9uYWwgY29tcG9zaXRpb25cbiAqXG4gKiBAcGFyYW0ge0Zvcm1Db25maWd9IGNvbmZpZyAtIEZvcm0gY29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyB7Rm9ybUNvbXBvbmVudH0gQSBmdWxseSBjb25maWd1cmVkIGZvcm0gY29tcG9uZW50XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGNyZWF0ZUZvcm0gfSBmcm9tICdtdHJsLWFkZG9ucydcbiAqIGltcG9ydCB7IGNyZWF0ZVRleHRmaWVsZCwgY3JlYXRlU3dpdGNoLCBjcmVhdGVDaGlwcyB9IGZyb20gJ210cmwnXG4gKlxuICogY29uc3QgZm9ybSA9IGNyZWF0ZUZvcm0oe1xuICogICBjbGFzczogJ2FjY291bnQtZm9ybScsXG4gKiAgIGFjdGlvbjogJy9hcGkvdXNlcnMvJyxcbiAqICAgbGF5b3V0OiBbXG4gKiAgICAgWydzZWN0aW9uJywgeyBjbGFzczogJ3VzZXItc2VjdGlvbicgfSxcbiAqICAgICAgIFsnZGl2JywgeyBjbGFzczogJ3NlY3Rpb24tdGl0bGUnLCB0ZXh0OiAnVXNlcicgfV0sXG4gKiAgICAgICBbY3JlYXRlVGV4dGZpZWxkLCAnaW5mby51c2VybmFtZScsIHsgbGFiZWw6ICdVc2VybmFtZScgfV0sXG4gKiAgICAgICBbY3JlYXRlQ2hpcHMsICdpbmZvLnJvbGUnLCB7XG4gKiAgICAgICAgIGxhYmVsOiAnUm9sZScsXG4gKiAgICAgICAgIGNoaXBzOiBbXG4gKiAgICAgICAgICAgeyB0ZXh0OiAncmVnaXN0ZXJlZCcsIHZhbHVlOiAncmVnaXN0ZXJlZCcgfSxcbiAqICAgICAgICAgICB7IHRleHQ6ICdhZG1pbicsIHZhbHVlOiAnYWRtaW4nIH0sXG4gKiAgICAgICAgICAgeyB0ZXh0OiAncHJlbWl1bScsIHZhbHVlOiAncHJlbWl1bScgfVxuICogICAgICAgICBdXG4gKiAgICAgICB9XSxcbiAqICAgICAgIFtjcmVhdGVTd2l0Y2gsICdpbmZvLmVuYWJsZWQnLCB7IGxhYmVsOiAnRW5hYmxlZCcgfV1cbiAqICAgICBdXG4gKiAgIF0sXG4gKiAgIG9uOiB7XG4gKiAgICAgY2hhbmdlOiAoZGF0YSkgPT4gY29uc29sZS5sb2coJ0Zvcm0gY2hhbmdlZDonLCBkYXRhKSxcbiAqICAgICBzdWJtaXQ6IChkYXRhKSA9PiBjb25zb2xlLmxvZygnRm9ybSBzdWJtaXR0ZWQ6JywgZGF0YSlcbiAqICAgfVxuICogfSlcbiAqXG4gKiAvLyBBcHBlbmQgdG8gRE9NXG4gKiBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGZvcm0uZWxlbWVudClcbiAqXG4gKiAvLyBTZXQgZGF0YVxuICogZm9ybS5zZXREYXRhKHtcbiAqICAgdXNlcm5hbWU6ICdqb2huX2RvZScsXG4gKiAgIHJvbGU6ICdhZG1pbicsXG4gKiAgIGVuYWJsZWQ6IHRydWVcbiAqIH0pXG4gKlxuICogLy8gR2V0IGRhdGFcbiAqIGNvbnN0IGRhdGEgPSBmb3JtLmdldERhdGEoKVxuICpcbiAqIC8vIENoZWNrIGlmIG1vZGlmaWVkXG4gKiBpZiAoZm9ybS5pc01vZGlmaWVkKCkpIHtcbiAqICAgYXdhaXQgZm9ybS5zdWJtaXQoKVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVGb3JtID0gKGNvbmZpZzogRm9ybUNvbmZpZyA9IHt9KTogRm9ybUNvbXBvbmVudCA9PiB7XG4gIHRyeSB7XG4gICAgLy8gUHJvY2VzcyBjb25maWd1cmF0aW9uIHdpdGggZGVmYXVsdHNcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gY3JlYXRlQmFzZUNvbmZpZyhjb25maWcpO1xuXG4gICAgLy8gQnVpbGQgdGhlIGZvcm0gdGhyb3VnaCBmdW5jdGlvbmFsIGNvbXBvc2l0aW9uXG4gICAgLy8gRWFjaCBmdW5jdGlvbiBpbiB0aGUgcGlwZSBhZGRzIHNwZWNpZmljIGNhcGFiaWxpdGllc1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHBpcGUoXG4gICAgICAvLyAxLiBGb3VuZGF0aW9uIGxheWVyIC0gQmFzZSBjb21wb25lbnQgd2l0aCBjb25maWdcbiAgICAgIGNyZWF0ZUJhc2UsXG5cbiAgICAgIC8vIDIuIEV2ZW50IHN5c3RlbSAtIEFkZHMgb24vb2ZmL2VtaXQgbWV0aG9kc1xuICAgICAgd2l0aEV2ZW50cygpLFxuXG4gICAgICAvLyAzLiBET00gZWxlbWVudCAtIENyZWF0ZXMgdGhlIHJvb3QgY29udGFpbmVyIGVsZW1lbnRcbiAgICAgIHdpdGhFbGVtZW50KGdldEVsZW1lbnRDb25maWcoYmFzZUNvbmZpZykpLFxuXG4gICAgICAvLyA0LiBMYXlvdXQgLSBDcmVhdGVzIGZvcm0gZWxlbWVudCBhbmQgcHJvY2Vzc2VzIGxheW91dCBzY2hlbWFcbiAgICAgIHdpdGhMYXlvdXQoYmFzZUNvbmZpZyksXG5cbiAgICAgIC8vIDUuIEZpZWxkcyAtIEV4dHJhY3RzIGZpZWxkcyBmcm9tIGxheW91dCBhbmQgY3JlYXRlcyByZWdpc3RyeVxuICAgICAgd2l0aEZpZWxkcyhiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gNi4gRGF0YSAtIEFkZHMgZGF0YSBtYW5hZ2VtZW50IChnZXQvc2V0LCBjaGFuZ2UgdHJhY2tpbmcpXG4gICAgICB3aXRoRGF0YShiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gNy4gQ29udHJvbGxlciAtIEFkZHMgbW9kZSBtYW5hZ2VtZW50IChyZWFkL2NyZWF0ZS91cGRhdGUpXG4gICAgICB3aXRoQ29udHJvbGxlcihiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gOC4gU3VibWl0IC0gQWRkcyB2YWxpZGF0aW9uIGFuZCBzdWJtaXNzaW9uIGhhbmRsaW5nXG4gICAgICB3aXRoU3VibWl0KGJhc2VDb25maWcpLFxuXG4gICAgICAvLyA5LiBQcm90ZWN0aW9uIC0gQWRkcyBibG9ja2luZyBvdmVybGF5IHdoZW4gZm9ybSBoYXMgdW5zYXZlZCBjaGFuZ2VzXG4gICAgICB3aXRoUHJvdGVjdGlvbihiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gMTAuIExpZmVjeWNsZSAtIEFkZHMgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgKGRlc3Ryb3kpXG4gICAgICB3aXRoTGlmZWN5Y2xlKCksXG5cbiAgICAgIC8vIDExLiBBUEkgLSBDcmVhdGVzIGNsZWFuIHB1YmxpYyBBUElcbiAgICAgIHdpdGhBUEkoYmFzZUNvbmZpZyksXG4gICAgKShiYXNlQ29uZmlnKTtcblxuICAgIC8vIEFwcGVuZCB0byBjb250YWluZXIgaWYgcHJvdmlkZWRcbiAgICBpZiAoY29uZmlnLmNvbnRhaW5lciAmJiBjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgY29uZmlnLmNvbnRhaW5lci5hcHBlbmRDaGlsZChjb21wb25lbnQuZWxlbWVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvbmVudCBhcyBGb3JtQ29tcG9uZW50O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJGb3JtIGNyZWF0aW9uIGVycm9yOlwiLCBlcnJvcik7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGZvcm06ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVGb3JtO1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2xheW91dC50c1xuXG4vKipcbiAqIExheW91dCBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogQnVpbGRzIHRoZSBmb3JtIHN0cnVjdHVyZSBmcm9tIGEgbGF5b3V0IHNjaGVtYSB1c2luZyBtdHJsLWFkZG9ucyBsYXlvdXQgc3lzdGVtXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTGF5b3V0IH0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvbGF5b3V0XCI7XG5pbXBvcnQgdHlwZSB7IEZvcm1Db25maWcsIEJhc2VGb3JtQ29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBGT1JNX0RFRkFVTFRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG4vLyBTY3JvbGwgdGhyZXNob2xkIGluIHBpeGVsc1xuY29uc3QgU0NST0xMRURfVEhSRVNIT0xEID0gMTtcblxuLy8gQ1NTIGNsYXNzIG5hbWVzXG5jb25zdCBTQ1JPTExFRF9DTEFTUyA9IFwibXRybC1mb3JtLS1zY3JvbGxlZFwiO1xuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGZvcm0gZWxlbWVudFxuICovXG5jb25zdCBjcmVhdGVGb3JtRWxlbWVudCA9IChjb25maWc6IEZvcm1Db25maWcpOiBIVE1MRm9ybUVsZW1lbnQgPT4ge1xuICBjb25zdCBmb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImZvcm1cIik7XG5cbiAgaWYgKGNvbmZpZy5tZXRob2QpIHtcbiAgICBmb3JtLnNldEF0dHJpYnV0ZShcIm1ldGhvZFwiLCBjb25maWcubWV0aG9kKTtcbiAgfVxuXG4gIGlmIChjb25maWcuYWN0aW9uKSB7XG4gICAgZm9ybS5zZXRBdHRyaWJ1dGUoXCJhY3Rpb25cIiwgY29uZmlnLmFjdGlvbik7XG4gIH1cblxuICBpZiAoY29uZmlnLmF1dG9jb21wbGV0ZSkge1xuICAgIGZvcm0uc2V0QXR0cmlidXRlKFwiYXV0b2NvbXBsZXRlXCIsIGNvbmZpZy5hdXRvY29tcGxldGUpO1xuICB9XG5cbiAgLy8gUHJldmVudCBkZWZhdWx0IGZvcm0gc3VibWlzc2lvbiAtIHdlIGhhbmRsZSBpdCBwcm9ncmFtbWF0aWNhbGx5XG4gIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGZvcm07XG59O1xuXG4vKipcbiAqIFByb2Nlc3NlcyBsYXlvdXQgc2NoZW1hIGFuZCBleHRyYWN0cyBuYW1lZCBjb21wb25lbnRzXG4gKi9cbmNvbnN0IHByb2Nlc3NMYXlvdXRTY2hlbWEgPSAoXG4gIHNjaGVtYTogdW5rbm93bltdLFxuICBmb3JtOiBIVE1MRm9ybUVsZW1lbnQsXG4gIGNvbmZpZzogRm9ybUNvbmZpZyxcbik6IHsgdWk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBsYXlvdXRSZXN1bHQ6IHVua25vd24gfSA9PiB7XG4gIGlmICghc2NoZW1hIHx8ICFBcnJheS5pc0FycmF5KHNjaGVtYSkgfHwgc2NoZW1hLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB7IHVpOiB7fSwgbGF5b3V0UmVzdWx0OiBudWxsIH07XG4gIH1cblxuICAvLyBVc2UgbXRybC1hZGRvbnMgY3JlYXRlTGF5b3V0IHRvIHByb2Nlc3MgdGhlIHNjaGVtYVxuICBjb25zdCBsYXlvdXRSZXN1bHQgPSBjcmVhdGVMYXlvdXQoc2NoZW1hLCBmb3JtLCB7fSk7XG5cbiAgLy8gRXh0cmFjdCBuYW1lZCBjb21wb25lbnRzIGZyb20gbGF5b3V0IHJlc3VsdFxuICBjb25zdCB1aTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICBpZiAobGF5b3V0UmVzdWx0ICYmIHR5cGVvZiBsYXlvdXRSZXN1bHQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAvLyBUaGUgbGF5b3V0IHJlc3VsdCBjb250YWlucyBjb21wb25lbnQgcmVmZXJlbmNlc1xuICAgIGNvbnN0IHJlc3VsdCA9IGxheW91dFJlc3VsdCBhcyB7IGNvbXBvbmVudD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH07XG4gICAgaWYgKHJlc3VsdC5jb21wb25lbnQpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odWksIHJlc3VsdC5jb21wb25lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHVpLCBsYXlvdXRSZXN1bHQgfTtcbn07XG5cbi8qKlxuICogU2V0cyB1cCBzY3JvbGwgZGV0ZWN0aW9uIG9uIGJvZHkgZWxlbWVudHMgdG8gdG9nZ2xlIC0tc2Nyb2xsZWQgY2xhc3Mgb24gZm9ybSBjb250YWluZXJcbiAqL1xuY29uc3Qgc2V0dXBTY3JvbGxJbmRpY2F0b3IgPSAoXG4gIGZvcm06IEhUTUxGb3JtRWxlbWVudCxcbiAgZm9ybUNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4pOiAoKCkgPT4gdm9pZCkgPT4ge1xuICBjb25zdCBjbGVhbnVwRm5zOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdO1xuXG4gIC8vIEZpbmQgYm9keSBlbGVtZW50IHRvIGNhbGN1bGF0ZSBzaGFkb3cgcG9zaXRpb25cbiAgY29uc3QgYm9keUVsZW1lbnQgPSBmb3JtLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFwiLm10cmwtYm9keVwiKTtcbiAgaWYgKGJvZHlFbGVtZW50KSB7XG4gICAgLy8gU2V0IENTUyB2YXJpYWJsZSBmb3Igc2hhZG93IHBvc2l0aW9uaW5nIGF0IHRvcCBvZiBib2R5XG4gICAgY29uc3QgdXBkYXRlQm9keVRvcCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGJvZHlUb3AgPSBib2R5RWxlbWVudC5vZmZzZXRUb3A7XG4gICAgICBmb3JtQ29udGFpbmVyLnN0eWxlLnNldFByb3BlcnR5KFwiLS1tdHJsLWZvcm0tYm9keS10b3BcIiwgYCR7Ym9keVRvcH1weGApO1xuICAgIH07XG4gICAgdXBkYXRlQm9keVRvcCgpO1xuXG4gICAgLy8gVXBkYXRlIG9uIHJlc2l6ZVxuICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKHVwZGF0ZUJvZHlUb3ApO1xuICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZm9ybSk7XG5cbiAgICBjbGVhbnVwRm5zLnB1c2goKCkgPT4ge1xuICAgICAgcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgZm9ybUNvbnRhaW5lci5zdHlsZS5yZW1vdmVQcm9wZXJ0eShcIi0tbXRybC1mb3JtLWJvZHktdG9wXCIpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gRmluZCBib2R5IGVsZW1lbnRzIChtdHJsLWJvZHkgY2xhc3MgYWRkZWQgYnkgbGF5b3V0IHN5c3RlbSlcbiAgY29uc3QgYm9keUVsZW1lbnRzID0gZm9ybS5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihcIi5tdHJsLWJvZHlcIik7XG5cbiAgYm9keUVsZW1lbnRzLmZvckVhY2goKGJvZHlFbGVtZW50KSA9PiB7XG4gICAgbGV0IGlzU2Nyb2xsZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IGhhbmRsZVNjcm9sbCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHNob3VsZEJlU2Nyb2xsZWQgPSBib2R5RWxlbWVudC5zY3JvbGxUb3AgPiBTQ1JPTExFRF9USFJFU0hPTEQ7XG4gICAgICBpZiAoc2hvdWxkQmVTY3JvbGxlZCAhPT0gaXNTY3JvbGxlZCkge1xuICAgICAgICBpc1Njcm9sbGVkID0gc2hvdWxkQmVTY3JvbGxlZDtcbiAgICAgICAgZm9ybUNvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKFNDUk9MTEVEX0NMQVNTLCBzaG91bGRCZVNjcm9sbGVkKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbCBjaGVja1xuICAgIGhhbmRsZVNjcm9sbCgpO1xuXG4gICAgLy8gTGlzdGVuIGZvciBzY3JvbGwgZXZlbnRzXG4gICAgYm9keUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBoYW5kbGVTY3JvbGwsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNsZWFudXBGbnMucHVzaCgoKSA9PiB7XG4gICAgICBib2R5RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIGhhbmRsZVNjcm9sbCk7XG4gICAgICBmb3JtQ29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoU0NST0xMRURfQ0xBU1MpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBSZXR1cm4gY2xlYW51cCBmdW5jdGlvblxuICByZXR1cm4gKCkgPT4ge1xuICAgIGNsZWFudXBGbnMuZm9yRWFjaCgoZm4pID0+IGZuKCkpO1xuICB9O1xufTtcblxuLyoqXG4gKiB3aXRoTGF5b3V0IGZlYXR1cmVcbiAqIEFkZHMgZm9ybSBlbGVtZW50IGNyZWF0aW9uIGFuZCBsYXlvdXQgcHJvY2Vzc2luZ1xuICovXG5leHBvcnQgY29uc3Qgd2l0aExheW91dCA9IChjb25maWc6IEZvcm1Db25maWcpID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgQmFzZUZvcm1Db21wb25lbnQ+KFxuICAgIGNvbXBvbmVudDogVCxcbiAgKTogVCAmIHtcbiAgICBmb3JtOiBIVE1MRm9ybUVsZW1lbnQ7XG4gICAgdWk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGxheW91dFJlc3VsdDogdW5rbm93bjtcbiAgICBfY2xlYW51cFNjcm9sbEluZGljYXRvcj86ICgpID0+IHZvaWQ7XG4gIH0gPT4ge1xuICAgIC8vIENyZWF0ZSB0aGUgZm9ybSBlbGVtZW50XG4gICAgY29uc3QgZm9ybSA9IGNyZWF0ZUZvcm1FbGVtZW50KGNvbmZpZyk7XG5cbiAgICAvLyBBcHBlbmQgZm9ybSB0byBjb21wb25lbnQncyByb290IGVsZW1lbnRcbiAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFwcGVuZENoaWxkKGZvcm0pO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgbGF5b3V0IHNjaGVtYSBpZiBwcm92aWRlZFxuICAgIGNvbnN0IHsgdWksIGxheW91dFJlc3VsdCB9ID0gY29uZmlnLmxheW91dFxuICAgICAgPyBwcm9jZXNzTGF5b3V0U2NoZW1hKGNvbmZpZy5sYXlvdXQsIGZvcm0sIGNvbmZpZylcbiAgICAgIDogeyB1aToge30sIGxheW91dFJlc3VsdDogbnVsbCB9O1xuXG4gICAgLy8gU2V0dXAgc2Nyb2xsIGluZGljYXRvciBvbiBib2R5IGVsZW1lbnRzXG4gICAgY29uc3QgY2xlYW51cFNjcm9sbEluZGljYXRvciA9IHNldHVwU2Nyb2xsSW5kaWNhdG9yKFxuICAgICAgZm9ybSxcbiAgICAgIGNvbXBvbmVudC5lbGVtZW50LFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgZm9ybSxcbiAgICAgIHVpLFxuICAgICAgbGF5b3V0UmVzdWx0LFxuICAgICAgX2NsZWFudXBTY3JvbGxJbmRpY2F0b3I6IGNsZWFudXBTY3JvbGxJbmRpY2F0b3IsXG4gICAgfTtcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhMYXlvdXQ7XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL2Zvcm0vY29uc3RhbnRzLnRzXG5cbi8qKlxuICogRGF0YSBzdGF0ZSBjb25zdGFudHNcbiAqIFRyYWNrcyB3aGV0aGVyIGZvcm0gZGF0YSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwgc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IERBVEFfU1RBVEUgPSB7XG4gIC8qKiBEYXRhIG1hdGNoZXMgaW5pdGlhbCBzdGF0ZSAtIG5vIGNoYW5nZXMgbWFkZSAqL1xuICBQUklTVElORTogXCJwcmlzdGluZVwiLFxuICAvKiogRGF0YSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwgc3RhdGUgKi9cbiAgRElSVFk6IFwiZGlydHlcIixcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogRm9ybSBldmVudCBjb25zdGFudHNcbiAqL1xuZXhwb3J0IGNvbnN0IEZPUk1fRVZFTlRTID0ge1xuICAvKiogRmlyZWQgd2hlbiBhbnkgZmllbGQgdmFsdWUgY2hhbmdlcyAqL1xuICBDSEFOR0U6IFwiY2hhbmdlXCIsXG4gIC8qKiBGaXJlZCB3aGVuIGZvcm0gaXMgc3VibWl0dGVkICovXG4gIFNVQk1JVDogXCJzdWJtaXRcIixcbiAgLyoqIEZpcmVkIHdoZW4gZGF0YSBzdGF0ZSBjaGFuZ2VzIChwcmlzdGluZSA8LT4gZGlydHkpICovXG4gIFNUQVRFX0NIQU5HRTogXCJzdGF0ZTpjaGFuZ2VcIixcbiAgLyoqIEZpcmVkIHdoZW4gZGF0YSBpcyBzZXQgb24gdGhlIGZvcm0gKi9cbiAgREFUQV9TRVQ6IFwiZGF0YTpzZXRcIixcbiAgLyoqIEZpcmVkIHdoZW4gZGF0YSBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgZm9ybSAqL1xuICBEQVRBX0dFVDogXCJkYXRhOmdldFwiLFxuICAvKiogRmlyZWQgd2hlbiBhIHNwZWNpZmljIGZpZWxkIGNoYW5nZXMgKi9cbiAgRklFTERfQ0hBTkdFOiBcImZpZWxkOmNoYW5nZVwiLFxuICAvKiogRmlyZWQgd2hlbiB2YWxpZGF0aW9uIGZhaWxzICovXG4gIFZBTElEQVRJT05fRVJST1I6IFwidmFsaWRhdGlvbjplcnJvclwiLFxuICAvKiogRmlyZWQgd2hlbiBzdWJtaXQgc3VjY2VlZHMgKi9cbiAgU1VCTUlUX1NVQ0NFU1M6IFwic3VibWl0OnN1Y2Nlc3NcIixcbiAgLyoqIEZpcmVkIHdoZW4gc3VibWl0IGZhaWxzICovXG4gIFNVQk1JVF9FUlJPUjogXCJzdWJtaXQ6ZXJyb3JcIixcbiAgLyoqIEZpcmVkIHdoZW4gZm9ybSBpcyByZXNldCB0byBpbml0aWFsIHN0YXRlICovXG4gIFJFU0VUOiBcInJlc2V0XCIsXG4gIC8qKiBGaXJlZCB3aGVuIHNldERhdGEgaXMgY2FsbGVkIHdpdGggdW5zYXZlZCBjaGFuZ2VzIChwcm90ZWN0aW9uIGVuYWJsZWQpICovXG4gIERBVEFfQ09ORkxJQ1Q6IFwiZGF0YTpjb25mbGljdFwiLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBGb3JtIENTUyBjbGFzcyBtb2RpZmllcnNcbiAqL1xuZXhwb3J0IGNvbnN0IEZPUk1fQ0xBU1NFUyA9IHtcbiAgLyoqIEFwcGxpZWQgd2hlbiBkYXRhIGhhcyBiZWVuIG1vZGlmaWVkICovXG4gIE1PRElGSUVEOiBcIm1vZGlmaWVkXCIsXG4gIC8qKiBBcHBsaWVkIHdoZW4gZm9ybSBpcyBzdWJtaXR0aW5nICovXG4gIFNVQk1JVFRJTkc6IFwic3VibWl0dGluZ1wiLFxuICAvKiogQXBwbGllZCB3aGVuIGZvcm0gaXMgZGlzYWJsZWQgKi9cbiAgRElTQUJMRUQ6IFwiZGlzYWJsZWRcIixcbiAgLyoqIEFwcGxpZWQgd2hlbiBmb3JtIGJvZHkgaXMgc2Nyb2xsZWQgYXdheSBmcm9tIHRvcCAqL1xuICBTQ1JPTExFRDogXCJtdHJsLWZvcm0tLXNjcm9sbGVkXCIsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIERlZmF1bHQgZm9ybSBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBGT1JNX0RFRkFVTFRTID0ge1xuICBwcmVmaXg6IFwibXRybFwiLFxuICBjb21wb25lbnROYW1lOiBcImZvcm1cIixcbiAgdGFnOiBcImRpdlwiLFxuICBmb3JtVGFnOiBcImZvcm1cIixcbiAgbWV0aG9kOiBcIlBPU1RcIixcbiAgYXV0b2NvbXBsZXRlOiBcIm9mZlwiLFxuICB1c2VDaGFuZ2VzOiB0cnVlLFxuICBjb250cm9sczogW1wic3VibWl0XCIsIFwiY2FuY2VsXCJdLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBGaWVsZCBuYW1lIHByZWZpeGVzIHVzZWQgZm9yIGV4dHJhY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IEZJRUxEX1BSRUZJWEVTID0ge1xuICBJTkZPOiBcImluZm8uXCIsXG4gIEZJTEU6IFwiZmlsZS5cIixcbiAgREFUQTogXCJkYXRhLlwiLFxufSBhcyBjb25zdDtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9jb25maWcudHNcblxuaW1wb3J0IHR5cGUgeyBGb3JtQ29uZmlnLCBGb3JtU3RhdGUsIEZvcm1EYXRhIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IEZPUk1fREVGQVVMVFMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLy8gUmUtZXhwb3J0IEZPUk1fREVGQVVMVFMgZm9yIHVzZSBpbiBvdGhlciBtb2R1bGVzXG5leHBvcnQgeyBGT1JNX0RFRkFVTFRTIH07XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgYmFzZSBjb25maWd1cmF0aW9uIHdpdGggZGVmYXVsdHMgYXBwbGllZFxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlQmFzZUNvbmZpZyA9IChjb25maWc6IEZvcm1Db25maWcgPSB7fSk6IEZvcm1Db25maWcgPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLkZPUk1fREVGQVVMVFMsXG4gICAgLi4uY29uZmlnLFxuICAgIHByZWZpeDogY29uZmlnLnByZWZpeCB8fCBGT1JNX0RFRkFVTFRTLnByZWZpeCxcbiAgICBjb21wb25lbnROYW1lOiBjb25maWcuY29tcG9uZW50TmFtZSB8fCBGT1JNX0RFRkFVTFRTLmNvbXBvbmVudE5hbWUsXG4gICAgY29udHJvbHM6XG4gICAgICBjb25maWcuY29udHJvbHMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IGNvbmZpZy5jb250cm9sc1xuICAgICAgICA6IFsuLi5GT1JNX0RFRkFVTFRTLmNvbnRyb2xzXSxcbiAgICBzeXNpbmZvOiBjb25maWcuc3lzaW5mbyB8fCBbXSxcbiAgICB2YWxpZGF0aW9uOiBjb25maWcudmFsaWRhdGlvbiB8fCBbXSxcbiAgICBvbjogY29uZmlnLm9uIHx8IHt9LFxuICB9O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBpbml0aWFsIGZvcm0gc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUluaXRpYWxTdGF0ZSA9IChjb25maWc6IEZvcm1Db25maWcpOiBGb3JtU3RhdGUgPT4ge1xuICBjb25zdCBpbml0aWFsRGF0YSA9IGNvbmZpZy5kYXRhID8geyAuLi5jb25maWcuZGF0YSB9IDoge307XG5cbiAgcmV0dXJuIHtcbiAgICBtb2RpZmllZDogZmFsc2UsXG4gICAgc3VibWl0dGluZzogZmFsc2UsXG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgIGluaXRpYWxEYXRhLFxuICAgIGN1cnJlbnREYXRhOiB7IC4uLmluaXRpYWxEYXRhIH0sXG4gICAgZXJyb3JzOiB7fSxcbiAgfTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgZWxlbWVudCBjb25maWd1cmF0aW9uIGZvciB3aXRoRWxlbWVudFxuICovXG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudENvbmZpZyA9IChjb25maWc6IEZvcm1Db25maWcpID0+IHtcbiAgY29uc3QgcHJlZml4ID0gY29uZmlnLnByZWZpeCB8fCBGT1JNX0RFRkFVTFRTLnByZWZpeDtcbiAgY29uc3QgY29tcG9uZW50TmFtZSA9IGNvbmZpZy5jb21wb25lbnROYW1lIHx8IEZPUk1fREVGQVVMVFMuY29tcG9uZW50TmFtZTtcblxuICBjb25zdCBjbGFzc05hbWVzID0gW2Ake3ByZWZpeH0tJHtjb21wb25lbnROYW1lfWBdO1xuXG4gIGlmIChjb25maWcuY2xhc3MpIHtcbiAgICBjbGFzc05hbWVzLnB1c2goY29uZmlnLmNsYXNzKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdGFnOiBcImRpdlwiLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5qb2luKFwiIFwiKSxcbiAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICBcImRhdGEtY29tcG9uZW50XCI6IGNvbXBvbmVudE5hbWUsXG4gICAgfSxcbiAgfTtcbn07XG5cbi8qKlxuICogRXh0cmFjdHMgZmllbGQgbmFtZSBmcm9tIGEgcHJlZml4ZWQgbmFtZSAoZS5nLiwgJ2luZm8udXNlcm5hbWUnIC0+ICd1c2VybmFtZScpXG4gKi9cbmV4cG9ydCBjb25zdCBleHRyYWN0RmllbGROYW1lID0gKHByZWZpeGVkTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgcGFydHMgPSBwcmVmaXhlZE5hbWUuc3BsaXQoXCIuXCIpO1xuICByZXR1cm4gcGFydHMubGVuZ3RoID4gMSA/IHBhcnRzLnNsaWNlKDEpLmpvaW4oXCIuXCIpIDogcHJlZml4ZWROYW1lO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBmdWxsIGZpZWxkIHBhdGggaW5jbHVkaW5nIHByZWZpeFxuICovXG5leHBvcnQgY29uc3QgZ2V0RmllbGRQYXRoID0gKG5hbWU6IHN0cmluZywgcHJlZml4OiBzdHJpbmcgPSBcImluZm9cIik6IHN0cmluZyA9PiB7XG4gIGlmIChuYW1lLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgIHJldHVybiBuYW1lO1xuICB9XG4gIHJldHVybiBgJHtwcmVmaXh9LiR7bmFtZX1gO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBuYW1lIGlzIGEgZmllbGQgbmFtZSAoc3RhcnRzIHdpdGggaW5mby4gb3IgZGF0YS4pXG4gKi9cbmV4cG9ydCBjb25zdCBpc0ZpZWxkTmFtZSA9IChuYW1lOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIG5hbWUuc3RhcnRzV2l0aChcImluZm8uXCIpIHx8IG5hbWUuc3RhcnRzV2l0aChcImRhdGEuXCIpO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBuYW1lIGlzIGEgZmlsZSBmaWVsZCBuYW1lXG4gKi9cbmV4cG9ydCBjb25zdCBpc0ZpbGVOYW1lID0gKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gbmFtZS5zdGFydHNXaXRoKFwiZmlsZS5cIik7XG59O1xuXG4vKipcbiAqIERlZXAgY29tcGFyaXNvbiBvZiB0d28gdmFsdWVzIGZvciBjaGFuZ2UgZGV0ZWN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBpc1ZhbHVlRXF1YWwgPSAoYTogdW5rbm93biwgYjogdW5rbm93bik6IGJvb2xlYW4gPT4ge1xuICAvLyBIYW5kbGUgbnVsbC91bmRlZmluZWRcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgcmV0dXJuIGEgPT0gYjtcblxuICAvLyBIYW5kbGUgYXJyYXlzXG4gIGlmIChBcnJheS5pc0FycmF5KGEpICYmIEFycmF5LmlzQXJyYXkoYikpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGEuZXZlcnkoKHZhbCwgaWR4KSA9PiBpc1ZhbHVlRXF1YWwodmFsLCBiW2lkeF0pKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBvYmplY3RzXG4gIGlmICh0eXBlb2YgYSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgYiA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IGtleXNBID0gT2JqZWN0LmtleXMoYSBhcyBvYmplY3QpO1xuICAgIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMoYiBhcyBvYmplY3QpO1xuICAgIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBrZXlzQS5ldmVyeSgoa2V5KSA9PlxuICAgICAgaXNWYWx1ZUVxdWFsKFxuICAgICAgICAoYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSxcbiAgICAgICAgKGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvLyBIYW5kbGUgcHJpbWl0aXZlcyAod2l0aCB0eXBlIGNvZXJjaW9uIGZvciBzdHJpbmcvbnVtYmVyIGNvbXBhcmlzb24pXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcbiAgcmV0dXJuIGEgPT0gYjtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIGZvcm0gZGF0YSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwgc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IGhhc0RhdGFDaGFuZ2VkID0gKFxuICBpbml0aWFsOiBGb3JtRGF0YSxcbiAgY3VycmVudDogRm9ybURhdGEsXG4pOiBib29sZWFuID0+IHtcbiAgY29uc3QgYWxsS2V5cyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGluaXRpYWwpLCAuLi5PYmplY3Qua2V5cyhjdXJyZW50KV0pO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIGFsbEtleXMpIHtcbiAgICBpZiAoIWlzVmFsdWVFcXVhbChpbml0aWFsW2tleV0sIGN1cnJlbnRba2V5XSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogR2V0cyBvbmx5IHRoZSBtb2RpZmllZCBmaWVsZHMgYmV0d2VlbiBpbml0aWFsIGFuZCBjdXJyZW50IGRhdGFcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE1vZGlmaWVkRmllbGRzID0gKFxuICBpbml0aWFsOiBGb3JtRGF0YSxcbiAgY3VycmVudDogRm9ybURhdGEsXG4pOiBGb3JtRGF0YSA9PiB7XG4gIGNvbnN0IG1vZGlmaWVkOiBGb3JtRGF0YSA9IHt9O1xuICBjb25zdCBhbGxLZXlzID0gbmV3IFNldChbLi4uT2JqZWN0LmtleXMoaW5pdGlhbCksIC4uLk9iamVjdC5rZXlzKGN1cnJlbnQpXSk7XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgYWxsS2V5cykge1xuICAgIGlmICghaXNWYWx1ZUVxdWFsKGluaXRpYWxba2V5XSwgY3VycmVudFtrZXldKSkge1xuICAgICAgbW9kaWZpZWRba2V5XSA9IGN1cnJlbnRba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbW9kaWZpZWQ7XG59O1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2ZpZWxkcy50c1xuXG4vKipcbiAqIEZpZWxkcyBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogRXh0cmFjdHMgZmllbGRzIGZyb20gbGF5b3V0IGFuZCBtYW5hZ2VzIHRoZSBmaWVsZCByZWdpc3RyeVxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRm9ybUNvbmZpZyxcbiAgQmFzZUZvcm1Db21wb25lbnQsXG4gIEZvcm1GaWVsZCxcbiAgRm9ybUZpZWxkUmVnaXN0cnksXG4gIEZpZWxkVmFsdWUsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgaXNGaWVsZE5hbWUsIGlzRmlsZU5hbWUsIGV4dHJhY3RGaWVsZE5hbWUgfSBmcm9tIFwiLi4vY29uZmlnXCI7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIG9iamVjdCBpcyBhIHZhbGlkIGZvcm0gZmllbGQgY29tcG9uZW50XG4gKiBBIGZvcm0gZmllbGQgbXVzdCBoYXZlIGF0IGxlYXN0IGdldFZhbHVlIG9yIHNldFZhbHVlIG1ldGhvZFxuICovXG5jb25zdCBpc0Zvcm1GaWVsZCA9IChvYmo6IHVua25vd24pOiBvYmogaXMgRm9ybUZpZWxkID0+IHtcbiAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGNhbmRpZGF0ZSA9IG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvLyBNdXN0IGhhdmUgZWxlbWVudCBwcm9wZXJ0eVxuICBpZiAoIWNhbmRpZGF0ZS5lbGVtZW50IHx8ICEoY2FuZGlkYXRlLmVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBNdXN0IGhhdmUgZ2V0VmFsdWUgb3Igc2V0VmFsdWVcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgY2FuZGlkYXRlLmdldFZhbHVlID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICB0eXBlb2YgY2FuZGlkYXRlLnNldFZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgKTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgdmFsdWUgZnJvbSBhIGZpZWxkIGNvbXBvbmVudFxuICogQWxsIG10cmwgY29tcG9uZW50cyBub3cgaGF2ZSB1bmlmaWVkIGdldFZhbHVlKCkgQVBJOlxuICogLSBUZXh0ZmllbGQ6IHJldHVybnMgc3RyaW5nXG4gKiAtIFNlbGVjdDogcmV0dXJucyBzdHJpbmcgb3Igc3RyaW5nW11cbiAqIC0gQ2hpcHM6IHJldHVybnMgc3RyaW5nW11cbiAqIC0gU3dpdGNoL0NoZWNrYm94OiByZXR1cm5zIGJvb2xlYW4gKHVwZGF0ZWQgaW4gbXRybCBjb3JlKVxuICovXG5leHBvcnQgY29uc3QgZ2V0RmllbGRWYWx1ZSA9IChmaWVsZDogRm9ybUZpZWxkKTogRmllbGRWYWx1ZSA9PiB7XG4gIGlmICh0eXBlb2YgZmllbGQuZ2V0VmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBmaWVsZC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLy8gRmFsbGJhY2s6IGNoZWNrIGZvciB2YWx1ZSBwcm9wZXJ0eVxuICBjb25zdCBmaWVsZEFueSA9IGZpZWxkIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmIChcInZhbHVlXCIgaW4gZmllbGRBbnkpIHtcbiAgICByZXR1cm4gZmllbGRBbnkudmFsdWUgYXMgRmllbGRWYWx1ZTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIG9uIGEgZmllbGQgY29tcG9uZW50XG4gKiBBbGwgbXRybCBjb21wb25lbnRzIG5vdyBoYXZlIHVuaWZpZWQgc2V0VmFsdWUoKSBBUEk6XG4gKiAtIFRleHRmaWVsZDogYWNjZXB0cyBzdHJpbmdcbiAqIC0gU2VsZWN0OiBhY2NlcHRzIHN0cmluZyBvciBzdHJpbmdbXVxuICogLSBDaGlwczogYWNjZXB0cyBzdHJpbmdbXVxuICogLSBTd2l0Y2gvQ2hlY2tib3g6IGFjY2VwdHMgYm9vbGVhbiBvciBzdHJpbmcgKFwidHJ1ZVwiL1wiZmFsc2VcIikgKHVwZGF0ZWQgaW4gbXRybCBjb3JlKVxuICpcbiAqIEZvciBzaWxlbnQgdXBkYXRlcyAobm8gY2hhbmdlIGV2ZW50cyksIHdlIHNldCBkaXJlY3RseSBvbiB0aGUgaW5wdXQgZWxlbWVudFxuICovXG5leHBvcnQgY29uc3Qgc2V0RmllbGRWYWx1ZSA9IChcbiAgZmllbGQ6IEZvcm1GaWVsZCxcbiAgdmFsdWU6IEZpZWxkVmFsdWUsXG4gIHNpbGVudDogYm9vbGVhbiA9IGZhbHNlLFxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IGZpZWxkQW55ID0gZmllbGQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgc2VsZWN0IGNvbXBvbmVudCAoaGFzIHRleHRmaWVsZCBwcm9wZXJ0eSlcbiAgLy8gU2VsZWN0IGNvbXBvbmVudHMgbXVzdCBhbHdheXMgdXNlIHNldFZhbHVlIHRvIHVwZGF0ZSBpbnRlcm5hbCBzdGF0ZVxuICBjb25zdCBpc1NlbGVjdENvbXBvbmVudCA9IFwidGV4dGZpZWxkXCIgaW4gZmllbGRBbnkgJiYgXCJtZW51XCIgaW4gZmllbGRBbnk7XG5cbiAgaWYgKHNpbGVudCAmJiAhaXNTZWxlY3RDb21wb25lbnQpIHtcbiAgICAvLyBTaWxlbnQgdXBkYXRlOiBzZXQgZGlyZWN0bHkgb24gaW5wdXQgdG8gYXZvaWQgdHJpZ2dlcmluZyBjaGFuZ2UgZXZlbnRzXG4gICAgLy8gU2tpcCB0aGlzIGZvciBzZWxlY3QgY29tcG9uZW50cyAtIHRoZXkgbmVlZCBzZXRWYWx1ZSB0byB1cGRhdGUgaW50ZXJuYWwgc3RhdGVcbiAgICBjb25zdCBpbnB1dCA9IGZpZWxkQW55LmlucHV0IGFzXG4gICAgICB8IEhUTUxJbnB1dEVsZW1lbnRcbiAgICAgIHwgSFRNTFRleHRBcmVhRWxlbWVudFxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlucHV0KSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgY2hlY2tib3gvc3dpdGNoIChoYXMgY2hlY2tlZCBwcm9wZXJ0eSlcbiAgICAgIC8vIE5lZWQgdG8gbmFycm93IHR5cGUgdG8gSFRNTElucHV0RWxlbWVudCBiZWZvcmUgYWNjZXNzaW5nIGNoZWNrZWRcbiAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgaW5wdXQudHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XG4gICAgICAgIGNvbnN0IHNob3VsZEJlQ2hlY2tlZCA9XG4gICAgICAgICAgdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IFwidHJ1ZVwiIHx8IHZhbHVlID09PSAxO1xuICAgICAgICBpbnB1dC5jaGVja2VkID0gc2hvdWxkQmVDaGVja2VkO1xuICAgICAgICAvLyBVcGRhdGUgdmlzdWFsIHN0YXRlIGJ5IHRvZ2dsaW5nIHRoZSBjaGVja2VkIGNsYXNzXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBmaWVsZEFueS5lbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IEFycmF5LmZyb20oZWxlbWVudC5jbGFzc0xpc3QpO1xuICAgICAgICAgIGNvbnN0IGJhc2VDbGFzcyA9IGNsYXNzTGlzdC5maW5kKFxuICAgICAgICAgICAgKGMpID0+IGMuc3RhcnRzV2l0aChcIm10cmwtXCIpICYmICFjLmluY2x1ZGVzKFwiLS1cIiksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoYmFzZUNsYXNzKSB7XG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoYCR7YmFzZUNsYXNzfS0tY2hlY2tlZGAsIHNob3VsZEJlQ2hlY2tlZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUZXh0IGlucHV0IC0gc2V0IHZhbHVlIGRpcmVjdGx5XG4gICAgICAgIGlucHV0LnZhbHVlID0gKHZhbHVlIGFzIHN0cmluZykgPz8gXCJcIjtcbiAgICAgICAgLy8gVXBkYXRlIHZpc3VhbCBzdGF0ZSAtIHRvZ2dsZSAtLWVtcHR5IGNsYXNzIGJhc2VkIG9uIHZhbHVlXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBmaWVsZEFueS5lbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IEFycmF5LmZyb20oZWxlbWVudC5jbGFzc0xpc3QpO1xuICAgICAgICAgIGNvbnN0IGJhc2VDbGFzcyA9IGNsYXNzTGlzdC5maW5kKFxuICAgICAgICAgICAgKGMpID0+IGMuc3RhcnRzV2l0aChcIm10cmwtXCIpICYmICFjLmluY2x1ZGVzKFwiLS1cIiksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoYmFzZUNsYXNzKSB7XG4gICAgICAgICAgICBjb25zdCBpc0VtcHR5ID0gIWlucHV0LnZhbHVlO1xuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKGAke2Jhc2VDbGFzc30tLWVtcHR5YCwgaXNFbXB0eSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZvciBjb21wb25lbnRzIHdpdGhvdXQgaW5wdXQgKGxpa2UgY2hpcHMsIHNlbGVjdCksIGZhbGwgdGhyb3VnaCB0byBzZXRWYWx1ZVxuICAgIC8vIGJ1dCBzdGlsbCB1c2Ugc2lsZW50IG1vZGUgYmVoYXZpb3IgKG5vIGV2ZW50cyB0cmlnZ2VyZWQpXG4gIH1cblxuICAvLyBOb3JtYWwgdXBkYXRlOiB1c2UgY29tcG9uZW50J3Mgc2V0VmFsdWUgbWV0aG9kXG4gIGlmICh0eXBlb2YgZmllbGQuc2V0VmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGZpZWxkLnNldFZhbHVlKHZhbHVlKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBGYWxsYmFjazogc2V0IHZhbHVlIHByb3BlcnR5IGRpcmVjdGx5XG4gIGlmIChcInZhbHVlXCIgaW4gZmllbGRBbnkpIHtcbiAgICBmaWVsZEFueS52YWx1ZSA9IHZhbHVlO1xuICB9XG59O1xuXG4vKipcbiAqIEV4dHJhY3RzIGZpZWxkcyBmcm9tIHRoZSBVSSBjb21wb25lbnQgcmVnaXN0cnlcbiAqIExvb2tzIGZvciBjb21wb25lbnRzIHdpdGggbmFtZXMgc3RhcnRpbmcgd2l0aCAnaW5mby4nIG9yICdkYXRhLidcbiAqL1xuY29uc3QgZXh0cmFjdEZpZWxkcyA9IChcbiAgdWk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBjb25maWc6IEZvcm1Db25maWcsXG4pOiB7IGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnk7IGZpbGVzOiBGb3JtRmllbGRSZWdpc3RyeSB9ID0+IHtcbiAgY29uc3QgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeSA9IG5ldyBNYXAoKTtcbiAgY29uc3QgZmlsZXM6IEZvcm1GaWVsZFJlZ2lzdHJ5ID0gbmV3IE1hcCgpO1xuXG4gIGlmICghdWkpIHJldHVybiB7IGZpZWxkcywgZmlsZXMgfTtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBjb21wb25lbnRdIG9mIE9iamVjdC5lbnRyaWVzKHVpKSkge1xuICAgIC8vIFNraXAgbm9uLWZpZWxkIGNvbXBvbmVudHNcbiAgICBpZiAoIWlzRm9ybUZpZWxkKGNvbXBvbmVudCkpIGNvbnRpbnVlO1xuXG4gICAgaWYgKGlzRmllbGROYW1lKG5hbWUpKSB7XG4gICAgICAvLyBFeHRyYWN0IGZpZWxkIG5hbWUgd2l0aG91dCBwcmVmaXggKGluZm8udXNlcm5hbWUgLT4gdXNlcm5hbWUpXG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSBleHRyYWN0RmllbGROYW1lKG5hbWUpO1xuICAgICAgZmllbGRzLnNldChmaWVsZE5hbWUsIGNvbXBvbmVudCk7XG4gICAgfSBlbHNlIGlmIChpc0ZpbGVOYW1lKG5hbWUpKSB7XG4gICAgICAvLyBFeHRyYWN0IGZpbGUgbmFtZSB3aXRob3V0IHByZWZpeCAoZmlsZS5hdmF0YXIgLT4gYXZhdGFyKVxuICAgICAgY29uc3QgZmlsZU5hbWUgPSBleHRyYWN0RmllbGROYW1lKG5hbWUpO1xuICAgICAgZmlsZXMuc2V0KGZpbGVOYW1lLCBjb21wb25lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGZpZWxkcywgZmlsZXMgfTtcbn07XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIGZpZWxkIHZhbHVlcyBmb3IgZXF1YWxpdHlcbiAqIEhhbmRsZXMgYXJyYXlzIChmb3IgY2hpcHMvbXVsdGktc2VsZWN0KSBhbmQgcHJpbWl0aXZlIHZhbHVlc1xuICovXG5jb25zdCB2YWx1ZXNFcXVhbCA9IChhOiBGaWVsZFZhbHVlLCBiOiBGaWVsZFZhbHVlKTogYm9vbGVhbiA9PiB7XG4gIC8vIEhhbmRsZSBudWxsL3VuZGVmaW5lZFxuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gSGFuZGxlIGFycmF5cyAoY2hpcHMsIG11bHRpLXNlbGVjdClcbiAgaWYgKEFycmF5LmlzQXJyYXkoYSkgJiYgQXJyYXkuaXNBcnJheShiKSkge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gYS5ldmVyeSgodmFsLCBpKSA9PiB2YWwgPT09IGJbaV0pO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBCaW5kcyBjaGFuZ2UgYW5kIGlucHV0IGV2ZW50cyB0byBmaWVsZHNcbiAqIENhbGxzIHRoZSBwcm92aWRlZCBjYWxsYmFjayB3aGVuIGFueSBmaWVsZCBjaGFuZ2VzXG4gKlxuICogTGlzdGVucyB0byBib3RoICdpbnB1dCcgKGZvciBpbW1lZGlhdGUgZmVlZGJhY2sgd2hpbGUgdHlwaW5nKVxuICogYW5kICdjaGFuZ2UnIChmb3IgY29tcG9uZW50cyB0aGF0IG9ubHkgZW1pdCBvbiBibHVyL3NlbGVjdGlvbilcbiAqXG4gKiBEZWR1cGxpY2F0ZXMgZXZlbnRzIHRvIHByZXZlbnQgZG91YmxlLWZpcmluZyB3aGVuIGJvdGggaW5wdXQgYW5kIGNoYW5nZVxuICogZW1pdCBmb3IgdGhlIHNhbWUgdmFsdWUgKGUuZy4sIHRleHRmaWVsZCBpbnB1dCBmb2xsb3dlZCBieSBibHVyKVxuICovXG4vKipcbiAqIFRyYWNrcyBsYXN0IGVtaXR0ZWQgdmFsdWVzIHBlciBmaWVsZCBmb3IgZGVkdXBsaWNhdGlvblxuICogRXhwb3NlZCBzbyB0aGF0IHNldERhdGEgY2FuIHVwZGF0ZSBpdCB3aGVuIHNldHRpbmcgdmFsdWVzIHNpbGVudGx5XG4gKi9cbmxldCBmaWVsZFZhbHVlVHJhY2tlcjogTWFwPHN0cmluZywgRmllbGRWYWx1ZT4gfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBVcGRhdGVzIHRoZSB0cmFja2VkIHZhbHVlIGZvciBhIGZpZWxkXG4gKiBDYWxsZWQgd2hlbiBzZXREYXRhIGlzIHVzZWQgd2l0aCBzaWxlbnQ9dHJ1ZSB0byBrZWVwIGRlZHVwbGljYXRpb24gaW4gc3luY1xuICovXG5leHBvcnQgY29uc3QgdXBkYXRlVHJhY2tlZEZpZWxkVmFsdWUgPSAoXG4gIG5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IEZpZWxkVmFsdWUsXG4pOiB2b2lkID0+IHtcbiAgaWYgKGZpZWxkVmFsdWVUcmFja2VyKSB7XG4gICAgZmllbGRWYWx1ZVRyYWNrZXIuc2V0KG5hbWUsIHZhbHVlKTtcbiAgfVxufTtcblxuLyoqXG4gKiBVcGRhdGVzIGFsbCB0cmFja2VkIGZpZWxkIHZhbHVlcyBmcm9tIGEgZmllbGRzIHJlZ2lzdHJ5XG4gKiBDYWxsZWQgYWZ0ZXIgc2lsZW50IHNldERhdGEgdG8gc3luYyBkZWR1cGxpY2F0aW9uIHN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBzeW5jVHJhY2tlZEZpZWxkVmFsdWVzID0gKGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnkpOiB2b2lkID0+IHtcbiAgaWYgKGZpZWxkVmFsdWVUcmFja2VyKSB7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgZmllbGRdIG9mIGZpZWxkcykge1xuICAgICAgZmllbGRWYWx1ZVRyYWNrZXIuc2V0KG5hbWUsIGdldEZpZWxkVmFsdWUoZmllbGQpKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUmVzZXRzIHRoZSBmaWVsZCB2YWx1ZSB0cmFja2VyIGZvciBhIG5ldyBmb3JtXG4gKiBTaG91bGQgYmUgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiB3aXRoRmllbGRzIGJlZm9yZSBiaW5kRmllbGRFdmVudHNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlc2V0RmllbGRWYWx1ZVRyYWNrZXIgPSAoKTogdm9pZCA9PiB7XG4gIGZpZWxkVmFsdWVUcmFja2VyID0gbmV3IE1hcDxzdHJpbmcsIEZpZWxkVmFsdWU+KCk7XG59O1xuXG5jb25zdCBiaW5kRmllbGRFdmVudHMgPSAoXG4gIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnksXG4gIG9uRmllbGRDaGFuZ2U6IChuYW1lOiBzdHJpbmcsIHZhbHVlOiBGaWVsZFZhbHVlKSA9PiB2b2lkLFxuKTogdm9pZCA9PiB7XG4gIC8vIFVzZSB0aGUgc2hhcmVkIHRyYWNrZXIgKHNob3VsZCBiZSBpbml0aWFsaXplZCBieSByZXNldEZpZWxkVmFsdWVUcmFja2VyIGJlZm9yZSB0aGlzKVxuICBpZiAoIWZpZWxkVmFsdWVUcmFja2VyKSB7XG4gICAgZmllbGRWYWx1ZVRyYWNrZXIgPSBuZXcgTWFwPHN0cmluZywgRmllbGRWYWx1ZT4oKTtcbiAgfVxuXG4gIGNvbnN0IGxhc3RFbWl0dGVkVmFsdWVzID0gZmllbGRWYWx1ZVRyYWNrZXI7XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgZmllbGRdIG9mIGZpZWxkcykge1xuICAgIGlmICh0eXBlb2YgZmllbGQub24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIGN1cnJlbnQgdmFsdWVcbiAgICAgIGxhc3RFbWl0dGVkVmFsdWVzLnNldChuYW1lLCBnZXRGaWVsZFZhbHVlKGZpZWxkKSk7XG5cbiAgICAgIC8vIEhhbmRsZXIgdGhhdCBkZWR1cGVzIGJhc2VkIG9uIHZhbHVlXG4gICAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0RmllbGRWYWx1ZShmaWVsZCk7XG4gICAgICAgIGNvbnN0IGxhc3RWYWx1ZSA9IGxhc3RFbWl0dGVkVmFsdWVzLmdldChuYW1lKTtcblxuICAgICAgICAvLyBPbmx5IGVtaXQgaWYgdmFsdWUgYWN0dWFsbHkgY2hhbmdlZFxuICAgICAgICBpZiAoIXZhbHVlc0VxdWFsKHZhbHVlLCBsYXN0VmFsdWUpKSB7XG4gICAgICAgICAgbGFzdEVtaXR0ZWRWYWx1ZXMuc2V0KG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICBvbkZpZWxkQ2hhbmdlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gTGlzdGVuIHRvICdpbnB1dCcgZm9yIGltbWVkaWF0ZSBmZWVkYmFjayAodGV4dGZpZWxkcyBlbWl0IHRoaXMgb24gZXZlcnkga2V5c3Ryb2tlKVxuICAgICAgZmllbGQub24oXCJpbnB1dFwiLCBoYW5kbGVDaGFuZ2UpO1xuXG4gICAgICAvLyBBbHNvIGxpc3RlbiB0byAnY2hhbmdlJyBmb3IgY29tcG9uZW50cyB0aGF0IG9ubHkgZW1pdCBvbiBibHVyL3NlbGVjdGlvblxuICAgICAgLy8gKGUuZy4sIHNlbGVjdCwgY2hpcHMsIHN3aXRjaClcbiAgICAgIGZpZWxkLm9uKFwiY2hhbmdlXCIsIGhhbmRsZUNoYW5nZSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIHdpdGhGaWVsZHMgZmVhdHVyZVxuICogQWRkcyBmaWVsZCBleHRyYWN0aW9uIGFuZCByZWdpc3RyeSBtYW5hZ2VtZW50IHRvIHRoZSBmb3JtXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoRmllbGRzID0gKGNvbmZpZzogRm9ybUNvbmZpZykgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBCYXNlRm9ybUNvbXBvbmVudD4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUICYge1xuICAgIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnk7XG4gICAgZmlsZXM6IEZvcm1GaWVsZFJlZ2lzdHJ5O1xuICAgIGdldEZpZWxkOiAobmFtZTogc3RyaW5nKSA9PiBGb3JtRmllbGQgfCB1bmRlZmluZWQ7XG4gICAgZ2V0RmllbGROYW1lczogKCkgPT4gc3RyaW5nW107XG4gICAgaGFzRmllbGQ6IChuYW1lOiBzdHJpbmcpID0+IGJvb2xlYW47XG4gIH0gPT4ge1xuICAgIC8vIEV4dHJhY3QgZmllbGRzIGZyb20gVUkgcmVnaXN0cnlcbiAgICBjb25zdCB7IGZpZWxkcywgZmlsZXMgfSA9IGV4dHJhY3RGaWVsZHMoY29tcG9uZW50LnVpIHx8IHt9LCBjb25maWcpO1xuXG4gICAgLy8gUmVzZXQgdHJhY2tlciBmb3IgdGhpcyBuZXcgZm9ybSBpbnN0YW5jZVxuICAgIC8vIFRoaXMgZW5zdXJlcyBlYWNoIGZvcm0gaGFzIGl0cyBvd24gdHJhY2tlciBhbmQgcHJldmVudHMgY3Jvc3MtZm9ybSBpbnRlcmZlcmVuY2VcbiAgICByZXNldEZpZWxkVmFsdWVUcmFja2VyKCk7XG5cbiAgICAvLyBCaW5kIGNoYW5nZSBldmVudHMgaWYgY29tcG9uZW50IGhhcyBlbWl0XG4gICAgaWYgKGNvbXBvbmVudC5lbWl0KSB7XG4gICAgICBiaW5kRmllbGRFdmVudHMoZmllbGRzLCAobmFtZSwgdmFsdWUpID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImZpZWxkOmNoYW5nZVwiLCB7IG5hbWUsIHZhbHVlIH0pO1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY2hhbmdlXCIsIHsgbmFtZSwgdmFsdWUgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gQWxzbyBiaW5kIGNoYW5nZSBldmVudHMgdG8gZmlsZSBmaWVsZHNcbiAgICAgIGJpbmRGaWVsZEV2ZW50cyhmaWxlcywgKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJmaWxlOmNoYW5nZVwiLCB7IG5hbWUsIHZhbHVlIH0pO1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY2hhbmdlXCIsIHsgbmFtZSwgdmFsdWUgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgZmllbGRzLFxuICAgICAgZmlsZXMsXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGEgZmllbGQgY29tcG9uZW50IGJ5IG5hbWVcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGQobmFtZTogc3RyaW5nKTogRm9ybUZpZWxkIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkcy5nZXQobmFtZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhbGwgZmllbGQgbmFtZXNcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGROYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGZpZWxkcy5rZXlzKCkpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDaGVjayBpZiBhIGZpZWxkIGV4aXN0c1xuICAgICAgICovXG4gICAgICBoYXNGaWVsZChuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkcy5oYXMobmFtZSk7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoRmllbGRzO1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2RhdGEudHNcblxuLyoqXG4gKiBEYXRhIGZlYXR1cmUgZm9yIEZvcm0gY29tcG9uZW50XG4gKiBIYW5kbGVzIGZvcm0gZGF0YSBvcGVyYXRpb25zOiBnZXQvc2V0IGRhdGEsIGNoYW5nZSB0cmFja2luZywgc25hcHNob3RzLFxuICogYW5kIGNoYW5nZSBwcm90ZWN0aW9uIChiZWZvcmV1bmxvYWQgd2FybmluZywgZGF0YSBjb25mbGljdCBkZXRlY3Rpb24pXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGb3JtQ29uZmlnLFxuICBCYXNlRm9ybUNvbXBvbmVudCxcbiAgRm9ybURhdGEsXG4gIEZvcm1TdGF0ZSxcbiAgRmllbGRWYWx1ZSxcbiAgRm9ybUZpZWxkUmVnaXN0cnksXG4gIFByb3RlY3RDaGFuZ2VzQ29uZmlnLFxuICBEYXRhQ29uZmxpY3RFdmVudCxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVJbml0aWFsU3RhdGUsXG4gIGhhc0RhdGFDaGFuZ2VkLFxuICBnZXRNb2RpZmllZEZpZWxkcyxcbn0gZnJvbSBcIi4uL2NvbmZpZ1wiO1xuaW1wb3J0IHsgZ2V0RmllbGRWYWx1ZSwgc2V0RmllbGRWYWx1ZSwgc3luY1RyYWNrZWRGaWVsZFZhbHVlcyB9IGZyb20gXCIuL2ZpZWxkc1wiO1xuaW1wb3J0IHsgRk9STV9FVkVOVFMsIERBVEFfU1RBVEUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQ29sbGVjdHMgY3VycmVudCB2YWx1ZXMgZnJvbSBhbGwgZmllbGRzXG4gKi9cbmNvbnN0IGNvbGxlY3RGaWVsZERhdGEgPSAoZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeSk6IEZvcm1EYXRhID0+IHtcbiAgY29uc3QgZGF0YTogRm9ybURhdGEgPSB7fTtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBmaWVsZF0gb2YgZmllbGRzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBnZXRGaWVsZFZhbHVlKGZpZWxkKTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZGF0YVtuYW1lXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufTtcblxuLyoqXG4gKiBTZXRzIHZhbHVlcyBvbiBmaWVsZHMgZnJvbSBhIGRhdGEgb2JqZWN0XG4gKiBTdXBwb3J0cyBkb3Qgbm90YXRpb24gZm9yIG5lc3RlZCB2YWx1ZXMgKGUuZy4sIHsgJ3VzZXIubmFtZSc6ICdKb2huJyB9KVxuICovXG5jb25zdCBzZXRGaWVsZHNEYXRhID0gKFxuICBmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5LFxuICBkYXRhOiBGb3JtRGF0YSxcbiAgc2lsZW50OiBib29sZWFuID0gZmFsc2UsXG4pOiB2b2lkID0+IHtcbiAgZm9yIChjb25zdCBbbmFtZSwgZmllbGRdIG9mIGZpZWxkcykge1xuICAgIC8vIENoZWNrIGZvciBleGFjdCBtYXRjaCBmaXJzdFxuICAgIGlmIChuYW1lIGluIGRhdGEpIHtcbiAgICAgIHNldEZpZWxkVmFsdWUoZmllbGQsIGRhdGFbbmFtZV0sIHNpbGVudCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgbmVzdGVkIHZhbHVlIHVzaW5nIGRvdCBub3RhdGlvblxuICAgIC8vIGUuZy4sIGZpZWxkIG5hbWUgJ3VzZXJuYW1lJyBtaWdodCBiZSBpbiBkYXRhIGFzIG5lc3RlZCB7IGluZm86IHsgdXNlcm5hbWU6ICd2YWx1ZScgfSB9XG4gICAgY29uc3QgdmFsdWUgPSBnZXROZXN0ZWRWYWx1ZShkYXRhLCBuYW1lKTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2V0RmllbGRWYWx1ZShmaWVsZCwgdmFsdWUgYXMgRmllbGRWYWx1ZSwgc2lsZW50KTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogR2V0cyBhIG5lc3RlZCB2YWx1ZSBmcm9tIGFuIG9iamVjdCB1c2luZyBkb3Qgbm90YXRpb25cbiAqL1xuY29uc3QgZ2V0TmVzdGVkVmFsdWUgPSAoXG4gIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHBhdGg6IHN0cmluZyxcbik6IHVua25vd24gPT4ge1xuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIuXCIpO1xuICBsZXQgY3VycmVudDogdW5rbm93biA9IG9iajtcblxuICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY3VycmVudCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY3VycmVudCA9IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtwYXJ0XTtcbiAgfVxuXG4gIHJldHVybiBjdXJyZW50O1xufTtcblxuLyoqXG4gKiBTZXRzIGEgbmVzdGVkIHZhbHVlIGluIGFuIG9iamVjdCB1c2luZyBkb3Qgbm90YXRpb25cbiAqL1xuY29uc3Qgc2V0TmVzdGVkVmFsdWUgPSAoXG4gIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHBhdGg6IHN0cmluZyxcbiAgdmFsdWU6IHVua25vd24sXG4pOiB2b2lkID0+IHtcbiAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcbiAgbGV0IGN1cnJlbnQgPSBvYmo7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XG4gICAgaWYgKCEocGFydCBpbiBjdXJyZW50KSB8fCB0eXBlb2YgY3VycmVudFtwYXJ0XSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgY3VycmVudFtwYXJ0XSA9IHt9O1xuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0XSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIGN1cnJlbnRbcGFydHNbcGFydHMubGVuZ3RoIC0gMV1dID0gdmFsdWU7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGZsYXQgZmllbGQgZGF0YSB0byBuZXN0ZWQgb2JqZWN0IHN0cnVjdHVyZVxuICogZS5nLiwgeyAndXNlci5uYW1lJzogJ0pvaG4nIH0gLT4geyB1c2VyOiB7IG5hbWU6ICdKb2huJyB9IH1cbiAqL1xuY29uc3QgZmxhdFRvTmVzdGVkID0gKGRhdGE6IEZvcm1EYXRhKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGF0YSkpIHtcbiAgICBpZiAoa2V5LmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgc2V0TmVzdGVkVmFsdWUocmVzdWx0LCBrZXksIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBOb3JtYWxpemVzIHByb3RlY3Rpb24gY29uZmlnIHRvIGEgY29uc2lzdGVudCBvYmplY3QgZm9ybWF0XG4gKi9cbmNvbnN0IG5vcm1hbGl6ZVByb3RlY3RDb25maWcgPSAoXG4gIGNvbmZpZzogYm9vbGVhbiB8IFByb3RlY3RDaGFuZ2VzQ29uZmlnIHwgdW5kZWZpbmVkLFxuKTogUHJvdGVjdENoYW5nZXNDb25maWcgPT4ge1xuICBpZiAoIWNvbmZpZykge1xuICAgIHJldHVybiB7IGJlZm9yZVVubG9hZDogZmFsc2UsIG9uRGF0YU92ZXJ3cml0ZTogZmFsc2UgfTtcbiAgfVxuICBpZiAoY29uZmlnID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHsgYmVmb3JlVW5sb2FkOiB0cnVlLCBvbkRhdGFPdmVyd3JpdGU6IHRydWUgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGJlZm9yZVVubG9hZDogY29uZmlnLmJlZm9yZVVubG9hZCA/PyBmYWxzZSxcbiAgICBvbkRhdGFPdmVyd3JpdGU6IGNvbmZpZy5vbkRhdGFPdmVyd3JpdGUgPz8gZmFsc2UsXG4gIH07XG59O1xuXG4vKipcbiAqIHdpdGhEYXRhIGZlYXR1cmVcbiAqIEFkZHMgZGF0YSBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyB0byB0aGUgZm9ybVxuICovXG5leHBvcnQgY29uc3Qgd2l0aERhdGEgPSAoY29uZmlnOiBGb3JtQ29uZmlnKSA9PiB7XG4gIHJldHVybiA8XG4gICAgVCBleHRlbmRzIEJhc2VGb3JtQ29tcG9uZW50ICYge1xuICAgICAgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeTtcbiAgICAgIGVtaXQ/OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgfSxcbiAgPihcbiAgICBjb21wb25lbnQ6IFQsXG4gICk6IFQgJiB7XG4gICAgc3RhdGU6IEZvcm1TdGF0ZTtcbiAgICBnZXREYXRhOiAoKSA9PiBGb3JtRGF0YTtcbiAgICBzZXREYXRhOiAoZGF0YTogRm9ybURhdGEsIHNpbGVudD86IGJvb2xlYW4pID0+IHZvaWQ7XG4gICAgZ2V0RmllbGRWYWx1ZTogKG5hbWU6IHN0cmluZykgPT4gRmllbGRWYWx1ZTtcbiAgICBzZXRGaWVsZFZhbHVlOiAobmFtZTogc3RyaW5nLCB2YWx1ZTogRmllbGRWYWx1ZSwgc2lsZW50PzogYm9vbGVhbikgPT4gdm9pZDtcbiAgICBpc01vZGlmaWVkOiAoKSA9PiBib29sZWFuO1xuICAgIGdldE1vZGlmaWVkRGF0YTogKCkgPT4gRm9ybURhdGE7XG4gICAgc25hcHNob3Q6ICgpID0+IHZvaWQ7XG4gICAgcmVzZXQ6IChmb3JjZT86IGJvb2xlYW4pID0+IGJvb2xlYW47XG4gICAgY2xlYXI6IChmb3JjZT86IGJvb2xlYW4pID0+IGJvb2xlYW47XG4gIH0gPT4ge1xuICAgIC8vIEluaXRpYWxpemUgc3RhdGVcbiAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUluaXRpYWxTdGF0ZShjb25maWcpO1xuXG4gICAgLy8gTm9ybWFsaXplIHByb3RlY3Rpb24gY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHByb3RlY3RDb25maWcgPSBub3JtYWxpemVQcm90ZWN0Q29uZmlnKGNvbmZpZy5wcm90ZWN0Q2hhbmdlcyk7XG5cbiAgICAvLyBUcmFjayB0aGUgYmVmb3JldW5sb2FkIGhhbmRsZXIgc28gd2UgY2FuIHJlbW92ZSBpdFxuICAgIGxldCBiZWZvcmVVbmxvYWRIYW5kbGVyOiAoKGU6IEJlZm9yZVVubG9hZEV2ZW50KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogQmVmb3JldW5sb2FkIGhhbmRsZXIgLSB3YXJucyB1c2VyIHdoZW4gbGVhdmluZyB3aXRoIHVuc2F2ZWQgY2hhbmdlc1xuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUJlZm9yZVVubG9hZCA9IChlOiBCZWZvcmVVbmxvYWRFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHN0YXRlLm1vZGlmaWVkKSB7XG4gICAgICAgIC8vIFN0YW5kYXJkIHdheSB0byB0cmlnZ2VyIHRoZSBicm93c2VyJ3MgXCJ1bnNhdmVkIGNoYW5nZXNcIiBkaWFsb2dcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAvLyBGb3Igb2xkZXIgYnJvd3NlcnMgLSByZXR1cm5WYWx1ZSBtdXN0IGJlIHNldFxuICAgICAgICBlLnJldHVyblZhbHVlID0gXCJcIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIHRoZSBiZWZvcmV1bmxvYWQgaGFuZGxlciBpZiBwcm90ZWN0aW9uIGlzIGVuYWJsZWRcbiAgICAgKi9cbiAgICBjb25zdCByZWdpc3RlckJlZm9yZVVubG9hZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChwcm90ZWN0Q29uZmlnLmJlZm9yZVVubG9hZCAmJiAhYmVmb3JlVW5sb2FkSGFuZGxlcikge1xuICAgICAgICBiZWZvcmVVbmxvYWRIYW5kbGVyID0gaGFuZGxlQmVmb3JlVW5sb2FkO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZXVubG9hZFwiLCBiZWZvcmVVbmxvYWRIYW5kbGVyKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVW5yZWdpc3RlcnMgdGhlIGJlZm9yZXVubG9hZCBoYW5kbGVyXG4gICAgICovXG4gICAgY29uc3QgdW5yZWdpc3RlckJlZm9yZVVubG9hZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChiZWZvcmVVbmxvYWRIYW5kbGVyKSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsIGJlZm9yZVVubG9hZEhhbmRsZXIpO1xuICAgICAgICBiZWZvcmVVbmxvYWRIYW5kbGVyID0gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBiZWZvcmV1bmxvYWQgcmVnaXN0cmF0aW9uIGJhc2VkIG9uIG1vZGlmaWVkIHN0YXRlXG4gICAgICovXG4gICAgY29uc3QgdXBkYXRlQmVmb3JlVW5sb2FkU3RhdGUgPSAobW9kaWZpZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICAgIGlmIChwcm90ZWN0Q29uZmlnLmJlZm9yZVVubG9hZCkge1xuICAgICAgICBpZiAobW9kaWZpZWQpIHtcbiAgICAgICAgICByZWdpc3RlckJlZm9yZVVubG9hZCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIGtlZXAgdGhlIGhhbmRsZXIgcmVnaXN0ZXJlZCBidXQgaXQgb25seSBwcmV2ZW50cyB1bmxvYWQgd2hlbiBtb2RpZmllZFxuICAgICAgICAvLyBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gY29uc3RhbnRseSBhZGRpbmcvcmVtb3ZpbmcgdGhlIGxpc3RlbmVyXG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIElmIGluaXRpYWwgZGF0YSB3YXMgcHJvdmlkZWQsIHNldCBpdCBvbiBmaWVsZHNcbiAgICBpZiAoY29uZmlnLmRhdGEgJiYgY29tcG9uZW50LmZpZWxkcykge1xuICAgICAgc2V0RmllbGRzRGF0YShjb21wb25lbnQuZmllbGRzLCBjb25maWcuZGF0YSwgdHJ1ZSk7XG4gICAgICBzdGF0ZS5jdXJyZW50RGF0YSA9IGNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcyk7XG4gICAgICBzdGF0ZS5pbml0aWFsRGF0YSA9IHsgLi4uc3RhdGUuY3VycmVudERhdGEgfTtcbiAgICAgIC8vIFN5bmMgdGhlIGZpZWxkIHZhbHVlIHRyYWNrZXIgZm9yIGV2ZW50IGRlZHVwbGljYXRpb25cbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBjaGFuZ2UgZGV0ZWN0aW9uIHdvcmtzIGNvcnJlY3RseSB3aGVuIGZpZWxkcyBhcmUgbW9kaWZpZWRcbiAgICAgIHN5bmNUcmFja2VkRmllbGRWYWx1ZXMoY29tcG9uZW50LmZpZWxkcyk7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBiZWZvcmV1bmxvYWQgcHJvdGVjdGlvbiBpZiBlbmFibGVkXG4gICAgaWYgKHByb3RlY3RDb25maWcuYmVmb3JlVW5sb2FkKSB7XG4gICAgICByZWdpc3RlckJlZm9yZVVubG9hZCgpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZXIgZm9yIGZpZWxkL2ZpbGUgY2hhbmdlcyB0byB1cGRhdGUgc3RhdGVcbiAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoZXZlbnQ6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogRmllbGRWYWx1ZSB9KSA9PiB7XG4gICAgICBzdGF0ZS5jdXJyZW50RGF0YVtldmVudC5uYW1lXSA9IGV2ZW50LnZhbHVlO1xuICAgICAgY29uc3Qgd2FzTW9kaWZpZWQgPSBzdGF0ZS5tb2RpZmllZDtcbiAgICAgIHN0YXRlLm1vZGlmaWVkID0gaGFzRGF0YUNoYW5nZWQoc3RhdGUuaW5pdGlhbERhdGEsIHN0YXRlLmN1cnJlbnREYXRhKTtcblxuICAgICAgLy8gVXBkYXRlIGJlZm9yZXVubG9hZCBzdGF0ZSB3aGVuIG1vZGlmaWVkIGNoYW5nZXNcbiAgICAgIGlmICh3YXNNb2RpZmllZCAhPT0gc3RhdGUubW9kaWZpZWQpIHtcbiAgICAgICAgdXBkYXRlQmVmb3JlVW5sb2FkU3RhdGUoc3RhdGUubW9kaWZpZWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBFbWl0IHN0YXRlOmNoYW5nZSBldmVudCB3aGVuIG1vZGlmaWVkIHN0YXRlIGNoYW5nZXNcbiAgICAgIC8vIFRoaXMgYWxsb3dzIHRoZSBjb250cm9sbGVyIHRvIGVuYWJsZS9kaXNhYmxlIGNvbnRyb2xzIGFjY29yZGluZ2x5XG4gICAgICBpZiAod2FzTW9kaWZpZWQgIT09IHN0YXRlLm1vZGlmaWVkKSB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuU1RBVEVfQ0hBTkdFLCB7XG4gICAgICAgICAgbW9kaWZpZWQ6IHN0YXRlLm1vZGlmaWVkLFxuICAgICAgICAgIHN0YXRlOiBzdGF0ZS5tb2RpZmllZCA/IERBVEFfU1RBVEUuRElSVFkgOiBEQVRBX1NUQVRFLlBSSVNUSU5FLFxuICAgICAgICAgIG5hbWU6IGV2ZW50Lm5hbWUsXG4gICAgICAgICAgdmFsdWU6IGV2ZW50LnZhbHVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gTGlzdGVuIGZvciBmaWVsZCBjaGFuZ2VzIHRvIHVwZGF0ZSBzdGF0ZVxuICAgIGlmIChjb21wb25lbnQub24pIHtcbiAgICAgIGNvbXBvbmVudC5vbihcImZpZWxkOmNoYW5nZVwiLCBoYW5kbGVDaGFuZ2UpO1xuICAgICAgLy8gQWxzbyBsaXN0ZW4gZm9yIGZpbGUgY2hhbmdlc1xuICAgICAgY29tcG9uZW50Lm9uKFwiZmlsZTpjaGFuZ2VcIiwgaGFuZGxlQ2hhbmdlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBwZXJmb3JtIHRoZSBhY3R1YWwgc2V0RGF0YSBvcGVyYXRpb25cbiAgICAgKi9cbiAgICBjb25zdCBwZXJmb3JtU2V0RGF0YSA9IChkYXRhOiBGb3JtRGF0YSwgc2lsZW50OiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgICBzZXRGaWVsZHNEYXRhKGNvbXBvbmVudC5maWVsZHMsIGRhdGEsIHNpbGVudCk7XG4gICAgICBzdGF0ZS5jdXJyZW50RGF0YSA9IGNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcyk7XG5cbiAgICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgLy8gV2hlbiBzZXR0aW5nIGRhdGEgc2lsZW50bHksIGFsc28gdXBkYXRlIGluaXRpYWwgZGF0YSBzbmFwc2hvdFxuICAgICAgICAvLyBUaGlzIGlzIHR5cGljYWxseSB1c2VkIHdoZW4gbG9hZGluZyBkYXRhIGZyb20gc2VydmVyXG4gICAgICAgIHN0YXRlLmluaXRpYWxEYXRhID0geyAuLi5zdGF0ZS5jdXJyZW50RGF0YSB9O1xuICAgICAgICBzdGF0ZS5tb2RpZmllZCA9IGZhbHNlO1xuICAgICAgICAvLyBTeW5jIHRoZSBmaWVsZCB2YWx1ZSB0cmFja2VyIGZvciBldmVudCBkZWR1cGxpY2F0aW9uXG4gICAgICAgIHN5bmNUcmFja2VkRmllbGRWYWx1ZXMoY29tcG9uZW50LmZpZWxkcyk7XG4gICAgICAgIC8vIFVwZGF0ZSBiZWZvcmV1bmxvYWQgc3RhdGUgc2luY2Ugd2UncmUgbm8gbG9uZ2VyIG1vZGlmaWVkXG4gICAgICAgIHVwZGF0ZUJlZm9yZVVubG9hZFN0YXRlKGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuREFUQV9TRVQsIHN0YXRlLmN1cnJlbnREYXRhKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgYWN0dWFsIHJlc2V0IG9wZXJhdGlvblxuICAgICAqL1xuICAgIGNvbnN0IHBlcmZvcm1SZXNldCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHNldEZpZWxkc0RhdGEoY29tcG9uZW50LmZpZWxkcywgc3RhdGUuaW5pdGlhbERhdGEsIHRydWUpO1xuICAgICAgc3RhdGUuY3VycmVudERhdGEgPSB7IC4uLnN0YXRlLmluaXRpYWxEYXRhIH07XG4gICAgICBzdGF0ZS5tb2RpZmllZCA9IGZhbHNlO1xuICAgICAgc3RhdGUuZXJyb3JzID0ge307XG4gICAgICAvLyBVcGRhdGUgYmVmb3JldW5sb2FkIHN0YXRlIHNpbmNlIHdlJ3JlIG5vIGxvbmdlciBtb2RpZmllZFxuICAgICAgdXBkYXRlQmVmb3JlVW5sb2FkU3RhdGUoZmFsc2UpO1xuICAgICAgLy8gRW1pdCBzdGF0ZTpjaGFuZ2Ugc28gcHJvdGVjdGlvbiBvdmVybGF5IGdldHMgcmVtb3ZlZFxuICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5TVEFURV9DSEFOR0UsIHtcbiAgICAgICAgbW9kaWZpZWQ6IGZhbHNlLFxuICAgICAgICBzdGF0ZTogREFUQV9TVEFURS5QUklTVElORSxcbiAgICAgIH0pO1xuICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5SRVNFVCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEludGVybmFsIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIGFjdHVhbCBjbGVhciBvcGVyYXRpb25cbiAgICAgKi9cbiAgICBjb25zdCBwZXJmb3JtQ2xlYXIgPSAoKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBlbXB0eURhdGE6IEZvcm1EYXRhID0ge307XG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgY29tcG9uZW50LmZpZWxkcy5rZXlzKCkpIHtcbiAgICAgICAgZW1wdHlEYXRhW25hbWVdID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHNldEZpZWxkc0RhdGEoY29tcG9uZW50LmZpZWxkcywgZW1wdHlEYXRhLCB0cnVlKTtcbiAgICAgIHN0YXRlLmN1cnJlbnREYXRhID0ge307XG4gICAgICBzdGF0ZS5pbml0aWFsRGF0YSA9IHt9O1xuICAgICAgc3RhdGUubW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgIC8vIFVwZGF0ZSBiZWZvcmV1bmxvYWQgc3RhdGVcbiAgICAgIHVwZGF0ZUJlZm9yZVVubG9hZFN0YXRlKGZhbHNlKTtcbiAgICAgIC8vIEVtaXQgc3RhdGU6Y2hhbmdlIHNvIHByb3RlY3Rpb24gb3ZlcmxheSBnZXRzIHJlbW92ZWRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuU1RBVEVfQ0hBTkdFLCB7XG4gICAgICAgIG1vZGlmaWVkOiBmYWxzZSxcbiAgICAgICAgc3RhdGU6IERBVEFfU1RBVEUuUFJJU1RJTkUsXG4gICAgICB9KTtcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuUkVTRVQpO1xuICAgIH07XG5cbiAgICBjb25zdCBlbmhhbmNlZCA9IHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIHN0YXRlLFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhbGwgZm9ybSBkYXRhXG4gICAgICAgKi9cbiAgICAgIGdldERhdGEoKTogRm9ybURhdGEge1xuICAgICAgICAvLyBBbHdheXMgY29sbGVjdCBmcmVzaCBkYXRhIGZyb20gZmllbGRzXG4gICAgICAgIGNvbnN0IGRhdGEgPSBjb2xsZWN0RmllbGREYXRhKGNvbXBvbmVudC5maWVsZHMpO1xuICAgICAgICBzdGF0ZS5jdXJyZW50RGF0YSA9IGRhdGE7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuREFUQV9HRVQsIGRhdGEpO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IGZvcm0gZGF0YVxuICAgICAgICogQHBhcmFtIGRhdGEgLSBEYXRhIG9iamVjdCB0byBzZXRcbiAgICAgICAqIEBwYXJhbSBzaWxlbnQgLSBJZiB0cnVlLCBkb24ndCBlbWl0IGNoYW5nZSBldmVudHMgYW5kIHVwZGF0ZSBpbml0aWFsIHN0YXRlXG4gICAgICAgKlxuICAgICAgICogV2hlbiBwcm90ZWN0Q2hhbmdlcy5vbkRhdGFPdmVyd3JpdGUgaXMgZW5hYmxlZCBhbmQgdGhlIGZvcm0gaGFzIHVuc2F2ZWQgY2hhbmdlcyxcbiAgICAgICAqIHRoaXMgd2lsbCBlbWl0IGEgJ2RhdGE6Y29uZmxpY3QnIGV2ZW50LiBUaGUgZXZlbnQgaGFuZGxlciBjYW4gY2FsbCBjYW5jZWwoKVxuICAgICAgICogdG8gcHJldmVudCB0aGUgZGF0YSBmcm9tIGJlaW5nIHNldCwgb3IgbGV0IGl0IHByb2NlZWQgYnkgZGVmYXVsdC5cbiAgICAgICAqL1xuICAgICAgc2V0RGF0YShkYXRhOiBGb3JtRGF0YSwgc2lsZW50OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGRhdGEgY29uZmxpY3QgcHJvdGVjdGlvblxuICAgICAgICAvLyBPbmx5IGFwcGxpZXMgd2hlbjpcbiAgICAgICAgLy8gLSBQcm90ZWN0aW9uIGlzIGVuYWJsZWRcbiAgICAgICAgLy8gLSBGb3JtIGhhcyBiZWVuIG1vZGlmaWVkXG4gICAgICAgIC8vIC0gTm90IGEgc2lsZW50IG9wZXJhdGlvbiAoc2lsZW50IGlzIGZvciBsb2FkaW5nIGRhdGEpXG4gICAgICAgIGlmIChwcm90ZWN0Q29uZmlnLm9uRGF0YU92ZXJ3cml0ZSAmJiBzdGF0ZS5tb2RpZmllZCAmJiAhc2lsZW50KSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGNvbmZsaWN0IGV2ZW50XG4gICAgICAgICAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlO1xuICAgICAgICAgIGxldCBwcm9jZWVkZWQgPSBmYWxzZTtcblxuICAgICAgICAgIGNvbnN0IGNvbmZsaWN0RXZlbnQ6IERhdGFDb25mbGljdEV2ZW50ID0ge1xuICAgICAgICAgICAgY3VycmVudERhdGE6IHsgLi4uc3RhdGUuY3VycmVudERhdGEgfSxcbiAgICAgICAgICAgIG5ld0RhdGE6IGRhdGEsXG4gICAgICAgICAgICBjYW5jZWxsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgY2FuY2VsOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGNvbmZsaWN0RXZlbnQuY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcm9jZWVkOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHByb2NlZWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgIHBlcmZvcm1TZXREYXRhKGRhdGEsIHNpbGVudCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBFbWl0IHRoZSBjb25mbGljdCBldmVudFxuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuREFUQV9DT05GTElDVCwgY29uZmxpY3RFdmVudCk7XG5cbiAgICAgICAgICAvLyBJZiBjYW5jZWxsZWQsIGRvbid0IHNldCB0aGUgZGF0YVxuICAgICAgICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiBwcm9jZWVkKCkgd2FzIGNhbGxlZCBpbiB0aGUgaGFuZGxlciwgZGF0YSBpcyBhbHJlYWR5IHNldFxuICAgICAgICAgIGlmIChwcm9jZWVkZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiBuZWl0aGVyIGNhbmNlbCgpIG5vciBwcm9jZWVkKCkgd2FzIGNhbGxlZCwgcHJvY2VlZCBieSBkZWZhdWx0XG4gICAgICAgICAgLy8gVGhpcyBtYWludGFpbnMgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGVyZm9ybSB0aGUgYWN0dWFsIHNldERhdGEgb3BlcmF0aW9uXG4gICAgICAgIHBlcmZvcm1TZXREYXRhKGRhdGEsIHNpbGVudCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhIHNwZWNpZmljIGZpZWxkJ3MgdmFsdWVcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGRWYWx1ZShuYW1lOiBzdHJpbmcpOiBGaWVsZFZhbHVlIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBjb21wb25lbnQuZmllbGRzLmdldChuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgcmV0dXJuIGdldEZpZWxkVmFsdWUoZmllbGQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0ZS5jdXJyZW50RGF0YVtuYW1lXTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IGEgc3BlY2lmaWMgZmllbGQncyB2YWx1ZVxuICAgICAgICovXG4gICAgICBzZXRGaWVsZFZhbHVlKFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHZhbHVlOiBGaWVsZFZhbHVlLFxuICAgICAgICBzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAgICk6IHZvaWQge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGNvbXBvbmVudC5maWVsZHMuZ2V0KG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICBzZXRGaWVsZFZhbHVlKGZpZWxkLCB2YWx1ZSwgc2lsZW50KTtcbiAgICAgICAgICBzdGF0ZS5jdXJyZW50RGF0YVtuYW1lXSA9IHZhbHVlO1xuICAgICAgICAgIHN0YXRlLm1vZGlmaWVkID0gaGFzRGF0YUNoYW5nZWQoc3RhdGUuaW5pdGlhbERhdGEsIHN0YXRlLmN1cnJlbnREYXRhKTtcblxuICAgICAgICAgIC8vIFVwZGF0ZSBiZWZvcmV1bmxvYWQgc3RhdGVcbiAgICAgICAgICB1cGRhdGVCZWZvcmVVbmxvYWRTdGF0ZShzdGF0ZS5tb2RpZmllZCk7XG5cbiAgICAgICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5GSUVMRF9DSEFOR0UsIHsgbmFtZSwgdmFsdWUgfSk7XG4gICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLkNIQU5HRSwgeyBuYW1lLCB2YWx1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgZm9ybSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwgc3RhdGVcbiAgICAgICAqL1xuICAgICAgaXNNb2RpZmllZCgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY3VycmVudERhdGEgPSBjb2xsZWN0RmllbGREYXRhKGNvbXBvbmVudC5maWVsZHMpO1xuICAgICAgICBzdGF0ZS5tb2RpZmllZCA9IGhhc0RhdGFDaGFuZ2VkKHN0YXRlLmluaXRpYWxEYXRhLCBjdXJyZW50RGF0YSk7XG4gICAgICAgIHJldHVybiBzdGF0ZS5tb2RpZmllZDtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IG9ubHkgdGhlIGZpZWxkcyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZFxuICAgICAgICovXG4gICAgICBnZXRNb2RpZmllZERhdGEoKTogRm9ybURhdGEge1xuICAgICAgICBjb25zdCBjdXJyZW50RGF0YSA9IGNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcyk7XG4gICAgICAgIHJldHVybiBnZXRNb2RpZmllZEZpZWxkcyhzdGF0ZS5pbml0aWFsRGF0YSwgY3VycmVudERhdGEpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBUYWtlIGEgc25hcHNob3Qgb2YgY3VycmVudCBkYXRhIGFzIHRoZSBuZXcgYmFzZWxpbmVcbiAgICAgICAqIEZ1dHVyZSBpc01vZGlmaWVkKCkgY2FsbHMgd2lsbCBjb21wYXJlIGFnYWluc3QgdGhpcyBzbmFwc2hvdFxuICAgICAgICovXG4gICAgICBzbmFwc2hvdCgpOiB2b2lkIHtcbiAgICAgICAgc3RhdGUuaW5pdGlhbERhdGEgPSB7IC4uLmNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcykgfTtcbiAgICAgICAgc3RhdGUuY3VycmVudERhdGEgPSB7IC4uLnN0YXRlLmluaXRpYWxEYXRhIH07XG4gICAgICAgIHN0YXRlLm1vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIC8vIFVwZGF0ZSBiZWZvcmV1bmxvYWQgc3RhdGUgc2luY2Ugd2UncmUgbm8gbG9uZ2VyIG1vZGlmaWVkXG4gICAgICAgIHVwZGF0ZUJlZm9yZVVubG9hZFN0YXRlKGZhbHNlKTtcbiAgICAgICAgLy8gRW1pdCBzdGF0ZTpjaGFuZ2Ugc28gcHJvdGVjdGlvbiBvdmVybGF5IGdldHMgcmVtb3ZlZFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLlNUQVRFX0NIQU5HRSwge1xuICAgICAgICAgIG1vZGlmaWVkOiBmYWxzZSxcbiAgICAgICAgICBzdGF0ZTogREFUQV9TVEFURS5QUklTVElORSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlc2V0IGZvcm0gdG8gaW5pdGlhbCBkYXRhIHN0YXRlXG4gICAgICAgKlxuICAgICAgICogTm90ZTogUHJvdGVjdGlvbiBpcyBoYW5kbGVkIGJ5IHRoZSBibG9ja2luZyBvdmVybGF5IGluIHRoZSBwcm90ZWN0aW9uIGZlYXR1cmUuXG4gICAgICAgKiByZXNldCgpIG5vIGxvbmdlciBlbWl0cyBkYXRhOmNvbmZsaWN0IGV2ZW50cyAtIGl0IGp1c3QgcmVzZXRzIHRoZSBmb3JtLlxuICAgICAgICogVXNlIGZvcmNlIHBhcmFtZXRlciBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKGlnbm9yZWQpLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2UgLSBJZ25vcmVkIChrZXB0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSlcbiAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBBbHdheXMgcmV0dXJucyB0cnVlXG4gICAgICAgKi9cbiAgICAgIHJlc2V0KGZvcmNlOiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICAgICAgcGVyZm9ybVJlc2V0KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDbGVhciBhbGwgZm9ybSBmaWVsZHNcbiAgICAgICAqXG4gICAgICAgKiBOb3RlOiBQcm90ZWN0aW9uIGlzIGhhbmRsZWQgYnkgdGhlIGJsb2NraW5nIG92ZXJsYXkgaW4gdGhlIHByb3RlY3Rpb24gZmVhdHVyZS5cbiAgICAgICAqIGNsZWFyKCkgbm8gbG9uZ2VyIGVtaXRzIGRhdGE6Y29uZmxpY3QgZXZlbnRzIC0gaXQganVzdCBjbGVhcnMgdGhlIGZvcm0uXG4gICAgICAgKiBVc2UgZm9yY2UgcGFyYW1ldGVyIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAoaWdub3JlZCkuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtib29sZWFufSBmb3JjZSAtIElnbm9yZWQgKGtlcHQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KVxuICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IEFsd2F5cyByZXR1cm5zIHRydWVcbiAgICAgICAqL1xuICAgICAgY2xlYXIoZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgICAgICBwZXJmb3JtQ2xlYXIoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBSZWdpc3RlciBjbGVhbnVwIGZvciBiZWZvcmV1bmxvYWQgaGFuZGxlciB3aGVuIGNvbXBvbmVudCBpcyBkZXN0cm95ZWRcbiAgICAvLyBXZSBuZWVkIHRvIGhvb2sgaW50byB0aGUgbGlmZWN5Y2xlIGRlc3Ryb3kgbWVjaGFuaXNtXG4gICAgY29uc3Qgb3JpZ2luYWxMaWZlY3ljbGUgPSBjb21wb25lbnQubGlmZWN5Y2xlO1xuICAgIGlmIChvcmlnaW5hbExpZmVjeWNsZSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gb3JpZ2luYWxMaWZlY3ljbGUuZGVzdHJveTtcbiAgICAgIG9yaWdpbmFsTGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGJlZm9yZXVubG9hZCBoYW5kbGVyXG4gICAgICAgIHVucmVnaXN0ZXJCZWZvcmVVbmxvYWQoKTtcbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95XG4gICAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlZDtcbiAgfTtcbn07XG5cbmV4cG9ydCB7IGZsYXRUb05lc3RlZCwgZ2V0TmVzdGVkVmFsdWUsIHNldE5lc3RlZFZhbHVlIH07XG5leHBvcnQgZGVmYXVsdCB3aXRoRGF0YTtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9jb250cm9sbGVyLnRzXG5cbi8qKlxuICogQ29udHJvbGxlciBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogTWFuYWdlcyBjb250cm9sIGJ1dHRvbnMgKHN1Ym1pdC9jYW5jZWwpIGJhc2VkIG9uIGRhdGEgc3RhdGUgKHByaXN0aW5lL2RpcnR5KVxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRm9ybUNvbmZpZyxcbiAgQmFzZUZvcm1Db21wb25lbnQsXG4gIEZvcm1TdGF0ZSxcbiAgRm9ybUZpZWxkUmVnaXN0cnksXG4gIEZvcm1GaWVsZCxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBEQVRBX1NUQVRFLCBGT1JNX0VWRU5UUywgRk9STV9DTEFTU0VTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRk9STV9ERUZBVUxUUyB9IGZyb20gXCIuLi9jb25maWdcIjtcblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBmb3JtJ3Mgc3RhdGUgQ1NTIGNsYXNzXG4gKi9cbmNvbnN0IHVwZGF0ZVN0YXRlQ2xhc3MgPSAoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICBtb2RpZmllZDogYm9vbGVhbixcbiAgcHJlZml4OiBzdHJpbmcsXG4gIGNvbXBvbmVudE5hbWU6IHN0cmluZyxcbik6IHZvaWQgPT4ge1xuICBjb25zdCBtb2RpZmllZENsYXNzID0gYCR7cHJlZml4fS0ke2NvbXBvbmVudE5hbWV9LS0ke0ZPUk1fQ0xBU1NFUy5NT0RJRklFRH1gO1xuICBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUobW9kaWZpZWRDbGFzcywgbW9kaWZpZWQpO1xufTtcblxuLyoqXG4gKiBFbmFibGVzIG9yIGRpc2FibGVzIGFsbCBmb3JtIGZpZWxkc1xuICovXG5jb25zdCBzZXRGaWVsZHNFbmFibGVkID0gKFxuICBmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5LFxuICBlbmFibGVkOiBib29sZWFuLFxuKTogdm9pZCA9PiB7XG4gIGZvciAoY29uc3QgWywgZmllbGRdIG9mIGZpZWxkcykge1xuICAgIGlmIChlbmFibGVkICYmIHR5cGVvZiBmaWVsZC5lbmFibGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgZmllbGQuZW5hYmxlKCk7XG4gICAgfSBlbHNlIGlmICghZW5hYmxlZCAmJiB0eXBlb2YgZmllbGQuZGlzYWJsZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBmaWVsZC5kaXNhYmxlKCk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEdldHMgY29udHJvbCBidXR0b24gY29tcG9uZW50cyBmcm9tIHRoZSBVSSByZWdpc3RyeVxuICovXG5jb25zdCBnZXRDb250cm9sQnV0dG9ucyA9IChcbiAgdWk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBjb250cm9sTmFtZXM6IHN0cmluZ1tdLFxuKTogTWFwPHN0cmluZywgRm9ybUZpZWxkPiA9PiB7XG4gIGNvbnN0IGNvbnRyb2xzID0gbmV3IE1hcDxzdHJpbmcsIEZvcm1GaWVsZD4oKTtcblxuICBmb3IgKGNvbnN0IG5hbWUgb2YgY29udHJvbE5hbWVzKSB7XG4gICAgY29uc3QgY29udHJvbCA9IHVpW25hbWVdO1xuICAgIGlmIChjb250cm9sICYmIHR5cGVvZiBjb250cm9sID09PSBcIm9iamVjdFwiICYmIFwiZWxlbWVudFwiIGluIGNvbnRyb2wpIHtcbiAgICAgIGNvbnRyb2xzLnNldChuYW1lLCBjb250cm9sIGFzIEZvcm1GaWVsZCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbnRyb2xzO1xufTtcblxuLyoqXG4gKiBFbmFibGVzIG9yIGRpc2FibGVzIGNvbnRyb2wgYnV0dG9uc1xuICovXG5jb25zdCBzZXRDb250cm9sc0VuYWJsZWQgPSAoXG4gIGNvbnRyb2xzOiBNYXA8c3RyaW5nLCBGb3JtRmllbGQ+LFxuICBlbmFibGVkOiBib29sZWFuLFxuKTogdm9pZCA9PiB7XG4gIGZvciAoY29uc3QgWywgY29udHJvbF0gb2YgY29udHJvbHMpIHtcbiAgICBpZiAoZW5hYmxlZCAmJiB0eXBlb2YgY29udHJvbC5lbmFibGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29udHJvbC5lbmFibGUoKTtcbiAgICB9IGVsc2UgaWYgKCFlbmFibGVkICYmIHR5cGVvZiBjb250cm9sLmRpc2FibGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29udHJvbC5kaXNhYmxlKCk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIHdpdGhDb250cm9sbGVyIGZlYXR1cmVcbiAqIEFkZHMgY29udHJvbCBidXR0b24gaGFuZGxpbmcgYmFzZWQgb24gZGF0YSBzdGF0ZSAocHJpc3RpbmUvZGlydHkpXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQ29udHJvbGxlciA9IChjb25maWc6IEZvcm1Db25maWcpID0+IHtcbiAgcmV0dXJuIDxcbiAgICBUIGV4dGVuZHMgQmFzZUZvcm1Db21wb25lbnQgJiB7XG4gICAgICBmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5O1xuICAgICAgc3RhdGU6IEZvcm1TdGF0ZTtcbiAgICAgIGVtaXQ/OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgICBvbj86IChldmVudDogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbikgPT4gdm9pZDtcbiAgICB9LFxuICA+KFxuICAgIGNvbXBvbmVudDogVCxcbiAgKTogVCAmIHtcbiAgICBjb250cm9sczogTWFwPHN0cmluZywgRm9ybUZpZWxkPjtcbiAgICBnZXREYXRhU3RhdGU6ICgpID0+IHN0cmluZztcbiAgICBlbmFibGVDb250cm9sczogKCkgPT4gdm9pZDtcbiAgICBkaXNhYmxlQ29udHJvbHM6ICgpID0+IHZvaWQ7XG4gICAgZW5hYmxlRmllbGRzOiAoKSA9PiB2b2lkO1xuICAgIGRpc2FibGVGaWVsZHM6ICgpID0+IHZvaWQ7XG4gIH0gPT4ge1xuICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZy5wcmVmaXggfHwgRk9STV9ERUZBVUxUUy5wcmVmaXg7XG4gICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGNvbmZpZy5jb21wb25lbnROYW1lIHx8IEZPUk1fREVGQVVMVFMuY29tcG9uZW50TmFtZTtcbiAgICBjb25zdCBjb250cm9sTmFtZXMgPSBjb25maWcuY29udHJvbHNcbiAgICAgID8gWy4uLmNvbmZpZy5jb250cm9sc11cbiAgICAgIDogWy4uLkZPUk1fREVGQVVMVFMuY29udHJvbHNdO1xuXG4gICAgLy8gR2V0IGNvbnRyb2wgYnV0dG9ucyBmcm9tIFVJXG4gICAgY29uc3QgY29udHJvbHMgPSBjb250cm9sTmFtZXNcbiAgICAgID8gZ2V0Q29udHJvbEJ1dHRvbnMoY29tcG9uZW50LnVpIHx8IHt9LCBjb250cm9sTmFtZXMpXG4gICAgICA6IG5ldyBNYXA8c3RyaW5nLCBGb3JtRmllbGQ+KCk7XG5cbiAgICAvLyBJbml0aWFsaXplIGNvbnRyb2xzIGFzIGRpc2FibGVkIChwcmlzdGluZSBzdGF0ZSlcbiAgICBpZiAoY29udHJvbHMuc2l6ZSA+IDApIHtcbiAgICAgIHNldENvbnRyb2xzRW5hYmxlZChjb250cm9scywgZmFsc2UpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuaGFuY2VkID0ge1xuICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgY29udHJvbHMsXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGN1cnJlbnQgZGF0YSBzdGF0ZSAocHJpc3RpbmUgb3IgZGlydHkpXG4gICAgICAgKi9cbiAgICAgIGdldERhdGFTdGF0ZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LnN0YXRlLm1vZGlmaWVkXG4gICAgICAgICAgPyBEQVRBX1NUQVRFLkRJUlRZXG4gICAgICAgICAgOiBEQVRBX1NUQVRFLlBSSVNUSU5FO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBFbmFibGUgY29udHJvbCBidXR0b25zXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZUNvbnRyb2xzKCk6IHZvaWQge1xuICAgICAgICBzZXRDb250cm9sc0VuYWJsZWQoY29udHJvbHMsIHRydWUpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBEaXNhYmxlIGNvbnRyb2wgYnV0dG9uc1xuICAgICAgICovXG4gICAgICBkaXNhYmxlQ29udHJvbHMoKTogdm9pZCB7XG4gICAgICAgIHNldENvbnRyb2xzRW5hYmxlZChjb250cm9scywgZmFsc2UpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBFbmFibGUgYWxsIGZvcm0gZmllbGRzXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZUZpZWxkcygpOiB2b2lkIHtcbiAgICAgICAgc2V0RmllbGRzRW5hYmxlZChjb21wb25lbnQuZmllbGRzLCB0cnVlKTtcbiAgICAgICAgY29tcG9uZW50LnN0YXRlLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgYWxsIGZvcm0gZmllbGRzXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVGaWVsZHMoKTogdm9pZCB7XG4gICAgICAgIHNldEZpZWxkc0VuYWJsZWQoY29tcG9uZW50LmZpZWxkcywgZmFsc2UpO1xuICAgICAgICBjb21wb25lbnQuc3RhdGUuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gTGlzdGVuIGZvciBzdGF0ZSBjaGFuZ2VzIHRvIGVuYWJsZS9kaXNhYmxlIGNvbnRyb2xzXG4gICAgaWYgKGNvbmZpZy51c2VDaGFuZ2VzICE9PSBmYWxzZSAmJiBjb21wb25lbnQub24pIHtcbiAgICAgIGNvbXBvbmVudC5vbihcbiAgICAgICAgRk9STV9FVkVOVFMuU1RBVEVfQ0hBTkdFLFxuICAgICAgICAoZXZlbnQ6IHsgbW9kaWZpZWQ6IGJvb2xlYW47IHN0YXRlOiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICAgIGlmIChldmVudC5tb2RpZmllZCkge1xuICAgICAgICAgICAgLy8gRGF0YSBpcyBkaXJ0eSAtIGVuYWJsZSBjb250cm9sc1xuICAgICAgICAgICAgc2V0Q29udHJvbHNFbmFibGVkKGNvbnRyb2xzLCB0cnVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRGF0YSBpcyBwcmlzdGluZSAtIGRpc2FibGUgY29udHJvbHNcbiAgICAgICAgICAgIHNldENvbnRyb2xzRW5hYmxlZChjb250cm9scywgZmFsc2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFVwZGF0ZSBDU1MgY2xhc3NcbiAgICAgICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHVwZGF0ZVN0YXRlQ2xhc3MoXG4gICAgICAgICAgICAgIGNvbXBvbmVudC5lbGVtZW50LFxuICAgICAgICAgICAgICBldmVudC5tb2RpZmllZCxcbiAgICAgICAgICAgICAgcHJlZml4LFxuICAgICAgICAgICAgICBjb21wb25lbnROYW1lLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlZDtcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhDb250cm9sbGVyO1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL3N1Ym1pdC50c1xuXG4vKipcbiAqIFN1Ym1pdCBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogSGFuZGxlcyBmb3JtIHZhbGlkYXRpb24gYW5kIHN1Ym1pc3Npb24gd2l0aCBhdXRvbWF0aWMgZmllbGQgZXJyb3IgZGlzcGxheVxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRm9ybUNvbmZpZyxcbiAgQmFzZUZvcm1Db21wb25lbnQsXG4gIEZvcm1EYXRhLFxuICBGb3JtU3RhdGUsXG4gIEZvcm1GaWVsZFJlZ2lzdHJ5LFxuICBGb3JtRmllbGQsXG4gIEZvcm1WYWxpZGF0aW9uUnVsZSxcbiAgRm9ybVZhbGlkYXRpb25SZXN1bHQsXG4gIEZvcm1TdWJtaXRPcHRpb25zLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IEZPUk1fRVZFTlRTLCBGT1JNX0NMQVNTRVMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogRGVmYXVsdCBoZWFkZXJzIGZvciBKU09OIHJlcXVlc3RzXG4gKi9cbmNvbnN0IERFRkFVTFRfSEVBREVSUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyBmb3JtIGRhdGEgYWdhaW5zdCB2YWxpZGF0aW9uIHJ1bGVzXG4gKi9cbmNvbnN0IHZhbGlkYXRlRGF0YSA9IChcbiAgZGF0YTogRm9ybURhdGEsXG4gIHJ1bGVzOiBGb3JtVmFsaWRhdGlvblJ1bGVbXSxcbik6IEZvcm1WYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgY29uc3QgZXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGxldCB2YWxpZCA9IHRydWU7XG5cbiAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBkYXRhW3J1bGUuZmllbGRdO1xuICAgIGNvbnN0IHJlc3VsdCA9IHJ1bGUudmFsaWRhdGUodmFsdWUsIGRhdGEpO1xuXG4gICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICBlcnJvcnNbcnVsZS5maWVsZF0gPSBydWxlLm1lc3NhZ2UgfHwgYCR7cnVsZS5maWVsZH0gaXMgaW52YWxpZGA7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgZXJyb3JzW3J1bGUuZmllbGRdID0gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHZhbGlkLCBlcnJvcnMgfTtcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgc2luZ2xlIGZpZWxkIGFnYWluc3QgaXRzIHZhbGlkYXRpb24gcnVsZXNcbiAqL1xuY29uc3QgdmFsaWRhdGVGaWVsZCA9IChcbiAgZmllbGROYW1lOiBzdHJpbmcsXG4gIGRhdGE6IEZvcm1EYXRhLFxuICBydWxlczogRm9ybVZhbGlkYXRpb25SdWxlW10sXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBmaWVsZFJ1bGVzID0gcnVsZXMuZmlsdGVyKChydWxlKSA9PiBydWxlLmZpZWxkID09PSBmaWVsZE5hbWUpO1xuXG4gIGZvciAoY29uc3QgcnVsZSBvZiBmaWVsZFJ1bGVzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBkYXRhW3J1bGUuZmllbGRdO1xuICAgIGNvbnN0IHJlc3VsdCA9IHJ1bGUudmFsaWRhdGUodmFsdWUsIGRhdGEpO1xuXG4gICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBydWxlLm1lc3NhZ2UgfHwgYCR7cnVsZS5maWVsZH0gaXMgaW52YWxpZGA7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIHRoZSBhY3R1YWwgSFRUUCByZXF1ZXN0XG4gKi9cbmNvbnN0IHBlcmZvcm1SZXF1ZXN0ID0gYXN5bmMgKFxuICB1cmw6IHN0cmluZyxcbiAgZGF0YTogRm9ybURhdGEsXG4gIG9wdGlvbnM6IEZvcm1TdWJtaXRPcHRpb25zLFxuKTogUHJvbWlzZTx1bmtub3duPiA9PiB7XG4gIGNvbnN0IG1ldGhvZCA9IG9wdGlvbnMubWV0aG9kIHx8IFwiUE9TVFwiO1xuICBjb25zdCBoZWFkZXJzID0geyAuLi5ERUZBVUxUX0hFQURFUlMsIC4uLm9wdGlvbnMuaGVhZGVycyB9O1xuXG4gIGNvbnN0IGZldGNoT3B0aW9uczogUmVxdWVzdEluaXQgPSB7XG4gICAgbWV0aG9kLFxuICAgIGhlYWRlcnMsXG4gIH07XG5cbiAgLy8gQWRkIGJvZHkgZm9yIG5vbi1HRVQgcmVxdWVzdHNcbiAgaWYgKG1ldGhvZCAhPT0gXCJHRVRcIikge1xuICAgIGZldGNoT3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gIH1cblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgZmV0Y2hPcHRpb25zKTtcblxuICAvLyBQYXJzZSByZXNwb25zZVxuICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpO1xuICBsZXQgcmVzdWx0OiB1bmtub3duO1xuXG4gIGlmIChjb250ZW50VHlwZSAmJiBjb250ZW50VHlwZS5pbmNsdWRlcyhcImFwcGxpY2F0aW9uL2pzb25cIikpIHtcbiAgICByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIEhUVFAgZXJyb3JzXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAvLyBUcnkgdG8gZXh0cmFjdCBlcnJvciBtZXNzYWdlIGZyb20gc2VydmVyIHJlc3BvbnNlXG4gICAgbGV0IGVycm9yTWVzc2FnZSA9IGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfTogJHtyZXNwb25zZS5zdGF0dXNUZXh0fWA7XG4gICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBjb25zdCBzZXJ2ZXJFcnJvciA9IChyZXN1bHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmVycm9yO1xuICAgICAgaWYgKHR5cGVvZiBzZXJ2ZXJFcnJvciA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBlcnJvck1lc3NhZ2UgPSBzZXJ2ZXJFcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAoZXJyb3IgYXMgRXJyb3IgJiB7IHJlc3BvbnNlOiB1bmtub3duIH0pLnJlc3BvbnNlID0gcmVzdWx0O1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogd2l0aFN1Ym1pdCBmZWF0dXJlXG4gKiBBZGRzIHZhbGlkYXRpb24gYW5kIHN1Ym1pc3Npb24gY2FwYWJpbGl0aWVzIHRvIHRoZSBmb3JtXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoU3VibWl0ID0gKGNvbmZpZzogRm9ybUNvbmZpZykgPT4ge1xuICByZXR1cm4gPFxuICAgIFQgZXh0ZW5kcyBCYXNlRm9ybUNvbXBvbmVudCAmIHtcbiAgICAgIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnk7XG4gICAgICBzdGF0ZTogRm9ybVN0YXRlO1xuICAgICAgZ2V0RGF0YTogKCkgPT4gRm9ybURhdGE7XG4gICAgICBnZXRNb2RpZmllZERhdGE6ICgpID0+IEZvcm1EYXRhO1xuICAgICAgZW5hYmxlQ29udHJvbHM6ICgpID0+IHZvaWQ7XG4gICAgICBkaXNhYmxlQ29udHJvbHM6ICgpID0+IHZvaWQ7XG4gICAgICBzbmFwc2hvdDogKCkgPT4gdm9pZDtcbiAgICAgIGVtaXQ/OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgICBvbj86IChldmVudDogc3RyaW5nLCBoYW5kbGVyOiAoZGF0YTogdW5rbm93bikgPT4gdm9pZCkgPT4gdm9pZDtcbiAgICB9LFxuICA+KFxuICAgIGNvbXBvbmVudDogVCxcbiAgKTogVCAmIHtcbiAgICB2YWxpZGF0ZTogKCkgPT4gRm9ybVZhbGlkYXRpb25SZXN1bHQ7XG4gICAgdmFsaWRhdGVGaWVsZDogKGZpZWxkTmFtZTogc3RyaW5nKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgc3VibWl0OiAob3B0aW9ucz86IEZvcm1TdWJtaXRPcHRpb25zKSA9PiBQcm9taXNlPHVua25vd24+O1xuICAgIHNldFZhbGlkYXRpb25SdWxlczogKHJ1bGVzOiBGb3JtVmFsaWRhdGlvblJ1bGVbXSkgPT4gdm9pZDtcbiAgICBjbGVhckVycm9yczogKCkgPT4gdm9pZDtcbiAgICBjbGVhckZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nKSA9PiB2b2lkO1xuICAgIHNldEZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nLCBlcnJvcjogc3RyaW5nKSA9PiB2b2lkO1xuICAgIGdldEZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIH0gPT4ge1xuICAgIC8vIFZhbGlkYXRpb24gcnVsZXMgY2FuIGJlIHVwZGF0ZWQgYXQgcnVudGltZVxuICAgIGxldCB2YWxpZGF0aW9uUnVsZXMgPSBjb25maWcudmFsaWRhdGlvbiB8fCBbXTtcblxuICAgIC8vIFdoZXRoZXIgdG8gc2hvdyBlcnJvciBtZXNzYWdlcyBpbiBmaWVsZCBoZWxwZXIgdGV4dCAoZGVmYXVsdDogdHJ1ZSlcbiAgICBjb25zdCBzaG93TWVzc2FnZXMgPSBjb25maWcuc2hvd0ZpZWxkRXJyb3JNZXNzYWdlcyAhPT0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyBvciBjbGVhcnMgZXJyb3Igb24gYSBmaWVsZCBjb21wb25lbnRcbiAgICAgKi9cbiAgICBjb25zdCBzaG93RmllbGRFcnJvciA9IChcbiAgICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgICAgZXJyb3I6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkID0gY29tcG9uZW50LmZpZWxkcy5nZXQoZmllbGROYW1lKSBhcyBGb3JtRmllbGQgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoZmllbGQgJiYgdHlwZW9mIGZpZWxkLnNldEVycm9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgLy8gT25seSBwYXNzIG1lc3NhZ2UgaWYgc2hvd0ZpZWxkRXJyb3JNZXNzYWdlcyBpcyBlbmFibGVkXG4gICAgICAgICAgZmllbGQuc2V0RXJyb3IodHJ1ZSwgc2hvd01lc3NhZ2VzID8gZXJyb3IgOiB1bmRlZmluZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFBhc3MgZW1wdHkgc3RyaW5nIHRvIGFsc28gY2xlYXIgdGhlIGhlbHBlci9zdXBwb3J0aW5nIHRleHQgbWVzc2FnZVxuICAgICAgICAgIGZpZWxkLnNldEVycm9yKGZhbHNlLCBcIlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyBlcnJvcnMgb24gYWxsIGZpZWxkIGNvbXBvbmVudHNcbiAgICAgKi9cbiAgICBjb25zdCBzaG93QWxsRmllbGRFcnJvcnMgPSAoZXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogdm9pZCA9PiB7XG4gICAgICAvLyBDbGVhciBhbGwgZmllbGQgZXJyb3JzIGZpcnN0XG4gICAgICBmb3IgKGNvbnN0IFtmaWVsZE5hbWVdIG9mIGNvbXBvbmVudC5maWVsZHMpIHtcbiAgICAgICAgc2hvd0ZpZWxkRXJyb3IoZmllbGROYW1lLCB1bmRlZmluZWQpO1xuICAgICAgfVxuICAgICAgLy8gU2hvdyBuZXcgZXJyb3JzXG4gICAgICBmb3IgKGNvbnN0IFtmaWVsZE5hbWUsIGVycm9yXSBvZiBPYmplY3QuZW50cmllcyhlcnJvcnMpKSB7XG4gICAgICAgIHNob3dGaWVsZEVycm9yKGZpZWxkTmFtZSwgZXJyb3IpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBMaXN0ZW4gZm9yIGZpZWxkIGNoYW5nZXMgdG8gYXV0by1jbGVhci9yZXZhbGlkYXRlIGVycm9yc1xuICAgIGlmIChjb21wb25lbnQub24pIHtcbiAgICAgIC8vIENsZWFyIHZpc3VhbCBlcnJvcnMgd2hlbiBmb3JtIGlzIHJlc2V0XG4gICAgICBjb21wb25lbnQub24oXCJyZXNldFwiLCAoKSA9PiB7XG4gICAgICAgIHNob3dBbGxGaWVsZEVycm9ycyh7fSk7XG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50Lm9uKFwiZmllbGQ6Y2hhbmdlXCIsIChldmVudDogdW5rbm93bikgPT4ge1xuICAgICAgICBjb25zdCB7IG5hbWUgfSA9IGV2ZW50IGFzIHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9O1xuXG4gICAgICAgIC8vIElmIHRoaXMgZmllbGQgaGFkIGFuIGVycm9yLCByZS12YWxpZGF0ZSBpdFxuICAgICAgICBpZiAoY29tcG9uZW50LnN0YXRlLmVycm9yc1tuYW1lXSkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBjb21wb25lbnQuZ2V0RGF0YSgpO1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdGVGaWVsZChuYW1lLCBkYXRhLCB2YWxpZGF0aW9uUnVsZXMpO1xuXG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBTdGlsbCBoYXMgZXJyb3IgLSB1cGRhdGUgbWVzc2FnZVxuICAgICAgICAgICAgY29tcG9uZW50LnN0YXRlLmVycm9yc1tuYW1lXSA9IGVycm9yO1xuICAgICAgICAgICAgc2hvd0ZpZWxkRXJyb3IobmFtZSwgZXJyb3IpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGaWVsZCBpcyBub3cgdmFsaWQgLSBjbGVhciBlcnJvclxuICAgICAgICAgICAgZGVsZXRlIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnNbbmFtZV07XG4gICAgICAgICAgICBzaG93RmllbGRFcnJvcihuYW1lLCB1bmRlZmluZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5oYW5jZWQgPSB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIC8qKlxuICAgICAgICogVmFsaWRhdGUgZm9ybSBkYXRhIGFnYWluc3QgY29uZmlndXJlZCBydWxlc1xuICAgICAgICogQXV0b21hdGljYWxseSBzaG93cyBlcnJvcnMgb24gZmllbGQgY29tcG9uZW50c1xuICAgICAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCB2YWxpZCBmbGFnIGFuZCBlcnJvcnMgb2JqZWN0XG4gICAgICAgKi9cbiAgICAgIHZhbGlkYXRlKCk6IEZvcm1WYWxpZGF0aW9uUmVzdWx0IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbGlkYXRlRGF0YShkYXRhLCB2YWxpZGF0aW9uUnVsZXMpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzdGF0ZSB3aXRoIHZhbGlkYXRpb24gZXJyb3JzXG4gICAgICAgIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnMgPSByZXN1bHQuZXJyb3JzO1xuXG4gICAgICAgIC8vIFNob3cgZXJyb3JzIG9uIGZpZWxkIGNvbXBvbmVudHNcbiAgICAgICAgc2hvd0FsbEZpZWxkRXJyb3JzKHJlc3VsdC5lcnJvcnMpO1xuXG4gICAgICAgIC8vIEVtaXQgdmFsaWRhdGlvbiBldmVudCBpZiB0aGVyZSBhcmUgZXJyb3JzXG4gICAgICAgIGlmICghcmVzdWx0LnZhbGlkKSB7XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5WQUxJREFUSU9OX0VSUk9SLCByZXN1bHQuZXJyb3JzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFZhbGlkYXRlIGEgc2luZ2xlIGZpZWxkXG4gICAgICAgKiBAcmV0dXJucyBFcnJvciBtZXNzYWdlIGlmIGludmFsaWQsIHVuZGVmaW5lZCBpZiB2YWxpZFxuICAgICAgICovXG4gICAgICB2YWxpZGF0ZUZpZWxkKGZpZWxkTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdGVGaWVsZChmaWVsZE5hbWUsIGRhdGEsIHZhbGlkYXRpb25SdWxlcyk7XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgY29tcG9uZW50LnN0YXRlLmVycm9yc1tmaWVsZE5hbWVdID0gZXJyb3I7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnNbZmllbGROYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNob3dGaWVsZEVycm9yKGZpZWxkTmFtZSwgZXJyb3IpO1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFN1Ym1pdCB0aGUgZm9ybVxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBzdWJtaXQgY29uZmlndXJhdGlvblxuICAgICAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHNlcnZlciByZXNwb25zZVxuICAgICAgICovXG4gICAgICBhc3luYyBzdWJtaXQob3B0aW9uczogRm9ybVN1Ym1pdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICAvLyBQcmV2ZW50IGRvdWJsZSBzdWJtaXNzaW9uXG4gICAgICAgIGlmIChjb21wb25lbnQuc3RhdGUuc3VibWl0dGluZykge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJGb3JtIGlzIGFscmVhZHkgc3VibWl0dGluZ1wiKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSBpZiByZXF1ZXN0ZWQgKGRlZmF1bHQ6IHRydWUpXG4gICAgICAgIGlmIChvcHRpb25zLnZhbGlkYXRlICE9PSBmYWxzZSAmJiB2YWxpZGF0aW9uUnVsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICAgICAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVmFsaWRhdGlvbiBmYWlsZWRcIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hcmsgYXMgc3VibWl0dGluZ1xuICAgICAgICBjb21wb25lbnQuc3RhdGUuc3VibWl0dGluZyA9IHRydWU7XG5cbiAgICAgICAgLy8gSW1tZWRpYXRlbHkgZGlzYWJsZSBjb250cm9scyB0byBwcmV2ZW50IGRvdWJsZS1jbGlja3NcbiAgICAgICAgY29tcG9uZW50LmRpc2FibGVDb250cm9scygpO1xuXG4gICAgICAgIC8vIEFkZCBzdWJtaXR0aW5nIGNsYXNzIHRvIGVsZW1lbnRcbiAgICAgICAgaWYgKGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlnLnByZWZpeCB8fCBcIm10cmxcIjtcbiAgICAgICAgICBjb25zdCBjb21wb25lbnROYW1lID0gY29uZmlnLmNvbXBvbmVudE5hbWUgfHwgXCJmb3JtXCI7XG4gICAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuY2xhc3NMaXN0LmFkZChcbiAgICAgICAgICAgIGAke3ByZWZpeH0tJHtjb21wb25lbnROYW1lfS0tJHtGT1JNX0NMQVNTRVMuU1VCTUlUVElOR31gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IHN1Ym1pdCBldmVudFxuICAgICAgICBjb25zdCBkYXRhID0gY29tcG9uZW50LmdldERhdGEoKTtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5TVUJNSVQsIGRhdGEpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGV0IHJlc3VsdDogdW5rbm93bjtcblxuICAgICAgICAgIC8vIFVzZSBjdXN0b20gaGFuZGxlciBpZiBwcm92aWRlZFxuICAgICAgICAgIGlmIChvcHRpb25zLmhhbmRsZXIpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IG9wdGlvbnMuaGFuZGxlcihcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgY29tcG9uZW50IGFzIHVua25vd24gYXMgaW1wb3J0KFwiLi4vdHlwZXNcIikuRm9ybUNvbXBvbmVudCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjb25maWcuYWN0aW9uKSB7XG4gICAgICAgICAgICAvLyBVc2UgZGVmYXVsdCBmZXRjaFxuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcGVyZm9ybVJlcXVlc3QoY29uZmlnLmFjdGlvbiwgZGF0YSwge1xuICAgICAgICAgICAgICBtZXRob2Q6IG9wdGlvbnMubWV0aG9kIHx8IGNvbmZpZy5tZXRob2QgfHwgXCJQT1NUXCIsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBObyBhY3Rpb24gVVJMLCBqdXN0IHJldHVybiB0aGUgZGF0YVxuICAgICAgICAgICAgcmVzdWx0ID0gZGF0YTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTdWNjZXNzIVxuICAgICAgICAgIGNvbXBvbmVudC5zdGF0ZS5zdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgICAgICAgY29tcG9uZW50LnN0YXRlLmVycm9ycyA9IHt9O1xuXG4gICAgICAgICAgLy8gUmVtb3ZlIHN1Ym1pdHRpbmcgY2xhc3NcbiAgICAgICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZy5wcmVmaXggfHwgXCJtdHJsXCI7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnROYW1lID0gY29uZmlnLmNvbXBvbmVudE5hbWUgfHwgXCJmb3JtXCI7XG4gICAgICAgICAgICBjb21wb25lbnQuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFxuICAgICAgICAgICAgICBgJHtwcmVmaXh9LSR7Y29tcG9uZW50TmFtZX0tLSR7Rk9STV9DTEFTU0VTLlNVQk1JVFRJTkd9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVGFrZSBzbmFwc2hvdCBvZiBjdXJyZW50IGRhdGEgYXMgbmV3IGJhc2VsaW5lXG4gICAgICAgICAgLy8gVGhpcyByZXNldHMgbW9kaWZpZWQgc3RhdGUgdG8gZmFsc2UsIHdoaWNoIHdpbGwgdHJpZ2dlciBzdGF0ZTpjaGFuZ2VcbiAgICAgICAgICBjb21wb25lbnQuc25hcHNob3QoKTtcblxuICAgICAgICAgIC8vIERpc2FibGUgY29udHJvbHMgKGZvcm0gaXMgbm93IHByaXN0aW5lKVxuICAgICAgICAgIGNvbXBvbmVudC5kaXNhYmxlQ29udHJvbHMoKTtcblxuICAgICAgICAgIC8vIEVtaXQgc3VjY2VzcyBldmVudFxuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuU1VCTUlUX1NVQ0NFU1MsIHJlc3VsdCk7XG5cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIEVycm9yIVxuICAgICAgICAgIGNvbXBvbmVudC5zdGF0ZS5zdWJtaXR0aW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAvLyBSZW1vdmUgc3VibWl0dGluZyBjbGFzc1xuICAgICAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlnLnByZWZpeCB8fCBcIm10cmxcIjtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBjb25maWcuY29tcG9uZW50TmFtZSB8fCBcImZvcm1cIjtcbiAgICAgICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXG4gICAgICAgICAgICAgIGAke3ByZWZpeH0tJHtjb21wb25lbnROYW1lfS0tJHtGT1JNX0NMQVNTRVMuU1VCTUlUVElOR31gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSZS1lbmFibGUgY29udHJvbHMgc28gdXNlciBjYW4gcmV0cnkgKGZvcm0gc3RpbGwgaGFzIHVuc2F2ZWQgY2hhbmdlcylcbiAgICAgICAgICBjb21wb25lbnQuZW5hYmxlQ29udHJvbHMoKTtcblxuICAgICAgICAgIC8vIEVtaXQgZXJyb3IgZXZlbnRcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLlNVQk1JVF9FUlJPUiwgZXJyb3IpO1xuXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IHZhbGlkYXRpb24gcnVsZXMgYXQgcnVudGltZVxuICAgICAgICovXG4gICAgICBzZXRWYWxpZGF0aW9uUnVsZXMocnVsZXM6IEZvcm1WYWxpZGF0aW9uUnVsZVtdKTogdm9pZCB7XG4gICAgICAgIHZhbGlkYXRpb25SdWxlcyA9IHJ1bGVzO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDbGVhciBhbGwgdmFsaWRhdGlvbiBlcnJvcnMgYW5kIHZpc3VhbCBlcnJvciBzdGF0ZXNcbiAgICAgICAqL1xuICAgICAgY2xlYXJFcnJvcnMoKTogdm9pZCB7XG4gICAgICAgIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnMgPSB7fTtcbiAgICAgICAgc2hvd0FsbEZpZWxkRXJyb3JzKHt9KTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2xlYXIgZXJyb3IgZm9yIGEgc3BlY2lmaWMgZmllbGRcbiAgICAgICAqL1xuICAgICAgY2xlYXJGaWVsZEVycm9yKGZpZWxkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgZGVsZXRlIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnNbZmllbGRdO1xuICAgICAgICBzaG93RmllbGRFcnJvcihmaWVsZCwgdW5kZWZpbmVkKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IGFuIGVycm9yIGZvciBhIHNwZWNpZmljIGZpZWxkIChhbHNvIHNob3dzIG9uIGNvbXBvbmVudClcbiAgICAgICAqL1xuICAgICAgc2V0RmllbGRFcnJvcihmaWVsZDogc3RyaW5nLCBlcnJvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnNbZmllbGRdID0gZXJyb3I7XG4gICAgICAgIHNob3dGaWVsZEVycm9yKGZpZWxkLCBlcnJvcik7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCB0aGUgZXJyb3IgZm9yIGEgc3BlY2lmaWMgZmllbGRcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGRFcnJvcihmaWVsZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnNbZmllbGRdO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGVuaGFuY2VkO1xuICB9O1xufTtcblxuZXhwb3J0IHsgdmFsaWRhdGVEYXRhLCB2YWxpZGF0ZUZpZWxkLCBwZXJmb3JtUmVxdWVzdCB9O1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN1Ym1pdDtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9wcm90ZWN0aW9uLnRzXG5cbi8qKlxuICogUHJvdGVjdGlvbiBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogSGFuZGxlcyBibG9ja2luZyBvdmVybGF5IHRvIHByZXZlbnQgY2xpY2tzIG91dHNpZGUgdGhlIGZvcm0gd2hlbiBpdCBoYXMgdW5zYXZlZCBjaGFuZ2VzXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGb3JtQ29uZmlnLFxuICBCYXNlRm9ybUNvbXBvbmVudCxcbiAgRm9ybURhdGEsXG4gIEZvcm1TdGF0ZSxcbiAgRm9ybUZpZWxkUmVnaXN0cnksXG4gIFByb3RlY3RDaGFuZ2VzQ29uZmlnLFxuICBEYXRhQ29uZmxpY3RFdmVudCxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBGT1JNX0VWRU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBOb3JtYWxpemVzIHByb3RlY3Rpb24gY29uZmlnIHRvIGEgY29uc2lzdGVudCBvYmplY3QgZm9ybWF0XG4gKi9cbmNvbnN0IG5vcm1hbGl6ZVByb3RlY3RDb25maWcgPSAoXG4gIGNvbmZpZzogYm9vbGVhbiB8IFByb3RlY3RDaGFuZ2VzQ29uZmlnIHwgdW5kZWZpbmVkLFxuKTogUHJvdGVjdENoYW5nZXNDb25maWcgPT4ge1xuICBpZiAoIWNvbmZpZykge1xuICAgIHJldHVybiB7IGJlZm9yZVVubG9hZDogZmFsc2UsIG9uRGF0YU92ZXJ3cml0ZTogZmFsc2UgfTtcbiAgfVxuICBpZiAoY29uZmlnID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHsgYmVmb3JlVW5sb2FkOiB0cnVlLCBvbkRhdGFPdmVyd3JpdGU6IHRydWUgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGJlZm9yZVVubG9hZDogY29uZmlnLmJlZm9yZVVubG9hZCA/PyBmYWxzZSxcbiAgICBvbkRhdGFPdmVyd3JpdGU6IGNvbmZpZy5vbkRhdGFPdmVyd3JpdGUgPz8gZmFsc2UsXG4gIH07XG59O1xuXG4vKipcbiAqIHdpdGhQcm90ZWN0aW9uIGZlYXR1cmVcbiAqIEFkZHMgYmxvY2tpbmcgb3ZlcmxheSBwcm90ZWN0aW9uIHRvIHByZXZlbnQgY2xpY2tzIG91dHNpZGUgdGhlIGZvcm0gd2hlbiBtb2RpZmllZFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFByb3RlY3Rpb24gPSAoY29uZmlnOiBGb3JtQ29uZmlnKSA9PiB7XG4gIHJldHVybiA8XG4gICAgVCBleHRlbmRzIEJhc2VGb3JtQ29tcG9uZW50ICYge1xuICAgICAgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeTtcbiAgICAgIHN0YXRlOiBGb3JtU3RhdGU7XG4gICAgICBlbWl0PzogKGV2ZW50OiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiB2b2lkO1xuICAgICAgb24/OiAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pID0+IHZvaWQ7XG4gICAgICByZXNldD86IChmb3JjZT86IGJvb2xlYW4pID0+IGJvb2xlYW47XG4gICAgICBjbGVhckVycm9ycz86ICgpID0+IHZvaWQ7XG4gICAgICBkaXNhYmxlQ29udHJvbHM/OiAoKSA9PiB2b2lkO1xuICAgIH0sXG4gID4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUID0+IHtcbiAgICAvLyBOb3JtYWxpemUgcHJvdGVjdGlvbiBjb25maWd1cmF0aW9uXG4gICAgY29uc3QgcHJvdGVjdENvbmZpZyA9IG5vcm1hbGl6ZVByb3RlY3RDb25maWcoY29uZmlnLnByb3RlY3RDaGFuZ2VzKTtcblxuICAgIC8vIElmIG92ZXJsYXkgcHJvdGVjdGlvbiBpcyBub3QgZW5hYmxlZCwgcmV0dXJuIGNvbXBvbmVudCB1bmNoYW5nZWRcbiAgICBpZiAoIXByb3RlY3RDb25maWcub25EYXRhT3ZlcndyaXRlKSB7XG4gICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIFRyYWNrIGJsb2NraW5nIG92ZXJsYXkgZWxlbWVudHMgKHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodClcbiAgICBsZXQgYmxvY2tpbmdPdmVybGF5czogSFRNTEVsZW1lbnRbXSA9IFtdO1xuXG4gICAgLy8gUmVzaXplL3Njcm9sbCBoYW5kbGVyIGZvciB1cGRhdGluZyBvdmVybGF5IHBvc2l0aW9uc1xuICAgIGxldCByZXNpemVIYW5kbGVyOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICAgIC8vIFRyYWNrIGlmIHVzZXIgaGFzIGludGVyYWN0ZWQgd2l0aCB0aGUgZm9ybSAobWFkZSBhY3R1YWwgY2hhbmdlcylcbiAgICAvLyBUaGlzIHByZXZlbnRzIG92ZXJsYXlzIGZyb20gc2hvd2luZyBvbiBpbml0aWFsIGxvYWRcbiAgICBsZXQgaGFzVXNlckludGVyYWN0ZWQgPSBmYWxzZTtcblxuICAgIC8vIFRyYWNrIGlmIGRhdGEgaGFzIGJlZW4gbG9hZGVkIGF0IGxlYXN0IG9uY2VcbiAgICAvLyBUaGlzIGhlbHBzIGRpc3Rpbmd1aXNoIGJldHdlZW4gaW5pdGlhbCBsb2FkIGFuZCB1c2VyIGVkaXRzXG4gICAgbGV0IGRhdGFIYXNCZWVuTG9hZGVkID0gZmFsc2U7XG5cbiAgICAvLyBUcmFjayBpZiB3ZSdyZSBjdXJyZW50bHkgbG9hZGluZyBkYXRhIChpZ25vcmUgZmllbGQ6Y2hhbmdlIGV2ZW50cyBkdXJpbmcgdGhpcyB0aW1lKVxuICAgIGxldCBpc0xvYWRpbmdEYXRhID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGJsb2NraW5nIG92ZXJsYXkgZWxlbWVudHMgYXJvdW5kIHRoZSBmb3JtXG4gICAgICogVGhlc2Ugb3ZlcmxheXMgcHJldmVudCBjbGlja3Mgb3V0c2lkZSB0aGUgZm9ybSB3aGVuIGl0IGhhcyB1bnNhdmVkIGNoYW5nZXNcbiAgICAgKi9cbiAgICBjb25zdCBjcmVhdGVCbG9ja2luZ092ZXJsYXlzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGJsb2NraW5nT3ZlcmxheXMubGVuZ3RoID4gMCkgcmV0dXJuOyAvLyBBbHJlYWR5IGNyZWF0ZWRcblxuICAgICAgY29uc3QgZm9ybUVsZW1lbnQgPSBjb21wb25lbnQuZWxlbWVudDtcbiAgICAgIGlmICghZm9ybUVsZW1lbnQpIHJldHVybjtcblxuICAgICAgLy8gR2V0IGZvcm0gcG9zaXRpb24gYW5kIGRpbWVuc2lvbnMgKHJlbGF0aXZlIHRvIHZpZXdwb3J0IGZvciBmaXhlZCBwb3NpdGlvbmluZylcbiAgICAgIGNvbnN0IHJlY3QgPSBmb3JtRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgLy8gQ29tbW9uIG92ZXJsYXkgc3R5bGVzIC0gdXNpbmcgZml4ZWQgcG9zaXRpb25pbmcgZm9yIHZpZXdwb3J0LXJlbGF0aXZlIHBsYWNlbWVudFxuICAgICAgLy8gei1pbmRleDogOTk5IGlzIGJlbG93IGRpYWxvZydzIG1vZGFsIHotaW5kZXggKDEwMDApIHNvIGRpYWxvZ3MgYXBwZWFyIGFib3ZlXG4gICAgICBjb25zdCBiYXNlU3R5bGVzID0gYFxuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgICB6LWluZGV4OiA5OTk7XG4gICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gICAgICBgO1xuXG4gICAgICAvLyBDcmVhdGUgdG9wIG92ZXJsYXkgKGZyb20gdG9wIG9mIHZpZXdwb3J0IHRvIHRvcCBvZiBmb3JtKVxuICAgICAgY29uc3QgdG9wT3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICB0b3BPdmVybGF5LmNsYXNzTmFtZSA9XG4gICAgICAgIFwibXRybC1mb3JtLWJsb2NraW5nLW92ZXJsYXkgbXRybC1mb3JtLWJsb2NraW5nLW92ZXJsYXktLXRvcFwiO1xuICAgICAgdG9wT3ZlcmxheS5zdHlsZS5jc3NUZXh0ID0gYCR7YmFzZVN0eWxlc31cbiAgICAgICAgdG9wOiAwO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgaGVpZ2h0OiAke3JlY3QudG9wfXB4O1xuICAgICAgYDtcblxuICAgICAgLy8gQ3JlYXRlIGJvdHRvbSBvdmVybGF5IChmcm9tIGJvdHRvbSBvZiBmb3JtIHRvIGJvdHRvbSBvZiB2aWV3cG9ydClcbiAgICAgIGNvbnN0IGJvdHRvbU92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgYm90dG9tT3ZlcmxheS5jbGFzc05hbWUgPVxuICAgICAgICBcIm10cmwtZm9ybS1ibG9ja2luZy1vdmVybGF5IG10cmwtZm9ybS1ibG9ja2luZy1vdmVybGF5LS1ib3R0b21cIjtcbiAgICAgIGJvdHRvbU92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9IGAke2Jhc2VTdHlsZXN9XG4gICAgICAgIHRvcDogJHtyZWN0LmJvdHRvbX1weDtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgIGJvdHRvbTogMDtcbiAgICAgIGA7XG5cbiAgICAgIC8vIENyZWF0ZSBsZWZ0IG92ZXJsYXkgKGZyb20gbGVmdCBvZiB2aWV3cG9ydCB0byBsZWZ0IG9mIGZvcm0sIGJldHdlZW4gdG9wIGFuZCBib3R0b20pXG4gICAgICBjb25zdCBsZWZ0T3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBsZWZ0T3ZlcmxheS5jbGFzc05hbWUgPVxuICAgICAgICBcIm10cmwtZm9ybS1ibG9ja2luZy1vdmVybGF5IG10cmwtZm9ybS1ibG9ja2luZy1vdmVybGF5LS1sZWZ0XCI7XG4gICAgICBsZWZ0T3ZlcmxheS5zdHlsZS5jc3NUZXh0ID0gYCR7YmFzZVN0eWxlc31cbiAgICAgICAgdG9wOiAke3JlY3QudG9wfXB4O1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICB3aWR0aDogJHtyZWN0LmxlZnR9cHg7XG4gICAgICAgIGhlaWdodDogJHtyZWN0LmhlaWdodH1weDtcbiAgICAgIGA7XG5cbiAgICAgIC8vIENyZWF0ZSByaWdodCBvdmVybGF5IChmcm9tIHJpZ2h0IG9mIGZvcm0gdG8gcmlnaHQgb2Ygdmlld3BvcnQsIGJldHdlZW4gdG9wIGFuZCBib3R0b20pXG4gICAgICBjb25zdCByaWdodE92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgcmlnaHRPdmVybGF5LmNsYXNzTmFtZSA9XG4gICAgICAgIFwibXRybC1mb3JtLWJsb2NraW5nLW92ZXJsYXkgbXRybC1mb3JtLWJsb2NraW5nLW92ZXJsYXktLXJpZ2h0XCI7XG4gICAgICByaWdodE92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9IGAke2Jhc2VTdHlsZXN9XG4gICAgICAgIHRvcDogJHtyZWN0LnRvcH1weDtcbiAgICAgICAgbGVmdDogJHtyZWN0LnJpZ2h0fXB4O1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgaGVpZ2h0OiAke3JlY3QuaGVpZ2h0fXB4O1xuICAgICAgYDtcblxuICAgICAgLy8gQWRkIGNsaWNrIGhhbmRsZXIgdG8gc2hvdyBkaWFsb2cgd2hlbiBjbGlja2luZyBvbiBvdmVybGF5XG4gICAgICBjb25zdCBoYW5kbGVPdmVybGF5Q2xpY2sgPSAoZTogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgLy8gRW1pdCBkYXRhOmNvbmZsaWN0IGV2ZW50IHRvIHNob3cgZGlhbG9nXG4gICAgICAgIGNvbnN0IGNvbmZsaWN0RXZlbnQ6IERhdGFDb25mbGljdEV2ZW50ID0ge1xuICAgICAgICAgIGN1cnJlbnREYXRhOiB7IC4uLmNvbXBvbmVudC5zdGF0ZS5jdXJyZW50RGF0YSB9LFxuICAgICAgICAgIG5ld0RhdGE6IHt9LFxuICAgICAgICAgIGNhbmNlbGxlZDogZmFsc2UsXG4gICAgICAgICAgY2FuY2VsOiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBVc2VyIGNob3NlIHRvIGtlZXAgZWRpdGluZyAtIGRvIG5vdGhpbmcsIG92ZXJsYXlzIHN0YXlcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb2NlZWQ6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIFVzZXIgY2hvc2UgdG8gZGlzY2FyZCAtIHJlc2V0IGZvcm0gdG8gaW5pdGlhbCBzdGF0ZVxuICAgICAgICAgICAgLy8gU2FtZSBhcyBjYW5jZWwgYnV0dG9uIGJlaGF2aW9yXG4gICAgICAgICAgICBoYXNVc2VySW50ZXJhY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gUmVzZXQgZm9ybSB0byBpbml0aWFsIGRhdGEgKGZvcmNlPXRydWUgYnlwYXNzZXMgcHJvdGVjdGlvbilcbiAgICAgICAgICAgIGNvbXBvbmVudC5yZXNldD8uKHRydWUpO1xuICAgICAgICAgICAgLy8gQ2xlYXIgYW55IHZhbGlkYXRpb24gZXJyb3JzXG4gICAgICAgICAgICBjb21wb25lbnQuY2xlYXJFcnJvcnM/LigpO1xuICAgICAgICAgICAgLy8gRGlzYWJsZSBjb250cm9scyAoZm9ybSBpcyBub3cgcHJpc3RpbmUpXG4gICAgICAgICAgICBjb21wb25lbnQuZGlzYWJsZUNvbnRyb2xzPy4oKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuREFUQV9DT05GTElDVCwgY29uZmxpY3RFdmVudCk7XG4gICAgICB9O1xuXG4gICAgICBbdG9wT3ZlcmxheSwgYm90dG9tT3ZlcmxheSwgbGVmdE92ZXJsYXksIHJpZ2h0T3ZlcmxheV0uZm9yRWFjaChcbiAgICAgICAgKG92ZXJsYXkpID0+IHtcbiAgICAgICAgICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVPdmVybGF5Q2xpY2spO1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3ZlcmxheSk7XG4gICAgICAgICAgYmxvY2tpbmdPdmVybGF5cy5wdXNoKG92ZXJsYXkpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBibG9ja2luZyBvdmVybGF5IGVsZW1lbnRzXG4gICAgICovXG4gICAgY29uc3QgcmVtb3ZlQmxvY2tpbmdPdmVybGF5cyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChibG9ja2luZ092ZXJsYXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBibG9ja2luZ092ZXJsYXlzLmZvckVhY2goKG92ZXJsYXkpID0+IHtcbiAgICAgICAgb3ZlcmxheS5yZW1vdmUoKTtcbiAgICAgIH0pO1xuICAgICAgYmxvY2tpbmdPdmVybGF5cyA9IFtdO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGJsb2NraW5nIG92ZXJsYXlzIHBvc2l0aW9uIChlLmcuLCBvbiB3aW5kb3cgcmVzaXplKVxuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZUJsb2NraW5nT3ZlcmxheXMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAoYmxvY2tpbmdPdmVybGF5cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgZm9ybUVsZW1lbnQgPSBjb21wb25lbnQuZWxlbWVudDtcbiAgICAgIGlmICghZm9ybUVsZW1lbnQpIHJldHVybjtcblxuICAgICAgY29uc3QgcmVjdCA9IGZvcm1FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAvLyBVcGRhdGUgZWFjaCBvdmVybGF5IHBvc2l0aW9uICh1c2luZyBmaXhlZCBwb3NpdGlvbmluZywgbm8gc2Nyb2xsIG9mZnNldCBuZWVkZWQpXG4gICAgICBjb25zdCBbdG9wT3ZlcmxheSwgYm90dG9tT3ZlcmxheSwgbGVmdE92ZXJsYXksIHJpZ2h0T3ZlcmxheV0gPVxuICAgICAgICBibG9ja2luZ092ZXJsYXlzO1xuXG4gICAgICBpZiAodG9wT3ZlcmxheSkge1xuICAgICAgICB0b3BPdmVybGF5LnN0eWxlLmhlaWdodCA9IGAke3JlY3QudG9wfXB4YDtcbiAgICAgIH1cbiAgICAgIGlmIChib3R0b21PdmVybGF5KSB7XG4gICAgICAgIGJvdHRvbU92ZXJsYXkuc3R5bGUudG9wID0gYCR7cmVjdC5ib3R0b219cHhgO1xuICAgICAgfVxuICAgICAgaWYgKGxlZnRPdmVybGF5KSB7XG4gICAgICAgIGxlZnRPdmVybGF5LnN0eWxlLnRvcCA9IGAke3JlY3QudG9wfXB4YDtcbiAgICAgICAgbGVmdE92ZXJsYXkuc3R5bGUud2lkdGggPSBgJHtyZWN0LmxlZnR9cHhgO1xuICAgICAgICBsZWZ0T3ZlcmxheS5zdHlsZS5oZWlnaHQgPSBgJHtyZWN0LmhlaWdodH1weGA7XG4gICAgICB9XG4gICAgICBpZiAocmlnaHRPdmVybGF5KSB7XG4gICAgICAgIHJpZ2h0T3ZlcmxheS5zdHlsZS50b3AgPSBgJHtyZWN0LnRvcH1weGA7XG4gICAgICAgIHJpZ2h0T3ZlcmxheS5zdHlsZS5sZWZ0ID0gYCR7cmVjdC5yaWdodH1weGA7XG4gICAgICAgIHJpZ2h0T3ZlcmxheS5zdHlsZS5oZWlnaHQgPSBgJHtyZWN0LmhlaWdodH1weGA7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgYmxvY2tpbmcgb3ZlcmxheXMgYmFzZWQgb24gbW9kaWZpZWQgc3RhdGVcbiAgICAgKi9cbiAgICBjb25zdCB1cGRhdGVQcm90ZWN0aW9uU3RhdGUgPSAobW9kaWZpZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICAgIGlmIChtb2RpZmllZCAmJiBoYXNVc2VySW50ZXJhY3RlZCkge1xuICAgICAgICBjcmVhdGVCbG9ja2luZ092ZXJsYXlzKCk7XG4gICAgICAgIC8vIEFkZCByZXNpemUvc2Nyb2xsIGxpc3RlbmVycyB0byB1cGRhdGUgb3ZlcmxheSBwb3NpdGlvbnNcbiAgICAgICAgaWYgKCFyZXNpemVIYW5kbGVyKSB7XG4gICAgICAgICAgcmVzaXplSGFuZGxlciA9IHVwZGF0ZUJsb2NraW5nT3ZlcmxheXM7XG4gICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbW92ZUJsb2NraW5nT3ZlcmxheXMoKTtcbiAgICAgICAgLy8gUmVtb3ZlIHJlc2l6ZS9zY3JvbGwgbGlzdGVuZXJzXG4gICAgICAgIGlmIChyZXNpemVIYW5kbGVyKSB7XG4gICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgICAgcmVzaXplSGFuZGxlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gTGlzdGVuIGZvciBmaWVsZDpjaGFuZ2UgZXZlbnRzIHRvIGRldGVjdCBhY3R1YWwgdXNlciBlZGl0c1xuICAgIC8vIFRoaXMgaXMgbW9yZSByZWxpYWJsZSB0aGFuIFNUQVRFX0NIQU5HRSBiZWNhdXNlIGl0IGZpcmVzIG9uIGV2ZXJ5IGZpZWxkIGVkaXRcbiAgICBjb21wb25lbnQub24/LihcImZpZWxkOmNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICAvLyBJZ25vcmUgZmllbGQ6Y2hhbmdlIGV2ZW50cyBkdXJpbmcgZGF0YSBsb2FkaW5nXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBmcm9tIHByb2dyYW1tYXRpYyBmaWVsZCB1cGRhdGVzXG4gICAgICBpZiAoaXNMb2FkaW5nRGF0YSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIE9ubHkgc2V0IGhhc1VzZXJJbnRlcmFjdGVkIGlmIGRhdGEgaGFzIGJlZW4gbG9hZGVkXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBkdXJpbmcgaW5pdGlhbCBmb3JtIHNldHVwXG4gICAgICBpZiAoZGF0YUhhc0JlZW5Mb2FkZWQgJiYgIWhhc1VzZXJJbnRlcmFjdGVkKSB7XG4gICAgICAgIGhhc1VzZXJJbnRlcmFjdGVkID0gdHJ1ZTtcbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byBzaG93IG92ZXJsYXlzIG5vd1xuICAgICAgICBpZiAoY29tcG9uZW50LnN0YXRlLm1vZGlmaWVkKSB7XG4gICAgICAgICAgdXBkYXRlUHJvdGVjdGlvblN0YXRlKHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIHN0YXRlIGNoYW5nZXMgdG8gc2hvdy9oaWRlIG92ZXJsYXlzXG4gICAgY29tcG9uZW50Lm9uPy4oRk9STV9FVkVOVFMuU1RBVEVfQ0hBTkdFLCAoZXZlbnQ6IHsgbW9kaWZpZWQ6IGJvb2xlYW4gfSkgPT4ge1xuICAgICAgLy8gV2hlbiBmb3JtIGJlY29tZXMgcHJpc3RpbmUgKGRhdGEgbG9hZGVkKSwgcmVzZXQgdGhlIGludGVyYWN0aW9uIGZsYWdcbiAgICAgIC8vIGFuZCBtYXJrIHRoYXQgZGF0YSBoYXMgYmVlbiBsb2FkZWRcbiAgICAgIGlmICghZXZlbnQubW9kaWZpZWQpIHtcbiAgICAgICAgaGFzVXNlckludGVyYWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgZGF0YUhhc0JlZW5Mb2FkZWQgPSB0cnVlO1xuICAgICAgICBpc0xvYWRpbmdEYXRhID0gdHJ1ZTtcblxuICAgICAgICAvLyBDbGVhciB0aGUgbG9hZGluZyBmbGFnIGFmdGVyIGEgc2hvcnQgZGVsYXkgdG8gYWxsb3cgYWxsIHByb2dyYW1tYXRpY1xuICAgICAgICAvLyBmaWVsZCB1cGRhdGVzIHRvIGNvbXBsZXRlIChjdXN0b20gZmllbGRzIG1heSB1cGRhdGUgYXN5bmMpXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlzTG9hZGluZ0RhdGEgPSBmYWxzZTtcbiAgICAgICAgfSwgMTAwKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIHByb3RlY3Rpb24gc3RhdGVcbiAgICAgIHVwZGF0ZVByb3RlY3Rpb25TdGF0ZShldmVudC5tb2RpZmllZCk7XG4gICAgfSk7XG5cbiAgICAvLyBBbHNvIGxpc3RlbiBmb3IgcmVzZXQgZXZlbnQgdG8gcmVtb3ZlIG92ZXJsYXlzXG4gICAgY29tcG9uZW50Lm9uPy4oRk9STV9FVkVOVFMuUkVTRVQsICgpID0+IHtcbiAgICAgIHVwZGF0ZVByb3RlY3Rpb25TdGF0ZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBSZWdpc3RlciBjbGVhbnVwIHdoZW4gY29tcG9uZW50IGlzIGRlc3Ryb3llZFxuICAgIGNvbnN0IG9yaWdpbmFsTGlmZWN5Y2xlID0gY29tcG9uZW50LmxpZmVjeWNsZTtcbiAgICBpZiAob3JpZ2luYWxMaWZlY3ljbGUpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IG9yaWdpbmFsTGlmZWN5Y2xlLmRlc3Ryb3k7XG4gICAgICBvcmlnaW5hbExpZmVjeWNsZS5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAvLyBDbGVhbiB1cCBibG9ja2luZyBvdmVybGF5c1xuICAgICAgICByZW1vdmVCbG9ja2luZ092ZXJsYXlzKCk7XG4gICAgICAgIGlmIChyZXNpemVIYW5kbGVyKSB7XG4gICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgICAgcmVzaXplSGFuZGxlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95XG4gICAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoUHJvdGVjdGlvbjtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9hcGkudHNcblxuLyoqXG4gKiBBUEkgZmVhdHVyZSBmb3IgRm9ybSBjb21wb25lbnRcbiAqIFByb3ZpZGVzIGEgY2xlYW4sIHVuaWZpZWQgcHVibGljIEFQSSBmb3IgdGhlIGZvcm1cbiAqIEFsc28gd2lyZXMgdXAgY29udHJvbCBidXR0b24gY2xpY2sgaGFuZGxlcnMgKHN1Ym1pdC9jYW5jZWwpXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGb3JtQ29uZmlnLFxuICBCYXNlRm9ybUNvbXBvbmVudCxcbiAgRm9ybUNvbXBvbmVudCxcbiAgRm9ybURhdGEsXG4gIERhdGFTdGF0ZSxcbiAgRm9ybVN0YXRlLFxuICBGb3JtRmllbGQsXG4gIEZvcm1GaWVsZFJlZ2lzdHJ5LFxuICBGb3JtVmFsaWRhdGlvblJlc3VsdCxcbiAgRm9ybVN1Ym1pdE9wdGlvbnMsXG4gIEZpZWxkVmFsdWUsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgRk9STV9FVkVOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogV2lyZXMgdXAgY2xpY2sgaGFuZGxlcnMgZm9yIGNvbnRyb2wgYnV0dG9ucyAoc3VibWl0LCBjYW5jZWwpXG4gKi9cbmNvbnN0IHdpcmVDb250cm9sQnV0dG9ucyA9IChcbiAgY29udHJvbHM6IE1hcDxzdHJpbmcsIEZvcm1GaWVsZD4sXG4gIGFwaTogRm9ybUNvbXBvbmVudCxcbiAgY29uZmlnOiBGb3JtQ29uZmlnLFxuKTogdm9pZCA9PiB7XG4gIC8vIFdpcmUgc3VibWl0IGJ1dHRvblxuICBjb25zdCBzdWJtaXRCdXR0b24gPSBjb250cm9scy5nZXQoXCJzdWJtaXRcIik7XG4gIGlmIChzdWJtaXRCdXR0b24/LmVsZW1lbnQpIHtcbiAgICBzdWJtaXRCdXR0b24uZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGNvbmZpZy5vblN1Ym1pdCkge1xuICAgICAgICAvLyBVc2UgY3VzdG9tIHN1Ym1pdCBoYW5kbGVyXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGFwaS5nZXREYXRhKCk7XG4gICAgICAgICAgYXdhaXQgY29uZmlnLm9uU3VibWl0KGRhdGEsIGFwaSk7XG4gICAgICAgICAgLy8gQWZ0ZXIgc3VjY2Vzc2Z1bCBzdWJtaXQsIGRpc2FibGUgY29udHJvbHMgKGZvcm0gaXMgbm93IHByaXN0aW5lKVxuICAgICAgICAgIGFwaS5kaXNhYmxlQ29udHJvbHMoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRm9ybSBzdWJtaXQgZXJyb3I6XCIsIGVycm9yKTtcbiAgICAgICAgICAvLyBPbiBlcnJvciwgYWxzbyBkaXNhYmxlIGNvbnRyb2xzIHRvIHByZXZlbnQgcmVwZWF0ZWQgY2xpY2tzXG4gICAgICAgICAgYXBpLmRpc2FibGVDb250cm9scygpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVc2UgZGVmYXVsdCBmb3JtIHN1Ym1pdCAoaGFuZGxlcyBkaXNhYmxpbmcgaW50ZXJuYWxseSlcbiAgICAgICAgYXdhaXQgYXBpLnN1Ym1pdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gV2lyZSBjYW5jZWwgYnV0dG9uXG4gIGNvbnN0IGNhbmNlbEJ1dHRvbiA9IGNvbnRyb2xzLmdldChcImNhbmNlbFwiKTtcbiAgaWYgKGNhbmNlbEJ1dHRvbj8uZWxlbWVudCkge1xuICAgIGNhbmNlbEJ1dHRvbi5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICBpZiAoY29uZmlnLm9uQ2FuY2VsKSB7XG4gICAgICAgIC8vIFVzZSBjdXN0b20gY2FuY2VsIGhhbmRsZXJcbiAgICAgICAgY29uZmlnLm9uQ2FuY2VsKGFwaSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEZWZhdWx0OiByZXNldCBmb3JtIHRvIGluaXRpYWwgc3RhdGVcbiAgICAgICAgLy8gVXNlIGZvcmNlPXRydWUgdG8gYnlwYXNzIHByb3RlY3Rpb24gc2luY2UgdGhpcyBpcyBhbiBpbnRlbnRpb25hbCB1c2VyIGFjdGlvblxuICAgICAgICBhcGkucmVzZXQodHJ1ZSk7XG4gICAgICB9XG4gICAgICAvLyBDbGVhciBhbnkgdmFsaWRhdGlvbiBlcnJvcnMgKHZpc3VhbCBzdGF0ZSBvbiBmaWVsZHMpXG4gICAgICBhcGkuY2xlYXJFcnJvcnMoKTtcbiAgICAgIC8vIEFmdGVyIGNhbmNlbCwgZGlzYWJsZSBjb250cm9scyAoZm9ybSBpcyBub3cgcHJpc3RpbmUpXG4gICAgICBhcGkuZGlzYWJsZUNvbnRyb2xzKCk7XG4gICAgfSk7XG4gIH1cbn07XG5cbi8qKlxuICogRXh0ZW5kZWQgY29tcG9uZW50IGludGVyZmFjZSBiZWZvcmUgQVBJIGlzIGFwcGxpZWRcbiAqL1xuaW50ZXJmYWNlIEVuaGFuY2VkRm9ybUNvbXBvbmVudCBleHRlbmRzIEJhc2VGb3JtQ29tcG9uZW50IHtcbiAgZm9ybTogSFRNTEZvcm1FbGVtZW50O1xuICB1aTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnk7XG4gIGZpbGVzOiBGb3JtRmllbGRSZWdpc3RyeTtcbiAgc3RhdGU6IEZvcm1TdGF0ZTtcbiAgY29udHJvbHM6IE1hcDxzdHJpbmcsIEZvcm1GaWVsZD47XG5cbiAgLy8gRGF0YSBtZXRob2RzXG4gIGdldERhdGE6ICgpID0+IEZvcm1EYXRhO1xuICBzZXREYXRhOiAoZGF0YTogRm9ybURhdGEsIHNpbGVudD86IGJvb2xlYW4pID0+IHZvaWQ7XG4gIGdldEZpZWxkVmFsdWU6IChuYW1lOiBzdHJpbmcpID0+IEZpZWxkVmFsdWU7XG4gIHNldEZpZWxkVmFsdWU6IChuYW1lOiBzdHJpbmcsIHZhbHVlOiBGaWVsZFZhbHVlLCBzaWxlbnQ/OiBib29sZWFuKSA9PiB2b2lkO1xuICBpc01vZGlmaWVkOiAoKSA9PiBib29sZWFuO1xuICBnZXRNb2RpZmllZERhdGE6ICgpID0+IEZvcm1EYXRhO1xuICBzbmFwc2hvdDogKCkgPT4gdm9pZDtcbiAgcmVzZXQ6IChmb3JjZT86IGJvb2xlYW4pID0+IGJvb2xlYW47XG4gIGNsZWFyOiAoZm9yY2U/OiBib29sZWFuKSA9PiBib29sZWFuO1xuXG4gIC8vIEZpZWxkIG1ldGhvZHNcbiAgZ2V0RmllbGQ6IChuYW1lOiBzdHJpbmcpID0+IEZvcm1GaWVsZCB8IHVuZGVmaW5lZDtcbiAgZ2V0RmllbGROYW1lczogKCkgPT4gc3RyaW5nW107XG4gIGhhc0ZpZWxkOiAobmFtZTogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIC8vIENvbnRyb2xsZXIgbWV0aG9kc1xuICBnZXREYXRhU3RhdGU6ICgpID0+IERhdGFTdGF0ZTtcbiAgZW5hYmxlQ29udHJvbHM6ICgpID0+IHZvaWQ7XG4gIGRpc2FibGVDb250cm9sczogKCkgPT4gdm9pZDtcbiAgZW5hYmxlRmllbGRzOiAoKSA9PiB2b2lkO1xuICBkaXNhYmxlRmllbGRzOiAoKSA9PiB2b2lkO1xuXG4gIC8vIFN1Ym1pdC9WYWxpZGF0aW9uIG1ldGhvZHNcbiAgdmFsaWRhdGU6ICgpID0+IEZvcm1WYWxpZGF0aW9uUmVzdWx0O1xuICB2YWxpZGF0ZUZpZWxkOiAoZmllbGROYW1lOiBzdHJpbmcpID0+IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgc3VibWl0OiAob3B0aW9ucz86IEZvcm1TdWJtaXRPcHRpb25zKSA9PiBQcm9taXNlPHVua25vd24+O1xuICBzZXRWYWxpZGF0aW9uUnVsZXM6IChydWxlczogaW1wb3J0KFwiLi4vdHlwZXNcIikuRm9ybVZhbGlkYXRpb25SdWxlW10pID0+IHZvaWQ7XG4gIGNsZWFyRXJyb3JzOiAoKSA9PiB2b2lkO1xuICBjbGVhckZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nKSA9PiB2b2lkO1xuICBzZXRGaWVsZEVycm9yOiAoZmllbGQ6IHN0cmluZywgZXJyb3I6IHN0cmluZykgPT4gdm9pZDtcbiAgZ2V0RmllbGRFcnJvcjogKGZpZWxkOiBzdHJpbmcpID0+IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvLyBFdmVudCBtZXRob2RzXG4gIG9uPzogKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKSA9PiB2b2lkO1xuICBvZmY/OiAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pID0+IHZvaWQ7XG4gIGVtaXQ/OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG5cbiAgLy8gTGlmZWN5Y2xlXG4gIGxpZmVjeWNsZT86IHtcbiAgICBkZXN0cm95OiAoKSA9PiB2b2lkO1xuICB9O1xufVxuXG4vKipcbiAqIHdpdGhBUEkgZmVhdHVyZVxuICogQ3JlYXRlcyBhIGNsZWFuIHB1YmxpYyBBUEkgZm9yIHRoZSBmb3JtIGNvbXBvbmVudFxuICovXG5leHBvcnQgY29uc3Qgd2l0aEFQSSA9IChjb25maWc6IEZvcm1Db25maWcpID0+IHtcbiAgcmV0dXJuIChjb21wb25lbnQ6IEVuaGFuY2VkRm9ybUNvbXBvbmVudCk6IEZvcm1Db21wb25lbnQgPT4ge1xuICAgIC8vIFJlZ2lzdGVyIGV2ZW50IGhhbmRsZXJzIGZyb20gY29uZmlnXG4gICAgaWYgKGNvbmZpZy5vbiAmJiBjb21wb25lbnQub24pIHtcbiAgICAgIGZvciAoY29uc3QgW2V2ZW50LCBoYW5kbGVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWcub24pKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgY29tcG9uZW50Lm9uKGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgcHVibGljIEFQSVxuICAgIGNvbnN0IGFwaTogRm9ybUNvbXBvbmVudCA9IHtcbiAgICAgIC8vIENvcmUgcHJvcGVydGllc1xuICAgICAgZWxlbWVudDogY29tcG9uZW50LmVsZW1lbnQsXG4gICAgICBmb3JtOiBjb21wb25lbnQuZm9ybSxcbiAgICAgIHVpOiBjb21wb25lbnQudWksXG4gICAgICBmaWVsZHM6IGNvbXBvbmVudC5maWVsZHMsXG4gICAgICBzdGF0ZTogY29tcG9uZW50LnN0YXRlLFxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIERhdGEgQVBJXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYWxsIGZvcm0gZGF0YSBhcyBhIGtleS12YWx1ZSBvYmplY3RcbiAgICAgICAqL1xuICAgICAgZ2V0RGF0YSgpOiBGb3JtRGF0YSB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuZ2V0RGF0YSgpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZXQgZm9ybSBkYXRhIGZyb20gYSBrZXktdmFsdWUgb2JqZWN0XG4gICAgICAgKiBAcGFyYW0gZGF0YSAtIERhdGEgdG8gc2V0XG4gICAgICAgKiBAcGFyYW0gc2lsZW50IC0gSWYgdHJ1ZSwgZG9uJ3QgZW1pdCBjaGFuZ2UgZXZlbnRzXG4gICAgICAgKi9cbiAgICAgIHNldERhdGEoZGF0YTogRm9ybURhdGEsIHNpbGVudD86IGJvb2xlYW4pOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50LnNldERhdGEoZGF0YSwgc2lsZW50KTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGEgc3BlY2lmaWMgZmllbGQncyB2YWx1ZVxuICAgICAgICogQHBhcmFtIG5hbWUgLSBGaWVsZCBuYW1lXG4gICAgICAgKi9cbiAgICAgIGdldEZpZWxkVmFsdWUobmFtZTogc3RyaW5nKTogRmllbGRWYWx1ZSB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuZ2V0RmllbGRWYWx1ZShuYW1lKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IGEgc3BlY2lmaWMgZmllbGQncyB2YWx1ZVxuICAgICAgICogQHBhcmFtIG5hbWUgLSBGaWVsZCBuYW1lXG4gICAgICAgKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBzZXRcbiAgICAgICAqIEBwYXJhbSBzaWxlbnQgLSBJZiB0cnVlLCBkb24ndCBlbWl0IGNoYW5nZSBldmVudHNcbiAgICAgICAqL1xuICAgICAgc2V0RmllbGRWYWx1ZShcbiAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICB2YWx1ZTogRmllbGRWYWx1ZSxcbiAgICAgICAgc2lsZW50PzogYm9vbGVhbixcbiAgICAgICk6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQuc2V0RmllbGRWYWx1ZShuYW1lLCB2YWx1ZSwgc2lsZW50KTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGEgZmllbGQgY29tcG9uZW50IGJ5IG5hbWVcbiAgICAgICAqIEBwYXJhbSBuYW1lIC0gRmllbGQgbmFtZVxuICAgICAgICovXG4gICAgICBnZXRGaWVsZChuYW1lOiBzdHJpbmcpOiBGb3JtRmllbGQgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LmdldEZpZWxkKG5hbWUpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYWxsIGZpZWxkIG5hbWVzXG4gICAgICAgKi9cbiAgICAgIGdldEZpZWxkTmFtZXMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LmdldEZpZWxkTmFtZXMoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgZm9ybSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwvc25hcHNob3Qgc3RhdGVcbiAgICAgICAqL1xuICAgICAgaXNNb2RpZmllZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5pc01vZGlmaWVkKCk7XG4gICAgICB9LFxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIFN0YXRlIEFQSVxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IHRoZSBjdXJyZW50IGRhdGEgc3RhdGUgKHByaXN0aW5lIG9yIGRpcnR5KVxuICAgICAgICovXG4gICAgICBnZXREYXRhU3RhdGUoKTogRGF0YVN0YXRlIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5nZXREYXRhU3RhdGUoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gVmFsaWRhdGlvbiBBUElcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICAvKipcbiAgICAgICAqIFZhbGlkYXRlIHRoZSBmb3JtIGFnYWluc3QgY29uZmlndXJlZCBydWxlc1xuICAgICAgICogQXV0b21hdGljYWxseSBzaG93cyBlcnJvcnMgb24gZmllbGQgY29tcG9uZW50c1xuICAgICAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCB2YWxpZCBmbGFnIGFuZCBlcnJvcnNcbiAgICAgICAqL1xuICAgICAgdmFsaWRhdGUoKTogRm9ybVZhbGlkYXRpb25SZXN1bHQge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LnZhbGlkYXRlKCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFZhbGlkYXRlIGEgc2luZ2xlIGZpZWxkXG4gICAgICAgKiBAcGFyYW0gZmllbGROYW1lIC0gRmllbGQgbmFtZSB0byB2YWxpZGF0ZVxuICAgICAgICogQHJldHVybnMgRXJyb3IgbWVzc2FnZSBpZiBpbnZhbGlkLCB1bmRlZmluZWQgaWYgdmFsaWRcbiAgICAgICAqL1xuICAgICAgdmFsaWRhdGVGaWVsZChmaWVsZE5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQudmFsaWRhdGVGaWVsZChmaWVsZE5hbWUpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDbGVhciBhbGwgdmFsaWRhdGlvbiBlcnJvcnNcbiAgICAgICAqL1xuICAgICAgY2xlYXJFcnJvcnMoKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5jbGVhckVycm9ycygpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDbGVhciBlcnJvciBmb3IgYSBzcGVjaWZpYyBmaWVsZFxuICAgICAgICogQHBhcmFtIGZpZWxkIC0gRmllbGQgbmFtZVxuICAgICAgICovXG4gICAgICBjbGVhckZpZWxkRXJyb3IoZmllbGQ6IHN0cmluZyk6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQuY2xlYXJGaWVsZEVycm9yKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IGVycm9yIGZvciBhIHNwZWNpZmljIGZpZWxkXG4gICAgICAgKiBAcGFyYW0gZmllbGQgLSBGaWVsZCBuYW1lXG4gICAgICAgKiBAcGFyYW0gZXJyb3IgLSBFcnJvciBtZXNzYWdlXG4gICAgICAgKi9cbiAgICAgIHNldEZpZWxkRXJyb3IoZmllbGQ6IHN0cmluZywgZXJyb3I6IHN0cmluZyk6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQuc2V0RmllbGRFcnJvcihmaWVsZCwgZXJyb3IpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgZXJyb3IgZm9yIGEgc3BlY2lmaWMgZmllbGRcbiAgICAgICAqIEBwYXJhbSBmaWVsZCAtIEZpZWxkIG5hbWVcbiAgICAgICAqIEByZXR1cm5zIEVycm9yIG1lc3NhZ2Ugb3IgdW5kZWZpbmVkXG4gICAgICAgKi9cbiAgICAgIGdldEZpZWxkRXJyb3IoZmllbGQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuZ2V0RmllbGRFcnJvcihmaWVsZCk7XG4gICAgICB9LFxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIFN1Ym1pdCBBUElcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICAvKipcbiAgICAgICAqIFN1Ym1pdCB0aGUgZm9ybVxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBzdWJtaXQgY29uZmlndXJhdGlvblxuICAgICAgICovXG4gICAgICBhc3luYyBzdWJtaXQob3B0aW9ucz86IEZvcm1TdWJtaXRPcHRpb25zKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuc3VibWl0KG9wdGlvbnMpO1xuICAgICAgfSxcblxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBTdGF0ZSBNYW5hZ2VtZW50IEFQSVxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgIC8qKlxuICAgICAgICogUmVzZXQgZm9ybSB0byBpbml0aWFsL3NuYXBzaG90IHN0YXRlXG4gICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlIC0gSWYgdHJ1ZSwgYnlwYXNzIHByb3RlY3Rpb24gYW5kIHJlc2V0IGltbWVkaWF0ZWx5XG4gICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiByZXNldCB3YXMgcGVyZm9ybWVkLCBmYWxzZSBpZiBjYW5jZWxsZWQgYnkgcHJvdGVjdGlvblxuICAgICAgICovXG4gICAgICByZXNldChmb3JjZT86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5yZXNldChmb3JjZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGFsbCBmb3JtIGZpZWxkc1xuICAgICAgICogQHBhcmFtIHtib29sZWFufSBmb3JjZSAtIElmIHRydWUsIGJ5cGFzcyBwcm90ZWN0aW9uIGFuZCBjbGVhciBpbW1lZGlhdGVseVxuICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgY2xlYXIgd2FzIHBlcmZvcm1lZCwgZmFsc2UgaWYgY2FuY2VsbGVkIGJ5IHByb3RlY3Rpb25cbiAgICAgICAqL1xuICAgICAgY2xlYXIoZm9yY2U/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuY2xlYXIoZm9yY2UpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBUYWtlIGEgc25hcHNob3Qgb2YgY3VycmVudCBkYXRhIGFzIHRoZSBuZXcgYmFzZWxpbmVcbiAgICAgICAqIFJlc2V0cyBtb2RpZmllZCBzdGF0ZSB0byBmYWxzZSBhbmQgcmVtb3ZlcyBwcm90ZWN0aW9uIG92ZXJsYXlzXG4gICAgICAgKiBVc2VmdWwgYWZ0ZXIgc3VjY2Vzc2Z1bCBmb3JtIHN1Ym1pc3Npb25cbiAgICAgICAqL1xuICAgICAgc25hcHNob3QoKTogdm9pZCB7XG4gICAgICAgIGNvbXBvbmVudC5zbmFwc2hvdCgpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBFbmFibGUgYWxsIGZvcm0gZmllbGRzXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZSgpOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50LmVuYWJsZUZpZWxkcygpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBEaXNhYmxlIGFsbCBmb3JtIGZpZWxkc1xuICAgICAgICovXG4gICAgICBkaXNhYmxlKCk6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQuZGlzYWJsZUZpZWxkcygpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBFbmFibGUgY29udHJvbCBidXR0b25zIChzdWJtaXQsIGNhbmNlbCwgZXRjLilcbiAgICAgICAqL1xuICAgICAgZW5hYmxlQ29udHJvbHMoKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5lbmFibGVDb250cm9scygpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBEaXNhYmxlIGNvbnRyb2wgYnV0dG9uc1xuICAgICAgICovXG4gICAgICBkaXNhYmxlQ29udHJvbHMoKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5kaXNhYmxlQ29udHJvbHMoKTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gRXZlbnQgQVBJXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgICAgLyoqXG4gICAgICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXJcbiAgICAgICAqIEBwYXJhbSBldmVudCAtIEV2ZW50IG5hbWVcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICovXG4gICAgICBvbihldmVudDogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbik6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQub24/LihldmVudCwgaGFuZGxlcik7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBhbiBldmVudCBsaXN0ZW5lclxuICAgICAgICogQHBhcmFtIGV2ZW50IC0gRXZlbnQgbmFtZVxuICAgICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICAgKi9cbiAgICAgIG9mZihldmVudDogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbik6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQub2ZmPy4oZXZlbnQsIGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBFbWl0IGFuIGV2ZW50XG4gICAgICAgKiBAcGFyYW0gZXZlbnQgLSBFdmVudCBuYW1lXG4gICAgICAgKiBAcGFyYW0gZGF0YSAtIEV2ZW50IGRhdGFcbiAgICAgICAqL1xuICAgICAgZW1pdChldmVudDogc3RyaW5nLCBkYXRhPzogdW5rbm93bik6IHZvaWQge1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKGV2ZW50LCBkYXRhKTtcbiAgICAgIH0sXG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gTGlmZWN5Y2xlIEFQSVxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgIC8qKlxuICAgICAgICogRGVzdHJveSB0aGUgZm9ybSBhbmQgY2xlYW4gdXAgcmVzb3VyY2VzXG4gICAgICAgKi9cbiAgICAgIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIC8vIENsZWFyIGFsbCBmaWVsZCBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgZm9yIChjb25zdCBbLCBmaWVsZF0gb2YgY29tcG9uZW50LmZpZWxkcykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZmllbGQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBmaWVsZC5kZXN0cm95KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgY29udHJvbCBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgZm9yIChjb25zdCBbLCBjb250cm9sXSBvZiBjb21wb25lbnQuY29udHJvbHMpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNvbnRyb2wuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBjb250cm9sLmRlc3Ryb3koKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsIGxpZmVjeWNsZSBkZXN0cm95IGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAoY29tcG9uZW50LmxpZmVjeWNsZT8uZGVzdHJveSkge1xuICAgICAgICAgIGNvbXBvbmVudC5saWZlY3ljbGUuZGVzdHJveSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIGZvcm0gZWxlbWVudCBmcm9tIERPTVxuICAgICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQ/LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICBjb21wb25lbnQuZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNvbXBvbmVudC5lbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgZGVzdHJveSBldmVudFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLlJFU0VUKTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIFdpcmUgdXAgY29udHJvbCBidXR0b24gY2xpY2sgaGFuZGxlcnNcbiAgICB3aXJlQ29udHJvbEJ1dHRvbnMoY29tcG9uZW50LmNvbnRyb2xzLCBhcGksIGNvbmZpZyk7XG5cbiAgICByZXR1cm4gYXBpO1xuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgd2l0aEFQSTtcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlCTyxTQUFTLFdBQVcsQ0FDekIsSUFDQSxJQUNBLElBQ0EsSUFDUTtBQUFBLEVBQ1IsT0FBTyxLQUFLLEtBQUssS0FBSyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7QUFBQTtBQVl2RCxTQUFTLFFBQVEsQ0FDdEIsSUFDQSxJQUNBLElBQ0EsSUFDUTtBQUFBLEVBQ1IsTUFBTSxRQUFTLEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxFQUFFLElBQUksTUFBTyxLQUFLO0FBQUEsRUFDMUQsT0FBTyxRQUFRLElBQUksUUFBUSxNQUFNO0FBQUE7QUFXNUIsU0FBUyxrQkFBa0IsQ0FDaEMsTUFDQSxlQUNBLE9BQ2M7QUFBQSxFQUNkLE1BQU0sVUFBVSxLQUFLLElBQUk7QUFBQSxFQUN6QixJQUFJLG1CQUFtQjtBQUFBLEVBRXZCLE1BQU0sUUFBc0I7QUFBQSxJQUMxQjtBQUFBLElBQ0E7QUFBQSxJQUNBLFFBQ0csTUFBTSxVQUEyQixjQUFjO0FBQUEsSUFDbEQsV0FBVyxNQUFNO0FBQUEsSUFDakI7QUFBQSxJQUNBLFVBQVUsVUFBVSxNQUFNO0FBQUEsSUFDMUI7QUFBQSxJQUNBLGdCQUFnQixNQUFNO0FBQUEsTUFDcEIsbUJBQW1CO0FBQUEsTUFDbkIsTUFBTSxtQkFBbUI7QUFBQSxNQUN6QixJQUFJLGNBQWMsWUFBWTtBQUFBLFFBQzVCLGNBQWMsZUFBZTtBQUFBLE1BQy9CO0FBQUE7QUFB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
|