ontimize-web-ngx 15.3.2 → 15.3.4

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.
Files changed (46) hide show
  1. package/esm2020/lib/components/app-sidenav/index.mjs +2 -1
  2. package/esm2020/lib/components/bar-menu/index.mjs +2 -1
  3. package/esm2020/lib/components/filter-builder/index.mjs +2 -1
  4. package/esm2020/lib/components/form/index.mjs +3 -1
  5. package/esm2020/lib/components/index.mjs +3 -1
  6. package/esm2020/lib/components/input/radio/o-radio.component.mjs +9 -11
  7. package/esm2020/lib/components/input/search-input/o-search-input.component.mjs +3 -3
  8. package/esm2020/lib/components/o-service-component.class.mjs +42 -21
  9. package/esm2020/lib/components/table/column/o-column.class.mjs +2 -2
  10. package/esm2020/lib/components/table/column/o-table-column.component.mjs +2 -4
  11. package/esm2020/lib/components/table/extensions/dialog/export/o-table-export-dialog.component.mjs +2 -2
  12. package/esm2020/lib/components/table/extensions/dialog/filter-by-column/o-table-filter-by-column-data-dialog.component.mjs +9 -8
  13. package/esm2020/lib/components/table/extensions/header/table-columns-filter/o-table-columns-filter.component.mjs +7 -4
  14. package/esm2020/lib/components/table/o-table.component.mjs +64 -40
  15. package/esm2020/lib/layouts/form-layout/o-form-layout-manager-base.class.mjs +1 -1
  16. package/esm2020/lib/layouts/form-layout/o-form-layout-manager.component.mjs +14 -3
  17. package/esm2020/lib/layouts/form-layout/split-pane/o-form-layout-split-pane.component.mjs +2 -1
  18. package/esm2020/lib/layouts/form-layout/tabgroup/o-form-layout-tabgroup.component.mjs +1 -14
  19. package/esm2020/lib/layouts/index.mjs +3 -1
  20. package/esm2020/lib/services/navigation.service.mjs +10 -2
  21. package/esm2020/lib/services/permissions/ontimize-ee-permissions.service.mjs +24 -15
  22. package/esm2020/lib/shared/index.mjs +3 -1
  23. package/esm2020/lib/types/form-layout-detail-component-data.type.mjs +1 -1
  24. package/fesm2015/ontimize-web-ngx.mjs +193 -122
  25. package/fesm2015/ontimize-web-ngx.mjs.map +1 -1
  26. package/fesm2020/ontimize-web-ngx.mjs +175 -113
  27. package/fesm2020/ontimize-web-ngx.mjs.map +1 -1
  28. package/lib/components/app-sidenav/index.d.ts +1 -0
  29. package/lib/components/bar-menu/index.d.ts +1 -0
  30. package/lib/components/filter-builder/index.d.ts +1 -0
  31. package/lib/components/form/index.d.ts +2 -0
  32. package/lib/components/index.d.ts +2 -0
  33. package/lib/components/input/radio/o-radio.component.d.ts +0 -2
  34. package/lib/components/o-service-component.class.d.ts +2 -2
  35. package/lib/components/table/column/o-table-column.component.d.ts +0 -1
  36. package/lib/components/table/extensions/dialog/filter-by-column/o-table-filter-by-column-data-dialog.component.d.ts +4 -4
  37. package/lib/components/table/extensions/header/table-columns-filter/o-table-columns-filter.component.d.ts +4 -3
  38. package/lib/components/table/o-table.component.d.ts +19 -2
  39. package/lib/layouts/form-layout/o-form-layout-manager-base.class.d.ts +3 -0
  40. package/lib/layouts/form-layout/tabgroup/o-form-layout-tabgroup.component.d.ts +0 -1
  41. package/lib/layouts/index.d.ts +2 -0
  42. package/lib/services/navigation.service.d.ts +8 -4
  43. package/lib/shared/index.d.ts +2 -0
  44. package/lib/types/form-layout-detail-component-data.type.d.ts +3 -1
  45. package/package.json +1 -1
  46. package/theme.scss +8 -3
@@ -222,7 +222,7 @@ export class AbstractOServiceComponent extends AbstractOServiceBaseComponent {
222
222
  this.selection.toggle(item);
223
223
  }
224
224
  }
225
- navigateToDetail(route, qParams, relativeTo) {
225
+ async navigateToDetail(route, qParams, relativeTo) {
226
226
  const extras = {
227
227
  relativeTo: relativeTo
228
228
  };
@@ -231,7 +231,16 @@ export class AbstractOServiceComponent extends AbstractOServiceBaseComponent {
231
231
  this.formLayoutManager.setAsActiveFormLayoutManager();
232
232
  }
233
233
  extras[Codes.QUERY_PARAMS] = qParams;
234
- this.router.navigate(route, extras);
234
+ this.router.navigate(route, extras).
235
+ then(() => {
236
+ if (!this.formLayoutManager) {
237
+ this.navigationService.isNavigating = false;
238
+ }
239
+ })
240
+ .catch(() => {
241
+ console.error('Cannot match any routes. URL Segment: ', route);
242
+ this.navigationService.isNavigating = false;
243
+ });
235
244
  }
236
245
  insertDetail() {
237
246
  if (this.oFormLayoutDialog) {
@@ -256,31 +265,39 @@ export class AbstractOServiceComponent extends AbstractOServiceBaseComponent {
256
265
  console.warn('Navigation is not available yet in a form layout manager with mode="dialog"');
257
266
  return;
258
267
  }
259
- const route = this.getItemModeRoute(item, 'detailFormRoute');
260
- this.addFormLayoutManagerRoute(route);
261
- if (route.length > 0) {
262
- const qParams = Codes.getIsDetailObject();
263
- const relativeTo = this.recursiveDetail ? this.actRoute.parent : this.actRoute;
264
- const zone = this.injector.get(NgZone);
265
- if (!this.formLayoutManager?.isSplitPaneMode()) {
266
- formLayoutManagerService.context = context;
267
- }
268
- zone.run(() => this.navigateToDetail(route, qParams, relativeTo));
268
+ if (this.navigationService.isNavigating) {
269
+ return;
269
270
  }
271
+ const zone = this.injector.get(NgZone);
272
+ zone.run(async () => {
273
+ const route = this.getItemModeRoute(item, 'detailFormRoute');
274
+ this.addFormLayoutManagerRoute(route);
275
+ if (route.length > 0) {
276
+ const qParams = Codes.getIsDetailObject();
277
+ const relativeTo = this.recursiveDetail ? this.actRoute.parent : this.actRoute;
278
+ if (!this.formLayoutManager?.isSplitPaneMode()) {
279
+ formLayoutManagerService.context = context;
280
+ }
281
+ this.navigationService.isNavigating = true;
282
+ await this.navigateToDetail(route, qParams, relativeTo);
283
+ }
284
+ });
270
285
  }
271
286
  editDetail(item) {
272
287
  if (this.oFormLayoutDialog) {
273
288
  console.warn('Navigation is not available yet in a form layout manager with mode="dialog"');
274
289
  return;
275
290
  }
276
- const route = this.getItemModeRoute(item, 'editFormRoute');
277
- this.addFormLayoutManagerRoute(route);
278
- if (route.length > 0) {
279
- const qParams = Codes.getIsDetailObject();
280
- const relativeTo = this.recursiveEdit ? this.actRoute.parent : this.actRoute;
281
- const zone = this.injector.get(NgZone);
282
- zone.run(() => this.navigateToDetail(route, qParams, relativeTo));
283
- }
291
+ const zone = this.injector.get(NgZone);
292
+ zone.run(async () => {
293
+ const route = this.getItemModeRoute(item, 'editFormRoute');
294
+ this.addFormLayoutManagerRoute(route);
295
+ if (route.length > 0) {
296
+ const qParams = Codes.getIsDetailObject();
297
+ const relativeTo = this.recursiveEdit ? this.actRoute.parent : this.actRoute;
298
+ await this.navigateToDetail(route, qParams, relativeTo);
299
+ }
300
+ });
284
301
  }
285
302
  addFormLayoutManagerRoute(routeArr) {
286
303
  if (this.formLayoutManager && routeArr.length > 0) {
@@ -289,6 +306,7 @@ export class AbstractOServiceComponent extends AbstractOServiceBaseComponent {
289
306
  routeArr.unshift(...compRoute);
290
307
  }
291
308
  }
309
+ return routeArr;
292
310
  }
293
311
  setButtonPermissions(actionsPermissions) {
294
312
  if (Util.isDefined(actionsPermissions)) {
@@ -662,6 +680,9 @@ export class AbstractOServiceComponent extends AbstractOServiceBaseComponent {
662
680
  updateComponentStateSubject.next(arg);
663
681
  }
664
682
  }
683
+ if (((arg.previousIndex === void 0) || arg.previousIndex === 0) && this.formLayoutManager.navigationService.isNavigating) {
684
+ arg.data.rendererSubject.next(true);
685
+ }
665
686
  this.checkViewPortSubject.next(true);
666
687
  });
667
688
  this.tabsSubscriptions.add(updateComponentStateSubject.subscribe((arg) => {
@@ -855,4 +876,4 @@ OServiceComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", vers
855
876
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OServiceComponent, decorators: [{
856
877
  type: Directive
857
878
  }] });
858
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1zZXJ2aWNlLWNvbXBvbmVudC5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL28tc2VydmljZS1jb21wb25lbnQuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdHLE9BQU8sRUFBRSxZQUFZLEVBQWEsTUFBTSw2QkFBNkIsQ0FBQztBQUV0RSxPQUFPLEVBQUUsZUFBZSxFQUE0QixNQUFNLE1BQU0sQ0FBQztBQUdqRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUNsRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUV4RixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUMxRyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUVyRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUdqRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUc5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFJaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsS0FBSyxFQUFF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O0FBQ25DO0lBQUMscUJBQXFCLEVBQUU7OzJEQUNXO0FBQ25DO0lBQUMscUJBQXFCLEVBQUU7OzJEQUNXO0FBR25DO0lBQUMscUJBQXFCLEVBQUU7O2tFQUNtQjtBQUMzQztJQUFDLHFCQUFxQixFQUFFOztvRUFDVztBQUduQztJQUFDLHFCQUFxQixFQUFFOztnRUFDaUI7QUFDekM7SUFBQyxxQkFBcUIsRUFBRTs7a0VBQ1M7QUFFakM7SUFBQyxxQkFBcUIsRUFBRTs7K0RBQ0Y7QUFDdEI7SUFBQyxxQkFBcUIsRUFBRTs7cUVBQ1c7QUFDbkM7SUFBQyxxQkFBcUIsRUFBRTs7NkVBQ29CO0FBK0I1QztJQUFDLHFCQUFxQixFQUFFOztrRUFDbUI7NEZBNUV2Qix5QkFBeUI7a0JBSjlDLFNBQVM7bUJBQUM7b0JBQ1QsTUFBTSxFQUFFLGtDQUFrQztvQkFDMUMsT0FBTyxFQUFFLG1DQUFtQztpQkFDN0M7cUpBSTBCLFlBQVk7c0JBQXBDLFNBQVM7dUJBQUMsWUFBWTtnQkFrQmIsUUFBUSxNQUVSLFFBQVEsTUFFUixRQUFRLE1BSVIsZUFBZSxNQUV6QixpQkFBaUIsTUFJUCxhQUFhLE1BRXZCLGVBQWUsTUFHZixZQUFZLE1BRVosa0JBQWtCLE1BRWxCLDBCQUEwQixNQWdDaEIsZUFBZSxNQXFEbEIsb0JBQW9CO3NCQUQxQixTQUFTO3VCQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUM7O0FBd3ZCdEQsTUFBTSxPQUFPLGlCQUFrQixTQUFRLHlCQUE4RDs7K0dBQXhGLGlCQUFpQjttR0FBakIsaUJBQWlCOzRGQUFqQixpQkFBaUI7a0JBRDdCLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSW5qZWN0b3IsIE5nWm9uZSwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRBcHBlYXJhbmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IsIFBhZ2VFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBPRmlsdGVyQnVpbGRlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvZmlsdGVyLWJ1aWxkZXIvby1maWx0ZXItYnVpbGRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgT1NlYXJjaElucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9pbnB1dC9zZWFyY2gtaW5wdXQvby1zZWFyY2gtaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IEJvb2xlYW5Db252ZXJ0ZXIsIEJvb2xlYW5JbnB1dENvbnZlcnRlciB9IGZyb20gJy4uL2RlY29yYXRvcnMvaW5wdXQtY29udmVydGVyJztcbmltcG9ydCB7IElTZXJ2aWNlRGF0YUNvbXBvbmVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMvc2VydmljZS1kYXRhLWNvbXBvbmVudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgT0Zvcm1MYXlvdXREaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi9sYXlvdXRzL2Zvcm0tbGF5b3V0L2RpYWxvZy9vLWZvcm0tbGF5b3V0LWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgT0Zvcm1MYXlvdXRNYW5hZ2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vbGF5b3V0cy9mb3JtLWxheW91dC9vLWZvcm0tbGF5b3V0LW1hbmFnZXIuY29tcG9uZW50JztcbmltcG9ydCB7IE9Gb3JtTGF5b3V0VGFiR3JvdXBDb21wb25lbnQgfSBmcm9tICcuLi9sYXlvdXRzL2Zvcm0tbGF5b3V0L3RhYmdyb3VwL28tZm9ybS1sYXlvdXQtdGFiZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IE5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbmF2aWdhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFBlcm1pc3Npb25zU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3Blcm1pc3Npb25zL3Blcm1pc3Npb25zLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWJzdHJhY3RTZXJ2aWNlQ29tcG9uZW50U3RhdGVDbGFzcyB9IGZyb20gJy4uL3NlcnZpY2VzL3N0YXRlL28tY29tcG9uZW50LXN0YXRlLmNsYXNzJztcbmltcG9ydCB7IEFic3RyYWN0Q29tcG9uZW50U3RhdGVTZXJ2aWNlLCBEZWZhdWx0U2VydmljZUNvbXBvbmVudFN0YXRlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3N0YXRlL28tY29tcG9uZW50LXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgT1RyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy90cmFuc2xhdGUvby10cmFuc2xhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBPUGVybWlzc2lvbnMgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBFeHByZXNzaW9uIH0gZnJvbSAnLi4vdHlwZXMvZXhwcmVzc2lvbi50eXBlJztcbmltcG9ydCB7IE9fR0xPQkFMX0NPTkZJRyB9IGZyb20gJy4uL3R5cGVzL28tZ2xvYmFsLWNvbmZpZy50eXBlJztcbmltcG9ydCB7IE9MaXN0SW5pdGlhbGl6YXRpb25PcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMvby1saXN0LWluaXRpYWxpemF0aW9uLW9wdGlvbnMudHlwZSc7XG5pbXBvcnQgeyBPUXVlcnlEYXRhQXJncyB9IGZyb20gJy4uL3R5cGVzL3F1ZXJ5LWRhdGEtYXJncy50eXBlJztcbmltcG9ydCB7IE9UYWJsZUluaXRpYWxpemF0aW9uT3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzL3RhYmxlL28tdGFibGUtaW5pdGlhbGl6YXRpb24tb3B0aW9ucy50eXBlJztcbmltcG9ydCB7IFBlcm1pc3Npb25zVXRpbHMgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IE9ic2VydmFibGVXcmFwcGVyIH0gZnJvbSAnLi4vdXRpbC9hc3luYyc7XG5pbXBvcnQgeyBDb2RlcyB9IGZyb20gJy4uL3V0aWwvY29kZXMnO1xuaW1wb3J0IHsgRmlsdGVyRXhwcmVzc2lvblV0aWxzIH0gZnJvbSAnLi4vdXRpbC9maWx0ZXItZXhwcmVzc2lvbi51dGlscyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IE9Gb3JtQ29tcG9uZW50IH0gZnJvbSAnLi9mb3JtL28tZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQWJzdHJhY3RPU2VydmljZUJhc2VDb21wb25lbnQsIERFRkFVTFRfSU5QVVRTX09fU0VSVklDRV9CQVNFX0NPTVBPTkVOVCB9IGZyb20gJy4vby1zZXJ2aWNlLWJhc2UtY29tcG9uZW50LmNsYXNzJztcbmltcG9ydCB7IE9Gb3JtTGF5b3V0TWFuYWdlckJhc2UgfSBmcm9tICcuLi9sYXlvdXRzL2Zvcm0tbGF5b3V0L28tZm9ybS1sYXlvdXQtbWFuYWdlci1iYXNlLmNsYXNzJztcbmltcG9ydCB7IE9Gb3JtTGF5b3V0TWFuYWdlckNvbnRleHQgfSBmcm9tICcuLi90eXBlcy9mb3JtLWxheW91dC1tYW5hZ2VyLWNvbnRleHQudHlwZSc7XG5pbXBvcnQgeyBPRm9ybUxheW91dE1hbmFnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvby1mb3JtLWxheW91dC1tYW5hZ2VyLnNlcnZpY2UnO1xuXG5pbnRlcmZhY2UgSXRlbUNsaWNrIHtcbiAgZ2V0SXRlbURhdGEoKTogYW55XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0lOUFVUU19PX1NFUlZJQ0VfQ09NUE9ORU5UID0gW1xuICAuLi5ERUZBVUxUX0lOUFVUU19PX1NFUlZJQ0VfQkFTRV9DT01QT05FTlQsXG5cbiAgJ190aXRsZTogdGl0bGUnLFxuXG4gIC8vIHZpc2libGUgW25vfHllc106IHZpc2liaWxpdHkuIERlZmF1bHQ6IHllcy5cbiAgJ292aXNpYmxlOiB2aXNpYmxlJyxcblxuICAvLyBlbmFibGVkIFtub3x5ZXNdOiBlZGl0YWJpbGl0eS4gRGVmYXVsdDogeWVzLlxuICAnb2VuYWJsZWQ6IGVuYWJsZWQnLFxuXG4gIC8vIGNvbnRyb2xzIFtzdHJpbmddW3llc3xub3x0cnVlfGZhbHNlXTpcbiAgJ2NvbnRyb2xzJyxcblxuICAvLyBkZXRhaWwtbW9kZSBbbm9uZXxjbGlja3xkb3VibGVjbGlja106IHdheSB0byBvcGVuIHRoZSBkZXRhaWwgZm9ybSBvZiBhIHJvdy4gRGVmYXVsdDogJ2NsaWNrJy5cbiAgJ2RldGFpbE1vZGU6IGRldGFpbC1tb2RlJyxcblxuICAvLyBkZXRhaWwtZm9ybS1yb3V0ZSBbc3RyaW5nXTogcm91dGUgb2YgZGV0YWlsIGZvcm0uIERlZmF1bHQ6ICdkZXRhaWwnLlxuICAnZGV0YWlsRm9ybVJvdXRlOiBkZXRhaWwtZm9ybS1yb3V0ZScsXG5cbiAgLy8gcmVjdXJzaXZlLWRldGFpbCBbbm98eWVzXTogZG8gbm90IGFwcGVuZCBkZXRhaWwga2V5cyB3aGVuIG5hdmlnYXRlIChvdmVyd3JpdGUgY3VycmVudCkuIERlZmF1bHQ6IG5vLlxuICAncmVjdXJzaXZlRGV0YWlsOiByZWN1cnNpdmUtZGV0YWlsJyxcblxuICAvLyBkZXRhaWwtYnV0dG9uLWluLXJvdyBbbm98eWVzXTogYWRkaW5nIGEgYnV0dG9uIGluIHJvdyBmb3Igb3BlbmluZyBkZXRhaWwgZm9ybS4gRGVmYXVsdDogeWVzLlxuICAnZGV0YWlsQnV0dG9uSW5Sb3c6IGRldGFpbC1idXR0b24taW4tcm93JyxcblxuICAvLyBkZXRhaWwtYnV0dG9uLWluLXJvdy1pY29uIFtzdHJpbmddOiBtYXRlcmlhbCBpY29uLiBEZWZhdWx0OiBtb2RlX2VkaXQuXG4gICdkZXRhaWxCdXR0b25JblJvd0ljb246IGRldGFpbC1idXR0b24taW4tcm93LWljb24nLFxuXG4gIC8vIGVkaXQtZm9ybS1yb3V0ZSBbc3RyaW5nXTogcm91dGUgb2YgZWRpdCBmb3JtLiBEZWZhdWx0OiAnZWRpdCcuXG4gICdlZGl0Rm9ybVJvdXRlOiBlZGl0LWZvcm0tcm91dGUnLFxuXG4gIC8vIHJlY3Vyc2l2ZS1lZGl0IFtub3x5ZXNdOiBkbyBub3QgYXBwZW5kIGRldGFpbCBrZXlzIHdoZW4gbmF2aWdhdGUgKG92ZXJ3cml0ZSBjdXJyZW50KS4gRGVmYXVsdDogbm8uXG4gICdyZWN1cnNpdmVFZGl0OiByZWN1cnNpdmUtZWRpdCcsXG5cbiAgLy8gZWRpdC1idXR0b24taW4tcm93IFtub3x5ZXNdOiBhZGRpbmcgYSBidXR0b24gaW4gcm93IGZvciBvcGVuaW5nIGVkaXRpb24gZm9ybS4gRGVmYXVsdDogbm8uXG4gICdlZGl0QnV0dG9uSW5Sb3c6IGVkaXQtYnV0dG9uLWluLXJvdycsXG5cbiAgLy8gZWRpdC1idXR0b24taW4tcm93LWljb24gW3N0cmluZ106IG1hdGVyaWFsIGljb24uIERlZmF1bHQ6IHNlYXJjaC5cbiAgJ2VkaXRCdXR0b25JblJvd0ljb246IGVkaXQtYnV0dG9uLWluLXJvdy1pY29uJyxcblxuICAvLyBpbnNlcnQtYnV0dG9uIFtub3x5ZXNdOiBzaG93IGluc2VydCBidXR0b24uIERlZmF1bHQ6IHllcy5cbiAgJ2luc2VydEJ1dHRvbjogaW5zZXJ0LWJ1dHRvbicsXG5cbiAgLy8gcm93LWhlaWdodCBbc21hbGwgfCBtZWRpdW0gfCBsYXJnZV1cbiAgJ3Jvd0hlaWdodCA6IHJvdy1oZWlnaHQnLFxuXG4gIC8vIGluc2VydC1mb3JtLXJvdXRlIFtzdHJpbmddOiByb3V0ZSBvZiBpbnNlcnQgZm9ybS4gRGVmYXVsdDpcbiAgJ2luc2VydEZvcm1Sb3V0ZTogaW5zZXJ0LWZvcm0tcm91dGUnLFxuXG4gIC8vIHJlY3Vyc2l2ZS1pbnNlcnQgW25vfHllc106IGRvIG5vdCBhcHBlbmQgaW5zZXJ0IGtleXMgd2hlbiBuYXZpZ2F0ZSAob3ZlcndyaXRlIGN1cnJlbnQpLiBEZWZhdWx0OiBuby5cbiAgJ3JlY3Vyc2l2ZUluc2VydDogcmVjdXJzaXZlLWluc2VydCcsXG5cbiAgLy8gZmlsdGVyIFt5ZXN8bm98dHJ1ZXxmYWxzZV06IHdoZXRoZXIgZmlsdGVyIGlzIGNhc2Ugc2Vuc2l0aXZlLiBEZWZhdWx0OiBuby5cbiAgJ2ZpbHRlckNhc2VTZW5zaXRpdmU6IGZpbHRlci1jYXNlLXNlbnNpdGl2ZScsXG5cbiAgLy8gcXVpY2stZmlsdGVyIFtub3x5ZXNdOiBzaG93IHF1aWNrIGZpbHRlci4gRGVmYXVsdDogeWVzLlxuICAncXVpY2tGaWx0ZXI6IHF1aWNrLWZpbHRlcicsXG5cbiAgLy8gcXVpY2stZmlsdGVyLXBsYWNlaG9sZGVyOiBxdWljayBmaWx0ZXIgcGxhY2Vob2xkZXJcbiAgJ3F1aWNrRmlsdGVyUGxhY2Vob2xkZXI6IHF1aWNrLWZpbHRlci1wbGFjZWhvbGRlcicsXG5cbiAgLy8gcGFnaW5hdGlvbi1jb250cm9scyBbeWVzfG5vfHRydWV8ZmFsc2VdOiBzaG93IHBhZ2luYXRpb24gY29udHJvbHMuIERlZmF1bHQ6IHllcy5cbiAgJ3BhZ2luYXRpb25Db250cm9sczogcGFnaW5hdGlvbi1jb250cm9scycsXG5cbiAgLy8gcGFnZS1zaXplLW9wdGlvbnMgW3N0cmluZ106IFBhZ2Ugc2l6ZSBvcHRpb25zIHNlcGFyYXRlZCBieSAnOycuXG4gICdwYWdlU2l6ZU9wdGlvbnM6IHBhZ2Utc2l6ZS1vcHRpb25zJyxcblxuICAvL3F1aWNrRmlsdGVyQXBwZWFyYW5jZVtsZWdhY3l8c3RhbmRhcmR8ZmlsbHxvdXRsaW5lXSBJbmRpY2F0ZXMgd2hpY2ggb2YgdGhlIG1hdC1mb3JtLWZpZWxkIGRpZmZlcmVudCBhcHBlYXJhbmNlIHZhcmlhbnRzIHdpbGwgYmUgdXNlZC4gRGVmYXVsdDogb3V0bGluZVxuICAncXVpY2tGaWx0ZXJBcHBlYXJhbmNlOnF1aWNrLWZpbHRlci1hcHBlYXJhbmNlJyxcblxuICAnZGlzYWJsZVBhZ2VTaXplQ2FsY3VsYXRpb246IGRpc2FibGUtcGFnZS1zaXplLWNhbGN1bGF0aW9uJ1xuXTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfT1VUUFVUU19PX1NFUlZJQ0VfQ09NUE9ORU5UID0gW1xuICAnb25DbGljaycsXG4gICdvbkRvdWJsZUNsaWNrJyxcbiAgJ29uRGF0YUxvYWRlZCcsXG4gICdvblBhZ2luYXRlZERhdGFMb2FkZWQnLFxuICAnb25TZWFyY2gnXG5dXG5cbkBEaXJlY3RpdmUoe1xuICBpbnB1dHM6IERFRkFVTFRfSU5QVVRTX09fU0VSVklDRV9DT01QT05FTlQsXG4gIG91dHB1dHM6IERFRkFVTFRfT1VUUFVUU19PX1NFUlZJQ0VfQ09NUE9ORU5UXG59KVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T1NlcnZpY2VDb21wb25lbnQ8VCBleHRlbmRzIEFic3RyYWN0Q29tcG9uZW50U3RhdGVTZXJ2aWNlPEFic3RyYWN0U2VydmljZUNvbXBvbmVudFN0YXRlQ2xhc3M+PlxuICBleHRlbmRzIEFic3RyYWN0T1NlcnZpY2VCYXNlQ29tcG9uZW50PFQ+XG4gIGltcGxlbWVudHMgSVNlcnZpY2VEYXRhQ29tcG9uZW50IHtcbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpIG1hdHBhZ2luYXRvcjogTWF0UGFnaW5hdG9yO1xuXG4gIHByb3RlY3RlZCBwZXJtaXNzaW9uc1NlcnZpY2U6IFBlcm1pc3Npb25zU2VydmljZTtcbiAgcHJvdGVjdGVkIHRyYW5zbGF0ZVNlcnZpY2U6IE9UcmFuc2xhdGVTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgbmF2aWdhdGlvblNlcnZpY2U6IE5hdmlnYXRpb25TZXJ2aWNlO1xuXG4gIC8qIGlucHV0cyB2YXJpYWJsZXMgKi9cbiAgc2V0IHRpdGxlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGl0bGUgPSB2YWw7XG4gIH1cbiAgZ2V0IHRpdGxlKCk6IHN0cmluZyB7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMuX3RpdGxlKSkge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQodGhpcy5fdGl0bGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdGl0bGU7XG4gIH1cbiAgcHJvdGVjdGVkIF90aXRsZTogc3RyaW5nO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcHJvdGVjdGVkIG92aXNpYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHByb3RlY3RlZCBvZW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBwcm90ZWN0ZWQgY29udHJvbHM6IGJvb2xlYW4gPSB0cnVlO1xuICBwdWJsaWMgZGV0YWlsTW9kZTogc3RyaW5nID0gQ29kZXMuREVUQUlMX01PREVfQ0xJQ0s7XG4gIHByb3RlY3RlZCBkZXRhaWxGb3JtUm91dGU6IHN0cmluZztcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHByb3RlY3RlZCByZWN1cnNpdmVEZXRhaWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGRldGFpbEJ1dHRvbkluUm93OiBib29sZWFuID0gZmFsc2U7XG4gIGRldGFpbEJ1dHRvbkluUm93SWNvbjogc3RyaW5nID0gQ29kZXMuREVUQUlMX0lDT047XG4gIHByb3RlY3RlZCBlZGl0Rm9ybVJvdXRlOiBzdHJpbmc7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBwcm90ZWN0ZWQgcmVjdXJzaXZlRWRpdDogYm9vbGVhbiA9IGZhbHNlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgZWRpdEJ1dHRvbkluUm93OiBib29sZWFuID0gZmFsc2U7XG4gIGVkaXRCdXR0b25JblJvd0ljb246IHN0cmluZyA9IENvZGVzLkVESVRfSUNPTjtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGluc2VydEJ1dHRvbjogYm9vbGVhbjtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHBhZ2luYXRpb25Db250cm9sczogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBkaXNhYmxlUGFnZVNpemVDYWxjdWxhdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGdldCBwYWdlU2l6ZU9wdGlvbnMoKTogbnVtYmVyW10ge1xuICAgIHJldHVybiB0aGlzLl9wYWdlU2l6ZU9wdGlvbnM7XG4gIH1cblxuICBzZXQgcGFnZVNpemVPcHRpb25zKHZhbDogbnVtYmVyW10pIHtcbiAgICBpZiAoISh2YWwgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgIHZhbCA9IFV0aWwucGFyc2VBcnJheShTdHJpbmcodmFsKSkubWFwKGEgPT4gcGFyc2VJbnQoYSwgMTApKTtcbiAgICB9XG4gICAgdGhpcy5fcGFnZVNpemVPcHRpb25zID0gdmFsO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9yb3dIZWlnaHQgPSBDb2Rlcy5ERUZBVUxUX1JPV19IRUlHSFQ7XG4gIHByb3RlY3RlZCByb3dIZWlnaHRTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPiA9IG5ldyBCZWhhdmlvclN1YmplY3QodGhpcy5fcm93SGVpZ2h0KTtcbiAgcHVibGljIHJvd0hlaWdodE9ic2VydmFibGU6IE9ic2VydmFibGU8c3RyaW5nPiA9IHRoaXMucm93SGVpZ2h0U3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBwcm90ZWN0ZWQgY2hlY2tWaWV3UG9ydFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBwdWJsaWMgY2hlY2tWaWV3UG9ydE9ic2VydmFibGU6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmNoZWNrVmlld1BvcnRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHNldCByb3dIZWlnaHQodmFsdWUpIHtcbiAgICB0aGlzLl9yb3dIZWlnaHQgPSB2YWx1ZSA/IHZhbHVlLnRvTG93ZXJDYXNlKCkgOiB2YWx1ZTtcbiAgICBpZiAoIUNvZGVzLmlzVmFsaWRSb3dIZWlnaHQodGhpcy5fcm93SGVpZ2h0KSkge1xuICAgICAgdGhpcy5fcm93SGVpZ2h0ID0gQ29kZXMuREVGQVVMVF9ST1dfSEVJR0hUO1xuICAgIH1cbiAgICB0aGlzLnJvd0hlaWdodFN1YmplY3QubmV4dCh0aGlzLl9yb3dIZWlnaHQpO1xuICB9XG4gIGdldCByb3dIZWlnaHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcm93SGVpZ2h0O1xuICB9XG4gIHByb3RlY3RlZCBpbnNlcnRGb3JtUm91dGU6IHN0cmluZztcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHByb3RlY3RlZCByZWN1cnNpdmVJbnNlcnQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgX2ZpbHRlckNhc2VTZW5zaXRpdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2V0IGZpbHRlckNhc2VTZW5zaXRpdmUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9maWx0ZXJDYXNlU2Vuc2l0aXZlID0gQm9vbGVhbkNvbnZlcnRlcih2YWx1ZSk7XG4gIH1cbiAgZ2V0IGZpbHRlckNhc2VTZW5zaXRpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlckNhc2VTZW5zaXRpdmU7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3F1aWNrRmlsdGVyOiBib29sZWFuID0gdHJ1ZTtcbiAgZ2V0IHF1aWNrRmlsdGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9xdWlja0ZpbHRlcjtcbiAgfVxuICBzZXQgcXVpY2tGaWx0ZXIodmFsOiBib29sZWFuKSB7XG4gICAgdmFsID0gVXRpbC5wYXJzZUJvb2xlYW4oU3RyaW5nKHZhbCkpO1xuICAgIHRoaXMuX3F1aWNrRmlsdGVyID0gdmFsO1xuICAgIGlmICh2YWwpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZWdpc3RlclF1aWNrRmlsdGVyKHRoaXMuc2VhcmNoSW5wdXRDb21wb25lbnQpLCAwKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcXVpY2tGaWx0ZXJQbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG4gIC8qIGVuZCBvZiBpbnB1dHMgdmFyaWFibGVzICovXG5cbiAgLyogb3V0cHV0cyB2YXJpYWJsZXMgKi9cbiAgcHVibGljIG9uQ2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgb25Eb3VibGVDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHB1YmxpYyBvbkRhdGFMb2FkZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgb25QYWdpbmF0ZWREYXRhTG9hZGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcHVibGljIG9uU2VhcmNoOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgLyogZW5kIG9mIG91dHB1dHMgdmFyaWFibGVzICovXG5cbiAgcHVibGljIGZpbHRlckJ1aWxkZXI6IE9GaWx0ZXJCdWlsZGVyQ29tcG9uZW50O1xuICBwcm90ZWN0ZWQgX3NlbGVjdGlvbjogU2VsZWN0aW9uTW9kZWw8YW55PjtcblxuICBnZXQgc2VsZWN0aW9uKCkge1xuICAgIGlmICghVXRpbC5pc0RlZmluZWQodGhpcy5fc2VsZWN0aW9uKSkge1xuICAgICAgdGhpcy5fc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPGFueT4odHJ1ZSwgW10sIHRydWUsIHRoaXMuY29tcGFyZVJvdygpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblRyaWdnZXJVcGRhdGVTdWJzY3JpcHRpb246IGFueTtcbiAgcHJvdGVjdGVkIGZvcm1MYXlvdXRNYW5hZ2VyOiBPRm9ybUxheW91dE1hbmFnZXJCYXNlO1xuICBwcm90ZWN0ZWQgZm9ybUxheW91dE1hbmFnZXJUYWJJbmRleDogbnVtYmVyO1xuICBwdWJsaWMgb0Zvcm1MYXlvdXREaWFsb2c6IE9Gb3JtTGF5b3V0RGlhbG9nQ29tcG9uZW50O1xuXG4gIHByb3RlY3RlZCB0YWJzU3Vic2NyaXB0aW9uczogYW55O1xuXG4gIHB1YmxpYyBxdWlja0ZpbHRlckNvbXBvbmVudDogT1NlYXJjaElucHV0Q29tcG9uZW50O1xuXG4gIEBWaWV3Q2hpbGQoKGZvcndhcmRSZWYoKCkgPT4gT1NlYXJjaElucHV0Q29tcG9uZW50KSkpXG4gIHB1YmxpYyBzZWFyY2hJbnB1dENvbXBvbmVudDogT1NlYXJjaElucHV0Q29tcG9uZW50O1xuXG4gIHByb3RlY3RlZCBxdWlja0ZpbHRlckNvbEFycmF5OiBzdHJpbmdbXTtcblxuICBwcm90ZWN0ZWQgZGF0YVJlc3BvbnNlQXJyYXk6IGFueVtdID0gW107XG4gIHByb3RlY3RlZCBxdWlja0ZpbHRlclN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBfcGFnZVNpemVPcHRpb25zID0gQ29kZXMuUEFHRV9TSVpFX09QVElPTlM7XG5cbiAgcHJvdGVjdGVkIGNsaWNrVGltZXI7XG4gIHByb3RlY3RlZCBjbGlja0RlbGF5ID0gMjAwO1xuICBwcm90ZWN0ZWQgY2xpY2tQcmV2ZW50ID0gZmFsc2U7XG4gIHByb3RlY3RlZCBfcXVpY2tGaWx0ZXJBcHBlYXJhbmNlOiBNYXRGb3JtRmllbGRBcHBlYXJhbmNlID0gJ291dGxpbmUnO1xuXG4gIHByaXZhdGUgbXV0YXRpb25PYnNlcnZlcnM6IE11dGF0aW9uT2JzZXJ2ZXJbXSA9IFtdO1xuICBwdWJsaWMgZW5hYmxlZEluc2VydEJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG4gIHB1YmxpYyBlbmFibGVkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByb3RlY3RlZCBlbFJlZjogRWxlbWVudFJlZixcbiAgICBwcm90ZWN0ZWQgZm9ybTogT0Zvcm1Db21wb25lbnRcbiAgKSB7XG4gICAgc3VwZXIoaW5qZWN0b3IpO1xuICAgIHRoaXMucGVybWlzc2lvbnNTZXJ2aWNlID0gdGhpcy5pbmplY3Rvci5nZXQoUGVybWlzc2lvbnNTZXJ2aWNlKTtcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UgPSB0aGlzLmluamVjdG9yLmdldChPVHJhbnNsYXRlU2VydmljZSk7XG4gICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KE5hdmlnYXRpb25TZXJ2aWNlKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5mb3JtTGF5b3V0TWFuYWdlciA9IHRoaXMuaW5qZWN0b3IuZ2V0KE9Gb3JtTGF5b3V0TWFuYWdlckNvbXBvbmVudCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gbm8gcGFyZW50IGZvcm0gbGF5b3V0IG1hbmFnZXJcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMub0Zvcm1MYXlvdXREaWFsb2cgPSB0aGlzLmluamVjdG9yLmdldChPRm9ybUxheW91dERpYWxvZ0NvbXBvbmVudCk7XG4gICAgICB0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyID0gdGhpcy5vRm9ybUxheW91dERpYWxvZy5mb3JtTGF5b3V0TWFuYWdlcjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBubyBwYXJlbnQgZm9ybSBsYXlvdXQgbWFuYWdlclxuICAgIH1cbiAgICB0aGlzLmdldEdsb2JhbEluamVjdGlvblRva2VuQ29uZmlnKCk7XG4gIH1cblxuICBwcml2YXRlIGdldEdsb2JhbEluamVjdGlvblRva2VuQ29uZmlnKCkge1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9HbG9iYWxDb25maWcgPSB0aGlzLmluamVjdG9yLmdldChPX0dMT0JBTF9DT05GSUcpO1xuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG9HbG9iYWxDb25maWcuc3RvcmVTdGF0ZSkpIHtcbiAgICAgICAgdGhpcy5zdG9yZVN0YXRlID0gb0dsb2JhbENvbmZpZy5zdG9yZVN0YXRlO1xuICAgICAgfTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBEbyBub3RoaW5nIGJlY2F1c2UgaXMgb3B0aW9uYWxcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgaWYgKHRoaXMuZGV0YWlsQnV0dG9uSW5Sb3cgfHwgdGhpcy5lZGl0QnV0dG9uSW5Sb3cpIHtcbiAgICAgIHRoaXMuZGV0YWlsTW9kZSA9IENvZGVzLkRFVEFJTF9NT0RFX05PTkU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3RlckZvcm1MYXlvdXRNYW5hZ2VyU3RhdGUoKTtcbiAgICBzdXBlci5hZnRlclZpZXdJbml0KCk7XG4gICAgaWYgKHRoaXMuZWxSZWYpIHtcbiAgICAgIHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3RpdGxlJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyICYmIHRoaXMuZm9ybUxheW91dE1hbmFnZXIuaXNNYWluQ29tcG9uZW50KHRoaXMpKSB7XG4gICAgICB0aGlzLm9uVHJpZ2dlclVwZGF0ZVN1YnNjcmlwdGlvbiA9IHRoaXMuZm9ybUxheW91dE1hbmFnZXIub25UcmlnZ2VyVXBkYXRlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVsb2FkRGF0YSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIGlmICh0aGlzLm9uVHJpZ2dlclVwZGF0ZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5vblRyaWdnZXJVcGRhdGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGFic1N1YnNjcmlwdGlvbnMpIHtcbiAgICAgIHRoaXMudGFic1N1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucXVpY2tGaWx0ZXJTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucXVpY2tGaWx0ZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaXNWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm92aXNpYmxlO1xuICB9XG5cbiAgcHVibGljIGhhc0NvbnRyb2xzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xzO1xuICB9XG5cbiAgcHVibGljIGhhc1RpdGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRpdGxlICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRJdGVtcygpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkO1xuICB9XG5cbiAgcHVibGljIGNsZWFyU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0U2VsZWN0ZWQoaXRlbTogYW55KTogdm9pZCB7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGl0ZW0pKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbi50b2dnbGUoaXRlbSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG5hdmlnYXRlVG9EZXRhaWwocm91dGU6IGFueVtdLCBxUGFyYW1zOiBhbnksIHJlbGF0aXZlVG86IEFjdGl2YXRlZFJvdXRlKTogdm9pZCB7XG4gICAgY29uc3QgZXh0cmFzID0ge1xuICAgICAgcmVsYXRpdmVUbzogcmVsYXRpdmVUb1xuICAgIH07XG4gICAgaWYgKHRoaXMuZm9ybUxheW91dE1hbmFnZXIgJiYgdGhpcy5mb3JtTGF5b3V0TWFuYWdlci5pc01haW5Db21wb25lbnQodGhpcykpIHtcbiAgICAgIHFQYXJhbXNbQ29kZXMuSUdOT1JFX0NBTl9ERUFDVElWQVRFXSA9IHRoaXMuZm9ybUxheW91dE1hbmFnZXIuaWdub3JlQ2FuRGVhY3RpdmF0ZTtcbiAgICAgIHRoaXMuZm9ybUxheW91dE1hbmFnZXIuc2V0QXNBY3RpdmVGb3JtTGF5b3V0TWFuYWdlcigpO1xuICAgIH1cbiAgICBleHRyYXNbQ29kZXMuUVVFUllfUEFSQU1TXSA9IHFQYXJhbXM7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUocm91dGUsIGV4dHJhcyk7XG4gIH1cblxuICBwdWJsaWMgaW5zZXJ0RGV0YWlsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9Gb3JtTGF5b3V0RGlhbG9nKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05hdmlnYXRpb24gaXMgbm90IGF2YWlsYWJsZSB5ZXQgaW4gYSBmb3JtIGxheW91dCBtYW5hZ2VyIHdpdGggbW9kZT1cImRpYWxvZ1wiJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJvdXRlID0gdGhpcy5nZXRJbnNlcnRSb3V0ZSgpO1xuICAgIHRoaXMuYWRkRm9ybUxheW91dE1hbmFnZXJSb3V0ZShyb3V0ZSk7XG4gICAgaWYgKHJvdXRlLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHJlbGF0aXZlVG8gPSB0aGlzLnJlY3Vyc2l2ZUluc2VydCA/IHRoaXMuYWN0Um91dGUucGFyZW50IDogdGhpcy5hY3RSb3V0ZTtcbiAgICAgIGNvbnN0IHFQYXJhbXMgPSB7fTtcbiAgICAgIGlmICh0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyICYmIHRoaXMuZm9ybUxheW91dE1hbmFnZXIuaXNUYWJNb2RlKCkpIHtcbiAgICAgICAgcVBhcmFtc1tDb2Rlcy5JTlNFUlRJT05fTU9ERV0gPSAndHJ1ZSc7XG4gICAgICB9XG4gICAgICB0aGlzLm5hdmlnYXRlVG9EZXRhaWwocm91dGUsIHFQYXJhbXMsIHJlbGF0aXZlVG8pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB2aWV3RGV0YWlsKGl0ZW06IGFueSwgY29udGV4dD86IE9Gb3JtTGF5b3V0TWFuYWdlckNvbnRleHQpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtTGF5b3V0TWFuYWdlclNlcnZpY2UgPSB0aGlzLmluamVjdG9yLmdldChPRm9ybUxheW91dE1hbmFnZXJTZXJ2aWNlKTtcbiAgICBmb3JtTGF5b3V0TWFuYWdlclNlcnZpY2UuY29udGV4dCA9IHZvaWQgMDtcblxuICAgIGlmICh0aGlzLm9Gb3JtTGF5b3V0RGlhbG9nKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05hdmlnYXRpb24gaXMgbm90IGF2YWlsYWJsZSB5ZXQgaW4gYSBmb3JtIGxheW91dCBtYW5hZ2VyIHdpdGggbW9kZT1cImRpYWxvZ1wiJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJvdXRlID0gdGhpcy5nZXRJdGVtTW9kZVJvdXRlKGl0ZW0sICdkZXRhaWxGb3JtUm91dGUnKTtcbiAgICB0aGlzLmFkZEZvcm1MYXlvdXRNYW5hZ2VyUm91dGUocm91dGUpO1xuICAgIGlmIChyb3V0ZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBxUGFyYW1zID0gQ29kZXMuZ2V0SXNEZXRhaWxPYmplY3QoKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlVG8gPSB0aGlzLnJlY3Vyc2l2ZURldGFpbCA/IHRoaXMuYWN0Um91dGUucGFyZW50IDogdGhpcy5hY3RSb3V0ZTtcbiAgICAgIGNvbnN0IHpvbmUgPSB0aGlzLmluamVjdG9yLmdldChOZ1pvbmUpO1xuICAgICAgaWYgKCF0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyPy5pc1NwbGl0UGFuZU1vZGUoKSkge1xuICAgICAgICBmb3JtTGF5b3V0TWFuYWdlclNlcnZpY2UuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICB9XG4gICAgICB6b25lLnJ1bigoKSA9PlxuICAgICAgICB0aGlzLm5hdmlnYXRlVG9EZXRhaWwocm91dGUsIHFQYXJhbXMsIHJlbGF0aXZlVG8pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBlZGl0RGV0YWlsKGl0ZW06IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9Gb3JtTGF5b3V0RGlhbG9nKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05hdmlnYXRpb24gaXMgbm90IGF2YWlsYWJsZSB5ZXQgaW4gYSBmb3JtIGxheW91dCBtYW5hZ2VyIHdpdGggbW9kZT1cImRpYWxvZ1wiJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJvdXRlID0gdGhpcy5nZXRJdGVtTW9kZVJvdXRlKGl0ZW0sICdlZGl0Rm9ybVJvdXRlJyk7XG4gICAgdGhpcy5hZGRGb3JtTGF5b3V0TWFuYWdlclJvdXRlKHJvdXRlKTtcbiAgICBpZiAocm91dGUubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcVBhcmFtcyA9IENvZGVzLmdldElzRGV0YWlsT2JqZWN0KCk7XG4gICAgICBjb25zdCByZWxhdGl2ZVRvID0gdGhpcy5yZWN1cnNpdmVFZGl0ID8gdGhpcy5hY3RSb3V0ZS5wYXJlbnQgOiB0aGlzLmFjdFJvdXRlO1xuICAgICAgY29uc3Qgem9uZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KE5nWm9uZSk7XG4gICAgICB6b25lLnJ1bigoKSA9PlxuICAgICAgICB0aGlzLm5hdmlnYXRlVG9EZXRhaWwocm91dGUsIHFQYXJhbXMsIHJlbGF0aXZlVG8pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhZGRGb3JtTGF5b3V0TWFuYWdlclJvdXRlKHJvdXRlQXJyOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyICYmIHJvdXRlQXJyLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGNvbXBSb3V0ZSA9IHRoaXMuZm9ybUxheW91dE1hbmFnZXIuZ2V0Um91dGVGb3JDb21wb25lbnQodGhpcyk7XG4gICAgICBpZiAoY29tcFJvdXRlICYmIGNvbXBSb3V0ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJvdXRlQXJyLnVuc2hpZnQoLi4uY29tcFJvdXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIHNldEJ1dHRvblBlcm1pc3Npb25zKGFjdGlvbnNQZXJtaXNzaW9ucyk6IHZvaWQge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChhY3Rpb25zUGVybWlzc2lvbnMpKSB7XG4gICAgICB0aGlzLnNldFBlcm1pc3Npb24oJ2luc2VydCcsICdpbnNlcnRCdXR0b24nLCAnZW5hYmxlZEluc2VydEJ1dHRvbicsIGFjdGlvbnNQZXJtaXNzaW9ucyk7XG4gICAgICB0aGlzLnNldFBlcm1pc3Npb24oJ3JlZnJlc2gnLCAncmVmcmVzaEJ1dHRvbicsICdlbmFibGVkUmVmcmVzaEJ1dHRvbicsIGFjdGlvbnNQZXJtaXNzaW9ucyk7XG4gICAgICB0aGlzLnNldFBlcm1pc3Npb24oJ2RlbGV0ZScsICdkZWxldGVCdXR0b24nLCAnZW5hYmxlZERlbGV0ZUJ1dHRvbicsIGFjdGlvbnNQZXJtaXNzaW9ucyk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBzZXRQZXJtaXNzaW9uKGF0dHI6IHN0cmluZywgdmlzaWJsZVByb3A6IHN0cmluZywgZW5hYmxlZFByb3A6IHN0cmluZywgYWN0aW9uc1Blcm1pc3Npb25zKTogdm9pZCB7XG4gICAgY29uc3QgcGVybSA9IHRoaXMuZ2V0UGVybWlzc2lvbkJ5QXR0cihhdHRyLCBhY3Rpb25zUGVybWlzc2lvbnMpO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChwZXJtKSkge1xuICAgICAgdGhpc1t2aXNpYmxlUHJvcF0gPSBwZXJtLnZpc2libGU7XG4gICAgICB0aGlzW2VuYWJsZWRQcm9wXSA9IHBlcm0uZW5hYmxlZDtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFuYWdlQ3VzdG9tUGVybWlzc2lvbnMoYWN0aW9uc1Blcm1pc3Npb25zLCBzZWxlY3Rvcik6IHZvaWQge1xuICAgIGNvbnN0IGN1c3RvbVBlcm1pc3Npb25zID0gYWN0aW9uc1Blcm1pc3Npb25zLmZpbHRlcihwZXJtID0+ICFbJ2luc2VydCcsICdyZWZyZXNoJywgJ2RlbGV0ZSddLmluY2x1ZGVzKHBlcm0uYXR0cikpO1xuICAgIGN1c3RvbVBlcm1pc3Npb25zLmZvckVhY2gocGVybWlzc2lvbiA9PiB7XG4gICAgICB0aGlzLm1hbmFnZVBlcm1pc3Npb24odGhpcy5lbFJlZiwgcGVybWlzc2lvbiwgdGhpcy5tdXRhdGlvbk9ic2VydmVycywgc2VsZWN0b3IpO1xuICAgIH0pO1xuICB9XG4gIHByb3RlY3RlZCBnZXRBY3Rpb25zUGVybWlzc2lvbnMocGVybWlzc2lvbnM6IGFueSk6IE9QZXJtaXNzaW9uc1tdIHtcbiAgICByZXR1cm4gVXRpbC5pc0RlZmluZWQocGVybWlzc2lvbnMpID8gKHBlcm1pc3Npb25zLmFjdGlvbnMgfHwgW10pIDogW107XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UGVybWlzc2lvbkJ5QXR0cihhdHRyOiBzdHJpbmcsIGFjdGlvbnNQZXJtaXNzaW9uczogT1Blcm1pc3Npb25zW10pOiBPUGVybWlzc2lvbnMge1xuICAgIHJldHVybiBhY3Rpb25zUGVybWlzc2lvbnMuZmluZCgocGVybTogT1Blcm1pc3Npb25zKSA9PiBwZXJtLmF0dHIgPT09IGF0dHIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1hbmFnZVBlcm1pc3Npb24oZWxlbWVudFJlZjogYW55LCBwZXJtaXNzaW9uOiBPUGVybWlzc2lvbnMsIG11dGF0aW9uT2JzZXJ2ZXJzOiBhbnlbXSwgc2VsZWN0b3I6IHN0cmluZywgYXR0cj86IHN0cmluZyk6IHZvaWQge1xuICAgIGxldCBlbGVtZW50QnlBY3Rpb247XG4gICAgY29uc3QgYXR0ckFjdGlvbiA9IFV0aWwuaXNEZWZpbmVkKGF0dHIpID8gYXR0ciA6IHBlcm1pc3Npb24uYXR0cjtcbiAgICBjb25zdCBhbGxFbGVtZW50cyA9IGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcblxuICAgIGFsbEVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2F0dHInKSA9PT0gYXR0ckFjdGlvbikge1xuICAgICAgICBlbGVtZW50QnlBY3Rpb24gPSBlbGVtZW50O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGVsZW1lbnRCeUFjdGlvbikpIHtcbiAgICAgIGlmICghcGVybWlzc2lvbi52aXNpYmxlKSB7XG4gICAgICAgIGVsZW1lbnRCeUFjdGlvbi5yZW1vdmUoKTtcbiAgICAgIH0gZWxzZSBpZiAoIXBlcm1pc3Npb24uZW5hYmxlZCkge1xuICAgICAgICBlbGVtZW50QnlBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCBtdXRhdGlvbk9ic2VydmVyID0gUGVybWlzc2lvbnNVdGlscy5yZWdpc3RlckRpc2FibGVkQ2hhbmdlc0luRG9tKGVsZW1lbnRCeUFjdGlvbik7XG4gICAgICAgIG11dGF0aW9uT2JzZXJ2ZXJzLnB1c2gobXV0YXRpb25PYnNlcnZlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldEVuY29kZWRQYXJlbnRLZXlzKCk6IHN0cmluZyB7XG4gICAgbGV0IGVuY29kZWQ6IHN0cmluZztcbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fcEtleXNFcXVpdikubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcEtleXMgPSB0aGlzLmdldFBhcmVudEtleXNWYWx1ZXMoKTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhwS2V5cykubGVuZ3RoID4gMCkge1xuICAgICAgICBlbmNvZGVkID0gVXRpbC5lbmNvZGVQYXJlbnRLZXlzKHBLZXlzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVuY29kZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0SW5zZXJ0Um91dGUoKTogYW55W10ge1xuICAgIGNvbnN0IHJvdXRlID0gW107XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMuZGV0YWlsRm9ybVJvdXRlKSkge1xuICAgICAgcm91dGUucHVzaCh0aGlzLmRldGFpbEZvcm1Sb3V0ZSk7XG4gICAgfVxuICAgIGNvbnN0IGluc2VydFJvdXRlID0gVXRpbC5pc0RlZmluZWQodGhpcy5pbnNlcnRGb3JtUm91dGUpID8gdGhpcy5pbnNlcnRGb3JtUm91dGUgOiBDb2Rlcy5ERUZBVUxUX0lOU0VSVF9ST1VURTtcbiAgICByb3V0ZS5wdXNoKGluc2VydFJvdXRlKTtcbiAgICAvLyBhZGRpbmcgcGFyZW50LWtleXMgaW5mby4uLlxuICAgIGNvbnN0IGVuY29kZWRQYXJlbnRLZXlzID0gdGhpcy5nZXRFbmNvZGVkUGFyZW50S2V5cygpO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChlbmNvZGVkUGFyZW50S2V5cykpIHtcbiAgICAgIGNvbnN0IHJvdXRlT2JqID0ge307XG4gICAgICByb3V0ZU9ialtDb2Rlcy5QQVJFTlRfS0VZU19LRVldID0gZW5jb2RlZFBhcmVudEtleXM7XG4gICAgICByb3V0ZS5wdXNoKHJvdXRlT2JqKTtcbiAgICB9XG4gICAgaWYgKHJvdXRlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc3RvcmVOYXZpZ2F0aW9uRm9ybVJvdXRlcygnaW5zZXJ0Rm9ybVJvdXRlJyk7XG4gICAgfVxuICAgIHJldHVybiByb3V0ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJdGVtTW9kZVJvdXRlKGl0ZW06IGFueSwgbW9kZVJvdXRlOiBzdHJpbmcpOiBhbnlbXSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXRSb3V0ZU9mU2VsZWN0ZWRSb3coaXRlbSk7XG4gICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5kZXRhaWxGb3JtUm91dGUpKSB7XG4gICAgICAgIHJlc3VsdC51bnNoaWZ0KHRoaXMuZGV0YWlsRm9ybVJvdXRlKTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2RlUm91dGUgPT09ICdlZGl0Rm9ybVJvdXRlJykge1xuICAgICAgICByZXN1bHQucHVzaCh0aGlzLmVkaXRGb3JtUm91dGUgfHwgQ29kZXMuREVGQVVMVF9FRElUX1JPVVRFKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwICYmICF0aGlzLm9Gb3JtTGF5b3V0RGlhbG9nKSB7XG4gICAgICB0aGlzLnN0b3JlTmF2aWdhdGlvbkZvcm1Sb3V0ZXMobW9kZVJvdXRlLCB0aGlzLmdldFF1ZXJ5Q29uZmlndXJhdGlvbigpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRRdWVyeUNvbmZpZ3VyYXRpb24oKTogYW55IHtcbiAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAga2V5c1ZhbHVlczogdGhpcy5nZXRLZXlzVmFsdWVzKClcbiAgICB9O1xuICAgIGlmICh0aGlzLnBhZ2VhYmxlKSB7XG4gICAgICByZXN1bHQgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgc2VydmljZVR5cGU6IHRoaXMuc2VydmljZVR5cGUsXG4gICAgICAgIHF1ZXJ5QXJndW1lbnRzOiB0aGlzLnF1ZXJ5QXJndW1lbnRzLFxuICAgICAgICBlbnRpdHk6IHRoaXMuZW50aXR5LFxuICAgICAgICBzZXJ2aWNlOiB0aGlzLnNlcnZpY2UsXG4gICAgICAgIHF1ZXJ5TWV0aG9kOiB0aGlzLnBhZ2VhYmxlID8gdGhpcy5wYWdpbmF0ZWRRdWVyeU1ldGhvZCA6IHRoaXMucXVlcnlNZXRob2QsXG4gICAgICAgIHRvdGFsUmVjb3Jkc051bWJlcjogdGhpcy5nZXRUb3RhbFJlY29yZHNOdW1iZXIoKSxcbiAgICAgICAgcXVlcnlSb3dzOiB0aGlzLnF1ZXJ5Um93cyxcbiAgICAgICAgcXVlcnlSZWNvcmRPZmZzZXQ6IE1hdGgubWF4KHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnF1ZXJ5Um93cywgdGhpcy5zdGF0ZS5xdWVyeVJlY29yZE9mZnNldCAtIHRoaXMucXVlcnlSb3dzKVxuICAgICAgfSwgcmVzdWx0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSb3V0ZU9mU2VsZWN0ZWRSb3coaXRlbTogYW55KTogYW55W10ge1xuICAgIGNvbnN0IHJvdXRlID0gW107XG4gICAgaWYgKFV0aWwuaXNPYmplY3QoaXRlbSkpIHtcbiAgICAgIHRoaXMua2V5c0FycmF5LmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKGl0ZW1ba2V5XSkpIHtcbiAgICAgICAgICByb3V0ZS5wdXNoKGl0ZW1ba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcm91dGU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVsZXRlTG9jYWxJdGVtcygpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gdGhpcy5nZXRTZWxlY3RlZEl0ZW1zKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3RlZEl0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZEl0ZW0gPSBzZWxlY3RlZEl0ZW1zW2ldO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtS3YgPSB7fTtcbiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgdGhpcy5rZXlzQXJyYXkubGVuZ3RoOyArK2spIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5rZXlzQXJyYXlba107XG4gICAgICAgIHNlbGVjdGVkSXRlbUt2W2tleV0gPSBzZWxlY3RlZEl0ZW1ba2V5XTtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGogPSB0aGlzLmRhdGFBcnJheS5sZW5ndGggLSAxOyBqID49IDA7IC0taikge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5kYXRhQXJyYXlbal07XG4gICAgICAgIGNvbnN0IGl0ZW1LdiA9IHt9O1xuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHRoaXMua2V5c0FycmF5Lmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5rZXlzQXJyYXlba107XG4gICAgICAgICAgaXRlbUt2W2tleV0gPSBpdGVtW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgayBpbiBzZWxlY3RlZEl0ZW1Ldikge1xuICAgICAgICAgIGlmIChzZWxlY3RlZEl0ZW1Ldi5oYXNPd25Qcm9wZXJ0eShrKSkge1xuICAgICAgICAgICAgZm91bmQgPSBpdGVtS3YuaGFzT3duUHJvcGVydHkoaykgJiYgKHNlbGVjdGVkSXRlbUt2W2tdID09PSBpdGVtS3Zba10pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICB0aGlzLmRhdGFBcnJheS5zcGxpY2UoaiwgMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICB9XG5cbiAgcHVibGljIHJlaW5pdGlhbGl6ZShvcHRpb25zOiBPTGlzdEluaXRpYWxpemF0aW9uT3B0aW9ucyB8IE9UYWJsZUluaXRpYWxpemF0aW9uT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmIChvcHRpb25zICYmIE9iamVjdC5rZXlzKG9wdGlvbnMpLmxlbmd0aCkge1xuICAgICAgY29uc3QgY2xvbmVkT3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpO1xuICAgICAgaWYgKGNsb25lZE9wdHMuaGFzT3duUHJvcGVydHkoJ2VudGl0eScpKSB7XG4gICAgICAgIHRoaXMuZW50aXR5ID0gY2xvbmVkT3B0cy5lbnRpdHk7XG4gICAgICAgIGlmICh0aGlzLm9hdHRyRnJvbUVudGl0eSkge1xuICAgICAgICAgIHRoaXMub2F0dHIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIGNsb25lZE9wdHMuZW50aXR5O1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBwcm9wIGluIGNsb25lZE9wdHMpIHtcbiAgICAgICAgaWYgKGNsb25lZE9wdHMuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICB0aGlzW3Byb3BdID0gY2xvbmVkT3B0c1twcm9wXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgYG8tZmlsdGVyLWJ1aWxkZXJgIGNvbXBvbmVudCB0aGF0IHRoaXMgY29tcG9uZW50IHdpbGwgdXNlIHRvIGZpbHRlciBpdHMgZGF0YS5cbiAgICogQHBhcmFtIGZpbHRlckJ1aWxkZXIgdGhlIGBvLWZpbHRlci1idWlsZGVyYCBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgc2V0RmlsdGVyQnVpbGRlcihmaWx0ZXJCdWlsZGVyOiBPRmlsdGVyQnVpbGRlckNvbXBvbmVudCk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyQnVpbGRlciA9IGZpbHRlckJ1aWxkZXI7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29tcG9uZW50RmlsdGVyKGV4aXN0aW5nRmlsdGVyOiBhbnkgPSB7fSk6IGFueSB7XG4gICAgY29uc3QgZmlsdGVyID0gc3VwZXIuZ2V0Q29tcG9uZW50RmlsdGVyKGV4aXN0aW5nRmlsdGVyKTtcblxuICAgIGNvbnN0IHF1aWNrRmlsdGVyRXhwciA9IHRoaXMuZ2V0UXVpY2tGaWx0ZXJFeHByZXNzaW9uKCk7XG4gICAgY29uc3QgZmlsdGVyQnVpbGRlckV4cHIgPSB0aGlzLmdldEZpbHRlckJ1aWxkZXJFeHByZXNzaW9uKCk7XG4gICAgbGV0IGNvbXBsZXhFeHByID0gcXVpY2tGaWx0ZXJFeHByIHx8IGZpbHRlckJ1aWxkZXJFeHByO1xuICAgIGlmIChxdWlja0ZpbHRlckV4cHIgJiYgZmlsdGVyQnVpbGRlckV4cHIpIHtcbiAgICAgIGNvbXBsZXhFeHByID0gRmlsdGVyRXhwcmVzc2lvblV0aWxzLmJ1aWxkQ29tcGxleEV4cHJlc3Npb24ocXVpY2tGaWx0ZXJFeHByLCBmaWx0ZXJCdWlsZGVyRXhwciwgRmlsdGVyRXhwcmVzc2lvblV0aWxzLk9QX0FORCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBsZXhFeHByICYmICFVdGlsLmlzRGVmaW5lZChmaWx0ZXJbRmlsdGVyRXhwcmVzc2lvblV0aWxzLkJBU0lDX0VYUFJFU1NJT05fS0VZXSkpIHtcbiAgICAgIGZpbHRlcltGaWx0ZXJFeHByZXNzaW9uVXRpbHMuQkFTSUNfRVhQUkVTU0lPTl9LRVldID0gY29tcGxleEV4cHI7XG4gICAgfSBlbHNlIGlmIChjb21wbGV4RXhwcikge1xuICAgICAgZmlsdGVyW0ZpbHRlckV4cHJlc3Npb25VdGlscy5CQVNJQ19FWFBSRVNTSU9OX0tFWV0gPVxuICAgICAgICBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuYnVpbGRDb21wbGV4RXhwcmVzc2lvbihmaWx0ZXJbRmlsdGVyRXhwcmVzc2lvblV0aWxzLkJBU0lDX0VYUFJFU1NJT05fS0VZXSwgY29tcGxleEV4cHIsIEZpbHRlckV4cHJlc3Npb25VdGlscy5PUF9BTkQpO1xuICAgIH1cblxuICAgIHJldHVybiBmaWx0ZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UXVpY2tGaWx0ZXJFeHByZXNzaW9uKCk6IEV4cHJlc3Npb24ge1xuICAgIGlmICh0aGlzLnBhZ2VhYmxlICYmIFV0aWwuaXNEZWZpbmVkKHRoaXMucXVpY2tGaWx0ZXJDb21wb25lbnQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5xdWlja0ZpbHRlckNvbXBvbmVudC5maWx0ZXJFeHByZXNzaW9uO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEZpbHRlckJ1aWxkZXJFeHByZXNzaW9uKCk6IEV4cHJlc3Npb24ge1xuICAgIC8vIEFkZCBmaWx0ZXIgZnJvbSBvLWZpbHRlci1idWlsZGVyIGNvbXBvbmVudFxuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLmZpbHRlckJ1aWxkZXIpKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXJCdWlsZGVyLmdldEV4cHJlc3Npb24oKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdG9yZU5hdmlnYXRpb25Gb3JtUm91dGVzKGFjdGl2ZU1vZGU6IHN0cmluZywgcXVlcnlDb25mPzogYW55KTogdm9pZCB7XG4gICAgY29uc3QgbWFpbkZvcm1MYXlvdXRDb21wID0gdGhpcy5mb3JtTGF5b3V0TWFuYWdlciA/IFV0aWwuaXNEZWZpbmVkKHRoaXMuZm9ybUxheW91dE1hbmFnZXIuaXNNYWluQ29tcG9uZW50KHRoaXMpKSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnN0b3JlRm9ybVJvdXRlcyh7XG4gICAgICBtYWluRm9ybUxheW91dE1hbmFnZXJDb21wb25lbnQ6IG1haW5Gb3JtTGF5b3V0Q29tcCxcbiAgICAgIGlzTWFpbk5hdmlnYXRpb25Db21wb25lbnQ6IHRydWUsXG4gICAgICBkZXRhaWxGb3JtUm91dGU6IHRoaXMuZGV0YWlsRm9ybVJvdXRlLFxuICAgICAgZWRpdEZvcm1Sb3V0ZTogdGhpcy5lZGl0Rm9ybVJvdXRlLFxuICAgICAgaW5zZXJ0Rm9ybVJvdXRlOiBVdGlsLmlzRGVmaW5lZCh0aGlzLmluc2VydEZvcm1Sb3V0ZSkgPyB0aGlzLmluc2VydEZvcm1Sb3V0ZSA6IENvZGVzLkRFRkFVTFRfSU5TRVJUX1JPVVRFXG4gICAgfSwgYWN0aXZlTW9kZSwgcXVlcnlDb25mKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzYXZlRGF0YU5hdmlnYXRpb25JbkxvY2FsU3RvcmFnZSgpOiB2b2lkIHtcbiAgICAvLyBTYXZlIGRhdGEgb2YgdGhlIGxpc3QgaW4gbmF2aWdhdGlvbi1kYXRhIGluIHRoZSBsb2NhbHN0b3JhZ2VcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRLZXlzVmFsdWVzKCk6IGFueVtdIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhQXJyYXk7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIGRhdGEubWFwKChyb3cpID0+IHtcbiAgICAgIGNvbnN0IG9iaiA9IHt9O1xuICAgICAgc2VsZi5rZXlzQXJyYXkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGlmIChyb3dba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb2JqW2tleV0gPSByb3dba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Um91dGVLZXkoKTogc3RyaW5nIHtcbiAgICBsZXQgcm91dGUgPSAnJztcbiAgICBpZiAodGhpcy5mb3JtTGF5b3V0TWFuYWdlciAmJiAhdGhpcy5mb3JtTGF5b3V0TWFuYWdlci5pc01haW5Db21wb25lbnQodGhpcykpIHtcbiAgICAgIHJvdXRlID0gdGhpcy5yb3V0ZXIudXJsO1xuICAgICAgY29uc3QgcGFyYW1zID0gdGhpcy5mb3JtTGF5b3V0TWFuYWdlci5nZXRQYXJhbXMoKTtcbiAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgcm91dGUgKz0gJy8nICsgKE9iamVjdC5rZXlzKHBhcmFtcykuam9pbignLycpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcm91dGUgPSBzdXBlci5nZXRSb3V0ZUtleSgpO1xuICAgIH1cbiAgICByZXR1cm4gcm91dGU7XG4gIH1cblxuICBnZXQgZWxlbWVudFJlZigpOiBFbGVtZW50UmVmIHtcbiAgICByZXR1cm4gdGhpcy5lbFJlZjtcbiAgfVxuXG4gIHB1YmxpYyBzaG93Q2FzZVNlbnNpdGl2ZUNoZWNrYm94KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5wYWdlYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlclF1aWNrRmlsdGVyKGFyZzogYW55KTogdm9pZCB7XG4gICAgY29uc3QgcXVpY2tGaWx0ZXIgPSAoYXJnIGFzIE9TZWFyY2hJbnB1dENvbXBvbmVudCk7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMucXVpY2tGaWx0ZXJDb21wb25lbnQpKSB7XG4gICAgICAvLyBhdm9pZGluZyB0byByZWdpc3RlciBhIHF1aWNrZmlsdGVyY29tcG9uZW50IGlmIGl0IGFscmVhZHkgZXhpc3RzIG9uZVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnF1aWNrRmlsdGVyQ29tcG9uZW50ID0gcXVpY2tGaWx0ZXI7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMucXVpY2tGaWx0ZXJDb21wb25lbnQpKSB7XG4gICAgICB0aGlzLnF1aWNrRmlsdGVyU3Vic2NyaXB0aW9uID0gdGhpcy5xdWlja0ZpbHRlckNvbXBvbmVudC5vblNlYXJjaC5zdWJzY3JpYmUodmFsID0+IHtcbiAgICAgICAgdGhpcy5vblNlYXJjaC5lbWl0KHZhbCk7XG4gICAgICAgIHRoaXMuZmlsdGVyRGF0YSh2YWwpO1xuICAgICAgfSk7XG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5zdGF0ZSkpIHtcbiAgICAgICAgaWYgKCh0aGlzLnN0YXRlLnF1aWNrRmlsdGVyVmFsdWUgfHwgJycpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLnF1aWNrRmlsdGVyQ29tcG9uZW50LnNldFZhbHVlKHRoaXMuc3RhdGUucXVpY2tGaWx0ZXJWYWx1ZSwge1xuICAgICAgICAgICAgZW1pdEV2ZW50OiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaXNGaWx0ZXJDYXNlU2Vuc2l0aXZlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHVzZVF1aWNrRmlsdGVyVmFsdWUgPSBVdGlsLmlzRGVmaW5lZCh0aGlzLnF1aWNrRmlsdGVyQ29tcG9uZW50KSAmJiB0aGlzLnNob3dDYXNlU2Vuc2l0aXZlQ2hlY2tib3goKTtcbiAgICBpZiAodXNlUXVpY2tGaWx0ZXJWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucXVpY2tGaWx0ZXJDb21wb25lbnQuZmlsdGVyQ2FzZVNlbnNpdGl2ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyQ2FzZVNlbnNpdGl2ZTtcbiAgfVxuXG4gIHB1YmxpYyBjb25maWd1cmVGaWx0ZXJWYWx1ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcmV0dXJuVmFsID0gdmFsdWU7XG4gICAgaWYgKHZhbHVlICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICghdmFsdWUuc3RhcnRzV2l0aCgnKicpKSB7XG4gICAgICAgIHJldHVyblZhbCA9ICcqJyArIHJldHVyblZhbDtcbiAgICAgIH1cbiAgICAgIGlmICghdmFsdWUuZW5kc1dpdGgoJyonKSkge1xuICAgICAgICByZXR1cm5WYWwgPSByZXR1cm5WYWwgKyAnKic7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5WYWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0UXVpY2tGaWx0ZXJWYWx1ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlc3VsdCA9ICcnO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnF1aWNrRmlsdGVyQ29tcG9uZW50KSkge1xuICAgICAgcmV0dXJuIHRoaXMucXVpY2tGaWx0ZXJDb21wb25lbnQuZ2V0VmFsdWUoKSB8fCAnJztcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRRdWlja0ZpbHRlckNvbHVtbnMoKTogc3RyaW5nW10ge1xuICAgIGxldCByZXN1bHQgPSB0aGlzLnF1aWNrRmlsdGVyQ29sQXJyYXk7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMucXVpY2tGaWx0ZXJDb21wb25lbnQpKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnF1aWNrRmlsdGVyQ29tcG9uZW50LmdldEFjdGl2ZUNvbHVtbnMoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGRhdGEgbG9jYWxseVxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIGZpbHRlcmluZyB2YWx1ZVxuICAgKi9cbiAgcHVibGljIGZpbHRlckRhdGEodmFsdWU/OiBzdHJpbmcsIGxvYWRNb3JlPzogYm9vbGVhbik6IHZvaWQge1xuICAgIHZhbHVlID0gVXRpbC5pc0RlZmluZWQodmFsdWUpID8gdmFsdWUgOiBVdGlsLmlzRGVmaW5lZCh0aGlzLnF1aWNrRmlsdGVyQ29tcG9uZW50KSA/IHRoaXMucXVpY2tGaWx0ZXJDb21wb25lbnQuZ2V0VmFsdWUoKSA6IHZvaWQgMDtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5zdGF0ZSkgJiYgVXRpbC5pc0RlZmluZWQodmFsdWUpKSB7XG4gICAgICB0aGlzLnN0YXRlLnF1aWNrRmlsdGVyVmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFnZWFibGUpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5QXJnczogT1F1ZXJ5RGF0YUFyZ3MgPSB7XG4gICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgbGVuZ3RoOiB0aGlzLnF1ZXJ5Um93cyxcbiAgICAgICAgcmVwbGFjZTogdHJ1ZVxuICAgICAgfTtcbiAgICAgIHRoaXMucXVlcnlEYXRhKHZvaWQgMCwgcXVlcnlBcmdzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YVJlc3BvbnNlQXJyYXkgJiYgdGhpcy5kYXRhUmVzcG9uc2VBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgZmlsdGVyZWREYXRhID0gdGhpcy5kYXRhUmVzcG9uc2VBcnJheS5zbGljZSgwKTtcbiAgICAgIGZpbHRlcmVkRGF0YSA9IHRoaXMuZ2V0UXVpY2tGaWx0ZXJEYXRhRnJvbUFycmF5KHZhbHVlLCBmaWx0ZXJlZERhdGEpO1xuICAgICAgZmlsdGVyZWREYXRhID0gdGhpcy5nZXRTb3J0ZWREYXRhRnJvbUFycmF5KGZpbHRlcmVkRGF0YSk7XG4gICAgICBmaWx0ZXJlZERhdGEgPSB0aGlzLmdldFBhZ2luYXRpb25EYXRhRnJvbUFycmF5KGZpbHRlcmVkRGF0YSk7XG4gICAgICB0aGlzLnNldERhdGFBcnJheShmaWx0ZXJlZERhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldERhdGFBcnJheSh0aGlzLmRhdGFSZXNwb25zZUFycmF5KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UXVpY2tGaWx0ZXJEYXRhRnJvbUFycmF5KHF1aWNrZmlsdGVyOiBzdHJpbmcsIGRhdGFBcnJheTogYW55W10pOiBhbnlbXSB7XG4gICAgbGV0IHJlc3VsdCA9IGRhdGFBcnJheTtcbiAgICBpZiAocXVpY2tmaWx0ZXIgJiYgcXVpY2tmaWx0ZXIubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY2FzZVNlbnNpdGl2ZSA9IHRoaXMuaXNGaWx0ZXJDYXNlU2Vuc2l0aXZlKCk7XG4gICAgICBjb25zdCBxdWlja0ZpbHRlckNvbHVtbnMgPSB0aGlzLmdldFF1aWNrRmlsdGVyQ29sdW1ucygpO1xuICAgICAgY29uc3QgcmVnRXhwU3RyID0gbmV3IFJlZ0V4cChVdGlsLmVzY2FwZVNwZWNpYWxDaGFyYWN0ZXIoVXRpbC5ub3JtYWxpemVTdHJpbmcocXVpY2tmaWx0ZXIsICFjYXNlU2Vuc2l0aXZlKSkpO1xuICAgICAgcmVzdWx0ID0gZGF0YUFycmF5LmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgcmV0dXJuIHF1aWNrRmlsdGVyQ29sdW1ucy5zb21lKGNvbCA9PiByZWdFeHBTdHIudGVzdChVdGlsLm5vcm1hbGl6ZVN0cmluZyhpdGVtW2NvbF0gKyAnJywgIWNhc2VTZW5zaXRpdmUpKSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRTb3J0ZWREYXRhRnJvbUFycmF5KGRhdGFBcnJheTogYW55W10pOiBhbnlbXSB7XG4gICAgcmV0dXJuIGRhdGFBcnJheTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXREYXRhKGRhdGE6IGFueSwgc3FsVHlwZXM/OiBhbnksIHJlcGxhY2U/OiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCFVdGlsLmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHRoaXMuc2V0RGF0YUFycmF5KFtdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRhUmVzcG9uc2VBcnJheSA9IHRoaXMucGFyc2VSZXNwb25zZUFycmF5KGRhdGEsIHJlcGxhY2UpO1xuICAgICAgaWYgKHRoaXMucGFnZWFibGUpIHtcbiAgICAgICAgdGhpcy5zZXREYXRhQXJyYXkodGhpcy5kYXRhUmVzcG9uc2VBcnJheSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZpbHRlckRhdGEoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMucGFnZWFibGUpIHtcbiAgICAgIE9ic2VydmFibGVXcmFwcGVyLmNhbGxFbWl0KHRoaXMub25QYWdpbmF0ZWREYXRhTG9hZGVkLCBkYXRhKTtcbiAgICB9XG4gICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5vbkRhdGFMb2FkZWQsIHRoaXMuZGF0YVJlc3BvbnNlQXJyYXkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlUmVzcG9uc2VBcnJheShkYXRhOiBhbnlbXSwgcmVwbGFjZT86IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWdpc3RlckZvcm1MYXlvdXRNYW5hZ2VyU3RhdGUoKSB7XG4gICAgaWYgKHRoaXMuc3RvcmVTdGF0ZSAmJiB0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyICYmIHRoaXMuZm9ybUxheW91dE1hbmFnZXIuaXNUYWJNb2RlKCkgJiYgdGhpcy5mb3JtTGF5b3V0TWFuYWdlci5vVGFiR3JvdXApIHtcbiAgICAgIGlmICghVXRpbC5pc0RlZmluZWQodGhpcy5mb3JtTGF5b3V0TWFuYWdlclRhYkluZGV4KSkge1xuICAgICAgICB0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyVGFiSW5kZXggPSB0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyLm9UYWJHcm91cC5kYXRhLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZGF0ZUNvbXBvbmVudFN0YXRlU3ViamVjdCA9ICh0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyLm9UYWJHcm91cCBhcyBPRm9ybUxheW91dFRhYkdyb3VwQ29tcG9uZW50KS51cGRhdGVUYWJDb21wb25lbnRzU3RhdGU7XG5cbiAgICAgIHRoaXMudGFic1N1YnNjcmlwdGlvbnMgPSB0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyLm9uU2VsZWN0ZWRUYWJDaGFuZ2Uuc3Vic2NyaWJlKChhcmcpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZm9ybUxheW91dE1hbmFnZXJUYWJJbmRleCA9PT0gYXJnLnByZXZpb3VzSW5kZXgpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlU3RvcmFnZSgpO1xuICAgICAgICAgIC8vIHNldHRpbmcgYWxyZWFkeVN0b3JlZCB0byBmYWxzZSB0byBmb3JjZSB0cmlnZ2VyaW5nIGEgbmV3IHN0b3JhZ2UgdXBkYXRlIGFmdGVyIHRoaXNcbiAgICAgICAgICB0aGlzLmFscmVhZHlTdG9yZWQgPSBmYWxzZTtcbiAgICAgICAgICBpZiAoYXJnLmluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICB1cGRhdGVDb21wb25lbnRTdGF0ZVN1YmplY3QubmV4dChhcmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoZWNrVmlld1BvcnRTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy50YWJzU3Vic2NyaXB0aW9ucy5hZGQodXBkYXRlQ29tcG9uZW50U3RhdGVTdWJqZWN0LnN1YnNjcmliZSgoYXJnKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyVGFiSW5kZXggPT09IGFyZy5pbmRleCkge1xuICAgICAgICAgIHRoaXMuY29tcG9uZW50U3RhdGVTZXJ2aWNlLmluaXRpYWxpemUodGhpcyk7XG4gICAgICAgICAgdGhpcy5hcHBseURlZmF1bHRDb25maWd1cmF0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgICAgdGhpcy50YWJzU3Vic2NyaXB0aW9ucy5hZGQodGhpcy5mb3JtTGF5b3V0TWFuYWdlci5vbkNsb3NlVGFiLnN1YnNjcmliZSgoYXJnKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyVGFiSW5kZXggPT09IGFyZy5pbmRleCkge1xuICAgICAgICAgIHRoaXMudXBkYXRlU3RhdGVTdG9yYWdlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcbiAgICB9XG4gIH1cblxuICBhcHBseURlZmF1bHRDb25maWd1cmF0aW9uKCkge1xuXG4gIH1cblxuICBwdWJsaWMgb25DaGFuZ2VQYWdlKGU6IFBhZ2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wYWdlYWJsZSkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IGUucGFnZUluZGV4O1xuICAgICAgdGhpcy5xdWVyeVJvd3MgPSBlLnBhZ2VTaXplO1xuICAgICAgdGhpcy5maWx0ZXJEYXRhKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGdvaW5nQmFjayA9IGUucGFnZUluZGV4IDwgdGhpcy5jdXJyZW50UGFnZTtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gZS5wYWdlSW5kZXg7XG4gICAgY29uc3QgcGFnZVNpemUgPSBlLnBhZ2VTaXplO1xuXG4gICAgY29uc3Qgb2xkUXVlcnlSb3dzID0gdGhpcy5xdWVyeVJvd3M7XG4gICAgY29uc3QgY2hhbmdpbmdQYWdlU2l6ZSA9IChvbGRRdWVyeVJvd3MgIT09IHBhZ2VTaXplKTtcbiAgICB0aGlzLnF1ZXJ5Um93cyA9IHBhZ2VTaXplO1xuXG4gICAgbGV0IG5ld1N0YXJ0UmVjb3JkO1xuICAgIGxldCBxdWVyeUxlbmd0aDtcblxuICAgIGlmIChnb2luZ0JhY2sgfHwgY2hhbmdpbmdQYWdlU2l6ZSkge1xuICAgICAgbmV3U3RhcnRSZWNvcmQgPSAodGhpcy5jdXJyZW50UGFnZSAqIHRoaXMucXVlcnlSb3dzKTtcbiAgICAgIHF1ZXJ5TGVuZ3RoID0gdGhpcy5xdWVyeVJvd3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld1N0YXJ0UmVjb3JkID0gTWF0aC5tYXgodGhpcy5zdGF0ZS5xdWVyeVJlY29yZE9mZnNldCwgKHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnF1ZXJ5Um93cykpO1xuICAgICAgY29uc3QgbmV3RW5kUmVjb3JkID0gTWF0aC5taW4obmV3U3RhcnRSZWNvcmQgKyB0aGlzLnF1ZXJ5Um93cywgdGhpcy5zdGF0ZS50b3RhbFF1ZXJ5UmVjb3Jkc051bWJlcik7XG4gICAgICBxdWVyeUxlbmd0aCA9IHRoaXMuZGlzYWJsZVBhZ2VTaXplQ2FsY3VsYXRpb24gPyB0aGlzLnF1ZXJ5Um93cyA6IE1hdGgubWluKHRoaXMucXVlcnlSb3dzLCBuZXdFbmRSZWNvcmQgLSBuZXdTdGFydFJlY29yZCk7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlBcmdzOiBPUXVlcnlEYXRhQXJncyA9IHtcbiAgICAgIG9mZnNldDogbmV3U3RhcnRSZWNvcmQsXG4gICAgICBsZW5ndGg6IHF1ZXJ5TGVuZ3RoLFxuICAgICAgcmVwbGFjZTogdHJ1ZVxuICAgIH07XG4gICAgdGhpcy5xdWVyeURhdGEodm9pZCAwLCBxdWVyeUFyZ3MpO1xuICB9XG5cbiAgc2V0IGN1cnJlbnRQYWdlKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5fY3VycmVudFBhZ2UgPSB2YWw7XG4gIH1cblxuICBnZXQgY3VycmVudFBhZ2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFBhZ2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2N1cnJlbnRQYWdlOiBudW1iZXIgPSAwO1xuXG5cbiAgZ2V0IHRvdGFsUmVjb3JkcygpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLnBhZ2VhYmxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRUb3RhbFJlY29yZHNOdW1iZXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGF0YVJlc3BvbnNlQXJyYXkubGVuZ3RoO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFBhZ2luYXRpb25EYXRhRnJvbUFycmF5KGRhdGFBcnJheTogYW55W10pOiBhbnlbXSB7XG4gICAgbGV0IHJlc3VsdCA9IGRhdGFBcnJheTtcbiAgICBpZiAodGhpcy5wYWdpbmF0aW9uQ29udHJvbHMpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5zcGxpY2UodGhpcy5jdXJyZW50UGFnZSAqIHRoaXMucXVlcnlSb3dzLCB0aGlzLnF1ZXJ5Um93cyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBoYW5kbGVJdGVtQ2xpY2soaXRlbTogSXRlbUNsaWNrKTogdm9pZCB7XG4gICAgdGhpcy5jbGlja1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuY2xpY2tQcmV2ZW50KSB7XG4gICAgICAgIHRoaXMuaXRlbUNsaWNrRG9uZShpdGVtKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2xpY2tQcmV2ZW50ID0gZmFsc2U7XG4gICAgfSwgdGhpcy5jbGlja0RlbGF5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpdGVtQ2xpY2tEb25lKGl0ZW06IEl0ZW1DbGljayk6IHZvaWQge1xuICAgIGlmICghdGhpcy5vZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gaXRlbS5nZXRJdGVtRGF0YSgpO1xuICAgIGlmICh0aGlzLmRldGFpbE1vZGUgPT09IENvZGVzLkRFVEFJTF9NT0RFX0NMSUNLKSB7XG4gICAgICB0aGlzLnNhdmVEYXRhTmF2aWdhdGlvbkluTG9jYWxTdG9yYWdlKCk7XG4gICAgICB0aGlzLnZpZXdEZXRhaWwoZGF0YSk7XG4gICAgfVxuICAgIHRoaXMub25DbGljay5lbWl0KGRhdGEpO1xuICB9XG5cbiAgaGFuZGxlSXRlbURibENsaWNrKGl0ZW06IEl0ZW1DbGljayk6IHZvaWQge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmNsaWNrVGltZXIpO1xuICAgIHRoaXMuY2xpY2tQcmV2ZW50ID0gdHJ1ZTtcbiAgICB0aGlzLml0ZW1EYmxDbGlja0RvbmUoaXRlbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXRlbURibENsaWNrRG9uZShpdGVtOiBJdGVtQ2xpY2spOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMub2VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGF0YSA9IGl0ZW0uZ2V0SXRlbURhdGEoKTtcbiAgICBpZiAoQ29kZXMuaXNEb3VibGVDbGlja01vZGUodGhpcy5kZXRhaWxNb2RlKSkge1xuICAgICAgdGhpcy5zYXZlRGF0YU5hdmlnYXRpb25JbkxvY2FsU3RvcmFnZSgpO1xuICAgICAgdGhpcy52aWV3RGV0YWlsKGRhdGEpO1xuICAgIH1cbiAgICB0aGlzLm9uRG91YmxlQ2xpY2suZW1pdChkYXRhKTtcbiAgfVxuXG4gIGdldCBxdWlja0ZpbHRlckFwcGVhcmFuY2UoKTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSB7XG4gICAgcmV0dXJuIHRoaXMuX3F1aWNrRmlsdGVyQXBwZWFyYW5jZTtcbiAgfVxuXG4gIHNldCBxdWlja0ZpbHRlckFwcGVhcmFuY2UodmFsdWU6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBbJ2ZpbGwnLCAnb3V0bGluZSddO1xuICAgIGlmICh2YWx1ZXMuaW5kZXhPZih2YWx1ZSkgPT09IC0xKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1RoZSBxdWljay1maWx0ZXItYXBwZWFyYW5jZSBhdHRyaWJ1dGUgaXMgdW5kZWZpbmVkIHNvIHRoZSBvdXRsaW5lIHZhbHVlIHdpbGwgYmUgdXNlZCcpO1xuICAgICAgdmFsdWUgPSAnb3V0bGluZSc7XG4gICAgfVxuICAgIHRoaXMuX3F1aWNrRmlsdGVyQXBwZWFyYW5jZSA9IHZhbHVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFNxbFR5cGVzT2ZLZXlzKCkge1xuICAgIGNvbnN0IHNxbFR5cGVzID0gdGhpcy5nZXRTcWxUeXBlcygpO1xuICAgIGNvbnN0IHNxbFR5cGVzQXJnID0ge307XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHNxbFR5cGVzKSkge1xuICAgICAgdGhpcy5rZXlzQXJyYXkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBzcWxUeXBlc0FyZ1trZXldID0gc3FsVHlwZXNba2V5XTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gc3FsVHlwZXNBcmc7XG5cbiAgfVxuXG4gIGNvbXBhcmVSb3coKTogKChvMTogYW55LCBvMjogYW55KSA9PiBib29sZWFuKSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIChvMTogYW55LCBvMjogYW55KSA9PiAgdGhpcy5rZXlzQXJyYXkuZXZlcnkoa2V5ID0+IG8xW2tleV0gPT09IG8yW2tleV0pO1xuICB9XG59XG5cbi8qVGhpcyBjbGFzcyBpcyBkZWZpbmllZCB0byBtYW50YWluIGJhY3dhcmRzIGNvbXBhdGliaWxpdHkgKi9cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGNsYXNzIE9TZXJ2aWNlQ29tcG9uZW50IGV4dGVuZHMgQWJzdHJhY3RPU2VydmljZUNvbXBvbmVudDxEZWZhdWx0U2VydmljZUNvbXBvbmVudFN0YXRlU2VydmljZT4ge1xuXG59XG4iXX0=
879
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1zZXJ2aWNlLWNvbXBvbmVudC5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL28tc2VydmljZS1jb21wb25lbnQuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdHLE9BQU8sRUFBRSxZQUFZLEVBQWEsTUFBTSw2QkFBNkIsQ0FBQztBQUV0RSxPQUFPLEVBQUUsZUFBZSxFQUE0QixNQUFNLE1BQU0sQ0FBQztBQUdqRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUNsRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUV4RixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUMxRyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUVyRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUdqRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUc5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFJaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsS0FBSyxFQUFF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QUFDLHFCQUFxQixFQUFFOztxRUFDVztBQUNuQztJQUFDLHFCQUFxQixFQUFFOzs2RUFDb0I7QUErQjVDO0lBQUMscUJBQXFCLEVBQUU7O2tFQUNtQjs0RkE1RXZCLHlCQUF5QjtrQkFKOUMsU0FBUzttQkFBQztvQkFDVCxNQUFNLEVBQUUsa0NBQWtDO29CQUMxQyxPQUFPLEVBQUUsbUNBQW1DO2lCQUM3QztxSkFJMEIsWUFBWTtzQkFBcEMsU0FBUzt1QkFBQyxZQUFZO2dCQWtCYixRQUFRLE1BRVIsUUFBUSxNQUVSLFFBQVEsTUFJUixlQUFlLE1BRXpCLGlCQUFpQixNQUlQLGFBQWEsTUFFdkIsZUFBZSxNQUdmLFlBQVksTUFFWixrQkFBa0IsTUFFbEIsMEJBQTBCLE1BZ0NoQixlQUFlLE1BcURsQixvQkFBb0I7c0JBRDFCLFNBQVM7dUJBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMscUJBQXFCLENBQUMsQ0FBQzs7QUFpeEJ0RCxNQUFNLE9BQU8saUJBQWtCLFNBQVEseUJBQThEOzsrR0FBeEYsaUJBQWlCO21HQUFqQixpQkFBaUI7NEZBQWpCLGlCQUFpQjtrQkFEN0IsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLCBJbmplY3RvciwgTmdab25lLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdFBhZ2luYXRvciwgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IE9GaWx0ZXJCdWlsZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9maWx0ZXItYnVpbGRlci9vLWZpbHRlci1idWlsZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPU2VhcmNoSW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2lucHV0L3NlYXJjaC1pbnB1dC9vLXNlYXJjaC1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQm9vbGVhbkNvbnZlcnRlciwgQm9vbGVhbklucHV0Q29udmVydGVyIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9pbnB1dC1jb252ZXJ0ZXInO1xuaW1wb3J0IHsgSVNlcnZpY2VEYXRhQ29tcG9uZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9zZXJ2aWNlLWRhdGEtY29tcG9uZW50LmludGVyZmFjZSc7XG5pbXBvcnQgeyBPRm9ybUxheW91dERpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL2xheW91dHMvZm9ybS1sYXlvdXQvZGlhbG9nL28tZm9ybS1sYXlvdXQtZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPRm9ybUxheW91dE1hbmFnZXJDb21wb25lbnQgfSBmcm9tICcuLi9sYXlvdXRzL2Zvcm0tbGF5b3V0L28tZm9ybS1sYXlvdXQtbWFuYWdlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgT0Zvcm1MYXlvdXRUYWJHcm91cENvbXBvbmVudCB9IGZyb20gJy4uL2xheW91dHMvZm9ybS1sYXlvdXQvdGFiZ3JvdXAvby1mb3JtLWxheW91dC10YWJncm91cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9uYXZpZ2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGVybWlzc2lvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcGVybWlzc2lvbnMvcGVybWlzc2lvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBBYnN0cmFjdFNlcnZpY2VDb21wb25lbnRTdGF0ZUNsYXNzIH0gZnJvbSAnLi4vc2VydmljZXMvc3RhdGUvby1jb21wb25lbnQtc3RhdGUuY2xhc3MnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb21wb25lbnRTdGF0ZVNlcnZpY2UsIERlZmF1bHRTZXJ2aWNlQ29tcG9uZW50U3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvc3RhdGUvby1jb21wb25lbnQtc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBPVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3RyYW5zbGF0ZS9vLXRyYW5zbGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IE9QZXJtaXNzaW9ucyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IEV4cHJlc3Npb24gfSBmcm9tICcuLi90eXBlcy9leHByZXNzaW9uLnR5cGUnO1xuaW1wb3J0IHsgT19HTE9CQUxfQ09ORklHIH0gZnJvbSAnLi4vdHlwZXMvby1nbG9iYWwtY29uZmlnLnR5cGUnO1xuaW1wb3J0IHsgT0xpc3RJbml0aWFsaXphdGlvbk9wdGlvbnMgfSBmcm9tICcuLi90eXBlcy9vLWxpc3QtaW5pdGlhbGl6YXRpb24tb3B0aW9ucy50eXBlJztcbmltcG9ydCB7IE9RdWVyeURhdGFBcmdzIH0gZnJvbSAnLi4vdHlwZXMvcXVlcnktZGF0YS1hcmdzLnR5cGUnO1xuaW1wb3J0IHsgT1RhYmxlSW5pdGlhbGl6YXRpb25PcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMvdGFibGUvby10YWJsZS1pbml0aWFsaXphdGlvbi1vcHRpb25zLnR5cGUnO1xuaW1wb3J0IHsgUGVybWlzc2lvbnNVdGlscyB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZVdyYXBwZXIgfSBmcm9tICcuLi91dGlsL2FzeW5jJztcbmltcG9ydCB7IENvZGVzIH0gZnJvbSAnLi4vdXRpbC9jb2Rlcyc7XG5pbXBvcnQgeyBGaWx0ZXJFeHByZXNzaW9uVXRpbHMgfSBmcm9tICcuLi91dGlsL2ZpbHRlci1leHByZXNzaW9uLnV0aWxzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IHsgT0Zvcm1Db21wb25lbnQgfSBmcm9tICcuL2Zvcm0vby1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBYnN0cmFjdE9TZXJ2aWNlQmFzZUNvbXBvbmVudCwgREVGQVVMVF9JTlBVVFNfT19TRVJWSUNFX0JBU0VfQ09NUE9ORU5UIH0gZnJvbSAnLi9vLXNlcnZpY2UtYmFzZS1jb21wb25lbnQuY2xhc3MnO1xuaW1wb3J0IHsgT0Zvcm1MYXlvdXRNYW5hZ2VyQmFzZSB9IGZyb20gJy4uL2xheW91dHMvZm9ybS1sYXlvdXQvby1mb3JtLWxheW91dC1tYW5hZ2VyLWJhc2UuY2xhc3MnO1xuaW1wb3J0IHsgT0Zvcm1MYXlvdXRNYW5hZ2VyQ29udGV4dCB9IGZyb20gJy4uL3R5cGVzL2Zvcm0tbGF5b3V0LW1hbmFnZXItY29udGV4dC50eXBlJztcbmltcG9ydCB7IE9Gb3JtTGF5b3V0TWFuYWdlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9vLWZvcm0tbGF5b3V0LW1hbmFnZXIuc2VydmljZSc7XG5cbmludGVyZmFjZSBJdGVtQ2xpY2sge1xuICBnZXRJdGVtRGF0YSgpOiBhbnlcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfSU5QVVRTX09fU0VSVklDRV9DT01QT05FTlQgPSBbXG4gIC4uLkRFRkFVTFRfSU5QVVRTX09fU0VSVklDRV9CQVNFX0NPTVBPTkVOVCxcblxuICAnX3RpdGxlOiB0aXRsZScsXG5cbiAgLy8gdmlzaWJsZSBbbm98eWVzXTogdmlzaWJpbGl0eS4gRGVmYXVsdDogeWVzLlxuICAnb3Zpc2libGU6IHZpc2libGUnLFxuXG4gIC8vIGVuYWJsZWQgW25vfHllc106IGVkaXRhYmlsaXR5LiBEZWZhdWx0OiB5ZXMuXG4gICdvZW5hYmxlZDogZW5hYmxlZCcsXG5cbiAgLy8gY29udHJvbHMgW3N0cmluZ11beWVzfG5vfHRydWV8ZmFsc2VdOlxuICAnY29udHJvbHMnLFxuXG4gIC8vIGRldGFpbC1tb2RlIFtub25lfGNsaWNrfGRvdWJsZWNsaWNrXTogd2F5IHRvIG9wZW4gdGhlIGRldGFpbCBmb3JtIG9mIGEgcm93LiBEZWZhdWx0OiAnY2xpY2snLlxuICAnZGV0YWlsTW9kZTogZGV0YWlsLW1vZGUnLFxuXG4gIC8vIGRldGFpbC1mb3JtLXJvdXRlIFtzdHJpbmddOiByb3V0ZSBvZiBkZXRhaWwgZm9ybS4gRGVmYXVsdDogJ2RldGFpbCcuXG4gICdkZXRhaWxGb3JtUm91dGU6IGRldGFpbC1mb3JtLXJvdXRlJyxcblxuICAvLyByZWN1cnNpdmUtZGV0YWlsIFtub3x5ZXNdOiBkbyBub3QgYXBwZW5kIGRldGFpbCBrZXlzIHdoZW4gbmF2aWdhdGUgKG92ZXJ3cml0ZSBjdXJyZW50KS4gRGVmYXVsdDogbm8uXG4gICdyZWN1cnNpdmVEZXRhaWw6IHJlY3Vyc2l2ZS1kZXRhaWwnLFxuXG4gIC8vIGRldGFpbC1idXR0b24taW4tcm93IFtub3x5ZXNdOiBhZGRpbmcgYSBidXR0b24gaW4gcm93IGZvciBvcGVuaW5nIGRldGFpbCBmb3JtLiBEZWZhdWx0OiB5ZXMuXG4gICdkZXRhaWxCdXR0b25JblJvdzogZGV0YWlsLWJ1dHRvbi1pbi1yb3cnLFxuXG4gIC8vIGRldGFpbC1idXR0b24taW4tcm93LWljb24gW3N0cmluZ106IG1hdGVyaWFsIGljb24uIERlZmF1bHQ6IG1vZGVfZWRpdC5cbiAgJ2RldGFpbEJ1dHRvbkluUm93SWNvbjogZGV0YWlsLWJ1dHRvbi1pbi1yb3ctaWNvbicsXG5cbiAgLy8gZWRpdC1mb3JtLXJvdXRlIFtzdHJpbmddOiByb3V0ZSBvZiBlZGl0IGZvcm0uIERlZmF1bHQ6ICdlZGl0Jy5cbiAgJ2VkaXRGb3JtUm91dGU6IGVkaXQtZm9ybS1yb3V0ZScsXG5cbiAgLy8gcmVjdXJzaXZlLWVkaXQgW25vfHllc106IGRvIG5vdCBhcHBlbmQgZGV0YWlsIGtleXMgd2hlbiBuYXZpZ2F0ZSAob3ZlcndyaXRlIGN1cnJlbnQpLiBEZWZhdWx0OiBuby5cbiAgJ3JlY3Vyc2l2ZUVkaXQ6IHJlY3Vyc2l2ZS1lZGl0JyxcblxuICAvLyBlZGl0LWJ1dHRvbi1pbi1yb3cgW25vfHllc106IGFkZGluZyBhIGJ1dHRvbiBpbiByb3cgZm9yIG9wZW5pbmcgZWRpdGlvbiBmb3JtLiBEZWZhdWx0OiBuby5cbiAgJ2VkaXRCdXR0b25JblJvdzogZWRpdC1idXR0b24taW4tcm93JyxcblxuICAvLyBlZGl0LWJ1dHRvbi1pbi1yb3ctaWNvbiBbc3RyaW5nXTogbWF0ZXJpYWwgaWNvbi4gRGVmYXVsdDogc2VhcmNoLlxuICAnZWRpdEJ1dHRvbkluUm93SWNvbjogZWRpdC1idXR0b24taW4tcm93LWljb24nLFxuXG4gIC8vIGluc2VydC1idXR0b24gW25vfHllc106IHNob3cgaW5zZXJ0IGJ1dHRvbi4gRGVmYXVsdDogeWVzLlxuICAnaW5zZXJ0QnV0dG9uOiBpbnNlcnQtYnV0dG9uJyxcblxuICAvLyByb3ctaGVpZ2h0IFtzbWFsbCB8IG1lZGl1bSB8IGxhcmdlXVxuICAncm93SGVpZ2h0IDogcm93LWhlaWdodCcsXG5cbiAgLy8gaW5zZXJ0LWZvcm0tcm91dGUgW3N0cmluZ106IHJvdXRlIG9mIGluc2VydCBmb3JtLiBEZWZhdWx0OlxuICAnaW5zZXJ0Rm9ybVJvdXRlOiBpbnNlcnQtZm9ybS1yb3V0ZScsXG5cbiAgLy8gcmVjdXJzaXZlLWluc2VydCBbbm98eWVzXTogZG8gbm90IGFwcGVuZCBpbnNlcnQga2V5cyB3aGVuIG5hdmlnYXRlIChvdmVyd3JpdGUgY3VycmVudCkuIERlZmF1bHQ6IG5vLlxuICAncmVjdXJzaXZlSW5zZXJ0OiByZWN1cnNpdmUtaW5zZXJ0JyxcblxuICAvLyBmaWx0ZXIgW3llc3xub3x0cnVlfGZhbHNlXTogd2hldGhlciBmaWx0ZXIgaXMgY2FzZSBzZW5zaXRpdmUuIERlZmF1bHQ6IG5vLlxuICAnZmlsdGVyQ2FzZVNlbnNpdGl2ZTogZmlsdGVyLWNhc2Utc2Vuc2l0aXZlJyxcblxuICAvLyBxdWljay1maWx0ZXIgW25vfHllc106IHNob3cgcXVpY2sgZmlsdGVyLiBEZWZhdWx0OiB5ZXMuXG4gICdxdWlja0ZpbHRlcjogcXVpY2stZmlsdGVyJyxcblxuICAvLyBxdWljay1maWx0ZXItcGxhY2Vob2xkZXI6IHF1aWNrIGZpbHRlciBwbGFjZWhvbGRlclxuICAncXVpY2tGaWx0ZXJQbGFjZWhvbGRlcjogcXVpY2stZmlsdGVyLXBsYWNlaG9sZGVyJyxcblxuICAvLyBwYWdpbmF0aW9uLWNvbnRyb2xzIFt5ZXN8bm98dHJ1ZXxmYWxzZV06IHNob3cgcGFnaW5hdGlvbiBjb250cm9scy4gRGVmYXVsdDogeWVzLlxuICAncGFnaW5hdGlvbkNvbnRyb2xzOiBwYWdpbmF0aW9uLWNvbnRyb2xzJyxcblxuICAvLyBwYWdlLXNpemUtb3B0aW9ucyBbc3RyaW5nXTogUGFnZSBzaXplIG9wdGlvbnMgc2VwYXJhdGVkIGJ5ICc7Jy5cbiAgJ3BhZ2VTaXplT3B0aW9uczogcGFnZS1zaXplLW9wdGlvbnMnLFxuXG4gIC8vcXVpY2tGaWx0ZXJBcHBlYXJhbmNlW2xlZ2FjeXxzdGFuZGFyZHxmaWxsfG91dGxpbmVdIEluZGljYXRlcyB3aGljaCBvZiB0aGUgbWF0LWZvcm0tZmllbGQgZGlmZmVyZW50IGFwcGVhcmFuY2UgdmFyaWFudHMgd2lsbCBiZSB1c2VkLiBEZWZhdWx0OiBvdXRsaW5lXG4gICdxdWlja0ZpbHRlckFwcGVhcmFuY2U6cXVpY2stZmlsdGVyLWFwcGVhcmFuY2UnLFxuXG4gICdkaXNhYmxlUGFnZVNpemVDYWxjdWxhdGlvbjogZGlzYWJsZS1wYWdlLXNpemUtY2FsY3VsYXRpb24nXG5dO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9PVVRQVVRTX09fU0VSVklDRV9DT01QT05FTlQgPSBbXG4gICdvbkNsaWNrJyxcbiAgJ29uRG91YmxlQ2xpY2snLFxuICAnb25EYXRhTG9hZGVkJyxcbiAgJ29uUGFnaW5hdGVkRGF0YUxvYWRlZCcsXG4gICdvblNlYXJjaCdcbl1cblxuQERpcmVjdGl2ZSh7XG4gIGlucHV0czogREVGQVVMVF9JTlBVVFNfT19TRVJWSUNFX0NPTVBPTkVOVCxcbiAgb3V0cHV0czogREVGQVVMVF9PVVRQVVRTX09fU0VSVklDRV9DT01QT05FTlRcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPU2VydmljZUNvbXBvbmVudDxUIGV4dGVuZHMgQWJzdHJhY3RDb21wb25lbnRTdGF0ZVNlcnZpY2U8QWJzdHJhY3RTZXJ2aWNlQ29tcG9uZW50U3RhdGVDbGFzcz4+XG4gIGV4dGVuZHMgQWJzdHJhY3RPU2VydmljZUJhc2VDb21wb25lbnQ8VD5cbiAgaW1wbGVtZW50cyBJU2VydmljZURhdGFDb21wb25lbnQge1xuICBAVmlld0NoaWxkKE1hdFBhZ2luYXRvcikgbWF0cGFnaW5hdG9yOiBNYXRQYWdpbmF0b3I7XG5cbiAgcHJvdGVjdGVkIHBlcm1pc3Npb25zU2VydmljZTogUGVybWlzc2lvbnNTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgdHJhbnNsYXRlU2VydmljZTogT1RyYW5zbGF0ZVNlcnZpY2U7XG4gIHByb3RlY3RlZCBuYXZpZ2F0aW9uU2VydmljZTogTmF2aWdhdGlvblNlcnZpY2U7XG5cbiAgLyogaW5wdXRzIHZhcmlhYmxlcyAqL1xuICBzZXQgdGl0bGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90aXRsZSA9IHZhbDtcbiAgfVxuICBnZXQgdGl0bGUoKTogc3RyaW5nIHtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5fdGl0bGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldCh0aGlzLl90aXRsZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl90aXRsZTtcbiAgfVxuICBwcm90ZWN0ZWQgX3RpdGxlOiBzdHJpbmc7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBwcm90ZWN0ZWQgb3Zpc2libGU6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcHJvdGVjdGVkIG9lbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHByb3RlY3RlZCBjb250cm9sczogYm9vbGVhbiA9IHRydWU7XG4gIHB1YmxpYyBkZXRhaWxNb2RlOiBzdHJpbmcgPSBDb2Rlcy5ERVRBSUxfTU9ERV9DTElDSztcbiAgcHJvdGVjdGVkIGRldGFpbEZvcm1Sb3V0ZTogc3RyaW5nO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcHJvdGVjdGVkIHJlY3Vyc2l2ZURldGFpbDogYm9vbGVhbiA9IGZhbHNlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgZGV0YWlsQnV0dG9uSW5Sb3c6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZGV0YWlsQnV0dG9uSW5Sb3dJY29uOiBzdHJpbmcgPSBDb2Rlcy5ERVRBSUxfSUNPTjtcbiAgcHJvdGVjdGVkIGVkaXRGb3JtUm91dGU6IHN0cmluZztcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHByb3RlY3RlZCByZWN1cnNpdmVFZGl0OiBib29sZWFuID0gZmFsc2U7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBlZGl0QnV0dG9uSW5Sb3c6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZWRpdEJ1dHRvbkluUm93SWNvbjogc3RyaW5nID0gQ29kZXMuRURJVF9JQ09OO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgaW5zZXJ0QnV0dG9uOiBib29sZWFuO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcGFnaW5hdGlvbkNvbnRyb2xzOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGRpc2FibGVQYWdlU2l6ZUNhbGN1bGF0aW9uOiBib29sZWFuID0gZmFsc2U7XG5cbiAgZ2V0IHBhZ2VTaXplT3B0aW9ucygpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VTaXplT3B0aW9ucztcbiAgfVxuXG4gIHNldCBwYWdlU2l6ZU9wdGlvbnModmFsOiBudW1iZXJbXSkge1xuICAgIGlmICghKHZhbCBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgdmFsID0gVXRpbC5wYXJzZUFycmF5KFN0cmluZyh2YWwpKS5tYXAoYSA9PiBwYXJzZUludChhLCAxMCkpO1xuICAgIH1cbiAgICB0aGlzLl9wYWdlU2l6ZU9wdGlvbnMgPSB2YWw7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3Jvd0hlaWdodCA9IENvZGVzLkRFRkFVTFRfUk9XX0hFSUdIVDtcbiAgcHJvdGVjdGVkIHJvd0hlaWdodFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0aGlzLl9yb3dIZWlnaHQpO1xuICBwdWJsaWMgcm93SGVpZ2h0T2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGhpcy5yb3dIZWlnaHRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHByb3RlY3RlZCBjaGVja1ZpZXdQb3J0U3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIHB1YmxpYyBjaGVja1ZpZXdQb3J0T2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuY2hlY2tWaWV3UG9ydFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgc2V0IHJvd0hlaWdodCh2YWx1ZSkge1xuICAgIHRoaXMuX3Jvd0hlaWdodCA9IHZhbHVlID8gdmFsdWUudG9Mb3dlckNhc2UoKSA6IHZhbHVlO1xuICAgIGlmICghQ29kZXMuaXNWYWxpZFJvd0hlaWdodCh0aGlzLl9yb3dIZWlnaHQpKSB7XG4gICAgICB0aGlzLl9yb3dIZWlnaHQgPSBDb2Rlcy5ERUZBVUxUX1JPV19IRUlHSFQ7XG4gICAgfVxuICAgIHRoaXMucm93SGVpZ2h0U3ViamVjdC5uZXh0KHRoaXMuX3Jvd0hlaWdodCk7XG4gIH1cbiAgZ2V0IHJvd0hlaWdodCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9yb3dIZWlnaHQ7XG4gIH1cbiAgcHJvdGVjdGVkIGluc2VydEZvcm1Sb3V0ZTogc3RyaW5nO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcHJvdGVjdGVkIHJlY3Vyc2l2ZUluc2VydDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByb3RlY3RlZCBfZmlsdGVyQ2FzZVNlbnNpdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBzZXQgZmlsdGVyQ2FzZVNlbnNpdGl2ZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2ZpbHRlckNhc2VTZW5zaXRpdmUgPSBCb29sZWFuQ29udmVydGVyKHZhbHVlKTtcbiAgfVxuICBnZXQgZmlsdGVyQ2FzZVNlbnNpdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyQ2FzZVNlbnNpdGl2ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfcXVpY2tGaWx0ZXI6IGJvb2xlYW4gPSB0cnVlO1xuICBnZXQgcXVpY2tGaWx0ZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3F1aWNrRmlsdGVyO1xuICB9XG4gIHNldCBxdWlja0ZpbHRlcih2YWw6IGJvb2xlYW4pIHtcbiAgICB2YWwgPSBVdGlsLnBhcnNlQm9vbGVhbihTdHJpbmcodmFsKSk7XG4gICAgdGhpcy5fcXVpY2tGaWx0ZXIgPSB2YWw7XG4gICAgaWYgKHZhbCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlZ2lzdGVyUXVpY2tGaWx0ZXIodGhpcy5zZWFyY2hJbnB1dENvbXBvbmVudCksIDApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBxdWlja0ZpbHRlclBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcbiAgLyogZW5kIG9mIGlucHV0cyB2YXJpYWJsZXMgKi9cblxuICAvKiBvdXRwdXRzIHZhcmlhYmxlcyAqL1xuICBwdWJsaWMgb25DbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHB1YmxpYyBvbkRvdWJsZUNsaWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcHVibGljIG9uRGF0YUxvYWRlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHB1YmxpYyBvblBhZ2luYXRlZERhdGFMb2FkZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgb25TZWFyY2g6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAvKiBlbmQgb2Ygb3V0cHV0cyB2YXJpYWJsZXMgKi9cblxuICBwdWJsaWMgZmlsdGVyQnVpbGRlcjogT0ZpbHRlckJ1aWxkZXJDb21wb25lbnQ7XG4gIHByb3RlY3RlZCBfc2VsZWN0aW9uOiBTZWxlY3Rpb25Nb2RlbDxhbnk+O1xuXG4gIGdldCBzZWxlY3Rpb24oKSB7XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZCh0aGlzLl9zZWxlY3Rpb24pKSB7XG4gICAgICB0aGlzLl9zZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uTW9kZWw8YW55Pih0cnVlLCBbXSwgdHJ1ZSwgdGhpcy5jb21wYXJlUm93KCkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uVHJpZ2dlclVwZGF0ZVN1YnNjcmlwdGlvbjogYW55O1xuICBwcm90ZWN0ZWQgZm9ybUxheW91dE1hbmFnZXI6IE9Gb3JtTGF5b3V0TWFuYWdlckJhc2U7XG4gIHByb3RlY3RlZCBmb3JtTGF5b3V0TWFuYWdlclRhYkluZGV4OiBudW1iZXI7XG4gIHB1YmxpYyBvRm9ybUxheW91dERpYWxvZzogT0Zvcm1MYXlvdXREaWFsb2dDb21wb25lbnQ7XG5cbiAgcHJvdGVjdGVkIHRhYnNTdWJzY3JpcHRpb25zOiBhbnk7XG5cbiAgcHVibGljIHF1aWNrRmlsdGVyQ29tcG9uZW50OiBPU2VhcmNoSW5wdXRDb21wb25lbnQ7XG5cbiAgQFZpZXdDaGlsZCgoZm9yd2FyZFJlZigoKSA9PiBPU2VhcmNoSW5wdXRDb21wb25lbnQpKSlcbiAgcHVibGljIHNlYXJjaElucHV0Q29tcG9uZW50OiBPU2VhcmNoSW5wdXRDb21wb25lbnQ7XG5cbiAgcHJvdGVjdGVkIHF1aWNrRmlsdGVyQ29sQXJyYXk6IHN0cmluZ1tdO1xuXG4gIHByb3RlY3RlZCBkYXRhUmVzcG9uc2VBcnJheTogYW55W10gPSBbXTtcbiAgcHJvdGVjdGVkIHF1aWNrRmlsdGVyU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIF9wYWdlU2l6ZU9wdGlvbnMgPSBDb2Rlcy5QQUdFX1NJWkVfT1BUSU9OUztcblxuICBwcm90ZWN0ZWQgY2xpY2tUaW1lcjtcbiAgcHJvdGVjdGVkIGNsaWNrRGVsYXkgPSAyMDA7XG4gIHByb3RlY3RlZCBjbGlja1ByZXZlbnQgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9xdWlja0ZpbHRlckFwcGVhcmFuY2U6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UgPSAnb3V0bGluZSc7XG5cbiAgcHJpdmF0ZSBtdXRhdGlvbk9ic2VydmVyczogTXV0YXRpb25PYnNlcnZlcltdID0gW107XG4gIHB1YmxpYyBlbmFibGVkSW5zZXJ0QnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcbiAgcHVibGljIGVuYWJsZWRSZWZyZXNoQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJvdGVjdGVkIGVsUmVmOiBFbGVtZW50UmVmLFxuICAgIHByb3RlY3RlZCBmb3JtOiBPRm9ybUNvbXBvbmVudFxuICApIHtcbiAgICBzdXBlcihpbmplY3Rvcik7XG4gICAgdGhpcy5wZXJtaXNzaW9uc1NlcnZpY2UgPSB0aGlzLmluamVjdG9yLmdldChQZXJtaXNzaW9uc1NlcnZpY2UpO1xuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KE9UcmFuc2xhdGVTZXJ2aWNlKTtcbiAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlID0gdGhpcy5pbmplY3Rvci5nZXQoTmF2aWdhdGlvblNlcnZpY2UpO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyID0gdGhpcy5pbmplY3Rvci5nZXQoT0Zvcm1MYXlvdXRNYW5hZ2VyQ29tcG9uZW50KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBubyBwYXJlbnQgZm9ybSBsYXlvdXQgbWFuYWdlclxuICAgIH1cbiAgICB0cnkge1xuICAgICAgdGhpcy5vRm9ybUxheW91dERpYWxvZyA9IHRoaXMuaW5qZWN0b3IuZ2V0KE9Gb3JtTGF5b3V0RGlhbG9nQ29tcG9uZW50KTtcbiAgICAgIHRoaXMuZm9ybUxheW91dE1hbmFnZXIgPSB0aGlzLm9Gb3JtTGF5b3V0RGlhbG9nLmZvcm1MYXlvdXRNYW5hZ2VyO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIG5vIHBhcmVudCBmb3JtIGxheW91dCBtYW5hZ2VyXG4gICAgfVxuICAgIHRoaXMuZ2V0R2xvYmFsSW5qZWN0aW9uVG9rZW5Db25maWcoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0R2xvYmFsSW5qZWN0aW9uVG9rZW5Db25maWcoKSB7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb0dsb2JhbENvbmZpZyA9IHRoaXMuaW5qZWN0b3IuZ2V0KE9fR0xPQkFMX0NPTkZJRyk7XG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQob0dsb2JhbENvbmZpZy5zdG9yZVN0YXRlKSkge1xuICAgICAgICB0aGlzLnN0b3JlU3RhdGUgPSBvR2xvYmFsQ29uZmlnLnN0b3JlU3RhdGU7XG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIERvIG5vdGhpbmcgYmVjYXVzZSBpcyBvcHRpb25hbFxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcbiAgICBpZiAodGhpcy5kZXRhaWxCdXR0b25JblJvdyB8fCB0aGlzLmVkaXRCdXR0b25JblJvdykge1xuICAgICAgdGhpcy5kZXRhaWxNb2RlID0gQ29kZXMuREVUQUlMX01PREVfTk9ORTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyRm9ybUxheW91dE1hbmFnZXJTdGF0ZSgpO1xuICAgIHN1cGVyLmFmdGVyVmlld0luaXQoKTtcbiAgICBpZiAodGhpcy5lbFJlZikge1xuICAgICAgdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgndGl0bGUnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZm9ybUxheW91dE1hbmFnZXIgJiYgdGhpcy5mb3JtTGF5b3V0TWFuYWdlci5pc01haW5Db21wb25lbnQodGhpcykpIHtcbiAgICAgIHRoaXMub25UcmlnZ2VyVXBkYXRlU3Vic2NyaXB0aW9uID0gdGhpcy5mb3JtTGF5b3V0TWFuYWdlci5vblRyaWdnZXJVcGRhdGUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWxvYWREYXRhKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgaWYgKHRoaXMub25UcmlnZ2VyVXBkYXRlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLm9uVHJpZ2dlclVwZGF0ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50YWJzU3Vic2NyaXB0aW9ucykge1xuICAgICAgdGhpcy50YWJzU3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5xdWlja0ZpbHRlclN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5xdWlja0ZpbHRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc1Zpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3Zpc2libGU7XG4gIH1cblxuICBwdWJsaWMgaGFzQ29udHJvbHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29udHJvbHM7XG4gIH1cblxuICBwdWJsaWMgaGFzVGl0bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGl0bGUgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZEl0ZW1zKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQ7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRTZWxlY3RlZChpdGVtOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQoaXRlbSkpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLnRvZ2dsZShpdGVtKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgbmF2aWdhdGVUb0RldGFpbChyb3V0ZTogYW55W10sIHFQYXJhbXM6IGFueSwgcmVsYXRpdmVUbzogQWN0aXZhdGVkUm91dGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBleHRyYXMgPSB7XG4gICAgICByZWxhdGl2ZVRvOiByZWxhdGl2ZVRvXG4gICAgfTtcbiAgICBpZiAodGhpcy5mb3JtTGF5b3V0TWFuYWdlciAmJiB0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyLmlzTWFpbkNvbXBvbmVudCh0aGlzKSkge1xuICAgICAgcVBhcmFtc1tDb2Rlcy5JR05PUkVfQ0FOX0RFQUNUSVZBVEVdID0gdGhpcy5mb3JtTGF5b3V0TWFuYWdlci5pZ25vcmVDYW5EZWFjdGl2YXRlO1xuICAgICAgdGhpcy5mb3JtTGF5b3V0TWFuYWdlci5zZXRBc0FjdGl2ZUZvcm1MYXlvdXRNYW5hZ2VyKCk7XG4gICAgfVxuICAgIGV4dHJhc1tDb2Rlcy5RVUVSWV9QQVJBTVNdID0gcVBhcmFtcztcblxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKHJvdXRlLCBleHRyYXMpLlxuICAgICAgdGhlbigoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5mb3JtTGF5b3V0TWFuYWdlcikge1xuICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuaXNOYXZpZ2F0aW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdDYW5ub3QgbWF0Y2ggYW55IHJvdXRlcy4gVVJMIFNlZ21lbnQ6ICcsIHJvdXRlKTtcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5pc05hdmlnYXRpbmcgPSBmYWxzZVxuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgaW5zZXJ0RGV0YWlsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9Gb3JtTGF5b3V0RGlhbG9nKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05hdmlnYXRpb24gaXMgbm90IGF2YWlsYWJsZSB5ZXQgaW4gYSBmb3JtIGxheW91dCBtYW5hZ2VyIHdpdGggbW9kZT1cImRpYWxvZ1wiJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJvdXRlID0gdGhpcy5nZXRJbnNlcnRSb3V0ZSgpO1xuICAgIHRoaXMuYWRkRm9ybUxheW91dE1hbmFnZXJSb3V0ZShyb3V0ZSk7XG4gICAgaWYgKHJvdXRlLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHJlbGF0aXZlVG8gPSB0aGlzLnJlY3Vyc2l2ZUluc2VydCA/IHRoaXMuYWN0Um91dGUucGFyZW50IDogdGhpcy5hY3RSb3V0ZTtcbiAgICAgIGNvbnN0IHFQYXJhbXMgPSB7fTtcbiAgICAgIGlmICh0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyICYmIHRoaXMuZm9ybUxheW91dE1hbmFnZXIuaXNUYWJNb2RlKCkpIHtcbiAgICAgICAgcVBhcmFtc1tDb2Rlcy5JTlNFUlRJT05fTU9ERV0gPSAndHJ1ZSc7XG4gICAgICB9XG4gICAgICB0aGlzLm5hdmlnYXRlVG9EZXRhaWwocm91dGUsIHFQYXJhbXMsIHJlbGF0aXZlVG8pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB2aWV3RGV0YWlsKGl0ZW06IGFueSwgY29udGV4dD86IE9Gb3JtTGF5b3V0TWFuYWdlckNvbnRleHQpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtTGF5b3V0TWFuYWdlclNlcnZpY2UgPSB0aGlzLmluamVjdG9yLmdldChPRm9ybUxheW91dE1hbmFnZXJTZXJ2aWNlKTtcbiAgICBmb3JtTGF5b3V0TWFuYWdlclNlcnZpY2UuY29udGV4dCA9IHZvaWQgMDtcblxuICAgIGlmICh0aGlzLm9Gb3JtTGF5b3V0RGlhbG9nKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05hdmlnYXRpb24gaXMgbm90IGF2YWlsYWJsZSB5ZXQgaW4gYSBmb3JtIGxheW91dCBtYW5hZ2VyIHdpdGggbW9kZT1cImRpYWxvZ1wiJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmlzTmF2aWdhdGluZykge1xuICAgICAgcmV0dXJuO1xuXG4gICAgfVxuICAgIGNvbnN0IHpvbmUgPSB0aGlzLmluamVjdG9yLmdldChOZ1pvbmUpO1xuICAgIHpvbmUucnVuKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJvdXRlID0gdGhpcy5nZXRJdGVtTW9kZVJvdXRlKGl0ZW0sICdkZXRhaWxGb3JtUm91dGUnKTtcbiAgICAgIHRoaXMuYWRkRm9ybUxheW91dE1hbmFnZXJSb3V0ZShyb3V0ZSk7XG4gICAgICBpZiAocm91dGUubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBxUGFyYW1zID0gQ29kZXMuZ2V0SXNEZXRhaWxPYmplY3QoKTtcbiAgICAgICAgY29uc3QgcmVsYXRpdmVUbyA9IHRoaXMucmVjdXJzaXZlRGV0YWlsID8gdGhpcy5hY3RSb3V0ZS5wYXJlbnQgOiB0aGlzLmFjdFJvdXRlO1xuXG4gICAgICAgIGlmICghdGhpcy5mb3JtTGF5b3V0TWFuYWdlcj8uaXNTcGxpdFBhbmVNb2RlKCkpIHtcbiAgICAgICAgICBmb3JtTGF5b3V0TWFuYWdlclNlcnZpY2UuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5pc05hdmlnYXRpbmcgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLm5hdmlnYXRlVG9EZXRhaWwocm91dGUsIHFQYXJhbXMsIHJlbGF0aXZlVG8pXG4gICAgICB9XG4gICAgfSk7XG5cbiAgfVxuXG4gIHB1YmxpYyBlZGl0RGV0YWlsKGl0ZW06IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9Gb3JtTGF5b3V0RGlhbG9nKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05hdmlnYXRpb24gaXMgbm90IGF2YWlsYWJsZSB5ZXQgaW4gYSBmb3JtIGxheW91dCBtYW5hZ2VyIHdpdGggbW9kZT1cImRpYWxvZ1wiJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHpvbmUgPSB0aGlzLmluamVjdG9yLmdldChOZ1pvbmUpO1xuICAgIHpvbmUucnVuKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJvdXRlID0gdGhpcy5nZXRJdGVtTW9kZVJvdXRlKGl0ZW0sICdlZGl0Rm9ybVJvdXRlJyk7XG4gICAgICB0aGlzLmFkZEZvcm1MYXlvdXRNYW5hZ2VyUm91dGUocm91dGUpO1xuICAgICAgaWYgKHJvdXRlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgcVBhcmFtcyA9IENvZGVzLmdldElzRGV0YWlsT2JqZWN0KCk7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlVG8gPSB0aGlzLnJlY3Vyc2l2ZUVkaXQgPyB0aGlzLmFjdFJvdXRlLnBhcmVudCA6IHRoaXMuYWN0Um91dGU7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5uYXZpZ2F0ZVRvRGV0YWlsKHJvdXRlLCBxUGFyYW1zLCByZWxhdGl2ZVRvKVxuXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRkRm9ybUxheW91dE1hbmFnZXJSb3V0ZShyb3V0ZUFycjogYW55W10pOiBhbnlbXSB7XG4gICAgaWYgKHRoaXMuZm9ybUxheW91dE1hbmFnZXIgJiYgcm91dGVBcnIubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY29tcFJvdXRlID0gdGhpcy5mb3JtTGF5b3V0TWFuYWdlci5nZXRSb3V0ZUZvckNvbXBvbmVudCh0aGlzKTtcbiAgICAgIGlmIChjb21wUm91dGUgJiYgY29tcFJvdXRlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcm91dGVBcnIudW5zaGlmdCguLi5jb21wUm91dGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcm91dGVBcnI7XG4gIH1cbiAgcHJvdGVjdGVkIHNldEJ1dHRvblBlcm1pc3Npb25zKGFjdGlvbnNQZXJtaXNzaW9ucyk6IHZvaWQge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChhY3Rpb25zUGVybWlzc2lvbnMpKSB7XG4gICAgICB0aGlzLnNldFBlcm1pc3Npb24oJ2luc2VydCcsICdpbnNlcnRCdXR0b24nLCAnZW5hYmxlZEluc2VydEJ1dHRvbicsIGFjdGlvbnNQZXJtaXNzaW9ucyk7XG4gICAgICB0aGlzLnNldFBlcm1pc3Npb24oJ3JlZnJlc2gnLCAncmVmcmVzaEJ1dHRvbicsICdlbmFibGVkUmVmcmVzaEJ1dHRvbicsIGFjdGlvbnNQZXJtaXNzaW9ucyk7XG4gICAgICB0aGlzLnNldFBlcm1pc3Npb24oJ2RlbGV0ZScsICdkZWxldGVCdXR0b24nLCAnZW5hYmxlZERlbGV0ZUJ1dHRvbicsIGFjdGlvbnNQZXJtaXNzaW9ucyk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBzZXRQZXJtaXNzaW9uKGF0dHI6IHN0cmluZywgdmlzaWJsZVByb3A6IHN0cmluZywgZW5hYmxlZFByb3A6IHN0cmluZywgYWN0aW9uc1Blcm1pc3Npb25zKTogdm9pZCB7XG4gICAgY29uc3QgcGVybSA9IHRoaXMuZ2V0UGVybWlzc2lvbkJ5QXR0cihhdHRyLCBhY3Rpb25zUGVybWlzc2lvbnMpO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChwZXJtKSkge1xuICAgICAgdGhpc1t2aXNpYmxlUHJvcF0gPSBwZXJtLnZpc2libGU7XG4gICAgICB0aGlzW2VuYWJsZWRQcm9wXSA9IHBlcm0uZW5hYmxlZDtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFuYWdlQ3VzdG9tUGVybWlzc2lvbnMoYWN0aW9uc1Blcm1pc3Npb25zLCBzZWxlY3Rvcik6IHZvaWQge1xuICAgIGNvbnN0IGN1c3RvbVBlcm1pc3Npb25zID0gYWN0aW9uc1Blcm1pc3Npb25zLmZpbHRlcihwZXJtID0+ICFbJ2luc2VydCcsICdyZWZyZXNoJywgJ2RlbGV0ZSddLmluY2x1ZGVzKHBlcm0uYXR0cikpO1xuICAgIGN1c3RvbVBlcm1pc3Npb25zLmZvckVhY2gocGVybWlzc2lvbiA9PiB7XG4gICAgICB0aGlzLm1hbmFnZVBlcm1pc3Npb24odGhpcy5lbFJlZiwgcGVybWlzc2lvbiwgdGhpcy5tdXRhdGlvbk9ic2VydmVycywgc2VsZWN0b3IpO1xuICAgIH0pO1xuICB9XG4gIHByb3RlY3RlZCBnZXRBY3Rpb25zUGVybWlzc2lvbnMocGVybWlzc2lvbnM6IGFueSk6IE9QZXJtaXNzaW9uc1tdIHtcbiAgICByZXR1cm4gVXRpbC5pc0RlZmluZWQocGVybWlzc2lvbnMpID8gKHBlcm1pc3Npb25zLmFjdGlvbnMgfHwgW10pIDogW107XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UGVybWlzc2lvbkJ5QXR0cihhdHRyOiBzdHJpbmcsIGFjdGlvbnNQZXJtaXNzaW9uczogT1Blcm1pc3Npb25zW10pOiBPUGVybWlzc2lvbnMge1xuICAgIHJldHVybiBhY3Rpb25zUGVybWlzc2lvbnMuZmluZCgocGVybTogT1Blcm1pc3Npb25zKSA9PiBwZXJtLmF0dHIgPT09IGF0dHIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1hbmFnZVBlcm1pc3Npb24oZWxlbWVudFJlZjogYW55LCBwZXJtaXNzaW9uOiBPUGVybWlzc2lvbnMsIG11dGF0aW9uT2JzZXJ2ZXJzOiBhbnlbXSwgc2VsZWN0b3I6IHN0cmluZywgYXR0cj86IHN0cmluZyk6IHZvaWQge1xuICAgIGxldCBlbGVtZW50QnlBY3Rpb247XG4gICAgY29uc3QgYXR0ckFjdGlvbiA9IFV0aWwuaXNEZWZpbmVkKGF0dHIpID8gYXR0ciA6IHBlcm1pc3Npb24uYXR0cjtcbiAgICBjb25zdCBhbGxFbGVtZW50cyA9IGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcblxuICAgIGFsbEVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2F0dHInKSA9PT0gYXR0ckFjdGlvbikge1xuICAgICAgICBlbGVtZW50QnlBY3Rpb24gPSBlbGVtZW50O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGVsZW1lbnRCeUFjdGlvbikpIHtcbiAgICAgIGlmICghcGVybWlzc2lvbi52aXNpYmxlKSB7XG4gICAgICAgIGVsZW1lbnRCeUFjdGlvbi5yZW1vdmUoKTtcbiAgICAgIH0gZWxzZSBpZiAoIXBlcm1pc3Npb24uZW5hYmxlZCkge1xuICAgICAgICBlbGVtZW50QnlBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCBtdXRhdGlvbk9ic2VydmVyID0gUGVybWlzc2lvbnNVdGlscy5yZWdpc3RlckRpc2FibGVkQ2hhbmdlc0luRG9tKGVsZW1lbnRCeUFjdGlvbik7XG4gICAgICAgIG11dGF0aW9uT2JzZXJ2ZXJzLnB1c2gobXV0YXRpb25PYnNlcnZlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldEVuY29kZWRQYXJlbnRLZXlzKCk6IHN0cmluZyB7XG4gICAgbGV0IGVuY29kZWQ6IHN0cmluZztcbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fcEtleXNFcXVpdikubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcEtleXMgPSB0aGlzLmdldFBhcmVudEtleXNWYWx1ZXMoKTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhwS2V5cykubGVuZ3RoID4gMCkge1xuICAgICAgICBlbmNvZGVkID0gVXRpbC5lbmNvZGVQYXJlbnRLZXlzKHBLZXlzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVuY29kZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0SW5zZXJ0Um91dGUoKTogYW55W10ge1xuICAgIGNvbnN0IHJvdXRlID0gW107XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMuZGV0YWlsRm9ybVJvdXRlKSkge1xuICAgICAgcm91dGUucHVzaCh0aGlzLmRldGFpbEZvcm1Sb3V0ZSk7XG4gICAgfVxuICAgIGNvbnN0IGluc2VydFJvdXRlID0gVXRpbC5pc0RlZmluZWQodGhpcy5pbnNlcnRGb3JtUm91dGUpID8gdGhpcy5pbnNlcnRGb3JtUm91dGUgOiBDb2Rlcy5ERUZBVUxUX0lOU0VSVF9ST1VURTtcbiAgICByb3V0ZS5wdXNoKGluc2VydFJvdXRlKTtcbiAgICAvLyBhZGRpbmcgcGFyZW50LWtleXMgaW5mby4uLlxuICAgIGNvbnN0IGVuY29kZWRQYXJlbnRLZXlzID0gdGhpcy5nZXRFbmNvZGVkUGFyZW50S2V5cygpO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChlbmNvZGVkUGFyZW50S2V5cykpIHtcbiAgICAgIGNvbnN0IHJvdXRlT2JqID0ge307XG4gICAgICByb3V0ZU9ialtDb2Rlcy5QQVJFTlRfS0VZU19LRVldID0gZW5jb2RlZFBhcmVudEtleXM7XG4gICAgICByb3V0ZS5wdXNoKHJvdXRlT2JqKTtcbiAgICB9XG4gICAgaWYgKHJvdXRlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc3RvcmVOYXZpZ2F0aW9uRm9ybVJvdXRlcygnaW5zZXJ0Rm9ybVJvdXRlJyk7XG4gICAgfVxuICAgIHJldHVybiByb3V0ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJdGVtTW9kZVJvdXRlKGl0ZW06IGFueSwgbW9kZVJvdXRlOiBzdHJpbmcpOiBhbnlbXSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXRSb3V0ZU9mU2VsZWN0ZWRSb3coaXRlbSk7XG4gICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5kZXRhaWxGb3JtUm91dGUpKSB7XG4gICAgICAgIHJlc3VsdC51bnNoaWZ0KHRoaXMuZGV0YWlsRm9ybVJvdXRlKTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2RlUm91dGUgPT09ICdlZGl0Rm9ybVJvdXRlJykge1xuICAgICAgICByZXN1bHQucHVzaCh0aGlzLmVkaXRGb3JtUm91dGUgfHwgQ29kZXMuREVGQVVMVF9FRElUX1JPVVRFKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwICYmICF0aGlzLm9Gb3JtTGF5b3V0RGlhbG9nKSB7XG4gICAgICB0aGlzLnN0b3JlTmF2aWdhdGlvbkZvcm1Sb3V0ZXMobW9kZVJvdXRlLCB0aGlzLmdldFF1ZXJ5Q29uZmlndXJhdGlvbigpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRRdWVyeUNvbmZpZ3VyYXRpb24oKTogYW55IHtcbiAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAga2V5c1ZhbHVlczogdGhpcy5nZXRLZXlzVmFsdWVzKClcbiAgICB9O1xuICAgIGlmICh0aGlzLnBhZ2VhYmxlKSB7XG4gICAgICByZXN1bHQgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgc2VydmljZVR5cGU6IHRoaXMuc2VydmljZVR5cGUsXG4gICAgICAgIHF1ZXJ5QXJndW1lbnRzOiB0aGlzLnF1ZXJ5QXJndW1lbnRzLFxuICAgICAgICBlbnRpdHk6IHRoaXMuZW50aXR5LFxuICAgICAgICBzZXJ2aWNlOiB0aGlzLnNlcnZpY2UsXG4gICAgICAgIHF1ZXJ5TWV0aG9kOiB0aGlzLnBhZ2VhYmxlID8gdGhpcy5wYWdpbmF0ZWRRdWVyeU1ldGhvZCA6IHRoaXMucXVlcnlNZXRob2QsXG4gICAgICAgIHRvdGFsUmVjb3Jkc051bWJlcjogdGhpcy5nZXRUb3RhbFJlY29yZHNOdW1iZXIoKSxcbiAgICAgICAgcXVlcnlSb3dzOiB0aGlzLnF1ZXJ5Um93cyxcbiAgICAgICAgcXVlcnlSZWNvcmRPZmZzZXQ6IE1hdGgubWF4KHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnF1ZXJ5Um93cywgdGhpcy5zdGF0ZS5xdWVyeVJlY29yZE9mZnNldCAtIHRoaXMucXVlcnlSb3dzKVxuICAgICAgfSwgcmVzdWx0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSb3V0ZU9mU2VsZWN0ZWRSb3coaXRlbTogYW55KTogYW55W10ge1xuICAgIGNvbnN0IHJvdXRlID0gW107XG4gICAgaWYgKFV0aWwuaXNPYmplY3QoaXRlbSkpIHtcbiAgICAgIHRoaXMua2V5c0FycmF5LmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKGl0ZW1ba2V5XSkpIHtcbiAgICAgICAgICByb3V0ZS5wdXNoKGl0ZW1ba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcm91dGU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVsZXRlTG9jYWxJdGVtcygpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gdGhpcy5nZXRTZWxlY3RlZEl0ZW1zKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3RlZEl0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZEl0ZW0gPSBzZWxlY3RlZEl0ZW1zW2ldO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtS3YgPSB7fTtcbiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgdGhpcy5rZXlzQXJyYXkubGVuZ3RoOyArK2spIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5rZXlzQXJyYXlba107XG4gICAgICAgIHNlbGVjdGVkSXRlbUt2W2tleV0gPSBzZWxlY3RlZEl0ZW1ba2V5XTtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGogPSB0aGlzLmRhdGFBcnJheS5sZW5ndGggLSAxOyBqID49IDA7IC0taikge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5kYXRhQXJyYXlbal07XG4gICAgICAgIGNvbnN0IGl0ZW1LdiA9IHt9O1xuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHRoaXMua2V5c0FycmF5Lmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5rZXlzQXJyYXlba107XG4gICAgICAgICAgaXRlbUt2W2tleV0gPSBpdGVtW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgayBpbiBzZWxlY3RlZEl0ZW1Ldikge1xuICAgICAgICAgIGlmIChzZWxlY3RlZEl0ZW1Ldi5oYXNPd25Qcm9wZXJ0eShrKSkge1xuICAgICAgICAgICAgZm91bmQgPSBpdGVtS3YuaGFzT3duUHJvcGVydHkoaykgJiYgKHNlbGVjdGVkSXRlbUt2W2tdID09PSBpdGVtS3Zba10pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICB0aGlzLmRhdGFBcnJheS5zcGxpY2UoaiwgMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICB9XG5cbiAgcHVibGljIHJlaW5pdGlhbGl6ZShvcHRpb25zOiBPTGlzdEluaXRpYWxpemF0aW9uT3B0aW9ucyB8IE9UYWJsZUluaXRpYWxpemF0aW9uT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmIChvcHRpb25zICYmIE9iamVjdC5rZXlzKG9wdGlvbnMpLmxlbmd0aCkge1xuICAgICAgY29uc3QgY2xvbmVkT3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpO1xuICAgICAgaWYgKGNsb25lZE9wdHMuaGFzT3duUHJvcGVydHkoJ2VudGl0eScpKSB7XG4gICAgICAgIHRoaXMuZW50aXR5ID0gY2xvbmVkT3B0cy5lbnRpdHk7XG4gICAgICAgIGlmICh0aGlzLm9hdHRyRnJvbUVudGl0eSkge1xuICAgICAgICAgIHRoaXMub2F0dHIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIGNsb25lZE9wdHMuZW50aXR5O1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBwcm9wIGluIGNsb25lZE9wdHMpIHtcbiAgICAgICAgaWYgKGNsb25lZE9wdHMuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICB0aGlzW3Byb3BdID0gY2xvbmVkT3B0c1twcm9wXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgYG8tZmlsdGVyLWJ1aWxkZXJgIGNvbXBvbmVudCB0aGF0IHRoaXMgY29tcG9uZW50IHdpbGwgdXNlIHRvIGZpbHRlciBpdHMgZGF0YS5cbiAgICogQHBhcmFtIGZpbHRlckJ1aWxkZXIgdGhlIGBvLWZpbHRlci1idWlsZGVyYCBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgc2V0RmlsdGVyQnVpbGRlcihmaWx0ZXJCdWlsZGVyOiBPRmlsdGVyQnVpbGRlckNvbXBvbmVudCk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyQnVpbGRlciA9IGZpbHRlckJ1aWxkZXI7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29tcG9uZW50RmlsdGVyKGV4aXN0aW5nRmlsdGVyOiBhbnkgPSB7fSk6IGFueSB7XG4gICAgY29uc3QgZmlsdGVyID0gc3VwZXIuZ2V0Q29tcG9uZW50RmlsdGVyKGV4aXN0aW5nRmlsdGVyKTtcblxuICAgIGNvbnN0IHF1aWNrRmlsdGVyRXhwciA9IHRoaXMuZ2V0UXVpY2tGaWx0ZXJFeHByZXNzaW9uKCk7XG4gICAgY29uc3QgZmlsdGVyQnVpbGRlckV4cHIgPSB0aGlzLmdldEZpbHRlckJ1aWxkZXJFeHByZXNzaW9uKCk7XG4gICAgbGV0IGNvbXBsZXhFeHByID0gcXVpY2tGaWx0ZXJFeHByIHx8IGZpbHRlckJ1aWxkZXJFeHByO1xuICAgIGlmIChxdWlja0ZpbHRlckV4cHIgJiYgZmlsdGVyQnVpbGRlckV4cHIpIHtcbiAgICAgIGNvbXBsZXhFeHByID0gRmlsdGVyRXhwcmVzc2lvblV0aWxzLmJ1aWxkQ29tcGxleEV4cHJlc3Npb24ocXVpY2tGaWx0ZXJFeHByLCBmaWx0ZXJCdWlsZGVyRXhwciwgRmlsdGVyRXhwcmVzc2lvblV0aWxzLk9QX0FORCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBsZXhFeHByICYmICFVdGlsLmlzRGVmaW5lZChmaWx0ZXJbRmlsdGVyRXhwcmVzc2lvblV0aWxzLkJBU0lDX0VYUFJFU1NJT05fS0VZXSkpIHtcbiAgICAgIGZpbHRlcltGaWx0ZXJFeHByZXNzaW9uVXRpbHMuQkFTSUNfRVhQUkVTU0lPTl9LRVldID0gY29tcGxleEV4cHI7XG4gICAgfSBlbHNlIGlmIChjb21wbGV4RXhwcikge1xuICAgICAgZmlsdGVyW0ZpbHRlckV4cHJlc3Npb25VdGlscy5CQVNJQ19FWFBSRVNTSU9OX0tFWV0gPVxuICAgICAgICBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuYnVpbGRDb21wbGV4RXhwcmVzc2lvbihmaWx0ZXJbRmlsdGVyRXhwcmVzc2lvblV0aWxzLkJBU0lDX0VYUFJFU1NJT05fS0VZXSwgY29tcGxleEV4cHIsIEZpbHRlckV4cHJlc3Npb25VdGlscy5PUF9BTkQpO1xuICAgIH1cblxuICAgIHJldHVybiBmaWx0ZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UXVpY2tGaWx0ZXJFeHByZXNzaW9uKCk6IEV4cHJlc3Npb24ge1xuICAgIGlmICh0aGlzLnBhZ2VhYmxlICYmIFV0aWwuaXNEZWZpbmVkKHRoaXMucXVpY2tGaWx0ZXJDb21wb25lbnQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5xdWlja0ZpbHRlckNvbXBvbmVudC5maWx0ZXJFeHByZXNzaW9uO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEZpbHRlckJ1aWxkZXJFeHByZXNzaW9uKCk6IEV4cHJlc3Npb24ge1xuICAgIC8vIEFkZCBmaWx0ZXIgZnJvbSBvLWZpbHRlci1idWlsZGVyIGNvbXBvbmVudFxuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLmZpbHRlckJ1aWxkZXIpKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXJCdWlsZGVyLmdldEV4cHJlc3Npb24oKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdG9yZU5hdmlnYXRpb25Gb3JtUm91dGVzKGFjdGl2ZU1vZGU6IHN0cmluZywgcXVlcnlDb25mPzogYW55KTogdm9pZCB7XG4gICAgY29uc3QgbWFpbkZvcm1MYXlvdXRDb21wID0gdGhpcy5mb3JtTGF5b3V0TWFuYWdlciA/IFV0aWwuaXNEZWZpbmVkKHRoaXMuZm9ybUxheW91dE1hbmFnZXIuaXNNYWluQ29tcG9uZW50KHRoaXMpKSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnN0b3JlRm9ybVJvdXRlcyh7XG4gICAgICBtYWluRm9ybUxheW91dE1hbmFnZXJDb21wb25lbnQ6IG1haW5Gb3JtTGF5b3V0Q29tcCxcbiAgICAgIGlzTWFpbk5hdmlnYXRpb25Db21wb25lbnQ6IHRydWUsXG4gICAgICBkZXRhaWxGb3JtUm91dGU6IHRoaXMuZGV0YWlsRm9ybVJvdXRlLFxuICAgICAgZWRpdEZvcm1Sb3V0ZTogdGhpcy5lZGl0Rm9ybVJvdXRlLFxuICAgICAgaW5zZXJ0Rm9ybVJvdXRlOiBVdGlsLmlzRGVmaW5lZCh0aGlzLmluc2VydEZvcm1Sb3V0ZSkgPyB0aGlzLmluc2VydEZvcm1Sb3V0ZSA6IENvZGVzLkRFRkFVTFRfSU5TRVJUX1JPVVRFXG4gICAgfSwgYWN0aXZlTW9kZSwgcXVlcnlDb25mKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzYXZlRGF0YU5hdmlnYXRpb25JbkxvY2FsU3RvcmFnZSgpOiB2b2lkIHtcbiAgICAvLyBTYXZlIGRhdGEgb2YgdGhlIGxpc3QgaW4gbmF2aWdhdGlvbi1kYXRhIGluIHRoZSBsb2NhbHN0b3JhZ2VcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRLZXlzVmFsdWVzKCk6IGFueVtdIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhQXJyYXk7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIGRhdGEubWFwKChyb3cpID0+IHtcbiAgICAgIGNvbnN0IG9iaiA9IHt9O1xuICAgICAgc2VsZi5rZXlzQXJyYXkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGlmIChyb3dba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb2JqW2tleV0gPSByb3dba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Um91dGVLZXkoKTogc3RyaW5nIHtcbiAgICBsZXQgcm91dGUgPSAnJztcbiAgICBpZiAodGhpcy5mb3JtTGF5b3V0TWFuYWdlciAmJiAhdGhpcy5mb3JtTGF5b3V0TWFuYWdlci5pc01haW5Db21wb25lbnQodGhpcykpIHtcbiAgICAgIHJvdXRlID0gdGhpcy5yb3V0ZXIudXJsO1xuICAgICAgY29uc3QgcGFyYW1zID0gdGhpcy5mb3JtTGF5b3V0TWFuYWdlci5nZXRQYXJhbXMoKTtcbiAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgcm91dGUgKz0gJy8nICsgKE9iamVjdC5rZXlzKHBhcmFtcykuam9pbignLycpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcm91dGUgPSBzdXBlci5nZXRSb3V0ZUtleSgpO1xuICAgIH1cbiAgICByZXR1cm4gcm91dGU7XG4gIH1cblxuICBnZXQgZWxlbWVudFJlZigpOiBFbGVtZW50UmVmIHtcbiAgICByZXR1cm4gdGhpcy5lbFJlZjtcbiAgfVxuXG4gIHB1YmxpYyBzaG93Q2FzZVNlbnNpdGl2ZUNoZWNrYm94KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5wYWdlYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlclF1aWNrRmlsdGVyKGFyZzogYW55KTogdm9pZCB7XG4gICAgY29uc3QgcXVpY2tGaWx0ZXIgPSAoYXJnIGFzIE9TZWFyY2hJbnB1dENvbXBvbmVudCk7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMucXVpY2tGaWx0ZXJDb21wb25lbnQpKSB7XG4gICAgICAvLyBhdm9pZGluZyB0byByZWdpc3RlciBhIHF1aWNrZmlsdGVyY29tcG9uZW50IGlmIGl0IGFscmVhZHkgZXhpc3RzIG9uZVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnF1aWNrRmlsdGVyQ29tcG9uZW50ID0gcXVpY2tGaWx0ZXI7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMucXVpY2tGaWx0ZXJDb21wb25lbnQpKSB7XG4gICAgICB0aGlzLnF1aWNrRmlsdGVyU3Vic2NyaXB0aW9uID0gdGhpcy5xdWlja0ZpbHRlckNvbXBvbmVudC5vblNlYXJjaC5zdWJzY3JpYmUodmFsID0+IHtcbiAgICAgICAgdGhpcy5vblNlYXJjaC5lbWl0KHZhbCk7XG4gICAgICAgIHRoaXMuZmlsdGVyRGF0YSh2YWwpO1xuICAgICAgfSk7XG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5zdGF0ZSkpIHtcbiAgICAgICAgaWYgKCh0aGlzLnN0YXRlLnF1aWNrRmlsdGVyVmFsdWUgfHwgJycpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLnF1aWNrRmlsdGVyQ29tcG9uZW50LnNldFZhbHVlKHRoaXMuc3RhdGUucXVpY2tGaWx0ZXJWYWx1ZSwge1xuICAgICAgICAgICAgZW1pdEV2ZW50OiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaXNGaWx0ZXJDYXNlU2Vuc2l0aXZlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHVzZVF1aWNrRmlsdGVyVmFsdWUgPSBVdGlsLmlzRGVmaW5lZCh0aGlzLnF1aWNrRmlsdGVyQ29tcG9uZW50KSAmJiB0aGlzLnNob3dDYXNlU2Vuc2l0aXZlQ2hlY2tib3goKTtcbiAgICBpZiAodXNlUXVpY2tGaWx0ZXJWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucXVpY2tGaWx0ZXJDb21wb25lbnQuZmlsdGVyQ2FzZVNlbnNpdGl2ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyQ2FzZVNlbnNpdGl2ZTtcbiAgfVxuXG4gIHB1YmxpYyBjb25maWd1cmVGaWx0ZXJWYWx1ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcmV0dXJuVmFsID0gdmFsdWU7XG4gICAgaWYgKHZhbHVlICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICghdmFsdWUuc3RhcnRzV2l0aCgnKicpKSB7XG4gICAgICAgIHJldHVyblZhbCA9ICcqJyArIHJldHVyblZhbDtcbiAgICAgIH1cbiAgICAgIGlmICghdmFsdWUuZW5kc1dpdGgoJyonKSkge1xuICAgICAgICByZXR1cm5WYWwgPSByZXR1cm5WYWwgKyAnKic7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5WYWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0UXVpY2tGaWx0ZXJWYWx1ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlc3VsdCA9ICcnO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnF1aWNrRmlsdGVyQ29tcG9uZW50KSkge1xuICAgICAgcmV0dXJuIHRoaXMucXVpY2tGaWx0ZXJDb21wb25lbnQuZ2V0VmFsdWUoKSB8fCAnJztcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRRdWlja0ZpbHRlckNvbHVtbnMoKTogc3RyaW5nW10ge1xuICAgIGxldCByZXN1bHQgPSB0aGlzLnF1aWNrRmlsdGVyQ29sQXJyYXk7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMucXVpY2tGaWx0ZXJDb21wb25lbnQpKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnF1aWNrRmlsdGVyQ29tcG9uZW50LmdldEFjdGl2ZUNvbHVtbnMoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGRhdGEgbG9jYWxseVxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIGZpbHRlcmluZyB2YWx1ZVxuICAgKi9cbiAgcHVibGljIGZpbHRlckRhdGEodmFsdWU/OiBzdHJpbmcsIGxvYWRNb3JlPzogYm9vbGVhbik6IHZvaWQge1xuICAgIHZhbHVlID0gVXRpbC5pc0RlZmluZWQodmFsdWUpID8gdmFsdWUgOiBVdGlsLmlzRGVmaW5lZCh0aGlzLnF1aWNrRmlsdGVyQ29tcG9uZW50KSA/IHRoaXMucXVpY2tGaWx0ZXJDb21wb25lbnQuZ2V0VmFsdWUoKSA6IHZvaWQgMDtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5zdGF0ZSkgJiYgVXRpbC5pc0RlZmluZWQodmFsdWUpKSB7XG4gICAgICB0aGlzLnN0YXRlLnF1aWNrRmlsdGVyVmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFnZWFibGUpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5QXJnczogT1F1ZXJ5RGF0YUFyZ3MgPSB7XG4gICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgbGVuZ3RoOiB0aGlzLnF1ZXJ5Um93cyxcbiAgICAgICAgcmVwbGFjZTogdHJ1ZVxuICAgICAgfTtcbiAgICAgIHRoaXMucXVlcnlEYXRhKHZvaWQgMCwgcXVlcnlBcmdzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YVJlc3BvbnNlQXJyYXkgJiYgdGhpcy5kYXRhUmVzcG9uc2VBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgZmlsdGVyZWREYXRhID0gdGhpcy5kYXRhUmVzcG9uc2VBcnJheS5zbGljZSgwKTtcbiAgICAgIGZpbHRlcmVkRGF0YSA9IHRoaXMuZ2V0UXVpY2tGaWx0ZXJEYXRhRnJvbUFycmF5KHZhbHVlLCBmaWx0ZXJlZERhdGEpO1xuICAgICAgZmlsdGVyZWREYXRhID0gdGhpcy5nZXRTb3J0ZWREYXRhRnJvbUFycmF5KGZpbHRlcmVkRGF0YSk7XG4gICAgICBmaWx0ZXJlZERhdGEgPSB0aGlzLmdldFBhZ2luYXRpb25EYXRhRnJvbUFycmF5KGZpbHRlcmVkRGF0YSk7XG4gICAgICB0aGlzLnNldERhdGFBcnJheShmaWx0ZXJlZERhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldERhdGFBcnJheSh0aGlzLmRhdGFSZXNwb25zZUFycmF5KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UXVpY2tGaWx0ZXJEYXRhRnJvbUFycmF5KHF1aWNrZmlsdGVyOiBzdHJpbmcsIGRhdGFBcnJheTogYW55W10pOiBhbnlbXSB7XG4gICAgbGV0IHJlc3VsdCA9IGRhdGFBcnJheTtcbiAgICBpZiAocXVpY2tmaWx0ZXIgJiYgcXVpY2tmaWx0ZXIubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY2FzZVNlbnNpdGl2ZSA9IHRoaXMuaXNGaWx0ZXJDYXNlU2Vuc2l0aXZlKCk7XG4gICAgICBjb25zdCBxdWlja0ZpbHRlckNvbHVtbnMgPSB0aGlzLmdldFF1aWNrRmlsdGVyQ29sdW1ucygpO1xuICAgICAgY29uc3QgcmVnRXhwU3RyID0gbmV3IFJlZ0V4cChVdGlsLmVzY2FwZVNwZWNpYWxDaGFyYWN0ZXIoVXRpbC5ub3JtYWxpemVTdHJpbmcocXVpY2tmaWx0ZXIsICFjYXNlU2Vuc2l0aXZlKSkpO1xuICAgICAgcmVzdWx0ID0gZGF0YUFycmF5LmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgcmV0dXJuIHF1aWNrRmlsdGVyQ29sdW1ucy5zb21lKGNvbCA9PiByZWdFeHBTdHIudGVzdChVdGlsLm5vcm1hbGl6ZVN0cmluZyhpdGVtW2NvbF0gKyAnJywgIWNhc2VTZW5zaXRpdmUpKSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRTb3J0ZWREYXRhRnJvbUFycmF5KGRhdGFBcnJheTogYW55W10pOiBhbnlbXSB7XG4gICAgcmV0dXJuIGRhdGFBcnJheTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXREYXRhKGRhdGE6IGFueSwgc3FsVHlwZXM/OiBhbnksIHJlcGxhY2U/OiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCFVdGlsLmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHRoaXMuc2V0RGF0YUFycmF5KFtdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRhUmVzcG9uc2VBcnJheSA9IHRoaXMucGFyc2VSZXNwb25zZUFycmF5KGRhdGEsIHJlcGxhY2UpO1xuICAgICAgaWYgKHRoaXMucGFnZWFibGUpIHtcbiAgICAgICAgdGhpcy5zZXREYXRhQXJyYXkodGhpcy5kYXRhUmVzcG9uc2VBcnJheSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZpbHRlckRhdGEoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMucGFnZWFibGUpIHtcbiAgICAgIE9ic2VydmFibGVXcmFwcGVyLmNhbGxFbWl0KHRoaXMub25QYWdpbmF0ZWREYXRhTG9hZGVkLCBkYXRhKTtcbiAgICB9XG4gICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5vbkRhdGFMb2FkZWQsIHRoaXMuZGF0YVJlc3BvbnNlQXJyYXkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlUmVzcG9uc2VBcnJheShkYXRhOiBhbnlbXSwgcmVwbGFjZT86IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWdpc3RlckZvcm1MYXlvdXRNYW5hZ2VyU3RhdGUoKSB7XG4gICAgaWYgKHRoaXMuc3RvcmVTdGF0ZSAmJiB0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyICYmIHRoaXMuZm9ybUxheW91dE1hbmFnZXIuaXNUYWJNb2RlKCkgJiYgdGhpcy5mb3JtTGF5b3V0TWFuYWdlci5vVGFiR3JvdXApIHtcbiAgICAgIGlmICghVXRpbC5pc0RlZmluZWQodGhpcy5mb3JtTGF5b3V0TWFuYWdlclRhYkluZGV4KSkge1xuICAgICAgICB0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyVGFiSW5kZXggPSB0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyLm9UYWJHcm91cC5kYXRhLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZGF0ZUNvbXBvbmVudFN0YXRlU3ViamVjdCA9ICh0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyLm9UYWJHcm91cCBhcyBPRm9ybUxheW91dFRhYkdyb3VwQ29tcG9uZW50KS51cGRhdGVUYWJDb21wb25lbnRzU3RhdGU7XG5cbiAgICAgIHRoaXMudGFic1N1YnNjcmlwdGlvbnMgPSB0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyLm9uU2VsZWN0ZWRUYWJDaGFuZ2Uuc3Vic2NyaWJlKChhcmcpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZm9ybUxheW91dE1hbmFnZXJUYWJJbmRleCA9PT0gYXJnLnByZXZpb3VzSW5kZXgpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlU3RvcmFnZSgpO1xuICAgICAgICAgIC8vIHNldHRpbmcgYWxyZWFkeVN0b3JlZCB0byBmYWxzZSB0byBmb3JjZSB0cmlnZ2VyaW5nIGEgbmV3IHN0b3JhZ2UgdXBkYXRlIGFmdGVyIHRoaXNcbiAgICAgICAgICB0aGlzLmFscmVhZHlTdG9yZWQgPSBmYWxzZTtcbiAgICAgICAgICBpZiAoYXJnLmluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICB1cGRhdGVDb21wb25lbnRTdGF0ZVN1YmplY3QubmV4dChhcmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoKChhcmcucHJldmlvdXNJbmRleD09PSB2b2lkIDApIHx8IGFyZy5wcmV2aW91c0luZGV4ID09PSAwKSAmJiB0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyLm5hdmlnYXRpb25TZXJ2aWNlLmlzTmF2aWdhdGluZykge1xuICAgICAgICAgIC8qIGluIHRoZSBmb3JtLWxheW91dCBtb2RlPXRhYiwgdGhlIG9ubHkgd2F5IHRvIGVuc3VyZSB0aGF0IHRoZSBjb21wb25lbnQgaGFzIGJlZW4gcmVuZGVyZWQgaXNcbiAgICAgICAgICAgd2hlbiBuYXZpZ2F0aW9uU2VydmljZS5pc05hdmlnYXRpbmcgYW5kIGNvbWVzIHByZXZpb3VzSW5kZXg9MCAgKi9cbiAgICAgICAgICBhcmcuZGF0YS5yZW5kZXJlclN1YmplY3QubmV4dCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoZWNrVmlld1BvcnRTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy50YWJzU3Vic2NyaXB0aW9ucy5hZGQodXBkYXRlQ29tcG9uZW50U3RhdGVTdWJqZWN0LnN1YnNjcmliZSgoYXJnKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyVGFiSW5kZXggPT09IGFyZy5pbmRleCkge1xuICAgICAgICAgIHRoaXMuY29tcG9uZW50U3RhdGVTZXJ2aWNlLmluaXRpYWxpemUodGhpcyk7XG4gICAgICAgICAgdGhpcy5hcHBseURlZmF1bHRDb25maWd1cmF0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgICAgdGhpcy50YWJzU3Vic2NyaXB0aW9ucy5hZGQodGhpcy5mb3JtTGF5b3V0TWFuYWdlci5vbkNsb3NlVGFiLnN1YnNjcmliZSgoYXJnKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyVGFiSW5kZXggPT09IGFyZy5pbmRleCkge1xuICAgICAgICAgIHRoaXMudXBkYXRlU3RhdGVTdG9yYWdlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcbiAgICB9XG4gIH1cblxuICBhcHBseURlZmF1bHRDb25maWd1cmF0aW9uKCkge1xuXG4gIH1cblxuICBwdWJsaWMgb25DaGFuZ2VQYWdlKGU6IFBhZ2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wYWdlYWJsZSkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IGUucGFnZUluZGV4O1xuICAgICAgdGhpcy5xdWVyeVJvd3MgPSBlLnBhZ2VTaXplO1xuICAgICAgdGhpcy5maWx0ZXJEYXRhKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGdvaW5nQmFjayA9IGUucGFnZUluZGV4IDwgdGhpcy5jdXJyZW50UGFnZTtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gZS5wYWdlSW5kZXg7XG4gICAgY29uc3QgcGFnZVNpemUgPSBlLnBhZ2VTaXplO1xuXG4gICAgY29uc3Qgb2xkUXVlcnlSb3dzID0gdGhpcy5xdWVyeVJvd3M7XG4gICAgY29uc3QgY2hhbmdpbmdQYWdlU2l6ZSA9IChvbGRRdWVyeVJvd3MgIT09IHBhZ2VTaXplKTtcbiAgICB0aGlzLnF1ZXJ5Um93cyA9IHBhZ2VTaXplO1xuXG4gICAgbGV0IG5ld1N0YXJ0UmVjb3JkO1xuICAgIGxldCBxdWVyeUxlbmd0aDtcblxuICAgIGlmIChnb2luZ0JhY2sgfHwgY2hhbmdpbmdQYWdlU2l6ZSkge1xuICAgICAgbmV3U3RhcnRSZWNvcmQgPSAodGhpcy5jdXJyZW50UGFnZSAqIHRoaXMucXVlcnlSb3dzKTtcbiAgICAgIHF1ZXJ5TGVuZ3RoID0gdGhpcy5xdWVyeVJvd3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld1N0YXJ0UmVjb3JkID0gTWF0aC5tYXgodGhpcy5zdGF0ZS5xdWVyeVJlY29yZE9mZnNldCwgKHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnF1ZXJ5Um93cykpO1xuICAgICAgY29uc3QgbmV3RW5kUmVjb3JkID0gTWF0aC5taW4obmV3U3RhcnRSZWNvcmQgKyB0aGlzLnF1ZXJ5Um93cywgdGhpcy5zdGF0ZS50b3RhbFF1ZXJ5UmVjb3Jkc051bWJlcik7XG4gICAgICBxdWVyeUxlbmd0aCA9IHRoaXMuZGlzYWJsZVBhZ2VTaXplQ2FsY3VsYXRpb24gPyB0aGlzLnF1ZXJ5Um93cyA6IE1hdGgubWluKHRoaXMucXVlcnlSb3dzLCBuZXdFbmRSZWNvcmQgLSBuZXdTdGFydFJlY29yZCk7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlBcmdzOiBPUXVlcnlEYXRhQXJncyA9IHtcbiAgICAgIG9mZnNldDogbmV3U3RhcnRSZWNvcmQsXG4gICAgICBsZW5ndGg6IHF1ZXJ5TGVuZ3RoLFxuICAgICAgcmVwbGFjZTogdHJ1ZVxuICAgIH07XG4gICAgdGhpcy5xdWVyeURhdGEodm9pZCAwLCBxdWVyeUFyZ3MpO1xuICB9XG5cbiAgc2V0IGN1cnJlbnRQYWdlKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5fY3VycmVudFBhZ2UgPSB2YWw7XG4gIH1cblxuICBnZXQgY3VycmVudFBhZ2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFBhZ2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2N1cnJlbnRQYWdlOiBudW1iZXIgPSAwO1xuXG5cbiAgZ2V0IHRvdGFsUmVjb3JkcygpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLnBhZ2VhYmxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRUb3RhbFJlY29yZHNOdW1iZXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGF0YVJlc3BvbnNlQXJyYXkubGVuZ3RoO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFBhZ2luYXRpb25EYXRhRnJvbUFycmF5KGRhdGFBcnJheTogYW55W10pOiBhbnlbXSB7XG4gICAgbGV0IHJlc3VsdCA9IGRhdGFBcnJheTtcbiAgICBpZiAodGhpcy5wYWdpbmF0aW9uQ29udHJvbHMpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5zcGxpY2UodGhpcy5jdXJyZW50UGFnZSAqIHRoaXMucXVlcnlSb3dzLCB0aGlzLnF1ZXJ5Um93cyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBoYW5kbGVJdGVtQ2xpY2soaXRlbTogSXRlbUNsaWNrKTogdm9pZCB7XG4gICAgdGhpcy5jbGlja1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuY2xpY2tQcmV2ZW50KSB7XG4gICAgICAgIHRoaXMuaXRlbUNsaWNrRG9uZShpdGVtKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2xpY2tQcmV2ZW50ID0gZmFsc2U7XG4gICAgfSwgdGhpcy5jbGlja0RlbGF5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpdGVtQ2xpY2tEb25lKGl0ZW06IEl0ZW1DbGljayk6IHZvaWQge1xuICAgIGlmICghdGhpcy5vZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gaXRlbS5nZXRJdGVtRGF0YSgpO1xuICAgIGlmICh0aGlzLmRldGFpbE1vZGUgPT09IENvZGVzLkRFVEFJTF9NT0RFX0NMSUNLKSB7XG4gICAgICB0aGlzLnNhdmVEYXRhTmF2aWdhdGlvbkluTG9jYWxTdG9yYWdlKCk7XG4gICAgICB0aGlzLnZpZXdEZXRhaWwoZGF0YSk7XG4gICAgfVxuICAgIHRoaXMub25DbGljay5lbWl0KGRhdGEpO1xuICB9XG5cbiAgaGFuZGxlSXRlbURibENsaWNrKGl0ZW06IEl0ZW1DbGljayk6IHZvaWQge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmNsaWNrVGltZXIpO1xuICAgIHRoaXMuY2xpY2tQcmV2ZW50ID0gdHJ1ZTtcbiAgICB0aGlzLml0ZW1EYmxDbGlja0RvbmUoaXRlbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXRlbURibENsaWNrRG9uZShpdGVtOiBJdGVtQ2xpY2spOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMub2VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGF0YSA9IGl0ZW0uZ2V0SXRlbURhdGEoKTtcbiAgICBpZiAoQ29kZXMuaXNEb3VibGVDbGlja01vZGUodGhpcy5kZXRhaWxNb2RlKSkge1xuICAgICAgdGhpcy5zYXZlRGF0YU5hdmlnYXRpb25JbkxvY2FsU3RvcmFnZSgpO1xuICAgICAgdGhpcy52aWV3RGV0YWlsKGRhdGEpO1xuICAgIH1cbiAgICB0aGlzLm9uRG91YmxlQ2xpY2suZW1pdChkYXRhKTtcbiAgfVxuXG4gIGdldCBxdWlja0ZpbHRlckFwcGVhcmFuY2UoKTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSB7XG4gICAgcmV0dXJuIHRoaXMuX3F1aWNrRmlsdGVyQXBwZWFyYW5jZTtcbiAgfVxuXG4gIHNldCBxdWlja0ZpbHRlckFwcGVhcmFuY2UodmFsdWU6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBbJ2ZpbGwnLCAnb3V0bGluZSddO1xuICAgIGlmICh2YWx1ZXMuaW5kZXhPZih2YWx1ZSkgPT09IC0xKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1RoZSBxdWljay1maWx0ZXItYXBwZWFyYW5jZSBhdHRyaWJ1dGUgaXMgdW5kZWZpbmVkIHNvIHRoZSBvdXRsaW5lIHZhbHVlIHdpbGwgYmUgdXNlZCcpO1xuICAgICAgdmFsdWUgPSAnb3V0bGluZSc7XG4gICAgfVxuICAgIHRoaXMuX3F1aWNrRmlsdGVyQXBwZWFyYW5jZSA9IHZhbHVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFNxbFR5cGVzT2ZLZXlzKCkge1xuICAgIGNvbnN0IHNxbFR5cGVzID0gdGhpcy5nZXRTcWxUeXBlcygpO1xuICAgIGNvbnN0IHNxbFR5cGVzQXJnID0ge307XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHNxbFR5cGVzKSkge1xuICAgICAgdGhpcy5rZXlzQXJyYXkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBzcWxUeXBlc0FyZ1trZXldID0gc3FsVHlwZXNba2V5XTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gc3FsVHlwZXNBcmc7XG5cbiAgfVxuXG4gIGNvbXBhcmVSb3coKTogKChvMTogYW55LCBvMjogYW55KSA9PiBib29sZWFuKSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIChvMTogYW55LCBvMjogYW55KSA9PiB0aGlzLmtleXNBcnJheS5ldmVyeShrZXkgPT4gbzFba2V5XSA9PT0gbzJba2V5XSk7XG4gIH1cbn1cblxuLypUaGlzIGNsYXNzIGlzIGRlZmluaWVkIHRvIG1hbnRhaW4gYmFjd2FyZHMgY29tcGF0aWJpbGl0eSAqL1xuQERpcmVjdGl2ZSgpXG5leHBvcnQgY2xhc3MgT1NlcnZpY2VDb21wb25lbnQgZXh0ZW5kcyBBYnN0cmFjdE9TZXJ2aWNlQ29tcG9uZW50PERlZmF1bHRTZXJ2aWNlQ29tcG9uZW50U3RhdGVTZXJ2aWNlPiB7XG5cbn1cbiJdfQ==
@@ -64,7 +64,7 @@ export class OColumn {
64
64
  this.type = column.type;
65
65
  this.className = 'o-column-' + (this.type) + ' ';
66
66
  }
67
- if (Util.isDefined(column.getSQLType)) {
67
+ if (Util.isDefined(column.type)) {
68
68
  this.sqlType = column.getSQLType();
69
69
  }
70
70
  if (Util.isDefined(column.class)) {
@@ -201,4 +201,4 @@ export class OColumn {
201
201
  return this.searching && this.visible && !(this.renderer != null && this.renderer.filterFunction != null);
202
202
  }
203
203
  }
204
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1jb2x1bW4uY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbnRpbWl6ZS13ZWItbmd4L3NyYy9saWIvY29tcG9uZW50cy90YWJsZS9jb2x1bW4vby1jb2x1bW4uY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQVFuRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFMUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTVDLE1BQU0sT0FBTyxPQUFPO0lBQXBCO1FBY1ksYUFBUSxHQUFZLEtBQUssQ0FBQztRQVk1QixxQkFBZ0IsR0FBNkIsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xGLGdCQUFXLEdBQXdCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQW9PakYsQ0FBQztJQWpPQyxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLEdBQVk7UUFDdEIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFO1lBQ3BFLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1NBQ3ZCO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksSUFBSSxHQUFHLENBQUM7UUFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDL0MsQ0FBQztJQUVELG9CQUFvQixDQUFDLElBQVM7UUFDNUIsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENB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QUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLENBQUM7SUFDNUcsQ0FBQztDQUVGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IE9UYWJsZUNvbHVtbkNhbGN1bGF0ZWQgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtY29sdW1uLWNhbGN1bGF0ZWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IE9UYWJsZUNvbHVtbiB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvby10YWJsZS1jb2x1bW4uaW50ZXJmYWNlJztcbmltcG9ydCB7IEV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi8uLi90eXBlcy9leHByZXNzaW9uLnR5cGUnO1xuaW1wb3J0IHsgT3BlcmF0b3JGdW5jdGlvbiB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL29wZXJhdGlvbi1mdW5jdGlvbi50eXBlJztcbmltcG9ydCB7IE9Db2x1bW5BZ2dyZWdhdGUgfSBmcm9tICcuLi8uLi8uLi90eXBlcy90YWJsZS9vLWNvbHVtbi1hZ2dyZWdhdGUudHlwZSc7XG5pbXBvcnQgeyBPQ29sdW1uVG9vbHRpcCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL3RhYmxlL28tY29sdW1uLXRvb2x0aXAudHlwZSc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vLi4vLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IE9CYXNlVGFibGVDZWxsUmVuZGVyZXIgfSBmcm9tICcuL2NlbGwtcmVuZGVyZXIvby1iYXNlLXRhYmxlLWNlbGwtcmVuZGVyZXIuY2xhc3MnO1xuaW1wb3J0IHsgQ29kZXMgfSBmcm9tICcuLi8uLi8uLi91dGlsL2NvZGVzJztcblxuZXhwb3J0IGNsYXNzIE9Db2x1bW4ge1xuICBhdHRyOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICBzcWxUeXBlOiBudW1iZXI7XG4gIGNsYXNzTmFtZTogc3RyaW5nO1xuICBvcmRlcmFibGU6IGJvb2xlYW47XG4gIGdyb3VwYWJsZTogYm9vbGVhbjtcbiAgX3NlYXJjaGFibGU6IGJvb2xlYW47XG4gIHNlYXJjaGluZzogYm9vbGVhbjsgLy8gdGhpcyBjb2x1bW4gaXMgdXNlZCB0byBmaWx0ZXIgaW4gcXVpY2tmaWx0ZXJcbiAgdmlzaWJsZTogYm9vbGVhbjtcbiAgcmVuZGVyZXI6IE9CYXNlVGFibGVDZWxsUmVuZGVyZXI7XG4gIGVkaXRvcjogYW55O1xuICBwcm90ZWN0ZWQgX2VkaXRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgX3dpZHRoOiBzdHJpbmc7XG4gIG1pbldpZHRoOiBzdHJpbmc7XG4gIG1heFdpZHRoOiBzdHJpbmc7XG4gIGFnZ3JlZ2F0ZTogT0NvbHVtbkFnZ3JlZ2F0ZTtcbiAgY2FsY3VsYXRlOiBzdHJpbmcgfCBPcGVyYXRvckZ1bmN0aW9uO1xuICBkZWZpbml0aW9uOiBPVGFibGVDb2x1bW47XG4gIHRvb2x0aXA6IE9Db2x1bW5Ub29sdGlwO1xuICByZXNpemFibGU6IGJvb2xlYW47XG4gIERPTVdpZHRoOiBudW1iZXI7XG4gIGZpbHRlckV4cHJlc3Npb25GdW5jdGlvbjogKGNvbHVtbkF0dHI6IHN0cmluZywgcXVpY2tGaWx0ZXI/OiBzdHJpbmcpID0+IEV4cHJlc3Npb247XG5cbiAgcHJpdmF0ZSBtdWx0aWxpbmVTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRoaXMubXVsdGlsaW5lKTtcbiAgcHVibGljIGlzTXVsdGlsaW5lOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5tdWx0aWxpbmVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBwcml2YXRlIF9tdWx0aWxpbmU6IGJvb2xlYW47XG5cbiAgZ2V0IGVkaXRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2VkaXRpbmc7XG4gIH1cblxuICBzZXQgZWRpdGluZyh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy50eXBlID09PSAnYm9vbGVhbicgJiYgdGhpcy5lZGl0b3IgJiYgdGhpcy5lZGl0b3IuYXV0b0NvbW1pdCkge1xuICAgICAgdGhpcy5fZWRpdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLl9lZGl0aW5nID0gdGhpcy5lZGl0b3IgIT0gbnVsbCAmJiB2YWw7XG4gICAgdGhpcy5lZGl0b3Iuc2V0RWRpdGluZ1Jvd0NsYXNzKHRoaXMuX2VkaXRpbmcpXG4gIH1cblxuICBzZXREZWZhdWx0UHJvcGVydGllcyhhcmdzOiBhbnkpIHtcbiAgICB0aGlzLnR5cGUgPSAnc3RyaW5nJztcbiAgICB0aGlzLmNsYXNzTmFtZSA9ICdvLWNvbHVtbi0nICsgKHRoaXMudHlwZSkgKyAnICc7XG4gICAgdGhpcy5vcmRlcmFibGUgPSBhcmdzLm9yZGVyYWJsZTtcbiAgICB0aGlzLnJlc2l6YWJsZSA9IGFyZ3MucmVzaXphYmxlO1xuICAgIHRoaXMuZ3JvdXBhYmxlID0gYXJncy5ncm91cGFibGU7XG4gICAgdGhpcy5zZWFyY2hhYmxlID0gdHJ1ZTtcbiAgICB0aGlzLnNlYXJjaGluZyA9IHRydWU7XG4gICAgLy8gY29sdW1uIHdpdGhvdXQgJ2F0dHInIHNob3VsZCBjb250YWluIG9ubHkgcmVuZGVyZXJzIHRoYXQgZG8gbm90IGRlcGVuZCBvbiBjZWxsIGRhdGEsIGJ1dCByb3cgZGF0YSAoZS5nLiBhY3Rpb25zKVxuICAgIHRoaXMubmFtZSA9IHRoaXMuYXR0cjtcbiAgICB0aGlzLnRpdGxlID0gdGhpcy5hdHRyO1xuICAgIHRoaXMubXVsdGlsaW5lID0gZmFsc2U7XG4gIH1cblxuICBzZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtbjogT1RhYmxlQ29sdW1uICYgT1RhYmxlQ29sdW1uQ2FsY3VsYXRlZCkge1xuICAgIHRoaXMudGl0bGUgPSBVdGlsLmlzRGVmaW5lZChjb2x1bW4udGl0bGUpID8gY29sdW1uLnRpdGxlIDogY29sdW1uLmF0dHI7XG4gICAgdGhpcy5kZWZpbml0aW9uID0gY29sdW1uO1xuICAgIHRoaXMubXVsdGlsaW5lID0gY29sdW1uLm11bHRpbGluZTtcblxuICAgIGlmIChVdGlsLmlzRGVmaW5lZChjb2x1bW4ubWluV2lkdGgpKSB7XG4gICAgICB0aGlzLm1pbldpZHRoID0gY29sdW1uLm1pbldpZHRoO1xuICAgIH1cbiAgICBpZiAoVXRpbC5pc0RlZmluZWQoY29sdW1uLm1heFdpZHRoKSkge1xuICAgICAgdGhpcy5tYXhXaWR0aCA9IGNvbHVtbi5tYXhXaWR0aDtcbiAgICB9XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGNvbHVtbi5vcmRlcmFibGUpKSB7XG4gICAgICB0aGlzLm9yZGVyYWJsZSA9IGNvbHVtbi5vcmRlcmFibGU7XG4gICAgfVxuICAgIGlmIChVdGlsLmlzRGVmaW5lZChjb2x1bW4ucmVzaXphYmxlKSkge1xuICAgICAgdGhpcy5yZXNpemFibGUgPSBjb2x1bW4ucmVzaXphYmxlO1xuICAgIH1cblxuICAgIGlmIChVdGlsLmlzRGVmaW5lZChjb2x1bW4uc2VhcmNoYWJsZSkpIHtcbiAgICAgIHRoaXMuc2VhcmNoYWJsZSA9IGNvbHVtbi5zZWFyY2hhYmxlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlYXJjaGFibGUgPSBjb2x1bW4/LnR5cGUgIT09ICdkYXRlJztcbiAgICB9XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGNvbHVtbi5ncm91cGFibGUpKSB7XG4gICAgICB0aGlzLmdyb3VwYWJsZSA9IGNvbHVtbi5ncm91cGFibGU7XG4gICAgfVxuICAgIGlmIChVdGlsLmlzRGVmaW5lZChjb2x1bW4ucmVuZGVyZXIpKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyID0gY29sdW1uLnJlbmRlcmVyO1xuICAgIH1cbiAgICBpZiAoVXRpbC5pc0RlZmluZWQoY29sdW1uLmVkaXRvcikpIHtcbiAgICAgIHRoaXMuZWRpdG9yID0gY29sdW1uLmVkaXRvcjtcbiAgICB9XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGNvbHVtbi50eXBlKSkge1xuICAgICAgdGhpcy50eXBlID0gY29sdW1uLnR5cGU7XG4gICAgICB0aGlzLmNsYXNzTmFtZSA9ICdvLWNvbHVtbi0nICsgKHRoaXMudHlwZSkgKyAnICc7XG4gICAgfVxuXG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGNvbHVtbi5nZXRTUUxUeXBlKSkge1xuICAgICAgdGhpcy5zcWxUeXBlID0gY29sdW1uLmdldFNRTFR5cGUoKTtcbiAgICB9XG5cbiAgICBpZiAoVXRpbC5pc0RlZmluZWQoY29sdW1uLmNsYXNzKSkge1xuICAgICAgdGhpcy5jbGFzc05hbWUgPSBVdGlsLmlzRGVmaW5lZCh0aGlzLmNsYXNzTmFtZSkgPyAodGhpcy5jbGFzc05hbWUgKyAnICcgKyBjb2x1bW4uY2xhc3MpIDogY29sdW1uLmNsYXNzO1xuICAgIH1cbiAgICAvLyBpZiAoY29sdW1uIGluc3RhbmNlb2YgT1RhYmxlQ29sdW1uQ2FsY3VsYXRlZENvbXBvbmVudCkge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChjb2x1bW4ub3BlcmF0aW9uKSB8fCBVdGlsLmlzRGVmaW5lZChjb2x1bW4uZnVuY3Rpb25PcGVyYXRpb24pKSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZSA9IGNvbHVtbi5vcGVyYXRpb24gPyBjb2x1bW4ub3BlcmF0aW9uIDogY29sdW1uLmZ1bmN0aW9uT3BlcmF0aW9uO1xuICAgIH1cbiAgICAvLyB9XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGNvbHVtbi50b29sdGlwKSAmJiBjb2x1bW4udG9vbHRpcCkge1xuICAgICAgdGhpcy50b29sdGlwID0ge1xuICAgICAgICB2YWx1ZTogY29sdW1uLnRvb2x0aXBWYWx1ZSxcbiAgICAgICAgZnVuY3Rpb246IGNvbHVtbi50b29sdGlwRnVuY3Rpb25cbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChVdGlsLmlzRGVmaW5lZChjb2x1bW4uZmlsdGVyRXhwcmVzc2lvbkZ1bmN0aW9uKSkge1xuICAgICAgdGhpcy5maWx0ZXJFeHByZXNzaW9uRnVuY3Rpb24gPSBjb2x1bW4uZmlsdGVyRXhwcmVzc2lvbkZ1bmN0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHNldCBzZWFyY2hhYmxlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuX3NlYXJjaGFibGUgPSB2YWw7XG4gICAgdGhpcy5zZWFyY2hpbmcgPSB2YWw7XG4gIH1cblxuICBnZXQgc2VhcmNoYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoYWJsZTtcbiAgfVxuXG4gIHNldCBtdWx0aWxpbmUodmFsOiBib29sZWFuKSB7XG4gICAgdmFsID0gVXRpbC5wYXJzZUJvb2xlYW4oU3RyaW5nKHZhbCkpO1xuICAgIHRoaXMuX211bHRpbGluZSA9IHZhbDtcbiAgICB0aGlzLm11bHRpbGluZVN1YmplY3QubmV4dCh0aGlzLl9tdWx0aWxpbmUpO1xuICB9XG5cbiAgZ2V0IG11bHRpbGluZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbXVsdGlsaW5lO1xuICB9XG5cbiAgaGFzVG9vbHRpcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gVXRpbC5pc0RlZmluZWQodGhpcy50b29sdGlwKTtcbiAgfVxuXG4gIGdldFRvb2x0aXAocm93RGF0YTogYW55KTogYW55IHtcbiAgICBpZiAoIXRoaXMuaGFzVG9vbHRpcCgpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgdG9vbHRpcDtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy50b29sdGlwLnZhbHVlKSkge1xuICAgICAgdG9vbHRpcCA9IHRoaXMudG9vbHRpcC52YWx1ZTtcbiAgICB9IGVsc2UgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMudG9vbHRpcC5mdW5jdGlvbikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRvb2x0aXAgPSB0aGlzLnRvb2x0aXAuZnVuY3Rpb24ocm93RGF0YSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2Fybignby10YWJsZS1jb2x1bW4gdG9vbHRpcC1mdW5jdGlvbiBkaWRudCB3b3JrZWQnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdG9vbHRpcCA9IFV0aWwuaXNEZWZpbmVkKHRoaXMucmVuZGVyZXIpID8gdGhpcy5yZW5kZXJlci5nZXRUb29sdGlwKHJvd0RhdGFbdGhpcy5uYW1lXSwgcm93RGF0YSkgOiByb3dEYXRhW3RoaXMubmFtZV07XG4gICAgfVxuICAgIHJldHVybiB0b29sdGlwO1xuICB9XG5cbiAgZ2V0TWluV2lkdGgoKSB7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMud2lkdGgpKSB7XG4gICAgICByZXR1cm4gdGhpcy53aWR0aDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWluV2lkdGg7XG4gIH1cblxuICBnZXRNaW5XaWR0aFZhbHVlKCkge1xuICAgIHJldHVybiBVdGlsLmV4dHJhY3RQaXhlbHNWYWx1ZSh0aGlzLm1pbldpZHRoLCBDb2Rlcy5ERUZBVUxUX0NPTFVNTl9NSU5fV0lEVEgpO1xuICB9XG5cbiAgZ2V0TWF4V2lkdGhWYWx1ZSgpIHtcbiAgICBjb25zdCB2YWx1ZSA9IFV0aWwuZXh0cmFjdFBpeGVsc1ZhbHVlKHRoaXMubWF4V2lkdGgpO1xuICAgIHJldHVybiB2YWx1ZSA/IHZhbHVlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgc2V0UmVuZGVyV2lkdGgoaG9yaXpvbnRhbFNjcm9sbGVkOiBib29sZWFuLCBjbGllbnRXaWR0aDogbnVtYmVyKSB7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMud2lkdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdFdpZHRoID0gKGhvcml6b250YWxTY3JvbGxlZCkgPyB1bmRlZmluZWQgOiAnYXV0byc7XG4gICAgdGhpcy53aWR0aCA9IFV0aWwuaXNEZWZpbmVkKHRoaXMuRE9NV2lkdGgpID8gKHRoaXMuZ2V0RE9NV2lkdGgoY2xpZW50V2lkdGgpICsgJ3B4JykgOiBkZWZhdWx0V2lkdGg7XG4gIH1cblxuICBnZXRET01XaWR0aCh2YWw6IGFueSk6IG51bWJlciB7XG4gICAgbGV0IERPTVdpZHRoO1xuICAgIGNvbnN0IHB4VmFsID0gVXRpbC5leHRyYWN0UGl4ZWxzVmFsdWUodmFsKTtcblxuICAgIGlmIChVdGlsLmlzRGVmaW5lZChweFZhbCkpIHtcbiAgICAgIERPTVdpZHRoID0gcHhWYWw7XG4gICAgICBjb25zdCBtaW5WYWx1ZSA9IHRoaXMuZ2V0TWluV2lkdGhWYWx1ZSgpO1xuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG1pblZhbHVlKSAmJiBweFZhbCA+IDAgJiYgcHhWYWwgPCBtaW5WYWx1ZSkge1xuICAgICAgICBET01XaWR0aCA9IG1pblZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5tYXhXaWR0aCkpIHtcbiAgICAgICAgY29uc3QgbWF4VmFsdWUgPSBVdGlsLmV4dHJhY3RQaXhlbHNWYWx1ZSh0aGlzLm1heFdpZHRoKTtcbiAgICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG1heFZhbHVlKSAmJiBweFZhbCA+IG1heFZhbHVlKSB7XG4gICAgICAgICAgRE9NV2lkdGggPSBtYXhWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfVxuICAgIHJldHVybiBET01XaWR0aDtcbiAgfVxuXG4gIHNldCB3aWR0aCh2YWw6IHN0cmluZykge1xuICAgIGxldCB3aWR0aFZhbCA9IHZhbDtcbiAgICBsZXQgRE9NV2lkdGggPSB0aGlzLmdldERPTVdpZHRoKHZhbCk7XG4gICAgY29uc3QgcHhWYWwgPSBVdGlsLmV4dHJhY3RQaXhlbHNWYWx1ZShET01XaWR0aCk7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHB4VmFsKSkge1xuICAgICAgdGhpcy5ET01XaWR0aCA9IHB4VmFsO1xuICAgICAgd2lkdGhWYWwgPSBweFZhbCArICdweCc7XG4gICAgfVxuXG4gICAgdGhpcy5fd2lkdGggPSB3aWR0aFZhbDtcbiAgfVxuXG4gIGdldCB3aWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93aWR0aDtcbiAgfVxuXG5cbiAgZ2V0V2lkdGhUb1N0b3JlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX3dpZHRoO1xuICB9XG5cbiAgc2V0V2lkdGgodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLndpZHRoID0gdmFsICsgJ3B4JztcbiAgICB0aGlzLkRPTVdpZHRoID0gdmFsO1xuICB9XG5cbiAgZ2V0VGl0bGVBbGlnbkNsYXNzKCkge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLmRlZmluaXRpb24pKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZWZpbml0aW9uLnRpdGxlQWxpZ24gfHwgQ29kZXMuQ09MVU1OX1RJVExFX0FMSUdOX0NFTlRFUjtcbiAgICB9XG4gICAgLy8gZGVmYXVsdCB0aXRsZSBhbGlnblxuICAgIHJldHVybiBDb2Rlcy5DT0xVTU5fVElUTEVfQUxJR05fQ0VOVEVSO1xuICB9XG5cbiAgZ2V0RmlsdGVyVmFsdWUoY2VsbFZhbHVlOiBhbnksIHJvd1ZhbHVlPzogYW55KTogYW55W10ge1xuICAgIGlmICh0aGlzLnJlbmRlcmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRGaWx0ZXIoY2VsbFZhbHVlLCByb3dWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbY2VsbFZhbHVlXTtcbiAgICB9XG4gIH1cblxuICB1c2VDdXN0b21GaWx0ZXJGdW5jdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWFyY2hpbmcgJiYgdGhpcy52aXNpYmxlICYmIHRoaXMucmVuZGVyZXIgIT0gbnVsbCAmJiB0aGlzLnJlbmRlcmVyLmZpbHRlckZ1bmN0aW9uICE9IG51bGw7XG4gIH1cblxuICB1c2VRdWlja2ZpbHRlckZ1bmN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlYXJjaGluZyAmJiB0aGlzLnZpc2libGUgJiYgISh0aGlzLnJlbmRlcmVyICE9IG51bGwgJiYgdGhpcy5yZW5kZXJlci5maWx0ZXJGdW5jdGlvbiAhPSBudWxsKTtcbiAgfVxuXG59XG4iXX0=
204
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1jb2x1bW4uY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbnRpbWl6ZS13ZWItbmd4L3NyYy9saWIvY29tcG9uZW50cy90YWJsZS9jb2x1bW4vby1jb2x1bW4uY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQVFuRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFMUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTVDLE1BQU0sT0FBTyxPQUFPO0lBQXBCO1FBY1ksYUFBUSxHQUFZLEtBQUssQ0FBQztRQVk1QixxQkFBZ0IsR0FBNkIsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xGLGdCQUFXLEdBQXdCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQW9PakYsQ0FBQztJQWpPQyxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLEdBQVk7UUFDdEIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFO1lBQ3BFLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1NBQ3ZCO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksSUFBSSxHQUFHLENBQUM7UUFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDL0MsQ0FBQztJQUVELG9CQUFvQixDQUFDLElBQVM7UUFDNUIsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENB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QUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLENBQUM7SUFDNUcsQ0FBQztDQUVGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IE9UYWJsZUNvbHVtbkNhbGN1bGF0ZWQgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtY29sdW1uLWNhbGN1bGF0ZWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IE9UYWJsZUNvbHVtbiB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvby10YWJsZS1jb2x1bW4uaW50ZXJmYWNlJztcbmltcG9ydCB7IEV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi8uLi90eXBlcy9leHByZXNzaW9uLnR5cGUnO1xuaW1wb3J0IHsgT3BlcmF0b3JGdW5jdGlvbiB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL29wZXJhdGlvbi1mdW5jdGlvbi50eXBlJztcbmltcG9ydCB7IE9Db2x1bW5BZ2dyZWdhdGUgfSBmcm9tICcuLi8uLi8uLi90eXBlcy90YWJsZS9vLWNvbHVtbi1hZ2dyZWdhdGUudHlwZSc7XG5pbXBvcnQgeyBPQ29sdW1uVG9vbHRpcCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL3RhYmxlL28tY29sdW1uLXRvb2x0aXAudHlwZSc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vLi4vLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IE9CYXNlVGFibGVDZWxsUmVuZGVyZXIgfSBmcm9tICcuL2NlbGwtcmVuZGVyZXIvby1iYXNlLXRhYmxlLWNlbGwtcmVuZGVyZXIuY2xhc3MnO1xuaW1wb3J0IHsgQ29kZXMgfSBmcm9tICcuLi8uLi8uLi91dGlsL2NvZGVzJztcblxuZXhwb3J0IGNsYXNzIE9Db2x1bW4ge1xuICBhdHRyOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICBzcWxUeXBlOiBudW1iZXI7XG4gIGNsYXNzTmFtZTogc3RyaW5nO1xuICBvcmRlcmFibGU6IGJvb2xlYW47XG4gIGdyb3VwYWJsZTogYm9vbGVhbjtcbiAgX3NlYXJjaGFibGU6IGJvb2xlYW47XG4gIHNlYXJjaGluZzogYm9vbGVhbjsgLy8gdGhpcyBjb2x1bW4gaXMgdXNlZCB0byBmaWx0ZXIgaW4gcXVpY2tmaWx0ZXJcbiAgdmlzaWJsZTogYm9vbGVhbjtcbiAgcmVuZGVyZXI6IE9CYXNlVGFibGVDZWxsUmVuZGVyZXI7XG4gIGVkaXRvcjogYW55O1xuICBwcm90ZWN0ZWQgX2VkaXRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgX3dpZHRoOiBzdHJpbmc7XG4gIG1pbldpZHRoOiBzdHJpbmc7XG4gIG1heFdpZHRoOiBzdHJpbmc7XG4gIGFnZ3JlZ2F0ZTogT0NvbHVtbkFnZ3JlZ2F0ZTtcbiAgY2FsY3VsYXRlOiBzdHJpbmcgfCBPcGVyYXRvckZ1bmN0aW9uO1xuICBkZWZpbml0aW9uOiBPVGFibGVDb2x1bW47XG4gIHRvb2x0aXA6IE9Db2x1bW5Ub29sdGlwO1xuICByZXNpemFibGU6IGJvb2xlYW47XG4gIERPTVdpZHRoOiBudW1iZXI7XG4gIGZpbHRlckV4cHJlc3Npb25GdW5jdGlvbjogKGNvbHVtbkF0dHI6IHN0cmluZywgcXVpY2tGaWx0ZXI/OiBzdHJpbmcpID0+IEV4cHJlc3Npb247XG5cbiAgcHJpdmF0ZSBtdWx0aWxpbmVTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRoaXMubXVsdGlsaW5lKTtcbiAgcHVibGljIGlzTXVsdGlsaW5lOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5tdWx0aWxpbmVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBwcml2YXRlIF9tdWx0aWxpbmU6IGJvb2xlYW47XG5cbiAgZ2V0IGVkaXRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2VkaXRpbmc7XG4gIH1cblxuICBzZXQgZWRpdGluZyh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy50eXBlID09PSAnYm9vbGVhbicgJiYgdGhpcy5lZGl0b3IgJiYgdGhpcy5lZGl0b3IuYXV0b0NvbW1pdCkge1xuICAgICAgdGhpcy5fZWRpdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLl9lZGl0aW5nID0gdGhpcy5lZGl0b3IgIT0gbnVsbCAmJiB2YWw7XG4gICAgdGhpcy5lZGl0b3Iuc2V0RWRpdGluZ1Jvd0NsYXNzKHRoaXMuX2VkaXRpbmcpXG4gIH1cblxuICBzZXREZWZhdWx0UHJvcGVydGllcyhhcmdzOiBhbnkpIHtcbiAgICB0aGlzLnR5cGUgPSAnc3RyaW5nJztcbiAgICB0aGlzLmNsYXNzTmFtZSA9ICdvLWNvbHVtbi0nICsgKHRoaXMudHlwZSkgKyAnICc7XG4gICAgdGhpcy5vcmRlcmFibGUgPSBhcmdzLm9yZGVyYWJsZTtcbiAgICB0aGlzLnJlc2l6YWJsZSA9IGFyZ3MucmVzaXphYmxlO1xuICAgIHRoaXMuZ3JvdXBhYmxlID0gYXJncy5ncm91cGFibGU7XG4gICAgdGhpcy5zZWFyY2hhYmxlID0gdHJ1ZTtcbiAgICB0aGlzLnNlYXJjaGluZyA9IHRydWU7XG4gICAgLy8gY29sdW1uIHdpdGhvdXQgJ2F0dHInIHNob3VsZCBjb250YWluIG9ubHkgcmVuZGVyZXJzIHRoYXQgZG8gbm90IGRlcGVuZCBvbiBjZWxsIGRhdGEsIGJ1dCByb3cgZGF0YSAoZS5nLiBhY3Rpb25zKVxuICAgIHRoaXMubmFtZSA9IHRoaXMuYXR0cjtcbiAgICB0aGlzLnRpdGxlID0gdGhpcy5hdHRyO1xuICAgIHRoaXMubXVsdGlsaW5lID0gZmFsc2U7XG4gIH1cblxuICBzZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtbjogT1RhYmxlQ29sdW1uICYgT1RhYmxlQ29sdW1uQ2FsY3VsYXRlZCkge1xuICAgIHRoaXMudGl0bGUgPSBVdGlsLmlzRGVmaW5lZChjb2x1bW4udGl0bGUpID8gY29sdW1uLnRpdGxlIDogY29sdW1uLmF0dHI7XG4gICAgdGhpcy5kZWZpbml0aW9uID0gY29sdW1uO1xuICAgIHRoaXMubXVsdGlsaW5lID0gY29sdW1uLm11bHRpbGluZTtcblxuICAgIGlmIChVdGlsLmlzRGVmaW5lZChjb2x1bW4ubWluV2lkdGgpKSB7XG4gICAgICB0aGlzLm1pbldpZHRoID0gY29sdW1uLm1pbldpZHRoO1xuICAgIH1cbiAgICBpZiAoVXRpbC5pc0RlZmluZWQoY29sdW1uLm1heFdpZHRoKSkge1xuICAgICAgdGhpcy5tYXhXaWR0aCA9IGNvbHVtbi5tYXhXaWR0aDtcbiAgICB9XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGNvbHVtbi5vcmRlcmFibGUpKSB7XG4gICAgICB0aGlzLm9yZGVyYWJsZSA9IGNvbHVtbi5vcmRlcmFibGU7XG4gICAgfVxuICAgIGlmIChVdGlsLmlzRGVmaW5lZChjb2x1bW4ucmVzaXphYmxlKSkge1xuICAgICAgdGhpcy5yZXNpemFibGUgPSBjb2x1bW4ucmVzaXphYmxlO1xuICAgIH1cblxuICAgIGlmIChVdGlsLmlzRGVmaW5lZChjb2x1bW4uc2VhcmNoYWJsZSkpIHtcbiAgICAgIHRoaXMuc2VhcmNoYWJsZSA9IGNvbHVtbi5zZWFyY2hhYmxlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlYXJjaGFibGUgPSBjb2x1bW4/LnR5cGUgIT09ICdkYXRlJztcbiAgICB9XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGNvbHVtbi5ncm91cGFibGUpKSB7XG4gICAgICB0aGlzLmdyb3VwYWJsZSA9IGNvbHVtbi5ncm91cGFibGU7XG4gICAgfVxuICAgIGlmIChVdGlsLmlzRGVmaW5lZChjb2x1bW4ucmVuZGVyZXIpKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyID0gY29sdW1uLnJlbmRlcmVyO1xuICAgIH1cbiAgICBpZiAoVXRpbC5pc0RlZmluZWQoY29sdW1uLmVkaXRvcikpIHtcbiAgICAgIHRoaXMuZWRpdG9yID0gY29sdW1uLmVkaXRvcjtcbiAgICB9XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGNvbHVtbi50eXBlKSkge1xuICAgICAgdGhpcy50eXBlID0gY29sdW1uLnR5cGU7XG4gICAgICB0aGlzLmNsYXNzTmFtZSA9ICdvLWNvbHVtbi0nICsgKHRoaXMudHlwZSkgKyAnICc7XG4gICAgfVxuXG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGNvbHVtbi50eXBlKSkge1xuICAgICAgdGhpcy5zcWxUeXBlID0gY29sdW1uLmdldFNRTFR5cGUoKTtcbiAgICB9XG5cbiAgICBpZiAoVXRpbC5pc0RlZmluZWQoY29sdW1uLmNsYXNzKSkge1xuICAgICAgdGhpcy5jbGFzc05hbWUgPSBVdGlsLmlzRGVmaW5lZCh0aGlzLmNsYXNzTmFtZSkgPyAodGhpcy5jbGFzc05hbWUgKyAnICcgKyBjb2x1bW4uY2xhc3MpIDogY29sdW1uLmNsYXNzO1xuICAgIH1cbiAgICAvLyBpZiAoY29sdW1uIGluc3RhbmNlb2YgT1RhYmxlQ29sdW1uQ2FsY3VsYXRlZENvbXBvbmVudCkge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChjb2x1bW4ub3BlcmF0aW9uKSB8fCBVdGlsLmlzRGVmaW5lZChjb2x1bW4uZnVuY3Rpb25PcGVyYXRpb24pKSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZSA9IGNvbHVtbi5vcGVyYXRpb24gPyBjb2x1bW4ub3BlcmF0aW9uIDogY29sdW1uLmZ1bmN0aW9uT3BlcmF0aW9uO1xuICAgIH1cbiAgICAvLyB9XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGNvbHVtbi50b29sdGlwKSAmJiBjb2x1bW4udG9vbHRpcCkge1xuICAgICAgdGhpcy50b29sdGlwID0ge1xuICAgICAgICB2YWx1ZTogY29sdW1uLnRvb2x0aXBWYWx1ZSxcbiAgICAgICAgZnVuY3Rpb246IGNvbHVtbi50b29sdGlwRnVuY3Rpb25cbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChVdGlsLmlzRGVmaW5lZChjb2x1bW4uZmlsdGVyRXhwcmVzc2lvbkZ1bmN0aW9uKSkge1xuICAgICAgdGhpcy5maWx0ZXJFeHByZXNzaW9uRnVuY3Rpb24gPSBjb2x1bW4uZmlsdGVyRXhwcmVzc2lvbkZ1bmN0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHNldCBzZWFyY2hhYmxlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuX3NlYXJjaGFibGUgPSB2YWw7XG4gICAgdGhpcy5zZWFyY2hpbmcgPSB2YWw7XG4gIH1cblxuICBnZXQgc2VhcmNoYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoYWJsZTtcbiAgfVxuXG4gIHNldCBtdWx0aWxpbmUodmFsOiBib29sZWFuKSB7XG4gICAgdmFsID0gVXRpbC5wYXJzZUJvb2xlYW4oU3RyaW5nKHZhbCkpO1xuICAgIHRoaXMuX211bHRpbGluZSA9IHZhbDtcbiAgICB0aGlzLm11bHRpbGluZVN1YmplY3QubmV4dCh0aGlzLl9tdWx0aWxpbmUpO1xuICB9XG5cbiAgZ2V0IG11bHRpbGluZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbXVsdGlsaW5lO1xuICB9XG5cbiAgaGFzVG9vbHRpcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gVXRpbC5pc0RlZmluZWQodGhpcy50b29sdGlwKTtcbiAgfVxuXG4gIGdldFRvb2x0aXAocm93RGF0YTogYW55KTogYW55IHtcbiAgICBpZiAoIXRoaXMuaGFzVG9vbHRpcCgpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgdG9vbHRpcDtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy50b29sdGlwLnZhbHVlKSkge1xuICAgICAgdG9vbHRpcCA9IHRoaXMudG9vbHRpcC52YWx1ZTtcbiAgICB9IGVsc2UgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMudG9vbHRpcC5mdW5jdGlvbikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRvb2x0aXAgPSB0aGlzLnRvb2x0aXAuZnVuY3Rpb24ocm93RGF0YSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2Fybignby10YWJsZS1jb2x1bW4gdG9vbHRpcC1mdW5jdGlvbiBkaWRudCB3b3JrZWQnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdG9vbHRpcCA9IFV0aWwuaXNEZWZpbmVkKHRoaXMucmVuZGVyZXIpID8gdGhpcy5yZW5kZXJlci5nZXRUb29sdGlwKHJvd0RhdGFbdGhpcy5uYW1lXSwgcm93RGF0YSkgOiByb3dEYXRhW3RoaXMubmFtZV07XG4gICAgfVxuICAgIHJldHVybiB0b29sdGlwO1xuICB9XG5cbiAgZ2V0TWluV2lkdGgoKSB7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMud2lkdGgpKSB7XG4gICAgICByZXR1cm4gdGhpcy53aWR0aDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWluV2lkdGg7XG4gIH1cblxuICBnZXRNaW5XaWR0aFZhbHVlKCkge1xuICAgIHJldHVybiBVdGlsLmV4dHJhY3RQaXhlbHNWYWx1ZSh0aGlzLm1pbldpZHRoLCBDb2Rlcy5ERUZBVUxUX0NPTFVNTl9NSU5fV0lEVEgpO1xuICB9XG5cbiAgZ2V0TWF4V2lkdGhWYWx1ZSgpIHtcbiAgICBjb25zdCB2YWx1ZSA9IFV0aWwuZXh0cmFjdFBpeGVsc1ZhbHVlKHRoaXMubWF4V2lkdGgpO1xuICAgIHJldHVybiB2YWx1ZSA/IHZhbHVlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgc2V0UmVuZGVyV2lkdGgoaG9yaXpvbnRhbFNjcm9sbGVkOiBib29sZWFuLCBjbGllbnRXaWR0aDogbnVtYmVyKSB7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMud2lkdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdFdpZHRoID0gKGhvcml6b250YWxTY3JvbGxlZCkgPyB1bmRlZmluZWQgOiAnYXV0byc7XG4gICAgdGhpcy53aWR0aCA9IFV0aWwuaXNEZWZpbmVkKHRoaXMuRE9NV2lkdGgpID8gKHRoaXMuZ2V0RE9NV2lkdGgoY2xpZW50V2lkdGgpICsgJ3B4JykgOiBkZWZhdWx0V2lkdGg7XG4gIH1cblxuICBnZXRET01XaWR0aCh2YWw6IGFueSk6IG51bWJlciB7XG4gICAgbGV0IERPTVdpZHRoO1xuICAgIGNvbnN0IHB4VmFsID0gVXRpbC5leHRyYWN0UGl4ZWxzVmFsdWUodmFsKTtcblxuICAgIGlmIChVdGlsLmlzRGVmaW5lZChweFZhbCkpIHtcbiAgICAgIERPTVdpZHRoID0gcHhWYWw7XG4gICAgICBjb25zdCBtaW5WYWx1ZSA9IHRoaXMuZ2V0TWluV2lkdGhWYWx1ZSgpO1xuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG1pblZhbHVlKSAmJiBweFZhbCA+IDAgJiYgcHhWYWwgPCBtaW5WYWx1ZSkge1xuICAgICAgICBET01XaWR0aCA9IG1pblZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5tYXhXaWR0aCkpIHtcbiAgICAgICAgY29uc3QgbWF4VmFsdWUgPSBVdGlsLmV4dHJhY3RQaXhlbHNWYWx1ZSh0aGlzLm1heFdpZHRoKTtcbiAgICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG1heFZhbHVlKSAmJiBweFZhbCA+IG1heFZhbHVlKSB7XG4gICAgICAgICAgRE9NV2lkdGggPSBtYXhWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfVxuICAgIHJldHVybiBET01XaWR0aDtcbiAgfVxuXG4gIHNldCB3aWR0aCh2YWw6IHN0cmluZykge1xuICAgIGxldCB3aWR0aFZhbCA9IHZhbDtcbiAgICBsZXQgRE9NV2lkdGggPSB0aGlzLmdldERPTVdpZHRoKHZhbCk7XG4gICAgY29uc3QgcHhWYWwgPSBVdGlsLmV4dHJhY3RQaXhlbHNWYWx1ZShET01XaWR0aCk7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHB4VmFsKSkge1xuICAgICAgdGhpcy5ET01XaWR0aCA9IHB4VmFsO1xuICAgICAgd2lkdGhWYWwgPSBweFZhbCArICdweCc7XG4gICAgfVxuXG4gICAgdGhpcy5fd2lkdGggPSB3aWR0aFZhbDtcbiAgfVxuXG4gIGdldCB3aWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93aWR0aDtcbiAgfVxuXG5cbiAgZ2V0V2lkdGhUb1N0b3JlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX3dpZHRoO1xuICB9XG5cbiAgc2V0V2lkdGgodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLndpZHRoID0gdmFsICsgJ3B4JztcbiAgICB0aGlzLkRPTVdpZHRoID0gdmFsO1xuICB9XG5cbiAgZ2V0VGl0bGVBbGlnbkNsYXNzKCkge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLmRlZmluaXRpb24pKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZWZpbml0aW9uLnRpdGxlQWxpZ24gfHwgQ29kZXMuQ09MVU1OX1RJVExFX0FMSUdOX0NFTlRFUjtcbiAgICB9XG4gICAgLy8gZGVmYXVsdCB0aXRsZSBhbGlnblxuICAgIHJldHVybiBDb2Rlcy5DT0xVTU5fVElUTEVfQUxJR05fQ0VOVEVSO1xuICB9XG5cbiAgZ2V0RmlsdGVyVmFsdWUoY2VsbFZhbHVlOiBhbnksIHJvd1ZhbHVlPzogYW55KTogYW55W10ge1xuICAgIGlmICh0aGlzLnJlbmRlcmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRGaWx0ZXIoY2VsbFZhbHVlLCByb3dWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbY2VsbFZhbHVlXTtcbiAgICB9XG4gIH1cblxuICB1c2VDdXN0b21GaWx0ZXJGdW5jdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWFyY2hpbmcgJiYgdGhpcy52aXNpYmxlICYmIHRoaXMucmVuZGVyZXIgIT0gbnVsbCAmJiB0aGlzLnJlbmRlcmVyLmZpbHRlckZ1bmN0aW9uICE9IG51bGw7XG4gIH1cblxuICB1c2VRdWlja2ZpbHRlckZ1bmN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlYXJjaGluZyAmJiB0aGlzLnZpc2libGUgJiYgISh0aGlzLnJlbmRlcmVyICE9IG51bGwgJiYgdGhpcy5yZW5kZXJlci5maWx0ZXJGdW5jdGlvbiAhPSBudWxsKTtcbiAgfVxuXG59XG4iXX0=