@firestitch/filter 18.2.70 → 18.2.72
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/app/components/filter-chips/filter-chips.component.d.ts +14 -3
- package/app/components/filters-item/autocomplete/autocomplete.component.d.ts +2 -1
- package/app/components/filters-item/autocompletechips/autocompletechips.component.d.ts +2 -1
- package/app/components/filters-item/date/date.component.d.ts +2 -1
- package/app/components/filters-item/date-range/date-range.component.d.ts +2 -1
- package/app/components/filters-item/filter-item.component.d.ts +2 -1
- package/app/components/filters-item/range/range.component.d.ts +2 -1
- package/app/components/filters-item/select/select.component.d.ts +2 -1
- package/app/components/filters-item/text/text.component.d.ts +2 -1
- package/app/components/filters-item/week/week.component.d.ts +2 -1
- package/app/helpers/create-filter-item.d.ts +1 -1
- package/app/interfaces/config.interface.d.ts +1 -0
- package/app/interfaces/items/base.interface.d.ts +1 -0
- package/app/models/filter-config.d.ts +1 -0
- package/app/models/items/base-item.d.ts +7 -0
- package/app/services/filter-controller.service.d.ts +1 -2
- package/esm2022/app/components/filter/filter.component.mjs +2 -2
- package/esm2022/app/components/filter-chips/filter-chips.component.mjs +62 -25
- package/esm2022/app/components/filter-item-dialog/filter-item-dialog.component.mjs +3 -3
- package/esm2022/app/components/filters-item/autocomplete/autocomplete.component.mjs +5 -2
- package/esm2022/app/components/filters-item/autocompletechips/autocompletechips.component.mjs +6 -3
- package/esm2022/app/components/filters-item/date/date.component.mjs +6 -3
- package/esm2022/app/components/filters-item/date-range/date-range.component.mjs +6 -3
- package/esm2022/app/components/filters-item/filter-item.component.mjs +6 -3
- package/esm2022/app/components/filters-item/range/range.component.mjs +6 -3
- package/esm2022/app/components/filters-item/select/select.component.mjs +7 -5
- package/esm2022/app/components/filters-item/text/text.component.mjs +6 -3
- package/esm2022/app/components/filters-item/week/week.component.mjs +6 -3
- package/esm2022/app/interfaces/config.interface.mjs +1 -1
- package/esm2022/app/interfaces/items/base.interface.mjs +1 -1
- package/esm2022/app/models/filter-config.mjs +3 -1
- package/esm2022/app/models/items/base-item.mjs +29 -4
- package/esm2022/app/services/filter-controller.service.mjs +31 -10
- package/fesm2022/firestitch-filter.mjs +167 -57
- package/fesm2022/firestitch-filter.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { OnInit } from '@angular/core';
|
|
2
|
+
import { MatSelectChange } from '@angular/material/select';
|
|
3
|
+
import { Observable } from 'rxjs';
|
|
2
4
|
import { ItemType } from '../../enums';
|
|
3
5
|
import { IFilterConfigItem } from '../../interfaces';
|
|
4
6
|
import { BaseItem } from '../../models/items/base-item';
|
|
@@ -6,6 +8,7 @@ import { SavedFilterController } from '../../services';
|
|
|
6
8
|
import * as i0 from "@angular/core";
|
|
7
9
|
export declare class FsFilterChipsComponent implements OnInit {
|
|
8
10
|
ItemType: typeof ItemType;
|
|
11
|
+
secondaryItems: BaseItem<IFilterConfigItem>[];
|
|
9
12
|
private _filterController;
|
|
10
13
|
private _dialog;
|
|
11
14
|
private _message;
|
|
@@ -13,25 +16,33 @@ export declare class FsFilterChipsComponent implements OnInit {
|
|
|
13
16
|
private _injector;
|
|
14
17
|
private _overlay;
|
|
15
18
|
private _overlayRef;
|
|
19
|
+
private _destroyRef;
|
|
20
|
+
private _elementRef;
|
|
21
|
+
private _hasSecondaryValue$;
|
|
16
22
|
get items(): BaseItem<IFilterConfigItem>[];
|
|
17
|
-
|
|
23
|
+
addFilter(event: MatSelectChange): void;
|
|
24
|
+
get disabledItems(): BaseItem<IFilterConfigItem>[];
|
|
25
|
+
get hasSecondaryValue$(): Observable<boolean>;
|
|
18
26
|
get savedFilterController(): SavedFilterController;
|
|
27
|
+
get hasSecondaryValue(): boolean;
|
|
19
28
|
ngOnInit(): void;
|
|
20
29
|
clear(): void;
|
|
21
|
-
|
|
30
|
+
openChip(item: BaseItem<IFilterConfigItem>, name?: string): void;
|
|
22
31
|
getNestedElement(el: any, className: string): any;
|
|
23
32
|
saveActiveFilter(): void;
|
|
24
33
|
createSavedFilter(): void;
|
|
25
34
|
saveAs(): void;
|
|
26
35
|
manageSavedFilters(): void;
|
|
27
36
|
_destroyOverlay(): void;
|
|
28
|
-
|
|
37
|
+
removeChip(item: BaseItem<IFilterConfigItem>, chip: {
|
|
29
38
|
name?: string;
|
|
30
39
|
value: string;
|
|
31
40
|
label: string;
|
|
32
41
|
}): void;
|
|
33
42
|
private _attachContainer;
|
|
34
43
|
private _createInjector;
|
|
44
|
+
private _initChipClick;
|
|
45
|
+
private _initHasSecondaryValue;
|
|
35
46
|
static ɵfac: i0.ɵɵFactoryDeclaration<FsFilterChipsComponent, never>;
|
|
36
47
|
static ɵcmp: i0.ɵɵComponentDeclaration<FsFilterChipsComponent, "fs-filter-chips", never, {}, {}, never, never, true, never>;
|
|
37
48
|
}
|
|
@@ -4,8 +4,9 @@ import { BaseItemComponent } from '../base-item/base-item.component';
|
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
export declare class AutocompleteComponent extends BaseItemComponent<AutocompleteItem> {
|
|
6
6
|
autofocus: boolean;
|
|
7
|
+
floatLabel: 'auto' | 'always';
|
|
7
8
|
displayWith: (data: any) => any;
|
|
8
9
|
fetch: (keyword: any) => Observable<any>;
|
|
9
10
|
static ɵfac: i0.ɵɵFactoryDeclaration<AutocompleteComponent, never>;
|
|
10
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<AutocompleteComponent, "filter-item-autocomplete", never, { "autofocus": { "alias": "autofocus"; "required": false; }; }, {}, never, never, true, never>;
|
|
11
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<AutocompleteComponent, "filter-item-autocomplete", never, { "autofocus": { "alias": "autofocus"; "required": false; }; "floatLabel": { "alias": "floatLabel"; "required": false; }; }, {}, never, never, true, never>;
|
|
11
12
|
}
|
|
@@ -4,6 +4,7 @@ import { BaseItemComponent } from '../base-item/base-item.component';
|
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
export declare class AutocompletechipsComponent extends BaseItemComponent<AutocompleteChipsItem> implements OnInit {
|
|
6
6
|
autofocus: boolean;
|
|
7
|
+
floatLabel: 'auto' | 'always';
|
|
7
8
|
value: any[];
|
|
8
9
|
private _injector;
|
|
9
10
|
private _cdRef;
|
|
@@ -15,5 +16,5 @@ export declare class AutocompletechipsComponent extends BaseItemComponent<Autoco
|
|
|
15
16
|
compareItems(item1: any, item2: any): boolean;
|
|
16
17
|
actionClick(action: any): void;
|
|
17
18
|
static ɵfac: i0.ɵɵFactoryDeclaration<AutocompletechipsComponent, never>;
|
|
18
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<AutocompletechipsComponent, "filter-item-autocompletechips", never, { "autofocus": { "alias": "autofocus"; "required": false; }; }, {}, never, never, true, never>;
|
|
19
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<AutocompletechipsComponent, "filter-item-autocompletechips", never, { "autofocus": { "alias": "autofocus"; "required": false; }; "floatLabel": { "alias": "floatLabel"; "required": false; }; }, {}, never, never, true, never>;
|
|
19
20
|
}
|
|
@@ -7,6 +7,7 @@ import { BaseItemComponent } from '../base-item/base-item.component';
|
|
|
7
7
|
import * as i0 from "@angular/core";
|
|
8
8
|
export declare class DateComponent extends BaseItemComponent<DateItem | DateTimeItem> implements OnInit {
|
|
9
9
|
autofocus: boolean;
|
|
10
|
+
floatLabel: 'auto' | 'always';
|
|
10
11
|
viewType: PickerViewType;
|
|
11
12
|
itemDateMode: typeof ItemDateMode;
|
|
12
13
|
showYear: boolean;
|
|
@@ -17,5 +18,5 @@ export declare class DateComponent extends BaseItemComponent<DateItem | DateTime
|
|
|
17
18
|
private _cdRef;
|
|
18
19
|
ngOnInit(): void;
|
|
19
20
|
static ɵfac: i0.ɵɵFactoryDeclaration<DateComponent, never>;
|
|
20
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<DateComponent, "filter-item-date", never, { "autofocus": { "alias": "autofocus"; "required": false; }; }, {}, never, never, true, never>;
|
|
21
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<DateComponent, "filter-item-date", never, { "autofocus": { "alias": "autofocus"; "required": false; }; "floatLabel": { "alias": "floatLabel"; "required": false; }; }, {}, never, never, true, never>;
|
|
21
22
|
}
|
|
@@ -6,6 +6,7 @@ import { BaseItemComponent } from '../base-item/base-item.component';
|
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
7
7
|
export declare class DateRangeComponent extends BaseItemComponent<DateRangeItem | DateTimeRangeItem> implements OnInit {
|
|
8
8
|
autofocusName: string;
|
|
9
|
+
floatLabel: 'auto' | 'always';
|
|
9
10
|
viewType: PickerViewType;
|
|
10
11
|
from: Date;
|
|
11
12
|
to: Date;
|
|
@@ -13,5 +14,5 @@ export declare class DateRangeComponent extends BaseItemComponent<DateRangeItem
|
|
|
13
14
|
ngOnInit(): void;
|
|
14
15
|
change(): void;
|
|
15
16
|
static ɵfac: i0.ɵɵFactoryDeclaration<DateRangeComponent, never>;
|
|
16
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<DateRangeComponent, "filter-item-date-range", never, { "autofocusName": { "alias": "autofocusName"; "required": false; }; }, {}, never, never, true, never>;
|
|
17
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<DateRangeComponent, "filter-item-date-range", never, { "autofocusName": { "alias": "autofocusName"; "required": false; }; "floatLabel": { "alias": "floatLabel"; "required": false; }; }, {}, never, never, true, never>;
|
|
17
18
|
}
|
|
@@ -16,6 +16,7 @@ import type { WeekItem } from '../../models/items/week-item';
|
|
|
16
16
|
import * as i0 from "@angular/core";
|
|
17
17
|
export declare class FilterItemComponent implements OnInit, OnDestroy {
|
|
18
18
|
autofocus: boolean;
|
|
19
|
+
floatLabel: 'auto' | 'always';
|
|
19
20
|
autofocusName: string;
|
|
20
21
|
item: BaseItem<any>;
|
|
21
22
|
name: string;
|
|
@@ -37,5 +38,5 @@ export declare class FilterItemComponent implements OnInit, OnDestroy {
|
|
|
37
38
|
ngOnInit(): void;
|
|
38
39
|
ngOnDestroy(): void;
|
|
39
40
|
static ɵfac: i0.ɵɵFactoryDeclaration<FilterItemComponent, never>;
|
|
40
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<FilterItemComponent, "filter-item", never, { "autofocus": { "alias": "autofocus"; "required": false; }; "autofocusName": { "alias": "autofocusName"; "required": false; }; "item": { "alias": "item"; "required": false; }; "name": { "alias": "name"; "required": false; }; }, {}, never, never, true, never>;
|
|
41
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FilterItemComponent, "filter-item", never, { "autofocus": { "alias": "autofocus"; "required": false; }; "floatLabel": { "alias": "floatLabel"; "required": false; }; "autofocusName": { "alias": "autofocusName"; "required": false; }; "item": { "alias": "item"; "required": false; }; "name": { "alias": "name"; "required": false; }; }, {}, never, never, true, never>;
|
|
41
42
|
}
|
|
@@ -4,6 +4,7 @@ import { BaseItemComponent } from '../base-item/base-item.component';
|
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
export declare class RangeComponent extends BaseItemComponent<RangeItem> implements OnInit {
|
|
6
6
|
autofocusName: string;
|
|
7
|
+
floatLabel: 'auto' | 'always';
|
|
7
8
|
min: number;
|
|
8
9
|
max: number;
|
|
9
10
|
private _change$;
|
|
@@ -11,5 +12,5 @@ export declare class RangeComponent extends BaseItemComponent<RangeItem> impleme
|
|
|
11
12
|
ngOnInit(): void;
|
|
12
13
|
change(): void;
|
|
13
14
|
static ɵfac: i0.ɵɵFactoryDeclaration<RangeComponent, never>;
|
|
14
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<RangeComponent, "filter-item-range", never, { "autofocusName": { "alias": "autofocusName"; "required": false; }; }, {}, never, never, true, never>;
|
|
15
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<RangeComponent, "filter-item-range", never, { "autofocusName": { "alias": "autofocusName"; "required": false; }; "floatLabel": { "alias": "floatLabel"; "required": false; }; }, {}, never, never, true, never>;
|
|
15
16
|
}
|
|
@@ -5,6 +5,7 @@ import { SelectItem } from '../../../models/items/select-item';
|
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
export declare class SelectComponent implements OnInit {
|
|
7
7
|
autofocus: boolean;
|
|
8
|
+
floatLabel: 'auto' | 'always';
|
|
8
9
|
item: SelectItem;
|
|
9
10
|
select: MatSelect;
|
|
10
11
|
value: any;
|
|
@@ -16,5 +17,5 @@ export declare class SelectComponent implements OnInit {
|
|
|
16
17
|
markForCheck(): void;
|
|
17
18
|
isolateChange(event: MatCheckboxChange): void;
|
|
18
19
|
static ɵfac: i0.ɵɵFactoryDeclaration<SelectComponent, never>;
|
|
19
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<SelectComponent, "filter-item-select", never, { "autofocus": { "alias": "autofocus"; "required": false; }; "item": { "alias": "item"; "required": false; }; }, {}, never, never, true, never>;
|
|
20
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SelectComponent, "filter-item-select", never, { "autofocus": { "alias": "autofocus"; "required": false; }; "floatLabel": { "alias": "floatLabel"; "required": false; }; "item": { "alias": "item"; "required": false; }; }, {}, never, never, true, never>;
|
|
20
21
|
}
|
|
@@ -4,6 +4,7 @@ import { BaseItemComponent } from '../base-item/base-item.component';
|
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
export declare class TextComponent extends BaseItemComponent<TextItem> implements OnInit {
|
|
6
6
|
autofocus: boolean;
|
|
7
|
+
floatLabel: 'auto' | 'always';
|
|
7
8
|
value: string;
|
|
8
9
|
private _change$;
|
|
9
10
|
private _cdRef;
|
|
@@ -12,5 +13,5 @@ export declare class TextComponent extends BaseItemComponent<TextItem> implement
|
|
|
12
13
|
private _listenControlValueChanges;
|
|
13
14
|
private _listenValueChanges;
|
|
14
15
|
static ɵfac: i0.ɵɵFactoryDeclaration<TextComponent, never>;
|
|
15
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<TextComponent, "filter-item-text", never, { "autofocus": { "alias": "autofocus"; "required": false; }; }, {}, never, never, true, never>;
|
|
16
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TextComponent, "filter-item-text", never, { "autofocus": { "alias": "autofocus"; "required": false; }; "floatLabel": { "alias": "floatLabel"; "required": false; }; }, {}, never, never, true, never>;
|
|
16
17
|
}
|
|
@@ -4,9 +4,10 @@ import { BaseItemComponent } from '../base-item/base-item.component';
|
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
export declare class WeekComponent extends BaseItemComponent<WeekItem> implements OnInit {
|
|
6
6
|
autofocus: boolean;
|
|
7
|
+
floatLabel: 'auto' | 'always';
|
|
7
8
|
value: Date;
|
|
8
9
|
private _cdRef;
|
|
9
10
|
ngOnInit(): void;
|
|
10
11
|
static ɵfac: i0.ɵɵFactoryDeclaration<WeekComponent, never>;
|
|
11
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<WeekComponent, "filter-item-week", never, { "autofocus": { "alias": "autofocus"; "required": false; }; }, {}, never, never, true, never>;
|
|
12
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<WeekComponent, "filter-item-week", never, { "autofocus": { "alias": "autofocus"; "required": false; }; "floatLabel": { "alias": "floatLabel"; "required": false; }; }, {}, never, never, true, never>;
|
|
12
13
|
}
|
|
@@ -12,4 +12,4 @@ import { RangeItem } from '../models/items/range-item';
|
|
|
12
12
|
import { SelectItem } from '../models/items/select-item';
|
|
13
13
|
import { TextItem } from '../models/items/text-item';
|
|
14
14
|
import { WeekItem } from '../models/items/week-item';
|
|
15
|
-
export declare function createFilterItem(item: IFilterConfigItem, filter: FilterComponent):
|
|
15
|
+
export declare function createFilterItem(item: IFilterConfigItem, filter: FilterComponent): SelectItem | ChipsItem | RangeItem | DateRangeItem | DateTimeRangeItem | DateItem | WeekItem | DateTimeItem | AutocompleteItem | AutocompleteChipsItem | CheckboxItem | TextItem;
|
|
@@ -19,6 +19,7 @@ export interface IFilterConfigBaseItem<T = DefaultItemType, U = string> {
|
|
|
19
19
|
show?: boolean;
|
|
20
20
|
values?: any;
|
|
21
21
|
primary?: boolean;
|
|
22
|
+
secondary?: boolean;
|
|
22
23
|
default?: unknown;
|
|
23
24
|
change?: (item: BaseItem<any>, filter: FilterComponent) => void;
|
|
24
25
|
init?: (item: BaseItem<any>, filter?: FilterComponent) => void;
|
|
@@ -14,6 +14,7 @@ export declare abstract class BaseItem<T extends IFilterConfigItem> {
|
|
|
14
14
|
persistanceDisabled: boolean;
|
|
15
15
|
queryParamsDisabled: boolean;
|
|
16
16
|
primary: boolean;
|
|
17
|
+
secondary: boolean;
|
|
17
18
|
changeCallback: (item: BaseItem<T>, filter: FilterComponent) => void;
|
|
18
19
|
initCallback: (item: BaseItem<T>, filter?: any) => void;
|
|
19
20
|
protected readonly _type: T['type'];
|
|
@@ -21,8 +22,13 @@ export declare abstract class BaseItem<T extends IFilterConfigItem> {
|
|
|
21
22
|
private _hidden$;
|
|
22
23
|
private _value$;
|
|
23
24
|
private _values$;
|
|
25
|
+
private _secondaryVisible$;
|
|
24
26
|
private _destroy$;
|
|
25
27
|
constructor(itemConfig: T, _filter: FilterComponent);
|
|
28
|
+
secondaryShow(): void;
|
|
29
|
+
secondaryHide(): void;
|
|
30
|
+
get secondaryVisible$(): Observable<boolean>;
|
|
31
|
+
get secondaryVisible(): boolean;
|
|
26
32
|
get filter(): FilterComponent;
|
|
27
33
|
get hidden$(): Observable<boolean>;
|
|
28
34
|
get mergedLabel(): string;
|
|
@@ -44,6 +50,7 @@ export declare abstract class BaseItem<T extends IFilterConfigItem> {
|
|
|
44
50
|
get destroy$(): Observable<void>;
|
|
45
51
|
get type(): T['type'];
|
|
46
52
|
get hasValue(): boolean;
|
|
53
|
+
get notValue$(): Observable<boolean>;
|
|
47
54
|
get hasValue$(): Observable<boolean>;
|
|
48
55
|
get chips$(): Observable<{
|
|
49
56
|
name?: string;
|
|
@@ -11,7 +11,6 @@ export declare class FilterController implements OnDestroy {
|
|
|
11
11
|
private _ready$;
|
|
12
12
|
private _items;
|
|
13
13
|
private _config;
|
|
14
|
-
private _add$;
|
|
15
14
|
private _init$;
|
|
16
15
|
private _change$;
|
|
17
16
|
private _destroy$;
|
|
@@ -24,7 +23,6 @@ export declare class FilterController implements OnDestroy {
|
|
|
24
23
|
get itemNames(): string[];
|
|
25
24
|
get config(): FsFilterConfig;
|
|
26
25
|
get init$(): Observable<void>;
|
|
27
|
-
get add$(): Observable<void>;
|
|
28
26
|
get change$(): Observable<BaseItem<IFilterConfigItem>[]>;
|
|
29
27
|
change(): void;
|
|
30
28
|
get ready$(): Observable<boolean>;
|
|
@@ -38,6 +36,7 @@ export declare class FilterController implements OnDestroy {
|
|
|
38
36
|
get values(): Record<string, unknown>;
|
|
39
37
|
private _getInitValues;
|
|
40
38
|
private _initItems;
|
|
39
|
+
private _initEnabledItems;
|
|
41
40
|
private _addItems;
|
|
42
41
|
private _initChanges;
|
|
43
42
|
static ɵfac: i0.ɵɵFactoryDeclaration<FilterController, never>;
|
|
@@ -360,7 +360,7 @@ export class FilterComponent {
|
|
|
360
360
|
ActionsController,
|
|
361
361
|
KeywordController,
|
|
362
362
|
SortController,
|
|
363
|
-
], queries: [{ propertyName: "statusBar", first: true, predicate: FilterStatusBarDirective, descendants: true }, { propertyName: "headingTemplate", first: true, predicate: FilterHeadingDirective, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "keywordInput", first: true, predicate: KeywordInputComponent, descendants: true }, { propertyName: "reloadEl", first: true, predicate: ["reloadEl"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div\n class=\"filter-container\"\n [ngClass]=\"{ 'has-primary-filter': primaryFilterVisible$ | async }\"\n [ngClass]=\"{ 'keyword-full-width': keywordFullWidth$ | async }\">\n @if (primaryFilterVisible$ | async) {\n <ng-container *ngTemplateOutlet=\"headingTmpl\"></ng-container>\n }\n <div class=\"filter-bar-container\">\n @if (primaryFilterVisible$ | async) {\n <div class=\"filter-input-container\">\n @if (keywordVisible$ | async) {\n <fs-keyword-input [autofocus]=\"config.autofocus\"></fs-keyword-input>\n }\n @for (item of primaryItems; track item.name) {\n @if (item.visible$ | async) {\n <filter-item [item]=\"item\"></filter-item>\n }\n }\n </div>\n } @else if (hasHeading) {\n <div class=\"filter-heading-container\">\n <ng-container *ngTemplateOutlet=\"headingTmpl\"></ng-container>\n </div>\n } @else {\n <ng-container *ngTemplateOutlet=\"chipsTmpl\"></ng-container>\n }\n <ng-container [ngTemplateOutlet]=\"filterActionsTmpl\"></ng-container>\n </div>\n @if ((primaryFilterVisible$ | async) === true || hasHeading) {\n <ng-container\n [ngTemplateOutlet]=\"chipsTmpl\"\n [ngTemplateOutletContext]=\"{ topMargin: true }\">\n </ng-container>\n }\n <ng-container *ngTemplateOutlet=\"statusBarTmpl\"></ng-container>\n</div>\n<ng-template\n #chipsTmpl\n let-topMargin=\"topMargin\">\n <fs-filter-chips\n class=\"filter-chips\"\n [ngClass]=\"{ 'top-margin': topMargin }\">\n </fs-filter-chips>\n</ng-template>\n<ng-template #statusBarTmpl>\n @if (statusBar) {\n <div\n class=\"filter-status-container\"\n [ngClass]=\"{ 'has-status': !!filterStatus.textContent }\">\n <div\n class=\"filter-status\"\n #filterStatus>\n <ng-container *ngTemplateOutlet=\"statusBar.templateRef\"></ng-container>\n </div>\n </div>\n }\n</ng-template>\n<ng-template #filterActionsTmpl>\n @if ((actionsVisible$ | async)) {\n <div class=\"filter-actions\">\n <ng-container [ngTemplateOutlet]=\"filterToolbarTmpl\"></ng-container>\n <fs-filter-actions\n [actions]=\"actions$ | async\"\n [kebabActions]=\"menuActions$ | async\">\n </fs-filter-actions>\n </div>\n }\n</ng-template>\n<ng-template #filterToolbarTmpl>\n @if (config.reload || config.autoReload || (filtersVisible$ | async)) {\n <div class=\"filter-toolbar\">\n @if (config.reload) {\n <a\n mat-icon-button\n (click)=\"reload($event)\"\n class=\"button-reload\">\n <mat-icon #reloadEl>\n refresh\n </mat-icon>\n </a>\n }\n @if (config.autoReload) {\n <div class=\"filter-reload\">\n <mat-slide-toggle\n name=\"autoReload\"\n class=\"auto-reload\"\n [ngModel]=\"config.autoReload.enabled\"\n (ngModelChange)=\"config.autoReload.enabled = $event\">\n <span>\n Auto refresh\n </span>\n </mat-slide-toggle>\n </div>\n }\n </div>\n }\n</ng-template>\n<ng-template #headingTmpl>\n @if (headingTemplate) {\n <ng-container *ngTemplateOutlet=\"headingTemplate\"></ng-container>\n } @else if (config.heading) {\n <div class=\"heading\">\n <h2>\n {{ config.heading }}\n </h2>\n <div class=\"subheading\">\n {{ config.subheading }}\n </div>\n </div>\n }\n</ng-template>", styles: [":host{margin-bottom:20px;display:block}.filter-status-container{flex-grow:1;display:flex;justify-content:center;flex-direction:column;align-self:flex-end;margin-top:4px}.filter-status-container .filter-status{overflow:hidden;text-overflow:ellipsis}.filter-container{width:100%}.filter-container.has-primary-filter .heading{margin-bottom:10px}.filter-container.has-primary-filter .filter-bar-container{margin-bottom:4px}.filter-container.keyword-full-width .filter-input-container{flex:1}.filter-container.keyword-full-width .filter-input-container fs-keyword-input{flex:1}.filter-container.keyword-full-width .filter-input-container fs-keyword-input ::ng-deep mat-form-field{width:100%}.filter-container .filter-bar-container{flex-direction:row;box-sizing:border-box;display:flex;position:relative;align-items:flex-start}.filter-container .filter-bar-container .filter-input-container{flex-direction:row;box-sizing:border-box;display:flex;align-items:center;min-width:0;gap:5px;flex-wrap:wrap}.filter-container .filter-bar-container .filter-heading-container{flex-direction:row;box-sizing:border-box;display:flex;align-items:center;min-width:0}.filter-container .filter-bar-container .filter-heading-container fs-keyword-input+fs-saved-filter-autocomplete-chips{margin-left:5px}.filter-actions{display:flex;align-items:center;flex:1;justify-content:flex-end}.filter-toolbar{white-space:nowrap;display:flex;align-items:center}.filter-toolbar .button-filters,.filter-toolbar .button-reload{display:flex;--mdc-icon-button-state-layer-size: 40px;padding:8px}.filter-toolbar .button-filters ::ng-deep svg,.filter-toolbar .button-reload ::ng-deep svg{display:flex}.filter-toolbar .button-reload{display:flex;align-items:center}.filter-toolbar .button-reload .auto-reload{margin-right:5px}.filter-toolbar .button-reload .auto-reload span{font-size:80%}.heading{margin-right:8px}.heading h2{margin:0}.heading h2+.subheading{margin:0}@media screen and (min-width: 1200px){html.fs-filter-open body{margin-right:350px}}html.fs-filter-open{scrollbar-width:none}:host ::ng-deep .auto-reload.mat-checked .mat-slide-toggle-thumb-container{transform:translate3d(12px,0,0)}:host ::ng-deep .auto-reload:not(.mat-checked) .mat-slide-toggle-content{color:#ccc}:host ::ng-deep .auto-reload .mat-slide-toggle-thumb,:host ::ng-deep .auto-reload .mat-slide-toggle-thumb-container{height:15px;width:15px}:host ::ng-deep .auto-reload .mat-slide-toggle-content{font-size:90%}:host ::ng-deep .auto-reload .mat-slide-toggle-bar{width:26px;height:10px;border-radius:10px}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: FilterItemComponent, selector: "filter-item", inputs: ["autofocus", "autofocusName", "item", "name"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: FsFormModule }, { kind: "directive", type: i2.FsFormNoFsValidatorsDirective, selector: "[ngModel]:not([required]):not([fsFormRequired]):not([fsFormCompare]):not([fsFormDateRange]):not([fsFormEmail]):not([fsFormEmails]):not([fsFormFunction]):not([fsFormGreater]):not([fsFormGreaterEqual]):not([fsFormInteger]):not([fsFormLesser]):not([fsFormMax]):not([fsFormMaxLength]):not([fsFormMin]):not([fsFormMinLength]):not([fsFormNumeric]):not([fsFormPattern]):not([fsFormPhone]):not([fsFormUrl]):not([validate])" }, { kind: "ngmodule", type: FsClearModule }, { kind: "component", type: FsFilterChipsComponent, selector: "fs-filter-chips" }, { kind: "component", type: FsFilterActionsComponent, selector: "fs-filter-actions", inputs: ["kebabActions", "actions"] }, { kind: "component", type: MatIconAnchor, selector: "a[mat-icon-button]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: KeywordInputComponent, selector: "fs-keyword-input", inputs: ["autofocus"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
363
|
+
], queries: [{ propertyName: "statusBar", first: true, predicate: FilterStatusBarDirective, descendants: true }, { propertyName: "headingTemplate", first: true, predicate: FilterHeadingDirective, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "keywordInput", first: true, predicate: KeywordInputComponent, descendants: true }, { propertyName: "reloadEl", first: true, predicate: ["reloadEl"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div\n class=\"filter-container\"\n [ngClass]=\"{ 'has-primary-filter': primaryFilterVisible$ | async }\"\n [ngClass]=\"{ 'keyword-full-width': keywordFullWidth$ | async }\">\n @if (primaryFilterVisible$ | async) {\n <ng-container *ngTemplateOutlet=\"headingTmpl\"></ng-container>\n }\n <div class=\"filter-bar-container\">\n @if (primaryFilterVisible$ | async) {\n <div class=\"filter-input-container\">\n @if (keywordVisible$ | async) {\n <fs-keyword-input [autofocus]=\"config.autofocus\"></fs-keyword-input>\n }\n @for (item of primaryItems; track item.name) {\n @if (item.visible$ | async) {\n <filter-item [item]=\"item\"></filter-item>\n }\n }\n </div>\n } @else if (hasHeading) {\n <div class=\"filter-heading-container\">\n <ng-container *ngTemplateOutlet=\"headingTmpl\"></ng-container>\n </div>\n } @else {\n <ng-container *ngTemplateOutlet=\"chipsTmpl\"></ng-container>\n }\n <ng-container [ngTemplateOutlet]=\"filterActionsTmpl\"></ng-container>\n </div>\n @if ((primaryFilterVisible$ | async) === true || hasHeading) {\n <ng-container\n [ngTemplateOutlet]=\"chipsTmpl\"\n [ngTemplateOutletContext]=\"{ topMargin: true }\">\n </ng-container>\n }\n <ng-container *ngTemplateOutlet=\"statusBarTmpl\"></ng-container>\n</div>\n<ng-template\n #chipsTmpl\n let-topMargin=\"topMargin\">\n <fs-filter-chips\n class=\"filter-chips\"\n [ngClass]=\"{ 'top-margin': topMargin }\">\n </fs-filter-chips>\n</ng-template>\n<ng-template #statusBarTmpl>\n @if (statusBar) {\n <div\n class=\"filter-status-container\"\n [ngClass]=\"{ 'has-status': !!filterStatus.textContent }\">\n <div\n class=\"filter-status\"\n #filterStatus>\n <ng-container *ngTemplateOutlet=\"statusBar.templateRef\"></ng-container>\n </div>\n </div>\n }\n</ng-template>\n<ng-template #filterActionsTmpl>\n @if ((actionsVisible$ | async)) {\n <div class=\"filter-actions\">\n <ng-container [ngTemplateOutlet]=\"filterToolbarTmpl\"></ng-container>\n <fs-filter-actions\n [actions]=\"actions$ | async\"\n [kebabActions]=\"menuActions$ | async\">\n </fs-filter-actions>\n </div>\n }\n</ng-template>\n<ng-template #filterToolbarTmpl>\n @if (config.reload || config.autoReload || (filtersVisible$ | async)) {\n <div class=\"filter-toolbar\">\n @if (config.reload) {\n <a\n mat-icon-button\n (click)=\"reload($event)\"\n class=\"button-reload\">\n <mat-icon #reloadEl>\n refresh\n </mat-icon>\n </a>\n }\n @if (config.autoReload) {\n <div class=\"filter-reload\">\n <mat-slide-toggle\n name=\"autoReload\"\n class=\"auto-reload\"\n [ngModel]=\"config.autoReload.enabled\"\n (ngModelChange)=\"config.autoReload.enabled = $event\">\n <span>\n Auto refresh\n </span>\n </mat-slide-toggle>\n </div>\n }\n </div>\n }\n</ng-template>\n<ng-template #headingTmpl>\n @if (headingTemplate) {\n <ng-container *ngTemplateOutlet=\"headingTemplate\"></ng-container>\n } @else if (config.heading) {\n <div class=\"heading\">\n <h2>\n {{ config.heading }}\n </h2>\n <div class=\"subheading\">\n {{ config.subheading }}\n </div>\n </div>\n }\n</ng-template>", styles: [":host{margin-bottom:20px;display:block}.filter-status-container{flex-grow:1;display:flex;justify-content:center;flex-direction:column;align-self:flex-end;margin-top:4px}.filter-status-container .filter-status{overflow:hidden;text-overflow:ellipsis}.filter-container{width:100%}.filter-container.has-primary-filter .heading{margin-bottom:10px}.filter-container.has-primary-filter .filter-bar-container{margin-bottom:4px}.filter-container.keyword-full-width .filter-input-container{flex:1}.filter-container.keyword-full-width .filter-input-container fs-keyword-input{flex:1}.filter-container.keyword-full-width .filter-input-container fs-keyword-input ::ng-deep mat-form-field{width:100%}.filter-container .filter-bar-container{flex-direction:row;box-sizing:border-box;display:flex;position:relative;align-items:flex-start}.filter-container .filter-bar-container .filter-input-container{flex-direction:row;box-sizing:border-box;display:flex;align-items:center;min-width:0;gap:5px;flex-wrap:wrap}.filter-container .filter-bar-container .filter-heading-container{flex-direction:row;box-sizing:border-box;display:flex;align-items:center;min-width:0}.filter-container .filter-bar-container .filter-heading-container fs-keyword-input+fs-saved-filter-autocomplete-chips{margin-left:5px}.filter-actions{display:flex;align-items:center;flex:1;justify-content:flex-end}.filter-toolbar{white-space:nowrap;display:flex;align-items:center}.filter-toolbar .button-filters,.filter-toolbar .button-reload{display:flex;--mdc-icon-button-state-layer-size: 40px;padding:8px}.filter-toolbar .button-filters ::ng-deep svg,.filter-toolbar .button-reload ::ng-deep svg{display:flex}.filter-toolbar .button-reload{display:flex;align-items:center}.filter-toolbar .button-reload .auto-reload{margin-right:5px}.filter-toolbar .button-reload .auto-reload span{font-size:80%}.heading{margin-right:8px}.heading h2{margin:0}.heading h2+.subheading{margin:0}@media screen and (min-width: 1200px){html.fs-filter-open body{margin-right:350px}}html.fs-filter-open{scrollbar-width:none}:host ::ng-deep .auto-reload.mat-checked .mat-slide-toggle-thumb-container{transform:translate3d(12px,0,0)}:host ::ng-deep .auto-reload:not(.mat-checked) .mat-slide-toggle-content{color:#ccc}:host ::ng-deep .auto-reload .mat-slide-toggle-thumb,:host ::ng-deep .auto-reload .mat-slide-toggle-thumb-container{height:15px;width:15px}:host ::ng-deep .auto-reload .mat-slide-toggle-content{font-size:90%}:host ::ng-deep .auto-reload .mat-slide-toggle-bar{width:26px;height:10px;border-radius:10px}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: FilterItemComponent, selector: "filter-item", inputs: ["autofocus", "floatLabel", "autofocusName", "item", "name"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: FsFormModule }, { kind: "directive", type: i2.FsFormNoFsValidatorsDirective, selector: "[ngModel]:not([required]):not([fsFormRequired]):not([fsFormCompare]):not([fsFormDateRange]):not([fsFormEmail]):not([fsFormEmails]):not([fsFormFunction]):not([fsFormGreater]):not([fsFormGreaterEqual]):not([fsFormInteger]):not([fsFormLesser]):not([fsFormMax]):not([fsFormMaxLength]):not([fsFormMin]):not([fsFormMinLength]):not([fsFormNumeric]):not([fsFormPattern]):not([fsFormPhone]):not([fsFormUrl]):not([validate])" }, { kind: "ngmodule", type: FsClearModule }, { kind: "component", type: FsFilterChipsComponent, selector: "fs-filter-chips" }, { kind: "component", type: FsFilterActionsComponent, selector: "fs-filter-actions", inputs: ["kebabActions", "actions"] }, { kind: "component", type: MatIconAnchor, selector: "a[mat-icon-button]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: KeywordInputComponent, selector: "fs-keyword-input", inputs: ["autofocus"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
364
364
|
}
|
|
365
365
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FilterComponent, decorators: [{
|
|
366
366
|
type: Component,
|
|
@@ -419,4 +419,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
419
419
|
type: HostBinding,
|
|
420
420
|
args: ['class.fs-filter']
|
|
421
421
|
}] } });
|
|
422
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9maWx0ZXIvZmlsdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9maWx0ZXIvZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkUsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUdOLE1BQU0sRUFDTixXQUFXLEVBQ1gsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVoRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWhELE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtD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O2dCQUlwQyxjQUFjO3NCQURwQixXQUFXO3VCQUFDLG9CQUFvQjtnQkFJMUIsYUFBYTtzQkFEbkIsV0FBVzt1QkFBQyxzQkFBc0I7Z0JBSTVCLGFBQWE7c0JBRG5CLFdBQVc7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0NsYXNzLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBNYXRJY29uQW5jaG9yIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEljb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdFNsaWRlVG9nZ2xlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGUtdG9nZ2xlJztcblxuaW1wb3J0IHsgRnNDbGVhck1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2NsZWFyJztcbmltcG9ydCB7IEZzRm9ybU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2Zvcm0nO1xuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIGZyb21FdmVudCwgaW50ZXJ2YWwsIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZpbHRlciwgbWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEFjdGlvbnNDb250cm9sbGVyIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9hY3Rpb25zLWNvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmlsdGVySGVhZGluZ0RpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMnO1xuaW1wb3J0IHsgSVNvcnRpbmdDaGFuZ2VFdmVudCwgS2V5VmFsdWUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEZzRmlsdGVyQWN0aW9uIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9hY3Rpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIEZpbHRlckNvbmZpZyxcbiAgSUZpbHRlckNvbmZpZ0l0ZW0sXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJVXBkYXRlRmlsdGVySXRlbUNvbmZpZyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvdXBkYXRlLWZpbHRlci1pdGVtLmludGVyZmFjZSc7XG5pbXBvcnQgeyBGc0ZpbHRlckNvbmZpZyB9IGZyb20gJy4uLy4uL21vZGVscy9maWx0ZXItY29uZmlnJztcbmltcG9ydCB7IEJhc2VJdGVtIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2l0ZW1zL2Jhc2UtaXRlbSc7XG5pbXBvcnQgeyBTb3J0Q29udHJvbGxlciB9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IEZpbHRlckNvbnRyb2xsZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9maWx0ZXItY29udHJvbGxlci5zZXJ2aWNlJztcbmltcG9ydCB7IEZvY3VzQ29udHJvbGxlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mb2N1cy1jb250cm9sbGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgS2V5d29yZENvbnRyb2xsZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9rZXl3b3JkLWNvbnRyb2xsZXIuc2VydmljZSc7XG5pbXBvcnQgeyBQZXJzaXN0YW5jZUNvbnRyb2xsZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wZXJzaXN0YW5jZS1jb250cm9sbGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgUXVlcnlQYXJhbUNvbnRyb2xsZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9xdWVyeS1wYXJhbS1jb250cm9sbGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2F2ZWRGaWx0ZXJDb250cm9sbGVyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2F2ZWQtZmlsdGVyLWNvbnRyb2xsZXIuc2VydmljZSc7XG5pbXBvcnQgeyBGc0ZpbHRlckFjdGlvbnNDb21wb25lbnQgfSBmcm9tICcuLi9hY3Rpb25zL2FjdGlvbnMuY29tcG9uZW50JztcbmltcG9ydCB7IEZzRmlsdGVyQ2hpcHNDb21wb25lbnQgfSBmcm9tICcuLi9maWx0ZXItY2hpcHMvZmlsdGVyLWNoaXBzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGaWx0ZXJJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vZmlsdGVycy1pdGVtJztcbmltcG9ydCB7IEtleXdvcmRJbnB1dENvbXBvbmVudCB9IGZyb20gJy4uL2tleXdvcmQtaW5wdXQva2V5d29yZC1pbnB1dC5jb21wb25lbnQnO1xuXG5pbXBvcnQgeyBGaWx0ZXJTdGF0dXNCYXJEaXJlY3RpdmUgfSBmcm9tICcuLy4uLy4uL2RpcmVjdGl2ZXMvc3RhdHVzLWJhci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRlNfRklMVEVSX0NPTkZJRyB9IGZyb20gJy4vLi4vLi4vaW5qZWN0b3JzL2ZpbHRlci1jb25maWcnO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ZzLWZpbHRlcicsXG4gIHN0eWxlVXJsczogWycuL2ZpbHRlci5jb21wb25lbnQuc2NzcyddLFxuICB0ZW1wbGF0ZVVybDogJy4vZmlsdGVyLmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAgUGVyc2lzdGFuY2VDb250cm9sbGVyLFxuICAgIFF1ZXJ5UGFyYW1Db250cm9sbGVyLFxuICAgIEZvY3VzQ29udHJvbGxlclNlcnZpY2UsXG4gICAgRmlsdGVyQ29udHJvbGxlcixcbiAgICBTYXZlZEZpbHRlckNvbnRyb2xsZXIsXG4gICAgQWN0aW9uc0NvbnRyb2xsZXIsXG4gICAgS2V5d29yZENvbnRyb2xsZXIsXG4gICAgU29ydENvbnRyb2xsZXIsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBGaWx0ZXJJdGVtQ29tcG9uZW50LFxuICAgIE5nQ2xhc3MsXG4gICAgTWF0SWNvbixcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBGc0Zvcm1Nb2R1bGUsXG4gICAgRnNDbGVhck1vZHVsZSxcbiAgICBGc0ZpbHRlckNoaXBzQ29tcG9uZW50LFxuICAgIEZzRmlsdGVyQWN0aW9uc0NvbXBvbmVudCxcbiAgICBNYXRJY29uQW5jaG9yLFxuICAgIE1hdFNsaWRlVG9nZ2xlLFxuICAgIEFzeW5jUGlwZSxcbiAgICBLZXl3b3JkSW5wdXRDb21wb25lbnQsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEZpbHRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICBAVmlld0NoaWxkKEtleXdvcmRJbnB1dENvbXBvbmVudClcbiAgcHVibGljIGtleXdvcmRJbnB1dDogS2V5d29yZElucHV0Q29tcG9uZW50O1xuICBcbiAgQElucHV0KCdjb25maWcnKSBwdWJsaWMgc2V0IHNldEZpbHRlckNvbmZpZyh2YWx1ZTogRmlsdGVyQ29uZmlnKSB7XG4gICAgdGhpcy5fZmlsdGVyQ29uZmlnID0gdmFsdWU7XG4gIH1cblxuICBAT3V0cHV0KCkgcHVibGljIGNsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgcHVibGljIG9wZW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgcHVibGljIHJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIEBDb250ZW50Q2hpbGQoRmlsdGVyU3RhdHVzQmFyRGlyZWN0aXZlKVxuICBwdWJsaWMgc3RhdHVzQmFyOiBGaWx0ZXJTdGF0dXNCYXJEaXJlY3RpdmU7XG5cbiAgQENvbnRlbnRDaGlsZChGaWx0ZXJIZWFkaW5nRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIHB1YmxpYyBoZWFkaW5nVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQFZpZXdDaGlsZCgncmVsb2FkRWwnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgcHVibGljIHJlbG9hZEVsOiBFbGVtZW50UmVmO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZmlsdGVycy1vcGVuJylcbiAgcHVibGljIHNob3dGaWx0ZXJNZW51ID0gZmFsc2U7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy53aW5kb3ctZGVza3RvcCcpXG4gIHB1YmxpYyB3aW5kb3dEZXNrdG9wID0gZmFsc2U7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5mcy1maWx0ZXInKVxuICBwdWJsaWMgZnNGaWx0ZXJDbGFzcyA9IHRydWU7XG5cbiAgcHJpdmF0ZSBfY29uZmlnOiBGc0ZpbHRlckNvbmZpZztcbiAgcHJpdmF0ZSBfZmlsdGVyQ29uZmlnOiBGaWx0ZXJDb25maWc7XG4gIHByaXZhdGUgX2ZpbHRlcnNWaXNpYmxlJCA9IG5ldyBCZWhhdmlvclN1YmplY3QodHJ1ZSk7XG4gIHByaXZhdGUgX2hhc0ZpbHRlckNoaXBzJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgX2RlZmF1bHRDb25maWcgPSBpbmplY3QoRlNfRklMVEVSX0NPTkZJRywgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSBfem9uZSA9IGluamVjdChOZ1pvbmUpO1xuICBwcml2YXRlIF9hY3Rpb25zQ29udHJvbGxlciA9IGluamVjdChBY3Rpb25zQ29udHJvbGxlcik7XG4gIHByaXZhdGUgX2ZpbHRlckNvbnRyb2xsZXIgPSBpbmplY3QoRmlsdGVyQ29udHJvbGxlcik7XG4gIHByaXZhdGUgX3NvcnRDb250cm9sbGVyID0gaW5qZWN0KFNvcnRDb250cm9sbGVyKTtcbiAgcHJpdmF0ZSBfc2F2ZWRGaWx0ZXJDb250cm9sbGVyID0gaW5qZWN0KFNhdmVkRmlsdGVyQ29udHJvbGxlcik7XG4gIHByaXZhdGUgX2tleXdvcmRDb250cm9sbGVyID0gaW5qZWN0KEtleXdvcmRDb250cm9sbGVyKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgKSB7XG4gICAgdGhpcy5fZmlsdGVyQ29udHJvbGxlci5maWx0ZXIgPSB0aGlzO1xuICAgIHRoaXMuX3VwZGF0ZVdpbmRvd1dpZHRoKCk7XG4gICAgdGhpcy5fbGlzdGVuV2luZG93UmVzaXplKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHF1ZXJ5UGFyYW1zKCk6IEtleVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyQ29udHJvbGxlci5xdWVyeVBhcmFtO1xuICB9XG5cbiAgcHVibGljIGdldCBxdWVyeSgpOiBLZXlWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlckNvbnRyb2xsZXIucXVlcnk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZhbHVlcygpOiBLZXlWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlckNvbnRyb2xsZXIudmFsdWVzO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIERvIHVwZGF0ZSB2YWx1ZSBvZiBzb21lIGZpZWxkXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZXMgLSB2YWx1ZXMgZm9yIHVwZGF0ZVxuICAgKlxuICAgKiBUbyB1cGRhdGUgdGV4dCB2YWx1ZSBqdXN0IHBhc3MgbmV3IHRleHQgdmFsdWVcbiAgICpcbiAgICogcHVibGljIHVwZGF0ZVNlbGVjdFZhbHVlKHZhbCkge1xuICAgKiAgIHRoaXMuZmlsdGVyRWwudXBkYXRlVmFsdWVzKHsga2V5d29yZDogdmFsIH0pO1xuICAgKiB9XG4gICAqXG4gICAqIFRvIHVwZGF0ZSBzZWxlY3Qgb3Igb2JzZXJ2YWJsZSBzZWxlY3QgeW91IGNvdWxkIHBhc3Mgc3VpdGFibGUgdmFsdWVcbiAgICpcbiAgICogcHVibGljIHVwZGF0ZVNlbGVjdFZhbHVlKHZhbDogbnVtYmVyKSB7XG4gICAqICAgdGhpcy5maWx0ZXJFbC51cGRhdGVWYWx1ZXMoeyBzaW1wbGVfc2VsZWN0OiB2YWwgfSwgeyBvYnNlcnZhYmxlX3NlbGVjdDogdmFsIH0pO1xuICAgKiB9XG4gICAqXG4gICAqIFRvIHVwZGF0ZSBjaGVja2JveCB2YWx1ZSBqdXN0IHBhc3MgdHJ1ZS9mYWxzZSBhcyB2YWx1ZVxuICAgKlxuICAgKiBwdWJsaWMgdXBkYXRlQ2hlY2tveCh2YWw6IGJvb2xlYW4pIHtcbiAgICogICB0aGlzLmZpbHRlckVsLnVwZGF0ZVZhbHVlcyh7IGNoZWNrYm94OiB2YWwgfSk7XG4gICAqIH1cbiAgICpcbiAgICogVG8gdXBkYXRlIHJhbmdlIHZhbHVlIGp1c3QgcGFzcyBvYmplY3Qgd2l0aCBtaW4mbWF4IG9iamVjdCBvciBqdXN0IHdpdGggb25lIG9mIHRhcmdldHNcbiAgICpcbiAgICogRXguOiB7IG1pbjogMTAsIG1heCAxNSB9LCB7IG1pbjogNSB9LCB7IG1heCA1IH1cbiAgICpcbiAgICogcHVibGljIHVwZGF0ZVJhbmdlKHZhbCkge1xuICAgKiAgIHRoaXMuZmlsdGVyRWwudXBkYXRlVmFsdWVzKHsgcmFuZ2U6IHZhbCB9KTtcbiAgICogfVxuICAgKlxuICAgKiBUbyB1cGRhdGUgYXV0b2NvbXBsZXRlIGp1c3QgcGFzcyBvYmplY3Qgd2l0aCBuYW1lL3ZhbHVlIGZpZWxkc1xuICAgKlxuICAgKiBFeC46IHsgbmFtZTogJ0pvaG4gRG9lJywgdmFsdWU6IDEgfVxuICAgKlxuICAgKiBwdWJsaWMgdXBkYXRlQXV0b2NvbXBsZXRlKHZhbCkge1xuICAgKiAgIHRoaXMuZmlsdGVyRWwudXBkYXRlVmFsdWVzKHsgYXV0b2NvbXBsZXRlX3VzZXJfaWQ6IHZhbCB9KTtcbiAgICogfVxuICAgKlxuICAgKiBUbyB1cGRhdGUgYXV0b2NvbXBsZXRlY2hpcHMganVzdCBwYXNzOlxuICAgKlxuICAgKiAxKSBvYmplY3Qgd2l0aCBuYW1lL3ZhbHVlIGZpZWxkcyAtIHdpbGwgYmUgYXBwZW5kZWQgdG8gZXhpc3Rpbmcgc2V0IG9mIHZhbHVlc1xuICAgKlxuICAgKiB7IG5hbWU6ICdKb2huIERvZScsIHZhbHVlOiAxIH1cbiAgICpcbiAgICogMikgYXJyYXkgb2Ygb2JqZWN0cyAtIHdpbGwgYmUgYXBwZW5kZWQgdG8gZXhpc3Rpbmcgc2V0IG9mIHZhbHVlc1xuICAgKlxuICAgKiBbeyBuYW1lOiAnSm9obiBEb2UnLCB2YWx1ZTogMSB9LCB7IG5hbWU6ICdEYXJ5YSBGaWxpcG92YScsIHZhbHVlOiAyIH1dXG4gICAqXG4gICAqIDMpIG51bGwgLSBjbGVhciBleGlzdGluZyBzZXQgb2YgdmFsdWVzXG4gICAqXG4gICAqIHB1YmxpYyB1cGRhdGVBdXRvY29tcGxldGUodmFsKSB7XG4gICAqICAgdGhpcy5maWx0ZXJFbC51cGRhdGVWYWx1ZXMoeyBhdXRvY29tcGxldGVjaGlwc191c2VyX2lkOiB2YWwgfSk7XG4gICAqIH1cbiAgICpcbiAgICovXG4gIHB1YmxpYyBzZXQgdmFsdWVzKHZhbHVlcykge1xuICAgIHRoaXMuX2ZpbHRlckNvbnRyb2xsZXIudmFsdWVzID0gdmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGdldCBjb25maWcoKTogRnNGaWx0ZXJDb25maWcge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGl0ZW1zKCk6IEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPltdIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyQ29udHJvbGxlci5pdGVtcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcHJpbWFyeUl0ZW1zKCk6IEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPltdIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ucHJpbWFyeSk7XG4gIH1cblxuICBwdWJsaWMgY2hhbmdlKCkge1xuICAgIHRoaXMuX2ZpbHRlckNvbnRyb2xsZXIuY2hhbmdlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc0hlYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5oZWFkaW5nVGVtcGxhdGUgfHwgISF0aGlzLmNvbmZpZy5oZWFkaW5nO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNGaWx0ZXJDaGlwcyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2hhc0ZpbHRlckNoaXBzJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmlsdGVyc1Zpc2libGUkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KHtcbiAgICAgIGZpbHRlcnNWaXNpYmxlOiB0aGlzLl9maWx0ZXJzVmlzaWJsZSQuYXNPYnNlcnZhYmxlKCksXG4gICAgICBoYXNWaXNpYmxlSXRlbXM6IG9mKFxuICAgICAgICB0aGlzLml0ZW1zXG4gICAgICAgICAgLnNvbWUoKGl0ZW0pID0+IGl0ZW0udmlzaWJsZSAmJiAhaXRlbS5pc1R5cGVLZXl3b3JkKSxcbiAgICAgICksXG4gICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHsgZmlsdGVyc1Zpc2libGUsIGhhc1Zpc2libGVJdGVtcyB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGZpbHRlcnNWaXNpYmxlICYmIGhhc1Zpc2libGVJdGVtcztcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIGdldCBrZXl3b3JkVmlzaWJsZSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2tleXdvcmRDb250cm9sbGVyLmtleXdvcmRWaXNpYmxlJDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQga2V5d29yZEZ1bGxXaWR0aCQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2tleXdvcmRDb250cm9sbGVyLmtleXdvcmRGdWxsV2lkdGgkO1xuICB9XG5cbiAgcHVibGljIGdldCBwcmltYXJ5RmlsdGVyVmlzaWJsZSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3Qoe1xuICAgICAga2V5d29yZFZpc2libGU6IHRoaXMua2V5d29yZFZpc2libGUkLFxuICAgICAgc2F2ZWRGaWx0ZXJWaXNpYmxlOiBvZih0aGlzLml0ZW1zLnNvbWUoKGl0ZW0pID0+IGl0ZW0udmlzaWJsZSAmJiBpdGVtLnByaW1hcnkpKSxcbiAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoeyBrZXl3b3JkVmlzaWJsZSwgc2F2ZWRGaWx0ZXJWaXNpYmxlIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4ga2V5d29yZFZpc2libGUgfHwgc2F2ZWRGaWx0ZXJWaXNpYmxlO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGlvbnNWaXNpYmxlJCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aW9uc0NvbnRyb2xsZXIudmlzaWJsZSQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGlvbnMkKCkge1xuICAgIHJldHVybiB0aGlzLl9hY3Rpb25zQ29udHJvbGxlci5hY3Rpb25zJDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWVudUFjdGlvbnMkKCkge1xuICAgIHJldHVybiB0aGlzLl9hY3Rpb25zQ29udHJvbGxlci5tZW51QWN0aW9ucyQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNhdmVkRmlsdGVyQ29udHJvbGxlcigpOiBTYXZlZEZpbHRlckNvbnRyb2xsZXIge1xuICAgIHJldHVybiB0aGlzLl9zYXZlZEZpbHRlckNvbnRyb2xsZXI7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNvcnRDb250cm9sbGVyKCk6IFNvcnRDb250cm9sbGVyIHtcbiAgICByZXR1cm4gdGhpcy5fc29ydENvbnRyb2xsZXI7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgLi4uKHRoaXMuX2RlZmF1bHRDb25maWcgfHwge30pLFxuICAgICAgLi4udGhpcy5fZmlsdGVyQ29uZmlnLFxuICAgIH07XG5cbiAgICB0aGlzLl9jb25maWcgPSBuZXcgRnNGaWx0ZXJDb25maWcoY29uZmlnKTtcbiAgICB0aGlzLl9hY3Rpb25zQ29udHJvbGxlci5zZXRDb25maWcodGhpcy5jb25maWcpO1xuXG4gICAgdGhpcy5faW5pdEl0ZW1zKCk7XG4gICAgdGhpcy5faW5pdEF1dG9SZWxvYWQoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KG51bGwpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgZm9jdXMoKSB7XG4gICAgdGhpcy5rZXl3b3JkSW5wdXQ/LmZvY3VzKCk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlU29ydChzb3J0OiBJU29ydGluZ0NoYW5nZUV2ZW50LCBlbWl0Q2hhbmdlOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIHRoaXMuX3NvcnRDb250cm9sbGVyLnVwZGF0ZVNvcnQoc29ydCwgZW1pdENoYW5nZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGl0ZW1WYWx1ZXMoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLml0ZW1zXG4gICAgICAubWFwKChpdGVtKSA9PiBpdGVtLnZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbm9uRW1wdHlJdGVtVmFsdWVzKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtc1xuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbS52YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS52YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc0l0ZW1WYWx1ZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXNcbiAgICAgIC5zb21lKChpdGVtKSA9PiBpdGVtLnZhbHVlICE9PSB1bmRlZmluZWQpO1xuICB9XG5cbiAgcHVibGljIGdldEl0ZW1WYWx1ZShuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtc1xuICAgICAgLmZpbmQoKF9pdGVtKSA9PiBfaXRlbS5uYW1lID09PSBuYW1lKTtcblxuICAgIHJldHVybiBpdGVtPy52YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93SXRlbShuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLmdldEl0ZW0obmFtZSk/LnNob3coKTtcbiAgfVxuXG4gIHB1YmxpYyBoaWRlSXRlbShuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLmdldEl0ZW0obmFtZSk/LmhpZGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckl0ZW0obmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbShuYW1lKTtcblxuICAgIGlmICghaXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGl0ZW0uY2xlYXIoKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVJdGVtQ29uZmlnKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXJhbXM6IElVcGRhdGVGaWx0ZXJJdGVtQ29uZmlnLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKG5hbWUpO1xuXG4gICAgaWYgKCFpdGVtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaXRlbS5sYWJlbCA9IHBhcmFtcy5sYWJlbCA/PyBpdGVtLmxhYmVsO1xuICAgIGl0ZW0uY2hpcExhYmVsID0gcGFyYW1zLmNoaXBMYWJlbCA/PyBpdGVtLmNoaXBMYWJlbDtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcihldmVudCA9IG51bGwpIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIHRoaXMuX2ZpbHRlckNvbnRyb2xsZXIuZmlsdGVyc0NsZWFyKCk7XG5cbiAgICBpZiAodGhpcy5jb25maWcuY2xlYXIpIHtcbiAgICAgIHRoaXMuY29uZmlnLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgdGhpcy5rZXl3b3JkSW5wdXQ/LmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgcmVsb2FkKGV2ZW50ID0gbnVsbCkge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIGNvbnN0IGVsID0gdGhpcy5yZWxvYWRFbD8ubmF0aXZlRWxlbWVudDtcblxuICAgIGlmKGVsKSB7XG4gICAgICBlbC5zdHlsZS50cmFuc2l0aW9uID0gJ2FsbCAwLjc1cyAwLjBzJztcbiAgICAgIGVsLnN0eWxlLnRyYW5zZm9ybSA9ICdyb3RhdGUoMzYwZGVnKSc7XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBlbC5zdHlsZS50cmFuc2l0aW9uID0gbnVsbDtcbiAgICAgICAgZWwuc3R5bGUudHJhbnNmb3JtID0gbnVsbDtcbiAgICAgIH0sIDEwMDApO1xuICAgIH1cblxuICAgIHRoaXMuY2hhbmdlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SXRlbShuYW1lKTogQmFzZUl0ZW08YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXNcbiAgICAgIC5maW5kKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09IG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBpdGVtKG5hbWUpLnZhbHVlJCBpbnN0ZWFkXG4gICAqL1xuICBwdWJsaWMgZ2V0SXRlbVZhbHVlQ2hhbmdlJChuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJdGVtKG5hbWUpLnZhbHVlJDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgZmlsdGVyIGFjdGlvbnMgY29uZmlnXG4gICAqXG4gICAqIEBwYXJhbSBhY3Rpb25zXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQWN0aW9ucyhhY3Rpb25zOiBGc0ZpbHRlckFjdGlvbltdKTogdm9pZCB7XG4gICAgdGhpcy5fYWN0aW9uc0NvbnRyb2xsZXIuaW5pdEFjdGlvbnMoYWN0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyBcIkZpbHRlcnNcIiBidXR0b25cbiAgICovXG4gIHB1YmxpYyBzaG93RmlsdGVycygpOiB2b2lkIHtcbiAgICB0aGlzLl9maWx0ZXJzVmlzaWJsZSQubmV4dCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlIFwiRmlsdGVyc1wiIGJ1dHRvblxuICAgKi9cbiAgcHVibGljIGhpZGVGaWx0ZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuX2ZpbHRlcnNWaXNpYmxlJC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IFwiS2V5d29yZFwiIGZpZWxkIGlmIGl0IHByZXNlbnRcbiAgICovXG4gIHB1YmxpYyBzaG93S2V5d29yZEZpZWxkKCk6IHZvaWQge1xuICAgIHRoaXMuX2tleXdvcmRDb250cm9sbGVyLnNob3coKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlIFwiS2V5d29yZFwiIGZpZWxkIGlmIGl0IHByZXNlbnRcbiAgICovXG4gIHB1YmxpYyBoaWRlS2V5d29yZEZpZWxkKCk6IHZvaWQge1xuICAgIHRoaXMuX2tleXdvcmRDb250cm9sbGVyLmhpZGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHbyB0aHJvdWdoIGFjdGlvbnMgYW5kIGNoZWNrIHNob3coKSBjYWxsYmFjayBhbmQgdXBkYXRlIHZpc2libGUgYWN0aW9uc1xuICAgKi9cbiAgcHVibGljIHVwZGF0ZUFjdGlvbnNWaXNpYmlsaXR5KCk6IHZvaWQge1xuICAgIHRoaXMuX2FjdGlvbnNDb250cm9sbGVyLnVwZGF0ZUFjdGlvbnNWaXNpYmlsaXR5KCk7XG4gIH1cblxuICAvKipcbiAgICogR28gdGhyb3VnaCBhY3Rpb25zIGFuZCBjaGVjayBkaXNhYmxlZCgpIGNhbGxiYWNrIGFuZCB1cGRhdGUgZGlzYWJsZWQgc3RhdGVcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVEaXNhYmxlZFN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuX2FjdGlvbnNDb250cm9sbGVyLnVwZGF0ZURpc2FibGVkU3RhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVdpbmRvd1dpZHRoKCkge1xuICAgIHRoaXMud2luZG93RGVza3RvcCA9IHdpbmRvdy5pbm5lcldpZHRoID4gMTIwMDtcbiAgfVxuXG4gIHByaXZhdGUgX2xpc3RlbldpbmRvd1Jlc2l6ZSgpIHtcbiAgICB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoMTAwKSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVdpbmRvd1dpZHRoKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdEl0ZW1zKCkge1xuICAgIHRoaXMuX2ZpbHRlckNvbnRyb2xsZXIuaW5pdCh0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0QXV0b1JlbG9hZCgpIHtcbiAgICBpZih0aGlzLmNvbmZpZy5hdXRvUmVsb2FkKSB7XG4gICAgICBpbnRlcnZhbCh0aGlzLmNvbmZpZy5hdXRvUmVsb2FkLnNlY29uZHMgKiAxMDAwKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5jb25maWcuYXV0b1JlbG9hZC5lbmFibGVkKSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVsb2FkKG51bGwpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgICBjbGFzcz1cImZpbHRlci1jb250YWluZXJcIlxuICAgIFtuZ0NsYXNzXT1cInsgJ2hhcy1wcmltYXJ5LWZpbHRlcic6IHByaW1hcnlGaWx0ZXJWaXNpYmxlJCB8IGFzeW5jIH1cIlxuICAgIFtuZ0NsYXNzXT1cInsgJ2tleXdvcmQtZnVsbC13aWR0aCc6IGtleXdvcmRGdWxsV2lkdGgkIHwgYXN5bmMgfVwiPlxuICBAaWYgKHByaW1hcnlGaWx0ZXJWaXNpYmxlJCB8IGFzeW5jKSB7XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRpbmdUbXBsXCI+PC9uZy1jb250YWluZXI+XG4gIH1cbiAgPGRpdiBjbGFzcz1cImZpbHRlci1iYXItY29udGFpbmVyXCI+XG4gICAgQGlmIChwcmltYXJ5RmlsdGVyVmlzaWJsZSQgfCBhc3luYykge1xuICAgICAgPGRpdiBjbGFzcz1cImZpbHRlci1pbnB1dC1jb250YWluZXJcIj5cbiAgICAgICAgQGlmIChrZXl3b3JkVmlzaWJsZSQgfCBhc3luYykge1xuICAgICAgICAgIDxmcy1rZXl3b3JkLWlucHV0IFthdXRvZm9jdXNdPVwiY29uZmlnLmF1dG9mb2N1c1wiPjwvZnMta2V5d29yZC1pbnB1dD5cbiAgICAgICAgfVxuICAgICAgICBAZm9yIChpdGVtIG9mIHByaW1hcnlJdGVtczsgdHJhY2sgaXRlbS5uYW1lKSB7XG4gICAgICAgICAgQGlmIChpdGVtLnZpc2libGUkIHwgYXN5bmMpIHtcbiAgICAgICAgICAgIDxmaWx0ZXItaXRlbSBbaXRlbV09XCJpdGVtXCI+PC9maWx0ZXItaXRlbT5cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2UgaWYgKGhhc0hlYWRpbmcpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItaGVhZGluZy1jb250YWluZXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRpbmdUbXBsXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjaGlwc1RtcGxcIj48L25nLWNvbnRhaW5lcj5cbiAgICB9XG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWx0ZXJBY3Rpb25zVG1wbFwiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbiAgQGlmICgocHJpbWFyeUZpbHRlclZpc2libGUkIHwgYXN5bmMpID09PSB0cnVlIHx8IGhhc0hlYWRpbmcpIHtcbiAgICA8bmctY29udGFpbmVyXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjaGlwc1RtcGxcIlxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgdG9wTWFyZ2luOiB0cnVlIH1cIj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgfVxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic3RhdHVzQmFyVG1wbFwiPjwvbmctY29udGFpbmVyPlxuPC9kaXY+XG48bmctdGVtcGxhdGVcbiAgICAjY2hpcHNUbXBsXG4gICAgbGV0LXRvcE1hcmdpbj1cInRvcE1hcmdpblwiPlxuICA8ZnMtZmlsdGVyLWNoaXBzXG4gICAgY2xhc3M9XCJmaWx0ZXItY2hpcHNcIlxuICAgIFtuZ0NsYXNzXT1cInsgJ3RvcC1tYXJnaW4nOiB0b3BNYXJnaW4gfVwiPlxuICA8L2ZzLWZpbHRlci1jaGlwcz5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI3N0YXR1c0JhclRtcGw+XG4gIEBpZiAoc3RhdHVzQmFyKSB7XG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cImZpbHRlci1zdGF0dXMtY29udGFpbmVyXCJcbiAgICAgICAgW25nQ2xhc3NdPVwieyAnaGFzLXN0YXR1cyc6ICEhZmlsdGVyU3RhdHVzLnRleHRDb250ZW50IH1cIj5cbiAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImZpbHRlci1zdGF0dXNcIlxuICAgICAgICAgICNmaWx0ZXJTdGF0dXM+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzdGF0dXNCYXIudGVtcGxhdGVSZWZcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNmaWx0ZXJBY3Rpb25zVG1wbD5cbiAgQGlmICgoYWN0aW9uc1Zpc2libGUkIHwgYXN5bmMpKSB7XG4gICAgPGRpdiBjbGFzcz1cImZpbHRlci1hY3Rpb25zXCI+XG4gICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpbHRlclRvb2xiYXJUbXBsXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8ZnMtZmlsdGVyLWFjdGlvbnNcbiAgICAgICAgW2FjdGlvbnNdPVwiYWN0aW9ucyQgfCBhc3luY1wiXG4gICAgICAgIFtrZWJhYkFjdGlvbnNdPVwibWVudUFjdGlvbnMkIHwgYXN5bmNcIj5cbiAgICAgIDwvZnMtZmlsdGVyLWFjdGlvbnM+XG4gICAgPC9kaXY+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2ZpbHRlclRvb2xiYXJUbXBsPlxuICBAaWYgKGNvbmZpZy5yZWxvYWQgfHwgY29uZmlnLmF1dG9SZWxvYWQgfHwgKGZpbHRlcnNWaXNpYmxlJCB8IGFzeW5jKSkge1xuICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItdG9vbGJhclwiPlxuICAgICAgQGlmIChjb25maWcucmVsb2FkKSB7XG4gICAgICAgIDxhXG4gICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgIChjbGljayk9XCJyZWxvYWQoJGV2ZW50KVwiXG4gICAgICAgICAgICBjbGFzcz1cImJ1dHRvbi1yZWxvYWRcIj5cbiAgICAgICAgICA8bWF0LWljb24gI3JlbG9hZEVsPlxuICAgICAgICAgICAgcmVmcmVzaFxuICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgIDwvYT5cbiAgICAgIH1cbiAgICAgIEBpZiAoY29uZmlnLmF1dG9SZWxvYWQpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlci1yZWxvYWRcIj5cbiAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZVxuICAgICAgICAgICAgICBuYW1lPVwiYXV0b1JlbG9hZFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYXV0by1yZWxvYWRcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjb25maWcuYXV0b1JlbG9hZC5lbmFibGVkXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY29uZmlnLmF1dG9SZWxvYWQuZW5hYmxlZCA9ICRldmVudFwiPlxuICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgIEF1dG8gcmVmcmVzaFxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2hlYWRpbmdUbXBsPlxuICBAaWYgKGhlYWRpbmdUZW1wbGF0ZSkge1xuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkaW5nVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgfSBAZWxzZSBpZiAoY29uZmlnLmhlYWRpbmcpIHtcbiAgICA8ZGl2IGNsYXNzPVwiaGVhZGluZ1wiPlxuICAgICAgPGgyPlxuICAgICAgICB7eyBjb25maWcuaGVhZGluZyB9fVxuICAgICAgPC9oMj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdWJoZWFkaW5nXCI+XG4gICAgICAgIHt7IGNvbmZpZy5zdWJoZWFkaW5nIH19XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgfVxuPC9uZy10ZW1wbGF0ZT4iXX0=
|
|
422
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9maWx0ZXIvZmlsdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9maWx0ZXIvZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkUsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUdOLE1BQU0sRUFDTixXQUFXLEVBQ1gsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVoRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWhELE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtD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O2dCQUlwQyxjQUFjO3NCQURwQixXQUFXO3VCQUFDLG9CQUFvQjtnQkFJMUIsYUFBYTtzQkFEbkIsV0FBVzt1QkFBQyxzQkFBc0I7Z0JBSTVCLGFBQWE7c0JBRG5CLFdBQVc7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0NsYXNzLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBNYXRJY29uQW5jaG9yIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEljb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdFNsaWRlVG9nZ2xlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGUtdG9nZ2xlJztcblxuaW1wb3J0IHsgRnNDbGVhck1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2NsZWFyJztcbmltcG9ydCB7IEZzRm9ybU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2Zvcm0nO1xuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIGZyb21FdmVudCwgaW50ZXJ2YWwsIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZpbHRlciwgbWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEFjdGlvbnNDb250cm9sbGVyIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9hY3Rpb25zLWNvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmlsdGVySGVhZGluZ0RpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMnO1xuaW1wb3J0IHsgSVNvcnRpbmdDaGFuZ2VFdmVudCwgS2V5VmFsdWUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEZzRmlsdGVyQWN0aW9uIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9hY3Rpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIEZpbHRlckNvbmZpZyxcbiAgSUZpbHRlckNvbmZpZ0l0ZW0sXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJVXBkYXRlRmlsdGVySXRlbUNvbmZpZyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvdXBkYXRlLWZpbHRlci1pdGVtLmludGVyZmFjZSc7XG5pbXBvcnQgeyBGc0ZpbHRlckNvbmZpZyB9IGZyb20gJy4uLy4uL21vZGVscy9maWx0ZXItY29uZmlnJztcbmltcG9ydCB7IEJhc2VJdGVtIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2l0ZW1zL2Jhc2UtaXRlbSc7XG5pbXBvcnQgeyBTb3J0Q29udHJvbGxlciB9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IEZpbHRlckNvbnRyb2xsZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9maWx0ZXItY29udHJvbGxlci5zZXJ2aWNlJztcbmltcG9ydCB7IEZvY3VzQ29udHJvbGxlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mb2N1cy1jb250cm9sbGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgS2V5d29yZENvbnRyb2xsZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9rZXl3b3JkLWNvbnRyb2xsZXIuc2VydmljZSc7XG5pbXBvcnQgeyBQZXJzaXN0YW5jZUNvbnRyb2xsZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wZXJzaXN0YW5jZS1jb250cm9sbGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgUXVlcnlQYXJhbUNvbnRyb2xsZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9xdWVyeS1wYXJhbS1jb250cm9sbGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2F2ZWRGaWx0ZXJDb250cm9sbGVyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2F2ZWQtZmlsdGVyLWNvbnRyb2xsZXIuc2VydmljZSc7XG5pbXBvcnQgeyBGc0ZpbHRlckFjdGlvbnNDb21wb25lbnQgfSBmcm9tICcuLi9hY3Rpb25zL2FjdGlvbnMuY29tcG9uZW50JztcbmltcG9ydCB7IEZzRmlsdGVyQ2hpcHNDb21wb25lbnQgfSBmcm9tICcuLi9maWx0ZXItY2hpcHMvZmlsdGVyLWNoaXBzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGaWx0ZXJJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vZmlsdGVycy1pdGVtJztcbmltcG9ydCB7IEtleXdvcmRJbnB1dENvbXBvbmVudCB9IGZyb20gJy4uL2tleXdvcmQtaW5wdXQva2V5d29yZC1pbnB1dC5jb21wb25lbnQnO1xuXG5pbXBvcnQgeyBGaWx0ZXJTdGF0dXNCYXJEaXJlY3RpdmUgfSBmcm9tICcuLy4uLy4uL2RpcmVjdGl2ZXMvc3RhdHVzLWJhci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRlNfRklMVEVSX0NPTkZJRyB9IGZyb20gJy4vLi4vLi4vaW5qZWN0b3JzL2ZpbHRlci1jb25maWcnO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ZzLWZpbHRlcicsXG4gIHN0eWxlVXJsczogWycuL2ZpbHRlci5jb21wb25lbnQuc2NzcyddLFxuICB0ZW1wbGF0ZVVybDogJy4vZmlsdGVyLmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAgUGVyc2lzdGFuY2VDb250cm9sbGVyLFxuICAgIFF1ZXJ5UGFyYW1Db250cm9sbGVyLFxuICAgIEZvY3VzQ29udHJvbGxlclNlcnZpY2UsXG4gICAgRmlsdGVyQ29udHJvbGxlcixcbiAgICBTYXZlZEZpbHRlckNvbnRyb2xsZXIsXG4gICAgQWN0aW9uc0NvbnRyb2xsZXIsXG4gICAgS2V5d29yZENvbnRyb2xsZXIsXG4gICAgU29ydENvbnRyb2xsZXIsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBGaWx0ZXJJdGVtQ29tcG9uZW50LFxuICAgIE5nQ2xhc3MsXG4gICAgTWF0SWNvbixcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBGc0Zvcm1Nb2R1bGUsXG4gICAgRnNDbGVhck1vZHVsZSxcbiAgICBGc0ZpbHRlckNoaXBzQ29tcG9uZW50LFxuICAgIEZzRmlsdGVyQWN0aW9uc0NvbXBvbmVudCxcbiAgICBNYXRJY29uQW5jaG9yLFxuICAgIE1hdFNsaWRlVG9nZ2xlLFxuICAgIEFzeW5jUGlwZSxcbiAgICBLZXl3b3JkSW5wdXRDb21wb25lbnQsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEZpbHRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICBAVmlld0NoaWxkKEtleXdvcmRJbnB1dENvbXBvbmVudClcbiAgcHVibGljIGtleXdvcmRJbnB1dDogS2V5d29yZElucHV0Q29tcG9uZW50O1xuICBcbiAgQElucHV0KCdjb25maWcnKSBwdWJsaWMgc2V0IHNldEZpbHRlckNvbmZpZyh2YWx1ZTogRmlsdGVyQ29uZmlnKSB7XG4gICAgdGhpcy5fZmlsdGVyQ29uZmlnID0gdmFsdWU7XG4gIH1cblxuICBAT3V0cHV0KCkgcHVibGljIGNsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgcHVibGljIG9wZW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgcHVibGljIHJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIEBDb250ZW50Q2hpbGQoRmlsdGVyU3RhdHVzQmFyRGlyZWN0aXZlKVxuICBwdWJsaWMgc3RhdHVzQmFyOiBGaWx0ZXJTdGF0dXNCYXJEaXJlY3RpdmU7XG5cbiAgQENvbnRlbnRDaGlsZChGaWx0ZXJIZWFkaW5nRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIHB1YmxpYyBoZWFkaW5nVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQFZpZXdDaGlsZCgncmVsb2FkRWwnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgcHVibGljIHJlbG9hZEVsOiBFbGVtZW50UmVmO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZmlsdGVycy1vcGVuJylcbiAgcHVibGljIHNob3dGaWx0ZXJNZW51ID0gZmFsc2U7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy53aW5kb3ctZGVza3RvcCcpXG4gIHB1YmxpYyB3aW5kb3dEZXNrdG9wID0gZmFsc2U7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5mcy1maWx0ZXInKVxuICBwdWJsaWMgZnNGaWx0ZXJDbGFzcyA9IHRydWU7XG5cbiAgcHJpdmF0ZSBfY29uZmlnOiBGc0ZpbHRlckNvbmZpZztcbiAgcHJpdmF0ZSBfZmlsdGVyQ29uZmlnOiBGaWx0ZXJDb25maWc7XG4gIHByaXZhdGUgX2ZpbHRlcnNWaXNpYmxlJCA9IG5ldyBCZWhhdmlvclN1YmplY3QodHJ1ZSk7XG4gIHByaXZhdGUgX2hhc0ZpbHRlckNoaXBzJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgX2RlZmF1bHRDb25maWcgPSBpbmplY3QoRlNfRklMVEVSX0NPTkZJRywgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSBfem9uZSA9IGluamVjdChOZ1pvbmUpO1xuICBwcml2YXRlIF9hY3Rpb25zQ29udHJvbGxlciA9IGluamVjdChBY3Rpb25zQ29udHJvbGxlcik7XG4gIHByaXZhdGUgX2ZpbHRlckNvbnRyb2xsZXIgPSBpbmplY3QoRmlsdGVyQ29udHJvbGxlcik7XG4gIHByaXZhdGUgX3NvcnRDb250cm9sbGVyID0gaW5qZWN0KFNvcnRDb250cm9sbGVyKTtcbiAgcHJpdmF0ZSBfc2F2ZWRGaWx0ZXJDb250cm9sbGVyID0gaW5qZWN0KFNhdmVkRmlsdGVyQ29udHJvbGxlcik7XG4gIHByaXZhdGUgX2tleXdvcmRDb250cm9sbGVyID0gaW5qZWN0KEtleXdvcmRDb250cm9sbGVyKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgKSB7XG4gICAgdGhpcy5fZmlsdGVyQ29udHJvbGxlci5maWx0ZXIgPSB0aGlzO1xuICAgIHRoaXMuX3VwZGF0ZVdpbmRvd1dpZHRoKCk7XG4gICAgdGhpcy5fbGlzdGVuV2luZG93UmVzaXplKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHF1ZXJ5UGFyYW1zKCk6IEtleVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyQ29udHJvbGxlci5xdWVyeVBhcmFtO1xuICB9XG5cbiAgcHVibGljIGdldCBxdWVyeSgpOiBLZXlWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlckNvbnRyb2xsZXIucXVlcnk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZhbHVlcygpOiBLZXlWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlckNvbnRyb2xsZXIudmFsdWVzO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIERvIHVwZGF0ZSB2YWx1ZSBvZiBzb21lIGZpZWxkXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZXMgLSB2YWx1ZXMgZm9yIHVwZGF0ZVxuICAgKlxuICAgKiBUbyB1cGRhdGUgdGV4dCB2YWx1ZSBqdXN0IHBhc3MgbmV3IHRleHQgdmFsdWVcbiAgICpcbiAgICogcHVibGljIHVwZGF0ZVNlbGVjdFZhbHVlKHZhbCkge1xuICAgKiAgIHRoaXMuZmlsdGVyRWwudXBkYXRlVmFsdWVzKHsga2V5d29yZDogdmFsIH0pO1xuICAgKiB9XG4gICAqXG4gICAqIFRvIHVwZGF0ZSBzZWxlY3Qgb3Igb2JzZXJ2YWJsZSBzZWxlY3QgeW91IGNvdWxkIHBhc3Mgc3VpdGFibGUgdmFsdWVcbiAgICpcbiAgICogcHVibGljIHVwZGF0ZVNlbGVjdFZhbHVlKHZhbDogbnVtYmVyKSB7XG4gICAqICAgdGhpcy5maWx0ZXJFbC51cGRhdGVWYWx1ZXMoeyBzaW1wbGVfc2VsZWN0OiB2YWwgfSwgeyBvYnNlcnZhYmxlX3NlbGVjdDogdmFsIH0pO1xuICAgKiB9XG4gICAqXG4gICAqIFRvIHVwZGF0ZSBjaGVja2JveCB2YWx1ZSBqdXN0IHBhc3MgdHJ1ZS9mYWxzZSBhcyB2YWx1ZVxuICAgKlxuICAgKiBwdWJsaWMgdXBkYXRlQ2hlY2tveCh2YWw6IGJvb2xlYW4pIHtcbiAgICogICB0aGlzLmZpbHRlckVsLnVwZGF0ZVZhbHVlcyh7IGNoZWNrYm94OiB2YWwgfSk7XG4gICAqIH1cbiAgICpcbiAgICogVG8gdXBkYXRlIHJhbmdlIHZhbHVlIGp1c3QgcGFzcyBvYmplY3Qgd2l0aCBtaW4mbWF4IG9iamVjdCBvciBqdXN0IHdpdGggb25lIG9mIHRhcmdldHNcbiAgICpcbiAgICogRXguOiB7IG1pbjogMTAsIG1heCAxNSB9LCB7IG1pbjogNSB9LCB7IG1heCA1IH1cbiAgICpcbiAgICogcHVibGljIHVwZGF0ZVJhbmdlKHZhbCkge1xuICAgKiAgIHRoaXMuZmlsdGVyRWwudXBkYXRlVmFsdWVzKHsgcmFuZ2U6IHZhbCB9KTtcbiAgICogfVxuICAgKlxuICAgKiBUbyB1cGRhdGUgYXV0b2NvbXBsZXRlIGp1c3QgcGFzcyBvYmplY3Qgd2l0aCBuYW1lL3ZhbHVlIGZpZWxkc1xuICAgKlxuICAgKiBFeC46IHsgbmFtZTogJ0pvaG4gRG9lJywgdmFsdWU6IDEgfVxuICAgKlxuICAgKiBwdWJsaWMgdXBkYXRlQXV0b2NvbXBsZXRlKHZhbCkge1xuICAgKiAgIHRoaXMuZmlsdGVyRWwudXBkYXRlVmFsdWVzKHsgYXV0b2NvbXBsZXRlX3VzZXJfaWQ6IHZhbCB9KTtcbiAgICogfVxuICAgKlxuICAgKiBUbyB1cGRhdGUgYXV0b2NvbXBsZXRlY2hpcHMganVzdCBwYXNzOlxuICAgKlxuICAgKiAxKSBvYmplY3Qgd2l0aCBuYW1lL3ZhbHVlIGZpZWxkcyAtIHdpbGwgYmUgYXBwZW5kZWQgdG8gZXhpc3Rpbmcgc2V0IG9mIHZhbHVlc1xuICAgKlxuICAgKiB7IG5hbWU6ICdKb2huIERvZScsIHZhbHVlOiAxIH1cbiAgICpcbiAgICogMikgYXJyYXkgb2Ygb2JqZWN0cyAtIHdpbGwgYmUgYXBwZW5kZWQgdG8gZXhpc3Rpbmcgc2V0IG9mIHZhbHVlc1xuICAgKlxuICAgKiBbeyBuYW1lOiAnSm9obiBEb2UnLCB2YWx1ZTogMSB9LCB7IG5hbWU6ICdEYXJ5YSBGaWxpcG92YScsIHZhbHVlOiAyIH1dXG4gICAqXG4gICAqIDMpIG51bGwgLSBjbGVhciBleGlzdGluZyBzZXQgb2YgdmFsdWVzXG4gICAqXG4gICAqIHB1YmxpYyB1cGRhdGVBdXRvY29tcGxldGUodmFsKSB7XG4gICAqICAgdGhpcy5maWx0ZXJFbC51cGRhdGVWYWx1ZXMoeyBhdXRvY29tcGxldGVjaGlwc191c2VyX2lkOiB2YWwgfSk7XG4gICAqIH1cbiAgICpcbiAgICovXG4gIHB1YmxpYyBzZXQgdmFsdWVzKHZhbHVlcykge1xuICAgIHRoaXMuX2ZpbHRlckNvbnRyb2xsZXIudmFsdWVzID0gdmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGdldCBjb25maWcoKTogRnNGaWx0ZXJDb25maWcge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGl0ZW1zKCk6IEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPltdIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyQ29udHJvbGxlci5pdGVtcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcHJpbWFyeUl0ZW1zKCk6IEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPltdIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ucHJpbWFyeSk7XG4gIH1cblxuICBwdWJsaWMgY2hhbmdlKCkge1xuICAgIHRoaXMuX2ZpbHRlckNvbnRyb2xsZXIuY2hhbmdlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc0hlYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5oZWFkaW5nVGVtcGxhdGUgfHwgISF0aGlzLmNvbmZpZy5oZWFkaW5nO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNGaWx0ZXJDaGlwcyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2hhc0ZpbHRlckNoaXBzJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmlsdGVyc1Zpc2libGUkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KHtcbiAgICAgIGZpbHRlcnNWaXNpYmxlOiB0aGlzLl9maWx0ZXJzVmlzaWJsZSQuYXNPYnNlcnZhYmxlKCksXG4gICAgICBoYXNWaXNpYmxlSXRlbXM6IG9mKFxuICAgICAgICB0aGlzLml0ZW1zXG4gICAgICAgICAgLnNvbWUoKGl0ZW0pID0+IGl0ZW0udmlzaWJsZSAmJiAhaXRlbS5pc1R5cGVLZXl3b3JkKSxcbiAgICAgICksXG4gICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHsgZmlsdGVyc1Zpc2libGUsIGhhc1Zpc2libGVJdGVtcyB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGZpbHRlcnNWaXNpYmxlICYmIGhhc1Zpc2libGVJdGVtcztcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIGdldCBrZXl3b3JkVmlzaWJsZSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2tleXdvcmRDb250cm9sbGVyLmtleXdvcmRWaXNpYmxlJDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQga2V5d29yZEZ1bGxXaWR0aCQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2tleXdvcmRDb250cm9sbGVyLmtleXdvcmRGdWxsV2lkdGgkO1xuICB9XG5cbiAgcHVibGljIGdldCBwcmltYXJ5RmlsdGVyVmlzaWJsZSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3Qoe1xuICAgICAga2V5d29yZFZpc2libGU6IHRoaXMua2V5d29yZFZpc2libGUkLFxuICAgICAgc2F2ZWRGaWx0ZXJWaXNpYmxlOiBvZih0aGlzLml0ZW1zLnNvbWUoKGl0ZW0pID0+IGl0ZW0udmlzaWJsZSAmJiBpdGVtLnByaW1hcnkpKSxcbiAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoeyBrZXl3b3JkVmlzaWJsZSwgc2F2ZWRGaWx0ZXJWaXNpYmxlIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4ga2V5d29yZFZpc2libGUgfHwgc2F2ZWRGaWx0ZXJWaXNpYmxlO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGlvbnNWaXNpYmxlJCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aW9uc0NvbnRyb2xsZXIudmlzaWJsZSQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGlvbnMkKCkge1xuICAgIHJldHVybiB0aGlzLl9hY3Rpb25zQ29udHJvbGxlci5hY3Rpb25zJDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWVudUFjdGlvbnMkKCkge1xuICAgIHJldHVybiB0aGlzLl9hY3Rpb25zQ29udHJvbGxlci5tZW51QWN0aW9ucyQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNhdmVkRmlsdGVyQ29udHJvbGxlcigpOiBTYXZlZEZpbHRlckNvbnRyb2xsZXIge1xuICAgIHJldHVybiB0aGlzLl9zYXZlZEZpbHRlckNvbnRyb2xsZXI7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNvcnRDb250cm9sbGVyKCk6IFNvcnRDb250cm9sbGVyIHtcbiAgICByZXR1cm4gdGhpcy5fc29ydENvbnRyb2xsZXI7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgLi4uKHRoaXMuX2RlZmF1bHRDb25maWcgfHwge30pLFxuICAgICAgLi4udGhpcy5fZmlsdGVyQ29uZmlnLFxuICAgIH07XG5cbiAgICB0aGlzLl9jb25maWcgPSBuZXcgRnNGaWx0ZXJDb25maWcoY29uZmlnKTtcbiAgICB0aGlzLl9hY3Rpb25zQ29udHJvbGxlci5zZXRDb25maWcodGhpcy5jb25maWcpO1xuXG4gICAgdGhpcy5faW5pdEl0ZW1zKCk7XG4gICAgdGhpcy5faW5pdEF1dG9SZWxvYWQoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KG51bGwpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgZm9jdXMoKSB7XG4gICAgdGhpcy5rZXl3b3JkSW5wdXQ/LmZvY3VzKCk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlU29ydChzb3J0OiBJU29ydGluZ0NoYW5nZUV2ZW50LCBlbWl0Q2hhbmdlOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIHRoaXMuX3NvcnRDb250cm9sbGVyLnVwZGF0ZVNvcnQoc29ydCwgZW1pdENoYW5nZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGl0ZW1WYWx1ZXMoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLml0ZW1zXG4gICAgICAubWFwKChpdGVtKSA9PiBpdGVtLnZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbm9uRW1wdHlJdGVtVmFsdWVzKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtc1xuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbS52YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS52YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc0l0ZW1WYWx1ZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXNcbiAgICAgIC5zb21lKChpdGVtKSA9PiBpdGVtLnZhbHVlICE9PSB1bmRlZmluZWQpO1xuICB9XG5cbiAgcHVibGljIGdldEl0ZW1WYWx1ZShuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtc1xuICAgICAgLmZpbmQoKF9pdGVtKSA9PiBfaXRlbS5uYW1lID09PSBuYW1lKTtcblxuICAgIHJldHVybiBpdGVtPy52YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93SXRlbShuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLmdldEl0ZW0obmFtZSk/LnNob3coKTtcbiAgfVxuXG4gIHB1YmxpYyBoaWRlSXRlbShuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLmdldEl0ZW0obmFtZSk/LmhpZGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckl0ZW0obmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbShuYW1lKTtcblxuICAgIGlmICghaXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGl0ZW0uY2xlYXIoKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVJdGVtQ29uZmlnKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXJhbXM6IElVcGRhdGVGaWx0ZXJJdGVtQ29uZmlnLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKG5hbWUpO1xuXG4gICAgaWYgKCFpdGVtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaXRlbS5sYWJlbCA9IHBhcmFtcy5sYWJlbCA/PyBpdGVtLmxhYmVsO1xuICAgIGl0ZW0uY2hpcExhYmVsID0gcGFyYW1zLmNoaXBMYWJlbCA/PyBpdGVtLmNoaXBMYWJlbDtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcihldmVudCA9IG51bGwpIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIHRoaXMuX2ZpbHRlckNvbnRyb2xsZXIuZmlsdGVyc0NsZWFyKCk7XG5cbiAgICBpZiAodGhpcy5jb25maWcuY2xlYXIpIHtcbiAgICAgIHRoaXMuY29uZmlnLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgdGhpcy5rZXl3b3JkSW5wdXQ/LmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgcmVsb2FkKGV2ZW50ID0gbnVsbCkge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIGNvbnN0IGVsID0gdGhpcy5yZWxvYWRFbD8ubmF0aXZlRWxlbWVudDtcblxuICAgIGlmKGVsKSB7XG4gICAgICBlbC5zdHlsZS50cmFuc2l0aW9uID0gJ2FsbCAwLjc1cyAwLjBzJztcbiAgICAgIGVsLnN0eWxlLnRyYW5zZm9ybSA9ICdyb3RhdGUoMzYwZGVnKSc7XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBlbC5zdHlsZS50cmFuc2l0aW9uID0gbnVsbDtcbiAgICAgICAgZWwuc3R5bGUudHJhbnNmb3JtID0gbnVsbDtcbiAgICAgIH0sIDEwMDApO1xuICAgIH1cblxuICAgIHRoaXMuY2hhbmdlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SXRlbShuYW1lKTogQmFzZUl0ZW08YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXNcbiAgICAgIC5maW5kKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09IG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBpdGVtKG5hbWUpLnZhbHVlJCBpbnN0ZWFkXG4gICAqL1xuICBwdWJsaWMgZ2V0SXRlbVZhbHVlQ2hhbmdlJChuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJdGVtKG5hbWUpLnZhbHVlJDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgZmlsdGVyIGFjdGlvbnMgY29uZmlnXG4gICAqXG4gICAqIEBwYXJhbSBhY3Rpb25zXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQWN0aW9ucyhhY3Rpb25zOiBGc0ZpbHRlckFjdGlvbltdKTogdm9pZCB7XG4gICAgdGhpcy5fYWN0aW9uc0NvbnRyb2xsZXIuaW5pdEFjdGlvbnMoYWN0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyBcIkZpbHRlcnNcIiBidXR0b25cbiAgICovXG4gIHB1YmxpYyBzaG93RmlsdGVycygpOiB2b2lkIHtcbiAgICB0aGlzLl9maWx0ZXJzVmlzaWJsZSQubmV4dCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlIFwiRmlsdGVyc1wiIGJ1dHRvblxuICAgKi9cbiAgcHVibGljIGhpZGVGaWx0ZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuX2ZpbHRlcnNWaXNpYmxlJC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IFwiS2V5d29yZFwiIGZpZWxkIGlmIGl0IHByZXNlbnRcbiAgICovXG4gIHB1YmxpYyBzaG93S2V5d29yZEZpZWxkKCk6IHZvaWQge1xuICAgIHRoaXMuX2tleXdvcmRDb250cm9sbGVyLnNob3coKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlIFwiS2V5d29yZFwiIGZpZWxkIGlmIGl0IHByZXNlbnRcbiAgICovXG4gIHB1YmxpYyBoaWRlS2V5d29yZEZpZWxkKCk6IHZvaWQge1xuICAgIHRoaXMuX2tleXdvcmRDb250cm9sbGVyLmhpZGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHbyB0aHJvdWdoIGFjdGlvbnMgYW5kIGNoZWNrIHNob3coKSBjYWxsYmFjayBhbmQgdXBkYXRlIHZpc2libGUgYWN0aW9uc1xuICAgKi9cbiAgcHVibGljIHVwZGF0ZUFjdGlvbnNWaXNpYmlsaXR5KCk6IHZvaWQge1xuICAgIHRoaXMuX2FjdGlvbnNDb250cm9sbGVyLnVwZGF0ZUFjdGlvbnNWaXNpYmlsaXR5KCk7XG4gIH1cblxuICAvKipcbiAgICogR28gdGhyb3VnaCBhY3Rpb25zIGFuZCBjaGVjayBkaXNhYmxlZCgpIGNhbGxiYWNrIGFuZCB1cGRhdGUgZGlzYWJsZWQgc3RhdGVcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVEaXNhYmxlZFN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuX2FjdGlvbnNDb250cm9sbGVyLnVwZGF0ZURpc2FibGVkU3RhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVdpbmRvd1dpZHRoKCkge1xuICAgIHRoaXMud2luZG93RGVza3RvcCA9IHdpbmRvdy5pbm5lcldpZHRoID4gMTIwMDtcbiAgfVxuXG4gIHByaXZhdGUgX2xpc3RlbldpbmRvd1Jlc2l6ZSgpIHtcbiAgICB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoMTAwKSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVdpbmRvd1dpZHRoKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdEl0ZW1zKCkge1xuICAgIHRoaXMuX2ZpbHRlckNvbnRyb2xsZXIuaW5pdCh0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0QXV0b1JlbG9hZCgpIHtcbiAgICBpZih0aGlzLmNvbmZpZy5hdXRvUmVsb2FkKSB7XG4gICAgICBpbnRlcnZhbCh0aGlzLmNvbmZpZy5hdXRvUmVsb2FkLnNlY29uZHMgKiAxMDAwKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5jb25maWcuYXV0b1JlbG9hZC5lbmFibGVkKSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVsb2FkKG51bGwpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgICBjbGFzcz1cImZpbHRlci1jb250YWluZXJcIlxuICAgIFtuZ0NsYXNzXT1cInsgJ2hhcy1wcmltYXJ5LWZpbHRlcic6IHByaW1hcnlGaWx0ZXJWaXNpYmxlJCB8IGFzeW5jIH1cIlxuICAgIFtuZ0NsYXNzXT1cInsgJ2tleXdvcmQtZnVsbC13aWR0aCc6IGtleXdvcmRGdWxsV2lkdGgkIHwgYXN5bmMgfVwiPlxuICBAaWYgKHByaW1hcnlGaWx0ZXJWaXNpYmxlJCB8IGFzeW5jKSB7XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRpbmdUbXBsXCI+PC9uZy1jb250YWluZXI+XG4gIH1cbiAgPGRpdiBjbGFzcz1cImZpbHRlci1iYXItY29udGFpbmVyXCI+XG4gICAgQGlmIChwcmltYXJ5RmlsdGVyVmlzaWJsZSQgfCBhc3luYykge1xuICAgICAgPGRpdiBjbGFzcz1cImZpbHRlci1pbnB1dC1jb250YWluZXJcIj5cbiAgICAgICAgQGlmIChrZXl3b3JkVmlzaWJsZSQgfCBhc3luYykge1xuICAgICAgICAgIDxmcy1rZXl3b3JkLWlucHV0IFthdXRvZm9jdXNdPVwiY29uZmlnLmF1dG9mb2N1c1wiPjwvZnMta2V5d29yZC1pbnB1dD5cbiAgICAgICAgfVxuICAgICAgICBAZm9yIChpdGVtIG9mIHByaW1hcnlJdGVtczsgdHJhY2sgaXRlbS5uYW1lKSB7XG4gICAgICAgICAgQGlmIChpdGVtLnZpc2libGUkIHwgYXN5bmMpIHtcbiAgICAgICAgICAgIDxmaWx0ZXItaXRlbSBbaXRlbV09XCJpdGVtXCI+PC9maWx0ZXItaXRlbT5cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2UgaWYgKGhhc0hlYWRpbmcpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItaGVhZGluZy1jb250YWluZXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRpbmdUbXBsXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjaGlwc1RtcGxcIj48L25nLWNvbnRhaW5lcj5cbiAgICB9XG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWx0ZXJBY3Rpb25zVG1wbFwiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbiAgQGlmICgocHJpbWFyeUZpbHRlclZpc2libGUkIHwgYXN5bmMpID09PSB0cnVlIHx8IGhhc0hlYWRpbmcpIHtcbiAgICA8bmctY29udGFpbmVyXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjaGlwc1RtcGxcIlxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgdG9wTWFyZ2luOiB0cnVlIH1cIj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgfVxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic3RhdHVzQmFyVG1wbFwiPjwvbmctY29udGFpbmVyPlxuPC9kaXY+XG48bmctdGVtcGxhdGVcbiAgICAjY2hpcHNUbXBsXG4gICAgbGV0LXRvcE1hcmdpbj1cInRvcE1hcmdpblwiPlxuICA8ZnMtZmlsdGVyLWNoaXBzXG4gICAgY2xhc3M9XCJmaWx0ZXItY2hpcHNcIlxuICAgIFtuZ0NsYXNzXT1cInsgJ3RvcC1tYXJnaW4nOiB0b3BNYXJnaW4gfVwiPlxuICA8L2ZzLWZpbHRlci1jaGlwcz5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI3N0YXR1c0JhclRtcGw+XG4gIEBpZiAoc3RhdHVzQmFyKSB7XG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cImZpbHRlci1zdGF0dXMtY29udGFpbmVyXCJcbiAgICAgICAgW25nQ2xhc3NdPVwieyAnaGFzLXN0YXR1cyc6ICEhZmlsdGVyU3RhdHVzLnRleHRDb250ZW50IH1cIj5cbiAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImZpbHRlci1zdGF0dXNcIlxuICAgICAgICAgICNmaWx0ZXJTdGF0dXM+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzdGF0dXNCYXIudGVtcGxhdGVSZWZcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNmaWx0ZXJBY3Rpb25zVG1wbD5cbiAgQGlmICgoYWN0aW9uc1Zpc2libGUkIHwgYXN5bmMpKSB7XG4gICAgPGRpdiBjbGFzcz1cImZpbHRlci1hY3Rpb25zXCI+XG4gICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpbHRlclRvb2xiYXJUbXBsXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8ZnMtZmlsdGVyLWFjdGlvbnNcbiAgICAgICAgW2FjdGlvbnNdPVwiYWN0aW9ucyQgfCBhc3luY1wiXG4gICAgICAgIFtrZWJhYkFjdGlvbnNdPVwibWVudUFjdGlvbnMkIHwgYXN5bmNcIj5cbiAgICAgIDwvZnMtZmlsdGVyLWFjdGlvbnM+XG4gICAgPC9kaXY+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2ZpbHRlclRvb2xiYXJUbXBsPlxuICBAaWYgKGNvbmZpZy5yZWxvYWQgfHwgY29uZmlnLmF1dG9SZWxvYWQgfHwgKGZpbHRlcnNWaXNpYmxlJCB8IGFzeW5jKSkge1xuICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItdG9vbGJhclwiPlxuICAgICAgQGlmIChjb25maWcucmVsb2FkKSB7XG4gICAgICAgIDxhXG4gICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgIChjbGljayk9XCJyZWxvYWQoJGV2ZW50KVwiXG4gICAgICAgICAgICBjbGFzcz1cImJ1dHRvbi1yZWxvYWRcIj5cbiAgICAgICAgICA8bWF0LWljb24gI3JlbG9hZEVsPlxuICAgICAgICAgICAgcmVmcmVzaFxuICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgIDwvYT5cbiAgICAgIH1cbiAgICAgIEBpZiAoY29uZmlnLmF1dG9SZWxvYWQpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlci1yZWxvYWRcIj5cbiAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZVxuICAgICAgICAgICAgICBuYW1lPVwiYXV0b1JlbG9hZFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYXV0by1yZWxvYWRcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjb25maWcuYXV0b1JlbG9hZC5lbmFibGVkXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY29uZmlnLmF1dG9SZWxvYWQuZW5hYmxlZCA9ICRldmVudFwiPlxuICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgIEF1dG8gcmVmcmVzaFxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2hlYWRpbmdUbXBsPlxuICBAaWYgKGhlYWRpbmdUZW1wbGF0ZSkge1xuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkaW5nVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgfSBAZWxzZSBpZiAoY29uZmlnLmhlYWRpbmcpIHtcbiAgICA8ZGl2IGNsYXNzPVwiaGVhZGluZ1wiPlxuICAgICAgPGgyPlxuICAgICAgICB7eyBjb25maWcuaGVhZGluZyB9fVxuICAgICAgPC9oMj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdWJoZWFkaW5nXCI+XG4gICAgICAgIHt7IGNvbmZpZy5zdWJoZWFkaW5nIH19XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgfVxuPC9uZy10ZW1wbGF0ZT4iXX0=
|