@decaf-ts/for-angular 0.0.17 → 0.0.18

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 (32) hide show
  1. package/assets/i18n/en.json +3 -73
  2. package/assets/i18n/pt.json +5 -74
  3. package/components/crud-field/crud-field.component.d.ts +12 -3
  4. package/components/crud-form/crud-form.component.d.ts +36 -14
  5. package/components/empty-state/empty-state.component.d.ts +9 -10
  6. package/components/fieldset/fieldset.component.d.ts +9 -0
  7. package/components/filter/filter.component.d.ts +11 -2
  8. package/engine/NgxBaseComponent.d.ts +39 -39
  9. package/engine/NgxCrudFormField.d.ts +2 -1
  10. package/engine/NgxRenderingEngine.d.ts +44 -16
  11. package/engine/interfaces.d.ts +10 -0
  12. package/engine/types.d.ts +8 -0
  13. package/esm2022/components/crud-field/crud-field.component.mjs +23 -3
  14. package/esm2022/components/crud-form/crud-form.component.mjs +33 -18
  15. package/esm2022/components/empty-state/empty-state.component.mjs +11 -10
  16. package/esm2022/components/fieldset/fieldset.component.mjs +7 -4
  17. package/esm2022/components/filter/filter.component.mjs +16 -6
  18. package/esm2022/components/layout/layout.component.mjs +3 -3
  19. package/esm2022/components/list-item/list-item.component.mjs +4 -4
  20. package/esm2022/components/pagination/pagination.component.mjs +6 -6
  21. package/esm2022/engine/NgxBaseComponent.mjs +48 -53
  22. package/esm2022/engine/NgxCrudFormField.mjs +1 -1
  23. package/esm2022/engine/NgxRenderingEngine.mjs +20 -4
  24. package/esm2022/engine/interfaces.mjs +1 -1
  25. package/esm2022/engine/types.mjs +1 -1
  26. package/esm2022/helpers/utils.mjs +49 -32
  27. package/esm2022/i18n/Loader.mjs +82 -0
  28. package/fesm2022/decaf-ts-for-angular.mjs +288 -134
  29. package/fesm2022/decaf-ts-for-angular.mjs.map +1 -1
  30. package/helpers/utils.d.ts +42 -17
  31. package/i18n/Loader.d.ts +48 -0
  32. package/package.json +10 -1
@@ -1,5 +1,6 @@
1
1
  import { Input, Component, Inject, ViewChild, ElementRef, Output, EventEmitter, } from '@angular/core';
2
- import { generateRandomValue, getInjectablesRegistry, getLocaleFromClassName, getOnWindow, isDevelopmentMode, stringToBoolean } from '../helpers/utils';
2
+ import { generateRandomValue, getInjectablesRegistry, getOnWindow, isDevelopmentMode, stringToBoolean } from '../helpers/utils';
3
+ import { getLocaleContext } from '../i18n/Loader';
3
4
  import { Model } from '@decaf-ts/decorator-validation';
4
5
  import { InternalError, OperationKeys } from '@decaf-ts/db-decorators';
5
6
  import { BaseComponentProps } from './constants';
@@ -7,7 +8,6 @@ import { NgxRenderingEngine } from './NgxRenderingEngine';
7
8
  import { getLogger } from '../for-angular.module';
8
9
  import { Repository } from '@decaf-ts/core';
9
10
  import { RamAdapter } from '@decaf-ts/core/ram';
10
- import { addIcons } from 'ionicons';
11
11
  import * as i0 from "@angular/core";
12
12
  /**
13
13
  * @description Base component class that provides common functionality for all Decaf components.
@@ -97,7 +97,7 @@ export class NgxBaseComponent {
97
97
  * A->>C: new Component(instance)
98
98
  * C->>B: super(instance)
99
99
  * B->>B: Set componentName = instance
100
- * B->>U: getLocaleFromClassName(instance)
100
+ * B->>U: getLocaleContext(instance)
101
101
  * U-->>B: Return derived locale
102
102
  * B->>B: Set componentLocale
103
103
  * B->>L: getLogger(this)
@@ -107,7 +107,7 @@ export class NgxBaseComponent {
107
107
  * @memberOf NgxBaseComponent
108
108
  */
109
109
  // eslint-disable-next-line @angular-eslint/prefer-inject
110
- constructor(instance, icons = {}) {
110
+ constructor(instance) {
111
111
  this.instance = instance;
112
112
  /**
113
113
  * @description Dynamic properties configuration object.
@@ -232,10 +232,8 @@ export class NgxBaseComponent {
232
232
  * @type {NgxRenderingEngine}
233
233
  */
234
234
  this.renderingEngine = NgxRenderingEngine.get();
235
- if (Object.keys(icons).length)
236
- addIcons(icons);
237
235
  this.componentName = instance;
238
- this.componentLocale = getLocaleFromClassName(instance);
236
+ this.componentLocale = getLocaleContext(instance);
239
237
  this.logger = getLogger(this);
240
238
  this.getLocale(this.translatable);
241
239
  this.uid = generateRandomValue(12);
@@ -277,47 +275,6 @@ export class NgxBaseComponent {
277
275
  }
278
276
  return this._repository;
279
277
  }
280
- /**
281
- * @description Parses and applies properties from the props object to the component instance.
282
- * @summary This method iterates through the properties of the provided instance object
283
- * and applies any matching properties from the component's props configuration to the
284
- * component instance. This allows for dynamic property assignment based on configuration
285
- * stored in the props object, enabling flexible component customization without requiring
286
- * explicit property binding for every possible configuration option.
287
- *
288
- * The method performs a safe property assignment by checking if each key from the instance
289
- * exists in the props object before applying it. This prevents accidental property
290
- * overwriting and ensures only intended properties are modified.
291
- *
292
- * @param {KeyValue} instance - The component instance object to process
293
- * @return {void}
294
- *
295
- * @mermaid
296
- * sequenceDiagram
297
- * participant C as Component
298
- * participant B as NgxBaseComponent
299
- * participant P as Props Object
300
- *
301
- * C->>B: parseProps(instance)
302
- * B->>B: Get Object.keys(instance)
303
- * loop For each key in instance
304
- * B->>P: Check if key exists in this.props
305
- * alt Key exists in props
306
- * B->>B: Set this[key] = this.props[key]
307
- * else Key not in props
308
- * Note over B: Skip this key
309
- * end
310
- * end
311
- *
312
- * @protected
313
- * @memberOf NgxBaseComponent
314
- */
315
- parseProps(instance) {
316
- Object.keys(instance).forEach((key) => {
317
- if (Object.keys(this.props).includes(key))
318
- this[key] = this.props[key];
319
- });
320
- }
321
278
  /**
322
279
  * @description Handles changes to component inputs
323
280
  * @summary This Angular lifecycle hook is called when input properties change.
@@ -492,7 +449,48 @@ export class NgxBaseComponent {
492
449
  trackItemFn(index, item) {
493
450
  return `${index}-${item}`;
494
451
  }
495
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgxBaseComponent, deps: [{ token: 'instanceToken' }, { token: 'iconsToken' }], target: i0.ɵɵFactoryTarget.Component }); }
452
+ /**
453
+ * @description Parses and applies properties from the props object to the component instance.
454
+ * @summary This method iterates through the properties of the provided instance object
455
+ * and applies any matching properties from the component's props configuration to the
456
+ * component instance. This allows for dynamic property assignment based on configuration
457
+ * stored in the props object, enabling flexible component customization without requiring
458
+ * explicit property binding for every possible configuration option.
459
+ *
460
+ * The method performs a safe property assignment by checking if each key from the instance
461
+ * exists in the props object before applying it. This prevents accidental property
462
+ * overwriting and ensures only intended properties are modified.
463
+ *
464
+ * @param {KeyValue} instance - The component instance object to process
465
+ * @return {void}
466
+ *
467
+ * @mermaid
468
+ * sequenceDiagram
469
+ * participant C as Component
470
+ * participant B as NgxBaseComponent
471
+ * participant P as Props Object
472
+ *
473
+ * C->>B: parseProps(instance)
474
+ * B->>B: Get Object.keys(instance)
475
+ * loop For each key in instance
476
+ * B->>P: Check if key exists in this.props
477
+ * alt Key exists in props
478
+ * B->>B: Set this[key] = this.props[key]
479
+ * else Key not in props
480
+ * Note over B: Skip this key
481
+ * end
482
+ * end
483
+ *
484
+ * @protected
485
+ * @memberOf NgxBaseComponent
486
+ */
487
+ parseProps(instance) {
488
+ Object.keys(instance).forEach((key) => {
489
+ if (Object.keys(this.props).includes(key))
490
+ this[key] = this.props[key];
491
+ });
492
+ }
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 }); }
496
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 }); }
497
495
  }
498
496
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgxBaseComponent, decorators: [{
@@ -505,9 +503,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
505
503
  }], ctorParameters: () => [{ type: undefined, decorators: [{
506
504
  type: Inject,
507
505
  args: ['instanceToken']
508
- }] }, { type: undefined, decorators: [{
509
- type: Inject,
510
- args: ['iconsToken']
511
506
  }] }], propDecorators: { component: [{
512
507
  type: ViewChild,
513
508
  args: ['component', { read: ElementRef, static: true }]
@@ -542,4 +537,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
542
537
  }], listenEvent: [{
543
538
  type: Output
544
539
  }] } });
545
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmd4QmFzZUNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL05neEJhc2VDb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLEtBQUssRUFDTCxTQUFTLEVBQ1QsTUFBTSxFQUNOLFNBQVMsRUFDVCxVQUFVLEVBR1YsTUFBTSxFQUNOLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsV0FBVyxFQUNYLGlCQUFpQixFQUNqQixlQUFlLEVBQ2hCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZELE9BQU8sRUFFTCxhQUFhLEVBQ2IsYUFBYSxFQUNkLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRTFELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7O0FBRXBDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkRHO0FBTUgsTUFBTSxPQUFnQixnQkFBZ0I7SUFzU3BDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FpQ0c7SUFDSCx5REFBeUQ7SUFDekQsWUFBeUQsUUFBZ0IsRUFBd0IsUUFBa0IsRUFBRTtRQUE1RCxhQUFR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a0JBTHJDLFNBQVM7bUJBQUM7b0JBQ1QsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSxZQUFZO29CQUN0QixJQUFJLEVBQUUsRUFBQyxXQUFXLEVBQUUsS0FBSyxFQUFDO2lCQUMzQjs7MEJBMFV3QixNQUFNOzJCQUFDLGVBQWU7OzBCQUErQixNQUFNOzJCQUFDLFlBQVk7eUNBN1QvRixTQUFTO3NCQURSLFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQWlDMUQsVUFBVTtzQkFEVCxLQUFLO2dCQVlOLEtBQUs7c0JBREosS0FBSztnQkFnQ04sS0FBSztzQkFESixLQUFLO2dCQWdCTixJQUFJO3NCQURILEtBQUs7Z0JBYU4sRUFBRTtzQkFERCxLQUFLO2dCQVlOLEtBQUs7c0JBREosS0FBSztnQkFZTixVQUFVO3NCQURULEtBQUs7Z0JBWU4sR0FBRztzQkFERixLQUFLO2dCQVlOLE1BQU07c0JBREwsS0FBSztnQkFlTixNQUFNO3NCQURMLEtBQUs7Z0JBZU4sWUFBWTtzQkFEWCxLQUFLO2dCQWVOLFNBQVM7c0JBRFIsS0FBSztnQkFnQk4sSUFBSTtzQkFESCxLQUFLO2dCQTRCTixXQUFXO3NCQURWLEtBQUs7Z0JBeUJOLFdBQVc7c0JBRFYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIElucHV0LFxuICBDb21wb25lbnQsXG4gIEluamVjdCxcbiAgVmlld0NoaWxkLFxuICBFbGVtZW50UmVmLFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEtleVZhbHVlLCBSZW5kZXJlckN1c3RvbUV2ZW50LCBTdHJpbmdPckJvb2xlYW4gfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7XG4gIGdlbmVyYXRlUmFuZG9tVmFsdWUsXG4gIGdldEluamVjdGFibGVzUmVnaXN0cnksXG4gIGdldExvY2FsZUZyb21DbGFzc05hbWUsXG4gIGdldE9uV2luZG93LFxuICBpc0RldmVsb3BtZW50TW9kZSxcbiAgc3RyaW5nVG9Cb29sZWFuXG59IGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb24nO1xuaW1wb3J0IHtcbiAgQ3J1ZE9wZXJhdGlvbnMsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXNcbn0gZnJvbSAnQGRlY2FmLXRzL2RiLWRlY29yYXRvcnMnO1xuaW1wb3J0IHsgQmFzZUNvbXBvbmVudFByb3BzIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgTmd4UmVuZGVyaW5nRW5naW5lIH0gZnJvbSAnLi9OZ3hSZW5kZXJpbmdFbmdpbmUnO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnQGRlY2FmLXRzL2xvZ2dpbmcnO1xuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi4vZm9yLWFuZ3VsYXIubW9kdWxlJztcbmltcG9ydCB7IERlY2FmUmVwb3NpdG9yeSB9IGZyb20gJy4uL2NvbXBvbmVudHMvbGlzdC9jb25zdGFudHMnO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gJ0BkZWNhZi10cy9jb3JlJztcbmltcG9ydCB7IFJhbUFkYXB0ZXIgfSBmcm9tICdAZGVjYWYtdHMvY29yZS9yYW0nO1xuaW1wb3J0IHsgYWRkSWNvbnMgfSBmcm9tICdpb25pY29ucyc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEJhc2UgY29tcG9uZW50IGNsYXNzIHRoYXQgcHJvdmlkZXMgY29tbW9uIGZ1bmN0aW9uYWxpdHkgZm9yIGFsbCBEZWNhZiBjb21wb25lbnRzLlxuICogQHN1bW1hcnkgVGhlIE5neEJhc2VDb21wb25lbnQgc2VydmVzIGFzIHRoZSBmb3VuZGF0aW9uIGZvciBhbGwgRGVjYWYgVUkgY29tcG9uZW50cywgcHJvdmlkaW5nXG4gKiBzaGFyZWQgZnVuY3Rpb25hbGl0eSBmb3IgbG9jYWxpemF0aW9uLCBlbGVtZW50IHJlZmVyZW5jZXMsIGFuZCBzdHlsaW5nLiBUaGlzIGFic3RyYWN0IGNsYXNzXG4gKiBpbXBsZW1lbnRzIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIHRoYXQgYXJlIHVzZWQgYWNyb3NzIHRoZSBjb21wb25lbnQgbGlicmFyeSwgZW5zdXJpbmdcbiAqIGNvbnNpc3RlbnQgYmVoYXZpb3IgYW5kIHJlZHVjaW5nIGNvZGUgZHVwbGljYXRpb24uIENvbXBvbmVudHMgdGhhdCBleHRlbmQgdGhpcyBjbGFzcyBpbmhlcml0XG4gKiBpdHMgY2FwYWJpbGl0aWVzIGZvciBoYW5kbGluZyB0cmFuc2xhdGlvbnMsIGFjY2Vzc2luZyBET00gZWxlbWVudHMsIGFuZCBhcHBseWluZyBjdXN0b20gc3R5bGluZy5cbiAqXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgdGhpcyBjb21wb25lbnQgd29ya3Mgd2l0aFxuICogQHBhcmFtIHtzdHJpbmd9IGluc3RhbmNlIC0gVGhlIGNvbXBvbmVudCBpbnN0YW5jZSB0b2tlbiB1c2VkIGZvciBpZGVudGlmaWNhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsZSAtIFRoZSBsb2NhbGUgdG8gYmUgdXNlZCBmb3IgdHJhbnNsYXRpb25zXG4gKiBAcGFyYW0ge1N0cmluZ09yQm9vbGVhbn0gdHJhbnNsYXRhYmxlIC0gV2hldGhlciB0aGUgY29tcG9uZW50IHNob3VsZCBiZSB0cmFuc2xhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIC0gQWRkaXRpb25hbCBDU1MgY2xhc3NlcyB0byBhcHBseSB0byB0aGUgY29tcG9uZW50XG4gKiBAcGFyYW0ge1wiaW9zXCIgfCBcIm1kXCIgfCB1bmRlZmluZWR9IG1vZGUgLSBDb21wb25lbnQgcGxhdGZvcm0gc3R5bGVcbiAqXG4gKiBAY29tcG9uZW50IE5neEJhc2VDb21wb25lbnRcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdhcHAtbXktY29tcG9uZW50JyxcbiAqICAgdGVtcGxhdGVVcmw6ICcuL215LWNvbXBvbmVudC5jb21wb25lbnQuaHRtbCcsXG4gKiAgIHN0eWxlVXJsczogWycuL215LWNvbXBvbmVudC5jb21wb25lbnQuc2NzcyddXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IGV4dGVuZHMgTmd4QmFzZUNvbXBvbmVudCB7XG4gKiAgIGNvbnN0cnVjdG9yKEBJbmplY3QoJ2luc3RhbmNlVG9rZW4nKSBpbnN0YW5jZTogc3RyaW5nKSB7XG4gKiAgICAgc3VwZXIoaW5zdGFuY2UpO1xuICogICB9XG4gKlxuICogICBuZ09uSW5pdCgpIHtcbiAqICAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAqICAgICAvLyBDb21wb25lbnQtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb25cbiAqICAgfVxuICogfVxuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcCBhcyBBcHBsaWNhdGlvblxuICogICBwYXJ0aWNpcGFudCBDb21wIGFzIENvbXBvbmVudFxuICogICBwYXJ0aWNpcGFudCBCYXNlIGFzIE5neEJhc2VDb21wb25lbnRcbiAqICAgcGFydGljaXBhbnQgRW5naW5lIGFzIE5neFJlbmRlcmluZ0VuZ2luZVxuICpcbiAqICAgQXBwLT4+Q29tcDogQ3JlYXRlIGNvbXBvbmVudFxuICogICBDb21wLT4+QmFzZTogc3VwZXIoaW5zdGFuY2UpXG4gKiAgIEJhc2UtPj5CYXNlOiBTZXQgY29tcG9uZW50TmFtZSAmIGNvbXBvbmVudExvY2FsZVxuICpcbiAqICAgQXBwLT4+Q29tcDogU2V0IEBJbnB1dCBwcm9wZXJ0aWVzXG4gKiAgIENvbXAtPj5CYXNlOiBuZ09uQ2hhbmdlcyhjaGFuZ2VzKVxuICpcbiAqICAgYWx0IG1vZGVsIGNoYW5nZWRcbiAqICAgICBCYXNlLT4+QmFzZTogZ2V0TW9kZWwobW9kZWwpXG4gKiAgICAgQmFzZS0+PkVuZ2luZTogZ2V0RGVjb3JhdG9ycyhtb2RlbCwge30pXG4gKiAgICAgRW5naW5lLS0+PkJhc2U6IFJldHVybiBkZWNvcmF0b3IgbWV0YWRhdGFcbiAqICAgICBCYXNlLT4+QmFzZTogQ29uZmlndXJlIG1hcHBlciBhbmQgaXRlbVxuICogICAgIEJhc2UtPj5CYXNlOiBnZXRMb2NhbGUodHJhbnNsYXRhYmxlKVxuICogICBlbHNlIGxvY2FsZS90cmFuc2xhdGFibGUgY2hhbmdlZFxuICogICAgIEJhc2UtPj5CYXNlOiBnZXRMb2NhbGUodHJhbnNsYXRhYmxlKVxuICogICBlbmRcbiAqXG4gKiAgIEFwcC0+PkNvbXA6IG5nT25Jbml0KClcbiAqICAgQ29tcC0+PkJhc2U6IGluaXRpYWxpemUoKVxuICogICBCYXNlLT4+QmFzZTogU2V0IGluaXRpYWxpemVkIGZsYWdcbiAqL1xuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHRlbXBsYXRlOiAnPGRpdj48ZGl2PicsXG4gIGhvc3Q6IHsnW2F0dHIuaWRdJzogJ3VpZCd9LFxufSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOZ3hCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZlcmVuY2UgdG8gdGhlIGNvbXBvbmVudCdzIGVsZW1lbnQuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIG5hdGl2ZSBET00gZWxlbWVudCBvZiB0aGUgY29tcG9uZW50IHRocm91Z2ggQW5ndWxhcidzXG4gICAqIFZpZXdDaGlsZCBkZWNvcmF0b3IuIFRoaXMgcmVmZXJlbmNlIGNhbiBiZSB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIERPTSBlbGVtZW50IGRpcmVjdGx5LFxuICAgKiBhcHBseSBjdXN0b20gc3R5bGVzLCBvciBhY2Nlc3MgbmF0aXZlIGVsZW1lbnQgcHJvcGVydGllcyBhbmQgbWV0aG9kcy4gVGhlIGVsZW1lbnQgaXNcbiAgICogaWRlbnRpZmllZCBieSB0aGUgJ2NvbXBvbmVudCcgdGVtcGxhdGUgcmVmZXJlbmNlIHZhcmlhYmxlLlxuICAgKlxuICAgKiBAdHlwZSB7RWxlbWVudFJlZn1cbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2NvbXBvbmVudCcsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiB0cnVlIH0pXG4gIGNvbXBvbmVudCE6IEVsZW1lbnRSZWY7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCwgd2hpY2ggaXMgdHlwaWNhbGx5IGRlcml2ZWQgZnJvbSB0aGUgY2xhc3MgbmFtZS5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGludGVybmFsbHkgZm9yIHZhcmlvdXMgcHVycG9zZXMgc3VjaCBhcyBsb2dnaW5nLCBkZXJpdmluZyB0aGUgZGVmYXVsdFxuICAgKiBsb2NhbGUsIGFuZCBwb3RlbnRpYWxseSBmb3IgY29tcG9uZW50IGlkZW50aWZpY2F0aW9uIGluIGRlYnVnZ2luZyBvciBlcnJvciByZXBvcnRpbmcuXG4gICAqXG4gICAqIFRoZSBgY29tcG9uZW50TmFtZWAgaXMgc2V0IGR1cmluZyB0aGUgY29tcG9uZW50J3MgaW5pdGlhbGl6YXRpb24gcHJvY2VzcyBhbmQgc2hvdWxkIG5vdFxuICAgKiBiZSBtb2RpZmllZCBleHRlcm5hbGx5LiBJdCdzIG1hcmtlZCBhcyBwcm90ZWN0ZWQgdG8gYWxsb3cgYWNjZXNzIGluIGRlcml2ZWQgY2xhc3NlcyB3aGlsZVxuICAgKiBwcmV2ZW50aW5nIGRpcmVjdCBhY2Nlc3MgZnJvbSBvdXRzaWRlIHRoZSBjb21wb25lbnQgaGllcmFyY2h5LlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIEluc2lkZSBhIGRlcml2ZWQgY29tcG9uZW50IGNsYXNzXG4gICAqIGNvbnNvbGUubG9nKHRoaXMuY29tcG9uZW50TmFtZSk7IC8vIE91dHB1dHM6IFwiTXlDdXN0b21Db21wb25lbnRcIlxuICAgKi9cbiAgY29tcG9uZW50TmFtZSE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVuZGVyZXIuXG4gICAqIEBzdW1tYXJ5IEEgdW5pcXVlIGlkZW50aWZpZXIgdXNlZCB0byByZWZlcmVuY2UgdGhlIGNvbXBvbmVudCdzIHJlbmRlcmVyIGluc3RhbmNlLlxuICAgKiBUaGlzIGNhbiBiZSB1c2VkIGZvciB0YXJnZXRpbmcgc3BlY2lmaWMgcmVuZGVyZXIgaW5zdGFuY2VzIHdoZW4gbXVsdGlwbGUgY29tcG9uZW50c1xuICAgKiBhcmUgcHJlc2VudCBvbiB0aGUgc2FtZSBwYWdlLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgcmVuZGVyZXJJZCE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlcG9zaXRvcnkgbW9kZWwgZm9yIGRhdGEgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgVGhlIGRhdGEgbW9kZWwgcmVwb3NpdG9yeSB0aGF0IHRoaXMgY29tcG9uZW50IHdpbGwgdXNlIGZvciBDUlVEIG9wZXJhdGlvbnMuXG4gICAqIFRoaXMgcHJvdmlkZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhIGxheWVyIGZvciByZXRyaWV2aW5nIGFuZCBtYW5pcHVsYXRpbmcgZGF0YS5cbiAgICpcbiAgICogQHR5cGUge01vZGVsfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBtb2RlbCE6ICBNb2RlbCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSByZXBvc2l0b3J5IGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBkYXRhIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGEgbGF5ZXIgZm9yIHJldHJpZXZpbmcgYW5kIG1hbmlwdWxhdGluZyBkYXRhLlxuICAgKiBUaGlzIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBgRGVjYWZSZXBvc2l0b3J5YCBjbGFzcyBmcm9tIHRoZSBgQGRlY2FmLXRzL2NvcmVgIHBhY2thZ2UsXG4gICAqIHdoaWNoIGlzIGluaXRpYWxpemVkIGluIHRoZSBgcmVwb3NpdG9yeWAgZ2V0dGVyIG1ldGhvZC5cbiAgICpcbiAgICogVGhlIHJlcG9zaXRvcnkgaXMgdXNlZCB0byBwZXJmb3JtIENSVUQgKENyZWF0ZSwgUmVhZCwgVXBkYXRlLCBEZWxldGUpIG9wZXJhdGlvbnMgb24gdGhlXG4gICAqIGRhdGEgbW9kZWwsIHN1Y2ggYXMgZmV0Y2hpbmcgZGF0YSwgY3JlYXRpbmcgbmV3IGl0ZW1zLCB1cGRhdGluZyBleGlzdGluZyBpdGVtcywgYW5kIGRlbGV0aW5nXG4gICAqIGl0ZW1zLiBJdCBhbHNvIHByb3ZpZGVzIG1ldGhvZHMgZm9yIHF1ZXJ5aW5nIGFuZCBmaWx0ZXJpbmcgZGF0YSBiYXNlZCBvbiBzcGVjaWZpYyBjcml0ZXJpYS5cbiAgICpcbiAgICogQHR5cGUge0RlY2FmUmVwb3NpdG9yeTxNb2RlbD59XG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBwcm90ZWN0ZWQgX3JlcG9zaXRvcnk/OiBEZWNhZlJlcG9zaXRvcnk8TW9kZWw+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRHluYW1pYyBwcm9wZXJ0aWVzIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICAgKiBAc3VtbWFyeSBDb250YWlucyBrZXktdmFsdWUgcGFpcnMgb2YgZHluYW1pYyBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudFxuICAgKiBhdCBydW50aW1lLiBUaGlzIGZsZXhpYmxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGFsbG93cyBmb3IgZHluYW1pYyBwcm9wZXJ0eSBhc3NpZ25tZW50IHdpdGhvdXRcbiAgICogcmVxdWlyaW5nIGV4cGxpY2l0IGlucHV0IGJpbmRpbmdzIGZvciBldmVyeSBwb3NzaWJsZSBjb25maWd1cmF0aW9uIG9wdGlvbi4gUHJvcGVydGllcyBmcm9tXG4gICAqIHRoaXMgb2JqZWN0IGFyZSBwYXJzZWQgYW5kIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB0aHJvdWdoIHRoZSBwYXJzZVByb3BzIG1ldGhvZCxcbiAgICogZW5hYmxpbmcgY3VzdG9taXphYmxlIGNvbXBvbmVudCBiZWhhdmlvciBiYXNlZCBvbiBleHRlcm5hbCBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59XG4gICAqIEBkZWZhdWx0IHt9XG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbmZpZ3VyYXRpb24gZm9yIGxpc3QgaXRlbSByZW5kZXJpbmdcbiAgICogQHN1bW1hcnkgRGVmaW5lcyBob3cgbGlzdCBpdGVtcyBzaG91bGQgYmUgcmVuZGVyZWQgaW4gdGhlIGNvbXBvbmVudC5cbiAgICogVGhpcyBwcm9wZXJ0eSBob2xkcyBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoYXQgc3BlY2lmaWVzIHRoZSB0YWcgbmFtZVxuICAgKiBhbmQgb3RoZXIgcHJvcGVydGllcyBuZWVkZWQgdG8gcmVuZGVyIGxpc3QgaXRlbXMgY29ycmVjdGx5LiBUaGUgdGFnIHByb3BlcnR5XG4gICAqIGlkZW50aWZpZXMgd2hpY2ggY29tcG9uZW50IHNob3VsZCBiZSB1c2VkIHRvIHJlbmRlciBlYWNoIGl0ZW0gaW4gYSBsaXN0LlxuICAgKiBBZGRpdGlvbmFsIHByb3BlcnRpZXMgY2FuIGJlIGluY2x1ZGVkIHRvIGN1c3RvbWl6ZSB0aGUgcmVuZGVyaW5nIGJlaGF2aW9yLlxuICAgKlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59XG4gICAqIEBkZWZhdWx0IHt0YWc6IFwiXCJ9XG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBpdGVtOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgdGFnOiAnJyB9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJpbWFyeSBrZXkgZmllbGQgbmFtZSBmb3IgdGhlIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgd2hpY2ggZmllbGQgaW4gdGhlIG1vZGVsIHNob3VsZCBiZSB1c2VkIGFzIHRoZSBwcmltYXJ5IGtleS5cbiAgICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgaWRlbnRpZnlpbmcgdW5pcXVlIHJlY29yZHMgaW4gb3BlcmF0aW9ucyBsaWtlIHVwZGF0ZSBhbmQgZGVsZXRlLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAZGVmYXVsdCAnaWQnXG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBwayE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJhc2Ugcm91dGUgZm9yIG5hdmlnYXRpb24gcmVsYXRlZCB0byB0aGlzIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgYmFzZSByb3V0ZSBwYXRoIHVzZWQgZm9yIG5hdmlnYXRpb24gYWN0aW9ucyByZWxhdGVkIHRvIHRoaXMgY29tcG9uZW50LlxuICAgKiBUaGlzIGlzIG9mdGVuIHVzZWQgYXMgYSBwcmVmaXggZm9yIGNvbnN0cnVjdGluZyBuYXZpZ2F0aW9uIFVSTHMuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICByb3V0ZSE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEF2YWlsYWJsZSBDUlVEIG9wZXJhdGlvbnMgZm9yIHRoaXMgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIHdoaWNoIENSVUQgb3BlcmF0aW9ucyAoQ3JlYXRlLCBSZWFkLCBVcGRhdGUsIERlbGV0ZSkgYXJlIGF2YWlsYWJsZVxuICAgKiBmb3IgdGhpcyBjb21wb25lbnQuIFRoaXMgYWZmZWN0cyB3aGljaCBvcGVyYXRpb25zIGNhbiBiZSBwZXJmb3JtZWQgb24gdGhlIGRhdGEuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtPcGVyYXRpb25LZXlzLlJFQURdXG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvcGVyYXRpb25zOiBDcnVkT3BlcmF0aW9uc1tdID0gW09wZXJhdGlvbktleXMuUkVBRF07XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgcmVjb3JkLlxuICAgKiBAc3VtbWFyeSBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY3VycmVudCByZWNvcmQgYmVpbmcgZGlzcGxheWVkIG9yIG1hbmlwdWxhdGVkLlxuICAgKiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIHByaW1hcnkga2V5IGZvciBvcGVyYXRpb25zIG9uIHNwZWNpZmljIHJlY29yZHMuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICB1aWQhOiBzdHJpbmcgfCBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaWVsZCBtYXBwaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBzdW1tYXJ5IERlZmluZXMgaG93IGZpZWxkcyBmcm9tIHRoZSBkYXRhIG1vZGVsIHNob3VsZCBiZSBtYXBwZWQgdG8gcHJvcGVydGllcyB1c2VkIGJ5IHRoZSBjb21wb25lbnQuXG4gICAqIFRoaXMgYWxsb3dzIGZvciBmbGV4aWJsZSBkYXRhIGJpbmRpbmcgYmV0d2VlbiB0aGUgbW9kZWwgYW5kIHRoZSBjb21wb25lbnQncyBkaXNwbGF5IGxvZ2ljLlxuICAgKlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn1cbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG1hcHBlcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGxvY2FsZSB0byBiZSB1c2VkIGZvciB0cmFuc2xhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgbG9jYWxlIGlkZW50aWZpZXIgdG8gdXNlIHdoZW4gdHJhbnNsYXRpbmcgY29tcG9uZW50IHRleHQuXG4gICAqIFRoaXMgY2FuIGJlIHNldCBleHBsaWNpdGx5IHZpYSBpbnB1dCBwcm9wZXJ0eSB0byBvdmVycmlkZSB0aGUgYXV0b21hdGljYWxseSBkZXJpdmVkXG4gICAqIGxvY2FsZSBmcm9tIHRoZSBjb21wb25lbnQgbmFtZS4gVGhlIGxvY2FsZSBpcyB0eXBpY2FsbHkgYSBsYW5ndWFnZSBjb2RlIChlLmcuLCAnZW4nLCAnZnInKVxuICAgKiBvciBhIGxhbmd1YWdlLXJlZ2lvbiBjb2RlIChlLmcuLCAnZW4tVVMnLCAnZnItQ0EnKSB0aGF0IGRldGVybWluZXMgd2hpY2ggdHJhbnNsYXRpb25cbiAgICogc2V0IHRvIHVzZSBmb3IgdGhlIGNvbXBvbmVudCdzIHRleHQgY29udGVudC5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGxvY2FsZSE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERldGVybWluZXMgaWYgdGhlIGNvbXBvbmVudCBzaG91bGQgYmUgdHJhbnNsYXRlZC5cbiAgICogQHN1bW1hcnkgQ29udHJvbHMgd2hldGhlciB0aGUgY29tcG9uZW50J3MgdGV4dCBjb250ZW50IHNob3VsZCBiZSBwcm9jZXNzZWQgZm9yIHRyYW5zbGF0aW9uLlxuICAgKiBXaGVuIHRydWUsIHRoZSBjb21wb25lbnQgd2lsbCBhdHRlbXB0IHRvIHRyYW5zbGF0ZSB0ZXh0IHVzaW5nIHRoZSBzcGVjaWZpZWQgbG9jYWxlLlxuICAgKiBXaGVuIGZhbHNlLCB0ZXh0IGlzIGRpc3BsYXllZCBhcy1pcyB3aXRob3V0IHRyYW5zbGF0aW9uLiBUaGlzIHByb3BlcnR5IGFjY2VwdHMgZWl0aGVyXG4gICAqIGEgYm9vbGVhbiB2YWx1ZSBvciBhIHN0cmluZyB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBib29sZWFuIChlLmcuLCAndHJ1ZScsICdmYWxzZScsICcxJywgJzAnKS5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHRyYW5zbGF0YWJsZTogU3RyaW5nT3JCb29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFkZGl0aW9uYWwgQ1NTIGNsYXNzIG5hbWVzIHRvIGFwcGx5IHRvIHRoZSBjb21wb25lbnQuXG4gICAqIEBzdW1tYXJ5IEFsbG93cyBjdXN0b20gQ1NTIGNsYXNzZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGNvbXBvbmVudCdzIHJvb3QgZWxlbWVudC5cbiAgICogVGhlc2UgY2xhc3NlcyBhcmUgYXBwZW5kZWQgdG8gYW55IGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGNsYXNzZXMgYmFzZWQgb24gb3RoZXJcbiAgICogY29tcG9uZW50IHByb3BlcnRpZXMuIE11bHRpcGxlIGNsYXNzZXMgY2FuIGJlIHByb3ZpZGVkIGFzIGEgc3BhY2Utc2VwYXJhdGVkIHN0cmluZy5cbiAgICogVGhpcyBwcm92aWRlcyBhIHdheSB0byBjdXN0b21pemUgdGhlIGNvbXBvbmVudCdzIGFwcGVhcmFuY2UgYmV5b25kIHRoZSBidWlsdC1pbiBzdHlsaW5nIG9wdGlvbnMuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0IFwiXCJcbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGNsYXNzTmFtZTogc3RyaW5nID0gJyc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb21wb25lbnQgcGxhdGZvcm0gc3R5bGUuXG4gICAqIEBzdW1tYXJ5IENvbnRyb2xzIHRoZSB2aXN1YWwgYXBwZWFyYW5jZSBvZiB0aGUgY29tcG9uZW50IGJhc2VkIG9uIHBsYXRmb3JtIGRlc2lnbiBndWlkZWxpbmVzLlxuICAgKiBUaGUgJ2lvcycgbW9kZSBmb2xsb3dzIGlPUyBkZXNpZ24gcGF0dGVybnMsIHdoaWxlICdtZCcgKE1hdGVyaWFsIERlc2lnbikgZm9sbG93cyBBbmRyb2lkL0dvb2dsZVxuICAgKiBkZXNpZ24gcGF0dGVybnMuIFRoaXMgcHJvcGVydHkgYWZmZWN0cyB2YXJpb3VzIHZpc3VhbCBhc3BlY3RzIHN1Y2ggYXMgYW5pbWF0aW9ucywgZm9ybSBlbGVtZW50cyxcbiAgICogYW5kIGljb25zLiBTZXR0aW5nIHRoaXMgcHJvcGVydHkgYWxsb3dzIGNvbXBvbmVudHMgdG8gbWFpbnRhaW4gcGxhdGZvcm0tc3BlY2lmaWMgc3R5bGluZ1xuICAgKiBmb3IgYSBtb3JlIG5hdGl2ZSBsb29rIGFuZCBmZWVsLlxuICAgKlxuICAgKiBAdHlwZSB7KFwiaW9zXCIgfCBcIm1kXCIgfCB1bmRlZmluZWQpfVxuICAgKiBAZGVmYXVsdCBcIm1kXCJcbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG1vZGU6ICdpb3MnIHwgJ21kJyB8IHVuZGVmaW5lZCA9ICdtZCc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbG9jYWxlIGRlcml2ZWQgZnJvbSB0aGUgY29tcG9uZW50J3MgY2xhc3MgbmFtZS5cbiAgICogQHN1bW1hcnkgU3RvcmVzIHRoZSBhdXRvbWF0aWNhbGx5IGRlcml2ZWQgbG9jYWxlIGJhc2VkIG9uIHRoZSBjb21wb25lbnQncyBjbGFzcyBuYW1lLlxuICAgKiBUaGlzIGlzIGRldGVybWluZWQgZHVyaW5nIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbiBhbmQgc2VydmVzIGFzIGEgZmFsbGJhY2sgd2hlbiBub1xuICAgKiBleHBsaWNpdCBsb2NhbGUgaXMgcHJvdmlkZWQgdmlhIHRoZSBsb2NhbGUgaW5wdXQgcHJvcGVydHkuIFRoZSBkZXJpdmF0aW9uIGlzIGhhbmRsZWRcbiAgICogYnkgdGhlIGdldExvY2FsZUZyb21DbGFzc05hbWUgdXRpbGl0eSBmdW5jdGlvbiwgd2hpY2ggZXh0cmFjdHMgYSBsb2NhbGUgaWRlbnRpZmllclxuICAgKiBmcm9tIHRoZSBjb21wb25lbnQncyBjbGFzcyBuYW1lLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgY29tcG9uZW50TG9jYWxlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgd2hldGhlciBjaGlsZCBjb21wb25lbnRzIHNob3VsZCBiZSByZW5kZXJlZFxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGlmIGNoaWxkIGNvbXBvbmVudHMgc2hvdWxkIGJlIHJlbmRlcmVkIGJ5IHRoZSBjb21wb25lbnQuXG4gICAqIFRoaXMgY2FuIGJlIHNldCB0byBhIGJvb2xlYW4gdmFsdWUgb3IgYSBzdHJpbmcgdGhhdCBjYW4gYmUgY29udmVydGVkIHRvIGEgYm9vbGVhbi5cbiAgICogV2hlbiB0cnVlLCBjaGlsZCBjb21wb25lbnRzIGRlZmluZWQgaW4gdGhlIG1vZGVsIHdpbGwgYmUgcmVuZGVyZWQuIFdoZW4gZmFsc2UsXG4gICAqIGNoaWxkIGNvbXBvbmVudHMgd2lsbCBiZSBza2lwcGVkLiBUaGlzIHByb3ZpZGVzIGNvbnRyb2wgb3ZlciB0aGUgcmVuZGVyaW5nIGRlcHRoLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgU3RyaW5nT3JCb29sZWFufVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICByZW5kZXJDaGlsZDogc3RyaW5nIHwgU3RyaW5nT3JCb29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZsYWcgaW5kaWNhdGluZyBpZiB0aGUgY29tcG9uZW50IGhhcyBiZWVuIGluaXRpYWxpemVkXG4gICAqIEBzdW1tYXJ5IFRyYWNrcyB3aGV0aGVyIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZCBpdHMgaW5pdGlhbGl6YXRpb24gcHJvY2Vzcy5cbiAgICogVGhpcyBmbGFnIGlzIHVzZWQgdG8gcHJldmVudCBkdXBsaWNhdGUgaW5pdGlhbGl6YXRpb24gYW5kIHRvIGRldGVybWluZSBpZlxuICAgKiBjZXJ0YWluIG9wZXJhdGlvbnMgdGhhdCByZXF1aXJlIGluaXRpYWxpemF0aW9uIGNhbiBiZSBwZXJmb3JtZWQuXG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgaW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV2ZW50IGVtaXR0ZXIgZm9yIGN1c3RvbSByZW5kZXJlciBldmVudHMuXG4gICAqIEBzdW1tYXJ5IEVtaXRzIGN1c3RvbSBldmVudHMgdGhhdCBvY2N1ciB3aXRoaW4gY2hpbGQgY29tcG9uZW50cyBvciB0aGUgbGF5b3V0IGl0c2VsZi5cbiAgICogVGhpcyBhbGxvd3MgcGFyZW50IGNvbXBvbmVudHMgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB1c2VyIGludGVyYWN0aW9ucyBvclxuICAgKiBzdGF0ZSBjaGFuZ2VzIHdpdGhpbiB0aGUgZ3JpZCBsYXlvdXQuIEV2ZW50cyBhcmUgcGFzc2VkIHVwIHRoZSBjb21wb25lbnQgaGllcmFyY2h5XG4gICAqIHRvIGVuYWJsZSBjb29yZGluYXRlZCBiZWhhdmlvciBhY3Jvc3MgdGhlIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAdHlwZSB7RXZlbnRFbWl0dGVyPFJlbmRlcmVyQ3VzdG9tRXZlbnQ+fVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgQE91dHB1dCgpXG4gIGxpc3RlbkV2ZW50OiBFdmVudEVtaXR0ZXI8UmVuZGVyZXJDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFJlbmRlcmVyQ3VzdG9tRXZlbnQ+KCk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZlcmVuY2UgdG8gdGhlIHJlbmRlcmluZyBlbmdpbmUgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBOZ3hSZW5kZXJpbmdFbmdpbmUgc2luZ2xldG9uIGluc3RhbmNlLFxuICAgKiB3aGljaCBoYW5kbGVzIHRoZSByZW5kZXJpbmcgb2YgY29tcG9uZW50cyBiYXNlZCBvbiBtb2RlbCBkZWZpbml0aW9ucy5cbiAgICogVGhpcyBlbmdpbmUgaXMgdXNlZCB0byBleHRyYWN0IGRlY29yYXRvciBtZXRhZGF0YSBhbmQgcmVuZGVyIGNoaWxkIGNvbXBvbmVudHMuXG4gICAqXG4gICAqIEB0eXBlIHtOZ3hSZW5kZXJpbmdFbmdpbmV9XG4gICAqL1xuICByZW5kZXJpbmdFbmdpbmU6IE5neFJlbmRlcmluZ0VuZ2luZSA9XG4gICAgTmd4UmVuZGVyaW5nRW5naW5lLmdldCgpIGFzIHVua25vd24gYXMgTmd4UmVuZGVyaW5nRW5naW5lO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9nZ2VyIGluc3RhbmNlIGZvciB0aGUgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBsb2dnaW5nIGNhcGFiaWxpdGllcyBmb3IgdGhlIGNvbXBvbmVudCwgYWxsb3dpbmcgZm9yIGNvbnNpc3RlbnRcbiAgICogYW5kIHN0cnVjdHVyZWQgbG9nZ2luZyBvZiBpbmZvcm1hdGlvbiwgd2FybmluZ3MsIGFuZCBlcnJvcnMuIFRoaXMgbG9nZ2VyIGlzIGluaXRpYWxpemVkXG4gICAqIGluIHRoZSBuZ09uSW5pdCBtZXRob2QgdXNpbmcgdGhlIGdldExvZ2dlciBmdW5jdGlvbiBmcm9tIHRoZSBGb3JBbmd1bGFyTW9kdWxlLlxuICAgKlxuICAgKiBUaGUgbG9nZ2VyIGlzIHVzZWQgdGhyb3VnaG91dCB0aGUgY29tcG9uZW50IHRvIHJlY29yZCBpbXBvcnRhbnQgZXZlbnRzLCBkZWJ1ZyBpbmZvcm1hdGlvbixcbiAgICogYW5kIHBvdGVudGlhbCBpc3N1ZXMuIEl0IGhlbHBzIGluIG1vbml0b3JpbmcgdGhlIGNvbXBvbmVudCdzIGJlaGF2aW9yLCB0cmFja2luZyB0aGUgZmxvd1xuICAgKiBvZiBvcGVyYXRpb25zLCBhbmQgZmFjaWxpdGF0aW5nIGVhc2llciBkZWJ1Z2dpbmcgYW5kIG1haW50ZW5hbmNlLlxuICAgKlxuICAgKiBAdHlwZSB7TG9nZ2VyfVxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgbG9nZ2VyITogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBOZ3hCYXNlQ29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgYmFzZSBjb21wb25lbnQgd2l0aCB0aGUgcHJvdmlkZWQgaW5zdGFuY2UgdG9rZW4uXG4gICAqIFRoaXMgY29uc3RydWN0b3Igc2V0cyB1cCB0aGUgZnVuZGFtZW50YWwgcHJvcGVydGllcyByZXF1aXJlZCBieSBhbGwgRGVjYWYgY29tcG9uZW50cyxcbiAgICogaW5jbHVkaW5nIHRoZSBjb21wb25lbnQgbmFtZSwgbG9jYWxlIHNldHRpbmdzLCBhbmQgbG9nZ2luZyBjYXBhYmlsaXRpZXMuIFRoZSBpbnN0YW5jZVxuICAgKiB0b2tlbiBpcyB1c2VkIGZvciBjb21wb25lbnQgaWRlbnRpZmljYXRpb24gYW5kIGxvY2FsZSBkZXJpdmF0aW9uLlxuICAgKlxuICAgKiBUaGUgY29uc3RydWN0b3IgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBpbml0aWFsaXphdGlvbiBzdGVwczpcbiAgICogMS4gU2V0cyB0aGUgY29tcG9uZW50TmFtZSBmcm9tIHRoZSBwcm92aWRlZCBpbnN0YW5jZSB0b2tlblxuICAgKiAyLiBEZXJpdmVzIHRoZSBjb21wb25lbnRMb2NhbGUgZnJvbSB0aGUgY2xhc3MgbmFtZSB1c2luZyB1dGlsaXR5IGZ1bmN0aW9uc1xuICAgKiAzLiBJbml0aWFsaXplcyB0aGUgbG9nZ2VyIGluc3RhbmNlIGZvciB0aGUgY29tcG9uZW50XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0YW5jZSAtIFRoZSBjb21wb25lbnQgaW5zdGFuY2UgdG9rZW4gdXNlZCBmb3IgaWRlbnRpZmljYXRpb25cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQSBhcyBBbmd1bGFyXG4gICAqICAgcGFydGljaXBhbnQgQyBhcyBDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBCIGFzIE5neEJhc2VDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBVIGFzIFV0aWxzXG4gICAqICAgcGFydGljaXBhbnQgTCBhcyBMb2dnZXJcbiAgICpcbiAgICogICBBLT4+QzogbmV3IENvbXBvbmVudChpbnN0YW5jZSlcbiAgICogICBDLT4+Qjogc3VwZXIoaW5zdGFuY2UpXG4gICAqICAgQi0+PkI6IFNldCBjb21wb25lbnROYW1lID0gaW5zdGFuY2VcbiAgICogICBCLT4+VTogZ2V0TG9jYWxlRnJvbUNsYXNzTmFtZShpbnN0YW5jZSlcbiAgICogICBVLS0+PkI6IFJldHVybiBkZXJpdmVkIGxvY2FsZVxuICAgKiAgIEItPj5COiBTZXQgY29tcG9uZW50TG9jYWxlXG4gICAqICAgQi0+Pkw6IGdldExvZ2dlcih0aGlzKVxuICAgKiAgIEwtLT4+QjogUmV0dXJuIGxvZ2dlciBpbnN0YW5jZVxuICAgKiAgIEItPj5COiBTZXQgbG9nZ2VyXG4gICAqXG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L3ByZWZlci1pbmplY3RcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKEBJbmplY3QoJ2luc3RhbmNlVG9rZW4nKSBwcm90ZWN0ZWQgaW5zdGFuY2U6IHN0cmluZywgQEluamVjdCgnaWNvbnNUb2tlbicpIGljb25zOiBLZXlWYWx1ZSA9IHt9KSB7XG4gICAgaWYoT2JqZWN0LmtleXMoaWNvbnMpLmxlbmd0aClcbiAgICAgIGFkZEljb25zKGljb25zKTtcbiAgICB0aGlzLmNvbXBvbmVudE5hbWUgPSBpbnN0YW5jZTtcbiAgICB0aGlzLmNvbXBvbmVudExvY2FsZSA9IGdldExvY2FsZUZyb21DbGFzc05hbWUoaW5zdGFuY2UpO1xuICAgIHRoaXMubG9nZ2VyID0gZ2V0TG9nZ2VyKHRoaXMpO1xuICAgIHRoaXMuZ2V0TG9jYWxlKHRoaXMudHJhbnNsYXRhYmxlKTtcbiAgICB0aGlzLnVpZCA9IGdlbmVyYXRlUmFuZG9tVmFsdWUoMTIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXR0ZXIgZm9yIHRoZSByZXBvc2l0b3J5IGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGEgbGF5ZXIgZm9yIHJldHJpZXZpbmcgYW5kIG1hbmlwdWxhdGluZyBkYXRhLlxuICAgKiBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyB0aGUgYF9yZXBvc2l0b3J5YCBwcm9wZXJ0eSBpZiBpdCBpcyBub3QgYWxyZWFkeSBzZXQsIGVuc3VyaW5nXG4gICAqIHRoYXQgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlIHJlcG9zaXRvcnkgaXMgdXNlZCB0aHJvdWdob3V0IHRoZSBjb21wb25lbnQuXG4gICAqXG4gICAqIFRoZSByZXBvc2l0b3J5IGlzIHVzZWQgdG8gcGVyZm9ybSBDUlVEIG9wZXJhdGlvbnMgb24gdGhlIGRhdGEgbW9kZWwsIHN1Y2ggYXMgZmV0Y2hpbmcgZGF0YSxcbiAgICogY3JlYXRpbmcgbmV3IGl0ZW1zLCB1cGRhdGluZyBleGlzdGluZyBpdGVtcywgYW5kIGRlbGV0aW5nIGl0ZW1zLiBJdCBhbHNvIHByb3ZpZGVzIG1ldGhvZHNcbiAgICogZm9yIHF1ZXJ5aW5nIGFuZCBmaWx0ZXJpbmcgZGF0YSBiYXNlZCBvbiBzcGVjaWZpYyBjcml0ZXJpYS5cbiAgICpcbiAgICogQHJldHVybnMge0RlY2FmUmVwb3NpdG9yeTxNb2RlbD59IFRoZSBpbml0aWFsaXplZCByZXBvc2l0b3J5IGluc3RhbmNlLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCByZXBvc2l0b3J5KCk6IERlY2FmUmVwb3NpdG9yeTxNb2RlbD4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMuX3JlcG9zaXRvcnkpIHtcbiAgICAgICAgY29uc3QgbW9kZWxOYW1lICA9ICh0aGlzLm1vZGVsIGFzIE1vZGVsKS5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gTW9kZWwuZ2V0KG1vZGVsTmFtZSk7XG4gICAgICAgIGlmICghY29uc3RydWN0b3IpXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAnQ2Fubm90IGZpbmQgbW9kZWwuIHdhcyBpdCByZWdpc3RlcmVkIHdpdGggQG1vZGVsPycsXG4gICAgICAgICAgKTtcbiAgICAgICAgbGV0IGRiQWRhcHRlckZsYXZvdXIgPSBnZXRPbldpbmRvdygnZGJBZGFwdGVyRmxhdm91cicpO1xuICAgICAgICBpZighZGJBZGFwdGVyRmxhdm91ciAmJiBpc0RldmVsb3BtZW50TW9kZSgpKSB7XG4gICAgICAgICAgY29uc3QgYWRhcHRlciA9IG5ldyBSYW1BZGFwdGVyKCk7XG4gICAgICAgICAgZGJBZGFwdGVyRmxhdm91ciA9IGFkYXB0ZXIuZmxhdm91cjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZXBvc2l0b3J5ID0gUmVwb3NpdG9yeS5mb3JNb2RlbChjb25zdHJ1Y3RvciwgZGJBZGFwdGVyRmxhdm91ciBhcyBzdHJpbmcpO1xuICAgICAgICB0aGlzLm1vZGVsID0gbmV3IGNvbnN0cnVjdG9yKCkgYXMgTW9kZWw7XG4gICAgICAgIGlmKHRoaXMubW9kZWwgJiYgIXRoaXMucGspXG4gICAgICAgICAgdGhpcy5wayA9ICh0aGlzLl9yZXBvc2l0b3J5IGFzIHVua25vd24gYXMgRGVjYWZSZXBvc2l0b3J5PE1vZGVsPikucGsgfHwgJ2lkJztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIChlcnJvciBhcyBFcnJvcik/Lm1lc3NhZ2UgfHwgZXJyb3IgYXMgc3RyaW5nXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcmVwb3NpdG9yeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGFuZCBhcHBsaWVzIHByb3BlcnRpZXMgZnJvbSB0aGUgcHJvcHMgb2JqZWN0IHRvIHRoZSBjb21wb25lbnQgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGl0ZXJhdGVzIHRocm91Z2ggdGhlIHByb3BlcnRpZXMgb2YgdGhlIHByb3ZpZGVkIGluc3RhbmNlIG9iamVjdFxuICAgKiBhbmQgYXBwbGllcyBhbnkgbWF0Y2hpbmcgcHJvcGVydGllcyBmcm9tIHRoZSBjb21wb25lbnQncyBwcm9wcyBjb25maWd1cmF0aW9uIHRvIHRoZVxuICAgKiBjb21wb25lbnQgaW5zdGFuY2UuIFRoaXMgYWxsb3dzIGZvciBkeW5hbWljIHByb3BlcnR5IGFzc2lnbm1lbnQgYmFzZWQgb24gY29uZmlndXJhdGlvblxuICAgKiBzdG9yZWQgaW4gdGhlIHByb3BzIG9iamVjdCwgZW5hYmxpbmcgZmxleGlibGUgY29tcG9uZW50IGN1c3RvbWl6YXRpb24gd2l0aG91dCByZXF1aXJpbmdcbiAgICogZXhwbGljaXQgcHJvcGVydHkgYmluZGluZyBmb3IgZXZlcnkgcG9zc2libGUgY29uZmlndXJhdGlvbiBvcHRpb24uXG4gICAqXG4gICAqIFRoZSBtZXRob2QgcGVyZm9ybXMgYSBzYWZlIHByb3BlcnR5IGFzc2lnbm1lbnQgYnkgY2hlY2tpbmcgaWYgZWFjaCBrZXkgZnJvbSB0aGUgaW5zdGFuY2VcbiAgICogZXhpc3RzIGluIHRoZSBwcm9wcyBvYmplY3QgYmVmb3JlIGFwcGx5aW5nIGl0LiBUaGlzIHByZXZlbnRzIGFjY2lkZW50YWwgcHJvcGVydHlcbiAgICogb3ZlcndyaXRpbmcgYW5kIGVuc3VyZXMgb25seSBpbnRlbmRlZCBwcm9wZXJ0aWVzIGFyZSBtb2RpZmllZC5cbiAgICpcbiAgICogQHBhcmFtIHtLZXlWYWx1ZX0gaW5zdGFuY2UgLSBUaGUgY29tcG9uZW50IGluc3RhbmNlIG9iamVjdCB0byBwcm9jZXNzXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEMgYXMgQ29tcG9uZW50XG4gICAqICAgcGFydGljaXBhbnQgQiBhcyBOZ3hCYXNlQ29tcG9uZW50XG4gICAqICAgcGFydGljaXBhbnQgUCBhcyBQcm9wcyBPYmplY3RcbiAgICpcbiAgICogICBDLT4+QjogcGFyc2VQcm9wcyhpbnN0YW5jZSlcbiAgICogICBCLT4+QjogR2V0IE9iamVjdC5rZXlzKGluc3RhbmNlKVxuICAgKiAgIGxvb3AgRm9yIGVhY2gga2V5IGluIGluc3RhbmNlXG4gICAqICAgICBCLT4+UDogQ2hlY2sgaWYga2V5IGV4aXN0cyBpbiB0aGlzLnByb3BzXG4gICAqICAgICBhbHQgS2V5IGV4aXN0cyBpbiBwcm9wc1xuICAgKiAgICAgICBCLT4+QjogU2V0IHRoaXNba2V5XSA9IHRoaXMucHJvcHNba2V5XVxuICAgKiAgICAgZWxzZSBLZXkgbm90IGluIHByb3BzXG4gICAqICAgICAgIE5vdGUgb3ZlciBCOiBTa2lwIHRoaXMga2V5XG4gICAqICAgICBlbmRcbiAgICogICBlbmRcbiAgICpcbiAgICogQHByb3RlY3RlZFxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgcHJvdGVjdGVkIHBhcnNlUHJvcHMoaW5zdGFuY2U6IEtleVZhbHVlKTogdm9pZCB7XG4gICAgT2JqZWN0LmtleXMoaW5zdGFuY2UpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYoT2JqZWN0LmtleXModGhpcy5wcm9wcykuaW5jbHVkZXMoa2V5KSlcbiAgICAgICAgKHRoaXMgYXMgS2V5VmFsdWUpW2tleV0gPSB0aGlzLnByb3BzW2tleV07XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBjaGFuZ2VzIHRvIGNvbXBvbmVudCBpbnB1dHNcbiAgICogQHN1bW1hcnkgVGhpcyBBbmd1bGFyIGxpZmVjeWNsZSBob29rIGlzIGNhbGxlZCB3aGVuIGlucHV0IHByb3BlcnRpZXMgY2hhbmdlLlxuICAgKiBJdCByZXNwb25kcyB0byBjaGFuZ2VzIGluIHRoZSBtb2RlbCwgbG9jYWxlLCBvciB0cmFuc2xhdGFibGUgcHJvcGVydGllcyBieVxuICAgKiB1cGRhdGluZyB0aGUgY29tcG9uZW50J3MgaW50ZXJuYWwgc3RhdGUgYWNjb3JkaW5nbHkuIFdoZW4gdGhlIG1vZGVsIGNoYW5nZXMsXG4gICAqIGl0IGNhbGxzIGdldE1vZGVsIHRvIHByb2Nlc3MgdGhlIG5ldyBtb2RlbCBhbmQgZ2V0TG9jYWxlIHRvIHVwZGF0ZSB0aGUgbG9jYWxlLlxuICAgKiBXaGVuIGxvY2FsZSBvciB0cmFuc2xhdGFibGUgcHJvcGVydGllcyBjaGFuZ2UsIGl0IGNhbGxzIGdldExvY2FsZSB0byB1cGRhdGVcbiAgICogdGhlIHRyYW5zbGF0aW9uIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0ge1NpbXBsZUNoYW5nZXN9IGNoYW5nZXMgLSBPYmplY3QgY29udGFpbmluZyBjaGFuZ2VkIHByb3BlcnRpZXNcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1tCYXNlQ29tcG9uZW50UHJvcHMuTU9ERUxdKSB7XG4gICAgICBjb25zdCB7IGN1cnJlbnRWYWx1ZSB9ID0gY2hhbmdlc1tCYXNlQ29tcG9uZW50UHJvcHMuTU9ERUxdO1xuICAgICAgaWYgKGN1cnJlbnRWYWx1ZSkgdGhpcy5nZXRNb2RlbChjdXJyZW50VmFsdWUpO1xuICAgICAgdGhpcy5nZXRMb2NhbGUodGhpcy50cmFuc2xhdGFibGUpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzW0Jhc2VDb21wb25lbnRQcm9wcy5JTklUSUFMSVpFRF0gfHxcbiAgICAgIGNoYW5nZXNbQmFzZUNvbXBvbmVudFByb3BzLkxPQ0FMRV0gfHxcbiAgICAgIGNoYW5nZXNbQmFzZUNvbXBvbmVudFByb3BzLlRSQU5TTEFUQUJMRV1cbiAgICApXG4gICAgICB0aGlzLmdldExvY2FsZSh0aGlzLnRyYW5zbGF0YWJsZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGFwcHJvcHJpYXRlIGxvY2FsZSBzdHJpbmcgYmFzZWQgb24gdGhlIHRyYW5zbGF0YWJsZSBmbGFnIGFuZCBhdmFpbGFibGUgbG9jYWxlcy5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyB3aGljaCBsb2NhbGUgc3RyaW5nIHRvIHVzZSBmb3IgdHJhbnNsYXRpb24gYmFzZWQgb24gdGhlIHRyYW5zbGF0YWJsZSBmbGFnXG4gICAqIGFuZCBhdmFpbGFibGUgbG9jYWxlIHNldHRpbmdzLiBUaGlzIG1ldGhvZCBmaXJzdCBjb252ZXJ0cyB0aGUgdHJhbnNsYXRhYmxlIHBhcmFtZXRlciB0byBhIGJvb2xlYW5cbiAgICogdXNpbmcgdGhlIHN0cmluZ1RvQm9vbGVhbiB1dGlsaXR5IGZ1bmN0aW9uLiBJZiB0cmFuc2xhdGFibGUgaXMgZmFsc2UsIGl0IHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLFxuICAgKiBpbmRpY2F0aW5nIG5vIHRyYW5zbGF0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQuIElmIHRyYW5zbGF0YWJsZSBpcyB0cnVlLCBpdCBjaGVja3MgZm9yIGFuIGV4cGxpY2l0bHlcbiAgICogcHJvdmlkZWQgbG9jYWxlIHZpYSB0aGUgbG9jYWxlIHByb3BlcnR5LiBJZiBubyBleHBsaWNpdCBsb2NhbGUgaXMgYXZhaWxhYmxlLCBpdCBmYWxscyBiYWNrIHRvIHRoZVxuICAgKiBjb21wb25lbnRMb2NhbGUgZGVyaXZlZCBmcm9tIHRoZSBjb21wb25lbnQncyBjbGFzcyBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ09yQm9vbGVhbn0gdHJhbnNsYXRhYmxlIC0gV2hldGhlciB0aGUgY29tcG9uZW50IHNob3VsZCBiZSB0cmFuc2xhdGVkXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGxvY2FsZSBzdHJpbmcgdG8gdXNlIGZvciB0cmFuc2xhdGlvbiwgb3IgZW1wdHkgc3RyaW5nIGlmIG5vdCB0cmFuc2xhdGFibGVcbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQyBhcyBDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBOIGFzIE5neEJhc2VDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBTIGFzIFN0cmluZ1V0aWxzXG4gICAqXG4gICAqICAgQy0+Pk46IGdldExvY2FsZSh0cmFuc2xhdGFibGUpXG4gICAqICAgTi0+PlM6IHN0cmluZ1RvQm9vbGVhbih0cmFuc2xhdGFibGUpXG4gICAqICAgUy0tPj5OOiBSZXR1cm4gYm9vbGVhbiB2YWx1ZVxuICAgKiAgIE4tPj5OOiBTdG9yZSBpbiB0aGlzLnRyYW5zbGF0YWJsZVxuICAgKiAgIGFsdCB0cmFuc2xhdGFibGUgaXMgZmFsc2VcbiAgICogICAgIE4tLT4+QzogUmV0dXJuIGVtcHR5IHN0cmluZ1xuICAgKiAgIGVsc2UgdHJhbnNsYXRhYmxlIGlzIHRydWVcbiAgICogICAgIGFsdCB0aGlzLmxvY2FsZSBpcyBkZWZpbmVkXG4gICAqICAgICAgIE4tLT4+QzogUmV0dXJuIHRoaXMubG9jYWxlXG4gICAqICAgICBlbHNlIHRoaXMubG9jYWxlIGlzIG5vdCBkZWZpbmVkXG4gICAqICAgICAgIE4tLT4+QzogUmV0dXJuIHRoaXMuY29tcG9uZW50TG9jYWxlXG4gICAqICAgICBlbmRcbiAgICogICBlbmRcbiAgICovXG4gIGdldExvY2FsZSh0cmFuc2xhdGFibGU6IFN0cmluZ09yQm9vbGVhbik6IHN0cmluZyB7XG4gICAgdGhpcy50cmFuc2xhdGFibGUgPSBzdHJpbmdUb0Jvb2xlYW4odHJhbnNsYXRhYmxlKTtcbiAgICBpZiAoIXRoaXMudHJhbnNsYXRhYmxlKVxuICAgICAgcmV0dXJuICcnO1xuICAgIGlmICghdGhpcy5sb2NhbGUpXG4gICAgICB0aGlzLmxvY2FsZSA9IHRoaXMuY29tcG9uZW50TG9jYWxlO1xuICAgIHJldHVybiB0aGlzLmxvY2FsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgcm91dGUgZm9yIHRoZSBjb21wb25lbnRcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSByb3V0ZSBwYXRoIGZvciB0aGUgY29tcG9uZW50LCBnZW5lcmF0aW5nIG9uZSBiYXNlZCBvbiB0aGUgbW9kZWxcbiAgICogaWYgbm8gcm91dGUgaXMgZXhwbGljaXRseSBzZXQuIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiBhIHJvdXRlIGlzIGFscmVhZHkgZGVmaW5lZCwgYW5kIGlmIG5vdCxcbiAgICogaXQgY3JlYXRlcyBhIGRlZmF1bHQgcm91dGUgYmFzZWQgb24gdGhlIG1vZGVsJ3MgY29uc3RydWN0b3IgbmFtZS4gVGhlIGdlbmVyYXRlZCByb3V0ZSBmb2xsb3dzXG4gICAqIHRoZSBwYXR0ZXJuICcvbW9kZWwve01vZGVsTmFtZX0nLiBUaGlzIGlzIHVzZWZ1bCBmb3IgYXV0b21hdGljIHJvdXRpbmcgaW4gQ1JVRCBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSByb3V0ZSBwYXRoIGZvciB0aGUgY29tcG9uZW50LCBvciBlbXB0eSBzdHJpbmcgaWYgbm8gcm91dGUgaXMgYXZhaWxhYmxlXG4gICAqL1xuICBnZXRSb3V0ZSgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5yb3V0ZSAmJiB0aGlzLm1vZGVsIGluc3RhbmNlb2YgTW9kZWwpXG4gICAgICB0aGlzLnJvdXRlID0gYC9tb2RlbC8ke3RoaXMubW9kZWw/LmNvbnN0cnVjdG9yLm5hbWV9YDtcbiAgICByZXR1cm4gdGhpcy5yb3V0ZSB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVzb2x2ZXMgYW5kIHNldHMgdGhlIGNvbXBvbmVudCdzIG1vZGVsXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyB0aGUgcHJvdmlkZWQgbW9kZWwgcGFyYW1ldGVyLCB3aGljaCBjYW4gYmUgZWl0aGVyIGEgTW9kZWwgaW5zdGFuY2VcbiAgICogb3IgYSBzdHJpbmcgaWRlbnRpZmllci4gSWYgYSBzdHJpbmcgaXMgcHJvdmlkZWQsIGl0IGF0dGVtcHRzIHRvIHJlc29sdmUgdGhlIGFjdHVhbCBtb2RlbFxuICAgKiBmcm9tIHRoZSBpbmplY3RhYmxlcyByZWdpc3RyeS4gQWZ0ZXIgcmVzb2x2aW5nIHRoZSBtb2RlbCwgaXQgY2FsbHMgc2V0TW9kZWxEZWZpbml0aW9uc1xuICAgKiB0byBjb25maWd1cmUgdGhlIGNvbXBvbmVudCBiYXNlZCBvbiB0aGUgbW9kZWwncyBtZXRhZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBNb2RlbH0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2Ugb3IgaWRlbnRpZmllciBzdHJpbmdcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIGdldE1vZGVsKG1vZGVsOiBzdHJpbmcgfCBNb2RlbCk6IHZvaWQge1xuICAgIGlmICghKG1vZGVsIGluc3RhbmNlb2YgTW9kZWwpKVxuICAgICAgdGhpcy5tb2RlbCA9IGdldEluamVjdGFibGVzUmVnaXN0cnkoKS5nZXQobW9kZWwpIGFzIE1vZGVsO1xuICAgIHRoaXMuc2V0TW9kZWxEZWZpbml0aW9ucyh0aGlzLm1vZGVsIGFzIE1vZGVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29uZmlndXJlcyBjb21wb25lbnQgcHJvcGVydGllcyBiYXNlZCBvbiBtb2RlbCBtZXRhZGF0YVxuICAgKiBAc3VtbWFyeSBFeHRyYWN0cyBhbmQgYXBwbGllcyBjb25maWd1cmF0aW9uIGZyb20gdGhlIG1vZGVsJ3MgZGVjb3JhdG9ycyB0byBzZXQgdXBcbiAgICogdGhlIGNvbXBvbmVudC4gVGhpcyBtZXRob2QgdXNlcyB0aGUgcmVuZGVyaW5nIGVuZ2luZSB0byByZXRyaWV2ZSBkZWNvcmF0b3IgbWV0YWRhdGFcbiAgICogZnJvbSB0aGUgbW9kZWwsIHRoZW4gY29uZmlndXJlcyB0aGUgY29tcG9uZW50J3MgbWFwcGVyIGFuZCBpdGVtIHByb3BlcnRpZXMgYWNjb3JkaW5nbHkuXG4gICAqIEl0IGVuc3VyZXMgdGhlIHJvdXRlIGlzIHByb3Blcmx5IHNldCBhbmQgbWVyZ2VzIHZhcmlvdXMgcHJvcGVydGllcyBmcm9tIHRoZSBtb2RlbCdzXG4gICAqIG1ldGFkYXRhIGludG8gdGhlIGNvbXBvbmVudCdzIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7TW9kZWx9IG1vZGVsIC0gVGhlIG1vZGVsIHRvIGV4dHJhY3QgY29uZmlndXJhdGlvbiBmcm9tXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzZXRNb2RlbERlZmluaXRpb25zKG1vZGVsOiBNb2RlbCk6IHZvaWQge1xuICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIE1vZGVsKSB7XG4gICAgICB0aGlzLmdldFJvdXRlKCk7XG4gICAgICB0aGlzLm1vZGVsID0gbW9kZWw7XG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMucmVuZGVyaW5nRW5naW5lLmdldERlY29yYXRvcnModGhpcy5tb2RlbCBhcyBNb2RlbCwge30pO1xuICAgICAgY29uc3R7IHByb3BzLCBpdGVtLCBjaGlsZHJlbiB9ID0gZmllbGQ7XG4gICAgICB0aGlzLnByb3BzID0gT2JqZWN0LmFzc2lnbihwcm9wcyB8fCB7fSwge2NoaWxkcmVuOiBjaGlsZHJlbiB8fCBbXX0pO1xuICAgICAgaWYoaXRlbT8ucHJvcHM/LlsnbWFwcGVyJ10pXG4gICAgICAgIHRoaXMubWFwcGVyID0gaXRlbT8ucHJvcHMhWydtYXBwZXInXSB8fCB7fTtcbiAgICAgIHRoaXMuaXRlbSA9IHtcbiAgICAgICAgdGFnOiBpdGVtPy50YWcgfHwgJycsXG4gICAgICAgIC4uLml0ZW0/LnByb3BzLFxuICAgICAgICAuLi4odGhpcy5tYXBwZXIgPyB7bWFwcGVyOiB0aGlzLm1hcHBlcn0gOiB7fSksXG4gICAgICAgIC4uLnsgcm91dGU6IGl0ZW0/LnByb3BzPy5bJ3JvdXRlJ10gfHwgdGhpcy5yb3V0ZSB9LFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBjb21wb25lbnRcbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgb25lLXRpbWUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGNvbXBvbmVudC4gVGhpcyBtZXRob2QgY2hlY2tzIGlmXG4gICAqIHRoZSBjb21wb25lbnQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB0byBwcmV2ZW50IGR1cGxpY2F0ZSBpbml0aWFsaXphdGlvbi5cbiAgICogV2hlbiBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lLCBpdCBzZXRzIHRoZSBpbml0aWFsaXplZCBmbGFnIHRvIHRydWUgYW5kIGxvZ3NcbiAgICogYW4gaW5pdGlhbGl6YXRpb24gbWVzc2FnZSB3aXRoIHRoZSBjb21wb25lbnQgbmFtZS4gVGhpcyBtZXRob2QgaXMgdHlwaWNhbGx5IGNhbGxlZFxuICAgKiBkdXJpbmcgdGhlIGNvbXBvbmVudCdzIGxpZmVjeWNsZSBzZXR1cC5cbiAgICovXG4gIGluaXRpYWxpemUoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgY3VzdG9tIGV2ZW50cyBmcm9tIGNoaWxkIGNvbXBvbmVudHMuXG4gICAqIEBzdW1tYXJ5IFJlY2VpdmVzIGV2ZW50cyBmcm9tIGNoaWxkIHJlbmRlcmVyIGNvbXBvbmVudHMgYW5kIGZvcndhcmRzIHRoZW0gdG8gcGFyZW50XG4gICAqIGNvbXBvbmVudHMgdGhyb3VnaCB0aGUgbGlzdGVuRXZlbnQgb3V0cHV0LiBUaGlzIGNyZWF0ZXMgYW4gZXZlbnQgcHJvcGFnYXRpb24gY2hhaW5cbiAgICogdGhhdCBhbGxvd3MgZXZlbnRzIHRvIGJ1YmJsZSB1cCB0aHJvdWdoIHRoZSBjb21wb25lbnQgaGllcmFyY2h5LCBlbmFibGluZyBjb29yZGluYXRlZFxuICAgKiByZXNwb25zZXMgdG8gdXNlciBpbnRlcmFjdGlvbnMgYWNyb3NzIHRoZSBsYXlvdXQgc3RydWN0dXJlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlbmRlcmVyQ3VzdG9tRXZlbnR9IGV2ZW50IC0gVGhlIGN1c3RvbSBldmVudCBmcm9tIGEgY2hpbGQgY29tcG9uZW50XG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2hpbGQgQ29tcG9uZW50XG4gICAqICAgcGFydGljaXBhbnQgTCBhcyBOZ3hCYXNlQ29tcG9uZW50XG4gICAqICAgcGFydGljaXBhbnQgUCBhcyBQYXJlbnQgQ29tcG9uZW50XG4gICAqXG4gICAqICAgQy0+Pkw6IEVtaXQgUmVuZGVyZXJDdXN0b21FdmVudFxuICAgKiAgIEwtPj5MOiBoYW5kbGVFdmVudChldmVudClcbiAgICogICBMLT4+UDogbGlzdGVuRXZlbnQuZW1pdChldmVudClcbiAgICogICBOb3RlIG92ZXIgUDogSGFuZGxlIGV2ZW50IGluIHBhcmVudFxuICAgKlxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlRXZlbnQoZXZlbnQ6IFJlbmRlcmVyQ3VzdG9tRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RlbkV2ZW50LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUcmFja3MgaXRlbXMgaW4gbmdGb3IgbG9vcHMgZm9yIG9wdGltYWwgY2hhbmdlIGRldGVjdGlvbi5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYSB0cmFja2luZyBmdW5jdGlvbiBmb3IgQW5ndWxhcidzICpuZ0ZvciBkaXJlY3RpdmUgdG8gb3B0aW1pemUgcmVuZGVyaW5nXG4gICAqIHBlcmZvcm1hbmNlLiBUaGlzIG1ldGhvZCBnZW5lcmF0ZXMgdW5pcXVlIGlkZW50aWZpZXJzIGZvciBsaXN0IGl0ZW1zIGJhc2VkIG9uIHRoZWlyIGluZGV4XG4gICAqIGFuZCBjb250ZW50LCBhbGxvd2luZyBBbmd1bGFyIHRvIGVmZmljaWVudGx5IHRyYWNrIGNoYW5nZXMgYW5kIG1pbmltaXplIERPTSBtYW5pcHVsYXRpb25zXG4gICAqIGR1cmluZyBsaXN0IHVwZGF0ZXMuIFRoZSB0cmFja2luZyBmdW5jdGlvbiBpcyBlc3NlbnRpYWwgZm9yIG1haW50YWluaW5nIGNvbXBvbmVudCBzdGF0ZVxuICAgKiBhbmQgcHJldmVudGluZyB1bm5lY2Vzc2FyeSByZS1yZW5kZXJpbmcgb2YgdW5jaGFuZ2VkIGl0ZW1zLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gaW4gdGhlIGxpc3RcbiAgICogQHBhcmFtIHtLZXlWYWx1ZSB8IHN0cmluZyB8IG51bWJlcn0gaXRlbSAtIFRoZSBpdGVtIGRhdGEgdG8gdHJhY2tcbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bWJlcn0gQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGl0ZW1cbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIHRyYWNrSXRlbUZuKGluZGV4OiBudW1iZXIsIGl0ZW06IEtleVZhbHVlIHwgc3RyaW5nIHwgbnVtYmVyKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICByZXR1cm4gYCR7aW5kZXh9LSR7aXRlbX1gO1xuICB9XG59XG4iXX0=
540
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmd4QmFzZUNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL05neEJhc2VDb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLEtBQUssRUFDTCxTQUFTLEVBQ1QsTUFBTSxFQUNOLFNBQVMsRUFDVCxVQUFVLEVBR1YsTUFBTSxFQUNOLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0QixXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDaEIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkQsT0FBTyxFQUVMLGFBQWEsRUFDYixhQUFhLEVBQ2QsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFMUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWxELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0FBRWhEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkRHO0FBTUgsTUFBTSxPQUFnQixnQkFBZ0I7SUFzU3BDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FpQ0c7SUFDSCx5REFBeUQ7SUFDekQsWUFBeUQsUUFBZ0I7UUFBaEIsYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQWhRekU7Ozs7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TUFBTTsyQkFBQyxlQUFlO3lDQTdUN0MsU0FBUztzQkFEUixTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFpQzFELFVBQVU7c0JBRFQsS0FBSztnQkFZTixLQUFLO3NCQURKLEtBQUs7Z0JBZ0NOLEtBQUs7c0JBREosS0FBSztnQkFnQk4sSUFBSTtzQkFESCxLQUFLO2dCQWFOLEVBQUU7c0JBREQsS0FBSztnQkFZTixLQUFLO3NCQURKLEtBQUs7Z0JBWU4sVUFBVTtzQkFEVCxLQUFLO2dCQVlOLEdBQUc7c0JBREYsS0FBSztnQkFZTixNQUFNO3NCQURMLEtBQUs7Z0JBZU4sTUFBTTtzQkFETCxLQUFLO2dCQWVOLFlBQVk7c0JBRFgsS0FBSztnQkFlTixTQUFTO3NCQURSLEtBQUs7Z0JBZ0JOLElBQUk7c0JBREgsS0FBSztnQkE0Qk4sV0FBVztzQkFEVixLQUFLO2dCQXlCTixXQUFXO3NCQURWLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBJbnB1dCxcbiAgQ29tcG9uZW50LFxuICBJbmplY3QsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBLZXlWYWx1ZSwgUmVuZGVyZXJDdXN0b21FdmVudCwgU3RyaW5nT3JCb29sZWFuIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge1xuICBnZW5lcmF0ZVJhbmRvbVZhbHVlLFxuICBnZXRJbmplY3RhYmxlc1JlZ2lzdHJ5LFxuICBnZXRPbldpbmRvdyxcbiAgaXNEZXZlbG9wbWVudE1vZGUsXG4gIHN0cmluZ1RvQm9vbGVhblxufSBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcbmltcG9ydCB7IGdldExvY2FsZUNvbnRleHQgfSBmcm9tICcuLi9pMThuL0xvYWRlcic7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gJ0BkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvbic7XG5pbXBvcnQge1xuICBDcnVkT3BlcmF0aW9ucyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5c1xufSBmcm9tICdAZGVjYWYtdHMvZGItZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50UHJvcHMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBOZ3hSZW5kZXJpbmdFbmdpbmUgfSBmcm9tICcuL05neFJlbmRlcmluZ0VuZ2luZSc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZGVjYWYtdHMvbG9nZ2luZyc7XG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuLi9mb3ItYW5ndWxhci5tb2R1bGUnO1xuaW1wb3J0IHsgRGVjYWZSZXBvc2l0b3J5IH0gZnJvbSAnLi4vY29tcG9uZW50cy9saXN0L2NvbnN0YW50cyc7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSAnQGRlY2FmLXRzL2NvcmUnO1xuaW1wb3J0IHsgUmFtQWRhcHRlciB9IGZyb20gJ0BkZWNhZi10cy9jb3JlL3JhbSc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEJhc2UgY29tcG9uZW50IGNsYXNzIHRoYXQgcHJvdmlkZXMgY29tbW9uIGZ1bmN0aW9uYWxpdHkgZm9yIGFsbCBEZWNhZiBjb21wb25lbnRzLlxuICogQHN1bW1hcnkgVGhlIE5neEJhc2VDb21wb25lbnQgc2VydmVzIGFzIHRoZSBmb3VuZGF0aW9uIGZvciBhbGwgRGVjYWYgVUkgY29tcG9uZW50cywgcHJvdmlkaW5nXG4gKiBzaGFyZWQgZnVuY3Rpb25hbGl0eSBmb3IgbG9jYWxpemF0aW9uLCBlbGVtZW50IHJlZmVyZW5jZXMsIGFuZCBzdHlsaW5nLiBUaGlzIGFic3RyYWN0IGNsYXNzXG4gKiBpbXBsZW1lbnRzIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIHRoYXQgYXJlIHVzZWQgYWNyb3NzIHRoZSBjb21wb25lbnQgbGlicmFyeSwgZW5zdXJpbmdcbiAqIGNvbnNpc3RlbnQgYmVoYXZpb3IgYW5kIHJlZHVjaW5nIGNvZGUgZHVwbGljYXRpb24uIENvbXBvbmVudHMgdGhhdCBleHRlbmQgdGhpcyBjbGFzcyBpbmhlcml0XG4gKiBpdHMgY2FwYWJpbGl0aWVzIGZvciBoYW5kbGluZyB0cmFuc2xhdGlvbnMsIGFjY2Vzc2luZyBET00gZWxlbWVudHMsIGFuZCBhcHBseWluZyBjdXN0b20gc3R5bGluZy5cbiAqXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgdGhpcyBjb21wb25lbnQgd29ya3Mgd2l0aFxuICogQHBhcmFtIHtzdHJpbmd9IGluc3RhbmNlIC0gVGhlIGNvbXBvbmVudCBpbnN0YW5jZSB0b2tlbiB1c2VkIGZvciBpZGVudGlmaWNhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsZSAtIFRoZSBsb2NhbGUgdG8gYmUgdXNlZCBmb3IgdHJhbnNsYXRpb25zXG4gKiBAcGFyYW0ge1N0cmluZ09yQm9vbGVhbn0gdHJhbnNsYXRhYmxlIC0gV2hldGhlciB0aGUgY29tcG9uZW50IHNob3VsZCBiZSB0cmFuc2xhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIC0gQWRkaXRpb25hbCBDU1MgY2xhc3NlcyB0byBhcHBseSB0byB0aGUgY29tcG9uZW50XG4gKiBAcGFyYW0ge1wiaW9zXCIgfCBcIm1kXCIgfCB1bmRlZmluZWR9IG1vZGUgLSBDb21wb25lbnQgcGxhdGZvcm0gc3R5bGVcbiAqXG4gKiBAY29tcG9uZW50IE5neEJhc2VDb21wb25lbnRcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdhcHAtbXktY29tcG9uZW50JyxcbiAqICAgdGVtcGxhdGVVcmw6ICcuL215LWNvbXBvbmVudC5jb21wb25lbnQuaHRtbCcsXG4gKiAgIHN0eWxlVXJsczogWycuL215LWNvbXBvbmVudC5jb21wb25lbnQuc2NzcyddXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IGV4dGVuZHMgTmd4QmFzZUNvbXBvbmVudCB7XG4gKiAgIGNvbnN0cnVjdG9yKEBJbmplY3QoJ2luc3RhbmNlVG9rZW4nKSBpbnN0YW5jZTogc3RyaW5nKSB7XG4gKiAgICAgc3VwZXIoaW5zdGFuY2UpO1xuICogICB9XG4gKlxuICogICBuZ09uSW5pdCgpIHtcbiAqICAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAqICAgICAvLyBDb21wb25lbnQtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb25cbiAqICAgfVxuICogfVxuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcCBhcyBBcHBsaWNhdGlvblxuICogICBwYXJ0aWNpcGFudCBDb21wIGFzIENvbXBvbmVudFxuICogICBwYXJ0aWNpcGFudCBCYXNlIGFzIE5neEJhc2VDb21wb25lbnRcbiAqICAgcGFydGljaXBhbnQgRW5naW5lIGFzIE5neFJlbmRlcmluZ0VuZ2luZVxuICpcbiAqICAgQXBwLT4+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==
@@ -132,4 +132,4 @@ export class NgxCrudFormField {
132
132
  }
133
133
  }
134
134
  }
135
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmd4Q3J1ZEZvcm1GaWVsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL05neENydWRGb3JtRmllbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFzQyxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU3RixPQUFPLEVBQWtCLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV2RixPQUFPLEVBQWMsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU3Qzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFnQixnQkFBZ0I7SUFBdEM7UUF3RFUscUJBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFNUMsb0NBQStCLEdBQVksS0FBSyxDQUFDO1FBUXpELDZCQUE2QjtRQUU3Qjs7OztXQUlHO1FBQ0gsT0FBRSxHQUFHLEVBQUUsQ0FBQztRQUVSOzs7O1dBSUc7UUFDSCxnRUFBZ0U7UUFDaEUsYUFBUSxHQUFrQixHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFFbkM7Ozs7V0FJRztRQUNILGdFQUFnRTtRQUNoRSxZQUFPLEdBQWtCLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQW1HcEMsQ0FBQztJQWpHQzs7OztPQUlHO0lBQ0gsVUFBVSxDQUFDLEdBQVc7UUFDcEIsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxnQkFBZ0IsQ0FBQyxFQUFpQjtRQUNoQyxJQUFJLENB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QUFPLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFVBQVUsS0FBSyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFHLElBQWlCLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ25JLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDcnVkT3BlcmF0aW9uS2V5cywgRmllbGRQcm9wZXJ0aWVzLCBSZW5kZXJpbmdFcnJvciB9IGZyb20gJ0BkZWNhZi10cy91aS1kZWNvcmF0b3JzJztcbmltcG9ydCB7IEtleVZhbHVlLCBQb3NzaWJsZUlucHV0VHlwZXMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IENydWRPcGVyYXRpb25zLCBJbnRlcm5hbEVycm9yLCBPcGVyYXRpb25LZXlzIH0gZnJvbSAnQGRlY2FmLXRzL2RiLWRlY29yYXRvcnMnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBFbGVtZW50UmVmLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5neEZvcm1TZXJ2aWNlIH0gZnJvbSAnLi9OZ3hGb3JtU2VydmljZSc7XG5pbXBvcnQgeyBzZiB9IGZyb20gJ0BkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvbic7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBFdmVudENvbnN0YW50cyB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBAY2xhc3MgTmd4Q3J1ZEZvcm1GaWVsZFxuICogQGltcGxlbWVudHMge0ZpZWxkUHJvcGVydGllc31cbiAqIEBpbXBsZW1lbnRzIHtDb250cm9sVmFsdWVBY2Nlc3Nvcn1cbiAqIEBzdW1tYXJ5IEFic3RyYWN0IGNsYXNzIHJlcHJlc2VudGluZyBhIENSVUQgZm9ybSBmaWVsZCBmb3IgQW5ndWxhciBhcHBsaWNhdGlvbnNcbiAqIEBkZXNjcmlwdGlvbiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uIGZvciBDUlVEIGZvcm0gZmllbGRzIGluIEFuZ3VsYXIsXG4gKiBpbXBsZW1lbnRpbmcgYm90aCBDcnVkRm9ybUZpZWxkIGFuZCBDb250cm9sVmFsdWVBY2Nlc3NvciBpbnRlcmZhY2VzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTmd4Q3J1ZEZvcm1GaWVsZCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGaWVsZFByb3BlcnRpZXMge1xuICAvKipcbiAgICogQHN1bW1hcnkgUmVmZXJlbmNlIHRvIHRoZSBjb21wb25lbnQncyBlbGVtZW50XG4gICAqIEBkZXNjcmlwdGlvbiBFbGVtZW50UmVmIHJlcHJlc2VudGluZyB0aGUgY29tcG9uZW50J3MgbmF0aXZlIGVsZW1lbnRcbiAgICovXG4gIGNvbXBvbmVudCE6IEVsZW1lbnRSZWY7XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEN1cnJlbnQgQ1JVRCBvcGVyYXRpb25cbiAgICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgQ1JVRCBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkXG4gICAqL1xuICBvcGVyYXRpb24hOiBDcnVkT3BlcmF0aW9ucztcblxuICAvKipcbiAgICogQHN1bW1hcnkgRm9ybSBncm91cCBmb3IgdGhlIGZpZWxkXG4gICAqIEBkZXNjcmlwdGlvbiBBbmd1bGFyIEZvcm1Hcm91cCBpbnN0YW5jZSBmb3IgdGhlIGZpZWxkXG4gICAqL1xuICBmb3JtR3JvdXAhOiBGb3JtR3JvdXAgfCB1bmRlZmluZWQ7XG5cbiAgZm9ybUNvbnRyb2whOiBGb3JtQ29udHJvbDtcblxuICBuYW1lITogc3RyaW5nO1xuXG4gIHBhdGghOiBzdHJpbmc7XG5cbiAgY2hpbGRPZj86IHN0cmluZztcblxuICB0eXBlITogUG9zc2libGVJbnB1dFR5cGVzO1xuXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcblxuICB1aWQ/OiBzdHJpbmc7XG5cbiAgLy8gVmFsaWRhdGlvblxuXG4gIGZvcm1hdD86IHN0cmluZztcbiAgaGlkZGVuPzogYm9vbGVhbiB8IENydWRPcGVyYXRpb25LZXlzW107XG4gIG1heD86IG51bWJlciB8IERhdGU7XG4gIG1heGxlbmd0aD86IG51bWJlcjtcbiAgbWluPzogbnVtYmVyIHwgRGF0ZTtcbiAgbWlubGVuZ3RoPzogbnVtYmVyO1xuICBwYXR0ZXJuPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICByZWFkb25seT86IGJvb2xlYW47XG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgc3RlcD86IG51bWJlcjtcbiAgZXF1YWxzPzogc3RyaW5nO1xuICBkaWZmZXJlbnQ/OiBzdHJpbmc7XG4gIGxlc3NUaGFuPzogc3RyaW5nO1xuICBsZXNzVGhhbk9yRXF1YWw/OiBzdHJpbmc7XG4gIGdyZWF0ZXJUaGFuPzogc3RyaW5nO1xuICBncmVhdGVyVGhhbk9yRXF1YWw/OiBzdHJpbmc7XG5cbiAgdmFsdWUhOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlO1xuXG4gIG11bHRpcGxlITogYm9vbGVhbjtcblxuICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2UgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG5cbiAgcHJpdmF0ZSB2YWxpZGF0aW9uRXJyb3JFdmVudERpc3BhdGVjaGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFBhcmVudCBIVE1MIGVsZW1lbnRcbiAgICogQGRlc2NyaXB0aW9uIFJlZmVyZW5jZSB0byB0aGUgcGFyZW50IEhUTUwgZWxlbWVudCBvZiB0aGUgZmllbGRcbiAgICovXG4gIHByb3RlY3RlZCBwYXJlbnQ/OiBIVE1MRWxlbWVudDtcblxuICAvLyBwcm90ZWN0ZWQgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBTdHJpbmcgZm9ybWF0dGluZyBmdW5jdGlvblxuICAgKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBzZiBmdW5jdGlvbiBmb3IgZXJyb3IgbWVzc2FnZSBmb3JtYXR0aW5nXG4gICAqIEBwcm9wIHtmdW5jdGlvbihzdHJpbmcsIC4uLnN0cmluZyk6IHN0cmluZ30gc2YgLSBTdHJpbmcgZm9ybWF0dGluZyBmdW5jdGlvblxuICAgKi9cbiAgc2YgPSBzZjtcblxuICAvKipcbiAgICogQHN1bW1hcnkgQ2hhbmdlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgZmllbGQgdmFsdWUgY2hhbmdlc1xuICAgKiBAcHJvcGVydHkge2Z1bmN0aW9uKCk6IHVua25vd259IG9uQ2hhbmdlIC0gb25DaGFuZ2UgZXZlbnQgaGFuZGxlclxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBvbkNoYW5nZTogKCkgPT4gdW5rbm93biA9ICgpID0+IHt9O1xuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBUb3VjaCBjYWxsYmFjayBmdW5jdGlvblxuICAgKiBAZGVzY3JpcHRpb24gRnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGZpZWxkIGlzIHRvdWNoZWRcbiAgICogQHByb3BlcnR5IHtmdW5jdGlvbigpOiB1bmtub3dufSBvblRvdWNoIC0gb25Ub3VjaCBldmVudCBoYW5kbGVyXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIG9uVG91Y2g6ICgpID0+IHVua25vd24gPSAoKSA9PiB7fTtcblxuICAvKipcbiAgICogQHN1bW1hcnkgV3JpdGUgdmFsdWUgdG8gdGhlIGZpZWxkXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iaiAtIFRoZSB2YWx1ZSB0byBiZSBzZXRcbiAgICovXG4gIHdyaXRlVmFsdWUob2JqOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gb2JqO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVyIGNoYW5nZSBjYWxsYmFja1xuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGZpZWxkIHZhbHVlIGNoYW5nZXNcbiAgICogQHBhcmFtIHtmdW5jdGlvbigpOiB1bmtub3dufSBmbiAtIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gY2hhbmdlXG4gICAqL1xuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoKSA9PiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVyIHRvdWNoIGNhbGxiYWNrXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZmllbGQgaXMgdG91Y2hlZFxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCk6IHVua25vd259IGZuIC0gVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiB0b3VjaFxuICAgKi9cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2ggPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBTZXQgZGlzYWJsZWQgc3RhdGVcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGRpc2FibGVkIHN0YXRlIG9mIHRoZSBmaWVsZFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzRGlzYWJsZWQgLSBXaGV0aGVyIHRoZSBmaWVsZCBzaG91bGQgYmUgZGlzYWJsZWRcbiAgICovXG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBBZnRlciB2aWV3IGluaXRpYWxpemF0aW9uIGxvZ2ljXG4gICAqIEBkZXNjcmlwdGlvbiBQZXJmb3JtcyBuZWNlc3Nhcnkgc2V0dXAgYWZ0ZXIgdGhlIHZpZXcgaGFzIGJlZW4gaW5pdGlhbGl6ZWRcbiAgICogQHJldHVybnMge0hUTUxFbGVtZW50fSBUaGUgcGFyZW50IGVsZW1lbnQgb2YgdGhlIGZpZWxkXG4gICAqL1xuICBhZnRlclZpZXdJbml0KCk6IEhUTUxFbGVtZW50IHtcbiAgICBsZXQgcGFyZW50OiBIVE1MRWxlbWVudDtcbiAgICBzd2l0Y2ggKHRoaXMub3BlcmF0aW9uKSB7XG4gICAgICBjYXNlIE9wZXJhdGlvbktleXMuUkVBRDpcbiAgICAgIGNhc2UgT3BlcmF0aW9uS2V5cy5ERUxFVEU6XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgICBjYXNlIE9wZXJhdGlvbktleXMuQ1JFQVRFOlxuICAgICAgY2FzZSBPcGVyYXRpb25LZXlzLlVQREFURTpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJlbnQgPSBOZ3hGb3JtU2VydmljZS5nZXRQYXJlbnRFbCh0aGlzLmNvbXBvbmVudC5uYXRpdmVFbGVtZW50LCAnZGl2Jyk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUmVuZGVyaW5nRXJyb3IoYFVuYWJsZSB0byByZXRyaWV2ZSBwYXJlbnQgZm9ybSBlbGVtZW50IGZvciB0aGUgJHt0aGlzLm9wZXJhdGlvbn06ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogZX1gKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOZ3hGb3JtU2VydmljZS5yZWdpc3RlcihwYXJlbnQuaWQsIHRoaXMuZm9ybUdyb3VwLCB0aGlzIGFzIEFuZ3VsYXJGaWVsZERlZmluaXRpb24pO1xuICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEludmFsaWQgb3BlcmF0aW9uOiAke3RoaXMub3BlcmF0aW9ufWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBDbGVhbnVwIG9uIGNvbXBvbmVudCBkZXN0cnVjdGlvblxuICAgKiBAZGVzY3JpcHRpb24gVW5yZWdpc3RlcnMgdGhlIGZpZWxkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBkZXN0cm95ZWRcbiAgICovXG4gIG9uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZih0aGlzLmZvcm1Hcm91cClcbiAgICAgIE5neEZvcm1TZXJ2aWNlLnVucmVnaXN0ZXIodGhpcy5mb3JtR3JvdXApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEdldCBmaWVsZCBlcnJvcnNcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhbGwgZXJyb3JzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmllbGRcbiAgICogQHJldHVybnMge3N0cmluZ3x2b2lkfSBBbiBhcnJheSBvZiBlcnJvciBvYmplY3RzXG4gICAqL1xuICBnZXRFcnJvcnMocGFyZW50OiBIVE1MRWxlbWVudCk6IHN0cmluZyB8IHZvaWQge1xuICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5mb3JtQ29udHJvbDtcbiAgICBjb25zdCBhY2NvcmRpb25Db21wb25lbnQgPSBwYXJlbnQuY2xvc2VzdCgnbmd4LWRlY2FmLWZpZWxkc2V0Jyk/LnF1ZXJ5U2VsZWN0b3IoJ2lvbi1hY2NvcmRpb24tZ3JvdXAnKTtcbiAgICBpZigoIWZvcm1Db250cm9sLnByaXN0aW5lIHx8IGZvcm1Db250cm9sLnRvdWNoZWQpICYmICFmb3JtQ29udHJvbC52YWxpZCkge1xuICAgICAgY29uc3QgZXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+W10gPSBPYmplY3Qua2V5cyhmb3JtQ29udHJvbC5lcnJvcnMgPz8ge30pLm1hcChrZXkgPT4gKHtcbiAgICAgICAga2V5OiBrZXksXG4gICAgICAgIG1lc3NhZ2U6IGtleSxcbiAgICAgIH0pKTtcbiAgICAgIGlmKGVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgaWYoYWNjb3JkaW9uQ29tcG9uZW50ICYmICF0aGlzLnZhbGlkYXRpb25FcnJvckV2ZW50RGlzcGF0ZWNoZWQpIHtcbiAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JFdmVudCA9IG5ldyBDdXN0b21FdmVudChFdmVudENvbnN0YW50cy5WQUxJREFUSU9OX0VSUk9SLCB7XG4gICAgICAgICAgICBkZXRhaWw6IHtmaWVsZE5hbWU6IHRoaXMubmFtZSwgaGFzRXJyb3JzOiB0cnVlfSxcbiAgICAgICAgICAgIGJ1YmJsZXM6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBhY2NvcmRpb25Db21wb25lbnQuZGlzcGF0Y2hFdmVudCh2YWxpZGF0aW9uRXJyb3JFdmVudCk7XG4gICAgICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3JFdmVudERpc3BhdGVjaGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yKGNvbnN0IGVycm9yIG9mIGVycm9ycylcbiAgICAgICAgcmV0dXJuIGAqICR7dGhpcy5zZih0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgZXJyb3JzLiR7ZXJyb3I/LlsnbWVzc2FnZSddfWApLCAodGhpcyBhcyBLZXlWYWx1ZSlbZXJyb3I/Llsna2V5J11dID8/IFwiXCIpfWA7XG4gICAgfVxuICB9XG59XG4iXX0=
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmd4Q3J1ZEZvcm1GaWVsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL05neENydWRGb3JtRmllbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFzQyxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU3RixPQUFPLEVBQWtCLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV2RixPQUFPLEVBQWMsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU3Qzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFnQixnQkFBZ0I7SUFBdEM7UUF3RFkscUJBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFOUMsb0NBQStCLEdBQVksS0FBSyxDQUFDO1FBUXpELDZCQUE2QjtRQUU3Qjs7OztXQUlHO1FBQ0gsT0FBRSxHQUFHLEVBQUUsQ0FBQztRQUVSOzs7O1dBSUc7UUFDSCxnRUFBZ0U7UUFDaEUsYUFBUSxHQUFrQixHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFFbkM7Ozs7V0FJRztRQUNILGdFQUFnRTtRQUNoRSxZQUFPLEdBQWtCLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQW1HcEMsQ0FBQztJQWpHQzs7OztPQUlHO0lBQ0gsVUFBVSxDQUFDLEdBQVc7UUFDcEIsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxnQkFBZ0IsQ0FBQyxFQUFpQjtRQUNoQyxJQUFJLENB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QUFPLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFVBQVUsS0FBSyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFHLElBQWlCLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ25JLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDcnVkT3BlcmF0aW9uS2V5cywgRmllbGRQcm9wZXJ0aWVzLCBSZW5kZXJpbmdFcnJvciB9IGZyb20gJ0BkZWNhZi10cy91aS1kZWNvcmF0b3JzJztcbmltcG9ydCB7IEtleVZhbHVlLCBQb3NzaWJsZUlucHV0VHlwZXMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IENydWRPcGVyYXRpb25zLCBJbnRlcm5hbEVycm9yLCBPcGVyYXRpb25LZXlzIH0gZnJvbSAnQGRlY2FmLXRzL2RiLWRlY29yYXRvcnMnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBFbGVtZW50UmVmLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5neEZvcm1TZXJ2aWNlIH0gZnJvbSAnLi9OZ3hGb3JtU2VydmljZSc7XG5pbXBvcnQgeyBzZiB9IGZyb20gJ0BkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvbic7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBFdmVudENvbnN0YW50cyB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBAY2xhc3MgTmd4Q3J1ZEZvcm1GaWVsZFxuICogQGltcGxlbWVudHMge0ZpZWxkUHJvcGVydGllc31cbiAqIEBpbXBsZW1lbnRzIHtDb250cm9sVmFsdWVBY2Nlc3Nvcn1cbiAqIEBzdW1tYXJ5IEFic3RyYWN0IGNsYXNzIHJlcHJlc2VudGluZyBhIENSVUQgZm9ybSBmaWVsZCBmb3IgQW5ndWxhciBhcHBsaWNhdGlvbnNcbiAqIEBkZXNjcmlwdGlvbiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uIGZvciBDUlVEIGZvcm0gZmllbGRzIGluIEFuZ3VsYXIsXG4gKiBpbXBsZW1lbnRpbmcgYm90aCBDcnVkRm9ybUZpZWxkIGFuZCBDb250cm9sVmFsdWVBY2Nlc3NvciBpbnRlcmZhY2VzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTmd4Q3J1ZEZvcm1GaWVsZCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGaWVsZFByb3BlcnRpZXMge1xuICAvKipcbiAgICogQHN1bW1hcnkgUmVmZXJlbmNlIHRvIHRoZSBjb21wb25lbnQncyBlbGVtZW50XG4gICAqIEBkZXNjcmlwdGlvbiBFbGVtZW50UmVmIHJlcHJlc2VudGluZyB0aGUgY29tcG9uZW50J3MgbmF0aXZlIGVsZW1lbnRcbiAgICovXG4gIGNvbXBvbmVudCE6IEVsZW1lbnRSZWY7XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEN1cnJlbnQgQ1JVRCBvcGVyYXRpb25cbiAgICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgQ1JVRCBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkXG4gICAqL1xuICBvcGVyYXRpb24hOiBDcnVkT3BlcmF0aW9ucztcblxuICAvKipcbiAgICogQHN1bW1hcnkgRm9ybSBncm91cCBmb3IgdGhlIGZpZWxkXG4gICAqIEBkZXNjcmlwdGlvbiBBbmd1bGFyIEZvcm1Hcm91cCBpbnN0YW5jZSBmb3IgdGhlIGZpZWxkXG4gICAqL1xuICBmb3JtR3JvdXAhOiBGb3JtR3JvdXAgfCB1bmRlZmluZWQ7XG5cbiAgZm9ybUNvbnRyb2whOiBGb3JtQ29udHJvbDtcblxuICBuYW1lITogc3RyaW5nO1xuXG4gIHBhdGghOiBzdHJpbmc7XG5cbiAgY2hpbGRPZj86IHN0cmluZztcblxuICB0eXBlITogUG9zc2libGVJbnB1dFR5cGVzO1xuXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcblxuICB1aWQ/OiBzdHJpbmc7XG5cbiAgLy8gVmFsaWRhdGlvblxuXG4gIGZvcm1hdD86IHN0cmluZztcbiAgaGlkZGVuPzogYm9vbGVhbiB8IENydWRPcGVyYXRpb25LZXlzW107XG4gIG1heD86IG51bWJlciB8IERhdGU7XG4gIG1heGxlbmd0aD86IG51bWJlcjtcbiAgbWluPzogbnVtYmVyIHwgRGF0ZTtcbiAgbWlubGVuZ3RoPzogbnVtYmVyO1xuICBwYXR0ZXJuPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICByZWFkb25seT86IGJvb2xlYW47XG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgc3RlcD86IG51bWJlcjtcbiAgZXF1YWxzPzogc3RyaW5nO1xuICBkaWZmZXJlbnQ/OiBzdHJpbmc7XG4gIGxlc3NUaGFuPzogc3RyaW5nO1xuICBsZXNzVGhhbk9yRXF1YWw/OiBzdHJpbmc7XG4gIGdyZWF0ZXJUaGFuPzogc3RyaW5nO1xuICBncmVhdGVyVGhhbk9yRXF1YWw/OiBzdHJpbmc7XG5cbiAgdmFsdWUhOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlO1xuXG4gIG11bHRpcGxlITogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgdHJhbnNsYXRlU2VydmljZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcblxuICBwcml2YXRlIHZhbGlkYXRpb25FcnJvckV2ZW50RGlzcGF0ZWNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQHN1bW1hcnkgUGFyZW50IEhUTUwgZWxlbWVudFxuICAgKiBAZGVzY3JpcHRpb24gUmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgSFRNTCBlbGVtZW50IG9mIHRoZSBmaWVsZFxuICAgKi9cbiAgcHJvdGVjdGVkIHBhcmVudD86IEhUTUxFbGVtZW50O1xuXG4gIC8vIHByb3RlY3RlZCBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFN0cmluZyBmb3JtYXR0aW5nIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHNmIGZ1bmN0aW9uIGZvciBlcnJvciBtZXNzYWdlIGZvcm1hdHRpbmdcbiAgICogQHByb3Age2Z1bmN0aW9uKHN0cmluZywgLi4uc3RyaW5nKTogc3RyaW5nfSBzZiAtIFN0cmluZyBmb3JtYXR0aW5nIGZ1bmN0aW9uXG4gICAqL1xuICBzZiA9IHNmO1xuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBDaGFuZ2UgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICogQGRlc2NyaXB0aW9uIEZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBmaWVsZCB2YWx1ZSBjaGFuZ2VzXG4gICAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oKTogdW5rbm93bn0gb25DaGFuZ2UgLSBvbkNoYW5nZSBldmVudCBoYW5kbGVyXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIG9uQ2hhbmdlOiAoKSA9PiB1bmtub3duID0gKCkgPT4ge307XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFRvdWNoIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgZmllbGQgaXMgdG91Y2hlZFxuICAgKiBAcHJvcGVydHkge2Z1bmN0aW9uKCk6IHVua25vd259IG9uVG91Y2ggLSBvblRvdWNoIGV2ZW50IGhhbmRsZXJcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgb25Ub3VjaDogKCkgPT4gdW5rbm93biA9ICgpID0+IHt9O1xuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBXcml0ZSB2YWx1ZSB0byB0aGUgZmllbGRcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqIC0gVGhlIHZhbHVlIHRvIGJlIHNldFxuICAgKi9cbiAgd3JpdGVWYWx1ZShvYmo6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSBvYmo7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVnaXN0ZXIgY2hhbmdlIGNhbGxiYWNrXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZmllbGQgdmFsdWUgY2hhbmdlc1xuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCk6IHVua25vd259IGZuIC0gVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBjaGFuZ2VcbiAgICovXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICgpID0+IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVnaXN0ZXIgdG91Y2ggY2FsbGJhY2tcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBmaWVsZCBpcyB0b3VjaGVkXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTogdW5rbm93bn0gZm4gLSBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIHRvdWNoXG4gICAqL1xuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaCA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFNldCBkaXNhYmxlZCBzdGF0ZVxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgZGlzYWJsZWQgc3RhdGUgb2YgdGhlIGZpZWxkXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNEaXNhYmxlZCAtIFdoZXRoZXIgdGhlIGZpZWxkIHNob3VsZCBiZSBkaXNhYmxlZFxuICAgKi9cbiAgc2V0RGlzYWJsZWRTdGF0ZT8oaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEFmdGVyIHZpZXcgaW5pdGlhbGl6YXRpb24gbG9naWNcbiAgICogQGRlc2NyaXB0aW9uIFBlcmZvcm1zIG5lY2Vzc2FyeSBzZXR1cCBhZnRlciB0aGUgdmlldyBoYXMgYmVlbiBpbml0aWFsaXplZFxuICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9IFRoZSBwYXJlbnQgZWxlbWVudCBvZiB0aGUgZmllbGRcbiAgICovXG4gIGFmdGVyVmlld0luaXQoKTogSFRNTEVsZW1lbnQge1xuICAgIGxldCBwYXJlbnQ6IEhUTUxFbGVtZW50O1xuICAgIHN3aXRjaCAodGhpcy5vcGVyYXRpb24pIHtcbiAgICAgIGNhc2UgT3BlcmF0aW9uS2V5cy5SRUFEOlxuICAgICAgY2FzZSBPcGVyYXRpb25LZXlzLkRFTEVURTpcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50Lm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgIGNhc2UgT3BlcmF0aW9uS2V5cy5DUkVBVEU6XG4gICAgICBjYXNlIE9wZXJhdGlvbktleXMuVVBEQVRFOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhcmVudCA9IE5neEZvcm1TZXJ2aWNlLmdldFBhcmVudEVsKHRoaXMuY29tcG9uZW50Lm5hdGl2ZUVsZW1lbnQsICdkaXYnKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIHRocm93IG5ldyBSZW5kZXJpbmdFcnJvcihgVW5hYmxlIHRvIHJldHJpZXZlIHBhcmVudCBmb3JtIGVsZW1lbnQgZm9yIHRoZSAke3RoaXMub3BlcmF0aW9ufTogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBlfWApO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5neEZvcm1TZXJ2aWNlLnJlZ2lzdGVyKHBhcmVudC5pZCwgdGhpcy5mb3JtR3JvdXAsIHRoaXMgYXMgQW5ndWxhckZpZWxkRGVmaW5pdGlvbik7XG4gICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgSW52YWxpZCBvcGVyYXRpb246ICR7dGhpcy5vcGVyYXRpb259YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IENsZWFudXAgb24gY29tcG9uZW50IGRlc3RydWN0aW9uXG4gICAqIEBkZXNjcmlwdGlvbiBVbnJlZ2lzdGVycyB0aGUgZmllbGQgd2hlbiB0aGUgY29tcG9uZW50IGlzIGRlc3Ryb3llZFxuICAgKi9cbiAgb25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmKHRoaXMuZm9ybUdyb3VwKVxuICAgICAgTmd4Rm9ybVNlcnZpY2UudW5yZWdpc3Rlcih0aGlzLmZvcm1Hcm91cCk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgR2V0IGZpZWxkIGVycm9yc1xuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGFsbCBlcnJvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWVsZFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfHZvaWR9IEFuIGFycmF5IG9mIGVycm9yIG9iamVjdHNcbiAgICovXG4gIGdldEVycm9ycyhwYXJlbnQ6IEhUTUxFbGVtZW50KTogc3RyaW5nIHwgdm9pZCB7XG4gICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLmZvcm1Db250cm9sO1xuICAgIGNvbnN0IGFjY29yZGlvbkNvbXBvbmVudCA9IHBhcmVudC5jbG9zZXN0KCduZ3gtZGVjYWYtZmllbGRzZXQnKT8ucXVlcnlTZWxlY3RvcignaW9uLWFjY29yZGlvbi1ncm91cCcpO1xuICAgIGlmKCghZm9ybUNvbnRyb2wucHJpc3RpbmUgfHwgZm9ybUNvbnRyb2wudG91Y2hlZCkgJiYgIWZvcm1Db250cm9sLnZhbGlkKSB7XG4gICAgICBjb25zdCBlcnJvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5bXSA9IE9iamVjdC5rZXlzKGZvcm1Db250cm9sLmVycm9ycyA/PyB7fSkubWFwKGtleSA9PiAoe1xuICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgbWVzc2FnZToga2V5LFxuICAgICAgfSkpO1xuICAgICAgaWYoZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICBpZihhY2NvcmRpb25Db21wb25lbnQgJiYgIXRoaXMudmFsaWRhdGlvbkVycm9yRXZlbnREaXNwYXRlY2hlZCkge1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvckV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KEV2ZW50Q29uc3RhbnRzLlZBTElEQVRJT05fRVJST1IsIHtcbiAgICAgICAgICAgIGRldGFpbDoge2ZpZWxkTmFtZTogdGhpcy5uYW1lLCBoYXNFcnJvcnM6IHRydWV9LFxuICAgICAgICAgICAgYnViYmxlczogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGFjY29yZGlvbkNvbXBvbmVudC5kaXNwYXRjaEV2ZW50KHZhbGlkYXRpb25FcnJvckV2ZW50KTtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRpb25FcnJvckV2ZW50RGlzcGF0ZWNoZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IoY29uc3QgZXJyb3Igb2YgZXJyb3JzKVxuICAgICAgICByZXR1cm4gYCogJHt0aGlzLnNmKHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBlcnJvcnMuJHtlcnJvcj8uWydtZXNzYWdlJ119YCksICh0aGlzIGFzIEtleVZhbHVlKVtlcnJvcj8uWydrZXknXV0gPz8gXCJcIil9YDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==