mmhglobal-dynamicform 2.6.0 → 2.6.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/README.md +8 -0
- package/esm2020/lib/zgrid/zgrid.component.mjs +7 -3
- package/esm2020/lib/zudf/zudf.component.mjs +17 -10
- package/fesm2015/mmhglobal-dynamicform.mjs +26 -14
- package/fesm2015/mmhglobal-dynamicform.mjs.map +1 -1
- package/fesm2020/mmhglobal-dynamicform.mjs +22 -11
- package/fesm2020/mmhglobal-dynamicform.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -296,7 +296,8 @@ export class ZudfComponent extends ContainerFieldBase {
|
|
|
296
296
|
isGrouped: false,
|
|
297
297
|
isVisible: field.Visible ?? false,
|
|
298
298
|
isRequired: field.IsRequired ?? false,
|
|
299
|
-
isReadOnly: field.ReadOnly ?? false
|
|
299
|
+
isReadOnly: field.ReadOnly ?? false,
|
|
300
|
+
dataSourceType: field.zudfDataSourceType ?? null //value aka manual, user, resource aka resource
|
|
300
301
|
};
|
|
301
302
|
if (field.MultiValuedGroup) {
|
|
302
303
|
this.setMultiValueGroup(field);
|
|
@@ -332,7 +333,8 @@ export class ZudfComponent extends ContainerFieldBase {
|
|
|
332
333
|
isGrouped: fieldValueGrouped,
|
|
333
334
|
isVisible: field.Visible ?? false,
|
|
334
335
|
isRequired: field.IsRequired ?? false,
|
|
335
|
-
isReadOnly: field.ReadOnly ?? false
|
|
336
|
+
isReadOnly: field.ReadOnly ?? false,
|
|
337
|
+
dataSourceType: field.zudfDataSourceType ?? null //value aka manual, user, resource aka resource
|
|
336
338
|
};
|
|
337
339
|
if (containerName) {
|
|
338
340
|
if (!zudfGroup[containerName].includes(field.Value)) {
|
|
@@ -418,16 +420,20 @@ export class ZudfComponent extends ContainerFieldBase {
|
|
|
418
420
|
const patchedModelData = this.addZModelPropertyPrefix(modelData);
|
|
419
421
|
// Update the zModel values of the form group
|
|
420
422
|
Object.assign(group[this.componentScopeName].zModel, patchedModelData);
|
|
421
|
-
// Update grid values for any arrays in the model data
|
|
423
|
+
// Update grid values for any arrays in the model data base on kcard component.
|
|
422
424
|
for (const model in patchedModelData) {
|
|
423
425
|
if (Array.isArray(patchedModelData[model])) {
|
|
424
426
|
const gridValue = `${model}${this.prefixValueOption}`;
|
|
425
427
|
const gridDataSource = `${model}${this.prefixDataSourceName}`;
|
|
426
|
-
//
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
group[
|
|
428
|
+
// Check is it kcard, sometime can be dropdown.
|
|
429
|
+
const component = ZComponentHelper.getComponentByValue(this.group, model);
|
|
430
|
+
if (component?.data?.Type === 'kcard') {
|
|
431
|
+
// Update the data source for the grid
|
|
432
|
+
group[gridDataSource] = patchedModelData[model];
|
|
433
|
+
// Update the grid value
|
|
434
|
+
if (group[gridValue]) {
|
|
435
|
+
group[gridValue].setData(group[gridDataSource]);
|
|
436
|
+
}
|
|
431
437
|
}
|
|
432
438
|
}
|
|
433
439
|
}
|
|
@@ -658,7 +664,8 @@ export class ZudfComponent extends ContainerFieldBase {
|
|
|
658
664
|
"Type": "zgrid",
|
|
659
665
|
"Value": 'group.' + gridValueName,
|
|
660
666
|
"Visible": true,
|
|
661
|
-
"WidthReduce": 500
|
|
667
|
+
"WidthReduce": 500,
|
|
668
|
+
"DisableAutoAppendGridDateFilterCol": true
|
|
662
669
|
};
|
|
663
670
|
// Create a property in the group object based on the above declaration, except Name, and also insert column fields.
|
|
664
671
|
// Use the grouping value as the column and skip inserting any container type.
|
|
@@ -935,4 +942,4 @@ var ComponentType;
|
|
|
935
942
|
ComponentType["button"] = "zbuttons";
|
|
936
943
|
ComponentType["grid"] = "zgrid";
|
|
937
944
|
})(ComponentType || (ComponentType = {}));
|
|
938
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienVkZi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tbWhnbG9iYWwtZHluYW1pY2Zvcm0vc3JjL2xpYi96dWRmL3p1ZGYuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenVkZi96dWRmLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFvQyxNQUFNLGVBQWUsQ0FBQztBQUM1RSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBZSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRiw2QkFBNkI7QUFFN0IsOEJBQThCO0FBQzlCLE9BQU8sRUFBc0MsRUFBRSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM1RSxPQUFPLEVBQWtCLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRSwyQ0FBMkM7QUFDM0MsT0FBTyxFQUdMLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFDL0MsTUFBTSxpQkFBaUIsQ0FBQztBQUd6QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQzs7Ozs7Ozs7OztBQVNoRixNQUFNLE9BQU8sYUFBYyxTQUFRLGtCQUFrQjtJQW1CbkQsWUFDUyxnQkFBbUMsRUFDbEMsWUFBMEIsRUFDMUIsWUFBMEIsRUFDMUIsNEJBQTBELEVBQzFELEdBQXNCO1FBRTlCLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBTmhCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBbUI7UUFDbEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsaUNBQTRCLEdBQTVCLDRCQUE0QixDQUE4QjtRQUMxRCxRQUFHLEdBQUgsR0FBRyxD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O0lBRU0sZ0NBQWdDLENBQUMsYUFBcUIsRUFBRSxTQUFrQjtRQUMvRSxNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLElBQUksQ0FBQyxlQUFlLElBQUksYUFBYSxFQUFFLENBQUMsQ0FBQztRQUMzRyxJQUFJLE1BQU0sRUFBRTtZQUNWLE1BQU0sVUFBVSxHQUFHLENBQUMsd0JBQXdCLEVBQUUsMEJBQTBCLEVBQUUsMkJBQTJCLENBQUMsQ0FBQztZQUN2RyxLQUFLLE1BQU0sSUFBSSxJQUFJLFVBQVUsRUFBRTtnQkFDN0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQzthQUNsQztTQUNGO0lBQ0gsQ0FBQzs7MEdBM2lDVSxhQUFhOzhGQUFiLGFBQWEsdUVDM0IxQixrekRBZ0NBOzJGRExhLGFBQWE7a0JBTHpCLFNBQVM7K0JBQ0UsVUFBVTs7QUFrakN0QixJQUFLLGFBb0JKO0FBcEJELFdBQUssYUFBYTtJQUNoQiw4QkFBYSxDQUFBO0lBQ2Isc0NBQXFCLENBQUE7SUFDckIsc0NBQXFCLENBQUE7SUFDckIsaUNBQWdCLENBQUE7SUFDaEIsOEJBQWEsQ0FBQTtJQUNiLHdDQUF1QixDQUFBO0lBQ3ZCLDRDQUEyQixDQUFBO0lBQzNCLGtDQUFpQixDQUFBO0lBQ2pCLHNDQUFxQixDQUFBO0lBQ3JCLGdDQUFlLENBQUE7SUFDZiw4QkFBYSxDQUFBO0lBQ2IsZ0NBQWUsQ0FBQTtJQUNmLG9DQUFtQixDQUFBO0lBQ25CLHNDQUFxQixDQUFBO0lBQ3JCLHdEQUF1QyxDQUFBO0lBQ3ZDLG9EQUFtQyxDQUFBO0lBQ25DLG1DQUFrQixDQUFBO0lBQ2xCLG9DQUFtQixDQUFBO0lBQ25CLCtCQUFjLENBQUE7QUFDaEIsQ0FBQyxFQXBCSSxhQUFhLEtBQWIsYUFBYSxRQW9CakIiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKiBBbmd1bGFyICoqKioqKioqKiovXHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycyB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5cclxuLyoqKioqKioqKiogSW9uaWMgKioqKioqKioqKi9cclxuXHJcbi8qKioqKioqKioqIFBsdWdpbiAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBBc3luY1N1YmplY3QsIGZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiwgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgY29uY2F0TWFwLCBtYXAsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcblxyXG4vKioqKioqKioqKiBDb21wb25lbnQgJiBTZXJ2aWNlICoqKioqKioqKiovXHJcbmltcG9ydCB7XHJcbiAgWkNvbXBvbmVudCwgWkZpZWxkLFxyXG4gIEFsZXJ0U2VydmljZSwgQXV0aFNlcnZpY2UsIEZpZWxkU2VydmljZSwgVG9hc3RTZXJ2aWNlLFxyXG4gIFpHcm91cCwgWkNvbXBvbmVudFByb3BlcnRpZXMsIFpDb21wb25lbnRIZWxwZXJcclxufSBmcm9tICdtbWhnbG9iYWwtemNvcmUnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRFcnJvckhhbmRsZXJTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL2NvbXBvbmVudC1lcnJvci1oYW5kbGVyLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgWkdyaWQgfSBmcm9tIFwiLi4vemdyaWQvemdyaWQuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENvbnRhaW5lckZpZWxkQmFzZSB9IGZyb20gXCIuLi9jb21wb25lbnRzL2NvbnRhaW5lcmZpZWxkYmFzZS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgWkNvbXBvbmVudFNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvemNvbXBvbmVudC5zZXJ2aWNlXCI7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtenVkZicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3p1ZGYuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3p1ZGYuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFp1ZGZDb21wb25lbnQgZXh0ZW5kcyBDb250YWluZXJGaWVsZEJhc2UgaW1wbGVtZW50cyBaQ29tcG9uZW50LCBPbkluaXQge1xyXG5cclxuICAvLyBmb3JtRmllbGRzOiBhbnlbXTsgLy8gcG9wdWxhdGUgdXNpbmcgZmllbGQgZWxlbWVudC4gXHJcbiAgY29tcG9uZW50UHJvcGVydGllcyA9IG5ldyBaQ29tcG9uZW50UHJvcGVydGllcygpO1xyXG4gIGluaXRpYWxEYXRhVmFsdWU6IGFueTtcclxuICBjb21wb25lbnRQcmVmaXg6IHN0cmluZztcclxuICBjb21wb25lbnRTY29wZU5hbWU6IHN0cmluZztcclxuICBkaXNwbGF5RWxlbWVudE1vZGVsOiBhbnk7XHJcbiAgbXVsdGlWYWx1ZUdyb3VwR3JpZFZhbHVlOiBzdHJpbmdbXTtcclxuICBsb2FkZWRGaWVsZHNTZXF1ZW5jZTogYW55O1xyXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIHB1YmxpYyByZWFkb25seSBwcmVmaXhWYWx1ZU9wdGlvbiA9ICdfenVkZm12Z09wdGlvbnMnO1xyXG4gIHB1YmxpYyByZWFkb25seSBwcmVmaXhEYXRhU291cmNlTmFtZSA9ICdfenVkZm12Z0RhdGFTb3VyY2UnO1xyXG4gIHB1YmxpYyByZWFkb25seSBwcmVmaXhDb2x1bW5GaWVsZHNOYW1lID0gJ196dWRmbXZnQ29sdW1uRmllbGRzJztcclxuICBwdWJsaWMgcmVhZG9ubHkgcHJlZml4Q3VzdG9tQWRkQnV0dG9uT25DbGljayA9ICdfQ3VzdG9tQWRkQnV0dG9uT25DbGljayc7XHJcbiAgcHVibGljIHJlYWRvbmx5IHByZWZpeEN1c3RvbVJlc2V0QnV0dG9uT25DbGljayA9ICdfQ3VzdG9tUmVzZXRCdXR0b25PbkNsaWNrJztcclxuICBwdWJsaWMgcmVhZG9ubHkgcHJlZml4Q3VzdG9tUmVtb3ZlQnV0dG9uT25DbGljayA9ICdfQ3VzdG9tUmVtb3ZlQnV0dG9uT25DbGljayc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIGNvbXBvbmVudFNlcnZpY2U6IFpDb21wb25lbnRTZXJ2aWNlLCBcclxuICAgIHByaXZhdGUgZmllbGRTZXJ2aWNlOiBGaWVsZFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb21wb25lbnRFcnJvckhhbmRsZXJTZXJ2aWNlOiBDb21wb25lbnRFcnJvckhhbmRsZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXHJcbiAgKSB7XHJcbiAgICBzdXBlcihjb21wb25lbnRTZXJ2aWNlKVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBsZXQgb2JzOiBPYnNlcnZhYmxlPGFueT4gPSBvZih0aGlzLmRhdGEuVmFsdWUpO1xyXG5cclxuICAgIGlmICh0aGlzLmRhdGEuVmFsdWUgPT0gdW5kZWZpbmVkICYmIHRoaXMuZGF0YS5GaWVsZEVsZW1lbnRDb2RlKSB7XHJcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZSh0aGlzLmRhdGEuRmllbGRFbGVtZW50Q29kZSwgdGhpcy5ncm91cCk7XHJcbiAgICAgIG9icyA9IHRoaXMuZmllbGRTZXJ2aWNlLmdldEZvcm1GaWVsZENvZGUoZmllbGROYW1lLCAnRm9ybUZpZWxkJywgdGhpcywgJ2ZpZWxkcycpO1xyXG4gICAgfVxyXG5cclxuICAgIHN1cGVyLmluaXRDb21wb25lbnQoKS5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gb2JzKSxcclxuICAgICAgc3dpdGNoTWFwKChmaWVsZCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmRhdGEuRmllbGRFbGVtZW50Q29kZSkge1xyXG4gICAgICAgICAgLy8gdXNlIG9icyB2YWx1ZSBvbmx5IGlmIEZpZWxkRWxlbWVudENvZGUgaXMgc2V0LiBpZiBudG8gZGVmYXVsdCBhcyBudWxsLlxyXG4gICAgICAgICAgdGhpcy5kYXRhLlZhbHVlID0gZmllbGQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5kYXRhLlZhbHVlID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFN0b3JlIGluaXRpYWwgZGF0YSB2YWx1ZSBhbmQgc2V0IGNvbXBvbmVudCBzY29wZSBhbmQgcHJlZml4XHJcbiAgICAgICAgdGhpcy5pbml0aWFsRGF0YVZhbHVlID0gdGhpcy5kYXRhLlZhbHVlO1xyXG4gICAgICAgIHRoaXMuY29tcG9uZW50U2NvcGVOYW1lID0gJ3p1ZGZfJyArIHRoaXMuZGF0YS5OYW1lO1xyXG4gICAgICAgIHRoaXMuY29tcG9uZW50UHJlZml4ID0gJ3p1ZGZfJyArIHRoaXMuZGF0YS5OYW1lO1xyXG5cclxuICAgICAgICB0aGlzLmdyb3VwW3RoaXMuZGF0YS5OYW1lICsgJ01vZGVsJ10gPSBbXTtcclxuICAgICAgICByZXR1cm4gdGhpcy5sb2FkRm9ybSgpO1xyXG4gICAgICB9KSxcclxuICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9KVxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbmRlcnMgdGhlIGZpZWxkIGVsZW1lbnQgYW5kIHNldHMgdXAgdGhlIGZvcm0uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2FkRm9ybSgpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIG9mKHRydWUpLnBpcGUoXHJcbiAgICAgIC8vIFNldCB0aGUgU3ViVHlwZSB0byAnenVkZicuXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhLlN1YlR5cGUgPSAnenVkZic7XHJcbiAgICAgIH0pLFxyXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgZ3JvdXAgZm9yIHRoZSBmaWVsZCBhbmQgc2V0IHVwIHRoZSBmb3JtLlxyXG4gICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBaR3JvdXAgZm9yIHRoZSBmaWVsZCBpZiBvbmUgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxyXG4gICAgICAgIGlmICghdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0pIHtcclxuICAgICAgICAgIHRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdID0gbmV3IFpHcm91cCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRGVjbGFyZSBhIG5ldyB6TW9kZWwgb2JqZWN0IGZvciB0aGUgWkdyb3VwLlxyXG4gICAgICAgIGNvbnN0IHp1ZGZTY29wZUdyb3VwID0gdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV07XHJcbiAgICAgICAgenVkZlNjb3BlR3JvdXAuek1vZGVsID0ge307XHJcblxyXG4gICAgICAgIC8vIFJlbmRlciB0aGUgZmllbGQgZWxlbWVudC5cclxuICAgICAgICB0aGlzLnJlbmRlckZpZWxkRWxlbWVudCh0aGlzLmRhdGEuVmFsdWUpO1xyXG5cclxuICAgICAgICAvLyBTZXQgdGhlIGZvcm0gZm9yIHRoZSBaR3JvdXAgc2NvcGUuXHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5WYWx1ZSkge1xyXG4gICAgICAgICAgLy8gSWYgVmFsdWUgaXMgbm90IG51bGwsIGJpbmQgdGhlIGV4aXN0aW5nIGZvcm0uXHJcbiAgICAgICAgICB6dWRmU2NvcGVHcm91cC5mb3JtID0gdGhpcy5mb3JtO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBJZiBWYWx1ZSBpcyBudWxsLCBjcmVhdGUgYSBuZXcgZm9ybSB3aXRoIGFuIGVtcHR5IGZvcm0gY29udHJvbC5cclxuICAgICAgICAgIGNvbnN0IGZvcm1Db250cm9sOiB7IFtrZXk6IHN0cmluZ106IEZvcm1Db250cm9sIH0gPSB7fTtcclxuICAgICAgICAgIHp1ZGZTY29wZUdyb3VwLmZvcm0gPSBuZXcgRm9ybUdyb3VwKGZvcm1Db250cm9sKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgICAvLyBTZXQgdGhlIGZvcm1GaWVsZHMgcHJvcGVydHkgZm9yIGRpc3BsYXkuXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgLy8gdGhpcy5mb3JtRmllbGRzID0gT2JqZWN0LmFzc2lnbihbXSwgdGhpcy5kYXRhLlZhbHVlKTtcclxuXHJcbiAgICAgICAgWkNvbXBvbmVudEhlbHBlci5hcHBlbmRDb25zb2xlV2F0Y2hMaXN0KHRoaXMuZ3JvdXAsIGBncm91cC4ke3RoaXMuY29tcG9uZW50U2NvcGVOYW1lfS56TW9kZWxgKTtcclxuXHJcbiAgICAgICAgLy8gQ2FsbCB0aGUgYWZ0ZXI8RmllbGQ+TG9hZGVkIGZ1bmN0aW9uIGlmIGl0IGV4aXN0cyBpbiB0aGUgZ3JvdXAuXHJcbiAgICAgICAgY29uc3QgZmllbGROYW1lID0gJ2FmdGVyJyArICh0aGlzLmRhdGEuTmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRoaXMuZGF0YS5OYW1lLnNsaWNlKDEpKSArICdMb2FkZWQnO1xyXG4gICAgICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5ncm91cFtmaWVsZE5hbWVdKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBbZmllbGROYW1lXSh0aGlzLmdyb3VwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHNldCBGaWVsZCBkaXYgY2xhc3NcclxuICAgICAgICAvLyBSZXBsYWNlZCB3aXRoOiB0aGlzLmZpZWxkU2VydmljZS5wYXRjaEZpZWxkUHJvcGVydHkoZmllbGQpO1xyXG4gICAgICAgIC8vIFpDb21wb25lbnRIZWxwZXIuc2V0RmllbGRzRGl2Q2xhc3ModGhpcy5ncm91cC5fcHJvamVjdE5hbWUsIHRoaXMuZ3JvdXAuZmllbGROYW1lLCB0aGlzLmRhdGEsIHRoaXMuYXV0aFNlcnZpY2UpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRGb3JtQ29udHJvbFZhbGlkYXRpb24oZm9ybUNvbnRyb2xOYW1lOiBzdHJpbmcsIHZhbGlkYXRvcjogYW55KSB7XHJcbiAgICBkZWJ1Z2dlcjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbmRlcnMgZmllbGQgZWxlbWVudHMgYmFzZWQgb24gYSBKU09OIHN0cmluZy5cclxuICAgKiBAcGFyYW0gZ3JvdXAgVGhlIFpHcm91cCBvYmplY3QgdG8gd2hpY2ggdGhlIGZpZWxkIGVsZW1lbnRzIHdpbGwgYmUgYWRkZWQuXHJcbiAgICogQHBhcmFtIGpzb25TdHJpbmcgVGhlIEpTT04gc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZmllbGQgZWxlbWVudHMuXHJcbiAgICovXHJcbiAgcHVibGljIHJlbmRlckZpZWxkRWxlbWVudEJ5SnNvblN0cmluZyhncm91cDogWkdyb3VwLCBqc29uU3RyaW5nOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIC8vIFBhcnNlIHRoZSBKU09OIHN0cmluZyBpbnRvIGFuIGFycmF5IG9mIGZpZWxkIGVsZW1lbnRzLlxyXG4gICAgY29uc3QgZmllbGRFbGVtZW50TWFzdGVyQ29kZUpzb25BcnJheSA9IEpTT04ucGFyc2UoanNvblN0cmluZyk7XHJcblxyXG4gICAgLy8gUmVuZGVyIHRoZSBmaWVsZCBlbGVtZW50cy5cclxuICAgIHRoaXMucmVuZGVyRmllbGRFbGVtZW50KGZpZWxkRWxlbWVudE1hc3RlckNvZGVKc29uQXJyYXkpO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIERpc3BsYXkgbW9kZWxcclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBkaXNwbGF5IG1vZGVsIGZvciBhIHp1ZGYgKHplcm8tdXRpbGl0eSBkYXRhIGZpZWxkKSBlbGVtZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHVzZSBmb3IgdGhlIGRpc3BsYXkgbW9kZWwuXHJcbiAgICovXHJcbiAgcHVibGljIHNldERpc3BsYXlNb2RlbCh2YWx1ZTogYW55KSB7XHJcbiAgICAvLyBSZXBsYWNlIHRoZSB3aG9sZSBkaXNwbGF5IG1vZGVsIHdpdGggdGhlIG5ldyB2YWx1ZVxyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIC8vIENsZWFyIHRoZSBmb3JtIGNvbnRyb2xcclxuICAgICAgdGhpcy5jbGVhckZvcm1Db250cm9sKCk7XHJcblxyXG4gICAgICAvLyBNYWtlIGEgZGVlcCBjb3B5IG9mIHRoZSB2YWx1ZSB0byBhdm9pZCBhbnkgdW53YW50ZWQgcmVmZXJlbmNlIGVycm9yc1xyXG4gICAgICB0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWwgPSBaQ29tcG9uZW50SGVscGVyLmRlZXBDbG9uZSh2YWx1ZSk7XHJcblxyXG4gICAgICAvLyBSZW5kZXIgdGhlIGZpZWxkIGVsZW1lbnQgYmFzZWQgb24gdGhlIG5ldyBkaXNwbGF5IG1vZGVsXHJcbiAgICAgIHRoaXMucmVuZGVyRmllbGRFbGVtZW50KHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gSWYgdGhlIHZhbHVlIGlzIGludmFsaWQsIGxvZyBhIHdhcm5pbmcgbWVzc2FnZVxyXG4gICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgdmFsdWUgdXNlZCBmb3IgcmVuZGVyIHp1ZGYgJyArIHRoaXMuZGF0YS5OYW1lKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogVXBkYXRlcyBhIHZhbHVlIGluIHRoZSBkaXNwbGF5IGVsZW1lbnQgbW9kZWwgYXQgdGhlIHNwZWNpZmllZCBmbGF0IGluZGV4LlxyXG4gICogQHBhcmFtIHsqfSB2YWx1ZSAtIFRoZSBuZXcgdmFsdWUgdG8gYmUgc2V0LlxyXG4gICogQHBhcmFtIHtzdHJpbmd9IGZsYXRJbmRleCAtIFRoZSBmbGF0IGluZGV4IGluZGljYXRpbmcgdGhlIGxvY2F0aW9uIGluIHRoZSBkaXNwbGF5IGVsZW1lbnQgbW9kZWwgd2hlcmUgdGhlIHZhbHVlIHNob3VsZCBiZSB1cGRhdGVkLlxyXG4gICovXHJcbiAgcHVibGljIHVwZGF0ZURpc3BsYXlNb2RlbCh2YWx1ZTogYW55LCBmbGF0SW5kZXg6IHN0cmluZykge1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci51cGRhdGVBcnJheU9iamVjdEJ5RmxhdEluZGV4KHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbCwgZmxhdEluZGV4LCB2YWx1ZSk7XHJcbiAgICB0aGlzLnVwZGF0ZUZvcm1GaWVsZCgpO1xyXG4gICAgLy90aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEFwcGVuZHMgYSB2YWx1ZSB0byB0aGUgZGlzcGxheSBlbGVtZW50IG1vZGVsIGF0IHRoZSBzcGVjaWZpZWQgZmxhdCBpbmRleC5cclxuICAqIEBwYXJhbSB7Kn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gYmUgYXBwZW5kZWQuXHJcbiAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdEluZGV4IC0gVGhlIGZsYXQgaW5kZXggaW5kaWNhdGluZyB0aGUgbG9jYXRpb24gaW4gdGhlIGRpc3BsYXkgZWxlbWVudCBtb2RlbCB3aGVyZSB0aGUgdmFsdWUgc2hvdWxkIGJlIGFwcGVuZGVkLlxyXG4gICovXHJcbiAgcHVibGljIGFwcGVuZFRvRGlzcGxheU1vZGVsKHZhbHVlOiBhbnksIGZsYXRJbmRleDogc3RyaW5nKSB7XHJcbiAgICAvLyBBcHBlbmQgdG8gZGlzcGxheSBtb2RlbCBtZWFucyBpdCB3aWxsIGluc2VydCB0aGUgZm9ybSBjb250cm9sIGJhc2VkIG9uIGZsYXQgaW5kZXguXHJcbiAgICBpZiAoZmxhdEluZGV4Lmxlbmd0aCA+PSAzKSB7XHJcbiAgICAgIGZsYXRJbmRleC5zdWJzdHJpbmcoMCwgZmxhdEluZGV4Lmxlbmd0aCAtIDIpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNlbGVjdGVkUmVjb3JkID0gWkNvbXBvbmVudEhlbHBlci5nZXRGcm9tQXJyYXlPYmplY3RCeUZsYXRJbmRleCh0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWwsIGZsYXRJbmRleCk7XHJcbiAgICBzZWxlY3RlZFJlY29yZC5WYWx1ZS5wdXNoKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBkZWVwIGNvcHkgb2YgdGhlIGRpc3BsYXkgZWxlbWVudCBtb2RlbC5cclxuICAgKiBAcmV0dXJucyB7YW55fSBBIGRlZXAgY29weSBvZiB0aGUgZGlzcGxheSBlbGVtZW50IG1vZGVsLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXREaXNwbGF5TW9kZWwoKSB7XHJcbiAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWwpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gdGhlIGRpc3BsYXkgZWxlbWVudCBtb2RlbCBhbmQgY2xlYXJzIHRoZSBmb3JtIGNvbnRyb2wuXHJcbiAgICovXHJcbiAgcHVibGljIHJlbW92ZUFsbERpc3BsYXlNb2RlbCgpIHtcclxuICAgIHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbCA9IFtdO1xyXG4gICAgdGhpcy5jbGVhckZvcm1Db250cm9sKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmVzIGFuIGVsZW1lbnQgZnJvbSB0aGUgZGlzcGxheSBlbGVtZW50IG1vZGVsIGF0IHRoZSBzcGVjaWZpZWQgZmxhdCBpbmRleCBhbmQgdXBkYXRlcyB0aGUgZm9ybSBmaWVsZC5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdEluZGV4IC0gVGhlIGZsYXQgaW5kZXggaW5kaWNhdGluZyB0aGUgbG9jYXRpb24gaW4gdGhlIGRpc3BsYXkgZWxlbWVudCBtb2RlbCB3aGVyZSB0aGUgZWxlbWVudCBzaG91bGQgYmUgcmVtb3ZlZC5cclxuICAgKi9cclxuICBwdWJsaWMgcmVtb3ZlRWxlbWVudEZyb21EaXNwbGF5TW9kZWwoZmxhdEluZGV4OiBzdHJpbmcpIHtcclxuICAgIFpDb21wb25lbnRIZWxwZXIucmVtb3ZlQXJyYXlPYmplY3RCeUZsYXRJbmRleCh0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWwsIGZsYXRJbmRleCk7XHJcbiAgICB0aGlzLnVwZGF0ZUZvcm1GaWVsZCgpO1xyXG5cclxuICAgIC8vIFRPRE86IHJlbW92ZSBmcm9tIHptb2RlbFxyXG4gICAgLy9kZWxldGUgdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0uek1vZGVsWycnXTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGVuZHMgYSBmb3JtIGNvbnRyb2wgdG8gdGhlIGZvcm0gYW5kIHRoZSBkaXNwbGF5IGVsZW1lbnQgbW9kZWwuXHJcbiAgICogQHBhcmFtIHtaRmllbGR9IGZpZWxkRGF0YSAtIFRoZSBkYXRhIGZvciB0aGUgZm9ybSBjb250cm9sIHRvIGJlIGFwcGVuZGVkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBhcHBlbmRGb3JtQ29udHJvbChmaWVsZERhdGEpIHtcclxuICAgIC8vIEFwcGVuZCBmb3JtIGNvbnRyb2wgbWVhbnMgaXQgd2lsbCBqdXN0IGluc2VydCB0aGUgZm9ybSBjb250cm9sIGF0IHRoZSBlbmQuXHJcbiAgICBmaWVsZERhdGEuTmFtZSA9IHRoaXMuZ2VuZXJhdGVGb3JtQ29udHJvbE5hbWUoZmllbGREYXRhLk5hbWUsIGZpZWxkRGF0YVsnY29udGFpbmVyTmFtZSddKTtcclxuICAgIGNvbnN0IGZvcm1Db250cm9scyA9IHt9O1xyXG5cclxuICAgIGZvcm1Db250cm9sc1tmaWVsZERhdGEuTmFtZV0gPSBuZXcgRm9ybUNvbnRyb2woXHJcbiAgICAgIHRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdLnpNb2RlbFtmaWVsZERhdGEuTmFtZV1cclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5mb3JtLmFkZENvbnRyb2woZmllbGREYXRhLk5hbWUsIGZvcm1Db250cm9sc1tmaWVsZERhdGEuTmFtZV0pO1xyXG5cclxuICAgIGlmICghdGhpcy5kYXRhLlZhbHVlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdmb3JtRmllbGQgJyArIHRoaXMuZGF0YS5OYW1lICsgJyBpcyB1bmRlZmluZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWwgPSB0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWwgPz8gW107XHJcbiAgICB0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWwucHVzaChmaWVsZERhdGEpO1xyXG4gICAgdGhpcy51cGRhdGVGb3JtRmllbGQoKTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbmRlcnMgZmllbGQgZWxlbWVudHMgYXMgZm9ybSBjb250cm9scyBpbiBhIG5ldyBmb3JtIGdyb3VwLlxyXG4gICAqIEBwYXJhbSB7YW55fSBmaWVsZEVsZW1lbnRzIC0gVGhlIGZpZWxkIGVsZW1lbnRzIHRvIGJlIHJlbmRlcmVkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyByZW5kZXJGaWVsZEVsZW1lbnQoZmllbGRFbGVtZW50cykge1xyXG4gICAgdGhpcy5jbGVhclpNb2RlbCgpO1xyXG5cclxuICAgIGlmIChmaWVsZEVsZW1lbnRzKSB7XHJcbiAgICAgIHRoaXMubG9hZGVkRmllbGRzU2VxdWVuY2UgPSB7fTtcclxuICAgICAgY29uc3QgZm9ybUNvbnRyb2xzID0ge307XHJcbiAgICAgIGZpZWxkRWxlbWVudHMgPSB0aGlzLmdlbmVyYXRlRm9ybUNvbnRyb2xzKGZpZWxkRWxlbWVudHMsIGZvcm1Db250cm9scyk7XHJcblxyXG4gICAgICAvLyBVbnN1YnNjcmliZSBmcm9tIHByZXZpb3VzIHN1YnNjcmlwdGlvbiBpZiBleGlzdHNcclxuICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUmVuZGVyIGZvcm0gY29udHJvbHMgdG8gbmV3IGZvcm0gZ3JvdXBcclxuICAgICAgdGhpcy5mb3JtID0gbmV3IEZvcm1Hcm91cChmb3JtQ29udHJvbHMpO1xyXG4gICAgICB0aGlzLmRhdGEuVmFsdWUgPSBmaWVsZEVsZW1lbnRzO1xyXG4gICAgICB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXS5mb3JtID0gdGhpcy5mb3JtO1xyXG4gICAgICB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXVsnbG9hZGVkRmllbGRzU2VxdWVuY2UnXSA9IHRoaXMubG9hZGVkRmllbGRzU2VxdWVuY2U7XHJcblxyXG4gICAgICAvLyBTdWJzY3JpYmUgdG8gY29tcG9uZW50TG9hZGVkJCBldmVudFxyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuZmllbGRTZXJ2aWNlLmdldENvbXBvbmVudExvYWRlZCQoJ3p1ZGYnKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIC8vIEFsbCBjb21wb25lbnRzIGhhdmUgZmluaXNoZWQgbG9hZGluZ1xyXG5cclxuICAgICAgICBjb25zdCB6dWRmR3JvdXAgPSB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXTtcclxuICAgICAgICBpZiAoenVkZkdyb3VwWydsaW5rZWRDb21wb25lbnQnXSkge1xyXG4gICAgICAgICAgenVkZkdyb3VwWydsaW5rZWRDb21wb25lbnQnXS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBsaW5rZWRDb21wb25lbnRTZWdtZW50cyA9IGl0ZW0udmFsdWUuc3BsaXQoJ18nKTtcclxuICAgICAgICAgICAgY29uc3QgcGFyZW50Q29tcG9uZW50TmFtZSA9IGxpbmtlZENvbXBvbmVudFNlZ21lbnRzLnNsaWNlKDAsIDIpLmpvaW4oJ18nKSArICdfJyArIGl0ZW0ubGlua2VkQ29tcG9uZW50O1xyXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRDb21wb25lbnQgPSBaQ29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudEJ5VmFsdWUodGhpcy5ncm91cCwgcGFyZW50Q29tcG9uZW50TmFtZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkQ29tcG9uZW50ID0gWkNvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnRCeVZhbHVlKHRoaXMuZ3JvdXAsIGl0ZW0udmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHBhcmVudENvbXBvbmVudCAmJiBjaGlsZENvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsU2VsZWN0T3B0aW9ucyA9IGNoaWxkQ29tcG9uZW50LmRhdGFbJ29yaWdpbmFsU2VsZWN0T3B0aW9ucyddID8/IE9iamVjdC5hc3NpZ24oW10sIGNoaWxkQ29tcG9uZW50LmRhdGEuU2VsZWN0T3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRTZWxlY3Rpb25PcHRpb25zID0gb3JpZ2luYWxTZWxlY3RPcHRpb25zLmZpbHRlcihvcHRpb24gPT4gb3B0aW9uLnBhcmVudEV4cHJlc3Npb24gPT0genVkZkdyb3VwLnpNb2RlbFtwYXJlbnRDb21wb25lbnROYW1lXSk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIE1hbnVhbGx5IHBhdGNoIHRoZSBjb21wb25lbnQgZm9ybSBjb250cm9sIHZhbHVlXHJcbiAgICAgICAgICAgICAgY29uc3QgenVkZkZvcm0gPSB6dWRmR3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50Rm9ybUNvbnRyb2wgPSB6dWRmRm9ybS5jb250cm9sc1tpdGVtLnZhbHVlXSBhcyBGb3JtQ29udHJvbDtcclxuICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Rm9ybUNvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIGNoaWxkQ29tcG9uZW50LnNldFNlbGVjdE9wdGlvbihmaWx0ZXJlZFNlbGVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50Rm9ybUNvbnRyb2wucGF0Y2hWYWx1ZSh6dWRmR3JvdXAuek1vZGVsW2l0ZW0udmFsdWVdKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1VuYWJsZSB0byBnZXQgZm9ybWNvbnRyb2wgZm9yICcgKyBpdGVtLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHp1ZGZGb3JtKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gVG8gY29uc2lkZXI6IFRyaWdnZXIgdGhlIFwib25jaGFuZ2VcIiBldmVudCBvciBwZXJmb3JtIGFueSBvdGhlciBuZWNlc3NhcnkgYWN0aW9ucyBoZXJlXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZUZvcm1Db250cm9scyhmaWVsZEFycmF5OiBhbnksIGZvcm1Db250cm9sczogeyBba2V5OiBzdHJpbmddOiBGb3JtQ29udHJvbCB9LCBjb250YWluZXJOYW1lPzogc3RyaW5nLCBpc011bHRpVmFsdWVHcm91cCA9IGZhbHNlLCBmaWVsZFZhbHVlR3JvdXBlZCA9IGZhbHNlLCBpbmRleCA9ICcnKSB7XHJcbiAgICBmaWVsZEFycmF5LmZvckVhY2goKGZpZWxkLCBpKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZpZWxkSW5kZXggPSBpbmRleCA/IGAke2luZGV4fS4ke2kgKyAxfWAgOiBgJHtpfWA7XHJcblxyXG4gICAgICB0aGlzLmZpZWxkU2VydmljZS5wYXRjaEZpZWxkUHJvcGVydHkoZmllbGQpO1xyXG4gICAgICBpZiAodHlwZW9mIGZpZWxkLlZhbHVlID09PSBcInN0cmluZ1wiICYmIGZpZWxkLlZhbHVlLmluZGV4T2YoXCIuXCIpICE9PSAtMSkge1xyXG4gICAgICAgIGlmIChbJ3pncmlkJywgJ3p0cmVlJywgJ3ppbWcnLCAndGV4dGFyZWFqc29uJ10uaW5kZXhPZihmaWVsZC5UeXBlKSA9PT0gLTEpIHtcclxuICAgICAgICAgIGNvbnNvbGUud2FybihcIkZvcm1Db250cm9sIC0gaW52YWxpZCBmaWVsZCB2YWx1ZVwiLCBmaWVsZC5WYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHp1ZGZHcm91cCA9IHRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdO1xyXG5cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZC5WYWx1ZSkpIHtcclxuICAgICAgICAgIC8vIGluc2VydCBtdWx0aXZhbHVlZ3JvdXAgdG8gdGhlIGNhcmQgdmFsdWUgaWYgdHJ1ZVxyXG4gICAgICAgICAgY29uc3QgZmllbGRWYWx1ZUdyb3VwZWQgPSBmaWVsZC5UeXBlID09IENvbXBvbmVudFR5cGUuZ3JvdXBpbmcgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmxvYWRlZEZpZWxkc1NlcXVlbmNlW2ZpZWxkSW5kZXhdID0ge1xyXG4gICAgICAgICAgICBuYW1lOiBmaWVsZC5NdWx0aVZhbHVlZEdyb3VwID8gYCR7dGhpcy5nZW5lcmF0ZUZvcm1Db250cm9sTmFtZShmaWVsZC5OYW1lKX0ke3RoaXMucHJlZml4VmFsdWVPcHRpb259YCA6IGAke3RoaXMuZ2VuZXJhdGVGb3JtQ29udHJvbE5hbWUoZmllbGQuTmFtZSl9YCxcclxuICAgICAgICAgICAgbGFiZWw6IGZpZWxkLlRpdGxlLFxyXG4gICAgICAgICAgICB0eXBlOiBmaWVsZC5UeXBlLFxyXG4gICAgICAgICAgICBpc011bHRpVmFsdWVHcm91cDogZmllbGQuTXVsdGlWYWx1ZWRHcm91cCA/PyBmYWxzZSxcclxuICAgICAgICAgICAgaXNHcm91cGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgaXNWaXNpYmxlOiBmaWVsZC5WaXNpYmxlID8/IGZhbHNlLFxyXG4gICAgICAgICAgICBpc1JlcXVpcmVkOiBmaWVsZC5Jc1JlcXVpcmVkID8/IGZhbHNlLFxyXG4gICAgICAgICAgICBpc1JlYWRPbmx5OiBmaWVsZC5SZWFkT25seSA/PyBmYWxzZVxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBpZiAoZmllbGQuTXVsdGlWYWx1ZWRHcm91cCkge1xyXG4gICAgICAgICAgICB0aGlzLnNldE11bHRpVmFsdWVHcm91cChmaWVsZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmdlbmVyYXRlRm9ybUNvbnRyb2xzKGZpZWxkLlZhbHVlLCBmb3JtQ29udHJvbHMsIGZpZWxkLk5hbWUsIGZpZWxkLk11bHRpVmFsdWVkR3JvdXAsIGZpZWxkVmFsdWVHcm91cGVkLCBmaWVsZEluZGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAvLyBiZWZvcmUgZ2VuZXJhdGUgRm9ybUNvbnRyb2wsIHdlIG5lZWQgdG8gYWRkIDIgYXR0cmlidXRlIHRvIHRoZSBmaWVsZCB3aGVuIHJlbmRlci5cclxuICAgICAgICAgIC8vIHRoaXMgZm9yIGxhdGVyIG9uLCB3ZSBjYW4gZWFzaWx5IGtub3cgdGhpcyBmaWVsZCBiZWxvbmcgdG8gd2hpY2ggenVkZiBhbmQgdW5kZXIgd2hpY2ggY29udGFpbmVyLlxyXG4gICAgICAgICAgaWYgKGNvbnRhaW5lck5hbWUpIHtcclxuICAgICAgICAgICAgZmllbGRbJ2NvbnRhaW5lck5hbWUnXSA9IGNvbnRhaW5lck5hbWU7XHJcbiAgICAgICAgICAgIGlmICghenVkZkdyb3VwW2NvbnRhaW5lck5hbWVdKSB7XHJcbiAgICAgICAgICAgICAgenVkZkdyb3VwW2NvbnRhaW5lck5hbWVdID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBpc0Zvcm1Db250cm9sID0gWkNvbXBvbmVudEhlbHBlci5pc0Zvcm1Db250cm9sKGZpZWxkKTtcclxuICAgICAgICAgIGNvbnN0IGlzVmlzaWJsZSA9IFpDb21wb25lbnRIZWxwZXIuaXNWaXNpYmxlRm9ybUNvbnRyb2wodGhpcywgZmllbGQpO1xyXG4gICAgICAgICAgY29uc3QgaXNSZXF1aXJlZCA9IFpDb21wb25lbnRIZWxwZXIuaXNSZXF1aXJlZEZvcm1Db250cm9sKHRoaXMsIGZpZWxkKTtcclxuXHJcbiAgICAgICAgICBpZiAoaXNGb3JtQ29udHJvbCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMubG9hZGVkRmllbGRzU2VxdWVuY2UpIHtcclxuICAgICAgICAgICAgICB0aGlzLmxvYWRlZEZpZWxkc1NlcXVlbmNlID0ge307XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChmaWVsZC5UeXBlID09PSAnenVpc2VsZWN0bXVsdGlwbGUnKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5maWVsZFNlcnZpY2UuaW5jcmVtZW50Q29tcG9uZW50Q291bnRlcignenVkZicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZpZWxkLk5hbWUgPSB0aGlzLmdlbmVyYXRlRm9ybUNvbnRyb2xOYW1lKGZpZWxkLk5hbWUsIGNvbnRhaW5lck5hbWUpO1xyXG4gICAgICAgICAgICBmaWVsZC5WYWx1ZSA9IHRoaXMuZ2VuZXJhdGVGb3JtQ29udHJvbE5hbWUoZmllbGQuVmFsdWUsIGNvbnRhaW5lck5hbWUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5sb2FkZWRGaWVsZHNTZXF1ZW5jZVtmaWVsZEluZGV4XSA9IHtcclxuICAgICAgICAgICAgICBuYW1lOiBmaWVsZC5OYW1lLFxyXG4gICAgICAgICAgICAgIGxhYmVsOiBmaWVsZC5MYWJlbCxcclxuICAgICAgICAgICAgICB0eXBlOiBmaWVsZC5UeXBlLFxyXG4gICAgICAgICAgICAgIGlzTXVsdGlWYWx1ZUdyb3VwOiBpc011bHRpVmFsdWVHcm91cCxcclxuICAgICAgICAgICAgICBpc0dyb3VwZWQ6IGZpZWxkVmFsdWVHcm91cGVkLFxyXG4gICAgICAgICAgICAgIGlzVmlzaWJsZTogZmllbGQuVmlzaWJsZSA/PyBmYWxzZSxcclxuICAgICAgICAgICAgICBpc1JlcXVpcmVkOiBmaWVsZC5Jc1JlcXVpcmVkID8/IGZhbHNlLFxyXG4gICAgICAgICAgICAgIGlzUmVhZE9ubHk6IGZpZWxkLlJlYWRPbmx5ID8/IGZhbHNlXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBpZiAoY29udGFpbmVyTmFtZSkge1xyXG4gICAgICAgICAgICAgIGlmICghenVkZkdyb3VwW2NvbnRhaW5lck5hbWVdLmluY2x1ZGVzKGZpZWxkLlZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgenVkZkdyb3VwW2NvbnRhaW5lck5hbWVdLnB1c2goZmllbGQuVmFsdWUpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBzZXQgdGhlIGxpc3Qgb2YgZHJvcGRvd24gb3B0aW9uIHRvIHRoZSB2YXJpYWJsZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0Ryb3Bkb3duVHlwZShmaWVsZC5UeXBlKSAmJiBmaWVsZC5aRGF0YU9wdGlvbk5hbWUgJiYgZmllbGQuRHJvcGRvd25PcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncm91cC56RGF0YVtmaWVsZC5aRGF0YU9wdGlvbk5hbWVdID0gT2JqZWN0LmFzc2lnbihbXSwgZXZhbCgndGhpcy4nICsgZmllbGQuRHJvcGRvd25PcHRpb25zKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRHJvcGRvd25UeXBlKGZpZWxkLlR5cGUpICYmIGZpZWxkLnp1ZGZMaW5rZWRDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgICAvLyBrZWVwIGEgbGlzdCBvZiBsaW5rZWQgQ29tcG9uZW50LCBsYXRlciB3aWxsIGJlIHVzZWQgaW4gb25DaGFuZ2UgYXQgaW5wdXRmaWVsZGJhc2UuXHJcbiAgICAgICAgICAgICAgaWYgKCF6dWRmR3JvdXBbJ2xpbmtlZENvbXBvbmVudCddKSB7XHJcbiAgICAgICAgICAgICAgICB6dWRmR3JvdXBbJ2xpbmtlZENvbXBvbmVudCddID0gW107XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICB6dWRmR3JvdXBbJ2xpbmtlZENvbXBvbmVudCddLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZpZWxkLlZhbHVlLFxyXG4gICAgICAgICAgICAgICAgbGlua2VkQ29tcG9uZW50OiBmaWVsZC56dWRmTGlua2VkQ29tcG9uZW50XHJcbiAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIGtlZXAgYSBjb3B5IG9mIFNlbGVjdE9wdGlvbnMgdG8gb3JpZ2luYWxTZWxlY3RPcHRpb25zKHNhbWUgYXMgb25jaGFuZ2UpXHJcbiAgICAgICAgICAgICAgLy8gY2xlYXIgdGhlIFNlbGVjdGlvbk9wdGlvbiBzaW5jZSBpdCB3b250IGJlIHVzZWQgd2hlbiBmaXJzdCBpbml0LCB1bnRpbCBwYXJlbnQgZHJvcGRvd24gb3B0aW9uIGJlZW4gc2VsZWN0ZWQuXHJcbiAgICAgICAgICAgICAgZmllbGRbJ29yaWdpbmFsU2VsZWN0T3B0aW9ucyddID0gT2JqZWN0LmFzc2lnbihbXSwgZmllbGQuU2VsZWN0T3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgZmllbGQuU2VsZWN0T3B0aW9ucyA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBhdXRvIGFwcGVuZCBjdXJyZW50IHVzZXIgdG8gdGhlIHptb2RlbCBiYXNlIG9uIGZpZWxkIGVsZW1lbnQgYXR0cmlidXRlIFwienVkZlNldERlZmF1bHRVc2VyXCJcclxuICAgICAgICAgICAgaWYgKGZpZWxkLnp1ZGZTZXREZWZhdWx0VXNlcikge1xyXG4gICAgICAgICAgICAgIGlmICghenVkZkdyb3VwWydmaWVsZFJlcXVpcmVkRGVmYXVsdFVzZXInXSkge1xyXG4gICAgICAgICAgICAgICAgenVkZkdyb3VwWydmaWVsZFJlcXVpcmVkRGVmYXVsdFVzZXInXSA9IFtdO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgLy8ga2VlcCBhIGxpc3Qgb2YgZGVmYXVsdCB1c2VyIG5lZWQgdG8gYmUgZmlsbGVkIGluIHRoZSBzY29wZVxyXG4gICAgICAgICAgICAgIHp1ZGZHcm91cFsnZmllbGRSZXF1aXJlZERlZmF1bHRVc2VyJ10ucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IGZpZWxkLk5hbWUsXHJcbiAgICAgICAgICAgICAgICBjaGlsZEZpZWxkczogZmllbGQuQ2hpbGRGaWVsZHNcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gdmFsaWRhdG9yIGZvciB0aGUgY29tcG9uZW50XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBaQ29tcG9uZW50SGVscGVyLmdldFZhbGlkYXRvcnMoZmllbGQsIGlzVmlzaWJsZSwgaXNSZXF1aXJlZCk7XHJcbiAgICAgICAgICAgIGZvcm1Db250cm9sc1tmaWVsZC5WYWx1ZV0gPSBuZXcgRm9ybUNvbnRyb2woXHJcbiAgICAgICAgICAgICAgenVkZkdyb3VwLnpNb2RlbFtmaWVsZC5WYWx1ZV0sXHJcbiAgICAgICAgICAgICAgdmFsaWRhdG9yc1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpZiAoWkNvbXBvbmVudEhlbHBlci5oYXNDQ0ZpZWxkKGZpZWxkLlR5cGUpKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgY2NWYWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID0gWkNvbXBvbmVudEhlbHBlci5nZXRDQ1ZhbGlkYXRvcnMoZmllbGQsIGlzVmlzaWJsZSwgaXNSZXF1aXJlZCk7XHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xzW2ZpZWxkLkNDVmFsdWVdID0gbmV3IEZvcm1Db250cm9sKFxyXG4gICAgICAgICAgICAgICAgenVkZkdyb3VwLnpNb2RlbFtmaWVsZC5DQ1ZhbHVlXSxcclxuICAgICAgICAgICAgICAgIGNjVmFsaWRhdG9yc1xyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gb25jaGFuZ2UgaGFuZGxpbmc/XHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGZpZWxkQXJyYXk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmVzIHRoZSBmb3JtIGNvbnRyb2xzIGZyb20gdGhlIGZvcm0gZ3JvdXAgYW5kIHJlc2V0cyB0aGUgY29tcG9uZW50J3MgZGF0YSBhbmQgZGlzcGxheSBlbGVtZW50IG1vZGVsLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIGNsZWFyRm9ybUNvbnRyb2woKSB7XHJcbiAgICAvLyBSZW1vdmUgZWFjaCBmb3JtIGNvbnRyb2wgZnJvbSB0aGUgZm9ybSBncm91cFxyXG4gICAgaWYgKHRoaXMuZGF0YS5WYWx1ZSAmJiB0aGlzLmRhdGEuVmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmRhdGEuVmFsdWUuZm9yRWFjaChkYXRhID0+IHtcclxuICAgICAgICB0aGlzLmZvcm0ucmVtb3ZlQ29udHJvbChkYXRhLlZhbHVlKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVzZXQgdGhlIGNvbXBvbmVudCdzIGRhdGEgYW5kIGRpc3BsYXkgZWxlbWVudCBtb2RlbFxyXG4gICAgdGhpcy5kYXRhLlZhbHVlID0gdGhpcy5pbml0aWFsRGF0YVZhbHVlO1xyXG4gICAgdGhpcy5kaXNwbGF5RWxlbWVudE1vZGVsID0gW107XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBmb3JtIGZpZWxkcyBmb3IgdGhlIGNvbXBvbmVudC5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtvYmplY3RbXX0gLSBBbiBhcnJheSBvZiBmb3JtIGZpZWxkIG9iamVjdHMuXHJcbiAgICovXHJcbiAgcHVibGljIGdldEZvcm1Db250cm9sKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YS5WYWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHpNb2RlbCB2YWx1ZXMgb2YgYSBmb3JtIGdyb3VwIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBtb2RlbCBkYXRhLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtaR3JvdXB9IFtncm91cD10aGlzLmdyb3VwXSAtIFRoZSBmb3JtIGdyb3VwIHRvIHVwZGF0ZS5cclxuICAgKiBAcGFyYW0ge29iamVjdH0gbW9kZWxEYXRhIC0gVGhlIG1vZGVsIGRhdGEgdG8gYXBwbHkgdG8gdGhlIGZvcm0gZ3JvdXAuXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIHNldEZvcm1GaWVsZHpNb2RlbChncm91cCA9IHRoaXMuZ3JvdXAsIG1vZGVsRGF0YSkge1xyXG4gICAgLy8gQWRkIHRoZSBjb21wb25lbnQgcHJlZml4IHRvIHRoZSBtb2RlbCBkYXRhIHByb3BlcnR5IG5hbWVzXHJcbiAgICBjb25zdCBwYXRjaGVkTW9kZWxEYXRhID0gdGhpcy5hZGRaTW9kZWxQcm9wZXJ0eVByZWZpeChtb2RlbERhdGEpO1xyXG5cclxuICAgIC8vIFVwZGF0ZSB0aGUgek1vZGVsIHZhbHVlcyBvZiB0aGUgZm9ybSBncm91cFxyXG4gICAgT2JqZWN0LmFzc2lnbihncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0uek1vZGVsLCBwYXRjaGVkTW9kZWxEYXRhKTtcclxuXHJcbiAgICAvLyBVcGRhdGUgZ3JpZCB2YWx1ZXMgZm9yIGFueSBhcnJheXMgaW4gdGhlIG1vZGVsIGRhdGFcclxuICAgIGZvciAoY29uc3QgbW9kZWwgaW4gcGF0Y2hlZE1vZGVsRGF0YSkge1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRjaGVkTW9kZWxEYXRhW21vZGVsXSkpIHtcclxuICAgICAgICBjb25zdCBncmlkVmFsdWUgPSBgJHttb2RlbH0ke3RoaXMucHJlZml4VmFsdWVPcHRpb259YDtcclxuICAgICAgICBjb25zdCBncmlkRGF0YVNvdXJjZSA9IGAke21vZGVsfSR7dGhpcy5wcmVmaXhEYXRhU291cmNlTmFtZX1gO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGUgdGhlIGRhdGEgc291cmNlIGZvciB0aGUgZ3JpZFxyXG4gICAgICAgIGdyb3VwW2dyaWREYXRhU291cmNlXSA9IHBhdGNoZWRNb2RlbERhdGFbbW9kZWxdO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGUgdGhlIGdyaWQgdmFsdWVcclxuICAgICAgICBpZiAoZ3JvdXBbZ3JpZFZhbHVlXSkge1xyXG4gICAgICAgICAgZ3JvdXBbZ3JpZFZhbHVlXS5zZXREYXRhKGdyb3VwW2dyaWREYXRhU291cmNlXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVXBkYXRlIHRoZSBmb3JtIGdyb3VwIG1vZGVsXHJcbiAgICBjb25zdCBmb3JtR3JvdXAgPSB0aGlzLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgZm9ybUdyb3VwLnBhdGNoVmFsdWUoZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdLnpNb2RlbCk7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICogQWRkIHRoZSBjb21wb25lbnQgcHJlZml4IHRvIHByb3BlcnR5IG5hbWVzIGluIGFuIG9iamVjdC5cclxuICpcclxuICogQHBhcmFtIHsqfSBtb2RlbERhdGEgLSBUaGUgb2JqZWN0IHRvIHVwZGF0ZS5cclxuICogQHBhcmFtIHsqfSBbY29udGFpbmVyUHJlZml4XSAtIE9wdGlvbmFsIHBhcmFtZXRlciBpbmRpY2F0aW5nIHRoZSBwcmVmaXggdG8gdXNlIGZvciBwcm9wZXJ0aWVzIGluIG5lc3RlZCBvYmplY3RzLlxyXG4gKiBAcmV0dXJucyB7Kn0gVGhlIHVwZGF0ZWQgb2JqZWN0LlxyXG4gKi9cclxuICBwcml2YXRlIGFkZFpNb2RlbFByb3BlcnR5UHJlZml4KG1vZGVsRGF0YTogYW55LCBjb250YWluZXJQcmVmaXg/OiBhbnkpOiBhbnkge1xyXG4gICAgLy8gQ3JlYXRlIGEgbmV3IG9iamVjdCB0byBzdG9yZSB0aGUgdXBkYXRlZCBkYXRhXHJcbiAgICBjb25zdCB1cGRhdGVkTW9kZWxEYXRhID0ge307XHJcblxyXG4gICAgaWYgKHR5cGVvZiBtb2RlbERhdGEgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBtb2RlbERhdGEgPT09ICdudW1iZXInIHx8IFpDb21wb25lbnRIZWxwZXIuaXNOdWxsVW5kZWZpbmVkRW1wdHkobW9kZWxEYXRhKSkge1xyXG4gICAgICByZXR1cm4gbW9kZWxEYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIHByb3BlcnR5IGluIHRoZSBpbnB1dCBvYmplY3RcclxuICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIGluIG1vZGVsRGF0YSkge1xyXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcHJvcGVydHkgdmFsdWUgaXMgYW4gYXJyYXlcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobW9kZWxEYXRhW3Byb3BlcnR5TmFtZV0pKSB7XHJcbiAgICAgICAgLy8gSGFuZGxlIGFycmF5cyByZWN1cnNpdmVseVxyXG4gICAgICAgIGNvbnN0IHVwZGF0ZWRBcnJheSA9IFtdO1xyXG5cclxuICAgICAgICAvLyBMb29wIHRocm91Z2ggZWFjaCBlbGVtZW50IGluIHRoZSBhcnJheVxyXG4gICAgICAgIGZvciAoY29uc3QgYXJyYXlFbGVtZW50IG9mIG1vZGVsRGF0YVtwcm9wZXJ0eU5hbWVdKSB7XHJcbiAgICAgICAgICAvLyBSZWN1cnNpdmVseSBjYWxsIHRoaXMgbWV0aG9kIHRvIHVwZGF0ZSB0aGUgcHJvcGVydGllcyBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5XHJcbiAgICAgICAgICBjb25zdCB1cGRhdGVkRWxlbWVudCA9IHRoaXMuYWRkWk1vZGVsUHJvcGVydHlQcmVmaXgoYXJyYXlFbGVtZW50LCBwcm9wZXJ0eU5hbWUpO1xyXG5cclxuICAgICAgICAgIC8vIEFkZCB0aGUgdXBkYXRlZCBlbGVtZW50IHRvIHRoZSBhcnJheVxyXG4gICAgICAgICAgdXBkYXRlZEFycmF5LnB1c2godXBkYXRlZEVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQWRkIHRoZSB1cGRhdGVkIGFycmF5IHRvIHRoZSBvdXRwdXQgb2JqZWN0XHJcbiAgICAgICAgY29uc3QgcHJlZml4ZWRQcm9wZXJ0eU5hbWUgPSBgJHt0aGlzLmNvbXBvbmVudFByZWZpeH1fJHtwcm9wZXJ0eU5hbWV9YDtcclxuICAgICAgICB1cGRhdGVkTW9kZWxEYXRhW3ByZWZpeGVkUHJvcGVydHlOYW1lXSA9IHVwZGF0ZWRBcnJheTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0eXBlb2YgbW9kZWxEYXRhW3Byb3BlcnR5TmFtZV0gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgLy8gSGFuZGxlIG5lc3RlZCBvYmplY3RzIHJlY3Vyc2l2ZWx5XHJcbiAgICAgICAgY29uc3QgdXBkYXRlZE5lc3RlZE9iamVjdCA9IHRoaXMuYWRkWk1vZGVsUHJvcGVydHlQcmVmaXgobW9kZWxEYXRhW3Byb3BlcnR5TmFtZV0sIHByb3BlcnR5TmFtZSk7XHJcblxyXG4gICAgICAgIC8vIEFkZCB0aGUgdXBkYXRlZCBuZXN0ZWQgb2JqZWN0IHRvIHRoZSBvdXRwdXQgb2JqZWN0XHJcbiAgICAgICAgY29uc3QgcHJlZml4ZWRQcm9wZXJ0eU5hbWUgPSBgJHt0aGlzLmNvbXBvbmVudFByZWZpeH1fJHtwcm9wZXJ0eU5hbWV9YDtcclxuICAgICAgICB1cGRhdGVkTW9kZWxEYXRhW3ByZWZpeGVkUHJvcGVydHlOYW1lXSA9IHVwZGF0ZWROZXN0ZWRPYmplY3Q7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gQWRkIHRoZSBwcm9wZXJ0eSB0byB0aGUgb3V0cHV0IG9iamVjdCB3aXRoIHRoZSBjb21wb25lbnQgcHJlZml4XHJcbiAgICAgICAgbGV0IHByZWZpeGVkUHJvcGVydHlOYW1lO1xyXG4gICAgICAgIGlmIChjb250YWluZXJQcmVmaXgpIHtcclxuICAgICAgICAgIHByZWZpeGVkUHJvcGVydHlOYW1lID0gYCR7dGhpcy5jb21wb25lbnRQcmVmaXh9XyR7Y29udGFpbmVyUHJlZml4fV8ke3Byb3BlcnR5TmFtZX1gO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBwcmVmaXhlZFByb3BlcnR5TmFtZSA9IGAke3RoaXMuY29tcG9uZW50UHJlZml4fV8ke3Byb3BlcnR5TmFtZX1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICB1cGRhdGVkTW9kZWxEYXRhW3ByZWZpeGVkUHJvcGVydHlOYW1lXSA9IG1vZGVsRGF0YVtwcm9wZXJ0eU5hbWVdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmV0dXJuIHRoZSB1cGRhdGVkIG9iamVjdFxyXG4gICAgcmV0dXJuIHVwZGF0ZWRNb2RlbERhdGE7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Wk1vZGVsQXNTdHJpbmcoKSB7XHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5nZXRaTW9kZWwoKSk7XHJcbiAgfVxyXG5cclxuICBDb21wb25lbnRJc1Zpc2libGUoZmllbGQ6IFpGaWVsZCk6IGFueSB7XHJcbiAgICByZXR1cm4gWkNvbXBvbmVudEhlbHBlci5Db21wb25lbnRJc1Zpc2libGUoZmllbGQsIHRoaXMuZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEVuYWJsZSA9IChzdGF0dXM6IGJvb2xlYW4pID0+IHtcclxuICAgIHRoaXMuY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5ID0gIXN0YXR1cztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRWaXNpYmxlID0gKHN0YXR1czogYm9vbGVhbikgPT4ge1xyXG4gICAgdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZSA9IHN0YXR1cztcclxuICAgIHRoaXMuZGF0YS5WaXNpYmxlID0gc3RhdHVzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFJlcXVpcmUgPSAoc3RhdHVzOiBib29sZWFuKSA9PiB7XHJcbiAgICB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMuaXNSZXF1aXJlZCA9IHN0YXR1cztcclxuICAgIFpDb21wb25lbnRIZWxwZXIuY2hhbmdlVmFsaWRhdG9yKHN0YXR1cywgdGhpcy5ncm91cCwgdGhpcy5kYXRhLlZhbHVlLCB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMsIFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG5cclxuICAgIGlmICh0aGlzLmRhdGEuVHlwZSA9PT0gJ3p0ZXh0ZWRpdG9yJykge1xyXG4gICAgICBaQ29tcG9uZW50SGVscGVyLmNoYW5nZVZhbGlkYXRvcihzdGF0dXMsIHRoaXMuZ3JvdXAsIHRoaXMuZGF0YS5WYWx1ZSwgdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzLCBaQ29tcG9uZW50SGVscGVyLnJlcXVpcmVkVmFsaWRhdG9yX1dpdGhvdXRXaGl0ZVNwYWNlc19UZXh0RWRpdG9yKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBaQ29tcG9uZW50SGVscGVyLmNoYW5nZVZhbGlkYXRvcihzdGF0dXMsIHRoaXMuZ3JvdXAsIHRoaXMuZGF0YS5WYWx1ZSwgdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzLCBaQ29tcG9uZW50SGVscGVyLnJlcXVpcmVkVmFsaWRhdG9yX1dpdGhvdXRXaGl0ZVNwYWNlcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Rm9ybSgpIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF0ZXMgdGhlIG5hbWUgb2YgYSBmb3JtIGNvbnRyb2wgYmFzZWQgb24gaXRzIHR5cGUsIG5hbWUsIGFuZCBjb250YWluZXIgbmFtZS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udHJvbE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZm9ybSBjb250cm9sLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250YWluZXJOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciB0aGF0IHRoZSBmb3JtIGNvbnRyb2wgaXMgaW4uXHJcbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGdlbmVyYXRlZCBuYW1lIG9mIHRoZSBmb3JtIGNvbnRyb2wuXHJcbiAgICovXHJcbiAgcHVibGljIGdlbmVyYXRlRm9ybUNvbnRyb2xOYW1lKGNvbnRyb2xOYW1lOiBzdHJpbmcsIGNvbnRhaW5lck5hbWU/OiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IG1haW5QcmVmaXggPSBbdGhpcy5kYXRhLlR5cGUsIHRoaXMuZGF0YS5OYW1lLCBjb250YWluZXJOYW1lID8/IG51bGxdLmZpbHRlcihCb29sZWFuKS5qb2luKCdfJyk7XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgbmFtZSBoYXMgYmVlbiBwcmVmaXhlZC5cclxuICAgIGlmIChjb250cm9sTmFtZS5pbmNsdWRlcyhtYWluUHJlZml4KSkge1xyXG4gICAgICByZXR1cm4gY29udHJvbE5hbWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gV2UgdHJ5IHRvIHNwbGl0IHRoZSBuYW1lIGFuZCB1c2UgdGhlIGxhc3Qgc2VnbWVudC5cclxuICAgICAgLy8gU29tZXRpbWVzIHRoZSBjb250cm9sIG5hbWUgY2FuIGJlIHdpdGhvdXQgdGhlIGNvbnRhaW5lciBuYW1lLCBzbyB3ZSBzcGxpdCBhbmQgdXNlIHRoZSBuZXcgbWFpbiBwcmVmaXguXHJcbiAgICAgIGNvbnN0IGNvbnRyb2xOYW1lU2VnbWVudCA9IGNvbnRyb2xOYW1lLnNwbGl0KCdfJyk7XHJcbiAgICAgIGNvbnRyb2xOYW1lID0gY29udHJvbE5hbWVTZWdtZW50W2NvbnRyb2xOYW1lU2VnbWVudC5sZW5ndGggLSAxXTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gW21haW5QcmVmaXgsIGNvbnRyb2xOYW1lXS5qb2luKCdfJyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBcHBlbmRzIGEgcHJlZml4IHRvIHRoZSBuYW1lcyBhbmQgdmFsdWVzIG9mIGZpZWxkcyByZWN1cnNpdmVseS5cclxuICAgKiBAcGFyYW0ge1pGaWVsZFtdfSBmaWVsZHMgLSBUaGUgZmllbGRzIHRvIGJlIHByZWZpeGVkLlxyXG4gICAqIEBwYXJhbSB7YW55fSBwcmVmaXggLSBUaGUgcHJlZml4IHRvIGJlIGFkZGVkLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXBwZW5kUHJlZml4KGZpZWxkczogWkZpZWxkW10sIHByZWZpeDogYW55KSB7XHJcbiAgICBmaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkLlZhbHVlKSkge1xyXG4gICAgICAgIHRoaXMuYXBwZW5kUHJlZml4KGZpZWxkLlZhbHVlLCBwcmVmaXgpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGZpZWxkLk5hbWUgPSBbcHJlZml4LCBmaWVsZC5OYW1lXS5qb2luKCdfJyk7XHJcbiAgICAgICAgaWYgKGZpZWxkLlR5cGUgIT0gJ3pidXR0b25zJykge1xyXG4gICAgICAgICAgZmllbGQuVmFsdWUgPSBbcHJlZml4LCBmaWVsZC5WYWx1ZV0uam9pbignXycpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaWVsZC5TdWJUeXBlID0gcHJlZml4O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZXMgdGhlIGZvcm0gZmllbGRzIHdpdGggdGhlIGRpc3BsYXkgZWxlbWVudCBtb2RlbC5cclxuICAgKi9cclxuICBwcml2YXRlIHVwZGF0ZUZvcm1GaWVsZCgpIHtcclxuICAgIHRoaXMuZGF0YS5WYWx1ZSA9IHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgdmFsdWUgb2YgYSBjb250YWluZXIgbW9kZWwgaW4gdGhlIGZvcm0uXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRhaW5lck5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY29udGFpbmVyIHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBmcm9tLlxyXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGNvbnRhaW5lciBtb2RlbCB2YWx1ZXMuXHJcbiAgICovXHJcbiAgcHVibGljIGdldENvbnRhaW5lck1vZGVsVmFsdWUoY29udGFpbmVyTmFtZTogc3RyaW5nKTogT2JqZWN0IHtcclxuICAgIC8vIEdldCB0aGUgY29udGFpbmVyIGVsZW1lbnQgYW5kIGNyZWF0ZSBhbiBlbXB0eSBvYmplY3QgZm9yIHRoZSBtb2RlbCB2YWx1ZXMuXHJcbiAgICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV1bY29udGFpbmVyTmFtZV07XHJcbiAgICBjb25zdCBtb2RlbFZhbHVlID0ge307XHJcblxyXG4gICAgLy8gRmxhZyB0byBrZWVwIHRyYWNrIGlmIGFsbCByZXF1aXJlZCBmaWVsZHMgaW4gdGhlIGdyb3VwIGFyZSB2YWxpZC5cclxuICAgIGxldCB2YWxpZEdyb3VwRmllbGRzID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBMb29wIHRocm91Z2ggZWFjaCBlbGVtZW50IGluIHRoZSBjb250YWluZXIgYW5kIHJldHJpZXZlIGl0cyB2YWx1ZSBmcm9tIHRoZSB6TW9kZWwuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRhaW5lckVsZW1lbnQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgZWxlbWVudCA9IGNvbnRhaW5lckVsZW1lbnRbaV07XHJcbiAgICAgIGNvbnN0IGVsZW1lbnRDb21wb25lbnQgPSBaQ29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudEJ5VmFsdWUodGhpcy5ncm91cCwgZWxlbWVudCk7XHJcbiAgICAgIGxldCB6TW9kZWxWYWx1ZSA9IHRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdLnpNb2RlbFtlbGVtZW50XTtcclxuXHJcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBlbGVtZW50IGlzIHJlcXVpcmVkIGFuZCBoYXMgYSB2YWx1ZSwgaWYgbm90IHNob3cgYW4gZXJyb3IgbWVzc2FnZS5cclxuICAgICAgaWYgKGVsZW1lbnRDb21wb25lbnQuY29tcG9uZW50UHJvcGVydGllcy5pc1JlcXVpcmVkICYmIFpDb21wb25lbnRIZWxwZXIuaXNOdWxsVW5kZWZpbmVkRW1wdHkoek1vZGVsVmFsdWUpKSB7XHJcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyhlbGVtZW50Q29tcG9uZW50LmRhdGEuTGFiZWwgKyAnIGlzIHJlcXVpcmVkIGZpZWxkLiBQbGVhc2UgZmlsbCBpbiBhbGwgdGhlIHJlcXVpcmVkIGZpZWxkcyBiZWZvcmUgYWRkaW5nLicsICd0b3AnLCB0cnVlLCAzMDAwLCAnZGFuZ2VyJyk7XHJcbiAgICAgICAgdmFsaWRHcm91cEZpZWxkcyA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gQ2hlY2sgaWYgRHJvcGRvd24gVHlwZSwgY2hhbmdlIHpNb2RlbFZhbHVlIHRvIGRpc3BsYXkgdGV4dC5cclxuICAgICAgaWYgKHRoaXMuaXNEcm9wZG93blR5cGUoZWxlbWVudENvbXBvbmVudC5kYXRhLlR5cGUpKSB7XHJcbiAgICAgICAgY29uc3QgZHJvcGRvd25PcHRpb25zID0gZWxlbWVudENvbXBvbmVudC5nZXRJdGVtc0RhdGEoKTtcclxuICAgICAgICBkcm9wZG93bk9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4ge1xyXG4gICAgICAgICAgaWYgKG9wdGlvbltlbGVtZW50Q29tcG9uZW50Lml0ZW1WYWx1ZUZpZWxkXSA9PT0gek1vZGVsVmFsdWUpIHtcclxuICAgICAgICAgICAgek1vZGVsVmFsdWUgPSBvcHRpb25bZWxlbWVudENvbXBvbmVudC5pdGVtVGV4dEZpZWxkXVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBBZGQgdGhlIHZhbHVlIHRvIHRoZSBtb2RlbCBvYmplY3QuUGxlYXNlIGZpbGwgaW4gYWxsIHRoZSByZXF1aXJlZCBmaWVsZHMgYmVmb3JlIGFkZGluZ1xyXG4gICAgICBtb2RlbFZhbHVlW2VsZW1lbnRdID0gek1vZGVsVmFsdWU7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIElmIHRoZXJlIGFyZSBpbnZhbGlkIGZpZWxkcyBpbiB0aGUgZ3JvdXAsIHJldHVybiBhbiBlbXB0eSBtb2RlbCBvYmplY3QuXHJcbiAgICBpZiAoIXZhbGlkR3JvdXBGaWVsZHMpIHtcclxuICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJldHVybiB0aGUgbW9kZWwgb2JqZWN0IHdpdGggdGhlIGNvbnRhaW5lciB2YWx1ZXMuXHJcbiAgICByZXR1cm4gbW9kZWxWYWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogQ2xlYXJzIHRoZSB2YWx1ZSBvZiBhbGwgZmllbGQgZWxlbWVudHMgaW5zaWRlIGEgY29udGFpbmVyLlxyXG4gICogQHBhcmFtIHtzdHJpbmd9IGNvbnRhaW5lck5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY29udGFpbmVyIHdob3NlIGZpZWxkcyB3aWxsIGJlIGNsZWFyZWQuXHJcbiAgKi9cclxuICBwdWJsaWMgY2xlYXJDb250YWluZXJGaWVsZEVsZW1lbnRWYWx1ZShjb250YWluZXJOYW1lOiBzdHJpbmcpIHtcclxuICAgIC8vIEdldCB0aGUgY29udGFpbmVyIGVsZW1lbnQgZnJvbSB0aGUgY29tcG9uZW50J3MgZ3JvdXBcclxuICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXVtjb250YWluZXJOYW1lXTtcclxuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIGZpZWxkIGVsZW1lbnQgaW4gdGhlIGNvbnRhaW5lclxyXG4gICAgY29udGFpbmVyRWxlbWVudC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAvLyBTZXQgdGhlIG1vZGVsIHZhbHVlIG9mIHRoZSBmaWVsZCBlbGVtZW50IHRvIG51bGwsIGFuZCBmb3JjZSB1cGRhdGUgdGhlIHZpZXdcclxuICAgICAgdGhpcy5zZXRNb2RlbFZhbHVlKGVsZW1lbnQsIG51bGwsIHRydWUpO1xyXG5cclxuICAgICAgY29uc3QgZm9ybSA9IHRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdLmZvcm07XHJcbiAgICAgIE9iamVjdC5rZXlzKGZvcm0uY29udHJvbHMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtLmNvbnRyb2xzW2tleV07XHJcbiAgICAgICAgY29udHJvbC5tYXJrQXNQcmlzdGluZSgpO1xyXG4gICAgICAgIGNvbnRyb2wubWFya0FzVW50b3VjaGVkKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gLS0tLS0tLS0tLT09PT09PT09PT09PT09PT09PT09IE11bHRpIFZhbHVlIEdyb3VwID09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLSovXHJcbiAgLyoqXHJcbiAgICogU2V0cyB1cCBhIG11bHRpLXZhbHVlIGdyb3VwLCB3aGljaCBpcyBhIGdyaWQgb2YgZmllbGRzIHRoYXQgY2FuIGhhdmUgbXVsdGlwbGUgcm93cy5cclxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBjb25maWd1cmF0aW9uIGRhdGEgZm9yIHRoZSBtdWx0aS12YWx1ZSBncm91cC5cclxuICAgKiBAcGFyYW0gZGF0YUluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBkYXRhIGluIHRoZSBkaXNwbGF5TW9kZWwuIE9wdGlvbmFsLCB1c2VkIHdoZW4gdXBkYXRpbmcgZXhpc3RpbmcgZGF0YS5cclxuICAgKi9cclxuICBwdWJsaWMgc2V0TXVsdGlWYWx1ZUdyb3VwKGRhdGE6IGFueSwgZGF0YUluZGV4PzogYW55KSB7XHJcbiAgICAvLyBOZWVkIHRvIGRlY2xhcmUgbmFtZSwgdmFsdWUsIGRhdGFzb3VyY2UsIGNvbHVtbmZpZWxkcyBhdHRyaWJ1dGUgZm9yIGdyaWQuXHJcbiAgICBjb25zdCBuYW1lID0gdGhpcy5nZW5lcmF0ZUZvcm1Db250cm9sTmFtZShkYXRhLk5hbWUpO1xyXG4gICAgY29uc3QgZ3JpZFZhbHVlTmFtZSA9IGAke25hbWV9JHt0aGlzLnByZWZpeFZhbHVlT3B0aW9ufWA7XHJcbiAgICBjb25zdCBncmlkRGF0YVNvdXJjZU5hbWUgPSBgJHtuYW1lfSR7dGhpcy5wcmVmaXhEYXRhU291cmNlTmFtZX1gO1xyXG4gICAgY29uc3QgZ3JpZENvbHVtbkZpZWxkc05hbWUgPSBgJHtuYW1lfSR7dGhpcy5wcmVmaXhDb2x1bW5GaWVsZHNOYW1lfWA7XHJcblxyXG4gICAgLy8gR2VuZXJhdGUgYSB1bmlxdWUgbmFtZSBmb3IgdGhlIG11bHRpLXZhbHVlIGdyb3VwIHNjb3BlLlxyXG4gICAgY29uc3QgbXVsdGlWYWx1ZUdyb3VwU2NvcGVOYW1lID0gYG12Z18ke2RhdGEuTmFtZX1gO1xyXG5cclxuICAgIGlmICghdGhpcy5ncm91cFsnbXZnbGlzdCddKSB7XHJcbiAgICAgIHRoaXMuZ3JvdXBbJ212Z2xpc3QnXSA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5ncm91cFsnbXZnbGlzdCddLmluY2x1ZGVzKG5hbWUpKSB7XHJcbiAgICAgIHRoaXMuZ3JvdXBbJ212Z2xpc3QnXS5wdXNoKG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENyZWF0ZSBhIHByb3BlcnR5IGluIHRoZSBncm91cCBvYmplY3QgZm9yIHRoZSBtdWx0aS12YWx1ZSBncm91cC5cclxuICAgIHRoaXMuZ3JvdXBbbXVsdGlWYWx1ZUdyb3VwU2NvcGVOYW1lXSA9IFtdO1xyXG5cclxuICAgIC8vIFN0b3JlIHRoZSBncmlkIHZhbHVlIG5hbWUgdG8gYmUgdXNlZCBpbiBnZXRaTW9kZWwgdG8gZ2V0IHRoZSBncmlkIGRhdGEuXHJcbiAgICB0aGlzLm11bHRpVmFsdWVHcm91cEdyaWRWYWx1ZSA9IHRoaXMubXVsdGlWYWx1ZUdyb3VwR3JpZFZhbHVlID8/IFtdO1xyXG4gICAgdGhpcy5tdWx0aVZhbHVlR3JvdXBHcmlkVmFsdWUucHVzaChncmlkVmFsdWVOYW1lKTtcclxuXHJcbiAgICAvLyBNYW51YWxseSBhZGQgYXR0cmlidXRlcyB0byB0aGUgZ3JpZCBlbGVtZW50IHRvIHNwZWVkIHVwIGxvYWRpbmcuXHJcbiAgICBjb25zdCBlbGVtZW50ID0ge1xyXG4gICAgICBcIkFkZENvbW1hbmRCdXR0b25OYW1lXCI6IFwiQWRkXCIsXHJcbiAgICAgIFwiQWxsb3dFeHBvcnRcIjogZmFsc2UsXHJcbiAgICAgIFwiQWxsb3dHcmlkRGF0YUV4cG9ydFwiOiBmYWxzZSxcclxuICAgICAgXCJBbGxvd011bHRpU2VsZWN0XCI6IGZhbHNlLFxyXG4gICAgICBcIkFsbG93Um93U2VsZWN0XCI6IGZhbHNlLFxyXG4gICAgICBcIkFsbG93U2F2ZVN0YXRlXCI6IGZhbHNlLFxyXG4gICAgICBcIkNvbHVtbkZpZWxkc1wiOiAnZ3JvdXAuJyArIGdyaWRDb2x1bW5GaWVsZHNOYW1lLFxyXG4gICAgICBcIkRhdGFTb3VyY2VcIjogJ2dyb3VwLicgKyBncmlkRGF0YVNvdXJjZU5hbWUsXHJcbiAgICAgIFwiRGlzYWJsZUNlbGxDbGlja0hhbmRsZXJcIjogdHJ1ZSxcclxuICAgICAgXCJEaXNhYmxlR2VuZXJhdGVDb2x1bW5CeUZvcm1cIjogdHJ1ZSxcclxuICAgICAgXCJEaXZDbGFzc1wiOiAnY29sLXhzLTEyIGNvbC1zbS0xMiBjb2wtbWQtMTIgY29sLWxnLTEyJyxcclxuICAgICAgXCJFbmFibGVDdXN0b21BZGRDb21tYW5kXCI6IHRydWUsXHJcbiAgICAgIFwiRW5hYmxlQ3VzdG9tUmVtb3ZlQ29tbWFuZFwiOiB0cnVlLFxyXG4gICAgICBcIkVuYWJsZUN1c3RvbVJlc2V0Q29tbWFuZFwiOiB0cnVlLFxyXG4gICAgICBcIkVuYWJsZVNhdmVHcmlkU3RhdGVcIjogZmFsc2UsXHJcbiAgICAgIFwiRXh0ZXJuYWxQYWdpbmF0aW9uXCI6IGZhbHNlLFxyXG4gICAgICBcIkhlaWdodFJlZHVjZVwiOiAyNTAsXHJcbiAgICAgIFwiTGltaXRGaWVsZHNcIjogZmFsc2UsXHJcbiAgICAgIFwiTmFtZVwiOiBuYW1lLFxyXG4gICAgICBcIlBhZ2VTaXplXCI6IDIwLFxyXG4gICAgICBcIlBhZ2VTaXplc1wiOiBmYWxzZSxcclxuICAgICAgXCJSZXNvdXJjZVVSTFwiOiB0cnVlLFxyXG4gICAgICBcIlNlbGVjdE9wdGlvbnNcIjogZmFsc2UsXHJcbiAgICAgIFwiU2hvd0dyaWRFZGl0QnV0dG9uXCI6IGZhbHNlLFxyXG4gICAgICBcIlN1YlR5cGVcIjogXCJ6dWRmXCIsXHJcbiAgICAgIFwiVHlwZVwiOiBcInpncmlkXCIsXHJcbiAgICAgIFwiVmFsdWVcIjogJ2dyb3VwLicgKyBncmlkVmFsdWVOYW1lLFxyXG4gICAgICBcIlZpc2libGVcIjogdHJ1ZSxcclxuICAgICAgXCJXaWR0aFJlZHVjZVwiOiA1MDBcclxuICAgIH1cclxuXHJcbiAgICAvLyBDcmVhdGUgYSBwcm9wZXJ0eSBpbiB0aGUgZ3JvdXAgb2JqZWN0IGJhc2VkIG9uIHRoZSBhYm92ZSBkZWNsYXJhdGlvbiwgZXhjZXB0IE5hbWUsIGFuZCBhbHNvIGluc2VydCBjb2x1bW4gZmllbGRzLlxyXG4gICAgLy8gVXNlIHRoZSBncm91cGluZyB2YWx1ZSBhcyB0aGUgY29sdW1uIGFuZCBza2lwIGluc2VydGluZyBhbnkgY29udGFpbmVyIHR5cGUuXHJcbiAgICBjb25zdCBjb250YWluZXJOYW1lID0gZGF0YS5OYW1lO1xyXG4gICAgY29uc3QgZ3JvdXBGaWVsZEVsZW1lbnRzID0gW107XHJcblxyXG4gICAgZGF0YS5WYWx1ZS5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgY29uc3QgZmllbGRNb2RlbCA9IE9iamVjdC5hc3NpZ24oe30sIGZpZWxkKTtcclxuICAgICAgZmllbGRNb2RlbFsnRGlzcGxheU5hbWUnXSA9IGZpZWxkTW9kZWwuTGFiZWw7XHJcbiAgICAgIGZpZWxkTW9kZWwuTmFtZSA9IHRoaXMuZ2VuZXJhdGVGb3JtQ29udHJvbE5hbWUoZmllbGRNb2RlbFsnTmFtZSddLCBjb250YWluZXJOYW1lKTtcclxuICAgICAgZmllbGRNb2RlbC5WYWx1ZSA9IHRoaXMuZ2VuZXJhdGVGb3JtQ29udHJvbE5hbWUoZmllbGRNb2RlbFsnVmFsdWUnXSwgY29udGFpbmVyTmFtZSk7XHJcblxyXG4gICAgICBncm91cEZpZWxkRWxlbWVudHMucHVzaChmaWVsZE1vZGVsKTtcclxuXHJcbiAgICAgIC8vIFRoaXMgaXMgZm9yIHRhbGx5IGFuZCByZW1vdmUgem1vZGVsIHdoZW4gZ2V0bW9kZWwoKS5cclxuICAgICAgLy8gV2UncmUgbm90IHN1cHBvc2VkIHRvIHNhdmUgem1vZGVsIGZpZWxkIHZhbHVlIHNpbmNlIGl0cyB2YWx1ZSBpcyBzdXBwb3NlZCB0byBiZSBhZGRlZCB0byB0aGUgZ3JpZC5cclxuICAgICAgdGhpcy5ncm91cFttdWx0aVZhbHVlR3JvdXBTY29wZU5hbWVdLnB1c2goZmllbGRNb2RlbC5WYWx1ZSk7XHJcblxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmdyb3VwW2dyaWREYXRhU291cmNlTmFtZV0gPSBbXTtcclxuICAgIHRoaXMuZ3JvdXBbZ3JpZENvbHVtbkZpZWxkc05hbWVdID0gZ3JvdXBGaWVsZEVsZW1lbnRzO1xyXG5cclxuICAgIC8vIENyZWF0ZSBncmlkIGNvbHVtbiBiYXNlZCBvbiBmaWVsZCBlbGVtZW50cyBhbmQgaW5zZXJ0IHRoZW0gaW50byB0aGUgZ3JpZC4gXHJcbiAgICB0aGlzLmdyb3VwW2Ake25hbWV9JHt0aGlzLnByZWZpeEN1c3RvbUFkZEJ1dHRvbk9uQ2xpY2t9YF0gPSB0aGlzLmNhcHR1cmVDb250YWluZXJGaWVsZFZhbHVlVG9Nb2RlbC5iaW5kKHRoaXMsIHRoaXMuZ3JvdXAsIGdyaWRWYWx1ZU5hbWUsIGdyaWREYXRhU291cmNlTmFtZSwgY29udGFpbmVyTmFtZSk7XHJcbiAgICB0aGlzLmdyb3VwW2Ake25hbWV9JHt0aGlzLnByZWZpeEN1c3RvbVJlc2V0QnV0dG9uT25DbGlja31gXSA9IHRoaXMuY2xlYXJDb250YWluZXJSZWxhdGVkRmllbGRWYWx1ZS5iaW5kKHRoaXMsIHRoaXMuZ3JvdXAsIGNvbnRhaW5lck5hbWUpO1xyXG4gICAgdGhpcy5ncm91cFtgJHtuYW1lfSR7dGhpcy5wcmVmaXhDdXN0b21SZW1vdmVCdXR0b25PbkNsaWNrfWBdID0gdGhpcy5yZW1vdmVHcmlkUm93LmJpbmQodGhpcywgZ3JpZFZhbHVlTmFtZSwgZ3JpZERhdGFTb3VyY2VOYW1lKTtcclxuXHJcbiAgICBpZiAoZGF0YUluZGV4KSB7XHJcbiAgICAgIHRoaXMuYXBwZW5kVG9EaXNwbGF5TW9kZWwoZWxlbWVudCwgZGF0YUluZGV4KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBkYXRhLlZhbHVlLnB1c2goZWxlbWVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhcHR1cmVDb250YWluZXJGaWVsZFZhbHVlVG9Nb2RlbChncm91cDogWkdyb3VwLCBncmlkVmFsdWU6IGFueSwgZ3JpZERhdGFTb3VyY2U6IGFueSwgY29udGFpbmVyTmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBjb250YWluZXJGaWVsZFZhbHVlID0gdGhpcy5nZXRDb250YWluZXJNb2RlbFZhbHVlKGNvbnRhaW5lck5hbWUpO1xyXG4gICAgbGV0IGFsbG93VG9TZXREYXRhID0gZmFsc2U7XHJcblxyXG4gICAgZm9yIChsZXQga2V5IGluIGNvbnRhaW5lckZpZWxkVmFsdWUpIHtcclxuICAgICAgaWYgKCFaQ29tcG9uZW50SGVscGVyLmlzTnVsbFVuZGVmaW5lZEVtcHR5KGNvbnRhaW5lckZpZWxkVmFsdWVba2V5XSkpIHtcclxuICAgICAgICBhbGxvd1RvU2V0RGF0YSA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7IC8vIGV4aXQgdGhlIGxvb3AgZWFybHkgc2luY2UgdGhlIGZsYWcgaXMgYWxyZWFkeSB0cnVlXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoYWxsb3dUb1NldERhdGEgJiYgKE9iamVjdC5rZXlzKGNvbnRhaW5lckZpZWxkVmFsdWUpLmxlbmd0aCAhPT0gMCB8fCBjb250YWluZXJGaWVsZFZhbHVlLmNvbnN0cnVjdG9yICE9PSBPYmplY3QpKSB7XHJcbiAgICAgIC8vIGdldCBjb250YWluZXIgbW9kZWwgdmFsdWUsIHNldCB0byBncm91cCBncmlkIGRhdGFzb3VyY2VcclxuICAgICAgZ3JvdXBbZ3JpZERhdGFTb3VyY2VdLnB1c2goY29udGFpbmVyRmllbGRWYWx1ZSk7XHJcblxyXG4gICAgICAvLyBzZXQgZGF0YXNvdXJjZSB0byBncmlkXHJcbiAgICAgIGdyb3VwW2dyaWRWYWx1ZV0uc2V0RGF0YSh0aGlzLmdyb3VwW2dyaWREYXRhU291cmNlXSk7XHJcblxyXG4gICAgICAvLyBjbGVhciBjb250YWluZXIgZmllbGQgdmFsdWVcclxuICAgICAgdGhpcy5jbGVhckNvbnRhaW5lclJlbGF0ZWRGaWVsZFZhbHVlKGdyb3VwLCBjb250YWluZXJOYW1lKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KCdUbyBhZGQgdGhlIHJlY29yZCwgcGxlYXNlIGVudGVyL3NlbGVjdCBhdCBsZWFzdCBvbmUgZmllbGQgaW4gdGhpcyBzZWN0aW9uLicsICd0b3AnLCB0cnVlLCAzMDAwLCAnd2FybmluZycpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGVhckNvbnRhaW5lclJlbGF0ZWRGaWVsZFZhbHVlKGdyb3VwOiBaR3JvdXAsIGNvbnRhaW5lck5hbWU6IHN0cmluZykge1xyXG4gICAgLy8gYWZ0ZXIgc2V0IHRvIGdyaWQsIGNsZWFyIHRoZSB6bW9kZWwuXHJcbiAgICB0aGlzLmNsZWFyQ29udGFpbmVyRmllbGRFbGVtZW50VmFsdWUoY29udGFpbmVyTmFtZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbW92ZUdyaWRSb3coZ3JpZFZhbHVlOiBhbnksIGdyaWREYXRhU291cmNlOiBhbnksIGRhdGFJdGVtOiBhbnksIGluZGV4OiBhbnkpIHtcclxuICAgIHRoaXMuZ3JvdXBbZ3JpZERhdGFTb3VyY2VdLnNwbGljZShpbmRleCwgMSk7XHJcblxyXG4gICAgLy8gc2V0IGRhdGFzb3VyY2UgdG8gZ3JpZFxyXG4gICAgdGhpcy5ncm91cFtncmlkVmFsdWVdLnNldERhdGEodGhpcy5ncm91cFtncmlkRGF0YVNvdXJjZV0pO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgcHJpdmF0ZSBpc0Ryb3Bkb3duVHlwZShkYXRhOiBhbnkpIHtcclxuICAgIGNvbnN0IGNvbXBvbmVudERhdGFUeXBlID0gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnID8gZGF0YSA6IGRhdGEuVHlwZS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgIGlmIChjb21wb25lbnREYXRhVHlwZSA9PSBDb21wb25lbnRUeXBlLmRyb3Bkb3duIHx8IGNvbXBvbmVudERhdGFUeXBlID09IENvbXBvbmVudFR5cGUuenVpc2VsZWN0bXVsdGlwbGUgfHwgY29tcG9uZW50RGF0YVR5cGUgPT0gQ29tcG9uZW50VHlwZS56c2VsZWN0bXVsdGlwbGUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmFsaWRhdGVzIHRoZSBmb3JtIGFuZCBzaG93cyBhbiBlcnJvciBtZXNzYWdlIGlmIGl0IGlzIGludmFsaWQuXHJcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBmb3JtIGlzIHZhbGlkLCBvdGhlcndpc2UgZmFsc2UuXHJcbiAgICovXHJcbiAgcHVibGljIHZhbGlkYXRlQW5kU2hvd0Vycm9yTWVzc2FnZSgpIHtcclxuICAgIGNvbnN0IGZnID0gdGhpcy5mb3JtIGFzIEZvcm1Hcm91cDtcclxuXHJcbiAgICAvLyBJZiB0aGUgZm9ybSBpcyBpbnZhbGlkLCBjbGVhciBhbnkgZXJyb3JzIGluIGNvbnRhaW5lciBmaWVsZHMgYW5kIHNob3cgdGhlIGVycm9yIG1lc3NhZ2UuXHJcbiAgICBpZiAoIWZnLnZhbGlkKSB7XHJcbiAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIGZvcm0gY29udHJvbHMgYW5kIHJlc2V0IGFueSBlcnJvcnMgdGhhdCBiZWxvbmcgdG8gYSBjb250YWluZXIgZmllbGRcclxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZmcuY29udHJvbHMpKSB7XHJcbiAgICAgICAgdGhpcy5zZXRDb250YWluZXJGaWVsZEVycm9yQXNOdWxsKGZnLCBrZXkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBDaGVjayBpcyB0aGUgZm9ybWdyb3VwIHZhbHVlIGFnYWluLlxyXG4gICAgICBpZiAoZmcudmFsaWQpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gU2hvdyB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhlIGZvcm1cclxuICAgICAgdGhpcy5jb21wb25lbnRFcnJvckhhbmRsZXJTZXJ2aWNlLnNob3dGb3JtR3JvdXBFcnJvck1lc3NhZ2UodGhpcy5ncm91cCwgZmcpO1xyXG5cclxuICAgICAgLy8gUmV0dXJuIGZhbHNlIHRvIGluZGljYXRlIHRoYXQgdGhlIGZvcm0gaXMgbm90IHZhbGlkXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXR1cm4gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBmb3JtIGlzIHZhbGlkXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0cyB0aGUgZXJyb3JzIG9mIGEgY29udGFpbmVyIGZpZWxkIGluIGEgRm9ybUdyb3VwLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGZnIFRoZSBGb3JtR3JvdXAgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGZpZWxkLlxyXG4gICAqIEBwYXJhbSBrZXkgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIGluIHRoZSBGb3JtR3JvdXAuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRDb250YWluZXJGaWVsZEVycm9yQXNOdWxsKGZnOiBGb3JtR3JvdXAsIGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb250cm9sTmFtZVNlZ21lbnRzID0ga2V5LnNwbGl0KCdfJyk7XHJcblxyXG4gICAgaWYgKGNvbnRyb2xOYW1lU2VnbWVudHMubGVuZ3RoIDw9IDMpIHtcclxuICAgICAgLy8gRmllbGQgaXMgbm90IGluc2lkZSBhIGNvbnRhaW5lciwgc28gd2Ugc2tpcCBpdFxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbm8gbXZnbGlzdCwgZGlyZWN0IHJldHVybi4gZG9udCBuZWVkIGRvIGFueXRoaW5nLlxyXG4gICAgaWYgKCF0aGlzLmdyb3VwWydtdmdsaXN0J10pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIGNvbnRhaW5lciBidXQgbm90IG11bHRpIHZhbHVlIGdyb3VwID0gdHJ1ZSwgd2Ugc2tpcCBpdC5cclxuICAgIGNvbnN0IGNvbnRhaW5lciA9IFtjb250cm9sTmFtZVNlZ21lbnRzWzBdLCBjb250cm9sTmFtZVNlZ21lbnRzWzFdLCBjb250cm9sTmFtZVNlZ21lbnRzWzJdXS5qb2luKCdfJyk7XHJcbiAgICBpZiAoIXRoaXMuZ3JvdXBbJ212Z2xpc3QnXS5pbmNsdWRlcyhjb250YWluZXIpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb250cm9sID0gZmcuZ2V0KGtleSk7XHJcblxyXG4gICAgaWYgKCFjb250cm9sKSB7XHJcbiAgICAgIC8vIElmIHRoZSBjb250cm9sIGlzIG5vdCBpbnNpZGUgYSBjb250YWluZXIsIHNraXAgaXQuXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyByZXR1cm4gaWYgZm9ybWNvbnRyb2wgaXMgdmFsaWQuXHJcbiAgICBpZiAoY29udHJvbC5zdGF0dXMgPT09ICdWQUxJRCcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbnRyb2xFcnJvcnMgPSBjb250cm9sLmVycm9ycztcclxuXHJcbiAgICBpZiAoY29udHJvbEVycm9ycykge1xyXG4gICAgICAvLyBTZXQgdGhlIGNvbnRyb2wncyBlcnJvcnMgdG8gbnVsbC5cclxuICAgICAgY29udHJvbC5zZXRFcnJvcnMobnVsbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWYWxpZGF0ZXMgYSBmb3JtIGFuZCByZXR1cm5zIGl0cyBaTW9kZWwgaWYgaXQgaXMgdmFsaWQuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyBUaGUgZm9ybSdzIFpNb2RlbCBpZiBpdCBpcyB2YWxpZCwgb3IgdW5kZWZpbmVkIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0VmFsaWRhdGVkRm9ybVpNb2RlbCgpIHtcclxuICAgIGNvbnN0IGlzVmFsaWRGb3JtID0gdGhpcy52YWxpZGF0ZUFuZFNob3dFcnJvck1lc3NhZ2UoKTtcclxuXHJcbiAgICBpZiAoaXNWYWxpZEZvcm0pIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0Wk1vZGVsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHpNb2RlbCBvYmplY3QsIHdpdGggbXZnIChtdWx0aSB2YWx1ZSBncm91cCkgZmllbGRzIHJlbW92ZWQgYW5kIHByb3BlcnR5IHByZWZpeGVzIHJlbW92ZWQuXHJcbiAgICogQHBhcmFtIHNraXBSZW1vdmVQcmVmaXggV2hldGhlciB0byBza2lwIHJlbW92aW5nIHRoZSBkZWZhdWx0IHByb3BlcnR5IHByZWZpeC5cclxuICAgKiBAcGFyYW0gc2tpcFJlbW92ZU12Z0ZpZWxkVmFsdWUgV2hldGhlciB0byBza2lwIHJlbW92aW5nIHRoZSB2YWx1ZXMgb2YgbXZnIGZpZWxkcyBmcm9tIHRoZSB6TW9kZWwgb2JqZWN0LlxyXG4gICAqIEByZXR1cm5zIFRoZSBtb2RpZmllZCB6TW9kZWwgb2JqZWN0LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRaTW9kZWwoc2tpcFJlbW92ZVByZWZpeD86IGJvb2xlYW4sIHNraXBSZW1vdmVNdmdGaWVsZFZhbHVlPzogYm9vbGVhbikge1xyXG4gICAgY29uc3Qgek1vZGVsID0gdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0uek1vZGVsO1xyXG5cclxuICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgcHJvcGVydGllcyBpbiB0aGUgek1vZGVsIG9iamVjdC5cclxuICAgIGZvciAoY29uc3Qgek1vZGVsUHJvcGVydHkgaW4gek1vZGVsKSB7XHJcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoek1vZGVsLCB6TW9kZWxQcm9wZXJ0eSkpIHtcclxuICAgICAgICBjb25zdCB6TW9kZWxQcm9wZXJ0eVNlZ21lbnRzID0gek1vZGVsUHJvcGVydHkuc3BsaXQoJ18nKTtcclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3BlcnR5IGlzIHBhcnQgb2YgYSBtdWx0aSB2YWx1ZSBncm91cC5cclxuICAgICAgICBpZiAoek1vZGVsUHJvcGVydHlTZWdtZW50cy5sZW5ndGggPiAzKSB7XHJcbiAgICAgICAgICAvLyBUaGUgdGhpcmQgc2VnbWVudCBvZiB0aGUgcHJvcGVydHkgbmFtZSBpcyB0aGUgY29udGFpbmVyIG5hbWUuXHJcbiAgICAgICAgICBjb25zdCBjb250YWluZXJOYW1lID0gek1vZGVsUHJvcGVydHlTZWdtZW50c1syXTtcclxuICAgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgbmFtZSBvZiB0aGUgbXVsdGkgdmFsdWUgZ3JvdXAuXHJcbiAgICAgICAgICBjb25zdCBtdWx0aVZhbHVlR3JvdXBTY29wZU5hbWUgPSBgbXZnXyR7Y29udGFpbmVyTmFtZX1gO1xyXG5cclxuICAgICAgICAgIC8vIElmIHRoZSBtdWx0aSB2YWx1ZSBncm91cCBleGlzdHMgYW5kIGNvbnRhaW5zIHRoZSBwcm9wZXJ0eSwgcmVtb3ZlIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgZnJvbSB0aGUgek1vZGVsIG9iamVjdC5cclxuICAgICAgICAgIGlmICh0aGlzLmdyb3VwW211bHRpVmFsdWVHcm91cFNjb3BlTmFtZV0pIHtcclxuICAgICAgICAgICAgY29uc3QgbXZnRmllbGQgPSB0aGlzLmdyb3VwW211bHRpVmFsdWVHcm91cFNjb3BlTmFtZV0uZmluZCgocmVjb3JkKSA9PiByZWNvcmQgPT09IHpNb2RlbFByb3BlcnR5KTtcclxuICAgICAgICAgICAgaWYgKG12Z0ZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgek1vZGVsW3pNb2RlbFByb3BlcnR5XSA9IHNraXBSZW1vdmVNdmdGaWVsZFZhbHVlID8gek1vZGVsW3pNb2RlbFByb3BlcnR5XSA6IG51bGw7XHJcbiAgICAgICAgICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoek1vZGVsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGltcG9ydGFudDogUmVtb3ZlIHByb3BlcnR5IHByZWZpeGVzIGZyb20gdGhlIHpNb2RlbCBvYmplY3QgaWYgc2tpcFJlbW92ZVByZWZpeCBpcyBub3QgdHJ1ZSAoYnkgZGVmYXVsdCByZW1vdmUgcHJlZml4KVxyXG4gICAgY29uc3QgcGF0Y2hlZE1vZGVsRGF0YSA9IHNraXBSZW1vdmVQcmVmaXggPyB6TW9kZWwgOiB0aGlzLnJlbW92ZVpNb2RlbFByb3BlcnR5UHJlZml4KHpNb2RlbCk7XHJcblxyXG4gICAgLy8gSWYgdGhlcmUgYXJlIG11bHRpIHZhbHVlIGdyb3VwIGdyaWQgdmFsdWVzLCBleHRyYWN0IHRoZSBncmlkIGRhdGEgYW5kIGFkZCBpdCB0byB0aGUgY29ycmVzcG9uZGluZyBjb250YWluZXIgaW4gdGhlIG1vZGlmaWVkIHpNb2RlbCBvYmplY3QuXHJcbiAgICBpZiAodGhpcy5tdWx0aVZhbHVlR3JvdXBHcmlkVmFsdWUpIHtcclxuICAgICAgdGhpcy5tdWx0aVZhbHVlR3JvdXBHcmlkVmFsdWUuZm9yRWFjaCgobXVsdGlWYWx1ZUdyb3VwR3JpZE5hbWUpID0+IHtcclxuICAgICAgICAvLyBFeHRyYWN0IHRoZSBjb250YWluZXIgbmFtZSBmcm9tIHRoZSBncmlkIG5hbWUuXHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyTmFtZSA9IHNraXBSZW1vdmVQcmVmaXggPyBtdWx0aVZhbHVlR3JvdXBHcmlkTmFtZS5zcGxpdCgnXycpLmpvaW4oJ18nKSA6IG11bHRpVmFsdWVHcm91cEdyaWROYW1lLnNwbGl0KCdfJylbMl07XHJcblxyXG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIGdyaWQgZGF0YSBhbmQgcmVtb3ZlIHByb3BlcnR5IHByZWZpeGVzIGlmIHNraXBSZW1vdmVQcmVmaXggaXMgbm90IHRydWUuXHJcbiAgICAgICAgY29uc3QgbXVsdGlWYWx1ZUdyb3VwR3JpZCA9IHRoaXMuZ3JvdXBbbXVsdGlWYWx1ZUdyb3VwR3JpZE5hbWVdIGFzIFpHcmlkO1xyXG4gICAgICAgIGNvbnN0IGdyaWREYXRhID0gbXVsdGlWYWx1ZUdyb3VwR3JpZC5nZXRHcmlkRGF0YSgpLm1hcCgoZGF0YSkgPT4gc2tpcFJlbW92ZVByZWZpeCA/IGRhdGEgOiB0aGlzLnJlbW92ZVpNb2RlbFByb3BlcnR5UHJlZml4KGRhdGEsIHRydWUpKTtcclxuXHJcbiAgICAgICAgLy8gQWRkIHRoZSBncmlkIGRhdGEgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY29udGFpbmVyIGluIHRoZSBtb2RpZmllZCB6TW9kZWwgb2JqZWN0LlxyXG4gICAgICAgIGlmIChncmlkRGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBwYXRjaGVkTW9kZWxEYXRhW2NvbnRhaW5lck5hbWVdID0gZ3JpZERhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcGF0Y2hlZE1vZGVsRGF0YTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgdmFsdWUgb2YgYSBtb2RlbCBpbiB0aGUgZm9ybSBncm91cC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZGVsIHRvIHNldC5cclxuICAgKiBAcGFyYW0geyp9IG1vZGVsVmFsdWUgVGhlIHZhbHVlIHRvIHNldCBmb3IgdGhlIG1vZGVsLlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NraXBQcmVmaXhdIE9wdGlvbmFsIHBhcmFtZXRlciBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gc2tpcCB0aGUgY29tcG9uZW50IHByZWZpeC5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwdWJsaWMgc2V0TW9kZWxWYWx1ZShtb2RlbE5hbWU6IHN0cmluZywgbW9kZWxWYWx1ZTogYW55LCBza2lwUHJlZml4PzogYm9vbGVhbikge1xyXG4gICAgLy8gR2V0IHRoZSB6TW9kZWwgb2JqZWN0IGZyb20gdGhlIGZvcm0gZ3JvdXBcclxuICAgIGNvbnN0IHpNb2RlbHMgPSB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXS56TW9kZWw7XHJcbiAgICAvLyBJZiBza2lwUHJlZml4IGlzIGZhbHNlIG9yIHVuZGVmaW5lZCwgcHJlcGVuZCB0aGUgY29tcG9uZW50IHByZWZpeCB0byB0aGUgbW9kZWwgbmFtZVxyXG4gICAgY29uc3Qgek1vZGVsTmFtZSA9IHNraXBQcmVmaXggPyBtb2RlbE5hbWUgOiB0aGlzLmNvbXBvbmVudFByZWZpeCArICdfJyArIG1vZGVsTmFtZTtcclxuICAgIC8vIFNldCB0aGUgdmFsdWUgb2YgdGhlIG1vZGVsIGluIHRoZSB6TW9kZWwgb2JqZWN0XHJcbiAgICB6TW9kZWxzW3pNb2RlbE5hbWVdID0gbW9kZWxWYWx1ZTtcclxuXHJcbiAgICAvLyBHZXQgdGhlIGZvcm0gZ3JvdXAgYXMgYSBGb3JtR3JvdXAgb2JqZWN0XHJcbiAgICBsZXQgZmc6IEZvcm1Hcm91cCA9IHRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG5cclxuICAgIC8vIFBhdGNoIHRoZSBmb3JtIGdyb3VwIHdpdGggdGhlIHVwZGF0ZWQgek1vZGVsIG9iamVjdFxyXG4gICAgZmcucGF0Y2hWYWx1ZSh6TW9kZWxzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogUmVtb3ZlIHRoZSBjb21wb25lbnQgcHJlZml4IGZyb20gcHJvcGVydHkgbmFtZXMgaW4gdGhlIHpNb2RlbCBvYmplY3QuXHJcbiAgKlxyXG4gICogQHBhcmFtIHsqfSB6TW9kZWwgVGhlIHpNb2RlbCBvYmplY3QuXHJcbiAgKiBAcGFyYW0ge2Jvb2xlYW59IFtnZXRPbmx5RmllbGROYW1lXSBPcHRpb25hbCBwYXJhbWV0ZXIgaW5kaWNhdGluZyB3aGV0aGVyIHRvIG9ubHkgcmV0dXJuIHRoZSBmaWVsZCBuYW1lIHdpdGhvdXQgdGhlIHByZWZpeC5cclxuICAqIEByZXR1cm5zIHsqfSBUaGUgdXBkYXRlZCB6TW9kZWwgb2JqZWN0LlxyXG4gICovXHJcbiAgcHJpdmF0ZSByZW1vdmVaTW9kZWxQcm9wZXJ0eVByZWZpeCh6TW9kZWw6IGFueSwgZ2V0T25seUZpZWxkTmFtZT86IGJvb2xlYW4pIHtcclxuICAgIC8vIENyZWF0ZSBhbiBlbXB0eSBvYmplY3QgdG8gc3RvcmUgdGhlIHVwZGF0ZWQgek1vZGVsIGRhdGFcclxuICAgIGNvbnN0IHBhdGNoZWRNb2RlbERhdGEgPSB7fTtcclxuXHJcbiAgICAvLyBMb29wIHRocm91Z2ggZWFjaCBwcm9wZXJ0eSBpbiB0aGUgek1vZGVsIG9iamVjdFxyXG4gICAgZm9yIChsZXQgcHJvcCBpbiB6TW9kZWwpIHtcclxuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh6TW9kZWwsIHByb3ApKSB7XHJcbiAgICAgICAgLy8gU3BsaXQgdGhlIHByb3BlcnR5IG5hbWUgYnkgdW5kZXJzY29yZXNcclxuICAgICAgICBjb25zdCBwcm9wU2VnbWVudCA9IHByb3Auc3BsaXQoJ18nKTtcclxuICAgICAgICAvLyBHZXQgdGhlIHByb3BlcnR5IG5hbWUgd2l0aG91dCB0aGUgY29tcG9uZW50IHByZWZpeFxyXG4gICAgICAgIGNvbnN0IHByb3BlcnR5TmFtZSA9IGdldE9ubHlGaWVsZE5hbWUgPyBwcm9wU2VnbWVudFtwcm9wU2VnbWVudC5sZW5ndGggLSAxXSA6IHByb3AucmVwbGFjZSh0aGlzLmNvbXBvbmVudFByZWZpeCArICdfJywgJycpO1xyXG5cclxuICAgICAgICAvLyBBZGQgdGhlIHByb3BlcnR5IHRvIHRoZSB1cGRhdGVkIHpNb2RlbCBvYmplY3RcclxuICAgICAgICBwYXRjaGVkTW9kZWxEYXRhW3Byb3BlcnR5TmFtZV0gPSB6TW9kZWxbcHJvcF07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXR1cm4gdGhlIHVwZGF0ZWQgek1vZGVsIG9iamVjdFxyXG4gICAgcmV0dXJuIHBhdGNoZWRNb2RlbERhdGE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhcnMgdGhlIHpNb2RlbCBwcm9wZXJ0eSBvZiB0aGUgZ3JvdXAgaW4gdGhlIGNvbXBvbmVudCBzY29wZSBhbmQgcmVzZXRzIHRoZSBtdWx0aVZhbHVlR3JvdXBHcmlkVmFsdWUgYXJyYXkuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwdWJsaWMgY2xlYXJaTW9kZWwoKSB7XHJcbiAgICB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXS56TW9kZWwgPSB7fTtcclxuICAgIHRoaXMubXVsdGlWYWx1ZUdyb3VwR3JpZFZhbHVlID0gW107XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0TXVsdGlWYWx1ZUdyb3VwQnV0dG9uc0VuYWJsZWQoY29udGFpbmVyTmFtZTogc3RyaW5nLCBpc0VuYWJsZWQ6IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50KHRoaXMuZ3JvdXAsIGB6Z3JpZF8ke3RoaXMuY29tcG9uZW50UHJlZml4fV8ke2NvbnRhaW5lck5hbWV9YCk7XHJcbiAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBbJ0VuYWJsZUN1c3RvbUFkZENvbW1hbmQnLCAnRW5hYmxlQ3VzdG9tUmVzZXRDb21tYW5kJywgJ0VuYWJsZUN1c3RvbVJlbW92ZUNvbW1hbmQnXTtcclxuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BlcnRpZXMpIHtcclxuICAgICAgICByZXN1bHRbJ2RhdGEnXVtwcm9wXSA9IGlzRW5hYmxlZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZW51bSBDb21wb25lbnRUeXBlIHtcclxuICB0ZXh0ID0gJ3RleHQnLFxyXG4gIHRleHRhcmVhID0gJ3RleHRhcmVhJyxcclxuICBjaGVja2JveCA9ICdjaGVja2JveCcsXHJcbiAgbGFiZWwgPSAnemxhYmVsJyxcclxuICBkYXRlID0gJ2RhdGUnLFxyXG4gIHpkYXRldGltZSA9ICd6ZGF0ZXRpbWUnLFxyXG4gIHp1aWRhdGV0aW1lID0gJ3p1aWRhdGV0aW1lJyxcclxuICBudW1iZXIgPSAnbnVtYmVyJyxcclxuICB6bnVtZXJpYyA9ICd6bnVtZXJpYycsXHJcbiAgZW1haWwgPSAnZW1haWwnLFxyXG4gIGZpbGUgPSAnZmlsZScsXHJcbiAgcHJpY2UgPSAncHJpY2UnLFxyXG4gIHdlYnNpdGUgPSAnd2Vic2l0ZScsXHJcbiAgZHJvcGRvd24gPSAnZHJvcGRvd24nLFxyXG4gIHp1aXNlbGVjdG11bHRpcGxlID0gJ3p1aXNlbGVjdG11bHRpcGxlJyxcclxuICB6c2VsZWN0bXVsdGlwbGUgPSAnenNlbGVjdG11bHRpcGxlJyxcclxuICBncm91cGluZyA9ICdrY2FyZCcsXHJcbiAgYnV0dG9uID0gJ3pidXR0b25zJyxcclxuICBncmlkID0gJ3pncmlkJ1xyXG59XHJcbiIsIjxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxNXB4XCIgKm5nSWY9XCJkYXRhLlRpdGxlICYmICghIWNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlRmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlKVwiIGNsYXNzPVwienVkZi1jb250YWluZXJcIj5cclxuICA8a2VuZG8tY2FyZCAqbmdJZj1cImRhdGEuVGl0bGVcIj5cclxuICAgIDxrZW5kby1jYXJkLWhlYWRlcj5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8aW9uLWxhYmVsIGNsYXNzPVwiY2FyZC1oZWFkZXItdGl0bGVcIj57e2RhdGEuVGl0bGV9fTwvaW9uLWxhYmVsPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwva2VuZG8tY2FyZC1oZWFkZXI+XHJcbiAgICA8a2VuZG8tY2FyZC1ib2R5PlxyXG4gICAgICA8IS0tIDxhcHAtemZvcm1jb250cm9sIFtuZ0NsYXNzXT1cImdyb3VwW2ZpZWxkLmlzVmlzaWJsZUZpZWxkXSA/IGZpZWxkLkRpdkNsYXNzIDogKChmaWVsZC5WaXNpYmxlID09PSB0cnVlKSA/ICBmaWVsZC5EaXZDbGFzcyA6ICdmbGV4LWhpZGUnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmb3JtRmllbGRzIHwgZGl2emxheW91dDogZGF0YS56bGF5b3V0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2dyb3VwXT1cImdyb3VwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZm9ybVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3tmaWVsZC5OYW1lfX1cIj5cclxuICAgICAgPC9hcHAtemZvcm1jb250cm9sPiAtLT5cclxuICAgICAgPGFwcC16ZGl2IFtkYXRhXT1cImRhdGFcIiBbZm9ybV09XCJmb3JtXCIgW2dyb3VwXT1cImdyb3VwXCIgW2NvbnRhaW5lckZpZWxkXT1cImNvbnRhaW5lckZpZWxkXCI+PC9hcHAtemRpdj5cclxuICAgIDwva2VuZG8tY2FyZC1ib2R5PlxyXG4gIDwva2VuZG8tY2FyZD5cclxuPC9kaXY+XHJcblxyXG48ZGl2ICpuZ0lmPVwiIWRhdGEuVGl0bGUgJiYgKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGVGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlRmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGUpXCIgW3N0eWxlXT1cImRhdGEuU3R5bGVcIiBjbGFzcz1cInp1ZGYtY29udGFpbmVyXCI+XHJcbiAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgKm5nSWY9XCIhaXNMb2FkaW5nXCI+XHJcbiAgICA8IS0tIDxhcHAtemZvcm1jb250cm9sIFtuZ0NsYXNzXT1cImdyb3VwW2ZpZWxkLmlzVmlzaWJsZUZpZWxkXSA/IGZpZWxkLkRpdkNsYXNzIDogKChmaWVsZC5WaXNpYmxlID09PSB0cnVlKSA/ICBmaWVsZC5EaXZDbGFzcyA6ICdmbGV4LWhpZGUnKVwiXHJcbiAgICAgICAgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGZvcm1GaWVsZHMgfCBkaXZ6bGF5b3V0OiBkYXRhLnpsYXlvdXRcIlxyXG4gICAgICAgIFtmaWVsZF09XCJmaWVsZFwiXHJcbiAgICAgICAgW2dyb3VwXT1cImdyb3VwXCJcclxuICAgICAgICBbZm9ybV09XCJmb3JtXCJcclxuICAgICAgICBpZD1cInt7ZmllbGQuTmFtZX19XCI+XHJcbiAgICA8L2FwcC16Zm9ybWNvbnRyb2w+IC0tPlxyXG4gICAgPGFwcC16ZGl2IFtkYXRhXT1cImRhdGFcIiBbZm9ybV09XCJmb3JtXCIgW2dyb3VwXT1cImdyb3VwXCIgW2NvbnRhaW5lckZpZWxkXT1cImNvbnRhaW5lckZpZWxkXCI+PC9hcHAtemRpdj5cclxuICA8L2Zvcm0+XHJcbjwvZGl2PlxyXG4iXX0=
|
|
945
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienVkZi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tbWhnbG9iYWwtZHluYW1pY2Zvcm0vc3JjL2xpYi96dWRmL3p1ZGYuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenVkZi96dWRmLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFvQyxNQUFNLGVBQWUsQ0FBQztBQUM1RSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBZSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRiw2QkFBNkI7QUFFN0IsOEJBQThCO0FBQzlCLE9BQU8sRUFBc0MsRUFBRSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM1RSxPQUFPLEVBQWtCLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRSwyQ0FBMkM7QUFDM0MsT0FBTyxFQUdMLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFDL0MsTUFBTSxpQkFBaUIsQ0FBQztBQUd6QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQzs7Ozs7Ozs7OztBQVNoRixNQUFNLE9BQU8sYUFBYyxTQUFRLGtCQUFrQjtJQW1CbkQsWUFDUyxnQkFBbUMsRUFDbEMsWUFBMEIsRUFDMUIsWUFBMEIsRUFDMUIsNEJBQTBELEVBQzFELEdBQXNCO1FBRTlCLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBTmhCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBbUI7UUFDbEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsaUNBQTRCLEdBQTVCLDRCQUE0QixDQUE4QjtRQUMxRCxRQUFHLEdBQUgsR0FBRyxD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O0lBQ3JCLGdDQUFlLENBQUE7SUFDZiw4QkFBYSxDQUFBO0lBQ2IsZ0NBQWUsQ0FBQTtJQUNmLG9DQUFtQixDQUFBO0lBQ25CLHNDQUFxQixDQUFBO0lBQ3JCLHdEQUF1QyxDQUFBO0lBQ3ZDLG9EQUFtQyxDQUFBO0lBQ25DLG1DQUFrQixDQUFBO0lBQ2xCLG9DQUFtQixDQUFBO0lBQ25CLCtCQUFjLENBQUE7QUFDaEIsQ0FBQyxFQXBCSSxhQUFhLEtBQWIsYUFBYSxRQW9CakIiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKiBBbmd1bGFyICoqKioqKioqKiovXHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycyB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5cclxuLyoqKioqKioqKiogSW9uaWMgKioqKioqKioqKi9cclxuXHJcbi8qKioqKioqKioqIFBsdWdpbiAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBBc3luY1N1YmplY3QsIGZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiwgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgY29uY2F0TWFwLCBtYXAsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcblxyXG4vKioqKioqKioqKiBDb21wb25lbnQgJiBTZXJ2aWNlICoqKioqKioqKiovXHJcbmltcG9ydCB7XHJcbiAgWkNvbXBvbmVudCwgWkZpZWxkLFxyXG4gIEFsZXJ0U2VydmljZSwgQXV0aFNlcnZpY2UsIEZpZWxkU2VydmljZSwgVG9hc3RTZXJ2aWNlLFxyXG4gIFpHcm91cCwgWkNvbXBvbmVudFByb3BlcnRpZXMsIFpDb21wb25lbnRIZWxwZXJcclxufSBmcm9tICdtbWhnbG9iYWwtemNvcmUnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRFcnJvckhhbmRsZXJTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL2NvbXBvbmVudC1lcnJvci1oYW5kbGVyLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgWkdyaWQgfSBmcm9tIFwiLi4vemdyaWQvemdyaWQuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENvbnRhaW5lckZpZWxkQmFzZSB9IGZyb20gXCIuLi9jb21wb25lbnRzL2NvbnRhaW5lcmZpZWxkYmFzZS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgWkNvbXBvbmVudFNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvemNvbXBvbmVudC5zZXJ2aWNlXCI7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtenVkZicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3p1ZGYuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3p1ZGYuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFp1ZGZDb21wb25lbnQgZXh0ZW5kcyBDb250YWluZXJGaWVsZEJhc2UgaW1wbGVtZW50cyBaQ29tcG9uZW50LCBPbkluaXQge1xyXG5cclxuICAvLyBmb3JtRmllbGRzOiBhbnlbXTsgLy8gcG9wdWxhdGUgdXNpbmcgZmllbGQgZWxlbWVudC4gXHJcbiAgY29tcG9uZW50UHJvcGVydGllcyA9IG5ldyBaQ29tcG9uZW50UHJvcGVydGllcygpO1xyXG4gIGluaXRpYWxEYXRhVmFsdWU6IGFueTtcclxuICBjb21wb25lbnRQcmVmaXg6IHN0cmluZztcclxuICBjb21wb25lbnRTY29wZU5hbWU6IHN0cmluZztcclxuICBkaXNwbGF5RWxlbWVudE1vZGVsOiBhbnk7XHJcbiAgbXVsdGlWYWx1ZUdyb3VwR3JpZFZhbHVlOiBzdHJpbmdbXTtcclxuICBsb2FkZWRGaWVsZHNTZXF1ZW5jZTogYW55O1xyXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIHB1YmxpYyByZWFkb25seSBwcmVmaXhWYWx1ZU9wdGlvbiA9ICdfenVkZm12Z09wdGlvbnMnO1xyXG4gIHB1YmxpYyByZWFkb25seSBwcmVmaXhEYXRhU291cmNlTmFtZSA9ICdfenVkZm12Z0RhdGFTb3VyY2UnO1xyXG4gIHB1YmxpYyByZWFkb25seSBwcmVmaXhDb2x1bW5GaWVsZHNOYW1lID0gJ196dWRmbXZnQ29sdW1uRmllbGRzJztcclxuICBwdWJsaWMgcmVhZG9ubHkgcHJlZml4Q3VzdG9tQWRkQnV0dG9uT25DbGljayA9ICdfQ3VzdG9tQWRkQnV0dG9uT25DbGljayc7XHJcbiAgcHVibGljIHJlYWRvbmx5IHByZWZpeEN1c3RvbVJlc2V0QnV0dG9uT25DbGljayA9ICdfQ3VzdG9tUmVzZXRCdXR0b25PbkNsaWNrJztcclxuICBwdWJsaWMgcmVhZG9ubHkgcHJlZml4Q3VzdG9tUmVtb3ZlQnV0dG9uT25DbGljayA9ICdfQ3VzdG9tUmVtb3ZlQnV0dG9uT25DbGljayc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIGNvbXBvbmVudFNlcnZpY2U6IFpDb21wb25lbnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmaWVsZFNlcnZpY2U6IEZpZWxkU2VydmljZSxcclxuICAgIHByaXZhdGUgdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvbXBvbmVudEVycm9ySGFuZGxlclNlcnZpY2U6IENvbXBvbmVudEVycm9ySGFuZGxlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHtcclxuICAgIHN1cGVyKGNvbXBvbmVudFNlcnZpY2UpXHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGxldCBvYnM6IE9ic2VydmFibGU8YW55PiA9IG9mKHRoaXMuZGF0YS5WYWx1ZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuZGF0YS5WYWx1ZSA9PSB1bmRlZmluZWQgJiYgdGhpcy5kYXRhLkZpZWxkRWxlbWVudENvZGUpIHtcclxuICAgICAgY29uc3QgZmllbGROYW1lID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKHRoaXMuZGF0YS5GaWVsZEVsZW1lbnRDb2RlLCB0aGlzLmdyb3VwKTtcclxuICAgICAgb2JzID0gdGhpcy5maWVsZFNlcnZpY2UuZ2V0Rm9ybUZpZWxkQ29kZShmaWVsZE5hbWUsICdGb3JtRmllbGQnLCB0aGlzLCAnZmllbGRzJyk7XHJcbiAgICB9XHJcblxyXG4gICAgc3VwZXIuaW5pdENvbXBvbmVudCgpLnBpcGUoXHJcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiBvYnMpLFxyXG4gICAgICBzd2l0Y2hNYXAoKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5GaWVsZEVsZW1lbnRDb2RlKSB7XHJcbiAgICAgICAgICAvLyB1c2Ugb2JzIHZhbHVlIG9ubHkgaWYgRmllbGRFbGVtZW50Q29kZSBpcyBzZXQuIGlmIG50byBkZWZhdWx0IGFzIG51bGwuXHJcbiAgICAgICAgICB0aGlzLmRhdGEuVmFsdWUgPSBmaWVsZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGEuVmFsdWUgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU3RvcmUgaW5pdGlhbCBkYXRhIHZhbHVlIGFuZCBzZXQgY29tcG9uZW50IHNjb3BlIGFuZCBwcmVmaXhcclxuICAgICAgICB0aGlzLmluaXRpYWxEYXRhVmFsdWUgPSB0aGlzLmRhdGEuVmFsdWU7XHJcbiAgICAgICAgdGhpcy5jb21wb25lbnRTY29wZU5hbWUgPSAnenVkZl8nICsgdGhpcy5kYXRhLk5hbWU7XHJcbiAgICAgICAgdGhpcy5jb21wb25lbnRQcmVmaXggPSAnenVkZl8nICsgdGhpcy5kYXRhLk5hbWU7XHJcblxyXG4gICAgICAgIHRoaXMuZ3JvdXBbdGhpcy5kYXRhLk5hbWUgKyAnTW9kZWwnXSA9IFtdO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRGb3JtKCk7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH0pXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVuZGVycyB0aGUgZmllbGQgZWxlbWVudCBhbmQgc2V0cyB1cCB0aGUgZm9ybS5cclxuICAgKi9cclxuICBwcml2YXRlIGxvYWRGb3JtKCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gb2YodHJ1ZSkucGlwZShcclxuICAgICAgLy8gU2V0IHRoZSBTdWJUeXBlIHRvICd6dWRmJy5cclxuICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGEuU3ViVHlwZSA9ICd6dWRmJztcclxuICAgICAgfSksXHJcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBncm91cCBmb3IgdGhlIGZpZWxkIGFuZCBzZXQgdXAgdGhlIGZvcm0uXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFpHcm91cCBmb3IgdGhlIGZpZWxkIGlmIG9uZSBkb2Vzbid0IGFscmVhZHkgZXhpc3QuXHJcbiAgICAgICAgaWYgKCF0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXSkge1xyXG4gICAgICAgICAgdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0gPSBuZXcgWkdyb3VwKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBEZWNsYXJlIGEgbmV3IHpNb2RlbCBvYmplY3QgZm9yIHRoZSBaR3JvdXAuXHJcbiAgICAgICAgY29uc3QgenVkZlNjb3BlR3JvdXAgPSB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXTtcclxuICAgICAgICB6dWRmU2NvcGVHcm91cC56TW9kZWwgPSB7fTtcclxuXHJcbiAgICAgICAgLy8gUmVuZGVyIHRoZSBmaWVsZCBlbGVtZW50LlxyXG4gICAgICAgIHRoaXMucmVuZGVyRmllbGRFbGVtZW50KHRoaXMuZGF0YS5WYWx1ZSk7XHJcblxyXG4gICAgICAgIC8vIFNldCB0aGUgZm9ybSBmb3IgdGhlIFpHcm91cCBzY29wZS5cclxuICAgICAgICBpZiAodGhpcy5kYXRhLlZhbHVlKSB7XHJcbiAgICAgICAgICAvLyBJZiBWYWx1ZSBpcyBub3QgbnVsbCwgYmluZCB0aGUgZXhpc3RpbmcgZm9ybS5cclxuICAgICAgICAgIHp1ZGZTY29wZUdyb3VwLmZvcm0gPSB0aGlzLmZvcm07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIElmIFZhbHVlIGlzIG51bGwsIGNyZWF0ZSBhIG5ldyBmb3JtIHdpdGggYW4gZW1wdHkgZm9ybSBjb250cm9sLlxyXG4gICAgICAgICAgY29uc3QgZm9ybUNvbnRyb2w6IHsgW2tleTogc3RyaW5nXTogRm9ybUNvbnRyb2wgfSA9IHt9O1xyXG4gICAgICAgICAgenVkZlNjb3BlR3JvdXAuZm9ybSA9IG5ldyBGb3JtR3JvdXAoZm9ybUNvbnRyb2wpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICAgIC8vIFNldCB0aGUgZm9ybUZpZWxkcyBwcm9wZXJ0eSBmb3IgZGlzcGxheS5cclxuICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAvLyB0aGlzLmZvcm1GaWVsZHMgPSBPYmplY3QuYXNzaWduKFtdLCB0aGlzLmRhdGEuVmFsdWUpO1xyXG5cclxuICAgICAgICBaQ29tcG9uZW50SGVscGVyLmFwcGVuZENvbnNvbGVXYXRjaExpc3QodGhpcy5ncm91cCwgYGdyb3VwLiR7dGhpcy5jb21wb25lbnRTY29wZU5hbWV9LnpNb2RlbGApO1xyXG5cclxuICAgICAgICAvLyBDYWxsIHRoZSBhZnRlcjxGaWVsZD5Mb2FkZWQgZnVuY3Rpb24gaWYgaXQgZXhpc3RzIGluIHRoZSBncm91cC5cclxuICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSAnYWZ0ZXInICsgKHRoaXMuZGF0YS5OYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGhpcy5kYXRhLk5hbWUuc2xpY2UoMSkpICsgJ0xvYWRlZCc7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3JvdXApIHtcclxuICAgICAgICAgIGlmICh0aGlzLmdyb3VwW2ZpZWxkTmFtZV0pIHtcclxuICAgICAgICAgICAgdGhpcy5ncm91cFtmaWVsZE5hbWVdKHRoaXMuZ3JvdXApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gc2V0IEZpZWxkIGRpdiBjbGFzc1xyXG4gICAgICAgIC8vIFJlcGxhY2VkIHdpdGg6IHRoaXMuZmllbGRTZXJ2aWNlLnBhdGNoRmllbGRQcm9wZXJ0eShmaWVsZCk7XHJcbiAgICAgICAgLy8gWkNvbXBvbmVudEhlbHBlci5zZXRGaWVsZHNEaXZDbGFzcyh0aGlzLmdyb3VwLl9wcm9qZWN0TmFtZSwgdGhpcy5ncm91cC5maWVsZE5hbWUsIHRoaXMuZGF0YSwgdGhpcy5hdXRoU2VydmljZSk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEZvcm1Db250cm9sVmFsaWRhdGlvbihmb3JtQ29udHJvbE5hbWU6IHN0cmluZywgdmFsaWRhdG9yOiBhbnkpIHtcclxuICAgIGRlYnVnZ2VyO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVuZGVycyBmaWVsZCBlbGVtZW50cyBiYXNlZCBvbiBhIEpTT04gc3RyaW5nLlxyXG4gICAqIEBwYXJhbSBncm91cCBUaGUgWkdyb3VwIG9iamVjdCB0byB3aGljaCB0aGUgZmllbGQgZWxlbWVudHMgd2lsbCBiZSBhZGRlZC5cclxuICAgKiBAcGFyYW0ganNvblN0cmluZyBUaGUgSlNPTiBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBmaWVsZCBlbGVtZW50cy5cclxuICAgKi9cclxuICBwdWJsaWMgcmVuZGVyRmllbGRFbGVtZW50QnlKc29uU3RyaW5nKGdyb3VwOiBaR3JvdXAsIGpzb25TdHJpbmc6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgLy8gUGFyc2UgdGhlIEpTT04gc3RyaW5nIGludG8gYW4gYXJyYXkgb2YgZmllbGQgZWxlbWVudHMuXHJcbiAgICBjb25zdCBmaWVsZEVsZW1lbnRNYXN0ZXJDb2RlSnNvbkFycmF5ID0gSlNPTi5wYXJzZShqc29uU3RyaW5nKTtcclxuXHJcbiAgICAvLyBSZW5kZXIgdGhlIGZpZWxkIGVsZW1lbnRzLlxyXG4gICAgdGhpcy5yZW5kZXJGaWVsZEVsZW1lbnQoZmllbGRFbGVtZW50TWFzdGVyQ29kZUpzb25BcnJheSk7XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gRGlzcGxheSBtb2RlbFxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGRpc3BsYXkgbW9kZWwgZm9yIGEgenVkZiAoemVyby11dGlsaXR5IGRhdGEgZmllbGQpIGVsZW1lbnQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdXNlIGZvciB0aGUgZGlzcGxheSBtb2RlbC5cclxuICAgKi9cclxuICBwdWJsaWMgc2V0RGlzcGxheU1vZGVsKHZhbHVlOiBhbnkpIHtcclxuICAgIC8vIFJlcGxhY2UgdGhlIHdob2xlIGRpc3BsYXkgbW9kZWwgd2l0aCB0aGUgbmV3IHZhbHVlXHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgLy8gQ2xlYXIgdGhlIGZvcm0gY29udHJvbFxyXG4gICAgICB0aGlzLmNsZWFyRm9ybUNvbnRyb2woKTtcclxuXHJcbiAgICAgIC8vIE1ha2UgYSBkZWVwIGNvcHkgb2YgdGhlIHZhbHVlIHRvIGF2b2lkIGFueSB1bndhbnRlZCByZWZlcmVuY2UgZXJyb3JzXHJcbiAgICAgIHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbCA9IFpDb21wb25lbnRIZWxwZXIuZGVlcENsb25lKHZhbHVlKTtcclxuXHJcbiAgICAgIC8vIFJlbmRlciB0aGUgZmllbGQgZWxlbWVudCBiYXNlZCBvbiB0aGUgbmV3IGRpc3BsYXkgbW9kZWxcclxuICAgICAgdGhpcy5yZW5kZXJGaWVsZEVsZW1lbnQodGhpcy5kaXNwbGF5RWxlbWVudE1vZGVsKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBJZiB0aGUgdmFsdWUgaXMgaW52YWxpZCwgbG9nIGEgd2FybmluZyBtZXNzYWdlXHJcbiAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCB2YWx1ZSB1c2VkIGZvciByZW5kZXIgenVkZiAnICsgdGhpcy5kYXRhLk5hbWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBVcGRhdGVzIGEgdmFsdWUgaW4gdGhlIGRpc3BsYXkgZWxlbWVudCBtb2RlbCBhdCB0aGUgc3BlY2lmaWVkIGZsYXQgaW5kZXguXHJcbiAgKiBAcGFyYW0geyp9IHZhbHVlIC0gVGhlIG5ldyB2YWx1ZSB0byBiZSBzZXQuXHJcbiAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdEluZGV4IC0gVGhlIGZsYXQgaW5kZXggaW5kaWNhdGluZyB0aGUgbG9jYXRpb24gaW4gdGhlIGRpc3BsYXkgZWxlbWVudCBtb2RlbCB3aGVyZSB0aGUgdmFsdWUgc2hvdWxkIGJlIHVwZGF0ZWQuXHJcbiAgKi9cclxuICBwdWJsaWMgdXBkYXRlRGlzcGxheU1vZGVsKHZhbHVlOiBhbnksIGZsYXRJbmRleDogc3RyaW5nKSB7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLnVwZGF0ZUFycmF5T2JqZWN0QnlGbGF0SW5kZXgodGhpcy5kaXNwbGF5RWxlbWVudE1vZGVsLCBmbGF0SW5kZXgsIHZhbHVlKTtcclxuICAgIHRoaXMudXBkYXRlRm9ybUZpZWxkKCk7XHJcbiAgICAvL3RoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogQXBwZW5kcyBhIHZhbHVlIHRvIHRoZSBkaXNwbGF5IGVsZW1lbnQgbW9kZWwgYXQgdGhlIHNwZWNpZmllZCBmbGF0IGluZGV4LlxyXG4gICogQHBhcmFtIHsqfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSBhcHBlbmRlZC5cclxuICAqIEBwYXJhbSB7c3RyaW5nfSBmbGF0SW5kZXggLSBUaGUgZmxhdCBpbmRleCBpbmRpY2F0aW5nIHRoZSBsb2NhdGlvbiBpbiB0aGUgZGlzcGxheSBlbGVtZW50IG1vZGVsIHdoZXJlIHRoZSB2YWx1ZSBzaG91bGQgYmUgYXBwZW5kZWQuXHJcbiAgKi9cclxuICBwdWJsaWMgYXBwZW5kVG9EaXNwbGF5TW9kZWwodmFsdWU6IGFueSwgZmxhdEluZGV4OiBzdHJpbmcpIHtcclxuICAgIC8vIEFwcGVuZCB0byBkaXNwbGF5IG1vZGVsIG1lYW5zIGl0IHdpbGwgaW5zZXJ0IHRoZSBmb3JtIGNvbnRyb2wgYmFzZWQgb24gZmxhdCBpbmRleC5cclxuICAgIGlmIChmbGF0SW5kZXgubGVuZ3RoID49IDMpIHtcclxuICAgICAgZmxhdEluZGV4LnN1YnN0cmluZygwLCBmbGF0SW5kZXgubGVuZ3RoIC0gMik7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2VsZWN0ZWRSZWNvcmQgPSBaQ29tcG9uZW50SGVscGVyLmdldEZyb21BcnJheU9iamVjdEJ5RmxhdEluZGV4KHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbCwgZmxhdEluZGV4KTtcclxuICAgIHNlbGVjdGVkUmVjb3JkLlZhbHVlLnB1c2godmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIGRlZXAgY29weSBvZiB0aGUgZGlzcGxheSBlbGVtZW50IG1vZGVsLlxyXG4gICAqIEByZXR1cm5zIHthbnl9IEEgZGVlcCBjb3B5IG9mIHRoZSBkaXNwbGF5IGVsZW1lbnQgbW9kZWwuXHJcbiAgICovXHJcbiAgcHVibGljIGdldERpc3BsYXlNb2RlbCgpIHtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSB0aGUgZGlzcGxheSBlbGVtZW50IG1vZGVsIGFuZCBjbGVhcnMgdGhlIGZvcm0gY29udHJvbC5cclxuICAgKi9cclxuICBwdWJsaWMgcmVtb3ZlQWxsRGlzcGxheU1vZGVsKCkge1xyXG4gICAgdGhpcy5kaXNwbGF5RWxlbWVudE1vZGVsID0gW107XHJcbiAgICB0aGlzLmNsZWFyRm9ybUNvbnRyb2woKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZXMgYW4gZWxlbWVudCBmcm9tIHRoZSBkaXNwbGF5IGVsZW1lbnQgbW9kZWwgYXQgdGhlIHNwZWNpZmllZCBmbGF0IGluZGV4IGFuZCB1cGRhdGVzIHRoZSBmb3JtIGZpZWxkLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGF0SW5kZXggLSBUaGUgZmxhdCBpbmRleCBpbmRpY2F0aW5nIHRoZSBsb2NhdGlvbiBpbiB0aGUgZGlzcGxheSBlbGVtZW50IG1vZGVsIHdoZXJlIHRoZSBlbGVtZW50IHNob3VsZCBiZSByZW1vdmVkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyByZW1vdmVFbGVtZW50RnJvbURpc3BsYXlNb2RlbChmbGF0SW5kZXg6IHN0cmluZykge1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5yZW1vdmVBcnJheU9iamVjdEJ5RmxhdEluZGV4KHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbCwgZmxhdEluZGV4KTtcclxuICAgIHRoaXMudXBkYXRlRm9ybUZpZWxkKCk7XHJcblxyXG4gICAgLy8gVE9ETzogcmVtb3ZlIGZyb20gem1vZGVsXHJcbiAgICAvL2RlbGV0ZSB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXS56TW9kZWxbJyddO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLyoqXHJcbiAgICogQXBwZW5kcyBhIGZvcm0gY29udHJvbCB0byB0aGUgZm9ybSBhbmQgdGhlIGRpc3BsYXkgZWxlbWVudCBtb2RlbC5cclxuICAgKiBAcGFyYW0ge1pGaWVsZH0gZmllbGREYXRhIC0gVGhlIGRhdGEgZm9yIHRoZSBmb3JtIGNvbnRyb2wgdG8gYmUgYXBwZW5kZWQuXHJcbiAgICovXHJcbiAgcHVibGljIGFwcGVuZEZvcm1Db250cm9sKGZpZWxkRGF0YSkge1xyXG4gICAgLy8gQXBwZW5kIGZvcm0gY29udHJvbCBtZWFucyBpdCB3aWxsIGp1c3QgaW5zZXJ0IHRoZSBmb3JtIGNvbnRyb2wgYXQgdGhlIGVuZC5cclxuICAgIGZpZWxkRGF0YS5OYW1lID0gdGhpcy5nZW5lcmF0ZUZvcm1Db250cm9sTmFtZShmaWVsZERhdGEuTmFtZSwgZmllbGREYXRhWydjb250YWluZXJOYW1lJ10pO1xyXG4gICAgY29uc3QgZm9ybUNvbnRyb2xzID0ge307XHJcblxyXG4gICAgZm9ybUNvbnRyb2xzW2ZpZWxkRGF0YS5OYW1lXSA9IG5ldyBGb3JtQ29udHJvbChcclxuICAgICAgdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0uek1vZGVsW2ZpZWxkRGF0YS5OYW1lXVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLmZvcm0uYWRkQ29udHJvbChmaWVsZERhdGEuTmFtZSwgZm9ybUNvbnRyb2xzW2ZpZWxkRGF0YS5OYW1lXSk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmRhdGEuVmFsdWUpIHtcclxuICAgICAgY29uc29sZS5sb2coJ2Zvcm1GaWVsZCAnICsgdGhpcy5kYXRhLk5hbWUgKyAnIGlzIHVuZGVmaW5lZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbCA9IHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbCA/PyBbXTtcclxuICAgIHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbC5wdXNoKGZpZWxkRGF0YSk7XHJcbiAgICB0aGlzLnVwZGF0ZUZvcm1GaWVsZCgpO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVuZGVycyBmaWVsZCBlbGVtZW50cyBhcyBmb3JtIGNvbnRyb2xzIGluIGEgbmV3IGZvcm0gZ3JvdXAuXHJcbiAgICogQHBhcmFtIHthbnl9IGZpZWxkRWxlbWVudHMgLSBUaGUgZmllbGQgZWxlbWVudHMgdG8gYmUgcmVuZGVyZWQuXHJcbiAgICovXHJcbiAgcHVibGljIHJlbmRlckZpZWxkRWxlbWVudChmaWVsZEVsZW1lbnRzKSB7XHJcbiAgICB0aGlzLmNsZWFyWk1vZGVsKCk7XHJcblxyXG4gICAgaWYgKGZpZWxkRWxlbWVudHMpIHtcclxuICAgICAgdGhpcy5sb2FkZWRGaWVsZHNTZXF1ZW5jZSA9IHt9O1xyXG4gICAgICBjb25zdCBmb3JtQ29udHJvbHMgPSB7fTtcclxuICAgICAgZmllbGRFbGVtZW50cyA9IHRoaXMuZ2VuZXJhdGVGb3JtQ29udHJvbHMoZmllbGRFbGVtZW50cywgZm9ybUNvbnRyb2xzKTtcclxuXHJcbiAgICAgIC8vIFVuc3Vic2NyaWJlIGZyb20gcHJldmlvdXMgc3Vic2NyaXB0aW9uIGlmIGV4aXN0c1xyXG4gICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBSZW5kZXIgZm9ybSBjb250cm9scyB0byBuZXcgZm9ybSBncm91cFxyXG4gICAgICB0aGlzLmZvcm0gPSBuZXcgRm9ybUdyb3VwKGZvcm1Db250cm9scyk7XHJcbiAgICAgIHRoaXMuZGF0YS5WYWx1ZSA9IGZpZWxkRWxlbWVudHM7XHJcbiAgICAgIHRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdLmZvcm0gPSB0aGlzLmZvcm07XHJcbiAgICAgIHRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdWydsb2FkZWRGaWVsZHNTZXF1ZW5jZSddID0gdGhpcy5sb2FkZWRGaWVsZHNTZXF1ZW5jZTtcclxuXHJcbiAgICAgIC8vIFN1YnNjcmliZSB0byBjb21wb25lbnRMb2FkZWQkIGV2ZW50XHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5maWVsZFNlcnZpY2UuZ2V0Q29tcG9uZW50TG9hZGVkJCgnenVkZicpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgLy8gQWxsIGNvbXBvbmVudHMgaGF2ZSBmaW5pc2hlZCBsb2FkaW5nXHJcblxyXG4gICAgICAgIGNvbnN0IHp1ZGZHcm91cCA9IHRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdO1xyXG4gICAgICAgIGlmICh6dWRmR3JvdXBbJ2xpbmtlZENvbXBvbmVudCddKSB7XHJcbiAgICAgICAgICB6dWRmR3JvdXBbJ2xpbmtlZENvbXBvbmVudCddLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmtlZENvbXBvbmVudFNlZ21lbnRzID0gaXRlbS52YWx1ZS5zcGxpdCgnXycpO1xyXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRDb21wb25lbnROYW1lID0gbGlua2VkQ29tcG9uZW50U2VnbWVudHMuc2xpY2UoMCwgMikuam9pbignXycpICsgJ18nICsgaXRlbS5saW5rZWRDb21wb25lbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudENvbXBvbmVudCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50QnlWYWx1ZSh0aGlzLmdyb3VwLCBwYXJlbnRDb21wb25lbnROYW1lKTtcclxuICAgICAgICAgICAgY29uc3QgY2hpbGRDb21wb25lbnQgPSBaQ29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudEJ5VmFsdWUodGhpcy5ncm91cCwgaXRlbS52YWx1ZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAocGFyZW50Q29tcG9uZW50ICYmIGNoaWxkQ29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxTZWxlY3RPcHRpb25zID0gY2hpbGRDb21wb25lbnQuZGF0YVsnb3JpZ2luYWxTZWxlY3RPcHRpb25zJ10gPz8gT2JqZWN0LmFzc2lnbihbXSwgY2hpbGRDb21wb25lbnQuZGF0YS5TZWxlY3RPcHRpb25zKTtcclxuICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJlZFNlbGVjdGlvbk9wdGlvbnMgPSBvcmlnaW5hbFNlbGVjdE9wdGlvbnMuZmlsdGVyKG9wdGlvbiA9PiBvcHRpb24ucGFyZW50RXhwcmVzc2lvbiA9PSB6dWRmR3JvdXAuek1vZGVsW3BhcmVudENvbXBvbmVudE5hbWVdKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gTWFudWFsbHkgcGF0Y2ggdGhlIGNvbXBvbmVudCBmb3JtIGNvbnRyb2wgdmFsdWVcclxuICAgICAgICAgICAgICBjb25zdCB6dWRmRm9ybSA9IHp1ZGZHcm91cC5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRGb3JtQ29udHJvbCA9IHp1ZGZGb3JtLmNvbnRyb2xzW2l0ZW0udmFsdWVdIGFzIEZvcm1Db250cm9sO1xyXG4gICAgICAgICAgICAgIGlmIChjb21wb25lbnRGb3JtQ29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgY2hpbGRDb21wb25lbnQuc2V0U2VsZWN0T3B0aW9uKGZpbHRlcmVkU2VsZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRGb3JtQ29udHJvbC5wYXRjaFZhbHVlKHp1ZGZHcm91cC56TW9kZWxbaXRlbS52YWx1ZV0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVW5hYmxlIHRvIGdldCBmb3JtY29udHJvbCBmb3IgJyArIGl0ZW0udmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coenVkZkZvcm0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBUbyBjb25zaWRlcjogVHJpZ2dlciB0aGUgXCJvbmNoYW5nZVwiIGV2ZW50IG9yIHBlcmZvcm0gYW55IG90aGVyIG5lY2Vzc2FyeSBhY3Rpb25zIGhlcmVcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdlbmVyYXRlRm9ybUNvbnRyb2xzKGZpZWxkQXJyYXk6IGFueSwgZm9ybUNvbnRyb2xzOiB7IFtrZXk6IHN0cmluZ106IEZvcm1Db250cm9sIH0sIGNvbnRhaW5lck5hbWU/OiBzdHJpbmcsIGlzTXVsdGlWYWx1ZUdyb3VwID0gZmFsc2UsIGZpZWxkVmFsdWVHcm91cGVkID0gZmFsc2UsIGluZGV4ID0gJycpIHtcclxuICAgIGZpZWxkQXJyYXkuZm9yRWFjaCgoZmllbGQsIGkpID0+IHtcclxuICAgICAgY29uc3QgZmllbGRJbmRleCA9IGluZGV4ID8gYCR7aW5kZXh9LiR7aSArIDF9YCA6IGAke2l9YDtcclxuXHJcbiAgICAgIHRoaXMuZmllbGRTZXJ2aWNlLnBhdGNoRmllbGRQcm9wZXJ0eShmaWVsZCk7XHJcbiAgICAgIGlmICh0eXBlb2YgZmllbGQuVmFsdWUgPT09IFwic3RyaW5nXCIgJiYgZmllbGQuVmFsdWUuaW5kZXhPZihcIi5cIikgIT09IC0xKSB7XHJcbiAgICAgICAgaWYgKFsnemdyaWQnLCAnenRyZWUnLCAnemltZycsICd0ZXh0YXJlYWpzb24nXS5pbmRleE9mKGZpZWxkLlR5cGUpID09PSAtMSkge1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKFwiRm9ybUNvbnRyb2wgLSBpbnZhbGlkIGZpZWxkIHZhbHVlXCIsIGZpZWxkLlZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgY29uc3QgenVkZkdyb3VwID0gdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV07XHJcblxyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkLlZhbHVlKSkge1xyXG4gICAgICAgICAgLy8gaW5zZXJ0IG11bHRpdmFsdWVncm91cCB0byB0aGUgY2FyZCB2YWx1ZSBpZiB0cnVlXHJcbiAgICAgICAgICBjb25zdCBmaWVsZFZhbHVlR3JvdXBlZCA9IGZpZWxkLlR5cGUgPT0gQ29tcG9uZW50VHlwZS5ncm91cGluZyA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgICAgIHRoaXMubG9hZGVkRmllbGRzU2VxdWVuY2VbZmllbGRJbmRleF0gPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IGZpZWxkLk11bHRpVmFsdWVkR3JvdXAgPyBgJHt0aGlzLmdlbmVyYXRlRm9ybUNvbnRyb2xOYW1lKGZpZWxkLk5hbWUpfSR7dGhpcy5wcmVmaXhWYWx1ZU9wdGlvbn1gIDogYCR7dGhpcy5nZW5lcmF0ZUZvcm1Db250cm9sTmFtZShmaWVsZC5OYW1lKX1gLFxyXG4gICAgICAgICAgICBsYWJlbDogZmllbGQuVGl0bGUsXHJcbiAgICAgICAgICAgIHR5cGU6IGZpZWxkLlR5cGUsXHJcbiAgICAgICAgICAgIGlzTXVsdGlWYWx1ZUdyb3VwOiBmaWVsZC5NdWx0aVZhbHVlZEdyb3VwID8/IGZhbHNlLFxyXG4gICAgICAgICAgICBpc0dyb3VwZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBpc1Zpc2libGU6IGZpZWxkLlZpc2libGUgPz8gZmFsc2UsXHJcbiAgICAgICAgICAgIGlzUmVxdWlyZWQ6IGZpZWxkLklzUmVxdWlyZWQgPz8gZmFsc2UsXHJcbiAgICAgICAgICAgIGlzUmVhZE9ubHk6IGZpZWxkLlJlYWRPbmx5ID8/IGZhbHNlLFxyXG4gICAgICAgICAgICBkYXRhU291cmNlVHlwZTogZmllbGQuenVkZkRhdGFTb3VyY2VUeXBlID8/IG51bGwgLy92YWx1ZSBha2EgbWFudWFsLCB1c2VyLCByZXNvdXJjZSBha2EgcmVzb3VyY2VcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgaWYgKGZpZWxkLk11bHRpVmFsdWVkR3JvdXApIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRNdWx0aVZhbHVlR3JvdXAoZmllbGQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5nZW5lcmF0ZUZvcm1Db250cm9scyhmaWVsZC5WYWx1ZSwgZm9ybUNvbnRyb2xzLCBmaWVsZC5OYW1lLCBmaWVsZC5NdWx0aVZhbHVlZEdyb3VwLCBmaWVsZFZhbHVlR3JvdXBlZCwgZmllbGRJbmRleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgLy8gYmVmb3JlIGdlbmVyYXRlIEZvcm1Db250cm9sLCB3ZSBuZWVkIHRvIGFkZCAyIGF0dHJpYnV0ZSB0byB0aGUgZmllbGQgd2hlbiByZW5kZXIuXHJcbiAgICAgICAgICAvLyB0aGlzIGZvciBsYXRlciBvbiwgd2UgY2FuIGVhc2lseSBrbm93IHRoaXMgZmllbGQgYmVsb25nIHRvIHdoaWNoIHp1ZGYgYW5kIHVuZGVyIHdoaWNoIGNvbnRhaW5lci5cclxuICAgICAgICAgIGlmIChjb250YWluZXJOYW1lKSB7XHJcbiAgICAgICAgICAgIGZpZWxkWydjb250YWluZXJOYW1lJ10gPSBjb250YWluZXJOYW1lO1xyXG4gICAgICAgICAgICBpZiAoIXp1ZGZHcm91cFtjb250YWluZXJOYW1lXSkge1xyXG4gICAgICAgICAgICAgIHp1ZGZHcm91cFtjb250YWluZXJOYW1lXSA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgaXNGb3JtQ29udHJvbCA9IFpDb21wb25lbnRIZWxwZXIuaXNGb3JtQ29udHJvbChmaWVsZCk7XHJcbiAgICAgICAgICBjb25zdCBpc1Zpc2libGUgPSBaQ29tcG9uZW50SGVscGVyLmlzVmlzaWJsZUZvcm1Db250cm9sKHRoaXMsIGZpZWxkKTtcclxuICAgICAgICAgIGNvbnN0IGlzUmVxdWlyZWQgPSBaQ29tcG9uZW50SGVscGVyLmlzUmVxdWlyZWRGb3JtQ29udHJvbCh0aGlzLCBmaWVsZCk7XHJcblxyXG4gICAgICAgICAgaWYgKGlzRm9ybUNvbnRyb2wgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmxvYWRlZEZpZWxkc1NlcXVlbmNlKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5sb2FkZWRGaWVsZHNTZXF1ZW5jZSA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZmllbGQuVHlwZSA9PT0gJ3p1aXNlbGVjdG11bHRpcGxlJykge1xyXG4gICAgICAgICAgICAgIHRoaXMuZmllbGRTZXJ2aWNlLmluY3JlbWVudENvbXBvbmVudENvdW50ZXIoJ3p1ZGYnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmaWVsZC5OYW1lID0gdGhpcy5nZW5lcmF0ZUZvcm1Db250cm9sTmFtZShmaWVsZC5OYW1lLCBjb250YWluZXJOYW1lKTtcclxuICAgICAgICAgICAgZmllbGQuVmFsdWUgPSB0aGlzLmdlbmVyYXRlRm9ybUNvbnRyb2xOYW1lKGZpZWxkLlZhbHVlLCBjb250YWluZXJOYW1lKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubG9hZGVkRmllbGRzU2VxdWVuY2VbZmllbGRJbmRleF0gPSB7XHJcbiAgICAgICAgICAgICAgbmFtZTogZmllbGQuTmFtZSxcclxuICAgICAgICAgICAgICBsYWJlbDogZmllbGQuTGFiZWwsXHJcbiAgICAgICAgICAgICAgdHlwZTogZmllbGQuVHlwZSxcclxuICAgICAgICAgICAgICBpc011bHRpVmFsdWVHcm91cDogaXNNdWx0aVZhbHVlR3JvdXAsXHJcbiAgICAgICAgICAgICAgaXNHcm91cGVkOiBmaWVsZFZhbHVlR3JvdXBlZCxcclxuICAgICAgICAgICAgICBpc1Zpc2libGU6IGZpZWxkLlZpc2libGUgPz8gZmFsc2UsXHJcbiAgICAgICAgICAgICAgaXNSZXF1aXJlZDogZmllbGQuSXNSZXF1aXJlZCA/PyBmYWxzZSxcclxuICAgICAgICAgICAgICBpc1JlYWRPbmx5OiBmaWVsZC5SZWFkT25seSA/PyBmYWxzZSxcclxuICAgICAgICAgICAgICBkYXRhU291cmNlVHlwZTogZmllbGQuenVkZkRhdGFTb3VyY2VUeXBlID8/IG51bGwgLy92YWx1ZSBha2EgbWFudWFsLCB1c2VyLCByZXNvdXJjZSBha2EgcmVzb3VyY2VcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjb250YWluZXJOYW1lKSB7XHJcbiAgICAgICAgICAgICAgaWYgKCF6dWRmR3JvdXBbY29udGFpbmVyTmFtZV0uaW5jbHVkZXMoZmllbGQuVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICB6dWRmR3JvdXBbY29udGFpbmVyTmFtZV0ucHVzaChmaWVsZC5WYWx1ZSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIHNldCB0aGUgbGlzdCBvZiBkcm9wZG93biBvcHRpb24gdG8gdGhlIHZhcmlhYmxlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRHJvcGRvd25UeXBlKGZpZWxkLlR5cGUpICYmIGZpZWxkLlpEYXRhT3B0aW9uTmFtZSAmJiBmaWVsZC5Ecm9wZG93bk9wdGlvbnMpIHtcclxuICAgICAgICAgICAgICB0aGlzLmdyb3VwLnpEYXRhW2ZpZWxkLlpEYXRhT3B0aW9uTmFtZV0gPSBPYmplY3QuYXNzaWduKFtdLCBldmFsKCd0aGlzLicgKyBmaWVsZC5Ecm9wZG93bk9wdGlvbnMpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNEcm9wZG93blR5cGUoZmllbGQuVHlwZSkgJiYgZmllbGQuenVkZkxpbmtlZENvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgIC8vIGtlZXAgYSBsaXN0IG9mIGxpbmtlZCBDb21wb25lbnQsIGxhdGVyIHdpbGwgYmUgdXNlZCBpbiBvbkNoYW5nZSBhdCBpbnB1dGZpZWxkYmFzZS5cclxuICAgICAgICAgICAgICBpZiAoIXp1ZGZHcm91cFsnbGlua2VkQ29tcG9uZW50J10pIHtcclxuICAgICAgICAgICAgICAgIHp1ZGZHcm91cFsnbGlua2VkQ29tcG9uZW50J10gPSBbXTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIHp1ZGZHcm91cFsnbGlua2VkQ29tcG9uZW50J10ucHVzaCh7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogZmllbGQuVmFsdWUsXHJcbiAgICAgICAgICAgICAgICBsaW5rZWRDb21wb25lbnQ6IGZpZWxkLnp1ZGZMaW5rZWRDb21wb25lbnRcclxuICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgLy8ga2VlcCBhIGNvcHkgb2YgU2VsZWN0T3B0aW9ucyB0byBvcmlnaW5hbFNlbGVjdE9wdGlvbnMoc2FtZSBhcyBvbmNoYW5nZSlcclxuICAgICAgICAgICAgICAvLyBjbGVhciB0aGUgU2VsZWN0aW9uT3B0aW9uIHNpbmNlIGl0IHdvbnQgYmUgdXNlZCB3aGVuIGZpcnN0IGluaXQsIHVudGlsIHBhcmVudCBkcm9wZG93biBvcHRpb24gYmVlbiBzZWxlY3RlZC5cclxuICAgICAgICAgICAgICBmaWVsZFsnb3JpZ2luYWxTZWxlY3RPcHRpb25zJ10gPSBPYmplY3QuYXNzaWduKFtdLCBmaWVsZC5TZWxlY3RPcHRpb25zKTtcclxuICAgICAgICAgICAgICBmaWVsZC5TZWxlY3RPcHRpb25zID0gW107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGF1dG8gYXBwZW5kIGN1cnJlbnQgdXNlciB0byB0aGUgem1vZGVsIGJhc2Ugb24gZmllbGQgZWxlbWVudCBhdHRyaWJ1dGUgXCJ6dWRmU2V0RGVmYXVsdFVzZXJcIlxyXG4gICAgICAgICAgICBpZiAoZmllbGQuenVkZlNldERlZmF1bHRVc2VyKSB7XHJcbiAgICAgICAgICAgICAgaWYgKCF6dWRmR3JvdXBbJ2ZpZWxkUmVxdWlyZWREZWZhdWx0VXNlciddKSB7XHJcbiAgICAgICAgICAgICAgICB6dWRmR3JvdXBbJ2ZpZWxkUmVxdWlyZWREZWZhdWx0VXNlciddID0gW107XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAvLyBrZWVwIGEgbGlzdCBvZiBkZWZhdWx0IHVzZXIgbmVlZCB0byBiZSBmaWxsZWQgaW4gdGhlIHNjb3BlXHJcbiAgICAgICAgICAgICAgenVkZkdyb3VwWydmaWVsZFJlcXVpcmVkRGVmYXVsdFVzZXInXS5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGZpZWxkTmFtZTogZmllbGQuTmFtZSxcclxuICAgICAgICAgICAgICAgIGNoaWxkRmllbGRzOiBmaWVsZC5DaGlsZEZpZWxkc1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyB2YWxpZGF0b3IgZm9yIHRoZSBjb21wb25lbnRcclxuICAgICAgICAgICAgY29uc3QgdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IFpDb21wb25lbnRIZWxwZXIuZ2V0VmFsaWRhdG9ycyhmaWVsZCwgaXNWaXNpYmxlLCBpc1JlcXVpcmVkKTtcclxuICAgICAgICAgICAgZm9ybUNvbnRyb2xzW2ZpZWxkLlZhbHVlXSA9IG5ldyBGb3JtQ29udHJvbChcclxuICAgICAgICAgICAgICB6dWRmR3JvdXAuek1vZGVsW2ZpZWxkLlZhbHVlXSxcclxuICAgICAgICAgICAgICB2YWxpZGF0b3JzXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGlmIChaQ29tcG9uZW50SGVscGVyLmhhc0NDRmllbGQoZmllbGQuVHlwZSkpIHtcclxuICAgICAgICAgICAgICBjb25zdCBjY1ZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBaQ29tcG9uZW50SGVscGVyLmdldENDVmFsaWRhdG9ycyhmaWVsZCwgaXNWaXNpYmxlLCBpc1JlcXVpcmVkKTtcclxuICAgICAgICAgICAgICBmb3JtQ29udHJvbHNbZmllbGQuQ0NWYWx1ZV0gPSBuZXcgRm9ybUNvbnRyb2woXHJcbiAgICAgICAgICAgICAgICB6dWRmR3JvdXAuek1vZGVsW2ZpZWxkLkNDVmFsdWVdLFxyXG4gICAgICAgICAgICAgICAgY2NWYWxpZGF0b3JzXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBvbmNoYW5nZSBoYW5kbGluZz9cclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gZmllbGRBcnJheTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZXMgdGhlIGZvcm0gY29udHJvbHMgZnJvbSB0aGUgZm9ybSBncm91cCBhbmQgcmVzZXRzIHRoZSBjb21wb25lbnQncyBkYXRhIGFuZCBkaXNwbGF5IGVsZW1lbnQgbW9kZWwuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwdWJsaWMgY2xlYXJGb3JtQ29udHJvbCgpIHtcclxuICAgIC8vIFJlbW92ZSBlYWNoIGZvcm0gY29udHJvbCBmcm9tIHRoZSBmb3JtIGdyb3VwXHJcbiAgICBpZiAodGhpcy5kYXRhLlZhbHVlICYmIHRoaXMuZGF0YS5WYWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuZGF0YS5WYWx1ZS5mb3JFYWNoKGRhdGEgPT4ge1xyXG4gICAgICAgIHRoaXMuZm9ybS5yZW1vdmVDb250cm9sKGRhdGEuVmFsdWUpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXNldCB0aGUgY29tcG9uZW50J3MgZGF0YSBhbmQgZGlzcGxheSBlbGVtZW50IG1vZGVsXHJcbiAgICB0aGlzLmRhdGEuVmFsdWUgPSB0aGlzLmluaXRpYWxEYXRhVmFsdWU7XHJcbiAgICB0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWwgPSBbXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGZvcm0gZmllbGRzIGZvciB0aGUgY29tcG9uZW50LlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge29iamVjdFtdfSAtIEFuIGFycmF5IG9mIGZvcm0gZmllbGQgb2JqZWN0cy5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0Rm9ybUNvbnRyb2woKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhLlZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgek1vZGVsIHZhbHVlcyBvZiBhIGZvcm0gZ3JvdXAgYmFzZWQgb24gdGhlIHByb3ZpZGVkIG1vZGVsIGRhdGEuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1pHcm91cH0gW2dyb3VwPXRoaXMuZ3JvdXBdIC0gVGhlIGZvcm0gZ3JvdXAgdG8gdXBkYXRlLlxyXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBtb2RlbERhdGEgLSBUaGUgbW9kZWwgZGF0YSB0byBhcHBseSB0byB0aGUgZm9ybSBncm91cC5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwdWJsaWMgc2V0Rm9ybUZpZWxkek1vZGVsKGdyb3VwID0gdGhpcy5ncm91cCwgbW9kZWxEYXRhKSB7XHJcbiAgICAvLyBBZGQgdGhlIGNvbXBvbmVudCBwcmVmaXggdG8gdGhlIG1vZGVsIGRhdGEgcHJvcGVydHkgbmFtZXNcclxuICAgIGNvbnN0IHBhdGNoZWRNb2RlbERhdGEgPSB0aGlzLmFkZFpNb2RlbFByb3BlcnR5UHJlZml4KG1vZGVsRGF0YSk7XHJcblxyXG4gICAgLy8gVXBkYXRlIHRoZSB6TW9kZWwgdmFsdWVzIG9mIHRoZSBmb3JtIGdyb3VwXHJcbiAgICBPYmplY3QuYXNzaWduKGdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXS56TW9kZWwsIHBhdGNoZWRNb2RlbERhdGEpO1xyXG5cclxuICAgIC8vIFVwZGF0ZSBncmlkIHZhbHVlcyBmb3IgYW55IGFycmF5cyBpbiB0aGUgbW9kZWwgZGF0YSBiYXNlIG9uIGtjYXJkIGNvbXBvbmVudC4gXHJcbiAgICBmb3IgKGNvbnN0IG1vZGVsIGluIHBhdGNoZWRNb2RlbERhdGEpIHtcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGF0Y2hlZE1vZGVsRGF0YVttb2RlbF0pKSB7XHJcbiAgICAgICAgY29uc3QgZ3JpZFZhbHVlID0gYCR7bW9kZWx9JHt0aGlzLnByZWZpeFZhbHVlT3B0aW9ufWA7XHJcbiAgICAgICAgY29uc3QgZ3JpZERhdGFTb3VyY2UgPSBgJHttb2RlbH0ke3RoaXMucHJlZml4RGF0YVNvdXJjZU5hbWV9YDtcclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgaXMgaXQga2NhcmQsIHNvbWV0aW1lIGNhbiBiZSBkcm9wZG93bi5cclxuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBaQ29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudEJ5VmFsdWUodGhpcy5ncm91cCwgbW9kZWwpO1xyXG4gICAgICAgIGlmIChjb21wb25lbnQ/LmRhdGE/LlR5cGUgPT09ICdrY2FyZCcpIHtcclxuICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgZGF0YSBzb3VyY2UgZm9yIHRoZSBncmlkXHJcbiAgICAgICAgICBncm91cFtncmlkRGF0YVNvdXJjZV0gPSBwYXRjaGVkTW9kZWxEYXRhW21vZGVsXTtcclxuXHJcbiAgICAgICAgICAvLyBVcGRhdGUgdGhlIGdyaWQgdmFsdWVcclxuICAgICAgICAgIGlmIChncm91cFtncmlkVmFsdWVdKSB7XHJcbiAgICAgICAgICAgIGdyb3VwW2dyaWRWYWx1ZV0uc2V0RGF0YShncm91cFtncmlkRGF0YVNvdXJjZV0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBVcGRhdGUgdGhlIGZvcm0gZ3JvdXAgbW9kZWxcclxuICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICBmb3JtR3JvdXAucGF0Y2hWYWx1ZShncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0uek1vZGVsKTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gKiBBZGQgdGhlIGNvbXBvbmVudCBwcmVmaXggdG8gcHJvcGVydHkgbmFtZXMgaW4gYW4gb2JqZWN0LlxyXG4gKlxyXG4gKiBAcGFyYW0geyp9IG1vZGVsRGF0YSAtIFRoZSBvYmplY3QgdG8gdXBkYXRlLlxyXG4gKiBAcGFyYW0geyp9IFtjb250YWluZXJQcmVmaXhdIC0gT3B0aW9uYWwgcGFyYW1ldGVyIGluZGljYXRpbmcgdGhlIHByZWZpeCB0byB1c2UgZm9yIHByb3BlcnRpZXMgaW4gbmVzdGVkIG9iamVjdHMuXHJcbiAqIEByZXR1cm5zIHsqfSBUaGUgdXBkYXRlZCBvYmplY3QuXHJcbiAqL1xyXG4gIHByaXZhdGUgYWRkWk1vZGVsUHJvcGVydHlQcmVmaXgobW9kZWxEYXRhOiBhbnksIGNvbnRhaW5lclByZWZpeD86IGFueSk6IGFueSB7XHJcbiAgICAvLyBDcmVhdGUgYSBuZXcgb2JqZWN0IHRvIHN0b3JlIHRoZSB1cGRhdGVkIGRhdGFcclxuICAgIGNvbnN0IHVwZGF0ZWRNb2RlbERhdGEgPSB7fTtcclxuXHJcbiAgICBpZiAodHlwZW9mIG1vZGVsRGF0YSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG1vZGVsRGF0YSA9PT0gJ251bWJlcicgfHwgWkNvbXBvbmVudEhlbHBlci5pc051bGxVbmRlZmluZWRFbXB0eShtb2RlbERhdGEpKSB7XHJcbiAgICAgIHJldHVybiBtb2RlbERhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggcHJvcGVydHkgaW4gdGhlIGlucHV0IG9iamVjdFxyXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgaW4gbW9kZWxEYXRhKSB7XHJcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBhbiBhcnJheVxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShtb2RlbERhdGFbcHJvcGVydHlOYW1lXSkpIHtcclxuICAgICAgICAvLyBIYW5kbGUgYXJyYXlzIHJlY3Vyc2l2ZWx5XHJcbiAgICAgICAgY29uc3QgdXBkYXRlZEFycmF5ID0gW107XHJcblxyXG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5XHJcbiAgICAgICAgZm9yIChjb25zdCBhcnJheUVsZW1lbnQgb2YgbW9kZWxEYXRhW3Byb3BlcnR5TmFtZV0pIHtcclxuICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNhbGwgdGhpcyBtZXRob2QgdG8gdXBkYXRlIHRoZSBwcm9wZXJ0aWVzIG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXlcclxuICAgICAgICAgIGNvbnN0IHVwZGF0ZWRFbGVtZW50ID0gdGhpcy5hZGRaTW9kZWxQcm9wZXJ0eVByZWZpeChhcnJheUVsZW1lbnQsIHByb3BlcnR5TmFtZSk7XHJcblxyXG4gICAgICAgICAgLy8gQWRkIHRoZSB1cGRhdGVkIGVsZW1lbnQgdG8gdGhlIGFycmF5XHJcbiAgICAgICAgICB1cGRhdGVkQXJyYXkucHVzaCh1cGRhdGVkRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBBZGQgdGhlIHVwZGF0ZWQgYXJyYXkgdG8gdGhlIG91dHB1dCBvYmplY3RcclxuICAgICAgICBjb25zdCBwcmVmaXhlZFByb3BlcnR5TmFtZSA9IGAke3RoaXMuY29tcG9uZW50UHJlZml4fV8ke3Byb3BlcnR5TmFtZX1gO1xyXG4gICAgICAgIHVwZGF0ZWRNb2RlbERhdGFbcHJlZml4ZWRQcm9wZXJ0eU5hbWVdID0gdXBkYXRlZEFycmF5O1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiBtb2RlbERhdGFbcHJvcGVydHlOYW1lXSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAvLyBIYW5kbGUgbmVzdGVkIG9iamVjdHMgcmVjdXJzaXZlbHlcclxuICAgICAgICBjb25zdCB1cGRhdGVkTmVzdGVkT2JqZWN0ID0gdGhpcy5hZGRaTW9kZWxQcm9wZXJ0eVByZWZpeChtb2RlbERhdGFbcHJvcGVydHlOYW1lXSwgcHJvcGVydHlOYW1lKTtcclxuXHJcbiAgICAgICAgLy8gQWRkIHRoZSB1cGRhdGVkIG5lc3RlZCBvYmplY3QgdG8gdGhlIG91dHB1dCBvYmplY3RcclxuICAgICAgICBjb25zdCBwcmVmaXhlZFByb3BlcnR5TmFtZSA9IGAke3RoaXMuY29tcG9uZW50UHJlZml4fV8ke3Byb3BlcnR5TmFtZX1gO1xyXG4gICAgICAgIHVwZGF0ZWRNb2RlbERhdGFbcHJlZml4ZWRQcm9wZXJ0eU5hbWVdID0gdXBkYXRlZE5lc3RlZE9iamVjdDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBBZGQgdGhlIHByb3BlcnR5IHRvIHRoZSBvdXRwdXQgb2JqZWN0IHdpdGggdGhlIGNvbXBvbmVudCBwcmVmaXhcclxuICAgICAgICBsZXQgcHJlZml4ZWRQcm9wZXJ0eU5hbWU7XHJcbiAgICAgICAgaWYgKGNvbnRhaW5lclByZWZpeCkge1xyXG4gICAgICAgICAgcHJlZml4ZWRQcm9wZXJ0eU5hbWUgPSBgJHt0aGlzLmNvbXBvbmVudFByZWZpeH1fJHtjb250YWluZXJQcmVmaXh9XyR7cHJvcGVydHlOYW1lfWA7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHByZWZpeGVkUHJvcGVydHlOYW1lID0gYCR7dGhpcy5jb21wb25lbnRQcmVmaXh9XyR7cHJvcGVydHlOYW1lfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHVwZGF0ZWRNb2RlbERhdGFbcHJlZml4ZWRQcm9wZXJ0eU5hbWVdID0gbW9kZWxEYXRhW3Byb3BlcnR5TmFtZV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXR1cm4gdGhlIHVwZGF0ZWQgb2JqZWN0XHJcbiAgICByZXR1cm4gdXBkYXRlZE1vZGVsRGF0YTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRaTW9kZWxBc1N0cmluZygpIHtcclxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLmdldFpNb2RlbCgpKTtcclxuICB9XHJcblxyXG4gIENvbXBvbmVudElzVmlzaWJsZShmaWVsZDogWkZpZWxkKTogYW55IHtcclxuICAgIHJldHVybiBaQ29tcG9uZW50SGVscGVyLkNvbXBvbmVudElzVmlzaWJsZShmaWVsZCwgdGhpcy5ncm91cCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RW5hYmxlID0gKHN0YXR1czogYm9vbGVhbikgPT4ge1xyXG4gICAgdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkgPSAhc3RhdHVzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFZpc2libGUgPSAoc3RhdHVzOiBib29sZWFuKSA9PiB7XHJcbiAgICB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlID0gc3RhdHVzO1xyXG4gICAgdGhpcy5kYXRhLlZpc2libGUgPSBzdGF0dXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0UmVxdWlyZSA9IChzdGF0dXM6IGJvb2xlYW4pID0+IHtcclxuICAgIHRoaXMuY29tcG9uZW50UHJvcGVydGllcy5pc1JlcXVpcmVkID0gc3RhdHVzO1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5jaGFuZ2VWYWxpZGF0b3Ioc3RhdHVzLCB0aGlzLmdyb3VwLCB0aGlzLmRhdGEuVmFsdWUsIHRoaXMuY29tcG9uZW50UHJvcGVydGllcywgVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcblxyXG4gICAgaWYgKHRoaXMuZGF0YS5UeXBlID09PSAnenRleHRlZGl0b3InKSB7XHJcbiAgICAgIFpDb21wb25lbnRIZWxwZXIuY2hhbmdlVmFsaWRhdG9yKHN0YXR1cywgdGhpcy5ncm91cCwgdGhpcy5kYXRhLlZhbHVlLCB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMsIFpDb21wb25lbnRIZWxwZXIucmVxdWlyZWRWYWxpZGF0b3JfV2l0aG91dFdoaXRlU3BhY2VzX1RleHRFZGl0b3IpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIFpDb21wb25lbnRIZWxwZXIuY2hhbmdlVmFsaWRhdG9yKHN0YXR1cywgdGhpcy5ncm91cCwgdGhpcy5kYXRhLlZhbHVlLCB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMsIFpDb21wb25lbnRIZWxwZXIucmVxdWlyZWRWYWxpZGF0b3JfV2l0aG91dFdoaXRlU3BhY2VzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRGb3JtKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlcyB0aGUgbmFtZSBvZiBhIGZvcm0gY29udHJvbCBiYXNlZCBvbiBpdHMgdHlwZSwgbmFtZSwgYW5kIGNvbnRhaW5lciBuYW1lLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250cm9sTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmb3JtIGNvbnRyb2wuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRhaW5lck5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY29udGFpbmVyIHRoYXQgdGhlIGZvcm0gY29udHJvbCBpcyBpbi5cclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIG5hbWUgb2YgdGhlIGZvcm0gY29udHJvbC5cclxuICAgKi9cclxuICBwdWJsaWMgZ2VuZXJhdGVGb3JtQ29udHJvbE5hbWUoY29udHJvbE5hbWU6IHN0cmluZywgY29udGFpbmVyTmFtZT86IHN0cmluZykge1xyXG4gICAgY29uc3QgbWFpblByZWZpeCA9IFt0aGlzLmRhdGEuVHlwZSwgdGhpcy5kYXRhLk5hbWUsIGNvbnRhaW5lck5hbWUgPz8gbnVsbF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJ18nKTtcclxuXHJcbiAgICAvLyBDaGVjayBpZiBuYW1lIGhhcyBiZWVuIHByZWZpeGVkLlxyXG4gICAgaWYgKGNvbnRyb2xOYW1lLmluY2x1ZGVzKG1haW5QcmVmaXgpKSB7XHJcbiAgICAgIHJldHVybiBjb250cm9sTmFtZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBXZSB0cnkgdG8gc3BsaXQgdGhlIG5hbWUgYW5kIHVzZSB0aGUgbGFzdCBzZWdtZW50LlxyXG4gICAgICAvLyBTb21ldGltZXMgdGhlIGNvbnRyb2wgbmFtZSBjYW4gYmUgd2l0aG91dCB0aGUgY29udGFpbmVyIG5hbWUsIHNvIHdlIHNwbGl0IGFuZCB1c2UgdGhlIG5ldyBtYWluIHByZWZpeC5cclxuICAgICAgY29uc3QgY29udHJvbE5hbWVTZWdtZW50ID0gY29udHJvbE5hbWUuc3BsaXQoJ18nKTtcclxuICAgICAgY29udHJvbE5hbWUgPSBjb250cm9sTmFtZVNlZ21lbnRbY29udHJvbE5hbWVTZWdtZW50Lmxlbmd0aCAtIDFdO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBbbWFpblByZWZpeCwgY29udHJvbE5hbWVdLmpvaW4oJ18nKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGVuZHMgYSBwcmVmaXggdG8gdGhlIG5hbWVzIGFuZCB2YWx1ZXMgb2YgZmllbGRzIHJlY3Vyc2l2ZWx5LlxyXG4gICAqIEBwYXJhbSB7WkZpZWxkW119IGZpZWxkcyAtIFRoZSBmaWVsZHMgdG8gYmUgcHJlZml4ZWQuXHJcbiAgICogQHBhcmFtIHthbnl9IHByZWZpeCAtIFRoZSBwcmVmaXggdG8gYmUgYWRkZWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhcHBlbmRQcmVmaXgoZmllbGRzOiBaRmllbGRbXSwgcHJlZml4OiBhbnkpIHtcclxuICAgIGZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQuVmFsdWUpKSB7XHJcbiAgICAgICAgdGhpcy5hcHBlbmRQcmVmaXgoZmllbGQuVmFsdWUsIHByZWZpeCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgZmllbGQuTmFtZSA9IFtwcmVmaXgsIGZpZWxkLk5hbWVdLmpvaW4oJ18nKTtcclxuICAgICAgICBpZiAoZmllbGQuVHlwZSAhPSAnemJ1dHRvbnMnKSB7XHJcbiAgICAgICAgICBmaWVsZC5WYWx1ZSA9IFtwcmVmaXgsIGZpZWxkLlZhbHVlXS5qb2luKCdfJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpZWxkLlN1YlR5cGUgPSBwcmVmaXg7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlcyB0aGUgZm9ybSBmaWVsZHMgd2l0aCB0aGUgZGlzcGxheSBlbGVtZW50IG1vZGVsLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgdXBkYXRlRm9ybUZpZWxkKCkge1xyXG4gICAgdGhpcy5kYXRhLlZhbHVlID0gdGhpcy5kaXNwbGF5RWxlbWVudE1vZGVsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSB2YWx1ZSBvZiBhIGNvbnRhaW5lciBtb2RlbCBpbiB0aGUgZm9ybS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGFpbmVyTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGZyb20uXHJcbiAgICogQHJldHVybnMge09iamVjdH0gLSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgY29udGFpbmVyIG1vZGVsIHZhbHVlcy5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0Q29udGFpbmVyTW9kZWxWYWx1ZShjb250YWluZXJOYW1lOiBzdHJpbmcpOiBPYmplY3Qge1xyXG4gICAgLy8gR2V0IHRoZSBjb250YWluZXIgZWxlbWVudCBhbmQgY3JlYXRlIGFuIGVtcHR5IG9iamVjdCBmb3IgdGhlIG1vZGVsIHZhbHVlcy5cclxuICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXVtjb250YWluZXJOYW1lXTtcclxuICAgIGNvbnN0IG1vZGVsVmFsdWUgPSB7fTtcclxuXHJcbiAgICAvLyBGbGFnIHRvIGtlZXAgdHJhY2sgaWYgYWxsIHJlcXVpcmVkIGZpZWxkcyBpbiB0aGUgZ3JvdXAgYXJlIHZhbGlkLlxyXG4gICAgbGV0IHZhbGlkR3JvdXBGaWVsZHMgPSB0cnVlO1xyXG5cclxuICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIGVsZW1lbnQgaW4gdGhlIGNvbnRhaW5lciBhbmQgcmV0cmlldmUgaXRzIHZhbHVlIGZyb20gdGhlIHpNb2RlbC5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGFpbmVyRWxlbWVudC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBlbGVtZW50ID0gY29udGFpbmVyRWxlbWVudFtpXTtcclxuICAgICAgY29uc3QgZWxlbWVudENvbXBvbmVudCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50QnlWYWx1ZSh0aGlzLmdyb3VwLCBlbGVtZW50KTtcclxuICAgICAgbGV0IHpNb2RlbFZhbHVlID0gdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0uek1vZGVsW2VsZW1lbnRdO1xyXG5cclxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgcmVxdWlyZWQgYW5kIGhhcyBhIHZhbHVlLCBpZiBub3Qgc2hvdyBhbiBlcnJvciBtZXNzYWdlLlxyXG4gICAgICBpZiAoZWxlbWVudENvbXBvbmVudC5jb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVxdWlyZWQgJiYgWkNvbXBvbmVudEhlbHBlci5pc051bGxVbmRlZmluZWRFbXB0eSh6TW9kZWxWYWx1ZSkpIHtcclxuICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KGVsZW1lbnRDb21wb25lbnQuZGF0YS5MYWJlbCArICcgaXMgcmVxdWlyZWQgZmllbGQuIFBsZWFzZSBmaWxsIGluIGFsbCB0aGUgcmVxdWlyZWQgZmllbGRzIGJlZm9yZSBhZGRpbmcuJywgJ3RvcCcsIHRydWUsIDMwMDAsICdkYW5nZXInKTtcclxuICAgICAgICB2YWxpZEdyb3VwRmllbGRzID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBDaGVjayBpZiBEcm9wZG93biBUeXBlLCBjaGFuZ2Ugek1vZGVsVmFsdWUgdG8gZGlzcGxheSB0ZXh0LlxyXG4gICAgICBpZiAodGhpcy5pc0Ryb3Bkb3duVHlwZShlbGVtZW50Q29tcG9uZW50LmRhdGEuVHlwZSkpIHtcclxuICAgICAgICBjb25zdCBkcm9wZG93bk9wdGlvbnMgPSBlbGVtZW50Q29tcG9uZW50LmdldEl0ZW1zRGF0YSgpO1xyXG4gICAgICAgIGRyb3Bkb3duT3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiB7XHJcbiAgICAgICAgICBpZiAob3B0aW9uW2VsZW1lbnRDb21wb25lbnQuaXRlbVZhbHVlRmllbGRdID09PSB6TW9kZWxWYWx1ZSkge1xyXG4gICAgICAgICAgICB6TW9kZWxWYWx1ZSA9IG9wdGlvbltlbGVtZW50Q29tcG9uZW50Lml0ZW1UZXh0RmllbGRdXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEFkZCB0aGUgdmFsdWUgdG8gdGhlIG1vZGVsIG9iamVjdC5QbGVhc2UgZmlsbCBpbiBhbGwgdGhlIHJlcXVpcmVkIGZpZWxkcyBiZWZvcmUgYWRkaW5nXHJcbiAgICAgIG1vZGVsVmFsdWVbZWxlbWVudF0gPSB6TW9kZWxWYWx1ZTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gSWYgdGhlcmUgYXJlIGludmFsaWQgZmllbGRzIGluIHRoZSBncm91cCwgcmV0dXJuIGFuIGVtcHR5IG1vZGVsIG9iamVjdC5cclxuICAgIGlmICghdmFsaWRHcm91cEZpZWxkcykge1xyXG4gICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmV0dXJuIHRoZSBtb2RlbCBvYmplY3Qgd2l0aCB0aGUgY29udGFpbmVyIHZhbHVlcy5cclxuICAgIHJldHVybiBtb2RlbFZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBDbGVhcnMgdGhlIHZhbHVlIG9mIGFsbCBmaWVsZCBlbGVtZW50cyBpbnNpZGUgYSBjb250YWluZXIuXHJcbiAgKiBAcGFyYW0ge3N0cmluZ30gY29udGFpbmVyTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgd2hvc2UgZmllbGRzIHdpbGwgYmUgY2xlYXJlZC5cclxuICAqL1xyXG4gIHB1YmxpYyBjbGVhckNvbnRhaW5lckZpZWxkRWxlbWVudFZhbHVlKGNvbnRhaW5lck5hbWU6IHN0cmluZykge1xyXG4gICAgLy8gR2V0IHRoZSBjb250YWluZXIgZWxlbWVudCBmcm9tIHRoZSBjb21wb25lbnQncyBncm91cFxyXG4gICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IHRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdW2NvbnRhaW5lck5hbWVdO1xyXG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGVhY2ggZmllbGQgZWxlbWVudCBpbiB0aGUgY29udGFpbmVyXHJcbiAgICBjb250YWluZXJFbGVtZW50LmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgIC8vIFNldCB0aGUgbW9kZWwgdmFsdWUgb2YgdGhlIGZpZWxkIGVsZW1lbnQgdG8gbnVsbCwgYW5kIGZvcmNlIHVwZGF0ZSB0aGUgdmlld1xyXG4gICAgICB0aGlzLnNldE1vZGVsVmFsdWUoZWxlbWVudCwgbnVsbCwgdHJ1ZSk7XHJcblxyXG4gICAgICBjb25zdCBmb3JtID0gdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0uZm9ybTtcclxuICAgICAgT2JqZWN0LmtleXMoZm9ybS5jb250cm9scykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgY29uc3QgY29udHJvbCA9IGZvcm0uY29udHJvbHNba2V5XTtcclxuICAgICAgICBjb250cm9sLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgICAgICAgY29udHJvbC5tYXJrQXNVbnRvdWNoZWQoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiAtLS0tLS0tLS0tPT09PT09PT09PT09PT09PT09PT0gTXVsdGkgVmFsdWUgR3JvdXAgPT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tKi9cclxuICAvKipcclxuICAgKiBTZXRzIHVwIGEgbXVsdGktdmFsdWUgZ3JvdXAsIHdoaWNoIGlzIGEgZ3JpZCBvZiBmaWVsZHMgdGhhdCBjYW4gaGF2ZSBtdWx0aXBsZSByb3dzLlxyXG4gICAqIEBwYXJhbSBkYXRhIC0gVGhlIGNvbmZpZ3VyYXRpb24gZGF0YSBmb3IgdGhlIG11bHRpLXZhbHVlIGdyb3VwLlxyXG4gICAqIEBwYXJhbSBkYXRhSW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGRhdGEgaW4gdGhlIGRpc3BsYXlNb2RlbC4gT3B0aW9uYWwsIHVzZWQgd2hlbiB1cGRhdGluZyBleGlzdGluZyBkYXRhLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRNdWx0aVZhbHVlR3JvdXAoZGF0YTogYW55LCBkYXRhSW5kZXg/OiBhbnkpIHtcclxuICAgIC8vIE5lZWQgdG8gZGVjbGFyZSBuYW1lLCB2YWx1ZSwgZGF0YXNvdXJjZSwgY29sdW1uZmllbGRzIGF0dHJpYnV0ZSBmb3IgZ3JpZC5cclxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdlbmVyYXRlRm9ybUNvbnRyb2xOYW1lKGRhdGEuTmFtZSk7XHJcbiAgICBjb25zdCBncmlkVmFsdWVOYW1lID0gYCR7bmFtZX0ke3RoaXMucHJlZml4VmFsdWVPcHRpb259YDtcclxuICAgIGNvbnN0IGdyaWREYXRhU291cmNlTmFtZSA9IGAke25hbWV9JHt0aGlzLnByZWZpeERhdGFTb3VyY2VOYW1lfWA7XHJcbiAgICBjb25zdCBncmlkQ29sdW1uRmllbGRzTmFtZSA9IGAke25hbWV9JHt0aGlzLnByZWZpeENvbHVtbkZpZWxkc05hbWV9YDtcclxuXHJcbiAgICAvLyBHZW5lcmF0ZSBhIHVuaXF1ZSBuYW1lIGZvciB0aGUgbXVsdGktdmFsdWUgZ3JvdXAgc2NvcGUuXHJcbiAgICBjb25zdCBtdWx0aVZhbHVlR3JvdXBTY29wZU5hbWUgPSBgbXZnXyR7ZGF0YS5OYW1lfWA7XHJcblxyXG4gICAgaWYgKCF0aGlzLmdyb3VwWydtdmdsaXN0J10pIHtcclxuICAgICAgdGhpcy5ncm91cFsnbXZnbGlzdCddID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmdyb3VwWydtdmdsaXN0J10uaW5jbHVkZXMobmFtZSkpIHtcclxuICAgICAgdGhpcy5ncm91cFsnbXZnbGlzdCddLnB1c2gobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ3JlYXRlIGEgcHJvcGVydHkgaW4gdGhlIGdyb3VwIG9iamVjdCBmb3IgdGhlIG11bHRpLXZhbHVlIGdyb3VwLlxyXG4gICAgdGhpcy5ncm91cFttdWx0aVZhbHVlR3JvdXBTY29wZU5hbWVdID0gW107XHJcblxyXG4gICAgLy8gU3RvcmUgdGhlIGdyaWQgdmFsdWUgbmFtZSB0byBiZSB1c2VkIGluIGdldFpNb2RlbCB0byBnZXQgdGhlIGdyaWQgZGF0YS5cclxuICAgIHRoaXMubXVsdGlWYWx1ZUdyb3VwR3JpZFZhbHVlID0gdGhpcy5tdWx0aVZhbHVlR3JvdXBHcmlkVmFsdWUgPz8gW107XHJcbiAgICB0aGlzLm11bHRpVmFsdWVHcm91cEdyaWRWYWx1ZS5wdXNoKGdyaWRWYWx1ZU5hbWUpO1xyXG5cclxuICAgIC8vIE1hbnVhbGx5IGFkZCBhdHRyaWJ1dGVzIHRvIHRoZSBncmlkIGVsZW1lbnQgdG8gc3BlZWQgdXAgbG9hZGluZy5cclxuICAgIGNvbnN0IGVsZW1lbnQgPSB7XHJcbiAgICAgIFwiQWRkQ29tbWFuZEJ1dHRvbk5hbWVcIjogXCJBZGRcIixcclxuICAgICAgXCJBbGxvd0V4cG9ydFwiOiBmYWxzZSxcclxuICAgICAgXCJBbGxvd0dyaWREYXRhRXhwb3J0XCI6IGZhbHNlLFxyXG4gICAgICBcIkFsbG93TXVsdGlTZWxlY3RcIjogZmFsc2UsXHJcbiAgICAgIFwiQWxsb3dSb3dTZWxlY3RcIjogZmFsc2UsXHJcbiAgICAgIFwiQWxsb3dTYXZlU3RhdGVcIjogZmFsc2UsXHJcbiAgICAgIFwiQ29sdW1uRmllbGRzXCI6ICdncm91cC4nICsgZ3JpZENvbHVtbkZpZWxkc05hbWUsXHJcbiAgICAgIFwiRGF0YVNvdXJjZVwiOiAnZ3JvdXAuJyArIGdyaWREYXRhU291cmNlTmFtZSxcclxuICAgICAgXCJEaXNhYmxlQ2VsbENsaWNrSGFuZGxlclwiOiB0cnVlLFxyXG4gICAgICBcIkRpc2FibGVHZW5lcmF0ZUNvbHVtbkJ5Rm9ybVwiOiB0cnVlLFxyXG4gICAgICBcIkRpdkNsYXNzXCI6ICdjb2wteHMtMTIgY29sLXNtLTEyIGNvbC1tZC0xMiBjb2wtbGctMTInLFxyXG4gICAgICBcIkVuYWJsZUN1c3RvbUFkZENvbW1hbmRcIjogdHJ1ZSxcclxuICAgICAgXCJFbmFibGVDdXN0b21SZW1vdmVDb21tYW5kXCI6IHRydWUsXHJcbiAgICAgIFwiRW5hYmxlQ3VzdG9tUmVzZXRDb21tYW5kXCI6IHRydWUsXHJcbiAgICAgIFwiRW5hYmxlU2F2ZUdyaWRTdGF0ZVwiOiBmYWxzZSxcclxuICAgICAgXCJFeHRlcm5hbFBhZ2luYXRpb25cIjogZmFsc2UsXHJcbiAgICAgIFwiSGVpZ2h0UmVkdWNlXCI6IDI1MCxcclxuICAgICAgXCJMaW1pdEZpZWxkc1wiOiBmYWxzZSxcclxuICAgICAgXCJOYW1lXCI6IG5hbWUsXHJcbiAgICAgIFwiUGFnZVNpemVcIjogMjAsXHJcbiAgICAgIFwiUGFnZVNpemVzXCI6IGZhbHNlLFxyXG4gICAgICBcIlJlc291cmNlVVJMXCI6IHRydWUsXHJcbiAgICAgIFwiU2VsZWN0T3B0aW9uc1wiOiBmYWxzZSxcclxuICAgICAgXCJTaG93R3JpZEVkaXRCdXR0b25cIjogZmFsc2UsXHJcbiAgICAgIFwiU3ViVHlwZVwiOiBcInp1ZGZcIixcclxuICAgICAgXCJUeXBlXCI6IFwiemdyaWRcIixcclxuICAgICAgXCJWYWx1ZVwiOiAnZ3JvdXAuJyArIGdyaWRWYWx1ZU5hbWUsXHJcbiAgICAgIFwiVmlzaWJsZVwiOiB0cnVlLFxyXG4gICAgICBcIldpZHRoUmVkdWNlXCI6IDUwMCxcclxuICAgICAgXCJEaXNhYmxlQXV0b0FwcGVuZEdyaWREYXRlRmlsdGVyQ29sXCI6IHRydWVcclxuICAgIH1cclxuXHJcbiAgICAvLyBDcmVhdGUgYSBwcm9wZXJ0eSBpbiB0aGUgZ3JvdXAgb2JqZWN0IGJhc2VkIG9uIHRoZSBhYm92ZSBkZWNsYXJhdGlvbiwgZXhjZXB0IE5hbWUsIGFuZCBhbHNvIGluc2VydCBjb2x1bW4gZmllbGRzLlxyXG4gICAgLy8gVXNlIHRoZSBncm91cGluZyB2YWx1ZSBhcyB0aGUgY29sdW1uIGFuZCBza2lwIGluc2VydGluZyBhbnkgY29udGFpbmVyIHR5cGUuXHJcbiAgICBjb25zdCBjb250YWluZXJOYW1lID0gZGF0YS5OYW1lO1xyXG4gICAgY29uc3QgZ3JvdXBGaWVsZEVsZW1lbnRzID0gW107XHJcblxyXG4gICAgZGF0YS5WYWx1ZS5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgY29uc3QgZmllbGRNb2RlbCA9IE9iamVjdC5hc3NpZ24oe30sIGZpZWxkKTtcclxuICAgICAgZmllbGRNb2RlbFsnRGlzcGxheU5hbWUnXSA9IGZpZWxkTW9kZWwuTGFiZWw7XHJcbiAgICAgIGZpZWxkTW9kZWwuTmFtZSA9IHRoaXMuZ2VuZXJhdGVGb3JtQ29udHJvbE5hbWUoZmllbGRNb2RlbFsnTmFtZSddLCBjb250YWluZXJOYW1lKTtcclxuICAgICAgZmllbGRNb2RlbC5WYWx1ZSA9IHRoaXMuZ2VuZXJhdGVGb3JtQ29udHJvbE5hbWUoZmllbGRNb2RlbFsnVmFsdWUnXSwgY29udGFpbmVyTmFtZSk7XHJcblxyXG4gICAgICBncm91cEZpZWxkRWxlbWVudHMucHVzaChmaWVsZE1vZGVsKTtcclxuXHJcbiAgICAgIC8vIFRoaXMgaXMgZm9yIHRhbGx5IGFuZCByZW1vdmUgem1vZGVsIHdoZW4gZ2V0bW9kZWwoKS5cclxuICAgICAgLy8gV2UncmUgbm90IHN1cHBvc2VkIHRvIHNhdmUgem1vZGVsIGZpZWxkIHZhbHVlIHNpbmNlIGl0cyB2YWx1ZSBpcyBzdXBwb3NlZCB0byBiZSBhZGRlZCB0byB0aGUgZ3JpZC5cclxuICAgICAgdGhpcy5ncm91cFttdWx0aVZhbHVlR3JvdXBTY29wZU5hbWVdLnB1c2goZmllbGRNb2RlbC5WYWx1ZSk7XHJcblxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmdyb3VwW2dyaWREYXRhU291cmNlTmFtZV0gPSBbXTtcclxuICAgIHRoaXMuZ3JvdXBbZ3JpZENvbHVtbkZpZWxkc05hbWVdID0gZ3JvdXBGaWVsZEVsZW1lbnRzO1xyXG5cclxuICAgIC8vIENyZWF0ZSBncmlkIGNvbHVtbiBiYXNlZCBvbiBmaWVsZCBlbGVtZW50cyBhbmQgaW5zZXJ0IHRoZW0gaW50byB0aGUgZ3JpZC4gXHJcbiAgICB0aGlzLmdyb3VwW2Ake25hbWV9JHt0aGlzLnByZWZpeEN1c3RvbUFkZEJ1dHRvbk9uQ2xpY2t9YF0gPSB0aGlzLmNhcHR1cmVDb250YWluZXJGaWVsZFZhbHVlVG9Nb2RlbC5iaW5kKHRoaXMsIHRoaXMuZ3JvdXAsIGdyaWRWYWx1ZU5hbWUsIGdyaWREYXRhU291cmNlTmFtZSwgY29udGFpbmVyTmFtZSk7XHJcbiAgICB0aGlzLmdyb3VwW2Ake25hbWV9JHt0aGlzLnByZWZpeEN1c3RvbVJlc2V0QnV0dG9uT25DbGlja31gXSA9IHRoaXMuY2xlYXJDb250YWluZXJSZWxhdGVkRmllbGRWYWx1ZS5iaW5kKHRoaXMsIHRoaXMuZ3JvdXAsIGNvbnRhaW5lck5hbWUpO1xyXG4gICAgdGhpcy5ncm91cFtgJHtuYW1lfSR7dGhpcy5wcmVmaXhDdXN0b21SZW1vdmVCdXR0b25PbkNsaWNrfWBdID0gdGhpcy5yZW1vdmVHcmlkUm93LmJpbmQodGhpcywgZ3JpZFZhbHVlTmFtZSwgZ3JpZERhdGFTb3VyY2VOYW1lKTtcclxuXHJcbiAgICBpZiAoZGF0YUluZGV4KSB7XHJcbiAgICAgIHRoaXMuYXBwZW5kVG9EaXNwbGF5TW9kZWwoZWxlbWVudCwgZGF0YUluZGV4KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBkYXRhLlZhbHVlLnB1c2goZWxlbWVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhcHR1cmVDb250YWluZXJGaWVsZFZhbHVlVG9Nb2RlbChncm91cDogWkdyb3VwLCBncmlkVmFsdWU6IGFueSwgZ3JpZERhdGFTb3VyY2U6IGFueSwgY29udGFpbmVyTmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBjb250YWluZXJGaWVsZFZhbHVlID0gdGhpcy5nZXRDb250YWluZXJNb2RlbFZhbHVlKGNvbnRhaW5lck5hbWUpO1xyXG4gICAgbGV0IGFsbG93VG9TZXREYXRhID0gZmFsc2U7XHJcblxyXG4gICAgZm9yIChsZXQga2V5IGluIGNvbnRhaW5lckZpZWxkVmFsdWUpIHtcclxuICAgICAgaWYgKCFaQ29tcG9uZW50SGVscGVyLmlzTnVsbFVuZGVmaW5lZEVtcHR5KGNvbnRhaW5lckZpZWxkVmFsdWVba2V5XSkpIHtcclxuICAgICAgICBhbGxvd1RvU2V0RGF0YSA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7IC8vIGV4aXQgdGhlIGxvb3AgZWFybHkgc2luY2UgdGhlIGZsYWcgaXMgYWxyZWFkeSB0cnVlXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoYWxsb3dUb1NldERhdGEgJiYgKE9iamVjdC5rZXlzKGNvbnRhaW5lckZpZWxkVmFsdWUpLmxlbmd0aCAhPT0gMCB8fCBjb250YWluZXJGaWVsZFZhbHVlLmNvbnN0cnVjdG9yICE9PSBPYmplY3QpKSB7XHJcbiAgICAgIC8vIGdldCBjb250YWluZXIgbW9kZWwgdmFsdWUsIHNldCB0byBncm91cCBncmlkIGRhdGFzb3VyY2VcclxuICAgICAgZ3JvdXBbZ3JpZERhdGFTb3VyY2VdLnB1c2goY29udGFpbmVyRmllbGRWYWx1ZSk7XHJcblxyXG4gICAgICAvLyBzZXQgZGF0YXNvdXJjZSB0byBncmlkXHJcbiAgICAgIGdyb3VwW2dyaWRWYWx1ZV0uc2V0RGF0YSh0aGlzLmdyb3VwW2dyaWREYXRhU291cmNlXSk7XHJcblxyXG4gICAgICAvLyBjbGVhciBjb250YWluZXIgZmllbGQgdmFsdWVcclxuICAgICAgdGhpcy5jbGVhckNvbnRhaW5lclJlbGF0ZWRGaWVsZFZhbHVlKGdyb3VwLCBjb250YWluZXJOYW1lKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KCdUbyBhZGQgdGhlIHJlY29yZCwgcGxlYXNlIGVudGVyL3NlbGVjdCBhdCBsZWFzdCBvbmUgZmllbGQgaW4gdGhpcyBzZWN0aW9uLicsICd0b3AnLCB0cnVlLCAzMDAwLCAnd2FybmluZycpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGVhckNvbnRhaW5lclJlbGF0ZWRGaWVsZFZhbHVlKGdyb3VwOiBaR3JvdXAsIGNvbnRhaW5lck5hbWU6IHN0cmluZykge1xyXG4gICAgLy8gYWZ0ZXIgc2V0IHRvIGdyaWQsIGNsZWFyIHRoZSB6bW9kZWwuXHJcbiAgICB0aGlzLmNsZWFyQ29udGFpbmVyRmllbGRFbGVtZW50VmFsdWUoY29udGFpbmVyTmFtZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbW92ZUdyaWRSb3coZ3JpZFZhbHVlOiBhbnksIGdyaWREYXRhU291cmNlOiBhbnksIGRhdGFJdGVtOiBhbnksIGluZGV4OiBhbnkpIHtcclxuICAgIHRoaXMuZ3JvdXBbZ3JpZERhdGFTb3VyY2VdLnNwbGljZShpbmRleCwgMSk7XHJcblxyXG4gICAgLy8gc2V0IGRhdGFzb3VyY2UgdG8gZ3JpZFxyXG4gICAgdGhpcy5ncm91cFtncmlkVmFsdWVdLnNldERhdGEodGhpcy5ncm91cFtncmlkRGF0YVNvdXJjZV0pO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgcHJpdmF0ZSBpc0Ryb3Bkb3duVHlwZShkYXRhOiBhbnkpIHtcclxuICAgIGNvbnN0IGNvbXBvbmVudERhdGFUeXBlID0gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnID8gZGF0YSA6IGRhdGEuVHlwZS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgIGlmIChjb21wb25lbnREYXRhVHlwZSA9PSBDb21wb25lbnRUeXBlLmRyb3Bkb3duIHx8IGNvbXBvbmVudERhdGFUeXBlID09IENvbXBvbmVudFR5cGUuenVpc2VsZWN0bXVsdGlwbGUgfHwgY29tcG9uZW50RGF0YVR5cGUgPT0gQ29tcG9uZW50VHlwZS56c2VsZWN0bXVsdGlwbGUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmFsaWRhdGVzIHRoZSBmb3JtIGFuZCBzaG93cyBhbiBlcnJvciBtZXNzYWdlIGlmIGl0IGlzIGludmFsaWQuXHJcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBmb3JtIGlzIHZhbGlkLCBvdGhlcndpc2UgZmFsc2UuXHJcbiAgICovXHJcbiAgcHVibGljIHZhbGlkYXRlQW5kU2hvd0Vycm9yTWVzc2FnZSgpIHtcclxuICAgIGNvbnN0IGZnID0gdGhpcy5mb3JtIGFzIEZvcm1Hcm91cDtcclxuXHJcbiAgICAvLyBJZiB0aGUgZm9ybSBpcyBpbnZhbGlkLCBjbGVhciBhbnkgZXJyb3JzIGluIGNvbnRhaW5lciBmaWVsZHMgYW5kIHNob3cgdGhlIGVycm9yIG1lc3NhZ2UuXHJcbiAgICBpZiAoIWZnLnZhbGlkKSB7XHJcbiAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIGZvcm0gY29udHJvbHMgYW5kIHJlc2V0IGFueSBlcnJvcnMgdGhhdCBiZWxvbmcgdG8gYSBjb250YWluZXIgZmllbGRcclxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZmcuY29udHJvbHMpKSB7XHJcbiAgICAgICAgdGhpcy5zZXRDb250YWluZXJGaWVsZEVycm9yQXNOdWxsKGZnLCBrZXkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBDaGVjayBpcyB0aGUgZm9ybWdyb3VwIHZhbHVlIGFnYWluLlxyXG4gICAgICBpZiAoZmcudmFsaWQpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gU2hvdyB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhlIGZvcm1cclxuICAgICAgdGhpcy5jb21wb25lbnRFcnJvckhhbmRsZXJTZXJ2aWNlLnNob3dGb3JtR3JvdXBFcnJvck1lc3NhZ2UodGhpcy5ncm91cCwgZmcpO1xyXG5cclxuICAgICAgLy8gUmV0dXJuIGZhbHNlIHRvIGluZGljYXRlIHRoYXQgdGhlIGZvcm0gaXMgbm90IHZhbGlkXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXR1cm4gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBmb3JtIGlzIHZhbGlkXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0cyB0aGUgZXJyb3JzIG9mIGEgY29udGFpbmVyIGZpZWxkIGluIGEgRm9ybUdyb3VwLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGZnIFRoZSBGb3JtR3JvdXAgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGZpZWxkLlxyXG4gICAqIEBwYXJhbSBrZXkgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIGluIHRoZSBGb3JtR3JvdXAuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRDb250YWluZXJGaWVsZEVycm9yQXNOdWxsKGZnOiBGb3JtR3JvdXAsIGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb250cm9sTmFtZVNlZ21lbnRzID0ga2V5LnNwbGl0KCdfJyk7XHJcblxyXG4gICAgaWYgKGNvbnRyb2xOYW1lU2VnbWVudHMubGVuZ3RoIDw9IDMpIHtcclxuICAgICAgLy8gRmllbGQgaXMgbm90IGluc2lkZSBhIGNvbnRhaW5lciwgc28gd2Ugc2tpcCBpdFxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbm8gbXZnbGlzdCwgZGlyZWN0IHJldHVybi4gZG9udCBuZWVkIGRvIGFueXRoaW5nLlxyXG4gICAgaWYgKCF0aGlzLmdyb3VwWydtdmdsaXN0J10pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIGNvbnRhaW5lciBidXQgbm90IG11bHRpIHZhbHVlIGdyb3VwID0gdHJ1ZSwgd2Ugc2tpcCBpdC5cclxuICAgIGNvbnN0IGNvbnRhaW5lciA9IFtjb250cm9sTmFtZVNlZ21lbnRzWzBdLCBjb250cm9sTmFtZVNlZ21lbnRzWzFdLCBjb250cm9sTmFtZVNlZ21lbnRzWzJdXS5qb2luKCdfJyk7XHJcbiAgICBpZiAoIXRoaXMuZ3JvdXBbJ212Z2xpc3QnXS5pbmNsdWRlcyhjb250YWluZXIpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb250cm9sID0gZmcuZ2V0KGtleSk7XHJcblxyXG4gICAgaWYgKCFjb250cm9sKSB7XHJcbiAgICAgIC8vIElmIHRoZSBjb250cm9sIGlzIG5vdCBpbnNpZGUgYSBjb250YWluZXIsIHNraXAgaXQuXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyByZXR1cm4gaWYgZm9ybWNvbnRyb2wgaXMgdmFsaWQuXHJcbiAgICBpZiAoY29udHJvbC5zdGF0dXMgPT09ICdWQUxJRCcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbnRyb2xFcnJvcnMgPSBjb250cm9sLmVycm9ycztcclxuXHJcbiAgICBpZiAoY29udHJvbEVycm9ycykge1xyXG4gICAgICAvLyBTZXQgdGhlIGNvbnRyb2wncyBlcnJvcnMgdG8gbnVsbC5cclxuICAgICAgY29udHJvbC5zZXRFcnJvcnMobnVsbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWYWxpZGF0ZXMgYSBmb3JtIGFuZCByZXR1cm5zIGl0cyBaTW9kZWwgaWYgaXQgaXMgdmFsaWQuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyBUaGUgZm9ybSdzIFpNb2RlbCBpZiBpdCBpcyB2YWxpZCwgb3IgdW5kZWZpbmVkIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0VmFsaWRhdGVkRm9ybVpNb2RlbCgpIHtcclxuICAgIGNvbnN0IGlzVmFsaWRGb3JtID0gdGhpcy52YWxpZGF0ZUFuZFNob3dFcnJvck1lc3NhZ2UoKTtcclxuXHJcbiAgICBpZiAoaXNWYWxpZEZvcm0pIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0Wk1vZGVsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHpNb2RlbCBvYmplY3QsIHdpdGggbXZnIChtdWx0aSB2YWx1ZSBncm91cCkgZmllbGRzIHJlbW92ZWQgYW5kIHByb3BlcnR5IHByZWZpeGVzIHJlbW92ZWQuXHJcbiAgICogQHBhcmFtIHNraXBSZW1vdmVQcmVmaXggV2hldGhlciB0byBza2lwIHJlbW92aW5nIHRoZSBkZWZhdWx0IHByb3BlcnR5IHByZWZpeC5cclxuICAgKiBAcGFyYW0gc2tpcFJlbW92ZU12Z0ZpZWxkVmFsdWUgV2hldGhlciB0byBza2lwIHJlbW92aW5nIHRoZSB2YWx1ZXMgb2YgbXZnIGZpZWxkcyBmcm9tIHRoZSB6TW9kZWwgb2JqZWN0LlxyXG4gICAqIEByZXR1cm5zIFRoZSBtb2RpZmllZCB6TW9kZWwgb2JqZWN0LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRaTW9kZWwoc2tpcFJlbW92ZVByZWZpeD86IGJvb2xlYW4sIHNraXBSZW1vdmVNdmdGaWVsZFZhbHVlPzogYm9vbGVhbikge1xyXG4gICAgY29uc3Qgek1vZGVsID0gdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0uek1vZGVsO1xyXG5cclxuICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgcHJvcGVydGllcyBpbiB0aGUgek1vZGVsIG9iamVjdC5cclxuICAgIGZvciAoY29uc3Qgek1vZGVsUHJvcGVydHkgaW4gek1vZGVsKSB7XHJcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoek1vZGVsLCB6TW9kZWxQcm9wZXJ0eSkpIHtcclxuICAgICAgICBjb25zdCB6TW9kZWxQcm9wZXJ0eVNlZ21lbnRzID0gek1vZGVsUHJvcGVydHkuc3BsaXQoJ18nKTtcclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3BlcnR5IGlzIHBhcnQgb2YgYSBtdWx0aSB2YWx1ZSBncm91cC5cclxuICAgICAgICBpZiAoek1vZGVsUHJvcGVydHlTZWdtZW50cy5sZW5ndGggPiAzKSB7XHJcbiAgICAgICAgICAvLyBUaGUgdGhpcmQgc2VnbWVudCBvZiB0aGUgcHJvcGVydHkgbmFtZSBpcyB0aGUgY29udGFpbmVyIG5hbWUuXHJcbiAgICAgICAgICBjb25zdCBjb250YWluZXJOYW1lID0gek1vZGVsUHJvcGVydHlTZWdtZW50c1syXTtcclxuICAgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgbmFtZSBvZiB0aGUgbXVsdGkgdmFsdWUgZ3JvdXAuXHJcbiAgICAgICAgICBjb25zdCBtdWx0aVZhbHVlR3JvdXBTY29wZU5hbWUgPSBgbXZnXyR7Y29udGFpbmVyTmFtZX1gO1xyXG5cclxuICAgICAgICAgIC8vIElmIHRoZSBtdWx0aSB2YWx1ZSBncm91cCBleGlzdHMgYW5kIGNvbnRhaW5zIHRoZSBwcm9wZXJ0eSwgcmVtb3ZlIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgZnJvbSB0aGUgek1vZGVsIG9iamVjdC5cclxuICAgICAgICAgIGlmICh0aGlzLmdyb3VwW211bHRpVmFsdWVHcm91cFNjb3BlTmFtZV0pIHtcclxuICAgICAgICAgICAgY29uc3QgbXZnRmllbGQgPSB0aGlzLmdyb3VwW211bHRpVmFsdWVHcm91cFNjb3BlTmFtZV0uZmluZCgocmVjb3JkKSA9PiByZWNvcmQgPT09IHpNb2RlbFByb3BlcnR5KTtcclxuICAgICAgICAgICAgaWYgKG12Z0ZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgek1vZGVsW3pNb2RlbFByb3BlcnR5XSA9IHNraXBSZW1vdmVNdmdGaWVsZFZhbHVlID8gek1vZGVsW3pNb2RlbFByb3BlcnR5XSA6IG51bGw7XHJcbiAgICAgICAgICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoek1vZGVsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGltcG9ydGFudDogUmVtb3ZlIHByb3BlcnR5IHByZWZpeGVzIGZyb20gdGhlIHpNb2RlbCBvYmplY3QgaWYgc2tpcFJlbW92ZVByZWZpeCBpcyBub3QgdHJ1ZSAoYnkgZGVmYXVsdCByZW1vdmUgcHJlZml4KVxyXG4gICAgY29uc3QgcGF0Y2hlZE1vZGVsRGF0YSA9IHNraXBSZW1vdmVQcmVmaXggPyB6TW9kZWwgOiB0aGlzLnJlbW92ZVpNb2RlbFByb3BlcnR5UHJlZml4KHpNb2RlbCk7XHJcblxyXG4gICAgLy8gSWYgdGhlcmUgYXJlIG11bHRpIHZhbHVlIGdyb3VwIGdyaWQgdmFsdWVzLCBleHRyYWN0IHRoZSBncmlkIGRhdGEgYW5kIGFkZCBpdCB0byB0aGUgY29ycmVzcG9uZGluZyBjb250YWluZXIgaW4gdGhlIG1vZGlmaWVkIHpNb2RlbCBvYmplY3QuXHJcbiAgICBpZiAodGhpcy5tdWx0aVZhbHVlR3JvdXBHcmlkVmFsdWUpIHtcclxuICAgICAgdGhpcy5tdWx0aVZhbHVlR3JvdXBHcmlkVmFsdWUuZm9yRWFjaCgobXVsdGlWYWx1ZUdyb3VwR3JpZE5hbWUpID0+IHtcclxuICAgICAgICAvLyBFeHRyYWN0IHRoZSBjb250YWluZXIgbmFtZSBmcm9tIHRoZSBncmlkIG5hbWUuXHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyTmFtZSA9IHNraXBSZW1vdmVQcmVmaXggPyBtdWx0aVZhbHVlR3JvdXBHcmlkTmFtZS5zcGxpdCgnXycpLmpvaW4oJ18nKSA6IG11bHRpVmFsdWVHcm91cEdyaWROYW1lLnNwbGl0KCdfJylbMl07XHJcblxyXG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIGdyaWQgZGF0YSBhbmQgcmVtb3ZlIHByb3BlcnR5IHByZWZpeGVzIGlmIHNraXBSZW1vdmVQcmVmaXggaXMgbm90IHRydWUuXHJcbiAgICAgICAgY29uc3QgbXVsdGlWYWx1ZUdyb3VwR3JpZCA9IHRoaXMuZ3JvdXBbbXVsdGlWYWx1ZUdyb3VwR3JpZE5hbWVdIGFzIFpHcmlkO1xyXG4gICAgICAgIGNvbnN0IGdyaWREYXRhID0gbXVsdGlWYWx1ZUdyb3VwR3JpZC5nZXRHcmlkRGF0YSgpLm1hcCgoZGF0YSkgPT4gc2tpcFJlbW92ZVByZWZpeCA/IGRhdGEgOiB0aGlzLnJlbW92ZVpNb2RlbFByb3BlcnR5UHJlZml4KGRhdGEsIHRydWUpKTtcclxuXHJcbiAgICAgICAgLy8gQWRkIHRoZSBncmlkIGRhdGEgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY29udGFpbmVyIGluIHRoZSBtb2RpZmllZCB6TW9kZWwgb2JqZWN0LlxyXG4gICAgICAgIGlmIChncmlkRGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBwYXRjaGVkTW9kZWxEYXRhW2NvbnRhaW5lck5hbWVdID0gZ3JpZERhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcGF0Y2hlZE1vZGVsRGF0YTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgdmFsdWUgb2YgYSBtb2RlbCBpbiB0aGUgZm9ybSBncm91cC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZGVsIHRvIHNldC5cclxuICAgKiBAcGFyYW0geyp9IG1vZGVsVmFsdWUgVGhlIHZhbHVlIHRvIHNldCBmb3IgdGhlIG1vZGVsLlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NraXBQcmVmaXhdIE9wdGlvbmFsIHBhcmFtZXRlciBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gc2tpcCB0aGUgY29tcG9uZW50IHByZWZpeC5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwdWJsaWMgc2V0TW9kZWxWYWx1ZShtb2RlbE5hbWU6IHN0cmluZywgbW9kZWxWYWx1ZTogYW55LCBza2lwUHJlZml4PzogYm9vbGVhbikge1xyXG4gICAgLy8gR2V0IHRoZSB6TW9kZWwgb2JqZWN0IGZyb20gdGhlIGZvcm0gZ3JvdXBcclxuICAgIGNvbnN0IHpNb2RlbHMgPSB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXS56TW9kZWw7XHJcbiAgICAvLyBJZiBza2lwUHJlZml4IGlzIGZhbHNlIG9yIHVuZGVmaW5lZCwgcHJlcGVuZCB0aGUgY29tcG9uZW50IHByZWZpeCB0byB0aGUgbW9kZWwgbmFtZVxyXG4gICAgY29uc3Qgek1vZGVsTmFtZSA9IHNraXBQcmVmaXggPyBtb2RlbE5hbWUgOiB0aGlzLmNvbXBvbmVudFByZWZpeCArICdfJyArIG1vZGVsTmFtZTtcclxuICAgIC8vIFNldCB0aGUgdmFsdWUgb2YgdGhlIG1vZGVsIGluIHRoZSB6TW9kZWwgb2JqZWN0XHJcbiAgICB6TW9kZWxzW3pNb2RlbE5hbWVdID0gbW9kZWxWYWx1ZTtcclxuXHJcbiAgICAvLyBHZXQgdGhlIGZvcm0gZ3JvdXAgYXMgYSBGb3JtR3JvdXAgb2JqZWN0XHJcbiAgICBsZXQgZmc6IEZvcm1Hcm91cCA9IHRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG5cclxuICAgIC8vIFBhdGNoIHRoZSBmb3JtIGdyb3VwIHdpdGggdGhlIHVwZGF0ZWQgek1vZGVsIG9iamVjdFxyXG4gICAgZmcucGF0Y2hWYWx1ZSh6TW9kZWxzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogUmVtb3ZlIHRoZSBjb21wb25lbnQgcHJlZml4IGZyb20gcHJvcGVydHkgbmFtZXMgaW4gdGhlIHpNb2RlbCBvYmplY3QuXHJcbiAgKlxyXG4gICogQHBhcmFtIHsqfSB6TW9kZWwgVGhlIHpNb2RlbCBvYmplY3QuXHJcbiAgKiBAcGFyYW0ge2Jvb2xlYW59IFtnZXRPbmx5RmllbGROYW1lXSBPcHRpb25hbCBwYXJhbWV0ZXIgaW5kaWNhdGluZyB3aGV0aGVyIHRvIG9ubHkgcmV0dXJuIHRoZSBmaWVsZCBuYW1lIHdpdGhvdXQgdGhlIHByZWZpeC5cclxuICAqIEByZXR1cm5zIHsqfSBUaGUgdXBkYXRlZCB6TW9kZWwgb2JqZWN0LlxyXG4gICovXHJcbiAgcHJpdmF0ZSByZW1vdmVaTW9kZWxQcm9wZXJ0eVByZWZpeCh6TW9kZWw6IGFueSwgZ2V0T25seUZpZWxkTmFtZT86IGJvb2xlYW4pIHtcclxuICAgIC8vIENyZWF0ZSBhbiBlbXB0eSBvYmplY3QgdG8gc3RvcmUgdGhlIHVwZGF0ZWQgek1vZGVsIGRhdGFcclxuICAgIGNvbnN0IHBhdGNoZWRNb2RlbERhdGEgPSB7fTtcclxuXHJcbiAgICAvLyBMb29wIHRocm91Z2ggZWFjaCBwcm9wZXJ0eSBpbiB0aGUgek1vZGVsIG9iamVjdFxyXG4gICAgZm9yIChsZXQgcHJvcCBpbiB6TW9kZWwpIHtcclxuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh6TW9kZWwsIHByb3ApKSB7XHJcbiAgICAgICAgLy8gU3BsaXQgdGhlIHByb3BlcnR5IG5hbWUgYnkgdW5kZXJzY29yZXNcclxuICAgICAgICBjb25zdCBwcm9wU2VnbWVudCA9IHByb3Auc3BsaXQoJ18nKTtcclxuICAgICAgICAvLyBHZXQgdGhlIHByb3BlcnR5IG5hbWUgd2l0aG91dCB0aGUgY29tcG9uZW50IHByZWZpeFxyXG4gICAgICAgIGNvbnN0IHByb3BlcnR5TmFtZSA9IGdldE9ubHlGaWVsZE5hbWUgPyBwcm9wU2VnbWVudFtwcm9wU2VnbWVudC5sZW5ndGggLSAxXSA6IHByb3AucmVwbGFjZSh0aGlzLmNvbXBvbmVudFByZWZpeCArICdfJywgJycpO1xyXG5cclxuICAgICAgICAvLyBBZGQgdGhlIHByb3BlcnR5IHRvIHRoZSB1cGRhdGVkIHpNb2RlbCBvYmplY3RcclxuICAgICAgICBwYXRjaGVkTW9kZWxEYXRhW3Byb3BlcnR5TmFtZV0gPSB6TW9kZWxbcHJvcF07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXR1cm4gdGhlIHVwZGF0ZWQgek1vZGVsIG9iamVjdFxyXG4gICAgcmV0dXJuIHBhdGNoZWRNb2RlbERhdGE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhcnMgdGhlIHpNb2RlbCBwcm9wZXJ0eSBvZiB0aGUgZ3JvdXAgaW4gdGhlIGNvbXBvbmVudCBzY29wZSBhbmQgcmVzZXRzIHRoZSBtdWx0aVZhbHVlR3JvdXBHcmlkVmFsdWUgYXJyYXkuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwdWJsaWMgY2xlYXJaTW9kZWwoKSB7XHJcbiAgICB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXS56TW9kZWwgPSB7fTtcclxuICAgIHRoaXMubXVsdGlWYWx1ZUdyb3VwR3JpZFZhbHVlID0gW107XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0TXVsdGlWYWx1ZUdyb3VwQnV0dG9uc0VuYWJsZWQoY29udGFpbmVyTmFtZTogc3RyaW5nLCBpc0VuYWJsZWQ6IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50KHRoaXMuZ3JvdXAsIGB6Z3JpZF8ke3RoaXMuY29tcG9uZW50UHJlZml4fV8ke2NvbnRhaW5lck5hbWV9YCk7XHJcbiAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBbJ0VuYWJsZUN1c3RvbUFkZENvbW1hbmQnLCAnRW5hYmxlQ3VzdG9tUmVzZXRDb21tYW5kJywgJ0VuYWJsZUN1c3RvbVJlbW92ZUNvbW1hbmQnXTtcclxuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BlcnRpZXMpIHtcclxuICAgICAgICByZXN1bHRbJ2RhdGEnXVtwcm9wXSA9IGlzRW5hYmxlZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZW51bSBDb21wb25lbnRUeXBlIHtcclxuICB0ZXh0ID0gJ3RleHQnLFxyXG4gIHRleHRhcmVhID0gJ3RleHRhcmVhJyxcclxuICBjaGVja2JveCA9ICdjaGVja2JveCcsXHJcbiAgbGFiZWwgPSAnemxhYmVsJyxcclxuICBkYXRlID0gJ2RhdGUnLFxyXG4gIHpkYXRldGltZSA9ICd6ZGF0ZXRpbWUnLFxyXG4gIHp1aWRhdGV0aW1lID0gJ3p1aWRhdGV0aW1lJyxcclxuICBudW1iZXIgPSAnbnVtYmVyJyxcclxuICB6bnVtZXJpYyA9ICd6bnVtZXJpYycsXHJcbiAgZW1haWwgPSAnZW1haWwnLFxyXG4gIGZpbGUgPSAnZmlsZScsXHJcbiAgcHJpY2UgPSAncHJpY2UnLFxyXG4gIHdlYnNpdGUgPSAnd2Vic2l0ZScsXHJcbiAgZHJvcGRvd24gPSAnZHJvcGRvd24nLFxyXG4gIHp1aXNlbGVjdG11bHRpcGxlID0gJ3p1aXNlbGVjdG11bHRpcGxlJyxcclxuICB6c2VsZWN0bXVsdGlwbGUgPSAnenNlbGVjdG11bHRpcGxlJyxcclxuICBncm91cGluZyA9ICdrY2FyZCcsXHJcbiAgYnV0dG9uID0gJ3pidXR0b25zJyxcclxuICBncmlkID0gJ3pncmlkJ1xyXG59XHJcbiIsIjxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxNXB4XCIgKm5nSWY9XCJkYXRhLlRpdGxlICYmICghIWNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlRmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlKVwiIGNsYXNzPVwienVkZi1jb250YWluZXJcIj5cclxuICA8a2VuZG8tY2FyZCAqbmdJZj1cImRhdGEuVGl0bGVcIj5cclxuICAgIDxrZW5kby1jYXJkLWhlYWRlcj5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8aW9uLWxhYmVsIGNsYXNzPVwiY2FyZC1oZWFkZXItdGl0bGVcIj57e2RhdGEuVGl0bGV9fTwvaW9uLWxhYmVsPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwva2VuZG8tY2FyZC1oZWFkZXI+XHJcbiAgICA8a2VuZG8tY2FyZC1ib2R5PlxyXG4gICAgICA8IS0tIDxhcHAtemZvcm1jb250cm9sIFtuZ0NsYXNzXT1cImdyb3VwW2ZpZWxkLmlzVmlzaWJsZUZpZWxkXSA/IGZpZWxkLkRpdkNsYXNzIDogKChmaWVsZC5WaXNpYmxlID09PSB0cnVlKSA/ICBmaWVsZC5EaXZDbGFzcyA6ICdmbGV4LWhpZGUnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmb3JtRmllbGRzIHwgZGl2emxheW91dDogZGF0YS56bGF5b3V0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2dyb3VwXT1cImdyb3VwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZm9ybVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3tmaWVsZC5OYW1lfX1cIj5cclxuICAgICAgPC9hcHAtemZvcm1jb250cm9sPiAtLT5cclxuICAgICAgPGFwcC16ZGl2IFtkYXRhXT1cImRhdGFcIiBbZm9ybV09XCJmb3JtXCIgW2dyb3VwXT1cImdyb3VwXCIgW2NvbnRhaW5lckZpZWxkXT1cImNvbnRhaW5lckZpZWxkXCI+PC9hcHAtemRpdj5cclxuICAgIDwva2VuZG8tY2FyZC1ib2R5PlxyXG4gIDwva2VuZG8tY2FyZD5cclxuPC9kaXY+XHJcblxyXG48ZGl2ICpuZ0lmPVwiIWRhdGEuVGl0bGUgJiYgKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGVGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlRmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGUpXCIgW3N0eWxlXT1cImRhdGEuU3R5bGVcIiBjbGFzcz1cInp1ZGYtY29udGFpbmVyXCI+XHJcbiAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgKm5nSWY9XCIhaXNMb2FkaW5nXCI+XHJcbiAgICA8IS0tIDxhcHAtemZvcm1jb250cm9sIFtuZ0NsYXNzXT1cImdyb3VwW2ZpZWxkLmlzVmlzaWJsZUZpZWxkXSA/IGZpZWxkLkRpdkNsYXNzIDogKChmaWVsZC5WaXNpYmxlID09PSB0cnVlKSA/ICBmaWVsZC5EaXZDbGFzcyA6ICdmbGV4LWhpZGUnKVwiXHJcbiAgICAgICAgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGZvcm1GaWVsZHMgfCBkaXZ6bGF5b3V0OiBkYXRhLnpsYXlvdXRcIlxyXG4gICAgICAgIFtmaWVsZF09XCJmaWVsZFwiXHJcbiAgICAgICAgW2dyb3VwXT1cImdyb3VwXCJcclxuICAgICAgICBbZm9ybV09XCJmb3JtXCJcclxuICAgICAgICBpZD1cInt7ZmllbGQuTmFtZX19XCI+XHJcbiAgICA8L2FwcC16Zm9ybWNvbnRyb2w+IC0tPlxyXG4gICAgPGFwcC16ZGl2IFtkYXRhXT1cImRhdGFcIiBbZm9ybV09XCJmb3JtXCIgW2dyb3VwXT1cImdyb3VwXCIgW2NvbnRhaW5lckZpZWxkXT1cImNvbnRhaW5lckZpZWxkXCI+PC9hcHAtemRpdj5cclxuICA8L2Zvcm0+XHJcbjwvZGl2PlxyXG4iXX0=
|