@elderbyte/ngx-starter 17.11.0-beta4 → 17.11.0-beta6

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/esm2022/lib/components/forms/search/domain/input/search-input-state.mjs +6 -6
  2. package/esm2022/lib/components/forms/search/domain/input/search-input.mjs +1 -1
  3. package/esm2022/lib/components/forms/search/elder-search-context.directive.mjs +10 -10
  4. package/esm2022/lib/components/forms/search/elder-search-input.directive.mjs +14 -29
  5. package/esm2022/lib/components/forms/search/search-box/elder-search-box.component.mjs +4 -4
  6. package/esm2022/lib/components/select/elder-select.module.mjs +15 -15
  7. package/esm2022/lib/components/select/filter/elder-chip-filter-style-resolver.mjs +19 -15
  8. package/esm2022/lib/components/select/filter/elder-chips-include-exclude.directive.mjs +144 -0
  9. package/esm2022/lib/components/select/filter/elder-filter-chip-template/elder-filter-chip-template.component.mjs +24 -31
  10. package/esm2022/lib/components/select/filter/include-exclude-model-filter-adapter.mjs +63 -0
  11. package/esm2022/lib/components/select/filter/include-exclude-selection-model.mjs +76 -20
  12. package/esm2022/lib/components/select/multi/elder-multi-select-chips/elder-multi-select-chips.component.mjs +7 -2
  13. package/esm2022/lib/components/select/multi/elder-search-include-exclude.directive.mjs +117 -43
  14. package/fesm2022/elderbyte-ngx-starter.mjs +741 -649
  15. package/fesm2022/elderbyte-ngx-starter.mjs.map +1 -1
  16. package/lib/components/forms/search/domain/input/search-input-state.d.ts +3 -3
  17. package/lib/components/forms/search/domain/input/search-input.d.ts +2 -6
  18. package/lib/components/forms/search/elder-search-context.directive.d.ts +3 -3
  19. package/lib/components/forms/search/elder-search-input.directive.d.ts +7 -11
  20. package/lib/components/forms/search/search-box/elder-search-box.component.d.ts +2 -1
  21. package/lib/components/select/elder-select.module.d.ts +4 -4
  22. package/lib/components/select/filter/elder-chip-filter-style-resolver.d.ts +1 -1
  23. package/lib/components/select/filter/{elder-chips-filter.directive.d.ts → elder-chips-include-exclude.directive.d.ts} +20 -9
  24. package/lib/components/select/filter/elder-filter-chip-template/elder-filter-chip-template.component.d.ts +9 -14
  25. package/lib/components/select/filter/include-exclude-model-filter-adapter.d.ts +29 -0
  26. package/lib/components/select/filter/include-exclude-selection-model.d.ts +25 -7
  27. package/lib/components/select/multi/elder-multi-select-chips/elder-multi-select-chips.component.d.ts +2 -0
  28. package/lib/components/select/multi/elder-search-include-exclude.directive.d.ts +57 -17
  29. package/package.json +1 -1
  30. package/esm2022/lib/components/forms/search/filter/include-exclude-input-converter.mjs +0 -137
  31. package/esm2022/lib/components/select/filter/elder-chips-filter.directive.mjs +0 -93
  32. package/lib/components/forms/search/filter/include-exclude-input-converter.d.ts +0 -62
@@ -1,74 +1,148 @@
1
- import { Directive, Input } from '@angular/core';
1
+ import { Directive, Host, Input, Optional } from '@angular/core';
2
+ import { BehaviorSubject, concat, of, skipUntil, Subject } from 'rxjs';
3
+ import { SearchInputState } from '../../forms/search/domain/input/search-input-state';
4
+ import { LoggerFactory } from '@elderbyte/ts-logger';
2
5
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
- import { BehaviorSubject, combineLatest } from 'rxjs';
4
- import { filter } from 'rxjs/operators';
5
- import IncludeExcludeInputConverter from '../../forms/search/filter/include-exclude-input-converter';
6
- import { Objects } from '../../../common/objects';
6
+ import { debounceTime, delay, first, map, tap } from 'rxjs/operators';
7
+ import { IncludeExcludeModelFilterAdapter } from '../filter/include-exclude-model-filter-adapter';
7
8
  import * as i0 from "@angular/core";
8
- import * as i1 from "../../forms/search/elder-search-input.directive";
9
- import * as i2 from "../filter/elder-chips-filter.directive";
9
+ import * as i1 from "../../forms/search/elder-search-context.directive";
10
+ import * as i2 from "../filter/include-exclude-selection-model";
11
+ import * as i3 from "@angular/forms";
12
+ /**
13
+ * Binds a IncludeExcludeModel to a SearchContexts Filter.
14
+ */
10
15
  export class ElderSearchIncludeExcludeDirective {
11
- /***************************************************************************
12
- * *
13
- * Properties *
14
- * *
15
- **************************************************************************/
16
- set includeSuffix(suffix) {
17
- this._includeSuffix$.next(suffix);
18
- }
19
- set excludeSuffix(suffix) {
20
- this._excludeSuffix$.next(suffix);
21
- }
22
16
  /***************************************************************************
23
17
  * *
24
18
  * Constructor *
25
19
  * *
26
20
  **************************************************************************/
27
- constructor(elderSearchInput, elderChipsFilter, destroyRef) {
28
- this.elderSearchInput = elderSearchInput;
29
- this.elderChipsFilter = elderChipsFilter;
21
+ constructor(searchContext, destroyRef, selectionModel, ngModel) {
22
+ this.searchContext = searchContext;
30
23
  this.destroyRef = destroyRef;
24
+ this.selectionModel = selectionModel;
25
+ this.ngModel = ngModel;
31
26
  /***************************************************************************
32
27
  * *
33
28
  * Fields *
34
29
  * *
35
30
  **************************************************************************/
36
- this._includeSuffix$ = new BehaviorSubject('');
37
- this._excludeSuffix$ = new BehaviorSubject(null);
38
- this.setupSearchQueryTransforms();
31
+ this.log = LoggerFactory.getLogger(this.constructor.name);
32
+ this._queryKey$ = new BehaviorSubject(null);
33
+ this.includeSuffix = '';
34
+ this.initialDone$ = new Subject();
35
+ this._state$ = this.buildInputStateObservable().pipe(
36
+ // tap(state => this.log.error('EMIT SEARCH INPUT STATE [' + state.queryKey + ']: ' + state.queryValue + (state.pristine ? '(pristine)' : ''), state))
37
+ );
38
+ }
39
+ /***************************************************************************
40
+ * *
41
+ * Life Cycle *
42
+ * *
43
+ **************************************************************************/
44
+ ngOnInit() {
45
+ this._extractedName = this.extractName();
46
+ this.updateQueryKey();
47
+ this.includeExcludeAdapter = new IncludeExcludeModelFilterAdapter(this.selectionModel, this.queryKey + this.includeSuffix, this.queryKey + this.excludeSuffix);
48
+ this.searchContext.register(this);
49
+ }
50
+ /***************************************************************************
51
+ * *
52
+ * Properties *
53
+ * *
54
+ **************************************************************************/
55
+ /**
56
+ * (Optional) Usually the control name is used, this allows a custom query key
57
+ */
58
+ set queryKey(value) {
59
+ this._userQueryKey = value;
60
+ this.updateQueryKey();
61
+ }
62
+ get queryKey() {
63
+ return this._queryKey$.getValue();
64
+ }
65
+ get queryKey$() {
66
+ return this._queryKey$;
67
+ }
68
+ get state$() {
69
+ return this._state$;
70
+ }
71
+ get readonly() {
72
+ return this.ngModel?.isDisabled;
73
+ }
74
+ /***************************************************************************
75
+ * *
76
+ * Public API *
77
+ * *
78
+ **************************************************************************/
79
+ applyFilters(filters) {
80
+ this.includeExcludeAdapter.applyFilters(filters);
81
+ }
82
+ reset() {
83
+ this.selectionModel.replaceSelection([]);
39
84
  }
40
85
  /***************************************************************************
41
86
  * *
42
- * Private Methods *
87
+ * Private methods *
43
88
  * *
44
89
  **************************************************************************/
45
- setupSearchQueryTransforms() {
46
- combineLatest([
47
- this.elderSearchInput.queryKey$,
48
- this._includeSuffix$,
49
- this._excludeSuffix$
50
- ])
51
- .pipe(takeUntilDestroyed(this.destroyRef), filter(([queryKey, includeSuffix, excludeSuffix]) => !!queryKey && Objects.nonNull(includeSuffix) && Objects.nonNull(excludeSuffix)))
52
- .subscribe(([queryKey, includeSuffix, excludeSuffix]) => {
53
- this.elderSearchInput.inputConverter = this.buildConverter(queryKey, includeSuffix, excludeSuffix);
54
- });
55
- }
56
- buildConverter(queryKey, includeSuffix, excludeSuffix) {
57
- return new IncludeExcludeInputConverter(this.elderChipsFilter.selectionModel, queryKey, includeSuffix, excludeSuffix);
58
- }
59
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ElderSearchIncludeExcludeDirective, deps: [{ token: i1.ElderSearchInputDirective }, { token: i2.ElderChipsFilterDirective }, { token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Directive }); }
60
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.11", type: ElderSearchIncludeExcludeDirective, isStandalone: true, selector: "[elderSearchIncludeExclude]", inputs: { includeSuffix: "includeSuffix", excludeSuffix: "excludeSuffix" }, ngImport: i0 }); }
90
+ updateQueryKey() {
91
+ const newKey = this._userQueryKey ?? this._extractedName;
92
+ if (this._queryKey$.getValue() !== newKey) {
93
+ this._queryKey$.next(newKey);
94
+ }
95
+ }
96
+ buildInputStateObservable() {
97
+ const viewStabilized$ = of('stabilized$').pipe(delay(20), first());
98
+ const inputStateChanges$ = this.selectionModel.selection$.pipe(takeUntilDestroyed(this.destroyRef), map(value => this.buildInputState(true)), skipUntil(viewStabilized$), tap(() => this.initialDone$.next()), debounceTime(20));
99
+ const startDelayed$ = of('start').pipe(delay(15), map(start => {
100
+ return this.buildInputState(false);
101
+ }));
102
+ return concat(startDelayed$, inputStateChanges$);
103
+ }
104
+ buildInputState(userEvent) {
105
+ const filters = this.includeExcludeAdapter.toFilters();
106
+ return new SearchInputState(this.queryKey, filters, this.areAllPristine(filters), userEvent);
107
+ }
108
+ areAllPristine(filters) {
109
+ if (filters.length > 0) {
110
+ return filters.every(f => this.isPristine(f));
111
+ }
112
+ else {
113
+ return true;
114
+ }
115
+ }
116
+ isPristine(filter) {
117
+ return !this.isAttributeValuePresent(filter.value);
118
+ }
119
+ isAttributeValuePresent(value) {
120
+ return SearchInputState.isValueDefined(value)
121
+ && (value + '').length !== 0;
122
+ }
123
+ extractName() {
124
+ return this.ngModel?.name;
125
+ }
126
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ElderSearchIncludeExcludeDirective, deps: [{ token: i1.ElderSearchContextDirective }, { token: i0.DestroyRef }, { token: i2.IncludeExcludeSelectionModel }, { token: i3.NgModel, host: true, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
127
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.11", type: ElderSearchIncludeExcludeDirective, isStandalone: true, selector: "[elderSearchIncludeExclude]", inputs: { includeSuffix: "includeSuffix", excludeSuffix: "excludeSuffix", queryKey: "queryKey" }, exportAs: ["elderSearchInput"], ngImport: i0 }); }
61
128
  }
62
129
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ElderSearchIncludeExcludeDirective, decorators: [{
63
130
  type: Directive,
64
131
  args: [{
65
132
  selector: '[elderSearchIncludeExclude]',
133
+ exportAs: 'elderSearchInput',
66
134
  standalone: true
67
135
  }]
68
- }], ctorParameters: () => [{ type: i1.ElderSearchInputDirective }, { type: i2.ElderChipsFilterDirective }, { type: i0.DestroyRef }], propDecorators: { includeSuffix: [{
136
+ }], ctorParameters: () => [{ type: i1.ElderSearchContextDirective }, { type: i0.DestroyRef }, { type: i2.IncludeExcludeSelectionModel }, { type: i3.NgModel, decorators: [{
137
+ type: Optional
138
+ }, {
139
+ type: Host
140
+ }] }], propDecorators: { includeSuffix: [{
69
141
  type: Input
70
142
  }], excludeSuffix: [{
71
143
  type: Input,
72
144
  args: [{ required: true }]
145
+ }], queryKey: [{
146
+ type: Input
73
147
  }] } });
74
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxkZXItc2VhcmNoLWluY2x1ZGUtZXhjbHVkZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbGRlcmJ5dGUvbmd4LXN0YXJ0ZXIvc3JjL2xpYi9jb21wb25lbnRzL3NlbGVjdC9tdWx0aS9lbGRlci1zZWFyY2gtaW5jbHVkZS1leGNsdWRlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWEsU0FBUyxFQUFFLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsZUFBZSxFQUFFLGFBQWEsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNwRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEMsT0FBTyw0QkFBNEIsTUFBTSwyREFBMkQsQ0FBQztBQUVyRyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0seUJBQXlCLENBQUM7Ozs7QUFNaEQsTUFBTSxPQUFPLGtDQUFrQztJQVc3Qzs7OztnRkFJNEU7SUFFNUUsSUFDVyxhQUFhLENBQUMsTUFBYztRQUNyQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsSUFDVyxhQUFhLENBQUMsTUFBYztRQUNyQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7Z0ZBSTRFO0lBRTVFLFlBQ21CLGdCQUEyQyxFQUMzQyxnQkFBMkMsRUFDcEQsVUFBc0I7UUFGYixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQTJCO1FBQzNDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBMkI7UUFDcEQsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQWxDaEM7Ozs7b0ZBSTRFO1FBRTNELG9CQUFlLEdBQUcsSUFBSSxlQUFlLENBQVMsRUFBRSxDQUFDLENBQUM7UUFDbEQsb0JBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBUyxJQUFJLENBQUMsQ0FBQztRQTZCbkUsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7O2dGQUk0RTtJQUVwRSwwQkFBMEI7UUFDaEMsYUFBYSxDQUFDO1lBQ1osSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVM7WUFDL0IsSUFBSSxDQUFDLGVBQWU7WUFDcEIsSUFBSSxDQUFDLGVBQWU7U0FDckIsQ0FBQzthQUNDLElBQUksQ0FDSCxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQ25DLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLGFBQWEsRUFBRSxhQUFhLENBQUMsRUFBRSxFQUFFLENBQ2xELENBQUMsQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUMvRSxDQUNGO2FBQ0EsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxFQUFFLEVBQUU7WUFDdEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDckcsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBSU8sY0FBYyxDQUNwQixRQUFnQixFQUNoQixhQUFxQixFQUNyQixhQUFxQjtRQUVyQixPQUFPLElBQUksNEJBQTRCLENBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQ3BDLFFBQVEsRUFDUixhQUFhLEVBQ2IsYUFBYSxDQUNkLENBQUM7SUFDSixDQUFDOytHQTdFVSxrQ0FBa0M7bUdBQWxDLGtDQUFrQzs7NEZBQWxDLGtDQUFrQztrQkFKOUMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsNkJBQTZCO29CQUN2QyxVQUFVLEVBQUUsSUFBSTtpQkFDakI7K0pBbUJZLGFBQWE7c0JBRHZCLEtBQUs7Z0JBTUssYUFBYTtzQkFEdkIsS0FBSzt1QkFBQyxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Rlc3Ryb3lSZWYsIERpcmVjdGl2ZSwgSW5wdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHt0YWtlVW50aWxEZXN0cm95ZWR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZmlsdGVyfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0VsZGVyU2VhcmNoSW5wdXREaXJlY3RpdmV9IGZyb20gJy4uLy4uL2Zvcm1zL3NlYXJjaC9lbGRlci1zZWFyY2gtaW5wdXQuZGlyZWN0aXZlJztcbmltcG9ydCBJbmNsdWRlRXhjbHVkZUlucHV0Q29udmVydGVyIGZyb20gJy4uLy4uL2Zvcm1zL3NlYXJjaC9maWx0ZXIvaW5jbHVkZS1leGNsdWRlLWlucHV0LWNvbnZlcnRlcic7XG5pbXBvcnQge0VsZGVyQ2hpcHNGaWx0ZXJEaXJlY3RpdmV9IGZyb20gJy4uL2ZpbHRlci9lbGRlci1jaGlwcy1maWx0ZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7T2JqZWN0c30gZnJvbSAnLi4vLi4vLi4vY29tbW9uL29iamVjdHMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbZWxkZXJTZWFyY2hJbmNsdWRlRXhjbHVkZV0nLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIEVsZGVyU2VhcmNoSW5jbHVkZUV4Y2x1ZGVEaXJlY3RpdmUge1xuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBGaWVsZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2luY2x1ZGVTdWZmaXgkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZXhjbHVkZVN1ZmZpeCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4obnVsbCk7XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIFByb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBpbmNsdWRlU3VmZml4KHN1ZmZpeDogc3RyaW5nKSB7XG4gICAgdGhpcy5faW5jbHVkZVN1ZmZpeCQubmV4dChzdWZmaXgpO1xuICB9XG5cbiAgQElucHV0KHtyZXF1aXJlZDogdHJ1ZX0pXG4gIHB1YmxpYyBzZXQgZXhjbHVkZVN1ZmZpeChzdWZmaXg6IHN0cmluZykge1xuICAgIHRoaXMuX2V4Y2x1ZGVTdWZmaXgkLm5leHQoc3VmZml4KTtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBDb25zdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZWxkZXJTZWFyY2hJbnB1dDogRWxkZXJTZWFyY2hJbnB1dERpcmVjdGl2ZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsZGVyQ2hpcHNGaWx0ZXI6IEVsZGVyQ2hpcHNGaWx0ZXJEaXJlY3RpdmUsXG4gICAgcHJpdmF0ZSBkZXN0cm95UmVmOiBEZXN0cm95UmVmXG4gICkge1xuICAgIHRoaXMuc2V0dXBTZWFyY2hRdWVyeVRyYW5zZm9ybXMoKTtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQcml2YXRlIE1ldGhvZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHByaXZhdGUgc2V0dXBTZWFyY2hRdWVyeVRyYW5zZm9ybXMoKSB7XG4gICAgY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLmVsZGVyU2VhcmNoSW5wdXQucXVlcnlLZXkkLFxuICAgICAgdGhpcy5faW5jbHVkZVN1ZmZpeCQsXG4gICAgICB0aGlzLl9leGNsdWRlU3VmZml4JFxuICAgIF0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZiksXG4gICAgICAgIGZpbHRlcigoW3F1ZXJ5S2V5LCBpbmNsdWRlU3VmZml4LCBleGNsdWRlU3VmZml4XSkgPT5cbiAgICAgICAgICAhIXF1ZXJ5S2V5ICYmIE9iamVjdHMubm9uTnVsbChpbmNsdWRlU3VmZml4KSAmJiBPYmplY3RzLm5vbk51bGwoZXhjbHVkZVN1ZmZpeClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoW3F1ZXJ5S2V5LCBpbmNsdWRlU3VmZml4LCBleGNsdWRlU3VmZml4XSkgPT4ge1xuICAgICAgICB0aGlzLmVsZGVyU2VhcmNoSW5wdXQuaW5wdXRDb252ZXJ0ZXIgPSB0aGlzLmJ1aWxkQ29udmVydGVyKHF1ZXJ5S2V5LCBpbmNsdWRlU3VmZml4LCBleGNsdWRlU3VmZml4KTtcbiAgICAgIH0pO1xuICB9XG5cblxuXG4gIHByaXZhdGUgYnVpbGRDb252ZXJ0ZXIoXG4gICAgcXVlcnlLZXk6IHN0cmluZyxcbiAgICBpbmNsdWRlU3VmZml4OiBzdHJpbmcsXG4gICAgZXhjbHVkZVN1ZmZpeDogc3RyaW5nXG4gICk6IEluY2x1ZGVFeGNsdWRlSW5wdXRDb252ZXJ0ZXIge1xuICAgIHJldHVybiBuZXcgSW5jbHVkZUV4Y2x1ZGVJbnB1dENvbnZlcnRlcihcbiAgICAgIHRoaXMuZWxkZXJDaGlwc0ZpbHRlci5zZWxlY3Rpb25Nb2RlbCxcbiAgICAgIHF1ZXJ5S2V5LFxuICAgICAgaW5jbHVkZVN1ZmZpeCxcbiAgICAgIGV4Y2x1ZGVTdWZmaXhcbiAgICApO1xuICB9XG59XG5cbiJdfQ==
148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxkZXItc2VhcmNoLWluY2x1ZGUtZXhjbHVkZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbGRlcmJ5dGUvbmd4LXN0YXJ0ZXIvc3JjL2xpYi9jb21wb25lbnRzL3NlbGVjdC9tdWx0aS9lbGRlci1zZWFyY2gtaW5jbHVkZS1leGNsdWRlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWEsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQVUsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRW5GLE9BQU8sRUFBQyxlQUFlLEVBQUUsTUFBTSxFQUFjLEVBQUUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2pGLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLG9EQUFvRCxDQUFDO0FBQ3BGLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUluRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUU5RCxPQUFPLEVBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBQyxnQ0FBZ0MsRUFBQyxNQUFNLGdEQUFnRCxDQUFDOzs7OztBQUdoRzs7R0FFRztBQU1ILE1BQU0sT0FBTyxrQ0FBa0M7SUEwQjdDOzs7O2dGQUk0RTtJQUU1RSxZQUNVLGFBQTBDLEVBQzFDLFVBQXNCLEVBQ2IsY0FBNEMsRUFDakMsT0FBZ0I7UUFIcEMsa0JBQWEsR0FBYixhQUFhLENBQTZCO1FBQzFDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDYixtQkFBYyxHQUFkLGNBQWMsQ0FBOEI7UUFDakMsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQWxDOUM7Ozs7b0ZBSTRFO1FBRTNELFFBQUcs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a0NBQWtDOzs0RkFBbEMsa0NBQWtDO2tCQUw5QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSw2QkFBNkI7b0JBQ3ZDLFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs7MEJBcUNJLFFBQVE7OzBCQUFJLElBQUk7eUNBckJaLGFBQWE7c0JBRG5CLEtBQUs7Z0JBSUMsYUFBYTtzQkFEbkIsS0FBSzt1QkFBQyxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUM7Z0JBdURaLFFBQVE7c0JBRGxCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Rlc3Ryb3lSZWYsIERpcmVjdGl2ZSwgSG9zdCwgSW5wdXQsIE9uSW5pdCwgT3B0aW9uYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtTZWFyY2hJbnB1dH0gZnJvbSAnLi4vLi4vZm9ybXMvc2VhcmNoL2RvbWFpbi9pbnB1dC9zZWFyY2gtaW5wdXQnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGNvbmNhdCwgT2JzZXJ2YWJsZSwgb2YsIHNraXBVbnRpbCwgU3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1NlYXJjaElucHV0U3RhdGV9IGZyb20gJy4uLy4uL2Zvcm1zL3NlYXJjaC9kb21haW4vaW5wdXQvc2VhcmNoLWlucHV0LXN0YXRlJztcbmltcG9ydCB7TG9nZ2VyRmFjdG9yeX0gZnJvbSAnQGVsZGVyYnl0ZS90cy1sb2dnZXInO1xuaW1wb3J0IHtFbGRlclNlYXJjaENvbnRleHREaXJlY3RpdmV9IGZyb20gJy4uLy4uL2Zvcm1zL3NlYXJjaC9lbGRlci1zZWFyY2gtY29udGV4dC5kaXJlY3RpdmUnO1xuaW1wb3J0IHtOZ01vZGVsfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge0ZpbHRlcn0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2RhdGEvZmlsdGVycy9maWx0ZXInO1xuaW1wb3J0IHt0YWtlVW50aWxEZXN0cm95ZWR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7SW5jbHVkZUV4Y2x1ZGVTZWxlY3Rpb25Nb2RlbH0gZnJvbSAnLi4vZmlsdGVyL2luY2x1ZGUtZXhjbHVkZS1zZWxlY3Rpb24tbW9kZWwnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGRlbGF5LCBmaXJzdCwgbWFwLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7SW5jbHVkZUV4Y2x1ZGVNb2RlbEZpbHRlckFkYXB0ZXJ9IGZyb20gJy4uL2ZpbHRlci9pbmNsdWRlLWV4Y2x1ZGUtbW9kZWwtZmlsdGVyLWFkYXB0ZXInO1xuXG5cbi8qKlxuICogQmluZHMgYSBJbmNsdWRlRXhjbHVkZU1vZGVsIHRvIGEgU2VhcmNoQ29udGV4dHMgRmlsdGVyLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbZWxkZXJTZWFyY2hJbmNsdWRlRXhjbHVkZV0nLFxuICBleHBvcnRBczogJ2VsZGVyU2VhcmNoSW5wdXQnLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIEVsZGVyU2VhcmNoSW5jbHVkZUV4Y2x1ZGVEaXJlY3RpdmUgaW1wbGVtZW50cyBTZWFyY2hJbnB1dCwgT25Jbml0IHtcblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogRmllbGRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwcml2YXRlIHJlYWRvbmx5IGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKHRoaXMuY29uc3RydWN0b3IubmFtZSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfcXVlcnlLZXkkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KG51bGwpO1xuICBwcml2YXRlIF9leHRyYWN0ZWROYW1lOiBzdHJpbmcgfCBudWxsO1xuICBwcml2YXRlIF91c2VyUXVlcnlLZXk6IHN0cmluZyB8IG51bGw7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGluY2x1ZGVTdWZmaXggPSAnJztcblxuICBASW5wdXQoe3JlcXVpcmVkOiB0cnVlfSlcbiAgcHVibGljIGV4Y2x1ZGVTdWZmaXg6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IF9zdGF0ZSQ6IE9ic2VydmFibGU8U2VhcmNoSW5wdXRTdGF0ZT47XG5cbiAgcHJpdmF0ZSBpbmNsdWRlRXhjbHVkZUFkYXB0ZXI6IEluY2x1ZGVFeGNsdWRlTW9kZWxGaWx0ZXJBZGFwdGVyO1xuXG4gIHB1YmxpYyByZWFkb25seSBpbml0aWFsRG9uZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBDb25zdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2VhcmNoQ29udGV4dDogRWxkZXJTZWFyY2hDb250ZXh0RGlyZWN0aXZlLFxuICAgIHByaXZhdGUgZGVzdHJveVJlZjogRGVzdHJveVJlZixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlbGVjdGlvbk1vZGVsOiBJbmNsdWRlRXhjbHVkZVNlbGVjdGlvbk1vZGVsLFxuICAgIEBPcHRpb25hbCgpIEBIb3N0KCkgcHJpdmF0ZSBuZ01vZGVsOiBOZ01vZGVsXG4gICkge1xuICAgIHRoaXMuX3N0YXRlJCA9IHRoaXMuYnVpbGRJbnB1dFN0YXRlT2JzZXJ2YWJsZSgpLnBpcGUoXG4gICAgICAvLyB0YXAoc3RhdGUgPT4gdGhpcy5sb2cuZXJyb3IoJ0VNSVQgU0VBUkNIIElOUFVUIFNUQVRFIFsnICsgc3RhdGUucXVlcnlLZXkgKyAnXTogJyArIHN0YXRlLnF1ZXJ5VmFsdWUgKyAoc3RhdGUucHJpc3RpbmUgPyAnKHByaXN0aW5lKScgOiAnJyksIHN0YXRlKSlcbiAgICApO1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIExpZmUgQ3ljbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHVibGljIG5nT25Jbml0KCkge1xuICAgIHRoaXMuX2V4dHJhY3RlZE5hbWUgPSB0aGlzLmV4dHJhY3ROYW1lKCk7XG4gICAgdGhpcy51cGRhdGVRdWVyeUtleSgpO1xuXG4gICAgdGhpcy5pbmNsdWRlRXhjbHVkZUFkYXB0ZXIgPSBuZXcgSW5jbHVkZUV4Y2x1ZGVNb2RlbEZpbHRlckFkYXB0ZXIoXG4gICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLFxuICAgICAgdGhpcy5xdWVyeUtleSArIHRoaXMuaW5jbHVkZVN1ZmZpeCxcbiAgICAgIHRoaXMucXVlcnlLZXkgKyB0aGlzLmV4Y2x1ZGVTdWZmaXhcbiAgICApO1xuXG4gICAgdGhpcy5zZWFyY2hDb250ZXh0LnJlZ2lzdGVyKHRoaXMpO1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIFByb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIChPcHRpb25hbCkgVXN1YWxseSB0aGUgY29udHJvbCBuYW1lIGlzIHVzZWQsIHRoaXMgYWxsb3dzIGEgY3VzdG9tIHF1ZXJ5IGtleVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBxdWVyeUtleSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdXNlclF1ZXJ5S2V5ID0gdmFsdWU7XG4gICAgdGhpcy51cGRhdGVRdWVyeUtleSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBxdWVyeUtleSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlLZXkkLmdldFZhbHVlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHF1ZXJ5S2V5JCgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeUtleSQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHN0YXRlJCgpOiBPYnNlcnZhYmxlPFNlYXJjaElucHV0U3RhdGU+IHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGUkO1xuICB9XG5cbiAgcHVibGljIGdldCByZWFkb25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5uZ01vZGVsPy5pc0Rpc2FibGVkO1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIFB1YmxpYyBBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHVibGljIGFwcGx5RmlsdGVycyhmaWx0ZXJzOiBGaWx0ZXJbXSkge1xuICAgIHRoaXMuaW5jbHVkZUV4Y2x1ZGVBZGFwdGVyLmFwcGx5RmlsdGVycyhmaWx0ZXJzKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLnJlcGxhY2VTZWxlY3Rpb24oW10pO1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIFByaXZhdGUgbWV0aG9kcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHJpdmF0ZSB1cGRhdGVRdWVyeUtleSgpOiB2b2lkIHtcbiAgICBjb25zdCBuZXdLZXkgPSB0aGlzLl91c2VyUXVlcnlLZXkgPz8gdGhpcy5fZXh0cmFjdGVkTmFtZTtcbiAgICBpZiAodGhpcy5fcXVlcnlLZXkkLmdldFZhbHVlKCkgIT09IG5ld0tleSkge1xuICAgICAgdGhpcy5fcXVlcnlLZXkkLm5leHQobmV3S2V5KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkSW5wdXRTdGF0ZU9ic2VydmFibGUoKTogT2JzZXJ2YWJsZTxTZWFyY2hJbnB1dFN0YXRlPiB7XG5cbiAgICBjb25zdCB2aWV3U3RhYmlsaXplZCQgPSBvZignc3RhYmlsaXplZCQnKS5waXBlKFxuICAgICAgZGVsYXkoMjApLFxuICAgICAgZmlyc3QoKVxuICAgICk7XG5cbiAgICBjb25zdCBpbnB1dFN0YXRlQ2hhbmdlcyQgPSB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGlvbiQucGlwZShcbiAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpLFxuICAgICAgbWFwKHZhbHVlID0+IHRoaXMuYnVpbGRJbnB1dFN0YXRlKHRydWUpKSxcbiAgICAgIHNraXBVbnRpbCh2aWV3U3RhYmlsaXplZCQpLFxuICAgICAgdGFwKCgpID0+IHRoaXMuaW5pdGlhbERvbmUkLm5leHQoKSksXG4gICAgICBkZWJvdW5jZVRpbWUoMjApXG4gICAgKTtcblxuICAgIGNvbnN0IHN0YXJ0RGVsYXllZCQgPSBvZignc3RhcnQnKS5waXBlKFxuICAgICAgZGVsYXkoMTUpLFxuICAgICAgbWFwKHN0YXJ0ID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRJbnB1dFN0YXRlKGZhbHNlKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHJldHVybiBjb25jYXQoc3RhcnREZWxheWVkJCwgaW5wdXRTdGF0ZUNoYW5nZXMkKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRJbnB1dFN0YXRlKHVzZXJFdmVudDogYm9vbGVhbik6IFNlYXJjaElucHV0U3RhdGUge1xuICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLmluY2x1ZGVFeGNsdWRlQWRhcHRlci50b0ZpbHRlcnMoKTtcbiAgICByZXR1cm4gbmV3IFNlYXJjaElucHV0U3RhdGUoXG4gICAgICB0aGlzLnF1ZXJ5S2V5LFxuICAgICAgZmlsdGVycyxcbiAgICAgIHRoaXMuYXJlQWxsUHJpc3RpbmUoZmlsdGVycyksXG4gICAgICB1c2VyRXZlbnRcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhcmVBbGxQcmlzdGluZShmaWx0ZXJzOiBGaWx0ZXJbXSk6IGJvb2xlYW4ge1xuICAgIGlmIChmaWx0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBmaWx0ZXJzLmV2ZXJ5KGYgPT4gdGhpcy5pc1ByaXN0aW5lKGYpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc1ByaXN0aW5lKGZpbHRlcjogRmlsdGVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzQXR0cmlidXRlVmFsdWVQcmVzZW50KGZpbHRlci52YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGlzQXR0cmlidXRlVmFsdWVQcmVzZW50KHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gU2VhcmNoSW5wdXRTdGF0ZS5pc1ZhbHVlRGVmaW5lZCh2YWx1ZSlcbiAgICAgICYmICh2YWx1ZSArICcnKS5sZW5ndGggIT09IDA7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3ROYW1lKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLm5nTW9kZWw/Lm5hbWU7XG4gIH1cbn1cbiJdfQ==