@clr/angular 15.1.0 → 15.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/accordion/accordion-panel.d.ts +5 -2
  2. package/accordion/stepper/stepper-panel.d.ts +3 -3
  3. package/button/button-group/button-group.d.ts +12 -3
  4. package/button/button-group/button.d.ts +4 -5
  5. package/button/providers/button-group-focus-handler.service.d.ts +32 -0
  6. package/button/providers/button-group-focus.enum.d.ts +4 -0
  7. package/clarity.api.md +52 -10
  8. package/data/datagrid/datagrid-action-overflow.d.ts +2 -1
  9. package/data/datagrid/datagrid-row.d.ts +4 -0
  10. package/emphasis/alert/alerts-pager.d.ts +2 -0
  11. package/esm2020/accordion/accordion-panel.mjs +17 -6
  12. package/esm2020/accordion/stepper/stepper-panel.mjs +7 -7
  13. package/esm2020/button/button-group/button-group.mjs +47 -14
  14. package/esm2020/button/button-group/button.mjs +16 -15
  15. package/esm2020/button/providers/button-group-focus-handler.service.mjs +96 -0
  16. package/esm2020/button/providers/button-group-focus.enum.mjs +11 -0
  17. package/esm2020/data/datagrid/datagrid-action-overflow.mjs +9 -6
  18. package/esm2020/data/datagrid/datagrid-row.mjs +14 -3
  19. package/esm2020/emphasis/alert/alerts-pager.mjs +17 -3
  20. package/esm2020/forms/combobox/combobox.mjs +5 -5
  21. package/esm2020/forms/combobox/providers/combobox-focus-handler.service.mjs +8 -4
  22. package/esm2020/popover/dropdown/dropdown-item.mjs +2 -1
  23. package/esm2020/utils/animations/expandable-animation/expandable-animation.mjs +5 -5
  24. package/esm2020/utils/focus/focus.service.mjs +3 -3
  25. package/esm2020/utils/i18n/common-strings.default.mjs +3 -1
  26. package/esm2020/utils/i18n/common-strings.interface.mjs +1 -1
  27. package/esm2020/utils/popover/index.mjs +2 -1
  28. package/esm2020/utils/popover/popover-host.directive.mjs +4 -4
  29. package/esm2020/utils/popover/stop-escape-propagation.directive.mjs +5 -5
  30. package/fesm2015/clr-angular.mjs +11182 -11005
  31. package/fesm2015/clr-angular.mjs.map +1 -1
  32. package/fesm2020/clr-angular.mjs +10917 -10740
  33. package/fesm2020/clr-angular.mjs.map +1 -1
  34. package/forms/combobox/providers/combobox-focus-handler.service.d.ts +1 -0
  35. package/package.json +1 -1
  36. package/utils/focus/focus.service.d.ts +1 -1
  37. package/utils/i18n/common-strings.interface.d.ts +8 -0
  38. package/utils/popover/index.d.ts +1 -0
  39. package/utils/popover/popover-host.directive.d.ts +1 -1
  40. package/utils/popover/stop-escape-propagation.directive.d.ts +3 -3
@@ -1,4 +1,4 @@
1
- import { EventEmitter, OnChanges, OnInit, QueryList, SimpleChanges } from '@angular/core';
1
+ import { ChangeDetectorRef, EventEmitter, OnChanges, OnInit, QueryList, SimpleChanges } from '@angular/core';
2
2
  import { Observable } from 'rxjs';
3
3
  import { IfExpandService } from '../utils/conditional/if-expanded.service';
4
4
  import { ClrCommonStringsService } from '../utils/i18n/common-strings.service';
@@ -11,6 +11,7 @@ export declare class ClrAccordionPanel implements OnInit, OnChanges {
11
11
  commonStrings: ClrCommonStringsService;
12
12
  private accordionService;
13
13
  private ifExpandService;
14
+ private cdr;
14
15
  disabled: boolean;
15
16
  panelOpen: boolean;
16
17
  panelOpenChange: EventEmitter<boolean>;
@@ -21,9 +22,11 @@ export declare class ClrAccordionPanel implements OnInit, OnChanges {
21
22
  get id(): string;
22
23
  set id(value: string);
23
24
  private _id;
24
- constructor(commonStrings: ClrCommonStringsService, accordionService: AccordionService, ifExpandService: IfExpandService);
25
+ private _panelIndex;
26
+ constructor(commonStrings: ClrCommonStringsService, accordionService: AccordionService, ifExpandService: IfExpandService, cdr: ChangeDetectorRef);
25
27
  ngOnInit(): void;
26
28
  ngOnChanges(changes: SimpleChanges): void;
29
+ get panelNumber(): number;
27
30
  togglePanel(): void;
28
31
  collapsePanelOnAnimationDone(panel: AccordionPanelModel): void;
29
32
  getPanelStateClasses(panel: AccordionPanelModel): string;
@@ -1,4 +1,4 @@
1
- import { ElementRef, OnInit } from '@angular/core';
1
+ import { ChangeDetectorRef, ElementRef, OnInit } from '@angular/core';
2
2
  import { FormGroupName, NgModelGroup } from '@angular/forms';
3
3
  import { IfExpandService } from '../../utils/conditional/if-expanded.service';
4
4
  import { ClrCommonStringsService } from '../../utils/i18n/common-strings.service';
@@ -17,11 +17,11 @@ export declare class ClrStepperPanel extends ClrAccordionPanel implements OnInit
17
17
  get formGroup(): import("@angular/forms").FormGroup<any>;
18
18
  get id(): string;
19
19
  set id(_value: string);
20
- constructor(platformId: any, commonStrings: ClrCommonStringsService, formGroupName: FormGroupName, ngModelGroup: NgModelGroup, stepperService: StepperService, ifExpandService: IfExpandService);
20
+ constructor(platformId: any, commonStrings: ClrCommonStringsService, formGroupName: FormGroupName, ngModelGroup: NgModelGroup, stepperService: StepperService, ifExpandService: IfExpandService, cdr: ChangeDetectorRef);
21
21
  ngOnInit(): void;
22
22
  ngOnDestroy(): void;
23
23
  private listenToFocusChanges;
24
24
  private triggerAllFormControlValidationIfError;
25
- static ɵfac: i0.ɵɵFactoryDeclaration<ClrStepperPanel, [null, null, { optional: true; }, { optional: true; }, null, null]>;
25
+ static ɵfac: i0.ɵɵFactoryDeclaration<ClrStepperPanel, [null, null, { optional: true; }, { optional: true; }, null, null, null]>;
26
26
  static ɵcmp: i0.ɵɵComponentDeclaration<ClrStepperPanel, "clr-stepper-panel", never, {}, {}, never, ["clr-accordion-title, clr-step-title", "clr-accordion-description, clr-step-description", "*"], false, never>;
27
27
  }
@@ -1,21 +1,27 @@
1
- import { AfterContentInit, QueryList } from '@angular/core';
1
+ import { AfterContentInit, AfterViewInit, ElementRef, QueryList } from '@angular/core';
2
2
  import { ClrDestroyService } from '../../utils/destroy/destroy.service';
3
3
  import { ClrCommonStringsService } from '../../utils/i18n/common-strings.service';
4
4
  import { ClrPopoverPosition } from '../../utils/popover/interfaces/popover-position.interface';
5
5
  import { ClrPopoverToggleService } from '../../utils/popover/providers/popover-toggle.service';
6
+ import { ButtonGroupFocusHandler } from '../providers/button-group-focus-handler.service';
7
+ import { InitialFocus } from '../providers/button-group-focus.enum';
6
8
  import { ButtonInGroupService } from '../providers/button-in-group.service';
7
9
  import { ClrButton } from './button';
8
10
  import * as i0 from "@angular/core";
9
11
  import * as i1 from "../../utils/popover/popover-host.directive";
10
- export declare class ClrButtonGroup implements AfterContentInit {
12
+ export declare class ClrButtonGroup implements AfterContentInit, AfterViewInit {
11
13
  buttonGroupNewService: ButtonInGroupService;
12
14
  private toggleService;
13
15
  commonStrings: ClrCommonStringsService;
14
16
  private destroy$;
17
+ private focusHandler;
18
+ menuToggle: ElementRef<HTMLElement>;
19
+ menu: ElementRef<HTMLElement>;
15
20
  buttons: QueryList<ClrButton>;
16
21
  clrToggleButtonAriaLabel: string;
17
22
  popoverId: string;
18
- constructor(buttonGroupNewService: ButtonInGroupService, toggleService: ClrPopoverToggleService, commonStrings: ClrCommonStringsService, destroy$: ClrDestroyService);
23
+ InitialFocus: typeof InitialFocus;
24
+ constructor(buttonGroupNewService: ButtonInGroupService, toggleService: ClrPopoverToggleService, commonStrings: ClrCommonStringsService, destroy$: ClrDestroyService, focusHandler: ButtonGroupFocusHandler);
19
25
  popoverPosition: ClrPopoverPosition;
20
26
  get open(): boolean;
21
27
  inlineButtons: ClrButton[];
@@ -26,6 +32,7 @@ export declare class ClrButtonGroup implements AfterContentInit {
26
32
  * in case the user content projection changes
27
33
  */
28
34
  ngAfterContentInit(): void;
35
+ ngAfterViewInit(): void;
29
36
  /**
30
37
  * Moves the button into the other ViewContainer
31
38
  * when an update is received.
@@ -33,6 +40,7 @@ export declare class ClrButtonGroup implements AfterContentInit {
33
40
  * @param button
34
41
  */
35
42
  rearrangeButton(button: ClrButton): void;
43
+ openMenu(event: Event, initialFocus: InitialFocus): void;
36
44
  /**
37
45
  * Author: Eudes
38
46
  *
@@ -50,6 +58,7 @@ export declare class ClrButtonGroup implements AfterContentInit {
50
58
  private _menuPosition;
51
59
  get menuPosition(): string;
52
60
  set menuPosition(pos: string);
61
+ private handleFocusOnMenuOpen;
53
62
  static ɵfac: i0.ɵɵFactoryDeclaration<ClrButtonGroup, never>;
54
63
  static ɵcmp: i0.ɵɵComponentDeclaration<ClrButtonGroup, "clr-button-group", never, { "clrToggleButtonAriaLabel": "clrToggleButtonAriaLabel"; "menuPosition": "clrMenuPosition"; }, {}, ["buttons"], never, false, [{ directive: typeof i1.PopoverHostDirective; inputs: {}; outputs: {}; }]>;
55
64
  }
@@ -1,15 +1,14 @@
1
1
  import { EventEmitter, TemplateRef } from '@angular/core';
2
2
  import { ClrLoadingState } from '../../utils/loading/loading';
3
3
  import { LoadingListener } from '../../utils/loading/loading-listener';
4
- import { ClrPopoverToggleService } from '../../utils/popover/providers/popover-toggle.service';
5
4
  import { ButtonInGroupService } from '../providers/button-in-group.service';
6
5
  import * as i0 from "@angular/core";
7
6
  export declare class ClrButton implements LoadingListener {
8
7
  buttonInGroupService: ButtonInGroupService;
9
- private toggleService;
10
8
  private _enableService;
11
9
  templateRef: TemplateRef<ClrButton>;
12
- constructor(buttonInGroupService: ButtonInGroupService, toggleService: ClrPopoverToggleService);
10
+ constructor(buttonInGroupService: ButtonInGroupService);
11
+ get role(): string;
13
12
  private _inMenu;
14
13
  get inMenu(): boolean;
15
14
  set inMenu(value: boolean);
@@ -31,8 +30,8 @@ export declare class ClrButton implements LoadingListener {
31
30
  loading: boolean;
32
31
  loadingStateChange(state: ClrLoadingState): void;
33
32
  _click: EventEmitter<boolean>;
34
- emitClick($event: Event): void;
33
+ emitClick(): void;
35
34
  ngAfterViewInit(): void;
36
- static ɵfac: i0.ɵɵFactoryDeclaration<ClrButton, [{ optional: true; skipSelf: true; }, null]>;
35
+ static ɵfac: i0.ɵɵFactoryDeclaration<ClrButton, [{ optional: true; skipSelf: true; }]>;
37
36
  static ɵcmp: i0.ɵɵComponentDeclaration<ClrButton, "clr-button", never, { "inMenu": "clrInMenu"; "classNames": "class"; "name": "name"; "type": "type"; "id": "id"; "disabled": "disabled"; }, { "_click": "click"; }, never, ["*"], false, never>;
38
37
  }
@@ -0,0 +1,32 @@
1
+ import { Renderer2 } from '@angular/core';
2
+ import { ClrPopoverToggleService } from '../../utils';
3
+ import { FocusService } from '../../utils/focus/focus.service';
4
+ import { InitialFocus } from './button-group-focus.enum';
5
+ import * as i0 from "@angular/core";
6
+ export declare class ButtonGroupFocusHandler {
7
+ private focusService;
8
+ private toggleService;
9
+ private renderer;
10
+ initialFocus: InitialFocus;
11
+ private menu;
12
+ private menuToggle;
13
+ private buttons;
14
+ private _unlistenFuncs;
15
+ constructor(focusService: FocusService, toggleService: ClrPopoverToggleService, renderer: Renderer2);
16
+ initialize({ menu, menuToggle }: {
17
+ menu: HTMLElement;
18
+ menuToggle: HTMLElement;
19
+ }): void;
20
+ private resetButtonsFocus;
21
+ private listenToKeys;
22
+ private closeMenu;
23
+ private linkButtons;
24
+ private focusFirstItem;
25
+ private focusLastItem;
26
+ ngOnDestroy(): void;
27
+ static ɵfac: i0.ɵɵFactoryDeclaration<ButtonGroupFocusHandler, never>;
28
+ static ɵprov: i0.ɵɵInjectableDeclaration<ButtonGroupFocusHandler>;
29
+ }
30
+ export declare const BUTTON_GROUP_FOCUS_HANDLER_PROVIDER: {
31
+ provide: typeof ButtonGroupFocusHandler;
32
+ };
@@ -0,0 +1,4 @@
1
+ export declare enum InitialFocus {
2
+ FIRST_ITEM = "first",
3
+ LAST_ITEM = "last"
4
+ }
package/clarity.api.md CHANGED
@@ -269,7 +269,7 @@ export class ClrAccordionModule {
269
269
  // @public (undocumented)
270
270
  export class ClrAccordionPanel implements OnInit, OnChanges {
271
271
  // Warning: (ae-forgotten-export) The symbol "IfExpandService" needs to be exported by the entry point index.d.ts
272
- constructor(commonStrings: ClrCommonStringsService, accordionService: AccordionService, ifExpandService: IfExpandService);
272
+ constructor(commonStrings: ClrCommonStringsService, accordionService: AccordionService, ifExpandService: IfExpandService, cdr: ChangeDetectorRef);
273
273
  // (undocumented)
274
274
  accordionDescription: QueryList<ClrAccordionDescription>;
275
275
  // Warning: (ae-forgotten-export) The symbol "AccordionStatus" needs to be exported by the entry point index.d.ts
@@ -302,6 +302,8 @@ export class ClrAccordionPanel implements OnInit, OnChanges {
302
302
  // (undocumented)
303
303
  panel: Observable<AccordionPanelModel>;
304
304
  // (undocumented)
305
+ get panelNumber(): number;
306
+ // (undocumented)
305
307
  panelOpen: boolean;
306
308
  // (undocumented)
307
309
  panelOpenChange: EventEmitter<boolean>;
@@ -442,6 +444,8 @@ export class ClrAlertsPager implements OnInit, OnDestroy {
442
444
  // (undocumented)
443
445
  multiAlertService: MultiAlertService;
444
446
  // (undocumented)
447
+ protected get nextAlertAriaLabel(): string;
448
+ // (undocumented)
445
449
  ngOnDestroy(): void;
446
450
  // (undocumented)
447
451
  ngOnInit(): void;
@@ -450,6 +454,8 @@ export class ClrAlertsPager implements OnInit, OnDestroy {
450
454
  // (undocumented)
451
455
  pageUp(): void;
452
456
  // (undocumented)
457
+ protected get previousAlertAriaLabel(): string;
458
+ // (undocumented)
453
459
  static ɵcmp: i0.ɵɵComponentDeclaration<ClrAlertsPager, "clr-alerts-pager", never, { "currentAlert": "clrCurrentAlert"; "currentAlertIndex": "clrCurrentAlertIndex"; }, { "currentAlertChange": "clrCurrentAlertChange"; "currentAlertIndexChange": "clrCurrentAlertIndexChange"; }, never, never, false, never>;
454
460
  // (undocumented)
455
461
  static ɵfac: i0.ɵɵFactoryDeclaration<ClrAlertsPager, never>;
@@ -498,7 +504,7 @@ export enum ClrAxis {
498
504
 
499
505
  // @public (undocumented)
500
506
  export class ClrButton implements LoadingListener {
501
- constructor(buttonInGroupService: ButtonInGroupService, toggleService: ClrPopoverToggleService);
507
+ constructor(buttonInGroupService: ButtonInGroupService);
502
508
  // Warning: (ae-forgotten-export) The symbol "ButtonInGroupService" needs to be exported by the entry point index.d.ts
503
509
  //
504
510
  // (undocumented)
@@ -512,7 +518,7 @@ export class ClrButton implements LoadingListener {
512
518
  get disabled(): any;
513
519
  set disabled(value: any);
514
520
  // (undocumented)
515
- emitClick($event: Event): void;
521
+ emitClick(): void;
516
522
  // (undocumented)
517
523
  get id(): string;
518
524
  set id(value: string);
@@ -529,6 +535,8 @@ export class ClrButton implements LoadingListener {
529
535
  // (undocumented)
530
536
  ngAfterViewInit(): void;
531
537
  // (undocumented)
538
+ get role(): string;
539
+ // (undocumented)
532
540
  templateRef: TemplateRef<ClrButton>;
533
541
  // (undocumented)
534
542
  get type(): string;
@@ -536,12 +544,13 @@ export class ClrButton implements LoadingListener {
536
544
  // (undocumented)
537
545
  static ɵcmp: i0.ɵɵComponentDeclaration<ClrButton, "clr-button", never, { "inMenu": "clrInMenu"; "classNames": "class"; "name": "name"; "type": "type"; "id": "id"; "disabled": "disabled"; }, { "_click": "click"; }, never, ["*"], false, never>;
538
546
  // (undocumented)
539
- static ɵfac: i0.ɵɵFactoryDeclaration<ClrButton, [{ optional: true; skipSelf: true; }, null]>;
547
+ static ɵfac: i0.ɵɵFactoryDeclaration<ClrButton, [{ optional: true; skipSelf: true; }]>;
540
548
  }
541
549
 
542
550
  // @public (undocumented)
543
- export class ClrButtonGroup implements AfterContentInit {
544
- constructor(buttonGroupNewService: ButtonInGroupService, toggleService: ClrPopoverToggleService, commonStrings: ClrCommonStringsService, destroy$: ClrDestroyService);
551
+ export class ClrButtonGroup implements AfterContentInit, AfterViewInit {
552
+ // Warning: (ae-forgotten-export) The symbol "ButtonGroupFocusHandler" needs to be exported by the entry point index.d.ts
553
+ constructor(buttonGroupNewService: ButtonInGroupService, toggleService: ClrPopoverToggleService, commonStrings: ClrCommonStringsService, destroy$: ClrDestroyService, focusHandler: ButtonGroupFocusHandler);
545
554
  // (undocumented)
546
555
  buttonGroupNewService: ButtonInGroupService;
547
556
  // (undocumented)
@@ -551,19 +560,31 @@ export class ClrButtonGroup implements AfterContentInit {
551
560
  // (undocumented)
552
561
  commonStrings: ClrCommonStringsService;
553
562
  getMoveIndex(buttonToMove: ClrButton): number;
563
+ // Warning: (ae-forgotten-export) The symbol "InitialFocus" needs to be exported by the entry point index.d.ts
564
+ //
565
+ // (undocumented)
566
+ InitialFocus: typeof InitialFocus;
554
567
  // (undocumented)
555
568
  initializeButtons(): void;
556
569
  // (undocumented)
557
570
  inlineButtons: ClrButton[];
558
571
  // (undocumented)
572
+ menu: ElementRef<HTMLElement>;
573
+ // (undocumented)
559
574
  menuButtons: ClrButton[];
560
575
  // (undocumented)
561
576
  get menuPosition(): string;
562
577
  set menuPosition(pos: string);
578
+ // (undocumented)
579
+ menuToggle: ElementRef<HTMLElement>;
563
580
  ngAfterContentInit(): void;
564
581
  // (undocumented)
582
+ ngAfterViewInit(): void;
583
+ // (undocumented)
565
584
  get open(): boolean;
566
585
  // (undocumented)
586
+ openMenu(event: Event, initialFocus: InitialFocus): void;
587
+ // (undocumented)
567
588
  popoverId: string;
568
589
  // (undocumented)
569
590
  popoverPosition: ClrPopoverPosition;
@@ -867,6 +888,8 @@ export class ClrCommonFormsModule {
867
888
  // @public (undocumented)
868
889
  export interface ClrCommonStrings {
869
890
  alertCloseButtonAriaLabel: string;
891
+ alertNextAlertAriaLabel: string;
892
+ alertPreviousAlertAriaLabel: string;
870
893
  allColumnsSelected: string;
871
894
  close: string;
872
895
  collapse: string;
@@ -1186,6 +1209,8 @@ export class ClrDatagridActionBar {
1186
1209
  export class ClrDatagridActionOverflow implements OnDestroy {
1187
1210
  constructor(rowActionService: RowActionService, commonStrings: ClrCommonStringsService, platformId: any, zone: NgZone, smartToggleService: ClrPopoverToggleService);
1188
1211
  // (undocumented)
1212
+ buttonLabel: string;
1213
+ // (undocumented)
1189
1214
  closeOverflowContent(event: Event): void;
1190
1215
  // (undocumented)
1191
1216
  commonStrings: ClrCommonStringsService;
@@ -1201,7 +1226,7 @@ export class ClrDatagridActionOverflow implements OnDestroy {
1201
1226
  // (undocumented)
1202
1227
  smartPosition: ClrPopoverPosition;
1203
1228
  // (undocumented)
1204
- static ɵcmp: i0.ɵɵComponentDeclaration<ClrDatagridActionOverflow, "clr-dg-action-overflow", never, { "open": "clrDgActionOverflowOpen"; }, { "openChange": "clrDgActionOverflowOpenChange"; }, never, ["*"], false, [{ directive: typeof i1_6.PopoverHostDirective; inputs: {}; outputs: {}; }]>;
1229
+ static ɵcmp: i0.ɵɵComponentDeclaration<ClrDatagridActionOverflow, "clr-dg-action-overflow", never, { "open": "clrDgActionOverflowOpen"; "buttonLabel": "clrDgActionOverflowButtonLabel"; }, { "openChange": "clrDgActionOverflowOpenChange"; }, never, ["*"], false, [{ directive: typeof i1_6.PopoverHostDirective; inputs: {}; outputs: {}; }]>;
1205
1230
  // (undocumented)
1206
1231
  static ɵfac: i0.ɵɵFactoryDeclaration<ClrDatagridActionOverflow, never>;
1207
1232
  }
@@ -1730,6 +1755,8 @@ export class ClrDatagridRow<T = any> implements AfterContentInit, AfterViewInit
1730
1755
  selection: Selection_2<T>;
1731
1756
  // (undocumented)
1732
1757
  SELECTION_TYPE: typeof SelectionType;
1758
+ // @deprecated (undocumented)
1759
+ protected selectRow(selected?: boolean): void;
1733
1760
  // (undocumented)
1734
1761
  _stickyCells: ViewContainerRef;
1735
1762
  // (undocumented)
@@ -3620,7 +3647,7 @@ export class ClrStepperModule {
3620
3647
 
3621
3648
  // @public (undocumented)
3622
3649
  export class ClrStepperPanel extends ClrAccordionPanel implements OnInit {
3623
- constructor(platformId: any, commonStrings: ClrCommonStringsService, formGroupName: FormGroupName, ngModelGroup: NgModelGroup, stepperService: StepperService, ifExpandService: IfExpandService);
3650
+ constructor(platformId: any, commonStrings: ClrCommonStringsService, formGroupName: FormGroupName, ngModelGroup: NgModelGroup, stepperService: StepperService, ifExpandService: IfExpandService, cdr: ChangeDetectorRef);
3624
3651
  // (undocumented)
3625
3652
  commonStrings: ClrCommonStringsService;
3626
3653
  // (undocumented)
@@ -3639,7 +3666,22 @@ export class ClrStepperPanel extends ClrAccordionPanel implements OnInit {
3639
3666
  // (undocumented)
3640
3667
  static ɵcmp: i0.ɵɵComponentDeclaration<ClrStepperPanel, "clr-stepper-panel", never, {}, {}, never, ["clr-accordion-title, clr-step-title", "clr-accordion-description, clr-step-description", "*"], false, never>;
3641
3668
  // (undocumented)
3642
- static ɵfac: i0.ɵɵFactoryDeclaration<ClrStepperPanel, [null, null, { optional: true; }, { optional: true; }, null, null]>;
3669
+ static ɵfac: i0.ɵɵFactoryDeclaration<ClrStepperPanel, [null, null, { optional: true; }, { optional: true; }, null, null, null]>;
3670
+ }
3671
+
3672
+ // @public (undocumented)
3673
+ export class ClrStopEscapePropagationDirective implements OnInit, OnDestroy {
3674
+ constructor(toggleService: ClrPopoverToggleService);
3675
+ // (undocumented)
3676
+ ngOnDestroy(): void;
3677
+ // (undocumented)
3678
+ ngOnInit(): void;
3679
+ // (undocumented)
3680
+ onEscapeKey(event: KeyboardEvent): void;
3681
+ // (undocumented)
3682
+ static ɵdir: i0.ɵɵDirectiveDeclaration<ClrStopEscapePropagationDirective, never, never, {}, {}, never, never, true, never>;
3683
+ // (undocumented)
3684
+ static ɵfac: i0.ɵɵFactoryDeclaration<ClrStopEscapePropagationDirective, never>;
3643
3685
  }
3644
3686
 
3645
3687
  // @public (undocumented)
@@ -5067,7 +5109,7 @@ export class ÇlrWrappedRow implements DynamicWrapper, AfterViewInit, OnDestroy
5067
5109
 
5068
5110
  // Warnings were encountered during analysis:
5069
5111
  //
5070
- // dist/clr-angular/button/button-group/button-group.d.ts:54:217 - (ae-forgotten-export) The symbol "i1_6" needs to be exported by the entry point index.d.ts
5112
+ // dist/clr-angular/button/button-group/button-group.d.ts:63:217 - (ae-forgotten-export) The symbol "i1_6" needs to be exported by the entry point index.d.ts
5071
5113
 
5072
5114
  // (No @packageDocumentation comment for this package)
5073
5115
 
@@ -23,6 +23,7 @@ export declare class ClrDatagridActionOverflow implements OnDestroy {
23
23
  get open(): boolean;
24
24
  set open(open: boolean);
25
25
  openChange: EventEmitter<boolean>;
26
+ buttonLabel: string;
26
27
  static ɵfac: i0.ɵɵFactoryDeclaration<ClrDatagridActionOverflow, never>;
27
- static ɵcmp: i0.ɵɵComponentDeclaration<ClrDatagridActionOverflow, "clr-dg-action-overflow", never, { "open": "clrDgActionOverflowOpen"; }, { "openChange": "clrDgActionOverflowOpenChange"; }, never, ["*"], false, [{ directive: typeof i1.PopoverHostDirective; inputs: {}; outputs: {}; }]>;
28
+ static ɵcmp: i0.ɵɵComponentDeclaration<ClrDatagridActionOverflow, "clr-dg-action-overflow", never, { "open": "clrDgActionOverflowOpen"; "buttonLabel": "clrDgActionOverflowButtonLabel"; }, { "openChange": "clrDgActionOverflowOpenChange"; }, never, ["*"], false, [{ directive: typeof i1.PopoverHostDirective; inputs: {}; outputs: {}; }]>;
28
29
  }
@@ -57,6 +57,10 @@ export declare class ClrDatagridRow<T = any> implements AfterContentInit, AfterV
57
57
  get clrDgSelectable(): boolean | string;
58
58
  selectedChanged: EventEmitter<boolean>;
59
59
  toggle(selected?: boolean): void;
60
+ /**
61
+ * @deprecated related to clrDgRowSelection, which is deprecated
62
+ */
63
+ protected selectRow(selected?: boolean): void;
60
64
  get expanded(): boolean | string;
61
65
  set expanded(value: boolean | string);
62
66
  expandedChange: EventEmitter<boolean>;
@@ -18,6 +18,8 @@ export declare class ClrAlertsPager implements OnInit, OnDestroy {
18
18
  */
19
19
  set currentAlertIndex(index: number);
20
20
  get currentAlertIndex(): number;
21
+ protected get previousAlertAriaLabel(): string;
22
+ protected get nextAlertAriaLabel(): string;
21
23
  currentAlertIndexChange: EventEmitter<number>;
22
24
  constructor(multiAlertService: MultiAlertService, commonStrings: ClrCommonStringsService);
23
25
  ngOnInit(): void;
@@ -17,10 +17,11 @@ import * as i3 from "../utils/conditional/if-expanded.service";
17
17
  import * as i4 from "@angular/common";
18
18
  import * as i5 from "../icon/icon";
19
19
  export class ClrAccordionPanel {
20
- constructor(commonStrings, accordionService, ifExpandService) {
20
+ constructor(commonStrings, accordionService, ifExpandService, cdr) {
21
21
  this.commonStrings = commonStrings;
22
22
  this.accordionService = accordionService;
23
23
  this.ifExpandService = ifExpandService;
24
+ this.cdr = cdr;
24
25
  this.disabled = false;
25
26
  this.panelOpen = false;
26
27
  this.panelOpenChange = new EventEmitter();
@@ -48,6 +49,9 @@ export class ClrAccordionPanel {
48
49
  this.accordionService.disablePanel(this.id, changes.disabled.currentValue);
49
50
  }
50
51
  }
52
+ get panelNumber() {
53
+ return this._panelIndex + 1;
54
+ }
51
55
  togglePanel() {
52
56
  this.accordionService.togglePanel(this.id);
53
57
  }
@@ -66,6 +70,13 @@ export class ClrAccordionPanel {
66
70
  return `clr-accordion-header-${id}`;
67
71
  }
68
72
  emitPanelChange(panel) {
73
+ if (panel.index !== this._panelIndex) {
74
+ this._panelIndex = panel.index;
75
+ // The whole chain of updates leading to this line starts in a ngAfterViewInit subscription in accordion.ts,
76
+ // listening for DOM changes. It seems to only fails in tests, but as this is not a frequently called code,
77
+ // I prefer to stay on the safe side and initiate a detection cycle here.
78
+ this.cdr.detectChanges();
79
+ }
69
80
  if (panel.open !== this.panelOpen) {
70
81
  this.panelOpenChange.emit(panel.open);
71
82
  /**
@@ -84,12 +95,12 @@ export class ClrAccordionPanel {
84
95
  }
85
96
  }
86
97
  }
87
- ClrAccordionPanel.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrAccordionPanel, deps: [{ token: i1.ClrCommonStringsService }, { token: i2.AccordionService }, { token: i3.IfExpandService }], target: i0.ɵɵFactoryTarget.Component });
88
- ClrAccordionPanel.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrAccordionPanel, selector: "clr-accordion-panel", inputs: { disabled: ["clrAccordionPanelDisabled", "disabled"], panelOpen: ["clrAccordionPanelOpen", "panelOpen"] }, outputs: { panelOpenChange: "clrAccordionPanelOpenChange" }, host: { properties: { "class.clr-accordion-panel": "true" } }, providers: [IfExpandService], queries: [{ propertyName: "accordionDescription", predicate: ClrAccordionDescription }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"panel | async; let panel\">\n <div [ngClass]=\"getPanelStateClasses(panel)\">\n <div class=\"clr-accordion-header\">\n <button\n type=\"button\"\n class=\"clr-accordion-header-button\"\n (click)=\"togglePanel()\"\n [id]=\"getAccordionHeaderId(panel.templateId)\"\n [disabled]=\"isAccordion && panel.disabled\"\n [attr.aria-disabled]=\"!isAccordion && panel.disabled\"\n [attr.aria-controls]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-expanded]=\"panel.open\"\n [class.clr-accordion-header-has-description]=\"(accordionDescription.changes | async)?.length || accordionDescription.length\"\n #headerButton\n >\n <span class=\"clr-sr-only\">\n <ng-container *ngIf=\"panel.status === AccordionStatus.Error\">{{commonStrings.keys.danger}}</ng-container>\n <ng-container *ngIf=\"panel.status === AccordionStatus.Complete\">{{commonStrings.keys.success}}</ng-container>\n </span>\n <span class=\"clr-accordion-status\">\n <cds-icon shape=\"angle\" direction=\"right\" class=\"clr-accordion-angle\"></cds-icon>\n <span class=\"clr-accordion-number\"></span>\n <cds-icon status=\"danger\" shape=\"exclamation-circle\" class=\"clr-accordion-error-icon\"></cds-icon>\n <cds-icon status=\"success\" shape=\"check-circle\" class=\"clr-accordion-complete-icon\"></cds-icon>\n </span>\n <ng-content select=\"clr-accordion-title, clr-step-title\"></ng-content>\n <ng-content select=\"clr-accordion-description, clr-step-description\"></ng-content>\n </button>\n </div>\n <div\n @skipInitialRender\n role=\"region\"\n [id]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-hidden]=\"!panel.open\"\n [attr.aria-labelledby]=\"getAccordionHeaderId(panel.templateId)\"\n >\n <div\n *ngIf=\"panel.open\"\n @toggle\n (@toggle.done)=\"collapsePanelOnAnimationDone(panel)\"\n class=\"clr-accordion-content\"\n >\n <div class=\"clr-accordion-inner-content\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n </div>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.CdsIconCustomTag, selector: "cds-icon" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }], animations: panelAnimation, changeDetection: i0.ChangeDetectionStrategy.OnPush });
98
+ ClrAccordionPanel.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrAccordionPanel, deps: [{ token: i1.ClrCommonStringsService }, { token: i2.AccordionService }, { token: i3.IfExpandService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
99
+ ClrAccordionPanel.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrAccordionPanel, selector: "clr-accordion-panel", inputs: { disabled: ["clrAccordionPanelDisabled", "disabled"], panelOpen: ["clrAccordionPanelOpen", "panelOpen"] }, outputs: { panelOpenChange: "clrAccordionPanelOpenChange" }, host: { properties: { "class.clr-accordion-panel": "true" } }, providers: [IfExpandService], queries: [{ propertyName: "accordionDescription", predicate: ClrAccordionDescription }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"panel | async; let panel\">\n <div [ngClass]=\"getPanelStateClasses(panel)\">\n <div class=\"clr-accordion-header\">\n <button\n type=\"button\"\n class=\"clr-accordion-header-button\"\n (click)=\"togglePanel()\"\n [id]=\"getAccordionHeaderId(panel.templateId)\"\n [disabled]=\"isAccordion && panel.disabled\"\n [attr.aria-disabled]=\"!isAccordion && panel.disabled\"\n [attr.aria-controls]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-expanded]=\"panel.open\"\n [class.clr-accordion-header-has-description]=\"(accordionDescription.changes | async)?.length || accordionDescription.length\"\n #headerButton\n >\n <span class=\"clr-sr-only\">\n <ng-container *ngIf=\"panel.status === AccordionStatus.Error\">{{commonStrings.keys.danger}}</ng-container>\n <ng-container *ngIf=\"panel.status === AccordionStatus.Complete\">{{commonStrings.keys.success}}</ng-container>\n </span>\n <span class=\"clr-accordion-status\">\n <cds-icon shape=\"angle\" direction=\"right\" class=\"clr-accordion-angle\"></cds-icon>\n <span class=\"clr-accordion-number\">{{panelNumber}}.</span>\n <cds-icon status=\"danger\" shape=\"exclamation-circle\" class=\"clr-accordion-error-icon\"></cds-icon>\n <cds-icon status=\"success\" shape=\"check-circle\" class=\"clr-accordion-complete-icon\"></cds-icon>\n </span>\n <ng-content select=\"clr-accordion-title, clr-step-title\"></ng-content>\n <ng-content select=\"clr-accordion-description, clr-step-description\"></ng-content>\n </button>\n </div>\n <div\n @skipInitialRender\n role=\"region\"\n [id]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-hidden]=\"!panel.open\"\n [attr.aria-labelledby]=\"getAccordionHeaderId(panel.templateId)\"\n >\n <div\n *ngIf=\"panel.open\"\n @toggle\n (@toggle.done)=\"collapsePanelOnAnimationDone(panel)\"\n class=\"clr-accordion-content\"\n >\n <div class=\"clr-accordion-inner-content\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n </div>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.CdsIconCustomTag, selector: "cds-icon" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }], animations: panelAnimation, changeDetection: i0.ChangeDetectionStrategy.OnPush });
89
100
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrAccordionPanel, decorators: [{
90
101
  type: Component,
91
- args: [{ selector: 'clr-accordion-panel', host: { '[class.clr-accordion-panel]': 'true' }, changeDetection: ChangeDetectionStrategy.OnPush, animations: panelAnimation, providers: [IfExpandService], template: "<ng-container *ngIf=\"panel | async; let panel\">\n <div [ngClass]=\"getPanelStateClasses(panel)\">\n <div class=\"clr-accordion-header\">\n <button\n type=\"button\"\n class=\"clr-accordion-header-button\"\n (click)=\"togglePanel()\"\n [id]=\"getAccordionHeaderId(panel.templateId)\"\n [disabled]=\"isAccordion && panel.disabled\"\n [attr.aria-disabled]=\"!isAccordion && panel.disabled\"\n [attr.aria-controls]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-expanded]=\"panel.open\"\n [class.clr-accordion-header-has-description]=\"(accordionDescription.changes | async)?.length || accordionDescription.length\"\n #headerButton\n >\n <span class=\"clr-sr-only\">\n <ng-container *ngIf=\"panel.status === AccordionStatus.Error\">{{commonStrings.keys.danger}}</ng-container>\n <ng-container *ngIf=\"panel.status === AccordionStatus.Complete\">{{commonStrings.keys.success}}</ng-container>\n </span>\n <span class=\"clr-accordion-status\">\n <cds-icon shape=\"angle\" direction=\"right\" class=\"clr-accordion-angle\"></cds-icon>\n <span class=\"clr-accordion-number\"></span>\n <cds-icon status=\"danger\" shape=\"exclamation-circle\" class=\"clr-accordion-error-icon\"></cds-icon>\n <cds-icon status=\"success\" shape=\"check-circle\" class=\"clr-accordion-complete-icon\"></cds-icon>\n </span>\n <ng-content select=\"clr-accordion-title, clr-step-title\"></ng-content>\n <ng-content select=\"clr-accordion-description, clr-step-description\"></ng-content>\n </button>\n </div>\n <div\n @skipInitialRender\n role=\"region\"\n [id]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-hidden]=\"!panel.open\"\n [attr.aria-labelledby]=\"getAccordionHeaderId(panel.templateId)\"\n >\n <div\n *ngIf=\"panel.open\"\n @toggle\n (@toggle.done)=\"collapsePanelOnAnimationDone(panel)\"\n class=\"clr-accordion-content\"\n >\n <div class=\"clr-accordion-inner-content\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n </div>\n</ng-container>\n" }]
92
- }], ctorParameters: function () { return [{ type: i1.ClrCommonStringsService }, { type: i2.AccordionService }, { type: i3.IfExpandService }]; }, propDecorators: { disabled: [{
102
+ args: [{ selector: 'clr-accordion-panel', host: { '[class.clr-accordion-panel]': 'true' }, changeDetection: ChangeDetectionStrategy.OnPush, animations: panelAnimation, providers: [IfExpandService], template: "<ng-container *ngIf=\"panel | async; let panel\">\n <div [ngClass]=\"getPanelStateClasses(panel)\">\n <div class=\"clr-accordion-header\">\n <button\n type=\"button\"\n class=\"clr-accordion-header-button\"\n (click)=\"togglePanel()\"\n [id]=\"getAccordionHeaderId(panel.templateId)\"\n [disabled]=\"isAccordion && panel.disabled\"\n [attr.aria-disabled]=\"!isAccordion && panel.disabled\"\n [attr.aria-controls]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-expanded]=\"panel.open\"\n [class.clr-accordion-header-has-description]=\"(accordionDescription.changes | async)?.length || accordionDescription.length\"\n #headerButton\n >\n <span class=\"clr-sr-only\">\n <ng-container *ngIf=\"panel.status === AccordionStatus.Error\">{{commonStrings.keys.danger}}</ng-container>\n <ng-container *ngIf=\"panel.status === AccordionStatus.Complete\">{{commonStrings.keys.success}}</ng-container>\n </span>\n <span class=\"clr-accordion-status\">\n <cds-icon shape=\"angle\" direction=\"right\" class=\"clr-accordion-angle\"></cds-icon>\n <span class=\"clr-accordion-number\">{{panelNumber}}.</span>\n <cds-icon status=\"danger\" shape=\"exclamation-circle\" class=\"clr-accordion-error-icon\"></cds-icon>\n <cds-icon status=\"success\" shape=\"check-circle\" class=\"clr-accordion-complete-icon\"></cds-icon>\n </span>\n <ng-content select=\"clr-accordion-title, clr-step-title\"></ng-content>\n <ng-content select=\"clr-accordion-description, clr-step-description\"></ng-content>\n </button>\n </div>\n <div\n @skipInitialRender\n role=\"region\"\n [id]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-hidden]=\"!panel.open\"\n [attr.aria-labelledby]=\"getAccordionHeaderId(panel.templateId)\"\n >\n <div\n *ngIf=\"panel.open\"\n @toggle\n (@toggle.done)=\"collapsePanelOnAnimationDone(panel)\"\n class=\"clr-accordion-content\"\n >\n <div class=\"clr-accordion-inner-content\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n </div>\n</ng-container>\n" }]
103
+ }], ctorParameters: function () { return [{ type: i1.ClrCommonStringsService }, { type: i2.AccordionService }, { type: i3.IfExpandService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { disabled: [{
93
104
  type: Input,
94
105
  args: ['clrAccordionPanelDisabled']
95
106
  }], panelOpen: [{
@@ -102,4 +113,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
102
113
  type: ContentChildren,
103
114
  args: [ClrAccordionDescription]
104
115
  }] } });
105
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3JkaW9uLXBhbmVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci9zcmMvYWNjb3JkaW9uL2FjY29yZGlvbi1wYW5lbC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXIvc3JjL2FjY29yZGlvbi9hY2NvcmRpb24tcGFuZWwuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsZUFBZSxFQUNmLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxHQUdQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFFM0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUdoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7Ozs7Ozs7QUFVbkQsTUFBTSxPQUFPLGlCQUFpQjtJQW9CNUIsWUFDUyxhQUFzQyxFQUNyQyxnQkFBa0MsRUFDbEMsZUFBZ0M7UUFGakMsa0JBQWEsR0FBYixhQUFhLENBQXlCO1FBQ3JDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBdEJOLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDckIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNYLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUk1RSxvQkFBZSxHQUFHLGVBQWUsQ0FBQztRQUMzQyxnQkFBVyxHQUFHLElBQUksQ0FBQztRQVVYLFFBQUcs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dEM7SUFDSCxDQUFDOzs4R0FuRlUsaUJBQWlCO2tHQUFqQixpQkFBaUIsOFJBRmpCLENBQUMsZUFBZSxDQUFDLCtEQU1YLHVCQUF1QixrREMxQzFDLHlzRUFpREEsNlZEZGMsY0FBYzsyRkFHZixpQkFBaUI7a0JBUjdCLFNBQVM7K0JBQ0UscUJBQXFCLFFBRXpCLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxFQUFFLG1CQUM5Qix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLGNBQWMsYUFDZixDQUFDLGVBQWUsQ0FBQzsyS0FHUSxRQUFRO3NCQUEzQyxLQUFLO3VCQUFDLDJCQUEyQjtnQkFDRixTQUFTO3NCQUF4QyxLQUFLO3VCQUFDLHVCQUF1QjtnQkFDUyxlQUFlO3NCQUFyRCxNQUFNO3VCQUFDLDZCQUE2QjtnQkFDSyxvQkFBb0I7c0JBQTdELGVBQWU7dUJBQUMsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDIzIFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IElmRXhwYW5kU2VydmljZSB9IGZyb20gJy4uL3V0aWxzL2NvbmRpdGlvbmFsL2lmLWV4cGFuZGVkLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2xyQ29tbW9uU3RyaW5nc1NlcnZpY2UgfSBmcm9tICcuLi91dGlscy9pMThuL2NvbW1vbi1zdHJpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHsgdW5pcXVlSWRGYWN0b3J5IH0gZnJvbSAnLi4vdXRpbHMvaWQtZ2VuZXJhdG9yL2lkLWdlbmVyYXRvci5zZXJ2aWNlJztcbmltcG9ydCB7IENsckFjY29yZGlvbkRlc2NyaXB0aW9uIH0gZnJvbSAnLi9hY2NvcmRpb24tZGVzY3JpcHRpb24nO1xuaW1wb3J0IHsgQWNjb3JkaW9uU3RhdHVzIH0gZnJvbSAnLi9lbnVtcy9hY2NvcmRpb24tc3RhdHVzLmVudW0nO1xuaW1wb3J0IHsgQWNjb3JkaW9uUGFuZWxNb2RlbCB9IGZyb20gJy4vbW9kZWxzL2FjY29yZGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBBY2NvcmRpb25TZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvYWNjb3JkaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgcGFuZWxBbmltYXRpb24gfSBmcm9tICcuL3V0aWxzL2FuaW1hdGlvbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci1hY2NvcmRpb24tcGFuZWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vYWNjb3JkaW9uLXBhbmVsLmh0bWwnLFxuICBob3N0OiB7ICdbY2xhc3MuY2xyLWFjY29yZGlvbi1wYW5lbF0nOiAndHJ1ZScgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGFuaW1hdGlvbnM6IHBhbmVsQW5pbWF0aW9uLFxuICBwcm92aWRlcnM6IFtJZkV4cGFuZFNlcnZpY2VdLFxufSlcbmV4cG9ydCBjbGFzcyBDbHJBY2NvcmRpb25QYW5lbCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCdjbHJBY2NvcmRpb25QYW5lbERpc2FibGVkJykgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCdjbHJBY2NvcmRpb25QYW5lbE9wZW4nKSBwYW5lbE9wZW4gPSBmYWxzZTtcbiAgQE91dHB1dCgnY2xyQWNjb3JkaW9uUGFuZWxPcGVuQ2hhbmdlJykgcGFuZWxPcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAQ29udGVudENoaWxkcmVuKENsckFjY29yZGlvbkRlc2NyaXB0aW9uKSBhY2NvcmRpb25EZXNjcmlwdGlvbjogUXVlcnlMaXN0PENsckFjY29yZGlvbkRlc2NyaXB0aW9uPjtcblxuICBwYW5lbDogT2JzZXJ2YWJsZTxBY2NvcmRpb25QYW5lbE1vZGVsPjtcbiAgcmVhZG9ubHkgQWNjb3JkaW9uU3RhdHVzID0gQWNjb3JkaW9uU3RhdHVzO1xuICBpc0FjY29yZGlvbiA9IHRydWU7XG5cbiAgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgc2V0IGlkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBfaWQgPSB1bmlxdWVJZEZhY3RvcnkoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY29tbW9uU3RyaW5nczogQ2xyQ29tbW9uU3RyaW5nc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBhY2NvcmRpb25TZXJ2aWNlOiBBY2NvcmRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgaWZFeHBhbmRTZXJ2aWNlOiBJZkV4cGFuZFNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMucGFuZWwgPSB0aGlzLmFjY29yZGlvblNlcnZpY2UuZ2V0UGFuZWxDaGFuZ2VzKHRoaXMuaWQpLnBpcGUodGFwKHBhbmVsID0+IHRoaXMuZW1pdFBhbmVsQ2hhbmdlKHBhbmVsKSkpO1xuICAgIHRoaXMuYWNjb3JkaW9uU2VydmljZS5hZGRQYW5lbCh0aGlzLmlkLCB0aGlzLnBhbmVsT3Blbik7XG4gICAgdGhpcy5hY2NvcmRpb25TZXJ2aWNlLnRvZ2dsZVBhbmVsKHRoaXMuaWQsIHRoaXMucGFuZWxPcGVuKTtcbiAgICB0aGlzLmFjY29yZGlvblNlcnZpY2UuZGlzYWJsZVBhbmVsKHRoaXMuaWQsIHRoaXMuZGlzYWJsZWQpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmICh0aGlzLnBhbmVsICYmIGNoYW5nZXMucGFuZWxPcGVuICYmIGNoYW5nZXMucGFuZWxPcGVuLmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlcy5wYW5lbE9wZW4ucHJldmlvdXNWYWx1ZSkge1xuICAgICAgdGhpcy5hY2NvcmRpb25TZXJ2aWNlLnRvZ2dsZVBhbmVsKHRoaXMuaWQsIGNoYW5nZXMucGFuZWxPcGVuLmN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGFuZWwgJiYgY2hhbmdlcy5kaXNhYmxlZCAmJiBjaGFuZ2VzLmRpc2FibGVkLmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlcy5kaXNhYmxlZC5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICB0aGlzLmFjY29yZGlvblNlcnZpY2UuZGlzYWJsZVBhbmVsKHRoaXMuaWQsIGNoYW5nZXMuZGlzYWJsZWQuY3VycmVudFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVQYW5lbCgpIHtcbiAgICB0aGlzLmFjY29yZGlvblNlcnZpY2UudG9nZ2xlUGFuZWwodGhpcy5pZCk7XG4gIH1cblxuICBjb2xsYXBzZVBhbmVsT25BbmltYXRpb25Eb25lKHBhbmVsOiBBY2NvcmRpb25QYW5lbE1vZGVsKSB7XG4gICAgaWYgKCFwYW5lbC5vcGVuKSB7XG4gICAgICB0aGlzLmlmRXhwYW5kU2VydmljZS5leHBhbmRlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGdldFBhbmVsU3RhdGVDbGFzc2VzKHBhbmVsOiBBY2NvcmRpb25QYW5lbE1vZGVsKSB7XG4gICAgcmV0dXJuIGBjbHItYWNjb3JkaW9uLXBhbmVsLSR7cGFuZWwuc3RhdHVzfSAke3BhbmVsLm9wZW4gPyAnY2xyLWFjY29yZGlvbi1wYW5lbC1vcGVuJyA6ICcnfWA7XG4gIH1cblxuICBnZXRBY2NvcmRpb25Db250ZW50SWQoaWQ6IHN0cmluZykge1xuICAgIHJldHVybiBgY2xyLWFjY29yZGlvbi1jb250ZW50LSR7aWR9J2A7XG4gIH1cblxuICBnZXRBY2NvcmRpb25IZWFkZXJJZChpZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGBjbHItYWNjb3JkaW9uLWhlYWRlci0ke2lkfWA7XG4gIH1cblxuICBwcml2YXRlIGVtaXRQYW5lbENoYW5nZShwYW5lbDogQWNjb3JkaW9uUGFuZWxNb2RlbCkge1xuICAgIGlmIChwYW5lbC5vcGVuICE9PSB0aGlzLnBhbmVsT3Blbikge1xuICAgICAgdGhpcy5wYW5lbE9wZW5DaGFuZ2UuZW1pdChwYW5lbC5vcGVuKTtcbiAgICAgIC8qKlxuICAgICAgICogQE5vdGU6IHRoaXMgbGluZSBiZWxvdyBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHVzZSBhbm90aGVyIHZhbHVlIHRvIHRyYWNrXG4gICAgICAgKiBmb3IgY2hhbmdlcyBvZiB0aGUgcGFuZWwuIEJlY2F1c2Ugd2UgdXNlIEJlaGF2aW9yU3ViamVjdCB0aGlzIGVtaXQgZXZlbnQgaXMgdHJpZ2dlciBvblxuICAgICAgICogaW5pdCAodGhhdCBpcyBub3QgbmVlZGVkIC0gdGhlcmUgaXMgbm8gY2hhbmdlIG9mIHRoZSBvcmlnaW5hbCB2YWx1ZSkgLSBpbiBzb21lIGNhc2VzIHRoaXNcbiAgICAgICAqIGxlYWQgdG8gZHVwbGljYXRlIGV2ZW50cy5cbiAgICAgICAqXG4gICAgICAgKiBUbyBwcmV2ZW50IHRoaXMgd2UgdHJ5IHRvIGVtaXQgb25seSB3aGVuIHRoZSB2YWx1ZSBpcyBjaGFuZ2VkIGFuZCBrZWVwIHRoZSB2YWx1ZSBpbiBzeW5jXG4gICAgICAgKiBldmVuIHRoYXQgaXMgdXNlZCBvbmx5IGludG8gdGhlIEluaXRpYWwgTGlmZWN5Y2xlIChuZ09uSW5pdCkuXG4gICAgICAgKi9cbiAgICAgIHRoaXMucGFuZWxPcGVuID0gcGFuZWwub3BlbjtcbiAgICB9XG5cbiAgICBpZiAocGFuZWwub3Blbikge1xuICAgICAgdGhpcy5pZkV4cGFuZFNlcnZpY2UuZXhwYW5kZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cInBhbmVsIHwgYXN5bmM7IGxldCBwYW5lbFwiPlxuICA8ZGl2IFtuZ0NsYXNzXT1cImdldFBhbmVsU3RhdGVDbGFzc2VzKHBhbmVsKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjbHItYWNjb3JkaW9uLWhlYWRlclwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJjbHItYWNjb3JkaW9uLWhlYWRlci1idXR0b25cIlxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlUGFuZWwoKVwiXG4gICAgICAgIFtpZF09XCJnZXRBY2NvcmRpb25IZWFkZXJJZChwYW5lbC50ZW1wbGF0ZUlkKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJpc0FjY29yZGlvbiAmJiBwYW5lbC5kaXNhYmxlZFwiXG4gICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiIWlzQWNjb3JkaW9uICYmIHBhbmVsLmRpc2FibGVkXCJcbiAgICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJnZXRBY2NvcmRpb25Db250ZW50SWQocGFuZWwudGVtcGxhdGVJZClcIlxuICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInBhbmVsLm9wZW5cIlxuICAgICAgICBbY2xhc3MuY2xyLWFjY29yZGlvbi1oZWFkZXItaGFzLWRlc2NyaXB0aW9uXT1cIihhY2NvcmRpb25EZXNjcmlwdGlvbi5jaGFuZ2VzIHwgYXN5bmMpPy5sZW5ndGggfHwgYWNjb3JkaW9uRGVzY3JpcHRpb24ubGVuZ3RoXCJcbiAgICAgICAgI2hlYWRlckJ1dHRvblxuICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNsci1zci1vbmx5XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBhbmVsLnN0YXR1cyA9PT0gQWNjb3JkaW9uU3RhdHVzLkVycm9yXCI+e3tjb21tb25TdHJpbmdzLmtleXMuZGFuZ2VyfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFuZWwuc3RhdHVzID09PSBBY2NvcmRpb25TdGF0dXMuQ29tcGxldGVcIj57e2NvbW1vblN0cmluZ3Mua2V5cy5zdWNjZXNzfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNsci1hY2NvcmRpb24tc3RhdHVzXCI+XG4gICAgICAgICAgPGNkcy1pY29uIHNoYXBlPVwiYW5nbGVcIiBkaXJlY3Rpb249XCJyaWdodFwiIGNsYXNzPVwiY2xyLWFjY29yZGlvbi1hbmdsZVwiPjwvY2RzLWljb24+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjbHItYWNjb3JkaW9uLW51bWJlclwiPjwvc3Bhbj5cbiAgICAgICAgICA8Y2RzLWljb24gc3RhdHVzPVwiZGFuZ2VyXCIgc2hhcGU9XCJleGNsYW1hdGlvbi1jaXJjbGVcIiBjbGFzcz1cImNsci1hY2NvcmRpb24tZXJyb3ItaWNvblwiPjwvY2RzLWljb24+XG4gICAgICAgICAgPGNkcy1pY29uIHN0YXR1cz1cInN1Y2Nlc3NcIiBzaGFwZT1cImNoZWNrLWNpcmNsZVwiIGNsYXNzPVwiY2xyLWFjY29yZGlvbi1jb21wbGV0ZS1pY29uXCI+PC9jZHMtaWNvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJjbHItYWNjb3JkaW9uLXRpdGxlLCBjbHItc3RlcC10aXRsZVwiPjwvbmctY29udGVudD5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiY2xyLWFjY29yZGlvbi1kZXNjcmlwdGlvbiwgY2xyLXN0ZXAtZGVzY3JpcHRpb25cIj48L25nLWNvbnRlbnQ+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICBAc2tpcEluaXRpYWxSZW5kZXJcbiAgICAgIHJvbGU9XCJyZWdpb25cIlxuICAgICAgW2lkXT1cImdldEFjY29yZGlvbkNvbnRlbnRJZChwYW5lbC50ZW1wbGF0ZUlkKVwiXG4gICAgICBbYXR0ci5hcmlhLWhpZGRlbl09XCIhcGFuZWwub3BlblwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiZ2V0QWNjb3JkaW9uSGVhZGVySWQocGFuZWwudGVtcGxhdGVJZClcIlxuICAgID5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJwYW5lbC5vcGVuXCJcbiAgICAgICAgQHRvZ2dsZVxuICAgICAgICAoQHRvZ2dsZS5kb25lKT1cImNvbGxhcHNlUGFuZWxPbkFuaW1hdGlvbkRvbmUocGFuZWwpXCJcbiAgICAgICAgY2xhc3M9XCJjbHItYWNjb3JkaW9uLWNvbnRlbnRcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2xyLWFjY29yZGlvbi1pbm5lci1jb250ZW50XCI+XG4gICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuIl19
116
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3JkaW9uLXBhbmVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci9zcmMvYWNjb3JkaW9uL2FjY29yZGlvbi1wYW5lbC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXIvc3JjL2FjY29yZGlvbi9hY2NvcmRpb24tcGFuZWwuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsZUFBZSxFQUNmLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxHQUdQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFFM0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUdoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7Ozs7Ozs7QUFVbkQsTUFBTSxPQUFPLGlCQUFpQjtJQXFCNUIsWUFDUyxhQUFzQyxFQUNyQyxnQkFBa0MsRUFDbEMsZUFBZ0MsRUFDaEMsR0FBc0I7UUFIdkIsa0JBQWEsR0FBYixhQUFhLENBQXlCO1FBQ3JDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBeEJJLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDckIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNYLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUk1RSxvQkFBZSxHQUFHLGVBQWUsQ0FB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QUFHLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDMUI7UUFFRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNqQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEM7Ozs7Ozs7O2VBUUc7WUFDSCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7U0FDN0I7UUFFRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUU7WUFDZCxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7U0FDdEM7SUFDSCxDQUFDOzs4R0FqR1UsaUJBQWlCO2tHQUFqQixpQkFBaUIsOFJBRmpCLENBQUMsZUFBZSxDQUFDLCtEQU1YLHVCQUF1QixrREMzQzFDLHl0RUFpREEsNlZEYmMsY0FBYzsyRkFHZixpQkFBaUI7a0JBUjdCLFNBQVM7K0JBQ0UscUJBQXFCLFFBRXpCLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxFQUFFLG1CQUM5Qix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLGNBQWMsYUFDZixDQUFDLGVBQWUsQ0FBQzsyTUFHUSxRQUFRO3NCQUEzQyxLQUFLO3VCQUFDLDJCQUEyQjtnQkFDRixTQUFTO3NCQUF4QyxLQUFLO3VCQUFDLHVCQUF1QjtnQkFDUyxlQUFlO3NCQUFyRCxNQUFNO3VCQUFDLDZCQUE2QjtnQkFDSyxvQkFBb0I7c0JBQTdELGVBQWU7dUJBQUMsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDIzIFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBJZkV4cGFuZFNlcnZpY2UgfSBmcm9tICcuLi91dGlscy9jb25kaXRpb25hbC9pZi1leHBhbmRlZC5zZXJ2aWNlJztcbmltcG9ydCB7IENsckNvbW1vblN0cmluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vdXRpbHMvaTE4bi9jb21tb24tc3RyaW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7IHVuaXF1ZUlkRmFjdG9yeSB9IGZyb20gJy4uL3V0aWxzL2lkLWdlbmVyYXRvci9pZC1nZW5lcmF0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBDbHJBY2NvcmRpb25EZXNjcmlwdGlvbiB9IGZyb20gJy4vYWNjb3JkaW9uLWRlc2NyaXB0aW9uJztcbmltcG9ydCB7IEFjY29yZGlvblN0YXR1cyB9IGZyb20gJy4vZW51bXMvYWNjb3JkaW9uLXN0YXR1cy5lbnVtJztcbmltcG9ydCB7IEFjY29yZGlvblBhbmVsTW9kZWwgfSBmcm9tICcuL21vZGVscy9hY2NvcmRpb24ubW9kZWwnO1xuaW1wb3J0IHsgQWNjb3JkaW9uU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL2FjY29yZGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IHBhbmVsQW5pbWF0aW9uIH0gZnJvbSAnLi91dGlscy9hbmltYXRpb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjbHItYWNjb3JkaW9uLXBhbmVsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FjY29yZGlvbi1wYW5lbC5odG1sJyxcbiAgaG9zdDogeyAnW2NsYXNzLmNsci1hY2NvcmRpb24tcGFuZWxdJzogJ3RydWUnIH0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBhbmltYXRpb25zOiBwYW5lbEFuaW1hdGlvbixcbiAgcHJvdmlkZXJzOiBbSWZFeHBhbmRTZXJ2aWNlXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyQWNjb3JkaW9uUGFuZWwgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgnY2xyQWNjb3JkaW9uUGFuZWxEaXNhYmxlZCcpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgnY2xyQWNjb3JkaW9uUGFuZWxPcGVuJykgcGFuZWxPcGVuID0gZmFsc2U7XG4gIEBPdXRwdXQoJ2NsckFjY29yZGlvblBhbmVsT3BlbkNoYW5nZScpIHBhbmVsT3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQENvbnRlbnRDaGlsZHJlbihDbHJBY2NvcmRpb25EZXNjcmlwdGlvbikgYWNjb3JkaW9uRGVzY3JpcHRpb246IFF1ZXJ5TGlzdDxDbHJBY2NvcmRpb25EZXNjcmlwdGlvbj47XG5cbiAgcGFuZWw6IE9ic2VydmFibGU8QWNjb3JkaW9uUGFuZWxNb2RlbD47XG4gIHJlYWRvbmx5IEFjY29yZGlvblN0YXR1cyA9IEFjY29yZGlvblN0YXR1cztcbiAgaXNBY2NvcmRpb24gPSB0cnVlO1xuXG4gIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxuXG4gIHNldCBpZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5faWQgPSB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX2lkID0gdW5pcXVlSWRGYWN0b3J5KCk7XG4gIHByaXZhdGUgX3BhbmVsSW5kZXg6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY29tbW9uU3RyaW5nczogQ2xyQ29tbW9uU3RyaW5nc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBhY2NvcmRpb25TZXJ2aWNlOiBBY2NvcmRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgaWZFeHBhbmRTZXJ2aWNlOiBJZkV4cGFuZFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnBhbmVsID0gdGhpcy5hY2NvcmRpb25TZXJ2aWNlLmdldFBhbmVsQ2hhbmdlcyh0aGlzLmlkKS5waXBlKHRhcChwYW5lbCA9PiB0aGlzLmVtaXRQYW5lbENoYW5nZShwYW5lbCkpKTtcbiAgICB0aGlzLmFjY29yZGlvblNlcnZpY2UuYWRkUGFuZWwodGhpcy5pZCwgdGhpcy5wYW5lbE9wZW4pO1xuICAgIHRoaXMuYWNjb3JkaW9uU2VydmljZS50b2dnbGVQYW5lbCh0aGlzLmlkLCB0aGlzLnBhbmVsT3Blbik7XG4gICAgdGhpcy5hY2NvcmRpb25TZXJ2aWNlLmRpc2FibGVQYW5lbCh0aGlzLmlkLCB0aGlzLmRpc2FibGVkKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAodGhpcy5wYW5lbCAmJiBjaGFuZ2VzLnBhbmVsT3BlbiAmJiBjaGFuZ2VzLnBhbmVsT3Blbi5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXMucGFuZWxPcGVuLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgIHRoaXMuYWNjb3JkaW9uU2VydmljZS50b2dnbGVQYW5lbCh0aGlzLmlkLCBjaGFuZ2VzLnBhbmVsT3Blbi5jdXJyZW50VmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBhbmVsICYmIGNoYW5nZXMuZGlzYWJsZWQgJiYgY2hhbmdlcy5kaXNhYmxlZC5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXMuZGlzYWJsZWQucHJldmlvdXNWYWx1ZSkge1xuICAgICAgdGhpcy5hY2NvcmRpb25TZXJ2aWNlLmRpc2FibGVQYW5lbCh0aGlzLmlkLCBjaGFuZ2VzLmRpc2FibGVkLmN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHBhbmVsTnVtYmVyKCkge1xuICAgIHJldHVybiB0aGlzLl9wYW5lbEluZGV4ICsgMTtcbiAgfVxuXG4gIHRvZ2dsZVBhbmVsKCkge1xuICAgIHRoaXMuYWNjb3JkaW9uU2VydmljZS50b2dnbGVQYW5lbCh0aGlzLmlkKTtcbiAgfVxuXG4gIGNvbGxhcHNlUGFuZWxPbkFuaW1hdGlvbkRvbmUocGFuZWw6IEFjY29yZGlvblBhbmVsTW9kZWwpIHtcbiAgICBpZiAoIXBhbmVsLm9wZW4pIHtcbiAgICAgIHRoaXMuaWZFeHBhbmRTZXJ2aWNlLmV4cGFuZGVkID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZ2V0UGFuZWxTdGF0ZUNsYXNzZXMocGFuZWw6IEFjY29yZGlvblBhbmVsTW9kZWwpIHtcbiAgICByZXR1cm4gYGNsci1hY2NvcmRpb24tcGFuZWwtJHtwYW5lbC5zdGF0dXN9ICR7cGFuZWwub3BlbiA/ICdjbHItYWNjb3JkaW9uLXBhbmVsLW9wZW4nIDogJyd9YDtcbiAgfVxuXG4gIGdldEFjY29yZGlvbkNvbnRlbnRJZChpZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGBjbHItYWNjb3JkaW9uLWNvbnRlbnQtJHtpZH0nYDtcbiAgfVxuXG4gIGdldEFjY29yZGlvbkhlYWRlcklkKGlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYGNsci1hY2NvcmRpb24taGVhZGVyLSR7aWR9YDtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFBhbmVsQ2hhbmdlKHBhbmVsOiBBY2NvcmRpb25QYW5lbE1vZGVsKSB7XG4gICAgaWYgKHBhbmVsLmluZGV4ICE9PSB0aGlzLl9wYW5lbEluZGV4KSB7XG4gICAgICB0aGlzLl9wYW5lbEluZGV4ID0gcGFuZWwuaW5kZXg7XG4gICAgICAvLyBUaGUgd2hvbGUgY2hhaW4gb2YgdXBkYXRlcyBsZWFkaW5nIHRvIHRoaXMgbGluZSBzdGFydHMgaW4gYSBuZ0FmdGVyVmlld0luaXQgc3Vic2NyaXB0aW9uIGluIGFjY29yZGlvbi50cyxcbiAgICAgIC8vIGxpc3RlbmluZyBmb3IgRE9NIGNoYW5nZXMuIEl0IHNlZW1zIHRvIG9ubHkgZmFpbHMgaW4gdGVzdHMsIGJ1dCBhcyB0aGlzIGlzIG5vdCBhIGZyZXF1ZW50bHkgY2FsbGVkIGNvZGUsXG4gICAgICAvLyBJIHByZWZlciB0byBzdGF5IG9uIHRoZSBzYWZlIHNpZGUgYW5kIGluaXRpYXRlIGEgZGV0ZWN0aW9uIGN5Y2xlIGhlcmUuXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgaWYgKHBhbmVsLm9wZW4gIT09IHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICB0aGlzLnBhbmVsT3BlbkNoYW5nZS5lbWl0KHBhbmVsLm9wZW4pO1xuICAgICAgLyoqXG4gICAgICAgKiBATm90ZTogdGhpcyBsaW5lIGJlbG93IGlzIG5lZWRlZCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gdXNlIGFub3RoZXIgdmFsdWUgdG8gdHJhY2tcbiAgICAgICAqIGZvciBjaGFuZ2VzIG9mIHRoZSBwYW5lbC4gQmVjYXVzZSB3ZSB1c2UgQmVoYXZpb3JTdWJqZWN0IHRoaXMgZW1pdCBldmVudCBpcyB0cmlnZ2VyIG9uXG4gICAgICAgKiBpbml0ICh0aGF0IGlzIG5vdCBuZWVkZWQgLSB0aGVyZSBpcyBubyBjaGFuZ2Ugb2YgdGhlIG9yaWdpbmFsIHZhbHVlKSAtIGluIHNvbWUgY2FzZXMgdGhpc1xuICAgICAgICogbGVhZCB0byBkdXBsaWNhdGUgZXZlbnRzLlxuICAgICAgICpcbiAgICAgICAqIFRvIHByZXZlbnQgdGhpcyB3ZSB0cnkgdG8gZW1pdCBvbmx5IHdoZW4gdGhlIHZhbHVlIGlzIGNoYW5nZWQgYW5kIGtlZXAgdGhlIHZhbHVlIGluIHN5bmNcbiAgICAgICAqIGV2ZW4gdGhhdCBpcyB1c2VkIG9ubHkgaW50byB0aGUgSW5pdGlhbCBMaWZlY3ljbGUgKG5nT25Jbml0KS5cbiAgICAgICAqL1xuICAgICAgdGhpcy5wYW5lbE9wZW4gPSBwYW5lbC5vcGVuO1xuICAgIH1cblxuICAgIGlmIChwYW5lbC5vcGVuKSB7XG4gICAgICB0aGlzLmlmRXhwYW5kU2VydmljZS5leHBhbmRlZCA9IHRydWU7XG4gICAgfVxuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwicGFuZWwgfCBhc3luYzsgbGV0IHBhbmVsXCI+XG4gIDxkaXYgW25nQ2xhc3NdPVwiZ2V0UGFuZWxTdGF0ZUNsYXNzZXMocGFuZWwpXCI+XG4gICAgPGRpdiBjbGFzcz1cImNsci1hY2NvcmRpb24taGVhZGVyXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImNsci1hY2NvcmRpb24taGVhZGVyLWJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJ0b2dnbGVQYW5lbCgpXCJcbiAgICAgICAgW2lkXT1cImdldEFjY29yZGlvbkhlYWRlcklkKHBhbmVsLnRlbXBsYXRlSWQpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlzQWNjb3JkaW9uICYmIHBhbmVsLmRpc2FibGVkXCJcbiAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCIhaXNBY2NvcmRpb24gJiYgcGFuZWwuZGlzYWJsZWRcIlxuICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cImdldEFjY29yZGlvbkNvbnRlbnRJZChwYW5lbC50ZW1wbGF0ZUlkKVwiXG4gICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwicGFuZWwub3BlblwiXG4gICAgICAgIFtjbGFzcy5jbHItYWNjb3JkaW9uLWhlYWRlci1oYXMtZGVzY3JpcHRpb25dPVwiKGFjY29yZGlvbkRlc2NyaXB0aW9uLmNoYW5nZXMgfCBhc3luYyk/Lmxlbmd0aCB8fCBhY2NvcmRpb25EZXNjcmlwdGlvbi5sZW5ndGhcIlxuICAgICAgICAjaGVhZGVyQnV0dG9uXG4gICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY2xyLXNyLW9ubHlcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFuZWwuc3RhdHVzID09PSBBY2NvcmRpb25TdGF0dXMuRXJyb3JcIj57e2NvbW1vblN0cmluZ3Mua2V5cy5kYW5nZXJ9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYW5lbC5zdGF0dXMgPT09IEFjY29yZGlvblN0YXR1cy5Db21wbGV0ZVwiPnt7Y29tbW9uU3RyaW5ncy5rZXlzLnN1Y2Nlc3N9fTwvbmctY29udGFpbmVyPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY2xyLWFjY29yZGlvbi1zdGF0dXNcIj5cbiAgICAgICAgICA8Y2RzLWljb24gc2hhcGU9XCJhbmdsZVwiIGRpcmVjdGlvbj1cInJpZ2h0XCIgY2xhc3M9XCJjbHItYWNjb3JkaW9uLWFuZ2xlXCI+PC9jZHMtaWNvbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNsci1hY2NvcmRpb24tbnVtYmVyXCI+e3twYW5lbE51bWJlcn19Ljwvc3Bhbj5cbiAgICAgICAgICA8Y2RzLWljb24gc3RhdHVzPVwiZGFuZ2VyXCIgc2hhcGU9XCJleGNsYW1hdGlvbi1jaXJjbGVcIiBjbGFzcz1cImNsci1hY2NvcmRpb24tZXJyb3ItaWNvblwiPjwvY2RzLWljb24+XG4gICAgICAgICAgPGNkcy1pY29uIHN0YXR1cz1cInN1Y2Nlc3NcIiBzaGFwZT1cImNoZWNrLWNpcmNsZVwiIGNsYXNzPVwiY2xyLWFjY29yZGlvbi1jb21wbGV0ZS1pY29uXCI+PC9jZHMtaWNvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJjbHItYWNjb3JkaW9uLXRpdGxlLCBjbHItc3RlcC10aXRsZVwiPjwvbmctY29udGVudD5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiY2xyLWFjY29yZGlvbi1kZXNjcmlwdGlvbiwgY2xyLXN0ZXAtZGVzY3JpcHRpb25cIj48L25nLWNvbnRlbnQ+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICBAc2tpcEluaXRpYWxSZW5kZXJcbiAgICAgIHJvbGU9XCJyZWdpb25cIlxuICAgICAgW2lkXT1cImdldEFjY29yZGlvbkNvbnRlbnRJZChwYW5lbC50ZW1wbGF0ZUlkKVwiXG4gICAgICBbYXR0ci5hcmlhLWhpZGRlbl09XCIhcGFuZWwub3BlblwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiZ2V0QWNjb3JkaW9uSGVhZGVySWQocGFuZWwudGVtcGxhdGVJZClcIlxuICAgID5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJwYW5lbC5vcGVuXCJcbiAgICAgICAgQHRvZ2dsZVxuICAgICAgICAoQHRvZ2dsZS5kb25lKT1cImNvbGxhcHNlUGFuZWxPbkFuaW1hdGlvbkRvbmUocGFuZWwpXCJcbiAgICAgICAgY2xhc3M9XCJjbHItYWNjb3JkaW9uLWNvbnRlbnRcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2xyLWFjY29yZGlvbi1pbm5lci1jb250ZW50XCI+XG4gICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuIl19