@decaf-ts/for-angular 0.0.19 → 0.0.20

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 (38) hide show
  1. package/README.md +2 -2
  2. package/components/crud-form/crud-form.component.d.ts +1 -1
  3. package/components/fieldset/fieldset.component.d.ts +1 -1
  4. package/components/filter/filter.component.d.ts +1 -1
  5. package/components/for-angular-components.module.d.ts +1 -2
  6. package/components/list/constants.d.ts +5 -9
  7. package/components/list-item/list-item.component.d.ts +1 -1
  8. package/engine/NgxBaseComponent.d.ts +1 -1
  9. package/esm2022/components/component-renderer/component-renderer.component.mjs +7 -7
  10. package/esm2022/components/crud-field/crud-field.component.mjs +13 -12
  11. package/esm2022/components/crud-form/crud-form.component.mjs +9 -9
  12. package/esm2022/components/empty-state/empty-state.component.mjs +8 -12
  13. package/esm2022/components/fieldset/fieldset.component.mjs +27 -19
  14. package/esm2022/components/filter/filter.component.mjs +14 -13
  15. package/esm2022/components/for-angular-components.module.mjs +17 -9
  16. package/esm2022/components/layout/layout.component.mjs +6 -7
  17. package/esm2022/components/list/constants.mjs +1 -1
  18. package/esm2022/components/list/list.component.mjs +6 -11
  19. package/esm2022/components/list-item/list-item.component.mjs +7 -12
  20. package/esm2022/components/model-renderer/model-renderer.component.mjs +5 -7
  21. package/esm2022/components/pagination/pagination.component.mjs +8 -9
  22. package/esm2022/components/searchbar/searchbar.component.mjs +5 -7
  23. package/esm2022/directives/collapsable.directive.mjs +3 -3
  24. package/esm2022/engine/NgxBaseComponent.mjs +11 -10
  25. package/esm2022/engine/NgxFormService.mjs +12 -3
  26. package/esm2022/engine/NgxRenderingEngine.mjs +3 -2
  27. package/esm2022/for-angular-common.module.mjs +82 -0
  28. package/esm2022/helpers/utils.mjs +2 -2
  29. package/esm2022/i18n/Loader.mjs +10 -6
  30. package/esm2022/i18n/data/en.json +80 -0
  31. package/esm2022/public-apis.mjs +3 -2
  32. package/fesm2022/decaf-ts-for-angular.mjs +254 -170
  33. package/fesm2022/decaf-ts-for-angular.mjs.map +1 -1
  34. package/for-angular-common.module.d.ts +44 -0
  35. package/package.json +6 -3
  36. package/public-apis.d.ts +2 -1
  37. package/esm2022/for-angular.module.mjs +0 -118
  38. package/for-angular.module.d.ts +0 -45
@@ -1,11 +1,11 @@
1
1
  import { Input, Component, Inject, ViewChild, ElementRef, Output, EventEmitter, } from '@angular/core';
2
- import { generateRandomValue, getInjectablesRegistry, getOnWindow, isDevelopmentMode, stringToBoolean } from '../helpers/utils';
2
+ import { generateRandomValue, getInjectablesRegistry, getOnWindow, isDevelopmentMode, stringToBoolean, } from '../helpers/utils';
3
3
  import { getLocaleContext } from '../i18n/Loader';
4
4
  import { Model } from '@decaf-ts/decorator-validation';
5
- import { InternalError, OperationKeys } from '@decaf-ts/db-decorators';
5
+ import { InternalError, OperationKeys, } from '@decaf-ts/db-decorators';
6
6
  import { BaseComponentProps } from './constants';
7
7
  import { NgxRenderingEngine } from './NgxRenderingEngine';
8
- import { getLogger } from '../for-angular.module';
8
+ import { getLogger } from '../for-angular-common.module';
9
9
  import { Repository } from '@decaf-ts/core';
10
10
  import { RamAdapter } from '@decaf-ts/core/ram';
11
11
  import * as i0 from "@angular/core";
@@ -261,13 +261,14 @@ export class NgxBaseComponent {
261
261
  throw new InternalError('Cannot find model. was it registered with @model?');
262
262
  let dbAdapterFlavour = getOnWindow('dbAdapterFlavour');
263
263
  if (!dbAdapterFlavour && isDevelopmentMode()) {
264
- const adapter = new RamAdapter();
264
+ const adapter = new RamAdapter({ user: 'user' });
265
265
  dbAdapterFlavour = adapter.flavour;
266
266
  }
267
267
  this._repository = Repository.forModel(constructor, dbAdapterFlavour);
268
268
  this.model = new constructor();
269
269
  if (this.model && !this.pk)
270
- this.pk = this._repository.pk || 'id';
270
+ this.pk =
271
+ this._repository.pk || 'id';
271
272
  }
272
273
  }
273
274
  catch (error) {
@@ -490,14 +491,14 @@ export class NgxBaseComponent {
490
491
  this[key] = this.props[key];
491
492
  });
492
493
  }
493
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgxBaseComponent, deps: [{ token: 'instanceToken' }], target: i0.ɵɵFactoryTarget.Component }); }
494
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NgxBaseComponent, isStandalone: true, selector: "ng-component", inputs: { rendererId: "rendererId", model: "model", props: "props", item: "item", pk: "pk", route: "route", operations: "operations", uid: "uid", mapper: "mapper", locale: "locale", translatable: "translatable", className: "className", mode: "mode", renderChild: "renderChild" }, outputs: { listenEvent: "listenEvent" }, host: { properties: { "attr.id": "uid" } }, viewQueries: [{ propertyName: "component", first: true, predicate: ["component"], descendants: true, read: ElementRef, static: true }], usesOnChanges: true, ngImport: i0, template: '<div><div>', isInline: true }); }
494
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NgxBaseComponent, deps: [{ token: 'instanceToken' }], target: i0.ɵɵFactoryTarget.Component }); }
495
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: NgxBaseComponent, isStandalone: true, selector: "ng-component", inputs: { rendererId: "rendererId", model: "model", props: "props", item: "item", pk: "pk", route: "route", operations: "operations", uid: "uid", mapper: "mapper", locale: "locale", translatable: "translatable", className: "className", mode: "mode", renderChild: "renderChild" }, outputs: { listenEvent: "listenEvent" }, host: { properties: { "attr.id": "uid" } }, viewQueries: [{ propertyName: "component", first: true, predicate: ["component"], descendants: true, read: ElementRef, static: true }], usesOnChanges: true, ngImport: i0, template: '<div></div>', isInline: true }); }
495
496
  }
496
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgxBaseComponent, decorators: [{
497
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NgxBaseComponent, decorators: [{
497
498
  type: Component,
498
499
  args: [{
499
500
  standalone: true,
500
- template: '<div><div>',
501
+ template: '<div></div>',
501
502
  host: { '[attr.id]': 'uid' },
502
503
  }]
503
504
  }], ctorParameters: () => [{ type: undefined, decorators: [{
@@ -537,4 +538,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
537
538
  }], listenEvent: [{
538
539
  type: Output
539
540
  }] } });
540
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmd4QmFzZUNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL05neEJhc2VDb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLEtBQUssRUFDTCxTQUFTLEVBQ1QsTUFBTSxFQUNOLFNBQVMsRUFDVCxVQUFVLEVBR1YsTUFBTSxFQUNOLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0QixXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDaEIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkQsT0FBTyxFQUVMLGFBQWEsRUFDYixhQUFhLEVBQ2QsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFMUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWxELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0FBRWhEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkRHO0FBTUgsTUFBTSxPQUFnQixnQkFBZ0I7SUFzU3BDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FpQ0c7SUFDSCx5REFBeUQ7SUFDekQsWUFBeUQsUUFBZ0I7UUFBaEIsYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQWhRekU7Ozs7Ozs7Ozs7O1dBV0c7UUFFSCxVQUFLLEdBQTRCLEVBQUUsQ0FBQztRQUVwQzs7Ozs7Ozs7Ozs7V0FXRztRQUVILFNBQUksR0FBNEIsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUM7UUF5QjVDOzs7Ozs7O1dBT0c7UUFFSCxlQUFVLEdBQXFCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBYXBEOzs7Ozs7O1dBT0c7UUFFSCxXQUFNLEdBQTJCLEVBQUUsQ0FBQztRQWdCcEM7Ozs7Ozs7Ozs7V0FVRztRQUVILGlCQUFZLEdBQW9CLElBQUksQ0FBQztRQUVyQzs7Ozs7Ozs7OztXQVVHO1FBRUgsY0FBUyxHQUFXLEVBQUUsQ0FBQztRQUV2Qjs7Ozs7Ozs7Ozs7V0FXRztRQUVILFNBQUksR0FBNkIsSUFBSSxDQUFDO1FBZXRDOzs7Ozs7Ozs7O1dBVUc7UUFFSCxnQkFBVyxHQUE2QixJQUFJLENBQUM7UUFFN0M7Ozs7Ozs7O1dBUUc7UUFDSCxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUU3Qjs7Ozs7Ozs7O1dBU0c7UUFFSCxnQkFBVyxHQUFzQyxJQUFJLFlBQVksRUFBdUIsQ0FBQztRQUV6Rjs7Ozs7OztXQU9HO1FBQ0gsb0JBQWUsR0FDYixrQkFBa0IsQ0FBQyxHQUFHLEVBQW1DLENBQUM7UUFzRDFELElBQUksQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDO1FBQzlCLElBQUksQ0FBQyxlQUFlLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNILElBQWMsVUFBVTtRQUN0QixJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN0QixNQUFNLFNBQVMsR0FBSyxJQUFJLENBQUMsS0FBZSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUE7Z0JBQ3pELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxXQUFXO29CQUNkLE1BQU0sSUFBSSxhQUFhLENBQ3JCLG1EQUFtRCxDQUNwRCxDQUFDO2dCQUNKLElBQUksZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQ3ZELElBQUcsQ0FBQyxnQkFBZ0IsSUFBSSxpQkFBaUIsRUFBRSxFQUFFLENBQUM7b0JBQzVDLE1BQU0sT0FBTyxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7b0JBQ2pDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7Z0JBQ3JDLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxnQkFBMEIsQ0FBQyxDQUFDO2dCQUNoRixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksV0FBVyxFQUFXLENBQUM7Z0JBQ3hDLElBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUN2QixJQUFJLENBQUMsRUFBRSxHQUFJLElBQUksQ0FBQyxXQUFpRCxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUM7WUFDakYsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQWMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxhQUFhLENBQ3BCLEtBQWUsRUFBRSxPQUFPLElBQUksS0FBZSxDQUM3QyxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNELElBQUksWUFBWTtnQkFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFDRCxJQUNFLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUM7WUFDdkMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQztZQUNsQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDO1lBRXhDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQStCRztJQUNILFNBQVMsQ0FBQyxZQUE2QjtRQUNyQyxJQUFJLENBQUMsWUFBWSxHQUFHLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVk7WUFDcEIsT0FBTyxFQUFFLENBQUM7UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFDZCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDckMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILFFBQVE7UUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxZQUFZLEtBQUs7WUFDNUMsSUFBSSxDQUFDLEtBQUssR0FBRyxVQUFVLElBQUksQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3hELE9BQU8sSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILFFBQVEsQ0FBQyxLQUFxQjtRQUM1QixJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksS0FBSyxDQUFDO1lBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsc0JBQXNCLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFVLENBQUM7UUFDNUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxLQUFjLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILG1CQUFtQixDQUFDLEtBQVk7UUFDOUIsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ25CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDMUUsTUFBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsS0FBSyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRSxFQUFFLEVBQUMsUUFBUSxFQUFFLFFBQVEsSUFBSSxFQUFFLEVBQUMsQ0FBQyxDQUFDO1lBQ3BFLElBQUcsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLEVBQUUsS0FBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM3QyxJQUFJLENBQUMsSUFBSSxHQUFHO2dCQUNWLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUU7Z0JBQ3BCLEdBQUcsSUFBSSxFQUFFLEtBQUs7Z0JBQ2QsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM3QyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO2FBQ25ELENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxVQUFVO1FBQ1IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bc0JHO0lBQ0gsV0FBVyxDQUFDLEtBQTBCO1FBQ3BDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxXQUFXLENBQUMsS0FBYSxFQUFFLElBQWdDO1FBQ3pELE9BQU8sR0FBRyxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Ba0NHO0lBQ08sVUFBVSxDQUFDLFFBQWtCO1FBQ3JDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDcEMsSUFBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO2dCQUNyQyxJQUFpQixDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDOytHQXpsQm1CLGdCQUFnQixrQkF5VU4sZUFBZTttR0F6VXpCLGdCQUFnQix3Z0JBV0osVUFBVSxnRUFkaEMsWUFBWTs7NEZBR0YsZ0JBQWdCO2tCQUxyQyxTQUFTO21CQUFDO29CQUNULFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsWUFBWTtvQkFDdEIsSUFBSSxFQUFFLEVBQUMsV0FBVyxFQUFFLEtBQUssRUFBQztpQkFDM0I7OzBCQTBVd0IsTUFBTTsyQkFBQyxlQUFlO3lDQTdUN0MsU0FBUztzQkFEUixTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFpQzFELFVBQVU7c0JBRFQsS0FBSztnQkFZTixLQUFLO3NCQURKLEtBQUs7Z0JBZ0NOLEtBQUs7c0JBREosS0FBSztnQkFnQk4sSUFBSTtzQkFESCxLQUFLO2dCQWFOLEVBQUU7c0JBREQsS0FBSztnQkFZTixLQUFLO3NCQURKLEtBQUs7Z0JBWU4sVUFBVTtzQkFEVCxLQUFLO2dCQVlOLEdBQUc7c0JBREYsS0FBSztnQkFZTixNQUFNO3NCQURMLEtBQUs7Z0JBZU4sTUFBTTtzQkFETCxLQUFLO2dCQWVOLFlBQVk7c0JBRFgsS0FBSztnQkFlTixTQUFTO3NCQURSLEtBQUs7Z0JBZ0JOLElBQUk7c0JBREgsS0FBSztnQkE0Qk4sV0FBVztzQkFEVixLQUFLO2dCQXlCTixXQUFXO3NCQURWLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBJbnB1dCxcbiAgQ29tcG9uZW50LFxuICBJbmplY3QsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBLZXlWYWx1ZSwgUmVuZGVyZXJDdXN0b21FdmVudCwgU3RyaW5nT3JCb29sZWFuIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge1xuICBnZW5lcmF0ZVJhbmRvbVZhbHVlLFxuICBnZXRJbmplY3RhYmxlc1JlZ2lzdHJ5LFxuICBnZXRPbldpbmRvdyxcbiAgaXNEZXZlbG9wbWVudE1vZGUsXG4gIHN0cmluZ1RvQm9vbGVhblxufSBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcbmltcG9ydCB7IGdldExvY2FsZUNvbnRleHQgfSBmcm9tICcuLi9pMThuL0xvYWRlcic7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gJ0BkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvbic7XG5pbXBvcnQge1xuICBDcnVkT3BlcmF0aW9ucyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5c1xufSBmcm9tICdAZGVjYWYtdHMvZGItZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50UHJvcHMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBOZ3hSZW5kZXJpbmdFbmdpbmUgfSBmcm9tICcuL05neFJlbmRlcmluZ0VuZ2luZSc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZGVjYWYtdHMvbG9nZ2luZyc7XG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuLi9mb3ItYW5ndWxhci5tb2R1bGUnO1xuaW1wb3J0IHsgRGVjYWZSZXBvc2l0b3J5IH0gZnJvbSAnLi4vY29tcG9uZW50cy9saXN0L2NvbnN0YW50cyc7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSAnQGRlY2FmLXRzL2NvcmUnO1xuaW1wb3J0IHsgUmFtQWRhcHRlciB9IGZyb20gJ0BkZWNhZi10cy9jb3JlL3JhbSc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEJhc2UgY29tcG9uZW50IGNsYXNzIHRoYXQgcHJvdmlkZXMgY29tbW9uIGZ1bmN0aW9uYWxpdHkgZm9yIGFsbCBEZWNhZiBjb21wb25lbnRzLlxuICogQHN1bW1hcnkgVGhlIE5neEJhc2VDb21wb25lbnQgc2VydmVzIGFzIHRoZSBmb3VuZGF0aW9uIGZvciBhbGwgRGVjYWYgVUkgY29tcG9uZW50cywgcHJvdmlkaW5nXG4gKiBzaGFyZWQgZnVuY3Rpb25hbGl0eSBmb3IgbG9jYWxpemF0aW9uLCBlbGVtZW50IHJlZmVyZW5jZXMsIGFuZCBzdHlsaW5nLiBUaGlzIGFic3RyYWN0IGNsYXNzXG4gKiBpbXBsZW1lbnRzIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIHRoYXQgYXJlIHVzZWQgYWNyb3NzIHRoZSBjb21wb25lbnQgbGlicmFyeSwgZW5zdXJpbmdcbiAqIGNvbnNpc3RlbnQgYmVoYXZpb3IgYW5kIHJlZHVjaW5nIGNvZGUgZHVwbGljYXRpb24uIENvbXBvbmVudHMgdGhhdCBleHRlbmQgdGhpcyBjbGFzcyBpbmhlcml0XG4gKiBpdHMgY2FwYWJpbGl0aWVzIGZvciBoYW5kbGluZyB0cmFuc2xhdGlvbnMsIGFjY2Vzc2luZyBET00gZWxlbWVudHMsIGFuZCBhcHBseWluZyBjdXN0b20gc3R5bGluZy5cbiAqXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgdGhpcyBjb21wb25lbnQgd29ya3Mgd2l0aFxuICogQHBhcmFtIHtzdHJpbmd9IGluc3RhbmNlIC0gVGhlIGNvbXBvbmVudCBpbnN0YW5jZSB0b2tlbiB1c2VkIGZvciBpZGVudGlmaWNhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsZSAtIFRoZSBsb2NhbGUgdG8gYmUgdXNlZCBmb3IgdHJhbnNsYXRpb25zXG4gKiBAcGFyYW0ge1N0cmluZ09yQm9vbGVhbn0gdHJhbnNsYXRhYmxlIC0gV2hldGhlciB0aGUgY29tcG9uZW50IHNob3VsZCBiZSB0cmFuc2xhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIC0gQWRkaXRpb25hbCBDU1MgY2xhc3NlcyB0byBhcHBseSB0byB0aGUgY29tcG9uZW50XG4gKiBAcGFyYW0ge1wiaW9zXCIgfCBcIm1kXCIgfCB1bmRlZmluZWR9IG1vZGUgLSBDb21wb25lbnQgcGxhdGZvcm0gc3R5bGVcbiAqXG4gKiBAY29tcG9uZW50IE5neEJhc2VDb21wb25lbnRcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdhcHAtbXktY29tcG9uZW50JyxcbiAqICAgdGVtcGxhdGVVcmw6ICcuL215LWNvbXBvbmVudC5jb21wb25lbnQuaHRtbCcsXG4gKiAgIHN0eWxlVXJsczogWycuL215LWNvbXBvbmVudC5jb21wb25lbnQuc2NzcyddXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IGV4dGVuZHMgTmd4QmFzZUNvbXBvbmVudCB7XG4gKiAgIGNvbnN0cnVjdG9yKEBJbmplY3QoJ2luc3RhbmNlVG9rZW4nKSBpbnN0YW5jZTogc3RyaW5nKSB7XG4gKiAgICAgc3VwZXIoaW5zdGFuY2UpO1xuICogICB9XG4gKlxuICogICBuZ09uSW5pdCgpIHtcbiAqICAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAqICAgICAvLyBDb21wb25lbnQtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb25cbiAqICAgfVxuICogfVxuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcCBhcyBBcHBsaWNhdGlvblxuICogICBwYXJ0aWNpcGFudCBDb21wIGFzIENvbXBvbmVudFxuICogICBwYXJ0aWNpcGFudCBCYXNlIGFzIE5neEJhc2VDb21wb25lbnRcbiAqICAgcGFydGljaXBhbnQgRW5naW5lIGFzIE5neFJlbmRlcmluZ0VuZ2luZVxuICpcbiAqICAgQXBwLT4+Q29tcDogQ3JlYXRlIGNvbXBvbmVudFxuICogICBDb21wLT4+QmFzZTogc3VwZXIoaW5zdGFuY2UpXG4gKiAgIEJhc2UtPj5CYXNlOiBTZXQgY29tcG9uZW50TmFtZSAmIGNvbXBvbmVudExvY2FsZVxuICpcbiAqICAgQXBwLT4+Q29tcDogU2V0IEBJbnB1dCBwcm9wZXJ0aWVzXG4gKiAgIENvbXAtPj5CYXNlOiBuZ09uQ2hhbmdlcyhjaGFuZ2VzKVxuICpcbiAqICAgYWx0IG1vZGVsIGNoYW5nZWRcbiAqICAgICBCYXNlLT4+QmFzZTogZ2V0TW9kZWwobW9kZWwpXG4gKiAgICAgQmFzZS0+PkVuZ2luZTogZ2V0RGVjb3JhdG9ycyhtb2RlbCwge30pXG4gKiAgICAgRW5naW5lLS0+PkJhc2U6IFJldHVybiBkZWNvcmF0b3IgbWV0YWRhdGFcbiAqICAgICBCYXNlLT4+QmFzZTogQ29uZmlndXJlIG1hcHBlciBhbmQgaXRlbVxuICogICAgIEJhc2UtPj5CYXNlOiBnZXRMb2NhbGUodHJhbnNsYXRhYmxlKVxuICogICBlbHNlIGxvY2FsZS90cmFuc2xhdGFibGUgY2hhbmdlZFxuICogICAgIEJhc2UtPj5CYXNlOiBnZXRMb2NhbGUodHJhbnNsYXRhYmxlKVxuICogICBlbmRcbiAqXG4gKiAgIEFwcC0+PkNvbXA6IG5nT25Jbml0KClcbiAqICAgQ29tcC0+PkJhc2U6IGluaXRpYWxpemUoKVxuICogICBCYXNlLT4+QmFzZTogU2V0IGluaXRpYWxpemVkIGZsYWdcbiAqL1xuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHRlbXBsYXRlOiAnPGRpdj48ZGl2PicsXG4gIGhvc3Q6IHsnW2F0dHIuaWRdJzogJ3VpZCd9LFxufSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOZ3hCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZlcmVuY2UgdG8gdGhlIGNvbXBvbmVudCdzIGVsZW1lbnQuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIG5hdGl2ZSBET00gZWxlbWVudCBvZiB0aGUgY29tcG9uZW50IHRocm91Z2ggQW5ndWxhcidzXG4gICAqIFZpZXdDaGlsZCBkZWNvcmF0b3IuIFRoaXMgcmVmZXJlbmNlIGNhbiBiZSB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIERPTSBlbGVtZW50IGRpcmVjdGx5LFxuICAgKiBhcHBseSBjdXN0b20gc3R5bGVzLCBvciBhY2Nlc3MgbmF0aXZlIGVsZW1lbnQgcHJvcGVydGllcyBhbmQgbWV0aG9kcy4gVGhlIGVsZW1lbnQgaXNcbiAgICogaWRlbnRpZmllZCBieSB0aGUgJ2NvbXBvbmVudCcgdGVtcGxhdGUgcmVmZXJlbmNlIHZhcmlhYmxlLlxuICAgKlxuICAgKiBAdHlwZSB7RWxlbWVudFJlZn1cbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2NvbXBvbmVudCcsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiB0cnVlIH0pXG4gIGNvbXBvbmVudCE6IEVsZW1lbnRSZWY7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCwgd2hpY2ggaXMgdHlwaWNhbGx5IGRlcml2ZWQgZnJvbSB0aGUgY2xhc3MgbmFtZS5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGludGVybmFsbHkgZm9yIHZhcmlvdXMgcHVycG9zZXMgc3VjaCBhcyBsb2dnaW5nLCBkZXJpdmluZyB0aGUgZGVmYXVsdFxuICAgKiBsb2NhbGUsIGFuZCBwb3RlbnRpYWxseSBmb3IgY29tcG9uZW50IGlkZW50aWZpY2F0aW9uIGluIGRlYnVnZ2luZyBvciBlcnJvciByZXBvcnRpbmcuXG4gICAqXG4gICAqIFRoZSBgY29tcG9uZW50TmFtZWAgaXMgc2V0IGR1cmluZyB0aGUgY29tcG9uZW50J3MgaW5pdGlhbGl6YXRpb24gcHJvY2VzcyBhbmQgc2hvdWxkIG5vdFxuICAgKiBiZSBtb2RpZmllZCBleHRlcm5hbGx5LiBJdCdzIG1hcmtlZCBhcyBwcm90ZWN0ZWQgdG8gYWxsb3cgYWNjZXNzIGluIGRlcml2ZWQgY2xhc3NlcyB3aGlsZVxuICAgKiBwcmV2ZW50aW5nIGRpcmVjdCBhY2Nlc3MgZnJvbSBvdXRzaWRlIHRoZSBjb21wb25lbnQgaGllcmFyY2h5LlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIEluc2lkZSBhIGRlcml2ZWQgY29tcG9uZW50IGNsYXNzXG4gICAqIGNvbnNvbGUubG9nKHRoaXMuY29tcG9uZW50TmFtZSk7IC8vIE91dHB1dHM6IFwiTXlDdXN0b21Db21wb25lbnRcIlxuICAgKi9cbiAgY29tcG9uZW50TmFtZSE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVuZGVyZXIuXG4gICAqIEBzdW1tYXJ5IEEgdW5pcXVlIGlkZW50aWZpZXIgdXNlZCB0byByZWZlcmVuY2UgdGhlIGNvbXBvbmVudCdzIHJlbmRlcmVyIGluc3RhbmNlLlxuICAgKiBUaGlzIGNhbiBiZSB1c2VkIGZvciB0YXJnZXRpbmcgc3BlY2lmaWMgcmVuZGVyZXIgaW5zdGFuY2VzIHdoZW4gbXVsdGlwbGUgY29tcG9uZW50c1xuICAgKiBhcmUgcHJlc2VudCBvbiB0aGUgc2FtZSBwYWdlLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgcmVuZGVyZXJJZCE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlcG9zaXRvcnkgbW9kZWwgZm9yIGRhdGEgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgVGhlIGRhdGEgbW9kZWwgcmVwb3NpdG9yeSB0aGF0IHRoaXMgY29tcG9uZW50IHdpbGwgdXNlIGZvciBDUlVEIG9wZXJhdGlvbnMuXG4gICAqIFRoaXMgcHJvdmlkZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhIGxheWVyIGZvciByZXRyaWV2aW5nIGFuZCBtYW5pcHVsYXRpbmcgZGF0YS5cbiAgICpcbiAgICogQHR5cGUge01vZGVsfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBtb2RlbCE6ICBNb2RlbCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSByZXBvc2l0b3J5IGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBkYXRhIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGEgbGF5ZXIgZm9yIHJldHJpZXZpbmcgYW5kIG1hbmlwdWxhdGluZyBkYXRhLlxuICAgKiBUaGlzIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBgRGVjYWZSZXBvc2l0b3J5YCBjbGFzcyBmcm9tIHRoZSBgQGRlY2FmLXRzL2NvcmVgIHBhY2thZ2UsXG4gICAqIHdoaWNoIGlzIGluaXRpYWxpemVkIGluIHRoZSBgcmVwb3NpdG9yeWAgZ2V0dGVyIG1ldGhvZC5cbiAgICpcbiAgICogVGhlIHJlcG9zaXRvcnkgaXMgdXNlZCB0byBwZXJmb3JtIENSVUQgKENyZWF0ZSwgUmVhZCwgVXBkYXRlLCBEZWxldGUpIG9wZXJhdGlvbnMgb24gdGhlXG4gICAqIGRhdGEgbW9kZWwsIHN1Y2ggYXMgZmV0Y2hpbmcgZGF0YSwgY3JlYXRpbmcgbmV3IGl0ZW1zLCB1cGRhdGluZyBleGlzdGluZyBpdGVtcywgYW5kIGRlbGV0aW5nXG4gICAqIGl0ZW1zLiBJdCBhbHNvIHByb3ZpZGVzIG1ldGhvZHMgZm9yIHF1ZXJ5aW5nIGFuZCBmaWx0ZXJpbmcgZGF0YSBiYXNlZCBvbiBzcGVjaWZpYyBjcml0ZXJpYS5cbiAgICpcbiAgICogQHR5cGUge0RlY2FmUmVwb3NpdG9yeTxNb2RlbD59XG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBwcm90ZWN0ZWQgX3JlcG9zaXRvcnk/OiBEZWNhZlJlcG9zaXRvcnk8TW9kZWw+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRHluYW1pYyBwcm9wZXJ0aWVzIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICAgKiBAc3VtbWFyeSBDb250YWlucyBrZXktdmFsdWUgcGFpcnMgb2YgZHluYW1pYyBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudFxuICAgKiBhdCBydW50aW1lLiBUaGlzIGZsZXhpYmxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGFsbG93cyBmb3IgZHluYW1pYyBwcm9wZXJ0eSBhc3NpZ25tZW50IHdpdGhvdXRcbiAgICogcmVxdWlyaW5nIGV4cGxpY2l0IGlucHV0IGJpbmRpbmdzIGZvciBldmVyeSBwb3NzaWJsZSBjb25maWd1cmF0aW9uIG9wdGlvbi4gUHJvcGVydGllcyBmcm9tXG4gICAqIHRoaXMgb2JqZWN0IGFyZSBwYXJzZWQgYW5kIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB0aHJvdWdoIHRoZSBwYXJzZVByb3BzIG1ldGhvZCxcbiAgICogZW5hYmxpbmcgY3VzdG9taXphYmxlIGNvbXBvbmVudCBiZWhhdmlvciBiYXNlZCBvbiBleHRlcm5hbCBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59XG4gICAqIEBkZWZhdWx0IHt9XG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbmZpZ3VyYXRpb24gZm9yIGxpc3QgaXRlbSByZW5kZXJpbmdcbiAgICogQHN1bW1hcnkgRGVmaW5lcyBob3cgbGlzdCBpdGVtcyBzaG91bGQgYmUgcmVuZGVyZWQgaW4gdGhlIGNvbXBvbmVudC5cbiAgICogVGhpcyBwcm9wZXJ0eSBob2xkcyBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoYXQgc3BlY2lmaWVzIHRoZSB0YWcgbmFtZVxuICAgKiBhbmQgb3RoZXIgcHJvcGVydGllcyBuZWVkZWQgdG8gcmVuZGVyIGxpc3QgaXRlbXMgY29ycmVjdGx5LiBUaGUgdGFnIHByb3BlcnR5XG4gICAqIGlkZW50aWZpZXMgd2hpY2ggY29tcG9uZW50IHNob3VsZCBiZSB1c2VkIHRvIHJlbmRlciBlYWNoIGl0ZW0gaW4gYSBsaXN0LlxuICAgKiBBZGRpdGlvbmFsIHByb3BlcnRpZXMgY2FuIGJlIGluY2x1ZGVkIHRvIGN1c3RvbWl6ZSB0aGUgcmVuZGVyaW5nIGJlaGF2aW9yLlxuICAgKlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59XG4gICAqIEBkZWZhdWx0IHt0YWc6IFwiXCJ9XG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBpdGVtOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgdGFnOiAnJyB9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJpbWFyeSBrZXkgZmllbGQgbmFtZSBmb3IgdGhlIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgd2hpY2ggZmllbGQgaW4gdGhlIG1vZGVsIHNob3VsZCBiZSB1c2VkIGFzIHRoZSBwcmltYXJ5IGtleS5cbiAgICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgaWRlbnRpZnlpbmcgdW5pcXVlIHJlY29yZHMgaW4gb3BlcmF0aW9ucyBsaWtlIHVwZGF0ZSBhbmQgZGVsZXRlLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAZGVmYXVsdCAnaWQnXG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBwayE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJhc2Ugcm91dGUgZm9yIG5hdmlnYXRpb24gcmVsYXRlZCB0byB0aGlzIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgYmFzZSByb3V0ZSBwYXRoIHVzZWQgZm9yIG5hdmlnYXRpb24gYWN0aW9ucyByZWxhdGVkIHRvIHRoaXMgY29tcG9uZW50LlxuICAgKiBUaGlzIGlzIG9mdGVuIHVzZWQgYXMgYSBwcmVmaXggZm9yIGNvbnN0cnVjdGluZyBuYXZpZ2F0aW9uIFVSTHMuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICByb3V0ZSE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEF2YWlsYWJsZSBDUlVEIG9wZXJhdGlvbnMgZm9yIHRoaXMgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIHdoaWNoIENSVUQgb3BlcmF0aW9ucyAoQ3JlYXRlLCBSZWFkLCBVcGRhdGUsIERlbGV0ZSkgYXJlIGF2YWlsYWJsZVxuICAgKiBmb3IgdGhpcyBjb21wb25lbnQuIFRoaXMgYWZmZWN0cyB3aGljaCBvcGVyYXRpb25zIGNhbiBiZSBwZXJmb3JtZWQgb24gdGhlIGRhdGEuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtPcGVyYXRpb25LZXlzLlJFQURdXG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvcGVyYXRpb25zOiBDcnVkT3BlcmF0aW9uc1tdID0gW09wZXJhdGlvbktleXMuUkVBRF07XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgcmVjb3JkLlxuICAgKiBAc3VtbWFyeSBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY3VycmVudCByZWNvcmQgYmVpbmcgZGlzcGxheWVkIG9yIG1hbmlwdWxhdGVkLlxuICAgKiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIHByaW1hcnkga2V5IGZvciBvcGVyYXRpb25zIG9uIHNwZWNpZmljIHJlY29yZHMuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICB1aWQhOiBzdHJpbmcgfCBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaWVsZCBtYXBwaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBzdW1tYXJ5IERlZmluZXMgaG93IGZpZWxkcyBmcm9tIHRoZSBkYXRhIG1vZGVsIHNob3VsZCBiZSBtYXBwZWQgdG8gcHJvcGVydGllcyB1c2VkIGJ5IHRoZSBjb21wb25lbnQuXG4gICAqIFRoaXMgYWxsb3dzIGZvciBmbGV4aWJsZSBkYXRhIGJpbmRpbmcgYmV0d2VlbiB0aGUgbW9kZWwgYW5kIHRoZSBjb21wb25lbnQncyBkaXNwbGF5IGxvZ2ljLlxuICAgKlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn1cbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG1hcHBlcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGxvY2FsZSB0byBiZSB1c2VkIGZvciB0cmFuc2xhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgbG9jYWxlIGlkZW50aWZpZXIgdG8gdXNlIHdoZW4gdHJhbnNsYXRpbmcgY29tcG9uZW50IHRleHQuXG4gICAqIFRoaXMgY2FuIGJlIHNldCBleHBsaWNpdGx5IHZpYSBpbnB1dCBwcm9wZXJ0eSB0byBvdmVycmlkZSB0aGUgYXV0b21hdGljYWxseSBkZXJpdmVkXG4gICAqIGxvY2FsZSBmcm9tIHRoZSBjb21wb25lbnQgbmFtZS4gVGhlIGxvY2FsZSBpcyB0eXBpY2FsbHkgYSBsYW5ndWFnZSBjb2RlIChlLmcuLCAnZW4nLCAnZnInKVxuICAgKiBvciBhIGxhbmd1YWdlLXJlZ2lvbiBjb2RlIChlLmcuLCAnZW4tVVMnLCAnZnItQ0EnKSB0aGF0IGRldGVybWluZXMgd2hpY2ggdHJhbnNsYXRpb25cbiAgICogc2V0IHRvIHVzZSBmb3IgdGhlIGNvbXBvbmVudCdzIHRleHQgY29udGVudC5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGxvY2FsZSE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERldGVybWluZXMgaWYgdGhlIGNvbXBvbmVudCBzaG91bGQgYmUgdHJhbnNsYXRlZC5cbiAgICogQHN1bW1hcnkgQ29udHJvbHMgd2hldGhlciB0aGUgY29tcG9uZW50J3MgdGV4dCBjb250ZW50IHNob3VsZCBiZSBwcm9jZXNzZWQgZm9yIHRyYW5zbGF0aW9uLlxuICAgKiBXaGVuIHRydWUsIHRoZSBjb21wb25lbnQgd2lsbCBhdHRlbXB0IHRvIHRyYW5zbGF0ZSB0ZXh0IHVzaW5nIHRoZSBzcGVjaWZpZWQgbG9jYWxlLlxuICAgKiBXaGVuIGZhbHNlLCB0ZXh0IGlzIGRpc3BsYXllZCBhcy1pcyB3aXRob3V0IHRyYW5zbGF0aW9uLiBUaGlzIHByb3BlcnR5IGFjY2VwdHMgZWl0aGVyXG4gICAqIGEgYm9vbGVhbiB2YWx1ZSBvciBhIHN0cmluZyB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBib29sZWFuIChlLmcuLCAndHJ1ZScsICdmYWxzZScsICcxJywgJzAnKS5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHRyYW5zbGF0YWJsZTogU3RyaW5nT3JCb29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFkZGl0aW9uYWwgQ1NTIGNsYXNzIG5hbWVzIHRvIGFwcGx5IHRvIHRoZSBjb21wb25lbnQuXG4gICAqIEBzdW1tYXJ5IEFsbG93cyBjdXN0b20gQ1NTIGNsYXNzZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGNvbXBvbmVudCdzIHJvb3QgZWxlbWVudC5cbiAgICogVGhlc2UgY2xhc3NlcyBhcmUgYXBwZW5kZWQgdG8gYW55IGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGNsYXNzZXMgYmFzZWQgb24gb3RoZXJcbiAgICogY29tcG9uZW50IHByb3BlcnRpZXMuIE11bHRpcGxlIGNsYXNzZXMgY2FuIGJlIHByb3ZpZGVkIGFzIGEgc3BhY2Utc2VwYXJhdGVkIHN0cmluZy5cbiAgICogVGhpcyBwcm92aWRlcyBhIHdheSB0byBjdXN0b21pemUgdGhlIGNvbXBvbmVudCdzIGFwcGVhcmFuY2UgYmV5b25kIHRoZSBidWlsdC1pbiBzdHlsaW5nIG9wdGlvbnMuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0IFwiXCJcbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGNsYXNzTmFtZTogc3RyaW5nID0gJyc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb21wb25lbnQgcGxhdGZvcm0gc3R5bGUuXG4gICAqIEBzdW1tYXJ5IENvbnRyb2xzIHRoZSB2aXN1YWwgYXBwZWFyYW5jZSBvZiB0aGUgY29tcG9uZW50IGJhc2VkIG9uIHBsYXRmb3JtIGRlc2lnbiBndWlkZWxpbmVzLlxuICAgKiBUaGUgJ2lvcycgbW9kZSBmb2xsb3dzIGlPUyBkZXNpZ24gcGF0dGVybnMsIHdoaWxlICdtZCcgKE1hdGVyaWFsIERlc2lnbikgZm9sbG93cyBBbmRyb2lkL0dvb2dsZVxuICAgKiBkZXNpZ24gcGF0dGVybnMuIFRoaXMgcHJvcGVydHkgYWZmZWN0cyB2YXJpb3VzIHZpc3VhbCBhc3BlY3RzIHN1Y2ggYXMgYW5pbWF0aW9ucywgZm9ybSBlbGVtZW50cyxcbiAgICogYW5kIGljb25zLiBTZXR0aW5nIHRoaXMgcHJvcGVydHkgYWxsb3dzIGNvbXBvbmVudHMgdG8gbWFpbnRhaW4gcGxhdGZvcm0tc3BlY2lmaWMgc3R5bGluZ1xuICAgKiBmb3IgYSBtb3JlIG5hdGl2ZSBsb29rIGFuZCBmZWVsLlxuICAgKlxuICAgKiBAdHlwZSB7KFwiaW9zXCIgfCBcIm1kXCIgfCB1bmRlZmluZWQpfVxuICAgKiBAZGVmYXVsdCBcIm1kXCJcbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG1vZGU6ICdpb3MnIHwgJ21kJyB8IHVuZGVmaW5lZCA9ICdtZCc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbG9jYWxlIGRlcml2ZWQgZnJvbSB0aGUgY29tcG9uZW50J3MgY2xhc3MgbmFtZS5cbiAgICogQHN1bW1hcnkgU3RvcmVzIHRoZSBhdXRvbWF0aWNhbGx5IGRlcml2ZWQgbG9jYWxlIGJhc2VkIG9uIHRoZSBjb21wb25lbnQncyBjbGFzcyBuYW1lLlxuICAgKiBUaGlzIGlzIGRldGVybWluZWQgZHVyaW5nIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbiBhbmQgc2VydmVzIGFzIGEgZmFsbGJhY2sgd2hlbiBub1xuICAgKiBleHBsaWNpdCBsb2NhbGUgaXMgcHJvdmlkZWQgdmlhIHRoZSBsb2NhbGUgaW5wdXQgcHJvcGVydHkuIFRoZSBkZXJpdmF0aW9uIGlzIGhhbmRsZWRcbiAgICogYnkgdGhlIGdldExvY2FsZUNvbnRleHQgdXRpbGl0eSBmdW5jdGlvbiwgd2hpY2ggZXh0cmFjdHMgYSBsb2NhbGUgaWRlbnRpZmllclxuICAgKiBmcm9tIHRoZSBjb21wb25lbnQncyBjbGFzcyBuYW1lLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgY29tcG9uZW50TG9jYWxlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgd2hldGhlciBjaGlsZCBjb21wb25lbnRzIHNob3VsZCBiZSByZW5kZXJlZFxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGlmIGNoaWxkIGNvbXBvbmVudHMgc2hvdWxkIGJlIHJlbmRlcmVkIGJ5IHRoZSBjb21wb25lbnQuXG4gICAqIFRoaXMgY2FuIGJlIHNldCB0byBhIGJvb2xlYW4gdmFsdWUgb3IgYSBzdHJpbmcgdGhhdCBjYW4gYmUgY29udmVydGVkIHRvIGEgYm9vbGVhbi5cbiAgICogV2hlbiB0cnVlLCBjaGlsZCBjb21wb25lbnRzIGRlZmluZWQgaW4gdGhlIG1vZGVsIHdpbGwgYmUgcmVuZGVyZWQuIFdoZW4gZmFsc2UsXG4gICAqIGNoaWxkIGNvbXBvbmVudHMgd2lsbCBiZSBza2lwcGVkLiBUaGlzIHByb3ZpZGVzIGNvbnRyb2wgb3ZlciB0aGUgcmVuZGVyaW5nIGRlcHRoLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgU3RyaW5nT3JCb29sZWFufVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICByZW5kZXJDaGlsZDogc3RyaW5nIHwgU3RyaW5nT3JCb29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZsYWcgaW5kaWNhdGluZyBpZiB0aGUgY29tcG9uZW50IGhhcyBiZWVuIGluaXRpYWxpemVkXG4gICAqIEBzdW1tYXJ5IFRyYWNrcyB3aGV0aGVyIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZCBpdHMgaW5pdGlhbGl6YXRpb24gcHJvY2Vzcy5cbiAgICogVGhpcyBmbGFnIGlzIHVzZWQgdG8gcHJldmVudCBkdXBsaWNhdGUgaW5pdGlhbGl6YXRpb24gYW5kIHRvIGRldGVybWluZSBpZlxuICAgKiBjZXJ0YWluIG9wZXJhdGlvbnMgdGhhdCByZXF1aXJlIGluaXRpYWxpemF0aW9uIGNhbiBiZSBwZXJmb3JtZWQuXG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgaW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV2ZW50IGVtaXR0ZXIgZm9yIGN1c3RvbSByZW5kZXJlciBldmVudHMuXG4gICAqIEBzdW1tYXJ5IEVtaXRzIGN1c3RvbSBldmVudHMgdGhhdCBvY2N1ciB3aXRoaW4gY2hpbGQgY29tcG9uZW50cyBvciB0aGUgbGF5b3V0IGl0c2VsZi5cbiAgICogVGhpcyBhbGxvd3MgcGFyZW50IGNvbXBvbmVudHMgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB1c2VyIGludGVyYWN0aW9ucyBvclxuICAgKiBzdGF0ZSBjaGFuZ2VzIHdpdGhpbiB0aGUgZ3JpZCBsYXlvdXQuIEV2ZW50cyBhcmUgcGFzc2VkIHVwIHRoZSBjb21wb25lbnQgaGllcmFyY2h5XG4gICAqIHRvIGVuYWJsZSBjb29yZGluYXRlZCBiZWhhdmlvciBhY3Jvc3MgdGhlIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAdHlwZSB7RXZlbnRFbWl0dGVyPFJlbmRlcmVyQ3VzdG9tRXZlbnQ+fVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgQE91dHB1dCgpXG4gIGxpc3RlbkV2ZW50OiBFdmVudEVtaXR0ZXI8UmVuZGVyZXJDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFJlbmRlcmVyQ3VzdG9tRXZlbnQ+KCk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZlcmVuY2UgdG8gdGhlIHJlbmRlcmluZyBlbmdpbmUgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBOZ3hSZW5kZXJpbmdFbmdpbmUgc2luZ2xldG9uIGluc3RhbmNlLFxuICAgKiB3aGljaCBoYW5kbGVzIHRoZSByZW5kZXJpbmcgb2YgY29tcG9uZW50cyBiYXNlZCBvbiBtb2RlbCBkZWZpbml0aW9ucy5cbiAgICogVGhpcyBlbmdpbmUgaXMgdXNlZCB0byBleHRyYWN0IGRlY29yYXRvciBtZXRhZGF0YSBhbmQgcmVuZGVyIGNoaWxkIGNvbXBvbmVudHMuXG4gICAqXG4gICAqIEB0eXBlIHtOZ3hSZW5kZXJpbmdFbmdpbmV9XG4gICAqL1xuICByZW5kZXJpbmdFbmdpbmU6IE5neFJlbmRlcmluZ0VuZ2luZSA9XG4gICAgTmd4UmVuZGVyaW5nRW5naW5lLmdldCgpIGFzIHVua25vd24gYXMgTmd4UmVuZGVyaW5nRW5naW5lO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9nZ2VyIGluc3RhbmNlIGZvciB0aGUgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBsb2dnaW5nIGNhcGFiaWxpdGllcyBmb3IgdGhlIGNvbXBvbmVudCwgYWxsb3dpbmcgZm9yIGNvbnNpc3RlbnRcbiAgICogYW5kIHN0cnVjdHVyZWQgbG9nZ2luZyBvZiBpbmZvcm1hdGlvbiwgd2FybmluZ3MsIGFuZCBlcnJvcnMuIFRoaXMgbG9nZ2VyIGlzIGluaXRpYWxpemVkXG4gICAqIGluIHRoZSBuZ09uSW5pdCBtZXRob2QgdXNpbmcgdGhlIGdldExvZ2dlciBmdW5jdGlvbiBmcm9tIHRoZSBGb3JBbmd1bGFyTW9kdWxlLlxuICAgKlxuICAgKiBUaGUgbG9nZ2VyIGlzIHVzZWQgdGhyb3VnaG91dCB0aGUgY29tcG9uZW50IHRvIHJlY29yZCBpbXBvcnRhbnQgZXZlbnRzLCBkZWJ1ZyBpbmZvcm1hdGlvbixcbiAgICogYW5kIHBvdGVudGlhbCBpc3N1ZXMuIEl0IGhlbHBzIGluIG1vbml0b3JpbmcgdGhlIGNvbXBvbmVudCdzIGJlaGF2aW9yLCB0cmFja2luZyB0aGUgZmxvd1xuICAgKiBvZiBvcGVyYXRpb25zLCBhbmQgZmFjaWxpdGF0aW5nIGVhc2llciBkZWJ1Z2dpbmcgYW5kIG1haW50ZW5hbmNlLlxuICAgKlxuICAgKiBAdHlwZSB7TG9nZ2VyfVxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgbG9nZ2VyITogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBOZ3hCYXNlQ29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgYmFzZSBjb21wb25lbnQgd2l0aCB0aGUgcHJvdmlkZWQgaW5zdGFuY2UgdG9rZW4uXG4gICAqIFRoaXMgY29uc3RydWN0b3Igc2V0cyB1cCB0aGUgZnVuZGFtZW50YWwgcHJvcGVydGllcyByZXF1aXJlZCBieSBhbGwgRGVjYWYgY29tcG9uZW50cyxcbiAgICogaW5jbHVkaW5nIHRoZSBjb21wb25lbnQgbmFtZSwgbG9jYWxlIHNldHRpbmdzLCBhbmQgbG9nZ2luZyBjYXBhYmlsaXRpZXMuIFRoZSBpbnN0YW5jZVxuICAgKiB0b2tlbiBpcyB1c2VkIGZvciBjb21wb25lbnQgaWRlbnRpZmljYXRpb24gYW5kIGxvY2FsZSBkZXJpdmF0aW9uLlxuICAgKlxuICAgKiBUaGUgY29uc3RydWN0b3IgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBpbml0aWFsaXphdGlvbiBzdGVwczpcbiAgICogMS4gU2V0cyB0aGUgY29tcG9uZW50TmFtZSBmcm9tIHRoZSBwcm92aWRlZCBpbnN0YW5jZSB0b2tlblxuICAgKiAyLiBEZXJpdmVzIHRoZSBjb21wb25lbnRMb2NhbGUgZnJvbSB0aGUgY2xhc3MgbmFtZSB1c2luZyB1dGlsaXR5IGZ1bmN0aW9uc1xuICAgKiAzLiBJbml0aWFsaXplcyB0aGUgbG9nZ2VyIGluc3RhbmNlIGZvciB0aGUgY29tcG9uZW50XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0YW5jZSAtIFRoZSBjb21wb25lbnQgaW5zdGFuY2UgdG9rZW4gdXNlZCBmb3IgaWRlbnRpZmljYXRpb25cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQSBhcyBBbmd1bGFyXG4gICAqICAgcGFydGljaXBhbnQgQyBhcyBDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBCIGFzIE5neEJhc2VDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBVIGFzIFV0aWxzXG4gICAqICAgcGFydGljaXBhbnQgTCBhcyBMb2dnZXJcbiAgICpcbiAgICogICBBLT4+QzogbmV3IENvbXBvbmVudChpbnN0YW5jZSlcbiAgICogICBDLT4+Qjogc3VwZXIoaW5zdGFuY2UpXG4gICAqICAgQi0+PkI6IFNldCBjb21wb25lbnROYW1lID0gaW5zdGFuY2VcbiAgICogICBCLT4+VTogZ2V0TG9jYWxlQ29udGV4dChpbnN0YW5jZSlcbiAgICogICBVLS0+PkI6IFJldHVybiBkZXJpdmVkIGxvY2FsZVxuICAgKiAgIEItPj5COiBTZXQgY29tcG9uZW50TG9jYWxlXG4gICAqICAgQi0+Pkw6IGdldExvZ2dlcih0aGlzKVxuICAgKiAgIEwtLT4+QjogUmV0dXJuIGxvZ2dlciBpbnN0YW5jZVxuICAgKiAgIEItPj5COiBTZXQgbG9nZ2VyXG4gICAqXG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L3ByZWZlci1pbmplY3RcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKEBJbmplY3QoJ2luc3RhbmNlVG9rZW4nKSBwcm90ZWN0ZWQgaW5zdGFuY2U6IHN0cmluZykge1xuICAgIHRoaXMuY29tcG9uZW50TmFtZSA9IGluc3RhbmNlO1xuICAgIHRoaXMuY29tcG9uZW50TG9jYWxlID0gZ2V0TG9jYWxlQ29udGV4dChpbnN0YW5jZSk7XG4gICAgdGhpcy5sb2dnZXIgPSBnZXRMb2dnZXIodGhpcyk7XG4gICAgdGhpcy5nZXRMb2NhbGUodGhpcy50cmFuc2xhdGFibGUpO1xuICAgIHRoaXMudWlkID0gZ2VuZXJhdGVSYW5kb21WYWx1ZSgxMik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHRlciBmb3IgdGhlIHJlcG9zaXRvcnkgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgY29ubmVjdGlvbiB0byB0aGUgZGF0YSBsYXllciBmb3IgcmV0cmlldmluZyBhbmQgbWFuaXB1bGF0aW5nIGRhdGEuXG4gICAqIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIHRoZSBgX3JlcG9zaXRvcnlgIHByb3BlcnR5IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHNldCwgZW5zdXJpbmdcbiAgICogdGhhdCBhIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGUgcmVwb3NpdG9yeSBpcyB1c2VkIHRocm91Z2hvdXQgdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogVGhlIHJlcG9zaXRvcnkgaXMgdXNlZCB0byBwZXJmb3JtIENSVUQgb3BlcmF0aW9ucyBvbiB0aGUgZGF0YSBtb2RlbCwgc3VjaCBhcyBmZXRjaGluZyBkYXRhLFxuICAgKiBjcmVhdGluZyBuZXcgaXRlbXMsIHVwZGF0aW5nIGV4aXN0aW5nIGl0ZW1zLCBhbmQgZGVsZXRpbmcgaXRlbXMuIEl0IGFsc28gcHJvdmlkZXMgbWV0aG9kc1xuICAgKiBmb3IgcXVlcnlpbmcgYW5kIGZpbHRlcmluZyBkYXRhIGJhc2VkIG9uIHNwZWNpZmljIGNyaXRlcmlhLlxuICAgKlxuICAgKiBAcmV0dXJucyB7RGVjYWZSZXBvc2l0b3J5PE1vZGVsPn0gVGhlIGluaXRpYWxpemVkIHJlcG9zaXRvcnkgaW5zdGFuY2UuXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHJlcG9zaXRvcnkoKTogRGVjYWZSZXBvc2l0b3J5PE1vZGVsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5fcmVwb3NpdG9yeSkge1xuICAgICAgICBjb25zdCBtb2RlbE5hbWUgID0gKHRoaXMubW9kZWwgYXMgTW9kZWwpLmNvbnN0cnVjdG9yLm5hbWVcbiAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSBNb2RlbC5nZXQobW9kZWxOYW1lKTtcbiAgICAgICAgaWYgKCFjb25zdHJ1Y3RvcilcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICdDYW5ub3QgZmluZCBtb2RlbC4gd2FzIGl0IHJlZ2lzdGVyZWQgd2l0aCBAbW9kZWw/JyxcbiAgICAgICAgICApO1xuICAgICAgICBsZXQgZGJBZGFwdGVyRmxhdm91ciA9IGdldE9uV2luZG93KCdkYkFkYXB0ZXJGbGF2b3VyJyk7XG4gICAgICAgIGlmKCFkYkFkYXB0ZXJGbGF2b3VyICYmIGlzRGV2ZWxvcG1lbnRNb2RlKCkpIHtcbiAgICAgICAgICBjb25zdCBhZGFwdGVyID0gbmV3IFJhbUFkYXB0ZXIoKTtcbiAgICAgICAgICBkYkFkYXB0ZXJGbGF2b3VyID0gYWRhcHRlci5mbGF2b3VyO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlcG9zaXRvcnkgPSBSZXBvc2l0b3J5LmZvck1vZGVsKGNvbnN0cnVjdG9yLCBkYkFkYXB0ZXJGbGF2b3VyIGFzIHN0cmluZyk7XG4gICAgICAgIHRoaXMubW9kZWwgPSBuZXcgY29uc3RydWN0b3IoKSBhcyBNb2RlbDtcbiAgICAgICAgaWYodGhpcy5tb2RlbCAmJiAhdGhpcy5waylcbiAgICAgICAgICB0aGlzLnBrID0gKHRoaXMuX3JlcG9zaXRvcnkgYXMgdW5rbm93biBhcyBEZWNhZlJlcG9zaXRvcnk8TW9kZWw+KS5wayB8fCAnaWQnO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgKGVycm9yIGFzIEVycm9yKT8ubWVzc2FnZSB8fCBlcnJvciBhcyBzdHJpbmdcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZXBvc2l0b3J5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGNoYW5nZXMgdG8gY29tcG9uZW50IGlucHV0c1xuICAgKiBAc3VtbWFyeSBUaGlzIEFuZ3VsYXIgbGlmZWN5Y2xlIGhvb2sgaXMgY2FsbGVkIHdoZW4gaW5wdXQgcHJvcGVydGllcyBjaGFuZ2UuXG4gICAqIEl0IHJlc3BvbmRzIHRvIGNoYW5nZXMgaW4gdGhlIG1vZGVsLCBsb2NhbGUsIG9yIHRyYW5zbGF0YWJsZSBwcm9wZXJ0aWVzIGJ5XG4gICAqIHVwZGF0aW5nIHRoZSBjb21wb25lbnQncyBpbnRlcm5hbCBzdGF0ZSBhY2NvcmRpbmdseS4gV2hlbiB0aGUgbW9kZWwgY2hhbmdlcyxcbiAgICogaXQgY2FsbHMgZ2V0TW9kZWwgdG8gcHJvY2VzcyB0aGUgbmV3IG1vZGVsIGFuZCBnZXRMb2NhbGUgdG8gdXBkYXRlIHRoZSBsb2NhbGUuXG4gICAqIFdoZW4gbG9jYWxlIG9yIHRyYW5zbGF0YWJsZSBwcm9wZXJ0aWVzIGNoYW5nZSwgaXQgY2FsbHMgZ2V0TG9jYWxlIHRvIHVwZGF0ZVxuICAgKiB0aGUgdHJhbnNsYXRpb24gc2V0dGluZ3MuXG4gICAqXG4gICAqIEBwYXJhbSB7U2ltcGxlQ2hhbmdlc30gY2hhbmdlcyAtIE9iamVjdCBjb250YWluaW5nIGNoYW5nZWQgcHJvcGVydGllc1xuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzW0Jhc2VDb21wb25lbnRQcm9wcy5NT0RFTF0pIHtcbiAgICAgIGNvbnN0IHsgY3VycmVudFZhbHVlIH0gPSBjaGFuZ2VzW0Jhc2VDb21wb25lbnRQcm9wcy5NT0RFTF07XG4gICAgICBpZiAoY3VycmVudFZhbHVlKSB0aGlzLmdldE1vZGVsKGN1cnJlbnRWYWx1ZSk7XG4gICAgICB0aGlzLmdldExvY2FsZSh0aGlzLnRyYW5zbGF0YWJsZSk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNoYW5nZXNbQmFzZUNvbXBvbmVudFByb3BzLklOSVRJQUxJWkVEXSB8fFxuICAgICAgY2hhbmdlc1tCYXNlQ29tcG9uZW50UHJvcHMuTE9DQUxFXSB8fFxuICAgICAgY2hhbmdlc1tCYXNlQ29tcG9uZW50UHJvcHMuVFJBTlNMQVRBQkxFXVxuICAgIClcbiAgICAgIHRoaXMuZ2V0TG9jYWxlKHRoaXMudHJhbnNsYXRhYmxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgYXBwcm9wcmlhdGUgbG9jYWxlIHN0cmluZyBiYXNlZCBvbiB0aGUgdHJhbnNsYXRhYmxlIGZsYWcgYW5kIGF2YWlsYWJsZSBsb2NhbGVzLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHdoaWNoIGxvY2FsZSBzdHJpbmcgdG8gdXNlIGZvciB0cmFuc2xhdGlvbiBiYXNlZCBvbiB0aGUgdHJhbnNsYXRhYmxlIGZsYWdcbiAgICogYW5kIGF2YWlsYWJsZSBsb2NhbGUgc2V0dGluZ3MuIFRoaXMgbWV0aG9kIGZpcnN0IGNvbnZlcnRzIHRoZSB0cmFuc2xhdGFibGUgcGFyYW1ldGVyIHRvIGEgYm9vbGVhblxuICAgKiB1c2luZyB0aGUgc3RyaW5nVG9Cb29sZWFuIHV0aWxpdHkgZnVuY3Rpb24uIElmIHRyYW5zbGF0YWJsZSBpcyBmYWxzZSwgaXQgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcsXG4gICAqIGluZGljYXRpbmcgbm8gdHJhbnNsYXRpb24gc2hvdWxkIGJlIHBlcmZvcm1lZC4gSWYgdHJhbnNsYXRhYmxlIGlzIHRydWUsIGl0IGNoZWNrcyBmb3IgYW4gZXhwbGljaXRseVxuICAgKiBwcm92aWRlZCBsb2NhbGUgdmlhIHRoZSBsb2NhbGUgcHJvcGVydHkuIElmIG5vIGV4cGxpY2l0IGxvY2FsZSBpcyBhdmFpbGFibGUsIGl0IGZhbGxzIGJhY2sgdG8gdGhlXG4gICAqIGNvbXBvbmVudExvY2FsZSBkZXJpdmVkIGZyb20gdGhlIGNvbXBvbmVudCdzIGNsYXNzIG5hbWUuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nT3JCb29sZWFufSB0cmFuc2xhdGFibGUgLSBXaGV0aGVyIHRoZSBjb21wb25lbnQgc2hvdWxkIGJlIHRyYW5zbGF0ZWRcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgbG9jYWxlIHN0cmluZyB0byB1c2UgZm9yIHRyYW5zbGF0aW9uLCBvciBlbXB0eSBzdHJpbmcgaWYgbm90IHRyYW5zbGF0YWJsZVxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDIGFzIENvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IE4gYXMgTmd4QmFzZUNvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IFMgYXMgU3RyaW5nVXRpbHNcbiAgICpcbiAgICogICBDLT4+TjogZ2V0TG9jYWxlKHRyYW5zbGF0YWJsZSlcbiAgICogICBOLT4+Uzogc3RyaW5nVG9Cb29sZWFuKHRyYW5zbGF0YWJsZSlcbiAgICogICBTLS0+Pk46IFJldHVybiBib29sZWFuIHZhbHVlXG4gICAqICAgTi0+Pk46IFN0b3JlIGluIHRoaXMudHJhbnNsYXRhYmxlXG4gICAqICAgYWx0IHRyYW5zbGF0YWJsZSBpcyBmYWxzZVxuICAgKiAgICAgTi0tPj5DOiBSZXR1cm4gZW1wdHkgc3RyaW5nXG4gICAqICAgZWxzZSB0cmFuc2xhdGFibGUgaXMgdHJ1ZVxuICAgKiAgICAgYWx0IHRoaXMubG9jYWxlIGlzIGRlZmluZWRcbiAgICogICAgICAgTi0tPj5DOiBSZXR1cm4gdGhpcy5sb2NhbGVcbiAgICogICAgIGVsc2UgdGhpcy5sb2NhbGUgaXMgbm90IGRlZmluZWRcbiAgICogICAgICAgTi0tPj5DOiBSZXR1cm4gdGhpcy5jb21wb25lbnRMb2NhbGVcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKi9cbiAgZ2V0TG9jYWxlKHRyYW5zbGF0YWJsZTogU3RyaW5nT3JCb29sZWFuKTogc3RyaW5nIHtcbiAgICB0aGlzLnRyYW5zbGF0YWJsZSA9IHN0cmluZ1RvQm9vbGVhbih0cmFuc2xhdGFibGUpO1xuICAgIGlmICghdGhpcy50cmFuc2xhdGFibGUpXG4gICAgICByZXR1cm4gJyc7XG4gICAgaWYgKCF0aGlzLmxvY2FsZSlcbiAgICAgIHRoaXMubG9jYWxlID0gdGhpcy5jb21wb25lbnRMb2NhbGU7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSByb3V0ZSBmb3IgdGhlIGNvbXBvbmVudFxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIHJvdXRlIHBhdGggZm9yIHRoZSBjb21wb25lbnQsIGdlbmVyYXRpbmcgb25lIGJhc2VkIG9uIHRoZSBtb2RlbFxuICAgKiBpZiBubyByb3V0ZSBpcyBleHBsaWNpdGx5IHNldC4gVGhpcyBtZXRob2QgY2hlY2tzIGlmIGEgcm91dGUgaXMgYWxyZWFkeSBkZWZpbmVkLCBhbmQgaWYgbm90LFxuICAgKiBpdCBjcmVhdGVzIGEgZGVmYXVsdCByb3V0ZSBiYXNlZCBvbiB0aGUgbW9kZWwncyBjb25zdHJ1Y3RvciBuYW1lLiBUaGUgZ2VuZXJhdGVkIHJvdXRlIGZvbGxvd3NcbiAgICogdGhlIHBhdHRlcm4gJy9tb2RlbC97TW9kZWxOYW1lfScuIFRoaXMgaXMgdXNlZnVsIGZvciBhdXRvbWF0aWMgcm91dGluZyBpbiBDUlVEIG9wZXJhdGlvbnMuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHJvdXRlIHBhdGggZm9yIHRoZSBjb21wb25lbnQsIG9yIGVtcHR5IHN0cmluZyBpZiBubyByb3V0ZSBpcyBhdmFpbGFibGVcbiAgICovXG4gIGdldFJvdXRlKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnJvdXRlICYmIHRoaXMubW9kZWwgaW5zdGFuY2VvZiBNb2RlbClcbiAgICAgIHRoaXMucm91dGUgPSBgL21vZGVsLyR7dGhpcy5tb2RlbD8uY29uc3RydWN0b3IubmFtZX1gO1xuICAgIHJldHVybiB0aGlzLnJvdXRlIHx8ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXNvbHZlcyBhbmQgc2V0cyB0aGUgY29tcG9uZW50J3MgbW9kZWxcbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIHRoZSBwcm92aWRlZCBtb2RlbCBwYXJhbWV0ZXIsIHdoaWNoIGNhbiBiZSBlaXRoZXIgYSBNb2RlbCBpbnN0YW5jZVxuICAgKiBvciBhIHN0cmluZyBpZGVudGlmaWVyLiBJZiBhIHN0cmluZyBpcyBwcm92aWRlZCwgaXQgYXR0ZW1wdHMgdG8gcmVzb2x2ZSB0aGUgYWN0dWFsIG1vZGVsXG4gICAqIGZyb20gdGhlIGluamVjdGFibGVzIHJlZ2lzdHJ5LiBBZnRlciByZXNvbHZpbmcgdGhlIG1vZGVsLCBpdCBjYWxscyBzZXRNb2RlbERlZmluaXRpb25zXG4gICAqIHRvIGNvbmZpZ3VyZSB0aGUgY29tcG9uZW50IGJhc2VkIG9uIHRoZSBtb2RlbCdzIG1ldGFkYXRhLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IE1vZGVsfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBvciBpZGVudGlmaWVyIHN0cmluZ1xuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgZ2V0TW9kZWwobW9kZWw6IHN0cmluZyB8IE1vZGVsKTogdm9pZCB7XG4gICAgaWYgKCEobW9kZWwgaW5zdGFuY2VvZiBNb2RlbCkpXG4gICAgICB0aGlzLm1vZGVsID0gZ2V0SW5qZWN0YWJsZXNSZWdpc3RyeSgpLmdldChtb2RlbCkgYXMgTW9kZWw7XG4gICAgdGhpcy5zZXRNb2RlbERlZmluaXRpb25zKHRoaXMubW9kZWwgYXMgTW9kZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb25maWd1cmVzIGNvbXBvbmVudCBwcm9wZXJ0aWVzIGJhc2VkIG9uIG1vZGVsIG1ldGFkYXRhXG4gICAqIEBzdW1tYXJ5IEV4dHJhY3RzIGFuZCBhcHBsaWVzIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgbW9kZWwncyBkZWNvcmF0b3JzIHRvIHNldCB1cFxuICAgKiB0aGUgY29tcG9uZW50LiBUaGlzIG1ldGhvZCB1c2VzIHRoZSByZW5kZXJpbmcgZW5naW5lIHRvIHJldHJpZXZlIGRlY29yYXRvciBtZXRhZGF0YVxuICAgKiBmcm9tIHRoZSBtb2RlbCwgdGhlbiBjb25maWd1cmVzIHRoZSBjb21wb25lbnQncyBtYXBwZXIgYW5kIGl0ZW0gcHJvcGVydGllcyBhY2NvcmRpbmdseS5cbiAgICogSXQgZW5zdXJlcyB0aGUgcm91dGUgaXMgcHJvcGVybHkgc2V0IGFuZCBtZXJnZXMgdmFyaW91cyBwcm9wZXJ0aWVzIGZyb20gdGhlIG1vZGVsJ3NcbiAgICogbWV0YWRhdGEgaW50byB0aGUgY29tcG9uZW50J3MgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtNb2RlbH0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gZXh0cmFjdCBjb25maWd1cmF0aW9uIGZyb21cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHNldE1vZGVsRGVmaW5pdGlvbnMobW9kZWw6IE1vZGVsKTogdm9pZCB7XG4gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgTW9kZWwpIHtcbiAgICAgIHRoaXMuZ2V0Um91dGUoKTtcbiAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5yZW5kZXJpbmdFbmdpbmUuZ2V0RGVjb3JhdG9ycyh0aGlzLm1vZGVsIGFzIE1vZGVsLCB7fSk7XG4gICAgICBjb25zdHsgcHJvcHMsIGl0ZW0sIGNoaWxkcmVuIH0gPSBmaWVsZDtcbiAgICAgIHRoaXMucHJvcHMgPSBPYmplY3QuYXNzaWduKHByb3BzIHx8IHt9LCB7Y2hpbGRyZW46IGNoaWxkcmVuIHx8IFtdfSk7XG4gICAgICBpZihpdGVtPy5wcm9wcz8uWydtYXBwZXInXSlcbiAgICAgICAgdGhpcy5tYXBwZXIgPSBpdGVtPy5wcm9wcyFbJ21hcHBlciddIHx8IHt9O1xuICAgICAgdGhpcy5pdGVtID0ge1xuICAgICAgICB0YWc6IGl0ZW0/LnRhZyB8fCAnJyxcbiAgICAgICAgLi4uaXRlbT8ucHJvcHMsXG4gICAgICAgIC4uLih0aGlzLm1hcHBlciA/IHttYXBwZXI6IHRoaXMubWFwcGVyfSA6IHt9KSxcbiAgICAgICAgLi4ueyByb3V0ZTogaXRlbT8ucHJvcHM/Llsncm91dGUnXSB8fCB0aGlzLnJvdXRlIH0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGNvbXBvbmVudFxuICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBvbmUtdGltZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgY29tcG9uZW50LiBUaGlzIG1ldGhvZCBjaGVja3MgaWZcbiAgICogdGhlIGNvbXBvbmVudCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHRvIHByZXZlbnQgZHVwbGljYXRlIGluaXRpYWxpemF0aW9uLlxuICAgKiBXaGVuIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUsIGl0IHNldHMgdGhlIGluaXRpYWxpemVkIGZsYWcgdG8gdHJ1ZSBhbmQgbG9nc1xuICAgKiBhbiBpbml0aWFsaXphdGlvbiBtZXNzYWdlIHdpdGggdGhlIGNvbXBvbmVudCBuYW1lLiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgY2FsbGVkXG4gICAqIGR1cmluZyB0aGUgY29tcG9uZW50J3MgbGlmZWN5Y2xlIHNldHVwLlxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBjdXN0b20gZXZlbnRzIGZyb20gY2hpbGQgY29tcG9uZW50cy5cbiAgICogQHN1bW1hcnkgUmVjZWl2ZXMgZXZlbnRzIGZyb20gY2hpbGQgcmVuZGVyZXIgY29tcG9uZW50cyBhbmQgZm9yd2FyZHMgdGhlbSB0byBwYXJlbnRcbiAgICogY29tcG9uZW50cyB0aHJvdWdoIHRoZSBsaXN0ZW5FdmVudCBvdXRwdXQuIFRoaXMgY3JlYXRlcyBhbiBldmVudCBwcm9wYWdhdGlvbiBjaGFpblxuICAgKiB0aGF0IGFsbG93cyBldmVudHMgdG8gYnViYmxlIHVwIHRocm91Z2ggdGhlIGNvbXBvbmVudCBoaWVyYXJjaHksIGVuYWJsaW5nIGNvb3JkaW5hdGVkXG4gICAqIHJlc3BvbnNlcyB0byB1c2VyIGludGVyYWN0aW9ucyBhY3Jvc3MgdGhlIGxheW91dCBzdHJ1Y3R1cmUuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVuZGVyZXJDdXN0b21FdmVudH0gZXZlbnQgLSBUaGUgY3VzdG9tIGV2ZW50IGZyb20gYSBjaGlsZCBjb21wb25lbnRcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQyBhcyBDaGlsZCBDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBMIGFzIE5neEJhc2VDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBQIGFzIFBhcmVudCBDb21wb25lbnRcbiAgICpcbiAgICogICBDLT4+TDogRW1pdCBSZW5kZXJlckN1c3RvbUV2ZW50XG4gICAqICAgTC0+Pkw6IGhhbmRsZUV2ZW50KGV2ZW50KVxuICAgKiAgIEwtPj5QOiBsaXN0ZW5FdmVudC5lbWl0KGV2ZW50KVxuICAgKiAgIE5vdGUgb3ZlciBQOiBIYW5kbGUgZXZlbnQgaW4gcGFyZW50XG4gICAqXG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBoYW5kbGVFdmVudChldmVudDogUmVuZGVyZXJDdXN0b21FdmVudCk6IHZvaWQge1xuICAgIHRoaXMubGlzdGVuRXZlbnQuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRyYWNrcyBpdGVtcyBpbiBuZ0ZvciBsb29wcyBmb3Igb3B0aW1hbCBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhIHRyYWNraW5nIGZ1bmN0aW9uIGZvciBBbmd1bGFyJ3MgKm5nRm9yIGRpcmVjdGl2ZSB0byBvcHRpbWl6ZSByZW5kZXJpbmdcbiAgICogcGVyZm9ybWFuY2UuIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyB1bmlxdWUgaWRlbnRpZmllcnMgZm9yIGxpc3QgaXRlbXMgYmFzZWQgb24gdGhlaXIgaW5kZXhcbiAgICogYW5kIGNvbnRlbnQsIGFsbG93aW5nIEFuZ3VsYXIgdG8gZWZmaWNpZW50bHkgdHJhY2sgY2hhbmdlcyBhbmQgbWluaW1pemUgRE9NIG1hbmlwdWxhdGlvbnNcbiAgICogZHVyaW5nIGxpc3QgdXBkYXRlcy4gVGhlIHRyYWNraW5nIGZ1bmN0aW9uIGlzIGVzc2VudGlhbCBmb3IgbWFpbnRhaW5pbmcgY29tcG9uZW50IHN0YXRlXG4gICAqIGFuZCBwcmV2ZW50aW5nIHVubmVjZXNzYXJ5IHJlLXJlbmRlcmluZyBvZiB1bmNoYW5nZWQgaXRlbXMuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgaXRlbSBpbiB0aGUgbGlzdFxuICAgKiBAcGFyYW0ge0tleVZhbHVlIHwgc3RyaW5nIHwgbnVtYmVyfSBpdGVtIC0gVGhlIGl0ZW0gZGF0YSB0byB0cmFja1xuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVtYmVyfSBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgaXRlbVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgdHJhY2tJdGVtRm4oaW5kZXg6IG51bWJlciwgaXRlbTogS2V5VmFsdWUgfCBzdHJpbmcgfCBudW1iZXIpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIHJldHVybiBgJHtpbmRleH0tJHtpdGVtfWA7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhbmQgYXBwbGllcyBwcm9wZXJ0aWVzIGZyb20gdGhlIHByb3BzIG9iamVjdCB0byB0aGUgY29tcG9uZW50IGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBpdGVyYXRlcyB0aHJvdWdoIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBwcm92aWRlZCBpbnN0YW5jZSBvYmplY3RcbiAgICogYW5kIGFwcGxpZXMgYW55IG1hdGNoaW5nIHByb3BlcnRpZXMgZnJvbSB0aGUgY29tcG9uZW50J3MgcHJvcHMgY29uZmlndXJhdGlvbiB0byB0aGVcbiAgICogY29tcG9uZW50IGluc3RhbmNlLiBUaGlzIGFsbG93cyBmb3IgZHluYW1pYyBwcm9wZXJ0eSBhc3NpZ25tZW50IGJhc2VkIG9uIGNvbmZpZ3VyYXRpb25cbiAgICogc3RvcmVkIGluIHRoZSBwcm9wcyBvYmplY3QsIGVuYWJsaW5nIGZsZXhpYmxlIGNvbXBvbmVudCBjdXN0b21pemF0aW9uIHdpdGhvdXQgcmVxdWlyaW5nXG4gICAqIGV4cGxpY2l0IHByb3BlcnR5IGJpbmRpbmcgZm9yIGV2ZXJ5IHBvc3NpYmxlIGNvbmZpZ3VyYXRpb24gb3B0aW9uLlxuICAgKlxuICAgKiBUaGUgbWV0aG9kIHBlcmZvcm1zIGEgc2FmZSBwcm9wZXJ0eSBhc3NpZ25tZW50IGJ5IGNoZWNraW5nIGlmIGVhY2gga2V5IGZyb20gdGhlIGluc3RhbmNlXG4gICAqIGV4aXN0cyBpbiB0aGUgcHJvcHMgb2JqZWN0IGJlZm9yZSBhcHBseWluZyBpdC4gVGhpcyBwcmV2ZW50cyBhY2NpZGVudGFsIHByb3BlcnR5XG4gICAqIG92ZXJ3cml0aW5nIGFuZCBlbnN1cmVzIG9ubHkgaW50ZW5kZWQgcHJvcGVydGllcyBhcmUgbW9kaWZpZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7S2V5VmFsdWV9IGluc3RhbmNlIC0gVGhlIGNvbXBvbmVudCBpbnN0YW5jZSBvYmplY3QgdG8gcHJvY2Vzc1xuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDIGFzIENvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IEIgYXMgTmd4QmFzZUNvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IFAgYXMgUHJvcHMgT2JqZWN0XG4gICAqXG4gICAqICAgQy0+PkI6IHBhcnNlUHJvcHMoaW5zdGFuY2UpXG4gICAqICAgQi0+PkI6IEdldCBPYmplY3Qua2V5cyhpbnN0YW5jZSlcbiAgICogICBsb29wIEZvciBlYWNoIGtleSBpbiBpbnN0YW5jZVxuICAgKiAgICAgQi0+PlA6IENoZWNrIGlmIGtleSBleGlzdHMgaW4gdGhpcy5wcm9wc1xuICAgKiAgICAgYWx0IEtleSBleGlzdHMgaW4gcHJvcHNcbiAgICogICAgICAgQi0+PkI6IFNldCB0aGlzW2tleV0gPSB0aGlzLnByb3BzW2tleV1cbiAgICogICAgIGVsc2UgS2V5IG5vdCBpbiBwcm9wc1xuICAgKiAgICAgICBOb3RlIG92ZXIgQjogU2tpcCB0aGlzIGtleVxuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIHByb3RlY3RlZCBwYXJzZVByb3BzKGluc3RhbmNlOiBLZXlWYWx1ZSk6IHZvaWQge1xuICAgIE9iamVjdC5rZXlzKGluc3RhbmNlKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmKE9iamVjdC5rZXlzKHRoaXMucHJvcHMpLmluY2x1ZGVzKGtleSkpXG4gICAgICAgICh0aGlzIGFzIEtleVZhbHVlKVtrZXldID0gdGhpcy5wcm9wc1trZXldO1xuICAgIH0pXG4gIH1cbn1cbiJdfQ==
541
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmd4QmFzZUNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL05neEJhc2VDb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLEtBQUssRUFDTCxTQUFTLEVBQ1QsTUFBTSxFQUNOLFNBQVMsRUFDVCxVQUFVLEVBR1YsTUFBTSxFQUNOLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0QixXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLGVBQWUsR0FDaEIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkQsT0FBTyxFQUVMLGFBQWEsRUFDYixhQUFhLEdBQ2QsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFMUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXpELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0FBRWhEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkRHO0FBTUgsTUFBTSxPQUFnQixnQkFBZ0I7SUF1U3BDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FpQ0c7SUFDSCx5REFBeUQ7SUFDekQsWUFBeUQsUUFBZ0I7UUFBaEIsYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQWpRekU7Ozs7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QUFFLEtBQUssRUFBRTtpQkFDN0I7OzBCQTJVd0IsTUFBTTsyQkFBQyxlQUFlO3lDQTlUN0MsU0FBUztzQkFEUixTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFpQzFELFVBQVU7c0JBRFQsS0FBSztnQkFZTixLQUFLO3NCQURKLEtBQUs7Z0JBZ0NOLEtBQUs7c0JBREosS0FBSztnQkFnQk4sSUFBSTtzQkFESCxLQUFLO2dCQWFOLEVBQUU7c0JBREQsS0FBSztnQkFZTixLQUFLO3NCQURKLEtBQUs7Z0JBWU4sVUFBVTtzQkFEVCxLQUFLO2dCQVlOLEdBQUc7c0JBREYsS0FBSztnQkFZTixNQUFNO3NCQURMLEtBQUs7Z0JBZU4sTUFBTTtzQkFETCxLQUFLO2dCQWVOLFlBQVk7c0JBRFgsS0FBSztnQkFlTixTQUFTO3NCQURSLEtBQUs7Z0JBZ0JOLElBQUk7c0JBREgsS0FBSztnQkE0Qk4sV0FBVztzQkFEVixLQUFLO2dCQXlCTixXQUFXO3NCQURWLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBJbnB1dCxcbiAgQ29tcG9uZW50LFxuICBJbmplY3QsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBLZXlWYWx1ZSwgUmVuZGVyZXJDdXN0b21FdmVudCwgU3RyaW5nT3JCb29sZWFuIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge1xuICBnZW5lcmF0ZVJhbmRvbVZhbHVlLFxuICBnZXRJbmplY3RhYmxlc1JlZ2lzdHJ5LFxuICBnZXRPbldpbmRvdyxcbiAgaXNEZXZlbG9wbWVudE1vZGUsXG4gIHN0cmluZ1RvQm9vbGVhbixcbn0gZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5pbXBvcnQgeyBnZXRMb2NhbGVDb250ZXh0IH0gZnJvbSAnLi4vaTE4bi9Mb2FkZXInO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb24nO1xuaW1wb3J0IHtcbiAgQ3J1ZE9wZXJhdGlvbnMsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gJ0BkZWNhZi10cy9kYi1kZWNvcmF0b3JzJztcbmltcG9ydCB7IEJhc2VDb21wb25lbnRQcm9wcyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IE5neFJlbmRlcmluZ0VuZ2luZSB9IGZyb20gJy4vTmd4UmVuZGVyaW5nRW5naW5lJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BkZWNhZi10cy9sb2dnaW5nJztcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4uL2Zvci1hbmd1bGFyLWNvbW1vbi5tb2R1bGUnO1xuaW1wb3J0IHsgRGVjYWZSZXBvc2l0b3J5IH0gZnJvbSAnLi4vY29tcG9uZW50cy9saXN0L2NvbnN0YW50cyc7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSAnQGRlY2FmLXRzL2NvcmUnO1xuaW1wb3J0IHsgUmFtQWRhcHRlciB9IGZyb20gJ0BkZWNhZi10cy9jb3JlL3JhbSc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEJhc2UgY29tcG9uZW50IGNsYXNzIHRoYXQgcHJvdmlkZXMgY29tbW9uIGZ1bmN0aW9uYWxpdHkgZm9yIGFsbCBEZWNhZiBjb21wb25lbnRzLlxuICogQHN1bW1hcnkgVGhlIE5neEJhc2VDb21wb25lbnQgc2VydmVzIGFzIHRoZSBmb3VuZGF0aW9uIGZvciBhbGwgRGVjYWYgVUkgY29tcG9uZW50cywgcHJvdmlkaW5nXG4gKiBzaGFyZWQgZnVuY3Rpb25hbGl0eSBmb3IgbG9jYWxpemF0aW9uLCBlbGVtZW50IHJlZmVyZW5jZXMsIGFuZCBzdHlsaW5nLiBUaGlzIGFic3RyYWN0IGNsYXNzXG4gKiBpbXBsZW1lbnRzIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIHRoYXQgYXJlIHVzZWQgYWNyb3NzIHRoZSBjb21wb25lbnQgbGlicmFyeSwgZW5zdXJpbmdcbiAqIGNvbnNpc3RlbnQgYmVoYXZpb3IgYW5kIHJlZHVjaW5nIGNvZGUgZHVwbGljYXRpb24uIENvbXBvbmVudHMgdGhhdCBleHRlbmQgdGhpcyBjbGFzcyBpbmhlcml0XG4gKiBpdHMgY2FwYWJpbGl0aWVzIGZvciBoYW5kbGluZyB0cmFuc2xhdGlvbnMsIGFjY2Vzc2luZyBET00gZWxlbWVudHMsIGFuZCBhcHBseWluZyBjdXN0b20gc3R5bGluZy5cbiAqXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgdGhpcyBjb21wb25lbnQgd29ya3Mgd2l0aFxuICogQHBhcmFtIHtzdHJpbmd9IGluc3RhbmNlIC0gVGhlIGNvbXBvbmVudCBpbnN0YW5jZSB0b2tlbiB1c2VkIGZvciBpZGVudGlmaWNhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsZSAtIFRoZSBsb2NhbGUgdG8gYmUgdXNlZCBmb3IgdHJhbnNsYXRpb25zXG4gKiBAcGFyYW0ge1N0cmluZ09yQm9vbGVhbn0gdHJhbnNsYXRhYmxlIC0gV2hldGhlciB0aGUgY29tcG9uZW50IHNob3VsZCBiZSB0cmFuc2xhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIC0gQWRkaXRpb25hbCBDU1MgY2xhc3NlcyB0byBhcHBseSB0byB0aGUgY29tcG9uZW50XG4gKiBAcGFyYW0ge1wiaW9zXCIgfCBcIm1kXCIgfCB1bmRlZmluZWR9IG1vZGUgLSBDb21wb25lbnQgcGxhdGZvcm0gc3R5bGVcbiAqXG4gKiBAY29tcG9uZW50IE5neEJhc2VDb21wb25lbnRcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdhcHAtbXktY29tcG9uZW50JyxcbiAqICAgdGVtcGxhdGVVcmw6ICcuL215LWNvbXBvbmVudC5jb21wb25lbnQuaHRtbCcsXG4gKiAgIHN0eWxlVXJsczogWycuL215LWNvbXBvbmVudC5jb21wb25lbnQuc2NzcyddXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IGV4dGVuZHMgTmd4QmFzZUNvbXBvbmVudCB7XG4gKiAgIGNvbnN0cnVjdG9yKEBJbmplY3QoJ2luc3RhbmNlVG9rZW4nKSBpbnN0YW5jZTogc3RyaW5nKSB7XG4gKiAgICAgc3VwZXIoaW5zdGFuY2UpO1xuICogICB9XG4gKlxuICogICBuZ09uSW5pdCgpIHtcbiAqICAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAqICAgICAvLyBDb21wb25lbnQtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb25cbiAqICAgfVxuICogfVxuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcCBhcyBBcHBsaWNhdGlvblxuICogICBwYXJ0aWNpcGFudCBDb21wIGFzIENvbXBvbmVudFxuICogICBwYXJ0aWNpcGFudCBCYXNlIGFzIE5neEJhc2VDb21wb25lbnRcbiAqICAgcGFydGljaXBhbnQgRW5naW5lIGFzIE5neFJlbmRlcmluZ0VuZ2luZVxuICpcbiAqICAgQXBwLT4+Q29tcDogQ3JlYXRlIGNvbXBvbmVudFxuICogICBDb21wLT4+QmFzZTogc3VwZXIoaW5zdGFuY2UpXG4gKiAgIEJhc2UtPj5CYXNlOiBTZXQgY29tcG9uZW50TmFtZSAmIGNvbXBvbmVudExvY2FsZVxuICpcbiAqICAgQXBwLT4+Q29tcDogU2V0IEBJbnB1dCBwcm9wZXJ0aWVzXG4gKiAgIENvbXAtPj5CYXNlOiBuZ09uQ2hhbmdlcyhjaGFuZ2VzKVxuICpcbiAqICAgYWx0IG1vZGVsIGNoYW5nZWRcbiAqICAgICBCYXNlLT4+QmFzZTogZ2V0TW9kZWwobW9kZWwpXG4gKiAgICAgQmFzZS0+PkVuZ2luZTogZ2V0RGVjb3JhdG9ycyhtb2RlbCwge30pXG4gKiAgICAgRW5naW5lLS0+PkJhc2U6IFJldHVybiBkZWNvcmF0b3IgbWV0YWRhdGFcbiAqICAgICBCYXNlLT4+QmFzZTogQ29uZmlndXJlIG1hcHBlciBhbmQgaXRlbVxuICogICAgIEJhc2UtPj5CYXNlOiBnZXRMb2NhbGUodHJhbnNsYXRhYmxlKVxuICogICBlbHNlIGxvY2FsZS90cmFuc2xhdGFibGUgY2hhbmdlZFxuICogICAgIEJhc2UtPj5CYXNlOiBnZXRMb2NhbGUodHJhbnNsYXRhYmxlKVxuICogICBlbmRcbiAqXG4gKiAgIEFwcC0+PkNvbXA6IG5nT25Jbml0KClcbiAqICAgQ29tcC0+PkJhc2U6IGluaXRpYWxpemUoKVxuICogICBCYXNlLT4+QmFzZTogU2V0IGluaXRpYWxpemVkIGZsYWdcbiAqL1xuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHRlbXBsYXRlOiAnPGRpdj48L2Rpdj4nLFxuICBob3N0OiB7ICdbYXR0ci5pZF0nOiAndWlkJyB9LFxufSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOZ3hCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZlcmVuY2UgdG8gdGhlIGNvbXBvbmVudCdzIGVsZW1lbnQuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIG5hdGl2ZSBET00gZWxlbWVudCBvZiB0aGUgY29tcG9uZW50IHRocm91Z2ggQW5ndWxhcidzXG4gICAqIFZpZXdDaGlsZCBkZWNvcmF0b3IuIFRoaXMgcmVmZXJlbmNlIGNhbiBiZSB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIERPTSBlbGVtZW50IGRpcmVjdGx5LFxuICAgKiBhcHBseSBjdXN0b20gc3R5bGVzLCBvciBhY2Nlc3MgbmF0aXZlIGVsZW1lbnQgcHJvcGVydGllcyBhbmQgbWV0aG9kcy4gVGhlIGVsZW1lbnQgaXNcbiAgICogaWRlbnRpZmllZCBieSB0aGUgJ2NvbXBvbmVudCcgdGVtcGxhdGUgcmVmZXJlbmNlIHZhcmlhYmxlLlxuICAgKlxuICAgKiBAdHlwZSB7RWxlbWVudFJlZn1cbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2NvbXBvbmVudCcsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiB0cnVlIH0pXG4gIGNvbXBvbmVudCE6IEVsZW1lbnRSZWY7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCwgd2hpY2ggaXMgdHlwaWNhbGx5IGRlcml2ZWQgZnJvbSB0aGUgY2xhc3MgbmFtZS5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGludGVybmFsbHkgZm9yIHZhcmlvdXMgcHVycG9zZXMgc3VjaCBhcyBsb2dnaW5nLCBkZXJpdmluZyB0aGUgZGVmYXVsdFxuICAgKiBsb2NhbGUsIGFuZCBwb3RlbnRpYWxseSBmb3IgY29tcG9uZW50IGlkZW50aWZpY2F0aW9uIGluIGRlYnVnZ2luZyBvciBlcnJvciByZXBvcnRpbmcuXG4gICAqXG4gICAqIFRoZSBgY29tcG9uZW50TmFtZWAgaXMgc2V0IGR1cmluZyB0aGUgY29tcG9uZW50J3MgaW5pdGlhbGl6YXRpb24gcHJvY2VzcyBhbmQgc2hvdWxkIG5vdFxuICAgKiBiZSBtb2RpZmllZCBleHRlcm5hbGx5LiBJdCdzIG1hcmtlZCBhcyBwcm90ZWN0ZWQgdG8gYWxsb3cgYWNjZXNzIGluIGRlcml2ZWQgY2xhc3NlcyB3aGlsZVxuICAgKiBwcmV2ZW50aW5nIGRpcmVjdCBhY2Nlc3MgZnJvbSBvdXRzaWRlIHRoZSBjb21wb25lbnQgaGllcmFyY2h5LlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIEluc2lkZSBhIGRlcml2ZWQgY29tcG9uZW50IGNsYXNzXG4gICAqIGNvbnNvbGUubG9nKHRoaXMuY29tcG9uZW50TmFtZSk7IC8vIE91dHB1dHM6IFwiTXlDdXN0b21Db21wb25lbnRcIlxuICAgKi9cbiAgY29tcG9uZW50TmFtZSE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVuZGVyZXIuXG4gICAqIEBzdW1tYXJ5IEEgdW5pcXVlIGlkZW50aWZpZXIgdXNlZCB0byByZWZlcmVuY2UgdGhlIGNvbXBvbmVudCdzIHJlbmRlcmVyIGluc3RhbmNlLlxuICAgKiBUaGlzIGNhbiBiZSB1c2VkIGZvciB0YXJnZXRpbmcgc3BlY2lmaWMgcmVuZGVyZXIgaW5zdGFuY2VzIHdoZW4gbXVsdGlwbGUgY29tcG9uZW50c1xuICAgKiBhcmUgcHJlc2VudCBvbiB0aGUgc2FtZSBwYWdlLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgcmVuZGVyZXJJZCE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlcG9zaXRvcnkgbW9kZWwgZm9yIGRhdGEgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgVGhlIGRhdGEgbW9kZWwgcmVwb3NpdG9yeSB0aGF0IHRoaXMgY29tcG9uZW50IHdpbGwgdXNlIGZvciBDUlVEIG9wZXJhdGlvbnMuXG4gICAqIFRoaXMgcHJvdmlkZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhIGxheWVyIGZvciByZXRyaWV2aW5nIGFuZCBtYW5pcHVsYXRpbmcgZGF0YS5cbiAgICpcbiAgICogQHR5cGUge01vZGVsfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBtb2RlbCE6IE1vZGVsIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHJlcG9zaXRvcnkgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIGRhdGEgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgY29ubmVjdGlvbiB0byB0aGUgZGF0YSBsYXllciBmb3IgcmV0cmlldmluZyBhbmQgbWFuaXB1bGF0aW5nIGRhdGEuXG4gICAqIFRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGBEZWNhZlJlcG9zaXRvcnlgIGNsYXNzIGZyb20gdGhlIGBAZGVjYWYtdHMvY29yZWAgcGFja2FnZSxcbiAgICogd2hpY2ggaXMgaW5pdGlhbGl6ZWQgaW4gdGhlIGByZXBvc2l0b3J5YCBnZXR0ZXIgbWV0aG9kLlxuICAgKlxuICAgKiBUaGUgcmVwb3NpdG9yeSBpcyB1c2VkIHRvIHBlcmZvcm0gQ1JVRCAoQ3JlYXRlLCBSZWFkLCBVcGRhdGUsIERlbGV0ZSkgb3BlcmF0aW9ucyBvbiB0aGVcbiAgICogZGF0YSBtb2RlbCwgc3VjaCBhcyBmZXRjaGluZyBkYXRhLCBjcmVhdGluZyBuZXcgaXRlbXMsIHVwZGF0aW5nIGV4aXN0aW5nIGl0ZW1zLCBhbmQgZGVsZXRpbmdcbiAgICogaXRlbXMuIEl0IGFsc28gcHJvdmlkZXMgbWV0aG9kcyBmb3IgcXVlcnlpbmcgYW5kIGZpbHRlcmluZyBkYXRhIGJhc2VkIG9uIHNwZWNpZmljIGNyaXRlcmlhLlxuICAgKlxuICAgKiBAdHlwZSB7RGVjYWZSZXBvc2l0b3J5PE1vZGVsPn1cbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIHByb3RlY3RlZCBfcmVwb3NpdG9yeT86IERlY2FmUmVwb3NpdG9yeTxNb2RlbD47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEeW5hbWljIHByb3BlcnRpZXMgY29uZmlndXJhdGlvbiBvYmplY3QuXG4gICAqIEBzdW1tYXJ5IENvbnRhaW5zIGtleS12YWx1ZSBwYWlycyBvZiBkeW5hbWljIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byB0aGUgY29tcG9uZW50XG4gICAqIGF0IHJ1bnRpbWUuIFRoaXMgZmxleGlibGUgY29uZmlndXJhdGlvbiBvYmplY3QgYWxsb3dzIGZvciBkeW5hbWljIHByb3BlcnR5IGFzc2lnbm1lbnQgd2l0aG91dFxuICAgKiByZXF1aXJpbmcgZXhwbGljaXQgaW5wdXQgYmluZGluZ3MgZm9yIGV2ZXJ5IHBvc3NpYmxlIGNvbmZpZ3VyYXRpb24gb3B0aW9uLiBQcm9wZXJ0aWVzIGZyb21cbiAgICogdGhpcyBvYmplY3QgYXJlIHBhcnNlZCBhbmQgYXBwbGllZCB0byB0aGUgY29tcG9uZW50IGluc3RhbmNlIHRocm91Z2ggdGhlIHBhcnNlUHJvcHMgbWV0aG9kLFxuICAgKiBlbmFibGluZyBjdXN0b21pemFibGUgY29tcG9uZW50IGJlaGF2aW9yIGJhc2VkIG9uIGV4dGVybmFsIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn1cbiAgICogQGRlZmF1bHQge31cbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29uZmlndXJhdGlvbiBmb3IgbGlzdCBpdGVtIHJlbmRlcmluZ1xuICAgKiBAc3VtbWFyeSBEZWZpbmVzIGhvdyBsaXN0IGl0ZW1zIHNob3VsZCBiZSByZW5kZXJlZCBpbiB0aGUgY29tcG9uZW50LlxuICAgKiBUaGlzIHByb3BlcnR5IGhvbGRzIGEgY29uZmlndXJhdGlvbiBvYmplY3QgdGhhdCBzcGVjaWZpZXMgdGhlIHRhZyBuYW1lXG4gICAqIGFuZCBvdGhlciBwcm9wZXJ0aWVzIG5lZWRlZCB0byByZW5kZXIgbGlzdCBpdGVtcyBjb3JyZWN0bHkuIFRoZSB0YWcgcHJvcGVydHlcbiAgICogaWRlbnRpZmllcyB3aGljaCBjb21wb25lbnQgc2hvdWxkIGJlIHVzZWQgdG8gcmVuZGVyIGVhY2ggaXRlbSBpbiBhIGxpc3QuXG4gICAqIEFkZGl0aW9uYWwgcHJvcGVydGllcyBjYW4gYmUgaW5jbHVkZWQgdG8gY3VzdG9taXplIHRoZSByZW5kZXJpbmcgYmVoYXZpb3IuXG4gICAqXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn1cbiAgICogQGRlZmF1bHQge3RhZzogXCJcIn1cbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGl0ZW06IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyB0YWc6ICcnIH07XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmltYXJ5IGtleSBmaWVsZCBuYW1lIGZvciB0aGUgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB3aGljaCBmaWVsZCBpbiB0aGUgbW9kZWwgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIHByaW1hcnkga2V5LlxuICAgKiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGZvciBpZGVudGlmeWluZyB1bmlxdWUgcmVjb3JkcyBpbiBvcGVyYXRpb25zIGxpa2UgdXBkYXRlIGFuZCBkZWxldGUuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0ICdpZCdcbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHBrITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQmFzZSByb3V0ZSBmb3IgbmF2aWdhdGlvbiByZWxhdGVkIHRvIHRoaXMgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBiYXNlIHJvdXRlIHBhdGggdXNlZCBmb3IgbmF2aWdhdGlvbiBhY3Rpb25zIHJlbGF0ZWQgdG8gdGhpcyBjb21wb25lbnQuXG4gICAqIFRoaXMgaXMgb2Z0ZW4gdXNlZCBhcyBhIHByZWZpeCBmb3IgY29uc3RydWN0aW5nIG5hdmlnYXRpb24gVVJMcy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHJvdXRlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXZhaWxhYmxlIENSVUQgb3BlcmF0aW9ucyBmb3IgdGhpcyBjb21wb25lbnQuXG4gICAqIEBzdW1tYXJ5IERlZmluZXMgd2hpY2ggQ1JVRCBvcGVyYXRpb25zIChDcmVhdGUsIFJlYWQsIFVwZGF0ZSwgRGVsZXRlKSBhcmUgYXZhaWxhYmxlXG4gICAqIGZvciB0aGlzIGNvbXBvbmVudC4gVGhpcyBhZmZlY3RzIHdoaWNoIG9wZXJhdGlvbnMgY2FuIGJlIHBlcmZvcm1lZCBvbiB0aGUgZGF0YS5cbiAgICpcbiAgICogQGRlZmF1bHQgW09wZXJhdGlvbktleXMuUkVBRF1cbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG9wZXJhdGlvbnM6IENydWRPcGVyYXRpb25zW10gPSBbT3BlcmF0aW9uS2V5cy5SRUFEXTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY3VycmVudCByZWNvcmQuXG4gICAqIEBzdW1tYXJ5IEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IHJlY29yZCBiZWluZyBkaXNwbGF5ZWQgb3IgbWFuaXB1bGF0ZWQuXG4gICAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgcHJpbWFyeSBrZXkgZm9yIG9wZXJhdGlvbnMgb24gc3BlY2lmaWMgcmVjb3Jkcy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IG51bWJlcn1cbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHVpZCE6IHN0cmluZyB8IG51bWJlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZpZWxkIG1hcHBpbmcgY29uZmlndXJhdGlvbi5cbiAgICogQHN1bW1hcnkgRGVmaW5lcyBob3cgZmllbGRzIGZyb20gdGhlIGRhdGEgbW9kZWwgc2hvdWxkIGJlIG1hcHBlZCB0byBwcm9wZXJ0aWVzIHVzZWQgYnkgdGhlIGNvbXBvbmVudC5cbiAgICogVGhpcyBhbGxvd3MgZm9yIGZsZXhpYmxlIGRhdGEgYmluZGluZyBiZXR3ZWVuIHRoZSBtb2RlbCBhbmQgdGhlIGNvbXBvbmVudCdzIGRpc3BsYXkgbG9naWMuXG4gICAqXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbWFwcGVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbG9jYWxlIHRvIGJlIHVzZWQgZm9yIHRyYW5zbGF0aW9ucy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSBsb2NhbGUgaWRlbnRpZmllciB0byB1c2Ugd2hlbiB0cmFuc2xhdGluZyBjb21wb25lbnQgdGV4dC5cbiAgICogVGhpcyBjYW4gYmUgc2V0IGV4cGxpY2l0bHkgdmlhIGlucHV0IHByb3BlcnR5IHRvIG92ZXJyaWRlIHRoZSBhdXRvbWF0aWNhbGx5IGRlcml2ZWRcbiAgICogbG9jYWxlIGZyb20gdGhlIGNvbXBvbmVudCBuYW1lLiBUaGUgbG9jYWxlIGlzIHR5cGljYWxseSBhIGxhbmd1YWdlIGNvZGUgKGUuZy4sICdlbicsICdmcicpXG4gICAqIG9yIGEgbGFuZ3VhZ2UtcmVnaW9uIGNvZGUgKGUuZy4sICdlbi1VUycsICdmci1DQScpIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCB0cmFuc2xhdGlvblxuICAgKiBzZXQgdG8gdXNlIGZvciB0aGUgY29tcG9uZW50J3MgdGV4dCBjb250ZW50LlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbG9jYWxlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyBpZiB0aGUgY29tcG9uZW50IHNob3VsZCBiZSB0cmFuc2xhdGVkLlxuICAgKiBAc3VtbWFyeSBDb250cm9scyB3aGV0aGVyIHRoZSBjb21wb25lbnQncyB0ZXh0IGNvbnRlbnQgc2hvdWxkIGJlIHByb2Nlc3NlZCBmb3IgdHJhbnNsYXRpb24uXG4gICAqIFdoZW4gdHJ1ZSwgdGhlIGNvbXBvbmVudCB3aWxsIGF0dGVtcHQgdG8gdHJhbnNsYXRlIHRleHQgdXNpbmcgdGhlIHNwZWNpZmllZCBsb2NhbGUuXG4gICAqIFdoZW4gZmFsc2UsIHRleHQgaXMgZGlzcGxheWVkIGFzLWlzIHdpdGhvdXQgdHJhbnNsYXRpb24uIFRoaXMgcHJvcGVydHkgYWNjZXB0cyBlaXRoZXJcbiAgICogYSBib29sZWFuIHZhbHVlIG9yIGEgc3RyaW5nIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCB0byBhIGJvb2xlYW4gKGUuZy4sICd0cnVlJywgJ2ZhbHNlJywgJzEnLCAnMCcpLlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nT3JCb29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgdHJhbnNsYXRhYmxlOiBTdHJpbmdPckJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWRkaXRpb25hbCBDU1MgY2xhc3MgbmFtZXMgdG8gYXBwbHkgdG8gdGhlIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgQWxsb3dzIGN1c3RvbSBDU1MgY2xhc3NlcyB0byBiZSBhZGRlZCB0byB0aGUgY29tcG9uZW50J3Mgcm9vdCBlbGVtZW50LlxuICAgKiBUaGVzZSBjbGFzc2VzIGFyZSBhcHBlbmRlZCB0byBhbnkgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgY2xhc3NlcyBiYXNlZCBvbiBvdGhlclxuICAgKiBjb21wb25lbnQgcHJvcGVydGllcy4gTXVsdGlwbGUgY2xhc3NlcyBjYW4gYmUgcHJvdmlkZWQgYXMgYSBzcGFjZS1zZXBhcmF0ZWQgc3RyaW5nLlxuICAgKiBUaGlzIHByb3ZpZGVzIGEgd2F5IHRvIGN1c3RvbWl6ZSB0aGUgY29tcG9uZW50J3MgYXBwZWFyYW5jZSBiZXlvbmQgdGhlIGJ1aWx0LWluIHN0eWxpbmcgb3B0aW9ucy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgXCJcIlxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgY2xhc3NOYW1lOiBzdHJpbmcgPSAnJztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbXBvbmVudCBwbGF0Zm9ybSBzdHlsZS5cbiAgICogQHN1bW1hcnkgQ29udHJvbHMgdGhlIHZpc3VhbCBhcHBlYXJhbmNlIG9mIHRoZSBjb21wb25lbnQgYmFzZWQgb24gcGxhdGZvcm0gZGVzaWduIGd1aWRlbGluZXMuXG4gICAqIFRoZSAnaW9zJyBtb2RlIGZvbGxvd3MgaU9TIGRlc2lnbiBwYXR0ZXJucywgd2hpbGUgJ21kJyAoTWF0ZXJpYWwgRGVzaWduKSBmb2xsb3dzIEFuZHJvaWQvR29vZ2xlXG4gICAqIGRlc2lnbiBwYXR0ZXJucy4gVGhpcyBwcm9wZXJ0eSBhZmZlY3RzIHZhcmlvdXMgdmlzdWFsIGFzcGVjdHMgc3VjaCBhcyBhbmltYXRpb25zLCBmb3JtIGVsZW1lbnRzLFxuICAgKiBhbmQgaWNvbnMuIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSBhbGxvd3MgY29tcG9uZW50cyB0byBtYWludGFpbiBwbGF0Zm9ybS1zcGVjaWZpYyBzdHlsaW5nXG4gICAqIGZvciBhIG1vcmUgbmF0aXZlIGxvb2sgYW5kIGZlZWwuXG4gICAqXG4gICAqIEB0eXBlIHsoXCJpb3NcIiB8IFwibWRcIiB8IHVuZGVmaW5lZCl9XG4gICAqIEBkZWZhdWx0IFwibWRcIlxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbW9kZTogJ2lvcycgfCAnbWQnIHwgdW5kZWZpbmVkID0gJ21kJztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBsb2NhbGUgZGVyaXZlZCBmcm9tIHRoZSBjb21wb25lbnQncyBjbGFzcyBuYW1lLlxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGF1dG9tYXRpY2FsbHkgZGVyaXZlZCBsb2NhbGUgYmFzZWQgb24gdGhlIGNvbXBvbmVudCdzIGNsYXNzIG5hbWUuXG4gICAqIFRoaXMgaXMgZGV0ZXJtaW5lZCBkdXJpbmcgY29tcG9uZW50IGluaXRpYWxpemF0aW9uIGFuZCBzZXJ2ZXMgYXMgYSBmYWxsYmFjayB3aGVuIG5vXG4gICAqIGV4cGxpY2l0IGxvY2FsZSBpcyBwcm92aWRlZCB2aWEgdGhlIGxvY2FsZSBpbnB1dCBwcm9wZXJ0eS4gVGhlIGRlcml2YXRpb24gaXMgaGFuZGxlZFxuICAgKiBieSB0aGUgZ2V0TG9jYWxlQ29udGV4dCB1dGlsaXR5IGZ1bmN0aW9uLCB3aGljaCBleHRyYWN0cyBhIGxvY2FsZSBpZGVudGlmaWVyXG4gICAqIGZyb20gdGhlIGNvbXBvbmVudCdzIGNsYXNzIG5hbWUuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBjb21wb25lbnRMb2NhbGUhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9scyB3aGV0aGVyIGNoaWxkIGNvbXBvbmVudHMgc2hvdWxkIGJlIHJlbmRlcmVkXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgaWYgY2hpbGQgY29tcG9uZW50cyBzaG91bGQgYmUgcmVuZGVyZWQgYnkgdGhlIGNvbXBvbmVudC5cbiAgICogVGhpcyBjYW4gYmUgc2V0IHRvIGEgYm9vbGVhbiB2YWx1ZSBvciBhIHN0cmluZyB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBib29sZWFuLlxuICAgKiBXaGVuIHRydWUsIGNoaWxkIGNvbXBvbmVudHMgZGVmaW5lZCBpbiB0aGUgbW9kZWwgd2lsbCBiZSByZW5kZXJlZC4gV2hlbiBmYWxzZSxcbiAgICogY2hpbGQgY29tcG9uZW50cyB3aWxsIGJlIHNraXBwZWQuIFRoaXMgcHJvdmlkZXMgY29udHJvbCBvdmVyIHRoZSByZW5kZXJpbmcgZGVwdGguXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCBTdHJpbmdPckJvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHJlbmRlckNoaWxkOiBzdHJpbmcgfCBTdHJpbmdPckJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gaW5pdGlhbGl6ZWRcbiAgICogQHN1bW1hcnkgVHJhY2tzIHdoZXRoZXIgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkIGl0cyBpbml0aWFsaXphdGlvbiBwcm9jZXNzLlxuICAgKiBUaGlzIGZsYWcgaXMgdXNlZCB0byBwcmV2ZW50IGR1cGxpY2F0ZSBpbml0aWFsaXphdGlvbiBhbmQgdG8gZGV0ZXJtaW5lIGlmXG4gICAqIGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0IHJlcXVpcmUgaW5pdGlhbGl6YXRpb24gY2FuIGJlIHBlcmZvcm1lZC5cbiAgICpcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBpbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgZW1pdHRlciBmb3IgY3VzdG9tIHJlbmRlcmVyIGV2ZW50cy5cbiAgICogQHN1bW1hcnkgRW1pdHMgY3VzdG9tIGV2ZW50cyB0aGF0IG9jY3VyIHdpdGhpbiBjaGlsZCBjb21wb25lbnRzIG9yIHRoZSBsYXlvdXQgaXRzZWxmLlxuICAgKiBUaGlzIGFsbG93cyBwYXJlbnQgY29tcG9uZW50cyB0byBsaXN0ZW4gZm9yIGFuZCByZXNwb25kIHRvIHVzZXIgaW50ZXJhY3Rpb25zIG9yXG4gICAqIHN0YXRlIGNoYW5nZXMgd2l0aGluIHRoZSBncmlkIGxheW91dC4gRXZlbnRzIGFyZSBwYXNzZWQgdXAgdGhlIGNvbXBvbmVudCBoaWVyYXJjaHlcbiAgICogdG8gZW5hYmxlIGNvb3JkaW5hdGVkIGJlaGF2aW9yIGFjcm9zcyB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEB0eXBlIHtFdmVudEVtaXR0ZXI8UmVuZGVyZXJDdXN0b21FdmVudD59XG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBAT3V0cHV0KClcbiAgbGlzdGVuRXZlbnQ6IEV2ZW50RW1pdHRlcjxSZW5kZXJlckN1c3RvbUV2ZW50PiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxSZW5kZXJlckN1c3RvbUV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVmZXJlbmNlIHRvIHRoZSByZW5kZXJpbmcgZW5naW5lIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgTmd4UmVuZGVyaW5nRW5naW5lIHNpbmdsZXRvbiBpbnN0YW5jZSxcbiAgICogd2hpY2ggaGFuZGxlcyB0aGUgcmVuZGVyaW5nIG9mIGNvbXBvbmVudHMgYmFzZWQgb24gbW9kZWwgZGVmaW5pdGlvbnMuXG4gICAqIFRoaXMgZW5naW5lIGlzIHVzZWQgdG8gZXh0cmFjdCBkZWNvcmF0b3IgbWV0YWRhdGEgYW5kIHJlbmRlciBjaGlsZCBjb21wb25lbnRzLlxuICAgKlxuICAgKiBAdHlwZSB7Tmd4UmVuZGVyaW5nRW5naW5lfVxuICAgKi9cbiAgcmVuZGVyaW5nRW5naW5lOiBOZ3hSZW5kZXJpbmdFbmdpbmUgPVxuICAgIE5neFJlbmRlcmluZ0VuZ2luZS5nZXQoKSBhcyB1bmtub3duIGFzIE5neFJlbmRlcmluZ0VuZ2luZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ2dlciBpbnN0YW5jZSBmb3IgdGhlIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgbG9nZ2luZyBjYXBhYmlsaXRpZXMgZm9yIHRoZSBjb21wb25lbnQsIGFsbG93aW5nIGZvciBjb25zaXN0ZW50XG4gICAqIGFuZCBzdHJ1Y3R1cmVkIGxvZ2dpbmcgb2YgaW5mb3JtYXRpb24sIHdhcm5pbmdzLCBhbmQgZXJyb3JzLiBUaGlzIGxvZ2dlciBpcyBpbml0aWFsaXplZFxuICAgKiBpbiB0aGUgbmdPbkluaXQgbWV0aG9kIHVzaW5nIHRoZSBnZXRMb2dnZXIgZnVuY3Rpb24gZnJvbSB0aGUgRm9yQW5ndWxhckNvbW1vbk1vZHVsZS5cbiAgICpcbiAgICogVGhlIGxvZ2dlciBpcyB1c2VkIHRocm91Z2hvdXQgdGhlIGNvbXBvbmVudCB0byByZWNvcmQgaW1wb3J0YW50IGV2ZW50cywgZGVidWcgaW5mb3JtYXRpb24sXG4gICAqIGFuZCBwb3RlbnRpYWwgaXNzdWVzLiBJdCBoZWxwcyBpbiBtb25pdG9yaW5nIHRoZSBjb21wb25lbnQncyBiZWhhdmlvciwgdHJhY2tpbmcgdGhlIGZsb3dcbiAgICogb2Ygb3BlcmF0aW9ucywgYW5kIGZhY2lsaXRhdGluZyBlYXNpZXIgZGVidWdnaW5nIGFuZCBtYWludGVuYW5jZS5cbiAgICpcbiAgICogQHR5cGUge0xvZ2dlcn1cbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIGxvZ2dlciE6IExvZ2dlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgTmd4QmFzZUNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGJhc2UgY29tcG9uZW50IHdpdGggdGhlIHByb3ZpZGVkIGluc3RhbmNlIHRva2VuLlxuICAgKiBUaGlzIGNvbnN0cnVjdG9yIHNldHMgdXAgdGhlIGZ1bmRhbWVudGFsIHByb3BlcnRpZXMgcmVxdWlyZWQgYnkgYWxsIERlY2FmIGNvbXBvbmVudHMsXG4gICAqIGluY2x1ZGluZyB0aGUgY29tcG9uZW50IG5hbWUsIGxvY2FsZSBzZXR0aW5ncywgYW5kIGxvZ2dpbmcgY2FwYWJpbGl0aWVzLiBUaGUgaW5zdGFuY2VcbiAgICogdG9rZW4gaXMgdXNlZCBmb3IgY29tcG9uZW50IGlkZW50aWZpY2F0aW9uIGFuZCBsb2NhbGUgZGVyaXZhdGlvbi5cbiAgICpcbiAgICogVGhlIGNvbnN0cnVjdG9yIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgaW5pdGlhbGl6YXRpb24gc3RlcHM6XG4gICAqIDEuIFNldHMgdGhlIGNvbXBvbmVudE5hbWUgZnJvbSB0aGUgcHJvdmlkZWQgaW5zdGFuY2UgdG9rZW5cbiAgICogMi4gRGVyaXZlcyB0aGUgY29tcG9uZW50TG9jYWxlIGZyb20gdGhlIGNsYXNzIG5hbWUgdXNpbmcgdXRpbGl0eSBmdW5jdGlvbnNcbiAgICogMy4gSW5pdGlhbGl6ZXMgdGhlIGxvZ2dlciBpbnN0YW5jZSBmb3IgdGhlIGNvbXBvbmVudFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW5zdGFuY2UgLSBUaGUgY29tcG9uZW50IGluc3RhbmNlIHRva2VuIHVzZWQgZm9yIGlkZW50aWZpY2F0aW9uXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgQW5ndWxhclxuICAgKiAgIHBhcnRpY2lwYW50IEMgYXMgQ29tcG9uZW50XG4gICAqICAgcGFydGljaXBhbnQgQiBhcyBOZ3hCYXNlQ29tcG9uZW50XG4gICAqICAgcGFydGljaXBhbnQgVSBhcyBVdGlsc1xuICAgKiAgIHBhcnRpY2lwYW50IEwgYXMgTG9nZ2VyXG4gICAqXG4gICAqICAgQS0+PkM6IG5ldyBDb21wb25lbnQoaW5zdGFuY2UpXG4gICAqICAgQy0+PkI6IHN1cGVyKGluc3RhbmNlKVxuICAgKiAgIEItPj5COiBTZXQgY29tcG9uZW50TmFtZSA9IGluc3RhbmNlXG4gICAqICAgQi0+PlU6IGdldExvY2FsZUNvbnRleHQoaW5zdGFuY2UpXG4gICAqICAgVS0tPj5COiBSZXR1cm4gZGVyaXZlZCBsb2NhbGVcbiAgICogICBCLT4+QjogU2V0IGNvbXBvbmVudExvY2FsZVxuICAgKiAgIEItPj5MOiBnZXRMb2dnZXIodGhpcylcbiAgICogICBMLS0+PkI6IFJldHVybiBsb2dnZXIgaW5zdGFuY2VcbiAgICogICBCLT4+QjogU2V0IGxvZ2dlclxuICAgKlxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9wcmVmZXItaW5qZWN0XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihASW5qZWN0KCdpbnN0YW5jZVRva2VuJykgcHJvdGVjdGVkIGluc3RhbmNlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvbXBvbmVudE5hbWUgPSBpbnN0YW5jZTtcbiAgICB0aGlzLmNvbXBvbmVudExvY2FsZSA9IGdldExvY2FsZUNvbnRleHQoaW5zdGFuY2UpO1xuICAgIHRoaXMubG9nZ2VyID0gZ2V0TG9nZ2VyKHRoaXMpO1xuICAgIHRoaXMuZ2V0TG9jYWxlKHRoaXMudHJhbnNsYXRhYmxlKTtcbiAgICB0aGlzLnVpZCA9IGdlbmVyYXRlUmFuZG9tVmFsdWUoMTIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXR0ZXIgZm9yIHRoZSByZXBvc2l0b3J5IGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGEgbGF5ZXIgZm9yIHJldHJpZXZpbmcgYW5kIG1hbmlwdWxhdGluZyBkYXRhLlxuICAgKiBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyB0aGUgYF9yZXBvc2l0b3J5YCBwcm9wZXJ0eSBpZiBpdCBpcyBub3QgYWxyZWFkeSBzZXQsIGVuc3VyaW5nXG4gICAqIHRoYXQgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlIHJlcG9zaXRvcnkgaXMgdXNlZCB0aHJvdWdob3V0IHRoZSBjb21wb25lbnQuXG4gICAqXG4gICAqIFRoZSByZXBvc2l0b3J5IGlzIHVzZWQgdG8gcGVyZm9ybSBDUlVEIG9wZXJhdGlvbnMgb24gdGhlIGRhdGEgbW9kZWwsIHN1Y2ggYXMgZmV0Y2hpbmcgZGF0YSxcbiAgICogY3JlYXRpbmcgbmV3IGl0ZW1zLCB1cGRhdGluZyBleGlzdGluZyBpdGVtcywgYW5kIGRlbGV0aW5nIGl0ZW1zLiBJdCBhbHNvIHByb3ZpZGVzIG1ldGhvZHNcbiAgICogZm9yIHF1ZXJ5aW5nIGFuZCBmaWx0ZXJpbmcgZGF0YSBiYXNlZCBvbiBzcGVjaWZpYyBjcml0ZXJpYS5cbiAgICpcbiAgICogQHJldHVybnMge0RlY2FmUmVwb3NpdG9yeTxNb2RlbD59IFRoZSBpbml0aWFsaXplZCByZXBvc2l0b3J5IGluc3RhbmNlLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCByZXBvc2l0b3J5KCk6IERlY2FmUmVwb3NpdG9yeTxNb2RlbD4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMuX3JlcG9zaXRvcnkpIHtcbiAgICAgICAgY29uc3QgbW9kZWxOYW1lID0gKHRoaXMubW9kZWwgYXMgTW9kZWwpLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gTW9kZWwuZ2V0KG1vZGVsTmFtZSk7XG4gICAgICAgIGlmICghY29uc3RydWN0b3IpXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAnQ2Fubm90IGZpbmQgbW9kZWwuIHdhcyBpdCByZWdpc3RlcmVkIHdpdGggQG1vZGVsPydcbiAgICAgICAgICApO1xuICAgICAgICBsZXQgZGJBZGFwdGVyRmxhdm91ciA9IGdldE9uV2luZG93KCdkYkFkYXB0ZXJGbGF2b3VyJyk7XG4gICAgICAgIGlmICghZGJBZGFwdGVyRmxhdm91ciAmJiBpc0RldmVsb3BtZW50TW9kZSgpKSB7XG4gICAgICAgICAgY29uc3QgYWRhcHRlciA9IG5ldyBSYW1BZGFwdGVyKHsgdXNlcjogJ3VzZXInIH0pO1xuICAgICAgICAgIGRiQWRhcHRlckZsYXZvdXIgPSBhZGFwdGVyLmZsYXZvdXI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmVwb3NpdG9yeSA9IFJlcG9zaXRvcnkuZm9yTW9kZWwoXG4gICAgICAgICAgY29uc3RydWN0b3IsXG4gICAgICAgICAgZGJBZGFwdGVyRmxhdm91ciBhcyBzdHJpbmdcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5tb2RlbCA9IG5ldyBjb25zdHJ1Y3RvcigpIGFzIE1vZGVsO1xuICAgICAgICBpZiAodGhpcy5tb2RlbCAmJiAhdGhpcy5waylcbiAgICAgICAgICB0aGlzLnBrID1cbiAgICAgICAgICAgICh0aGlzLl9yZXBvc2l0b3J5IGFzIHVua25vd24gYXMgRGVjYWZSZXBvc2l0b3J5PE1vZGVsPikucGsgfHwgJ2lkJztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKGVycm9yIGFzIEVycm9yKT8ubWVzc2FnZSB8fCAoZXJyb3IgYXMgc3RyaW5nKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZXBvc2l0b3J5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGNoYW5nZXMgdG8gY29tcG9uZW50IGlucHV0c1xuICAgKiBAc3VtbWFyeSBUaGlzIEFuZ3VsYXIgbGlmZWN5Y2xlIGhvb2sgaXMgY2FsbGVkIHdoZW4gaW5wdXQgcHJvcGVydGllcyBjaGFuZ2UuXG4gICAqIEl0IHJlc3BvbmRzIHRvIGNoYW5nZXMgaW4gdGhlIG1vZGVsLCBsb2NhbGUsIG9yIHRyYW5zbGF0YWJsZSBwcm9wZXJ0aWVzIGJ5XG4gICAqIHVwZGF0aW5nIHRoZSBjb21wb25lbnQncyBpbnRlcm5hbCBzdGF0ZSBhY2NvcmRpbmdseS4gV2hlbiB0aGUgbW9kZWwgY2hhbmdlcyxcbiAgICogaXQgY2FsbHMgZ2V0TW9kZWwgdG8gcHJvY2VzcyB0aGUgbmV3IG1vZGVsIGFuZCBnZXRMb2NhbGUgdG8gdXBkYXRlIHRoZSBsb2NhbGUuXG4gICAqIFdoZW4gbG9jYWxlIG9yIHRyYW5zbGF0YWJsZSBwcm9wZXJ0aWVzIGNoYW5nZSwgaXQgY2FsbHMgZ2V0TG9jYWxlIHRvIHVwZGF0ZVxuICAgKiB0aGUgdHJhbnNsYXRpb24gc2V0dGluZ3MuXG4gICAqXG4gICAqIEBwYXJhbSB7U2ltcGxlQ2hhbmdlc30gY2hhbmdlcyAtIE9iamVjdCBjb250YWluaW5nIGNoYW5nZWQgcHJvcGVydGllc1xuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzW0Jhc2VDb21wb25lbnRQcm9wcy5NT0RFTF0pIHtcbiAgICAgIGNvbnN0IHsgY3VycmVudFZhbHVlIH0gPSBjaGFuZ2VzW0Jhc2VDb21wb25lbnRQcm9wcy5NT0RFTF07XG4gICAgICBpZiAoY3VycmVudFZhbHVlKSB0aGlzLmdldE1vZGVsKGN1cnJlbnRWYWx1ZSk7XG4gICAgICB0aGlzLmdldExvY2FsZSh0aGlzLnRyYW5zbGF0YWJsZSk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNoYW5nZXNbQmFzZUNvbXBvbmVudFByb3BzLklOSVRJQUxJWkVEXSB8fFxuICAgICAgY2hhbmdlc1tCYXNlQ29tcG9uZW50UHJvcHMuTE9DQUxFXSB8fFxuICAgICAgY2hhbmdlc1tCYXNlQ29tcG9uZW50UHJvcHMuVFJBTlNMQVRBQkxFXVxuICAgIClcbiAgICAgIHRoaXMuZ2V0TG9jYWxlKHRoaXMudHJhbnNsYXRhYmxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgYXBwcm9wcmlhdGUgbG9jYWxlIHN0cmluZyBiYXNlZCBvbiB0aGUgdHJhbnNsYXRhYmxlIGZsYWcgYW5kIGF2YWlsYWJsZSBsb2NhbGVzLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHdoaWNoIGxvY2FsZSBzdHJpbmcgdG8gdXNlIGZvciB0cmFuc2xhdGlvbiBiYXNlZCBvbiB0aGUgdHJhbnNsYXRhYmxlIGZsYWdcbiAgICogYW5kIGF2YWlsYWJsZSBsb2NhbGUgc2V0dGluZ3MuIFRoaXMgbWV0aG9kIGZpcnN0IGNvbnZlcnRzIHRoZSB0cmFuc2xhdGFibGUgcGFyYW1ldGVyIHRvIGEgYm9vbGVhblxuICAgKiB1c2luZyB0aGUgc3RyaW5nVG9Cb29sZWFuIHV0aWxpdHkgZnVuY3Rpb24uIElmIHRyYW5zbGF0YWJsZSBpcyBmYWxzZSwgaXQgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcsXG4gICAqIGluZGljYXRpbmcgbm8gdHJhbnNsYXRpb24gc2hvdWxkIGJlIHBlcmZvcm1lZC4gSWYgdHJhbnNsYXRhYmxlIGlzIHRydWUsIGl0IGNoZWNrcyBmb3IgYW4gZXhwbGljaXRseVxuICAgKiBwcm92aWRlZCBsb2NhbGUgdmlhIHRoZSBsb2NhbGUgcHJvcGVydHkuIElmIG5vIGV4cGxpY2l0IGxvY2FsZSBpcyBhdmFpbGFibGUsIGl0IGZhbGxzIGJhY2sgdG8gdGhlXG4gICAqIGNvbXBvbmVudExvY2FsZSBkZXJpdmVkIGZyb20gdGhlIGNvbXBvbmVudCdzIGNsYXNzIG5hbWUuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nT3JCb29sZWFufSB0cmFuc2xhdGFibGUgLSBXaGV0aGVyIHRoZSBjb21wb25lbnQgc2hvdWxkIGJlIHRyYW5zbGF0ZWRcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgbG9jYWxlIHN0cmluZyB0byB1c2UgZm9yIHRyYW5zbGF0aW9uLCBvciBlbXB0eSBzdHJpbmcgaWYgbm90IHRyYW5zbGF0YWJsZVxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDIGFzIENvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IE4gYXMgTmd4QmFzZUNvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IFMgYXMgU3RyaW5nVXRpbHNcbiAgICpcbiAgICogICBDLT4+TjogZ2V0TG9jYWxlKHRyYW5zbGF0YWJsZSlcbiAgICogICBOLT4+Uzogc3RyaW5nVG9Cb29sZWFuKHRyYW5zbGF0YWJsZSlcbiAgICogICBTLS0+Pk46IFJldHVybiBib29sZWFuIHZhbHVlXG4gICAqICAgTi0+Pk46IFN0b3JlIGluIHRoaXMudHJhbnNsYXRhYmxlXG4gICAqICAgYWx0IHRyYW5zbGF0YWJsZSBpcyBmYWxzZVxuICAgKiAgICAgTi0tPj5DOiBSZXR1cm4gZW1wdHkgc3RyaW5nXG4gICAqICAgZWxzZSB0cmFuc2xhdGFibGUgaXMgdHJ1ZVxuICAgKiAgICAgYWx0IHRoaXMubG9jYWxlIGlzIGRlZmluZWRcbiAgICogICAgICAgTi0tPj5DOiBSZXR1cm4gdGhpcy5sb2NhbGVcbiAgICogICAgIGVsc2UgdGhpcy5sb2NhbGUgaXMgbm90IGRlZmluZWRcbiAgICogICAgICAgTi0tPj5DOiBSZXR1cm4gdGhpcy5jb21wb25lbnRMb2NhbGVcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKi9cbiAgZ2V0TG9jYWxlKHRyYW5zbGF0YWJsZTogU3RyaW5nT3JCb29sZWFuKTogc3RyaW5nIHtcbiAgICB0aGlzLnRyYW5zbGF0YWJsZSA9IHN0cmluZ1RvQm9vbGVhbih0cmFuc2xhdGFibGUpO1xuICAgIGlmICghdGhpcy50cmFuc2xhdGFibGUpIHJldHVybiAnJztcbiAgICBpZiAoIXRoaXMubG9jYWxlKSB0aGlzLmxvY2FsZSA9IHRoaXMuY29tcG9uZW50TG9jYWxlO1xuICAgIHJldHVybiB0aGlzLmxvY2FsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgcm91dGUgZm9yIHRoZSBjb21wb25lbnRcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSByb3V0ZSBwYXRoIGZvciB0aGUgY29tcG9uZW50LCBnZW5lcmF0aW5nIG9uZSBiYXNlZCBvbiB0aGUgbW9kZWxcbiAgICogaWYgbm8gcm91dGUgaXMgZXhwbGljaXRseSBzZXQuIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiBhIHJvdXRlIGlzIGFscmVhZHkgZGVmaW5lZCwgYW5kIGlmIG5vdCxcbiAgICogaXQgY3JlYXRlcyBhIGRlZmF1bHQgcm91dGUgYmFzZWQgb24gdGhlIG1vZGVsJ3MgY29uc3RydWN0b3IgbmFtZS4gVGhlIGdlbmVyYXRlZCByb3V0ZSBmb2xsb3dzXG4gICAqIHRoZSBwYXR0ZXJuICcvbW9kZWwve01vZGVsTmFtZX0nLiBUaGlzIGlzIHVzZWZ1bCBmb3IgYXV0b21hdGljIHJvdXRpbmcgaW4gQ1JVRCBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSByb3V0ZSBwYXRoIGZvciB0aGUgY29tcG9uZW50LCBvciBlbXB0eSBzdHJpbmcgaWYgbm8gcm91dGUgaXMgYXZhaWxhYmxlXG4gICAqL1xuICBnZXRSb3V0ZSgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5yb3V0ZSAmJiB0aGlzLm1vZGVsIGluc3RhbmNlb2YgTW9kZWwpXG4gICAgICB0aGlzLnJvdXRlID0gYC9tb2RlbC8ke3RoaXMubW9kZWw/LmNvbnN0cnVjdG9yLm5hbWV9YDtcbiAgICByZXR1cm4gdGhpcy5yb3V0ZSB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVzb2x2ZXMgYW5kIHNldHMgdGhlIGNvbXBvbmVudCdzIG1vZGVsXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyB0aGUgcHJvdmlkZWQgbW9kZWwgcGFyYW1ldGVyLCB3aGljaCBjYW4gYmUgZWl0aGVyIGEgTW9kZWwgaW5zdGFuY2VcbiAgICogb3IgYSBzdHJpbmcgaWRlbnRpZmllci4gSWYgYSBzdHJpbmcgaXMgcHJvdmlkZWQsIGl0IGF0dGVtcHRzIHRvIHJlc29sdmUgdGhlIGFjdHVhbCBtb2RlbFxuICAgKiBmcm9tIHRoZSBpbmplY3RhYmxlcyByZWdpc3RyeS4gQWZ0ZXIgcmVzb2x2aW5nIHRoZSBtb2RlbCwgaXQgY2FsbHMgc2V0TW9kZWxEZWZpbml0aW9uc1xuICAgKiB0byBjb25maWd1cmUgdGhlIGNvbXBvbmVudCBiYXNlZCBvbiB0aGUgbW9kZWwncyBtZXRhZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBNb2RlbH0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2Ugb3IgaWRlbnRpZmllciBzdHJpbmdcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIGdldE1vZGVsKG1vZGVsOiBzdHJpbmcgfCBNb2RlbCk6IHZvaWQge1xuICAgIGlmICghKG1vZGVsIGluc3RhbmNlb2YgTW9kZWwpKVxuICAgICAgdGhpcy5tb2RlbCA9IGdldEluamVjdGFibGVzUmVnaXN0cnkoKS5nZXQobW9kZWwpIGFzIE1vZGVsO1xuICAgIHRoaXMuc2V0TW9kZWxEZWZpbml0aW9ucyh0aGlzLm1vZGVsIGFzIE1vZGVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29uZmlndXJlcyBjb21wb25lbnQgcHJvcGVydGllcyBiYXNlZCBvbiBtb2RlbCBtZXRhZGF0YVxuICAgKiBAc3VtbWFyeSBFeHRyYWN0cyBhbmQgYXBwbGllcyBjb25maWd1cmF0aW9uIGZyb20gdGhlIG1vZGVsJ3MgZGVjb3JhdG9ycyB0byBzZXQgdXBcbiAgICogdGhlIGNvbXBvbmVudC4gVGhpcyBtZXRob2QgdXNlcyB0aGUgcmVuZGVyaW5nIGVuZ2luZSB0byByZXRyaWV2ZSBkZWNvcmF0b3IgbWV0YWRhdGFcbiAgICogZnJvbSB0aGUgbW9kZWwsIHRoZW4gY29uZmlndXJlcyB0aGUgY29tcG9uZW50J3MgbWFwcGVyIGFuZCBpdGVtIHByb3BlcnRpZXMgYWNjb3JkaW5nbHkuXG4gICAqIEl0IGVuc3VyZXMgdGhlIHJvdXRlIGlzIHByb3Blcmx5IHNldCBhbmQgbWVyZ2VzIHZhcmlvdXMgcHJvcGVydGllcyBmcm9tIHRoZSBtb2RlbCdzXG4gICAqIG1ldGFkYXRhIGludG8gdGhlIGNvbXBvbmVudCdzIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7TW9kZWx9IG1vZGVsIC0gVGhlIG1vZGVsIHRvIGV4dHJhY3QgY29uZmlndXJhdGlvbiBmcm9tXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzZXRNb2RlbERlZmluaXRpb25zKG1vZGVsOiBNb2RlbCk6IHZvaWQge1xuICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIE1vZGVsKSB7XG4gICAgICB0aGlzLmdldFJvdXRlKCk7XG4gICAgICB0aGlzLm1vZGVsID0gbW9kZWw7XG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMucmVuZGVyaW5nRW5naW5lLmdldERlY29yYXRvcnModGhpcy5tb2RlbCBhcyBNb2RlbCwge30pO1xuICAgICAgY29uc3QgeyBwcm9wcywgaXRlbSwgY2hpbGRyZW4gfSA9IGZpZWxkO1xuICAgICAgdGhpcy5wcm9wcyA9IE9iamVjdC5hc3NpZ24ocHJvcHMgfHwge30sIHsgY2hpbGRyZW46IGNoaWxkcmVuIHx8IFtdIH0pO1xuICAgICAgaWYgKGl0ZW0/LnByb3BzPy5bJ21hcHBlciddKSB0aGlzLm1hcHBlciA9IGl0ZW0/LnByb3BzIVsnbWFwcGVyJ10gfHwge307XG4gICAgICB0aGlzLml0ZW0gPSB7XG4gICAgICAgIHRhZzogaXRlbT8udGFnIHx8ICcnLFxuICAgICAgICAuLi5pdGVtPy5wcm9wcyxcbiAgICAgICAgLi4uKHRoaXMubWFwcGVyID8geyBtYXBwZXI6IHRoaXMubWFwcGVyIH0gOiB7fSksXG4gICAgICAgIC4uLnsgcm91dGU6IGl0ZW0/LnByb3BzPy5bJ3JvdXRlJ10gfHwgdGhpcy5yb3V0ZSB9LFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBjb21wb25lbnRcbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgb25lLXRpbWUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGNvbXBvbmVudC4gVGhpcyBtZXRob2QgY2hlY2tzIGlmXG4gICAqIHRoZSBjb21wb25lbnQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB0byBwcmV2ZW50IGR1cGxpY2F0ZSBpbml0aWFsaXphdGlvbi5cbiAgICogV2hlbiBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lLCBpdCBzZXRzIHRoZSBpbml0aWFsaXplZCBmbGFnIHRvIHRydWUgYW5kIGxvZ3NcbiAgICogYW4gaW5pdGlhbGl6YXRpb24gbWVzc2FnZSB3aXRoIHRoZSBjb21wb25lbnQgbmFtZS4gVGhpcyBtZXRob2QgaXMgdHlwaWNhbGx5IGNhbGxlZFxuICAgKiBkdXJpbmcgdGhlIGNvbXBvbmVudCdzIGxpZmVjeWNsZSBzZXR1cC5cbiAgICovXG4gIGluaXRpYWxpemUoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgY3VzdG9tIGV2ZW50cyBmcm9tIGNoaWxkIGNvbXBvbmVudHMuXG4gICAqIEBzdW1tYXJ5IFJlY2VpdmVzIGV2ZW50cyBmcm9tIGNoaWxkIHJlbmRlcmVyIGNvbXBvbmVudHMgYW5kIGZvcndhcmRzIHRoZW0gdG8gcGFyZW50XG4gICAqIGNvbXBvbmVudHMgdGhyb3VnaCB0aGUgbGlzdGVuRXZlbnQgb3V0cHV0LiBUaGlzIGNyZWF0ZXMgYW4gZXZlbnQgcHJvcGFnYXRpb24gY2hhaW5cbiAgICogdGhhdCBhbGxvd3MgZXZlbnRzIHRvIGJ1YmJsZSB1cCB0aHJvdWdoIHRoZSBjb21wb25lbnQgaGllcmFyY2h5LCBlbmFibGluZyBjb29yZGluYXRlZFxuICAgKiByZXNwb25zZXMgdG8gdXNlciBpbnRlcmFjdGlvbnMgYWNyb3NzIHRoZSBsYXlvdXQgc3RydWN0dXJlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlbmRlcmVyQ3VzdG9tRXZlbnR9IGV2ZW50IC0gVGhlIGN1c3RvbSBldmVudCBmcm9tIGEgY2hpbGQgY29tcG9uZW50XG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2hpbGQgQ29tcG9uZW50XG4gICAqICAgcGFydGljaXBhbnQgTCBhcyBOZ3hCYXNlQ29tcG9uZW50XG4gICAqICAgcGFydGljaXBhbnQgUCBhcyBQYXJlbnQgQ29tcG9uZW50XG4gICAqXG4gICAqICAgQy0+Pkw6IEVtaXQgUmVuZGVyZXJDdXN0b21FdmVudFxuICAgKiAgIEwtPj5MOiBoYW5kbGVFdmVudChldmVudClcbiAgICogICBMLT4+UDogbGlzdGVuRXZlbnQuZW1pdChldmVudClcbiAgICogICBOb3RlIG92ZXIgUDogSGFuZGxlIGV2ZW50IGluIHBhcmVudFxuICAgKlxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlRXZlbnQoZXZlbnQ6IFJlbmRlcmVyQ3VzdG9tRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RlbkV2ZW50LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUcmFja3MgaXRlbXMgaW4gbmdGb3IgbG9vcHMgZm9yIG9wdGltYWwgY2hhbmdlIGRldGVjdGlvbi5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYSB0cmFja2luZyBmdW5jdGlvbiBmb3IgQW5ndWxhcidzICpuZ0ZvciBkaXJlY3RpdmUgdG8gb3B0aW1pemUgcmVuZGVyaW5nXG4gICAqIHBlcmZvcm1hbmNlLiBUaGlzIG1ldGhvZCBnZW5lcmF0ZXMgdW5pcXVlIGlkZW50aWZpZXJzIGZvciBsaXN0IGl0ZW1zIGJhc2VkIG9uIHRoZWlyIGluZGV4XG4gICAqIGFuZCBjb250ZW50LCBhbGxvd2luZyBBbmd1bGFyIHRvIGVmZmljaWVudGx5IHRyYWNrIGNoYW5nZXMgYW5kIG1pbmltaXplIERPTSBtYW5pcHVsYXRpb25zXG4gICAqIGR1cmluZyBsaXN0IHVwZGF0ZXMuIFRoZSB0cmFja2luZyBmdW5jdGlvbiBpcyBlc3NlbnRpYWwgZm9yIG1haW50YWluaW5nIGNvbXBvbmVudCBzdGF0ZVxuICAgKiBhbmQgcHJldmVudGluZyB1bm5lY2Vzc2FyeSByZS1yZW5kZXJpbmcgb2YgdW5jaGFuZ2VkIGl0ZW1zLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gaW4gdGhlIGxpc3RcbiAgICogQHBhcmFtIHtLZXlWYWx1ZSB8IHN0cmluZyB8IG51bWJlcn0gaXRlbSAtIFRoZSBpdGVtIGRhdGEgdG8gdHJhY2tcbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bWJlcn0gQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGl0ZW1cbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIHRyYWNrSXRlbUZuKFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgaXRlbTogS2V5VmFsdWUgfCBzdHJpbmcgfCBudW1iZXJcbiAgKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICByZXR1cm4gYCR7aW5kZXh9LSR7aXRlbX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYW5kIGFwcGxpZXMgcHJvcGVydGllcyBmcm9tIHRoZSBwcm9wcyBvYmplY3QgdG8gdGhlIGNvbXBvbmVudCBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgaXRlcmF0ZXMgdGhyb3VnaCB0aGUgcHJvcGVydGllcyBvZiB0aGUgcHJvdmlkZWQgaW5zdGFuY2Ugb2JqZWN0XG4gICAqIGFuZCBhcHBsaWVzIGFueSBtYXRjaGluZyBwcm9wZXJ0aWVzIGZyb20gdGhlIGNvbXBvbmVudCdzIHByb3BzIGNvbmZpZ3VyYXRpb24gdG8gdGhlXG4gICAqIGNvbXBvbmVudCBpbnN0YW5jZS4gVGhpcyBhbGxvd3MgZm9yIGR5bmFtaWMgcHJvcGVydHkgYXNzaWdubWVudCBiYXNlZCBvbiBjb25maWd1cmF0aW9uXG4gICAqIHN0b3JlZCBpbiB0aGUgcHJvcHMgb2JqZWN0LCBlbmFibGluZyBmbGV4aWJsZSBjb21wb25lbnQgY3VzdG9taXphdGlvbiB3aXRob3V0IHJlcXVpcmluZ1xuICAgKiBleHBsaWNpdCBwcm9wZXJ0eSBiaW5kaW5nIGZvciBldmVyeSBwb3NzaWJsZSBjb25maWd1cmF0aW9uIG9wdGlvbi5cbiAgICpcbiAgICogVGhlIG1ldGhvZCBwZXJmb3JtcyBhIHNhZmUgcHJvcGVydHkgYXNzaWdubWVudCBieSBjaGVja2luZyBpZiBlYWNoIGtleSBmcm9tIHRoZSBpbnN0YW5jZVxuICAgKiBleGlzdHMgaW4gdGhlIHByb3BzIG9iamVjdCBiZWZvcmUgYXBwbHlpbmcgaXQuIFRoaXMgcHJldmVudHMgYWNjaWRlbnRhbCBwcm9wZXJ0eVxuICAgKiBvdmVyd3JpdGluZyBhbmQgZW5zdXJlcyBvbmx5IGludGVuZGVkIHByb3BlcnRpZXMgYXJlIG1vZGlmaWVkLlxuICAgKlxuICAgKiBAcGFyYW0ge0tleVZhbHVlfSBpbnN0YW5jZSAtIFRoZSBjb21wb25lbnQgaW5zdGFuY2Ugb2JqZWN0IHRvIHByb2Nlc3NcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQyBhcyBDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBCIGFzIE5neEJhc2VDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBQIGFzIFByb3BzIE9iamVjdFxuICAgKlxuICAgKiAgIEMtPj5COiBwYXJzZVByb3BzKGluc3RhbmNlKVxuICAgKiAgIEItPj5COiBHZXQgT2JqZWN0LmtleXMoaW5zdGFuY2UpXG4gICAqICAgbG9vcCBGb3IgZWFjaCBrZXkgaW4gaW5zdGFuY2VcbiAgICogICAgIEItPj5QOiBDaGVjayBpZiBrZXkgZXhpc3RzIGluIHRoaXMucHJvcHNcbiAgICogICAgIGFsdCBLZXkgZXhpc3RzIGluIHByb3BzXG4gICAqICAgICAgIEItPj5COiBTZXQgdGhpc1trZXldID0gdGhpcy5wcm9wc1trZXldXG4gICAqICAgICBlbHNlIEtleSBub3QgaW4gcHJvcHNcbiAgICogICAgICAgTm90ZSBvdmVyIEI6IFNraXAgdGhpcyBrZXlcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBwcm90ZWN0ZWQgcGFyc2VQcm9wcyhpbnN0YW5jZTogS2V5VmFsdWUpOiB2b2lkIHtcbiAgICBPYmplY3Qua2V5cyhpbnN0YW5jZSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5wcm9wcykuaW5jbHVkZXMoa2V5KSlcbiAgICAgICAgKHRoaXMgYXMgS2V5VmFsdWUpW2tleV0gPSB0aGlzLnByb3BzW2tleV07XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -215,7 +215,10 @@ export class NgxFormService {
215
215
  const controlValue = cleanSpaces(`${formGroup.get(pk)?.value}`, true);
216
216
  if (operation === OperationKeys.CREATE)
217
217
  return !formGroupArray.controls.some((group, i) => i !== index && cleanSpaces(`${group.get(pk)?.value}`, true) === controlValue);
218
- return !formGroupArray.controls.some((group, i) => i !== index && controlValue === cleanSpaces(`${group.get(pk)?.value}`, true));
218
+ return !formGroupArray.controls.some((group, i) => {
219
+ const value = cleanSpaces(`${group.get(pk)?.value}`, true);
220
+ return i !== index && controlValue === value;
221
+ });
219
222
  }
220
223
  /**
221
224
  * @description Enables all controls within a FormGroup or FormArray.
@@ -416,7 +419,13 @@ export class NgxFormService {
416
419
  });
417
420
  }
418
421
  }
419
- return control.valid;
422
+ function getControlName(control) {
423
+ const group = control.parent;
424
+ if (!group)
425
+ return null;
426
+ return Object.keys(group.controls).find(name => control === group.get(name)) || null;
427
+ }
428
+ return !getControlName(control) ? true : control.valid;
420
429
  }
421
430
  /**
422
431
  * @description Generates validators from component properties.
@@ -524,4 +533,4 @@ export class NgxFormService {
524
533
  }
525
534
  }
526
535
  }
527
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmd4Rm9ybVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9OZ3hGb3JtU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFtQixlQUFlLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBR3ZILE9BQU8sRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQWUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0csT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUc1RTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFDRztBQUNILE1BQU0sT0FBTyxjQUFjO0lBQ3pCOzs7Ozs7Ozs7T0FTRzthQUNZLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBb0MsQ0FBQztJQUUxRTs7Ozs7Ozs7O09BU0c7YUFDWSxpQkFBWSxHQUFHLElBQUksR0FBRyxFQUFxQixDQUFDO0lBQzNEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBYyxFQUFFLFNBQW9CO1FBQ3JELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLE1BQU0sMEJBQTBCLENBQUMs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LE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN6QixPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDMUIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QixPQUFPLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUNuQyxDQUFDO2FBQU0sQ0FBQztZQUNOLEtBQUssTUFBTSxHQUFHLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNyQyxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN4QyxjQUFjLENBQUMsS0FBSyxDQUFDLE9BQXNCLENBQUMsQ0FBQztnQkFDN0MsU0FBUztZQUNYLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVzY2FwZUh0bWwsIEZpZWxkUHJvcGVydGllcywgSFRNTDVDaGVja1R5cGVzLCBIVE1MNUlucHV0VHlwZXMsIHBhcnNlVG9OdW1iZXIgfSBmcm9tICdAZGVjYWYtdHMvdWktZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBGaWVsZFVwZGF0ZU1vZGUsIEZvcm1QYXJlbnRHcm91cCwgS2V5VmFsdWUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IElDb21wb25lbnRDb25maWcsIElDb21wb25lbnRJbnB1dCB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBpc1ZhbGlkRGF0ZSwgTW9kZWxLZXlzLCBwYXJzZURhdGUsIFByaW1pdGl2ZXMsIFZhbGlkYXRpb24gfSBmcm9tICdAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb24nO1xuaW1wb3J0IHsgVmFsaWRhdG9yRmFjdG9yeSB9IGZyb20gJy4vVmFsaWRhdG9yRmFjdG9yeSc7XG5pbXBvcnQgeyBjbGVhblNwYWNlcyB9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IHsgT3BlcmF0aW9uS2V5cyB9IGZyb20gJ0BkZWNhZi10cy9kYi1kZWNvcmF0b3JzJztcbmltcG9ydCB7IEFuZ3VsYXJFbmdpbmVLZXlzLCBCYXNlQ29tcG9uZW50UHJvcHMgfSBmcm9tICcuLi9lbmdpbmUvY29uc3RhbnRzJztcblxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTZXJ2aWNlIGZvciBtYW5hZ2luZyBBbmd1bGFyIGZvcm1zIGFuZCBmb3JtIGNvbnRyb2xzLlxuICogQHN1bW1hcnkgVGhlIE5neEZvcm1TZXJ2aWNlIHByb3ZpZGVzIHV0aWxpdHkgbWV0aG9kcyBmb3IgY3JlYXRpbmcsIG1hbmFnaW5nLCBhbmQgdmFsaWRhdGluZyBBbmd1bGFyIGZvcm1zIGFuZCBmb3JtIGNvbnRyb2xzLiBJdCBpbmNsdWRlcyBmdW5jdGlvbmFsaXR5IGZvciByZWdpc3RlcmluZyBmb3JtcywgYWRkaW5nIGNvbnRyb2xzLCB2YWxpZGF0aW5nIGZpZWxkcywgYW5kIGhhbmRsaW5nIGZvcm0gZGF0YS5cbiAqXG4gKiBAY2xhc3NcbiAqIEBwYXJhbSB7V2Vha01hcDxBYnN0cmFjdENvbnRyb2wsIEZpZWxkUHJvcGVydGllcz59IGNvbnRyb2xzIC0gQSBXZWFrTWFwIHRvIHN0b3JlIGNvbnRyb2wgcHJvcGVydGllcy5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgRm9ybUdyb3VwPn0gZm9ybVJlZ2lzdHJ5IC0gQSBNYXAgdG8gc3RvcmUgcmVnaXN0ZXJlZCBmb3Jtcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRpbmcgYSBmb3JtIGZyb20gY29tcG9uZW50c1xuICogY29uc3QgY29tcG9uZW50cyA9IFtcbiAqICAgeyBpbnB1dHM6IHsgbmFtZTogJ3VzZXJuYW1lJywgdHlwZTogJ3RleHQnLCByZXF1aXJlZDogdHJ1ZSB9IH0sXG4gKiAgIHsgaW5wdXRzOiB7IG5hbWU6ICdwYXNzd29yZCcsIHR5cGU6ICdwYXNzd29yZCcsIG1pbkxlbmd0aDogOCB9IH1cbiAqIF07XG4gKiBjb25zdCBmb3JtID0gTmd4Rm9ybVNlcnZpY2UuY3JlYXRlRm9ybUZyb21Db21wb25lbnRzKCdsb2dpbkZvcm0nLCBjb21wb25lbnRzLCB0cnVlKTtcbiAqXG4gKiAvLyBWYWxpZGF0aW5nIGZpZWxkc1xuICogTmd4Rm9ybVNlcnZpY2UudmFsaWRhdGVGaWVsZHMoZm9ybSk7XG4gKlxuICogLy8gR2V0dGluZyBmb3JtIGRhdGFcbiAqIGNvbnN0IGZvcm1EYXRhID0gTmd4Rm9ybVNlcnZpY2UuZ2V0Rm9ybURhdGEoZm9ybSk7XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENvbXBvbmVudFxuICogICBwYXJ0aWNpcGFudCBORlMgYXMgTmd4Rm9ybVNlcnZpY2VcbiAqICAgcGFydGljaXBhbnQgQUYgYXMgQW5ndWxhciBGb3Jtc1xuICogICBDLT4+TkZTOiBjcmVhdGVGb3JtRnJvbUNvbXBvbmVudHMoKVxuICogICBORlMtPj5BRjogbmV3IEZvcm1Hcm91cCgpXG4gKiAgIE5GUy0+Pk5GUzogYWRkRm9ybUNvbnRyb2woKVxuICogICBORlMtPj5BRjogYWRkQ29udHJvbCgpXG4gKiAgIE5GUy0tPj5DOiBSZXR1cm4gRm9ybUdyb3VwXG4gKiAgIEMtPj5ORlM6IHZhbGlkYXRlRmllbGRzKClcbiAqICAgTkZTLT4+QUY6IG1hcmtBc1RvdWNoZWQoKSwgbWFya0FzRGlydHkoKSwgdXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpXG4gKiAgIEMtPj5ORlM6IGdldEZvcm1EYXRhKClcbiAqICAgTkZTLT4+QUY6IEdldCBjb250cm9sIHZhbHVlc1xuICogICBORlMtLT4+QzogUmV0dXJuIGZvcm0gZGF0YVxuICovXG5leHBvcnQgY2xhc3MgTmd4Rm9ybVNlcnZpY2Uge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFdlYWtNYXAgdGhhdCBzdG9yZXMgY29udHJvbCBwcm9wZXJ0aWVzIGZvciBmb3JtIGNvbnRyb2xzLlxuICAgKiBAc3VtbWFyeSBBIFdlYWtNYXAgdGhhdCBhc3NvY2lhdGVzIEFic3RyYWN0Q29udHJvbCBpbnN0YW5jZXMgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIEZpZWxkUHJvcGVydGllcy5cbiAgICogVGhpcyBhbGxvd3MgdGhlIHNlcnZpY2UgdG8gdHJhY2sgbWV0YWRhdGEgZm9yIGZvcm0gY29udHJvbHMgd2l0aG91dCBjcmVhdGluZyBtZW1vcnkgbGVha3MuXG4gICAqXG4gICAqIEB0eXBlIHtXZWFrTWFwPEFic3RyYWN0Q29udHJvbCwgRmllbGRQcm9wZXJ0aWVzPn1cbiAgICogQHByaXZhdGVcbiAgICogQHN0YXRpY1xuICAgKiBAbWVtYmVyT2YgTmd4Rm9ybVNlcnZpY2VcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGNvbnRyb2xzID0gbmV3IFdlYWtNYXA8QWJzdHJhY3RDb250cm9sLCBGaWVsZFByb3BlcnRpZXM+KCk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RyeSBvZiBmb3JtIGdyb3VwcyBpbmRleGVkIGJ5IHRoZWlyIHVuaXF1ZSBpZGVudGlmaWVycy5cbiAgICogQHN1bW1hcnkgQSBNYXAgdGhhdCBzdG9yZXMgRm9ybUdyb3VwIGluc3RhbmNlcyB3aXRoIHRoZWlyIHVuaXF1ZSBzdHJpbmcgaWRlbnRpZmllcnMuXG4gICAqIFRoaXMgYWxsb3dzIGdsb2JhbCBhY2Nlc3MgdG8gcmVnaXN0ZXJlZCBmb3JtcyB0aHJvdWdob3V0IHRoZSBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHR5cGUge01hcDxzdHJpbmcsIEZvcm1Hcm91cD59XG4gICAqIEBwcml2YXRlXG4gICAqIEBzdGF0aWNcbiAgICogQG1lbWJlck9mIE5neEZvcm1TZXJ2aWNlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBmb3JtUmVnaXN0cnkgPSBuZXcgTWFwPHN0cmluZywgRm9ybUdyb3VwPigpO1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFkZHMgYSBmb3JtIHRvIHRoZSByZWdpc3RyeS5cbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIGEgRm9ybUdyb3VwIHdpdGggYSB1bmlxdWUgaWRlbnRpZmllci4gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBpZGVudGlmaWVyIGlzIGFscmVhZHkgaW4gdXNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm9ybUlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZm9ybS5cbiAgICogQHBhcmFtIHtGb3JtR3JvdXB9IGZvcm1Hcm91cCAtIFRoZSBGb3JtR3JvdXAgdG8gYmUgcmVnaXN0ZXJlZC5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIGEgRm9ybUdyb3VwIHdpdGggdGhlIGdpdmVuIGlkIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC5cbiAgICovXG4gIHN0YXRpYyBhZGRSZWdpc3RyeShmb3JtSWQ6IHN0cmluZywgZm9ybUdyb3VwOiBGb3JtR3JvdXApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mb3JtUmVnaXN0cnkuaGFzKGZvcm1JZCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEEgRm9ybUdyb3VwIHdpdGggaWQgJyR7Zm9ybUlkfScgaXMgYWxyZWFkeSByZWdpc3RlcmVkLmApO1xuICAgIHRoaXMuZm9ybVJlZ2lzdHJ5LnNldChmb3JtSWQsIGZvcm1Hcm91cCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlbW92ZXMgYSBmb3JtIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgKiBAc3VtbWFyeSBEZWxldGVzIGEgRm9ybUdyb3VwIGZyb20gdGhlIHJlZ2lzdHJ5IHVzaW5nIGl0cyB1bmlxdWUgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZvcm1JZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZm9ybSB0byBiZSByZW1vdmVkLlxuICAgKi9cbiAgc3RhdGljIHJlbW92ZVJlZ2lzdHJ5KGZvcm1JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtUmVnaXN0cnkuZGVsZXRlKGZvcm1JZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlc29sdmVzIHRoZSBwYXJlbnQgZ3JvdXAgYW5kIGNvbnRyb2wgbmFtZSBmcm9tIGEgcGF0aC5cbiAgICogQHN1bW1hcnkgVHJhdmVyc2VzIHRoZSBmb3JtIGdyb3VwIHN0cnVjdHVyZSB0byBmaW5kIHRoZSBwYXJlbnQgZ3JvdXAgYW5kIGNvbnRyb2wgbmFtZSBmb3IgYSBnaXZlbiBwYXRoLlxuICAgKiBAcGFyYW0ge0Zvcm1Hcm91cH0gZm9ybUdyb3VwIC0gVGhlIHJvb3QgRm9ybUdyb3VwLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBjb250cm9sLlxuICAgKiBAcmV0dXJuIHtGb3JtUGFyZW50R3JvdXB9IEEgdHVwbGUgY29udGFpbmluZyB0aGUgcGFyZW50IEZvcm1Hcm91cCBhbmQgdGhlIGNvbnRyb2wgbmFtZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlc29sdmVQYXJlbnRHcm91cChmb3JtR3JvdXA6IEZvcm1Hcm91cCwgcGF0aDogc3RyaW5nLCBjb21wb25lbnRQcm9wczogSUNvbXBvbmVudElucHV0LCBwYXJlbnRQcm9wczogS2V5VmFsdWUpOiBGb3JtUGFyZW50R3JvdXAge1xuICAgIGNvbnN0IGlzTXVsdGlwbGUgPSBwYXJlbnRQcm9wcz8uWydtdWx0aXBsZSddIHx8IHBhcmVudFByb3BzPy5bJ3R5cGUnXSA9PT0gJ0FycmF5JyB8fCBmYWxzZTtcbiAgICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgICBjb25zdCBjb250cm9sTmFtZSA9IHBhcnRzLnBvcCgpIGFzIHN0cmluZztcbiAgICBjb25zdCB7Y2hpbGRPZn0gPSBjb21wb25lbnRQcm9wc1xuICAgIGxldCBjdXJyZW50R3JvdXAgPSBmb3JtR3JvdXA7XG5cbiAgICBmdW5jdGlvbiBzZXRBcnJheUNvbXBvbmVudFByb3BzKGZvcm1Hcm91cEFycmF5OiBGb3JtQXJyYXkpIHtcbiAgICAgIGNvbnN0IHByb3BzID0gKGZvcm1Hcm91cEFycmF5IGFzIEtleVZhbHVlKVtBbmd1bGFyRW5naW5lS2V5cy5GT1JNX0dST1VQX0NPTVBPTkVOVF9QUk9QU10gfHwge307XG4gICAgICAgIGlmKCFwcm9wc1tNb2RlbEtleXMuTU9ERUxdW2NvbnRyb2xOYW1lXSlcbiAgICAgICAgICBwcm9wc1tNb2RlbEtleXMuTU9ERUxdID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvcHNbTW9kZWxLZXlzLk1PREVMXSwge1tjb250cm9sTmFtZV06IHsuLi5jb21wb25lbnRQcm9wc319KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgIGlmICghY3VycmVudEdyb3VwLmdldChwYXJ0KSkge1xuICAgICAgICBjb25zdCBwYXJ0Rm9ybUdyb3VwID0gKGlzTXVsdGlwbGUgJiYgcGFydCA9PT0gY2hpbGRPZikgPyBuZXcgRm9ybUFycmF5KFtuZXcgRm9ybUdyb3VwKHt9KV0pIDogbmV3IEZvcm1Hcm91cCh7fSk7XG4gICAgICAgIChwYXJ0Rm9ybUdyb3VwIGFzIEtleVZhbHVlKVtBbmd1bGFyRW5naW5lS2V5cy5GT1JNX0dST1VQX0NPTVBPTkVOVF9QUk9QU10gPSB7XG4gICAgICAgICAgY2hpbGRPZjogY2hpbGRPZiB8fCAnJyxcbiAgICAgICAgICBpc011bHRpcGxlOiBpc011bHRpcGxlLFxuICAgICAgICAgIG5hbWU6IHBhcnQsXG4gICAgICAgICAgcGs6IGNvbXBvbmVudFByb3BzPy5bJ3BrJ10gfHwgcGFyZW50UHJvcHM/LlsncGsnXSB8fCAnJyxcbiAgICAgICAgICBbTW9kZWxLZXlzLk1PREVMXToge30sXG4gICAgICAgIH0gYXMgUGFydGlhbDxGaWVsZFByb3BlcnRpZXM+ICYge21vZGVsOiBLZXlWYWx1ZX07XG5cbiAgICAgICAgaWYoY3VycmVudEdyb3VwIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgICAgKGN1cnJlbnRHcm91cCBhcyBGb3JtQXJyYXkpLnB1c2gocGFydEZvcm1Hcm91cCk7XG4gICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICBmb3IoY29uc3QgY29udHJvbCBvZiBPYmplY3QudmFsdWVzKHBhcnRGb3JtR3JvdXAuY29udHJvbHMpKSB7XG4gICAgICAgICAgICBpZihjb250cm9sIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wpXG4gICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXIoY29udHJvbCBhcyBBYnN0cmFjdENvbnRyb2wsIGNvbXBvbmVudFByb3BzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZihwYXJ0Rm9ybUdyb3VwIGluc3RhbmNlb2YgQWJzdHJhY3RDb250cm9sKVxuICAgICAgICAgICAgdGhpcy5yZWdpc3RlcihwYXJ0Rm9ybUdyb3VwIGFzIEFic3RyYWN0Q29udHJvbCwgY29tcG9uZW50UHJvcHMpO1xuXG4gICAgICAgICAgY3VycmVudEdyb3VwLmFkZENvbnRyb2wocGFydCwgcGFydEZvcm1Hcm91cCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmKGNoaWxkT2YgJiYgY3VycmVudEdyb3VwIGluc3RhbmNlb2YgRm9ybUFycmF5KVxuICAgICAgICBzZXRBcnJheUNvbXBvbmVudFByb3BzKGN1cnJlbnRHcm91cCk7XG5cbiAgICAgIGN1cnJlbnRHcm91cCA9IGN1cnJlbnRHcm91cC5nZXQocGFydCkgYXMgRm9ybUdyb3VwO1xuICAgIH1cbiAgICByZXR1cm4gW2N1cnJlbnRHcm91cCwgY29udHJvbE5hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgY29tcG9uZW50IHByb3BlcnRpZXMgZnJvbSBhIEZvcm1Hcm91cCBvciBGb3JtQXJyYXkuXG4gICAqIEBzdW1tYXJ5IEV4dHJhY3RzIGNvbXBvbmVudCBwcm9wZXJ0aWVzIHN0b3JlZCBpbiB0aGUgZm9ybSBncm91cCBtZXRhZGF0YS4gSWYgYSBGb3JtR3JvdXAgaXMgcHJvdmlkZWRcbiAgICogYW5kIGdyb3VwQXJyYXlOYW1lIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBsb29rIGZvciB0aGUgRm9ybUFycmF5IHdpdGhpbiB0aGUgZm9ybSBzdHJ1Y3R1cmUuXG4gICAqXG4gICAqIEBwYXJhbSB7Rm9ybUdyb3VwIHwgRm9ybUFycmF5fSBmb3JtR3JvdXAgLSBUaGUgZm9ybSBncm91cCBvciBmb3JtIGFycmF5IHRvIGV4dHJhY3QgcHJvcGVydGllcyBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSAtIE9wdGlvbmFsIGtleSB0byByZXRyaWV2ZSBhIHNwZWNpZmljIHByb3BlcnR5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZ3JvdXBBcnJheU5hbWVdIC0gT3B0aW9uYWwgbmFtZSBvZiB0aGUgZ3JvdXAgYXJyYXkgaWYgZm9ybUdyb3VwIGlzIG5vdCBhIEZvcm1BcnJheVxuICAgKiBAcmV0dXJuIHtQYXJ0aWFsPEZpZWxkUHJvcGVydGllcz59IFRoZSBjb21wb25lbnQgcHJvcGVydGllcyBvciBhIHNwZWNpZmljIHByb3BlcnR5IGlmIGtleSBpcyBwcm92aWRlZFxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEBtZW1iZXJPZiBOZ3hGb3JtU2VydmljZVxuICAgKi9cbiAgc3RhdGljIGdldENvbXBvbmVudFByb3BzRnJvbUdyb3VwQXJyYXkoZm9ybUdyb3VwOiBGb3JtR3JvdXAgfCBGb3JtQXJyYXksIGtleT86IHN0cmluZywgZ3JvdXBBcnJheU5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQYXJ0aWFsPEZpZWxkUHJvcGVydGllcz4ge1xuICAgIGlmKCEoZm9ybUdyb3VwIGluc3RhbmNlb2YgRm9ybUFycmF5KSAmJiB0eXBlb2YgZ3JvdXBBcnJheU5hbWUgPT09IFByaW1pdGl2ZXMuU1RSSU5HKVxuICAgICAgZm9ybUdyb3VwID0gZm9ybUdyb3VwLnJvb3QuZ2V0KGdyb3VwQXJyYXlOYW1lIGFzIHN0cmluZykgYXMgRm9ybUFycmF5IHx8IHt9O1xuICAgIGNvbnN0IHByb3BzID0gKGZvcm1Hcm91cCBhcyBLZXlWYWx1ZSk/LltBbmd1bGFyRW5naW5lS2V5cy5GT1JNX0dST1VQX0NPTVBPTkVOVF9QUk9QU10gfHwge307XG4gICAgcmV0dXJuICgha2V5ID8gcHJvcHMgOiBwcm9wcz8uW2tleV0pIHx8IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBZGRzIGEgbmV3IGdyb3VwIHRvIGEgcGFyZW50IEZvcm1BcnJheS5cbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhbmQgYWRkcyBhIG5ldyBGb3JtR3JvdXAgdG8gdGhlIHNwZWNpZmllZCBwYXJlbnQgRm9ybUFycmF5IGJhc2VkIG9uIHRoZVxuICAgKiBjb21wb25lbnQgcHJvcGVydGllcyBzdG9yZWQgaW4gdGhlIHBhcmVudCdzIG1ldGFkYXRhLiBUaGlzIGlzIHVzZWQgZm9yIGR5bmFtaWMgZm9ybSBhcnJheXNcbiAgICogd2hlcmUgbmV3IGdyb3VwcyBuZWVkIHRvIGJlIGFkZGVkIGF0IHJ1bnRpbWUuXG4gICAqXG4gICAqIEBwYXJhbSB7Rm9ybUdyb3VwfSBmb3JtR3JvdXAgLSBUaGUgcm9vdCBmb3JtIGdyb3VwIGNvbnRhaW5pbmcgdGhlIHBhcmVudCBGb3JtQXJyYXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcGFyZW50IEZvcm1BcnJheSB0byBhZGQgdGhlIGdyb3VwIHRvXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbaW5kZXg9MV0gLSBUaGUgaW5kZXggcG9zaXRpb24gd2hlcmUgdGhlIG5ldyBncm91cCBzaG91bGQgYmUgYWRkZWRcbiAgICogQHJldHVybiB7Rm9ybUdyb3VwfSBUaGUgbmV3bHkgY3JlYXRlZCBhbmQgYWRkZWQgRm9ybUdyb3VwXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQG1lbWJlck9mIE5neEZvcm1TZXJ2aWNlXG4gICAqL1xuICBzdGF0aWMgYWRkR3JvdXBUb1BhcmVudChmb3JtR3JvdXA6IEZvcm1Hcm91cCwgcGFyZW50TmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyID0gMSk6IEZvcm1Hcm91cCB7XG4gICAgY29uc3QgY29tcG9uZW50UHJvcHMgPSB0aGlzLmdldENvbXBvbmVudFByb3BzRnJvbUdyb3VwQXJyYXkoZm9ybUdyb3VwLCBNb2RlbEtleXMuTU9ERUwsIHBhcmVudE5hbWUpO1xuICAgIE9iamVjdC5lbnRyaWVzKGNvbXBvbmVudFByb3BzIGFzIEtleVZhbHVlKS5mb3JFYWNoKChbLCB2YWx1ZV0pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmFkZEZvcm1Db250cm9sKGZvcm1Hcm91cCwgdmFsdWUsIHttdWx0aXBsZTogdHJ1ZX0sIGluZGV4KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmdldEdyb3VwRnJvbVBhcmVudChmb3JtR3JvdXAsIHBhcmVudE5hbWUsIGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgRm9ybUdyb3VwIGZyb20gYSBwYXJlbnQgRm9ybUFycmF5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguXG4gICAqIEBzdW1tYXJ5IEdldHMgYSBGb3JtR3JvdXAgZnJvbSB0aGUgc3BlY2lmaWVkIHBhcmVudCBGb3JtQXJyYXkuIElmIHRoZSBncm91cCBkb2Vzbid0IGV4aXN0XG4gICAqIGF0IHRoZSBnaXZlbiBpbmRleCwgaXQgd2lsbCBjcmVhdGUgYSBuZXcgb25lIHVzaW5nIGFkZEdyb3VwVG9QYXJlbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7Rm9ybUdyb3VwfSBmb3JtR3JvdXAgLSBUaGUgcm9vdCBmb3JtIGdyb3VwIGNvbnRhaW5pbmcgdGhlIHBhcmVudCBGb3JtQXJyYXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcGFyZW50IEZvcm1BcnJheSB0byByZXRyaWV2ZSB0aGUgZ3JvdXAgZnJvbVxuICAgKiBAcGFyYW0ge251bWJlcn0gW2luZGV4PTFdIC0gVGhlIGluZGV4IG9mIHRoZSBncm91cCB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJuIHtGb3JtR3JvdXB9IFRoZSBGb3JtR3JvdXAgYXQgdGhlIHNwZWNpZmllZCBpbmRleFxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEBtZW1iZXJPZiBOZ3hGb3JtU2VydmljZVxuICAgKi9cbiAgc3RhdGljIGdldEdyb3VwRnJvbVBhcmVudChmb3JtR3JvdXA6IEZvcm1Hcm91cCwgcGFyZW50TmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyID0gMSk6IEZvcm1Hcm91cCB7XG4gICAgY29uc3QgY2hpbGRHcm91cCA9ICgoZm9ybUdyb3VwLmdldChwYXJlbnROYW1lKSB8fCBmb3JtR3JvdXApIGFzIEZvcm1BcnJheSkuYXQoaW5kZXgpO1xuICAgIGlmKGNoaWxkR3JvdXAgaW5zdGFuY2VvZiBGb3JtR3JvdXApXG4gICAgICByZXR1cm4gY2hpbGRHcm91cDtcbiAgICByZXR1cm4gdGhpcy5hZGRHcm91cFRvUGFyZW50KGZvcm1Hcm91cCwgcGFyZW50TmFtZSwgaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSB2YWx1ZSBpcyB1bmlxdWUgd2l0aGluIGEgRm9ybUFycmF5IGdyb3VwLlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgdGhhdCB0aGUgcHJpbWFyeSBrZXkgdmFsdWUgaW4gYSBGb3JtR3JvdXAgaXMgdW5pcXVlIGFtb25nIGFsbCBncm91cHNcbiAgICogaW4gdGhlIHBhcmVudCBGb3JtQXJyYXkuIFRoZSB1bmlxdWVuZXNzIGNoZWNrIGJlaGF2aW9yIGRpZmZlcnMgYmFzZWQgb24gdGhlIG9wZXJhdGlvbiB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0ge0Zvcm1Hcm91cH0gZm9ybUdyb3VwIC0gVGhlIEZvcm1Hcm91cCB0byBjaGVjayBmb3IgdW5pcXVlbmVzc1xuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgZ3JvdXAgd2l0aGluIHRoZSBGb3JtQXJyYXlcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfSBbb3BlcmF0aW9uPU9wZXJhdGlvbktleXMuQ1JFQVRFXSAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWRcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgdW5pcXVlLCBmYWxzZSBvdGhlcndpc2VcbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAbWVtYmVyT2YgTmd4Rm9ybVNlcnZpY2VcbiAgICovXG4gIHN0YXRpYyBpc1VuaXF1ZU9uR3JvdXAoZm9ybUdyb3VwOiBGb3JtR3JvdXAsIGluZGV4OiBudW1iZXIsIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyA9IE9wZXJhdGlvbktleXMuQ1JFQVRFKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZm9ybUdyb3VwQXJyYXkgPSBmb3JtR3JvdXAucGFyZW50IGFzIEZvcm1BcnJheTtcbiAgICBjb25zdCBwayA9IHRoaXMuZ2V0Q29tcG9uZW50UHJvcHNGcm9tR3JvdXBBcnJheShmb3JtR3JvdXBBcnJheSwgQmFzZUNvbXBvbmVudFByb3BzLlBLIGFzIHN0cmluZykgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGNvbnRyb2xOYW1lID0gT2JqZWN0LmtleXMoZm9ybUdyb3VwLmNvbnRyb2xzKVswXTtcblxuICAgIC8vIG9ubHkgY2hlY2sgZm9yIHVuaXF1ZSBpZiBpcyB0aGUgcGsgY29udHJvbFxuICAgIGlmKGNvbnRyb2xOYW1lICE9PSBwaylcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IGNsZWFuU3BhY2VzKGAke2Zvcm1Hcm91cC5nZXQocGspPy52YWx1ZX1gLCB0cnVlKTtcbiAgICBpZihvcGVyYXRpb24gPT09IE9wZXJhdGlvbktleXMuQ1JFQVRFKVxuICAgICAgcmV0dXJuICFmb3JtR3JvdXBBcnJheS5jb250cm9scy5zb21lKChncm91cCwgaSkgPT4gaSAhPT0gaW5kZXggJiYgY2xlYW5TcGFjZXMoYCR7Z3JvdXAuZ2V0KHBrKT8udmFsdWV9YCwgdHJ1ZSkgPT09IGNvbnRyb2xWYWx1ZSk7XG5cbiAgICByZXR1cm4gIWZvcm1Hcm91cEFycmF5LmNvbnRyb2xzLnNvbWUoKGdyb3VwLCBpKSA9PlxuICAgICAgaSAhPT0gaW5kZXggJiYgY29udHJvbFZhbHVlID09PSBjbGVhblNwYWNlcyhgJHtncm91cC5nZXQocGspPy52YWx1ZX1gLCB0cnVlKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVuYWJsZXMgYWxsIGNvbnRyb2xzIHdpdGhpbiBhIEZvcm1Hcm91cCBvciBGb3JtQXJyYXkuXG4gICAqIEBzdW1tYXJ5IFJlY3Vyc2l2ZWx5IGVuYWJsZXMgYWxsIGZvcm0gY29udHJvbHMgd2l0aGluIHRoZSBwcm92aWRlZCBGb3JtR3JvdXAgb3IgRm9ybUFycmF5LlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgbWFraW5nIGFsbCBjb250cm9scyBpbnRlcmFjdGl2ZSBhZnRlciB0aGV5IGhhdmUgYmVlbiBkaXNhYmxlZC5cbiAgICpcbiAgICogQHBhcmFtIHtGb3JtQXJyYXkgfCBGb3JtR3JvdXB9IGZvcm1Hcm91cCAtIFRoZSBGb3JtR3JvdXAgb3IgRm9ybUFycmF5IHRvIGVuYWJsZSBhbGwgY29udHJvbHMgZm9yXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQG1lbWJlck9mIE5neEZvcm1TZXJ2aWNlXG4gICAqL1xuICBzdGF0aWMgZW5hYmxlQWxsR3JvdXBDb250cm9scyhmb3JtR3JvdXA6IEZvcm1BcnJheSB8IEZvcm1Hcm91cCk6IHZvaWQge1xuICAgIE9iamVjdC5rZXlzKGZvcm1Hcm91cC5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgY29uc3QgY29udHJvbCA9IGZvcm1Hcm91cC5nZXQoa2V5KTtcbiAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgIGNvbnRyb2wuY29udHJvbHMuZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgICAgICAgICBjaGlsZC5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgY2hpbGQudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogdHJ1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBZGRzIGEgZm9ybSBjb250cm9sIHRvIGEgZm9ybSBncm91cCBiYXNlZCBvbiBjb21wb25lbnQgcHJvcGVydGllcy5cbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhbmQgY29uZmlndXJlcyBhIEZvcm1Db250cm9sIHdpdGhpbiB0aGUgc3BlY2lmaWVkIEZvcm1Hcm91cCB1c2luZyB0aGUgcHJvdmlkZWRcbiAgICogY29tcG9uZW50IHByb3BlcnRpZXMuIEhhbmRsZXMgbmVzdGVkIHBhdGhzLCBtdWx0aXBsZSBjb250cm9scyAoRm9ybUFycmF5cyksIGFuZCBjb250cm9sIHJlZ2lzdHJhdGlvbi5cbiAgICogVGhpcyBtZXRob2Qgc3VwcG9ydHMgY29tcGxleCBmb3JtIHN0cnVjdHVyZXMgd2l0aCBuZXN0ZWQgZ3JvdXBzIGFuZCBhcnJheXMuXG4gICAqXG4gICAqIEBwYXJhbSB7Rm9ybUdyb3VwfSBmb3JtR3JvdXAgLSBUaGUgZm9ybSBncm91cCB0byBhZGQgdGhlIGNvbnRyb2wgdG9cbiAgICogQHBhcmFtIHtJQ29tcG9uZW50SW5wdXR9IGNvbXBvbmVudFByb3BzIC0gVGhlIGNvbXBvbmVudCBwcm9wZXJ0aWVzIGRlZmluaW5nIHRoZSBjb250cm9sIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIHtLZXlWYWx1ZX0gW3BhcmVudFByb3BzPXt9XSAtIFByb3BlcnRpZXMgZnJvbSB0aGUgcGFyZW50IGNvbXBvbmVudCBmb3IgY29udGV4dFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2luZGV4PTBdIC0gVGhlIGluZGV4IGZvciBtdWx0aXBsZSBjb250cm9scyBpbiBGb3JtQXJyYXlzXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBzdGF0aWNcbiAgICogQG1lbWJlck9mIE5neEZvcm1TZXJ2aWNlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBhZGRGb3JtQ29udHJvbChmb3JtR3JvdXA6IEZvcm1Hcm91cCwgY29tcG9uZW50UHJvcHM6IElDb21wb25lbnRJbnB1dCwgcGFyZW50UHJvcHM6IEtleVZhbHVlID0ge30sIGluZGV4OiBudW1iZXIgPSAwKTogdm9pZCB7XG5cbiAgICBjb25zdCBpc011bHRpcGxlID0gcGFyZW50UHJvcHM/LlsnbXVsdGlwbGUnXSB8fCBwYXJlbnRQcm9wcz8uWyd0eXBlJ10gPT09ICdBcnJheScgfHwgZmFsc2U7XG4gICAgY29uc3QgeyBuYW1lLCBjaGlsZE9mLCB9ID0gY29tcG9uZW50UHJvcHM7XG4gICAgaWYoaXNNdWx0aXBsZSlcbiAgICAgIGNvbXBvbmVudFByb3BzWydwayddID0gY29tcG9uZW50UHJvcHNbJ3BrJ10gfHwgcGFyZW50UHJvcHM/LlsncGsnXSB8fCAnJztcbiAgICBjb25zdCBmdWxsUGF0aCA9IGNoaWxkT2YgPyBpc011bHRpcGxlID8gYCR7Y2hpbGRPZn0uJHtpbmRleH0uJHtuYW1lfWAgOiBgJHtjaGlsZE9mfS4ke25hbWV9YCA6IG5hbWU7XG4gICAgY29uc3QgW3BhcmVudEdyb3VwLCBjb250cm9sTmFtZV0gPSB0aGlzLnJlc29sdmVQYXJlbnRHcm91cChmb3JtR3JvdXAsIGZ1bGxQYXRoLCBjb21wb25lbnRQcm9wcywgcGFyZW50UHJvcHMpO1xuXG4gICAgaWYgKCFwYXJlbnRHcm91cC5nZXQoY29udHJvbE5hbWUpKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gTmd4Rm9ybVNlcnZpY2UuZnJvbVByb3BzKFxuICAgICAgICBjb21wb25lbnRQcm9wcyxcbiAgICAgICAgY29tcG9uZW50UHJvcHMudXBkYXRlTW9kZSB8fCAnY2hhbmdlJyxcbiAgICAgICk7XG4gICAgICBOZ3hGb3JtU2VydmljZS5yZWdpc3Rlcihjb250cm9sLCBjb21wb25lbnRQcm9wcyk7XG4gICAgICBwYXJlbnRHcm91cC5hZGRDb250cm9sKGNvbnRyb2xOYW1lLCBjb250cm9sKTtcbiAgICB9XG5cbiAgICBjb21wb25lbnRQcm9wc1snZm9ybUdyb3VwJ10gPSBwYXJlbnRHcm91cDtcbiAgICBjb21wb25lbnRQcm9wc1snZm9ybUNvbnRyb2wnXSA9IHBhcmVudEdyb3VwLmdldChjb250cm9sTmFtZSkgYXMgRm9ybUNvbnRyb2w7XG4gICAgY29tcG9uZW50UHJvcHNbJ211bHRpcGxlJ10gPSBpc011bHRpcGxlXG5cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgY29udHJvbCBmcm9tIGEgcmVnaXN0ZXJlZCBmb3JtLlxuICAgKiBAc3VtbWFyeSBGaW5kcyBhbmQgcmV0dXJucyBhbiBBYnN0cmFjdENvbnRyb2wgZnJvbSBhIHJlZ2lzdGVyZWQgZm9ybSB1c2luZyB0aGUgZm9ybSBpZCBhbmQgb3B0aW9uYWwgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZvcm1JZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZm9ybS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXSAtIFRoZSBwYXRoIHRvIHRoZSBjb250cm9sIHdpdGhpbiB0aGUgZm9ybS5cbiAgICogQHJldHVybiB7QWJzdHJhY3RDb250cm9sfSBUaGUgcmVxdWVzdGVkIEFic3RyYWN0Q29udHJvbC5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBmb3JtIGlzIG5vdCBmb3VuZCBpbiB0aGUgcmVnaXN0cnkgb3IgdGhlIGNvbnRyb2wgaXMgbm90IGZvdW5kIGluIHRoZSBmb3JtLlxuICAgKi9cbiAgc3RhdGljIGdldENvbnRyb2xGcm9tRm9ybShmb3JtSWQ6IHN0cmluZywgcGF0aD86IHN0cmluZyk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZm9ybVJlZ2lzdHJ5LmdldChmb3JtSWQpO1xuICAgIGlmICghZm9ybSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRm9ybSB3aXRoIGlkICcke2Zvcm1JZH0nIG5vdCBmb3VuZCBpbiB0aGUgcmVnaXN0cnkuYCk7XG5cbiAgICBpZiAoIXBhdGgpXG4gICAgICByZXR1cm4gZm9ybTtcblxuICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtLmdldChwYXRoKTtcbiAgICBpZiAoIWNvbnRyb2wpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbnRyb2wgd2l0aCBwYXRoICcke3BhdGh9JyBub3QgZm91bmQgaW4gZm9ybSAnJHtmb3JtSWR9Jy5gKTtcbiAgICByZXR1cm4gY29udHJvbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGZvcm0gZnJvbSBjb21wb25lbnQgY29uZmlndXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhIEZvcm1Hcm91cCBiYXNlZCBvbiBhbiBhcnJheSBvZiBjb21wb25lbnQgY29uZmlndXJhdGlvbnMgYW5kIG9wdGlvbmFsbHkgcmVnaXN0ZXJzIGl0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBmb3JtLlxuICAgKiBAcGFyYW0ge0lDb21wb25lbnRDb25maWdbXX0gY29tcG9uZW50cyAtIEFuIGFycmF5IG9mIGNvbXBvbmVudCBjb25maWd1cmF0aW9ucy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbcmVnaXN0cnk9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgY3JlYXRlZCBmb3JtLlxuICAgKiBAcmV0dXJuIHtGb3JtR3JvdXB9IFRoZSBjcmVhdGVkIEZvcm1Hcm91cC5cbiAgICovXG4gIHN0YXRpYyBjcmVhdGVGb3JtRnJvbUNvbXBvbmVudHMoaWQ6IHN0cmluZywgY29tcG9uZW50czogSUNvbXBvbmVudENvbmZpZ1tdLCByZWdpc3RyeTogYm9vbGVhbiA9IGZhbHNlKTogRm9ybUdyb3VwIHtcbiAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XG4gICAgY29tcG9uZW50cy5mb3JFYWNoKGNvbXBvbmVudCA9PiB7XG4gICAgICB0aGlzLmFkZEZvcm1Db250cm9sKGZvcm0sIGNvbXBvbmVudC5pbnB1dHMpO1xuICAgIH0pO1xuXG4gICAgaWYgKHJlZ2lzdHJ5KVxuICAgICAgdGhpcy5hZGRSZWdpc3RyeShpZCwgZm9ybSk7XG5cbiAgICByZXR1cm4gZm9ybTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWRkcyBhIGNvbnRyb2wgdG8gYSBmb3JtIGJhc2VkIG9uIGNvbXBvbmVudCBwcm9wZXJ0aWVzLlxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGFuZCBhZGRzIGEgZm9ybSBjb250cm9sIHRvIGEgZm9ybSAoZXhpc3Rpbmcgb3IgbmV3KSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgY29tcG9uZW50IHByb3BlcnRpZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZm9ybS5cbiAgICogQHBhcmFtIHtGaWVsZFByb3BlcnRpZXN9IGNvbXBvbmVudFByb3BlcnRpZXMgLSBUaGUgcHJvcGVydGllcyBvZiB0aGUgY29tcG9uZW50IHRvIGNyZWF0ZSB0aGUgY29udHJvbCBmcm9tLlxuICAgKiBAcmV0dXJuIHtBYnN0cmFjdENvbnRyb2x9IFRoZSBmb3JtIG9yIGNyZWF0ZWQgY29udHJvbC5cbiAgICovXG4gIHN0YXRpYyBhZGRDb250cm9sRnJvbVByb3BzKGlkOiBzdHJpbmcsIGNvbXBvbmVudFByb3BlcnRpZXM6IEZpZWxkUHJvcGVydGllcywgcGFyZW50UHJvcHM/OiBGaWVsZFByb3BlcnRpZXMpOiBBYnN0cmFjdENvbnRyb2wge1xuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmZvcm1SZWdpc3RyeS5nZXQoaWQpID8/IG5ldyBGb3JtR3JvdXAoe30pO1xuICAgIGlmICghdGhpcy5mb3JtUmVnaXN0cnkuaGFzKGlkKSlcbiAgICAgIHRoaXMuYWRkUmVnaXN0cnkoaWQsIGZvcm0pO1xuXG4gICAgaWYgKGNvbXBvbmVudFByb3BlcnRpZXMucGF0aClcbiAgICAgIHRoaXMuYWRkRm9ybUNvbnRyb2woZm9ybSwgY29tcG9uZW50UHJvcGVydGllcywgcGFyZW50UHJvcHMpO1xuXG4gICAgcmV0dXJuIGZvcm07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBmb3JtIGRhdGEgZnJvbSBhIEZvcm1Hcm91cC5cbiAgICogQHN1bW1hcnkgRXh0cmFjdHMgYW5kIHByb2Nlc3NlcyB0aGUgZGF0YSBmcm9tIGEgRm9ybUdyb3VwLCBoYW5kbGluZyBkaWZmZXJlbnQgaW5wdXQgdHlwZXMgYW5kIG5lc3RlZCBmb3JtIGdyb3Vwcy5cbiAgICogQHBhcmFtIHtGb3JtR3JvdXB9IGZvcm1Hcm91cCAtIFRoZSBGb3JtR3JvdXAgdG8gZXh0cmFjdCBkYXRhIGZyb20uXG4gICAqIEByZXR1cm4ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgZm9ybSBkYXRhLlxuICAgKi9cbiAgc3RhdGljIGdldEZvcm1EYXRhKGZvcm1Hcm91cDogRm9ybUdyb3VwKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZm9ybUdyb3VwLmNvbnRyb2xzKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmNvbnRyb2xzW2tleV07XG4gICAgICBjb25zdCBwYXJlbnRQcm9wcyA9IE5neEZvcm1TZXJ2aWNlLmdldFByb3BzRnJvbUNvbnRyb2woZm9ybUdyb3VwIGFzIEZvcm1Hcm91cCB8IEZvcm1BcnJheSk7XG4gICAgICBpZiAoIShjb250cm9sIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gTmd4Rm9ybVNlcnZpY2UuZ2V0Rm9ybURhdGEoY29udHJvbCBhcyBGb3JtR3JvdXApO1xuICAgICAgICBjb25zdCBpc1ZhbGlkID0gY29udHJvbC52YWxpZDtcbiAgICAgICAgaWYocGFyZW50UHJvcHMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGlmKGlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgIGRhdGFba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5yZXNldChjb250cm9sIGFzIEZvcm1Db250cm9sKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YVtrZXldID0gdmFsdWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcm9wcyA9IE5neEZvcm1TZXJ2aWNlLmdldFByb3BzRnJvbUNvbnRyb2woY29udHJvbCBhcyBGb3JtQ29udHJvbCB8IEZvcm1BcnJheSk7XG4gICAgICBsZXQgdmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgICAgaWYgKCFIVE1MNUNoZWNrVHlwZXMuaW5jbHVkZXMocHJvcHNbJ3R5cGUnXSkpIHtcbiAgICAgICAgc3dpdGNoIChwcm9wc1sndHlwZSddKSB7XG4gICAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuTlVNQkVSOlxuICAgICAgICAgICAgdmFsdWUgPSBwYXJzZVRvTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLkRBVEU6XG4gICAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuREFURVRJTUVfTE9DQUw6XG4gICAgICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB2YWx1ZSA9IGVzY2FwZUh0bWwodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkYXRhW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgTmd4Rm9ybVNlcnZpY2UuZW5hYmxlQWxsR3JvdXBDb250cm9scyhmb3JtR3JvdXAgYXMgRm9ybUdyb3VwKTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVmFsaWRhdGVzIGZpZWxkcyBpbiBhIGZvcm0gY29udHJvbCBvciBmb3JtIGdyb3VwLlxuICAgKiBAc3VtbWFyeSBSZWN1cnNpdmVseSB2YWxpZGF0ZXMgYWxsIGZpZWxkcyBpbiBhIGZvcm0gY29udHJvbCBvciBmb3JtIGdyb3VwLCBtYXJraW5nIHRoZW0gYXMgdG91Y2hlZCBhbmQgZGlydHkuXG4gICAqIEBwYXJhbSB7QWJzdHJhY3RDb250cm9sfSBjb250cm9sIC0gVGhlIGNvbnRyb2wgb3IgZm9ybSBncm91cCB0byB2YWxpZGF0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXSAtIFRoZSBwYXRoIHRvIHRoZSBjb250cm9sIHdpdGhpbiB0aGUgZm9ybS5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBhbGwgZmllbGRzIGFyZSB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgbm8gY29udHJvbCBpcyBmb3VuZCBhdCB0aGUgc3BlY2lmaWVkIHBhdGggb3IgaWYgdGhlIGNvbnRyb2wgdHlwZSBpcyB1bmtub3duLlxuICAgKi9cbiAgc3RhdGljIHZhbGlkYXRlRmllbGRzKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgcGs/OiBzdHJpbmcsICBwYXRoPzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29udHJvbCA9IHBhdGggPyBjb250cm9sLmdldChwYXRoKSBhcyBBYnN0cmFjdENvbnRyb2wgOiBjb250cm9sO1xuICAgIGlmICghY29udHJvbClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29udHJvbCBmb3VuZCBhdCBwYXRoOiAke3BhdGggfHwgJ3Jvb3QnfS5gKTtcblxuICAgIGNvbnN0IGlzQWxsb3dlZCA9IFtGb3JtQXJyYXksIEZvcm1Hcm91cCwgRm9ybUNvbnRyb2xdLnNvbWUodHlwZSA9PiBjb250cm9sIGluc3RhbmNlb2YgdHlwZSk7XG4gICAgaWYgKCFpc0FsbG93ZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29udHJvbCB0eXBlIGF0OiAke3BhdGggfHwgJ3Jvb3QnfWApO1xuXG4gICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogdHJ1ZSB9KTtcblxuICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgICBPYmplY3QudmFsdWVzKGNvbnRyb2wuY29udHJvbHMpLmZvckVhY2goY2hpbGRDb250cm9sID0+IHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZUZpZWxkcyhjaGlsZENvbnRyb2wpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgIGNvbnN0IHRvdGFsR3JvdXBzID0gY29udHJvbC5sZW5ndGg7XG4gICAgICBjb25zdCBoYXNWYWxpZCA9IGNvbnRyb2wuY29udHJvbHMuc29tZShjb250cm9sID0+IGNvbnRyb2wudmFsaWQpO1xuICAgICAgaWYodG90YWxHcm91cHMgPiAxICYmIGhhc1ZhbGlkKSB7XG4gICAgICAgICBmb3IgKGxldCBpID0gY29udHJvbC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGNvbnN0IGNoaWxkQ29udHJvbCA9IGNvbnRyb2wuYXQoaSk7XG4gICAgICAgICAgLy8gZGlzYWJsZSBubyB2YWxpZCBncm91cHMgb24gYXJyYXlcbiAgICAgICAgICBpZiAoIWNoaWxkQ29udHJvbC52YWxpZCkge1xuICAgICAgICAgICAgKGNoaWxkQ29udHJvbC5wYXJlbnQgYXMgRm9ybUdyb3VwKS5zZXRFcnJvcnMobnVsbCk7XG4gICAgICAgICAgICAgKGNoaWxkQ29udHJvbC5wYXJlbnQgYXMgRm9ybUdyb3VwKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiB0cnVlIH0pO1xuICAgICAgICAgICAgY2hpbGRDb250cm9sLmRpc2FibGUoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWxpZGF0ZUZpZWxkcyhjaGlsZENvbnRyb2wpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhjb250cm9sLmNvbnRyb2xzKS5mb3JFYWNoKGNoaWxkQ29udHJvbCA9PiB7XG4gICAgICAgICAgdGhpcy52YWxpZGF0ZUZpZWxkcyhjaGlsZENvbnRyb2wpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29udHJvbC52YWxpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIHZhbGlkYXRvcnMgZnJvbSBjb21wb25lbnQgcHJvcGVydGllcy5cbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhbiBhcnJheSBvZiBWYWxpZGF0b3JGbiBiYXNlZCBvbiB0aGUgc3VwcG9ydGVkIHZhbGlkYXRpb24ga2V5cyBpbiB0aGUgY29tcG9uZW50IHByb3BlcnRpZXMuXG4gICAqIEBwYXJhbSB7RmllbGRQcm9wZXJ0aWVzfSBwcm9wcyAtIFRoZSBjb21wb25lbnQgcHJvcGVydGllcy5cbiAgICogQHJldHVybiB7VmFsaWRhdG9yRm5bXX0gQW4gYXJyYXkgb2YgdmFsaWRhdG9yIGZ1bmN0aW9ucy5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHZhbGlkYXRvcnNGcm9tUHJvcHMocHJvcHM6IEZpZWxkUHJvcGVydGllcyk6IFZhbGlkYXRvckZuW10ge1xuICAgIGNvbnN0IHN1cHBvcnRlZFZhbGlkYXRpb25LZXlzID0gVmFsaWRhdGlvbi5rZXlzKCk7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHByb3BzKVxuICAgICAgLmZpbHRlcigoazogc3RyaW5nKSA9PiBzdXBwb3J0ZWRWYWxpZGF0aW9uS2V5cy5pbmNsdWRlcyhrKSlcbiAgICAgIC5tYXAoKGs6IHN0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4gVmFsaWRhdG9yRmFjdG9yeS5zcGF3bihwcm9wcywgayk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIEZvcm1Db250cm9sIGZyb20gY29tcG9uZW50IHByb3BlcnRpZXMuXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhIEZvcm1Db250cm9sIHdpdGggdmFsaWRhdG9ycyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgY29tcG9uZW50IHByb3BlcnRpZXMuXG4gICAqIEBwYXJhbSB7RmllbGRQcm9wZXJ0aWVzfSBwcm9wcyAtIFRoZSBjb21wb25lbnQgcHJvcGVydGllcy5cbiAgICogQHBhcmFtIHtGaWVsZFVwZGF0ZU1vZGV9IFt1cGRhdGVNb2RlPSdjaGFuZ2UnXSAtIFRoZSB1cGRhdGUgbW9kZSBmb3IgdGhlIGNvbnRyb2wuXG4gICAqIEByZXR1cm4ge0Zvcm1Db250cm9sfSBUaGUgY3JlYXRlZCBGb3JtQ29udHJvbC5cbiAgICovXG4gIHN0YXRpYyBmcm9tUHJvcHMocHJvcHM6IEZpZWxkUHJvcGVydGllcywgdXBkYXRlTW9kZTogRmllbGRVcGRhdGVNb2RlID0gJ2NoYW5nZScpOiBGb3JtQ29udHJvbCB7XG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IHRoaXMudmFsaWRhdG9yc0Zyb21Qcm9wcyhwcm9wcyk7XG4gICAgY29uc3QgY29tcG9zZWQgPSB2YWxpZGF0b3JzLmxlbmd0aCA/IFZhbGlkYXRvcnMuY29tcG9zZSh2YWxpZGF0b3JzKSA6IG51bGw7XG4gICAgcmV0dXJuIG5ldyBGb3JtQ29udHJvbChcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6XG4gICAgICAgICAgcHJvcHMudmFsdWUgJiYgcHJvcHMudHlwZSAhPT0gSFRNTDVJbnB1dFR5cGVzLkNIRUNLQk9YXG4gICAgICAgICAgICA/IHByb3BzLnR5cGUgPT09IEhUTUw1SW5wdXRUeXBlcy5EQVRFXG4gICAgICAgICAgICAgID8gIWlzVmFsaWREYXRlKHBhcnNlRGF0ZShwcm9wcy5mb3JtYXQgYXMgc3RyaW5nLCBwcm9wcy52YWx1ZSBhcyBzdHJpbmcpKVxuICAgICAgICAgICAgICAgID8gdW5kZWZpbmVkIDogcHJvcHMudmFsdWUgOlxuICAgICAgICAgICAgICAocHJvcHMudmFsdWUgYXMgdW5rbm93bikgOiB1bmRlZmluZWQsXG4gICAgICAgIGRpc2FibGVkOiBwcm9wcy5kaXNhYmxlZCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHZhbGlkYXRvcnM6IGNvbXBvc2VkLFxuICAgICAgICB1cGRhdGVPbjogdXBkYXRlTW9kZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHByb3BlcnRpZXMgZnJvbSBhIEZvcm1Db250cm9sLlxuICAgKiBAc3VtbWFyeSBHZXRzIHRoZSBGaWVsZFByb3BlcnRpZXMgYXNzb2NpYXRlZCB3aXRoIGEgRm9ybUNvbnRyb2wgZnJvbSB0aGUgaW50ZXJuYWwgV2Vha01hcC5cbiAgICogQHBhcmFtIHtGb3JtQ29udHJvbH0gY29udHJvbCAtIFRoZSBGb3JtQ29udHJvbCB0byBnZXQgcHJvcGVydGllcyBmb3IuXG4gICAqIEByZXR1cm4ge0ZpZWxkUHJvcGVydGllc30gVGhlIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250cm9sLlxuICAgKi9cbiAgc3RhdGljIGdldFByb3BzRnJvbUNvbnRyb2woY29udHJvbDogRm9ybUNvbnRyb2wgfCBGb3JtQXJyYXkgfCBGb3JtR3JvdXApOiBGaWVsZFByb3BlcnRpZXMge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xzLmdldChjb250cm9sKSB8fCB7fSBhcyBGaWVsZFByb3BlcnRpZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZpbmRzIGEgcGFyZW50IGVsZW1lbnQgd2l0aCBhIHNwZWNpZmljIHRhZy5cbiAgICogQHN1bW1hcnkgVHJhdmVyc2VzIHVwIHRoZSBET00gdHJlZSB0byBmaW5kIHRoZSBuZWFyZXN0IHBhcmVudCBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCB0YWcuXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIC0gVGhlIHN0YXJ0aW5nIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgLSBUaGUgdGFnIG5hbWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9IFRoZSBmb3VuZCBwYXJlbnQgZWxlbWVudC5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIG5vIHBhcmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgdGFnIGlzIGZvdW5kLlxuICAgKi9cbiAgc3RhdGljIGdldFBhcmVudEVsKGVsOiBIVE1MRWxlbWVudCwgdGFnOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG4gICAgbGV0IHBhcmVudDogSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIHdoaWxlICgocGFyZW50ID0gZWwucGFyZW50RWxlbWVudCkgIT09IG51bGwpIHtcbiAgICAgIGlmIChwYXJlbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSB0YWcudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgICAgfVxuICAgICAgZWwgPSBwYXJlbnQ7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBObyBwYXJlbnQgd2l0aCB0aGUgdGFnICR7dGFnfSB3YXMgZm91bmQgZm9yIHByb3ZpZGVkIGVsZW1lbnRgLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhIGNvbnRyb2wgd2l0aCBpdHMgcHJvcGVydGllcy5cbiAgICogQHN1bW1hcnkgQXNzb2NpYXRlcyBhIGNvbnRyb2wgd2l0aCBpdHMgcHJvcGVydGllcyBpbiB0aGUgaW50ZXJuYWwgV2Vha01hcC5cbiAgICogQHBhcmFtIHtBYnN0cmFjdENvbnRyb2x9IGNvbnRyb2wgLSBUaGUgY29udHJvbCB0byByZWdpc3Rlci5cbiAgICogQHBhcmFtIHtGaWVsZFByb3BlcnRpZXN9IHByb3BzIC0gVGhlIHByb3BlcnRpZXMgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGNvbnRyb2wuXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXIoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBwcm9wczogRmllbGRQcm9wZXJ0aWVzKSB7XG4gICAgdGhpcy5jb250cm9scy5zZXQoY29udHJvbCwgcHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbnJlZ2lzdGVycyBhIGNvbnRyb2wuXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSBjb250cm9sIGFuZCBpdHMgYXNzb2NpYXRlZCBwcm9wZXJ0aWVzIGZyb20gdGhlIGludGVybmFsIFdlYWtNYXAuXG4gICAqIEBwYXJhbSB7QWJzdHJhY3RDb250cm9sfSBjb250cm9sIC0gVGhlIGNvbnRyb2wgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgY29udHJvbCB3YXMgc3VjY2Vzc2Z1bGx5IHVucmVnaXN0ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgc3RhdGljIHVucmVnaXN0ZXIoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29udHJvbHMuZGVsZXRlKGNvbnRyb2wpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXNldHMgYSBmb3JtIGdyb3VwLlxuICAgKiBAc3VtbWFyeSBSZWN1cnNpdmVseSByZXNldHMgYWxsIGNvbnRyb2xzIGluIGEgZm9ybSBncm91cCwgY2xlYXJpbmcgdmFsdWVzLCBlcnJvcnMsIGFuZCBtYXJraW5nIHRoZW0gYXMgcHJpc3RpbmUgYW5kIHVudG91Y2hlZC5cbiAgICogQHBhcmFtIHtGb3JtR3JvdXB9IGZvcm1Hcm91cCAtIFRoZSBmb3JtIGdyb3VwIHRvIHJlc2V0LlxuICAgKi9cbiAgc3RhdGljIHJlc2V0KGZvcm1Hcm91cDogRm9ybUdyb3VwIHwgRm9ybUNvbnRyb2wpOiB2b2lkIHtcbiAgICBpZihmb3JtR3JvdXAgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCkge1xuICAgICAgY29uc3QgY29udHJvbCA9IGZvcm1Hcm91cCBhcyBGb3JtQ29udHJvbDtcbiAgICAgIGNvbnN0IHsgdHlwZSB9ID0gTmd4Rm9ybVNlcnZpY2UuZ2V0UHJvcHNGcm9tQ29udHJvbChjb250cm9sKTtcbiAgICAgIGlmICghSFRNTDVDaGVja1R5cGVzLmluY2x1ZGVzKHR5cGUpKVxuICAgICAgICBjb250cm9sLnNldFZhbHVlKFwiXCIpO1xuICAgICAgY29udHJvbC5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgY29udHJvbC5tYXJrQXNVbnRvdWNoZWQoKTtcbiAgICAgIGNvbnRyb2wuc2V0RXJyb3JzKG51bGwpO1xuICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGZvcm1Hcm91cC5jb250cm9scykge1xuICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmNvbnRyb2xzW2tleV07XG4gICAgICAgIE5neEZvcm1TZXJ2aWNlLnJlc2V0KGNvbnRyb2wgYXMgRm9ybUNvbnRyb2wpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
536
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmd4Rm9ybVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9OZ3hGb3JtU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFtQixlQUFlLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBR3ZILE9BQU8sRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQWUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0csT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUc1RTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFDRztBQUNILE1BQU0sT0FBTyxjQUFjO0lBQ3pCOzs7Ozs7Ozs7T0FTRzthQUNZLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBb0MsQ0FBQztJQUUxRTs7Ozs7Ozs7O09BU0c7YUFDWSxpQkFBWSxHQUFHLElBQUksR0FBRyxFQUFxQixDQUFDO0lBQzNEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBYyxFQUFFLFNBQW9CO1FBQ3JELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLE1BQU0sMEJBQTBCLENBQUMs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OztPQUtHO0lBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUF3QjtRQUN4QyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFrQztRQUM3QyxJQUFHLFNBQVMsWUFBWSxXQUFXLEVBQUUsQ0FBQztZQUNwQyxNQUFNLE9BQU8sR0FBRyxTQUF3QixDQUFDO1lBQ3pDLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxjQUFjLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDN0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUNqQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZCLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN6QixPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDMUIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QixPQUFPLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUNuQyxDQUFDO2FBQU0sQ0FBQztZQUNOLEtBQUssTUFBTSxHQUFHLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNyQyxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN4QyxjQUFjLENBQUMsS0FBSyxDQUFDLE9BQXNCLENBQUMsQ0FBQztnQkFDN0MsU0FBUztZQUNYLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVzY2FwZUh0bWwsIEZpZWxkUHJvcGVydGllcywgSFRNTDVDaGVja1R5cGVzLCBIVE1MNUlucHV0VHlwZXMsIHBhcnNlVG9OdW1iZXIgfSBmcm9tICdAZGVjYWYtdHMvdWktZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBGaWVsZFVwZGF0ZU1vZGUsIEZvcm1QYXJlbnRHcm91cCwgS2V5VmFsdWUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IElDb21wb25lbnRDb25maWcsIElDb21wb25lbnRJbnB1dCB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBpc1ZhbGlkRGF0ZSwgTW9kZWxLZXlzLCBwYXJzZURhdGUsIFByaW1pdGl2ZXMsIFZhbGlkYXRpb24gfSBmcm9tICdAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb24nO1xuaW1wb3J0IHsgVmFsaWRhdG9yRmFjdG9yeSB9IGZyb20gJy4vVmFsaWRhdG9yRmFjdG9yeSc7XG5pbXBvcnQgeyBjbGVhblNwYWNlcyB9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IHsgT3BlcmF0aW9uS2V5cyB9IGZyb20gJ0BkZWNhZi10cy9kYi1kZWNvcmF0b3JzJztcbmltcG9ydCB7IEFuZ3VsYXJFbmdpbmVLZXlzLCBCYXNlQ29tcG9uZW50UHJvcHMgfSBmcm9tICcuLi9lbmdpbmUvY29uc3RhbnRzJztcblxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTZXJ2aWNlIGZvciBtYW5hZ2luZyBBbmd1bGFyIGZvcm1zIGFuZCBmb3JtIGNvbnRyb2xzLlxuICogQHN1bW1hcnkgVGhlIE5neEZvcm1TZXJ2aWNlIHByb3ZpZGVzIHV0aWxpdHkgbWV0aG9kcyBmb3IgY3JlYXRpbmcsIG1hbmFnaW5nLCBhbmQgdmFsaWRhdGluZyBBbmd1bGFyIGZvcm1zIGFuZCBmb3JtIGNvbnRyb2xzLiBJdCBpbmNsdWRlcyBmdW5jdGlvbmFsaXR5IGZvciByZWdpc3RlcmluZyBmb3JtcywgYWRkaW5nIGNvbnRyb2xzLCB2YWxpZGF0aW5nIGZpZWxkcywgYW5kIGhhbmRsaW5nIGZvcm0gZGF0YS5cbiAqXG4gKiBAY2xhc3NcbiAqIEBwYXJhbSB7V2Vha01hcDxBYnN0cmFjdENvbnRyb2wsIEZpZWxkUHJvcGVydGllcz59IGNvbnRyb2xzIC0gQSBXZWFrTWFwIHRvIHN0b3JlIGNvbnRyb2wgcHJvcGVydGllcy5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgRm9ybUdyb3VwPn0gZm9ybVJlZ2lzdHJ5IC0gQSBNYXAgdG8gc3RvcmUgcmVnaXN0ZXJlZCBmb3Jtcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRpbmcgYSBmb3JtIGZyb20gY29tcG9uZW50c1xuICogY29uc3QgY29tcG9uZW50cyA9IFtcbiAqICAgeyBpbnB1dHM6IHsgbmFtZTogJ3VzZXJuYW1lJywgdHlwZTogJ3RleHQnLCByZXF1aXJlZDogdHJ1ZSB9IH0sXG4gKiAgIHsgaW5wdXRzOiB7IG5hbWU6ICdwYXNzd29yZCcsIHR5cGU6ICdwYXNzd29yZCcsIG1pbkxlbmd0aDogOCB9IH1cbiAqIF07XG4gKiBjb25zdCBmb3JtID0gTmd4Rm9ybVNlcnZpY2UuY3JlYXRlRm9ybUZyb21Db21wb25lbnRzKCdsb2dpbkZvcm0nLCBjb21wb25lbnRzLCB0cnVlKTtcbiAqXG4gKiAvLyBWYWxpZGF0aW5nIGZpZWxkc1xuICogTmd4Rm9ybVNlcnZpY2UudmFsaWRhdGVGaWVsZHMoZm9ybSk7XG4gKlxuICogLy8gR2V0dGluZyBmb3JtIGRhdGFcbiAqIGNvbnN0IGZvcm1EYXRhID0gTmd4Rm9ybVNlcnZpY2UuZ2V0Rm9ybURhdGEoZm9ybSk7XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENvbXBvbmVudFxuICogICBwYXJ0aWNpcGFudCBORlMgYXMgTmd4Rm9ybVNlcnZpY2VcbiAqICAgcGFydGljaXBhbnQgQUYgYXMgQW5ndWxhciBGb3Jtc1xuICogICBDLT4+TkZTOiBjcmVhdGVGb3JtRnJvbUNvbXBvbmVudHMoKVxuICogICBORlMtPj5BRjogbmV3IEZvcm1Hcm91cCgpXG4gKiAgIE5GUy0+Pk5GUzogYWRkRm9ybUNvbnRyb2woKVxuICogICBORlMtPj5BRjogYWRkQ29udHJvbCgpXG4gKiAgIE5GUy0tPj5DOiBSZXR1cm4gRm9ybUdyb3VwXG4gKiAgIEMtPj5ORlM6IHZhbGlkYXRlRmllbGRzKClcbiAqICAgTkZTLT4+QUY6IG1hcmtBc1RvdWNoZWQoKSwgbWFya0FzRGlydHkoKSwgdXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpXG4gKiAgIEMtPj5ORlM6IGdldEZvcm1EYXRhKClcbiAqICAgTkZTLT4+QUY6IEdldCBjb250cm9sIHZhbHVlc1xuICogICBORlMtLT4+QzogUmV0dXJuIGZvcm0gZGF0YVxuICovXG5leHBvcnQgY2xhc3MgTmd4Rm9ybVNlcnZpY2Uge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFdlYWtNYXAgdGhhdCBzdG9yZXMgY29udHJvbCBwcm9wZXJ0aWVzIGZvciBmb3JtIGNvbnRyb2xzLlxuICAgKiBAc3VtbWFyeSBBIFdlYWtNYXAgdGhhdCBhc3NvY2lhdGVzIEFic3RyYWN0Q29udHJvbCBpbnN0YW5jZXMgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIEZpZWxkUHJvcGVydGllcy5cbiAgICogVGhpcyBhbGxvd3MgdGhlIHNlcnZpY2UgdG8gdHJhY2sgbWV0YWRhdGEgZm9yIGZvcm0gY29udHJvbHMgd2l0aG91dCBjcmVhdGluZyBtZW1vcnkgbGVha3MuXG4gICAqXG4gICAqIEB0eXBlIHtXZWFrTWFwPEFic3RyYWN0Q29udHJvbCwgRmllbGRQcm9wZXJ0aWVzPn1cbiAgICogQHByaXZhdGVcbiAgICogQHN0YXRpY1xuICAgKiBAbWVtYmVyT2YgTmd4Rm9ybVNlcnZpY2VcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGNvbnRyb2xzID0gbmV3IFdlYWtNYXA8QWJzdHJhY3RDb250cm9sLCBGaWVsZFByb3BlcnRpZXM+KCk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RyeSBvZiBmb3JtIGdyb3VwcyBpbmRleGVkIGJ5IHRoZWlyIHVuaXF1ZSBpZGVudGlmaWVycy5cbiAgICogQHN1bW1hcnkgQSBNYXAgdGhhdCBzdG9yZXMgRm9ybUdyb3VwIGluc3RhbmNlcyB3aXRoIHRoZWlyIHVuaXF1ZSBzdHJpbmcgaWRlbnRpZmllcnMuXG4gICAqIFRoaXMgYWxsb3dzIGdsb2JhbCBhY2Nlc3MgdG8gcmVnaXN0ZXJlZCBmb3JtcyB0aHJvdWdob3V0IHRoZSBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHR5cGUge01hcDxzdHJpbmcsIEZvcm1Hcm91cD59XG4gICAqIEBwcml2YXRlXG4gICAqIEBzdGF0aWNcbiAgICogQG1lbWJlck9mIE5neEZvcm1TZXJ2aWNlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBmb3JtUmVnaXN0cnkgPSBuZXcgTWFwPHN0cmluZywgRm9ybUdyb3VwPigpO1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFkZHMgYSBmb3JtIHRvIHRoZSByZWdpc3RyeS5cbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIGEgRm9ybUdyb3VwIHdpdGggYSB1bmlxdWUgaWRlbnRpZmllci4gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBpZGVudGlmaWVyIGlzIGFscmVhZHkgaW4gdXNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm9ybUlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZm9ybS5cbiAgICogQHBhcmFtIHtGb3JtR3JvdXB9IGZvcm1Hcm91cCAtIFRoZSBGb3JtR3JvdXAgdG8gYmUgcmVnaXN0ZXJlZC5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIGEgRm9ybUdyb3VwIHdpdGggdGhlIGdpdmVuIGlkIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC5cbiAgICovXG4gIHN0YXRpYyBhZGRSZWdpc3RyeShmb3JtSWQ6IHN0cmluZywgZm9ybUdyb3VwOiBGb3JtR3JvdXApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mb3JtUmVnaXN0cnkuaGFzKGZvcm1JZCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEEgRm9ybUdyb3VwIHdpdGggaWQgJyR7Zm9ybUlkfScgaXMgYWxyZWFkeSByZWdpc3RlcmVkLmApO1xuICAgIHRoaXMuZm9ybVJlZ2lzdHJ5LnNldChmb3JtSWQsIGZvcm1Hcm91cCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlbW92ZXMgYSBmb3JtIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgKiBAc3VtbWFyeSBEZWxldGVzIGEgRm9ybUdyb3VwIGZyb20gdGhlIHJlZ2lzdHJ5IHVzaW5nIGl0cyB1bmlxdWUgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZvcm1JZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZm9ybSB0byBiZSByZW1vdmVkLlxuICAgKi9cbiAgc3RhdGljIHJlbW92ZVJlZ2lzdHJ5KGZvcm1JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtUmVnaXN0cnkuZGVsZXRlKGZvcm1JZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlc29sdmVzIHRoZSBwYXJlbnQgZ3JvdXAgYW5kIGNvbnRyb2wgbmFtZSBmcm9tIGEgcGF0aC5cbiAgICogQHN1bW1hcnkgVHJhdmVyc2VzIHRoZSBmb3JtIGdyb3VwIHN0cnVjdHVyZSB0byBmaW5kIHRoZSBwYXJlbnQgZ3JvdXAgYW5kIGNvbnRyb2wgbmFtZSBmb3IgYSBnaXZlbiBwYXRoLlxuICAgKiBAcGFyYW0ge0Zvcm1Hcm91cH0gZm9ybUdyb3VwIC0gVGhlIHJvb3QgRm9ybUdyb3VwLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBjb250cm9sLlxuICAgKiBAcmV0dXJuIHtGb3JtUGFyZW50R3JvdXB9IEEgdHVwbGUgY29udGFpbmluZyB0aGUgcGFyZW50IEZvcm1Hcm91cCBhbmQgdGhlIGNvbnRyb2wgbmFtZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlc29sdmVQYXJlbnRHcm91cChmb3JtR3JvdXA6IEZvcm1Hcm91cCwgcGF0aDogc3RyaW5nLCBjb21wb25lbnRQcm9wczogSUNvbXBvbmVudElucHV0LCBwYXJlbnRQcm9wczogS2V5VmFsdWUpOiBGb3JtUGFyZW50R3JvdXAge1xuICAgIGNvbnN0IGlzTXVsdGlwbGUgPSBwYXJlbnRQcm9wcz8uWydtdWx0aXBsZSddIHx8IHBhcmVudFByb3BzPy5bJ3R5cGUnXSA9PT0gJ0FycmF5JyB8fCBmYWxzZTtcbiAgICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgICBjb25zdCBjb250cm9sTmFtZSA9IHBhcnRzLnBvcCgpIGFzIHN0cmluZztcbiAgICBjb25zdCB7Y2hpbGRPZn0gPSBjb21wb25lbnRQcm9wc1xuICAgIGxldCBjdXJyZW50R3JvdXAgPSBmb3JtR3JvdXA7XG5cbiAgICBmdW5jdGlvbiBzZXRBcnJheUNvbXBvbmVudFByb3BzKGZvcm1Hcm91cEFycmF5OiBGb3JtQXJyYXkpIHtcbiAgICAgIGNvbnN0IHByb3BzID0gKGZvcm1Hcm91cEFycmF5IGFzIEtleVZhbHVlKVtBbmd1bGFyRW5naW5lS2V5cy5GT1JNX0dST1VQX0NPTVBPTkVOVF9QUk9QU10gfHwge307XG4gICAgICAgIGlmKCFwcm9wc1tNb2RlbEtleXMuTU9ERUxdW2NvbnRyb2xOYW1lXSlcbiAgICAgICAgICBwcm9wc1tNb2RlbEtleXMuTU9ERUxdID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvcHNbTW9kZWxLZXlzLk1PREVMXSwge1tjb250cm9sTmFtZV06IHsuLi5jb21wb25lbnRQcm9wc319KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgIGlmICghY3VycmVudEdyb3VwLmdldChwYXJ0KSkge1xuICAgICAgICBjb25zdCBwYXJ0Rm9ybUdyb3VwID0gKGlzTXVsdGlwbGUgJiYgcGFydCA9PT0gY2hpbGRPZikgPyBuZXcgRm9ybUFycmF5KFtuZXcgRm9ybUdyb3VwKHt9KV0pIDogbmV3IEZvcm1Hcm91cCh7fSk7XG4gICAgICAgIChwYXJ0Rm9ybUdyb3VwIGFzIEtleVZhbHVlKVtBbmd1bGFyRW5naW5lS2V5cy5GT1JNX0dST1VQX0NPTVBPTkVOVF9QUk9QU10gPSB7XG4gICAgICAgICAgY2hpbGRPZjogY2hpbGRPZiB8fCAnJyxcbiAgICAgICAgICBpc011bHRpcGxlOiBpc011bHRpcGxlLFxuICAgICAgICAgIG5hbWU6IHBhcnQsXG4gICAgICAgICAgcGs6IGNvbXBvbmVudFByb3BzPy5bJ3BrJ10gfHwgcGFyZW50UHJvcHM/LlsncGsnXSB8fCAnJyxcbiAgICAgICAgICBbTW9kZWxLZXlzLk1PREVMXToge30sXG4gICAgICAgIH0gYXMgUGFydGlhbDxGaWVsZFByb3BlcnRpZXM+ICYge21vZGVsOiBLZXlWYWx1ZX07XG5cbiAgICAgICAgaWYoY3VycmVudEdyb3VwIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgICAgKGN1cnJlbnRHcm91cCBhcyBGb3JtQXJyYXkpLnB1c2gocGFydEZvcm1Hcm91cCk7XG4gICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICBmb3IoY29uc3QgY29udHJvbCBvZiBPYmplY3QudmFsdWVzKHBhcnRGb3JtR3JvdXAuY29udHJvbHMpKSB7XG4gICAgICAgICAgICBpZihjb250cm9sIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wpXG4gICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXIoY29udHJvbCBhcyBBYnN0cmFjdENvbnRyb2wsIGNvbXBvbmVudFByb3BzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZihwYXJ0Rm9ybUdyb3VwIGluc3RhbmNlb2YgQWJzdHJhY3RDb250cm9sKVxuICAgICAgICAgICAgdGhpcy5yZWdpc3RlcihwYXJ0Rm9ybUdyb3VwIGFzIEFic3RyYWN0Q29udHJvbCwgY29tcG9uZW50UHJvcHMpO1xuXG4gICAgICAgICAgY3VycmVudEdyb3VwLmFkZENvbnRyb2wocGFydCwgcGFydEZvcm1Hcm91cCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmKGNoaWxkT2YgJiYgY3VycmVudEdyb3VwIGluc3RhbmNlb2YgRm9ybUFycmF5KVxuICAgICAgICBzZXRBcnJheUNvbXBvbmVudFByb3BzKGN1cnJlbnRHcm91cCk7XG5cbiAgICAgIGN1cnJlbnRHcm91cCA9IGN1cnJlbnRHcm91cC5nZXQocGFydCkgYXMgRm9ybUdyb3VwO1xuICAgIH1cbiAgICByZXR1cm4gW2N1cnJlbnRHcm91cCwgY29udHJvbE5hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgY29tcG9uZW50IHByb3BlcnRpZXMgZnJvbSBhIEZvcm1Hcm91cCBvciBGb3JtQXJyYXkuXG4gICAqIEBzdW1tYXJ5IEV4dHJhY3RzIGNvbXBvbmVudCBwcm9wZXJ0aWVzIHN0b3JlZCBpbiB0aGUgZm9ybSBncm91cCBtZXRhZGF0YS4gSWYgYSBGb3JtR3JvdXAgaXMgcHJvdmlkZWRcbiAgICogYW5kIGdyb3VwQXJyYXlOYW1lIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBsb29rIGZvciB0aGUgRm9ybUFycmF5IHdpdGhpbiB0aGUgZm9ybSBzdHJ1Y3R1cmUuXG4gICAqXG4gICAqIEBwYXJhbSB7Rm9ybUdyb3VwIHwgRm9ybUFycmF5fSBmb3JtR3JvdXAgLSBUaGUgZm9ybSBncm91cCBvciBmb3JtIGFycmF5IHRvIGV4dHJhY3QgcHJvcGVydGllcyBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSAtIE9wdGlvbmFsIGtleSB0byByZXRyaWV2ZSBhIHNwZWNpZmljIHByb3BlcnR5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZ3JvdXBBcnJheU5hbWVdIC0gT3B0aW9uYWwgbmFtZSBvZiB0aGUgZ3JvdXAgYXJyYXkgaWYgZm9ybUdyb3VwIGlzIG5vdCBhIEZvcm1BcnJheVxuICAgKiBAcmV0dXJuIHtQYXJ0aWFsPEZpZWxkUHJvcGVydGllcz59IFRoZSBjb21wb25lbnQgcHJvcGVydGllcyBvciBhIHNwZWNpZmljIHByb3BlcnR5IGlmIGtleSBpcyBwcm92aWRlZFxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEBtZW1iZXJPZiBOZ3hGb3JtU2VydmljZVxuICAgKi9cbiAgc3RhdGljIGdldENvbXBvbmVudFByb3BzRnJvbUdyb3VwQXJyYXkoZm9ybUdyb3VwOiBGb3JtR3JvdXAgfCBGb3JtQXJyYXksIGtleT86IHN0cmluZywgZ3JvdXBBcnJheU5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQYXJ0aWFsPEZpZWxkUHJvcGVydGllcz4ge1xuICAgIGlmKCEoZm9ybUdyb3VwIGluc3RhbmNlb2YgRm9ybUFycmF5KSAmJiB0eXBlb2YgZ3JvdXBBcnJheU5hbWUgPT09IFByaW1pdGl2ZXMuU1RSSU5HKVxuICAgICAgZm9ybUdyb3VwID0gZm9ybUdyb3VwLnJvb3QuZ2V0KGdyb3VwQXJyYXlOYW1lIGFzIHN0cmluZykgYXMgRm9ybUFycmF5IHx8IHt9O1xuICAgIGNvbnN0IHByb3BzID0gKGZvcm1Hcm91cCBhcyBLZXlWYWx1ZSk/LltBbmd1bGFyRW5naW5lS2V5cy5GT1JNX0dST1VQX0NPTVBPTkVOVF9QUk9QU10gfHwge307XG4gICAgcmV0dXJuICgha2V5ID8gcHJvcHMgOiBwcm9wcz8uW2tleV0pIHx8IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBZGRzIGEgbmV3IGdyb3VwIHRvIGEgcGFyZW50IEZvcm1BcnJheS5cbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhbmQgYWRkcyBhIG5ldyBGb3JtR3JvdXAgdG8gdGhlIHNwZWNpZmllZCBwYXJlbnQgRm9ybUFycmF5IGJhc2VkIG9uIHRoZVxuICAgKiBjb21wb25lbnQgcHJvcGVydGllcyBzdG9yZWQgaW4gdGhlIHBhcmVudCdzIG1ldGFkYXRhLiBUaGlzIGlzIHVzZWQgZm9yIGR5bmFtaWMgZm9ybSBhcnJheXNcbiAgICogd2hlcmUgbmV3IGdyb3VwcyBuZWVkIHRvIGJlIGFkZGVkIGF0IHJ1bnRpbWUuXG4gICAqXG4gICAqIEBwYXJhbSB7Rm9ybUdyb3VwfSBmb3JtR3JvdXAgLSBUaGUgcm9vdCBmb3JtIGdyb3VwIGNvbnRhaW5pbmcgdGhlIHBhcmVudCBGb3JtQXJyYXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcGFyZW50IEZvcm1BcnJheSB0byBhZGQgdGhlIGdyb3VwIHRvXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbaW5kZXg9MV0gLSBUaGUgaW5kZXggcG9zaXRpb24gd2hlcmUgdGhlIG5ldyBncm91cCBzaG91bGQgYmUgYWRkZWRcbiAgICogQHJldHVybiB7Rm9ybUdyb3VwfSBUaGUgbmV3bHkgY3JlYXRlZCBhbmQgYWRkZWQgRm9ybUdyb3VwXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQG1lbWJlck9mIE5neEZvcm1TZXJ2aWNlXG4gICAqL1xuICBzdGF0aWMgYWRkR3JvdXBUb1BhcmVudChmb3JtR3JvdXA6IEZvcm1Hcm91cCwgcGFyZW50TmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyID0gMSk6IEZvcm1Hcm91cCB7XG4gICAgY29uc3QgY29tcG9uZW50UHJvcHMgPSB0aGlzLmdldENvbXBvbmVudFByb3BzRnJvbUdyb3VwQXJyYXkoZm9ybUdyb3VwLCBNb2RlbEtleXMuTU9ERUwsIHBhcmVudE5hbWUpO1xuICAgIE9iamVjdC5lbnRyaWVzKGNvbXBvbmVudFByb3BzIGFzIEtleVZhbHVlKS5mb3JFYWNoKChbLCB2YWx1ZV0pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmFkZEZvcm1Db250cm9sKGZvcm1Hcm91cCwgdmFsdWUsIHttdWx0aXBsZTogdHJ1ZX0sIGluZGV4KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmdldEdyb3VwRnJvbVBhcmVudChmb3JtR3JvdXAsIHBhcmVudE5hbWUsIGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgRm9ybUdyb3VwIGZyb20gYSBwYXJlbnQgRm9ybUFycmF5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguXG4gICAqIEBzdW1tYXJ5IEdldHMgYSBGb3JtR3JvdXAgZnJvbSB0aGUgc3BlY2lmaWVkIHBhcmVudCBGb3JtQXJyYXkuIElmIHRoZSBncm91cCBkb2Vzbid0IGV4aXN0XG4gICAqIGF0IHRoZSBnaXZlbiBpbmRleCwgaXQgd2lsbCBjcmVhdGUgYSBuZXcgb25lIHVzaW5nIGFkZEdyb3VwVG9QYXJlbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7Rm9ybUdyb3VwfSBmb3JtR3JvdXAgLSBUaGUgcm9vdCBmb3JtIGdyb3VwIGNvbnRhaW5pbmcgdGhlIHBhcmVudCBGb3JtQXJyYXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcGFyZW50IEZvcm1BcnJheSB0byByZXRyaWV2ZSB0aGUgZ3JvdXAgZnJvbVxuICAgKiBAcGFyYW0ge251bWJlcn0gW2luZGV4PTFdIC0gVGhlIGluZGV4IG9mIHRoZSBncm91cCB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJuIHtGb3JtR3JvdXB9IFRoZSBGb3JtR3JvdXAgYXQgdGhlIHNwZWNpZmllZCBpbmRleFxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEBtZW1iZXJPZiBOZ3hGb3JtU2VydmljZVxuICAgKi9cbiAgc3RhdGljIGdldEdyb3VwRnJvbVBhcmVudChmb3JtR3JvdXA6IEZvcm1Hcm91cCwgcGFyZW50TmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyID0gMSk6IEZvcm1Hcm91cCB7XG4gICAgY29uc3QgY2hpbGRHcm91cCA9ICgoZm9ybUdyb3VwLmdldChwYXJlbnROYW1lKSB8fCBmb3JtR3JvdXApIGFzIEZvcm1BcnJheSkuYXQoaW5kZXgpO1xuICAgIGlmKGNoaWxkR3JvdXAgaW5zdGFuY2VvZiBGb3JtR3JvdXApXG4gICAgICByZXR1cm4gY2hpbGRHcm91cDtcbiAgICByZXR1cm4gdGhpcy5hZGRHcm91cFRvUGFyZW50KGZvcm1Hcm91cCwgcGFyZW50TmFtZSwgaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSB2YWx1ZSBpcyB1bmlxdWUgd2l0aGluIGEgRm9ybUFycmF5IGdyb3VwLlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgdGhhdCB0aGUgcHJpbWFyeSBrZXkgdmFsdWUgaW4gYSBGb3JtR3JvdXAgaXMgdW5pcXVlIGFtb25nIGFsbCBncm91cHNcbiAgICogaW4gdGhlIHBhcmVudCBGb3JtQXJyYXkuIFRoZSB1bmlxdWVuZXNzIGNoZWNrIGJlaGF2aW9yIGRpZmZlcnMgYmFzZWQgb24gdGhlIG9wZXJhdGlvbiB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0ge0Zvcm1Hcm91cH0gZm9ybUdyb3VwIC0gVGhlIEZvcm1Hcm91cCB0byBjaGVjayBmb3IgdW5pcXVlbmVzc1xuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgZ3JvdXAgd2l0aGluIHRoZSBGb3JtQXJyYXlcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfSBbb3BlcmF0aW9uPU9wZXJhdGlvbktleXMuQ1JFQVRFXSAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWRcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgdW5pcXVlLCBmYWxzZSBvdGhlcndpc2VcbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAbWVtYmVyT2YgTmd4Rm9ybVNlcnZpY2VcbiAgICovXG4gIHN0YXRpYyBpc1VuaXF1ZU9uR3JvdXAoZm9ybUdyb3VwOiBGb3JtR3JvdXAsIGluZGV4OiBudW1iZXIsIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyA9IE9wZXJhdGlvbktleXMuQ1JFQVRFKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZm9ybUdyb3VwQXJyYXkgPSBmb3JtR3JvdXAucGFyZW50IGFzIEZvcm1BcnJheTtcbiAgICBjb25zdCBwayA9IHRoaXMuZ2V0Q29tcG9uZW50UHJvcHNGcm9tR3JvdXBBcnJheShmb3JtR3JvdXBBcnJheSwgQmFzZUNvbXBvbmVudFByb3BzLlBLIGFzIHN0cmluZykgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGNvbnRyb2xOYW1lID0gT2JqZWN0LmtleXMoZm9ybUdyb3VwLmNvbnRyb2xzKVswXTtcblxuICAgIC8vIG9ubHkgY2hlY2sgZm9yIHVuaXF1ZSBpZiBpcyB0aGUgcGsgY29udHJvbFxuICAgIGlmKGNvbnRyb2xOYW1lICE9PSBwaylcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IGNsZWFuU3BhY2VzKGAke2Zvcm1Hcm91cC5nZXQocGspPy52YWx1ZX1gLCB0cnVlKTtcbiAgICBpZihvcGVyYXRpb24gPT09IE9wZXJhdGlvbktleXMuQ1JFQVRFKVxuICAgICAgcmV0dXJuICFmb3JtR3JvdXBBcnJheS5jb250cm9scy5zb21lKChncm91cCwgaSkgPT4gaSAhPT0gaW5kZXggJiYgY2xlYW5TcGFjZXMoYCR7Z3JvdXAuZ2V0KHBrKT8udmFsdWV9YCwgdHJ1ZSkgPT09IGNvbnRyb2xWYWx1ZSk7XG5cbiAgICByZXR1cm4gIWZvcm1Hcm91cEFycmF5LmNvbnRyb2xzLnNvbWUoKGdyb3VwLCBpKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNsZWFuU3BhY2VzKGAke2dyb3VwLmdldChwayk/LnZhbHVlfWAsIHRydWUpO1xuICAgICAgcmV0dXJuIGkgIT09IGluZGV4ICYmIGNvbnRyb2xWYWx1ZSA9PT0gdmFsdWU7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVuYWJsZXMgYWxsIGNvbnRyb2xzIHdpdGhpbiBhIEZvcm1Hcm91cCBvciBGb3JtQXJyYXkuXG4gICAqIEBzdW1tYXJ5IFJlY3Vyc2l2ZWx5IGVuYWJsZXMgYWxsIGZvcm0gY29udHJvbHMgd2l0aGluIHRoZSBwcm92aWRlZCBGb3JtR3JvdXAgb3IgRm9ybUFycmF5LlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgbWFraW5nIGFsbCBjb250cm9scyBpbnRlcmFjdGl2ZSBhZnRlciB0aGV5IGhhdmUgYmVlbiBkaXNhYmxlZC5cbiAgICpcbiAgICogQHBhcmFtIHtGb3JtQXJyYXkgfCBGb3JtR3JvdXB9IGZvcm1Hcm91cCAtIFRoZSBGb3JtR3JvdXAgb3IgRm9ybUFycmF5IHRvIGVuYWJsZSBhbGwgY29udHJvbHMgZm9yXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQG1lbWJlck9mIE5neEZvcm1TZXJ2aWNlXG4gICAqL1xuICBzdGF0aWMgZW5hYmxlQWxsR3JvdXBDb250cm9scyhmb3JtR3JvdXA6IEZvcm1BcnJheSB8IEZvcm1Hcm91cCk6IHZvaWQge1xuICAgIE9iamVjdC5rZXlzKGZvcm1Hcm91cC5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgY29uc3QgY29udHJvbCA9IGZvcm1Hcm91cC5nZXQoa2V5KTtcbiAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgIGNvbnRyb2wuY29udHJvbHMuZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgICAgICAgICBjaGlsZC5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgY2hpbGQudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogdHJ1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBZGRzIGEgZm9ybSBjb250cm9sIHRvIGEgZm9ybSBncm91cCBiYXNlZCBvbiBjb21wb25lbnQgcHJvcGVydGllcy5cbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhbmQgY29uZmlndXJlcyBhIEZvcm1Db250cm9sIHdpdGhpbiB0aGUgc3BlY2lmaWVkIEZvcm1Hcm91cCB1c2luZyB0aGUgcHJvdmlkZWRcbiAgICogY29tcG9uZW50IHByb3BlcnRpZXMuIEhhbmRsZXMgbmVzdGVkIHBhdGhzLCBtdWx0aXBsZSBjb250cm9scyAoRm9ybUFycmF5cyksIGFuZCBjb250cm9sIHJlZ2lzdHJhdGlvbi5cbiAgICogVGhpcyBtZXRob2Qgc3VwcG9ydHMgY29tcGxleCBmb3JtIHN0cnVjdHVyZXMgd2l0aCBuZXN0ZWQgZ3JvdXBzIGFuZCBhcnJheXMuXG4gICAqXG4gICAqIEBwYXJhbSB7Rm9ybUdyb3VwfSBmb3JtR3JvdXAgLSBUaGUgZm9ybSBncm91cCB0byBhZGQgdGhlIGNvbnRyb2wgdG9cbiAgICogQHBhcmFtIHtJQ29tcG9uZW50SW5wdXR9IGNvbXBvbmVudFByb3BzIC0gVGhlIGNvbXBvbmVudCBwcm9wZXJ0aWVzIGRlZmluaW5nIHRoZSBjb250cm9sIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIHtLZXlWYWx1ZX0gW3BhcmVudFByb3BzPXt9XSAtIFByb3BlcnRpZXMgZnJvbSB0aGUgcGFyZW50IGNvbXBvbmVudCBmb3IgY29udGV4dFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2luZGV4PTBdIC0gVGhlIGluZGV4IGZvciBtdWx0aXBsZSBjb250cm9scyBpbiBGb3JtQXJyYXlzXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBzdGF0aWNcbiAgICogQG1lbWJlck9mIE5neEZvcm1TZXJ2aWNlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBhZGRGb3JtQ29udHJvbChmb3JtR3JvdXA6IEZvcm1Hcm91cCwgY29tcG9uZW50UHJvcHM6IElDb21wb25lbnRJbnB1dCwgcGFyZW50UHJvcHM6IEtleVZhbHVlID0ge30sIGluZGV4OiBudW1iZXIgPSAwKTogdm9pZCB7XG5cbiAgICBjb25zdCBpc011bHRpcGxlID0gcGFyZW50UHJvcHM/LlsnbXVsdGlwbGUnXSB8fCBwYXJlbnRQcm9wcz8uWyd0eXBlJ10gPT09ICdBcnJheScgfHwgZmFsc2U7XG4gICAgY29uc3QgeyBuYW1lLCBjaGlsZE9mLCB9ID0gY29tcG9uZW50UHJvcHM7XG4gICAgaWYoaXNNdWx0aXBsZSlcbiAgICAgIGNvbXBvbmVudFByb3BzWydwayddID0gY29tcG9uZW50UHJvcHNbJ3BrJ10gfHwgcGFyZW50UHJvcHM/LlsncGsnXSB8fCAnJztcbiAgICBjb25zdCBmdWxsUGF0aCA9IGNoaWxkT2YgPyBpc011bHRpcGxlID8gYCR7Y2hpbGRPZn0uJHtpbmRleH0uJHtuYW1lfWAgOiBgJHtjaGlsZE9mfS4ke25hbWV9YCA6IG5hbWU7XG4gICAgY29uc3QgW3BhcmVudEdyb3VwLCBjb250cm9sTmFtZV0gPSB0aGlzLnJlc29sdmVQYXJlbnRHcm91cChmb3JtR3JvdXAsIGZ1bGxQYXRoLCBjb21wb25lbnRQcm9wcywgcGFyZW50UHJvcHMpO1xuXG4gICAgaWYgKCFwYXJlbnRHcm91cC5nZXQoY29udHJvbE5hbWUpKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gTmd4Rm9ybVNlcnZpY2UuZnJvbVByb3BzKFxuICAgICAgICBjb21wb25lbnRQcm9wcyxcbiAgICAgICAgY29tcG9uZW50UHJvcHMudXBkYXRlTW9kZSB8fCAnY2hhbmdlJyxcbiAgICAgICk7XG4gICAgICBOZ3hGb3JtU2VydmljZS5yZWdpc3Rlcihjb250cm9sLCBjb21wb25lbnRQcm9wcyk7XG4gICAgICBwYXJlbnRHcm91cC5hZGRDb250cm9sKGNvbnRyb2xOYW1lLCBjb250cm9sKTtcbiAgICB9XG5cbiAgICBjb21wb25lbnRQcm9wc1snZm9ybUdyb3VwJ10gPSBwYXJlbnRHcm91cDtcbiAgICBjb21wb25lbnRQcm9wc1snZm9ybUNvbnRyb2wnXSA9IHBhcmVudEdyb3VwLmdldChjb250cm9sTmFtZSkgYXMgRm9ybUNvbnRyb2w7XG4gICAgY29tcG9uZW50UHJvcHNbJ211bHRpcGxlJ10gPSBpc011bHRpcGxlXG5cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgY29udHJvbCBmcm9tIGEgcmVnaXN0ZXJlZCBmb3JtLlxuICAgKiBAc3VtbWFyeSBGaW5kcyBhbmQgcmV0dXJucyBhbiBBYnN0cmFjdENvbnRyb2wgZnJvbSBhIHJlZ2lzdGVyZWQgZm9ybSB1c2luZyB0aGUgZm9ybSBpZCBhbmQgb3B0aW9uYWwgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZvcm1JZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZm9ybS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXSAtIFRoZSBwYXRoIHRvIHRoZSBjb250cm9sIHdpdGhpbiB0aGUgZm9ybS5cbiAgICogQHJldHVybiB7QWJzdHJhY3RDb250cm9sfSBUaGUgcmVxdWVzdGVkIEFic3RyYWN0Q29udHJvbC5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBmb3JtIGlzIG5vdCBmb3VuZCBpbiB0aGUgcmVnaXN0cnkgb3IgdGhlIGNvbnRyb2wgaXMgbm90IGZvdW5kIGluIHRoZSBmb3JtLlxuICAgKi9cbiAgc3RhdGljIGdldENvbnRyb2xGcm9tRm9ybShmb3JtSWQ6IHN0cmluZywgcGF0aD86IHN0cmluZyk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZm9ybVJlZ2lzdHJ5LmdldChmb3JtSWQpO1xuICAgIGlmICghZm9ybSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRm9ybSB3aXRoIGlkICcke2Zvcm1JZH0nIG5vdCBmb3VuZCBpbiB0aGUgcmVnaXN0cnkuYCk7XG5cbiAgICBpZiAoIXBhdGgpXG4gICAgICByZXR1cm4gZm9ybTtcblxuICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtLmdldChwYXRoKTtcbiAgICBpZiAoIWNvbnRyb2wpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbnRyb2wgd2l0aCBwYXRoICcke3BhdGh9JyBub3QgZm91bmQgaW4gZm9ybSAnJHtmb3JtSWR9Jy5gKTtcbiAgICByZXR1cm4gY29udHJvbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGZvcm0gZnJvbSBjb21wb25lbnQgY29uZmlndXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhIEZvcm1Hcm91cCBiYXNlZCBvbiBhbiBhcnJheSBvZiBjb21wb25lbnQgY29uZmlndXJhdGlvbnMgYW5kIG9wdGlvbmFsbHkgcmVnaXN0ZXJzIGl0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBmb3JtLlxuICAgKiBAcGFyYW0ge0lDb21wb25lbnRDb25maWdbXX0gY29tcG9uZW50cyAtIEFuIGFycmF5IG9mIGNvbXBvbmVudCBjb25maWd1cmF0aW9ucy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbcmVnaXN0cnk9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgY3JlYXRlZCBmb3JtLlxuICAgKiBAcmV0dXJuIHtGb3JtR3JvdXB9IFRoZSBjcmVhdGVkIEZvcm1Hcm91cC5cbiAgICovXG4gIHN0YXRpYyBjcmVhdGVGb3JtRnJvbUNvbXBvbmVudHMoaWQ6IHN0cmluZywgY29tcG9uZW50czogSUNvbXBvbmVudENvbmZpZ1tdLCByZWdpc3RyeTogYm9vbGVhbiA9IGZhbHNlKTogRm9ybUdyb3VwIHtcbiAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XG4gICAgY29tcG9uZW50cy5mb3JFYWNoKGNvbXBvbmVudCA9PiB7XG4gICAgICB0aGlzLmFkZEZvcm1Db250cm9sKGZvcm0sIGNvbXBvbmVudC5pbnB1dHMpO1xuICAgIH0pO1xuXG4gICAgaWYgKHJlZ2lzdHJ5KVxuICAgICAgdGhpcy5hZGRSZWdpc3RyeShpZCwgZm9ybSk7XG5cbiAgICByZXR1cm4gZm9ybTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWRkcyBhIGNvbnRyb2wgdG8gYSBmb3JtIGJhc2VkIG9uIGNvbXBvbmVudCBwcm9wZXJ0aWVzLlxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGFuZCBhZGRzIGEgZm9ybSBjb250cm9sIHRvIGEgZm9ybSAoZXhpc3Rpbmcgb3IgbmV3KSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgY29tcG9uZW50IHByb3BlcnRpZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZm9ybS5cbiAgICogQHBhcmFtIHtGaWVsZFByb3BlcnRpZXN9IGNvbXBvbmVudFByb3BlcnRpZXMgLSBUaGUgcHJvcGVydGllcyBvZiB0aGUgY29tcG9uZW50IHRvIGNyZWF0ZSB0aGUgY29udHJvbCBmcm9tLlxuICAgKiBAcmV0dXJuIHtBYnN0cmFjdENvbnRyb2x9IFRoZSBmb3JtIG9yIGNyZWF0ZWQgY29udHJvbC5cbiAgICovXG4gIHN0YXRpYyBhZGRDb250cm9sRnJvbVByb3BzKGlkOiBzdHJpbmcsIGNvbXBvbmVudFByb3BlcnRpZXM6IEZpZWxkUHJvcGVydGllcywgcGFyZW50UHJvcHM/OiBGaWVsZFByb3BlcnRpZXMpOiBBYnN0cmFjdENvbnRyb2wge1xuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmZvcm1SZWdpc3RyeS5nZXQoaWQpID8/IG5ldyBGb3JtR3JvdXAoe30pO1xuICAgIGlmICghdGhpcy5mb3JtUmVnaXN0cnkuaGFzKGlkKSlcbiAgICAgIHRoaXMuYWRkUmVnaXN0cnkoaWQsIGZvcm0pO1xuXG4gICAgaWYgKGNvbXBvbmVudFByb3BlcnRpZXMucGF0aClcbiAgICAgIHRoaXMuYWRkRm9ybUNvbnRyb2woZm9ybSwgY29tcG9uZW50UHJvcGVydGllcywgcGFyZW50UHJvcHMpO1xuXG4gICAgcmV0dXJuIGZvcm07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBmb3JtIGRhdGEgZnJvbSBhIEZvcm1Hcm91cC5cbiAgICogQHN1bW1hcnkgRXh0cmFjdHMgYW5kIHByb2Nlc3NlcyB0aGUgZGF0YSBmcm9tIGEgRm9ybUdyb3VwLCBoYW5kbGluZyBkaWZmZXJlbnQgaW5wdXQgdHlwZXMgYW5kIG5lc3RlZCBmb3JtIGdyb3Vwcy5cbiAgICogQHBhcmFtIHtGb3JtR3JvdXB9IGZvcm1Hcm91cCAtIFRoZSBGb3JtR3JvdXAgdG8gZXh0cmFjdCBkYXRhIGZyb20uXG4gICAqIEByZXR1cm4ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgZm9ybSBkYXRhLlxuICAgKi9cbiAgc3RhdGljIGdldEZvcm1EYXRhKGZvcm1Hcm91cDogRm9ybUdyb3VwKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZm9ybUdyb3VwLmNvbnRyb2xzKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmNvbnRyb2xzW2tleV07XG4gICAgICBjb25zdCBwYXJlbnRQcm9wcyA9IE5neEZvcm1TZXJ2aWNlLmdldFByb3BzRnJvbUNvbnRyb2woZm9ybUdyb3VwIGFzIEZvcm1Hcm91cCB8IEZvcm1BcnJheSk7XG4gICAgICBpZiAoIShjb250cm9sIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gTmd4Rm9ybVNlcnZpY2UuZ2V0Rm9ybURhdGEoY29udHJvbCBhcyBGb3JtR3JvdXApO1xuICAgICAgICBjb25zdCBpc1ZhbGlkID0gY29udHJvbC52YWxpZDtcbiAgICAgICAgaWYocGFyZW50UHJvcHMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGlmKGlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgIGRhdGFba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5yZXNldChjb250cm9sIGFzIEZvcm1Db250cm9sKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YVtrZXldID0gdmFsdWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcm9wcyA9IE5neEZvcm1TZXJ2aWNlLmdldFByb3BzRnJvbUNvbnRyb2woY29udHJvbCBhcyBGb3JtQ29udHJvbCB8IEZvcm1BcnJheSk7XG4gICAgICBsZXQgdmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgICAgaWYgKCFIVE1MNUNoZWNrVHlwZXMuaW5jbHVkZXMocHJvcHNbJ3R5cGUnXSkpIHtcbiAgICAgICAgc3dpdGNoIChwcm9wc1sndHlwZSddKSB7XG4gICAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuTlVNQkVSOlxuICAgICAgICAgICAgdmFsdWUgPSBwYXJzZVRvTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLkRBVEU6XG4gICAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuREFURVRJTUVfTE9DQUw6XG4gICAgICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB2YWx1ZSA9IGVzY2FwZUh0bWwodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkYXRhW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgTmd4Rm9ybVNlcnZpY2UuZW5hYmxlQWxsR3JvdXBDb250cm9scyhmb3JtR3JvdXAgYXMgRm9ybUdyb3VwKTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVmFsaWRhdGVzIGZpZWxkcyBpbiBhIGZvcm0gY29udHJvbCBvciBmb3JtIGdyb3VwLlxuICAgKiBAc3VtbWFyeSBSZWN1cnNpdmVseSB2YWxpZGF0ZXMgYWxsIGZpZWxkcyBpbiBhIGZvcm0gY29udHJvbCBvciBmb3JtIGdyb3VwLCBtYXJraW5nIHRoZW0gYXMgdG91Y2hlZCBhbmQgZGlydHkuXG4gICAqIEBwYXJhbSB7QWJzdHJhY3RDb250cm9sfSBjb250cm9sIC0gVGhlIGNvbnRyb2wgb3IgZm9ybSBncm91cCB0byB2YWxpZGF0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXSAtIFRoZSBwYXRoIHRvIHRoZSBjb250cm9sIHdpdGhpbiB0aGUgZm9ybS5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBhbGwgZmllbGRzIGFyZSB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgbm8gY29udHJvbCBpcyBmb3VuZCBhdCB0aGUgc3BlY2lmaWVkIHBhdGggb3IgaWYgdGhlIGNvbnRyb2wgdHlwZSBpcyB1bmtub3duLlxuICAgKi9cbiAgc3RhdGljIHZhbGlkYXRlRmllbGRzKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgcGs/OiBzdHJpbmcsICBwYXRoPzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29udHJvbCA9IHBhdGggPyBjb250cm9sLmdldChwYXRoKSBhcyBBYnN0cmFjdENvbnRyb2wgOiBjb250cm9sO1xuICAgIGlmICghY29udHJvbClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29udHJvbCBmb3VuZCBhdCBwYXRoOiAke3BhdGggfHwgJ3Jvb3QnfS5gKTtcblxuICAgIGNvbnN0IGlzQWxsb3dlZCA9IFtGb3JtQXJyYXksIEZvcm1Hcm91cCwgRm9ybUNvbnRyb2xdLnNvbWUodHlwZSA9PiBjb250cm9sIGluc3RhbmNlb2YgdHlwZSk7XG4gICAgaWYgKCFpc0FsbG93ZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29udHJvbCB0eXBlIGF0OiAke3BhdGggfHwgJ3Jvb3QnfWApO1xuXG4gICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogdHJ1ZSB9KTtcblxuICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgICBPYmplY3QudmFsdWVzKGNvbnRyb2wuY29udHJvbHMpLmZvckVhY2goY2hpbGRDb250cm9sID0+IHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZUZpZWxkcyhjaGlsZENvbnRyb2wpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgIGNvbnN0IHRvdGFsR3JvdXBzID0gY29udHJvbC5sZW5ndGg7XG4gICAgICBjb25zdCBoYXNWYWxpZCA9IGNvbnRyb2wuY29udHJvbHMuc29tZShjb250cm9sID0+IGNvbnRyb2wudmFsaWQpO1xuICAgICAgaWYodG90YWxHcm91cHMgPiAxICYmIGhhc1ZhbGlkKSB7XG4gICAgICAgICBmb3IgKGxldCBpID0gY29udHJvbC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGNvbnN0IGNoaWxkQ29udHJvbCA9IGNvbnRyb2wuYXQoaSk7XG4gICAgICAgICAgLy8gZGlzYWJsZSBubyB2YWxpZCBncm91cHMgb24gYXJyYXlcbiAgICAgICAgICBpZiAoIWNoaWxkQ29udHJvbC52YWxpZCkge1xuICAgICAgICAgICAgKGNoaWxkQ29udHJvbC5wYXJlbnQgYXMgRm9ybUdyb3VwKS5zZXRFcnJvcnMobnVsbCk7XG4gICAgICAgICAgICAgKGNoaWxkQ29udHJvbC5wYXJlbnQgYXMgRm9ybUdyb3VwKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiB0cnVlIH0pO1xuICAgICAgICAgICAgY2hpbGRDb250cm9sLmRpc2FibGUoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWxpZGF0ZUZpZWxkcyhjaGlsZENvbnRyb2wpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhjb250cm9sLmNvbnRyb2xzKS5mb3JFYWNoKGNoaWxkQ29udHJvbCA9PiB7XG4gICAgICAgICAgdGhpcy52YWxpZGF0ZUZpZWxkcyhjaGlsZENvbnRyb2wpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRDb250cm9sTmFtZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgIGNvbnN0IGdyb3VwID0gY29udHJvbC5wYXJlbnQgYXMgRm9ybUdyb3VwO1xuICAgICAgaWYgKCFncm91cClcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhncm91cC5jb250cm9scykuZmluZChuYW1lID0+IGNvbnRyb2wgPT09IGdyb3VwLmdldChuYW1lKSkgfHwgbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gIWdldENvbnRyb2xOYW1lKGNvbnRyb2wpID8gdHJ1ZSA6IGNvbnRyb2wudmFsaWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyB2YWxpZGF0b3JzIGZyb20gY29tcG9uZW50IHByb3BlcnRpZXMuXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYW4gYXJyYXkgb2YgVmFsaWRhdG9yRm4gYmFzZWQgb24gdGhlIHN1cHBvcnRlZCB2YWxpZGF0aW9uIGtleXMgaW4gdGhlIGNvbXBvbmVudCBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0ge0ZpZWxkUHJvcGVydGllc30gcHJvcHMgLSBUaGUgY29tcG9uZW50IHByb3BlcnRpZXMuXG4gICAqIEByZXR1cm4ge1ZhbGlkYXRvckZuW119IEFuIGFycmF5IG9mIHZhbGlkYXRvciBmdW5jdGlvbnMuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyB2YWxpZGF0b3JzRnJvbVByb3BzKHByb3BzOiBGaWVsZFByb3BlcnRpZXMpOiBWYWxpZGF0b3JGbltdIHtcbiAgICBjb25zdCBzdXBwb3J0ZWRWYWxpZGF0aW9uS2V5cyA9IFZhbGlkYXRpb24ua2V5cygpO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhwcm9wcylcbiAgICAgIC5maWx0ZXIoKGs6IHN0cmluZykgPT4gc3VwcG9ydGVkVmFsaWRhdGlvbktleXMuaW5jbHVkZXMoaykpXG4gICAgICAubWFwKChrOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIFZhbGlkYXRvckZhY3Rvcnkuc3Bhd24ocHJvcHMsIGspO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBGb3JtQ29udHJvbCBmcm9tIGNvbXBvbmVudCBwcm9wZXJ0aWVzLlxuICAgKiBAc3VtbWFyeSBHZW5lcmF0ZXMgYSBGb3JtQ29udHJvbCB3aXRoIHZhbGlkYXRvcnMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGNvbXBvbmVudCBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0ge0ZpZWxkUHJvcGVydGllc30gcHJvcHMgLSBUaGUgY29tcG9uZW50IHByb3BlcnRpZXMuXG4gICAqIEBwYXJhbSB7RmllbGRVcGRhdGVNb2RlfSBbdXBkYXRlTW9kZT0nY2hhbmdlJ10gLSBUaGUgdXBkYXRlIG1vZGUgZm9yIHRoZSBjb250cm9sLlxuICAgKiBAcmV0dXJuIHtGb3JtQ29udHJvbH0gVGhlIGNyZWF0ZWQgRm9ybUNvbnRyb2wuXG4gICAqL1xuICBzdGF0aWMgZnJvbVByb3BzKHByb3BzOiBGaWVsZFByb3BlcnRpZXMsIHVwZGF0ZU1vZGU6IEZpZWxkVXBkYXRlTW9kZSA9ICdjaGFuZ2UnKTogRm9ybUNvbnRyb2wge1xuICAgIGNvbnN0IHZhbGlkYXRvcnMgPSB0aGlzLnZhbGlkYXRvcnNGcm9tUHJvcHMocHJvcHMpO1xuICAgIGNvbnN0IGNvbXBvc2VkID0gdmFsaWRhdG9ycy5sZW5ndGggPyBWYWxpZGF0b3JzLmNvbXBvc2UodmFsaWRhdG9ycykgOiBudWxsO1xuICAgIHJldHVybiBuZXcgRm9ybUNvbnRyb2woXG4gICAgICB7XG4gICAgICAgIHZhbHVlOlxuICAgICAgICAgIHByb3BzLnZhbHVlICYmIHByb3BzLnR5cGUgIT09IEhUTUw1SW5wdXRUeXBlcy5DSEVDS0JPWFxuICAgICAgICAgICAgPyBwcm9wcy50eXBlID09PSBIVE1MNUlucHV0VHlwZXMuREFURVxuICAgICAgICAgICAgICA/ICFpc1ZhbGlkRGF0ZShwYXJzZURhdGUocHJvcHMuZm9ybWF0IGFzIHN0cmluZywgcHJvcHMudmFsdWUgYXMgc3RyaW5nKSlcbiAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZCA6IHByb3BzLnZhbHVlIDpcbiAgICAgICAgICAgICAgKHByb3BzLnZhbHVlIGFzIHVua25vd24pIDogdW5kZWZpbmVkLFxuICAgICAgICBkaXNhYmxlZDogcHJvcHMuZGlzYWJsZWQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB2YWxpZGF0b3JzOiBjb21wb3NlZCxcbiAgICAgICAgdXBkYXRlT246IHVwZGF0ZU1vZGUsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBwcm9wZXJ0aWVzIGZyb20gYSBGb3JtQ29udHJvbC5cbiAgICogQHN1bW1hcnkgR2V0cyB0aGUgRmllbGRQcm9wZXJ0aWVzIGFzc29jaWF0ZWQgd2l0aCBhIEZvcm1Db250cm9sIGZyb20gdGhlIGludGVybmFsIFdlYWtNYXAuXG4gICAqIEBwYXJhbSB7Rm9ybUNvbnRyb2x9IGNvbnRyb2wgLSBUaGUgRm9ybUNvbnRyb2wgdG8gZ2V0IHByb3BlcnRpZXMgZm9yLlxuICAgKiBAcmV0dXJuIHtGaWVsZFByb3BlcnRpZXN9IFRoZSBwcm9wZXJ0aWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udHJvbC5cbiAgICovXG4gIHN0YXRpYyBnZXRQcm9wc0Zyb21Db250cm9sKGNvbnRyb2w6IEZvcm1Db250cm9sIHwgRm9ybUFycmF5IHwgRm9ybUdyb3VwKTogRmllbGRQcm9wZXJ0aWVzIHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9scy5nZXQoY29udHJvbCkgfHwge30gYXMgRmllbGRQcm9wZXJ0aWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaW5kcyBhIHBhcmVudCBlbGVtZW50IHdpdGggYSBzcGVjaWZpYyB0YWcuXG4gICAqIEBzdW1tYXJ5IFRyYXZlcnNlcyB1cCB0aGUgRE9NIHRyZWUgdG8gZmluZCB0aGUgbmVhcmVzdCBwYXJlbnQgZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgdGFnLlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCAtIFRoZSBzdGFydGluZyBlbGVtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnIC0gVGhlIHRhZyBuYW1lIHRvIHNlYXJjaCBmb3IuXG4gICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSBUaGUgZm91bmQgcGFyZW50IGVsZW1lbnQuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBubyBwYXJlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHRhZyBpcyBmb3VuZC5cbiAgICovXG4gIHN0YXRpYyBnZXRQYXJlbnRFbChlbDogSFRNTEVsZW1lbnQsIHRhZzogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xuICAgIGxldCBwYXJlbnQ6IEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICB3aGlsZSAoKHBhcmVudCA9IGVsLnBhcmVudEVsZW1lbnQpICE9PSBudWxsKSB7XG4gICAgICBpZiAocGFyZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gdGFnLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICAgIH1cbiAgICAgIGVsID0gcGFyZW50O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTm8gcGFyZW50IHdpdGggdGhlIHRhZyAke3RhZ30gd2FzIGZvdW5kIGZvciBwcm92aWRlZCBlbGVtZW50YCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYSBjb250cm9sIHdpdGggaXRzIHByb3BlcnRpZXMuXG4gICAqIEBzdW1tYXJ5IEFzc29jaWF0ZXMgYSBjb250cm9sIHdpdGggaXRzIHByb3BlcnRpZXMgaW4gdGhlIGludGVybmFsIFdlYWtNYXAuXG4gICAqIEBwYXJhbSB7QWJzdHJhY3RDb250cm9sfSBjb250cm9sIC0gVGhlIGNvbnRyb2wgdG8gcmVnaXN0ZXIuXG4gICAqIEBwYXJhbSB7RmllbGRQcm9wZXJ0aWVzfSBwcm9wcyAtIFRoZSBwcm9wZXJ0aWVzIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBjb250cm9sLlxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgcHJvcHM6IEZpZWxkUHJvcGVydGllcykge1xuICAgIHRoaXMuY29udHJvbHMuc2V0KGNvbnRyb2wsIHByb3BzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVW5yZWdpc3RlcnMgYSBjb250cm9sLlxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgY29udHJvbCBhbmQgaXRzIGFzc29jaWF0ZWQgcHJvcGVydGllcyBmcm9tIHRoZSBpbnRlcm5hbCBXZWFrTWFwLlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0Q29udHJvbH0gY29udHJvbCAtIFRoZSBjb250cm9sIHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGNvbnRyb2wgd2FzIHN1Y2Nlc3NmdWxseSB1bnJlZ2lzdGVyZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHN0YXRpYyB1bnJlZ2lzdGVyKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xzLmRlbGV0ZShjb250cm9sKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVzZXRzIGEgZm9ybSBncm91cC5cbiAgICogQHN1bW1hcnkgUmVjdXJzaXZlbHkgcmVzZXRzIGFsbCBjb250cm9scyBpbiBhIGZvcm0gZ3JvdXAsIGNsZWFyaW5nIHZhbHVlcywgZXJyb3JzLCBhbmQgbWFya2luZyB0aGVtIGFzIHByaXN0aW5lIGFuZCB1bnRvdWNoZWQuXG4gICAqIEBwYXJhbSB7Rm9ybUdyb3VwfSBmb3JtR3JvdXAgLSBUaGUgZm9ybSBncm91cCB0byByZXNldC5cbiAgICovXG4gIHN0YXRpYyByZXNldChmb3JtR3JvdXA6IEZvcm1Hcm91cCB8IEZvcm1Db250cm9sKTogdm9pZCB7XG4gICAgaWYoZm9ybUdyb3VwIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtR3JvdXAgYXMgRm9ybUNvbnRyb2w7XG4gICAgICBjb25zdCB7IHR5cGUgfSA9IE5neEZvcm1TZXJ2aWNlLmdldFByb3BzRnJvbUNvbnRyb2woY29udHJvbCk7XG4gICAgICBpZiAoIUhUTUw1Q2hlY2tUeXBlcy5pbmNsdWRlcyh0eXBlKSlcbiAgICAgICAgY29udHJvbC5zZXRWYWx1ZShcIlwiKTtcbiAgICAgIGNvbnRyb2wubWFya0FzUHJpc3RpbmUoKTtcbiAgICAgIGNvbnRyb2wubWFya0FzVW50b3VjaGVkKCk7XG4gICAgICBjb250cm9sLnNldEVycm9ycyhudWxsKTtcbiAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBmb3JtR3JvdXAuY29udHJvbHMpIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IGZvcm1Hcm91cC5jb250cm9sc1trZXldO1xuICAgICAgICBOZ3hGb3JtU2VydmljZS5yZXNldChjb250cm9sIGFzIEZvcm1Db250cm9sKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=