@kirbydesign/designsystem 7.2.1 → 7.4.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 (100) hide show
  1. package/README.md +7 -0
  2. package/esm2020/lib/components/avatar/avatar.component.mjs +12 -3
  3. package/esm2020/lib/components/button/button.component.mjs +2 -2
  4. package/esm2020/lib/components/charts/chart-config/chart-bar-config/chart-bar-config.mjs +43 -0
  5. package/esm2020/lib/components/charts/chart-config/chart-base-config.mjs +4 -0
  6. package/esm2020/lib/components/charts/chart-config/chart-stock-config/chart-stock-config.mjs +155 -0
  7. package/esm2020/lib/components/charts/chart-config/chart-stock-config/data-label-position/data-label-position.mjs +49 -0
  8. package/esm2020/lib/components/charts/chart-config/chart-stock-config/vertical-line-plugin/vertical-line-plugin.mjs +37 -0
  9. package/esm2020/lib/components/charts/chart-config/chart-stock-config/vertical-line-plugin/vertical-line-plugin.model.mjs +2 -0
  10. package/esm2020/lib/components/charts/chart-config/index.mjs +3 -0
  11. package/esm2020/lib/components/charts/shared/base-chart/base-chart.component.mjs +4 -1
  12. package/esm2020/lib/components/charts/shared/chart-config-service/configs/type.config.mjs +4 -1
  13. package/esm2020/lib/components/charts/shared/chart-js-service/chart-js.service.mjs +4 -1
  14. package/esm2020/lib/components/dropdown/dropdown.component.mjs +2 -2
  15. package/esm2020/lib/components/fab-sheet/fab-sheet.component.mjs +7 -10
  16. package/esm2020/lib/components/grid/grid.component.mjs +3 -1
  17. package/esm2020/lib/components/icon/kirby-icon-settings.mjs +3 -1
  18. package/esm2020/lib/components/item/item.component.mjs +2 -2
  19. package/esm2020/lib/components/list/list-item/list-item.component.mjs +2 -2
  20. package/esm2020/lib/components/list/list.component.mjs +12 -7
  21. package/esm2020/lib/components/modal/services/modal.helper.mjs +12 -1
  22. package/esm2020/lib/components/page/page.component.mjs +47 -28
  23. package/esm2020/lib/components/slide-button/slide-button.component.mjs +2 -2
  24. package/esm2020/lib/components/tabs/tabs.component.mjs +4 -1
  25. package/esm2020/lib/components/tabs/tabs.service.mjs +5 -2
  26. package/esm2020/lib/index.mjs +3 -1
  27. package/esm2020/lib/kirby-experimental.module.mjs +2 -1
  28. package/esm2020/testing-base/lib/components/mock.avatar.component.mjs +4 -2
  29. package/fesm2015/kirbydesign-designsystem-testing-base.mjs +3 -1
  30. package/fesm2015/kirbydesign-designsystem-testing-base.mjs.map +1 -1
  31. package/fesm2015/kirbydesign-designsystem.mjs +420 -82
  32. package/fesm2015/kirbydesign-designsystem.mjs.map +1 -1
  33. package/fesm2020/kirbydesign-designsystem-testing-base.mjs +3 -1
  34. package/fesm2020/kirbydesign-designsystem-testing-base.mjs.map +1 -1
  35. package/fesm2020/kirbydesign-designsystem.mjs +419 -81
  36. package/fesm2020/kirbydesign-designsystem.mjs.map +1 -1
  37. package/icons/svg/add-bank.svg +2 -0
  38. package/icons/svg/user-blocked.svg +5 -0
  39. package/lib/components/avatar/avatar.component.d.ts +5 -2
  40. package/lib/components/charts/chart-config/chart-bar-config/chart-bar-config.d.ts +9 -0
  41. package/lib/components/charts/chart-config/chart-base-config.d.ts +6 -0
  42. package/lib/components/charts/chart-config/chart-stock-config/chart-stock-config.d.ts +20 -0
  43. package/lib/components/charts/chart-config/chart-stock-config/data-label-position/data-label-position.d.ts +4 -0
  44. package/lib/components/charts/chart-config/chart-stock-config/vertical-line-plugin/vertical-line-plugin.d.ts +2 -0
  45. package/lib/components/charts/chart-config/chart-stock-config/vertical-line-plugin/vertical-line-plugin.model.d.ts +12 -0
  46. package/lib/components/charts/chart-config/index.d.ts +2 -0
  47. package/lib/components/charts/shared/base-chart/base-chart.component.d.ts +1 -0
  48. package/lib/components/charts/shared/chart-js-service/chart-js.service.d.ts +1 -0
  49. package/lib/components/fab-sheet/fab-sheet.component.d.ts +1 -3
  50. package/lib/components/list/list.component.d.ts +1 -1
  51. package/lib/components/modal/services/modal.helper.d.ts +1 -0
  52. package/lib/components/page/page.component.d.ts +11 -11
  53. package/lib/components/tabs/tabs.component.d.ts +3 -2
  54. package/lib/components/tabs/tabs.service.d.ts +1 -0
  55. package/lib/index.d.ts +2 -0
  56. package/lib/kirby-experimental.module.d.ts +1 -0
  57. package/package.json +2 -3
  58. package/polyfills/intersection-observer-polyfill-loader.js +1 -14
  59. package/polyfills/resize-observer-polyfill-loader.js +1 -14
  60. package/scss/_global-styles.scss +1 -1
  61. package/scss/_utils.scss +1 -1
  62. package/scss/base/_functions.scss +1 -1
  63. package/scss/base/_html-list.scss +1 -1
  64. package/scss/base/_include-media.scss +1 -0
  65. package/scss/base/_ionic.scss +1 -1
  66. package/scss/base/_line-clamp.scss +1 -1
  67. package/scss/base/_link.scss +1 -1
  68. package/scss/base/_list.scss +1 -1
  69. package/scss/base/_typography.scss +1 -1
  70. package/scss/base/_variables.scss +1 -1
  71. package/scss/components/_grid.scss +1 -0
  72. package/scss/interaction-state/_active.scss +1 -1
  73. package/scss/interaction-state/_focus.scss +1 -1
  74. package/scss/interaction-state/_hover.scss +1 -1
  75. package/scss/interaction-state/_index.scss +1 -1
  76. package/scss/interaction-state/_interaction-state.utilities.scss +1 -1
  77. package/scss/interaction-state/_layer.scss +1 -1
  78. package/scss/opt-out/_index.scss +1 -1
  79. package/scss/opt-out/_link.scss +1 -1
  80. package/scss/print/_index.scss +1 -1
  81. package/scss/print/components/_index.scss +1 -1
  82. package/scss/print/components/_kirby-app.scss +1 -1
  83. package/scss/print/components/_kirby-fab-sheet.scss +1 -1
  84. package/scss/print/components/_kirby-list.scss +1 -1
  85. package/scss/print/components/_kirby-modal-wrapper.scss +1 -1
  86. package/scss/print/components/_kirby-page.scss +1 -1
  87. package/scss/print/components/_kirby-router-outlet.scss +1 -1
  88. package/scss/print/components/_kirby-tab-bar.scss +1 -1
  89. package/scss/print/elements/_button.scss +1 -1
  90. package/scss/print/elements/_index.scss +1 -1
  91. package/scss/print/elements/_page.scss +1 -1
  92. package/scss/print/elements/_preformatted-text.scss +1 -1
  93. package/scss/print/generic/_colors.scss +1 -1
  94. package/scss/print/generic/_index.scss +1 -1
  95. package/scss/print/generic/_page.scss +1 -1
  96. package/scss/print/generic/_reset.scss +1 -1
  97. package/scss/print/generic/_typography.scss +1 -1
  98. package/scss/themes/_colors.scss +1 -1
  99. package/testing-base/lib/components/mock.avatar.component.d.ts +2 -1
  100. package/src/lib/components/icon/README.md +0 -16
@@ -1,8 +1,8 @@
1
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ContentChildren, Directive, ElementRef, EventEmitter, HostBinding, HostListener, Input, Optional, Output, QueryList, Renderer2, SkipSelf, TemplateRef, ViewChild, } from '@angular/core';
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ContentChildren, Directive, ElementRef, EventEmitter, HostBinding, HostListener, Input, Optional, Output, QueryList, SkipSelf, TemplateRef, ViewChild, } from '@angular/core';
2
2
  import { NavigationEnd, NavigationStart, Router } from '@angular/router';
3
3
  import { IonBackButtonDelegate, IonContent, IonFooter, IonHeader } from '@ionic/angular';
4
4
  import { Subject } from 'rxjs';
5
- import { filter, takeUntil } from 'rxjs/operators';
5
+ import { debounceTime, filter, map, takeUntil } from 'rxjs/operators';
6
6
  import { KirbyAnimation } from '../../animation/kirby-animation';
7
7
  import { ModalWrapperComponent } from '../modal/modal-wrapper/modal-wrapper.component';
8
8
  import { ModalNavigationService } from '../modal/services/modal-navigation.service';
@@ -19,6 +19,11 @@ import * as i6 from "@ionic/angular";
19
19
  import * as i7 from "../spinner/spinner.component";
20
20
  import * as i8 from "@angular/common";
21
21
  import * as i9 from "../../directives/fit-heading/fit-heading.directive";
22
+ /**
23
+ * Specify scroll event debounce time in ms and scrolled offset from top in pixels
24
+ */
25
+ const contentScrollDebounceTimeInMS = 10;
26
+ const contentScrolledOffsetInPixels = 4;
22
27
  export class PageTitleDirective {
23
28
  }
24
29
  /** @nocollapse */ PageTitleDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: PageTitleDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -174,9 +179,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.9", ngImpor
174
179
  }]
175
180
  }] });
176
181
  export class PageComponent {
177
- constructor(elementRef, renderer, router, changeDetectorRef, modalNavigationService, tabsComponent) {
178
- this.elementRef = elementRef;
179
- this.renderer = renderer;
182
+ constructor(router, changeDetectorRef, modalNavigationService, tabsComponent) {
180
183
  this.router = router;
181
184
  this.changeDetectorRef = changeDetectorRef;
182
185
  this.modalNavigationService = modalNavigationService;
@@ -187,9 +190,10 @@ export class PageComponent {
187
190
  this.refresh = new EventEmitter();
188
191
  this.backButtonClick = new EventEmitter();
189
192
  this.pageTitleIntersectionObserverRef = this.pageTitleIntersectionObserver();
193
+ this.stickyContentIntersectionObserverRef = this.stickyContentIntersectionObserver();
190
194
  this.ngOnDestroy$ = new Subject();
191
- this.navigationStart$ = this.router.events.pipe(takeUntil(this.ngOnDestroy$), filter((event) => event instanceof NavigationStart));
192
- this.navigationEnd$ = this.router.events.pipe(takeUntil(this.ngOnDestroy$), filter((event) => event instanceof NavigationEnd));
195
+ this.navigationStart$ = this.router.events.pipe(filter((event) => event instanceof NavigationStart), takeUntil(this.ngOnDestroy$));
196
+ this.navigationEnd$ = this.router.events.pipe(filter((event) => event instanceof NavigationEnd), takeUntil(this.ngOnDestroy$));
193
197
  }
194
198
  get tabBarBottomHidden() {
195
199
  return this._tabBarBottomHidden;
@@ -201,9 +205,6 @@ export class PageComponent {
201
205
  }
202
206
  this._tabBarBottomHidden = value;
203
207
  }
204
- ngOnInit() {
205
- this.removeWrapper();
206
- }
207
208
  ngOnChanges(changes) {
208
209
  if (changes.titleMaxLines) {
209
210
  this.fitHeadingConfig = {
@@ -217,6 +218,11 @@ export class PageComponent {
217
218
  }
218
219
  }
219
220
  ngAfterViewInit() {
221
+ this.contentScrolled$ = this.content.ionScroll.pipe(debounceTime(contentScrollDebounceTimeInMS), map((event) => event.detail), takeUntil(this.ngOnDestroy$));
222
+ this.contentScrolled$.subscribe((scrollInfo) => {
223
+ this.isContentScrolled = scrollInfo.scrollTop > contentScrolledOffsetInPixels;
224
+ this.changeDetectorRef.detectChanges();
225
+ });
220
226
  // This instance has observed a page enter so register the correct url for this instance
221
227
  this.url = this.router.url;
222
228
  this.onEnter();
@@ -234,6 +240,7 @@ export class PageComponent {
234
240
  }
235
241
  });
236
242
  this.interceptBackButtonClicksSetup();
243
+ this.initializeStickyIntersectionObserver();
237
244
  }
238
245
  ngAfterContentChecked() {
239
246
  this.initializeTitle();
@@ -246,6 +253,7 @@ export class PageComponent {
246
253
  this.ngOnDestroy$.next();
247
254
  this.ngOnDestroy$.complete();
248
255
  this.pageTitleIntersectionObserverRef.disconnect();
256
+ this.stickyContentIntersectionObserverRef.disconnect();
249
257
  }
250
258
  delegateRefreshEvent(event) {
251
259
  this.refresh.emit({
@@ -284,6 +292,14 @@ export class PageComponent {
284
292
  this.backButtonClick.emit(event);
285
293
  };
286
294
  }
295
+ initializeStickyIntersectionObserver() {
296
+ if (this.stickyContentTemplate) {
297
+ // Sticky content present - start observing for stickiness
298
+ setTimeout(() => {
299
+ this.stickyContentIntersectionObserverRef.observe(this.stickyContentContainer.nativeElement);
300
+ });
301
+ }
302
+ }
287
303
  initializeTitle() {
288
304
  // Ensures initializeTitle() won't run, if already initialized
289
305
  if (this.hasPageTitle)
@@ -309,16 +325,14 @@ export class PageComponent {
309
325
  this.customActions.forEach((pageAction) => {
310
326
  if (pageAction.isFixed) {
311
327
  this.fixedActionsTemplate = pageAction.template;
312
- this.toolbarFixedActionsVisible = true;
328
+ }
329
+ else if (pageAction.isSticky) {
330
+ this.stickyActionsTemplate = pageAction.template;
313
331
  }
314
332
  else {
315
333
  this.pageActionsTemplate = pageAction.template;
316
- if (pageAction.isSticky) {
317
- this.stickyActionsTemplate = pageAction.template;
318
- }
319
334
  }
320
335
  });
321
- this.hasActionsInPage = !!this.pageActionsTemplate;
322
336
  }
323
337
  initializeContent() {
324
338
  this.customContent.forEach((content) => {
@@ -333,13 +347,6 @@ export class PageComponent {
333
347
  initializeStickyContent() {
334
348
  this.stickyContentTemplate = this.stickyContentRef;
335
349
  }
336
- removeWrapper() {
337
- const parent = this.elementRef.nativeElement.parentNode;
338
- this.renderer.removeChild(parent, this.elementRef.nativeElement);
339
- this.renderer.appendChild(parent, this.ionHeaderElement.nativeElement);
340
- this.renderer.appendChild(parent, this.ionContentElement.nativeElement);
341
- this.renderer.appendChild(parent, this.ionFooterElement.nativeElement);
342
- }
343
350
  pageTitleIntersectionObserver() {
344
351
  const options = {
345
352
  rootMargin: '0px',
@@ -348,7 +355,6 @@ export class PageComponent {
348
355
  const callback = (entries) => {
349
356
  if (initialized) {
350
357
  this.toolbarTitleVisible = !entries[0].isIntersecting;
351
- this.toolbarStickyActionsVisible = !entries[0].isIntersecting;
352
358
  this.changeDetectorRef.detectChanges();
353
359
  }
354
360
  else {
@@ -357,6 +363,16 @@ export class PageComponent {
357
363
  };
358
364
  return new IntersectionObserver(callback, options);
359
365
  }
366
+ stickyContentIntersectionObserver() {
367
+ const options = {
368
+ threshold: 1,
369
+ };
370
+ const callback = (entries) => {
371
+ // The sticky content is pinned when it doesn't fully intersect the viewport
372
+ this.isStickyContentPinned = !entries[0].isIntersecting;
373
+ };
374
+ return new IntersectionObserver(callback, options);
375
+ }
360
376
  _onKeyboardWillShow(info) {
361
377
  if (info && info.keyboardHeight) {
362
378
  this.ionContentElement.nativeElement.style.setProperty('--keyboard-offset', `${info.keyboardHeight}px`);
@@ -371,12 +387,12 @@ export class PageComponent {
371
387
  }
372
388
  }
373
389
  }
374
- /** @nocollapse */ PageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: PageComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i3.Router }, { token: i0.ChangeDetectorRef }, { token: i4.ModalNavigationService }, { token: i5.TabsComponent, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component });
375
- /** @nocollapse */ PageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.9", type: PageComponent, selector: "kirby-page", inputs: { title: "title", subtitle: "subtitle", toolbarTitle: "toolbarTitle", titleAlignment: "titleAlignment", defaultBackHref: "defaultBackHref", hideBackButton: "hideBackButton", titleMaxLines: "titleMaxLines", tabBarBottomHidden: "tabBarBottomHidden" }, outputs: { enter: "enter", leave: "leave", refresh: "refresh", backButtonClick: "backButtonClick" }, host: { listeners: { "window:keyboardWillShow": "_onKeyboardWillShow($event)", "window:keyboardWillHide": "_onKeyboardWillHide()", "window:kirbySelectedTabClick": "_onSelectedTabClick()" } }, queries: [{ propertyName: "customToolbarTitleTemplate", first: true, predicate: PageToolbarTitleDirective, descendants: true, read: TemplateRef }, { propertyName: "customTitleTemplate", first: true, predicate: PageTitleDirective, descendants: true, read: TemplateRef }, { propertyName: "customSubtitleTemplate", first: true, predicate: PageSubtitleDirective, descendants: true, read: TemplateRef }, { propertyName: "stickyContentRef", first: true, predicate: PageStickyContentDirective, descendants: true, read: TemplateRef }, { propertyName: "customActions", predicate: PageActionsDirective }, { propertyName: "customContent", predicate: PageContentDirective }], viewQueries: [{ propertyName: "content", first: true, predicate: IonContent, descendants: true, static: true }, { propertyName: "ionContentElement", first: true, predicate: IonContent, descendants: true, read: ElementRef, static: true }, { propertyName: "ionHeaderElement", first: true, predicate: IonHeader, descendants: true, read: ElementRef, static: true }, { propertyName: "ionFooterElement", first: true, predicate: IonFooter, descendants: true, read: ElementRef, static: true }, { propertyName: "backButtonDelegate", first: true, predicate: IonBackButtonDelegate, descendants: true }, { propertyName: "pageTitle", first: true, predicate: ["pageTitle"], descendants: true, read: ElementRef }, { propertyName: "simpleTitleTemplate", first: true, predicate: ["simpleTitleTemplate"], descendants: true, read: TemplateRef, static: true }, { propertyName: "simpleToolbarTitleTemplate", first: true, predicate: ["simpleToolbarTitleTemplate"], descendants: true, read: TemplateRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"start\">\n <ion-back-button\n text=\"\"\n [defaultHref]=\"defaultBackHref\"\n icon=\"assets/kirby/icons/svg/arrow-back.svg\"\n [style.visibility]=\"hideBackButton ? 'hidden' : null\"\n ></ion-back-button>\n </ion-buttons>\n <ion-title>\n <div class=\"toolbar-title hide\" [class.fade-in]=\"toolbarTitleVisible\">\n <ng-container *ngTemplateOutlet=\"toolbarTitleTemplate\"></ng-container>\n </div>\n </ion-title>\n <ion-buttons\n class=\"hide\"\n slot=\"primary\"\n [class.fade-in]=\"toolbarStickyActionsVisible && stickyActionsTemplate\"\n >\n <ng-container *ngTemplateOutlet=\"stickyActionsTemplate\"></ng-container>\n </ion-buttons>\n <ion-buttons\n class=\"hide\"\n slot=\"secondary\"\n [class.fade-in]=\"toolbarFixedActionsVisible && fixedActionsTemplate\"\n >\n <ng-container *ngTemplateOutlet=\"fixedActionsTemplate\"></ng-container>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content scrollEvents=\"true\" forceOverscroll=\"false\">\n <ion-refresher\n *ngIf=\"refresh.observers.length > 0\"\n (ionRefresh)=\"delegateRefreshEvent($event)\"\n slot=\"fixed\"\n >\n <kirby-spinner></kirby-spinner>\n </ion-refresher>\n\n <!-- Page header -->\n <div class=\"page-header-container\" *ngIf=\"hasPageTitle\">\n <div\n class=\"page-header\"\n [ngClass]=\"{\n 'text-center': titleAlignment === 'center',\n 'text-right': titleAlignment === 'right'\n }\"\n >\n <div #pageTitle class=\"page-title\" [class.has-actions]=\"hasActionsInPage\">\n <ng-container\n *ngTemplateOutlet=\"customTitleTemplate || defaultPageTitleTemplate\"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"pageActionsTemplate || defaultPageActionsTemplate\"\n ></ng-container>\n </div>\n <div *ngIf=\"hasPageSubtitle\" class=\"page-subtitle\">\n <ng-container\n *ngTemplateOutlet=\"customSubtitleTemplate || defaultPageSubtitleTemplate\"\n ></ng-container>\n </div>\n </div>\n </div>\n\n <!-- Sticky content -->\n <ng-container *ngIf=\"stickyContentTemplate\">\n <div class=\"sticky-content-container\">\n <div>\n <ng-container *ngTemplateOutlet=\"stickyContentTemplate\"></ng-container>\n </div>\n </div>\n </ng-container>\n\n <!-- Content -->\n <div class=\"content-inner\">\n <ng-container\n *ngTemplateOutlet=\"customContentTemplate || defaultContentTemplate\"\n ></ng-container>\n </div>\n\n <div slot=\"fixed\" class=\"fixed-content\" *ngIf=\"fixedContentTemplate\">\n <div class=\"content-inner\">\n <ng-container *ngTemplateOutlet=\"fixedContentTemplate\"></ng-container>\n </div>\n </div>\n</ion-content>\n\n<ion-footer>\n <ng-content select=\"kirby-page-footer\"></ng-content>\n</ion-footer>\n\n<ng-template #defaultPageTitleTemplate>\n <h1 [kirbyFitHeading]=\"fitHeadingConfig\">\n <ng-container *ngTemplateOutlet=\"simpleTitleTemplate\"></ng-container>\n </h1>\n</ng-template>\n<ng-template #defaultPageSubtitleTemplate>\n <ng-container *ngTemplateOutlet=\"simpleSubtitleTemplate\"></ng-container>\n</ng-template>\n<ng-template #defaultPageActionsTemplate>\n <ng-content select=\"kirby-page-actions\"></ng-content>\n</ng-template>\n\n<ng-template #defaultContentTemplate>\n <ng-content select=\"kirby-page-content\"></ng-content>\n</ng-template>\n\n<ng-template #simpleTitleTemplate>{{ title }}</ng-template>\n<ng-template #simpleSubtitleTemplate>{{ subtitle }}</ng-template>\n<ng-template #simpleToolbarTitleTemplate>{{ toolbarTitle }}</ng-template>\n", styles: ["ion-header,ion-toolbar{--background: var(--kirby-background-color);margin:0 auto}@media (min-width: 1025px) and (hover: hover) and (pointer: fine){ion-header,ion-toolbar{max-width:768px}}ion-toolbar{--border-width: 0 !important;--padding-start: 4px;--padding-end: 4px;--padding-top: 0;--padding-bottom: 0;--ion-toolbar-color: var(--kirby-black)}ion-toolbar ion-buttons[slot=secondary]{order:6}ion-toolbar ion-title .toolbar-title{text-overflow:ellipsis;white-space:nowrap;pointer-events:auto;overflow:hidden}ion-toolbar ion-title .toolbar-title ::ng-deep>*{text-overflow:ellipsis;white-space:nowrap;pointer-events:auto;overflow:hidden}.hide{visibility:hidden;opacity:0;transition:opacity .1s linear}.hide.fade-in{visibility:inherit;opacity:1}ion-title{box-sizing:border-box;font-size:16px;font-weight:400}ion-back-button{--color: var(--kirby-black);--icon-font-size: 24px;height:44px;width:44px;opacity:1}@media (hover: hover){ion-back-button:hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);--background-hover: var(--state-layer-background-color);--background-hover-opacity: var(--state-layer-opacity)}}ion-back-button:active,ion-back-button.ion-activated{--state-layer-opacity: .16;--state-layer-background-color: var(--kirby-black);--background-activated: var(--state-layer-background-color);--background-activated-opacity: var(--state-layer-opacity)}ion-back-button::part(native){opacity:1;border-radius:999px;overflow:hidden}ion-back-button::part(native):after{transition:all 80ms linear 0ms}.page-header-container{max-width:var(--page-content-max-width, 720px);margin:0 auto}.page-header{margin-left:16px;margin-top:8px;margin-bottom:var(--kirby-page-title-margin-bottom, 40px)}.page-header .page-title.has-actions{display:flex;justify-content:space-between;align-items:flex-start}.page-header .page-title h1,.page-header .page-title h2,.page-header .page-title h3,.page-header .page-title h4,.page-header .page-title h5,.page-header .page-title h6{margin:0}.page-header .page-subtitle{margin-top:8px}.page-header.text-center{text-align:center;margin-left:0}.page-header.text-right{text-align:right}ion-content{--padding-start: var(--page-content-padding-start, 16px);--padding-end: var(--page-content-padding-end, 16px);--background: var(--kirby-background-color);--color: var(--kirby-black)}ion-content .content-inner{max-width:var(--page-content-max-width, 720px);margin:0 auto;padding-bottom:40px}ion-content .fixed-content{width:100%;position:absolute;bottom:0}ion-content .fixed-content .content-inner{position:relative}.sticky-content-container{position:sticky;top:0;left:0;right:0;margin-block-end:24px}.sticky-content-container div{max-width:var(--page-content-max-width, 720px);margin:0 auto}\n"], components: [{ type: i6.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { type: i6.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { type: i6.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { type: i6.IonBackButton, selector: "ion-back-button", inputs: ["color", "defaultHref", "disabled", "icon", "mode", "routerAnimation", "text", "type"] }, { type: i6.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { type: i6.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { type: i6.IonRefresher, selector: "ion-refresher", inputs: ["closeDuration", "disabled", "pullFactor", "pullMax", "pullMin", "snapbackDuration"] }, { type: i7.SpinnerComponent, selector: "kirby-spinner" }, { type: i6.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }], directives: [{ type: i6.IonBackButtonDelegate, selector: "ion-back-button", inputs: ["defaultHref", "routerAnimation"] }, { type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i9.FitHeadingDirective, selector: "h1[kirbyFitHeading],h2[kirbyFitHeading],h3[kirbyFitHeading]", inputs: ["kirbyFitHeading"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
390
+ /** @nocollapse */ PageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: PageComponent, deps: [{ token: i3.Router }, { token: i0.ChangeDetectorRef }, { token: i4.ModalNavigationService }, { token: i5.TabsComponent, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component });
391
+ /** @nocollapse */ PageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.9", type: PageComponent, selector: "kirby-page", inputs: { title: "title", subtitle: "subtitle", toolbarTitle: "toolbarTitle", titleAlignment: "titleAlignment", defaultBackHref: "defaultBackHref", hideBackButton: "hideBackButton", titleMaxLines: "titleMaxLines", tabBarBottomHidden: "tabBarBottomHidden" }, outputs: { enter: "enter", leave: "leave", refresh: "refresh", backButtonClick: "backButtonClick" }, host: { listeners: { "window:keyboardWillShow": "_onKeyboardWillShow($event)", "window:keyboardWillHide": "_onKeyboardWillHide()", "window:kirbySelectedTabClick": "_onSelectedTabClick()" } }, queries: [{ propertyName: "customToolbarTitleTemplate", first: true, predicate: PageToolbarTitleDirective, descendants: true, read: TemplateRef }, { propertyName: "customTitleTemplate", first: true, predicate: PageTitleDirective, descendants: true, read: TemplateRef }, { propertyName: "customSubtitleTemplate", first: true, predicate: PageSubtitleDirective, descendants: true, read: TemplateRef }, { propertyName: "stickyContentRef", first: true, predicate: PageStickyContentDirective, descendants: true, read: TemplateRef }, { propertyName: "customActions", predicate: PageActionsDirective }, { propertyName: "customContent", predicate: PageContentDirective }], viewQueries: [{ propertyName: "content", first: true, predicate: IonContent, descendants: true, static: true }, { propertyName: "ionContentElement", first: true, predicate: IonContent, descendants: true, read: ElementRef, static: true }, { propertyName: "ionHeaderElement", first: true, predicate: IonHeader, descendants: true, read: ElementRef, static: true }, { propertyName: "ionFooterElement", first: true, predicate: IonFooter, descendants: true, read: ElementRef, static: true }, { propertyName: "backButtonDelegate", first: true, predicate: IonBackButtonDelegate, descendants: true }, { propertyName: "pageTitle", first: true, predicate: ["pageTitle"], descendants: true, read: ElementRef }, { propertyName: "stickyContentContainer", first: true, predicate: ["stickyContentContainer"], descendants: true, read: ElementRef }, { propertyName: "simpleTitleTemplate", first: true, predicate: ["simpleTitleTemplate"], descendants: true, read: TemplateRef, static: true }, { propertyName: "simpleToolbarTitleTemplate", first: true, predicate: ["simpleToolbarTitleTemplate"], descendants: true, read: TemplateRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<ion-header>\n <ion-toolbar [class.content-scrolled]=\"!stickyContentTemplate && isContentScrolled\">\n <ion-buttons slot=\"start\">\n <ion-back-button\n text=\"\"\n [defaultHref]=\"defaultBackHref\"\n icon=\"assets/kirby/icons/svg/arrow-back.svg\"\n [style.visibility]=\"hideBackButton ? 'hidden' : null\"\n ></ion-back-button>\n </ion-buttons>\n <ion-title [class.slide-and-fade-in]=\"toolbarTitleVisible\">\n <div class=\"toolbar-title\">\n <ng-container *ngTemplateOutlet=\"toolbarTitleTemplate\"></ng-container>\n </div>\n </ion-title>\n <ion-buttons class=\"hide\" slot=\"primary\" [class.fade-in]=\"!!stickyActionsTemplate\">\n <ng-container *ngTemplateOutlet=\"stickyActionsTemplate\"></ng-container>\n </ion-buttons>\n <ion-buttons class=\"hide\" slot=\"secondary\" [class.fade-in]=\"!!fixedActionsTemplate\">\n <ng-container *ngTemplateOutlet=\"fixedActionsTemplate\"></ng-container>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content scrollEvents=\"true\" forceOverscroll=\"false\">\n <ion-refresher\n *ngIf=\"refresh.observers.length > 0\"\n (ionRefresh)=\"delegateRefreshEvent($event)\"\n slot=\"fixed\"\n >\n <kirby-spinner></kirby-spinner>\n </ion-refresher>\n\n <!-- Page header -->\n <div class=\"page-header-container\" *ngIf=\"hasPageTitle\">\n <div\n class=\"page-header\"\n [ngClass]=\"{\n 'text-center': titleAlignment === 'center',\n 'text-right': titleAlignment === 'right'\n }\"\n >\n <div #pageTitle class=\"page-title\" [class.has-actions]=\"!!pageActionsTemplate\">\n <ng-container\n *ngTemplateOutlet=\"customTitleTemplate || defaultPageTitleTemplate\"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"pageActionsTemplate || defaultPageActionsTemplate\"\n ></ng-container>\n </div>\n <div *ngIf=\"hasPageSubtitle\" class=\"page-subtitle\">\n <ng-container\n *ngTemplateOutlet=\"customSubtitleTemplate || defaultPageSubtitleTemplate\"\n ></ng-container>\n </div>\n </div>\n </div>\n\n <!-- Sticky content -->\n <ng-container *ngIf=\"stickyContentTemplate\">\n <div\n #stickyContentContainer\n class=\"sticky-content-container\"\n [class.content-pinned]=\"isStickyContentPinned\"\n >\n <div>\n <ng-container *ngTemplateOutlet=\"stickyContentTemplate\"></ng-container>\n </div>\n </div>\n </ng-container>\n\n <!-- Content -->\n <div class=\"content-inner\">\n <ng-container\n *ngTemplateOutlet=\"customContentTemplate || defaultContentTemplate\"\n ></ng-container>\n </div>\n\n <div slot=\"fixed\" class=\"fixed-content\" *ngIf=\"fixedContentTemplate\">\n <div class=\"content-inner\">\n <ng-container *ngTemplateOutlet=\"fixedContentTemplate\"></ng-container>\n </div>\n </div>\n</ion-content>\n\n<ion-footer>\n <ng-content select=\"kirby-page-footer\"></ng-content>\n</ion-footer>\n\n<ng-template #defaultPageTitleTemplate>\n <h1 [kirbyFitHeading]=\"fitHeadingConfig\">\n <ng-container *ngTemplateOutlet=\"simpleTitleTemplate\"></ng-container>\n </h1>\n</ng-template>\n<ng-template #defaultPageSubtitleTemplate>\n <ng-container *ngTemplateOutlet=\"simpleSubtitleTemplate\"></ng-container>\n</ng-template>\n<ng-template #defaultPageActionsTemplate>\n <ng-content select=\"kirby-page-actions\"></ng-content>\n</ng-template>\n\n<ng-template #defaultContentTemplate>\n <ng-content select=\"kirby-page-content\"></ng-content>\n</ng-template>\n\n<ng-template #simpleTitleTemplate>{{ title }}</ng-template>\n<ng-template #simpleSubtitleTemplate>{{ subtitle }}</ng-template>\n<ng-template #simpleToolbarTitleTemplate>{{ toolbarTitle }}</ng-template>\n", styles: [":host{display:contents}ion-header,ion-toolbar{--background: var(--kirby-background-color);margin:0 auto}@media (min-width: 1025px) and (hover: hover) and (pointer: fine){ion-header,ion-toolbar{max-width:768px}}ion-toolbar{--border-width: 0 !important;--padding-start: 4px;--padding-end: 4px;--padding-top: 0;--padding-bottom: 0;--ion-toolbar-color: var(--kirby-black);--notch-present: clamp( 0px, var(--kirby-safe-area-top, 0px) - 32px, 1px );--min-height: clamp( 48px, (1px - var(--notch-present)) * 56, 56px );box-sizing:border-box;padding-inline:4px}@media (min-width: 721px){ion-toolbar{--min-height: 64px}}ion-toolbar.content-scrolled:before{content:\"\";position:absolute;left:0;right:0;bottom:0;height:1px;z-index:1;background-color:var(--kirby-medium)}ion-toolbar ion-buttons[slot=secondary]{order:6}ion-toolbar ion-title{opacity:0;transform:translateY(10px);transition-property:opacity,transform;transition-duration:.15s;transition-timing-function:ease}ion-toolbar ion-title.slide-and-fade-in{opacity:1;transform:translateY(0)}ion-toolbar ion-title .toolbar-title{text-overflow:ellipsis;white-space:nowrap;pointer-events:auto;overflow:hidden;font-weight:700}ion-toolbar ion-title .toolbar-title ::ng-deep>*{text-overflow:ellipsis;white-space:nowrap;pointer-events:auto;overflow:hidden}.hide{visibility:hidden;opacity:0;transition:opacity .1s linear}.hide.fade-in{visibility:inherit;opacity:1}ion-title{box-sizing:border-box;font-size:16px;font-weight:400}ion-back-button{--color: var(--kirby-black);--icon-font-size: 24px;height:40px;width:40px;opacity:1}@media (hover: hover){ion-back-button:hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);--background-hover: var(--state-layer-background-color);--background-hover-opacity: var(--state-layer-opacity)}}ion-back-button:active,ion-back-button.ion-activated{--state-layer-opacity: .16;--state-layer-background-color: var(--kirby-black);--background-activated: var(--state-layer-background-color);--background-activated-opacity: var(--state-layer-opacity)}ion-back-button::part(icon){margin-inline:0}ion-back-button::part(native){opacity:1;border-radius:999px;overflow:hidden}ion-back-button::part(native):after{transition:all 80ms linear 0ms}.page-header-container{max-width:var(--page-content-max-width, 720px);margin:0 auto}.page-header{margin-left:16px;margin-top:8px;margin-bottom:var(--kirby-page-title-margin-bottom, 40px)}.page-header .page-title.has-actions{display:flex;justify-content:space-between;align-items:flex-start}.page-header .page-title h1,.page-header .page-title h2,.page-header .page-title h3,.page-header .page-title h4,.page-header .page-title h5,.page-header .page-title h6{margin:0}.page-header .page-subtitle{margin-top:8px}.page-header.text-center{text-align:center;margin-left:0}.page-header.text-right{text-align:right}ion-content{--padding-top: 12px;--padding-start: var(--page-content-padding-start, 16px);--padding-end: var(--page-content-padding-end, 16px);--background: var(--kirby-background-color);--color: var(--kirby-black)}ion-content .content-inner{max-width:var(--page-content-max-width, 720px);margin:0 auto;padding-bottom:40px}ion-content .fixed-content{width:100%;position:absolute;bottom:0}ion-content .fixed-content .content-inner{position:relative}.sticky-content-container{position:sticky;top:-13px;left:0;right:0;margin-block-end:24px}.sticky-content-container div{max-width:var(--page-content-max-width, 720px);margin:0 auto}.sticky-content-container.content-pinned:before{content:\"\";position:absolute;left:calc(-1 * var(--page-content-padding-start, 16px));right:calc(-1 * var(--page-content-padding-end, 16px));bottom:0;height:1px;z-index:1;background-color:var(--kirby-medium)}\n"], components: [{ type: i6.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { type: i6.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { type: i6.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { type: i6.IonBackButton, selector: "ion-back-button", inputs: ["color", "defaultHref", "disabled", "icon", "mode", "routerAnimation", "text", "type"] }, { type: i6.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { type: i6.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { type: i6.IonRefresher, selector: "ion-refresher", inputs: ["closeDuration", "disabled", "pullFactor", "pullMax", "pullMin", "snapbackDuration"] }, { type: i7.SpinnerComponent, selector: "kirby-spinner" }, { type: i6.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }], directives: [{ type: i6.IonBackButtonDelegate, selector: "ion-back-button", inputs: ["defaultHref", "routerAnimation"] }, { type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i9.FitHeadingDirective, selector: "h1[kirbyFitHeading],h2[kirbyFitHeading],h3[kirbyFitHeading]", inputs: ["kirbyFitHeading"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
376
392
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: PageComponent, decorators: [{
377
393
  type: Component,
378
- args: [{ selector: 'kirby-page', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"start\">\n <ion-back-button\n text=\"\"\n [defaultHref]=\"defaultBackHref\"\n icon=\"assets/kirby/icons/svg/arrow-back.svg\"\n [style.visibility]=\"hideBackButton ? 'hidden' : null\"\n ></ion-back-button>\n </ion-buttons>\n <ion-title>\n <div class=\"toolbar-title hide\" [class.fade-in]=\"toolbarTitleVisible\">\n <ng-container *ngTemplateOutlet=\"toolbarTitleTemplate\"></ng-container>\n </div>\n </ion-title>\n <ion-buttons\n class=\"hide\"\n slot=\"primary\"\n [class.fade-in]=\"toolbarStickyActionsVisible && stickyActionsTemplate\"\n >\n <ng-container *ngTemplateOutlet=\"stickyActionsTemplate\"></ng-container>\n </ion-buttons>\n <ion-buttons\n class=\"hide\"\n slot=\"secondary\"\n [class.fade-in]=\"toolbarFixedActionsVisible && fixedActionsTemplate\"\n >\n <ng-container *ngTemplateOutlet=\"fixedActionsTemplate\"></ng-container>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content scrollEvents=\"true\" forceOverscroll=\"false\">\n <ion-refresher\n *ngIf=\"refresh.observers.length > 0\"\n (ionRefresh)=\"delegateRefreshEvent($event)\"\n slot=\"fixed\"\n >\n <kirby-spinner></kirby-spinner>\n </ion-refresher>\n\n <!-- Page header -->\n <div class=\"page-header-container\" *ngIf=\"hasPageTitle\">\n <div\n class=\"page-header\"\n [ngClass]=\"{\n 'text-center': titleAlignment === 'center',\n 'text-right': titleAlignment === 'right'\n }\"\n >\n <div #pageTitle class=\"page-title\" [class.has-actions]=\"hasActionsInPage\">\n <ng-container\n *ngTemplateOutlet=\"customTitleTemplate || defaultPageTitleTemplate\"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"pageActionsTemplate || defaultPageActionsTemplate\"\n ></ng-container>\n </div>\n <div *ngIf=\"hasPageSubtitle\" class=\"page-subtitle\">\n <ng-container\n *ngTemplateOutlet=\"customSubtitleTemplate || defaultPageSubtitleTemplate\"\n ></ng-container>\n </div>\n </div>\n </div>\n\n <!-- Sticky content -->\n <ng-container *ngIf=\"stickyContentTemplate\">\n <div class=\"sticky-content-container\">\n <div>\n <ng-container *ngTemplateOutlet=\"stickyContentTemplate\"></ng-container>\n </div>\n </div>\n </ng-container>\n\n <!-- Content -->\n <div class=\"content-inner\">\n <ng-container\n *ngTemplateOutlet=\"customContentTemplate || defaultContentTemplate\"\n ></ng-container>\n </div>\n\n <div slot=\"fixed\" class=\"fixed-content\" *ngIf=\"fixedContentTemplate\">\n <div class=\"content-inner\">\n <ng-container *ngTemplateOutlet=\"fixedContentTemplate\"></ng-container>\n </div>\n </div>\n</ion-content>\n\n<ion-footer>\n <ng-content select=\"kirby-page-footer\"></ng-content>\n</ion-footer>\n\n<ng-template #defaultPageTitleTemplate>\n <h1 [kirbyFitHeading]=\"fitHeadingConfig\">\n <ng-container *ngTemplateOutlet=\"simpleTitleTemplate\"></ng-container>\n </h1>\n</ng-template>\n<ng-template #defaultPageSubtitleTemplate>\n <ng-container *ngTemplateOutlet=\"simpleSubtitleTemplate\"></ng-container>\n</ng-template>\n<ng-template #defaultPageActionsTemplate>\n <ng-content select=\"kirby-page-actions\"></ng-content>\n</ng-template>\n\n<ng-template #defaultContentTemplate>\n <ng-content select=\"kirby-page-content\"></ng-content>\n</ng-template>\n\n<ng-template #simpleTitleTemplate>{{ title }}</ng-template>\n<ng-template #simpleSubtitleTemplate>{{ subtitle }}</ng-template>\n<ng-template #simpleToolbarTitleTemplate>{{ toolbarTitle }}</ng-template>\n", styles: ["ion-header,ion-toolbar{--background: var(--kirby-background-color);margin:0 auto}@media (min-width: 1025px) and (hover: hover) and (pointer: fine){ion-header,ion-toolbar{max-width:768px}}ion-toolbar{--border-width: 0 !important;--padding-start: 4px;--padding-end: 4px;--padding-top: 0;--padding-bottom: 0;--ion-toolbar-color: var(--kirby-black)}ion-toolbar ion-buttons[slot=secondary]{order:6}ion-toolbar ion-title .toolbar-title{text-overflow:ellipsis;white-space:nowrap;pointer-events:auto;overflow:hidden}ion-toolbar ion-title .toolbar-title ::ng-deep>*{text-overflow:ellipsis;white-space:nowrap;pointer-events:auto;overflow:hidden}.hide{visibility:hidden;opacity:0;transition:opacity .1s linear}.hide.fade-in{visibility:inherit;opacity:1}ion-title{box-sizing:border-box;font-size:16px;font-weight:400}ion-back-button{--color: var(--kirby-black);--icon-font-size: 24px;height:44px;width:44px;opacity:1}@media (hover: hover){ion-back-button:hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);--background-hover: var(--state-layer-background-color);--background-hover-opacity: var(--state-layer-opacity)}}ion-back-button:active,ion-back-button.ion-activated{--state-layer-opacity: .16;--state-layer-background-color: var(--kirby-black);--background-activated: var(--state-layer-background-color);--background-activated-opacity: var(--state-layer-opacity)}ion-back-button::part(native){opacity:1;border-radius:999px;overflow:hidden}ion-back-button::part(native):after{transition:all 80ms linear 0ms}.page-header-container{max-width:var(--page-content-max-width, 720px);margin:0 auto}.page-header{margin-left:16px;margin-top:8px;margin-bottom:var(--kirby-page-title-margin-bottom, 40px)}.page-header .page-title.has-actions{display:flex;justify-content:space-between;align-items:flex-start}.page-header .page-title h1,.page-header .page-title h2,.page-header .page-title h3,.page-header .page-title h4,.page-header .page-title h5,.page-header .page-title h6{margin:0}.page-header .page-subtitle{margin-top:8px}.page-header.text-center{text-align:center;margin-left:0}.page-header.text-right{text-align:right}ion-content{--padding-start: var(--page-content-padding-start, 16px);--padding-end: var(--page-content-padding-end, 16px);--background: var(--kirby-background-color);--color: var(--kirby-black)}ion-content .content-inner{max-width:var(--page-content-max-width, 720px);margin:0 auto;padding-bottom:40px}ion-content .fixed-content{width:100%;position:absolute;bottom:0}ion-content .fixed-content .content-inner{position:relative}.sticky-content-container{position:sticky;top:0;left:0;right:0;margin-block-end:24px}.sticky-content-container div{max-width:var(--page-content-max-width, 720px);margin:0 auto}\n"] }]
379
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i3.Router }, { type: i0.ChangeDetectorRef }, { type: i4.ModalNavigationService }, { type: i5.TabsComponent, decorators: [{
394
+ args: [{ selector: 'kirby-page', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-header>\n <ion-toolbar [class.content-scrolled]=\"!stickyContentTemplate && isContentScrolled\">\n <ion-buttons slot=\"start\">\n <ion-back-button\n text=\"\"\n [defaultHref]=\"defaultBackHref\"\n icon=\"assets/kirby/icons/svg/arrow-back.svg\"\n [style.visibility]=\"hideBackButton ? 'hidden' : null\"\n ></ion-back-button>\n </ion-buttons>\n <ion-title [class.slide-and-fade-in]=\"toolbarTitleVisible\">\n <div class=\"toolbar-title\">\n <ng-container *ngTemplateOutlet=\"toolbarTitleTemplate\"></ng-container>\n </div>\n </ion-title>\n <ion-buttons class=\"hide\" slot=\"primary\" [class.fade-in]=\"!!stickyActionsTemplate\">\n <ng-container *ngTemplateOutlet=\"stickyActionsTemplate\"></ng-container>\n </ion-buttons>\n <ion-buttons class=\"hide\" slot=\"secondary\" [class.fade-in]=\"!!fixedActionsTemplate\">\n <ng-container *ngTemplateOutlet=\"fixedActionsTemplate\"></ng-container>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content scrollEvents=\"true\" forceOverscroll=\"false\">\n <ion-refresher\n *ngIf=\"refresh.observers.length > 0\"\n (ionRefresh)=\"delegateRefreshEvent($event)\"\n slot=\"fixed\"\n >\n <kirby-spinner></kirby-spinner>\n </ion-refresher>\n\n <!-- Page header -->\n <div class=\"page-header-container\" *ngIf=\"hasPageTitle\">\n <div\n class=\"page-header\"\n [ngClass]=\"{\n 'text-center': titleAlignment === 'center',\n 'text-right': titleAlignment === 'right'\n }\"\n >\n <div #pageTitle class=\"page-title\" [class.has-actions]=\"!!pageActionsTemplate\">\n <ng-container\n *ngTemplateOutlet=\"customTitleTemplate || defaultPageTitleTemplate\"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"pageActionsTemplate || defaultPageActionsTemplate\"\n ></ng-container>\n </div>\n <div *ngIf=\"hasPageSubtitle\" class=\"page-subtitle\">\n <ng-container\n *ngTemplateOutlet=\"customSubtitleTemplate || defaultPageSubtitleTemplate\"\n ></ng-container>\n </div>\n </div>\n </div>\n\n <!-- Sticky content -->\n <ng-container *ngIf=\"stickyContentTemplate\">\n <div\n #stickyContentContainer\n class=\"sticky-content-container\"\n [class.content-pinned]=\"isStickyContentPinned\"\n >\n <div>\n <ng-container *ngTemplateOutlet=\"stickyContentTemplate\"></ng-container>\n </div>\n </div>\n </ng-container>\n\n <!-- Content -->\n <div class=\"content-inner\">\n <ng-container\n *ngTemplateOutlet=\"customContentTemplate || defaultContentTemplate\"\n ></ng-container>\n </div>\n\n <div slot=\"fixed\" class=\"fixed-content\" *ngIf=\"fixedContentTemplate\">\n <div class=\"content-inner\">\n <ng-container *ngTemplateOutlet=\"fixedContentTemplate\"></ng-container>\n </div>\n </div>\n</ion-content>\n\n<ion-footer>\n <ng-content select=\"kirby-page-footer\"></ng-content>\n</ion-footer>\n\n<ng-template #defaultPageTitleTemplate>\n <h1 [kirbyFitHeading]=\"fitHeadingConfig\">\n <ng-container *ngTemplateOutlet=\"simpleTitleTemplate\"></ng-container>\n </h1>\n</ng-template>\n<ng-template #defaultPageSubtitleTemplate>\n <ng-container *ngTemplateOutlet=\"simpleSubtitleTemplate\"></ng-container>\n</ng-template>\n<ng-template #defaultPageActionsTemplate>\n <ng-content select=\"kirby-page-actions\"></ng-content>\n</ng-template>\n\n<ng-template #defaultContentTemplate>\n <ng-content select=\"kirby-page-content\"></ng-content>\n</ng-template>\n\n<ng-template #simpleTitleTemplate>{{ title }}</ng-template>\n<ng-template #simpleSubtitleTemplate>{{ subtitle }}</ng-template>\n<ng-template #simpleToolbarTitleTemplate>{{ toolbarTitle }}</ng-template>\n", styles: [":host{display:contents}ion-header,ion-toolbar{--background: var(--kirby-background-color);margin:0 auto}@media (min-width: 1025px) and (hover: hover) and (pointer: fine){ion-header,ion-toolbar{max-width:768px}}ion-toolbar{--border-width: 0 !important;--padding-start: 4px;--padding-end: 4px;--padding-top: 0;--padding-bottom: 0;--ion-toolbar-color: var(--kirby-black);--notch-present: clamp( 0px, var(--kirby-safe-area-top, 0px) - 32px, 1px );--min-height: clamp( 48px, (1px - var(--notch-present)) * 56, 56px );box-sizing:border-box;padding-inline:4px}@media (min-width: 721px){ion-toolbar{--min-height: 64px}}ion-toolbar.content-scrolled:before{content:\"\";position:absolute;left:0;right:0;bottom:0;height:1px;z-index:1;background-color:var(--kirby-medium)}ion-toolbar ion-buttons[slot=secondary]{order:6}ion-toolbar ion-title{opacity:0;transform:translateY(10px);transition-property:opacity,transform;transition-duration:.15s;transition-timing-function:ease}ion-toolbar ion-title.slide-and-fade-in{opacity:1;transform:translateY(0)}ion-toolbar ion-title .toolbar-title{text-overflow:ellipsis;white-space:nowrap;pointer-events:auto;overflow:hidden;font-weight:700}ion-toolbar ion-title .toolbar-title ::ng-deep>*{text-overflow:ellipsis;white-space:nowrap;pointer-events:auto;overflow:hidden}.hide{visibility:hidden;opacity:0;transition:opacity .1s linear}.hide.fade-in{visibility:inherit;opacity:1}ion-title{box-sizing:border-box;font-size:16px;font-weight:400}ion-back-button{--color: var(--kirby-black);--icon-font-size: 24px;height:40px;width:40px;opacity:1}@media (hover: hover){ion-back-button:hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);--background-hover: var(--state-layer-background-color);--background-hover-opacity: var(--state-layer-opacity)}}ion-back-button:active,ion-back-button.ion-activated{--state-layer-opacity: .16;--state-layer-background-color: var(--kirby-black);--background-activated: var(--state-layer-background-color);--background-activated-opacity: var(--state-layer-opacity)}ion-back-button::part(icon){margin-inline:0}ion-back-button::part(native){opacity:1;border-radius:999px;overflow:hidden}ion-back-button::part(native):after{transition:all 80ms linear 0ms}.page-header-container{max-width:var(--page-content-max-width, 720px);margin:0 auto}.page-header{margin-left:16px;margin-top:8px;margin-bottom:var(--kirby-page-title-margin-bottom, 40px)}.page-header .page-title.has-actions{display:flex;justify-content:space-between;align-items:flex-start}.page-header .page-title h1,.page-header .page-title h2,.page-header .page-title h3,.page-header .page-title h4,.page-header .page-title h5,.page-header .page-title h6{margin:0}.page-header .page-subtitle{margin-top:8px}.page-header.text-center{text-align:center;margin-left:0}.page-header.text-right{text-align:right}ion-content{--padding-top: 12px;--padding-start: var(--page-content-padding-start, 16px);--padding-end: var(--page-content-padding-end, 16px);--background: var(--kirby-background-color);--color: var(--kirby-black)}ion-content .content-inner{max-width:var(--page-content-max-width, 720px);margin:0 auto;padding-bottom:40px}ion-content .fixed-content{width:100%;position:absolute;bottom:0}ion-content .fixed-content .content-inner{position:relative}.sticky-content-container{position:sticky;top:-13px;left:0;right:0;margin-block-end:24px}.sticky-content-container div{max-width:var(--page-content-max-width, 720px);margin:0 auto}.sticky-content-container.content-pinned:before{content:\"\";position:absolute;left:calc(-1 * var(--page-content-padding-start, 16px));right:calc(-1 * var(--page-content-padding-end, 16px));bottom:0;height:1px;z-index:1;background-color:var(--kirby-medium)}\n"] }]
395
+ }], ctorParameters: function () { return [{ type: i3.Router }, { type: i0.ChangeDetectorRef }, { type: i4.ModalNavigationService }, { type: i5.TabsComponent, decorators: [{
380
396
  type: Optional
381
397
  }, {
382
398
  type: SkipSelf
@@ -422,6 +438,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.9", ngImpor
422
438
  }], pageTitle: [{
423
439
  type: ViewChild,
424
440
  args: ['pageTitle', { static: false, read: ElementRef }]
441
+ }], stickyContentContainer: [{
442
+ type: ViewChild,
443
+ args: ['stickyContentContainer', { static: false, read: ElementRef }]
425
444
  }], simpleTitleTemplate: [{
426
445
  type: ViewChild,
427
446
  args: ['simpleTitleTemplate', { static: true, read: TemplateRef }]
@@ -456,4 +475,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.9", ngImpor
456
475
  type: HostListener,
457
476
  args: [`window:${selectedTabClickEvent}`]
458
477
  }] } });
459
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Rlc2lnbnN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvcGFnZS9wYWdlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvZGVzaWduc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9wYWdlL3BhZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBSUwsUUFBUSxFQUNSLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxFQUVULFFBQVEsRUFDUixXQUFXLEVBQ1gsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBZSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pGLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFakUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDdkYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDcEYsT0FBTyxFQUNMLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsZ0JBQWdCLEdBQ2pCLE1BQU0s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QixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVduRCxtQkFBbUI7c0JBRGxCLFlBQVk7dUJBQUMseUJBQXlCO2dCQU12QyxtQkFBbUI7c0JBRGxCLFlBQVk7dUJBQUMsVUFBVSxxQkFBcUIsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudENoZWNrZWQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgU2tpcFNlbGYsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkVuZCwgTmF2aWdhdGlvblN0YXJ0LCBSb3V0ZXIsIFJvdXRlckV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IElvbkJhY2tCdXR0b25EZWxlZ2F0ZSwgSW9uQ29udGVudCwgSW9uRm9vdGVyLCBJb25IZWFkZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgS2lyYnlBbmltYXRpb24gfSBmcm9tICcuLi8uLi9hbmltYXRpb24va2lyYnktYW5pbWF0aW9uJztcbmltcG9ydCB7IEZpdEhlYWRpbmdDb25maWcgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2ZpdC1oZWFkaW5nL2ZpdC1oZWFkaW5nLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBNb2RhbFdyYXBwZXJDb21wb25lbnQgfSBmcm9tICcuLi9tb2RhbC9tb2RhbC13cmFwcGVyL21vZGFsLXdyYXBwZXIuY29tcG9uZW50JztcbmltcG9ydCB7IE1vZGFsTmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9tb2RhbC9zZXJ2aWNlcy9tb2RhbC1uYXZpZ2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgTW9kYWxFbGVtZW50Q29tcG9uZW50LFxuICBNb2RhbEVsZW1lbnRzQWR2ZXJ0aXNlcixcbiAgTW9kYWxFbGVtZW50VHlwZSxcbn0gZnJvbSAnLi4vbW9kYWwvc2VydmljZXMvbW9kYWwuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBzZWxlY3RlZFRhYkNsaWNrRXZlbnQgfSBmcm9tICcuLi90YWJzL3RhYi1idXR0b24vdGFiLWJ1dHRvbi5ldmVudHMnO1xuaW1wb3J0IHsgVGFic0NvbXBvbmVudCB9IGZyb20gJy4uL3RhYnMvdGFicy5jb21wb25lbnQnO1xuXG50eXBlIHN0aWNreUNvbmZpZyA9IHsgc3RpY2t5OiBib29sZWFuIH07XG50eXBlIGZpeGVkQ29uZmlnID0geyBmaXhlZDogYm9vbGVhbiB9O1xuXG4vKipcbiAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBcInB1bGwtdG8tcmVmcmVzaFwiIGJlZ2lucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQdWxsVG9SZWZyZXNoRXZlbnQge1xuICAvKipcbiAgICogSW52b2tlIHRoaXMgY2FsbGJhY2stbWV0aG9kIHdoZW4gYWN0aW9uIHRvIHBlcmZvcm0gdXBvbiBcInB1bGwtdG8tcmVmcmVzaFwiIGNvbXBsZXRlcy5cbiAgICovXG4gIGNvbXBsZXRlKCk7XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1traXJieVBhZ2VUaXRsZV0nLFxufSlcbmV4cG9ydCBjbGFzcyBQYWdlVGl0bGVEaXJlY3RpdmUge31cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2tpcmJ5UGFnZVN1YnRpdGxlXScsXG59KVxuZXhwb3J0IGNsYXNzIFBhZ2VTdWJ0aXRsZURpcmVjdGl2ZSB7fVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdba2lyYnlQYWdlVG9vbGJhclRpdGxlXScsXG59KVxuZXhwb3J0IGNsYXNzIFBhZ2VUb29sYmFyVGl0bGVEaXJlY3RpdmUge31cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2tpcmJ5UGFnZUFjdGlvbnNdJyxcbn0pXG5leHBvcnQgY2xhc3MgUGFnZUFjdGlvbnNEaXJlY3RpdmUge1xuICBASW5wdXQoJ2tpcmJ5UGFnZUFjdGlvbnMnKSBjb25maWc6IHN0aWNreUNvbmZpZyB8IGZpeGVkQ29uZmlnO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0aWNreURlZmF1bHQgPSB0cnVlO1xuICBwcml2YXRlIHJlYWRvbmx5IGZpeGVkRGVmYXVsdCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55Pikge31cblxuICBnZXQgaXNTdGlja3koKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnID8gKHRoaXMuY29uZmlnIGFzIHN0aWNreUNvbmZpZykuc3RpY2t5IDogdGhpcy5zdGlja3lEZWZhdWx0O1xuICB9XG5cbiAgZ2V0IGlzRml4ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnID8gKHRoaXMuY29uZmlnIGFzIGZpeGVkQ29uZmlnKS5maXhlZCA6IHRoaXMuZml4ZWREZWZhdWx0O1xuICB9XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1traXJieVBhZ2VDb250ZW50XScsXG59KVxuZXhwb3J0IGNsYXNzIFBhZ2VDb250ZW50RGlyZWN0aXZlIHtcbiAgQElucHV0KCdraXJieVBhZ2VDb250ZW50JykgY29uZmlnOiBmaXhlZENvbmZpZztcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pIHt9XG5cbiAgZ2V0IGlzRml4ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmZpeGVkO1xuICB9XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1traXJieVBhZ2VTdGlja3lDb250ZW50XScsXG59KVxuZXhwb3J0IGNsYXNzIFBhZ2VTdGlja3lDb250ZW50RGlyZWN0aXZlIHt9XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2tpcmJ5LXBhZ2UtcHJvZ3Jlc3MnLFxuICB0ZW1wbGF0ZTogYCA8bmctY29udGVudD48L25nLWNvbnRlbnQ+IGAsXG4gIHN0eWxlczogWyc6aG9zdCB7ZGlzcGxheTogZmxleH0nXSxcbn0pXG5leHBvcnQgY2xhc3MgUGFnZVByb2dyZXNzQ29tcG9uZW50IGV4dGVuZHMgTW9kYWxFbGVtZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLy8gVE9ETzogRmluZCBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggYWxpZ25zIHdpdGggZnV0dXJlIHBhZ2UgY29uZmlndXJhdGlvbiAvIGNvbnN1bXB0aW9uXG4gIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gd2FzIGNob3NlbiBvdmVyIGV4cGFuZGluZyBgbW92ZUNoaWxkYCBtZXRob2QgaW4gY29tcG9uZW50IHdyYXBwZXIgd2l0aCB5ZXQgYW5vdGhlciBzY2VuYXJpb1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuc2xvdCcpIHNsb3QgPSAnc3RhcnQnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpIHByaXZhdGUgbW9kYWxXcmFwcGVyOiBNb2RhbFdyYXBwZXJDb21wb25lbnQsXG4gICAgQE9wdGlvbmFsKCkgbW9kYWxFbGVtZW50c0FkdmVydGlzZXI6IE1vZGFsRWxlbWVudHNBZHZlcnRpc2VyLFxuICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+XG4gICkge1xuICAgIHN1cGVyKE1vZGFsRWxlbWVudFR5cGUuUEFHRV9QUk9HUkVTUywgZWxlbWVudFJlZiwgbW9kYWxFbGVtZW50c0FkdmVydGlzZXIpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kYWxXcmFwcGVyICYmIHRoaXMubW9kYWxXcmFwcGVyLmNvbmZpZy5mbGF2b3IgPT09ICdkcmF3ZXInKSB7XG4gICAgICB0aGlzLnNsb3QgPSAnZW5kJztcbiAgICB9XG4gIH1cbn1cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2tpcmJ5LXBhZ2UtdGl0bGUnLFxuICB0ZW1wbGF0ZTogYCA8bmctY29udGVudD48L25nLWNvbnRlbnQ+IGAsXG59KVxuZXhwb3J0IGNsYXNzIFBhZ2VUaXRsZUNvbXBvbmVudCBleHRlbmRzIE1vZGFsRWxlbWVudENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgIEBPcHRpb25hbCgpIG1vZGFsRWxlbWVudHNBZHZlcnRpc2VyOiBNb2RhbEVsZW1lbnRzQWR2ZXJ0aXNlclxuICApIHtcbiAgICBzdXBlcihNb2RhbEVsZW1lbnRUeXBlLlRJVExFLCBlbGVtZW50UmVmLCBtb2RhbEVsZW1lbnRzQWR2ZXJ0aXNlcik7XG4gIH1cbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAna2lyYnktcGFnZS1jb250ZW50JyxcbiAgdGVtcGxhdGU6IGAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PiBgLFxufSlcbmV4cG9ydCBjbGFzcyBQYWdlQ29udGVudENvbXBvbmVudCB7fVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdraXJieS1wYWdlLWFjdGlvbnMnLFxuICB0ZW1wbGF0ZTogYCA8bmctY29udGVudCBzZWxlY3Q9XCJidXR0b25ba2lyYnktYnV0dG9uXVwiPjwvbmctY29udGVudD4gYCxcbn0pXG5leHBvcnQgY2xhc3MgUGFnZUFjdGlvbnNDb21wb25lbnQge31cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAna2lyYnktcGFnZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9wYWdlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcGFnZS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgUGFnZUNvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0LCBBZnRlckNvbnRlbnRDaGVja2VkLCBPbkNoYW5nZXNcbntcbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZztcbiAgQElucHV0KCkgc3VidGl0bGU6IHN0cmluZztcbiAgQElucHV0KCkgdG9vbGJhclRpdGxlOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRpdGxlQWxpZ25tZW50OiAnbGVmdCcgfCAnY2VudGVyJyB8ICdyaWdodCcgPSAnbGVmdCc7XG4gIEBJbnB1dCgpIGRlZmF1bHRCYWNrSHJlZjogc3RyaW5nO1xuICBASW5wdXQoKSBoaWRlQmFja0J1dHRvbjogYm9vbGVhbjtcbiAgQElucHV0KCkgdGl0bGVNYXhMaW5lczogbnVtYmVyO1xuXG4gIHByaXZhdGUgX3RhYkJhckJvdHRvbUhpZGRlbjogYm9vbGVhbjtcbiAgcHVibGljIGdldCB0YWJCYXJCb3R0b21IaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYkJhckJvdHRvbUhpZGRlbjtcbiAgfVxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHRhYkJhckJvdHRvbUhpZGRlbih2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLnRhYnNDb21wb25lbnQpIHtcbiAgICAgIC8vIGFzIHdlIGFyZSBzZXR0aW5nIGEgY2xhc3Mgb24gdGFicywgd2UgbmVlZCB0aGlzIHRvIGhhcHBlbiBpbiBhIHNlcGFyYXRlIGNkIGN5Y2xlXG4gICAgICBzZXRUaW1lb3V0KCgpID0+ICh0aGlzLnRhYnNDb21wb25lbnQudGFiQmFyQm90dG9tSGlkZGVuID0gdmFsdWUpKTtcbiAgICB9XG4gICAgdGhpcy5fdGFiQmFyQm90dG9tSGlkZGVuID0gdmFsdWU7XG4gIH1cblxuICBAT3V0cHV0KCkgZW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBsZWF2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHJlZnJlc2ggPSBuZXcgRXZlbnRFbWl0dGVyPFB1bGxUb1JlZnJlc2hFdmVudD4oKTtcbiAgQE91dHB1dCgpIGJhY2tCdXR0b25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG5cbiAgQFZpZXdDaGlsZChJb25Db250ZW50LCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIGNvbnRlbnQ/OiBJb25Db250ZW50O1xuICBAVmlld0NoaWxkKElvbkNvbnRlbnQsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBFbGVtZW50UmVmIH0pXG4gIHByaXZhdGUgaW9uQ29udGVudEVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTElvbkNvbnRlbnRFbGVtZW50PjtcbiAgQFZpZXdDaGlsZChJb25IZWFkZXIsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBFbGVtZW50UmVmIH0pXG4gIGlvbkhlYWRlckVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTElvbkhlYWRlckVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKElvbkZvb3RlciwgeyBzdGF0aWM6IHRydWUsIHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgcHJpdmF0ZSBpb25Gb290ZXJFbGVtZW50OiBFbGVtZW50UmVmPEhUTUxJb25Gb290ZXJFbGVtZW50PjtcblxuICBAVmlld0NoaWxkKElvbkJhY2tCdXR0b25EZWxlZ2F0ZSwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHByaXZhdGUgYmFja0J1dHRvbkRlbGVnYXRlOiBJb25CYWNrQnV0dG9uRGVsZWdhdGU7XG4gIEBWaWV3Q2hpbGQoJ3BhZ2VUaXRsZScsIHsgc3RhdGljOiBmYWxzZSwgcmVhZDogRWxlbWVudFJlZiB9KVxuICBwcml2YXRlIHBhZ2VUaXRsZTogRWxlbWVudFJlZjtcblxuICBAVmlld0NoaWxkKCdzaW1wbGVUaXRsZVRlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUsIHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIHByaXZhdGUgc2ltcGxlVGl0bGVUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgQFZpZXdDaGlsZCgnc2ltcGxlVG9vbGJhclRpdGxlVGVtcGxhdGUnLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgcHJpdmF0ZSBzaW1wbGVUb29sYmFyVGl0bGVUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgQENvbnRlbnRDaGlsZChQYWdlVG9vbGJhclRpdGxlRGlyZWN0aXZlLCB7IHN0YXRpYzogZmFsc2UsIHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIHByaXZhdGUgY3VzdG9tVG9vbGJhclRpdGxlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoUGFnZVRpdGxlRGlyZWN0aXZlLCB7IHN0YXRpYzogZmFsc2UsIHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIGN1c3RvbVRpdGxlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoUGFnZVN1YnRpdGxlRGlyZWN0aXZlLCB7IHN0YXRpYzogZmFsc2UsIHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIGN1c3RvbVN1YnRpdGxlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGRyZW4oUGFnZUFjdGlvbnNEaXJlY3RpdmUpXG4gIGN1c3RvbUFjdGlvbnM6IFF1ZXJ5TGlzdDxQYWdlQWN0aW9uc0RpcmVjdGl2ZT47XG4gIEBDb250ZW50Q2hpbGRyZW4oUGFnZUNvbnRlbnREaXJlY3RpdmUpXG4gIHByaXZhdGUgY3VzdG9tQ29udGVudDogUXVlcnlMaXN0PFBhZ2VDb250ZW50RGlyZWN0aXZlPjtcbiAgQENvbnRlbnRDaGlsZChQYWdlU3RpY2t5Q29udGVudERpcmVjdGl2ZSwgeyBzdGF0aWM6IGZhbHNlLCByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBwcml2YXRlIHN0aWNreUNvbnRlbnRSZWY6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgaGFzUGFnZVRpdGxlOiBib29sZWFuO1xuICBoYXNQYWdlU3VidGl0bGU6IGJvb2xlYW47XG4gIGhhc0FjdGlvbnNJblBhZ2U6IGJvb2xlYW47XG4gIHRvb2xiYXJUaXRsZVZpc2libGU6IGJvb2xlYW47XG4gIHRvb2xiYXJGaXhlZEFjdGlvbnNWaXNpYmxlOiBib29sZWFuO1xuICB0b29sYmFyU3RpY2t5QWN0aW9uc1Zpc2libGU6IGJvb2xlYW47XG5cbiAgZml0SGVhZGluZ0NvbmZpZzogRml0SGVhZGluZ0NvbmZpZztcblxuICB0b29sYmFyVGl0bGVUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgY3VzdG9tQ29udGVudFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBwYWdlQWN0aW9uc1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBmaXhlZENvbnRlbnRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgc3RpY2t5QWN0aW9uc1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBmaXhlZEFjdGlvbnNUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgc3RpY2t5Q29udGVudFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxQYWdlU3RpY2t5Q29udGVudERpcmVjdGl2ZT47XG5cbiAgcHJpdmF0ZSBwYWdlVGl0bGVJbnRlcnNlY3Rpb25PYnNlcnZlclJlZjogSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPVxuICAgIHRoaXMucGFnZVRpdGxlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKTtcblxuICBwcml2YXRlIHVybDogc3RyaW5nO1xuICBwcml2YXRlIGlzQWN0aXZlOiBib29sZWFuO1xuXG4gIHByaXZhdGUgbmdPbkRlc3Ryb3kkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBuYXZpZ2F0aW9uU3RhcnQkOiBPYnNlcnZhYmxlPFJvdXRlckV2ZW50PiA9IHRoaXMucm91dGVyLmV2ZW50cy5waXBlKFxuICAgIHRha2VVbnRpbCh0aGlzLm5nT25EZXN0cm95JCksXG4gICAgZmlsdGVyKChldmVudDogUm91dGVyRXZlbnQpID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0KVxuICApO1xuXG4gIHByaXZhdGUgbmF2aWdhdGlvbkVuZCQ6IE9ic2VydmFibGU8Um91dGVyRXZlbnQ+ID0gdGhpcy5yb3V0ZXIuZXZlbnRzLnBpcGUoXG4gICAgdGFrZVVudGlsKHRoaXMubmdPbkRlc3Ryb3kkKSxcbiAgICBmaWx0ZXIoKGV2ZW50OiBSb3V0ZXJFdmVudCkgPT4gZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKVxuICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIG1vZGFsTmF2aWdhdGlvblNlcnZpY2U6IE1vZGFsTmF2aWdhdGlvblNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgQFNraXBTZWxmKCkgcHJpdmF0ZSB0YWJzQ29tcG9uZW50OiBUYWJzQ29tcG9uZW50XG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZVdyYXBwZXIoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy50aXRsZU1heExpbmVzKSB7XG4gICAgICB0aGlzLmZpdEhlYWRpbmdDb25maWcgPSB7XG4gICAgICAgIC4uLnRoaXMuZml0SGVhZGluZ0NvbmZpZyxcbiAgICAgICAgbWF4TGluZXM6IGNoYW5nZXMudGl0bGVNYXhMaW5lcy5jdXJyZW50VmFsdWUsXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5zdWJ0aXRsZSAmJiAhY2hhbmdlcy5zdWJ0aXRsZS5pc0ZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLnN1YnRpdGxlID0gY2hhbmdlcy50aXRsZS5jdXJyZW50VmFsdWU7XG4gICAgICB0aGlzLmhhc1BhZ2VTdWJ0aXRsZSA9IHRoaXMuc3VidGl0bGUgIT09IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgLy8gVGhpcyBpbnN0YW5jZSBoYXMgb2JzZXJ2ZWQgYSBwYWdlIGVudGVyIHNvIHJlZ2lzdGVyIHRoZSBjb3JyZWN0IHVybCBmb3IgdGhpcyBpbnN0YW5jZVxuICAgIHRoaXMudXJsID0gdGhpcy5yb3V0ZXIudXJsO1xuICAgIHRoaXMub25FbnRlcigpO1xuXG4gICAgLy8gV2F0Y2ggbmF2aWdhdGlvbiBldmVudHMgZm9yIHBhZ2UgZW50ZXIgYW5kIGxlYXZlXG4gICAgdGhpcy5uYXZpZ2F0aW9uU3RhcnQkLnN1YnNjcmliZSgoZXZlbnQ6IE5hdmlnYXRpb25TdGFydCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBldmVudC51cmwgIT09IHRoaXMudXJsICYmXG4gICAgICAgICF0aGlzLm1vZGFsTmF2aWdhdGlvblNlcnZpY2UuaXNNb2RhbFJvdXRlKHRoaXMudXJsKSAmJlxuICAgICAgICAhdGhpcy5tb2RhbE5hdmlnYXRpb25TZXJ2aWNlLmlzTW9kYWxSb3V0ZShldmVudC51cmwpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5vbkxlYXZlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm5hdmlnYXRpb25FbmQkLnN1YnNjcmliZSgoZXZlbnQ6IE5hdmlnYXRpb25FbmQpID0+IHtcbiAgICAgIGlmIChldmVudC51cmxBZnRlclJlZGlyZWN0cyA9PT0gdGhpcy51cmwpIHtcbiAgICAgICAgdGhpcy5vbkVudGVyKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmludGVyY2VwdEJhY2tCdXR0b25DbGlja3NTZXR1cCgpO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRDaGVja2VkKCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdGlhbGl6ZVRpdGxlKCk7XG4gICAgdGhpcy5pbml0aWFsaXplQWN0aW9ucygpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNvbnRlbnQoKTtcbiAgICB0aGlzLmluaXRpYWxpemVTdGlja3lDb250ZW50KCk7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm5nT25EZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5uZ09uRGVzdHJveSQuY29tcGxldGUoKTtcblxuICAgIHRoaXMucGFnZVRpdGxlSW50ZXJzZWN0aW9uT2JzZXJ2ZXJSZWYuZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgZGVsZWdhdGVSZWZyZXNoRXZlbnQoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMucmVmcmVzaC5lbWl0KHtcbiAgICAgIGNvbXBsZXRlOiBldmVudC50YXJnZXQuY29tcGxldGUuYmluZChldmVudC50YXJnZXQpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkVudGVyKCkge1xuICAgIGlmICh0aGlzLmlzQWN0aXZlKSByZXR1cm47XG4gICAgdGhpcy5pc0FjdGl2ZSA9IHRydWU7XG5cbiAgICB0aGlzLmVudGVyLmVtaXQoKTtcbiAgICBpZiAodGhpcy5wYWdlVGl0bGUpIHtcbiAgICAgIHRoaXMucGFnZVRpdGxlSW50ZXJzZWN0aW9uT2JzZXJ2ZXJSZWYub2JzZXJ2ZSh0aGlzLnBhZ2VUaXRsZS5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uTGVhdmUoKSB7XG4gICAgaWYgKCF0aGlzLmlzQWN0aXZlKSByZXR1cm47XG4gICAgdGhpcy5pc0FjdGl2ZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5sZWF2ZS5lbWl0KCk7XG4gICAgaWYgKHRoaXMucGFnZVRpdGxlKSB7XG4gICAgICB0aGlzLnBhZ2VUaXRsZUludGVyc2VjdGlvbk9ic2VydmVyUmVmLnVub2JzZXJ2ZSh0aGlzLnBhZ2VUaXRsZS5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50YWJCYXJCb3R0b21IaWRkZW4gJiYgdGhpcy50YWJzQ29tcG9uZW50KSB7XG4gICAgICB0aGlzLnRhYnNDb21wb25lbnQudGFiQmFyQm90dG9tSGlkZGVuID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbnRlcmNlcHRCYWNrQnV0dG9uQ2xpY2tzU2V0dXAoKSB7XG4gICAgLy8gSW50ZXJjZXB0IGJhY2stYnV0dG9uIGNsaWNrIGV2ZW50cywgZGVmYXVsdGluZyB0byB0aGUgYnVpbHQtaW4gY2xpY2staGFuZGxlci5cbiAgICBpZiAodGhpcy5iYWNrQnV0dG9uQ2xpY2sub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5iYWNrQnV0dG9uQ2xpY2tcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdPbkRlc3Ryb3kkKSlcbiAgICAgICAgLnN1YnNjcmliZSh0aGlzLmJhY2tCdXR0b25EZWxlZ2F0ZS5vbkNsaWNrLmJpbmQodGhpcy5iYWNrQnV0dG9uRGVsZWdhdGUpKTtcbiAgICB9XG4gICAgdGhpcy5iYWNrQnV0dG9uRGVsZWdhdGUub25DbGljayA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgIHRoaXMuYmFja0J1dHRvbkNsaWNrLmVtaXQoZXZlbnQpO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVUaXRsZSgpIHtcbiAgICAvLyBFbnN1cmVzIGluaXRpYWxpemVUaXRsZSgpIHdvbid0IHJ1biwgaWYgYWxyZWFkeSBpbml0aWFsaXplZFxuICAgIGlmICh0aGlzLmhhc1BhZ2VUaXRsZSkgcmV0dXJuO1xuICAgIHRoaXMuaGFzUGFnZVRpdGxlID0gdGhpcy50aXRsZSAhPT0gdW5kZWZpbmVkIHx8ICEhdGhpcy5jdXN0b21UaXRsZVRlbXBsYXRlO1xuICAgIHRoaXMudG9vbGJhclRpdGxlVmlzaWJsZSA9ICF0aGlzLmhhc1BhZ2VUaXRsZTtcbiAgICB0aGlzLmhhc1BhZ2VTdWJ0aXRsZSA9IHRoaXMuc3VidGl0bGUgIT09IHVuZGVmaW5lZCB8fCAhIXRoaXMuY3VzdG9tU3VidGl0bGVUZW1wbGF0ZTtcblxuICAgIGlmICh0aGlzLmhhc1BhZ2VUaXRsZSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucGFnZVRpdGxlSW50ZXJzZWN0aW9uT2JzZXJ2ZXJSZWYub2JzZXJ2ZSh0aGlzLnBhZ2VUaXRsZS5uYXRpdmVFbGVtZW50KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRUaXRsZVRlbXBsYXRlID0gdGhpcy5jdXN0b21UaXRsZVRlbXBsYXRlIHx8IHRoaXMuc2ltcGxlVGl0bGVUZW1wbGF0ZTtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIHRoaXMudG9vbGJhclRpdGxlVGVtcGxhdGUgPSB0aGlzLmN1c3RvbVRvb2xiYXJUaXRsZVRlbXBsYXRlXG4gICAgICA/IHRoaXMuY3VzdG9tVG9vbGJhclRpdGxlVGVtcGxhdGVcbiAgICAgIDogdHlwZW9mIHRoaXMudG9vbGJhclRpdGxlID09PSAnc3RyaW5nJ1xuICAgICAgICA/IHRoaXMuc2ltcGxlVG9vbGJhclRpdGxlVGVtcGxhdGVcbiAgICAgICAgOiBkZWZhdWx0VGl0bGVUZW1wbGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUFjdGlvbnMoKSB7XG4gICAgdGhpcy5jdXN0b21BY3Rpb25zLmZvckVhY2goKHBhZ2VBY3Rpb24pID0+IHtcbiAgICAgIGlmIChwYWdlQWN0aW9uLmlzRml4ZWQpIHtcbiAgICAgICAgdGhpcy5maXhlZEFjdGlvbnNUZW1wbGF0ZSA9IHBhZ2VBY3Rpb24udGVtcGxhdGU7XG4gICAgICAgIHRoaXMudG9vbGJhckZpeGVkQWN0aW9uc1Zpc2libGUgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wYWdlQWN0aW9uc1RlbXBsYXRlID0gcGFnZUFjdGlvbi50ZW1wbGF0ZTtcbiAgICAgICAgaWYgKHBhZ2VBY3Rpb24uaXNTdGlja3kpIHtcbiAgICAgICAgICB0aGlzLnN0aWNreUFjdGlvbnNUZW1wbGF0ZSA9IHBhZ2VBY3Rpb24udGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmhhc0FjdGlvbnNJblBhZ2UgPSAhIXRoaXMucGFnZUFjdGlvbnNUZW1wbGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNvbnRlbnQoKSB7XG4gICAgdGhpcy5jdXN0b21Db250ZW50LmZvckVhY2goKGNvbnRlbnQpID0+IHtcbiAgICAgIGlmIChjb250ZW50LmlzRml4ZWQpIHtcbiAgICAgICAgdGhpcy5maXhlZENvbnRlbnRUZW1wbGF0ZSA9IGNvbnRlbnQudGVtcGxhdGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmN1c3RvbUNvbnRlbnRUZW1wbGF0ZSA9IGNvbnRlbnQudGVtcGxhdGU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVTdGlja3lDb250ZW50KCkge1xuICAgIHRoaXMuc3RpY2t5Q29udGVudFRlbXBsYXRlID0gdGhpcy5zdGlja3lDb250ZW50UmVmO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVXcmFwcGVyKCkge1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnBhcmVudE5vZGU7XG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZChwYXJlbnQsIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHBhcmVudCwgdGhpcy5pb25IZWFkZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQocGFyZW50LCB0aGlzLmlvbkNvbnRlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQocGFyZW50LCB0aGlzLmlvbkZvb3RlckVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG4gIH1cblxuICBwcml2YXRlIHBhZ2VUaXRsZUludGVyc2VjdGlvbk9ic2VydmVyKCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICByb290TWFyZ2luOiAnMHB4JyxcbiAgICB9O1xuXG4gICAgbGV0IGluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgY29uc3QgY2FsbGJhY2sgPSAoZW50cmllcykgPT4ge1xuICAgICAgaWYgKGluaXRpYWxpemVkKSB7XG4gICAgICAgIHRoaXMudG9vbGJhclRpdGxlVmlzaWJsZSA9ICFlbnRyaWVzWzBdLmlzSW50ZXJzZWN0aW5nO1xuICAgICAgICB0aGlzLnRvb2xiYXJTdGlja3lBY3Rpb25zVmlzaWJsZSA9ICFlbnRyaWVzWzBdLmlzSW50ZXJzZWN0aW5nO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoY2FsbGJhY2ssIG9wdGlvbnMpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleWJvYXJkV2lsbFNob3cnLCBbJyRldmVudCddKVxuICBfb25LZXlib2FyZFdpbGxTaG93KGluZm8/OiB7IGtleWJvYXJkSGVpZ2h0OiBudW1iZXIgfSkge1xuICAgIGlmIChpbmZvICYmIGluZm8ua2V5Ym9hcmRIZWlnaHQpIHtcbiAgICAgIHRoaXMuaW9uQ29udGVudEVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcbiAgICAgICAgJy0ta2V5Ym9hcmQtb2Zmc2V0JyxcbiAgICAgICAgYCR7aW5mby5rZXlib2FyZEhlaWdodH1weGBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleWJvYXJkV2lsbEhpZGUnKVxuICBfb25LZXlib2FyZFdpbGxIaWRlKCkge1xuICAgIHRoaXMuaW9uQ29udGVudEVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1rZXlib2FyZC1vZmZzZXQnLCAnMHB4Jyk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKGB3aW5kb3c6JHtzZWxlY3RlZFRhYkNsaWNrRXZlbnR9YClcbiAgX29uU2VsZWN0ZWRUYWJDbGljaygpIHtcbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICB0aGlzLmNvbnRlbnQuc2Nyb2xsVG9Ub3AoS2lyYnlBbmltYXRpb24uRHVyYXRpb24uTE9ORyk7XG4gICAgfVxuICB9XG59XG4iLCI8aW9uLWhlYWRlcj5cbiAgPGlvbi10b29sYmFyPlxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwic3RhcnRcIj5cbiAgICAgIDxpb24tYmFjay1idXR0b25cbiAgICAgICAgdGV4dD1cIlwiXG4gICAgICAgIFtkZWZhdWx0SHJlZl09XCJkZWZhdWx0QmFja0hyZWZcIlxuICAgICAgICBpY29uPVwiYXNzZXRzL2tpcmJ5L2ljb25zL3N2Zy9hcnJvdy1iYWNrLnN2Z1wiXG4gICAgICAgIFtzdHlsZS52aXNpYmlsaXR5XT1cImhpZGVCYWNrQnV0dG9uID8gJ2hpZGRlbicgOiBudWxsXCJcbiAgICAgID48L2lvbi1iYWNrLWJ1dHRvbj5cbiAgICA8L2lvbi1idXR0b25zPlxuICAgIDxpb24tdGl0bGU+XG4gICAgICA8ZGl2IGNsYXNzPVwidG9vbGJhci10aXRsZSBoaWRlXCIgW2NsYXNzLmZhZGUtaW5dPVwidG9vbGJhclRpdGxlVmlzaWJsZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidG9vbGJhclRpdGxlVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvaW9uLXRpdGxlPlxuICAgIDxpb24tYnV0dG9uc1xuICAgICAgY2xhc3M9XCJoaWRlXCJcbiAgICAgIHNsb3Q9XCJwcmltYXJ5XCJcbiAgICAgIFtjbGFzcy5mYWRlLWluXT1cInRvb2xiYXJTdGlja3lBY3Rpb25zVmlzaWJsZSAmJiBzdGlja3lBY3Rpb25zVGVtcGxhdGVcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzdGlja3lBY3Rpb25zVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2lvbi1idXR0b25zPlxuICAgIDxpb24tYnV0dG9uc1xuICAgICAgY2xhc3M9XCJoaWRlXCJcbiAgICAgIHNsb3Q9XCJzZWNvbmRhcnlcIlxuICAgICAgW2NsYXNzLmZhZGUtaW5dPVwidG9vbGJhckZpeGVkQWN0aW9uc1Zpc2libGUgJiYgZml4ZWRBY3Rpb25zVGVtcGxhdGVcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmaXhlZEFjdGlvbnNUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvaW9uLWJ1dHRvbnM+XG4gIDwvaW9uLXRvb2xiYXI+XG48L2lvbi1oZWFkZXI+XG5cbjxpb24tY29udGVudCBzY3JvbGxFdmVudHM9XCJ0cnVlXCIgZm9yY2VPdmVyc2Nyb2xsPVwiZmFsc2VcIj5cbiAgPGlvbi1yZWZyZXNoZXJcbiAgICAqbmdJZj1cInJlZnJlc2gub2JzZXJ2ZXJzLmxlbmd0aCA+IDBcIlxuICAgIChpb25SZWZyZXNoKT1cImRlbGVnYXRlUmVmcmVzaEV2ZW50KCRldmVudClcIlxuICAgIHNsb3Q9XCJmaXhlZFwiXG4gID5cbiAgICA8a2lyYnktc3Bpbm5lcj48L2tpcmJ5LXNwaW5uZXI+XG4gIDwvaW9uLXJlZnJlc2hlcj5cblxuICA8IS0tIFBhZ2UgaGVhZGVyIC0tPlxuICA8ZGl2IGNsYXNzPVwicGFnZS1oZWFkZXItY29udGFpbmVyXCIgKm5nSWY9XCJoYXNQYWdlVGl0bGVcIj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInBhZ2UtaGVhZGVyXCJcbiAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgJ3RleHQtY2VudGVyJzogdGl0bGVBbGlnbm1lbnQgPT09ICdjZW50ZXInLFxuICAgICAgICAndGV4dC1yaWdodCc6IHRpdGxlQWxpZ25tZW50ID09PSAncmlnaHQnXG4gICAgICB9XCJcbiAgICA+XG4gICAgICA8ZGl2ICNwYWdlVGl0bGUgY2xhc3M9XCJwYWdlLXRpdGxlXCIgW2NsYXNzLmhhcy1hY3Rpb25zXT1cImhhc0FjdGlvbnNJblBhZ2VcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tVGl0bGVUZW1wbGF0ZSB8fCBkZWZhdWx0UGFnZVRpdGxlVGVtcGxhdGVcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInBhZ2VBY3Rpb25zVGVtcGxhdGUgfHwgZGVmYXVsdFBhZ2VBY3Rpb25zVGVtcGxhdGVcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCJoYXNQYWdlU3VidGl0bGVcIiBjbGFzcz1cInBhZ2Utc3VidGl0bGVcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tU3VidGl0bGVUZW1wbGF0ZSB8fCBkZWZhdWx0UGFnZVN1YnRpdGxlVGVtcGxhdGVcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSAgU3RpY2t5IGNvbnRlbnQgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdGlja3lDb250ZW50VGVtcGxhdGVcIj5cbiAgICA8ZGl2IGNsYXNzPVwic3RpY2t5LWNvbnRlbnQtY29udGFpbmVyXCI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic3RpY2t5Q29udGVudFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPCEtLSBDb250ZW50IC0tPlxuICA8ZGl2IGNsYXNzPVwiY29udGVudC1pbm5lclwiPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tQ29udGVudFRlbXBsYXRlIHx8IGRlZmF1bHRDb250ZW50VGVtcGxhdGVcIlxuICAgID48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBzbG90PVwiZml4ZWRcIiBjbGFzcz1cImZpeGVkLWNvbnRlbnRcIiAqbmdJZj1cImZpeGVkQ29udGVudFRlbXBsYXRlXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtaW5uZXJcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmaXhlZENvbnRlbnRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvaW9uLWNvbnRlbnQ+XG5cbjxpb24tZm9vdGVyPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJraXJieS1wYWdlLWZvb3RlclwiPjwvbmctY29udGVudD5cbjwvaW9uLWZvb3Rlcj5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0UGFnZVRpdGxlVGVtcGxhdGU+XG4gIDxoMSBba2lyYnlGaXRIZWFkaW5nXT1cImZpdEhlYWRpbmdDb25maWdcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2ltcGxlVGl0bGVUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICA8L2gxPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFBhZ2VTdWJ0aXRsZVRlbXBsYXRlPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2ltcGxlU3VidGl0bGVUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFBhZ2VBY3Rpb25zVGVtcGxhdGU+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cImtpcmJ5LXBhZ2UtYWN0aW9uc1wiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdENvbnRlbnRUZW1wbGF0ZT5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwia2lyYnktcGFnZS1jb250ZW50XCI+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNzaW1wbGVUaXRsZVRlbXBsYXRlPnt7IHRpdGxlIH19PC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjc2ltcGxlU3VidGl0bGVUZW1wbGF0ZT57eyBzdWJ0aXRsZSB9fTwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI3NpbXBsZVRvb2xiYXJUaXRsZVRlbXBsYXRlPnt7IHRvb2xiYXJUaXRsZSB9fTwvbmctdGVtcGxhdGU+XG4iXX0=
478
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Rlc2lnbnN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvcGFnZS9wYWdlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvZGVzaWduc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9wYWdlL3BhZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBSUwsUUFBUSxFQUNSLE1BQU0sRUFDTixTQUFTLEVBRVQsUUFBUSxFQUNSLFdBQVcsRUFDWCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFlLE1BQU0saUJBQWlCLENBQUM7QUFDdEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekYsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRWpFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3BGLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsdUJBQXVCLEVBQ3ZCLGdCQUFnQixH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dUJBQUMseUJBQXlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBRzdFLG1CQUFtQjtzQkFEbEIsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFHdEUsc0JBQXNCO3NCQURyQixZQUFZO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUd6RSxhQUFhO3NCQURaLGVBQWU7dUJBQUMsb0JBQW9CO2dCQUc3QixhQUFhO3NCQURwQixlQUFlO3VCQUFDLG9CQUFvQjtnQkFHN0IsZ0JBQWdCO3NCQUR2QixZQUFZO3VCQUFDLDBCQUEwQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQW9QOUUsbUJBQW1CO3NCQURsQixZQUFZO3VCQUFDLHlCQUF5QixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVduRCxtQkFBbUI7c0JBRGxCLFlBQVk7dUJBQUMseUJBQXlCO2dCQU12QyxtQkFBbUI7c0JBRGxCLFlBQVk7dUJBQUMsVUFBVSxxQkFBcUIsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudENoZWNrZWQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFNraXBTZWxmLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5hdmlnYXRpb25FbmQsIE5hdmlnYXRpb25TdGFydCwgUm91dGVyLCBSb3V0ZXJFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBJb25CYWNrQnV0dG9uRGVsZWdhdGUsIElvbkNvbnRlbnQsIElvbkZvb3RlciwgSW9uSGVhZGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgU2Nyb2xsRGV0YWlsIH0gZnJvbSAnQGlvbmljL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIG1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBLaXJieUFuaW1hdGlvbiB9IGZyb20gJy4uLy4uL2FuaW1hdGlvbi9raXJieS1hbmltYXRpb24nO1xuaW1wb3J0IHsgRml0SGVhZGluZ0NvbmZpZyB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvZml0LWhlYWRpbmcvZml0LWhlYWRpbmcuZGlyZWN0aXZlJztcbmltcG9ydCB7IE1vZGFsV3JhcHBlckNvbXBvbmVudCB9IGZyb20gJy4uL21vZGFsL21vZGFsLXdyYXBwZXIvbW9kYWwtd3JhcHBlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgTW9kYWxOYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4uL21vZGFsL3NlcnZpY2VzL21vZGFsLW5hdmlnYXRpb24uc2VydmljZSc7XG5pbXBvcnQge1xuICBNb2RhbEVsZW1lbnRDb21wb25lbnQsXG4gIE1vZGFsRWxlbWVudHNBZHZlcnRpc2VyLFxuICBNb2RhbEVsZW1lbnRUeXBlLFxufSBmcm9tICcuLi9tb2RhbC9zZXJ2aWNlcy9tb2RhbC5pbnRlcmZhY2VzJztcbmltcG9ydCB7IHNlbGVjdGVkVGFiQ2xpY2tFdmVudCB9IGZyb20gJy4uL3RhYnMvdGFiLWJ1dHRvbi90YWItYnV0dG9uLmV2ZW50cyc7XG5pbXBvcnQgeyBUYWJzQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFicy90YWJzLmNvbXBvbmVudCc7XG5cbi8qKlxuICogU3BlY2lmeSBzY3JvbGwgZXZlbnQgZGVib3VuY2UgdGltZSBpbiBtcyBhbmQgc2Nyb2xsZWQgb2Zmc2V0IGZyb20gdG9wIGluIHBpeGVsc1xuICovXG5jb25zdCBjb250ZW50U2Nyb2xsRGVib3VuY2VUaW1lSW5NUyA9IDEwO1xuY29uc3QgY29udGVudFNjcm9sbGVkT2Zmc2V0SW5QaXhlbHMgPSA0O1xuXG50eXBlIHN0aWNreUNvbmZpZyA9IHsgc3RpY2t5OiBib29sZWFuIH07XG50eXBlIGZpeGVkQ29uZmlnID0geyBmaXhlZDogYm9vbGVhbiB9O1xuXG4vKipcbiAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBcInB1bGwtdG8tcmVmcmVzaFwiIGJlZ2lucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQdWxsVG9SZWZyZXNoRXZlbnQge1xuICAvKipcbiAgICogSW52b2tlIHRoaXMgY2FsbGJhY2stbWV0aG9kIHdoZW4gYWN0aW9uIHRvIHBlcmZvcm0gdXBvbiBcInB1bGwtdG8tcmVmcmVzaFwiIGNvbXBsZXRlcy5cbiAgICovXG4gIGNvbXBsZXRlKCk7XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1traXJieVBhZ2VUaXRsZV0nLFxufSlcbmV4cG9ydCBjbGFzcyBQYWdlVGl0bGVEaXJlY3RpdmUge31cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2tpcmJ5UGFnZVN1YnRpdGxlXScsXG59KVxuZXhwb3J0IGNsYXNzIFBhZ2VTdWJ0aXRsZURpcmVjdGl2ZSB7fVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdba2lyYnlQYWdlVG9vbGJhclRpdGxlXScsXG59KVxuZXhwb3J0IGNsYXNzIFBhZ2VUb29sYmFyVGl0bGVEaXJlY3RpdmUge31cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2tpcmJ5UGFnZUFjdGlvbnNdJyxcbn0pXG5leHBvcnQgY2xhc3MgUGFnZUFjdGlvbnNEaXJlY3RpdmUge1xuICBASW5wdXQoJ2tpcmJ5UGFnZUFjdGlvbnMnKSBjb25maWc6IHN0aWNreUNvbmZpZyB8IGZpeGVkQ29uZmlnO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0aWNreURlZmF1bHQgPSB0cnVlO1xuICBwcml2YXRlIHJlYWRvbmx5IGZpeGVkRGVmYXVsdCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55Pikge31cblxuICBnZXQgaXNTdGlja3koKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnID8gKHRoaXMuY29uZmlnIGFzIHN0aWNreUNvbmZpZykuc3RpY2t5IDogdGhpcy5zdGlja3lEZWZhdWx0O1xuICB9XG5cbiAgZ2V0IGlzRml4ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnID8gKHRoaXMuY29uZmlnIGFzIGZpeGVkQ29uZmlnKS5maXhlZCA6IHRoaXMuZml4ZWREZWZhdWx0O1xuICB9XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1traXJieVBhZ2VDb250ZW50XScsXG59KVxuZXhwb3J0IGNsYXNzIFBhZ2VDb250ZW50RGlyZWN0aXZlIHtcbiAgQElucHV0KCdraXJieVBhZ2VDb250ZW50JykgY29uZmlnOiBmaXhlZENvbmZpZztcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pIHt9XG5cbiAgZ2V0IGlzRml4ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmZpeGVkO1xuICB9XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1traXJieVBhZ2VTdGlja3lDb250ZW50XScsXG59KVxuZXhwb3J0IGNsYXNzIFBhZ2VTdGlja3lDb250ZW50RGlyZWN0aXZlIHt9XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2tpcmJ5LXBhZ2UtcHJvZ3Jlc3MnLFxuICB0ZW1wbGF0ZTogYCA8bmctY29udGVudD48L25nLWNvbnRlbnQ+IGAsXG4gIHN0eWxlczogWyc6aG9zdCB7ZGlzcGxheTogZmxleH0nXSxcbn0pXG5leHBvcnQgY2xhc3MgUGFnZVByb2dyZXNzQ29tcG9uZW50IGV4dGVuZHMgTW9kYWxFbGVtZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLy8gVE9ETzogRmluZCBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggYWxpZ25zIHdpdGggZnV0dXJlIHBhZ2UgY29uZmlndXJhdGlvbiAvIGNvbnN1bXB0aW9uXG4gIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gd2FzIGNob3NlbiBvdmVyIGV4cGFuZGluZyBgbW92ZUNoaWxkYCBtZXRob2QgaW4gY29tcG9uZW50IHdyYXBwZXIgd2l0aCB5ZXQgYW5vdGhlciBzY2VuYXJpb1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuc2xvdCcpIHNsb3QgPSAnc3RhcnQnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpIHByaXZhdGUgbW9kYWxXcmFwcGVyOiBNb2RhbFdyYXBwZXJDb21wb25lbnQsXG4gICAgQE9wdGlvbmFsKCkgbW9kYWxFbGVtZW50c0FkdmVydGlzZXI6IE1vZGFsRWxlbWVudHNBZHZlcnRpc2VyLFxuICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+XG4gICkge1xuICAgIHN1cGVyKE1vZGFsRWxlbWVudFR5cGUuUEFHRV9QUk9HUkVTUywgZWxlbWVudFJlZiwgbW9kYWxFbGVtZW50c0FkdmVydGlzZXIpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kYWxXcmFwcGVyICYmIHRoaXMubW9kYWxXcmFwcGVyLmNvbmZpZy5mbGF2b3IgPT09ICdkcmF3ZXInKSB7XG4gICAgICB0aGlzLnNsb3QgPSAnZW5kJztcbiAgICB9XG4gIH1cbn1cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2tpcmJ5LXBhZ2UtdGl0bGUnLFxuICB0ZW1wbGF0ZTogYCA8bmctY29udGVudD48L25nLWNvbnRlbnQ+IGAsXG59KVxuZXhwb3J0IGNsYXNzIFBhZ2VUaXRsZUNvbXBvbmVudCBleHRlbmRzIE1vZGFsRWxlbWVudENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgIEBPcHRpb25hbCgpIG1vZGFsRWxlbWVudHNBZHZlcnRpc2VyOiBNb2RhbEVsZW1lbnRzQWR2ZXJ0aXNlclxuICApIHtcbiAgICBzdXBlcihNb2RhbEVsZW1lbnRUeXBlLlRJVExFLCBlbGVtZW50UmVmLCBtb2RhbEVsZW1lbnRzQWR2ZXJ0aXNlcik7XG4gIH1cbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAna2lyYnktcGFnZS1jb250ZW50JyxcbiAgdGVtcGxhdGU6IGAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PiBgLFxufSlcbmV4cG9ydCBjbGFzcyBQYWdlQ29udGVudENvbXBvbmVudCB7fVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdraXJieS1wYWdlLWFjdGlvbnMnLFxuICB0ZW1wbGF0ZTogYCA8bmctY29udGVudCBzZWxlY3Q9XCJidXR0b25ba2lyYnktYnV0dG9uXVwiPjwvbmctY29udGVudD4gYCxcbn0pXG5leHBvcnQgY2xhc3MgUGFnZUFjdGlvbnNDb21wb25lbnQge31cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAna2lyYnktcGFnZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9wYWdlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcGFnZS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgUGFnZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJDb250ZW50Q2hlY2tlZCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZztcbiAgQElucHV0KCkgc3VidGl0bGU6IHN0cmluZztcbiAgQElucHV0KCkgdG9vbGJhclRpdGxlOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRpdGxlQWxpZ25tZW50OiAnbGVmdCcgfCAnY2VudGVyJyB8ICdyaWdodCcgPSAnbGVmdCc7XG4gIEBJbnB1dCgpIGRlZmF1bHRCYWNrSHJlZjogc3RyaW5nO1xuICBASW5wdXQoKSBoaWRlQmFja0J1dHRvbjogYm9vbGVhbjtcbiAgQElucHV0KCkgdGl0bGVNYXhMaW5lczogbnVtYmVyO1xuXG4gIHByaXZhdGUgX3RhYkJhckJvdHRvbUhpZGRlbjogYm9vbGVhbjtcbiAgcHVibGljIGdldCB0YWJCYXJCb3R0b21IaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYkJhckJvdHRvbUhpZGRlbjtcbiAgfVxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHRhYkJhckJvdHRvbUhpZGRlbih2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLnRhYnNDb21wb25lbnQpIHtcbiAgICAgIC8vIGFzIHdlIGFyZSBzZXR0aW5nIGEgY2xhc3Mgb24gdGFicywgd2UgbmVlZCB0aGlzIHRvIGhhcHBlbiBpbiBhIHNlcGFyYXRlIGNkIGN5Y2xlXG4gICAgICBzZXRUaW1lb3V0KCgpID0+ICh0aGlzLnRhYnNDb21wb25lbnQudGFiQmFyQm90dG9tSGlkZGVuID0gdmFsdWUpKTtcbiAgICB9XG4gICAgdGhpcy5fdGFiQmFyQm90dG9tSGlkZGVuID0gdmFsdWU7XG4gIH1cblxuICBAT3V0cHV0KCkgZW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBsZWF2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHJlZnJlc2ggPSBuZXcgRXZlbnRFbWl0dGVyPFB1bGxUb1JlZnJlc2hFdmVudD4oKTtcbiAgQE91dHB1dCgpIGJhY2tCdXR0b25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG5cbiAgQFZpZXdDaGlsZChJb25Db250ZW50LCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIGNvbnRlbnQ/OiBJb25Db250ZW50O1xuICBAVmlld0NoaWxkKElvbkNvbnRlbnQsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBFbGVtZW50UmVmIH0pXG4gIHByaXZhdGUgaW9uQ29udGVudEVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTElvbkNvbnRlbnRFbGVtZW50PjtcbiAgQFZpZXdDaGlsZChJb25IZWFkZXIsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBFbGVtZW50UmVmIH0pXG4gIGlvbkhlYWRlckVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTElvbkhlYWRlckVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKElvbkZvb3RlciwgeyBzdGF0aWM6IHRydWUsIHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgcHJpdmF0ZSBpb25Gb290ZXJFbGVtZW50OiBFbGVtZW50UmVmPEhUTUxJb25Gb290ZXJFbGVtZW50PjtcblxuICBAVmlld0NoaWxkKElvbkJhY2tCdXR0b25EZWxlZ2F0ZSwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHByaXZhdGUgYmFja0J1dHRvbkRlbGVnYXRlOiBJb25CYWNrQnV0dG9uRGVsZWdhdGU7XG4gIEBWaWV3Q2hpbGQoJ3BhZ2VUaXRsZScsIHsgc3RhdGljOiBmYWxzZSwgcmVhZDogRWxlbWVudFJlZiB9KVxuICBwcml2YXRlIHBhZ2VUaXRsZTogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnc3RpY2t5Q29udGVudENvbnRhaW5lcicsIHsgc3RhdGljOiBmYWxzZSwgcmVhZDogRWxlbWVudFJlZiB9KVxuICBwcml2YXRlIHN0aWNreUNvbnRlbnRDb250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgQFZpZXdDaGlsZCgnc2ltcGxlVGl0bGVUZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBwcml2YXRlIHNpbXBsZVRpdGxlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBWaWV3Q2hpbGQoJ3NpbXBsZVRvb2xiYXJUaXRsZVRlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUsIHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIHByaXZhdGUgc2ltcGxlVG9vbGJhclRpdGxlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoUGFnZVRvb2xiYXJUaXRsZURpcmVjdGl2ZSwgeyBzdGF0aWM6IGZhbHNlLCByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBwcml2YXRlIGN1c3RvbVRvb2xiYXJUaXRsZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKFBhZ2VUaXRsZURpcmVjdGl2ZSwgeyBzdGF0aWM6IGZhbHNlLCByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBjdXN0b21UaXRsZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKFBhZ2VTdWJ0aXRsZURpcmVjdGl2ZSwgeyBzdGF0aWM6IGZhbHNlLCByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBjdXN0b21TdWJ0aXRsZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkcmVuKFBhZ2VBY3Rpb25zRGlyZWN0aXZlKVxuICBjdXN0b21BY3Rpb25zOiBRdWVyeUxpc3Q8UGFnZUFjdGlvbnNEaXJlY3RpdmU+O1xuICBAQ29udGVudENoaWxkcmVuKFBhZ2VDb250ZW50RGlyZWN0aXZlKVxuICBwcml2YXRlIGN1c3RvbUNvbnRlbnQ6IFF1ZXJ5TGlzdDxQYWdlQ29udGVudERpcmVjdGl2ZT47XG4gIEBDb250ZW50Q2hpbGQoUGFnZVN0aWNreUNvbnRlbnREaXJlY3RpdmUsIHsgc3RhdGljOiBmYWxzZSwgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgcHJpdmF0ZSBzdGlja3lDb250ZW50UmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIGhhc1BhZ2VUaXRsZTogYm9vbGVhbjtcbiAgaGFzUGFnZVN1YnRpdGxlOiBib29sZWFuO1xuICB0b29sYmFyVGl0bGVWaXNpYmxlOiBib29sZWFuO1xuICBpc0NvbnRlbnRTY3JvbGxlZDogYm9vbGVhbjtcbiAgaXNTdGlja3lDb250ZW50UGlubmVkOiBib29sZWFuO1xuXG4gIGZpdEhlYWRpbmdDb25maWc6IEZpdEhlYWRpbmdDb25maWc7XG5cbiAgdG9vbGJhclRpdGxlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gIGN1c3RvbUNvbnRlbnRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgcGFnZUFjdGlvbnNUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgZml4ZWRDb250ZW50VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gIHN0aWNreUFjdGlvbnNUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgZml4ZWRBY3Rpb25zVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gIHN0aWNreUNvbnRlbnRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8UGFnZVN0aWNreUNvbnRlbnREaXJlY3RpdmU+O1xuXG4gIHByaXZhdGUgcGFnZVRpdGxlSW50ZXJzZWN0aW9uT2JzZXJ2ZXJSZWY6IEludGVyc2VjdGlvbk9ic2VydmVyID1cbiAgICB0aGlzLnBhZ2VUaXRsZUludGVyc2VjdGlvbk9ic2VydmVyKCk7XG4gIHByaXZhdGUgc3RpY2t5Q29udGVudEludGVyc2VjdGlvbk9ic2VydmVyUmVmID0gdGhpcy5zdGlja3lDb250ZW50SW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKTtcblxuICBwcml2YXRlIHVybDogc3RyaW5nO1xuICBwcml2YXRlIGlzQWN0aXZlOiBib29sZWFuO1xuXG4gIHByaXZhdGUgbmdPbkRlc3Ryb3kkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBjb250ZW50U2Nyb2xsZWQkOiBPYnNlcnZhYmxlPFNjcm9sbERldGFpbD47XG5cbiAgcHJpdmF0ZSBuYXZpZ2F0aW9uU3RhcnQkOiBPYnNlcnZhYmxlPFJvdXRlckV2ZW50PiA9IHRoaXMucm91dGVyLmV2ZW50cy5waXBlKFxuICAgIGZpbHRlcigoZXZlbnQ6IFJvdXRlckV2ZW50KSA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCksXG4gICAgdGFrZVVudGlsKHRoaXMubmdPbkRlc3Ryb3kkKVxuICApO1xuXG4gIHByaXZhdGUgbmF2aWdhdGlvbkVuZCQ6IE9ic2VydmFibGU8Um91dGVyRXZlbnQ+ID0gdGhpcy5yb3V0ZXIuZXZlbnRzLnBpcGUoXG4gICAgZmlsdGVyKChldmVudDogUm91dGVyRXZlbnQpID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCksXG4gICAgdGFrZVVudGlsKHRoaXMubmdPbkRlc3Ryb3kkKVxuICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBtb2RhbE5hdmlnYXRpb25TZXJ2aWNlOiBNb2RhbE5hdmlnYXRpb25TZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpIHByaXZhdGUgdGFic0NvbXBvbmVudDogVGFic0NvbXBvbmVudFxuICApIHt9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLnRpdGxlTWF4TGluZXMpIHtcbiAgICAgIHRoaXMuZml0SGVhZGluZ0NvbmZpZyA9IHtcbiAgICAgICAgLi4udGhpcy5maXRIZWFkaW5nQ29uZmlnLFxuICAgICAgICBtYXhMaW5lczogY2hhbmdlcy50aXRsZU1heExpbmVzLmN1cnJlbnRWYWx1ZSxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLnN1YnRpdGxlICYmICFjaGFuZ2VzLnN1YnRpdGxlLmlzRmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMuc3VidGl0bGUgPSBjaGFuZ2VzLnRpdGxlLmN1cnJlbnRWYWx1ZTtcbiAgICAgIHRoaXMuaGFzUGFnZVN1YnRpdGxlID0gdGhpcy5zdWJ0aXRsZSAhPT0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRlbnRTY3JvbGxlZCQgPSB0aGlzLmNvbnRlbnQuaW9uU2Nyb2xsLnBpcGUoXG4gICAgICBkZWJvdW5jZVRpbWUoY29udGVudFNjcm9sbERlYm91bmNlVGltZUluTVMpLFxuICAgICAgbWFwKChldmVudCkgPT4gZXZlbnQuZGV0YWlsKSxcbiAgICAgIHRha2VVbnRpbCh0aGlzLm5nT25EZXN0cm95JClcbiAgICApO1xuXG4gICAgdGhpcy5jb250ZW50U2Nyb2xsZWQkLnN1YnNjcmliZSgoc2Nyb2xsSW5mbzogU2Nyb2xsRGV0YWlsKSA9PiB7XG4gICAgICB0aGlzLmlzQ29udGVudFNjcm9sbGVkID0gc2Nyb2xsSW5mby5zY3JvbGxUb3AgPiBjb250ZW50U2Nyb2xsZWRPZmZzZXRJblBpeGVscztcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0pO1xuXG4gICAgLy8gVGhpcyBpbnN0YW5jZSBoYXMgb2JzZXJ2ZWQgYSBwYWdlIGVudGVyIHNvIHJlZ2lzdGVyIHRoZSBjb3JyZWN0IHVybCBmb3IgdGhpcyBpbnN0YW5jZVxuICAgIHRoaXMudXJsID0gdGhpcy5yb3V0ZXIudXJsO1xuICAgIHRoaXMub25FbnRlcigpO1xuXG4gICAgLy8gV2F0Y2ggbmF2aWdhdGlvbiBldmVudHMgZm9yIHBhZ2UgZW50ZXIgYW5kIGxlYXZlXG4gICAgdGhpcy5uYXZpZ2F0aW9uU3RhcnQkLnN1YnNjcmliZSgoZXZlbnQ6IE5hdmlnYXRpb25TdGFydCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBldmVudC51cmwgIT09IHRoaXMudXJsICYmXG4gICAgICAgICF0aGlzLm1vZGFsTmF2aWdhdGlvblNlcnZpY2UuaXNNb2RhbFJvdXRlKHRoaXMudXJsKSAmJlxuICAgICAgICAhdGhpcy5tb2RhbE5hdmlnYXRpb25TZXJ2aWNlLmlzTW9kYWxSb3V0ZShldmVudC51cmwpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5vbkxlYXZlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm5hdmlnYXRpb25FbmQkLnN1YnNjcmliZSgoZXZlbnQ6IE5hdmlnYXRpb25FbmQpID0+IHtcbiAgICAgIGlmIChldmVudC51cmxBZnRlclJlZGlyZWN0cyA9PT0gdGhpcy51cmwpIHtcbiAgICAgICAgdGhpcy5vbkVudGVyKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmludGVyY2VwdEJhY2tCdXR0b25DbGlja3NTZXR1cCgpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVN0aWNreUludGVyc2VjdGlvbk9ic2VydmVyKCk7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0aWFsaXplVGl0bGUoKTtcbiAgICB0aGlzLmluaXRpYWxpemVBY3Rpb25zKCk7XG4gICAgdGhpcy5pbml0aWFsaXplQ29udGVudCgpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVN0aWNreUNvbnRlbnQoKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMubmdPbkRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLm5nT25EZXN0cm95JC5jb21wbGV0ZSgpO1xuXG4gICAgdGhpcy5wYWdlVGl0bGVJbnRlcnNlY3Rpb25PYnNlcnZlclJlZi5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5zdGlja3lDb250ZW50SW50ZXJzZWN0aW9uT2JzZXJ2ZXJSZWYuZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgZGVsZWdhdGVSZWZyZXNoRXZlbnQoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMucmVmcmVzaC5lbWl0KHtcbiAgICAgIGNvbXBsZXRlOiBldmVudC50YXJnZXQuY29tcGxldGUuYmluZChldmVudC50YXJnZXQpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkVudGVyKCkge1xuICAgIGlmICh0aGlzLmlzQWN0aXZlKSByZXR1cm47XG4gICAgdGhpcy5pc0FjdGl2ZSA9IHRydWU7XG5cbiAgICB0aGlzLmVudGVyLmVtaXQoKTtcbiAgICBpZiAodGhpcy5wYWdlVGl0bGUpIHtcbiAgICAgIHRoaXMucGFnZVRpdGxlSW50ZXJzZWN0aW9uT2JzZXJ2ZXJSZWYub2JzZXJ2ZSh0aGlzLnBhZ2VUaXRsZS5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uTGVhdmUoKSB7XG4gICAgaWYgKCF0aGlzLmlzQWN0aXZlKSByZXR1cm47XG4gICAgdGhpcy5pc0FjdGl2ZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5sZWF2ZS5lbWl0KCk7XG4gICAgaWYgKHRoaXMucGFnZVRpdGxlKSB7XG4gICAgICB0aGlzLnBhZ2VUaXRsZUludGVyc2VjdGlvbk9ic2VydmVyUmVmLnVub2JzZXJ2ZSh0aGlzLnBhZ2VUaXRsZS5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50YWJCYXJCb3R0b21IaWRkZW4gJiYgdGhpcy50YWJzQ29tcG9uZW50KSB7XG4gICAgICB0aGlzLnRhYnNDb21wb25lbnQudGFiQmFyQm90dG9tSGlkZGVuID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbnRlcmNlcHRCYWNrQnV0dG9uQ2xpY2tzU2V0dXAoKSB7XG4gICAgLy8gSW50ZXJjZXB0IGJhY2stYnV0dG9uIGNsaWNrIGV2ZW50cywgZGVmYXVsdGluZyB0byB0aGUgYnVpbHQtaW4gY2xpY2staGFuZGxlci5cbiAgICBpZiAodGhpcy5iYWNrQnV0dG9uQ2xpY2sub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5iYWNrQnV0dG9uQ2xpY2tcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdPbkRlc3Ryb3kkKSlcbiAgICAgICAgLnN1YnNjcmliZSh0aGlzLmJhY2tCdXR0b25EZWxlZ2F0ZS5vbkNsaWNrLmJpbmQodGhpcy5iYWNrQnV0dG9uRGVsZWdhdGUpKTtcbiAgICB9XG4gICAgdGhpcy5iYWNrQnV0dG9uRGVsZWdhdGUub25DbGljayA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgIHRoaXMuYmFja0J1dHRvbkNsaWNrLmVtaXQoZXZlbnQpO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVTdGlja3lJbnRlcnNlY3Rpb25PYnNlcnZlcigpIHtcbiAgICBpZiAodGhpcy5zdGlja3lDb250ZW50VGVtcGxhdGUpIHtcbiAgICAgIC8vIFN0aWNreSBjb250ZW50IHByZXNlbnQgLSBzdGFydCBvYnNlcnZpbmcgZm9yIHN0aWNraW5lc3NcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnN0aWNreUNvbnRlbnRJbnRlcnNlY3Rpb25PYnNlcnZlclJlZi5vYnNlcnZlKFxuICAgICAgICAgIHRoaXMuc3RpY2t5Q29udGVudENvbnRhaW5lci5uYXRpdmVFbGVtZW50XG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVUaXRsZSgpIHtcbiAgICAvLyBFbnN1cmVzIGluaXRpYWxpemVUaXRsZSgpIHdvbid0IHJ1biwgaWYgYWxyZWFkeSBpbml0aWFsaXplZFxuICAgIGlmICh0aGlzLmhhc1BhZ2VUaXRsZSkgcmV0dXJuO1xuICAgIHRoaXMuaGFzUGFnZVRpdGxlID0gdGhpcy50aXRsZSAhPT0gdW5kZWZpbmVkIHx8ICEhdGhpcy5jdXN0b21UaXRsZVRlbXBsYXRlO1xuICAgIHRoaXMudG9vbGJhclRpdGxlVmlzaWJsZSA9ICF0aGlzLmhhc1BhZ2VUaXRsZTtcbiAgICB0aGlzLmhhc1BhZ2VTdWJ0aXRsZSA9IHRoaXMuc3VidGl0bGUgIT09IHVuZGVmaW5lZCB8fCAhIXRoaXMuY3VzdG9tU3VidGl0bGVUZW1wbGF0ZTtcblxuICAgIGlmICh0aGlzLmhhc1BhZ2VUaXRsZSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucGFnZVRpdGxlSW50ZXJzZWN0aW9uT2JzZXJ2ZXJSZWYub2JzZXJ2ZSh0aGlzLnBhZ2VUaXRsZS5uYXRpdmVFbGVtZW50KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRUaXRsZVRlbXBsYXRlID0gdGhpcy5jdXN0b21UaXRsZVRlbXBsYXRlIHx8IHRoaXMuc2ltcGxlVGl0bGVUZW1wbGF0ZTtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIHRoaXMudG9vbGJhclRpdGxlVGVtcGxhdGUgPSB0aGlzLmN1c3RvbVRvb2xiYXJUaXRsZVRlbXBsYXRlXG4gICAgICA/IHRoaXMuY3VzdG9tVG9vbGJhclRpdGxlVGVtcGxhdGVcbiAgICAgIDogdHlwZW9mIHRoaXMudG9vbGJhclRpdGxlID09PSAnc3RyaW5nJ1xuICAgICAgICA/IHRoaXMuc2ltcGxlVG9vbGJhclRpdGxlVGVtcGxhdGVcbiAgICAgICAgOiBkZWZhdWx0VGl0bGVUZW1wbGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUFjdGlvbnMoKSB7XG4gICAgdGhpcy5jdXN0b21BY3Rpb25zLmZvckVhY2goKHBhZ2VBY3Rpb24pID0+IHtcbiAgICAgIGlmIChwYWdlQWN0aW9uLmlzRml4ZWQpIHtcbiAgICAgICAgdGhpcy5maXhlZEFjdGlvbnNUZW1wbGF0ZSA9IHBhZ2VBY3Rpb24udGVtcGxhdGU7XG4gICAgICB9IGVsc2UgaWYgKHBhZ2VBY3Rpb24uaXNTdGlja3kpIHtcbiAgICAgICAgdGhpcy5zdGlja3lBY3Rpb25zVGVtcGxhdGUgPSBwYWdlQWN0aW9uLnRlbXBsYXRlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wYWdlQWN0aW9uc1RlbXBsYXRlID0gcGFnZUFjdGlvbi50ZW1wbGF0ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNvbnRlbnQoKSB7XG4gICAgdGhpcy5jdXN0b21Db250ZW50LmZvckVhY2goKGNvbnRlbnQpID0+IHtcbiAgICAgIGlmIChjb250ZW50LmlzRml4ZWQpIHtcbiAgICAgICAgdGhpcy5maXhlZENvbnRlbnRUZW1wbGF0ZSA9IGNvbnRlbnQudGVtcGxhdGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmN1c3RvbUNvbnRlbnRUZW1wbGF0ZSA9IGNvbnRlbnQudGVtcGxhdGU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVTdGlja3lDb250ZW50KCkge1xuICAgIHRoaXMuc3RpY2t5Q29udGVudFRlbXBsYXRlID0gdGhpcy5zdGlja3lDb250ZW50UmVmO1xuICB9XG5cbiAgcHJpdmF0ZSBwYWdlVGl0bGVJbnRlcnNlY3Rpb25PYnNlcnZlcigpIHtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgcm9vdE1hcmdpbjogJzBweCcsXG4gICAgfTtcblxuICAgIGxldCBpbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIGNvbnN0IGNhbGxiYWNrID0gKGVudHJpZXMpID0+IHtcbiAgICAgIGlmIChpbml0aWFsaXplZCkge1xuICAgICAgICB0aGlzLnRvb2xiYXJUaXRsZVZpc2libGUgPSAhZW50cmllc1swXS5pc0ludGVyc2VjdGluZztcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbml0aWFsaXplZCA9IHRydWU7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGNhbGxiYWNrLCBvcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RpY2t5Q29udGVudEludGVyc2VjdGlvbk9ic2VydmVyKCkge1xuICAgIGNvbnN0IG9wdGlvbnM6IEludGVyc2VjdGlvbk9ic2VydmVySW5pdCA9IHtcbiAgICAgIHRocmVzaG9sZDogMSxcbiAgICB9O1xuXG4gICAgY29uc3QgY2FsbGJhY2sgPSAoZW50cmllcykgPT4ge1xuICAgICAgLy8gVGhlIHN0aWNreSBjb250ZW50IGlzIHBpbm5lZCB3aGVuIGl0IGRvZXNuJ3QgZnVsbHkgaW50ZXJzZWN0IHRoZSB2aWV3cG9ydFxuICAgICAgdGhpcy5pc1N0aWNreUNvbnRlbnRQaW5uZWQgPSAhZW50cmllc1swXS5pc0ludGVyc2VjdGluZztcbiAgICB9O1xuICAgIHJldHVybiBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoY2FsbGJhY2ssIG9wdGlvbnMpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleWJvYXJkV2lsbFNob3cnLCBbJyRldmVudCddKVxuICBfb25LZXlib2FyZFdpbGxTaG93KGluZm8/OiB7IGtleWJvYXJkSGVpZ2h0OiBudW1iZXIgfSkge1xuICAgIGlmIChpbmZvICYmIGluZm8ua2V5Ym9hcmRIZWlnaHQpIHtcbiAgICAgIHRoaXMuaW9uQ29udGVudEVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcbiAgICAgICAgJy0ta2V5Ym9hcmQtb2Zmc2V0JyxcbiAgICAgICAgYCR7aW5mby5rZXlib2FyZEhlaWdodH1weGBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleWJvYXJkV2lsbEhpZGUnKVxuICBfb25LZXlib2FyZFdpbGxIaWRlKCkge1xuICAgIHRoaXMuaW9uQ29udGVudEVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1rZXlib2FyZC1vZmZzZXQnLCAnMHB4Jyk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKGB3aW5kb3c6JHtzZWxlY3RlZFRhYkNsaWNrRXZlbnR9YClcbiAgX29uU2VsZWN0ZWRUYWJDbGljaygpIHtcbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICB0aGlzLmNvbnRlbnQuc2Nyb2xsVG9Ub3AoS2lyYnlBbmltYXRpb24uRHVyYXRpb24uTE9ORyk7XG4gICAgfVxuICB9XG59XG4iLCI8aW9uLWhlYWRlcj5cbiAgPGlvbi10b29sYmFyIFtjbGFzcy5jb250ZW50LXNjcm9sbGVkXT1cIiFzdGlja3lDb250ZW50VGVtcGxhdGUgJiYgaXNDb250ZW50U2Nyb2xsZWRcIj5cbiAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cInN0YXJ0XCI+XG4gICAgICA8aW9uLWJhY2stYnV0dG9uXG4gICAgICAgIHRleHQ9XCJcIlxuICAgICAgICBbZGVmYXVsdEhyZWZdPVwiZGVmYXVsdEJhY2tIcmVmXCJcbiAgICAgICAgaWNvbj1cImFzc2V0cy9raXJieS9pY29ucy9zdmcvYXJyb3ctYmFjay5zdmdcIlxuICAgICAgICBbc3R5bGUudmlzaWJpbGl0eV09XCJoaWRlQmFja0J1dHRvbiA/ICdoaWRkZW4nIDogbnVsbFwiXG4gICAgICA+PC9pb24tYmFjay1idXR0b24+XG4gICAgPC9pb24tYnV0dG9ucz5cbiAgICA8aW9uLXRpdGxlIFtjbGFzcy5zbGlkZS1hbmQtZmFkZS1pbl09XCJ0b29sYmFyVGl0bGVWaXNpYmxlXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidG9vbGJhci10aXRsZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidG9vbGJhclRpdGxlVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvaW9uLXRpdGxlPlxuICAgIDxpb24tYnV0dG9ucyBjbGFzcz1cImhpZGVcIiBzbG90PVwicHJpbWFyeVwiIFtjbGFzcy5mYWRlLWluXT1cIiEhc3RpY2t5QWN0aW9uc1RlbXBsYXRlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic3RpY2t5QWN0aW9uc1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9pb24tYnV0dG9ucz5cbiAgICA8aW9uLWJ1dHRvbnMgY2xhc3M9XCJoaWRlXCIgc2xvdD1cInNlY29uZGFyeVwiIFtjbGFzcy5mYWRlLWluXT1cIiEhZml4ZWRBY3Rpb25zVGVtcGxhdGVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmaXhlZEFjdGlvbnNUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvaW9uLWJ1dHRvbnM+XG4gIDwvaW9uLXRvb2xiYXI+XG48L2lvbi1oZWFkZXI+XG5cbjxpb24tY29udGVudCBzY3JvbGxFdmVudHM9XCJ0cnVlXCIgZm9yY2VPdmVyc2Nyb2xsPVwiZmFsc2VcIj5cbiAgPGlvbi1yZWZyZXNoZXJcbiAgICAqbmdJZj1cInJlZnJlc2gub2JzZXJ2ZXJzLmxlbmd0aCA+IDBcIlxuICAgIChpb25SZWZyZXNoKT1cImRlbGVnYXRlUmVmcmVzaEV2ZW50KCRldmVudClcIlxuICAgIHNsb3Q9XCJmaXhlZFwiXG4gID5cbiAgICA8a2lyYnktc3Bpbm5lcj48L2tpcmJ5LXNwaW5uZXI+XG4gIDwvaW9uLXJlZnJlc2hlcj5cblxuICA8IS0tIFBhZ2UgaGVhZGVyIC0tPlxuICA8ZGl2IGNsYXNzPVwicGFnZS1oZWFkZXItY29udGFpbmVyXCIgKm5nSWY9XCJoYXNQYWdlVGl0bGVcIj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInBhZ2UtaGVhZGVyXCJcbiAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgJ3RleHQtY2VudGVyJzogdGl0bGVBbGlnbm1lbnQgPT09ICdjZW50ZXInLFxuICAgICAgICAndGV4dC1yaWdodCc6IHRpdGxlQWxpZ25tZW50ID09PSAncmlnaHQnXG4gICAgICB9XCJcbiAgICA+XG4gICAgICA8ZGl2ICNwYWdlVGl0bGUgY2xhc3M9XCJwYWdlLXRpdGxlXCIgW2NsYXNzLmhhcy1hY3Rpb25zXT1cIiEhcGFnZUFjdGlvbnNUZW1wbGF0ZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21UaXRsZVRlbXBsYXRlIHx8IGRlZmF1bHRQYWdlVGl0bGVUZW1wbGF0ZVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwicGFnZUFjdGlvbnNUZW1wbGF0ZSB8fCBkZWZhdWx0UGFnZUFjdGlvbnNUZW1wbGF0ZVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImhhc1BhZ2VTdWJ0aXRsZVwiIGNsYXNzPVwicGFnZS1zdWJ0aXRsZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21TdWJ0aXRsZVRlbXBsYXRlIHx8IGRlZmF1bHRQYWdlU3VidGl0bGVUZW1wbGF0ZVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tICBTdGlja3kgY29udGVudCAtLT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN0aWNreUNvbnRlbnRUZW1wbGF0ZVwiPlxuICAgIDxkaXZcbiAgICAgICNzdGlja3lDb250ZW50Q29udGFpbmVyXG4gICAgICBjbGFzcz1cInN0aWNreS1jb250ZW50LWNvbnRhaW5lclwiXG4gICAgICBbY2xhc3MuY29udGVudC1waW5uZWRdPVwiaXNTdGlja3lDb250ZW50UGlubmVkXCJcbiAgICA+XG4gICAgICA8ZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic3RpY2t5Q29udGVudFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPCEtLSBDb250ZW50IC0tPlxuICA8ZGl2IGNsYXNzPVwiY29udGVudC1pbm5lclwiPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tQ29udGVudFRlbXBsYXRlIHx8IGRlZmF1bHRDb250ZW50VGVtcGxhdGVcIlxuICAgID48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBzbG90PVwiZml4ZWRcIiBjbGFzcz1cImZpeGVkLWNvbnRlbnRcIiAqbmdJZj1cImZpeGVkQ29udGVudFRlbXBsYXRlXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtaW5uZXJcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmaXhlZENvbnRlbnRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvaW9uLWNvbnRlbnQ+XG5cbjxpb24tZm9vdGVyPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJraXJieS1wYWdlLWZvb3RlclwiPjwvbmctY29udGVudD5cbjwvaW9uLWZvb3Rlcj5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0UGFnZVRpdGxlVGVtcGxhdGU+XG4gIDxoMSBba2lyYnlGaXRIZWFkaW5nXT1cImZpdEhlYWRpbmdDb25maWdcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2ltcGxlVGl0bGVUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICA8L2gxPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFBhZ2VTdWJ0aXRsZVRlbXBsYXRlPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2ltcGxlU3VidGl0bGVUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFBhZ2VBY3Rpb25zVGVtcGxhdGU+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cImtpcmJ5LXBhZ2UtYWN0aW9uc1wiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdENvbnRlbnRUZW1wbGF0ZT5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwia2lyYnktcGFnZS1jb250ZW50XCI+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNzaW1wbGVUaXRsZVRlbXBsYXRlPnt7IHRpdGxlIH19PC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjc2ltcGxlU3VidGl0bGVUZW1wbGF0ZT57eyBzdWJ0aXRsZSB9fTwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI3NpbXBsZVRvb2xiYXJUaXRsZVRlbXBsYXRlPnt7IHRvb2xiYXJUaXRsZSB9fTwvbmctdGVtcGxhdGU+XG4iXX0=
@@ -57,10 +57,10 @@ export class SlideButtonComponent {
57
57
  }
58
58
  }
59
59
  /** @nocollapse */ SlideButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: SlideButtonComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
60
- /** @nocollapse */ SlideButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.9", type: SlideButtonComponent, selector: "kirby-slide-button", inputs: { text: "text", expand: "expand" }, outputs: { slideDone: "slideDone", slidingPercentageChanged: "slidingPercentageChanged" }, ngImport: i0, template: "<div class=\"slide-button-container\" [ngClass]=\"{ 'slide-done': isSlideDone }\">\n <input\n type=\"range\"\n (mouseup)=\"onSliderMouseup()\"\n (touchend)=\"onSliderMouseup()\"\n (input)=\"onSliderValueChange($event.target.value)\"\n (mousedown)=\"onSliderMousedown()\"\n (touchstart)=\"onSliderMousedown()\"\n class=\"slide-button\"\n [value]=\"value\"\n max=\"100\"\n />\n <p class=\"slide-button-text slide-{{ pctInTens }}-pct\">{{ text }}</p>\n</div>\n", styles: [":host{position:relative;display:inline-block;width:256px;-webkit-user-select:none;user-select:none}:host[expand=block]{display:block;width:100%}:host .slide-button-container{width:100%;display:flex;justify-content:center;align-items:center;color:var(--kirby-primary-contrast);background-color:var(--kirby-primary);height:56px;border-radius:26px}:host .slide-10-pct{opacity:.9}:host .slide-20-pct{opacity:.8}:host .slide-30-pct{opacity:.7}:host .slide-40-pct{opacity:.6}:host .slide-50-pct{opacity:.5}:host .slide-60-pct{opacity:.4}:host .slide-70-pct{opacity:.3}:host .slide-80-pct{opacity:.2}:host .slide-90-pct{opacity:.1}:host .slide-100-pct{opacity:0}:host .slide-button-text{position:absolute;font-size:16px;margin:0;line-height:1;z-index:1;width:100%;text-align:center;padding:0 26px 0 56px}:host .slide-button{outline:none;width:100%;height:100%;-webkit-appearance:none;appearance:none;background:transparent;z-index:2}:host .slide-button::-webkit-slider-thumb{-webkit-transition:all 80ms linear 0ms;transition:all 80ms linear 0ms;-webkit-appearance:none;appearance:none;border-radius:50%;background-color:var(--kirby-white);background-image:url(/assets/kirby/icons/svg/arrow-more.svg);background-repeat:no-repeat;background-position:center;background-size:24px;width:52px;height:52px;border:none}@media (hover: hover){:host .slide-button::-webkit-slider-thumb:hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer;background-color:#ebebeb}}:host .slide-button::-webkit-slider-thumb:active,:host .slide-button::-webkit-slider-thumb .interaction-state-active{--state-layer-opacity: .12;--state-layer-background-color: var(--kirby-black);background-color:#e0e0e0}:host .slide-button::-moz-range-thumb{-moz-transition:all 80ms linear 0ms;transition:all 80ms linear 0ms;appearance:none;border-radius:50%;background-color:var(--kirby-white);background-image:url(/assets/kirby/icons/svg/arrow-more.svg);background-repeat:no-repeat;background-position:center;background-size:24px;width:52px;height:52px;border:none}@media (hover: hover){:host .slide-button::-moz-range-thumb:hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer;background-color:#ebebeb}}:host .slide-button::-moz-range-thumb:active,:host .slide-button::-moz-range-thumb .interaction-state-active{--state-layer-opacity: .12;--state-layer-background-color: var(--kirby-black);background-color:#e0e0e0}:host .slide-done{transition:all .3s ease-in-out;opacity:0;height:0;transform:scale(0);pointer-events:none}\n"], directives: [{ type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
60
+ /** @nocollapse */ SlideButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.9", type: SlideButtonComponent, selector: "kirby-slide-button", inputs: { text: "text", expand: "expand" }, outputs: { slideDone: "slideDone", slidingPercentageChanged: "slidingPercentageChanged" }, ngImport: i0, template: "<div class=\"slide-button-container\" [ngClass]=\"{ 'slide-done': isSlideDone }\">\n <input\n type=\"range\"\n (mouseup)=\"onSliderMouseup()\"\n (touchend)=\"onSliderMouseup()\"\n (input)=\"onSliderValueChange($event.target.value)\"\n (mousedown)=\"onSliderMousedown()\"\n (touchstart)=\"onSliderMousedown()\"\n class=\"slide-button\"\n [value]=\"value\"\n max=\"100\"\n />\n <p class=\"slide-button-text slide-{{ pctInTens }}-pct\">{{ text }}</p>\n</div>\n", styles: [":host{position:relative;display:inline-block;width:256px;-webkit-user-select:none;user-select:none}:host[expand=block]{display:block;width:100%}:host .slide-button-container{width:100%;display:flex;justify-content:center;align-items:center;color:var(--kirby-primary-contrast);background-color:var(--kirby-primary);height:56px;border-radius:26px}:host .slide-10-pct{opacity:.9}:host .slide-20-pct{opacity:.8}:host .slide-30-pct{opacity:.7}:host .slide-40-pct{opacity:.6}:host .slide-50-pct{opacity:.5}:host .slide-60-pct{opacity:.4}:host .slide-70-pct{opacity:.3}:host .slide-80-pct{opacity:.2}:host .slide-90-pct{opacity:.1}:host .slide-100-pct{opacity:0}:host .slide-button-text{position:absolute;font-size:16px;margin:0;line-height:1;z-index:1;width:100%;text-align:center;padding:0 26px 0 56px;pointer-events:none}:host .slide-button{outline:none;width:100%;height:100%;-webkit-appearance:none;appearance:none;background:transparent;z-index:2;pointer-events:none}:host .slide-button::-webkit-slider-thumb{-webkit-transition:all 80ms linear 0ms;transition:all 80ms linear 0ms;-webkit-appearance:none;appearance:none;border-radius:50%;background-color:var(--kirby-white);background-image:url(/assets/kirby/icons/svg/arrow-more.svg);background-repeat:no-repeat;background-position:center;background-size:24px;width:52px;height:52px;border:none;pointer-events:all}@media (hover: hover){:host .slide-button::-webkit-slider-thumb:hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer;background-color:#ebebeb}}:host .slide-button::-webkit-slider-thumb:active,:host .slide-button::-webkit-slider-thumb .interaction-state-active{--state-layer-opacity: .12;--state-layer-background-color: var(--kirby-black);background-color:#e0e0e0}:host .slide-button::-moz-range-thumb{-moz-transition:all 80ms linear 0ms;transition:all 80ms linear 0ms;appearance:none;border-radius:50%;background-color:var(--kirby-white);background-image:url(/assets/kirby/icons/svg/arrow-more.svg);background-repeat:no-repeat;background-position:center;background-size:24px;width:52px;height:52px;border:none;pointer-events:all}@media (hover: hover){:host .slide-button::-moz-range-thumb:hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer;background-color:#ebebeb}}:host .slide-button::-moz-range-thumb:active,:host .slide-button::-moz-range-thumb .interaction-state-active{--state-layer-opacity: .12;--state-layer-background-color: var(--kirby-black);background-color:#e0e0e0}:host .slide-done{transition:all .3s ease-in-out;opacity:0;height:0;transform:scale(0);pointer-events:none}\n"], directives: [{ type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
61
61
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: SlideButtonComponent, decorators: [{
62
62
  type: Component,
63
- args: [{ selector: 'kirby-slide-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"slide-button-container\" [ngClass]=\"{ 'slide-done': isSlideDone }\">\n <input\n type=\"range\"\n (mouseup)=\"onSliderMouseup()\"\n (touchend)=\"onSliderMouseup()\"\n (input)=\"onSliderValueChange($event.target.value)\"\n (mousedown)=\"onSliderMousedown()\"\n (touchstart)=\"onSliderMousedown()\"\n class=\"slide-button\"\n [value]=\"value\"\n max=\"100\"\n />\n <p class=\"slide-button-text slide-{{ pctInTens }}-pct\">{{ text }}</p>\n</div>\n", styles: [":host{position:relative;display:inline-block;width:256px;-webkit-user-select:none;user-select:none}:host[expand=block]{display:block;width:100%}:host .slide-button-container{width:100%;display:flex;justify-content:center;align-items:center;color:var(--kirby-primary-contrast);background-color:var(--kirby-primary);height:56px;border-radius:26px}:host .slide-10-pct{opacity:.9}:host .slide-20-pct{opacity:.8}:host .slide-30-pct{opacity:.7}:host .slide-40-pct{opacity:.6}:host .slide-50-pct{opacity:.5}:host .slide-60-pct{opacity:.4}:host .slide-70-pct{opacity:.3}:host .slide-80-pct{opacity:.2}:host .slide-90-pct{opacity:.1}:host .slide-100-pct{opacity:0}:host .slide-button-text{position:absolute;font-size:16px;margin:0;line-height:1;z-index:1;width:100%;text-align:center;padding:0 26px 0 56px}:host .slide-button{outline:none;width:100%;height:100%;-webkit-appearance:none;appearance:none;background:transparent;z-index:2}:host .slide-button::-webkit-slider-thumb{-webkit-transition:all 80ms linear 0ms;transition:all 80ms linear 0ms;-webkit-appearance:none;appearance:none;border-radius:50%;background-color:var(--kirby-white);background-image:url(/assets/kirby/icons/svg/arrow-more.svg);background-repeat:no-repeat;background-position:center;background-size:24px;width:52px;height:52px;border:none}@media (hover: hover){:host .slide-button::-webkit-slider-thumb:hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer;background-color:#ebebeb}}:host .slide-button::-webkit-slider-thumb:active,:host .slide-button::-webkit-slider-thumb .interaction-state-active{--state-layer-opacity: .12;--state-layer-background-color: var(--kirby-black);background-color:#e0e0e0}:host .slide-button::-moz-range-thumb{-moz-transition:all 80ms linear 0ms;transition:all 80ms linear 0ms;appearance:none;border-radius:50%;background-color:var(--kirby-white);background-image:url(/assets/kirby/icons/svg/arrow-more.svg);background-repeat:no-repeat;background-position:center;background-size:24px;width:52px;height:52px;border:none}@media (hover: hover){:host .slide-button::-moz-range-thumb:hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer;background-color:#ebebeb}}:host .slide-button::-moz-range-thumb:active,:host .slide-button::-moz-range-thumb .interaction-state-active{--state-layer-opacity: .12;--state-layer-background-color: var(--kirby-black);background-color:#e0e0e0}:host .slide-done{transition:all .3s ease-in-out;opacity:0;height:0;transform:scale(0);pointer-events:none}\n"] }]
63
+ args: [{ selector: 'kirby-slide-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"slide-button-container\" [ngClass]=\"{ 'slide-done': isSlideDone }\">\n <input\n type=\"range\"\n (mouseup)=\"onSliderMouseup()\"\n (touchend)=\"onSliderMouseup()\"\n (input)=\"onSliderValueChange($event.target.value)\"\n (mousedown)=\"onSliderMousedown()\"\n (touchstart)=\"onSliderMousedown()\"\n class=\"slide-button\"\n [value]=\"value\"\n max=\"100\"\n />\n <p class=\"slide-button-text slide-{{ pctInTens }}-pct\">{{ text }}</p>\n</div>\n", styles: [":host{position:relative;display:inline-block;width:256px;-webkit-user-select:none;user-select:none}:host[expand=block]{display:block;width:100%}:host .slide-button-container{width:100%;display:flex;justify-content:center;align-items:center;color:var(--kirby-primary-contrast);background-color:var(--kirby-primary);height:56px;border-radius:26px}:host .slide-10-pct{opacity:.9}:host .slide-20-pct{opacity:.8}:host .slide-30-pct{opacity:.7}:host .slide-40-pct{opacity:.6}:host .slide-50-pct{opacity:.5}:host .slide-60-pct{opacity:.4}:host .slide-70-pct{opacity:.3}:host .slide-80-pct{opacity:.2}:host .slide-90-pct{opacity:.1}:host .slide-100-pct{opacity:0}:host .slide-button-text{position:absolute;font-size:16px;margin:0;line-height:1;z-index:1;width:100%;text-align:center;padding:0 26px 0 56px;pointer-events:none}:host .slide-button{outline:none;width:100%;height:100%;-webkit-appearance:none;appearance:none;background:transparent;z-index:2;pointer-events:none}:host .slide-button::-webkit-slider-thumb{-webkit-transition:all 80ms linear 0ms;transition:all 80ms linear 0ms;-webkit-appearance:none;appearance:none;border-radius:50%;background-color:var(--kirby-white);background-image:url(/assets/kirby/icons/svg/arrow-more.svg);background-repeat:no-repeat;background-position:center;background-size:24px;width:52px;height:52px;border:none;pointer-events:all}@media (hover: hover){:host .slide-button::-webkit-slider-thumb:hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer;background-color:#ebebeb}}:host .slide-button::-webkit-slider-thumb:active,:host .slide-button::-webkit-slider-thumb .interaction-state-active{--state-layer-opacity: .12;--state-layer-background-color: var(--kirby-black);background-color:#e0e0e0}:host .slide-button::-moz-range-thumb{-moz-transition:all 80ms linear 0ms;transition:all 80ms linear 0ms;appearance:none;border-radius:50%;background-color:var(--kirby-white);background-image:url(/assets/kirby/icons/svg/arrow-more.svg);background-repeat:no-repeat;background-position:center;background-size:24px;width:52px;height:52px;border:none;pointer-events:all}@media (hover: hover){:host .slide-button::-moz-range-thumb:hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer;background-color:#ebebeb}}:host .slide-button::-moz-range-thumb:active,:host .slide-button::-moz-range-thumb .interaction-state-active{--state-layer-opacity: .12;--state-layer-background-color: var(--kirby-black);background-color:#e0e0e0}:host .slide-done{transition:all .3s ease-in-out;opacity:0;height:0;transform:scale(0);pointer-events:none}\n"] }]
64
64
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { text: [{
65
65
  type: Input
66
66
  }], expand: [{
@@ -12,6 +12,9 @@ export class TabsComponent {
12
12
  ngAfterViewInit() {
13
13
  this.tabsService.setOutlet(this.tabs.outlet);
14
14
  }
15
+ ngOnDestroy() {
16
+ this.tabsService.resetOutlet();
17
+ }
15
18
  }
16
19
  /** @nocollapse */ TabsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: TabsComponent, deps: [{ token: i1.TabsService }], target: i0.ɵɵFactoryTarget.Component });
17
20
  /** @nocollapse */ TabsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.9", type: TabsComponent, selector: "kirby-tab-bar", host: { properties: { "class.tab-bar-bottom-hidden": "this.tabBarBottomHidden" } }, viewQueries: [{ propertyName: "tabs", first: true, predicate: IonTabs, descendants: true, static: true }], ngImport: i0, template: "<ion-tabs>\n <ion-tab-bar [class.bottom-hidden]=\"tabBarBottomHidden\">\n <ng-content></ng-content>\n </ion-tab-bar>\n</ion-tabs>\n", styles: [":host(:not(.tab-bar-bottom-hidden)){--kirby-page-footer-safe-area-bottom: 0px}ion-tabs ion-tab-bar{--background: rgba(var(--kirby-white-rgb), .94);--border: 1px solid var(--kirby-light);--color: var(--kirby-black);display:flex;max-width:var(--kirby-tab-bar-max-width, none);justify-content:center;height:var(--kirby-tab-bar-height);padding-left:calc((100vw - var(--kirby-tab-bar-max-width, none)) / 2);padding-right:calc((100vw - var(--kirby-tab-bar-max-width, none)) / 2);width:100%}ion-tabs ion-tab-bar.bottom-hidden{display:none}@media (min-width: 721px){ion-tabs{--kirby-tab-bar-height: 70px}}@media (min-width: 1025px) and (hover: hover) and (pointer: fine){ion-tabs{flex-direction:column-reverse;--kirby-page-footer-safe-area-bottom: initial}ion-tabs ion-tab-bar{margin:0 auto;justify-content:flex-end}ion-tabs ion-tab-bar.bottom-hidden{display:flex}}\n"], components: [{ type: i2.IonTabs, selector: "ion-tabs", outputs: ["ionTabsWillChange", "ionTabsDidChange"] }, { type: i2.IonTabBar, selector: "ion-tab-bar", inputs: ["color", "mode", "selectedTab", "translucent"] }] });
@@ -25,4 +28,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.9", ngImpor
25
28
  type: ViewChild,
26
29
  args: [IonTabs, { static: true }]
27
30
  }] } });
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Rlc2lnbnN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvdGFicy90YWJzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvZGVzaWduc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy90YWJzL3RhYnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBTzdDLE1BQU0sT0FBTyxhQUFhO0lBS3hCLFlBQW9CLFdBQXdCO1FBQXhCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBSDVDLHVCQUFrQixHQUFHLEtBQUssQ0FBQztJQUdvQixDQUFDO0lBRWhELGVBQWU7UUFDYixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9DLENBQUM7OzZIQVRVLGFBQWE7aUhBQWIsYUFBYSwrS0FHYixPQUFPLDhEQ2JwQiwwSUFLQTsyRkRLYSxhQUFhO2tCQUx6QixTQUFTOytCQUNFLGVBQWU7a0dBTXpCLGtCQUFrQjtzQkFEakIsV0FBVzt1QkFBQyw2QkFBNkI7Z0JBRUosSUFBSTtzQkFBekMsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBIb3N0QmluZGluZywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJb25UYWJzIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuXG5pbXBvcnQgeyBUYWJzU2VydmljZSB9IGZyb20gJy4vdGFicy5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAna2lyYnktdGFiLWJhcicsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFicy5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBUYWJzQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBIb3N0QmluZGluZygnY2xhc3MudGFiLWJhci1ib3R0b20taGlkZGVuJylcbiAgdGFiQmFyQm90dG9tSGlkZGVuID0gZmFsc2U7XG4gIEBWaWV3Q2hpbGQoSW9uVGFicywgeyBzdGF0aWM6IHRydWUgfSkgdGFiczogSW9uVGFicztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRhYnNTZXJ2aWNlOiBUYWJzU2VydmljZSkge31cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy50YWJzU2VydmljZS5zZXRPdXRsZXQodGhpcy50YWJzLm91dGxldCk7XG4gIH1cbn1cbiIsIjxpb24tdGFicz5cbiAgPGlvbi10YWItYmFyIFtjbGFzcy5ib3R0b20taGlkZGVuXT1cInRhYkJhckJvdHRvbUhpZGRlblwiPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgPC9pb24tdGFiLWJhcj5cbjwvaW9uLXRhYnM+XG4iXX0=
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Rlc2lnbnN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvdGFicy90YWJzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvZGVzaWduc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy90YWJzL3RhYnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsV0FBVyxFQUFhLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBTzdDLE1BQU0sT0FBTyxhQUFhO0lBS3hCLFlBQW9CLFdBQXdCO1FBQXhCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBSDVDLHVCQUFrQixHQUFHLEtBQUssQ0FBQztJQUdvQixDQUFDO0lBRWhELGVBQWU7UUFDYixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNqQyxDQUFDOzs2SEFiVSxhQUFhO2lIQUFiLGFBQWEsK0tBR2IsT0FBTyw4RENicEIsMElBS0E7MkZES2EsYUFBYTtrQkFMekIsU0FBUzsrQkFDRSxlQUFlO2tHQU16QixrQkFBa0I7c0JBRGpCLFdBQVc7dUJBQUMsNkJBQTZCO2dCQUVKLElBQUk7c0JBQXpDLFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgSG9zdEJpbmRpbmcsIE9uRGVzdHJveSwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJb25UYWJzIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuXG5pbXBvcnQgeyBUYWJzU2VydmljZSB9IGZyb20gJy4vdGFicy5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAna2lyYnktdGFiLWJhcicsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFicy5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBUYWJzQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy50YWItYmFyLWJvdHRvbS1oaWRkZW4nKVxuICB0YWJCYXJCb3R0b21IaWRkZW4gPSBmYWxzZTtcbiAgQFZpZXdDaGlsZChJb25UYWJzLCB7IHN0YXRpYzogdHJ1ZSB9KSB0YWJzOiBJb25UYWJzO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdGFic1NlcnZpY2U6IFRhYnNTZXJ2aWNlKSB7fVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnRhYnNTZXJ2aWNlLnNldE91dGxldCh0aGlzLnRhYnMub3V0bGV0KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMudGFic1NlcnZpY2UucmVzZXRPdXRsZXQoKTtcbiAgfVxufVxuIiwiPGlvbi10YWJzPlxuICA8aW9uLXRhYi1iYXIgW2NsYXNzLmJvdHRvbS1oaWRkZW5dPVwidGFiQmFyQm90dG9tSGlkZGVuXCI+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICA8L2lvbi10YWItYmFyPlxuPC9pb24tdGFicz5cbiJdfQ==
@@ -4,12 +4,15 @@ import { ReplaySubject } from 'rxjs';
4
4
  import * as i0 from "@angular/core";
5
5
  export class TabsService {
6
6
  constructor() {
7
- this.outletSubject$ = new ReplaySubject();
7
+ this.outletSubject$ = new ReplaySubject(1);
8
8
  this.outlet$ = this.outletSubject$.asObservable();
9
9
  }
10
10
  setOutlet(outlet) {
11
11
  this.outletSubject$.next(outlet);
12
12
  }
13
+ resetOutlet() {
14
+ this.outletSubject$.next(null);
15
+ }
13
16
  }
14
17
  /** @nocollapse */ TabsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: TabsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
15
18
  /** @nocollapse */ TabsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: TabsService, providedIn: 'root' });
@@ -20,4 +23,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.9", ngImpor
20
23
  }]
21
24
  }] });
22
25
  export { IonRouterOutlet };
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9kZXNpZ25zeXN0ZW0vc3JjL2xpYi9jb21wb25lbnRzL3RhYnMvdGFicy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBS3JDLE1BQU0sT0FBTyxXQUFXO0lBSHhCO1FBSVUsbUJBQWMsR0FBbUMsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUN0RSxZQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztLQUtyRDtJQUhRLFNBQVMsQ0FBQyxNQUF1QjtRQUN0QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDOzsySEFOVSxXQUFXOytIQUFYLFdBQVcsY0FGVixNQUFNOzJGQUVQLFdBQVc7a0JBSHZCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COztBQVVELE9BQU8sRUFBRSxlQUFlLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElvblJvdXRlck91dGxldCB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IFJlcGxheVN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFRhYnNTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBvdXRsZXRTdWJqZWN0JDogUmVwbGF5U3ViamVjdDxJb25Sb3V0ZXJPdXRsZXQ+ID0gbmV3IFJlcGxheVN1YmplY3QoKTtcbiAgcHVibGljIG91dGxldCQgPSB0aGlzLm91dGxldFN1YmplY3QkLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHB1YmxpYyBzZXRPdXRsZXQob3V0bGV0OiBJb25Sb3V0ZXJPdXRsZXQpIHtcbiAgICB0aGlzLm91dGxldFN1YmplY3QkLm5leHQob3V0bGV0KTtcbiAgfVxufVxuXG5leHBvcnQgeyBJb25Sb3V0ZXJPdXRsZXQgfTtcbiJdfQ==
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9kZXNpZ25zeXN0ZW0vc3JjL2xpYi9jb21wb25lbnRzL3RhYnMvdGFicy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBS3JDLE1BQU0sT0FBTyxXQUFXO0lBSHhCO1FBSVUsbUJBQWMsR0FBbUMsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkUsWUFBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7S0FTckQ7SUFQUSxTQUFTLENBQUMsTUFBdUI7UUFDdEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakMsQ0FBQzs7MkhBVlUsV0FBVzsrSEFBWCxXQUFXLGNBRlYsTUFBTTsyRkFFUCxXQUFXO2tCQUh2QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7QUFjRCxPQUFPLEVBQUUsZUFBZSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJb25Sb3V0ZXJPdXRsZXQgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBUYWJzU2VydmljZSB7XG4gIHByaXZhdGUgb3V0bGV0U3ViamVjdCQ6IFJlcGxheVN1YmplY3Q8SW9uUm91dGVyT3V0bGV0PiA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpO1xuICBwdWJsaWMgb3V0bGV0JCA9IHRoaXMub3V0bGV0U3ViamVjdCQuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHVibGljIHNldE91dGxldChvdXRsZXQ6IElvblJvdXRlck91dGxldCkge1xuICAgIHRoaXMub3V0bGV0U3ViamVjdCQubmV4dChvdXRsZXQpO1xuICB9XG5cbiAgcHVibGljIHJlc2V0T3V0bGV0KCkge1xuICAgIHRoaXMub3V0bGV0U3ViamVjdCQubmV4dChudWxsKTtcbiAgfVxufVxuXG5leHBvcnQgeyBJb25Sb3V0ZXJPdXRsZXQgfTtcbiJdfQ==
@@ -4,6 +4,8 @@ export * from './directives';
4
4
  export * from './helpers';
5
5
  export * from './scss/scss-helper';
6
6
  // export * from './testing';
7
+ export * from './components/charts/chart-config';
7
8
  export { KirbyModule } from './kirby.module';
8
9
  export { KirbyExperimentalModule } from './kirby-experimental.module';
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2Rlc2lnbnN5c3RlbS9zcmMvbGliL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyw2QkFBNkI7QUFFN0IsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9hbmltYXRpb24va2lyYnktYW5pbWF0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50cyc7XG5leHBvcnQgKiBmcm9tICcuL2RpcmVjdGl2ZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9oZWxwZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vc2Nzcy9zY3NzLWhlbHBlcic7XG4vLyBleHBvcnQgKiBmcm9tICcuL3Rlc3RpbmcnO1xuXG5leHBvcnQgeyBLaXJieU1vZHVsZSB9IGZyb20gJy4va2lyYnkubW9kdWxlJztcbmV4cG9ydCB7IEtpcmJ5RXhwZXJpbWVudGFsTW9kdWxlIH0gZnJvbSAnLi9raXJieS1leHBlcmltZW50YWwubW9kdWxlJztcbiJdfQ==
10
+ export { StockChartConfig, BarChartConfig } from './components/charts/chart-config';
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2Rlc2lnbnN5c3RlbS9zcmMvbGliL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyw2QkFBNkI7QUFFN0IsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxNQUFNLGtDQUFrQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9hbmltYXRpb24va2lyYnktYW5pbWF0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50cyc7XG5leHBvcnQgKiBmcm9tICcuL2RpcmVjdGl2ZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9oZWxwZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vc2Nzcy9zY3NzLWhlbHBlcic7XG4vLyBleHBvcnQgKiBmcm9tICcuL3Rlc3RpbmcnO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudHMvY2hhcnRzL2NoYXJ0LWNvbmZpZyc7XG5leHBvcnQgeyBLaXJieU1vZHVsZSB9IGZyb20gJy4va2lyYnkubW9kdWxlJztcbmV4cG9ydCB7IEtpcmJ5RXhwZXJpbWVudGFsTW9kdWxlIH0gZnJvbSAnLi9raXJieS1leHBlcmltZW50YWwubW9kdWxlJztcbmV4cG9ydCB7IFN0b2NrQ2hhcnRDb25maWcsIEJhckNoYXJ0Q29uZmlnIH0gZnJvbSAnLi9jb21wb25lbnRzL2NoYXJ0cy9jaGFydC1jb25maWcnO1xuIl19