igniteui-angular 12.3.13 → 12.3.14

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.
@@ -463,9 +463,6 @@ export class IgxFilteringService {
463
463
  grid.paginator.page = 0;
464
464
  }
465
465
  const fieldFilterIndex = filteringTree.findIndex(fieldName);
466
- if (fieldFilterIndex > -1) {
467
- filteringTree.filteringOperands.splice(fieldFilterIndex, 1);
468
- }
469
466
  this.prepare_filtering_expression(filteringTree, fieldName, term, conditionOrExpressionsTree, ignoreCase, fieldFilterIndex);
470
467
  grid.filteringExpressionsTree = filteringTree;
471
468
  }
@@ -474,14 +471,20 @@ export class IgxFilteringService {
474
471
  * but a new object is created and returned.
475
472
  */
476
473
  prepare_filtering_expression(filteringState, fieldName, searchVal, conditionOrExpressionsTree, ignoreCase, insertAtIndex = -1, createNewTree = false) {
477
- const expressionsTree = conditionOrExpressionsTree instanceof FilteringExpressionsTree ?
474
+ let expressionsTree = conditionOrExpressionsTree instanceof FilteringExpressionsTree ?
478
475
  conditionOrExpressionsTree : null;
479
476
  const condition = conditionOrExpressionsTree instanceof FilteringExpressionsTree ?
480
477
  null : conditionOrExpressionsTree;
481
- const newExpression = { fieldName, searchVal, condition, ignoreCase };
482
- const newExpressionsTree = createNewTree ?
483
- new FilteringExpressionsTree(filteringState.operator, filteringState.fieldName) : filteringState;
484
- // no expressions tree found for this field
478
+ let newExpressionsTree = filteringState;
479
+ if (createNewTree) {
480
+ newExpressionsTree = new FilteringExpressionsTree(filteringState.operator, filteringState.fieldName);
481
+ newExpressionsTree.filteringOperands = [...filteringState.filteringOperands];
482
+ }
483
+ if (condition) {
484
+ const newExpression = { fieldName, searchVal, condition, ignoreCase };
485
+ expressionsTree = new FilteringExpressionsTree(filteringState.operator, fieldName);
486
+ expressionsTree.filteringOperands.push(newExpression);
487
+ }
485
488
  if (expressionsTree) {
486
489
  if (insertAtIndex > -1) {
487
490
  newExpressionsTree.filteringOperands[insertAtIndex] = expressionsTree;
@@ -490,12 +493,6 @@ export class IgxFilteringService {
490
493
  newExpressionsTree.filteringOperands.push(expressionsTree);
491
494
  }
492
495
  }
493
- else if (condition) {
494
- // create expressions tree for this field and add the new expression to it
495
- const newExprTree = new FilteringExpressionsTree(filteringState.operator, fieldName);
496
- newExprTree.filteringOperands.push(newExpression);
497
- newExpressionsTree.filteringOperands.push(newExprTree);
498
- }
499
496
  return newExpressionsTree;
500
497
  }
501
498
  isFilteringTreeComplex(expressions) {
@@ -586,4 +583,4 @@ IgxFilteringService.ctorParameters = () => [
586
583
  { type: ApplicationRef },
587
584
  { type: Injector }
588
585
  ];
589
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1maWx0ZXJpbmcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9maWx0ZXJpbmcvZ3JpZC1maWx0ZXJpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsVUFBVSxFQUVWLFdBQVcsRUFDWCx3QkFBd0IsRUFDeEIsY0FBYyxFQUNkLFFBQVEsRUFHWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsd0JBQXdCLEVBQTZCLE1BQU0sa0RBQWtELENBQUM7QUFFdkgsT0FBTyxFQUF3QixjQUFjLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUM1RyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFLbEQsT0FBTyxFQUFxQyxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDekYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFDaEcsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDekcsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRS9FOztHQUVHO0FBQ0gsTUFB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QWEsQ0FBQzthQUNwRDtZQUVELGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDL0I7SUFDTCxDQUFDO0lBRU8sdUJBQXVCLENBQUMsU0FBYztRQUMxQyxJQUFJLGNBQXFDLENBQUM7UUFDMUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVU7WUFDbkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsd0JBQXdCO1lBQzFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDNUIsSUFBSTtZQUNBLGNBQWMsR0FBRyxlQUFlLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDdkU7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNaLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckIsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVO1lBQzVCLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVE7WUFDMUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDckIsTUFBTSxnQkFBZ0IsR0FBc0IsY0FBYyxDQUFDLE1BQU0sQ0FDN0QsUUFBUSxDQUNYLENBQUM7UUFDRixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVuRCxPQUFPLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztJQUNyQyxDQUFDOzs7WUF0cEJKLFVBQVU7OztZQXhDUCxXQUFXO1lBdUJOLGNBQWM7WUFOZCxpQkFBaUI7WUFoQnRCLHdCQUF3QjtZQUN4QixjQUFjO1lBQ2QsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgSW5qZWN0YWJsZSxcbiAgICBPbkRlc3Ryb3ksXG4gICAgTmdNb2R1bGVSZWYsXG4gICAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIEFwcGxpY2F0aW9uUmVmLFxuICAgIEluamVjdG9yLFxuICAgIENvbXBvbmVudFJlZixcbiAgICBDb21wb25lbnRGYWN0b3J5XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLCBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIH0gZnJvbSAnLi4vLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1leHByZXNzaW9ucy10cmVlJztcbmltcG9ydCB7IElneEdyaWRCYXNlRGlyZWN0aXZlIH0gZnJvbSAnLi4vZ3JpZC1iYXNlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJRmlsdGVyaW5nRXhwcmVzc2lvbiwgRmlsdGVyaW5nTG9naWMgfSBmcm9tICcuLi8uLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWV4cHJlc3Npb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCwgZmlyc3QgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJRm9yT2ZTdGF0ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvZm9yLW9mL2Zvcl9vZi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4Q29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi4vY29sdW1ucy9jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IElGaWx0ZXJpbmdPcGVyYXRpb24gfSBmcm9tICcuLi8uLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWNvbmRpdGlvbic7XG5pbXBvcnQgeyBJQ29sdW1uUmVzaXplRXZlbnRBcmdzLCBJRmlsdGVyaW5nRXZlbnRBcmdzIH0gZnJvbSAnLi4vY29tbW9uL2V2ZW50cyc7XG5pbXBvcnQgeyBPdmVybGF5U2V0dGluZ3MsIFBvc2l0aW9uU2V0dGluZ3MsIFZlcnRpY2FsQWxpZ25tZW50IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvb3ZlcmxheS91dGlsaXRpZXMnO1xuaW1wb3J0IHsgSWd4T3ZlcmxheVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9vdmVybGF5L292ZXJsYXknO1xuaW1wb3J0IHsgdXNlQW5pbWF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBmYWRlSW4gfSBmcm9tICcuLi8uLi9hbmltYXRpb25zL21haW4nO1xuaW1wb3J0IHsgRXhjZWxTdHlsZVBvc2l0aW9uU3RyYXRlZ3kgfSBmcm9tICcuL2V4Y2VsLXN0eWxlL2V4Y2VsLXN0eWxlLXBvc2l0aW9uLXN0cmF0ZWd5JztcbmltcG9ydCB7IEFic29sdXRlU2Nyb2xsU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9vdmVybGF5L3Njcm9sbC9hYnNvbHV0ZS1zY3JvbGwtc3RyYXRlZ3knO1xuaW1wb3J0IHsgSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQgfSBmcm9tICcuL2V4Y2VsLXN0eWxlL2dyaWQuZXhjZWwtc3R5bGUtZmlsdGVyaW5nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hJY29uU2VydmljZSB9IGZyb20gJy4uLy4uL2ljb24vaWNvbi5zZXJ2aWNlJztcbmltcG9ydCB7IGVkaXRvciwgcGluTGVmdCwgdW5waW5MZWZ0IH0gZnJvbSAnQGlnbml0ZXVpL21hdGVyaWFsLWljb25zLWV4dGVuZGVkJztcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHByZXNzaW9uVUkge1xuICAgIHB1YmxpYyBleHByZXNzaW9uOiBJRmlsdGVyaW5nRXhwcmVzc2lvbjtcbiAgICBwdWJsaWMgYmVmb3JlT3BlcmF0b3I6IEZpbHRlcmluZ0xvZ2ljO1xuICAgIHB1YmxpYyBhZnRlck9wZXJhdG9yOiBGaWx0ZXJpbmdMb2dpYztcbiAgICBwdWJsaWMgaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgIHB1YmxpYyBpc1Zpc2libGUgPSB0cnVlO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIElneEZpbHRlcmluZ1NlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIHB1YmxpYyBpc0ZpbHRlclJvd1Zpc2libGUgPSBmYWxzZTtcbiAgICBwdWJsaWMgZmlsdGVyZWRDb2x1bW46IElneENvbHVtbkNvbXBvbmVudCA9IG51bGw7XG4gICAgcHVibGljIHNlbGVjdGVkRXhwcmVzc2lvbjogSUZpbHRlcmluZ0V4cHJlc3Npb24gPSBudWxsO1xuICAgIHB1YmxpYyBjb2x1bW5Ub01vcmVJY29uSGlkZGVuID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gICAgcHVibGljIGFjdGl2ZUZpbHRlckNlbGwgPSAwO1xuICAgIHB1YmxpYyBncmlkOiBJZ3hHcmlkQmFzZURpcmVjdGl2ZTtcblxuICAgIHByaXZhdGUgY29sdW1uc1dpdGhDb21wbGV4RmlsdGVyID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSBhcmVFdmVudHNTdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG4gICAgcHJpdmF0ZSBpc0ZpbHRlcmluZyA9IGZhbHNlO1xuICAgIHByaXZhdGUgY29sdW1uVG9FeHByZXNzaW9uc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBFeHByZXNzaW9uVUlbXT4oKTtcbiAgICBwcml2YXRlIGNvbHVtblN0YXJ0SW5kZXggPSAtMTtcbiAgICBwcml2YXRlIF9jb21wb25lbnRPdmVybGF5SWQ6IHN0cmluZztcbiAgICBwcml2YXRlIF9maWx0ZXJNZW51UG9zaXRpb25TZXR0aW5nczogUG9zaXRpb25TZXR0aW5ncztcbiAgICBwcml2YXRlIF9maWx0ZXJNZW51T3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3M7XG4gICAgcHJpdmF0ZSBjb21wb25lbnRJbnN0YW5jZTogSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQ7XG4gICAgcHJpdmF0ZSBjb2x1bW47XG4gICAgcHJpdmF0ZSBsYXN0QWN0aXZlTm9kZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIF9tb2R1bGVSZWY6IE5nTW9kdWxlUmVmPGFueT4sXG4gICAgICAgIHByaXZhdGUgaWNvblNlcnZpY2U6IElneEljb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9vdmVybGF5U2VydmljZTogSWd4T3ZlcmxheVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgX2ZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgICAgICBwcml2YXRlIF9hcHBSZWY6IEFwcGxpY2F0aW9uUmVmLFxuICAgICAgICBwcml2YXRlIF9pbmplY3RvcjogSW5qZWN0b3IpIHt9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b2dnbGVGaWx0ZXJEcm9wZG93bihlbGVtZW50OiBIVE1MRWxlbWVudCwgY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jb21wb25lbnRPdmVybGF5SWQgfHwgKHRoaXMuY29sdW1uICYmIHRoaXMuY29sdW1uLmZpZWxkICE9PSBjb2x1bW4uZmllbGQpKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRGaWx0ZXJpbmdTZXR0aW5ncygpO1xuICAgICAgICAgICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJJY29uID0gdGhpcy5jb2x1bW4uZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID8gJ2lneC1leGNlbC1maWx0ZXJfX2ljb24tLWZpbHRlcmVkJyA6ICdpZ3gtZXhjZWwtZmlsdGVyX19pY29uJztcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlckljb25UYXJnZXQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2ZpbHRlckljb259YCkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlck1lbnVPdmVybGF5U2V0dGluZ3MudGFyZ2V0ID0gZmlsdGVySWNvblRhcmdldDtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlck1lbnVPdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gKHRoaXMuZ3JpZCBhcyBhbnkpLm91dGxldDtcblxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRJbnN0YW5jZSA9XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkLmV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQgPz9cbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKElneEdyaWRFeGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50KTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50SW5zdGFuY2UuaW5pdGlhbGl6ZSh0aGlzLmNvbHVtbiwgdGhpcy5fb3ZlcmxheVNlcnZpY2UpO1xuXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRPdmVybGF5SWQgPSB0aGlzLl9vdmVybGF5U2VydmljZS5hdHRhY2godGhpcy5jb21wb25lbnRJbnN0YW5jZS5lbGVtZW50LCB0aGlzLl9maWx0ZXJNZW51T3ZlcmxheVNldHRpbmdzKTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50SW5zdGFuY2Uub3ZlcmxheUNvbXBvbmVudElkID0gdGhpcy5fY29tcG9uZW50T3ZlcmxheUlkO1xuXG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5zaG93KHRoaXMuX2NvbXBvbmVudE92ZXJsYXlJZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdEZpbHRlcmluZ1NldHRpbmdzKCkge1xuICAgICAgICB0aGlzLl9maWx0ZXJNZW51UG9zaXRpb25TZXR0aW5ncyA9IHtcbiAgICAgICAgICAgIHZlcnRpY2FsU3RhcnRQb2ludDogVmVydGljYWxBbGlnbm1lbnQuQm90dG9tLFxuICAgICAgICAgICAgb3BlbkFuaW1hdGlvbjogdXNlQW5pbWF0aW9uKGZhZGVJbiwgeyBwYXJhbXM6IHsgZHVyYXRpb246ICcyNTBtcycgfX0pLFxuICAgICAgICAgICAgY2xvc2VBbmltYXRpb246IG51bGxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fZmlsdGVyTWVudU92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWUsXG4gICAgICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiBuZXcgRXhjZWxTdHlsZVBvc2l0aW9uU3RyYXRlZ3kodGhpcy5fZmlsdGVyTWVudVBvc2l0aW9uU2V0dGluZ3MpLFxuICAgICAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5KClcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5vcGVuaW5nLnBpcGUoXG4gICAgICAgICAgICBmaXJzdCgob3ZlcmxheSkgPT4gb3ZlcmxheS5pZCA9PT0gdGhpcy5fY29tcG9uZW50T3ZlcmxheUlkKSxcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RBY3RpdmVOb2RlID0gdGhpcy5ncmlkLm5hdmlnYXRpb24uYWN0aXZlTm9kZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLmNsb3NlZC5waXBlKFxuICAgICAgICAgICAgZmlyc3QoKG92ZXJsYXkpID0+IG92ZXJsYXkuaWQgPT09IHRoaXMuX2NvbXBvbmVudE92ZXJsYXlJZCksXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRJbnN0YW5jZS5jb2x1bW4gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5kZXRhY2godGhpcy5fY29tcG9uZW50T3ZlcmxheUlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb21wb25lbnRPdmVybGF5SWQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGUgPSB0aGlzLmxhc3RBY3RpdmVOb2RlO1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC50aGVhZFJvdy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGlkZUV4Y2VsRmlsdGVyaW5nKCkge1xuICAgICAgICBpZiAodGhpcy5fY29tcG9uZW50T3ZlcmxheUlkKSB7XG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5oaWRlKHRoaXMuX2NvbXBvbmVudE92ZXJsYXlJZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdWJzY3JpYmUgdG8gZ3JpZCdzIGV2ZW50cy5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3Vic2NyaWJlVG9FdmVudHMoKSB7XG4gICAgICAgIGlmICghdGhpcy5hcmVFdmVudHNTdWJzY3JpYmVkKSB7XG4gICAgICAgICAgICB0aGlzLmFyZUV2ZW50c1N1YnNjcmliZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICB0aGlzLmdyaWQuY29sdW1uUmVzaXplZC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChldmVudEFyZ3M6IElDb2x1bW5SZXNpemVFdmVudEFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZ0NlbGwoZXZlbnRBcmdzLmNvbHVtbik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5ncmlkLnBhcmVudFZpcnREaXIuY2h1bmtMb2FkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGV2ZW50QXJnczogSUZvck9mU3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRBcmdzLnN0YXJ0SW5kZXggIT09IHRoaXMuY29sdW1uU3RhcnRJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbHVtblN0YXJ0SW5kZXggPSBldmVudEFyZ3Muc3RhcnRJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkLmZpbHRlckNlbGxMaXN0LmZvckVhY2goKGZpbHRlckNlbGwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlckNlbGwudXBkYXRlRmlsdGVyQ2VsbEFyZWEoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuZ3JpZC5jb2x1bW5Nb3ZpbmdFbmQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkLmZpbHRlckNlbGxMaXN0LmZvckVhY2goKGZpbHRlckNlbGwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyQ2VsbC51cGRhdGVGaWx0ZXJDZWxsQXJlYSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZSBmaWx0ZXJpbmcgcm93IGlmIGEgY29sdW1uIGlzIGhpZGRlbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgaGlkZUZpbHRlcmluZ1Jvd09uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZShjb2w6IElneENvbHVtbkNvbXBvbmVudCkge1xuICAgICAgICBjb25zdCBmaWx0ZXJpbmdSb3cgPSB0aGlzLmdyaWQuZmlsdGVyaW5nUm93O1xuXG4gICAgICAgIGlmIChmaWx0ZXJpbmdSb3cgJiYgZmlsdGVyaW5nUm93LmNvbHVtbiAmJiBmaWx0ZXJpbmdSb3cuY29sdW1uID09PSBjb2wpIHtcbiAgICAgICAgICAgIGZpbHRlcmluZ1Jvdy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGNyZWF0ZSBleHByZXNzaW9uc1RyZWUgYW5kIGZpbHRlciBncmlkIHVzZWQgaW4gYm90aCBmaWx0ZXIgbW9kZXMuXG4gICAgICovXG4gICAgcHVibGljIGZpbHRlckludGVybmFsKGZpZWxkOiBzdHJpbmcsIGV4cHJlc3Npb25zOiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgfCBBcnJheTxFeHByZXNzaW9uVUk+ID0gbnVsbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzRmlsdGVyaW5nID0gdHJ1ZTtcblxuICAgICAgICBsZXQgZXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICBpZiAoZXhwcmVzc2lvbnMgaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpIHtcbiAgICAgICAgICAgIGV4cHJlc3Npb25zVHJlZSA9IGV4cHJlc3Npb25zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXhwcmVzc2lvbnNUcmVlID0gdGhpcy5jcmVhdGVTaW1wbGVGaWx0ZXJpbmdUcmVlKGZpZWxkLCBleHByZXNzaW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5jbGVhckZpbHRlcihmaWVsZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcihmaWVsZCwgbnVsbCwgZXhwcmVzc2lvbnNUcmVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaXNGaWx0ZXJpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIGZpbHRlcmluZyBvbiB0aGUgZ3JpZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyKGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBhbnksIGNvbmRpdGlvbk9yRXhwcmVzc2lvblRyZWU/OiBJRmlsdGVyaW5nT3BlcmF0aW9uIHwgSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSxcbiAgICAgICAgaWdub3JlQ2FzZT86IGJvb2xlYW4pIHtcblxuICAgICAgICBjb25zdCBncmlkID0gdGhpcy5ncmlkO1xuXG4gICAgICAgIGNvbnN0IGNvbCA9IGdyaWQuZ2V0Q29sdW1uQnlOYW1lKGZpZWxkKTtcbiAgICAgICAgY29uc3QgZmlsdGVyaW5nSWdub3JlQ2FzZSA9IGlnbm9yZUNhc2UgfHwgKGNvbCA/IGNvbC5maWx0ZXJpbmdJZ25vcmVDYXNlIDogZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IGZpbHRlcmluZ1RyZWUgPSBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgY29uc3QgY29sdW1uRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID0gZmlsdGVyaW5nVHJlZS5maW5kKGZpZWxkKSBhcyBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICBjb25kaXRpb25PckV4cHJlc3Npb25UcmVlID0gY29uZGl0aW9uT3JFeHByZXNzaW9uVHJlZSA/PyBjb2x1bW5GaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgICAgIGNvbnN0IGZpZWxkRmlsdGVySW5kZXggPSBmaWx0ZXJpbmdUcmVlLmZpbmRJbmRleChmaWVsZCk7XG5cbiAgICAgICAgY29uc3QgbmV3RmlsdGVyaW5nVHJlZTogRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID1cbiAgICAgICAgICAgIHRoaXMucHJlcGFyZV9maWx0ZXJpbmdfZXhwcmVzc2lvbihmaWx0ZXJpbmdUcmVlLCBmaWVsZCwgdmFsdWUsIGNvbmRpdGlvbk9yRXhwcmVzc2lvblRyZWUsXG4gICAgICAgICAgICBmaWx0ZXJpbmdJZ25vcmVDYXNlLCBmaWVsZEZpbHRlckluZGV4LCB0cnVlKTtcblxuICAgICAgICBjb25zdCBldmVudEFyZ3M6IElGaWx0ZXJpbmdFdmVudEFyZ3MgPSB7IG93bmVyOiBncmlkLFxuICAgICAgICAgICAgZmlsdGVyaW5nRXhwcmVzc2lvbnM6IG5ld0ZpbHRlcmluZ1RyZWUuZmluZChmaWVsZCkgYXMgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLCBjYW5jZWw6IGZhbHNlIH07XG4gICAgICAgIHRoaXMuZ3JpZC5maWx0ZXJpbmcuZW1pdChldmVudEFyZ3MpO1xuXG4gICAgICAgIGlmIChldmVudEFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZGl0aW9uT3JFeHByZXNzaW9uVHJlZSkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJfaW50ZXJuYWwoZmllbGQsIHZhbHVlLCBjb25kaXRpb25PckV4cHJlc3Npb25UcmVlLCBmaWx0ZXJpbmdJZ25vcmVDYXNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25zVHJlZUZvckNvbHVtbiA9IHRoaXMuZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUuZmluZChmaWVsZCk7XG4gICAgICAgICAgICBpZiAoIWV4cHJlc3Npb25zVHJlZUZvckNvbHVtbikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb25kaXRpb24gb3IgRXhwcmVzc2lvbiBUcmVlIScpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChleHByZXNzaW9uc1RyZWVGb3JDb2x1bW4gaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcl9pbnRlcm5hbChmaWVsZCwgdmFsdWUsIGV4cHJlc3Npb25zVHJlZUZvckNvbHVtbiwgZmlsdGVyaW5nSWdub3JlQ2FzZSApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleHByZXNzaW9uRm9yQ29sdW1uID0gZXhwcmVzc2lvbnNUcmVlRm9yQ29sdW1uIGFzIElGaWx0ZXJpbmdFeHByZXNzaW9uO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyX2ludGVybmFsKGZpZWxkLCB2YWx1ZSwgZXhwcmVzc2lvbkZvckNvbHVtbi5jb25kaXRpb24sIGZpbHRlcmluZ0lnbm9yZUNhc2UgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb25lRXZlbnRBcmdzID0gdGhpcy5ncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZS5maW5kKGZpZWxkKSBhcyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIHRvIHVwZGF0ZSBmaWx0ZXJlZCBkYXRhIHRocm91Z2ggdGhlIHBpcGVzIGFuZCB0aGVuIGVtaXQgdGhlIGV2ZW50LlxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5ncmlkLmZpbHRlcmluZ0RvbmUuZW1pdChkb25lRXZlbnRBcmdzKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGZpbHRlcl9nbG9iYWwodGVybSwgY29uZGl0aW9uLCBpZ25vcmVDYXNlKSB7XG4gICAgICAgIGlmICghY29uZGl0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBncmlkID0gdGhpcy5ncmlkO1xuICAgICAgICBjb25zdCBmaWx0ZXJpbmdUcmVlID0gZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgICAgIGdyaWQuY3J1ZFNlcnZpY2UuZW5kRWRpdChmYWxzZSk7XG4gICAgICAgIGlmIChncmlkLnBhZ2luYXRvcikge1xuICAgICAgICAgICAgZ3JpZC5wYWdpbmF0b3IucGFnZSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBmaWx0ZXJpbmdUcmVlLmZpbHRlcmluZ09wZXJhbmRzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGdyaWQuY29sdW1ucykge1xuICAgICAgICAgICAgdGhpcy5wcmVwYXJlX2ZpbHRlcmluZ19leHByZXNzaW9uKGZpbHRlcmluZ1RyZWUsIGNvbHVtbi5maWVsZCwgdGVybSxcbiAgICAgICAgICAgICAgICBjb25kaXRpb24sIGlnbm9yZUNhc2UgfHwgY29sdW1uLmZpbHRlcmluZ0lnbm9yZUNhc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBmaWx0ZXJpbmdUcmVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgZmlsdGVyIG9mIGEgZ2l2ZW4gY29sdW1uIGlmIG5hbWUgaXMgcHJvdmlkZWQuIE90aGVyd2lzZSBjbGVhcnMgdGhlIGZpbHRlcnMgb2YgYWxsIGNvbHVtbnMuXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyRmlsdGVyKGZpZWxkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdyaWQuZ2V0Q29sdW1uQnlOYW1lKGZpZWxkKTtcbiAgICAgICAgICAgIGlmICghY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW1wdHlGaWx0ZXIgPSBuZXcgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKG51bGwsIGZpZWxkKTtcbiAgICAgICAgY29uc3Qgb25GaWx0ZXJpbmdFdmVudEFyZ3M6IElGaWx0ZXJpbmdFdmVudEFyZ3MgPSB7XG4gICAgICAgICAgICBvd25lcjogdGhpcy5ncmlkLFxuICAgICAgICAgICAgZmlsdGVyaW5nRXhwcmVzc2lvbnM6IGVtcHR5RmlsdGVyLFxuICAgICAgICAgICAgY2FuY2VsOiBmYWxzZSB9O1xuXG4gICAgICAgIHRoaXMuZ3JpZC5maWx0ZXJpbmcuZW1pdChvbkZpbHRlcmluZ0V2ZW50QXJncyk7XG5cbiAgICAgICAgaWYgKG9uRmlsdGVyaW5nRXZlbnRBcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pc0ZpbHRlcmluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuY2xlYXJfZmlsdGVyKGZpZWxkKTtcblxuICAgICAgICAvLyBXYWl0IGZvciB0aGUgY2hhbmdlIGRldGVjdGlvbiB0byB1cGRhdGUgZmlsdGVyZWQgZGF0YSB0aHJvdWdoIHRoZSBwaXBlcyBhbmQgdGhlbiBlbWl0IHRoZSBldmVudC5cbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuZ3JpZC5maWx0ZXJpbmdEb25lLmVtaXQoZW1wdHlGaWx0ZXIpKTtcblxuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25zID0gdGhpcy5nZXRFeHByZXNzaW9ucyhmaWVsZCk7XG4gICAgICAgICAgICBleHByZXNzaW9ucy5sZW5ndGggPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ncmlkLmNvbHVtbnMuZm9yRWFjaChjID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBleHByZXNzaW9ucyA9IHRoaXMuZ2V0RXhwcmVzc2lvbnMoYy5maWVsZCk7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pc0ZpbHRlcmluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcl9maWx0ZXIoZmllbGROYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZ3JpZCA9IHRoaXMuZ3JpZDtcbiAgICAgICAgZ3JpZC5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgY29uc3QgZmlsdGVyaW5nU3RhdGUgPSBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBmaWx0ZXJpbmdTdGF0ZS5maW5kSW5kZXgoZmllbGROYW1lKTtcblxuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgZmlsdGVyaW5nU3RhdGUuZmlsdGVyaW5nT3BlcmFuZHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfSBlbHNlIGlmICghZmllbGROYW1lKSB7XG4gICAgICAgICAgICBmaWx0ZXJpbmdTdGF0ZS5maWx0ZXJpbmdPcGVyYW5kcyA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBmaWx0ZXJpbmdTdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXJzIGFsbCB0aGUgYElneENvbHVtbkNvbXBvbmVudGAgaW4gdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCB3aXRoIHRoZSBzYW1lIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyR2xvYmFsKHZhbHVlOiBhbnksIGNvbmRpdGlvbiwgaWdub3JlQ2FzZT8pIHtcbiAgICAgICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdyaWQgPSB0aGlzLmdyaWQ7XG4gICAgICAgIGNvbnN0IGZpbHRlcmluZ1RyZWUgPSBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgY29uc3QgbmV3RmlsdGVyaW5nVHJlZSA9IG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoZmlsdGVyaW5nVHJlZS5vcGVyYXRvciwgZmlsdGVyaW5nVHJlZS5maWVsZE5hbWUpO1xuXG4gICAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGdyaWQuY29sdW1ucykge1xuICAgICAgICAgICAgdGhpcy5wcmVwYXJlX2ZpbHRlcmluZ19leHByZXNzaW9uKG5ld0ZpbHRlcmluZ1RyZWUsIGNvbHVtbi5maWVsZCwgdmFsdWUsIGNvbmRpdGlvbixcbiAgICAgICAgICAgICAgICBpZ25vcmVDYXNlIHx8IGNvbHVtbi5maWx0ZXJpbmdJZ25vcmVDYXNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50QXJnczogSUZpbHRlcmluZ0V2ZW50QXJncyA9IHsgb3duZXI6IGdyaWQsIGZpbHRlcmluZ0V4cHJlc3Npb25zOiBuZXdGaWx0ZXJpbmdUcmVlLCBjYW5jZWw6IGZhbHNlIH07XG4gICAgICAgIGdyaWQuZmlsdGVyaW5nLmVtaXQoZXZlbnRBcmdzKTtcbiAgICAgICAgaWYgKGV2ZW50QXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ3JpZC5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgaWYgKGdyaWQucGFnaW5hdG9yKSB7XG4gICAgICAgICAgICBncmlkLnBhZ2luYXRvci5wYWdlID0gMDtcbiAgICAgICAgfVxuICAgICAgICBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IG5ld0ZpbHRlcmluZ1RyZWU7XG5cbiAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGNoYW5nZSBkZXRlY3Rpb24gdG8gdXBkYXRlIGZpbHRlcmVkIGRhdGEgdGhyb3VnaCB0aGUgcGlwZXMgYW5kIHRoZW4gZW1pdCB0aGUgZXZlbnQuXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLmdyaWQuZmlsdGVyaW5nRG9uZS5lbWl0KHRoaXMuZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBmaWx0ZXJpbmcgU1ZHIGljb25zIGluIHRoZSBpY29uIHNlcnZpY2UuXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyU1ZHSWNvbnMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVkaXRvckljb25zID0gZWRpdG9yIGFzIGFueVtdO1xuICAgICAgICBlZGl0b3JJY29ucy5mb3JFYWNoKGljb24gPT4gdGhpcy5pY29uU2VydmljZS5hZGRTdmdJY29uRnJvbVRleHQoaWNvbi5uYW1lLCBpY29uLnZhbHVlLCAnaW14LWljb25zJykpO1xuICAgICAgICB0aGlzLmljb25TZXJ2aWNlLmFkZFN2Z0ljb25Gcm9tVGV4dChwaW5MZWZ0Lm5hbWUsIHBpbkxlZnQudmFsdWUsICdpbXgtaWNvbnMnKTtcbiAgICAgICAgdGhpcy5pY29uU2VydmljZS5hZGRTdmdJY29uRnJvbVRleHQodW5waW5MZWZ0Lm5hbWUsIHVucGluTGVmdC52YWx1ZSwgJ2lteC1pY29ucycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIEV4cHJlc3Npb25VSSBhcnJheSBmb3IgYSBnaXZlbiBjb2x1bW4uXG4gICAgICovXG4gICAgcHVibGljIGdldEV4cHJlc3Npb25zKGNvbHVtbklkOiBzdHJpbmcpOiBFeHByZXNzaW9uVUlbXSB7XG4gICAgICAgIGlmICghdGhpcy5jb2x1bW5Ub0V4cHJlc3Npb25zTWFwLmhhcyhjb2x1bW5JZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZ3JpZC5jb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLmZpZWxkID09PSBjb2x1bW5JZCk7XG4gICAgICAgICAgICBjb25zdCBleHByZXNzaW9uVUlzID0gbmV3IEFycmF5PEV4cHJlc3Npb25VST4oKTtcbiAgICAgICAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbnNMaXN0KGNvbHVtbi5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsIHRoaXMuZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUub3BlcmF0b3IsIGV4cHJlc3Npb25VSXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uVG9FeHByZXNzaW9uc01hcC5zZXQoY29sdW1uSWQsIGV4cHJlc3Npb25VSXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGV4cHJlc3Npb25VSXM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5Ub0V4cHJlc3Npb25zTWFwLmdldChjb2x1bW5JZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjcmVhdGVzIGFsbCBFeHByZXNzaW9uVUlzIGZvciBhbGwgY29sdW1ucy4gRXhlY3V0ZWQgYWZ0ZXIgZmlsdGVyaW5nIHRvIHJlZnJlc2ggdGhlIGNhY2hlLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWZyZXNoRXhwcmVzc2lvbnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0ZpbHRlcmluZykge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5zV2l0aENvbXBsZXhGaWx0ZXIuY2xlYXIoKTtcblxuICAgICAgICAgICAgdGhpcy5jb2x1bW5Ub0V4cHJlc3Npb25zTWFwLmZvckVhY2goKHZhbHVlOiBFeHByZXNzaW9uVUlbXSwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdyaWQuY29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5maWVsZCA9PT0ga2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLmxlbmd0aCA9IDA7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb25zTGlzdChjb2x1bW4uZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLCB0aGlzLmdyaWQuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLm9wZXJhdG9yLCB2YWx1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNDb21wbGV4ID0gdGhpcy5pc0ZpbHRlcmluZ1RyZWVDb21wbGV4KGNvbHVtbi5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNDb21wbGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbnNXaXRoQ29tcGxleEZpbHRlci5hZGQoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nQ2VsbChjb2x1bW4pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uVG9FeHByZXNzaW9uc01hcC5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbiBFeHByZXNzaW9uVUkgZm9yIGEgZ2l2ZW4gY29sdW1uLlxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVFeHByZXNzaW9uKGNvbHVtbklkOiBzdHJpbmcsIGluZGV4VG9SZW1vdmU6IG51bWJlcikge1xuICAgICAgICBjb25zdCBleHByZXNzaW9uc0xpc3QgPSB0aGlzLmdldEV4cHJlc3Npb25zKGNvbHVtbklkKTtcblxuICAgICAgICBpZiAoaW5kZXhUb1JlbW92ZSA9PT0gMCAmJiBleHByZXNzaW9uc0xpc3QubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgZXhwcmVzc2lvbnNMaXN0WzFdLmJlZm9yZU9wZXJhdG9yID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChpbmRleFRvUmVtb3ZlID09PSBleHByZXNzaW9uc0xpc3QubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgZXhwcmVzc2lvbnNMaXN0W2luZGV4VG9SZW1vdmUgLSAxXS5hZnRlck9wZXJhdG9yID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4cHJlc3Npb25zTGlzdFtpbmRleFRvUmVtb3ZlIC0gMV0uYWZ0ZXJPcGVyYXRvciA9IGV4cHJlc3Npb25zTGlzdFtpbmRleFRvUmVtb3ZlICsgMV0uYmVmb3JlT3BlcmF0b3I7XG4gICAgICAgICAgICBleHByZXNzaW9uc0xpc3RbMF0uYmVmb3JlT3BlcmF0b3IgPSBudWxsO1xuICAgICAgICAgICAgZXhwcmVzc2lvbnNMaXN0W2V4cHJlc3Npb25zTGlzdC5sZW5ndGggLSAxXS5hZnRlck9wZXJhdG9yID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGV4cHJlc3Npb25zTGlzdC5zcGxpY2UoaW5kZXhUb1JlbW92ZSwgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgZmlsdGVyaW5nIHRyZWUgZm9yIGEgZ2l2ZW4gY29sdW1uIGZyb20gZXhpc3RpbmcgRXhwcmVzc2lvblVJcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlU2ltcGxlRmlsdGVyaW5nVHJlZShjb2x1bW5JZDogc3RyaW5nLCBleHByZXNzaW9uVUlMaXN0ID0gbnVsbCk6IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSB7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb25zTGlzdCA9IGV4cHJlc3Npb25VSUxpc3QgPyBleHByZXNzaW9uVUlMaXN0IDogdGhpcy5nZXRFeHByZXNzaW9ucyhjb2x1bW5JZCk7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb25zVHJlZSA9IG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoRmlsdGVyaW5nTG9naWMuT3IsIGNvbHVtbklkKTtcbiAgICAgICAgbGV0IGN1cnJBbmRCcmFuY2g6IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcblxuICAgICAgICBmb3IgKGNvbnN0IGN1cnJFeHByZXNzaW9uVUkgb2YgZXhwcmVzc2lvbnNMaXN0KSB7XG4gICAgICAgICAgICBpZiAoIWN1cnJFeHByZXNzaW9uVUkuZXhwcmVzc2lvbi5jb25kaXRpb24uaXNVbmFyeSAmJiBjdXJyRXhwcmVzc2lvblVJLmV4cHJlc3Npb24uc2VhcmNoVmFsID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJFeHByZXNzaW9uVUkuYWZ0ZXJPcGVyYXRvciA9PT0gRmlsdGVyaW5nTG9naWMuQW5kICYmICFjdXJyQW5kQnJhbmNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJBbmRCcmFuY2ggPSBuZXcgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKEZpbHRlcmluZ0xvZ2ljLkFuZCwgY29sdW1uSWQpO1xuICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uc1RyZWUuZmlsdGVyaW5nT3BlcmFuZHMucHVzaChjdXJyQW5kQnJhbmNoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgoY3VyckV4cHJlc3Npb25VSS5iZWZvcmVPcGVyYXRvciA9PT0gdW5kZWZpbmVkIHx8IGN1cnJFeHByZXNzaW9uVUkuYmVmb3JlT3BlcmF0b3IgPT09IG51bGwgfHxcbiAgICAgICAgICAgICAgICBjdXJyRXhwcmVzc2lvblVJLmJlZm9yZU9wZXJhdG9yID09PSBGaWx0ZXJpbmdMb2dpYy5PcikgJiZcbiAgICAgICAgICAgICAgICBjdXJyRXhwcmVzc2lvblVJLmFmdGVyT3BlcmF0b3IgPT09IEZpbHRlcmluZ0xvZ2ljLkFuZCkge1xuXG4gICAgICAgICAgICAgICAgY3VyckFuZEJyYW5jaCA9IG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoRmlsdGVyaW5nTG9naWMuQW5kLCBjb2x1bW5JZCk7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLnB1c2goY3VyckFuZEJyYW5jaCk7XG4gICAgICAgICAgICAgICAgY3VyckFuZEJyYW5jaC5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKGN1cnJFeHByZXNzaW9uVUkuZXhwcmVzc2lvbik7XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyckV4cHJlc3Npb25VSS5iZWZvcmVPcGVyYXRvciA9PT0gRmlsdGVyaW5nTG9naWMuQW5kKSB7XG4gICAgICAgICAgICAgICAgY3VyckFuZEJyYW5jaC5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKGN1cnJFeHByZXNzaW9uVUkuZXhwcmVzc2lvbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKGN1cnJFeHByZXNzaW9uVUkuZXhwcmVzc2lvbik7XG4gICAgICAgICAgICAgICAgY3VyckFuZEJyYW5jaCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbnNUcmVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciBhIGNvbXBsZXggZmlsdGVyIGlzIGFwcGxpZWQgdG8gYSBnaXZlbiBjb2x1bW4uXG4gICAgICovXG4gICAgcHVibGljIGlzRmlsdGVyQ29tcGxleChjb2x1bW5JZDogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbHVtbnNXaXRoQ29tcGxleEZpbHRlci5oYXMoY29sdW1uSWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZ3JpZC5jb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLmZpZWxkID09PSBjb2x1bW5JZCk7XG4gICAgICAgIGNvbnN0IGlzQ29tcGxleCA9IGNvbHVtbiAmJiB0aGlzLmlzRmlsdGVyaW5nVHJlZUNvbXBsZXgoY29sdW1uLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSk7XG4gICAgICAgIGlmIChpc0NvbXBsZXgpIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uc1dpdGhDb21wbGV4RmlsdGVyLmFkZChjb2x1bW5JZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXNDb21wbGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgRmlsdGVyaW5nTG9naWMgb3BlcmF0b3IuXG4gICAgICovXG4gICAgcHVibGljIGdldE9wZXJhdG9yQXNTdHJpbmcob3BlcmF0b3I6IEZpbHRlcmluZ0xvZ2ljKTogYW55IHtcbiAgICAgICAgaWYgKG9wZXJhdG9yID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9maWx0ZXJfb3BlcmF0b3JfYW5kO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZmlsdGVyX29wZXJhdG9yX29yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgdGhlIGxhYmVsIG9mIGEgY2hpcCBmcm9tIGEgZ2l2ZW4gZmlsdGVyaW5nIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgcHVibGljIGdldENoaXBMYWJlbChleHByZXNzaW9uOiBJRmlsdGVyaW5nRXhwcmVzc2lvbik6IGFueSB7XG4gICAgICAgIGlmIChleHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ncmlkLnJlc291cmNlU3RyaW5nc1tgaWd4X2dyaWRfZmlsdGVyXyR7ZXhwcmVzc2lvbi5jb25kaXRpb24ubmFtZX1gXSB8fCBleHByZXNzaW9uLmNvbmRpdGlvbi5uYW1lO1xuICAgICAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24uc2VhcmNoVmFsIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5ncmlkLmdldENvbHVtbkJ5TmFtZShleHByZXNzaW9uLmZpZWxkTmFtZSk7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZXIgPSBjb2x1bW4uZm9ybWF0dGVyO1xuICAgICAgICAgICAgaWYgKGZvcm1hdHRlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXR0ZXIoZXhwcmVzc2lvbi5zZWFyY2hWYWwsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwaXBlQXJncyA9IGNvbHVtbi5waXBlQXJncztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdyaWQuZGF0ZVBpcGUudHJhbnNmb3JtKGV4cHJlc3Npb24uc2VhcmNoVmFsLCBwaXBlQXJncy5mb3JtYXQsIHVuZGVmaW5lZCwgdGhpcy5ncmlkLmxvY2FsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi5zZWFyY2hWYWw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBjb250ZW50IG9mIGEgZmlsdGVyQ2VsbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlRmlsdGVyaW5nQ2VsbChjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCkge1xuICAgICAgICBjb25zdCBmaWx0ZXJDZWxsID0gY29sdW1uLmZpbHRlckNlbGw7XG4gICAgICAgIGlmIChmaWx0ZXJDZWxsKSB7XG4gICAgICAgICAgICBmaWx0ZXJDZWxsLnVwZGF0ZUZpbHRlckNlbGxBcmVhKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZpbHRlcmVkRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5maWx0ZXJlZERhdGE7XG4gICAgfVxuXG4gICAgcHVibGljIGdlbmVyYXRlRXhwcmVzc2lvbnNMaXN0KGV4cHJlc3Npb25zOiBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIHwgSUZpbHRlcmluZ0V4cHJlc3Npb24sXG4gICAgICAgIG9wZXJhdG9yOiBGaWx0ZXJpbmdMb2dpYyxcbiAgICAgICAgZXhwcmVzc2lvbnNVSXM6IEV4cHJlc3Npb25VSVtdKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uc0xpc3RSZWN1cnNpdmUoZXhwcmVzc2lvbnMsIG9wZXJhdG9yLCBleHByZXNzaW9uc1VJcyk7XG5cbiAgICAgICAgLy8gVGhlIGJlZm9yZU9wZXJhdG9yIG9mIHRoZSBmaXJzdCBleHByZXNzaW9uIGFuZCB0aGUgYWZ0ZXJPcGVyYXRvciBvZiB0aGUgbGFzdCBleHByZXNzaW9uIHNob3VsZCBiZSBudWxsXG4gICAgICAgIGlmIChleHByZXNzaW9uc1VJcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGV4cHJlc3Npb25zVUlzW2V4cHJlc3Npb25zVUlzLmxlbmd0aCAtIDFdLmFmdGVyT3BlcmF0b3IgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGlzRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlRW1wdHkoZXhwcmVzc2lvblRyZWU6IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZS5lbXB0eShleHByZXNzaW9uVHJlZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBleHByIG9mIGV4cHJlc3Npb25UcmVlLmZpbHRlcmluZ09wZXJhbmRzKSB7XG4gICAgICAgICAgICBpZiAoKGV4cHIgaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwclRyZWUgPSBleHByIGFzIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgICAgICAgICBpZiAoZXhwclRyZWUuZmlsdGVyaW5nT3BlcmFuZHMgJiYgZXhwclRyZWUuZmlsdGVyaW5nT3BlcmFuZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbHRlcl9pbnRlcm5hbChmaWVsZE5hbWU6IHN0cmluZywgdGVybSwgY29uZGl0aW9uT3JFeHByZXNzaW9uc1RyZWU6IElGaWx0ZXJpbmdPcGVyYXRpb24gfCBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLFxuICAgICAgICBpZ25vcmVDYXNlOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IGdyaWQgPSB0aGlzLmdyaWQ7XG4gICAgICAgIGNvbnN0IGZpbHRlcmluZ1RyZWUgPSBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgdGhpcy5ncmlkLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuXG4gICAgICAgIGlmIChncmlkLnBhZ2luYXRvcikge1xuICAgICAgICAgICAgZ3JpZC5wYWdpbmF0b3IucGFnZSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWVsZEZpbHRlckluZGV4ID0gZmlsdGVyaW5nVHJlZS5maW5kSW5kZXgoZmllbGROYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkRmlsdGVySW5kZXggPiAtMSkge1xuICAgICAgICAgICAgZmlsdGVyaW5nVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5zcGxpY2UoZmllbGRGaWx0ZXJJbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmVwYXJlX2ZpbHRlcmluZ19leHByZXNzaW9uKGZpbHRlcmluZ1RyZWUsIGZpZWxkTmFtZSwgdGVybSwgY29uZGl0aW9uT3JFeHByZXNzaW9uc1RyZWUsIGlnbm9yZUNhc2UsIGZpZWxkRmlsdGVySW5kZXgpO1xuICAgICAgICBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IGZpbHRlcmluZ1RyZWU7XG4gICAgfVxuXG4gICAgLyoqIE1vZGlmaWVzIHRoZSBmaWx0ZXJpbmdTdGF0ZSBvYmplY3QgdG8gY29udGFpbiB0aGUgbmV3bHkgYWRkZWQgZmlsdGVyaW5nIGNvbmRpdGlvbnMvZXhwcmVzc2lvbnMuXG4gICAgICogSWYgY3JlYXRlTmV3VHJlZSBpcyB0cnVlLCBmaWx0ZXJpbmdTdGF0ZSB3aWxsIG5vdCBiZSBtb2RpZmllZCAoYmVjYXVzZSBpdCBkaXJlY3RseSBhZmZlY3RzIHRoZSBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSksXG4gICAgICogYnV0IGEgbmV3IG9iamVjdCBpcyBjcmVhdGVkIGFuZCByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHByZXBhcmVfZmlsdGVyaW5nX2V4cHJlc3Npb24oXG4gICAgICAgIGZpbHRlcmluZ1N0YXRlOiBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLFxuICAgICAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICAgICAgc2VhcmNoVmFsLFxuICAgICAgICBjb25kaXRpb25PckV4cHJlc3Npb25zVHJlZTogSUZpbHRlcmluZ09wZXJhdGlvbiB8IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsXG4gICAgICAgIGlnbm9yZUNhc2U6IGJvb2xlYW4sXG4gICAgICAgIGluc2VydEF0SW5kZXggPSAtMSxcbiAgICAgICAgY3JlYXRlTmV3VHJlZSA9IGZhbHNlKTogRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIHtcblxuICAgICAgICBjb25zdCBleHByZXNzaW9uc1RyZWUgPSBjb25kaXRpb25PckV4cHJlc3Npb25zVHJlZSBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA/XG4gICAgICAgICAgICBjb25kaXRpb25PckV4cHJlc3Npb25zVHJlZSBhcyBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIDogbnVsbDtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gY29uZGl0aW9uT3JFeHByZXNzaW9uc1RyZWUgaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgP1xuICAgICAgICAgICAgbnVsbCA6IGNvbmRpdGlvbk9yRXhwcmVzc2lvbnNUcmVlIGFzIElGaWx0ZXJpbmdPcGVyYXRpb247XG4gICAgICAgIGNvbnN0IG5ld0V4cHJlc3Npb246IElGaWx0ZXJpbmdFeHByZXNzaW9uID0geyBmaWVsZE5hbWUsIHNlYXJjaFZhbCwgY29uZGl0aW9uLCBpZ25vcmVDYXNlIH07XG5cbiAgICAgICAgY29uc3QgbmV3RXhwcmVzc2lvbnNUcmVlOiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBjcmVhdGVOZXdUcmVlID9cbiAgICAgICAgICAgIG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoZmlsdGVyaW5nU3RhdGUub3BlcmF0b3IsIGZpbHRlcmluZ1N0YXRlLmZpZWxkTmFtZSkgOiBmaWx0ZXJpbmdTdGF0ZSBhcyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG5cbiAgICAgICAgLy8gbm8gZXhwcmVzc2lvbnMgdHJlZSBmb3VuZCBmb3IgdGhpcyBmaWVsZFxuICAgICAgICBpZiAoZXhwcmVzc2lvbnNUcmVlKSB7XG4gICAgICAgICAgICBpZiAoaW5zZXJ0QXRJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgbmV3RXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzW2luc2VydEF0SW5kZXhdID0gZXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdFeHByZXNzaW9uc1RyZWUuZmlsdGVyaW5nT3BlcmFuZHMucHVzaChleHByZXNzaW9uc1RyZWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICAgICAgLy8gY3JlYXRlIGV4cHJlc3Npb25zIHRyZWUgZm9yIHRoaXMgZmllbGQgYW5kIGFkZCB0aGUgbmV3IGV4cHJlc3Npb24gdG8gaXRcbiAgICAgICAgICAgIGNvbnN0IG5ld0V4cHJUcmVlOiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBuZXcgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKGZpbHRlcmluZ1N0YXRlLm9wZXJhdG9yLCBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgbmV3RXhwclRyZWUuZmlsdGVyaW5nT3BlcmFuZHMucHVzaChuZXdFeHByZXNzaW9uKTtcbiAgICAgICAgICAgIG5ld0V4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKG5ld0V4cHJUcmVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXdFeHByZXNzaW9uc1RyZWU7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGlzRmlsdGVyaW5nVHJlZUNvbXBsZXgoZXhwcmVzc2lvbnM6IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgfCBJRmlsdGVyaW5nRXhwcmVzc2lvbik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWV4cHJlc3Npb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXhwcmVzc2lvbnMgaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25zVHJlZSA9IGV4cHJlc3Npb25zIGFzIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgICAgIGlmIChleHByZXNzaW9uc1RyZWUub3BlcmF0b3IgPT09IEZpbHRlcmluZ0xvZ2ljLk9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYW5kT3BlcmF0b3JzQ291bnQgPSB0aGlzLmdldENoaWxkQW5kT3BlcmF0b3JzQ291bnQoZXhwcmVzc2lvbnNUcmVlKTtcblxuICAgICAgICAgICAgICAgIC8vIGhhdmluZyBtb3JlIHRoYW4gb25lICdBbmQnIG9wZXJhdG9yIGluIHRoZSBzdWItdHJlZSBtZWFucyB0aGF0IHRoZSBmaWx0ZXIgY291bGQgbm90IGJlIHJlcHJlc2VudGVkIHdpdGhvdXQgcGFyZW50aGVzZXMuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFuZE9wZXJhdG9yc0NvdW50ID4gMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGlzQ29tcGxleCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBvcGVyYW5kIG9mIGV4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcykge1xuICAgICAgICAgICAgICAgIGlzQ29tcGxleCA9IGlzQ29tcGxleCB8fCB0aGlzLmlzRmlsdGVyaW5nVHJlZUNvbXBsZXgob3BlcmFuZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBpc0NvbXBsZXg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDaGlsZEFuZE9wZXJhdG9yc0NvdW50KGV4cHJlc3Npb25zOiBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgbGV0IG9wZXJhbmQ7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwcmVzc2lvbnMuZmlsdGVyaW5nT3BlcmFuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG9wZXJhbmQgPSBleHByZXNzaW9uc1tpXTtcbiAgICAgICAgICAgIGlmIChvcGVyYW5kIGluc3RhbmNlb2YgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9wZXJhbmQub3BlcmF0b3IgPT09IEZpbHRlcmluZ0xvZ2ljLkFuZCkge1xuICAgICAgICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyB0aGlzLmdldENoaWxkQW5kT3BlcmF0b3JzQ291bnQob3BlcmFuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY291bnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZUV4cHJlc3Npb25zTGlzdFJlY3Vyc2l2ZShleHByZXNzaW9uczogSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSB8IElGaWx0ZXJpbmdFeHByZXNzaW9uLFxuICAgICAgICBvcGVyYXRvcjogRmlsdGVyaW5nTG9naWMsXG4gICAgICAgIGV4cHJlc3Npb25zVUlzOiBFeHByZXNzaW9uVUlbXSk6IHZvaWQge1xuICAgICAgICBpZiAoIWV4cHJlc3Npb25zKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXhwcmVzc2lvbnMgaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25zVHJlZSA9IGV4cHJlc3Npb25zIGFzIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgb3BlcmFuZCBvZiBleHByZXNzaW9uc1RyZWUuZmlsdGVyaW5nT3BlcmFuZHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbnNMaXN0UmVjdXJzaXZlKG9wZXJhbmQsIGV4cHJlc3Npb25zVHJlZS5vcGVyYXRvciwgZXhwcmVzc2lvbnNVSXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4cHJlc3Npb25zVUlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zVUlzW2V4cHJlc3Npb25zVUlzLmxlbmd0aCAtIDFdLmFmdGVyT3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJVSSA9IG5ldyBFeHByZXNzaW9uVUkoKTtcbiAgICAgICAgICAgIGV4cHJVSS5leHByZXNzaW9uID0gZXhwcmVzc2lvbnMgYXMgSUZpbHRlcmluZ0V4cHJlc3Npb247XG4gICAgICAgICAgICBleHByVUkuYWZ0ZXJPcGVyYXRvciA9IG9wZXJhdG9yO1xuXG4gICAgICAgICAgICBjb25zdCBwcmV2RXhwclVJID0gZXhwcmVzc2lvbnNVSXNbZXhwcmVzc2lvbnNVSXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBpZiAocHJldkV4cHJVSSkge1xuICAgICAgICAgICAgICAgIGV4cHJVSS5iZWZvcmVPcGVyYXRvciA9IHByZXZFeHByVUkuYWZ0ZXJPcGVyYXRvcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXhwcmVzc2lvbnNVSXMucHVzaChleHByVUkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShjb21wb25lbnQ6IGFueSkge1xuICAgICAgICBsZXQgZHluYW1pY0ZhY3Rvcnk6IENvbXBvbmVudEZhY3Rvcnk8YW55PjtcbiAgICAgICAgY29uc3QgZmFjdG9yeVJlc29sdmVyID0gdGhpcy5fbW9kdWxlUmVmXG4gICAgICAgICAgICA/IHRoaXMuX21vZHVsZVJlZi5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXJcbiAgICAgICAgICAgIDogdGhpcy5fZmFjdG9yeVJlc29sdmVyO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZHluYW1pY0ZhY3RvcnkgPSBmYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoY29tcG9uZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmplY3RvciA9IHRoaXMuX21vZHVsZVJlZlxuICAgICAgICAgICAgPyB0aGlzLl9tb2R1bGVSZWYuaW5qZWN0b3JcbiAgICAgICAgICAgIDogdGhpcy5faW5qZWN0b3I7XG4gICAgICAgIGNvbnN0IGR5bmFtaWNDb21wb25lbnQ6IENvbXBvbmVudFJlZjxhbnk+ID0gZHluYW1pY0ZhY3RvcnkuY3JlYXRlKFxuICAgICAgICAgICAgaW5qZWN0b3JcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5fYXBwUmVmLmF0dGFjaFZpZXcoZHluYW1pY0NvbXBvbmVudC5ob3N0Vmlldyk7XG5cbiAgICAgICAgcmV0dXJuIGR5bmFtaWNDb21wb25lbnQuaW5zdGFuY2U7XG4gICAgfVxufVxuIl19
586
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1maWx0ZXJpbmcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9maWx0ZXJpbmcvZ3JpZC1maWx0ZXJpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsVUFBVSxFQUVWLFdBQVcsRUFDWCx3QkFBd0IsRUFDeEIsY0FBYyxFQUNkLFFBQVEsRUFHWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsd0JBQXdCLEVBQTZCLE1BQU0sa0RBQWtELENBQUM7QUFFdkgsT0FBTyxFQUF3QixjQUFjLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUM1RyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFLbEQsT0FBTyxFQUFxQyxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDekYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFDaEcsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDekcsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRS9FOztHQUVHO0FBQ0gsTUFB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QyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVTtZQUNuQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyx3QkFBd0I7WUFDMUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUM1QixJQUFJO1lBQ0EsY0FBYyxHQUFHLGVBQWUsQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUN2RTtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ1osT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQixPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVU7WUFDNUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUTtZQUMxQixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNyQixNQUFNLGdCQUFnQixHQUFzQixjQUFjLENBQUMsTUFBTSxDQUM3RCxRQUFRLENBQ1gsQ0FBQztRQUNGLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRW5ELE9BQU8sZ0JBQWdCLENBQUMsUUFBUSxDQUFDO0lBQ3JDLENBQUM7OztZQXRwQkosVUFBVTs7O1lBeENQLFdBQVc7WUF1Qk4sY0FBYztZQU5kLGlCQUFpQjtZQWhCdEIsd0JBQXdCO1lBQ3hCLGNBQWM7WUFDZCxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBJbmplY3RhYmxlLFxuICAgIE9uRGVzdHJveSxcbiAgICBOZ01vZHVsZVJlZixcbiAgICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgQXBwbGljYXRpb25SZWYsXG4gICAgSW5qZWN0b3IsXG4gICAgQ29tcG9uZW50UmVmLFxuICAgIENvbXBvbmVudEZhY3Rvcnlcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsIElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgfSBmcm9tICcuLi8uLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWV4cHJlc3Npb25zLXRyZWUnO1xuaW1wb3J0IHsgSWd4R3JpZEJhc2VEaXJlY3RpdmUgfSBmcm9tICcuLi9ncmlkLWJhc2UuZGlyZWN0aXZlJztcbmltcG9ydCB7IElGaWx0ZXJpbmdFeHByZXNzaW9uLCBGaWx0ZXJpbmdMb2dpYyB9IGZyb20gJy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsLCBmaXJzdCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IElGb3JPZlN0YXRlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9mb3Itb2YvZm9yX29mLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuLi9jb2x1bW5zL2NvbHVtbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgSUZpbHRlcmluZ09wZXJhdGlvbiB9IGZyb20gJy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctY29uZGl0aW9uJztcbmltcG9ydCB7IElDb2x1bW5SZXNpemVFdmVudEFyZ3MsIElGaWx0ZXJpbmdFdmVudEFyZ3MgfSBmcm9tICcuLi9jb21tb24vZXZlbnRzJztcbmltcG9ydCB7IE92ZXJsYXlTZXR0aW5ncywgUG9zaXRpb25TZXR0aW5ncywgVmVydGljYWxBbGlnbm1lbnQgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9vdmVybGF5L3V0aWxpdGllcyc7XG5pbXBvcnQgeyBJZ3hPdmVybGF5U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL292ZXJsYXkvb3ZlcmxheSc7XG5pbXBvcnQgeyB1c2VBbmltYXRpb24gfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7IGZhZGVJbiB9IGZyb20gJy4uLy4uL2FuaW1hdGlvbnMvbWFpbic7XG5pbXBvcnQgeyBFeGNlbFN0eWxlUG9zaXRpb25TdHJhdGVneSB9IGZyb20gJy4vZXhjZWwtc3R5bGUvZXhjZWwtc3R5bGUtcG9zaXRpb24tc3RyYXRlZ3knO1xuaW1wb3J0IHsgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL292ZXJsYXkvc2Nyb2xsL2Fic29sdXRlLXNjcm9sbC1zdHJhdGVneSc7XG5pbXBvcnQgeyBJZ3hHcmlkRXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudCB9IGZyb20gJy4vZXhjZWwtc3R5bGUvZ3JpZC5leGNlbC1zdHlsZS1maWx0ZXJpbmcuY29tcG9uZW50JztcbmltcG9ydCB7IElneEljb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaWNvbi9pY29uLnNlcnZpY2UnO1xuaW1wb3J0IHsgZWRpdG9yLCBwaW5MZWZ0LCB1bnBpbkxlZnQgfSBmcm9tICdAaWduaXRldWkvbWF0ZXJpYWwtaWNvbnMtZXh0ZW5kZWQnO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4cHJlc3Npb25VSSB7XG4gICAgcHVibGljIGV4cHJlc3Npb246IElGaWx0ZXJpbmdFeHByZXNzaW9uO1xuICAgIHB1YmxpYyBiZWZvcmVPcGVyYXRvcjogRmlsdGVyaW5nTG9naWM7XG4gICAgcHVibGljIGFmdGVyT3BlcmF0b3I6IEZpbHRlcmluZ0xvZ2ljO1xuICAgIHB1YmxpYyBpc1NlbGVjdGVkID0gZmFsc2U7XG4gICAgcHVibGljIGlzVmlzaWJsZSA9IHRydWU7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSWd4RmlsdGVyaW5nU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gICAgcHVibGljIGlzRmlsdGVyUm93VmlzaWJsZSA9IGZhbHNlO1xuICAgIHB1YmxpYyBmaWx0ZXJlZENvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50ID0gbnVsbDtcbiAgICBwdWJsaWMgc2VsZWN0ZWRFeHByZXNzaW9uOiBJRmlsdGVyaW5nRXhwcmVzc2lvbiA9IG51bGw7XG4gICAgcHVibGljIGNvbHVtblRvTW9yZUljb25IaWRkZW4gPSBuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oKTtcbiAgICBwdWJsaWMgYWN0aXZlRmlsdGVyQ2VsbCA9IDA7XG4gICAgcHVibGljIGdyaWQ6IElneEdyaWRCYXNlRGlyZWN0aXZlO1xuXG4gICAgcHJpdmF0ZSBjb2x1bW5zV2l0aENvbXBsZXhGaWx0ZXIgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIGFyZUV2ZW50c1N1YnNjcmliZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgICBwcml2YXRlIGlzRmlsdGVyaW5nID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBjb2x1bW5Ub0V4cHJlc3Npb25zTWFwID0gbmV3IE1hcDxzdHJpbmcsIEV4cHJlc3Npb25VSVtdPigpO1xuICAgIHByaXZhdGUgY29sdW1uU3RhcnRJbmRleCA9IC0xO1xuICAgIHByaXZhdGUgX2NvbXBvbmVudE92ZXJsYXlJZDogc3RyaW5nO1xuICAgIHByaXZhdGUgX2ZpbHRlck1lbnVQb3NpdGlvblNldHRpbmdzOiBQb3NpdGlvblNldHRpbmdzO1xuICAgIHByaXZhdGUgX2ZpbHRlck1lbnVPdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncztcbiAgICBwcml2YXRlIGNvbXBvbmVudEluc3RhbmNlOiBJZ3hHcmlkRXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudDtcbiAgICBwcml2YXRlIGNvbHVtbjtcbiAgICBwcml2YXRlIGxhc3RBY3RpdmVOb2RlO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgX21vZHVsZVJlZjogTmdNb2R1bGVSZWY8YW55PixcbiAgICAgICAgcHJpdmF0ZSBpY29uU2VydmljZTogSWd4SWNvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgX292ZXJsYXlTZXJ2aWNlOiBJZ3hPdmVybGF5U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBfZmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgICAgIHByaXZhdGUgX2FwcFJlZjogQXBwbGljYXRpb25SZWYsXG4gICAgICAgIHByaXZhdGUgX2luamVjdG9yOiBJbmplY3Rvcikge31cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvZ2dsZUZpbHRlckRyb3Bkb3duKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuX2NvbXBvbmVudE92ZXJsYXlJZCB8fCAodGhpcy5jb2x1bW4gJiYgdGhpcy5jb2x1bW4uZmllbGQgIT09IGNvbHVtbi5maWVsZCkpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdEZpbHRlcmluZ1NldHRpbmdzKCk7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlckljb24gPSB0aGlzLmNvbHVtbi5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPyAnaWd4LWV4Y2VsLWZpbHRlcl9faWNvbi0tZmlsdGVyZWQnIDogJ2lneC1leGNlbC1maWx0ZXJfX2ljb24nO1xuICAgICAgICAgICAgY29uc3QgZmlsdGVySWNvblRhcmdldCA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcihgLiR7ZmlsdGVySWNvbn1gKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAgICAgdGhpcy5fZmlsdGVyTWVudU92ZXJsYXlTZXR0aW5ncy50YXJnZXQgPSBmaWx0ZXJJY29uVGFyZ2V0O1xuICAgICAgICAgICAgdGhpcy5fZmlsdGVyTWVudU92ZXJsYXlTZXR0aW5ncy5vdXRsZXQgPSAodGhpcy5ncmlkIGFzIGFueSkub3V0bGV0O1xuXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudEluc3RhbmNlID1cbiAgICAgICAgICAgICAgICB0aGlzLmdyaWQuZXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudCA/P1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQpO1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRJbnN0YW5jZS5pbml0aWFsaXplKHRoaXMuY29sdW1uLCB0aGlzLl9vdmVybGF5U2VydmljZSk7XG5cbiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudE92ZXJsYXlJZCA9IHRoaXMuX292ZXJsYXlTZXJ2aWNlLmF0dGFjaCh0aGlzLmNvbXBvbmVudEluc3RhbmNlLmVsZW1lbnQsIHRoaXMuX2ZpbHRlck1lbnVPdmVybGF5U2V0dGluZ3MpO1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRJbnN0YW5jZS5vdmVybGF5Q29tcG9uZW50SWQgPSB0aGlzLl9jb21wb25lbnRPdmVybGF5SWQ7XG5cbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLnNob3codGhpcy5fY29tcG9uZW50T3ZlcmxheUlkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBpbml0RmlsdGVyaW5nU2V0dGluZ3MoKSB7XG4gICAgICAgIHRoaXMuX2ZpbHRlck1lbnVQb3NpdGlvblNldHRpbmdzID0ge1xuICAgICAgICAgICAgdmVydGljYWxTdGFydFBvaW50OiBWZXJ0aWNhbEFsaWdubWVudC5Cb3R0b20sXG4gICAgICAgICAgICBvcGVuQW5pbWF0aW9uOiB1c2VBbmltYXRpb24oZmFkZUluLCB7IHBhcmFtczogeyBkdXJhdGlvbjogJzI1MG1zJyB9fSksXG4gICAgICAgICAgICBjbG9zZUFuaW1hdGlvbjogbnVsbFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9maWx0ZXJNZW51T3ZlcmxheVNldHRpbmdzID0ge1xuICAgICAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogdHJ1ZSxcbiAgICAgICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IG5ldyBFeGNlbFN0eWxlUG9zaXRpb25TdHJhdGVneSh0aGlzLl9maWx0ZXJNZW51UG9zaXRpb25TZXR0aW5ncyksXG4gICAgICAgICAgICBzY3JvbGxTdHJhdGVneTogbmV3IEFic29sdXRlU2Nyb2xsU3RyYXRlZ3koKVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLm9wZW5pbmcucGlwZShcbiAgICAgICAgICAgIGZpcnN0KChvdmVybGF5KSA9PiBvdmVybGF5LmlkID09PSB0aGlzLl9jb21wb25lbnRPdmVybGF5SWQpLFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdEFjdGl2ZU5vZGUgPSB0aGlzLmdyaWQubmF2aWdhdGlvbi5hY3RpdmVOb2RlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fb3ZlcmxheVNlcnZpY2UuY2xvc2VkLnBpcGUoXG4gICAgICAgICAgICBmaXJzdCgob3ZlcmxheSkgPT4gb3ZlcmxheS5pZCA9PT0gdGhpcy5fY29tcG9uZW50T3ZlcmxheUlkKSxcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCggICApID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wb25lbnRJbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudEluc3RhbmNlLmNvbHVtbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLmRldGFjaCh0aGlzLl9jb21wb25lbnRPdmVybGF5SWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudE92ZXJsYXlJZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkLm5hdmlnYXRpb24uYWN0aXZlTm9kZSA9IHRoaXMubGFzdEFjdGl2ZU5vZGU7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkLnRoZWFkUm93Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBoaWRlRXhjZWxGaWx0ZXJpbmcoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jb21wb25lbnRPdmVybGF5SWQpIHtcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLmhpZGUodGhpcy5fY29tcG9uZW50T3ZlcmxheUlkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN1YnNjcmliZSB0byBncmlkJ3MgZXZlbnRzLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdWJzY3JpYmVUb0V2ZW50cygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFyZUV2ZW50c1N1YnNjcmliZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXJlRXZlbnRzU3Vic2NyaWJlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIHRoaXMuZ3JpZC5jb2x1bW5SZXNpemVkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGV2ZW50QXJnczogSUNvbHVtblJlc2l6ZUV2ZW50QXJncykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nQ2VsbChldmVudEFyZ3MuY29sdW1uKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmdyaWQucGFyZW50VmlydERpci5jaHVua0xvYWQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZXZlbnRBcmdzOiBJRm9yT2ZTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChldmVudEFyZ3Muc3RhcnRJbmRleCAhPT0gdGhpcy5jb2x1bW5TdGFydEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uU3RhcnRJbmRleCA9IGV2ZW50QXJncy5zdGFydEluZGV4O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWQuZmlsdGVyQ2VsbExpc3QuZm9yRWFjaCgoZmlsdGVyQ2VsbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyQ2VsbC51cGRhdGVGaWx0ZXJDZWxsQXJlYSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5ncmlkLmNvbHVtbk1vdmluZ0VuZC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWQuZmlsdGVyQ2VsbExpc3QuZm9yRWFjaCgoZmlsdGVyQ2VsbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJDZWxsLnVwZGF0ZUZpbHRlckNlbGxBcmVhKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlIGZpbHRlcmluZyByb3cgaWYgYSBjb2x1bW4gaXMgaGlkZGVuLlxuICAgICAqL1xuICAgIHB1YmxpYyBoaWRlRmlsdGVyaW5nUm93T25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlKGNvbDogSWd4Q29sdW1uQ29tcG9uZW50KSB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmluZ1JvdyA9IHRoaXMuZ3JpZC5maWx0ZXJpbmdSb3c7XG5cbiAgICAgICAgaWYgKGZpbHRlcmluZ1JvdyAmJiBmaWx0ZXJpbmdSb3cuY29sdW1uICYmIGZpbHRlcmluZ1Jvdy5jb2x1bW4gPT09IGNvbCkge1xuICAgICAgICAgICAgZmlsdGVyaW5nUm93LmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gY3JlYXRlIGV4cHJlc3Npb25zVHJlZSBhbmQgZmlsdGVyIGdyaWQgdXNlZCBpbiBib3RoIGZpbHRlciBtb2Rlcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVySW50ZXJuYWwoZmllbGQ6IHN0cmluZywgZXhwcmVzc2lvbnM6IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSB8IEFycmF5PEV4cHJlc3Npb25VST4gPSBudWxsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNGaWx0ZXJpbmcgPSB0cnVlO1xuXG4gICAgICAgIGxldCBleHByZXNzaW9uc1RyZWU7XG4gICAgICAgIGlmIChleHByZXNzaW9ucyBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkge1xuICAgICAgICAgICAgZXhwcmVzc2lvbnNUcmVlID0gZXhwcmVzc2lvbnM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBleHByZXNzaW9uc1RyZWUgPSB0aGlzLmNyZWF0ZVNpbXBsZUZpbHRlcmluZ1RyZWUoZmllbGQsIGV4cHJlc3Npb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleHByZXNzaW9uc1RyZWUuZmlsdGVyaW5nT3BlcmFuZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyRmlsdGVyKGZpZWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyKGZpZWxkLCBudWxsLCBleHByZXNzaW9uc1RyZWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pc0ZpbHRlcmluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgZmlsdGVyaW5nIG9uIHRoZSBncmlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXIoZmllbGQ6IHN0cmluZywgdmFsdWU6IGFueSwgY29uZGl0aW9uT3JFeHByZXNzaW9uVHJlZT86IElGaWx0ZXJpbmdPcGVyYXRpb24gfCBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLFxuICAgICAgICBpZ25vcmVDYXNlPzogYm9vbGVhbikge1xuXG4gICAgICAgIGNvbnN0IGdyaWQgPSB0aGlzLmdyaWQ7XG5cbiAgICAgICAgY29uc3QgY29sID0gZ3JpZC5nZXRDb2x1bW5CeU5hbWUoZmllbGQpO1xuICAgICAgICBjb25zdCBmaWx0ZXJpbmdJZ25vcmVDYXNlID0gaWdub3JlQ2FzZSB8fCAoY29sID8gY29sLmZpbHRlcmluZ0lnbm9yZUNhc2UgOiBmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgZmlsdGVyaW5nVHJlZSA9IGdyaWQuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICBjb25zdCBjb2x1bW5GaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBmaWx0ZXJpbmdUcmVlLmZpbmQoZmllbGQpIGFzIElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgICAgIGNvbmRpdGlvbk9yRXhwcmVzc2lvblRyZWUgPSBjb25kaXRpb25PckV4cHJlc3Npb25UcmVlID8/IGNvbHVtbkZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgY29uc3QgZmllbGRGaWx0ZXJJbmRleCA9IGZpbHRlcmluZ1RyZWUuZmluZEluZGV4KGZpZWxkKTtcblxuICAgICAgICBjb25zdCBuZXdGaWx0ZXJpbmdUcmVlOiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPVxuICAgICAgICAgICAgdGhpcy5wcmVwYXJlX2ZpbHRlcmluZ19leHByZXNzaW9uKGZpbHRlcmluZ1RyZWUsIGZpZWxkLCB2YWx1ZSwgY29uZGl0aW9uT3JFeHByZXNzaW9uVHJlZSxcbiAgICAgICAgICAgIGZpbHRlcmluZ0lnbm9yZUNhc2UsIGZpZWxkRmlsdGVySW5kZXgsIHRydWUpO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50QXJnczogSUZpbHRlcmluZ0V2ZW50QXJncyA9IHsgb3duZXI6IGdyaWQsXG4gICAgICAgICAgICBmaWx0ZXJpbmdFeHByZXNzaW9uczogbmV3RmlsdGVyaW5nVHJlZS5maW5kKGZpZWxkKSBhcyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsIGNhbmNlbDogZmFsc2UgfTtcbiAgICAgICAgdGhpcy5ncmlkLmZpbHRlcmluZy5lbWl0KGV2ZW50QXJncyk7XG5cbiAgICAgICAgaWYgKGV2ZW50QXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25kaXRpb25PckV4cHJlc3Npb25UcmVlKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcl9pbnRlcm5hbChmaWVsZCwgdmFsdWUsIGNvbmRpdGlvbk9yRXhwcmVzc2lvblRyZWUsIGZpbHRlcmluZ0lnbm9yZUNhc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbnNUcmVlRm9yQ29sdW1uID0gdGhpcy5ncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZS5maW5kKGZpZWxkKTtcbiAgICAgICAgICAgIGlmICghZXhwcmVzc2lvbnNUcmVlRm9yQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbmRpdGlvbiBvciBFeHByZXNzaW9uIFRyZWUhJyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb25zVHJlZUZvckNvbHVtbiBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyX2ludGVybmFsKGZpZWxkLCB2YWx1ZSwgZXhwcmVzc2lvbnNUcmVlRm9yQ29sdW1uLCBmaWx0ZXJpbmdJZ25vcmVDYXNlICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25Gb3JDb2x1bW4gPSBleHByZXNzaW9uc1RyZWVGb3JDb2x1bW4gYXMgSUZpbHRlcmluZ0V4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJfaW50ZXJuYWwoZmllbGQsIHZhbHVlLCBleHByZXNzaW9uRm9yQ29sdW1uLmNvbmRpdGlvbiwgZmlsdGVyaW5nSWdub3JlQ2FzZSApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRvbmVFdmVudEFyZ3MgPSB0aGlzLmdyaWQuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLmZpbmQoZmllbGQpIGFzIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGNoYW5nZSBkZXRlY3Rpb24gdG8gdXBkYXRlIGZpbHRlcmVkIGRhdGEgdGhyb3VnaCB0aGUgcGlwZXMgYW5kIHRoZW4gZW1pdCB0aGUgZXZlbnQuXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLmdyaWQuZmlsdGVyaW5nRG9uZS5lbWl0KGRvbmVFdmVudEFyZ3MpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmlsdGVyX2dsb2JhbCh0ZXJtLCBjb25kaXRpb24sIGlnbm9yZUNhc2UpIHtcbiAgICAgICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdyaWQgPSB0aGlzLmdyaWQ7XG4gICAgICAgIGNvbnN0IGZpbHRlcmluZ1RyZWUgPSBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgZ3JpZC5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgaWYgKGdyaWQucGFnaW5hdG9yKSB7XG4gICAgICAgICAgICBncmlkLnBhZ2luYXRvci5wYWdlID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZpbHRlcmluZ1RyZWUuZmlsdGVyaW5nT3BlcmFuZHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgZ3JpZC5jb2x1bW5zKSB7XG4gICAgICAgICAgICB0aGlzLnByZXBhcmVfZmlsdGVyaW5nX2V4cHJlc3Npb24oZmlsdGVyaW5nVHJlZSwgY29sdW1uLmZpZWxkLCB0ZXJtLFxuICAgICAgICAgICAgICAgIGNvbmRpdGlvbiwgaWdub3JlQ2FzZSB8fCBjb2x1bW4uZmlsdGVyaW5nSWdub3JlQ2FzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IGZpbHRlcmluZ1RyZWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBmaWx0ZXIgb2YgYSBnaXZlbiBjb2x1bW4gaWYgbmFtZSBpcyBwcm92aWRlZC4gT3RoZXJ3aXNlIGNsZWFycyB0aGUgZmlsdGVycyBvZiBhbGwgY29sdW1ucy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJGaWx0ZXIoZmllbGQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZ3JpZC5nZXRDb2x1bW5CeU5hbWUoZmllbGQpO1xuICAgICAgICAgICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbXB0eUZpbHRlciA9IG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUobnVsbCwgZmllbGQpO1xuICAgICAgICBjb25zdCBvbkZpbHRlcmluZ0V2ZW50QXJnczogSUZpbHRlcmluZ0V2ZW50QXJncyA9IHtcbiAgICAgICAgICAgIG93bmVyOiB0aGlzLmdyaWQsXG4gICAgICAgICAgICBmaWx0ZXJpbmdFeHByZXNzaW9uczogZW1wdHlGaWx0ZXIsXG4gICAgICAgICAgICBjYW5jZWw6IGZhbHNlIH07XG5cbiAgICAgICAgdGhpcy5ncmlkLmZpbHRlcmluZy5lbWl0KG9uRmlsdGVyaW5nRXZlbnRBcmdzKTtcblxuICAgICAgICBpZiAob25GaWx0ZXJpbmdFdmVudEFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzRmlsdGVyaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jbGVhcl9maWx0ZXIoZmllbGQpO1xuXG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIHRvIHVwZGF0ZSBmaWx0ZXJlZCBkYXRhIHRocm91Z2ggdGhlIHBpcGVzIGFuZCB0aGVuIGVtaXQgdGhlIGV2ZW50LlxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5ncmlkLmZpbHRlcmluZ0RvbmUuZW1pdChlbXB0eUZpbHRlcikpO1xuXG4gICAgICAgIGlmIChmaWVsZCkge1xuICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbnMgPSB0aGlzLmdldEV4cHJlc3Npb25zKGZpZWxkKTtcbiAgICAgICAgICAgIGV4cHJlc3Npb25zLmxlbmd0aCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdyaWQuY29sdW1ucy5mb3JFYWNoKGMgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25zID0gdGhpcy5nZXRFeHByZXNzaW9ucyhjLmZpZWxkKTtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9ucy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzRmlsdGVyaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyX2ZpbHRlcihmaWVsZE5hbWU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBncmlkID0gdGhpcy5ncmlkO1xuICAgICAgICBncmlkLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuICAgICAgICBjb25zdCBmaWx0ZXJpbmdTdGF0ZSA9IGdyaWQuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICBjb25zdCBpbmRleCA9IGZpbHRlcmluZ1N0YXRlLmZpbmRJbmRleChmaWVsZE5hbWUpO1xuXG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICBmaWx0ZXJpbmdTdGF0ZS5maWx0ZXJpbmdPcGVyYW5kcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9IGVsc2UgaWYgKCFmaWVsZE5hbWUpIHtcbiAgICAgICAgICAgIGZpbHRlcmluZ1N0YXRlLmZpbHRlcmluZ09wZXJhbmRzID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IGZpbHRlcmluZ1N0YXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbHRlcnMgYWxsIHRoZSBgSWd4Q29sdW1uQ29tcG9uZW50YCBpbiB0aGUgYElneEdyaWRDb21wb25lbnRgIHdpdGggdGhlIHNhbWUgY29uZGl0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXJHbG9iYWwodmFsdWU6IGFueSwgY29uZGl0aW9uLCBpZ25vcmVDYXNlPykge1xuICAgICAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZ3JpZCA9IHRoaXMuZ3JpZDtcbiAgICAgICAgY29uc3QgZmlsdGVyaW5nVHJlZSA9IGdyaWQuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICBjb25zdCBuZXdGaWx0ZXJpbmdUcmVlID0gbmV3IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZShmaWx0ZXJpbmdUcmVlLm9wZXJhdG9yLCBmaWx0ZXJpbmdUcmVlLmZpZWxkTmFtZSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgZ3JpZC5jb2x1bW5zKSB7XG4gICAgICAgICAgICB0aGlzLnByZXBhcmVfZmlsdGVyaW5nX2V4cHJlc3Npb24obmV3RmlsdGVyaW5nVHJlZSwgY29sdW1uLmZpZWxkLCB2YWx1ZSwgY29uZGl0aW9uLFxuICAgICAgICAgICAgICAgIGlnbm9yZUNhc2UgfHwgY29sdW1uLmZpbHRlcmluZ0lnbm9yZUNhc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXZlbnRBcmdzOiBJRmlsdGVyaW5nRXZlbnRBcmdzID0geyBvd25lcjogZ3JpZCwgZmlsdGVyaW5nRXhwcmVzc2lvbnM6IG5ld0ZpbHRlcmluZ1RyZWUsIGNhbmNlbDogZmFsc2UgfTtcbiAgICAgICAgZ3JpZC5maWx0ZXJpbmcuZW1pdChldmVudEFyZ3MpO1xuICAgICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ncmlkLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuICAgICAgICBpZiAoZ3JpZC5wYWdpbmF0b3IpIHtcbiAgICAgICAgICAgIGdyaWQucGFnaW5hdG9yLnBhZ2UgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGdyaWQuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID0gbmV3RmlsdGVyaW5nVHJlZTtcblxuICAgICAgICAvLyBXYWl0IGZvciB0aGUgY2hhbmdlIGRldGVjdGlvbiB0byB1cGRhdGUgZmlsdGVyZWQgZGF0YSB0aHJvdWdoIHRoZSBwaXBlcyBhbmQgdGhlbiBlbWl0IHRoZSBldmVudC5cbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuZ3JpZC5maWx0ZXJpbmdEb25lLmVtaXQodGhpcy5ncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGZpbHRlcmluZyBTVkcgaWNvbnMgaW4gdGhlIGljb24gc2VydmljZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJTVkdJY29ucygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZWRpdG9ySWNvbnMgPSBlZGl0b3IgYXMgYW55W107XG4gICAgICAgIGVkaXRvckljb25zLmZvckVhY2goaWNvbiA9PiB0aGlzLmljb25TZXJ2aWNlLmFkZFN2Z0ljb25Gcm9tVGV4dChpY29uLm5hbWUsIGljb24udmFsdWUsICdpbXgtaWNvbnMnKSk7XG4gICAgICAgIHRoaXMuaWNvblNlcnZpY2UuYWRkU3ZnSWNvbkZyb21UZXh0KHBpbkxlZnQubmFtZSwgcGluTGVmdC52YWx1ZSwgJ2lteC1pY29ucycpO1xuICAgICAgICB0aGlzLmljb25TZXJ2aWNlLmFkZFN2Z0ljb25Gcm9tVGV4dCh1bnBpbkxlZnQubmFtZSwgdW5waW5MZWZ0LnZhbHVlLCAnaW14LWljb25zJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgRXhwcmVzc2lvblVJIGFycmF5IGZvciBhIGdpdmVuIGNvbHVtbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RXhwcmVzc2lvbnMoY29sdW1uSWQ6IHN0cmluZyk6IEV4cHJlc3Npb25VSVtdIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbHVtblRvRXhwcmVzc2lvbnNNYXAuaGFzKGNvbHVtbklkKSkge1xuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5ncmlkLmNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wuZmllbGQgPT09IGNvbHVtbklkKTtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25VSXMgPSBuZXcgQXJyYXk8RXhwcmVzc2lvblVJPigpO1xuICAgICAgICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uc0xpc3QoY29sdW1uLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSwgdGhpcy5ncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZS5vcGVyYXRvciwgZXhwcmVzc2lvblVJcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5Ub0V4cHJlc3Npb25zTWFwLnNldChjb2x1bW5JZCwgZXhwcmVzc2lvblVJcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvblVJcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtblRvRXhwcmVzc2lvbnNNYXAuZ2V0KGNvbHVtbklkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWNyZWF0ZXMgYWxsIEV4cHJlc3Npb25VSXMgZm9yIGFsbCBjb2x1bW5zLiBFeGVjdXRlZCBhZnRlciBmaWx0ZXJpbmcgdG8gcmVmcmVzaCB0aGUgY2FjaGUuXG4gICAgICovXG4gICAgcHVibGljIHJlZnJlc2hFeHByZXNzaW9ucygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRmlsdGVyaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbnNXaXRoQ29tcGxleEZpbHRlci5jbGVhcigpO1xuXG4gICAgICAgICAgICB0aGlzLmNvbHVtblRvRXhwcmVzc2lvbnNNYXAuZm9yRWFjaCgodmFsdWU6IEV4cHJlc3Npb25VSVtdLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZ3JpZC5jb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLmZpZWxkID09PSBrZXkpO1xuICAgICAgICAgICAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUubGVuZ3RoID0gMDtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbnNMaXN0KGNvbHVtbi5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsIHRoaXMuZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUub3BlcmF0b3IsIHZhbHVlKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0NvbXBsZXggPSB0aGlzLmlzRmlsdGVyaW5nVHJlZUNvbXBsZXgoY29sdW1uLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0NvbXBsZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uc1dpdGhDb21wbGV4RmlsdGVyLmFkZChrZXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJpbmdDZWxsKGNvbHVtbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5Ub0V4cHJlc3Npb25zTWFwLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFuIEV4cHJlc3Npb25VSSBmb3IgYSBnaXZlbiBjb2x1bW4uXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZUV4cHJlc3Npb24oY29sdW1uSWQ6IHN0cmluZywgaW5kZXhUb1JlbW92ZTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb25zTGlzdCA9IHRoaXMuZ2V0RXhwcmVzc2lvbnMoY29sdW1uSWQpO1xuXG4gICAgICAgIGlmIChpbmRleFRvUmVtb3ZlID09PSAwICYmIGV4cHJlc3Npb25zTGlzdC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBleHByZXNzaW9uc0xpc3RbMV0uYmVmb3JlT3BlcmF0b3IgPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKGluZGV4VG9SZW1vdmUgPT09IGV4cHJlc3Npb25zTGlzdC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBleHByZXNzaW9uc0xpc3RbaW5kZXhUb1JlbW92ZSAtIDFdLmFmdGVyT3BlcmF0b3IgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXhwcmVzc2lvbnNMaXN0W2luZGV4VG9SZW1vdmUgLSAxXS5hZnRlck9wZXJhdG9yID0gZXhwcmVzc2lvbnNMaXN0W2luZGV4VG9SZW1vdmUgKyAxXS5iZWZvcmVPcGVyYXRvcjtcbiAgICAgICAgICAgIGV4cHJlc3Npb25zTGlzdFswXS5iZWZvcmVPcGVyYXRvciA9IG51bGw7XG4gICAgICAgICAgICBleHByZXNzaW9uc0xpc3RbZXhwcmVzc2lvbnNMaXN0Lmxlbmd0aCAtIDFdLmFmdGVyT3BlcmF0b3IgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZXhwcmVzc2lvbnNMaXN0LnNwbGljZShpbmRleFRvUmVtb3ZlLCAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBmaWx0ZXJpbmcgdHJlZSBmb3IgYSBnaXZlbiBjb2x1bW4gZnJvbSBleGlzdGluZyBFeHByZXNzaW9uVUlzLlxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVTaW1wbGVGaWx0ZXJpbmdUcmVlKGNvbHVtbklkOiBzdHJpbmcsIGV4cHJlc3Npb25VSUxpc3QgPSBudWxsKTogRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIHtcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbnNMaXN0ID0gZXhwcmVzc2lvblVJTGlzdCA/IGV4cHJlc3Npb25VSUxpc3QgOiB0aGlzLmdldEV4cHJlc3Npb25zKGNvbHVtbklkKTtcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbnNUcmVlID0gbmV3IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZShGaWx0ZXJpbmdMb2dpYy5PciwgY29sdW1uSWQpO1xuICAgICAgICBsZXQgY3VyckFuZEJyYW5jaDogRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuXG4gICAgICAgIGZvciAoY29uc3QgY3VyckV4cHJlc3Npb25VSSBvZiBleHByZXNzaW9uc0xpc3QpIHtcbiAgICAgICAgICAgIGlmICghY3VyckV4cHJlc3Npb25VSS5leHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5ICYmIGN1cnJFeHByZXNzaW9uVUkuZXhwcmVzc2lvbi5zZWFyY2hWYWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VyckV4cHJlc3Npb25VSS5hZnRlck9wZXJhdG9yID09PSBGaWx0ZXJpbmdMb2dpYy5BbmQgJiYgIWN1cnJBbmRCcmFuY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyckFuZEJyYW5jaCA9IG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoRmlsdGVyaW5nTG9naWMuQW5kLCBjb2x1bW5JZCk7XG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKGN1cnJBbmRCcmFuY2gpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKChjdXJyRXhwcmVzc2lvblVJLmJlZm9yZU9wZXJhdG9yID09PSB1bmRlZmluZWQgfHwgY3VyckV4cHJlc3Npb25VSS5iZWZvcmVPcGVyYXRvciA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgIGN1cnJFeHByZXNzaW9uVUkuYmVmb3JlT3BlcmF0b3IgPT09IEZpbHRlcmluZ0xvZ2ljLk9yKSAmJlxuICAgICAgICAgICAgICAgIGN1cnJFeHByZXNzaW9uVUkuYWZ0ZXJPcGVyYXRvciA9PT0gRmlsdGVyaW5nTG9naWMuQW5kKSB7XG5cbiAgICAgICAgICAgICAgICBjdXJyQW5kQnJhbmNoID0gbmV3IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZShGaWx0ZXJpbmdMb2dpYy5BbmQsIGNvbHVtbklkKTtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uc1RyZWUuZmlsdGVyaW5nT3BlcmFuZHMucHVzaChjdXJyQW5kQnJhbmNoKTtcbiAgICAgICAgICAgICAgICBjdXJyQW5kQnJhbmNoLmZpbHRlcmluZ09wZXJhbmRzLnB1c2goY3VyckV4cHJlc3Npb25VSS5leHByZXNzaW9uKTtcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyRXhwcmVzc2lvblVJLmJlZm9yZU9wZXJhdG9yID09PSBGaWx0ZXJpbmdMb2dpYy5BbmQpIHtcbiAgICAgICAgICAgICAgICBjdXJyQW5kQnJhbmNoLmZpbHRlcmluZ09wZXJhbmRzLnB1c2goY3VyckV4cHJlc3Npb25VSS5leHByZXNzaW9uKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLnB1c2goY3VyckV4cHJlc3Npb25VSS5leHByZXNzaW9uKTtcbiAgICAgICAgICAgICAgICBjdXJyQW5kQnJhbmNoID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleHByZXNzaW9uc1RyZWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIGEgY29tcGxleCBmaWx0ZXIgaXMgYXBwbGllZCB0byBhIGdpdmVuIGNvbHVtbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNGaWx0ZXJDb21wbGV4KGNvbHVtbklkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuY29sdW1uc1dpdGhDb21wbGV4RmlsdGVyLmhhcyhjb2x1bW5JZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5ncmlkLmNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wuZmllbGQgPT09IGNvbHVtbklkKTtcbiAgICAgICAgY29uc3QgaXNDb21wbGV4ID0gY29sdW1uICYmIHRoaXMuaXNGaWx0ZXJpbmdUcmVlQ29tcGxleChjb2x1bW4uZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKTtcbiAgICAgICAgaWYgKGlzQ29tcGxleCkge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5zV2l0aENvbXBsZXhGaWx0ZXIuYWRkKGNvbHVtbklkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpc0NvbXBsZXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBGaWx0ZXJpbmdMb2dpYyBvcGVyYXRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0T3BlcmF0b3JBc1N0cmluZyhvcGVyYXRvcjogRmlsdGVyaW5nTG9naWMpOiBhbnkge1xuICAgICAgICBpZiAob3BlcmF0b3IgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdyaWQucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX2ZpbHRlcl9vcGVyYXRvcl9hbmQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9maWx0ZXJfb3BlcmF0b3Jfb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSB0aGUgbGFiZWwgb2YgYSBjaGlwIGZyb20gYSBnaXZlbiBmaWx0ZXJpbmcgZXhwcmVzc2lvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q2hpcExhYmVsKGV4cHJlc3Npb246IElGaWx0ZXJpbmdFeHByZXNzaW9uKTogYW55IHtcbiAgICAgICAgaWYgKGV4cHJlc3Npb24uY29uZGl0aW9uLmlzVW5hcnkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdyaWQucmVzb3VyY2VTdHJpbmdzW2BpZ3hfZ3JpZF9maWx0ZXJfJHtleHByZXNzaW9uLmNvbmRpdGlvbi5uYW1lfWBdIHx8IGV4cHJlc3Npb24uY29uZGl0aW9uLm5hbWU7XG4gICAgICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5zZWFyY2hWYWwgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdyaWQuZ2V0Q29sdW1uQnlOYW1lKGV4cHJlc3Npb24uZmllbGROYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlciA9IGNvbHVtbi5mb3JtYXR0ZXI7XG4gICAgICAgICAgICBpZiAoZm9ybWF0dGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvcm1hdHRlcihleHByZXNzaW9uLnNlYXJjaFZhbCwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBpcGVBcmdzID0gY29sdW1uLnBpcGVBcmdzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5kYXRlUGlwZS50cmFuc2Zvcm0oZXhwcmVzc2lvbi5zZWFyY2hWYWwsIHBpcGVBcmdzLmZvcm1hdCwgdW5kZWZpbmVkLCB0aGlzLmdyaWQubG9jYWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBleHByZXNzaW9uLnNlYXJjaFZhbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGNvbnRlbnQgb2YgYSBmaWx0ZXJDZWxsLlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVGaWx0ZXJpbmdDZWxsKGNvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50KSB7XG4gICAgICAgIGNvbnN0IGZpbHRlckNlbGwgPSBjb2x1bW4uZmlsdGVyQ2VsbDtcbiAgICAgICAgaWYgKGZpbHRlckNlbGwpIHtcbiAgICAgICAgICAgIGZpbHRlckNlbGwudXBkYXRlRmlsdGVyQ2VsbEFyZWEoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmlsdGVyZWREYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkLmZpbHRlcmVkRGF0YTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2VuZXJhdGVFeHByZXNzaW9uc0xpc3QoZXhwcmVzc2lvbnM6IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgfCBJRmlsdGVyaW5nRXhwcmVzc2lvbixcbiAgICAgICAgb3BlcmF0b3I6IEZpbHRlcmluZ0xvZ2ljLFxuICAgICAgICBleHByZXNzaW9uc1VJczogRXhwcmVzc2lvblVJW10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb25zTGlzdFJlY3Vyc2l2ZShleHByZXNzaW9ucywgb3BlcmF0b3IsIGV4cHJlc3Npb25zVUlzKTtcblxuICAgICAgICAvLyBUaGUgYmVmb3JlT3BlcmF0b3Igb2YgdGhlIGZpcnN0IGV4cHJlc3Npb24gYW5kIHRoZSBhZnRlck9wZXJhdG9yIG9mIHRoZSBsYXN0IGV4cHJlc3Npb24gc2hvdWxkIGJlIG51bGxcbiAgICAgICAgaWYgKGV4cHJlc3Npb25zVUlzLmxlbmd0aCkge1xuICAgICAgICAgICAgZXhwcmVzc2lvbnNVSXNbZXhwcmVzc2lvbnNVSXMubGVuZ3RoIC0gMV0uYWZ0ZXJPcGVyYXRvciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaXNGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVFbXB0eShleHByZXNzaW9uVHJlZTogSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLmVtcHR5KGV4cHJlc3Npb25UcmVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGV4cHIgb2YgZXhwcmVzc2lvblRyZWUuZmlsdGVyaW5nT3BlcmFuZHMpIHtcbiAgICAgICAgICAgIGlmICgoZXhwciBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleHByVHJlZSA9IGV4cHIgYXMgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICAgICAgICAgIGlmIChleHByVHJlZS5maWx0ZXJpbmdPcGVyYW5kcyAmJiBleHByVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmlsdGVyX2ludGVybmFsKGZpZWxkTmFtZTogc3RyaW5nLCB0ZXJtLCBjb25kaXRpb25PckV4cHJlc3Npb25zVHJlZTogSUZpbHRlcmluZ09wZXJhdGlvbiB8IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsXG4gICAgICAgIGlnbm9yZUNhc2U6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgZ3JpZCA9IHRoaXMuZ3JpZDtcbiAgICAgICAgY29uc3QgZmlsdGVyaW5nVHJlZSA9IGdyaWQuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICB0aGlzLmdyaWQuY3J1ZFNlcnZpY2UuZW5kRWRpdChmYWxzZSk7XG5cbiAgICAgICAgaWYgKGdyaWQucGFnaW5hdG9yKSB7XG4gICAgICAgICAgICBncmlkLnBhZ2luYXRvci5wYWdlID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpZWxkRmlsdGVySW5kZXggPSBmaWx0ZXJpbmdUcmVlLmZpbmRJbmRleChmaWVsZE5hbWUpO1xuICAgICAgICB0aGlzLnByZXBhcmVfZmlsdGVyaW5nX2V4cHJlc3Npb24oZmlsdGVyaW5nVHJlZSwgZmllbGROYW1lLCB0ZXJtLCBjb25kaXRpb25PckV4cHJlc3Npb25zVHJlZSwgaWdub3JlQ2FzZSwgZmllbGRGaWx0ZXJJbmRleCk7XG4gICAgICAgIGdyaWQuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID0gZmlsdGVyaW5nVHJlZTtcbiAgICB9XG5cbiAgICAvKiogTW9kaWZpZXMgdGhlIGZpbHRlcmluZ1N0YXRlIG9iamVjdCB0byBjb250YWluIHRoZSBuZXdseSBhZGRlZCBmaWx0ZXJpbmcgY29uZGl0aW9ucy9leHByZXNzaW9ucy5cbiAgICAgKiBJZiBjcmVhdGVOZXdUcmVlIGlzIHRydWUsIGZpbHRlcmluZ1N0YXRlIHdpbGwgbm90IGJlIG1vZGlmaWVkIChiZWNhdXNlIGl0IGRpcmVjdGx5IGFmZmVjdHMgdGhlIGdyaWQuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSxcbiAgICAgKiBidXQgYSBuZXcgb2JqZWN0IGlzIGNyZWF0ZWQgYW5kIHJldHVybmVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgcHJlcGFyZV9maWx0ZXJpbmdfZXhwcmVzc2lvbihcbiAgICAgICAgZmlsdGVyaW5nU3RhdGU6IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsXG4gICAgICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgICAgICBzZWFyY2hWYWwsXG4gICAgICAgIGNvbmRpdGlvbk9yRXhwcmVzc2lvbnNUcmVlOiBJRmlsdGVyaW5nT3BlcmF0aW9uIHwgSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSxcbiAgICAgICAgaWdub3JlQ2FzZTogYm9vbGVhbixcbiAgICAgICAgaW5zZXJ0QXRJbmRleCA9IC0xLFxuICAgICAgICBjcmVhdGVOZXdUcmVlID0gZmFsc2UpOiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUge1xuXG4gICAgICAgIGxldCBleHByZXNzaW9uc1RyZWUgPSBjb25kaXRpb25PckV4cHJlc3Npb25zVHJlZSBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA/XG4gICAgICAgICAgICBjb25kaXRpb25PckV4cHJlc3Npb25zVHJlZSBhcyBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIDogbnVsbDtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gY29uZGl0aW9uT3JFeHByZXNzaW9uc1RyZWUgaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgP1xuICAgICAgICAgICAgbnVsbCA6IGNvbmRpdGlvbk9yRXhwcmVzc2lvbnNUcmVlIGFzIElGaWx0ZXJpbmdPcGVyYXRpb247XG5cbiAgICAgICAgbGV0IG5ld0V4cHJlc3Npb25zVHJlZSA9IGZpbHRlcmluZ1N0YXRlIGFzIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcblxuICAgICAgICBpZiAoY3JlYXRlTmV3VHJlZSkge1xuICAgICAgICAgICAgbmV3RXhwcmVzc2lvbnNUcmVlID0gbmV3IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZShmaWx0ZXJpbmdTdGF0ZS5vcGVyYXRvciwgZmlsdGVyaW5nU3RhdGUuZmllbGROYW1lKTtcbiAgICAgICAgICAgIG5ld0V4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcyA9IFsuLi5maWx0ZXJpbmdTdGF0ZS5maWx0ZXJpbmdPcGVyYW5kc107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZGl0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFeHByZXNzaW9uOiBJRmlsdGVyaW5nRXhwcmVzc2lvbiA9IHsgZmllbGROYW1lLCBzZWFyY2hWYWwsIGNvbmRpdGlvbiwgaWdub3JlQ2FzZSB9O1xuICAgICAgICAgICAgZXhwcmVzc2lvbnNUcmVlID0gbmV3IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZShmaWx0ZXJpbmdTdGF0ZS5vcGVyYXRvciwgZmllbGROYW1lKTtcbiAgICAgICAgICAgIGV4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKG5ld0V4cHJlc3Npb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV4cHJlc3Npb25zVHJlZSkge1xuICAgICAgICAgICAgaWYgKGluc2VydEF0SW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIG5ld0V4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kc1tpbnNlcnRBdEluZGV4XSA9IGV4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3RXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLnB1c2goZXhwcmVzc2lvbnNUcmVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXdFeHByZXNzaW9uc1RyZWU7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGlzRmlsdGVyaW5nVHJlZUNvbXBsZXgoZXhwcmVzc2lvbnM6IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgfCBJRmlsdGVyaW5nRXhwcmVzc2lvbik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWV4cHJlc3Npb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXhwcmVzc2lvbnMgaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25zVHJlZSA9IGV4cHJlc3Npb25zIGFzIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgICAgIGlmIChleHByZXNzaW9uc1RyZWUub3BlcmF0b3IgPT09IEZpbHRlcmluZ0xvZ2ljLk9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYW5kT3BlcmF0b3JzQ291bnQgPSB0aGlzLmdldENoaWxkQW5kT3BlcmF0b3JzQ291bnQoZXhwcmVzc2lvbnNUcmVlKTtcblxuICAgICAgICAgICAgICAgIC8vIGhhdmluZyBtb3JlIHRoYW4gb25lICdBbmQnIG9wZXJhdG9yIGluIHRoZSBzdWItdHJlZSBtZWFucyB0aGF0IHRoZSBmaWx0ZXIgY291bGQgbm90IGJlIHJlcHJlc2VudGVkIHdpdGhvdXQgcGFyZW50aGVzZXMuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFuZE9wZXJhdG9yc0NvdW50ID4gMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGlzQ29tcGxleCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBvcGVyYW5kIG9mIGV4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcykge1xuICAgICAgICAgICAgICAgIGlzQ29tcGxleCA9IGlzQ29tcGxleCB8fCB0aGlzLmlzRmlsdGVyaW5nVHJlZUNvbXBsZXgob3BlcmFuZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBpc0NvbXBsZXg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDaGlsZEFuZE9wZXJhdG9yc0NvdW50KGV4cHJlc3Npb25zOiBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgbGV0IG9wZXJhbmQ7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwcmVzc2lvbnMuZmlsdGVyaW5nT3BlcmFuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG9wZXJhbmQgPSBleHByZXNzaW9uc1tpXTtcbiAgICAgICAgICAgIGlmIChvcGVyYW5kIGluc3RhbmNlb2YgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9wZXJhbmQub3BlcmF0b3IgPT09IEZpbHRlcmluZ0xvZ2ljLkFuZCkge1xuICAgICAgICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyB0aGlzLmdldENoaWxkQW5kT3BlcmF0b3JzQ291bnQob3BlcmFuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY291bnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZUV4cHJlc3Npb25zTGlzdFJlY3Vyc2l2ZShleHByZXNzaW9uczogSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSB8IElGaWx0ZXJpbmdFeHByZXNzaW9uLFxuICAgICAgICBvcGVyYXRvcjogRmlsdGVyaW5nTG9naWMsXG4gICAgICAgIGV4cHJlc3Npb25zVUlzOiBFeHByZXNzaW9uVUlbXSk6IHZvaWQge1xuICAgICAgICBpZiAoIWV4cHJlc3Npb25zKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXhwcmVzc2lvbnMgaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25zVHJlZSA9IGV4cHJlc3Npb25zIGFzIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgb3BlcmFuZCBvZiBleHByZXNzaW9uc1RyZWUuZmlsdGVyaW5nT3BlcmFuZHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbnNMaXN0UmVjdXJzaXZlKG9wZXJhbmQsIGV4cHJlc3Npb25zVHJlZS5vcGVyYXRvciwgZXhwcmVzc2lvbnNVSXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4cHJlc3Npb25zVUlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zVUlzW2V4cHJlc3Npb25zVUlzLmxlbmd0aCAtIDFdLmFmdGVyT3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJVSSA9IG5ldyBFeHByZXNzaW9uVUkoKTtcbiAgICAgICAgICAgIGV4cHJVSS5leHByZXNzaW9uID0gZXhwcmVzc2lvbnMgYXMgSUZpbHRlcmluZ0V4cHJlc3Npb247XG4gICAgICAgICAgICBleHByVUkuYWZ0ZXJPcGVyYXRvciA9IG9wZXJhdG9yO1xuXG4gICAgICAgICAgICBjb25zdCBwcmV2RXhwclVJID0gZXhwcmVzc2lvbnNVSXNbZXhwcmVzc2lvbnNVSXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBpZiAocHJldkV4cHJVSSkge1xuICAgICAgICAgICAgICAgIGV4cHJVSS5iZWZvcmVPcGVyYXRvciA9IHByZXZFeHByVUkuYWZ0ZXJPcGVyYXRvcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXhwcmVzc2lvbnNVSXMucHVzaChleHByVUkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShjb21wb25lbnQ6IGFueSkge1xuICAgICAgICBsZXQgZHluYW1pY0ZhY3Rvcnk6IENvbXBvbmVudEZhY3Rvcnk8YW55PjtcbiAgICAgICAgY29uc3QgZmFjdG9yeVJlc29sdmVyID0gdGhpcy5fbW9kdWxlUmVmXG4gICAgICAgICAgICA/IHRoaXMuX21vZHVsZVJlZi5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXJcbiAgICAgICAgICAgIDogdGhpcy5fZmFjdG9yeVJlc29sdmVyO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZHluYW1pY0ZhY3RvcnkgPSBmYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoY29tcG9uZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmplY3RvciA9IHRoaXMuX21vZHVsZVJlZlxuICAgICAgICAgICAgPyB0aGlzLl9tb2R1bGVSZWYuaW5qZWN0b3JcbiAgICAgICAgICAgIDogdGhpcy5faW5qZWN0b3I7XG4gICAgICAgIGNvbnN0IGR5bmFtaWNDb21wb25lbnQ6IENvbXBvbmVudFJlZjxhbnk+ID0gZHluYW1pY0ZhY3RvcnkuY3JlYXRlKFxuICAgICAgICAgICAgaW5qZWN0b3JcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5fYXBwUmVmLmF0dGFjaFZpZXcoZHluYW1pY0NvbXBvbmVudC5ob3N0Vmlldyk7XG5cbiAgICAgICAgcmV0dXJuIGR5bmFtaWNDb21wb25lbnQuaW5zdGFuY2U7XG4gICAgfVxufVxuIl19
@@ -40164,9 +40164,6 @@ class IgxFilteringService {
40164
40164
  grid.paginator.page = 0;
40165
40165
  }
40166
40166
  const fieldFilterIndex = filteringTree.findIndex(fieldName);
40167
- if (fieldFilterIndex > -1) {
40168
- filteringTree.filteringOperands.splice(fieldFilterIndex, 1);
40169
- }
40170
40167
  this.prepare_filtering_expression(filteringTree, fieldName, term, conditionOrExpressionsTree, ignoreCase, fieldFilterIndex);
40171
40168
  grid.filteringExpressionsTree = filteringTree;
40172
40169
  }
@@ -40175,14 +40172,20 @@ class IgxFilteringService {
40175
40172
  * but a new object is created and returned.
40176
40173
  */
40177
40174
  prepare_filtering_expression(filteringState, fieldName, searchVal, conditionOrExpressionsTree, ignoreCase, insertAtIndex = -1, createNewTree = false) {
40178
- const expressionsTree = conditionOrExpressionsTree instanceof FilteringExpressionsTree ?
40175
+ let expressionsTree = conditionOrExpressionsTree instanceof FilteringExpressionsTree ?
40179
40176
  conditionOrExpressionsTree : null;
40180
40177
  const condition = conditionOrExpressionsTree instanceof FilteringExpressionsTree ?
40181
40178
  null : conditionOrExpressionsTree;
40182
- const newExpression = { fieldName, searchVal, condition, ignoreCase };
40183
- const newExpressionsTree = createNewTree ?
40184
- new FilteringExpressionsTree(filteringState.operator, filteringState.fieldName) : filteringState;
40185
- // no expressions tree found for this field
40179
+ let newExpressionsTree = filteringState;
40180
+ if (createNewTree) {
40181
+ newExpressionsTree = new FilteringExpressionsTree(filteringState.operator, filteringState.fieldName);
40182
+ newExpressionsTree.filteringOperands = [...filteringState.filteringOperands];
40183
+ }
40184
+ if (condition) {
40185
+ const newExpression = { fieldName, searchVal, condition, ignoreCase };
40186
+ expressionsTree = new FilteringExpressionsTree(filteringState.operator, fieldName);
40187
+ expressionsTree.filteringOperands.push(newExpression);
40188
+ }
40186
40189
  if (expressionsTree) {
40187
40190
  if (insertAtIndex > -1) {
40188
40191
  newExpressionsTree.filteringOperands[insertAtIndex] = expressionsTree;
@@ -40191,12 +40194,6 @@ class IgxFilteringService {
40191
40194
  newExpressionsTree.filteringOperands.push(expressionsTree);
40192
40195
  }
40193
40196
  }
40194
- else if (condition) {
40195
- // create expressions tree for this field and add the new expression to it
40196
- const newExprTree = new FilteringExpressionsTree(filteringState.operator, fieldName);
40197
- newExprTree.filteringOperands.push(newExpression);
40198
- newExpressionsTree.filteringOperands.push(newExprTree);
40199
- }
40200
40197
  return newExpressionsTree;
40201
40198
  }
40202
40199
  isFilteringTreeComplex(expressions) {