@bcgov/nr-ngx-component-lib 0.0.32 → 0.0.34

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.
@@ -1,9 +1,10 @@
1
1
  import { Overlay, OverlayRef } from "@angular/cdk/overlay";
2
- import { ChangeDetectorRef, ElementRef, EventEmitter, OnChanges, OnDestroy, OnInit, SimpleChanges, TemplateRef, ViewContainerRef } from "@angular/core";
2
+ import { AfterViewInit, ChangeDetectorRef, ElementRef, EventEmitter, OnChanges, OnDestroy, OnInit, SimpleChanges, TemplateRef, ViewContainerRef } from "@angular/core";
3
3
  import { FormControl } from "@angular/forms";
4
4
  import { MatSelectionListChange } from "@angular/material/list";
5
5
  import { NrclBase } from "../../directives/nrcl.base";
6
6
  import { CodeDescription } from "../../utils/code-table.util";
7
+ import { DomSanitizer } from "@angular/platform-browser";
7
8
  import * as i0 from "@angular/core";
8
9
  /**
9
10
  * A filter select component that allows users to select multiple options from a list.
@@ -14,7 +15,16 @@ import * as i0 from "@angular/core";
14
15
  * - Tooltips for long descriptions
15
16
  * - Summary display of selected items
16
17
  */
17
- export declare class FilterSelectComponent extends NrclBase implements OnInit, OnChanges, OnDestroy {
18
+ export declare class FilterSelectComponent extends NrclBase implements OnInit, OnChanges, OnDestroy, AfterViewInit {
19
+ changeDetectorRef: ChangeDetectorRef;
20
+ overlay: Overlay;
21
+ viewContainerRef: ViewContainerRef;
22
+ domSanitizer: DomSanitizer;
23
+ trigger: ElementRef;
24
+ filterInput: ElementRef;
25
+ overlayTemplate: TemplateRef<any>;
26
+ defaultOptionTemplateRef: TemplateRef<any>;
27
+ optionTemplateRef: TemplateRef<any>;
18
28
  label: any;
19
29
  placeholder: string;
20
30
  hint: any;
@@ -27,6 +37,7 @@ export declare class FilterSelectComponent extends NrclBase implements OnInit, O
27
37
  filter: boolean;
28
38
  filterCharsMin: number;
29
39
  optionFormatter: (option: CodeDescription, plaintext: boolean) => string;
40
+ optionTemplate: TemplateRef<any>;
30
41
  overlayClass: any;
31
42
  wide: any;
32
43
  filterCharsMinMessage: string;
@@ -41,14 +52,9 @@ export declare class FilterSelectComponent extends NrclBase implements OnInit, O
41
52
  selection: FormControl<any>;
42
53
  match: (option: CodeDescription) => boolean;
43
54
  clickSubscription: any;
44
- changeDetectorRef: ChangeDetectorRef;
45
- overlay: Overlay;
46
- viewContainerRef: ViewContainerRef;
47
- trigger: ElementRef;
48
- filterInput: ElementRef;
49
- overlayTemplate: TemplateRef<any>;
50
55
  ngOnInit(): void;
51
56
  ngOnChanges(changes: SimpleChanges): void;
57
+ ngAfterViewInit(): void;
52
58
  ngOnDestroy(): void;
53
59
  get single(): boolean;
54
60
  emitValueChange(): void;
@@ -65,11 +71,10 @@ export declare class FilterSelectComponent extends NrclBase implements OnInit, O
65
71
  onCloseClick(): void;
66
72
  descriptionForCode(code: string): string;
67
73
  optionForCode(code: string): CodeDescription;
68
- formatOption(option: CodeDescription): string;
69
74
  get isClosedNoSelection(): boolean;
70
75
  get isClosedSelection(): boolean;
71
76
  static ɵfac: i0.ɵɵFactoryDeclaration<FilterSelectComponent, never>;
72
- static ɵcmp: i0.ɵɵComponentDeclaration<FilterSelectComponent, "nrcl-filter-select", never, { "label": { "alias": "label"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "hint": { "alias": "hint"; "required": false; }; "options": { "alias": "options"; "required": false; }; "value": { "alias": "value"; "required": false; }; "selectMax": { "alias": "selectMax"; "required": false; }; "tooltips": { "alias": "tooltips"; "required": false; }; "summary": { "alias": "summary"; "required": false; }; "clear": { "alias": "clear"; "required": false; }; "filter": { "alias": "filter"; "required": false; }; "filterCharsMin": { "alias": "filterCharsMin"; "required": false; }; "optionFormatter": { "alias": "optionFormatter"; "required": false; }; "overlayClass": { "alias": "overlayClass"; "required": false; }; "wide": { "alias": "wide"; "required": false; }; "filterCharsMinMessage": { "alias": "filterCharsMinMessage"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, false, never>;
77
+ static ɵcmp: i0.ɵɵComponentDeclaration<FilterSelectComponent, "nrcl-filter-select", never, { "label": { "alias": "label"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "hint": { "alias": "hint"; "required": false; }; "options": { "alias": "options"; "required": false; }; "value": { "alias": "value"; "required": false; }; "selectMax": { "alias": "selectMax"; "required": false; }; "tooltips": { "alias": "tooltips"; "required": false; }; "summary": { "alias": "summary"; "required": false; }; "clear": { "alias": "clear"; "required": false; }; "filter": { "alias": "filter"; "required": false; }; "filterCharsMin": { "alias": "filterCharsMin"; "required": false; }; "optionFormatter": { "alias": "optionFormatter"; "required": false; }; "optionTemplate": { "alias": "optionTemplate"; "required": false; }; "overlayClass": { "alias": "overlayClass"; "required": false; }; "wide": { "alias": "wide"; "required": false; }; "filterCharsMinMessage": { "alias": "filterCharsMinMessage"; "required": false; }; }, { "valueChange": "valueChange"; }, ["optionTemplateRef"], never, false, never>;
73
78
  static ngAcceptInputType_selectMax: unknown;
74
79
  static ngAcceptInputType_tooltips: unknown;
75
80
  static ngAcceptInputType_summary: unknown;
@@ -1,3 +1,4 @@
1
+ import { OnChanges, SimpleChanges } from "@angular/core";
1
2
  import { Observable } from "rxjs";
2
3
  import { LoadRowListResult, RowListBase, RowListState } from "../../directives/row-list.base";
3
4
  import * as i0 from "@angular/core";
@@ -24,7 +25,7 @@ export interface AttachmentRowListProvider<R, L = any> {
24
25
  downloadItem(item: R): any;
25
26
  deleteItem(item: R): any;
26
27
  }
27
- export declare class ListAttachmentsComponent extends RowListBase<{}, AttachmentsTableRow> {
28
+ export declare class ListAttachmentsComponent extends RowListBase<{}, AttachmentsTableRow> implements OnChanges {
28
29
  rowListProvider: AttachmentRowListProvider<AttachmentsTableRow>;
29
30
  canDelete: boolean;
30
31
  canDownload: boolean;
@@ -43,10 +44,13 @@ export declare class ListAttachmentsComponent extends RowListBase<{}, Attachment
43
44
  API_TIMESTAMP: string;
44
45
  API_TIMESTAMP_WITH_SEP: string;
45
46
  };
46
- columns: string[];
47
- initializeRowList(): void;
47
+ columns: any[];
48
+ sortColumns: {
49
+ code: string;
50
+ description: string;
51
+ }[];
52
+ ngOnChanges(changes: SimpleChanges): void;
48
53
  get initialPageState(): RowListState<{}>;
49
- ngAfterViewInit(): void;
50
54
  fetchRowListPage(): Observable<any>;
51
55
  displayRowListPage(res: any): LoadRowListResult<AttachmentsTableRow>;
52
56
  onDownloadClick(item: AttachmentsTableRow): any;
@@ -1,17 +1,27 @@
1
- import { EventEmitter } from "@angular/core";
1
+ import { AfterContentInit, EventEmitter, OnChanges, QueryList, SimpleChanges } from "@angular/core";
2
2
  import { Observable } from "rxjs";
3
3
  import { LoadRowListResult, RowListBase, RowListState } from "../../directives/row-list.base";
4
4
  import { CodeDescription } from "../../utils/code-table.util";
5
+ import { MatColumnDef, MatTable } from "@angular/material/table";
5
6
  import * as i0 from "@angular/core";
6
- export declare class ListSelectComponent extends RowListBase<{}, CodeDescription> {
7
+ export declare class ListSelectComponent<T> extends RowListBase<{}, CodeDescription> implements OnChanges, AfterContentInit {
7
8
  options: CodeDescription[];
8
9
  value: string[];
9
10
  descriptionLabel: string;
10
11
  single: any;
11
12
  noRowsMessage: string;
13
+ displayColumnsProvider: (cols: string[]) => string[];
14
+ filterProvider: (option: CodeDescription) => boolean;
12
15
  valueChange: EventEmitter<string[]>;
16
+ filterClear: EventEmitter<void>;
17
+ table: MatTable<T>;
18
+ columnDefs: QueryList<MatColumnDef>;
13
19
  searchText: any;
14
20
  searchRegexp: RegExp;
21
+ defaultDisplayColumns: string[];
22
+ displayColumns: any[];
23
+ ngOnChanges(changes: SimpleChanges): void;
24
+ ngAfterContentInit(): void;
15
25
  get initialPageState(): RowListState<{}>;
16
26
  fetchRowListPage(): Observable<CodeDescription[]>;
17
27
  displayRowListPage(res: CodeDescription[]): LoadRowListResult<CodeDescription>;
@@ -19,7 +29,8 @@ export declare class ListSelectComponent extends RowListBase<{}, CodeDescription
19
29
  onRowClick(item: CodeDescription): void;
20
30
  onClearFilters(): void;
21
31
  onSearchTextChange(ev: any): void;
22
- static ɵfac: i0.ɵɵFactoryDeclaration<ListSelectComponent, never>;
23
- static ɵcmp: i0.ɵɵComponentDeclaration<ListSelectComponent, "nrcl-list-select", never, { "options": { "alias": "options"; "required": false; }; "value": { "alias": "value"; "required": false; }; "descriptionLabel": { "alias": "descriptionLabel"; "required": false; }; "single": { "alias": "single"; "required": false; }; "noRowsMessage": { "alias": "noRowsMessage"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, false, never>;
32
+ filterOption(option: CodeDescription): boolean;
33
+ static ɵfac: i0.ɵɵFactoryDeclaration<ListSelectComponent<any>, never>;
34
+ static ɵcmp: i0.ɵɵComponentDeclaration<ListSelectComponent<any>, "nrcl-list-select", never, { "options": { "alias": "options"; "required": false; }; "value": { "alias": "value"; "required": false; }; "descriptionLabel": { "alias": "descriptionLabel"; "required": false; }; "single": { "alias": "single"; "required": false; }; "noRowsMessage": { "alias": "noRowsMessage"; "required": false; }; "displayColumnsProvider": { "alias": "displayColumnsProvider"; "required": false; }; "filterProvider": { "alias": "filterProvider"; "required": false; }; }, { "valueChange": "valueChange"; "filterClear": "filterClear"; }, ["columnDefs"], ["[filter]", "*"], false, never>;
24
35
  static ngAcceptInputType_single: unknown;
25
36
  }
@@ -1,6 +1,7 @@
1
1
  import { NrclBase } from "../../directives/nrcl.base";
2
2
  import * as i0 from "@angular/core";
3
3
  export declare class RowListDesktopComponent extends NrclBase {
4
+ showRowHover: boolean;
4
5
  static ɵfac: i0.ɵɵFactoryDeclaration<RowListDesktopComponent, never>;
5
- static ɵcmp: i0.ɵɵComponentDeclaration<RowListDesktopComponent, "nrcl-row-list-desktop", never, {}, {}, never, ["*"], false, never>;
6
+ static ɵcmp: i0.ɵɵComponentDeclaration<RowListDesktopComponent, "nrcl-row-list-desktop", never, { "showRowHover": { "alias": "showRowHover"; "required": false; }; }, {}, never, ["*"], false, never>;
6
7
  }
@@ -5,6 +5,7 @@ export type TagItem = {
5
5
  id: string;
6
6
  description: string;
7
7
  tooltip: string;
8
+ icon: string;
8
9
  };
9
10
  export declare class TagListComponent extends NrclBase {
10
11
  items: TagItem[];
@@ -1,16 +1,18 @@
1
1
  import { Overlay } from "@angular/cdk/overlay";
2
2
  import { TemplatePortal } from "@angular/cdk/portal";
3
- import { booleanAttribute, ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, inject, Input, numberAttribute, Output, ViewChild, ViewContainerRef } from "@angular/core";
3
+ import { booleanAttribute, ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ElementRef, EventEmitter, inject, Input, numberAttribute, Output, TemplateRef, ViewChild, ViewContainerRef } from "@angular/core";
4
4
  import { FormControl } from "@angular/forms";
5
5
  import { fromEvent } from "rxjs";
6
6
  import { NrclBase } from "../../directives/nrcl.base";
7
+ import { DomSanitizer } from "@angular/platform-browser";
7
8
  import * as i0 from "@angular/core";
8
- import * as i1 from "@angular/forms";
9
- import * as i2 from "@angular/material/form-field";
10
- import * as i3 from "@angular/material/input";
11
- import * as i4 from "@angular/material/list";
12
- import * as i5 from "@angular/material/tooltip";
13
- import * as i6 from "../button/button.component";
9
+ import * as i1 from "@angular/common";
10
+ import * as i2 from "@angular/forms";
11
+ import * as i3 from "@angular/material/form-field";
12
+ import * as i4 from "@angular/material/input";
13
+ import * as i5 from "@angular/material/list";
14
+ import * as i6 from "@angular/material/tooltip";
15
+ import * as i7 from "../button/button.component";
14
16
  /**
15
17
  * A filter select component that allows users to select multiple options from a list.
16
18
  *
@@ -23,6 +25,10 @@ import * as i6 from "../button/button.component";
23
25
  export class FilterSelectComponent extends NrclBase {
24
26
  constructor() {
25
27
  super(...arguments);
28
+ this.changeDetectorRef = inject(ChangeDetectorRef);
29
+ this.overlay = inject(Overlay);
30
+ this.viewContainerRef = inject(ViewContainerRef);
31
+ this.domSanitizer = inject(DomSanitizer);
26
32
  this.placeholder = 'Filter...';
27
33
  this.selectMax = 0;
28
34
  this.tooltips = true;
@@ -39,9 +45,6 @@ export class FilterSelectComponent extends NrclBase {
39
45
  this.hasValue = false;
40
46
  this.selection = new FormControl();
41
47
  this.match = (o) => true;
42
- this.changeDetectorRef = inject(ChangeDetectorRef);
43
- this.overlay = inject(Overlay);
44
- this.viewContainerRef = inject(ViewContainerRef);
45
48
  }
46
49
  ngOnInit() {
47
50
  super.ngOnInit();
@@ -104,6 +107,16 @@ export class FilterSelectComponent extends NrclBase {
104
107
  }
105
108
  }
106
109
  }
110
+ ngAfterViewInit() {
111
+ if (!this.optionTemplate) {
112
+ if (this.optionTemplateRef) {
113
+ this.optionTemplate = this.optionTemplateRef;
114
+ }
115
+ else {
116
+ this.optionTemplate = this.defaultOptionTemplateRef;
117
+ }
118
+ }
119
+ }
107
120
  ngOnDestroy() {
108
121
  // console.log('destroy',this.inst)
109
122
  this.clickSubscription?.unsubscribe();
@@ -257,9 +270,6 @@ export class FilterSelectComponent extends NrclBase {
257
270
  optionForCode(code) {
258
271
  return this.options.find(o => o.code == code);
259
272
  }
260
- formatOption(option) {
261
- return this.optionFormatter(option, false);
262
- }
263
273
  get isClosedNoSelection() {
264
274
  return !this.isOpen && !(this.selection?.value?.length > 0 && this.clear);
265
275
  }
@@ -267,7 +277,7 @@ export class FilterSelectComponent extends NrclBase {
267
277
  return !this.isOpen && this.selection?.value?.length > 0 && this.clear;
268
278
  }
269
279
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FilterSelectComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
270
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FilterSelectComponent, selector: "nrcl-filter-select", inputs: { label: "label", placeholder: "placeholder", hint: "hint", options: "options", value: "value", selectMax: ["selectMax", "selectMax", numberAttribute], tooltips: ["tooltips", "tooltips", booleanAttribute], summary: ["summary", "summary", booleanAttribute], clear: ["clear", "clear", booleanAttribute], filter: ["filter", "filter", booleanAttribute], filterCharsMin: ["filterCharsMin", "filterCharsMin", numberAttribute], optionFormatter: "optionFormatter", overlayClass: "overlayClass", wide: "wide", filterCharsMinMessage: "filterCharsMinMessage" }, outputs: { valueChange: "valueChange" }, host: { properties: { "class.has-value": "hasValue", "class.is-open": "isOpen", "class.is-closed": "!isOpen", "class.use-filter": "filter", "style.--nrcl-filter-select-width": "this.wide ? \"var( --nrcl-filter-width-\" + this.wide + \" )\" : null" } }, viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true, read: ElementRef }, { propertyName: "filterInput", first: true, predicate: ["filterInput"], descendants: true }, { propertyName: "overlayTemplate", first: true, predicate: ["overlayTemplate"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<mat-form-field #trigger\n [floatLabel]=\"floatLabel\"\n appearance=\"outline\"\n subscriptSizing=\"dynamic\"\n>\n @if ( label ) {\n <mat-label>{{ label }}</mat-label>\n }\n\n <input class=\"filter-input\" #filterInput\n matInput \n [placeholder]=\"placeholder\" \n [value]=\"inputValue\"\n (input)=\"onInput( $event )\"\n (keydown.escape)=\"close()\"\n (focus)=\"onInputFocus()\"\n [matTooltip]=\"inputValue\"\n [readonly]=\"!filter\"\n >\n</mat-form-field> \n\n<nrcl-button tertiary matSuffix [class.hide]=\"!isOpen\"\n icon=\"arrow_drop_up\"\n (click)=\"onCloseClick()\"\n></nrcl-button>\n\n<nrcl-button tertiary matSuffix [class.hide]=\"!isClosedSelection\"\n icon=\"close\"\n (click)=\"onCancelClick()\"\n></nrcl-button>\n\n<nrcl-button tertiary matSuffix [class.hide]=\"!isClosedNoSelection\"\n icon=\"arrow_drop_down\"\n (click)=\"onInputFocus()\"\n></nrcl-button>\n\n<ng-template #overlayTemplate>\n <div class=\"nrcl filter-select-options\" [class.multiple]=\"!single\" [class.single]=\"single\" [class]=\"overlayClass\">\n @if ( !isFiltered && ( !single || filterCharsMin ) && summary ) {\n @if ( !selection?.value?.length && ( hint || filterCharsMin ) ) {\n <div class=\"selection-overview\">\n @if ( hint ) {\n <div class=\"summary\">\n <span>{{ hint }}</span>\n </div>\n } \n\n @if ( filterCharsMin && filterCharsMinMessage ) {\n <div class=\"summary\">\n <span>{{ filterCharsMinMessage }}</span>\n </div>\n }\n </div>\n }\n\n @if ( selection?.value?.length > 0 && selection?.value?.length < options?.length ) {\n <div class=\"selection-overview\">\n @if ( !single ) {\n <div class=\"summary\">\n <span>Selected {{ selection?.value?.length }} of {{ options?.length }} options</span>\n </div>\n }\n\n <mat-selection-list\n (selectionChange)=\"onUpperSelectionChange( $event )\"\n >\n @for ( code of selection?.value; track code ) {\n <mat-list-option \n [value]=\"code\" \n togglePosition=\"before\"\n selected\n [matTooltip]=\"tooltips ? descriptionForCode( code ) : null\"\n matTooltipPosition=\"after\"\n >\n <span [innerHTML]=\"formatOption( optionForCode( code ) )\"></span>\n </mat-list-option>\n }\n </mat-selection-list>\n\n @if ( hint ) {\n <div class=\"summary\">\n <span>{{ hint }}</span>\n </div>\n } \n\n @if ( filterCharsMin && filterCharsMinMessage ) {\n <div class=\"summary\">\n <span>{{ filterCharsMinMessage }}</span>\n </div>\n }\n </div>\n }\n\n @if ( selection?.value?.length == options?.length ) {\n <div class=\"selection-overview\">\n <div class=\"summary\">All options selected</div>\n </div>\n }\n }\n\n @if ( !filterCharsMin || isFiltered ) {\n <mat-selection-list\n [formControl]=\"selection\"\n (selectionChange)=\"onSelectionChange( $event )\"\n [multiple]=\"!single\"\n hideSingleSelectionIndicator\n >\n @for ( option of options; track option ) {\n <mat-list-option [class.hide]=\"!matchesFilter( option )\"\n [value]=\"option.code\" \n togglePosition=\"before\" \n [matTooltip]=\"tooltips ? option.description : null\"\n matTooltipPosition=\"after\" \n >\n <span [innerHTML]=\"formatOption( option )\"></span>\n </mat-list-option>\n }\n </mat-selection-list>\n }\n </div>\n</ng-template>\n", styles: ["::ng-deep :root{--nrcl-filter-select-width: var( --nrcl-filter-width-2 );--nrcl-filter-select-height: var( --nrcl-filter-height )}:host{--mat-form-field-container-height: calc( var( --nrcl-filter-select-height ) - 4px );--mat-form-field-container-vertical-padding: 8px;--mat-form-field-container-text-size: 15px;--mdc-outlined-text-field-focus-label-text-color: black;--mdc-outlined-text-field-hover-label-text-color: black;width:var(--nrcl-filter-select-width);display:block;position:relative}:host .nrcl-button{position:absolute;right:2px;top:2px;bottom:2px}:host .hide{display:none}:host.has-value{--mdc-outlined-text-field-label-text-color: black}:host ::ng-deep .mat-mdc-form-field{width:100%}:host ::ng-deep .mat-mdc-form-field .mat-mdc-text-field-wrapper{background-color:#fff;height:var(--nrcl-filter-select-height);cursor:pointer}:host ::ng-deep .mat-mdc-form-field .mat-mdc-text-field-wrapper .mat-mdc-form-field-infix{width:var(--nrcl-filter-select-width)}:host ::ng-deep .mat-mdc-form-field .mat-mdc-text-field-wrapper .mat-mdc-form-field-infix .filter-input{cursor:pointer}:host ::ng-deep .mat-mdc-form-field .mat-mdc-text-field-wrapper .mat-mdc-form-field-icon-suffix{margin:0}:host.is-open.use-filter ::ng-deep .mat-mdc-form-field .mat-mdc-text-field-wrapper .mat-mdc-form-field-infix .filter-input{cursor:text}::ng-deep .filter-select-options{--mdc-list-list-item-selected-container-color: #007bff;font-family:var(--nrcl-font-family);overflow-x:hidden;overflow-y:auto;padding:0;background:#fff;color:#000;border:1px solid #aaa;border-radius:4px;font-size:var(--nrcl-font-size);pointer-events:all;box-shadow:0 4px 5px #00000026;display:block;width:100%}::ng-deep .filter-select-options .selection-overview{background-color:#eee;border-bottom:1px solid black}::ng-deep .filter-select-options .selection-overview .summary{padding:4px 8px 4px 16px;font-size:14px;color:#000000bc;font-family:var(--nrcl-font-family)}::ng-deep .filter-select-options .mat-mdc-selection-list{padding-top:0;padding-bottom:0}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option{height:30px;font-size:var(--nrcl-font-size);padding-left:16px;padding-right:8px}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option.hide{display:none}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option .mdc-list-item__start{margin:0;padding:0 8px 0 0}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option .mdc-list-item__start .mdc-checkbox{padding:0}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option .mdc-list-item__start .mdc-checkbox .mdc-checkbox__background{top:0;left:0}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option .mdc-list-item__primary-text{flex-grow:1;font-size:var(--nrcl-font-size)}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option.mdc-list-item--selected .mdc-list-item__primary-text{color:#fff}\n"], dependencies: [{ kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i4.MatSelectionList, selector: "mat-selection-list", inputs: ["color", "compareWith", "multiple", "hideSingleSelectionIndicator", "disabled"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: i4.MatListOption, selector: "mat-list-option", inputs: ["togglePosition", "checkboxPosition", "color", "value", "selected"], outputs: ["selectedChange"], exportAs: ["matListOption"] }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i6.ButtonComponent, selector: "nrcl-button", inputs: ["label", "icon", "iconRight", "iconCompact", "tooltip", "compact", "small", "primary", "secondary", "tertiary", "disabled", "anchor"], outputs: ["click"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
280
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FilterSelectComponent, selector: "nrcl-filter-select", inputs: { label: "label", placeholder: "placeholder", hint: "hint", options: "options", value: "value", selectMax: ["selectMax", "selectMax", numberAttribute], tooltips: ["tooltips", "tooltips", booleanAttribute], summary: ["summary", "summary", booleanAttribute], clear: ["clear", "clear", booleanAttribute], filter: ["filter", "filter", booleanAttribute], filterCharsMin: ["filterCharsMin", "filterCharsMin", numberAttribute], optionFormatter: "optionFormatter", optionTemplate: "optionTemplate", overlayClass: "overlayClass", wide: "wide", filterCharsMinMessage: "filterCharsMinMessage" }, outputs: { valueChange: "valueChange" }, host: { properties: { "class.has-value": "hasValue", "class.is-open": "isOpen", "class.is-closed": "!isOpen", "class.use-filter": "filter", "style.--nrcl-filter-select-width": "this.wide ? \"var( --nrcl-filter-width-\" + this.wide + \" )\" : null" } }, queries: [{ propertyName: "optionTemplateRef", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true, read: ElementRef }, { propertyName: "filterInput", first: true, predicate: ["filterInput"], descendants: true }, { propertyName: "overlayTemplate", first: true, predicate: ["overlayTemplate"], descendants: true }, { propertyName: "defaultOptionTemplateRef", first: true, predicate: ["defaultOptionTemplateRef"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<mat-form-field #trigger\n [floatLabel]=\"floatLabel\"\n appearance=\"outline\"\n subscriptSizing=\"dynamic\"\n>\n @if ( label ) {\n <mat-label>{{ label }}</mat-label>\n }\n\n <input class=\"filter-input\" #filterInput\n matInput \n [placeholder]=\"placeholder\" \n [value]=\"inputValue\"\n (input)=\"onInput( $event )\"\n (keydown.escape)=\"close()\"\n (focus)=\"onInputFocus()\"\n [matTooltip]=\"inputValue\"\n [readonly]=\"!filter\"\n >\n</mat-form-field> \n\n<nrcl-button tertiary [class.hide]=\"!isOpen\"\n icon=\"arrow_drop_up\"\n (click)=\"onCloseClick()\"\n></nrcl-button>\n\n<nrcl-button tertiary [class.hide]=\"!isClosedSelection\"\n icon=\"close\"\n (click)=\"onCancelClick()\"\n></nrcl-button>\n\n<nrcl-button tertiary [class.hide]=\"!isClosedNoSelection\"\n icon=\"arrow_drop_down\"\n (click)=\"onInputFocus()\"\n></nrcl-button>\n\n<ng-template #overlayTemplate>\n <div class=\"nrcl filter-select-options\" [class.multiple]=\"!single\" [class.single]=\"single\" [class]=\"overlayClass\">\n @if ( !isFiltered && ( !single || filterCharsMin ) && summary ) {\n @if ( !selection?.value?.length && ( hint || filterCharsMin ) ) {\n <div class=\"selection-overview\">\n @if ( hint ) {\n <div class=\"summary\">\n <span>{{ hint }}</span>\n </div>\n } \n\n @if ( filterCharsMin && filterCharsMinMessage ) {\n <div class=\"summary\">\n <span>{{ filterCharsMinMessage }}</span>\n </div>\n }\n </div>\n }\n\n @if ( selection?.value?.length > 0 && selection?.value?.length < options?.length ) {\n <div class=\"selection-overview\">\n @if ( !single ) {\n <div class=\"summary\">\n <span>Selected {{ selection?.value?.length }} of {{ options?.length }} options</span>\n </div>\n }\n\n <mat-selection-list\n (selectionChange)=\"onUpperSelectionChange( $event )\"\n >\n @for ( code of selection?.value; track code ) {\n <mat-list-option \n [value]=\"code\" \n togglePosition=\"before\"\n selected\n [matTooltip]=\"tooltips ? descriptionForCode( code ) : null\"\n matTooltipPosition=\"after\"\n >\n <ng-container \n [ngTemplateOutlet]=\"optionTemplate\" \n [ngTemplateOutletContext]=\"{ $implicit: optionForCode( code ) }\">\n </ng-container>\n </mat-list-option>\n }\n </mat-selection-list>\n\n @if ( hint ) {\n <div class=\"summary\">\n <span>{{ hint }}</span>\n </div>\n } \n\n @if ( filterCharsMin && filterCharsMinMessage ) {\n <div class=\"summary\">\n <span>{{ filterCharsMinMessage }}</span>\n </div>\n }\n </div>\n }\n\n @if ( selection?.value?.length == options?.length ) {\n <div class=\"selection-overview\">\n <div class=\"summary\">All options selected</div>\n </div>\n }\n }\n\n @if ( !filterCharsMin || isFiltered ) {\n <mat-selection-list\n [formControl]=\"selection\"\n (selectionChange)=\"onSelectionChange( $event )\"\n [multiple]=\"!single\"\n hideSingleSelectionIndicator\n >\n @for ( option of options; track option ) {\n <mat-list-option [class.hide]=\"!matchesFilter( option )\"\n [value]=\"option.code\" \n togglePosition=\"before\" \n [matTooltip]=\"tooltips ? option.description : null\"\n matTooltipPosition=\"after\" \n >\n <ng-container \n [ngTemplateOutlet]=\"optionTemplate\" \n [ngTemplateOutletContext]=\"{ $implicit: option }\">\n </ng-container>\n </mat-list-option>\n }\n </mat-selection-list>\n }\n </div>\n</ng-template>\n\n<ng-template #defaultOptionTemplateRef let-ctx>\n <span>{{ ctx.description }}</span>\n</ng-template>\n", styles: ["::ng-deep :root{--nrcl-filter-select-width: var( --nrcl-filter-width-2 );--nrcl-filter-select-height: var( --nrcl-filter-height )}:host{--mat-form-field-container-height: calc( var( --nrcl-filter-select-height ) - 4px );--mat-form-field-container-vertical-padding: 8px;--mat-form-field-container-text-size: 15px;--mdc-outlined-text-field-focus-label-text-color: black;--mdc-outlined-text-field-hover-label-text-color: black;width:var(--nrcl-filter-select-width);display:block;position:relative}:host .nrcl-button{position:absolute;right:2px;top:2px;bottom:2px}:host .hide{display:none}:host.has-value{--mdc-outlined-text-field-label-text-color: black}:host ::ng-deep .mat-mdc-form-field{width:100%}:host ::ng-deep .mat-mdc-form-field .mat-mdc-text-field-wrapper{background-color:#fff;height:var(--nrcl-filter-select-height);cursor:pointer}:host ::ng-deep .mat-mdc-form-field .mat-mdc-text-field-wrapper .mat-mdc-form-field-infix{width:var(--nrcl-filter-select-width)}:host ::ng-deep .mat-mdc-form-field .mat-mdc-text-field-wrapper .mat-mdc-form-field-infix .filter-input{cursor:pointer}:host ::ng-deep .mat-mdc-form-field .mat-mdc-text-field-wrapper .mat-mdc-form-field-icon-suffix{margin:0}:host.is-open.use-filter ::ng-deep .mat-mdc-form-field .mat-mdc-text-field-wrapper .mat-mdc-form-field-infix .filter-input{cursor:text}::ng-deep .filter-select-options{--mdc-list-list-item-selected-container-color: #007bff;font-family:var(--nrcl-font-family);overflow-x:hidden;overflow-y:auto;padding:0;background:#fff;color:#000;border:1px solid #aaa;border-radius:4px;font-size:var(--nrcl-font-size);pointer-events:all;box-shadow:0 4px 5px #00000026;display:block;width:100%}::ng-deep .filter-select-options .selection-overview{background-color:#eee;border-bottom:1px solid black}::ng-deep .filter-select-options .selection-overview .summary{padding:4px 8px 4px 16px;font-size:14px;color:#000000bc;font-family:var(--nrcl-font-family)}::ng-deep .filter-select-options .mat-mdc-selection-list{padding-top:0;padding-bottom:0}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option{height:30px;font-size:var(--nrcl-font-size);padding-left:16px;padding-right:8px}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option.hide{display:none}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option .mdc-list-item__start{margin:0;padding:0 8px 0 0}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option .mdc-list-item__start .mdc-checkbox{padding:0}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option .mdc-list-item__start .mdc-checkbox .mdc-checkbox__background{top:0;left:0}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option .mdc-list-item__primary-text{flex-grow:1;font-size:var(--nrcl-font-size)}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option.mdc-list-item--selected .mdc-list-item__primary-text{color:#fff}\n"], dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i5.MatSelectionList, selector: "mat-selection-list", inputs: ["color", "compareWith", "multiple", "hideSingleSelectionIndicator", "disabled"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: i5.MatListOption, selector: "mat-list-option", inputs: ["togglePosition", "checkboxPosition", "color", "value", "selected"], outputs: ["selectedChange"], exportAs: ["matListOption"] }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i7.ButtonComponent, selector: "nrcl-button", inputs: ["label", "icon", "iconRight", "iconCompact", "tooltip", "compact", "small", "primary", "secondary", "tertiary", "disabled", "anchor"], outputs: ["click"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
271
281
  }
272
282
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FilterSelectComponent, decorators: [{
273
283
  type: Component,
@@ -277,8 +287,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
277
287
  '[class.is-closed]': "!isOpen",
278
288
  '[class.use-filter]': "filter",
279
289
  '[style.--nrcl-filter-select-width]': 'this.wide ? "var( --nrcl-filter-width-" + this.wide + " )" : null'
280
- }, template: "<mat-form-field #trigger\n [floatLabel]=\"floatLabel\"\n appearance=\"outline\"\n subscriptSizing=\"dynamic\"\n>\n @if ( label ) {\n <mat-label>{{ label }}</mat-label>\n }\n\n <input class=\"filter-input\" #filterInput\n matInput \n [placeholder]=\"placeholder\" \n [value]=\"inputValue\"\n (input)=\"onInput( $event )\"\n (keydown.escape)=\"close()\"\n (focus)=\"onInputFocus()\"\n [matTooltip]=\"inputValue\"\n [readonly]=\"!filter\"\n >\n</mat-form-field> \n\n<nrcl-button tertiary matSuffix [class.hide]=\"!isOpen\"\n icon=\"arrow_drop_up\"\n (click)=\"onCloseClick()\"\n></nrcl-button>\n\n<nrcl-button tertiary matSuffix [class.hide]=\"!isClosedSelection\"\n icon=\"close\"\n (click)=\"onCancelClick()\"\n></nrcl-button>\n\n<nrcl-button tertiary matSuffix [class.hide]=\"!isClosedNoSelection\"\n icon=\"arrow_drop_down\"\n (click)=\"onInputFocus()\"\n></nrcl-button>\n\n<ng-template #overlayTemplate>\n <div class=\"nrcl filter-select-options\" [class.multiple]=\"!single\" [class.single]=\"single\" [class]=\"overlayClass\">\n @if ( !isFiltered && ( !single || filterCharsMin ) && summary ) {\n @if ( !selection?.value?.length && ( hint || filterCharsMin ) ) {\n <div class=\"selection-overview\">\n @if ( hint ) {\n <div class=\"summary\">\n <span>{{ hint }}</span>\n </div>\n } \n\n @if ( filterCharsMin && filterCharsMinMessage ) {\n <div class=\"summary\">\n <span>{{ filterCharsMinMessage }}</span>\n </div>\n }\n </div>\n }\n\n @if ( selection?.value?.length > 0 && selection?.value?.length < options?.length ) {\n <div class=\"selection-overview\">\n @if ( !single ) {\n <div class=\"summary\">\n <span>Selected {{ selection?.value?.length }} of {{ options?.length }} options</span>\n </div>\n }\n\n <mat-selection-list\n (selectionChange)=\"onUpperSelectionChange( $event )\"\n >\n @for ( code of selection?.value; track code ) {\n <mat-list-option \n [value]=\"code\" \n togglePosition=\"before\"\n selected\n [matTooltip]=\"tooltips ? descriptionForCode( code ) : null\"\n matTooltipPosition=\"after\"\n >\n <span [innerHTML]=\"formatOption( optionForCode( code ) )\"></span>\n </mat-list-option>\n }\n </mat-selection-list>\n\n @if ( hint ) {\n <div class=\"summary\">\n <span>{{ hint }}</span>\n </div>\n } \n\n @if ( filterCharsMin && filterCharsMinMessage ) {\n <div class=\"summary\">\n <span>{{ filterCharsMinMessage }}</span>\n </div>\n }\n </div>\n }\n\n @if ( selection?.value?.length == options?.length ) {\n <div class=\"selection-overview\">\n <div class=\"summary\">All options selected</div>\n </div>\n }\n }\n\n @if ( !filterCharsMin || isFiltered ) {\n <mat-selection-list\n [formControl]=\"selection\"\n (selectionChange)=\"onSelectionChange( $event )\"\n [multiple]=\"!single\"\n hideSingleSelectionIndicator\n >\n @for ( option of options; track option ) {\n <mat-list-option [class.hide]=\"!matchesFilter( option )\"\n [value]=\"option.code\" \n togglePosition=\"before\" \n [matTooltip]=\"tooltips ? option.description : null\"\n matTooltipPosition=\"after\" \n >\n <span [innerHTML]=\"formatOption( option )\"></span>\n </mat-list-option>\n }\n </mat-selection-list>\n }\n </div>\n</ng-template>\n", styles: ["::ng-deep :root{--nrcl-filter-select-width: var( --nrcl-filter-width-2 );--nrcl-filter-select-height: var( --nrcl-filter-height )}:host{--mat-form-field-container-height: calc( var( --nrcl-filter-select-height ) - 4px );--mat-form-field-container-vertical-padding: 8px;--mat-form-field-container-text-size: 15px;--mdc-outlined-text-field-focus-label-text-color: black;--mdc-outlined-text-field-hover-label-text-color: black;width:var(--nrcl-filter-select-width);display:block;position:relative}:host .nrcl-button{position:absolute;right:2px;top:2px;bottom:2px}:host .hide{display:none}:host.has-value{--mdc-outlined-text-field-label-text-color: black}:host ::ng-deep .mat-mdc-form-field{width:100%}:host ::ng-deep .mat-mdc-form-field .mat-mdc-text-field-wrapper{background-color:#fff;height:var(--nrcl-filter-select-height);cursor:pointer}:host ::ng-deep .mat-mdc-form-field .mat-mdc-text-field-wrapper .mat-mdc-form-field-infix{width:var(--nrcl-filter-select-width)}:host ::ng-deep .mat-mdc-form-field .mat-mdc-text-field-wrapper .mat-mdc-form-field-infix .filter-input{cursor:pointer}:host ::ng-deep .mat-mdc-form-field .mat-mdc-text-field-wrapper .mat-mdc-form-field-icon-suffix{margin:0}:host.is-open.use-filter ::ng-deep .mat-mdc-form-field .mat-mdc-text-field-wrapper .mat-mdc-form-field-infix .filter-input{cursor:text}::ng-deep .filter-select-options{--mdc-list-list-item-selected-container-color: #007bff;font-family:var(--nrcl-font-family);overflow-x:hidden;overflow-y:auto;padding:0;background:#fff;color:#000;border:1px solid #aaa;border-radius:4px;font-size:var(--nrcl-font-size);pointer-events:all;box-shadow:0 4px 5px #00000026;display:block;width:100%}::ng-deep .filter-select-options .selection-overview{background-color:#eee;border-bottom:1px solid black}::ng-deep .filter-select-options .selection-overview .summary{padding:4px 8px 4px 16px;font-size:14px;color:#000000bc;font-family:var(--nrcl-font-family)}::ng-deep .filter-select-options .mat-mdc-selection-list{padding-top:0;padding-bottom:0}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option{height:30px;font-size:var(--nrcl-font-size);padding-left:16px;padding-right:8px}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option.hide{display:none}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option .mdc-list-item__start{margin:0;padding:0 8px 0 0}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option .mdc-list-item__start .mdc-checkbox{padding:0}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option .mdc-list-item__start .mdc-checkbox .mdc-checkbox__background{top:0;left:0}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option .mdc-list-item__primary-text{flex-grow:1;font-size:var(--nrcl-font-size)}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option.mdc-list-item--selected .mdc-list-item__primary-text{color:#fff}\n"] }]
281
- }], propDecorators: { label: [{
290
+ }, template: "<mat-form-field #trigger\n [floatLabel]=\"floatLabel\"\n appearance=\"outline\"\n subscriptSizing=\"dynamic\"\n>\n @if ( label ) {\n <mat-label>{{ label }}</mat-label>\n }\n\n <input class=\"filter-input\" #filterInput\n matInput \n [placeholder]=\"placeholder\" \n [value]=\"inputValue\"\n (input)=\"onInput( $event )\"\n (keydown.escape)=\"close()\"\n (focus)=\"onInputFocus()\"\n [matTooltip]=\"inputValue\"\n [readonly]=\"!filter\"\n >\n</mat-form-field> \n\n<nrcl-button tertiary [class.hide]=\"!isOpen\"\n icon=\"arrow_drop_up\"\n (click)=\"onCloseClick()\"\n></nrcl-button>\n\n<nrcl-button tertiary [class.hide]=\"!isClosedSelection\"\n icon=\"close\"\n (click)=\"onCancelClick()\"\n></nrcl-button>\n\n<nrcl-button tertiary [class.hide]=\"!isClosedNoSelection\"\n icon=\"arrow_drop_down\"\n (click)=\"onInputFocus()\"\n></nrcl-button>\n\n<ng-template #overlayTemplate>\n <div class=\"nrcl filter-select-options\" [class.multiple]=\"!single\" [class.single]=\"single\" [class]=\"overlayClass\">\n @if ( !isFiltered && ( !single || filterCharsMin ) && summary ) {\n @if ( !selection?.value?.length && ( hint || filterCharsMin ) ) {\n <div class=\"selection-overview\">\n @if ( hint ) {\n <div class=\"summary\">\n <span>{{ hint }}</span>\n </div>\n } \n\n @if ( filterCharsMin && filterCharsMinMessage ) {\n <div class=\"summary\">\n <span>{{ filterCharsMinMessage }}</span>\n </div>\n }\n </div>\n }\n\n @if ( selection?.value?.length > 0 && selection?.value?.length < options?.length ) {\n <div class=\"selection-overview\">\n @if ( !single ) {\n <div class=\"summary\">\n <span>Selected {{ selection?.value?.length }} of {{ options?.length }} options</span>\n </div>\n }\n\n <mat-selection-list\n (selectionChange)=\"onUpperSelectionChange( $event )\"\n >\n @for ( code of selection?.value; track code ) {\n <mat-list-option \n [value]=\"code\" \n togglePosition=\"before\"\n selected\n [matTooltip]=\"tooltips ? descriptionForCode( code ) : null\"\n matTooltipPosition=\"after\"\n >\n <ng-container \n [ngTemplateOutlet]=\"optionTemplate\" \n [ngTemplateOutletContext]=\"{ $implicit: optionForCode( code ) }\">\n </ng-container>\n </mat-list-option>\n }\n </mat-selection-list>\n\n @if ( hint ) {\n <div class=\"summary\">\n <span>{{ hint }}</span>\n </div>\n } \n\n @if ( filterCharsMin && filterCharsMinMessage ) {\n <div class=\"summary\">\n <span>{{ filterCharsMinMessage }}</span>\n </div>\n }\n </div>\n }\n\n @if ( selection?.value?.length == options?.length ) {\n <div class=\"selection-overview\">\n <div class=\"summary\">All options selected</div>\n </div>\n }\n }\n\n @if ( !filterCharsMin || isFiltered ) {\n <mat-selection-list\n [formControl]=\"selection\"\n (selectionChange)=\"onSelectionChange( $event )\"\n [multiple]=\"!single\"\n hideSingleSelectionIndicator\n >\n @for ( option of options; track option ) {\n <mat-list-option [class.hide]=\"!matchesFilter( option )\"\n [value]=\"option.code\" \n togglePosition=\"before\" \n [matTooltip]=\"tooltips ? option.description : null\"\n matTooltipPosition=\"after\" \n >\n <ng-container \n [ngTemplateOutlet]=\"optionTemplate\" \n [ngTemplateOutletContext]=\"{ $implicit: option }\">\n </ng-container>\n </mat-list-option>\n }\n </mat-selection-list>\n }\n </div>\n</ng-template>\n\n<ng-template #defaultOptionTemplateRef let-ctx>\n <span>{{ ctx.description }}</span>\n</ng-template>\n", styles: ["::ng-deep :root{--nrcl-filter-select-width: var( --nrcl-filter-width-2 );--nrcl-filter-select-height: var( --nrcl-filter-height )}:host{--mat-form-field-container-height: calc( var( --nrcl-filter-select-height ) - 4px );--mat-form-field-container-vertical-padding: 8px;--mat-form-field-container-text-size: 15px;--mdc-outlined-text-field-focus-label-text-color: black;--mdc-outlined-text-field-hover-label-text-color: black;width:var(--nrcl-filter-select-width);display:block;position:relative}:host .nrcl-button{position:absolute;right:2px;top:2px;bottom:2px}:host .hide{display:none}:host.has-value{--mdc-outlined-text-field-label-text-color: black}:host ::ng-deep .mat-mdc-form-field{width:100%}:host ::ng-deep .mat-mdc-form-field .mat-mdc-text-field-wrapper{background-color:#fff;height:var(--nrcl-filter-select-height);cursor:pointer}:host ::ng-deep .mat-mdc-form-field .mat-mdc-text-field-wrapper .mat-mdc-form-field-infix{width:var(--nrcl-filter-select-width)}:host ::ng-deep .mat-mdc-form-field .mat-mdc-text-field-wrapper .mat-mdc-form-field-infix .filter-input{cursor:pointer}:host ::ng-deep .mat-mdc-form-field .mat-mdc-text-field-wrapper .mat-mdc-form-field-icon-suffix{margin:0}:host.is-open.use-filter ::ng-deep .mat-mdc-form-field .mat-mdc-text-field-wrapper .mat-mdc-form-field-infix .filter-input{cursor:text}::ng-deep .filter-select-options{--mdc-list-list-item-selected-container-color: #007bff;font-family:var(--nrcl-font-family);overflow-x:hidden;overflow-y:auto;padding:0;background:#fff;color:#000;border:1px solid #aaa;border-radius:4px;font-size:var(--nrcl-font-size);pointer-events:all;box-shadow:0 4px 5px #00000026;display:block;width:100%}::ng-deep .filter-select-options .selection-overview{background-color:#eee;border-bottom:1px solid black}::ng-deep .filter-select-options .selection-overview .summary{padding:4px 8px 4px 16px;font-size:14px;color:#000000bc;font-family:var(--nrcl-font-family)}::ng-deep .filter-select-options .mat-mdc-selection-list{padding-top:0;padding-bottom:0}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option{height:30px;font-size:var(--nrcl-font-size);padding-left:16px;padding-right:8px}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option.hide{display:none}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option .mdc-list-item__start{margin:0;padding:0 8px 0 0}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option .mdc-list-item__start .mdc-checkbox{padding:0}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option .mdc-list-item__start .mdc-checkbox .mdc-checkbox__background{top:0;left:0}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option .mdc-list-item__primary-text{flex-grow:1;font-size:var(--nrcl-font-size)}::ng-deep .filter-select-options .mat-mdc-selection-list .mat-mdc-list-option.mdc-list-item--selected .mdc-list-item__primary-text{color:#fff}\n"] }]
291
+ }], propDecorators: { trigger: [{
292
+ type: ViewChild,
293
+ args: ['trigger', { read: ElementRef }]
294
+ }], filterInput: [{
295
+ type: ViewChild,
296
+ args: ['filterInput']
297
+ }], overlayTemplate: [{
298
+ type: ViewChild,
299
+ args: ['overlayTemplate']
300
+ }], defaultOptionTemplateRef: [{
301
+ type: ViewChild,
302
+ args: ['defaultOptionTemplateRef']
303
+ }], optionTemplateRef: [{
304
+ type: ContentChild,
305
+ args: [TemplateRef]
306
+ }], label: [{
282
307
  type: Input
283
308
  }], placeholder: [{
284
309
  type: Input
@@ -308,6 +333,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
308
333
  args: [{ transform: numberAttribute }]
309
334
  }], optionFormatter: [{
310
335
  type: Input
336
+ }], optionTemplate: [{
337
+ type: Input
311
338
  }], overlayClass: [{
312
339
  type: Input
313
340
  }], wide: [{
@@ -316,14 +343,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
316
343
  type: Input
317
344
  }], valueChange: [{
318
345
  type: Output
319
- }], trigger: [{
320
- type: ViewChild,
321
- args: ['trigger', { read: ElementRef }]
322
- }], filterInput: [{
323
- type: ViewChild,
324
- args: ['filterInput']
325
- }], overlayTemplate: [{
326
- type: ViewChild,
327
- args: ['overlayTemplate']
328
346
  }] } });
329
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLXNlbGVjdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uci1uZ3gtY29tcG9uZW50LWxpYi9zcmMvY29tcG9uZW50cy9maWx0ZXItc2VsZWN0L2ZpbHRlci1zZWxlY3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnItbmd4LWNvbXBvbmVudC1saWIvc3JjL2NvbXBvbmVudHMvZmlsdGVyLXNlbGVjdC9maWx0ZXItc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQWMsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUNILGdCQUFnQixFQUNoQix1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsZUFBZSxFQUlmLE1BQU0sRUFHTixTQUFTLEVBQ1QsZ0JBQWdCLEVBQ25CLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7Ozs7QUFHdEQ7Ozs7Ozs7O0dBUUc7QUFjSCxNQUFNLE9BQU8scUJBQXNCLFNBQVEsUUFBUTtJQWJuRDs7UUFlYSxnQkFBVyxHQUFHLFdBQVcsQ0FBQTtRQUlPLGNBQVMsR0FBRyxDQUFDLENBQUE7UUFDWixhQUFRLEdBQUcsSUFBSSxDQUFBO1FBQ2YsWUFBTyxHQUFHLElBQUksQ0FBQTtRQUNkLFVBQUssR0FBRyxJQUFJLENBQUE7UUFDWixXQUFNLEdBQUcsSUFBSSxDQUFBO1FB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LEVBQUU7Z0JBQ0csT0FBTztzQkFBaEQsS0FBSzt1QkFBRSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDRyxLQUFLO3NCQUE5QyxLQUFLO3VCQUFFLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUNHLE1BQU07c0JBQS9DLEtBQUs7dUJBQUUsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0UsY0FBYztzQkFBdEQsS0FBSzt1QkFBRSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUU7Z0JBQzdCLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU07Z0JBaUJ1QyxPQUFPO3NCQUFwRCxTQUFTO3VCQUFFLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBQ2YsV0FBVztzQkFBdEMsU0FBUzt1QkFBRSxhQUFhO2dCQUNPLGVBQWU7c0JBQTlDLFNBQVM7dUJBQUUsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheVJlZiB9IGZyb20gXCJAYW5ndWxhci9jZGsvb3ZlcmxheVwiO1xuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL3BvcnRhbFwiO1xuaW1wb3J0IHtcbiAgICBib29sZWFuQXR0cmlidXRlLFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBpbmplY3QsXG4gICAgSW5wdXQsXG4gICAgbnVtYmVyQXR0cmlidXRlLFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgTWF0U2VsZWN0aW9uTGlzdENoYW5nZSB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9saXN0XCI7XG5pbXBvcnQgeyBmcm9tRXZlbnQgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgTnJjbEJhc2UgfSBmcm9tIFwiLi4vLi4vZGlyZWN0aXZlcy9ucmNsLmJhc2VcIjtcbmltcG9ydCB7IENvZGVEZXNjcmlwdGlvbiB9IGZyb20gXCIuLi8uLi91dGlscy9jb2RlLXRhYmxlLnV0aWxcIjtcblxuLyoqXG4gKiBBIGZpbHRlciBzZWxlY3QgY29tcG9uZW50IHRoYXQgYWxsb3dzIHVzZXJzIHRvIHNlbGVjdCBtdWx0aXBsZSBvcHRpb25zIGZyb20gYSBsaXN0LlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBNdWx0aS1zZWxlY3Qgd2l0aCBvcHRpb25hbCBtYXhpbXVtIHNlbGVjdGlvbiBsaW1pdFxuICogLSBTZWFyY2gvZmlsdGVyIGZ1bmN0aW9uYWxpdHlcbiAqIC0gVG9vbHRpcHMgZm9yIGxvbmcgZGVzY3JpcHRpb25zXG4gKiAtIFN1bW1hcnkgZGlzcGxheSBvZiBzZWxlY3RlZCBpdGVtc1xuICovXG5AQ29tcG9uZW50KCB7XG4gICAgc2VsZWN0b3I6IFwibnJjbC1maWx0ZXItc2VsZWN0XCIsXG4gICAgdGVtcGxhdGVVcmw6IFwiLi9maWx0ZXItc2VsZWN0LmNvbXBvbmVudC5odG1sXCIsXG4gICAgc3R5bGVVcmw6IFwiLi9maWx0ZXItc2VsZWN0LmNvbXBvbmVudC5zY3NzXCIsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgaG9zdDoge1xuICAgICAgICAnW2NsYXNzLmhhcy12YWx1ZV0nOiBcImhhc1ZhbHVlXCIsXG4gICAgICAgICdbY2xhc3MuaXMtb3Blbl0nOiBcImlzT3BlblwiLFxuICAgICAgICAnW2NsYXNzLmlzLWNsb3NlZF0nOiBcIiFpc09wZW5cIixcbiAgICAgICAgJ1tjbGFzcy51c2UtZmlsdGVyXSc6IFwiZmlsdGVyXCIsXG4gICAgICAgICdbc3R5bGUuLS1ucmNsLWZpbHRlci1zZWxlY3Qtd2lkdGhdJzogJ3RoaXMud2lkZSA/IFwidmFyKCAtLW5yY2wtZmlsdGVyLXdpZHRoLVwiICsgdGhpcy53aWRlICsgXCIgKVwiIDogbnVsbCdcbiAgICB9XG59IClcbmV4cG9ydCBjbGFzcyBGaWx0ZXJTZWxlY3RDb21wb25lbnQgZXh0ZW5kcyBOcmNsQmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICAgIEBJbnB1dCgpIGxhYmVsXG4gICAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnRmlsdGVyLi4uJ1xuICAgIEBJbnB1dCgpIGhpbnRcbiAgICBASW5wdXQoKSBvcHRpb25zOiBDb2RlRGVzY3JpcHRpb25bXVxuICAgIEBJbnB1dCgpIHZhbHVlOiBzdHJpbmdbXVxuICAgIEBJbnB1dCggeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9ICkgc2VsZWN0TWF4ID0gMFxuICAgIEBJbnB1dCggeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSApIHRvb2x0aXBzID0gdHJ1ZVxuICAgIEBJbnB1dCggeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSApIHN1bW1hcnkgPSB0cnVlXG4gICAgQElucHV0KCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9ICkgY2xlYXIgPSB0cnVlXG4gICAgQElucHV0KCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9ICkgZmlsdGVyID0gdHJ1ZVxuICAgIEBJbnB1dCggeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9ICkgZmlsdGVyQ2hhcnNNaW4gPSAwXG4gICAgQElucHV0KCkgb3B0aW9uRm9ybWF0dGVyOiAoIG9wdGlvbjogQ29kZURlc2NyaXB0aW9uLCBwbGFpbnRleHQ6IGJvb2xlYW4gKSA9PiBzdHJpbmcgPSAoIG8sIHAgKSA9PiBvLmRlc2NyaXB0aW9uXG4gICAgQElucHV0KCkgb3ZlcmxheUNsYXNzXG4gICAgQElucHV0KCkgd2lkZSBcbiAgICBASW5wdXQoKSBmaWx0ZXJDaGFyc01pbk1lc3NhZ2UgPSAnVG9vIG1hbnkgb3B0aW9ucydcblxuICAgIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nW10+KCk7XG5cbiAgICBmbG9hdExhYmVsID0gJ2F1dG8nXG4gICAgaW5wdXRWYWx1ZVxuICAgIG9wZW5pbmdWYWx1ZVxuICAgIGlzRmlsdGVyZWQgPSBmYWxzZVxuICAgIGlzT3BlbiA9IGZhbHNlXG4gICAgaGFzVmFsdWUgPSBmYWxzZVxuICAgIG92ZXJsYXlSZWY6IE92ZXJsYXlSZWZcbiAgICBzZWxlY3Rpb24gPSBuZXcgRm9ybUNvbnRyb2woKVxuICAgIG1hdGNoOiAoIG9wdGlvbjogQ29kZURlc2NyaXB0aW9uICkgPT4gYm9vbGVhbiA9ICggbyApID0+IHRydWVcbiAgICBjbGlja1N1YnNjcmlwdGlvblxuXG4gICAgY2hhbmdlRGV0ZWN0b3JSZWYgPSBpbmplY3QoIENoYW5nZURldGVjdG9yUmVmIClcbiAgICBvdmVybGF5ID0gaW5qZWN0KCBPdmVybGF5IClcbiAgICB2aWV3Q29udGFpbmVyUmVmID0gaW5qZWN0KCBWaWV3Q29udGFpbmVyUmVmIClcblxuICAgIEBWaWV3Q2hpbGQoICd0cmlnZ2VyJywgeyByZWFkOiBFbGVtZW50UmVmIH0gKSB0cmlnZ2VyITogRWxlbWVudFJlZlxuICAgIEBWaWV3Q2hpbGQoICdmaWx0ZXJJbnB1dCcgKSBmaWx0ZXJJbnB1dCE6IEVsZW1lbnRSZWZcbiAgICBAVmlld0NoaWxkKCAnb3ZlcmxheVRlbXBsYXRlJyApIG92ZXJsYXlUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT5cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpXG5cbiAgICAgICAgdGhpcy5jbGlja1N1YnNjcmlwdGlvbiA9IGZyb21FdmVudDxNb3VzZUV2ZW50PiggZG9jdW1lbnQsICdjbGljaycgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSggKCBldmVudDogTW91c2VFdmVudCApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjbGlja1RhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudFxuICAgICAgICAgICAgICAgIGNvbnN0IHRyaWdnZXJFbCA9IHRoaXMudHJpZ2dlci5uYXRpdmVFbGVtZW50XG4gICAgICAgICAgICAgICAgY29uc3Qgb3ZlcmxheUVsID0gdGhpcy5vdmVybGF5UmVmPy5vdmVybGF5RWxlbWVudFxuXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5sYWJlbCwndGFyZ2V0JyxjbGlja1RhcmdldClcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmxhYmVsLCd0cmlnZ2VyRWwnLHRyaWdnZXJFbD8uY29udGFpbnMoY2xpY2tUYXJnZXQpLHRyaWdnZXJFbClcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmxhYmVsLCdvdmVybGF5RWwnLG92ZXJsYXlFbD8uY29udGFpbnMoY2xpY2tUYXJnZXQpLG92ZXJsYXlFbClcblxuICAgICAgICAgICAgICAgIC8vIE9ubHkgY2xvc2UgaWYgY2xpY2sgaXMgb3V0c2lkZSBib3RoIHRyaWdnZXIgYW5kIG92ZXJsYXlcbiAgICAgICAgICAgICAgICBpZiAoIHRyaWdnZXJFbD8uY29udGFpbnMoY2xpY2tUYXJnZXQpICkgcmV0dXJuIFxuICAgICAgICAgICAgICAgIGlmICggIW92ZXJsYXlFbCApIHJldHVybiBcbiAgICAgICAgICAgICAgICBpZiAoIG92ZXJsYXlFbD8uY29udGFpbnMoY2xpY2tUYXJnZXQpICkgcmV0dXJuIFxuXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5sYWJlbCwnb3V0c2lkZSBjbGljaycpXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRJbnB1dFRvU2VsZWN0aW9uKClcbiAgICAgICAgICAgICAgICB0aGlzLmZsb2F0TGFiZWwgPSAnYXV0bydcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKVxuICAgICAgICAgICAgfSApXG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoIGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMgKTogdm9pZCB7XG4gICAgICAgIGlmICggdGhpcy5pc09wZW4gKSByZXR1cm5cblxuICAgICAgICBpZiAoIGNoYW5nZXMub3B0aW9ucyApIHtcbiAgICAgICAgICAgIGxldCBwdiA9IEpTT04uc3RyaW5naWZ5KCBjaGFuZ2VzLm9wdGlvbnMucHJldmlvdXNWYWx1ZSApXG4gICAgICAgICAgICBsZXQgY3YgPSBKU09OLnN0cmluZ2lmeSggY2hhbmdlcy5vcHRpb25zLmN1cnJlbnRWYWx1ZSApXG4gICAgICAgICAgICBpZiAoIHB2ICE9IGN2ICkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldFZhbHVlKCBudWxsIClcbiAgICAgICAgICAgICAgICB0aGlzLnNldElucHV0VG9TZWxlY3Rpb24oKVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0RmlsdGVyKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICggY2hhbmdlcy52YWx1ZSApIHtcbiAgICAgICAgICAgIGxldCBwdiA9IEpTT04uc3RyaW5naWZ5KCBjaGFuZ2VzLnZhbHVlLnByZXZpb3VzVmFsdWUgKVxuICAgICAgICAgICAgbGV0IGN2ID0gSlNPTi5zdHJpbmdpZnkoIGNoYW5nZXMudmFsdWUuY3VycmVudFZhbHVlIClcbiAgICAgICAgICAgIGlmICggcHYgIT0gY3YgKSB7XG4gICAgICAgICAgICAgICAgaWYgKCB0aGlzLnZhbHVlICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc1ZhbHVlID0gdGhpcy52YWx1ZS5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldFZhbHVlKCB0aGlzLnZhbHVlIClcbiAgICAgICAgICAgICAgICAgICAgaWYgKCB0aGlzLnNlbGVjdE1heCA+IDEgJiYgdGhpcy52YWx1ZS5sZW5ndGggPj0gdGhpcy5zZWxlY3RNYXggKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5kaXNhYmxlKClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmVuYWJsZSgpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzVmFsdWUgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRWYWx1ZSggbnVsbCApXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmVuYWJsZSgpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRGaWx0ZXIoKVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0SW5wdXRUb1NlbGVjdGlvbigpXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnZGVzdHJveScsdGhpcy5pbnN0KVxuICAgICAgICB0aGlzLmNsaWNrU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpXG4gICAgfVxuXG4gICAgZ2V0IHNpbmdsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0TWF4ID09IDFcbiAgICB9XG5cbiAgICBlbWl0VmFsdWVDaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMuaGFzVmFsdWUgPSAoIHRoaXMuc2VsZWN0aW9uLnZhbHVlIHx8IFtdICkubGVuZ3RoID4gMFxuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoIHRoaXMuc2VsZWN0aW9uLnZhbHVlIHx8IFtdIClcbiAgICB9XG5cbiAgICBvcGVuKCkge1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oJ29wZW4nLHRoaXMuaXNPcGVuKVxuICAgICAgICBpZiAoIHRoaXMuaXNPcGVuICkgcmV0dXJuXG5cbiAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKClcblxuICAgICAgICAvLyBDcmVhdGUgb3ZlcmxheVxuICAgICAgICBjb25zdCBwb3NpdGlvblN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5XG4gICAgICAgICAgICAucG9zaXRpb24oKVxuICAgICAgICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8oIHRoaXMudHJpZ2dlciApXG4gICAgICAgICAgICAud2l0aFBvc2l0aW9ucyggW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWTogJ2JvdHRvbScsXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WTogJ3RvcCcsXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFk6IDBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WTogJ2JvdHRvbScsXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFk6IDBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdIClcbiAgICAgICAgICAgIC53aXRoUHVzaCggZmFsc2UgKVxuXG4gICAgICAgIGNvbnN0IHNjcm9sbFN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMucmVwb3NpdGlvbigpXG5cbiAgICAgICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZSgge1xuICAgICAgICAgICAgcG9zaXRpb25TdHJhdGVneSxcbiAgICAgICAgICAgIHNjcm9sbFN0cmF0ZWd5LFxuICAgICAgICAgICAgaGFzQmFja2Ryb3A6IGZhbHNlLFxuICAgICAgICAgICAgbWF4V2lkdGg6IHRoaXMudHJpZ2dlci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoICogMixcbiAgICAgICAgICAgIG1pbldpZHRoOiB0aGlzLnRyaWdnZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCxcbiAgICAgICAgICAgIG1heEhlaWdodDogMzAwLFxuICAgICAgICB9IClcblxuICAgICAgICAvLyBBdHRhY2ggdGVtcGxhdGVcbiAgICAgICAgY29uc3QgcG9ydGFsID0gbmV3IFRlbXBsYXRlUG9ydGFsKCB0aGlzLm92ZXJsYXlUZW1wbGF0ZSwgdGhpcy52aWV3Q29udGFpbmVyUmVmIClcbiAgICAgICAgdGhpcy5vdmVybGF5UmVmLmF0dGFjaCggcG9ydGFsIClcblxuICAgICAgICAvLyBGb2N1cyBpbnB1dCBhZnRlciBvdmVybGF5IGlzIGF0dGFjaGVkXG4gICAgICAgIHNldFRpbWVvdXQoICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVySW5wdXQ/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcblxuICAgICAgICAgICAgLy8gcHJldmVudCBsaXN0IGZyb20gc2Nyb2xsaW5nIHdoZW4gc2VsZWN0aW9uIGNoYW5nZXMgICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZj8ub3ZlcmxheUVsZW1lbnQuY2hpbGRyZW5bMF0uc2Nyb2xsKCAwLCAxIClcbiAgICAgICAgfSwxMDAgKVxuXG4gICAgICAgIHRoaXMub3BlbmluZ1ZhbHVlID0gSlNPTi5zdHJpbmdpZnkoIHRoaXMuc2VsZWN0aW9uLnZhbHVlIClcbiAgICB9XG5cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgLy8gY29uc29sZS53YXJuKCdjbG9zZScsdGhpcy5pc09wZW4pXG4gICAgICAgIGlmICggIXRoaXMuaXNPcGVuICkgcmV0dXJuXG5cbiAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZVxuXG4gICAgICAgIGlmICggdGhpcy5vdmVybGF5UmVmICkge1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5UmVmLmRpc3Bvc2UoKVxuICAgICAgICAgICAgdGhpcy5vdmVybGF5UmVmID0gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKClcblxuICAgICAgICBsZXQgY2xvc2luZ1ZhbHVlID0gSlNPTi5zdHJpbmdpZnkoIHRoaXMuc2VsZWN0aW9uLnZhbHVlIClcbiAgICAgICAgaWYgKCB0aGlzLm9wZW5pbmdWYWx1ZSAhPSBjbG9zaW5nVmFsdWUgKVxuICAgICAgICAgICAgdGhpcy5lbWl0VmFsdWVDaGFuZ2UoKVxuICAgIH1cblxuICAgIHNldElucHV0VG9TZWxlY3Rpb24oKSB7XG4gICAgICAgIC8vIGNvbnNvbGUud2Fybignc2V0SW5wdXRUb1NlbGVjdGlvbicpXG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IHRoaXMuc2VsZWN0aW9uPy52YWx1ZT8ubWFwKCBjID0+IHRoaXMub3B0aW9uRm9ybWF0dGVyKCB0aGlzLm9wdGlvbkZvckNvZGUoIGMgKSwgdHJ1ZSApICkuam9pbiggJywgJyApIHx8IG51bGxcbiAgICAgICAgdGhpcy5pc0ZpbHRlcmVkID0gZmFsc2VcbiAgICB9XG5cbiAgICBvbklucHV0KCBldj8pIHtcbiAgICAgICAgdGhpcy5zZXRGaWx0ZXIoIGV2Py50YXJnZXQ/LnZhbHVlIClcbiAgICB9XG5cbiAgICBzZXRGaWx0ZXIoIHRleHQ/OiBzdHJpbmcgKSB7XG4gICAgICAgIGxldCB0ID0gdGV4dD8udHJpbSgpLnRvTG93ZXJDYXNlKClcblxuICAgICAgICBpZiAoIHQ/Lmxlbmd0aCA+PSB0aGlzLmZpbHRlckNoYXJzTWluICkge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2ZpbHRlcmluZycpXG4gICAgICAgICAgICB0aGlzLmlzRmlsdGVyZWQgPSB0cnVlXG4gICAgICAgICAgICB0aGlzLm1hdGNoID0gKCBvcHRpb24gKSA9PiBvcHRpb24uZGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyggdCApXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnbm90IGZpbHRlcmluZycpXG4gICAgICAgICAgICB0aGlzLmlzRmlsdGVyZWQgPSBmYWxzZVxuICAgICAgICAgICAgdGhpcy5tYXRjaCA9ICggbyApID0+IHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpXG4gICAgfVxuXG4gICAgbWF0Y2hlc0ZpbHRlciggb3B0aW9uOiBDb2RlRGVzY3JpcHRpb24gKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hdGNoKCBvcHRpb24gKVxuICAgIH1cblxuICAgIG9uU2VsZWN0aW9uQ2hhbmdlKCBldiApIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ29uU2VsZWN0aW9uQ2hhbmdlJyx0aGlzLnNpbmdsZSlcbiAgICAgICAgaWYgKCB0aGlzLnNpbmdsZSApIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKVxuICAgICAgICAgICAgdGhpcy5zZXRJbnB1dFRvU2VsZWN0aW9uKClcbiAgICAgICAgICAgIHRoaXMuZmxvYXRMYWJlbCA9ICdhdXRvJ1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJJbnB1dD8ubmF0aXZlRWxlbWVudC5mb2N1cygpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIHRoaXMuc2VsZWN0TWF4ID4gMSApIHtcbiAgICAgICAgICAgIGlmICggdGhpcy5zZWxlY3Rpb24udmFsdWUubGVuZ3RoID49IHRoaXMuc2VsZWN0TWF4ICkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmRpc2FibGUoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZW5hYmxlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpXG4gICAgfVxuXG4gICAgb25VcHBlclNlbGVjdGlvbkNoYW5nZSggZXY6IE1hdFNlbGVjdGlvbkxpc3RDaGFuZ2UgKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGNvZGVzID0gdGhpcy5zZWxlY3Rpb24udmFsdWUuZmlsdGVyKCBjID0+IGMgIT0gZXYub3B0aW9uc1sgMCBdLnZhbHVlIClcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldFZhbHVlKCBjb2RlcyApXG5cbiAgICAgICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoIGV2IClcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBvbkNhbmNlbENsaWNrKCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnb25DYW5jZWxDbGljaycpXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldFZhbHVlKCBudWxsIClcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24uZW5hYmxlKClcbiAgICAgICAgdGhpcy5zZXRJbnB1dFRvU2VsZWN0aW9uKClcbiAgICAgICAgdGhpcy5lbWl0VmFsdWVDaGFuZ2UoKVxuICAgIH1cblxuICAgIG9uSW5wdXRGb2N1cygpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ29uSW5wdXRGb2N1cycpXG4gICAgICAgIHRoaXMuZmxvYXRMYWJlbCA9ICdhbHdheXMnXG5cbiAgICAgICAgaWYgKCB0aGlzLmZpbHRlciApIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9ICcnXG4gICAgICAgICAgICB0aGlzLnNldEZpbHRlcigpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9wZW4oKVxuICAgIH1cblxuICAgIG9uQ2xvc2VDbGljaygpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ29uQ2xvc2VDbGljaycpXG4gICAgICAgIHRoaXMuY2xvc2UoKVxuICAgICAgICB0aGlzLnNldElucHV0VG9TZWxlY3Rpb24oKVxuICAgICAgICB0aGlzLmZsb2F0TGFiZWwgPSAnYXV0bydcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgICB9XG5cbiAgICBkZXNjcmlwdGlvbkZvckNvZGUoIGNvZGU6IHN0cmluZyApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmZpbmQoIG8gPT4gby5jb2RlID09IGNvZGUgKT8uZGVzY3JpcHRpb25cbiAgICB9XG5cbiAgICBvcHRpb25Gb3JDb2RlKCBjb2RlOiBzdHJpbmcgKTogQ29kZURlc2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5maW5kKCBvID0+IG8uY29kZSA9PSBjb2RlIClcbiAgICB9XG5cbiAgICBmb3JtYXRPcHRpb24oIG9wdGlvbjogQ29kZURlc2NyaXB0aW9uICk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbkZvcm1hdHRlciggb3B0aW9uLCBmYWxzZSApXG4gICAgfVxuXG4gICAgZ2V0IGlzQ2xvc2VkTm9TZWxlY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pc09wZW4gJiYgISggdGhpcy5zZWxlY3Rpb24/LnZhbHVlPy5sZW5ndGggPiAwICYmIHRoaXMuY2xlYXIgKVxuICAgIH1cblxuICAgIGdldCBpc0Nsb3NlZFNlbGVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzT3BlbiAmJiB0aGlzLnNlbGVjdGlvbj8udmFsdWU/Lmxlbmd0aCA+IDAgJiYgdGhpcy5jbGVhclxuICAgIH1cbn1cbiIsIjxtYXQtZm9ybS1maWVsZCAjdHJpZ2dlclxuICAgIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWxcIlxuICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcbiAgICBzdWJzY3JpcHRTaXppbmc9XCJkeW5hbWljXCJcbj5cbiAgICBAaWYgKCBsYWJlbCApIHtcbiAgICAgICAgPG1hdC1sYWJlbD57eyBsYWJlbCB9fTwvbWF0LWxhYmVsPlxuICAgIH1cblxuICAgIDxpbnB1dCBjbGFzcz1cImZpbHRlci1pbnB1dFwiICNmaWx0ZXJJbnB1dFxuICAgICAgICBtYXRJbnB1dCBcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCIgXG4gICAgICAgIFt2YWx1ZV09XCJpbnB1dFZhbHVlXCJcbiAgICAgICAgKGlucHV0KT1cIm9uSW5wdXQoICRldmVudCApXCJcbiAgICAgICAgKGtleWRvd24uZXNjYXBlKT1cImNsb3NlKClcIlxuICAgICAgICAoZm9jdXMpPVwib25JbnB1dEZvY3VzKClcIlxuICAgICAgICBbbWF0VG9vbHRpcF09XCJpbnB1dFZhbHVlXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cIiFmaWx0ZXJcIlxuICAgID5cbjwvbWF0LWZvcm0tZmllbGQ+ICAgICAgICBcblxuPG5yY2wtYnV0dG9uIHRlcnRpYXJ5IG1hdFN1ZmZpeCBbY2xhc3MuaGlkZV09XCIhaXNPcGVuXCJcbiAgICBpY29uPVwiYXJyb3dfZHJvcF91cFwiXG4gICAgKGNsaWNrKT1cIm9uQ2xvc2VDbGljaygpXCJcbj48L25yY2wtYnV0dG9uPlxuXG48bnJjbC1idXR0b24gdGVydGlhcnkgbWF0U3VmZml4IFtjbGFzcy5oaWRlXT1cIiFpc0Nsb3NlZFNlbGVjdGlvblwiXG4gICAgaWNvbj1cImNsb3NlXCJcbiAgICAoY2xpY2spPVwib25DYW5jZWxDbGljaygpXCJcbj48L25yY2wtYnV0dG9uPlxuXG48bnJjbC1idXR0b24gdGVydGlhcnkgbWF0U3VmZml4IFtjbGFzcy5oaWRlXT1cIiFpc0Nsb3NlZE5vU2VsZWN0aW9uXCJcbiAgICBpY29uPVwiYXJyb3dfZHJvcF9kb3duXCJcbiAgICAoY2xpY2spPVwib25JbnB1dEZvY3VzKClcIlxuPjwvbnJjbC1idXR0b24+XG5cbjxuZy10ZW1wbGF0ZSAjb3ZlcmxheVRlbXBsYXRlPlxuICAgIDxkaXYgY2xhc3M9XCJucmNsIGZpbHRlci1zZWxlY3Qtb3B0aW9uc1wiIFtjbGFzcy5tdWx0aXBsZV09XCIhc2luZ2xlXCIgW2NsYXNzLnNpbmdsZV09XCJzaW5nbGVcIiBbY2xhc3NdPVwib3ZlcmxheUNsYXNzXCI+XG4gICAgICAgIEBpZiAoICFpc0ZpbHRlcmVkICYmICggIXNpbmdsZSB8fCBmaWx0ZXJDaGFyc01pbiApICYmIHN1bW1hcnkgKSB7XG4gICAgICAgICAgICBAaWYgKCAhc2VsZWN0aW9uPy52YWx1ZT8ubGVuZ3RoICYmICggaGludCB8fCBmaWx0ZXJDaGFyc01pbiApICkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3Rpb24tb3ZlcnZpZXdcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmICggaGludCApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaGludCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICBAaWYgKCBmaWx0ZXJDaGFyc01pbiAmJiBmaWx0ZXJDaGFyc01pbk1lc3NhZ2UgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGZpbHRlckNoYXJzTWluTWVzc2FnZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEBpZiAoIHNlbGVjdGlvbj8udmFsdWU/Lmxlbmd0aCA+IDAgJiYgc2VsZWN0aW9uPy52YWx1ZT8ubGVuZ3RoIDwgb3B0aW9ucz8ubGVuZ3RoICkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3Rpb24tb3ZlcnZpZXdcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmICggIXNpbmdsZSApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+U2VsZWN0ZWQge3sgc2VsZWN0aW9uPy52YWx1ZT8ubGVuZ3RoIH19IG9mIHt7IG9wdGlvbnM/Lmxlbmd0aCB9fSBvcHRpb25zPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdGlvbi1saXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uVXBwZXJTZWxlY3Rpb25DaGFuZ2UoICRldmVudCApXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoIGNvZGUgb2Ygc2VsZWN0aW9uPy52YWx1ZTsgdHJhY2sgY29kZSApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxpc3Qtb3B0aW9uIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY29kZVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVQb3NpdGlvbj1cImJlZm9yZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInRvb2x0aXBzID8gZGVzY3JpcHRpb25Gb3JDb2RlKCBjb2RlICkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWZ0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJmb3JtYXRPcHRpb24oIG9wdGlvbkZvckNvZGUoIGNvZGUgKSApXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxpc3Qtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Rpb24tbGlzdD5cblxuICAgICAgICAgICAgICAgICAgICBAaWYgKCBoaW50ICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBoaW50IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgIEBpZiAoIGZpbHRlckNoYXJzTWluICYmIGZpbHRlckNoYXJzTWluTWVzc2FnZSApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZmlsdGVyQ2hhcnNNaW5NZXNzYWdlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQGlmICggc2VsZWN0aW9uPy52YWx1ZT8ubGVuZ3RoID09IG9wdGlvbnM/Lmxlbmd0aCApIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0aW9uLW92ZXJ2aWV3XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5XCI+QWxsIG9wdGlvbnMgc2VsZWN0ZWQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoICFmaWx0ZXJDaGFyc01pbiB8fCBpc0ZpbHRlcmVkICkge1xuICAgICAgICAgICAgPG1hdC1zZWxlY3Rpb24tbGlzdFxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJzZWxlY3Rpb25cIlxuICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoICRldmVudCApXCJcbiAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwiIXNpbmdsZVwiXG4gICAgICAgICAgICAgICAgaGlkZVNpbmdsZVNlbGVjdGlvbkluZGljYXRvclxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEBmb3IgKCBvcHRpb24gb2Ygb3B0aW9uczsgdHJhY2sgb3B0aW9uICkge1xuICAgICAgICAgICAgICAgICAgICA8bWF0LWxpc3Qtb3B0aW9uIFtjbGFzcy5oaWRlXT1cIiFtYXRjaGVzRmlsdGVyKCBvcHRpb24gKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uLmNvZGVcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZVBvc2l0aW9uPVwiYmVmb3JlXCIgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwidG9vbHRpcHMgPyBvcHRpb24uZGVzY3JpcHRpb24gOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFmdGVyXCIgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJmb3JtYXRPcHRpb24oIG9wdGlvbiApXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1saXN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Rpb24tbGlzdD5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
347
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLXNlbGVjdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uci1uZ3gtY29tcG9uZW50LWxpYi9zcmMvY29tcG9uZW50cy9maWx0ZXItc2VsZWN0L2ZpbHRlci1zZWxlY3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnItbmd4LWNvbXBvbmVudC1saWIvc3JjL2NvbXBvbmVudHMvZmlsdGVyLXNlbGVjdC9maWx0ZXItc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQWMsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUVILGdCQUFnQixFQUNoQix1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLGVBQWUsRUFJZixNQUFNLEVBRU4sV0FBVyxFQUNYLFNBQVMsRUFDVCxnQkFBZ0IsRUFDbkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXRELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7Ozs7Ozs7O0FBRXpEOzs7Ozs7OztHQVFHO0FBY0gsTUFBTSxPQUFPLHFCQUFzQixTQUFRLFFBQVE7SUFibkQ7O1FBY0ksc0JBQWlCLEdBQUcsTUFBTSxDQUFFLGlCQUFpQixDQUFFLENBQUE7UUFDL0MsWUFBTyxHQUFHLE1BQU0sQ0FBRSxPQUFPLENBQUUsQ0FBQTtRQUMz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bSBcIkBhbmd1bGFyL2Nkay9vdmVybGF5XCI7XG5pbXBvcnQgeyBUZW1wbGF0ZVBvcnRhbCB9IGZyb20gXCJAYW5ndWxhci9jZGsvcG9ydGFsXCI7XG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGluamVjdCxcbiAgICBJbnB1dCxcbiAgICBudW1iZXJBdHRyaWJ1dGUsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEZvcm1Db250cm9sIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBNYXRTZWxlY3Rpb25MaXN0Q2hhbmdlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2xpc3RcIjtcbmltcG9ydCB7IGZyb21FdmVudCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBOcmNsQmFzZSB9IGZyb20gXCIuLi8uLi9kaXJlY3RpdmVzL25yY2wuYmFzZVwiO1xuaW1wb3J0IHsgQ29kZURlc2NyaXB0aW9uIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2NvZGUtdGFibGUudXRpbFwiO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSBcIkBhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXJcIjtcblxuLyoqXG4gKiBBIGZpbHRlciBzZWxlY3QgY29tcG9uZW50IHRoYXQgYWxsb3dzIHVzZXJzIHRvIHNlbGVjdCBtdWx0aXBsZSBvcHRpb25zIGZyb20gYSBsaXN0LlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBNdWx0aS1zZWxlY3Qgd2l0aCBvcHRpb25hbCBtYXhpbXVtIHNlbGVjdGlvbiBsaW1pdFxuICogLSBTZWFyY2gvZmlsdGVyIGZ1bmN0aW9uYWxpdHlcbiAqIC0gVG9vbHRpcHMgZm9yIGxvbmcgZGVzY3JpcHRpb25zXG4gKiAtIFN1bW1hcnkgZGlzcGxheSBvZiBzZWxlY3RlZCBpdGVtc1xuICovXG5AQ29tcG9uZW50KCB7XG4gICAgc2VsZWN0b3I6IFwibnJjbC1maWx0ZXItc2VsZWN0XCIsXG4gICAgdGVtcGxhdGVVcmw6IFwiLi9maWx0ZXItc2VsZWN0LmNvbXBvbmVudC5odG1sXCIsXG4gICAgc3R5bGVVcmw6IFwiLi9maWx0ZXItc2VsZWN0LmNvbXBvbmVudC5zY3NzXCIsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgaG9zdDoge1xuICAgICAgICAnW2NsYXNzLmhhcy12YWx1ZV0nOiBcImhhc1ZhbHVlXCIsXG4gICAgICAgICdbY2xhc3MuaXMtb3Blbl0nOiBcImlzT3BlblwiLFxuICAgICAgICAnW2NsYXNzLmlzLWNsb3NlZF0nOiBcIiFpc09wZW5cIixcbiAgICAgICAgJ1tjbGFzcy51c2UtZmlsdGVyXSc6IFwiZmlsdGVyXCIsXG4gICAgICAgICdbc3R5bGUuLS1ucmNsLWZpbHRlci1zZWxlY3Qtd2lkdGhdJzogJ3RoaXMud2lkZSA/IFwidmFyKCAtLW5yY2wtZmlsdGVyLXdpZHRoLVwiICsgdGhpcy53aWRlICsgXCIgKVwiIDogbnVsbCdcbiAgICB9XG59IClcbmV4cG9ydCBjbGFzcyBGaWx0ZXJTZWxlY3RDb21wb25lbnQgZXh0ZW5kcyBOcmNsQmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xuICAgIGNoYW5nZURldGVjdG9yUmVmID0gaW5qZWN0KCBDaGFuZ2VEZXRlY3RvclJlZiApXG4gICAgb3ZlcmxheSA9IGluamVjdCggT3ZlcmxheSApXG4gICAgdmlld0NvbnRhaW5lclJlZiA9IGluamVjdCggVmlld0NvbnRhaW5lclJlZiApXG4gICAgZG9tU2FuaXRpemVyID0gaW5qZWN0KCBEb21TYW5pdGl6ZXIgKVxuXG4gICAgQFZpZXdDaGlsZCggJ3RyaWdnZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSApIHRyaWdnZXIhOiBFbGVtZW50UmVmXG4gICAgQFZpZXdDaGlsZCggJ2ZpbHRlcklucHV0JyApIGZpbHRlcklucHV0ITogRWxlbWVudFJlZlxuICAgIEBWaWV3Q2hpbGQoICdvdmVybGF5VGVtcGxhdGUnICkgb3ZlcmxheVRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PlxuICAgIEBWaWV3Q2hpbGQoICdkZWZhdWx0T3B0aW9uVGVtcGxhdGVSZWYnICkgZGVmYXVsdE9wdGlvblRlbXBsYXRlUmVmITogVGVtcGxhdGVSZWY8YW55PlxuXG4gICAgQENvbnRlbnRDaGlsZCggVGVtcGxhdGVSZWYgKSBvcHRpb25UZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBJbnB1dCgpIGxhYmVsXG4gICAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnRmlsdGVyLi4uJ1xuICAgIEBJbnB1dCgpIGhpbnRcbiAgICBASW5wdXQoKSBvcHRpb25zOiBDb2RlRGVzY3JpcHRpb25bXVxuICAgIEBJbnB1dCgpIHZhbHVlOiBzdHJpbmdbXVxuICAgIEBJbnB1dCggeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9ICkgc2VsZWN0TWF4ID0gMFxuICAgIEBJbnB1dCggeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSApIHRvb2x0aXBzID0gdHJ1ZVxuICAgIEBJbnB1dCggeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSApIHN1bW1hcnkgPSB0cnVlXG4gICAgQElucHV0KCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9ICkgY2xlYXIgPSB0cnVlXG4gICAgQElucHV0KCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9ICkgZmlsdGVyID0gdHJ1ZVxuICAgIEBJbnB1dCggeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9ICkgZmlsdGVyQ2hhcnNNaW4gPSAwXG4gICAgQElucHV0KCkgb3B0aW9uRm9ybWF0dGVyOiAoIG9wdGlvbjogQ29kZURlc2NyaXB0aW9uLCBwbGFpbnRleHQ6IGJvb2xlYW4gKSA9PiBzdHJpbmcgPSAoIG8sIHAgKSA9PiBvLmRlc2NyaXB0aW9uICAgIFxuICAgIEBJbnB1dCgpIG9wdGlvblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IFxuICAgIEBJbnB1dCgpIG92ZXJsYXlDbGFzc1xuICAgIEBJbnB1dCgpIHdpZGUgXG4gICAgQElucHV0KCkgZmlsdGVyQ2hhcnNNaW5NZXNzYWdlID0gJ1RvbyBtYW55IG9wdGlvbnMnXG5cbiAgICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xuXG4gICAgZmxvYXRMYWJlbCA9ICdhdXRvJ1xuICAgIGlucHV0VmFsdWVcbiAgICBvcGVuaW5nVmFsdWVcbiAgICBpc0ZpbHRlcmVkID0gZmFsc2VcbiAgICBpc09wZW4gPSBmYWxzZVxuICAgIGhhc1ZhbHVlID0gZmFsc2VcbiAgICBvdmVybGF5UmVmOiBPdmVybGF5UmVmXG4gICAgc2VsZWN0aW9uID0gbmV3IEZvcm1Db250cm9sKClcbiAgICBtYXRjaDogKCBvcHRpb246IENvZGVEZXNjcmlwdGlvbiApID0+IGJvb2xlYW4gPSAoIG8gKSA9PiB0cnVlXG4gICAgY2xpY2tTdWJzY3JpcHRpb25cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpXG5cbiAgICAgICAgdGhpcy5jbGlja1N1YnNjcmlwdGlvbiA9IGZyb21FdmVudDxNb3VzZUV2ZW50PiggZG9jdW1lbnQsICdjbGljaycgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSggKCBldmVudDogTW91c2VFdmVudCApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjbGlja1RhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudFxuICAgICAgICAgICAgICAgIGNvbnN0IHRyaWdnZXJFbCA9IHRoaXMudHJpZ2dlci5uYXRpdmVFbGVtZW50XG4gICAgICAgICAgICAgICAgY29uc3Qgb3ZlcmxheUVsID0gdGhpcy5vdmVybGF5UmVmPy5vdmVybGF5RWxlbWVudFxuXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5sYWJlbCwndGFyZ2V0JyxjbGlja1RhcmdldClcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmxhYmVsLCd0cmlnZ2VyRWwnLHRyaWdnZXJFbD8uY29udGFpbnMoY2xpY2tUYXJnZXQpLHRyaWdnZXJFbClcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmxhYmVsLCdvdmVybGF5RWwnLG92ZXJsYXlFbD8uY29udGFpbnMoY2xpY2tUYXJnZXQpLG92ZXJsYXlFbClcblxuICAgICAgICAgICAgICAgIC8vIE9ubHkgY2xvc2UgaWYgY2xpY2sgaXMgb3V0c2lkZSBib3RoIHRyaWdnZXIgYW5kIG92ZXJsYXlcbiAgICAgICAgICAgICAgICBpZiAoIHRyaWdnZXJFbD8uY29udGFpbnMoY2xpY2tUYXJnZXQpICkgcmV0dXJuIFxuICAgICAgICAgICAgICAgIGlmICggIW92ZXJsYXlFbCApIHJldHVybiBcbiAgICAgICAgICAgICAgICBpZiAoIG92ZXJsYXlFbD8uY29udGFpbnMoY2xpY2tUYXJnZXQpICkgcmV0dXJuIFxuXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5sYWJlbCwnb3V0c2lkZSBjbGljaycpXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRJbnB1dFRvU2VsZWN0aW9uKClcbiAgICAgICAgICAgICAgICB0aGlzLmZsb2F0TGFiZWwgPSAnYXV0bydcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKVxuICAgICAgICAgICAgfSApXG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoIGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMgKTogdm9pZCB7XG4gICAgICAgIGlmICggdGhpcy5pc09wZW4gKSByZXR1cm5cblxuICAgICAgICBpZiAoIGNoYW5nZXMub3B0aW9ucyApIHtcbiAgICAgICAgICAgIGxldCBwdiA9IEpTT04uc3RyaW5naWZ5KCBjaGFuZ2VzLm9wdGlvbnMucHJldmlvdXNWYWx1ZSApXG4gICAgICAgICAgICBsZXQgY3YgPSBKU09OLnN0cmluZ2lmeSggY2hhbmdlcy5vcHRpb25zLmN1cnJlbnRWYWx1ZSApXG4gICAgICAgICAgICBpZiAoIHB2ICE9IGN2ICkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldFZhbHVlKCBudWxsIClcbiAgICAgICAgICAgICAgICB0aGlzLnNldElucHV0VG9TZWxlY3Rpb24oKVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0RmlsdGVyKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICggY2hhbmdlcy52YWx1ZSApIHtcbiAgICAgICAgICAgIGxldCBwdiA9IEpTT04uc3RyaW5naWZ5KCBjaGFuZ2VzLnZhbHVlLnByZXZpb3VzVmFsdWUgKVxuICAgICAgICAgICAgbGV0IGN2ID0gSlNPTi5zdHJpbmdpZnkoIGNoYW5nZXMudmFsdWUuY3VycmVudFZhbHVlIClcbiAgICAgICAgICAgIGlmICggcHYgIT0gY3YgKSB7XG4gICAgICAgICAgICAgICAgaWYgKCB0aGlzLnZhbHVlICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc1ZhbHVlID0gdGhpcy52YWx1ZS5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldFZhbHVlKCB0aGlzLnZhbHVlIClcbiAgICAgICAgICAgICAgICAgICAgaWYgKCB0aGlzLnNlbGVjdE1heCA+IDEgJiYgdGhpcy52YWx1ZS5sZW5ndGggPj0gdGhpcy5zZWxlY3RNYXggKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5kaXNhYmxlKClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmVuYWJsZSgpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzVmFsdWUgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRWYWx1ZSggbnVsbCApXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmVuYWJsZSgpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRGaWx0ZXIoKVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0SW5wdXRUb1NlbGVjdGlvbigpXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCAhdGhpcy5vcHRpb25UZW1wbGF0ZSApIHtcbiAgICAgICAgICAgIGlmICggdGhpcy5vcHRpb25UZW1wbGF0ZVJlZiApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvblRlbXBsYXRlID0gdGhpcy5vcHRpb25UZW1wbGF0ZVJlZlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25UZW1wbGF0ZSA9IHRoaXMuZGVmYXVsdE9wdGlvblRlbXBsYXRlUmVmXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2Rlc3Ryb3knLHRoaXMuaW5zdClcbiAgICAgICAgdGhpcy5jbGlja1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKVxuICAgIH1cblxuICAgIGdldCBzaW5nbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdE1heCA9PSAxXG4gICAgfVxuXG4gICAgZW1pdFZhbHVlQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLmhhc1ZhbHVlID0gKCB0aGlzLnNlbGVjdGlvbi52YWx1ZSB8fCBbXSApLmxlbmd0aCA+IDBcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KCB0aGlzLnNlbGVjdGlvbi52YWx1ZSB8fCBbXSApXG4gICAgfVxuXG4gICAgb3BlbigpIHtcbiAgICAgICAgLy8gY29uc29sZS53YXJuKCdvcGVuJyx0aGlzLmlzT3BlbilcbiAgICAgICAgaWYgKCB0aGlzLmlzT3BlbiApIHJldHVyblxuXG4gICAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZVxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpXG5cbiAgICAgICAgLy8gQ3JlYXRlIG92ZXJsYXlcbiAgICAgICAgY29uc3QgcG9zaXRpb25TdHJhdGVneSA9IHRoaXMub3ZlcmxheVxuICAgICAgICAgICAgLnBvc2l0aW9uKClcbiAgICAgICAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKCB0aGlzLnRyaWdnZXIgKVxuICAgICAgICAgICAgLndpdGhQb3NpdGlvbnMoIFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVk6ICd0b3AnLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRZOiAwXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRZOiAwXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSApXG4gICAgICAgICAgICAud2l0aFB1c2goIGZhbHNlIClcblxuICAgICAgICBjb25zdCBzY3JvbGxTdHJhdGVneSA9IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLnJlcG9zaXRpb24oKVxuXG4gICAgICAgIHRoaXMub3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoIHtcbiAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3ksXG4gICAgICAgICAgICBzY3JvbGxTdHJhdGVneSxcbiAgICAgICAgICAgIGhhc0JhY2tkcm9wOiBmYWxzZSxcbiAgICAgICAgICAgIG1heFdpZHRoOiB0aGlzLnRyaWdnZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCAqIDIsXG4gICAgICAgICAgICBtaW5XaWR0aDogdGhpcy50cmlnZ2VyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGgsXG4gICAgICAgICAgICBtYXhIZWlnaHQ6IDMwMCxcbiAgICAgICAgfSApXG5cbiAgICAgICAgLy8gQXR0YWNoIHRlbXBsYXRlXG4gICAgICAgIGNvbnN0IHBvcnRhbCA9IG5ldyBUZW1wbGF0ZVBvcnRhbCggdGhpcy5vdmVybGF5VGVtcGxhdGUsIHRoaXMudmlld0NvbnRhaW5lclJlZiApXG4gICAgICAgIHRoaXMub3ZlcmxheVJlZi5hdHRhY2goIHBvcnRhbCApXG5cbiAgICAgICAgLy8gRm9jdXMgaW5wdXQgYWZ0ZXIgb3ZlcmxheSBpcyBhdHRhY2hlZFxuICAgICAgICBzZXRUaW1lb3V0KCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcklucHV0Py5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG5cbiAgICAgICAgICAgIC8vIHByZXZlbnQgbGlzdCBmcm9tIHNjcm9sbGluZyB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLm92ZXJsYXlSZWY/Lm92ZXJsYXlFbGVtZW50LmNoaWxkcmVuWzBdLnNjcm9sbCggMCwgMSApXG4gICAgICAgIH0sMTAwIClcblxuICAgICAgICB0aGlzLm9wZW5pbmdWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KCB0aGlzLnNlbGVjdGlvbi52YWx1ZSApXG4gICAgfVxuXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignY2xvc2UnLHRoaXMuaXNPcGVuKVxuICAgICAgICBpZiAoICF0aGlzLmlzT3BlbiApIHJldHVyblxuXG4gICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2VcblxuICAgICAgICBpZiAoIHRoaXMub3ZlcmxheVJlZiApIHtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZi5kaXNwb3NlKClcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZiA9IG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpXG5cbiAgICAgICAgbGV0IGNsb3NpbmdWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KCB0aGlzLnNlbGVjdGlvbi52YWx1ZSApXG4gICAgICAgIGlmICggdGhpcy5vcGVuaW5nVmFsdWUgIT0gY2xvc2luZ1ZhbHVlIClcbiAgICAgICAgICAgIHRoaXMuZW1pdFZhbHVlQ2hhbmdlKClcbiAgICB9XG5cbiAgICBzZXRJbnB1dFRvU2VsZWN0aW9uKCkge1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oJ3NldElucHV0VG9TZWxlY3Rpb24nKVxuICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSB0aGlzLnNlbGVjdGlvbj8udmFsdWU/Lm1hcCggYyA9PiB0aGlzLm9wdGlvbkZvcm1hdHRlciggdGhpcy5vcHRpb25Gb3JDb2RlKCBjICksIHRydWUgKSApLmpvaW4oICcsICcgKSB8fCBudWxsXG4gICAgICAgIHRoaXMuaXNGaWx0ZXJlZCA9IGZhbHNlXG4gICAgfVxuXG4gICAgb25JbnB1dCggZXY/KSB7XG4gICAgICAgIHRoaXMuc2V0RmlsdGVyKCBldj8udGFyZ2V0Py52YWx1ZSApXG4gICAgfVxuXG4gICAgc2V0RmlsdGVyKCB0ZXh0Pzogc3RyaW5nICkge1xuICAgICAgICBsZXQgdCA9IHRleHQ/LnRyaW0oKS50b0xvd2VyQ2FzZSgpXG5cbiAgICAgICAgaWYgKCB0Py5sZW5ndGggPj0gdGhpcy5maWx0ZXJDaGFyc01pbiApIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdmaWx0ZXJpbmcnKVxuICAgICAgICAgICAgdGhpcy5pc0ZpbHRlcmVkID0gdHJ1ZVxuICAgICAgICAgICAgdGhpcy5tYXRjaCA9ICggb3B0aW9uICkgPT4gb3B0aW9uLmRlc2NyaXB0aW9uLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoIHQgKVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ25vdCBmaWx0ZXJpbmcnKVxuICAgICAgICAgICAgdGhpcy5pc0ZpbHRlcmVkID0gZmFsc2VcbiAgICAgICAgICAgIHRoaXMubWF0Y2ggPSAoIG8gKSA9PiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKVxuICAgIH1cblxuICAgIG1hdGNoZXNGaWx0ZXIoIG9wdGlvbjogQ29kZURlc2NyaXB0aW9uICkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXRjaCggb3B0aW9uIClcbiAgICB9XG5cbiAgICBvblNlbGVjdGlvbkNoYW5nZSggZXYgKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdvblNlbGVjdGlvbkNoYW5nZScsdGhpcy5zaW5nbGUpXG4gICAgICAgIGlmICggdGhpcy5zaW5nbGUgKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKClcbiAgICAgICAgICAgIHRoaXMuc2V0SW5wdXRUb1NlbGVjdGlvbigpXG4gICAgICAgICAgICB0aGlzLmZsb2F0TGFiZWwgPSAnYXV0bydcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVySW5wdXQ/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCB0aGlzLnNlbGVjdE1heCA+IDEgKSB7XG4gICAgICAgICAgICBpZiAoIHRoaXMuc2VsZWN0aW9uLnZhbHVlLmxlbmd0aCA+PSB0aGlzLnNlbGVjdE1heCApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5kaXNhYmxlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmVuYWJsZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKVxuICAgIH1cblxuICAgIG9uVXBwZXJTZWxlY3Rpb25DaGFuZ2UoIGV2OiBNYXRTZWxlY3Rpb25MaXN0Q2hhbmdlICkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGxldCBjb2RlcyA9IHRoaXMuc2VsZWN0aW9uLnZhbHVlLmZpbHRlciggYyA9PiBjICE9IGV2Lm9wdGlvbnNbIDAgXS52YWx1ZSApXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRWYWx1ZSggY29kZXMgKVxuXG4gICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCBldiApXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgb25DYW5jZWxDbGljaygpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ29uQ2FuY2VsQ2xpY2snKVxuICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRWYWx1ZSggbnVsbCApXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLmVuYWJsZSgpXG4gICAgICAgIHRoaXMuc2V0SW5wdXRUb1NlbGVjdGlvbigpXG4gICAgICAgIHRoaXMuZW1pdFZhbHVlQ2hhbmdlKClcbiAgICB9XG5cbiAgICBvbklucHV0Rm9jdXMoKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdvbklucHV0Rm9jdXMnKVxuICAgICAgICB0aGlzLmZsb2F0TGFiZWwgPSAnYWx3YXlzJ1xuXG4gICAgICAgIGlmICggdGhpcy5maWx0ZXIgKSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSAnJ1xuICAgICAgICAgICAgdGhpcy5zZXRGaWx0ZXIoKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vcGVuKClcbiAgICB9XG5cbiAgICBvbkNsb3NlQ2xpY2soKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdvbkNsb3NlQ2xpY2snKVxuICAgICAgICB0aGlzLmNsb3NlKClcbiAgICAgICAgdGhpcy5zZXRJbnB1dFRvU2VsZWN0aW9uKClcbiAgICAgICAgdGhpcy5mbG9hdExhYmVsID0gJ2F1dG8nXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpXG4gICAgfVxuXG4gICAgZGVzY3JpcHRpb25Gb3JDb2RlKCBjb2RlOiBzdHJpbmcgKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5maW5kKCBvID0+IG8uY29kZSA9PSBjb2RlICk/LmRlc2NyaXB0aW9uXG4gICAgfVxuXG4gICAgb3B0aW9uRm9yQ29kZSggY29kZTogc3RyaW5nICk6IENvZGVEZXNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmluZCggbyA9PiBvLmNvZGUgPT0gY29kZSApXG4gICAgfVxuXG4gICAgZ2V0IGlzQ2xvc2VkTm9TZWxlY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pc09wZW4gJiYgISggdGhpcy5zZWxlY3Rpb24/LnZhbHVlPy5sZW5ndGggPiAwICYmIHRoaXMuY2xlYXIgKVxuICAgIH1cblxuICAgIGdldCBpc0Nsb3NlZFNlbGVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzT3BlbiAmJiB0aGlzLnNlbGVjdGlvbj8udmFsdWU/Lmxlbmd0aCA+IDAgJiYgdGhpcy5jbGVhclxuICAgIH1cbn1cbiIsIjxtYXQtZm9ybS1maWVsZCAjdHJpZ2dlclxuICAgIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWxcIlxuICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcbiAgICBzdWJzY3JpcHRTaXppbmc9XCJkeW5hbWljXCJcbj5cbiAgICBAaWYgKCBsYWJlbCApIHtcbiAgICAgICAgPG1hdC1sYWJlbD57eyBsYWJlbCB9fTwvbWF0LWxhYmVsPlxuICAgIH1cblxuICAgIDxpbnB1dCBjbGFzcz1cImZpbHRlci1pbnB1dFwiICNmaWx0ZXJJbnB1dFxuICAgICAgICBtYXRJbnB1dCBcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCIgXG4gICAgICAgIFt2YWx1ZV09XCJpbnB1dFZhbHVlXCJcbiAgICAgICAgKGlucHV0KT1cIm9uSW5wdXQoICRldmVudCApXCJcbiAgICAgICAgKGtleWRvd24uZXNjYXBlKT1cImNsb3NlKClcIlxuICAgICAgICAoZm9jdXMpPVwib25JbnB1dEZvY3VzKClcIlxuICAgICAgICBbbWF0VG9vbHRpcF09XCJpbnB1dFZhbHVlXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cIiFmaWx0ZXJcIlxuICAgID5cbjwvbWF0LWZvcm0tZmllbGQ+ICAgICAgICBcblxuPG5yY2wtYnV0dG9uIHRlcnRpYXJ5IFtjbGFzcy5oaWRlXT1cIiFpc09wZW5cIlxuICAgIGljb249XCJhcnJvd19kcm9wX3VwXCJcbiAgICAoY2xpY2spPVwib25DbG9zZUNsaWNrKClcIlxuPjwvbnJjbC1idXR0b24+XG5cbjxucmNsLWJ1dHRvbiB0ZXJ0aWFyeSBbY2xhc3MuaGlkZV09XCIhaXNDbG9zZWRTZWxlY3Rpb25cIlxuICAgIGljb249XCJjbG9zZVwiXG4gICAgKGNsaWNrKT1cIm9uQ2FuY2VsQ2xpY2soKVwiXG4+PC9ucmNsLWJ1dHRvbj5cblxuPG5yY2wtYnV0dG9uIHRlcnRpYXJ5IFtjbGFzcy5oaWRlXT1cIiFpc0Nsb3NlZE5vU2VsZWN0aW9uXCJcbiAgICBpY29uPVwiYXJyb3dfZHJvcF9kb3duXCJcbiAgICAoY2xpY2spPVwib25JbnB1dEZvY3VzKClcIlxuPjwvbnJjbC1idXR0b24+XG5cbjxuZy10ZW1wbGF0ZSAjb3ZlcmxheVRlbXBsYXRlPlxuICAgIDxkaXYgY2xhc3M9XCJucmNsIGZpbHRlci1zZWxlY3Qtb3B0aW9uc1wiIFtjbGFzcy5tdWx0aXBsZV09XCIhc2luZ2xlXCIgW2NsYXNzLnNpbmdsZV09XCJzaW5nbGVcIiBbY2xhc3NdPVwib3ZlcmxheUNsYXNzXCI+XG4gICAgICAgIEBpZiAoICFpc0ZpbHRlcmVkICYmICggIXNpbmdsZSB8fCBmaWx0ZXJDaGFyc01pbiApICYmIHN1bW1hcnkgKSB7XG4gICAgICAgICAgICBAaWYgKCAhc2VsZWN0aW9uPy52YWx1ZT8ubGVuZ3RoICYmICggaGludCB8fCBmaWx0ZXJDaGFyc01pbiApICkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3Rpb24tb3ZlcnZpZXdcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmICggaGludCApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaGludCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICBAaWYgKCBmaWx0ZXJDaGFyc01pbiAmJiBmaWx0ZXJDaGFyc01pbk1lc3NhZ2UgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGZpbHRlckNoYXJzTWluTWVzc2FnZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEBpZiAoIHNlbGVjdGlvbj8udmFsdWU/Lmxlbmd0aCA+IDAgJiYgc2VsZWN0aW9uPy52YWx1ZT8ubGVuZ3RoIDwgb3B0aW9ucz8ubGVuZ3RoICkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3Rpb24tb3ZlcnZpZXdcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmICggIXNpbmdsZSApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+U2VsZWN0ZWQge3sgc2VsZWN0aW9uPy52YWx1ZT8ubGVuZ3RoIH19IG9mIHt7IG9wdGlvbnM/Lmxlbmd0aCB9fSBvcHRpb25zPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdGlvbi1saXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uVXBwZXJTZWxlY3Rpb25DaGFuZ2UoICRldmVudCApXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoIGNvZGUgb2Ygc2VsZWN0aW9uPy52YWx1ZTsgdHJhY2sgY29kZSApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxpc3Qtb3B0aW9uIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY29kZVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVQb3NpdGlvbj1cImJlZm9yZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInRvb2x0aXBzID8gZGVzY3JpcHRpb25Gb3JDb2RlKCBjb2RlICkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWZ0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm9wdGlvblRlbXBsYXRlXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IG9wdGlvbkZvckNvZGUoIGNvZGUgKSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxpc3Qtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Rpb24tbGlzdD5cblxuICAgICAgICAgICAgICAgICAgICBAaWYgKCBoaW50ICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBoaW50IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgIEBpZiAoIGZpbHRlckNoYXJzTWluICYmIGZpbHRlckNoYXJzTWluTWVzc2FnZSApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZmlsdGVyQ2hhcnNNaW5NZXNzYWdlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQGlmICggc2VsZWN0aW9uPy52YWx1ZT8ubGVuZ3RoID09IG9wdGlvbnM/Lmxlbmd0aCApIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0aW9uLW92ZXJ2aWV3XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5XCI+QWxsIG9wdGlvbnMgc2VsZWN0ZWQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoICFmaWx0ZXJDaGFyc01pbiB8fCBpc0ZpbHRlcmVkICkge1xuICAgICAgICAgICAgPG1hdC1zZWxlY3Rpb24tbGlzdFxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJzZWxlY3Rpb25cIlxuICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoICRldmVudCApXCJcbiAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwiIXNpbmdsZVwiXG4gICAgICAgICAgICAgICAgaGlkZVNpbmdsZVNlbGVjdGlvbkluZGljYXRvclxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEBmb3IgKCBvcHRpb24gb2Ygb3B0aW9uczsgdHJhY2sgb3B0aW9uICkge1xuICAgICAgICAgICAgICAgICAgICA8bWF0LWxpc3Qtb3B0aW9uIFtjbGFzcy5oaWRlXT1cIiFtYXRjaGVzRmlsdGVyKCBvcHRpb24gKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uLmNvZGVcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZVBvc2l0aW9uPVwiYmVmb3JlXCIgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwidG9vbHRpcHMgPyBvcHRpb24uZGVzY3JpcHRpb24gOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFmdGVyXCIgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJvcHRpb25UZW1wbGF0ZVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogb3B0aW9uIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1saXN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Rpb24tbGlzdD5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0T3B0aW9uVGVtcGxhdGVSZWYgbGV0LWN0eD5cbiAgICA8c3Bhbj57eyBjdHguZGVzY3JpcHRpb24gfX08L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuIl19