@unnilouis.org/vs-chipdropdown 0.0.2-v17 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,24 +1,24 @@
1
- # VsChipdropdown
2
-
3
- This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 17.2.0.
4
-
5
- ## Code scaffolding
6
-
7
- Run `ng generate component component-name --project vs-chipdropdown` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project vs-chipdropdown`.
8
- > Note: Don't forget to add `--project vs-chipdropdown` or else it will be added to the default project in your `angular.json` file.
9
-
10
- ## Build
11
-
12
- Run `ng build vs-chipdropdown` to build the project. The build artifacts will be stored in the `dist/` directory.
13
-
14
- ## Publishing
15
-
16
- After building your library with `ng build vs-chipdropdown`, go to the dist folder `cd dist/vs-chipdropdown` and run `npm publish`.
17
-
18
- ## Running unit tests
19
-
20
- Run `ng test vs-chipdropdown` to execute the unit tests via [Karma](https://karma-runner.github.io).
21
-
22
- ## Further help
23
-
24
- To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
1
+ # VsChipdropdown
2
+
3
+ This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 16.2.0.
4
+
5
+ ## Code scaffolding
6
+
7
+ Run `ng generate component component-name --project vs-chipdropdown` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project vs-chipdropdown`.
8
+ > Note: Don't forget to add `--project vs-chipdropdown` or else it will be added to the default project in your `angular.json` file.
9
+
10
+ ## Build
11
+
12
+ Run `ng build vs-chipdropdown` to build the project. The build artifacts will be stored in the `dist/` directory.
13
+
14
+ ## Publishing
15
+
16
+ After building your library with `ng build vs-chipdropdown`, go to the dist folder `cd dist/vs-chipdropdown` and run `npm publish`.
17
+
18
+ ## Running unit tests
19
+
20
+ Run `ng test vs-chipdropdown` to execute the unit tests via [Karma](https://karma-runner.github.io).
21
+
22
+ ## Further help
23
+
24
+ To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
@@ -1,243 +1,153 @@
1
- import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
- import { MatAutocomplete, MatAutocompleteTrigger } from '@angular/material/autocomplete';
3
- import { debounceTime, distinctUntilChanged, tap, switchMap, finalize, takeUntil, map, } from "rxjs/operators";
4
- import { fromEvent } from 'rxjs';
5
- import { FormGroup } from '@angular/forms';
6
- import { COMMA, ENTER } from '@angular/cdk/keycodes';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "../vs-chipdropdown.service";
9
- import * as i2 from "@angular/forms";
10
- import * as i3 from "@angular/material/form-field";
11
- import * as i4 from "@angular/material/core";
12
- import * as i5 from "@angular/material/autocomplete";
13
- import * as i6 from "@angular/material/chips";
14
- import * as i7 from "@angular/material/icon";
15
- import * as i8 from "@ngx-translate/core";
16
- export class VsChipddCmpComponent {
17
- constructor(service, fb) {
18
- this.service = service;
19
- this.fb = fb;
20
- this.DrodownLoading = false;
21
- this.Backendapi = true;
22
- this.autocompleteTrigger = MatAutocompleteTrigger;
23
- this.matAutocompleteApp = MatAutocomplete;
24
- this.dataEvent = new EventEmitter();
25
- this.separatorsKeysCodes = [ENTER, COMMA];
26
- this.has_next = false;
27
- this.currentpage = 1;
28
- this.Dropdowndata = [];
29
- this.has_previous = false;
30
- this.DropdownForm = FormGroup;
31
- this.chipSelectedId = [];
32
- this.chipSelectedObj = [];
33
- }
34
- ngOnInit() {
35
- this.DropdownForm = this.fb.group({
36
- value: ''
37
- });
38
- if (this.InputFields?.defaultvalue) {
39
- this.DropdownForm.get("value").patchValue(this.InputFields?.defaultvalue);
40
- this.chipSelectedObj = this.InputFields?.defaultvalue;
41
- if (this.chipSelectedObj.length > 0) {
42
- for (let foundemp of this.chipSelectedObj) {
43
- if (this.InputFields?.Outputkey) {
44
- this.chipSelectedId.push(foundemp[this.InputFields?.Outputkey]);
45
- }
46
- else {
47
- this.chipSelectedId.push(foundemp.id);
48
- }
49
- }
50
- this.selected();
51
- }
52
- }
53
- if (this.InputFields?.fronentdata) {
54
- this.Dropdowndata = this.InputFields?.data;
55
- }
56
- else {
57
- this.getdropdown('');
58
- }
59
- }
60
- ngOnChanges(changes) {
61
- console.log("changes.ResetForm", changes['ResetForm'], changes['ResetForm'].currentValue, changes['ResetForm'] && changes['ResetForm'].currentValue);
62
- if (changes['InputFields'] && changes['InputFields'].currentValue) {
63
- console.log("Summary Log Changes");
64
- this.currentpage = 1;
65
- this.ngOnInit();
66
- }
67
- if (changes['ResetForm'] && changes['ResetForm'].currentValue) {
68
- console.log("hitted");
69
- this.DropdownForm.reset();
70
- this.currentpage = 1;
71
- this.ngOnInit();
72
- this.chipSelectedId = [];
73
- this.chipSelectedObj = [];
74
- this.dataEvent.emit([]);
75
- }
76
- }
77
- // public displaydevelopclient(clt: any, key: string) {
78
- // return key[clt];
79
- // }
80
- autocompleteAppScroll() {
81
- if (!(this.InputFields?.fronentdata)) {
82
- setTimeout(() => {
83
- if (this.matAutocompleteApp &&
84
- this.autocompleteTrigger &&
85
- this.matAutocompleteApp.panel) {
86
- fromEvent(this.matAutocompleteApp.panel.nativeElement, 'scroll')
87
- .pipe(map(x => this.matAutocompleteApp.panel.nativeElement.scrollTop), takeUntil(this.autocompleteTrigger.panelClosingActions))
88
- .subscribe(x => {
89
- const scrollTop = this.matAutocompleteApp.panel.nativeElement.scrollTop;
90
- const scrollHeight = this.matAutocompleteApp.panel.nativeElement.scrollHeight;
91
- const elementHeight = this.matAutocompleteApp.panel.nativeElement.clientHeight;
92
- const atBottom = scrollHeight - 1 <= scrollTop + elementHeight;
93
- if (atBottom) {
94
- if (this.has_next === true) {
95
- let value = this.DropInput.nativeElement.value;
96
- let params = this.searchparams(value);
97
- this.currentpage = this.currentpage + 1;
98
- if (this.currentpage > 1) {
99
- this.service.GetApi(this.InputFields.url + "?page=" + this.currentpage, params)
100
- .subscribe((results) => {
101
- let datas = results["data"];
102
- let datapagination = results["pagination"];
103
- this.Dropdowndata = this.Dropdowndata.concat(datas);
104
- console.log("this.Dropdowndata", this.Dropdowndata);
105
- if (this.Dropdowndata.length >= 0) {
106
- this.has_next = datapagination.has_next;
107
- this.has_previous = datapagination.has_previous;
108
- this.currentpage = datapagination.index;
109
- }
110
- });
111
- }
112
- }
113
- }
114
- });
115
- }
116
- });
117
- }
118
- }
119
- dropdownsearch() {
120
- if (!(this.InputFields?.fronentdata)) {
121
- this.DropdownForm.get("value").valueChanges.pipe(debounceTime(100), distinctUntilChanged(), tap(() => {
122
- this.DrodownLoading = true;
123
- console.log("inside tap");
124
- }), switchMap((value) => {
125
- let params = this.searchparams(value);
126
- this.currentpage = 1;
127
- return this.service.GetApi(this.InputFields.url + "?page=" + this.currentpage, params).pipe(finalize(() => {
128
- this.DrodownLoading = false;
129
- }));
130
- })).subscribe((results) => {
131
- let datas = results["data"];
132
- this.Dropdowndata = datas;
133
- });
134
- }
135
- }
136
- getdropdown(value) {
137
- let params = this.searchparams(value);
138
- this.service.GetApi(this.InputFields.url + "?page=" + this.currentpage, params)
139
- .subscribe((results) => {
140
- let datas = results["data"];
141
- let datapagination = results["pagination"];
142
- this.Dropdowndata = datas;
143
- if (this.Dropdowndata.length >= 0) {
144
- this.has_next = datapagination.has_next;
145
- this.has_previous = datapagination.has_previous;
146
- this.currentpage = datapagination.index;
147
- }
148
- });
149
- }
150
- selected() {
151
- // let data = this.DropdownForm.value.value
152
- if (this.InputFields?.wholedata) {
153
- this.dataEvent.emit(this.chipSelectedObj);
154
- }
155
- else {
156
- if (this.InputFields?.Outputkey) {
157
- this.dataEvent.emit(this.chipSelectedId);
158
- }
159
- else {
160
- this.dataEvent.emit(this.chipSelectedObj);
161
- }
162
- }
163
- }
164
- searchparams(value) {
165
- let params = '';
166
- if (this.InputFields.params) {
167
- params = this.InputFields.params;
168
- }
169
- let inpValue = value;
170
- inpValue ? params += '&' + this.InputFields.searchkey + '=' + inpValue : '';
171
- return params;
172
- }
173
- removechip(obj) {
174
- const index = this.chipSelectedObj.indexOf(obj);
175
- if (index >= 0) {
176
- this.chipSelectedObj.splice(index, 1);
177
- console.log(this.chipSelectedObj);
178
- this.chipSelectedId.splice(index, 1);
179
- console.log(this.chipSelectedId);
180
- this.DropInput.nativeElement.value = '';
181
- this.selected();
182
- }
183
- }
184
- venSelected(event) {
185
- this.DropInput.nativeElement.value = '';
186
- console.log('event.option.value', event.option.value);
187
- this.selectvenByName(event.option.value[this.comparekey(event.option.value)]);
188
- console.log('chipSelectedvenid', this.chipSelectedObj);
189
- }
190
- selectvenByName(ven) {
191
- let foundemp1 = this.chipSelectedObj.filter((e) => e[this.comparekey(e)] == ven);
192
- if (foundemp1.length) {
193
- return;
194
- }
195
- let foundemp = this.Dropdowndata.filter((e) => e[this.comparekey(e)] == ven);
196
- if (foundemp.length) {
197
- this.chipSelectedObj.push(foundemp[0]);
198
- if (this.InputFields?.Outputkey) {
199
- this.chipSelectedId.push(foundemp[0][this.InputFields?.Outputkey]);
200
- }
201
- else {
202
- this.chipSelectedId.push(foundemp[0].id);
203
- }
204
- }
205
- }
206
- comparekey(e) {
207
- if (this.InputFields?.comparekey) {
208
- return this.InputFields?.comparekey;
209
- }
210
- else {
211
- if (e?.id) {
212
- return "id";
213
- }
214
- else {
215
- return this.InputFields.displaykey;
216
- }
217
- }
218
- }
219
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: VsChipddCmpComponent, deps: [{ token: i1.VsChipdropdownService }, { token: i2.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
220
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.0", type: VsChipddCmpComponent, selector: "lib-vs-chipdd-cmp", inputs: { InputFields: "InputFields", ResetForm: "ResetForm", Backendapi: "Backendapi" }, outputs: { dataEvent: "dataEvent" }, viewQueries: [{ propertyName: "autocompleteTrigger", first: true, predicate: MatAutocompleteTrigger, descendants: true }, { propertyName: "matAutocompleteApp", first: true, predicate: ["scrolll"], descendants: true }, { propertyName: "DropInput", first: true, predicate: ["DropInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div>\r\n <form [formGroup]=\"DropdownForm\">\r\n <mat-form-field class=\"mat-chipScroll\"\r\n appearance=\"outline\">\r\n <mat-label>{{InputFields.label | translate}}</mat-label>\r\n <mat-chip-grid multiple #chipListvendor class=\"chip-container\">\r\n @for(obj of chipSelectedObj; track obj ){\r\n <mat-chip-row [removable]=\"true\" (removed)=\"removechip(obj)\" class=\"mat-chipEx\">\r\n {{ obj[InputFields.displaykey] }}\r\n <mat-icon matChipRemove>cancel</mat-icon>\r\n </mat-chip-row>\r\n }\r\n \r\n <input #DropInput [matAutocomplete]=\"scrolll\" class=\"matformfieldinputstyle\"\r\n (keydown)=\"dropdownsearch()\" [matChipInputFor]=\"chipListvendor\" [matChipInputSeparatorKeyCodes]=\"\r\n separatorsKeysCodes\r\n \" [matChipInputAddOnBlur]=\"true\" formControlName=\"value\" />\r\n </mat-chip-grid>\r\n <mat-autocomplete #scrolll=\"matAutocomplete\" (optionSelected)=\"venSelected($event)\"\r\n (opened)=\"autocompleteAppScroll()\">\r\n <ng-container>\r\n @for(dropvalues of Dropdowndata; track dropvalues ){\r\n <mat-option [value]=\"dropvalues\" (click)=\"selected()\">\r\n {{dropvalues[InputFields.displaykey]}}\r\n </mat-option>\r\n }\r\n \r\n </ng-container>\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n </form>\r\n</div>", styles: [".mat-chipScroll{max-width:420px;width:100%}.mat-chipEx{text-align:left}.chip-container{overflow-y:scroll;max-height:80px}.chip-container::-webkit-scrollbar{width:6px;height:6px}.chip-container::-webkit-scrollbar-track{background:transparent}.chip-container::-webkit-scrollbar-thumb{border-radius:20px;background:#c3c3c3}.chip-container::-webkit-scrollbar-thumb:hover{background:#a6a6a6}\n"], dependencies: [{ kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "component", type: i4.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i5.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i5.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i6.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i6.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i6.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i6.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }] }); }
221
- }
222
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: VsChipddCmpComponent, decorators: [{
223
- type: Component,
224
- args: [{ selector: 'lib-vs-chipdd-cmp', template: "<div>\r\n <form [formGroup]=\"DropdownForm\">\r\n <mat-form-field class=\"mat-chipScroll\"\r\n appearance=\"outline\">\r\n <mat-label>{{InputFields.label | translate}}</mat-label>\r\n <mat-chip-grid multiple #chipListvendor class=\"chip-container\">\r\n @for(obj of chipSelectedObj; track obj ){\r\n <mat-chip-row [removable]=\"true\" (removed)=\"removechip(obj)\" class=\"mat-chipEx\">\r\n {{ obj[InputFields.displaykey] }}\r\n <mat-icon matChipRemove>cancel</mat-icon>\r\n </mat-chip-row>\r\n }\r\n \r\n <input #DropInput [matAutocomplete]=\"scrolll\" class=\"matformfieldinputstyle\"\r\n (keydown)=\"dropdownsearch()\" [matChipInputFor]=\"chipListvendor\" [matChipInputSeparatorKeyCodes]=\"\r\n separatorsKeysCodes\r\n \" [matChipInputAddOnBlur]=\"true\" formControlName=\"value\" />\r\n </mat-chip-grid>\r\n <mat-autocomplete #scrolll=\"matAutocomplete\" (optionSelected)=\"venSelected($event)\"\r\n (opened)=\"autocompleteAppScroll()\">\r\n <ng-container>\r\n @for(dropvalues of Dropdowndata; track dropvalues ){\r\n <mat-option [value]=\"dropvalues\" (click)=\"selected()\">\r\n {{dropvalues[InputFields.displaykey]}}\r\n </mat-option>\r\n }\r\n \r\n </ng-container>\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n </form>\r\n</div>", styles: [".mat-chipScroll{max-width:420px;width:100%}.mat-chipEx{text-align:left}.chip-container{overflow-y:scroll;max-height:80px}.chip-container::-webkit-scrollbar{width:6px;height:6px}.chip-container::-webkit-scrollbar-track{background:transparent}.chip-container::-webkit-scrollbar-thumb{border-radius:20px;background:#c3c3c3}.chip-container::-webkit-scrollbar-thumb:hover{background:#a6a6a6}\n"] }]
225
- }], ctorParameters: () => [{ type: i1.VsChipdropdownService }, { type: i2.FormBuilder }], propDecorators: { InputFields: [{
226
- type: Input
227
- }], ResetForm: [{
228
- type: Input
229
- }], Backendapi: [{
230
- type: Input
231
- }], autocompleteTrigger: [{
232
- type: ViewChild,
233
- args: [MatAutocompleteTrigger]
234
- }], matAutocompleteApp: [{
235
- type: ViewChild,
236
- args: ['scrolll']
237
- }], dataEvent: [{
238
- type: Output
239
- }], DropInput: [{
240
- type: ViewChild,
241
- args: ['DropInput']
242
- }] } });
243
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidnMtY2hpcGRkLWNtcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92cy1jaGlwZHJvcGRvd24vc3JjL2xpYi92cy1jaGlwZGQtY21wL3ZzLWNoaXBkZC1jbXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdnMtY2hpcGRyb3Bkb3duL3NyYy9saWIvdnMtY2hpcGRkLWNtcC92cy1jaGlwZGQtY21wLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRyxPQUFPLEVBQWdDLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZILE9BQU8sRUFDTCxZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLEdBQUcsRUFFSCxTQUFTLEVBQ1QsUUFBUSxFQUNSLFNBQVMsRUFDVCxHQUFHLEdBQ0osTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQW9CLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVuRCxPQUFPLEVBQTRCLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7Ozs7QUFPckQsTUFBTSxPQUFPLG9CQUFvQjtJQUUvQixZQUFvQixPQUE4QixFQUFVLEVBQWU7UUFBdkQsWUFBTyxHQUFQLE9BQU8sQ0FBdUI7UUFBVSxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBRDNFLG1CQUFjLEdBQVcsS0FBSyxDQUFDO1FBSXRCLGVBQVUsR0FBWSxJQUFJLENBQUE7UUFFQSx3QkFBbUIsR0FBTyxzQkFBc0IsQ0FBQztRQUM5RCx1QkFBa0IsR0FBTyxlQUFlLENBQUM7UUFDckQsY0FBUyxH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QUFDO2lCQUNJLENBQUM7Z0JBQ0osSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBRTFDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELFVBQVUsQ0FBQyxDQUFLO1FBQ2QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUE7UUFDckMsQ0FBQzthQUNJLENBQUM7WUFDSixJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztnQkFDVixPQUFPLElBQUksQ0FBQTtZQUNiLENBQUM7aUJBQ0ksQ0FBQztnQkFDSixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFBO1lBQ3BDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQzs4R0ExT1Usb0JBQW9CO2tHQUFwQixvQkFBb0IsNk9BT3BCLHNCQUFzQiw4UEM3Qm5DLHFyREErQk07OzJGRFRPLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDRSxtQkFBbUI7b0hBT3BCLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUU2QixtQkFBbUI7c0JBQXJELFNBQVM7dUJBQUMsc0JBQXNCO2dCQUNYLGtCQUFrQjtzQkFBdkMsU0FBUzt1QkFBQyxTQUFTO2dCQUNWLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ2lCLFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCwgTWF0QXV0b2NvbXBsZXRlLCBNYXRBdXRvY29tcGxldGVUcmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcclxuaW1wb3J0IHtcclxuICBkZWJvdW5jZVRpbWUsXHJcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXHJcbiAgdGFwLFxyXG4gIGZpbHRlcixcclxuICBzd2l0Y2hNYXAsXHJcbiAgZmluYWxpemUsXHJcbiAgdGFrZVVudGlsLFxyXG4gIG1hcCxcclxufSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFZzQ2hpcGRyb3Bkb3duU2VydmljZSB9IGZyb20gJy4uL3ZzLWNoaXBkcm9wZG93bi5zZXJ2aWNlJ1xyXG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQ09NTUEsIEVOVEVSIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXZzLWNoaXBkZC1jbXAnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi92cy1jaGlwZGQtY21wLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vdnMtY2hpcGRkLWNtcC5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFZzQ2hpcGRkQ21wQ29tcG9uZW50IHtcclxuICBEcm9kb3duTG9hZGluZzpib29sZWFuID0gZmFsc2U7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzZXJ2aWNlOiBWc0NoaXBkcm9wZG93blNlcnZpY2UsIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyKSB7IH1cclxuICBASW5wdXQoKSBJbnB1dEZpZWxkczogYW55XHJcbiAgQElucHV0KCkgUmVzZXRGb3JtOiBhbnlcclxuICBASW5wdXQoKSBCYWNrZW5kYXBpOiBib29sZWFuID0gdHJ1ZVxyXG5cclxuICBAVmlld0NoaWxkKE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIpIGF1dG9jb21wbGV0ZVRyaWdnZXI6YW55ID0gTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcjtcclxuICBAVmlld0NoaWxkKCdzY3JvbGxsJykgbWF0QXV0b2NvbXBsZXRlQXBwOmFueSA9IE1hdEF1dG9jb21wbGV0ZTtcclxuICBAT3V0cHV0KCkgZGF0YUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBWaWV3Q2hpbGQoJ0Ryb3BJbnB1dCcpIERyb3BJbnB1dDogYW55O1xyXG4gIHJlYWRvbmx5IHNlcGFyYXRvcnNLZXlzQ29kZXM6IG51bWJlcltdID0gW0VOVEVSLCBDT01NQV07XHJcblxyXG4gIGhhc19uZXh0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgY3VycmVudHBhZ2U6IG51bWJlciA9IDE7XHJcbiAgRHJvcGRvd25kYXRhOiBhbnkgPSBbXTtcclxuICBoYXNfcHJldmlvdXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBEcm9wZG93bkZvcm06IGFueSA9IEZvcm1Hcm91cFxyXG4gIGNoaXBTZWxlY3RlZElkOiBhbnkgPSBbXTtcclxuICBjaGlwU2VsZWN0ZWRPYmo6IGFueSA9IFtdXHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5Ecm9wZG93bkZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgdmFsdWU6ICcnXHJcbiAgICB9KVxyXG4gICAgaWYgKHRoaXMuSW5wdXRGaWVsZHM/LmRlZmF1bHR2YWx1ZSkge1xyXG4gICAgICB0aGlzLkRyb3Bkb3duRm9ybS5nZXQoXCJ2YWx1ZVwiKS5wYXRjaFZhbHVlKHRoaXMuSW5wdXRGaWVsZHM/LmRlZmF1bHR2YWx1ZSlcclxuICAgICAgdGhpcy5jaGlwU2VsZWN0ZWRPYmogPSB0aGlzLklucHV0RmllbGRzPy5kZWZhdWx0dmFsdWVcclxuICAgICAgaWYgKHRoaXMuY2hpcFNlbGVjdGVkT2JqLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBmb3IgKGxldCBmb3VuZGVtcCBvZiB0aGlzLmNoaXBTZWxlY3RlZE9iaikge1xyXG4gICAgICAgICAgaWYgKHRoaXMuSW5wdXRGaWVsZHM/Lk91dHB1dGtleSkge1xyXG4gICAgICAgICAgICB0aGlzLmNoaXBTZWxlY3RlZElkLnB1c2goZm91bmRlbXBbdGhpcy5JbnB1dEZpZWxkcz8uT3V0cHV0a2V5XSlcclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jaGlwU2VsZWN0ZWRJZC5wdXNoKGZvdW5kZW1wLmlkKVxyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZCgpXHJcbiAgICAgIH1cclxuXHJcblxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuSW5wdXRGaWVsZHM/LmZyb25lbnRkYXRhKSB7XHJcbiAgICAgIHRoaXMuRHJvcGRvd25kYXRhID0gdGhpcy5JbnB1dEZpZWxkcz8uZGF0YVxyXG5cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmdldGRyb3Bkb3duKCcnKVxyXG4gICAgfVxyXG4gIH1cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBjb25zb2xlLmxvZyhcImNoYW5nZXMuUmVzZXRGb3JtXCIsIGNoYW5nZXNbJ1Jlc2V0Rm9ybSddLCBjaGFuZ2VzWydSZXNldEZvcm0nXS5jdXJyZW50VmFsdWUsIGNoYW5nZXNbJ1Jlc2V0Rm9ybSddICYmIGNoYW5nZXNbJ1Jlc2V0Rm9ybSddLmN1cnJlbnRWYWx1ZSlcclxuICAgIGlmIChjaGFuZ2VzWydJbnB1dEZpZWxkcyddICYmIGNoYW5nZXNbJ0lucHV0RmllbGRzJ10uY3VycmVudFZhbHVlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiU3VtbWFyeSBMb2cgQ2hhbmdlc1wiKVxyXG4gICAgICB0aGlzLmN1cnJlbnRwYWdlID0gMVxyXG4gICAgICB0aGlzLm5nT25Jbml0KClcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWydSZXNldEZvcm0nXSAmJiBjaGFuZ2VzWydSZXNldEZvcm0nXS5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJoaXR0ZWRcIilcclxuICAgICAgdGhpcy5Ecm9wZG93bkZvcm0ucmVzZXQoKVxyXG4gICAgICB0aGlzLmN1cnJlbnRwYWdlID0gMVxyXG4gICAgICB0aGlzLm5nT25Jbml0KClcclxuICAgICAgdGhpcy5jaGlwU2VsZWN0ZWRJZCA9IFtdO1xyXG4gICAgICB0aGlzLmNoaXBTZWxlY3RlZE9iaiA9IFtdXHJcbiAgICAgIHRoaXMuZGF0YUV2ZW50LmVtaXQoW10pO1xyXG5cclxuXHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vIHB1YmxpYyBkaXNwbGF5ZGV2ZWxvcGNsaWVudChjbHQ6IGFueSwga2V5OiBzdHJpbmcpIHtcclxuICAvLyAgIHJldHVybiBrZXlbY2x0XTtcclxuICAvLyB9XHJcbiAgYXV0b2NvbXBsZXRlQXBwU2Nyb2xsKCkge1xyXG4gICAgaWYgKCEodGhpcy5JbnB1dEZpZWxkcz8uZnJvbmVudGRhdGEpKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHRoaXMubWF0QXV0b2NvbXBsZXRlQXBwICYmXHJcbiAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZVRyaWdnZXIgJiZcclxuICAgICAgICAgIHRoaXMubWF0QXV0b2NvbXBsZXRlQXBwLnBhbmVsXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBmcm9tRXZlbnQodGhpcy5tYXRBdXRvY29tcGxldGVBcHAucGFuZWwubmF0aXZlRWxlbWVudCwgJ3Njcm9sbCcpXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgIG1hcCh4ID0+IHRoaXMubWF0QXV0b2NvbXBsZXRlQXBwLnBhbmVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wKSxcclxuICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5hdXRvY29tcGxldGVUcmlnZ2VyLnBhbmVsQ2xvc2luZ0FjdGlvbnMgYXMgT2JzZXJ2YWJsZTxhbnk+KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoeCA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsVG9wID0gdGhpcy5tYXRBdXRvY29tcGxldGVBcHAucGFuZWwubmF0aXZlRWxlbWVudC5zY3JvbGxUb3A7XHJcbiAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsSGVpZ2h0ID0gdGhpcy5tYXRBdXRvY29tcGxldGVBcHAucGFuZWwubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgY29uc3QgZWxlbWVudEhlaWdodCA9IHRoaXMubWF0QXV0b2NvbXBsZXRlQXBwLnBhbmVsLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0O1xyXG4gICAgICAgICAgICAgIGNvbnN0IGF0Qm90dG9tID0gc2Nyb2xsSGVpZ2h0IC0gMSA8PSBzY3JvbGxUb3AgKyBlbGVtZW50SGVpZ2h0O1xyXG4gICAgICAgICAgICAgIGlmIChhdEJvdHRvbSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzX25leHQgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5Ecm9wSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZVxyXG4gICAgICAgICAgICAgICAgICBsZXQgcGFyYW1zID0gdGhpcy5zZWFyY2hwYXJhbXModmFsdWUpXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudHBhZ2UgPSB0aGlzLmN1cnJlbnRwYWdlICsgMVxyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50cGFnZSA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2UuR2V0QXBpKHRoaXMuSW5wdXRGaWVsZHMudXJsICsgXCI/cGFnZT1cIiArIHRoaXMuY3VycmVudHBhZ2UsIHBhcmFtcylcclxuICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdHM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YXMgPSByZXN1bHRzW1wiZGF0YVwiXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFwYWdpbmF0aW9uID0gcmVzdWx0c1tcInBhZ2luYXRpb25cIl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRHJvcGRvd25kYXRhID0gdGhpcy5Ecm9wZG93bmRhdGEuY29uY2F0KGRhdGFzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJ0aGlzLkRyb3Bkb3duZGF0YVwiLCB0aGlzLkRyb3Bkb3duZGF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuRHJvcGRvd25kYXRhLmxlbmd0aCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNfbmV4dCA9IGRhdGFwYWdpbmF0aW9uLmhhc19uZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzX3ByZXZpb3VzID0gZGF0YXBhZ2luYXRpb24uaGFzX3ByZXZpb3VzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudHBhZ2UgPSBkYXRhcGFnaW5hdGlvbi5pbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuICBkcm9wZG93bnNlYXJjaCgpIHtcclxuICAgIGlmICghKHRoaXMuSW5wdXRGaWVsZHM/LmZyb25lbnRkYXRhKSkge1xyXG4gICAgICB0aGlzLkRyb3Bkb3duRm9ybS5nZXQoXCJ2YWx1ZVwiKS52YWx1ZUNoYW5nZXMucGlwZShcclxuICAgICAgICBkZWJvdW5jZVRpbWUoMTAwKSxcclxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLkRyb2Rvd25Mb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiaW5zaWRlIHRhcFwiKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICBsZXQgcGFyYW1zID0gdGhpcy5zZWFyY2hwYXJhbXModmFsdWUpO1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50cGFnZSA9IDFcclxuICAgICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2UuR2V0QXBpKHRoaXMuSW5wdXRGaWVsZHMudXJsICsgXCI/cGFnZT1cIiArIHRoaXMuY3VycmVudHBhZ2UsIHBhcmFtcykucGlwZShcclxuICAgICAgICAgICAgZmluYWxpemUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuRHJvZG93bkxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKS5zdWJzY3JpYmUoKHJlc3VsdHM6IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCBkYXRhcyA9IHJlc3VsdHNbXCJkYXRhXCJdO1xyXG4gICAgICAgIHRoaXMuRHJvcGRvd25kYXRhID0gZGF0YXM7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICB9XHJcbiAgZ2V0ZHJvcGRvd24odmFsdWU6YW55KSB7XHJcbiAgICBsZXQgcGFyYW1zID0gdGhpcy5zZWFyY2hwYXJhbXModmFsdWUpXHJcbiAgICB0aGlzLnNlcnZpY2UuR2V0QXBpKHRoaXMuSW5wdXRGaWVsZHMudXJsICsgXCI/cGFnZT1cIiArIHRoaXMuY3VycmVudHBhZ2UsIHBhcmFtcylcclxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0czogYW55KSA9PiB7XHJcbiAgICAgICAgbGV0IGRhdGFzID0gcmVzdWx0c1tcImRhdGFcIl07XHJcbiAgICAgICAgbGV0IGRhdGFwYWdpbmF0aW9uID0gcmVzdWx0c1tcInBhZ2luYXRpb25cIl07XHJcbiAgICAgICAgdGhpcy5Ecm9wZG93bmRhdGEgPSBkYXRhc1xyXG4gICAgICAgIGlmICh0aGlzLkRyb3Bkb3duZGF0YS5sZW5ndGggPj0gMCkge1xyXG4gICAgICAgICAgdGhpcy5oYXNfbmV4dCA9IGRhdGFwYWdpbmF0aW9uLmhhc19uZXh0O1xyXG4gICAgICAgICAgdGhpcy5oYXNfcHJldmlvdXMgPSBkYXRhcGFnaW5hdGlvbi5oYXNfcHJldmlvdXM7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRwYWdlID0gZGF0YXBhZ2luYXRpb24uaW5kZXg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gIH1cclxuICBzZWxlY3RlZCgpIHtcclxuICAgIC8vIGxldCBkYXRhID0gdGhpcy5Ecm9wZG93bkZvcm0udmFsdWUudmFsdWVcclxuICAgIGlmICh0aGlzLklucHV0RmllbGRzPy53aG9sZWRhdGEpIHtcclxuICAgICAgdGhpcy5kYXRhRXZlbnQuZW1pdCh0aGlzLmNoaXBTZWxlY3RlZE9iaik7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuSW5wdXRGaWVsZHM/Lk91dHB1dGtleSkge1xyXG4gICAgICAgIHRoaXMuZGF0YUV2ZW50LmVtaXQodGhpcy5jaGlwU2VsZWN0ZWRJZCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5kYXRhRXZlbnQuZW1pdCh0aGlzLmNoaXBTZWxlY3RlZE9iaik7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gIH1cclxuICBzZWFyY2hwYXJhbXModmFsdWU6YW55KSB7XHJcbiAgICBsZXQgcGFyYW1zID0gJydcclxuICAgIGlmICh0aGlzLklucHV0RmllbGRzLnBhcmFtcykge1xyXG4gICAgICBwYXJhbXMgPSB0aGlzLklucHV0RmllbGRzLnBhcmFtc1xyXG4gICAgfVxyXG4gICAgbGV0IGlucFZhbHVlID0gdmFsdWVcclxuICAgIGlucFZhbHVlID8gcGFyYW1zICs9ICcmJyArIHRoaXMuSW5wdXRGaWVsZHMuc2VhcmNoa2V5ICsgJz0nICsgaW5wVmFsdWUgOiAnJ1xyXG4gICAgcmV0dXJuIHBhcmFtc1xyXG4gIH1cclxuICByZW1vdmVjaGlwKG9iajphbnkpIHtcclxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jaGlwU2VsZWN0ZWRPYmouaW5kZXhPZihvYmopO1xyXG5cclxuICAgIGlmIChpbmRleCA+PSAwKSB7XHJcblxyXG4gICAgICB0aGlzLmNoaXBTZWxlY3RlZE9iai5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICBjb25zb2xlLmxvZyh0aGlzLmNoaXBTZWxlY3RlZE9iaik7XHJcbiAgICAgIHRoaXMuY2hpcFNlbGVjdGVkSWQuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgY29uc29sZS5sb2codGhpcy5jaGlwU2VsZWN0ZWRJZCk7XHJcbiAgICAgIHRoaXMuRHJvcElucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcclxuICAgICAgdGhpcy5zZWxlY3RlZCgpXHJcbiAgICB9XHJcblxyXG4gIH1cclxuICBwdWJsaWMgdmVuU2VsZWN0ZWQoZXZlbnQ6IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuRHJvcElucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcclxuICAgIGNvbnNvbGUubG9nKCdldmVudC5vcHRpb24udmFsdWUnLCBldmVudC5vcHRpb24udmFsdWUpXHJcbiAgICB0aGlzLnNlbGVjdHZlbkJ5TmFtZShldmVudC5vcHRpb24udmFsdWVbdGhpcy5jb21wYXJla2V5KGV2ZW50Lm9wdGlvbi52YWx1ZSldKTtcclxuICAgIGNvbnNvbGUubG9nKCdjaGlwU2VsZWN0ZWR2ZW5pZCcsIHRoaXMuY2hpcFNlbGVjdGVkT2JqKVxyXG4gIH1cclxuICBwcml2YXRlIHNlbGVjdHZlbkJ5TmFtZSh2ZW46YW55KSB7XHJcbiAgICBsZXQgZm91bmRlbXAxID0gdGhpcy5jaGlwU2VsZWN0ZWRPYmouZmlsdGVyKChlOiB7IFt4OiBzdHJpbmddOiBhbnk7IH0pID0+IGVbdGhpcy5jb21wYXJla2V5KGUpXSA9PSB2ZW4pO1xyXG4gICAgaWYgKGZvdW5kZW1wMS5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IGZvdW5kZW1wID0gdGhpcy5Ecm9wZG93bmRhdGEuZmlsdGVyKChlOiB7IFt4OiBzdHJpbmddOiBhbnk7IH0pID0+IGVbdGhpcy5jb21wYXJla2V5KGUpXSA9PSB2ZW4pO1xyXG4gICAgaWYgKGZvdW5kZW1wLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmNoaXBTZWxlY3RlZE9iai5wdXNoKGZvdW5kZW1wWzBdKTtcclxuICAgICAgaWYgKHRoaXMuSW5wdXRGaWVsZHM/Lk91dHB1dGtleSkge1xyXG4gICAgICAgIHRoaXMuY2hpcFNlbGVjdGVkSWQucHVzaChmb3VuZGVtcFswXVt0aGlzLklucHV0RmllbGRzPy5PdXRwdXRrZXldKVxyXG5cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLmNoaXBTZWxlY3RlZElkLnB1c2goZm91bmRlbXBbMF0uaWQpXHJcblxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGNvbXBhcmVrZXkoZTphbnkpIHtcclxuICAgIGlmICh0aGlzLklucHV0RmllbGRzPy5jb21wYXJla2V5KSB7XHJcbiAgICAgIHJldHVybiB0aGlzLklucHV0RmllbGRzPy5jb21wYXJla2V5XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKGU/LmlkKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiaWRcIlxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB0aGlzLklucHV0RmllbGRzLmRpc3BsYXlrZXlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2PlxyXG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJEcm9wZG93bkZvcm1cIj5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtYXQtY2hpcFNjcm9sbFwiXHJcbiAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgPG1hdC1sYWJlbD57e0lucHV0RmllbGRzLmxhYmVsIHwgdHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgPG1hdC1jaGlwLWdyaWQgbXVsdGlwbGUgI2NoaXBMaXN0dmVuZG9yIGNsYXNzPVwiY2hpcC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIEBmb3Iob2JqIG9mIGNoaXBTZWxlY3RlZE9iajsgdHJhY2sgb2JqICl7XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwLXJvdyAgW3JlbW92YWJsZV09XCJ0cnVlXCIgKHJlbW92ZWQpPVwicmVtb3ZlY2hpcChvYmopXCIgY2xhc3M9XCJtYXQtY2hpcEV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9ialtJbnB1dEZpZWxkcy5kaXNwbGF5a2V5XSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gbWF0Q2hpcFJlbW92ZT5jYW5jZWw8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXAtcm93PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgI0Ryb3BJbnB1dCBbbWF0QXV0b2NvbXBsZXRlXT1cInNjcm9sbGxcIiBjbGFzcz1cIm1hdGZvcm1maWVsZGlucHV0c3R5bGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImRyb3Bkb3duc2VhcmNoKClcIiBbbWF0Q2hpcElucHV0Rm9yXT1cImNoaXBMaXN0dmVuZG9yXCIgW21hdENoaXBJbnB1dFNlcGFyYXRvcktleUNvZGVzXT1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3JzS2V5c0NvZGVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBbbWF0Q2hpcElucHV0QWRkT25CbHVyXT1cInRydWVcIiBmb3JtQ29udHJvbE5hbWU9XCJ2YWx1ZVwiIC8+XHJcbiAgICAgICAgICAgIDwvbWF0LWNoaXAtZ3JpZD5cclxuICAgICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgI3Njcm9sbGw9XCJtYXRBdXRvY29tcGxldGVcIiAob3B0aW9uU2VsZWN0ZWQpPVwidmVuU2VsZWN0ZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAob3BlbmVkKT1cImF1dG9jb21wbGV0ZUFwcFNjcm9sbCgpXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIEBmb3IoZHJvcHZhbHVlcyBvZiBEcm9wZG93bmRhdGE7IHRyYWNrIGRyb3B2YWx1ZXMgKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cImRyb3B2YWx1ZXNcIiAoY2xpY2spPVwic2VsZWN0ZWQoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tkcm9wdmFsdWVzW0lucHV0RmllbGRzLmRpc3BsYXlrZXldfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8L2Zvcm0+XHJcbjwvZGl2PiJdfQ==
1
+ import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
+ import { MatAutocompleteTrigger } from '@angular/material/autocomplete';
3
+ import { debounceTime, distinctUntilChanged, tap, switchMap, finalize, takeUntil, map, } from "rxjs/operators";
4
+ import { fromEvent } from 'rxjs';
5
+ import { COMMA, ENTER } from '@angular/cdk/keycodes';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../vs-chipdropdown.service";
8
+ import * as i2 from "@angular/forms";
9
+ import * as i3 from "@angular/material/form-field";
10
+ import * as i4 from "@angular/common";
11
+ import * as i5 from "@angular/material/core";
12
+ import * as i6 from "@angular/material/autocomplete";
13
+ import * as i7 from "@angular/material/chips";
14
+ export class VsChipddCmpComponent {
15
+ constructor(service, fb) {
16
+ this.service = service;
17
+ this.fb = fb;
18
+ this.dataEvent = new EventEmitter();
19
+ this.separatorsKeysCodes = [ENTER, COMMA];
20
+ this.has_next = false;
21
+ this.currentpage = 1;
22
+ this.Dropdowndata = [];
23
+ this.has_previous = false;
24
+ this.chipSelectedven = [];
25
+ }
26
+ ngOnInit() {
27
+ this.DropdownForm = this.fb.group({
28
+ value: ''
29
+ });
30
+ this.getdropdown('');
31
+ }
32
+ displaydevelopclient(clt, key) {
33
+ return key[clt];
34
+ }
35
+ autocompleteAppScroll() {
36
+ setTimeout(() => {
37
+ if (this.matAutocompleteApp &&
38
+ this.autocompleteTrigger &&
39
+ this.matAutocompleteApp.panel) {
40
+ fromEvent(this.matAutocompleteApp.panel.nativeElement, 'scroll')
41
+ .pipe(map(x => this.matAutocompleteApp.panel.nativeElement.scrollTop), takeUntil(this.autocompleteTrigger.panelClosingActions))
42
+ .subscribe(x => {
43
+ const scrollTop = this.matAutocompleteApp.panel.nativeElement.scrollTop;
44
+ const scrollHeight = this.matAutocompleteApp.panel.nativeElement.scrollHeight;
45
+ const elementHeight = this.matAutocompleteApp.panel.nativeElement.clientHeight;
46
+ const atBottom = scrollHeight - 1 <= scrollTop + elementHeight;
47
+ if (atBottom) {
48
+ if (this.has_next === true) {
49
+ let value = this.DropInput.nativeElement.value;
50
+ let params = this.searchparams(value);
51
+ this.currentpage = this.currentpage + 1;
52
+ if (this.currentpage > 1) {
53
+ this.service.GetApi(this.InputFields.url + "?page=" + this.currentpage, params)
54
+ .subscribe((results) => {
55
+ let datas = results["data"];
56
+ let datapagination = results["pagination"];
57
+ this.Dropdowndata = this.Dropdowndata.concat(datas);
58
+ console.log("this.Dropdowndata", this.Dropdowndata);
59
+ if (this.Dropdowndata.length >= 0) {
60
+ this.has_next = datapagination.has_next;
61
+ this.has_previous = datapagination.has_previous;
62
+ this.currentpage = datapagination.index;
63
+ }
64
+ });
65
+ }
66
+ }
67
+ }
68
+ });
69
+ }
70
+ });
71
+ }
72
+ dropdownsearch() {
73
+ this.DropdownForm.get("value").valueChanges.pipe(debounceTime(100), distinctUntilChanged(), tap(() => {
74
+ this.DrodownLoading = true;
75
+ console.log("inside tap");
76
+ }), switchMap((value) => {
77
+ let params = this.searchparams(value);
78
+ this.currentpage = 1;
79
+ return this.service.GetApi(this.InputFields.url + "?page=" + this.currentpage, params).pipe(finalize(() => {
80
+ this.DrodownLoading = false;
81
+ }));
82
+ })).subscribe((results) => {
83
+ let datas = results["data"];
84
+ this.Dropdowndata = datas;
85
+ });
86
+ }
87
+ getdropdown(value) {
88
+ let params = this.searchparams(value);
89
+ this.service.GetApi(this.InputFields.url + "?page=" + this.currentpage, params)
90
+ .subscribe((results) => {
91
+ let datas = results["data"];
92
+ let datapagination = results["pagination"];
93
+ this.Dropdowndata = datas;
94
+ if (this.Dropdowndata.length >= 0) {
95
+ this.has_next = datapagination.has_next;
96
+ this.has_previous = datapagination.has_previous;
97
+ this.currentpage = datapagination.index;
98
+ }
99
+ });
100
+ }
101
+ selected() {
102
+ let data = this.DropdownForm.value.value;
103
+ this.dataEvent.emit(data);
104
+ }
105
+ searchparams(value) {
106
+ let params = '';
107
+ if (this.InputFields.params) {
108
+ params = this.InputFields.params;
109
+ }
110
+ let inpValue = value;
111
+ inpValue ? params += '&' + this.InputFields.searchkey + '=' + inpValue : '';
112
+ return params;
113
+ }
114
+ removechip(obj) {
115
+ }
116
+ venSelected(event) {
117
+ this.DropInput.nativeElement.value = '';
118
+ console.log('event.option.value', event.option.value);
119
+ this.selectvenByName(event.option.value.name);
120
+ console.log('chipSelectedvenid', this.chipSelectedven);
121
+ }
122
+ selectvenByName(ven) {
123
+ let foundemp1 = this.chipSelectedven.filter(e => e.name == ven);
124
+ if (foundemp1.length) {
125
+ return;
126
+ }
127
+ let foundemp = this.Dropdowndata.filter(e => e.name == ven);
128
+ if (foundemp.length) {
129
+ this.chipSelectedven.push(foundemp[0]);
130
+ this.chipSelectedven.push(foundemp[0].id);
131
+ }
132
+ }
133
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: VsChipddCmpComponent, deps: [{ token: i1.VsChipdropdownService }, { token: i2.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
134
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: VsChipddCmpComponent, selector: "lib-vs-chipdd-cmp", inputs: { InputFields: "InputFields" }, outputs: { dataEvent: "dataEvent" }, viewQueries: [{ propertyName: "autocompleteTrigger", first: true, predicate: MatAutocompleteTrigger, descendants: true }, { propertyName: "matAutocompleteApp", first: true, predicate: ["scrolll"], descendants: true }, { propertyName: "DropInput", first: true, predicate: ["DropInput"], descendants: true }], ngImport: i0, template: "<div>\n <form [formGroup]=\"DropdownForm\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{InputFields.label}}</mat-label>\n <mat-chip-grid multiple #chipListvendor>\n <mat-chip-row\n *ngFor=\"let vendor of chipSelectedven\"\n [removable]=\"true\"\n (removed)=\"removechip(vendor)\"\n >\n {{ vendor.name }}\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip-row>\n <input\n #DropInput\n formControlName=\"value\"\n [matAutocomplete]=\"scrolll\"\n class=\"matformfieldinputstyle\"\n (keydown)=\"dropdownsearch()\"\n [matChipInputFor]=\"chipListvendor\"\n [matChipInputSeparatorKeyCodes]=\"\n separatorsKeysCodes\n \"\n [matChipInputAddOnBlur]=\"true\"\n />\n </mat-chip-grid>\n <mat-autocomplete #scrolll=\"matAutocomplete\"\n (optionSelected)=\"venSelected($event)\"\n (opened)=\"autocompleteAppScroll()\">\n <ng-container>\n <mat-option *ngFor=\"let dropvalues of Dropdowndata\" [value]=\"dropvalues\" (click)=\"selected()\">\n {{dropvalues[InputFields.displaykey]}}\n </mat-option>\n </ng-container>\n </mat-autocomplete>\n </mat-form-field>\n </form>\n <!-- <mat-chip-grid multiple #chipListvendor>\n <mat-chip-row\n *ngFor=\"let vendor of chipSelectedven\"\n [removable]=\"true\"\n (removed)=\"removedven(vendor)\"\n >\n {{ vendor.name }}\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip-row>\n <input\n #DropInput\n formControlName=\"value\"\n [matAutocomplete]=\"scrolll\"\n class=\"matformfieldinputstyle\"\n (keydown)=\"dropdownsearch()\"\n [matChipInputFor]=\"chipListvendor\"\n [matChipInputSeparatorKeyCodes]=\"\n separatorsKeysCodes\n \"\n [matChipInputAddOnBlur]=\"true\"\n />\n </mat-chip-grid> -->\n</div>", styles: [""], dependencies: [{ kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i6.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple", "hideSingleSelectionIndicator"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i6.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i7.MatChipGrid, selector: "mat-chip-grid", inputs: ["tabIndex", "disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i7.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i7.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i7.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["color", "disabled", "disableRipple", "tabIndex", "editable"], outputs: ["edited"] }] }); }
135
+ }
136
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: VsChipddCmpComponent, decorators: [{
137
+ type: Component,
138
+ args: [{ selector: 'lib-vs-chipdd-cmp', template: "<div>\n <form [formGroup]=\"DropdownForm\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{InputFields.label}}</mat-label>\n <mat-chip-grid multiple #chipListvendor>\n <mat-chip-row\n *ngFor=\"let vendor of chipSelectedven\"\n [removable]=\"true\"\n (removed)=\"removechip(vendor)\"\n >\n {{ vendor.name }}\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip-row>\n <input\n #DropInput\n formControlName=\"value\"\n [matAutocomplete]=\"scrolll\"\n class=\"matformfieldinputstyle\"\n (keydown)=\"dropdownsearch()\"\n [matChipInputFor]=\"chipListvendor\"\n [matChipInputSeparatorKeyCodes]=\"\n separatorsKeysCodes\n \"\n [matChipInputAddOnBlur]=\"true\"\n />\n </mat-chip-grid>\n <mat-autocomplete #scrolll=\"matAutocomplete\"\n (optionSelected)=\"venSelected($event)\"\n (opened)=\"autocompleteAppScroll()\">\n <ng-container>\n <mat-option *ngFor=\"let dropvalues of Dropdowndata\" [value]=\"dropvalues\" (click)=\"selected()\">\n {{dropvalues[InputFields.displaykey]}}\n </mat-option>\n </ng-container>\n </mat-autocomplete>\n </mat-form-field>\n </form>\n <!-- <mat-chip-grid multiple #chipListvendor>\n <mat-chip-row\n *ngFor=\"let vendor of chipSelectedven\"\n [removable]=\"true\"\n (removed)=\"removedven(vendor)\"\n >\n {{ vendor.name }}\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip-row>\n <input\n #DropInput\n formControlName=\"value\"\n [matAutocomplete]=\"scrolll\"\n class=\"matformfieldinputstyle\"\n (keydown)=\"dropdownsearch()\"\n [matChipInputFor]=\"chipListvendor\"\n [matChipInputSeparatorKeyCodes]=\"\n separatorsKeysCodes\n \"\n [matChipInputAddOnBlur]=\"true\"\n />\n </mat-chip-grid> -->\n</div>" }]
139
+ }], ctorParameters: function () { return [{ type: i1.VsChipdropdownService }, { type: i2.FormBuilder }]; }, propDecorators: { InputFields: [{
140
+ type: Input
141
+ }], autocompleteTrigger: [{
142
+ type: ViewChild,
143
+ args: [MatAutocompleteTrigger]
144
+ }], matAutocompleteApp: [{
145
+ type: ViewChild,
146
+ args: ['scrolll']
147
+ }], dataEvent: [{
148
+ type: Output
149
+ }], DropInput: [{
150
+ type: ViewChild,
151
+ args: ['DropInput']
152
+ }] } });
153
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidnMtY2hpcGRkLWNtcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92cy1jaGlwZHJvcGRvd24vc3JjL2xpYi92cy1jaGlwZGQtY21wL3ZzLWNoaXBkZC1jbXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdnMtY2hpcGRyb3Bkb3duL3NyYy9saWIvdnMtY2hpcGRkLWNtcC92cy1jaGlwZGQtY21wLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBaUQsc0JBQXNCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN2SCxPQUFPLEVBQ0wsWUFBWSxFQUNaLG9CQUFvQixFQUNwQixHQUFHLEVBRUgsU0FBUyxFQUNULFFBQVEsRUFDUixTQUFTLEVBQ1QsR0FBRyxHQUNKLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFvQixTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHbkQsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7O0FBTXJELE1BQU0sT0FBTyxvQkFBb0I7SUFFL0IsWUFBb0IsT0FBOEIsRUFBVSxFQUFlO1FBQXZELFlBQU8sR0FBUCxPQUFPLENBQXVCO1FBQVUsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUlqRSxjQUFTLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFFeEQsd0JBQW1CLEdBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEQsYUFBUSxHQUFXLEtBQUssQ0FBQztRQUN6QixnQkFBVyxHQUFTLENBQUMsQ0FBQztRQUN0QixpQkFBWSxHQUFNLEVBQUUsQ0FBQztRQUNyQixpQkFBWSxH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eU9DekJuQyxnNEZBMkRNOzs0RkR0Q08sb0JBQW9CO2tCQUxoQyxTQUFTOytCQUNFLG1CQUFtQjtzSUFPcEIsV0FBVztzQkFBbkIsS0FBSztnQkFDNkIsbUJBQW1CO3NCQUFyRCxTQUFTO3VCQUFDLHNCQUFzQjtnQkFDWCxrQkFBa0I7c0JBQXZDLFNBQVM7dUJBQUMsU0FBUztnQkFDVixTQUFTO3NCQUFsQixNQUFNO2dCQUNpQixTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50LCBNYXRBdXRvY29tcGxldGUsIE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHtcbiAgZGVib3VuY2VUaW1lLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgdGFwLFxuICBmaWx0ZXIsXG4gIHN3aXRjaE1hcCxcbiAgZmluYWxpemUsXG4gIHRha2VVbnRpbCxcbiAgbWFwLFxufSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IGZyb20sIE9ic2VydmFibGUsIGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtWc0NoaXBkcm9wZG93blNlcnZpY2V9IGZyb20gJy4uL3ZzLWNoaXBkcm9wZG93bi5zZXJ2aWNlJ1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENPTU1BLCBFTlRFUiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItdnMtY2hpcGRkLWNtcCcsXG4gIHRlbXBsYXRlVXJsOiAnLi92cy1jaGlwZGQtY21wLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdnMtY2hpcGRkLWNtcC5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgVnNDaGlwZGRDbXBDb21wb25lbnQge1xuICBEcm9kb3duTG9hZGluZzogYm9vbGVhbjtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzZXJ2aWNlOiBWc0NoaXBkcm9wZG93blNlcnZpY2UsIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyKSB7IH1cbiAgQElucHV0KCkgSW5wdXRGaWVsZHM6IGFueVxuICBAVmlld0NoaWxkKE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIpIGF1dG9jb21wbGV0ZVRyaWdnZXI6IE1hdEF1dG9jb21wbGV0ZVRyaWdnZXI7XG4gIEBWaWV3Q2hpbGQoJ3Njcm9sbGwnKSBtYXRBdXRvY29tcGxldGVBcHA6IE1hdEF1dG9jb21wbGV0ZTtcbiAgQE91dHB1dCgpIGRhdGFFdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQFZpZXdDaGlsZCgnRHJvcElucHV0JykgRHJvcElucHV0OiBhbnk7XG4gIHJlYWRvbmx5IHNlcGFyYXRvcnNLZXlzQ29kZXM6IG51bWJlcltdID0gW0VOVEVSLCBDT01NQV07XG5cbiAgaGFzX25leHQ6IGJvb2xlYW49IGZhbHNlO1xuICBjdXJyZW50cGFnZTogbnVtYmVyPTE7XG4gIERyb3Bkb3duZGF0YTogYW55PVtdO1xuICBoYXNfcHJldmlvdXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgRHJvcGRvd25Gb3JtOiBGb3JtR3JvdXBcbiAgY2hpcFNlbGVjdGVkdmVuOmFueT1bXVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuRHJvcGRvd25Gb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICB2YWx1ZTogJydcbiAgICB9KVxuICAgIHRoaXMuZ2V0ZHJvcGRvd24oJycpXG4gIH1cbiAgcHVibGljIGRpc3BsYXlkZXZlbG9wY2xpZW50KGNsdDogYW55LCBrZXk6IHN0cmluZykge1xuICAgIHJldHVybiBrZXlbY2x0XTtcbiAgfVxuICBhdXRvY29tcGxldGVBcHBTY3JvbGwoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubWF0QXV0b2NvbXBsZXRlQXBwICYmXG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlVHJpZ2dlciAmJlxuICAgICAgICB0aGlzLm1hdEF1dG9jb21wbGV0ZUFwcC5wYW5lbFxuICAgICAgKSB7XG4gICAgICAgIGZyb21FdmVudCh0aGlzLm1hdEF1dG9jb21wbGV0ZUFwcC5wYW5lbC5uYXRpdmVFbGVtZW50LCAnc2Nyb2xsJylcbiAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgIG1hcCh4ID0+IHRoaXMubWF0QXV0b2NvbXBsZXRlQXBwLnBhbmVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wKSxcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmF1dG9jb21wbGV0ZVRyaWdnZXIucGFuZWxDbG9zaW5nQWN0aW9ucyBhcyBPYnNlcnZhYmxlPGFueT4pXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zdWJzY3JpYmUoeCA9PiB7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxUb3AgPSB0aGlzLm1hdEF1dG9jb21wbGV0ZUFwcC5wYW5lbC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcDtcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbEhlaWdodCA9IHRoaXMubWF0QXV0b2NvbXBsZXRlQXBwLnBhbmVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudEhlaWdodCA9IHRoaXMubWF0QXV0b2NvbXBsZXRlQXBwLnBhbmVsLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgICAgICAgY29uc3QgYXRCb3R0b20gPSBzY3JvbGxIZWlnaHQgLSAxIDw9IHNjcm9sbFRvcCArIGVsZW1lbnRIZWlnaHQ7XG4gICAgICAgICAgICBpZiAoYXRCb3R0b20pIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzX25leHQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWU9IHRoaXMuRHJvcElucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWVcbiAgICAgICAgICAgICAgICBsZXQgcGFyYW1zPXRoaXMuc2VhcmNocGFyYW1zKHZhbHVlKVxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudHBhZ2U9dGhpcy5jdXJyZW50cGFnZSArIDFcbiAgICAgICAgICAgICAgICBpZih0aGlzLmN1cnJlbnRwYWdlPjEpe1xuICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLkdldEFwaSh0aGlzLklucHV0RmllbGRzLnVybCArIFwiP3BhZ2U9XCIgK3RoaXMuY3VycmVudHBhZ2UsIHBhcmFtcylcbiAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdHM6IGFueVtdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhcyA9IHJlc3VsdHNbXCJkYXRhXCJdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YXBhZ2luYXRpb24gPSByZXN1bHRzW1wicGFnaW5hdGlvblwiXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5Ecm9wZG93bmRhdGEgPSB0aGlzLkRyb3Bkb3duZGF0YS5jb25jYXQoZGF0YXMpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInRoaXMuRHJvcGRvd25kYXRhXCIsdGhpcy5Ecm9wZG93bmRhdGEpXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLkRyb3Bkb3duZGF0YS5sZW5ndGggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzX25leHQgPSBkYXRhcGFnaW5hdGlvbi5oYXNfbmV4dDtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc19wcmV2aW91cyA9IGRhdGFwYWdpbmF0aW9uLmhhc19wcmV2aW91cztcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRwYWdlID0gZGF0YXBhZ2luYXRpb24uaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgZHJvcGRvd25zZWFyY2goKSB7XG4gICAgdGhpcy5Ecm9wZG93bkZvcm0uZ2V0KFwidmFsdWVcIikudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICBkZWJvdW5jZVRpbWUoMTAwKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICB0YXAoKCkgPT4ge1xuICAgICAgICB0aGlzLkRyb2Rvd25Mb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgY29uc29sZS5sb2coXCJpbnNpZGUgdGFwXCIpO1xuICAgICAgfSksXG4gICAgICBzd2l0Y2hNYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgIGxldCBwYXJhbXMgPSB0aGlzLnNlYXJjaHBhcmFtcyh2YWx1ZSk7XG4gICAgICAgIHRoaXMuY3VycmVudHBhZ2U9MVxuICAgICAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLkdldEFwaSh0aGlzLklucHV0RmllbGRzLnVybCtcIj9wYWdlPVwiK3RoaXMuY3VycmVudHBhZ2UsIHBhcmFtcykucGlwZShcbiAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLkRyb2Rvd25Mb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKS5zdWJzY3JpYmUoKHJlc3VsdHM6IGFueVtdKSA9PiB7XG4gICAgICAgIGxldCBkYXRhcyA9IHJlc3VsdHNbXCJkYXRhXCJdO1xuICAgICAgICB0aGlzLkRyb3Bkb3duZGF0YSA9IGRhdGFzO1xuICAgICAgfSk7XG4gIH1cbiAgZ2V0ZHJvcGRvd24odmFsdWUpIHtcbiAgICBsZXQgcGFyYW1zID10aGlzLnNlYXJjaHBhcmFtcyh2YWx1ZSlcbiAgICB0aGlzLnNlcnZpY2UuR2V0QXBpKHRoaXMuSW5wdXRGaWVsZHMudXJsK1wiP3BhZ2U9XCIrdGhpcy5jdXJyZW50cGFnZSwgcGFyYW1zKVxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0czogYW55W10pID0+IHtcbiAgICAgICAgbGV0IGRhdGFzID0gcmVzdWx0c1tcImRhdGFcIl07XG4gICAgICAgIGxldCBkYXRhcGFnaW5hdGlvbiA9IHJlc3VsdHNbXCJwYWdpbmF0aW9uXCJdO1xuICAgICAgICB0aGlzLkRyb3Bkb3duZGF0YSA9IGRhdGFzXG4gICAgICAgIGlmICh0aGlzLkRyb3Bkb3duZGF0YS5sZW5ndGggPj0gMCkge1xuICAgICAgICAgIHRoaXMuaGFzX25leHQgPSBkYXRhcGFnaW5hdGlvbi5oYXNfbmV4dDtcbiAgICAgICAgICB0aGlzLmhhc19wcmV2aW91cyA9IGRhdGFwYWdpbmF0aW9uLmhhc19wcmV2aW91cztcbiAgICAgICAgICB0aGlzLmN1cnJlbnRwYWdlID0gZGF0YXBhZ2luYXRpb24uaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gIH1cbiAgc2VsZWN0ZWQoKSB7XG4gICAgbGV0IGRhdGEgPSB0aGlzLkRyb3Bkb3duRm9ybS52YWx1ZS52YWx1ZVxuICAgIHRoaXMuZGF0YUV2ZW50LmVtaXQoZGF0YSk7XG5cbiAgfVxuICBzZWFyY2hwYXJhbXModmFsdWUpIHtcbiAgICBsZXQgcGFyYW1zID0gJydcbiAgICBpZiAodGhpcy5JbnB1dEZpZWxkcy5wYXJhbXMpIHtcbiAgICAgIHBhcmFtcyA9IHRoaXMuSW5wdXRGaWVsZHMucGFyYW1zXG4gICAgfVxuICAgIGxldCBpbnBWYWx1ZSA9dmFsdWVcbiAgICBpbnBWYWx1ZSA/IHBhcmFtcyArPSAnJicgKyB0aGlzLklucHV0RmllbGRzLnNlYXJjaGtleSArICc9JyArIGlucFZhbHVlIDogJydcbiAgICByZXR1cm4gcGFyYW1zXG4gIH1cbiAgcmVtb3ZlY2hpcChvYmope1xuXG4gIH1cbiAgcHVibGljIHZlblNlbGVjdGVkKGV2ZW50OiBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5Ecm9wSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgIGNvbnNvbGUubG9nKCdldmVudC5vcHRpb24udmFsdWUnLCBldmVudC5vcHRpb24udmFsdWUpXG4gICAgdGhpcy5zZWxlY3R2ZW5CeU5hbWUoZXZlbnQub3B0aW9uLnZhbHVlLm5hbWUpO1xuICAgIGNvbnNvbGUubG9nKCdjaGlwU2VsZWN0ZWR2ZW5pZCcsIHRoaXMuY2hpcFNlbGVjdGVkdmVuKVxuICB9XG4gIHByaXZhdGUgc2VsZWN0dmVuQnlOYW1lKHZlbikge1xuICAgIGxldCBmb3VuZGVtcDEgPSB0aGlzLmNoaXBTZWxlY3RlZHZlbi5maWx0ZXIoZSA9PiBlLm5hbWUgPT0gdmVuKTtcbiAgICBpZiAoZm91bmRlbXAxLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgZm91bmRlbXAgPSB0aGlzLkRyb3Bkb3duZGF0YS5maWx0ZXIoZSA9PiBlLm5hbWUgPT0gdmVuKTtcbiAgICBpZiAoZm91bmRlbXAubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNoaXBTZWxlY3RlZHZlbi5wdXNoKGZvdW5kZW1wWzBdKTtcbiAgICAgIHRoaXMuY2hpcFNlbGVjdGVkdmVuLnB1c2goZm91bmRlbXBbMF0uaWQpXG4gICAgfVxufVxufSIsIjxkaXY+XG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJEcm9wZG93bkZvcm1cIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7SW5wdXRGaWVsZHMubGFiZWx9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPG1hdC1jaGlwLWdyaWQgbXVsdGlwbGUgI2NoaXBMaXN0dmVuZG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAtcm93XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHZlbmRvciBvZiBjaGlwU2VsZWN0ZWR2ZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZW1vdmFibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbW92ZWQpPVwicmVtb3ZlY2hpcCh2ZW5kb3IpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHZlbmRvci5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIG1hdENoaXBSZW1vdmU+Y2FuY2VsPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hpcC1yb3c+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICNEcm9wSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJzY3JvbGxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdGZvcm1maWVsZGlucHV0c3R5bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImRyb3Bkb3duc2VhcmNoKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRDaGlwSW5wdXRGb3JdPVwiY2hpcExpc3R2ZW5kb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRDaGlwSW5wdXRTZXBhcmF0b3JLZXlDb2Rlc109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRvcnNLZXlzQ29kZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRDaGlwSW5wdXRBZGRPbkJsdXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGlwLWdyaWQ+XG4gICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjc2Nyb2xsbD1cIm1hdEF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cInZlblNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChvcGVuZWQpPVwiYXV0b2NvbXBsZXRlQXBwU2Nyb2xsKClcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgZHJvcHZhbHVlcyBvZiBEcm9wZG93bmRhdGFcIiBbdmFsdWVdPVwiZHJvcHZhbHVlc1wiIChjbGljayk9XCJzZWxlY3RlZCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e2Ryb3B2YWx1ZXNbSW5wdXRGaWVsZHMuZGlzcGxheWtleV19fVxuICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9mb3JtPlxuICAgIDwhLS0gPG1hdC1jaGlwLWdyaWQgbXVsdGlwbGUgI2NoaXBMaXN0dmVuZG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAtcm93XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHZlbmRvciBvZiBjaGlwU2VsZWN0ZWR2ZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZW1vdmFibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbW92ZWQpPVwicmVtb3ZlZHZlbih2ZW5kb3IpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHZlbmRvci5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIG1hdENoaXBSZW1vdmU+Y2FuY2VsPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hpcC1yb3c+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICNEcm9wSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJzY3JvbGxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdGZvcm1maWVsZGlucHV0c3R5bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImRyb3Bkb3duc2VhcmNoKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRDaGlwSW5wdXRGb3JdPVwiY2hpcExpc3R2ZW5kb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRDaGlwSW5wdXRTZXBhcmF0b3JLZXlDb2Rlc109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRvcnNLZXlzQ29kZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRDaGlwSW5wdXRBZGRPbkJsdXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGlwLWdyaWQ+IC0tPlxuPC9kaXY+Il19