@datorama/core 22.14.1 → 22.15.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/bundle.scss +9987 -6561
  2. package/bundles/datorama-core.umd.js +242 -95
  3. package/bundles/datorama-core.umd.js.map +1 -1
  4. package/bundles/datorama-core.umd.min.js +60 -60
  5. package/bundles/datorama-core.umd.min.js.map +1 -1
  6. package/datorama-core.metadata.json +1 -1
  7. package/esm2015/lib/button/button.component.js +1 -1
  8. package/esm2015/lib/grid/dato-grid.js +4 -3
  9. package/esm2015/lib/grid/grid/grid.component.js +5 -9
  10. package/esm2015/lib/grid/grid-sort.utils.js +28 -0
  11. package/esm2015/lib/grid-v2/grid/grid-v2.component.js +10 -3
  12. package/esm2015/lib/grid-v2/grid/grid-v2.config.js +45 -14
  13. package/esm2015/lib/grid-v2/grid-column-header/grid-column-header.component.js +4 -1
  14. package/esm2015/lib/grid-v2/grid-column-header/grid-multi-select-header/grid-multi-select-header.component.js +4 -1
  15. package/esm2015/lib/grid-v2/grid-controller/grid-controller.component.js +60 -26
  16. package/esm2015/lib/grid-v2/grid-header/grid-header.component.js +3 -2
  17. package/esm2015/lib/grid-v2/grid-on-hover/grid-on-hover.component.js +17 -14
  18. package/esm2015/lib/grid-v2/grid-store/grid.query.js +11 -6
  19. package/esm2015/lib/grid-v2/grid-store/grid.service.js +19 -5
  20. package/esm2015/lib/grid-v2/grid-toolbar/grid-toolbar.component.js +23 -17
  21. package/esm2015/lib/radio/radio.component.js +1 -1
  22. package/esm2015/lib/utils/string.js +9 -11
  23. package/esm2015/lib/version.js +2 -2
  24. package/esm5/lib/button/button.component.js +1 -1
  25. package/esm5/lib/grid/dato-grid.js +4 -3
  26. package/esm5/lib/grid/grid/grid.component.js +5 -9
  27. package/esm5/lib/grid/grid-sort.utils.js +35 -0
  28. package/esm5/lib/grid-v2/grid/grid-v2.component.js +14 -3
  29. package/esm5/lib/grid-v2/grid/grid-v2.config.js +47 -15
  30. package/esm5/lib/grid-v2/grid-column-header/grid-column-header.component.js +4 -1
  31. package/esm5/lib/grid-v2/grid-column-header/grid-multi-select-header/grid-multi-select-header.component.js +4 -1
  32. package/esm5/lib/grid-v2/grid-controller/grid-controller.component.js +64 -26
  33. package/esm5/lib/grid-v2/grid-header/grid-header.component.js +3 -2
  34. package/esm5/lib/grid-v2/grid-on-hover/grid-on-hover.component.js +17 -14
  35. package/esm5/lib/grid-v2/grid-store/grid.query.js +11 -6
  36. package/esm5/lib/grid-v2/grid-store/grid.service.js +19 -5
  37. package/esm5/lib/grid-v2/grid-toolbar/grid-toolbar.component.js +23 -17
  38. package/esm5/lib/radio/radio.component.js +1 -1
  39. package/esm5/lib/utils/string.js +9 -11
  40. package/esm5/lib/version.js +2 -2
  41. package/fesm2015/datorama-core.js +226 -96
  42. package/fesm2015/datorama-core.js.map +1 -1
  43. package/fesm5/datorama-core.js +243 -97
  44. package/fesm5/datorama-core.js.map +1 -1
  45. package/lib/grid/grid-sort.utils.d.ts +15 -0
  46. package/lib/grid-v2/grid/grid-v2.component.d.ts +4 -0
  47. package/lib/grid-v2/grid/grid-v2.config.d.ts +1 -0
  48. package/lib/grid-v2/grid-column-header/grid-column-header.component.d.ts +2 -1
  49. package/lib/grid-v2/grid-column-header/grid-multi-select-header/grid-multi-select-header.component.d.ts +1 -0
  50. package/lib/grid-v2/grid-controller/grid-controller.component.d.ts +15 -0
  51. package/lib/grid-v2/grid-on-hover/grid-on-hover.component.d.ts +1 -3
  52. package/lib/grid-v2/grid-store/grid.service.d.ts +325 -281
  53. package/lib/grid-v2/grid-toolbar/grid-toolbar.component.d.ts +1 -0
  54. package/package.json +4 -1
  55. package/testing/src/grid/rows.ts +1 -1
@@ -25,6 +25,7 @@ import { combineLatest, Subject } from 'rxjs';
25
25
  import { triggerWindowResize } from '../../utils/user-agent';
26
26
  import { getColField, getColumnsSizes, isHtmlAllowedForCol, tryParsePivotValue } from './util';
27
27
  import { DatoGridMultiSelectColumnHeaderComponent } from '../grid-column-header/grid-multi-select-header/grid-multi-select-header.component';
28
+ import { applySortModel } from '../../grid/grid-sort.utils';
28
29
  var GridService = /** @class */ (function () {
29
30
  function GridService(store, gridQuery, translate, iconRegistry, svgRegistry, storageAPI, logger) {
30
31
  this.store = store;
@@ -316,8 +317,21 @@ var GridService = /** @class */ (function () {
316
317
  gridOptions.enableSearchHighlight) {
317
318
  normalized.cellRenderer = function (params) {
318
319
  var allowHTML = isHtmlAllowedForCol(gridOptions, params.colDef);
319
- var isEditable = (isFunction(normalized.editable) && normalized.editable(params)) ||
320
- (!isFunction(normalized.editable) && normalized.editable);
320
+ var column = params.column, colDef = params.colDef;
321
+ var editableParams = column && colDef
322
+ ? {
323
+ api: params.api,
324
+ columnApi: params.columnApi,
325
+ context: params.context,
326
+ node: params.node,
327
+ data: params.data,
328
+ column: column,
329
+ colDef: colDef
330
+ }
331
+ : null;
332
+ var isEditable = isFunction(normalized.editable)
333
+ ? editableParams && normalized.editable(editableParams)
334
+ : normalized.editable;
321
335
  return isEditable
322
336
  ? editableCellRendererWithSearchHighlight(params, _this.gridQuery.getSearchTerm(), allowHTML)
323
337
  : searchHighlightCellRenderer(params, _this.gridQuery.getSearchTerm(), allowHTML);
@@ -519,7 +533,7 @@ var GridService = /** @class */ (function () {
519
533
  }
520
534
  }
521
535
  this.updateSettings({ sort: sortToApply });
522
- this.api.grid.setSortModel([sortToApply]);
536
+ applySortModel(this.api.columns, [sortToApply]);
523
537
  if (this.gridRef.gridOptions.usePivotGridStyle) {
524
538
  this.api.grid.redrawRows();
525
539
  }
@@ -760,7 +774,7 @@ var GridService = /** @class */ (function () {
760
774
  columns.setColumnsVisible(removeGrouped, true);
761
775
  /* Apply sort */
762
776
  var gridSort = sort || this.initialSettings.sort;
763
- grid.setSortModel(gridSort ? [gridSort] : null);
777
+ applySortModel(columns, gridSort ? [gridSort] : []);
764
778
  /* Align grid */
765
779
  if (gridAlignment === 2 /* CUSTOM */) {
766
780
  /* Set column sizes */
@@ -1175,4 +1189,4 @@ var GridService = /** @class */ (function () {
1175
1189
  return GridService;
1176
1190
  }());
1177
1191
  export { GridService };
1178
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGRhdG9yYW1hL2NvcmUvIiwic291cmNlcyI6WyJsaWIvZ3JpZC12Mi9ncmlkLXN0b3JlL2dyaWQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQXdCLE1BQU0sZUFBZSxDQUFDO0FBZXpFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUV4RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxFQUNMLG9CQUFvQixFQUtwQixzQkFBc0IsRUFRdkIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVqRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBU2xGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLHFCQUFxQixFQUFrQixNQUFNLGtCQUFrQixDQUFDO0FBQ3pFLE9BQU8sRUFJTCxtQkFBbUIsRUFPbkIsdUNBQXVDLEVBQ3ZDLGFBQWEsRUFDYixvQkFBb0IsRUFDcEIsMkJB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O1NBeHRDWSxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIFF1ZXJ5TGlzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0b0dyaWRBcGkgfSBmcm9tICcuLi9ncmlkLWNvbnRyb2xsZXIvZ3JpZC1jb250cm9sbGVyLnR5cGVzJztcbmltcG9ydCB7XG4gIENlbGxDbGFzc1BhcmFtcyxcbiAgQ29sR3JvdXBEZWYsXG4gIENvbHVtbixcbiAgR2V0Q29udGV4dE1lbnVJdGVtc1BhcmFtcyxcbiAgR3JpZE9wdGlvbnMsXG4gIElDZWxsUmVuZGVyZXJQYXJhbXMsXG4gIElHZXRSb3dzUGFyYW1zLFxuICBSb3dEYXRhVHJhbnNhY3Rpb24sXG4gIFJvd05vZGUsXG4gIFJvd05vZGVUcmFuc2FjdGlvbixcbiAgUm93U2VsZWN0ZWRFdmVudFxufSBmcm9tICdAYWctZ3JpZC1jb21tdW5pdHkvY29yZSc7XG5pbXBvcnQgeyBHcmlkUXVlcnkgfSBmcm9tICcuL2dyaWQucXVlcnknO1xuaW1wb3J0IHsgRGF0b0NvcmVFcnJvciB9IGZyb20gJy4uLy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBEYXRvVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RyYW5zbGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IERhdG9DdXN0b21IZWFkZXJUZW1wbGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uL2dyaWQtY3VzdG9tLWhlYWRlci9jdXN0b20taGVhZGVyLXRlbXBsYXRlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgRGF0b0ZpbHRlckNvbmRpdGlvbnMsXG4gIERhdG9HcmlkQ29uZGl0aW9uYWxGaWx0ZXIsXG4gIERhdG9HcmlkRXh0ZXJuYWxGaWx0ZXIsXG4gIERhdG9HcmlkRmlsdGVyLFxuICBEYXRvR3JpZEZpbHRlckNvbmRpdGlvbixcbiAgRGF0b0dyaWRGaWx0ZXJTZWN0aW9ucyxcbiAgRGF0b0dyaWRGaWx0ZXJzTWFwLFxuICBEYXRvR3JpZFJhbmdlRmlsdGVyQ29uZGl0aW9uLFxuICBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkNvbmRpdGlvbixcbiAgU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIsXG4gIFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVycyxcbiAgU2VydmVyU2lkZVBhZ2luYXRpb25MaXN0Q29uZGl0aW9uLFxuICBTZXJ2ZXJTaWRlUGFnaW5hdGlvblJhbmdlQ29uZGl0aW9uXG59IGZyb20gJy4uL2dyaWQtZmlsdGVyL2dyaWQtZmlsdGVyLnR5cGVzJztcbmltcG9ydCB7IGNvZXJjZUFycmF5IH0gZnJvbSAnLi4vLi4vdXRpbHMvY29lcmNpb24nO1xuaW1wb3J0IHsgaXNFbXB0eSwgaXNGdW5jdGlvbiwgaXNOaWwsIGlzU3RyaW5nIH0gZnJvbSAnLi4vLi4vdXRpbHMvdmFsaWRhdG9ycyc7XG5pbXBvcnQgeyB2YWxpZGF0ZUZpbHRlciB9IGZyb20gJy4uL2dyaWQtZmlsdGVyL2ZpbHRlci12YWxpZGF0b3InO1xuaW1wb3J0IHsgQWdHcmlkQW5ndWxhciB9IGZyb20gJ0BhZy1ncmlkLWNvbW11bml0eS9hbmd1bGFyJztcbmltcG9ydCB7IEljb25SZWdpc3RyeSwgU3ZnUmVnaXN0cnkgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9pY29uLXJlZ2lzdHJ5JztcbmltcG9ydCB7IGdldFZpc2libGVBY3Rpb25zLCB0b29sYmFyQWN0aW9uVG9Db250ZXh0QWN0aW9uIH0gZnJvbSAnLi4vZ3JpZC12Mi51dGlsJztcbmltcG9ydCB7XG4gIERhdG9HcmlkU2V0dGluZ3MsXG4gIE5vcm1hbGl6ZU9wdGlvbnNQYXJhbXMsXG4gIFBpdm90Q29sdW1uRGF0YSxcbiAgU2VydmVyU2lkZVBhZ2luYXRpb25Db25maWcsXG4gIFN1Y2Nlc3NXcmFwcGVyUGFyYW1zXG59IGZyb20gJy4vZ3JpZC5zdG9yZS50eXBlcyc7XG5pbXBvcnQgeyBSb3dBY3Rpb24gfSBmcm9tICcuLi9ncmlkLXRvb2xiYXIvZ3JpZC10b29sYmFyLnR5cGVzJztcbmltcG9ydCB7IHdyaXRlVG9DbGlwYm9hcmQgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2NsaXBib2FyZC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgR3JpZFN0b3JlIH0gZnJvbSAnLi9ncmlkLnN0b3JlJztcbmltcG9ydCB7IERBVE9fR1JJRF9TVE9SQUdFX0FQSSwgR3JpZFN0b3JhZ2VBUEkgfSBmcm9tICcuLi9ncmlkLXNldHRpbmdzJztcbmltcG9ydCB7XG4gIEFjdGlvbkNvbnZlcnRlclBhcmFtcyxcbiAgRGF0b0dyaWRBbGlnbm1lbnQsXG4gIERhdG9HcmlkQ29sdW1uRGVmLFxuICBEYXRvR3JpZENvbHVtblR5cGVzLFxuICBEYXRvR3JpZEdldFJvd3NQYXJhbXMsXG4gIERhdG9HcmlkT3B0aW9ucyxcbiAgRGF0b0dyaWRTZXJ2ZXJTb3J0LFxuICBEYXRvR3JpZFNlcnZlclNvcnREaXJlY3Rpb24sXG4gIERhdG9HcmlkU29ydCxcbiAgRGF0b0dyaWRUcmVlQ29uZmlnLFxuICBlZGl0YWJsZUNlbGxSZW5kZXJlcldpdGhTZWFyY2hIaWdobGlnaHQsXG4gIEdyaWRNaW5XaWR0aHMsXG4gIEdyaWRSb3dTZWxlY3Rpb25UeXBlLFxuICBzZWFyY2hIaWdobGlnaHRDZWxsUmVuZGVyZXJcbn0gZnJvbSAnLi4vZ3JpZC9ncmlkLXYyLnR5cGVzJztcblxuaW1wb3J0IHsgY29udmVydFRvVHJlZURhdGEsIGRlZmF1bHRHcmlkT3B0aW9ucywgZGVmYXVsdEdyaWRUcmVlTGFiZWwgfSBmcm9tICcuLi9ncmlkL2dyaWQtdjIuY29uZmlnJztcbmltcG9ydCB7IGRpZmYgfSBmcm9tICcuLi8uLi91dGlscy9vYmplY3QnO1xuaW1wb3J0IHsgdW50aWxEZXN0cm95ZWQgfSBmcm9tICduZ3gtdGFrZS11bnRpbC1kZXN0cm95JztcbmltcG9ydCB7IENvcmVFdmVudExvZ2dlciwgQ29yZUV2ZW50VHlwZXMsIERBVE9fQ09SRV9MT0dHRVIgfSBmcm9tICcuLi8uLi9ldmVudC1sb2dnZXInO1xuaW1wb3J0IHsgSGFzaE1hcCB9IGZyb20gJy4uLy4uL3V0aWxzL3R5cGVzJztcbmltcG9ydCB7IHNpemUgfSBmcm9tICcuLi8uLi91dGlscy9jb2xsZWN0aW9uJztcbmltcG9ydCB7IE9wZXJhdG9yVHlwZXMgfSBmcm9tICcuLi8uLi9vcGVyYXRvci10b2dnbGVyL29wZXJhdG9yLXRvZ2dsZXIudHlwZXMnO1xuaW1wb3J0IHsgZGVlcG1lcmdlIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvZGVlcC1tZXJnZSc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0cmlnZ2VyV2luZG93UmVzaXplIH0gZnJvbSAnLi4vLi4vdXRpbHMvdXNlci1hZ2VudCc7XG5pbXBvcnQgeyBnZXRDb2xGaWVsZCwgZ2V0Q29sdW1uc1NpemVzLCBpc0h0bWxBbGxvd2VkRm9yQ29sLCB0cnlQYXJzZVBpdm90VmFsdWUgfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHsgRGF0b0dyaWRNdWx0aVNlbGVjdENvbHVtbkhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4uL2dyaWQtY29sdW1uLWhlYWRlci9ncmlkLW11bHRpLXNlbGVjdC1oZWFkZXIvZ3JpZC1tdWx0aS1zZWxlY3QtaGVhZGVyLmNvbXBvbmVudCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBHcmlkU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIGFwaTogRGF0b0dyaWRBcGk7XG4gIHRyZWVDb25maWc6IERhdG9HcmlkVHJlZUNvbmZpZyA9IGRlZmF1bHRHcmlkVHJlZUxhYmVsO1xuICBpc1Bpdm90TW9kZTogYm9vbGVhbjtcblxuICAvKiogQGludGVybmFsIC0gdXNlZCBmb3Igc2VydmVyIHNpZGUgYnkgdmFsdWUgZmlsdGVyICovXG4gIF9vcmlnaW5hbEdldFJvd3M6IChwYXJhbXM6IERhdG9HcmlkR2V0Um93c1BhcmFtcykgPT4gdm9pZDtcbiAgcHJpdmF0ZSBpbml0aWFsU2V0dGluZ3M6IERhdG9HcmlkU2V0dGluZ3M7XG4gIHByaXZhdGUgZ3JpZE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBncmlkUmVmOiBBZ0dyaWRBbmd1bGFyO1xuICBwcml2YXRlIGN1c3RvbUhlYWRlcnNUZW1wbGF0ZXM6IFF1ZXJ5TGlzdDxEYXRvQ3VzdG9tSGVhZGVyVGVtcGxhdGVDb21wb25lbnQ+O1xuICBwcml2YXRlIGlzVHJlZURhdGE6IGJvb2xlYW47XG4gIHByaXZhdGUgcGFnZU51bWJlclRvUmV0dXJuQWZ0ZXJSZWZyZXNoID0gLTE7XG4gIHByaXZhdGUgbGFzdFRvdGFsUm93czogbnVtYmVyO1xuICBwcml2YXRlIHJlbG9hZEdyaWRBY3Rpb25zU3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBDSEVDS0JPWF9TRUxFQ1RJT05fQ09MX0lEID0gJ2dyaWQtY2hlY2tib3gtc2VsZWN0aW9uJztcblxuICBzZXQgdHJlZURhdGEoaXNUcmVlRGF0YTogYm9vbGVhbikge1xuICAgIHRoaXMuaXNUcmVlRGF0YSA9IGlzVHJlZURhdGE7XG4gIH1cblxuICBnZXQgdHJlZURhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmVlRGF0YTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc3RvcmU6IEdyaWRTdG9yZSxcbiAgICBwcml2YXRlIGdyaWRRdWVyeTogR3JpZFF1ZXJ5LFxuICAgIHByaXZhdGUgdHJhbnNsYXRlOiBEYXRvVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGljb25SZWdpc3RyeTogSWNvblJlZ2lzdHJ5LFxuICAgIHByaXZhdGUgc3ZnUmVnaXN0cnk6IFN2Z1JlZ2lzdHJ5LFxuICAgIEBJbmplY3QoREFUT19HUklEX1NUT1JBR0VfQVBJKSBwcml2YXRlIHN0b3JhZ2VBUEk6IEdyaWRTdG9yYWdlQVBJLFxuICAgIEBJbmplY3QoREFUT19DT1JFX0xPR0dFUikgcHJpdmF0ZSBsb2dnZXI6IENvcmVFdmVudExvZ2dlclxuICApIHt9XG5cbiAgbmdPbkRlc3Ryb3koKSB7fVxuXG4gIC8qKiBAaW50ZXJuYWwgLSB1c2VkIHRvIGluaXQgdGhlIHNlcnZpY2UgKi9cbiAgX3NldEFwaShhcGk6IERhdG9HcmlkQXBpLCBncmlkUmVmOiBBZ0dyaWRBbmd1bGFyKSB7XG4gICAgdGhpcy5hcGkgPSBhcGk7XG4gICAgdGhpcy5ncmlkUmVmID0gZ3JpZFJlZjtcbiAgICB0aGlzLmdyaWROYW1lID0gKGdyaWRSZWYuZ3JpZE9wdGlvbnMgYXMgRGF0b0dyaWRPcHRpb25zKS5ncmlkTmFtZTtcbiAgICB0aGlzLnNldFNlcnZlclNpZGVQYWdpbmF0aW9uKHtcbiAgICAgIGVuYWJsZWQ6IHRoaXMuaXNTZXJ2ZXJTaWRlUGFnaW5hdGlvbihncmlkUmVmLmdyaWRPcHRpb25zKVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1NlcnZlclNpZGVQYWdpbmF0aW9uKGdyaWRPcHRpb25zOiBHcmlkT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBncmlkT3B0aW9ucy5yb3dNb2RlbFR5cGUgPT09ICdpbmZpbml0ZSc7XG4gIH1cblxuICB1cGRhdGVHcmlkQ29udGV4dChjb250ZXh0ID0ge30sIHJlcGxhY2UgPSBmYWxzZSkge1xuICAgIHRoaXMuZ3JpZFF1ZXJ5LmdldEdyaWRPcHRpb25zKCkuY29udGV4dCA9IHJlcGxhY2VcbiAgICAgID8gY29udGV4dFxuICAgICAgOiBkZWVwbWVyZ2UodGhpcy5ncmlkUmVmLmdyaWRPcHRpb25zLmNvbnRleHQgfHwge30sIGNvbnRleHQpO1xuICB9XG5cbiAgcmVsb2FkR3JpZEFjdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWxvYWRHcmlkQWN0aW9uc1N1YmplY3QubmV4dCgpO1xuICB9XG5cbiAgb25SZWxvYWRHcmlkQWN0aW9ucygpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnJlbG9hZEdyaWRBY3Rpb25zU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2Ugc2VsZWN0Um93cyBpbnN0ZWFkXG4gICAqIEBwYXJhbSByb3dcbiAgICovXG4gIHNldFNlbGVjdGVkUm93czxUPihyb3c6IChUICYgUm93Tm9kZSkgfCAoVFtdICYgUm93Tm9kZVtdKSkge1xuICAgIHRoaXMuc2VsZWN0Um93cyhyb3cpO1xuICB9XG5cbiAgc2VsZWN0Um93czxUPihyb3c6IChUICYgUm93Tm9kZSkgfCAoVFtdICYgUm93Tm9kZVtdKSkge1xuICAgIGNvbnN0IHJvd05vZGVzID0gY29lcmNlQXJyYXkocm93KS5maWx0ZXIocm93Tm9kZSA9PiAhcm93Tm9kZS5pc1NlbGVjdGVkKCkpO1xuICAgIGNvbnN0IGxhc3ROb2RlID0gcm93Tm9kZXMucG9wKCk7XG4gICAgcm93Tm9kZXMuZm9yRWFjaChyb3dOb2RlID0+IHJvd05vZGUuc2V0U2VsZWN0ZWQodHJ1ZSwgZmFsc2UsIHRydWUpKTtcbiAgICBpZiAobGFzdE5vZGUpIHtcbiAgICAgIGxhc3ROb2RlLnNldFNlbGVjdGVkKHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGRlc2VsZWN0Um93czxUPihyb3c6IChUICYgUm93Tm9kZSkgfCAoVFtdICYgUm93Tm9kZVtdKSkge1xuICAgIGNvbnN0IHJvd05vZGVzID0gY29lcmNlQXJyYXkocm93KS5maWx0ZXIocm93Tm9kZSA9PiByb3dOb2RlLmlzU2VsZWN0ZWQoKSk7XG4gICAgY29uc3QgbGFzdE5vZGUgPSByb3dOb2Rlcy5wb3AoKTtcbiAgICByb3dOb2Rlcy5mb3JFYWNoKHJvd05vZGUgPT4gcm93Tm9kZS5zZXRTZWxlY3RlZChmYWxzZSwgZmFsc2UsIHRydWUpKTtcbiAgICBpZiAobGFzdE5vZGUpIHtcbiAgICAgIGxhc3ROb2RlLnNldFNlbGVjdGVkKGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBzZXRSb3dzPFQ+KGRhdGE6IFRbXSwgZml0Q29udGFpbmVyID0gZmFsc2UsIHRyZWVDb25maWc6IFBhcnRpYWw8RGF0b0dyaWRUcmVlQ29uZmlnPiA9IHt9KSB7XG4gICAgdGhpcy5ncmlkUXVlcnkuZ3JpZFJlYWR5JC5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc1RyZWVEYXRhKSB7XG4gICAgICAgIHRoaXMudHJlZUNvbmZpZyA9IHtcbiAgICAgICAgICAuLi5kZWZhdWx0R3JpZFRyZWVMYWJlbCxcbiAgICAgICAgICAuLi50cmVlQ29uZmlnXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHRyZWVEYXRlID0gY29udmVydFRvVHJlZURhdGEoZGF0YSwgdGhpcy50cmVlQ29uZmlnKTtcbiAgICAgICAgdGhpcy5hcGkuZ3JpZC5zZXRSb3dEYXRhKHRyZWVEYXRlKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Bpdm90TW9kZSkge1xuICAgICAgICB0aGlzLnNldFBpdm90TW9kZVJvd3M8VD4oZGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFwaS5ncmlkLnNldFJvd0RhdGEoZGF0YSk7XG4gICAgICB9XG4gICAgICBpZiAoZml0Q29udGFpbmVyKSB7XG4gICAgICAgIHRoaXMuZml0R3JpZCgnY29udGFpbmVyJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmlnZ2VyV2luZG93UmVzaXplKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzZXREYXRhc291cmNlKGdldFJvd3M6IChwYXJhbXM6IERhdG9HcmlkR2V0Um93c1BhcmFtcykgPT4gdm9pZCwgcmV0dXJuVG9DdXJyZW50UGFnZSA9IGZhbHNlLCBzaG93TG9hZGluZyA9IGZhbHNlKSB7XG4gICAgcmV0dXJuVG9DdXJyZW50UGFnZSAmJiB0aGlzLnVwZGF0ZVBhZ2VUb0tlZXBPblJlZnJlc2hTZXJ2ZXJEYXRhKCk7XG4gICAgc2hvd0xvYWRpbmcgJiYgdGhpcy5zZXRMb2FkaW5nKHRydWUpO1xuICAgIHRoaXMuX29yaWdpbmFsR2V0Um93cyA9IGdldFJvd3M7XG4gICAgdGhpcy5hcGkuZ3JpZC5zZXREYXRhc291cmNlKHsgZ2V0Um93czogdGhpcy53cmFwR2V0Um93cyh0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpLCBnZXRSb3dzKSB9KTtcbiAgfVxuXG4gIHJlZnJlc2hTZXJ2ZXJEYXRhKGtlZXBDdXJyZW50UGFnZSA9IGZhbHNlLCBzaG93TG9hZGluZyA9IGZhbHNlKSB7XG4gICAga2VlcEN1cnJlbnRQYWdlICYmIHRoaXMudXBkYXRlUGFnZVRvS2VlcE9uUmVmcmVzaFNlcnZlckRhdGEoKTtcbiAgICBzaG93TG9hZGluZyAmJiB0aGlzLnNldExvYWRpbmcodHJ1ZSk7XG4gICAgdGhpcy5hcGkuZ3JpZC5zZXREYXRhc291cmNlKHsgZ2V0Um93czogdGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKS5kYXRhc291cmNlLmdldFJvd3MgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBhZ2VUb0tlZXBPblJlZnJlc2hTZXJ2ZXJEYXRhKCkge1xuICAgIC8vIEtlZXBpbmcgdGhlIGN1cnJlbnQgcGFnZSBvbiBzZXJ2ZXIgcmVmcmVzaCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIG9ubHkgd2hlbiBubyBwYWdlIGNsaWVudCBjYWNoaW5nIGlzIGVuYWJsZWRcbiAgICBpZiAodGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKS5tYXhCbG9ja3NJbkNhY2hlID09PSAxKSB7XG4gICAgICB0aGlzLnBhZ2VOdW1iZXJUb1JldHVybkFmdGVyUmVmcmVzaCA9IHRoaXMuYXBpLmdyaWQucGFnaW5hdGlvbkdldEN1cnJlbnRQYWdlKCk7XG4gICAgfVxuICB9XG5cbiAgYWRkUm93czxUPihyb3c6IFQsIGluZGV4PzogbnVtYmVyKTogUm93Tm9kZVRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCByb3dzID0gY29lcmNlQXJyYXkocm93KTtcbiAgICBjb25zdCBkYXRhOiBSb3dEYXRhVHJhbnNhY3Rpb24gPSB7IGFkZDogcm93cyB9O1xuICAgIGlmICghaXNOaWwoaW5kZXgpKSB7XG4gICAgICBkYXRhLmFkZEluZGV4ID0gaW5kZXg7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFwaS5ncmlkLnVwZGF0ZVJvd0RhdGEoZGF0YSk7XG4gIH1cblxuICB1cGRhdGVSb3dzPFQ+KHJvdzogVFtdKTogYW55IHtcbiAgICBjb25zdCByb3dzID0gY29lcmNlQXJyYXkocm93KTtcbiAgICByZXR1cm4gdGhpcy5hcGkuZ3JpZC51cGRhdGVSb3dEYXRhKHsgdXBkYXRlOiByb3dzIH0pO1xuICB9XG5cbiAgdXBkYXRlUm93VmFsdWU8VD4ocm93OiBSb3dOb2RlLCBrZXk6IHN0cmluZywgbmV3VmFsdWU6IFQpO1xuICB1cGRhdGVSb3dWYWx1ZTxUPihpZDogc3RyaW5nLCBrZXk6IHN0cmluZywgbmV3VmFsdWU6IFQpO1xuICB1cGRhdGVSb3dWYWx1ZTxUPihyb3c6IHN0cmluZyB8IFJvd05vZGUsIGtleTogc3RyaW5nLCBuZXdWYWx1ZTogVCkge1xuICAgIGNvbnN0IHJvd05vZGUgPSBpc1N0cmluZyhyb3cpID8gdGhpcy5hcGkuZ3JpZC5nZXRSb3dOb2RlKHJvdykgOiByb3c7XG4gICAgcm93Tm9kZS5zZXREYXRhVmFsdWUoa2V5LCBuZXdWYWx1ZSk7XG4gIH1cblxuICByZW1vdmVSb3dzKHJvdzogUm93Tm9kZSB8IFJvd05vZGVbXSk6IFJvd05vZGVUcmFuc2FjdGlvbiB7XG4gICAgY29uc3Qgcm93cyA9IGNvZXJjZUFycmF5KHJvdykubWFwKCh7IGRhdGEgfSkgPT4gZGF0YSk7XG4gICAgcmV0dXJuIHRoaXMuYXBpLmdyaWQudXBkYXRlUm93RGF0YSh7IHJlbW92ZTogcm93cyB9KTtcbiAgfVxuXG4gIHJlbW92ZVNlbGVjdGVkUm93cygpIHtcbiAgICBjb25zdCBzZWxlY3RlZFJvd3MgPSB0aGlzLmdyaWRRdWVyeS5nZXRTZWxlY3RlZFJvd05vZGVzKCk7XG4gICAgcmV0dXJuIHRoaXMucmVtb3ZlUm93cyhzZWxlY3RlZFJvd3MpO1xuICB9XG5cbiAgY2xlYXJUYWJsZSgpIHtcbiAgICB0aGlzLnNldFJvd3MoW10pO1xuICB9XG5cbiAgdXBkYXRlQ29sdW1ucyhjb2xEZWZzOiBEYXRvR3JpZENvbHVtbkRlZiB8IERhdG9HcmlkQ29sdW1uRGVmW10sIHJlbG9hZFNldHRpbmdzID0gZmFsc2UpIHtcbiAgICBpZiAoIWNvbERlZnMpIHtcbiAgICAgIHRocm93IG5ldyBEYXRvQ29yZUVycm9yKCdObyBjb2x1bW5EZWZzIHdlcmUgcHJvdmlkZWQuIPCflbXwn4+74oCN4pmA77iPJyk7XG4gICAgfVxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLm5vcm1hbGl6ZUNvbHVtbnMoY29lcmNlQXJyYXkoY29sRGVmcykpO1xuICAgIGNvbnN0IHNhdmVkU2V0dGluZ3MgPSByZWxvYWRTZXR0aW5ncyAmJiB0aGlzLmdyaWRRdWVyeS5nZXRDdXJyZW50R3JpZFNldHRpbmdzKCk7XG4gICAgdGhpcy5hcGkuZ3JpZC5zZXRDb2x1bW5EZWZzKG5vcm1hbGl6ZWQpO1xuICAgIGlmIChzYXZlZFNldHRpbmdzKSB7XG4gICAgICB0aGlzLmxvYWRTYXZlZFNldHRpbmdzKHNhdmVkU2V0dGluZ3MpO1xuICAgIH1cbiAgfVxuXG4gIGluaXRHcmlkT3B0aW9ucyhncmlkT3B0aW9uczogRGF0b0dyaWRPcHRpb25zKSB7XG4gICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICAuLi5ncmlkT3B0aW9uc1xuICAgIH07XG5cbiAgICBpZiAodHlwZW9mIGdyaWRPcHRpb25zLmVuYWJsZVNlYXJjaCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIG9wdGlvbnMuZW5hYmxlU2VhcmNoID0gb3B0aW9ucy5lbmFibGVWMl8xO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGdyaWRPcHRpb25zLmVuYWJsZUJhY2tncm91bmQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBvcHRpb25zLmVuYWJsZUJhY2tncm91bmQgPSBvcHRpb25zLmVuYWJsZVYyXzE7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZ3JpZE9wdGlvbnMuc2hvd011bHRpU2VsZWN0aW9uQ2hlY2tib3hlcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIG9wdGlvbnMuc2hvd011bHRpU2VsZWN0aW9uQ2hlY2tib3hlcyA9XG4gICAgICAgIGdyaWRPcHRpb25zLmVuYWJsZVYyXzEgJiYgb3B0aW9ucy5yb3dTZWxlY3Rpb24gIT09IEdyaWRSb3dTZWxlY3Rpb25UeXBlLlNJTkdMRTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBncmlkT3B0aW9ucy5lbmFibGVTZWFyY2hIaWdobGlnaHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBvcHRpb25zLmVuYWJsZVNlYXJjaEhpZ2hsaWdodCA9IG9wdGlvbnMuZW5hYmxlU2VhcmNoICYmIGRlZmF1bHRHcmlkT3B0aW9ucy5lbmFibGVTZWFyY2hIaWdobGlnaHQ7XG4gICAgfVxuXG4gICAgaWYgKGdyaWRPcHRpb25zLnVzZVBpdm90R3JpZFN0eWxlKSB7XG4gICAgICBjb25zdCByb3dIZWlnaHQgPSAzMDtcblxuICAgICAgb3B0aW9ucy5yb3dIZWlnaHQgPSByb3dIZWlnaHQ7XG4gICAgICBvcHRpb25zLmRlZmF1bHRDb2xEZWYgPSB7XG4gICAgICAgIC4uLm9wdGlvbnMuZGVmYXVsdENvbERlZixcbiAgICAgICAgY2VsbENsYXNzUnVsZXM6IHRoaXMuZ2V0UGl2b3RNb2RlQ2VsbENsYXNzUnVsZXMoKSxcbiAgICAgICAgaGVhZGVyQ2xhc3M6IHRoaXMuZ2V0UGl2b3RIZWFkZXJDbGFzcy5iaW5kKHRoaXMpLFxuICAgICAgICBjZWxsU3R5bGU6IHBhcmFtcyA9PiB7XG4gICAgICAgICAgY29uc3Qgc3R5bGU6IGFueSA9IHsgbGluZUhlaWdodDogYCR7cm93SGVpZ2h0fXB4YCB9O1xuXG4gICAgICAgICAgaWYgKHBhcmFtcy5jb2xEZWYudHlwZSA9PT0gRGF0b0dyaWRDb2x1bW5UeXBlcy5OdW1iZXIpIHtcbiAgICAgICAgICAgIHN0eWxlLnRleHRBbGlnbiA9ICdlbmQnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgb3B0aW9ucy5hdXRvR3JvdXBDb2x1bW5EZWYgPSB7XG4gICAgICAgIC4uLm9wdGlvbnMuYXV0b0dyb3VwQ29sdW1uRGVmLFxuICAgICAgICBjZWxsQ2xhc3NSdWxlczogdGhpcy5nZXRQaXZvdE1vZGVDZWxsQ2xhc3NSdWxlcygpLFxuICAgICAgICBoZWFkZXJDbGFzczogdGhpcy5nZXRQaXZvdEhlYWRlckNsYXNzLmJpbmQodGhpcylcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH1cblxuICBub3JtYWxpemVPcHRpb25zKHBhcmFtczogTm9ybWFsaXplT3B0aW9uc1BhcmFtcykge1xuICAgIHRoaXMuY3VzdG9tSGVhZGVyc1RlbXBsYXRlcyA9IHBhcmFtcy5jdXN0b21IZWFkZXJzVGVtcGxhdGVzO1xuICAgIGNvbnN0IGhlYWRlckNvbXBvbmVudFBhcmFtcyA9IHsgZ3JpZFNlcnZpY2U6IHRoaXMsIGdyaWRRdWVyeTogdGhpcy5ncmlkUXVlcnkgfTtcbiAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuYXV0b0dyb3VwQ29sdW1uRGVmID0ge1xuICAgICAgLi4uaGVhZGVyQ29tcG9uZW50UGFyYW1zLFxuICAgICAgLi4ucGFyYW1zLmdyaWRPcHRpb25zLmF1dG9Hcm91cENvbHVtbkRlZlxuICAgIH07XG5cbiAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuZGVmYXVsdENvbERlZiA9IHtcbiAgICAgIC4uLnBhcmFtcy5ncmlkT3B0aW9ucy5kZWZhdWx0Q29sRGVmLFxuICAgICAgaGVhZGVyQ29tcG9uZW50UGFyYW1zXG4gICAgfTtcblxuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5jb2x1bW5EZWZzID0gdGhpcy5ub3JtYWxpemVDb2x1bW5zKHBhcmFtcy5ncmlkT3B0aW9ucy5jb2x1bW5EZWZzLCBwYXJhbXMuZ3JpZE9wdGlvbnMpO1xuXG4gICAgLyoqIEFkZCBjb3JlIGZpbHRlcnMgKi9cbiAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuaXNFeHRlcm5hbEZpbHRlclByZXNlbnQgPSAoKSA9PiB0cnVlO1xuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5kb2VzRXh0ZXJuYWxGaWx0ZXJQYXNzID0gKHJvdzogUm93Tm9kZSkgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdmFsaWRhdGVGaWx0ZXIoeyByb3csIGFwaTogdGhpcy5ncmlkUXVlcnkuYXBpLmdyaWQgfSwgdGhpcy5ncmlkUXVlcnkuZ2V0RmlsdGVyKCkpICYmIHRoaXMucm93TWF0Y2hlc1NlYXJjaChyb3cpXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvKiogV3JhcCB0aGUgc2VydmVyIHNpZGUgcGFnaW5hdGlvbiBnZXQgcm93cyBmdW5jdGlvbiAqL1xuICAgIGlmICh0aGlzLmlzU2VydmVyU2lkZVBhZ2luYXRpb24ocGFyYW1zLmdyaWRPcHRpb25zKSkge1xuICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLmJsb2NrTG9hZERlYm91bmNlTWlsbGlzID0gMzAwO1xuICAgICAgdGhpcy5fb3JpZ2luYWxHZXRSb3dzID0gcGFyYW1zLmdyaWRPcHRpb25zLmRhdGFzb3VyY2UuZ2V0Um93cztcbiAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5kYXRhc291cmNlLmdldFJvd3MgPSB0aGlzLndyYXBHZXRSb3dzKHBhcmFtcy5ncmlkT3B0aW9ucyk7XG4gICAgICAvKiBUaGUgY2FjaGUgc2l6ZSBpcyBzeW5jZWQgd2l0aCB0aGUgcGFnaW5hdGlvbiBwYWdlIHNpemUgKi9cbiAgICAgIGNvbnN0IGNhY2hlU2l6ZSA9IHBhcmFtcy5ncmlkT3B0aW9ucy5wYWdpbmF0aW9uUGFnZVNpemU7XG4gICAgICBpZiAoY2FjaGVTaXplKSB7XG4gICAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5jYWNoZUJsb2NrU2l6ZSA9IGNhY2hlU2l6ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogRWRpdGFibGUgY2VsbCAqL1xuICAgIHRoaXMuaW5pdEVkaXRhYmxlQ29sdW1uc0NlbGxDbGFzcyhwYXJhbXMpO1xuXG4gICAgLyoqIFdyYXAgY29udGV4dCBtZW51ICovXG4gICAgcGFyYW1zLmdyaWRPcHRpb25zLmdldENvbnRleHRNZW51SXRlbXMgPSB0aGlzLndyYXBDb250ZXh0TWVudUJ1aWxkZXIocGFyYW1zKTtcblxuICAgIC8qKiBTYXZlIGdyaWQgc2V0dGluZ3MgKi9cbiAgICBjb25zdCB7IHNhdmVTZXR0aW5ncywgZ3JpZE5hbWUgfSA9IHBhcmFtcy5ncmlkT3B0aW9ucztcbiAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuc2F2ZVNldHRpbmdzID0gc2F2ZVNldHRpbmdzICE9PSBmYWxzZSAmJiAhaXNOaWwoZ3JpZE5hbWUpO1xuXG4gICAgLyoqIFNlcnZlciBTaWRlIFBhZ2luYXRpb24gZm9yIHNlbGVjdCBhbGwgb3B0aW9uICovXG4gICAgdGhpcy5pbml0T25Sb3dTZWxlY3RlZEZvclNlcnZlclNpZGVQYWdpbmF0aW9uKHBhcmFtcyk7XG5cbiAgICAvKiogQWRkIHRyZWUgZ3JpZCBzcGVjaWZpYyByZXF1aXJlZCBzZXR0aW5ncyAqL1xuICAgIGlmICh0aGlzLmlzVHJlZURhdGEpIHtcbiAgICAgIGNvbnN0IGlucHV0Um93Q2xhc3NSdWxlcyA9IHBhcmFtcy5ncmlkT3B0aW9ucy5yb3dDbGFzc1J1bGVzO1xuXG4gICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMucm93Q2xhc3NSdWxlcyA9IHtcbiAgICAgICAgLi4uaW5wdXRSb3dDbGFzc1J1bGVzLFxuICAgICAgICAnYWctZW1wdHktZm9sZGVyJzogcGFyYW1zID0+IHtcbiAgICAgICAgICByZXR1cm4gcGFyYW1zLmRhdGEuaXNGb2xkZXIgJiYgc2l6ZShwYXJhbXMubm9kZS5jaGlsZHJlbkFmdGVyR3JvdXApID09PSAwO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKiBBZGQgcGl2b3Qgc3BlY2lmaWMgcmVxdWlyZWQgc2V0dGluZ3MgKi9cbiAgICBpZiAodGhpcy5pc1Bpdm90TW9kZSkge1xuICAgICAgdGhpcy5pbml0UGl2b3RTZWNvbmRhcnlDb2xzUHJvY2VzcyhwYXJhbXMpO1xuICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLnNhdmVTZXR0aW5ncyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXMuZ3JpZE9wdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIGdldFBpdm90SGVhZGVyQ2xhc3MocGFyYW1zKSB7XG4gICAgY29uc3QgZ3JpZFF1ZXJ5ID0gcGFyYW1zLmNvbERlZi5oZWFkZXJDb21wb25lbnRQYXJhbXMuZ3JpZFF1ZXJ5O1xuICAgIGxldCBjZWxsQ2xhc3MgPSAnJztcblxuICAgIGlmIChncmlkUXVlcnkgJiYgZ3JpZFF1ZXJ5LmFwaSkge1xuICAgICAgY29uc3QgeyBjb2x1bW5zIH0gPSBncmlkUXVlcnkuYXBpIGFzIERhdG9HcmlkQXBpO1xuICAgICAgLyoqIFVzZSBnZXRQaXZvdFJlc3VsdENvbHVtbnMgZnJvbSB2ZXIgMjggKi9cbiAgICAgIGNvbnN0IHBpdm90Q29sdW1ucyA9IGNvbHVtbnMuZ2V0U2Vjb25kYXJ5Q29sdW1ucygpO1xuXG4gICAgICBpZiAocGl2b3RDb2x1bW5zICYmIHBpdm90Q29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNlbGxDbGFzcyArPSAndG9wLWJvcmRlcic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNlbGxDbGFzcztcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplQ29sdW1ucyhjb2xEZWZzOiBEYXRvR3JpZENvbHVtbkRlZltdLCBncmlkT3B0aW9uczogRGF0b0dyaWRPcHRpb25zID0gbnVsbCk6IERhdG9HcmlkQ29sdW1uRGVmW10ge1xuICAgIGlmICghZ3JpZE9wdGlvbnMpIHtcbiAgICAgIGdyaWRPcHRpb25zID0gdGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKTtcbiAgICB9XG4gICAgY29uc3QgdXBkYXRlZENvbERlZnMgPSBjb2xEZWZzLm1hcCgoY29sOiBEYXRvR3JpZENvbHVtbkRlZikgPT4ge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHtcbiAgICAgICAgLi4uY29sLFxuICAgICAgICBoZWFkZXJOYW1lOiB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oY29sLmhlYWRlck5hbWUpXG4gICAgICB9O1xuICAgICAgLyoqIEFkanVzdCB0aGUgd2lkdGggaW4gY2FzZSB0aGUgY29sdW1uIGhhcyBpbmZvICovXG4gICAgICBpZiAoY29sLmluZm8pIHtcbiAgICAgICAgbm9ybWFsaXplZC5taW5XaWR0aCA9IGNvbC5taW5XaWR0aCB8fCBHcmlkTWluV2lkdGhzLldpdGhfSW5mbztcbiAgICAgIH1cbiAgICAgIGlmICghY29sLmNvbElkKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQuY29sSWQgPSBjb2wuZmllbGQ7XG4gICAgICB9XG4gICAgICBpZiAobm9ybWFsaXplZC50eXBlID09PSBEYXRvR3JpZENvbHVtblR5cGVzLkl0ZW1zICYmICFub3JtYWxpemVkLmZpbHRlcnNDb25maWcpIHtcbiAgICAgICAgbm9ybWFsaXplZC5maWx0ZXJzQ29uZmlnID0geyBzZWN0aW9uczogRGF0b0dyaWRGaWx0ZXJTZWN0aW9ucy5Db25kaXRpb25hbCB9O1xuICAgICAgfVxuICAgICAgdGhpcy5ub3JtYWxpemVDb2x1bW5TZWFyY2hDb25maWcoZ3JpZE9wdGlvbnMsIGNvbCwgbm9ybWFsaXplZCk7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFkZE11bHRpU2VsZWN0SGVhZGVyQ29sdW1uSWZSZXF1aXJlZCh1cGRhdGVkQ29sRGVmcywgZ3JpZE9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVDb2x1bW5TZWFyY2hDb25maWcoXG4gICAgZ3JpZE9wdGlvbnM6IERhdG9HcmlkT3B0aW9ucyxcbiAgICBjb2w6IERhdG9HcmlkQ29sdW1uRGVmLFxuICAgIG5vcm1hbGl6ZWQ6IERhdG9HcmlkQ29sdW1uRGVmXG4gICkge1xuICAgIC8qKiBDaGVjayBpZiBjb2x1bW4gc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gc2VhcmNoICoqL1xuICAgIGNvbnN0IGlzU2VydmVyUGFnaW5hdGlvbiA9IHRoaXMuaXNTZXJ2ZXJTaWRlUGFnaW5hdGlvbihncmlkT3B0aW9ucyk7XG4gICAgaWYgKHR5cGVvZiBjb2wuaW5jbHVkZUluU2VhcmNoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKGlzU2VydmVyUGFnaW5hdGlvbiAmJiBjb2wudHlwZSA9PT0gRGF0b0dyaWRDb2x1bW5UeXBlcy5EYXRlKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQuaW5jbHVkZUluU2VhcmNoID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub3JtYWxpemVkLmluY2x1ZGVJblNlYXJjaCA9XG4gICAgICAgICAgdHlwZW9mIGdyaWRPcHRpb25zLmNvbHVtbnNJbmNsdWRlZEluU2VhcmNoQnlEZWZhdWx0ICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgPyBncmlkT3B0aW9ucy5jb2x1bW5zSW5jbHVkZWRJblNlYXJjaEJ5RGVmYXVsdFxuICAgICAgICAgICAgOiBkZWZhdWx0R3JpZE9wdGlvbnMuY29sdW1uc0luY2x1ZGVkSW5TZWFyY2hCeURlZmF1bHQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgIG5vcm1hbGl6ZWQuaW5jbHVkZUluU2VhcmNoICYmXG4gICAgICAhdGhpcy5oYXNDZWxsUmVuZGVyZXIobm9ybWFsaXplZCwgZ3JpZE9wdGlvbnMpICYmXG4gICAgICBncmlkT3B0aW9ucy5lbmFibGVTZWFyY2hIaWdobGlnaHRcbiAgICApIHtcbiAgICAgIG5vcm1hbGl6ZWQuY2VsbFJlbmRlcmVyID0gKHBhcmFtczogSUNlbGxSZW5kZXJlclBhcmFtcykgPT4ge1xuICAgICAgICBjb25zdCBhbGxvd0hUTUwgPSBpc0h0bWxBbGxvd2VkRm9yQ29sKGdyaWRPcHRpb25zLCBwYXJhbXMuY29sRGVmKTtcbiAgICAgICAgY29uc3QgaXNFZGl0YWJsZSA9XG4gICAgICAgICAgKGlzRnVuY3Rpb24obm9ybWFsaXplZC5lZGl0YWJsZSkgJiYgbm9ybWFsaXplZC5lZGl0YWJsZShwYXJhbXMpKSB8fFxuICAgICAgICAgICghaXNGdW5jdGlvbihub3JtYWxpemVkLmVkaXRhYmxlKSAmJiBub3JtYWxpemVkLmVkaXRhYmxlKTtcblxuICAgICAgICByZXR1cm4gaXNFZGl0YWJsZVxuICAgICAgICAgID8gZWRpdGFibGVDZWxsUmVuZGVyZXJXaXRoU2VhcmNoSGlnaGxpZ2h0KHBhcmFtcywgdGhpcy5ncmlkUXVlcnkuZ2V0U2VhcmNoVGVybSgpLCBhbGxvd0hUTUwpXG4gICAgICAgICAgOiBzZWFyY2hIaWdobGlnaHRDZWxsUmVuZGVyZXIocGFyYW1zLCB0aGlzLmdyaWRRdWVyeS5nZXRTZWFyY2hUZXJtKCksIGFsbG93SFRNTCk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFzQ2VsbFJlbmRlcmVyKGNvbHVtbjogRGF0b0dyaWRDb2x1bW5EZWYsIGdyaWRPcHRpb25zOiBEYXRvR3JpZE9wdGlvbnMpOiBib29sZWFuIHtcbiAgICBpZiAoY29sdW1uLmNlbGxSZW5kZXJlcikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHR5cGUgPSBjb2x1bW4udHlwZSBhcyBzdHJpbmc7XG4gICAgY29uc3QgY29sdW1uVHlwZUhhc0NlbGxSZW5kZXJlciA9IChvcHRpb25zOiBQYXJ0aWFsPERhdG9HcmlkT3B0aW9ucz4pOiBib29sZWFuID0+XG4gICAgICBvcHRpb25zLmNvbHVtblR5cGVzICYmICEhb3B0aW9ucy5jb2x1bW5UeXBlc1t0eXBlXSAmJiAhIW9wdGlvbnMuY29sdW1uVHlwZXNbdHlwZV0uY2VsbFJlbmRlcmVyO1xuXG4gICAgcmV0dXJuIGNvbHVtblR5cGVIYXNDZWxsUmVuZGVyZXIoZ3JpZE9wdGlvbnMpIHx8IGNvbHVtblR5cGVIYXNDZWxsUmVuZGVyZXIoZGVmYXVsdEdyaWRPcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkTXVsdGlTZWxlY3RIZWFkZXJDb2x1bW5JZlJlcXVpcmVkKFxuICAgIGNvbHVtbkRlZnM6IERhdG9HcmlkQ29sdW1uRGVmW10sXG4gICAgZ3JpZE9wdGlvbnM6IERhdG9HcmlkT3B0aW9uc1xuICApOiBEYXRvR3JpZENvbHVtbkRlZltdIHtcbiAgICBjb25zdCBzaG93TXVsdGlTZWxlY3Rpb25DaGVja2JveGVzID0gZ3JpZE9wdGlvbnMgJiYgZ3JpZE9wdGlvbnMuc2hvd011bHRpU2VsZWN0aW9uQ2hlY2tib3hlcztcbiAgICBjb25zdCByb3dTZWxlY3Rpb24gPVxuICAgICAgZ3JpZE9wdGlvbnMgJiYgZ3JpZE9wdGlvbnMucm93U2VsZWN0aW9uID8gZ3JpZE9wdGlvbnMucm93U2VsZWN0aW9uIDogZGVmYXVsdEdyaWRPcHRpb25zLnJvd1NlbGVjdGlvbjtcblxuICAgIGlmIChzaG93TXVsdGlTZWxlY3Rpb25DaGVja2JveGVzICYmIHJvd1NlbGVjdGlvbiA9PT0gR3JpZFJvd1NlbGVjdGlvblR5cGUuTVVMVElQTEUpIHtcbiAgICAgIGNvbnN0IGNoZWNrYm94ZXNDb2x1bW46IERhdG9HcmlkQ29sdW1uRGVmID0ge1xuICAgICAgICBjb2xJZDogdGhpcy5DSEVDS0JPWF9TRUxFQ1RJT05fQ09MX0lELFxuICAgICAgICBjaGVja2JveFNlbGVjdGlvbjogdHJ1ZSxcbiAgICAgICAgaGVhZGVyQ29tcG9uZW50RnJhbWV3b3JrOiBEYXRvR3JpZE11bHRpU2VsZWN0Q29sdW1uSGVhZGVyQ29tcG9uZW50LFxuICAgICAgICBtaW5XaWR0aDogMjksXG4gICAgICAgIHdpZHRoOiAyOSxcbiAgICAgICAgbWF4V2lkdGg6IDI5LFxuICAgICAgICBzdXBwcmVzc1NpemVUb0ZpdDogdHJ1ZSxcbiAgICAgICAgY2VsbENsYXNzOiAnY2hlY2tib3gtc2VsZWN0aW9uLWNlbGwnLFxuICAgICAgICBoZWFkZXJDbGFzczogJ2hlYWRlci1jaGVja2JveC1zZWxlY3Rpb24tY2VsbCcsXG4gICAgICAgIHJlc2l6YWJsZTogZmFsc2UsXG4gICAgICAgIHBpbm5lZDogJ2xlZnQnLFxuICAgICAgICBsb2NrUG9zaXRpb246IHRydWUsXG4gICAgICAgIGluY2x1ZGVJblNlYXJjaDogZmFsc2VcbiAgICAgIH07XG4gICAgICByZXR1cm4gW2NoZWNrYm94ZXNDb2x1bW4sIC4uLmNvbHVtbkRlZnNdO1xuICAgIH1cbiAgICByZXR1cm4gY29sdW1uRGVmcztcbiAgfVxuXG4gIHByaXZhdGUgaW5pdE9uUm93U2VsZWN0ZWRGb3JTZXJ2ZXJTaWRlUGFnaW5hdGlvbih7IGdyaWRPcHRpb25zIH06IE5vcm1hbGl6ZU9wdGlvbnNQYXJhbXMpIHtcbiAgICBpZiAoIXRoaXMuaXNTZXJ2ZXJTaWRlUGFnaW5hdGlvbihncmlkT3B0aW9ucykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXh0ZXJuYWxPblJvd1NlbGVjdGVkID0gZ3JpZE9wdGlvbnMub25Sb3dTZWxlY3RlZDtcbiAgICBncmlkT3B0aW9ucy5vblJvd1NlbGVjdGVkID0gKGV2dDogUm93U2VsZWN0ZWRFdmVudCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZ3JpZFF1ZXJ5LmlzU2VydmVyU2VsZWN0QWxsUm93c0VuYWJsZWQpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGV2dC5ub2RlO1xuICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gbm9kZS5pc1NlbGVjdGVkKCk7XG4gICAgICAgIGNvbnN0IHsgZXhjbHVkZWRGcm9tU2VsZWN0QWxsIH0gPSB0aGlzLmdyaWRRdWVyeS5zZXJ2ZXJTaWRlQ29uZmlnO1xuICAgICAgICBjb25zdCBpc0V4Y2x1ZGVkID0gZXhjbHVkZWRGcm9tU2VsZWN0QWxsLmluY2x1ZGVzKG5vZGUuaWQpO1xuICAgICAgICBpZiAoaXNTZWxlY3RlZCAmJiBpc0V4Y2x1ZGVkKSB7XG4gICAgICAgICAgdGhpcy5zZXRTZXJ2ZXJTaWRlUGFnaW5hdGlvbih7XG4gICAgICAgICAgICBleGNsdWRlZEZyb21TZWxlY3RBbGw6IGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbC5maWx0ZXIoKG5vZGVJZDogc3RyaW5nKSA9PiBub2RlSWQgIT09IG5vZGUuaWQpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzU2VsZWN0ZWQgJiYgIWlzRXhjbHVkZWQpIHtcbiAgICAgICAgICB0aGlzLnNldFNlcnZlclNpZGVQYWdpbmF0aW9uKHsgZXhjbHVkZWRGcm9tU2VsZWN0QWxsOiBbLi4uZXhjbHVkZWRGcm9tU2VsZWN0QWxsLCBub2RlLmlkXSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGV4dGVybmFsT25Sb3dTZWxlY3RlZCkge1xuICAgICAgICBleHRlcm5hbE9uUm93U2VsZWN0ZWQoZXZ0KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSByb3dNYXRjaGVzU2VhcmNoKHJvdzogUm93Tm9kZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNlYXJjaFRlcm0gPSAodGhpcy5ncmlkUXVlcnkuZ2V0U2VhcmNoVGVybSgpIHx8ICcnKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICBpZiAoaXNFbXB0eShzZWFyY2hUZXJtKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpLmluY2x1ZGVIaWRkZW5Db2x1bW5zSW5TZWFyY2hcbiAgICAgID8gdGhpcy5ncmlkUXVlcnkuZ2V0QWxsQ29sdW1ucygpXG4gICAgICA6IHRoaXMuZ3JpZFF1ZXJ5LmdldEFsbERpc3BsYXllZENvbHVtbnMoKTtcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiBjb2x1bW5zKSB7XG4gICAgICBjb25zdCBjb2xEZWYgPSB0aGlzLmFwaS5ncmlkLmdldENvbHVtbkRlZihjb2wuZ2V0Q29sSWQoKSkgYXMgRGF0b0dyaWRDb2x1bW5EZWY7XG4gICAgICBpZiAoIWNvbERlZi5pbmNsdWRlSW5TZWFyY2gpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCByb3dWYWx1ZSA9ICh0aGlzLmFwaS5ncmlkLmdldFZhbHVlKGNvbC5nZXRDb2xJZCgpLCByb3cpIHx8ICcnKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAocm93VmFsdWUuaW5jbHVkZXMoc2VhcmNoVGVybSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgZml0R3JpZCgnY29udGFpbmVyJykgaW5zdGVhZFxuICAgKi9cbiAgZml0VG9Db250YWluZXIoKSB7XG4gICAgdGhpcy5hcGkuZ3JpZC5zaXplQ29sdW1uc1RvRml0KCk7XG4gIH1cblxuICBnZXRDdXN0b21IZWFkZXIoZmllbGQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmN1c3RvbUhlYWRlcnNUZW1wbGF0ZXMpIHtcbiAgICAgIGNvbnN0IHNwZWNpZmljID0gdGhpcy5jdXN0b21IZWFkZXJzVGVtcGxhdGVzLmZpbmQoKHsgY29sdW1uIH0pID0+IGNvbHVtbiA9PT0gZmllbGQpO1xuICAgICAgY29uc3QgY29tbW9uID0gdGhpcy5jdXN0b21IZWFkZXJzVGVtcGxhdGVzLmZpbmQoKHsgY29sdW1uIH0pID0+ICFjb2x1bW4pO1xuICAgICAgaWYgKHNwZWNpZmljIHx8IGNvbW1vbikge1xuICAgICAgICBjb25zdCB7IG1vcmVNZW51LCBjdXN0b21IZWFkZXIgfSA9IHtcbiAgICAgICAgICBtb3JlTWVudTogKHNwZWNpZmljICYmIHNwZWNpZmljLm1vcmVNZW51KSB8fCAoY29tbW9uICYmIGNvbW1vbi5tb3JlTWVudSksXG4gICAgICAgICAgY3VzdG9tSGVhZGVyOiAoc3BlY2lmaWMgJiYgc3BlY2lmaWMuY3VzdG9tSGVhZGVyKSB8fCAoY29tbW9uICYmIGNvbW1vbi5jdXN0b21IZWFkZXIpXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB7IG1vcmVNZW51OiBtb3JlTWVudSAmJiBtb3JlTWVudS50cGwsIGN1c3RvbUhlYWRlcjogY3VzdG9tSGVhZGVyICYmIGN1c3RvbUhlYWRlci50cGwgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjbGVhckFsbEZpbHRlcnMoKSB7XG4gICAgdGhpcy5zdG9yZS51cGRhdGUoc3RhdGUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5zZXR0aW5ncyxcbiAgICAgICAgICBmaWx0ZXI6IHt9LFxuICAgICAgICAgIHNlYXJjaFRlcm06IG51bGxcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLm5vdGlmeUZpbHRlclVwZGF0ZSgpO1xuICB9XG5cbiAgY2xlYXJDb2x1bW5GaWx0ZXIoY29sdW1uRmllbGQ6IHN0cmluZykge1xuICAgIGNvbnN0IHsgW2NvbHVtbkZpZWxkXTogZGVsZXRlZCwgLi4uZmlsdGVyIH0gPSB0aGlzLmdyaWRRdWVyeS5nZXRGaWx0ZXIoKTtcbiAgICB0aGlzLnN0b3JlLnVwZGF0ZShzdGF0ZSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgIC4uLnN0YXRlLnNldHRpbmdzLFxuICAgICAgICAgIGZpbHRlclxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMubm90aWZ5RmlsdGVyVXBkYXRlKCk7XG4gIH1cblxuICBzZXRDb2x1bW5GaWx0ZXIoY29sdW1uOiBDb2x1bW4sIGZpbHRlcjogRGF0b0dyaWRGaWx0ZXIsIG5vdGlmeUdyaWQgPSB0cnVlKSB7XG4gICAgdGhpcy5fbG9nRXZlbnQoQ29yZUV2ZW50VHlwZXMuR1JJRF9GSUxURVJfQVBQTElFRCwge1xuICAgICAgY29sdW1uOiBjb2x1bW4uZ2V0Q29sSWQoKSxcbiAgICAgIG51bU9mQ29uZGl0aW9uczogKGZpbHRlci5jb25kaXRpb25hbCAmJiBmaWx0ZXIuY29uZGl0aW9uYWwuY29uZGl0aW9ucy5sZW5ndGgpIHx8IDAsXG4gICAgICBieVZhbHVlOiAhIWZpbHRlci5ieVZhbHVlID8gJ1llcycgOiAnTm8nXG4gICAgfSk7XG5cbiAgICB0aGlzLnVwZGF0ZUZpbHRlcihjb2x1bW4sIGZpbHRlcik7XG5cbiAgICBpZiAobm90aWZ5R3JpZCkge1xuICAgICAgdGhpcy5ub3RpZnlGaWx0ZXJVcGRhdGUoKTtcbiAgICB9XG4gIH1cblxuICBzZXRHcmlkRmlsdGVycyhmaWx0ZXJzOiBEYXRvR3JpZEV4dGVybmFsRmlsdGVyW10pIHtcbiAgICBpZiAodGhpcy5hcGkgJiYgZmlsdGVycykge1xuICAgICAgbGV0IGFwcGxpZWRGaWx0ZXIgPSB7fTtcblxuICAgICAgZm9yIChjb25zdCB7IGZpbHRlciwgZmllbGQgfSBvZiBmaWx0ZXJzKSB7XG4gICAgICAgIGFwcGxpZWRGaWx0ZXJbZmllbGRdID0gZmlsdGVyO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnVwZGF0ZVNldHRpbmdzKHsgZmlsdGVyOiBhcHBsaWVkRmlsdGVyIH0pO1xuICAgICAgdGhpcy5ub3RpZnlGaWx0ZXJVcGRhdGUoKTtcbiAgICB9XG4gIH1cblxuICBzZXRTb3J0QnlDb2x1bW4oY29sSWQsIHNvcnQpIHtcbiAgICBjb25zdCBzb3J0VG9TZXQgPSB0aGlzLmdyaWRRdWVyeS5nZXRTb3J0KHsgY29sSWQsIHNvcnQgfSk7XG5cbiAgICB0aGlzLnNldEdyaWRTb3J0KHNvcnRUb1NldCk7XG4gIH1cblxuICBzZXRHcmlkU29ydChncmlkU29ydDogRGF0b0dyaWRTb3J0KSB7XG4gICAgaWYgKGdyaWRTb3J0ICYmIHRoaXMuYXBpICYmIHRoaXMuYXBpLmdyaWQuZ2V0RGlzcGxheWVkUm93Q291bnQoKSA+IDApIHtcbiAgICAgIGNvbnN0IHsgY29sSWQsIHNvcnQsIHNvcnRJbmRleCB9ID0gZ3JpZFNvcnQ7XG4gICAgICBjb25zdCBncmlkQ29sdW1ucyA9IHRoaXMuYXBpLmNvbHVtbnMuZ2V0QWxsR3JpZENvbHVtbnMoKTtcblxuICAgICAgaWYgKGdyaWRDb2x1bW5zKSB7XG4gICAgICAgIGxldCBzb3J0VG9BcHBseSA9IGdyaWRTb3J0O1xuICAgICAgICAvKiogU29ydCBieSBjb2x1bW4gaWQgKi9cbiAgICAgICAgY29uc3QgY29sdW1uQnlJZCA9IGdyaWRDb2x1bW5zLmZpbmQoKGNvbDogQ29sdW1uKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIChjb2wuZ2V0Q29sRGVmKCkuc2hvd1Jvd0dyb3VwIHx8IGNvbC5nZXRDb2xJZCgpKSA9PT0gY29sSWQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChjb2x1bW5CeUlkKSB7XG4gICAgICAgICAgc29ydFRvQXBwbHkgPSB7IGNvbElkOiBjb2x1bW5CeUlkLmdldENvbElkKCksIHNvcnQgfTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNOaWwoc29ydEluZGV4KSkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlQ29sdW1ucyA9IHRoaXMuYXBpLmNvbHVtbnMuZ2V0VmFsdWVDb2x1bW5zKCk7XG4gICAgICAgICAgY29uc3QgdmFsdWVDb2x1bW4gPSB2YWx1ZUNvbHVtbnMuZmluZCgoY29sOiBDb2x1bW4pID0+IGNvbC5nZXRDb2xJZCgpID09PSBjb2xJZCk7XG4gICAgICAgICAgY29uc3QgaXNQaXZvdENvbElkID0gY29sSWQuc3RhcnRzV2l0aCgncGl2b3QnKTtcblxuICAgICAgICAgIGlmIChpc1Bpdm90Q29sSWQgfHwgdmFsdWVDb2x1bW4pIHtcbiAgICAgICAgICAgIC8qKiBDb2x1bW4gaXMgcGl2b3QgdmFsdWUgY29sdW1uLCBzb3J0IGJ5IGluZGV4ICovXG4gICAgICAgICAgICBjb25zdCBjb2x1bW5CeUluZGV4ID0gZ3JpZENvbHVtbnNbc29ydEluZGV4XTtcblxuICAgICAgICAgICAgc29ydFRvQXBwbHkgPSB7IGNvbElkOiBjb2x1bW5CeUluZGV4LmdldENvbElkKCksIHNvcnQsIHNvcnRJbmRleCB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlU2V0dGluZ3MoeyBzb3J0OiBzb3J0VG9BcHBseSB9KTtcbiAgICAgICAgdGhpcy5hcGkuZ3JpZC5zZXRTb3J0TW9kZWwoW3NvcnRUb0FwcGx5XSk7XG5cbiAgICAgICAgaWYgKCh0aGlzLmdyaWRSZWYuZ3JpZE9wdGlvbnMgYXMgRGF0b0dyaWRPcHRpb25zKS51c2VQaXZvdEdyaWRTdHlsZSkge1xuICAgICAgICAgIHRoaXMuYXBpLmdyaWQucmVkcmF3Um93cygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGaWx0ZXIoY29sdW1uOiBDb2x1bW4sIGZpbHRlcjogRGF0b0dyaWRGaWx0ZXIpIHtcbiAgICBjb25zdCBjb2xGaWVsZCA9IGdldENvbEZpZWxkKGNvbHVtbi5nZXRDb2xEZWYoKSk7XG5cbiAgICB0aGlzLnN0b3JlLnVwZGF0ZShzdGF0ZSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgIC4uLnN0YXRlLnNldHRpbmdzLFxuICAgICAgICAgIGZpbHRlcjoge1xuICAgICAgICAgICAgLi4uc3RhdGUuc2V0dGluZ3MuZmlsdGVyLFxuICAgICAgICAgICAgW2NvbEZpZWxkXTogZmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgc2V0U2VhcmNoVGVybShzZWFyY2hUZXJtOiBzdHJpbmcpIHtcbiAgICB0aGlzLnN0b3JlLnVwZGF0ZShzdGF0ZSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgIC4uLnN0YXRlLnNldHRpbmdzLFxuICAgICAgICAgIHNlYXJjaFRlcm1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLm5vdGlmeUZpbHRlclVwZGF0ZSgpO1xuICB9XG5cbiAgc2V0U2VydmVyU2lkZVBhZ2luYXRpb24oY29uZmlnOiBQYXJ0aWFsPFNlcnZlclNpZGVQYWdpbmF0aW9uQ29uZmlnPikge1xuICAgIHRoaXMuc3RvcmUudXBkYXRlKHN0YXRlID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlcnZlclNpZGVQYWdpbmF0aW9uOiB7XG4gICAgICAgICAgLi4uc3RhdGUuc2VydmVyU2lkZVBhZ2luYXRpb24sXG4gICAgICAgICAgLi4uY29uZmlnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBzZXRMb2FkaW5nKHNob3c6IGJvb2xlYW4pIHtcbiAgICBpZiAoc2hvdykge1xuICAgICAgdGhpcy5hcGkuZ3JpZC5zaG93TG9hZGluZ092ZXJsYXkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hcGkuZ3JpZC5nZXREaXNwbGF5ZWRSb3dDb3VudCgpID09PSAwID8gdGhpcy5zZXRPdmVybGF5KHRydWUpIDogdGhpcy5zZXRPdmVybGF5KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdXNlIHNldE92ZXJsYXkgaW5zdGVhZFxuICAgKiBAcGFyYW0gc2hvd1xuICAgKi9cbiAgc2V0Tm9EYXRhKHNob3c6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldE92ZXJsYXkoc2hvdyk7XG4gIH1cblxuICBzZXRPdmVybGF5KHNob3c6IGJvb2xlYW4pIHtcbiAgICBzaG93ID8gdGhpcy5hcGkuZ3JpZC5zaG93Tm9Sb3dzT3ZlcmxheSgpIDogdGhpcy5hcGkuZ3JpZC5oaWRlT3ZlcmxheSgpO1xuICB9XG5cbiAgdXBkYXRlU2V0dGluZ3Moc2V0dGluZ3M6IFBhcnRpYWw8RGF0b0dyaWRTZXR0aW5ncz4pIHtcbiAgICB0aGlzLnN0b3JlLnVwZGF0ZShzdGF0ZSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgIC4uLnN0YXRlLnNldHRpbmdzLFxuICAgICAgICAgIC4uLnNldHRpbmdzXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBmaXRHcmlkKHRvOiAnY29udGFpbmVyJyB8ICdjb250ZW50Jykge1xuICAgIHRvID09PSAnY29udGFpbmVyJyA/IHRoaXMuYXBpLmdyaWQuc2l6ZUNvbHVtbnNUb0ZpdCgpIDogdGhpcy5hcGkuY29sdW1ucy5hdXRvU2l6ZUFsbENvbHVtbnMoKTtcbiAgICBjb25zdCBncmlkQWxpZ25tZW50ID0gdG8gPT09ICdjb250YWluZXInID8gRGF0b0dyaWRBbGlnbm1lbnQuRklUX1RPX0NPTlRBSU5FUiA6IERhdG9HcmlkQWxpZ25tZW50LkZJVF9UT19DT05URU5UO1xuICAgIHRoaXMudXBkYXRlU2V0dGluZ3MoeyBncmlkQWxpZ25tZW50LCBjb2x1bW5zU2l6ZXM6IG51bGwgfSk7XG4gIH1cblxuICBzYXZlU2V0dGluZ3NUb1NlcnZlcihzZXR0aW5nczogUGFydGlhbDxEYXRvR3JpZFNldHRpbmdzPikge1xuICAgIHRoaXMuc3RvcmFnZUFQSS5zZXQodGhpcy5ncmlkTmFtZSwgc2V0dGluZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbCB1c2VkIHRvIGxvZyBncmlkIGV2ZW50cyB0byB0aGUgcGxhdGZvcm0ncyBsb2dnaW5nIHNlcnZpY2VcbiAgICovXG4gIF9sb2dFdmVudChldmVudFR5cGU6IENvcmVFdmVudFR5cGVzLCBldmVudFByb3BlcnRpZXM/OiBIYXNoTWFwPGFueT4pIHtcbiAgICB0aGlzLmxvZ2dlci5sb2dFdmVudChldmVudFR5cGUsIHsgdGFibGU6IHRoaXMuZ3JpZE5hbWUsIC4uLmV2ZW50UHJvcGVydGllcyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgd3JhcFN1Y2Nlc3NDYWxsYmFjayh7IHN1Y2Nlc3NDYiwgcGFnZU51bWJlciwgaXNQZW5kaW5nUmV0dXJuVG9QYWdlIH06IFN1Y2Nlc3NXcmFwcGVyUGFyYW1zKSB7XG4gICAgcmV0dXJuIChyb3dzVGhpc0Jsb2NrOiBhbnlbXSwgdG90YWxSb3dzOiBudW1iZXIpID0+IHtcbiAgICAgIHRoaXMuc2V0U2VydmVyU2lkZVBhZ2luYXRpb24oeyB0b3RhbFJvd3MsIGhhc0Vycm9yOiBmYWxzZSB9KTtcbiAgICAgIHN1Y2Nlc3NDYihyb3dzVGhpc0Jsb2NrLCB0b3RhbFJvd3MpO1xuICAgICAgdGhpcy5ncmlkUXVlcnkuX3NlcnZlckRhdGFMb2FkZWQubmV4dCh7XG4gICAgICAgIGFwaTogdGhpcy5hcGkuZ3JpZCxcbiAgICAgICAgY29sdW1uQXBpOiB0aGlzLmFwaS5jb2x1bW5zLFxuICAgICAgICB0eXBlOiAnU2VydmVyRGF0YUxvYWRlZCcsXG4gICAgICAgIHBhZ2luYXRpb25QYWdlOiBwYWdlTnVtYmVyXG4gICAgICB9KTtcbiAgICAgIGlmICghaXNQZW5kaW5nUmV0dXJuVG9QYWdlKSB7XG4gICAgICAgIHRoaXMuc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICAgIC8qKiBzbyB0aGUgZ3JpZCBmaXRzIGluIGV2ZXJ5IG5ldyBkYXRhIGlucHV0ICovXG4gICAgICAgIHRyaWdnZXJXaW5kb3dSZXNpemUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGFzdFRvdGFsUm93cyA9IHRvdGFsUm93cztcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB3cmFwR2V0Um93cyhvcHRpb25zOiBEYXRvR3JpZE9wdGlvbnMsIGdldFJvd3M/OiAocGFyYW1zOiBEYXRvR3JpZEdldFJvd3NQYXJhbXMpID0+IHZvaWQpIHtcbiAgICBjb25zdCBnZXRSb3dzQ2IgPSBnZXRSb3dzIHx8IG9wdGlvbnMuZGF0YXNvdXJjZS5nZXRSb3dzO1xuICAgIHJldHVybiAoZ2V0Um93c1BhcmFtczogSUdldFJvd3NQYXJhbXMpID0+IHtcbiAgICAgIGNvbnN0IHsgc3RhcnRSb3csIGVuZFJvdywgc29ydE1vZGVsLCBzdWNjZXNzQ2FsbGJhY2sgfSA9IGdldFJvd3NQYXJhbXM7XG4gICAgICBjb25zdCBwYWdlU2l6ZSA9IG9wdGlvbnMucGFnaW5hdGlvblBhZ2VTaXplIHx8IDEwMDtcbiAgICAgIGNvbnN0IGlzUmV0dXJuVG9DdXJyZW50UGFnZVJlcXVpcmVkID0gdGhpcy5wYWdlTnVtYmVyVG9SZXR1cm5BZnRlclJlZnJlc2ggPiAwO1xuICAgICAgY29uc3QgaXNQZW5kaW5nUmV0dXJuVG9QYWdlID0gaXNSZXR1cm5Ub0N1cnJlbnRQYWdlUmVxdWlyZWQgJiYgc3RhcnRSb3cgPT09IDA7XG5cbiAgICAgIGNvbnN0IHBhZ2VOdW1iZXIgPSBpc1JldHVyblRvQ3VycmVudFBhZ2VSZXF1aXJlZFxuICAgICAgICA/IHRoaXMucGFnZU51bWJlclRvUmV0dXJuQWZ0ZXJSZWZyZXNoICsgMVxuICAgICAgICA6IE1hdGguY2VpbChlbmRSb3cgLyBwYWdlU2l6ZSk7XG5cbiAgICAgIHRoaXMucGFnZU51bWJlclRvUmV0dXJuQWZ0ZXJSZWZyZXNoID0gLTE7XG5cbiAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEZpbHRlcigpO1xuICAgICAgY29uc3QgbmV3UGFyYW1zOiBEYXRvR3JpZEdldFJvd3NQYXJhbXMgPSB7XG4gICAgICAgIC4uLmdldFJvd3NQYXJhbXMsXG4gICAgICAgIGZhaWxDYWxsYmFjazogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0U2VydmVyU2lkZVBhZ2luYXRpb24oeyBoYXNFcnJvcjogdHJ1ZSB9KTtcbiAgICAgICAgICB0aGlzLnNldE92ZXJsYXkodHJ1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIHN1Y2Nlc3NDYWxsYmFjazogdGhpcy53cmFwU3VjY2Vzc0NhbGxiYWNrKHsgcGFnZU51bWJlciwgc3VjY2Vzc0NiOiBzdWNjZXNzQ2FsbGJhY2ssIGlzUGVuZGluZ1JldHVyblRvUGFnZSB9KSxcbiAgICAgICAgc2VydmVyQ29uZmlnOiB7XG4gICAgICAgICAgcGFnZVNpemUsXG4gICAgICAgICAgcGFnZU51bWJlcixcbiAgICAgICAgICBjb2x1bW5GaWx0ZXJzOiBpc0VtcHR5KGZpbHRlcikgfHwgb3B0aW9ucy5lbmFibGVWMl8xID8gbnVsbCA6IHRoaXMuYnVpbGRTZXJ2ZXJSZXF1ZXN0RmlsdGVycyhmaWx0ZXIpLFxuICAgICAgICAgIGZpbHRlcjogb3B0aW9ucy5lbmFibGVWMl8xID8gdGhpcy5idWlsZFNlcnZlclJlcXVlc3RGaWx0ZXJzX3YyXzEob3B0aW9ucy5jb2x1bW5EZWZzKSA6IG51bGwsXG4gICAgICAgICAgc29ydDogdGhpcy5idWlsZFNlcnZlclJlcXVlc3RTb3J0KHNvcnRNb2RlbClcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmIChpc1BlbmRpbmdSZXR1cm5Ub1BhZ2UpIHtcbiAgICAgICAgLy8gU2NlbmFyaW8gdGhlIGZvbGxvd2luZyBoYW5kbGVzIC0gc2VydmVyIHJlZnJlc2ggd2hlcmUgaXQgd2FzIHJlcXVlc3RlZCB0byBrZWVwIHRoZSBjdXJyZW50IHBhZ2UuXG4gICAgICAgIC8vIFRoZSBwcm9ibGVtIC0gZ2V0Um93cyB3aWxsIGluaXRpYWxseSBiZSBjYWxsZWQgZm9yIHBhZ2UgMSAoYXV0b21hdGljYWxseSBoYXBwZW5zIHdoZW4gY2FsbGluZyBhZy1ncmlkJ3Mgc2V0RGF0YVNvdXJjZSkuXG4gICAgICAgIC8vIEluIG9yZGVyIHRvIHRyaWdnZXIgaXQgYWdhaW4sIHN1Y2Nlc3NDYWxsYmFjayBpcyBjYWxsZWQgd2l0aCB0aGUgZGVzaXJlZCBwYWdlLlxuICAgICAgICAvLyBmYWtlR2V0Um93cyBpcyB1c2VkIGluIG9yZGVyIHRvIGF2b2lkIHJldHJpZXZpbmcgdGhlIHVubmVjZXNzYXJ5IHJlYWwgZGF0YSBmb3IgcGFnZSAxLlxuICAgICAgICBjb25zdCBmYWtlR2V0Um93cyA9ICh7IHN1Y2Nlc3NDYWxsYmFjayB9OiBEYXRvR3JpZEdldFJvd3NQYXJhbXMpID0+IHtcbiAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soW10sIHRoaXMubGFzdFRvdGFsUm93cyk7XG4gICAgICAgIH07XG4gICAgICAgIGZha2VHZXRSb3dzKG5ld1BhcmFtcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnZXRSb3dzQ2IobmV3UGFyYW1zKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0RWRpdGFibGVDb2x1bW5zQ2VsbENsYXNzKHBhcmFtczogTm9ybWFsaXplT3B0aW9uc1BhcmFtcykge1xuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5jb2x1bW5EZWZzLmZvckVhY2goY29sRGVmID0+IHtcbiAgICAgIGlmIChjb2xEZWYuZWRpdGFibGUpIHtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oY29sRGVmLmVkaXRhYmxlKSkge1xuICAgICAgICAgIGNvbnN0IGluaXRpYWxDZWxsQ2xhc3MgPSBjb2xEZWYuY2VsbENsYXNzO1xuICAgICAgICAgIGNvbERlZi5jZWxsQ2xhc3MgPSAoY2VsbENsYXNzUGFyYW1zOiBDZWxsQ2xhc3NQYXJhbXMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzRWRpdGFibGUgPSAoY29sRGVmLmVkaXRhYmxlIGFzIEZ1bmN0aW9uKShjZWxsQ2xhc3NQYXJhbXMgYXMgYW55KTtcbiAgICAgICAgICAgIGlmIChpc0VkaXRhYmxlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVkaXRhYmxlUmVzdWx0ID0gdGhpcy5hZGRFZGl0YWJsZUNlbGxDbGFzcyhpbml0aWFsQ2VsbENsYXNzKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24oZWRpdGFibGVSZXN1bHQpID8gZWRpdGFibGVSZXN1bHQoY2VsbENsYXNzUGFyYW1zKSA6IGVkaXRhYmxlUmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24oaW5pdGlhbENlbGxDbGFzcykgPyBpbml0aWFsQ2VsbENsYXNzKGNlbGxDbGFzc1BhcmFtcykgOiBpbml0aWFsQ2VsbENsYXNzO1xuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29sRGVmLmNlbGxDbGFzcyA9IHRoaXMuYWRkRWRpdGFibGVDZWxsQ2xhc3MoY29sRGVmLmNlbGxDbGFzcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgd3JhcENvbnRleHRNZW51QnVpbGRlcihwYXJhbXM6IE5vcm1hbGl6ZU9wdGlvbnNQYXJhbXMpIHtcbiAgICBjb25zdCB7IGN1c3RvbUNvbnRleHRNZW51IH0gPSBwYXJhbXMuZ3JpZE9wdGlvbnM7XG4gICAgY29uc3QgYWxsQWN0aW9ucyA9IGlzRnVuY3Rpb24oY3VzdG9tQ29udGV4dE1lbnUpID8gY3VzdG9tQ29udGV4dE1lbnUocGFyYW1zLnJvd0FjdGlvbnMpIDogcGFyYW1zLnJvd0FjdGlvbnM7XG4gICAgdGhpcy50cmFuc2xhdGVBY3Rpb25MYWJlbHMoYWxsQWN0aW9ucyk7XG4gICAgY29uc3QgY29weUFjdGlvbjogUm93QWN0aW9uID0ge1xuICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybSgnY29yZS5jb3B5LWNlbGwnKSxcbiAgICAgIGljb246ICdjb3B5JyxcbiAgICAgIGtleTogJ0NvcHkgQ2VsbCdcbiAgICB9O1xuICAgIHJldHVybiAoeyBub2RlLCBjb2x1bW4sIGNvbnRleHQgfTogR2V0Q29udGV4dE1lbnVJdGVtc1BhcmFtcykgPT4ge1xuICAgICAgY29uc3Qgb25Ib3ZlckFjdGlvbk1lbnUgPSBjb250ZXh0ICYmIGNvbnRleHQuY29udGV4dE1lbnUgJiYgY29udGV4dC5jb250ZXh0TWVudS5mcm9tT25Ib3ZlcjtcbiAgICAgIGlmICghbm9kZSkgcmV0dXJuIFtdO1xuICAgICAgbGV0IHNlbGVjdGVkID0gW25vZGVdO1xuICAgICAgbGV0IHJvd3NDb3VudCA9IDE7XG4gICAgICBpZiAob25Ib3ZlckFjdGlvbk1lbnUpIHtcbiAgICAgICAgdGhpcy51cGRhdGVHcmlkQ29udGV4dCh7IGNvbnRleHRNZW51OiB7IGZyb21PbkhvdmVyOiBmYWxzZSB9IH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29weUFjdGlvbi5vbkNsaWNrID0gKFtyb3ddKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSB0aGlzLmFwaS5ncmlkLmdldFZhbHVlKGNvbHVtbi5nZXRDb2xJZCgpLCByb3cpO1xuICAgICAgICAgIGNvbnN0IGZvcm1hdHRlciA9IGNvbHVtbi5nZXRDb2xEZWYoKS52YWx1ZUZvcm1hdHRlcjtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZvcm1hdHRlciAmJiB0eXBlb2YgZm9ybWF0dGVyICE9PSAnc3RyaW5nJyA/IGZvcm1hdHRlcihyYXdWYWx1ZSkgOiByYXdWYWx1ZTtcbiAgICAgICAgICB3cml0ZVRvQ2xpcGJvYXJkKHZhbHVlKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG5vZGUuaXNTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgc2VsZWN0ZWQgPSB0aGlzLmdyaWRRdWVyeS5nZXRTZWxlY3RlZFJvd05vZGVzKCk7XG4gICAgICAgICAgcm93c0NvdW50ID0gc2l6ZShzZWxlY3RlZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHZpc2libGVBY3Rpb25zID0gZ2V0VmlzaWJsZUFjdGlvbnMoXG4gICAgICAgIGFsbEFjdGlvbnMsXG4gICAgICAgIHJvd3NDb3VudCxcbiAgICAgICAgc2VsZWN0ZWQsXG4gICAgICAgIHRoaXMuZ3JpZFF1ZXJ5LmlzU2VydmVyU2VsZWN0QWxsUm93c0VuYWJsZWRcbiAgICAgICkuZmlsdGVyKCh7IHZpc2libGUgfSkgPT4gdmlzaWJsZSk7XG4gICAgICBsZXQgdG9vbGJhckFjdGlvbnMgPSBbY29weUFjdGlvbl07XG4gICAgICBpZiAob25Ib3ZlckFjdGlvbk1lbnUpIHtcbiAgICAgICAgdG9vbGJhckFjdGlvbnMgPSB2aXNpYmxlQWN0aW9ucztcbiAgICAgIH0gZWxzZSBpZiAodmlzaWJsZUFjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0b29sYmFyQWN0aW9ucyA9IFt7IC4uLmNvcHlBY3Rpb24sIHNlcGFyYXRvcjogdHJ1ZSB9LCAuLi52aXNpYmxlQWN0aW9uc107XG4gICAgICB9XG4gICAgICBjb25zdCBjb252ZXJ0ZXJQYXJhbXM6IEFjdGlvbkNvbnZlcnRlclBhcmFtcyA9IHtcbiAgICAgICAgdG9vbGJhckFjdGlvbnMsXG4gICAgICAgIHNlbGVjdGVkUm93czogc2VsZWN0ZWQsXG4gICAgICAgIGljb25SZWdpc3RyeTogdGhpcy5zdmdSZWdpc3RyeSxcbiAgICAgICAgbm9kZSxcbiAgICAgICAgbG9nZ2VyOiB7XG4gICAgICAgICAgbG9nOiB0aGlzLl9sb2dFdmVudC5iaW5kKHRoaXMpLFxuICAgICAgICAgIGV2ZW50T3JpZ2luOiBvbkhvdmVyQWN0aW9uTWVudSA/ICdPbiBIb3ZlcicgOiAnQ29udGV4dCBNZW51J1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHRvb2xiYXJBY3Rpb25Ub0NvbnRleHRBY3Rpb24oY29udmVydGVyUGFyYW1zKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB0cmFuc2xhdGVBY3Rpb25MYWJlbHMoYWxsQWN0aW9uczogUm93QWN0aW9uW10pIHtcbiAgICBhbGxBY3Rpb25zLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICAgIGFjdGlvbi5sYWJlbCA9IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShhY3Rpb24ubGFiZWwpO1xuICAgICAgaWYgKGFjdGlvbi5zdWJNZW51KSB7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlQWN0aW9uTGFiZWxzKGFjdGlvbi5zdWJNZW51KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGxvYWRTYXZlZFNldHRpbmdzKHNldHRpbmdzOiBQYXJ0aWFsPERhdG9HcmlkU2V0dGluZ3M+KSB7XG4gICAgY29uc3Qge1xuICAgICAgc29ydCxcbiAgICAgIGhpZGRlbkNvbHVtbnMsXG4gICAgICBmaWx0ZXIsXG4gICAgICBncm91cGVkQ29sdW1ucyxcbiAgICAgIGNvbHVtbnNTaXplcyxcbiAgICAgIHBpbm5lZENvbHVtbnMsXG4gICAgICBjb2x1bW5zT3JkZXIsXG4gICAgICBncmlkQWxpZ25tZW50XG4gICAgfSA9IHNldHRpbmdzO1xuICAgIGNvbnN0IHsgZ3JpZCwgY29sdW1ucyB9ID0gdGhpcy5hcGk7XG4gICAgLyogSGlkZSBjb2x1bW5zICovXG4gICAgLyogTk9URTogY29sdW1ucyBvcmRlciBhcmUgdHJlYXRlZCBhcyB0aGUgY3VycmVudGx5IHZpc2libGUgY29sdW1ucyAqL1xuICAgIGNvbHVtbnMuc2V0Q29sdW1uc1Zpc2libGUodGhpcy5pbml0aWFsU2V0dGluZ3MuY29sdW1uc09yZGVyLCB0cnVlKTtcbiAgICBjb25zdCBjb2x1bW5Ub0hpZGUgPSAhaXNOaWwoaGlkZGVuQ29sdW1ucykgPyBoaWRkZW5Db2x1bW5zIDogdGhpcy5pbml0aWFsU2V0dGluZ3MuaGlkZGVuQ29sdW1ucztcbiAgICBjb2x1bW5zLnNldENvbHVtbnNWaXNpYmxlKGNvbHVtblRvSGlkZSwgZmFsc2UpO1xuXG4gICAgLyogQXBwbHkgZmlsdGVycyAqL1xuICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgIGdyaWQub25GaWx0ZXJDaGFuZ2VkKCk7XG4gICAgfVxuXG4gICAgLyogR3JvdXAgY29sdW1ucyAqL1xuICAgIGNvbnN0IGFsbEdyb3VwZWRDb2x1bW5zID0gY29sdW1ucy5nZXRSb3dHcm91cENvbHVtbnMoKTtcbiAgICBsZXQgcmVtb3ZlR3JvdXBlZDtcbiAgICBpZiAoZ3JvdXBlZENvbHVtbnMpIHtcbiAgICAgIHJlbW92ZUdyb3VwZWQgPSBhbGxHcm91cGVkQ29sdW1ucy5maWx0ZXIoY29sID0+ICFncm91cGVkQ29sdW1ucy5pbmNsdWRlcyhjb2wuZ2V0Q29sSWQoKSkpO1xuICAgICAgY29sdW1ucy5hZGRSb3dHcm91cENvbHVtbnMoZ3JvdXBlZENvbHVtbnMpO1xuICAgICAgY29sdW1ucy5zZXRDb2x1bW5zVmlzaWJsZShncm91cGVkQ29sdW1ucywgZmFsc2UpO1xuICAgIH1cbiAgICBjb2x1bW5zLnJlbW92ZVJvd0dyb3VwQ29sdW1ucyhyZW1vdmVHcm91cGVkKTtcbiAgICBjb2x1bW5zLnNldENvbHVtbnNWaXNpYmxlKHJlbW92ZUdyb3VwZWQsIHRydWUpO1xuXG4gICAgLyogQXBwbHkgc29ydCAqL1xuICAgIGNvbnN0IGdyaWRTb3J0ID0gc29ydCB8fCB0aGlzLmluaXRpYWxTZXR0aW5ncy5zb3J0O1xuICAgIGdyaWQuc2V0U29ydE1vZGVsKGdyaWRTb3J0ID8gW2dyaWRTb3J0XSA6IG51bGwpO1xuXG4gICAgLyogQWxpZ24gZ3JpZCAqL1xuICAgIGlmIChncmlkQWxpZ25tZW50ID09PSBEYXRvR3JpZEFsaWdubWVudC5DVVNUT00pIHtcbiAgICAgIC8qIFNldCBjb2x1bW4gc2l6ZXMgKi9cbiAgICAgIGNvbHVtbnNTaXplcyAmJlxuICAgICAgICBPYmplY3Qua2V5cyhjb2x1bW5zU2l6ZXMpLmZvckVhY2goY29sSWQgPT4ge1xuICAgICAgICAgIGlmIChjb2x1bW5zU2l6ZXNbY29sSWRdID09PSBEYXRvR3JpZEFsaWdubWVudC5GSVRfVE9fQ09OVEVOVCkge1xuICAgICAgICAgICAgY29sdW1ucy5hdXRvU2l6ZUNvbHVtbihjb2xJZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbHVtbnMuc2V0Q29sdW1uV2lkdGgoY29sSWQsIGNvbHVtbnNTaXplc1tjb2xJZF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdyaWRBbGlnbm1lbnQgPT09IERhdG9HcmlkQWxpZ25tZW50LkZJVF9UT19DT05URU5UID8gY29sdW1ucy5hdXRvU2l6ZUFsbENvbHVtbnMoKSA6IGdyaWQuc2l6ZUNvbHVtbnNUb0ZpdCgpO1xuICAgIH1cblxuICAgIC8qIFBpbiBjb2x1bW5zIGxlZnQgKi9cbiAgICBjb25zdCBmaWx0ZXJlZFBpbm5lZENvbHVtbnMgPSBwaW5uZWRDb2x1bW5zXG4gICAgICA/IHBpbm5lZENvbHVtbnMuZmlsdGVyKChjb2w6IHN0cmluZykgPT4gY29sICE9PSB0aGlzLkNIRUNLQk9YX1NFTEVDVElPTl9DT0xfSUQpXG4gICAgICA6IG51bGw7XG4gICAgY29uc3QgZmlsdGVyZWRDb2x1bW5zID0gY29sdW1uc09yZGVyXG4gICAgICA/IGNvbHVtbnNPcmRlci5maWx0ZXIoKGNvbDogc3RyaW5nKSA9PiBjb2wgIT09IHRoaXMuQ0hFQ0tCT1hfU0VMRUNUSU9OX0NPTF9JRClcbiAgICAgIDogbnVsbDtcbiAgICBzaXplKGZpbHRlcmVkUGlubmVkQ29sdW1ucykgPiAwXG4gICAgICA/IGNvbHVtbnMuc2V0Q29sdW1uc1Bpbm5lZChmaWx0ZXJlZFBpbm5lZENvbHVtbnMsICdsZWZ0JylcbiAgICAgIDogZmlsdGVyZWRDb2x1bW5zICYmIGNvbHVtbnMuc2V0Q29sdW1uc1Bpbm5lZChmaWx0ZXJlZENvbHVtbnMsIG51bGwpO1xuXG4gICAgLyogT3JkZXIgY29sdW1ucyAqL1xuICAgIGNvbHVtbnNPcmRlciAmJiBjb2x1bW5zLm1vdmVDb2x1bW5zKGNvbHVtbnNPcmRlciwgMCk7XG4gIH1cblxuICBnZXRTZXR0aW5nc0RpZmYoKTogUGFydGlhbDxEYXRvR3JpZFNldHRpbmdzPiB7XG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy5ncmlkUXVlcnkuZ2V0Q3VycmVudEdyaWRTZXR0aW5ncygpO1xuICAgIHJldHVybiBkaWZmKGN1cnJlbnRTdGF0ZSwgdGhpcy5pbml0aWFsU2V0dGluZ3MpO1xuICB9XG5cbiAgcmVzZXRUYWJsZVNldHRpbmdzKCkge1xuICAgIGNvbnN0IHsgZmlsdGVyLCAuLi5yZXN0IH0gPSB0aGlzLmluaXRpYWxTZXR0aW5ncztcbiAgICBjb25zdCB7IGNvbHVtbnMgfSA9IHRoaXMuYXBpO1xuICAgIGNvbnN0IG9yaWdpbmFsQ29sU2l6ZXMgPSBnZXRDb2x1bW5zU2l6ZXMoY29sdW1ucy5nZXRBbGxHcmlkQ29sdW1ucygpLCB0cnVlKTtcbiAgICBjb25zdCBncmlkQWxpZ25tZW50ID0gaXNFbXB0eShvcmlnaW5hbENvbFNpemVzKSA/IHJlc3QuZ3JpZEFsaWdubWVudCA6IERhdG9HcmlkQWxpZ25tZW50LkNVU1RPTTtcbiAgICBjb25zdCBuZXdTZXR0aW5ncyA9IHsgLi4ucmVzdCwgY29sdW1uc1NpemVzOiBvcmlnaW5hbENvbFNpemVzLCBncmlkQWxpZ25tZW50IH07XG4gICAgdGhpcy51cGRhdGVTZXR0aW5ncyhuZXdTZXR0aW5ncyk7XG4gICAgdGhpcy5sb2FkU2F2ZWRTZXR0aW5ncyhuZXdTZXR0aW5ncyk7XG4gICAgdGhpcy5zYXZlU2V0dGluZ3NUb1NlcnZlcih7IGZpbHRlciB9KTtcbiAgfVxuXG4gIGluaXRTZXR0aW5ncyhzYXZlZFNldHRpbmdzOiBQYXJ0aWFsPERhdG9HcmlkU2V0dGluZ3M+KSB7XG4gICAgdGhpcy5pbml0aWFsU2V0dGluZ3MgPSB0aGlzLmdyaWRRdWVyeS5nZXRDdXJyZW50R3JpZFNldHRpbmdzKCk7XG4gICAgdGhpcy51cGRhdGVTZXR0aW5ncyhzYXZlZFNldHRpbmdzKTtcbiAgICB0aGlzLmxvYWRTYXZlZFNldHRpbmdzKHNhdmVkU2V0dGluZ3MpO1xuICB9XG5cbiAgbm90aWZ5RmlsdGVyVXBkYXRlKCkge1xuICAgIGNvbnN0IHdhdGNoID0gW3RoaXMuZ3JpZFJlZi5maWx0ZXJDaGFuZ2VkLmFzT2JzZXJ2YWJsZSgpXTtcbiAgICBpZiAodGhpcy5ncmlkUXVlcnkuaXNTZXJ2ZXJTaWRlKSB7XG4gICAgICB3YXRjaC5wdXNoKHRoaXMuZ3JpZFF1ZXJ5LnNlcnZlckRhdGFMb2FkZWQkKTtcbiAgICAgIHRoaXMuc2V0TG9hZGluZyh0cnVlKTtcbiAgICB9XG4gICAgY29tYmluZUxhdGVzdCh3YXRjaClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICB1bnRpbERlc3Ryb3llZCh0aGlzKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJvd3NBZnRlckZpbHRlciA9IHRoaXMuYXBpLmdyaWQuZ2V0RGlzcGxheWVkUm93Q291bnQoKTtcbiAgICAgICAgdGhpcy5zZXRPdmVybGF5KHJvd3NBZnRlckZpbHRlciA9PT0gMCk7XG4gICAgICB9KTtcbiAgICB0aGlzLmFwaS5ncmlkLm9uRmlsdGVyQ2hhbmdlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNlcnZlclJlcXVlc3RGaWx0ZXJzKGZpbHRlcjogRGF0b0dyaWRGaWx0ZXJzTWFwKTogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXJzIHtcbiAgICBjb25zdCBjb2x1bW5zRmlsdGVyczogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXJzID0ge307XG4gICAgZm9yIChjb25zdCBbY29sdW1uLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZmlsdGVyKSkge1xuICAgICAgY29uc3QgeyBieVZhbHVlLCBjb25kaXRpb25hbCB9ID0gdmFsdWU7XG4gICAgICBpZiAoYnlWYWx1ZSkge1xuICAgICAgICBjb2x1bW5zRmlsdGVyc1tjb2x1bW5dID0ge1xuICAgICAgICAgIG9wZXJhdG9yOiBPcGVyYXRvclR5cGVzLkFORCxcbiAgICAgICAgICBmaWx0ZXJzOiBbYnlWYWx1ZV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25kaXRpb25hbCkge1xuICAgICAgICBjb25zdCBjb25kaXRpb25hbEZpbHRlciA9IHtcbiAgICAgICAgICBvcGVyYXRvcjogY29uZGl0aW9uYWwub3BlcmF0b3IsXG4gICAgICAgICAgZmlsdGVyczogY29uZGl0aW9uYWwuY29uZGl0aW9ucy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGNvbmRpdGlvbiwgdmFsdWUgfSA9IGl0ZW07XG4gICAgICAgICAgICBpZiAoY29uZGl0aW9uID09PSBEYXRvRmlsdGVyQ29uZGl0aW9ucy5JTl9SQU5HRSkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvbmRpdGlvbixcbiAgICAgICAgICAgICAgICBzdGFydDogdmFsdWUsXG4gICAgICAgICAgICAgICAgZW5kOiAoaXRlbSBhcyBEYXRvR3JpZFJhbmdlRmlsdGVyQ29uZGl0aW9uKS5yYW5nZUVuZFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGl0ZW0gYXMgRGF0b0dyaWRGaWx0ZXJDb25kaXRpb247XG4gICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGJ5VmFsdWUpIHtcbiAgICAgICAgICBjb2x1bW5zRmlsdGVyc1tjb2x1bW5dLmZpbHRlcnMucHVzaChjb25kaXRpb25hbEZpbHRlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29sdW1uc0ZpbHRlcnNbY29sdW1uXSA9IGNvbmRpdGlvbmFsRmlsdGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbHVtbnNGaWx0ZXJzO1xuICB9XG5cbiAgYnVpbGRTZXJ2ZXJSZXF1ZXN0RmlsdGVyc192Ml8xKGdyaWRDb2x1bW5zOiBEYXRvR3JpZENvbHVtbkRlZltdKTogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIge1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEZpbHRlcigpO1xuICAgIGNvbnN0IHNlYXJjaFRlcm0gPSB0aGlzLmdyaWRRdWVyeS5nZXRTZWFyY2hUZXJtKCk7XG5cbiAgICBsZXQgY29sdW1uRmlsdGVycyA9IHRoaXMuYnVpbGRTZXJ2ZXJDb2x1bW5GaWx0ZXJzX3YyXzEoZmlsdGVyKTtcbiAgICBpZiAoY29sdW1uRmlsdGVycy5ldmVyeSgoeyBvcGVyYXRvciB9OiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlcikgPT4gb3BlcmF0b3IgPT09IE9wZXJhdG9yVHlwZXMuQU5EKSkge1xuICAgICAgY29uc3QgZmxhdHRlbmVkRmlsdGVycyA9IGNvbHVtbkZpbHRlcnNcbiAgICAgICAgLm1hcCgoeyBmaWx0ZXJzIH06IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyKSA9PiBmaWx0ZXJzKVxuICAgICAgICAucmVkdWNlKChhcnIsIHJlcykgPT4gcmVzLmNvbmNhdChhcnIpLCBbXSk7XG4gICAgICBjb2x1bW5GaWx0ZXJzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yVHlwZXMuQU5ELFxuICAgICAgICAgIGZpbHRlcnM6IGZsYXR0ZW5lZEZpbHRlcnNcbiAgICAgICAgfVxuICAgICAgXTtcbiAgICB9XG4gICAgY29uc3QgY29sdW1uRmlsdGVyOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciA9XG4gICAgICBzaXplKGNvbHVtbkZpbHRlcnMpID4gMVxuICAgICAgICA/IHsgb3BlcmF0b3I6IE9wZXJhdG9yVHlwZXMuQU5ELCBmaWx0ZXJzOiBjb2x1bW5GaWx0ZXJzIH1cbiAgICAgICAgOiBzaXplKGNvbHVtbkZpbHRlcnMpID09PSAxXG4gICAgICAgID8gY29sdW1uRmlsdGVyc1swXVxuICAgICAgICA6IG51bGw7XG4gICAgaWYgKCFzZWFyY2hUZXJtKSB7XG4gICAgICByZXR1cm4gY29sdW1uRmlsdGVyO1xuICAgIH1cbiAgICBjb25zdCB7IGluY2x1ZGVIaWRkZW5Db2x1bW5zSW5TZWFyY2ggfSA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEdyaWRPcHRpb25zKCk7XG4gICAgY29uc3Qgc2VhcmNoYWJsZUNvbHVtbnMgPSBncmlkQ29sdW1ucy5maWx0ZXIoKGNvbERlZjogRGF0b0dyaWRDb2x1bW5EZWYpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbERlZi5pbmNsdWRlSW5TZWFyY2ggJiYgKGluY2x1ZGVIaWRkZW5Db2x1bW5zSW5TZWFyY2ggfHwgdGhpcy5hcGkuY29sdW1ucy5nZXRDb2x1bW4oY29sRGVmLmNvbElkKS5pc1Zpc2libGUoKSlcbiAgICAgICk7XG4gICAgfSk7XG4gICAgY29uc3Qgc2VhcmNoRmlsdGVyczogU2VydmVyU2lkZVBhZ2luYXRpb25Db25kaXRpb25bXSA9IHNlYXJjaGFibGVDb2x1bW5zLm1hcCgoeyBmaWVsZCB9OiBEYXRvR3JpZENvbHVtbkRlZikgPT4gKHtcbiAgICAgIGNvbmRpdGlvbjogRGF0b0ZpbHRlckNvbmRpdGlvbnMuQ09OVEFJTlMsXG4gICAgICB2YWx1ZTogc2VhcmNoVGVybSxcbiAgICAgIGNvbHVtbjogZmllbGRcbiAgICB9KSk7XG4gICAgY29uc3Qgc2VhcmNoRmlsdGVyOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciA9XG4gICAgICBzaXplKHNlYXJjaEZpbHRlcnMpID4gMCA/IHsgb3BlcmF0b3I6IE9wZXJhdG9yVHlwZXMuT1IsIGZpbHRlcnM6IHNlYXJjaEZpbHRlcnMgfSA6IG51bGw7XG4gICAgaWYgKCFjb2x1bW5GaWx0ZXIpIHtcbiAgICAgIHJldHVybiBzZWFyY2hGaWx0ZXI7XG4gICAgfVxuICAgIHJldHVybiB7IG9wZXJhdG9yOiBPcGVyYXRvclR5cGVzLkFORCwgZmlsdGVyczogW2NvbHVtbkZpbHRlciwgc2VhcmNoRmlsdGVyXSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNlcnZlckNvbHVtbkZpbHRlcnNfdjJfMShmaWx0ZXI6IERhdG9HcmlkRmlsdGVyc01hcCk6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyW10ge1xuICAgIGxldCBjb2x1bW5GaWx0ZXJzOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlcltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtjb2x1bW4sIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhmaWx0ZXIpKSB7XG4gICAgICBsZXQgY29sdW1uRmlsdGVyOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciA9IG51bGw7XG4gICAgICBjb25zdCB7IGJ5VmFsdWUsIGNvbmRpdGlvbmFsIH0gPSB2YWx1ZTtcbiAgICAgIGlmIChieVZhbHVlKSB7XG4gICAgICAgIGNvbHVtbkZpbHRlciA9IHtcbiAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3JUeXBlcy5BTkQsXG4gICAgICAgICAgZmlsdGVyczogW3sgY29sdW1uLCAuLi5ieVZhbHVlIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoY29uZGl0aW9uYWwpIHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uYWxGaWx0ZXI6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyID0gdGhpcy5nZXRTZXJ2ZXJDb25kaXRpb25hbEZpbHRlcihjb25kaXRpb25hbCwgY29sdW1uKTtcbiAgICAgICAgaWYgKGNvbHVtbkZpbHRlcikge1xuICAgICAgICAgIGNvbHVtbkZpbHRlci5maWx0ZXJzLnB1c2goY29uZGl0aW9uYWxGaWx0ZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbHVtbkZpbHRlciA9IGNvbmRpdGlvbmFsRmlsdGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb2x1bW5GaWx0ZXJzLnB1c2goY29sdW1uRmlsdGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbkZpbHRlcnM7XG4gIH1cblxuICBnZXRGaWx0ZXJGb3JTZXJ2ZXJBY3Rpb25PblNlbGVjdEFsbCgpOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciB7XG4gICAgY29uc3QgeyBleGNsdWRlZEZyb21TZWxlY3RBbGwgfSA9IHRoaXMuZ3JpZFF1ZXJ5LnNlcnZlclNpZGVDb25maWc7XG4gICAgY29uc3QgeyBjb2x1bW5EZWZzLCBpZENvbHVtbktleSB9ID0gdGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKTtcbiAgICBjb25zdCBtYWluRmlsdGVyID0gdGhpcy5idWlsZFNlcnZlclJlcXVlc3RGaWx0ZXJzX3YyXzEoY29sdW1uRGVmcyk7XG4gICAgaWYgKGlzRW1wdHkoZXhjbHVkZWRGcm9tU2VsZWN0QWxsKSkge1xuICAgICAgcmV0dXJuIG1haW5GaWx0ZXI7XG4gICAgfVxuICAgIGNvbnN0IGV4Y2x1ZGVkUm93c0ZpbHRlcjogU2VydmVyU2lkZVBhZ2luYXRpb25MaXN0Q29uZGl0aW9uID0ge1xuICAgICAgY29uZGl0aW9uOiBEYXRvRmlsdGVyQ29uZGl0aW9ucy5OT1RfSU5fTElTVCxcbiAgICAgIHZhbHVlczogZXhjbHVkZWRGcm9tU2VsZWN0QWxsLFxuICAgICAgY29sdW1uOiBpZENvbHVtbktleVxuICAgIH07XG4gICAgY29uc3QgZmlsdGVycyA9IG1haW5GaWx0ZXIgPyBbbWFpbkZpbHRlciwgZXhjbHVkZWRSb3dzRmlsdGVyXSA6IFtleGNsdWRlZFJvd3NGaWx0ZXJdO1xuICAgIHJldHVybiB7IG9wZXJhdG9yOiBPcGVyYXRvclR5cGVzLkFORCwgZmlsdGVycyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZXJ2ZXJDb25kaXRpb25hbEZpbHRlcihcbiAgICBjb25kaXRpb25hbEZpbHRlcjogRGF0b0dyaWRDb25kaXRpb25hbEZpbHRlcixcbiAgICBjb2x1bW46IHN0cmluZ1xuICApOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wZXJhdG9yOiBjb25kaXRpb25hbEZpbHRlci5vcGVyYXRvcixcbiAgICAgIGZpbHRlcnM6IGNvbmRpdGlvbmFsRmlsdGVyLmNvbmRpdGlvbnMubWFwKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCB7IGNvbmRpdGlvbiwgdmFsdWUgfSA9IGl0ZW07XG4gICAgICAgIGlmIChjb25kaXRpb24gPT09IERhdG9GaWx0ZXJDb25kaXRpb25zLklOX1JBTkdFKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbixcbiAgICAgICAgICAgIHN0YXJ0OiB2YWx1ZSxcbiAgICAgICAgICAgIGVuZDogKGl0ZW0gYXMgRGF0b0dyaWRSYW5nZUZpbHRlckNvbmRpdGlvbikucmFuZ2VFbmQsXG4gICAgICAgICAgICBjb2x1bW5cbiAgICAgICAgICB9IGFzIFNlcnZlclNpZGVQYWdpbmF0aW9uUmFuZ2VDb25kaXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gRGF0b0ZpbHRlckNvbmRpdGlvbnMuSVNfRU1QVFkgfHwgY29uZGl0aW9uID09PSBEYXRvRmlsdGVyQ29uZGl0aW9ucy5OT1RfRU1QVFkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29uZGl0aW9uOiBEYXRvRmlsdGVyQ29uZGl0aW9ucy5JU19FTVBUWSxcbiAgICAgICAgICAgIHZhbHVlOiBjb25kaXRpb24gPT09IERhdG9GaWx0ZXJDb25kaXRpb25zLklTX0VNUFRZID8gJ3RydWUnIDogJ2ZhbHNlJyxcbiAgICAgICAgICAgIGNvbHVtblxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gRGF0b0ZpbHRlckNvbmRpdGlvbnMuSVNfTlVMTCB8fCBjb25kaXRpb24gPT09IERhdG9GaWx0ZXJDb25kaXRpb25zLk5PVF9OVUxMKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbjogRGF0b0ZpbHRlckNvbmRpdGlvbnMuSVNfTlVMTCxcbiAgICAgICAgICAgIHZhbHVlOiBjb25kaXRpb24gPT09IERhdG9GaWx0ZXJDb25kaXRpb25zLklTX05VTEwgPyAndHJ1ZScgOiAnZmFsc2UnLFxuICAgICAgICAgICAgY29sdW1uXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyAuLi5pdGVtLCBjb2x1bW4gfSBhcyBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkNvbmRpdGlvbjtcbiAgICAgIH0pXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTZXJ2ZXJSZXF1ZXN0U29ydChzb3J0TW9kZWw6IERhdG9HcmlkU29ydFtdKTogRGF0b0dyaWRTZXJ2ZXJTb3J0W10ge1xuICAgIHJldHVybiBzb3J0TW9kZWwubWFwKCh7IGNvbElkLCBzb3J0IH0pID0+ICh7XG4gICAgICBjb2x1bW46IGNvbElkLFxuICAgICAgc29ydE9yZGVyOiBzb3J0LnRvVXBwZXJDYXNlKCkgYXMgRGF0b0dyaWRTZXJ2ZXJTb3J0RGlyZWN0aW9uXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRFZGl0YWJsZUNlbGxDbGFzcyhcbiAgICBjZWxsQ2xhc3NWYWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCAoKGNlbGxDbGFzc1BhcmFtczogQ2VsbENsYXNzUGFyYW1zKSA9PiBzdHJpbmcgfCBzdHJpbmdbXSlcbiAgKSB7XG4gICAgaWYgKGlzTmlsKGNlbGxDbGFzc1ZhbHVlKSkge1xuICAgICAgcmV0dXJuICdkYXRvLWVkaXRhYmxlLWNlbGwnO1xuICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihjZWxsQ2xhc3NWYWx1ZSkpIHtcbiAgICAgIHJldHVybiBjZWxsQ2xhc3NQYXJhbXMgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRFZGl0YWJsZUNsYXNzQXJyYXkoY2VsbENsYXNzVmFsdWUoY2VsbENsYXNzUGFyYW1zKSk7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRFZGl0YWJsZUNsYXNzQXJyYXkoY2VsbENsYXNzVmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFZGl0YWJsZUNsYXNzQXJyYXkoY3VycmVudENsYXNzOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjZWxsQ2xhc3MgPSBjb2VyY2VBcnJheShjdXJyZW50Q2xhc3MpO1xuICAgIGNlbGxDbGFzcy5wdXNoKCdkYXRvLWVkaXRhYmxlLWNlbGwnKTtcbiAgICByZXR1cm4gY2VsbENsYXNzO1xuICB9XG5cbiAgc2VsZWN0QWxsQ3VycmVudFBhZ2VSb3dzKGlzU2VsZWN0ZWQgPSB0cnVlLCBjb25zaWRlckV4Y2x1ZGVkID0gZmFsc2UpIHtcbiAgICBsZXQgcm93c0ZvclNlbGVjdGlvbiA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEN1cnJlbnRQYWdlUm93cygpO1xuICAgIGlmIChjb25zaWRlckV4Y2x1ZGVkKSB7XG4gICAgICBjb25zdCB7IGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbCB9ID0gdGhpcy5ncmlkUXVlcnkuc2VydmVyU2lkZUNvbmZpZztcbiAgICAgIGlmICghaXNFbXB0eShleGNsdWRlZEZyb21TZWxlY3RBbGwpKSB7XG4gICAgICAgIHJvd3NGb3JTZWxlY3Rpb24gPSByb3dzRm9yU2VsZWN0aW9uLmZpbHRlcigoeyBpZCB9OiBSb3dOb2RlKSA9PiAhZXhjbHVkZWRGcm9tU2VsZWN0QWxsLmluY2x1ZGVzKGlkKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlzU2VsZWN0ZWQgPyB0aGlzLnNlbGVjdFJvd3Mocm93c0ZvclNlbGVjdGlvbikgOiB0aGlzLmRlc2VsZWN0Um93cyhyb3dzRm9yU2VsZWN0aW9uKTtcbiAgfVxuXG4gIGRlc2VsZWN0QWxsUm93cygpIHtcbiAgICB0aGlzLmFwaS5ncmlkLmRlc2VsZWN0QWxsKCk7XG4gICAgaWYgKHRoaXMuZ3JpZFF1ZXJ5LmlzU2VydmVyU2VsZWN0QWxsUm93c0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuc2V0U2VydmVyU2lkZVBhZ2luYXRpb24oeyBzZWxlY3RBbGxSb3dzRW5hYmxlZDogZmFsc2UsIGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbDogW10gfSk7XG4gICAgfVxuICB9XG5cbiAgcmVzb2x2ZVJvd0FjdGlvbnNWaXNpYmlsaXR5KCkge1xuICAgIHRoaXMuZ3JpZFF1ZXJ5Ll9yb3dBY3Rpb25WaXNpYmlsaXR5Q2hhbmdlZC5uZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogV2hlbiBwaXZvdGluZyxcbiAgICogd2UgYWRkIHRoZSBmaWVsZCBuYW1lIHRvIHRoZSBjb2x1bW4gaGVhZGVyIGNsYXNzIGluIG9yZGVyIHRvIGFjY2VzcyBpdCB0aHJvdWdoIHRoZSBhdXRvIGdlbmVyYXRlZCBwaXZvdCBjb2x1bW4uXG4gICAqL1xuICBwcml2YXRlIGluaXRQaXZvdFNlY29uZGFyeUNvbHNQcm9jZXNzKHsgZ3JpZE9wdGlvbnMgfTogTm9ybWFsaXplT3B0aW9uc1BhcmFtcykge1xuICAgIC8qKiBVc2UgcHJvY2Vzc1Bpdm90UmVzdWx0Q29sRGVmIGZyb20gdmVyIDI4ICovXG4gICAgZ3JpZE9wdGlvbnMucHJvY2Vzc1NlY29uZGFyeUNvbERlZiA9IGNvbERlZiA9PiB7XG4gICAgICBjb25zdCB1c2VyUHJvdmlkZWRDb2xEZWYgPSBjb2xEZWYucGl2b3RWYWx1ZUNvbHVtbiAmJiBjb2xEZWYucGl2b3RWYWx1ZUNvbHVtbi5nZXRVc2VyUHJvdmlkZWRDb2xEZWYoKTtcblxuICAgICAgaWYgKHVzZXJQcm92aWRlZENvbERlZikge1xuICAgICAgICBjb2xEZWYuZmlsdGVyID0gdXNlclByb3ZpZGVkQ29sRGVmLmZpbHRlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbERlZi5waXZvdEtleXMpIHtcbiAgICAgICAgY29sRGVmLnBpdm90S2V5cyA9IGNvbERlZi5waXZvdEtleXMubWFwKGtleSA9PiB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkS2V5ID0gdHJ5UGFyc2VQaXZvdFZhbHVlKGtleSk7XG5cbiAgICAgICAgICByZXR1cm4gKHBhcnNlZEtleSAmJiBwYXJzZWRLZXkudmFsdWUpIHx8ICcnO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqIFVzZSBwcm9jZXNzUGl2b3RSZXN1bHRDb2xHcm91cERlIGZyb20gdmVyIDI4ICovXG4gICAgZ3JpZE9wdGlvbnMucHJvY2Vzc1NlY29uZGFyeUNvbEdyb3VwRGVmID0gKGNvbEdyb3VwRGVmOiBDb2xHcm91cERlZikgPT4ge1xuICAgICAgaWYgKGNvbEdyb3VwRGVmLmhlYWRlck5hbWUpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVmFsdWUgPSB0cnlQYXJzZVBpdm90VmFsdWUoY29sR3JvdXBEZWYuaGVhZGVyTmFtZSk7XG5cbiAgICAgICAgaWYgKHBhcnNlZFZhbHVlKSB7XG4gICAgICAgICAgY29uc3QgeyBmaWVsZCwgdmFsdWUgfSA9IHBhcnNlZFZhbHVlO1xuXG4gICAgICAgICAgY29sR3JvdXBEZWYuaGVhZGVyQ2xhc3MgPSBbZmllbGRdO1xuICAgICAgICAgIGNvbEdyb3VwRGVmLmhlYWRlck5hbWUgPSB2YWx1ZTtcblxuICAgICAgICAgIGlmIChjb2xHcm91cERlZi5jaGlsZHJlbiAmJiBjb2xHcm91cERlZi5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb2xHcm91cERlZi5oZWFkZXJDbGFzcy5wdXNoKCdncm91cC1waXZvdC1jZWxsJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbEdyb3VwRGVmLmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IFtjb2xDaGlsZF06IGFueSA9IGNvbEdyb3VwRGVmLmNoaWxkcmVuO1xuICAgICAgICBjb25zdCBwaXZvdFRvdGFsQ29sdW1uSWRzID0gY29sQ2hpbGQgJiYgY29sQ2hpbGQucGl2b3RUb3RhbENvbHVtbklkcztcblxuICAgICAgICBpZiAocGl2b3RUb3RhbENvbHVtbklkcyAmJiBwaXZvdFRvdGFsQ29sdW1uSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb2xHcm91cERlZi5oZWFkZXJDbGFzcyA9IFsndG90YWwtcGl2b3QtY2VsbCddO1xuICAgICAgICAgIGNvbEdyb3VwRGVmLmhlYWRlck5hbWUgPSB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oJ2NvcmUudG90YWwnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29sR3JvdXBEZWYuaGVhZGVyQ2xhc3MgPSBbJ2VtcHR5LXBpdm90LWhlYWRlciddO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29sR3JvdXBEZWYucGl2b3RLZXlzKSB7XG4gICAgICAgIGNvbEdyb3VwRGVmLnBpdm90S2V5cyA9IGNvbEdyb3VwRGVmLnBpdm90S2V5cy5tYXAoa2V5ID0+IHtcbiAgICAgICAgICBjb25zdCBwYXJzZWRLZXkgPSB0cnlQYXJzZVBpdm90VmFsdWUoa2V5KTtcblxuICAgICAgICAgIHJldHVybiAocGFyc2VkS2V5ICYmIHBhcnNlZEtleS52YWx1ZSkgfHwgJyc7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNldFBpdm90TW9kZVJvd3M8VD4oZGF0YTogVFtdKSB7XG4gICAgY29uc3QgcGl2b3RDb2x1bW5zID0gdGhpcy5ncmlkUXVlcnkuZ2V0QWxsUGl2b3RDb2x1bW5zKCk7XG4gICAgY29uc3QgY29udmVydGVkRGF0YSA9IGRhdGEubWFwKChjdXJyZW50VmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBtYXBwZWRWYWx1ZXMgPSB7IC4uLmN1cnJlbnRWYWx1ZSB9O1xuXG4gICAgICBmb3IgKGNvbnN0IGNvbCBvZiBwaXZvdENvbHVtbnMpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBjb2wuZ2V0Q29sRGVmKCkuZmllbGQ7XG4gICAgICAgIGNvbnN0IHBpdm90VmFsdWU6IFBpdm90Q29sdW1uRGF0YSA9IHsgZmllbGQsIHZhbHVlOiBjdXJyZW50VmFsdWVbZmllbGRdIH07XG5cbiAgICAgICAgbWFwcGVkVmFsdWVzW2ZpZWxkXSA9IEpTT04uc3RyaW5naWZ5KHBpdm90VmFsdWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWFwcGVkVmFsdWVzO1xuICAgIH0pO1xuXG4gICAgdGhpcy5hcGkuZ3JpZC5zZXRSb3dEYXRhKGNvbnZlcnRlZERhdGEpO1xuICB9XG5cbiAgLyoqIE5vIGRlY2xhcmVkIGludGVyZmFjZSBpbiBjdXJyZW50IGdyaWQgdmVyc2lvbiB5ZXQuXG4gICAqICBSZWZlciBkb2NzIC0gaHR0cHM6Ly93d3cuYWctZ3JpZC5jb20vYW5ndWxhci1kYXRhLWdyaWQvY2VsbC1zdHlsZXMvI2NlbGwtY2xhc3MtcnVsZXMgKi9cbiAgcHJpdmF0ZSBnZXRQaXZvdE1vZGVDZWxsQ2xhc3NSdWxlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJ2V2ZW4tcm93LWdyb3VwLWxlYWYtY2VsbCc6IHRoaXMuaXNMZWFmR3JvdXBFdmVuQ2VsbC5iaW5kKHRoaXMpLFxuICAgICAgJ3Jvdy1ncm91cC1yb290LWNlbGwnOiB0aGlzLmlzUm93R3JvdXBWYWx1ZWRDZWxsLmJpbmQodGhpcylcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBpc0xlYWZHcm91cEV2ZW5DZWxsKHBhcmFtczogQ2VsbENsYXNzUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyBsZWFmR3JvdXAsIGNoaWxkSW5kZXgsIHJvd0dyb3VwSW5kZXggfSA9IHBhcmFtcy5ub2RlO1xuICAgIGNvbnN0IGNvbEluZGV4ID0gdGhpcy5nZXRDZWxsQ2xhc3NSdWxlQ29sSW5kZXgocGFyYW1zKTtcblxuICAgIHJldHVybiByb3dHcm91cEluZGV4IDw9IGNvbEluZGV4ICYmIGxlYWZHcm91cCAmJiBjaGlsZEluZGV4ICUgMiA9PT0gMDtcbiAgfVxuXG4gIHByaXZhdGUgaXNSb3dHcm91cFZhbHVlZENlbGwocGFyYW1zOiBDZWxsQ2xhc3NQYXJhbXMpOiBib29sZWFuIHtcbiAgICBjb25zdCB7IGxlYWZHcm91cCwgcm93R3JvdXBJbmRleCB9ID0gcGFyYW1zLm5vZGU7XG4gICAgY29uc3QgY29sSW5kZXggPSB0aGlzLmdldENlbGxDbGFzc1J1bGVDb2xJbmRleChwYXJhbXMpO1xuXG4gICAgcmV0dXJuIHJvd0dyb3VwSW5kZXggPD0gY29sSW5kZXggJiYgIWxlYWZHcm91cDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2VsbENsYXNzUnVsZUNvbEluZGV4KHBhcmFtczogQ2VsbENsYXNzUGFyYW1zKTogbnVtYmVyIHtcbiAgICBjb25zdCBncmlkUXVlcnkgPSBwYXJhbXMuY29sRGVmLmhlYWRlckNvbXBvbmVudFBhcmFtcy5ncmlkUXVlcnk7XG5cbiAgICBpZiAoZ3JpZFF1ZXJ5ICYmIGdyaWRRdWVyeS5hcGkpIHtcbiAgICAgIGNvbnN0IHsgY29sdW1ucyB9ID0gZ3JpZFF1ZXJ5LmFwaSBhcyBEYXRvR3JpZEFwaTtcbiAgICAgIGNvbnN0IGFsbERpc3BsYXllZENvbHVtbnMgPSBjb2x1bW5zLmdldEFsbERpc3BsYXllZENvbHVtbnMoKTtcbiAgICAgIGNvbnN0IGRpc3BsYXllZENvbHVtbiA9IGFsbERpc3BsYXllZENvbHVtbnMuZmluZChjb2wgPT4gY29sLmdldENvbElkKCkgPT09IHBhcmFtcy5jb2xEZWYuY29sSWQpO1xuXG4gICAgICByZXR1cm4gYWxsRGlzcGxheWVkQ29sdW1ucy5pbmRleE9mKGRpc3BsYXllZENvbHVtbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xuICB9XG59XG4iXX0=
1192
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGRhdG9yYW1hL2NvcmUvIiwic291cmNlcyI6WyJsaWIvZ3JpZC12Mi9ncmlkLXN0b3JlL2dyaWQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQXdCLE1BQU0sZUFBZSxDQUFDO0FBZ0J6RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFeEUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFDTCxvQkFBb0IsRUFLcEIsc0JBQXNCLEVBUXZCLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFakUsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQVNsRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxxQkFBcUIsRUFBa0IsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RSxPQUFPLEVBSUwsbUJBQW1CLEVBT25CLHVDQUF1QyxFQUN2QyxhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLDJC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SUFDWixDQUFDOztnQkF6c0NnQixTQUFTO2dCQUNMLFNBQVM7Z0JBQ1Qsb0JBQW9CO2dCQUNqQixZQUFZO2dCQUNiLFdBQVc7Z0RBQy9CLE1BQU0sU0FBQyxxQkFBcUI7Z0RBQzVCLE1BQU0sU0FBQyxnQkFBZ0I7O0lBakNmLFdBQVc7UUFEdkIsVUFBVSxFQUFFO1FBaUNSLFdBQUEsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUE7UUFDN0IsV0FBQSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTt5Q0FOVixTQUFTO1lBQ0wsU0FBUztZQUNULG9CQUFvQjtZQUNqQixZQUFZO1lBQ2IsV0FBVztPQS9CdkIsV0FBVyxDQXF1Q3ZCO0lBQUQsa0JBQUM7Q0FBQSxBQXJ1Q0QsSUFxdUNDO1NBcnVDWSxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIFF1ZXJ5TGlzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0b0dyaWRBcGkgfSBmcm9tICcuLi9ncmlkLWNvbnRyb2xsZXIvZ3JpZC1jb250cm9sbGVyLnR5cGVzJztcbmltcG9ydCB7XG4gIENlbGxDbGFzc1BhcmFtcyxcbiAgQ29sR3JvdXBEZWYsXG4gIENvbHVtbixcbiAgRWRpdGFibGVDYWxsYmFja1BhcmFtcyxcbiAgR2V0Q29udGV4dE1lbnVJdGVtc1BhcmFtcyxcbiAgR3JpZE9wdGlvbnMsXG4gIElDZWxsUmVuZGVyZXJQYXJhbXMsXG4gIElHZXRSb3dzUGFyYW1zLFxuICBSb3dEYXRhVHJhbnNhY3Rpb24sXG4gIFJvd05vZGUsXG4gIFJvd05vZGVUcmFuc2FjdGlvbixcbiAgUm93U2VsZWN0ZWRFdmVudFxufSBmcm9tICdAYWctZ3JpZC1jb21tdW5pdHkvY29yZSc7XG5pbXBvcnQgeyBHcmlkUXVlcnkgfSBmcm9tICcuL2dyaWQucXVlcnknO1xuaW1wb3J0IHsgRGF0b0NvcmVFcnJvciB9IGZyb20gJy4uLy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBEYXRvVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RyYW5zbGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IERhdG9DdXN0b21IZWFkZXJUZW1wbGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uL2dyaWQtY3VzdG9tLWhlYWRlci9jdXN0b20taGVhZGVyLXRlbXBsYXRlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgRGF0b0ZpbHRlckNvbmRpdGlvbnMsXG4gIERhdG9HcmlkQ29uZGl0aW9uYWxGaWx0ZXIsXG4gIERhdG9HcmlkRXh0ZXJuYWxGaWx0ZXIsXG4gIERhdG9HcmlkRmlsdGVyLFxuICBEYXRvR3JpZEZpbHRlckNvbmRpdGlvbixcbiAgRGF0b0dyaWRGaWx0ZXJTZWN0aW9ucyxcbiAgRGF0b0dyaWRGaWx0ZXJzTWFwLFxuICBEYXRvR3JpZFJhbmdlRmlsdGVyQ29uZGl0aW9uLFxuICBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkNvbmRpdGlvbixcbiAgU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIsXG4gIFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVycyxcbiAgU2VydmVyU2lkZVBhZ2luYXRpb25MaXN0Q29uZGl0aW9uLFxuICBTZXJ2ZXJTaWRlUGFnaW5hdGlvblJhbmdlQ29uZGl0aW9uXG59IGZyb20gJy4uL2dyaWQtZmlsdGVyL2dyaWQtZmlsdGVyLnR5cGVzJztcbmltcG9ydCB7IGNvZXJjZUFycmF5IH0gZnJvbSAnLi4vLi4vdXRpbHMvY29lcmNpb24nO1xuaW1wb3J0IHsgaXNFbXB0eSwgaXNGdW5jdGlvbiwgaXNOaWwsIGlzU3RyaW5nIH0gZnJvbSAnLi4vLi4vdXRpbHMvdmFsaWRhdG9ycyc7XG5pbXBvcnQgeyB2YWxpZGF0ZUZpbHRlciB9IGZyb20gJy4uL2dyaWQtZmlsdGVyL2ZpbHRlci12YWxpZGF0b3InO1xuaW1wb3J0IHsgQWdHcmlkQW5ndWxhciB9IGZyb20gJ0BhZy1ncmlkLWNvbW11bml0eS9hbmd1bGFyJztcbmltcG9ydCB7IEljb25SZWdpc3RyeSwgU3ZnUmVnaXN0cnkgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9pY29uLXJlZ2lzdHJ5JztcbmltcG9ydCB7IGdldFZpc2libGVBY3Rpb25zLCB0b29sYmFyQWN0aW9uVG9Db250ZXh0QWN0aW9uIH0gZnJvbSAnLi4vZ3JpZC12Mi51dGlsJztcbmltcG9ydCB7XG4gIERhdG9HcmlkU2V0dGluZ3MsXG4gIE5vcm1hbGl6ZU9wdGlvbnNQYXJhbXMsXG4gIFBpdm90Q29sdW1uRGF0YSxcbiAgU2VydmVyU2lkZVBhZ2luYXRpb25Db25maWcsXG4gIFN1Y2Nlc3NXcmFwcGVyUGFyYW1zXG59IGZyb20gJy4vZ3JpZC5zdG9yZS50eXBlcyc7XG5pbXBvcnQgeyBSb3dBY3Rpb24gfSBmcm9tICcuLi9ncmlkLXRvb2xiYXIvZ3JpZC10b29sYmFyLnR5cGVzJztcbmltcG9ydCB7IHdyaXRlVG9DbGlwYm9hcmQgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2NsaXBib2FyZC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgR3JpZFN0b3JlIH0gZnJvbSAnLi9ncmlkLnN0b3JlJztcbmltcG9ydCB7IERBVE9fR1JJRF9TVE9SQUdFX0FQSSwgR3JpZFN0b3JhZ2VBUEkgfSBmcm9tICcuLi9ncmlkLXNldHRpbmdzJztcbmltcG9ydCB7XG4gIEFjdGlvbkNvbnZlcnRlclBhcmFtcyxcbiAgRGF0b0dyaWRBbGlnbm1lbnQsXG4gIERhdG9HcmlkQ29sdW1uRGVmLFxuICBEYXRvR3JpZENvbHVtblR5cGVzLFxuICBEYXRvR3JpZEdldFJvd3NQYXJhbXMsXG4gIERhdG9HcmlkT3B0aW9ucyxcbiAgRGF0b0dyaWRTZXJ2ZXJTb3J0LFxuICBEYXRvR3JpZFNlcnZlclNvcnREaXJlY3Rpb24sXG4gIERhdG9HcmlkU29ydCxcbiAgRGF0b0dyaWRUcmVlQ29uZmlnLFxuICBlZGl0YWJsZUNlbGxSZW5kZXJlcldpdGhTZWFyY2hIaWdobGlnaHQsXG4gIEdyaWRNaW5XaWR0aHMsXG4gIEdyaWRSb3dTZWxlY3Rpb25UeXBlLFxuICBzZWFyY2hIaWdobGlnaHRDZWxsUmVuZGVyZXJcbn0gZnJvbSAnLi4vZ3JpZC9ncmlkLXYyLnR5cGVzJztcblxuaW1wb3J0IHsgY29udmVydFRvVHJlZURhdGEsIGRlZmF1bHRHcmlkT3B0aW9ucywgZGVmYXVsdEdyaWRUcmVlTGFiZWwgfSBmcm9tICcuLi9ncmlkL2dyaWQtdjIuY29uZmlnJztcbmltcG9ydCB7IGRpZmYgfSBmcm9tICcuLi8uLi91dGlscy9vYmplY3QnO1xuaW1wb3J0IHsgdW50aWxEZXN0cm95ZWQgfSBmcm9tICduZ3gtdGFrZS11bnRpbC1kZXN0cm95JztcbmltcG9ydCB7IENvcmVFdmVudExvZ2dlciwgQ29yZUV2ZW50VHlwZXMsIERBVE9fQ09SRV9MT0dHRVIgfSBmcm9tICcuLi8uLi9ldmVudC1sb2dnZXInO1xuaW1wb3J0IHsgSGFzaE1hcCB9IGZyb20gJy4uLy4uL3V0aWxzL3R5cGVzJztcbmltcG9ydCB7IHNpemUgfSBmcm9tICcuLi8uLi91dGlscy9jb2xsZWN0aW9uJztcbmltcG9ydCB7IE9wZXJhdG9yVHlwZXMgfSBmcm9tICcuLi8uLi9vcGVyYXRvci10b2dnbGVyL29wZXJhdG9yLXRvZ2dsZXIudHlwZXMnO1xuaW1wb3J0IHsgZGVlcG1lcmdlIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvZGVlcC1tZXJnZSc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0cmlnZ2VyV2luZG93UmVzaXplIH0gZnJvbSAnLi4vLi4vdXRpbHMvdXNlci1hZ2VudCc7XG5pbXBvcnQgeyBnZXRDb2xGaWVsZCwgZ2V0Q29sdW1uc1NpemVzLCBpc0h0bWxBbGxvd2VkRm9yQ29sLCB0cnlQYXJzZVBpdm90VmFsdWUgfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHsgRGF0b0dyaWRNdWx0aVNlbGVjdENvbHVtbkhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4uL2dyaWQtY29sdW1uLWhlYWRlci9ncmlkLW11bHRpLXNlbGVjdC1oZWFkZXIvZ3JpZC1tdWx0aS1zZWxlY3QtaGVhZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBhcHBseVNvcnRNb2RlbCB9IGZyb20gJy4uLy4uL2dyaWQvZ3JpZC1zb3J0LnV0aWxzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEdyaWRTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgYXBpOiBEYXRvR3JpZEFwaTtcbiAgdHJlZUNvbmZpZzogRGF0b0dyaWRUcmVlQ29uZmlnID0gZGVmYXVsdEdyaWRUcmVlTGFiZWw7XG4gIGlzUGl2b3RNb2RlOiBib29sZWFuO1xuXG4gIC8qKiBAaW50ZXJuYWwgLSB1c2VkIGZvciBzZXJ2ZXIgc2lkZSBieSB2YWx1ZSBmaWx0ZXIgKi9cbiAgX29yaWdpbmFsR2V0Um93czogKHBhcmFtczogRGF0b0dyaWRHZXRSb3dzUGFyYW1zKSA9PiB2b2lkO1xuICBwcml2YXRlIGluaXRpYWxTZXR0aW5nczogRGF0b0dyaWRTZXR0aW5ncztcbiAgcHJpdmF0ZSBncmlkTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIGdyaWRSZWY6IEFnR3JpZEFuZ3VsYXI7XG4gIHByaXZhdGUgY3VzdG9tSGVhZGVyc1RlbXBsYXRlczogUXVlcnlMaXN0PERhdG9DdXN0b21IZWFkZXJUZW1wbGF0ZUNvbXBvbmVudD47XG4gIHByaXZhdGUgaXNUcmVlRGF0YTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBwYWdlTnVtYmVyVG9SZXR1cm5BZnRlclJlZnJlc2ggPSAtMTtcbiAgcHJpdmF0ZSBsYXN0VG90YWxSb3dzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVsb2FkR3JpZEFjdGlvbnNTdWJqZWN0ID0gbmV3IFN1YmplY3QoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IENIRUNLQk9YX1NFTEVDVElPTl9DT0xfSUQgPSAnZ3JpZC1jaGVja2JveC1zZWxlY3Rpb24nO1xuXG4gIHNldCB0cmVlRGF0YShpc1RyZWVEYXRhOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc1RyZWVEYXRhID0gaXNUcmVlRGF0YTtcbiAgfVxuXG4gIGdldCB0cmVlRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyZWVEYXRhO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzdG9yZTogR3JpZFN0b3JlLFxuICAgIHByaXZhdGUgZ3JpZFF1ZXJ5OiBHcmlkUXVlcnksXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IERhdG9UcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgaWNvblJlZ2lzdHJ5OiBJY29uUmVnaXN0cnksXG4gICAgcHJpdmF0ZSBzdmdSZWdpc3RyeTogU3ZnUmVnaXN0cnksXG4gICAgQEluamVjdChEQVRPX0dSSURfU1RPUkFHRV9BUEkpIHByaXZhdGUgc3RvcmFnZUFQSTogR3JpZFN0b3JhZ2VBUEksXG4gICAgQEluamVjdChEQVRPX0NPUkVfTE9HR0VSKSBwcml2YXRlIGxvZ2dlcjogQ29yZUV2ZW50TG9nZ2VyXG4gICkge31cblxuICBuZ09uRGVzdHJveSgpIHt9XG5cbiAgLyoqIEBpbnRlcm5hbCAtIHVzZWQgdG8gaW5pdCB0aGUgc2VydmljZSAqL1xuICBfc2V0QXBpKGFwaTogRGF0b0dyaWRBcGksIGdyaWRSZWY6IEFnR3JpZEFuZ3VsYXIpIHtcbiAgICB0aGlzLmFwaSA9IGFwaTtcbiAgICB0aGlzLmdyaWRSZWYgPSBncmlkUmVmO1xuICAgIHRoaXMuZ3JpZE5hbWUgPSAoZ3JpZFJlZi5ncmlkT3B0aW9ucyBhcyBEYXRvR3JpZE9wdGlvbnMpLmdyaWROYW1lO1xuICAgIHRoaXMuc2V0U2VydmVyU2lkZVBhZ2luYXRpb24oe1xuICAgICAgZW5hYmxlZDogdGhpcy5pc1NlcnZlclNpZGVQYWdpbmF0aW9uKGdyaWRSZWYuZ3JpZE9wdGlvbnMpXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGlzU2VydmVyU2lkZVBhZ2luYXRpb24oZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb25zKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdyaWRPcHRpb25zLnJvd01vZGVsVHlwZSA9PT0gJ2luZmluaXRlJztcbiAgfVxuXG4gIHVwZGF0ZUdyaWRDb250ZXh0KGNvbnRleHQgPSB7fSwgcmVwbGFjZSA9IGZhbHNlKSB7XG4gICAgdGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKS5jb250ZXh0ID0gcmVwbGFjZVxuICAgICAgPyBjb250ZXh0XG4gICAgICA6IGRlZXBtZXJnZSh0aGlzLmdyaWRSZWYuZ3JpZE9wdGlvbnMuY29udGV4dCB8fCB7fSwgY29udGV4dCk7XG4gIH1cblxuICByZWxvYWRHcmlkQWN0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLnJlbG9hZEdyaWRBY3Rpb25zU3ViamVjdC5uZXh0KCk7XG4gIH1cblxuICBvblJlbG9hZEdyaWRBY3Rpb25zKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucmVsb2FkR3JpZEFjdGlvbnNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBzZWxlY3RSb3dzIGluc3RlYWRcbiAgICogQHBhcmFtIHJvd1xuICAgKi9cbiAgc2V0U2VsZWN0ZWRSb3dzPFQ+KHJvdzogKFQgJiBSb3dOb2RlKSB8IChUW10gJiBSb3dOb2RlW10pKSB7XG4gICAgdGhpcy5zZWxlY3RSb3dzKHJvdyk7XG4gIH1cblxuICBzZWxlY3RSb3dzPFQ+KHJvdzogKFQgJiBSb3dOb2RlKSB8IChUW10gJiBSb3dOb2RlW10pKSB7XG4gICAgY29uc3Qgcm93Tm9kZXMgPSBjb2VyY2VBcnJheShyb3cpLmZpbHRlcihyb3dOb2RlID0+ICFyb3dOb2RlLmlzU2VsZWN0ZWQoKSk7XG4gICAgY29uc3QgbGFzdE5vZGUgPSByb3dOb2Rlcy5wb3AoKTtcbiAgICByb3dOb2Rlcy5mb3JFYWNoKHJvd05vZGUgPT4gcm93Tm9kZS5zZXRTZWxlY3RlZCh0cnVlLCBmYWxzZSwgdHJ1ZSkpO1xuICAgIGlmIChsYXN0Tm9kZSkge1xuICAgICAgbGFzdE5vZGUuc2V0U2VsZWN0ZWQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgZGVzZWxlY3RSb3dzPFQ+KHJvdzogKFQgJiBSb3dOb2RlKSB8IChUW10gJiBSb3dOb2RlW10pKSB7XG4gICAgY29uc3Qgcm93Tm9kZXMgPSBjb2VyY2VBcnJheShyb3cpLmZpbHRlcihyb3dOb2RlID0+IHJvd05vZGUuaXNTZWxlY3RlZCgpKTtcbiAgICBjb25zdCBsYXN0Tm9kZSA9IHJvd05vZGVzLnBvcCgpO1xuICAgIHJvd05vZGVzLmZvckVhY2gocm93Tm9kZSA9PiByb3dOb2RlLnNldFNlbGVjdGVkKGZhbHNlLCBmYWxzZSwgdHJ1ZSkpO1xuICAgIGlmIChsYXN0Tm9kZSkge1xuICAgICAgbGFzdE5vZGUuc2V0U2VsZWN0ZWQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIHNldFJvd3M8VD4oZGF0YTogVFtdLCBmaXRDb250YWluZXIgPSBmYWxzZSwgdHJlZUNvbmZpZzogUGFydGlhbDxEYXRvR3JpZFRyZWVDb25maWc+ID0ge30pIHtcbiAgICB0aGlzLmdyaWRRdWVyeS5ncmlkUmVhZHkkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzVHJlZURhdGEpIHtcbiAgICAgICAgdGhpcy50cmVlQ29uZmlnID0ge1xuICAgICAgICAgIC4uLmRlZmF1bHRHcmlkVHJlZUxhYmVsLFxuICAgICAgICAgIC4uLnRyZWVDb25maWdcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdHJlZURhdGUgPSBjb252ZXJ0VG9UcmVlRGF0YShkYXRhLCB0aGlzLnRyZWVDb25maWcpO1xuICAgICAgICB0aGlzLmFwaS5ncmlkLnNldFJvd0RhdGEodHJlZURhdGUpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzUGl2b3RNb2RlKSB7XG4gICAgICAgIHRoaXMuc2V0UGl2b3RNb2RlUm93czxUPihkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYXBpLmdyaWQuc2V0Um93RGF0YShkYXRhKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaXRDb250YWluZXIpIHtcbiAgICAgICAgdGhpcy5maXRHcmlkKCdjb250YWluZXInKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaWdnZXJXaW5kb3dSZXNpemUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldERhdGFzb3VyY2UoZ2V0Um93czogKHBhcmFtczogRGF0b0dyaWRHZXRSb3dzUGFyYW1zKSA9PiB2b2lkLCByZXR1cm5Ub0N1cnJlbnRQYWdlID0gZmFsc2UsIHNob3dMb2FkaW5nID0gZmFsc2UpIHtcbiAgICByZXR1cm5Ub0N1cnJlbnRQYWdlICYmIHRoaXMudXBkYXRlUGFnZVRvS2VlcE9uUmVmcmVzaFNlcnZlckRhdGEoKTtcbiAgICBzaG93TG9hZGluZyAmJiB0aGlzLnNldExvYWRpbmcodHJ1ZSk7XG4gICAgdGhpcy5fb3JpZ2luYWxHZXRSb3dzID0gZ2V0Um93cztcbiAgICB0aGlzLmFwaS5ncmlkLnNldERhdGFzb3VyY2UoeyBnZXRSb3dzOiB0aGlzLndyYXBHZXRSb3dzKHRoaXMuZ3JpZFF1ZXJ5LmdldEdyaWRPcHRpb25zKCksIGdldFJvd3MpIH0pO1xuICB9XG5cbiAgcmVmcmVzaFNlcnZlckRhdGEoa2VlcEN1cnJlbnRQYWdlID0gZmFsc2UsIHNob3dMb2FkaW5nID0gZmFsc2UpIHtcbiAgICBrZWVwQ3VycmVudFBhZ2UgJiYgdGhpcy51cGRhdGVQYWdlVG9LZWVwT25SZWZyZXNoU2VydmVyRGF0YSgpO1xuICAgIHNob3dMb2FkaW5nICYmIHRoaXMuc2V0TG9hZGluZyh0cnVlKTtcbiAgICB0aGlzLmFwaS5ncmlkLnNldERhdGFzb3VyY2UoeyBnZXRSb3dzOiB0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpLmRhdGFzb3VyY2UuZ2V0Um93cyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUGFnZVRvS2VlcE9uUmVmcmVzaFNlcnZlckRhdGEoKSB7XG4gICAgLy8gS2VlcGluZyB0aGUgY3VycmVudCBwYWdlIG9uIHNlcnZlciByZWZyZXNoIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgb25seSB3aGVuIG5vIHBhZ2UgY2xpZW50IGNhY2hpbmcgaXMgZW5hYmxlZFxuICAgIGlmICh0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpLm1heEJsb2Nrc0luQ2FjaGUgPT09IDEpIHtcbiAgICAgIHRoaXMucGFnZU51bWJlclRvUmV0dXJuQWZ0ZXJSZWZyZXNoID0gdGhpcy5hcGkuZ3JpZC5wYWdpbmF0aW9uR2V0Q3VycmVudFBhZ2UoKTtcbiAgICB9XG4gIH1cblxuICBhZGRSb3dzPFQ+KHJvdzogVCwgaW5kZXg/OiBudW1iZXIpOiBSb3dOb2RlVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IHJvd3MgPSBjb2VyY2VBcnJheShyb3cpO1xuICAgIGNvbnN0IGRhdGE6IFJvd0RhdGFUcmFuc2FjdGlvbiA9IHsgYWRkOiByb3dzIH07XG4gICAgaWYgKCFpc05pbChpbmRleCkpIHtcbiAgICAgIGRhdGEuYWRkSW5kZXggPSBpbmRleDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYXBpLmdyaWQudXBkYXRlUm93RGF0YShkYXRhKTtcbiAgfVxuXG4gIHVwZGF0ZVJvd3M8VD4ocm93OiBUW10pOiBhbnkge1xuICAgIGNvbnN0IHJvd3MgPSBjb2VyY2VBcnJheShyb3cpO1xuICAgIHJldHVybiB0aGlzLmFwaS5ncmlkLnVwZGF0ZVJvd0RhdGEoeyB1cGRhdGU6IHJvd3MgfSk7XG4gIH1cblxuICB1cGRhdGVSb3dWYWx1ZTxUPihyb3c6IFJvd05vZGUsIGtleTogc3RyaW5nLCBuZXdWYWx1ZTogVCk7XG4gIHVwZGF0ZVJvd1ZhbHVlPFQ+KGlkOiBzdHJpbmcsIGtleTogc3RyaW5nLCBuZXdWYWx1ZTogVCk7XG4gIHVwZGF0ZVJvd1ZhbHVlPFQ+KHJvdzogc3RyaW5nIHwgUm93Tm9kZSwga2V5OiBzdHJpbmcsIG5ld1ZhbHVlOiBUKSB7XG4gICAgY29uc3Qgcm93Tm9kZSA9IGlzU3RyaW5nKHJvdykgPyB0aGlzLmFwaS5ncmlkLmdldFJvd05vZGUocm93KSA6IHJvdztcbiAgICByb3dOb2RlLnNldERhdGFWYWx1ZShrZXksIG5ld1ZhbHVlKTtcbiAgfVxuXG4gIHJlbW92ZVJvd3Mocm93OiBSb3dOb2RlIHwgUm93Tm9kZVtdKTogUm93Tm9kZVRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCByb3dzID0gY29lcmNlQXJyYXkocm93KS5tYXAoKHsgZGF0YSB9KSA9PiBkYXRhKTtcbiAgICByZXR1cm4gdGhpcy5hcGkuZ3JpZC51cGRhdGVSb3dEYXRhKHsgcmVtb3ZlOiByb3dzIH0pO1xuICB9XG5cbiAgcmVtb3ZlU2VsZWN0ZWRSb3dzKCkge1xuICAgIGNvbnN0IHNlbGVjdGVkUm93cyA9IHRoaXMuZ3JpZFF1ZXJ5LmdldFNlbGVjdGVkUm93Tm9kZXMoKTtcbiAgICByZXR1cm4gdGhpcy5yZW1vdmVSb3dzKHNlbGVjdGVkUm93cyk7XG4gIH1cblxuICBjbGVhclRhYmxlKCkge1xuICAgIHRoaXMuc2V0Um93cyhbXSk7XG4gIH1cblxuICB1cGRhdGVDb2x1bW5zKGNvbERlZnM6IERhdG9HcmlkQ29sdW1uRGVmIHwgRGF0b0dyaWRDb2x1bW5EZWZbXSwgcmVsb2FkU2V0dGluZ3MgPSBmYWxzZSkge1xuICAgIGlmICghY29sRGVmcykge1xuICAgICAgdGhyb3cgbmV3IERhdG9Db3JlRXJyb3IoJ05vIGNvbHVtbkRlZnMgd2VyZSBwcm92aWRlZC4g8J+VtfCfj7vigI3imYDvuI8nKTtcbiAgICB9XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHRoaXMubm9ybWFsaXplQ29sdW1ucyhjb2VyY2VBcnJheShjb2xEZWZzKSk7XG4gICAgY29uc3Qgc2F2ZWRTZXR0aW5ncyA9IHJlbG9hZFNldHRpbmdzICYmIHRoaXMuZ3JpZFF1ZXJ5LmdldEN1cnJlbnRHcmlkU2V0dGluZ3MoKTtcbiAgICB0aGlzLmFwaS5ncmlkLnNldENvbHVtbkRlZnMobm9ybWFsaXplZCk7XG4gICAgaWYgKHNhdmVkU2V0dGluZ3MpIHtcbiAgICAgIHRoaXMubG9hZFNhdmVkU2V0dGluZ3Moc2F2ZWRTZXR0aW5ncyk7XG4gICAgfVxuICB9XG5cbiAgaW5pdEdyaWRPcHRpb25zKGdyaWRPcHRpb25zOiBEYXRvR3JpZE9wdGlvbnMpIHtcbiAgICBsZXQgb3B0aW9ucyA9IHtcbiAgICAgIC4uLmdyaWRPcHRpb25zXG4gICAgfTtcblxuICAgIGlmICh0eXBlb2YgZ3JpZE9wdGlvbnMuZW5hYmxlU2VhcmNoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgb3B0aW9ucy5lbmFibGVTZWFyY2ggPSBvcHRpb25zLmVuYWJsZVYyXzE7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZ3JpZE9wdGlvbnMuZW5hYmxlQmFja2dyb3VuZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIG9wdGlvbnMuZW5hYmxlQmFja2dyb3VuZCA9IG9wdGlvbnMuZW5hYmxlVjJfMTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBncmlkT3B0aW9ucy5zaG93TXVsdGlTZWxlY3Rpb25DaGVja2JveGVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgb3B0aW9ucy5zaG93TXVsdGlTZWxlY3Rpb25DaGVja2JveGVzID1cbiAgICAgICAgZ3JpZE9wdGlvbnMuZW5hYmxlVjJfMSAmJiBvcHRpb25zLnJvd1NlbGVjdGlvbiAhPT0gR3JpZFJvd1NlbGVjdGlvblR5cGUuU0lOR0xFO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGdyaWRPcHRpb25zLmVuYWJsZVNlYXJjaEhpZ2hsaWdodCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIG9wdGlvbnMuZW5hYmxlU2VhcmNoSGlnaGxpZ2h0ID0gb3B0aW9ucy5lbmFibGVTZWFyY2ggJiYgZGVmYXVsdEdyaWRPcHRpb25zLmVuYWJsZVNlYXJjaEhpZ2hsaWdodDtcbiAgICB9XG5cbiAgICBpZiAoZ3JpZE9wdGlvbnMudXNlUGl2b3RHcmlkU3R5bGUpIHtcbiAgICAgIGNvbnN0IHJvd0hlaWdodCA9IDMwO1xuXG4gICAgICBvcHRpb25zLnJvd0hlaWdodCA9IHJvd0hlaWdodDtcbiAgICAgIG9wdGlvbnMuZGVmYXVsdENvbERlZiA9IHtcbiAgICAgICAgLi4ub3B0aW9ucy5kZWZhdWx0Q29sRGVmLFxuICAgICAgICBjZWxsQ2xhc3NSdWxlczogdGhpcy5nZXRQaXZvdE1vZGVDZWxsQ2xhc3NSdWxlcygpLFxuICAgICAgICBoZWFkZXJDbGFzczogdGhpcy5nZXRQaXZvdEhlYWRlckNsYXNzLmJpbmQodGhpcyksXG4gICAgICAgIGNlbGxTdHlsZTogcGFyYW1zID0+IHtcbiAgICAgICAgICBjb25zdCBzdHlsZTogYW55ID0geyBsaW5lSGVpZ2h0OiBgJHtyb3dIZWlnaHR9cHhgIH07XG5cbiAgICAgICAgICBpZiAocGFyYW1zLmNvbERlZi50eXBlID09PSBEYXRvR3JpZENvbHVtblR5cGVzLk51bWJlcikge1xuICAgICAgICAgICAgc3R5bGUudGV4dEFsaWduID0gJ2VuZCc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBvcHRpb25zLmF1dG9Hcm91cENvbHVtbkRlZiA9IHtcbiAgICAgICAgLi4ub3B0aW9ucy5hdXRvR3JvdXBDb2x1bW5EZWYsXG4gICAgICAgIGNlbGxDbGFzc1J1bGVzOiB0aGlzLmdldFBpdm90TW9kZUNlbGxDbGFzc1J1bGVzKCksXG4gICAgICAgIGhlYWRlckNsYXNzOiB0aGlzLmdldFBpdm90SGVhZGVyQ2xhc3MuYmluZCh0aGlzKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfVxuXG4gIG5vcm1hbGl6ZU9wdGlvbnMocGFyYW1zOiBOb3JtYWxpemVPcHRpb25zUGFyYW1zKSB7XG4gICAgdGhpcy5jdXN0b21IZWFkZXJzVGVtcGxhdGVzID0gcGFyYW1zLmN1c3RvbUhlYWRlcnNUZW1wbGF0ZXM7XG4gICAgY29uc3QgaGVhZGVyQ29tcG9uZW50UGFyYW1zID0geyBncmlkU2VydmljZTogdGhpcywgZ3JpZFF1ZXJ5OiB0aGlzLmdyaWRRdWVyeSB9O1xuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5hdXRvR3JvdXBDb2x1bW5EZWYgPSB7XG4gICAgICAuLi5oZWFkZXJDb21wb25lbnRQYXJhbXMsXG4gICAgICAuLi5wYXJhbXMuZ3JpZE9wdGlvbnMuYXV0b0dyb3VwQ29sdW1uRGVmXG4gICAgfTtcblxuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5kZWZhdWx0Q29sRGVmID0ge1xuICAgICAgLi4ucGFyYW1zLmdyaWRPcHRpb25zLmRlZmF1bHRDb2xEZWYsXG4gICAgICBoZWFkZXJDb21wb25lbnRQYXJhbXNcbiAgICB9O1xuXG4gICAgcGFyYW1zLmdyaWRPcHRpb25zLmNvbHVtbkRlZnMgPSB0aGlzLm5vcm1hbGl6ZUNvbHVtbnMocGFyYW1zLmdyaWRPcHRpb25zLmNvbHVtbkRlZnMsIHBhcmFtcy5ncmlkT3B0aW9ucyk7XG5cbiAgICAvKiogQWRkIGNvcmUgZmlsdGVycyAqL1xuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5pc0V4dGVybmFsRmlsdGVyUHJlc2VudCA9ICgpID0+IHRydWU7XG4gICAgcGFyYW1zLmdyaWRPcHRpb25zLmRvZXNFeHRlcm5hbEZpbHRlclBhc3MgPSAocm93OiBSb3dOb2RlKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB2YWxpZGF0ZUZpbHRlcih7IHJvdywgYXBpOiB0aGlzLmdyaWRRdWVyeS5hcGkuZ3JpZCB9LCB0aGlzLmdyaWRRdWVyeS5nZXRGaWx0ZXIoKSkgJiYgdGhpcy5yb3dNYXRjaGVzU2VhcmNoKHJvdylcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8qKiBXcmFwIHRoZSBzZXJ2ZXIgc2lkZSBwYWdpbmF0aW9uIGdldCByb3dzIGZ1bmN0aW9uICovXG4gICAgaWYgKHRoaXMuaXNTZXJ2ZXJTaWRlUGFnaW5hdGlvbihwYXJhbXMuZ3JpZE9wdGlvbnMpKSB7XG4gICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuYmxvY2tMb2FkRGVib3VuY2VNaWxsaXMgPSAzMDA7XG4gICAgICB0aGlzLl9vcmlnaW5hbEdldFJvd3MgPSBwYXJhbXMuZ3JpZE9wdGlvbnMuZGF0YXNvdXJjZS5nZXRSb3dzO1xuICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLmRhdGFzb3VyY2UuZ2V0Um93cyA9IHRoaXMud3JhcEdldFJvd3MocGFyYW1zLmdyaWRPcHRpb25zKTtcbiAgICAgIC8qIFRoZSBjYWNoZSBzaXplIGlzIHN5bmNlZCB3aXRoIHRoZSBwYWdpbmF0aW9uIHBhZ2Ugc2l6ZSAqL1xuICAgICAgY29uc3QgY2FjaGVTaXplID0gcGFyYW1zLmdyaWRPcHRpb25zLnBhZ2luYXRpb25QYWdlU2l6ZTtcbiAgICAgIGlmIChjYWNoZVNpemUpIHtcbiAgICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLmNhY2hlQmxvY2tTaXplID0gY2FjaGVTaXplO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBFZGl0YWJsZSBjZWxsICovXG4gICAgdGhpcy5pbml0RWRpdGFibGVDb2x1bW5zQ2VsbENsYXNzKHBhcmFtcyk7XG5cbiAgICAvKiogV3JhcCBjb250ZXh0IG1lbnUgKi9cbiAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuZ2V0Q29udGV4dE1lbnVJdGVtcyA9IHRoaXMud3JhcENvbnRleHRNZW51QnVpbGRlcihwYXJhbXMpO1xuXG4gICAgLyoqIFNhdmUgZ3JpZCBzZXR0aW5ncyAqL1xuICAgIGNvbnN0IHsgc2F2ZVNldHRpbmdzLCBncmlkTmFtZSB9ID0gcGFyYW1zLmdyaWRPcHRpb25zO1xuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5zYXZlU2V0dGluZ3MgPSBzYXZlU2V0dGluZ3MgIT09IGZhbHNlICYmICFpc05pbChncmlkTmFtZSk7XG5cbiAgICAvKiogU2VydmVyIFNpZGUgUGFnaW5hdGlvbiBmb3Igc2VsZWN0IGFsbCBvcHRpb24gKi9cbiAgICB0aGlzLmluaXRPblJvd1NlbGVjdGVkRm9yU2VydmVyU2lkZVBhZ2luYXRpb24ocGFyYW1zKTtcblxuICAgIC8qKiBBZGQgdHJlZSBncmlkIHNwZWNpZmljIHJlcXVpcmVkIHNldHRpbmdzICovXG4gICAgaWYgKHRoaXMuaXNUcmVlRGF0YSkge1xuICAgICAgY29uc3QgaW5wdXRSb3dDbGFzc1J1bGVzID0gcGFyYW1zLmdyaWRPcHRpb25zLnJvd0NsYXNzUnVsZXM7XG5cbiAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5yb3dDbGFzc1J1bGVzID0ge1xuICAgICAgICAuLi5pbnB1dFJvd0NsYXNzUnVsZXMsXG4gICAgICAgICdhZy1lbXB0eS1mb2xkZXInOiBwYXJhbXMgPT4ge1xuICAgICAgICAgIHJldHVybiBwYXJhbXMuZGF0YS5pc0ZvbGRlciAmJiBzaXplKHBhcmFtcy5ub2RlLmNoaWxkcmVuQWZ0ZXJHcm91cCkgPT09IDA7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqIEFkZCBwaXZvdCBzcGVjaWZpYyByZXF1aXJlZCBzZXR0aW5ncyAqL1xuICAgIGlmICh0aGlzLmlzUGl2b3RNb2RlKSB7XG4gICAgICB0aGlzLmluaXRQaXZvdFNlY29uZGFyeUNvbHNQcm9jZXNzKHBhcmFtcyk7XG4gICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuc2F2ZVNldHRpbmdzID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcy5ncmlkT3B0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGl2b3RIZWFkZXJDbGFzcyhwYXJhbXMpIHtcbiAgICBjb25zdCBncmlkUXVlcnkgPSBwYXJhbXMuY29sRGVmLmhlYWRlckNvbXBvbmVudFBhcmFtcy5ncmlkUXVlcnk7XG4gICAgbGV0IGNlbGxDbGFzcyA9ICcnO1xuXG4gICAgaWYgKGdyaWRRdWVyeSAmJiBncmlkUXVlcnkuYXBpKSB7XG4gICAgICBjb25zdCB7IGNvbHVtbnMgfSA9IGdyaWRRdWVyeS5hcGkgYXMgRGF0b0dyaWRBcGk7XG4gICAgICAvKiogVXNlIGdldFBpdm90UmVzdWx0Q29sdW1ucyBmcm9tIHZlciAyOCAqL1xuICAgICAgY29uc3QgcGl2b3RDb2x1bW5zID0gY29sdW1ucy5nZXRTZWNvbmRhcnlDb2x1bW5zKCk7XG5cbiAgICAgIGlmIChwaXZvdENvbHVtbnMgJiYgcGl2b3RDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY2VsbENsYXNzICs9ICd0b3AtYm9yZGVyJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2VsbENsYXNzO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVDb2x1bW5zKGNvbERlZnM6IERhdG9HcmlkQ29sdW1uRGVmW10sIGdyaWRPcHRpb25zOiBEYXRvR3JpZE9wdGlvbnMgPSBudWxsKTogRGF0b0dyaWRDb2x1bW5EZWZbXSB7XG4gICAgaWYgKCFncmlkT3B0aW9ucykge1xuICAgICAgZ3JpZE9wdGlvbnMgPSB0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpO1xuICAgIH1cbiAgICBjb25zdCB1cGRhdGVkQ29sRGVmcyA9IGNvbERlZnMubWFwKChjb2w6IERhdG9HcmlkQ29sdW1uRGVmKSA9PiB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0ge1xuICAgICAgICAuLi5jb2wsXG4gICAgICAgIGhlYWRlck5hbWU6IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShjb2wuaGVhZGVyTmFtZSlcbiAgICAgIH07XG4gICAgICAvKiogQWRqdXN0IHRoZSB3aWR0aCBpbiBjYXNlIHRoZSBjb2x1bW4gaGFzIGluZm8gKi9cbiAgICAgIGlmIChjb2wuaW5mbykge1xuICAgICAgICBub3JtYWxpemVkLm1pbldpZHRoID0gY29sLm1pbldpZHRoIHx8IEdyaWRNaW5XaWR0aHMuV2l0aF9JbmZvO1xuICAgICAgfVxuICAgICAgaWYgKCFjb2wuY29sSWQpIHtcbiAgICAgICAgbm9ybWFsaXplZC5jb2xJZCA9IGNvbC5maWVsZDtcbiAgICAgIH1cbiAgICAgIGlmIChub3JtYWxpemVkLnR5cGUgPT09IERhdG9HcmlkQ29sdW1uVHlwZXMuSXRlbXMgJiYgIW5vcm1hbGl6ZWQuZmlsdGVyc0NvbmZpZykge1xuICAgICAgICBub3JtYWxpemVkLmZpbHRlcnNDb25maWcgPSB7IHNlY3Rpb25zOiBEYXRvR3JpZEZpbHRlclNlY3Rpb25zLkNvbmRpdGlvbmFsIH07XG4gICAgICB9XG4gICAgICB0aGlzLm5vcm1hbGl6ZUNvbHVtblNlYXJjaENvbmZpZyhncmlkT3B0aW9ucywgY29sLCBub3JtYWxpemVkKTtcbiAgICAgIHJldHVybiBub3JtYWxpemVkO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYWRkTXVsdGlTZWxlY3RIZWFkZXJDb2x1bW5JZlJlcXVpcmVkKHVwZGF0ZWRDb2xEZWZzLCBncmlkT3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZUNvbHVtblNlYXJjaENvbmZpZyhcbiAgICBncmlkT3B0aW9uczogRGF0b0dyaWRPcHRpb25zLFxuICAgIGNvbDogRGF0b0dyaWRDb2x1bW5EZWYsXG4gICAgbm9ybWFsaXplZDogRGF0b0dyaWRDb2x1bW5EZWZcbiAgKSB7XG4gICAgLyoqIENoZWNrIGlmIGNvbHVtbiBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSBzZWFyY2ggKiovXG4gICAgY29uc3QgaXNTZXJ2ZXJQYWdpbmF0aW9uID0gdGhpcy5pc1NlcnZlclNpZGVQYWdpbmF0aW9uKGdyaWRPcHRpb25zKTtcbiAgICBpZiAodHlwZW9mIGNvbC5pbmNsdWRlSW5TZWFyY2ggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAoaXNTZXJ2ZXJQYWdpbmF0aW9uICYmIGNvbC50eXBlID09PSBEYXRvR3JpZENvbHVtblR5cGVzLkRhdGUpIHtcbiAgICAgICAgbm9ybWFsaXplZC5pbmNsdWRlSW5TZWFyY2ggPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vcm1hbGl6ZWQuaW5jbHVkZUluU2VhcmNoID1cbiAgICAgICAgICB0eXBlb2YgZ3JpZE9wdGlvbnMuY29sdW1uc0luY2x1ZGVkSW5TZWFyY2hCeURlZmF1bHQgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICA/IGdyaWRPcHRpb25zLmNvbHVtbnNJbmNsdWRlZEluU2VhcmNoQnlEZWZhdWx0XG4gICAgICAgICAgICA6IGRlZmF1bHRHcmlkT3B0aW9ucy5jb2x1bW5zSW5jbHVkZWRJblNlYXJjaEJ5RGVmYXVsdDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgbm9ybWFsaXplZC5pbmNsdWRlSW5TZWFyY2ggJiZcbiAgICAgICF0aGlzLmhhc0NlbGxSZW5kZXJlcihub3JtYWxpemVkLCBncmlkT3B0aW9ucykgJiZcbiAgICAgIGdyaWRPcHRpb25zLmVuYWJsZVNlYXJjaEhpZ2hsaWdodFxuICAgICkge1xuICAgICAgbm9ybWFsaXplZC5jZWxsUmVuZGVyZXIgPSAocGFyYW1zOiBJQ2VsbFJlbmRlcmVyUGFyYW1zKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsbG93SFRNTCA9IGlzSHRtbEFsbG93ZWRGb3JDb2woZ3JpZE9wdGlvbnMsIHBhcmFtcy5jb2xEZWYpO1xuICAgICAgICBjb25zdCB7IGNvbHVtbiwgY29sRGVmIH0gPSBwYXJhbXM7XG4gICAgICAgIGNvbnN0IGVkaXRhYmxlUGFyYW1zOiBFZGl0YWJsZUNhbGxiYWNrUGFyYW1zID1cbiAgICAgICAgICBjb2x1bW4gJiYgY29sRGVmXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBhcGk6IHBhcmFtcy5hcGksXG4gICAgICAgICAgICAgICAgY29sdW1uQXBpOiBwYXJhbXMuY29sdW1uQXBpLFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHBhcmFtcy5jb250ZXh0LFxuICAgICAgICAgICAgICAgIG5vZGU6IHBhcmFtcy5ub2RlLFxuICAgICAgICAgICAgICAgIGRhdGE6IHBhcmFtcy5kYXRhLFxuICAgICAgICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICAgICAgICBjb2xEZWZcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICBjb25zdCBpc0VkaXRhYmxlID0gaXNGdW5jdGlvbihub3JtYWxpemVkLmVkaXRhYmxlKVxuICAgICAgICAgID8gZWRpdGFibGVQYXJhbXMgJiYgbm9ybWFsaXplZC5lZGl0YWJsZShlZGl0YWJsZVBhcmFtcylcbiAgICAgICAgICA6IG5vcm1hbGl6ZWQuZWRpdGFibGU7XG5cbiAgICAgICAgcmV0dXJuIGlzRWRpdGFibGVcbiAgICAgICAgICA/IGVkaXRhYmxlQ2VsbFJlbmRlcmVyV2l0aFNlYXJjaEhpZ2hsaWdodChwYXJhbXMsIHRoaXMuZ3JpZFF1ZXJ5LmdldFNlYXJjaFRlcm0oKSwgYWxsb3dIVE1MKVxuICAgICAgICAgIDogc2VhcmNoSGlnaGxpZ2h0Q2VsbFJlbmRlcmVyKHBhcmFtcywgdGhpcy5ncmlkUXVlcnkuZ2V0U2VhcmNoVGVybSgpLCBhbGxvd0hUTUwpO1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhc0NlbGxSZW5kZXJlcihjb2x1bW46IERhdG9HcmlkQ29sdW1uRGVmLCBncmlkT3B0aW9uczogRGF0b0dyaWRPcHRpb25zKTogYm9vbGVhbiB7XG4gICAgaWYgKGNvbHVtbi5jZWxsUmVuZGVyZXIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCB0eXBlID0gY29sdW1uLnR5cGUgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGNvbHVtblR5cGVIYXNDZWxsUmVuZGVyZXIgPSAob3B0aW9uczogUGFydGlhbDxEYXRvR3JpZE9wdGlvbnM+KTogYm9vbGVhbiA9PlxuICAgICAgb3B0aW9ucy5jb2x1bW5UeXBlcyAmJiAhIW9wdGlvbnMuY29sdW1uVHlwZXNbdHlwZV0gJiYgISFvcHRpb25zLmNvbHVtblR5cGVzW3R5cGVdLmNlbGxSZW5kZXJlcjtcblxuICAgIHJldHVybiBjb2x1bW5UeXBlSGFzQ2VsbFJlbmRlcmVyKGdyaWRPcHRpb25zKSB8fCBjb2x1bW5UeXBlSGFzQ2VsbFJlbmRlcmVyKGRlZmF1bHRHcmlkT3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGFkZE11bHRpU2VsZWN0SGVhZGVyQ29sdW1uSWZSZXF1aXJlZChcbiAgICBjb2x1bW5EZWZzOiBEYXRvR3JpZENvbHVtbkRlZltdLFxuICAgIGdyaWRPcHRpb25zOiBEYXRvR3JpZE9wdGlvbnNcbiAgKTogRGF0b0dyaWRDb2x1bW5EZWZbXSB7XG4gICAgY29uc3Qgc2hvd011bHRpU2VsZWN0aW9uQ2hlY2tib3hlcyA9IGdyaWRPcHRpb25zICYmIGdyaWRPcHRpb25zLnNob3dNdWx0aVNlbGVjdGlvbkNoZWNrYm94ZXM7XG4gICAgY29uc3Qgcm93U2VsZWN0aW9uID1cbiAgICAgIGdyaWRPcHRpb25zICYmIGdyaWRPcHRpb25zLnJvd1NlbGVjdGlvbiA/IGdyaWRPcHRpb25zLnJvd1NlbGVjdGlvbiA6IGRlZmF1bHRHcmlkT3B0aW9ucy5yb3dTZWxlY3Rpb247XG5cbiAgICBpZiAoc2hvd011bHRpU2VsZWN0aW9uQ2hlY2tib3hlcyAmJiByb3dTZWxlY3Rpb24gPT09IEdyaWRSb3dTZWxlY3Rpb25UeXBlLk1VTFRJUExFKSB7XG4gICAgICBjb25zdCBjaGVja2JveGVzQ29sdW1uOiBEYXRvR3JpZENvbHVtbkRlZiA9IHtcbiAgICAgICAgY29sSWQ6IHRoaXMuQ0hFQ0tCT1hfU0VMRUNUSU9OX0NPTF9JRCxcbiAgICAgICAgY2hlY2tib3hTZWxlY3Rpb246IHRydWUsXG4gICAgICAgIGhlYWRlckNvbXBvbmVudEZyYW1ld29yazogRGF0b0dyaWRNdWx0aVNlbGVjdENvbHVtbkhlYWRlckNvbXBvbmVudCxcbiAgICAgICAgbWluV2lkdGg6IDI5LFxuICAgICAgICB3aWR0aDogMjksXG4gICAgICAgIG1heFdpZHRoOiAyOSxcbiAgICAgICAgc3VwcHJlc3NTaXplVG9GaXQ6IHRydWUsXG4gICAgICAgIGNlbGxDbGFzczogJ2NoZWNrYm94LXNlbGVjdGlvbi1jZWxsJyxcbiAgICAgICAgaGVhZGVyQ2xhc3M6ICdoZWFkZXItY2hlY2tib3gtc2VsZWN0aW9uLWNlbGwnLFxuICAgICAgICByZXNpemFibGU6IGZhbHNlLFxuICAgICAgICBwaW5uZWQ6ICdsZWZ0JyxcbiAgICAgICAgbG9ja1Bvc2l0aW9uOiB0cnVlLFxuICAgICAgICBpbmNsdWRlSW5TZWFyY2g6IGZhbHNlXG4gICAgICB9O1xuICAgICAgcmV0dXJuIFtjaGVja2JveGVzQ29sdW1uLCAuLi5jb2x1bW5EZWZzXTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbkRlZnM7XG4gIH1cblxuICBwcml2YXRlIGluaXRPblJvd1NlbGVjdGVkRm9yU2VydmVyU2lkZVBhZ2luYXRpb24oeyBncmlkT3B0aW9ucyB9OiBOb3JtYWxpemVPcHRpb25zUGFyYW1zKSB7XG4gICAgaWYgKCF0aGlzLmlzU2VydmVyU2lkZVBhZ2luYXRpb24oZ3JpZE9wdGlvbnMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV4dGVybmFsT25Sb3dTZWxlY3RlZCA9IGdyaWRPcHRpb25zLm9uUm93U2VsZWN0ZWQ7XG4gICAgZ3JpZE9wdGlvbnMub25Sb3dTZWxlY3RlZCA9IChldnQ6IFJvd1NlbGVjdGVkRXZlbnQpID0+IHtcbiAgICAgIGlmICh0aGlzLmdyaWRRdWVyeS5pc1NlcnZlclNlbGVjdEFsbFJvd3NFbmFibGVkKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBldnQubm9kZTtcbiAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IG5vZGUuaXNTZWxlY3RlZCgpO1xuICAgICAgICBjb25zdCB7IGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbCB9ID0gdGhpcy5ncmlkUXVlcnkuc2VydmVyU2lkZUNvbmZpZztcbiAgICAgICAgY29uc3QgaXNFeGNsdWRlZCA9IGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbC5pbmNsdWRlcyhub2RlLmlkKTtcbiAgICAgICAgaWYgKGlzU2VsZWN0ZWQgJiYgaXNFeGNsdWRlZCkge1xuICAgICAgICAgIHRoaXMuc2V0U2VydmVyU2lkZVBhZ2luYXRpb24oe1xuICAgICAgICAgICAgZXhjbHVkZWRGcm9tU2VsZWN0QWxsOiBleGNsdWRlZEZyb21TZWxlY3RBbGwuZmlsdGVyKChub2RlSWQ6IHN0cmluZykgPT4gbm9kZUlkICE9PSBub2RlLmlkKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc1NlbGVjdGVkICYmICFpc0V4Y2x1ZGVkKSB7XG4gICAgICAgICAgdGhpcy5zZXRTZXJ2ZXJTaWRlUGFnaW5hdGlvbih7IGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbDogWy4uLmV4Y2x1ZGVkRnJvbVNlbGVjdEFsbCwgbm9kZS5pZF0gfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChleHRlcm5hbE9uUm93U2VsZWN0ZWQpIHtcbiAgICAgICAgZXh0ZXJuYWxPblJvd1NlbGVjdGVkKGV2dCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcm93TWF0Y2hlc1NlYXJjaChyb3c6IFJvd05vZGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZWFyY2hUZXJtID0gKHRoaXMuZ3JpZFF1ZXJ5LmdldFNlYXJjaFRlcm0oKSB8fCAnJykudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgaWYgKGlzRW1wdHkoc2VhcmNoVGVybSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKS5pbmNsdWRlSGlkZGVuQ29sdW1uc0luU2VhcmNoXG4gICAgICA/IHRoaXMuZ3JpZFF1ZXJ5LmdldEFsbENvbHVtbnMoKVxuICAgICAgOiB0aGlzLmdyaWRRdWVyeS5nZXRBbGxEaXNwbGF5ZWRDb2x1bW5zKCk7XG4gICAgZm9yIChjb25zdCBjb2wgb2YgY29sdW1ucykge1xuICAgICAgY29uc3QgY29sRGVmID0gdGhpcy5hcGkuZ3JpZC5nZXRDb2x1bW5EZWYoY29sLmdldENvbElkKCkpIGFzIERhdG9HcmlkQ29sdW1uRGVmO1xuICAgICAgaWYgKCFjb2xEZWYuaW5jbHVkZUluU2VhcmNoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3Qgcm93VmFsdWUgPSAodGhpcy5hcGkuZ3JpZC5nZXRWYWx1ZShjb2wuZ2V0Q29sSWQoKSwgcm93KSB8fCAnJykudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKHJvd1ZhbHVlLmluY2x1ZGVzKHNlYXJjaFRlcm0pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdXNlIGZpdEdyaWQoJ2NvbnRhaW5lcicpIGluc3RlYWRcbiAgICovXG4gIGZpdFRvQ29udGFpbmVyKCkge1xuICAgIHRoaXMuYXBpLmdyaWQuc2l6ZUNvbHVtbnNUb0ZpdCgpO1xuICB9XG5cbiAgZ2V0Q3VzdG9tSGVhZGVyKGZpZWxkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5jdXN0b21IZWFkZXJzVGVtcGxhdGVzKSB7XG4gICAgICBjb25zdCBzcGVjaWZpYyA9IHRoaXMuY3VzdG9tSGVhZGVyc1RlbXBsYXRlcy5maW5kKCh7IGNvbHVtbiB9KSA9PiBjb2x1bW4gPT09IGZpZWxkKTtcbiAgICAgIGNvbnN0IGNvbW1vbiA9IHRoaXMuY3VzdG9tSGVhZGVyc1RlbXBsYXRlcy5maW5kKCh7IGNvbHVtbiB9KSA9PiAhY29sdW1uKTtcbiAgICAgIGlmIChzcGVjaWZpYyB8fCBjb21tb24pIHtcbiAgICAgICAgY29uc3QgeyBtb3JlTWVudSwgY3VzdG9tSGVhZGVyIH0gPSB7XG4gICAgICAgICAgbW9yZU1lbnU6IChzcGVjaWZpYyAmJiBzcGVjaWZpYy5tb3JlTWVudSkgfHwgKGNvbW1vbiAmJiBjb21tb24ubW9yZU1lbnUpLFxuICAgICAgICAgIGN1c3RvbUhlYWRlcjogKHNwZWNpZmljICYmIHNwZWNpZmljLmN1c3RvbUhlYWRlcikgfHwgKGNvbW1vbiAmJiBjb21tb24uY3VzdG9tSGVhZGVyKVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4geyBtb3JlTWVudTogbW9yZU1lbnUgJiYgbW9yZU1lbnUudHBsLCBjdXN0b21IZWFkZXI6IGN1c3RvbUhlYWRlciAmJiBjdXN0b21IZWFkZXIudHBsIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY2xlYXJBbGxGaWx0ZXJzKCkge1xuICAgIHRoaXMuc3RvcmUudXBkYXRlKHN0YXRlID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgLi4uc3RhdGUuc2V0dGluZ3MsXG4gICAgICAgICAgZmlsdGVyOiB7fSxcbiAgICAgICAgICBzZWFyY2hUZXJtOiBudWxsXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5ub3RpZnlGaWx0ZXJVcGRhdGUoKTtcbiAgfVxuXG4gIGNsZWFyQ29sdW1uRmlsdGVyKGNvbHVtbkZpZWxkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7IFtjb2x1bW5GaWVsZF06IGRlbGV0ZWQsIC4uLmZpbHRlciB9ID0gdGhpcy5ncmlkUXVlcnkuZ2V0RmlsdGVyKCk7XG4gICAgdGhpcy5zdG9yZS51cGRhdGUoc3RhdGUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5zZXR0aW5ncyxcbiAgICAgICAgICBmaWx0ZXJcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLm5vdGlmeUZpbHRlclVwZGF0ZSgpO1xuICB9XG5cbiAgc2V0Q29sdW1uRmlsdGVyKGNvbHVtbjogQ29sdW1uLCBmaWx0ZXI6IERhdG9HcmlkRmlsdGVyLCBub3RpZnlHcmlkID0gdHJ1ZSkge1xuICAgIHRoaXMuX2xvZ0V2ZW50KENvcmVFdmVudFR5cGVzLkdSSURfRklMVEVSX0FQUExJRUQsIHtcbiAgICAgIGNvbHVtbjogY29sdW1uLmdldENvbElkKCksXG4gICAgICBudW1PZkNvbmRpdGlvbnM6IChmaWx0ZXIuY29uZGl0aW9uYWwgJiYgZmlsdGVyLmNvbmRpdGlvbmFsLmNvbmRpdGlvbnMubGVuZ3RoKSB8fCAwLFxuICAgICAgYnlWYWx1ZTogISFmaWx0ZXIuYnlWYWx1ZSA/ICdZZXMnIDogJ05vJ1xuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVGaWx0ZXIoY29sdW1uLCBmaWx0ZXIpO1xuXG4gICAgaWYgKG5vdGlmeUdyaWQpIHtcbiAgICAgIHRoaXMubm90aWZ5RmlsdGVyVXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0R3JpZEZpbHRlcnMoZmlsdGVyczogRGF0b0dyaWRFeHRlcm5hbEZpbHRlcltdKSB7XG4gICAgaWYgKHRoaXMuYXBpICYmIGZpbHRlcnMpIHtcbiAgICAgIGxldCBhcHBsaWVkRmlsdGVyID0ge307XG5cbiAgICAgIGZvciAoY29uc3QgeyBmaWx0ZXIsIGZpZWxkIH0gb2YgZmlsdGVycykge1xuICAgICAgICBhcHBsaWVkRmlsdGVyW2ZpZWxkXSA9IGZpbHRlcjtcbiAgICAgIH1cblxuICAgICAgdGhpcy51cGRhdGVTZXR0aW5ncyh7IGZpbHRlcjogYXBwbGllZEZpbHRlciB9KTtcbiAgICAgIHRoaXMubm90aWZ5RmlsdGVyVXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0U29ydEJ5Q29sdW1uKGNvbElkLCBzb3J0KSB7XG4gICAgY29uc3Qgc29ydFRvU2V0ID0gdGhpcy5ncmlkUXVlcnkuZ2V0U29ydCh7IGNvbElkLCBzb3J0IH0pO1xuXG4gICAgdGhpcy5zZXRHcmlkU29ydChzb3J0VG9TZXQpO1xuICB9XG5cbiAgc2V0R3JpZFNvcnQoZ3JpZFNvcnQ6IERhdG9HcmlkU29ydCkge1xuICAgIGlmIChncmlkU29ydCAmJiB0aGlzLmFwaSAmJiB0aGlzLmFwaS5ncmlkLmdldERpc3BsYXllZFJvd0NvdW50KCkgPiAwKSB7XG4gICAgICBjb25zdCB7IGNvbElkLCBzb3J0LCBzb3J0SW5kZXggfSA9IGdyaWRTb3J0O1xuICAgICAgY29uc3QgZ3JpZENvbHVtbnMgPSB0aGlzLmFwaS5jb2x1bW5zLmdldEFsbEdyaWRDb2x1bW5zKCk7XG5cbiAgICAgIGlmIChncmlkQ29sdW1ucykge1xuICAgICAgICBsZXQgc29ydFRvQXBwbHkgPSBncmlkU29ydDtcbiAgICAgICAgLyoqIFNvcnQgYnkgY29sdW1uIGlkICovXG4gICAgICAgIGNvbnN0IGNvbHVtbkJ5SWQgPSBncmlkQ29sdW1ucy5maW5kKChjb2w6IENvbHVtbikgPT4ge1xuICAgICAgICAgIHJldHVybiAoY29sLmdldENvbERlZigpLnNob3dSb3dHcm91cCB8fCBjb2wuZ2V0Q29sSWQoKSkgPT09IGNvbElkO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY29sdW1uQnlJZCkge1xuICAgICAgICAgIHNvcnRUb0FwcGx5ID0geyBjb2xJZDogY29sdW1uQnlJZC5nZXRDb2xJZCgpLCBzb3J0IH07XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzTmlsKHNvcnRJbmRleCkpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZUNvbHVtbnMgPSB0aGlzLmFwaS5jb2x1bW5zLmdldFZhbHVlQ29sdW1ucygpO1xuICAgICAgICAgIGNvbnN0IHZhbHVlQ29sdW1uID0gdmFsdWVDb2x1bW5zLmZpbmQoKGNvbDogQ29sdW1uKSA9PiBjb2wuZ2V0Q29sSWQoKSA9PT0gY29sSWQpO1xuICAgICAgICAgIGNvbnN0IGlzUGl2b3RDb2xJZCA9IGNvbElkLnN0YXJ0c1dpdGgoJ3Bpdm90Jyk7XG5cbiAgICAgICAgICBpZiAoaXNQaXZvdENvbElkIHx8IHZhbHVlQ29sdW1uKSB7XG4gICAgICAgICAgICAvKiogQ29sdW1uIGlzIHBpdm90IHZhbHVlIGNvbHVtbiwgc29ydCBieSBpbmRleCAqL1xuICAgICAgICAgICAgY29uc3QgY29sdW1uQnlJbmRleCA9IGdyaWRDb2x1bW5zW3NvcnRJbmRleF07XG5cbiAgICAgICAgICAgIHNvcnRUb0FwcGx5ID0geyBjb2xJZDogY29sdW1uQnlJbmRleC5nZXRDb2xJZCgpLCBzb3J0LCBzb3J0SW5kZXggfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVNldHRpbmdzKHsgc29ydDogc29ydFRvQXBwbHkgfSk7XG4gICAgICAgIGFwcGx5U29ydE1vZGVsKHRoaXMuYXBpLmNvbHVtbnMsIFtzb3J0VG9BcHBseV0pO1xuXG4gICAgICAgIGlmICgodGhpcy5ncmlkUmVmLmdyaWRPcHRpb25zIGFzIERhdG9HcmlkT3B0aW9ucykudXNlUGl2b3RHcmlkU3R5bGUpIHtcbiAgICAgICAgICB0aGlzLmFwaS5ncmlkLnJlZHJhd1Jvd3MoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRmlsdGVyKGNvbHVtbjogQ29sdW1uLCBmaWx0ZXI6IERhdG9HcmlkRmlsdGVyKSB7XG4gICAgY29uc3QgY29sRmllbGQgPSBnZXRDb2xGaWVsZChjb2x1bW4uZ2V0Q29sRGVmKCkpO1xuXG4gICAgdGhpcy5zdG9yZS51cGRhdGUoc3RhdGUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5zZXR0aW5ncyxcbiAgICAgICAgICBmaWx0ZXI6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLnNldHRpbmdzLmZpbHRlcixcbiAgICAgICAgICAgIFtjb2xGaWVsZF06IGZpbHRlclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldFNlYXJjaFRlcm0oc2VhcmNoVGVybTogc3RyaW5nKSB7XG4gICAgdGhpcy5zdG9yZS51cGRhdGUoc3RhdGUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5zZXR0aW5ncyxcbiAgICAgICAgICBzZWFyY2hUZXJtXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5ub3RpZnlGaWx0ZXJVcGRhdGUoKTtcbiAgfVxuXG4gIHNldFNlcnZlclNpZGVQYWdpbmF0aW9uKGNvbmZpZzogUGFydGlhbDxTZXJ2ZXJTaWRlUGFnaW5hdGlvbkNvbmZpZz4pIHtcbiAgICB0aGlzLnN0b3JlLnVwZGF0ZShzdGF0ZSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXJ2ZXJTaWRlUGFnaW5hdGlvbjoge1xuICAgICAgICAgIC4uLnN0YXRlLnNlcnZlclNpZGVQYWdpbmF0aW9uLFxuICAgICAgICAgIC4uLmNvbmZpZ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgc2V0TG9hZGluZyhzaG93OiBib29sZWFuKSB7XG4gICAgaWYgKHNob3cpIHtcbiAgICAgIHRoaXMuYXBpLmdyaWQuc2hvd0xvYWRpbmdPdmVybGF5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXBpLmdyaWQuZ2V0RGlzcGxheWVkUm93Q291bnQoKSA9PT0gMCA/IHRoaXMuc2V0T3ZlcmxheSh0cnVlKSA6IHRoaXMuc2V0T3ZlcmxheShmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBzZXRPdmVybGF5IGluc3RlYWRcbiAgICogQHBhcmFtIHNob3dcbiAgICovXG4gIHNldE5vRGF0YShzaG93OiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRPdmVybGF5KHNob3cpO1xuICB9XG5cbiAgc2V0T3ZlcmxheShzaG93OiBib29sZWFuKSB7XG4gICAgc2hvdyA/IHRoaXMuYXBpLmdyaWQuc2hvd05vUm93c092ZXJsYXkoKSA6IHRoaXMuYXBpLmdyaWQuaGlkZU92ZXJsYXkoKTtcbiAgfVxuXG4gIHVwZGF0ZVNldHRpbmdzKHNldHRpbmdzOiBQYXJ0aWFsPERhdG9HcmlkU2V0dGluZ3M+KSB7XG4gICAgdGhpcy5zdG9yZS51cGRhdGUoc3RhdGUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5zZXR0aW5ncyxcbiAgICAgICAgICAuLi5zZXR0aW5nc1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgZml0R3JpZCh0bzogJ2NvbnRhaW5lcicgfCAnY29udGVudCcpIHtcbiAgICB0byA9PT0gJ2NvbnRhaW5lcicgPyB0aGlzLmFwaS5ncmlkLnNpemVDb2x1bW5zVG9GaXQoKSA6IHRoaXMuYXBpLmNvbHVtbnMuYXV0b1NpemVBbGxDb2x1bW5zKCk7XG4gICAgY29uc3QgZ3JpZEFsaWdubWVudCA9IHRvID09PSAnY29udGFpbmVyJyA/IERhdG9HcmlkQWxpZ25tZW50LkZJVF9UT19DT05UQUlORVIgOiBEYXRvR3JpZEFsaWdubWVudC5GSVRfVE9fQ09OVEVOVDtcbiAgICB0aGlzLnVwZGF0ZVNldHRpbmdzKHsgZ3JpZEFsaWdubWVudCwgY29sdW1uc1NpemVzOiBudWxsIH0pO1xuICB9XG5cbiAgc2F2ZVNldHRpbmdzVG9TZXJ2ZXIoc2V0dGluZ3M6IFBhcnRpYWw8RGF0b0dyaWRTZXR0aW5ncz4pIHtcbiAgICB0aGlzLnN0b3JhZ2VBUEkuc2V0KHRoaXMuZ3JpZE5hbWUsIHNldHRpbmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWwgdXNlZCB0byBsb2cgZ3JpZCBldmVudHMgdG8gdGhlIHBsYXRmb3JtJ3MgbG9nZ2luZyBzZXJ2aWNlXG4gICAqL1xuICBfbG9nRXZlbnQoZXZlbnRUeXBlOiBDb3JlRXZlbnRUeXBlcywgZXZlbnRQcm9wZXJ0aWVzPzogSGFzaE1hcDxhbnk+KSB7XG4gICAgdGhpcy5sb2dnZXIubG9nRXZlbnQoZXZlbnRUeXBlLCB7IHRhYmxlOiB0aGlzLmdyaWROYW1lLCAuLi5ldmVudFByb3BlcnRpZXMgfSk7XG4gIH1cblxuICBwcml2YXRlIHdyYXBTdWNjZXNzQ2FsbGJhY2soeyBzdWNjZXNzQ2IsIHBhZ2VOdW1iZXIsIGlzUGVuZGluZ1JldHVyblRvUGFnZSB9OiBTdWNjZXNzV3JhcHBlclBhcmFtcykge1xuICAgIHJldHVybiAocm93c1RoaXNCbG9jazogYW55W10sIHRvdGFsUm93czogbnVtYmVyKSA9PiB7XG4gICAgICB0aGlzLnNldFNlcnZlclNpZGVQYWdpbmF0aW9uKHsgdG90YWxSb3dzLCBoYXNFcnJvcjogZmFsc2UgfSk7XG4gICAgICBzdWNjZXNzQ2Iocm93c1RoaXNCbG9jaywgdG90YWxSb3dzKTtcbiAgICAgIHRoaXMuZ3JpZFF1ZXJ5Ll9zZXJ2ZXJEYXRhTG9hZGVkLm5leHQoe1xuICAgICAgICBhcGk6IHRoaXMuYXBpLmdyaWQsXG4gICAgICAgIGNvbHVtbkFwaTogdGhpcy5hcGkuY29sdW1ucyxcbiAgICAgICAgdHlwZTogJ1NlcnZlckRhdGFMb2FkZWQnLFxuICAgICAgICBwYWdpbmF0aW9uUGFnZTogcGFnZU51bWJlclxuICAgICAgfSk7XG4gICAgICBpZiAoIWlzUGVuZGluZ1JldHVyblRvUGFnZSkge1xuICAgICAgICB0aGlzLnNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgICAvKiogc28gdGhlIGdyaWQgZml0cyBpbiBldmVyeSBuZXcgZGF0YSBpbnB1dCAqL1xuICAgICAgICB0cmlnZ2VyV2luZG93UmVzaXplKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmxhc3RUb3RhbFJvd3MgPSB0b3RhbFJvd3M7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgd3JhcEdldFJvd3Mob3B0aW9uczogRGF0b0dyaWRPcHRpb25zLCBnZXRSb3dzPzogKHBhcmFtczogRGF0b0dyaWRHZXRSb3dzUGFyYW1zKSA9PiB2b2lkKSB7XG4gICAgY29uc3QgZ2V0Um93c0NiID0gZ2V0Um93cyB8fCBvcHRpb25zLmRhdGFzb3VyY2UuZ2V0Um93cztcbiAgICByZXR1cm4gKGdldFJvd3NQYXJhbXM6IElHZXRSb3dzUGFyYW1zKSA9PiB7XG4gICAgICBjb25zdCB7IHN0YXJ0Um93LCBlbmRSb3csIHNvcnRNb2RlbCwgc3VjY2Vzc0NhbGxiYWNrIH0gPSBnZXRSb3dzUGFyYW1zO1xuICAgICAgY29uc3QgcGFnZVNpemUgPSBvcHRpb25zLnBhZ2luYXRpb25QYWdlU2l6ZSB8fCAxMDA7XG4gICAgICBjb25zdCBpc1JldHVyblRvQ3VycmVudFBhZ2VSZXF1aXJlZCA9IHRoaXMucGFnZU51bWJlclRvUmV0dXJuQWZ0ZXJSZWZyZXNoID4gMDtcbiAgICAgIGNvbnN0IGlzUGVuZGluZ1JldHVyblRvUGFnZSA9IGlzUmV0dXJuVG9DdXJyZW50UGFnZVJlcXVpcmVkICYmIHN0YXJ0Um93ID09PSAwO1xuXG4gICAgICBjb25zdCBwYWdlTnVtYmVyID0gaXNSZXR1cm5Ub0N1cnJlbnRQYWdlUmVxdWlyZWRcbiAgICAgICAgPyB0aGlzLnBhZ2VOdW1iZXJUb1JldHVybkFmdGVyUmVmcmVzaCArIDFcbiAgICAgICAgOiBNYXRoLmNlaWwoZW5kUm93IC8gcGFnZVNpemUpO1xuXG4gICAgICB0aGlzLnBhZ2VOdW1iZXJUb1JldHVybkFmdGVyUmVmcmVzaCA9IC0xO1xuXG4gICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmdyaWRRdWVyeS5nZXRGaWx0ZXIoKTtcbiAgICAgIGNvbnN0IG5ld1BhcmFtczogRGF0b0dyaWRHZXRSb3dzUGFyYW1zID0ge1xuICAgICAgICAuLi5nZXRSb3dzUGFyYW1zLFxuICAgICAgICBmYWlsQ2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLnNldFNlcnZlclNpZGVQYWdpbmF0aW9uKHsgaGFzRXJyb3I6IHRydWUgfSk7XG4gICAgICAgICAgdGhpcy5zZXRPdmVybGF5KHRydWUpO1xuICAgICAgICB9LFxuICAgICAgICBzdWNjZXNzQ2FsbGJhY2s6IHRoaXMud3JhcFN1Y2Nlc3NDYWxsYmFjayh7IHBhZ2VOdW1iZXIsIHN1Y2Nlc3NDYjogc3VjY2Vzc0NhbGxiYWNrLCBpc1BlbmRpbmdSZXR1cm5Ub1BhZ2UgfSksXG4gICAgICAgIHNlcnZlckNvbmZpZzoge1xuICAgICAgICAgIHBhZ2VTaXplLFxuICAgICAgICAgIHBhZ2VOdW1iZXIsXG4gICAgICAgICAgY29sdW1uRmlsdGVyczogaXNFbXB0eShmaWx0ZXIpIHx8IG9wdGlvbnMuZW5hYmxlVjJfMSA/IG51bGwgOiB0aGlzLmJ1aWxkU2VydmVyUmVxdWVzdEZpbHRlcnMoZmlsdGVyKSxcbiAgICAgICAgICBmaWx0ZXI6IG9wdGlvbnMuZW5hYmxlVjJfMSA/IHRoaXMuYnVpbGRTZXJ2ZXJSZXF1ZXN0RmlsdGVyc192Ml8xKG9wdGlvbnMuY29sdW1uRGVmcykgOiBudWxsLFxuICAgICAgICAgIHNvcnQ6IHRoaXMuYnVpbGRTZXJ2ZXJSZXF1ZXN0U29ydChzb3J0TW9kZWwpXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBpZiAoaXNQZW5kaW5nUmV0dXJuVG9QYWdlKSB7XG4gICAgICAgIC8vIFNjZW5hcmlvIHRoZSBmb2xsb3dpbmcgaGFuZGxlcyAtIHNlcnZlciByZWZyZXNoIHdoZXJlIGl0IHdhcyByZXF1ZXN0ZWQgdG8ga2VlcCB0aGUgY3VycmVudCBwYWdlLlxuICAgICAgICAvLyBUaGUgcHJvYmxlbSAtIGdldFJvd3Mgd2lsbCBpbml0aWFsbHkgYmUgY2FsbGVkIGZvciBwYWdlIDEgKGF1dG9tYXRpY2FsbHkgaGFwcGVucyB3aGVuIGNhbGxpbmcgYWctZ3JpZCdzIHNldERhdGFTb3VyY2UpLlxuICAgICAgICAvLyBJbiBvcmRlciB0byB0cmlnZ2VyIGl0IGFnYWluLCBzdWNjZXNzQ2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggdGhlIGRlc2lyZWQgcGFnZS5cbiAgICAgICAgLy8gZmFrZUdldFJvd3MgaXMgdXNlZCBpbiBvcmRlciB0byBhdm9pZCByZXRyaWV2aW5nIHRoZSB1bm5lY2Vzc2FyeSByZWFsIGRhdGEgZm9yIHBhZ2UgMS5cbiAgICAgICAgY29uc3QgZmFrZUdldFJvd3MgPSAoeyBzdWNjZXNzQ2FsbGJhY2sgfTogRGF0b0dyaWRHZXRSb3dzUGFyYW1zKSA9PiB7XG4gICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKFtdLCB0aGlzLmxhc3RUb3RhbFJvd3MpO1xuICAgICAgICB9O1xuICAgICAgICBmYWtlR2V0Um93cyhuZXdQYXJhbXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2V0Um93c0NiKG5ld1BhcmFtcyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdEVkaXRhYmxlQ29sdW1uc0NlbGxDbGFzcyhwYXJhbXM6IE5vcm1hbGl6ZU9wdGlvbnNQYXJhbXMpIHtcbiAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuY29sdW1uRGVmcy5mb3JFYWNoKGNvbERlZiA9PiB7XG4gICAgICBpZiAoY29sRGVmLmVkaXRhYmxlKSB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGNvbERlZi5lZGl0YWJsZSkpIHtcbiAgICAgICAgICBjb25zdCBpbml0aWFsQ2VsbENsYXNzID0gY29sRGVmLmNlbGxDbGFzcztcbiAgICAgICAgICBjb2xEZWYuY2VsbENsYXNzID0gKGNlbGxDbGFzc1BhcmFtczogQ2VsbENsYXNzUGFyYW1zKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc0VkaXRhYmxlID0gKGNvbERlZi5lZGl0YWJsZSBhcyBGdW5jdGlvbikoY2VsbENsYXNzUGFyYW1zIGFzIGFueSk7XG4gICAgICAgICAgICBpZiAoaXNFZGl0YWJsZSkge1xuICAgICAgICAgICAgICBjb25zdCBlZGl0YWJsZVJlc3VsdCA9IHRoaXMuYWRkRWRpdGFibGVDZWxsQ2xhc3MoaW5pdGlhbENlbGxDbGFzcyk7XG4gICAgICAgICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKGVkaXRhYmxlUmVzdWx0KSA/IGVkaXRhYmxlUmVzdWx0KGNlbGxDbGFzc1BhcmFtcykgOiBlZGl0YWJsZVJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKGluaXRpYWxDZWxsQ2xhc3MpID8gaW5pdGlhbENlbGxDbGFzcyhjZWxsQ2xhc3NQYXJhbXMpIDogaW5pdGlhbENlbGxDbGFzcztcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbERlZi5jZWxsQ2xhc3MgPSB0aGlzLmFkZEVkaXRhYmxlQ2VsbENsYXNzKGNvbERlZi5jZWxsQ2xhc3MpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHdyYXBDb250ZXh0TWVudUJ1aWxkZXIocGFyYW1zOiBOb3JtYWxpemVPcHRpb25zUGFyYW1zKSB7XG4gICAgY29uc3QgeyBjdXN0b21Db250ZXh0TWVudSB9ID0gcGFyYW1zLmdyaWRPcHRpb25zO1xuICAgIGNvbnN0IGFsbEFjdGlvbnMgPSBpc0Z1bmN0aW9uKGN1c3RvbUNvbnRleHRNZW51KSA/IGN1c3RvbUNvbnRleHRNZW51KHBhcmFtcy5yb3dBY3Rpb25zKSA6IHBhcmFtcy5yb3dBY3Rpb25zO1xuICAgIHRoaXMudHJhbnNsYXRlQWN0aW9uTGFiZWxzKGFsbEFjdGlvbnMpO1xuICAgIGNvbnN0IGNvcHlBY3Rpb246IFJvd0FjdGlvbiA9IHtcbiAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oJ2NvcmUuY29weS1jZWxsJyksXG4gICAgICBpY29uOiAnY29weScsXG4gICAgICBrZXk6ICdDb3B5IENlbGwnXG4gICAgfTtcbiAgICByZXR1cm4gKHsgbm9kZSwgY29sdW1uLCBjb250ZXh0IH06IEdldENvbnRleHRNZW51SXRlbXNQYXJhbXMpID0+IHtcbiAgICAgIGNvbnN0IG9uSG92ZXJBY3Rpb25NZW51ID0gY29udGV4dCAmJiBjb250ZXh0LmNvbnRleHRNZW51ICYmIGNvbnRleHQuY29udGV4dE1lbnUuZnJvbU9uSG92ZXI7XG4gICAgICBpZiAoIW5vZGUpIHJldHVybiBbXTtcbiAgICAgIGxldCBzZWxlY3RlZCA9IFtub2RlXTtcbiAgICAgIGxldCByb3dzQ291bnQgPSAxO1xuICAgICAgaWYgKG9uSG92ZXJBY3Rpb25NZW51KSB7XG4gICAgICAgIHRoaXMudXBkYXRlR3JpZENvbnRleHQoeyBjb250ZXh0TWVudTogeyBmcm9tT25Ib3ZlcjogZmFsc2UgfSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvcHlBY3Rpb24ub25DbGljayA9IChbcm93XSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJhd1ZhbHVlID0gdGhpcy5hcGkuZ3JpZC5nZXRWYWx1ZShjb2x1bW4uZ2V0Q29sSWQoKSwgcm93KTtcbiAgICAgICAgICBjb25zdCBmb3JtYXR0ZXIgPSBjb2x1bW4uZ2V0Q29sRGVmKCkudmFsdWVGb3JtYXR0ZXI7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBmb3JtYXR0ZXIgJiYgdHlwZW9mIGZvcm1hdHRlciAhPT0gJ3N0cmluZycgPyBmb3JtYXR0ZXIocmF3VmFsdWUpIDogcmF3VmFsdWU7XG4gICAgICAgICAgd3JpdGVUb0NsaXBib2FyZCh2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChub2RlLmlzU2VsZWN0ZWQoKSkge1xuICAgICAgICAgIHNlbGVjdGVkID0gdGhpcy5ncmlkUXVlcnkuZ2V0U2VsZWN0ZWRSb3dOb2RlcygpO1xuICAgICAgICAgIHJvd3NDb3VudCA9IHNpemUoc2VsZWN0ZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB2aXNpYmxlQWN0aW9ucyA9IGdldFZpc2libGVBY3Rpb25zKFxuICAgICAgICBhbGxBY3Rpb25zLFxuICAgICAgICByb3dzQ291bnQsXG4gICAgICAgIHNlbGVjdGVkLFxuICAgICAgICB0aGlzLmdyaWRRdWVyeS5pc1NlcnZlclNlbGVjdEFsbFJvd3NFbmFibGVkXG4gICAgICApLmZpbHRlcigoeyB2aXNpYmxlIH0pID0+IHZpc2libGUpO1xuICAgICAgbGV0IHRvb2xiYXJBY3Rpb25zID0gW2NvcHlBY3Rpb25dO1xuICAgICAgaWYgKG9uSG92ZXJBY3Rpb25NZW51KSB7XG4gICAgICAgIHRvb2xiYXJBY3Rpb25zID0gdmlzaWJsZUFjdGlvbnM7XG4gICAgICB9IGVsc2UgaWYgKHZpc2libGVBY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdG9vbGJhckFjdGlvbnMgPSBbeyAuLi5jb3B5QWN0aW9uLCBzZXBhcmF0b3I6IHRydWUgfSwgLi4udmlzaWJsZUFjdGlvbnNdO1xuICAgICAgfVxuICAgICAgY29uc3QgY29udmVydGVyUGFyYW1zOiBBY3Rpb25Db252ZXJ0ZXJQYXJhbXMgPSB7XG4gICAgICAgIHRvb2xiYXJBY3Rpb25zLFxuICAgICAgICBzZWxlY3RlZFJvd3M6IHNlbGVjdGVkLFxuICAgICAgICBpY29uUmVnaXN0cnk6IHRoaXMuc3ZnUmVnaXN0cnksXG4gICAgICAgIG5vZGUsXG4gICAgICAgIGxvZ2dlcjoge1xuICAgICAgICAgIGxvZzogdGhpcy5fbG9nRXZlbnQuYmluZCh0aGlzKSxcbiAgICAgICAgICBldmVudE9yaWdpbjogb25Ib3ZlckFjdGlvbk1lbnUgPyAnT24gSG92ZXInIDogJ0NvbnRleHQgTWVudSdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiB0b29sYmFyQWN0aW9uVG9Db250ZXh0QWN0aW9uKGNvbnZlcnRlclBhcmFtcyk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNsYXRlQWN0aW9uTGFiZWxzKGFsbEFjdGlvbnM6IFJvd0FjdGlvbltdKSB7XG4gICAgYWxsQWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICBhY3Rpb24ubGFiZWwgPSB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oYWN0aW9uLmxhYmVsKTtcbiAgICAgIGlmIChhY3Rpb24uc3ViTWVudSkge1xuICAgICAgICB0aGlzLnRyYW5zbGF0ZUFjdGlvbkxhYmVscyhhY3Rpb24uc3ViTWVudSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBsb2FkU2F2ZWRTZXR0aW5ncyhzZXR0aW5nczogUGFydGlhbDxEYXRvR3JpZFNldHRpbmdzPikge1xuICAgIGNvbnN0IHtcbiAgICAgIHNvcnQsXG4gICAgICBoaWRkZW5Db2x1bW5zLFxuICAgICAgZmlsdGVyLFxuICAgICAgZ3JvdXBlZENvbHVtbnMsXG4gICAgICBjb2x1bW5zU2l6ZXMsXG4gICAgICBwaW5uZWRDb2x1bW5zLFxuICAgICAgY29sdW1uc09yZGVyLFxuICAgICAgZ3JpZEFsaWdubWVudFxuICAgIH0gPSBzZXR0aW5ncztcbiAgICBjb25zdCB7IGdyaWQsIGNvbHVtbnMgfSA9IHRoaXMuYXBpO1xuICAgIC8qIEhpZGUgY29sdW1ucyAqL1xuICAgIC8qIE5PVEU6IGNvbHVtbnMgb3JkZXIgYXJlIHRyZWF0ZWQgYXMgdGhlIGN1cnJlbnRseSB2aXNpYmxlIGNvbHVtbnMgKi9cbiAgICBjb2x1bW5zLnNldENvbHVtbnNWaXNpYmxlKHRoaXMuaW5pdGlhbFNldHRpbmdzLmNvbHVtbnNPcmRlciwgdHJ1ZSk7XG4gICAgY29uc3QgY29sdW1uVG9IaWRlID0gIWlzTmlsKGhpZGRlbkNvbHVtbnMpID8gaGlkZGVuQ29sdW1ucyA6IHRoaXMuaW5pdGlhbFNldHRpbmdzLmhpZGRlbkNvbHVtbnM7XG4gICAgY29sdW1ucy5zZXRDb2x1bW5zVmlzaWJsZShjb2x1bW5Ub0hpZGUsIGZhbHNlKTtcblxuICAgIC8qIEFwcGx5IGZpbHRlcnMgKi9cbiAgICBpZiAoZmlsdGVyKSB7XG4gICAgICBncmlkLm9uRmlsdGVyQ2hhbmdlZCgpO1xuICAgIH1cblxuICAgIC8qIEdyb3VwIGNvbHVtbnMgKi9cbiAgICBjb25zdCBhbGxHcm91cGVkQ29sdW1ucyA9IGNvbHVtbnMuZ2V0Um93R3JvdXBDb2x1bW5zKCk7XG4gICAgbGV0IHJlbW92ZUdyb3VwZWQ7XG4gICAgaWYgKGdyb3VwZWRDb2x1bW5zKSB7XG4gICAgICByZW1vdmVHcm91cGVkID0gYWxsR3JvdXBlZENvbHVtbnMuZmlsdGVyKGNvbCA9PiAhZ3JvdXBlZENvbHVtbnMuaW5jbHVkZXMoY29sLmdldENvbElkKCkpKTtcbiAgICAgIGNvbHVtbnMuYWRkUm93R3JvdXBDb2x1bW5zKGdyb3VwZWRDb2x1bW5zKTtcbiAgICAgIGNvbHVtbnMuc2V0Q29sdW1uc1Zpc2libGUoZ3JvdXBlZENvbHVtbnMsIGZhbHNlKTtcbiAgICB9XG4gICAgY29sdW1ucy5yZW1vdmVSb3dHcm91cENvbHVtbnMocmVtb3ZlR3JvdXBlZCk7XG4gICAgY29sdW1ucy5zZXRDb2x1bW5zVmlzaWJsZShyZW1vdmVHcm91cGVkLCB0cnVlKTtcblxuICAgIC8qIEFwcGx5IHNvcnQgKi9cbiAgICBjb25zdCBncmlkU29ydCA9IHNvcnQgfHwgdGhpcy5pbml0aWFsU2V0dGluZ3Muc29ydDtcbiAgICBhcHBseVNvcnRNb2RlbChjb2x1bW5zLCBncmlkU29ydCA/IFtncmlkU29ydF0gOiBbXSk7XG5cbiAgICAvKiBBbGlnbiBncmlkICovXG4gICAgaWYgKGdyaWRBbGlnbm1lbnQgPT09IERhdG9HcmlkQWxpZ25tZW50LkNVU1RPTSkge1xuICAgICAgLyogU2V0IGNvbHVtbiBzaXplcyAqL1xuICAgICAgY29sdW1uc1NpemVzICYmXG4gICAgICAgIE9iamVjdC5rZXlzKGNvbHVtbnNTaXplcykuZm9yRWFjaChjb2xJZCA9PiB7XG4gICAgICAgICAgaWYgKGNvbHVtbnNTaXplc1tjb2xJZF0gPT09IERhdG9HcmlkQWxpZ25tZW50LkZJVF9UT19DT05URU5UKSB7XG4gICAgICAgICAgICBjb2x1bW5zLmF1dG9TaXplQ29sdW1uKGNvbElkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29sdW1ucy5zZXRDb2x1bW5XaWR0aChjb2xJZCwgY29sdW1uc1NpemVzW2NvbElkXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JpZEFsaWdubWVudCA9PT0gRGF0b0dyaWRBbGlnbm1lbnQuRklUX1RPX0NPTlRFTlQgPyBjb2x1bW5zLmF1dG9TaXplQWxsQ29sdW1ucygpIDogZ3JpZC5zaXplQ29sdW1uc1RvRml0KCk7XG4gICAgfVxuXG4gICAgLyogUGluIGNvbHVtbnMgbGVmdCAqL1xuICAgIGNvbnN0IGZpbHRlcmVkUGlubmVkQ29sdW1ucyA9IHBpbm5lZENvbHVtbnNcbiAgICAgID8gcGlubmVkQ29sdW1ucy5maWx0ZXIoKGNvbDogc3RyaW5nKSA9PiBjb2wgIT09IHRoaXMuQ0hFQ0tCT1hfU0VMRUNUSU9OX0NPTF9JRClcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBmaWx0ZXJlZENvbHVtbnMgPSBjb2x1bW5zT3JkZXJcbiAgICAgID8gY29sdW1uc09yZGVyLmZpbHRlcigoY29sOiBzdHJpbmcpID0+IGNvbCAhPT0gdGhpcy5DSEVDS0JPWF9TRUxFQ1RJT05fQ09MX0lEKVxuICAgICAgOiBudWxsO1xuICAgIHNpemUoZmlsdGVyZWRQaW5uZWRDb2x1bW5zKSA+IDBcbiAgICAgID8gY29sdW1ucy5zZXRDb2x1bW5zUGlubmVkKGZpbHRlcmVkUGlubmVkQ29sdW1ucywgJ2xlZnQnKVxuICAgICAgOiBmaWx0ZXJlZENvbHVtbnMgJiYgY29sdW1ucy5zZXRDb2x1bW5zUGlubmVkKGZpbHRlcmVkQ29sdW1ucywgbnVsbCk7XG5cbiAgICAvKiBPcmRlciBjb2x1bW5zICovXG4gICAgY29sdW1uc09yZGVyICYmIGNvbHVtbnMubW92ZUNvbHVtbnMoY29sdW1uc09yZGVyLCAwKTtcbiAgfVxuXG4gIGdldFNldHRpbmdzRGlmZigpOiBQYXJ0aWFsPERhdG9HcmlkU2V0dGluZ3M+IHtcbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLmdyaWRRdWVyeS5nZXRDdXJyZW50R3JpZFNldHRpbmdzKCk7XG4gICAgcmV0dXJuIGRpZmYoY3VycmVudFN0YXRlLCB0aGlzLmluaXRpYWxTZXR0aW5ncyk7XG4gIH1cblxuICByZXNldFRhYmxlU2V0dGluZ3MoKSB7XG4gICAgY29uc3QgeyBmaWx0ZXIsIC4uLnJlc3QgfSA9IHRoaXMuaW5pdGlhbFNldHRpbmdzO1xuICAgIGNvbnN0IHsgY29sdW1ucyB9ID0gdGhpcy5hcGk7XG4gICAgY29uc3Qgb3JpZ2luYWxDb2xTaXplcyA9IGdldENvbHVtbnNTaXplcyhjb2x1bW5zLmdldEFsbEdyaWRDb2x1bW5zKCksIHRydWUpO1xuICAgIGNvbnN0IGdyaWRBbGlnbm1lbnQgPSBpc0VtcHR5KG9yaWdpbmFsQ29sU2l6ZXMpID8gcmVzdC5ncmlkQWxpZ25tZW50IDogRGF0b0dyaWRBbGlnbm1lbnQuQ1VTVE9NO1xuICAgIGNvbnN0IG5ld1NldHRpbmdzID0geyAuLi5yZXN0LCBjb2x1bW5zU2l6ZXM6IG9yaWdpbmFsQ29sU2l6ZXMsIGdyaWRBbGlnbm1lbnQgfTtcbiAgICB0aGlzLnVwZGF0ZVNldHRpbmdzKG5ld1NldHRpbmdzKTtcbiAgICB0aGlzLmxvYWRTYXZlZFNldHRpbmdzKG5ld1NldHRpbmdzKTtcbiAgICB0aGlzLnNhdmVTZXR0aW5nc1RvU2VydmVyKHsgZmlsdGVyIH0pO1xuICB9XG5cbiAgaW5pdFNldHRpbmdzKHNhdmVkU2V0dGluZ3M6IFBhcnRpYWw8RGF0b0dyaWRTZXR0aW5ncz4pIHtcbiAgICB0aGlzLmluaXRpYWxTZXR0aW5ncyA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEN1cnJlbnRHcmlkU2V0dGluZ3MoKTtcbiAgICB0aGlzLnVwZGF0ZVNldHRpbmdzKHNhdmVkU2V0dGluZ3MpO1xuICAgIHRoaXMubG9hZFNhdmVkU2V0dGluZ3Moc2F2ZWRTZXR0aW5ncyk7XG4gIH1cblxuICBub3RpZnlGaWx0ZXJVcGRhdGUoKSB7XG4gICAgY29uc3Qgd2F0Y2g6IE9ic2VydmFibGU8YW55PltdID0gW3RoaXMuZ3JpZFJlZi5maWx0ZXJDaGFuZ2VkLmFzT2JzZXJ2YWJsZSgpXTtcbiAgICBpZiAodGhpcy5ncmlkUXVlcnkuaXNTZXJ2ZXJTaWRlKSB7XG4gICAgICB3YXRjaC5wdXNoKHRoaXMuZ3JpZFF1ZXJ5LnNlcnZlckRhdGFMb2FkZWQkKTtcbiAgICAgIHRoaXMuc2V0TG9hZGluZyh0cnVlKTtcbiAgICB9XG4gICAgY29tYmluZUxhdGVzdCh3YXRjaClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICB1bnRpbERlc3Ryb3llZCh0aGlzKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJvd3NBZnRlckZpbHRlciA9IHRoaXMuYXBpLmdyaWQuZ2V0RGlzcGxheWVkUm93Q291bnQoKTtcbiAgICAgICAgdGhpcy5zZXRPdmVybGF5KHJvd3NBZnRlckZpbHRlciA9PT0gMCk7XG4gICAgICB9KTtcbiAgICB0aGlzLmFwaS5ncmlkLm9uRmlsdGVyQ2hhbmdlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNlcnZlclJlcXVlc3RGaWx0ZXJzKGZpbHRlcjogRGF0b0dyaWRGaWx0ZXJzTWFwKTogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXJzIHtcbiAgICBjb25zdCBjb2x1bW5zRmlsdGVyczogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXJzID0ge307XG4gICAgZm9yIChjb25zdCBbY29sdW1uLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZmlsdGVyKSkge1xuICAgICAgY29uc3QgeyBieVZhbHVlLCBjb25kaXRpb25hbCB9ID0gdmFsdWU7XG4gICAgICBpZiAoYnlWYWx1ZSkge1xuICAgICAgICBjb2x1bW5zRmlsdGVyc1tjb2x1bW5dID0ge1xuICAgICAgICAgIG9wZXJhdG9yOiBPcGVyYXRvclR5cGVzLkFORCxcbiAgICAgICAgICBmaWx0ZXJzOiBbYnlWYWx1ZV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25kaXRpb25hbCkge1xuICAgICAgICBjb25zdCBjb25kaXRpb25hbEZpbHRlciA9IHtcbiAgICAgICAgICBvcGVyYXRvcjogY29uZGl0aW9uYWwub3BlcmF0b3IsXG4gICAgICAgICAgZmlsdGVyczogY29uZGl0aW9uYWwuY29uZGl0aW9ucy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGNvbmRpdGlvbiwgdmFsdWUgfSA9IGl0ZW07XG4gICAgICAgICAgICBpZiAoY29uZGl0aW9uID09PSBEYXRvRmlsdGVyQ29uZGl0aW9ucy5JTl9SQU5HRSkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvbmRpdGlvbixcbiAgICAgICAgICAgICAgICBzdGFydDogdmFsdWUsXG4gICAgICAgICAgICAgICAgZW5kOiAoaXRlbSBhcyBEYXRvR3JpZFJhbmdlRmlsdGVyQ29uZGl0aW9uKS5yYW5nZUVuZFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGl0ZW0gYXMgRGF0b0dyaWRGaWx0ZXJDb25kaXRpb247XG4gICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGJ5VmFsdWUpIHtcbiAgICAgICAgICBjb2x1bW5zRmlsdGVyc1tjb2x1bW5dLmZpbHRlcnMucHVzaChjb25kaXRpb25hbEZpbHRlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29sdW1uc0ZpbHRlcnNbY29sdW1uXSA9IGNvbmRpdGlvbmFsRmlsdGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbHVtbnNGaWx0ZXJzO1xuICB9XG5cbiAgYnVpbGRTZXJ2ZXJSZXF1ZXN0RmlsdGVyc192Ml8xKGdyaWRDb2x1bW5zOiBEYXRvR3JpZENvbHVtbkRlZltdKTogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIge1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEZpbHRlcigpO1xuICAgIGNvbnN0IHNlYXJjaFRlcm0gPSB0aGlzLmdyaWRRdWVyeS5nZXRTZWFyY2hUZXJtKCk7XG5cbiAgICBsZXQgY29sdW1uRmlsdGVycyA9IHRoaXMuYnVpbGRTZXJ2ZXJDb2x1bW5GaWx0ZXJzX3YyXzEoZmlsdGVyKTtcbiAgICBpZiAoY29sdW1uRmlsdGVycy5ldmVyeSgoeyBvcGVyYXRvciB9OiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlcikgPT4gb3BlcmF0b3IgPT09IE9wZXJhdG9yVHlwZXMuQU5EKSkge1xuICAgICAgY29uc3QgZmxhdHRlbmVkRmlsdGVycyA9IGNvbHVtbkZpbHRlcnNcbiAgICAgICAgLm1hcCgoeyBmaWx0ZXJzIH06IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyKSA9PiBmaWx0ZXJzKVxuICAgICAgICAucmVkdWNlKChhcnIsIHJlcykgPT4gcmVzLmNvbmNhdChhcnIpLCBbXSk7XG4gICAgICBjb2x1bW5GaWx0ZXJzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yVHlwZXMuQU5ELFxuICAgICAgICAgIGZpbHRlcnM6IGZsYXR0ZW5lZEZpbHRlcnNcbiAgICAgICAgfVxuICAgICAgXTtcbiAgICB9XG4gICAgY29uc3QgY29sdW1uRmlsdGVyOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciA9XG4gICAgICBzaXplKGNvbHVtbkZpbHRlcnMpID4gMVxuICAgICAgICA/IHsgb3BlcmF0b3I6IE9wZXJhdG9yVHlwZXMuQU5ELCBmaWx0ZXJzOiBjb2x1bW5GaWx0ZXJzIH1cbiAgICAgICAgOiBzaXplKGNvbHVtbkZpbHRlcnMpID09PSAxXG4gICAgICAgID8gY29sdW1uRmlsdGVyc1swXVxuICAgICAgICA6IG51bGw7XG4gICAgaWYgKCFzZWFyY2hUZXJtKSB7XG4gICAgICByZXR1cm4gY29sdW1uRmlsdGVyO1xuICAgIH1cbiAgICBjb25zdCB7IGluY2x1ZGVIaWRkZW5Db2x1bW5zSW5TZWFyY2ggfSA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEdyaWRPcHRpb25zKCk7XG4gICAgY29uc3Qgc2VhcmNoYWJsZUNvbHVtbnMgPSBncmlkQ29sdW1ucy5maWx0ZXIoKGNvbERlZjogRGF0b0dyaWRDb2x1bW5EZWYpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbERlZi5pbmNsdWRlSW5TZWFyY2ggJiYgKGluY2x1ZGVIaWRkZW5Db2x1bW5zSW5TZWFyY2ggfHwgdGhpcy5hcGkuY29sdW1ucy5nZXRDb2x1bW4oY29sRGVmLmNvbElkKS5pc1Zpc2libGUoKSlcbiAgICAgICk7XG4gICAgfSk7XG4gICAgY29uc3Qgc2VhcmNoRmlsdGVyczogU2VydmVyU2lkZVBhZ2luYXRpb25Db25kaXRpb25bXSA9IHNlYXJjaGFibGVDb2x1bW5zLm1hcCgoeyBmaWVsZCB9OiBEYXRvR3JpZENvbHVtbkRlZikgPT4gKHtcbiAgICAgIGNvbmRpdGlvbjogRGF0b0ZpbHRlckNvbmRpdGlvbnMuQ09OVEFJTlMsXG4gICAgICB2YWx1ZTogc2VhcmNoVGVybSxcbiAgICAgIGNvbHVtbjogZmllbGRcbiAgICB9KSk7XG4gICAgY29uc3Qgc2VhcmNoRmlsdGVyOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciA9XG4gICAgICBzaXplKHNlYXJjaEZpbHRlcnMpID4gMCA/IHsgb3BlcmF0b3I6IE9wZXJhdG9yVHlwZXMuT1IsIGZpbHRlcnM6IHNlYXJjaEZpbHRlcnMgfSA6IG51bGw7XG4gICAgaWYgKCFjb2x1bW5GaWx0ZXIpIHtcbiAgICAgIHJldHVybiBzZWFyY2hGaWx0ZXI7XG4gICAgfVxuICAgIHJldHVybiB7IG9wZXJhdG9yOiBPcGVyYXRvclR5cGVzLkFORCwgZmlsdGVyczogW2NvbHVtbkZpbHRlciwgc2VhcmNoRmlsdGVyXSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNlcnZlckNvbHVtbkZpbHRlcnNfdjJfMShmaWx0ZXI6IERhdG9HcmlkRmlsdGVyc01hcCk6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyW10ge1xuICAgIGxldCBjb2x1bW5GaWx0ZXJzOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlcltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtjb2x1bW4sIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhmaWx0ZXIpKSB7XG4gICAgICBsZXQgY29sdW1uRmlsdGVyOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciA9IG51bGw7XG4gICAgICBjb25zdCB7IGJ5VmFsdWUsIGNvbmRpdGlvbmFsIH0gPSB2YWx1ZTtcbiAgICAgIGlmIChieVZhbHVlKSB7XG4gICAgICAgIGNvbHVtbkZpbHRlciA9IHtcbiAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3JUeXBlcy5BTkQsXG4gICAgICAgICAgZmlsdGVyczogW3sgY29sdW1uLCAuLi5ieVZhbHVlIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoY29uZGl0aW9uYWwpIHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uYWxGaWx0ZXI6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyID0gdGhpcy5nZXRTZXJ2ZXJDb25kaXRpb25hbEZpbHRlcihjb25kaXRpb25hbCwgY29sdW1uKTtcbiAgICAgICAgaWYgKGNvbHVtbkZpbHRlcikge1xuICAgICAgICAgIGNvbHVtbkZpbHRlci5maWx0ZXJzLnB1c2goY29uZGl0aW9uYWxGaWx0ZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbHVtbkZpbHRlciA9IGNvbmRpdGlvbmFsRmlsdGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb2x1bW5GaWx0ZXJzLnB1c2goY29sdW1uRmlsdGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbkZpbHRlcnM7XG4gIH1cblxuICBnZXRGaWx0ZXJGb3JTZXJ2ZXJBY3Rpb25PblNlbGVjdEFsbCgpOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciB7XG4gICAgY29uc3QgeyBleGNsdWRlZEZyb21TZWxlY3RBbGwgfSA9IHRoaXMuZ3JpZFF1ZXJ5LnNlcnZlclNpZGVDb25maWc7XG4gICAgY29uc3QgeyBjb2x1bW5EZWZzLCBpZENvbHVtbktleSB9ID0gdGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKTtcbiAgICBjb25zdCBtYWluRmlsdGVyID0gdGhpcy5idWlsZFNlcnZlclJlcXVlc3RGaWx0ZXJzX3YyXzEoY29sdW1uRGVmcyk7XG4gICAgaWYgKGlzRW1wdHkoZXhjbHVkZWRGcm9tU2VsZWN0QWxsKSkge1xuICAgICAgcmV0dXJuIG1haW5GaWx0ZXI7XG4gICAgfVxuICAgIGNvbnN0IGV4Y2x1ZGVkUm93c0ZpbHRlcjogU2VydmVyU2lkZVBhZ2luYXRpb25MaXN0Q29uZGl0aW9uID0ge1xuICAgICAgY29uZGl0aW9uOiBEYXRvRmlsdGVyQ29uZGl0aW9ucy5OT1RfSU5fTElTVCxcbiAgICAgIHZhbHVlczogZXhjbHVkZWRGcm9tU2VsZWN0QWxsLFxuICAgICAgY29sdW1uOiBpZENvbHVtbktleVxuICAgIH07XG4gICAgY29uc3QgZmlsdGVycyA9IG1haW5GaWx0ZXIgPyBbbWFpbkZpbHRlciwgZXhjbHVkZWRSb3dzRmlsdGVyXSA6IFtleGNsdWRlZFJvd3NGaWx0ZXJdO1xuICAgIHJldHVybiB7IG9wZXJhdG9yOiBPcGVyYXRvclR5cGVzLkFORCwgZmlsdGVycyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZXJ2ZXJDb25kaXRpb25hbEZpbHRlcihcbiAgICBjb25kaXRpb25hbEZpbHRlcjogRGF0b0dyaWRDb25kaXRpb25hbEZpbHRlcixcbiAgICBjb2x1bW46IHN0cmluZ1xuICApOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wZXJhdG9yOiBjb25kaXRpb25hbEZpbHRlci5vcGVyYXRvcixcbiAgICAgIGZpbHRlcnM6IGNvbmRpdGlvbmFsRmlsdGVyLmNvbmRpdGlvbnMubWFwKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCB7IGNvbmRpdGlvbiwgdmFsdWUgfSA9IGl0ZW07XG4gICAgICAgIGlmIChjb25kaXRpb24gPT09IERhdG9GaWx0ZXJDb25kaXRpb25zLklOX1JBTkdFKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbixcbiAgICAgICAgICAgIHN0YXJ0OiB2YWx1ZSxcbiAgICAgICAgICAgIGVuZDogKGl0ZW0gYXMgRGF0b0dyaWRSYW5nZUZpbHRlckNvbmRpdGlvbikucmFuZ2VFbmQsXG4gICAgICAgICAgICBjb2x1bW5cbiAgICAgICAgICB9IGFzIFNlcnZlclNpZGVQYWdpbmF0aW9uUmFuZ2VDb25kaXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gRGF0b0ZpbHRlckNvbmRpdGlvbnMuSVNfRU1QVFkgfHwgY29uZGl0aW9uID09PSBEYXRvRmlsdGVyQ29uZGl0aW9ucy5OT1RfRU1QVFkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29uZGl0aW9uOiBEYXRvRmlsdGVyQ29uZGl0aW9ucy5JU19FTVBUWSxcbiAgICAgICAgICAgIHZhbHVlOiBjb25kaXRpb24gPT09IERhdG9GaWx0ZXJDb25kaXRpb25zLklTX0VNUFRZID8gJ3RydWUnIDogJ2ZhbHNlJyxcbiAgICAgICAgICAgIGNvbHVtblxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gRGF0b0ZpbHRlckNvbmRpdGlvbnMuSVNfTlVMTCB8fCBjb25kaXRpb24gPT09IERhdG9GaWx0ZXJDb25kaXRpb25zLk5PVF9OVUxMKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbjogRGF0b0ZpbHRlckNvbmRpdGlvbnMuSVNfTlVMTCxcbiAgICAgICAgICAgIHZhbHVlOiBjb25kaXRpb24gPT09IERhdG9GaWx0ZXJDb25kaXRpb25zLklTX05VTEwgPyAndHJ1ZScgOiAnZmFsc2UnLFxuICAgICAgICAgICAgY29sdW1uXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyAuLi5pdGVtLCBjb2x1bW4gfSBhcyBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkNvbmRpdGlvbjtcbiAgICAgIH0pXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTZXJ2ZXJSZXF1ZXN0U29ydChzb3J0TW9kZWw6IERhdG9HcmlkU29ydFtdKTogRGF0b0dyaWRTZXJ2ZXJTb3J0W10ge1xuICAgIHJldHVybiBzb3J0TW9kZWwubWFwKCh7IGNvbElkLCBzb3J0IH0pID0+ICh7XG4gICAgICBjb2x1bW46IGNvbElkLFxuICAgICAgc29ydE9yZGVyOiBzb3J0LnRvVXBwZXJDYXNlKCkgYXMgRGF0b0dyaWRTZXJ2ZXJTb3J0RGlyZWN0aW9uXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRFZGl0YWJsZUNlbGxDbGFzcyhcbiAgICBjZWxsQ2xhc3NWYWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCAoKGNlbGxDbGFzc1BhcmFtczogQ2VsbENsYXNzUGFyYW1zKSA9PiBzdHJpbmcgfCBzdHJpbmdbXSlcbiAgKSB7XG4gICAgaWYgKGlzTmlsKGNlbGxDbGFzc1ZhbHVlKSkge1xuICAgICAgcmV0dXJuICdkYXRvLWVkaXRhYmxlLWNlbGwnO1xuICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihjZWxsQ2xhc3NWYWx1ZSkpIHtcbiAgICAgIHJldHVybiBjZWxsQ2xhc3NQYXJhbXMgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRFZGl0YWJsZUNsYXNzQXJyYXkoY2VsbENsYXNzVmFsdWUoY2VsbENsYXNzUGFyYW1zKSk7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRFZGl0YWJsZUNsYXNzQXJyYXkoY2VsbENsYXNzVmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFZGl0YWJsZUNsYXNzQXJyYXkoY3VycmVudENsYXNzOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjZWxsQ2xhc3MgPSBjb2VyY2VBcnJheShjdXJyZW50Q2xhc3MpO1xuICAgIGNlbGxDbGFzcy5wdXNoKCdkYXRvLWVkaXRhYmxlLWNlbGwnKTtcbiAgICByZXR1cm4gY2VsbENsYXNzO1xuICB9XG5cbiAgc2VsZWN0QWxsQ3VycmVudFBhZ2VSb3dzKGlzU2VsZWN0ZWQgPSB0cnVlLCBjb25zaWRlckV4Y2x1ZGVkID0gZmFsc2UpIHtcbiAgICBsZXQgcm93c0ZvclNlbGVjdGlvbiA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEN1cnJlbnRQYWdlUm93cygpO1xuICAgIGlmIChjb25zaWRlckV4Y2x1ZGVkKSB7XG4gICAgICBjb25zdCB7IGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbCB9ID0gdGhpcy5ncmlkUXVlcnkuc2VydmVyU2lkZUNvbmZpZztcbiAgICAgIGlmICghaXNFbXB0eShleGNsdWRlZEZyb21TZWxlY3RBbGwpKSB7XG4gICAgICAgIHJvd3NGb3JTZWxlY3Rpb24gPSByb3dzRm9yU2VsZWN0aW9uLmZpbHRlcigoeyBpZCB9OiBSb3dOb2RlKSA9PiAhZXhjbHVkZWRGcm9tU2VsZWN0QWxsLmluY2x1ZGVzKGlkKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlzU2VsZWN0ZWQgPyB0aGlzLnNlbGVjdFJvd3Mocm93c0ZvclNlbGVjdGlvbikgOiB0aGlzLmRlc2VsZWN0Um93cyhyb3dzRm9yU2VsZWN0aW9uKTtcbiAgfVxuXG4gIGRlc2VsZWN0QWxsUm93cygpIHtcbiAgICB0aGlzLmFwaS5ncmlkLmRlc2VsZWN0QWxsKCk7XG4gICAgaWYgKHRoaXMuZ3JpZFF1ZXJ5LmlzU2VydmVyU2VsZWN0QWxsUm93c0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuc2V0U2VydmVyU2lkZVBhZ2luYXRpb24oeyBzZWxlY3RBbGxSb3dzRW5hYmxlZDogZmFsc2UsIGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbDogW10gfSk7XG4gICAgfVxuICB9XG5cbiAgcmVzb2x2ZVJvd0FjdGlvbnNWaXNpYmlsaXR5KCkge1xuICAgIHRoaXMuZ3JpZFF1ZXJ5Ll9yb3dBY3Rpb25WaXNpYmlsaXR5Q2hhbmdlZC5uZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogV2hlbiBwaXZvdGluZyxcbiAgICogd2UgYWRkIHRoZSBmaWVsZCBuYW1lIHRvIHRoZSBjb2x1bW4gaGVhZGVyIGNsYXNzIGluIG9yZGVyIHRvIGFjY2VzcyBpdCB0aHJvdWdoIHRoZSBhdXRvIGdlbmVyYXRlZCBwaXZvdCBjb2x1bW4uXG4gICAqL1xuICBwcml2YXRlIGluaXRQaXZvdFNlY29uZGFyeUNvbHNQcm9jZXNzKHsgZ3JpZE9wdGlvbnMgfTogTm9ybWFsaXplT3B0aW9uc1BhcmFtcykge1xuICAgIC8qKiBVc2UgcHJvY2Vzc1Bpdm90UmVzdWx0Q29sRGVmIGZyb20gdmVyIDI4ICovXG4gICAgZ3JpZE9wdGlvbnMucHJvY2Vzc1NlY29uZGFyeUNvbERlZiA9IGNvbERlZiA9PiB7XG4gICAgICBjb25zdCB1c2VyUHJvdmlkZWRDb2xEZWYgPSBjb2xEZWYucGl2b3RWYWx1ZUNvbHVtbiAmJiBjb2xEZWYucGl2b3RWYWx1ZUNvbHVtbi5nZXRVc2VyUHJvdmlkZWRDb2xEZWYoKTtcblxuICAgICAgaWYgKHVzZXJQcm92aWRlZENvbERlZikge1xuICAgICAgICBjb2xEZWYuZmlsdGVyID0gdXNlclByb3ZpZGVkQ29sRGVmLmZpbHRlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbERlZi5waXZvdEtleXMpIHtcbiAgICAgICAgY29sRGVmLnBpdm90S2V5cyA9IGNvbERlZi5waXZvdEtleXMubWFwKGtleSA9PiB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkS2V5ID0gdHJ5UGFyc2VQaXZvdFZhbHVlKGtleSk7XG5cbiAgICAgICAgICByZXR1cm4gKHBhcnNlZEtleSAmJiBwYXJzZWRLZXkudmFsdWUpIHx8ICcnO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqIFVzZSBwcm9jZXNzUGl2b3RSZXN1bHRDb2xHcm91cERlIGZyb20gdmVyIDI4ICovXG4gICAgZ3JpZE9wdGlvbnMucHJvY2Vzc1NlY29uZGFyeUNvbEdyb3VwRGVmID0gKGNvbEdyb3VwRGVmOiBDb2xHcm91cERlZikgPT4ge1xuICAgICAgaWYgKGNvbEdyb3VwRGVmLmhlYWRlck5hbWUpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVmFsdWUgPSB0cnlQYXJzZVBpdm90VmFsdWUoY29sR3JvdXBEZWYuaGVhZGVyTmFtZSk7XG5cbiAgICAgICAgaWYgKHBhcnNlZFZhbHVlKSB7XG4gICAgICAgICAgY29uc3QgeyBmaWVsZCwgdmFsdWUgfSA9IHBhcnNlZFZhbHVlO1xuXG4gICAgICAgICAgY29sR3JvdXBEZWYuaGVhZGVyQ2xhc3MgPSBbZmllbGRdO1xuICAgICAgICAgIGNvbEdyb3VwRGVmLmhlYWRlck5hbWUgPSB2YWx1ZTtcblxuICAgICAgICAgIGlmIChjb2xHcm91cERlZi5jaGlsZHJlbiAmJiBjb2xHcm91cERlZi5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb2xHcm91cERlZi5oZWFkZXJDbGFzcy5wdXNoKCdncm91cC1waXZvdC1jZWxsJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbEdyb3VwRGVmLmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IFtjb2xDaGlsZF06IGFueSA9IGNvbEdyb3VwRGVmLmNoaWxkcmVuO1xuICAgICAgICBjb25zdCBwaXZvdFRvdGFsQ29sdW1uSWRzID0gY29sQ2hpbGQgJiYgY29sQ2hpbGQucGl2b3RUb3RhbENvbHVtbklkcztcblxuICAgICAgICBpZiAocGl2b3RUb3RhbENvbHVtbklkcyAmJiBwaXZvdFRvdGFsQ29sdW1uSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb2xHcm91cERlZi5oZWFkZXJDbGFzcyA9IFsndG90YWwtcGl2b3QtY2VsbCddO1xuICAgICAgICAgIGNvbEdyb3VwRGVmLmhlYWRlck5hbWUgPSB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oJ2NvcmUudG90YWwnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29sR3JvdXBEZWYuaGVhZGVyQ2xhc3MgPSBbJ2VtcHR5LXBpdm90LWhlYWRlciddO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29sR3JvdXBEZWYucGl2b3RLZXlzKSB7XG4gICAgICAgIGNvbEdyb3VwRGVmLnBpdm90S2V5cyA9IGNvbEdyb3VwRGVmLnBpdm90S2V5cy5tYXAoa2V5ID0+IHtcbiAgICAgICAgICBjb25zdCBwYXJzZWRLZXkgPSB0cnlQYXJzZVBpdm90VmFsdWUoa2V5KTtcblxuICAgICAgICAgIHJldHVybiAocGFyc2VkS2V5ICYmIHBhcnNlZEtleS52YWx1ZSkgfHwgJyc7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNldFBpdm90TW9kZVJvd3M8VD4oZGF0YTogVFtdKSB7XG4gICAgY29uc3QgcGl2b3RDb2x1bW5zID0gdGhpcy5ncmlkUXVlcnkuZ2V0QWxsUGl2b3RDb2x1bW5zKCk7XG4gICAgY29uc3QgY29udmVydGVkRGF0YSA9IGRhdGEubWFwKChjdXJyZW50VmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBtYXBwZWRWYWx1ZXMgPSB7IC4uLmN1cnJlbnRWYWx1ZSB9O1xuXG4gICAgICBmb3IgKGNvbnN0IGNvbCBvZiBwaXZvdENvbHVtbnMpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBjb2wuZ2V0Q29sRGVmKCkuZmllbGQ7XG4gICAgICAgIGNvbnN0IHBpdm90VmFsdWU6IFBpdm90Q29sdW1uRGF0YSA9IHsgZmllbGQsIHZhbHVlOiBjdXJyZW50VmFsdWVbZmllbGRdIH07XG5cbiAgICAgICAgbWFwcGVkVmFsdWVzW2ZpZWxkXSA9IEpTT04uc3RyaW5naWZ5KHBpdm90VmFsdWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWFwcGVkVmFsdWVzO1xuICAgIH0pO1xuXG4gICAgdGhpcy5hcGkuZ3JpZC5zZXRSb3dEYXRhKGNvbnZlcnRlZERhdGEpO1xuICB9XG5cbiAgLyoqIE5vIGRlY2xhcmVkIGludGVyZmFjZSBpbiBjdXJyZW50IGdyaWQgdmVyc2lvbiB5ZXQuXG4gICAqICBSZWZlciBkb2NzIC0gaHR0cHM6Ly93d3cuYWctZ3JpZC5jb20vYW5ndWxhci1kYXRhLWdyaWQvY2VsbC1zdHlsZXMvI2NlbGwtY2xhc3MtcnVsZXMgKi9cbiAgcHJpdmF0ZSBnZXRQaXZvdE1vZGVDZWxsQ2xhc3NSdWxlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJ2V2ZW4tcm93LWdyb3VwLWxlYWYtY2VsbCc6IHRoaXMuaXNMZWFmR3JvdXBFdmVuQ2VsbC5iaW5kKHRoaXMpLFxuICAgICAgJ3Jvdy1ncm91cC1yb290LWNlbGwnOiB0aGlzLmlzUm93R3JvdXBWYWx1ZWRDZWxsLmJpbmQodGhpcylcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBpc0xlYWZHcm91cEV2ZW5DZWxsKHBhcmFtczogQ2VsbENsYXNzUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyBsZWFmR3JvdXAsIGNoaWxkSW5kZXgsIHJvd0dyb3VwSW5kZXggfSA9IHBhcmFtcy5ub2RlO1xuICAgIGNvbnN0IGNvbEluZGV4ID0gdGhpcy5nZXRDZWxsQ2xhc3NSdWxlQ29sSW5kZXgocGFyYW1zKTtcblxuICAgIHJldHVybiByb3dHcm91cEluZGV4IDw9IGNvbEluZGV4ICYmIGxlYWZHcm91cCAmJiBjaGlsZEluZGV4ICUgMiA9PT0gMDtcbiAgfVxuXG4gIHByaXZhdGUgaXNSb3dHcm91cFZhbHVlZENlbGwocGFyYW1zOiBDZWxsQ2xhc3NQYXJhbXMpOiBib29sZWFuIHtcbiAgICBjb25zdCB7IGxlYWZHcm91cCwgcm93R3JvdXBJbmRleCB9ID0gcGFyYW1zLm5vZGU7XG4gICAgY29uc3QgY29sSW5kZXggPSB0aGlzLmdldENlbGxDbGFzc1J1bGVDb2xJbmRleChwYXJhbXMpO1xuXG4gICAgcmV0dXJuIHJvd0dyb3VwSW5kZXggPD0gY29sSW5kZXggJiYgIWxlYWZHcm91cDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2VsbENsYXNzUnVsZUNvbEluZGV4KHBhcmFtczogQ2VsbENsYXNzUGFyYW1zKTogbnVtYmVyIHtcbiAgICBjb25zdCBncmlkUXVlcnkgPSBwYXJhbXMuY29sRGVmLmhlYWRlckNvbXBvbmVudFBhcmFtcy5ncmlkUXVlcnk7XG5cbiAgICBpZiAoZ3JpZFF1ZXJ5ICYmIGdyaWRRdWVyeS5hcGkpIHtcbiAgICAgIGNvbnN0IHsgY29sdW1ucyB9ID0gZ3JpZFF1ZXJ5LmFwaSBhcyBEYXRvR3JpZEFwaTtcbiAgICAgIGNvbnN0IGFsbERpc3BsYXllZENvbHVtbnMgPSBjb2x1bW5zLmdldEFsbERpc3BsYXllZENvbHVtbnMoKTtcbiAgICAgIGNvbnN0IGRpc3BsYXllZENvbHVtbiA9IGFsbERpc3BsYXllZENvbHVtbnMuZmluZChjb2wgPT4gY29sLmdldENvbElkKCkgPT09IHBhcmFtcy5jb2xEZWYuY29sSWQpO1xuXG4gICAgICByZXR1cm4gYWxsRGlzcGxheWVkQ29sdW1ucy5pbmRleE9mKGRpc3BsYXllZENvbHVtbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xuICB9XG59XG4iXX0=