@marcura/marcura-combobox 4.6.2 → 6.0.0
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/esm2020/lib/combobox.module.mjs +103 -0
- package/esm2020/lib/components/abstract-combobox/abstract-combobox.component.mjs +241 -0
- package/esm2020/lib/components/abstract-dropdown/abstract-dropdown.component.mjs +227 -0
- package/esm2020/lib/components/combobox/combobox.component.mjs +359 -0
- package/esm2020/lib/components/combobox-popup-footer/combobox-popup-footer.component.mjs +38 -0
- package/esm2020/lib/components/dropdown/dropdown.component.mjs +232 -0
- package/esm2020/lib/components/multiselect/multiselect.component.mjs +244 -0
- package/esm2020/lib/directives/combobox-item-template.directive.mjs +13 -0
- package/esm2020/lib/directives/dropdown-item-template.directive.mjs +13 -0
- package/esm2020/lib/directives/dropdown-value-template.directive.mjs +13 -0
- package/esm2020/lib/directives/multiselect-item-template.directive.mjs +13 -0
- package/esm2020/lib/directives/multiselect-tag-template.directive.mjs +13 -0
- package/esm2020/lib/directives/multiselect-tag-wrapper.directive.mjs +60 -0
- package/{esm2015/lib/model/combobox-kendo-component.interface.js → esm2020/lib/model/combobox-kendo-component.interface.mjs} +1 -0
- package/{esm2015/lib/model/combobox-localization.interface.js → esm2020/lib/model/combobox-localization.interface.mjs} +1 -0
- package/esm2020/lib/model/combobox-search-fn.type.mjs +2 -0
- package/{esm2015/lib/model/combobox-search-settings.interface.js → esm2020/lib/model/combobox-search-settings.interface.mjs} +1 -0
- package/{esm2015/lib/model/dropdown-kendo-component.interface.js → esm2020/lib/model/dropdown-kendo-component.interface.mjs} +1 -0
- package/{esm2015/lib/model/dropdown-localization.interface.js → esm2020/lib/model/dropdown-localization.interface.mjs} +1 -0
- package/{esm2015/lib/model/dropdown-localizer.interface.js → esm2020/lib/model/dropdown-localizer.interface.mjs} +1 -0
- package/{esm2015/lib/model/multiselect-localization.interface.js → esm2020/lib/model/multiselect-localization.interface.mjs} +1 -0
- package/fesm2015/marcura-marcura-combobox.mjs +1522 -0
- package/fesm2015/marcura-marcura-combobox.mjs.map +1 -0
- package/fesm2020/marcura-marcura-combobox.mjs +1517 -0
- package/fesm2020/marcura-marcura-combobox.mjs.map +1 -0
- package/{marcura-marcura-combobox.d.ts → index.d.ts} +1 -0
- package/lib/combobox.module.d.ts +21 -0
- package/lib/components/abstract-combobox/abstract-combobox.component.d.ts +19 -12
- package/lib/components/abstract-dropdown/abstract-dropdown.component.d.ts +16 -10
- package/lib/components/combobox/combobox.component.d.ts +8 -6
- package/lib/components/combobox-popup-footer/combobox-popup-footer.component.d.ts +3 -0
- package/lib/components/dropdown/dropdown.component.d.ts +8 -6
- package/lib/components/multiselect/multiselect.component.d.ts +11 -9
- package/lib/directives/combobox-item-template.directive.d.ts +3 -0
- package/lib/directives/dropdown-item-template.directive.d.ts +3 -0
- package/lib/directives/dropdown-value-template.directive.d.ts +3 -0
- package/lib/directives/multiselect-item-template.directive.d.ts +3 -0
- package/lib/directives/multiselect-tag-template.directive.d.ts +3 -0
- package/lib/directives/multiselect-tag-wrapper.directive.d.ts +3 -0
- package/lib/model/combobox-search-fn.type.d.ts +2 -1
- package/package.json +29 -17
- package/bundles/marcura-marcura-combobox.umd.js +0 -1850
- package/bundles/marcura-marcura-combobox.umd.js.map +0 -1
- package/bundles/marcura-marcura-combobox.umd.min.js +0 -2
- package/bundles/marcura-marcura-combobox.umd.min.js.map +0 -1
- package/esm2015/lib/combobox.module.js +0 -61
- package/esm2015/lib/components/abstract-combobox/abstract-combobox.component.js +0 -226
- package/esm2015/lib/components/abstract-dropdown/abstract-dropdown.component.js +0 -205
- package/esm2015/lib/components/combobox/combobox.component.js +0 -289
- package/esm2015/lib/components/combobox-popup-footer/combobox-popup-footer.component.js +0 -27
- package/esm2015/lib/components/dropdown/dropdown.component.js +0 -166
- package/esm2015/lib/components/multiselect/multiselect.component.js +0 -180
- package/esm2015/lib/directives/combobox-item-template.directive.js +0 -9
- package/esm2015/lib/directives/dropdown-item-template.directive.js +0 -9
- package/esm2015/lib/directives/dropdown-value-template.directive.js +0 -9
- package/esm2015/lib/directives/multiselect-item-template.directive.js +0 -9
- package/esm2015/lib/directives/multiselect-tag-template.directive.js +0 -9
- package/esm2015/lib/directives/multiselect-tag-wrapper.directive.js +0 -59
- package/esm2015/lib/model/combobox-search-fn.type.js +0 -1
- package/fesm2015/marcura-marcura-combobox.js +0 -1229
- package/fesm2015/marcura-marcura-combobox.js.map +0 -1
- package/marcura-marcura-combobox.metadata.json +0 -1
- /package/{esm2015/lib/combobox.injectables.js → esm2020/lib/combobox.injectables.mjs} +0 -0
- /package/{esm2015/lib/model/combobox-changed.event.js → esm2020/lib/model/combobox-changed.event.mjs} +0 -0
- /package/{esm2015/lib/model/combobox-search-settings-operator.enum.js → esm2020/lib/model/combobox-search-settings-operator.enum.mjs} +0 -0
- /package/{esm2015/lib/model/dropdown-changed.event.js → esm2020/lib/model/dropdown-changed.event.mjs} +0 -0
- /package/{esm2015/lib/model/multiselect-changed.event.js → esm2020/lib/model/multiselect-changed.event.mjs} +0 -0
- /package/{esm2015/marcura-marcura-combobox.js → esm2020/marcura-marcura-combobox.mjs} +0 -0
- /package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { NgModule } from '@angular/core';
|
|
3
|
+
import { ReactiveFormsModule } from '@angular/forms';
|
|
4
|
+
import { TagModule } from '@marcura/marcura-tag';
|
|
5
|
+
import { ComboBoxModule, DropDownListModule, MultiSelectModule } from '@progress/kendo-angular-dropdowns';
|
|
6
|
+
import { PopupModule, POPUP_CONTAINER } from '@progress/kendo-angular-popup';
|
|
7
|
+
import { ComboboxItemTemplateDirective } from '../lib/directives/combobox-item-template.directive';
|
|
8
|
+
import { DropdownItemTemplateDirective } from '../lib/directives/dropdown-item-template.directive';
|
|
9
|
+
import { DropdownValueTemplateDirective } from '../lib/directives/dropdown-value-template.directive';
|
|
10
|
+
import { MultiselectItemTemplateDirective } from '../lib/directives/multiselect-item-template.directive';
|
|
11
|
+
import { MultiselectTagTemplateDirective } from '../lib/directives/multiselect-tag-template.directive';
|
|
12
|
+
import { MultiselectTagWrapperDirective } from '../lib/directives/multiselect-tag-wrapper.directive';
|
|
13
|
+
import { AbstractComboboxComponent } from './components/abstract-combobox/abstract-combobox.component';
|
|
14
|
+
import { AbstractDropdownComponent } from './components/abstract-dropdown/abstract-dropdown.component';
|
|
15
|
+
import { ComboboxPopupFooterComponent } from './components/combobox-popup-footer/combobox-popup-footer.component';
|
|
16
|
+
import { ComboboxComponent } from './components/combobox/combobox.component';
|
|
17
|
+
import { DropdownComponent } from './components/dropdown/dropdown.component';
|
|
18
|
+
import { MultiselectComponent } from './components/multiselect/multiselect.component';
|
|
19
|
+
import * as i0 from "@angular/core";
|
|
20
|
+
const components = [
|
|
21
|
+
AbstractComboboxComponent,
|
|
22
|
+
AbstractDropdownComponent,
|
|
23
|
+
ComboboxComponent,
|
|
24
|
+
ComboboxPopupFooterComponent,
|
|
25
|
+
MultiselectComponent,
|
|
26
|
+
DropdownComponent,
|
|
27
|
+
];
|
|
28
|
+
const directives = [
|
|
29
|
+
ComboboxItemTemplateDirective,
|
|
30
|
+
MultiselectItemTemplateDirective,
|
|
31
|
+
MultiselectTagTemplateDirective,
|
|
32
|
+
MultiselectTagWrapperDirective,
|
|
33
|
+
DropdownItemTemplateDirective,
|
|
34
|
+
DropdownValueTemplateDirective,
|
|
35
|
+
];
|
|
36
|
+
export function getPopupContainer() {
|
|
37
|
+
return { nativeElement: document.body };
|
|
38
|
+
}
|
|
39
|
+
export class ComboboxModule {
|
|
40
|
+
}
|
|
41
|
+
ComboboxModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: ComboboxModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
42
|
+
ComboboxModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.1.0", ngImport: i0, type: ComboboxModule, declarations: [AbstractComboboxComponent,
|
|
43
|
+
AbstractDropdownComponent,
|
|
44
|
+
ComboboxComponent,
|
|
45
|
+
ComboboxPopupFooterComponent,
|
|
46
|
+
MultiselectComponent,
|
|
47
|
+
DropdownComponent, ComboboxItemTemplateDirective,
|
|
48
|
+
MultiselectItemTemplateDirective,
|
|
49
|
+
MultiselectTagTemplateDirective,
|
|
50
|
+
MultiselectTagWrapperDirective,
|
|
51
|
+
DropdownItemTemplateDirective,
|
|
52
|
+
DropdownValueTemplateDirective], imports: [CommonModule,
|
|
53
|
+
ReactiveFormsModule,
|
|
54
|
+
ComboBoxModule,
|
|
55
|
+
MultiSelectModule,
|
|
56
|
+
PopupModule,
|
|
57
|
+
TagModule,
|
|
58
|
+
DropDownListModule], exports: [AbstractComboboxComponent,
|
|
59
|
+
AbstractDropdownComponent,
|
|
60
|
+
ComboboxComponent,
|
|
61
|
+
ComboboxPopupFooterComponent,
|
|
62
|
+
MultiselectComponent,
|
|
63
|
+
DropdownComponent, ComboboxItemTemplateDirective,
|
|
64
|
+
MultiselectItemTemplateDirective,
|
|
65
|
+
MultiselectTagTemplateDirective,
|
|
66
|
+
MultiselectTagWrapperDirective,
|
|
67
|
+
DropdownItemTemplateDirective,
|
|
68
|
+
DropdownValueTemplateDirective] });
|
|
69
|
+
ComboboxModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: ComboboxModule, providers: [
|
|
70
|
+
{
|
|
71
|
+
provide: POPUP_CONTAINER,
|
|
72
|
+
useFactory: getPopupContainer,
|
|
73
|
+
},
|
|
74
|
+
], imports: [CommonModule,
|
|
75
|
+
ReactiveFormsModule,
|
|
76
|
+
ComboBoxModule,
|
|
77
|
+
MultiSelectModule,
|
|
78
|
+
PopupModule,
|
|
79
|
+
TagModule,
|
|
80
|
+
DropDownListModule] });
|
|
81
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: ComboboxModule, decorators: [{
|
|
82
|
+
type: NgModule,
|
|
83
|
+
args: [{
|
|
84
|
+
declarations: [...components, ...directives],
|
|
85
|
+
imports: [
|
|
86
|
+
CommonModule,
|
|
87
|
+
ReactiveFormsModule,
|
|
88
|
+
ComboBoxModule,
|
|
89
|
+
MultiSelectModule,
|
|
90
|
+
PopupModule,
|
|
91
|
+
TagModule,
|
|
92
|
+
DropDownListModule,
|
|
93
|
+
],
|
|
94
|
+
exports: [...components, ...directives],
|
|
95
|
+
providers: [
|
|
96
|
+
{
|
|
97
|
+
provide: POPUP_CONTAINER,
|
|
98
|
+
useFactory: getPopupContainer,
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
}]
|
|
102
|
+
}] });
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3gubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jb21ib2JveC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBYSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUN4RyxPQUFPLEVBQUMsV0FBVyxFQUFFLGVBQWUsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQzNFLE9BQU8sRUFBQyw2QkFBNkIsRUFBQyxNQUFNLG9EQUFvRCxDQUFDO0FBQ2pHLE9BQU8sRUFBQyw2QkFBNkIsRUFBQyxNQUFNLG9EQUFvRCxDQUFDO0FBQ2pHLE9BQU8sRUFBQyw4QkFBOEIsRUFBQyxNQUFNLHFEQUFxRCxDQUFDO0FBQ25HLE9BQU8sRUFBQyxnQ0FBZ0MsRUFBQyxNQUFNLHVEQUF1RCxDQUFDO0FBQ3ZHLE9BQU8sRUFBQywrQkFBK0IsRUFBQyxNQUFNLHNEQUFzRCxDQUFDO0FBQ3JHLE9BQU8sRUFBQyw4QkFBOEIsRUFBQyxNQUFNLHFEQUFxRCxDQUFDO0FBQ25HLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLDREQUE0RCxDQUFDO0FBQ3JHLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLDREQUE0RCxDQUFDO0FBQ3JHLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLG9FQUFvRSxDQUFDO0FBQ2hILE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBQzNFLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBQzNFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLGdEQUFnRCxDQUFDOztBQUVwRixNQUFNLFVBQVUsR0FBVTtJQUN4Qix5QkFBeUI7SUFDekIseUJBQXlCO0lBQ3pCLGlCQUFpQjtJQUNqQiw0QkFBNEI7SUFDNUIsb0JBQW9CO0lBQ3BCLGlCQUFpQjtDQUNsQixDQUFDO0FBQ0YsTUFBTSxVQUFVLEdBQVU7SUFDeEIsNkJBQTZCO0lBQzdCLGdDQUFnQztJQUNoQywrQkFBK0I7SUFDL0IsOEJBQThCO0lBQzlCLDZCQUE2QjtJQUM3Qiw4QkFBOEI7Q0FDL0IsQ0FBQztBQUVGLE1BQU0sVUFBVSxpQkFBaUI7SUFDL0IsT0FBTyxFQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFlLENBQUM7QUFDdEQsQ0FBQztBQXFCRCxNQUFNLE9BQU8sY0FBYzs7MkdBQWQsY0FBYzs0R0FBZCxjQUFjLGlCQXZDekIseUJBQXlCO1FBQ3pCLHlCQUF5QjtRQUN6QixpQkFBaUI7UUFDakIsNEJBQTRCO1FBQzVCLG9CQUFvQjtRQUNwQixpQkFBaUIsRUFHakIsNkJBQTZCO1FBQzdCLGdDQUFnQztRQUNoQywrQkFBK0I7UUFDL0IsOEJBQThCO1FBQzlCLDZCQUE2QjtRQUM3Qiw4QkFBOEIsYUFVNUIsWUFBWTtRQUNaLG1CQUFtQjtRQUNuQixjQUFjO1FBQ2QsaUJBQWlCO1FBQ2pCLFdBQVc7UUFDWCxTQUFTO1FBQ1Qsa0JBQWtCLGFBN0JwQix5QkFBeUI7UUFDekIseUJBQXlCO1FBQ3pCLGlCQUFpQjtRQUNqQiw0QkFBNEI7UUFDNUIsb0JBQW9CO1FBQ3BCLGlCQUFpQixFQUdqQiw2QkFBNkI7UUFDN0IsZ0NBQWdDO1FBQ2hDLCtCQUErQjtRQUMvQiw4QkFBOEI7UUFDOUIsNkJBQTZCO1FBQzdCLDhCQUE4Qjs0R0EwQm5CLGNBQWMsYUFQZDtRQUNUO1lBQ0UsT0FBTyxFQUFFLGVBQWU7WUFDeEIsVUFBVSxFQUFFLGlCQUFpQjtTQUM5QjtLQUNGLFlBZEMsWUFBWTtRQUNaLG1CQUFtQjtRQUNuQixjQUFjO1FBQ2QsaUJBQWlCO1FBQ2pCLFdBQVc7UUFDWCxTQUFTO1FBQ1Qsa0JBQWtCOzJGQVVULGNBQWM7a0JBbkIxQixRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLEdBQUcsVUFBVSxDQUFDO29CQUM1QyxPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLGNBQWM7d0JBQ2QsaUJBQWlCO3dCQUNqQixXQUFXO3dCQUNYLFNBQVM7d0JBQ1Qsa0JBQWtCO3FCQUNuQjtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxHQUFHLFVBQVUsQ0FBQztvQkFDdkMsU0FBUyxFQUFFO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxlQUFlOzRCQUN4QixVQUFVLEVBQUUsaUJBQWlCO3lCQUM5QjtxQkFDRjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tbW9uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtFbGVtZW50UmVmLCBOZ01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1JlYWN0aXZlRm9ybXNNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7VGFnTW9kdWxlfSBmcm9tICdAbWFyY3VyYS9tYXJjdXJhLXRhZyc7XG5pbXBvcnQge0NvbWJvQm94TW9kdWxlLCBEcm9wRG93bkxpc3RNb2R1bGUsIE11bHRpU2VsZWN0TW9kdWxlfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1kcm9wZG93bnMnO1xuaW1wb3J0IHtQb3B1cE1vZHVsZSwgUE9QVVBfQ09OVEFJTkVSfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1wb3B1cCc7XG5pbXBvcnQge0NvbWJvYm94SXRlbVRlbXBsYXRlRGlyZWN0aXZlfSBmcm9tICcuLi9saWIvZGlyZWN0aXZlcy9jb21ib2JveC1pdGVtLXRlbXBsYXRlLmRpcmVjdGl2ZSc7XG5pbXBvcnQge0Ryb3Bkb3duSXRlbVRlbXBsYXRlRGlyZWN0aXZlfSBmcm9tICcuLi9saWIvZGlyZWN0aXZlcy9kcm9wZG93bi1pdGVtLXRlbXBsYXRlLmRpcmVjdGl2ZSc7XG5pbXBvcnQge0Ryb3Bkb3duVmFsdWVUZW1wbGF0ZURpcmVjdGl2ZX0gZnJvbSAnLi4vbGliL2RpcmVjdGl2ZXMvZHJvcGRvd24tdmFsdWUtdGVtcGxhdGUuZGlyZWN0aXZlJztcbmltcG9ydCB7TXVsdGlzZWxlY3RJdGVtVGVtcGxhdGVEaXJlY3RpdmV9IGZyb20gJy4uL2xpYi9kaXJlY3RpdmVzL211bHRpc2VsZWN0LWl0ZW0tdGVtcGxhdGUuZGlyZWN0aXZlJztcbmltcG9ydCB7TXVsdGlzZWxlY3RUYWdUZW1wbGF0ZURpcmVjdGl2ZX0gZnJvbSAnLi4vbGliL2RpcmVjdGl2ZXMvbXVsdGlzZWxlY3QtdGFnLXRlbXBsYXRlLmRpcmVjdGl2ZSc7XG5pbXBvcnQge011bHRpc2VsZWN0VGFnV3JhcHBlckRpcmVjdGl2ZX0gZnJvbSAnLi4vbGliL2RpcmVjdGl2ZXMvbXVsdGlzZWxlY3QtdGFnLXdyYXBwZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7QWJzdHJhY3RDb21ib2JveENvbXBvbmVudH0gZnJvbSAnLi9jb21wb25lbnRzL2Fic3RyYWN0LWNvbWJvYm94L2Fic3RyYWN0LWNvbWJvYm94LmNvbXBvbmVudCc7XG5pbXBvcnQge0Fic3RyYWN0RHJvcGRvd25Db21wb25lbnR9IGZyb20gJy4vY29tcG9uZW50cy9hYnN0cmFjdC1kcm9wZG93bi9hYnN0cmFjdC1kcm9wZG93bi5jb21wb25lbnQnO1xuaW1wb3J0IHtDb21ib2JveFBvcHVwRm9vdGVyQ29tcG9uZW50fSBmcm9tICcuL2NvbXBvbmVudHMvY29tYm9ib3gtcG9wdXAtZm9vdGVyL2NvbWJvYm94LXBvcHVwLWZvb3Rlci5jb21wb25lbnQnO1xuaW1wb3J0IHtDb21ib2JveENvbXBvbmVudH0gZnJvbSAnLi9jb21wb25lbnRzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudCc7XG5pbXBvcnQge0Ryb3Bkb3duQ29tcG9uZW50fSBmcm9tICcuL2NvbXBvbmVudHMvZHJvcGRvd24vZHJvcGRvd24uY29tcG9uZW50JztcbmltcG9ydCB7TXVsdGlzZWxlY3RDb21wb25lbnR9IGZyb20gJy4vY29tcG9uZW50cy9tdWx0aXNlbGVjdC9tdWx0aXNlbGVjdC5jb21wb25lbnQnO1xuXG5jb25zdCBjb21wb25lbnRzOiBhbnlbXSA9IFtcbiAgQWJzdHJhY3RDb21ib2JveENvbXBvbmVudCxcbiAgQWJzdHJhY3REcm9wZG93bkNvbXBvbmVudCxcbiAgQ29tYm9ib3hDb21wb25lbnQsXG4gIENvbWJvYm94UG9wdXBGb290ZXJDb21wb25lbnQsXG4gIE11bHRpc2VsZWN0Q29tcG9uZW50LFxuICBEcm9wZG93bkNvbXBvbmVudCxcbl07XG5jb25zdCBkaXJlY3RpdmVzOiBhbnlbXSA9IFtcbiAgQ29tYm9ib3hJdGVtVGVtcGxhdGVEaXJlY3RpdmUsXG4gIE11bHRpc2VsZWN0SXRlbVRlbXBsYXRlRGlyZWN0aXZlLFxuICBNdWx0aXNlbGVjdFRhZ1RlbXBsYXRlRGlyZWN0aXZlLFxuICBNdWx0aXNlbGVjdFRhZ1dyYXBwZXJEaXJlY3RpdmUsXG4gIERyb3Bkb3duSXRlbVRlbXBsYXRlRGlyZWN0aXZlLFxuICBEcm9wZG93blZhbHVlVGVtcGxhdGVEaXJlY3RpdmUsXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UG9wdXBDb250YWluZXIoKTogRWxlbWVudFJlZiB7XG4gIHJldHVybiB7bmF0aXZlRWxlbWVudDogZG9jdW1lbnQuYm9keX0gYXMgRWxlbWVudFJlZjtcbn1cblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbLi4uY29tcG9uZW50cywgLi4uZGlyZWN0aXZlc10sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBDb21ib0JveE1vZHVsZSxcbiAgICBNdWx0aVNlbGVjdE1vZHVsZSxcbiAgICBQb3B1cE1vZHVsZSxcbiAgICBUYWdNb2R1bGUsXG4gICAgRHJvcERvd25MaXN0TW9kdWxlLFxuICBdLFxuICBleHBvcnRzOiBbLi4uY29tcG9uZW50cywgLi4uZGlyZWN0aXZlc10sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IFBPUFVQX0NPTlRBSU5FUixcbiAgICAgIHVzZUZhY3Rvcnk6IGdldFBvcHVwQ29udGFpbmVyLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENvbWJvYm94TW9kdWxlIHt9XG4iXX0=
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, Renderer2, } from '@angular/core';
|
|
2
|
+
import { isFalse, Is, Observer, Worker, flatten } from '@marcura/marcura-common';
|
|
3
|
+
import { combineLatest, BehaviorSubject } from 'rxjs';
|
|
4
|
+
import { debounceTime, distinctUntilChanged, filter, map, skip, tap } from 'rxjs/operators';
|
|
5
|
+
import { AbstractDropdownComponent } from '../../components/abstract-dropdown/abstract-dropdown.component';
|
|
6
|
+
import { ComboboxSearchSettingsOperator } from '../../model/combobox-search-settings-operator.enum';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
export class AbstractComboboxComponent extends AbstractDropdownComponent {
|
|
9
|
+
get debounceTime() {
|
|
10
|
+
return this._debounceTime;
|
|
11
|
+
}
|
|
12
|
+
set debounceTime(value) {
|
|
13
|
+
this._debounceTime = value;
|
|
14
|
+
this._listenToSearched();
|
|
15
|
+
}
|
|
16
|
+
get items() {
|
|
17
|
+
return this._items;
|
|
18
|
+
}
|
|
19
|
+
set items(items) {
|
|
20
|
+
this._isSync = true;
|
|
21
|
+
this._items = items || [];
|
|
22
|
+
this._listenToSearched();
|
|
23
|
+
this._loadedItems.next(this._items);
|
|
24
|
+
}
|
|
25
|
+
get additionalItems() {
|
|
26
|
+
return this._additionalItems.value;
|
|
27
|
+
}
|
|
28
|
+
set additionalItems(additionalItems) {
|
|
29
|
+
this._additionalItems.next(additionalItems || []);
|
|
30
|
+
}
|
|
31
|
+
_disableChromeAutocomplete() {
|
|
32
|
+
if (this._component.searchbar && this._component.searchbar.input) {
|
|
33
|
+
this._renderer.setAttribute(this._component.searchbar.input.nativeElement, 'autocomplete', 'disabled');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
_listenToSearched() {
|
|
37
|
+
this._debounceObserver.clear();
|
|
38
|
+
this._debounceObserver.listen(this._searchText.pipe(distinctUntilChanged(), skip(1), tap((searchText) => {
|
|
39
|
+
this.searched.emit(searchText);
|
|
40
|
+
this._isSearching.next(this.canLoadItems(searchText) && this._isOpen.value.isOpen);
|
|
41
|
+
}), debounceTime(this._isSync ? 0 : this.debounceTime), filter(() => this._isOpen.value.isOpen)), this.loadItems);
|
|
42
|
+
}
|
|
43
|
+
_filterItems(items, searchText) {
|
|
44
|
+
if (!items || !items.length) {
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
// TODO: technical-debt - fix group result case to avoid any
|
|
48
|
+
return items.filter((item) => {
|
|
49
|
+
let itemText = (item[this.textField] || '').toString().trim() ?? '';
|
|
50
|
+
itemText = this.searchSettings.isCaseSensitive ? itemText : itemText.toLowerCase();
|
|
51
|
+
return this.searchSettings.operator === ComboboxSearchSettingsOperator.Contains
|
|
52
|
+
? itemText.indexOf(searchText) !== -1
|
|
53
|
+
: itemText.substring(0, searchText.length) === searchText;
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
_setComponent(component) {
|
|
57
|
+
this._component = component;
|
|
58
|
+
this._disableChromeAutocomplete();
|
|
59
|
+
}
|
|
60
|
+
searchItems(searchText) {
|
|
61
|
+
if (!this.searchSettings || !searchText || !this._items.length) {
|
|
62
|
+
return this._items;
|
|
63
|
+
}
|
|
64
|
+
searchText = this.searchSettings.isCaseSensitive ? searchText : searchText.toLowerCase();
|
|
65
|
+
if (this.isGroupable) {
|
|
66
|
+
const groups = this._items;
|
|
67
|
+
const filteredGroups = groups
|
|
68
|
+
.map((group) => ({
|
|
69
|
+
...group,
|
|
70
|
+
items: this._filterItems(group.items, searchText),
|
|
71
|
+
}))
|
|
72
|
+
.filter((group) => group.items.length > 0);
|
|
73
|
+
return filteredGroups;
|
|
74
|
+
}
|
|
75
|
+
return this._filterItems(this._items, searchText);
|
|
76
|
+
}
|
|
77
|
+
canLoadItems(searchText) {
|
|
78
|
+
return searchText.length >= this.minSearchCharacters && !this._isSync;
|
|
79
|
+
}
|
|
80
|
+
getItem(items, text) {
|
|
81
|
+
text = text.toLowerCase();
|
|
82
|
+
return this._unwrapGroups(items).find((item) => `${item[this.textField]}`.toLowerCase() === text) ?? null;
|
|
83
|
+
}
|
|
84
|
+
_unwrapGroups(items) {
|
|
85
|
+
return flatten(items.map(item => this._isGroupResult(item) ? item.items : [item]));
|
|
86
|
+
}
|
|
87
|
+
_isGroupResult(item) {
|
|
88
|
+
const object = item;
|
|
89
|
+
return object.items !== undefined && object.aggregates !== undefined && object.field !== undefined && object.value !== undefined;
|
|
90
|
+
}
|
|
91
|
+
isItemEqual(item1, item2) {
|
|
92
|
+
const isItem1Empty = item1 === null || item1 === undefined;
|
|
93
|
+
const isItem2Empty = item2 === null || item2 === undefined;
|
|
94
|
+
if (isItem1Empty && isItem2Empty) {
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
if (isItem1Empty || isItem2Empty) {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
return this.isPrimitiveValue ? item1 === item2 : item1[this.valueField] === item2[this.valueField];
|
|
101
|
+
}
|
|
102
|
+
constructor(changeDetectorRef, _renderer) {
|
|
103
|
+
super(changeDetectorRef);
|
|
104
|
+
this._renderer = _renderer;
|
|
105
|
+
this._debounceTime = 500;
|
|
106
|
+
this._debounceObserver = new Observer();
|
|
107
|
+
this._worker = new Worker();
|
|
108
|
+
this._additionalItems = new BehaviorSubject([]);
|
|
109
|
+
this._valueNormalizerItems = [];
|
|
110
|
+
this._isSync = false;
|
|
111
|
+
this._loadedItems = new BehaviorSubject([]);
|
|
112
|
+
this._hasSearched = new BehaviorSubject(false);
|
|
113
|
+
this._isSearching = new BehaviorSubject(false);
|
|
114
|
+
this._searchText = new BehaviorSubject('');
|
|
115
|
+
this.combinedItems = combineLatest([this._loadedItems, this._additionalItems]).pipe(map(([items, additionalItems]) => [...items, ...additionalItems].filter(Is.truthy)));
|
|
116
|
+
this.isSearchable = true;
|
|
117
|
+
this.minSearchCharacters = 1;
|
|
118
|
+
this.search = null;
|
|
119
|
+
this.areItemsCached = false;
|
|
120
|
+
this.searchSettings = {
|
|
121
|
+
isCaseSensitive: false,
|
|
122
|
+
operator: ComboboxSearchSettingsOperator.Contains,
|
|
123
|
+
};
|
|
124
|
+
this.isGroupable = false;
|
|
125
|
+
this.searched = new EventEmitter();
|
|
126
|
+
this.isNoItemsTextVisible = combineLatest([
|
|
127
|
+
this._isSearching,
|
|
128
|
+
this._hasSearched,
|
|
129
|
+
this._isFocused,
|
|
130
|
+
this.combinedItems,
|
|
131
|
+
]).pipe(map(([isSearching, hasSearched, isFocused, combinedItems]) => {
|
|
132
|
+
return !isSearching && hasSearched && isFocused && combinedItems.length === 0;
|
|
133
|
+
}));
|
|
134
|
+
this.isMinSearchTextVisible = combineLatest([
|
|
135
|
+
this._isSearching,
|
|
136
|
+
this._hasSearched,
|
|
137
|
+
this._isFocused,
|
|
138
|
+
]).pipe(map(([isSearching, hasSearched, isFocused]) => {
|
|
139
|
+
return !this._isSync && !isSearching && !hasSearched && isFocused;
|
|
140
|
+
}));
|
|
141
|
+
this.isLoadingSpinnerVisible = combineLatest([
|
|
142
|
+
this._isLoading,
|
|
143
|
+
this._isSearching,
|
|
144
|
+
]).pipe(map(([isLoading, isSearching]) => isLoading || isSearching));
|
|
145
|
+
// To show loading properly we are to use loadedItems as they don't include additionalItems.
|
|
146
|
+
this.isLoadingTextVisible = combineLatest([
|
|
147
|
+
this.isLoadingSpinnerVisible,
|
|
148
|
+
this._loadedItems,
|
|
149
|
+
]).pipe(map(([isLoadingSpinnerVisible, loadedItems]) => isLoadingSpinnerVisible && loadedItems.length === 0));
|
|
150
|
+
this.loadItems = (searchText) => {
|
|
151
|
+
searchText = (searchText || '').trim();
|
|
152
|
+
if (this._isSync) {
|
|
153
|
+
this._hasSearched.next(!!searchText);
|
|
154
|
+
this._loadedItems.next(this.searchItems(searchText));
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
if (this.canLoadItems(searchText)) {
|
|
158
|
+
this._isSearching.next(true);
|
|
159
|
+
this._worker.handle(this.search ? this.search(searchText) : new BehaviorSubject([]), (items) => {
|
|
160
|
+
this._hasSearched.next(true);
|
|
161
|
+
this._loadedItems.next(items);
|
|
162
|
+
this._valueNormalizerItems = [...items, ...this._additionalItems.value];
|
|
163
|
+
this._isSearching.next(false);
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
this._hasSearched.next(false);
|
|
168
|
+
this._loadedItems.next([]);
|
|
169
|
+
this._valueNormalizerItems = [];
|
|
170
|
+
this._isSearching.next(false);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
ngOnDestroy() {
|
|
176
|
+
this._debounceObserver.destroy();
|
|
177
|
+
this._worker.destroy();
|
|
178
|
+
super.ngOnDestroy();
|
|
179
|
+
}
|
|
180
|
+
init() {
|
|
181
|
+
super.init();
|
|
182
|
+
this._listenToSearched();
|
|
183
|
+
if (this._isSync) {
|
|
184
|
+
this._loadedItems.next(this._items);
|
|
185
|
+
}
|
|
186
|
+
// Closed.
|
|
187
|
+
this._observer.listen(this._isOpen.pipe(filter((event) => !event.isOpen), skip(1)), (event) => {
|
|
188
|
+
if (!this.areItemsCached && !this._isSync) {
|
|
189
|
+
this._loadedItems.next([]);
|
|
190
|
+
}
|
|
191
|
+
this._worker.cancel();
|
|
192
|
+
this._isSearching.next(false);
|
|
193
|
+
if (event.shouldEmit) {
|
|
194
|
+
this.closed.emit();
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
// Blurred.
|
|
198
|
+
this._observer.listen(this._isFocused.pipe(filter(isFalse)), () => {
|
|
199
|
+
// Restore original unfiltered items when the component is blurred
|
|
200
|
+
// after some search text entered. Consider a case:
|
|
201
|
+
// 1. Search with text that gives 0 items.
|
|
202
|
+
// 2. Blur and focus.
|
|
203
|
+
// 3. Search text is cleared, but items remain empty, so the list won't show up.
|
|
204
|
+
this._loadedItems.next(this._items);
|
|
205
|
+
this._hasSearched.next(false);
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
onSearched(searchText) {
|
|
209
|
+
this._searchText.next(searchText);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
AbstractComboboxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: AbstractComboboxComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
|
|
213
|
+
AbstractComboboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: AbstractComboboxComponent, selector: "ng-component", inputs: { isSearchable: "isSearchable", minSearchCharacters: "minSearchCharacters", search: "search", areItemsCached: "areItemsCached", debounceTime: "debounceTime", items: "items", additionalItems: "additionalItems", searchSettings: "searchSettings", isGroupable: "isGroupable" }, outputs: { searched: "searched" }, usesInheritance: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
214
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: AbstractComboboxComponent, decorators: [{
|
|
215
|
+
type: Component,
|
|
216
|
+
args: [{
|
|
217
|
+
template: '',
|
|
218
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
219
|
+
}]
|
|
220
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }]; }, propDecorators: { isSearchable: [{
|
|
221
|
+
type: Input
|
|
222
|
+
}], minSearchCharacters: [{
|
|
223
|
+
type: Input
|
|
224
|
+
}], search: [{
|
|
225
|
+
type: Input
|
|
226
|
+
}], areItemsCached: [{
|
|
227
|
+
type: Input
|
|
228
|
+
}], debounceTime: [{
|
|
229
|
+
type: Input
|
|
230
|
+
}], items: [{
|
|
231
|
+
type: Input
|
|
232
|
+
}], additionalItems: [{
|
|
233
|
+
type: Input
|
|
234
|
+
}], searchSettings: [{
|
|
235
|
+
type: Input
|
|
236
|
+
}], isGroupable: [{
|
|
237
|
+
type: Input
|
|
238
|
+
}], searched: [{
|
|
239
|
+
type: Output
|
|
240
|
+
}] } });
|
|
241
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2Fic3RyYWN0LWNvbWJvYm94L2Fic3RyYWN0LWNvbWJvYm94LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQXVCLE9BQU8sRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBRXBHLE9BQU8sRUFBQyxhQUFhLEVBQUUsZUFBZSxFQUFhLE1BQU0sTUFBTSxDQUFDO0FBQ2hFLE9BQU8sRUFBQyxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUYsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sZ0VBQWdFLENBQUM7QUFHekcsT0FBTyxFQUFDLDhCQUE4QixFQUFDLE1BQU0sb0RBQW9ELENBQUM7O0FBT2xHLE1BQU0sT0FBTyx5QkFDWCxTQUFRLHlCQUFnRjtJQXVCeEYsSUFDVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBQ0QsSUFBVyxZQUFZLENBQUMsS0FBYTtRQUNuQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBQ0QsSUFDb0IsS0FBSztRQUN2QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUNELElBQW9CLEtBQUssQ0FBQyxLQUE4QjtRQUN0RCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFDRCxJQUNXLGVBQWU7UUFDeEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDO0lBQ3JDLENBQUM7SUFDRCxJQUFXLGVBQWUsQ0FBQyxlQUF3QztRQUNqRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBdUNPLDBCQUEwQjtRQUNoQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRTtZQUNoRSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQztTQUN4RztJQUNILENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQzNCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUNuQixvQkFBb0IsRUFBRSxFQUN0QixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ1AsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRixDQUFDLENBQUMsRUFDRixZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQ2xELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FDeEMsRUFDRCxJQUFJLENBQUMsU0FBUyxDQUNmLENBQUM7SUFDSixDQUFDO0lBRU8sWUFBWSxDQUFDLEtBQThCLEVBQUUsVUFBa0I7UUFDckUsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDM0IsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUVELDREQUE0RDtRQUM1RCxPQUFRLEtBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN0QyxJQUFJLFFBQVEsR0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO1lBQzVFLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFbkYsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsS0FBSyw4QkFBOEIsQ0FBQyxRQUFRO2dCQUM3RSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3JDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssVUFBVSxDQUFDO1FBQzlELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVrQixhQUFhLENBQUMsU0FBa0M7UUFDakUsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVTLFdBQVcsQ0FBQyxVQUFrQjtRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFO1lBQzlELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUNwQjtRQUVELFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFekYsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLE1BQU0sTUFBTSxHQUF1QixJQUFJLENBQUMsTUFBTSxDQUFDO1lBQy9DLE1BQU0sY0FBYyxHQUFrQixNQUFNO2lCQUN6QyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQWUsRUFBRSxDQUFDLENBQUM7Z0JBQzVCLEdBQUcsS0FBSztnQkFDUixLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBVSxLQUFLLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBUTthQUNsRSxDQUFDLENBQUM7aUJBQ0YsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUU3QyxPQUFZLGNBQWMsQ0FBQztTQUM1QjtRQUVELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFUyxZQUFZLENBQUMsVUFBa0I7UUFDdkMsT0FBTyxVQUFVLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEUsQ0FBQztJQUVTLE9BQU8sQ0FBQyxLQUE4QixFQUFFLElBQVk7UUFDNUQsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDNUcsQ0FBQztJQUVPLGFBQWEsQ0FBQyxLQUE4QjtRQUNsRCxPQUFPLE9BQU8sQ0FDWixLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDOUUsQ0FBQztJQUNKLENBQUM7SUFFTyxjQUFjLENBQUMsSUFBeUI7UUFDOUMsTUFBTSxNQUFNLEdBQVEsSUFBSSxDQUFDO1FBQ3pCLE9BQU8sTUFBTSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLFVBQVUsS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUM7SUFDbkksQ0FBQztJQUVTLFdBQVcsQ0FBQyxLQUFZLEVBQUUsS0FBWTtRQUM5QyxNQUFNLFlBQVksR0FBWSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLENBQUM7UUFDcEUsTUFBTSxZQUFZLEdBQVksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxDQUFDO1FBRXBFLElBQUksWUFBWSxJQUFJLFlBQVksRUFBRTtZQUNoQyxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsSUFBSSxZQUFZLElBQUksWUFBWSxFQUFFO1lBQ2hDLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUEwQkQsWUFBbUIsaUJBQW9DLEVBQXFCLFNBQW9CO1FBQzlGLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRGlELGNBQVMsR0FBVCxTQUFTLENBQVc7UUFqTnhGLGtCQUFhLEdBQVcsR0FBRyxDQUFDO1FBQ25CLHNCQUFpQixHQUFhLElBQUksUUFBUSxFQUFFLENBQUM7UUFDN0MsWUFBTyxHQUFXLElBQUksTUFBTSxFQUFFLENBQUM7UUFDL0IscUJBQWdCLEdBQTZDLElBQUksZUFBZSxDQUEwQixFQUFFLENBQUMsQ0FBQztRQUNySCwwQkFBcUIsR0FBNEIsRUFBRSxDQUFDO1FBQ3BELFlBQU8sR0FBWSxLQUFLLENBQUM7UUFDaEIsaUJBQVksR0FBNkMsSUFBSSxlQUFlLENBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQzFHLGlCQUFZLEdBQTZCLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BFLGlCQUFZLEdBQTZCLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BFLGdCQUFXLEdBQTRCLElBQUksZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLGtCQUFhLEdBQXdDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ2pJLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxFQUEyQixFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUE0QixDQUFDLENBQ3hJLENBQUM7UUFFSyxpQkFBWSxHQUFZLElBQUksQ0FBQztRQUU3Qix3QkFBbUIsR0FBVyxDQUFDLENBQUM7UUFFaEMsV0FBTSxHQUFtQyxJQUFJLENBQUM7UUFFOUMsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUEyQmhDLG1CQUFjLEdBQTRCO1lBQy9DLGVBQWUsRUFBRSxLQUFLO1lBQ3RCLFFBQVEsRUFBRSw4QkFBOEIsQ0FBQyxRQUFRO1NBQ2xELENBQUM7UUFFSyxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUU3QixhQUFRLEdBQXlCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDM0MseUJBQW9CLEdBQXdCLGFBQWEsQ0FBQztZQUN4RSxJQUFJLENBQUMsWUFBWTtZQUNqQixJQUFJLENBQUMsWUFBWTtZQUNqQixJQUFJLENBQUMsVUFBVTtZQUNmLElBQUksQ0FBQyxhQUFhO1NBQ25CLENBQUMsQ0FBQyxJQUFJLENBQ0wsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxhQUFhLENBQUMsRUFBRSxFQUFFO1lBQzNELE9BQU8sQ0FBQyxXQUFXLElBQUksV0FBVyxJQUFJLFNBQVMsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztRQUNoRixDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ2MsMkJBQXNCLEdBQXdCLGFBQWEsQ0FBQztZQUMxRSxJQUFJLENBQUMsWUFBWTtZQUNqQixJQUFJLENBQUMsWUFBWTtZQUNqQixJQUFJLENBQUMsVUFBVTtTQUNoQixDQUFDLENBQUMsSUFBSSxDQUNMLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsV0FBVyxJQUFJLFNBQVMsQ0FBQztRQUNwRSxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ2MsNEJBQXVCLEdBQXdCLGFBQWEsQ0FBQztZQUMzRSxJQUFJLENBQUMsVUFBVTtZQUNmLElBQUksQ0FBQyxZQUFZO1NBQ2xCLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLFNBQVMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLDRGQUE0RjtRQUM1RSx5QkFBb0IsR0FBd0IsYUFBYSxDQUFDO1lBQ3hFLElBQUksQ0FBQyx1QkFBdUI7WUFDNUIsSUFBSSxDQUFDLFlBQVk7U0FDbEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixFQUFFLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyx1QkFBdUIsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUF1R3BHLGNBQVMsR0FBRyxDQUFDLFVBQW1CLEVBQVEsRUFBRTtZQUNsRCxVQUFVLEdBQUcsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFdkMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNoQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQzthQUN0RDtpQkFBTTtnQkFDTCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEVBQUU7b0JBQ2pDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM3QixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO3dCQUM3RixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQzlCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLEdBQUcsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBNEIsQ0FBQzt3QkFDbkcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2hDLENBQUMsQ0FBQyxDQUFDO2lCQUNKO3FCQUFNO29CQUNMLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUM5QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztvQkFDaEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQy9CO2FBQ0Y7UUFDSCxDQUFDLENBQUM7SUFJRixDQUFDO0lBRWUsV0FBVztRQUN6QixJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVlLElBQUk7UUFDbEIsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFekIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNyQztRQUVELFVBQVU7UUFDVixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2YsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFDaEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUNSLEVBQ0QsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDNUI7WUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTlCLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRTtnQkFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUNwQjtRQUNILENBQUMsQ0FDRixDQUFDO1FBRUYsV0FBVztRQUNYLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRTtZQUNoRSxrRUFBa0U7WUFDbEUsbURBQW1EO1lBQ25ELDBDQUEwQztZQUMxQyxxQkFBcUI7WUFDckIsZ0ZBQWdGO1lBQ2hGLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxVQUFVLENBQUMsVUFBa0I7UUFDbEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEMsQ0FBQzs7c0hBeFFVLHlCQUF5QjswR0FBekIseUJBQXlCLHdZQUgxQixFQUFFOzJGQUdELHlCQUF5QjtrQkFKckMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsRUFBRTtvQkFDWixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDaEQ7Z0lBa0JRLFlBQVk7c0JBRGxCLEtBQUs7Z0JBR0MsbUJBQW1CO3NCQUR6QixLQUFLO2dCQUdDLE1BQU07c0JBRFosS0FBSztnQkFHQyxjQUFjO3NCQURwQixLQUFLO2dCQUdLLFlBQVk7c0JBRHRCLEtBQUs7Z0JBU2MsS0FBSztzQkFEeEIsS0FBSztnQkFXSyxlQUFlO3NCQUR6QixLQUFLO2dCQVFDLGNBQWM7c0JBRHBCLEtBQUs7Z0JBTUMsV0FBVztzQkFEakIsS0FBSztnQkFHQyxRQUFRO3NCQURkLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFJlbmRlcmVyMixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge2lzRmFsc2UsIElzLCBPYnNlcnZlciwgV29ya2VyLCBDb250cm9sQ2hhbmdlZEV2ZW50LCBmbGF0dGVufSBmcm9tICdAbWFyY3VyYS9tYXJjdXJhLWNvbW1vbic7XG5pbXBvcnQge0dyb3VwUmVzdWx0fSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tZGF0YS1xdWVyeSc7XG5pbXBvcnQge2NvbWJpbmVMYXRlc3QsIEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2RlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwLCBza2lwLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7QWJzdHJhY3REcm9wZG93bkNvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9hYnN0cmFjdC1kcm9wZG93bi9hYnN0cmFjdC1kcm9wZG93bi5jb21wb25lbnQnO1xuaW1wb3J0IHtJQ29tYm9ib3hLZW5kb0NvbXBvbmVudH0gZnJvbSAnLi4vLi4vbW9kZWwvY29tYm9ib3gta2VuZG8tY29tcG9uZW50LmludGVyZmFjZSc7XG5pbXBvcnQge0NvbWJvYm94U2VhcmNoRm59IGZyb20gJy4uLy4uL21vZGVsL2NvbWJvYm94LXNlYXJjaC1mbi50eXBlJztcbmltcG9ydCB7Q29tYm9ib3hTZWFyY2hTZXR0aW5nc09wZXJhdG9yfSBmcm9tICcuLi8uLi9tb2RlbC9jb21ib2JveC1zZWFyY2gtc2V0dGluZ3Mtb3BlcmF0b3IuZW51bSc7XG5pbXBvcnQge0lDb21ib2JveFNlYXJjaFNldHRpbmdzfSBmcm9tICcuLi8uLi9tb2RlbC9jb21ib2JveC1zZWFyY2gtc2V0dGluZ3MuaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlOiAnJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFic3RyYWN0Q29tYm9ib3hDb21wb25lbnQ8VEl0ZW0sIFRWYWx1ZSwgVENoYW5nZWRFdmVudCBleHRlbmRzIENvbnRyb2xDaGFuZ2VkRXZlbnQ8VFZhbHVlPiA9IENvbnRyb2xDaGFuZ2VkRXZlbnQ8VFZhbHVlPj5cbiAgZXh0ZW5kcyBBYnN0cmFjdERyb3Bkb3duQ29tcG9uZW50PFRJdGVtLCBUVmFsdWUsIElDb21ib2JveEtlbmRvQ29tcG9uZW50LCBUQ2hhbmdlZEV2ZW50PlxuICBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9kZWJvdW5jZVRpbWU6IG51bWJlciA9IDUwMDtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVib3VuY2VPYnNlcnZlcjogT2JzZXJ2ZXIgPSBuZXcgT2JzZXJ2ZXIoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya2VyOiBXb3JrZXIgPSBuZXcgV29ya2VyKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FkZGl0aW9uYWxJdGVtczogQmVoYXZpb3JTdWJqZWN0PFRJdGVtW10gfCBHcm91cFJlc3VsdFtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VEl0ZW1bXSB8IEdyb3VwUmVzdWx0W10+KFtdKTtcbiAgcHJvdGVjdGVkIF92YWx1ZU5vcm1hbGl6ZXJJdGVtczogVEl0ZW1bXSB8IEdyb3VwUmVzdWx0W10gPSBbXTtcbiAgcHJvdGVjdGVkIF9pc1N5bmM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9sb2FkZWRJdGVtczogQmVoYXZpb3JTdWJqZWN0PFRJdGVtW10gfCBHcm91cFJlc3VsdFtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VEl0ZW1bXSB8IEdyb3VwUmVzdWx0W10+KFtdKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9oYXNTZWFyY2hlZDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBfaXNTZWFyY2hpbmc6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3NlYXJjaFRleHQ6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJyk7XG4gIHB1YmxpYyByZWFkb25seSBjb21iaW5lZEl0ZW1zOiBPYnNlcnZhYmxlPFRJdGVtW10gfCBHcm91cFJlc3VsdFtdPiA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX2xvYWRlZEl0ZW1zLCB0aGlzLl9hZGRpdGlvbmFsSXRlbXNdKS5waXBlKFxuICAgIG1hcCgoW2l0ZW1zLCBhZGRpdGlvbmFsSXRlbXNdKTogVEl0ZW1bXSB8IEdyb3VwUmVzdWx0W10gPT4gWy4uLml0ZW1zLCAuLi5hZGRpdGlvbmFsSXRlbXNdLmZpbHRlcihJcy50cnV0aHkpIGFzIFRJdGVtW10gfCBHcm91cFJlc3VsdFtdKVxuICApO1xuICBASW5wdXQoKVxuICBwdWJsaWMgaXNTZWFyY2hhYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgcHVibGljIG1pblNlYXJjaENoYXJhY3RlcnM6IG51bWJlciA9IDE7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZWFyY2g6IENvbWJvYm94U2VhcmNoRm48VEl0ZW0+IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhcmVJdGVtc0NhY2hlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IGRlYm91bmNlVGltZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kZWJvdW5jZVRpbWU7XG4gIH1cbiAgcHVibGljIHNldCBkZWJvdW5jZVRpbWUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2RlYm91bmNlVGltZSA9IHZhbHVlO1xuICAgIHRoaXMuX2xpc3RlblRvU2VhcmNoZWQoKTtcbiAgfVxuICBASW5wdXQoKVxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0IGl0ZW1zKCk6IFRJdGVtW10gfCBHcm91cFJlc3VsdFtdIHtcbiAgICByZXR1cm4gdGhpcy5faXRlbXM7XG4gIH1cbiAgcHVibGljIG92ZXJyaWRlIHNldCBpdGVtcyhpdGVtczogVEl0ZW1bXSB8IEdyb3VwUmVzdWx0W10pIHtcbiAgICB0aGlzLl9pc1N5bmMgPSB0cnVlO1xuICAgIHRoaXMuX2l0ZW1zID0gaXRlbXMgfHwgW107XG4gICAgdGhpcy5fbGlzdGVuVG9TZWFyY2hlZCgpO1xuICAgIHRoaXMuX2xvYWRlZEl0ZW1zLm5leHQodGhpcy5faXRlbXMpO1xuICB9XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgYWRkaXRpb25hbEl0ZW1zKCk6IFRJdGVtW10gfCBHcm91cFJlc3VsdFtdIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkaXRpb25hbEl0ZW1zLnZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgYWRkaXRpb25hbEl0ZW1zKGFkZGl0aW9uYWxJdGVtczogVEl0ZW1bXSB8IEdyb3VwUmVzdWx0W10pIHtcbiAgICB0aGlzLl9hZGRpdGlvbmFsSXRlbXMubmV4dChhZGRpdGlvbmFsSXRlbXMgfHwgW10pO1xuICB9XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZWFyY2hTZXR0aW5nczogSUNvbWJvYm94U2VhcmNoU2V0dGluZ3MgPSB7XG4gICAgaXNDYXNlU2Vuc2l0aXZlOiBmYWxzZSxcbiAgICBvcGVyYXRvcjogQ29tYm9ib3hTZWFyY2hTZXR0aW5nc09wZXJhdG9yLkNvbnRhaW5zLFxuICB9O1xuICBASW5wdXQoKVxuICBwdWJsaWMgaXNHcm91cGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBzZWFyY2hlZDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHB1YmxpYyByZWFkb25seSBpc05vSXRlbXNUZXh0VmlzaWJsZTogT2JzZXJ2YWJsZTxib29sZWFuPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuX2lzU2VhcmNoaW5nLFxuICAgIHRoaXMuX2hhc1NlYXJjaGVkLFxuICAgIHRoaXMuX2lzRm9jdXNlZCxcbiAgICB0aGlzLmNvbWJpbmVkSXRlbXMsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbaXNTZWFyY2hpbmcsIGhhc1NlYXJjaGVkLCBpc0ZvY3VzZWQsIGNvbWJpbmVkSXRlbXNdKSA9PiB7XG4gICAgICByZXR1cm4gIWlzU2VhcmNoaW5nICYmIGhhc1NlYXJjaGVkICYmIGlzRm9jdXNlZCAmJiBjb21iaW5lZEl0ZW1zLmxlbmd0aCA9PT0gMDtcbiAgICB9KVxuICApO1xuICBwdWJsaWMgcmVhZG9ubHkgaXNNaW5TZWFyY2hUZXh0VmlzaWJsZTogT2JzZXJ2YWJsZTxib29sZWFuPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuX2lzU2VhcmNoaW5nLFxuICAgIHRoaXMuX2hhc1NlYXJjaGVkLFxuICAgIHRoaXMuX2lzRm9jdXNlZCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtpc1NlYXJjaGluZywgaGFzU2VhcmNoZWQsIGlzRm9jdXNlZF0pID0+IHtcbiAgICAgIHJldHVybiAhdGhpcy5faXNTeW5jICYmICFpc1NlYXJjaGluZyAmJiAhaGFzU2VhcmNoZWQgJiYgaXNGb2N1c2VkO1xuICAgIH0pXG4gICk7XG4gIHB1YmxpYyByZWFkb25seSBpc0xvYWRpbmdTcGlubmVyVmlzaWJsZTogT2JzZXJ2YWJsZTxib29sZWFuPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuX2lzTG9hZGluZyxcbiAgICB0aGlzLl9pc1NlYXJjaGluZyxcbiAgXSkucGlwZShtYXAoKFtpc0xvYWRpbmcsIGlzU2VhcmNoaW5nXSkgPT4gaXNMb2FkaW5nIHx8IGlzU2VhcmNoaW5nKSk7XG4gIC8vIFRvIHNob3cgbG9hZGluZyBwcm9wZXJseSB3ZSBhcmUgdG8gdXNlIGxvYWRlZEl0ZW1zIGFzIHRoZXkgZG9uJ3QgaW5jbHVkZSBhZGRpdGlvbmFsSXRlbXMuXG4gIHB1YmxpYyByZWFkb25seSBpc0xvYWRpbmdUZXh0VmlzaWJsZTogT2JzZXJ2YWJsZTxib29sZWFuPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuaXNMb2FkaW5nU3Bpbm5lclZpc2libGUsXG4gICAgdGhpcy5fbG9hZGVkSXRlbXMsXG4gIF0pLnBpcGUobWFwKChbaXNMb2FkaW5nU3Bpbm5lclZpc2libGUsIGxvYWRlZEl0ZW1zXSkgPT4gaXNMb2FkaW5nU3Bpbm5lclZpc2libGUgJiYgbG9hZGVkSXRlbXMubGVuZ3RoID09PSAwKSk7XG5cbiAgcHJpdmF0ZSBfZGlzYWJsZUNocm9tZUF1dG9jb21wbGV0ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY29tcG9uZW50LnNlYXJjaGJhciAmJiB0aGlzLl9jb21wb25lbnQuc2VhcmNoYmFyLmlucHV0KSB7XG4gICAgICB0aGlzLl9yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5fY29tcG9uZW50LnNlYXJjaGJhci5pbnB1dC5uYXRpdmVFbGVtZW50LCAnYXV0b2NvbXBsZXRlJywgJ2Rpc2FibGVkJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuVG9TZWFyY2hlZCgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZWJvdW5jZU9ic2VydmVyLmNsZWFyKCk7XG4gICAgdGhpcy5fZGVib3VuY2VPYnNlcnZlci5saXN0ZW4oXG4gICAgICB0aGlzLl9zZWFyY2hUZXh0LnBpcGUoXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgIHNraXAoMSksXG4gICAgICAgIHRhcCgoc2VhcmNoVGV4dCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2VhcmNoZWQuZW1pdChzZWFyY2hUZXh0KTtcbiAgICAgICAgICB0aGlzLl9pc1NlYXJjaGluZy5uZXh0KHRoaXMuY2FuTG9hZEl0ZW1zKHNlYXJjaFRleHQpICYmIHRoaXMuX2lzT3Blbi52YWx1ZS5pc09wZW4pO1xuICAgICAgICB9KSxcbiAgICAgICAgZGVib3VuY2VUaW1lKHRoaXMuX2lzU3luYyA/IDAgOiB0aGlzLmRlYm91bmNlVGltZSksXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLl9pc09wZW4udmFsdWUuaXNPcGVuKVxuICAgICAgKSxcbiAgICAgIHRoaXMubG9hZEl0ZW1zXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbHRlckl0ZW1zKGl0ZW1zOiBUSXRlbVtdIHwgR3JvdXBSZXN1bHRbXSwgc2VhcmNoVGV4dDogc3RyaW5nKTogVEl0ZW1bXSB7XG4gICAgaWYgKCFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gVE9ETzogdGVjaG5pY2FsLWRlYnQgLSBmaXggZ3JvdXAgcmVzdWx0IGNhc2UgdG8gYXZvaWQgYW55XG4gICAgcmV0dXJuIChpdGVtcyBhcyBhbnlbXSkuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICBsZXQgaXRlbVRleHQ6IHN0cmluZyA9IChpdGVtW3RoaXMudGV4dEZpZWxkXSB8fCAnJykudG9TdHJpbmcoKS50cmltKCkgPz8gJyc7XG4gICAgICBpdGVtVGV4dCA9IHRoaXMuc2VhcmNoU2V0dGluZ3MuaXNDYXNlU2Vuc2l0aXZlID8gaXRlbVRleHQgOiBpdGVtVGV4dC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICByZXR1cm4gdGhpcy5zZWFyY2hTZXR0aW5ncy5vcGVyYXRvciA9PT0gQ29tYm9ib3hTZWFyY2hTZXR0aW5nc09wZXJhdG9yLkNvbnRhaW5zXG4gICAgICAgID8gaXRlbVRleHQuaW5kZXhPZihzZWFyY2hUZXh0KSAhPT0gLTFcbiAgICAgICAgOiBpdGVtVGV4dC5zdWJzdHJpbmcoMCwgc2VhcmNoVGV4dC5sZW5ndGgpID09PSBzZWFyY2hUZXh0O1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIF9zZXRDb21wb25lbnQoY29tcG9uZW50OiBJQ29tYm9ib3hLZW5kb0NvbXBvbmVudCk6IHZvaWQge1xuICAgIHRoaXMuX2NvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgICB0aGlzLl9kaXNhYmxlQ2hyb21lQXV0b2NvbXBsZXRlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2VhcmNoSXRlbXMoc2VhcmNoVGV4dDogc3RyaW5nKTogVEl0ZW1bXSB8IEdyb3VwUmVzdWx0W10ge1xuICAgIGlmICghdGhpcy5zZWFyY2hTZXR0aW5ncyB8fCAhc2VhcmNoVGV4dCB8fCAhdGhpcy5faXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5faXRlbXM7XG4gICAgfVxuXG4gICAgc2VhcmNoVGV4dCA9IHRoaXMuc2VhcmNoU2V0dGluZ3MuaXNDYXNlU2Vuc2l0aXZlID8gc2VhcmNoVGV4dCA6IHNlYXJjaFRleHQudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmICh0aGlzLmlzR3JvdXBhYmxlKSB7XG4gICAgICBjb25zdCBncm91cHM6IEdyb3VwUmVzdWx0W10gPSA8YW55PnRoaXMuX2l0ZW1zO1xuICAgICAgY29uc3QgZmlsdGVyZWRHcm91cHM6IEdyb3VwUmVzdWx0W10gPSBncm91cHNcbiAgICAgICAgLm1hcCgoZ3JvdXApOiBHcm91cFJlc3VsdCA9PiAoe1xuICAgICAgICAgIC4uLmdyb3VwLFxuICAgICAgICAgIGl0ZW1zOiB0aGlzLl9maWx0ZXJJdGVtcyg8VEl0ZW1bXT5ncm91cC5pdGVtcywgc2VhcmNoVGV4dCkgYXMgYW55LFxuICAgICAgICB9KSlcbiAgICAgICAgLmZpbHRlcigoZ3JvdXApID0+IGdyb3VwLml0ZW1zLmxlbmd0aCA+IDApO1xuXG4gICAgICByZXR1cm4gPGFueT5maWx0ZXJlZEdyb3VwcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZmlsdGVySXRlbXModGhpcy5faXRlbXMsIHNlYXJjaFRleHQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNhbkxvYWRJdGVtcyhzZWFyY2hUZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc2VhcmNoVGV4dC5sZW5ndGggPj0gdGhpcy5taW5TZWFyY2hDaGFyYWN0ZXJzICYmICF0aGlzLl9pc1N5bmM7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0SXRlbShpdGVtczogVEl0ZW1bXSB8IEdyb3VwUmVzdWx0W10sIHRleHQ6IHN0cmluZyk6IFRJdGVtIHwgbnVsbCB7XG4gICAgdGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gdGhpcy5fdW53cmFwR3JvdXBzKGl0ZW1zKS5maW5kKChpdGVtKSA9PiBgJHtpdGVtW3RoaXMudGV4dEZpZWxkXX1gLnRvTG93ZXJDYXNlKCkgPT09IHRleHQpID8/IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF91bndyYXBHcm91cHMoaXRlbXM6IFRJdGVtW10gfCBHcm91cFJlc3VsdFtdKTogVEl0ZW1bXSB7XG4gICAgcmV0dXJuIGZsYXR0ZW4oXG4gICAgICBpdGVtcy5tYXAoaXRlbSA9PiB0aGlzLl9pc0dyb3VwUmVzdWx0KGl0ZW0pID8gaXRlbS5pdGVtcyBhcyBUSXRlbVtdIDogW2l0ZW1dKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9pc0dyb3VwUmVzdWx0KGl0ZW06IFRJdGVtIHwgR3JvdXBSZXN1bHQpOiBpdGVtIGlzIEdyb3VwUmVzdWx0IHtcbiAgICBjb25zdCBvYmplY3Q6IGFueSA9IGl0ZW07XG4gICAgcmV0dXJuIG9iamVjdC5pdGVtcyAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5hZ2dyZWdhdGVzICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LmZpZWxkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LnZhbHVlICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNJdGVtRXF1YWwoaXRlbTE6IFRJdGVtLCBpdGVtMjogVEl0ZW0pOiBib29sZWFuIHtcbiAgICBjb25zdCBpc0l0ZW0xRW1wdHk6IGJvb2xlYW4gPSBpdGVtMSA9PT0gbnVsbCB8fCBpdGVtMSA9PT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGlzSXRlbTJFbXB0eTogYm9vbGVhbiA9IGl0ZW0yID09PSBudWxsIHx8IGl0ZW0yID09PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoaXNJdGVtMUVtcHR5ICYmIGlzSXRlbTJFbXB0eSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlzSXRlbTFFbXB0eSB8fCBpc0l0ZW0yRW1wdHkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pc1ByaW1pdGl2ZVZhbHVlID8gaXRlbTEgPT09IGl0ZW0yIDogaXRlbTFbdGhpcy52YWx1ZUZpZWxkXSA9PT0gaXRlbTJbdGhpcy52YWx1ZUZpZWxkXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBsb2FkSXRlbXMgPSAoc2VhcmNoVGV4dD86IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIHNlYXJjaFRleHQgPSAoc2VhcmNoVGV4dCB8fCAnJykudHJpbSgpO1xuXG4gICAgaWYgKHRoaXMuX2lzU3luYykge1xuICAgICAgdGhpcy5faGFzU2VhcmNoZWQubmV4dCghIXNlYXJjaFRleHQpO1xuICAgICAgdGhpcy5fbG9hZGVkSXRlbXMubmV4dCh0aGlzLnNlYXJjaEl0ZW1zKHNlYXJjaFRleHQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuY2FuTG9hZEl0ZW1zKHNlYXJjaFRleHQpKSB7XG4gICAgICAgIHRoaXMuX2lzU2VhcmNoaW5nLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuX3dvcmtlci5oYW5kbGUodGhpcy5zZWFyY2ggPyB0aGlzLnNlYXJjaChzZWFyY2hUZXh0KSA6IG5ldyBCZWhhdmlvclN1YmplY3QoW10pLCAoaXRlbXMpID0+IHtcbiAgICAgICAgICB0aGlzLl9oYXNTZWFyY2hlZC5uZXh0KHRydWUpO1xuICAgICAgICAgIHRoaXMuX2xvYWRlZEl0ZW1zLm5leHQoaXRlbXMpO1xuICAgICAgICAgIHRoaXMuX3ZhbHVlTm9ybWFsaXplckl0ZW1zID0gWy4uLml0ZW1zLCAuLi50aGlzLl9hZGRpdGlvbmFsSXRlbXMudmFsdWVdIGFzIFRJdGVtW10gfCBHcm91cFJlc3VsdFtdO1xuICAgICAgICAgIHRoaXMuX2lzU2VhcmNoaW5nLm5leHQoZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2hhc1NlYXJjaGVkLm5leHQoZmFsc2UpO1xuICAgICAgICB0aGlzLl9sb2FkZWRJdGVtcy5uZXh0KFtdKTtcbiAgICAgICAgdGhpcy5fdmFsdWVOb3JtYWxpemVySXRlbXMgPSBbXTtcbiAgICAgICAgdGhpcy5faXNTZWFyY2hpbmcubmV4dChmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByb3RlY3RlZCByZWFkb25seSBfcmVuZGVyZXI6IFJlbmRlcmVyMikge1xuICAgIHN1cGVyKGNoYW5nZURldGVjdG9yUmVmKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZWJvdW5jZU9ic2VydmVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLl93b3JrZXIuZGVzdHJveSgpO1xuICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgaW5pdCgpOiB2b2lkIHtcbiAgICBzdXBlci5pbml0KCk7XG4gICAgdGhpcy5fbGlzdGVuVG9TZWFyY2hlZCgpO1xuXG4gICAgaWYgKHRoaXMuX2lzU3luYykge1xuICAgICAgdGhpcy5fbG9hZGVkSXRlbXMubmV4dCh0aGlzLl9pdGVtcyk7XG4gICAgfVxuXG4gICAgLy8gQ2xvc2VkLlxuICAgIHRoaXMuX29ic2VydmVyLmxpc3RlbihcbiAgICAgIHRoaXMuX2lzT3Blbi5waXBlKFxuICAgICAgICBmaWx0ZXIoKGV2ZW50KSA9PiAhZXZlbnQuaXNPcGVuKSxcbiAgICAgICAgc2tpcCgxKVxuICAgICAgKSxcbiAgICAgIChldmVudCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuYXJlSXRlbXNDYWNoZWQgJiYgIXRoaXMuX2lzU3luYykge1xuICAgICAgICAgIHRoaXMuX2xvYWRlZEl0ZW1zLm5leHQoW10pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fd29ya2VyLmNhbmNlbCgpO1xuICAgICAgICB0aGlzLl9pc1NlYXJjaGluZy5uZXh0KGZhbHNlKTtcblxuICAgICAgICBpZiAoZXZlbnQuc2hvdWxkRW1pdCkge1xuICAgICAgICAgIHRoaXMuY2xvc2VkLmVtaXQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBCbHVycmVkLlxuICAgIHRoaXMuX29ic2VydmVyLmxpc3Rlbih0aGlzLl9pc0ZvY3VzZWQucGlwZShmaWx0ZXIoaXNGYWxzZSkpLCAoKSA9PiB7XG4gICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHVuZmlsdGVyZWQgaXRlbXMgd2hlbiB0aGUgY29tcG9uZW50IGlzIGJsdXJyZWRcbiAgICAgIC8vIGFmdGVyIHNvbWUgc2VhcmNoIHRleHQgZW50ZXJlZC4gQ29uc2lkZXIgYSBjYXNlOlxuICAgICAgLy8gMS4gU2VhcmNoIHdpdGggdGV4dCB0aGF0IGdpdmVzIDAgaXRlbXMuXG4gICAgICAvLyAyLiBCbHVyIGFuZCBmb2N1cy5cbiAgICAgIC8vIDMuIFNlYXJjaCB0ZXh0IGlzIGNsZWFyZWQsIGJ1dCBpdGVtcyByZW1haW4gZW1wdHksIHNvIHRoZSBsaXN0IHdvbid0IHNob3cgdXAuXG4gICAgICB0aGlzLl9sb2FkZWRJdGVtcy5uZXh0KHRoaXMuX2l0ZW1zKTtcbiAgICAgIHRoaXMuX2hhc1NlYXJjaGVkLm5leHQoZmFsc2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG9uU2VhcmNoZWQoc2VhcmNoVGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fc2VhcmNoVGV4dC5uZXh0KHNlYXJjaFRleHQpO1xuICB9XG59XG4iXX0=
|